ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kcml2ZXItcWxhMnh4eCBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kcml2ZXItcWxhMnh4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTU5ZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRyaXZlci1xbGEyeHh4CkBAIC0wLDAgKzEsOCBAQAorV2hhdDoJCS9zeXMvYnVzL3BjaS9kcml2ZXJzL3FsYTJ4eHgvLi4uL2RldmljZXMvKgorRGF0ZToJCVNlcHRlbWJlciAyMDA5CitDb250YWN0OglRTG9naWMgTGludXggRHJpdmVyIDxsaW51eC1kcml2ZXJAcWxvZ2ljLmNvbT4KK0Rlc2NyaXB0aW9uOglxbGEyeHh4LXVkZXYuc2ggY3VycmVudGx5IGxvb2tzIGZvciB1ZXZlbnQgQ0hBTkdFIGV2ZW50cyB0bworCQlzaWduYWwgYSBmaXJtd2FyZS1kdW1wIGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGUgZHJpdmVyIGFuZCBpcworCQlyZWFkeSBmb3IgcmV0cmlldmFsLgorVXNlcnM6CQlxbGEyeHh4LXVkZXYuc2guICBQcm9wb3NlZCBjaGFuZ2VzIHNob3VsZCBiZSBtYWlsZWQgdG8KKwkJbGludXgtZHJpdmVyQHFsb2dpYy5jb20KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHJvY2ZzLWRpc2tzdGF0cyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHJvY2ZzLWRpc2tzdGF0cwppbmRleCA5OTIzMzkwLi5mOTFhOTczIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3Byb2Nmcy1kaXNrc3RhdHMKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9wcm9jZnMtZGlza3N0YXRzCkBAIC04LDcgKzgsNyBAQAogCQkgMSAtIG1ham9yIG51bWJlcgogCQkgMiAtIG1pbm9yIG11bWJlcgogCQkgMyAtIGRldmljZSBuYW1lCi0JCSA0IC0gcmVhZHMgY29tcGxldGVkIHN1Y2Nlc2Z1bGx5CisJCSA0IC0gcmVhZHMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQogCQkgNSAtIHJlYWRzIG1lcmdlZAogCQkgNiAtIHNlY3RvcnMgcmVhZAogCQkgNyAtIHRpbWUgc3BlbnQgcmVhZGluZyAobXMpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jawppbmRleCA1ZjNiZWRhLi5kMmY5MDMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2sKQEAgLTQsNyArNCw3IEBACiBEZXNjcmlwdGlvbjoKIAkJVGhlIC9zeXMvYmxvY2svPGRpc2s+L3N0YXQgZmlsZXMgZGlzcGxheXMgdGhlIEkvTwogCQlzdGF0aXN0aWNzIG9mIGRpc2sgPGRpc2s+LiBUaGV5IGNvbnRhaW4gMTEgZmllbGRzOgotCQkgMSAtIHJlYWRzIGNvbXBsZXRlZCBzdWNjZXNmdWxseQorCQkgMSAtIHJlYWRzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKIAkJIDIgLSByZWFkcyBtZXJnZWQKIAkJIDMgLSBzZWN0b3JzIHJlYWQKIAkJIDQgLSB0aW1lIHNwZW50IHJlYWRpbmcgKG1zKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtbWFwcGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAppbmRleCAwMWYyNGU5Li5lY2FkODhkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dApAQCAtMjE0LDcgKzIxNCw3IEBACiBIZXJlIGlzIHBzZXVkby1jb2RlIHNob3dpbmcgaG93IHRoaXMgbWlnaHQgYmUgZG9uZToKIAogCSNkZWZpbmUgUExBWUJBQ0tfQUREUkVTU19CSVRTCURNQV9CSVRfTUFTSygzMikKLQkjZGVmaW5lIFJFQ09SRF9BRERSRVNTX0JJVFMJMHgwMGZmZmZmZgorCSNkZWZpbmUgUkVDT1JEX0FERFJFU1NfQklUUwlETUFfQklUX01BU0soMjQpCiAKIAlzdHJ1Y3QgbXlfc291bmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKQEAgLTIyNCwxNCArMjI0LDE0IEBACiAJCWNhcmQtPnBsYXliYWNrX2VuYWJsZWQgPSAxOwogCX0gZWxzZSB7CiAJCWNhcmQtPnBsYXliYWNrX2VuYWJsZWQgPSAwOwotCQlwcmludGsoS0VSTl9XQVJOICIlczogUGxheWJhY2sgZGlzYWJsZWQgZHVlIHRvIERNQSBsaW1pdGF0aW9ucy5cbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQbGF5YmFjayBkaXNhYmxlZCBkdWUgdG8gRE1BIGxpbWl0YXRpb25zLlxuIiwKIAkJICAgICAgIGNhcmQtPm5hbWUpOwogCX0KIAlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgUkVDT1JEX0FERFJFU1NfQklUUykpIHsKIAkJY2FyZC0+cmVjb3JkX2VuYWJsZWQgPSAxOwogCX0gZWxzZSB7CiAJCWNhcmQtPnJlY29yZF9lbmFibGVkID0gMDsKLQkJcHJpbnRrKEtFUk5fV0FSTiAiJXM6IFJlY29yZCBkaXNhYmxlZCBkdWUgdG8gRE1BIGxpbWl0YXRpb25zLlxuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY29yZCBkaXNhYmxlZCBkdWUgdG8gRE1BIGxpbWl0YXRpb25zLlxuIiwKIAkJICAgICAgIGNhcmQtPm5hbWUpOwogCX0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RldmljZS1kcml2ZXJzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbAppbmRleCA5NGEyMGZlLi5mOWE2ZTJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbApAQCAtMjkzLDEwICsyOTMsMjMgQEAKIAogICA8Y2hhcHRlciBpZD0iaW5wdXRfc3Vic3lzdGVtIj4KICAgICAgPHRpdGxlPklucHV0IFN1YnN5c3RlbTwvdGl0bGU+CisgICAgIDxzZWN0MT48dGl0bGU+SW5wdXQgY29yZTwvdGl0bGU+CiAhSWluY2x1ZGUvbGludXgvaW5wdXQuaAogIUVkcml2ZXJzL2lucHV0L2lucHV0LmMKICFFZHJpdmVycy9pbnB1dC9mZi1jb3JlLmMKICFFZHJpdmVycy9pbnB1dC9mZi1tZW1sZXNzLmMKKyAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5Qb2xsZWQgaW5wdXQgZGV2aWNlczwvdGl0bGU+CishSWluY2x1ZGUvbGludXgvaW5wdXQtcG9sbGRldi5oCishRWRyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCisgICAgIDwvc2VjdDE+CisgICAgIDxzZWN0MT48dGl0bGU+TWF0cml4IGtleWJvYXJzL2tleXBhZHM8L3RpdGxlPgorIUlpbmNsdWRlL2xpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaAorICAgICA8L3NlY3QxPgorICAgICA8c2VjdDE+PHRpdGxlPlNwYXJzZSBrZXltYXAgc3VwcG9ydDwvdGl0bGU+CishSWluY2x1ZGUvbGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oCishRWRyaXZlcnMvaW5wdXQvc3BhcnNlLWtleW1hcC5jCisgICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KIAogICA8Y2hhcHRlciBpZD0ic3BpIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZiYXBpLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZiYXBpLnhtbAppbmRleCA0ZmM1YjIzLi42M2M1MjhmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YmFwaS54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJhcGkueG1sCkBAIC0zMCw2ICszMCwxNCBAQAogPHJldmhpc3Rvcnk+CiA8IS0tIFB1dCBkb2N1bWVudCByZXZpc2lvbnMgaGVyZSwgbmV3ZXN0IGZpcnN0LiAtLT4KIDxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjIuMC4yPC9yZXZudW1iZXI+CisJPGRhdGU+MjAwOS0xMC0yNTwvZGF0ZT4KKwk8YXV0aG9yaW5pdGlhbHM+bWNjPC9hdXRob3Jpbml0aWFscz4KKwk8cmV2cmVtYXJrPgorCQlkb2N1bWVudHMgRkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERSBhbmQgRkVfRElTSEVUV09SS19TRU5EX0xFR0FDWV9DTUQgaW9jdGxzLgorCTwvcmV2cmVtYXJrPgorPC9yZXZpc2lvbj4KKzxyZXZpc2lvbj4KIDxyZXZudW1iZXI+Mi4wLjE8L3Jldm51bWJlcj4KIDxkYXRlPjIwMDktMDktMTY8L2RhdGU+CiA8YXV0aG9yaW5pdGlhbHM+bWNjPC9hdXRob3Jpbml0aWFscz4KQEAgLTg1LDMgKzkzLDggQEAKICAgICAmc3ViLWV4YW1wbGVzOwogICA8L2NoYXB0ZXI+CiA8IS0tIEVORCBPRiBDSEFQVEVSUyAtLT4KKyAgPGFwcGVuZGl4IGlkPSJmcm9udGVuZF9oIj4KKyAgICA8dGl0bGU+RFZCIEZyb250ZW5kIEhlYWRlciBGaWxlPC90aXRsZT4KKyAgICAmc3ViLWZyb250ZW5kLWg7CisgIDwvYXBwZW5kaXg+CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvaXNkYnQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJwcm9wZXJ0eS54bWwKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9pc2RidC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZicHJvcGVydHkueG1sCmluZGV4IDkyODU1MjIuLjVmNTdjN2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvaXNkYnQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZicHJvcGVydHkueG1sCkBAIC0xLDMgKzEsNiBAQAorPHNlY3Rpb24gaWQ9IkZFX0dFVF9QUk9QRVJUWSI+Cis8dGl0bGU+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvdGl0bGU+CisKIDxzZWN0aW9uIGlkPSJpc2RidCI+CiAJPHRpdGxlPklTREItVCBmcm9udGVuZDwvdGl0bGU+CiAJPHBhcmE+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzaG9ydGx5IHdoYXQgYXJlIHRoZSBwb3NzaWJsZSBwYXJhbWV0ZXJzIGluIHRoZSBMaW51eApAQCAtMzEyLDMgKzMxNSw0IEBACiAJCTwvc2VjdGlvbj4KIAk8L3NlY3Rpb24+CiA8L3NlY3Rpb24+Cis8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLmgueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC5oLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTk2NDRmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC5oLnhtbApAQCAtMCwwICsxLDQxNSBAQAorPHByb2dyYW1saXN0aW5nPgorLyoKKyAqIGZyb250ZW5kLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyY3VzIE1ldHpsZXIgJmx0O21hcmN1c0Bjb252ZXJnZW5jZS5kZSZndDsKKyAqICAgICAgICAgICAgICAgICAgUmFscGggIE1ldHpsZXIgJmx0O3JhbHBoQGNvbnZlcmdlbmNlLmRlJmd0OworICogICAgICAgICAgICAgICAgICBIb2xnZXIgV2FlY2h0bGVyICZsdDtob2xnZXJAY29udmVyZ2VuY2UuZGUmZ3Q7CisgKiAgICAgICAgICAgICAgICAgIEFuZHJlIERyYXN6aWsgJmx0O2FkQGNvbnZlcmdlbmNlLmRlJmd0OworICogICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJGUk9OVEVORF9IXworI2RlZmluZSBfRFZCRlJPTlRFTkRfSF8KKworI2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CisKK3R5cGVkZWYgZW51bSBmZV90eXBlIHsKKyAgICAgICAgRkVfUVBTSywKKyAgICAgICAgRkVfUUFNLAorICAgICAgICBGRV9PRkRNLAorICAgICAgICBGRV9BVFNDCit9IGZlX3R5cGVfdDsKKworCit0eXBlZGVmIGVudW0gZmVfY2FwcyB7CisgICAgICAgIEZFX0lTX1NUVVBJRCAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgICAgICBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gICAgICAgICAgID0gMHgxLAorICAgICAgICBGRV9DQU5fRkVDXzFfMiAgICAgICAgICAgICAgICAgID0gMHgyLAorICAgICAgICBGRV9DQU5fRkVDXzJfMyAgICAgICAgICAgICAgICAgID0gMHg0LAorICAgICAgICBGRV9DQU5fRkVDXzNfNCAgICAgICAgICAgICAgICAgID0gMHg4LAorICAgICAgICBGRV9DQU5fRkVDXzRfNSAgICAgICAgICAgICAgICAgID0gMHgxMCwKKyAgICAgICAgRkVfQ0FOX0ZFQ181XzYgICAgICAgICAgICAgICAgICA9IDB4MjAsCisgICAgICAgIEZFX0NBTl9GRUNfNl83ICAgICAgICAgICAgICAgICAgPSAweDQwLAorICAgICAgICBGRV9DQU5fRkVDXzdfOCAgICAgICAgICAgICAgICAgID0gMHg4MCwKKyAgICAgICAgRkVfQ0FOX0ZFQ184XzkgICAgICAgICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBGRV9DQU5fRkVDX0FVVE8gICAgICAgICAgICAgICAgID0gMHgyMDAsCisgICAgICAgIEZFX0NBTl9RUFNLICAgICAgICAgICAgICAgICAgICAgPSAweDQwMCwKKyAgICAgICAgRkVfQ0FOX1FBTV8xNiAgICAgICAgICAgICAgICAgICA9IDB4ODAwLAorICAgICAgICBGRV9DQU5fUUFNXzMyICAgICAgICAgICAgICAgICAgID0gMHgxMDAwLAorICAgICAgICBGRV9DQU5fUUFNXzY0ICAgICAgICAgICAgICAgICAgID0gMHgyMDAwLAorICAgICAgICBGRV9DQU5fUUFNXzEyOCAgICAgICAgICAgICAgICAgID0gMHg0MDAwLAorICAgICAgICBGRV9DQU5fUUFNXzI1NiAgICAgICAgICAgICAgICAgID0gMHg4MDAwLAorICAgICAgICBGRV9DQU5fUUFNX0FVVE8gICAgICAgICAgICAgICAgID0gMHgxMDAwMCwKKyAgICAgICAgRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gICA9IDB4MjAwMDAsCisgICAgICAgIEZFX0NBTl9CQU5EV0lEVEhfQVVUTyAgICAgICAgICAgPSAweDQwMDAwLAorICAgICAgICBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyAgICAgID0gMHg4MDAwMCwKKyAgICAgICAgRkVfQ0FOX0hJRVJBUkNIWV9BVVRPICAgICAgICAgICA9IDB4MTAwMDAwLAorICAgICAgICBGRV9DQU5fOFZTQiAgICAgICAgICAgICAgICAgICAgID0gMHgyMDAwMDAsCisgICAgICAgIEZFX0NBTl8xNlZTQiAgICAgICAgICAgICAgICAgICAgPSAweDQwMDAwMCwKKyAgICAgICAgRkVfSEFTX0VYVEVOREVEX0NBUFMgICAgICAgICAgICA9IDB4ODAwMDAwLCAgIC8qIFdlIG5lZWQgbW9yZSBiaXRzcGFjZSBmb3IgbmV3ZXIgQVBJcywgaW5kaWNhdGUgdGhpcy4gKi8KKyAgICAgICAgRkVfQ0FOXzJHX01PRFVMQVRJT04gICAgICAgICAgICA9IDB4MTAwMDAwMDAsIC8qIGZyb250ZW5kIHN1cHBvcnRzICIybmQgZ2VuZXJhdGlvbiBtb2R1bGF0aW9uIiAoRFZCLVMyKSAqLworICAgICAgICBGRV9ORUVEU19CRU5ESU5HICAgICAgICAgICAgICAgID0gMHgyMDAwMDAwMCwgLyogbm90IHN1cHBvcnRlZCBhbnltb3JlLCBkb24ndCB1c2UgKGZyb250ZW5kIHJlcXVpcmVzIGZyZXF1ZW5jeSBiZW5kaW5nKSAqLworICAgICAgICBGRV9DQU5fUkVDT1ZFUiAgICAgICAgICAgICAgICAgID0gMHg0MDAwMDAwMCwgLyogZnJvbnRlbmQgY2FuIHJlY292ZXIgZnJvbSBhIGNhYmxlIHVucGx1ZyBhdXRvbWF0aWNhbGx5ICovCisgICAgICAgIEZFX0NBTl9NVVRFX1RTICAgICAgICAgICAgICAgICAgPSAweDgwMDAwMDAwICAvKiBmcm9udGVuZCBjYW4gc3RvcCBzcHVyaW91cyBUUyBkYXRhIG91dHB1dCAqLworfSBmZV9jYXBzX3Q7CisKKworc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIHsKKyAgICAgICAgY2hhciAgICAgICBuYW1lWzEyOF07CisgICAgICAgIGZlX3R5cGVfdCAgdHlwZTsKKyAgICAgICAgX191MzIgICAgICBmcmVxdWVuY3lfbWluOworICAgICAgICBfX3UzMiAgICAgIGZyZXF1ZW5jeV9tYXg7CisgICAgICAgIF9fdTMyICAgICAgZnJlcXVlbmN5X3N0ZXBzaXplOworICAgICAgICBfX3UzMiAgICAgIGZyZXF1ZW5jeV90b2xlcmFuY2U7CisgICAgICAgIF9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWluOworICAgICAgICBfX3UzMiAgICAgIHN5bWJvbF9yYXRlX21heDsKKyAgICAgICAgX191MzIgICAgICBzeW1ib2xfcmF0ZV90b2xlcmFuY2U7ICAgICAgIC8qIHBwbSAqLworICAgICAgICBfX3UzMiAgICAgIG5vdGlmaWVyX2RlbGF5OyAgICAgICAgICAgICAgLyogREVQUkVDQVRFRCAqLworICAgICAgICBmZV9jYXBzX3QgIGNhcHM7Cit9OworCisKKy8qKgorICogIENoZWNrIG91dCB0aGUgRGlTRXFDIGJ1cyBzcGVjIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3LmV1dGVsc2F0Lm9yZy8gZm9yCisgKiAgdGhlIG1lYW5pbmcgb2YgdGhpcyBzdHJ1Y3QuLi4KKyAqLworc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCB7CisgICAgICAgIF9fdTggbXNnIFs2XTsgICAvKiAgeyBmcmFtaW5nLCBhZGRyZXNzLCBjb21tYW5kLCBkYXRhIFszXSB9ICovCisgICAgICAgIF9fdTggbXNnX2xlbjsgICAvKiAgdmFsaWQgdmFsdWVzIGFyZSAzLi4uNiAgKi8KK307CisKKworc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkgeworICAgICAgICBfX3U4IG1zZyBbNF07ICAgLyogIHsgZnJhbWluZywgZGF0YSBbM10gfSAqLworICAgICAgICBfX3U4IG1zZ19sZW47ICAgLyogIHZhbGlkIHZhbHVlcyBhcmUgMC4uLjQsIDAgbWVhbnMgbm8gbXNnICAqLworICAgICAgICBpbnQgIHRpbWVvdXQ7ICAgLyogIHJldHVybiBmcm9tIGlvY3RsIGFmdGVyIHRpbWVvdXQgbXMgd2l0aCAqLworfTsgICAgICAgICAgICAgICAgICAgICAgLyogIGVycm9yY29kZSB3aGVuIG5vIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICAqLworCisKK3R5cGVkZWYgZW51bSBmZV9zZWNfdm9sdGFnZSB7CisgICAgICAgIFNFQ19WT0xUQUdFXzEzLAorICAgICAgICBTRUNfVk9MVEFHRV8xOCwKKyAgICAgICAgU0VDX1ZPTFRBR0VfT0ZGCit9IGZlX3NlY192b2x0YWdlX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX3NlY190b25lX21vZGUgeworICAgICAgICBTRUNfVE9ORV9PTiwKKyAgICAgICAgU0VDX1RPTkVfT0ZGCit9IGZlX3NlY190b25lX21vZGVfdDsKKworCit0eXBlZGVmIGVudW0gZmVfc2VjX21pbmlfY21kIHsKKyAgICAgICAgU0VDX01JTklfQSwKKyAgICAgICAgU0VDX01JTklfQgorfSBmZV9zZWNfbWluaV9jbWRfdDsKKworCit0eXBlZGVmIGVudW0gZmVfc3RhdHVzIHsKKyAgICAgICAgRkVfSEFTX1NJR05BTCAgID0gMHgwMSwgICAvKiBmb3VuZCBzb21ldGhpbmcgYWJvdmUgdGhlIG5vaXNlIGxldmVsICovCisgICAgICAgIEZFX0hBU19DQVJSSUVSICA9IDB4MDIsICAgLyogZm91bmQgYSBEVkIgc2lnbmFsICAqLworICAgICAgICBGRV9IQVNfVklURVJCSSAgPSAweDA0LCAgIC8qIEZFQyBpcyBzdGFibGUgICovCisgICAgICAgIEZFX0hBU19TWU5DICAgICA9IDB4MDgsICAgLyogZm91bmQgc3luYyBieXRlcyAgKi8KKyAgICAgICAgRkVfSEFTX0xPQ0sgICAgID0gMHgxMCwgICAvKiBldmVyeXRoaW5nJ3Mgd29ya2luZy4uLiAqLworICAgICAgICBGRV9USU1FRE9VVCAgICAgPSAweDIwLCAgIC8qIG5vIGxvY2sgd2l0aGluIHRoZSBsYXN0IH4yIHNlY29uZHMgKi8KKyAgICAgICAgRkVfUkVJTklUICAgICAgID0gMHg0MCAgICAvKiBmcm9udGVuZCB3YXMgcmVpbml0aWFsaXplZCwgICovCit9IGZlX3N0YXR1c190OyAgICAgICAgICAgICAgICAgICAgLyogYXBwbGljYXRpb24gaXMgcmVjb21tZW5kZWQgdG8gcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaVNFcUMsIHRvbmUgYW5kIHBhcmFtZXRlcnMgKi8KKwordHlwZWRlZiBlbnVtIGZlX3NwZWN0cmFsX2ludmVyc2lvbiB7CisgICAgICAgIElOVkVSU0lPTl9PRkYsCisgICAgICAgIElOVkVSU0lPTl9PTiwKKyAgICAgICAgSU5WRVJTSU9OX0FVVE8KK30gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisgICAgICAgIEZFQ19OT05FID0gMCwKKyAgICAgICAgRkVDXzFfMiwKKyAgICAgICAgRkVDXzJfMywKKyAgICAgICAgRkVDXzNfNCwKKyAgICAgICAgRkVDXzRfNSwKKyAgICAgICAgRkVDXzVfNiwKKyAgICAgICAgRkVDXzZfNywKKyAgICAgICAgRkVDXzdfOCwKKyAgICAgICAgRkVDXzhfOSwKKyAgICAgICAgRkVDX0FVVE8sCisgICAgICAgIEZFQ18zXzUsCisgICAgICAgIEZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKKworCit0eXBlZGVmIGVudW0gZmVfbW9kdWxhdGlvbiB7CisgICAgICAgIFFQU0ssCisgICAgICAgIFFBTV8xNiwKKyAgICAgICAgUUFNXzMyLAorICAgICAgICBRQU1fNjQsCisgICAgICAgIFFBTV8xMjgsCisgICAgICAgIFFBTV8yNTYsCisgICAgICAgIFFBTV9BVVRPLAorICAgICAgICBWU0JfOCwKKyAgICAgICAgVlNCXzE2LAorICAgICAgICBQU0tfOCwKKyAgICAgICAgQVBTS18xNiwKKyAgICAgICAgQVBTS18zMiwKKyAgICAgICAgRFFQU0ssCit9IGZlX21vZHVsYXRpb25fdDsKKwordHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgeworICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8ySywKKyAgICAgICAgVFJBTlNNSVNTSU9OX01PREVfOEssCisgICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCisgICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFXzRLCit9IGZlX3RyYW5zbWl0X21vZGVfdDsKKwordHlwZWRlZiBlbnVtIGZlX2JhbmR3aWR0aCB7CisgICAgICAgIEJBTkRXSURUSF84X01IWiwKKyAgICAgICAgQkFORFdJRFRIXzdfTUhaLAorICAgICAgICBCQU5EV0lEVEhfNl9NSFosCisgICAgICAgIEJBTkRXSURUSF9BVVRPCit9IGZlX2JhbmR3aWR0aF90OworCisKK3R5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7CisgICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfMzIsCisgICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfMTYsCisgICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfOCwKKyAgICAgICAgR1VBUkRfSU5URVJWQUxfMV80LAorICAgICAgICBHVUFSRF9JTlRFUlZBTF9BVVRPCit9IGZlX2d1YXJkX2ludGVydmFsX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX2hpZXJhcmNoeSB7CisgICAgICAgIEhJRVJBUkNIWV9OT05FLAorICAgICAgICBISUVSQVJDSFlfMSwKKyAgICAgICAgSElFUkFSQ0hZXzIsCisgICAgICAgIEhJRVJBUkNIWV80LAorICAgICAgICBISUVSQVJDSFlfQVVUTworfSBmZV9oaWVyYXJjaHlfdDsKKworCitzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyB7CisgICAgICAgIF9fdTMyICAgICAgICAgICBzeW1ib2xfcmF0ZTsgIC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLworICAgICAgICBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgICAvKiBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKHNlZSBhYm92ZSkgKi8KK307CisKK3N0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgeworICAgICAgICBfX3UzMiAgICAgICAgICAgc3ltYm9sX3JhdGU7IC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLworICAgICAgICBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgIC8qIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiAoc2VlIGFib3ZlKSAqLworICAgICAgICBmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsgIC8qIG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAqLworfTsKKworc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB7CisgICAgICAgIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOyAgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCit9OworCitzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyB7CisgICAgICAgIGZlX2JhbmR3aWR0aF90ICAgICAgYmFuZHdpZHRoOworICAgICAgICBmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9IUDsgIC8qIGhpZ2ggcHJpb3JpdHkgc3RyZWFtIGNvZGUgcmF0ZSAqLworICAgICAgICBmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9MUDsgIC8qIGxvdyBwcmlvcml0eSBzdHJlYW0gY29kZSByYXRlICovCisgICAgICAgIGZlX21vZHVsYXRpb25fdCAgICAgY29uc3RlbGxhdGlvbjsgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCisgICAgICAgIGZlX3RyYW5zbWl0X21vZGVfdCAgdHJhbnNtaXNzaW9uX21vZGU7CisgICAgICAgIGZlX2d1YXJkX2ludGVydmFsX3QgZ3VhcmRfaW50ZXJ2YWw7CisgICAgICAgIGZlX2hpZXJhcmNoeV90ICAgICAgaGllcmFyY2h5X2luZm9ybWF0aW9uOworfTsKKworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgeworICAgICAgICBfX3UzMiBmcmVxdWVuY3k7ICAgICAvKiAoYWJzb2x1dGUpIGZyZXF1ZW5jeSBpbiBIeiBmb3IgUUFNL09GRE0vQVRTQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGluIGtIeiBmb3IgUVBTSyAqLworICAgICAgICBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyBxcHNrOworICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgIHFhbTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOworICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfdnNiX3BhcmFtZXRlcnMgdnNiOworICAgICAgICB9IHU7Cit9OworCisKK3N0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQgeworICAgICAgICBmZV9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOworfTsKKworLyogUzJBUEkgQ29tbWFuZHMgKi8KKyNkZWZpbmUgRFRWX1VOREVGSU5FRCAgICAgICAgICAgMAorI2RlZmluZSBEVFZfVFVORSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERUVl9DTEVBUiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRFRWX0ZSRVFVRU5DWSAgICAgICAgICAgMworI2RlZmluZSBEVFZfTU9EVUxBVElPTiAgICAgICAgICA0CisjZGVmaW5lIERUVl9CQU5EV0lEVEhfSFogICAgICAgIDUKKyNkZWZpbmUgRFRWX0lOVkVSU0lPTiAgICAgICAgICAgNgorI2RlZmluZSBEVFZfRElTRVFDX01BU1RFUiAgICAgICA3CisjZGVmaW5lIERUVl9TWU1CT0xfUkFURSAgICAgICAgIDgKKyNkZWZpbmUgRFRWX0lOTkVSX0ZFQyAgICAgICAgICAgOQorI2RlZmluZSBEVFZfVk9MVEFHRSAgICAgICAgICAgICAxMAorI2RlZmluZSBEVFZfVE9ORSAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBEVFZfUElMT1QgICAgICAgICAgICAgICAxMgorI2RlZmluZSBEVFZfUk9MTE9GRiAgICAgICAgICAgICAxMworI2RlZmluZSBEVFZfRElTRVFDX1NMQVZFX1JFUExZICAxNAorCisvKiBCYXNpYyBlbnVtZXJhdGlvbiBzZXQgZm9yIHF1ZXJ5aW5nIHVubGltaXRlZCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFlfQ09VTlQgMTUKKyNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFkgICAgICAgMTYKKyNkZWZpbmUgRFRWX0RFTElWRVJZX1NZU1RFTSAgICAgMTcKKworLyogSVNEQi1UIGFuZCBJU0RCLVRzYiAqLworI2RlZmluZSBEVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT04gICAgIDE4CisjZGVmaW5lIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkcgICAgMTkKKworI2RlZmluZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRCAgICAgIDIwCisjZGVmaW5lIERUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWCAgICAgICAgMjEKKyNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQgICAgICAyMgorCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfRkVDICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX01PRFVMQVRJT04gICAgICAgICAgICAgMjQKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9TRUdNRU5UX0NPVU5UICAgICAgICAgIDI1CisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfVElNRV9JTlRFUkxFQVZJTkcgICAgICAyNgorCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfRkVDICAgICAgICAgICAgICAgICAgICAyNworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT04gICAgICAgICAgICAgMjgKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9TRUdNRU5UX0NPVU5UICAgICAgICAgIDI5CisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfVElNRV9JTlRFUkxFQVZJTkcgICAgICAzMAorCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfRkVDICAgICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX01PRFVMQVRJT04gICAgICAgICAgICAgMzIKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UICAgICAgICAgIDMzCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfVElNRV9JTlRFUkxFQVZJTkcgICAgICAzNAorCisjZGVmaW5lIERUVl9BUElfVkVSU0lPTiAgICAgICAgIDM1CisKKyNkZWZpbmUgRFRWX0NPREVfUkFURV9IUCAgICAgICAgMzYKKyNkZWZpbmUgRFRWX0NPREVfUkFURV9MUCAgICAgICAgMzcKKyNkZWZpbmUgRFRWX0dVQVJEX0lOVEVSVkFMICAgICAgMzgKKyNkZWZpbmUgRFRWX1RSQU5TTUlTU0lPTl9NT0RFICAgMzkKKyNkZWZpbmUgRFRWX0hJRVJBUkNIWSAgICAgICAgICAgNDAKKworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJfRU5BQkxFRCA0MQorCisjZGVmaW5lIERUVl9JU0RCU19UU19JRCAgICAgICAgIDQyCisKKyNkZWZpbmUgRFRWX01BWF9DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgIERUVl9JU0RCU19UU19JRAorCit0eXBlZGVmIGVudW0gZmVfcGlsb3QgeworICAgICAgICBQSUxPVF9PTiwKKyAgICAgICAgUElMT1RfT0ZGLAorICAgICAgICBQSUxPVF9BVVRPLAorfSBmZV9waWxvdF90OworCit0eXBlZGVmIGVudW0gZmVfcm9sbG9mZiB7CisgICAgICAgIFJPTExPRkZfMzUsIC8qIEltcGxpZWQgdmFsdWUgaW4gRFZCLVMsIGRlZmF1bHQgZm9yIERWQi1TMiAqLworICAgICAgICBST0xMT0ZGXzIwLAorICAgICAgICBST0xMT0ZGXzI1LAorICAgICAgICBST0xMT0ZGX0FVVE8sCit9IGZlX3JvbGxvZmZfdDsKKwordHlwZWRlZiBlbnVtIGZlX2RlbGl2ZXJ5X3N5c3RlbSB7CisgICAgICAgIFNZU19VTkRFRklORUQsCisgICAgICAgIFNZU19EVkJDX0FOTkVYX0FDLAorICAgICAgICBTWVNfRFZCQ19BTk5FWF9CLAorICAgICAgICBTWVNfRFZCVCwKKyAgICAgICAgU1lTX0RTUywKKyAgICAgICAgU1lTX0RWQlMsCisgICAgICAgIFNZU19EVkJTMiwKKyAgICAgICAgU1lTX0RWQkgsCisgICAgICAgIFNZU19JU0RCVCwKKyAgICAgICAgU1lTX0lTREJTLAorICAgICAgICBTWVNfSVNEQkMsCisgICAgICAgIFNZU19BVFNDLAorICAgICAgICBTWVNfQVRTQ01ILAorICAgICAgICBTWVNfRE1CVEgsCisgICAgICAgIFNZU19DTU1CLAorICAgICAgICBTWVNfREFCLAorfSBmZV9kZWxpdmVyeV9zeXN0ZW1fdDsKKworc3RydWN0IGR0dl9jbWRzX2ggeworICAgICAgICBjaGFyICAgICpuYW1lOyAgICAgICAgICAvKiBBIGRpc3BsYXkgbmFtZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCisKKyAgICAgICAgX191MzIgICBjbWQ7ICAgICAgICAgICAgLyogQSB1bmlxdWUgSUQgKi8KKworICAgICAgICAvKiBGbGFncyAqLworICAgICAgICBfX3UzMiAgIHNldDoxOyAgICAgICAgICAvKiBFaXRoZXIgYSBzZXQgb3IgZ2V0IHByb3BlcnR5ICovCisgICAgICAgIF9fdTMyICAgYnVmZmVyOjE7ICAgICAgIC8qIERvZXMgdGhpcyBwcm9wZXJ0eSB1c2UgdGhlIGJ1ZmZlcj8gKi8KKyAgICAgICAgX191MzIgICByZXNlcnZlZDozMDsgICAgLyogQWxpZ24gKi8KK307CisKK3N0cnVjdCBkdHZfcHJvcGVydHkgeworICAgICAgICBfX3UzMiBjbWQ7CisgICAgICAgIF9fdTMyIHJlc2VydmVkWzNdOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgX191MzIgZGF0YTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgX191OCBkYXRhWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyIHJlc2VydmVkMVszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc2VydmVkMjsKKyAgICAgICAgICAgICAgICB9IGJ1ZmZlcjsKKyAgICAgICAgfSB1OworICAgICAgICBpbnQgcmVzdWx0OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIG51bSBvZiBwcm9wZXJ0aWVzIGNhbm5vdCBleGNlZWQgRFRWX0lPQ1RMX01BWF9NU0dTIHBlciBpb2N0bCAqLworI2RlZmluZSBEVFZfSU9DVExfTUFYX01TR1MgNjQKKworc3RydWN0IGR0dl9wcm9wZXJ0aWVzIHsKKyAgICAgICAgX191MzIgbnVtOworICAgICAgICBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczsKK307CisKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+ICAgICAgICAgICAgX0lPVygnbycsIDgyLCBzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMpCisjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9QUk9QRVJUWSI+RkVfR0VUX1BST1BFUlRZPC9saW5rPiAgICAgICAgICAgIF9JT1IoJ28nLCA4Mywgc3RydWN0IGR0dl9wcm9wZXJ0aWVzKQorCisKKy8qKgorICogV2hlbiBzZXQsIHRoaXMgZmxhZyB3aWxsIGRpc2FibGUgYW55IHppZ3phZ2dpbmcgb3Igb3RoZXIgIm5vcm1hbCIgdHVuaW5nCisgKiBiZWhhdmlvdXIuIEFkZGl0aW9uYWxseSwgdGhlcmUgd2lsbCBiZSBubyBhdXRvbWF0aWMgbW9uaXRvcmluZyBvZiB0aGUgbG9jaworICogc3RhdHVzLCBhbmQgaGVuY2Ugbm8gZnJvbnRlbmQgZXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBJZiBhIGZyb250ZW5kIGRldmljZQorICogaXMgY2xvc2VkLCB0aGlzIGZsYWcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYgd2hlbiB0aGUgZGV2aWNlIGlzCisgKiByZW9wZW5lZCByZWFkLXdyaXRlLgorICovCisjZGVmaW5lIEZFX1RVTkVfTU9ERV9PTkVTSE9UIDB4MDEKKworCisjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9JTkZPIj5GRV9HRVRfSU5GTzwvbGluaz4gICAgICAgICAgICAgICAgX0lPUignbycsIDYxLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pCisKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRElTRVFDX1JFU0VUX09WRVJMT0FEIj5GRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQ8L2xpbms+ICAgX0lPKCdvJywgNjIpCisjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19TRU5EX01BU1RFUl9DTUQiPkZFX0RJU0VRQ19TRU5EX01BU1RFUl9DTUQ8L2xpbms+ICBfSU9XKCdvJywgNjMsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQpCisjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZIj5GRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWTwvbGluaz4gX0lPUignbycsIDY0LCBzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSkKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRElTRVFDX1NFTkRfQlVSU1QiPkZFX0RJU0VRQ19TRU5EX0JVUlNUPC9saW5rPiAgICAgICBfSU8oJ28nLCA2NSkgIC8qIGZlX3NlY19taW5pX2NtZF90ICovCisKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX1RPTkUiPkZFX1NFVF9UT05FPC9saW5rPiAgICAgICAgICAgICAgICBfSU8oJ28nLCA2NikgIC8qIGZlX3NlY190b25lX21vZGVfdCAqLworI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9TRVRfVk9MVEFHRSI+RkVfU0VUX1ZPTFRBR0U8L2xpbms+ICAgICAgICAgICAgIF9JTygnbycsIDY3KSAgLyogZmVfc2VjX3ZvbHRhZ2VfdCAqLworI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9FTkFCTEVfSElHSF9MTkJfVk9MVEFHRSI+RkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0U8L2xpbms+IF9JTygnbycsIDY4KSAgLyogaW50ICovCisKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9TVEFUVVMiPkZFX1JFQURfU1RBVFVTPC9saW5rPiAgICAgICAgICAgICBfSU9SKCdvJywgNjksIGZlX3N0YXR1c190KQorI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9SRUFEX0JFUiI+RkVfUkVBRF9CRVI8L2xpbms+ICAgICAgICAgICAgICAgIF9JT1IoJ28nLCA3MCwgX191MzIpCisjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU0lHTkFMX1NUUkVOR1RIIj5GRV9SRUFEX1NJR05BTF9TVFJFTkdUSDwvbGluaz4gICAgX0lPUignbycsIDcxLCBfX3UxNikKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9TTlIiPkZFX1JFQURfU05SPC9saW5rPiAgICAgICAgICAgICAgICBfSU9SKCdvJywgNzIsIF9fdTE2KQorI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUyI+RkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M8L2xpbms+IF9JT1IoJ28nLCA3MywgX191MzIpCisKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX0ZST05URU5EIj5GRV9TRVRfRlJPTlRFTkQ8L2xpbms+ICAgICAgICAgICAgX0lPVygnbycsIDc2LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpCisjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9GUk9OVEVORCI+RkVfR0VUX0ZST05URU5EPC9saW5rPiAgICAgICAgICAgIF9JT1IoJ28nLCA3Nywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKQorI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFIj5GRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFPC9saW5rPiAgX0lPKCdvJywgODEpIC8qIHVuc2lnbmVkIGludCAqLworI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfRVZFTlQiPkZFX0dFVF9FVkVOVDwvbGluaz4gICAgICAgICAgICAgICBfSU9SKCdvJywgNzgsIHN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQpCisKKyNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EIj5GRV9ESVNITkVUV09SS19TRU5EX0xFR0FDWV9DTUQ8L2xpbms+IF9JTygnbycsIDgwKSAvKiB1bnNpZ25lZCBpbnQgKi8KKworI2VuZGlmIC8qX0RWQkZST05URU5EX0hfKi8KKzwvcHJvZ3JhbWxpc3Rpbmc+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQueG1sCmluZGV4IDlkODlhN2IuLjMwMGJhMWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQueG1sCkBAIC03Myw3ICs3Myw4IEBACiA8c2VjdGlvbiBpZD0iZnJvbnRlbmRfaW5mbyI+CiA8dGl0bGU+ZnJvbnRlbmQgaW5mb3JtYXRpb248L3RpdGxlPgogCi08cGFyYT5JbmZvcm1hdGlvbiBhYm91dCB0aGUgZnJvbnRlbmQgY2EgYmUgcXVlcmllZCB3aXRoIEZFX0dFVF9JTkZPLjwvcGFyYT4KKzxwYXJhPkluZm9ybWF0aW9uIGFib3V0IHRoZSBmcm9udGVuZCBjYSBiZSBxdWVyaWVkIHdpdGgKKwk8bGluayBsaW5rZW5kPSJGRV9HRVRfSU5GTyI+RkVfR0VUX0lORk88L2xpbms+LjwvcGFyYT4KIAogPHByb2dyYW1saXN0aW5nPgogCXN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyB7CkBAIC0zMzgsNyArMzM5LDcgQEAKIDxlbnRyeSBhbGlnbj0iY2hhciI+CiA8cGFyYT5UaGlzIHN5c3RlbSBjYWxsIG9wZW5zIGEgbmFtZWQgZnJvbnRlbmQgZGV2aWNlICgvZGV2L2R2Yi9hZGFwdGVyMC9mcm9udGVuZDApCiAgZm9yIHN1YnNlcXVlbnQgdXNlLiBVc3VhbGx5IHRoZSBmaXJzdCB0aGluZyB0byBkbyBhZnRlciBhIHN1Y2Nlc3NmdWwgb3BlbiBpcyB0bwotIGZpbmQgb3V0IHRoZSBmcm9udGVuZCB0eXBlIHdpdGggRkVfR0VUX0lORk8uPC9wYXJhPgorIGZpbmQgb3V0IHRoZSBmcm9udGVuZCB0eXBlIHdpdGggPGxpbmsgbGlua2VuZD0iRkVfR0VUX0lORk8iPkZFX0dFVF9JTkZPPC9saW5rPi48L3BhcmE+CiA8cGFyYT5UaGUgZGV2aWNlIGNhbiBiZSBvcGVuZWQgaW4gcmVhZC1vbmx5IG1vZGUsIHdoaWNoIG9ubHkgYWxsb3dzIG1vbml0b3Jpbmcgb2YKICBkZXZpY2Ugc3RhdHVzIGFuZCBzdGF0aXN0aWNzLCBvciByZWFkL3dyaXRlIG1vZGUsIHdoaWNoIGFsbG93cyBhbnkga2luZCBvZiB1c2UKICAoZS5nLiBwZXJmb3JtaW5nIHR1bmluZyBvcGVyYXRpb25zLikKQEAgLTQ3OCw3ICs0NzksNyBAQAogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfcmVhZF9zdGF0dXMiPgorPHNlY3Rpb24gaWQ9IkZFX1JFQURfU1RBVFVTIj4KIDx0aXRsZT5GRV9SRUFEX1NUQVRVUzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNDkyLDcgKzQ5Myw3IEBACiA8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gRkVfUkVBRF9TVEFUVVMsCis8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU1RBVFVTIj5GRV9SRUFEX1NUQVRVUzwvbGluaz4sCiAgZmVfc3RhdHVzX3QgJiN4MjJDNjtzdGF0dXMpOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CkBAIC01MTEsNyArNTEyLDcgQEAKIDxwYXJhPmludCByZXF1ZXN0PC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FcXVhbHMgRkVfUkVBRF9TVEFUVVMgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Cis8cGFyYT5FcXVhbHMgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9TVEFUVVMiPkZFX1JFQURfU1RBVFVTPC9saW5rPiBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC01NDIsNyArNTQzLDcgQEAKICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3JlYWRfYmVyIj4KKzxzZWN0aW9uIGlkPSJGRV9SRUFEX0JFUiI+CiA8dGl0bGU+RkVfUkVBRF9CRVI8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTU1Nyw3ICs1NTgsNyBAQAogPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IEZFX1JFQURfQkVSLAorPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9SRUFEX0JFUiI+RkVfUkVBRF9CRVI8L2xpbms+LAogIHVpbnQzMl90ICYjeDIyQzY7YmVyKTs8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgpAQCAtNTc1LDcgKzU3Niw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX1JFQURfQkVSIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgorPHBhcmE+RXF1YWxzIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfQkVSIj5GRV9SRUFEX0JFUjwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtNjE5LDcgKzYyMCw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9yZWFkX3NuciI+Cis8c2VjdGlvbiBpZD0iRkVfUkVBRF9TTlIiPgogPHRpdGxlPkZFX1JFQURfU05SPC90aXRsZT4KIAogPHBhcmE+REVTQ1JJUFRJT04KQEAgLTYzNCw3ICs2MzUsNyBAQAogPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IEZFX1JFQURfU05SLCBpbnQxNl90Cis8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU05SIj5GRV9SRUFEX1NOUjwvbGluaz4sIGludDE2X3QKICAmI3gyMkM2O3Nucik7PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KQEAgLTY1Miw3ICs2NTMsNyBAQAogPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyBGRV9SRUFEX1NOUiBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9SRUFEX1NOUiI+RkVfUkVBRF9TTlI8L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTY5Nyw3ICs2OTgsNyBAQAogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfcmVhZF9zaWduYWxfc3RyZW5ndGgiPgorPHNlY3Rpb24gaWQ9IkZFX1JFQURfU0lHTkFMX1NUUkVOR1RIIj4KIDx0aXRsZT5GRV9SRUFEX1NJR05BTF9TVFJFTkdUSDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNzEyLDcgKzcxMyw3IEBACiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPmludCBpb2N0bCggaW50IGZkLCBpbnQgcmVxdWVzdCA9Ci0gRkVfUkVBRF9TSUdOQUxfU1RSRU5HVEgsIGludDE2X3QgJiN4MjJDNjtzdHJlbmd0aCk7PC9wYXJhPgorIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU0lHTkFMX1NUUkVOR1RIIj5GRV9SRUFEX1NJR05BTF9TVFJFTkdUSDwvbGluaz4sIGludDE2X3QgJiN4MjJDNjtzdHJlbmd0aCk7PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIApAQCAtNzMwLDcgKzczMSw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX1JFQURfU0lHTkFMX1NUUkVOR1RIIGZvciB0aGlzCis8cGFyYT5FcXVhbHMgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9TSUdOQUxfU1RSRU5HVEgiPkZFX1JFQURfU0lHTkFMX1NUUkVOR1RIPC9saW5rPiBmb3IgdGhpcwogIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQpAQCAtNzc1LDcgKzc3Niw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9yZWFkX3ViIj4KKzxzZWN0aW9uIGlkPSJGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUyI+CiA8dGl0bGU+RkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTc5Nyw3ICs3OTgsNyBAQAogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5pbnQgaW9jdGwoIGludCBmZCwgaW50IHJlcXVlc3QgPQotIEZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTLCB1aW50MzJfdCAmI3gyMkM2O3VibG9ja3MpOzwvcGFyYT4KKyA8bGluayBsaW5rZW5kPSJGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUyI+RkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M8L2xpbms+LCB1aW50MzJfdCAmI3gyMkM2O3VibG9ja3MpOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8cGFyYT5QQVJBTUVURVJTCkBAIC04MTQsNyArODE1LDcgQEAKIDxwYXJhPmludCByZXF1ZXN0PC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FcXVhbHMgRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1MgZm9yIHRoaXMKKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUyI+RkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M8L2xpbms+IGZvciB0aGlzCiAgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CkBAIC04NTIsNyArODUzLDcgQEAKICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3NldF9mZSI+Cis8c2VjdGlvbiBpZD0iRkVfU0VUX0ZST05URU5EIj4KIDx0aXRsZT5GRV9TRVRfRlJPTlRFTkQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTg2MSw4ICs4NjIsOCBAQAogPHBhcmE+VGhpcyBpb2N0bCBjYWxsIHN0YXJ0cyBhIHR1bmluZyBvcGVyYXRpb24gdXNpbmcgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFRoZSByZXN1bHQKICBvZiB0aGlzIGNhbGwgd2lsbCBiZSBzdWNjZXNzZnVsIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUgdmFsaWQgYW5kIHRoZSB0dW5pbmcgY291bGQKICBiZSBpbml0aWF0ZWQuIFRoZSByZXN1bHQgb2YgdGhlIHR1bmluZyBvcGVyYXRpb24gaW4gaXRzZWxmLCBob3dldmVyLCB3aWxsIGFycml2ZQotIGFzeW5jaHJvbm91c2x5IGFzIGFuIGV2ZW50IChzZWUgZG9jdW1lbnRhdGlvbiBmb3IgRkVfR0VUX0VWRU5UIGFuZAotIEZyb250ZW5kRXZlbnQuKSBJZiBhIG5ldyBGRV9TRVRfRlJPTlRFTkQgb3BlcmF0aW9uIGlzIGluaXRpYXRlZCBiZWZvcmUKKyBhc3luY2hyb25vdXNseSBhcyBhbiBldmVudCAoc2VlIGRvY3VtZW50YXRpb24gZm9yIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9FVkVOVCI+RkVfR0VUX0VWRU5UPC9saW5rPiBhbmQKKyBGcm9udGVuZEV2ZW50LikgSWYgYSBuZXcgPGxpbmsgbGlua2VuZD0iRkVfU0VUX0ZST05URU5EIj5GRV9TRVRfRlJPTlRFTkQ8L2xpbms+IG9wZXJhdGlvbiBpcyBpbml0aWF0ZWQgYmVmb3JlCiAgdGhlIHByZXZpb3VzIG9uZSB3YXMgY29tcGxldGVkLCB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIHdpbGwgYmUgYWJvcnRlZCBpbiBmYXZvcgogIG9mIHRoZSBuZXcgb25lLiBUaGlzIGNvbW1hbmQgcmVxdWlyZXMgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhlIGRldmljZS48L3BhcmE+CiA8L2VudHJ5PgpAQCAtODcyLDcgKzg3Myw3IEBACiA8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gRkVfU0VUX0ZST05URU5ELAorPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9TRVRfRlJPTlRFTkQiPkZFX1NFVF9GUk9OVEVORDwvbGluaz4sCiAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICYjeDIyQzY7cCk7PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KQEAgLTg5MCw3ICs4OTEsNyBAQAogPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyBGRV9TRVRfRlJPTlRFTkQgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Cis8cGFyYT5FcXVhbHMgPGxpbmsgbGlua2VuZD0iRkVfU0VUX0ZST05URU5EIj5GRV9TRVRfRlJPTlRFTkQ8L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTkyOCw3ICs5MjksNyBAQAogPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9nZXRfZmUiPgorPHNlY3Rpb24gaWQ9IkZFX0dFVF9GUk9OVEVORCI+CiA8dGl0bGU+RkVfR0VUX0ZST05URU5EPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC05NDMsNyArOTQ0LDcgQEAKIDwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSBGRV9HRVRfRlJPTlRFTkQsCis8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9GUk9OVEVORCI+RkVfR0VUX0ZST05URU5EPC9saW5rPiwKICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgJiN4MjJDNjtwKTs8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgpAQCAtOTYyLDcgKzk2Myw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX1NFVF9GUk9OVEVORCBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9TRVRfRlJPTlRFTkQiPkZFX1NFVF9GUk9OVEVORDwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTAwMyw3ICsxMDA0LDcgQEAKIAogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfZ2V0X2V2ZW50Ij4KKzxzZWN0aW9uIGlkPSJGRV9HRVRfRVZFTlQiPgogPHRpdGxlPkZFX0dFVF9FVkVOVDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTAyNCw3ICsxMDI1LDggQEAKICByYXRoZXIgc21hbGwgKHJvb20gZm9yIDggZXZlbnRzKSwgdGhlIHF1ZXVlIG11c3QgYmUgc2VydmljZWQgcmVndWxhcmx5IHRvIGF2b2lkCiAgb3ZlcmZsb3cuIElmIGFuIG92ZXJmbG93IGhhcHBlbnMsIHRoZSBvbGRlc3QgZXZlbnQgaXMgZGlzY2FyZGVkIGZyb20gdGhlIHF1ZXVlLAogIGFuZCBhbiBlcnJvciAoRU9WRVJGTE9XKSBvY2N1cnMgdGhlIG5leHQgdGltZSB0aGUgcXVldWUgaXMgcmVhZC4gQWZ0ZXIKLSByZXBvcnRpbmcgdGhlIGVycm9yIGNvbmRpdGlvbiBpbiB0aGlzIGZhc2hpb24sIHN1YnNlcXVlbnQgRkVfR0VUX0VWRU5UCisgcmVwb3J0aW5nIHRoZSBlcnJvciBjb25kaXRpb24gaW4gdGhpcyBmYXNoaW9uLCBzdWJzZXF1ZW50CisgPGxpbmsgbGlua2VuZD0iRkVfR0VUX0VWRU5UIj5GRV9HRVRfRVZFTlQ8L2xpbms+CiAgY2FsbHMgd2lsbCByZXR1cm4gZXZlbnRzIGZyb20gdGhlIHF1ZXVlIGFzIHVzdWFsLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PHJvdz48ZW50cnkKQEAgLTEwNTcsNyArMTA1OSw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX0dFVF9FVkVOVCBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9HRVRfRVZFTlQiPkZFX0dFVF9FVkVOVDwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTExNSw3ICsxMTE3LDcgQEAKIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfZ2V0X2luZm8iPgorPHNlY3Rpb24gaWQ9IkZFX0dFVF9JTkZPIj4KIDx0aXRsZT5GRV9HRVRfSU5GTzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTEzMCw3ICsxMTMyLDcgQEAKIAogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT4gaW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSBGRV9HRVRfSU5GTywgc3RydWN0Cis8cGFyYT4gaW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9HRVRfSU5GTyI+RkVfR0VUX0lORk88L2xpbms+LCBzdHJ1Y3QKICBkdmJfZnJvbnRlbmRfaW5mbyAmI3gyMkM2O2luZm8pOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CkBAIC0xMTQ5LDcgKzExNTEsNyBAQAogPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyBGRV9HRVRfSU5GTyBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9HRVRfSU5GTyI+RkVfR0VUX0lORk88L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTExODEsNyArMTE4Myw3IEBACiA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX2Rpc2VxY19yZXNldF9vdmVybG9hZCI+Cis8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1JFU0VUX09WRVJMT0FEIj4KIDx0aXRsZT5GRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTExOTksNyArMTIwMSw3IEBACiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0KLSBGRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQpOzwvcGFyYT4KKyA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQiPkZFX0RJU0VRQ19SRVNFVF9PVkVSTE9BRDwvbGluaz4pOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8cGFyYT5QQVJBTUVURVJTCkBAIC0xMjE2LDcgKzEyMTgsNyBAQAogPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyBGRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQgZm9yIHRoaXMKKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQiPkZFX0RJU0VRQ19SRVNFVF9PVkVSTE9BRDwvbGluaz4gZm9yIHRoaXMKICBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CkBAIC0xMjQ3LDcgKzEyNDksNyBAQAogPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kIj4KKzxzZWN0aW9uIGlkPSJGRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EIj4KIDx0aXRsZT5GRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMjYxLDcgKzEyNjMsNyBAQAogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9Ci0gRkVfRElTRVFDX1NFTkRfTUFTVEVSX0NNRCwgc3RydWN0CisgPGxpbmsgbGlua2VuZD0iRkVfRElTRVFDX1NFTkRfTUFTVEVSX0NNRCI+RkVfRElTRVFDX1NFTkRfTUFTVEVSX0NNRDwvbGluaz4sIHN0cnVjdAogIGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAmI3gyMkM2O2NtZCk7PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KQEAgLTEyODAsNyArMTI4Miw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX0RJU0VRQ19TRU5EX01BU1RFUl9DTUQgZm9yIHRoaXMKKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EIj5GRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EPC9saW5rPiBmb3IgdGhpcwogIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQpAQCAtMTMzNSw3ICsxMzM3LDcgQEAKIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfZGlzZXFjX3JlY3Zfc2xhdmVfcmVwbHkiPgorPHNlY3Rpb24gaWQ9IkZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZIj4KIDx0aXRsZT5GRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTM1MCw3ICsxMzUyLDcgQEAKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPQotIEZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZLCBzdHJ1Y3QKKyA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWSI+RkVfRElTRVFDX1JFQ1ZfU0xBVkVfUkVQTFk8L2xpbms+LCBzdHJ1Y3QKICBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5ICYjeDIyQzY7cmVwbHkpOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CkBAIC0xMzY5LDcgKzEzNzEsNyBAQAogPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyBGRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWSBmb3IgdGhpcworPHBhcmE+RXF1YWxzIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZIj5GRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWTwvbGluaz4gZm9yIHRoaXMKICBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PHJvdz48ZW50cnkKQEAgLTE0MjMsNyArMTQyNSw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9kaXNlcWNfc2VuZF9idXJzdCI+Cis8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1NFTkRfQlVSU1QiPgogPHRpdGxlPkZFX0RJU0VRQ19TRU5EX0JVUlNUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNDM4LDcgKzE0NDAsNyBAQAogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9Ci0gRkVfRElTRVFDX1NFTkRfQlVSU1QsIGZlX3NlY19taW5pX2NtZF90IGJ1cnN0KTs8L3BhcmE+CisgPGxpbmsgbGlua2VuZD0iRkVfRElTRVFDX1NFTkRfQlVSU1QiPkZFX0RJU0VRQ19TRU5EX0JVUlNUPC9saW5rPiwgZmVfc2VjX21pbmlfY21kX3QgYnVyc3QpOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKQEAgLTE0NTYsNyArMTQ1OCw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX0RJU0VRQ19TRU5EX0JVUlNUIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgorPHBhcmE+RXF1YWxzIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19TRU5EX0JVUlNUIj5GRV9ESVNFUUNfU0VORF9CVVJTVDwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTUwOSw3ICsxNTExLDcgQEAKIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfc2V0X3RvbmUiPgorPHNlY3Rpb24gaWQ9IkZFX1NFVF9UT05FIj4KIDx0aXRsZT5GRV9TRVRfVE9ORTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTUyMyw3ICsxNTI1LDcgQEAKIDwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSBGRV9TRVRfVE9ORSwKKzxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gPGxpbmsgbGlua2VuZD0iRkVfU0VUX1RPTkUiPkZFX1NFVF9UT05FPC9saW5rPiwKICBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSk7PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KQEAgLTE1NDEsNyArMTU0Myw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX1NFVF9UT05FIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgorPHBhcmE+RXF1YWxzIDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9UT05FIj5GRV9TRVRfVE9ORTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTU5Miw3ICsxNTk0LDcgQEAKIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZmVfc2V0X3ZvbHRhZ2UiPgorPHNlY3Rpb24gaWQ9IkZFX1NFVF9WT0xUQUdFIj4KIDx0aXRsZT5GRV9TRVRfVk9MVEFHRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTYwNiw3ICsxNjA4LDcgQEAKIDwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSBGRV9TRVRfVk9MVEFHRSwKKzxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gPGxpbmsgbGlua2VuZD0iRkVfU0VUX1ZPTFRBR0UiPkZFX1NFVF9WT0xUQUdFPC9saW5rPiwKICBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CkBAIC0xNjI1LDcgKzE2MjcsNyBAQAogPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyBGRV9TRVRfVk9MVEFHRSBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9TRVRfVk9MVEFHRSI+RkVfU0VUX1ZPTFRBR0U8L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE2NzcsNyArMTY3OSw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9lbmFibGVfaGlnaF9sbmJfdm9sdCI+Cis8c2VjdGlvbiBpZD0iRkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0UiPgogPHRpdGxlPkZFX0VOQUJMRV9ISUdIX0xOQl9WT0xUQUdFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNjk0LDcgKzE2OTYsNyBAQAogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9Ci0gRkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0UsIGludCBoaWdoKTs8L3BhcmE+CisgPGxpbmsgbGlua2VuZD0iRkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0UiPkZFX0VOQUJMRV9ISUdIX0xOQl9WT0xUQUdFPC9saW5rPiwgaW50IGhpZ2gpOzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKQEAgLTE3MTIsNyArMTcxNCw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEZFX1NFVF9WT0xUQUdFIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgorPHBhcmE+RXF1YWxzIDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9WT0xUQUdFIj5GRV9TRVRfVk9MVEFHRTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTc2Miw1ICsxNzY0LDgyIEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iRkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERSI+Cis8dGl0bGU+RkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERTwvdGl0bGU+Cis8cGFyYT5ERVNDUklQVElPTjwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+Cis8ZW50cnkgYWxpZ249ImNoYXIiPgorPHBhcmE+QWxsb3cgc2V0dGluZyB0dW5lciBtb2RlIGZsYWdzIHRvIHRoZSBmcm9udGVuZC48L3BhcmE+Cis8L2VudHJ5PgorPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKzxwYXJhPlNZTk9QU0lTPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz4KKzxlbnRyeSBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9Cis8bGluayBsaW5rZW5kPSJGRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFIj5GRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFPC9saW5rPiwgdW5zaWduZWQgaW50IGZsYWdzKTs8L3BhcmE+Cis8L2VudHJ5PgorPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKzxwYXJhPlBBUkFNRVRFUlM8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgorPGVudHJ5IGFsaWduPSJjaGFyIj4KKwk8cGFyYT51bnNpZ25lZCBpbnQgZmxhZ3M8L3BhcmE+Cis8L2VudHJ5PgorPGVudHJ5IGFsaWduPSJjaGFyIj4KKzxwYXJhPgorRkVfVFVORV9NT0RFX09ORVNIT1QgV2hlbiBzZXQsIHRoaXMgZmxhZyB3aWxsIGRpc2FibGUgYW55IHppZ3phZ2dpbmcgb3Igb3RoZXIgIm5vcm1hbCIgdHVuaW5nIGJlaGF2aW91ci4gQWRkaXRpb25hbGx5LCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9tYXRpYyBtb25pdG9yaW5nIG9mIHRoZSBsb2NrIHN0YXR1cywgYW5kIGhlbmNlIG5vIGZyb250ZW5kIGV2ZW50cyB3aWxsIGJlIGdlbmVyYXRlZC4gSWYgYSBmcm9udGVuZCBkZXZpY2UgaXMgY2xvc2VkLCB0aGlzIGZsYWcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYgd2hlbiB0aGUgZGV2aWNlIGlzIHJlb3BlbmVkIHJlYWQtd3JpdGUuCis8L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorCis8cGFyYT5FUlJPUlM8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgorPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FSU5WQUw8L3BhcmE+PC9lbnRyeT4KKzxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+SW52YWxpZCBhcmd1bWVudC48L3BhcmE+PC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIDwvc2VjdGlvbj4KLSZzdWItaXNkYnQ7CisKKzxzZWN0aW9uIGlkPSJGRV9ESVNITkVUV09SS19TRU5EX0xFR0FDWV9DTUQiPgorCTx0aXRsZT5GRV9ESVNITkVUV09SS19TRU5EX0xFR0FDWV9DTUQ8L3RpdGxlPgorPHBhcmE+REVTQ1JJUFRJT048L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PgorPGVudHJ5IGFsaWduPSJjaGFyIj4KKzxwYXJhPldBUk5JTkc6IFRoaXMgaXMgYSB2ZXJ5IG9ic2N1cmUgbGVnYWN5IGNvbW1hbmQsIHVzZWQgb25seSBhdCBzdHYwMjk5IGRyaXZlci4gU2hvdWxkIG5vdCBiZSB1c2VkIG9uIG5ld2VyIGRyaXZlcnMuPC9wYXJhPgorPHBhcmE+SXQgcHJvdmlkZXMgYSBub24tc3RhbmRhcmQgbWV0aG9kIGZvciBzZWxlY3RpbmcgRGlzZXFjIHZvbHRhZ2Ugb24gdGhlIGZyb250ZW5kLCBmb3IgRGlzaCBOZXR3b3JrIGxlZ2FjeSBzd2l0Y2hlcy48L3BhcmE+Cis8cGFyYT5BcyBzdXBwb3J0IGZvciB0aGlzIGlvY3RsIHdlcmUgYWRkZWQgaW4gMjAwNCwgdGhpcyBtZWFucyB0aGF0IHN1Y2ggZGlzaGVzIHdlcmUgYWxyZWFkeSBsZWdhY3kgaW4gMjAwNC48L3BhcmE+Cis8L2VudHJ5PgorPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKzxwYXJhPlNZTk9QU0lTPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz4KKzxlbnRyeSBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9CisJPGxpbmsgbGlua2VuZD0iRkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EIj5GRV9ESVNITkVUV09SS19TRU5EX0xFR0FDWV9DTUQ8L2xpbms+LCB1bnNpZ25lZCBsb25nIGNtZCk7PC9wYXJhPgorPC9lbnRyeT4KKzwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorCis8cGFyYT5QQVJBTUVURVJTPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz4KKzxlbnRyeSBhbGlnbj0iY2hhciI+CisJPHBhcmE+dW5zaWduZWQgbG9uZyBjbWQ8L3BhcmE+Cis8L2VudHJ5PgorPGVudHJ5IGFsaWduPSJjaGFyIj4KKzxwYXJhPgorc2VuZHMgdGhlIHNwZWNpZmllZCByYXcgY21kIHRvIHRoZSBkaXNoIHZpYSBESVNFcUMuCis8L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorCis8cGFyYT5FUlJPUlM8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PgorPGVudHJ5IGFsaWduPSJjaGFyIj4KKwk8cGFyYT5UaGVyZSBhcmUgbm8gZXJyb3JzIGluIHVzZSBmb3IgdGhpcyBjYWxsPC9wYXJhPgorPC9lbnRyeT4KKzwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPC9zZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKyZzdWItZHZicHJvcGVydHk7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZ2VuZXJpY2lycS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2dlbmVyaWNpcnEudG1wbAppbmRleCBjNjcxYTAxLi4xNDQ4YjMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZ2VuZXJpY2lycS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9nZW5lcmljaXJxLnRtcGwKQEAgLTQxNyw4ICs0MTcsOCBAQAogICAgICAgPC9wYXJhPgogICAgICAgPHBhcmE+CiAJVG8gbWFrZSB1c2Ugb2YgdGhlIHNwbGl0IGltcGxlbWVudGF0aW9uLCByZXBsYWNlIHRoZSBjYWxsIHRvCi0JX19kb19JUlEgYnkgYSBjYWxsIHRvIGRlc2MtPmNoaXAtPmhhbmRsZV9pcnEoKSBhbmQgYXNzb2NpYXRlCi0gICAgICAgIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGRlc2MtPmNoaXAtPmhhbmRsZV9pcnEoKS4KKwlfX2RvX0lSUSBieSBhIGNhbGwgdG8gZGVzYy0+aGFuZGxlX2lycSgpIGFuZCBhc3NvY2lhdGUKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZnVuY3Rpb24gdG8gZGVzYy0+aGFuZGxlX2lycSgpLgogCUluIG1vc3QgY2FzZXMgdGhlIGdlbmVyaWMgaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCiAJYmUgc3VmZmljaWVudC4KICAgICAgPC9wYXJhPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1oYWNraW5nLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAppbmRleCA5OTJlNjdlLi43YjNmNDkzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbApAQCAtMzUyLDcgKzM1Miw3IEBACiAgIDwvcGFyYT4KIAogICA8cHJvZ3JhbWxpc3Rpbmc+Ci1pZiAoc2lnbmFsX3BlbmRpbmcoKSkgCitpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CiAgIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1lbnRpdGllcy50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwKaW5kZXggMGViNDNjMS4uYmI1YWI3NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwKQEAgLTI4MCw3ICsyODAsNyBAQAogPCFFTlRJVFkgc3ViLXY0bDIgU1lTVEVNICJ2NGwvdjRsMi54bWwiPgogPCFFTlRJVFkgc3ViLWludHJvIFNZU1RFTSAiZHZiL2ludHJvLnhtbCI+CiA8IUVOVElUWSBzdWItZnJvbnRlbmQgU1lTVEVNICJkdmIvZnJvbnRlbmQueG1sIj4KLTwhRU5USVRZIHN1Yi1pc2RidCBTWVNURU0gImR2Yi9pc2RidC54bWwiPgorPCFFTlRJVFkgc3ViLWR2YnByb3BlcnR5IFNZU1RFTSAiZHZiL2R2YnByb3BlcnR5LnhtbCI+CiA8IUVOVElUWSBzdWItZGVtdXggU1lTVEVNICJkdmIvZGVtdXgueG1sIj4KIDwhRU5USVRZIHN1Yi12aWRlbyBTWVNURU0gImR2Yi92aWRlby54bWwiPgogPCFFTlRJVFkgc3ViLWF1ZGlvIFNZU1RFTSAiZHZiL2F1ZGlvLnhtbCI+CkBAIC0yODgsNiArMjg4LDcgQEAKIDwhRU5USVRZIHN1Yi1uZXQgU1lTVEVNICJkdmIvbmV0LnhtbCI+CiA8IUVOVElUWSBzdWIta2RhcGkgU1lTVEVNICJkdmIva2RhcGkueG1sIj4KIDwhRU5USVRZIHN1Yi1leGFtcGxlcyBTWVNURU0gImR2Yi9leGFtcGxlcy54bWwiPgorPCFFTlRJVFkgc3ViLWZyb250ZW5kLWggU1lTVEVNICJkdmIvZnJvbnRlbmQuaC54bWwiPgogPCFFTlRJVFkgc3ViLWR2YmFwaSBTWVNURU0gImR2Yi9kdmJhcGkueG1sIj4KIDwhRU5USVRZIHN1Yi1tZWRpYSBTWVNURU0gIm1lZGlhLnhtbCI+CiA8IUVOVElUWSBzdWItbWVkaWEtZW50aXRpZXMgU1lTVEVNICJtZWRpYS1lbnRpdGllcy50bXBsIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tdGRuYW5kLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsCmluZGV4IGRmMGQwODkuLmY1MDhhOGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tdGRuYW5kLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL210ZG5hbmQudG1wbApAQCAtMzYyLDcgKzM2Miw3IEBACiAJPHNlY3QxIGlkPSJNdWx0aXBsZV9jaGlwX2NvbnRyb2wiPgogCQk8dGl0bGU+TXVsdGlwbGUgY2hpcCBjb250cm9sPC90aXRsZT4KIAkJPHBhcmE+Ci0JCQlUaGUgbmFuZCBkcml2ZXIgY2FuIGNvbnRyb2wgY2hpcCBhcnJheXMuIFRoZXJlZm9yIHRoZQorCQkJVGhlIG5hbmQgZHJpdmVyIGNhbiBjb250cm9sIGNoaXAgYXJyYXlzLiBUaGVyZWZvcmUgdGhlCiAJCQlib2FyZCBkcml2ZXIgbXVzdCBwcm92aWRlIGFuIG93biBzZWxlY3RfY2hpcCBmdW5jdGlvbi4gVGhpcwogCQkJZnVuY3Rpb24gbXVzdCAoZGUpc2VsZWN0IHRoZSByZXF1ZXN0ZWQgY2hpcC4KIAkJCVRoZSBmdW5jdGlvbiBwb2ludGVyIGluIHRoZSBuYW5kX2NoaXAgc3RydWN0dXJlIG11c3QKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29udHJvbHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb250cm9scy54bWwKaW5kZXggZjQ5MmFjYy4uZjQ2NDUwNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb250cm9scy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb250cm9scy54bWwKQEAgLTI4MSwxMCArMjgxLDI4IEBACiA8Y29uc3RhbnQ+VjRMMl9DT0xPUkZYX1NFUElBPC9jb25zdGFudD4gKDIpLjwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9DSURfUk9UQVRFPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgIDxlbnRyeT5Sb3RhdGVzIHRoZSBpbWFnZSBieSBzcGVjaWZpZWQgYW5nbGUuIENvbW1vbiBhbmdsZXMgYXJlIDkwLAorCSAgICAyNzAgYW5kIDE4MC4gUm90YXRpbmcgdGhlIGltYWdlIHRvIDkwIGFuZCAyNzAgd2lsbCByZXZlcnNlIHRoZSBoZWlnaHQKKwkgICAgYW5kIHdpZHRoIG9mIHRoZSBkaXNwbGF5IHdpbmRvdy4gSXQgaXMgbmVjZXNzYXJ5IHRvIHNldCB0aGUgbmV3IGhlaWdodCBhbmQKKwkgICAgd2lkdGggb2YgdGhlIHBpY3R1cmUgdXNpbmcgdGhlICZWSURJT0MtUy1GTVQ7IGlvY3RsIGFjY29yZGluZyB0bworCSAgICB0aGUgcm90YXRpb24gYW5nbGUgc2VsZWN0ZWQuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0NJRF9CR19DT0xPUjwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICA8ZW50cnk+U2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvbiB0aGUgY3VycmVudCBvdXRwdXQgZGV2aWNlLgorCSAgICBCYWNrZ3JvdW5kIGNvbG9yIG5lZWRzIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgUkdCMjQgZm9ybWF0LiBUaGUKKwkgICAgc3VwcGxpZWQgMzIgYml0IHZhbHVlIGlzIGludGVycHJldGVkIGFzIGJpdHMgMC03IFJlZCBjb2xvciBpbmZvcm1hdGlvbiwKKwkgICAgYml0cyA4LTE1IEdyZWVuIGNvbG9yIGluZm9ybWF0aW9uLCBiaXRzIDE2LTIzIEJsdWUgY29sb3IKKwkgICAgaW5mb3JtYXRpb24gYW5kIGJpdHMgMjQtMzEgbXVzdCBiZSB6ZXJvLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CiAJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9DSURfTEFTVFAxPC9jb25zdGFudD48L2VudHJ5PgogCSAgICA8ZW50cnk+PC9lbnRyeT4KIAkgICAgPGVudHJ5PkVuZCBvZiB0aGUgcHJlZGVmaW5lZCBjb250cm9sIElEcyAoY3VycmVudGx5Ci08Y29uc3RhbnQ+VjRMMl9DSURfQ09MT1JGWDwvY29uc3RhbnQ+ICsgMSkuPC9lbnRyeT4KKzxjb25zdGFudD5WNEwyX0NJRF9CR19DT0xPUjwvY29uc3RhbnQ+ICsgMSkuPC9lbnRyeT4KIAkgIDwvcm93PgogCSAgPHJvdz4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0NJRF9QUklWQVRFX0JBU0U8L2NvbnN0YW50PjwvZW50cnk+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC54bWwKaW5kZXggN2QzOTZhMy4uODg1OTY4ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LnhtbApAQCAtNzcwLDYgKzc3MCwxMSBAQAogCSAgICA8ZW50cnk+J1M5MjAnPC9lbnRyeT4KIAkgICAgPGVudHJ5PllVViA0OjI6MCBmb3JtYXQgb2YgdGhlIGdzcGNhIHNuOWMyMHggZHJpdmVyLjwvZW50cnk+CiAJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1TVFYwNjgwIj4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfU1RWMDY4MDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PidTNjgwJzwvZW50cnk+CisJICAgIDxlbnRyeT5CYXllciBmb3JtYXQgb2YgdGhlIGdzcGNhIHN0djA2ODAgZHJpdmVyLjwvZW50cnk+CisJICA8L3Jvdz4KIAkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1XTlZBIj4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfV05WQTwvY29uc3RhbnQ+PC9lbnRyeT4KIAkgICAgPGVudHJ5PidXTlZBJzwvZW50cnk+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGVvZGV2Mi5oLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkZW9kZXYyLmgueG1sCmluZGV4IDk3MDAyMDYuLjNlMjgyZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkZW9kZXYyLmgueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkZW9kZXYyLmgueG1sCkBAIC0zNjMsNiArMzYzLDcgQEAKICNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU9WNTExIj5WNEwyX1BJWF9GTVRfT1Y1MTE8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICcxJykgLyogb3Y1MTEgSlBFRyAqLwogI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtT1Y1MTgiPlY0TDJfUElYX0ZNVF9PVjUxODwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ08nLCAnNScsICcxJywgJzgnKSAvKiBvdjUxOCBKUEVHICovCiAjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1UTTYwMDAiPlY0TDJfUElYX0ZNVF9UTTYwMDA8L2xpbms+ICAgdjRsMl9mb3VyY2MoJ1QnLCAnTScsICc2JywgJzAnKSAvKiB0bTU2MDAvdG02MHgwICovCisjZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TVFYwNjgwIj5WNEwyX1BJWF9GTVRfU1RWMDY4MDwvbGluaz4gIHY0bDJfZm91cmNjKCdTJywgJzYnLCAnOCcsICcwJykgLyogc3R2MDY4MCBiYXllciAqLwogCiAvKgogICogICAgICBGIE8gUiBNIEEgVCAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgpAQCAtNDkyLDcgKzQ5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHlvdSBkbywgbGVhdmUgdGhlbSB1bnRvdWNoZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElubHVkaW5nIGxlc3MgbWFya2VycyB3aWxsIG1ha2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdGluZyBjb2RlIHNtYWxsZXIsIGJ1dCB0aGVyZSB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIGZld2VyIGFwbGljYXRpb25zIHdoaWNoIGNhbiByZWFkIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSBmZXdlciBhcHBsaWNhdGlvbnMgd2hpY2ggY2FuIHJlYWQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgQVBQIGFuZCBDT00gbWFya2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIGluZmx1ZW5jZWQgYnkgQVBQX2xlbiBhbmQgQ09NX2xlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBPTkxZLCBub3QgYnkgdGhpcyBwcm9wZXJ0eSEgKi8KQEAgLTU2NSw2ICs1NjYsNyBAQAogI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0FMUEhBICAgICAgIDB4MDAxMAogI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0dMT0JBTF9BTFBIQSAgICAgIDB4MDAyMAogI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0lOVl9BTFBIQSAgIDB4MDA0MAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX1NSQ19DSFJPTUFLRVkgICAgIDB4MDA4MAogLyogIEZsYWdzIGZvciB0aGUgJ2ZsYWdzJyBmaWVsZC4gKi8KICNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfUFJJTUFSWSAgICAgICAgICAweDAwMDEKICNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWSAgICAgICAgICAweDAwMDIKQEAgLTU3Miw2ICs1NzQsNyBAQAogI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9BTFBIQSAgICAgIDB4MDAwOAogI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19HTE9CQUxfQUxQSEEgICAgIDB4MDAxMAogI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9JTlZfQUxQSEEgIDB4MDAyMAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19TUkNfQ0hST01BS0VZICAgIDB4MDA0MAogCiBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jbGlwIj52NGwyX2NsaXA8L2xpbms+IHsKICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcmVjdCI+djRsMl9yZWN0PC9saW5rPiAgICAgICAgYzsKQEAgLTkxNCw4ICs5MTcsMTAgQEAKICNkZWZpbmUgVjRMMl9DSURfQVVUT0JSSUdIVE5FU1MgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzMyKQogI2RlZmluZSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzMpCiAKKyNkZWZpbmUgVjRMMl9DSURfUk9UQVRFICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM0KQorI2RlZmluZSBWNEwyX0NJRF9CR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzUpCiAvKiBsYXN0IENJRCArIDEgKi8KLSNkZWZpbmUgVjRMMl9DSURfTEFTVFAxICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM0KQorI2RlZmluZSBWNEwyX0NJRF9MQVNUUDEgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzYpCiAKIC8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHg5MDApCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWZidWYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1mYnVmLnhtbAppbmRleCBmNzAxNzA2Li5lN2RkYTQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWZidWYueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZmJ1Zi54bWwKQEAgLTMzNiw2ICszMzYsMTMgQEAKIGludmVydGVkIGFscGhhIGNoYW5uZWwgb2YgdGhlIGZyYW1lYnVmZmVyIG9yIFZHQSBzaWduYWwuIEFscGhhCiBibGVuZGluZyBtYWtlcyBubyBzZW5zZSBmb3IgZGVzdHJ1Y3RpdmUgb3ZlcmxheXMuPC9lbnRyeT4KIAkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0ZCVUZfQ0FQX1NSQ19DSFJPTUFLRVk8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDAwODA8L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIGRldmljZSBzdXBwb3J0cyBTb3VyY2UgQ2hyb21hLWtleWluZy4gRnJhbWVidWZmZXIgcGl4ZWxzCit3aXRoIHRoZSBjaHJvbWEta2V5IGNvbG9ycyBhcmUgcmVwbGFjZWQgYnkgdmlkZW8gcGl4ZWxzLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIG9mCis8Y29uc3RhbnQ+VjRMMl9GQlVGX0NBUF9DSFJPTUFLRVk8L2NvbnN0YW50PjwvZW50cnk+CisJICA8L3Jvdz4KIAk8L3Rib2R5PgogICAgICAgPC90Z3JvdXA+CiAgICAgPC90YWJsZT4KQEAgLTQxMSw2ICs0MTgsMTYgQEAKIG91dHB1dCA9IGZyYW1lYnVmZmVyIHBpeGVsICogKDEgLSBhbHBoYSkgKyB2aWRlbyBwaXhlbCAqIGFscGhhLiBUaGUKIGFjdHVhbCBhbHBoYSBkZXB0aCBkZXBlbmRzIG9uIHRoZSBmcmFtZWJ1ZmZlciBwaXhlbCBmb3JtYXQuPC9lbnRyeT4KIAkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0ZCVUZfRkxBR19TUkNfQ0hST01BS0VZPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDQwPC9lbnRyeT4KKwkgICAgPGVudHJ5PlVzZSBzb3VyY2UgY2hyb21hLWtleWluZy4gVGhlIHNvdXJjZSBjaHJvbWEta2V5IGNvbG9yIGlzCitkZXRlcm1pbmVkIGJ5IHRoZSA8c3RydWN0ZmllbGQ+Y2hyb21ha2V5PC9zdHJ1Y3RmaWVsZD4gZmllbGQgb2YKKyZ2NGwyLXdpbmRvdzsgYW5kIG5lZ290aWF0ZWQgd2l0aCB0aGUgJlZJRElPQy1TLUZNVDsgaW9jdGwsIHNlZSA8eHJlZgorbGlua2VuZD0ib3ZlcmxheSIgLz4gYW5kIDx4cmVmIGxpbmtlbmQ9Im9zZCIgLz4uCitCb3RoIGNocm9tYS1rZXlpbmcgYXJlIG11dHVhbCBleGNsdXNpdmUgdG8gZWFjaCBvdGhlciwgc28gc2FtZQorPHN0cnVjdGZpZWxkPmNocm9tYWtleTwvc3RydWN0ZmllbGQ+IGZpZWxkIG9mICZ2NGwyLXdpbmRvdzsgaXMgYmVpbmcgdXNlZC48L2VudHJ5PgorCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAppbmRleCA3YTJlMGU5Li4wZDBmN2I0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKQEAgLTUzMTgsNyArNTMxOCw3IEBACiAgICAgICBwYWdlcyBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgbWFwIHRoZW0gb250byB0aGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMKICAgICAgIG1lbW9yeS4gIFRoZSB2aXJ0dWFsIHBvaW50ZXIgaXMgYWRkcmVzc2VkIGluIHJ1bnRpbWUtJmd0O2RtYV9hcmVhLgogICAgICAgVGhlIHBoeXNpY2FsIGFkZHJlc3MgKHJ1bnRpbWUtJmd0O2RtYV9hZGRyKSBpcyBzZXQgdG8gemVybywKLSAgICAgIGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBwaHlzaWNhbGx5IG5vbi1jb250aWdvdXMuCisgICAgICBiZWNhdXNlIHRoZSBidWZmZXIgaXMgcGh5c2ljYWxseSBub24tY29udGlndW91cy4KICAgICAgIFRoZSBwaHlzaWNhbCBhZGRyZXNzIHRhYmxlIGlzIHNldCB1cCBpbiBzZ2J1Zi0mZ3Q7dGFibGUuCiAgICAgICBZb3UgY2FuIGdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhdCBhIGNlcnRhaW4gb2Zmc2V0IHZpYQogICAgICAgPGZ1bmN0aW9uPnNuZF9wY21fc2didWZfZ2V0X2FkZHIoKTwvZnVuY3Rpb24+LiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGIvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IKaW5kZXggYmYyYTljZC4uYzgyMzhlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IKQEAgLTg1LDcgKzg1LDcgQEAKIAkgICAgIC0gbW92ZWQgdHJhbnNmZXIgY29udHJvbCAocGlkIGZpbHRlciwgZmlmbyBjb250cm9sKSBmcm9tIHVzYiBkcml2ZXIgdG8gZnJvbnRlbmQsIGl0IHNlZW1zCiAJICAgICAgIGJldHRlciBzZXR0bGVkIHRoZXJlIChhZGRlZCB4ZmVyX29wcy1zdHJ1Y3QpCiAJICAgICAtIGNyZWF0ZWQgYSBjb21tb24gZmlsZXMgZm9yIGZyb250ZW5kcyAobWMvcC9tYikKLSAgMjAwNC0wOS0yOCAtIGFkZGVkIHN1cHBvcnQgZm9yIGEgbmV3IGRldmljZSAoVW5rb3duLCB2ZW5kb3IgSUQgaXMgSHlwZXItUGFsdGVrKQorICAyMDA0LTA5LTI4IC0gYWRkZWQgc3VwcG9ydCBmb3IgYSBuZXcgZGV2aWNlIChVbmtub3duLCB2ZW5kb3IgSUQgaXMgSHlwZXItUGFsdGVrKQogICAyMDA0LTA5LTIwIC0gYWRkZWQgc3VwcG9ydCBmb3IgYSBuZXcgZGV2aWNlIChDb21wcm8gRFZCLVUyMDAwKSwgdGhhbmtzCiAJICAgICAgIHRvIEFtYXVyeSBEZW1vbCBmb3IgcmVwb3J0aW5nCiAJICAgICAtIGNoYW5nZWQgdXNiIFRTIHRyYW5zZmVyIG1ldGhvZCAoc2V2ZXJhbCB1cmJzLCBzdG9wcGluZyB0cmFuc2ZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lZGFjLnR4dCBiL0RvY3VtZW50YXRpb24vZWRhYy50eHQKaW5kZXggMDZmOGY0Ni4uNzljNTMzMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lZGFjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2VkYWMudHh0CkBAIC04MCw3ICs4MCw3IEBACiAKIAlicm9rZW5fcGFyaXR5X3N0YXR1cwogCi1hcyBpcyBsb2NhdGVkIGluIC9zeXMvZGV2aWNlcy9wY2k8WFhYPi8wMDAwOlhYOllZLlogZGlyZWN0b3J5cyBmb3IKK2FzIGlzIGxvY2F0ZWQgaW4gL3N5cy9kZXZpY2VzL3BjaTxYWFg+LzAwMDA6WFg6WVkuWiBkaXJlY3RvcmllcyBmb3IKIFBDSSBkZXZpY2VzLgogCiBGVVRVUkUgSEFSRFdBUkUgU0NBTk5JTkcKQEAgLTI4OCw5ICsyODgsOCBAQAogCiAJJ3VlX25vaW5mb19jb3VudCcKIAotCVRoaXMgYXR0cmlidXRlIGZpbGUgZGlzcGxheXMgdGhlIG51bWJlciBvZiBVRXMgdGhhdAotCWhhdmUgb2NjdXJyZWQgaGF2ZSBvY2N1cnJlZCB3aXRoICBubyBpbmZvcm1hdGlvbnMgYXMgdG8gd2hpY2ggRElNTQotCXNsb3QgaXMgaGF2aW5nIGVycm9ycy4KKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIGRpc3BsYXlzIHRoZSBudW1iZXIgb2YgVUVzIHRoYXQgaGF2ZSBvY2N1cnJlZAorCXdpdGggbm8gaW5mb3JtYXRpb24gYXMgdG8gd2hpY2ggRElNTSBzbG90IGlzIGhhdmluZyBlcnJvcnMuCiAKIAogVG90YWwgQ29ycmVjdGFibGUgRXJyb3JzIGNvdW50IGF0dHJpYnV0ZSBmaWxlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDU5MWU5NDQuLjJhNGQ3NzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTQ4MywzICs0ODMsMTAgQEAKIFdobzoJQWxvayBOIEthdGFyaWEgPGFrYXRhcmlhQHZtd2FyZS5jb20+CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJYWR0NzQ3MyBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlcgorV2hlbjoJRmVicnVhcnkgMjAxMAorV2h5OglPYnNvbGV0ZWQgYnkgdGhlIGFkdDc0NzUgZHJpdmVyLgorV2hvOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8wMC1JTkRFWAppbmRleCBmMTU2MjFlLi43MDAxNzgyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvMDAtSU5ERVgKQEAgLTM2LDYgKzM2LDggQEAKIAktIGluZm8gYWJvdXQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBpbiBMaW51eC4KIGVjcnlwdGZzLnR4dAogCS0gZG9jcyBvbiBlQ3J5cHRmczogc3RhY2tlZCBjcnlwdG9ncmFwaGljIGZpbGVzeXN0ZW0gZm9yIExpbnV4LgorZXhvZnMudHh0CisJLSBpbmZvLCB1c2FnZSwgbW91bnQgb3B0aW9ucywgZGVzaWduIGFib3V0IEVYT0ZTLgogZXh0Mi50eHQKIAktIGluZm8sIG1vdW50IG9wdGlvbnMgYW5kIHNwZWNpZmljYXRpb25zIGZvciB0aGUgRXh0MiBmaWxlc3lzdGVtLgogZXh0My50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXhvZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leG9mcy50eHQKaW5kZXggMGNlZDc0Yy4uYWJkMmE5YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leG9mcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leG9mcy50eHQKQEAgLTYwLDEzICs2MCwxMyBAQAogCiAgICBta2ZzLmV4b2ZzIC0tcGlkPTY1NTM2IC0tZm9ybWF0IC9kZXYvb3NkMAogCi0gICBUaGUgLS1mb3JtYXQgaXMgb3B0aW9uYWwgaWYgbm90IHNwZWNpZmllZCBubyBPU0RfRk9STUFUIHdpbGwgYmUKLSAgIHByZWZvcm1lZCBhbmQgYSBjbGVhbiBmaWxlIHN5c3RlbSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZCBwaWQsCisgICBUaGUgLS1mb3JtYXQgaXMgb3B0aW9uYWwuIElmIG5vdCBzcGVjaWZpZWQsIG5vIE9TRF9GT1JNQVQgd2lsbCBiZQorICAgcGVyZm9ybWVkIGFuZCBhIGNsZWFuIGZpbGUgc3lzdGVtIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgc3BlY2lmaWVkIHBpZCwKICAgIGluIHRoZSBhdmFpbGFibGUgc3BhY2Ugb2YgdGhlIHRhcmdldC4gKFVzZSAtLWZvcm1hdD1zaXplX2luX21lZyB0byBsaW1pdAogICAgdGhlIHRvdGFsIExVTiBzcGFjZSBhdmFpbGFibGUpCiAKLSAgIElmIHBpZCBhbHJlYWR5IGV4aXN0IGl0IHdpbGwgYmUgZGVsZXRlZCBhbmQgYSBuZXcgb25lIHdpbGwgYmUgY3JlYXRlZCBpbiBpdCdzCi0gICBwbGFjZS4gQmUgY2FyZWZ1bC4KKyAgIElmIHBpZCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBkZWxldGVkIGFuZCBhIG5ldyBvbmUgd2lsbCBiZSBjcmVhdGVkIGluCisgICBpdHMgcGxhY2UuIEJlIGNhcmVmdWwuCiAKICAgIEFuIGV4b2ZzIGxpdmVzIGluc2lkZSBhIHNpbmdsZSBPU0QgcGFydGl0aW9uLiBZb3UgY2FuIGNyZWF0ZSBtdWx0aXBsZSBleG9mcwogICAgZmlsZXN5c3RlbXMgb24gdGhlIHNhbWUgZGV2aWNlIHVzaW5nIG11bHRpcGxlIHBpZHMuCkBAIC04MSw3ICs4MSw3IEBACiAKIDcuIEZvciByZWZlcmVuY2UgKFNlZSBkby1leG9mcyBleGFtcGxlIHNjcmlwdCk6CiAJZG8tZXhvZnMgc3RhcnQgLSBhbiBleGFtcGxlIG9mIGhvdyB0byBwZXJmb3JtIHRoZSBhYm92ZSBzdGVwcy4KLQlkby1leG9mcyBzdG9wIC0gIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVubW91bnQgdGhlIGZpbGUgc3lzdGVtLgorCWRvLWV4b2ZzIHN0b3AgLSBhbiBleGFtcGxlIG9mIGhvdyB0byB1bm1vdW50IHRoZSBmaWxlIHN5c3RlbS4KIAlkby1leG9mcyBmb3JtYXQgLSBhbiBleGFtcGxlIG9mIGhvdyB0byBmb3JtYXQgYW5kIG1rZnMgYSBuZXcgZXhvZnMuCiAKIDguIEV4dHJhIGNvbXBpbGF0aW9uIGZsYWdzICh1bmNvbW1lbnQgaW4gZnMvZXhvZnMvS2J1aWxkKToKQEAgLTEwNCw4ICsxMDQsOCBAQAogICAgIGV4b2ZzIHNwZWNpZmljIG9wdGlvbnM6IE9wdGlvbnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMgKCwpCiAJCXBpZD08aW50ZWdlcj4gLSBUaGUgcGFydGl0aW9uIG51bWJlciB0byBtb3VudC9jcmVhdGUgYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyIG9mIHRoZSBmaWxlc3lzdGVtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkKLSAgICAgICAgICAgICAgICB0bz08aW50ZWdlcj4gIC0gVGltZW91dCBpbiB0aWNrcyBmb3IgYSBzaW5nbGUgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkuCisgICAgICAgICAgICAgICAgdG89PGludGVnZXI+ICAtIFRpbWVvdXQgaW4gdGlja3MgZm9yIGEgc2luZ2xlIGNvbW1hbmQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgKDYwICogSFopIFtmb3IgZGVidWdnaW5nIG9ubHldCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTExNiw3ICsxMTYsNyBAQAogICB3aXRoIGEgc3BlY2lhbCBJRCAoZGVmaW5lZCBpbiBjb21tb24uaCkuCiAgIEluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZSBmaWxlIHN5c3RlbSBjb250cm9sIGJsb2NrIGlzIHVzZWQgdG8gZmlsbCB0aGUKICAgaW4tbWVtb3J5IHN1cGVyYmxvY2sgc3RydWN0dXJlIGF0IG1vdW50IHRpbWUuIFRoaXMgb2JqZWN0IGlzIGNyZWF0ZWQgYmVmb3JlCi0gIHRoZSBmaWxlIHN5c3RlbSBpcyB1c2VkIGJ5IG1rZXhvZnMuYyBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBzdWNoIGFzOgorICB0aGUgZmlsZSBzeXN0ZW0gaXMgdXNlZCBieSBta2V4b2ZzLmMuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIHN1Y2ggYXM6CiAJLSBUaGUgZmlsZSBzeXN0ZW0ncyBtYWdpYyBudW1iZXIKIAktIFRoZSBuZXh0IGlub2RlIG51bWJlciB0byBiZSBhbGxvY2F0ZWQKIApAQCAtMTM0LDggKzEzNCw4IEBACiAgIGF0dHJpYnV0ZXMuIFRoaXMgYXBwbGllcyB0byBib3RoIHJlZ3VsYXIgZmlsZXMgYW5kIG90aGVyIHR5cGVzIChkaXJlY3RvcmllcywKICAgZGV2aWNlIGZpbGVzLCBzeW1saW5rcywgZXRjLikuCiAKLSogQ3JlZGVudGlhbHMgYXJlIGdlbmVyYXRlZCBwZXIgb2JqZWN0IChpbm9kZSBhbmQgc3VwZXJibG9jaykgd2hlbiB0aGV5IGlzCi0gIGNyZWF0ZWQgaW4gbWVtb3J5IChyZWFkIG9mZiBkaXNrIG9yIGNyZWF0ZWQpLiBUaGUgY3JlZGVudGlhbCB3b3JrcyBmb3IgYWxsCisqIENyZWRlbnRpYWxzIGFyZSBnZW5lcmF0ZWQgcGVyIG9iamVjdCAoaW5vZGUgYW5kIHN1cGVyYmxvY2spIHdoZW4gdGhleSBhcmUKKyAgY3JlYXRlZCBpbiBtZW1vcnkgKHJlYWQgZnJvbSBkaXNrIG9yIGNyZWF0ZWQpLiBUaGUgY3JlZGVudGlhbCB3b3JrcyBmb3IgYWxsCiAgIG9wZXJhdGlvbnMgYW5kIGlzIHVzZWQgYXMgbG9uZyBhcyB0aGUgb2JqZWN0IHJlbWFpbnMgaW4gbWVtb3J5LgogCiAqIEFzeW5jIE9TRCBvcGVyYXRpb25zIGFyZSB1c2VkIHdoZW5ldmVyIHBvc3NpYmxlLCBidXQgdGhlIHRhcmdldCBtYXkgZXhlY3V0ZQpAQCAtMTQ1LDcgKzE0NSw4IEBACiAgIGZyb20gZXhlY3V0aW5nIGluIHJldmVyc2Ugb3JkZXI6CiAJLSBUaGUgZm9sbG93aW5nIGFyZSBoYW5kbGVkIHdpdGggdGhlIE9CSl9DUkVBVEVEIGFuZCBPQkpfMkJDUkVBVEVECiAJICBmbGFncy4gT0JKX0NSRUFURUQgaXMgc2V0IHdoZW4gd2Uga25vdyB0aGUgb2JqZWN0IGV4aXN0cyBvbiB0aGUgT1NEIC0KLQkgIGluIGNyZWF0ZSdzIGNhbGxiYWNrIGZ1bmN0aW9uLCBhbmQgd2hlbiB3ZSBzdWNjZXNzZnVsbHkgZG8gYSByZWFkX2lub2RlLgorCSAgaW4gY3JlYXRlJ3MgY2FsbGJhY2sgZnVuY3Rpb24sIGFuZCB3aGVuIHdlIHN1Y2Nlc3NmdWxseSBkbyBhCisJICByZWFkX2lub2RlLgogCSAgT0JKXzJCQ1JFQVRFRCBpcyBzZXQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3JlYXRlIGZ1bmN0aW9uLCBzbyB3ZQogCSAga25vdyB0aGF0IHdlIHNob3VsZCB3YWl0LgogCQktIGNyZWF0ZS9kZWxldGU6IGRlbGV0ZSBzaG91bGQgd2FpdCB1bnRpbCB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CmluZGV4IDZkOTRlMDYuLmFmNjg4NWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dApAQCAtMTUzLDggKzE1Myw4IEBACiAJCQlpZGVudGlmaWVkIHRocm91Z2ggaXRzIG5ldyBtYWpvci9taW5vciBudW1iZXJzIGVuY29kZWQKIAkJCWluIGRldm51bS4KIAotbm9sb2FkCQkJRG9uJ3QgbG9hZCB0aGUgam91cm5hbCBvbiBtb3VudGluZy4gIE5vdGUgdGhhdAotICAgICAgICAgICAgICAgICAgICAgCWlmIHRoZSBmaWxlc3lzdGVtIHdhcyBub3QgdW5tb3VudGVkIGNsZWFubHksCitub3JlY292ZXJ5CQlEb24ndCBsb2FkIHRoZSBqb3VybmFsIG9uIG1vdW50aW5nLiAgTm90ZSB0aGF0Citub2xvYWQJCQlpZiB0aGUgZmlsZXN5c3RlbSB3YXMgbm90IHVubW91bnRlZCBjbGVhbmx5LAogICAgICAgICAgICAgICAgICAgICAgCXNraXBwaW5nIHRoZSBqb3VybmFsIHJlcGxheSB3aWxsIGxlYWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAJZmlsZXN5c3RlbSBjb250YWluaW5nIGluY29uc2lzdGVuY2llcyB0aGF0IGNhbgogICAgICAgICAgICAgICAgICAgICAgCWxlYWQgdG8gYW55IG51bWJlciBvZiBwcm9ibGVtcy4KQEAgLTM1Myw2ICszNTMsMTIgQEAKIAkJCXN5c3RlbSBjcmFzaGVzIGJlZm9yZSB0aGUgZGVsYXllZCBhbGxvY2F0aW9uCiAJCQlibG9ja3MgYXJlIGZvcmNlZCB0byBkaXNrLgogCitkaXNjYXJkCQlDb250cm9scyB3aGV0aGVyIGV4dDQgc2hvdWxkIGlzc3VlIGRpc2NhcmQvVFJJTQorbm9kaXNjYXJkKCopCQljb21tYW5kcyB0byB0aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2Ugd2hlbgorCQkJYmxvY2tzIGFyZSBmcmVlZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBTU0QgZGV2aWNlcworCQkJYW5kIHNwYXJzZS90aGlubHktcHJvdmlzaW9uZWQgTFVOcywgYnV0IGl0IGlzIG9mZgorCQkJYnkgZGVmYXVsdCB1bnRpbCBzdWZmaWNpZW50IHRlc3RpbmcgaGFzIGJlZW4gZG9uZS4KKwogRGF0YSBNb2RlCiA9PT09PT09PT0KIFRoZXJlIGFyZSAzIGRpZmZlcmVudCBkYXRhIG1vZGVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggNGFmMDAxOC4uOTRiOWYyMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0xMDg5LDggKzEwODksOCBAQAogaW5jbHVkZXMgKGJ1dCAgaXMgbm90IGxpbWl0ZWQgIHRvKSB0aG9zZSAgY3JlYXRlZCBieSAgY2FsbHMgdG8gdGhlICBmb3JrKCkgYW5kCiBjbG9uZSgpIHN5c3RlbSBjYWxscy4KIAotVGhlICAicHJvY3NfcnVubmluZyIgbGluZSBnaXZlcyB0aGUgIG51bWJlciBvZiBwcm9jZXNzZXMgIGN1cnJlbnRseSBydW5uaW5nIG9uCi1DUFVzLgorVGhlICJwcm9jc19ydW5uaW5nIiBsaW5lIGdpdmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IGFyZQorcnVubmluZyBvciByZWFkeSB0byBydW4gKGkuZS4sIHRoZSB0b3RhbCBudW1iZXIgb2YgcnVubmFibGUgdGhyZWFkcykuCiAKIFRoZSAgICJwcm9jc19ibG9ja2VkIiBsaW5lIGdpdmVzICB0aGUgIG51bWJlciBvZiAgcHJvY2Vzc2VzIGN1cnJlbnRseSBibG9ja2VkLAogd2FpdGluZyBmb3IgSS9PIHRvIGNvbXBsZXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZ3Bpby50eHQKaW5kZXggZmE0ZGMwNy4uZTRlN2RhZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2dwaW8udHh0CkBAIC0zODAsNyArMzgwLDcgQEAKIAogTW9zdCBvZnRlbiBhIGdwaW9fY2hpcCBpcyBwYXJ0IG9mIGFuIGluc3RhbmNlLXNwZWNpZmljIHN0cnVjdHVyZSB3aXRoIHN0YXRlCiBub3QgZXhwb3NlZCBieSB0aGUgR1BJTyBpbnRlcmZhY2VzLCBzdWNoIGFzIGFkZHJlc3NpbmcsIHBvd2VyIG1hbmFnZW1lbnQsCi1hbmQgbW9yZS4gIENoaXBzIHN1Y2ggYXMgY29kZWNzIHdpbGwgaGF2ZSBjb21wbGV4IG5vbi1HUElPIHN0YXRlLAorYW5kIG1vcmUuICBDaGlwcyBzdWNoIGFzIGNvZGVjcyB3aWxsIGhhdmUgY29tcGxleCBub24tR1BJTyBzdGF0ZS4KIAogQW55IGRlYnVnZnMgZHVtcCBtZXRob2Qgc2hvdWxkIG5vcm1hbGx5IGlnbm9yZSBzaWduYWxzIHdoaWNoIGhhdmVuJ3QgYmVlbgogcmVxdWVzdGVkIGFzIEdQSU9zLiAgVGhleSBjYW4gdXNlIGdwaW9jaGlwX2lzX3JlcXVlc3RlZCgpLCB3aGljaCByZXR1cm5zCkBAIC01MzEsNyArNTMxLDcgQEAKIAkJVGhpcyBmaWxlIGV4aXN0cyBvbmx5IGlmIHRoZSBwaW4gY2FuIGJlIGNvbmZpZ3VyZWQgYXMgYW4KIAkJaW50ZXJydXB0IGdlbmVyYXRpbmcgaW5wdXQgcGluLgogCi1HUElPIGNvbnRyb2xsZXJzIGhhdmUgcGF0aHMgbGlrZSAvc3lzL2NsYXNzL2dwaW8vY2hpcGNoaXA0Mi8gKGZvciB0aGUKK0dQSU8gY29udHJvbGxlcnMgaGF2ZSBwYXRocyBsaWtlIC9zeXMvY2xhc3MvZ3Bpby9ncGlvY2hpcDQyLyAoZm9yIHRoZQogY29udHJvbGxlciBpbXBsZW1lbnRpbmcgR1BJT3Mgc3RhcnRpbmcgYXQgIzQyKSBhbmQgaGF2ZSB0aGUgZm9sbG93aW5nCiByZWFkLW9ubHkgYXR0cmlidXRlczoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDczIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDczCmluZGV4IDFjYmY2NzEuLjQ0NjYxMmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzMKQEAgLTksNiArOSw4IEBACiAKIEF1dGhvcjogRGFycmljayBKLiBXb25nCiAKK1RoaXMgZHJpdmVyIGlzIGRlcHJlYWN0ZWQsIHBsZWFzZSB1c2UgdGhlIGFkdDc0NzUgZHJpdmVyIGluc3RlYWQuCisKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzUKaW5kZXggYTJiMWFiZS4uMDUwMmYyYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDc1CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3NQpAQCAtMSw4NyArMSwxMTcgQEAKLVRoaXMgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBBRFQ3NDc1IGRyaXZlcjoKK0tlcm5lbCBkcml2ZXIgYWR0NzQ3NQorPT09PT09PT09PT09PT09PT09PT09CiAKLSh0aGVyZSBhcmUgNCBmYW5zLCBudW1iZXJlZCBmYW4xIHRvIGZhbjQpOgorU3VwcG9ydGVkIGNoaXBzOgorICAqIEFuYWxvZyBEZXZpY2VzIEFEVDc0NzMKKyAgICBQcmVmaXg6ICdhZHQ3NDczJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyQywgMHgyRCwgMHgyRQorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBPbiBTZW1pY29uZHVjdG9ycyB3ZWJzaXRlCisgICogQW5hbG9nIERldmljZXMgQURUNzQ3NQorICAgIFByZWZpeDogJ2FkdDc0NzUnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDJFCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIE9uIFNlbWljb25kdWN0b3JzIHdlYnNpdGUKKyAgKiBBbmFsb2cgRGV2aWNlcyBBRFQ3NDc2CisgICAgUHJlZml4OiAnYWR0NzQ3NicKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MkMsIDB4MkQsIDB4MkUKKyAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCB0aGUgT24gU2VtaWNvbmR1Y3RvcnMgd2Vic2l0ZQorICAqIEFuYWxvZyBEZXZpY2VzIEFEVDc0OTAKKyAgICBQcmVmaXg6ICdhZHQ3NDkwJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyQywgMHgyRCwgMHgyRQorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBPbiBTZW1pY29uZHVjdG9ycyB3ZWJzaXRlCiAKLWZhblhfaW5wdXQJCVJlYWQgdGhlIGN1cnJlbnQgc3BlZWQgb2YgdGhlIGZhbiAoaW4gUlBNcykKLWZhblhfbWluCQlSZWFkL3dyaXRlIHRoZSBtaW5pbXVtIHNwZWVkIG9mIHRoZSBmYW4uICBEcm9wcGluZwotCQkJYmVsb3cgdGhpcyBzZXRzIGFuIGFsYXJtLgorQXV0aG9yczoKKwlKb3JkYW4gQ3JvdXNlCisJSGFucyBkZSBHb2VkZQorCURhcnJpY2sgSi4gV29uZyAoZG9jdW1lbnRhdGlvbikKKwlKZWFuIERlbHZhcmUKIAotKHRoZXJlIGFyZSB0aHJlZSBQV01zLCBudW1iZXJlZCBwd20xIHRvIHB3bTMpOgogCi1wd21YCQkJUmVhZC93cml0ZSB0aGUgY3VycmVudCBkdXR5IGN5Y2xlIG9mIHRoZSBQV00uICBXcml0ZXMKLQkJCW9ubHkgaGF2ZSBlZmZlY3Qgd2hlbiBhdXRvIG1vZGUgaXMgdHVybmVkIG9mZiAoc2VlCi0JCQliZWxvdykuICBSYW5nZSBpcyAwIC0gMjU1LgorRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCiAKLXB3bVhfZW5hYmxlCQlGYW4gc3BlZWQgY29udHJvbCBtZXRob2Q6CitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBBbmFsb2cgRGV2aWNlcyBBRFQ3NDczLCBBRFQ3NDc1LAorQURUNzQ3NiBhbmQgQURUNzQ5MCBjaGlwIGZhbWlseS4gVGhlIEFEVDc0NzMgYW5kIEFEVDc0NzUgZGlmZmVyIG9ubHkgaW4KK21pbm9yIGRldGFpbHMuIFRoZSBBRFQ3NDc2IGhhcyBhZGRpdGlvbmFsIGZlYXR1cmVzLCBpbmNsdWRpbmcgZXh0cmEgdm9sdGFnZQorbWVhc3VyZW1lbnQgaW5wdXRzIGFuZCBWSUQgc3VwcG9ydC4gVGhlIEFEVDc0OTAgYWxzbyBoYXMgYWRkaXRpb25hbAorZmVhdHVyZXMsIGluY2x1ZGluZyBleHRyYSB2b2x0YWdlIG1lYXN1cmVtZW50IGlucHV0cyBhbmQgUEVDSSBzdXBwb3J0LiBBbGwKK3RoZSBzdXBwb3J0ZWQgY2hpcHMgd2lsbCBiZSBjb2xsZWN0aXZlbHkgZGVzaWduZWQgYnkgdGhlIG5hbWUgIkFEVDc0N3giIGluCit0aGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50LgogCi0JCQkwIC0gTm8gY29udHJvbCAoZmFuIGF0IGZ1bGwgc3BlZWQpCi0JCQkxIC0gTWFudWFsIGZhbiBzcGVlZCBjb250cm9sICh1c2luZyBwd21bMS0qXSkKLQkJCTIgLSBBdXRvbWF0aWMgZmFuIHNwZWVkIGNvbnRyb2wKK1RoZSBBRFQ3NDd4IHVzZXMgdGhlIDItd2lyZSBpbnRlcmZhY2UgY29tcGF0aWJsZSB3aXRoIHRoZSBTTUJ1cyAyLjAKK3NwZWNpZmljYXRpb24uIFVzaW5nIGFuIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRlciBpdCBtZWFzdXJlcyB0aHJlZSAoMykKK3RlbXBlcmF0dXJlcyBhbmQgdHdvICgyKSBvciBtb3JlIHZvbHRhZ2VzLiBJdCBoYXMgZm91ciAoNCkgMTYtYml0IGNvdW50ZXJzCitmb3IgbWVhc3VyaW5nIGZhbiBzcGVlZC4gVGhlcmUgYXJlIHRocmVlICgzKSBQV00gb3V0cHV0cyB0aGF0IGNhbiBiZSB1c2VkCit0byBjb250cm9sIGZhbiBzcGVlZC4KIAotcHdtWF9hdXRvX2NoYW5uZWxzX3RlbXAJU2VsZWN0IHdoaWNoIGNoYW5uZWxzIGFmZmVjdCB0aGlzIFBXTQorQSBzb3BoaXN0aWNhdGVkIGNvbnRyb2wgc3lzdGVtIGZvciB0aGUgUFdNIG91dHB1dHMgaXMgZGVzaWduZWQgaW50byB0aGUKK0FEVDc0N3ggdGhhdCBhbGxvd3MgZmFuIHNwZWVkIHRvIGJlIGFkanVzdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gYW55IG9mIHRoZQordGhyZWUgdGVtcGVyYXR1cmUgc2Vuc29ycy4gRWFjaCBQV00gb3V0cHV0IGlzIGluZGl2aWR1YWxseSBhZGp1c3RhYmxlIGFuZAorcHJvZ3JhbW1hYmxlLiBPbmNlIGNvbmZpZ3VyZWQsIHRoZSBBRFQ3NDd4IHdpbGwgYWRqdXN0IHRoZSBQV00gb3V0cHV0cyBpbgorcmVzcG9uc2UgdG8gdGhlIG1lYXN1cmVkIHRlbXBlcmF0dXJlcyB3aXRob3V0IGZ1cnRoZXIgaG9zdCBpbnRlcnZlbnRpb24uCitUaGlzIGZlYXR1cmUgY2FuIGFsc28gYmUgZGlzYWJsZWQgZm9yIG1hbnVhbCBjb250cm9sIG9mIHRoZSBQV00ncy4KIAotCQkJMSAtIFRFTVAxIGNvbnRyb2xzIFBXTQotCQkJMiAtIFRFTVAyIGNvbnRyb2xzIFBXTQotCQkJNCAtIFRFTVAzIGNvbnRyb2xzIFBXTQotCQkJNiAtIFRFTVAyIGFuZCBURU1QMyBjb250cm9sIFBXTQotCQkJNyAtIEFsbCB0aHJlZSBpbnB1dHMgY29udHJvbCBQV00KK0VhY2ggb2YgdGhlIG1lYXN1cmVkIGlucHV0cyAodm9sdGFnZSwgdGVtcGVyYXR1cmUsIGZhbiBzcGVlZCkgaGFzCitjb3JyZXNwb25kaW5nIGhpZ2gvbG93IGxpbWl0IHZhbHVlcy4gVGhlIEFEVDc0N3ggd2lsbCBzaWduYWwgYW4gQUxBUk0gaWYKK2FueSBtZWFzdXJlZCB2YWx1ZSBleGNlZWRzIGVpdGhlciBsaW1pdC4KIAotcHdtWF9mcmVxCQlSZWFkL3dyaXRlIHRoZSBQV00gZnJlcXVlbmN5IGluIEh6LiBUaGUgbnVtYmVyCi0JCQlzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CitUaGUgQURUNzQ3eCBzYW1wbGVzIGFsbCBpbnB1dHMgY29udGludW91c2x5LiBUaGUgZHJpdmVyIHdpbGwgbm90IHJlYWQKK3RoZSByZWdpc3RlcnMgbW9yZSBvZnRlbiB0aGFuIG9uY2UgZXZlcnkgb3RoZXIgc2Vjb25kLiBGdXJ0aGVyLAorY29uZmlndXJhdGlvbiBkYXRhIGlzIG9ubHkgcmVhZCBvbmNlIHBlciBtaW51dGUuCiAKLQkJCTExIEh6Ci0JCQkxNCBIegotCQkJMjIgSHoKLQkJCTI5IEh6Ci0JCQkzNSBIegotCQkJNDQgSHoKLQkJCTU4IEh6Ci0JCQk4OCBIegorQ2hpcCBEaWZmZXJlbmNlcyBTdW1tYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotcHdtWF9hdXRvX3BvaW50MV9wd20JUmVhZC93cml0ZSB0aGUgbWluaW11bSBQV00gZHV0eSBjeWNsZSBpbiBhdXRvbWF0aWMgbW9kZQorQURUNzQ3MzoKKyAgKiAyIHZvbHRhZ2UgaW5wdXRzCisgICogc3lzdGVtIGFjb3VzdGljcyBvcHRpbWl6YXRpb25zIChub3QgaW1wbGVtZW50ZWQpCiAKLXB3bVhfYXV0b19wb2ludDJfcHdtCVJlYWQvd3JpdGUgdGhlIG1heGltdW0gUFdNIGR1dHkgY3ljbGUgaW4gYXV0b21hdGljIG1vZGUKK0FEVDc0NzU6CisgICogMiB2b2x0YWdlIGlucHV0cwogCi0odGhlcmUgYXJlIHRocmVlIHRlbXBlcmF0dXJlIHNldHRpbmdzIG51bWJlcmVkIHRlbXAxIHRvIHRlbXAzKToKK0FEVDc0NzY6CisgICogNSB2b2x0YWdlIGlucHV0cworICAqIFZJRCBzdXBwb3J0CiAKLXRlbXBYX2lucHV0CQlSZWFkIHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlLiAgVGhlIHZhbHVlIGlzIGluIG1pbGxpCi0JCQlkZWdyZWVzIG9mIENlbHNpdXMuCitBRFQ3NDkwOgorICAqIDYgdm9sdGFnZSBpbnB1dHMKKyAgKiAxIEltb24gaW5wdXQgKG5vdCBpbXBsZW1lbnRlZCkKKyAgKiBQRUNJIHN1cHBvcnQgKG5vdCBpbXBsZW1lbnRlZCkKKyAgKiAyIEdQSU8gcGlucyAobm90IGltcGxlbWVudGVkKQorICAqIHN5c3RlbSBhY291c3RpY3Mgb3B0aW1pemF0aW9ucyAobm90IGltcGxlbWVudGVkKQogCi10ZW1wWF9tYXgJCVJlYWQvd3JpdGUgdGhlIHVwcGVyIHRlbXBlcmF0dXJlIGxpbWl0IC0gZXhjZWVkaW5nIHRoaXMKLQkJCXdpbGwgY2F1c2UgYW4gYWxhcm0uCitTcGVjaWFsIEZlYXR1cmVzCistLS0tLS0tLS0tLS0tLS0tCiAKLXRlbXBYX21pbgkJUmVhZC93cml0ZSB0aGUgbG93ZXIgdGVtcGVyYXR1cmUgbGltaXQgLSBleGNlZWRpbmcgdGhpcwotCQkJd2lsbCBjYXVzZSBhbiBhbGFybS4KK1RoZSBBRFQ3NDd4IGhhcyBhIDEwLWJpdCBBREMgYW5kIGNhbiB0aGVyZWZvcmUgbWVhc3VyZSB0ZW1wZXJhdHVyZXMKK3dpdGggYSByZXNvbHV0aW9uIG9mIDAuMjUgZGVncmVlIENlbHNpdXMuIFRlbXBlcmF0dXJlIHJlYWRpbmdzIGNhbiBiZQorY29uZmlndXJlZCBlaXRoZXIgZm9yIHR3bydzIGNvbXBsZW1lbnQgZm9ybWF0IG9yICJPZmZzZXQgNjQiIGZvcm1hdCwKK3doZXJlaW4gNjQgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSByYXcgdmFsdWUgdG8gZ2V0IHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZS4KIAotdGVtcFhfb2Zmc2V0CQlSZWFkL3dyaXRlIHRoZSB0ZW1wZXJhdHVyZSBhZGp1c3RtZW50IG9mZnNldAorVGhlIGRhdGFzaGVldCBpcyB2ZXJ5IGRldGFpbGVkIGFuZCBkZXNjcmliZXMgYSBwcm9jZWR1cmUgZm9yIGRldGVybWluaW5nCithbiBvcHRpbWFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhdXRvbWF0aWMgUFdNIGNvbnRyb2wuCiAKLXRlbXBYX2NyaXQJCVJlYWQvd3JpdGUgdGhlIFRIRVJNIGxpbWl0IGZvciByZW1vdGUxLgorRmFuIFNwZWVkIENvbnRyb2wKKy0tLS0tLS0tLS0tLS0tLS0tCiAKLXRlbXBYX2NyaXRfaHlzdAkJU2V0IHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBiZWxvdyBjcml0IHdoZXJlIHRoZQotCQkJZmFucyB3aWxsIHN0YXkgb24gLSB0aGlzIGhlbHBzIGRyaXZlIHRoZSB0ZW1wZXJhdHVyZQotCQkJbG93IGVub3VnaCBzbyBpdCBkb2Vzbid0IHN0YXkgbmVhciB0aGUgZWRnZSBhbmQKLQkJCWNhdXNlIFRIRVJNIHRvIGtlZXAgdHJpcHBpbmcuCitUaGUgZHJpdmVyIGV4cG9zZXMgdHdvIHRyaXAgcG9pbnRzIHBlciBQV00gY2hhbm5lbC4KIAotdGVtcFhfYXV0b19wb2ludDFfdGVtcAlSZWFkL3dyaXRlIHRoZSBtaW5pbXVtIHRlbXBlcmF0dXJlIHdoZXJlIHRoZSBmYW5zIHdpbGwKLQkJCXR1cm4gb24gaW4gYXV0b21hdGljIG1vZGUuCitwb2ludDE6IFNldCB0aGUgUFdNIHNwZWVkIGF0IHRoZSBsb3dlciB0ZW1wZXJhdHVyZSBib3VuZAorcG9pbnQyOiBTZXQgdGhlIFBXTSBzcGVlZCBhdCB0aGUgaGlnaGVyIHRlbXBlcmF0dXJlIGJvdW5kCiAKLXRlbXBYX2F1dG9fcG9pbnQyX3RlbXAJUmVhZC93cml0ZSB0aGUgbWF4aW11bSB0ZW1wZXJhdHVyZSBvdmVyIHdoaWNoIHRoZSBmYW5zCi0JCQl3aWxsIHJ1biBpbiBhdXRvbWF0aWMgbW9kZS4gIHRlbXBYX2F1dG9fcG9pbnQxX3RlbXAKLQkJCWFuZCB0ZW1wWF9hdXRvX3BvaW50Ml90ZW1wIHRvZ2V0aGVyIGRlZmluZSB0aGUKLQkJCXJhbmdlIG9mIGF1dG9tYXRpYyBjb250cm9sLgorVGhlIEFEVDc0N3ggd2lsbCBzY2FsZSB0aGUgUFdNIGxpbmVhcmx5IGJldHdlZW4gdGhlIGxvd2VyIGFuZCBoaWdoZXIgUFdNCitzcGVlZCB3aGVuIHRoZSB0ZW1wZXJhdHVyZSBpcyBiZXR3ZWVuIHRoZSB0d28gdGVtcGVyYXR1cmUgYm91bmRhcmllcy4KK1RlbXBlcmF0dXJlIGJvdW5kYXJpZXMgYXJlIGFzc29jaWF0ZWQgdG8gdGVtcGVyYXR1cmUgY2hhbm5lbHMgcmF0aGVyIHRoYW4KK1BXTSBvdXRwdXRzLCBhbmQgYSBnaXZlbiBQV00gb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIGJ5IHNldmVyYWwgdGVtcGVyYXR1cmUKK2NoYW5uZWxzLiBBcyBhIHJlc3VsdCwgdGhlIEFEVDc0N3ggbWF5IGNvbXB1dGUgbW9yZSB0aGFuIG9uZSBQV00gdmFsdWUKK2ZvciBhIGNoYW5uZWwgYXQgYSBnaXZlbiB0aW1lLCBpbiB3aGljaCBjYXNlIHRoZSBtYXhpbXVtIHZhbHVlIChmYXN0ZXN0CitmYW4gc3BlZWQpIGlzIGFwcGxpZWQuIFBXTSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChvZmYpIHRvIDI1NSAoZnVsbCBzcGVlZCkuCiAKLXRlbXBYX2FsYXJtCQlSZWFkIGEgMSBpZiB0aGUgbWF4L21pbiBhbGFybSBpcyBzZXQKLXRlbXBYX2ZhdWx0CQlSZWFkIGEgMSBpZiBlaXRoZXIgdGVtcDEgb3IgdGVtcDMgZGlvZGUgaGFzIGEgZmF1bHQKK0ZhbiBzcGVlZCBtYXkgYmUgc2V0IHRvIG1heGltdW0gd2hlbiB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yIGFzc29jaWF0ZWQgd2l0aAordGhlIFBXTSBjb250cm9sIGV4Y2VlZHMgdGVtcCNfbWF4LgogCi0oVGhlcmUgYXJlIHR3byB2b2x0YWdlIHNldHRpbmdzLCBpbjEgYW5kIGluMik6CitOb3RlcworLS0tLS0KIAotaW5YX2lucHV0CQlSZWFkIHRoZSBjdXJyZW50IHZvbHRhZ2Ugb24gVkNDLiAgVmFsdWUgaXMgaW4KLQkJCW1pbGxpdm9sdHMuCi0KLWluWF9taW4JCQlyZWFkL3dyaXRlIHRoZSBtaW5pbXVtIHZvbHRhZ2UgbGltaXQuCi0JCQlEcm9wcGluZyBiZWxvdyB0aGlzIGNhdXNlcyBhbiBhbGFybS4KLQotaW5YX21heAkJCXJlYWQvd3JpdGUgdGhlIG1heGltdW0gdm9sdGFnZSBsaW1pdC4KLQkJCUV4Y2VlZGluZyB0aGlzIGNhdXNlcyBhbiBhbGFybS4KLQotaW5YX2FsYXJtCQlSZWFkIGEgMSBpZiB0aGUgbWF4L21pbiBhbGFybSBpcyBzZXQuCitUaGUgblZpZGlhIGJpbmFyeSBkcml2ZXIgcHJlc2VudHMgYW4gQURUNzQ3MyBjaGlwIHZpYSBhbiBvbi1jYXJkIGkyYyBidXMuCitVbmZvcnR1bmF0ZWx5LCB0aGV5IGZhaWwgdG8gc2V0IHRoZSBpMmMgYWRhcHRlciBjbGFzcywgc28gdGhpcyBkcml2ZXIgbWF5CitmYWlsIHRvIGZpbmQgdGhlIGNoaXAgdW50aWwgdGhlIG52aWRpYSBkcml2ZXIgaXMgcGF0Y2hlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnCmluZGV4IGJlZTRjMzAuLmE3OTUyYzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4ODJmZwpAQCAtMTQsNiArMTQsMTAgQEAKICAgICBQcmVmaXg6ICdmNzE4ODJmZycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZSwgYWRkcmVzcyByZWFkIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZQogICAgIERhdGFzaGVldDogQXZhaWxhYmxlIGZyb20gdGhlIEZpbnRlayB3ZWJzaXRlCisgICogRmludGVrIEY3MTg4OUZHCisgICAgUHJlZml4OiAnZjcxODg5ZmcnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKKyAgICBEYXRhc2hlZXQ6IFNob3VsZCBiZWNvbWUgYXZhaWxhYmxlIG9uIHRoZSBGaW50ZWsgd2Vic2l0ZSBzb29uCiAgICogRmludGVrIEY4MDAwCiAgICAgUHJlZml4OiAnZjgwMDAnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKQEAgLTUxLDYgKzU1LDEyIEBACiBtb3RoZXJib2FyZCwgc28gdGhlIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhlIEJJT1Mgc2V0IHRoZSBtZXRob2QKIHByb3Blcmx5LgogCitOb3RlIHRoYXQgdGhlIGxvd2VzdCBudW1iZXJlZCB0ZW1wZXJhdHVyZSB6b25lIHRyaXAgcG9pbnQgY29ycmVzcG9uZHMgdG8KK3RvIHRoZSBib3JkZXIgYmV0d2VlbiB0aGUgaGlnaGVzdCBhbmQgb25lIGJ1dCBoaWdoZXN0IHRlbXBlcmF0dXJlIHpvbmVzLCBhbmQKK3ZpY2EgdmVyc2EuIFNvIHRoZSB0ZW1wZXJhdHVyZSB6b25lIHRyaXAgcG9pbnRzIDEtNCAob3IgMS0yKSBnbyBmcm9tIGhpZ2ggdGVtcAordG8gbG93IHRlbXAhIFRoaXMgaXMgaG93IHRoaW5ncyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIElDLCBhbmQgdGhlIGRyaXZlcgorbWltaWNrcyB0aGlzLgorCiBUaGVyZSBhcmUgMiBtb2RlcyB0byBzcGVjaWZ5IHRoZSBzcGVlZCBvZiB0aGUgZmFuLCBQV00gZHV0eSBjeWNsZSAob3IgREMKIHZvbHRhZ2UpIG1vZGUsIHdoZXJlIDAtMTAwJSBkdXR5IGN5Y2xlICgwLTEwMCUgb2YgMTJWKSBpcyBzcGVjaWZpZWQuIEFuZCBSUE0KIG1vZGUgd2hlcmUgdGhlIGFjdHVhbCBSUE0gb2YgdGhlIGZhbiAoYXMgbWVhc3VyZWQpIGlzIGNvbnRyb2xsZWQgYW5kIHRoZSBzcGVlZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3IGIvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CmluZGV4IDY1OTMxNWQuLmY5YmE5NmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKQEAgLTg2LDcgKzg2LDYgQEAKIHRoZSBWY29yZSB2b2x0YWdlIG9mIHRoZSBwcm9jZXNzb3IuIFRoZSBlYXJseSBJVDg3MTJGIGhhdmUgNSBWSUQgcGlucywKIHRoZSBJVDg3MTZGIGFuZCBsYXRlIElUODcxMkYgaGF2ZSA2LiBUaGV5IGFyZSBzaGFyZWQgd2l0aCBvdGhlciBmdW5jdGlvbnMKIHRob3VnaCwgc28gdGhlIGZ1bmN0aW9uYWxpdHkgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYSBnaXZlbiBzeXN0ZW0uCi1UaGUgZHJpdmVyIGR1bWJseSBhc3N1bWUgaXQgaXMgdGhlcmUuCiAKIFRoZSBJVDg3MThGIGFuZCBJVDg3MjBGIGFsc28gZmVhdHVyZXMgVklEIGlucHV0cyAodXAgdG8gOCBwaW5zKSBidXQgdGhlIHZhbHVlCiBpcyBzdG9yZWQgaW4gdGhlIFN1cGVyLUkvTyBjb25maWd1cmF0aW9uIHNwYWNlLiBEdWUgdG8gdGVjaG5pY2FsIGxpbWl0YXRpb25zLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9tYzEzNzgzLWFkYyBiL0RvY3VtZW50YXRpb24vaHdtb24vbWMxMzc4My1hZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0NTMxYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbWMxMzc4My1hZGMKQEAgLTAsMCArMSw1MCBAQAorS2VybmVsIGRyaXZlciBtYzEzNzgzLWFkYworPT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogRnJlZXNjYWxlIEF0bGFzIE1DMTM3ODMKKyAgICBQcmVmaXg6ICdtYzEzNzgzX2FkYycKKyAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cuZnJlZXNjYWxlLmNvbS9maWxlcy9yZl9pZi9kb2MvZGF0YV9zaGVldC9NQzEzNzgzLnBkZj9mc3JjaD0xCisKK0F1dGhvcnM6CisgICAgU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgorICAgIEx1b3RhbyBGdSA8bC5mdUBwZW5ndXRyb25peC5kZT4KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBGcmVlc2NhbGUgTUMxMzc4MyBpcyBhIFBvd2VyIE1hbmFnZW1lbnQgYW5kIEF1ZGlvIENpcmN1aXQuIEFtb25nCitvdGhlciB0aGluZ3MgaXQgY29udGFpbnMgYSAxMC1iaXQgQS9EIGNvbnZlcnRlci4gVGhlIGNvbnZlcnRlciBoYXMgMTYKK2NoYW5uZWxzIHdoaWNoIGNhbiBiZSB1c2VkIGluIGRpZmZlcmVudCBtb2Rlcy4KK1RoZSBBL0QgY29udmVydGVyIGhhcyBhIHJlc29sdXRpb24gb2YgMi4yNW1WLiBDaGFubmVscyAwLTQgaGF2ZQorYSBkZWRpY2F0ZWQgbWVhbmluZyB3aXRoIGNoaXAgaW50ZXJuYWwgc2NhbGluZyBhcHBsaWVkLiBDaGFubmVscyA1LTcKK2NhbiBiZSB1c2VkIGFzIGdlbmVyYWwgcHVycG9zZSBpbnB1dHMgb3IgYWx0ZXJuYXRpdmVseSBpbiBhIGRlZGljYXRlZAorbW9kZS4gQ2hhbm5lbHMgMTItMTUgYXJlIG9jY3VwaWVkIGJ5IHRoZSB0b3VjaHNjcmVlbiBpZiBpdCdzIGFjdGl2ZS4KKworQ3VycmVudGx5IHRoZSBkcml2ZXIgb25seSBzdXBwb3J0cyBjaGFubmVscyAyIGFuZCA1LTE1IHdpdGggbm8gYWx0ZXJuYXRpdmUKK21vZGVzIGZvciBjaGFubmVscyA1LTcuCisKK1NlZSB0aGlzIHRhYmxlIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgZGlmZmVyZW50IGNoYW5uZWxzIGFuZCB0aGVpciBjaGlwCitpbnRlcm5hbCBzY2FsaW5nOgorCitDaGFubmVsCVNpZ25hbAkJCQkJCUlucHV0IFJhbmdlCVNjYWxpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAJQmF0dGVyeSBWb2x0YWdlIChCQVRUKQkJCQkyLjUwIC0gNC42NVYJLTIuNDBWCisxCUJhdHRlcnkgQ3VycmVudCAoQkFUVCAtIEJBVFRJU05TKQkJLTUwIC0gNTAgbVYJeDIwCisyCUFwcGxpY2F0aW9uIFN1cHBseSAoQlApCQkJCTIuNTAgLSA0LjY1VgktMi40MFYKKzMJQ2hhcmdlciBWb2x0YWdlIChDSFJHUkFXKQkJCTAgLSAxMFYgLwkvNQorCQkJCQkJCTAgLSAyMFYJCS8xMAorNAlDaGFyZ2VyIEN1cnJlbnQgKENIUkdJU05TUC1DSFJHSVNOU04pCQktMC4yNVYgLSAwLjI1Vgl4NAorNQlHZW5lcmFsIFB1cnBvc2UgQURJTjUgLyBCYXR0ZXJ5IFBhY2sgVGhlcm1pc3RvcgkwIC0gMi4zMFYJTm8KKzYJR2VuZXJhbCBQdXJwb3NlIEFESU42IC8gQmFja3VwIFZvbHRhZ2UgKExJQ0VMTCkJMCAtIDIuMzBWIC8JTm8gLworCQkJCQkJCTEuNTAgLSAzLjUwVgktMS4yMFYKKzcJR2VuZXJhbCBQdXJwb3NlIEFESU43IC8gVUlEIC8gRGllIFRlbXBlcmF0dXJlCTAgLSAyLjMwViAvCU5vIC8KKwkJCQkJCQkwIC0gMi41NVYgLwl4MC45IC8gTm8KKzgJR2VuZXJhbCBQdXJwb3NlIEFESU44CQkJCTAgLSAyLjMwVglObworOQlHZW5lcmFsIFB1cnBvc2UgQURJTjkJCQkJMCAtIDIuMzBWCU5vCisxMAlHZW5lcmFsIFB1cnBvc2UgQURJTjEwCQkJCTAgLSAyLjMwVglObworMTEJR2VuZXJhbCBQdXJwb3NlIEFESU4xMQkJCQkwIC0gMi4zMFYJTm8KKzEyCUdlbmVyYWwgUHVycG9zZSBUU1gxIC8gVG91Y2hzY3JlZW4gWC1wbGF0ZSAxCTAgLSAyLjMwVglObworMTMJR2VuZXJhbCBQdXJwb3NlIFRTWDIgLyBUb3VjaHNjcmVlbiBYLXBsYXRlIDIJMCAtIDIuMzBWCU5vCisxNAlHZW5lcmFsIFB1cnBvc2UgVFNZMSAvIFRvdWNoc2NyZWVuIFktcGxhdGUgMQkwIC0gMi4zMFYJTm8KKzE1CUdlbmVyYWwgUHVycG9zZSBUU1kyIC8gVG91Y2hzY3JlZW4gWS1wbGF0ZSAyCTAgLSAyLjMwVglObwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQppbmRleCA4MmRlZjg4Li4zZGU2YjBiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQpAQCAtMjI1LDggKzIyNSw2IEBACiAJCXRvIFBXTSBvdXRwdXQgY2hhbm5lbHMuCiAJCVJXCiAKLU9SCi0KIHRlbXBbMS0qXV9hdXRvX3BvaW50WzEtKl1fcHdtCiB0ZW1wWzEtKl1fYXV0b19wb2ludFsxLSpdX3RlbXAKIHRlbXBbMS0qXV9hdXRvX3BvaW50WzEtKl1fdGVtcF9oeXN0CkBAIC0yMzUsNiArMjMzLDE1IEBACiAJCXRvIHRlbXBlcmF0dXJlIGNoYW5uZWxzLgogCQlSVwogCitUaGVyZSBpcyBhIHRoaXJkIGNhc2Ugd2hlcmUgdHJpcCBwb2ludHMgYXJlIGFzc29jaWF0ZWQgdG8gYm90aCBQV00gb3V0cHV0CitjaGFubmVscyBhbmQgdGVtcGVyYXR1cmUgY2hhbm5lbHM6IHRoZSBQV00gdmFsdWVzIGFyZSBhc3NvY2lhdGVkIHRvIFBXTQorb3V0cHV0IGNoYW5uZWxzIHdoaWxlIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZXMgYXJlIGFzc29jaWF0ZWQgdG8gdGVtcGVyYXR1cmUKK2NoYW5uZWxzLiBJbiB0aGF0IGNhc2UsIHRoZSByZXN1bHQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbWFwcGluZyBiZXR3ZWVuCit0ZW1wZXJhdHVyZSBpbnB1dHMgYW5kIFBXTSBvdXRwdXRzLiBXaGVuIHNldmVyYWwgdGVtcGVyYXR1cmUgaW5wdXRzIGFyZQorbWFwcGVkIHRvIGEgZ2l2ZW4gUFdNIG91dHB1dCwgdGhpcyBsZWFkcyB0byBzZXZlcmFsIGNhbmRpZGF0ZSBQV00gdmFsdWVzLgorVGhlIGFjdHVhbCByZXN1bHQgaXMgdXAgdG8gdGhlIGNoaXAsIGJ1dCBpbiBnZW5lcmFsIHRoZSBoaWdoZXN0IGNhbmRpZGF0ZQordmFsdWUgKGZhc3Rlc3QgZmFuIHNwZWVkKSB3aW5zLgorCiAKICoqKioqKioqKioqKioqKioKICogVGVtcGVyYXR1cmVzICoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2hmCmluZGV4IDZlZTM2ZGIuLjQ0ZGQyYmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZgpAQCAtMzIsOCArMzIsNiBAQAogTW9kdWxlIFBhcmFtZXRlcnMKIC0tLS0tLS0tLS0tLS0tLS0tCiAKLSogZm9yY2VfYWRkcjogaW50Ci0gIEluaXRpYWxpemUgdGhlIElTQSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzCiAqIGZvcmNlX2kyYzogaW50CiAgIEluaXRpYWxpemUgdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzCiAqIGluaXQ6IGludApAQCAtNzAsMyArNjgsMzAgQEAKIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyIHNlZSB0aGUgdzgzNzgxZCBkcml2ZXIgZG9jdW1lbnRhdGlvbi4KIAogWzFdIGh0dHA6Ly93d3cubG0tc2Vuc29ycy5vcmcvYnJvd3Nlci9sbS1zZW5zb3JzL3RydW5rL2RvYy92aWQKKworRm9yY2luZyB0aGUgYWRkcmVzcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZHJpdmVyIHVzZWQgdG8gaGF2ZSBhIG1vZHVsZSBwYXJhbWV0ZXIgbmFtZWQgZm9yY2VfYWRkciwgd2hpY2ggY291bGQKK2JlIHVzZWQgdG8gZm9yY2UgdGhlIGJhc2UgSS9PIGFkZHJlc3Mgb2YgdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgYmxvY2suCitUaGlzIHdhcyBtZWFudCBhcyBhIHdvcmthcm91bmQgZm9yIG1haW5ib2FyZHMgd2l0aCBhIGJyb2tlbiBCSU9TLiBUaGlzCittb2R1bGUgcGFyYW1ldGVyIGlzIGdvbmUgZm9yIHRlY2huaWNhbCByZWFzb25zLiBJZiB5b3UgbmVlZCB0aGlzIGZlYXR1cmUsCit5b3UgY2FuIG9idGFpbiB0aGUgc2FtZSByZXN1bHQgYnkgdXNpbmcgdGhlIGlzYXNldCB0b29sIChwYXJ0IG9mCitsbS1zZW5zb3JzKSBiZWZvcmUgbG9hZGluZyB0aGUgZHJpdmVyOgorCisjIEVudGVyIHRoZSBTdXBlciBJL08gY29uZmlnIHNwYWNlCitpc2FzZXQgLXkgLWYgMHgyZSAweDg3Citpc2FzZXQgLXkgLWYgMHgyZSAweDg3CisKKyMgU2VsZWN0IHRoZSBod21vbiBsb2dpY2FsIGRldmljZQoraXNhc2V0IC15IDB4MmUgMHgyZiAweDA3IDB4MGIKKworIyBTZXQgdGhlIGJhc2UgSS9PIGFkZHJlc3MgKHRvIDB4MjkwIGluIHRoaXMgZXhhbXBsZSkKK2lzYXNldCAteSAweDJlIDB4MmYgMHg2MCAweDAyCitpc2FzZXQgLXkgMHgyZSAweDJmIDB4NjEgMHg5MAorCisjIEV4aXQgdGhlIFN1cGVyLUkvTyBjb25maWcgc3BhY2UKK2lzYXNldCAteSAtZiAweDJlIDB4YWEKKworVGhlIGFib3ZlIHNlcXVlbmNlIGFzc3VtZXMgYSBTdXBlci1JL08gY29uZmlnIHNwYWNlIGF0IDB4MmUvMHgyZiwgYnV0CisweDRlLzB4NGYgaXMgYWxzbyBwb3NzaWJsZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC5jIGIvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMKaW5kZXggMDk4ZGU1Yi4uNDIyMDg1MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMKKysrIGIvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMKQEAgLTMwNCw3ICszMDQsNyBAQAogCWFkZHIgPSBtbWFwKE5VTEwsIGdldHBhZ2VzaXplKCkgKiBudW0sCiAJCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsIE1BUF9QUklWQVRFLCBmZCwgMCk7CiAJaWYgKGFkZHIgPT0gTUFQX0ZBSUxFRCkKLQkJZXJyKDEsICJNbWFwaW5nICV1IHBhZ2VzIG9mIC9kZXYvemVybyIsIG51bSk7CisJCWVycigxLCAiTW1hcHBpbmcgJXUgcGFnZXMgb2YgL2Rldi96ZXJvIiwgbnVtKTsKIAogCS8qCiAJICogT25lIG5lYXQgbW1hcCBmZWF0dXJlIGlzIHRoYXQgeW91IGNhbiBjbG9zZSB0aGUgZmQsIGFuZCBpdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jMnBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9taXNjLWRldmljZXMvYzJwb3J0LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9jMnBvcnQudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL21pc2MtZGV2aWNlcy9jMnBvcnQudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ljczkzMnM0MDEgYi9Eb2N1bWVudGF0aW9uL21pc2MtZGV2aWNlcy9pY3M5MzJzNDAxCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2ljczkzMnM0MDEKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL2ljczkzMnM0MDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAppbmRleCBiMTUyZTgxLi5jMTBjMDIyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CkBAIC0yNTcsNiArMjU3LDggQEAKIAogIDEwOiAnVycgaWYgYSB3YXJuaW5nIGhhcyBwcmV2aW91c2x5IGJlZW4gaXNzdWVkIGJ5IHRoZSBrZXJuZWwuCiAKKyAxMTogJ0MnIGlmIGEgc3RhZ2luZyBkcml2ZXIgaGFzIGJlZW4gbG9hZGVkLgorCiBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoZSAnVGFpbnRlZDogJyBzdHJpbmcgaXMgdG8gdGVsbCBrZXJuZWwKIGRlYnVnZ2VycyBpZiB0aGlzIGlzIGEgY2xlYW4ga2VybmVsIG9yIGlmIGFueXRoaW5nIHVudXN1YWwgaGFzCiBvY2N1cnJlZC4gIFRhaW50aW5nIGlzIHBlcm1hbmVudDogZXZlbiBpZiBhbiBvZmZlbmRpbmcgbW9kdWxlIGlzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9jb25zdW1lci50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9jb25zdW1lci50eHQKaW5kZXggNWY4M2ZkMi4uY2RlYmI1MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvY29uc3VtZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcmVndWxhdG9yL2NvbnN1bWVyLnR4dApAQCAtMTA0LDcgKzEwNCw3IEBACiAKIENvbnN1bWVycyBjYW4gY29udHJvbCB0aGVpciBzdXBwbHkgY3VycmVudCBsaW1pdCBieSBjYWxsaW5nIDotCiAKLWludCByZWd1bGF0b3Jfc2V0X2N1cnJlbnRfbGltaXQocmVndWxhdG9yLCBtaW5fdVYsIG1heF91Vik7CitpbnQgcmVndWxhdG9yX3NldF9jdXJyZW50X2xpbWl0KHJlZ3VsYXRvciwgbWluX3VBLCBtYXhfdUEpOwogCiBXaGVyZSBtaW5fdUEgYW5kIG1heF91QSBhcmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWNjZXB0YWJsZSBjdXJyZW50IGxpbWl0IGluCiBtaWNyb2FtcHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCmluZGV4IGM4NTFlZjQuLjE3ZmZhMDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCkBAIC0xLDMgKzEsNjUgQEAKKzEgUmVsZWFzZSBEYXRlICAgIDogVHVlcy4gIEp1bHkgMjgsIDIwMDkgMTA6MTI6NDUgUFNUIDIwMDkgLQorCQkJKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCisJCQlCbyBZYW5nCisKKzIgQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDQuMTIKKzMgT2xkZXIgVmVyc2lvbiAgIDogMDAuMDAuMDQuMTAKKworMS4JQ2hhbmdlIHRoZSBBRU4gc3lzIFBEIHVwZGF0ZSBmcm9tIHNjc2lfc2NhbiB0bworCXNjc2lfYWRkX2RldmljZSBhbmQgc2NzaV9yZW1vdmVfZGV2aWNlLgorMi4JVGFrZW9mZiB0aGUgZGVidWcgcHJpbnQtb3V0IGluIGFlbl9wb2xsaW5nIHJvdXRpbmUuCisKKzEgUmVsZWFzZSBEYXRlICAgIDogVGh1ci4gIEp1bHkgMDIsIDIwMDkgMTA6MTI6NDUgUFNUIDIwMDkgLQorCQkJKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCisJCQlCbyBZYW5nCisKKzIgQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDQuMTAKKzMgT2xkZXIgVmVyc2lvbiAgIDogMDAuMDAuMDQuMDgKKworMS4JQWRkIHRoZSAzIG1pbnMgdGltZW91dCBkdXJpbmcgdGhlIGNvbnRyb2xsZXIgaW5pdGlhbGl6ZS4KKzIuCUFkZCB0aGUgZml4IGZvciA2NGJpdCBzZW5zZSBkYXRlIGVycm9ycy4KKworMSBSZWxlYXNlIERhdGUgICAgOiBUdWVzLiBNYXkgMDUsIDIwMDkgMTA6MTI6NDUgUFNUIDIwMDkgLQorCQkJKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCisJCQlCbyBZYW5nCisKKzIgQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDQuMDgKKzMgT2xkZXIgVmVyc2lvbiAgIDogMDAuMDAuMDQuMDYKKworMS4JQWRkIHRoZSBmaXggb2YgcGVuZGluZyBpbiBGVyBhZnRlciBkZWxldGVkIHRoZSBsb2dpYyBkcml2ZXMuCisyLglBZGQgdGhlIGZpeCBvZiBkZWFsbG9jYXRpbmcgbWVtb3J5IGFmdGVyIGdldCBwZGxpc3QuCisKKzEgUmVsZWFzZSBEYXRlICAgIDogVHVlcy4gTWFyY2ggMjYsIDIwMDkgMTA6MTI6NDUgUFNUIDIwMDkgLQorCQkJKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCisJCQlCbyBZYW5nCisKKzIgQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDQuMDYKKzMgT2xkZXIgVmVyc2lvbiAgIDogMDAuMDAuMDQuMDQKKworMS4JQWRkIHRoZSBmaXggb2YgdGhlIGRyaXZlciBjbWQgZW1wdHkgZml4IG9mIHRoZSBkcml2ZXIgY21kIGVtcHR5LgorMi4JQWRkIHRoZSBmaXggb2YgdGhlIGRyaXZlciBNU00gQUVOIENNRCBjYXVzZSB0aGUgc3lzdGVtIHNsb3cuCisKKzEgUmVsZWFzZSBEYXRlICAgIDogVHVlcy4gTWFyY2ggMDMsIDIwMDkgMTA6MTI6NDUgUFNUIDIwMDkgLQorCQkJKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCisJCQlCbyBZYW5nCisKKzIgQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDQuMDQKKzMgT2xkZXIgVmVyc2lvbiAgIDogMDAuMDAuMDQuMDEKKworMS4JQWRkIHRoZSBUYXBlIGRyaXZlIGZpeCB0byB0aGUgZHJpdmVyOiBJZiB0aGUgY29tbWFuZCBpcyBmb3IKKwl0aGUgdGFwZSBkZXZpY2UsIHNldCB0aGUgcHRocnUgdGltZW91dCB0byB0aGUgb3MgbGF5ZXIgdGltZW91dCB2YWx1ZS4KKworMi4JQWRkIFBvbGxfd2FpdCBtZWNoYW5pc20gdG8gR2VuLTIgTGludXggZHJpdi4KKwkJSW4gdGhlIGFlbiBoYW5kbGVyLCBkcml2ZXIgbmVlZHMgdG8gd2FrZXVwIHBvbGwgaGFuZGxlciBzaW1pbGFyIHRvCisJCXRoZSB3YXkgaXQgcmFpc2VzIFNJR0lPLgorCiszLglBZGQgbmV3IGNvbnRyb2xsZXIgbmV3IFNBUzIgc3VwcG9ydCB0byB0aGUgZHJpdmVyLgorCis0LglSZXBvcnQgdGhlIHVuY29uZmlndXJlZCBQRCAoc3lzdGVtIFBEKSB0byBPUy4KKworNS4JQWRkIHRoZSBJRUVFIFNHTCBzdXBwb3J0IHRvIHRoZSBkcml2ZXIKKworNi4JUmVhc2lnbiB0aGUgQXBwbGljYXRpb24gY21kcyB0byBTQVMyIGNvbnRyb2xsZXIKIAogMSBSZWxlYXNlIERhdGUgICAgOiBUaHVyLkp1bHkuIDI0IDExOjQxOjUxIFBTVCAyMDA4IC0KICAgICAgICAgICAgICAgICAgICAgICAgKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCkBAIC0xODUsNyArMjQ3LDcgQEAKIAlEaXNrcyBhcmUgZXhwb3NlZCB3aXRoIFdDRT0xLiBVc2VyIGlzIGFkdmlzZWQgdG8gZW5hYmxlIFdyaXRlIEJhY2sKIAltb2RlIG9ubHkgd2hlbiB0aGUgY29udHJvbGxlciBoYXMgYmF0dGVyeSBiYWNrdXAuIEF0IHRoaXMgdGltZQogCVN5bmhyb25pemUgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRlcuIERyaXZlciB3aWxsIHNob3J0LWN5Y2xlCi0JdGhlIGNtZCBhbmQgcmV0dXJuIHN1Y2VzcyB3aXRob3V0IHNlbmRpbmcgZG93biB0byBGVy4KKwl0aGUgY21kIGFuZCByZXR1cm4gc3VjY2VzcyB3aXRob3V0IHNlbmRpbmcgZG93biB0byBGVy4KIAogMSBSZWxlYXNlIERhdGUgICAgOiBTdW4gSmFuLiAxNCAxMToyMTozMiBQRFQgMjAwNyAtCiAJCSBTdW1hbnQgUGF0cm8gPFN1bWFudC5QYXRyb0Bsc2lsLmNvbT4vQm8gWWFuZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dAppbmRleCA5MDAwY2Q4Li5lOTNhZmZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dApAQCAtMTI2LDYgKzEyNiw3IEBACiAgIG1iNQkJTWFjYm9vayA1LDEKICAgbWJwMwkJTWFjYm9vayBQcm8gcmV2MwogICBpbWFjMjQJaU1hYyAyNCcnIHdpdGggamFjayBkZXRlY3Rpb24KKyAgaW1hYzkxCWlNYWMgOSwxCiAgIHcyamMJCUFTVVMgVzJKQwogICAzc3RhY2stMmNoLWRpZwkzLWphY2sgd2l0aCBTUERJRiBJL08gKEFMQzg4MykKICAgYWxjODgzLTZzdGFjay1kaWcJNi1qYWNrIGRpZ2l0YWwgd2l0aCBTUERJRiBJL08gKEFMQzg4MykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8udHh0CmluZGV4IDdiOGE1ZjkuLjYzMjViZWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLnR4dApAQCAtNjI0LDExICs2MjQsMTMgQEAKIHRoZSB3aWRnZXQgaW5mb3JtYXRpb24gYW5kIGFkanVzdGluZyB0aGUgYW1wIHZhbHVlcywgYXMgd2VsbCBhcyB0aGUKIHByb2MtY29tcGF0aWJsZSBvdXRwdXQuCiAKLVRoZSBoZGEtYW5hbHl6ZXIgaXMgYSBwYXJ0IG9mIGFsc2EuZ2l0IHJlcG9zaXRvcnkgaW4KLWFsc2EtcHJvamVjdC5vcmc6CitUaGUgaGRhLWFuYWx5emVyOgogCiAtIGh0dHA6Ly9naXQuYWxzYS1wcm9qZWN0Lm9yZy8/cD1hbHNhLmdpdDthPXRyZWU7Zj1oZGEtYW5hbHl6ZXIKIAoraXMgYSBwYXJ0IG9mIGFsc2EuZ2l0IHJlcG9zaXRvcnkgaW4gYWxzYS1wcm9qZWN0Lm9yZzoKKworLSBnaXQ6Ly9naXQuYWxzYS1wcm9qZWN0Lm9yZy9hbHNhLmdpdAogCiBDb2RlY2dyYXBoCiB+fn5+fn5+fn5+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeSBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5CmluZGV4IGRlYWI1MWQuLjQ4ODRjYjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5CisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5CkBAIC01MzgsNyArNTM4LDcgQEAKIFRoZSBidWxrIG9mIHRoZSBkcml2ZXIgd2lsbCBiZSBtYW5hZ2luZyB0aGUgSS9PIHF1ZXVlIGZlZCBieSB0cmFuc2ZlcigpLgogCiBUaGF0IHF1ZXVlIGNvdWxkIGJlIHB1cmVseSBjb25jZXB0dWFsLiAgRm9yIGV4YW1wbGUsIGEgZHJpdmVyIHVzZWQgb25seQotZm9yIGxvdy1mcmVxdWVuY3kgc2Vuc29yIGFjZXNzIG1pZ2h0IGJlIGZpbmUgdXNpbmcgc3luY2hyb25vdXMgUElPLgorZm9yIGxvdy1mcmVxdWVuY3kgc2Vuc29yIGFjY2VzcyBtaWdodCBiZSBmaW5lIHVzaW5nIHN5bmNocm9ub3VzIFBJTy4KIAogQnV0IHRoZSBxdWV1ZSB3aWxsIHByb2JhYmx5IGJlIHZlcnkgcmVhbCwgdXNpbmcgbWVzc2FnZS0+cXVldWUsIFBJTywKIG9mdGVuIERNQSAoZXNwZWNpYWxseSBpZiB0aGUgcm9vdCBmaWxlc3lzdGVtIGlzIGluIFNQSSBmbGFzaCksIGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKaW5kZXggYTAyOGI5Mi4uOGY3YTBlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CkBAIC0xMzksOSArMTM5LDkgQEAKIGNvcmVfcGlwZV9saW1pdDoKIAogVGhpcyBzeXNjdGwgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gY29yZV9wYXR0ZXJuIGlzIGNvbmZpZ3VyZWQgdG8gcGlwZSBjb3JlCi1maWxlcyB0byB1c2VyIHNwYWNlIGhlbHBlciBhICh3aGVuIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgY29yZV9wYXR0ZXJuIGlzIGEgJ3wnLAorZmlsZXMgdG8gYSB1c2VyIHNwYWNlIGhlbHBlciAod2hlbiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGNvcmVfcGF0dGVybiBpcyBhICd8JywKIHNlZSBhYm92ZSkuICBXaGVuIGNvbGxlY3RpbmcgY29yZXMgdmlhIGEgcGlwZSB0byBhbiBhcHBsaWNhdGlvbiwgaXQgaXMKLW9jY2FzaW9uYWxseSB1c2VmdWxsIGZvciB0aGUgY29sbGVjdGluZyBhcHBsaWNhdGlvbiB0byBnYXRoZXIgZGF0YSBhYm91dCB0aGUKK29jY2FzaW9uYWxseSB1c2VmdWwgZm9yIHRoZSBjb2xsZWN0aW5nIGFwcGxpY2F0aW9uIHRvIGdhdGhlciBkYXRhIGFib3V0IHRoZQogY3Jhc2hpbmcgcHJvY2VzcyBmcm9tIGl0cyAvcHJvYy9waWQgZGlyZWN0b3J5LiAgSW4gb3JkZXIgdG8gZG8gdGhpcyBzYWZlbHksIHRoZQoga2VybmVsIG11c3Qgd2FpdCBmb3IgdGhlIGNvbGxlY3RpbmcgcHJvY2VzcyB0byBleGl0LCBzbyBhcyBub3QgdG8gcmVtb3ZlIHRoZQogY3Jhc2hpbmcgcHJvY2Vzc2VzIHByb2MgZmlsZXMgcHJlbWF0dXJlbHkuICBUaGlzIGluIHR1cm4gY3JlYXRlcyB0aGUgcG9zc2liaWxpdHkKQEAgLTE1Miw3ICsxNTIsNyBAQAogcHJvY2Vzc2VzIGFib3ZlIHRoYXQgdmFsdWUgYXJlIG5vdGVkIHZpYSB0aGUga2VybmVsIGxvZyBhbmQgdGhlaXIgY29yZXMgYXJlCiBza2lwcGVkLiAgMCBpcyBhIHNwZWNpYWwgdmFsdWUsIGluZGljYXRpbmcgdGhhdCB1bmxpbWl0ZWQgcHJvY2Vzc2VzIG1heSBiZQogY2FwdHVyZWQgaW4gcGFyYWxsZWwsIGJ1dCB0aGF0IG5vIHdhaXRpbmcgd2lsbCB0YWtlIHBsYWNlIChpLmUuIHRoZSBjb2xsZWN0aW5nCi1wcm9jZXNzIGlzIG5vdCBndWFyYW50ZWVkIGFjY2VzcyB0byAvcHJvYy88Y3JhaGluZyBwaWQ+LykuICBUaGlzIHZhbHVlIGRlZmF1bHRzCitwcm9jZXNzIGlzIG5vdCBndWFyYW50ZWVkIGFjY2VzcyB0byAvcHJvYy88Y3Jhc2hpbmcgcGlkPi8pLiAgVGhpcyB2YWx1ZSBkZWZhdWx0cwogdG8gMC4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCBhNmUzNjBkLi5mYzU3OTBkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0zNzAsNyArMzcwLDcgQEAKIG1tYXBfbWluX2FkZHIKIAogVGhpcyBmaWxlIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIGFkZHJlc3Mgc3BhY2UgIHdoaWNoIGEgdXNlciBwcm9jZXNzIHdpbGwKLWJlIHJlc3RyaWN0ZWQgZnJvbSBtbWFwaW5nLiAgU2luY2Uga2VybmVsIG51bGwgZGVyZWZlcmVuY2UgYnVncyBjb3VsZAorYmUgcmVzdHJpY3RlZCBmcm9tIG1tYXBwaW5nLiAgU2luY2Uga2VybmVsIG51bGwgZGVyZWZlcmVuY2UgYnVncyBjb3VsZAogYWNjaWRlbnRhbGx5IG9wZXJhdGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBmaXJzdCBjb3VwbGUgb2YgcGFnZXMKIG9mIG1lbW9yeSB1c2Vyc3BhY2UgcHJvY2Vzc2VzIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0byB3cml0ZSB0byB0aGVtLiAgQnkKIGRlZmF1bHQgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gMCBhbmQgbm8gcHJvdGVjdGlvbnMgd2lsbCBiZSBlbmZvcmNlZCBieSB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGltZXJzL2hwZXQudHh0IGIvRG9jdW1lbnRhdGlvbi90aW1lcnMvaHBldC50eHQKaW5kZXggMDQ3NjNhMy4uMTZkMjVlNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90aW1lcnMvaHBldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90aW1lcnMvaHBldC50eHQKQEAgLTMsNyArMyw3IEBACiBUaGUgSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgKEhQRVQpIGhhcmR3YXJlIGZvbGxvd3MgYSBzcGVjaWZpY2F0aW9uCiBieSBJbnRlbCBhbmQgTWljcm9zb2Z0IHdoaWNoIGNhbiBiZSBmb3VuZCBhdAogCi0JaHR0cDovL3d3dy5pbnRlbC5jb20vdGVjaG5vbG9neS9hcmNoaXRlY3R1cmUvaHBldHNwZWMuaHRtCisJaHR0cDovL3d3dy5pbnRlbC5jb20vaGFyZHdhcmVkZXNpZ24vaHBldHNwZWNfMS5wZGYKIAogRWFjaCBIUEVUIGhhcyBvbmUgZml4ZWQtcmF0ZSBjb3VudGVyIChhdCAxMCsgTUh6LCBoZW5jZSAiSGlnaCBQcmVjaXNpb24iKQogYW5kIHVwIHRvIDMyIGNvbXBhcmF0b3JzLiAgTm9ybWFsbHkgdGhyZWUgb3IgbW9yZSBjb21wYXJhdG9ycyBhcmUgcHJvdmlkZWQsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUKaW5kZXggNWYzM2Q4NC4uNzUzOWU4ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NQpAQCAtMjQsMyArMjQsNSBAQAogIDIzIC0+IE1hZ2ljLVBybyBQcm9IRFRWIEV4dHJlbWUgMiAgICAgICAgICAgICAgICAgICAgICAgICBbMTRmMTo4NjU3XQogIDI0IC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxODUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo4NTQxXQogIDI1IC0+IENvbXBybyBWaWRlb01hdGUgRTgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTg1ODplODAwXQorIDI2IC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMjkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo4NTUxXQorIDI3IC0+IE15Z2ljYSBYODU1OCBQUk8gRE1CLVRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTRmMTo4NTc4XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CmluZGV4IDMzODVmOGIuLjdlYzNjNGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKQEAgLTgxLDMgKzgxLDQgQEAKICA4MCAtPiBIYXVwcGF1Z2UgV2luVFYtSVIgT25seSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6OTI5MF0KICA4MSAtPiBMZWFkdGVrIFdpbkZhc3QgRFRWMTgwMCBIeWJyaWQgICAgICAgICAgICAgICAgICAgICAgWzEwN2Q6NjY1NF0KICA4MiAtPiBXaW5GYXN0IERUVjIwMDAgSCByZXYuIEogICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwN2Q6NmYyYl0KKyA4MyAtPiBQcm9mIDczMDEgRFZCLVMvUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2IwMzQ6MzAzNF0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuZW0yOHh4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHgKaW5kZXggYjhhZmVmNC4uMGMxNjZmZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHgKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHgKQEAgLTEsNSArMSw1IEBACiAgIDAgLT4gVW5rbm93biBFTTI4MDAgdmlkZW8gZ3JhYmJlciAgICAgICAgICAgICAoZW0yODAwKSAgICAgICAgW2ViMWE6MjgwMF0KLSAgMSAtPiBVbmtub3duIEVNMjc1MC8yOHh4IHZpZGVvIGdyYWJiZXIgICAgICAgIChlbTI4MjAvZW0yODQwKSBbZWIxYToyNzEwLGViMWE6MjgyMCxlYjFhOjI4MjEsZWIxYToyODYwLGViMWE6Mjg2MSxlYjFhOjI4NzAsZWIxYToyODgxLGViMWE6Mjg4MyxlYjFhOjI4NjhdCisgIDEgLT4gVW5rbm93biBFTTI3NTAvMjh4eCB2aWRlbyBncmFiYmVyICAgICAgICAoZW0yODIwL2VtMjg0MCkgW2ViMWE6MjcxMCxlYjFhOjI4MjAsZWIxYToyODIxLGViMWE6Mjg2MCxlYjFhOjI4NjEsZWIxYToyODYyLGViMWE6Mjg3MCxlYjFhOjI4ODEsZWIxYToyODgzLGViMWE6Mjg2OF0KICAgMiAtPiBUZXJyYXRlYyBDaW5lcmd5IDI1MCBVU0IgICAgICAgICAgICAgICAgIChlbTI4MjAvZW0yODQwKSBbMGNjZDowMDM2XQogICAzIC0+IFBpbm5hY2xlIFBDVFYgVVNCIDIgICAgICAgICAgICAgICAgICAgICAgKGVtMjgyMC9lbTI4NDApIFsyMzA0OjAyMDhdCiAgIDQgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiAyICAgICAgICAgICAgICAgICAgICAoZW0yODIwL2VtMjg0MCkgWzIwNDA6NDIwMCwyMDQwOjQyMDFdCkBAIC02OSwzICs2OSw0IEBACiAgNzEgLT4gU2lsdmVyY3Jlc3QgV2ViY2FtIDEuM21waXggICAgICAgICAgICAgICAoZW0yODIwL2VtMjg0MCkKICA3MiAtPiBHYWRtZWkgVVRWMzMwKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbTI4NjEpCiAgNzMgLT4gUmVkZG8gRFZCLUMgVVNCIFRWIEJveCAgICAgICAgICAgICAgICAgICAoZW0yODcwKQorIDc0IC0+IEFjdGlvbm1hc3Rlci9MaW5YY2VsL0RpZ2l0dXMgVkMyMTFBICAgICAgKGVtMjgwMCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAppbmRleCAyNjIwZDYwLi5mY2UxZTdlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CkBAIC0xNzIsMyArMTcyLDUgQEAKIDE3MSAtPiBCZWhvbGRlciBCZWhvbGRUViBYNyAgICAgICAgICAgICAgICAgICAgIFs1YWNlOjc1OTVdCiAxNzIgLT4gUm92ZXJNZWRpYSBUViBMaW5rIFBybyBGTSAgICAgICAgICAgICAgICBbMTlkMTowMTM4XQogMTczIC0+IFpvbGlkIEh5YnJpZCBUViBUdW5lciBQQ0kgICAgICAgICAgICAgICAgWzExMzE6MjAwNF0KKzE3NCAtPiBBc3VzIEV1cm9wYSBIeWJyaWQgT0VNICAgICAgICAgICAgICAgICAgIFsxMDQzOjQ4NDddCisxNzUgLT4gTGVhZHRlayBXaW5mYXN0IERUVjEwMDBTICAgICAgICAgICAgICAgICBbMTA3ZDo2NjU1XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dAppbmRleCAzZjYxODI1Li4zMTlkOTgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dApAQCAtNiw3ICs2LDggQEAKIAogeHh4eAkJdmVuZDpwcm9kCiAtLS0tCi1zcGNhNTAxCQkwMDAwOjAwMDAJTXlzdEZyb21PcmkgVW5rbm93IENhbWVyYQorc3BjYTUwMQkJMDAwMDowMDAwCU15c3RGcm9tT3JpIFVua25vd24gQ2FtZXJhCitzcGNhNTA4CQkwMTMwOjAxMzAJQ2xvbmUgRGlnaXRhbCBXZWJjYW0gMTEwNDMKIG01NjAyCQkwNDAyOjU2MDIJQUxpIFZpZGVvIENhbWVyYSBDb250cm9sbGVyCiBzcGNhNTAxCQkwNDBhOjAwMDIJS29kYWsgRFZDLTMyNQogc3BjYTUwMAkJMDQwYTowMzAwCUtvZGFrIEVaMjAwCkBAIC0zNyw2ICszOCw3IEBACiBvdjUxOQkJMDQxZTo0MDYwCUNyZWF0aXZlIExpdmUhIFZJU1RBIFZGMDM1MAogb3Y1MTkJCTA0MWU6NDA2MQlDcmVhdGl2ZSBMaXZlISBWSVNUQSBWRjA0MDAKIG92NTE5CQkwNDFlOjQwNjQJQ3JlYXRpdmUgTGl2ZSEgVklTVEEgVkYwNDIwCitvdjUxOQkJMDQxZTo0MDY3CUNyZWF0aXZlIExpdmUhIENhbSBWaWRlbyBJTSAoVkYwMzUwKQogb3Y1MTkJCTA0MWU6NDA2OAlDcmVhdGl2ZSBMaXZlISBWSVNUQSBWRjA0NzAKIHNwY2E1NjEJCTA0NTg6NzAwNAlHZW5pdXMgVmlkZW9DQU0gRXhwcmVzcyBWMgogc3VucGx1cwkJMDQ1ODo3MDA2CUdlbml1cyBEc2MgMS4zIFNtYXJ0CkBAIC02OCwxMiArNzAsMTIgQEAKIHpjM3h4CQkwNDZkOjA4YTYJTG9naXRlY2ggUUNpbQogemMzeHgJCTA0NmQ6MDhhNwlMb2dpdGVjaCBRdWlja0NhbSBJbWFnZQogemMzeHgJCTA0NmQ6MDhhOQlMb2dpdGVjaCBOb3RlYm9vayBEZWx1eGUKLXpjM3h4CQkwNDZkOjA4YWEJTGFidGVjIFdlYmNhbSAgTm90ZWJvb2sKK3pjM3h4CQkwNDZkOjA4YWEJTGFidGVjIFdlYmNhbSBOb3RlYm9vawogemMzeHgJCTA0NmQ6MDhhYwlMb2dpdGVjaCBRdWlja0NhbSBDb29sCiB6YzN4eAkJMDQ2ZDowOGFkCUxvZ2l0ZWNoIFFDQ29tbXVuaWNhdGUgU1RYCiB6YzN4eAkJMDQ2ZDowOGFlCUxvZ2l0ZWNoIFF1aWNrQ2FtIGZvciBOb3RlYm9va3MKIHpjM3h4CQkwNDZkOjA4YWYJTG9naXRlY2ggUXVpY2tDYW0gQ29vbAotemMzeHgJCTA0NmQ6MDhiOQlMb2dpdGVjaCBRQyBJTSA/Pz8KK3pjM3h4CQkwNDZkOjA4YjkJTG9naXRlY2ggUXVpY2tDYW0gRXhwcmVzcwogemMzeHgJCTA0NmQ6MDhkNwlMb2dpdGVjaCBRQ2FtIFNUWAogemMzeHgJCTA0NmQ6MDhkOQlMb2dpdGVjaCBRdWlja0NhbSBJTS9Db25uZWN0CiB6YzN4eAkJMDQ2ZDowOGQ4CUxvZ2l0ZWNoIE5vdGVib29rIERlbHV4ZQpAQCAtODIsNyArODQsNyBAQAogc3BjYTUwMAkJMDQ2ZDowOTAwCUxvZ2l0ZWNoIEluYy4gQ2xpY2tTbWFydCAzMTAKIHNwY2E1MDAJCTA0NmQ6MDkwMQlMb2dpdGVjaCBJbmMuIENsaWNrU21hcnQgNTEwCiBzdW5wbHVzCQkwNDZkOjA5MDUJTG9naXRlY2ggQ2xpY2tTbWFydCA4MjAKLXR2ODUzMgkJMDQ2ZDowOTIwCVFDIEV4cHJlc3MKK3R2ODUzMgkJMDQ2ZDowOTIwCUxvZ2l0ZWNoIFF1aWNrQ2FtIEV4cHJlc3MKIHR2ODUzMgkJMDQ2ZDowOTIxCUxhYnRlYyBXZWJjYW0KIHNwY2E1NjEJCTA0NmQ6MDkyOAlMb2dpdGVjaCBRQyBFeHByZXNzIEV0Y2gyCiBzcGNhNTYxCQkwNDZkOjA5MjkJTGFidGVjIFdlYmNhbSBFbGNoMgpAQCAtOTEsNyArOTMsNyBAQAogc3BjYTU2MQkJMDQ2ZDowOTJjCUxvZ2l0ZWNoIFFDIGNoYXQgRWxjaDIKIHNwY2E1NjEJCTA0NmQ6MDkyZAlMb2dpdGVjaCBRQyBFbGNoMgogc3BjYTU2MQkJMDQ2ZDowOTJlCUxvZ2l0ZWNoIFFDIEVsY2gyCi1zcGNhNTYxCQkwNDZkOjA5MmYJTG9naXRlY2ggIFF1aWNrQ2FtIEV4cHJlc3MgUGx1cworc3BjYTU2MQkJMDQ2ZDowOTJmCUxvZ2l0ZWNoIFF1aWNrQ2FtIEV4cHJlc3MgUGx1cwogc3VucGx1cwkJMDQ2ZDowOTYwCUxvZ2l0ZWNoIENsaWNrU21hcnQgNDIwCiBzdW5wbHVzCQkwNDcxOjAzMjIJUGhpbGlwcyBETVZDMTMwMEsKIHpjM3h4CQkwNDcxOjAzMjUJUGhpbGlwcyBTUEMgMjAwIE5DCkBAIC0xODcsNyArMTg5LDYgQEAKIHNvbml4agkJMDZmODozMDA4CUhlcmN1bGVzIERlbHV4ZSBPcHRpY2FsIEdsYXNzCiBwYWM3MzExCQkwNmY4OjMwMDkJSGVyY3VsZXMgQ2xhc3NpYyBMaW5rCiBzcGNhNTA4CQkwNzMzOjAxMTAJVmlld1F1ZXN0IFZRMTEwCi1zcGNhNTA4CQkwMTMwOjAxMzAJQ2xvbmUgRGlnaXRhbCBXZWJjYW0gMTEwNDMKIHNwY2E1MDEJCTA3MzM6MDQwMQlJbnRlbCBDcmVhdGUgYW5kIFNoYXJlCiBzcGNhNTAxCQkwNzMzOjA0MDIJVmlld1F1ZXN0IE0zMThCCiBzcGNhNTA1CQkwNzMzOjA0MzAJSW50ZWwgUEMgQ2FtZXJhIFBybwpAQCAtMjAyLDYgKzIwMyw3IEBACiBzcGNhNTAwCQkwOGNhOjAxMDMJQWlwdGVrIFBvY2tldERWCiBzdW5wbHVzCQkwOGNhOjAxMDQJQWlwdGVrIFBvY2tldERWSUkgMS4zCiBzdW5wbHVzCQkwOGNhOjAxMDYJQWlwdGVrIFBvY2tldCBEVjMxMDArCittcjk3MzEwYQkwOGNhOjAxMTAJVHJ1c3QgU3B5Y0BtIDEwMAogbXI5NzMxMGEJMDhjYTowMTExCUFpcHRlayBQZW5DYW0gVkdBKwogc3VucGx1cwkJMDhjYToyMDA4CUFpcHRlayBNaW5pIFBlbkNhbSAyIE0KIHN1bnBsdXMJCTA4Y2E6MjAxMAlBaXB0ZWsgUG9ja2V0Q2FtIDNNCkBAIC0yMjIsNyArMjI0LDcgQEAKIHBhYzIwNwkJMDkzYToyNDYxCUhQIFdlYmNhbQogcGFjMjA3CQkwOTNhOjI0NjMJUGhpbGlwcyBTUEMgMjIwIE5DCiBwYWMyMDcJCTA5M2E6MjQ2NAlMYWJ0ZWMgV2ViY2FtIDEyMDAKLXBhYzIwNwkJMDkzYToyNDY4CVBBQzIwNworcGFjMjA3CQkwOTNhOjI0NjgJV2ViY2FtIFdCLTE0MDBUCiBwYWMyMDcJCTA5M2E6MjQ3MAlHZW5pdXMgR0YxMTIKIHBhYzIwNwkJMDkzYToyNDcxCUdlbml1cyBWaWRlb0NhbSBnZTExMQogcGFjMjA3CQkwOTNhOjI0NzIJR2VuaXVzIFZpZGVvQ2FtIGdlMTEwCkBAIC0yMzAsNyArMjMyLDcgQEAKIHBhYzIwNwkJMDkzYToyNDc2CUdlbml1cyBlLU1lc3NlbmdlciAxMTIKIHBhYzczMTEJCTA5M2E6MjYwMAlQQUM3MzExIFR5cGhvb24KIHBhYzczMTEJCTA5M2E6MjYwMQlQaGlsaXBzIFNQQyA2MTAgTkMKLXBhYzczMTEJCTA5M2E6MjYwMwlQQUM3MzEyCitwYWM3MzExCQkwOTNhOjI2MDMJUGhpbGlwcyBTUEMgNTAwIE5DCiBwYWM3MzExCQkwOTNhOjI2MDgJVHJ1c3QgV0ItMzMwMHAKIHBhYzczMTEJCTA5M2E6MjYwZQlHaWdhd2FyZSBWR0EgUEMgQ2FtZXJhLCBUcnVzdCBXQi0zMzUwcCwgU0lHTUEgY2FtIDIzNTAKIHBhYzczMTEJCTA5M2E6MjYwZglTbmFrZUNhbQpAQCAtMjM5LDYgKzI0MSw3IEBACiBwYWM3MzExCQkwOTNhOjI2MjIJR2VuaXVzIEV5ZSAzMTIKIHBhYzczMTEJCTA5M2E6MjYyNAlQQUM3MzAyCiBwYWM3MzExCQkwOTNhOjI2MjYJTGFidGVjIDIyMDAKK3BhYzczMTEJCTA5M2E6MjYyOAlHZW5pdXMgaUxvb2sgMzAwCiBwYWM3MzExCQkwOTNhOjI2MjkJR2VuaW91cyBpU2xpbSAzMDAKIHBhYzczMTEJCTA5M2E6MjYyYQlXZWJjYW0gMzAwawogcGFjNzMxMQkJMDkzYToyNjJjCVBoaWxpcHMgU1BDIDIzMCBOQwpAQCAtMjUwLDcgKzI1Myw3IEBACiB6YzN4eAkJMGFjODozMDFiCVotU3RhciB6YzMwMWIKIHpjM3h4CQkwYWM4OjMwM2IJVmltaWNybyAweDMwM2IKIHpjM3h4CQkwYWM4OjMwNWIJWi1zdGFyIFZpbWljcm8gemMwMzA1YgotemMzeHgJCTBhYzg6MzA3YglMZGxjIFZDMzAyK092NzYyMAoremMzeHgJCTBhYzg6MzA3YglQQyBDYW1lcmEgKFpTMDIxMSkKIHZjMDMyeAkJMGFjODpjMDAxCVNvbnkgZW1iZWRkZWQgdmltaWNybwogdmMwMzJ4CQkwYWM4OmMwMDIJU29ueSBlbWJlZGRlZCB2aW1pY3JvCiB2YzAzMngJCTBhYzg6YzMwMQlTYW1zdW5nIFExIFVsdHJhIFByZW1pdW0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc2k0NzEzLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc2k0NzEzLnR4dAppbmRleCAyNWFiZGI3Li4yZTczOTJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NpNDcxMy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zaTQ3MTMudHh0CkBAIC0xNjQsNyArMTY0LDcgQEAKIAogVGhlIGRldmljZSBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSBhdmFpbGFibGUgc3ViIGNoYW5uZWxzIGZvcgogdHJhbnNtaXNzaW9uLiBUbyBkbyB0aGF0IHVzZSBTL0dfTU9EVUxBVE9SIGlvY3RsIGFuZCBjb25maWd1cmUgdHhzdWJjaGFucyBwcm9wZXJseS4KLVJlZmVyIHRvIHY0bDItc3BlYyBmb3IgcHJvcGVyIHVzZSBvZiB0aGlzIGlvY3RsLgorUmVmZXIgdG8gdGhlIFY0TDIgQVBJIHNwZWNpZmljYXRpb24gZm9yIHByb3BlciB1c2Ugb2YgdGhpcyBpb2N0bC4KIAogVGVzdGluZwogPT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96cjM2NHh4LnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvenIzNjR4eC50eHQKaW5kZXggN2YzZDE5NS4uZDk4ZTRkMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96cjM2NHh4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3pyMzY0eHgudHh0CkBAIC02NiwzICs2Niw0IEBACiAweDBhMTcgIDB4MDA0ZSAgIFBlbnRheCAgICAgICAgICBPcHRpbyA1MAogMHgwNDFlICAweDQwNWQgICBDcmVhdGl2ZSAgICAgICAgRGlWaSBDQU0gNTE2CiAweDA4Y2EgIDB4MjEwMiAgIEFpcHRlayAgICAgICAgICBEViBUMzAwCisweDA2ZDYgIDB4MDAzZCAgIFRydXN0ICAgICAgICAgICBQb3dlcmNAbSA5MTBaCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2UtdHlwZXMuYyBiL0RvY3VtZW50YXRpb24vdm0vcGFnZS10eXBlcy5jCmluZGV4IDQ3OTNjNmEuLmVhNDRlYTUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2UtdHlwZXMuYworKysgYi9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2UtdHlwZXMuYwpAQCAtMzAxLDcgKzMwMSw3IEBACiAJCXByZXNlbnQgPSAoZmxhZ3MgPj4gaSkgJiAxOwogCQlpZiAoIXBhZ2VfZmxhZ19uYW1lc1tpXSkgewogCQkJaWYgKHByZXNlbnQpCi0JCQkJZmF0YWwoInVua293biBmbGFnIGJpdCAlZFxuIiwgaSk7CisJCQkJZmF0YWwoInVua25vd24gZmxhZyBiaXQgJWRcbiIsIGkpOwogCQkJY29udGludWU7CiAJCX0KIAkJYnVmW2orK10gPSBwcmVzZW50ID8gcGFnZV9mbGFnX25hbWVzW2ldWzBdIDogJ18nOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dCBiL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQKaW5kZXggNTEwOTE3Zi4uYjM3MzAwZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0CkBAIC0yNDUsNyArMjQ1LDcgQEAKIGhhcyB0aGUgbGVuZ3RoIG9mIDggY2hhcmFjdGVycy4gSG93ZXZlciwgYSA4IGNoYXJhY3RlciBzdHJpbmcgbmVlZHMgYQogdGVybWluYXRpbmcgMC4gVGhhdCB6ZXJvIGhhcyBvdmVyd3JpdHRlbiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgUmVkem9uZSBmaWVsZC4KIEFmdGVyIHJlcG9ydGluZyB0aGUgZGV0YWlscyBvZiB0aGUgaXNzdWUgZW5jb3VudGVyZWQgdGhlIEZJWCBTTFVCIG1lc3NhZ2UKLXRlbGwgdXMgdGhhdCBTTFVCIGhhcyByZXN0b3JlZCB0aGUgUmVkem9uZSB0byBpdHMgcHJvcGVyIHZhbHVlIGFuZCB0aGVuCit0ZWxscyB1cyB0aGF0IFNMVUIgaGFzIHJlc3RvcmVkIHRoZSBSZWR6b25lIHRvIGl0cyBwcm9wZXIgdmFsdWUgYW5kIHRoZW4KIHN5c3RlbSBvcGVyYXRpb25zIGNvbnRpbnVlLgogCiBFbWVyZ2VuY3kgb3BlcmF0aW9uczoKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYzM0Zjc3Mi4uOThkNWNhMSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMyNyw2ICszMjcsMTMgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwogCitBRFQ3NDc1IEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCitNOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK0w6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3NQorRjoJZHJpdmVycy9od21vbi9hZHQ3NDc1LmMKKwogQURWQU5TWVMgU0NTSSBEUklWRVIKIE06CU1hdHRoZXcgV2lsY294IDxtYXR0aGV3QHdpbC5jeD4KIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCkBAIC00ODYsMTMgKzQ5Myw2IEBACiBGOglkcml2ZXJzL25ldC9hcHBsZXRhbGsvCiBGOgluZXQvYXBwbGV0YWxrLwogCi1BUFBMRVRPVUNIIFRPVUNIUEFEIERSSVZFUgotTToJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KLUw6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotRjoJRG9jdW1lbnRhdGlvbi9pbnB1dC9hcHBsZXRvdWNoLnR4dAotRjoJZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKLQogQVJDIEZSQU1FQlVGRkVSIERSSVZFUgogTToJSmF5YSBLdW1hciA8amF5YWxrQGludHdvcmtzLmJpej4KIFM6CU1haW50YWluZWQKQEAgLTI0MjMsNyArMjQyMyw5IEBACiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCiBXOglodHRwOi8vd3d3LmxtLXNlbnNvcnMub3JnLwogUzoJT3JwaGFuCitGOglEb2N1bWVudGF0aW9uL2h3bW9uLwogRjoJZHJpdmVycy9od21vbi8KK0Y6CWluY2x1ZGUvbGludXgvaHdtb24qLmgKIAogSEFSRFdBUkUgUkFORE9NIE5VTUJFUiBHRU5FUkFUT1IgQ09SRQogTToJTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+CkBAIC0zMTM5LDYgKzMxNDEsNyBAQAogRjoJRG9jdW1lbnRhdGlvbi9zMzkwL2t2bS50eHQKIEY6CWFyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm0qCiBGOglhcmNoL3MzOTAva3ZtLworRjoJZHJpdmVycy9zMzkwL2t2bS8KIAogS0VYRUMKIE06CUVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CkBAIC0zMzE4LDYgKzMzMjEsMTIgQEAKIEY6CURvY3VtZW50YXRpb24vaHdtb24vbGlzM2x2MDJkCiBGOglkcml2ZXJzL2h3bW9uL2xpczNsdjAyZC4qCiAKK0xNNzMgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKK006CUd1aWxsYXVtZSBMaWduZXVsIDxndWlsbGF1bWUubGlnbmV1bEBnbWFpbC5jb20+CitMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2h3bW9uL2xtNzMuYworCiBMTTgzIEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCiBNOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKQEAgLTQyMTIsNiArNDIyMSwxMyBAQAogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3Njc2kvcG1jcmFpZC4qCiAKK1BNQyBTSUVSUkEgUE04MDAxIERSSVZFUgorTToJamFja193YW5nQHVzaXNoLmNvbQorTToJbGluZGFyX2xpdUB1c2lzaC5jb20KK0w6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvc2NzaS9wbTgwMDEvCisKIFBPU0lYIENMT0NLUyBhbmQgVElNRVJTCiBNOglUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KIFM6CVN1cHBvcnRlZApAQCAtNDU3MCw2ICs0NTg2LDcgQEAKIFc6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KIFM6CVN1cHBvcnRlZAogRjoJYXJjaC9zMzkwLworRjoJZHJpdmVycy9zMzkwLwogCiBTMzkwIE5FVFdPUksgRFJJVkVSUwogTToJVXJzdWxhIEJyYXVuIDx1cnN1bGEuYnJhdW5AZGUuaWJtLmNvbT4KQEAgLTQ1ODUsNiArNDYwMiw3IEBACiBNOglSYWxwaCBXdWVydGhuZXIgPHJhbHBoLnd1ZXJ0aG5lckBkZS5pYm0uY29tPgogTToJbGludXgzOTBAZGUuaWJtLmNvbQogTDoJbGludXgtczM5MEB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9zMzkwL2NyeXB0by8KIApAQCAtNTMzNCw3ICs1MzUyLDcgQEAKIEY6CWRyaXZlcnMvc2NzaS91MTQtMzRmLmMKIAogVUJJIEZJTEUgU1lTVEVNIChVQklGUykKLU06CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kQGluZnJhZGVhZC5vcmc+CitNOglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZDFAZ21haWwuY29tPgogTToJQWRyaWFuIEh1bnRlciA8YWRyaWFuLmh1bnRlckBub2tpYS5jb20+CiBMOglsaW51eC1tdGRAbGlzdHMuaW5mcmFkZWFkLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5pbmZyYWRlYWQub3JnL3ViaWZzLTIuNi5naXQKQEAgLTUzODUsNyArNTQwMyw3IEBACiBGOglpbmNsdWRlL2xpbnV4L2Nkcm9tLmgKIAogVU5TT1JURUQgQkxPQ0sgSU1BR0VTIChVQkkpCi1NOglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZEBpbmZyYWRlYWQub3JnPgorTToJQXJ0ZW0gQml0eXV0c2tpeSA8ZGVkZWtpbmQxQGdtYWlsLmNvbT4KIFc6CWh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvCiBMOglsaW51eC1tdGRAbGlzdHMuaW5mcmFkZWFkLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5pbmZyYWRlYWQub3JnL3ViaS0yLjYuZ2l0CkBAIC01Nzg2LDYgKzU4MDQsMTQgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbmV0L3ZteG5ldDMvCiAKK1ZNd2FyZSBQVlNDU0kgZHJpdmVyCitNOglBbG9rIEthdGFyaWEgPGFrYXRhcmlhQHZtd2FyZS5jb20+CitNOglWTXdhcmUgUFYtRHJpdmVycyA8cHYtZHJpdmVyc0B2bXdhcmUuY29tPgorTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmMKK0Y6CWRyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmgKKwogVk9MVEFHRSBBTkQgQ1VSUkVOVCBSRUdVTEFUT1IgRlJBTUVXT1JLCiBNOglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogTToJTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL21tL251bWEuYyBiL2FyY2gvYWxwaGEvbW0vbnVtYS5jCmluZGV4IDEwYjQwMzUuLjdiMmM1NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbW0vbnVtYS5jCisrKyBiL2FyY2gvYWxwaGEvbW0vbnVtYS5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAl9CiAKIAlpZiAoYm9vdG1hcF9zdGFydCA9PSAtMSkKLQkJcGFuaWMoImNvdWxkbid0IGZpbmQgYSBjb250aWdvdXMgcGxhY2UgZm9yIHRoZSBib290bWFwIik7CisJCXBhbmljKCJjb3VsZG4ndCBmaW5kIGEgY29udGlndW91cyBwbGFjZSBmb3IgdGhlIGJvb3RtYXAiKTsKIAogCS8qIEFsbG9jYXRlIHRoZSBib290bWFwIGFuZCBtYXJrIHRoZSB3aG9sZSBNTSBhcyByZXNlcnZlZC4gICovCiAJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIGJvb3RtYXBfc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vc2Nvb3AuYyBiL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jCmluZGV4IDc3MTNhMDguLjM3YmRhNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jCkBAIC04Miw3ICs4Miw3IEBACiB7CiAJc3RydWN0IHNjb29wX2RldiAqc2RldiA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgc2Nvb3BfZGV2LCBncGlvKTsKIAotCS8qIFhYWDogSSdtIHVzdXJlLCAgYnV0IGl0IHNlZW1zIHNvICovCisJLyogWFhYOiBJJ20gdW5zdXJlLCBidXQgaXQgc2VlbXMgc28gKi8KIAlyZXR1cm4gaW9yZWFkMTYoc2Rldi0+YmFzZSArIFNDT09QX0dQUlIpICYgKDEgPDwgKG9mZnNldCArIDEpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9kYTgzMF9vbWFwbDEzN19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2RhODMwX29tYXBsMTM3X2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZTM4Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL2RhODMwX29tYXBsMTM3X2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEyNTQgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMi1kYXZpbmNpMQotIyBXZWQgTWF5IDEzIDE1OjMzOjI5IDIwMDkKLSMKLUNPTkZJR19BUk09eQotQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKLUNPTkZJR19HRU5FUklDX0dQSU89eQotQ09ORklHX0dFTkVSSUNfVElNRT15Ci1DT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15Ci1DT05GSUdfTU1VPXkKLSMgQ09ORklHX05PX0lPUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRUz15Ci1DT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKLUNPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15Ci1DT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKLUNPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLUNPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQotQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQotQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCi1DT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0xPQ0tfS0VSTkVMPXkKLUNPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci0jIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19TWVNWSVBDX1NZU0NUTD15Ci1DT05GSUdfUE9TSVhfTVFVRVVFPXkKLUNPTkZJR19QT1NJWF9NUVVFVUVfU1lTQ1RMPXkKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLQotIwotIyBSQ1UgU3Vic3lzdGVtCi0jCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAotQ09ORklHX0lLQ09ORklHPXkKLUNPTkZJR19JS0NPTkZJR19QUk9DPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLUNPTkZJR19SRF9HWklQPXkKLSMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0FOT05fSU5PREVTPXkKLUNPTkZJR19FTUJFRERFRD15Ci1DT05GSUdfVUlEMTY9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0lHTkFMRkQ9eQotQ09ORklHX1RJTUVSRkQ9eQotQ09ORklHX0VWRU5URkQ9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19BSU89eQotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19TTFVCX0RFQlVHPXkKLUNPTkZJR19DT01QQVRfQlJLPXkKLSMgQ09ORklHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX1NMVUI9eQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9PUFJPRklMRT15Ci0jIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0tQUk9CRVM9eQotQ09ORklHX0hBVkVfS1JFVFBST0JFUz15Ci1DT05GSUdfSEFWRV9DTEs9eQotIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKLUNPTkZJR19TTEFCSU5GTz15Ci1DT05GSUdfUlRfTVVURVhFUz15Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci1DT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15Ci1DT05GSUdfTU9EVkVSU0lPTlM9eQotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9BUz15Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCi0jIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gVHlwZQotIwotIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9LSVJLV09PRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0tTODY5NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX05TOVhYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0xPS0kgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NTVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUzNDNjRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9EQVZJTkNJPXkKLSMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1c5MFg5MDAgaXMgbm90IHNldAotQ09ORklHX0NQX0lOVEM9eQotCi0jCi0jIFRJIERhVmluY2kgSW1wbGVtZW50YXRpb25zCi0jCi0KLSMKLSMgRGFWaW5jaSBDb3JlIFR5cGUKLSMKLSMgQ09ORklHX0FSQ0hfREFWSU5DSV9ETTY0NHggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9EQVZJTkNJX0RNNjQ2eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0RBVklOQ0lfRE0zNTUgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfREFWSU5DSV9EQTgzMD15Ci0KLSMKLSMgRGFWaW5jaSBCb2FyZCBUeXBlCi0jCi1DT05GSUdfTUFDSF9EQVZJTkNJX0RBODMwX0VWTT15Ci1DT05GSUdfREFWSU5DSV9NVVg9eQotIyBDT05GSUdfREFWSU5DSV9NVVhfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfREFWSU5DSV9NVVhfV0FSTklOR1MgaXMgbm90IHNldAotQ09ORklHX0RBVklOQ0lfUkVTRVRfQ0xPQ0tTPXkKLQotIwotIyBQcm9jZXNzb3IgVHlwZQotIwotQ09ORklHX0NQVV8zMj15Ci1DT05GSUdfQ1BVX0FSTTkyNlQ9eQotQ09ORklHX0NQVV8zMnY1PXkKLUNPTkZJR19DUFVfQUJSVF9FVjVUSj15Ci1DT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15Ci1DT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQotQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQotQ09ORklHX0NQVV9UTEJfVjRXQkk9eQotQ09ORklHX0NQVV9DUDE1PXkKLUNPTkZJR19DUFVfQ1AxNV9NTVU9eQotCi0jCi0jIFByb2Nlc3NvciBGZWF0dXJlcwotIwotQ09ORklHX0FSTV9USFVNQj15Ci0jIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSD15Ci0jIENPTkZJR19DUFVfQ0FDSEVfUk9VTkRfUk9CSU4gaXMgbm90IHNldAotIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAotQ09ORklHX0NPTU1PTl9DTEtERVY9eQotCi0jCi0jIEJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBGZWF0dXJlcwotIwotQ09ORklHX1RJQ0tfT05FU0hPVD15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15Ci1DT05GSUdfVk1TUExJVF8zRz15Ci0jIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAotQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKLUNPTkZJR19QUkVFTVBUPXkKLUNPTkZJR19IWj0xMDAKLUNPTkZJR19BRUFCST15Ci0jIENPTkZJR19PQUJJX0NPTVBBVCBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9GTEFUTUVNX0hBU19IT0xFUz15Ci0jIENPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKLSMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19CT1VOQ0U9eQotQ09ORklHX1ZJUlRfVE9fQlVTPXkKLUNPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQotQ09ORklHX0hBVkVfTUxPQ0s9eQotQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15Ci1DT05GSUdfTEVEUz15Ci0jIENPTkZJR19MRURTX0NQVSBpcyBub3Qgc2V0Ci1DT05GSUdfQUxJR05NRU5UX1RSQVA9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfQ01ETElORT0iIgotIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKLSMKLSMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKLQotIwotIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KLSMKLQotIwotIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKLSMKLSMgQ09ORklHX1ZGUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCi0jCi1DT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9BT1VUPXkKLSMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLSMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVRfVFVOTkVMPW0KLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15Ci0jIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9ESUFHPXkKLUNPTkZJR19JTkVUX1RDUF9ESUFHPXkKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19DVUJJQz15Ci1DT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCi0jIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2PW0KLSMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X01JUDYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPW0KLUNPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPW0KLUNPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD1tCi0jIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAotQ09ORklHX0lQVjZfU0lUPW0KLUNPTkZJR19JUFY2X05ESVNDX05PREVUWVBFPXkKLSMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVURklMVEVSPXkKLSMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEPXkKLQotIwotIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19ORVRGSUxURVJfTkVUTElOS19RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0cgaXMgbm90IHNldAotIyBDT05GSUdfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKLQotIwotIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX05GX0RFRlJBR19JUFY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0lQNl9ORl9RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUDZfTkZfSVBUQUJMRVMgaXMgbm90IHNldAotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAotIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAotIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWPXkKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPW0KLSMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTEKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTMyNzY4Ci0jIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlTQ19ERVZJQ0VTPXkKLSMgQ09ORklHX0lDUzkzMlM0MDEgaXMgbm90IHNldAotIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lTTDI5MDAzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRUVQUk9NIHN1cHBvcnQKLSMKLUNPTkZJR19FRVBST01fQVQyND15Ci0jIENPTkZJR19FRVBST01fTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9JREU9eQotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJPW0KLUNPTkZJR19TQ1NJX0RNQT15Ci0jIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotQ09ORklHX1NDU0lfUFJPQ19GUz15Ci0KLSMKLSMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKLSMKLUNPTkZJR19CTEtfREVWX1NEPW0KLSMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAotIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAotIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCi0jCi0jIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCi0KLSMKLSMgU0NTSSBUcmFuc3BvcnRzCi0jCi0jIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0xPV0xFVkVMPXkKLSMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci1DT05GSUdfVFVOPW0KLSMgQ09ORklHX1ZFVEggaXMgbm90IHNldAotQ09ORklHX1BIWUxJQj15Ci0KLSMKLSMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKLUNPTkZJR19MWFRfUEhZPXkKLSMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTkFUSU9OQUxfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NURTEwWFAgaXMgbm90IHNldAotQ09ORklHX0xTSV9FVDEwMTFDX1BIWT15Ci0jIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci0jIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0Ci1DT05GSUdfVElfREFWSU5DSV9FTUFDPXkKLSMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVEhPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUM5MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RORVQgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKLSMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0Ci0KLSMKLSMgRW5hYmxlIFdpTUFYIChOZXR3b3JraW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRDT05TT0xFPXkKLSMgQ09ORklHX05FVENPTlNPTEVfRFlOQU1JQyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUUE9MTD15Ci1DT05GSUdfTkVUUE9MTF9UUkFQPXkKLUNPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSPXkKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9bQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX0VWREVWPW0KLUNPTkZJR19JTlBVVF9FVkJVRz1tCi0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLUNPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci1DT05GSUdfS0VZQk9BUkRfQVRLQkQ9bQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLUNPTkZJR19LRVlCT0FSRF9YVEtCRD1tCi0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAotQ09ORklHX0tFWUJPQVJEX0dQSU89eQotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9XQUNPTV9XODAwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9UU0MyMDA3IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLUNPTkZJR19TRVJJT19MSUJQUzI9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15Ci0jIENPTkZJR19WVF9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWS01FTT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTMKLUNPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTMKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLSMgQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVMgaXMgbm90IHNldAotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLUNPTkZJR19IV19SQU5ET009bQotIyBDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU0gaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLUNPTkZJR19JMkM9eQotQ09ORklHX0kyQ19CT0FSRElORk89eQotQ09ORklHX0kyQ19DSEFSREVWPXkKLUNPTkZJR19JMkNfSEVMUEVSX0FVVE89eQotCi0jCi0jIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAotIwotCi0jCi0jIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQotIwotQ09ORklHX0kyQ19EQVZJTkNJPXkKLSMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLQotIwotIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKLSMKLSMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15Ci1DT05GSUdfR1BJT0xJQj15Ci0jIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fU1lTRlMgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBtYXBwZWQgR1BJTyBleHBhbmRlcnM6Ci0jCi0KLSMKLSMgSTJDIEdQSU8gZXhwYW5kZXJzOgotIwotIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0Ci1DT05GSUdfR1BJT19QQ0Y4NTdYPW0KLQotIwotIyBQQ0kgR1BJTyBleHBhbmRlcnM6Ci0jCi0KLSMKLSMgU1BJIEdQSU8gZXhwYW5kZXJzOgotIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0Ci1DT05GSUdfV0FUQ0hET0c9eQotIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RBVklOQ0lfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0KLSMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfQVNJQzMgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAotIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAotIyBDT05GSUdfVFdMNDAzMF9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAotIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZHJpdmVycwotIwotIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci1DT05GSUdfU09VTkQ9bQotIyBDT05GSUdfU09VTkRfT1NTX0NPUkUgaXMgbm90IHNldAotQ09ORklHX1NORD1tCi1DT05GSUdfU05EX1RJTUVSPW0KLUNPTkZJR19TTkRfUENNPW0KLUNPTkZJR19TTkRfSkFDSz15Ci0jIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NSVhFUl9PU1MgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1BDTV9PU1MgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hSVElNRVIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJPXkKLUNPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQotIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0RSSVZFUlM9eQotIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfQVJNPXkKLUNPTkZJR19TTkRfU09DPW0KLUNPTkZJR19TTkRfREFWSU5DSV9TT0M9bQotQ09ORklHX1NORF9TT0NfSTJDX0FORF9TUEk9bQotIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NVVNCX0hPU1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01VU0JfUEVSSVBIRVJBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTVVTQl9PVEcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9BVDkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0ZTTF9VU0IyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX09NQVAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyNVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyN1ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9TM0MyNDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfSU1YIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfTTY2NTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfQU1ENTUzNlVEQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0ZTTF9RRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0NJMTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRklMRV9TVE9SQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTUlESV9HQURHRVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dfUFJJTlRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ0RDX0NPTVBPU0lURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NTUMgaXMgbm90IHNldAotIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0xJQj15Ci0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VSU8gaXMgbm90IHNldAotIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLSMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfRklMRV9MT0NLSU5HPXkKLUNPTkZJR19YRlNfRlM9bQotIyBDT05GSUdfWEZTX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfQVVUT0ZTNF9GUz1tCi0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDYWNoZXMKLSMKLSMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfRkFUX0ZTPXkKLUNPTkZJR19NU0RPU19GUz15Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3Ci1DT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCi0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX1NZU0NUTD15Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0NSQU1GUz15Ci0jIENPTkZJR19TUVVBU0hGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19NSU5JWF9GUz1tCi0jIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15Ci1DT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ORlNfVjM9eQotIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19ORlNEPW0KLUNPTkZJR19ORlNEX1YzPXkKLSMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9bQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci1DT05GSUdfU01CX0ZTPW0KLSMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19OTFM9eQotQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCi1DT05GSUdfTkxTX0NPREVQQUdFXzQzNz15Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAotQ09ORklHX05MU19BU0NJST1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMT15Ci0jIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0Ci1DT05GSUdfTkxTX1VURjg9bQotIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLUNPTkZJR19GUkFNRV9XQVJOPTEwMjQKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19GUz15Ci0jIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19LRVJORUw9eQotIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAotQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKLSMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKLUNPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCi1DT05GSUdfREVURUNUX0hVTkdfVEFTSz15Ci0jIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDIGlzIG5vdCBzZXQKLUNPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKLUNPTkZJR19TQ0hFRF9ERUJVRz15Ci0jIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLUNPTkZJR19USU1FUl9TVEFUUz15Ci0jIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfUFJFRU1QVD15Ci1DT05GSUdfREVCVUdfUlRfTVVURVhFUz15Ci1DT05GSUdfREVCVUdfUElfTElTVD15Ci0jIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX01VVEVYRVM9eQotIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfQlVHVkVSQk9TRT15Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAotIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAotIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAotIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAotQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKLUNPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQotCi0jCi0jIFRyYWNlcnMKLSMKLSMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9BUkNIX0tHREI9eQotIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0Ci1DT05GSUdfQVJNX1VOV0lORD15Ci1DT05GSUdfREVCVUdfVVNFUj15Ci1DT05GSUdfREVCVUdfRVJST1JTPXkKLSMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAotQ09ORklHX0NSWVBUTz15Ci0KLSMKLSMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCi0jCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAotCi0jCi0jIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQotIwotIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgbW9kZXMKLSMKLSMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKLQotIwotIyBIYXNoIG1vZGVzCi0jCi0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnZXN0Ci0jCi0jIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAotCi0jCi0jIENpcGhlcnMKLSMKLSMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29tcHJlc3Npb24KLSMKLSMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19aTElCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAotCi0jCi0jIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgotIwotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLUNPTkZJR19CSVRSRVZFUlNFPXkKLUNPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQotQ09ORklHX0NSQ19DQ0lUVD1tCi0jIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj1tCi0jIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0NSQzcgaXMgbm90IHNldAotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19aTElCX0lORkxBVEU9eQotQ09ORklHX0RFQ09NUFJFU1NfR1pJUD15Ci1DT05GSUdfR0VORVJJQ19BTExPQ0FUT1I9eQotQ09ORklHX0hBU19JT01FTT15Ci1DT05GSUdfSEFTX0lPUE9SVD15Ci1DT05GSUdfSEFTX0RNQT15Ci1DT05GSUdfTkxBVFRSPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZGE4NTBfb21hcGwxMzhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9kYTh4eF9vbWFwbF9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vY29uZmlncy9kYTg1MF9vbWFwbDEzOF9kZWZjb25maWcKcmVuYW1lIHRvIGFyY2gvYXJtL2NvbmZpZ3MvZGE4eHhfb21hcGxfZGVmY29uZmlnCmluZGV4IDg0MmE3MGIuLjUwYmQyNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZGE4NTBfb21hcGwxMzhfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvZGE4eHhfb21hcGxfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDEzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtZGF2aW5jaTEKLSMgTW9uIEp1biAyOSAwNzo1NDoxNSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzItcmM1CisjIFRodSBPY3QgMjIgMTI6MTk6MTkgMjAwOQogIwogQ09ORklHX0FSTT15CiBDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQogQ09ORklHX0dFTkVSSUNfR1BJTz15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKLUNPTkZJR19NTVU9eQotIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKQEAgLTE4LDE0ICsxNiwxNCBAQAogQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9IQVNfQ1BVRlJFUT15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfWk9ORV9ETUE9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC00OCwxMSArNDYsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTYyLDggKzYxLDcgQEAKIENPTkZJR19VU0VSX1NDSEVEPXkKICMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQpAQCAtODAsNyArNzgsNiBAQAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC05Myw2ICs5MCwxMCBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorCisjCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCisjCiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMVUJfREVCVUc9eQogQ09ORklHX0NPTVBBVF9CUks9eQpAQCAtMTAwLDEyICsxMDEsMTYgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQ0xLPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTE4LDcgKzEyMyw3IEBACiBDT05GSUdfTU9EVkVSU0lPTlM9eQogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTM5LDE5ICsxNDQsMjIgQEAKICMKICMgU3lzdGVtIFR5cGUKICMKK0NPTkZJR19NTVU9eQogIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0dFTUlOSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1RNUDNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OT01BRElLIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CkBAIC0xNjAsMjUgKzE2OCwyNyBAQAogIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVzkwWDkwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NTVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU00gaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUzNDNjRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1M1UEMxWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9VMzAwIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RBVklOQ0k9eQogIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTVNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfVzkwWDkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0JDTVJJTkcgaXMgbm90IHNldAogQ09ORklHX0NQX0lOVEM9eQogCiAjCkBAIC0xOTEsNyArMjAxLDcgQEAKICMgQ09ORklHX0FSQ0hfREFWSU5DSV9ETTY0NHggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9EQVZJTkNJX0RNMzU1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfREFWSU5DSV9ETTY0NnggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9EQVZJTkNJX0RBODMwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0RBVklOQ0lfREE4MzA9eQogQ09ORklHX0FSQ0hfREFWSU5DSV9EQTg1MD15CiBDT05GSUdfQVJDSF9EQVZJTkNJX0RBOFhYPXkKICMgQ09ORklHX0FSQ0hfREFWSU5DSV9ETTM2NSBpcyBub3Qgc2V0CkBAIC0xOTksNyArMjA5LDE0IEBACiAjCiAjIERhVmluY2kgQm9hcmQgVHlwZQogIworQ09ORklHX01BQ0hfREFWSU5DSV9EQTgzMF9FVk09eQorQ09ORklHX0RBODMwX1VJPXkKK0NPTkZJR19EQTgzMF9VSV9MQ0Q9eQorIyBDT05GSUdfREE4MzBfVUlfTkFORCBpcyBub3Qgc2V0CiBDT05GSUdfTUFDSF9EQVZJTkNJX0RBODUwX0VWTT15CitDT05GSUdfREE4NTBfVUlfRVhQPXkKK0NPTkZJR19EQTg1MF9VSV9OT05FPXkKKyMgQ09ORklHX0RBODUwX1VJX1JNSUkgaXMgbm90IHNldAogQ09ORklHX0RBVklOQ0lfTVVYPXkKICMgQ09ORklHX0RBVklOQ0lfTVVYX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RBVklOQ0lfTVVYX1dBUk5JTkdTIGlzIG5vdCBzZXQKQEAgLTIxMiw3ICsyMjksNyBAQAogQ09ORklHX0NQVV9BUk05MjZUPXkKIENPTkZJR19DUFVfMzJ2NT15CiBDT05GSUdfQ1BVX0FCUlRfRVY1VEo9eQotQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9QQUJSVF9MRUdBQ1k9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfQ09QWV9WNFdCPXkKIENPTkZJR19DUFVfVExCX1Y0V0JJPXkKQEAgLTIyNSw5ICsyNDIsOSBAQAogQ09ORklHX0FSTV9USFVNQj15CiAjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSD15CiAjIENPTkZJR19DUFVfQ0FDSEVfUk9VTkRfUk9CSU4gaXMgbm90IHNldAotIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAorQ09ORklHX0FSTV9MMV9DQUNIRV9TSElGVD01CiBDT05GSUdfQ09NTU9OX0NMS0RFVj15CiAKICMKQEAgLTI0OCwxMSArMjY1LDEyIEBACiAjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAogQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfSFo9MTAwCiBDT05GSUdfQUVBQkk9eQogIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSE9MRVNfTUVNT1JZTU9ERUwgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAogIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CkBAIC0yNjgsMTIgKzI4NiwxNCBAQAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0JPVU5DRT15CiBDT05GSUdfVklSVF9UT19CVVM9eQotQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIENPTkZJR19MRURTPXkKICMgQ09ORklHX0xFRFNfQ1BVIGlzIG5vdCBzZXQKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CisjIENPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZIGlzIG5vdCBzZXQKIAogIwogIyBCb290IG9wdGlvbnMKQEAgLTI4Nyw3ICszMDcsMjQgQEAKICMKICMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKICMKLSMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX09OREVNQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BFUkZPUk1BTkNFPW0KK0NPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFPW0KK0NPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQ9bQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0lETEU9eQorQ09ORklHX0NQVV9JRExFX0dPVl9MQURERVI9eQorQ09ORklHX0NQVV9JRExFX0dPVl9NRU5VPXkKIAogIwogIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KQEAgLTQwMSw2ICs0MzgsNyBAQAogIyBDT05GSUdfSVA2X05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQxNSw2ICs0NTMsNyBAQAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAogIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxNTQgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0RDQiBpcyBub3Qgc2V0CiAKQEAgLTQ0MCw2ICs0NzksNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKQEAgLTQ2MCw2ICs1MDAsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfTUdfRElTSyBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0lDUzkzMlM0MDEgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKQEAgLTQ3MSw2ICs1MTIsNyBAQAogIwogQ09ORklHX0VFUFJPTV9BVDI0PXkKICMgQ09ORklHX0VFUFJPTV9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldApAQCAtNDk0LDEwICs1MzYsNiBAQAogIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKICMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CkBAIC01MjIsNyArNTYwLDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC01NTMsNyArNTkwLDcgQEAKIENPTkZJR19NSUk9eQogIyBDT05GSUdfQVg4ODc5NiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAotIyBDT05GSUdfVElfREFWSU5DSV9FTUFDIGlzIG5vdCBzZXQKK0NPTkZJR19USV9EQVZJTkNJX0VNQUM9eQogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0VUSE9DIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQzkxMVggaXMgbm90IHNldApAQCAtNTY3LDEyICs2MDQsMTEgQEAKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTFfTUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC01ODgsNiArNjI0LDcgQEAKIENPTkZJR19ORVRQT0xMX1RSQVA9eQogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVI9eQogIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CiAKICMKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKQEAgLTYxMSwyMyArNjQ4LDMwIEBACiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiBDT05GSUdfS0VZQk9BUkRfQVRLQkQ9bQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FUMjE2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci1DT05GSUdfS0VZQk9BUkRfWFRLQkQ9bQotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19LRVlCT0FSRF9HUElPPXkKKyMgQ09ORklHX0tFWUJPQVJEX01BVFJJWCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9YVEtCRD1tCiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKICMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0VFVEkgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV0FDT01fVzgwMDEgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTUNTNTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKQEAgLTYzNiw2ICs2ODAsNyBAQAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9UU0MyMDA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1c5MFg5MDAgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY4NCw2ICs3MjksNyBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtNjk1LDYgKzc0MSw3IEBACiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIwogQ09ORklHX0kyQ19EQVZJTkNJPXkKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CkBAIC03MTUsMTQgKzc2MiwxNyBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9SRVFVSVJFX0dQSU9MSUI9eQogQ09ORklHX0dQSU9MSUI9eQogIyBDT05GSUdfREVCVUdfR1BJTyBpcyBub3Qgc2V0CkBAIC03MzYsOCArNzg2LDggQEAKICMgSTJDIEdQSU8gZXhwYW5kZXJzOgogIwogIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0Ci1DT05GSUdfR1BJT19QQ0Y4NTdYPW0KK0NPTkZJR19HUElPX1BDQTk1M1g9eQorQ09ORklHX0dQSU9fUENGODU3WD15CiAKICMKICMgUENJIEdQSU8gZXhwYW5kZXJzOgpAQCAtNzQ2LDExICs3OTYsMTQgQEAKICMKICMgU1BJIEdQSU8gZXhwYW5kZXJzOgogIworCisjCisjIEFDOTcgR1BJTyBleHBhbmRlcnM6CisjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTc4MiwzMSArODM1LDU2IEBACiAjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkcml2ZXJzCi0jCi0jIENPTkZJR19EQUIgaXMgbm90IHNldAorIyBDT05GSUdfQUIzMTAwX0NPUkUgaXMgbm90IHNldAorQ09ORklHX1JFR1VMQVRPUj15CisjIENPTkZJR19SRUdVTEFUT1JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1VTRVJTUEFDRV9DT05TVU1FUiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfTUFYMTU4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfTFAzOTcxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9UUFM2NTAyMyBpcyBub3Qgc2V0CitDT05GSUdfUkVHVUxBVE9SX1RQUzY1MDdYPXkKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CisjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfQ0ZCX1JFVl9QSVhFTFNfSU5fQllURSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisKKyMKKyMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkJfREE4WFg9eQorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01CODYyWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQlJPQURTSEVFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCkBAIC04MTksNiArODk3LDE2IEBACiAjCiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQorQ09ORklHX0xPR089eQorQ09ORklHX0xPR09fTElOVVhfTU9OTz15CitDT05GSUdfTE9HT19MSU5VWF9WR0ExNj15CitDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKIENPTkZJR19TT1VORD1tCiAjIENPTkZJR19TT1VORF9PU1NfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfU05EPW0KQEAgLTgzNCw2ICs5MjIsMTEgQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUkFXTUlESV9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX09QTDNfTElCX1NFUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BMNF9MSUJfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TQkFXRV9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzFfU0VRIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfRFJJVkVSUz15CiAjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKQEAgLTg0Miw2ICs5MzUsOCBAQAogQ09ORklHX1NORF9BUk09eQogQ09ORklHX1NORF9TT0M9bQogQ09ORklHX1NORF9EQVZJTkNJX1NPQz1tCisjIENPTkZJR19TTkRfREE4MzBfU09DX0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREE4NTBfU09DX0VWTSBpcyBub3Qgc2V0CiBDT05GSUdfU05EX1NPQ19JMkNfQU5EX1NQST1tCiAjIENPTkZJR19TTkRfU09DX0FMTF9DT0RFQ1MgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldApAQCAtODQ5LDE0ICs5NDQsMTcgQEAKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBUSSBWTFlOUQorIwogIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKQEAgLTg3NywxNCArOTc1LDE3IEBACiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLUNPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX1hGU19GUz1tCiAjIENPTkZJR19YRlNfUVVPVEEgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQpAQCAtOTQzLDcgKzEwNDQsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC0xMDM5LDYgKzExMzksNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTEwNTYsNiArMTE1Nyw3IEBACiAjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAogIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfUFJFRU1QVD15CiBDT05GSUdfREVCVUdfUlRfTVVURVhFUz15CiBDT05GSUdfREVCVUdfUElfTElTVD15CkBAIC0xMDc2LDI5ICsxMTc4LDI5IEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQotCi0jCi0jIFRyYWNlcnMKLSMKK0NPTkZJR19GVFJBQ0U9eQogIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldApAQCAtMTEyNSw3ICsxMjI3LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTExNTcsMTEgKzEyNTgsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9kYXZpbmNpX2FsbF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZwppbmRleCBkZGZmZTM5Li5iZDY1NmU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZwpAQCAtMSwxNCArMSwxMyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxLXJjMy1kYXZpbmNpMQotIyBGcmkgSnVsIDE3IDA4OjI2OjUyIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMi1yYzQKKyMgTW9uIE9jdCAxMiAxNDoxMzoxMiAyMDA5CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CiBDT05GSUdfR0VORVJJQ19HUElPPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQotQ09ORklHX01NVT15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CkBAIC00NiwxMSArNDUsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTkxLDE3ICs5MSwxNSBAQAogQ09ORklHX0FJTz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xVQl9ERUJVRz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiAjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKQEAgLTE0NSw2ICsxNDMsNyBAQAogIwogIyBTeXN0ZW0gVHlwZQogIworQ09ORklHX01NVT15CiAjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKQEAgLTE1OSw2ICsxNTgsNyBAQAogIyBDT05GSUdfQVJDSF9TVE1QM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05PTUFESUsgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKQEAgLTE4MSwxMSArMTgxLDEzIEBACiAjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TM0M2NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQQzFYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1UzMDAgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREFWSU5DST15CiAjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9CQ01SSU5HIGlzIG5vdCBzZXQKIENPTkZJR19BSU5UQz15CiBDT05GSUdfQVJDSF9EQVZJTkNJX0RNeD15CiAKQEAgLTIwOCw2ICsyMTAsNyBAQAogIwogQ09ORklHX01BQ0hfREFWSU5DSV9FVk09eQogQ09ORklHX01BQ0hfU0ZGU0RSPXkKK0NPTkZJR19NQUNIX05FVVJPU19PU0QyPXkKIENPTkZJR19NQUNIX0RBVklOQ0lfRE0zNTVfRVZNPXkKIENPTkZJR19NQUNIX0RNMzU1X0xFT1BBUkQ9eQogQ09ORklHX01BQ0hfREFWSU5DSV9ETTY0NjdfRVZNPXkKQEAgLTIyNCw3ICsyMjcsNyBAQAogQ09ORklHX0NQVV9BUk05MjZUPXkKIENPTkZJR19DUFVfMzJ2NT15CiBDT05GSUdfQ1BVX0FCUlRfRVY1VEo9eQotQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9QQUJSVF9MRUdBQ1k9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfQ09QWV9WNFdCPXkKIENPTkZJR19DUFVfVExCX1Y0V0JJPXkKQEAgLTIzOSw2ICsyNDIsNyBAQAogIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTiBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0wxX0NBQ0hFX1NISUZUPTUKIENPTkZJR19DT01NT05fQ0xLREVWPXkKIAogIwpAQCAtMjU5LDYgKzI2Myw4IEBACiAjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAogQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfSFo9MTAwCiBDT05GSUdfQUVBQkk9eQpAQCAtMjgwLDYgKzI4Niw3IEBACiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiBDT05GSUdfTEVEUz15CiAjIENPTkZJR19MRURTX0NQVSBpcyBub3Qgc2V0CkBAIC00MTIsNiArNDE5LDcgQEAKICMgQ09ORklHX0lQNl9ORl9JUFRBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC00NTIsNiArNDYwLDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC00NjEsOSArNDcwLDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPW0KICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC00OTksNyArNTA4LDcgQEAKIENPTkZJR19NVERfQ0ZJX0kyPXkKICMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPW0KIENPTkZJR19NVERfQ0ZJX0FNRFNURD1tCiAjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAogQ09ORklHX01URF9DRklfVVRJTD1tCkBAIC02OTQsMTIgKzcwMywxMCBAQAogIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNzM0LDYgKzc0MSw3IEBACiBDT05GSUdfTkVUUE9MTF9UUkFQPXkKIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSPXkKICMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAogCiAjCiAjIElucHV0IGRldmljZSBzdXBwb3J0CkBAIC03NDUsMTAgKzc1Myw3IEBACiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKICMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj1tCi1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfRVZERVY9bQogQ09ORklHX0lOUFVUX0VWQlVHPW0KQEAgLTc1NywxMiArNzYyLDE2IEBACiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiBDT05GSUdfS0VZQk9BUkRfQVRLQkQ9bQorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKIENPTkZJR19LRVlCT0FSRF9HUElPPXkKICMgQ09ORklHX0tFWUJPQVJEX01BVFJJWCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9MTTgzMjMgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUFYNzM1OSBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CiBDT05GSUdfS0VZQk9BUkRfWFRLQkQ9bQpAQCAtNzc3LDYgKzc4Niw3IEBACiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV0FDT01fVzgwMDEgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTUNTNTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKQEAgLTc4Nyw3ICs3OTcsMTcgQEAKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVFNDMjAwNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9XOTBYOTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9DTTEwOSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfR1BJT19ST1RBUllfRU5DT0RFUiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRE0zNTVFVk09bQorQ09ORklHX0lOUFVUX0RNMzY1RVZNPW0KIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTgyOCwxMyArODQ4LDEzIEBACiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT1tCi0jIENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC04NjgsMTMgKzg4OCwxNyBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CiBDT05GSUdfR1BJT0xJQj15CiAjIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKQEAgLTg4OSw3ICs5MTMsNyBAQAogIwogIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKICMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0Ci1DT05GSUdfR1BJT19QQ0Y4NTdYPW0KK0NPTkZJR19HUElPX1BDRjg1N1g9eQogCiAjCiAjIFBDSSBHUElPIGV4cGFuZGVyczoKQEAgLTg5OCwxMCArOTIyLDE5IEBACiAjCiAjIFNQSSBHUElPIGV4cGFuZGVyczoKICMKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CkBAIC05NTAsNiArOTgzLDcgQEAKICMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RNUDQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RNUDQyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKQEAgLTk1OSw5ICs5OTMsNyBAQAogIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC05ODgsNyArMTAyMCw3IEBACiAjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX0FTSUMzIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9ETTM1NUVWTV9NU1AgaXMgbm90IHNldAorQ09ORklHX01GRF9ETTM1NUVWTV9NU1A9eQogIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAogIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldApAQCAtOTk5LDkgKzEwMzEsMTEgQEAKICMgQ09ORklHX01GRF9UQzYzOTNYQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKICMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAxMyw5ICsxMDQ3LDkgQEAKIENPTkZJR19GSVJNV0FSRV9FRElEPXkKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKICMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CkBAIC0xMDMyLDYgKzEwNjYsNyBAQAogIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwogIwogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorQ09ORklHX0ZCX0RBVklOQ0k9eQogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUI4NjJYWCBpcyBub3Qgc2V0CkBAIC0xMTAxLDcgKzExMzYsNiBAQAogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9bQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTExMzAsNiArMTE2NCw3IEBACiBDT05GSUdfSElEX0VaS0VZPW0KICMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj1tCisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPW0KICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKQEAgLTExNzYsNiArMTIxMSw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CkBAIC0xMjY5LDYgKzEzMDUsNyBAQAogIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUX1BYQTI1WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1I4QTY2NTk3IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfUzNDX0hTT1RHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfSU1YIGlzIG5vdCBzZXQKQEAgLTEyODYsNiArMTMyMyw3IEBACiAjIENPTkZJR19VU0JfQVVESU8gaXMgbm90IHNldAogQ09ORklHX1VTQl9FVEg9bQogQ09ORklHX1VTQl9FVEhfUk5ESVM9eQorIyBDT05GSUdfVVNCX0VUSF9FRU0gaXMgbm90IHNldAogQ09ORklHX1VTQl9HQURHRVRGUz1tCiBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCiAjIENPTkZJR19VU0JfRklMRV9TVE9SQUdFX1RFU1QgaXMgbm90IHNldApAQCAtMTMxNiw4ICsxMzU0LDEwIEBACiAjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCiAjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUTUVMTUNJIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfREFWSU5DST1tCiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19ORVdfTEVEUz15CiBDT05GSUdfTEVEU19DTEFTUz1tCiAKQEAgLTEzNDUsNiArMTM4NSw3IEBACiAjCiAjIGlwdGFibGVzIHRyaWdnZXIgaXMgdW5kZXIgTmV0ZmlsdGVyIGNvbmZpZyAoTEVEIHRhcmdldCkKICMKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogQ09ORklHX1JUQ19DTEFTUz1tCiAKQEAgLTEzNzAsNiArMTQxMSw3IEBACiAjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRE0zNTVFVk0gaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKQEAgLTEzOTksOCArMTQ0MSwxMSBAQAogIwogIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFRJIFZMWU5RCisjCiAjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtMTQyOSw2ICsxNDc0LDcgQEAKICMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTE1MDAsNyArMTU0Niw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTE1OTYsNiArMTY0MSw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTYzNCwxMSArMTY4MCwxNCBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTE2NjMsNyArMTcxMiw3IEBACiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKLUNPTkZJR19BUk1fVU5XSU5EPXkKKyMgQ09ORklHX0FSTV9VTldJTkQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQogQ09ORklHX0RFQlVHX0VSUk9SUz15CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CkBAIC0xNjgxLDcgKzE3MzAsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldApAQCAtMTcxMywxMSArMTc2MSwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1X2RldmljZXMuYwppbmRleCBhNTdhZjNlLi44MDkxMTRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMKQEAgLTg2Niw2ICs4NjYsNTcgQEAKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRvdWNoc2NyZWVuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQVRNRUxfVFNBRENDKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BVE1FTF9UU0FEQ0NfTU9EVUxFKQorc3RhdGljIHU2NCB0c2FkY2NfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CitzdGF0aWMgc3RydWN0IGF0OTFfdHNhZGNjX2RhdGEgdHNhZGNjX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdHNhZGNjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTlHNDVfQkFTRV9UU0MsCisJCS5lbmQJPSBBVDkxU0FNOUc0NV9CQVNFX1RTQyArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOUc0NV9JRF9UU0MsCisJCS5lbmQJPSBBVDkxU0FNOUc0NV9JRF9UU0MsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05ZzQ1X3RzYWRjY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3RzYWRjYyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkJCS5kbWFfbWFzawkJPSAmdHNhZGNjX2RtYW1hc2ssCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmdHNhZGNjX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0c2FkY2NfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0c2FkY2NfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV90c2FkY2Moc3RydWN0IGF0OTFfdHNhZGNjX2RhdGEgKmRhdGEpCit7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BEMjAsIDApOwkvKiBBRDBfWFIgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BEMjEsIDApOwkvKiBBRDFfWEwgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BEMjIsIDApOwkvKiBBRDJfWVQgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BEMjMsIDApOwkvKiBBRDNfVEIgKi8KKworCXRzYWRjY19kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOWc0NV90c2FkY2NfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdHNhZGNjKHN0cnVjdCBhdDkxX3RzYWRjY19kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBSVFQKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwppbmRleCBkMzQ1ZjU0Li41M2FhYTk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCkBAIC02MjIsNiArNjIyLDcgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FUTUVMX1RTQURDQykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQVRNRUxfVFNBRENDX01PRFVMRSkKIHN0YXRpYyB1NjQgdHNhZGNjX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworc3RhdGljIHN0cnVjdCBhdDkxX3RzYWRjY19kYXRhIHRzYWRjY19kYXRhOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHRzYWRjY19yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC02NDIsMjIgKzY0MywyNyBAQAogCS5kZXYJCT0gewogCQkJCS5kbWFfbWFzawkJPSAmdHNhZGNjX2RtYW1hc2ssCiAJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmdHNhZGNjX2RhdGEsCiAJfSwKIAkucmVzb3VyY2UJPSB0c2FkY2NfcmVzb3VyY2VzLAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0c2FkY2NfcmVzb3VyY2VzKSwKIH07CiAKLXZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV90c2FkY2Modm9pZCkKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV90c2FkY2Moc3RydWN0IGF0OTFfdHNhZGNjX2RhdGEgKmRhdGEpCiB7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKIAlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE3LCAwKTsJLyogQUQwX1hSICovCiAJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExOCwgMCk7CS8qIEFEMV9YTCAqLwogCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTksIDApOwkvKiBBRDJfWVQgKi8KIAlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIwLCAwKTsJLyogQUQzX1RCICovCiAKKwl0c2FkY2NfZGF0YSA9ICpkYXRhOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTlybF90c2FkY2NfZGV2aWNlKTsKIH0KICNlbHNlCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdHNhZGNjKHZvaWQpIHt9Cit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdHNhZGNjKHN0cnVjdCBhdDkxX3RzYWRjY19kYXRhICpkYXRhKSB7fQogI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCmluZGV4IDFjZjRkODYuLjk4ZjlmNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKQEAgLTIyOSw2ICsyMjksMTYgQEAKIAogCiAvKgorICogVG91Y2hzY3JlZW4KKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3RzYWRjY19kYXRhIGVrX3RzYWRjY19kYXRhID0geworCS5hZGNfY2xvY2sJCT0gMzAwMDAwLAorCS5wZW5kZXRfZGVib3VuY2UJPSAweDBkLAorCS50c19zYW1wbGVfaG9sZF90aW1lCT0gMHgwYSwKK307CisKKworLyoKICAqIEdQSU8gQnV0dG9ucwogICovCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCkBAIC0zNzksNiArMzg5LDggQEAKIAlhdDkxX2FkZF9kZXZpY2VfaTJjKDAsIE5VTEwsIDApOwogCS8qIExDRCBDb250cm9sbGVyICovCiAJYXQ5MV9hZGRfZGV2aWNlX2xjZGMoJmVrX2xjZGNfZGF0YSk7CisJLyogVG91Y2ggU2NyZWVuICovCisJYXQ5MV9hZGRfZGV2aWNlX3RzYWRjYygmZWtfdHNhZGNjX2RhdGEpOwogCS8qIFB1c2ggQnV0dG9ucyAqLwogCWVrX2FkZF9kZXZpY2VfYnV0dG9ucygpOwogCS8qIEFDOTcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKaW5kZXggYmQyOGU5OC4uN2FjMjBmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKQEAgLTI0Myw2ICsyNDMsMTYgQEAKIAogCiAvKgorICogVG91Y2hzY3JlZW4KKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3RzYWRjY19kYXRhIGVrX3RzYWRjY19kYXRhID0geworCS5hZGNfY2xvY2sJCT0gMTAwMDAwMCwKKwkucGVuZGV0X2RlYm91bmNlCT0gMHgwZiwKKwkudHNfc2FtcGxlX2hvbGRfdGltZQk9IDB4MDMsCit9OworCisKKy8qCiAgKiBHUElPIEJ1dHRvbnMKICAqLwogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQpAQCAtMzEwLDcgKzMyMCw3IEBACiAJLyogQUM5NyAqLwogCWF0OTFfYWRkX2RldmljZV9hYzk3KCZla19hYzk3X2RhdGEpOwogCS8qIFRvdWNoIFNjcmVlbiBDb250cm9sbGVyICovCi0JYXQ5MV9hZGRfZGV2aWNlX3RzYWRjYygpOworCWF0OTFfYWRkX2RldmljZV90c2FkY2MoJmVrX3RzYWRjY19kYXRhKTsKIAkvKiBMRURzICovCiAJYXQ5MV9ncGlvX2xlZHMoZWtfbGVkcywgQVJSQVlfU0laRShla19sZWRzKSk7CiAJLyogUHVzaCBCdXR0b25zICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmgKaW5kZXggMjI5NWQ4MC4uYmI2ZjZhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYm9hcmQuaApAQCAtMTg3LDcgKzE4NywxMiBAQAogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9pc2kodm9pZCk7CiAKICAvKiBUb3VjaHNjcmVlbiBDb250cm9sbGVyICovCi1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3RzYWRjYyh2b2lkKTsKK3N0cnVjdCBhdDkxX3RzYWRjY19kYXRhIHsKKwl1bnNpZ25lZCBpbnQgICAgYWRjX2Nsb2NrOworCXU4CQlwZW5kZXRfZGVib3VuY2U7CisJdTgJCXRzX3NhbXBsZV9ob2xkX3RpbWU7Cit9OworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV90c2FkY2Moc3RydWN0IGF0OTFfdHNhZGNjX2RhdGEgKmRhdGEpOwogCiAvKiBDQU4gKi8KIHN0cnVjdCBhdDkxX2Nhbl9kYXRhIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL2NzcC9yZWcuaCBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL2NzcC9yZWcuaAppbmRleCBlNWY2MGJmLi41NjY1NGQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9jc3AvcmVnLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvY3NwL3JlZy5oCkBAIC0xNiw3ICsxNiw3IEBACiAvKioKICogIEBmaWxlICAgIHJlZy5oCiAqCi0qICBAYnJpZWYgICBHZW5lcmljIHJlZ2lzdGVyIGRlZmludGlvbnMgdXNlZCBpbiBDU1AKKyogIEBicmllZiAgIEdlbmVyaWMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgdXNlZCBpbiBDU1AKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9jc3AvZG1hY0h3X3ByaXYuaCBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvY3NwL2RtYWNId19wcml2LmgKaW5kZXggMzc1MDY2YS4uY2JmMzM0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9jc3AvZG1hY0h3X3ByaXYuaAorKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2NzcC9kbWFjSHdfcHJpdi5oCkBAIC04Myw3ICs4Myw3IEBACiAqICBAYnJpZWYgICBHZXQgbmV4dCBhdmFpbGFibGUgdHJhbnNhY3Rpb24gd2lkdGgKICoKICoKLSogIEByZXR1cm4gIE9uIHN1Y2VzcyAgOiBOZXh0IGF2YWlsIGFibGUgdHJhbnNhY3Rpb24gd2lkdGgKKyogIEByZXR1cm4gIE9uIHN1Y2Nlc3MgIDogTmV4dCBhdmFpbGFibGUgdHJhbnNhY3Rpb24gd2lkdGgKICogICAgICAgICAgIE9uIGZhaWx1cmUgOiBkbWFjSHdfVFJBTlNBQ1RJT05fV0lEVEhfOAogKgogKiAgQG5vdGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvY3NwL21tX2FkZHIuaCBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvY3NwL21tX2FkZHIuaAppbmRleCA4NmJiNThkLi5hZDU4Y2Y4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2NzcC9tbV9hZGRyLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9jc3AvbW1fYWRkci5oCkBAIC0xNiw3ICsxNiw3IEBACiAvKioKICogIEBmaWxlICAgIG1tX2FkZHIuaAogKgotKiAgQGJyaWVmICAgTWVtb3J5IE1hcCBhZGRyZXNzIGRlZmludGlvbnMKKyogIEBicmllZiAgIE1lbW9yeSBNYXAgYWRkcmVzcyBkZWZpbml0aW9ucwogKgogKiAgQG5vdGUKICogICAgIE5vbmUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDg0Nzk4MGMuLjFmMmM1MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtNjUxLDcgKzY1MSw3IEBACiAvKioKICogICBDcmVhdGVzIGEgZGVzY3JpcHRvciByaW5nIGZyb20gYSBtZW1vcnkgbWFwcGluZy4KICoKLSogICBAcmV0dXJuIDAgb24gc3VjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyogICBAcmV0dXJuIDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL0tjb25maWcKaW5kZXggNDA4NjZjNi4uMDMzYmZlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL0tjb25maWcKQEAgLTMyLDExICszMiwxMyBAQAogICAgICAgICBib29sICJEQTgzMC9PTUFQLUwxMzcgYmFzZWQgc3lzdGVtIgogCXNlbGVjdCBDUF9JTlRDCiAJc2VsZWN0IEFSQ0hfREFWSU5DSV9EQThYWAorCXNlbGVjdCBDUFVfRENBQ0hFX1dSSVRFVEhST1VHSCAjIG5lZWRlZCBvbiBzaWxpY29uIHJldnMgMS4wLCAxLjEKIAogY29uZmlnIEFSQ0hfREFWSU5DSV9EQTg1MAogCWJvb2wgIkRBODUwL09NQVAtTDEzOCBiYXNlZCBzeXN0ZW0iCiAJc2VsZWN0IENQX0lOVEMKIAlzZWxlY3QgQVJDSF9EQVZJTkNJX0RBOFhYCisJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKIAogY29uZmlnIEFSQ0hfREFWSU5DSV9EQThYWAogCWJvb2wKQEAgLTYzLDYgKzY1LDEzIEBACiAJICBTYXkgWSBoZXJlIHRvIHNlbGVjdCB0aGUgTHlydGVjaCBTbWFsbCBGb3JtIEZhY3RvcgogCSAgU29mdHdhcmUgRGVmaW5lZCBSYWRpbyAoU0ZGU0RSKSBib2FyZC4KIAorY29uZmlnIE1BQ0hfTkVVUk9TX09TRDIKKwlib29sICJOZXVyb3MgT1NEMiBPcGVuIFRlbGV2aXNpb24gU2V0IFRvcCBCb3giCisJZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0lfRE02NDR4CisJaGVscAorCSAgQ29uZmlndXJlIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHdoZXRoZXIgdGhlIGJvYXJkIHVzZWQKKwkgIGZvciBkZXZlbG9wbWVudCBpcyBhIE5ldXJvcyBPU0QyIE9wZW4gU2V0IFRvcCBCb3guCisKIGNvbmZpZyBNQUNIX0RBVklOQ0lfRE0zNTVfRVZNCiAJYm9vbCAiVEkgRE0zNTUgRVZNIgogCWRlZmF1bHQgQVJDSF9EQVZJTkNJX0RNMzU1CkBAIC05OCwxNiArMTA3LDY2IEBACiAJYm9vbCAiVEkgREE4MzAvT01BUC1MMTM3IFJlZmVyZW5jZSBQbGF0Zm9ybSIKIAlkZWZhdWx0IEFSQ0hfREFWSU5DSV9EQTgzMAogCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJX0RBODMwCisJc2VsZWN0IEdQSU9fUENGODU3WAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc2VsZWN0IHRoZSBUSSBEQTgzMC9PTUFQLUwxMzcgRXZhbHVhdGlvbiBNb2R1bGUuCiAKK2Nob2ljZQorCXByb21wdCAiU2VsZWN0IERBODMwL09NQVAtTDEzNyBVSSBib2FyZCBwZXJpcGhlcmFsIgorCWRlcGVuZHMgb24gTUFDSF9EQVZJTkNJX0RBODMwX0VWTQorCWhlbHAKKwkgIFRoZSBwcmVzZW5jZSBvZiBVSSBjYXJkIG9uIHRoZSBEQTgzMC9PTUFQLUwxMzcgRVZNIGlzIGRldGVjdGVkCisJICBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHN1Y2Nlc3NmdWwgcHJvYmUgb2YgdGhlIEkyQyBiYXNlZCBHUElPCisJICBleHBhbmRlciBvbiB0aGF0IGJvYXJkLiBUaGlzIG9wdGlvbiBzZWxlY3RlZCBpbiB0aGlzIG1lbnUgaGFzCisJICBhbiBlZmZlY3Qgb25seSBpbiBjYXNlIG9mIGEgc3VjY2Vzc2Z1bCBVSSBjYXJkIGRldGVjdGlvbi4KKworY29uZmlnIERBODMwX1VJX0xDRAorCWJvb2wgIkxDRCIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHVzZSB0aGUgTENEIGFzIGEgZnJhbWVidWZmZXIgb3Igc2ltcGxlIGNoYXJhY3RlcgorCSAgZGlzcGxheS4KKworY29uZmlnIERBODMwX1VJX05BTkQKKwlib29sICJOQU5EIGZsYXNoIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gdXNlIHRoZSBOQU5EIGZsYXNoLiAgRG8gbm90IGZvcmdldCB0byBzZXR1cAorCSAgdGhlIHN3aXRjaCBjb3JyZWN0bHkuCitlbmRjaG9pY2UKKwogY29uZmlnIE1BQ0hfREFWSU5DSV9EQTg1MF9FVk0KIAlib29sICJUSSBEQTg1MC9PTUFQLUwxMzggUmVmZXJlbmNlIFBsYXRmb3JtIgogCWRlZmF1bHQgQVJDSF9EQVZJTkNJX0RBODUwCiAJZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0lfREE4NTAKKwlzZWxlY3QgR1BJT19QQ0E5NTNYCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzZWxlY3QgdGhlIFRJIERBODUwL09NQVAtTDEzOCBFdmFsdWF0aW9uIE1vZHVsZS4KIAorY2hvaWNlCisJcHJvbXB0ICJTZWxlY3QgcGVyaXBoZXJhbHMgY29ubmVjdGVkIHRvIGV4cGFuZGVyIG9uIFVJIGJvYXJkIgorCWRlcGVuZHMgb24gTUFDSF9EQVZJTkNJX0RBODUwX0VWTQorCWhlbHAKKwkgIFRoZSBwcmVzZW5jZSBvZiBVc2VyIEludGVyZmFjZSAoVUkpIGNhcmQgb24gdGhlIERBODUwL09NQVAtTDEzOAorCSAgRVZNIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gc3VjY2Vzc2Z1bCBwcm9iZSBvZiB0aGUgSTJDCisJICBiYXNlZCBHUElPIGV4cGFuZGVyIG9uIHRoYXQgY2FyZC4gVGhpcyBvcHRpb24gc2VsZWN0ZWQgaW4gdGhpcworCSAgbWVudSBoYXMgYW4gZWZmZWN0IG9ubHkgaW4gY2FzZSBvZiBhIHN1Y2Nlc3NmdWwgVUkgY2FyZCBkZXRlY3Rpb24uCisKK2NvbmZpZyBEQTg1MF9VSV9OT05FCisJYm9vbCAiTm8gcGVyaXBoZXJhbCBpcyBlbmFibGVkIgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSBkbyBub3Qgd2FudCB0byBlbmFibGUgYW55IG9mIHRoZSBwZXJpcGhlcmFscyBjb25uZWN0ZWQKKwkgIHRvIFRDQTY0MTYgZXhwYW5kZXIgb24gREE4NTAvT01BUC1MMTM4IEVWTSBVSSBjYXJkCisKK2NvbmZpZyBEQTg1MF9VSV9STUlJCisJYm9vbCAiUk1JSSBFdGhlcm5ldCBQSFkiCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBSTUlJIFBIWSBvbiB0aGUgREE4NTAvT01BUC1MMTM4IEVWTS4KKwkgIFRoaXMgUEhZIGlzIGZvdW5kIG9uIHRoZSBVSSBkYXVnaHRlciBjYXJkIHRoYXQgaXMgc3VwcGxpZWQgd2l0aAorCSAgdGhlIEVWTS4KKwkgIE5PVEU6IFBsZWFzZSB0YWtlIGNhcmUgd2hpbGUgY2hvb3NpbmcgdGhpcyBvcHRpb24sIE1JSSBQSFkgd2lsbAorCSAgbm90IGJlIGZ1bmN0aW9uYWwgaWYgUk1JSSBtb2RlIGlzIHNlbGVjdGVkLgorCitlbmRjaG9pY2UKKwogY29uZmlnIERBVklOQ0lfTVVYCiAJYm9vbCAiREFWSU5DSSBtdWx0aXBsZXhpbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL01ha2VmaWxlCmluZGV4IDJlMTFlODQuLmVlYjkyMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvTWFrZWZpbGUKQEAgLTIzLDkgKzIzLDE0IEBACiAjIEJvYXJkIHNwZWNpZmljCiBvYmotJChDT05GSUdfTUFDSF9EQVZJTkNJX0VWTSkgIAkrPSBib2FyZC1kbTY0NHgtZXZtLm8KIG9iai0kKENPTkZJR19NQUNIX1NGRlNEUikJCSs9IGJvYXJkLXNmZnNkci5vCitvYmotJChDT05GSUdfTUFDSF9ORVVST1NfT1NEMikJCSs9IGJvYXJkLW5ldXJvcy1vc2QyLm8KIG9iai0kKENPTkZJR19NQUNIX0RBVklOQ0lfRE0zNTVfRVZNKQkrPSBib2FyZC1kbTM1NS1ldm0ubwogb2JqLSQoQ09ORklHX01BQ0hfRE0zNTVfTEVPUEFSRCkJKz0gYm9hcmQtZG0zNTUtbGVvcGFyZC5vCiBvYmotJChDT05GSUdfTUFDSF9EQVZJTkNJX0RNNjQ2N19FVk0pCSs9IGJvYXJkLWRtNjQ2eC1ldm0ubwogb2JqLSQoQ09ORklHX01BQ0hfREFWSU5DSV9ETTM2NV9FVk0pCSs9IGJvYXJkLWRtMzY1LWV2bS5vCiBvYmotJChDT05GSUdfTUFDSF9EQVZJTkNJX0RBODMwX0VWTSkJKz0gYm9hcmQtZGE4MzAtZXZtLm8KIG9iai0kKENPTkZJR19NQUNIX0RBVklOQ0lfREE4NTBfRVZNKQkrPSBib2FyZC1kYTg1MC1ldm0ubworCisjIFBvd2VyIE1hbmFnZW1lbnQKK29iai0kKENPTkZJR19DUFVfRlJFUSkJCQkrPSBjcHVmcmVxLm8KK29iai0kKENPTkZJR19DUFVfSURMRSkJCQkrPSBjcHVpZGxlLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTgzMC1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTgzMC1ldm0uYwppbmRleCBiZmJiNjM5Li4zMWRjOTkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4MzAtZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODMwLWV2bS5jCkBAIC0xMCw1MSArMTAsMTk0IEBACiAgKiBvciBpbXBsaWVkLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjZjg1N3guaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvYXQyNC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvY3BfaW50Yy5oPgorI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9uYW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9kYTh4eC5oPgotI2luY2x1ZGUgPG1hY2gvYXNwLmg+CisjaW5jbHVkZSA8bWFjaC91c2IuaD4KIAogI2RlZmluZSBEQTgzMF9FVk1fUEhZX01BU0sJCTB4MAogI2RlZmluZSBEQTgzMF9FVk1fTURJT19GUkVRVUVOQ1kJMjIwMDAwMAkvKiBQSFkgYnVzIGZyZXF1ZW5jeSAqLwogCi1zdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBkYTgzMF9ldm1faTJjX2VlcHJvbV9pbmZvID0gewotCS5ieXRlX2xlbgk9IFNaXzI1NksgLyA4LAotCS5wYWdlX3NpemUJPSA2NCwKLQkuZmxhZ3MJCT0gQVQyNF9GTEFHX0FERFIxNiwKLQkuc2V0dXAJCT0gZGF2aW5jaV9nZXRfbWFjX2FkZHIsCi0JLmNvbnRleHQJPSAodm9pZCAqKTB4N2YwMCwKKyNkZWZpbmUgREE4MzBfRU1JRjI1X0FTWU5DX0RBVEFfQ0UzX0JBU0UJMHg2MjAwMDAwMAorI2RlZmluZSBEQTgzMF9FTUlGMjVfQ09OVFJPTF9CQVNFCQkweDY4MDAwMDAwCisKKy8qCisgKiBVU0IxIFZCVVMgaXMgY29udHJvbGxlZCBieSBHUElPMVsxNV0sIG92ZXItY3VycmVudCBpcyByZXBvcnRlZCBvbiBHUElPMls0XS4KKyAqLworI2RlZmluZSBPTl9CRF9VU0JfRFJWCUdQSU9fVE9fUElOKDEsIDE1KQorI2RlZmluZSBPTl9CRF9VU0JfT1ZDCUdQSU9fVE9fUElOKDIsIDQpCisKK3N0YXRpYyBjb25zdCBzaG9ydCBkYTgzMF9ldm1fdXNiMTFfcGluc1tdID0geworCURBODMwX0dQSU8xXzE1LCBEQTgzMF9HUElPMl80LAorCS0xCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgZGE4MzBfZXZtX2kyY19kZXZpY2VzW10gPSB7Ci0JewotCQlJMkNfQk9BUkRfSU5GTygiMjRjMjU2IiwgMHg1MCksCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJmRhODMwX2V2bV9pMmNfZWVwcm9tX2luZm8sCi0JfSwKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJ0bHYzMjBhaWMzeCIsIDB4MTgpLAorc3RhdGljIGRhOHh4X29jaWNfaGFuZGxlcl90IGRhODMwX2V2bV91c2Jfb2NpY19oYW5kbGVyOworCitzdGF0aWMgaW50IGRhODMwX2V2bV91c2Jfc2V0X3Bvd2VyKHVuc2lnbmVkIHBvcnQsIGludCBvbikKK3sKKwlncGlvX3NldF92YWx1ZShPTl9CRF9VU0JfRFJWLCBvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE4MzBfZXZtX3VzYl9nZXRfcG93ZXIodW5zaWduZWQgcG9ydCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoT05fQkRfVVNCX0RSVik7Cit9CisKK3N0YXRpYyBpbnQgZGE4MzBfZXZtX3VzYl9nZXRfb2NpKHVuc2lnbmVkIHBvcnQpCit7CisJcmV0dXJuICFncGlvX2dldF92YWx1ZShPTl9CRF9VU0JfT1ZDKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRhODMwX2V2bV91c2Jfb2NpY19pcnEoaW50LCB2b2lkICopOworCitzdGF0aWMgaW50IGRhODMwX2V2bV91c2Jfb2NpY19ub3RpZnkoZGE4eHhfb2NpY19oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlpbnQgaXJxIAk9IGdwaW9fdG9faXJxKE9OX0JEX1VTQl9PVkMpOworCWludCBlcnJvcgk9IDA7CisKKwlpZiAoaGFuZGxlciAhPSBOVUxMKSB7CisJCWRhODMwX2V2bV91c2Jfb2NpY19oYW5kbGVyID0gaGFuZGxlcjsKKworCQllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgZGE4MzBfZXZtX3VzYl9vY2ljX2lycSwgSVJRRl9ESVNBQkxFRCB8CisJCQkJICAgIElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkgICAgIk9IQ0kgb3Zlci1jdXJyZW50IGluZGljYXRvciIsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgcmVxdWVzdCBJUlEgdG8gd2F0Y2ggIgorCQkJICAgICAgICJvdmVyLWN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZXNcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UKKwkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBkYTh4eF9vaGNpX3Jvb3RfaHViIGRhODMwX2V2bV91c2IxMV9wZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCT0gZGE4MzBfZXZtX3VzYl9zZXRfcG93ZXIsCisJLmdldF9wb3dlcgk9IGRhODMwX2V2bV91c2JfZ2V0X3Bvd2VyLAorCS5nZXRfb2NpCT0gZGE4MzBfZXZtX3VzYl9nZXRfb2NpLAorCS5vY2ljX25vdGlmeQk9IGRhODMwX2V2bV91c2Jfb2NpY19ub3RpZnksCisKKwkvKiBUUFMyMDY1IHN3aXRjaCBAIDVWICovCisJLnBvdHBndAkJPSAoMyArIDEpIC8gMiwJLyogMyBtcyBtYXggKi8KK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkYTgzMF9ldm1fdXNiX29jaWNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlkYTgzMF9ldm1fdXNiX29jaWNfaGFuZGxlcigmZGE4MzBfZXZtX3VzYjExX3BkYXRhLCAxKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBkYTgzMF9ldm1fdXNiX2luaXQodm9pZCkKK3sKKwl1MzIgY2ZnY2hpcDI7CisJaW50IHJldDsKKworCS8qCisJICogU2V0IHVwIFVTQiBjbG9jay9tb2RlIGluIHRoZSBDRkdDSElQMiByZWdpc3Rlci4KKwkgKiBGWUk6ICBDRkdDSElQMiBpcyAweDAwMDBlZjAwIGluaXRpYWxseS4KKwkgKi8KKwljZmdjaGlwMiA9IF9fcmF3X3JlYWRsKERBOFhYX1NZU0NGR19WSVJUKERBOFhYX0NGR0NISVAyX1JFRykpOworCisJLyogVVNCMi4wIFBIWSByZWZlcmVuY2UgY2xvY2sgaXMgMjQgTUh6ICovCisJY2ZnY2hpcDIgJj0gfkNGR0NISVAyX1JFRkZSRVE7CisJY2ZnY2hpcDIgfD0gIENGR0NISVAyX1JFRkZSRVFfMjRNSFo7CisKKwkvKgorCSAqIFNlbGVjdCBpbnRlcm5hbCByZWZlcmVuY2UgY2xvY2sgZm9yIFVTQiAyLjAgUEhZCisJICogYW5kIHVzZSBpdCBhcyBhIGNsb2NrIHNvdXJjZSBmb3IgVVNCIDEuMSBQSFkKKwkgKiAodGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nIGFueXdheSkuCisJICovCisJY2ZnY2hpcDIgJj0gfkNGR0NISVAyX1VTQjFQSFlDTEtNVVg7CisJY2ZnY2hpcDIgfD0gIENGR0NISVAyX1VTQjJQSFlDTEtNVVg7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gb3ZlcnJpZGUgVkJVUy9JRCBzaWduYWxzIHdoZW4gTVVTQiBpcyBjb25maWd1cmVkIGludG8gdGhlCisJICogaG9zdC1vbmx5IG1vZGUgLS0gSUQgcGluIHdpbGwgZmxvYXQgaWYgbm8gY2FibGUgaXMgY29ubmVjdGVkLCBzbyB0aGUKKwkgKiBjb250cm9sbGVyIHdvbid0IGJlIGFibGUgdG8gZHJpdmUgVkJVUyB0aGlua2luZyB0aGF0IGl0J3MgYSBCLWRldmljZS4KKwkgKiBPdGhlcndpc2UsIHdlIHdhbnQgdG8gdXNlIHRoZSBPVEcgbW9kZSBhbmQgZW5hYmxlIFZCVVMgY29tcGFyYXRvcnMuCisJICovCisJY2ZnY2hpcDIgJj0gfkNGR0NISVAyX09UR01PREU7CisjaWZkZWYJQ09ORklHX1VTQl9NVVNCX0hPU1QKKwljZmdjaGlwMiB8PSAgQ0ZHQ0hJUDJfRk9SQ0VfSE9TVDsKKyNlbHNlCisJY2ZnY2hpcDIgfD0gIENGR0NISVAyX1NFU0VOREVOIHwgQ0ZHQ0hJUDJfVkJEVENURU47CisjZW5kaWYKKworCV9fcmF3X3dyaXRlbChjZmdjaGlwMiwgREE4WFhfU1lTQ0ZHX1ZJUlQoREE4WFhfQ0ZHQ0hJUDJfUkVHKSk7CisKKwkvKiBVU0JfUkVGQ0xLSU4gaXMgbm90IHVzZWQuICovCisJcmV0ID0gZGF2aW5jaV9jZmdfcmVnKERBODMwX1VTQjBfRFJWVkJVUyk7CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiJXM6IFVTQiAyLjAgUGluTXV4IHNldHVwIGZhaWxlZDogJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgcmV0KTsKKwllbHNlIHsKKwkJLyoKKwkJICogVFBTMjA2NSBzd2l0Y2ggQCA1ViBzdXBwbGllcyAxIEEgKHN1c3RhaW5zIDEuNSBBKSwKKwkJICogd2l0aCB0aGUgcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0aW1lIG9mIDMgbXMuCisJCSAqLworCQlyZXQgPSBkYTh4eF9yZWdpc3Rlcl91c2IyMCgxMDAwLCAzKTsKKwkJaWYgKHJldCkKKwkJCXByX3dhcm5pbmcoIiVzOiBVU0IgMi4wIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAorCQkJCSAgIF9fZnVuY19fLCByZXQpOwogCX0KLX07CiAKLXN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9pMmNfcGxhdGZvcm1fZGF0YSBkYTgzMF9ldm1faTJjXzBfcGRhdGEgPSB7Ci0JLmJ1c19mcmVxCT0gMTAwLAkvKiBrSHogKi8KLQkuYnVzX2RlbGF5CT0gMCwJLyogdXNlYyAqLwotfTsKKwlyZXQgPSBkYTh4eF9waW5tdXhfc2V0dXAoZGE4MzBfZXZtX3VzYjExX3BpbnMpOworCWlmIChyZXQpIHsKKwkJcHJfd2FybmluZygiJXM6IFVTQiAxLjEgUGluTXV4IHNldHVwIGZhaWxlZDogJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGdwaW9fcmVxdWVzdChPTl9CRF9VU0JfRFJWLCAiT05fQkRfVVNCX0RSViIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyBmb3IgVVNCIDEuMSBwb3J0ICIKKwkJICAgICAgICJwb3dlciBjb250cm9sOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybjsKKwl9CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE9OX0JEX1VTQl9EUlYsIDApOworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KE9OX0JEX1VTQl9PVkMsICJPTl9CRF9VU0JfT1ZDIik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVxdWVzdCBHUElPIGZvciBVU0IgMS4xIHBvcnQgIgorCQkgICAgICAgIm92ZXItY3VycmVudCBpbmRpY2F0b3I6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuOworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChPTl9CRF9VU0JfT1ZDKTsKKworCXJldCA9IGRhOHh4X3JlZ2lzdGVyX3VzYjExKCZkYTgzMF9ldm1fdXNiMTFfcGRhdGEpOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoIiVzOiBVU0IgMS4xIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAorCQkJICAgX19mdW5jX18sIHJldCk7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV91YXJ0X2NvbmZpZyBkYTgzMF9ldm1fdWFydF9jb25maWcgX19pbml0ZGF0YSA9IHsKIAkuZW5hYmxlZF91YXJ0cyA9IDB4NywKIH07CiAKK3N0YXRpYyBjb25zdCBzaG9ydCBkYTgzMF9ldm1fbWNhc3AxX3BpbnNbXSA9IHsKKwlEQTgzMF9BSENMS1gxLCBEQTgzMF9BQ0xLWDEsIERBODMwX0FGU1gxLCBEQTgzMF9BSENMS1IxLCBEQTgzMF9BRlNSMSwKKwlEQTgzMF9BTVVURTEsIERBODMwX0FYUjFfMCwgREE4MzBfQVhSMV8xLCBEQTgzMF9BWFIxXzIsIERBODMwX0FYUjFfNSwKKwlEQTgzMF9BQ0xLUjEsIERBODMwX0FYUjFfNiwgREE4MzBfQVhSMV83LCBEQTgzMF9BWFIxXzgsIERBODMwX0FYUjFfMTAsCisJREE4MzBfQVhSMV8xMSwKKwktMQorfTsKKwogc3RhdGljIHU4IGRhODMwX2lpc19zZXJpYWxpemVyX2RpcmVjdGlvbltdID0gewogCVJYX01PREUsCUlOQUNUSVZFX01PREUsCUlOQUNUSVZFX01PREUsCUlOQUNUSVZFX01PREUsCiAJSU5BQ1RJVkVfTU9ERSwJVFhfTU9ERSwJSU5BQ1RJVkVfTU9ERSwJSU5BQ1RJVkVfTU9ERSwKQEAgLTc0LDYgKzIxNywyNzEgQEAKIAkucnhudW1ldnQJPSAxLAogfTsKIAorLyoKKyAqIEdQSU8yWzFdIGlzIHVzZWQgYXMgTU1DX1NEX1dQIGFuZCBHUElPMlsyXSBhcyBNTUNfU0RfSU5TLgorICovCitzdGF0aWMgY29uc3Qgc2hvcnQgZGE4MzBfZXZtX21tY19zZF9waW5zW10gPSB7CisJREE4MzBfTU1DU0RfREFUXzAsIERBODMwX01NQ1NEX0RBVF8xLCBEQTgzMF9NTUNTRF9EQVRfMiwKKwlEQTgzMF9NTUNTRF9EQVRfMywgREE4MzBfTU1DU0RfREFUXzQsIERBODMwX01NQ1NEX0RBVF81LAorCURBODMwX01NQ1NEX0RBVF82LCBEQTgzMF9NTUNTRF9EQVRfNywgREE4MzBfTU1DU0RfQ0xLLAorCURBODMwX01NQ1NEX0NNRCwgICBEQTgzMF9HUElPMl8xLCAgICAgREE4MzBfR1BJTzJfMiwKKwktMQorfTsKKworI2RlZmluZSBEQTgzMF9NTUNTRF9XUF9QSU4JCUdQSU9fVE9fUElOKDIsIDEpCisKK3N0YXRpYyBpbnQgZGE4MzBfZXZtX21tY19nZXRfcm8oaW50IGluZGV4KQoreworCXJldHVybiBncGlvX2dldF92YWx1ZShEQTgzMF9NTUNTRF9XUF9QSU4pOworfQorCitzdGF0aWMgc3RydWN0IGRhdmluY2lfbW1jX2NvbmZpZyBkYTgzMF9ldm1fbW1jX2NvbmZpZyA9IHsKKwkuZ2V0X3JvCQkJPSBkYTgzMF9ldm1fbW1jX2dldF9ybywKKwkud2lyZXMJCQk9IDQsCisJLm1heF9mcmVxCQk9IDUwMDAwMDAwLAorCS5jYXBzCQkJPSBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCwKKwkudmVyc2lvbgkJPSBNTUNfQ1RMUl9WRVJTSU9OXzIsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZGE4MzBfZXZtX2luaXRfbW1jKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRhOHh4X3Bpbm11eF9zZXR1cChkYTgzMF9ldm1fbW1jX3NkX3BpbnMpOworCWlmIChyZXQpIHsKKwkJcHJfd2FybmluZygiZGE4MzBfZXZtX2luaXQ6IG1tYy9zZCBtdXggc2V0dXAgZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KERBODMwX01NQ1NEX1dQX1BJTiwgIk1NQyBXUCIpOworCWlmIChyZXQpIHsKKwkJcHJfd2FybmluZygiZGE4MzBfZXZtX2luaXQ6IGNhbiBub3Qgb3BlbiBHUElPICVkXG4iLAorCQkJICAgREE4MzBfTU1DU0RfV1BfUElOKTsKKwkJcmV0dXJuOworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChEQTgzMF9NTUNTRF9XUF9QSU4pOworCisJcmV0ID0gZGE4eHhfcmVnaXN0ZXJfbW1jc2QwKCZkYTgzMF9ldm1fbW1jX2NvbmZpZyk7CisJaWYgKHJldCkgeworCQlwcl93YXJuaW5nKCJkYTgzMF9ldm1faW5pdDogbW1jL3NkIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAorCQkJCXJldCk7CisJCWdwaW9fZnJlZShEQTgzMF9NTUNTRF9XUF9QSU4pOworCX0KK30KKworLyoKKyAqIFVJIGJvYXJkIE5BTkQvTk9SIGZsYXNoZXMgb25seSB1c2UgOC1iaXQgZGF0YSBidXMuCisgKi8KK3N0YXRpYyBjb25zdCBzaG9ydCBkYTgzMF9ldm1fZW1pZjI1X3BpbnNbXSA9IHsKKwlEQTgzMF9FTUFfRF8wLCBEQTgzMF9FTUFfRF8xLCBEQTgzMF9FTUFfRF8yLCBEQTgzMF9FTUFfRF8zLAorCURBODMwX0VNQV9EXzQsIERBODMwX0VNQV9EXzUsIERBODMwX0VNQV9EXzYsIERBODMwX0VNQV9EXzcsCisJREE4MzBfRU1BX0FfMCwgREE4MzBfRU1BX0FfMSwgREE4MzBfRU1BX0FfMiwgREE4MzBfRU1BX0FfMywKKwlEQTgzMF9FTUFfQV80LCBEQTgzMF9FTUFfQV81LCBEQTgzMF9FTUFfQV82LCBEQTgzMF9FTUFfQV83LAorCURBODMwX0VNQV9BXzgsIERBODMwX0VNQV9BXzksIERBODMwX0VNQV9BXzEwLCBEQTgzMF9FTUFfQV8xMSwKKwlEQTgzMF9FTUFfQV8xMiwgREE4MzBfRU1BX0JBXzAsIERBODMwX0VNQV9CQV8xLCBEQTgzMF9ORU1BX1dFLAorCURBODMwX05FTUFfQ1NfMiwgREE4MzBfTkVNQV9DU18zLCBEQTgzMF9ORU1BX09FLCBEQTgzMF9FTUFfV0FJVF8wLAorCS0xCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX0RBVklOQ0kpIHx8IGRlZmluZWQoQ09ORklHX01NQ19EQVZJTkNJX01PRFVMRSkKKyNkZWZpbmUgSEFTX01NQwkxCisjZWxzZQorI2RlZmluZSBIQVNfTU1DCTAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RBODMwX1VJX05BTkQKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYTgzMF9ldm1fbmFuZF9wYXJ0aXRpb25zW10gPSB7CisJLyogYm9vdGxvYWRlciAoVS1Cb290LCBldGMpIGluIGZpcnN0IHNlY3RvciAqLworCVswXSA9IHsKKwkJLm5hbWUJCT0gImJvb3Rsb2FkZXIiLAorCQkub2Zmc2V0CQk9IDAsCisJCS5zaXplCQk9IFNaXzEyOEssCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwJLyogZm9yY2UgcmVhZC1vbmx5ICovCisJfSwKKwkvKiBib290bG9hZGVyIHBhcmFtcyBpbiB0aGUgbmV4dCBzZWN0b3IgKi8KKwlbMV0gPSB7CisJCS5uYW1lCQk9ICJwYXJhbXMiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJCT0gU1pfMTI4SywKKwkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAkvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCS8qIGtlcm5lbCAqLworCVsyXSA9IHsKKwkJLm5hbWUJCT0gImtlcm5lbCIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQkJPSBTWl8yTSwKKwkJLm1hc2tfZmxhZ3MJPSAwLAorCX0sCisJLyogZmlsZSBzeXN0ZW0gKi8KKwlbM10gPSB7CisJCS5uYW1lCQk9ICJmaWxlc3lzdGVtIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5tYXNrX2ZsYWdzCT0gMCwKKwl9Cit9OworCisvKiBmbGFzaCBiYnQgZGVjcmlwdG9ycyAqLworc3RhdGljIHVpbnQ4X3QgZGE4MzBfZXZtX25hbmRfYmJ0X3BhdHRlcm5bXSA9IHsgJ0InLCAnYicsICd0JywgJzAnIH07CitzdGF0aWMgdWludDhfdCBkYTgzMF9ldm1fbmFuZF9taXJyb3JfcGF0dGVybltdID0geyAnMScsICd0JywgJ2InLCAnQicgfTsKKworc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBkYTgzMF9ldm1fbmFuZF9iYnRfbWFpbl9kZXNjciA9IHsKKwkub3B0aW9ucwk9IE5BTkRfQkJUX0xBU1RCTE9DSyB8IE5BTkRfQkJUX0NSRUFURSB8CisJCQkgIE5BTkRfQkJUX1dSSVRFIHwgTkFORF9CQlRfMkJJVCB8CisJCQkgIE5BTkRfQkJUX1ZFUlNJT04gfCBOQU5EX0JCVF9QRVJDSElQLAorCS5vZmZzCQk9IDIsCisJLmxlbgkJPSA0LAorCS52ZXJvZmZzCT0gMTYsCisJLm1heGJsb2Nrcwk9IDQsCisJLnBhdHRlcm4JPSBkYTgzMF9ldm1fbmFuZF9iYnRfcGF0dGVybgorfTsKKworc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBkYTgzMF9ldm1fbmFuZF9iYnRfbWlycm9yX2Rlc2NyID0geworCS5vcHRpb25zCT0gTkFORF9CQlRfTEFTVEJMT0NLIHwgTkFORF9CQlRfQ1JFQVRFIHwKKwkJCSAgTkFORF9CQlRfV1JJVEUgfCBOQU5EX0JCVF8yQklUIHwKKwkJCSAgTkFORF9CQlRfVkVSU0lPTiB8IE5BTkRfQkJUX1BFUkNISVAsCisJLm9mZnMJCT0gMiwKKwkubGVuCQk9IDQsCisJLnZlcm9mZnMJPSAxNiwKKwkubWF4YmxvY2tzCT0gNCwKKwkucGF0dGVybgk9IGRhODMwX2V2bV9uYW5kX21pcnJvcl9wYXR0ZXJuCit9OworCitzdGF0aWMgc3RydWN0IGRhdmluY2lfbmFuZF9wZGF0YSBkYTgzMF9ldm1fbmFuZF9wZGF0YSA9IHsKKwkucGFydHMJCT0gZGE4MzBfZXZtX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGRhODMwX2V2bV9uYW5kX3BhcnRpdGlvbnMpLAorCS5lY2NfbW9kZQk9IE5BTkRfRUNDX0hXLAorCS5lY2NfYml0cwk9IDQsCisJLm9wdGlvbnMJPSBOQU5EX1VTRV9GTEFTSF9CQlQsCisJLmJidF90ZAkJPSAmZGE4MzBfZXZtX25hbmRfYmJ0X21haW5fZGVzY3IsCisJLmJidF9tZAkJPSAmZGE4MzBfZXZtX25hbmRfYmJ0X21pcnJvcl9kZXNjciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGE4MzBfZXZtX25hbmRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0gewkJLyogRmlyc3QgbWVtb3J5IHJlc291cmNlIGlzIE5BTkQgSS9PIHdpbmRvdyAqLworCQkuc3RhcnQJPSBEQTgzMF9FTUlGMjVfQVNZTkNfREFUQV9DRTNfQkFTRSwKKwkJLmVuZAk9IERBODMwX0VNSUYyNV9BU1lOQ19EQVRBX0NFM19CQVNFICsgUEFHRV9TSVpFIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CQkvKiBTZWNvbmQgbWVtb3J5IHJlc291cmNlIGlzIEFFTUlGIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJCS5zdGFydAk9IERBODMwX0VNSUYyNV9DT05UUk9MX0JBU0UsCisJCS5lbmQJPSBEQTgzMF9FTUlGMjVfQ09OVFJPTF9CQVNFICsgU1pfMzJLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhODMwX2V2bV9uYW5kX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZGF2aW5jaV9uYW5kIiwKKwkuaWQJCT0gMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZGE4MzBfZXZtX25hbmRfcGRhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZGE4MzBfZXZtX25hbmRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBkYTgzMF9ldm1fbmFuZF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZGE4MzBfZXZtX2luaXRfbmFuZChpbnQgbXV4X21vZGUpCit7CisJaW50IHJldDsKKworCWlmIChIQVNfTU1DKSB7CisJCXByX3dhcm5pbmcoIldBUk5JTkc6IGJvdGggTU1DL1NEIGFuZCBOQU5EIGFyZSAiCisJCQkJImVuYWJsZWQsIGJ1dCB0aGV5IHNoYXJlIEFFTUlGIHBpbnMuXG4iCisJCQkJIlx0RGlzYWJsZSBNTUMvU0QgZm9yIE5BTkQgc3VwcG9ydC5cbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gZGE4eHhfcGlubXV4X3NldHVwKGRhODMwX2V2bV9lbWlmMjVfcGlucyk7CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiZGE4MzBfZXZtX2luaXQ6IGVtaWYyNSBtdXggc2V0dXAgZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkYTgzMF9ldm1fbmFuZF9kZXZpY2UpOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoImRhODMwX2V2bV9pbml0OiBOQU5EIGRldmljZSBub3QgcmVnaXN0ZXJlZC5cbiIpOworCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG11eF9tb2RlLCAxKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGE4MzBfZXZtX2luaXRfbmFuZChpbnQgbXV4X21vZGUpIHsgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfREE4MzBfVUlfTENECitzdGF0aWMgaW5saW5lIHZvaWQgZGE4MzBfZXZtX2luaXRfbGNkYyhpbnQgbXV4X21vZGUpCit7CisJaW50IHJldDsKKworCXJldCA9IGRhOHh4X3Bpbm11eF9zZXR1cChkYTgzMF9sY2RjbnRsX3BpbnMpOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoImRhODMwX2V2bV9pbml0OiBsY2RjbnRsIG11eCBzZXR1cCBmYWlsZWQ6ICVkXG4iLAorCQkJCXJldCk7CisKKwlyZXQgPSBkYTh4eF9yZWdpc3Rlcl9sY2RjKCZzaGFycF9sY2QwMzVxM2RnMDFfcGRhdGEpOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoImRhODMwX2V2bV9pbml0OiBsY2Qgc2V0dXAgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdXhfbW9kZSwgMCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRhODMwX2V2bV9pbml0X2xjZGMoaW50IG11eF9tb2RlKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBkYTgzMF9ldm1faTJjX2VlcHJvbV9pbmZvID0geworCS5ieXRlX2xlbgk9IFNaXzI1NksgLyA4LAorCS5wYWdlX3NpemUJPSA2NCwKKwkuZmxhZ3MJCT0gQVQyNF9GTEFHX0FERFIxNiwKKwkuc2V0dXAJCT0gZGF2aW5jaV9nZXRfbWFjX2FkZHIsCisJLmNvbnRleHQJPSAodm9pZCAqKTB4N2YwMCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRhODMwX2V2bV91aV9leHBhbmRlcl9zZXR1cChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQlpbnQgZ3BpbywgdW5zaWduZWQgbmdwaW8sIHZvaWQgKmNvbnRleHQpCit7CisJZ3Bpb19yZXF1ZXN0KGdwaW8gKyA2LCAiVUkgTVVYX01PREUiKTsKKworCS8qIERyaXZlIG11eCBtb2RlIGxvdyB0byBtYXRjaCB0aGUgZGVmYXVsdCB3aXRob3V0IFVJIGNhcmQgKi8KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIDYsIDApOworCisJZGE4MzBfZXZtX2luaXRfbGNkYyhncGlvICsgNik7CisKKwlkYTgzMF9ldm1faW5pdF9uYW5kKGdwaW8gKyA2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhODMwX2V2bV91aV9leHBhbmRlcl90ZWFyZG93bihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgZ3BpbywKKwkJdW5zaWduZWQgbmdwaW8sIHZvaWQgKmNvbnRleHQpCit7CisJZ3Bpb19mcmVlKGdwaW8gKyA2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2Y4NTd4X3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBkYTgzMF9ldm1fdWlfZXhwYW5kZXJfaW5mbyA9IHsKKwkuZ3Bpb19iYXNlCT0gREFWSU5DSV9OX0dQSU8sCisJLnNldHVwCQk9IGRhODMwX2V2bV91aV9leHBhbmRlcl9zZXR1cCwKKwkudGVhcmRvd24JPSBkYTgzMF9ldm1fdWlfZXhwYW5kZXJfdGVhcmRvd24sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgZGE4MzBfZXZtX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygiMjRjMjU2IiwgMHg1MCksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmRhODMwX2V2bV9pMmNfZWVwcm9tX2luZm8sCisJfSwKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJ0bHYzMjBhaWMzeCIsIDB4MTgpLAorCX0sCisJeworCQlJMkNfQk9BUkRfSU5GTygicGNmODU3NCIsIDB4M2YpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZkYTgzMF9ldm1fdWlfZXhwYW5kZXJfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkYXZpbmNpX2kyY19wbGF0Zm9ybV9kYXRhIGRhODMwX2V2bV9pMmNfMF9wZGF0YSA9IHsKKwkuYnVzX2ZyZXEJPSAxMDAsCS8qIGtIeiAqLworCS5idXNfZGVsYXkJPSAwLAkvKiB1c2VjICovCit9OworCiBzdGF0aWMgX19pbml0IHZvaWQgZGE4MzBfZXZtX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9zb2NfaW5mbyAqc29jX2luZm8gPSAmZGF2aW5jaV9zb2NfaW5mbzsKQEAgLTk0LDYgKzUwMiw4IEBACiAJCXByX3dhcm5pbmcoImRhODMwX2V2bV9pbml0OiBpMmMwIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAogCQkJCXJldCk7CiAKKwlkYTgzMF9ldm1fdXNiX2luaXQoKTsKKwogCXNvY19pbmZvLT5lbWFjX3BkYXRhLT5waHlfbWFzayA9IERBODMwX0VWTV9QSFlfTUFTSzsKIAlzb2NfaW5mby0+ZW1hY19wZGF0YS0+bWRpb19tYXhfZnJlcSA9IERBODMwX0VWTV9NRElPX0ZSRVFVRU5DWTsKIAlzb2NfaW5mby0+ZW1hY19wZGF0YS0+cm1paV9lbiA9IDE7CkBAIC0xMTcsMTIgKzUyNywxOCBAQAogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGRhODMwX2V2bV9pMmNfZGV2aWNlcywKIAkJCUFSUkFZX1NJWkUoZGE4MzBfZXZtX2kyY19kZXZpY2VzKSk7CiAKLQlyZXQgPSBkYTh4eF9waW5tdXhfc2V0dXAoZGE4MzBfbWNhc3AxX3BpbnMpOworCXJldCA9IGRhOHh4X3Bpbm11eF9zZXR1cChkYTgzMF9ldm1fbWNhc3AxX3BpbnMpOwogCWlmIChyZXQpCiAJCXByX3dhcm5pbmcoImRhODMwX2V2bV9pbml0OiBtY2FzcDEgbXV4IHNldHVwIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKIAotCWRhOHh4X2luaXRfbWNhc3AoMSwgJmRhODMwX2V2bV9zbmRfZGF0YSk7CisJZGE4eHhfcmVnaXN0ZXJfbWNhc3AoMSwgJmRhODMwX2V2bV9zbmRfZGF0YSk7CisKKwlkYTgzMF9ldm1faW5pdF9tbWMoKTsKKworCXJldCA9IGRhOHh4X3JlZ2lzdGVyX3J0YygpOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoImRhODMwX2V2bV9pbml0OiBydGMgc2V0dXAgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIH0KIAogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCkBAIC0xNDYsNyArNTYyLDcgQEAKIAlkYTgzMF9pbml0KCk7CiB9CiAKLU1BQ0hJTkVfU1RBUlQoREFWSU5DSV9EQTgzMF9FVk0sICJEYVZpbmNpIERBODMwL09NQVAgTDEzNyBFVk0iKQorTUFDSElORV9TVEFSVChEQVZJTkNJX0RBODMwX0VWTSwgIkRhVmluY2kgREE4MzAvT01BUC1MMTM3IEVWTSIpCiAJLnBoeXNfaW8JPSBJT19QSFlTLAogCS5pb19wZ19vZmZzdAk9IChfX0lPX0FERFJFU1MoSU9fUEhZUykgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IChEQThYWF9ERFJfQkFTRSArIDB4MTAwKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTg1MC1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTg1MC1ldm0uYwppbmRleCBjNzU5ZDcyLi42MmI5OGJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jCkBAIC0xMiwzNiArMTIsMzggQEAKICAqIG9yIGltcGxpZWQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjYTk1M3guaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9jcF9pbnRjLmg+CiAjaW5jbHVkZSA8bWFjaC9kYTh4eC5oPgogI2luY2x1ZGUgPG1hY2gvbmFuZC5oPgorI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAKICNkZWZpbmUgREE4NTBfRVZNX1BIWV9NQVNLCQkweDEKICNkZWZpbmUgREE4NTBfRVZNX01ESU9fRlJFUVVFTkNZCTIyMDAwMDAgLyogUEhZIGJ1cyBmcmVxdWVuY3kgKi8KIAorI2RlZmluZSBEQTg1MF9MQ0RfUFdSX1BJTgkJR1BJT19UT19QSU4oMiwgOCkKICNkZWZpbmUgREE4NTBfTENEX0JMX1BJTgkJR1BJT19UT19QSU4oMiwgMTUpCi0jZGVmaW5lIERBODUwX0xDRF9QV1JfUElOCQlHUElPX1RPX1BJTig4LCAxMCkKIAogI2RlZmluZSBEQTg1MF9NTUNTRF9DRF9QSU4JCUdQSU9fVE9fUElOKDQsIDApCiAjZGVmaW5lIERBODUwX01NQ1NEX1dQX1BJTgkJR1BJT19UT19QSU4oNCwgMSkKIAorI2RlZmluZSBEQTg1MF9NSUlfTURJT19DTEtFTl9QSU4JR1BJT19UT19QSU4oMiwgNikKKwogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRhODUwX2V2bV9ub3JmbGFzaF9wYXJ0aXRpb25bXSA9IHsKIAl7CiAJCS5uYW1lICAgICAgICAgICA9ICJOT1IgZmlsZXN5c3RlbSIsCkBAIC0xNDMsMTAgKzE0NSwxNDkgQEAKIAkucmVzb3VyY2UJPSBkYTg1MF9ldm1fbmFuZGZsYXNoX3Jlc291cmNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRhODUwX2V2bV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZGE4NTBfZXZtX25hbmRmbGFzaF9kZXZpY2UsCisJJmRhODUwX2V2bV9ub3JmbGFzaF9kZXZpY2UsCit9OworCisjZGVmaW5lIERBOFhYX0FFTUlGX0NFMkNGR19PRkZTRVQJMHgxMAorI2RlZmluZSBEQThYWF9BRU1JRl9BU0laRV8xNkJJVAkJMHgxCisKK3N0YXRpYyB2b2lkIF9faW5pdCBkYTg1MF9ldm1faW5pdF9ub3Iodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmFlbWlmX2FkZHI7CisKKwlhZW1pZl9hZGRyID0gaW9yZW1hcChEQThYWF9BRU1JRl9DVExfQkFTRSwgU1pfMzJLKTsKKworCS8qIENvbmZpZ3VyZSBkYXRhIGJ1cyB3aWR0aCBvZiBDUzIgdG8gMTYgYml0ICovCisJd3JpdGVsKHJlYWRsKGFlbWlmX2FkZHIgKyBEQThYWF9BRU1JRl9DRTJDRkdfT0ZGU0VUKSB8CisJCURBOFhYX0FFTUlGX0FTSVpFXzE2QklULAorCQlhZW1pZl9hZGRyICsgREE4WFhfQUVNSUZfQ0UyQ0ZHX09GRlNFVCk7CisKKwlpb3VubWFwKGFlbWlmX2FkZHIpOworfQorCitzdGF0aWMgdTMyIHVpX2NhcmRfZGV0ZWN0ZWQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfREFWSU5DSSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01NQ19EQVZJTkNJX01PRFVMRSkKKyNkZWZpbmUgSEFTX01NQyAxCisjZWxzZQorI2RlZmluZSBIQVNfTU1DIDAKKyNlbmRpZgorCitzdGF0aWMgX19pbml0IHZvaWQgZGE4NTBfZXZtX3NldHVwX25vcl9uYW5kKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAodWlfY2FyZF9kZXRlY3RlZCAmICFIQVNfTU1DKSB7CisJCXJldCA9IGRhOHh4X3Bpbm11eF9zZXR1cChkYTg1MF9uYW5kX3BpbnMpOworCQlpZiAocmV0KQorCQkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IG5hbmQgbXV4IHNldHVwIGZhaWxlZDogIgorCQkJCQkiJWRcbiIsIHJldCk7CisKKwkJcmV0ID0gZGE4eHhfcGlubXV4X3NldHVwKGRhODUwX25vcl9waW5zKTsKKwkJaWYgKHJldCkKKwkJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBub3IgbXV4IHNldHVwIGZhaWxlZDogJWRcbiIsCisJCQkJcmV0KTsKKworCQlkYTg1MF9ldm1faW5pdF9ub3IoKTsKKworCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkYTg1MF9ldm1fZGV2aWNlcywKKwkJCQkJQVJSQVlfU0laRShkYTg1MF9ldm1fZGV2aWNlcykpOworCX0KK30KKworI2lmZGVmIENPTkZJR19EQTg1MF9VSV9STUlJCitzdGF0aWMgaW5saW5lIHZvaWQgZGE4NTBfZXZtX3NldHVwX2VtYWNfcm1paShpbnQgcm1paV9zZWwpCit7CisJc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87CisKKwlzb2NfaW5mby0+ZW1hY19wZGF0YS0+cm1paV9lbiA9IDE7CisJZ3Bpb19zZXRfdmFsdWUocm1paV9zZWwsIDApOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYTg1MF9ldm1fc2V0dXBfZW1hY19ybWlpKGludCBybWlpX3NlbCkgeyB9CisjZW5kaWYKKworc3RhdGljIGludCBkYTg1MF9ldm1fdWlfZXhwYW5kZXJfc2V0dXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgZ3BpbywKKwkJCQkJCXVuc2lnbmVkIG5ncGlvLCB2b2lkICpjKQoreworCWludCBzZWxfYSwgc2VsX2IsIHNlbF9jLCByZXQ7CisKKwlzZWxfYSA9IGdwaW8gKyA3OworCXNlbF9iID0gZ3BpbyArIDY7CisJc2VsX2MgPSBncGlvICsgNTsKKworCXJldCA9IGdwaW9fcmVxdWVzdChzZWxfYSwgInNlbF9hIik7CisJaWYgKHJldCkgeworCQlwcl93YXJuaW5nKCJDYW5ub3Qgb3BlbiBVSSBleHBhbmRlciBwaW4gJWRcbiIsIHNlbF9hKTsKKwkJZ290byBleHBfc2V0dXBfc2VsYV9mYWlsOworCX0KKworCXJldCA9IGdwaW9fcmVxdWVzdChzZWxfYiwgInNlbF9iIik7CisJaWYgKHJldCkgeworCQlwcl93YXJuaW5nKCJDYW5ub3Qgb3BlbiBVSSBleHBhbmRlciBwaW4gJWRcbiIsIHNlbF9iKTsKKwkJZ290byBleHBfc2V0dXBfc2VsYl9mYWlsOworCX0KKworCXJldCA9IGdwaW9fcmVxdWVzdChzZWxfYywgInNlbF9jIik7CisJaWYgKHJldCkgeworCQlwcl93YXJuaW5nKCJDYW5ub3Qgb3BlbiBVSSBleHBhbmRlciBwaW4gJWRcbiIsIHNlbF9jKTsKKwkJZ290byBleHBfc2V0dXBfc2VsY19mYWlsOworCX0KKworCS8qIGRlc2VsZWN0IGFsbCBmdW5jdGlvbmFsaXRpZXMgKi8KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoc2VsX2EsIDEpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChzZWxfYiwgMSk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHNlbF9jLCAxKTsKKworCXVpX2NhcmRfZGV0ZWN0ZWQgPSAxOworCXByX2luZm8oIkRBODUwL09NQVAtTDEzOCBFVk0gVUkgY2FyZCBkZXRlY3RlZFxuIik7CisKKwlkYTg1MF9ldm1fc2V0dXBfbm9yX25hbmQoKTsKKworCWRhODUwX2V2bV9zZXR1cF9lbWFjX3JtaWkoc2VsX2EpOworCisJcmV0dXJuIDA7CisKK2V4cF9zZXR1cF9zZWxjX2ZhaWw6CisJZ3Bpb19mcmVlKHNlbF9iKTsKK2V4cF9zZXR1cF9zZWxiX2ZhaWw6CisJZ3Bpb19mcmVlKHNlbF9hKTsKK2V4cF9zZXR1cF9zZWxhX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkYTg1MF9ldm1fdWlfZXhwYW5kZXJfdGVhcmRvd24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkJdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8sIHZvaWQgKmMpCit7CisJLyogZGVzZWxlY3QgYWxsIGZ1bmN0aW9uYWxpdGllcyAqLworCWdwaW9fc2V0X3ZhbHVlKGdwaW8gKyA1LCAxKTsKKwlncGlvX3NldF92YWx1ZShncGlvICsgNiwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoZ3BpbyArIDcsIDEpOworCisJZ3Bpb19mcmVlKGdwaW8gKyA1KTsKKwlncGlvX2ZyZWUoZ3BpbyArIDYpOworCWdwaW9fZnJlZShncGlvICsgNyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgZGE4NTBfZXZtX3VpX2V4cGFuZGVyX2luZm8gPSB7CisJLmdwaW9fYmFzZQk9IERBVklOQ0lfTl9HUElPLAorCS5zZXR1cAkJPSBkYTg1MF9ldm1fdWlfZXhwYW5kZXJfc2V0dXAsCisJLnRlYXJkb3duCT0gZGE4NTBfZXZtX3VpX2V4cGFuZGVyX3RlYXJkb3duLAorfTsKKwogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGRhODUwX2V2bV9pMmNfZGV2aWNlc1tdID0gewogCXsKIAkJSTJDX0JPQVJEX0lORk8oInRsdjMyMGFpYzN4IiwgMHgxOCksCi0JfQorCX0sCisJeworCQlJMkNfQk9BUkRfSU5GTygidGNhNjQxNiIsIDB4MjApLAorCQkucGxhdGZvcm1fZGF0YSA9ICZkYTg1MF9ldm1fdWlfZXhwYW5kZXJfaW5mbywKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBkYXZpbmNpX2kyY19wbGF0Zm9ybV9kYXRhIGRhODUwX2V2bV9pMmNfMF9wZGF0YSA9IHsKQEAgLTE1OCwxMSArMjk5LDYgQEAKIAkuZW5hYmxlZF91YXJ0cyA9IDB4NywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkYTg1MF9ldm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmRhODUwX2V2bV9uYW5kZmxhc2hfZGV2aWNlLAotCSZkYTg1MF9ldm1fbm9yZmxhc2hfZGV2aWNlLAotfTsKLQogLyogZGF2aW5jaSBkYTg1MCBldm0gYXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KIHN0YXRpYyB1OCBkYTg1MF9paXNfc2VyaWFsaXplcl9kaXJlY3Rpb25bXSA9IHsKIAlJTkFDVElWRV9NT0RFLAlJTkFDVElWRV9NT0RFLAlJTkFDVElWRV9NT0RFLAlJTkFDVElWRV9NT0RFLApAQCAtMTk4LDYgKzMzNCw4IEBACiAJLmdldF9ybwkJPSBkYTg1MF9ldm1fbW1jX2dldF9ybywKIAkuZ2V0X2NkCQk9IGRhODUwX2V2bV9tbWNfZ2V0X2NkLAogCS53aXJlcwkJPSA0LAorCS5tYXhfZnJlcQk9IDUwMDAwMDAwLAorCS5jYXBzCQk9IE1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVELAogCS52ZXJzaW9uCT0gTU1DX0NUTFJfVkVSU0lPTl8yLAogfTsKIApAQCAtMjMzLDU3ICszNzEsMjI4IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgREE4WFhfQUVNSUZfQ0UyQ0ZHX09GRlNFVAkweDEwCi0jZGVmaW5lIERBOFhYX0FFTUlGX0FTSVpFXzE2QklUCQkweDEKKy8qIFRQUzY1MDcwIHZvbHRhZ2UgcmVndWxhdG9yIHN1cHBvcnQgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IGRhODUwX2V2bV9pbml0X25vcih2b2lkKQorLyogMy4zViAqLworc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdHBzNjUwNzBfZGNkYzFfY29uc3VtZXJzW10gPSB7CisJeworCQkuc3VwcGx5ID0gInVzYjBfdmRkYTMzIiwKKwl9LAorCXsKKwkJLnN1cHBseSA9ICJ1c2IxX3ZkZGEzMyIsCisJfSwKK307CisKKy8qIDMuM1Ygb3IgMS44ViAqLworc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdHBzNjUwNzBfZGNkYzJfY29uc3VtZXJzW10gPSB7CisJeworCQkuc3VwcGx5ID0gImR2ZGQzMzE4X2EiLAorCX0sCisJeworCQkuc3VwcGx5ID0gImR2ZGQzMzE4X2IiLAorCX0sCisJeworCQkuc3VwcGx5ID0gImR2ZGQzMzE4X2MiLAorCX0sCit9OworCisvKiAxLjJWICovCitzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0cHM2NTA3MF9kY2RjM19jb25zdW1lcnNbXSA9IHsKKwl7CisJCS5zdXBwbHkgPSAiY3ZkZCIsCisJfSwKK307CisKKy8qIDEuOFYgTERPICovCitzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0cHM2NTA3MF9sZG8xX2NvbnN1bWVyc1tdID0geworCXsKKwkJLnN1cHBseSA9ICJzYXRhX3ZkZHIiLAorCX0sCisJeworCQkuc3VwcGx5ID0gInVzYjBfdmRkYTE4IiwKKwl9LAorCXsKKwkJLnN1cHBseSA9ICJ1c2IxX3ZkZGExOCIsCisJfSwKKwl7CisJCS5zdXBwbHkgPSAiZGRyX2R2ZGQxOCIsCisJfSwKK307CisKKy8qIDEuMlYgTERPICovCitzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0cHM2NTA3MF9sZG8yX2NvbnN1bWVyc1tdID0geworCXsKKwkJLnN1cHBseSA9ICJzYXRhX3ZkZCIsCisJfSwKKwl7CisJCS5zdXBwbHkgPSAicGxsMF92ZGRhIiwKKwl9LAorCXsKKwkJLnN1cHBseSA9ICJwbGwxX3ZkZGEiLAorCX0sCisJeworCQkuc3VwcGx5ID0gInVzYnNfY3ZkZCIsCisJfSwKKwl7CisJCS5zdXBwbHkgPSAidmRkYXJud2ExIiwKKwl9LAorfTsKKworc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdHBzNjUwNzBfcmVndWxhdG9yX2RhdGFbXSA9IHsKKwkvKiBkY2RjMSAqLworCXsKKwkJLmNvbnN0cmFpbnRzID0geworCQkJLm1pbl91ViA9IDMxNTAwMDAsCisJCQkubWF4X3VWID0gMzQ1MDAwMCwKKwkJCS52YWxpZF9vcHNfbWFzayA9IChSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAorCQkJCVJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTKSwKKwkJCS5ib290X29uID0gMSwKKwkJfSwKKwkJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUodHBzNjUwNzBfZGNkYzFfY29uc3VtZXJzKSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gdHBzNjUwNzBfZGNkYzFfY29uc3VtZXJzLAorCX0sCisKKwkvKiBkY2RjMiAqLworCXsKKwkJLmNvbnN0cmFpbnRzID0geworCQkJLm1pbl91ViA9IDE3MTAwMDAsCisJCQkubWF4X3VWID0gMzQ1MDAwMCwKKwkJCS52YWxpZF9vcHNfbWFzayA9IChSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAorCQkJCVJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTKSwKKwkJCS5ib290X29uID0gMSwKKwkJfSwKKwkJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUodHBzNjUwNzBfZGNkYzJfY29uc3VtZXJzKSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gdHBzNjUwNzBfZGNkYzJfY29uc3VtZXJzLAorCX0sCisKKwkvKiBkY2RjMyAqLworCXsKKwkJLmNvbnN0cmFpbnRzID0geworCQkJLm1pbl91ViA9IDk1MDAwMCwKKwkJCS5tYXhfdVYgPSAxMzIwMDAwLAorCQkJLnZhbGlkX29wc19tYXNrID0gKFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8CisJCQkJUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMpLAorCQkJLmJvb3Rfb24gPSAxLAorCQl9LAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRSh0cHM2NTA3MF9kY2RjM19jb25zdW1lcnMpLAorCQkuY29uc3VtZXJfc3VwcGxpZXMgPSB0cHM2NTA3MF9kY2RjM19jb25zdW1lcnMsCisJfSwKKworCS8qIGxkbzEgKi8KKwl7CisJCS5jb25zdHJhaW50cyA9IHsKKwkJCS5taW5fdVYgPSAxNzEwMDAwLAorCQkJLm1heF91ViA9IDE4OTAwMDAsCisJCQkudmFsaWRfb3BzX21hc2sgPSAoUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCQlSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUyksCisJCQkuYm9vdF9vbiA9IDEsCisJCX0sCisJCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHRwczY1MDcwX2xkbzFfY29uc3VtZXJzKSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gdHBzNjUwNzBfbGRvMV9jb25zdW1lcnMsCisJfSwKKworCS8qIGxkbzIgKi8KKwl7CisJCS5jb25zdHJhaW50cyA9IHsKKwkJCS5taW5fdVYgPSAxMTQwMDAwLAorCQkJLm1heF91ViA9IDEzMjAwMDAsCisJCQkudmFsaWRfb3BzX21hc2sgPSAoUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCQlSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUyksCisJCQkuYm9vdF9vbiA9IDEsCisJCX0sCisJCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHRwczY1MDcwX2xkbzJfY29uc3VtZXJzKSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gdHBzNjUwNzBfbGRvMl9jb25zdW1lcnMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBkYTg1MGV2bV90cHM2NTA3MF9pbmZvW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygidHBzNjUwN3giLCAweDQ4KSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmdHBzNjUwNzBfcmVndWxhdG9yX2RhdGFbMF0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBtaWNfdHBzNjUwNzBfaW5pdCh2b2lkKQogewotCXZvaWQgX19pb21lbSAqYWVtaWZfYWRkcjsKLQotCWFlbWlmX2FkZHIgPSBpb3JlbWFwKERBOFhYX0FFTUlGX0NUTF9CQVNFLCBTWl8zMkspOwotCi0JLyogQ29uZmlndXJlIGRhdGEgYnVzIHdpZHRoIG9mIENTMiB0byAxNiBiaXQgKi8KLQl3cml0ZWwocmVhZGwoYWVtaWZfYWRkciArIERBOFhYX0FFTUlGX0NFMkNGR19PRkZTRVQpIHwKLQkJREE4WFhfQUVNSUZfQVNJWkVfMTZCSVQsCi0JCWFlbWlmX2FkZHIgKyBEQThYWF9BRU1JRl9DRTJDRkdfT0ZGU0VUKTsKLQotCWlvdW5tYXAoYWVtaWZfYWRkcik7CisJcmV0dXJuIGkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGRhODUwZXZtX3RwczY1MDcwX2luZm8sCisJCQkJCUFSUkFZX1NJWkUoZGE4NTBldm1fdHBzNjUwNzBfaW5mbykpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCi0jZGVmaW5lIEhBU19OT1IgMQotI2Vsc2UKLSNkZWZpbmUgSEFTX05PUiAwCi0jZW5kaWYKK3N0YXRpYyBjb25zdCBzaG9ydCBkYTg1MF9ldm1fbGNkY19waW5zW10gPSB7CisJREE4NTBfR1BJTzJfOCwgREE4NTBfR1BJTzJfMTUsCisJLTEKK307CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NTUNfREFWSU5DSSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX01NQ19EQVZJTkNJX01PRFVMRSkKLSNkZWZpbmUgSEFTX01NQyAxCi0jZWxzZQotI2RlZmluZSBIQVNfTU1DIDAKLSNlbmRpZgorc3RhdGljIGludCBfX2luaXQgZGE4NTBfZXZtX2NvbmZpZ19lbWFjKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpjZmdfY2hpcDNfYmFzZTsKKwlpbnQgcmV0OworCXUzMiB2YWw7CisJc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87CisJdTggcm1paV9lbiA9IHNvY19pbmZvLT5lbWFjX3BkYXRhLT5ybWlpX2VuOworCisJaWYgKCFtYWNoaW5lX2lzX2RhdmluY2lfZGE4NTBfZXZtKCkpCisJCXJldHVybiAwOworCisJY2ZnX2NoaXAzX2Jhc2UgPSBEQThYWF9TWVNDRkdfVklSVChEQThYWF9DRkdDSElQM19SRUcpOworCisJdmFsID0gX19yYXdfcmVhZGwoY2ZnX2NoaXAzX2Jhc2UpOworCisJaWYgKHJtaWlfZW4pIHsKKwkJdmFsIHw9IEJJVCg4KTsKKwkJcmV0ID0gZGE4eHhfcGlubXV4X3NldHVwKGRhODUwX3JtaWlfcGlucyk7CisJCXByX2luZm8oIkVNQUM6IFJNSUkgUEhZIGNvbmZpZ3VyZWQsIE1JSSBQSFkgd2lsbCBub3QgYmUiCisJCQkJCQkJIiBmdW5jdGlvbmFsXG4iKTsKKwl9IGVsc2UgeworCQl2YWwgJj0gfkJJVCg4KTsKKwkJcmV0ID0gZGE4eHhfcGlubXV4X3NldHVwKGRhODUwX2NwZ21hY19waW5zKTsKKwkJcHJfaW5mbygiRU1BQzogTUlJIFBIWSBjb25maWd1cmVkLCBSTUlJIFBIWSB3aWxsIG5vdCBiZSIKKwkJCQkJCQkiIGZ1bmN0aW9uYWxcbiIpOworCX0KKworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBjcGdtYWMvcm1paSBtdXggc2V0dXAgZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCisJLyogY29uZmlndXJlIHRoZSBDRkdDSElQMyByZWdpc3RlciBmb3IgUk1JSSBvciBNSUkgKi8KKwlfX3Jhd193cml0ZWwodmFsLCBjZmdfY2hpcDNfYmFzZSk7CisKKwlyZXQgPSBkYXZpbmNpX2NmZ19yZWcoREE4NTBfR1BJTzJfNik7CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6R1BJTygyLDYpIG11eCBzZXR1cCAiCisJCQkJCQkJImZhaWxlZFxuIik7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoREE4NTBfTUlJX01ESU9fQ0xLRU5fUElOLCAibWRpb19jbGtfZW4iKTsKKwlpZiAocmV0KSB7CisJCXByX3dhcm5pbmcoIkNhbm5vdCBvcGVuIEdQSU8gJWRcbiIsCisJCQkJCURBODUwX01JSV9NRElPX0NMS0VOX1BJTik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRW5hYmxlL0Rpc2FibGUgTUlJIE1ESU8gY2xvY2sgKi8KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoREE4NTBfTUlJX01ESU9fQ0xLRU5fUElOLCBybWlpX2VuKTsKKworCXNvY19pbmZvLT5lbWFjX3BkYXRhLT5waHlfbWFzayA9IERBODUwX0VWTV9QSFlfTUFTSzsKKwlzb2NfaW5mby0+ZW1hY19wZGF0YS0+bWRpb19tYXhfZnJlcSA9IERBODUwX0VWTV9NRElPX0ZSRVFVRU5DWTsKKworCXJldCA9IGRhOHh4X3JlZ2lzdGVyX2VtYWMoKTsKKwlpZiAocmV0KQorCQlwcl93YXJuaW5nKCJkYTg1MF9ldm1faW5pdDogZW1hYyByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwoZGE4NTBfZXZtX2NvbmZpZ19lbWFjKTsKIAogc3RhdGljIF9faW5pdCB2b2lkIGRhODUwX2V2bV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87CiAJaW50IHJldDsKIAotCXJldCA9IGRhOHh4X3Bpbm11eF9zZXR1cChkYTg1MF9uYW5kX3BpbnMpOworCXJldCA9IHBtaWNfdHBzNjUwNzBfaW5pdCgpOwogCWlmIChyZXQpCi0JCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBuYW5kIG11eCBzZXR1cCBmYWlsZWQ6ICVkXG4iLAorCQlwcl93YXJuaW5nKCJkYTg1MF9ldm1faW5pdDogVFBTNjUwNzAgUE1JQyBpbml0IGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKIAotCXJldCA9IGRhOHh4X3Bpbm11eF9zZXR1cChkYTg1MF9ub3JfcGlucyk7Ci0JaWYgKHJldCkKLQkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IG5vciBtdXggc2V0dXAgZmFpbGVkOiAlZFxuIiwKLQkJCQlyZXQpOwotCi0JZGE4NTBfZXZtX2luaXRfbm9yKCk7Ci0KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkYTg1MF9ldm1fZGV2aWNlcywKLQkJCQlBUlJBWV9TSVpFKGRhODUwX2V2bV9kZXZpY2VzKSk7Ci0KIAlyZXQgPSBkYTh4eF9yZWdpc3Rlcl9lZG1hKCk7CiAJaWYgKHJldCkKIAkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IGVkbWEgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsCkBAIC0yOTksMTkgKzYwOCw2IEBACiAJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBpMmMwIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAogCQkJCXJldCk7CiAKLQlzb2NfaW5mby0+ZW1hY19wZGF0YS0+cGh5X21hc2sgPSBEQTg1MF9FVk1fUEhZX01BU0s7Ci0Jc29jX2luZm8tPmVtYWNfcGRhdGEtPm1kaW9fbWF4X2ZyZXEgPSBEQTg1MF9FVk1fTURJT19GUkVRVUVOQ1k7Ci0Jc29jX2luZm8tPmVtYWNfcGRhdGEtPnJtaWlfZW4gPSAwOwotCi0JcmV0ID0gZGE4eHhfcGlubXV4X3NldHVwKGRhODUwX2NwZ21hY19waW5zKTsKLQlpZiAocmV0KQotCQlwcl93YXJuaW5nKCJkYTg1MF9ldm1faW5pdDogY3BnbWFjIG11eCBzZXR1cCBmYWlsZWQ6ICVkXG4iLAotCQkJCXJldCk7Ci0KLQlyZXQgPSBkYTh4eF9yZWdpc3Rlcl9lbWFjKCk7Ci0JaWYgKHJldCkKLQkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IGVtYWMgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsCi0JCQkJcmV0KTsKIAogCXJldCA9IGRhOHh4X3JlZ2lzdGVyX3dhdGNoZG9nKCk7CiAJaWYgKHJldCkKQEAgLTMxOSwxMSArNjE1LDYgQEAKIAkJCQlyZXQpOwogCiAJaWYgKEhBU19NTUMpIHsKLQkJaWYgKEhBU19OT1IpCi0JCQlwcl93YXJuaW5nKCJXQVJOSU5HOiBib3RoIE5PUiBGbGFzaCBhbmQgTU1DL1NEIGFyZSAiCi0JCQkJImVuYWJsZWQsIGJ1dCB0aGV5IHNoYXJlIEFFTUlGIHBpbnMuXG4iCi0JCQkJIlx0RGlzYWJsZSBvbmUgb2YgdGhlbS5cbiIpOwotCiAJCXJldCA9IGRhOHh4X3Bpbm11eF9zZXR1cChkYTg1MF9tbWNzZDBfcGlucyk7CiAJCWlmIChyZXQpCiAJCQlwcl93YXJuaW5nKCJkYTg1MF9ldm1faW5pdDogbW1jc2QwIG11eCBzZXR1cCBmYWlsZWQ6IgpAQCAtMzY1LDIyICs2NTYsNDIgQEAKIAkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IG1jYXNwIG11eCBzZXR1cCBmYWlsZWQ6ICVkXG4iLAogCQkJCXJldCk7CiAKLQlkYTh4eF9pbml0X21jYXNwKDAsICZkYTg1MF9ldm1fc25kX2RhdGEpOworCWRhOHh4X3JlZ2lzdGVyX21jYXNwKDAsICZkYTg1MF9ldm1fc25kX2RhdGEpOwogCiAJcmV0ID0gZGE4eHhfcGlubXV4X3NldHVwKGRhODUwX2xjZGNudGxfcGlucyk7CiAJaWYgKHJldCkKIAkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IGxjZGNudGwgbXV4IHNldHVwIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKIAorCS8qIEhhbmRsZSBib2FyZCBzcGVjaWZpYyBtdXhpbmcgZm9yIExDRCBoZXJlICovCisJcmV0ID0gZGE4eHhfcGlubXV4X3NldHVwKGRhODUwX2V2bV9sY2RjX3BpbnMpOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBldm0gc3BlY2lmaWMgbGNkIG11eCBzZXR1cCAiCisJCQkJImZhaWxlZDogJWRcbiIsCXJldCk7CisKIAlyZXQgPSBkYTg1MF9sY2RfaHdfaW5pdCgpOwogCWlmIChyZXQpCiAJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBsY2QgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAlZFxuIiwKIAkJCQlyZXQpOwogCi0JcmV0ID0gZGE4eHhfcmVnaXN0ZXJfbGNkYygpOworCXJldCA9IGRhOHh4X3JlZ2lzdGVyX2xjZGMoJnNoYXJwX2xrMDQzdDFkZzAxX3BkYXRhKTsKIAlpZiAocmV0KQogCQlwcl93YXJuaW5nKCJkYTg1MF9ldm1faW5pdDogbGNkYyByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwKIAkJCQlyZXQpOworCisJcmV0ID0gZGE4eHhfcmVnaXN0ZXJfcnRjKCk7CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IHJ0YyBzZXR1cCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCisJcmV0ID0gZGE4NTBfcmVnaXN0ZXJfY3B1ZnJlcSgpOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBjcHVmcmVxIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAorCQkJCXJldCk7CisKKwlyZXQgPSBkYTh4eF9yZWdpc3Rlcl9jcHVpZGxlKCk7CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IGNwdWlkbGUgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsCisJCQkJcmV0KTsKIH0KIAogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtZXZtLmMKaW5kZXggNzdlODA2Ny4uYTliNjUwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1ldm0uYwpAQCAtOSwxNSArOSwxMyBAQAogICogb3IgaW1wbGllZC4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CkBAIC0yNSwyMCArMjMsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2VlcHJvbS5oPgogCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2RtMzU1Lmg+Ci0jaW5jbHVkZSA8bWFjaC9wc2MuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL25hbmQuaD4KICNpbmNsdWRlIDxtYWNoL21tYy5oPgorI2luY2x1ZGUgPG1hY2gvdXNiLmg+CiAKICNkZWZpbmUgREFWSU5DSV9BU1lOQ19FTUlGX0NPTlRST0xfQkFTRQkJMHgwMWUxMDAwMAogI2RlZmluZSBEQVZJTkNJX0FTWU5DX0VNSUZfREFUQV9DRTBfQkFTRQkweDAyMDAwMDAwCkBAIC04Niw4ICs3OSw5IEBACiAJLm1hc2tfY2hpcHNlbAkJPSBCSVQoMTQpLAogCS5wYXJ0cwkJCT0gZGF2aW5jaV9uYW5kX3BhcnRpdGlvbnMsCiAJLm5yX3BhcnRzCQk9IEFSUkFZX1NJWkUoZGF2aW5jaV9uYW5kX3BhcnRpdGlvbnMpLAotCS5lY2NfbW9kZQkJPSBOQU5EX0VDQ19IV19TWU5EUk9NRSwKKwkuZWNjX21vZGUJCT0gTkFORF9FQ0NfSFcsCiAJLm9wdGlvbnMJCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5lY2NfYml0cwkJPSA0LAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXZpbmNpX25hbmRfcmVzb3VyY2VzW10gPSB7CkBAIC0zNDQsNyArMzM4LDcgQEAKIAlncGlvX3JlcXVlc3QoMiwgInVzYl9pZF90b2dnbGUiKTsKIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMiwgVVNCX0lEX1ZBTFVFKTsKIAkvKiBpcmxtbDY0MDEgc3dpdGNoZXMgb3ZlciAxQSBpbiB1bmRlciA4IG1zZWMgKi8KLQlzZXR1cF91c2IoNTAwLCA4KTsKKwlkYXZpbmNpX3NldHVwX3VzYigxMDAwLCA4KTsKIAogCWRhdmluY2lfc2V0dXBfbW1jKDAsICZkbTM1NWV2bV9tbWNfY29uZmlnKTsKIAlkYXZpbmNpX3NldHVwX21tYygxLCAmZG0zNTVldm1fbW1jX2NvbmZpZyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtbGVvcGFyZC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWxlb3BhcmQuYwppbmRleCA4NGFkNWQxLi4yMWYzMmViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtbGVvcGFyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1sZW9wYXJkLmMKQEAgLTgsMzQgKzgsMjcgQEAKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9lZXByb20uaD4KIAotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9kbTM1NS5oPgotI2luY2x1ZGUgPG1hY2gvcHNjLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2kyYy5oPgogI2luY2x1ZGUgPG1hY2gvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9uYW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KKyNpbmNsdWRlIDxtYWNoL3VzYi5oPgogCiAjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9DT05UUk9MX0JBU0UJCTB4MDFlMTAwMDAKICNkZWZpbmUgREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UwX0JBU0UJMHgwMjAwMDAwMApAQCAtMjcwLDcgKzI2Myw3IEBACiAJZ3Bpb19yZXF1ZXN0KDIsICJ1c2JfaWRfdG9nZ2xlIik7CiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDIsIFVTQl9JRF9WQUxVRSk7CiAJLyogaXJsbWw2NDAxIHN3aXRjaGVzIG92ZXIgMUEgaW4gdW5kZXIgOCBtc2VjICovCi0Jc2V0dXBfdXNiKDUwMCwgOCk7CisJZGF2aW5jaV9zZXR1cF91c2IoMTAwMCwgOCk7CiAKIAlkYXZpbmNpX3NldHVwX21tYygwLCAmZG0zNTVsZW9wYXJkX21tY19jb25maWcpOwogCWRhdmluY2lfc2V0dXBfbW1jKDEsICZkbTM1NWxlb3BhcmRfbW1jX2NvbmZpZyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKaW5kZXggNTJkZDgwNC4uMjg5ZmUxYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYwpAQCAtMTMsOSArMTMsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CkBAIC0yNCwyMCArMjMsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKwogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZG0zNjUuaD4KLSNpbmNsdWRlIDxtYWNoL3BzYy5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAjaW5jbHVkZSA8bWFjaC9uYW5kLmg+Ci0KKyNpbmNsdWRlIDxtYWNoL2tleXNjYW4uaD4KIAogc3RhdGljIGlubGluZSBpbnQgaGF2ZV9pbWFnZXIodm9pZCkKIHsKQEAgLTE0NCw2ICsxNDIsNyBAQAogCS5ucl9wYXJ0cwkJPSBBUlJBWV9TSVpFKGRhdmluY2lfbmFuZF9wYXJ0aXRpb25zKSwKIAkuZWNjX21vZGUJCT0gTkFORF9FQ0NfSFcsCiAJLm9wdGlvbnMJCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5lY2NfYml0cwkJPSA0LAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXZpbmNpX25hbmRfcmVzb3VyY2VzW10gPSB7CkBAIC0xNzYsMTEgKzE3NSwxNiBAQAogCS5jb250ZXh0CT0gKHZvaWQgKikweDdmMDAsCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhIGRtMzY1X2V2bV9zbmRfZGF0YTsKKwogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfaW5mb1tdID0gewogCXsKIAkJSTJDX0JPQVJEX0lORk8oIjI0YzI1NiIsIDB4NTApLAogCQkucGxhdGZvcm1fZGF0YQk9ICZlZXByb21faW5mbywKIAl9LAorCXsKKwkJSTJDX0JPQVJEX0lORk8oInRsdjMyMGFpYzN4IiwgMHgxOCksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9pMmNfcGxhdGZvcm1fZGF0YSBpMmNfcGRhdGEgPSB7CkBAIC0xODgsNiArMTkyLDM4IEBACiAJLmJ1c19kZWxheQk9IDAJLyogdXNlYyAqLywKIH07CiAKKyNpZmRlZiBDT05GSUdfS0VZQk9BUkRfREFWSU5DSQorc3RhdGljIHVuc2lnbmVkIHNob3J0IGRtMzY1ZXZtX2tleW1hcFtdID0geworCUtFWV9LUDIsCisJS0VZX0xFRlQsCisJS0VZX0VYSVQsCisJS0VZX0RPV04sCisJS0VZX0VOVEVSLAorCUtFWV9VUCwKKwlLRVlfS1AxLAorCUtFWV9SSUdIVCwKKwlLRVlfTUVOVSwKKwlLRVlfUkVDT1JELAorCUtFWV9SRVdJTkQsCisJS0VZX0tQTUlOVVMsCisJS0VZX1NUT1AsCisJS0VZX0ZBU1RGT1JXQVJELAorCUtFWV9LUFBMVVMsCisJS0VZX1BMQVlQQVVTRSwKKwkwCit9OworCitzdGF0aWMgc3RydWN0IGRhdmluY2lfa3NfcGxhdGZvcm1fZGF0YSBkbTM2NWV2bV9rc19kYXRhID0geworCS5rZXltYXAJCT0gZG0zNjVldm1fa2V5bWFwLAorCS5rZXltYXBzaXplCT0gQVJSQVlfU0laRShkbTM2NWV2bV9rZXltYXApLAorCS5yZXAJCT0gMSwKKwkvKiBTY2FuIHBlcmlvZCA9IHN0cm9iZSArIGludGVydmFsICovCisJLnN0cm9iZQkJPSAweDUsCisJLmludGVydmFsCT0gMHgyLAorCS5tYXRyaXhfdHlwZQk9IERBVklOQ0lfS0VZU0NBTl9NQVRSSVhfNFg0LAorfTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IGNwbGRfbW1jX2dldF9jZChpbnQgbW9kdWxlKQogewogCWlmICghY3BsZCkKQEAgLTQ3Miw2ICs1MDgsMTMgQEAKIAogCS8qIG1heWJlIHNldHVwIG1tYzEvZXRjIC4uLiBfYWZ0ZXJfIG1tYzAgKi8KIAlldm1faW5pdF9jcGxkKCk7CisKKwlkbTM2NV9pbml0X2FzcCgmZG0zNjVfZXZtX3NuZF9kYXRhKTsKKwlkbTM2NV9pbml0X3J0YygpOworCisjaWZkZWYgQ09ORklHX0tFWUJPQVJEX0RBVklOQ0kKKwlkbTM2NV9pbml0X2tzKCZkbTM2NWV2bV9rc19kYXRhKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgZG0zNjVfZXZtX2lycV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDR4LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ0eC1ldm0uYwppbmRleCAxMjEzYTAwLi5mZDAzOThiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDR4LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NHgtZXZtLmMKQEAgLTksNDUgKzksMzQgQEAKICAqIG9yIGltcGxpZWQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbGVkcy5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgotCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3BjZjg1N3guaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvYXQyNC5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS90dnA1MTR4Lmg+CiAKLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKICNpbmNsdWRlIDxtYWNoL2RtNjQ0eC5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9wc2MuaD4KICNpbmNsdWRlIDxtYWNoL25hbmQuaD4KICNpbmNsdWRlIDxtYWNoL21tYy5oPgotI2luY2x1ZGUgPG1hY2gvZW1hYy5oPgorI2luY2x1ZGUgPG1hY2gvdXNiLmg+CiAKICNkZWZpbmUgRE02NDRYX0VWTV9QSFlfTUFTSwkJKDB4MikKICNkZWZpbmUgRE02NDRYX0VWTV9NRElPX0ZSRVFVRU5DWQkoMjIwMDAwMCkgLyogUEhZIGJ1cyBmcmVxdWVuY3kgKi8KQEAgLTQ3Nyw3ICs0NjYsNyBAQAogCS8qIGlybG1sNjQwMSBzd2l0Y2hlcyBvdmVyIDFBLCBpbiB1bmRlciA4IG1zZWM7CiAJICogbm93IGl0IGNhbiBiZSBtYW5hZ2VkIGJ5IG5EUlZfVkJVUyAuLi4KIAkgKi8KLQlzZXR1cF91c2IoNTAwLCA4KTsKKwlkYXZpbmNpX3NldHVwX3VzYigxMDAwLCA4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ2eC1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NngtZXZtLmMKaW5kZXggMjRlMGUxMy4uOGQwYjBlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ2eC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jCkBAIC0xNywzOCArMTcsMjggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3BjZjg1N3guaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdHZwNTE0eC5oPgogCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKwogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKICNpbmNsdWRlIDxtYWNoL2RtNjQ2eC5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9wc2MuaD4KICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvaTJjLmg+Ci0jaW5jbHVkZSA8bWFjaC9tbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2VtYWMuaD4KKyNpbmNsdWRlIDxtYWNoL25hbmQuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfUEFMTUNISVBfQkszNzEwKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9QQUxNQ0hJUF9CSzM3MTBfTU9EVUxFKQpAQCAtNTcsNiArNDcsMTEgQEAKICNkZWZpbmUgSEFTX0FUQSAwCiAjZW5kaWYKIAorI2RlZmluZSBEQVZJTkNJX0FTWU5DX0VNSUZfQ09OVFJPTF9CQVNFCQkweDIwMDA4MDAwCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9EQVRBX0NFMF9CQVNFCTB4NDIwMDAwMDAKKworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCVNaXzEyOEsKKwogLyogQ1BMRCBSZWdpc3RlciAwIGJpdHMgdG8gY29udHJvbCBBVEEgKi8KICNkZWZpbmUgRE02NDZYX0VWTV9BVEFfUlNUCQlCSVQoMCkKICNkZWZpbmUgRE02NDZYX0VWTV9BVEFfUFdECQlCSVQoMSkKQEAgLTkyLDYgKzg3LDYzIEBACiAJLmVuYWJsZWRfdWFydHMgPSAoMSA8PCAwKSwKIH07CiAKKy8qIE5vdGU6IFdlIGFyZSBzZXR0aW5nIGZpcnN0IHBhcnRpdGlvbiBhcyAnYm9vdGxvYWRlcicgY29uc3RpdHV0aW5nIFVCTCwgVS1Cb290CisgKiBhbmQgVS1Cb290IGVudmlyb25tZW50IHRoaXMgYXZvaWRzIGRlcGVuZGVuY3kgb24gYW55IHBhcnRpY3VsYXIgY29tYmluYXRpb24KKyAqIG9mIFVCTCwgVS1Cb290IG9yIGZsYXNoaW5nIHRvb2xzIGV0Yy4KKyAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRhdmluY2lfbmFuZF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkvKiBVQkwsIFUtQm9vdCB3aXRoIGVudmlyb25tZW50ICovCisJCS5uYW1lCQk9ICJib290bG9hZGVyIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplCQk9IDE2ICogTkFORF9CTE9DS19TSVpFLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCS8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sIHsKKwkJLm5hbWUJCT0gImtlcm5lbCIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQkJPSBTWl80TSwKKwkJLm1hc2tfZmxhZ3MJPSAwLAorCX0sIHsKKwkJLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm1hc2tfZmxhZ3MJPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9uYW5kX3BkYXRhIGRhdmluY2lfbmFuZF9kYXRhID0geworCS5tYXNrX2NsZSAJCT0gMHg4MDAwMCwKKwkubWFza19hbGUgCQk9IDB4NDAwMDAsCisJLnBhcnRzCQkJPSBkYXZpbmNpX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMJCT0gQVJSQVlfU0laRShkYXZpbmNpX25hbmRfcGFydGl0aW9ucyksCisJLmVjY19tb2RlCQk9IE5BTkRfRUNDX0hXLAorCS5vcHRpb25zCQk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhdmluY2lfbmFuZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBEQVZJTkNJX0FTWU5DX0VNSUZfREFUQV9DRTBfQkFTRSwKKwkJLmVuZAkJPSBEQVZJTkNJX0FTWU5DX0VNSUZfREFUQV9DRTBfQkFTRSArIFNaXzMyTSAtIDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAkJPSBEQVZJTkNJX0FTWU5DX0VNSUZfQ09OVFJPTF9CQVNFLAorCQkuZW5kCQk9IERBVklOQ0lfQVNZTkNfRU1JRl9DT05UUk9MX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9uYW5kX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImRhdmluY2lfbmFuZCIsCisJLmlkCQkJPSAwLAorCisJLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShkYXZpbmNpX25hbmRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJCT0gZGF2aW5jaV9uYW5kX3Jlc291cmNlcywKKworCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZGF2aW5jaV9uYW5kX2RhdGEsCisJfSwKK307CisKIC8qIENQTEQgUmVnaXN0ZXIgMCBDbGllbnQ6IHVzZWQgZm9yIEkvTyBDb250cm9sICovCiBzdGF0aWMgaW50IGNwbGRfcmVnMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQpAQCAtMTQyLDcgKzE5NCw3IEBACiAJeyAubmFtZSA9ICJEUzQiLCAuYWN0aXZlX2xvdyA9IDEsIH0sCiB9OwogCi1zdGF0aWMgX19pbml0Y29uc3Qgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZXZtX2xlZF9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGV2bV9sZWRfZGF0YSA9IHsKIAkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGV2bV9sZWRzKSwKIAkubGVkcyAgICAgPSBldm1fbGVkcywKIH07CkBAIC02NDcsNiArNjk5LDggQEAKIAlkbTY0NnhfaW5pdF9tY2FzcDAoJmRtNjQ2eF9ldm1fc25kX2RhdGFbMF0pOwogCWRtNjQ2eF9pbml0X21jYXNwMSgmZG02NDZ4X2V2bV9zbmRfZGF0YVsxXSk7CiAKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRhdmluY2lfbmFuZF9kZXZpY2UpOworCiAJaWYgKEhBU19BVEEpCiAJCWRtNjQ2eF9pbml0X2lkZSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbmV1cm9zLW9zZDIuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1uZXVyb3Mtb3NkMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWNhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbmV1cm9zLW9zZDIuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIE5ldXJvcyBUZWNobm9sb2dpZXMgT1NEMiBib2FyZCBzdXBwb3J0CisgKgorICogTW9kaWZpZWQgZnJvbSBvcmlnaW5hbCA2NDRYLUVWTSBib2FyZCBzdXBwb3J0LgorICogMjAwOCAoYykgTmV1cm9zIFRlY2hub2xvZ3ksIExMQy4KKyAqIDIwMDkgKGMpIEpvcmdlIEx1aXMgWmFwYXRhIE11Z2EgPGpvcmdlbHVpcy56YXBhdGFAZ21haWwuY29tPgorICogMjAwOSAoYykgQW5kcmV5IEEuIFBvcm9ka28gPEFuZHJleS5Qb3JvZGtvQGdtYWlsLmNvbT4KKyAqCisgKiBUaGUgTmV1cm9zIE9TRCAyLjAgaXMgdGhlIGhhcmR3YXJlIGNvbXBvbmVudCBvZiB0aGUgTmV1cm9zIE9wZW4KKyAqIEludGVybmV0IFRlbGV2aXNpb24gUGxhdGZvcm0uIEhhcmR3YXJlIGlzIHZlcnkgY2xvc2UgdG8gVEkKKyAqIERNNjQ0WC1FVk0gYm9hcmQuIEl0IGhhczoKKyAqIAlETTY0NDZNMDIgbW9kdWxlIHdpdGggMjU2TUIgTkFORCwgMjU2TUIgUkFNLCBUTFYzMjBBSUMzMiBBSUMsCisgKiAJVVNCLCBFdGhlcm5ldCwgU0QvTU1DLCBVQVJULCBUSFM4MjAwLCBUVlA3MDAwIGZvciB2aWRlby4KKyAqIAlBZGRpdGlvbmFseSByZWFsdGltZSBjbG9jaywgSVIgcmVtb3RlIGNvbnRyb2wgcmVjZWl2ZXIsCisgKiAJSVIgQmxhc3RlciBiYXNlZCBvbiBNU1A0MzAgKGZpcm13YXJlIGFsdGhvdWdoIGlzIGRpZmZlcmVudAorICogCWZyb20gdXNlZCBpbiBETTY0NFgtRVZNKSwgaW50ZXJuYWwgQVRBLTYgMy414oCdIEhERCBkcml2ZQorICogCXdpdGggUEFUQSBpbnRlcmZhY2UsIHR3byBtdXhlZCByZWQtZ3JlZW4gbGVkcy4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8KKyAqIAkJaHR0cDovL3dpa2kubmV1cm9zdGVjaG5vbG9neS5jb20vaW5kZXgucGhwL09TRF8yLjBfSEQKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworI2luY2x1ZGUgPG1hY2gvZG02NDR4Lmg+CisjaW5jbHVkZSA8bWFjaC9pMmMuaD4KKyNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgorI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9uYW5kLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KKyNpbmNsdWRlIDxtYWNoL3VzYi5oPgorCisjZGVmaW5lIE5FVVJPU19PU0QyX1BIWV9NQVNLCQkweDIKKyNkZWZpbmUgTkVVUk9TX09TRDJfTURJT19GUkVRVUVOQ1kJMjIwMDAwMCAvKiBQSFkgYnVzIGZyZXF1ZW5jeSAqLworCisjZGVmaW5lIERBVklOQ0lfQ0ZDX0FUQV9CQVNFCQkgMHgwMUM2NjAwMAorCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9DT05UUk9MX0JBU0UJIDB4MDFlMDAwMDAKKyNkZWZpbmUgREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UwX0JBU0UgMHgwMjAwMDAwMAorCisjZGVmaW5lIExYVDk3MV9QSFlfSUQJCQkweDAwMTM3OGUyCisjZGVmaW5lIExYVDk3MV9QSFlfTUFTSwkJCTB4ZmZmZmZmZjAKKworI2RlZmluZQlOVE9TRDJfQVVESU9TT0NfSTJDX0FERFIJMHgxOAorI2RlZmluZQlOVE9TRDJfTVNQNDMwX0kyQ19BRERSCQkweDU5CisjZGVmaW5lCU5UT1NEMl9NU1A0MzBfSVJRCQkyCisKKy8qIE5ldXJvcyBPU0QyIGhhcyBhIFNhbXN1bmcgMjU2IE1CeXRlIE5BTkQgZmxhc2ggKERldiBJRCBvZiAweEFBLAorICogMjA0OCBibG9ja3MgaW4gdGhlIGRldmljZSwgNjQgcGFnZXMgcGVyIGJsb2NrLCAyMDQ4IGJ5dGVzIHBlcgorICogcGFnZS4KKyAqLworCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SworCitzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYXZpbmNpX250b3NkMl9uYW5kZmxhc2hfcGFydGl0aW9uW10gPSB7CisJeworCQkvKiBVQkwgKGEgZmV3IGNvcGllcykgcGx1cyBVLUJvb3QgKi8KKwkJLm5hbWUJCT0gImJvb3Rsb2FkZXIiLAorCQkub2Zmc2V0CQk9IDAsCisJCS5zaXplCQk9IDE1ICogTkFORF9CTE9DS19TSVpFLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sIHsKKwkJLyogVS1Cb290IGVudmlyb25tZW50ICovCisJCS5uYW1lCQk9ICJwYXJhbXMiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJCT0gMSAqIE5BTkRfQkxPQ0tfU0laRSwKKwkJLm1hc2tfZmxhZ3MJPSAwLAorCX0sIHsKKwkJLyogS2VybmVsICovCisJCS5uYW1lCQk9ICJrZXJuZWwiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJCT0gU1pfNE0sCisJCS5tYXNrX2ZsYWdzCT0gMCwKKwl9LCB7CisJCS8qIEZpbGUgU3lzdGVtICovCisJCS5uYW1lCQk9ICJmaWxlc3lzdGVtIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5tYXNrX2ZsYWdzCT0gMCwKKwl9CisJLyogQSBmZXcgYmxvY2tzIGF0IGVuZCBob2xkIGEgZmxhc2ggQmFkIEJsb2NrIFRhYmxlLiAqLworfTsKKworc3RhdGljIHN0cnVjdCBkYXZpbmNpX25hbmRfcGRhdGEgZGF2aW5jaV9udG9zZDJfbmFuZGZsYXNoX2RhdGEgPSB7CisJLnBhcnRzCQk9IGRhdmluY2lfbnRvc2QyX25hbmRmbGFzaF9wYXJ0aXRpb24sCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShkYXZpbmNpX250b3NkMl9uYW5kZmxhc2hfcGFydGl0aW9uKSwKKwkuZWNjX21vZGUJPSBOQU5EX0VDQ19IVywKKwkub3B0aW9ucwk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGF2aW5jaV9udG9zZDJfbmFuZGZsYXNoX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQJCT0gREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UwX0JBU0UsCisJCS5lbmQJCT0gREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UwX0JBU0UgKyBTWl8xNk0gLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJCT0gREFWSU5DSV9BU1lOQ19FTUlGX0NPTlRST0xfQkFTRSwKKwkJLmVuZAkJPSBEQVZJTkNJX0FTWU5DX0VNSUZfQ09OVFJPTF9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhdmluY2lfbnRvc2QyX25hbmRmbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImRhdmluY2lfbmFuZCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmRhdmluY2lfbnRvc2QyX25hbmRmbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRhdmluY2lfbnRvc2QyX25hbmRmbGFzaF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gZGF2aW5jaV9udG9zZDJfbmFuZGZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIHU2NCBkYXZpbmNpX2ZiX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9mYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImRhdmluY2lmYiIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSAmZGF2aW5jaV9mYl9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaWRlX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IERBVklOQ0lfQ0ZDX0FUQV9CQVNFLAorCQkuZW5kCQk9IERBVklOQ0lfQ0ZDX0FUQV9CQVNFICsgMHg3ZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElSUV9JREUsCisJCS5lbmQJCT0gSVJRX0lERSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IGlkZV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlkZV9kZXYgPSB7CisJLm5hbWUJCT0gInBhbG1fYmszNzEwIiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gaWRlX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaWRlX3Jlc291cmNlcyksCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrCQk9ICZpZGVfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BsYXRmb3JtX2RhdGEgZG02NDR4X250b3NkMl9zbmRfZGF0YTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBudG9zZDJfbGVkc1tdID0geworCXsgLm5hbWUgPSAibGVkMV9ncmVlbiIsIC5ncGlvID0gR1BJTygxMCksIH0sCisJeyAubmFtZSA9ICJsZWQxX3JlZCIsICAgLmdwaW8gPSBHUElPKDExKSwgfSwKKwl7IC5uYW1lID0gImxlZDJfZ3JlZW4iLCAuZ3BpbyA9IEdQSU8oMTIpLCB9LAorCXsgLm5hbWUgPSAibGVkMl9yZWQiLCAgIC5ncGlvID0gR1BJTygxMyksIH0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgbnRvc2QyX2xlZHNfZGF0YSA9IHsKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKG50b3NkMl9sZWRzKSwKKwkubGVkcwkJPSBudG9zZDJfbGVkcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG50b3NkMl9sZWRzX2RldiA9IHsKKwkubmFtZSA9ICJsZWRzLWdwaW8iLAorCS5pZCAgID0gLTEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgCQk9ICZudG9zZDJfbGVkc19kYXRhLAorCX0sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkYXZpbmNpX250b3NkMl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZGF2aW5jaV9mYl9kZXZpY2UsCisJJm50b3NkMl9sZWRzX2RldiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV91YXJ0X2NvbmZpZyB1YXJ0X2NvbmZpZyBfX2luaXRkYXRhID0geworCS5lbmFibGVkX3VhcnRzID0gKDEgPDwgMCksCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZGF2aW5jaV9udG9zZDJfbWFwX2lvKHZvaWQpCit7CisJZG02NDR4X2luaXQoKTsKK30KKworLyoKKyBJMkMgaW5pdGlhbGl6YXRpb24KKyovCitzdGF0aWMgc3RydWN0IGRhdmluY2lfaTJjX3BsYXRmb3JtX2RhdGEgbnRvc2QyX2kyY19wZGF0YSA9IHsKKwkuYnVzX2ZyZXEJPSAyMCAvKiBrSHogKi8sCisJLmJ1c19kZWxheQk9IDEwMCAvKiB1c2VjICovLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIG50b3NkMl9pMmNfaW5mb1tdID0gIHsKK307CisKK3N0YXRpYwlpbnQgbnRvc2QyX2luaXRfaTJjKHZvaWQpCit7CisJaW50CXN0YXR1czsKKworCWRhdmluY2lfaW5pdF9pMmMoJm50b3NkMl9pMmNfcGRhdGEpOworCXN0YXR1cyA9IGdwaW9fcmVxdWVzdChOVE9TRDJfTVNQNDMwX0lSUSwgbnRvc2QyX2kyY19pbmZvWzBdLnR5cGUpOworCWlmIChzdGF0dXMgPT0gMCkgeworCQlzdGF0dXMgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChOVE9TRDJfTVNQNDMwX0lSUSk7CisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJc3RhdHVzID0gZ3Bpb190b19pcnEoTlRPU0QyX01TUDQzMF9JUlEpOworCQkJaWYgKHN0YXR1cyA+IDApIHsKKwkJCQludG9zZDJfaTJjX2luZm9bMF0uaXJxID0gc3RhdHVzOworCQkJCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsCisJCQkJCW50b3NkMl9pMmNfaW5mbywKKwkJCQkJQVJSQVlfU0laRShudG9zZDJfaTJjX2luZm8pKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IGRhdmluY2lfbW1jX2NvbmZpZyBkYXZpbmNpX250b3NkMl9tbWNfY29uZmlnID0geworCS53aXJlcwkJPSA0LAorCS52ZXJzaW9uCT0gTU1DX0NUTFJfVkVSU0lPTl8xCit9OworCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX1BBTE1DSElQX0JLMzcxMCkgfHwgXAorCWRlZmluZWQoQ09ORklHX0JMS19ERVZfUEFMTUNISVBfQkszNzEwX01PRFVMRSkKKyNkZWZpbmUgSEFTX0FUQSAxCisjZWxzZQorI2RlZmluZSBIQVNfQVRBIDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfREFWSU5DSSkgfHwgXAorCWRlZmluZWQoQ09ORklHX01URF9OQU5EX0RBVklOQ0lfTU9EVUxFKQorI2RlZmluZSBIQVNfTkFORCAxCisjZWxzZQorI2RlZmluZSBIQVNfTkFORCAwCisjZW5kaWYKKworc3RhdGljIF9faW5pdCB2b2lkIGRhdmluY2lfbnRvc2QyX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICphZW1pZl9jbGs7CisJc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87CisJaW50CXN0YXR1czsKKworCWFlbWlmX2NsayA9IGNsa19nZXQoTlVMTCwgImFlbWlmIik7CisJY2xrX2VuYWJsZShhZW1pZl9jbGspOworCisJaWYgKEhBU19BVEEpIHsKKwkJaWYgKEhBU19OQU5EKQorCQkJcHJfd2FybmluZygiV0FSTklORzogYm90aCBJREUgYW5kIEZsYXNoIGFyZSAiCisJCQkJImVuYWJsZWQsIGJ1dCB0aGV5IHNoYXJlIEFFTUlGIHBpbnMuXG4iCisJCQkJIlx0RGlzYWJsZSBJREUgZm9yIE5BTkQvTk9SIHN1cHBvcnQuXG4iKTsKKwkJZGF2aW5jaV9jZmdfcmVnKERNNjQ0WF9IUElFTl9ESVNBQkxFKTsKKwkJZGF2aW5jaV9jZmdfcmVnKERNNjQ0WF9BVEFFTik7CisJCWRhdmluY2lfY2ZnX3JlZyhETTY0NFhfSERJUkVOKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpZGVfZGV2KTsKKwl9IGVsc2UgaWYgKEhBU19OQU5EKSB7CisJCWRhdmluY2lfY2ZnX3JlZyhETTY0NFhfSFBJRU5fRElTQUJMRSk7CisJCWRhdmluY2lfY2ZnX3JlZyhETTY0NFhfQVRBRU5fRElTQUJMRSk7CisKKwkJLyogb25seSBvbmUgZGV2aWNlIHdpbGwgYmUganVtcGVyZWQgYW5kIGRldGVjdGVkICovCisJCWlmIChIQVNfTkFORCkKKwkJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigKKwkJCQkJJmRhdmluY2lfbnRvc2QyX25hbmRmbGFzaF9kZXZpY2UpOworCX0KKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRhdmluY2lfbnRvc2QyX2RldmljZXMsCisJCQkJQVJSQVlfU0laRShkYXZpbmNpX250b3NkMl9kZXZpY2VzKSk7CisKKwkvKiBJbml0aWFsaXplIEkyQyBpbnRlcmZhY2Ugc3BlY2lmaWMgZm9yIHRoaXMgYm9hcmQgKi8KKwlzdGF0dXMgPSBudG9zZDJfaW5pdF9pMmMoKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJfd2FybmluZygiZGF2aW5jaV9udG9zZDJfaW5pdDogbXNwNDMwIGlycSBzZXR1cCBmYWlsZWQ6IgorCQkJCQkJIgkgJWRcbiIsIHN0YXR1cyk7CisKKwlkYXZpbmNpX3NlcmlhbF9pbml0KCZ1YXJ0X2NvbmZpZyk7CisJZG02NDR4X2luaXRfYXNwKCZkbTY0NHhfbnRvc2QyX3NuZF9kYXRhKTsKKworCXNvY19pbmZvLT5lbWFjX3BkYXRhLT5waHlfbWFzayA9IE5FVVJPU19PU0QyX1BIWV9NQVNLOworCXNvY19pbmZvLT5lbWFjX3BkYXRhLT5tZGlvX21heF9mcmVxID0gTkVVUk9TX09TRDJfTURJT19GUkVRVUVOQ1k7CisKKwlkYXZpbmNpX3NldHVwX3VzYigxMDAwLCA4KTsKKwkvKgorCSAqIE11eCB0aGUgcGlucyB0byBiZSBHUElPcywgVkxZTlFFTiBpcyBhbHJlYWR5IGRvbmUgYXQgc3RhcnR1cC4KKwkgKiBUaGUgQUVBV3ggYXJlIGZpdmUgbmV3IEFFQVcgcGlucyB0aGF0IGNhbiBiZSBtdXhlZCBieSBzZXBhcmF0ZWx5LgorCSAqIFRoZXkgYXJlIGEgYml0bWFzayBmb3IgR1BJTyBtYW5hZ2VtZW50LiBBY2NvcmRpbmcgVEkKKwkgKiBkb2N1bWVudGF0aW9uIChodHRwOi8vd3d3LnRpLmNvbS9saXQvZ3BuL3RtczMyMGRtNjQ0NikgdG8gZW1wbG95CisJICogZ3BpbygxMCwxMSwxMiwxMykgZm9yIGxlZHMgYW55IGNvbWJpbmF0aW9uIG9mIGJpdHMgd29ya3MgZXhjZXB0CisJICogZm91ciBsYXN0LiBTbyB3ZSBhcmUgdG8gcmVzZXQgYWxsIGZpdmUuCisJICovCisJZGF2aW5jaV9jZmdfcmVnKERNNjQ0WF9BRUFXMCk7CisJZGF2aW5jaV9jZmdfcmVnKERNNjQ0WF9BRUFXMSk7CisJZGF2aW5jaV9jZmdfcmVnKERNNjQ0WF9BRUFXMik7CisJZGF2aW5jaV9jZmdfcmVnKERNNjQ0WF9BRUFXMyk7CisJZGF2aW5jaV9jZmdfcmVnKERNNjQ0WF9BRUFXNCk7CisKKwlkYXZpbmNpX3NldHVwX21tYygwLCAmZGF2aW5jaV9udG9zZDJfbW1jX2NvbmZpZyk7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBkYXZpbmNpX250b3NkMl9pcnFfaW5pdCh2b2lkKQoreworCWRhdmluY2lfaXJxX2luaXQoKTsKK30KKworTUFDSElORV9TVEFSVChORVVST1NfT1NEMiwgIk5ldXJvcyBPU0QyIikKKwkvKiBNYWludGFpbmVyOiBOZXVyb3MgVGVjaG5vbG9naWVzIDxuZXVyb3NAZ3JvdXBzLmdvb2dsZS5jb20+ICovCisJLnBoeXNfaW8JPSBJT19QSFlTLAorCS5pb19wZ19vZmZzdAk9IChfX0lPX0FERFJFU1MoSU9fUEhZUykgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IChEQVZJTkNJX0REUl9CQVNFICsgMHgxMDApLAorCS5tYXBfaW8JCSA9IGRhdmluY2lfbnRvc2QyX21hcF9pbywKKwkuaW5pdF9pcnEJPSBkYXZpbmNpX250b3NkMl9pcnFfaW5pdCwKKwkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCisJLmluaXRfbWFjaGluZSA9IGRhdmluY2lfbnRvc2QyX2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXNmZnNkci5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXNmZnNkci5jCmluZGV4IDdhY2RmZDguLjA4ZDM3M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1zZmZzZHIuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtc2Zmc2RyLmMKQEAgLTIzLDM1ICsyMywyNCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAogI2luY2x1ZGUgPG1hY2gvZG02NDR4Lmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2kyYy5oPgogI2luY2x1ZGUgPG1hY2gvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8bWFjaC9wc2MuaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgorI2luY2x1ZGUgPG1hY2gvdXNiLmg+CiAKICNkZWZpbmUgU0ZGU0RSX1BIWV9NQVNLCQkoMHgyKQogI2RlZmluZSBTRkZTRFJfTURJT19GUkVRVUVOQ1kJKDIyMDAwMDApIC8qIFBIWSBidXMgZnJlcXVlbmN5ICovCkBAIC0xMDcsMTEgKzk2LDYgQEAKIAkucmVzb3VyY2UJPSBkYXZpbmNpX3NmZnNkcl9uYW5kZmxhc2hfcmVzb3VyY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IGVtYWNfcGxhdGZvcm1fZGF0YSBzZmZzZHJfZW1hY19wZGF0YSA9IHsKLQkucGh5X21hc2sJPSBTRkZTRFJfUEhZX01BU0ssCi0JLm1kaW9fbWF4X2ZyZXEJPSBTRkZTRFJfTURJT19GUkVRVUVOQ1ksCi19OwotCiBzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBlZXByb21faW5mbyA9IHsKIAkuYnl0ZV9sZW4JPSAoNjQqMTAyNCkgLyA4LAogCS5wYWdlX3NpemUJPSAzMiwKQEAgLTE2NCw3ICsxNDgsNyBAQAogCWRhdmluY2lfc2VyaWFsX2luaXQoJnVhcnRfY29uZmlnKTsKIAlzb2NfaW5mby0+ZW1hY19wZGF0YS0+cGh5X21hc2sgPSBTRkZTRFJfUEhZX01BU0s7CiAJc29jX2luZm8tPmVtYWNfcGRhdGEtPm1kaW9fbWF4X2ZyZXEgPSBTRkZTRFJfTURJT19GUkVRVUVOQ1k7Ci0Jc2V0dXBfdXNiKDAsIDApOyAvKiBXZSBzdXBwb3J0IG9ubHkgcGVyaXBoZXJhbCBtb2RlLiAqLworCWRhdmluY2lfc2V0dXBfdXNiKDAsIDApOyAvKiBXZSBzdXBwb3J0IG9ubHkgcGVyaXBoZXJhbCBtb2RlLiAqLwogCiAJLyogbXV4IFZMWU5RIHBpbnMgKi8KIAlkYXZpbmNpX2NmZ19yZWcoRE02NDRYX1ZMWU5RRU4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2xvY2suYwppbmRleCA4M2Q1NGQ1Li5iYWVjZTY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2xvY2suYwpAQCAtMTcsOCArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCkBAIC00Miw4ICs0Miw3IEBACiAJaWYgKGNsay0+cGFyZW50KQogCQlfX2Nsa19lbmFibGUoY2xrLT5wYXJlbnQpOwogCWlmIChjbGstPnVzZWNvdW50KysgPT0gMCAmJiAoY2xrLT5mbGFncyAmIENMS19QU0MpKQotCQlkYXZpbmNpX3BzY19jb25maWcocHNjX2RvbWFpbihjbGspLCBjbGstPnBzY19jdGxyLAotCQkJCWNsay0+bHBzYywgMSk7CisJCWRhdmluY2lfcHNjX2NvbmZpZyhwc2NfZG9tYWluKGNsayksIGNsay0+Z3BzYywgY2xrLT5scHNjLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCkBAIC01MSw4ICs1MCw3IEBACiAJaWYgKFdBUk5fT04oY2xrLT51c2Vjb3VudCA9PSAwKSkKIAkJcmV0dXJuOwogCWlmICgtLWNsay0+dXNlY291bnQgPT0gMCAmJiAhKGNsay0+ZmxhZ3MgJiBDTEtfUExMKSkKLQkJZGF2aW5jaV9wc2NfY29uZmlnKHBzY19kb21haW4oY2xrKSwgY2xrLT5wc2NfY3RsciwKLQkJCQljbGstPmxwc2MsIDApOworCQlkYXZpbmNpX3BzY19jb25maWcocHNjX2RvbWFpbihjbGspLCBjbGstPmdwc2MsIGNsay0+bHBzYywgMCk7CiAJaWYgKGNsay0+cGFyZW50KQogCQlfX2Nsa19kaXNhYmxlKGNsay0+cGFyZW50KTsKIH0KQEAgLTk5LDE5ICs5Nyw3MyBAQAogCWlmIChjbGsgPT0gTlVMTCB8fCBJU19FUlIoY2xrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoY2xrLT5yb3VuZF9yYXRlKQorCQlyZXR1cm4gY2xrLT5yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CisKIAlyZXR1cm4gY2xrLT5yYXRlOwogfQogRVhQT1JUX1NZTUJPTChjbGtfcm91bmRfcmF0ZSk7CiAKKy8qIFByb3BhZ2F0ZSByYXRlIHRvIGNoaWxkcmVuICovCitzdGF0aWMgdm9pZCBwcm9wYWdhdGVfcmF0ZShzdHJ1Y3QgY2xrICpyb290KQoreworCXN0cnVjdCBjbGsgKmNsazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xrLCAmcm9vdC0+Y2hpbGRyZW4sIGNoaWxkbm9kZSkgeworCQlpZiAoY2xrLT5yZWNhbGMpCisJCQljbGstPnJhdGUgPSBjbGstPnJlY2FsYyhjbGspOworCQlwcm9wYWdhdGVfcmF0ZShjbGspOworCX0KK30KKwogaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKGNsayA9PSBOVUxMIHx8IElTX0VSUihjbGspKQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCWlmIChjbGstPnNldF9yYXRlKQorCQlyZXQgPSBjbGstPnNldF9yYXRlKGNsaywgcmF0ZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChjbGstPnJlY2FsYykKKwkJCWNsay0+cmF0ZSA9IGNsay0+cmVjYWxjKGNsayk7CisJCXByb3BhZ2F0ZV9yYXRlKGNsayk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3NldF9yYXRlKTsKKworaW50IGNsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlpZiAoY2xrID09IE5VTEwgfHwgSVNfRVJSKGNsaykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogY2hhbmdpbmcgdGhlIGNsayByYXRlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBDYW5ub3QgY2hhbmdlIHBhcmVudCBvbiBlbmFibGVkIGNsb2NrICovCisJaWYgKFdBUk5fT04oY2xrLT51c2Vjb3VudCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKKwljbGstPnBhcmVudCA9IHBhcmVudDsKKwlsaXN0X2RlbF9pbml0KCZjbGstPmNoaWxkbm9kZSk7CisJbGlzdF9hZGQoJmNsay0+Y2hpbGRub2RlLCAmY2xrLT5wYXJlbnQtPmNoaWxkcmVuKTsKKwltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJaWYgKGNsay0+cmVjYWxjKQorCQljbGstPnJhdGUgPSBjbGstPnJlY2FsYyhjbGspOworCXByb3BhZ2F0ZV9yYXRlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woY2xrX3NldF9yYXRlKTsKK0VYUE9SVF9TWU1CT0woY2xrX3NldF9wYXJlbnQpOwogCiBpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKIHsKQEAgLTEyMywxNiArMTc1LDI0IEBACiAJCQljbGstPm5hbWUsIGNsay0+cGFyZW50LT5uYW1lKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlJTklUX0xJU1RfSEVBRCgmY2xrLT5jaGlsZHJlbik7CisKIAltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJmNsay0+bm9kZSwgJmNsb2Nrcyk7CisJaWYgKGNsay0+cGFyZW50KQorCQlsaXN0X2FkZF90YWlsKCZjbGstPmNoaWxkbm9kZSwgJmNsay0+cGFyZW50LT5jaGlsZHJlbik7CiAJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJLyogSWYgcmF0ZSBpcyBhbHJlYWR5IHNldCwgdXNlIGl0ICovCiAJaWYgKGNsay0+cmF0ZSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBFbHNlLCBzZWUgaWYgdGhlcmUgaXMgYSB3YXkgdG8gY2FsY3VsYXRlIGl0ICovCisJaWYgKGNsay0+cmVjYWxjKQorCQljbGstPnJhdGUgPSBjbGstPnJlY2FsYyhjbGspOworCiAJLyogT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIHBhcmVudCByYXRlICovCi0JaWYgKGNsay0+cGFyZW50KQorCWVsc2UgaWYgKGNsay0+cGFyZW50KQogCQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKIAogCXJldHVybiAwOwpAQCAtMTQ2LDYgKzIwNiw3IEBACiAKIAltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCWxpc3RfZGVsKCZjbGstPm5vZGUpOworCWxpc3RfZGVsKCZjbGstPmNoaWxkbm9kZSk7CiAJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CkBAIC0xNjYsMTEgKzIyNywxMSBAQAogCQkJY29udGludWU7CiAKIAkJLyogaWdub3JlIGlmIGluIERpc2FibGVkIG9yIFN3UnN0RGlzYWJsZSBzdGF0ZXMgKi8KLQkJaWYgKCFkYXZpbmNpX3BzY19pc19jbGtfYWN0aXZlKGNrLT5wc2NfY3RsciwgY2stPmxwc2MpKQorCQlpZiAoIWRhdmluY2lfcHNjX2lzX2Nsa19hY3RpdmUoY2stPmdwc2MsIGNrLT5scHNjKSkKIAkJCWNvbnRpbnVlOwogCiAJCXByX2luZm8oIkNsb2NrczogZGlzYWJsZSB1bnVzZWQgJXNcbiIsIGNrLT5uYW1lKTsKLQkJZGF2aW5jaV9wc2NfY29uZmlnKHBzY19kb21haW4oY2spLCBjay0+cHNjX2N0bHIsIGNrLT5scHNjLCAwKTsKKwkJZGF2aW5jaV9wc2NfY29uZmlnKHBzY19kb21haW4oY2spLCBjay0+Z3BzYywgY2stPmxwc2MsIDApOwogCX0KIAlzcGluX3VubG9ja19pcnEoJmNsb2NrZndfbG9jayk7CiAKQEAgLTE3OSw1MCArMjQwLDYyIEBACiBsYXRlX2luaXRjYWxsKGNsa19kaXNhYmxlX3VudXNlZCk7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgY2xrX3N5c2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3N5c2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCXUzMiB2LCBwbGxkaXY7CiAJc3RydWN0IHBsbF9kYXRhICpwbGw7CisJdW5zaWduZWQgbG9uZyByYXRlID0gY2xrLT5yYXRlOwogCiAJLyogSWYgdGhpcyBpcyB0aGUgUExMIGJhc2UgY2xvY2ssIG5vIG1vcmUgY2FsY3VsYXRpb25zIG5lZWRlZCAqLwogCWlmIChjbGstPnBsbF9kYXRhKQotCQlyZXR1cm47CisJCXJldHVybiByYXRlOwogCiAJaWYgKFdBUk5fT04oIWNsay0+cGFyZW50KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmF0ZTsKIAotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlOworCXJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKIAogCS8qIE90aGVyd2lzZSwgdGhlIHBhcmVudCBtdXN0IGJlIGEgUExMICovCiAJaWYgKFdBUk5fT04oIWNsay0+cGFyZW50LT5wbGxfZGF0YSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIHJhdGU7CiAKIAlwbGwgPSBjbGstPnBhcmVudC0+cGxsX2RhdGE7CiAKIAkvKiBJZiBwcmUtUExMLCBzb3VyY2UgY2xvY2sgaXMgYmVmb3JlIHRoZSBtdWx0aXBsaWVyIGFuZCBkaXZpZGVyKHMpICovCiAJaWYgKGNsay0+ZmxhZ3MgJiBQUkVfUExMKQotCQljbGstPnJhdGUgPSBwbGwtPmlucHV0X3JhdGU7CisJCXJhdGUgPSBwbGwtPmlucHV0X3JhdGU7CiAKIAlpZiAoIWNsay0+ZGl2X3JlZykKLQkJcmV0dXJuOworCQlyZXR1cm4gcmF0ZTsKIAogCXYgPSBfX3Jhd19yZWFkbChwbGwtPmJhc2UgKyBjbGstPmRpdl9yZWcpOwogCWlmICh2ICYgUExMRElWX0VOKSB7CiAJCXBsbGRpdiA9ICh2ICYgUExMRElWX1JBVElPX01BU0spICsgMTsKIAkJaWYgKHBsbGRpdikKLQkJCWNsay0+cmF0ZSAvPSBwbGxkaXY7CisJCQlyYXRlIC89IHBsbGRpdjsKIAl9CisKKwlyZXR1cm4gcmF0ZTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNsa19wbGxfaW5pdChzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfbGVhZmNsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChXQVJOX09OKCFjbGstPnBhcmVudCkpCisJCXJldHVybiBjbGstPnJhdGU7CisKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19wbGxjbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1MzIgY3RybCwgbXVsdCA9IDEsIHByZWRpdiA9IDEsIHBvc3RkaXYgPSAxOwogCXU4IGJ5cGFzczsKIAlzdHJ1Y3QgcGxsX2RhdGEgKnBsbCA9IGNsay0+cGxsX2RhdGE7CisJdW5zaWduZWQgbG9uZyByYXRlID0gY2xrLT5yYXRlOwogCiAJcGxsLT5iYXNlID0gSU9fQUREUkVTUyhwbGwtPnBoeXNfYmFzZSk7CiAJY3RybCA9IF9fcmF3X3JlYWRsKHBsbC0+YmFzZSArIFBMTENUTCk7Ci0JY2xrLT5yYXRlID0gcGxsLT5pbnB1dF9yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGU7CisJcmF0ZSA9IHBsbC0+aW5wdXRfcmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlOwogCiAJaWYgKGN0cmwgJiBQTExDVExfUExMRU4pIHsKIAkJYnlwYXNzID0gMDsKQEAgLTI1NSw5ICszMjgsOSBAQAogCX0KIAogCWlmICghYnlwYXNzKSB7Ci0JCWNsay0+cmF0ZSAvPSBwcmVkaXY7Ci0JCWNsay0+cmF0ZSAqPSBtdWx0OwotCQljbGstPnJhdGUgLz0gcG9zdGRpdjsKKwkJcmF0ZSAvPSBwcmVkaXY7CisJCXJhdGUgKj0gbXVsdDsKKwkJcmF0ZSAvPSBwb3N0ZGl2OwogCX0KIAogCXByX2RlYnVnKCJQTEwlZDogaW5wdXQgPSAlbHUgTUh6IFsgIiwKQEAgLTI3MCw5ICszNDMsOTEgQEAKIAkJcHJfZGVidWcoIiogJWQgIiwgbXVsdCk7CiAJaWYgKHBvc3RkaXYgPiAxKQogCQlwcl9kZWJ1ZygiLyAlZCAiLCBwb3N0ZGl2KTsKLQlwcl9kZWJ1ZygiXSAtLT4gJWx1IE1IeiBvdXRwdXQuXG4iLCBjbGstPnJhdGUgLyAxMDAwMDAwKTsKKwlwcl9kZWJ1ZygiXSAtLT4gJWx1IE1IeiBvdXRwdXQuXG4iLCByYXRlIC8gMTAwMDAwMCk7CisKKwlyZXR1cm4gcmF0ZTsKIH0KIAorLyoqCisgKiBkYXZpbmNpX3NldF9wbGxyYXRlIC0gc2V0IHRoZSBvdXRwdXQgcmF0ZSBvZiBhIGdpdmVuIFBMTC4KKyAqCisgKiBOb3RlOiBDdXJyZW50bHkgdGVzdGVkIHRvIHdvcmsgd2l0aCBPTUFQLUwxMzggb25seS4KKyAqCisgKiBAcGxsOiBwbGwgd2hvc2UgcmF0ZSBuZWVkcyB0byBiZSBjaGFuZ2VkLgorICogQHByZWRpdjogVGhlIHByZSBkaXZpZGVyIHZhbHVlLiBQYXNzaW5nIDAgZGlzYWJsZXMgdGhlIHByZS1kaXZpZGVyLgorICogQHBsbG06IFRoZSBtdWx0aXBsaWVyIHZhbHVlLiBQYXNzaW5nIDAgbGVhZHMgdG8gbXVsdGlwbHktYnktb25lLgorICogQHBvc3RkaXY6IFRoZSBwb3N0IGRpdmlkZXIgdmFsdWUuIFBhc3NpbmcgMCBkaXNhYmxlcyB0aGUgcG9zdC1kaXZpZGVyLgorICovCitpbnQgZGF2aW5jaV9zZXRfcGxscmF0ZShzdHJ1Y3QgcGxsX2RhdGEgKnBsbCwgdW5zaWduZWQgaW50IHByZWRpdiwKKwkJCQkJdW5zaWduZWQgaW50IG11bHQsIHVuc2lnbmVkIGludCBwb3N0ZGl2KQoreworCXUzMiBjdHJsOworCXVuc2lnbmVkIGludCBsb2NrdGltZTsKKworCWlmIChwbGwtPmJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqICBQTEwgbG9jayB0aW1lIHJlcXVpcmVkIHBlciBPTUFQLUwxMzggZGF0YXNoZWV0IGlzCisJICogKDIwMDAgKiBwcmVkaXYpL3NxcnQocGxsbSkgT1NDSU4gY3ljbGVzLiBXZSBhcHByb3hpbWF0ZSBzcXJ0KHBsbG0pCisJICogYXMgNCBhbmQgT1NDSU4gY3ljbGUgYXMgMjUgTUh6LgorCSAqLworCWlmIChwcmVkaXYpIHsKKwkJbG9ja3RpbWUgPSAoKDIwMDAgKiBwcmVkaXYpIC8gMTAwKTsKKwkJcHJlZGl2ID0gKHByZWRpdiAtIDEpIHwgUExMRElWX0VOOworCX0gZWxzZSB7CisJCWxvY2t0aW1lID0gMjA7CisJfQorCWlmIChwb3N0ZGl2KQorCQlwb3N0ZGl2ID0gKHBvc3RkaXYgLSAxKSB8IFBMTERJVl9FTjsKKwlpZiAobXVsdCkKKwkJbXVsdCA9IG11bHQgLSAxOworCisJY3RybCA9IF9fcmF3X3JlYWRsKHBsbC0+YmFzZSArIFBMTENUTCk7CisKKwkvKiBTd2l0Y2ggdGhlIFBMTCB0byBieXBhc3MgbW9kZSAqLworCWN0cmwgJj0gfihQTExDVExfUExMRU5TUkMgfCBQTExDVExfUExMRU4pOworCV9fcmF3X3dyaXRlbChjdHJsLCBwbGwtPmJhc2UgKyBQTExDVEwpOworCisJLyoKKwkgKiBXYWl0IGZvciA0IE9TQ0lOL0NMS0lOIGN5Y2xlcyB0byBlbnN1cmUgdGhhdCB0aGUgUExMQyBoYXMgc3dpdGNoZWQKKwkgKiB0byBieXBhc3MgbW9kZS4gRGVsYXkgb2YgMXVzIGVuc3VyZXMgd2UgYXJlIGdvb2QgZm9yIGFsbCA+IDRNSHoKKwkgKiBPU0NJTi9DTEtJTiBpbnB1dHMuIFR5cGljYWxseSB0aGUgaW5wdXQgaXMgfjI1TUh6LgorCSAqLworCXVkZWxheSgxKTsKKworCS8qIFJlc2V0IGFuZCBlbmFibGUgUExMICovCisJY3RybCAmPSB+KFBMTENUTF9QTExSU1QgfCBQTExDVExfUExMRElTKTsKKwlfX3Jhd193cml0ZWwoY3RybCwgcGxsLT5iYXNlICsgUExMQ1RMKTsKKworCWlmIChwbGwtPmZsYWdzICYgUExMX0hBU19QUkVESVYpCisJCV9fcmF3X3dyaXRlbChwcmVkaXYsIHBsbC0+YmFzZSArIFBSRURJVik7CisKKwlfX3Jhd193cml0ZWwobXVsdCwgcGxsLT5iYXNlICsgUExMTSk7CisKKwlpZiAocGxsLT5mbGFncyAmIFBMTF9IQVNfUE9TVERJVikKKwkJX19yYXdfd3JpdGVsKHBvc3RkaXYsIHBsbC0+YmFzZSArIFBPU1RESVYpOworCisJLyoKKwkgKiBXYWl0IGZvciBQTEwgdG8gcmVzZXQgcHJvcGVybHksIE9NQVAtTDEzOCBkYXRhc2hlZXQgc2F5cworCSAqICdtaW4nIHRpbWUgPSAxMjVucworCSAqLworCXVkZWxheSgxKTsKKworCS8qIEJyaW5nIFBMTCBvdXQgb2YgcmVzZXQgKi8KKwljdHJsIHw9IFBMTENUTF9QTExSU1Q7CisJX19yYXdfd3JpdGVsKGN0cmwsIHBsbC0+YmFzZSArIFBMTENUTCk7CisKKwl1ZGVsYXkobG9ja3RpbWUpOworCisJLyogUmVtb3ZlIFBMTCBmcm9tIGJ5cGFzcyBtb2RlICovCisJY3RybCB8PSBQTExDVExfUExMRU47CisJX19yYXdfd3JpdGVsKGN0cmwsIHBsbC0+YmFzZSArIFBMTENUTCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZGF2aW5jaV9zZXRfcGxscmF0ZSk7CisKIGludCBfX2luaXQgZGF2aW5jaV9jbGtfaW5pdChzdHJ1Y3QgZGF2aW5jaV9jbGsgKmNsb2NrcykKICAgewogCXN0cnVjdCBkYXZpbmNpX2NsayAqYzsKQEAgLTI4MSwxMiArNDM2LDIzIEBACiAJZm9yIChjID0gY2xvY2tzOyBjLT5say5jbGs7IGMrKykgewogCQljbGsgPSBjLT5say5jbGs7CiAKLQkJaWYgKGNsay0+cGxsX2RhdGEpCi0JCQljbGtfcGxsX2luaXQoY2xrKTsKKwkJaWYgKCFjbGstPnJlY2FsYykgewogCi0JCS8qIENhbGN1bGF0ZSByYXRlcyBmb3IgUExMLWRlcml2ZWQgY2xvY2tzICovCi0JCWVsc2UgaWYgKGNsay0+ZmxhZ3MgJiBDTEtfUExMKQotCQkJY2xrX3N5c2Nsa19yZWNhbGMoY2xrKTsKKwkJCS8qIENoZWNrIGlmIGNsb2NrIGlzIGEgUExMICovCisJCQlpZiAoY2xrLT5wbGxfZGF0YSkKKwkJCQljbGstPnJlY2FsYyA9IGNsa19wbGxjbGtfcmVjYWxjOworCisJCQkvKiBFbHNlLCBpZiBpdCBpcyBhIFBMTC1kZXJpdmVkIGNsb2NrICovCisJCQllbHNlIGlmIChjbGstPmZsYWdzICYgQ0xLX1BMTCkKKwkJCQljbGstPnJlY2FsYyA9IGNsa19zeXNjbGtfcmVjYWxjOworCisJCQkvKiBPdGhlcndpc2UsIGl0IGlzIGEgbGVhZiBjbG9jayAoUFNDIGNsb2NrKSAqLworCQkJZWxzZSBpZiAoY2xrLT5wYXJlbnQpCisJCQkJY2xrLT5yZWNhbGMgPSBjbGtfbGVhZmNsa19yZWNhbGM7CisJCX0KKworCQlpZiAoY2xrLT5yZWNhbGMpCisJCQljbGstPnJhdGUgPSBjbGstPnJlY2FsYyhjbGspOwogCiAJCWlmIChjbGstPmxwc2MpCiAJCQljbGstPmZsYWdzIHw9IENMS19QU0M7CkBAIC0zNTIsOSArNTE4LDggQEAKIAkvKiBSRVZJU0lUIHNob3cgZGV2aWNlIGFzc29jaWF0aW9ucyB0b28gKi8KIAogCS8qIGNvc3QgaXMgbm93IHNtYWxsLCBidXQgbm90IGxpbmVhci4uLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xrLCAmY2xvY2tzLCBub2RlKSB7Ci0JCWlmIChjbGstPnBhcmVudCA9PSBwYXJlbnQpCi0JCQlkdW1wX2Nsb2NrKHMsIG5lc3QgKyBORVNUX0RFTFRBLCBjbGspOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xrLCAmcGFyZW50LT5jaGlsZHJlbiwgY2hpbGRub2RlKSB7CisJCWR1bXBfY2xvY2socywgbmVzdCArIE5FU1RfREVMVEEsIGNsayk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jbG9jay5oCmluZGV4IDI3MjMzY2IuLmM5MmQ3N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jbG9jay5oCkBAIC0yMiw2ICsyMiwxMCBAQAogLyogUExML1Jlc2V0IHJlZ2lzdGVyIG9mZnNldHMgKi8KICNkZWZpbmUgUExMQ1RMICAgICAgICAgIDB4MTAwCiAjZGVmaW5lIFBMTENUTF9QTExFTiAgICBCSVQoMCkKKyNkZWZpbmUgUExMQ1RMX1BMTFBXUkROCUJJVCgxKQorI2RlZmluZSBQTExDVExfUExMUlNUCUJJVCgzKQorI2RlZmluZSBQTExDVExfUExMRElTCUJJVCg0KQorI2RlZmluZSBQTExDVExfUExMRU5TUkMJQklUKDUpCiAjZGVmaW5lIFBMTENUTF9DTEtNT0RFICBCSVQoOCkKIAogI2RlZmluZSBQTExNCQkweDExMApAQCAtNjUsMTUgKzY5LDIwIEBACiAJY29uc3QgY2hhcgkJKm5hbWU7CiAJdW5zaWduZWQgbG9uZwkJcmF0ZTsKIAl1OAkJCXVzZWNvdW50OwotCXU4CQkJZmxhZ3M7CiAJdTgJCQlscHNjOwotCXU4CQkJcHNjX2N0bHI7CisJdTgJCQlncHNjOworCXUzMgkJCWZsYWdzOwogCXN0cnVjdCBjbGsgICAgICAgICAgICAgICpwYXJlbnQ7CisJc3RydWN0IGxpc3RfaGVhZAljaGlsZHJlbjsgCS8qIGxpc3Qgb2YgY2hpbGRyZW4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWNoaWxkbm9kZTsJLyogcGFyZW50J3MgY2hpbGQgbGlzdCBub2RlICovCiAJc3RydWN0IHBsbF9kYXRhICAgICAgICAgKnBsbF9kYXRhOwogCXUzMiAgICAgICAgICAgICAgICAgICAgIGRpdl9yZWc7CisJdW5zaWduZWQgbG9uZyAoKnJlY2FsYykgKHN0cnVjdCBjbGsgKik7CisJaW50ICgqc2V0X3JhdGUpIChzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CisJaW50ICgqcm91bmRfcmF0ZSkgKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKIH07CiAKLS8qIENsb2NrIGZsYWdzICovCisvKiBDbG9jayBmbGFnczogU29DLXNwZWNpZmljIGZsYWdzIHN0YXJ0IGF0IEJJVCgxNikgKi8KICNkZWZpbmUgQUxXQVlTX0VOQUJMRUQJCUJJVCgxKQogI2RlZmluZSBDTEtfUFNDICAgICAgICAgICAgICAgICBCSVQoMikKICNkZWZpbmUgUFNDX0RTUCAgICAgICAgICAgICAgICAgQklUKDMpIC8qIFBTQyB1c2VzIERTUCBkb21haW4sIG5vdCBBUk0gKi8KQEAgLTk0LDYgKzEwMyw4IEBACiAJfQogCiBpbnQgZGF2aW5jaV9jbGtfaW5pdChzdHJ1Y3QgZGF2aW5jaV9jbGsgKmNsb2Nrcyk7CitpbnQgZGF2aW5jaV9zZXRfcGxscmF0ZShzdHJ1Y3QgcGxsX2RhdGEgKnBsbCwgdW5zaWduZWQgaW50IHByZWRpdiwKKwkJCQl1bnNpZ25lZCBpbnQgbXVsdCwgdW5zaWduZWQgaW50IHBvc3RkaXYpOwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYXZpbmNpX3dkdF9kZXZpY2U7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jb21tb24uYwppbmRleCA2MWVkZTE5Li5jMmRlOTRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NvbW1vbi5jCkBAIC04Niw2ICs4Niw4IEBACiAJZGlwID0gZGF2aW5jaV9nZXRfaWQoZGF2aW5jaV9zb2NfaW5mby5qdGFnX2lkKTsKIAlpZiAoIWRpcCkgewogCQlyZXQgPSAtRUlOVkFMOworCQlwcl9lcnIoIlVua25vd24gRGFWaW5jaSBKVEFHIElEIDB4JXhcbiIsCisJCQkJCQlkYXZpbmNpX3NvY19pbmZvLmp0YWdfaWQpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTEwNCw1ICsxMDYsNSBAQAogCXJldHVybjsKIAogZXJyOgotCXByX2VycigiZGF2aW5jaV9jb21tb25faW5pdDogU29DIEluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJcGFuaWMoImRhdmluY2lfY29tbW9uX2luaXQ6IFNvQyBJbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwX2ludGMuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcF9pbnRjLmMKaW5kZXggOTZjOGU5Ny4uNTJiMjg3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwX2ludGMuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3BfaW50Yy5jCkBAIC0xMCw5ICsxMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVmcmVxLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1ZnJlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZmE2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1ZnJlcS5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGZvciBEYVZpbmNpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIEJhc2VkIG9uIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jLiBPcmlnaW5hbCBDb3B5cmlnaHQgZm9sbG93czoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiAgV3JpdHRlbiBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgorICoKKyAqICBCYXNlZCBvbiBjcHUtc2ExMTEwLmMsIENvcHlyaWdodCAoQykgMjAwMSBSdXNzZWxsIEtpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogVXBkYXRlZCB0byBzdXBwb3J0IE9NQVAzCisgKiBSYWplbmRyYSBOYXlhayA8cm5heWFrQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorCitzdHJ1Y3QgZGF2aW5jaV9jcHVmcmVxIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGNsayAqYXJtY2xrOworfTsKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9jcHVmcmVxIGNwdWZyZXE7CisKK3N0YXRpYyBpbnQgZGF2aW5jaV92ZXJpZnlfc3BlZWQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGRhdmluY2lfY3B1ZnJlcV9jb25maWcgKnBkYXRhID0gY3B1ZnJlcS5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlID0gcGRhdGEtPmZyZXFfdGFibGU7CisJc3RydWN0IGNsayAqYXJtY2xrID0gY3B1ZnJlcS5hcm1jbGs7CisKKwlpZiAoZnJlcV90YWJsZSkKKwkJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIGZyZXFfdGFibGUpOworCisJaWYgKHBvbGljeS0+Y3B1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsCisJCQkJICAgICBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCisJcG9saWN5LT5taW4gPSBjbGtfcm91bmRfcmF0ZShhcm1jbGssIHBvbGljeS0+bWluICogMTAwMCkgLyAxMDAwOworCXBvbGljeS0+bWF4ID0gY2xrX3JvdW5kX3JhdGUoYXJtY2xrLCBwb2xpY3ktPm1heCAqIDEwMDApIC8gMTAwMDsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxLAorCQkJCQkJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkYXZpbmNpX2dldHNwZWVkKHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNwdWZyZXEuYXJtY2xrKSAvIDEwMDA7Cit9CisKK3N0YXRpYyBpbnQgZGF2aW5jaV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGlkeDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwlzdHJ1Y3QgZGF2aW5jaV9jcHVmcmVxX2NvbmZpZyAqcGRhdGEgPSBjcHVmcmVxLmRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgY2xrICphcm1jbGsgPSBjcHVmcmVxLmFybWNsazsKKworCS8qCisJICogRW5zdXJlIGRlc2lyZWQgcmF0ZSBpcyB3aXRoaW4gYWxsb3dlZCByYW5nZS4gIFNvbWUgZ292ZW5vcnMKKwkgKiAob25kZW1hbmQpIHdpbGwganVzdCBwYXNzIHRhcmdldF9mcmVxPTAgdG8gZ2V0IHRoZSBtaW5pbXVtLgorCSAqLworCWlmICh0YXJnZXRfZnJlcSA8IHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSkKKwkJdGFyZ2V0X2ZyZXEgPSBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXE7CisJaWYgKHRhcmdldF9mcmVxID4gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKQorCQl0YXJnZXRfZnJlcSA9IHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcTsKKworCWZyZXFzLm9sZCA9IGRhdmluY2lfZ2V0c3BlZWQoMCk7CisJZnJlcXMubmV3ID0gY2xrX3JvdW5kX3JhdGUoYXJtY2xrLCB0YXJnZXRfZnJlcSAqIDEwMDApIC8gMTAwMDsKKwlmcmVxcy5jcHUgPSAwOworCisJaWYgKGZyZXFzLm9sZCA9PSBmcmVxcy5uZXcpCisJCXJldHVybiByZXQ7CisKKwljcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwKKwkJCWRldl9kcml2ZXJfc3RyaW5nKGNwdWZyZXEuZGV2KSwKKwkJCSJ0cmFuc2l0aW9uOiAldSAtLT4gJXVcbiIsIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHBkYXRhLT5mcmVxX3RhYmxlLAorCQkJCQkJZnJlcXMubmV3LCByZWxhdGlvbiwgJmlkeCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogaWYgbW92aW5nIHRvIGhpZ2hlciBmcmVxdWVuY3ksIHVwIHRoZSB2b2x0YWdlIGJlZm9yZWhhbmQgKi8KKwlpZiAocGRhdGEtPnNldF92b2x0YWdlICYmIGZyZXFzLm5ldyA+IGZyZXFzLm9sZCkKKwkJcGRhdGEtPnNldF92b2x0YWdlKGlkeCk7CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoYXJtY2xrLCBpZHgpOworCisJLyogaWYgbW92aW5nIHRvIGxvd2VyIGZyZXEsIGxvd2VyIHRoZSB2b2x0YWdlIGFmdGVyIGxvd2VyaW5nIGZyZXEgKi8KKwlpZiAocGRhdGEtPnNldF92b2x0YWdlICYmIGZyZXFzLm5ldyA8IGZyZXFzLm9sZCkKKwkJcGRhdGEtPnNldF92b2x0YWdlKGlkeCk7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGRhdmluY2lfY3B1ZnJlcV9jb25maWcgKnBkYXRhID0gY3B1ZnJlcS5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlID0gcGRhdGEtPmZyZXFfdGFibGU7CisKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBGaW5pc2ggcGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwlpZiAocGRhdGEtPmluaXQpIHsKKwkJcmVzdWx0ID0gcGRhdGEtPmluaXQoKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCisJcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gZGF2aW5jaV9nZXRzcGVlZCgwKTsKKworCWlmIChmcmVxX3RhYmxlKSB7CisJCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBmcmVxX3RhYmxlKTsKKwkJaWYgKCFyZXN1bHQpCisJCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihmcmVxX3RhYmxlLAorCQkJCQkJCXBvbGljeS0+Y3B1KTsKKwl9IGVsc2UgeworCQlwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEgPSBwb2xpY3ktPm1pbjsKKwkJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gcG9saWN5LT5tYXg7CisJfQorCisJcG9saWN5LT5taW4gPSBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXE7CisJcG9saWN5LT5tYXggPSBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXE7CisJcG9saWN5LT5jdXIgPSBkYXZpbmNpX2dldHNwZWVkKDApOworCisJLyoKKwkgKiBUaW1lIG1lYXN1cmVtZW50IGFjcm9zcyB0aGUgdGFyZ2V0KCkgZnVuY3Rpb24geWllbGRzIH4xNTAwLTE4MDB1cworCSAqIHRpbWUgdGFrZW4gd2l0aCBubyBkcml2ZXJzIG9uIG5vdGlmaWNhdGlvbiBsaXN0LgorCSAqIFNldHRpbmcgdGhlIGxhdGVuY3kgdG8gMjAwMCB1cyB0byBhY2NvbW9kYXRlIGFkZGl0aW9uIG9mIGRyaXZlcnMKKwkgKiB0byBwcmUvcG9zdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGxpc3QuCisJICovCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDIwMDAgKiAxMDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhdmluY2lfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciAqZGF2aW5jaV9jcHVmcmVxX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgZGF2aW5jaV9kcml2ZXIgPSB7CisJLmZsYWdzCQk9IENQVUZSRVFfU1RJQ0tZLAorCS52ZXJpZnkJCT0gZGF2aW5jaV92ZXJpZnlfc3BlZWQsCisJLnRhcmdldAkJPSBkYXZpbmNpX3RhcmdldCwKKwkuZ2V0CQk9IGRhdmluY2lfZ2V0c3BlZWQsCisJLmluaXQJCT0gZGF2aW5jaV9jcHVfaW5pdCwKKwkuZXhpdAkJPSBkYXZpbmNpX2NwdV9leGl0LAorCS5uYW1lCQk9ICJkYXZpbmNpIiwKKwkuYXR0cgkJPSBkYXZpbmNpX2NwdWZyZXFfYXR0ciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfY3B1ZnJlcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYXZpbmNpX2NwdWZyZXFfY29uZmlnICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwZGF0YS0+ZnJlcV90YWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcHVmcmVxLmRldiA9ICZwZGV2LT5kZXY7CisKKwljcHVmcmVxLmFybWNsayA9IGNsa19nZXQoTlVMTCwgImFybSIpOworCWlmIChJU19FUlIoY3B1ZnJlcS5hcm1jbGspKSB7CisJCWRldl9lcnIoY3B1ZnJlcS5kZXYsICJVbmFibGUgdG8gZ2V0IEFSTSBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGNwdWZyZXEuYXJtY2xrKTsKKwl9CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmRhdmluY2lfZHJpdmVyKTsKK30KKworc3RhdGljIGludCBfX2V4aXQgZGF2aW5jaV9jcHVmcmVxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNsa19wdXQoY3B1ZnJlcS5hcm1jbGspOworCisJcmV0dXJuIGNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmRhdmluY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGF2aW5jaV9jcHVmcmVxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkgPSAiY3B1ZnJlcS1kYXZpbmNpIiwKKwkJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSA9IF9fZXhpdF9wKGRhdmluY2lfY3B1ZnJlcV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9jcHVmcmVxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZkYXZpbmNpX2NwdWZyZXFfZHJpdmVyLAorCQkJCQkJCWRhdmluY2lfY3B1ZnJlcV9wcm9iZSk7Cit9CitsYXRlX2luaXRjYWxsKGRhdmluY2lfY3B1ZnJlcV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWlkbGUuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVpZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhOTBmMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVpZGxlLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDUFUgaWRsZSBmb3IgRGFWaW5jaSBTb0NzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZC4gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogRGVyaXZlZCBmcm9tIE1hcnZlbGwgS2lya3dvb2QgQ1BVIGlkbGUgY29kZQorICogKGFyY2gvYXJtL21hY2gta2lya3dvb2QvY3B1aWRsZS5jKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KKworI2luY2x1ZGUgPG1hY2gvY3B1aWRsZS5oPgorCisjZGVmaW5lIERBVklOQ0lfQ1BVSURMRV9NQVhfU1RBVEVTCTIKKworc3RydWN0IGRhdmluY2lfb3BzIHsKKwl2b2lkICgqZW50ZXIpICh1MzIgZmxhZ3MpOworCXZvaWQgKCpleGl0KSAodTMyIGZsYWdzKTsKKwl1MzIgZmxhZ3M7Cit9OworCisvKiBmaWVsZHMgaW4gZGF2aW5jaV9vcHMuZmxhZ3MgKi8KKyNkZWZpbmUgREFWSU5DSV9DUFVJRExFX0ZMQUdTX0REUjJfUFdETglCSVQoMCkKKworc3RhdGljIHN0cnVjdCBjcHVpZGxlX2RyaXZlciBkYXZpbmNpX2lkbGVfZHJpdmVyID0geworCS5uYW1lCT0gImNwdWlkbGUtZGF2aW5jaSIsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdWlkbGVfZGV2aWNlLCBkYXZpbmNpX2NwdWlkbGVfZGV2aWNlKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmRkcjJfcmVnX2Jhc2U7CisKKyNkZWZpbmUgRERSMl9TRFJDUl9PRkZTRVQJMHhjCisjZGVmaW5lIEREUjJfU1JQRF9CSVQJCUJJVCgyMykKKyNkZWZpbmUgRERSMl9MUE1PREVOX0JJVAlCSVQoMzEpCisKK3N0YXRpYyB2b2lkIGRhdmluY2lfc2F2ZV9kZHJfcG93ZXIoaW50IGVudGVyLCBib29sIHBkb3duKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChkZHIyX3JlZ19iYXNlICsgRERSMl9TRFJDUl9PRkZTRVQpOworCisJaWYgKGVudGVyKSB7CisJCWlmIChwZG93bikKKwkJCXZhbCB8PSBERFIyX1NSUERfQklUOworCQllbHNlCisJCQl2YWwgJj0gfkREUjJfU1JQRF9CSVQ7CisJCXZhbCB8PSBERFIyX0xQTU9ERU5fQklUOworCX0gZWxzZSB7CisJCXZhbCAmPSB+KEREUjJfU1JQRF9CSVQgfCBERFIyX0xQTU9ERU5fQklUKTsKKwl9CisKKwlfX3Jhd193cml0ZWwodmFsLCBkZHIyX3JlZ19iYXNlICsgRERSMl9TRFJDUl9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBkYXZpbmNpX2Myc3RhdGVfZW50ZXIodTMyIGZsYWdzKQoreworCWRhdmluY2lfc2F2ZV9kZHJfcG93ZXIoMSwgISEoZmxhZ3MgJiBEQVZJTkNJX0NQVUlETEVfRkxBR1NfRERSMl9QV0ROKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdmluY2lfYzJzdGF0ZV9leGl0KHUzMiBmbGFncykKK3sKKwlkYXZpbmNpX3NhdmVfZGRyX3Bvd2VyKDAsICEhKGZsYWdzICYgREFWSU5DSV9DUFVJRExFX0ZMQUdTX0REUjJfUFdETikpOworfQorCitzdGF0aWMgc3RydWN0IGRhdmluY2lfb3BzIGRhdmluY2lfc3RhdGVzW0RBVklOQ0lfQ1BVSURMRV9NQVhfU1RBVEVTXSA9IHsKKwlbMV0gPSB7CisJCS5lbnRlcgk9IGRhdmluY2lfYzJzdGF0ZV9lbnRlciwKKwkJLmV4aXQJPSBkYXZpbmNpX2Myc3RhdGVfZXhpdCwKKwl9LAorfTsKKworLyogQWN0dWFsIGNvZGUgdGhhdCBwdXRzIHRoZSBTb0MgaW4gZGlmZmVyZW50IGlkbGUgc3RhdGVzICovCitzdGF0aWMgaW50IGRhdmluY2lfZW50ZXJfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9vcHMgKm9wcyA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZSk7CisJc3RydWN0IHRpbWV2YWwgYmVmb3JlLCBhZnRlcjsKKwlpbnQgaWRsZV90aW1lOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkb19nZXR0aW1lb2ZkYXkoJmJlZm9yZSk7CisKKwlpZiAob3BzICYmIG9wcy0+ZW50ZXIpCisJCW9wcy0+ZW50ZXIob3BzLT5mbGFncyk7CisJLyogV2FpdCBmb3IgaW50ZXJydXB0IHN0YXRlICovCisJY3B1X2RvX2lkbGUoKTsKKwlpZiAob3BzICYmIG9wcy0+ZXhpdCkKKwkJb3BzLT5leGl0KG9wcy0+ZmxhZ3MpOworCisJZG9fZ2V0dGltZW9mZGF5KCZhZnRlcik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlkbGVfdGltZSA9IChhZnRlci50dl9zZWMgLSBiZWZvcmUudHZfc2VjKSAqIFVTRUNfUEVSX1NFQyArCisJCQkoYWZ0ZXIudHZfdXNlYyAtIGJlZm9yZS50dl91c2VjKTsKKwlyZXR1cm4gaWRsZV90aW1lOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX2NwdWlkbGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBkYXZpbmNpX2NwdWlkbGVfY29uZmlnICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCByZXNvdXJjZSAqZGRyMl9yZWdzOworCXJlc291cmNlX3NpemVfdCBsZW47CisKKwlkZXZpY2UgPSAmcGVyX2NwdShkYXZpbmNpX2NwdWlkbGVfZGV2aWNlLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlkZHIyX3JlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghZGRyMl9yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgRERSMiBjb250cm9sbGVyIHJlZ2lzdGVyIGJhc2UiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbGVuID0gcmVzb3VyY2Vfc2l6ZShkZHIyX3JlZ3MpOworCisJZGRyMl9yZWdzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGRkcjJfcmVncy0+c3RhcnQsIGxlbiwgZGRyMl9yZWdzLT5uYW1lKTsKKwlpZiAoIWRkcjJfcmVncykKKwkJcmV0dXJuIC1FQlVTWTsKKworCWRkcjJfcmVnX2Jhc2UgPSBpb3JlbWFwKGRkcjJfcmVncy0+c3RhcnQsIGxlbik7CisJaWYgKCFkZHIyX3JlZ19iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gaW9yZW1hcF9mYWlsOworCX0KKworCXJldCA9IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZkYXZpbmNpX2lkbGVfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBkcml2ZXJcbiIpOworCQlnb3RvIGRyaXZlcl9yZWdpc3Rlcl9mYWlsOworCX0KKworCS8qIFdhaXQgZm9yIGludGVycnVwdCBzdGF0ZSAqLworCWRldmljZS0+c3RhdGVzWzBdLmVudGVyID0gZGF2aW5jaV9lbnRlcl9pZGxlOworCWRldmljZS0+c3RhdGVzWzBdLmV4aXRfbGF0ZW5jeSA9IDE7CisJZGV2aWNlLT5zdGF0ZXNbMF0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOworCWRldmljZS0+c3RhdGVzWzBdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CisJc3RyY3B5KGRldmljZS0+c3RhdGVzWzBdLm5hbWUsICJXRkkiKTsKKwlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMF0uZGVzYywgIldhaXQgZm9yIGludGVycnVwdCIpOworCisJLyogV2FpdCBmb3IgaW50ZXJydXB0IGFuZCBERFIgc2VsZiByZWZyZXNoIHN0YXRlICovCisJZGV2aWNlLT5zdGF0ZXNbMV0uZW50ZXIgPSBkYXZpbmNpX2VudGVyX2lkbGU7CisJZGV2aWNlLT5zdGF0ZXNbMV0uZXhpdF9sYXRlbmN5ID0gMTA7CisJZGV2aWNlLT5zdGF0ZXNbMV0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOworCWRldmljZS0+c3RhdGVzWzFdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CisJc3RyY3B5KGRldmljZS0+c3RhdGVzWzFdLm5hbWUsICJERFIgU1IiKTsKKwlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMV0uZGVzYywgIldGSSBhbmQgRERSIFNlbGYgUmVmcmVzaCIpOworCWlmIChwZGF0YS0+ZGRyMl9wZG93bikKKwkJZGF2aW5jaV9zdGF0ZXNbMV0uZmxhZ3MgfD0gREFWSU5DSV9DUFVJRExFX0ZMQUdTX0REUjJfUFdETjsKKwljcHVpZGxlX3NldF9zdGF0ZWRhdGEoJmRldmljZS0+c3RhdGVzWzFdLCAmZGF2aW5jaV9zdGF0ZXNbMV0pOworCisJZGV2aWNlLT5zdGF0ZV9jb3VudCA9IERBVklOQ0lfQ1BVSURMRV9NQVhfU1RBVEVTOworCisJcmV0ID0gY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBkZXZpY2VcbiIpOworCQlnb3RvIGRldmljZV9yZWdpc3Rlcl9mYWlsOworCX0KKworCXJldHVybiAwOworCitkZXZpY2VfcmVnaXN0ZXJfZmFpbDoKKwljcHVpZGxlX3VucmVnaXN0ZXJfZHJpdmVyKCZkYXZpbmNpX2lkbGVfZHJpdmVyKTsKK2RyaXZlcl9yZWdpc3Rlcl9mYWlsOgorCWlvdW5tYXAoZGRyMl9yZWdfYmFzZSk7Citpb3JlbWFwX2ZhaWw6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRkcjJfcmVncy0+c3RhcnQsIGxlbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGF2aW5jaV9jcHVpZGxlX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJjcHVpZGxlLWRhdmluY2kiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9jcHVpZGxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZkYXZpbmNpX2NwdWlkbGVfZHJpdmVyLAorCQkJCQkJZGF2aW5jaV9jcHVpZGxlX3Byb2JlKTsKK30KK2RldmljZV9pbml0Y2FsbChkYXZpbmNpX2NwdWlkbGVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTgzMC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODMwLmMKaW5kZXggMTliMjc0OC4uYjIyYjVjZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODMwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODMwLmMKQEAgLTgsMjIgKzgsMTcgQEAKICAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwogICogb3IgaW1wbGllZC4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvcHNjLmg+Ci0jaW5jbHVkZSA8bWFjaC9tdXguaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvdGltZS5oPgogI2luY2x1ZGUgPG1hY2gvZGE4eHguaD4KLSNpbmNsdWRlIDxtYWNoL2FzcC5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKQEAgLTE5MywxNCArMTg4LDE0IEBACiAJLm5hbWUJCT0gInVhcnQxIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazIsCiAJLmxwc2MJCT0gREE4WFhfTFBTQzFfVUFSVDEsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfY2xrID0gewogCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBOFhYX0xQU0MxX1VBUlQyLAotCS5wc2NfY3Rscgk9IDEsCisJLmdwc2MJCT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHNwaTBfY2xrID0gewpAQCAtMjEzLDk4ICsyMDgsOTggQEAKIAkubmFtZQkJPSAic3BpMSIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBOFhYX0xQU0MxX1NQSTEsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZWNhcDBfY2xrID0gewogCS5uYW1lCQk9ICJlY2FwMCIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0VDQVAsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZWNhcDFfY2xrID0gewogCS5uYW1lCQk9ICJlY2FwMSIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0VDQVAsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZWNhcDJfY2xrID0gewogCS5uYW1lCQk9ICJlY2FwMiIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0VDQVAsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgcHdtMF9jbGsgPSB7CiAJLm5hbWUJCT0gInB3bTAiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQThYWF9MUFNDMV9QV00sCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgcHdtMV9jbGsgPSB7CiAJLm5hbWUJCT0gInB3bTEiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQThYWF9MUFNDMV9QV00sCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgcHdtMl9jbGsgPSB7CiAJLm5hbWUJCT0gInB3bTIiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQThYWF9MUFNDMV9QV00sCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZXFlcDBfY2xrID0gewogCS5uYW1lCQk9ICJlcWVwMCIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBODMwX0xQU0MxX0VRRVAsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZXFlcDFfY2xrID0gewogCS5uYW1lCQk9ICJlcWVwMSIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBODMwX0xQU0MxX0VRRVAsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgbGNkY19jbGsgPSB7CiAJLm5hbWUJCT0gImxjZGMiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQThYWF9MUFNDMV9MQ0RDLAotCS5wc2NfY3Rscgk9IDEsCisJLmdwc2MJCT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1jYXNwMF9jbGsgPSB7CiAJLm5hbWUJCT0gIm1jYXNwMCIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGsyLAogCS5scHNjCQk9IERBOFhYX0xQU0MxX01jQVNQMCwKLQkucHNjX2N0bHIJPSAxLAorCS5ncHNjCQk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBtY2FzcDFfY2xrID0gewogCS5uYW1lCQk9ICJtY2FzcDEiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQTgzMF9MUFNDMV9NY0FTUDEsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgbWNhc3AyX2NsayA9IHsKIAkubmFtZQkJPSAibWNhc3AyIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazIsCiAJLmxwc2MJCT0gREE4MzBfTFBTQzFfTWNBU1AyLAotCS5wc2NfY3Rscgk9IDEsCisJLmdwc2MJCT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVzYjIwX2NsayA9IHsKIAkubmFtZQkJPSAidXNiMjAiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQThYWF9MUFNDMV9VU0IyMCwKLQkucHNjX2N0bHIJPSAxLAorCS5ncHNjCQk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBhZW1pZl9jbGsgPSB7CkBAIC0zMzIsMzYgKzMyNywzNiBAQAogCS5uYW1lCQk9ICJlbWFjIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazQsCiAJLmxwc2MJCT0gREE4WFhfTFBTQzFfQ1BHTUFDLAotCS5wc2NfY3Rscgk9IDEsCisJLmdwc2MJCT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGdwaW9fY2xrID0gewogCS5uYW1lCQk9ICJncGlvIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazQsCiAJLmxwc2MJCT0gREE4WFhfTFBTQzFfR1BJTywKLQkucHNjX2N0bHIJPSAxLAorCS5ncHNjCQk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBpMmMxX2NsayA9IHsKIAkubmFtZQkJPSAiaTJjMSIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGs0LAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0kyQywKLQkucHNjX2N0bHIJPSAxLAorCS5ncHNjCQk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB1c2IxMV9jbGsgPSB7CiAJLm5hbWUJCT0gInVzYjExIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazQsCiAJLmxwc2MJCT0gREE4WFhfTFBTQzFfVVNCMTEsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZW1pZjNfY2xrID0gewogCS5uYW1lCQk9ICJlbWlmMyIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGs1LAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0VNSUYzQywKKwkuZ3BzYwkJPSAxLAogCS5mbGFncwkJPSBBTFdBWVNfRU5BQkxFRCwKLQkucHNjX2N0bHIJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgYXJtX2NsayA9IHsKQEAgLTQxMSw3ICs0MDYsNyBAQAogCUNMSyhOVUxMLAkJInB3bTIiLAkJJnB3bTJfY2xrKSwKIAlDTEsoImVxZXAuMCIsCQlOVUxMLAkJJmVxZXAwX2NsayksCiAJQ0xLKCJlcWVwLjEiLAkJTlVMTCwJCSZlcWVwMV9jbGspLAotCUNMSygiZGE4MzBfbGNkYyIsCU5VTEwsCQkmbGNkY19jbGspLAorCUNMSygiZGE4eHhfbGNkYy4wIiwJTlVMTCwJCSZsY2RjX2NsayksCiAJQ0xLKCJkYXZpbmNpLW1jYXNwLjAiLAlOVUxMLAkJJm1jYXNwMF9jbGspLAogCUNMSygiZGF2aW5jaS1tY2FzcC4xIiwJTlVMTCwJCSZtY2FzcDFfY2xrKSwKIAlDTEsoImRhdmluY2ktbWNhc3AuMiIsCU5VTEwsCQkmbWNhc3AyX2NsayksCkBAIC0xMTQzLDcgKzExMzgsMjEgQEAKIAkJLnBhcnRfbm8JPSAweGI3ZGYsCiAJCS5tYW51ZmFjdHVyZXIJPSAweDAxNywJLyogMHgwMmYgPj4gMSAqLwogCQkuY3B1X2lkCQk9IERBVklOQ0lfQ1BVX0lEX0RBODMwLAotCQkubmFtZQkJPSAiZGE4MzAvb21hcCBsMTM3IiwKKwkJLm5hbWUJCT0gImRhODMwL29tYXAtbDEzNyByZXYxLjAiLAorCX0sCisJeworCQkudmFyaWFudAk9IDB4OCwKKwkJLnBhcnRfbm8JPSAweGI3ZGYsCisJCS5tYW51ZmFjdHVyZXIJPSAweDAxNywKKwkJLmNwdV9pZAkJPSBEQVZJTkNJX0NQVV9JRF9EQTgzMCwKKwkJLm5hbWUJCT0gImRhODMwL29tYXAtbDEzNyByZXYxLjEiLAorCX0sCisJeworCQkudmFyaWFudAk9IDB4OSwKKwkJLnBhcnRfbm8JPSAweGI3ZGYsCisJCS5tYW51ZmFjdHVyZXIJPSAweDAxNywKKwkJLmNwdV9pZAkJPSBEQVZJTkNJX0NQVV9JRF9EQTgzMCwKKwkJLm5hbWUJCT0gImRhODMwL29tYXAtbDEzNyByZXYyLjAiLAogCX0sCiB9OwogCkBAIC0xMTc4LDEzICsxMTg3LDExIEBACiBzdGF0aWMgc3RydWN0IGRhdmluY2lfc29jX2luZm8gZGF2aW5jaV9zb2NfaW5mb19kYTgzMCA9IHsKIAkuaW9fZGVzYwkJPSBkYTgzMF9pb19kZXNjLAogCS5pb19kZXNjX251bQkJPSBBUlJBWV9TSVpFKGRhODMwX2lvX2Rlc2MpLAotCS5qdGFnX2lkX2Jhc2UJCT0gSU9fQUREUkVTUyhEQThYWF9KVEFHX0lEX1JFRyksCiAJLmlkcwkJCT0gZGE4MzBfaWRzLAogCS5pZHNfbnVtCQk9IEFSUkFZX1NJWkUoZGE4MzBfaWRzKSwKIAkuY3B1X2Nsa3MJCT0gZGE4MzBfY2xrcywKIAkucHNjX2Jhc2VzCQk9IGRhODMwX3BzY19iYXNlcywKIAkucHNjX2Jhc2VzX251bQkJPSBBUlJBWV9TSVpFKGRhODMwX3BzY19iYXNlcyksCi0JLnBpbm11eF9iYXNlCQk9IElPX0FERFJFU1MoREE4WFhfQk9PVF9DRkdfQkFTRSArIDB4MTIwKSwKIAkucGlubXV4X3BpbnMJCT0gZGE4MzBfcGlucywKIAkucGlubXV4X3BpbnNfbnVtCT0gQVJSQVlfU0laRShkYTgzMF9waW5zKSwKIAkuaW50Y19iYXNlCQk9ICh2b2lkIF9faW9tZW0gKilEQThYWF9DUF9JTlRDX1ZJUlQsCkBAIC0xMjAxLDUgKzEyMDgsMTMgQEAKIAogdm9pZCBfX2luaXQgZGE4MzBfaW5pdCh2b2lkKQogeworCWRhOHh4X3N5c2NmZ19iYXNlID0gaW9yZW1hcChEQThYWF9TWVNDRkdfQkFTRSwgU1pfNEspOworCWlmIChXQVJOKCFkYTh4eF9zeXNjZmdfYmFzZSwgIlVuYWJsZSB0byBtYXAgc3lzY2ZnIG1vZHVsZSIpKQorCQlyZXR1cm47CisKKwlkYXZpbmNpX3NvY19pbmZvX2RhODMwLmp0YWdfaWRfYmFzZSA9CisJCQkJCURBOFhYX1NZU0NGR19WSVJUKERBOFhYX0pUQUdfSURfUkVHKTsKKwlkYXZpbmNpX3NvY19pbmZvX2RhODMwLnBpbm11eF9iYXNlID0gREE4WFhfU1lTQ0ZHX1ZJUlQoMHgxMjApOworCiAJZGF2aW5jaV9jb21tb25faW5pdCgmZGF2aW5jaV9zb2NfaW5mb19kYTgzMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4NTAuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jCmluZGV4IDE5MmQ3MTkuLjcxNzgwNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jCkBAIC0xMSwzMSArMTEsNDEgQEAKICAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwogICogb3IgaW1wbGllZC4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAotI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3BzYy5oPgotI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxtYWNoL2RhOHh4Lmg+CisjaW5jbHVkZSA8bWFjaC9jcHVmcmVxLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgIm11eC5oIgogCisvKiBTb0Mgc3BlY2lmaWMgY2xvY2sgZmxhZ3MgKi8KKyNkZWZpbmUgREE4NTBfQ0xLX0FTWU5DMwlCSVQoMTYpCisKICNkZWZpbmUgREE4NTBfUExMMV9CQVNFCQkweDAxZTFhMDAwCiAjZGVmaW5lIERBODUwX1RJTUVSNjRQMl9CQVNFCTB4MDFmMGMwMDAKICNkZWZpbmUgREE4NTBfVElNRVI2NFAzX0JBU0UJMHgwMWYwZDAwMAogCiAjZGVmaW5lIERBODUwX1JFRl9GUkVRCQkyNDAwMDAwMAogCisjZGVmaW5lIENGR0NISVAzX0FTWU5DM19DTEtTUkMJQklUKDQpCisjZGVmaW5lIENGR0NISVAwX1BMTF9NQVNURVJfTE9DSwlCSVQoNCkKKworc3RhdGljIGludCBkYTg1MF9zZXRfYXJtcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitzdGF0aWMgaW50IGRhODUwX3JvdW5kX2FybXJhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworc3RhdGljIGludCBkYTg1MF9zZXRfcGxsMHJhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIGFybXJhdGUpOworCiBzdGF0aWMgc3RydWN0IHBsbF9kYXRhIHBsbDBfZGF0YSA9IHsKIAkubnVtCQk9IDEsCiAJLnBoeXNfYmFzZQk9IERBOFhYX1BMTDBfQkFTRSwKQEAgLTUyLDYgKzYyLDcgQEAKIAkucGFyZW50CQk9ICZyZWZfY2xrLAogCS5wbGxfZGF0YQk9ICZwbGwwX2RhdGEsCiAJLmZsYWdzCQk9IENMS19QTEwsCisJLnNldF9yYXRlCT0gZGE4NTBfc2V0X3BsbDByYXRlLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgcGxsMF9hdXhfY2xrID0gewpAQCAtMjEwLDE2ICsyMjEsMTYgQEAKIAkubmFtZQkJPSAidHBjYzEiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQTg1MF9MUFNDMV9UUENDMSwKKwkuZ3BzYwkJPSAxLAogCS5mbGFncwkJPSBDTEtfUFNDIHwgQUxXQVlTX0VOQUJMRUQsCi0JLnBzY19jdGxyCT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHRwdGMyX2NsayA9IHsKIAkubmFtZQkJPSAidHB0YzIiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQTg1MF9MUFNDMV9UUFRDMiwKKwkuZ3BzYwkJPSAxLAogCS5mbGFncwkJPSBBTFdBWVNfRU5BQkxFRCwKLQkucHNjX2N0bHIJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdWFydDBfY2xrID0gewpAQCAtMjMyLDE0ICsyNDMsMTYgQEAKIAkubmFtZQkJPSAidWFydDEiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrMiwKIAkubHBzYwkJPSBEQThYWF9MUFNDMV9VQVJUMSwKLQkucHNjX2N0bHIJPSAxLAorCS5ncHNjCQk9IDEsCisJLmZsYWdzCQk9IERBODUwX0NMS19BU1lOQzMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB1YXJ0Ml9jbGsgPSB7CiAJLm5hbWUJCT0gInVhcnQyIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazIsCiAJLmxwc2MJCT0gREE4WFhfTFBTQzFfVUFSVDIsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAorCS5mbGFncwkJPSBEQTg1MF9DTEtfQVNZTkMzLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgYWludGNfY2xrID0gewpAQCAtMjUzLDIyICsyNjYsMjIgQEAKIAkubmFtZQkJPSAiZ3BpbyIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGs0LAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0dQSU8sCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgaTJjMV9jbGsgPSB7CiAJLm5hbWUJCT0gImkyYzEiLAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrNCwKIAkubHBzYwkJPSBEQThYWF9MUFNDMV9JMkMsCi0JLnBzY19jdGxyCT0gMSwKKwkuZ3BzYwkJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZW1pZjNfY2xrID0gewogCS5uYW1lCQk9ICJlbWlmMyIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGs1LAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0VNSUYzQywKKwkuZ3BzYwkJPSAxLAogCS5mbGFncwkJPSBBTFdBWVNfRU5BQkxFRCwKLQkucHNjX2N0bHIJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgYXJtX2NsayA9IHsKQEAgLTI3Niw2ICsyODksOCBAQAogCS5wYXJlbnQJCT0gJnBsbDBfc3lzY2xrNiwKIAkubHBzYwkJPSBEQThYWF9MUFNDMF9BUk0sCiAJLmZsYWdzCQk9IEFMV0FZU19FTkFCTEVELAorCS5zZXRfcmF0ZQk9IGRhODUwX3NldF9hcm1yYXRlLAorCS5yb3VuZF9yYXRlCT0gZGE4NTBfcm91bmRfYXJtcmF0ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHJtaWlfY2xrID0gewpAQCAtMjg3LDIxICszMDIsMjIgQEAKIAkubmFtZQkJPSAiZW1hYyIsCiAJLnBhcmVudAkJPSAmcGxsMF9zeXNjbGs0LAogCS5scHNjCQk9IERBOFhYX0xQU0MxX0NQR01BQywKLQkucHNjX2N0bHIJPSAxLAorCS5ncHNjCQk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBtY2FzcF9jbGsgPSB7CiAJLm5hbWUJCT0gIm1jYXNwIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazIsCiAJLmxwc2MJCT0gREE4WFhfTFBTQzFfTWNBU1AwLAotCS5wc2NfY3Rscgk9IDEsCisJLmdwc2MJCT0gMSwKKwkuZmxhZ3MJCT0gREE4NTBfQ0xLX0FTWU5DMywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGxjZGNfY2xrID0gewogCS5uYW1lCQk9ICJsY2RjIiwKIAkucGFyZW50CQk9ICZwbGwwX3N5c2NsazIsCiAJLmxwc2MJCT0gREE4WFhfTFBTQzFfTENEQywKLQkucHNjX2N0bHIJPSAxLAorCS5ncHNjCQk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBtbWNzZF9jbGsgPSB7CkBAIC00MDQsNiArNDIwLDE0IEBACiAJTVVYX0NGRyhEQTg1MCwgTUlJX1JYRF8wLAkzLAkyOCwJMTUsCTgsCWZhbHNlKQogCU1VWF9DRkcoREE4NTAsIE1ESU9fQ0xLLAk0LAkwLAkxNSwJOCwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgTURJT19ELAkJNCwJNCwJMTUsCTgsCWZhbHNlKQorCU1VWF9DRkcoREE4NTAsIFJNSUlfVFhEXzAsCTE0LAkxMiwJMTUsCTgsCWZhbHNlKQorCU1VWF9DRkcoREE4NTAsIFJNSUlfVFhEXzEsCTE0LAk4LAkxNSwJOCwJZmFsc2UpCisJTVVYX0NGRyhEQTg1MCwgUk1JSV9UWEVOLAkxNCwJMTYsCTE1LAk4LAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBSTUlJX0NSU19EViwJMTUsCTQsCTE1LAk4LAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBSTUlJX1JYRF8wLAkxNCwJMjQsCTE1LAk4LAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBSTUlJX1JYRF8xLAkxNCwJMjAsCTE1LAk4LAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBSTUlJX1JYRVIsCTE0LAkyOCwJMTUsCTgsCWZhbHNlKQorCU1VWF9DRkcoREE4NTAsIFJNSUlfTUhaXzUwX0NMSywJMTUsCTAsCTE1LAkwLAlmYWxzZSkKIAkvKiBNY0FTUCBmdW5jdGlvbiAqLwogCU1VWF9DRkcoREE4NTAsCUFDTEtSLAkJMCwJMCwJMTUsCTEsCWZhbHNlKQogCU1VWF9DRkcoREE4NTAsCUFDTEtYLAkJMCwJNCwJMTUsCTEsCWZhbHNlKQpAQCAtNTA2LDggKzUzMCw5IEBACiAJTVVYX0NGRyhEQTg1MCwgRU1BX1dBSVRfMSwJNiwJMjQsCTE1LAkxLAlmYWxzZSkKIAlNVVhfQ0ZHKERBODUwLCBORU1BX0NTXzIsCTcsCTAsCTE1LAkxLAlmYWxzZSkKIAkvKiBHUElPIGZ1bmN0aW9uICovCisJTVVYX0NGRyhEQTg1MCwgR1BJTzJfNiwJCTYsCTQsCTE1LAk4LAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBHUElPMl84LAkJNSwJMjgsCTE1LAk4LAlmYWxzZSkKIAlNVVhfQ0ZHKERBODUwLCBHUElPMl8xNSwJNSwJMCwJMTUsCTgsCWZhbHNlKQotCU1VWF9DRkcoREE4NTAsIEdQSU84XzEwLAkxOCwJMjgsCTE1LAk4LAlmYWxzZSkKIAlNVVhfQ0ZHKERBODUwLCBHUElPNF8wLAkJMTAsCTI4LAkxNSwJOCwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgR1BJTzRfMSwJCTEwLAkyNCwJMTUsCTgsCWZhbHNlKQogI2VuZGlmCkBAIC01NDcsNiArNTcyLDE0IEBACiAJLTEKIH07CiAKK2NvbnN0IHNob3J0IGRhODUwX3JtaWlfcGluc1tdIF9faW5pdGRhdGEgPSB7CisJREE4NTBfUk1JSV9UWERfMCwgREE4NTBfUk1JSV9UWERfMSwgREE4NTBfUk1JSV9UWEVOLAorCURBODUwX1JNSUlfQ1JTX0RWLCBEQTg1MF9STUlJX1JYRF8wLCBEQTg1MF9STUlJX1JYRF8xLAorCURBODUwX1JNSUlfUlhFUiwgREE4NTBfUk1JSV9NSFpfNTBfQ0xLLCBEQTg1MF9NRElPX0NMSywKKwlEQTg1MF9NRElPX0QsCisJLTEKK307CisKIGNvbnN0IHNob3J0IGRhODUwX21jYXNwX3BpbnNbXSBfX2luaXRkYXRhID0gewogCURBODUwX0FIQ0xLWCwgREE4NTBfQUNMS1gsIERBODUwX0FGU1gsCiAJREE4NTBfQUhDTEtSLCBEQTg1MF9BQ0xLUiwgREE4NTBfQUZTUiwgREE4NTBfQU1VVEUsCkBAIC01NTUsMTIgKzU4OCwxMSBAQAogfTsKIAogY29uc3Qgc2hvcnQgZGE4NTBfbGNkY250bF9waW5zW10gX19pbml0ZGF0YSA9IHsKLQlEQTg1MF9MQ0RfRF8xLCBEQTg1MF9MQ0RfRF8yLCBEQTg1MF9MQ0RfRF8zLCBEQTg1MF9MQ0RfRF80LAotCURBODUwX0xDRF9EXzUsIERBODUwX0xDRF9EXzYsIERBODUwX0xDRF9EXzcsIERBODUwX0xDRF9EXzgsCi0JREE4NTBfTENEX0RfOSwgREE4NTBfTENEX0RfMTAsIERBODUwX0xDRF9EXzExLCBEQTg1MF9MQ0RfRF8xMiwKLQlEQTg1MF9MQ0RfRF8xMywgREE4NTBfTENEX0RfMTQsIERBODUwX0xDRF9EXzE1LCBEQTg1MF9MQ0RfUENMSywKLQlEQTg1MF9MQ0RfSFNZTkMsIERBODUwX0xDRF9WU1lOQywgREE4NTBfTkxDRF9BQ19FTkJfQ1MsIERBODUwX0dQSU8yXzE1LAotCURBODUwX0dQSU84XzEwLAorCURBODUwX0xDRF9EXzAsIERBODUwX0xDRF9EXzEsIERBODUwX0xDRF9EXzIsIERBODUwX0xDRF9EXzMsCisJREE4NTBfTENEX0RfNCwgREE4NTBfTENEX0RfNSwgREE4NTBfTENEX0RfNiwgREE4NTBfTENEX0RfNywKKwlEQTg1MF9MQ0RfRF84LCBEQTg1MF9MQ0RfRF85LCBEQTg1MF9MQ0RfRF8xMCwgREE4NTBfTENEX0RfMTEsCisJREE4NTBfTENEX0RfMTIsIERBODUwX0xDRF9EXzEzLCBEQTg1MF9MQ0RfRF8xNCwgREE4NTBfTENEX0RfMTUsCisJREE4NTBfTENEX1BDTEssIERBODUwX0xDRF9IU1lOQywgREE4NTBfTENEX1ZTWU5DLCBEQTg1MF9OTENEX0FDX0VOQl9DUywKIAktMQogfTsKIApAQCAtNzkwLDE2ICs4MjIsMjIxIEBACiAJLmNsb2Nrc291cmNlX2lkCT0gVDBfVE9QLAogfTsKIAorc3RhdGljIHZvaWQgZGE4NTBfc2V0X2FzeW5jM19zcmMoaW50IHBsbG51bSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGssICpuZXdwYXJlbnQgPSBwbGxudW0gPyAmcGxsMV9zeXNjbGsyIDogJnBsbDBfc3lzY2xrMjsKKwlzdHJ1Y3QgZGF2aW5jaV9jbGsgKmM7CisJdW5zaWduZWQgaW50IHY7CisJaW50IHJldDsKKworCWZvciAoYyA9IGRhODUwX2Nsa3M7IGMtPmxrLmNsazsgYysrKSB7CisJCWNsayA9IGMtPmxrLmNsazsKKwkJaWYgKGNsay0+ZmxhZ3MgJiBEQTg1MF9DTEtfQVNZTkMzKSB7CisJCQlyZXQgPSBjbGtfc2V0X3BhcmVudChjbGssIG5ld3BhcmVudCk7CisJCQlXQVJOKHJldCwgIkRBODUwOiB1bmFibGUgdG8gcmUtcGFyZW50IGNsb2NrICVzIiwKKwkJCQkJCQkJY2xrLT5uYW1lKTsKKwkJfQorICAgICAgIH0KKworCXYgPSBfX3Jhd19yZWFkbChEQThYWF9TWVNDRkdfVklSVChEQThYWF9DRkdDSElQM19SRUcpKTsKKwlpZiAocGxsbnVtKQorCQl2IHw9IENGR0NISVAzX0FTWU5DM19DTEtTUkM7CisJZWxzZQorCQl2ICY9IH5DRkdDSElQM19BU1lOQzNfQ0xLU1JDOworCV9fcmF3X3dyaXRlbCh2LCBEQThYWF9TWVNDRkdfVklSVChEQThYWF9DRkdDSElQM19SRUcpKTsKK30KKworI2lmZGVmIENPTkZJR19DUFVfRlJFUQorLyoKKyAqIE5vdGVzOgorICogQWNjb3JkaW5nIHRvIHRoZSBUUk0sIG1pbmltdW0gUExMTSByZXN1bHRzIGluIG1heGltdW0gcG93ZXIgc2F2aW5ncy4KKyAqIFRoZSBPUFAgZGVmaW5pdGlvbnMgYmVsb3cgc2hvdWxkIGtlZXAgdGhlIFBMTE0gYXMgbG93IGFzIHBvc3NpYmxlLgorICoKKyAqIFRoZSBvdXRwdXQgb2YgdGhlIFBMTE0gbXVzdCBiZSBiZXR3ZWVuIDQwMCB0byA2MDAgTUh6LgorICogVGhpcyBydWxlcyBvdXQgcHJlZGl2IG9mIGFueXRoaW5nIGJ1dCBkaXZpZGUtYnktb25lIGZvciAyNE1oeiBPU0MgaW5wdXQuCisgKi8KK3N0cnVjdCBkYTg1MF9vcHAgeworCXVuc2lnbmVkIGludAlmcmVxOwkvKiBpbiBLSHogKi8KKwl1bnNpZ25lZCBpbnQJcHJlZGl2OworCXVuc2lnbmVkIGludAltdWx0OworCXVuc2lnbmVkIGludAlwb3N0ZGl2OworCXVuc2lnbmVkIGludAljdmRkX21pbjsgLyogaW4gdVYgKi8KKwl1bnNpZ25lZCBpbnQJY3ZkZF9tYXg7IC8qIGluIHVWICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRhODUwX29wcCBkYTg1MF9vcHBfMzAwID0geworCS5mcmVxCQk9IDMwMDAwMCwKKwkucHJlZGl2CQk9IDEsCisJLm11bHQJCT0gMjUsCisJLnBvc3RkaXYJPSAyLAorCS5jdmRkX21pbgk9IDExNDAwMDAsCisJLmN2ZGRfbWF4CT0gMTMyMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGE4NTBfb3BwIGRhODUwX29wcF8yMDAgPSB7CisJLmZyZXEJCT0gMjAwMDAwLAorCS5wcmVkaXYJCT0gMSwKKwkubXVsdAkJPSAyNSwKKwkucG9zdGRpdgk9IDMsCisJLmN2ZGRfbWluCT0gMTA1MDAwMCwKKwkuY3ZkZF9tYXgJPSAxMTYwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkYTg1MF9vcHAgZGE4NTBfb3BwXzk2ID0geworCS5mcmVxCQk9IDk2MDAwLAorCS5wcmVkaXYJCT0gMSwKKwkubXVsdAkJPSAyMCwKKwkucG9zdGRpdgk9IDUsCisJLmN2ZGRfbWluCT0gOTUwMDAwLAorCS5jdmRkX21heAk9IDEwNTAwMDAsCit9OworCisjZGVmaW5lIE9QUChmcmVxKSAJCVwKKwl7CQkJCVwKKwkJLmluZGV4ID0gKHVuc2lnbmVkIGludCkgJmRhODUwX29wcF8jI2ZyZXEsCVwKKwkJLmZyZXF1ZW5jeSA9IGZyZXEgKiAxMDAwLCBcCisJfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGRhODUwX2ZyZXFfdGFibGVbXSA9IHsKKwlPUFAoMzAwKSwKKwlPUFAoMjAwKSwKKwlPUFAoOTYpLAorCXsKKwkJLmluZGV4CQk9IDAsCisJCS5mcmVxdWVuY3kJPSBDUFVGUkVRX1RBQkxFX0VORCwKKwl9LAorfTsKKworI2lmZGVmIENPTkZJR19SRUdVTEFUT1IKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICpjdmRkOworCitzdGF0aWMgaW50IGRhODUwX3NldF92b2x0YWdlKHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZGE4NTBfb3BwICpvcHA7CisKKwlpZiAoIWN2ZGQpCisJCXJldHVybiAtRU5PREVWOworCisJb3BwID0gKHN0cnVjdCBkYTg1MF9vcHAgKikgZGE4NTBfZnJlcV90YWJsZVtpbmRleF0uaW5kZXg7CisKKwlyZXR1cm4gcmVndWxhdG9yX3NldF92b2x0YWdlKGN2ZGQsIG9wcC0+Y3ZkZF9taW4sIG9wcC0+Y3ZkZF9tYXgpOworfQorCitzdGF0aWMgaW50IGRhODUwX3JlZ3VsYXRvcl9pbml0KHZvaWQpCit7CisJY3ZkZCA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwgImN2ZGQiKTsKKwlpZiAoV0FSTihJU19FUlIoY3ZkZCksICJVbmFibGUgdG8gb2J0YWluIHZvbHRhZ2UgcmVndWxhdG9yIGZvciBDVkREOyIKKwkJCQkJIiB2b2x0YWdlIHNjYWxpbmcgdW5zdXBwb3J0ZWRcbiIpKSB7CisJCXJldHVybiBQVFJfRVJSKGN2ZGQpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9jcHVmcmVxX2NvbmZpZyBjcHVmcmVxX2luZm8gPSB7CisJLmZyZXFfdGFibGUgPSAmZGE4NTBfZnJlcV90YWJsZVswXSwKKyNpZmRlZiBDT05GSUdfUkVHVUxBVE9SCisJLmluaXQgPSBkYTg1MF9yZWd1bGF0b3JfaW5pdCwKKwkuc2V0X3ZvbHRhZ2UgPSBkYTg1MF9zZXRfdm9sdGFnZSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGE4NTBfY3B1ZnJlcV9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJjcHVmcmVxLWRhdmluY2kiLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmNwdWZyZXFfaW5mbywKKwl9LAorfTsKKworaW50IF9faW5pdCBkYTg1MF9yZWdpc3Rlcl9jcHVmcmVxKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZGE4NTBfY3B1ZnJlcV9kZXZpY2UpOworfQorCitzdGF0aWMgaW50IGRhODUwX3JvdW5kX2FybXJhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJaW50IGksIHJldCA9IDAsIGRpZmY7CisJdW5zaWduZWQgaW50IGJlc3QgPSAodW5zaWduZWQgaW50KSAtMTsKKworCXJhdGUgLz0gMTAwMDsgLyogY29udmVydCB0byBrSHogKi8KKworCWZvciAoaSA9IDA7IGRhODUwX2ZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EOyBpKyspIHsKKwkJZGlmZiA9IGRhODUwX2ZyZXFfdGFibGVbaV0uZnJlcXVlbmN5IC0gcmF0ZTsKKwkJaWYgKGRpZmYgPCAwKQorCQkJZGlmZiA9IC1kaWZmOworCisJCWlmIChkaWZmIDwgYmVzdCkgeworCQkJYmVzdCA9IGRpZmY7CisJCQlyZXQgPSBkYTg1MF9mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeTsKKwkJfQorCX0KKworCXJldHVybiByZXQgKiAxMDAwOworfQorCitzdGF0aWMgaW50IGRhODUwX3NldF9hcm1yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3QgY2xrICpwbGxjbGsgPSAmcGxsMF9jbGs7CisKKwlyZXR1cm4gY2xrX3NldF9yYXRlKHBsbGNsaywgaW5kZXgpOworfQorCitzdGF0aWMgaW50IGRhODUwX3NldF9wbGwwcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IHByZWRpdiwgbXVsdCwgcG9zdGRpdjsKKwlzdHJ1Y3QgZGE4NTBfb3BwICpvcHA7CisJc3RydWN0IHBsbF9kYXRhICpwbGwgPSBjbGstPnBsbF9kYXRhOworCXVuc2lnbmVkIGludCB2OworCWludCByZXQ7CisKKwlvcHAgPSAoc3RydWN0IGRhODUwX29wcCAqKSBkYTg1MF9mcmVxX3RhYmxlW2luZGV4XS5pbmRleDsKKwlwcmVkaXYgPSBvcHAtPnByZWRpdjsKKwltdWx0ID0gb3BwLT5tdWx0OworCXBvc3RkaXYgPSBvcHAtPnBvc3RkaXY7CisKKwkvKiBVbmxvY2sgd3JpdGluZyB0byBQTEwgcmVnaXN0ZXJzICovCisJdiA9IF9fcmF3X3JlYWRsKERBOFhYX1NZU0NGR19WSVJUKERBOFhYX0NGR0NISVAwX1JFRykpOworCXYgJj0gfkNGR0NISVAwX1BMTF9NQVNURVJfTE9DSzsKKwlfX3Jhd193cml0ZWwodiwgREE4WFhfU1lTQ0ZHX1ZJUlQoREE4WFhfQ0ZHQ0hJUDBfUkVHKSk7CisKKwlyZXQgPSBkYXZpbmNpX3NldF9wbGxyYXRlKHBsbCwgcHJlZGl2LCBtdWx0LCBwb3N0ZGl2KTsKKwlpZiAoV0FSTl9PTihyZXQpKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisjZWxzZQoraW50IF9faW5pdCBkYTg1MF9yZWdpc3Rlcl9jcHVmcmVxKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE4NTBfc2V0X2FybXJhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZGE4NTBfc2V0X3BsbDByYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyBhcm1yYXRlKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRhODUwX3JvdW5kX2FybXJhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KKyNlbmRpZgorCisKIHN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9zb2NfaW5mbyBkYXZpbmNpX3NvY19pbmZvX2RhODUwID0gewogCS5pb19kZXNjCQk9IGRhODUwX2lvX2Rlc2MsCiAJLmlvX2Rlc2NfbnVtCQk9IEFSUkFZX1NJWkUoZGE4NTBfaW9fZGVzYyksCi0JLmp0YWdfaWRfYmFzZQkJPSBJT19BRERSRVNTKERBOFhYX0pUQUdfSURfUkVHKSwKIAkuaWRzCQkJPSBkYTg1MF9pZHMsCiAJLmlkc19udW0JCT0gQVJSQVlfU0laRShkYTg1MF9pZHMpLAogCS5jcHVfY2xrcwkJPSBkYTg1MF9jbGtzLAogCS5wc2NfYmFzZXMJCT0gZGE4NTBfcHNjX2Jhc2VzLAogCS5wc2NfYmFzZXNfbnVtCQk9IEFSUkFZX1NJWkUoZGE4NTBfcHNjX2Jhc2VzKSwKLQkucGlubXV4X2Jhc2UJCT0gSU9fQUREUkVTUyhEQThYWF9CT09UX0NGR19CQVNFICsgMHgxMjApLAogCS5waW5tdXhfcGlucwkJPSBkYTg1MF9waW5zLAogCS5waW5tdXhfcGluc19udW0JPSBBUlJBWV9TSVpFKGRhODUwX3BpbnMpLAogCS5pbnRjX2Jhc2UJCT0gKHZvaWQgX19pb21lbSAqKURBOFhYX0NQX0lOVENfVklSVCwKQEAgLTgxNiw1ICsxMDUzLDIyIEBACiAKIHZvaWQgX19pbml0IGRhODUwX2luaXQodm9pZCkKIHsKKwlkYTh4eF9zeXNjZmdfYmFzZSA9IGlvcmVtYXAoREE4WFhfU1lTQ0ZHX0JBU0UsIFNaXzRLKTsKKwlpZiAoV0FSTighZGE4eHhfc3lzY2ZnX2Jhc2UsICJVbmFibGUgdG8gbWFwIHN5c2NmZyBtb2R1bGUiKSkKKwkJcmV0dXJuOworCisJZGF2aW5jaV9zb2NfaW5mb19kYTg1MC5qdGFnX2lkX2Jhc2UgPQorCQkJCQlEQThYWF9TWVNDRkdfVklSVChEQThYWF9KVEFHX0lEX1JFRyk7CisJZGF2aW5jaV9zb2NfaW5mb19kYTg1MC5waW5tdXhfYmFzZSA9IERBOFhYX1NZU0NGR19WSVJUKDB4MTIwKTsKKwogCWRhdmluY2lfY29tbW9uX2luaXQoJmRhdmluY2lfc29jX2luZm9fZGE4NTApOworCisJLyoKKwkgKiBNb3ZlIHRoZSBjbG9jayBzb3VyY2Ugb2YgQXN5bmMzIGRvbWFpbiB0byBQTEwxIFNZU0NMSzIuCisJICogVGhpcyBoZWxwcyBrZWVwaW5nIHRoZSBwZXJpcGhlcmFscyBvbiB0aGlzIGRvbWFpbiBpbnN1bGF0ZWQKKwkgKiBmcm9tIENQVSBmcmVxdWVuY3kgY2hhbmdlcyBjYXVzZWQgYnkgRFZGUy4gVGhlIGZpcm13YXJlIHNldHMKKwkgKiBib3RoIFBMTDAgYW5kIFBMTDEgdG8gdGhlIHNhbWUgZnJlcXVlbmN5IHNvLCB0aGVyZSBzaG91bGQgbm90CisJICogYmUgYW55IG5vdGljaWJsZSBjaGFuZ2UgZXZlbiBpbiBub24tRFZGUyB1c2UgY2FzZXMuCisJICovCisJZGE4NTBfc2V0X2FzeW5jM19zcmMoMSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYwppbmRleCA1OGFkNWI2Li5kZDJkMzJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKQEAgLTEwLDggKzEwLDYgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CkBAIC0yMSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxtYWNoL2RhOHh4Lmg+Ci0jaW5jbHVkZSA8dmlkZW8vZGE4eHgtZmIuaD4KKyNpbmNsdWRlIDxtYWNoL2NwdWlkbGUuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAKQEAgLTMwLDYgKzI4LDcgQEAKICNkZWZpbmUgREE4WFhfVFBUQzFfQkFTRQkJMHgwMWMwODQwMAogI2RlZmluZSBEQThYWF9XRE9HX0JBU0UJCQkweDAxYzIxMDAwIC8qIERBOFhYX1RJTUVSNjRQMV9CQVNFICovCiAjZGVmaW5lIERBOFhYX0kyQzBfQkFTRQkJCTB4MDFjMjIwMDAKKyNkZWZpbmUgREE4WFhfUlRDX0JBU0UJCQkweDAxQzIzMDAwCiAjZGVmaW5lIERBOFhYX0VNQUNfQ1BQSV9QT1JUX0JBU0UJMHgwMWUyMDAwMAogI2RlZmluZSBEQThYWF9FTUFDX0NQR01BQ1NTX0JBU0UJMHgwMWUyMjAwMAogI2RlZmluZSBEQThYWF9FTUFDX0NQR01BQ19CQVNFCQkweDAxZTIzMDAwCkBAIC00Myw2ICs0Miw4IEBACiAjZGVmaW5lIERBOFhYX01ESU9fUkVHX09GRlNFVAkJMHg0MDAwCiAjZGVmaW5lIERBOFhYX0VNQUNfQ1RSTF9SQU1fU0laRQlTWl84SwogCit2b2lkIF9faW9tZW0gKmRhOHh4X3N5c2NmZ19iYXNlOworCiBzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGRhOHh4X3NlcmlhbF9wZGF0YVtdID0gewogCXsKIAkJLm1hcGJhc2UJPSBEQThYWF9VQVJUMF9CQVNFLApAQCAtMjgyLDYgKzI4MywxMSBAQAogCS5yZXNvdXJjZQk9IGRhOHh4X2VtYWNfcmVzb3VyY2VzLAogfTsKIAoraW50IF9faW5pdCBkYTh4eF9yZWdpc3Rlcl9lbWFjKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZGE4eHhfZW1hY19kZXZpY2UpOworfQorCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhODMwX21jYXNwMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5uYW1lCT0gIm1jYXNwMSIsCkBAIC0zMzgsMTIgKzM0NCw3IEBACiAJLnJlc291cmNlCT0gZGE4NTBfbWNhc3BfcmVzb3VyY2VzLAogfTsKIAotaW50IF9faW5pdCBkYTh4eF9yZWdpc3Rlcl9lbWFjKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZGE4eHhfZW1hY19kZXZpY2UpOwotfQotCi12b2lkIF9faW5pdCBkYTh4eF9pbml0X21jYXNwKGludCBpZCwgc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3ZvaWQgX19pbml0IGRhOHh4X3JlZ2lzdGVyX21jYXNwKGludCBpZCwgc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKIHsKIAkvKiBEQTgzMC9PTUFQLUwxMzcgaGFzIDMgaW5zdGFuY2VzIG9mIE1jQVNQICovCiAJaWYgKGNwdV9pc19kYXZpbmNpX2RhODMwKCkgJiYgaWQgPT0gMSkgewpAQCAtMzc5LDEwICszODAsMTYgQEAKIAkucmFzdGVyX29yZGVyCQk9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGRhOHh4X2xjZGNfcGxhdGZvcm1fZGF0YSBkYTg1MF9ldm1fbGNkY19wZGF0YSA9IHsKLQkubWFudV9uYW1lID0gInNoYXJwIiwKLQkuY29udHJvbGxlcl9kYXRhID0gJmxjZF9jZmcsCi0JLnR5cGUgPSAiU2hhcnBfTEswNDNUMURHMDEiLAorc3RydWN0IGRhOHh4X2xjZGNfcGxhdGZvcm1fZGF0YSBzaGFycF9sY2QwMzVxM2RnMDFfcGRhdGEgPSB7CisJLm1hbnVfbmFtZQkJPSAic2hhcnAiLAorCS5jb250cm9sbGVyX2RhdGEJPSAmbGNkX2NmZywKKwkudHlwZQkJCT0gIlNoYXJwX0xDRDAzNVEzREcwMSIsCit9OworCitzdHJ1Y3QgZGE4eHhfbGNkY19wbGF0Zm9ybV9kYXRhIHNoYXJwX2xrMDQzdDFkZzAxX3BkYXRhID0geworCS5tYW51X25hbWUJCT0gInNoYXJwIiwKKwkuY29udHJvbGxlcl9kYXRhCT0gJmxjZF9jZmcsCisJLnR5cGUJCQk9ICJTaGFycF9MSzA0M1QxREcwMSIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhOHh4X2xjZGNfcmVzb3VyY2VzW10gPSB7CkBAIC0zOTgsMTkgKzQwNSwxNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYTg1MF9sY2RjX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhOHh4X2xjZGNfZGV2aWNlID0gewogCS5uYW1lCQk9ICJkYTh4eF9sY2RjIiwKIAkuaWQJCT0gMCwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZGE4eHhfbGNkY19yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IGRhOHh4X2xjZGNfcmVzb3VyY2VzLAotCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJmRhODUwX2V2bV9sY2RjX3BkYXRhLAotCX0KIH07CiAKLWludCBfX2luaXQgZGE4eHhfcmVnaXN0ZXJfbGNkYyh2b2lkKQoraW50IF9faW5pdCBkYTh4eF9yZWdpc3Rlcl9sY2RjKHN0cnVjdCBkYTh4eF9sY2RjX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewotCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRhODUwX2xjZGNfZGV2aWNlKTsKKwlkYTh4eF9sY2RjX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRhOHh4X2xjZGNfZGV2aWNlKTsKIH0KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYTh4eF9tbWNzZDBfcmVzb3VyY2VzW10gPSB7CkBAIC00NDgsMyArNDUzLDY2IEBACiAJZGE4eHhfbW1jc2QwX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IGNvbmZpZzsKIAlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkYTh4eF9tbWNzZDBfZGV2aWNlKTsKIH0KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYTh4eF9ydGNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJCT0gREE4WFhfUlRDX0JBU0UsCisJCS5lbmQJCT0gREE4WFhfUlRDX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsgLyogdGltZXIgaXJxICovCisJCS5zdGFydAkJPSBJUlFfREE4WFhfUlRDLAorCQkuZW5kCQk9IElSUV9EQThYWF9SVEMsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsgLyogYWxhcm0gaXJxICovCisJCS5zdGFydAkJPSBJUlFfREE4WFhfUlRDLAorCQkuZW5kCQk9IElSUV9EQThYWF9SVEMsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGE4eHhfcnRjX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAib21hcF9ydGMiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShkYTh4eF9ydGNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBkYTh4eF9ydGNfcmVzb3VyY2VzLAorfTsKKworaW50IGRhOHh4X3JlZ2lzdGVyX3J0Yyh2b2lkKQoreworCS8qIFVubG9jayB0aGUgcnRjJ3MgcmVnaXN0ZXJzICovCisJX19yYXdfd3JpdGVsKDB4ODNlNzBiMTMsIElPX0FERFJFU1MoREE4WFhfUlRDX0JBU0UgKyAweDZjKSk7CisJX19yYXdfd3JpdGVsKDB4OTVhNGYxZTAsIElPX0FERFJFU1MoREE4WFhfUlRDX0JBU0UgKyAweDcwKSk7CisKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkYTh4eF9ydGNfZGV2aWNlKTsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYTh4eF9jcHVpZGxlX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IERBOFhYX0REUjJfQ1RMX0JBU0UsCisJCS5lbmQJCT0gREE4WFhfRERSMl9DVExfQkFTRSArIFNaXzMySyAtIDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworLyogREE4WFggZGV2aWNlcyBzdXBwb3J0IEREUjIgcG93ZXIgZG93biAqLworc3RhdGljIHN0cnVjdCBkYXZpbmNpX2NwdWlkbGVfY29uZmlnIGRhOHh4X2NwdWlkbGVfcGRhdGEgPSB7CisJLmRkcjJfcGRvd24JPSAxLAorfTsKKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYTh4eF9jcHVpZGxlX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImNwdWlkbGUtZGF2aW5jaSIsCisJLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShkYTh4eF9jcHVpZGxlX3Jlc291cmNlcyksCisJLnJlc291cmNlCQk9IGRhOHh4X2NwdWlkbGVfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmRhOHh4X2NwdWlkbGVfcGRhdGEsCisJfSwKK307CisKK2ludCBfX2luaXQgZGE4eHhfcmVnaXN0ZXJfY3B1aWRsZSh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRhOHh4X2NwdWlkbGVfZGV2aWNlKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMKaW5kZXggYTU1YjY1MC4uMTQ3OTQ5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jCkBAIC05LDE1ICs5LDExIEBACiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KQEAgLTE3Nyw3ICsxNzMsNyBAQAogCQkJbW1jc2QxX3Jlc291cmNlc1swXS5zdGFydCA9IERNMzY1X01NQ1NEMV9CQVNFOwogCQkJbW1jc2QxX3Jlc291cmNlc1swXS5lbmQgPSBETTM2NV9NTUNTRDFfQkFTRSArCiAJCQkJCQkJU1pfNEsgLSAxOwotCQkJbW1jc2QwX3Jlc291cmNlc1syXS5zdGFydCA9IElSUV9ETTM2NV9TRElPSU5UMTsKKwkJCW1tY3NkMV9yZXNvdXJjZXNbMl0uc3RhcnQgPSBJUlFfRE0zNjVfU0RJT0lOVDE7CiAJCX0gZWxzZQogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTM1NS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzU1LmMKaW5kZXggMDU5NjcwMC4uZGVkZjRkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzU1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzU1LmMKQEAgLTgsNyArOCw2IEBACiAgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKICAqIG9yIGltcGxpZWQuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KQEAgLTIxLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG0zNTUuaD4KLSNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8bWFjaC9lZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9wc2MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTM2NS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzY1LmMKaW5kZXggZTgxNTE3NC4uMmVjNjE5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzY1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzY1LmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KQEAgLTIzLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG0zNjUuaD4KLSNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8bWFjaC9lZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9wc2MuaD4KQEAgLTMyLDYgKzMwLDggQEAKICNpbmNsdWRlIDxtYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9hc3AuaD4KKyNpbmNsdWRlIDxtYWNoL2tleXNjYW4uaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAibXV4LmgiCkBAIC0zNjksNyArMzY5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgdXNiX2NsayA9IHsKIAkubmFtZQkJPSAidXNiIiwKLQkucGFyZW50CQk9ICZwbGwyX3N5c2NsazEsCisJLnBhcmVudAkJPSAmcGxsMV9hdXhfY2xrLAogCS5scHNjCQk9IERBVklOQ0lfTFBTQ19VU0IsCiB9OwogCkBAIC00NTYsNyArNDU2LDcgQEAKIAlDTEsoTlVMTCwgInVzYiIsICZ1c2JfY2xrKSwKIAlDTEsoImRhdmluY2lfZW1hYy4xIiwgTlVMTCwgJmVtYWNfY2xrKSwKIAlDTEsoInZvaWNlX2NvZGVjIiwgTlVMTCwgJnZvaWNlY29kZWNfY2xrKSwKLQlDTEsoInNvYy1hdWRpby4wIiwgTlVMTCwgJmFzcDBfY2xrKSwKKwlDTEsoImRhdmluY2ktYXNwLjAiLCBOVUxMLCAmYXNwMF9jbGspLAogCUNMSyhOVUxMLCAicnRvIiwgJnJ0b19jbGspLAogCUNMSyhOVUxMLCAibWpjcCIsICZtamNwX2NsayksCiAJQ0xLKE5VTEwsIE5VTEwsIE5VTEwpLApAQCAtNTMxLDcgKzUzMSw3IEBACiBNVVhfQ0ZHKERNMzY1LCAgRU1BQ19NRElPLAkzLCAgIDEsICAgICAxLCAgICAxLCAgICAgZmFsc2UpCiBNVVhfQ0ZHKERNMzY1LCAgRU1BQ19NRENMSywJMywgICAwLCAgICAgMSwgICAgMSwgICAgIGZhbHNlKQogCi1NVVhfQ0ZHKERNMzY1LAlLRVlQQUQsCQkyLCAgIDAsICAgICAweDNmLCAweDNmLCAgZmFsc2UpCitNVVhfQ0ZHKERNMzY1LAlLRVlTQ0FOLAkyLCAgIDAsICAgICAweDNmLCAweDNmLCAgZmFsc2UpCiAKIE1VWF9DRkcoRE0zNjUsCVBXTTAsCQkxLCAgIDAsICAgICAzLCAgICAyLCAgICAgZmFsc2UpCiBNVVhfQ0ZHKERNMzY1LAlQV00wX0cyMywJMywgICAyNiwgICAgMywgICAgMywgICAgIGZhbHNlKQpAQCAtNjAzLDYgKzYwMyw5IEBACiBJTlRfQ0ZHKERNMzY1LCAgSU5UX0lNWDFfRElTQUJMRSwgICAgMjQsICAgIDEsICAgIDAsICAgICBmYWxzZSkKIElOVF9DRkcoRE0zNjUsICBJTlRfTlNGX0VOQUJMRSwgICAgICAyNSwgICAgMSwgICAgMSwgICAgIGZhbHNlKQogSU5UX0NGRyhETTM2NSwgIElOVF9OU0ZfRElTQUJMRSwgICAgIDI1LCAgICAxLCAgICAwLCAgICAgZmFsc2UpCisKK0VWVF9DRkcoRE0zNjUsCUVWVDJfQVNQX1RYLCAgICAgICAgIDAsICAgICAxLCAgICAwLCAgICAgZmFsc2UpCitFVlRfQ0ZHKERNMzY1LAlFVlQzX0FTUF9SWCwgICAgICAgICAxLCAgICAgMSwgICAgMCwgICAgIGZhbHNlKQogI2VuZGlmCiB9OwogCkBAIC02OTYsNiArNjk5LDcgQEAKIAlbSVJRX0kyQ10JCQk9IDMsCiAJW0lSUV9VQVJUSU5UMF0JCQk9IDMsCiAJW0lSUV9VQVJUSU5UMV0JCQk9IDMsCisJW0lSUV9ETTM2NV9SVENJTlRdCQk9IDMsCiAJW0lSUV9ETTM2NV9TUElJTlQwXzBdCQk9IDMsCiAJW0lSUV9ETTM2NV9TUElJTlQzXzBdCQk9IDMsCiAJW0lSUV9ETTM2NV9HUElPMF0JCT0gMywKQEAgLTgwNiw2ICs4MTAsNTAgQEAKIAkucmVzb3VyY2UJCT0gZWRtYV9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGRtMzY1X2FzcF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IERBVklOQ0lfRE0zNjVfQVNQMF9CQVNFLAorCQkuZW5kCT0gREFWSU5DSV9ETTM2NV9BU1AwX0JBU0UgKyBTWl84SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBEQVZJTkNJX0RNQV9BU1AwX1RYLAorCQkuZW5kCT0gREFWSU5DSV9ETUFfQVNQMF9UWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwl7CisJCS5zdGFydAk9IERBVklOQ0lfRE1BX0FTUDBfUlgsCisJCS5lbmQJPSBEQVZJTkNJX0RNQV9BU1AwX1JYLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZG0zNjVfYXNwX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZGF2aW5jaS1hc3AiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShkbTM2NV9hc3BfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBkbTM2NV9hc3BfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkbTM2NV9ydGNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBETTM2NV9SVENfQkFTRSwKKwkJLmVuZCA9IERNMzY1X1JUQ19CQVNFICsgU1pfMUsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX0RNMzY1X1JUQ0lOVCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRtMzY1X3J0Y19kZXZpY2UgPSB7CisJLm5hbWUgPSAicnRjX2RhdmluY2kiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGRtMzY1X3J0Y19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGRtMzY1X3J0Y19yZXNvdXJjZXMsCit9OworCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGRtMzY1X2lvX2Rlc2NbXSA9IHsKIAl7CiAJCS52aXJ0dWFsCT0gSU9fVklSVCwKQEAgLTgyMiw2ICs4NzAsMjggQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkbTM2NV9rc19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS8qIHJlZ2lzdGVycyAqLworCQkuc3RhcnQgPSBETTM2NV9LRVlTQ0FOX0JBU0UsCisJCS5lbmQgPSBETTM2NV9LRVlTQ0FOX0JBU0UgKyBTWl8xSyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkvKiBpbnRlcnJ1cHQgKi8KKwkJLnN0YXJ0ID0gSVJRX0RNMzY1X0tFWUlOVCwKKwkJLmVuZCA9IElSUV9ETTM2NV9LRVlJTlQsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkbTM2NV9rc19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImRhdmluY2lfa2V5c2NhbiIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRtMzY1X2tzX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gZG0zNjVfa3NfcmVzb3VyY2VzLAorfTsKKwogLyogQ29udGVudHMgb2YgSlRBRyBJRCByZWdpc3RlciB1c2VkIHRvIGlkZW50aWZ5IGV4YWN0IGNwdSB0eXBlICovCiBzdGF0aWMgc3RydWN0IGRhdmluY2lfaWQgZG0zNjVfaWRzW10gPSB7CiAJewpAQCAtOTA3LDYgKzk3NywzMyBAQAogCS5zcmFtX2xlbgkJPSBTWl8zMkssCiB9OwogCit2b2lkIF9faW5pdCBkbTM2NV9pbml0X2FzcChzdHJ1Y3Qgc25kX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCWRhdmluY2lfY2ZnX3JlZyhETTM2NV9NQ0JTUDBfQkRYKTsKKwlkYXZpbmNpX2NmZ19yZWcoRE0zNjVfTUNCU1AwX1gpOworCWRhdmluY2lfY2ZnX3JlZyhETTM2NV9NQ0JTUDBfQkZTWCk7CisJZGF2aW5jaV9jZmdfcmVnKERNMzY1X01DQlNQMF9CRFIpOworCWRhdmluY2lfY2ZnX3JlZyhETTM2NV9NQ0JTUDBfUik7CisJZGF2aW5jaV9jZmdfcmVnKERNMzY1X01DQlNQMF9CRlNSKTsKKwlkYXZpbmNpX2NmZ19yZWcoRE0zNjVfRVZUMl9BU1BfVFgpOworCWRhdmluY2lfY2ZnX3JlZyhETTM2NV9FVlQzX0FTUF9SWCk7CisJZG0zNjVfYXNwX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZG0zNjVfYXNwX2RldmljZSk7Cit9CisKK3ZvaWQgX19pbml0IGRtMzY1X2luaXRfa3Moc3RydWN0IGRhdmluY2lfa3NfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJZGF2aW5jaV9jZmdfcmVnKERNMzY1X0tFWVNDQU4pOworCWRtMzY1X2tzX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZG0zNjVfa3NfZGV2aWNlKTsKK30KKwordm9pZCBfX2luaXQgZG0zNjVfaW5pdF9ydGModm9pZCkKK3sKKwlkYXZpbmNpX2NmZ19yZWcoRE0zNjVfSU5UX1BSVENTUyk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkbTM2NV9ydGNfZGV2aWNlKTsKK30KKwogdm9pZCBfX2luaXQgZG0zNjVfaW5pdCh2b2lkKQogewogCWRhdmluY2lfY29tbW9uX2luaXQoJmRhdmluY2lfc29jX2luZm9fZG0zNjUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ0eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ0eC5jCmluZGV4IGQ2ZTBmYTUuLjJjZDAwODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NHguYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDR4LmMKQEAgLTgsNyArOCw2IEBACiAgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKICAqIG9yIGltcGxpZWQuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KQEAgLTE4LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG02NDR4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvY3B1dHlwZS5oPgogI2luY2x1ZGUgPG1hY2gvZWRtYS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgpAQCAtMzcwLDYgKzM2OCwxMSBAQAogTVVYX0NGRyhETTY0NFgsIEhQSUVOX0RJU0FCTEUsCTAsICAgMjksICAgIDEsCSAgMCwJIHRydWUpCiAKIE1VWF9DRkcoRE02NDRYLCBBRUFXLAkJMCwgICAwLCAgICAgMzEsCSAgMzEsCSB0cnVlKQorTVVYX0NGRyhETTY0NFgsIEFFQVcwLAkJMCwgICAwLCAgICAgMSwJICAwLAkgdHJ1ZSkKK01VWF9DRkcoRE02NDRYLCBBRUFXMSwJCTAsICAgMSwgICAgIDEsCSAgMCwJIHRydWUpCitNVVhfQ0ZHKERNNjQ0WCwgQUVBVzIsCQkwLCAgIDIsICAgICAxLAkgIDAsCSB0cnVlKQorTVVYX0NGRyhETTY0NFgsIEFFQVczLAkJMCwgICAzLCAgICAgMSwJICAwLAkgdHJ1ZSkKK01VWF9DRkcoRE02NDRYLCBBRUFXNCwJCTAsICAgNCwgICAgIDEsCSAgMCwJIHRydWUpCiAKIE1VWF9DRkcoRE02NDRYLCBNU1RLLAkJMSwgICA5LCAgICAgMSwJICAwLAkgZmFsc2UpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYwppbmRleCAwOTc2MDQ5Li44MjlhNDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDZ4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ2eC5jCkBAIC04LDcgKzgsNiBAQAogICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCiAgKiBvciBpbXBsaWVkLgogICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CkBAIC0xOCw3ICsxNyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxtYWNoL2RtNjQ2eC5oPgotI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxtYWNoL2VkbWEuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KQEAgLTc4OSw3ICs3ODcsMTQgQEAKIAkJLnBhcnRfbm8JPSAweGI3NzAsCiAJCS5tYW51ZmFjdHVyZXIJPSAweDAxNywKIAkJLmNwdV9pZAkJPSBEQVZJTkNJX0NQVV9JRF9ETTY0NjcsCi0JCS5uYW1lCQk9ICJkbTY0NjciLAorCQkubmFtZQkJPSAiZG02NDY3X3JldjEueCIsCisJfSwKKwl7CisJCS52YXJpYW50CT0gMHgxLAorCQkucGFydF9ubwk9IDB4Yjc3MCwKKwkJLm1hbnVmYWN0dXJlcgk9IDB4MDE3LAorCQkuY3B1X2lkCQk9IERBVklOQ0lfQ1BVX0lEX0RNNjQ2NywKKwkJLm5hbWUJCT0gImRtNjQ2N19yZXYzLngiLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG1hLmMKaW5kZXggZjJlNTdkMi4uNjQ4ZmJiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbWEuYwpAQCAtMTgsMjIgKzE4LDEzIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9lZG1hLmg+Ci0jaW5jbHVkZSA8bWFjaC9tdXguaD4KLQogCiAvKiBPZmZzZXRzIG1hdGNoaW5nICJzdHJ1Y3QgZWRtYWNjX3BhcmFtIiAqLwogI2RlZmluZSBQQVJNX09QVAkJMHgwMApAQCAtNTA5LDQzICs1MDAsNTkgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVzZXJ2ZV9jb250aWd1b3VzX3BhcmFtcyhpbnQgY3RsciwgdW5zaWduZWQgaW50IGlkLAotCQkJCSAgICAgdW5zaWduZWQgaW50IG51bV9wYXJhbXMsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfcGFyYW0pCitzdGF0aWMgaW50IHJlc2VydmVfY29udGlndW91c19zbG90cyhpbnQgY3RsciwgdW5zaWduZWQgaW50IGlkLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG51bV9zbG90cywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBzdGFydF9zbG90KQogewogCWludCBpLCBqOwotCXVuc2lnbmVkIGludCBjb3VudCA9IG51bV9wYXJhbXM7CisJdW5zaWduZWQgaW50IGNvdW50ID0gbnVtX3Nsb3RzOworCWludCBzdG9wX3Nsb3QgPSBzdGFydF9zbG90OworCURFQ0xBUkVfQklUTUFQKHRtcF9pbnVzZSwgRURNQV9NQVhfUEFSQU1FTlRSWSk7CiAKLQlmb3IgKGkgPSBzdGFydF9wYXJhbTsgaSA8IGVkbWFfaW5mb1tjdGxyXS0+bnVtX3Nsb3RzOyArK2kpIHsKKwlmb3IgKGkgPSBzdGFydF9zbG90OyBpIDwgZWRtYV9pbmZvW2N0bHJdLT5udW1fc2xvdHM7ICsraSkgewogCQlqID0gRURNQV9DSEFOX1NMT1QoaSk7Ci0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChqLCBlZG1hX2luZm9bY3Rscl0tPmVkbWFfaW51c2UpKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaiwgZWRtYV9pbmZvW2N0bHJdLT5lZG1hX2ludXNlKSkgeworCQkJLyogUmVjb3JkIG91ciBjdXJyZW50IGJlZ2lubmluZyBzbG90ICovCisJCQlpZiAoY291bnQgPT0gbnVtX3Nsb3RzKQorCQkJCXN0b3Bfc2xvdCA9IGk7CisKIAkJCWNvdW50LS07CisJCQlzZXRfYml0KGosIHRtcF9pbnVzZSk7CisKIAkJCWlmIChjb3VudCA9PSAwKQogCQkJCWJyZWFrOwotCQllbHNlIGlmIChpZCA9PSBFRE1BX0NPTlRfUEFSQU1TX0ZJWEVEX0VYQUNUKQotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJCWNvdW50ID0gbnVtX3BhcmFtczsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX2JpdChqLCB0bXBfaW51c2UpOworCisJCQlpZiAoaWQgPT0gRURNQV9DT05UX1BBUkFNU19GSVhFRF9FWEFDVCkgeworCQkJCXN0b3Bfc2xvdCA9IGk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQljb3VudCA9IG51bV9zbG90czsKKwkJfQogCX0KIAogCS8qCiAJICogV2UgaGF2ZSB0byBjbGVhciBhbnkgYml0cyB0aGF0IHdlIHNldAotCSAqIGlmIHdlIHJ1biBvdXQgcGFyYW1ldGVyIFJBTXMsIGkuZSB3ZSBkbyBmaW5kIGEgc2V0Ci0JICogb2YgY29udGlndW91cyBwYXJhbWV0ZXIgUkFNcyBidXQgZG8gbm90IGZpbmQgdGhlIGV4YWN0IG51bWJlcgotCSAqIHJlcXVlc3RlZCBhcyB3ZSBtYXkgcmVhY2ggdGhlIHRvdGFsIG51bWJlciBvZiBwYXJhbWV0ZXIgUkFNcworCSAqIGlmIHdlIHJ1biBvdXQgcGFyYW1ldGVyIFJBTSBzbG90cywgaS5lIHdlIGRvIGZpbmQgYSBzZXQKKwkgKiBvZiBjb250aWd1b3VzIHBhcmFtZXRlciBSQU0gc2xvdHMgYnV0IGRvIG5vdCBmaW5kIHRoZSBleGFjdCBudW1iZXIKKwkgKiByZXF1ZXN0ZWQgYXMgd2UgbWF5IHJlYWNoIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFyYW1ldGVyIFJBTSBzbG90cwogCSAqLwotCWlmIChjb3VudCkgewotCQlmb3IgKGogPSBpIC0gbnVtX3BhcmFtcyArIGNvdW50ICsgMTsgaiA8PSBpIDsgKytqKQorCWlmIChpID09IGVkbWFfaW5mb1tjdGxyXS0+bnVtX3Nsb3RzKQorCQlzdG9wX3Nsb3QgPSBpOworCisJZm9yIChqID0gc3RhcnRfc2xvdDsgaiA8IHN0b3Bfc2xvdDsgaisrKQorCQlpZiAodGVzdF9iaXQoaiwgdG1wX2ludXNlKSkKIAkJCWNsZWFyX2JpdChqLCBlZG1hX2luZm9bY3Rscl0tPmVkbWFfaW51c2UpOwogCisJaWYgKGNvdW50KQogCQlyZXR1cm4gLUVCVVNZOwotCX0KIAotCWZvciAoaiA9IGkgLSBudW1fcGFyYW1zICsgMTsgaiA8PSBpOyArK2opCisJZm9yIChqID0gaSAtIG51bV9zbG90cyArIDE7IGogPD0gaTsgKytqKQogCQltZW1jcHlfdG9pbyhlZG1hY2NfcmVnc19iYXNlW2N0bHJdICsgUEFSTV9PRkZTRVQoaiksCiAJCQkmZHVtbXlfcGFyYW1zZXQsIFBBUk1fU0laRSk7CiAKLQlyZXR1cm4gRURNQV9DVExSX0NIQU4oY3RsciwgaSAtIG51bV9wYXJhbXMgKyAxKTsKKwlyZXR1cm4gRURNQV9DVExSX0NIQU4oY3RsciwgaSAtIG51bV9zbG90cyArIDEpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTc0MywyNiArNzUwLDI3IEBACiAvKioKICAqIGVkbWFfYWxsb2NfY29udF9zbG90cy0gYWxsb2MgY29udGlndW91cyBwYXJhbWV0ZXIgUkFNIHNsb3RzCiAgKiBUaGUgQVBJIHdpbGwgcmV0dXJuIHRoZSBzdGFydGluZyBwb2ludCBvZiBhIHNldCBvZgotICogY29udGlndW91cyBQQVJBTSdzIHRoYXQgaGF2ZSBiZWVuIHJlcXVlc3RlZAorICogY29udGlndW91cyBwYXJhbWV0ZXIgUkFNIHNsb3RzIHRoYXQgaGF2ZSBiZWVuIHJlcXVlc3RlZAogICoKICAqIEBpZDogY2FuIG9ubHkgYmUgRURNQV9DT05UX1BBUkFNU19BTlkgb3IgRURNQV9DT05UX1BBUkFNU19GSVhFRF9FWEFDVAogICogb3IgRURNQV9DT05UX1BBUkFNU19GSVhFRF9OT1RfRVhBQ1QKLSAqIEBjb3VudDogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgUGFyYW10ZXIgUkFNJ3MKLSAqIEBwYXJhbSAgLSB0aGUgc3RhcnQgdmFsdWUgb2YgUGFyYW1ldGVyIFJBTSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgaWYgaWQKKyAqIEBjb3VudDogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgUGFyYW10ZXIgUkFNIHNsb3RzCisgKiBAc2xvdCAgLSB0aGUgc3RhcnQgdmFsdWUgb2YgUGFyYW1ldGVyIFJBTSBzbG90IHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpZiBpZAogICogaXMgRURNQV9DT05UX1BBUkFNU19GSVhFRF9FWEFDVCBvciBFRE1BX0NPTlRfUEFSQU1TX0ZJWEVEX05PVF9FWEFDVAogICoKICAqIElmIGlkIGlzIEVETUFfQ09OVF9QQVJBTVNfQU5ZIHRoZW4gdGhlIEFQSSBzdGFydHMgbG9va2luZyBmb3IgYSBzZXQgb2YKLSAqIGNvbnRpZ3VvdXMgUGFyYW1ldGVyIFJBTXMgZnJvbSBwYXJhbWV0ZXIgUkFNIDY0IGluIHRoZSBjYXNlIG9mIERhVmluY2kgU09DcwotICogYW5kIDMyIGluIHRoZSBjYXNlIG9mIFByaW11cworICogY29udGlndW91cyBQYXJhbWV0ZXIgUkFNIHNsb3RzIGZyb20gcGFyYW1ldGVyIFJBTSA2NCBpbiB0aGUgY2FzZSBvZgorICogRGFWaW5jaSBTT0NzIGFuZCAzMiBpbiB0aGUgY2FzZSBvZiBEQTh4eCBTT0NzLgogICoKICAqIElmIGlkIGlzIEVETUFfQ09OVF9QQVJBTVNfRklYRURfRVhBQ1QgdGhlbiB0aGUgQVBJIHN0YXJ0cyBsb29raW5nIGZvciBhCi0gKiBzZXQgb2YgY29udGlndW91cyBwYXJhbWV0ZXIgUkFNcyBmcm9tIHRoZSAicGFyYW0iIHRoYXQgaXMgcGFzc2VkIGFzIGFuCisgKiBzZXQgb2YgY29udGlndW91cyBwYXJhbWV0ZXIgUkFNIHNsb3RzIGZyb20gdGhlICJzbG90IiB0aGF0IGlzIHBhc3NlZCBhcyBhbgogICogYXJndW1lbnQgdG8gdGhlIEFQSS4KICAqCiAgKiBJZiBpZCBpcyBFRE1BX0NPTlRfUEFSQU1TX0ZJWEVEX05PVF9FWEFDVCB0aGVuIHRoZSBBUEkgaW5pdGlhbGx5IHRyaWVzCi0gKiBzdGFydHMgbG9va2luZyBmb3IgYSBzZXQgb2YgY29udGlndW91cyBwYXJhbWV0ZXIgUkFNcyBmcm9tIHRoZSAicGFyYW0iCisgKiBzdGFydHMgbG9va2luZyBmb3IgYSBzZXQgb2YgY29udGlndW91cyBwYXJhbWV0ZXIgUkFNcyBmcm9tIHRoZSAic2xvdCIKICAqIHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBBUEkuIE9uIGZhaWx1cmUgdGhlIEFQSSB3aWxsIHRyeSB0bwotICogZmluZCBhIHNldCBvZiBjb250aWd1b3VzIFBhcmFtZXRlciBSQU1zIGluIHRoZSByZW1haW5pbmcgUGFyYW1ldGVyIFJBTXMKKyAqIGZpbmQgYSBzZXQgb2YgY29udGlndW91cyBQYXJhbWV0ZXIgUkFNIHNsb3RzIGZyb20gdGhlIHJlbWFpbmluZyBQYXJhbWV0ZXIKKyAqIFJBTSBzbG90cwogICovCiBpbnQgZWRtYV9hbGxvY19jb250X3Nsb3RzKHVuc2lnbmVkIGN0bHIsIHVuc2lnbmVkIGludCBpZCwgaW50IHNsb3QsIGludCBjb3VudCkKIHsKQEAgLTc3MSwxMiArNzc5LDEzIEBACiAJICogdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgbGVzc2VyIHRoYW4gdGhlIHRvdGFsIG51bWJlcgogCSAqIG9mIHNsb3RzCiAJICovCi0JaWYgKHNsb3QgPCBlZG1hX2luZm9bY3Rscl0tPm51bV9jaGFubmVscyB8fAotCQlzbG90ID49IGVkbWFfaW5mb1tjdGxyXS0+bnVtX3Nsb3RzKQorCWlmICgoaWQgIT0gRURNQV9DT05UX1BBUkFNU19BTlkpICYmCisJCShzbG90IDwgZWRtYV9pbmZvW2N0bHJdLT5udW1fY2hhbm5lbHMgfHwKKwkJc2xvdCA+PSBlZG1hX2luZm9bY3Rscl0tPm51bV9zbG90cykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKLQkgKiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlciBSQU1zIHJlcXVlc3RlZCBjYW5ub3QgYmUgbGVzcyB0aGFuIDEKKwkgKiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlciBSQU0gc2xvdHMgcmVxdWVzdGVkIGNhbm5vdCBiZSBsZXNzIHRoYW4gMQogCSAqIGFuZCBjYW5ub3QgYmUgbW9yZSB0aGFuIHRoZSBudW1iZXIgb2Ygc2xvdHMgbWludXMgdGhlIG51bWJlciBvZgogCSAqIGNoYW5uZWxzCiAJICovCkBAIC03ODYsMTEgKzc5NSwxMSBAQAogCiAJc3dpdGNoIChpZCkgewogCWNhc2UgRURNQV9DT05UX1BBUkFNU19BTlk6Ci0JCXJldHVybiByZXNlcnZlX2NvbnRpZ3VvdXNfcGFyYW1zKGN0bHIsIGlkLCBjb3VudCwKKwkJcmV0dXJuIHJlc2VydmVfY29udGlndW91c19zbG90cyhjdGxyLCBpZCwgY291bnQsCiAJCQkJCQkgZWRtYV9pbmZvW2N0bHJdLT5udW1fY2hhbm5lbHMpOwogCWNhc2UgRURNQV9DT05UX1BBUkFNU19GSVhFRF9FWEFDVDoKIAljYXNlIEVETUFfQ09OVF9QQVJBTVNfRklYRURfTk9UX0VYQUNUOgotCQlyZXR1cm4gcmVzZXJ2ZV9jb250aWd1b3VzX3BhcmFtcyhjdGxyLCBpZCwgY291bnQsIHNsb3QpOworCQlyZXR1cm4gcmVzZXJ2ZV9jb250aWd1b3VzX3Nsb3RzKGN0bHIsIGlkLCBjb3VudCwgc2xvdCk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNzk5LDIxICs4MDgsMjEgQEAKIEVYUE9SVF9TWU1CT0woZWRtYV9hbGxvY19jb250X3Nsb3RzKTsKIAogLyoqCi0gKiBlZG1hX2ZyZWVfY29udF9zbG90cyAtIGRlYWxsb2NhdGUgRE1BIHBhcmFtZXRlciBSQU1zCi0gKiBAc2xvdDogZmlyc3QgcGFyYW1ldGVyIFJBTSBvZiBhIHNldCBvZiBwYXJhbWV0ZXIgUkFNcyB0byBiZSBmcmVlZAotICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFyYW1ldGVyIFJBTXMgdG8gYmUgZnJlZWQKKyAqIGVkbWFfZnJlZV9jb250X3Nsb3RzIC0gZGVhbGxvY2F0ZSBETUEgcGFyYW1ldGVyIFJBTSBzbG90cworICogQHNsb3Q6IGZpcnN0IHBhcmFtZXRlciBSQU0gb2YgYSBzZXQgb2YgcGFyYW1ldGVyIFJBTSBzbG90cyB0byBiZSBmcmVlZAorICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcGFyYW1ldGVyIFJBTSBzbG90cyB0byBiZSBmcmVlZAogICoKICAqIFRoaXMgZGVhbGxvY2F0ZXMgdGhlIHBhcmFtZXRlciBSQU0gc2xvdHMgYWxsb2NhdGVkIGJ5CiAgKiBlZG1hX2FsbG9jX2NvbnRfc2xvdHMuCiAgKiBDYWxsZXJzL2FwcGxpY2F0aW9ucyBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygc2V0cyBvZiBjb250aWd1b3VzCi0gKiBwYXJhbWV0ZXIgUkFNcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgdGhlIGVkbWFfYWxsb2NfY29udF9zbG90cworICogcGFyYW1ldGVyIFJBTSBzbG90cyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgdGhlIGVkbWFfYWxsb2NfY29udF9zbG90cwogICogQVBJLgogICogQ2FsbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoZSBzbG90cyBhcmUgaW5hY3RpdmUsIGFuZCB3aWxsCiAgKiBub3QgYmUgYWN0aXZhdGVkLgogICovCiBpbnQgZWRtYV9mcmVlX2NvbnRfc2xvdHModW5zaWduZWQgc2xvdCwgaW50IGNvdW50KQogewotCXVuc2lnbmVkIGN0bHI7CisJdW5zaWduZWQgY3Rsciwgc2xvdF90b19mcmVlOwogCWludCBpOwogCiAJY3RsciA9IEVETUFfQ1RMUihzbG90KTsKQEAgLTgyNiwxMSArODM1LDExIEBACiAKIAlmb3IgKGkgPSBzbG90OyBpIDwgc2xvdCArIGNvdW50OyArK2kpIHsKIAkJY3RsciA9IEVETUFfQ1RMUihpKTsKLQkJc2xvdCA9IEVETUFfQ0hBTl9TTE9UKGkpOworCQlzbG90X3RvX2ZyZWUgPSBFRE1BX0NIQU5fU0xPVChpKTsKIAotCQltZW1jcHlfdG9pbyhlZG1hY2NfcmVnc19iYXNlW2N0bHJdICsgUEFSTV9PRkZTRVQoc2xvdCksCisJCW1lbWNweV90b2lvKGVkbWFjY19yZWdzX2Jhc2VbY3Rscl0gKyBQQVJNX09GRlNFVChzbG90X3RvX2ZyZWUpLAogCQkJJmR1bW15X3BhcmFtc2V0LCBQQVJNX1NJWkUpOwotCQljbGVhcl9iaXQoc2xvdCwgZWRtYV9pbmZvW2N0bHJdLT5lZG1hX2ludXNlKTsKKwkJY2xlYXJfYml0KHNsb3RfdG9fZnJlZSwgZWRtYV9pbmZvW2N0bHJdLT5lZG1hX2ludXNlKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jCmluZGV4IGY2ZWE5ZGIuLjc0NDc1NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYwpAQCAtMTIsMjMgKzEyLDE0IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi0jaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAotCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fbG9jayk7CiAKIHN0cnVjdCBkYXZpbmNpX2dwaW8gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9hc3AuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvYXNwLmgKaW5kZXggZTA3ZjcwZS4uODM0NzI1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9hc3AuaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2FzcC5oCkBAIC0xMSw2ICsxMSw5IEBACiAjZGVmaW5lIERBVklOQ0lfQVNQMF9CQVNFCTB4MDFFMDIwMDAKICNkZWZpbmUgREFWSU5DSV9BU1AxX0JBU0UJMHgwMUUwNDAwMAogCisvKiBCYXNlcyBvZiBkbTM2NSByZWdpc3RlciBiYW5rcyAqLworI2RlZmluZSBEQVZJTkNJX0RNMzY1X0FTUDBfQkFTRQkweDAxRDAyMDAwCisKIC8qIEJhc2VzIG9mIGRtNjQ2eCByZWdpc3RlciBiYW5rcyAqLwogI2RlZmluZQlEQVZJTkNJX0RNNjQ2WF9NQ0FTUDBfUkVHX0JBU0UJCTB4MDFEMDEwMDAKICNkZWZpbmUgREFWSU5DSV9ETTY0NlhfTUNBU1AxX1JFR19CQVNFCQkweDAxRDAxODAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9jb21tb24uaAppbmRleCAxZmQzOTE3Li42Y2EyYzlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvY29tbW9uLmgKQEAgLTIwLDEyICsyMCw2IEBACiBleHRlcm4gdm9pZCBfX2lvbWVtICpkYXZpbmNpX2ludGNfYmFzZTsKIGV4dGVybiBpbnQgZGF2aW5jaV9pbnRjX3R5cGU7CiAKLS8qIHBhcmFtZXRlcnMgZGVzY3JpYmUgVkJVUyBzb3VyY2luZyBmb3IgaG9zdCBtb2RlICovCi1leHRlcm4gdm9pZCBzZXR1cF91c2IodW5zaWduZWQgbUEsIHVuc2lnbmVkIHBvdHBndF9tc2VjKTsKLQotLyogcGFyYW1ldGVycyBkZXNjcmliZSBWQlVTIHNvdXJjaW5nIGZvciBob3N0IG1vZGUgKi8KLWV4dGVybiB2b2lkIHNldHVwX3VzYih1bnNpZ25lZCBtQSwgdW5zaWduZWQgcG90cGd0X21zZWMpOwotCiBzdHJ1Y3QgZGF2aW5jaV90aW1lcl9pbnN0YW5jZSB7CiAJdm9pZCBfX2lvbWVtCSpiYXNlOwogCXUzMgkJYm90dG9tX2lycTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvY3B1ZnJlcS5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9jcHVmcmVxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwODljZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvY3B1ZnJlcS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBUSSBEYVZpbmNpIENQVUZyZXEgcGxhdGZvcm0gc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX01BQ0hfREFWSU5DSV9DUFVGUkVRX0gKKyNkZWZpbmUgX01BQ0hfREFWSU5DSV9DUFVGUkVRX0gKKworI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKworc3RydWN0IGRhdmluY2lfY3B1ZnJlcV9jb25maWcgeworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZTsKKwlpbnQgKCpzZXRfdm9sdGFnZSkgKHVuc2lnbmVkIGludCBpbmRleCk7CisJaW50ICgqaW5pdCkgKHZvaWQpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2NwdWlkbGUuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvY3B1aWRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZmM2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2NwdWlkbGUuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogVEkgRGFWaW5jaSBjcHVpZGxlIHBsYXRmb3JtIHN1cHBvcnQKKyAqCisgKiAyMDA5IChDKSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLiBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIF9NQUNIX0RBVklOQ0lfQ1BVSURMRV9ICisjZGVmaW5lIF9NQUNIX0RBVklOQ0lfQ1BVSURMRV9ICisKK3N0cnVjdCBkYXZpbmNpX2NwdWlkbGVfY29uZmlnIHsKKwl1MzIgZGRyMl9wZG93bjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kYTh4eC5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kYTh4eC5oCmluZGV4IGQ0MDk1ZDAuLjkwNzA0OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZGE4eHguaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RhOHh4LmgKQEAgLTExLDEyICsxMSwxNyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0RBVklOQ0lfREE4WFhfSAogI2RlZmluZSBfX0FTTV9BUkNIX0RBVklOQ0lfREE4WFhfSAogCisjaW5jbHVkZSA8dmlkZW8vZGE4eHgtZmIuaD4KKwogI2luY2x1ZGUgPG1hY2gvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9lZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL2VtYWMuaD4KICNpbmNsdWRlIDxtYWNoL2FzcC5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC91c2IuaD4KKworZXh0ZXJuIHZvaWQgX19pb21lbSAqZGE4eHhfc3lzY2ZnX2Jhc2U7CiAKIC8qCiAgKiBUaGUgY3BfaW50YyBpbnRlcnJ1cHQgY29udHJvbGxlciBmb3IgdGhlIGRhOHh4IGlzbid0IGluIHRoZSBzYW1lCkBAIC0yOSwxMSArMzQsMTUgQEAKICNkZWZpbmUgREE4WFhfQ1BfSU5UQ19TSVpFCVNaXzhLCiAjZGVmaW5lIERBOFhYX0NQX0lOVENfVklSVAkoSU9fVklSVCAtIERBOFhYX0NQX0lOVENfU0laRSAtIFNaXzRLKQogCi0jZGVmaW5lIERBOFhYX0JPT1RfQ0ZHX0JBU0UJKElPX1BIWVMgKyAweDE0MDAwKQorI2RlZmluZSBEQThYWF9TWVNDRkdfQkFTRQkoSU9fUEhZUyArIDB4MTQwMDApCisjZGVmaW5lIERBOFhYX1NZU0NGR19WSVJUKHgpCShkYTh4eF9zeXNjZmdfYmFzZSArICh4KSkKKyNkZWZpbmUgREE4WFhfSlRBR19JRF9SRUcJMHgxOAorI2RlZmluZSBEQThYWF9DRkdDSElQMF9SRUcJMHgxN2MKKyNkZWZpbmUgREE4WFhfQ0ZHQ0hJUDJfUkVHCTB4MTg0CisjZGVmaW5lIERBOFhYX0NGR0NISVAzX1JFRwkweDE4OAogCiAjZGVmaW5lIERBOFhYX1BTQzBfQkFTRQkJMHgwMWMxMDAwMAogI2RlZmluZSBEQThYWF9QTEwwX0JBU0UJCTB4MDFjMTEwMDAKLSNkZWZpbmUgREE4WFhfSlRBR19JRF9SRUcJMHgwMWMxNDAxOAogI2RlZmluZSBEQThYWF9USU1FUjY0UDBfQkFTRQkweDAxYzIwMDAwCiAjZGVmaW5lIERBOFhYX1RJTUVSNjRQMV9CQVNFCTB4MDFjMjEwMDAKICNkZWZpbmUgREE4WFhfR1BJT19CQVNFCQkweDAxZTI2MDAwCkBAIC00Myw2ICs1Miw3IEBACiAjZGVmaW5lIERBOFhYX0FFTUlGX0NTMl9CQVNFCTB4NjAwMDAwMDAKICNkZWZpbmUgREE4WFhfQUVNSUZfQ1MzX0JBU0UJMHg2MjAwMDAwMAogI2RlZmluZSBEQThYWF9BRU1JRl9DVExfQkFTRQkweDY4MDAwMDAwCisjZGVmaW5lIERBOFhYX0REUjJfQ1RMX0JBU0UJMHhiMDAwMDAwMAogCiAjZGVmaW5lIFBJTk1VWDAJCQkweDAwCiAjZGVmaW5lIFBJTk1VWDEJCQkweDA0CkBAIC03MSwxMyArODEsMjAgQEAKIGludCBkYTh4eF9yZWdpc3Rlcl9lZG1hKHZvaWQpOwogaW50IGRhOHh4X3JlZ2lzdGVyX2kyYyhpbnQgaW5zdGFuY2UsIHN0cnVjdCBkYXZpbmNpX2kyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CiBpbnQgZGE4eHhfcmVnaXN0ZXJfd2F0Y2hkb2codm9pZCk7CitpbnQgZGE4eHhfcmVnaXN0ZXJfdXNiMjAodW5zaWduZWQgbUEsIHVuc2lnbmVkIHBvdHBndCk7CitpbnQgZGE4eHhfcmVnaXN0ZXJfdXNiMTEoc3RydWN0IGRhOHh4X29oY2lfcm9vdF9odWIgKnBkYXRhKTsKIGludCBkYTh4eF9yZWdpc3Rlcl9lbWFjKHZvaWQpOwotaW50IGRhOHh4X3JlZ2lzdGVyX2xjZGModm9pZCk7CitpbnQgZGE4eHhfcmVnaXN0ZXJfbGNkYyhzdHJ1Y3QgZGE4eHhfbGNkY19wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CiBpbnQgZGE4eHhfcmVnaXN0ZXJfbW1jc2QwKHN0cnVjdCBkYXZpbmNpX21tY19jb25maWcgKmNvbmZpZyk7Ci12b2lkIF9faW5pdCBkYTh4eF9pbml0X21jYXNwKGludCBpZCwgc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7Cit2b2lkIF9faW5pdCBkYTh4eF9yZWdpc3Rlcl9tY2FzcChpbnQgaWQsIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOworaW50IGRhOHh4X3JlZ2lzdGVyX3J0Yyh2b2lkKTsKK2ludCBkYTg1MF9yZWdpc3Rlcl9jcHVmcmVxKHZvaWQpOworaW50IGRhOHh4X3JlZ2lzdGVyX2NwdWlkbGUodm9pZCk7CiAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhOHh4X3NlcmlhbF9kZXZpY2U7CiBleHRlcm4gc3RydWN0IGVtYWNfcGxhdGZvcm1fZGF0YSBkYTh4eF9lbWFjX3BkYXRhOworZXh0ZXJuIHN0cnVjdCBkYTh4eF9sY2RjX3BsYXRmb3JtX2RhdGEgc2hhcnBfbGNkMDM1cTNkZzAxX3BkYXRhOworZXh0ZXJuIHN0cnVjdCBkYTh4eF9sY2RjX3BsYXRmb3JtX2RhdGEgc2hhcnBfbGswNDN0MWRnMDFfcGRhdGE7CiAKIGV4dGVybiBjb25zdCBzaG9ydCBkYTgzMF9lbWlmMjVfcGluc1tdOwogZXh0ZXJuIGNvbnN0IHNob3J0IGRhODMwX3NwaTBfcGluc1tdOwpAQCAtMTEwLDYgKzEyNyw3IEBACiBleHRlcm4gY29uc3Qgc2hvcnQgZGE4NTBfaTJjMF9waW5zW107CiBleHRlcm4gY29uc3Qgc2hvcnQgZGE4NTBfaTJjMV9waW5zW107CiBleHRlcm4gY29uc3Qgc2hvcnQgZGE4NTBfY3BnbWFjX3BpbnNbXTsKK2V4dGVybiBjb25zdCBzaG9ydCBkYTg1MF9ybWlpX3BpbnNbXTsKIGV4dGVybiBjb25zdCBzaG9ydCBkYTg1MF9tY2FzcF9waW5zW107CiBleHRlcm4gY29uc3Qgc2hvcnQgZGE4NTBfbGNkY250bF9waW5zW107CiBleHRlcm4gY29uc3Qgc2hvcnQgZGE4NTBfbW1jc2QwX3BpbnNbXTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZG0zNjUuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZG0zNjUuaAppbmRleCAwOWRiNDM0Li5mMTcxMGEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RtMzY1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kbTM2NS5oCkBAIC0xNiw2ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZW1hYy5oPgorI2luY2x1ZGUgPG1hY2gvYXNwLmg+CisjaW5jbHVkZSA8bWFjaC9rZXlzY2FuLmg+CiAKICNkZWZpbmUgRE0zNjVfRU1BQ19CQVNFCQkJKDB4MDFEMDcwMDApCiAjZGVmaW5lIERNMzY1X0VNQUNfQ05UUkxfT0ZGU0VUCQkoMHgwMDAwKQpAQCAtMjQsNiArMjYsMTQgQEAKICNkZWZpbmUgRE0zNjVfRU1BQ19NRElPX09GRlNFVAkJKDB4NDAwMCkKICNkZWZpbmUgRE0zNjVfRU1BQ19DTlRSTF9SQU1fU0laRQkoMHgyMDAwKQogCisvKiBCYXNlIG9mIGtleSBzY2FuIHJlZ2lzdGVyIGJhbmsgKi8KKyNkZWZpbmUgRE0zNjVfS0VZU0NBTl9CQVNFCQkoMHgwMUM2OTQwMCkKKworI2RlZmluZSBETTM2NV9SVENfQkFTRQkJCSgweDAxQzY5MDAwKQorCiB2b2lkIF9faW5pdCBkbTM2NV9pbml0KHZvaWQpOwordm9pZCBfX2luaXQgZG0zNjVfaW5pdF9hc3Aoc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7Cit2b2lkIF9faW5pdCBkbTM2NV9pbml0X2tzKHN0cnVjdCBkYXZpbmNpX2tzX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKK3ZvaWQgX19pbml0IGRtMzY1X2luaXRfcnRjKHZvaWQpOwogCiAjZW5kaWYgLyogX19BU01fQVJDSF9ETTM2NV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RtNjQ0eC5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kbTY0NHguaAppbmRleCAwZWZiNzM4Li40NGU4ZjBmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RtNjQ0eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZG02NDR4LmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9ETTY0NFhfSAogI2RlZmluZSBfX0FTTV9BUkNIX0RNNjQ0WF9ICiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9lbWFjLmg+CiAjaW5jbHVkZSA8bWFjaC9hc3AuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggM2M5MThhNy4uMzU0YWY3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTIxNyw2ICsyMTcsNyBAQAogI2RlZmluZSBJUlFfRE0zNjVfU0RJT0lOVDAJMjMKICNkZWZpbmUgSVJRX0RNMzY1X01NQ0lOVDEJMjcKICNkZWZpbmUgSVJRX0RNMzY1X1BXTUlOVDMJMjgKKyNkZWZpbmUgSVJRX0RNMzY1X1JUQ0lOVAkyOQogI2RlZmluZSBJUlFfRE0zNjVfU0RJT0lOVDEJMzEKICNkZWZpbmUgSVJRX0RNMzY1X1NQSUlOVDBfMAk0MgogI2RlZmluZSBJUlFfRE0zNjVfU1BJSU5UM18wCTQzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2tleXNjYW4uaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gva2V5c2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZTIxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2tleXNjYW4uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMKKyAqCisgKiBBdXRob3I6IE1pZ3VlbCBBZ3VpbGFyIDxtaWd1ZWwuYWd1aWxhckByaWRnZXJ1bi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgREFWSU5DSV9LRVlTQ0FOX0gKKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKK2VudW0gZGF2aW5jaV9tYXRyaXhfdHlwZXMgeworCURBVklOQ0lfS0VZU0NBTl9NQVRSSVhfNFg0LAorCURBVklOQ0lfS0VZU0NBTl9NQVRSSVhfNVgzLAorfTsKKworc3RydWN0IGRhdmluY2lfa3NfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgc2hvcnQJKmtleW1hcDsKKwl1MzIJCWtleW1hcHNpemU7CisJdTgJCXJlcDoxOworCXU4CQlzdHJvYmU7CisJdTgJCWludGVydmFsOworCXU4CQltYXRyaXhfdHlwZTsKK307CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL211eC5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tdXguaAppbmRleCBiYjg0ODkzLi5iNjBjNjkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL211eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbXV4LmgKQEAgLTQwLDYgKzQwLDExIEBACiAKIAkvKiBBRUFXIGZ1bmN0aW9ucyAqLwogCURNNjQ0WF9BRUFXLAorCURNNjQ0WF9BRUFXMCwKKwlETTY0NFhfQUVBVzEsCisJRE02NDRYX0FFQVcyLAorCURNNjQ0WF9BRUFXMywKKwlETTY0NFhfQUVBVzQsCiAKIAkvKiBNZW1vcnkgU3RpY2sgKi8KIAlETTY0NFhfTVNUSywKQEAgLTIzNyw4ICsyNDIsOCBAQAogCURNMzY1X0VNQUNfTURJTywKIAlETTM2NV9FTUFDX01EQ0xLLAogCi0JLyogS2V5cGFkICovCi0JRE0zNjVfS0VZUEFELAorCS8qIEtleSBTY2FuICovCisJRE0zNjVfS0VZU0NBTiwKIAogCS8qIFBXTSAqLwogCURNMzY1X1BXTTAsCkBAIC03NzQsNiArNzc5LDE0IEBACiAJREE4NTBfTUlJX1JYRF8wLAogCURBODUwX01ESU9fQ0xLLAogCURBODUwX01ESU9fRCwKKwlEQTg1MF9STUlJX1RYRF8wLAorCURBODUwX1JNSUlfVFhEXzEsCisJREE4NTBfUk1JSV9UWEVOLAorCURBODUwX1JNSUlfQ1JTX0RWLAorCURBODUwX1JNSUlfUlhEXzAsCisJREE4NTBfUk1JSV9SWERfMSwKKwlEQTg1MF9STUlJX1JYRVIsCisJREE4NTBfUk1JSV9NSFpfNTBfQ0xLLAogCiAJLyogTWNBU1AgZnVuY3Rpb24gKi8KIAlEQTg1MF9BQ0xLUiwKQEAgLTg4MSw4ICs4OTQsOSBAQAogCURBODUwX05FTUFfQ1NfMiwKIAogCS8qIEdQSU8gZnVuY3Rpb24gKi8KKwlEQTg1MF9HUElPMl82LAorCURBODUwX0dQSU8yXzgsCiAJREE4NTBfR1BJTzJfMTUsCi0JREE4NTBfR1BJTzhfMTAsCiAJREE4NTBfR1BJTzRfMCwKIAlEQTg1MF9HUElPNF8xLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IDhlNGYxMGYuLjVhN2Q3NTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMTEsOSArMTEsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCiBleHRlcm4gdm9pZCBkYXZpbmNpX3dhdGNoZG9nX3Jlc2V0KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3VzYi5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGJjNGFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC91c2IuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogVVNCIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfVVNCX0gKKyNkZWZpbmUgX19BU01fQVJDSF9VU0JfSAorCisvKiBEQTh4eCBDRkdDSElQMiAoVVNCIDIuMCBQSFkgQ29udHJvbCkgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDRkdDSElQMl9QSFlDTEtHRAkoMSA8PCAxNykKKyNkZWZpbmUgQ0ZHQ0hJUDJfVkJVU1NFTlNFCSgxIDw8IDE2KQorI2RlZmluZSBDRkdDSElQMl9SRVNFVAkJKDEgPDwgMTUpCisjZGVmaW5lIENGR0NISVAyX09UR01PREUJKDMgPDwgMTMpCisjZGVmaW5lIENGR0NISVAyX05PX09WRVJSSURFCSgwIDw8IDEzKQorI2RlZmluZSBDRkdDSElQMl9GT1JDRV9IT1NUCSgxIDw8IDEzKQorI2RlZmluZSBDRkdDSElQMl9GT1JDRV9ERVZJQ0UgCSgyIDw8IDEzKQorI2RlZmluZSBDRkdDSElQMl9GT1JDRV9IT1NUX1ZCVVNfTE9XICgzIDw8IDEzKQorI2RlZmluZSBDRkdDSElQMl9VU0IxUEhZQ0xLTVVYCSgxIDw8IDEyKQorI2RlZmluZSBDRkdDSElQMl9VU0IyUEhZQ0xLTVVYCSgxIDw8IDExKQorI2RlZmluZSBDRkdDSElQMl9QSFlQV1JETgkoMSA8PCAxMCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHUFdSRE4JKDEgPDwgOSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfREFUUE9MIAkoMSA8PCA4KQorI2RlZmluZSBDRkdDSElQMl9VU0IxU1VTUEVORE0JKDEgPDwgNykKKyNkZWZpbmUgQ0ZHQ0hJUDJfUEhZX1BMTE9OCSgxIDw8IDYpCS8qIG92ZXJyaWRlIFBMTCBzdXNwZW5kICovCisjZGVmaW5lIENGR0NISVAyX1NFU0VOREVOCSgxIDw8IDUpCS8qIFZzZXNzX2VuZCBjb21wYXJhdG9yICovCisjZGVmaW5lIENGR0NISVAyX1ZCRFRDVEVOCSgxIDw8IDQpCS8qIFZidXMgY29tcGFyYXRvciAqLworI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRCSgweGYgPDwgMCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV8xMk1IWgkoMSA8PCAwKQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzI0TUhaCSgyIDw8IDApCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfNDhNSFoJKDMgPDwgMCkKKworc3RydWN0CWRhOHh4X29oY2lfcm9vdF9odWI7CisKK3R5cGVkZWYgdm9pZCAoKmRhOHh4X29jaWNfaGFuZGxlcl90KShzdHJ1Y3QgZGE4eHhfb2hjaV9yb290X2h1YiAqaHViLAorCQkJCSAgICAgdW5zaWduZWQgcG9ydCk7CisKKy8qIFBhc3NlZCBhcyB0aGUgcGxhdGZvcm0gZGF0YSB0byB0aGUgT0hDSSBkcml2ZXIgKi8KK3N0cnVjdAlkYTh4eF9vaGNpX3Jvb3RfaHViIHsKKwkvKiBTd2l0Y2ggdGhlIHBvcnQgcG93ZXIgb24vb2ZmICovCisJaW50CSgqc2V0X3Bvd2VyKSh1bnNpZ25lZCBwb3J0LCBpbnQgb24pOworCS8qIFJlYWQgdGhlIHBvcnQgcG93ZXIgc3RhdHVzICovCisJaW50CSgqZ2V0X3Bvd2VyKSh1bnNpZ25lZCBwb3J0KTsKKwkvKiBSZWFkIHRoZSBwb3J0IG92ZXItY3VycmVudCBpbmRpY2F0b3IgKi8KKwlpbnQJKCpnZXRfb2NpKSh1bnNpZ25lZCBwb3J0KTsKKwkvKiBPdmVyLWN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSBub3RpZmljYXRpb24gKHBhc3MgTlVMTCB0byBkaXNhYmxlKSAqLworCWludAkoKm9jaWNfbm90aWZ5KShkYTh4eF9vY2ljX2hhbmRsZXJfdCBoYW5kbGVyKTsKKworCS8qIFRpbWUgZnJvbSBwb3dlciBvbiB0byBwb3dlciBnb29kIChpbiAyIG1zIHVuaXRzKSAqLworCXU4CXBvdHBndDsKK307CisKK3ZvaWQgZGF2aW5jaV9zZXR1cF91c2IodW5zaWduZWQgbUEsIHVuc2lnbmVkIHBvdHBndF9tcyk7CisKKyNlbmRpZgkvKiBpZm5kZWYgX19BU01fQVJDSF9VU0JfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL211eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL211eC5jCmluZGV4IDg5ODkwNWUuLmY3NTdlODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9tdXguYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvbXV4LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BzYy5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BzYy5jCmluZGV4IGE3OGI2NTcuLjA0YTNjYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9wc2MuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvcHNjLmMKQEAgLTE5LDE0ICsxOSwxMSBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcHNjLmg+Ci0jaW5jbHVkZSA8bWFjaC9tdXguaD4KIAogLyogUFNDIHJlZ2lzdGVyIG9mZnNldHMgKi8KICNkZWZpbmUgRVBDUFIJCTB4MDcwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvc2VyaWFsLmMKaW5kZXggYzUzMGM3My4uN2NlNWJhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9zZXJpYWwuYwpAQCAtMjgsMTQgKzI4LDggQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvY3B1dHlwZS5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0KLSNpbmNsdWRlICJjbG9jay5oIgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZXJpYWxfcmVhZF9yZWcoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICp1cCwKIAkJCQkJICAgaW50IG9mZnNldCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9zcmFtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvc3JhbS5jCmluZGV4IDRmMWZjOWIuLmRiMGY3NzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9zcmFtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3NyYW0uYwpAQCAtOSwxNSArOSwxMiBAQAogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgogI2luY2x1ZGUgPG1hY2gvc3JhbS5oPgogCi0KIHN0YXRpYyBzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fcG9vbDsKIAogdm9pZCAqc3JhbV9hbGxvYyhzaXplX3QgbGVuLCBkbWFfYWRkcl90ICpkbWEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3RpbWUuYwppbmRleCAwZDFiNmQ0Li40MmQ5ODViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS90aW1lLmMKQEAgLTE0LDIwICsxNCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxtYWNoL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8bWFjaC90aW1lLmg+CiAjaW5jbHVkZSAiY2xvY2suaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS91c2IuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS91c2IuYwppbmRleCAwNmY1NTkzLi4zMWYwY2JlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvdXNiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3VzYi5jCkBAIC0xLDIxICsxLDIxIEBACiAvKgogICogVVNCCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogCiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CisjaW5jbHVkZSA8bWFjaC91c2IuaD4KIAotI2RlZmluZSBEQVZJTkNJX1VTQl9PVEdfQkFTRSAweDAxQzY0MDAwCisjZGVmaW5lIERBVklOQ0lfVVNCX09UR19CQVNFCTB4MDFjNjQwMDAKKworI2RlZmluZSBEQThYWF9VU0IwX0JBU0UgCTB4MDFlMDAwMDAKKyNkZWZpbmUgREE4WFhfVVNCMV9CQVNFIAkweDAxZTI1MDAwCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX2Vwc19iaXRzIG11c2JfZXBzW10gPSB7CkBAIC04NSwxMCArODUsMTAgQEAKIAkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHVzYl9yZXNvdXJjZXMpLAogfTsKIAotdm9pZCBfX2luaXQgc2V0dXBfdXNiKHVuc2lnbmVkIG1BLCB1bnNpZ25lZCBwb3RwZ3RfbXNlYykKK3ZvaWQgX19pbml0IGRhdmluY2lfc2V0dXBfdXNiKHVuc2lnbmVkIG1BLCB1bnNpZ25lZCBwb3RwZ3RfbXMpCiB7Ci0JdXNiX2RhdGEucG93ZXIgPSBtQSAvIDI7Ci0JdXNiX2RhdGEucG90cGd0ID0gcG90cGd0X21zZWMgLyAyOworCXVzYl9kYXRhLnBvd2VyID0gbUEgPiA1MTAgPyAyNTUgOiBtQSAvIDI7CisJdXNiX2RhdGEucG90cGd0ID0gKHBvdHBndF9tcyArIDEpIC8gMjsKIAogCWlmIChjcHVfaXNfZGF2aW5jaV9kbTY0NngoKSkgewogCQkvKiBPdmVycmlkZSB0aGUgZGVmYXVsdHMgYXMgRE02NDY3IHVzZXMgZGlmZmVyZW50IElSUXMuICovCkBAIC0xMDAsMTEgKzEwMCw3NyBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdXNiX2Rldik7CiB9CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9EQVZJTkNJX0RBOFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhOHh4X3VzYjIwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IERBOFhYX1VTQjBfQkFTRSwKKwkJLmVuZAkJPSBEQThYWF9VU0IwX0JBU0UgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSBJUlFfREE4WFhfVVNCX0lOVCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitpbnQgX19pbml0IGRhOHh4X3JlZ2lzdGVyX3VzYjIwKHVuc2lnbmVkIG1BLCB1bnNpZ25lZCBwb3RwZ3QpCit7CisJdXNiX2RhdGEuY2xvY2sgID0gInVzYjIwIjsKKwl1c2JfZGF0YS5wb3dlcgk9IG1BID4gNTEwID8gMjU1IDogbUEgLyAyOworCXVzYl9kYXRhLnBvdHBndCA9IChwb3RwZ3QgKyAxKSAvIDI7CisKKwl1c2JfZGV2LnJlc291cmNlID0gZGE4eHhfdXNiMjBfcmVzb3VyY2VzOworCXVzYl9kZXYubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoZGE4eHhfdXNiMjBfcmVzb3VyY2VzKTsKKworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnVzYl9kZXYpOworfQorI2VuZGlmCS8qIENPTkZJR19EQVZJTkNJX0RBOFhYICovCisKICNlbHNlCiAKLXZvaWQgX19pbml0IHNldHVwX3VzYih1bnNpZ25lZCBtQSwgdW5zaWduZWQgcG90cGd0X21zZWMpCit2b2lkIF9faW5pdCBkYXZpbmNpX3NldHVwX3VzYih1bnNpZ25lZCBtQSwgdW5zaWduZWQgcG90cGd0X21zKQogewogfQogCisjaWZkZWYgQ09ORklHX0FSQ0hfREFWSU5DSV9EQThYWAoraW50IF9faW5pdCBkYTh4eF9yZWdpc3Rlcl91c2IyMCh1bnNpZ25lZCBtQSwgdW5zaWduZWQgcG90cGd0KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKICNlbmRpZiAgLyogQ09ORklHX1VTQl9NVVNCX0hEUkMgKi8KIAorI2lmZGVmCUNPTkZJR19BUkNIX0RBVklOQ0lfREE4WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGE4eHhfdXNiMTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBEQThYWF9VU0IxX0JBU0UsCisJCS5lbmQJPSBEQThYWF9VU0IxX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfREE4WFhfSVJRTiwKKwkJLmVuZAk9IElSUV9EQThYWF9JUlFOLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHU2NCBkYTh4eF91c2IxMV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhOHh4X3VzYjExX2RldmljZSA9IHsKKwkubmFtZQkJPSAib2hjaSIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrCQk9ICZkYTh4eF91c2IxMV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShkYTh4eF91c2IxMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGRhOHh4X3VzYjExX3Jlc291cmNlcywKK307CisKK2ludCBfX2luaXQgZGE4eHhfcmVnaXN0ZXJfdXNiMTEoc3RydWN0IGRhOHh4X29oY2lfcm9vdF9odWIgKnBkYXRhKQoreworCWRhOHh4X3VzYjExX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRhOHh4X3VzYjExX2RldmljZSk7Cit9CisjZW5kaWYJLyogQ09ORklHX0RBVklOQ0lfREE4WFggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCA0OGU4MjdkLi41OWQyYWNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0zMSw3ICszMSw3IEBACiAvKgogICogVGhpcyBfX1JFRygpIHZlcnNpb24gZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgb25lIGFib3ZlLCAgZXhjZXB0CiAgKiB0aGF0IHdlIGFyZSBmb29saW5nIGdjYyBzb21laG93IHNvIGl0IGdlbmVyYXRlcyBmYXIgYmV0dGVyIGFuZCBzbWFsbGVyCi0gKiBhc3NlbWJseSBjb2RlIGZvciBhY2Nlc3MgdG8gY29udGlnb3VzIHJlZ2lzdGVycy4gIEl0J3MgYSBzaGFtZSB0aGF0IGdjYworICogYXNzZW1ibHkgY29kZSBmb3IgYWNjZXNzIHRvIGNvbnRpZ3VvdXMgcmVnaXN0ZXJzLiAgSXQncyBhIHNoYW1lIHRoYXQgZ2NjCiAgKiBkb2Vzbid0IGd1ZXNzIHRoaXMgYnkgaXRzZWxmLgogICovCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKaW5kZXggMzZkYzU0MS4uYmRmOTZlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJd3JpdGVsKHdpbl9lbmFibGUsIFBDSV9CQVJfRU5BQkxFKTsKIAogCS8qCi0JICogRGlzYWJsZSBhdXRvbWF0aWMgdXBkYXRlIG9mIGFkZHJlc3MgcmVtYXBpbmcgd2hlbiB3cml0aW5nIHRvIEJBUnMuCisJICogRGlzYWJsZSBhdXRvbWF0aWMgdXBkYXRlIG9mIGFkZHJlc3MgcmVtYXBwaW5nIHdoZW4gd3JpdGluZyB0byBCQVJzLgogCSAqLwogCW9yaW9uNXhfc2V0Yml0cyhQQ0lfQUREUl9ERUNPREVfQ1RSTCwgMSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbWxkLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbWxkLmgKaW5kZXggODcyMWI4MC4uYWU1MzZlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG1sZC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtbGQuaApAQCAtOTEsNyArOTEsNyBAQAogLyogQkFUVEVSWSAqLwogI2RlZmluZSBQQUxNTERfQkFUX01BWF9WT0xUQUdFCQk0MDAwCS8qIDQuMDBWIG1heGltdW0gdm9sdGFnZSAqLwogI2RlZmluZSBQQUxNTERfQkFUX01JTl9WT0xUQUdFCQkzNTUwCS8qIDMuNTVWIGNyaXRpY2FsIHZvbHRhZ2UgKi8KLSNkZWZpbmUgUEFMTUxEX0JBVF9NQVhfQ1VSUkVOVAkJMAkvKiB1bmtub2tuICovCisjZGVmaW5lIFBBTE1MRF9CQVRfTUFYX0NVUlJFTlQJCTAJLyogdW5rbm93biAqLwogI2RlZmluZSBQQUxNTERfQkFUX01JTl9DVVJSRU5UCQkwCS8qIHVua25vd24gKi8KICNkZWZpbmUgUEFMTUxEX0JBVF9NQVhfQ0hBUkdFCQkxCS8qIHVua25vd24gKi8KICNkZWZpbmUgUEFMTUxEX0JBVF9NSU5fQ0hBUkdFCQkxCS8qIHVua25vd24gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdDUuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdDUuaAppbmRleCBkMTU2NjJhLi42YmFmNzQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXQ1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10NS5oCkBAIC02Niw3ICs2Niw3IEBACiAvKiBCQVRURVJZICovCiAjZGVmaW5lIFBBTE1UNV9CQVRfTUFYX1ZPTFRBR0UJCTQwMDAJLyogNC4wMHYgY3VycmVudCB2b2x0YWdlICovCiAjZGVmaW5lIFBBTE1UNV9CQVRfTUlOX1ZPTFRBR0UJCTM1NTAJLyogMy41NXYgY3JpdGljYWwgdm9sdGFnZSAqLwotI2RlZmluZSBQQUxNVDVfQkFUX01BWF9DVVJSRU5UCQkwCS8qIHVua25va24gKi8KKyNkZWZpbmUgUEFMTVQ1X0JBVF9NQVhfQ1VSUkVOVAkJMAkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1UNV9CQVRfTUlOX0NVUlJFTlQJCTAJLyogdW5rbm93biAqLwogI2RlZmluZSBQQUxNVDVfQkFUX01BWF9DSEFSR0UJCTEJLyogdW5rbm93biAqLwogI2RlZmluZSBQQUxNVDVfQkFUX01JTl9DSEFSR0UJCTEJLyogdW5rbm93biAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10Yy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10Yy5oCmluZGV4IDNkYzliMDcuLjNmOWRkM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdGMuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXRjLmgKQEAgLTY4LDcgKzY4LDcgQEAKIC8qIEJBVFRFUlkgKi8KICNkZWZpbmUgUEFMTVRDX0JBVF9NQVhfVk9MVEFHRQkJNDAwMAkvKiA0LjAwViBtYXhpbXVtIHZvbHRhZ2UgKi8KICNkZWZpbmUgUEFMTVRDX0JBVF9NSU5fVk9MVEFHRQkJMzU1MAkvKiAzLjU1ViBjcml0aWNhbCB2b2x0YWdlICovCi0jZGVmaW5lIFBBTE1UQ19CQVRfTUFYX0NVUlJFTlQJCTAJLyogdW5rbm9rbiAqLworI2RlZmluZSBQQUxNVENfQkFUX01BWF9DVVJSRU5UCQkwCS8qIHVua25vd24gKi8KICNkZWZpbmUgUEFMTVRDX0JBVF9NSU5fQ1VSUkVOVAkJMAkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1UQ19CQVRfTUFYX0NIQVJHRQkJMQkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1UQ19CQVRfTUlOX0NIQVJHRQkJMQkvKiB1bmtub3duICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXRlMi5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10ZTIuaAppbmRleCAxMjM2MTM0Li5mODllOTg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXRlMi5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdGUyLmgKQEAgLTU5LDcgKzU5LDcgQEAKIC8qIEJBVFRFUlkgKi8KICNkZWZpbmUgUEFMTVRFMl9CQVRfTUFYX1ZPTFRBR0UJCTQwMDAJLyogNC4wMHYgY3VycmVudCB2b2x0YWdlICovCiAjZGVmaW5lIFBBTE1URTJfQkFUX01JTl9WT0xUQUdFCQkzNTUwCS8qIDMuNTV2IGNyaXRpY2FsIHZvbHRhZ2UgKi8KLSNkZWZpbmUgUEFMTVRFMl9CQVRfTUFYX0NVUlJFTlQJCTAJLyogdW5rbm9rbiAqLworI2RlZmluZSBQQUxNVEUyX0JBVF9NQVhfQ1VSUkVOVAkJMAkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1URTJfQkFUX01JTl9DVVJSRU5UCQkwCS8qIHVua25vd24gKi8KICNkZWZpbmUgUEFMTVRFMl9CQVRfTUFYX0NIQVJHRQkJMQkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1URTJfQkFUX01JTl9DSEFSR0UJCTEJLyogdW5rbm93biAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10eC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10eC5oCmluZGV4IDFiZTBkYjYuLjEwYWJjNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdHguaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXR4LmgKQEAgLTk0LDcgKzk0LDcgQEAKIC8qIEJBVFRFUlkgKi8KICNkZWZpbmUgUEFMTVRYX0JBVF9NQVhfVk9MVEFHRQkJNDAwMAkvKiA0LjAwdiBjdXJyZW50IHZvbHRhZ2UgKi8KICNkZWZpbmUgUEFMTVRYX0JBVF9NSU5fVk9MVEFHRQkJMzU1MAkvKiAzLjU1diBjcml0aWNhbCB2b2x0YWdlICovCi0jZGVmaW5lIFBBTE1UWF9CQVRfTUFYX0NVUlJFTlQJCTAJLyogdW5rbm9rbiAqLworI2RlZmluZSBQQUxNVFhfQkFUX01BWF9DVVJSRU5UCQkwCS8qIHVua25vd24gKi8KICNkZWZpbmUgUEFMTVRYX0JBVF9NSU5fQ1VSUkVOVAkJMAkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1UWF9CQVRfTUFYX0NIQVJHRQkJMQkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1UWF9CQVRfTUlOX0NIQVJHRQkJMQkvKiB1bmtub3duICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXo3Mi5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG16NzIuaAppbmRleCAyODA2ZWY2Li4yYmJjZjcwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXo3Mi5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtejcyLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIC8qIEJhdHRlcnkgKi8KICNkZWZpbmUgUEFMTVo3Ml9CQVRfTUFYX1ZPTFRBR0UJCTQwMDAJLyogNC4wMHYgY3VycmVudCB2b2x0YWdlICovCiAjZGVmaW5lIFBBTE1aNzJfQkFUX01JTl9WT0xUQUdFCQkzNTUwCS8qIDMuNTV2IGNyaXRpY2FsIHZvbHRhZ2UgKi8KLSNkZWZpbmUgUEFMTVo3Ml9CQVRfTUFYX0NVUlJFTlQJCTAJLyogdW5rbm9rbiAqLworI2RlZmluZSBQQUxNWjcyX0JBVF9NQVhfQ1VSUkVOVAkJMAkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1aNzJfQkFUX01JTl9DVVJSRU5UCQkwCS8qIHVua25vd24gKi8KICNkZWZpbmUgUEFMTVo3Ml9CQVRfTUFYX0NIQVJHRQkJMQkvKiB1bmtub3duICovCiAjZGVmaW5lIFBBTE1aNzJfQkFUX01JTl9DSEFSR0UJCTEJLyogdW5rbm93biAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MDAvS2NvbmZpZwppbmRleCBkZWFiMDcyLi5mZGQ4ZjVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MDAvS2NvbmZpZwpAQCAtMSwxMyArMSw3IEBACi0jIGFyY2gvYXJtL21hY2gtczNjMjQwMC9LY29uZmlnCi0jCiAjIENvcHlyaWdodCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcwogIwogIyBMaWNlbnNlZCB1bmRlciBHUEx2MgogCi0KLQogbWVudSAiUzNDMjQwMCBNYWNoaW5lcyIKIAotCiBlbmRtZW51Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKaW5kZXggZGQxZmNjNy4uNTU0NzMxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGFyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCi0jCiAjIENvcHlyaWdodCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcwogIwogIyBMaWNlbnNlZCB1bmRlciBHUEx2MgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvS2NvbmZpZwppbmRleCBjMmJkYzQ2Li45YThjMDY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLSMgYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKLSMKICMgQ29weXJpZ2h0IDIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCiAjCiAjIExpY2Vuc2VkIHVuZGVyIEdQTHYyCkBAIC05MCw2ICs4OCw0IEBACiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIGFuIFZTVE1TIGJvYXJkCiAKLQogZW5kbWVudQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9LY29uZmlnCmluZGV4IGNmMTBlMTQuLjgwODc5MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBhcmNoL2FybS9tYWNoLXMzYzI0NDAvS2NvbmZpZwotIwogIyBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKICMKICMgTGljZW5zZWQgdW5kZXIgR1BMdjIKQEAgLTEyMiw0ICsxMjAsMyBAQAogCSAgYXZhaWxhYmxlIHZpYSB2YXJpb3VzIHNvdXJjZXMuIEl0IGNhbiBjb21lIHdpdGggYSAzLjUiIG9yIDciIHRvdWNoIExDRC4KIAogZW5kbWVudQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDIvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0Mi9LY29uZmlnCmluZGV4IDEwM2U5MTMuLjhkMzgxMTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0Mi9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0Mi9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBhcmNoL2FybS9tYWNoLXMzYzI0NDIvS2NvbmZpZwotIwogIyBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKICMKICMgTGljZW5zZWQgdW5kZXIgR1BMdjIKQEAgLTM2LDYgKzM0LDQgQEAKIAloZWxwCiAJICAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBPcGVubW9rbyBHVEEwMiAvIEZyZWVydW5uZXIgR1NNIFBob25lCiAKLQogZW5kbWVudQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnCmluZGV4IDIxMjE0MWIuLjQzMTRjNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBhcmNoL2FybS9tYWNoLXMzYzI0NDMvS2NvbmZpZwotIwogIyBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKICMKICMgTGljZW5zZWQgdW5kZXIgR1BMdjIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL0tjb25maWcKaW5kZXggNzcwYjcyMC4uYTI1MGJmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGFyY2gvYXJtL21hY2gtczNjNjQwMC9LY29uZmlnCi0jCiAjIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCiAjCVNpbXRlYyBFbGVjdHJvbmljcywgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgogIwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL3NldHVwLXNkaGNpLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvc2V0dXAtc2RoY2kuYwppbmRleCBiOTNkYWZiLi4xMDM5OTM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvc2V0dXAtc2RoY2kuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvc2V0dXAtc2RoY2kuYwpAQCAtMzAsNyArMzAsNyBAQAogCVswXSA9ICJoc21tYyIsCiAJWzFdID0gImhzbW1jIiwKIAlbMl0gPSAibW1jX2J1cyIsCi0JLyogWzNdID0gIjQ4bSIsIC0gbm90ZSBub3Qgc3VjY2VzZnVsbHkgdXNlZCB5ZXQgKi8KKwkvKiBbM10gPSAiNDhtIiwgLSBub3RlIG5vdCBzdWNjZXNzZnVsbHkgdXNlZCB5ZXQgKi8KIH07CiAKIHZvaWQgczNjNjQwMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjNjQxMC9LY29uZmlnCmluZGV4IDcyZDRiMTEuLjE2MmY0NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjQxMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQxMC9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBhcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZwotIwogIyBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgogIyBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQxMC9zZXR1cC1zZGhjaS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL3NldHVwLXNkaGNpLmMKaW5kZXggMjA2NjZmMy4uODE2ZDJkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL3NldHVwLXNkaGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL3NldHVwLXNkaGNpLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAlbMF0gPSAiaHNtbWMiLAogCVsxXSA9ICJoc21tYyIsCiAJWzJdID0gIm1tY19idXMiLAotCS8qIFszXSA9ICI0OG0iLCAtIG5vdGUgbm90IHN1Y2Nlc2Z1bGx5IHVzZWQgeWV0ICovCisJLyogWzNdID0gIjQ4bSIsIC0gbm90ZSBub3Qgc3VjY2Vzc2Z1bGx5IHVzZWQgeWV0ICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL0tjb25maWcKaW5kZXggMGRkMmI4Yy4uMjdlYzE2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGFyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnCi0jCiAjIENvcHlyaWdodCAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uCiAjCUJ5dW5naG8gTWluIDxiaG1pbkBzYW1zdW5nLmNvbT4KICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMKaW5kZXggY2I0NTIxYS4uYWQ2NjAzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAogCiAvKioKLSAqCXNhMTEwMF9yZXF1ZXN0X2RtYSAtIGFsbG9jYXRlIG9uZSBvZiB0aGUgU0ExMXgwJ3MgRE1BIGNoYW5lbHMKKyAqCXNhMTEwMF9yZXF1ZXN0X2RtYSAtIGFsbG9jYXRlIG9uZSBvZiB0aGUgU0ExMXgwJ3MgRE1BIGNoYW5uZWxzCiAgKglAZGV2aWNlOiBUaGUgU0ExMXgwIHBlcmlwaGVyYWwgdGFyZ2V0ZWQgYnkgdGhpcyByZXF1ZXN0CiAgKglAZGV2aWNlX2lkOiBBbiBhc2NpaSBuYW1lIGZvciB0aGUgY2xhaW1pbmcgZGV2aWNlCiAgKglAY2FsbGJhY2s6IEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY29tcGxldGVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3UzMDAtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC91MzAwLXJlZ3MuaAppbmRleCA4ODMzM2RmLi41NjcyMWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3UzMDAtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvdTMwMC1yZWdzLmgKQEAgLTYsNyArNiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBTVC1Fcmljc3NvbiBBQgogICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCiAgKiBCYXNpYyByZWdpc3RlciBhZGRyZXNzIGRlZmluaXRpb25zIGluIHBoeXNpY2FsIG1lbW9yeSBhbmQKLSAqIHNvbWUgYmxvY2sgZGVmaW50aW9ucyBmb3IgY29yZSBkZXZpY2VzIGxpa2UgdGhlIHRpbWVyLgorICogc29tZSBibG9jayBkZWZpbml0aW9ucyBmb3IgY29yZSBkZXZpY2VzIGxpa2UgdGhlIHRpbWVyLgogICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaAppbmRleCBlYWFiZDRlLi5lMWZjNmRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14My5oCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqIHNldHVwcyBhIHNpbmdsZSBwaW46CiAgKiAJLSByZXNlcnZlcyB0aGUgcGluIHNvIHRoYXQgaXQgaXMgbm90IGNsYWltZWQgYnkgYW5vdGhlciBkcml2ZXIKICAqIAktIHNldHVwcyB0aGUgaW9tdXggYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uCi0gKiAJLSBpZiB0aGUgcGluIGlzIGNvbmZpZ3VyZWQgYXMgYSBHUElPLCB3ZSBjbGFpbSBpdCB0aHJvdWcga2VybmVsIGdwaW9saWIKKyAqIAktIGlmIHRoZSBwaW4gaXMgY29uZmlndXJlZCBhcyBhIEdQSU8sIHdlIGNsYWltIGl0IHRocm91Z2gga2VybmVsIGdwaW9saWIKICAqLwogaW50IG14Y19pb211eF9hbGxvY19waW4oY29uc3QgdW5zaWduZWQgaW50IHBpbiwgY29uc3QgY2hhciAqbGFiZWwpOwogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teGM5MTIzMS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14YzkxMjMxLmgKaW5kZXggOWYxMzA2MS4uMzg4N2YzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14YzkxMjMxLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14YzkxMjMxLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKICAqIHNldHVwcyBhIHNpbmdsZSBwaW46CiAgKiAJLSByZXNlcnZlcyB0aGUgcGluIHNvIHRoYXQgaXQgaXMgbm90IGNsYWltZWQgYnkgYW5vdGhlciBkcml2ZXIKICAqIAktIHNldHVwcyB0aGUgaW9tdXggYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uCi0gKiAJLSBpZiB0aGUgcGluIGlzIGNvbmZpZ3VyZWQgYXMgYSBHUElPLCB3ZSBjbGFpbSBpdCB0aHJvdWcga2VybmVsIGdwaW9saWIKKyAqIAktIGlmIHRoZSBwaW4gaXMgY29uZmlndXJlZCBhcyBhIEdQSU8sIHdlIGNsYWltIGl0IHRocm91Z2gga2VybmVsIGdwaW9saWIKICAqLwogaW50IG14Y19pb211eF9hbGxvY19waW4oY29uc3QgdW5zaWduZWQgaW50IHBpbl9tb2RlLCBjb25zdCBjaGFyICpsYWJlbCk7CiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvcHdtLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9wd20uYwppbmRleCA1Y2RiZDYwLi40ZmY2ZGZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9wd20uYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9wd20uYwpAQCAtOTQsNyArOTQsNyBAQAogCQkgKiByZWdpc3RlciB0byBmb2xsb3cgdGhlIHJhdGlvIG9mIGR1dHlfbnMgdnMuIHBlcmlvZF9ucwogCQkgKiBhY2NvcmRpbmdseS4KIAkJICoKLQkJICogVGhpcyBpcyBnb29kIGVub3VnaHQgZm9yIHByb2dyYW1taW5nIHRoZSBicmlnaHRuZXNzIG9mCisJCSAqIFRoaXMgaXMgZ29vZCBlbm91Z2ggZm9yIHByb2dyYW1taW5nIHRoZSBicmlnaHRuZXNzIG9mCiAJCSAqIHRoZSBMQ0QgYmFja2xpZ2h0LgogCQkgKgogCQkgKiBUaGUgcmVhbCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBkaXZpZGUgUEVSQ0xLWzBdIGZpcnN0IGJ5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKaW5kZXggYmU0Y2UwNy4uZDE3Mzc1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYwpAQCAtMTI1Miw3ICsxMjUyLDcgQEAKICAqIAkJCQkJICAgICAgT01BUF9ETUFfRFlOQU1JQ19DSEFJTgogICogQHBhcmFtcyAtIENoYW5uZWwgcGFyYW1ldGVycwogICoKLSAqIEByZXR1cm4gLSBTdWNjZXMgOiAwCisgKiBAcmV0dXJuIC0gU3VjY2VzcyA6IDAKICAqIAkgICAgIEZhaWx1cmU6IC1FSU5WQUwvLUVOT01FTQogICovCiBpbnQgb21hcF9yZXF1ZXN0X2RtYV9jaGFpbihpbnQgZGV2X2lkLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcDE2eHguaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcDE2eHguaAppbmRleCAwZTY5YjUwLi43NTYwYjRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAxNnh4LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwMTZ4eC5oCkBAIC0xMjQsNyArMTI0LDcgQEAKICNkZWZpbmUgVElQQl9TV0lUQ0hfQkFTRQkJICgweGZmZmJjODAwKQogI2RlZmluZSBPTUFQMTZYWF9NTUNTRDJfU1NXX01QVV9DT05GCShUSVBCX1NXSVRDSF9CQVNFICsgMHgxNjApCiAKLS8qIFVBUlQzIFJlZ2lzdGVycyBNYXBpbmcgdGhyb3VnaCBNUFUgYnVzICovCisvKiBVQVJUMyBSZWdpc3RlcnMgTWFwcGluZyB0aHJvdWdoIE1QVSBidXMgKi8KICNkZWZpbmUgVUFSVDNfUkhSICAgICAgICAgICAgICAgKE9NQVBfVUFSVDNfQkFTRSArIDApCiAjZGVmaW5lIFVBUlQzX1RIUiAgICAgICAgICAgICAgIChPTUFQX1VBUlQzX0JBU0UgKyAwKQogI2RlZmluZSBVQVJUM19ETEwgICAgICAgICAgICAgICAoT01BUF9VQVJUM19CQVNFICsgMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LXMzYy9LY29uZmlnCmluZGV4IGUxMzlhNzIuLjllOWQwMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLSMgYXJjaC9hcm0vcGxhdC1zM2MvS2NvbmZpZwotIwogIyBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKICMKICMgTGljZW5zZWQgdW5kZXIgR1BMdjIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL3B3bS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvcHdtLmMKaW5kZXggNGZkYzViMy4uZWYwMTlmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MvcHdtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvcHdtLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgczNjX3B3bV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHMzY19wd21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHB3bV9kZXZpY2UgKnB3bSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCmluZGV4IDIwZmJmOTMuLjM0MjY0N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBhcmNoL2FybS9wbGF0LXMzYzI0eHgvS2NvbmZpZwotIwogIyBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKICMKICMgTGljZW5zZWQgdW5kZXIgR1BMdjIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9hZGMuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9hZGMuYwppbmRleCBkZjQ3MzIyLi5jZTQ3NjI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvYWRjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2FkYy5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHMzY19hZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzM2NfYWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBhZGNfZGV2aWNlICphZGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCmluZGV4IGY2NTE5MmQuLmYwZWE3OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKQEAgLTE0MDMsMTEgKzE0MDMsMTMgQEAKIAkJb3JkID0gJmRtYV9vcmRlci0+Y2hhbm5lbHNbY2hhbm5lbF07CiAKIAkJZm9yIChjaCA9IDA7IGNoIDwgZG1hX2NoYW5uZWxzOyBjaCsrKSB7CisJCQlpbnQgdG1wOwogCQkJaWYgKCFpc19jaGFubmVsX3ZhbGlkKG9yZC0+bGlzdFtjaF0pKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoczNjMjQxMF9jaGFuc1tvcmQtPmxpc3RbY2hdXS5pbl91c2UgPT0gMCkgewotCQkJCWNoID0gb3JkLT5saXN0W2NoXSAmIH5ETUFfQ0hfVkFMSUQ7CisJCQl0bXAgPSBvcmQtPmxpc3RbY2hdICYgfkRNQV9DSF9WQUxJRDsKKwkJCWlmIChzM2MyNDEwX2NoYW5zW3RtcF0uaW5fdXNlID09IDApIHsKKwkJCQljaCA9IHRtcDsKIAkJCQlnb3RvIGZvdW5kOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21hcC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tYXAuaAppbmRleCBjNGQxMzM0Li5iZDUzNGQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21hcC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvbWFwLmgKQEAgLTY0LDcgKzY0LDcgQEAKIC8qIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIFZBIG9mIHRoaXMgbXVzdCBlbnN1cmUgdGhhdAogICogaXQgaXMgdGhlIHNhbWUgZGlzdGFuY2UgYXBhcnQgZnJvbSB0aGUgVUFSVCBpbiB0aGUKICAqIHBoc3lpY2FsIGFkZHJlc3Mgc3BhY2UsIGFzIHRoZSBpbml0aWFsIG1hcHBpbmcgZm9yIHRoZSBJTwotICogaXMgZG9uZSBhcyBhIDE6MSBtYXBpbmcuIFRoaXMgcHV0cyBpdCAoY3VycmVudGx5KSBhdAorICogaXMgZG9uZSBhcyBhIDE6MSBtYXBwaW5nLiBUaGlzIHB1dHMgaXQgKGN1cnJlbnRseSkgYXQKICAqIDB4RkE4MDAwMDAsIHdoaWNoIGlzIG5vdCBpbiB0aGUgd2F5IG9mIGFueSBjdXJyZW50IG1hcHBpbmcKICAqIGJ5IHRoZSBiYXNlIHN5c3RlbS4KICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMKaW5kZXggZWYwZjUyMS4uYWQwZDQ0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYwpAQCAtNTIyLDYgKzUyMiw4IEBACiAJX19yYXdfd3JpdGVsKGludG1vZCwgUzNDMjQxMF9JTlRNT0QpOwogCXJldHVybiAwOwogfQorCitFWFBPUlRfU1lNQk9MX0dQTChzM2MyNHh4X3NldF9maXEpOwogI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L0tjb25maWcgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvS2NvbmZpZwppbmRleCBiY2ZhNzc4Li5lNmRhODdhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLSMgYXJjaC9hcm0vcGxhdC1zM2M2NHh4L0tjb25maWcKLSMKICMgQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KICMgQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCiAjCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwYzF4eC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1zNXBjMXh4L0tjb25maWcKaW5kZXggMTYwOGU2Mi4uYjdiOWU5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXBjMXh4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1zNXBjMXh4L0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGFyY2gvYXJtL3BsYXQtczVwYzF4eC9LY29uZmlnCi0jCiAjIENvcHlyaWdodCAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uCiAjCUJ5dW5naG8gTWluIDxiaG1pbkBzYW1zdW5nLmNvbT4KICMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvS2NvbmZpZyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvS2NvbmZpZwppbmRleCBmZGEyMzMxLi41YzEzZDc4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL0tjb25maWcKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9LY29uZmlnCkBAIC0yNCw3ICsyNCw3IEBACiAJYm9vbCAiQXRtZWwgQUM5NyBTb3VuZCBzdXBwb3J0IgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBTb3VuZCBzdXBwb3J0IGZvciB0aGUgSGFtbWVyaGVhZCBib2FyZC4gWW91IG1heQotCSAgYWxzbyBnbyB0cm91Z2ggdGhlIEFMU0Egc2V0dGluZ3MgdG8gZ2V0IGl0IHdvcmtpbmcuCisJICBhbHNvIGdvIHRocm91Z2ggdGhlIEFMU0Egc2V0dGluZ3MgdG8gZ2V0IGl0IHdvcmtpbmcuCiAKIAkgIENob29zZSAnWScgaGVyZSBpZiB5b3UgaGF2ZSBvcmRlcmVkIGEgQ29yb25hIGRhdWd0aGVyIGJvYXJkIGFuZAogCSAgd2FudCB0byBtYWtlIHlvdXIgYm9hcmQgZnVua3kuCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNWNjN2UyZS4uNDU4NzY0MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYwpAQCAtMjE1LDIyICsyMTUsMTggQEAKIC8qCiAgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KICAqLwotCiBhc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICpuYW1lLCBjaGFyIF9fdXNlciAqIF9fdXNlciAqYXJndiwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmVudnApCiB7CiAJaW50IGVycm9yOwogCWNoYXIgKmZpbGVuYW1lOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopKCgmbmFtZSkgKyA2KTsKIAotCWxvY2tfa2VybmVsKCk7CiAJZmlsZW5hbWUgPSBnZXRuYW1lKG5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CiAJaWYgKElTX0VSUihmaWxlbmFtZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyb3I7CiAJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIGFyZ3YsIGVudnAsIHJlZ3MpOwogCXB1dG5hbWUoZmlsZW5hbWUpOwotIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYwppbmRleCA2YjczMjVkLi43OGNiM2QzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKQEAgLTYxOSw3ICs2MTksNyBAQAogCiAvKgogICogU2ltaWxhciB0byBnZXRfdXNlciwgZG8gc29tZSBhZGRyZXNzIGNoZWNraW5nLCB0aGVuIGRlcmVmZXJlbmNlCi0gKiBSZXR1cm4gdHJ1ZSBvbiBzdWNlc3MsIGZhbHNlIG9uIGJhZCBhZGRyZXNzCisgKiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBiYWQgYWRkcmVzcwogICovCiBzdGF0aWMgYm9vbCBnZXRfaW5zdHJ1Y3Rpb24odW5zaWduZWQgc2hvcnQgKnZhbCwgdW5zaWduZWQgc2hvcnQgKmFkZHJlc3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTF4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCmluZGV4IGUwNmY0MTEuLmY5ZmQyYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCkBAIC01NDIsNyArNTQyLDcgQEAKICNkZWZpbmUgSE1ETUEwX0NPTlRST0wJCTB4RkZDMDMzMDAJLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCiAjZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTBfQkNJTklUCQkweEZGQzAzMzA4CS8qIEhNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUEwX0VDVVJHRU5UCQkweEZGQzAzMzBDCS8qIEhNRE1BMCBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCiAjZGVmaW5lIEhNRE1BMF9FQ09WRVJGTE9XCTB4RkZDMDMzMTAJLyogSE1ETUEwIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCiAjZGVmaW5lIEhNRE1BMF9FQ09VTlQJCTB4RkZDMDMzMTQJLyogSE1ETUEwIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTBfQkNPVU5UCQkweEZGQzAzMzE4CS8qIEhNRE1BMCBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCkBAIC01NTAsNyArNTUwLDcgQEAKICNkZWZpbmUgSE1ETUExX0NPTlRST0wJCTB4RkZDMDMzNDAJLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCiAjZGVmaW5lIEhNRE1BMV9FQ0lOSVQJCTB4RkZDMDMzNDQJLyogSE1ETUExIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTFfQkNJTklUCQkweEZGQzAzMzQ4CS8qIEhNRE1BMSBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMV9FQ1VSR0VOVAkJMHhGRkMwMzM0QwkvKiBITURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCiAjZGVmaW5lIEhNRE1BMV9FQ09WRVJGTE9XCTB4RkZDMDMzNTAJLyogSE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCiAjZGVmaW5lIEhNRE1BMV9FQ09VTlQJCTB4RkZDMDMzNTQJLyogSE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTFfQkNPVU5UCQkweEZGQzAzMzU4CS8qIEhNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTJ4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MnhfYmFzZS5oCmluZGV4IGY4MjE3MDAuLmI5ZGJiNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MnhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MnhfYmFzZS5oCkBAIC01NDQsNyArNTQ0LDcgQEAKICNkZWZpbmUgSE1ETUEwX0NPTlRST0wJCTB4RkZDMDMzMDAJLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCiAjZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTBfQkNJTklUCQkweEZGQzAzMzA4CS8qIEhNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUEwX0VDVVJHRU5UCQkweEZGQzAzMzBDCS8qIEhNRE1BMCBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCiAjZGVmaW5lIEhNRE1BMF9FQ09WRVJGTE9XCTB4RkZDMDMzMTAJLyogSE1ETUEwIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCiAjZGVmaW5lIEhNRE1BMF9FQ09VTlQJCTB4RkZDMDMzMTQJLyogSE1ETUEwIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTBfQkNPVU5UCQkweEZGQzAzMzE4CS8qIEhNRE1BMCBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCkBAIC01NTIsNyArNTUyLDcgQEAKICNkZWZpbmUgSE1ETUExX0NPTlRST0wJCTB4RkZDMDMzNDAJLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCiAjZGVmaW5lIEhNRE1BMV9FQ0lOSVQJCTB4RkZDMDMzNDQJLyogSE1ETUExIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTFfQkNJTklUCQkweEZGQzAzMzQ4CS8qIEhNRE1BMSBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMV9FQ1VSR0VOVAkJMHhGRkMwMzM0QwkvKiBITURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCiAjZGVmaW5lIEhNRE1BMV9FQ09WRVJGTE9XCTB4RkZDMDMzNTAJLyogSE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCiAjZGVmaW5lIEhNRE1BMV9FQ09VTlQJCTB4RkZDMDMzNTQJLyogSE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwogI2RlZmluZSBITURNQTFfQkNPVU5UCQkweEZGQzAzMzU4CS8qIEhNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM0LmgKaW5kZXggY2ViYjE0Zi4uYTZkMjBjYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzQuaApAQCAtOTM0LDcgKzkzNCw3IEBACiAjZGVmaW5lIEhNRE1BMF9DT05UUk9MCQkweEZGQzAzMzAwCS8qIEhhbmRzaGFrZSBNRE1BMCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhNRE1BMF9CQ0lOSVQJCTB4RkZDMDMzMDgJLyogSE1ETUEwIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyICAgICAgICAgKi8KICNkZWZpbmUgSE1ETUEwX0VDT1ZFUkZMT1cJMHhGRkMwMzMxMAkvKiBITURNQTAgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIgICAgICAgICovCiAjZGVmaW5lIEhNRE1BMF9FQ09VTlQJCTB4RkZDMDMzMTQJLyogSE1ETUEwIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhNRE1BMF9CQ09VTlQJCTB4RkZDMDMzMTgJLyogSE1ETUEwIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05NDIsNyArOTQyLDcgQEAKICNkZWZpbmUgSE1ETUExX0NPTlRST0wJCTB4RkZDMDMzNDAJLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSE1ETUExX0VDSU5JVAkJMHhGRkMwMzM0NAkvKiBITURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSE1ETUExX0JDSU5JVAkJMHhGRkMwMzM0OAkvKiBITURNQTEgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hob2xkIFJlZ2lzdGVyICAgICAgICAgKi8KKyNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIgICAgICAgICAqLwogI2RlZmluZSBITURNQTFfRUNPVkVSRkxPVwkweEZGQzAzMzUwCS8qIEhNRE1BMSBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlciAgICAgICAgKi8KICNkZWZpbmUgSE1ETUExX0VDT1VOVAkJMHhGRkMwMzM1NAkvKiBITURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSE1ETUExX0JDT1VOVAkJMHhGRkMwMzM1OAkvKiBITURNQTEgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDQuaAppbmRleCBkZDQxNGFlLi4zOWY1ODhkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0NC5oCkBAIC00OTEsNyArNDkxLDcgQEAKICNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE1ETUEwX0NPTlRST0wgIDB4ZmZjMDQ1MDAgICAvKiBIYW5kc2hha2UgTURNQTAgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDSU5JVCAgMHhmZmMwNDUwNCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9CQ0lOSVQgIDB4ZmZjMDQ1MDggICAvKiBIYW5kc2hha2UgTURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhNRE1BMF9FQ1VSR0VOVCAgMHhmZmMwNDUwYyAgIC8qIEhhbmRzaGFrZSBNRE1BMCBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hob2xkIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDVVJHRU5UICAweGZmYzA0NTBjICAgLyogSGFuZHNoYWtlIE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICBITURNQTBfRUNPVkVSRkxPVyAgMHhmZmMwNDUxMCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDT1VOVCAgMHhmZmMwNDUxNCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9CQ09VTlQgIDB4ZmZjMDQ1MTggICAvKiBIYW5kc2hha2UgTURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlciAqLwpAQCAtNTAxLDcgKzUwMSw3IEBACiAjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhNRE1BMV9DT05UUk9MICAweGZmYzA0NTQwICAgLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ0lOSVQgIDB4ZmZjMDQ1NDQgICAvKiBIYW5kc2hha2UgTURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfQkNJTklUICAweGZmYzA0NTQ4ICAgLyogSGFuZHNoYWtlIE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBITURNQTFfRUNVUkdFTlQgIDB4ZmZjMDQ1NGMgICAvKiBIYW5kc2hha2UgTURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ1VSR0VOVCAgMHhmZmMwNDU0YyAgIC8qIEhhbmRzaGFrZSBNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgSE1ETUExX0VDT1ZFUkZMT1cgIDB4ZmZjMDQ1NTAgICAvKiBIYW5kc2hha2UgTURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ09VTlQgIDB4ZmZjMDQ1NTQgICAvKiBIYW5kc2hha2UgTURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfQkNPVU5UICAweGZmYzA0NTU4ICAgLyogSGFuZHNoYWtlIE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDcuaAppbmRleCA1YTlkYmFiLi5jNGRjZjMwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Ny5oCkBAIC00NzAsNyArNDcwLDcgQEAKICNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE1ETUEwX0NPTlRST0wgIDB4ZmZjMDQ1MDAgICAvKiBIYW5kc2hha2UgTURNQTAgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDSU5JVCAgMHhmZmMwNDUwNCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9CQ0lOSVQgIDB4ZmZjMDQ1MDggICAvKiBIYW5kc2hha2UgTURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhNRE1BMF9FQ1VSR0VOVCAgMHhmZmMwNDUwYyAgIC8qIEhhbmRzaGFrZSBNRE1BMCBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hob2xkIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDVVJHRU5UICAweGZmYzA0NTBjICAgLyogSGFuZHNoYWtlIE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICBITURNQTBfRUNPVkVSRkxPVyAgMHhmZmMwNDUxMCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDT1VOVCAgMHhmZmMwNDUxNCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9CQ09VTlQgIDB4ZmZjMDQ1MTggICAvKiBIYW5kc2hha2UgTURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlciAqLwpAQCAtNDgwLDcgKzQ4MCw3IEBACiAjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhNRE1BMV9DT05UUk9MICAweGZmYzA0NTQwICAgLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ0lOSVQgIDB4ZmZjMDQ1NDQgICAvKiBIYW5kc2hha2UgTURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfQkNJTklUICAweGZmYzA0NTQ4ICAgLyogSGFuZHNoYWtlIE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBITURNQTFfRUNVUkdFTlQgIDB4ZmZjMDQ1NGMgICAvKiBIYW5kc2hha2UgTURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ1VSR0VOVCAgMHhmZmMwNDU0YyAgIC8qIEhhbmRzaGFrZSBNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgSE1ETUExX0VDT1ZFUkZMT1cgIDB4ZmZjMDQ1NTAgICAvKiBIYW5kc2hha2UgTURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ09VTlQgIDB4ZmZjMDQ1NTQgICAvKiBIYW5kc2hha2UgTURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfQkNPVU5UICAweGZmYzA0NTU4ICAgLyogSGFuZHNoYWtlIE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDguaAppbmRleCA4MmNkNTkzLi5hNTA3OTk4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OC5oCkBAIC04NTMsNyArODUzLDcgQEAKICNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE1ETUEwX0NPTlRST0wgIDB4ZmZjMDQ1MDAgICAvKiBIYW5kc2hha2UgTURNQTAgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDSU5JVCAgMHhmZmMwNDUwNCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9CQ0lOSVQgIDB4ZmZjMDQ1MDggICAvKiBIYW5kc2hha2UgTURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhNRE1BMF9FQ1VSR0VOVCAgMHhmZmMwNDUwYyAgIC8qIEhhbmRzaGFrZSBNRE1BMCBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hob2xkIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDVVJHRU5UICAweGZmYzA0NTBjICAgLyogSGFuZHNoYWtlIE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICBITURNQTBfRUNPVkVSRkxPVyAgMHhmZmMwNDUxMCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDT1VOVCAgMHhmZmMwNDUxNCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9CQ09VTlQgIDB4ZmZjMDQ1MTggICAvKiBIYW5kc2hha2UgTURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlciAqLwpAQCAtODYzLDcgKzg2Myw3IEBACiAjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhNRE1BMV9DT05UUk9MICAweGZmYzA0NTQwICAgLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ0lOSVQgIDB4ZmZjMDQ1NDQgICAvKiBIYW5kc2hha2UgTURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfQkNJTklUICAweGZmYzA0NTQ4ICAgLyogSGFuZHNoYWtlIE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBITURNQTFfRUNVUkdFTlQgIDB4ZmZjMDQ1NGMgICAvKiBIYW5kc2hha2UgTURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ1VSR0VOVCAgMHhmZmMwNDU0YyAgIC8qIEhhbmRzaGFrZSBNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgSE1ETUExX0VDT1ZFUkZMT1cgIDB4ZmZjMDQ1NTAgICAvKiBIYW5kc2hha2UgTURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ09VTlQgIDB4ZmZjMDQ1NTQgICAvKiBIYW5kc2hha2UgTURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfQkNPVU5UICAweGZmYzA0NTU4ICAgLyogSGFuZHNoYWtlIE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDkuaAppbmRleCA2ZmM2ZTM5Li5mN2YwNDM1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OS5oCkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogI2RlZmluZSAgICAgICAgICAgICAgICAgICBITURNQTBfQ09OVFJPTCAgMHhmZmMwNDUwMCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTBfRUNJTklUICAweGZmYzA0NTA0ICAgLyogSGFuZHNoYWtlIE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0JDSU5JVCAgMHhmZmMwNDUwOCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDVVJHRU5UICAweGZmYzA0NTBjICAgLyogSGFuZHNoYWtlIE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaGhvbGQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBITURNQTBfRUNVUkdFTlQgIDB4ZmZjMDQ1MGMgICAvKiBIYW5kc2hha2UgTURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgIEhNRE1BMF9FQ09WRVJGTE9XICAweGZmYzA0NTEwICAgLyogSGFuZHNoYWtlIE1ETUEwIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTBfRUNPVU5UICAweGZmYzA0NTE0ICAgLyogSGFuZHNoYWtlIE1ETUEwIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0JDT1VOVCAgMHhmZmMwNDUxOCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyICovCkBAIC0xMDM0LDcgKzEwMzQsNyBAQAogI2RlZmluZSAgICAgICAgICAgICAgICAgICBITURNQTFfQ09OVFJPTCAgMHhmZmMwNDU0MCAgIC8qIEhhbmRzaGFrZSBNRE1BMSBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfRUNJTklUICAweGZmYzA0NTQ0ICAgLyogSGFuZHNoYWtlIE1ETUExIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUExX0JDSU5JVCAgMHhmZmMwNDU0OCAgIC8qIEhhbmRzaGFrZSBNRE1BMSBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE1ETUExX0VDVVJHRU5UICAweGZmYzA0NTRjICAgLyogSGFuZHNoYWtlIE1ETUExIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaGhvbGQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBITURNQTFfRUNVUkdFTlQgIDB4ZmZjMDQ1NGMgICAvKiBIYW5kc2hha2UgTURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgIEhNRE1BMV9FQ09WRVJGTE9XICAweGZmYzA0NTUwICAgLyogSGFuZHNoYWtlIE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfRUNPVU5UICAweGZmYzA0NTU0ICAgLyogSGFuZHNoYWtlIE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUExX0JDT1VOVCAgMHhmZmMwNDU1OCAgIC8qIEhhbmRzaGFrZSBNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvbW0vZmF1bHQuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS9mYXVsdC5jCmluZGV4IDA4N2EyMDkuLmVkNjA1ODggMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS9mYXVsdC5jCkBAIC04MCw4ICs4MCw3IEBACiAJICogZG9fcGFnZV9mYXVsdCBtYXkgaGF2ZSBmbHVzaGVkIHRoZSBUTEIgc28gd2UgaGF2ZSB0byByZXN0b3JlCiAJICogdGhlIE1NVSByZWdpc3RlcnMuCiAJICovCi0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcG1kID0gKHBtZF90ICopKHBnZCArIHBnZF9pbmRleChhZGRyZXNzKSk7CiAJaWYgKHBtZF9ub25lKCpwbWQpKQogCQlnb3RvIGV4aXQ7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvbW0vdGxiLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAvbW0vdGxiLmMKaW5kZXggNGE0OTZlNC4uMjFkNzhjNSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL21tL3RsYi5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS90bGIuYwpAQCAtMTM0LDI4ICsxMzQsNiBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotLyogZHVtcCB0aGUgZW50aXJlIFRMQiBmb3IgZGVidWcgcHVycG9zZXMgKi8KLQotI2lmIDAKLXZvaWQKLWR1bXBfdGxiX2FsbCh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwcmludGsoIlRMQiBkdW1wLiBMTyBpczogcGZuIHwgcmVzZXJ2ZWQgfCBnbG9iYWwgfCB2YWxpZCB8IGtlcm5lbCB8IHdlICB8XG4iKTsKLQotCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JZm9yKGkgPSAwOyBpIDwgTlVNX1RMQl9FTlRSSUVTOyBpKyspIHsKLQkJKlJfVExCX1NFTEVDVCA9ICggSU9fRklFTEQoUl9UTEJfU0VMRUNULCBpbmRleCwgaSkgKTsKLQkJcHJpbnRrKCJFbnRyeSAlZDogSEkgMHglMDhseCwgTE8gMHglMDhseFxuIiwKLQkJICAgICAgIGksICpSX1RMQl9ISSwgKlJfVExCX0xPKTsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotI2VuZGlmCi0KIC8qCiAgKiBJbml0aWFsaXplIHRoZSBjb250ZXh0IHJlbGF0ZWQgaW5mbyBmb3IgYSBuZXcgbW1fc3RydWN0CiAgKiBpbnN0YW5jZS4KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9tbS9mYXVsdC5jIGIvYXJjaC9jcmlzL21tL2ZhdWx0LmMKaW5kZXggNGE3Y2RkOS4uMzgwZGYxYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9jcmlzL21tL2ZhdWx0LmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCS8qIEFyZSB3ZSBwcmVwYXJlZCB0byBoYW5kbGUgdGhpcyBrZXJuZWwgZmF1bHQ/CiAJICoKIAkgKiAoVGhlIGtlcm5lbCBoYXMgdmFsaWQgZXhjZXB0aW9uLXBvaW50cyBpbiB0aGUgc291cmNlCi0JICogIHdoZW4gaXQgYWNlc3NlcyB1c2VyLW1lbW9yeS4gV2hlbiBpdCBmYWlscyBpbiBvbmUKKwkgKiAgd2hlbiBpdCBhY2Nlc3NlcyB1c2VyLW1lbW9yeS4gV2hlbiBpdCBmYWlscyBpbiBvbmUKIAkgKiAgb2YgdGhvc2UgcG9pbnRzLCB3ZSBmaW5kIGl0IGluIGEgdGFibGUgYW5kIGRvIGEganVtcAogCSAqICB0byBzb21lIGZpeHVwIGNvZGUgdGhhdCBsb2FkcyBhbiBhcHByb3ByaWF0ZSBlcnJvcgogCSAqICBjb2RlKQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvZnJ2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOTA0MjU1OS4uMjFkMGZkMSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yNTUsMTUgKzI1NSwxMiBAQAogCWludCBlcnJvcjsKIAljaGFyICogZmlsZW5hbWU7CiAKLQlsb2NrX2tlcm5lbCgpOwogCWZpbGVuYW1lID0gZ2V0bmFtZShuYW1lKTsKIAllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOwogCWlmIChJU19FUlIoZmlsZW5hbWUpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIGVycm9yOwogCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCBhcmd2LCBlbnZwLCBfX2ZyYW1lKTsKIAlwdXRuYW1lKGZpbGVuYW1lKTsKLSBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGUyZjMzZDAuLmJkODgzZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIxOCwxNSArMjE4LDEyIEBACiAJY2hhciAqIGZpbGVuYW1lOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgY2hhciAqKSZkdW1teS00KTsKIAotCWxvY2tfa2VybmVsKCk7CiAJZmlsZW5hbWUgPSBnZXRuYW1lKG5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CiAJaWYgKElTX0VSUihmaWxlbmFtZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyb3I7CiAJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIGFyZ3YsIGVudnAsIHJlZ3MpOwogCXB1dG5hbWUoZmlsZW5hbWUpOwotb3V0OgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCmluZGV4IDY3NGE4MzcuLmYzMzJlM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwpAQCAtMTM4MSw3ICsxMzgxLDcgQEAKICNlbmRpZgogCiAJCQkvKgotCQkJKiogTm90IHZpcnR1YWxseSBjb250aWdvdXMuCisJCQkqKiBOb3QgdmlydHVhbGx5IGNvbnRpZ3VvdXMuCiAJCQkqKiBUZXJtaW5hdGUgcHJldiBjaHVuay4KIAkJCSoqIFN0YXJ0IGEgbmV3IGNodW5rLgogCQkJKioKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUwppbmRleCAxMGMzNzUxLi4yZmQ3NDc5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCkBAIC03OSw3ICs3OSw3IEBACiAocDYpCWJyLmNvbmQuc3BudCAuaWEzMl9zdHJhY2VfY2hlY2tfcmV0dmFsCiAJOzsJCQkJCS8vIHByZXZlbnQgUkFXIG9uIHI4CiBFTkQoaWEzMl9yZXRfZnJvbV9jbG9uZSkKLQkvLyBmYWxsIHRocnVnaAorCS8vIGZhbGwgdGhyb3VnaAogR0xPQkFMX0VOVFJZKGlhMzJfcmV0X2Zyb21fc3lzY2FsbCkKIAlQVF9SRUdTX1VOV0lORF9JTkZPKDApCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wZXJmbW9uX2RlZmF1bHRfc21wbC5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BlcmZtb25fZGVmYXVsdF9zbXBsLmgKaW5kZXggNDg4MjJjMC4uNzQ3MjRiMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BlcmZtb25fZGVmYXVsdF9zbXBsLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BlcmZtb25fZGVmYXVsdF9zbXBsLmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgICAgdW5zaWduZWQgbG9uZyAgIGlwOyAgICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIGRpZCB0aGUgb3ZlcmZsb3cgaW50ZXJydXB0IGhhcHBlbmVkICAqLwogICAgICAgICB1bnNpZ25lZCBsb25nICAgdHN0YW1wOyAgICAgICAgICAgICAgICAgLyogYXIuaXRjIHdoZW4gZW50ZXJpbmcgcGVyZm1vbiBpbnRyLiBoYW5kbGVyICovCiAKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIGNwdTsgICAgICAgICAgICAgICAgICAgIC8qIGNwdSBvbiB3aGljaCB0aGUgb3ZlcmZvdyBvY2N1cmVkICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICBjcHU7ICAgICAgICAgICAgICAgICAgICAvKiBjcHUgb24gd2hpY2ggdGhlIG92ZXJmbG93IG9jY3VyZWQgKi8KICAgICAgICAgdW5zaWduZWQgc2hvcnQgIHNldDsgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW50IHNldCBhY3RpdmUgd2hlbiBvdmVyZmxvdyBvY3VycmVkICAgKi8KICAgICAgICAgaW50ICAgIAkJdGdpZDsgICAgICAgICAgICAgIAkvKiB0aHJlYWQgZ3JvdXAgaWQgKGZvciBOUFRMLCB0aGlzIGlzIGdldHBpZCgpKSAqLwogfSBwZm1fZGVmYXVsdF9zbXBsX2VudHJ5X3Q7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc24vc2h1YmlvLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc24vc2h1YmlvLmgKaW5kZXggMjJhNmYxOC4uNjA1MjQyMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NuL3NodWJpby5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zbi9zaHViaW8uaApAQCAtMzI4OSw3ICszMjg5LDcgQEAKICNkZWZpbmUgSUlPX0lJRFNSX0xWTF9TSElGVCAgICAgMAogI2RlZmluZSBJSU9fSUlEU1JfTFZMX01BU0sgICAgICAweDAwMDAwMGZmCiAKLS8qIFh0YWxrIHRpbWVvdXQgdGhyZXNoaG9sZCByZWdpc3RlciAoSUlPX0lYVFQpICovCisvKiBYdGFsayB0aW1lb3V0IHRocmVzaG9sZCByZWdpc3RlciAoSUlPX0lYVFQpICovCiAjZGVmaW5lIElYVFRfUlJTUF9UT19TSEZUCTU1CS8qIHJlYWQgcmVzcG9uc2UgdGltZW91dCAqLwogI2RlZmluZSBJWFRUX1JSU1BfVE9fTUFTSwkoMHgxRlVMTCA8PCBJWFRUX1JSU1BfVE9fU0hGVCkKICNkZWZpbmUgSVhUVF9SUlNQX1BTX1NIRlQJMzIJLyogcmVhZCByZXNwb25zZWQgVE8gcHJlc2NhbGFyICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggOWM3MmUzNi4uMTBhOGYyMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMzExLDcgKzMxMSw3IEBACiAjZGVmaW5lIF9fTlJfcHJlYWR2CQkJMTMxOQogI2RlZmluZSBfX05SX3B3cml0ZXYJCQkxMzIwCiAjZGVmaW5lIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8JCTEzMjEKLSNkZWZpbmUgX19OUl9ydF9yZWN2bW1zZwkJMTMyMgorI2RlZmluZSBfX05SX3JlY3ZtbXNnCQkJMTMyMgogCiAjaWZkZWYgX19LRVJORUxfXwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VzaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9lc2kuYwppbmRleCBkNTc2NGEzLi5iMDkxMTExIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VzaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZXNpLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkJICAgICAgY2FzZSBFU0lfREVTQ19FTlRSWV9QT0lOVDoKIAkJCWJyZWFrOwogCQkgICAgICBkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5rb3duIHRhYmxlIHR5cGUgJWQgZm91bmQgaW4gIgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5rbm93biB0YWJsZSB0eXBlICVkIGZvdW5kIGluICIKIAkJCSAgICAgICAiRVNJIHRhYmxlLCBpZ25vcmluZyByZXN0IG9mIHRhYmxlXG4iLCAqcCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCA0MDI2OThiLi41OTliMjMzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtMzUxNyw3ICszNTE3LDcgQEAKICAqIElBNjRfVEhSRUFEX0RCR19WQUxJRCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgdGFzayB3aGljaCB3YXMKICAqIGFibGUgdG8gdXNlIHRoZSBkZWJ1ZyByZWdpc3RlcnMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB2aWEKICAqIHB0cmFjZSgpLiBUaGVyZWZvcmUgd2Uga25vdyBpdCB3YXMgbm90IHVzaW5nIHRoZW0gZm9yCi0gKiBwZXJmbW9ybWFuY2UgbW9uaXRvcmluZywgc28gd2Ugb25seSBkZWNyZW1lbnQgdGhlIG51bWJlcgorICogcGVyZm9ybWFuY2UgbW9uaXRvcmluZywgc28gd2Ugb25seSBkZWNyZW1lbnQgdGhlIG51bWJlcgogICogb2YgInB0cmFjZWQiIGRlYnVnIHJlZ2lzdGVyIHVzZXJzIHRvIGtlZXAgdGhlIGNvdW50IHVwIHRvIGRhdGUKICAqLwogaW50CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYwppbmRleCBmZDUwZmY5Li42NmY2MzNiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMKQEAgLTM5MCw3ICszOTAsNyBAQAogCXBjaWRldl9tYXRjaC5oYW5kbGUgPSBOVUxMOwogCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCByb290YnVzX2hhbmRsZSwgQUNQSV9VSU5UMzJfTUFYLAotCQkJICAgIGZpbmRfbWF0Y2hpbmdfZGV2aWNlLCAmcGNpZGV2X21hdGNoLCBOVUxMKTsKKwkJCSAgICBmaW5kX21hdGNoaW5nX2RldmljZSwgTlVMTCwgJnBjaWRldl9tYXRjaCwgTlVMTCk7CiAKIAlpZiAoIXBjaWRldl9tYXRjaC5oYW5kbGUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaWZwc3AwNjAvc3JjL2Zwc3AuUyBiL2FyY2gvbTY4ay9pZnBzcDA2MC9zcmMvZnBzcC5TCmluZGV4IDZjMWE5YTIuLjczNjEzYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pZnBzcDA2MC9zcmMvZnBzcC5TCisrKyBiL2FyY2gvbTY4ay9pZnBzcDA2MC9zcmMvZnBzcC5TCkBAIC03NTMsNyArNzUzLDcgQEAKIAogCWJyYS5sCQlfcmVhbF9vdmZsCiAKLSMgb3ZlcmZsb3cgb2NjdXJyZWQgYnV0IGlzIGRpc2FibGVkLiBtZWFud2hpbGUsIGluZXhhY3QgaXMgZW5hYmxlZC4gdGhlcmVmb3JlLAorIyBvdmVyZmxvdyBvY2N1cnJlZCBidXQgaXMgZGlzYWJsZWQuIG1lYW53aGlsZSwgaW5leGFjdCBpcyBlbmFibGVkLiBUaGVyZWZvcmUsCiAjIHdlIG11c3QganVtcCB0byByZWFsX2luZXgoKS4KIGZvdmZsX2luZXhfb246CiAKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAKIAlicmEubAkJX3JlYWxfdW5mbAogCi0jIHVuZGVmbG93IG9jY3VycmVkIGJ1dCBpcyBkaXNhYmxlZC4gbWVhbndoaWxlLCBpbmV4YWN0IGlzIGVuYWJsZWQuIHRoZXJlZm9yZSwKKyMgdW5kZXJmbG93IG9jY3VycmVkIGJ1dCBpcyBkaXNhYmxlZC4gbWVhbndoaWxlLCBpbmV4YWN0IGlzIGVuYWJsZWQuIFRoZXJlZm9yZSwKICMgd2UgbXVzdCBqdW1wIHRvIHJlYWxfaW5leCgpLgogZnVuZmxfaW5leF9vbjoKIApAQCAtMjk2Myw3ICsyOTYzLDcgQEAKIAogCXRzdC53CQklZDAJCQkjIGlzIGluc3RyIGZtb3ZtPwogCWJtaS5iCQlpZWFfZGlzX2Ztb3ZtCQkjIHllcwotIyBpbnN0cnVjdGlvbiBpcyB1c2luZyBhbiBleHRlbmRlZCBwcmVjaXNpb24gaW1tZWRpYXRlIG9wZXJhbmQuIHRoZXJlZm9yZSwKKyMgaW5zdHJ1Y3Rpb24gaXMgdXNpbmcgYW4gZXh0ZW5kZWQgcHJlY2lzaW9uIGltbWVkaWF0ZSBvcGVyYW5kLiBUaGVyZWZvcmUsCiAjIHRoZSB0b3RhbCBpbnN0cnVjdGlvbiBsZW5ndGggaXMgMTYgYnl0ZXMuCiBpZWFfZGlzX2ltbWVkOgogCW1vdi5sCQkmMHgxMCwlZDAJCSMgMTYgYnl0ZXMgb2YgaW5zdHJ1Y3Rpb24KQEAgLTk2MjQsNyArOTYyNCw3IEBACiAJYmdlLmIJCXNva19ub3JtMgkJIyB0aGFuayBnb29kbmVzcyBubwogCiAjIHRoZSBtdWx0aXBseSBmYWN0b3IgdGhhdCB3ZSdyZSB0cnlpbmcgdG8gY3JlYXRlIHNob3VsZCBiZSBhIGRlbm9ybQotIyBmb3IgdGhlIG11bHRpcGx5IHRvIHdvcmsuIHRoZXJlZm9yZSwgd2UncmUgZ29pbmcgdG8gYWN0dWFsbHkgZG8gYQorIyBmb3IgdGhlIG11bHRpcGx5IHRvIHdvcmsuIFRoZXJlZm9yZSwgd2UncmUgZ29pbmcgdG8gYWN0dWFsbHkgZG8gYQogIyBtdWx0aXBseSB3aXRoIGEgZGVub3JtIHdoaWNoIHdpbGwgY2F1c2UgYW4gdW5pbXBsZW1lbnRlZCBkYXRhIHR5cGUKICMgZXhjZXB0aW9uIHRvIGJlIHB1dCBpbnRvIHRoZSBtYWNoaW5lIHdoaWNoIHdpbGwgYmUgY2F1Z2h0IGFuZCBjb3JyZWN0ZWQKICMgbGF0ZXIuIHdlIGRvbid0IGRvIHRoaXMgd2l0aCB0aGUgREVOT1JNcyBhYm92ZSBiZWNhdXNlIHRoaXMgbWV0aG9kCkBAIC0xMjIxNiw3ICsxMjIxNiw3IEBACiAKICMKICMgb3BlcmFuZCB3aWxsIHVuZGVyZmxvdyBBTkQgdW5kZXJmbG93IG9yIGluZXhhY3QgaXMgZW5hYmxlZC4KLSMgdGhlcmVmb3JlLCB3ZSBtdXN0IHJldHVybiB0aGUgcmVzdWx0IHJvdW5kZWQgdG8gZXh0ZW5kZWQgcHJlY2lzaW9uLgorIyBUaGVyZWZvcmUsIHdlIG11c3QgcmV0dXJuIHRoZSByZXN1bHQgcm91bmRlZCB0byBleHRlbmRlZCBwcmVjaXNpb24uCiAjCiBmaW5fc2RfdW5mbF9lbmE6CiAJbW92LmwJCUZQX1NDUjBfSEkoJWE2KSxGUF9TQ1IxX0hJKCVhNikKQEAgLTEyNzQ2LDcgKzEyNzQ2LDcgQEAKIAogIwogIyBUaGUgZGVzdGluYXRpb24gd2FzIEluIFJhbmdlIGFuZCB0aGUgc291cmNlIHdhcyBhIFpFUk8uIFRoZSByZXN1bHQsCi0jIHRoZXJlZm9yZSwgaXMgYW4gSU5GIHcvIHRoZSBwcm9wZXIgc2lnbi4KKyMgVGhlcmVmb3JlLCBpcyBhbiBJTkYgdy8gdGhlIHByb3BlciBzaWduLgogIyBTbywgZGV0ZXJtaW5lIHRoZSBzaWduIGFuZCByZXR1cm4gYSBuZXcgSU5GICh3LyB0aGUgai1iaXQgY2xlYXJlZCkuCiAjCiAJZ2xvYmFsCQlmZGl2X2luZl9sb2FkCQkjIGdsb2JhbCBmb3IgZnNnbGRpdgpAQCAtMTI5OTYsNyArMTI5OTYsNyBAQAogCiAjCiAjIG9wZXJhbmQgd2lsbCB1bmRlcmZsb3cgQU5EIHVuZGVyZmxvdyBpcyBlbmFibGVkLgotIyB0aGVyZWZvcmUsIHdlIG11c3QgcmV0dXJuIHRoZSByZXN1bHQgcm91bmRlZCB0byBleHRlbmRlZCBwcmVjaXNpb24uCisjIFRoZXJlZm9yZSwgd2UgbXVzdCByZXR1cm4gdGhlIHJlc3VsdCByb3VuZGVkIHRvIGV4dGVuZGVkIHByZWNpc2lvbi4KICMKIGZuZWdfc2RfdW5mbF9lbmE6CiAJbW92LmwJCUZQX1NDUjBfSEkoJWE2KSxGUF9TQ1IxX0hJKCVhNikKQEAgLTEzNjExLDcgKzEzNjExLDcgQEAKIAogIwogIyBvcGVyYW5kIHdpbGwgdW5kZXJmbG93IEFORCB1bmRlcmZsb3cgaXMgZW5hYmxlZC4KLSMgdGhlcmVmb3JlLCB3ZSBtdXN0IHJldHVybiB0aGUgcmVzdWx0IHJvdW5kZWQgdG8gZXh0ZW5kZWQgcHJlY2lzaW9uLgorIyBUaGVyZWZvcmUsIHdlIG11c3QgcmV0dXJuIHRoZSByZXN1bHQgcm91bmRlZCB0byBleHRlbmRlZCBwcmVjaXNpb24uCiAjCiBmYWJzX3NkX3VuZmxfZW5hOgogCW1vdi5sCQlGUF9TQ1IwX0hJKCVhNiksRlBfU0NSMV9ISSglYTYpCkBAIC0xNDk3Myw3ICsxNDk3Myw3IEBACiAKICMKICMgdGhlIFpFUk9lcyBoYXZlIG9wcG9zaXRlIHNpZ25zOgotIyAtIHRoZXJlZm9yZSwgd2UgcmV0dXJuICtaRVJPIGlmIHRoZSByb3VuZGluZyBtb2RlcyBhcmUgUk4sUlosIG9yIFJQLgorIyAtIFRoZXJlZm9yZSwgd2UgcmV0dXJuICtaRVJPIGlmIHRoZSByb3VuZGluZyBtb2RlcyBhcmUgUk4sUlosIG9yIFJQLgogIyAtIC1aRVJPIGlzIHJldHVybmVkIGluIHRoZSBjYXNlIG9mIFJNLgogIwogZmFkZF96ZXJvXzJfY2hrX3JtOgpAQCAtMTU0MjUsNyArMTU0MjUsNyBAQAogCiAjCiAjIHRoZSBaRVJPZXMgaGF2ZSB0aGUgc2FtZSBzaWduczoKLSMgLSB0aGVyZWZvcmUsIHdlIHJldHVybiArWkVSTyBpZiB0aGUgcm91bmRpbmcgbW9kZSBpcyBSTixSWiwgb3IgUlAKKyMgLSBUaGVyZWZvcmUsIHdlIHJldHVybiArWkVSTyBpZiB0aGUgcm91bmRpbmcgbW9kZSBpcyBSTixSWiwgb3IgUlAKICMgLSAtWkVSTyBpcyByZXR1cm5lZCBpbiB0aGUgY2FzZSBvZiBSTS4KICMKIGZzdWJfemVyb18yX2Noa19ybToKQEAgLTE1NjkzLDcgKzE1NjkzLDcgQEAKIAogIwogIyBvcGVyYW5kIHdpbGwgdW5kZXJmbG93IEFORCB1bmRlcmZsb3cgaXMgZW5hYmxlZC4KLSMgdGhlcmVmb3JlLCB3ZSBtdXN0IHJldHVybiB0aGUgcmVzdWx0IHJvdW5kZWQgdG8gZXh0ZW5kZWQgcHJlY2lzaW9uLgorIyBUaGVyZWZvcmUsIHdlIG11c3QgcmV0dXJuIHRoZSByZXN1bHQgcm91bmRlZCB0byBleHRlbmRlZCBwcmVjaXNpb24uCiAjCiBmc3FydF9zZF91bmZsX2VuYToKIAltb3YubAkJRlBfU0NSMF9ISSglYTYpLEZQX1NDUjFfSEkoJWE2KQpAQCAtMjEwMDAsNyArMjEwMDAsNyBAQAogCXRzdC5sCQklZDAKIAlibmUuYgkJZm91dF9wYWNrX3NldAogIyAibWFudGlzc2EiIGlzIGFsbCB6ZXJvIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFuc3dlciBpcyB6ZXJvLiBidXQsIHRoZSAnMDQwCi0jIGFsZ29yaXRobSBhbGxvd3MgdGhlIGV4cG9uZW50IHRvIGJlIG5vbi16ZXJvLiB0aGUgODgxLzIgZG8gbm90LiB0aGVyZWZvcmUsCisjIGFsZ29yaXRobSBhbGxvd3MgdGhlIGV4cG9uZW50IHRvIGJlIG5vbi16ZXJvLiB0aGUgODgxLzIgZG8gbm90LiBUaGVyZWZvcmUsCiAjIGlmIHRoZSBtYW50aXNzYSBpcyB6ZXJvLCBJIHdpbGwgemVybyB0aGUgZXhwb25lbnQsIHRvby4KICMgdGhlIHF1ZXN0aW9uIG5vdyBpcyB3aGV0aGVyIHRoZSBleHBvbmVudHMgc2lnbiBiaXQgaXMgYWxsb3dlZCB0byBiZSBub24temVybwogIyBmb3IgYSB6ZXJvLCBhbHNvLi4uCkBAIC0yMTc0Myw3ICsyMTc0Myw3IEBACiAJcnRzCiAKICMJCQkJCQkJCQkjCi0jIGRucm1fbHAoKTogbm9ybWFsaXplIGV4cG9uZW50L21hbnRpc3NhIHRvIHNwZWNpZmllZCB0aHJlc2hob2xkCSMKKyMgZG5ybV9scCgpOiBub3JtYWxpemUgZXhwb25lbnQvbWFudGlzc2EgdG8gc3BlY2lmaWVkIHRocmVzaG9sZAkJIwogIwkJCQkJCQkJCSMKICMgSU5QVVQ6CQkJCQkJCQkjCiAjCSVhMAkgICA6IHBvaW50cyB0byB0aGUgb3BlcmFuZCB0byBiZSBkZW5vcm1hbGl6ZWQJCSMKQEAgLTIyNDAyLDcgKzIyNDAyLDcgQEAKIAliZ3QuYgkJdW5ub3JtX25ybV96ZXJvCQkjIHllczsgZGVub3JtIG9ubHkgdW50aWwgZXhwID0gMAogCiAjCi0jIGV4cG9uZW50IHdvdWxkIG5vdCBnbyA8IDAuIHRoZXJlZm9yZSwgbnVtYmVyIHN0YXlzIG5vcm1hbGl6ZWQKKyMgZXhwb25lbnQgd291bGQgbm90IGdvIDwgMC4gVGhlcmVmb3JlLCBudW1iZXIgc3RheXMgbm9ybWFsaXplZAogIwogCXN1Yi53CQklZDAsICVkMQkJIyBzaGlmdCBleHBvbmVudCB2YWx1ZQogCW1vdi53CQlGVEVNUF9FWCglYTApLCAlZDAJIyBsb2FkIG9sZCBleHBvbmVudApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2lmcHNwMDYwL3NyYy9wZnBzcC5TIGIvYXJjaC9tNjhrL2lmcHNwMDYwL3NyYy9wZnBzcC5TCmluZGV4IDUxYjlmN2QuLmU3MWJhMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pZnBzcDA2MC9zcmMvcGZwc3AuUworKysgYi9hcmNoL202OGsvaWZwc3AwNjAvc3JjL3BmcHNwLlMKQEAgLTc1Miw3ICs3NTIsNyBAQAogCiAJYnJhLmwJCV9yZWFsX292ZmwKIAotIyBvdmVyZmxvdyBvY2N1cnJlZCBidXQgaXMgZGlzYWJsZWQuIG1lYW53aGlsZSwgaW5leGFjdCBpcyBlbmFibGVkLiB0aGVyZWZvcmUsCisjIG92ZXJmbG93IG9jY3VycmVkIGJ1dCBpcyBkaXNhYmxlZC4gbWVhbndoaWxlLCBpbmV4YWN0IGlzIGVuYWJsZWQuIFRoZXJlZm9yZSwKICMgd2UgbXVzdCBqdW1wIHRvIHJlYWxfaW5leCgpLgogZm92ZmxfaW5leF9vbjoKIApAQCAtMTAxNCw3ICsxMDE0LDcgQEAKIAogCWJyYS5sCQlfcmVhbF91bmZsCiAKLSMgdW5kZWZsb3cgb2NjdXJyZWQgYnV0IGlzIGRpc2FibGVkLiBtZWFud2hpbGUsIGluZXhhY3QgaXMgZW5hYmxlZC4gdGhlcmVmb3JlLAorIyB1bmRlcmZsb3cgb2NjdXJyZWQgYnV0IGlzIGRpc2FibGVkLiBtZWFud2hpbGUsIGluZXhhY3QgaXMgZW5hYmxlZC4gVGhlcmVmb3JlLAogIyB3ZSBtdXN0IGp1bXAgdG8gcmVhbF9pbmV4KCkuCiBmdW5mbF9pbmV4X29uOgogCkBAIC0yOTYyLDcgKzI5NjIsNyBAQAogCiAJdHN0LncJCSVkMAkJCSMgaXMgaW5zdHIgZm1vdm0/CiAJYm1pLmIJCWllYV9kaXNfZm1vdm0JCSMgeWVzCi0jIGluc3RydWN0aW9uIGlzIHVzaW5nIGFuIGV4dGVuZGVkIHByZWNpc2lvbiBpbW1lZGlhdGUgb3BlcmFuZC4gdGhlcmVmb3JlLAorIyBpbnN0cnVjdGlvbiBpcyB1c2luZyBhbiBleHRlbmRlZCBwcmVjaXNpb24gaW1tZWRpYXRlIG9wZXJhbmQuIFRoZXJlZm9yZSwKICMgdGhlIHRvdGFsIGluc3RydWN0aW9uIGxlbmd0aCBpcyAxNiBieXRlcy4KIGllYV9kaXNfaW1tZWQ6CiAJbW92LmwJCSYweDEwLCVkMAkJIyAxNiBieXRlcyBvZiBpbnN0cnVjdGlvbgpAQCAtNTg2NSw3ICs1ODY1LDcgQEAKIAlydHMKIAogIwkJCQkJCQkJCSMKLSMgZG5ybV9scCgpOiBub3JtYWxpemUgZXhwb25lbnQvbWFudGlzc2EgdG8gc3BlY2lmaWVkIHRocmVzaGhvbGQJIworIyBkbnJtX2xwKCk6IG5vcm1hbGl6ZSBleHBvbmVudC9tYW50aXNzYSB0byBzcGVjaWZpZWQgdGhyZXNob2xkCQkjCiAjCQkJCQkJCQkJIwogIyBJTlBVVDoJCQkJCQkJCSMKICMJJWEwCSAgIDogcG9pbnRzIHRvIHRoZSBvcGVyYW5kIHRvIGJlIGRlbm9ybWFsaXplZAkJIwpAQCAtNjUyNCw3ICs2NTI0LDcgQEAKIAliZ3QuYgkJdW5ub3JtX25ybV96ZXJvCQkjIHllczsgZGVub3JtIG9ubHkgdW50aWwgZXhwID0gMAogCiAjCi0jIGV4cG9uZW50IHdvdWxkIG5vdCBnbyA8IDAuIHRoZXJlZm9yZSwgbnVtYmVyIHN0YXlzIG5vcm1hbGl6ZWQKKyMgZXhwb25lbnQgd291bGQgbm90IGdvIDwgMC4gVGhlcmVmb3JlLCBudW1iZXIgc3RheXMgbm9ybWFsaXplZAogIwogCXN1Yi53CQklZDAsICVkMQkJIyBzaGlmdCBleHBvbmVudCB2YWx1ZQogCW1vdi53CQlGVEVNUF9FWCglYTApLCAlZDAJIyBsb2FkIG9sZCBleHBvbmVudApAQCAtNzkwMSw3ICs3OTAxLDcgQEAKIAl0c3QubAkJJWQwCiAJYm5lLmIJCWZvdXRfcGFja19zZXQKICMgIm1hbnRpc3NhIiBpcyBhbGwgemVybyB3aGljaCBtZWFucyB0aGF0IHRoZSBhbnN3ZXIgaXMgemVyby4gYnV0LCB0aGUgJzA0MAotIyBhbGdvcml0aG0gYWxsb3dzIHRoZSBleHBvbmVudCB0byBiZSBub24temVyby4gdGhlIDg4MS8yIGRvIG5vdC4gdGhlcmVmb3JlLAorIyBhbGdvcml0aG0gYWxsb3dzIHRoZSBleHBvbmVudCB0byBiZSBub24temVyby4gdGhlIDg4MS8yIGRvIG5vdC4gVGhlcmVmb3JlLAogIyBpZiB0aGUgbWFudGlzc2EgaXMgemVybywgSSB3aWxsIHplcm8gdGhlIGV4cG9uZW50LCB0b28uCiAjIHRoZSBxdWVzdGlvbiBub3cgaXMgd2hldGhlciB0aGUgZXhwb25lbnRzIHNpZ24gYml0IGlzIGFsbG93ZWQgdG8gYmUgbm9uLXplcm8KICMgZm9yIGEgemVybywgYWxzby4uLgpAQCAtODY0Nyw3ICs4NjQ3LDcgQEAKIAogIwogIyBvcGVyYW5kIHdpbGwgdW5kZXJmbG93IEFORCB1bmRlcmZsb3cgb3IgaW5leGFjdCBpcyBlbmFibGVkLgotIyB0aGVyZWZvcmUsIHdlIG11c3QgcmV0dXJuIHRoZSByZXN1bHQgcm91bmRlZCB0byBleHRlbmRlZCBwcmVjaXNpb24uCisjIFRoZXJlZm9yZSwgd2UgbXVzdCByZXR1cm4gdGhlIHJlc3VsdCByb3VuZGVkIHRvIGV4dGVuZGVkIHByZWNpc2lvbi4KICMKIGZpbl9zZF91bmZsX2VuYToKIAltb3YubAkJRlBfU0NSMF9ISSglYTYpLEZQX1NDUjFfSEkoJWE2KQpAQCAtOTE3Nyw3ICs5MTc3LDcgQEAKIAogIwogIyBUaGUgZGVzdGluYXRpb24gd2FzIEluIFJhbmdlIGFuZCB0aGUgc291cmNlIHdhcyBhIFpFUk8uIFRoZSByZXN1bHQsCi0jIHRoZXJlZm9yZSwgaXMgYW4gSU5GIHcvIHRoZSBwcm9wZXIgc2lnbi4KKyMgVGhlcmVmb3JlLCBpcyBhbiBJTkYgdy8gdGhlIHByb3BlciBzaWduLgogIyBTbywgZGV0ZXJtaW5lIHRoZSBzaWduIGFuZCByZXR1cm4gYSBuZXcgSU5GICh3LyB0aGUgai1iaXQgY2xlYXJlZCkuCiAjCiAJZ2xvYmFsCQlmZGl2X2luZl9sb2FkCQkjIGdsb2JhbCBmb3IgZnNnbGRpdgpAQCAtOTQyNyw3ICs5NDI3LDcgQEAKIAogIwogIyBvcGVyYW5kIHdpbGwgdW5kZXJmbG93IEFORCB1bmRlcmZsb3cgaXMgZW5hYmxlZC4KLSMgdGhlcmVmb3JlLCB3ZSBtdXN0IHJldHVybiB0aGUgcmVzdWx0IHJvdW5kZWQgdG8gZXh0ZW5kZWQgcHJlY2lzaW9uLgorIyBUaGVyZWZvcmUsIHdlIG11c3QgcmV0dXJuIHRoZSByZXN1bHQgcm91bmRlZCB0byBleHRlbmRlZCBwcmVjaXNpb24uCiAjCiBmbmVnX3NkX3VuZmxfZW5hOgogCW1vdi5sCQlGUF9TQ1IwX0hJKCVhNiksRlBfU0NSMV9ISSglYTYpCkBAIC0xMDA0Miw3ICsxMDA0Miw3IEBACiAKICMKICMgb3BlcmFuZCB3aWxsIHVuZGVyZmxvdyBBTkQgdW5kZXJmbG93IGlzIGVuYWJsZWQuCi0jIHRoZXJlZm9yZSwgd2UgbXVzdCByZXR1cm4gdGhlIHJlc3VsdCByb3VuZGVkIHRvIGV4dGVuZGVkIHByZWNpc2lvbi4KKyMgVGhlcmVmb3JlLCB3ZSBtdXN0IHJldHVybiB0aGUgcmVzdWx0IHJvdW5kZWQgdG8gZXh0ZW5kZWQgcHJlY2lzaW9uLgogIwogZmFic19zZF91bmZsX2VuYToKIAltb3YubAkJRlBfU0NSMF9ISSglYTYpLEZQX1NDUjFfSEkoJWE2KQpAQCAtMTE0MDQsNyArMTE0MDQsNyBAQAogCiAjCiAjIHRoZSBaRVJPZXMgaGF2ZSBvcHBvc2l0ZSBzaWduczoKLSMgLSB0aGVyZWZvcmUsIHdlIHJldHVybiArWkVSTyBpZiB0aGUgcm91bmRpbmcgbW9kZXMgYXJlIFJOLFJaLCBvciBSUC4KKyMgLSBUaGVyZWZvcmUsIHdlIHJldHVybiArWkVSTyBpZiB0aGUgcm91bmRpbmcgbW9kZXMgYXJlIFJOLFJaLCBvciBSUC4KICMgLSAtWkVSTyBpcyByZXR1cm5lZCBpbiB0aGUgY2FzZSBvZiBSTS4KICMKIGZhZGRfemVyb18yX2Noa19ybToKQEAgLTExODU2LDcgKzExODU2LDcgQEAKIAogIwogIyB0aGUgWkVST2VzIGhhdmUgdGhlIHNhbWUgc2lnbnM6Ci0jIC0gdGhlcmVmb3JlLCB3ZSByZXR1cm4gK1pFUk8gaWYgdGhlIHJvdW5kaW5nIG1vZGUgaXMgUk4sUlosIG9yIFJQCisjIC0gVGhlcmVmb3JlLCB3ZSByZXR1cm4gK1pFUk8gaWYgdGhlIHJvdW5kaW5nIG1vZGUgaXMgUk4sUlosIG9yIFJQCiAjIC0gLVpFUk8gaXMgcmV0dXJuZWQgaW4gdGhlIGNhc2Ugb2YgUk0uCiAjCiBmc3ViX3plcm9fMl9jaGtfcm06CkBAIC0xMjEyNCw3ICsxMjEyNCw3IEBACiAKICMKICMgb3BlcmFuZCB3aWxsIHVuZGVyZmxvdyBBTkQgdW5kZXJmbG93IGlzIGVuYWJsZWQuCi0jIHRoZXJlZm9yZSwgd2UgbXVzdCByZXR1cm4gdGhlIHJlc3VsdCByb3VuZGVkIHRvIGV4dGVuZGVkIHByZWNpc2lvbi4KKyMgVGhlcmVmb3JlLCB3ZSBtdXN0IHJldHVybiB0aGUgcmVzdWx0IHJvdW5kZWQgdG8gZXh0ZW5kZWQgcHJlY2lzaW9uLgogIwogZnNxcnRfc2RfdW5mbF9lbmE6CiAJbW92LmwJCUZQX1NDUjBfSEkoJWE2KSxGUF9TQ1IxX0hJKCVhNikKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9ib290aW5mby5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmgKaW5kZXggZmI4YTA2Yi4uNjdlN2E3OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmgKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAgICAgLyoKICAgICAgKiAgTWFjaW50b3NoIGhhcmR3YXJlIHByb2ZpbGUgZGF0YSAtIHVudXNlZCwgc2VlIG1hY2ludG9zaC5oIGZvcgotICAgICAqICByZXNvbmFibGUgdHlwZSB2YWx1ZXMKKyAgICAgKiAgcmVhc29uYWJsZSB0eXBlIHZhbHVlcwogICAgICAqLwogCiAjZGVmaW5lIEJJX01BQ19WSUExQkFTRQkJMHg4MDEwCS8qIE1hYyBWSUExIGJhc2UgYWRkcmVzcyAoYWx3YXlzIHByZXNlbnQpICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNzRmZDY3NC4uY2JkM2Q0NyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTY1LDYgKzE2NSw4IEBACiAJZWlwOyB9KQogI2RlZmluZQlLU1RLX0VTUCh0c2spCSgodHNrKSA9PSBjdXJyZW50ID8gcmR1c3AoKSA6ICh0c2spLT50aHJlYWQudXNwKQogCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spCSgoc3RydWN0IHB0X3JlZ3MgKikgKCh0c2spLT50aHJlYWQuZXNwMCkpCisKICNkZWZpbmUgY3B1X3JlbGF4KCkJYmFycmllcigpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IGE2YWI2NjMuLmVlNDAxMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTg2LDcgKzg2LDcgQEAKIGV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKIAogLyoKLSAqIFRoZXNlIGFyZSBkZWZpbmVkIGFzIHBlciBsaW51eC9wdHJhY2UuaCwgd2hpY2ggc2VlLgorICogVGhlc2UgYXJlIGRlZmluZWQgYXMgcGVyIGxpbnV4L3B0cmFjZS5oLgogICovCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb19uby5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvX25vLmgKaW5kZXggYzJiZGU1ZS4uYTY1MTJiZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvX25vLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvX25vLmgKQEAgLTEyLDggKzEyLDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQogLyoKICAqIFNpemUgb2Yga2VybmVsIHN0YWNrIGZvciBlYWNoIHByb2Nlc3MuIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIDIuLi4KICAqLwpAQCAtMjgsNiArMjYsOCBAQAogICovCiAjZGVmaW5lIFRIUkVBRF9TSVpFIChQQUdFX1NJWkU8PFRIUkVBRF9TSVpFX09SREVSKQogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCiAvKgogICogbG93IGxldmVsIHRhc2sgZGF0YS4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZyBiL2FyY2gvbTY4a25vbW11L0tjb25maWcKaW5kZXggZTIyMDFiOS4uMDY0ZjU5MSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZworKysgYi9hcmNoL202OGtub21tdS9LY29uZmlnCkBAIC01MzMsNiArNTMzLDEzIEBACiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiAoQVZORVQ1MjgyKQogCitjb25maWcgVUJPT1QKKwlib29sICJTdXBwb3J0IGZvciBVLUJvb3QgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMiCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUga2VybmVsIHdpbGwgdHJ5IHRvIGNvbGxlY3QgY29tbWFuZAorCSAgbGluZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGluaXRpYWwgdS1ib290IHN0YWNrLgorCWRlZmF1bHQgbgorCiBjb25maWcgNEtTVEFDS1MKIAlib29sICJVc2UgNEtiIGZvciBrZXJuZWwgc3RhY2tzIGluc3RlYWQgb2YgOEtiIgogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOGY4ZjRhYi4uNWM5ZWNkNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNTIsMTUgKzM1MiwxMiBAQAogCWNoYXIgKiBmaWxlbmFtZTsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAmbmFtZTsKIAotCWxvY2tfa2VybmVsKCk7CiAJZmlsZW5hbWUgPSBnZXRuYW1lKG5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CiAJaWYgKElTX0VSUihmaWxlbmFtZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyb3I7CiAJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIGFyZ3YsIGVudnAsIHJlZ3MpOwogCXB1dG5hbWUoZmlsZW5hbWUpOwotb3V0OgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKaW5kZXggNWMyYmIzZS4uYmE5MmI5MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTUyLDcgKzU0LDYgQEAKIHZvaWQgKCptYWNoX2hhbHQpKHZvaWQpOwogdm9pZCAoKm1hY2hfcG93ZXJfb2ZmKSh2b2lkKTsKIAotCiAjaWZkZWYgQ09ORklHX002ODAwMAogCSNkZWZpbmUgQ1BVICJNQzY4MDAwIgogI2VuZGlmCkBAIC0xMTEsNiArMTEyLDY5IEBACiBleHRlcm4gaW50IF9zdGV4dCwgX2V0ZXh0LCBfc2RhdGEsIF9lZGF0YSwgX3Nic3MsIF9lYnNzLCBfZW5kOwogZXh0ZXJuIGludCBfcmFtc3RhcnQsIF9yYW1lbmQ7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkKKy8qCisgKiBwYXJzZV91Ym9vdF9jb21tYW5kbGluZQorICoKKyAqIENvcGllcyB1LWJvb3QgY29tbWFuZGxpbmUgYXJndW1lbnRzIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBwcm9wZXIgbGludXgKKyAqIHZhcmlhYmxlcy4KKyAqCisgKiBBc3N1bWVzOgorICoJX2luaXRfc3AgZ2xvYmFsIGNvbnRhaW5zIHRoZSBhZGRyZXNzIGluIHRoZSBzdGFjayBwb2ludGVyIHdoZW4gdGhlCisgKglrZXJuZWwgc3RhcnRzIChzZWUgaGVhZC5TOjpfc3RhcnQpCisgKgorICoJVS1Cb290IGNhbGxpbmcgY29udmVudGlvbjoKKyAqCSgqa2VybmVsKSAoa2JkLCBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQsIGNtZF9zdGFydCwgY21kX2VuZCk7CisgKgorICoJX2luaXRfc3AgY2FuIGJlIHBhcnNlZCBhcyBzdWNoCisgKgorICoJX2luaXRfc3ArMDAgPSB1LWJvb3QgY21kIGFmdGVyIGpzciBpbnRvIGtlcm5lbCAoc2tpcCkKKyAqCV9pbml0X3NwKzA0ID0gJmtlcm5lbCBib2FyZF9pbmZvIChyZXNpZHVhbCBkYXRhKQorICoJX2luaXRfc3ArMDggPSAmaW5pdHJkX3N0YXJ0CisgKglfaW5pdF9zcCsxMiA9ICZpbml0cmRfZW5kCisgKglfaW5pdF9zcCsxNiA9ICZjbWRfc3RhcnQKKyAqCV9pbml0X3NwKzIwID0gJmNtZF9lbmQKKyAqCisgKglUaGlzIGFsc28gYXNzdW1lcyB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb25zIHBvaW50ZWQgdG8gYXJlIHN0aWxsCisgKgl1bm1vZGlmaWVkLiBVLWJvb3QgcGxhY2VzIHRoZW0gbmVhciB0aGUgZW5kIG9mIGV4dGVybmFsIFNEUkFNLgorICoKKyAqIEFyZ3VtZW50KHMpOgorICoJY29tbWFuZHAgPSB0aGUgbGludXggY29tbWFuZGxpbmUgYXJnIGNvbnRhaW5lciB0byBmaWxsLgorICoJc2l6ZSAgICAgPSB0aGUgc2l6ZW9mIGNvbW1hbmRwLgorICoKKyAqIFJldHVybnM6CisgKi8KK3ZvaWQgcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQoreworCWV4dGVybiB1bnNpZ25lZCBsb25nIF9pbml0X3NwOworCXVuc2lnbmVkIGxvbmcgKnNwOworCXVuc2lnbmVkIGxvbmcgdWJvb3Rfa2JkOworCXVuc2lnbmVkIGxvbmcgdWJvb3RfaW5pdHJkX3N0YXJ0LCB1Ym9vdF9pbml0cmRfZW5kOworCXVuc2lnbmVkIGxvbmcgdWJvb3RfY21kX3N0YXJ0LCB1Ym9vdF9jbWRfZW5kOworCisKKwlzcCA9ICh1bnNpZ25lZCBsb25nICopX2luaXRfc3A7CisJdWJvb3Rfa2JkID0gc3BbMV07CisJdWJvb3RfaW5pdHJkX3N0YXJ0ID0gc3BbMl07CisJdWJvb3RfaW5pdHJkX2VuZCA9IHNwWzNdOworCXVib290X2NtZF9zdGFydCA9IHNwWzRdOworCXVib290X2NtZF9lbmQgPSBzcFs1XTsKKworCWlmICh1Ym9vdF9jbWRfc3RhcnQgJiYgdWJvb3RfY21kX2VuZCkKKwkJc3RybmNweShjb21tYW5kcCwgKGNvbnN0IGNoYXIgKil1Ym9vdF9jbWRfc3RhcnQsIHNpemUpOworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKQorCWlmICh1Ym9vdF9pbml0cmRfc3RhcnQgJiYgdWJvb3RfaW5pdHJkX2VuZCAmJgorCQkodWJvb3RfaW5pdHJkX2VuZCA+IHVib290X2luaXRyZF9zdGFydCkpIHsKKwkJaW5pdHJkX3N0YXJ0ID0gdWJvb3RfaW5pdHJkX3N0YXJ0OworCQlpbml0cmRfZW5kID0gdWJvb3RfaW5pdHJkX2VuZDsKKwkJUk9PVF9ERVYgPSBSb290X1JBTTA7CisJCXByaW50ayhLRVJOX0lORk8gImluaXRyZCBhdCAweCVseDoweCVseFxuIiwKKwkJCWluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CisJfQorI2VuZGlmIC8qIGlmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSAqLworfQorI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkgKi8KKwogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogewogCWludCBib290bWFwX3NpemU7CkBAIC0xMjgsNyArMTkyLDI0IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQogCXN0cm5jcHkoJmNvbW1hbmRfbGluZVswXSwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKIAljb21tYW5kX2xpbmVbc2l6ZW9mKGNvbW1hbmRfbGluZSkgLSAxXSA9IDA7Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfQk9PVFBBUkFNICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkKKwkvKiBDT05GSUdfVUJPT1QgYW5kIENPTkZJR19CT09UUEFSQU0gZGVmaW5lZCwgY29uY2F0ZW5hdGUgY21kbGluZSAqLworCSNpZiBkZWZpbmVkKENPTkZJR19CT09UUEFSQU0pCisJCS8qIEFkZCB0aGUgd2hpdGVzcGFjZSBzZXBhcmF0b3IgKi8KKwkJY29tbWFuZF9saW5lW3N0cmxlbihDT05GSUdfQk9PVFBBUkFNX1NUUklORyldID0gJyAnOworCQkvKiBQYXJzZSB1Ym9vdCBjb21tYW5kIGxpbmUgaW50byB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyICovCisJCXBhcnNlX3Vib290X2NvbW1hbmRsaW5lKAorCQkJJmNvbW1hbmRfbGluZVsoc3RybGVuKENPTkZJR19CT09UUEFSQU1fU1RSSU5HKSsxKV0sCisJCQkoc2l6ZW9mKGNvbW1hbmRfbGluZSkgLQorCQkJKHN0cmxlbihDT05GSUdfQk9PVFBBUkFNX1NUUklORykrMSkpKTsKKwkvKiBPbmx5IENPTkZJR19VQk9PVCBkZWZpbmVkLCBjcmVhdGUgY21kbGluZSAqLworCSNlbHNlCisJCXBhcnNlX3Vib290X2NvbW1hbmRsaW5lKCZjb21tYW5kX2xpbmVbMF0sIHNpemVvZihjb21tYW5kX2xpbmUpKTsKKwkjZW5kaWYgLyogQ09ORklHX0JPT1RQQVJBTSAqLworCWNvbW1hbmRfbGluZVtzaXplb2YoY29tbWFuZF9saW5lKSAtIDFdID0gMDsKKyNlbmRpZiAvKiBDT05GSUdfVUJPT1QgKi8KIAogCXByaW50ayhLRVJOX0lORk8gIlx4MEZcclxuXG51Q2xpbnV4LyIgQ1BVICJcbiIpOwogCkBAIC0yMDQsNiArMjg1LDEzIEBACiAJZnJlZV9ib290bWVtKG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZCAtIG1lbW9yeV9zdGFydCk7CiAJcmVzZXJ2ZV9ib290bWVtKG1lbW9yeV9zdGFydCwgYm9vdG1hcF9zaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCisjaWYgZGVmaW5lZChDT05GSUdfVUJPT1QpICYmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKQorCWlmICgoaW5pdHJkX3N0YXJ0ID4gMCkgJiYgKGluaXRyZF9zdGFydCA8IGluaXRyZF9lbmQpICYmCisJCQkoaW5pdHJkX2VuZCA8IG1lbW9yeV9lbmQpKQorCQlyZXNlcnZlX2Jvb3RtZW0oaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0LAorCQkJCSBCT09UTUVNX0RFRkFVTFQpOworI2VuZGlmIC8qIGlmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSAqLworCiAJLyoKIAkgKiBHZXQga21hbGxvYyBpbnRvIGdlYXIuCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDI3MzZhNWUuLjlmMTc4NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC04LDYgKzgsOCBAQAogICovCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19SQU1LRVJORUwpCiAjZGVmaW5lCVJBTV9TVEFSVAlDT05GSUdfS0VSTkVMQkFTRQpAQCAtMTUsNyArMTcsNyBAQAogI2RlZmluZQlURVhUCQlyYW0KICNkZWZpbmUJREFUQQkJcmFtCiAjZGVmaW5lCUlOSVQJCXJhbQotI2RlZmluZQlCU1MJCXJhbQorI2RlZmluZQlCU1NTCQlyYW0KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1JPTUtFUk5FTCkgfHwgZGVmaW5lZChDT05GSUdfSElNRU1LRVJORUwpCiAjZGVmaW5lCVJBTV9TVEFSVAlDT05GSUdfUkFNQkFTRQpAQCAtMjcsNyArMjksNyBAQAogI2RlZmluZQlURVhUCQlyb20KICNkZWZpbmUJREFUQQkJcmFtCiAjZGVmaW5lCUlOSVQJCXJhbQotI2RlZmluZQlCU1MJCXJhbQorI2RlZmluZQlCU1NTCQlyYW0KICNlbmRpZgogCiAjaWZuZGVmIERBVEFfQUREUgpAQCAtMTQ3LDQwICsxNDksMTkgQEAKIAkJLiA9IEFMSUdOKDQpOwogCQlfc2RhdGEgPSAuIDsKIAkJREFUQV9EQVRBCi0JCS4gPSBBTElHTigzMik7Ci0JCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0JCS4gPSBBTElHTig4MTkyKSA7Ci0JCSooLmRhdGEuaW5pdF90YXNrKQorCQlDQUNIRUxJTkVfQUxJR05FRF9EQVRBKDMyKQorCQlJTklUX1RBU0tfREFUQShUSFJFQURfU0laRSkKIAkJX2VkYXRhID0gLiA7CiAJfSA+IERBVEEKIAotCS5pbml0IDogewotCQkuID0gQUxJR04oNDA5Nik7CisJLmluaXQudGV4dCA6IHsKKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJCV9faW5pdF9iZWdpbiA9IC47Ci0JCV9zaW5pdHRleHQgPSAuOwotCQlJTklUX1RFWFQKLQkJX2Vpbml0dGV4dCA9IC47Ci0JCUlOSVRfREFUQQotCQkuID0gQUxJR04oMTYpOwotCQlfX3NldHVwX3N0YXJ0ID0gLjsKLQkJKiguaW5pdC5zZXR1cCkKLQkJX19zZXR1cF9lbmQgPSAuOwotCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJSU5JVENBTExTCi0JCV9faW5pdGNhbGxfZW5kID0gLjsKLQkJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKLQkJX19jb25faW5pdGNhbGxfZW5kID0gLjsKLQkJX19zZWN1cml0eV9pbml0Y2FsbF9zdGFydCA9IC47Ci0JCSooLnNlY3VyaXR5X2luaXRjYWxsLmluaXQpCi0JCV9fc2VjdXJpdHlfaW5pdGNhbGxfZW5kID0gLjsKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkJLiA9IEFMSUdOKDQpOwotCQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JCSooLmluaXQucmFtZnMpCi0JCV9faW5pdHJhbWZzX2VuZCA9IC47Ci0jZW5kaWYKLQkJLiA9IEFMSUdOKDQwOTYpOworCX0gPiBJTklUCisJSU5JVF9URVhUX1NFQ1RJT04oUEFHRV9TSVpFKSA+IElOSVQKKwlJTklUX0RBVEFfU0VDVElPTigxNikgPiBJTklUCisJLmluaXQuZGF0YSA6IHsKKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJCV9faW5pdF9lbmQgPSAuOwogCX0gPiBJTklUCiAKQEAgLTE5Miw3ICsxNzMsNyBAQAogCQkuID0gQUxJR04oNCkgOwogCQlfZWJzcyA9IC4gOwogCSAJX2VuZCA9IC4gOwotCX0gPiBCU1MKKwl9ID4gQlNTUwogCiAJRElTQ0FSRFMKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvZ3Bpby5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9ncGlvLmMKaW5kZXggZjAyODQwZC4uYTg4NDJkYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9ncGlvLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9ncGlvLmMKQEAgLTMwLDcgKzMwLDggQEAKIAkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbWNmX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKIAkJCS5nZXQJCQk9IG1jZl9ncGlvX2dldF92YWx1ZSwKIAkJCS5zZXQJCQk9IG1jZl9ncGlvX3NldF92YWx1ZSwKLQkJCS5uZ3BpbwkJCT0gOCwKKwkJCS5iYXNlCQkJPSAxLAorCQkJLm5ncGlvCQkJPSA3LAogCQl9LAogCQkucGRkcgkJCQk9IE1DRkVQT1JUX0VQRERSLAogCQkucG9kcgkJCQk9IE1DRkVQT1JUX0VQRFIsCkBAIC0yNDQsNyArMjQ1LDcgQEAKIAkJCS5nZXQJCQk9IG1jZl9ncGlvX2dldF92YWx1ZSwKIAkJCS5zZXQJCQk9IG1jZl9ncGlvX3NldF92YWx1ZV9mYXN0LAogCQkJLmJhc2UJCQk9IDk2LAotCQkJLm5ncGlvCQkJPSA0LAorCQkJLm5ncGlvCQkJPSA4LAogCQl9LAogCQkucGRkcgkJCQk9IE1DRkdQSU9fUEREUl9USU1FUiwKIAkJLnBvZHIJCQkJPSBNQ0ZHUElPX1BPRFJfVElNRVIsCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81Mjd4L2dwaW8uYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyN3gvZ3Bpby5jCmluZGV4IDEwMjgxNDIuLjBiNTZlMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyN3gvZ3Bpby5jCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyN3gvZ3Bpby5jCkBAIC0zMSw3ICszMSw4IEBACiAJCQkuZGlyZWN0aW9uX291dHB1dAk9IG1jZl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCiAJCQkuZ2V0CQkJPSBtY2ZfZ3Bpb19nZXRfdmFsdWUsCiAJCQkuc2V0CQkJPSBtY2ZfZ3Bpb19zZXRfdmFsdWUsCi0JCQkubmdwaW8JCQk9IDgsCisJCQkuYmFzZQkJCT0gMSwKKwkJCS5uZ3BpbwkJCT0gNywKIAkJfSwKIAkJLnBkZHIJCQkJPSBNQ0ZFUE9SVF9FUEREUiwKIAkJLnBvZHIJCQkJPSBNQ0ZFUE9SVF9FUERSLApAQCAtMjYzLDcgKzI2NCw4IEBACiAJCQkuZGlyZWN0aW9uX291dHB1dAk9IG1jZl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCiAJCQkuZ2V0CQkJPSBtY2ZfZ3Bpb19nZXRfdmFsdWUsCiAJCQkuc2V0CQkJPSBtY2ZfZ3Bpb19zZXRfdmFsdWUsCi0JCQkubmdwaW8JCQk9IDgsCisJCQkuYmFzZQkJCT0gMSwKKwkJCS5uZ3BpbwkJCT0gNywKIAkJfSwKIAkJLnBkZHIJCQkJPSBNQ0ZFUE9SVF9FUEREUiwKIAkJLnBvZHIJCQkJPSBNQ0ZFUE9SVF9FUERSLApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI4eC9ncGlvLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81Mjh4L2dwaW8uYwppbmRleCBlYzU5Mzk1Li5lZWRhZjBhIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81Mjh4L2dwaW8uYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81Mjh4L2dwaW8uYwpAQCAtMzEsNyArMzEsNyBAQAogCQkJLmdldAkJCT0gbWNmX2dwaW9fZ2V0X3ZhbHVlLAogCQkJLnNldAkJCT0gbWNmX2dwaW9fc2V0X3ZhbHVlLAogCQkJLmJhc2UJCQk9IDEsCi0JCQkubmdwaW8JCQk9IDgsCisJCQkubmdwaW8JCQk9IDcsCiAJCX0sCiAJCS5wZGRyCQkJCT0gTUNGRVBPUlRfRVBERFIsCiAJCS5wb2RyCQkJCT0gTUNGRVBPUlRfRVBEUiwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL2NvbGRmaXJlL2Nsay5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvY2xrLmMKaW5kZXggN2NkYmY0NC4uOWYxMjYwYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvY2xrLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvY2xrLmMKQEAgLTksNiArOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CiAKQEAgLTE4LDIzICsxOSwyNyBAQAogewogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKIAogaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKIAogdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiB9CitFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKIAogdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKIHsKIH0KK0VYUE9SVF9TWU1CT0woY2xrX3B1dCk7CiAKIHVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlyZXR1cm4gTUNGX0NMSzsKIH0KLQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL2NvbGRmaXJlL2hlYWQuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL2NvbGRmaXJlL2hlYWQuUwppbmRleCAyYjBkNzNjLi40YjkxYWEyIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9jb2xkZmlyZS9oZWFkLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvaGVhZC5TCkBAIC0xMDYsNiArMTA2LDkgQEAKIC5nbG9iYWwgX3JhbXZlYwogLmdsb2JhbAlfcmFtc3RhcnQKIC5nbG9iYWwJX3JhbWVuZAorI2lmIGRlZmluZWQoQ09ORklHX1VCT09UKQorLmdsb2JhbAlfaW5pdF9zcAorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTI0LDYgKzEyNywxMCBAQAogLmxvbmcJMAogX3JhbWVuZDoKIC5sb25nCTAKKyNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkKK19pbml0X3NwOgorLmxvbmcJMAorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTM3LDYgKzE0NCw5IEBACiBfc3RhcnQ6CiAJbm9wCQkJCQkvKiBmaWxsZXIgKi8KIAltb3ZldwkjMHgyNzAwLCAlc3IJCQkvKiBubyBpbnRlcnJ1cHRzICovCisjaWYgZGVmaW5lZChDT05GSUdfVUJPT1QpCisJbW92ZWwJJXNwLF9pbml0X3NwCQkJLyogc2F2ZSBpbml0aWFsIHN0YWNrIHBvaW50ZXIgKi8KKyNlbmRpZgogCiAJLyoKIAkgKglEbyBhbnkgcGxhdGZvcm0gb3IgYm9hcmQgc3BlY2lmaWMgc2V0dXAgbm93LiBNb3N0IGJvYXJkcwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1jcHkuYyBiL2FyY2gvbWljcm9ibGF6ZS9saWIvbWVtY3B5LmMKaW5kZXggNmE5MDdjNS4uY2MyMTA4YiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1jcHkuYworKysgYi9hcmNoL21pY3JvYmxhemUvbGliL21lbWNweS5jCkBAIC05LDcgKzksNyBAQAogICogSXQgaXMgYmFzZWQgb24gZGVtbyBjb2RlIG9yaWdpbmFsbHkgQ29weXJpZ2h0IDIwMDEgYnkgSW50ZWwgQ29ycCwgdGFrZW4gZnJvbQogICogaHR0cDovL3d3dy5lbWJlZGRlZC5jb20vc2hvd0FydGljbGUuamh0bWw/YXJ0aWNsZUlEPTE5MjA1NTY3CiAgKgotICogQXR0ZW1wdHMgd2VyZSBtYWRlLCB1bnN1Y2Nlc2Z1bGx5LCB0byBjb250YWN0IHRoZSBvcmlnaW5hbAorICogQXR0ZW1wdHMgd2VyZSBtYWRlLCB1bnN1Y2Nlc3NmdWxseSwgdG8gY29udGFjdCB0aGUgb3JpZ2luYWwKICAqIGF1dGhvciBvZiB0aGlzIGNvZGUgKE1pY2hhZWwgTW9ycm93LCBJbnRlbCkuICBCZWxvdyBpcyB0aGUgb3JpZ2luYWwKICAqIGNvcHlyaWdodCBub3RpY2UuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1tb3ZlLmMgYi9hcmNoL21pY3JvYmxhemUvbGliL21lbW1vdmUuYwppbmRleCBkNGU5ZjQ5Li4wOTI5MTk4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvbGliL21lbW1vdmUuYworKysgYi9hcmNoL21pY3JvYmxhemUvbGliL21lbW1vdmUuYwpAQCAtOSw3ICs5LDcgQEAKICAqIEl0IGlzIGJhc2VkIG9uIGRlbW8gY29kZSBvcmlnaW5hbGx5IENvcHlyaWdodCAyMDAxIGJ5IEludGVsIENvcnAsIHRha2VuIGZyb20KICAqIGh0dHA6Ly93d3cuZW1iZWRkZWQuY29tL3Nob3dBcnRpY2xlLmpodG1sP2FydGljbGVJRD0xOTIwNTU2NwogICoKLSAqIEF0dGVtcHRzIHdlcmUgbWFkZSwgdW5zdWNjZXNmdWxseSwgdG8gY29udGFjdCB0aGUgb3JpZ2luYWwKKyAqIEF0dGVtcHRzIHdlcmUgbWFkZSwgdW5zdWNjZXNzZnVsbHksIHRvIGNvbnRhY3QgdGhlIG9yaWdpbmFsCiAgKiBhdXRob3Igb2YgdGhpcyBjb2RlIChNaWNoYWVsIE1vcnJvdywgSW50ZWwpLiAgQmVsb3cgaXMgdGhlIG9yaWdpbmFsCiAgKiBjb3B5cmlnaHQgbm90aWNlLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9saWIvbWVtc2V0LmMgYi9hcmNoL21pY3JvYmxhemUvbGliL21lbXNldC5jCmluZGV4IDk0MWRjOGYuLjRkZjg1MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9saWIvbWVtc2V0LmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1zZXQuYwpAQCAtOSw3ICs5LDcgQEAKICAqIEl0IGlzIGJhc2VkIG9uIGRlbW8gY29kZSBvcmlnaW5hbGx5IENvcHlyaWdodCAyMDAxIGJ5IEludGVsIENvcnAsIHRha2VuIGZyb20KICAqIGh0dHA6Ly93d3cuZW1iZWRkZWQuY29tL3Nob3dBcnRpY2xlLmpodG1sP2FydGljbGVJRD0xOTIwNTU2NwogICoKLSAqIEF0dGVtcHRzIHdlcmUgbWFkZSwgdW5zdWNjZXNmdWxseSwgdG8gY29udGFjdCB0aGUgb3JpZ2luYWwKKyAqIEF0dGVtcHRzIHdlcmUgbWFkZSwgdW5zdWNjZXNzZnVsbHksIHRvIGNvbnRhY3QgdGhlIG9yaWdpbmFsCiAgKiBhdXRob3Igb2YgdGhpcyBjb2RlIChNaWNoYWVsIE1vcnJvdywgSW50ZWwpLiAgQmVsb3cgaXMgdGhlIG9yaWdpbmFsCiAgKiBjb3B5cmlnaHQgbm90aWNlLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDgzM3gvZ3Bpby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODMzeC9ncGlvLmgKaW5kZXggOGRlMGViOS4uZWQzYTg4ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODMzeC9ncGlvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODMzeC9ncGlvLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogLyogQklHIEZBVCBXQVJOSU5HOiByYWNlcyBkYW5nZXIhCiAgICBObyBwcm90ZWN0aW9ucyBleGlzdCBoZXJlLiBDdXJyZW50IHVzZXJzIGFyZSBvbmx5IGVhcmx5IGluaXQgY29kZSwKLSAgIHdoZW4gbG9ja2luZyBpcyBub3QgbmVlZGVkIGJlY2F1c2Ugbm8gY3VuY3VyZW5jeSB5ZXQgZXhpc3RzIHRoZXJlLAorICAgd2hlbiBsb2NraW5nIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBubyBjb25jdXJyZW5jeSB5ZXQgZXhpc3RzIHRoZXJlLAogICAgYW5kIEdQSU8gSVJRIGRpc3BhdGNoZXIsIHdoaWNoIGRvZXMgbG9ja2luZy4KICAgIEhvd2V2ZXIsIGlmIG1hbnkgdXNlcyB3aWxsIGV2ZXIgaGFwcGVuLCBwcm9wZXIgbG9ja2luZyB3aWxsIGJlIG5lZWRlZAogICAgLSBpbmNsdWRpbmcgbG9ja2luZyBiZXR3ZWVuIGRpZmZlcmVudCB1c2VzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL2lvYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NnaS9pb2MuaAppbmRleCAzNDNlZDE1Li41N2E5NzE5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL2lvYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvaW9jLmgKQEAgLTE2NCw3ICsxNjQsNyBAQAogCXUzMiBfdW51c2VkNTsKIAl1OCBfd3JpdGVbM107CiAJdm9sYXRpbGUgdTggd3JpdGU7Ci0jZGVmaW5lIFNHSU9DX1dSSVRFX05USFJFU0gJMHgwMQkvKiB1c2UgNC41ZGIgdGhyZXNoaG9sZCAqLworI2RlZmluZSBTR0lPQ19XUklURV9OVEhSRVNICTB4MDEJLyogdXNlIDQuNWRiIHRocmVzaG9sZCAqLwogI2RlZmluZSBTR0lPQ19XUklURV9UUFNQRUVECTB4MDIJLyogdXNlIDEwMG9obSBUUCBzcGVlZCAqLwogI2RlZmluZSBTR0lPQ19XUklURV9FUFNFTAkweDA0CS8qIGZvcmNlIGNhYmxlIG1vZGU6IDE9QVVJIDA9VFAgKi8KICNkZWZpbmUgU0dJT0NfV1JJVEVfRUFTRUwJMHgwOAkvKiAxPWF1dG9zZWxlY3QgMD1tYW51YWwgY2FibGUgc2VsZWN0aW9uICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9tYWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX21hYy5oCmluZGV4IGI2ZmFmMDguLjU5MWI5MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX21hYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX21hYy5oCkBAIC0yMTIsNyArMjEyLDcgQEAKICNkZWZpbmUgR19NQUNfVFhEX1dFSUdIVDEoeCkgICAgICAgIF9TQl9HRVRWQUxVRSh4LCBTX01BQ19UWERfV0VJR0hUMSwgTV9NQUNfVFhEX1dFSUdIVDEpCiAKIC8qCi0gKiBNQUMgRmlmbyBUaHJlc2hob2xkIHJlZ2lzdGVycyAoVGFibGUgOS0xNCkKKyAqIE1BQyBGaWZvIFRocmVzaG9sZCByZWdpc3RlcnMgKFRhYmxlIDktMTQpCiAgKiBSZWdpc3RlcjogTUFDX1RIUlNIX0NGR18wCiAgKiBSZWdpc3RlcjogTUFDX1RIUlNIX0NGR18xCiAgKiBSZWdpc3RlcjogTUFDX1RIUlNIX0NGR18yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vc24wL2h1YmlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vc24wL2h1YmlvLmgKaW5kZXggZDBjMjlkNC4uMzFjNzZjMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9odWJpby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbjAvaHViaW8uaApAQCAtODI1LDcgKzgyNSw3IEBACiAJc3RydWN0IHsKIAkgICAgdTY0CXJzdmQxOgkxNSwKIAkJZXJyb3I6CTEsCS8qIFdpZGdldCByY3ZkIHdyIHJlc3AgcGt0IHcvIGVycm9yICovCi0JCW92ZmxvdzoJNSwJLyogT3ZlciBmbG93IGNvdW50LiBwZXJmIG1lYXN1cmVtZW50ICovCisJCW92ZmxvdzoJNSwJLyogT3ZlcmZsb3cgY291bnQuIHBlcmYgbWVhc3VyZW1lbnQgKi8KIAkJZmlyZV9hbmRfZm9yZ2V0OiAxLCAvKiBMYXVuY2ggV3JpdGUgd2l0aG91dCByZXNwb25zZSAqLwogCQltb2RlOgkyLAkvKiBXaWRnZXQgb3BlcmF0aW9uIE1vZGUJKi8KIAkJcnN2ZDI6CTIsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtdGMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCmluZGV4IDI0NjMwZmQuLmEzOGUzZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCkBAIC0xMzMxLDcgKzEzMzEsNyBAQAogCQlpZiAoISgoYXNpZCArPSBBU0lEX0lOQykgJiBBU0lEX01BU0spICkgewogCQkJaWYgKGNwdV9oYXNfdnRhZ19pY2FjaGUpCiAJCQkJZmx1c2hfaWNhY2hlX2FsbCgpOwotCQkJLyogVHJhdmVyc2UgYWxsIG9ubGluZSBDUFVzIChoYWNrIHJlcXVpcmVzIGNvbnRpZ291cyByYW5nZSkgKi8KKwkJCS8qIFRyYXZlcnNlIGFsbCBvbmxpbmUgQ1BVcyAoaGFjayByZXF1aXJlcyBjb250aWd1b3VzIHJhbmdlKSAqLwogCQkJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CiAJCQkJLyoKIAkJCQkgKiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IG91ciBvd24gQ1BVLCBub3IgdGhvc2Ugb2YKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF9zdWIuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF9zdWIuYwppbmRleCBiMzBjNWIxLi5hMjEyN2Q2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvZHBfc3ViLmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2RwX3N1Yi5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogCWNhc2UgQ0xQQUlSKElFRUU3NTRfQ0xBU1NfRE5PUk0sIElFRUU3NTRfQ0xBU1NfRE5PUk0pOgogCQlEUEROT1JNWDsKLQkJLyogRkFBTCBUSE9ST1VHSCAqLworCQkvKiBGQUxMIFRIUk9VR0ggKi8KIAogCWNhc2UgQ0xQQUlSKElFRUU3NTRfQ0xBU1NfTk9STSwgSUVFRTc1NF9DTEFTU19ETk9STSk6CiAJCS8qIG5vcm1hbGl6ZSB5bSx5ZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zbXNjX2ZkYzM3bTgxeC5jIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zbXNjX2ZkYzM3bTgxeC5jCmluZGV4IGEyYjJkNjIuLjhlYmMzODQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc21zY19mZGMzN204MXguYworKysgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3Ntc2NfZmRjMzdtODF4LmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCWlmIChjaGlwX2lkID09IFNNU0NfRkRDMzdNODFYX0NISVBfSUQpCiAJCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19lbmQoKTsKIAllbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vdyBjaGlwIGlkIDB4JTAyeFxuIiwgX19mdW5jX18sCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIGNoaXAgaWQgMHglMDJ4XG4iLCBfX2Z1bmNfXywKIAkJICAgICAgIGNoaXBfaWQpOwogCQlnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgPSAwOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggODkyY2NlOC4uZWM4YTIxZCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI3NSwxNiArMjc1LDEyIEBACiAJY2hhciAqZmlsZW5hbWU7CiAJaW50IGVycm9yOwogCi0JbG9ja19rZXJuZWwoKTsKLQogCWZpbGVuYW1lID0gZ2V0bmFtZShuYW1lKTsKIAllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOwotCWlmICghSVNfRVJSKGZpbGVuYW1lKSkgewotCQllcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwgYXJndiwgZW52cCwgX19mcmFtZSk7Ci0JCXB1dG5hbWUoZmlsZW5hbWUpOwotCX0KLQotCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoSVNfRVJSKGZpbGVuYW1lKSkKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCBhcmd2LCBlbnZwLCBfX2ZyYW1lKTsKKwlwdXRuYW1lKGZpbGVuYW1lKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wZXJmLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGVyZi5jCmluZGV4IDc1MDk5ZWYuLmY5ZjY3ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wZXJmLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3BlcmYuYwpAQCAtMjQsNyArMjQsNyBAQAogICoKICAqICBUaGlzIGRyaXZlciBwcm9ncmFtcyB0aGUgUENYLVUvUENYLVcgcGVyZm9ybWFuY2UgY291bnRlcnMKICAqICBvbiB0aGUgUEEtUklTQyAyLjAgY2hpcHMuICBUaGUgZHJpdmVyIGtlZXBzIGFsbCBpbWFnZXMgbm93Ci0gKiAgaW50ZXJuYWxseSB0byB0aGUga2VybmVsIHRvIGhvcGVmdWxseSBlbGltaW5hdGUgdGhlIHBvc3NpYmxpdHkKKyAqICBpbnRlcm5hbGx5IHRvIHRoZSBrZXJuZWwgdG8gaG9wZWZ1bGx5IGVsaW1pbmF0ZSB0aGUgcG9zc2liaWxpdHkKICAqICBvZiBhIGJhZCBpbWFnZSBoYWx0aW5nIHRoZSBDUFUuICBBbHNvLCB0aGVyZSBhcmUgZGlmZmVyZW50CiAgKiAgaW1hZ2VzIGZvciB0aGUgUENYLVcgYW5kIGxhdGVyIGNoaXBzIHZzIHRoZSBQQ1gtVSBjaGlwcy4KICAqCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2ZzbF9lbWIuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfZnNsX2VtYi5oCmluZGV4IDFlMTgwYTUuLjBkZTQwNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfZnNsX2VtYi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfZnNsX2VtYi5oCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIFBNUk5fUE1MQ0IyCTB4MTEyCS8qIFBNIExvY2FsIENvbnRyb2wgQjIgKi8KICNkZWZpbmUgUE1STl9QTUxDQjMJMHgxMTMJLyogUE0gTG9jYWwgQ29udHJvbCBCMyAqLwogCi0jZGVmaW5lIFBNTENCX1RIUkVTSE1VTF9NQVNLCTB4MDcwMAkvKiBUaHJlc2hob2xkIE11bHRpcGxlIEZpZWxkICovCisjZGVmaW5lIFBNTENCX1RIUkVTSE1VTF9NQVNLCTB4MDcwMAkvKiBUaHJlc2hvbGQgTXVsdGlwbGUgRmllbGQgKi8KICNkZWZpbmUgUE1MQ0JfVEhSRVNITVVMX1NISUZUCTgKIAogI2RlZmluZSBQTUxDQl9USFJFU0hPTERfTUFTSwkweDAwM2YJLyogVGhyZXNob2xkIEZpZWxkICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2tnZGIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva2dkYi5jCmluZGV4IDY0MWM3NGIuLmI2YmQxZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva2dkYi5jCkBAIC01Miw3ICs1Miw3IEBACiAJeyAweDIwMzAsIDB4MDggLyogU0lHRlBFICovICB9LAkJLyogc3BlIGZwIGRhdGEgKi8KIAl7IDB4MjA0MCwgMHgwOCAvKiBTSUdGUEUgKi8gIH0sCQkvKiBzcGUgZnAgZGF0YSAqLwogCXsgMHgyMDUwLCAweDA4IC8qIFNJR0ZQRSAqLyAgfSwJCS8qIHNwZSBmcCByb3VuZCAqLwotCXsgMHgyMDYwLCAweDBlIC8qIFNJR0lMTCAqLyAgfSwJCS8qIHBlcmZvcm1hY2UgbW9uaXRvciAqLworCXsgMHgyMDYwLCAweDBlIC8qIFNJR0lMTCAqLyAgfSwJCS8qIHBlcmZvcm1hbmNlIG1vbml0b3IgKi8KIAl7IDB4MjkwMCwgMHgwOCAvKiBTSUdGUEUgKi8gIH0sCQkvKiBhcHUgdW5hdmFpbGFibGUgKi8KIAl7IDB4MzEwMCwgMHgwZSAvKiBTSUdBTFJNICovIH0sCQkvKiBmaXhlZCBpbnRlcnZhbCB0aW1lciAqLwogCXsgMHgzMjAwLCAweDAyIC8qIFNJR0lOVCAqLyAgfSwgCS8qIHdhdGNoZG9nICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RhdV82eHguYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGF1XzZ4eC5jCmluZGV4IGMzYTU2ZDYuLmE3NTNiNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGF1XzZ4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGF1XzZ4eC5jCkBAIC01OSw3ICs1OSw3IEBACiAJbXRzcHIoU1BSTl9USFJNMSwgVEhSTTFfVEhSRVModGF1W2NwdV0ubG93KSB8IFRIUk0xX1YgfCBUSFJNMV9USUUgfCBUSFJNMV9USUQpOwogCiAJLyogc2V0dXAgVEhSTTIsCi0JICogdGhyZXNob2xkLCB2YWxpZCBiaXQsIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbnRlcnJ1cHQgd2hlbiBhYm92ZSB0aHJlc2hob2xkCisJICogdGhyZXNob2xkLCB2YWxpZCBiaXQsIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbnRlcnJ1cHQgd2hlbiBhYm92ZSB0aHJlc2hvbGQKIAkgKi8KIAltdHNwciAoU1BSTl9USFJNMiwgVEhSTTFfVEhSRVModGF1W2NwdV0uaGlnaCkgfCBUSFJNMV9WIHwgVEhSTTFfVElFKTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCmluZGV4IDEzN2RjMjIuLmQ4NGQxOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCkBAIC03MjEsNyArNzIxLDcgQEAKIAogI2lmZGVmIENPTkZJR19QUEM2NAogCS8qCi0JICogRmlsbCB1cCB0aGUgInN5c3RlbWNmZyIgc3R1ZmYgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGl0eQorCSAqIEZpbGwgdXAgdGhlICJzeXN0ZW1jZmciIHN0dWZmIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAJICovCiAJc3RyY3B5KChjaGFyICopdmRzb19kYXRhLT5leWVfY2F0Y2hlciwgIlNZU1RFTUNGRzpQUEM2NCIpOwogCXZkc29fZGF0YS0+dmVyc2lvbi5tYWpvciA9IFNZU1RFTUNGR19NQUpPUjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfY2VsbC5jCmluZGV4IGFlMDZjNjIuLjJjOWU1MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJICogVGhlcmUgaXMgbm8gZGVidWcgc2V0dXAgcmVxdWlyZWQgZm9yIHRoZSBjeWNsZXMgZXZlbnQuCiAJICogTm90ZSB0aGF0IG9ubHkgZXZlbnRzIGluIHRoZSBzYW1lIGdyb3VwIGNhbiBiZSB1c2VkLgogCSAqIE90aGVyd2lzZSwgdGhlcmUgd2lsbCBiZSBjb25mbGljdHMgaW4gY29ycmVjdGx5IHJvdXRpbmcKLQkgKiB0aGUgc2lnbmFscyBvbiB0aGUgZGVidWcgYnVzLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmxpdHkKKwkgKiB0aGUgc2lnbmFscyBvbiB0aGUgZGVidWcgYnVzLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5CiAJICogb2YgdGhlIE9Qcm9maWxlIHVzZXIgdG9vbCB0byBjaGVjayB0aGUgZXZlbnRzIGFyZSBpbgogCSAqIHRoZSBzYW1lIGdyb3VwLgogCSAqLwpAQCAtMTU5NCw3ICsxNTk0LDcgQEAKIAkJICogdG8gYSBsYXRjaC4gIFRoZSBuZXcgdmFsdWVzIChpbnRlcnJ1cHQgc2V0dGluZyBiaXRzLCByZXNldAogCQkgKiBjb3VudGVyIHZhbHVlIGV0Yy4pIGFyZSBub3QgY29waWVkIHRvIHRoZSBhY3R1YWwgcmVnaXN0ZXJzCiAJCSAqIHVudGlsIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGVuYWJsZWQuICBJbiBvcmRlciB0byBnZXQKLQkJICogdGhpcyB0byB3b3JrIGFzIGRlc2lyZWQsIHRoZSBwZXJtb3JtYW5jZSBtb25pdG9yIG5lZWRzIHRvCisJCSAqIHRoaXMgdG8gd29yayBhcyBkZXNpcmVkLCB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBuZWVkcyB0bwogCQkgKiBiZSBkaXNhYmxlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBsYXRjaGVzLiAgVGhpcyBpcyBhCiAJCSAqIEhXIGRlc2lnbiBpc3N1ZS4KIAkJICovCkBAIC0xNjY4LDcgKzE2NjgsNyBAQAogCQkgKiB0byBhIGxhdGNoLglUaGUgbmV3IHZhbHVlcyAoaW50ZXJydXB0IHNldHRpbmcgYml0cywgcmVzZXQKIAkJICogY291bnRlciB2YWx1ZSBldGMuKSBhcmUgbm90IGNvcGllZCB0byB0aGUgYWN0dWFsIHJlZ2lzdGVycwogCQkgKiB1bnRpbCB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBpcyBlbmFibGVkLiAgSW4gb3JkZXIgdG8gZ2V0Ci0JCSAqIHRoaXMgdG8gd29yayBhcyBkZXNpcmVkLCB0aGUgcGVybW9ybWFuY2UgbW9uaXRvciBuZWVkcyB0bworCQkgKiB0aGlzIHRvIHdvcmsgYXMgZGVzaXJlZCwgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgbmVlZHMgdG8KIAkJICogYmUgZGlzYWJsZWQgd2hpbGUgd3JpdGluZyB0byB0aGUgbGF0Y2hlcy4gIFRoaXMgaXMgYQogCQkgKiBIVyBkZXNpZ24gaXNzdWUuCiAJCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYwppbmRleCBkZDQzMTE0Li5kYTExMGJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIFBDSSBjb25maWd1cmF0aW9uIGFjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUENJIGNvbmZpZ3VyYXRpb24gYWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKaW5kZXggZTgxNDAzYi4uYWIyMDI3YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCkBAIC0zMDIsNyArMzAyLDcgQEAKICAqICAxIC0+IFNraXAgdGhlIGRldmljZSBidXQgYWN0IGFzIGlmIHRoZSBhY2Nlc3Mgd2FzIHN1Y2Nlc3NmdWxsCiAgKiAgICAgICAocmV0dXJuIDB4ZmYncyBvbiByZWFkcywgZXZlbnR1YWxseSwgY2FjaGUgY29uZmlnIHNwYWNlCiAgKiAgICAgICBhY2Nlc3NlcyBpbiBhIGxhdGVyIHZlcnNpb24pCi0gKiAtMSAtPiBIaWRlIHRoZSBkZXZpY2UgKHVuc3VjY2Vzc2Z1bCBhY2VzcykKKyAqIC0xIC0+IEhpZGUgdGhlIGRldmljZSAodW5zdWNjZXNzZnVsIGFjY2VzcykKICAqLwogc3RhdGljIGludCB1M19odF9za2lwX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCiAJCQkgICAgIHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKaW5kZXggYWUzYzRkYi4uYmFmYzNmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJZHAgPSAoKHVuc2lnbmVkIGludCopdGJsLT5pdF9iYXNlKSArIGluZGV4OwogCi0JLyogT24gVTMsIGFsbCBtZW1vcnkgaXMgY29udGlnb3VzLCBzbyB3ZSBjYW4gbW92ZSB0aGlzCisJLyogT24gVTMsIGFsbCBtZW1vcnkgaXMgY29udGlndW91cywgc28gd2UgY2FuIG1vdmUgdGhpcwogCSAqIG91dCBvZiB0aGUgbG9vcC4KIAkgKi8KIAlsID0gbnBhZ2VzOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCAxNmM2NzMwLi5jODAyMzUyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtMjIwLDIzICsyMjAsOCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIFMzOTBfU1dJVENIX0FNT0RFCi0JYm9vbCAiU3dpdGNoIGtlcm5lbC91c2VyIGFkZHJlc3NpbmcgbW9kZXMiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWxsb3dzIHRvIHN3aXRjaCB0aGUgYWRkcmVzc2luZyBtb2RlcyBvZiBrZXJuZWwgYW5kIHVzZXIKLQkgIHNwYWNlLiBUaGUga2VybmVsIHBhcmFtZXRlciBzd2l0Y2hfYW1vZGU9b24gd2lsbCBlbmFibGUgdGhpcyBmZWF0dXJlLAotCSAgZGVmYXVsdCBpcyBkaXNhYmxlZC4gRW5hYmxpbmcgdGhpcyAodmlhIGtlcm5lbCBwYXJhbWV0ZXIpIG9uIG1hY2hpbmVzCi0JICBlYXJsaWVyIHRoYW4gSUJNIFN5c3RlbSB6OS0xMDkgRUMvQkMgd2lsbCByZWR1Y2Ugc3lzdGVtIHBlcmZvcm1hbmNlLgotCi0JICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gd2lsbCBhbHNvIGJlIHNlbGVjdGVkIGJ5IHNlbGVjdGluZyB0aGUgZXhlY3V0ZQotCSAgcHJvdGVjdGlvbiBvcHRpb24gYmVsb3cuIEVuYWJsaW5nIHRoZSBleGVjdXRlIHByb3RlY3Rpb24gdmlhIHRoZQotCSAgbm9leGVjIGtlcm5lbCBwYXJhbWV0ZXIgd2lsbCBhbHNvIHN3aXRjaCB0aGUgYWRkcmVzc2luZyBtb2RlcywKLQkgIGluZGVwZW5kZW50IG9mIHRoZSBzd2l0Y2hfYW1vZGUga2VybmVsIHBhcmFtZXRlci4KLQotCiBjb25maWcgUzM5MF9FWEVDX1BST1RFQ1QKIAlib29sICJEYXRhIGV4ZWN1dGUgcHJvdGVjdGlvbiIKLQlzZWxlY3QgUzM5MF9TV0lUQ0hfQU1PREUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhbGxvd3MgdG8gZW5hYmxlIGEgYnVmZmVyIG92ZXJmbG93IHByb3RlY3Rpb24gZm9yIHVzZXIKIAkgIHNwYWNlIHByb2dyYW1zIGFuZCBpdCBhbHNvIHNlbGVjdHMgdGhlIGFkZHJlc3NpbmcgbW9kZSBvcHRpb24gYWJvdmUuCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL3BybmcuYyBiL2FyY2gvczM5MC9jcnlwdG8vcHJuZy5jCmluZGV4IGI0OWMwMGMuLmEzMjA5OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vcHJuZy5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vcHJuZy5jCkBAIC02LDcgKzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CkBAIC00OSw3ICs0OCw2IEBACiAKIHN0YXRpYyBpbnQgcHJuZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWN5Y2xlX2tlcm5lbF9sb2NrKCk7CiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwppbmRleCBhYjQ0NjQ0Li5mNGU1M2M2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTE4NSw3ICsxODUsNiBAQAogQ09ORklHX0NPTVBBVD15CiBDT05GSUdfU1lTVklQQ19DT01QQVQ9eQogQ09ORklHX0FVRElUX0FSQ0g9eQotQ09ORklHX1MzOTBfU1dJVENIX0FNT0RFPXkKIENPTkZJR19TMzkwX0VYRUNfUFJPVEVDVD15CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBhZTdjOGY5Li4yYTExM2Q2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaWYgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMikKIAogI2RlZmluZSBfX0NTX0xPT1AocHRyLCBvcF92YWwsIG9wX3N0cmluZykgKHsJCQkJXAotCXR5cGVvZihwdHItPmNvdW50ZXIpIG9sZF92YWwsIG5ld192YWw7CQkJCVwKKwlpbnQgb2xkX3ZhbCwgbmV3X3ZhbDsJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKAkJCQkJCQlcCiAJCSIJbAklMCwlMlxuIgkJCQlcCiAJCSIwOglscgklMSwlMFxuIgkJCQlcCkBAIC0zOCw3ICszOCw3IEBACiAjZWxzZSAvKiBfX0dOVUNfXyAqLwogCiAjZGVmaW5lIF9fQ1NfTE9PUChwdHIsIG9wX3ZhbCwgb3Bfc3RyaW5nKSAoewkJCQlcCi0JdHlwZW9mKHB0ci0+Y291bnRlcikgb2xkX3ZhbCwgbmV3X3ZhbDsJCQkJXAorCWludCBvbGRfdmFsLCBuZXdfdmFsOwkJCQkJCVwKIAlhc20gdm9sYXRpbGUoCQkJCQkJCVwKIAkJIglsCSUwLDAoJTMpXG4iCQkJCVwKIAkJIjA6CWxyCSUxLCUwXG4iCQkJCVwKQEAgLTE0Myw3ICsxNDMsNyBAQAogI2lmIF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+IDIpCiAKICNkZWZpbmUgX19DU0dfTE9PUChwdHIsIG9wX3ZhbCwgb3Bfc3RyaW5nKSAoewkJCQlcCi0JdHlwZW9mKHB0ci0+Y291bnRlcikgb2xkX3ZhbCwgbmV3X3ZhbDsJCQkJXAorCWxvbmcgbG9uZyBvbGRfdmFsLCBuZXdfdmFsOwkJCQkJXAogCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAogCQkiCWxnCSUwLCUyXG4iCQkJCVwKIAkJIjA6CWxncgklMSwlMFxuIgkJCQlcCkBAIC0xNjAsNyArMTYwLDcgQEAKICNlbHNlIC8qIF9fR05VQ19fICovCiAKICNkZWZpbmUgX19DU0dfTE9PUChwdHIsIG9wX3ZhbCwgb3Bfc3RyaW5nKSAoewkJCQlcCi0JdHlwZW9mKHB0ci0+Y291bnRlcikgb2xkX3ZhbCwgbmV3X3ZhbDsJCQkJXAorCWxvbmcgbG9uZyBvbGRfdmFsLCBuZXdfdmFsOwkJCQkJXAogCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAogCQkiCWxnCSUwLDAoJTMpXG4iCQkJCVwKIAkJIjA6CWxncgklMSwlMFxuIgkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3ZGV2LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3ZGV2LmgKaW5kZXggMmE1NDE5NS4uZjRiZDM0NiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2Rldi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dkZXYuaApAQCAtMTQyLDYgKzE0Miw4IEBACiBleHRlcm4gaW50IGNjd19kZXZpY2Vfc2V0X29wdGlvbnNfbWFzayhzdHJ1Y3QgY2N3X2RldmljZSAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpbnQgY2N3X2RldmljZV9zZXRfb3B0aW9ucyhzdHJ1Y3QgY2N3X2RldmljZSAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB2b2lkIGNjd19kZXZpY2VfY2xlYXJfb3B0aW9ucyhzdHJ1Y3QgY2N3X2RldmljZSAqLCB1bnNpZ25lZCBsb25nKTsKK2ludCBjY3dfZGV2aWNlX2lzX3BhdGhncm91cChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldik7CitpbnQgY2N3X2RldmljZV9pc19tdWx0aXBhdGgoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOwogCiAvKiBBbGxvdyBmb3IgaS9vIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIGFmdGVyIHByaW1hcnkgaW50ZXJydXB0IHN0YXR1cy4gKi8KICNkZWZpbmUgQ0NXREVWX0VBUkxZX05PVElGSUNBVElPTgkweDAwMDEKQEAgLTE1MSw2ICsxNTMsOCBAQAogI2RlZmluZSBDQ1dERVZfRE9fUEFUSEdST1VQICAgICAgICAgICAgIDB4MDAwNAogLyogQWxsb3cgZm9yY2VkIG9ubGluaW5nIG9mIGJveGVkIGRldmljZXMuICovCiAjZGVmaW5lIENDV0RFVl9BTExPV19GT1JDRSAgICAgICAgICAgICAgMHgwMDA4CisvKiBUcnkgdG8gdXNlIG11bHRpcGF0aCBtb2RlLiAqLworI2RlZmluZSBDQ1dERVZfRE9fTVVMVElQQVRICQkweDAwMTAKIAogZXh0ZXJuIGludCBjY3dfZGV2aWNlX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICosIHN0cnVjdCBjY3cxICosCiAJCQkgICAgdW5zaWduZWQgbG9uZywgX191OCwgdW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IGZjN2VkZDYuLjk3NmUyNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0zNiw3ICszNiw3IEBACiAJCW1tLT5jb250ZXh0Lmhhc19wZ3N0ZSA9IDE7CiAJCW1tLT5jb250ZXh0LmFsbG9jX3Bnc3RlID0gMTsKIAl9IGVsc2UgewotCQltbS0+Y29udGV4dC5ub2V4ZWMgPSBzMzkwX25vZXhlYzsKKwkJbW0tPmNvbnRleHQubm9leGVjID0gKHVzZXJfbW9kZSA9PSBTRUNPTkRBUllfU1BBQ0VfTU9ERSk7CiAJCW1tLT5jb250ZXh0Lmhhc19wZ3N0ZSA9IDA7CiAJCW1tLT5jb250ZXh0LmFsbG9jX3Bnc3RlID0gMDsKIAl9CkBAIC01OCw3ICs1OCw3IEBACiAJcGdkX3QgKnBnZCA9IG1tLT5wZ2Q7CiAKIAlTMzkwX2xvd2NvcmUudXNlcl9hc2NlID0gbW0tPmNvbnRleHQuYXNjZV9iaXRzIHwgX19wYShwZ2QpOwotCWlmIChzd2l0Y2hfYW1vZGUpIHsKKwlpZiAodXNlcl9tb2RlICE9IEhPTUVfU1BBQ0VfTU9ERSkgewogCQkvKiBMb2FkIHByaW1hcnkgc3BhY2UgcGFnZSB0YWJsZSBvcmlnaW4uICovCiAJCXBnZCA9IG1tLT5jb250ZXh0Lm5vZXhlYyA/IGdldF9zaGFkb3dfdGFibGUocGdkKSA6IHBnZDsKIAkJUzM5MF9sb3djb3JlLnVzZXJfZXhlY19hc2NlID0gbW0tPmNvbnRleHQuYXNjZV9iaXRzIHwgX19wYShwZ2QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKaW5kZXggZGRhZDU5MC4uNjg5NDBkMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC0xNDMsNyArMTQzLDggQEAKIAlzcGluX2xvY2tfaW5pdCgmbW0tPmNvbnRleHQubGlzdF9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbW0tPmNvbnRleHQuY3JzdF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0KTsKLQlyZXR1cm4gKHBnZF90ICopIGNyc3RfdGFibGVfYWxsb2MobW0sIHMzOTBfbm9leGVjKTsKKwlyZXR1cm4gKHBnZF90ICopCisJCWNyc3RfdGFibGVfYWxsb2MobW0sIHVzZXJfbW9kZSA9PSBTRUNPTkRBUllfU1BBQ0VfTU9ERSk7CiB9CiAjZGVmaW5lIHBnZF9mcmVlKG1tLCBwZ2QpIGNyc3RfdGFibGVfZnJlZShtbSwgKHVuc2lnbmVkIGxvbmcgKikgcGdkKQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA2MGE3YjFhLi5lMmZhNzljIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTE2OSwxMiArMTY5LDEzIEBACiAgKiBTVEwgU2VnbWVudC1UYWJsZS1MZW5ndGg6ICBTZWdtZW50LXRhYmxlIGxlbmd0aCAoU1RMKzEqMTYgZW50cmllcyAtPiB1cCB0byAyMDQ4KQogICoKICAqIEEgNjQgYml0IHBhZ2V0YWJsZSBlbnRyeSBvZiBTMzkwIGhhcyBmb2xsb3dpbmcgZm9ybWF0OgotICogfCAgICAgICAgICAgICAgICAgICAgIFBGUkEgICAgICAgICAgICAgICAgICAgICAgICAgfDBJUDB8ICBPUyAgfAorICogfAkJCSBQRlJBCQkJICAgICAgfDBJUEN8ICBPUyAgfAogICogMDAwMDAwMDAwMDExMTExMTExMTEyMjIyMjIyMjIyMzMzMzMzMzMzMzQ0NDQ0NDQ0NDQ1NTU1NTU1NTU1NjY2NgogICogMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMwogICoKICAqIEkgUGFnZS1JbnZhbGlkIEJpdDogICAgUGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBhZGRyZXNzLXRyYW5zbGF0aW9uCiAgKiBQIFBhZ2UtUHJvdGVjdGlvbiBCaXQ6IFN0b3JlIGFjY2VzcyBub3QgcG9zc2libGUgZm9yIHBhZ2UKKyAqIEMgQ2hhbmdlLWJpdCBvdmVycmlkZTogSFcgaXMgbm90IHJlcXVpcmVkIHRvIHNldCBjaGFuZ2UgYml0CiAgKgogICogQSA2NCBiaXQgc2VnbWVudHRhYmxlIGVudHJ5IG9mIFMzOTAgaGFzIGZvbGxvd2luZyBmb3JtYXQ6CiAgKiB8ICAgICAgICBQLXRhYmxlIG9yaWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBUVApAQCAtMjE4LDYgKzIxOSw3IEBACiAgKi8KIAogLyogSGFyZHdhcmUgYml0cyBpbiB0aGUgcGFnZSB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBfUEFHRV9DTwkweDEwMAkJLyogSFcgQ2hhbmdlLWJpdCBvdmVycmlkZSAqLwogI2RlZmluZSBfUEFHRV9STwkweDIwMAkJLyogSFcgcmVhZC1vbmx5IGJpdCAgKi8KICNkZWZpbmUgX1BBR0VfSU5WQUxJRAkweDQwMAkJLyogSFcgaW52YWxpZCBiaXQgICAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCBlMzc0NzhlLi41MmE3NzljIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtNDksMTcgKzQ5LDEyIEBACiAKIHZvaWQgZGV0ZWN0X21lbW9yeV9sYXlvdXQoc3RydWN0IG1lbV9jaHVuayBjaHVua1tdKTsKIAotI2lmZGVmIENPTkZJR19TMzkwX1NXSVRDSF9BTU9ERQotZXh0ZXJuIHVuc2lnbmVkIGludCBzd2l0Y2hfYW1vZGU7Ci0jZWxzZQotI2RlZmluZSBzd2l0Y2hfYW1vZGUJKDApCi0jZW5kaWYKKyNkZWZpbmUgUFJJTUFSWV9TUEFDRV9NT0RFCTAKKyNkZWZpbmUgQUNDRVNTX1JFR0lTVEVSX01PREUJMQorI2RlZmluZSBTRUNPTkRBUllfU1BBQ0VfTU9ERQkyCisjZGVmaW5lIEhPTUVfU1BBQ0VfTU9ERQkJMwogCi0jaWZkZWYgQ09ORklHX1MzOTBfRVhFQ19QUk9URUNUCi1leHRlcm4gdW5zaWduZWQgaW50IHMzOTBfbm9leGVjOwotI2Vsc2UKLSNkZWZpbmUgczM5MF9ub2V4ZWMJKDApCi0jZW5kaWYKK2V4dGVybiB1bnNpZ25lZCBpbnQgdXNlcl9tb2RlOwogCiAvKgogICogTWFjaGluZSBmZWF0dXJlcyBkZXRlY3RlZCBpbiBoZWFkLlMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCBhODY4YjI3Li4yYWIxMTQxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC0xLDU3ICsxLDIyIEBACiAvKgotICogIGluY2x1ZGUvYXNtLXMzOTAvc21wLmgKLSAqCi0gKiAgUzM5MCB2ZXJzaW9uCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pLAotICogICAgICAgICAgICAgICBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCi0gKiAgICAgICAgICAgICAgIEhlaWtvIENhcnN0ZW5zIChoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tKQorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk5LDIwMDkKKyAqICAgIEF1dGhvcihzKTogRGVuaXMgSm9zZXBoIEJhcnJvdywKKyAqCQkgTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPiwKKyAqCQkgSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+LAogICovCiAjaWZuZGVmIF9fQVNNX1NNUF9ICiAjZGVmaW5lIF9fQVNNX1NNUF9ICiAKLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2lmZGVmIENPTkZJR19TTVAKIAotI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChDT05GSUdfU01QKSAmJiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCi0KLSNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgotI2luY2x1ZGUgPGFzbS9zaWdwLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotLyoKLSAgczM5MCBzcGVjaWZpYyBzbXAuYyBoZWFkZXJzCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0JaW50ICAgICAgICBpbnRyZXN0aW5nOwotCXNpZ3BfY2NvZGUgY2NvZGU7IAotCV9fdTMyICAgICAgc3RhdHVzOwotCV9fdTE2ICAgICAgY3B1OwotfSBzaWdwX2luZm87CisjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KIAogZXh0ZXJuIHZvaWQgbWFjaGluZV9yZXN0YXJ0X3NtcChjaGFyICopOwogZXh0ZXJuIHZvaWQgbWFjaGluZV9oYWx0X3NtcCh2b2lkKTsKIGV4dGVybiB2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmX3NtcCh2b2lkKTsKIAotI2RlZmluZSBOT19QUk9DX0lECQkweEZGCQkvKiBObyBwcm9jZXNzb3IgbWFnaWMgbWFya2VyICovCi0KLS8qCi0gKglUaGlzIG1hZ2ljIGNvbnN0YW50IGNvbnRyb2xzIG91ciB3aWxsaW5nbmVzcyB0byB0cmFuc2ZlcgotICoJYSBwcm9jZXNzIGFjcm9zcyBDUFVzLiBTdWNoIGEgdHJhbnNmZXIgaW5jdXJzIG1pc3NlcyBvbiB0aGUgTDEKLSAqCWNhY2hlLCBhbmQgb24gYSBQNiBvciBQNSB3aXRoIG11bHRpcGxlIEwyIGNhY2hlcyBMMiBoaXRzLiBNeQotICoJZ3V0IGZlZWxpbmcgaXMgdGhpcyB3aWxsIHZhcnkgYnkgYm9hcmQgaW4gdmFsdWUuIEZvciBhIGJvYXJkCi0gKgl3aXRoIHNlcGFyYXRlIEwyIGNhY2hlIGl0IHByb2JhYmx5IGRlcGVuZHMgYWxzbyBvbiB0aGUgUlNTLCBhbmQKLSAqCWZvciBhIGJvYXJkIHdpdGggc2hhcmVkIEwyIGNhY2hlIGl0IG91Z2h0IHRvIGRlY2F5IGZhc3QgYXMgb3RoZXIKLSAqCXByb2Nlc3NlcyBhcmUgcnVuLgotICovCi0gCi0jZGVmaW5lIFBST0NfQ0hBTkdFX1BFTkFMVFkJMjAJCS8qIFNjaGVkdWxlIHBlbmFsdHkgKi8KLQogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpCShTMzkwX2xvd2NvcmUuY3B1X25yKQotI2RlZmluZSBjcHVfbG9naWNhbF9tYXAoY3B1KQkoY3B1KQogCiBleHRlcm4gaW50IF9fY3B1X2Rpc2FibGUgKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19jcHVfZGllICh1bnNpZ25lZCBpbnQgY3B1KTsKQEAgLTY0LDcgKzI5LDkgQEAKIGV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSk7CiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CiAKLSNlbmRpZgorZXh0ZXJuIHVuaW9uIHNhdmVfYXJlYSAqemZjcGR1bXBfc2F2ZV9hcmVhc1tOUl9DUFVTICsgMV07CisKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIGV4dGVybiBpbnQgc21wX3Jlc2Nhbl9jcHVzKHZvaWQpOwpAQCAtNzIsNSArMzksNCBAQAogc3RhdGljIGlubGluZSBpbnQgc21wX3Jlc2Nhbl9jcHVzKHZvaWQpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCi1leHRlcm4gdW5pb24gc2F2ZV9hcmVhICp6ZmNwZHVtcF9zYXZlX2FyZWFzW05SX0NQVVMgKyAxXTsKLSNlbmRpZgorI2VuZGlmIC8qIF9fQVNNX1NNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc29ja2lvcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NvY2tpb3MuaAppbmRleCBmNGZjMTZjLi42ZjYwZWVlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc29ja2lvcy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zb2NraW9zLmgKQEAgLTEsMjEgKzEsNiBAQAotLyoKLSAqICBpbmNsdWRlL2FzbS1zMzkwL3NvY2tpb3MuaAotICoKLSAqICBTMzkwIHZlcnNpb24KLSAqCi0gKiAgRGVyaXZlZCBmcm9tICJpbmNsdWRlL2FzbS1pMzg2L3NvY2tpb3MuaCIKLSAqLworI2lmbmRlZiBfQVNNX1MzOTBfU09DS0lPU19ICisjZGVmaW5lIF9BU01fUzM5MF9TT0NLSU9TX0gKIAotI2lmbmRlZiBfX0FSQ0hfUzM5MF9TT0NLSU9TX18KLSNkZWZpbmUgX19BUkNIX1MzOTBfU09DS0lPU19fCi0KLS8qIFNvY2tldC1sZXZlbCBJL08gY29udHJvbCBjYWxscy4gKi8KLSNkZWZpbmUgRklPU0VUT1dOIAkweDg5MDEKLSNkZWZpbmUgU0lPQ1NQR1JQCTB4ODkwMgotI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCi0jZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKLSNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KLSNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zb2NraW9zLmg+CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGVybWJpdHMuaAppbmRleCA1ODczMTg1Li43MWJmNmFjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGVybWJpdHMuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGVybWJpdHMuaApAQCAtMSwyMDYgKzEsNiBAQAotLyoKLSAqICBpbmNsdWRlL2FzbS1zMzkwL3Rlcm1iaXRzLmgKLSAqCi0gKiAgUzM5MCB2ZXJzaW9uCi0gKgotICogIERlcml2ZWQgZnJvbSAiaW5jbHVkZS9hc20taTM4Ni90ZXJtYml0cy5oIgotICovCisjaWZuZGVmIF9BU01fUzM5MF9URVJNQklUU19ICisjZGVmaW5lIF9BU01fUzM5MF9URVJNQklUU19ICiAKLSNpZm5kZWYgX19BUkNIX1MzOTBfVEVSTUJJVFNfSF9fCi0jZGVmaW5lIF9fQVJDSF9TMzkwX1RFUk1CSVRTX0hfXwotCi0jaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCWNjX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludAlzcGVlZF90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJdGNmbGFnX3Q7Ci0KLSNkZWZpbmUgTkNDUyAxOQotc3RydWN0IHRlcm1pb3MgewotCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCi0JdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCi0JdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLwotCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCi0JY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCi0JY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCi19OwotCi1zdHJ1Y3QgdGVybWlvczIgewotCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCi0JdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCi0JdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLwotCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCi0JY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCi0JY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCi0Jc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCi0Jc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLwotfTsKLQotc3RydWN0IGt0ZXJtaW9zIHsKLQl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLwotCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLwotCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KLQl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLwotCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLwotCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwotCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLwotCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KLX07Ci0KLS8qIGNfY2MgY2hhcmFjdGVycyAqLwotI2RlZmluZSBWSU5UUiAwCi0jZGVmaW5lIFZRVUlUIDEKLSNkZWZpbmUgVkVSQVNFIDIKLSNkZWZpbmUgVktJTEwgMwotI2RlZmluZSBWRU9GIDQKLSNkZWZpbmUgVlRJTUUgNQotI2RlZmluZSBWTUlOIDYKLSNkZWZpbmUgVlNXVEMgNwotI2RlZmluZSBWU1RBUlQgOAotI2RlZmluZSBWU1RPUCA5Ci0jZGVmaW5lIFZTVVNQIDEwCi0jZGVmaW5lIFZFT0wgMTEKLSNkZWZpbmUgVlJFUFJJTlQgMTIKLSNkZWZpbmUgVkRJU0NBUkQgMTMKLSNkZWZpbmUgVldFUkFTRSAxNAotI2RlZmluZSBWTE5FWFQgMTUKLSNkZWZpbmUgVkVPTDIgMTYKLQotLyogY19pZmxhZyBiaXRzICovCi0jZGVmaW5lIElHTkJSSwkwMDAwMDAxCi0jZGVmaW5lIEJSS0lOVAkwMDAwMDAyCi0jZGVmaW5lIElHTlBBUgkwMDAwMDA0Ci0jZGVmaW5lIFBBUk1SSwkwMDAwMDEwCi0jZGVmaW5lIElOUENLCTAwMDAwMjAKLSNkZWZpbmUgSVNUUklQCTAwMDAwNDAKLSNkZWZpbmUgSU5MQ1IJMDAwMDEwMAotI2RlZmluZSBJR05DUgkwMDAwMjAwCi0jZGVmaW5lIElDUk5MCTAwMDA0MDAKLSNkZWZpbmUgSVVDTEMJMDAwMTAwMAotI2RlZmluZSBJWE9OCTAwMDIwMDAKLSNkZWZpbmUgSVhBTlkJMDAwNDAwMAotI2RlZmluZSBJWE9GRgkwMDEwMDAwCi0jZGVmaW5lIElNQVhCRUwJMDAyMDAwMAotI2RlZmluZSBJVVRGOAkwMDQwMDAwCi0KLS8qIGNfb2ZsYWcgYml0cyAqLwotI2RlZmluZSBPUE9TVAkwMDAwMDAxCi0jZGVmaW5lIE9MQ1VDCTAwMDAwMDIKLSNkZWZpbmUgT05MQ1IJMDAwMDAwNAotI2RlZmluZSBPQ1JOTAkwMDAwMDEwCi0jZGVmaW5lIE9OT0NSCTAwMDAwMjAKLSNkZWZpbmUgT05MUkVUCTAwMDAwNDAKLSNkZWZpbmUgT0ZJTEwJMDAwMDEwMAotI2RlZmluZSBPRkRFTAkwMDAwMjAwCi0jZGVmaW5lIE5MRExZCTAwMDA0MDAKLSNkZWZpbmUgICBOTDAJMDAwMDAwMAotI2RlZmluZSAgIE5MMQkwMDAwNDAwCi0jZGVmaW5lIENSRExZCTAwMDMwMDAKLSNkZWZpbmUgICBDUjAJMDAwMDAwMAotI2RlZmluZSAgIENSMQkwMDAxMDAwCi0jZGVmaW5lICAgQ1IyCTAwMDIwMDAKLSNkZWZpbmUgICBDUjMJMDAwMzAwMAotI2RlZmluZSBUQUJETFkJMDAxNDAwMAotI2RlZmluZSAgIFRBQjAJMDAwMDAwMAotI2RlZmluZSAgIFRBQjEJMDAwNDAwMAotI2RlZmluZSAgIFRBQjIJMDAxMDAwMAotI2RlZmluZSAgIFRBQjMJMDAxNDAwMAotI2RlZmluZSAgIFhUQUJTCTAwMTQwMDAKLSNkZWZpbmUgQlNETFkJMDAyMDAwMAotI2RlZmluZSAgIEJTMAkwMDAwMDAwCi0jZGVmaW5lICAgQlMxCTAwMjAwMDAKLSNkZWZpbmUgVlRETFkJMDA0MDAwMAotI2RlZmluZSAgIFZUMAkwMDAwMDAwCi0jZGVmaW5lICAgVlQxCTAwNDAwMDAKLSNkZWZpbmUgRkZETFkJMDEwMDAwMAotI2RlZmluZSAgIEZGMAkwMDAwMDAwCi0jZGVmaW5lICAgRkYxCTAxMDAwMDAKLQotLyogY19jZmxhZyBiaXQgbWVhbmluZyAqLwotI2RlZmluZSBDQkFVRAkwMDEwMDE3Ci0jZGVmaW5lICBCMAkwMDAwMDAwCQkvKiBoYW5nIHVwICovCi0jZGVmaW5lICBCNTAJMDAwMDAwMQotI2RlZmluZSAgQjc1CTAwMDAwMDIKLSNkZWZpbmUgIEIxMTAJMDAwMDAwMwotI2RlZmluZSAgQjEzNAkwMDAwMDA0Ci0jZGVmaW5lICBCMTUwCTAwMDAwMDUKLSNkZWZpbmUgIEIyMDAJMDAwMDAwNgotI2RlZmluZSAgQjMwMAkwMDAwMDA3Ci0jZGVmaW5lICBCNjAwCTAwMDAwMTAKLSNkZWZpbmUgIEIxMjAwCTAwMDAwMTEKLSNkZWZpbmUgIEIxODAwCTAwMDAwMTIKLSNkZWZpbmUgIEIyNDAwCTAwMDAwMTMKLSNkZWZpbmUgIEI0ODAwCTAwMDAwMTQKLSNkZWZpbmUgIEI5NjAwCTAwMDAwMTUKLSNkZWZpbmUgIEIxOTIwMAkwMDAwMDE2Ci0jZGVmaW5lICBCMzg0MDAJMDAwMDAxNwotI2RlZmluZSBFWFRBIEIxOTIwMAotI2RlZmluZSBFWFRCIEIzODQwMAotI2RlZmluZSBDU0laRQkwMDAwMDYwCi0jZGVmaW5lICAgQ1M1CTAwMDAwMDAKLSNkZWZpbmUgICBDUzYJMDAwMDAyMAotI2RlZmluZSAgIENTNwkwMDAwMDQwCi0jZGVmaW5lICAgQ1M4CTAwMDAwNjAKLSNkZWZpbmUgQ1NUT1BCCTAwMDAxMDAKLSNkZWZpbmUgQ1JFQUQJMDAwMDIwMAotI2RlZmluZSBQQVJFTkIJMDAwMDQwMAotI2RlZmluZSBQQVJPREQJMDAwMTAwMAotI2RlZmluZSBIVVBDTAkwMDAyMDAwCi0jZGVmaW5lIENMT0NBTAkwMDA0MDAwCi0jZGVmaW5lIENCQVVERVggMDAxMDAwMAotI2RlZmluZSAgQk9USEVSICAwMDEwMDAwCi0jZGVmaW5lICBCNTc2MDAgIDAwMTAwMDEKLSNkZWZpbmUgIEIxMTUyMDAgMDAxMDAwMgotI2RlZmluZSAgQjIzMDQwMCAwMDEwMDAzCi0jZGVmaW5lICBCNDYwODAwIDAwMTAwMDQKLSNkZWZpbmUgICBCNTAwMDAwIDAwMTAwMDUKLSNkZWZpbmUgICBCNTc2MDAwIDAwMTAwMDYKLSNkZWZpbmUgICBCOTIxNjAwIDAwMTAwMDcKLSNkZWZpbmUgIEIxMDAwMDAwIDAwMTAwMTAKLSNkZWZpbmUgIEIxMTUyMDAwIDAwMTAwMTEKLSNkZWZpbmUgIEIxNTAwMDAwIDAwMTAwMTIKLSNkZWZpbmUgIEIyMDAwMDAwIDAwMTAwMTMKLSNkZWZpbmUgIEIyNTAwMDAwIDAwMTAwMTQKLSNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKLSNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKLSNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwotI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KLSNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCi0KLSNkZWZpbmUgSUJTSElGVAkgIDE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLwotCi0vKiBjX2xmbGFnIGJpdHMgKi8KLSNkZWZpbmUgSVNJRwkwMDAwMDAxCi0jZGVmaW5lIElDQU5PTgkwMDAwMDAyCi0jZGVmaW5lIFhDQVNFCTAwMDAwMDQKLSNkZWZpbmUgRUNITwkwMDAwMDEwCi0jZGVmaW5lIEVDSE9FCTAwMDAwMjAKLSNkZWZpbmUgRUNIT0sJMDAwMDA0MAotI2RlZmluZSBFQ0hPTkwJMDAwMDEwMAotI2RlZmluZSBOT0ZMU0gJMDAwMDIwMAotI2RlZmluZSBUT1NUT1AJMDAwMDQwMAotI2RlZmluZSBFQ0hPQ1RMCTAwMDEwMDAKLSNkZWZpbmUgRUNIT1BSVAkwMDAyMDAwCi0jZGVmaW5lIEVDSE9LRQkwMDA0MDAwCi0jZGVmaW5lIEZMVVNITwkwMDEwMDAwCi0jZGVmaW5lIFBFTkRJTgkwMDQwMDAwCi0jZGVmaW5lIElFWFRFTgkwMTAwMDAwCi0KLS8qIHRjZmxvdygpIGFuZCBUQ1hPTkMgdXNlIHRoZXNlICovCi0jZGVmaW5lCVRDT09GRgkJMAotI2RlZmluZQlUQ09PTgkJMQotI2RlZmluZQlUQ0lPRkYJCTIKLSNkZWZpbmUJVENJT04JCTMKLQotLyogdGNmbHVzaCgpIGFuZCBUQ0ZMU0ggdXNlIHRoZXNlICovCi0jZGVmaW5lCVRDSUZMVVNICTAKLSNkZWZpbmUJVENPRkxVU0gJMQotI2RlZmluZQlUQ0lPRkxVU0gJMgotCi0vKiB0Y3NldGF0dHIgdXNlcyB0aGVzZSAqLwotI2RlZmluZQlUQ1NBTk9XCQkwCi0jZGVmaW5lCVRDU0FEUkFJTgkxCi0jZGVmaW5lCVRDU0FGTFVTSAkyCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWJpdHMuaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdG9kY2xrLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdG9kY2xrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjYyMDUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RvZGNsay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIEZpbGUuLi4uLi4uLi4uLjogbGludXgvaW5jbHVkZS9hc20vdG9kY2xrLmgKLSAqIEF1dGhvcihzKS4uLi4uLjogSG9sZ2VyIFNtb2xpbnNraSA8SG9sZ2VyLlNtb2xpbnNraUBkZS5pYm0uY29tPgotICogQnVncmVwb3J0cy50by4uOiA8TGludXgzOTBAZGUuaWJtLmNvbT4KLSAqIChDKSBJQk0gQ29ycG9yYXRpb24sIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCAxOTk5LDIwMDAKLSAqCi0gKiBIaXN0b3J5IG9mIGNoYW5nZXMgKHN0YXJ0cyBKdWx5IDIwMDApCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9UT0RDTEtfSAotI2RlZmluZSBfX0FTTV9UT0RDTEtfSAotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jZGVmaW5lIFRPRF91U0VDICgweDEwMDBVTEwpCi0jZGVmaW5lIFRPRF9tU0VDICgxMDAwICogVE9EX3VTRUMpCi0jZGVmaW5lIFRPRF9TRUMgKDEwMDAgKiBUT0RfbVNFQykKLSNkZWZpbmUgVE9EX01JTiAoNjAgKiBUT0RfU0VDKQotI2RlZmluZSBUT0RfSE9VUiAoNjAgKiBUT0RfTUlOKQotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA4Mzc3ZTkxLi5jYmYwYTg3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTkzLDYgKzkzLDggQEAKIGV4dGVybiBzdHJ1Y3QgdWFjY2Vzc19vcHMgdWFjY2Vzc19tdmNvc19zd2l0Y2g7CiBleHRlcm4gc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3NfcHQ7CiAKK2V4dGVybiBpbnQgX19oYW5kbGVfZmF1bHQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKKwogc3RhdGljIGlubGluZSBpbnQgX19wdXRfdXNlcl9mbihzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCAqeCkKIHsKIAlzaXplID0gdWFjY2Vzcy5jb3B5X3RvX3VzZXJfc21hbGwoc2l6ZSwgcHRyLCB4KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IGM3YmU4ZTEuLjY4M2Y2MzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNDQsNiArNDQsNyBAQAogb2JqLSQoQ09ORklHX0ZVTkNUSU9OX1RSQUNFUikJKz0gJChpZiAkKENPTkZJR182NEJJVCksbWNvdW50NjQubyxtY291bnQubykKIG9iai0kKENPTkZJR19EWU5BTUlDX0ZUUkFDRSkJKz0gZnRyYWNlLm8KIG9iai0kKENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIpICs9IGZ0cmFjZS5vCitvYmotJChDT05GSUdfRlRSQUNFX1NZU0NBTExTKSAgKz0gZnRyYWNlLm8KIAogIyBLZXhlYyBwYXJ0CiBTMzkwX0tFWEVDX09CSlMgOj0gbWFjaGluZV9rZXhlYy5vIGNyYXNoLm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IGZkYTFhODEuLjI1YzMxZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtMzEsMTQgKzMxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zaG0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgotI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaCBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmgKaW5kZXggNDVlOTA5Mi4uY2I5N2FmYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaAorKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5oCkBAIC00LDEwICs0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL2V4cG9ydC5oPgogCiAvKiBNYWNybyB0aGF0IG1hc2tzIHRoZSBoaWdoIG9yZGVyIGJpdCBvZiBhbiAzMiBiaXQgcG9pbnRlciBhbmQgY29udmVydHMgaXQqLwogLyogICAgICAgdG8gYSA2NCBiaXQgcG9pbnRlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKaW5kZXggNmEyNTA4MC4uZDk4NGEyYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCkBAIC04Myw2ICs4Myw4IEBACiAJc2xyCSVyMCwlcjAgCQkjIHNldCBjcHVpZCB0byB6ZXJvCiAJc2lncAklcjEsJXIwLDB4MTIJCSMgc3dpdGNoIHRvIGVzYW1lIG1vZGUKIAlzYW02NAkJCQkjIHN3aXRjaCB0byA2NCBiaXQgbW9kZQorCWxsZ2ZyCSVyMTMsJXIxMwkJIyBjbGVhciBoaWdoLW9yZGVyIGhhbGYgb2YgYmFzZSByZWcKKwlsbWgJJXIwLCVyMTUsLkx6ZXJvNjQtLkxQRzEoJXIxMykJIyBjbGVhciBoaWdoLW9yZGVyIGhhbGYKIAlsY3RsZwklYzAsJWMxNSwuTGN0bC0uTFBHMSglcjEzKQkjIGxvYWQgY29udHJvbCByZWdpc3RlcnMKIAlsZwklcjEyLC5McGFybWFkZHItLkxQRzEoJXIxMykJIyBwb2ludGVyIHRvIHBhcmFtZXRlciBhcmVhCiAJCQkJCSMgbW92ZSBJUEwgZGV2aWNlIHRvIGxvd2NvcmUKQEAgLTEyNyw2ICsxMjksNyBAQAogLkw0bWFsaWduOi5xdWFkIDB4ZmZmZmZmZmZmZmMwMDAwMAogLkxzY2FuMmc6LnF1YWQJMHg4MDAwMDAwMCArIDB4MjAwMDAgLSA4CSMgMkdCICsgMTI4SyAtIDgKIC5Mbm9wOgkubG9uZwkweDA3MDAwNzAwCisuTHplcm82NDouZmlsbAkxNiw0LDB4MAogI2lmZGVmIENPTkZJR19aRkNQRFVNUAogLkxjdXJyZW50X2NwdToKIAkubG9uZyAweDAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCAwNjE0NzlmLi4wNjYzMjg3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC0zMDUsOSArMzA1LDggQEAKIH0KIGVhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZV9tZW0pOwogCi0jaWZkZWYgQ09ORklHX1MzOTBfU1dJVENIX0FNT0RFCi11bnNpZ25lZCBpbnQgc3dpdGNoX2Ftb2RlID0gMDsKLUVYUE9SVF9TWU1CT0xfR1BMKHN3aXRjaF9hbW9kZSk7Cit1bnNpZ25lZCBpbnQgdXNlcl9tb2RlID0gSE9NRV9TUEFDRV9NT0RFOworRVhQT1JUX1NZTUJPTF9HUEwodXNlcl9tb2RlKTsKIAogc3RhdGljIGludCBzZXRfYW1vZGVfYW5kX3VhY2Nlc3ModW5zaWduZWQgbG9uZyB1c2VyX2Ftb2RlLAogCQkJCSB1bnNpZ25lZCBsb25nIHVzZXIzMl9hbW9kZSkKQEAgLTM0MCwyMyArMzM5LDI5IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3N3aXRjaF9hbW9kZShjaGFyICpwKQogewotCXN3aXRjaF9hbW9kZSA9IDE7CisJaWYgKHVzZXJfbW9kZSAhPSBTRUNPTkRBUllfU1BBQ0VfTU9ERSkKKwkJdXNlcl9tb2RlID0gUFJJTUFSWV9TUEFDRV9NT0RFOwogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oInN3aXRjaF9hbW9kZSIsIGVhcmx5X3BhcnNlX3N3aXRjaF9hbW9kZSk7CiAKLSNlbHNlIC8qIENPTkZJR19TMzkwX1NXSVRDSF9BTU9ERSAqLwotc3RhdGljIGlubGluZSBpbnQgc2V0X2Ftb2RlX2FuZF91YWNjZXNzKHVuc2lnbmVkIGxvbmcgdXNlcl9hbW9kZSwKLQkJCQkJdW5zaWduZWQgbG9uZyB1c2VyMzJfYW1vZGUpCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV91c2VyX21vZGUoY2hhciAqcCkKIHsKKwlpZiAocCAmJiBzdHJjbXAocCwgInByaW1hcnkiKSA9PSAwKQorCQl1c2VyX21vZGUgPSBQUklNQVJZX1NQQUNFX01PREU7CisjaWZkZWYgQ09ORklHX1MzOTBfRVhFQ19QUk9URUNUCisJZWxzZSBpZiAocCAmJiBzdHJjbXAocCwgInNlY29uZGFyeSIpID09IDApCisJCXVzZXJfbW9kZSA9IFNFQ09OREFSWV9TUEFDRV9NT0RFOworI2VuZGlmCisJZWxzZSBpZiAoIXAgfHwgc3RyY21wKHAsICJob21lIikgPT0gMCkKKwkJdXNlcl9tb2RlID0gSE9NRV9TUEFDRV9NT0RFOworCWVsc2UKKwkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1MzOTBfU1dJVENIX0FNT0RFICovCitlYXJseV9wYXJhbSgidXNlcl9tb2RlIiwgZWFybHlfcGFyc2VfdXNlcl9tb2RlKTsKIAogI2lmZGVmIENPTkZJR19TMzkwX0VYRUNfUFJPVEVDVAotdW5zaWduZWQgaW50IHMzOTBfbm9leGVjID0gMDsKLUVYUE9SVF9TWU1CT0xfR1BMKHMzOTBfbm9leGVjKTsKLQogLyoKICAqIEVuYWJsZSBleGVjdXRlIHByb3RlY3Rpb24/CiAgKi8KQEAgLTM2NCw4ICszNjksNyBAQAogewogCWlmICghc3RybmNtcChwLCAib2ZmIiwgMykpCiAJCXJldHVybiAwOwotCXN3aXRjaF9hbW9kZSA9IDE7Ci0JczM5MF9ub2V4ZWMgPSAxOworCXVzZXJfbW9kZSA9IFNFQ09OREFSWV9TUEFDRV9NT0RFOwogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oIm5vZXhlYyIsIGVhcmx5X3BhcnNlX25vZXhlYyk7CkBAIC0zNzMsNyArMzc3LDcgQEAKIAogc3RhdGljIHZvaWQgc2V0dXBfYWRkcmVzc2luZ19tb2RlKHZvaWQpCiB7Ci0JaWYgKHMzOTBfbm9leGVjKSB7CisJaWYgKHVzZXJfbW9kZSA9PSBTRUNPTkRBUllfU1BBQ0VfTU9ERSkgewogCQlpZiAoc2V0X2Ftb2RlX2FuZF91YWNjZXNzKFBTV19BU0NfU0VDT05EQVJZLAogCQkJCQkgIFBTVzMyX0FTQ19TRUNPTkRBUlkpKQogCQkJcHJfaW5mbygiRXhlY3V0ZSBwcm90ZWN0aW9uIGFjdGl2ZSwgIgpAQCAtMzgxLDcgKzM4NSw3IEBACiAJCWVsc2UKIAkJCXByX2luZm8oIkV4ZWN1dGUgcHJvdGVjdGlvbiBhY3RpdmUsICIKIAkJCQkibXZjb3Mgbm90IGF2YWlsYWJsZVxuIik7Ci0JfSBlbHNlIGlmIChzd2l0Y2hfYW1vZGUpIHsKKwl9IGVsc2UgaWYgKHVzZXJfbW9kZSA9PSBQUklNQVJZX1NQQUNFX01PREUpIHsKIAkJaWYgKHNldF9hbW9kZV9hbmRfdWFjY2VzcyhQU1dfQVNDX1BSSU1BUlksIFBTVzMyX0FTQ19QUklNQVJZKSkKIAkJCXByX2luZm8oIkFkZHJlc3Mgc3BhY2VzIHN3aXRjaGVkLCAiCiAJCQkJIm12Y29zIGF2YWlsYWJsZVxuIik7CkBAIC00MTEsNyArNDE1LDcgQEAKIAlsYy0+cmVzdGFydF9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CiAJbGMtPnJlc3RhcnRfcHN3LmFkZHIgPQogCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSByZXN0YXJ0X2ludF9oYW5kbGVyOwotCWlmIChzd2l0Y2hfYW1vZGUpCisJaWYgKHVzZXJfbW9kZSAhPSBIT01FX1NQQUNFX01PREUpCiAJCWxjLT5yZXN0YXJ0X3Bzdy5tYXNrIHw9IFBTV19BU0NfSE9NRTsKIAlsYy0+ZXh0ZXJuYWxfbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzOwogCWxjLT5leHRlcm5hbF9uZXdfcHN3LmFkZHIgPQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCA2OGUxZWNmLi42NTA2NWFjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJc3cwID0gYXRvbWljX3JlYWQoc3dfcHRyKTsKIAkqY2xvY2sgPSBnZXRfY2xvY2soKTsKIAlzdzEgPSBhdG9taWNfcmVhZChzd19wdHIpOwotCXB1dF9jcHVfdmFyKGNsb2NrX3N5bmNfc3luYyk7CisJcHV0X2NwdV92YXIoY2xvY2tfc3luY193b3JkKTsKIAlpZiAoc3cwID09IHN3MSAmJiAoc3cwICYgMHg4MDAwMDAwMFUpKQogCQkvKiBTdWNjZXNzOiB0aW1lIGlzIGluIHN5bmMuICovCiAJCXJldHVybiAwOwpAQCAtMzg1LDcgKzM4NSw3IEBACiAKIAlzd19wdHIgPSAmZ2V0X2NwdV92YXIoY2xvY2tfc3luY193b3JkKTsKIAlyYyA9IChhdG9taWNfcmVhZChzd19wdHIpICYgMHg4MDAwMDAwMFUpICE9IDA7Ci0JcHV0X2NwdV92YXIoY2xvY2tfc3luY19zeW5jKTsKKwlwdXRfY3B1X3ZhcihjbG9ja19zeW5jX3dvcmQpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3MzOTAva2VybmVsL3Zkc28uYwppbmRleCBhZGZiMzJhLi41Zjk5ZTY2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Zkc28uYwpAQCAtODYsNyArODYsOCBAQAogCXVuc2lnbmVkIGludCBmYWNpbGl0eV9saXN0OwogCiAJZmFjaWxpdHlfbGlzdCA9IHN0ZmwoKTsKLQl2ZC0+ZWN0Z19hdmFpbGFibGUgPSBzd2l0Y2hfYW1vZGUgJiYgKGZhY2lsaXR5X2xpc3QgJiAxKTsKKwl2ZC0+ZWN0Z19hdmFpbGFibGUgPQorCQl1c2VyX21vZGUgIT0gSE9NRV9TUEFDRV9NT0RFICYmIChmYWNpbGl0eV9saXN0ICYgMSk7CiB9CiAKICNpZmRlZiBDT05GSUdfNjRCSVQKQEAgLTExNCw3ICsxMTUsNyBAQAogCiAJbG93Y29yZS0+dmRzb19wZXJfY3B1X2RhdGEgPSBfX0xDX1BBU1RFOwogCi0JaWYgKCFzd2l0Y2hfYW1vZGUgfHwgIXZkc29fZW5hYmxlZCkKKwlpZiAodXNlcl9tb2RlID09IEhPTUVfU1BBQ0VfTU9ERSB8fCAhdmRzb19lbmFibGVkKQogCQlyZXR1cm4gMDsKIAogCXNlZ21lbnRfdGFibGUgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFNFR01FTlRfT1JERVIpOwpAQCAtMTYwLDcgKzE2MSw3IEBACiAJdW5zaWduZWQgbG9uZyBzZWdtZW50X3RhYmxlLCBwYWdlX3RhYmxlLCBwYWdlX2ZyYW1lOwogCXUzMiAqcHNhbCwgKmFzdGU7CiAKLQlpZiAoIXN3aXRjaF9hbW9kZSB8fCAhdmRzb19lbmFibGVkKQorCWlmICh1c2VyX21vZGUgPT0gSE9NRV9TUEFDRV9NT0RFIHx8ICF2ZHNvX2VuYWJsZWQpCiAJCXJldHVybjsKIAogCXBzYWwgPSAodTMyICopKGFkZHJfdCkgbG93Y29yZS0+cGFzdGVbNF07CkBAIC0xODQsNyArMTg1LDcgQEAKIAogc3RhdGljIHZvaWQgdmRzb19pbml0X2NyNSh2b2lkKQogewotCWlmIChzd2l0Y2hfYW1vZGUgJiYgdmRzb19lbmFibGVkKQorCWlmICh1c2VyX21vZGUgIT0gSE9NRV9TUEFDRV9NT0RFICYmIHZkc29fZW5hYmxlZCkKIAkJb25fZWFjaF9jcHUoX192ZHNvX2luaXRfY3I1LCBOVUxMLCAxKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vS2NvbmZpZyBiL2FyY2gvczM5MC9rdm0vS2NvbmZpZwppbmRleCBiZjE2NGZjLi42ZWU1NWFlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL2t2bS9LY29uZmlnCkBAIC0yMCw3ICsyMCw2IEBACiAJZGVwZW5kcyBvbiBIQVZFX0tWTSAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgUFJFRU1QVF9OT1RJRklFUlMKIAlzZWxlY3QgQU5PTl9JTk9ERVMKLQlzZWxlY3QgUzM5MF9TV0lUQ0hfQU1PREUKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGhvc3RpbmcgcGFyYXZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzIHVzaW5nIHRoZSBTSUUKIAkgIHZpcnR1YWxpemF0aW9uIGNhcGFiaWxpdHkgb24gdGhlIG1haW5mcmFtZS4gVGhpcyBzaG91bGQgd29yawpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwppbmRleCA1OGRhM2Y0Li42MDQ1NWYxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwpAQCAtMTYyLDcgKzE2Miw2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLSNpZmRlZiBDT05GSUdfUzM5MF9TV0lUQ0hfQU1PREUKIHN0YXRpYyBzaXplX3Qgc3Rybmxlbl91c2VyX212Y29zKHNpemVfdCBjb3VudCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYykKIHsKIAljaGFyIGJ1ZlsyNTZdOwpAQCAtMjAwLDcgKzE5OSw2IEBACiAJfSB3aGlsZSAoKGxlbl9zdHIgPT0gbGVuKSAmJiAoZG9uZSA8IGNvdW50KSk7CiAJcmV0dXJuIGRvbmU7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1MzOTBfU1dJVENIX0FNT0RFICovCiAKIHN0cnVjdCB1YWNjZXNzX29wcyB1YWNjZXNzX212Y29zID0gewogCS5jb3B5X2Zyb21fdXNlciA9IGNvcHlfZnJvbV91c2VyX212Y29zX2NoZWNrLApAQCAtMjE1LDcgKzIxMyw2IEBACiAJLmZ1dGV4X2F0b21pY19jbXB4Y2hnID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfc3RkLAogfTsKIAotI2lmZGVmIENPTkZJR19TMzkwX1NXSVRDSF9BTU9ERQogc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3NfbXZjb3Nfc3dpdGNoID0gewogCS5jb3B5X2Zyb21fdXNlciA9IGNvcHlfZnJvbV91c2VyX212Y29zLAogCS5jb3B5X2Zyb21fdXNlcl9zbWFsbCA9IGNvcHlfZnJvbV91c2VyX212Y29zLApAQCAtMjI4LDQgKzIyNSwzIEBACiAJLmZ1dGV4X2F0b21pY19vcCA9IGZ1dGV4X2F0b21pY19vcF9wdCwKIAkuZnV0ZXhfYXRvbWljX2NtcHhjaGcgPSBmdXRleF9hdG9taWNfY21weGNoZ19wdCwKIH07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvdWFjY2Vzc19wdC5jIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKaW5kZXggY2I1ZDU5ZS4uNDA0ZjJkZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKKysrIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKQEAgLTIzLDg2ICsyMywyMSBAQAogCiAJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcik7CiAJaWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIChwdGVfdCAqKSAweDNhOwogCiAJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOwogCWlmIChwdWRfbm9uZSgqcHVkKSB8fCB1bmxpa2VseShwdWRfYmFkKCpwdWQpKSkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAocHRlX3QgKikgMHgzYjsKIAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKIAlpZiAocG1kX25vbmUoKnBtZCkgfHwgdW5saWtlbHkocG1kX2JhZCgqcG1kKSkpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gKHB0ZV90ICopIDB4MTA7CiAKIAlyZXR1cm4gcHRlX29mZnNldF9tYXAocG1kLCBhZGRyKTsKIH0KIAotc3RhdGljIGludCBfX2hhbmRsZV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQkJICBpbnQgd3JpdGVfYWNjZXNzKQotewotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCWludCByZXQgPSAtRUZBVUxUOwotCWludCBmYXVsdDsKLQotCWlmIChpbl9hdG9taWMoKSkKLQkJcmV0dXJuIHJldDsKLQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0Jdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOwotCWlmICh1bmxpa2VseSghdm1hKSkKLQkJZ290byBvdXQ7Ci0JaWYgKHVubGlrZWx5KHZtYS0+dm1fc3RhcnQgPiBhZGRyZXNzKSkgewotCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKLQkJCWdvdG8gb3V0OwotCQlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIXdyaXRlX2FjY2VzcykgewotCQkvKiBwYWdlIG5vdCBwcmVzZW50LCBjaGVjayB2bSBmbGFncyAqLwotCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpKSkKLQkJCWdvdG8gb3V0OwotCX0gZWxzZSB7Ci0JCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLXN1cnZpdmU6Ci0JZmF1bHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgd3JpdGVfYWNjZXNzID8gRkFVTFRfRkxBR19XUklURSA6IDApOwotCWlmICh1bmxpa2VseShmYXVsdCAmIFZNX0ZBVUxUX0VSUk9SKSkgewotCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9PT00pCi0JCQlnb3RvIG91dF9vZl9tZW1vcnk7Ci0JCWVsc2UgaWYgKGZhdWx0ICYgVk1fRkFVTFRfU0lHQlVTKQotCQkJZ290byBvdXRfc2lnYnVzOwotCQlCVUcoKTsKLQl9Ci0JaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpCi0JCWN1cnJlbnQtPm1hal9mbHQrKzsKLQllbHNlCi0JCWN1cnJlbnQtPm1pbl9mbHQrKzsKLQlyZXQgPSAwOwotb3V0OgotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JcmV0dXJuIHJldDsKLQotb3V0X29mX21lbW9yeToKLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWlmIChpc19nbG9iYWxfaW5pdChjdXJyZW50KSkgewotCQl5aWVsZCgpOwotCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCWdvdG8gc3Vydml2ZTsKLQl9Ci0JcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCBjdXJyZW50LT5jb21tKTsKLQlyZXR1cm4gcmV0OwotCi1vdXRfc2lnYnVzOgotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JY3VycmVudC0+dGhyZWFkLnByb3RfYWRkciA9IGFkZHJlc3M7Ci0JY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAweDExOwotCWZvcmNlX3NpZyhTSUdCVVMsIGN1cnJlbnQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzaXplX3QgX191c2VyX2NvcHlfcHQodW5zaWduZWQgbG9uZyB1YWRkciwgdm9pZCAqa3B0ciwKLQkJCSAgICAgc2l6ZV90IG4sIGludCB3cml0ZV91c2VyKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBzaXplX3QgX191c2VyX2NvcHlfcHQodW5zaWduZWQgbG9uZyB1YWRkciwgdm9pZCAqa3B0ciwKKwkJCQkJICAgICBzaXplX3QgbiwgaW50IHdyaXRlX3VzZXIpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgcGZuLCBkb25lLCBzaXplOwpAQCAtMTE0LDEyICs0OSwxNyBAQAogCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJZG8gewogCQlwdGUgPSBmb2xsb3dfdGFibGUobW0sIHVhZGRyKTsKLQkJaWYgKCFwdGUgfHwgIXB0ZV9wcmVzZW50KCpwdGUpIHx8Ci0JCSAgICAod3JpdGVfdXNlciAmJiAhcHRlX3dyaXRlKCpwdGUpKSkKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSBwdGUgPCAweDEwMDApCiAJCQlnb3RvIGZhdWx0OworCQlpZiAoIXB0ZV9wcmVzZW50KCpwdGUpKSB7CisJCQlwdGUgPSAocHRlX3QgKikgMHgxMTsKKwkJCWdvdG8gZmF1bHQ7CisJCX0gZWxzZSBpZiAod3JpdGVfdXNlciAmJiAhcHRlX3dyaXRlKCpwdGUpKSB7CisJCQlwdGUgPSAocHRlX3QgKikgMHgwNDsKKwkJCWdvdG8gZmF1bHQ7CisJCX0KIAogCQlwZm4gPSBwdGVfcGZuKCpwdGUpOwotCiAJCW9mZnNldCA9IHVhZGRyICYgKFBBR0VfU0laRSAtIDEpOwogCQlzaXplID0gbWluKG4gLSBkb25lLCBQQUdFX1NJWkUgLSBvZmZzZXQpOwogCQlpZiAod3JpdGVfdXNlcikgewpAQCAtMTM3LDcgKzc3LDcgQEAKIAlyZXR1cm4gbiAtIGRvbmU7CiBmYXVsdDoKIAlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0JaWYgKF9faGFuZGxlX2ZhdWx0KG1tLCB1YWRkciwgd3JpdGVfdXNlcikpCisJaWYgKF9faGFuZGxlX2ZhdWx0KHVhZGRyLCAodW5zaWduZWQgbG9uZykgcHRlLCB3cml0ZV91c2VyKSkKIAkJcmV0dXJuIG4gLSBkb25lOwogCWdvdG8gcmV0cnk7CiB9CkBAIC0xNDYsMzAgKzg2LDMxIEBACiAgKiBEbyBEQVQgZm9yIHVzZXIgYWRkcmVzcyBieSBwYWdlIHRhYmxlIHdhbGssIHJldHVybiBrZXJuZWwgYWRkcmVzcy4KICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggY3VycmVudC0+bW0tPnBhZ2VfdGFibGVfbG9jayBoZWxkLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2RhdF91c2VyX2FkZHIodW5zaWduZWQgbG9uZyB1YWRkcikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBfX2RhdF91c2VyX2FkZHIodW5zaWduZWQgbG9uZyB1YWRkcikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCXVuc2lnbmVkIGxvbmcgcGZuLCByZXQ7CisJdW5zaWduZWQgbG9uZyBwZm47CiAJcHRlX3QgKnB0ZTsKIAlpbnQgcmM7CiAKLQlyZXQgPSAwOwogcmV0cnk6CiAJcHRlID0gZm9sbG93X3RhYmxlKG1tLCB1YWRkcik7Ci0JaWYgKCFwdGUgfHwgIXB0ZV9wcmVzZW50KCpwdGUpKQorCWlmICgodW5zaWduZWQgbG9uZykgcHRlIDwgMHgxMDAwKQogCQlnb3RvIGZhdWx0OworCWlmICghcHRlX3ByZXNlbnQoKnB0ZSkpIHsKKwkJcHRlID0gKHB0ZV90ICopIDB4MTE7CisJCWdvdG8gZmF1bHQ7CisJfQogCiAJcGZuID0gcHRlX3BmbigqcHRlKTsKLQlyZXQgPSAocGZuIDw8IFBBR0VfU0hJRlQpICsgKHVhZGRyICYgKFBBR0VfU0laRSAtIDEpKTsKLW91dDoKLQlyZXR1cm4gcmV0OworCXJldHVybiAocGZuIDw8IFBBR0VfU0hJRlQpICsgKHVhZGRyICYgKFBBR0VfU0laRSAtIDEpKTsKIGZhdWx0OgogCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQlyYyA9IF9faGFuZGxlX2ZhdWx0KG1tLCB1YWRkciwgMCk7CisJcmMgPSBfX2hhbmRsZV9mYXVsdCh1YWRkciwgKHVuc2lnbmVkIGxvbmcpIHB0ZSwgMCk7CiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OwotCWdvdG8gcmV0cnk7CisJaWYgKCFyYykKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gMDsKIH0KIAogc2l6ZV90IGNvcHlfZnJvbV91c2VyX3B0KHNpemVfdCBuLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdm9pZCAqdG8pCkBAIC0yMzQsOCArMTc1LDEyIEBACiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlkbyB7CiAJCXB0ZSA9IGZvbGxvd190YWJsZShtbSwgdWFkZHIpOwotCQlpZiAoIXB0ZSB8fCAhcHRlX3ByZXNlbnQoKnB0ZSkpCisJCWlmICgodW5zaWduZWQgbG9uZykgcHRlIDwgMHgxMDAwKQogCQkJZ290byBmYXVsdDsKKwkJaWYgKCFwdGVfcHJlc2VudCgqcHRlKSkgeworCQkJcHRlID0gKHB0ZV90ICopIDB4MTE7CisJCQlnb3RvIGZhdWx0OworCQl9CiAKIAkJcGZuID0gcHRlX3BmbigqcHRlKTsKIAkJb2Zmc2V0ID0gdWFkZHIgJiAoUEFHRV9TSVpFLTEpOwpAQCAtMjQ5LDkgKzE5NCw4IEBACiAJcmV0dXJuIGRvbmUgKyAxOwogZmF1bHQ6CiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCWlmIChfX2hhbmRsZV9mYXVsdChtbSwgdWFkZHIsIDApKSB7CisJaWYgKF9faGFuZGxlX2ZhdWx0KHVhZGRyLCAodW5zaWduZWQgbG9uZykgcHRlLCAwKSkKIAkJcmV0dXJuIDA7Ci0JfQogCWdvdG8gcmV0cnk7CiB9CiAKQEAgLTI4NCw3ICsyMjgsNyBAQAogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJdW5zaWduZWQgbG9uZyBvZmZzZXRfZnJvbSwgb2Zmc2V0X3RvLCBvZmZzZXRfbWF4LCBwZm5fZnJvbSwgcGZuX3RvLAotCQkgICAgICB1YWRkciwgZG9uZSwgc2l6ZTsKKwkJICAgICAgdWFkZHIsIGRvbmUsIHNpemUsIGVycm9yX2NvZGU7CiAJdW5zaWduZWQgbG9uZyB1YWRkcl9mcm9tID0gKHVuc2lnbmVkIGxvbmcpIGZyb207CiAJdW5zaWduZWQgbG9uZyB1YWRkcl90byA9ICh1bnNpZ25lZCBsb25nKSB0bzsKIAlwdGVfdCAqcHRlX2Zyb20sICpwdGVfdG87CkBAIC0yOTgsMTcgKzI0MiwyOCBAQAogcmV0cnk6CiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlkbyB7CisJCXdyaXRlX3VzZXIgPSAwOworCQl1YWRkciA9IHVhZGRyX2Zyb207CiAJCXB0ZV9mcm9tID0gZm9sbG93X3RhYmxlKG1tLCB1YWRkcl9mcm9tKTsKLQkJaWYgKCFwdGVfZnJvbSB8fCAhcHRlX3ByZXNlbnQoKnB0ZV9mcm9tKSkgewotCQkJdWFkZHIgPSB1YWRkcl9mcm9tOwotCQkJd3JpdGVfdXNlciA9IDA7CisJCWVycm9yX2NvZGUgPSAodW5zaWduZWQgbG9uZykgcHRlX2Zyb207CisJCWlmIChlcnJvcl9jb2RlIDwgMHgxMDAwKQorCQkJZ290byBmYXVsdDsKKwkJaWYgKCFwdGVfcHJlc2VudCgqcHRlX2Zyb20pKSB7CisJCQllcnJvcl9jb2RlID0gMHgxMTsKIAkJCWdvdG8gZmF1bHQ7CiAJCX0KIAorCQl3cml0ZV91c2VyID0gMTsKKwkJdWFkZHIgPSB1YWRkcl90bzsKIAkJcHRlX3RvID0gZm9sbG93X3RhYmxlKG1tLCB1YWRkcl90byk7Ci0JCWlmICghcHRlX3RvIHx8ICFwdGVfcHJlc2VudCgqcHRlX3RvKSB8fCAhcHRlX3dyaXRlKCpwdGVfdG8pKSB7Ci0JCQl1YWRkciA9IHVhZGRyX3RvOwotCQkJd3JpdGVfdXNlciA9IDE7CisJCWVycm9yX2NvZGUgPSAodW5zaWduZWQgbG9uZykgcHRlX3RvOworCQlpZiAoZXJyb3JfY29kZSA8IDB4MTAwMCkKKwkJCWdvdG8gZmF1bHQ7CisJCWlmICghcHRlX3ByZXNlbnQoKnB0ZV90bykpIHsKKwkJCWVycm9yX2NvZGUgPSAweDExOworCQkJZ290byBmYXVsdDsKKwkJfSBlbHNlIGlmICghcHRlX3dyaXRlKCpwdGVfdG8pKSB7CisJCQllcnJvcl9jb2RlID0gMHgwNDsKIAkJCWdvdG8gZmF1bHQ7CiAJCX0KIApAQCAtMzI5LDcgKzI4NCw3IEBACiAJcmV0dXJuIG4gLSBkb25lOwogZmF1bHQ6CiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCWlmIChfX2hhbmRsZV9mYXVsdChtbSwgdWFkZHIsIHdyaXRlX3VzZXIpKQorCWlmIChfX2hhbmRsZV9mYXVsdCh1YWRkciwgZXJyb3JfY29kZSwgd3JpdGVfdXNlcikpCiAJCXJldHVybiBuIC0gZG9uZTsKIAlnb3RvIHJldHJ5OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21hdGgtZW11L21hdGguYyBiL2FyY2gvczM5MC9tYXRoLWVtdS9tYXRoLmMKaW5kZXggM2VlNzhjYy4uY2Q0ZTljMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21hdGgtZW11L21hdGguYworKysgYi9hcmNoL3MzOTAvbWF0aC1lbXUvbWF0aC5jCkBAIC0yMDg4LDcgKzIwODgsNyBAQAogICAgICAgICBfX3UxNiBvcGMgPSAqKChfX3UxNiAqKSBvcGNvZGUpOwogCiAgICAgICAgIGlmICgob3BjICYgMHg5MCkgPT0gMCkgeyAgICAgICAgICAgLyogdGVzdCBpZiByeCBpbiB7MCwyLDQsNn0gKi8KLSAgICAgICAgICAgICAgICAvKiB3ZSBnb3QgYW4gZXhjZXB0aW9uIHRoZXJmb3JlIHJ5IGNhbid0IGJlIGluIHswLDIsNCw2fSAqLworICAgICAgICAgICAgICAgIC8qIHdlIGdvdCBhbiBleGNlcHRpb24gdGhlcmVmb3JlIHJ5IGNhbid0IGJlIGluIHswLDIsNCw2fSAqLwogCQlhc20gdm9sYXRpbGUoCQkvKiBsb2FkIHJ4IGZyb20gZnBfcmVncy5mcHJzW3J5XSAqLwogCQkJIglicmFzCTEsMGZcbiIKIAkJCSIJbGQJMCwwKCUxKVxuIgpAQCAtMjExOCw3ICsyMTE4LDcgQEAKICAgICAgICAgX191MTYgb3BjID0gKigoX191MTYgKikgb3Bjb2RlKTsKIAogICAgICAgICBpZiAoKG9wYyAmIDB4OTApID09IDApIHsgICAgICAgICAgIC8qIHRlc3QgaWYgcnggaW4gezAsMiw0LDZ9ICovCi0gICAgICAgICAgICAgICAgLyogd2UgZ290IGFuIGV4Y2VwdGlvbiB0aGVyZm9yZSByeSBjYW4ndCBiZSBpbiB7MCwyLDQsNn0gKi8KKyAgICAgICAgICAgICAgICAvKiB3ZSBnb3QgYW4gZXhjZXB0aW9uIHRoZXJlZm9yZSByeSBjYW4ndCBiZSBpbiB7MCwyLDQsNn0gKi8KIAkJYXNtIHZvbGF0aWxlKAkJLyogbG9hZCByeCBmcm9tIGZwX3JlZ3MuZnByc1tyeV0gKi8KIAkJCSIJYnJhcwkxLDBmXG4iCiAJCQkiCWxlCTAsMCglMSlcbiIKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9jbW0uYyBiL2FyY2gvczM5MC9tbS9jbW0uYwppbmRleCBmZjU4Nzc5Li43NmEzNjM3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vY21tLmMKKysrIGIvYXJjaC9zMzkwL21tL2NtbS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9vb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00NCw2ICs0NSw3IEBACiBzdGF0aWMgdm9sYXRpbGUgbG9uZyBjbW1fdGltZWRfcGFnZXNfdGFyZ2V0Owogc3RhdGljIGxvbmcgY21tX3RpbWVvdXRfcGFnZXM7CiBzdGF0aWMgbG9uZyBjbW1fdGltZW91dF9zZWNvbmRzOworc3RhdGljIGludCBjbW1fc3VzcGVuZGVkOwogCiBzdGF0aWMgc3RydWN0IGNtbV9wYWdlX2FycmF5ICpjbW1fcGFnZV9saXN0Owogc3RhdGljIHN0cnVjdCBjbW1fcGFnZV9hcnJheSAqY21tX3RpbWVkX3BhZ2VfbGlzdDsKQEAgLTE0Nyw5ICsxNDksOSBAQAogCiAJd2hpbGUgKDEpIHsKIAkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY21tX3RocmVhZF93YWl0LAotCQkJKGNtbV9wYWdlcyAhPSBjbW1fcGFnZXNfdGFyZ2V0IHx8Ci0JCQkgY21tX3RpbWVkX3BhZ2VzICE9IGNtbV90aW1lZF9wYWdlc190YXJnZXQgfHwKLQkJCSBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpKTsKKwkJCSghY21tX3N1c3BlbmRlZCAmJiAoY21tX3BhZ2VzICE9IGNtbV9wYWdlc190YXJnZXQgfHwKKwkJCSBjbW1fdGltZWRfcGFnZXMgIT0gY21tX3RpbWVkX3BhZ2VzX3RhcmdldCkpIHx8CisJCQkga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCByYyA9PSAtRVJFU1RBUlRTWVMpIHsKIAkJCWNtbV9wYWdlc190YXJnZXQgPSBjbW1fcGFnZXM7CiAJCQljbW1fdGltZWRfcGFnZXNfdGFyZ2V0ID0gY21tX3RpbWVkX3BhZ2VzOwpAQCAtNDEwLDYgKzQxMiwzOCBAQAogCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmNtbV9zeXNjdGxfaGVhZGVyOwogCitzdGF0aWMgaW50IGNtbV9zdXNwZW5kKHZvaWQpCit7CisJY21tX3N1c3BlbmRlZCA9IDE7CisJY21tX2ZyZWVfcGFnZXMoY21tX3BhZ2VzLCAmY21tX3BhZ2VzLCAmY21tX3BhZ2VfbGlzdCk7CisJY21tX2ZyZWVfcGFnZXMoY21tX3RpbWVkX3BhZ2VzLCAmY21tX3RpbWVkX3BhZ2VzLCAmY21tX3RpbWVkX3BhZ2VfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21tX3Jlc3VtZSh2b2lkKQoreworCWNtbV9zdXNwZW5kZWQgPSAwOworCWNtbV9raWNrX3RocmVhZCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtbV9wb3dlcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUE1fUE9TVF9ISUJFUk5BVElPTjoKKwkJcmV0dXJuIGNtbV9yZXN1bWUoKTsKKwljYXNlIFBNX0hJQkVSTkFUSU9OX1BSRVBBUkU6CisJCXJldHVybiBjbW1fc3VzcGVuZCgpOworCWRlZmF1bHQ6CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY21tX3Bvd2VyX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gY21tX3Bvd2VyX2V2ZW50LAorfTsKKwogc3RhdGljIGludAogY21tX2luaXQgKHZvaWQpCiB7CkBAIC00MTgsNyArNDUyLDcgQEAKICNpZmRlZiBDT05GSUdfQ01NX1BST0MKIAljbW1fc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShjbW1fZGlyX3RhYmxlKTsKIAlpZiAoIWNtbV9zeXNjdGxfaGVhZGVyKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfc3lzY3RsOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NNTV9JVUNWCiAJcmMgPSBzbXNnX3JlZ2lzdGVyX2NhbGxiYWNrKFNNU0dfUFJFRklYLCBjbW1fc21zZ190YXJnZXQpOwpAQCAtNDI4LDE3ICs0NjIsMjEgQEAKIAlyYyA9IHJlZ2lzdGVyX29vbV9ub3RpZmllcigmY21tX29vbV9uYik7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBvdXRfb29tX25vdGlmeTsKKwlyYyA9IHJlZ2lzdGVyX3BtX25vdGlmaWVyKCZjbW1fcG93ZXJfbm90aWZpZXIpOworCWlmIChyYykKKwkJZ290byBvdXRfcG07CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY21tX3RocmVhZF93YWl0KTsKIAlpbml0X3RpbWVyKCZjbW1fdGltZXIpOwogCWNtbV90aHJlYWRfcHRyID0ga3RocmVhZF9ydW4oY21tX3RocmVhZCwgTlVMTCwgImNtbXRocmVhZCIpOwogCXJjID0gSVNfRVJSKGNtbV90aHJlYWRfcHRyKSA/IFBUUl9FUlIoY21tX3RocmVhZF9wdHIpIDogMDsKLQlpZiAoIXJjKQotCQlnb3RvIG91dDsKLQkvKgotCSAqIGt0aHJlYWRfY3JlYXRlIGZhaWxlZC4gdW5kbyBhbGwgdGhlIHN0dWZmIGZyb20gYWJvdmUgYWdhaW4uCi0JICovCi0JdW5yZWdpc3Rlcl9vb21fbm90aWZpZXIoJmNtbV9vb21fbmIpOworCWlmIChyYykKKwkJZ290byBvdXRfa3RocmVhZDsKKwlyZXR1cm4gMDsKIAorb3V0X2t0aHJlYWQ6CisJdW5yZWdpc3Rlcl9wbV9ub3RpZmllcigmY21tX3Bvd2VyX25vdGlmaWVyKTsKK291dF9wbToKKwl1bnJlZ2lzdGVyX29vbV9ub3RpZmllcigmY21tX29vbV9uYik7CiBvdXRfb29tX25vdGlmeToKICNpZmRlZiBDT05GSUdfQ01NX0lVQ1YKIAlzbXNnX3VucmVnaXN0ZXJfY2FsbGJhY2soU01TR19QUkVGSVgsIGNtbV9zbXNnX3RhcmdldCk7CkBAIC00NDYsOCArNDg0LDggQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19DTU1fUFJPQwogCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGNtbV9zeXNjdGxfaGVhZGVyKTsKK291dF9zeXNjdGw6CiAjZW5kaWYKLW91dDoKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ1NSw2ICs0OTMsNyBAQAogY21tX2V4aXQodm9pZCkKIHsKIAlrdGhyZWFkX3N0b3AoY21tX3RocmVhZF9wdHIpOworCXVucmVnaXN0ZXJfcG1fbm90aWZpZXIoJmNtbV9wb3dlcl9ub3RpZmllcik7CiAJdW5yZWdpc3Rlcl9vb21fbm90aWZpZXIoJmNtbV9vb21fbmIpOwogCWNtbV9mcmVlX3BhZ2VzKGNtbV9wYWdlcywgJmNtbV9wYWdlcywgJmNtbV9wYWdlX2xpc3QpOwogCWNtbV9mcmVlX3BhZ2VzKGNtbV90aW1lZF9wYWdlcywgJmNtbV90aW1lZF9wYWdlcywgJmNtbV90aW1lZF9wYWdlX2xpc3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwppbmRleCA2ZDUwNzQ2Li5mYzEwMmU3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vZmF1bHQuYworKysgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwpAQCAtMzQsMTYgKzM0LDE1IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CiAjaW5jbHVkZSAiLi4va2VybmVsL2VudHJ5LmgiCiAKICNpZm5kZWYgQ09ORklHXzY0QklUCiAjZGVmaW5lIF9fRkFJTF9BRERSX01BU0sgMHg3ZmZmZjAwMAotI2RlZmluZSBfX0ZJWFVQX01BU0sgMHg3ZmZmZmZmZgogI2RlZmluZSBfX1NVQkNPREVfTUFTSyAweDAyMDAKICNkZWZpbmUgX19QRl9SRVNfRklFTEQgMFVMTAogI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIF9fRkFJTF9BRERSX01BU0sgLTQwOTZMCi0jZGVmaW5lIF9fRklYVVBfTUFTSyB+MEwKICNkZWZpbmUgX19TVUJDT0RFX01BU0sgMHgwNjAwCiAjZGVmaW5lIF9fUEZfUkVTX0ZJRUxEIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAogI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwpAQCAtNTIsMTEgKzUxLDE1IEBACiBleHRlcm4gaW50IHN5c2N0bF91c2VycHJvY2Vzc19kZWJ1ZzsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0tQUk9CRVMKLXN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKKyNkZWZpbmUgVk1fRkFVTFRfQkFEQ09OVEVYVAkweDAxMDAwMAorI2RlZmluZSBWTV9GQVVMVF9CQURNQVAJCTB4MDIwMDAwCisjZGVmaW5lIFZNX0ZBVUxUX0JBREFDQ0VTUwkweDA0MDAwMAorCitzdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgcmV0ID0gMDsKIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCiAJLyoga3Byb2JlX3J1bm5pbmcoKSBuZWVkcyBzbXBfcHJvY2Vzc29yX2lkKCkgKi8KIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkgewogCQlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTY0LDE1ICs2Nyw5IEBACiAJCQlyZXQgPSAxOwogCQlwcmVlbXB0X2VuYWJsZSgpOwogCX0KLQorI2VuZGlmCiAJcmV0dXJuIHJldDsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKIAogCiAvKgpAQCAtMTAwLDU3ICs5Nyw1MCBAQAogCiAvKgogICogUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZhdWx0LgotICogUmV0dXJucyAwIGZvciBrZXJuZWwgc3BhY2UsIDEgZm9yIHVzZXIgc3BhY2UgYW5kCi0gKiAyIGZvciBjb2RlIGV4ZWN1dGlvbiBpbiB1c2VyIHNwYWNlIHdpdGggbm9leGVjPW9uLgorICogUmV0dXJucyAwIGZvciBrZXJuZWwgc3BhY2UgYW5kIDEgZm9yIHVzZXIgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NwYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorc3RhdGljIGlubGluZSBpbnQgdXNlcl9zcGFjZV9mYXVsdCh1bnNpZ25lZCBsb25nIHRyYW5zX2V4Y19jb2RlKQogewogCS8qCi0JICogVGhlIGxvd2VzdCB0d28gYml0cyBvZiBTMzkwX2xvd2NvcmUudHJhbnNfZXhjX2NvZGUKLQkgKiBpbmRpY2F0ZSB3aGljaCBwYWdpbmcgdGFibGUgd2FzIHVzZWQuCisJICogVGhlIGxvd2VzdCB0d28gYml0cyBvZiB0aGUgdHJhbnNsYXRpb24gZXhjZXB0aW9uCisJICogaWRlbnRpZmljYXRpb24gaW5kaWNhdGUgd2hpY2ggcGFnaW5nIHRhYmxlIHdhcyB1c2VkLgogCSAqLwotCWludCBkZXNjID0gUzM5MF9sb3djb3JlLnRyYW5zX2V4Y19jb2RlICYgMzsKLQotCWlmIChkZXNjID09IDMpCS8qIEhvbWUgU2VnbWVudCBUYWJsZSBEZXNjcmlwdG9yICovCi0JCXJldHVybiBzd2l0Y2hfYW1vZGUgPT0gMDsKLQlpZiAoZGVzYyA9PSAyKQkvKiBTZWNvbmRhcnkgU2VnbWVudCBUYWJsZSBEZXNjcmlwdG9yICovCi0JCXJldHVybiB0c2stPnRocmVhZC5tbV9zZWdtZW50LmFyNDsKLSNpZmRlZiBDT05GSUdfUzM5MF9TV0lUQ0hfQU1PREUKLQlpZiAodW5saWtlbHkoZGVzYyA9PSAxKSkgeyAvKiBTVEQgZGV0ZXJtaW5lZCB2aWEgYWNjZXNzIHJlZ2lzdGVyICovCi0JCS8qICVhMCBhbHdheXMgaW5kaWNhdGVzIHByaW1hcnkgc3BhY2UuICovCi0JCWlmIChTMzkwX2xvd2NvcmUuZXhjX2FjY2Vzc19pZCAhPSAwKSB7Ci0JCQlzYXZlX2FjY2Vzc19yZWdzKHRzay0+dGhyZWFkLmFjcnMpOwotCQkJLyoKLQkJCSAqIEFuIGFsZXQgb2YgMCBpbmRpY2F0ZXMgcHJpbWFyeSBzcGFjZS4KLQkJCSAqIEFuIGFsZXQgb2YgMSBpbmRpY2F0ZXMgc2Vjb25kYXJ5IHNwYWNlLgotCQkJICogQW55IG90aGVyIGFsZXQgdmFsdWVzIGdlbmVyYXRlIGFuCi0JCQkgKiBhbGVuLXRyYW5zbGF0aW9uIGV4Y2VwdGlvbi4KLQkJCSAqLwotCQkJaWYgKHRzay0+dGhyZWFkLmFjcnNbUzM5MF9sb3djb3JlLmV4Y19hY2Nlc3NfaWRdKQotCQkJCXJldHVybiB0c2stPnRocmVhZC5tbV9zZWdtZW50LmFyNDsKLQkJfQotCX0KLSNlbmRpZgotCS8qIFByaW1hcnkgU2VnbWVudCBUYWJsZSBEZXNjcmlwdG9yICovCi0JcmV0dXJuIHN3aXRjaF9hbW9kZSA8PCBzMzkwX25vZXhlYzsKKwl0cmFuc19leGNfY29kZSAmPSAzOworCWlmICh0cmFuc19leGNfY29kZSA9PSAyKQorCQkvKiBBY2Nlc3MgdmlhIHNlY29uZGFyeSBzcGFjZSwgc2V0X2ZzIHNldHRpbmcgZGVjaWRlcyAqLworCQlyZXR1cm4gY3VycmVudC0+dGhyZWFkLm1tX3NlZ21lbnQuYXI0OworCWlmICh1c2VyX21vZGUgPT0gSE9NRV9TUEFDRV9NT0RFKQorCQkvKiBVc2VyIHNwYWNlIGlmIHRoZSBhY2Nlc3MgaGFzIGJlZW4gZG9uZSB2aWEgaG9tZSBzcGFjZS4gKi8KKwkJcmV0dXJuIHRyYW5zX2V4Y19jb2RlID09IDM7CisJLyoKKwkgKiBJZiB0aGUgdXNlciBzcGFjZSBpcyBub3QgdGhlIGhvbWUgc3BhY2UgdGhlIGtlcm5lbCBydW5zIGluIGhvbWUKKwkgKiBzcGFjZS4gQWNjZXNzIHZpYSBzZWNvbmRhcnkgc3BhY2UgaGFzIGFscmVhZHkgYmVlbiBjb3ZlcmVkLAorCSAqIGFjY2VzcyB2aWEgcHJpbWFyeSBzcGFjZSBvciBhY2Nlc3MgcmVnaXN0ZXIgaXMgZnJvbSB1c2VyIHNwYWNlCisJICogYW5kIGFjY2VzcyB2aWEgaG9tZSBzcGFjZSBpcyBmcm9tIHRoZSBrZXJuZWwuCisJICovCisJcmV0dXJuIHRyYW5zX2V4Y19jb2RlICE9IDM7CiB9CiAKIC8qCiAgKiBTZW5kIFNJR1NFR1YgdG8gdGFzay4gIFRoaXMgaXMgYW4gZXh0ZXJuYWwgcm91dGluZQogICogdG8ga2VlcCB0aGUgc3RhY2sgdXNhZ2Ugb2YgZG9fcGFnZV9mYXVsdCBzbWFsbC4KICAqLwotc3RhdGljIHZvaWQgZG9fc2lnc2VndihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLAotCQkgICAgICAgaW50IHNpX2NvZGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3N0YXRpYyBub2lubGluZSB2b2lkIGRvX3NpZ3NlZ3Yoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaW50X2NvZGUsCisJCQkJaW50IHNpX2NvZGUsIHVuc2lnbmVkIGxvbmcgdHJhbnNfZXhjX2NvZGUpCiB7CiAJc3RydWN0IHNpZ2luZm8gc2k7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCisJYWRkcmVzcyA9IHRyYW5zX2V4Y19jb2RlICYgX19GQUlMX0FERFJfTUFTSzsKKwljdXJyZW50LT50aHJlYWQucHJvdF9hZGRyID0gYWRkcmVzczsKKwljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IGludF9jb2RlOwogI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgfHwgZGVmaW5lZChDT05GSUdfUFJPQ0VTU19ERUJVRykKICNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpCiAJaWYgKHN5c2N0bF91c2VycHJvY2Vzc19kZWJ1ZykKICNlbmRpZgogCXsKIAkJcHJpbnRrKCJVc2VyIHByb2Nlc3MgZmF1bHQ6IGludGVycnVwdGlvbiBjb2RlIDB4JWxYXG4iLAotCQkgICAgICAgZXJyb3JfY29kZSk7CisJCSAgICAgICBpbnRfY29kZSk7CiAJCXByaW50aygiZmFpbGluZyBhZGRyZXNzOiAlbFhcbiIsIGFkZHJlc3MpOwogCQlzaG93X3JlZ3MocmVncyk7CiAJfQpAQCAtMTYxLDEzICsxNTEsMTQgQEAKIAlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmc2ksIGN1cnJlbnQpOwogfQogCi1zdGF0aWMgdm9pZCBkb19ub19jb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUsCi0JCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3N0YXRpYyBub2lubGluZSB2b2lkIGRvX25vX2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaW50X2NvZGUsCisJCQkJICAgdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSkKIHsKIAljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpmaXh1cDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CiAKIAkvKiBBcmUgd2UgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMga2VybmVsIGZhdWx0PyAgKi8KLQlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBzdy5hZGRyICYgX19GSVhVUF9NQVNLKTsKKwlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBzdy5hZGRyICYgUFNXX0FERFJfSU5TTik7CiAJaWYgKGZpeHVwKSB7CiAJCXJlZ3MtPnBzdy5hZGRyID0gZml4dXAtPmZpeHVwIHwgUFNXX0FERFJfQU1PREU7CiAJCXJldHVybjsKQEAgLTE3NywxMjkgKzE2OCwxNDkgQEAKIAkgKiBPb3BzLiBUaGUga2VybmVsIHRyaWVkIHRvIGFjY2VzcyBzb21lIGJhZCBwYWdlLiBXZSdsbCBoYXZlIHRvCiAJICogdGVybWluYXRlIHRoaW5ncyB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLgogCSAqLwotCWlmIChjaGVja19zcGFjZShjdXJyZW50KSA9PSAwKQorCWFkZHJlc3MgPSB0cmFuc19leGNfY29kZSAmIF9fRkFJTF9BRERSX01BU0s7CisJaWYgKCF1c2VyX3NwYWNlX2ZhdWx0KHRyYW5zX2V4Y19jb2RlKSkKIAkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBvaW50ZXIgZGVyZWZlcmVuY2UiCiAJCSAgICAgICAiIGF0IHZpcnR1YWwga2VybmVsIGFkZHJlc3MgJXBcbiIsICh2b2lkICopYWRkcmVzcyk7CiAJZWxzZQogCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiCiAJCSAgICAgICAiIGF0IHZpcnR1YWwgdXNlciBhZGRyZXNzICVwXG4iLCAodm9pZCAqKWFkZHJlc3MpOwogCi0JZGllKCJPb3BzIiwgcmVncywgZXJyb3JfY29kZSk7CisJZGllKCJPb3BzIiwgcmVncywgaW50X2NvZGUpOwogCWRvX2V4aXQoU0lHS0lMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX2xvd19hZGRyZXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBkb19sb3dfYWRkcmVzcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBpbnRfY29kZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSkKIHsKIAkvKiBMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIGhpdCBpbiBrZXJuZWwgbW9kZSBtZWFucwogCSAgIE5VTEwgcG9pbnRlciB3cml0ZSBhY2Nlc3MgaW4ga2VybmVsIG1vZGUuICAqLwogCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgewogCQkvKiBMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIGhpdCBpbiB1c2VyIG1vZGUgJ2Nhbm5vdCBoYXBwZW4nLiAqLwotCQlkaWUgKCJMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIiwgcmVncywgZXJyb3JfY29kZSk7CisJCWRpZSAoIkxvdy1hZGRyZXNzIHByb3RlY3Rpb24iLCByZWdzLCBpbnRfY29kZSk7CiAJCWRvX2V4aXQoU0lHS0lMTCk7CiAJfQogCi0JZG9fbm9fY29udGV4dChyZWdzLCBlcnJvcl9jb2RlLCAwKTsKKwlkb19ub19jb250ZXh0KHJlZ3MsIGludF9jb2RlLCB0cmFuc19leGNfY29kZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3NpZ2J1cyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBkb19zaWdidXMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaW50X2NvZGUsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB0c2stPm1tOwogCi0JdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAkvKgogCSAqIFNlbmQgYSBzaWdidXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB3ZXJlIGluIGtlcm5lbAogCSAqIG9yIHVzZXIgbW9kZS4KIAkgKi8KLQl0c2stPnRocmVhZC5wcm90X2FkZHIgPSBhZGRyZXNzOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSBlcnJvcl9jb2RlOworCXRzay0+dGhyZWFkLnByb3RfYWRkciA9IHRyYW5zX2V4Y19jb2RlICYgX19GQUlMX0FERFJfTUFTSzsKKwl0c2stPnRocmVhZC50cmFwX25vID0gaW50X2NvZGU7CiAJZm9yY2Vfc2lnKFNJR0JVUywgdHNrKTsKLQotCS8qIEtlcm5lbCBtb2RlPyBIYW5kbGUgZXhjZXB0aW9ucyBvciBkaWUgKi8KLQlpZiAoIShyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkpCi0JCWRvX25vX2NvbnRleHQocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUzM5MF9FWEVDX1BST1RFQ1QKLXN0YXRpYyBpbnQgc2lnbmFsX3JldHVybihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCitzdGF0aWMgbm9pbmxpbmUgaW50IHNpZ25hbF9yZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaW50X2NvZGUsCisJCQkJICB1bnNpZ25lZCBsb25nIHRyYW5zX2V4Y19jb2RlKQogewogCXUxNiBpbnN0cnVjdGlvbjsKIAlpbnQgcmM7Ci0jaWZkZWYgQ09ORklHX0NPTVBBVAotCWludCBjb21wYXQ7Ci0jZW5kaWYKIAotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJcmMgPSBfX2dldF91c2VyKGluc3RydWN0aW9uLCAodTE2IF9fdXNlciAqKSByZWdzLT5wc3cuYWRkcik7Ci0JcGFnZWZhdWx0X2VuYWJsZSgpOwotCWlmIChyYykKLQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjdXJyZW50LCBUSUZfU0lOR0xFX1NURVApOwotI2lmZGVmIENPTkZJR19DT01QQVQKLQljb21wYXQgPSBpc19jb21wYXRfdGFzaygpOwotCWlmIChjb21wYXQgJiYgaW5zdHJ1Y3Rpb24gPT0gMHgwYTc3KQotCQlzeXMzMl9zaWdyZXR1cm4oKTsKLQllbHNlIGlmIChjb21wYXQgJiYgaW5zdHJ1Y3Rpb24gPT0gMHgwYWFkKQotCQlzeXMzMl9ydF9zaWdyZXR1cm4oKTsKLQllbHNlCi0jZW5kaWYKLQlpZiAoaW5zdHJ1Y3Rpb24gPT0gMHgwYTc3KQotCQlzeXNfc2lncmV0dXJuKCk7Ci0JZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT0gMHgwYWFkKQotCQlzeXNfcnRfc2lncmV0dXJuKCk7Ci0JZWxzZSB7Ci0JCWN1cnJlbnQtPnRocmVhZC5wcm90X2FkZHIgPSBhZGRyZXNzOwotCQljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IGVycm9yX2NvZGU7Ci0JCWRvX3NpZ3NlZ3YocmVncywgZXJyb3JfY29kZSwgU0VHVl9NQVBFUlIsIGFkZHJlc3MpOwotCX0KKwlpZiAoIXJjICYmIGluc3RydWN0aW9uID09IDB4MGE3NykgeworCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX1NJTkdMRV9TVEVQKTsKKwkJaWYgKGlzX2NvbXBhdF90YXNrKCkpCisJCQlzeXMzMl9zaWdyZXR1cm4oKTsKKwkJZWxzZQorCQkJc3lzX3NpZ3JldHVybigpOworCX0gZWxzZSBpZiAoIXJjICYmIGluc3RydWN0aW9uID09IDB4MGFhZCkgeworCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX1NJTkdMRV9TVEVQKTsKKwkJaWYgKGlzX2NvbXBhdF90YXNrKCkpCisJCQlzeXMzMl9ydF9zaWdyZXR1cm4oKTsKKwkJZWxzZQorCQkJc3lzX3J0X3NpZ3JldHVybigpOworCX0gZWxzZQorCQlkb19zaWdzZWd2KHJlZ3MsIGludF9jb2RlLCBTRUdWX01BUEVSUiwgdHJhbnNfZXhjX2NvZGUpOwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19TMzkwX0VYRUNfUFJPVEVDVCAqLwogCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBkb19mYXVsdF9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBpbnRfY29kZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSwgaW50IGZhdWx0KQoreworCWludCBzaV9jb2RlOworCisJc3dpdGNoIChmYXVsdCkgeworCWNhc2UgVk1fRkFVTFRfQkFEQUNDRVNTOgorI2lmZGVmIENPTkZJR19TMzkwX0VYRUNfUFJPVEVDVAorCQlpZiAoKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfQVNDKSA9PSBQU1dfQVNDX1NFQ09OREFSWSAmJgorCQkgICAgKHRyYW5zX2V4Y19jb2RlICYgMykgPT0gMCkgeworCQkJc2lnbmFsX3JldHVybihyZWdzLCBpbnRfY29kZSwgdHJhbnNfZXhjX2NvZGUpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfUzM5MF9FWEVDX1BST1RFQ1QgKi8KKwljYXNlIFZNX0ZBVUxUX0JBRE1BUDoKKwkJLyogQmFkIG1lbW9yeSBhY2Nlc3MuIENoZWNrIGlmIGl0IGlzIGtlcm5lbCBvciB1c2VyIHNwYWNlLiAqLworCQlpZiAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpIHsKKwkJCS8qIFVzZXIgbW9kZSBhY2Nlc3NlcyBqdXN0IGNhdXNlIGEgU0lHU0VHViAqLworCQkJc2lfY29kZSA9IChmYXVsdCA9PSBWTV9GQVVMVF9CQURNQVApID8KKwkJCQlTRUdWX01BUEVSUiA6IFNFR1ZfQUNDRVJSOworCQkJZG9fc2lnc2VndihyZWdzLCBpbnRfY29kZSwgc2lfY29kZSwgdHJhbnNfZXhjX2NvZGUpOworCQkJcmV0dXJuOworCQl9CisJY2FzZSBWTV9GQVVMVF9CQURDT05URVhUOgorCQlkb19ub19jb250ZXh0KHJlZ3MsIGludF9jb2RlLCB0cmFuc19leGNfY29kZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIGZhdWx0ICYgVk1fRkFVTFRfRVJST1IgKi8KKwkJaWYgKGZhdWx0ICYgVk1fRkFVTFRfT09NKQorCQkJcGFnZWZhdWx0X291dF9vZl9tZW1vcnkoKTsKKwkJZWxzZSBpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpIHsKKwkJCWRvX3NpZ2J1cyhyZWdzLCBpbnRfY29kZSwgdHJhbnNfZXhjX2NvZGUpOworCQkJLyogS2VybmVsIG1vZGU/IEhhbmRsZSBleGNlcHRpb25zIG9yIGRpZSAqLworCQkJaWYgKCEocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpKQorCQkJCWRvX25vX2NvbnRleHQocmVncywgaW50X2NvZGUsIHRyYW5zX2V4Y19jb2RlKTsKKwkJfSBlbHNlCisJCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCiAvKgogICogVGhpcyByb3V0aW5lIGhhbmRsZXMgcGFnZSBmYXVsdHMuICBJdCBkZXRlcm1pbmVzIHRoZSBhZGRyZXNzLAogICogYW5kIHRoZSBwcm9ibGVtLCBhbmQgdGhlbiBwYXNzZXMgaXQgb2ZmIHRvIG9uZSBvZiB0aGUgYXBwcm9wcmlhdGUKICAqIHJvdXRpbmVzLgogICoKLSAqIGVycm9yX2NvZGU6CisgKiBpbnRlcnJ1cHRpb24gY29kZSAoaW50X2NvZGUpOgogICogICAwNCAgICAgICBQcm90ZWN0aW9uICAgICAgICAgICAtPiAgV3JpdGUtUHJvdGVjdGlvbiAgKHN1cHJyZXNzaW9uKQogICogICAxMCAgICAgICBTZWdtZW50IHRyYW5zbGF0aW9uICAtPiAgTm90IHByZXNlbnQgICAgICAgKG51bGxpZmljYXRpb24pCiAgKiAgIDExICAgICAgIFBhZ2UgdHJhbnNsYXRpb24gICAgIC0+ICBOb3QgcHJlc2VudCAgICAgICAobnVsbGlmaWNhdGlvbikKICAqICAgM2IgICAgICAgUmVnaW9uIHRoaXJkIHRyYW5zLiAgLT4gIE5vdCBwcmVzZW50ICAgICAgIChudWxsaWZpY2F0aW9uKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRvX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLCBpbnQgd3JpdGUpCitzdGF0aWMgaW5saW5lIGludCBkb19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBhY2Nlc3MsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JaW50IHNwYWNlOwotCWludCBzaV9jb2RlOwogCWludCBmYXVsdDsKIAotCWlmIChub3RpZnlfcGFnZV9mYXVsdChyZWdzLCBlcnJvcl9jb2RlKSkKLQkJcmV0dXJuOworCWlmIChub3RpZnlfcGFnZV9mYXVsdChyZWdzKSkKKwkJcmV0dXJuIDA7CiAKIAl0c2sgPSBjdXJyZW50OwogCW1tID0gdHNrLT5tbTsKIAotCS8qIGdldCB0aGUgZmFpbGluZyBhZGRyZXNzIGFuZCB0aGUgYWZmZWN0ZWQgc3BhY2UgKi8KLQlhZGRyZXNzID0gUzM5MF9sb3djb3JlLnRyYW5zX2V4Y19jb2RlICYgX19GQUlMX0FERFJfTUFTSzsKLQlzcGFjZSA9IGNoZWNrX3NwYWNlKHRzayk7Ci0KIAkvKgogCSAqIFZlcmlmeSB0aGF0IHRoZSBmYXVsdCBoYXBwZW5lZCBpbiB1c2VyIHNwYWNlLCB0aGF0CiAJICogd2UgYXJlIG5vdCBpbiBhbiBpbnRlcnJ1cHQgYW5kIHRoYXQgdGhlcmUgaXMgYSAKIAkgKiB1c2VyIGNvbnRleHQuCiAJICovCi0JaWYgKHVubGlrZWx5KHNwYWNlID09IDAgfHwgaW5fYXRvbWljKCkgfHwgIW1tKSkKLQkJZ290byBub19jb250ZXh0OworCWZhdWx0ID0gVk1fRkFVTFRfQkFEQ09OVEVYVDsKKwlpZiAodW5saWtlbHkoIXVzZXJfc3BhY2VfZmF1bHQodHJhbnNfZXhjX2NvZGUpIHx8IGluX2F0b21pYygpIHx8ICFtbSkpCisJCWdvdG8gb3V0OwogCisJYWRkcmVzcyA9IHRyYW5zX2V4Y19jb2RlICYgX19GQUlMX0FERFJfTUFTSzsKIAkvKgogCSAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSBmYXVsdCBoYXBwZW5lZCBpbiB0aGUgY3VycmVudAogCSAqIHRhc2sncyB1c2VyIGFkZHJlc3Mgc3BhY2UsIHNvIHdlIGNhbiBzd2l0Y2ggb24gdGhlCkBAIC0zMDksNDIgKzMyMCwyNiBAQAogCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUywgMSwgMCwgcmVncywgYWRkcmVzcyk7CiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCi0Jc2lfY29kZSA9IFNFR1ZfTUFQRVJSOworCWZhdWx0ID0gVk1fRkFVTFRfQkFETUFQOwogCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyZXNzKTsKIAlpZiAoIXZtYSkKLQkJZ290byBiYWRfYXJlYTsKKwkJZ290byBvdXRfdXA7CiAKLSNpZmRlZiBDT05GSUdfUzM5MF9FWEVDX1BST1RFQ1QKLQlpZiAodW5saWtlbHkoKHNwYWNlID09IDIpICYmICEodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpKSkKLQkJaWYgKCFzaWduYWxfcmV0dXJuKG1tLCByZWdzLCBhZGRyZXNzLCBlcnJvcl9jb2RlKSkKLQkJCS8qCi0JCQkgKiBzaWduYWxfcmV0dXJuKCkgaGFzIGRvbmUgYW4gdXBfcmVhZCgmbW0tPm1tYXBfc2VtKQotCQkJICogaWYgaXQgcmV0dXJucyAwLgotCQkJICovCi0JCQlyZXR1cm47Ci0jZW5kaWYKLQotCWlmICh2bWEtPnZtX3N0YXJ0IDw9IGFkZHJlc3MpCi0JCWdvdG8gZ29vZF9hcmVhOwotCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9HUk9XU0RPV04pKQotCQlnb3RvIGJhZF9hcmVhOwotCWlmIChleHBhbmRfc3RhY2sodm1hLCBhZGRyZXNzKSkKLQkJZ290byBiYWRfYXJlYTsKLS8qCi0gKiBPaywgd2UgaGF2ZSBhIGdvb2Qgdm1fYXJlYSBmb3IgdGhpcyBtZW1vcnkgYWNjZXNzLCBzbwotICogd2UgY2FuIGhhbmRsZSBpdC4uCi0gKi8KLWdvb2RfYXJlYToKLQlzaV9jb2RlID0gU0VHVl9BQ0NFUlI7Ci0JaWYgKCF3cml0ZSkgewotCQkvKiBwYWdlIG5vdCBwcmVzZW50LCBjaGVjayB2bSBmbGFncyAqLwotCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpKSkKLQkJCWdvdG8gYmFkX2FyZWE7Ci0JfSBlbHNlIHsKLQkJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKLQkJCWdvdG8gYmFkX2FyZWE7CisJaWYgKHVubGlrZWx5KHZtYS0+dm1fc3RhcnQgPiBhZGRyZXNzKSkgeworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKKwkJCWdvdG8gb3V0X3VwOworCQlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCisJCQlnb3RvIG91dF91cDsKIAl9CiAKKwkvKgorCSAqIE9rLCB3ZSBoYXZlIGEgZ29vZCB2bV9hcmVhIGZvciB0aGlzIG1lbW9yeSBhY2Nlc3MsIHNvCisJICogd2UgY2FuIGhhbmRsZSBpdC4uCisJICovCisJZmF1bHQgPSBWTV9GQVVMVF9CQURBQ0NFU1M7CisJaWYgKHVubGlrZWx5KCEodm1hLT52bV9mbGFncyAmIGFjY2VzcykpKQorCQlnb3RvIG91dF91cDsKKwogCWlmIChpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKIAkJYWRkcmVzcyAmPSBIUEFHRV9NQVNLOwogCS8qCkBAIC0zNTIsMTggKzM0NywxMSBAQAogCSAqIG1ha2Ugc3VyZSB3ZSBleGl0IGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW5kbGVzc2x5IHJlZG8KIAkgKiB0aGUgZmF1bHQuCiAJICovCi0JZmF1bHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgd3JpdGUgPyBGQVVMVF9GTEFHX1dSSVRFIDogMCk7Ci0JaWYgKHVubGlrZWx5KGZhdWx0ICYgVk1fRkFVTFRfRVJST1IpKSB7Ci0JCWlmIChmYXVsdCAmIFZNX0ZBVUxUX09PTSkgewotCQkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQkJCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpIHsKLQkJCWRvX3NpZ2J1cyhyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKLQkJCXJldHVybjsKLQkJfQotCQlCVUcoKTsKLQl9CisJZmF1bHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywKKwkJCQkoYWNjZXNzID09IFZNX1dSSVRFKSA/IEZBVUxUX0ZMQUdfV1JJVEUgOiAwKTsKKwlpZiAodW5saWtlbHkoZmF1bHQgJiBWTV9GQVVMVF9FUlJPUikpCisJCWdvdG8gb3V0X3VwOworCiAJaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpIHsKIAkJdHNrLT5tYWpfZmx0Kys7CiAJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NQUosIDEsIDAsCkBAIC0zNzMsNzQgKzM2MSw2OSBAQAogCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUlOLCAxLCAwLAogCQkJCSAgICAgcmVncywgYWRkcmVzcyk7CiAJfQotICAgICAgICB1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCS8qCiAJICogVGhlIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkIHRoZSBwcm9ncmFtIGNoZWNrIHdpbGwKIAkgKiBiZSByZXBlYXRlZC4gRG9uJ3Qgc2lnbmFsIHNpbmdsZSBzdGVwIHZpYSBTSUdUUkFQLgogCSAqLwogCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9TSU5HTEVfU1RFUCk7Ci0gICAgICAgIHJldHVybjsKLQotLyoKLSAqIFNvbWV0aGluZyB0cmllZCB0byBhY2Nlc3MgbWVtb3J5IHRoYXQgaXNuJ3QgaW4gb3VyIG1lbW9yeSBtYXAuLgotICogRml4IGl0LCBidXQgY2hlY2sgaWYgaXQncyBrZXJuZWwgb3IgdXNlciBmaXJzdC4uCi0gKi8KLWJhZF9hcmVhOgorCWZhdWx0ID0gMDsKK291dF91cDoKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCi0JLyogVXNlciBtb2RlIGFjY2Vzc2VzIGp1c3QgY2F1c2UgYSBTSUdTRUdWICovCi0JaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7Ci0JCXRzay0+dGhyZWFkLnByb3RfYWRkciA9IGFkZHJlc3M7Ci0JCXRzay0+dGhyZWFkLnRyYXBfbm8gPSBlcnJvcl9jb2RlOwotCQlkb19zaWdzZWd2KHJlZ3MsIGVycm9yX2NvZGUsIHNpX2NvZGUsIGFkZHJlc3MpOwotCQlyZXR1cm47Ci0JfQotCi1ub19jb250ZXh0OgotCWRvX25vX2NvbnRleHQocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcyk7CitvdXQ6CisJcmV0dXJuIGZhdWx0OwogfQogCi12b2lkIF9fa3Byb2JlcyBkb19wcm90ZWN0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkgICAgICAgbG9uZyBlcnJvcl9jb2RlKQordm9pZCBfX2twcm9iZXMgZG9fcHJvdGVjdGlvbl9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaW50X2NvZGUpCiB7CisJdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSA9IFMzOTBfbG93Y29yZS50cmFuc19leGNfY29kZTsKKwlpbnQgZmF1bHQ7CisKIAkvKiBQcm90ZWN0aW9uIGV4Y2VwdGlvbiBpcyBzdXByZXNzaW5nLCBkZWNyZW1lbnQgcHN3IGFkZHJlc3MuICovCi0JcmVncy0+cHN3LmFkZHIgLT0gKGVycm9yX2NvZGUgPj4gMTYpOworCXJlZ3MtPnBzdy5hZGRyIC09IChpbnRfY29kZSA+PiAxNik7CiAJLyoKIAkgKiBDaGVjayBmb3IgbG93LWFkZHJlc3MgcHJvdGVjdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUgdHJlYXRlZAogCSAqIGFzIGEgc3BlY2lhbCBjYXNlIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGV4Y2VwdGlvbiBjb2RlCiAJICogZmllbGQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29udGFpbiB2YWxpZCBkYXRhIGluIHRoaXMgY2FzZS4KIAkgKi8KLQlpZiAodW5saWtlbHkoIShTMzkwX2xvd2NvcmUudHJhbnNfZXhjX2NvZGUgJiA0KSkpIHsKLQkJZG9fbG93X2FkZHJlc3MocmVncywgZXJyb3JfY29kZSk7CisJaWYgKHVubGlrZWx5KCEodHJhbnNfZXhjX2NvZGUgJiA0KSkpIHsKKwkJZG9fbG93X2FkZHJlc3MocmVncywgaW50X2NvZGUsIHRyYW5zX2V4Y19jb2RlKTsKIAkJcmV0dXJuOwogCX0KLQlkb19leGNlcHRpb24ocmVncywgNCwgMSk7CisJZmF1bHQgPSBkb19leGNlcHRpb24ocmVncywgVk1fV1JJVEUsIHRyYW5zX2V4Y19jb2RlKTsKKwlpZiAodW5saWtlbHkoZmF1bHQpKQorCQlkb19mYXVsdF9lcnJvcihyZWdzLCA0LCB0cmFuc19leGNfY29kZSwgZmF1bHQpOwogfQogCi12b2lkIF9fa3Byb2JlcyBkb19kYXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCit2b2lkIF9fa3Byb2JlcyBkb19kYXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGludF9jb2RlKQogewotCWRvX2V4Y2VwdGlvbihyZWdzLCBlcnJvcl9jb2RlICYgMHhmZiwgMCk7CisJdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSA9IFMzOTBfbG93Y29yZS50cmFuc19leGNfY29kZTsKKwlpbnQgYWNjZXNzLCBmYXVsdDsKKworCWFjY2VzcyA9IFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEU7CisjaWZkZWYgQ09ORklHX1MzOTBfRVhFQ19QUk9URUNUCisJaWYgKChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX0FTQykgPT0gUFNXX0FTQ19TRUNPTkRBUlkgJiYKKwkgICAgKHRyYW5zX2V4Y19jb2RlICYgMykgPT0gMCkKKwkJYWNjZXNzID0gVk1fRVhFQzsKKyNlbmRpZgorCWZhdWx0ID0gZG9fZXhjZXB0aW9uKHJlZ3MsIGFjY2VzcywgdHJhbnNfZXhjX2NvZGUpOworCWlmICh1bmxpa2VseShmYXVsdCkpCisJCWRvX2ZhdWx0X2Vycm9yKHJlZ3MsIGludF9jb2RlICYgMjU1LCB0cmFuc19leGNfY29kZSwgZmF1bHQpOwogfQogCiAjaWZkZWYgQ09ORklHXzY0QklUCi12b2lkIF9fa3Byb2JlcyBkb19hc2NlX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQordm9pZCBfX2twcm9iZXMgZG9fYXNjZV9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaW50X2NvZGUpCiB7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07CisJdW5zaWduZWQgbG9uZyB0cmFuc19leGNfY29kZSA9IFMzOTBfbG93Y29yZS50cmFuc19leGNfY29kZTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQlpbnQgc3BhY2U7CiAKLQltbSA9IGN1cnJlbnQtPm1tOwotCWFkZHJlc3MgPSBTMzkwX2xvd2NvcmUudHJhbnNfZXhjX2NvZGUgJiBfX0ZBSUxfQUREUl9NQVNLOwotCXNwYWNlID0gY2hlY2tfc3BhY2UoY3VycmVudCk7Ci0KLQlpZiAodW5saWtlbHkoc3BhY2UgPT0gMCB8fCBpbl9hdG9taWMoKSB8fCAhbW0pKQorCWlmICh1bmxpa2VseSghdXNlcl9zcGFjZV9mYXVsdCh0cmFuc19leGNfY29kZSkgfHwgaW5fYXRvbWljKCkgfHwgIW1tKSkKIAkJZ290byBub19jb250ZXh0OwogCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyZXNzKTsKKwl2bWEgPSBmaW5kX3ZtYShtbSwgdHJhbnNfZXhjX2NvZGUgJiBfX0ZBSUxfQUREUl9NQVNLKTsKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCiAJaWYgKHZtYSkgewpAQCAtNDUwLDE3ICs0MzMsMzggQEAKIAogCS8qIFVzZXIgbW9kZSBhY2Nlc3NlcyBqdXN0IGNhdXNlIGEgU0lHU0VHViAqLwogCWlmIChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgewotCQljdXJyZW50LT50aHJlYWQucHJvdF9hZGRyID0gYWRkcmVzczsKLQkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSBlcnJvcl9jb2RlOwotCQlkb19zaWdzZWd2KHJlZ3MsIGVycm9yX2NvZGUsIFNFR1ZfTUFQRVJSLCBhZGRyZXNzKTsKKwkJZG9fc2lnc2VndihyZWdzLCBpbnRfY29kZSwgU0VHVl9NQVBFUlIsIHRyYW5zX2V4Y19jb2RlKTsKIAkJcmV0dXJuOwogCX0KIAogbm9fY29udGV4dDoKLQlkb19ub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MpOworCWRvX25vX2NvbnRleHQocmVncywgaW50X2NvZGUsIHRyYW5zX2V4Y19jb2RlKTsKIH0KICNlbmRpZgogCitpbnQgX19oYW5kbGVfZmF1bHQodW5zaWduZWQgbG9uZyB1YWRkciwgdW5zaWduZWQgbG9uZyBpbnRfY29kZSwgaW50IHdyaXRlX3VzZXIpCit7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsKKwlpbnQgYWNjZXNzLCBmYXVsdDsKKworCXJlZ3MucHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHM7CisJaWYgKCFpcnFzX2Rpc2FibGVkKCkpCisJCXJlZ3MucHN3Lm1hc2sgfD0gUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQ7CisJcmVncy5wc3cuYWRkciA9ICh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJcmVncy5wc3cuYWRkciB8PSBQU1dfQUREUl9BTU9ERTsKKwl1YWRkciAmPSBQQUdFX01BU0s7CisJYWNjZXNzID0gd3JpdGVfdXNlciA/IFZNX1dSSVRFIDogVk1fUkVBRDsKKwlmYXVsdCA9IGRvX2V4Y2VwdGlvbigmcmVncywgYWNjZXNzLCB1YWRkciB8IDIpOworCWlmICh1bmxpa2VseShmYXVsdCkpIHsKKwkJaWYgKGZhdWx0ICYgVk1fRkFVTFRfT09NKSB7CisJCQlwYWdlZmF1bHRfb3V0X29mX21lbW9yeSgpOworCQkJZmF1bHQgPSAwOworCQl9IGVsc2UgaWYgKGZhdWx0ICYgVk1fRkFVTFRfU0lHQlVTKQorCQkJZG9fc2lnYnVzKCZyZWdzLCBpbnRfY29kZSwgdWFkZHIpOworCX0KKwlyZXR1cm4gZmF1bHQgPyAtRUZBVUxUIDogMDsKK30KKwogI2lmZGVmIENPTkZJR19QRkFVTFQgCiAvKgogICogJ3BmYXVsdCcgcHNldWRvIHBhZ2UgZmF1bHRzIHJvdXRpbmVzLgpAQCAtNTIyLDcgKzUyNiw3IEBACiAJCTogOiAiYSIgKCZyZWZiayksICJtIiAocmVmYmspIDogImNjIik7CiB9CiAKLXN0YXRpYyB2b2lkIHBmYXVsdF9pbnRlcnJ1cHQoX191MTYgZXJyb3JfY29kZSkKK3N0YXRpYyB2b2lkIHBmYXVsdF9pbnRlcnJ1cHQoX191MTYgaW50X2NvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJX191MTYgc3ViY29kZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IDI3NTdjNTYuLmFkNjIxZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtMjY5LDcgKzI2OSw3IEBACiAJc3RydWN0IG1tX3N0cnVjdCAqbW0sICpvbGRfbW07CiAKIAkvKiBEbyB3ZSBoYXZlIHN3aXRjaGVkIGFtb2RlPyBJZiBubywgd2UgY2Fubm90IGRvIHNpZSAqLwotCWlmICghc3dpdGNoX2Ftb2RlKQorCWlmICh1c2VyX21vZGUgPT0gSE9NRV9TUEFDRV9NT0RFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIERvIHdlIGhhdmUgcGdzdGVzPyBpZiB5ZXMsIHdlIGFyZSBkb25lICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vdm1lbS5jIGIvYXJjaC9zMzkwL21tL3ZtZW0uYwppbmRleCA1ZjkxYTM4Li4zMDBhYjAxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vdm1lbS5jCisrKyBiL2FyY2gvczM5MC9tbS92bWVtLmMKQEAgLTcwLDggKzcwLDEyIEBACiAJCXB0ZSA9IGFsbG9jX2Jvb3RtZW0oUFRSU19QRVJfUFRFICogc2l6ZW9mKHB0ZV90KSk7CiAJaWYgKCFwdGUpCiAJCXJldHVybiBOVUxMOwotCWNsZWFyX3RhYmxlKCh1bnNpZ25lZCBsb25nICopIHB0ZSwgX1BBR0VfVFlQRV9FTVBUWSwKLQkJICAgIFBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCkpOworCWlmIChNQUNISU5FX0hBU19IUEFHRSkKKwkJY2xlYXJfdGFibGUoKHVuc2lnbmVkIGxvbmcgKikgcHRlLCBfUEFHRV9UWVBFX0VNUFRZIHwgX1BBR0VfQ08sCisJCQkgICAgUFRSU19QRVJfUFRFICogc2l6ZW9mKHB0ZV90KSk7CisJZWxzZQorCQljbGVhcl90YWJsZSgodW5zaWduZWQgbG9uZyAqKSBwdGUsIF9QQUdFX1RZUEVfRU1QVFksCisJCQkgICAgUFRSU19QRVJfUFRFICogc2l6ZW9mKHB0ZV90KSk7CiAJcmV0dXJuIHB0ZTsKIH0KIApAQCAtMTEyLDcgKzExNiw4IEBACiAJCWlmIChNQUNISU5FX0hBU19IUEFHRSAmJiAhKGFkZHJlc3MgJiB+SFBBR0VfTUFTSykgJiYKIAkJICAgIChhZGRyZXNzICsgSFBBR0VfU0laRSA8PSBzdGFydCArIHNpemUpICYmCiAJCSAgICAoYWRkcmVzcyA+PSBIUEFHRV9TSVpFKSkgewotCQkJcHRlX3ZhbChwdGUpIHw9IF9TRUdNRU5UX0VOVFJZX0xBUkdFOworCQkJcHRlX3ZhbChwdGUpIHw9IF9TRUdNRU5UX0VOVFJZX0xBUkdFIHwKKwkJCQkJX1NFR01FTlRfRU5UUllfQ087CiAJCQlwbWRfdmFsKCpwbV9kaXIpID0gcHRlX3ZhbChwdGUpOwogCQkJYWRkcmVzcyArPSBIUEFHRV9TSVpFIC0gUEFHRV9TSVpFOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggODhjZGViOS4uMDAzMWE2OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMTYsNyArMTYsOSBAQAogCXNlbGVjdCBIQVZFX0lPUkVNQVBfUFJPVCBpZiBNTVUKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwogCXNlbGVjdCBIQVZFX0RNQV9BUElfREVCVUcKKwlzZWxlY3QgSEFWRV9ETUFfQVRUUlMKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUworCXNlbGVjdCBQRVJGX1VTRV9WTUFMTE9DCiAJc2VsZWN0IEhBVkVfS0VSTkVMX0daSVAKIAlzZWxlY3QgSEFWRV9LRVJORUxfQlpJUDIKIAlzZWxlY3QgSEFWRV9LRVJORUxfTFpNQQpAQCAtMzcsNiArMzksNyBAQAogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAorCXNlbGVjdCBIQVZFX0ZUUkFDRV9OTUlfRU5URVIgaWYgRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVIKIAlzZWxlY3QgSEFWRV9BUkNIX0tHREIKIAlzZWxlY3QgQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRSBpZiBNTVUKQEAgLTE3MCw2ICsxNzMsMTIgQEAKIGNvbmZpZyBJT19UUkFQUEVECiAJYm9vbAogCitjb25maWcgRE1BX0NPSEVSRU5UCisJYm9vbAorCitjb25maWcgRE1BX05PTkNPSEVSRU5UCisJZGVmX2Jvb2wgIURNQV9DT0hFUkVOVAorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5mcmVlemVyIgpAQCAtMjIwLDYgKzIyOSw3IEBACiAKIGNvbmZpZyBDUFVfU0hYMwogCWJvb2wKKwlzZWxlY3QgRE1BX0NPSEVSRU5UCiAKIGNvbmZpZyBBUkNIX1NITU9CSUxFCiAJYm9vbApAQCAtNzYxLDE3ICs3NzEsNiBAQAogCWRlZmF1bHQgIjB4MDAwMTAwMDAiIGlmIFBBR0VfU0laRV82NEtCCiAJZGVmYXVsdCAiMHgwMDAwMDAwMCIKIAotY29uZmlnIFVCQ19XQUtFVVAKLQlib29sICJXYWtldXAgVUJDIG9uIHN0YXJ0dXAiCi0JZGVwZW5kcyBvbiBDUFVfU0g0ICYmICFDUFVfU0g0QQotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHdha2V1cCB0aGUgVXNlciBCcmVhayBDb250cm9sbGVyIChVQkMpIG9uCi0JICBzdGFydHVwLiBBbHRob3VnaCB0aGUgVUJDIGlzIGxlZnQgaW4gYW4gYXdha2Ugc3RhdGUgd2hlbiB0aGUgcHJvY2Vzc29yCi0JICBjb21lcyB1cCwgc29tZSBib290IGxvYWRlcnMgbWlzYmVoYXZlIGJ5IHB1dHRpbmcgdGhlIFVCQyB0byBzbGVlcCBpbiBhCi0JICBwb3dlciBzYXZpbmcgc3RhdGUsIHdoaWNoIGNhdXNlcyBpc3N1ZXMgd2l0aCB0aGluZ3MgbGlrZSBwdHJhY2UoKS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY2hvaWNlCiAJcHJvbXB0ICJLZXJuZWwgY29tbWFuZCBsaW5lIgogCW9wdGlvbmFsCkBAIC04MTgsNyArODE3LDEzIEBACiAJIERyZWFtY2FzdCB3aXRoIGEgc2VyaWFsIGxpbmUgdGVybWluYWwgb3IgYSByZW1vdGUgbmV0d29yawogCSBjb25uZWN0aW9uLgogCi1zb3VyY2UgImFyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyIKK2NvbmZpZyBQQ0kKKwlib29sICJQQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBGaW5kIG91dCB3aGV0aGVyIHlvdSBoYXZlIGEgUENJIG1vdGhlcmJvYXJkLiBQQ0kgaXMgdGhlIG5hbWUgb2YgYQorCSAgYnVzIHN5c3RlbSwgaS5lLiB0aGUgd2F5IHRoZSBDUFUgdGFsa3MgdG8gdGhlIG90aGVyIHN0dWZmIGluc2lkZQorCSAgeW91ciBib3guIElmIHlvdSBoYXZlIFBDSSwgc2F5IFksIG90aGVyd2lzZSBOLgogCiBzb3VyY2UgImRyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggNjZlNDBhYS4uYWMxN2M1YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC03OCw2ICs3OCw5IEBACiBkZWZhdWx0aW1hZ2UtJChDT05GSUdfU0hfU0g3Nzg1TENSKQkJOj0gdUltYWdlCiBkZWZhdWx0aW1hZ2UtJChDT05GSUdfU0hfUlNLKQkJCTo9IHVJbWFnZQogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIX1VSUVVFTEwpCQk6PSB1SW1hZ2UKK2RlZmF1bHRpbWFnZS0kKENPTkZJR19TSF9NSUdPUikJCQk6PSB1SW1hZ2UKK2RlZmF1bHRpbWFnZS0kKENPTkZJR19TSF9BUDMyNVJYQSkJCTo9IHVJbWFnZQorZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIXzc3MjRfU09MVVRJT05fRU5HSU5FKQk6PSB1SW1hZ2UKIGRlZmF1bHRpbWFnZS0kKENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSkJOj0gdm1saW51eAogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQk6PSB2bWxpbnV4CiAKQEAgLTEzNiw2ICsxMzksNyBAQAogbWFjaGRpci0kKENPTkZJR19TSF9FRE9TSzc3MDUpCQkJKz0gbWFjaC1lZG9zazc3MDUKIG1hY2hkaXItJChDT05GSUdfU0hfSElHSExBTkRFUikJCQkrPSBtYWNoLWhpZ2hsYW5kZXIKIG1hY2hkaXItJChDT05GSUdfU0hfTUlHT1IpCQkJKz0gbWFjaC1taWdvcgorbWFjaGRpci0kKENPTkZJR19TSF9BUDMyNVJYQSkJCQkrPSBtYWNoLWFwMzI1cnhhCiBtYWNoZGlyLSQoQ09ORklHX1NIX0tGUjJSMDkpCQkJKz0gbWFjaC1rZnIycjA5CiBtYWNoZGlyLSQoQ09ORklHX1NIX0VDT1ZFQykJCQkrPSBtYWNoLWVjb3ZlYzI0CiBtYWNoZGlyLSQoQ09ORklHX1NIX1NESzc3ODApCQkJKz0gbWFjaC1zZGs3NzgwCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL01ha2VmaWxlCmluZGV4IDdiYWEyMTAuLmNlMGYyNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL01ha2VmaWxlCkBAIC0xLDcgKzEsNiBAQAogIwogIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0LCBub3QgY292ZXJlZCBieSBhIG1hY2ggZ3JvdXAuCiAjCi1vYmotJChDT05GSUdfU0hfQVAzMjVSWEEpCSs9IGJvYXJkLWFwMzI1cnhhLm8KIG9iai0kKENPTkZJR19TSF9NQUdJQ19QQU5FTF9SMikJKz0gYm9hcmQtbWFnaWNwYW5lbHIyLm8KIG9iai0kKENPTkZJR19TSF9TSDc3ODVMQ1IpCSs9IGJvYXJkLXNoNzc4NWxjci5vCiBvYmotJChDT05GSUdfU0hfVVJRVUVMTCkJKz0gYm9hcmQtdXJxdWVsbC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2YxNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai15CSA6PSBzZXR1cC5vIHNkcmFtLm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZHJhbS5TIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZHJhbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjRmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NkcmFtLlMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIEFQMzI1UlhBIHNkcmFtIHNlbGYvYXV0by1yZWZyZXNoIHNldHVwIGNvZGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IE1hZ251cyBEYW1tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL3JvbWltYWdlLW1hY3Jvcy5oPgorCisvKiBjb2RlIHRvIGVudGVyIGFuZCBsZWF2ZSBzZWxmLXJlZnJlc2guIG11c3QgYmUgc2VsZi1jb250YWluZWQuCisgKiB0aGlzIGNvZGUgd2lsbCBiZSBjb3BpZWQgdG8gb24tY2hpcCBtZW1vcnkgYW5kIGV4ZWN1dGVkIGZyb20gdGhlcmUuCisgKi8KKwkuYmFsaWduIDQKK0VOVFJZKGFwMzI1cnhhX3NkcmFtX2VudGVyX3N0YXJ0KQorCisJLyogU0JTQzogZGlzYWJsZSBwb3dlciBkb3duIGFuZCBwdXQgaW4gc2VsZi1yZWZyZXNoIG1vZGUgKi8KKwltb3YubAkxZiwgcjQKKwltb3YubAkyZiwgcjEKKwltb3YubAlAcjQsIHIyCisJb3IJcjEsIHIyCisJbW92LmwgICAzZiwgcjMKKwlhbmQJcjMsIHIyCisJbW92LmwJcjIsIEByNAorCisJcnRzCisJIG5vcAorCisJLmJhbGlnbiA0CisxOgkubG9uZwkweGZlNDAwMDA4IC8qIFNEQ1IwICovCisyOgkubG9uZwkweDAwMDAwNDAwCiszOgkubG9uZwkweGZmZmY3ZmZmCitFTlRSWShhcDMyNXJ4YV9zZHJhbV9lbnRlcl9lbmQpCisKKwkuYmFsaWduIDQKK0VOVFJZKGFwMzI1cnhhX3NkcmFtX2xlYXZlX3N0YXJ0KQorCisJLyogU0JTQzogc2V0IGF1dG8tcmVmcmVzaCBtb2RlICovCisJbW92LmwJMWYsIHI0CisJbW92LmwJQHI0LCByMAorCW1vdi5sICAgNGYsIHIxCisJYW5kCXIxLCByMAorCW1vdi5sCXIwLCBAcjQKKwltb3YubAk2ZiwgcjQKKwltb3YubAk4ZiwgcjAKKwltb3YubAlAcjQsIHIxCisJbW92CSMtMSwgcjQKKwlhZGQJcjQsIHIxCisJb3IJcjEsIHIwCisJbW92LmwJN2YsIHIxCisJbW92LmwJcjAsIEByMQorCisJcnRzCisJIG5vcAorCisJLmJhbGlnbiA0CisxOgkubG9uZwkweGZlNDAwMDA4IC8qIFNEQ1IwICovCis0OgkubG9uZwkweGZmZmZmYmZmCis2OgkubG9uZyAgIDB4ZmU0MDAwMWMgLyogUlRDT1IgKi8KKzc6CS5sb25nICAgMHhmZTQwMDAxOCAvKiBSVENOVCAqLworODoJLmxvbmcgICAweGE1NWEwMDAwCitFTlRSWShhcDMyNXJ4YV9zZHJhbV9sZWF2ZV9lbmQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcDMyNXJ4YS5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIGFyY2gvc2gvYm9hcmRzL2JvYXJkLWFwMzI1cnhhLmMKcmVuYW1lIHRvIGFyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwppbmRleCAyZDA4MDczLi5jZjlkYzEyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcDMyNXJ4YS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwpAQCAtMjAsOCArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2dwaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9vdjc3MnguaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYV9wbGF0Zm9ybS5oPgpAQCAtMjksNiArMjcsNyBAQAogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxjcHUvc2g3NzIzLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnIHNtc2M5MTF4X2NvbmZpZyA9IHsKQEAgLTQwOSwxNyArNDA4LDQ5IEBACiAJfSwKIH07CiAKLXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhIHNkY2FyZF9jbjNfcGxhdGZvcm1fZGF0YSA9IHsKLQkuc2NrID0gR1BJT19QVEQwLAotCS5tb3NpID0gR1BJT19QVEQxLAotCS5taXNvID0gR1BJT19QVEQyLAotCS5udW1fY2hpcHNlbGVjdCA9IDEsCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNkaGkwX2NuM19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlNESEkwIiwKKwkJLnN0YXJ0CT0gMHgwNGNlMDAwMCwKKwkJLmVuZAk9IDB4MDRjZTAxZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxMDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RjYXJkX2NuM19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNwaV9ncGlvIiwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZzZGNhcmRfY24zX3BsYXRmb3JtX2RhdGEsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpMF9jbjNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9tb2JpbGVfc2RoaSIsCisJLmlkICAgICAgICAgICAgID0gMCwgLyogInNkaGkwIiBjbG9jayAqLworCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzZGhpMF9jbjNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzZGhpMF9jbjNfcmVzb3VyY2VzLAorCS5hcmNoZGF0YSA9IHsKKwkJLmh3YmxrX2lkID0gSFdCTEtfU0RISTAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTFfY243X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiU0RISTEiLAorCQkuc3RhcnQJPSAweDA0Y2YwMDAwLAorCQkuZW5kCT0gMHgwNGNmMDFmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDI0LAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNkaGkxX2NuN19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX21vYmlsZV9zZGhpIiwKKwkuaWQgICAgICAgICAgICAgPSAxLCAvKiAic2RoaTEiIGNsb2NrICovCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNkaGkxX2NuN19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNkaGkxX2NuN19yZXNvdXJjZXMsCisJLmFyY2hkYXRhID0geworCQkuaHdibGtfaWQgPSBIV0JMS19TREhJMSwKIAl9LAogfTsKIApAQCAtNDcwLDIyICs1MDEsMjYgQEAKIAkmbGNkY19kZXZpY2UsCiAJJmNldV9kZXZpY2UsCiAJJm5hbmRfZmxhc2hfZGV2aWNlLAotCSZzZGNhcmRfY24zX2RldmljZSwKKwkmc2RoaTBfY24zX2RldmljZSwKKwkmc2RoaTFfY243X2RldmljZSwKIAkmYXAzMjVyeGFfY2FtZXJhWzBdLAogCSZhcDMyNXJ4YV9jYW1lcmFbMV0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGFwMzI1cnhhX3NwaV9kZXZpY2VzW10gPSB7Ci0JewotCQkubW9kYWxpYXMgPSAibW1jX3NwaSIsCi0JCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLAotCQkuY2hpcF9zZWxlY3QgPSAwLAotCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgR1BJT19QVEQ1LAotCX0sCi19OworZXh0ZXJuIGNoYXIgYXAzMjVyeGFfc2RyYW1fZW50ZXJfc3RhcnQ7CitleHRlcm4gY2hhciBhcDMyNXJ4YV9zZHJhbV9lbnRlcl9lbmQ7CitleHRlcm4gY2hhciBhcDMyNXJ4YV9zZHJhbV9sZWF2ZV9zdGFydDsKK2V4dGVybiBjaGFyIGFwMzI1cnhhX3NkcmFtX2xlYXZlX2VuZDsKIAogc3RhdGljIGludCBfX2luaXQgYXAzMjVyeGFfZGV2aWNlc19zZXR1cCh2b2lkKQogeworCS8qIHJlZ2lzdGVyIGJvYXJkIHNwZWNpZmljIHNlbGYtcmVmcmVzaCBjb2RlICovCisJc2hfbW9iaWxlX3JlZ2lzdGVyX3NlbGZfcmVmcmVzaChTVVNQX1NIX1NUQU5EQlkgfCBTVVNQX1NIX1NGLAorCQkJCQkmYXAzMjVyeGFfc2RyYW1fZW50ZXJfc3RhcnQsCisJCQkJCSZhcDMyNXJ4YV9zZHJhbV9lbnRlcl9lbmQsCisJCQkJCSZhcDMyNXJ4YV9zZHJhbV9sZWF2ZV9zdGFydCwKKwkJCQkJJmFwMzI1cnhhX3NkcmFtX2xlYXZlX2VuZCk7CisKIAkvKiBMRDMgYW5kIExENCBMRURzICovCiAJZ3Bpb19yZXF1ZXN0KEdQSU9fUFRYNSwgTlVMTCk7IC8qIFJVTiAqLwogCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BUWDUsIDEpOwpAQCAtNTc4LDEyICs2MTMsMjggQEAKIAogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmY2V1X2RldmljZSwgImNldSIsIDQgPDwgMjApOwogCisJLyogU0RISTAgLSBDTjMgLSBTRCBDQVJEICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTBDRF9QVEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwV1BfUFRELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMEQzX1BURCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTBEMl9QVEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDFfUFRELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMEQwX1BURCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTBDTURfUFRELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMENMS19QVEQsIE5VTEwpOworCisJLyogU0RISTEgLSBDTjcgLSBNSUNSTyBTRCBDQVJEICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFDRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFDTUQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkxQ0xLLCBOVUxMKTsKKwogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGFwMzI1cnhhX2kyY19kZXZpY2VzLAogCQkJCUFSUkFZX1NJWkUoYXAzMjVyeGFfaTJjX2RldmljZXMpKTsKIAotCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGFwMzI1cnhhX3NwaV9kZXZpY2VzLAotCQkJCUFSUkFZX1NJWkUoYXAzMjVyeGFfc3BpX2RldmljZXMpKTsKLQogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhcDMyNXJ4YV9kZXZpY2VzLAogCQkJCUFSUkFZX1NJWkUoYXAzMjVyeGFfZGV2aWNlcykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvTWFrZWZpbGUKaW5kZXggNTFmODUyMS4uZTY5YmM4MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L01ha2VmaWxlCkBAIC02LDQgKzYsNCBAQAogIyBmb3IgbW9yZSBkZXRhaWxzLgogIwogCi1vYmoteQkgOj0gc2V0dXAubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai15CSA6PSBzZXR1cC5vIHNkcmFtLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NkcmFtLlMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NkcmFtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNDQwMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2RyYW0uUwpAQCAtMCwwICsxLDUyIEBACisvKgorICogRWNvdmVjMjQgc2RyYW0gc2VsZi9hdXRvLXJlZnJlc2ggc2V0dXAgY29kZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgTWFnbnVzIERhbW0KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vcm9taW1hZ2UtbWFjcm9zLmg+CisKKy8qIGNvZGUgdG8gZW50ZXIgYW5kIGxlYXZlIHNlbGYtcmVmcmVzaC4gbXVzdCBiZSBzZWxmLWNvbnRhaW5lZC4KKyAqIHRoaXMgY29kZSB3aWxsIGJlIGNvcGllZCB0byBvbi1jaGlwIG1lbW9yeSBhbmQgZXhlY3V0ZWQgZnJvbSB0aGVyZS4KKyAqLworCS5iYWxpZ24gNAorRU5UUlkoZWNvdmVjMjRfc2RyYW1fZW50ZXJfc3RhcnQpCisKKwkvKiBEQlNDOiBwdXQgbWVtb3J5IGluIHNlbGYtcmVmcmVzaCBtb2RlICovCisKKwlFRCAweEZEMDAwMDEwLCAweDAwMDAwMDAwIC8qIERCRU4gKi8KKwlFRCAweEZEMDAwMDQwLCAweDAwMDAwMDAwIC8qIERCUkZQRE4wICovCisJRUQgMHhGRDAwMDAxNCwgMHgwMDAwMDAwMiAvKiBEQkNNRENOVCAoUEFMTCkgKi8KKwlFRCAweEZEMDAwMDE0LCAweDAwMDAwMDA0IC8qIERCQ01EQ05UIChSRUYpICovCisJRUQgMHhGRDAwMDA0MCwgMHgwMDAwMDAwMSAvKiBEQlJGUEROMCAqLworCisJcnRzCisJIG5vcAorCitFTlRSWShlY292ZWMyNF9zZHJhbV9lbnRlcl9lbmQpCisKKwkuYmFsaWduIDQKK0VOVFJZKGVjb3ZlYzI0X3NkcmFtX2xlYXZlX3N0YXJ0KQorCisJLyogREJTQzogcHV0IG1lbW9yeSBpbiBhdXRvLXJlZnJlc2ggbW9kZSAqLworCisJRUQgMHhGRDAwMDA0MCwgMHgwMDAwMDAwMCAvKiBEQlJGUEROMCAqLworCVdBSVQgMQorCUVEIDB4RkQwMDAwMTQsIDB4MDAwMDAwMDIgLyogREJDTURDTlQgKFBBTEwpICovCisJRUQgMHhGRDAwMDAxNCwgMHgwMDAwMDAwNCAvKiBEQkNNRENOVCAoUkVGKSAqLworCUVEIDB4RkQwMDAwMTAsIDB4MDAwMDAwMDEgLyogREJFTiAqLworCUVEIDB4RkQwMDAwNDAsIDB4MDAwMTAwMDAgLyogREJSRlBETjAgKi8KKworCXJ0cworCSBub3AKKworRU5UUlkoZWNvdmVjMjRfc2RyYW1fbGVhdmVfZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCmluZGV4IDNiMWNlYjQuLjgyNmU2MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKQEAgLTIwLDEyICsyMCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90c2MyMDA3Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zaF9tb2JpbGVfc2RoaS5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgogI2luY2x1ZGUgPGFzbS9oZWFydGJlYXQuaD4KICNpbmNsdWRlIDxhc20vc2hfZXRoLmg+Ci0jaW5jbHVkZSA8YXNtL3NoX2tleXNjLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxjcHUvc2g3NzI0Lmg+CiAKIC8qCkBAIC0xNDcsNiArMTQ5LDkgQEAKIAl9LAogCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShzaF9ldGhfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UgPSBzaF9ldGhfcmVzb3VyY2VzLAorCS5hcmNoZGF0YSA9IHsKKwkJLmh3YmxrX2lkID0gSFdCTEtfRVRIRVIsCisJfSwKIH07CiAKIC8qIFVTQjAgaG9zdCAqLwpAQCAtMTg1LDMwICsxOTAsMTggQEAKIAkucmVzb3VyY2UJPSB1c2IwX2hvc3RfcmVzb3VyY2VzLAogfTsKIAotLyoKLSAqIFVTQjEKLSAqCi0gKiBDTjUgY2FuIHVzZSBib3RoIGhvc3QvZnVuY3Rpb24sCi0gKiBhbmQgd2UgY2FuIGRldGVybWluZSBpdCBieSBjaGVja2luZyBQVEJbM10KLSAqCi0gKiBUaGlzIHRpbWUgb25seSBVU0IxIGhvc3QgaXMgc3VwcG9ydGVkLgotICovCisvKiBVU0IxIGhvc3QvZnVuY3Rpb24gKi8KIHZvaWQgdXNiMV9wb3J0X3Bvd2VyKGludCBwb3J0LCBpbnQgcG93ZXIpCiB7Ci0JaWYgKCFncGlvX2dldF92YWx1ZShHUElPX1BUQjMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVVNCMSBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQogCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUFRCNSwgcG93ZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IHI4YTY2NTk3X3BsYXRkYXRhIHVzYjFfaG9zdF9kYXRhID0geworc3RhdGljIHN0cnVjdCByOGE2NjU5N19wbGF0ZGF0YSB1c2IxX2NvbW1vbl9kYXRhID0gewogCS5vbl9jaGlwID0gMSwKIAkucG9ydF9wb3dlciA9IHVzYjFfcG9ydF9wb3dlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiMV9ob3N0X3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2IxX2NvbW1vbl9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CiAJCS5zdGFydAk9IDB4YTRkOTAwMDAsCiAJCS5lbmQJPSAweGE0ZDkwMTI0IC0gMSwKQEAgLTIyMSwxNiArMjE0LDE2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVzYjFfaG9zdF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInI4YTY2NTk3X2hjZCIsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1c2IxX2NvbW1vbl9kZXZpY2UgPSB7CisJLyogLm5hbWUgd2lsbCBiZSBhZGRlZCBpbiBhcmNoX3NldHVwICovCiAJLmlkCQk9IDEsCiAJLmRldiA9IHsKIAkJLmRtYV9tYXNrCQk9IE5VTEwsICAgICAgICAgLyogIG5vdCB1c2UgZG1hICovCiAJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2IxX2hvc3RfZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnVzYjFfY29tbW9uX2RhdGEsCiAJfSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodXNiMV9ob3N0X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gdXNiMV9ob3N0X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodXNiMV9jb21tb25fcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB1c2IxX2NvbW1vbl9yZXNvdXJjZXMsCiB9OwogCiAvKiBMQ0RDICovCkBAIC00MjgsMTYgKzQyMSw5MCBAQAogCS5pcnEJCT0gSVJRMCwKIH07CiAKKy8qIFNIREkwICovCitzdGF0aWMgdm9pZCBzZGhpMF9zZXRfcHdyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBzdGF0ZSkKK3sKKwlncGlvX3NldF92YWx1ZShHUElPX1BUQjYsIHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNkaGkwX2luZm8gPSB7CisJLnNldF9wd3IgPSBzZGhpMF9zZXRfcHdyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzZGhpMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlNESEkwIiwKKwkJLnN0YXJ0ICA9IDB4MDRjZTAwMDAsCisJCS5lbmQgICAgPSAweDA0Y2UwMWZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAxMDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RoaTBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJzaF9tb2JpbGVfc2RoaSIsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzZGhpMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IHNkaGkwX3Jlc291cmNlcywKKwkuaWQgICAgICAgICAgICAgPSAwLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNkaGkwX2luZm8sCisJfSwKKwkuYXJjaGRhdGEgPSB7CisJCS5od2Jsa19pZCA9IEhXQkxLX1NESEkwLAorCX0sCit9OworCisvKiBTSERJMSAqLworc3RhdGljIHZvaWQgc2RoaTFfc2V0X3B3cihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgc3RhdGUpCit7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19QVEI3LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzZGhpMV9pbmZvID0geworCS5zZXRfcHdyID0gc2RoaTFfc2V0X3B3ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJTREhJMSIsCisJCS5zdGFydCAgPSAweDA0Y2YwMDAwLAorCQkuZW5kICAgID0gMHgwNGNmMDFmZiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gMjQsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RoaTFfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJzaF9tb2JpbGVfc2RoaSIsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzZGhpMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IHNkaGkxX3Jlc291cmNlcywKKwkuaWQgICAgICAgICAgICAgPSAxLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNkaGkxX2luZm8sCisJfSwKKwkuYXJjaGRhdGEgPSB7CisJCS5od2Jsa19pZCA9IEhXQkxLX1NESEkxLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZWNvdmVjX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZoZWFydGJlYXRfZGV2aWNlLAogCSZub3JfZmxhc2hfZGV2aWNlLAogCSZzaF9ldGhfZGV2aWNlLAogCSZ1c2IwX2hvc3RfZGV2aWNlLAotCSZ1c2IxX2hvc3RfZGV2aWNlLCAvKiBVU0IxIGhvc3Qgc3VwcG9ydCAqLworCSZ1c2IxX2NvbW1vbl9kZXZpY2UsCiAJJmxjZGNfZGV2aWNlLAogCSZjZXUwX2RldmljZSwKIAkmY2V1MV9kZXZpY2UsCiAJJmtleXNjX2RldmljZSwKKwkmc2RoaTBfZGV2aWNlLAorCSZzZGhpMV9kZXZpY2UsCiB9OwogCiAjZGVmaW5lIEVFUFJPTV9BRERSIDB4NTAKQEAgLTQ2NiwxMiArNTMzLDkgQEAKIAlyZXR1cm4gYnVmOwogfQogCi0jZGVmaW5lIE1BQ19MRU4gNgotc3RhdGljIHZvaWQgX19pbml0IHNoX2V0aF9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgc2hfZXRoX2luaXQoc3RydWN0IHNoX2V0aF9wbGF0X2RhdGEgKnBkKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYSA9IGkyY19nZXRfYWRhcHRlcigxKTsKLQlzdHJ1Y3QgY2xrICpldGhfY2xrOwotCXU4IG1hY1tNQUNfTEVOXTsKIAlpbnQgaTsKIAogCWlmICghYSkgewpAQCAtNDc5LDM5ICs1NDMsMzAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWV0aF9jbGsgPSBjbGtfZ2V0KE5VTEwsICJldGgwIik7Ci0JaWYgKCFldGhfY2xrKSB7Ci0JCXByX2VycigiY2FuIG5vdCBnZXQgZXRoMCBjbGtcbiIpOwotCQlyZXR1cm47Ci0JfQotCiAJLyogcmVhZCBNQUMgYWRkcmVzcyBmcm9tZSBFRVBST00gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFDX0xFTjsgaSsrKSB7Ci0JCW1hY1tpXSA9IG1hY19yZWFkKGEsIDB4MTAgKyBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBkLT5tYWNfYWRkcik7IGkrKykgeworCQlwZC0+bWFjX2FkZHJbaV0gPSBtYWNfcmVhZChhLCAweDEwICsgaSk7CiAJCW1zbGVlcCgxMCk7CiAJfQotCi0JLyogY2xvY2sgZW5hYmxlICovCi0JY2xrX2VuYWJsZShldGhfY2xrKTsKLQotCS8qIHJlc2V0IHNoLWV0aCAqLwotCWN0cmxfb3V0bCgweDEsIFNIX0VUSF9BRERSICsgMHgwKTsKLQotCS8qIHNldCBNQUMgYWRkciAqLwotCWN0cmxfb3V0bCgobWFjWzBdIDw8IDI0KSB8Ci0JCSAgKG1hY1sxXSA8PCAxNikgfAotCQkgIChtYWNbMl0gPDwgIDgpIHwKLQkJICAobWFjWzNdIDw8ICAwKSwgU0hfRVRIX01BSFIpOwotCWN0cmxfb3V0bCgobWFjWzRdIDw8ICA4KSB8Ci0JCSAgKG1hY1s1XSA8PCAgMCksIFNIX0VUSF9NQUxSKTsKLQotCWNsa19wdXQoZXRoX2Nsayk7CiB9CiAKICNkZWZpbmUgUE9SVF9ISVpBIDB4QTQwNTAxNTgKICNkZWZpbmUgSU9EUklWRUEgIDB4QTQwNTAxOEEKKworZXh0ZXJuIGNoYXIgZWNvdmVjMjRfc2RyYW1fZW50ZXJfc3RhcnQ7CitleHRlcm4gY2hhciBlY292ZWMyNF9zZHJhbV9lbnRlcl9lbmQ7CitleHRlcm4gY2hhciBlY292ZWMyNF9zZHJhbV9sZWF2ZV9zdGFydDsKK2V4dGVybiBjaGFyIGVjb3ZlYzI0X3NkcmFtX2xlYXZlX2VuZDsKKwogc3RhdGljIGludCBfX2luaXQgYXJjaF9zZXR1cCh2b2lkKQogeworCS8qIHJlZ2lzdGVyIGJvYXJkIHNwZWNpZmljIHNlbGYtcmVmcmVzaCBjb2RlICovCisJc2hfbW9iaWxlX3JlZ2lzdGVyX3NlbGZfcmVmcmVzaChTVVNQX1NIX1NUQU5EQlkgfCBTVVNQX1NIX1NGLAorCQkJCQkmZWNvdmVjMjRfc2RyYW1fZW50ZXJfc3RhcnQsCisJCQkJCSZlY292ZWMyNF9zZHJhbV9lbnRlcl9lbmQsCisJCQkJCSZlY292ZWMyNF9zZHJhbV9sZWF2ZV9zdGFydCwKKwkJCQkJJmVjb3ZlYzI0X3NkcmFtX2xlYXZlX2VuZCk7CisKIAkvKiBlbmFibGUgU1RBVFVTMCwgU1RBVFVTMiBhbmQgUERTVEFUVVMgKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9TVEFUVVMwLCBOVUxMKTsKIAlncGlvX3JlcXVlc3QoR1BJT19GTl9TVEFUVVMyLCBOVUxMKTsKQEAgLTU2MSw2ICs2MTYsMTQgQEAKIAljdHJsX291dHcoMHgwNjAwLCAweGE0MDUwMWQ0KTsKIAljdHJsX291dHcoMHgwNjAwLCAweGE0MDUwMTkyKTsKIAorCWlmIChncGlvX2dldF92YWx1ZShHUElPX1BUQjMpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlVTQjEgZnVuY3Rpb24gaXMgc2VsZWN0ZWRcbiIpOworCQl1c2IxX2NvbW1vbl9kZXZpY2UubmFtZSA9ICJyOGE2NjU5N191ZGMiOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIlVTQjEgaG9zdCBpcyBzZWxlY3RlZFxuIik7CisJCXVzYjFfY29tbW9uX2RldmljZS5uYW1lID0gInI4YTY2NTk3X2hjZCI7CisJfQorCiAJLyogZW5hYmxlIExDREMgKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REMjMsICAgTlVMTCk7CiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDIyLCAgIE5VTEwpOwpAQCAtNjAzLDggKzY2Niw4IEBACiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUFRSMSwgMCk7CiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUFRBMiwgMCk7CiAKLQkvKiBJL08gYnVmZmVyIGRyaXZlIGFiaWxpdHkgaXMgbG93ICovCi0JY3RybF9vdXR3KChjdHJsX2ludyhJT0RSSVZFQSkgJiB+MHgwMGMwKSB8IDB4MDA0MCAsIElPRFJJVkVBKTsKKwkvKiBJL08gYnVmZmVyIGRyaXZlIGFiaWxpdHkgaXMgaGlnaCAqLworCWN0cmxfb3V0dygoY3RybF9pbncoSU9EUklWRUEpICYgfjB4MDBjMCkgfCAweDAwODAgLCBJT0RSSVZFQSk7CiAKIAlpZiAoZ3Bpb19nZXRfdmFsdWUoR1BJT19QVEU2KSkgewogCQkvKiBEVkkgKi8KQEAgLTcxMCw2ICs3NzMsMzMgQEAKIAlncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX1BUUjUpOwogCWdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fUFRSNik7CiAKKwkvKiBlbmFibGUgU0RISTAgKG5lZWRzIERTMi40IHNldCB0byBPTikgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMENELCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTBXUCwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwQ01ELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMENMSywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTBEMywgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDIsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMEQxLCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTBEMCwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX1BUQjYsIE5VTEwpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BUQjYsIDApOworCisJLyogZW5hYmxlIFNESEkxIChuZWVkcyBEUzIuNiw3IHNldCB0byBPTixPRkYpICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFDRCwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkxV1AsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMUNNRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFDTEssIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkxRDMsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMUQyLCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMSwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkxRDAsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19QVEI3LCBOVUxMKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QVEI3LCAwKTsKKworCS8qIEkvTyBidWZmZXIgZHJpdmUgYWJpbGl0eSBpcyBoaWdoIGZvciBTREhJMSAqLworCWN0cmxfb3V0dygoY3RybF9pbncoSU9EUklWRUEpICYgfjB4MzAwMCkgfCAweDIwMDAgLCBJT0RSSVZFQSk7CisKIAkvKiBlbmFibGUgSTJDIGRldmljZSAqLwogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGkyYzFfZGV2aWNlcywKIAkJCQlBUlJBWV9TSVpFKGkyYzFfZGV2aWNlcykpOwpAQCAtNzIxLDEyICs4MTEsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgZGV2aWNlc19zZXR1cCh2b2lkKQogewotCXNoX2V0aF9pbml0KCk7CisJc2hfZXRoX2luaXQoJnNoX2V0aF9wbGF0KTsKIAlyZXR1cm4gMDsKIH0KIGRldmljZV9pbml0Y2FsbChkZXZpY2VzX3NldHVwKTsKIAotCiBzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2Vjb3ZlYyBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQk9ICJSMFA3NzI0IChFY29WZWMpIiwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWhpZ2hsYW5kZXIvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtaGlnaGxhbmRlci9zZXR1cC5jCmluZGV4IDU2NmU2OWQuLmY2NjNjMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtaGlnaGxhbmRlci9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtaGlnaGxhbmRlci9zZXR1cC5jCkBAIC0zODQsNyArMzg0LDcgQEAKIAogc3RhdGljIGludCBoaWdobGFuZGVyX2lycV9kZW11eChpbnQgaXJxKQogewotCWlmIChpcnEgPj0gSExfTlJfSVJMIHx8ICFpcmwyaXJxW2lycV0pCisJaWYgKGlycSA+PSBITF9OUl9JUkwgfHwgaXJxIDwgMCB8fCAhaXJsMmlycVtpcnFdKQogCQlyZXR1cm4gaXJxOwogCiAJcmV0dXJuIGlybDJpcnFbaXJxXTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gta2ZyMnIwOS9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL21hY2gta2ZyMnIwOS9NYWtlZmlsZQppbmRleCA1ZDU4Njc4Li40ZTU3N2EzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWtmcjJyMDkvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1rZnIycjA5L01ha2VmaWxlCkBAIC0xLDIgKzEsMiBAQAotb2JqLXkJIDo9IHNldHVwLm8KK29iai15CSA6PSBzZXR1cC5vIHNkcmFtLm8KIG9iai0kKENPTkZJR19GQl9TSF9NT0JJTEVfTENEQykJKz0gIGxjZF93cXZnYS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWtmcjJyMDkvc2RyYW0uUyBiL2FyY2gvc2gvYm9hcmRzL21hY2gta2ZyMnIwOS9zZHJhbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWY1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWtmcjJyMDkvc2RyYW0uUwpAQCAtMCwwICsxLDgwIEBACisvKgorICogS0ZSMlIwOSBzZHJhbSBzZWxmL2F1dG8tcmVmcmVzaCBzZXR1cCBjb2RlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgorI2luY2x1ZGUgPGFzbS9yb21pbWFnZS1tYWNyb3MuaD4KKworLyogY29kZSB0byBlbnRlciBhbmQgbGVhdmUgc2VsZi1yZWZyZXNoLiBtdXN0IGJlIHNlbGYtY29udGFpbmVkLgorICogdGhpcyBjb2RlIHdpbGwgYmUgY29waWVkIHRvIG9uLWNoaXAgbWVtb3J5IGFuZCBleGVjdXRlZCBmcm9tIHRoZXJlLgorICovCisJLmJhbGlnbiA0CitFTlRSWShrZnIycjA5X3NkcmFtX2VudGVyX3N0YXJ0KQorCisJLyogREJTQzogcHV0IG1lbW9yeSBpbiBzZWxmLXJlZnJlc2ggbW9kZSAqLworCisJRUQgMHhGRDAwMDAxMCwgMHgwMDAwMDAwMCAvKiBEQkVOICovCisJRUQgMHhGRDAwMDA0MCwgMHgwMDAwMDAwMCAvKiBEQlJGUEROMCAqLworCUVEIDB4RkQwMDAwMTQsIDB4MDAwMDAwMDIgLyogREJDTURDTlQgKFBBTEwpICovCisJRUQgMHhGRDAwMDAxNCwgMHgwMDAwMDAwNCAvKiBEQkNNRENOVCAoUkVGKSAqLworCUVEIDB4RkQwMDAwNDAsIDB4MDAwMDAwMDEgLyogREJSRlBETjAgKi8KKworCXJ0cworCSBub3AKKworRU5UUlkoa2ZyMnIwOV9zZHJhbV9lbnRlcl9lbmQpCisKKwkuYmFsaWduIDQKK0VOVFJZKGtmcjJyMDlfc2RyYW1fbGVhdmVfc3RhcnQpCisKKwkvKiBEQlNDOiBwdXQgbWVtb3J5IGluIGF1dG8tcmVmcmVzaCBtb2RlICovCisKKwltb3YubAlAKFNIX1NMRUVQX01PREUsIHI1KSwgcjAKKwl0c3QJI1NVU1BfU0hfUlNUQU5EQlksIHIwCisJYmYJcmVzdW1lX3JzdGFuZGJ5CisKKwlFRCAweEZEMDAwMDQwLCAweDAwMDAwMDAwIC8qIERCUkZQRE4wICovCisJV0FJVCAxCisJRUQgMHhGRDAwMDAxNCwgMHgwMDAwMDAwMiAvKiBEQkNNRENOVCAoUEFMTCkgKi8KKwlFRCAweEZEMDAwMDE0LCAweDAwMDAwMDA0IC8qIERCQ01EQ05UIChSRUYpICovCisJRUQgMHhGRDAwMDAxMCwgMHgwMDAwMDAwMSAvKiBEQkVOICovCisJRUQgMHhGRDAwMDA0MCwgMHgwMDAxMDAwMCAvKiBEQlJGUEROMCAqLworCisJcnRzCisJIG5vcAorCityZXN1bWVfcnN0YW5kYnk6CisKKwkvKiBEQlNDOiByZS1pbml0aWFsaXplIGFuZCBwdXQgaW4gYXV0by1yZWZyZXNoICovCisKKwlFRCAweEZEMDAwMTA4LCAweDQwMDAwMzAxIC8qIERCUERDTlQwICovCisJRUQgMHhGRDAwMDAyMCwgMHgwMTFCMDAwMiAvKiBEQkNPTkYgKi8KKwlFRCAweEZEMDAwMDMwLCAweDAzMDYwRTAyIC8qIERCVFIwICovCisJRUQgMHhGRDAwMDAzNCwgMHgwMTAyMDEwMiAvKiBEQlRSMSAqLworCUVEIDB4RkQwMDAwMzgsIDB4MDEwOTA0MDYgLyogREJUUjIgKi8KKwlFRCAweEZEMDAwMDA4LCAweDAwMDAwMDA0IC8qIERCS0lORCAqLworCUVEIDB4RkQwMDAwNDAsIDB4MDAwMDAwMDEgLyogREJSRlBETjAgKi8KKwlFRCAweEZEMDAwMDQwLCAweDAwMDAwMDAwIC8qIERCUkZQRE4wICovCisJRUQgMHhGRDAwMDAxOCwgMHgwMDAwMDAwMSAvKiBEQkNLRUNOVCAqLworCVdBSVQgMQorCUVEIDB4RkQwMDAwMTAsIDB4MDAwMDAwMDEgLyogREJFTiAqLworCUVEIDB4RkQwMDAwNDQsIDB4MDAwMDA0QUYgLyogREJSRlBETjEgKi8KKwlFRCAweEZEMDAwMDQ4LCAweDIwQ0YwMDM3IC8qIERCUkZQRE4yICovCisJRUQgMHhGRDAwMDAxNCwgMHgwMDAwMDAwNCAvKiBEQkNNRENOVCAoUkVGKSAqLworCUVEIDB4RkQwMDAxMDgsIDB4NDAwMDAzMDAgLyogREJQRENOVDAgKi8KKwlFRCAweEZEMDAwMDQwLCAweDAwMDEwMDAwIC8qIERCUkZQRE4wICovCisKKwlydHMKKwkgbm9wCisKK0VOVFJZKGtmcjJyMDlfc2RyYW1fbGVhdmVfZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1rZnIycjA5L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWtmcjJyMDkvc2V0dXAuYwppbmRleCBjMDhkMzNmLi44NzQzOGQ2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWtmcjJyMDkvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWtmcjJyMDkvc2V0dXAuYwpAQCAtMTYsMTMgKzE2LDE2IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvc2hfa2V5c2MuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcjhhNjY1OTcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zaF9rZXlzYy5oPgogI2luY2x1ZGUgPGNwdS9zaDc3MjQuaD4KICNpbmNsdWRlIDxtYWNoL2tmcjJyMDkuaD4KIApAQCAtMjEyLDExICsyMTUsMTU0IEBACiAJLnJlc291cmNlCT0ga2ZyMnIwOV91c2IwX2dhZGdldF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9jZXVfaW5mbyBzaF9tb2JpbGVfY2V1X2luZm8gPSB7CisJLmZsYWdzID0gU0hfQ0VVX0ZMQUdfVVNFXzhCSVRfQlVTLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBrZnIycjA5X2NldV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIkNFVSIsCisJCS5zdGFydAk9IDB4ZmU5MTAwMDAsCisJCS5lbmQJPSAweGZlOTEwMDlmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IDUyLAorCQkuZW5kICA9IDUyLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS8qIHBsYWNlIGhvbGRlciBmb3IgY29udGlndW91cyBtZW1vcnkgKi8KKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga2ZyMnIwOV9jZXVfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9tb2JpbGVfY2V1IiwKKwkuaWQgICAgICAgICAgICAgPSAwLCAvKiAiY2V1MCIgY2xvY2sgKi8KKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoa2ZyMnIwOV9jZXVfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBrZnIycjA5X2NldV9yZXNvdXJjZXMsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmc2hfbW9iaWxlX2NldV9pbmZvLAorCX0sCisJLmFyY2hkYXRhID0geworCQkuaHdibGtfaWQgPSBIV0JMS19DRVUwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGtmcjJyMDlfaTJjX2NhbWVyYSA9IHsKKwlJMkNfQk9BUkRfSU5GTygicmo1NG4xY2IwYyIsIDB4NTApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNhbWVyYV9jbGs7CisKKyNkZWZpbmUgRFJWQ1JCIDB4QTQwNTAxOEMKK3N0YXRpYyBpbnQgY2FtZXJhX3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCit7CisJaW50IHJldDsKKworCWlmIChtb2RlKSB7CisJCWxvbmcgcmF0ZTsKKworCQljYW1lcmFfY2xrID0gY2xrX2dldChOVUxMLCAidmlkZW9fY2xrIik7CisJCWlmIChJU19FUlIoY2FtZXJhX2NsaykpCisJCQlyZXR1cm4gUFRSX0VSUihjYW1lcmFfY2xrKTsKKworCQkvKiBzZXQgVklPX0NLTyBjbG9jayB0byAyNU1IeiAqLworCQlyYXRlID0gY2xrX3JvdW5kX3JhdGUoY2FtZXJhX2NsaywgMjUwMDAwMDApOworCQlyZXQgPSBjbGtfc2V0X3JhdGUoY2FtZXJhX2NsaywgcmF0ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlY2xrcmF0ZTsKKworCQkvKiBzZXQgRFJWQ1JCCisJCSAqCisJCSAqIHVzZSAxLjggViBmb3IgVmNjUV9WSU8KKwkJICogdXNlIDIuODVWIGZvciBWY2NRX1NSCisJCSAqLworCQljdHJsX291dHcoKGN0cmxfaW53KERSVkNSQikgJiB+MHgwMDAzKSB8IDB4MDAwMSwgRFJWQ1JCKTsKKworCQkvKiByZXNldCBjbGVhciAqLworCQlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QVEI0LCBOVUxMKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVwdGI0OworCQlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QVEI3LCBOVUxMKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVwdGI3OworCisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BUQjQsIDEpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BUQjcsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZWdwaW9vdXQ7CisJCW1zbGVlcCgxKTsKKworCQlyZXQgPSBjbGtfZW5hYmxlKGNhbWVyYV9jbGspOwkvKiBzdGFydCBWSU9fQ0tPICovCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlY2xrb247CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gMDsKKworCWNsa19kaXNhYmxlKGNhbWVyYV9jbGspOworZWNsa29uOgorCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUFRCNywgMCk7CitlZ3Bpb291dDoKKwlncGlvX3NldF92YWx1ZShHUElPX1BUQjQsIDApOworCWdwaW9fZnJlZShHUElPX1BUQjcpOworZXB0Yjc6CisJZ3Bpb19mcmVlKEdQSU9fUFRCNCk7CitlcHRiNDoKK2VjbGtyYXRlOgorCWNsa19wdXQoY2FtZXJhX2Nsayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgcmo1NG4xX2xpbmsgPSB7CisJLnBvd2VyCQk9IGNhbWVyYV9wb3dlciwKKwkuYm9hcmRfaW5mbwk9ICZrZnIycjA5X2kyY19jYW1lcmEsCisJLmkyY19hZGFwdGVyX2lkCT0gMSwKKwkubW9kdWxlX25hbWUJPSAicmo1NG4xY2IwYyIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBrZnIycjA5X2NhbWVyYSA9IHsKKwkubmFtZQk9ICJzb2MtY2FtZXJhLXBkcnYiLAorCS5pZAk9IDAsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcmo1NG4xX2xpbmssCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Uga2ZyMnIwOV9zaF9zZGhpMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlNESEkwIiwKKwkJLnN0YXJ0ICA9IDB4MDRjZTAwMDAsCisJCS5lbmQgICAgPSAweDA0Y2UwMWZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAxMDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga2ZyMnIwOV9zaF9zZGhpMF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gInNoX21vYmlsZV9zZGhpIiwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGtmcjJyMDlfc2hfc2RoaTBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBrZnIycjA5X3NoX3NkaGkwX3Jlc291cmNlcywKKwkuYXJjaGRhdGEgPSB7CisJCS5od2Jsa19pZCA9IEhXQkxLX1NESEkwLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqa2ZyMnIwOV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkma2ZyMnIwOV9ub3JfZmxhc2hfZGV2aWNlLAogCSZrZnIycjA5X25hbmRfZmxhc2hfZGV2aWNlLAogCSZrZnIycjA5X3NoX2tleXNjX2RldmljZSwKIAkma2ZyMnIwOV9zaF9sY2RjX2RldmljZSwKKwkma2ZyMnIwOV9jZXVfZGV2aWNlLAorCSZrZnIycjA5X2NhbWVyYSwKKwkma2ZyMnIwOV9zaF9zZGhpMF9kZXZpY2UsCiB9OwogCiAjZGVmaW5lIEJTQ19DUzBCQ1IgMHhmZWMxMDAwNApAQCAtMjY4LDExICs0MTQsNTkgQEAKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IGtmcjJyMDlfc2VyaWFsX2kyY19zZXR1cCh2b2lkKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisJaW50IHJldDsKKworCWEgPSBpMmNfZ2V0X2FkYXB0ZXIoMCk7CisJaWYgKCFhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHNldCBiaXQgNiAodGhlIDd0aCBiaXQpIG9mIGNoaXAgYXQgMHgwOSwgcmVnaXN0ZXIgMHgxMyAqLworCWJ1ZlswXSA9IDB4MTM7CisJbXNnLmFkZHIgPSAweDA5OworCW1zZy5idWYgPSBidWY7CisJbXNnLmxlbiA9IDE7CisJbXNnLmZsYWdzID0gMDsKKwlyZXQgPSBpMmNfdHJhbnNmZXIoYSwgJm1zZywgMSk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJ1ZlswXSA9IDA7CisJbXNnLmFkZHIgPSAweDA5OworCW1zZy5idWYgPSBidWY7CisJbXNnLmxlbiA9IDE7CisJbXNnLmZsYWdzID0gSTJDX01fUkQ7CisJcmV0ID0gaTJjX3RyYW5zZmVyKGEsICZtc2csIDEpOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlidWZbMV0gPSBidWZbMF0gfCAoMSA8PCA2KTsKKwlidWZbMF0gPSAweDEzOworCW1zZy5hZGRyID0gMHgwOTsKKwltc2cuYnVmID0gYnVmOworCW1zZy5sZW4gPSAyOworCW1zZy5mbGFncyA9IDA7CisJcmV0ID0gaTJjX3RyYW5zZmVyKGEsICZtc2csIDEpOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KICNlbHNlCiBzdGF0aWMgaW50IGtmcjJyMDlfdXNiMF9nYWRnZXRfaTJjX3NldHVwKHZvaWQpCiB7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CisKK3N0YXRpYyBpbnQga2ZyMnIwOV9zZXJpYWxfaTJjX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CiAjZW5kaWYKIAogc3RhdGljIGludCBrZnIycjA5X3VzYjBfZ2FkZ2V0X3NldHVwKHZvaWQpCkBAIC0yOTksMTEgKzQ5MywyNyBAQAogCXJldHVybiAwOwogfQogCitleHRlcm4gY2hhciBrZnIycjA5X3NkcmFtX2VudGVyX3N0YXJ0OworZXh0ZXJuIGNoYXIga2ZyMnIwOV9zZHJhbV9lbnRlcl9lbmQ7CitleHRlcm4gY2hhciBrZnIycjA5X3NkcmFtX2xlYXZlX3N0YXJ0OworZXh0ZXJuIGNoYXIga2ZyMnIwOV9zZHJhbV9sZWF2ZV9lbmQ7CisKIHN0YXRpYyBpbnQgX19pbml0IGtmcjJyMDlfZGV2aWNlc19zZXR1cCh2b2lkKQogeworCS8qIHJlZ2lzdGVyIGJvYXJkIHNwZWNpZmljIHNlbGYtcmVmcmVzaCBjb2RlICovCisJc2hfbW9iaWxlX3JlZ2lzdGVyX3NlbGZfcmVmcmVzaChTVVNQX1NIX1NUQU5EQlkgfCBTVVNQX1NIX1NGIHwKKwkJCQkJU1VTUF9TSF9SU1RBTkRCWSwKKwkJCQkJJmtmcjJyMDlfc2RyYW1fZW50ZXJfc3RhcnQsCisJCQkJCSZrZnIycjA5X3NkcmFtX2VudGVyX2VuZCwKKwkJCQkJJmtmcjJyMDlfc2RyYW1fbGVhdmVfc3RhcnQsCisJCQkJCSZrZnIycjA5X3NkcmFtX2xlYXZlX2VuZCk7CisKIAkvKiBlbmFibGUgU0NJRjEgc2VyaWFsIHBvcnQgZm9yIFlDNDAxIGNvbnNvbGUgc3VwcG9ydCAqLwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUYxX1JYRCwgTlVMTCk7CiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRjFfVFhELCBOVUxMKTsKKwlrZnIycjA5X3NlcmlhbF9pMmNfc2V0dXAoKTsgLyogRUNPTlRNU0soYml0Nj1MMTBPTkVOKSBzZXQgMSAqLworCWdwaW9fcmVxdWVzdChHUElPX1BURzMsIE5VTEwpOyAvKiBIUE9OX09OICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUFRHMywgMSk7IC8qIEhQT05fT04gPSBIICovCiAKIAkvKiBzZXR1cCBOT1IgZmxhc2ggYXQgQ1MwICovCiAJY3RybF9vdXRsKDB4MzZkYjA0MDAsIEJTQ19DUzBCQ1IpOwpAQCAtMzYxLDYgKzU3MSwzMiBAQAogCWlmIChrZnIycjA5X3VzYjBfZ2FkZ2V0X3NldHVwKCkgPT0gMCkKIAkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZrZnIycjA5X3VzYjBfZ2FkZ2V0X2RldmljZSk7CiAKKwkvKiBDRVUgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU9fQ0tPLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8wX0NMSywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9WRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9IRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9GTEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDcsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDYsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDMsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDAsIE5VTEwpOworCisJcGxhdGZvcm1fcmVzb3VyY2Vfc2V0dXBfbWVtb3J5KCZrZnIycjA5X2NldV9kZXZpY2UsICJjZXUiLCA0IDw8IDIwKTsKKworCS8qIFNESEkwIGNvbm5lY3RlZCB0byB5YzMwNCAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwQ0QsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDMsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwQ01ELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMENMSywgTlVMTCk7CisKIAlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoa2ZyMnIwOV9kZXZpY2VzLAogCQkJCSAgICBBUlJBWV9TSVpFKGtmcjJyMDlfZGV2aWNlcykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL21hY2gtbWlnb3IvTWFrZWZpbGUKaW5kZXggNWYyMzFkZC4uNDYwMWE4OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL01ha2VmaWxlCkBAIC0xLDIgKzEsMiBAQAotb2JqLXkJIDo9IHNldHVwLm8KK29iai15CSA6PSBzZXR1cC5vIHNkcmFtLm8KIG9iai0kKENPTkZJR19TSF9NSUdPUl9RVkdBKQkrPSAgbGNkX3F2Z2EubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZHJhbS5TIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZHJhbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNGFhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NkcmFtLlMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIE1pZ28tUiBzZHJhbSBzZWxmL2F1dG8tcmVmcmVzaCBzZXR1cCBjb2RlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgorI2luY2x1ZGUgPGFzbS9yb21pbWFnZS1tYWNyb3MuaD4KKworLyogY29kZSB0byBlbnRlciBhbmQgbGVhdmUgc2VsZi1yZWZyZXNoLiBtdXN0IGJlIHNlbGYtY29udGFpbmVkLgorICogdGhpcyBjb2RlIHdpbGwgYmUgY29waWVkIHRvIG9uLWNoaXAgbWVtb3J5IGFuZCBleGVjdXRlZCBmcm9tIHRoZXJlLgorICovCisJLmJhbGlnbiA0CitFTlRSWShtaWdvcl9zZHJhbV9lbnRlcl9zdGFydCkKKworCS8qIFNCU0M6IGRpc2FibGUgcG93ZXIgZG93biBhbmQgcHV0IGluIHNlbGYtcmVmcmVzaCBtb2RlICovCisJbW92LmwJMWYsIHI0CisJbW92LmwJMmYsIHIxCisJbW92LmwJQHI0LCByMgorCW9yCXIxLCByMgorCW1vdi5sICAgM2YsIHIzCisJYW5kCXIzLCByMgorCW1vdi5sCXIyLCBAcjQKKworCXJ0cworCSBub3AKKworCS5iYWxpZ24gNAorMToJLmxvbmcJMHhmZTQwMDAwOCAvKiBTRENSMCAqLworMjoJLmxvbmcJMHgwMDAwMDQwMAorMzoJLmxvbmcJMHhmZmZmN2ZmZgorRU5UUlkobWlnb3Jfc2RyYW1fZW50ZXJfZW5kKQorCisJLmJhbGlnbiA0CitFTlRSWShtaWdvcl9zZHJhbV9sZWF2ZV9zdGFydCkKKworCS8qIFNCU0M6IHNldCBhdXRvLXJlZnJlc2ggbW9kZSAqLworCW1vdi5sCTFmLCByNAorCW1vdi5sCUByNCwgcjAKKwltb3YubCAgIDRmLCByMQorCWFuZAlyMSwgcjAKKwltb3YubAlyMCwgQHI0CisJbW92LmwJNmYsIHI0CisJbW92LmwJOGYsIHIwCisJbW92LmwJQHI0LCByMQorCW1vdgkjLTEsIHI0CisJYWRkCXI0LCByMQorCW9yCXIxLCByMAorCW1vdi5sCTdmLCByMQorCW1vdi5sCXIwLCBAcjEKKworCXJ0cworCSBub3AKKworCS5iYWxpZ24gNAorMToJLmxvbmcJMHhmZTQwMDAwOCAvKiBTRENSMCAqLworNDoJLmxvbmcJMHhmZmZmZmJmZgorNjoJLmxvbmcgICAweGZlNDAwMDFjIC8qIFJUQ09SICovCis3OgkubG9uZyAgIDB4ZmU0MDAwMTggLyogUlRDTlQgKi8KKzg6CS5sb25nICAgMHhhNTVhMDAwMAorRU5UUlkobWlnb3Jfc2RyYW1fbGVhdmVfZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jCmluZGV4IDZlZDFmZDMuLjkwOTliNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtbWlnb3Ivc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NoX2tleXNjLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtMTgsOCArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2dwaW8uaD4KICNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfbGNkYy5oPgogI2luY2x1ZGUgPG1lZGlhL3NoX21vYmlsZV9jZXUuaD4KICNpbmNsdWRlIDxtZWRpYS9vdjc3MnguaD4KQEAgLTI3LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vY2xvY2suaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zaF9rZXlzYy5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9taWdvci5oPgogI2luY2x1ZGUgPGNwdS9zaDc3MjIuaD4KIApAQCAtMzkwLDE3ICszODksMjUgQEAKIAl9LAogfTsKIAotc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgc2RjYXJkX2NuOV9wbGF0Zm9ybV9kYXRhID0gewotCS5zY2sgPSBHUElPX1BURDAsCi0JLm1vc2kgPSBHUElPX1BURDEsCi0JLm1pc28gPSBHUElPX1BURDIsCi0JLm51bV9jaGlwc2VsZWN0ID0gMSwKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaV9jbjlfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJTREhJIiwKKwkJLnN0YXJ0CT0gMHgwNGNlMDAwMCwKKwkJLmVuZAk9IDB4MDRjZTAxZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxMDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RjYXJkX2NuOV9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNwaV9ncGlvIiwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZzZGNhcmRfY245X3BsYXRmb3JtX2RhdGEsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpX2NuOV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX21vYmlsZV9zZGhpIiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2RoaV9jbjlfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzZGhpX2NuOV9yZXNvdXJjZXMsCisJLmFyY2hkYXRhID0geworCQkuaHdibGtfaWQgPSBIV0JMS19TREhJLAogCX0sCiB9OwogCkBAIC00NjcsMjMgKzQ3NCwyNCBAQAogCSZtaWdvcl9jZXVfZGV2aWNlLAogCSZtaWdvcl9ub3JfZmxhc2hfZGV2aWNlLAogCSZtaWdvcl9uYW5kX2ZsYXNoX2RldmljZSwKLQkmc2RjYXJkX2NuOV9kZXZpY2UsCisJJnNkaGlfY245X2RldmljZSwKIAkmbWlnb3JfY2FtZXJhWzBdLAogCSZtaWdvcl9jYW1lcmFbMV0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIG1pZ29yX3NwaV9kZXZpY2VzW10gPSB7Ci0JewotCQkubW9kYWxpYXMgPSAibW1jX3NwaSIsCi0JCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLAotCQkuY2hpcF9zZWxlY3QgPSAwLAotCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgR1BJT19QVEQ1LAotCX0sCi19OworZXh0ZXJuIGNoYXIgbWlnb3Jfc2RyYW1fZW50ZXJfc3RhcnQ7CitleHRlcm4gY2hhciBtaWdvcl9zZHJhbV9lbnRlcl9lbmQ7CitleHRlcm4gY2hhciBtaWdvcl9zZHJhbV9sZWF2ZV9zdGFydDsKK2V4dGVybiBjaGFyIG1pZ29yX3NkcmFtX2xlYXZlX2VuZDsKIAogc3RhdGljIGludCBfX2luaXQgbWlnb3JfZGV2aWNlc19zZXR1cCh2b2lkKQogewotCisJLyogcmVnaXN0ZXIgYm9hcmQgc3BlY2lmaWMgc2VsZi1yZWZyZXNoIGNvZGUgKi8KKwlzaF9tb2JpbGVfcmVnaXN0ZXJfc2VsZl9yZWZyZXNoKFNVU1BfU0hfU1RBTkRCWSB8IFNVU1BfU0hfU0YsCisJCQkJCSZtaWdvcl9zZHJhbV9lbnRlcl9zdGFydCwKKwkJCQkJJm1pZ29yX3NkcmFtX2VudGVyX2VuZCwKKwkJCQkJJm1pZ29yX3NkcmFtX2xlYXZlX3N0YXJ0LAorCQkJCQkmbWlnb3Jfc2RyYW1fbGVhdmVfZW5kKTsKICNpZmRlZiBDT05GSUdfUE0KIAkvKiBMZXQgRDExIExFRCBzaG93IFNUQVRVUzAgKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9TVEFUVVMwLCBOVUxMKTsKQEAgLTUyNSw2ICs1MzMsMTYgQEAKIAlncGlvX3JlcXVlc3QoR1BJT19QVEExLCBOVUxMKTsKIAlncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX1BUQTEpOwogCisJLyogU0RISSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISVdQLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDMsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQxLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDTUQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDTEssIE5VTEwpOworCiAJLyogVG91Y2ggUGFuZWwgKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9JUlE2LCBOVUxMKTsKIApAQCAtNjEyLDkgKzYzMCw2IEBACiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbWlnb3JfaTJjX2RldmljZXMsCiAJCQkJQVJSQVlfU0laRShtaWdvcl9pMmNfZGV2aWNlcykpOwogCi0Jc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8obWlnb3Jfc3BpX2RldmljZXMsCi0JCQkJQVJSQVlfU0laRShtaWdvcl9zcGlfZGV2aWNlcykpOwotCiAJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKG1pZ29yX2RldmljZXMsIEFSUkFZX1NJWkUobWlnb3JfZGV2aWNlcykpOwogfQogYXJjaF9pbml0Y2FsbChtaWdvcl9kZXZpY2VzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtcjJkL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1yMmQvaXJxLmMKaW5kZXggYzcwZmVjZS4uNzhkN2IyNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1yMmQvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1yMmQvaXJxLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCiBpbnQgcnRzNzc1MXIyZF9pcnFfZGVtdXgoaW50IGlycSkKIHsKLQlpZiAoaXJxID49IFIyRF9OUl9JUkwgfHwgIWlybDJpcnFbaXJxXSkKKwlpZiAoaXJxID49IFIyRF9OUl9JUkwgfHwgaXJxIDwgMCB8fCAhaXJsMmlycVtpcnFdKQogCQlyZXR1cm4gaXJxOwogCiAJcmV0dXJuIGlybDJpcnFbaXJxXTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyMi9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyMi9pcnEuYwppbmRleCAwMmQyMWEzLi40ZWIzMWFjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjIvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzIyL2lycS5jCkBAIC0xNiwxNSArMTYsMTcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoLXNlL21hY2gvc2U3NzIyLmg+CiAKK3Vuc2lnbmVkIGludCBzZTc3MjJfZnBnYV9pcnFbU0U3NzIyX0ZQR0FfSVJRX05SXSA9IHsgMCwgfTsKKwogc3RhdGljIHZvaWQgZGlzYWJsZV9zZTc3MjJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgaW50IGJpdCA9IGlycSAtIFNFNzcyMl9GUEdBX0lSUV9CQVNFOworCXVuc2lnbmVkIGludCBiaXQgPSAodW5zaWduZWQgaW50KWdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJY3RybF9vdXR3KGN0cmxfaW53KElSUTAxX01BU0spIHwgMSA8PCBiaXQsIElSUTAxX01BU0spOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfc2U3NzIyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGludCBiaXQgPSBpcnEgLSBTRTc3MjJfRlBHQV9JUlFfQkFTRTsKKwl1bnNpZ25lZCBpbnQgYml0ID0gKHVuc2lnbmVkIGludClnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCWN0cmxfb3V0dyhjdHJsX2ludyhJUlEwMV9NQVNLKSAmIH4oMSA8PCBiaXQpLCBJUlEwMV9NQVNLKTsKIH0KIApAQCAtMzgsMTggKzQwLDE1IEBACiBzdGF0aWMgdm9pZCBzZTc3MjJfaXJxX2RlbXV4KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBzaG9ydCBpbnR2ID0gY3RybF9pbncoSVJRMDFfU1RTKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmV4dF9kZXNjOwotCXVuc2lnbmVkIGludCBleHRfaXJxID0gU0U3NzIyX0ZQR0FfSVJRX0JBU0U7CisJdW5zaWduZWQgaW50IGV4dF9pcnEgPSAwOwogCiAJaW50diAmPSAoMSA8PCBTRTc3MjJfRlBHQV9JUlFfTlIpIC0gMTsKIAotCXdoaWxlIChpbnR2KSB7Ci0JCWlmIChpbnR2ICYgMSkgewotCQkJZXh0X2Rlc2MgPSBpcnFfZGVzYyArIGV4dF9pcnE7Ci0JCQloYW5kbGVfbGV2ZWxfaXJxKGV4dF9pcnEsIGV4dF9kZXNjKTsKLQkJfQotCQlpbnR2ID4+PSAxOwotCQlleHRfaXJxKys7CisJZm9yICg7IGludHY7IGludHYgPj49IDEsIGV4dF9pcnErKykgeworCQlpZiAoIShpbnR2ICYgMSkpCisJCQljb250aW51ZTsKKworCQlnZW5lcmljX2hhbmRsZV9pcnEoc2U3NzIyX2ZwZ2FfaXJxW2V4dF9pcnFdKTsKIAl9CiB9CiAKQEAgLTYzLDExICs2MiwxOCBAQAogCWN0cmxfb3V0dygwLCBJUlEwMV9NQVNLKTsgICAgICAgLyogZGlzYWJsZSBhbGwgaXJxcyAqLwogCWN0cmxfb3V0dygweDIwMDAsIDB4YjAzZmZmZWMpOyAgLyogbXJzaHBjIGlycSBlbmFibGUgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBTRTc3MjJfRlBHQV9JUlFfTlI7IGkrKykKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoU0U3NzIyX0ZQR0FfSVJRX0JBU0UgKyBpLAorCWZvciAoaSA9IDA7IGkgPCBTRTc3MjJfRlBHQV9JUlFfTlI7IGkrKykgeworCQlzZTc3MjJfZnBnYV9pcnFbaV0gPSBjcmVhdGVfaXJxKCk7CisJCWlmIChzZTc3MjJfZnBnYV9pcnFbaV0gPCAwKQorCQkJcmV0dXJuOworCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHNlNzcyMl9mcGdhX2lycVtpXSwKIAkJCQkJICAgICAgJnNlNzcyMl9pcnFfY2hpcCwKIAkJCQkJICAgICAgaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7CiAKKwkJc2V0X2lycV9jaGlwX2RhdGEoc2U3NzIyX2ZwZ2FfaXJxW2ldLCAodm9pZCAqKWkpOworCX0KKwogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUTBfSVJRLCBzZTc3MjJfaXJxX2RlbXV4KTsKIAlzZXRfaXJxX3R5cGUoSVJRMF9JUlEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyMi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzIyL3NldHVwLmMKaW5kZXggMzYzNzQwNy4uYjFjYjk0MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzIyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzIyL3NldHVwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NoX2tleXNjLmg+CiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAjaW5jbHVkZSA8bWFjaC1zZS9tYWNoL3NlNzcyMi5oPgogI2luY2x1ZGUgPG1hY2gtc2UvbWFjaC9tcnNocGMuaD4KQEAgLTIxLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaGVhcnRiZWF0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NoX2tleXNjLmg+CiAjaW5jbHVkZSA8Y3B1L3NoNzcyMi5oPgogCiAvKiBIZWFydGJlYXQgKi8KQEAgLTYwLDggKzYwLDcgQEAKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewotCQkuc3RhcnQgID0gU01DX0lSUSwKLQkJLmVuZCAgICA9IFNNQ19JUlEsCisJCS8qIEZpbGxlZCBpbiBsYXRlciAqLwogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CkBAIC05MCw4ICs4OSw3IEBACiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAogCX0sCiAJWzJdID0gewotCQkuc3RhcnQgID0gTVJTSFBDX0lSUTAsCi0JCS5lbmQgICAgPSBNUlNIUENfSVJRMCwKKwkJLyogRmlsbGVkIGluIGxhdGVyICovCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKQEAgLTE1Myw2ICsxNTEsMTQgQEAKIHN0YXRpYyBpbnQgX19pbml0IHNlNzcyMl9kZXZpY2VzX3NldHVwKHZvaWQpCiB7CiAJbXJzaHBjX3NldHVwX3dpbmRvd3MoKTsKKworCS8qIFdpcmUtdXAgZHluYW1pYyB2ZWN0b3JzICovCisJY2ZfaWRlX3Jlc291cmNlc1syXS5zdGFydCA9IGNmX2lkZV9yZXNvdXJjZXNbMl0uZW5kID0KKwkJc2U3NzIyX2ZwZ2FfaXJxW1NFNzcyMl9GUEdBX0lSUV9NUlNIUEMwXTsKKworCXNtYzkxeF9ldGhfcmVzb3VyY2VzWzFdLnN0YXJ0ID0gc21jOTF4X2V0aF9yZXNvdXJjZXNbMV0uZW5kID0KKwkJc2U3NzIyX2ZwZ2FfaXJxW1NFNzcyMl9GUEdBX0lSUV9TTUNdOworCiAJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlNzcyMl9kZXZpY2VzLCBBUlJBWV9TSVpFKHNlNzcyMl9kZXZpY2VzKSk7CiB9CiBkZXZpY2VfaW5pdGNhbGwoc2U3NzIyX2RldmljZXNfc2V0dXApOwpAQCAtMTkzLDYgKzE5OSw1IEBACiBzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzcyMiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSAgICAgICAgICAgICAgICA9ICJTb2x1dGlvbiBFbmdpbmUgNzcyMiIgLAogCS5tdl9zZXR1cCAgICAgICAgICAgICAgID0gc2U3NzIyX3NldHVwICwKLQkubXZfbnJfaXJxcwkJPSBTRTc3MjJfRlBHQV9JUlFfQkFTRSArIFNFNzcyMl9GUEdBX0lSUV9OUiwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9zZTc3MjJfSVJRLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9NYWtlZmlsZQppbmRleCAzNDljYmQ2Li5hMDhiMzY4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L01ha2VmaWxlCkBAIC03LDQgKzcsNCBAQAogIwogIwogCi1vYmoteQkgOj0gc2V0dXAubyBpcnEubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai15CSA6PSBzZXR1cC5vIGlycS5vIHNkcmFtLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZHJhbS5TIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NkcmFtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0MDE2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZHJhbS5TCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBNUzc3MjRTRSBzZHJhbSBzZWxmL2F1dG8tcmVmcmVzaCBzZXR1cCBjb2RlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgorI2luY2x1ZGUgPGFzbS9yb21pbWFnZS1tYWNyb3MuaD4KKworLyogY29kZSB0byBlbnRlciBhbmQgbGVhdmUgc2VsZi1yZWZyZXNoLiBtdXN0IGJlIHNlbGYtY29udGFpbmVkLgorICogdGhpcyBjb2RlIHdpbGwgYmUgY29waWVkIHRvIG9uLWNoaXAgbWVtb3J5IGFuZCBleGVjdXRlZCBmcm9tIHRoZXJlLgorICovCisJLmJhbGlnbiA0CitFTlRSWShtczc3MjRzZV9zZHJhbV9lbnRlcl9zdGFydCkKKworCS8qIERCU0M6IHB1dCBtZW1vcnkgaW4gc2VsZi1yZWZyZXNoIG1vZGUgKi8KKworCUVEIDB4RkQwMDAwMTAsIDB4MDAwMDAwMDAgLyogREJFTiAqLworCUVEIDB4RkQwMDAwNDAsIDB4MDAwMDAwMDAgLyogREJSRlBETjAgKi8KKwlFRCAweEZEMDAwMDE0LCAweDAwMDAwMDAyIC8qIERCQ01EQ05UIChQQUxMKSAqLworCUVEIDB4RkQwMDAwMTQsIDB4MDAwMDAwMDQgLyogREJDTURDTlQgKFJFRikgKi8KKwlFRCAweEZEMDAwMDQwLCAweDAwMDAwMDAxIC8qIERCUkZQRE4wICovCisKKwlydHMKKwkgbm9wCisKK0VOVFJZKG1zNzcyNHNlX3NkcmFtX2VudGVyX2VuZCkKKworCS5iYWxpZ24gNAorRU5UUlkobXM3NzI0c2Vfc2RyYW1fbGVhdmVfc3RhcnQpCisKKwkvKiBEQlNDOiBwdXQgbWVtb3J5IGluIGF1dG8tcmVmcmVzaCBtb2RlICovCisKKwlFRCAweEZEMDAwMDQwLCAweDAwMDAwMDAwIC8qIERCUkZQRE4wICovCisJV0FJVCAxCisJRUQgMHhGRDAwMDAxNCwgMHgwMDAwMDAwMiAvKiBEQkNNRENOVCAoUEFMTCkgKi8KKwlFRCAweEZEMDAwMDE0LCAweDAwMDAwMDA0IC8qIERCQ01EQ05UIChSRUYpICovCisJRUQgMHhGRDAwMDAxMCwgMHgwMDAwMDAwMSAvKiBEQkVOICovCisJRUQgMHhGRDAwMDA0MCwgMHgwMDAxMDAwMCAvKiBEQlJGUEROMCAqLworCisJcnRzCisJIG5vcAorCitFTlRSWShtczc3MjRzZV9zZHJhbV9sZWF2ZV9lbmQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCmluZGV4IDA4OTRiYmEuLjRiMGYwYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvc2hfa2V5c2MuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcjhhNjY1OTcuaD4KICNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfbGNkYy5oPgogI2luY2x1ZGUgPG1lZGlhL3NoX21vYmlsZV9jZXUuaD4KQEAgLTI3LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vaGVhcnRiZWF0Lmg+CiAjaW5jbHVkZSA8YXNtL3NoX2V0aC5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9zaF9rZXlzYy5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8Y3B1L3NoNzcyNC5oPgogI2luY2x1ZGUgPG1hY2gtc2UvbWFjaC9zZTc3MjQuaD4KIApAQCAtNDUxLDYgKzQ1Miw1MiBAQAogCS5yZXNvdXJjZQk9IHNoNzcyNF91c2IxX2dhZGdldF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNkaGkwX2NuN19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlNESEkwIiwKKwkJLnN0YXJ0ICA9IDB4MDRjZTAwMDAsCisJCS5lbmQgICAgPSAweDA0Y2UwMWZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAxMDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RoaTBfY243X2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAic2hfbW9iaWxlX3NkaGkiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc2RoaTBfY243X3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gc2RoaTBfY243X3Jlc291cmNlcywKKwkuYXJjaGRhdGEgPSB7CisJCS5od2Jsa19pZCA9IEhXQkxLX1NESEkwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNkaGkxX2NuOF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlNESEkxIiwKKwkJLnN0YXJ0ICA9IDB4MDRjZjAwMDAsCisJCS5lbmQgICAgPSAweDA0Y2YwMWZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAyNCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpMV9jbjhfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJzaF9tb2JpbGVfc2RoaSIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzZGhpMV9jbjhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzZGhpMV9jbjhfcmVzb3VyY2VzLAorCS5hcmNoZGF0YSA9IHsKKwkJLmh3YmxrX2lkID0gSFdCTEtfU0RISTEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptczc3MjRzZV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmaGVhcnRiZWF0X2RldmljZSwKIAkmc21jOTF4X2V0aF9kZXZpY2UsCkBAIC00NjMsNiArNTEwLDggQEAKIAkmc2g3NzI0X3VzYjBfaG9zdF9kZXZpY2UsCiAJJnNoNzcyNF91c2IxX2dhZGdldF9kZXZpY2UsCiAJJmZzaV9kZXZpY2UsCisJJnNkaGkwX2NuN19kZXZpY2UsCisJJnNkaGkxX2NuOF9kZXZpY2UsCiB9OwogCiAjZGVmaW5lIEVFUFJPTV9PUCAgIDB4QkEyMDYwMDAKQEAgLTQ4Nyw3ICs1MzYsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHNoX2V0aF9pbml0KHZvaWQpCiB7CiAJaW50IGk7Ci0JdTE2IG1hY1szXTsKKwl1MTYgbWFjOwogCiAJLyogY2hlY2sgRUVQUk9NIHN0YXR1cyAqLwogCWlmICghc2hfZXRoX2lzX2VlcHJvbV9yZWFkeSgpKQpAQCAtNTAxLDE2ICs1NTAsMTAgQEAKIAkJaWYgKCFzaF9ldGhfaXNfZWVwcm9tX3JlYWR5KCkpCiAJCQlyZXR1cm47CiAKLQkJbWFjW2ldID0gY3RybF9pbncoRUVQUk9NX0RBVEEpOwotCQltYWNbaV0gPSAoKG1hY1tpXSAmIDB4RkYpIDw8IDgpIHwgKG1hY1tpXSA+PiA4KTsgLyogc3dhcCAqLworCQltYWMgPSBjdHJsX2ludyhFRVBST01fREFUQSk7CisJCXNoX2V0aF9wbGF0Lm1hY19hZGRyW2kgPDwgMV0gPSBtYWMgJiAweGZmOworCQlzaF9ldGhfcGxhdC5tYWNfYWRkclsoaSA8PCAxKSArIDFdID0gbWFjID4+IDg7CiAJfQotCi0JLyogcmVzZXQgc2gtZXRoICovCi0JY3RybF9vdXRsKDB4MSwgU0hfRVRIX0FERFIgKyAweDApOwotCi0JLyogc2V0IE1BQyBhZGRyICovCi0JY3RybF9vdXRsKCgobWFjWzBdIDw8IDE2KSB8IChtYWNbMV0pKSwgU0hfRVRIX01BSFIpOwotCWN0cmxfb3V0bCgobWFjWzJdKSwgU0hfRVRIX01BTFIpOwogfQogCiAjZGVmaW5lIFNXNDE0MCAgICAweEJBMjAxMDAwCkBAIC01MjcsMTEgKzU3MCwyMiBAQAogI2RlZmluZSBTVzQxX0cgICAgMHg0MDAwCiAjZGVmaW5lIFNXNDFfSCAgICAweDgwMDAKIAorZXh0ZXJuIGNoYXIgbXM3NzI0c2Vfc2RyYW1fZW50ZXJfc3RhcnQ7CitleHRlcm4gY2hhciBtczc3MjRzZV9zZHJhbV9lbnRlcl9lbmQ7CitleHRlcm4gY2hhciBtczc3MjRzZV9zZHJhbV9sZWF2ZV9zdGFydDsKK2V4dGVybiBjaGFyIG1zNzcyNHNlX3NkcmFtX2xlYXZlX2VuZDsKKwogc3RhdGljIGludCBfX2luaXQgZGV2aWNlc19zZXR1cCh2b2lkKQogewogCXUxNiBzdyA9IGN0cmxfaW53KFNXNDE0MCk7IC8qIHNlbGVjdCBjYW1lcmEsIG1vbml0b3IgKi8KIAlzdHJ1Y3QgY2xrICpmc2lhX2NsazsKIAorCS8qIHJlZ2lzdGVyIGJvYXJkIHNwZWNpZmljIHNlbGYtcmVmcmVzaCBjb2RlICovCisJc2hfbW9iaWxlX3JlZ2lzdGVyX3NlbGZfcmVmcmVzaChTVVNQX1NIX1NUQU5EQlkgfCBTVVNQX1NIX1NGLAorCQkJCQkmbXM3NzI0c2Vfc2RyYW1fZW50ZXJfc3RhcnQsCisJCQkJCSZtczc3MjRzZV9zZHJhbV9lbnRlcl9lbmQsCisJCQkJCSZtczc3MjRzZV9zZHJhbV9sZWF2ZV9zdGFydCwKKwkJCQkJJm1zNzcyNHNlX3NkcmFtX2xlYXZlX2VuZCk7CiAJLyogUmVzZXQgUmVsZWFzZSAqLwogCWN0cmxfb3V0dyhjdHJsX2ludyhGUEdBX09VVCkgJgogCQkgIH4oKDEgPDwgMSkgIHwgLyogTEFOICovCkBAIC03MDEsNiArNzU1LDI2IEBACiAJY2xrX3NldF9yYXRlKCZmc2ltY2thX2NsaywgMTEwMDApOwogCWNsa19wdXQoZnNpYV9jbGspOwogCisJLyogU0RISTAgY29ubmVjdGVkIHRvIGNuNyAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwQ0QsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwV1AsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDMsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwRDAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkwQ01ELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJMENMSywgTlVMTCk7CisKKwkvKiBTREhJMSBjb25uZWN0ZWQgdG8gY244ICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFDRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFXUCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFEMCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISTFDTUQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESEkxQ0xLLCBOVUxMKTsKKwogCS8qCiAJICogZW5hYmxlIFNILUV0aAogCSAqCmRpZmYgLS1naXQgYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggZmQ1NmE3MS4uYjUxYjFmYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAjaWZkZWYgQ09ORklHX1NVUEVSSDY0CiAJb3V0cHV0X2FkZHIgPSAoQ09ORklHX01FTU9SWV9TVEFSVCArIDB4MjAwMCk7CiAjZWxzZQotCW91dHB1dF9hZGRyID0gUEhZU0FERFIoKHVuc2lnbmVkIGxvbmcpJl90ZXh0K1BBR0VfU0laRSk7CisJb3V0cHV0X2FkZHIgPSBfX3BhKCh1bnNpZ25lZCBsb25nKSZfdGV4dCtQQUdFX1NJWkUpOwogI2lmZGVmIENPTkZJR18yOUJJVAogCW91dHB1dF9hZGRyIHw9IFAyU0VHOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NoL2Jvb3Qvcm9taW1hZ2UvTWFrZWZpbGUgYi9hcmNoL3NoL2Jvb3Qvcm9taW1hZ2UvTWFrZWZpbGUKaW5kZXggNTgwNmVlZS4uZjQ3M2EyNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib290L3JvbWltYWdlL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9vdC9yb21pbWFnZS9NYWtlZmlsZQpAQCAtNCwxNiArNCwyMiBAQAogIyBjcmVhdGUgYW4gaW1hZ2Ugc3VpdGFibGUgZm9yIGJ1cm5pbmcgdG8gZmxhc2ggZnJvbSB6SW1hZ2UKICMKIAotdGFyZ2V0cwkJOj0gdm1saW51eCBoZWFkLm8KK3RhcmdldHMJCTo9IHZtbGludXggaGVhZC5vIHplcm9wYWdlLmJpbiBwaWdneS5vCiAKIE9CSkVDVFMgPSAkKG9iaikvaGVhZC5vCi1MREZMQUdTX3ZtbGludXggOj0gLS1vZm9ybWF0ICQobGQtYmZkKSAtVHRleHQgMCAtZSByb21zdGFydAorTERGTEFHU192bWxpbnV4IDo9IC0tb2Zvcm1hdCAkKGxkLWJmZCkgLVR0ZXh0IDAgLWUgcm9tc3RhcnQgXAorCQkgICAtVCAkKG9iaikvLi4vLi4va2VybmVsL3ZtbGludXgubGRzCiAKICQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCiAJQDoKIAorT0JKQ09QWUZMQUdTICs9IC1qIC5lbXB0eV96ZXJvX3BhZ2UKKworJChvYmopL3plcm9wYWdlLmJpbjogdm1saW51eCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCisKIExERkxBR1NfcGlnZ3kubyA6PSAtciAtLWZvcm1hdCBiaW5hcnkgLS1vZm9ybWF0ICQobGQtYmZkKSAtVAogCi0kKG9iaikvcGlnZ3kubzogJChvYmopL3ZtbGludXguc2NyIGFyY2gvc2gvYm9vdC96SW1hZ2UgRk9SQ0UKKyQob2JqKS9waWdneS5vOiAkKG9iaikvdm1saW51eC5zY3IgJChvYmopL3plcm9wYWdlLmJpbiBhcmNoL3NoL2Jvb3QvekltYWdlIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2Jvb3Qvcm9taW1hZ2UvaGVhZC5TIGIvYXJjaC9zaC9ib290L3JvbWltYWdlL2hlYWQuUwppbmRleCAyMTliYzYyLi45M2U3NzlhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3Qvcm9taW1hZ2UvaGVhZC5TCisrKyBiL2FyY2gvc2gvYm9vdC9yb21pbWFnZS9oZWFkLlMKQEAgLTUsNiArNSw0NCBAQAogICovCiAKIC50ZXh0CisJI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKIAkuZ2xvYmFsCXJvbXN0YXJ0CiByb21zdGFydDoKKwkvKiBpbmNsdWRlIGJvYXJkIHNwZWNpZmljIHNldHVwIGNvZGUgKi8KICNpbmNsdWRlIDxtYWNoL3JvbWltYWdlLmg+CisKKwkvKiBjb3B5IHRoZSBlbXB0eV96ZXJvX3BhZ2UgY29udGVudHMgdG8gd2hlcmUgdm1saW51eCBleHBlY3RzIGl0ICovCisJbW92YQllbXB0eV96ZXJvX3BhZ2Vfc3JjLCByMAorCW1vdi5sCWVtcHR5X3plcm9fcGFnZV9kc3QsIHIxCisJbW92CSMoUEFHRV9TSElGVCAtIDQpLCByNAorCW1vdgkjMSwgcjMKKwlzaGxkCXI0LCByMyAvKiByMyA9IFBBR0VfU0laRSAvIDE2ICovCisKKzE6CisJbW92LmwJQHIwLCByNAorCW1vdi5sCUAoNCwgcjApLCByNQorCW1vdi5sCUAoOCwgcjApLCByNgorCW1vdi5sCUAoMTIsIHIwKSwgcjcKKwlhZGQJIzE2LHIwCisJbW92LmwJcjQsIEByMQorCW1vdi5sCXI1LCBAKDQsIHIxKQorCW1vdi5sCXI2LCBAKDgsIHIxKQorCW1vdi5sCXI3LCBAKDEyLCByMSkKKwlkdAlyMworCWFkZAkjMTYscjEKKwliZgkxYgorCisJLyoganVtcCB0byB0aGUgekltYWdlIGVudHJ5IHBvaW50IGxvY2F0ZWQgYWZ0ZXIgdGhlIHplcm8gcGFnZSBkYXRhICovCisJbW92CSNQQUdFX1NISUZULCByNAorCW1vdgkjMSwgcjEKKwlzaGxkCXI0LCByMQorCW1vdmEJZW1wdHlfemVyb19wYWdlX3NyYywgcjAKKwlhZGQJcjEsIHIwCisJam1wCUByMAorCSBub3AKKworCS5hbGlnbiAyCitlbXB0eV96ZXJvX3BhZ2VfZHN0OgorCS5sb25nCV90ZXh0CitlbXB0eV96ZXJvX3BhZ2Vfc3JjOgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMKaW5kZXggMzQ3ZWUxMS4uMWVlNjMxZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zeXNmcy5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KQEAgLTIxLDcgKzIwLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGRtYV9zeXNjbGFzcyA9IHsKIAkubmFtZSA9ICJkbWEiLAogfTsKLUVYUE9SVF9TWU1CT0woZG1hX3N5c2NsYXNzKTsKIAogc3RhdGljIHNzaXplX3QgZG1hX3Nob3dfZGV2aWNlcyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGI1ODUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotY29uZmlnIFBDSQotCWJvb2wgIlBDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX1BDSQotCWhlbHAKLQkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCi0JICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCi0JICB5b3VyIGJveC4gSWYgeW91IGhhdmUgUENJLCBzYXkgWSwgb3RoZXJ3aXNlIE4uCi0KLWNvbmZpZyBTSF9QQ0lETUFfTk9OQ09IRVJFTlQKLQlib29sICJDYWNoZSBhbmQgUENJIG5vbmNvaGVyZW50IgotCWRlcGVuZHMgb24gUENJCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdXIgcGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBhIENQVSBjYWNoZSB3aGljaAotCSAgcmVtYWlucyBjb2hlcmVudCB3aXRoIFBDSSBETUEuIEl0IGlzIHNhZmVzdCB0byBzYXkgJ1knLCBhbHRob3VnaCB5b3UKLQkgIHdpbGwgc2VlIGJldHRlciBwZXJmb3JtYW5jZSBpZiB5b3UgY2FuIHNheSAnTicsIGJlY2F1c2UgdGhlIFBDSSBETUEKLQkgIGNvZGUgd2lsbCBub3QgaGF2ZSB0byBmbHVzaCB0aGUgQ1BVJ3MgY2FjaGVzLiBJZiB5b3UgaGF2ZSBhIFBDSSBob3N0Ci0JICBicmlkZ2UgaW50ZWdyYXRlZCB3aXRoIHlvdXIgU0ggQ1BVLCByZWZlciBjYXJlZnVsbHkgdG8gdGhlIGNoaXAgc3BlY3MKLQkgIHRvIHNlZSBpZiB5b3UgY2FuIHNheSAnTicgaGVyZS4gT3RoZXJ3aXNlLCBsZWF2ZSBpdCBhcyAnWScuCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2FkZHJzcGFjZS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hZGRyc3BhY2UuaAppbmRleCA4MGQ0MDgxLi45OWQ2YjNlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2FkZHJzcGFjZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYWRkcnNwYWNlLmgKQEAgLTI4LDkgKzI4LDYgQEAKIC8qIFJldHVybnMgdGhlIHByaXZpbGVnZWQgc2VnbWVudCBiYXNlIG9mIGEgZ2l2ZW4gYWRkcmVzcyAgKi8KICNkZWZpbmUgUFhTRUcoYSkJKCgodW5zaWduZWQgbG9uZykoYSkpICYgMHhlMDAwMDAwMCkKIAotLyogUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIFBuU0VHIChuPTEsMikgYWRkcmVzcyAgICovCi0jZGVmaW5lIFBIWVNBRERSKGEpCSgoKHVuc2lnbmVkIGxvbmcpKGEpKSAmIDB4MWZmZmZmZmYpCi0KICNpZiBkZWZpbmVkKENPTkZJR18yOUJJVCkgfHwgZGVmaW5lZChDT05GSUdfUE1CX0ZJWEVEKQogLyoKICAqIE1hcCBhbiBhZGRyZXNzIHRvIGEgY2VydGFpbiBwcml2aWxlZ2VkIHNlZ21lbnQKQEAgLTYwLDUgKzU3LDExIEBACiAjZGVmaW5lIFAzX0FERFJfTUFYCQlQNFNFRwogI2VuZGlmCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaWZkZWYgQ09ORklHX1BNQgorZXh0ZXJuIGludCBfX2luXzI5Yml0X21vZGUodm9pZCk7CisjZW5kaWYgLyogQ09ORklHX1BNQiAqLworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX0FERFJTUEFDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBlOGU3ODEzLi5iMTYzODhkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTc4LDExICs3OCwxMCBAQAogI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKICNkZWZpbmUgYXRvbWljX2luY19ub3RfemVybyh2KSBhdG9taWNfYWRkX3VubGVzcygodiksIDEsIDApCiAKLS8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nIG9uIFNIICovCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKQlzbXBfbWIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQlzbXBfbWIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkJc21wX21iKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkJc21wX21iKCkKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F0b21pYy1sb25nLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXRvbWljNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYml0b3BzLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2JpdG9wcy5oCmluZGV4IGViZTU5NWIuLjk4NTExZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9iaXRvcHMuaApAQCAtMjYsOCArMjYsOCBAQAogLyoKICAqIGNsZWFyX2JpdCgpIGRvZXNuJ3QgcHJvdmlkZSBhbnkgYmFycmllciBmb3IgdGhlIGNvbXBpbGVyLgogICovCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQlzbXBfbWIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCXNtcF9tYigpCiAKICNpZmRlZiBDT05GSUdfU1VQRVJIMzIKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmZnoodW5zaWduZWQgbG9uZyB3b3JkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9idWdzLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2J1Z3MuaAppbmRleCA0NjI2MGZjLi4wMmExOWExIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2J1Z3MuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2J1Z3MuaApAQCAtMTQsMTEgKzE0LDE1IEBACiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKK2V4dGVybiB2b2lkIHNlbGVjdF9pZGxlX3JvdXRpbmUodm9pZCk7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBjaGVja19idWdzKHZvaWQpCiB7CiAJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwogCWNoYXIgKnAgPSAmaW5pdF91dHNuYW1lKCktPm1hY2hpbmVbMl07IC8qICJzaCIgKi8KIAorCXNlbGVjdF9pZGxlX3JvdXRpbmUoKTsKKwogCWN1cnJlbnRfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OwogCiAJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLmZhbWlseSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IDY5ZDU2ZGQuLjg3Y2VkMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTEsMTkzICsxLDUyIEBACiAjaWZuZGVmIF9fQVNNX1NIX0RNQV9NQVBQSU5HX0gKICNkZWZpbmUgX19BU01fU0hfRE1BX01BUFBJTkdfSAogCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1kZWJ1Zy5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CitleHRlcm4gc3RydWN0IGRtYV9tYXBfb3BzICpkbWFfb3BzOworZXh0ZXJuIHZvaWQgbm9faW9tbXVfaW5pdCh2b2lkKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hX21hcF9vcHMgKmdldF9kbWFfb3BzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZG1hX29wczsKK30KKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1jb2hlcmVudC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWNvbW1vbi5oPgogCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIHBjaV9idXNfdHlwZTsKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7CiAKLSNkZWZpbmUgZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spCSgxKQorCWlmIChvcHMtPmRtYV9zdXBwb3J0ZWQpCisJCXJldHVybiBvcHMtPmRtYV9zdXBwb3J0ZWQoZGV2LCBtYXNrKTsKKworCXJldHVybiAxOworfQogCiBzdGF0aWMgaW5saW5lIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKIHsKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7CisKIAlpZiAoIWRldi0+ZG1hX21hc2sgfHwgIWRtYV9zdXBwb3J0ZWQoZGV2LCBtYXNrKSkKIAkJcmV0dXJuIC1FSU87CisJaWYgKG9wcy0+c2V0X2RtYV9tYXNrKQorCQlyZXR1cm4gb3BzLT5zZXRfZG1hX21hc2soZGV2LCBtYXNrKTsKIAogCSpkZXYtPmRtYV9tYXNrID0gbWFzazsKIAogCXJldHVybiAwOwogfQogCi12b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCSBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKTsKLQotdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkgICAgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7Ci0KIHZvaWQgZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCiAJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpOwogCiAjZGVmaW5lIGRtYV9hbGxvY19ub25jb2hlcmVudChkLCBzLCBoLCBmKSBkbWFfYWxsb2NfY29oZXJlbnQoZCwgcywgaCwgZikKICNkZWZpbmUgZG1hX2ZyZWVfbm9uY29oZXJlbnQoZCwgcywgdiwgaCkgZG1hX2ZyZWVfY29oZXJlbnQoZCwgcywgdiwgaCkKKworI2lmZGVmIENPTkZJR19ETUFfQ09IRVJFTlQKICNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCwgaCkgKDEpCi0KLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCi0JCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlkbWFfYWRkcl90IGFkZHIgPSB2aXJ0X3RvX3BoeXMocHRyKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgIWRlZmluZWQoQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCkKLQlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKLQkJcmV0dXJuIGFkZHI7CisjZWxzZQorI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkLCBoKSAoMCkKICNlbmRpZgotCWRtYV9jYWNoZV9zeW5jKGRldiwgcHRyLCBzaXplLCBkaXIpOwotCi0JZGVidWdfZG1hX21hcF9wYWdlKGRldiwgdmlydF90b19wYWdlKHB0ciksCi0JCQkgICAodW5zaWduZWQgbG9uZylwdHIgJiB+UEFHRV9NQVNLLCBzaXplLAotCQkJICAgZGlyLCBhZGRyLCB0cnVlKTsKLQotCXJldHVybiBhZGRyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKLQkJCQkgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlkZWJ1Z19kbWFfdW5tYXBfcGFnZShkZXYsIGFkZHIsIHNpemUsIGRpciwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJICAgICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrKSB7Ci0jaWYgIWRlZmluZWQoQ09ORklHX1BDSSkgfHwgZGVmaW5lZChDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UKQotCQlkbWFfY2FjaGVfc3luYyhkZXYsIHNnX3ZpcnQoJnNnW2ldKSwgc2dbaV0ubGVuZ3RoLCBkaXIpOwotI2VuZGlmCi0JCXNnW2ldLmRtYV9hZGRyZXNzID0gc2dfcGh5cygmc2dbaV0pOwotCQlzZ1tpXS5kbWFfbGVuZ3RoID0gc2dbaV0ubGVuZ3RoOwotCX0KLQotCWRlYnVnX2RtYV9tYXBfc2coZGV2LCBzZywgbmVudHMsIGksIGRpcik7Ci0KLQlyZXR1cm4gbmVudHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCWRlYnVnX2RtYV91bm1hcF9zZyhkZXYsIHNnLCBuZW50cywgZGlyKTsKLX0KLQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JcmV0dXJuIGRtYV9tYXBfc2luZ2xlKGRldiwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LCBzaXplLCBkaXIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLAotCQkJCSAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHJlc3MsIHNpemUsIGRpcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RtYV9zeW5jX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJCQkgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgIWRlZmluZWQoQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCkKLQlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKLQkJcmV0dXJuOwotI2VuZGlmCi0JZG1hX2NhY2hlX3N5bmMoZGV2LCBwaHlzX3RvX3ZpcnQoZG1hX2hhbmRsZSksIHNpemUsIGRpcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2Uoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAotCQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAotCQkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgIWRlZmluZWQoQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCkKLQlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKLQkJcmV0dXJuOwotI2VuZGlmCi0JZG1hX2NhY2hlX3N5bmMoZGV2LCBwaHlzX3RvX3ZpcnQoZG1hX2hhbmRsZSkgKyBvZmZzZXQsIHNpemUsIGRpcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RtYV9zeW5jX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSAgICAgICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmVsZW1zOyBpKyspIHsKLSNpZiAhZGVmaW5lZChDT05GSUdfUENJKSB8fCBkZWZpbmVkKENPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQpCi0JCWRtYV9jYWNoZV9zeW5jKGRldiwgc2dfdmlydCgmc2dbaV0pLCBzZ1tpXS5sZW5ndGgsIGRpcik7Ci0jZW5kaWYKLQkJc2dbaV0uZG1hX2FkZHJlc3MgPSBzZ19waHlzKCZzZ1tpXSk7Ci0JCXNnW2ldLmRtYV9sZW5ndGggPSBzZ1tpXS5sZW5ndGg7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAotCQkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JX19kbWFfc3luY19zaW5nbGUoZGV2LCBkbWFfaGFuZGxlLCBzaXplLCBkaXIpOwotCWRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAotCQkJCQkgICAgICBzaXplX3Qgc2l6ZSwKLQkJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCV9fZG1hX3N5bmNfc2luZ2xlKGRldiwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyKTsKLQlkZWJ1Z19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGRtYV9oYW5kbGUsIHNpemUsIGRpcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCQkgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAotCQkJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkJIHNpemVfdCBzaXplLAotCQkJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGRtYV9oYW5kbGUrb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24pOwotCWRlYnVnX2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KGRldiwgZG1hX2hhbmRsZSwKLQkJCQkJICAgIG9mZnNldCwgc2l6ZSwgZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCQkgICAgc2l6ZV90IHNpemUsCi0JCQkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgZG1hX2hhbmRsZStvZmZzZXQsIHNpemUsIGRpcmVjdGlvbik7Ci0JZGVidWdfZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UoZGV2LCBkbWFfaGFuZGxlLAotCQkJCQkgICAgICAgb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24pOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKLQkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCV9fZG1hX3N5bmNfc2coZGV2LCBzZywgbmVsZW1zLCBkaXIpOwotCWRlYnVnX2RtYV9zeW5jX3NnX2Zvcl9jcHUoZGV2LCBzZywgbmVsZW1zLCBkaXIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKLQkJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JX19kbWFfc3luY19zZyhkZXYsIHNnLCBuZWxlbXMsIGRpcik7Ci0JZGVidWdfZG1hX3N5bmNfc2dfZm9yX2RldmljZShkZXYsIHNnLCBuZWxlbXMsIGRpcik7Ci19CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCiB7CkBAIC0yMDAsMjAgKzU5LDUwIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlpZiAob3BzLT5tYXBwaW5nX2Vycm9yKQorCQlyZXR1cm4gb3BzLT5tYXBwaW5nX2Vycm9yKGRldiwgZG1hX2FkZHIpOworCiAJcmV0dXJuIGRtYV9hZGRyID09IDA7CiB9CiAKLSNkZWZpbmUgQVJDSF9IQVNfRE1BX0RFQ0xBUkVfQ09IRVJFTlRfTUVNT1JZCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGRtYV9tYXBfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCXZvaWQgKm1lbW9yeTsKIAotZXh0ZXJuIGludAotZG1hX2RlY2xhcmVfY29oZXJlbnRfbWVtb3J5KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBidXNfYWRkciwKLQkJCSAgICBkbWFfYWRkcl90IGRldmljZV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKKwlpZiAoZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCAmbWVtb3J5KSkKKwkJcmV0dXJuIG1lbW9yeTsKKwlpZiAoIW9wcy0+YWxsb2NfY29oZXJlbnQpCisJCXJldHVybiBOVUxMOwogCi1leHRlcm4gdm9pZAotZG1hX3JlbGVhc2VfZGVjbGFyZWRfbWVtb3J5KHN0cnVjdCBkZXZpY2UgKmRldik7CisJbWVtb3J5ID0gb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsIGdmcCk7CisJZGVidWdfZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgKmRtYV9oYW5kbGUsIG1lbW9yeSk7CiAKLWV4dGVybiB2b2lkICoKLWRtYV9tYXJrX2RlY2xhcmVkX21lbW9yeV9vY2N1cGllZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBkbWFfYWRkcl90IGRldmljZV9hZGRyLCBzaXplX3Qgc2l6ZSk7CisJcmV0dXJuIG1lbW9yeTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCXN0cnVjdCBkbWFfbWFwX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsJLyogZm9yIHBvcnRhYmlsaXR5ICovCisKKwlpZiAoZG1hX3JlbGVhc2VfZnJvbV9jb2hlcmVudChkZXYsIGdldF9vcmRlcihzaXplKSwgdmFkZHIpKQorCQlyZXR1cm47CisKKwlkZWJ1Z19kbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKKwlpZiAob3BzLT5mcmVlX2NvaGVyZW50KQorCQlvcHMtPmZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7Cit9CisKKy8qIGFyY2gvc2gvbW0vY29uc2lzdGVudC5jICovCitleHRlcm4gdm9pZCAqZG1hX2dlbmVyaWNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkJZG1hX2FkZHJfdCAqZG1hX2FkZHIsIGdmcF90IGZsYWcpOworZXh0ZXJuIHZvaWQgZG1hX2dlbmVyaWNfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwogCiAjZW5kaWYgLyogX19BU01fU0hfRE1BX01BUFBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9kd2FyZi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9kd2FyZi5oCmluZGV4IGNlZDY3OTUuLmJkY2NiYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vZHdhcmYuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2R3YXJmLmgKQEAgLTE5NCw2ICsxOTQsMTIgQEAKICNkZWZpbmUgRFdBUkZfQVJDSF9SQV9SRUcJMTcKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAvKgogICogUmVhZCBlaXRoZXIgdGhlIGZyYW1lIHBvaW50ZXIgKHIxNCkgb3IgdGhlIHN0YWNrIHBvaW50ZXIgKHIxNSkuCiAgKiBOT1RFOiB0aGlzIE1VU1QgYmUgaW5saW5lZC4KQEAgLTI0MSw2ICsyNDcsMTIgQEAKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAjZGVmaW5lIERXQVJGX0NJRV9aX0FVR01FTlRBVElPTgkoMSA8PCAwKQorCisJLyoKKwkgKiAnbW9kJyB3aWxsIGJlIG5vbi1OVUxMIGlmIHRoaXMgQ0lFIGNhbWUgZnJvbSBhIG1vZHVsZSdzCisJICogLmVoX2ZyYW1lIHNlY3Rpb24uCisJICovCisJc3RydWN0IG1vZHVsZSAqbW9kOwogfTsKIAogLyoqCkBAIC0yNTUsNiArMjY3LDEyIEBACiAJdW5zaWduZWQgY2hhciAqaW5zdHJ1Y3Rpb25zOwogCXVuc2lnbmVkIGNoYXIgKmVuZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisKKwkvKgorCSAqICdtb2QnIHdpbGwgYmUgbm9uLU5VTEwgaWYgdGhpcyBGREUgY2FtZSBmcm9tIGEgbW9kdWxlJ3MKKwkgKiAuZWhfZnJhbWUgc2VjdGlvbi4KKwkgKi8KKwlzdHJ1Y3QgbW9kdWxlICptb2Q7CiB9OwogCiAvKioKQEAgLTM2NCw2ICszODIsMTIgQEAKIAogZXh0ZXJuIHN0cnVjdCBkd2FyZl9mcmFtZSAqZHdhcmZfdW53aW5kX3N0YWNrKHVuc2lnbmVkIGxvbmcsCiAJCQkJCSAgICAgIHN0cnVjdCBkd2FyZl9mcmFtZSAqKTsKK2V4dGVybiB2b2lkIGR3YXJmX2ZyZWVfZnJhbWUoc3RydWN0IGR3YXJmX2ZyYW1lICopOworCitleHRlcm4gaW50IG1vZHVsZV9kd2FyZl9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqLCBjb25zdCBFbGZfU2hkciAqLAorCQkJCSBzdHJ1Y3QgbW9kdWxlICopOworZXh0ZXJuIHZvaWQgbW9kdWxlX2R3YXJmX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqKTsKKwogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAogI2RlZmluZSBDRklfU1RBUlRQUk9DCS5jZmlfc3RhcnRwcm9jCkBAIC0zOTEsNiArNDE1LDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZHdhcmZfdW53aW5kZXJfaW5pdCh2b2lkKQogewogfQorCisjZGVmaW5lIG1vZHVsZV9kd2FyZl9maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1lKQkoMCkKKyNkZWZpbmUgbW9kdWxlX2R3YXJmX2NsZWFudXAobW9kKQkJZG8geyB9IHdoaWxlICgwKQorCiAjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19EV0FSRl9VTldJTkRFUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9maXhtYXAuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZml4bWFwLmgKaW5kZXggNzIxZmNjNC4uNWFjMWU0MCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCkBAIC0xNCw5ICsxNCw5IEBACiAjZGVmaW5lIF9BU01fRklYTUFQX0gKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2lmZGVmIENPTkZJR19ISUdITUVNCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CiAjZW5kaWYKIApAQCAtNDYsOSArNDYsMTUgQEAKICAqIGZpeC1tYXBwZWQ/CiAgKi8KIGVudW0gZml4ZWRfYWRkcmVzc2VzIHsKLSNkZWZpbmUgRklYX05fQ09MT1VSUyAxNgorCS8qCisJICogVGhlIEZJWF9DTUFQIGVudHJpZXMgYXJlIHVzZWQgYnkga21hcF9jb2hlcmVudCgpIHRvIGdldCB2aXJ0dWFsCisJICogYWRkcmVzc2VzIHdoaWNoIGFyZSBvZiBhIGtub3duIGNvbG9yLCBhbmQgc28gdGhlaXIgdmFsdWVzIGFyZQorCSAqIGltcG9ydGFudC4gX19maXhfdG9fdmlydChGSVhfQ01BUF9FTkQgLSBuKSBtdXN0IGdpdmUgYW4gYWRkcmVzcworCSAqIHdoaWNoIGlzIHRoZSBzYW1lIGNvbG9yIGFzIGEgcGFnZSAobjw8UEFHRV9TSElGVCkuCisJICovCisjZGVmaW5lIEZJWF9OX0NPTE9VUlMgOAogCUZJWF9DTUFQX0JFR0lOLAotCUZJWF9DTUFQX0VORCA9IEZJWF9DTUFQX0JFR0lOICsgRklYX05fQ09MT1VSUywKKwlGSVhfQ01BUF9FTkQgPSBGSVhfQ01BUF9CRUdJTiArIChGSVhfTl9DT0xPVVJTICogTlJfQ1BVUykgLSAxLAogCUZJWF9VTkNBQ0hFRCwKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCUZJWF9LTUFQX0JFR0lOLAkvKiByZXNlcnZlZCBwdGUncyBmb3IgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9mcHUuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZnB1LmgKaW5kZXggMWQzYWVlMC4uZmI2YmJiOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9mcHUuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2ZwdS5oCkBAIC0xOCwxNiArMTgsMTUgQEAKIAogc3RydWN0IHRhc2tfc3RydWN0OwogCi1leHRlcm4gdm9pZCBzYXZlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBzYXZlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fdHNrKTsKK3ZvaWQgZnB1X3N0YXRlX3Jlc3RvcmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogI2Vsc2UKIAorI2RlZmluZSBzYXZlX2ZwdSh0c2spCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHJlbGVhc2VfZnB1KHJlZ3MpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZ3JhYl9mcHUocmVncykJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZnB1X3N0YXRlX3Jlc3RvcmUocmVncykJZG8geyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKLX0KICNlbmRpZgogCiBzdHJ1Y3QgdXNlcl9yZWdzZXQ7CkBAIC0zOSwxOSArMzgsMjggQEAKIAkJICAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAogCQkgICAgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1Zik7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VubGF6eV9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CisJCXNhdmVfZnB1KHRzayk7CisJCXJlbGVhc2VfZnB1KHJlZ3MpOworCX0gZWxzZQorCQl0c2stPmZwdV9jb3VudGVyID0gMDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHVubGF6eV9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKSkKLQkJc2F2ZV9mcHUodHNrLCByZWdzKTsKKwlfX3VubGF6eV9mcHUodHNrLCByZWdzKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfVVNFREZQVSkpIHsKLQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1VTRURGUFUpOworCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CiAJCXJlbGVhc2VfZnB1KHJlZ3MpOwogCX0KIAlwcmVlbXB0X2VuYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZnRyYWNlLmgKaW5kZXggMTJmM2EzMS4uMTNlOTk2NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9mdHJhY2UuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCkBAIC0zNSw0ICszNSwyMSBAQAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9UUkFDRVIgKi8KIAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogYXJjaC9zaC9rZXJuZWwvcmV0dXJuX2FkZHJlc3MuYyAqLworZXh0ZXJuIHZvaWQgKnJldHVybl9hZGRyZXNzKHVuc2lnbmVkIGludCk7CisKKyNkZWZpbmUgSEFWRV9BUkNIX0NBTExFUl9BRERSCisKKyNkZWZpbmUgQ0FMTEVSX0FERFIwICgodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCisjZGVmaW5lIENBTExFUl9BRERSMSAoKHVuc2lnbmVkIGxvbmcpcmV0dXJuX2FkZHJlc3MoMSkpCisjZGVmaW5lIENBTExFUl9BRERSMiAoKHVuc2lnbmVkIGxvbmcpcmV0dXJuX2FkZHJlc3MoMikpCisjZGVmaW5lIENBTExFUl9BRERSMyAoKHVuc2lnbmVkIGxvbmcpcmV0dXJuX2FkZHJlc3MoMykpCisjZGVmaW5lIENBTExFUl9BRERSNCAoKHVuc2lnbmVkIGxvbmcpcmV0dXJuX2FkZHJlc3MoNCkpCisjZGVmaW5lIENBTExFUl9BRERSNSAoKHVuc2lnbmVkIGxvbmcpcmV0dXJuX2FkZHJlc3MoNSkpCisjZGVmaW5lIENBTExFUl9BRERSNiAoKHVuc2lnbmVkIGxvbmcpcmV0dXJuX2FkZHJlc3MoNikpCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKwogI2VuZGlmIC8qIF9fQVNNX1NIX0ZUUkFDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2dwaW8uaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZ3Bpby5oCmluZGV4IDYxZjkzZGEuLmY4ZDlhNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vZ3Bpby5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZ3Bpby5oCkBAIC0yMCw3ICsyMCw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBBUkNIX05SX0dQSU9TIDUxMgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaF9wZmMuaD4KIAogI2lmZGVmIENPTkZJR19HUElPTElCCiAKQEAgLTUzLDg0ICs1Myw0IEBACiAKICNlbmRpZiAvKiBDT05GSUdfR1BJT0xJQiAqLwogCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHBpbm11eF9lbnVtX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHBpbm11eF9mbGFnX3Q7Ci0KLSNkZWZpbmUgUElOTVVYX1RZUEVfTk9ORSAgICAgICAgICAgIDAKLSNkZWZpbmUgUElOTVVYX1RZUEVfRlVOQ1RJT04gICAgICAgIDEKLSNkZWZpbmUgUElOTVVYX1RZUEVfR1BJTyAgICAgICAgICAgIDIKLSNkZWZpbmUgUElOTVVYX1RZUEVfT1VUUFVUICAgICAgICAgIDMKLSNkZWZpbmUgUElOTVVYX1RZUEVfSU5QVVQgICAgICAgICAgIDQKLSNkZWZpbmUgUElOTVVYX1RZUEVfSU5QVVRfUFVMTFVQICAgIDUKLSNkZWZpbmUgUElOTVVYX1RZUEVfSU5QVVRfUFVMTERPV04gIDYKLQotI2RlZmluZSBQSU5NVVhfRkxBR19UWVBFICAgICAgICAgICAgKDB4NykKLSNkZWZpbmUgUElOTVVYX0ZMQUdfV0FOVF9QVUxMVVAgICAgICgxIDw8IDMpCi0jZGVmaW5lIFBJTk1VWF9GTEFHX1dBTlRfUFVMTERPV04gICAoMSA8PCA0KQotCi0jZGVmaW5lIFBJTk1VWF9GTEFHX0RCSVRfU0hJRlQgICAgICA1Ci0jZGVmaW5lIFBJTk1VWF9GTEFHX0RCSVQgICAgICAgICAgICAoMHgxZiA8PCBQSU5NVVhfRkxBR19EQklUX1NISUZUKQotI2RlZmluZSBQSU5NVVhfRkxBR19EUkVHX1NISUZUICAgICAgMTAKLSNkZWZpbmUgUElOTVVYX0ZMQUdfRFJFRyAgICAgICAgICAgICgweDNmIDw8IFBJTk1VWF9GTEFHX0RSRUdfU0hJRlQpCi0KLXN0cnVjdCBwaW5tdXhfZ3BpbyB7Ci0JcGlubXV4X2VudW1fdCBlbnVtX2lkOwotCXBpbm11eF9mbGFnX3QgZmxhZ3M7Ci19OwotCi0jZGVmaW5lIFBJTk1VWF9HUElPKGdwaW8sIGRhdGFfb3JfbWFyaykgW2dwaW9dID0geyBkYXRhX29yX21hcmsgfQotI2RlZmluZSBQSU5NVVhfREFUQShkYXRhX29yX21hcmssIGlkcy4uLikgZGF0YV9vcl9tYXJrLCBpZHMsIDAKLQotc3RydWN0IHBpbm11eF9jZmdfcmVnIHsKLQl1bnNpZ25lZCBsb25nIHJlZywgcmVnX3dpZHRoLCBmaWVsZF93aWR0aDsKLQl1bnNpZ25lZCBsb25nICpjbnQ7Ci0JcGlubXV4X2VudW1fdCAqZW51bV9pZHM7Ci19OwotCi0jZGVmaW5lIFBJTk1VWF9DRkdfUkVHKG5hbWUsIHIsIHJfd2lkdGgsIGZfd2lkdGgpIFwKLQkucmVnID0gciwgLnJlZ193aWR0aCA9IHJfd2lkdGgsIC5maWVsZF93aWR0aCA9IGZfd2lkdGgsCQlcCi0JLmNudCA9ICh1bnNpZ25lZCBsb25nIFtyX3dpZHRoIC8gZl93aWR0aF0pIHt9LCBcCi0JLmVudW1faWRzID0gKHBpbm11eF9lbnVtX3QgWyhyX3dpZHRoIC8gZl93aWR0aCkgKiAoMSA8PCBmX3dpZHRoKV0pIFwKLQotc3RydWN0IHBpbm11eF9kYXRhX3JlZyB7Ci0JdW5zaWduZWQgbG9uZyByZWcsIHJlZ193aWR0aCwgcmVnX3NoYWRvdzsKLQlwaW5tdXhfZW51bV90ICplbnVtX2lkczsKLX07Ci0KLSNkZWZpbmUgUElOTVVYX0RBVEFfUkVHKG5hbWUsIHIsIHJfd2lkdGgpIFwKLQkucmVnID0gciwgLnJlZ193aWR0aCA9IHJfd2lkdGgsCVwKLQkuZW51bV9pZHMgPSAocGlubXV4X2VudW1fdCBbcl93aWR0aF0pIFwKLQotc3RydWN0IHBpbm11eF9yYW5nZSB7Ci0JcGlubXV4X2VudW1fdCBiZWdpbjsKLQlwaW5tdXhfZW51bV90IGVuZDsKLQlwaW5tdXhfZW51bV90IGZvcmNlOwotfTsKLQotc3RydWN0IHBpbm11eF9pbmZvIHsKLQljaGFyICpuYW1lOwotCXBpbm11eF9lbnVtX3QgcmVzZXJ2ZWRfaWQ7Ci0Jc3RydWN0IHBpbm11eF9yYW5nZSBkYXRhOwotCXN0cnVjdCBwaW5tdXhfcmFuZ2UgaW5wdXQ7Ci0Jc3RydWN0IHBpbm11eF9yYW5nZSBpbnB1dF9wZDsKLQlzdHJ1Y3QgcGlubXV4X3JhbmdlIGlucHV0X3B1OwotCXN0cnVjdCBwaW5tdXhfcmFuZ2Ugb3V0cHV0OwotCXN0cnVjdCBwaW5tdXhfcmFuZ2UgbWFyazsKLQlzdHJ1Y3QgcGlubXV4X3JhbmdlIGZ1bmN0aW9uOwotCi0JdW5zaWduZWQgZmlyc3RfZ3BpbywgbGFzdF9ncGlvOwotCi0Jc3RydWN0IHBpbm11eF9ncGlvICpncGlvczsKLQlzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgKmNmZ19yZWdzOwotCXN0cnVjdCBwaW5tdXhfZGF0YV9yZWcgKmRhdGFfcmVnczsKLQotCXBpbm11eF9lbnVtX3QgKmdwaW9fZGF0YTsKLQl1bnNpZ25lZCBpbnQgZ3Bpb19kYXRhX3NpemU7Ci0KLQl1bnNpZ25lZCBsb25nICpncGlvX2luX3VzZTsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7Ci19OwotCi1pbnQgcmVnaXN0ZXJfcGlubXV4KHN0cnVjdCBwaW5tdXhfaW5mbyAqcGlwKTsKLQogI2VuZGlmIC8qIF9fQVNNX1NIX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9oYXJkaXJxLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCBhNWJlNGFmLi40OGIxOTEzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2hhcmRpcnEuaApAQCAtMSw5ICsxLDE2IEBACiAjaWZuZGVmIF9fQVNNX1NIX0hBUkRJUlFfSAogI2RlZmluZSBfX0FTTV9TSF9IQVJESVJRX0gKIAotZXh0ZXJuIHZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0jZGVmaW5lIGFja19iYWRfaXJxIGFja19iYWRfaXJxCisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGFyZGlycS5oPgordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBfX3NvZnRpcnFfcGVuZGluZzsKKwl1bnNpZ25lZCBpbnQgX19ubWlfY291bnQ7CQkvKiBhcmNoIGRlcGVuZGVudCAqLworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQgaXJxX2NwdXN0YXRfdDsKKworI2luY2x1ZGUgPGxpbnV4L2lycV9jcHVzdGF0Lmg+CS8qIFN0YW5kYXJkIG1hcHBpbmdzIGZvciBpcnFfY3B1c3RhdF90IGFib3ZlICovCisKK2V4dGVybiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiAjZW5kaWYgLyogX19BU01fU0hfSEFSRElSUV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggNWJlNDVlYS4uNTEyY2QzZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vaW8uaApAQCAtOTAsMTUgKzkwLDExIEBACiAjZGVmaW5lIGN0cmxfb3V0bAkJX19yYXdfd3JpdGVsCiAjZGVmaW5lIGN0cmxfb3V0cQkJX19yYXdfd3JpdGVxCiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdlbmVyaWNfaW9fYmFzZTsKKwogc3RhdGljIGlubGluZSB2b2lkIGN0cmxfZGVsYXkodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfQ1BVX1NINAotCV9fcmF3X3JlYWR3KENDTl9QVlIpOwotI2VsaWYgZGVmaW5lZChQMlNFRykKLQlfX3Jhd19yZWFkdyhQMlNFRyk7Ci0jZWxzZQotI2Vycm9yICJOZWVkIGEgZHVtbXkgYWRkcmVzcyBmb3IgZGVsYXkiCi0jZW5kaWYKKwlfX3Jhd19yZWFkdyhnZW5lcmljX2lvX2Jhc2UpOwogfQogCiAjZGVmaW5lIF9fQlVJTERfTUVNT1JZX1NUUklORyhid2xxLCB0eXBlKQkJCQlcCkBAIC0xODYsOCArMTgyLDYgQEAKIAogI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmZmZmZmCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGdlbmVyaWNfaW9fYmFzZTsKLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBtZXRob2QgZm9yIHRoZSBnZW5lcmljIGNhc2Ugd2hlcmUgYQogICogYm9hcmQtc3BlY2lmaWMgaW9wb3J0X21hcCBzaW1wbHkgbmVlZHMgdG8gcmV0dXJuIHRoZSBwb3J0ICsgc29tZQpAQCAtMjQ2LDcgKzI0MCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqCiBfX2lvcmVtYXBfbW9kZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSSDMyKSAmJiAhZGVmaW5lZChDT05GSUdfUE1CX0ZJWEVEKQorI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSSDMyKSAmJiAhZGVmaW5lZChDT05GSUdfUE1CX0ZJWEVEKSAmJiAhZGVmaW5lZChDT05GSUdfUE1CKQogCXVuc2lnbmVkIGxvbmcgbGFzdF9hZGRyID0gb2Zmc2V0ICsgc2l6ZSAtIDE7CiAjZW5kaWYKIAl2b2lkIF9faW9tZW0gKnJldDsKQEAgLTI1NSw3ICsyNDksNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TVVBFUkgzMikgJiYgIWRlZmluZWQoQ09ORklHX1BNQl9GSVhFRCkKKyNpZiBkZWZpbmVkKENPTkZJR19TVVBFUkgzMikgJiYgIWRlZmluZWQoQ09ORklHX1BNQl9GSVhFRCkgJiYgIWRlZmluZWQoQ09ORklHX1BNQikKIAkvKgogCSAqIEZvciBQMSBhbmQgUDIgc3BhY2UgdGhpcyBpcyB0cml2aWFsLCBhcyBldmVyeXRoaW5nIGlzIGFscmVhZHkKIAkgKiBtYXBwZWQuIFVuY2FjaGVkIGFjY2VzcyBmb3IgUDEgYWRkcmVzc2VzIGFyZSBkb25lIHRocm91Z2ggUDIuCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2lycWZsYWdzLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKaW5kZXggNDZlNzFkYS4uYTc0MTE1MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaApAQCAtMSwzNCArMSw5IEBACiAjaWZuZGVmIF9fQVNNX1NIX0lSUUZMQUdTX0gKICNkZWZpbmUgX19BU01fU0hfSVJRRkxBR1NfSAogCi0jaWZkZWYgQ09ORklHX1NVUEVSSDMyCi0jaW5jbHVkZSAiaXJxZmxhZ3NfMzIuaCIKLSNlbHNlCi0jaW5jbHVkZSAiaXJxZmxhZ3NfNjQuaCIKLSNlbmRpZgorI2RlZmluZSBSQVdfSVJRX0RJU0FCTEVECTB4ZjAKKyNkZWZpbmUgUkFXX0lSUV9FTkFCTEVECQkweDAwCiAKLSNkZWZpbmUgcmF3X2xvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpIFwKLQkJZG8geyAoZmxhZ3MpID0gX19yYXdfbG9jYWxfc2F2ZV9mbGFncygpOyB9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIGludCByYXdfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiAoZmxhZ3MgIT0gMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJhd19pcnFzX2Rpc2FibGVkKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3MoKTsKLQotCXJldHVybiByYXdfaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncyk7Ci19Ci0KLSNkZWZpbmUgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKSBcCi0JCWRvIHsgKGZsYWdzKSA9IF9fcmF3X2xvY2FsX2lycV9zYXZlKCk7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlpZiAoKGZsYWdzICYgMHhmMCkgIT0gMHhmMCkKLQkJcmF3X2xvY2FsX2lycV9lbmFibGUoKTsKLX0KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFmbGFncy5oPgogCiAjZW5kaWYgLyogX19BU01fU0hfSVJRRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9pcnFmbGFnc18zMi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9pcnFmbGFnc18zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDIxOGY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vaXJxZmxhZ3NfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfSVJRRkxBR1NfMzJfSAotI2RlZmluZSBfX0FTTV9TSF9JUlFGTEFHU18zMl9ICi0KLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkic3RjCXNyLCAlMFxuXHQiCi0JCSJhbmQJJTEsICUwXG5cdCIKLSNpZmRlZiBDT05GSUdfQ1BVX0hBU19TUl9SQgotCQkic3RjCXI2X2JhbmssICUxXG5cdCIKLQkJIm9yCSUxLCAlMFxuXHQiCi0jZW5kaWYKLQkJImxkYwklMCwgc3Jcblx0IgotCQk6ICI9JnIiIChfX2R1bW15MCksICI9ciIgKF9fZHVtbXkxKQotCQk6ICIxIiAofjB4MDAwMDAwZjApCi0JCTogIm1lbW9yeSIKLQkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJInN0YwlzciwgJTBcblx0IgotCQkib3IJIzB4ZjAsICUwXG5cdCIKLQkJImxkYwklMCwgc3Jcblx0IgotCQk6ICI9JnoiIChmbGFncykKLQkJOiAvKiBubyBpbnB1dHMgKi8KLQkJOiAibWVtb3J5IgotCSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxfYml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBfX2R1bW15MCwgX19kdW1teTE7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJzdGMJc3IsICUwXG5cdCIKLQkJIm9yCSUyLCAlMFxuXHQiCi0JCSJhbmQJJTMsICUwXG5cdCIKLQkJImxkYwklMCwgc3Jcblx0IgotCQk6ICI9JnIiIChfX2R1bW15MCksICI9ciIgKF9fZHVtbXkxKQotCQk6ICJyIiAoMHgxMDAwMDAwMCksICJyIiAoMHhmZmZmZmYwZikKLQkJOiAibWVtb3J5IgotCSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ibF9iaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIF9fZHVtbXkwLCBfX2R1bW15MTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJInN0YwlzciwgJTBcblx0IgotCQkiYW5kCSUyLCAlMFxuXHQiCi0JCSJsZGMJJTAsIHNyXG5cdCIKLQkJOiAiPSZyIiAoX19kdW1teTApLCAiPXIiIChfX2R1bW15MSkKLQkJOiAiMSIgKH4weDEwMDAwMDAwKQotCQk6ICJtZW1vcnkiCi0JKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkic3RjCXNyLCAlMFxuXHQiCi0JCSJhbmQJIzB4ZjAsICUwXG5cdCIKLQkJOiAiPSZ6IiAoZmxhZ3MpCi0JCTogLyogbm8gaW5wdXRzICovCi0JCTogIm1lbW9yeSIKLQkpOwotCi0JcmV0dXJuIGZsYWdzOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yYXdfbG9jYWxfaXJxX3NhdmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBfX2R1bW15OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkic3RjCXNyLCAlMVxuXHQiCi0JCSJtb3YJJTEsICUwXG5cdCIKLQkJIm9yCSMweGYwLCAlMFxuXHQiCi0JCSJsZGMJJTAsIHNyXG5cdCIKLQkJIm1vdgklMSwgJTBcblx0IgotCQkiYW5kCSMweGYwLCAlMFxuXHQiCi0JCTogIj0meiIgKGZsYWdzKSwgIj0mciIgKF9fZHVtbXkpCi0JCTogLyogbm8gaW5wdXRzICovCi0JCTogIm1lbW9yeSIKLQkpOwotCi0JcmV0dXJuIGZsYWdzOwotfQotCi0jZW5kaWYgLyogX19BU01fU0hfSVJRRkxBR1NfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9pcnFmbGFnc182NC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9pcnFmbGFnc182NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY2NTIyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vaXJxZmxhZ3NfNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfSVJRRkxBR1NfNjRfSAotI2RlZmluZSBfX0FTTV9TSF9JUlFGTEFHU182NF9ICi0KLSNpbmNsdWRlIDxjcHUvcmVnaXN0ZXJzLmg+Ci0KLSNkZWZpbmUgU1JfTUFTS19MTAkweDAwMDAwMDAwMDAwMDAwZjBMTAotI2RlZmluZSBTUl9CTF9MTAkweDAwMDAwMDAwMTAwMDAwMDBMTAotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9lbmFibGUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxID0gflNSX01BU0tfTEw7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZ2V0Y29uCSIgX19TUiAiLCAlMFxuXHQiCi0JCQkgICAgICJhbmQJJTAsICUxLCAlMFxuXHQiCi0JCQkgICAgICJwdXRjb24JJTAsICIgX19TUiAiXG5cdCIKLQkJCSAgICAgOiAiPSZyIiAoX19kdW1teTApCi0JCQkgICAgIDogInIiIChfX2R1bW15MSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIF9fZHVtbXkwLCBfX2R1bW15MSA9IFNSX01BU0tfTEw7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZ2V0Y29uCSIgX19TUiAiLCAlMFxuXHQiCi0JCQkgICAgICJvcgklMCwgJTEsICUwXG5cdCIKLQkJCSAgICAgInB1dGNvbgklMCwgIiBfX1NSICJcblx0IgotCQkJICAgICA6ICI9JnIiIChfX2R1bW15MCkKLQkJCSAgICAgOiAiciIgKF9fZHVtbXkxKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxfYml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIF9fZHVtbXkwLCBfX2R1bW15MSA9IFNSX0JMX0xMOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImdldGNvbgkiIF9fU1IgIiwgJTBcblx0IgotCQkJICAgICAib3IJJTAsICUxLCAlMFxuXHQiCi0JCQkgICAgICJwdXRjb24JJTAsICIgX19TUiAiXG5cdCIKLQkJCSAgICAgOiAiPSZyIiAoX19kdW1teTApCi0JCQkgICAgIDogInIiIChfX2R1bW15MSkpOwotCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ibF9iaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxID0gflNSX0JMX0xMOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImdldGNvbgkiIF9fU1IgIiwgJTBcblx0IgotCQkJICAgICAiYW5kCSUwLCAlMSwgJTBcblx0IgotCQkJICAgICAicHV0Y29uCSUwLCAiIF9fU1IgIlxuXHQiCi0JCQkgICAgIDogIj0mciIgKF9fZHVtbXkwKQotCQkJICAgICA6ICJyIiAoX19kdW1teTEpKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teSA9IFNSX01BU0tfTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJImdldGNvbgkiIF9fU1IgIiwgJTBcblx0IgotCQkiYW5kCSUwLCAlMSwgJTAiCi0JCTogIj0mciIgKGZsYWdzKQotCQk6ICJyIiAoX19kdW1teSkpOwotCi0JcmV0dXJuIGZsYWdzOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yYXdfbG9jYWxfaXJxX3NhdmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxID0gU1JfTUFTS19MTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiZ2V0Y29uCSIgX19TUiAiLCAlMVxuXHQiCi0JCSJvcgklMSwgcjYzLCAlMFxuXHQiCi0JCSJvcgklMSwgJTIsICUxXG5cdCIKLQkJInB1dGNvbgklMSwgIiBfX1NSICJcblx0IgotCQkiYW5kCSUwLCAlMiwgJTAiCi0JCTogIj0mciIgKGZsYWdzKSwgIj0mciIgKF9fZHVtbXkwKQotCQk6ICJyIiAoX19kdW1teTEpKTsKLQotCXJldHVybiBmbGFnczsKLX0KLQotI2VuZGlmIC8qIF9fQVNNX1NIX0lSUUZMQUdTXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vbW11LmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL21tdS5oCmluZGV4IGY1OTYzMDMuLmM3NDI2YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9tbXUuaApAQCAtNywxMiArNywxNiBAQAogI2RlZmluZSBQTUJfUEFTQ1IJCTB4ZmYwMDAwNzAKICNkZWZpbmUgUE1CX0lSTUNSCQkweGZmMDAwMDc4CiAKKyNkZWZpbmUgUEFTQ1JfU0UJCTB4ODAwMDAwMDAKKwogI2RlZmluZSBQTUJfQUREUgkJMHhmNjEwMDAwMAogI2RlZmluZSBQTUJfREFUQQkJMHhmNzEwMDAwMAogI2RlZmluZSBQTUJfRU5UUllfTUFYCQkxNgogI2RlZmluZSBQTUJfRV9NQVNLCQkweDAwMDAwMDBmCiAjZGVmaW5lIFBNQl9FX1NISUZUCQk4CiAKKyNkZWZpbmUgUE1CX1BGTl9NQVNLCQkweGZmMDAwMDAwCisKICNkZWZpbmUgUE1CX1NaXzE2TQkJMHgwMDAwMDAwMAogI2RlZmluZSBQTUJfU1pfNjRNCQkweDAwMDAwMDEwCiAjZGVmaW5lIFBNQl9TWl8xMjhNCQkweDAwMDAwMDgwCkBAIC02MiwxNyArNjYsMTAgQEAKIH07CiAKIC8qIGFyY2gvc2gvbW0vcG1iLmMgKi8KLWludCBfX3NldF9wbWJfZW50cnkodW5zaWduZWQgbG9uZyB2cG4sIHVuc2lnbmVkIGxvbmcgcHBuLAotCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50ICplbnRyeSk7Ci1pbnQgc2V0X3BtYl9lbnRyeShzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKTsKLXZvaWQgY2xlYXJfcG1iX2VudHJ5KHN0cnVjdCBwbWJfZW50cnkgKnBtYmUpOwotc3RydWN0IHBtYl9lbnRyeSAqcG1iX2FsbG9jKHVuc2lnbmVkIGxvbmcgdnBuLCB1bnNpZ25lZCBsb25nIHBwbiwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLXZvaWQgcG1iX2ZyZWUoc3RydWN0IHBtYl9lbnRyeSAqcG1iZSk7CiBsb25nIHBtYl9yZW1hcCh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgcGh5cywKIAkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHZvaWQgcG1iX3VubWFwKHVuc2lnbmVkIGxvbmcgYWRkcik7CitpbnQgcG1iX2luaXQodm9pZCk7CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX01NVV9IICovCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGNpLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3BjaS5oCmluZGV4IDQxNjM5NTAuLjY3ZjM5OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaApAQCAtMyw4ICszLDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KIC8qIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBsb2dpYyBpbiBwY2lfc2Nhbl9idXMgZm9yIHNraXBwaW5nCiAgICBhbHJlYWR5LWNvbmZpZ3VyZWQgYnVzIG51bWJlcnMgLSB0byBiZSB1c2VkIGZvciBidWdneSBCSU9TZXMKICAgIG9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbmNvbXBsZXRlIFBDSSBzZXR1cCBieSB0aGUgbG9hZGVyICovCkBAIC01NCwzMCArNTIsMTggQEAKICAqIGFkZHJlc3Mgc3BhY2UuICBUaGUgbmV0d29ya2luZyBhbmQgYmxvY2sgZGV2aWNlIGxheWVycyB1c2UKICAqIHRoaXMgYm9vbGVhbiBmb3IgYm91bmNlIGJ1ZmZlciBkZWNpc2lvbnMuCiAgKi8KLSNkZWZpbmUgUENJX0RNQV9CVVNfSVNfUEhZUwkoMSkKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2RlZmluZSBQQ0lfRE1BX0JVU19JU19QSFlTCShkbWFfb3BzLT5pc19waHlzKQogCiAvKiBwY2lfdW5tYXBfe3NpbmdsZSxwYWdlfSBiZWluZyBhIG5vcCBkZXBlbmRzIHVwb24gdGhlCiAgKiBjb25maWd1cmF0aW9uLgogICovCi0jaWZkZWYgQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVAotI2RlZmluZSBERUNMQVJFX1BDSV9VTk1BUF9BRERSKEFERFJfTkFNRSkJXAotCWRtYV9hZGRyX3QgQUREUl9OQU1FOwotI2RlZmluZSBERUNMQVJFX1BDSV9VTk1BUF9MRU4oTEVOX05BTUUpCQlcCi0JX191MzIgTEVOX05BTUU7Ci0jZGVmaW5lIHBjaV91bm1hcF9hZGRyKFBUUiwgQUREUl9OQU1FKQkJCVwKLQkoKFBUUiktPkFERFJfTkFNRSkKLSNkZWZpbmUgcGNpX3VubWFwX2FkZHJfc2V0KFBUUiwgQUREUl9OQU1FLCBWQUwpCQlcCi0JKCgoUFRSKS0+QUREUl9OQU1FKSA9IChWQUwpKQotI2RlZmluZSBwY2lfdW5tYXBfbGVuKFBUUiwgTEVOX05BTUUpCQkJXAotCSgoUFRSKS0+TEVOX05BTUUpCi0jZGVmaW5lIHBjaV91bm1hcF9sZW5fc2V0KFBUUiwgTEVOX05BTUUsIFZBTCkJCVwKLQkoKChQVFIpLT5MRU5fTkFNRSkgPSAoVkFMKSkKKyNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCisjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0FERFIoQUREUl9OQU1FKQlkbWFfYWRkcl90IEFERFJfTkFNRTsKKyNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKExFTl9OQU1FKQkJX191MzIgTEVOX05BTUU7CisjZGVmaW5lIHBjaV91bm1hcF9hZGRyKFBUUiwgQUREUl9OQU1FKQkJKChQVFIpLT5BRERSX05BTUUpCisjZGVmaW5lIHBjaV91bm1hcF9hZGRyX3NldChQVFIsIEFERFJfTkFNRSwgVkFMKQkoKChQVFIpLT5BRERSX05BTUUpID0gKFZBTCkpCisjZGVmaW5lIHBjaV91bm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCSgoUFRSKS0+TEVOX05BTUUpCisjZGVmaW5lIHBjaV91bm1hcF9sZW5fc2V0KFBUUiwgTEVOX05BTUUsIFZBTCkJKCgoUFRSKS0+TEVOX05BTUUpID0gKFZBTCkpCiAjZWxzZQogI2RlZmluZSBERUNMQVJFX1BDSV9VTk1BUF9BRERSKEFERFJfTkFNRSkKICNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKExFTl9OQU1FKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAppbmRleCAxMWEzMDIyLi4zZDBjOWYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtMSw4ICsxLDM1IEBACiAjaWZuZGVmIF9fQVNNX1NIX1BFUkZfRVZFTlRfSAogI2RlZmluZSBfX0FTTV9TSF9QRVJGX0VWRU5UX0gKIAotLyogU0ggb25seSBzdXBwb3J0cyBzb2Z0d2FyZSBldmVudHMgdGhyb3VnaCB0aGlzIGludGVyZmFjZS4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGVyZl9ldmVudF9wZW5kaW5nKHZvaWQpIHt9CitzdHJ1Y3QgaHdfcGVyZl9ldmVudDsKKworI2RlZmluZSBNQVhfSFdFVkVOVFMJMgorCitzdHJ1Y3Qgc2hfcG11IHsKKwljb25zdCBjaGFyCSpuYW1lOworCXVuc2lnbmVkIGludAludW1fZXZlbnRzOworCXZvaWQJCSgqZGlzYWJsZV9hbGwpKHZvaWQpOworCXZvaWQJCSgqZW5hYmxlX2FsbCkodm9pZCk7CisJdm9pZAkJKCplbmFibGUpKHN0cnVjdCBod19wZXJmX2V2ZW50ICosIGludCk7CisJdm9pZAkJKCpkaXNhYmxlKShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqLCBpbnQpOworCXU2NAkJKCpyZWFkKShpbnQpOworCWludAkJKCpldmVudF9tYXApKGludCk7CisJdW5zaWduZWQgaW50CW1heF9ldmVudHM7CisJdW5zaWduZWQgbG9uZwlyYXdfZXZlbnRfbWFzazsKKwljb25zdCBpbnQJKCpjYWNoZV9ldmVudHMpW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCSAgICAgICBbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJICAgICAgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOworfTsKKworLyogYXJjaC9zaC9rZXJuZWwvcGVyZl9ldmVudC5jICovCitleHRlcm4gaW50IHJlZ2lzdGVyX3NoX3BtdShzdHJ1Y3Qgc2hfcG11ICopOworZXh0ZXJuIGludCByZXNlcnZlX3BtY19oYXJkd2FyZSh2b2lkKTsKK2V4dGVybiB2b2lkIHJlbGVhc2VfcG1jX2hhcmR3YXJlKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BlcmZfZXZlbnRfcGVuZGluZyh2b2lkKQoreworCS8qIE5vdGhpbmcgdG8gc2VlIGhlcmUsIG1vdmUgYWxvbmcuICovCit9CiAKICNkZWZpbmUgUEVSRl9FVkVOVF9JTkRFWF9PRkZTRVQJMAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IDRmM2VmYTcuLmJhMzA0NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC03NSwxMyArNzUsMzEgQEAKICNkZWZpbmUgVVNFUl9QVFJTX1BFUl9QR0QJKFRBU0tfU0laRS9QR0RJUl9TSVpFKQogI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MJMAogCi0jaWZkZWYgQ09ORklHXzMyQklUCi0jZGVmaW5lIFBIWVNfQUREUl9NQVNLCQkweGZmZmZmZmZmCisjZGVmaW5lIFBIWVNfQUREUl9NQVNLMjkJCTB4MWZmZmZmZmYKKyNkZWZpbmUgUEhZU19BRERSX01BU0szMgkJMHhmZmZmZmZmZgorCisjaWZkZWYgQ09ORklHX1BNQgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl9tYXNrKHZvaWQpCit7CisJLyogSXMgdGhlIE1NVSBpbiAyOWJpdCBtb2RlPyAqLworCWlmIChfX2luXzI5Yml0X21vZGUoKSkKKwkJcmV0dXJuIFBIWVNfQUREUl9NQVNLMjk7CisKKwlyZXR1cm4gUEhZU19BRERSX01BU0szMjsKK30KKyNlbGlmIGRlZmluZWQoQ09ORklHXzMyQklUKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl9tYXNrKHZvaWQpCit7CisJcmV0dXJuIFBIWVNfQUREUl9NQVNLMzI7Cit9CiAjZWxzZQotI2RlZmluZSBQSFlTX0FERFJfTUFTSwkJMHgxZmZmZmZmZgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl9tYXNrKHZvaWQpCit7CisJcmV0dXJuIFBIWVNfQUREUl9NQVNLMjk7Cit9CiAjZW5kaWYKIAotI2RlZmluZSBQVEVfUEhZU19NQVNLCQkoUEhZU19BRERSX01BU0sgJiBQQUdFX01BU0spCisjZGVmaW5lIFBURV9QSFlTX01BU0sJCShwaHlzX2FkZHJfbWFzaygpICYgUEFHRV9NQVNLKQogI2RlZmluZSBQVEVfRkxBR1NfTUFTSwkJKH4oUFRFX1BIWVNfTUFTSykgPDwgUEFHRV9TSElGVCkKIAogI2lmZGVmIENPTkZJR19TVVBFUkgzMgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlXzMyLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3BndGFibGVfMzIuaAppbmRleCBjMGQzNTljLi5iMzU0MzU1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3BndGFibGVfMzIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3BndGFibGVfMzIuaApAQCAtMTA4LDcgKzEwOCw3IEBACiAjZGVmaW5lIF9QQUdFX0NMRUFSX0ZMQUdTCShfUEFHRV9QUk9UTk9ORSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRklMRSkKICNlbmRpZgogCi0jZGVmaW5lIF9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0sJKFBIWVNfQUREUl9NQVNLICYgfihfUEFHRV9DTEVBUl9GTEFHUykpCisjZGVmaW5lIF9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0sJKHBoeXNfYWRkcl9tYXNrKCkgJiB+KF9QQUdFX0NMRUFSX0ZMQUdTKSkKIAogLyogSGFyZHdhcmUgZmxhZ3MsIHBhZ2Ugc2l6ZSBlbmNvZGluZyAqLwogI2lmICFkZWZpbmVkKENPTkZJR19NTVUpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl8zMi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfMzIuaAppbmRleCA5YTg3MTQ5Li4xZjNkNmZhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl8zMi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzMyLmgKQEAgLTU2LDYgKzU2LDcgQEAKICNkZWZpbmUgU1JfRFNQCQkweDAwMDAxMDAwCiAjZGVmaW5lIFNSX0lNQVNLCTB4MDAwMDAwZjAKICNkZWZpbmUgU1JfRkQJCTB4MDAwMDgwMDAKKyNkZWZpbmUgU1JfTUQJCTB4NDAwMDAwMDAKIAogLyoKICAqIERTUCBzdHJ1Y3R1cmUgYW5kIGRhdGEKQEAgLTEzNiw3ICsxMzcsNyBAQAogZXh0ZXJuIHZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICopOwogCiAvKiBQcmVwYXJlIHRvIGNvcHkgdGhyZWFkIHN0YXRlIC0gdW5sYXp5IGFsbCBsYXp5IHN0YXR1cyAqLwotI2RlZmluZSBwcmVwYXJlX3RvX2NvcHkodHNrKQlkbyB7IH0gd2hpbGUgKDApCit2b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKIC8qCiAgKiBjcmVhdGUgYSBrZXJuZWwgdGhyZWFkIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0YXNrbGlzdHMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaAppbmRleCAzMjdjYzJlLi5lMzhkMWQ0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0FTTV9TSF9TQ0FUVEVSTElTVF9ICiAjZGVmaW5lIF9fQVNNX1NIX1NDQVRURVJMSVNUX0gKIAotI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRAlQSFlTX0FERFJfTUFTSworI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRAlwaHlzX2FkZHJfbWFzaygpCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zY2F0dGVybGlzdC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N1c3BlbmQuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3VzcGVuZC5oCmluZGV4IDVjOGVhMjguLmZlOWMyYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vc3VzcGVuZC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3VzcGVuZC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfQVNNX1NIX1NVU1BFTkRfSAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3ByZXBhcmVfc3VzcGVuZCh2b2lkKSB7IHJldHVybiAwOyB9CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0xOSw2ICsyMCw2OSBAQAogc3RhdGljIGlubGluZSB2b2lkIHNoX21vYmlsZV9zZXR1cF9jcHVpZGxlKHZvaWQpIHt9CiAjZW5kaWYKIAorLyogbm90aWZpZXIgY2hhaW5zIGZvciBwcmUvcG9zdCBzbGVlcCBob29rcyAqLworZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBzaF9tb2JpbGVfcHJlX3NsZWVwX25vdGlmaWVyX2xpc3Q7CitleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIHNoX21vYmlsZV9wb3N0X3NsZWVwX25vdGlmaWVyX2xpc3Q7CisKKy8qIHByaW9yaXR5IGxldmVscyBmb3Igbm90aWZpZXJzICovCisjZGVmaW5lIFNIX01PQklMRV9TTEVFUF9CT0FSRAkwCisjZGVmaW5lIFNIX01PQklMRV9TTEVFUF9DUFUJMQorI2RlZmluZSBTSF9NT0JJTEVfUFJFKHgpCSh4KQorI2RlZmluZSBTSF9NT0JJTEVfUE9TVCh4KQkoLSh4KSkKKworLyogYm9hcmQgY29kZSByZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHNlbGYtcmVmcmVzaCBhc3NlbWJseSBzbmlwcGV0cyAqLwordm9pZCBzaF9tb2JpbGVfcmVnaXN0ZXJfc2VsZl9yZWZyZXNoKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJICAgICB2b2lkICpwcmVfc3RhcnQsIHZvaWQgKnByZV9lbmQsCisJCQkJICAgICB2b2lkICpwb3N0X3N0YXJ0LCB2b2lkICpwb3N0X2VuZCk7CisKKy8qIHJlZ2lzdGVyIHN0cnVjdHVyZSBmb3IgYWRkcmVzcy9kYXRhIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc2hfc2xlZXBfcmVncyB7CisJdW5zaWduZWQgbG9uZyBzdGJjcjsKKwl1bnNpZ25lZCBsb25nIGJhcjsKKworCS8qIE1NVSAqLworCXVuc2lnbmVkIGxvbmcgcHRlaDsKKwl1bnNpZ25lZCBsb25nIHB0ZWw7CisJdW5zaWduZWQgbG9uZyB0dGI7CisJdW5zaWduZWQgbG9uZyB0ZWE7CisJdW5zaWduZWQgbG9uZyBtbXVjcjsKKwl1bnNpZ25lZCBsb25nIHB0ZWE7CisJdW5zaWduZWQgbG9uZyBwYXNjcjsKKwl1bnNpZ25lZCBsb25nIGlybWNyOworCisJLyogQ2FjaGUgKi8KKwl1bnNpZ25lZCBsb25nIGNjcjsKKwl1bnNpZ25lZCBsb25nIHJhbWNyOworfTsKKworLyogZGF0YSBhcmVhIGZvciBsb3ctbGV2ZWwgc2xlZXAgY29kZSAqLworc3RydWN0IHNoX3NsZWVwX2RhdGEgeworCS8qIGN1cnJlbnQgc2xlZXAgbW9kZSAoU1VTUF9TSF8uLi4pICovCisJdW5zaWduZWQgbG9uZyBtb2RlOworCisJLyogYWRkcmVzc2VzIG9mIGJvYXJkIHNwZWNpZmljIHNlbGYtcmVmcmVzaCBzbmlwcGV0cyAqLworCXVuc2lnbmVkIGxvbmcgc2ZfcHJlOworCXVuc2lnbmVkIGxvbmcgc2ZfcG9zdDsKKworCS8qIGFkZHJlc3Mgb2YgcmVzdW1lIGNvZGUgKi8KKwl1bnNpZ25lZCBsb25nIHJlc3VtZTsKKworCS8qIHJlZ2lzdGVyIHN0YXRlIHNhdmVkIGFuZCByZXN0b3JlZCBieSB0aGUgYXNzZW1ibHkgY29kZSAqLworCXVuc2lnbmVkIGxvbmcgdmJyOworCXVuc2lnbmVkIGxvbmcgc3BjOworCXVuc2lnbmVkIGxvbmcgc3I7CisJdW5zaWduZWQgbG9uZyBzcDsKKworCS8qIHN0cnVjdHVyZSBmb3Iga2VlcGluZyByZWdpc3RlciBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3Qgc2hfc2xlZXBfcmVncyBhZGRyOworCisJLyogc3RydWN0dXJlIGZvciBzYXZpbmcvcmVzdG9yaW5nIHJlZ2lzdGVyIHN0YXRlICovCisJc3RydWN0IHNoX3NsZWVwX3JlZ3MgZGF0YTsKK307CisKKy8qIGEgYml0bWFwIG9mIHN1cHBvcnRlZCBzbGVlcCBtb2RlcyAoU1VTUF9TSC4uKSAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2hfbW9iaWxlX3NsZWVwX3N1cHBvcnRlZDsKKwogI2VuZGlmCiAKIC8qIGZsYWdzIHBhc3NlZCB0byBhc3NlbWJseSBzdXNwZW5kIGNvZGUgKi8KQEAgLTI3LDUgKzkxLDYgQEAKICNkZWZpbmUgU1VTUF9TSF9SU1RBTkRCWQkoMSA8PCAyKSAvKiBTSC1Nb2JpbGUgUi1zdGFuZGJ5IG1vZGUgKi8KICNkZWZpbmUgU1VTUF9TSF9VU1RBTkRCWQkoMSA8PCAzKSAvKiBTSC1Nb2JpbGUgVS1zdGFuZGJ5IG1vZGUgKi8KICNkZWZpbmUgU1VTUF9TSF9TRgkJKDEgPDwgNCkgLyogRW5hYmxlIHNlbGYtcmVmcmVzaCAqLworI2RlZmluZSBTVVNQX1NIX01NVQkJKDEgPDwgNSkgLyogU2F2ZS9yZXN0b3JlIE1NVSBhbmQgY2FjaGUgKi8KIAogI2VuZGlmIC8qIF9BU01fU0hfU1VTUEVORF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBiNWM1YWNkLi5jMTU0MTViIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTE3MSwxMCArMTcxLDYgQEAKIEJVSUxEX1RSQVBfSEFORExFUihmcHVfc3RhdGVfcmVzdG9yZSk7CiBCVUlMRF9UUkFQX0hBTkRMRVIobm1pKTsKIAotI2lmZGVmIENPTkZJR19CVUcKLWV4dGVybiB2b2lkIGhhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKik7Ci0jZW5kaWYKLQogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCiBzdHJ1Y3QgbWVtX2FjY2VzcyB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaAppbmRleCA2MDdkNDEzLi4wNjgxNGY1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmgKQEAgLTIzMiw0ICsyMzIsMzMgQEAKIAkJCQkgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAogCQkJCSAgIHN0cnVjdCBwdF9yZWdzIF9fcmVncyk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxfYml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15MCwgX19kdW1teTE7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJzdGMJc3IsICUwXG5cdCIKKwkJIm9yCSUyLCAlMFxuXHQiCisJCSJhbmQJJTMsICUwXG5cdCIKKwkJImxkYwklMCwgc3Jcblx0IgorCQk6ICI9JnIiIChfX2R1bW15MCksICI9ciIgKF9fZHVtbXkxKQorCQk6ICJyIiAoMHgxMDAwMDAwMCksICJyIiAoMHhmZmZmZmYwZikKKwkJOiAibWVtb3J5IgorCSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ibF9iaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIF9fZHVtbXkwLCBfX2R1bW15MTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInN0YwlzciwgJTBcblx0IgorCQkiYW5kCSUyLCAlMFxuXHQiCisJCSJsZGMJJTAsIHNyXG5cdCIKKwkJOiAiPSZyIiAoX19kdW1teTApLCAiPXIiIChfX2R1bW15MSkKKwkJOiAiMSIgKH4weDEwMDAwMDAwKQorCQk6ICJtZW1vcnkiCisJKTsKK30KKwogI2VuZGlmIC8qIF9fQVNNX1NIX1NZU1RFTV8zMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zeXN0ZW1fNjQuaAppbmRleCA4ZTRhMDNlLi5hYjFkZDkxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmgKQEAgLTEyLDYgKzEyLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KKyNpbmNsdWRlIDxjcHUvcmVnaXN0ZXJzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAvKgpAQCAtNDcsNCArNDgsMjkgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZykoc2lnbmVkIGxvbmcgbG9uZykoc2lnbmVkIGxvbmcpdmFsOwogfQogCisjZGVmaW5lIFNSX0JMX0xMCTB4MDAwMDAwMDAxMDAwMDAwMExMCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxfYml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIF9fZHVtbXkwLCBfX2R1bW15MSA9IFNSX0JMX0xMOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImdldGNvbgkiIF9fU1IgIiwgJTBcblx0IgorCQkJICAgICAib3IJJTAsICUxLCAlMFxuXHQiCisJCQkgICAgICJwdXRjb24JJTAsICIgX19TUiAiXG5cdCIKKwkJCSAgICAgOiAiPSZyIiAoX19kdW1teTApCisJCQkgICAgIDogInIiIChfX2R1bW15MSkpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ibF9iaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxID0gflNSX0JMX0xMOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImdldGNvbgkiIF9fU1IgIiwgJTBcblx0IgorCQkJICAgICAiYW5kCSUwLCAlMSwgJTBcblx0IgorCQkJICAgICAicHV0Y29uCSUwLCAiIF9fU1IgIlxuXHQiCisJCQkgICAgIDogIj0mciIgKF9fZHVtbXkwKQorCQkJICAgICA6ICJyIiAoX19kdW1teTEpKTsKK30KKwogI2VuZGlmIC8qIF9fQVNNX1NIX1NZU1RFTV82NF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYmRlYjlkNC4uMWYzZDkyNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMTksNiArMTksNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KIAlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KKwlfX3UzMgkJCXN0YXR1czsJCS8qIHRocmVhZCBzeW5jaHJvbm91cyBmbGFncyAqLwogCV9fdTMyCQkJY3B1OwogCWludAkJCXByZWVtcHRfY291bnQ7IC8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwogCW1tX3NlZ21lbnRfdAkJYWRkcl9saW1pdDsJLyogdGhyZWFkIGFkZHJlc3Mgc3BhY2UgKi8KQEAgLTUwLDYgKzUxLDcgQEAKIAkudGFzawkJPSAmdHNrLAkJCVwKIAkuZXhlY19kb21haW4JPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwJXAogCS5mbGFncwkJPSAwLAkJCVwKKwkuc3RhdHVzCQk9IDAsCQkJXAogCS5jcHUJCT0gMCwJCQlcCiAJLnByZWVtcHRfY291bnQJPSBJTklUX1BSRUVNUFRfQ09VTlQsCVwKIAkuYWRkcl9saW1pdAk9IEtFUk5FTF9EUywJCVwKQEAgLTExMSwxMyArMTEzLDExIEBACiAjZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFCTAJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KICNkZWZpbmUgVElGX1NJR1BFTkRJTkcJCTEJLyogc2lnbmFsIHBlbmRpbmcgKi8KICNkZWZpbmUgVElGX05FRURfUkVTQ0hFRAkyCS8qIHJlc2NoZWR1bGluZyBuZWNlc3NhcnkgKi8KLSNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwkzCS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KICNkZWZpbmUgVElGX1NJTkdMRVNURVAJCTQJLyogc2luZ2xlc3RlcHBpbmcgYWN0aXZlICovCiAjZGVmaW5lIFRJRl9TWVNDQUxMX0FVRElUCTUJLyogc3lzY2FsbCBhdWRpdGluZyBhY3RpdmUgKi8KICNkZWZpbmUgVElGX1NFQ0NPTVAJCTYJLyogc2VjdXJlIGNvbXB1dGluZyAqLwogI2RlZmluZSBUSUZfTk9USUZZX1JFU1VNRQk3CS8qIGNhbGxiYWNrIGJlZm9yZSByZXR1cm5pbmcgdG8gdXNlciAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRVBPSU5UCTgJLyogZm9yIGZ0cmFjZSBzeXNjYWxsIGluc3RydW1lbnRhdGlvbiAqLwotI2RlZmluZSBUSUZfVVNFREZQVQkJMTYJLyogRlBVIHdhcyB1c2VkIGJ5IHRoaXMgdGFzayB0aGlzIHF1YW50dW0gKFNNUCkgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE3CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZyBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE4CiAjZGVmaW5lIFRJRl9GUkVFWkUJCTE5CS8qIEZyZWV6aW5nIGZvciBzdXNwZW5kICovCkBAIC0xMjUsMTMgKzEyNSwxMSBAQAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDEgPDwgVElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxIDw8IFRJRl9ORUVEX1JFU0NIRUQpCi0jZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxIDw8IFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfU0lOR0xFU1RFUAkJKDEgPDwgVElGX1NJTkdMRVNURVApCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMSA8PCBUSUZfU1lTQ0FMTF9BVURJVCkKICNkZWZpbmUgX1RJRl9TRUNDT01QCQkoMSA8PCBUSUZfU0VDQ09NUCkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxIDw8IFRJRl9OT1RJRllfUkVTVU1FKQogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVAkoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRVBPSU5UKQotI2RlZmluZSBfVElGX1VTRURGUFUJCSgxIDw8IFRJRl9VU0VERlBVKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxIDw8IFRJRl9QT0xMSU5HX05SRkxBRykKICNkZWZpbmUgX1RJRl9GUkVFWkUJCSgxIDw8IFRJRl9GUkVFWkUpCiAKQEAgLTE0OSwxMyArMTQ3LDMzIEBACiAvKiB3b3JrIHRvIGRvIG9uIGFueSByZXR1cm4gdG8gdS1zcGFjZSAqLwogI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSwkoX1RJRl9TWVNDQUxMX1RSQUNFIHwgX1RJRl9TSUdQRU5ESU5HICAgICAgfCBcCiAJCQkJIF9USUZfTkVFRF9SRVNDSEVEICB8IF9USUZfU1lTQ0FMTF9BVURJVCAgIHwgXAotCQkJCSBfVElGX1NJTkdMRVNURVAgICAgfCBfVElGX1JFU1RPUkVfU0lHTUFTSyB8IFwKLQkJCQkgX1RJRl9OT1RJRllfUkVTVU1FIHwgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQpCisJCQkJIF9USUZfU0lOR0xFU1RFUCAgICB8IF9USUZfTk9USUZZX1JFU1VNRSAgIHwgXAorCQkJCSBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVCkKIAogLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLwogI2RlZmluZSBfVElGX1dPUktfTUFTSwkJKF9USUZfQUxMV09SS19NQVNLICYgfihfVElGX1NZU0NBTExfVFJBQ0UgfCBcCiAJCQkJIF9USUZfU1lTQ0FMTF9BVURJVCB8IF9USUZfU0lOR0xFU1RFUCkpCiAKKy8qCisgKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgorICoKKyAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZsYWdzIGluIHRoYXQgbm9ib2R5IGVsc2UKKyAqIGV2ZXIgdG91Y2hlcyBvdXIgdGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cywgc28gd2UgZG9uJ3QKKyAqIGhhdmUgdG8gd29ycnkgYWJvdXQgYXRvbWljIGFjY2Vzc2VzLgorICovCisjZGVmaW5lIFRTX1JFU1RPUkVfU0lHTUFTSwkweDAwMDEJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwoKSAqLworI2RlZmluZSBUU19VU0VERlBVCQkweDAwMDIJLyogRlBVIHVzZWQgYnkgdGhpcyB0YXNrIHRoaXMgcXVhbnR1bSAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBIQVZFX1NFVF9SRVNUT1JFX1NJR01BU0sJMQorc3RhdGljIGlubGluZSB2b2lkIHNldF9yZXN0b3JlX3NpZ21hc2sodm9pZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCXRpLT5zdGF0dXMgfD0gVFNfUkVTVE9SRV9TSUdNQVNLOworCXNldF9iaXQoVElGX1NJR1BFTkRJTkcsICh1bnNpZ25lZCBsb25nICopJnRpLT5mbGFncyk7Cit9CisjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19BU01fU0hfVEhSRUFEX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IDY1ZTdiZDIuLjM3Y2RhZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTQwLDYgKzQwLDE0IEBACiAKICNlbmRpZgogCisjZGVmaW5lIG1jX2NhcGFibGUoKSAgICAoMSkKKworY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9jb3JlZ3JvdXBfbWFzayh1bnNpZ25lZCBpbnQgY3B1KTsKKworZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU107CisKKyNkZWZpbmUgdG9wb2xvZ3lfY29yZV9jcHVtYXNrKGNwdSkJKCZjcHVfY29yZV9tYXBbY3B1XSkKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CiAKICNlbmRpZiAvKiBfQVNNX1NIX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWJjLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3ViYy5oCmluZGV4IDRjYTRiNzcuLjliZjk2MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWJjLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91YmMuaApAQCAtNjAsMTYgKzYwLDUgQEAKICNkZWZpbmUgQlJDUl9VQkRFCQkoMSA8PCAwKQogI2VuZGlmCiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKiBhcmNoL3NoL2tlcm5lbC9jcHUvdWJjLlMgKi8KLWV4dGVybiB2b2lkIHViY19zbGVlcCh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19VQkNfV0FLRVVQCi1leHRlcm4gdm9pZCB1YmNfd2FrZXVwKHZvaWQpOwotI2Vsc2UKLSNkZWZpbmUgdWJjX3dha2V1cCgpCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU0hfVUJDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vd2F0Y2hkb2cuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vd2F0Y2hkb2cuaAppbmRleCAyZmU3Y2VlLi4xOWRmZmY1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3dhdGNoZG9nLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS93YXRjaGRvZy5oCkBAIC0yLDYgKzIsOCBAQAogICogaW5jbHVkZS9hc20tc2gvd2F0Y2hkb2cuaAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2llbWVucyBBRworICogQ29weXJpZ2h0IChDKSAyMDA5IFZhbGVudGluIFNpdGRpa292CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtNjEsNiArNjMsNjEgQEAKICNkZWZpbmUgV1RDU1JfQ0tTXzIwNDgJMHgwNgogI2RlZmluZSBXVENTUl9DS1NfNDA5NgkweDA3CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKKy8qKgorICogCXNoX3dkdF9yZWFkX2NudCAtIFJlYWQgZnJvbSBDb3VudGVyCisgKiAJUmVhZHMgYmFjayB0aGUgV1RDTlQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgc2hfd2R0X3JlYWRfY250KHZvaWQpCit7CisJcmV0dXJuIGN0cmxfaW5sKFdUQ05UX1IpOworfQorCisvKioKKyAqCXNoX3dkdF93cml0ZV9jbnQgLSBXcml0ZSB0byBDb3VudGVyCisgKglAdmFsOiBWYWx1ZSB0byB3cml0ZQorICoKKyAqCVdyaXRlcyB0aGUgZ2l2ZW4gdmFsdWUgQHZhbCB0byB0aGUgbG93ZXIgYnl0ZSBvZiB0aGUgdGltZXIgY291bnRlci4KKyAqCVRoZSB1cHBlciBieXRlIGlzIHNldCBtYW51YWxseSBvbiBlYWNoIHdyaXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2hfd2R0X3dyaXRlX2NudChfX3UzMiB2YWwpCit7CisJY3RybF9vdXRsKChXVENOVF9ISUdIIDw8IDI0KSB8IChfX3UzMil2YWwsIFdUQ05UKTsKK30KKworLyoqCisgKglzaF93ZHRfd3JpdGVfYnN0IC0gV3JpdGUgdG8gQ291bnRlcgorICoJQHZhbDogVmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZXMgdGhlIGdpdmVuIHZhbHVlIEB2YWwgdG8gdGhlIGxvd2VyIGJ5dGUgb2YgdGhlIHRpbWVyIGNvdW50ZXIuCisgKglUaGUgdXBwZXIgYnl0ZSBpcyBzZXQgbWFudWFsbHkgb24gZWFjaCB3cml0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNoX3dkdF93cml0ZV9ic3QoX191MzIgdmFsKQoreworCWN0cmxfb3V0bCgoV1RCU1RfSElHSCA8PCAyNCkgfCAoX191MzIpdmFsLCBXVEJTVCk7Cit9CisvKioKKyAqIAlzaF93ZHRfcmVhZF9jc3IgLSBSZWFkIGZyb20gQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIKKyAqCisgKglSZWFkcyBiYWNrIHRoZSBXVENTUiB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBfX3UzMiBzaF93ZHRfcmVhZF9jc3Iodm9pZCkKK3sKKwlyZXR1cm4gY3RybF9pbmwoV1RDU1JfUik7Cit9CisKKy8qKgorICogCXNoX3dkdF93cml0ZV9jc3IgLSBXcml0ZSB0byBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgorICogCUB2YWw6IFZhbHVlIHRvIHdyaXRlCisgKgorICogCVdyaXRlcyB0aGUgZ2l2ZW4gdmFsdWUgQHZhbCB0byB0aGUgbG93ZXIgYnl0ZSBvZiB0aGUgY29udHJvbC9zdGF0dXMKKyAqIAlyZWdpc3Rlci4gVGhlIHVwcGVyIGJ5dGUgaXMgc2V0IG1hbnVhbGx5IG9uIGVhY2ggd3JpdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzaF93ZHRfd3JpdGVfY3NyKF9fdTMyIHZhbCkKK3sKKwljdHJsX291dGwoKFdUQ1NSX0hJR0ggPDwgMjQpIHwgKF9fdTMyKXZhbCwgV1RDU1IpOworfQorI2Vsc2UKIC8qKgogICogCXNoX3dkdF9yZWFkX2NudCAtIFJlYWQgZnJvbSBDb3VudGVyCiAgKiAJUmVhZHMgYmFjayB0aGUgV1RDTlQgdmFsdWUuCkBAIC0xMDMsNiArMTYwLDYgQEAKIHsKIAljdHJsX291dHcoKFdUQ1NSX0hJR0ggPDwgOCkgfCAoX191MTYpdmFsLCBXVENTUik7CiB9Ci0KKyNlbmRpZiAvKiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IHx8IENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU0hfV0FUQ0hET0dfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3dhdGNoZG9nLmggYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvd2F0Y2hkb2cuaAppbmRleCAyNTlmNmEwLi43NjcyMzAxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvd2F0Y2hkb2cuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvd2F0Y2hkb2cuaApAQCAtMiw2ICsyLDggQEAKICAqIGluY2x1ZGUvYXNtLXNoL2NwdS1zaDQvd2F0Y2hkb2cuaAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2llbWVucyBBRworICogQ29weXJpZ2h0IChDKSAyMDA5IFNpdGRpa292IFZhbGVudGluCiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDkgKzEyLDIwIEBACiAjaWZuZGVmIF9fQVNNX0NQVV9TSDRfV0FUQ0hET0dfSAogI2RlZmluZSBfX0FTTV9DUFVfU0g0X1dBVENIRE9HX0gKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKQorLyogUHJlZml4IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgV1RCU1RfSElHSAkweDU1CisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBXVENOVF9SCQkweGZmY2MwMDEwIC8qV0RUQ05UKi8KKyNkZWZpbmUgV1RDU1IJCTB4ZmZjYzAwMDQgLypXRFRDU1IqLworI2RlZmluZSBXVENOVAkJMHhmZmNjMDAwMCAvKldEVFNUKi8KKyNkZWZpbmUgV1RTVAkJV1RDTlQKKyNkZWZpbmUgV1RCU1QJCTB4ZmZjYzAwMDggLypXRFRCU1QqLworI2Vsc2UKIC8qIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFdUQ05UCQkweGZmYzAwMDA4CiAjZGVmaW5lIFdUQ1NSCQkweGZmYzAwMDBjCisjZW5kaWYKIAogLyogQml0IGRlZmluaXRpb25zICovCiAjZGVmaW5lIFdUQ1NSX1RNRQkweDgwCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvbWFjaC1jb21tb24vbWFjaC90aXRhbi5oIGIvYXJjaC9zaC9pbmNsdWRlL21hY2gtY29tbW9uL21hY2gvdGl0YW4uaAppbmRleCAwM2YzNTgzLi40YTY3NGQyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvbWFjaC1jb21tb24vbWFjaC90aXRhbi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWNvbW1vbi9tYWNoL3RpdGFuLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogUGxhdGZvcm0gZGVmaW50aW9ucyBmb3IgVGl0YW4KKyAqIFBsYXRmb3JtIGRlZmluaXRpb25zIGZvciBUaXRhbgogICovCiAjaWZuZGVmIF9BU01fU0hfVElUQU5fSAogI2RlZmluZSBfQVNNX1NIX1RJVEFOX0gKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWVjb3ZlYzI0L21hY2gvcGFydG5lci1qZXQtc2V0dXAudHh0IGIvYXJjaC9zaC9pbmNsdWRlL21hY2gtZWNvdmVjMjQvbWFjaC9wYXJ0bmVyLWpldC1zZXR1cC50eHQKaW5kZXggOGI4ZTRmYS4uY2M3MzdiOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL21hY2gtZWNvdmVjMjQvbWFjaC9wYXJ0bmVyLWpldC1zZXR1cC50eHQKKysrIGIvYXJjaC9zaC9pbmNsdWRlL21hY2gtZWNvdmVjMjQvbWFjaC9wYXJ0bmVyLWpldC1zZXR1cC50eHQKQEAgLTIyLDEzICsyMiwxMiBAQAogTElTVCAic2V0dXAgY2xvY2tzIgogRUQgMHhhNDE1MDAyNCwgMHgwMDAwNDAwMAogRUQgMHhhNDE1MDAwMCwgMHg4RTAwMzUwOAotRUQgMHhhNDE1MDAwNCwgMHgwMDAwMDAwMAogCiBXQUlUIDEKIAogTElTVCAiQlNDIgogRUQgMHhmZjgwMDAyMCwgMHhhNWE1MDAwMAotRUQgMHhmZWMxMDAwMCwgMHgwMDAwMDAxMworRUQgMHhmZWMxMDAwMCwgMHgwMDAwMTAxMwogRUQgMHhmZWMxMDAwNCwgMHgxMTExMDQwMAogRUQgMHhmZWMxMDAyNCwgMHgwMDAwMDQ0MAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvbWFjaC1zZS9tYWNoL3NlNzcyMi5oIGIvYXJjaC9zaC9pbmNsdWRlL21hY2gtc2UvbWFjaC9zZTc3MjIuaAppbmRleCBlOTcxZDlhLi4xNjUwNWJmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvbWFjaC1zZS9tYWNoL3NlNzcyMi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9tYWNoLXNlL21hY2gvc2U3NzIyLmgKQEAgLTkyLDE4ICs5MiwxMSBAQAogI2RlZmluZSBTRTc3MjJfRlBHQV9JUlFfTVJTSFBDMQkzIC8qIElSUTEgKi8KICNkZWZpbmUgU0U3NzIyX0ZQR0FfSVJRX01SU0hQQzIJNCAvKiBJUlExICovCiAjZGVmaW5lIFNFNzcyMl9GUEdBX0lSUV9NUlNIUEMzCTUgLyogSVJRMSAqLwotCiAjZGVmaW5lIFNFNzcyMl9GUEdBX0lSUV9OUgk2Ci0jZGVmaW5lIFNFNzcyMl9GUEdBX0lSUV9CQVNFCTExMAotCi0jZGVmaW5lIE1SU0hQQ19JUlEzICAgIAkoU0U3NzIyX0ZQR0FfSVJRX0JBU0UgKyBTRTc3MjJfRlBHQV9JUlFfTVJTSFBDMykKLSNkZWZpbmUgTVJTSFBDX0lSUTIgICAgCShTRTc3MjJfRlBHQV9JUlFfQkFTRSArIFNFNzcyMl9GUEdBX0lSUV9NUlNIUEMyKQotI2RlZmluZSBNUlNIUENfSVJRMSAgICAJKFNFNzcyMl9GUEdBX0lSUV9CQVNFICsgU0U3NzIyX0ZQR0FfSVJRX01SU0hQQzEpCi0jZGVmaW5lIE1SU0hQQ19JUlEwICAgIAkoU0U3NzIyX0ZQR0FfSVJRX0JBU0UgKyBTRTc3MjJfRlBHQV9JUlFfTVJTSFBDMCkKLSNkZWZpbmUgU01DX0lSUQkJKFNFNzcyMl9GUEdBX0lSUV9CQVNFICsgU0U3NzIyX0ZQR0FfSVJRX1NNQykKLSNkZWZpbmUgVVNCX0lSUQkJKFNFNzcyMl9GUEdBX0lSUV9CQVNFICsgU0U3NzIyX0ZQR0FfSVJRX1VTQikKIAogLyogYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9pcnEuYyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzZTc3MjJfZnBnYV9pcnFbXTsKKwogdm9pZCBpbml0X3NlNzcyMl9JUlEodm9pZCk7CiAKICNkZWZpbmUgX19JT19QUkVGSVgJCXNlNzcyMgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQppbmRleCBhMmQwYTQwLi4wNDcxYTNlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQpAQCAtOSw4ICs5LDEyIEBACiBDRkxBR1NfUkVNT1ZFX2Z0cmFjZS5vID0gLXBnCiBlbmRpZgogCi1vYmoteQk6PSBkZWJ1Z3RyYXBzLm8gZHVtcHN0YWNrLm8gaWRsZS5vIGlvLm8gaW9fZ2VuZXJpYy5vIGlycS5vCVwKLQkgICBtYWNodmVjLm8gbm1pX2RlYnVnLm8gcHJvY2Vzc18kKEJJVFMpLm8gcHRyYWNlXyQoQklUUykubwlcCitDRkxBR1NfUkVNT1ZFX3JldHVybl9hZGRyZXNzLm8gPSAtcGcKKworb2JqLXkJOj0gZGVidWd0cmFwcy5vIGRtYS1ub21tdS5vIGR1bXBzdGFjay5vIAkJCVwKKwkgICBpZGxlLm8gaW8ubyBpb19nZW5lcmljLm8gaXJxLm8JCQkJXAorCSAgIGlycV8kKEJJVFMpLm8gbWFjaHZlYy5vIG5taV9kZWJ1Zy5vIHByb2Nlc3NfJChCSVRTKS5vIAlcCisJICAgcHRyYWNlXyQoQklUUykubyByZXR1cm5fYWRkcmVzcy5vCQkJCVwKIAkgICBzZXR1cC5vIHNpZ25hbF8kKEJJVFMpLm8gc3lzX3NoLm8gc3lzX3NoJChCSVRTKS5vCQlcCiAJICAgc3lzY2FsbHNfJChCSVRTKS5vIHRpbWUubyB0b3BvbG9neS5vIHRyYXBzLm8JCQlcCiAJICAgdHJhcHNfJChCSVRTKS5vIHVud2luZGVyLm8KQEAgLTI4LDEzICszMiwxMyBAQAogb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpCSs9IHN0YWNrdHJhY2Uubwogb2JqLSQoQ09ORklHX0lPX1RSQVBQRUQpCSs9IGlvX3RyYXBwZWQubwogb2JqLSQoQ09ORklHX0tQUk9CRVMpCQkrPSBrcHJvYmVzLm8KLW9iai0kKENPTkZJR19HRU5FUklDX0dQSU8pCSs9IGdwaW8ubwogb2JqLSQoQ09ORklHX0RZTkFNSUNfRlRSQUNFKQkrPSBmdHJhY2Uubwogb2JqLSQoQ09ORklHX0ZUUkFDRV9TWVNDQUxMUykJKz0gZnRyYWNlLm8KIG9iai0kKENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIpICs9IGZ0cmFjZS5vCiBvYmotJChDT05GSUdfRFVNUF9DT0RFKQkJKz0gZGlzYXNzZW1ibGUubwogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBzd3N1c3Aubwogb2JqLSQoQ09ORklHX0RXQVJGX1VOV0lOREVSKQkrPSBkd2FyZi5vCitvYmotJChDT05GSUdfUEVSRl9FVkVOVFMpCSs9IHBlcmZfZXZlbnQubyBwZXJmX2NhbGxjaGFpbi5vCiAKIG9iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCkJKz0gbG9jYWx0aW1lci5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3NoL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGQyMThlODAuLjA4YTJiZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMzQsNSArMzQsMjggQEAKIAlERUZJTkUoUEJFX05FWFQsIG9mZnNldG9mKHN0cnVjdCBwYmUsIG5leHQpKTsKIAlERUZJTkUoU1dTVVNQX0FSQ0hfUkVHU19TSVpFLCBzaXplb2Yoc3RydWN0IHN3c3VzcF9hcmNoX3JlZ3MpKTsKICNlbmRpZgorCisJREVGSU5FKFNIX1NMRUVQX01PREUsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9kYXRhLCBtb2RlKSk7CisJREVGSU5FKFNIX1NMRUVQX1NGX1BSRSwgb2Zmc2V0b2Yoc3RydWN0IHNoX3NsZWVwX2RhdGEsIHNmX3ByZSkpOworCURFRklORShTSF9TTEVFUF9TRl9QT1NULCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfZGF0YSwgc2ZfcG9zdCkpOworCURFRklORShTSF9TTEVFUF9SRVNVTUUsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9kYXRhLCByZXN1bWUpKTsKKwlERUZJTkUoU0hfU0xFRVBfVkJSLCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfZGF0YSwgdmJyKSk7CisJREVGSU5FKFNIX1NMRUVQX1NQQywgb2Zmc2V0b2Yoc3RydWN0IHNoX3NsZWVwX2RhdGEsIHNwYykpOworCURFRklORShTSF9TTEVFUF9TUiwgb2Zmc2V0b2Yoc3RydWN0IHNoX3NsZWVwX2RhdGEsIHNyKSk7CisJREVGSU5FKFNIX1NMRUVQX1NQLCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfZGF0YSwgc3ApKTsKKwlERUZJTkUoU0hfU0xFRVBfQkFTRV9BRERSLCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfZGF0YSwgYWRkcikpOworCURFRklORShTSF9TTEVFUF9CQVNFX0RBVEEsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9kYXRhLCBkYXRhKSk7CisJREVGSU5FKFNIX1NMRUVQX1JFR19TVEJDUiwgb2Zmc2V0b2Yoc3RydWN0IHNoX3NsZWVwX3JlZ3MsIHN0YmNyKSk7CisJREVGSU5FKFNIX1NMRUVQX1JFR19CQVIsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9yZWdzLCBiYXIpKTsKKwlERUZJTkUoU0hfU0xFRVBfUkVHX1BURUgsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9yZWdzLCBwdGVoKSk7CisJREVGSU5FKFNIX1NMRUVQX1JFR19QVEVMLCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfcmVncywgcHRlbCkpOworCURFRklORShTSF9TTEVFUF9SRUdfVFRCLCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfcmVncywgdHRiKSk7CisJREVGSU5FKFNIX1NMRUVQX1JFR19URUEsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9yZWdzLCB0ZWEpKTsKKwlERUZJTkUoU0hfU0xFRVBfUkVHX01NVUNSLCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfcmVncywgbW11Y3IpKTsKKwlERUZJTkUoU0hfU0xFRVBfUkVHX1BURUEsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9yZWdzLCBwdGVhKSk7CisJREVGSU5FKFNIX1NMRUVQX1JFR19QQVNDUiwgb2Zmc2V0b2Yoc3RydWN0IHNoX3NsZWVwX3JlZ3MsIHBhc2NyKSk7CisJREVGSU5FKFNIX1NMRUVQX1JFR19JUk1DUiwgb2Zmc2V0b2Yoc3RydWN0IHNoX3NsZWVwX3JlZ3MsIGlybWNyKSk7CisJREVGSU5FKFNIX1NMRUVQX1JFR19DQ1IsIG9mZnNldG9mKHN0cnVjdCBzaF9zbGVlcF9yZWdzLCBjY3IpKTsKKwlERUZJTkUoU0hfU0xFRVBfUkVHX1JBTUNSLCBvZmZzZXRvZihzdHJ1Y3Qgc2hfc2xlZXBfcmVncywgcmFtY3IpKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZQppbmRleCAzZDZiOTMxLi5kOTdjODAzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlCkBAIC0xNSw3ICsxNSw2IEBACiAKICMgQ29tbW9uIGludGVyZmFjZXMuCiAKLW9iai0kKENPTkZJR19VQkNfV0FLRVVQKQkrPSB1YmMubwogb2JqLSQoQ09ORklHX1NIX0FEQykJCSs9IGFkYy5vCiBvYmotJChDT05GSUdfU0hfQ0xLX0NQRykJKz0gY2xvY2stY3BnLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKaW5kZXggZTkzMmViZS4uODliNGI3NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCkBAIC03NSwxNiArNzUsMTEgQEAKIAkvKgogCSAqIEZ1dHVyZSBwcm9vZmluZy4KIAkgKgotCSAqIERpc2FibGUgc3VwcG9ydCBmb3Igc2xvdHRhYmxlIHNsZWVwIGluc3RydWN0aW9uCi0JICogYW5kIG5vbi1ub3AgaW5zdHJ1Y3Rpb25zIGluIHRoZSBydGUgZGVsYXkgc2xvdC4KKwkgKiBEaXNhYmxlIHN1cHBvcnQgZm9yIHNsb3R0YWJsZSBzbGVlcCBpbnN0cnVjdGlvbiwgbm9uLW5vcAorCSAqIGluc3RydWN0aW9ucyBpbiB0aGUgcnRlIGRlbGF5IHNsb3QsIGFuZCBhc3NvY2lhdGl2ZSB3cml0ZXMgdG8KKwkgKiB0aGUgbWVtb3J5LW1hcHBlZCBjYWNoZSBhcnJheS4KIAkgKi8KLQlleHBtYXNrICY9IH4oRVhQTUFTS19SVEVEUyB8IEVYUE1BU0tfQlJEU1NMUCk7Ci0KLQkvKgotCSAqIEVuYWJsZSBhc3NvY2lhdGl2ZSB3cml0ZXMgdG8gdGhlIG1lbW9yeS1tYXBwZWQgY2FjaGUgYXJyYXkKLQkgKiB1bnRpbCB0aGUgY2FjaGUgZmx1c2ggb3BzIGhhdmUgYmVlbiByZXdyaXR0ZW4uCi0JICovCi0JZXhwbWFzayB8PSBFWFBNQVNLX01NQ0FXOworCWV4cG1hc2sgJj0gfihFWFBNQVNLX1JURURTIHwgRVhQTUFTS19CUkRTU0xQIHwgRVhQTUFTS19NTUNBVyk7CiAKIAlfX3Jhd193cml0ZWwoZXhwbWFzaywgRVhQTUFTSyk7CiAJY3RybF9iYXJyaWVyKCk7CkBAIC0zMTEsMTIgKzMwNiwxMiBAQAogCWlmIChmcHVfZGlzYWJsZWQpIHsKIAkJcHJpbnRrKCJGUFUgRGlzYWJsZWRcbiIpOwogCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzICY9IH5DUFVfSEFTX0ZQVTsKLQkJZGlzYWJsZV9mcHUoKTsKIAl9CiAKIAkvKiBGUFUgaW5pdGlhbGl6YXRpb24gKi8KKwlkaXNhYmxlX2ZwdSgpOwogCWlmICgoY3VycmVudF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfRlBVKSkgewotCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfVVNFREZQVSk7CisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwogCQljbGVhcl91c2VkX21hdGgoKTsKIAl9CiAKQEAgLTMzOCwxNyArMzMzLDYgQEAKIAl9CiAjZW5kaWYKIAotCS8qCi0JICogU29tZSBicmFpbi1kYW1hZ2VkIGxvYWRlcnMgZGVjaWRlZCBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSB0byBwdXQKLQkgKiB0aGUgVUJDIHRvIHNsZWVwLiBUaGlzIGNhdXNlcyBzb21lIGlzc3VlcyB3aGVuIGl0IGNvbWVzIHRvIHRoaW5ncwotCSAqIGxpa2UgUFRSQUNFX1NJTkdMRVNURVAgb3IgZG9pbmcgaGFyZHdhcmUgd2F0Y2hwb2ludHMgaW4gR0RCLiAgU28gLi4KLQkgKiB3ZSB3YWtlIGl0IHVwIGFuZCBob3BlIHRoYXQgYWxsIGlzIHdlbGwuCi0JICovCi0jaWZkZWYgQ09ORklHX1NVUEVSSDMyCi0JaWYgKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCkKLQkJdWJjX3dha2V1cCgpOwotI2VuZGlmCi0KIAlzcGVjdWxhdGl2ZV9leGVjdXRpb25faW5pdCgpOwogCWV4cG1hc2tfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvZnB1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9mcHUuYwppbmRleCA2ZGYyZmI5OC4uZDM5NWNlNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvZnB1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvZnB1LmMKQEAgLTI1LDE0ICsyNSwxMiBAQAogCiAvKgogICogU2F2ZSBGUFUgcmVnaXN0ZXJzIG9udG8gdGFzayBzdHJ1Y3R1cmUuCi0gKiBBc3N1bWUgY2FsbGVkIHdpdGggRlBVIGVuYWJsZWQgKFNSLkZEPTApLgogICovCiB2b2lkCi1zYXZlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzYXZlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAl1bnNpZ25lZCBsb25nIGR1bW15OwogCi0JY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1VTRURGUFUpOwogCWVuYWJsZV9mcHUoKTsKIAlhc20gdm9sYXRpbGUoInN0cy5sCWZwdWwsIEAtJTBcblx0IgogCQkgICAgICJzdHMubAlmcHNjciwgQC0lMFxuXHQiCkBAIC02MCw3ICs1OCw2IEBACiAJCSAgICAgOiAibWVtb3J5Iik7CiAKIAlkaXNhYmxlX2ZwdSgpOwotCXJlbGVhc2VfZnB1KHJlZ3MpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTk4LDMxICs1OTUsMzEgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJVFJBUF9IQU5ETEVSX0RFQ0w7CiAKLQlzYXZlX2ZwdSh0c2ssIHJlZ3MpOworCV9fdW5sYXp5X2ZwdSh0c2ssIHJlZ3MpOwogCWlmIChpZWVlX2ZwZV9oYW5kbGVyKHJlZ3MpKSB7CiAJCXRzay0+dGhyZWFkLmZwdS5oYXJkLmZwc2NyICY9CiAJCQl+KEZQU0NSX0NBVVNFX01BU0sgfCBGUFNDUl9GTEFHX01BU0spOwogCQlncmFiX2ZwdShyZWdzKTsKIAkJcmVzdG9yZV9mcHUodHNrKTsKLQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsKIAkJcmV0dXJuOwogCX0KIAogCWZvcmNlX3NpZyhTSUdGUEUsIHRzayk7CiB9CiAKLUJVSUxEX1RSQVBfSEFORExFUihmcHVfc3RhdGVfcmVzdG9yZSkKK3ZvaWQgZnB1X3N0YXRlX3Jlc3RvcmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCVRSQVBfSEFORExFUl9ERUNMOwogCiAJZ3JhYl9mcHUocmVncyk7Ci0JaWYgKCF1c2VyX21vZGUocmVncykpIHsKKwlpZiAodW5saWtlbHkoIXVzZXJfbW9kZShyZWdzKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJCVUc6IEZQVSBpcyB1c2VkIGluIGtlcm5lbCBtb2RlLlxuIik7CisJCUJVRygpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHVzZWRfbWF0aCgpKSB7CisJaWYgKGxpa2VseSh1c2VkX21hdGgoKSkpIHsKIAkJLyogVXNpbmcgdGhlIEZQVSBhZ2Fpbi4gICovCiAJCXJlc3RvcmVfZnB1KHRzayk7CiAJfSBlbHNlCXsKQEAgLTYzMCw1ICs2MjcsMTMgQEAKIAkJZnB1X2luaXQoKTsKIAkJc2V0X3VzZWRfbWF0aCgpOwogCX0KLQlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1VTRURGUFUpOworCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzIHw9IFRTX1VTRURGUFU7CisJdHNrLT5mcHVfY291bnRlcisrOworfQorCitCVUlMRF9UUkFQX0hBTkRMRVIoZnB1X3N0YXRlX3Jlc3RvcmUpCit7CisJVFJBUF9IQU5ETEVSX0RFQ0w7CisKKwlmcHVfc3RhdGVfcmVzdG9yZShyZWdzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUwppbmRleCBiYjQwN2VmLi4zZjdlMmEyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCkBAIC0yOTcsNDEgKzI5Nyw4IEBACiAhCiAJLmJhbGlnbiAJMjU2LDAsMjU2CiBnZW5lcmFsX2V4Y2VwdGlvbjoKLSNpZm5kZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMKIAlicmEJaGFuZGxlX2V4Y2VwdGlvbgogCSBzdHMJcHIsIGszCQkhIHNhdmUgb3JpZ2luYWwgcHIgdmFsdWUgaW4gazMKLSNlbHNlCi0JbW92LmwJMWYsIGs0Ci0JbW92LmwJQGs0LCBrNAotCi0JISBJcyBFWFBFVlQgbGFyZ2VyIHRoYW4gMHg4MDA/Ci0JbW92CSMweDgsIGswCi0Jc2hsbDgJazAKLQljbXAvaHMJazAsIGs0Ci0JYmYJMGYKLQotCSEgdGhlbiBhZGQgMHg1ODAgKGsyIGlzIDB4ZDgwIG9yIDB4ZGEwKQotCW1vdgkjMHg1OCwgazAKLQlzaGxsMglrMAotCXNobGwyCWswCi0JYWRkCWswLCBrNAotMDoKLQkhIFNldHVwIHN0YWNrIGFuZCBzYXZlIERTUCBjb250ZXh0IChrMCBjb250YWlucyBvcmlnaW5hbCByMTUgb24gcmV0dXJuKQotCWJzcglwcmVwYXJlX3N0YWNrCi0JIG5vcAotCi0JISBTYXZlIHJlZ2lzdGVycyAvIFN3aXRjaCB0byBiYW5rIDAKLQltb3YJCWs0LCBrMgkJISBrZWVwIHZlY3RvciBpbiBrMgotCW1vdi5sCTFmLCBrNAkJISBTUiBiaXRzIHRvIGNsZWFyIGluIGs0Ci0JYnNyCXNhdmVfcmVncwkhIG5lZWRzIG9yaWdpbmFsIHByIHZhbHVlIGluIGszCi0JIG5vcAotCi0JYnJhCWhhbmRsZV9leGNlcHRpb25fc3BlY2lhbAotCSBub3AKLQotCS5hbGlnbgkyCi0xOgkubG9uZwlFWFBFVlQKLSNlbmRpZgogCiAhIHByZXBhcmVfc3RhY2soKQogISAtIHJvbGwgYmFjayBnUkIKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCmluZGV4IDIwM2IxODMuLjNhMWRiYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQpAQCAtOSw2ICs5LDExIEBACiBvYmotJChDT05GSUdfU0hfRlBVKQkJCSs9IGZwdS5vIHNvZnRmbG9hdC5vCiBvYmotJChDT05GSUdfU0hfU1RPUkVfUVVFVUVTKQkJKz0gc3EubwogCisjIFBlcmYgZXZlbnRzCitwZXJmLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkJOj0gcGVyZl9ldmVudC5vCitwZXJmLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpCTo9IHBlcmZfZXZlbnQubworcGVyZi0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEpCTo9IHBlcmZfZXZlbnQubworCiAjIENQVSBzdWJ0eXBlIHNldHVwCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpCSs9IHNldHVwLXNoNzc1MC5vCkBAIC0yNyw0ICszMiw1IEBACiAjIEFkZGl0aW9uYWwgY2xvY2tzIGJ5IHN1YnR5cGUKIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIpCSs9IGNsb2NrLXNoNC0yMDIubwogCi1vYmoteQkrPSAkKGNsb2NrLXkpCitvYmoteQkJCQkJKz0gJChjbG9jay15KQorb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKQkJKz0gJChwZXJmLXkpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2ZwdS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9mcHUuYwppbmRleCBlM2VhNTQxLi5lOTc4NTdhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2ZwdS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZnB1LmMKQEAgLTQxLDEzICs0MSwxMSBAQAogCiAvKgogICogU2F2ZSBGUFUgcmVnaXN0ZXJzIG9udG8gdGFzayBzdHJ1Y3R1cmUuCi0gKiBBc3N1bWUgY2FsbGVkIHdpdGggRlBVIGVuYWJsZWQgKFNSLkZEPTApLgogICovCi12b2lkIHNhdmVfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgc2F2ZV9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJdW5zaWduZWQgbG9uZyBkdW1teTsKIAotCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKIAllbmFibGVfZnB1KCk7CiAJYXNtIHZvbGF0aWxlICgic3RzLmwJZnB1bCwgQC0lMFxuXHQiCiAJCSAgICAgICJzdHMubAlmcHNjciwgQC0lMFxuXHQiCkBAIC05Miw3ICs5MCw2IEBACiAJCSAgICAgIDoibWVtb3J5Iik7CiAKIAlkaXNhYmxlX2ZwdSgpOwotCXJlbGVhc2VfZnB1KHJlZ3MpOwogfQogCiBzdGF0aWMgdm9pZCByZXN0b3JlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKQEAgLTI4NSw3ICsyODIsNiBAQAogCQkvKiBmY252c2QgKi8KIAkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCi0JCXNhdmVfZnB1KHRzaywgcmVncyk7CiAJCWlmICgodHNrLT50aHJlYWQuZnB1LmhhcmQuZnBzY3IgJiBGUFNDUl9DQVVTRV9FUlJPUikpCiAJCQkvKiBGUFUgZXJyb3IgKi8KIAkJCWRlbm9ybWFsX3RvX2RvdWJsZSgmdHNrLT50aHJlYWQuZnB1LmhhcmQsCkBAIC00NjIsNyArNDU4LDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJVFJBUF9IQU5ETEVSX0RFQ0w7CiAKLQlzYXZlX2ZwdSh0c2ssIHJlZ3MpOworCV9fdW5sYXp5X2ZwdSh0c2ssIHJlZ3MpOwogCWZwdV9leGNlcHRpb25fZmxhZ3MgPSAwOwogCWlmIChpZWVlX2ZwZV9oYW5kbGVyKHJlZ3MpKSB7CiAJCXRzay0+dGhyZWFkLmZwdS5oYXJkLmZwc2NyICY9CkBAIC00NzMsNyArNDY5LDcgQEAKIAkJdHNrLT50aHJlYWQuZnB1LmhhcmQuZnBzY3IgfD0gKGZwdV9leGNlcHRpb25fZmxhZ3MgPj4gMTApOwogCQlncmFiX2ZwdShyZWdzKTsKIAkJcmVzdG9yZV9mcHUodHNrKTsKLQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsKIAkJaWYgKCgoKHRzay0+dGhyZWFkLmZwdS5oYXJkLmZwc2NyICYgRlBTQ1JfRU5BQkxFX01BU0spID4+IDcpICYKIAkJICAgICAoZnB1X2V4Y2VwdGlvbl9mbGFncyA+PiAyKSkgPT0gMCkgewogCQkJcmV0dXJuOwpAQCAtNDgzLDE4ICs0NzksMTggQEAKIAlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOwogfQogCi1CVUlMRF9UUkFQX0hBTkRMRVIoZnB1X3N0YXRlX3Jlc3RvcmUpCit2b2lkIGZwdV9zdGF0ZV9yZXN0b3JlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQlUUkFQX0hBTkRMRVJfREVDTDsKIAogCWdyYWJfZnB1KHJlZ3MpOwotCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CisJaWYgKHVubGlrZWx5KCF1c2VyX21vZGUocmVncykpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQlVHOiBGUFUgaXMgdXNlZCBpbiBrZXJuZWwgbW9kZS5cbiIpOworCQlCVUcoKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICh1c2VkX21hdGgoKSkgeworCWlmIChsaWtlbHkodXNlZF9tYXRoKCkpKSB7CiAJCS8qIFVzaW5nIHRoZSBGUFUgYWdhaW4uICAqLwogCQlyZXN0b3JlX2ZwdSh0c2spOwogCX0gZWxzZSB7CkBAIC01MDIsNSArNDk4LDEzIEBACiAJCWZwdV9pbml0KCk7CiAJCXNldF91c2VkX21hdGgoKTsKIAl9Ci0Jc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKKwl0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyB8PSBUU19VU0VERlBVOworCXRzay0+ZnB1X2NvdW50ZXIrKzsKK30KKworQlVJTERfVFJBUF9IQU5ETEVSKGZwdV9zdGF0ZV9yZXN0b3JlKQoreworCVRSQVBfSEFORExFUl9ERUNMOworCisJZnB1X3N0YXRlX3Jlc3RvcmUocmVncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3BlcmZfZXZlbnQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcGVyZl9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOWVjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3BlcmZfZXZlbnQuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGV2ZW50cyBzdXBwb3J0IGZvciBTSDc3NTAtc3R5bGUgcGVyZm9ybWFuY2UgY291bnRlcnMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjZGVmaW5lIFBNX0NSX0JBU0UJMHhmZjAwMDA4NAkvKiAxNi1iaXQgKi8KKyNkZWZpbmUgUE1fQ1RSX0JBU0UJMHhmZjEwMDAwNAkvKiAzMi1iaXQgKi8KKworI2RlZmluZSBQTUNSKG4pCQkoUE1fQ1JfQkFTRSArICgobikgKiAweDA0KSkKKyNkZWZpbmUgUE1DVFJIKG4pCShQTV9DVFJfQkFTRSArIDB4MDAgKyAoKG4pICogMHgwOCkpCisjZGVmaW5lIFBNQ1RSTChuKQkoUE1fQ1RSX0JBU0UgKyAweDA0ICsgKChuKSAqIDB4MDgpKQorCisjZGVmaW5lIFBNQ1JfUE1NX01BU0sJMHgwMDAwMDAzZgorCisjZGVmaW5lIFBNQ1JfQ0xLRgkweDAwMDAwMTAwCisjZGVmaW5lIFBNQ1JfUE1DTFIJMHgwMDAwMjAwMAorI2RlZmluZSBQTUNSX1BNU1QJMHgwMDAwNDAwMAorI2RlZmluZSBQTUNSX1BNRU4JMHgwMDAwODAwMAorCitzdGF0aWMgc3RydWN0IHNoX3BtdSBzaDc3NTBfcG11OworCisvKgorICogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGV2ZW50cyBzdXBwb3J0ZWQgYnkgZWFjaCBjb3VudGVyICgzMyBpbiB0b3RhbCkuCisgKiBTaW5jZSB3ZSBoYXZlIDIgY291bnRlcnMsIGVhY2ggY291bnRlciB3aWxsIHRha2UgdGhlIGV2ZW50IGNvZGUgYXMgaXQKKyAqIGNvcnJlc3BvbmRzIHRvIHRoZSBQTUNSIFBNTSBzZXR0aW5nLiBFYWNoIGNvdW50ZXIgY2FuIGJlIGNvbmZpZ3VyZWQKKyAqIGluZGVwZW5kZW50bHkuCisgKgorICoJRXZlbnQgQ29kZQlEZXNjcmlwdGlvbgorICoJLS0tLS0tLS0tLQktLS0tLS0tLS0tLQorICoKKyAqCTB4MDEJCU9wZXJhbmQgcmVhZCBhY2Nlc3MKKyAqCTB4MDIJCU9wZXJhbmQgd3JpdGUgYWNjZXNzCisgKgkweDAzCQlVVExCIG1pc3MKKyAqCTB4MDQJCU9wZXJhbmQgY2FjaGUgcmVhZCBtaXNzCisgKgkweDA1CQlPcGVyYW5kIGNhY2hlIHdyaXRlIG1pc3MKKyAqCTB4MDYJCUluc3RydWN0aW9uIGZldGNoICh3LyBjYWNoZSkKKyAqCTB4MDcJCUluc3RydWN0aW9uIFRMQiBtaXNzCisgKgkweDA4CQlJbnN0cnVjdGlvbiBjYWNoZSBtaXNzCisgKgkweDA5CQlBbGwgb3BlcmFuZCBhY2Nlc3NlcworICoJMHgwYQkJQWxsIGluc3RydWN0aW9uIGFjY2Vzc2VzCisgKgkweDBiCQlPQyBSQU0gb3BlcmFuZCBhY2Nlc3MKKyAqCTB4MGQJCU9uLWNoaXAgSS9PIHNwYWNlIGFjY2VzcworICoJMHgwZQkJT3BlcmFuZCBhY2Nlc3MgKHIvdykKKyAqCTB4MGYJCU9wZXJhbmQgY2FjaGUgbWlzcyAoci93KQorICoJMHgxMAkJQnJhbmNoIGluc3RydWN0aW9uCisgKgkweDExCQlCcmFuY2ggdGFrZW4KKyAqCTB4MTIJCUJTUi9CU1JGL0pTUgorICoJMHgxMwkJSW5zdHJ1Y3Rpb24gZXhlY3V0aW9uCisgKgkweDE0CQlJbnN0cnVjdGlvbiBleGVjdXRpb24gaW4gcGFyYWxsZWwKKyAqCTB4MTUJCUZQVSBJbnN0cnVjdGlvbiBleGVjdXRpb24KKyAqCTB4MTYJCUludGVycnVwdAorICoJMHgxNwkJTk1JCisgKgkweDE4CQl0cmFwYSBpbnN0cnVjdGlvbiBleGVjdXRpb24KKyAqCTB4MTkJCVVCQ0EgbWF0Y2gKKyAqCTB4MWEJCVVCQ0IgbWF0Y2gKKyAqCTB4MjEJCUluc3RydWN0aW9uIGNhY2hlIGZpbGwKKyAqCTB4MjIJCU9wZXJhbmQgY2FjaGUgZmlsbAorICoJMHgyMwkJRWxhcHNlZCB0aW1lCisgKgkweDI0CQlQaXBlbGluZSBmcmVlemUgYnkgSS1jYWNoZSBtaXNzCisgKgkweDI1CQlQaXBlbGluZSBmcmVlemUgYnkgRC1jYWNoZSBtaXNzCisgKgkweDI3CQlQaXBlbGluZSBmcmVlemUgYnkgYnJhbmNoIGluc3RydWN0aW9uCisgKgkweDI4CQlQaXBlbGluZSBmcmVlemUgYnkgQ1BVIHJlZ2lzdGVyCisgKgkweDI5CQlQaXBlbGluZSBmcmVlemUgYnkgRlBVCisgKi8KKworc3RhdGljIGNvbnN0IGludCBzaDc3NTBfZ2VuZXJhbF9ldmVudHNbXSA9IHsKKwlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSAweDAwMjMsCisJW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXQkJPSAweDAwMGEsCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JPSAweDAwMDYsCS8qIEktY2FjaGUgKi8KKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQk9IDB4MDAwOCwJLyogSS1jYWNoZSAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHgwMDEwLAorCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQk9IC0xLAorCVtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdCQk9IC0xLAorfTsKKworI2RlZmluZSBDKHgpCVBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKK3N0YXRpYyBjb25zdCBpbnQgc2g3NzUwX2NhY2hlX2V2ZW50cworCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPQoreworCVsgQyhMMUQpIF0gPSB7CisJCVsgQyhPUF9SRUFEKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAwMDEsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDAwNCwKKwkJfSwKKwkJWyBDKE9QX1dSSVRFKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAwMDIsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDAwNSwKKwkJfSwKKwkJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCQl9LAorCX0sCisKKwlbIEMoTDFJKSBdID0geworCQlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMDA2LAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwMDgsCisJCX0sCisJCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCQl9LAorCQlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJCX0sCisJfSwKKworCVsgQyhMTCkgXSA9IHsKKwkJWyBDKE9QX1JFQUQpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJCX0sCisJCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwkJfSwKKwkJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCQl9LAorCX0sCisKKwlbIEMoRFRMQikgXSA9IHsKKwkJWyBDKE9QX1JFQUQpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDAwMywKKwkJfSwKKwkJWyBDKE9QX1dSSVRFKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCQl9LAorCQlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJCX0sCisJfSwKKworCVsgQyhJVExCKSBdID0geworCQlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMDA3LAorCQl9LAorCQlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwkJfSwKKwkJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJCX0sCisJfSwKKworCVsgQyhCUFUpIF0gPSB7CisJCVsgQyhPUF9SRUFEKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJCX0sCisJCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCQl9LAorCQlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBzaDc3NTBfZXZlbnRfbWFwKGludCBldmVudCkKK3sKKwlyZXR1cm4gc2g3NzUwX2dlbmVyYWxfZXZlbnRzW2V2ZW50XTsKK30KKworc3RhdGljIHU2NCBzaDc3NTBfcG11X3JlYWQoaW50IGlkeCkKK3sKKwlyZXR1cm4gKHU2NCkoKHU2NCkoX19yYXdfcmVhZGwoUE1DVFJIKGlkeCkpICYgMHhmZmZmKSA8PCAzMikgfAorCQkJICAgX19yYXdfcmVhZGwoUE1DVFJMKGlkeCkpOworfQorCitzdGF0aWMgdm9pZCBzaDc3NTBfcG11X2Rpc2FibGUoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJdG1wID0gX19yYXdfcmVhZHcoUE1DUihpZHgpKTsKKwl0bXAgJj0gfihQTUNSX1BNTV9NQVNLIHwgUE1DUl9QTUVOKTsKKwlfX3Jhd193cml0ZXcodG1wLCBQTUNSKGlkeCkpOworfQorCitzdGF0aWMgdm9pZCBzaDc3NTBfcG11X2VuYWJsZShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLCBpbnQgaWR4KQoreworCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhQTUNSKGlkeCkpIHwgUE1DUl9QTUNMUiwgUE1DUihpZHgpKTsKKwlfX3Jhd193cml0ZXcoaHdjLT5jb25maWcgfCBQTUNSX1BNRU4gfCBQTUNSX1BNU1QsIFBNQ1IoaWR4KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNoNzc1MF9wbXVfZGlzYWJsZV9hbGwodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaDc3NTBfcG11Lm51bV9ldmVudHM7IGkrKykKKwkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBNQ1IoaSkpICYgflBNQ1JfUE1FTiwgUE1DUihpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNoNzc1MF9wbXVfZW5hYmxlX2FsbCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNoNzc1MF9wbXUubnVtX2V2ZW50czsgaSsrKQorCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUE1DUihpKSkgfCBQTUNSX1BNRU4sIFBNQ1IoaSkpOworfQorCitzdGF0aWMgc3RydWN0IHNoX3BtdSBzaDc3NTBfcG11ID0geworCS5uYW1lCQk9ICJTSDc3NTAiLAorCS5udW1fZXZlbnRzCT0gMiwKKwkuZXZlbnRfbWFwCT0gc2g3NzUwX2V2ZW50X21hcCwKKwkubWF4X2V2ZW50cwk9IEFSUkFZX1NJWkUoc2g3NzUwX2dlbmVyYWxfZXZlbnRzKSwKKwkucmF3X2V2ZW50X21hc2sJPSBQTUNSX1BNTV9NQVNLLAorCS5jYWNoZV9ldmVudHMJPSAmc2g3NzUwX2NhY2hlX2V2ZW50cywKKwkucmVhZAkJPSBzaDc3NTBfcG11X3JlYWQsCisJLmRpc2FibGUJPSBzaDc3NTBfcG11X2Rpc2FibGUsCisJLmVuYWJsZQkJPSBzaDc3NTBfcG11X2VuYWJsZSwKKwkuZGlzYWJsZV9hbGwJPSBzaDc3NTBfcG11X2Rpc2FibGVfYWxsLAorCS5lbmFibGVfYWxsCT0gc2g3NzUwX3BtdV9lbmFibGVfYWxsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3NzUwX3BtdV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhpcyBDUFUgYWN0dWFsbHkgaGFzIHBlcmYgY291bnRlcnMuCisJICovCisJaWYgKCEoYm9vdF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfUEVSRl9DT1VOVEVSKSkgeworCQlwcl9ub3RpY2UoIkhXIHBlcmYgZXZlbnRzIHVuc3VwcG9ydGVkLCBzb2Z0d2FyZSBldmVudHMgb25seS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gcmVnaXN0ZXJfc2hfcG11KCZzaDc3NTBfcG11KTsKK30KK2FyY2hfaW5pdGNhbGwoc2g3NzUwX3BtdV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKaW5kZXggNDkwZDVkYy4uMzNiYWI0NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKQEAgLTQ0LDMgKzQ0LDQgQEAKIG9iai15CQkJCSs9ICQoY2xvY2steSkKIG9iai0kKENPTkZJR19TTVApCQkrPSAkKHNtcC15KQogb2JqLSQoQ09ORklHX0dFTkVSSUNfR1BJTykJKz0gJChwaW5tdXgteSkKK29iai0kKENPTkZJR19QRVJGX0VWRU5UUykJKz0gcGVyZl9ldmVudC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyNC5jCmluZGV4IGRmZTkxOTIuLjlkYjc0MzggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyNC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyNC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlTSF9DTEtfRElWNigiZnNpYV9jbGsiLCAmZGl2M19jbGssIEZDTEtBQ1IsIDApLAogCVNIX0NMS19ESVY2KCJmc2liX2NsayIsICZkaXYzX2NsaywgRkNMS0JDUiwgMCksCiAJU0hfQ0xLX0RJVjYoImlyZGFfY2xrIiwgJmRpdjNfY2xrLCBJUkRBQ0xLQ1IsIDApLAotCVNIX0NMS19ESVY2KCJzcHVfY2xrIiwgJmRpdjNfY2xrLCBTUFVDTEtDUiwgMCksCisJU0hfQ0xLX0RJVjYoInNwdV9jbGsiLCAmZGl2M19jbGssIFNQVUNMS0NSLCBDTEtfRU5BQkxFX09OX0lOSVQpLAogfTsKIAogI2RlZmluZSBSX0NMSyAoJnJfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvcGVyZl9ldmVudC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvcGVyZl9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGMyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9wZXJmX2V2ZW50LmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBldmVudHMgc3VwcG9ydCBmb3IgU0gtNEEgcGVyZm9ybWFuY2UgY291bnRlcnMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjZGVmaW5lIFBQQ19DQ0JSKGlkeCkJKDB4ZmYyMDA4MDAgKyAoc2l6ZW9mKHUzMikgKiBpZHgpKQorI2RlZmluZSBQUENfUE1DVFIoaWR4KQkoMHhmYzEwMDAwMCArIChzaXplb2YodTMyKSAqIGlkeCkpCisKKyNkZWZpbmUgQ0NCUl9DSVRfTUFTSwkoMHg3ZmYgPDwgNikKKyNkZWZpbmUgQ0NCUl9EVUMJKDEgPDwgMykKKyNkZWZpbmUgQ0NCUl9DTURTCSgxIDw8IDEpCisjZGVmaW5lIENDQlJfUFBDRQkoMSA8PCAwKQorCisjZGVmaW5lIFBQQ19QTUNBVAkweGZjMTAwMDgwCisKKyNkZWZpbmUgUE1DQVRfT1ZGMwkoMSA8PCAyNykKKyNkZWZpbmUgUE1DQVRfQ05OMwkoMSA8PCAyNikKKyNkZWZpbmUgUE1DQVRfQ0xSMwkoMSA8PCAyNSkKKyNkZWZpbmUgUE1DQVRfT1ZGMgkoMSA8PCAxOSkKKyNkZWZpbmUgUE1DQVRfQ0xSMgkoMSA8PCAxNykKKyNkZWZpbmUgUE1DQVRfT1ZGMQkoMSA8PCAxMSkKKyNkZWZpbmUgUE1DQVRfQ05OMQkoMSA8PCAxMCkKKyNkZWZpbmUgUE1DQVRfQ0xSMQkoMSA8PCA5KQorI2RlZmluZSBQTUNBVF9PVkYwCSgxIDw8IDMpCisjZGVmaW5lIFBNQ0FUX0NMUjAJKDEgPDwgMSkKKworc3RhdGljIHN0cnVjdCBzaF9wbXUgc2g0YV9wbXU7CisKKy8qCisgKiBTdXBwb3J0ZWQgcmF3IGV2ZW50IGNvZGVzOgorICoKKyAqCUV2ZW50IENvZGUJRGVzY3JpcHRpb24KKyAqCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0KKyAqCisgKgkweDAwMDAJCW51bWJlciBvZiBlbGFwc2VkIGN5Y2xlcworICoJMHgwMjAwCQludW1iZXIgb2YgZWxhcHNlZCBjeWNsZXMgaW4gcHJpdmlsZWdlZCBtb2RlCisgKgkweDAyODAJCW51bWJlciBvZiBlbGFwc2VkIGN5Y2xlcyB3aGlsZSBTUi5CTCBpcyBhc3NlcnRlZAorICoJMHgwMjAyCQlpbnN0cnVjdGlvbiBleGVjdXRpb24KKyAqCTB4MDIwMwkJaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uIGluIHBhcmFsbGVsCisgKgkweDAyMDQJCW51bWJlciBvZiB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzCisgKgkweDAyMDgJCW51bWJlciBvZiBleGNlcHRpb25zCisgKgkweDAyMDkJCW51bWJlciBvZiBpbnRlcnJ1cHRzCisgKgkweDAyMjAJCVVUTEIgbWlzcyBjYXVzZWQgYnkgaW5zdHJ1Y3Rpb24gZmV0Y2gKKyAqCTB4MDIyMgkJVVRMQiBtaXNzIGNhdXNlZCBieSBvcGVyYW5kIGFjY2VzcworICoJMHgwMmEwCQludW1iZXIgb2YgSVRMQiBtaXNzZXMKKyAqCTB4MDAyOAkJbnVtYmVyIG9mIGFjY2Vzc2VzIHRvIGluc3RydWN0aW9uIG1lbW9yaWVzCisgKgkweDAwMjkJCW51bWJlciBvZiBhY2Nlc3NlcyB0byBpbnN0cnVjdGlvbiBjYWNoZQorICoJMHgwMDJhCQlpbnN0cnVjdGlvbiBjYWNoZSBtaXNzCisgKgkweDAyMmUJCW51bWJlciBvZiBhY2Nlc3MgdG8gaW5zdHJ1Y3Rpb24gWC9ZIG1lbW9yeQorICoJMHgwMDMwCQludW1iZXIgb2YgcmVhZHMgdG8gb3BlcmFuZCBtZW1vcmllcworICoJMHgwMDM4CQludW1iZXIgb2Ygd3JpdGVzIHRvIG9wZXJhbmQgbWVtb3JpZXMKKyAqCTB4MDAzMQkJbnVtYmVyIG9mIG9wZXJhbmQgY2FjaGUgcmVhZCBhY2Nlc3NlcworICoJMHgwMDM5CQludW1iZXIgb2Ygb3BlcmFuZCBjYWNoZSB3cml0ZSBhY2Nlc3NlcworICoJMHgwMDMyCQlvcGVyYW5kIGNhY2hlIHJlYWQgbWlzcworICoJMHgwMDNhCQlvcGVyYW5kIGNhY2hlIHdyaXRlIG1pc3MKKyAqCTB4MDIzNgkJbnVtYmVyIG9mIHJlYWRzIHRvIG9wZXJhbmQgWC9ZIG1lbW9yeQorICoJMHgwMjNlCQludW1iZXIgb2Ygd3JpdGVzIHRvIG9wZXJhbmQgWC9ZIG1lbW9yeQorICoJMHgwMjM3CQludW1iZXIgb2YgcmVhZHMgdG8gb3BlcmFuZCBVIG1lbW9yeQorICoJMHgwMjNmCQludW1iZXIgb2Ygd3JpdGVzIHRvIG9wZXJhbmQgVSBtZW1vcnkKKyAqCTB4MDMzNwkJbnVtYmVyIG9mIFUgbWVtb3J5IHJlYWQgYnVmZmVyIG1pc3NlcworICoJMHgwMmI0CQludW1iZXIgb2Ygd2FpdCBjeWNsZXMgZHVlIHRvIG9wZXJhbmQgcmVhZCBhY2Nlc3MKKyAqCTB4MDJiYwkJbnVtYmVyIG9mIHdhaXQgY3ljbGVzIGR1ZSB0byBvcGVyYW5kIHdyaXRlIGFjY2VzcworICoJMHgwMDMzCQludW1iZXIgb2Ygd2FpdCBjeWNsZXMgZHVlIHRvIG9wZXJhbmQgY2FjaGUgcmVhZCBtaXNzCisgKgkweDAwM2IJCW51bWJlciBvZiB3YWl0IGN5Y2xlcyBkdWUgdG8gb3BlcmFuZCBjYWNoZSB3cml0ZSBtaXNzCisgKi8KKworLyoKKyAqIFNwZWNpYWwgcmVzZXJ2ZWQgYml0cyB1c2VkIGJ5IGhhcmR3YXJlIGVtdWxhdG9ycywgcmVhZCB2YWx1ZXMgd2lsbAorICogdmFyeSwgYnV0IHdyaXRlcyBtdXN0IGFsd2F5cyBiZSAwLgorICovCisjZGVmaW5lIFBNQ0FUX0VNVV9DTFJfTUFTSwkoKDEgPDwgMjQpIHwgKDEgPDwgMTYpIHwgKDEgPDwgOCkgfCAoMSA8PCAwKSkKKworc3RhdGljIGNvbnN0IGludCBzaDRhX2dlbmVyYWxfZXZlbnRzW10gPSB7CisJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JCT0gMHgwMDAwLAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMHgwMjAyLAorCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCT0gMHgwMDI5LAkvKiBJLWNhY2hlICovCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDAwMmEsCS8qIEktY2FjaGUgKi8KKwlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TXQk9IDB4MDIwNCwKKwlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXQkJPSAtMSwKKwlbUEVSRl9DT1VOVF9IV19CVVNfQ1lDTEVTXQkJPSAtMSwKK307CisKKyNkZWZpbmUgQyh4KQlQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAorCitzdGF0aWMgY29uc3QgaW50IHNoNGFfY2FjaGVfZXZlbnRzCisJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXSA9Cit7CisJWyBDKEwxRCkgXSA9IHsKKwkJWyBDKE9QX1JFQUQpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDAzMSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMDMyLAorCQl9LAorCQlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDAzOSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMDNhLAorCQl9LAorCQlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJCX0sCisJfSwKKworCVsgQyhMMUkpIF0gPSB7CisJCVsgQyhPUF9SRUFEKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAwMjksCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDAyYSwKKwkJfSwKKwkJWyBDKE9QX1dSSVRFKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJCX0sCisJCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwkJfSwKKwl9LAorCisJWyBDKExMKSBdID0geworCQlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMDMwLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCQl9LAorCQlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDAzOCwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwkJfSwKKwkJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCQl9LAorCX0sCisKKwlbIEMoRFRMQikgXSA9IHsKKwkJWyBDKE9QX1JFQUQpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDIyMiwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMjIwLAorCQl9LAorCQlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJCX0sCisJCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwkJfSwKKwl9LAorCisJWyBDKElUTEIpIF0gPSB7CisJCVsgQyhPUF9SRUFEKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAyYTAsCisJCX0sCisJCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCQl9LAorCQlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwkJfSwKKwl9LAorCisJWyBDKEJQVSkgXSA9IHsKKwkJWyBDKE9QX1JFQUQpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwkJfSwKKwkJWyBDKE9QX1dSSVRFKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJCX0sCisJCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgaW50IHNoNGFfZXZlbnRfbWFwKGludCBldmVudCkKK3sKKwlyZXR1cm4gc2g0YV9nZW5lcmFsX2V2ZW50c1tldmVudF07Cit9CisKK3N0YXRpYyB1NjQgc2g0YV9wbXVfcmVhZChpbnQgaWR4KQoreworCXJldHVybiBfX3Jhd19yZWFkbChQUENfUE1DVFIoaWR4KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNoNGFfcG11X2Rpc2FibGUoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJdG1wID0gX19yYXdfcmVhZGwoUFBDX0NDQlIoaWR4KSk7CisJdG1wICY9IH4oQ0NCUl9DSVRfTUFTSyB8IENDQlJfRFVDKTsKKwlfX3Jhd193cml0ZWwodG1wLCBQUENfQ0NCUihpZHgpKTsKK30KKworc3RhdGljIHZvaWQgc2g0YV9wbXVfZW5hYmxlKHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXRtcCA9IF9fcmF3X3JlYWRsKFBQQ19QTUNBVCk7CisJdG1wICY9IH5QTUNBVF9FTVVfQ0xSX01BU0s7CisJdG1wIHw9IGlkeCA/IFBNQ0FUX0NMUjEgOiBQTUNBVF9DTFIwOworCV9fcmF3X3dyaXRlbCh0bXAsIFBQQ19QTUNBVCk7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChQUENfQ0NCUihpZHgpKTsKKwl0bXAgfD0gKGh3Yy0+Y29uZmlnIDw8IDYpIHwgQ0NCUl9DTURTIHwgQ0NCUl9QUENFOworCV9fcmF3X3dyaXRlbCh0bXAsIFBQQ19DQ0JSKGlkeCkpOworCisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFBQQ19DQ0JSKGlkeCkpIHwgQ0NCUl9EVUMsIFBQQ19DQ0JSKGlkeCkpOworfQorCitzdGF0aWMgdm9pZCBzaDRhX3BtdV9kaXNhYmxlX2FsbCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNoNGFfcG11Lm51bV9ldmVudHM7IGkrKykKKwkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFBQQ19DQ0JSKGkpKSAmIH5DQ0JSX0RVQywgUFBDX0NDQlIoaSkpOworfQorCitzdGF0aWMgdm9pZCBzaDRhX3BtdV9lbmFibGVfYWxsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2g0YV9wbXUubnVtX2V2ZW50czsgaSsrKQorCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoUFBDX0NDQlIoaSkpIHwgQ0NCUl9EVUMsIFBQQ19DQ0JSKGkpKTsKK30KKworc3RhdGljIHN0cnVjdCBzaF9wbXUgc2g0YV9wbXUgPSB7CisJLm5hbWUJCT0gIlNILTRBIiwKKwkubnVtX2V2ZW50cwk9IDIsCisJLmV2ZW50X21hcAk9IHNoNGFfZXZlbnRfbWFwLAorCS5tYXhfZXZlbnRzCT0gQVJSQVlfU0laRShzaDRhX2dlbmVyYWxfZXZlbnRzKSwKKwkucmF3X2V2ZW50X21hc2sJPSAweDNmZiwKKwkuY2FjaGVfZXZlbnRzCT0gJnNoNGFfY2FjaGVfZXZlbnRzLAorCS5yZWFkCQk9IHNoNGFfcG11X3JlYWQsCisJLmRpc2FibGUJPSBzaDRhX3BtdV9kaXNhYmxlLAorCS5lbmFibGUJCT0gc2g0YV9wbXVfZW5hYmxlLAorCS5kaXNhYmxlX2FsbAk9IHNoNGFfcG11X2Rpc2FibGVfYWxsLAorCS5lbmFibGVfYWxsCT0gc2g0YV9wbXVfZW5hYmxlX2FsbCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoNGFfcG11X2luaXQodm9pZCkKK3sKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGlzIENQVSBhY3R1YWxseSBoYXMgcGVyZiBjb3VudGVycy4KKwkgKi8KKwlpZiAoIShib290X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19QRVJGX0NPVU5URVIpKSB7CisJCXByX25vdGljZSgiSFcgcGVyZiBldmVudHMgdW5zdXBwb3J0ZWQsIHNvZnR3YXJlIGV2ZW50cyBvbmx5LlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiByZWdpc3Rlcl9zaF9wbXUoJnNoNGFfcG11KTsKK30KK2FyY2hfaW5pdGNhbGwoc2g0YV9wbXVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCmluZGV4IGYzODUxZmQuLjg0NWU4OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvdWlvX2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL21tem9uZS5oPgogI2luY2x1ZGUgPGNwdS9zaDc3MjQuaD4KQEAgLTIwMiw3ICsyMDQsNyBAQAogCVswXSA9IHsKIAkJLm5hbWUJPSAiVkVVM0YwIiwKIAkJLnN0YXJ0CT0gMHhmZTkyMDAwMCwKLQkJLmVuZAk9IDB4ZmU5MjAwY2IgLSAxLAorCQkuZW5kCT0gMHhmZTkyMDBjYiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC0yMzQsNyArMjM2LDcgQEAKIAlbMF0gPSB7CiAJCS5uYW1lCT0gIlZFVTNGMSIsCiAJCS5zdGFydAk9IDB4ZmU5MjQwMDAsCi0JCS5lbmQJPSAweGZlOTI0MGNiIC0gMSwKKwkJLmVuZAk9IDB4ZmU5MjQwY2IsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtNTIzLDYgKzUyNSw3MCBAQAogCX0sCiB9OwogCisvKiBTUFUyRFNQMCAqLworc3RhdGljIHN0cnVjdCB1aW9faW5mbyBzcHUwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiU1BVMkRTUDAiLAorCS52ZXJzaW9uID0gIjAiLAorCS5pcnEgPSA4NiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3B1MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlNQVTJEU1AwIiwKKwkJLnN0YXJ0CT0gMHhGRTIwMDAwMCwKKwkJLmVuZAk9IDB4RkUyRkZGRkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkvKiBwbGFjZSBob2xkZXIgZm9yIGNvbnRpZ3VvdXMgbWVtb3J5ICovCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJ1aW9fcGRydl9nZW5pcnEiLAorCS5pZAkJPSA0LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNwdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHNwdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzcHUwX3Jlc291cmNlcyksCisJLmFyY2hkYXRhID0geworCQkuaHdibGtfaWQgPSBIV0JMS19TUFUsCisJfSwKK307CisKKy8qIFNQVTJEU1AxICovCitzdGF0aWMgc3RydWN0IHVpb19pbmZvIHNwdTFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJTUFUyRFNQMSIsCisJLnZlcnNpb24gPSAiMCIsCisJLmlycSA9IDg3LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzcHUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiU1BVMkRTUDEiLAorCQkuc3RhcnQJPSAweEZFMzAwMDAwLAorCQkuZW5kCT0gMHhGRTNGRkZGRiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS8qIHBsYWNlIGhvbGRlciBmb3IgY29udGlndW91cyBtZW1vcnkgKi8KKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3B1MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInVpb19wZHJ2X2dlbmlycSIsCisJLmlkCQk9IDUsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmc3B1MV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gc3B1MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNwdTFfcmVzb3VyY2VzKSwKKwkuYXJjaGRhdGEgPSB7CisJCS5od2Jsa19pZCA9IEhXQkxLX1NQVSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzcyNF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmY210X2RldmljZSwKIAkmdG11MF9kZXZpY2UsCkBAIC01MzksNiArNjA1LDggQEAKIAkmdmV1MF9kZXZpY2UsCiAJJnZldTFfZGV2aWNlLAogCSZqcHVfZGV2aWNlLAorCSZzcHUwX2RldmljZSwKKwkmc3B1MV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3MjRfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtNTQ3LDYgKzYxNSw4IEBACiAJcGxhdGZvcm1fcmVzb3VyY2Vfc2V0dXBfbWVtb3J5KCZ2ZXUwX2RldmljZSwgInZldTAiLCAyIDw8IDIwKTsKIAlwbGF0Zm9ybV9yZXNvdXJjZV9zZXR1cF9tZW1vcnkoJnZldTFfZGV2aWNlLCAidmV1MSIsIDIgPDwgMjApOwogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmanB1X2RldmljZSwgICJqcHUiLCAgMiA8PCAyMCk7CisJcGxhdGZvcm1fcmVzb3VyY2Vfc2V0dXBfbWVtb3J5KCZzcHUwX2RldmljZSwgInNwdTAiLCAyIDw8IDIwKTsKKwlwbGF0Zm9ybV9yZXNvdXJjZV9zZXR1cF9tZW1vcnkoJnNwdTFfZGV2aWNlLCAic3B1MSIsIDIgPDwgMjApOwogCiAJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzcyNF9kZXZpY2VzLAogCQkJCSAgICBBUlJBWV9TSVpFKHNoNzcyNF9kZXZpY2VzKSk7CkBAIC04MjcsMyArODk3LDE5MyBAQAogewogCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y19kZXNjKTsKIH0KKworc3RhdGljIHN0cnVjdCB7CisJLyogQlNDICovCisJdW5zaWduZWQgbG9uZyBtbXNlbHI7CisJdW5zaWduZWQgbG9uZyBjczBiY3I7CisJdW5zaWduZWQgbG9uZyBjczRiY3I7CisJdW5zaWduZWQgbG9uZyBjczVhYmNyOworCXVuc2lnbmVkIGxvbmcgY3M1YmJjcjsKKwl1bnNpZ25lZCBsb25nIGNzNmFiY3I7CisJdW5zaWduZWQgbG9uZyBjczZiYmNyOworCXVuc2lnbmVkIGxvbmcgY3M0d2NyOworCXVuc2lnbmVkIGxvbmcgY3M1YXdjcjsKKwl1bnNpZ25lZCBsb25nIGNzNWJ3Y3I7CisJdW5zaWduZWQgbG9uZyBjczZhd2NyOworCXVuc2lnbmVkIGxvbmcgY3M2YndjcjsKKwkvKiBJTlRDICovCisJdW5zaWduZWQgc2hvcnQgaXByYTsKKwl1bnNpZ25lZCBzaG9ydCBpcHJiOworCXVuc2lnbmVkIHNob3J0IGlwcmM7CisJdW5zaWduZWQgc2hvcnQgaXByZDsKKwl1bnNpZ25lZCBzaG9ydCBpcHJlOworCXVuc2lnbmVkIHNob3J0IGlwcmY7CisJdW5zaWduZWQgc2hvcnQgaXByZzsKKwl1bnNpZ25lZCBzaG9ydCBpcHJoOworCXVuc2lnbmVkIHNob3J0IGlwcmk7CisJdW5zaWduZWQgc2hvcnQgaXByajsKKwl1bnNpZ25lZCBzaG9ydCBpcHJrOworCXVuc2lnbmVkIHNob3J0IGlwcmw7CisJdW5zaWduZWQgY2hhciBpbXIwOworCXVuc2lnbmVkIGNoYXIgaW1yMTsKKwl1bnNpZ25lZCBjaGFyIGltcjI7CisJdW5zaWduZWQgY2hhciBpbXIzOworCXVuc2lnbmVkIGNoYXIgaW1yNDsKKwl1bnNpZ25lZCBjaGFyIGltcjU7CisJdW5zaWduZWQgY2hhciBpbXI2OworCXVuc2lnbmVkIGNoYXIgaW1yNzsKKwl1bnNpZ25lZCBjaGFyIGltcjg7CisJdW5zaWduZWQgY2hhciBpbXI5OworCXVuc2lnbmVkIGNoYXIgaW1yMTA7CisJdW5zaWduZWQgY2hhciBpbXIxMTsKKwl1bnNpZ25lZCBjaGFyIGltcjEyOworCS8qIFJXRFQgKi8KKwl1bnNpZ25lZCBzaG9ydCByd3RjbnQ7CisJdW5zaWduZWQgc2hvcnQgcnd0Y3NyOworCS8qIENQRyAqLworCXVuc2lnbmVkIGxvbmcgaXJkYWNsazsKKwl1bnNpZ25lZCBsb25nIHNwdWNsazsKK30gc2g3NzI0X3JzdGFuZGJ5X3N0YXRlOworCitzdGF0aWMgaW50IHNoNzcyNF9wcmVfc2xlZXBfbm90aWZpZXJfY2FsbChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoIShmbGFncyAmIFNVU1BfU0hfUlNUQU5EQlkpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwkvKiBCQ1IgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUubW1zZWxyID0gX19yYXdfcmVhZGwoMHhmZjgwMDAyMCk7IC8qIE1NU0VMUiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5tbXNlbHIgfD0gMHhhNWE1MDAwMDsKKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuY3MwYmNyID0gX19yYXdfcmVhZGwoMHhmZWMxMDAwNCk7IC8qIENTMEJDUiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczRiY3IgPSBfX3Jhd19yZWFkbCgweGZlYzEwMDEwKTsgLyogQ1M0QkNSICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNWFiY3IgPSBfX3Jhd19yZWFkbCgweGZlYzEwMDE0KTsgLyogQ1M1QUJDUiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczViYmNyID0gX19yYXdfcmVhZGwoMHhmZWMxMDAxOCk7IC8qIENTNUJCQ1IgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuY3M2YWJjciA9IF9fcmF3X3JlYWRsKDB4ZmVjMTAwMWMpOyAvKiBDUzZBQkNSICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNmJiY3IgPSBfX3Jhd19yZWFkbCgweGZlYzEwMDIwKTsgLyogQ1M2QkJDUiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczR3Y3IgPSBfX3Jhd19yZWFkbCgweGZlYzEwMDMwKTsgLyogQ1M0V0NSICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNWF3Y3IgPSBfX3Jhd19yZWFkbCgweGZlYzEwMDM0KTsgLyogQ1M1QVdDUiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczVid2NyID0gX19yYXdfcmVhZGwoMHhmZWMxMDAzOCk7IC8qIENTNUJXQ1IgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuY3M2YXdjciA9IF9fcmF3X3JlYWRsKDB4ZmVjMTAwM2MpOyAvKiBDUzZBV0NSICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNmJ3Y3IgPSBfX3Jhd19yZWFkbCgweGZlYzEwMDQwKTsgLyogQ1M2QldDUiAqLworCisJLyogSU5UQyAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJhID0gX19yYXdfcmVhZHcoMHhhNDA4MDAwMCk7IC8qIElQUkEgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByYiA9IF9fcmF3X3JlYWR3KDB4YTQwODAwMDQpOyAvKiBJUFJCICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmMgPSBfX3Jhd19yZWFkdygweGE0MDgwMDA4KTsgLyogSVBSQyAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJkID0gX19yYXdfcmVhZHcoMHhhNDA4MDAwYyk7IC8qIElQUkQgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByZSA9IF9fcmF3X3JlYWR3KDB4YTQwODAwMTApOyAvKiBJUFJFICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmYgPSBfX3Jhd19yZWFkdygweGE0MDgwMDE0KTsgLyogSVBSRiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJnID0gX19yYXdfcmVhZHcoMHhhNDA4MDAxOCk7IC8qIElQUkcgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByaCA9IF9fcmF3X3JlYWR3KDB4YTQwODAwMWMpOyAvKiBJUFJIICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmkgPSBfX3Jhd19yZWFkdygweGE0MDgwMDIwKTsgLyogSVBSSSAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJqID0gX19yYXdfcmVhZHcoMHhhNDA4MDAyNCk7IC8qIElQUkogKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByayA9IF9fcmF3X3JlYWR3KDB4YTQwODAwMjgpOyAvKiBJUFJLICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmwgPSBfX3Jhd19yZWFkdygweGE0MDgwMDJjKTsgLyogSVBSTCAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXIwID0gX19yYXdfcmVhZGIoMHhhNDA4MDA4MCk7IC8qIElNUjAgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMSA9IF9fcmF3X3JlYWRiKDB4YTQwODAwODQpOyAvKiBJTVIxICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmltcjIgPSBfX3Jhd19yZWFkYigweGE0MDgwMDg4KTsgLyogSU1SMiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXIzID0gX19yYXdfcmVhZGIoMHhhNDA4MDA4Yyk7IC8qIElNUjMgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yNCA9IF9fcmF3X3JlYWRiKDB4YTQwODAwOTApOyAvKiBJTVI0ICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmltcjUgPSBfX3Jhd19yZWFkYigweGE0MDgwMDk0KTsgLyogSU1SNSAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXI2ID0gX19yYXdfcmVhZGIoMHhhNDA4MDA5OCk7IC8qIElNUjYgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yNyA9IF9fcmF3X3JlYWRiKDB4YTQwODAwOWMpOyAvKiBJTVI3ICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmltcjggPSBfX3Jhd19yZWFkYigweGE0MDgwMGEwKTsgLyogSU1SOCAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXI5ID0gX19yYXdfcmVhZGIoMHhhNDA4MDBhNCk7IC8qIElNUjkgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMTAgPSBfX3Jhd19yZWFkYigweGE0MDgwMGE4KTsgLyogSU1SMTAgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMTEgPSBfX3Jhd19yZWFkYigweGE0MDgwMGFjKTsgLyogSU1SMTEgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMTIgPSBfX3Jhd19yZWFkYigweGE0MDgwMGIwKTsgLyogSU1SMTIgKi8KKworCS8qIFJXRFQgKi8KKwlzaDc3MjRfcnN0YW5kYnlfc3RhdGUucnd0Y250ID0gX19yYXdfcmVhZGIoMHhhNDUyMDAwMCk7IC8qIFJXVENOVCAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5yd3RjbnQgfD0gMHg1YTAwOworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5yd3Rjc3IgPSBfX3Jhd19yZWFkYigweGE0NTIwMDA0KTsgLyogUldUQ1NSICovCisJc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLnJ3dGNzciB8PSAweGE1MDA7CisJX19yYXdfd3JpdGV3KHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5yd3Rjc3IgJiAweDA3LCAweGE0NTIwMDA0KTsKKworCS8qIENQRyAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcmRhY2xrID0gX19yYXdfcmVhZGwoMHhhNDE1MDAxOCk7IC8qIElSREFDTEtDUiAqLworCXNoNzcyNF9yc3RhbmRieV9zdGF0ZS5zcHVjbGsgPSBfX3Jhd19yZWFkbCgweGE0MTUwMDNjKTsgLyogU1BVQ0xLQ1IgKi8KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGludCBzaDc3MjRfcG9zdF9zbGVlcF9ub3RpZmllcl9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoIShmbGFncyAmIFNVU1BfU0hfUlNUQU5EQlkpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwkvKiBCQ1IgKi8KKwlfX3Jhd193cml0ZWwoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLm1tc2VsciwgMHhmZjgwMDAyMCk7IC8qIE1NU0VMUiAqLworCV9fcmF3X3dyaXRlbChzaDc3MjRfcnN0YW5kYnlfc3RhdGUuY3MwYmNyLCAweGZlYzEwMDA0KTsgLyogQ1MwQkNSICovCisJX19yYXdfd3JpdGVsKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczRiY3IsIDB4ZmVjMTAwMTApOyAvKiBDUzRCQ1IgKi8KKwlfX3Jhd193cml0ZWwoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNWFiY3IsIDB4ZmVjMTAwMTQpOyAvKiBDUzVBQkNSICovCisJX19yYXdfd3JpdGVsKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczViYmNyLCAweGZlYzEwMDE4KTsgLyogQ1M1QkJDUiAqLworCV9fcmF3X3dyaXRlbChzaDc3MjRfcnN0YW5kYnlfc3RhdGUuY3M2YWJjciwgMHhmZWMxMDAxYyk7IC8qIENTNkFCQ1IgKi8KKwlfX3Jhd193cml0ZWwoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNmJiY3IsIDB4ZmVjMTAwMjApOyAvKiBDUzZCQkNSICovCisJX19yYXdfd3JpdGVsKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczR3Y3IsIDB4ZmVjMTAwMzApOyAvKiBDUzRXQ1IgKi8KKwlfX3Jhd193cml0ZWwoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNWF3Y3IsIDB4ZmVjMTAwMzQpOyAvKiBDUzVBV0NSICovCisJX19yYXdfd3JpdGVsKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5jczVid2NyLCAweGZlYzEwMDM4KTsgLyogQ1M1QldDUiAqLworCV9fcmF3X3dyaXRlbChzaDc3MjRfcnN0YW5kYnlfc3RhdGUuY3M2YXdjciwgMHhmZWMxMDAzYyk7IC8qIENTNkFXQ1IgKi8KKwlfX3Jhd193cml0ZWwoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmNzNmJ3Y3IsIDB4ZmVjMTAwNDApOyAvKiBDUzZCV0NSICovCisKKwkvKiBJTlRDICovCisJX19yYXdfd3JpdGV3KHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJhLCAweGE0MDgwMDAwKTsgLyogSVBSQSAqLworCV9fcmF3X3dyaXRldyhzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByYiwgMHhhNDA4MDAwNCk7IC8qIElQUkIgKi8KKwlfX3Jhd193cml0ZXcoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmMsIDB4YTQwODAwMDgpOyAvKiBJUFJDICovCisJX19yYXdfd3JpdGV3KHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJkLCAweGE0MDgwMDBjKTsgLyogSVBSRCAqLworCV9fcmF3X3dyaXRldyhzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByZSwgMHhhNDA4MDAxMCk7IC8qIElQUkUgKi8KKwlfX3Jhd193cml0ZXcoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmYsIDB4YTQwODAwMTQpOyAvKiBJUFJGICovCisJX19yYXdfd3JpdGV3KHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJnLCAweGE0MDgwMDE4KTsgLyogSVBSRyAqLworCV9fcmF3X3dyaXRldyhzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByaCwgMHhhNDA4MDAxYyk7IC8qIElQUkggKi8KKwlfX3Jhd193cml0ZXcoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmksIDB4YTQwODAwMjApOyAvKiBJUFJJICovCisJX19yYXdfd3JpdGV3KHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pcHJqLCAweGE0MDgwMDI0KTsgLyogSVBSSiAqLworCV9fcmF3X3dyaXRldyhzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXByaywgMHhhNDA4MDAyOCk7IC8qIElQUksgKi8KKwlfX3Jhd193cml0ZXcoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmlwcmwsIDB4YTQwODAwMmMpOyAvKiBJUFJMICovCisJX19yYXdfd3JpdGViKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXIwLCAweGE0MDgwMDgwKTsgLyogSU1SMCAqLworCV9fcmF3X3dyaXRlYihzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMSwgMHhhNDA4MDA4NCk7IC8qIElNUjEgKi8KKwlfX3Jhd193cml0ZWIoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmltcjIsIDB4YTQwODAwODgpOyAvKiBJTVIyICovCisJX19yYXdfd3JpdGViKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXIzLCAweGE0MDgwMDhjKTsgLyogSU1SMyAqLworCV9fcmF3X3dyaXRlYihzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yNCwgMHhhNDA4MDA5MCk7IC8qIElNUjQgKi8KKwlfX3Jhd193cml0ZWIoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmltcjUsIDB4YTQwODAwOTQpOyAvKiBJTVI1ICovCisJX19yYXdfd3JpdGViKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXI2LCAweGE0MDgwMDk4KTsgLyogSU1SNiAqLworCV9fcmF3X3dyaXRlYihzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yNywgMHhhNDA4MDA5Yyk7IC8qIElNUjcgKi8KKwlfX3Jhd193cml0ZWIoc2g3NzI0X3JzdGFuZGJ5X3N0YXRlLmltcjgsIDB4YTQwODAwYTApOyAvKiBJTVI4ICovCisJX19yYXdfd3JpdGViKHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5pbXI5LCAweGE0MDgwMGE0KTsgLyogSU1SOSAqLworCV9fcmF3X3dyaXRlYihzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMTAsIDB4YTQwODAwYTgpOyAvKiBJTVIxMCAqLworCV9fcmF3X3dyaXRlYihzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMTEsIDB4YTQwODAwYWMpOyAvKiBJTVIxMSAqLworCV9fcmF3X3dyaXRlYihzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaW1yMTIsIDB4YTQwODAwYjApOyAvKiBJTVIxMiAqLworCisJLyogUldEVCAqLworCV9fcmF3X3dyaXRldyhzaDc3MjRfcnN0YW5kYnlfc3RhdGUucnd0Y250LCAweGE0NTIwMDAwKTsgLyogUldUQ05UICovCisJX19yYXdfd3JpdGV3KHNoNzcyNF9yc3RhbmRieV9zdGF0ZS5yd3Rjc3IsIDB4YTQ1MjAwMDQpOyAvKiBSV1RDU1IgKi8KKworCS8qIENQRyAqLworCV9fcmF3X3dyaXRlbChzaDc3MjRfcnN0YW5kYnlfc3RhdGUuaXJkYWNsaywgMHhhNDE1MDAxOCk7IC8qIElSREFDTEtDUiAqLworCV9fcmF3X3dyaXRlbChzaDc3MjRfcnN0YW5kYnlfc3RhdGUuc3B1Y2xrLCAweGE0MTUwMDNjKTsgLyogU1BVQ0xLQ1IgKi8KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzaDc3MjRfcHJlX3NsZWVwX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gc2g3NzI0X3ByZV9zbGVlcF9ub3RpZmllcl9jYWxsLAorCS5wcmlvcml0eSA9IFNIX01PQklMRV9QUkUoU0hfTU9CSUxFX1NMRUVQX0NQVSksCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNoNzcyNF9wb3N0X3NsZWVwX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gc2g3NzI0X3Bvc3Rfc2xlZXBfbm90aWZpZXJfY2FsbCwKKwkucHJpb3JpdHkgPSBTSF9NT0JJTEVfUE9TVChTSF9NT0JJTEVfU0xFRVBfQ1BVKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoNzcyNF9zbGVlcF9zZXR1cCh2b2lkKQoreworCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3Rlcigmc2hfbW9iaWxlX3ByZV9zbGVlcF9ub3RpZmllcl9saXN0LAorCQkJCSAgICAgICAmc2g3NzI0X3ByZV9zbGVlcF9ub3RpZmllcik7CisKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnNoX21vYmlsZV9wb3N0X3NsZWVwX25vdGlmaWVyX2xpc3QsCisJCQkJICAgICAgICZzaDc3MjRfcG9zdF9zbGVlcF9ub3RpZmllcik7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHNoNzcyNF9zbGVlcF9zZXR1cCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYwppbmRleCBlODQ4NDQzLi5jN2JhOTE2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaHgzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jCkBAIC0xNSw2ICsxNSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL21tem9uZS5oPgogCisvKgorICogVGhpcyBpbnRlbnRpb25hbGx5IG9ubHkgcmVnaXN0ZXJzIFNDSUYgcG9ydHMgMCwgMSwgYW5kIDMuIFNDSUYgMgorICogSU5URVZUIHZhbHVlcyBvdmVybGFwIHdpdGggdGhlIEZQVSBFWFBFVlQgb25lcywgcmVxdWlyaW5nIHNwZWNpYWwKKyAqIGRlbXV4aW5nIGluIHRoZSBleGNlcHRpb24gZGlzcGF0Y2ggcGF0aC4KKyAqCisgKiBBcyB0aGlzIG92ZXJsYXAgaXMgc29tZXRoaW5nIHRoYXQgbmV2ZXIgc2hvdWxkIGhhdmUgbWFkZSBpdCBpbiB0bworICogc2lsaWNvbiBpbiB0aGUgZmlyc3QgcGxhY2UsIHdlIGp1c3QgcmVmdXNlIHRvIGRlYWwgd2l0aCB0aGUgcG9ydCBhdAorICogYWxsIHJhdGhlciB0aGFuIGFkZGluZyBpbmZyYXN0cnVjdHVyZSB0byBoYWNrIGFyb3VuZCBpdC4KKyAqLwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZjMzAwMDAsCkBAIC0yNywxMSArMzYsNiBAQAogCQkudHlwZQkJPSBQT1JUX1NDSUYsCiAJCS5pcnFzCQk9IHsgNDQsIDQ1LCA0NywgNDYgfSwKIAl9LCB7Ci0JCS5tYXBiYXNlCT0gMHhmZmM1MDAwMCwKLQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IHsgNDgsIDQ5LCA1MSwgNTAgfSwKLQl9LCB7CiAJCS5tYXBiYXNlCT0gMHhmZmM2MDAwMCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkudHlwZQkJPSBQT1JUX1NDSUYsCkBAIC0yNjgsNyArMjcyLDExIEBACiAJVU5VU0VEID0gMCwKIAogCS8qIGludGVycnVwdCBzb3VyY2VzICovCi0JSVJMLCBJUlEwLCBJUlExLCBJUlEyLCBJUlEzLAorCUlSTF9MTExMLCBJUkxfTExMSCwgSVJMX0xMSEwsIElSTF9MTEhILAorCUlSTF9MSExMLCBJUkxfTEhMSCwgSVJMX0xISEwsIElSTF9MSEhILAorCUlSTF9ITExMLCBJUkxfSExMSCwgSVJMX0hMSEwsIElSTF9ITEhILAorCUlSTF9ISExMLCBJUkxfSEhMSCwgSVJMX0hISEwsCisJSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywKIAlIVURJSSwKIAlUTVUwLCBUTVUxLCBUTVUyLCBUTVUzLCBUTVU0LCBUTVU1LAogCVBDSUkwLCBQQ0lJMSwgUENJSTIsIFBDSUkzLCBQQ0lJNCwKQEAgLTI5MSw3ICsyOTksNyBAQAogCUlOVElDSTQsIElOVElDSTUsIElOVElDSTYsIElOVElDSTcsCiAKIAkvKiBpbnRlcnJ1cHQgZ3JvdXBzICovCi0JUENJSTU2Nzg5LCBTQ0lGMCwgU0NJRjEsIFNDSUYyLCBTQ0lGMywKKwlJUkwsIFBDSUk1Njc4OSwgU0NJRjAsIFNDSUYxLCBTQ0lGMiwgU0NJRjMsCiAJRE1BQzAsIERNQUMxLAogfTsKIApAQCAtMzA5LDggKzMxNyw2IEBACiAJSU5UQ19WRUNUKFNDSUYwX0JSSSwgMHg3NDApLCBJTlRDX1ZFQ1QoU0NJRjBfVFhJLCAweDc2MCksCiAJSU5UQ19WRUNUKFNDSUYxX0VSSSwgMHg3ODApLCBJTlRDX1ZFQ1QoU0NJRjFfUlhJLCAweDdhMCksCiAJSU5UQ19WRUNUKFNDSUYxX0JSSSwgMHg3YzApLCBJTlRDX1ZFQ1QoU0NJRjFfVFhJLCAweDdlMCksCi0JSU5UQ19WRUNUKFNDSUYyX0VSSSwgMHg4MDApLCBJTlRDX1ZFQ1QoU0NJRjJfUlhJLCAweDgyMCksCi0JSU5UQ19WRUNUKFNDSUYyX0JSSSwgMHg4NDApLCBJTlRDX1ZFQ1QoU0NJRjJfVFhJLCAweDg2MCksCiAJSU5UQ19WRUNUKFNDSUYzX0VSSSwgMHg4ODApLCBJTlRDX1ZFQ1QoU0NJRjNfUlhJLCAweDhhMCksCiAJSU5UQ19WRUNUKFNDSUYzX0JSSSwgMHg4YzApLCBJTlRDX1ZFQ1QoU0NJRjNfVFhJLCAweDhlMCksCiAJSU5UQ19WRUNUKERNQUMwX0RNSU5UMCwgMHg5MDApLCBJTlRDX1ZFQ1QoRE1BQzBfRE1JTlQxLCAweDkyMCksCkBAIC0zNDQsMTAgKzM1MCwxMyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX2dyb3VwIGdyb3Vwc1tdIF9faW5pdGRhdGEgPSB7CisJSU5UQ19HUk9VUChJUkwsIElSTF9MTExMLCBJUkxfTExMSCwgSVJMX0xMSEwsIElSTF9MTEhILAorCQkgICBJUkxfTEhMTCwgSVJMX0xITEgsIElSTF9MSEhMLCBJUkxfTEhISCwKKwkJICAgSVJMX0hMTEwsIElSTF9ITExILCBJUkxfSExITCwgSVJMX0hMSEgsCisJCSAgIElSTF9ISExMLCBJUkxfSEhMSCwgSVJMX0hISEwpLAogCUlOVENfR1JPVVAoUENJSTU2Nzg5LCBQQ0lJNSwgUENJSTYsIFBDSUk3LCBQQ0lJOCwgUENJSTkpLAogCUlOVENfR1JPVVAoU0NJRjAsIFNDSUYwX0VSSSwgU0NJRjBfUlhJLCBTQ0lGMF9CUkksIFNDSUYwX1RYSSksCiAJSU5UQ19HUk9VUChTQ0lGMSwgU0NJRjFfRVJJLCBTQ0lGMV9SWEksIFNDSUYxX0JSSSwgU0NJRjFfVFhJKSwKLQlJTlRDX0dST1VQKFNDSUYyLCBTQ0lGMl9FUkksIFNDSUYyX1JYSSwgU0NJRjJfQlJJLCBTQ0lGMl9UWEkpLAogCUlOVENfR1JPVVAoU0NJRjMsIFNDSUYzX0VSSSwgU0NJRjNfUlhJLCBTQ0lGM19CUkksIFNDSUYzX1RYSSksCiAJSU5UQ19HUk9VUChETUFDMCwgRE1BQzBfRE1JTlQwLCBETUFDMF9ETUlOVDEsIERNQUMwX0RNSU5UMiwKIAkJICAgRE1BQzBfRE1JTlQzLCBETUFDMF9ETUlOVDQsIERNQUMwX0RNSU5UNSwgRE1BQzBfRE1BRSksCkBAIC00MTksMTQgKzQyOCwxNCBAQAogCiAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgcGlucyBpbiBJUkwgbW9kZSAqLwogc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgdmVjdG9yc19pcmxbXSBfX2luaXRkYXRhID0gewotCUlOVENfVkVDVChJUkwsIDB4MjAwKSwgSU5UQ19WRUNUKElSTCwgMHgyMjApLAotCUlOVENfVkVDVChJUkwsIDB4MjQwKSwgSU5UQ19WRUNUKElSTCwgMHgyNjApLAotCUlOVENfVkVDVChJUkwsIDB4MjgwKSwgSU5UQ19WRUNUKElSTCwgMHgyYTApLAotCUlOVENfVkVDVChJUkwsIDB4MmMwKSwgSU5UQ19WRUNUKElSTCwgMHgyZTApLAotCUlOVENfVkVDVChJUkwsIDB4MzAwKSwgSU5UQ19WRUNUKElSTCwgMHgzMjApLAotCUlOVENfVkVDVChJUkwsIDB4MzQwKSwgSU5UQ19WRUNUKElSTCwgMHgzNjApLAotCUlOVENfVkVDVChJUkwsIDB4MzgwKSwgSU5UQ19WRUNUKElSTCwgMHgzYTApLAotCUlOVENfVkVDVChJUkwsIDB4M2MwKSwKKwlJTlRDX1ZFQ1QoSVJMX0xMTEwsIDB4MjAwKSwgSU5UQ19WRUNUKElSTF9MTExILCAweDIyMCksCisJSU5UQ19WRUNUKElSTF9MTEhMLCAweDI0MCksIElOVENfVkVDVChJUkxfTExISCwgMHgyNjApLAorCUlOVENfVkVDVChJUkxfTEhMTCwgMHgyODApLCBJTlRDX1ZFQ1QoSVJMX0xITEgsIDB4MmEwKSwKKwlJTlRDX1ZFQ1QoSVJMX0xISEwsIDB4MmMwKSwgSU5UQ19WRUNUKElSTF9MSEhILCAweDJlMCksCisJSU5UQ19WRUNUKElSTF9ITExMLCAweDMwMCksIElOVENfVkVDVChJUkxfSExMSCwgMHgzMjApLAorCUlOVENfVkVDVChJUkxfSExITCwgMHgzNDApLCBJTlRDX1ZFQ1QoSVJMX0hMSEgsIDB4MzYwKSwKKwlJTlRDX1ZFQ1QoSVJMX0hITEwsIDB4MzgwKSwgSU5UQ19WRUNUKElSTF9ISExILCAweDNhMCksCisJSU5UQ19WRUNUKElSTF9ISEhMLCAweDNjMCksCiB9OwogCiBzdGF0aWMgREVDTEFSRV9JTlRDX0RFU0MoaW50Y19kZXNjX2lybCwgInNoeDMtaXJsIiwgdmVjdG9yc19pcmwsIGdyb3VwcywKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zbXAtc2h4My5jCmluZGV4IDE4NWVjMzkuLjU4NjNlMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYwpAQCAtMTQsNiArMTQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCisjZGVmaW5lIFNUQkNSX1JFRyhwaHlzX2lkKSAoMHhmZTQwMDAwNCB8IChwaHlzX2lkIDw8IDEyKSkKKyNkZWZpbmUgUkVTRVRfUkVHKHBoeXNfaWQpICgweGZlNDAwMDA4IHwgKHBoeXNfaWQgPDwgMTIpKQorCisjZGVmaW5lIFNUQkNSX01TVFAJMHgwMDAwMDAwMQorI2RlZmluZSBTVEJDUl9SRVNFVAkweDAwMDAwMDAyCisjZGVmaW5lIFNUQkNSX0xUU0xQCTB4ODAwMDAwMDAKKwogc3RhdGljIGlycXJldHVybl90IGlwaV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCiB7CiAJdW5zaWduZWQgaW50IG1lc3NhZ2UgPSAodW5zaWduZWQgaW50KShsb25nKWFyZzsKQEAgLTIxLDkgKzI4LDkgQEAKIAl1bnNpZ25lZCBpbnQgb2ZmcyA9IDQgKiBjcHU7CiAJdW5zaWduZWQgaW50IHg7CiAKLQl4ID0gY3RybF9pbmwoMHhmZTQxMDA3MCArIG9mZnMpOyAvKiBDMElOSVRJQ0kuLkNuSU5USUNJICovCisJeCA9IF9fcmF3X3JlYWRsKDB4ZmU0MTAwNzAgKyBvZmZzKTsgLyogQzBJTklUSUNJLi5DbklOVElDSSAqLwogCXggJj0gKDEgPDwgKG1lc3NhZ2UgPDwgMikpOwotCWN0cmxfb3V0bCh4LCAweGZlNDEwMDgwICsgb2Zmcyk7IC8qIEMwSU5USUNJQ0xSLi5DbklOVElDSUNMUiAqLworCV9fcmF3X3dyaXRlbCh4LCAweGZlNDEwMDgwICsgb2Zmcyk7IC8qIEMwSU5USUNJQ0xSLi5DbklOVElDSUNMUiAqLwogCiAJc21wX21lc3NhZ2VfcmVjdihtZXNzYWdlKTsKIApAQCAtMzcsNiArNDQsOSBAQAogCiAJaW5pdF9jcHVfcG9zc2libGUoY3B1bWFza19vZihjcHUpKTsKIAorCS8qIEVuYWJsZSBsaWdodCBzbGVlcCBmb3IgdGhlIGJvb3QgQ1BVICovCisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQkNSX1JFRyhjcHUpKSB8IFNUQkNSX0xUU0xQLCBTVEJDUl9SRUcoY3B1KSk7CisKIAlfX2NwdV9udW1iZXJfbWFwWzBdID0gMDsKIAlfX2NwdV9sb2dpY2FsX21hcFswXSA9IDA7CiAKQEAgLTY2LDMyICs3NiwyMyBAQAogCQkJICAgICJJUEkiLCAodm9pZCAqKShsb25nKWkpOwogfQogCi0jZGVmaW5lIFNUQkNSX1JFRyhwaHlzX2lkKSAoMHhmZTQwMDAwNCB8IChwaHlzX2lkIDw8IDEyKSkKLSNkZWZpbmUgUkVTRVRfUkVHKHBoeXNfaWQpICgweGZlNDAwMDA4IHwgKHBoeXNfaWQgPDwgMTIpKQotCi0jZGVmaW5lIFNUQkNSX01TVFAJMHgwMDAwMDAwMQotI2RlZmluZSBTVEJDUl9SRVNFVAkweDAwMDAwMDAyCi0jZGVmaW5lIFNUQkNSX0xUU0xQCTB4ODAwMDAwMDAKLQotI2RlZmluZSBTVEJDUl9BUF9WQUwJKFNUQkNSX1JFU0VUIHwgU1RCQ1JfTFRTTFApCi0KIHZvaWQgcGxhdF9zdGFydF9jcHUodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyBlbnRyeV9wb2ludCkKIHsKLQljdHJsX291dGwoZW50cnlfcG9pbnQsIFJFU0VUX1JFRyhjcHUpKTsKKwlfX3Jhd193cml0ZWwoZW50cnlfcG9pbnQsIFJFU0VUX1JFRyhjcHUpKTsKIAotCWlmICghKGN0cmxfaW5sKFNUQkNSX1JFRyhjcHUpKSAmIFNUQkNSX01TVFApKQotCQljdHJsX291dGwoU1RCQ1JfTVNUUCwgU1RCQ1JfUkVHKGNwdSkpOworCWlmICghKF9fcmF3X3JlYWRsKFNUQkNSX1JFRyhjcHUpKSAmIFNUQkNSX01TVFApKQorCQlfX3Jhd193cml0ZWwoU1RCQ1JfTVNUUCwgU1RCQ1JfUkVHKGNwdSkpOwogCi0Jd2hpbGUgKCEoY3RybF9pbmwoU1RCQ1JfUkVHKGNwdSkpICYgU1RCQ1JfTVNUUCkpCisJd2hpbGUgKCEoX19yYXdfcmVhZGwoU1RCQ1JfUkVHKGNwdSkpICYgU1RCQ1JfTVNUUCkpCiAJCWNwdV9yZWxheCgpOwogCiAJLyogU3RhcnQgdXAgc2Vjb25kYXJ5IHByb2Nlc3NvciBieSBzZW5kaW5nIGEgcmVzZXQgKi8KLQljdHJsX291dGwoU1RCQ1JfQVBfVkFMLCBTVEJDUl9SRUcoY3B1KSk7CisJX19yYXdfd3JpdGVsKFNUQkNSX1JFU0VUIHwgU1RCQ1JfTFRTTFAsIFNUQkNSX1JFRyhjcHUpKTsKIH0KIAogaW50IHBsYXRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKQogewotCXJldHVybiBjdHJsX2lubCgweGZmMDAwMDQ4KTsgLyogQ1BJRFIgKi8KKwlyZXR1cm4gX19yYXdfcmVhZGwoMHhmZjAwMDA0OCk7IC8qIENQSURSICovCiB9CiAKIHZvaWQgcGxhdF9zZW5kX2lwaSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbWVzc2FnZSkKQEAgLTEwMCw1ICsxMDEsNSBAQAogCiAJQlVHX09OKGNwdSA+PSA0KTsKIAotCWN0cmxfb3V0bCgxIDw8IChtZXNzYWdlIDw8IDIpLCBhZGRyKTsgLyogQzBJTlRJQ0kuLkNuSU5USUNJICovCisJX19yYXdfd3JpdGVsKDEgPDwgKG1lc3NhZ2UgPDwgMiksIGFkZHIpOyAvKiBDMElOVElDSS4uQ25JTlRJQ0kgKi8KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvZW50cnkuUwppbmRleCBiMGFhY2Y2Li44ZjEzZjczIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L2VudHJ5LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNS9lbnRyeS5TCkBAIC05MzMsNyArOTMzLDcgQEAKIAogCXB0YQlyZXN0b3JlX2FsbCwgdHIxCiAKLQltb3ZpCShfVElGX1NJR1BFTkRJTkcgfCBfVElGX1JFU1RPUkVfU0lHTUFTSyksIHI4CisJbW92aQlfVElGX1NJR1BFTkRJTkcsIHI4CiAJYW5kCXI4LCByNywgcjgKIAlwdGEJd29ya19ub3RpZnlzaWcsIHRyMAogCWJuZQlyOCwgWkVSTywgdHIwCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvY3B1aWRsZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL2NwdWlkbGUuYwppbmRleCAxYzUwNGJkLi44Mzk3MmFhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvY3B1aWRsZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9jcHVpZGxlLmMKQEAgLTg3LDI1ICs4NywzMSBAQAogCiAJZGV2LT5zYWZlX3N0YXRlID0gc3RhdGU7CiAKLQlzdGF0ZSA9ICZkZXYtPnN0YXRlc1tpKytdOwotCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQzEiKTsKLQlzdHJuY3B5KHN0YXRlLT5kZXNjLCAiU3VwZXJIIFNsZWVwIE1vZGUgW1NGXSIsIENQVUlETEVfREVTQ19MRU4pOwotCXN0YXRlLT5leGl0X2xhdGVuY3kgPSAxMDA7Ci0Jc3RhdGUtPnRhcmdldF9yZXNpZGVuY3kgPSAxICogMjsKLQlzdGF0ZS0+cG93ZXJfdXNhZ2UgPSAxOwotCXN0YXRlLT5mbGFncyA9IDA7Ci0Jc3RhdGUtPmZsYWdzIHw9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwotCXN0YXRlLT5lbnRlciA9IGNwdWlkbGVfc2xlZXBfZW50ZXI7CisJaWYgKHNoX21vYmlsZV9zbGVlcF9zdXBwb3J0ZWQgJiBTVVNQX1NIX1NGKSB7CisJCXN0YXRlID0gJmRldi0+c3RhdGVzW2krK107CisJCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQzEiKTsKKwkJc3RybmNweShzdGF0ZS0+ZGVzYywgIlN1cGVySCBTbGVlcCBNb2RlIFtTRl0iLAorCQkJQ1BVSURMRV9ERVNDX0xFTik7CisJCXN0YXRlLT5leGl0X2xhdGVuY3kgPSAxMDA7CisJCXN0YXRlLT50YXJnZXRfcmVzaWRlbmN5ID0gMSAqIDI7CisJCXN0YXRlLT5wb3dlcl91c2FnZSA9IDE7CisJCXN0YXRlLT5mbGFncyA9IDA7CisJCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwkJc3RhdGUtPmVudGVyID0gY3B1aWRsZV9zbGVlcF9lbnRlcjsKKwl9CiAKLQlzdGF0ZSA9ICZkZXYtPnN0YXRlc1tpKytdOwotCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQzIiKTsKLQlzdHJuY3B5KHN0YXRlLT5kZXNjLCAiU3VwZXJIIE1vYmlsZSBTdGFuZGJ5IE1vZGUgW1NGXSIsIENQVUlETEVfREVTQ19MRU4pOwotCXN0YXRlLT5leGl0X2xhdGVuY3kgPSAyMzAwOwotCXN0YXRlLT50YXJnZXRfcmVzaWRlbmN5ID0gMSAqIDI7Ci0Jc3RhdGUtPnBvd2VyX3VzYWdlID0gMTsKLQlzdGF0ZS0+ZmxhZ3MgPSAwOwotCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKLQlzdGF0ZS0+ZW50ZXIgPSBjcHVpZGxlX3NsZWVwX2VudGVyOworCWlmIChzaF9tb2JpbGVfc2xlZXBfc3VwcG9ydGVkICYgU1VTUF9TSF9TVEFOREJZKSB7CisJCXN0YXRlID0gJmRldi0+c3RhdGVzW2krK107CisJCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQzIiKTsKKwkJc3RybmNweShzdGF0ZS0+ZGVzYywgIlN1cGVySCBNb2JpbGUgU3RhbmRieSBNb2RlIFtTRl0iLAorCQkJQ1BVSURMRV9ERVNDX0xFTik7CisJCXN0YXRlLT5leGl0X2xhdGVuY3kgPSAyMzAwOworCQlzdGF0ZS0+dGFyZ2V0X3Jlc2lkZW5jeSA9IDEgKiAyOworCQlzdGF0ZS0+cG93ZXJfdXNhZ2UgPSAxOworCQlzdGF0ZS0+ZmxhZ3MgPSAwOworCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CisJCXN0YXRlLT5lbnRlciA9IGNwdWlkbGVfc2xlZXBfZW50ZXI7CisJfQogCiAJZGV2LT5zdGF0ZV9jb3VudCA9IGk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9wbS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtLmMKaW5kZXggZWUzYzJhYS4uY2EwMjlhNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtLmMKQEAgLTE1LDYgKzE1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisvKgorICogTm90aWZpZXIgbGlzdHMgZm9yIHByZS9wb3N0IHNsZWVwIG5vdGlmaWNhdGlvbgorICovCitBVE9NSUNfTk9USUZJRVJfSEVBRChzaF9tb2JpbGVfcHJlX3NsZWVwX25vdGlmaWVyX2xpc3QpOworQVRPTUlDX05PVElGSUVSX0hFQUQoc2hfbW9iaWxlX3Bvc3Rfc2xlZXBfbm90aWZpZXJfbGlzdCk7CiAKIC8qCiAgKiBTbGVlcCBtb2RlcyBhdmFpbGFibGUgb24gU3VwZXJIIE1vYmlsZToKQEAgLTI2LDMwICszMywxMDUgQEAKICNkZWZpbmUgU1VTUF9NT0RFX1NMRUVQCQkoU1VTUF9TSF9TTEVFUCkKICNkZWZpbmUgU1VTUF9NT0RFX1NMRUVQX1NGCShTVVNQX1NIX1NMRUVQIHwgU1VTUF9TSF9TRikKICNkZWZpbmUgU1VTUF9NT0RFX1NUQU5EQllfU0YJKFNVU1BfU0hfU1RBTkRCWSB8IFNVU1BfU0hfU0YpCisjZGVmaW5lIFNVU1BfTU9ERV9SU1RBTkRCWQkoU1VTUF9TSF9SU1RBTkRCWSB8IFNVU1BfU0hfTU1VIHwgU1VTUF9TSF9TRikKKyAvKgorICAqIFUtc3RhbmRieSBtb2RlIGlzIHVuc3VwcG9ydGVkIHNpbmNlIGl0IG5lZWRzIGJvb3Rsb2FkZXIgaGFja3MKKyAgKi8KIAotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbW9kZXMgYXJlIG5vdCB0aGVyZSB5ZXQ6Ci0gKgotICogUi1zdGFuZGJ5IG1vZGUgaXMgdW5zdXBwb3J0ZWQsIGJ1dCB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUKLSAqIFUtc3RhbmRieSBtb2RlIGlzIGxvdyBwcmlvcml0eSBzaW5jZSBpdCBuZWVkcyBib290bG9hZGVyIGhhY2tzCi0gKi8KLQotI2RlZmluZSBJTFJBTV9CQVNFIDB4ZTUyMDAwMDAKLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2hfbW9iaWxlX3N0YW5kYnlbXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgc2hfbW9iaWxlX3N0YW5kYnlfc2l6ZTsKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0CisjZGVmaW5lIFJBTV9CQVNFIDB4ZmQ4MDAwMDAgLyogUlNNRU0gKi8KKyNlbHNlCisjZGVmaW5lIFJBTV9CQVNFIDB4ZTUyMDAwMDAgLyogSUxSQU0gKi8KKyNlbmRpZgogCiB2b2lkIHNoX21vYmlsZV9jYWxsX3N0YW5kYnkodW5zaWduZWQgbG9uZyBtb2RlKQogewotCXZvaWQgKm9uY2hpcF9tZW0gPSAodm9pZCAqKUlMUkFNX0JBU0U7Ci0Jdm9pZCAoKnN0YW5kYnlfb25jaGlwX21lbSkodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykgPSBvbmNoaXBfbWVtOworCXZvaWQgKm9uY2hpcF9tZW0gPSAodm9pZCAqKVJBTV9CQVNFOworCXN0cnVjdCBzaF9zbGVlcF9kYXRhICpzZHAgPSBvbmNoaXBfbWVtOworCXZvaWQgKCpzdGFuZGJ5X29uY2hpcF9tZW0pKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworCisJLyogY29kZSBsb2NhdGVkIGRpcmVjdGx5IGFmdGVyIGRhdGEgc3RydWN0dXJlICovCisJc3RhbmRieV9vbmNoaXBfbWVtID0gKHZvaWQgKikoc2RwICsgMSk7CisKKwlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmc2hfbW9iaWxlX3ByZV9zbGVlcF9ub3RpZmllcl9saXN0LAorCQkJCSAgIG1vZGUsIE5VTEwpOworCisJLyogZmx1c2ggdGhlIGNhY2hlcyBpZiBNTVUgZmxhZyBpcyBzZXQgKi8KKwlpZiAobW9kZSAmIFNVU1BfU0hfTU1VKQorCQlmbHVzaF9jYWNoZV9hbGwoKTsKIAogCS8qIExldCBhc3NlbWJseSBzbmlwcGV0IGluIG9uLWNoaXAgbWVtb3J5IGhhbmRsZSB0aGUgcmVzdCAqLwotCXN0YW5kYnlfb25jaGlwX21lbShtb2RlLCBJTFJBTV9CQVNFKTsKKwlzdGFuZGJ5X29uY2hpcF9tZW0obW9kZSwgUkFNX0JBU0UpOworCisJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJnNoX21vYmlsZV9wb3N0X3NsZWVwX25vdGlmaWVyX2xpc3QsCisJCQkJICAgbW9kZSwgTlVMTCk7Cit9CisKK2V4dGVybiBjaGFyIHNoX21vYmlsZV9zbGVlcF9lbnRlcl9zdGFydDsKK2V4dGVybiBjaGFyIHNoX21vYmlsZV9zbGVlcF9lbnRlcl9lbmQ7CisKK2V4dGVybiBjaGFyIHNoX21vYmlsZV9zbGVlcF9yZXN1bWVfc3RhcnQ7CitleHRlcm4gY2hhciBzaF9tb2JpbGVfc2xlZXBfcmVzdW1lX2VuZDsKKwordW5zaWduZWQgbG9uZyBzaF9tb2JpbGVfc2xlZXBfc3VwcG9ydGVkID0gU1VTUF9TSF9TTEVFUDsKKwordm9pZCBzaF9tb2JpbGVfcmVnaXN0ZXJfc2VsZl9yZWZyZXNoKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJICAgICB2b2lkICpwcmVfc3RhcnQsIHZvaWQgKnByZV9lbmQsCisJCQkJICAgICB2b2lkICpwb3N0X3N0YXJ0LCB2b2lkICpwb3N0X2VuZCkKK3sKKwl2b2lkICpvbmNoaXBfbWVtID0gKHZvaWQgKilSQU1fQkFTRTsKKwl2b2lkICp2cDsKKwlzdHJ1Y3Qgc2hfc2xlZXBfZGF0YSAqc2RwOworCWludCBuOworCisJLyogcGFydCAwOiBkYXRhIGFyZWEgKi8KKwlzZHAgPSBvbmNoaXBfbWVtOworCXNkcC0+YWRkci5zdGJjciA9IDB4YTQxNTAwMjA7IC8qIFNUQkNSICovCisJc2RwLT5hZGRyLmJhciA9IDB4YTQxNTAwNDA7IC8qIEJBUiAqLworCXNkcC0+YWRkci5wdGVoID0gMHhmZjAwMDAwMDsgLyogUFRFSCAqLworCXNkcC0+YWRkci5wdGVsID0gMHhmZjAwMDAwNDsgLyogUFRFTCAqLworCXNkcC0+YWRkci50dGIgPSAweGZmMDAwMDA4OyAvKiBUVEIgKi8KKwlzZHAtPmFkZHIudGVhID0gMHhmZjAwMDAwYzsgLyogVEVBICovCisJc2RwLT5hZGRyLm1tdWNyID0gMHhmZjAwMDAxMDsgLyogTU1VQ1IgKi8KKwlzZHAtPmFkZHIucHRlYSA9IDB4ZmYwMDAwMzQ7IC8qIFBURUEgKi8KKwlzZHAtPmFkZHIucGFzY3IgPSAweGZmMDAwMDcwOyAvKiBQQVNDUiAqLworCXNkcC0+YWRkci5pcm1jciA9IDB4ZmYwMDAwNzg7IC8qIElSTUNSICovCisJc2RwLT5hZGRyLmNjciA9IDB4ZmYwMDAwMWM7IC8qIENDUiAqLworCXNkcC0+YWRkci5yYW1jciA9IDB4ZmYwMDAwNzQ7IC8qIFJBTUNSICovCisJdnAgPSBzZHAgKyAxOworCisJLyogcGFydCAxOiBjb21tb24gY29kZSB0byBlbnRlciBzbGVlcCBtb2RlICovCisJbiA9ICZzaF9tb2JpbGVfc2xlZXBfZW50ZXJfZW5kIC0gJnNoX21vYmlsZV9zbGVlcF9lbnRlcl9zdGFydDsKKwltZW1jcHkodnAsICZzaF9tb2JpbGVfc2xlZXBfZW50ZXJfc3RhcnQsIG4pOworCXZwICs9IHJvdW5kdXAobiwgNCk7CisKKwkvKiBwYXJ0IDI6IGJvYXJkIHNwZWNpZmljIGNvZGUgdG8gZW50ZXIgc2VsZi1yZWZyZXNoIG1vZGUgKi8KKwluID0gcHJlX2VuZCAtIHByZV9zdGFydDsKKwltZW1jcHkodnAsIHByZV9zdGFydCwgbik7CisJc2RwLT5zZl9wcmUgPSAodW5zaWduZWQgbG9uZyl2cDsKKwl2cCArPSByb3VuZHVwKG4sIDQpOworCisJLyogcGFydCAzOiBib2FyZCBzcGVjaWZpYyBjb2RlIHRvIHJlc3VtZSBmcm9tIHNlbGYtcmVmcmVzaCBtb2RlICovCisJbiA9IHBvc3RfZW5kIC0gcG9zdF9zdGFydDsKKwltZW1jcHkodnAsIHBvc3Rfc3RhcnQsIG4pOworCXNkcC0+c2ZfcG9zdCA9ICh1bnNpZ25lZCBsb25nKXZwOworCXZwICs9IHJvdW5kdXAobiwgNCk7CisKKwkvKiBwYXJ0IDQ6IGNvbW1vbiBjb2RlIHRvIHJlc3VtZSBmcm9tIHNsZWVwIG1vZGUgKi8KKwlXQVJOX09OKHZwID4gKG9uY2hpcF9tZW0gKyAweDYwMCkpOworCXZwID0gb25jaGlwX21lbSArIDB4NjAwOyAvKiBsb2NhdGVkIGF0IGludGVycnVwdCB2ZWN0b3IgKi8KKwluID0gJnNoX21vYmlsZV9zbGVlcF9yZXN1bWVfZW5kIC0gJnNoX21vYmlsZV9zbGVlcF9yZXN1bWVfc3RhcnQ7CisJbWVtY3B5KHZwLCAmc2hfbW9iaWxlX3NsZWVwX3Jlc3VtZV9zdGFydCwgbik7CisJc2RwLT5yZXN1bWUgPSAodW5zaWduZWQgbG9uZyl2cDsKKworCXNoX21vYmlsZV9zbGVlcF9zdXBwb3J0ZWQgfD0gZmxhZ3M7CiB9CiAKIHN0YXRpYyBpbnQgc2hfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogeworCWlmICghKHNoX21vYmlsZV9zbGVlcF9zdXBwb3J0ZWQgJiBTVVNQX01PREVfU1RBTkRCWV9TRikpCisJCXJldHVybiAtRU5YSU87CisKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXNldF9ibF9iaXQoKTsKIAlzaF9tb2JpbGVfY2FsbF9zdGFuZGJ5KFNVU1BfTU9ERV9TVEFOREJZX1NGKTsKQEAgLTY1LDEzICsxNDcsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzaF9wbV9pbml0KHZvaWQpCiB7Ci0Jdm9pZCAqb25jaGlwX21lbSA9ICh2b2lkICopSUxSQU1fQkFTRTsKLQotCS8qIENvcHkgdGhlIGFzc2VtYmx5IHNuaXBwZXQgdG8gdGhlIG90aGVyd2lzZSB1bnVuc2VkIElMUkFNICovCi0JbWVtY3B5KG9uY2hpcF9tZW0sIHNoX21vYmlsZV9zdGFuZGJ5LCBzaF9tb2JpbGVfc3RhbmRieV9zaXplKTsKLQl3bWIoKTsKLQljdHJsX2JhcnJpZXIoKTsKLQogCXN1c3BlbmRfc2V0X29wcygmc2hfcG1fb3BzKTsKIAlzaF9tb2JpbGVfc2V0dXBfY3B1aWRsZSgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtX3J1bnRpbWUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9wbV9ydW50aW1lLmMKaW5kZXggN2M2MTViMS4uNmRjYjgxNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtX3J1bnRpbWUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvcG1fcnVudGltZS5jCkBAIC00NSwxMiArNDUsMTQgQEAKIAogCWRldl9kYmcoZCwgIl9fcGxhdGZvcm1fcG1fcnVudGltZV9yZXN1bWUoKSBbJWRdXG4iLCBod2Jsayk7CiAKLQlpZiAoZC0+ZHJpdmVyICYmIGQtPmRyaXZlci0+cG0gJiYgZC0+ZHJpdmVyLT5wbS0+cnVudGltZV9yZXN1bWUpIHsKKwlpZiAoZC0+ZHJpdmVyKSB7CiAJCWh3YmxrX2VuYWJsZShod2Jsa19pbmZvLCBod2Jsayk7CiAJCXJldCA9IDA7CiAKIAkJaWYgKHRlc3RfYml0KFBERVZfQVJDSERBVEFfRkxBR19TVVNQLCAmYWQtPmZsYWdzKSkgewotCQkJcmV0ID0gZC0+ZHJpdmVyLT5wbS0+cnVudGltZV9yZXN1bWUoZCk7CisJCQlpZiAoZC0+ZHJpdmVyLT5wbSAmJiBkLT5kcml2ZXItPnBtLT5ydW50aW1lX3Jlc3VtZSkKKwkJCQlyZXQgPSBkLT5kcml2ZXItPnBtLT5ydW50aW1lX3Jlc3VtZShkKTsKKwogCQkJaWYgKCFyZXQpCiAJCQkJY2xlYXJfYml0KFBERVZfQVJDSERBVEFfRkxBR19TVVNQLCAmYWQtPmZsYWdzKTsKIAkJCWVsc2UKQEAgLTczLDEyICs3NSwxNSBAQAogCiAJZGV2X2RiZyhkLCAiX19wbGF0Zm9ybV9wbV9ydW50aW1lX3N1c3BlbmQoKSBbJWRdXG4iLCBod2Jsayk7CiAKLQlpZiAoZC0+ZHJpdmVyICYmIGQtPmRyaXZlci0+cG0gJiYgZC0+ZHJpdmVyLT5wbS0+cnVudGltZV9zdXNwZW5kKSB7CisJaWYgKGQtPmRyaXZlcikgewogCQlCVUdfT04oIXRlc3RfYml0KFBERVZfQVJDSERBVEFfRkxBR19JRExFLCAmYWQtPmZsYWdzKSk7CisJCXJldCA9IDA7CiAKLQkJaHdibGtfZW5hYmxlKGh3YmxrX2luZm8sIGh3YmxrKTsKLQkJcmV0ID0gZC0+ZHJpdmVyLT5wbS0+cnVudGltZV9zdXNwZW5kKGQpOwotCQlod2Jsa19kaXNhYmxlKGh3YmxrX2luZm8sIGh3YmxrKTsKKwkJaWYgKGQtPmRyaXZlci0+cG0gJiYgZC0+ZHJpdmVyLT5wbS0+cnVudGltZV9zdXNwZW5kKSB7CisJCQlod2Jsa19lbmFibGUoaHdibGtfaW5mbywgaHdibGspOworCQkJcmV0ID0gZC0+ZHJpdmVyLT5wbS0+cnVudGltZV9zdXNwZW5kKGQpOworCQkJaHdibGtfZGlzYWJsZShod2Jsa19pbmZvLCBod2Jsayk7CisJCX0KIAogCQlpZiAoIXJldCkgewogCQkJc2V0X2JpdChQREVWX0FSQ0hEQVRBX0ZMQUdfU1VTUCwgJmFkLT5mbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvc2xlZXAuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9zbGVlcC5TCmluZGV4IGE0MzllNmMuLmU5ZGQ3ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9zbGVlcC5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9zbGVlcC5TCkBAIC0yMCw3OSArMjAsMTAzIEBACiAgKiBLZXJuZWwgbW9kZSByZWdpc3RlciB1c2FnZSwgc2VlIGVudHJ5LlM6CiAgKglrMAlzY3JhdGNoCiAgKglrMQlzY3JhdGNoCi0gKglrNAlzY3JhdGNoCiAgKi8KICNkZWZpbmUgazAJcjAKICNkZWZpbmUgazEJcjEKLSNkZWZpbmUgazQJcjQKIAotLyogbWFuYWdlIHNlbGYtcmVmcmVzaCBhbmQgZW50ZXIgc3RhbmRieSBtb2RlLgorLyogbWFuYWdlIHNlbGYtcmVmcmVzaCBhbmQgZW50ZXIgc3RhbmRieSBtb2RlLiBtdXN0IGJlIHNlbGYtY29udGFpbmVkLgogICogdGhpcyBjb2RlIHdpbGwgYmUgY29waWVkIHRvIG9uLWNoaXAgbWVtb3J5IGFuZCBleGVjdXRlZCBmcm9tIHRoZXJlLgogICovCisJLmJhbGlnbiA0CitFTlRSWShzaF9tb2JpbGVfc2xlZXBfZW50ZXJfc3RhcnQpCiAKLQkuYmFsaWduIAk0MDk2LDAsNDA5NgotRU5UUlkoc2hfbW9iaWxlX3N0YW5kYnkpCisJLyogc2F2ZSBtb2RlIGZsYWdzICovCisJbW92LmwJcjQsIEAoU0hfU0xFRVBfTU9ERSwgcjUpCiAKIAkvKiBzYXZlIG9yaWdpbmFsIHZiciAqLwotCXN0Ywl2YnIsIHIxCi0JbW92YQlzYXZlZF92YnIsIHIwCi0JbW92LmwJcjEsIEByMAorCXN0Ywl2YnIsIHIwCisJbW92LmwJcjAsIEAoU0hfU0xFRVBfVkJSLCByNSkKIAogCS8qIHBvaW50IHZiciB0byBvdXIgb24tY2hpcCBtZW1vcnkgcGFnZSAqLwogCWxkYwlyNSwgdmJyCiAKIAkvKiBzYXZlIHJldHVybiBhZGRyZXNzICovCi0JbW92YQlzYXZlZF9zcGMsIHIwCi0Jc3RzCXByLCByNQotCW1vdi5sCXI1LCBAcjAKKwlzdHMJcHIsIHIwCisJbW92LmwJcjAsIEAoU0hfU0xFRVBfU1BDLCByNSkKIAogCS8qIHNhdmUgc3IgKi8KLQltb3ZhCXNhdmVkX3NyLCByMAotCXN0YwlzciwgcjUKLQltb3YubAlyNSwgQHIwCisJc3RjCXNyLCByMAorCW1vdi5sCXIwLCBAKFNIX1NMRUVQX1NSLCByNSkKIAotCS8qIHNhdmUgbW9kZSBmbGFncyAqLwotCW1vdmEJc2F2ZWRfbW9kZSwgcjAKLQltb3YubAlyNCwgQHIwCisJLyogc2F2ZSBzcCAqLworCW1vdi5sCXIxNSwgQChTSF9TTEVFUF9TUCwgcjUpCiAKLQkvKiBwdXQgbW9kZSBmbGFncyBpbiByMCAqLwotCW1vdglyNCwgcjAKKwkvKiBzYXZlIHN0YmNyICovCisJYnNyICAgICBzYXZlX3JlZ2lzdGVyCisJIG1vdiAgICAjU0hfU0xFRVBfUkVHX1NUQkNSLCByMAogCisJLyogc2F2ZSBtbXUgYW5kIGNhY2hlIGNvbnRleHQgaWYgbmVlZGVkICovCisJbW92LmwJQChTSF9TTEVFUF9NT0RFLCByNSksIHIwCisJdHN0CSNTVVNQX1NIX01NVSwgcjAKKwlidAlza2lwX21tdV9zYXZlX2Rpc2FibGUKKworICAgICAgIC8qIHNhdmUgbW11IHN0YXRlICovCisJYnNyCXNhdmVfcmVnaXN0ZXIKKwkgbW92CSNTSF9TTEVFUF9SRUdfUFRFSCwgcjAKKworCWJzcglzYXZlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX1BURUwsIHIwCisKKwlic3IJc2F2ZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19UVEIsIHIwCisKKwlic3IJc2F2ZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19URUEsIHIwCisKKwlic3IJc2F2ZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19NTVVDUiwgcjAKKworCWJzcglzYXZlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX1BURUEsIHIwCisKKwlic3IJc2F2ZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19QQVNDUiwgcjAKKworCWJzcglzYXZlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX0lSTUNSLCByMAorCisJLyogaW52YWxpZGF0ZSBUTEJzIGFuZCBkaXNhYmxlIHRoZSBNTVUgKi8KKwlic3IJZ2V0X3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX01NVUNSLCByMAorCW1vdgkjNCwgcjEKKwltb3YubAlyMSwgQHIwCisJaWNiaQlAcjAKKworCS8qIHNhdmUgY2FjaGUgcmVnaXN0ZXJzIGFuZCBkaXNhYmxlIGNhY2hlcyAqLworCWJzcglzYXZlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX0NDUiwgcjAKKworCWJzcglzYXZlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX1JBTUNSLCByMAorCisJYnNyCWdldF9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19DQ1IsIHIwCisJbW92CSMwLCByMQorCW1vdi5sCXIxLCBAcjAKKwlpY2JpCUByMAorCitza2lwX21tdV9zYXZlX2Rpc2FibGU6CisJLyogY2FsbCBzZWxmLXJlZnJlc2ggZW50ZXJpbmcgY29kZSBpZiBuZWVkZWQgKi8KKwltb3YubAlAKFNIX1NMRUVQX01PREUsIHI1KSwgcjAKIAl0c3QJI1NVU1BfU0hfU0YsIHIwCiAJYnQJc2tpcF9zZXRfc2YKLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0Ci0JLyogREJTQzogcHV0IG1lbW9yeSBpbiBzZWxmLXJlZnJlc2ggbW9kZSAqLwotCW1vdi5sCWRiZW5fcmVnLCByNAotCW1vdi5sCWRiZW5fZGF0YTAsIHIxCi0JbW92LmwJcjEsIEByNAogCi0JbW92LmwJZGJyZnBkbjBfcmVnLCByNAotCW1vdi5sCWRicmZwZG4wX2RhdGEwLCByMQotCW1vdi5sCXIxLCBAcjQKLQotCW1vdi5sCWRiY21kY250X3JlZywgcjQKLQltb3YubAlkYmNtZGNudF9kYXRhMCwgcjEKLQltb3YubAlyMSwgQHI0Ci0KLQltb3YubAlkYmNtZGNudF9yZWcsIHI0Ci0JbW92LmwJZGJjbWRjbnRfZGF0YTEsIHIxCi0JbW92LmwJcjEsIEByNAotCi0JbW92LmwJZGJyZnBkbjBfcmVnLCByNAotCW1vdi5sCWRicmZwZG4wX2RhdGExLCByMQotCW1vdi5sCXIxLCBAcjQKLSNlbHNlCi0JLyogU0JTQzogZGlzYWJsZSBwb3dlciBkb3duIGFuZCBwdXQgaW4gc2VsZi1yZWZyZXNoIG1vZGUgKi8KLQltb3YubAkxZiwgcjQKLQltb3YubAkyZiwgcjEKLQltb3YubAlAcjQsIHIyCi0Jb3IJcjEsIHIyCi0JbW92LmwgICAzZiwgcjMKLQlhbmQJcjMsIHIyCi0JbW92LmwJcjIsIEByNAotI2VuZGlmCisJbW92LmwJQChTSF9TTEVFUF9TRl9QUkUsIHI1KSwgcjAKKwlqc3IJQHIwCisJIG5vcAogCiBza2lwX3NldF9zZjoKKwltb3YubAlAKFNIX1NMRUVQX01PREUsIHI1KSwgcjAKIAl0c3QJI1NVU1BfU0hfU1RBTkRCWSwgcjAKIAlidAl0ZXN0X3JzdGFuZGJ5CiAKQEAgLTEwNCw2ICsxMjgsMTIgQEAKIAl0c3QJI1NVU1BfU0hfUlNUQU5EQlksIHIwCiAJYnQJdGVzdF91c3RhbmRieQogCisJLyogc2V0dXAgQkFSIHJlZ2lzdGVyICovCisJYnNyCWdldF9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19CQVIsIHIwCisJbW92LmwJQChTSF9TTEVFUF9SRVNVTUUsIHI1KSwgcjEKKwltb3YubAlyMSwgQHIwCisKIAkvKiBzZXQgbW9kZSB0byAici1zdGFuZGJ5IG1vZGUiICovCiAJYnJhCWRvX3NsZWVwCiAJIG1vdgkjMHgyMCwgcjEKQEAgLTEyMywxMjQgKzE1MywxMzYgQEAKIAogZG9fc2xlZXA6CiAJLyogc2V0dXAgYW5kIGVudGVyIHNlbGVjdGVkIHN0YW5kYnkgbW9kZSAqLwotCW1vdi5sCTVmLCByNAotCW1vdi5sCXIxLCBAcjQKKwlic3IgICAgIGdldF9yZWdpc3RlcgorCSBtb3YgICAgI1NIX1NMRUVQX1JFR19TVEJDUiwgcjAKKwltb3YubAlyMSwgQHIwCiBhZ2FpbjoKIAlzbGVlcAogCWJyYQlhZ2FpbgogCSBub3AKIAotcmVzdG9yZV9qdW1wX3ZicjoKK3NhdmVfcmVnaXN0ZXI6CisJYWRkCSNTSF9TTEVFUF9CQVNFX0FERFIsIHIwCisJbW92LmwJQChyMCwgcjUpLCByMQorCWFkZAkjLVNIX1NMRUVQX0JBU0VfQUREUiwgcjAKKwltb3YubAlAcjEsIHIxCisJYWRkCSNTSF9TTEVFUF9CQVNFX0RBVEEsIHIwCisJbW92LmwJcjEsIEAocjAsIHI1KQorCWFkZAkjLVNIX1NMRUVQX0JBU0VfREFUQSwgcjAKKwlydHMKKwkgbm9wCisKK2dldF9yZWdpc3RlcjoKKwlhZGQJI1NIX1NMRUVQX0JBU0VfQUREUiwgcjAKKwltb3YubAlAKHIwLCByNSksIHIwCisJcnRzCisJIG5vcAorRU5UUlkoc2hfbW9iaWxlX3NsZWVwX2VudGVyX2VuZCkKKworCS5iYWxpZ24gNAorRU5UUlkoc2hfbW9iaWxlX3NsZWVwX3Jlc3VtZV9zdGFydCkKKworCS8qIGZpZ3VyZSBvdXQgc3RhcnQgYWRkcmVzcyAqLworCWJzcgkwZgorCSBub3AKKzA6CisJc3RzCXByLCBrMQorCW1vdi5sCTFmLCBrMAorCWFuZAlrMCwgazEKKworCS8qIHN0b3JlIHBvaW50ZXIgdG8gZGF0YSBhcmVhIGluIFZCUiAqLworCWxkYwlrMSwgdmJyCisKKwkvKiBzZXR1cCBzciB3aXRoIHNhdmVkIHNyICovCisJbW92LmwJQChTSF9TTEVFUF9TUiwgazEpLCBrMAorCWxkYwlrMCwgc3IKKworCS8qIG5vdzogdXNlciByZWdpc3RlciBzZXQhICovCisJc3RjCXZiciwgcjUKKwogCS8qIHNldHVwIHNwYyB3aXRoIHJldHVybiBhZGRyZXNzIHRvIGMgY29kZSAqLwotCW1vdi5sCXNhdmVkX3NwYywgazAKLQlsZGMJazAsIHNwYworCW1vdi5sCUAoU0hfU0xFRVBfU1BDLCByNSksIHIwCisJbGRjCXIwLCBzcGMKIAogCS8qIHJlc3RvcmUgdmJyICovCi0JbW92LmwJc2F2ZWRfdmJyLCBrMAotCWxkYwlrMCwgdmJyCisJbW92LmwJQChTSF9TTEVFUF9WQlIsIHI1KSwgcjAKKwlsZGMJcjAsIHZicgogCiAJLyogc2V0dXAgc3NyIHdpdGggc2F2ZWQgc3IgKi8KLQltb3YubAlzYXZlZF9zciwgazAKLQlsZGMJazAsIHNzcgorCW1vdi5sCUAoU0hfU0xFRVBfU1IsIHI1KSwgcjAKKwlsZGMJcjAsIHNzcgogCi0JLyogZ2V0IG1vZGUgZmxhZ3MgKi8KLQltb3YubAlzYXZlZF9tb2RlLCBrMAorCS8qIHJlc3RvcmUgc3AgKi8KKwltb3YubCAgIEAoU0hfU0xFRVBfU1AsIHI1KSwgcjE1CiAKLWRvbmVfc2xlZXA6Ci0JLyogcmVzZXQgc3RhbmRieSBtb2RlIHRvIHNsZWVwIG1vZGUgKi8KLQltb3YubAk1ZiwgazQKLQltb3YJIzB4MDAsIGsxCi0JbW92LmwJazEsIEBrNAorCS8qIHJlc3RvcmUgc2xlZXAgbW9kZSByZWdpc3RlciAqLworCWJzciAgICAgcmVzdG9yZV9yZWdpc3RlcgorCSBtb3YgICAgI1NIX1NMRUVQX1JFR19TVEJDUiwgcjAKIAotCXRzdAkjU1VTUF9TSF9TRiwgazAKKwkvKiBjYWxsIHNlbGYtcmVmcmVzaCByZXN1bWUgY29kZSBpZiBuZWVkZWQgKi8KKwltb3YubAlAKFNIX1NMRUVQX01PREUsIHI1KSwgcjAKKwl0c3QJI1NVU1BfU0hfU0YsIHIwCiAJYnQJc2tpcF9yZXN0b3JlX3NmCiAKLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0Ci0JLyogREJTQzogcHV0IG1lbW9yeSBpbiBhdXRvLXJlZnJlc2ggbW9kZSAqLwotCW1vdi5sCWRicmZwZG4wX3JlZywgazQKLQltb3YubAlkYnJmcGRuMF9kYXRhMCwgazEKLQltb3YubAlrMSwgQGs0CisJbW92LmwJQChTSF9TTEVFUF9TRl9QT1NULCByNSksIHIwCisJanNyCUByMAorCSBub3AKIAotCW5vcCAvKiBzbGVlcCAxNDAgbnMgKi8KLQlub3AKLQlub3AKLQlub3AKLQotCW1vdi5sCWRiY21kY250X3JlZywgazQKLQltb3YubAlkYmNtZGNudF9kYXRhMCwgazEKLQltb3YubAlrMSwgQGs0Ci0KLQltb3YubAlkYmNtZGNudF9yZWcsIGs0Ci0JbW92LmwJZGJjbWRjbnRfZGF0YTEsIGsxCi0JbW92LmwJazEsIEBrNAotCi0JbW92LmwJZGJlbl9yZWcsIGs0Ci0JbW92LmwJZGJlbl9kYXRhMSwgazEKLQltb3YubAlrMSwgQGs0Ci0KLQltb3YubAlkYnJmcGRuMF9yZWcsIGs0Ci0JbW92LmwJZGJyZnBkbjBfZGF0YTIsIGsxCi0JbW92LmwJazEsIEBrNAotI2Vsc2UKLQkvKiBTQlNDOiBzZXQgYXV0by1yZWZyZXNoIG1vZGUgKi8KLQltb3YubAkxZiwgazQKLQltb3YubAlAazQsIGswCi0JbW92LmwgICA0ZiwgazEKLQlhbmQJazEsIGswCi0JbW92LmwJazAsIEBrNAotCW1vdi5sCTZmLCBrNAotCW1vdi5sCThmLCBrMAotCW1vdi5sCUBrNCwgazEKLQltb3YJIy0xLCBrNAotCWFkZAlrNCwgazEKLQlvcglrMSwgazAKLQltb3YubAk3ZiwgazEKLQltb3YubAlrMCwgQGsxCi0jZW5kaWYKIHNraXBfcmVzdG9yZV9zZjoKLQkvKiBqdW1wIHRvIHZiciB2ZWN0b3IgKi8KLQltb3YubAlzYXZlZF92YnIsIGswCi0JbW92LmwJb2Zmc2V0X3ZiciwgazQKLQlhZGQJazQsIGswCi0Jam1wCUBrMAorCS8qIHJlc3RvcmUgbW11IGFuZCBjYWNoZSBzdGF0ZSBpZiBuZWVkZWQgKi8KKwltb3YubAlAKFNIX1NMRUVQX01PREUsIHI1KSwgcjAKKwl0c3QJI1NVU1BfU0hfTU1VLCByMAorCWJ0CXNraXBfcmVzdG9yZV9tbXUKKworCS8qIHJlc3RvcmUgbW11IHN0YXRlICovCisJYnNyCXJlc3RvcmVfcmVnaXN0ZXIKKwkgbW92CSNTSF9TTEVFUF9SRUdfUFRFSCwgcjAKKworCWJzcglyZXN0b3JlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX1BURUwsIHIwCisKKwlic3IJcmVzdG9yZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19UVEIsIHIwCisKKwlic3IJcmVzdG9yZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19URUEsIHIwCisKKwlic3IJcmVzdG9yZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19QVEVBLCByMAorCisJYnNyCXJlc3RvcmVfcmVnaXN0ZXIKKwkgbW92CSNTSF9TTEVFUF9SRUdfUEFTQ1IsIHIwCisKKwlic3IJcmVzdG9yZV9yZWdpc3RlcgorCSBtb3YJI1NIX1NMRUVQX1JFR19JUk1DUiwgcjAKKworCWJzcglyZXN0b3JlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX01NVUNSLCByMAorCWljYmkJQHIwCisKKwkvKiByZXN0b3JlIGNhY2hlIHNldHRpbmdzICovCisJYnNyCXJlc3RvcmVfcmVnaXN0ZXIKKwkgbW92CSNTSF9TTEVFUF9SRUdfUkFNQ1IsIHIwCisJaWNiaQlAcjAKKworCWJzcglyZXN0b3JlX3JlZ2lzdGVyCisJIG1vdgkjU0hfU0xFRVBfUkVHX0NDUiwgcjAKKwlpY2JpCUByMAorCitza2lwX3Jlc3RvcmVfbW11OgorCXJ0ZQorCSBub3AKKworcmVzdG9yZV9yZWdpc3RlcjoKKwlhZGQJI1NIX1NMRUVQX0JBU0VfREFUQSwgcjAKKwltb3YubAlAKHIwLCByNSksIHIxCisJYWRkCSMtU0hfU0xFRVBfQkFTRV9EQVRBLCByMAorCWFkZAkjU0hfU0xFRVBfQkFTRV9BRERSLCByMAorCW1vdi5sCUAocjAsIHI1KSwgcjAKKwltb3YubAlyMSwgQHIwCisJcnRzCiAJIG5vcAogCiAJLmJhbGlnbiA0Ci1zYXZlZF9tb2RlOgkubG9uZwkwCi1zYXZlZF9zcGM6CS5sb25nCTAKLXNhdmVkX3NyOgkubG9uZwkwCi1zYXZlZF92YnI6CS5sb25nCTAKLW9mZnNldF92YnI6CS5sb25nCTB4NjAwCi0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNAotZGJlbl9yZWc6CS5sb25nCTB4ZmQwMDAwMTAgLyogREJFTiAqLwotZGJlbl9kYXRhMDoJLmxvbmcJMAotZGJlbl9kYXRhMToJLmxvbmcJMQotZGJyZnBkbjBfcmVnOgkubG9uZwkweGZkMDAwMDQwIC8qIERCUkZQRE4wICovCi1kYnJmcGRuMF9kYXRhMDoJLmxvbmcJMAotZGJyZnBkbjBfZGF0YTE6CS5sb25nCTEKLWRicmZwZG4wX2RhdGEyOgkubG9uZwkweDAwMDEwMDAwCi1kYmNtZGNudF9yZWc6CS5sb25nCTB4ZmQwMDAwMTQgLyogREJDTURDTlQgKi8KLWRiY21kY250X2RhdGEwOgkubG9uZwkyCi1kYmNtZGNudF9kYXRhMToJLmxvbmcJNAotI2Vsc2UKLTE6CS5sb25nCTB4ZmU0MDAwMDggLyogU0RDUjAgKi8KLTI6CS5sb25nCTB4MDAwMDA0MDAKLTM6CS5sb25nCTB4ZmZmZjdmZmYKLTQ6CS5sb25nCTB4ZmZmZmZiZmYKLSNlbmRpZgotNToJLmxvbmcJMHhhNDE1MDAyMCAvKiBTVEJDUiAqLwotNjoJLmxvbmcgICAweGZlNDAwMDFjIC8qIFJUQ09SICovCi03OgkubG9uZyAgIDB4ZmU0MDAwMTggLyogUlRDTlQgKi8KLTg6CS5sb25nICAgMHhhNTVhMDAwMAotCi0KLS8qIGludGVycnVwdCB2ZWN0b3IgQCAweDYwMCAqLwotCS5iYWxpZ24gCTB4NDAwLDAsMHg0MDAKLQkubG9uZwkweGRlYWRiZWVmCi0JLmJhbGlnbiAJMHgyMDAsMCwweDIwMAotCWJyYQlyZXN0b3JlX2p1bXBfdmJyCi0JIG5vcAotc2hfbW9iaWxlX3N0YW5kYnlfZW5kOgotCi1FTlRSWShzaF9tb2JpbGVfc3RhbmRieV9zaXplKQotCS5sb25nIHNoX21vYmlsZV9zdGFuZGJ5X2VuZCAtIHNoX21vYmlsZV9zdGFuZGJ5CisxOgkubG9uZwl+MHg3ZmYKK0VOVFJZKHNoX21vYmlsZV9zbGVlcF9yZXN1bWVfZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3ViYy5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3ViYy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTkyMzA3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS91YmMuUworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2tlcm5lbC9jcHUvdWJjLlMKLSAqCi0gKiBTZXQgb2YgbWFuYWdlbWVudCByb3V0aW5lcyBmb3IgdGhlIFVzZXIgQnJlYWsgQ29udHJvbGxlciAoVUJDKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vdWJjLmg+Ci0KLSNkZWZpbmUgU1RCQ1IyCQkweGZmYzAwMDEwCi0KLUVOVFJZKHViY19zbGVlcCkKLQltb3YJIzAsIHIwCi0KLQltb3YubAkxZiwgcjEJCSEgWmVybyBvdXQgVUJDX0JCUkEgLi4KLQltb3YudwlyMCwgQHIxCi0KLQltb3YubAkyZiwgcjEJCSEgLi4gc2FtZSBmb3IgQkJSQiAuLgotCW1vdi53CXIwLCBAcjEKLQotCW1vdi5sCTNmLCByMQkJISAuLiBhbmQgYWdhaW4gZm9yIEJSQ1IuCi0JbW92LncJcjAsIEByMQotCi0JbW92LncJQHIxLCByMAkJISBEdW1teSByZWFkIEJSQ1IKLQotCW1vdi5sCTRmLCByMQkJISBTZXQgTVNUUDUgaW4gU1RCQ1IyCi0JbW92LmIJQHIxLCByMAotCW9yCSMweDAxLCByMAotCW1vdi5iCXIwLCBAcjEKLQotCW1vdi5iCUByMSwgcjAJCSEgVHdvIGR1bW15IHJlYWRzIC4uCi0JbW92LmIJQHIxLCByMAotCi0JcnRzCi0Jbm9wCi0KLUVOVFJZKHViY193YWtldXApCi0JbW92LmwJNGYsIHIxCQkhIENsZWFyIE1TVFA1Ci0JbW92LmIJQHIxLCByMAotCWFuZAkjMHhmZSwgcjAKLQltb3YuYglyMCwgQHIxCi0KLQltb3YuYglAcjEsIHIwCQkhIFR3byBtb3JlIGR1bW15IHJlYWRzIC4uCi0JbW92LmIJQHIxLCByMAotCi0JcnRzCi0Jbm9wCi0KLTE6CS5sb25nCVVCQ19CQlJBCi0yOgkubG9uZwlVQkNfQkJSQgotMzoJLmxvbmcJVUJDX0JSQ1IKLTQ6CS5sb25nCVNUQkNSMgotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9kbWEtbm9tbXUuYyBiL2FyY2gvc2gva2VybmVsL2RtYS1ub21tdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTViODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9kbWEtbm9tbXUuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogRE1BIG1hcHBpbmcgc3VwcG9ydCBmb3IgcGxhdGZvcm1zIGxhY2tpbmcgSU9NTVVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCitzdGF0aWMgZG1hX2FkZHJfdCBub21tdV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJZG1hX2FkZHJfdCBhZGRyID0gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0OworCisJV0FSTl9PTihzaXplID09IDApOworCWRtYV9jYWNoZV9zeW5jKGRldiwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LCBzaXplLCBkaXIpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgbm9tbXVfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBpOworCisJV0FSTl9PTihuZW50cyA9PSAwIHx8IHNnWzBdLmxlbmd0aCA9PSAwKTsKKworCWZvcl9lYWNoX3NnKHNnLCBzLCBuZW50cywgaSkgeworCQlCVUdfT04oIXNnX3BhZ2UocykpOworCisJCWRtYV9jYWNoZV9zeW5jKGRldiwgc2dfdmlydChzKSwgcy0+bGVuZ3RoLCBkaXIpOworCisJCXMtPmRtYV9hZGRyZXNzID0gc2dfcGh5cyhzKTsKKwkJcy0+ZG1hX2xlbmd0aCA9IHMtPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gbmVudHM7Cit9CisKKyNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCitzdGF0aWMgdm9pZCBub21tdV9zeW5jX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX2NhY2hlX3N5bmMoZGV2LCBwaHlzX3RvX3ZpcnQoYWRkciksIHNpemUsIGRpcik7Cit9CisKK3N0YXRpYyB2b2lkIG5vbW11X3N5bmNfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBpOworCisJZm9yX2VhY2hfc2coc2csIHMsIG5lbGVtcywgaSkKKwkJZG1hX2NhY2hlX3N5bmMoZGV2LCBzZ192aXJ0KHMpLCBzLT5sZW5ndGgsIGRpcik7Cit9CisjZW5kaWYKKworc3RydWN0IGRtYV9tYXBfb3BzIG5vbW11X2RtYV9vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50CQk9IGRtYV9nZW5lcmljX2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50CQk9IGRtYV9nZW5lcmljX2ZyZWVfY29oZXJlbnQsCisJLm1hcF9wYWdlCQk9IG5vbW11X21hcF9wYWdlLAorCS5tYXBfc2cJCQk9IG5vbW11X21hcF9zZywKKyNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCisJLnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UJPSBub21tdV9zeW5jX3NpbmdsZSwKKwkuc3luY19zZ19mb3JfZGV2aWNlCT0gbm9tbXVfc3luY19zZywKKyNlbmRpZgorCS5pc19waHlzCQk9IDEsCit9OworCit2b2lkIF9faW5pdCBub19pb21tdV9pbml0KHZvaWQpCit7CisJaWYgKGRtYV9vcHMpCisJCXJldHVybjsKKwlkbWFfb3BzID0gJm5vbW11X2RtYV9vcHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9kd2FyZi5jIGIvYXJjaC9zaC9rZXJuZWwvZHdhcmYuYwppbmRleCBkNzZhMjMxLi4zNTc2YjcwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9kd2FyZi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2R3YXJmLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2R3YXJmLmg+CiAjaW5jbHVkZSA8YXNtL3Vud2luZGVyLmg+CkBAIC01MzAsNyArNTMxLDE4IEBACiB9CiAKIC8qKgotICoJZHdhcmZfdW53aW5kX3N0YWNrIC0gcmVjdXJzaXZlbHkgdW53aW5kIHRoZSBzdGFjaworICoJZHdhcmZfZnJlZV9mcmFtZSAtIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIEBmcmFtZQorICoJQGZyYW1lOiB0aGUgZnJhbWUgdG8gZnJlZQorICovCit2b2lkIGR3YXJmX2ZyZWVfZnJhbWUoc3RydWN0IGR3YXJmX2ZyYW1lICpmcmFtZSkKK3sKKwlkd2FyZl9mcmFtZV9mcmVlX3JlZ3MoZnJhbWUpOworCW1lbXBvb2xfZnJlZShmcmFtZSwgZHdhcmZfZnJhbWVfcG9vbCk7Cit9CisKKy8qKgorICoJZHdhcmZfdW53aW5kX3N0YWNrIC0gdW53aW5kIHRoZSBzdGFjaworICoKICAqCUBwYzogYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdG8gdW53aW5kCiAgKglAcHJldjogc3RydWN0IGR3YXJmX2ZyYW1lIG9mIHRoZSBwcmV2aW91cyBzdGFja2ZyYW1lIG9uIHRoZSBjYWxsc3RhY2sKICAqCkBAIC01NDgsOSArNTYwLDkgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKIAkvKgotCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IGludm9jYXRpb24gb2YgdGhpcyByZWN1cnNpdmUgZnVuY3Rpb24gd2UKLQkgKiBuZWVkIGdldCB0aGUgY29udGVudHMgb2YgYSBwaHlzaWNhbCByZWdpc3RlciB0byBnZXQgdGhlIENGQQotCSAqIGluIG9yZGVyIHRvIGJlZ2luIHRoZSB2aXJ0dWFsIHVud2luZGluZyBvZiB0aGUgc3RhY2suCisJICogSWYgd2UncmUgc3RhcnRpbmcgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2UgbmVlZCBnZXQgdGhlCisJICogY29udGVudHMgb2YgYSBwaHlzaWNhbCByZWdpc3RlciB0byBnZXQgdGhlIENGQSBpbiBvcmRlciB0bworCSAqIGJlZ2luIHRoZSB2aXJ0dWFsIHVud2luZGluZyBvZiB0aGUgc3RhY2suCiAJICoKIAkgKiBOT1RFOiB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgZ3VhcmFudGVlZCB0byBiZSBzZXR1cCBieSB0aGUKIAkgKiB0aW1lIHRoaXMgZnVuY3Rpb24gbWFrZXMgaXRzIGZpcnN0IGZ1bmN0aW9uIGNhbGwuCkBAIC01OTMsOSArNjA1LDggQEAKIAlmZGUgPSBkd2FyZl9sb29rdXBfZmRlKHBjKTsKIAlpZiAoIWZkZSkgewogCQkvKgotCQkgKiBUaGlzIGlzIG91ciBub3JtYWwgZXhpdCBwYXRoIC0gdGhlIG9uZSB0aGF0IHN0b3BzIHRoZQotCQkgKiByZWN1cnNpb24uIFRoZXJlJ3MgdHdvIHJlYXNvbnMgd2h5IHdlIG1pZ2h0IGV4aXQKLQkJICogaGVyZSwKKwkJICogVGhpcyBpcyBvdXIgbm9ybWFsIGV4aXQgcGF0aC4gVGhlcmUgYXJlIHR3byByZWFzb25zCisJCSAqIHdoeSB3ZSBtaWdodCBleGl0IGhlcmUsCiAJCSAqCiAJCSAqCWEpIHBjIGhhcyBubyBhc3Njb2NpYXRlZCBEV0FSRiBmcmFtZSBpbmZvIGFuZCBzbwogCQkgKgl3ZSBkb24ndCBrbm93IGhvdyB0byB1bndpbmQgdGhpcyBmcmFtZS4gVGhpcyBpcwpAQCAtNjM3LDEwICs2NDgsMTAgQEAKIAogCQl9IGVsc2UgewogCQkJLyoKLQkJCSAqIEFnYWluLCB0aGlzIGlzIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoaXMKLQkJCSAqIHJlY3VyaXN2ZSBmdW5jdGlvbi4gV2UgbmVlZCB0byBwaHlzaWNhbGx5Ci0JCQkgKiByZWFkIHRoZSBjb250ZW50cyBvZiBhIHJlZ2lzdGVyIGluIG9yZGVyIHRvCi0JCQkgKiBnZXQgdGhlIENhbm9uaWNhbCBGcmFtZSBBZGRyZXNzIGZvciB0aGlzCisJCQkgKiBBZ2Fpbiwgd2UncmUgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIG9mIHRoZQorCQkJICogc3RhY2suIFdlIG5lZWQgdG8gcGh5c2ljYWxseSByZWFkCisJCQkgKiB0aGUgY29udGVudHMgb2YgYSByZWdpc3RlciBpbiBvcmRlciB0byBnZXQKKwkJCSAqIHRoZSBDYW5vbmljYWwgRnJhbWUgQWRkcmVzcyBmb3IgdGhpcwogCQkJICogZnVuY3Rpb24uCiAJCQkgKi8KIAkJCWZyYW1lLT5jZmEgPSBkd2FyZl9yZWFkX2FyY2hfcmVnKGZyYW1lLT5jZmFfcmVnaXN0ZXIpOwpAQCAtNjcwLDEzICs2ODEsMTIgQEAKIAlyZXR1cm4gZnJhbWU7CiAKIGJhaWw6Ci0JZHdhcmZfZnJhbWVfZnJlZV9yZWdzKGZyYW1lKTsKLQltZW1wb29sX2ZyZWUoZnJhbWUsIGR3YXJmX2ZyYW1lX3Bvb2wpOworCWR3YXJmX2ZyZWVfZnJhbWUoZnJhbWUpOwogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50IGR3YXJmX3BhcnNlX2NpZSh2b2lkICplbnRyeSwgdm9pZCAqcCwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkgICB1bnNpZ25lZCBjaGFyICplbmQpCisJCQkgICB1bnNpZ25lZCBjaGFyICplbmQsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAlzdHJ1Y3QgZHdhcmZfY2llICpjaWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc3Miw2ICs3ODIsOCBAQAogCWNpZS0+aW5pdGlhbF9pbnN0cnVjdGlvbnMgPSBwOwogCWNpZS0+aW5zdHJ1Y3Rpb25zX2VuZCA9IGVuZDsKIAorCWNpZS0+bW9kID0gbW9kOworCiAJLyogQWRkIHRvIGxpc3QgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHdhcmZfY2llX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZjaWUtPmxpbmssICZkd2FyZl9jaWVfbGlzdCk7CkBAIC03ODIsNyArNzk0LDcgQEAKIAogc3RhdGljIGludCBkd2FyZl9wYXJzZV9mZGUodm9pZCAqZW50cnksIHUzMiBlbnRyeV90eXBlLAogCQkJICAgdm9pZCAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJICAgdW5zaWduZWQgY2hhciAqZW5kKQorCQkJICAgdW5zaWduZWQgY2hhciAqZW5kLCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJc3RydWN0IGR3YXJmX2ZkZSAqZmRlOwogCXN0cnVjdCBkd2FyZl9jaWUgKmNpZTsKQEAgLTgzMSw2ICs4NDMsOCBAQAogCWZkZS0+aW5zdHJ1Y3Rpb25zID0gcDsKIAlmZGUtPmVuZCA9IGVuZDsKIAorCWZkZS0+bW9kID0gbW9kOworCiAJLyogQWRkIHRvIGxpc3QuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmR3YXJmX2ZkZV9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmZmRlLT5saW5rLCAmZHdhcmZfZmRlX2xpc3QpOwpAQCAtODU0LDEwICs4NjgsOCBAQAogCXdoaWxlICgxKSB7CiAJCWZyYW1lID0gZHdhcmZfdW53aW5kX3N0YWNrKHJldHVybl9hZGRyLCBfZnJhbWUpOwogCi0JCWlmIChfZnJhbWUpIHsKLQkJCWR3YXJmX2ZyYW1lX2ZyZWVfcmVncyhfZnJhbWUpOwotCQkJbWVtcG9vbF9mcmVlKF9mcmFtZSwgZHdhcmZfZnJhbWVfcG9vbCk7Ci0JCX0KKwkJaWYgKF9mcmFtZSkKKwkJCWR3YXJmX2ZyZWVfZnJhbWUoX2ZyYW1lKTsKIAogCQlfZnJhbWUgPSBmcmFtZTsKIApAQCAtODY3LDYgKzg3OSw5IEBACiAJCXJldHVybl9hZGRyID0gZnJhbWUtPnJldHVybl9hZGRyOwogCQlvcHMtPmFkZHJlc3MoZGF0YSwgcmV0dXJuX2FkZHIsIDEpOwogCX0KKworCWlmIChmcmFtZSkKKwkJZHdhcmZfZnJlZV9mcmFtZShmcmFtZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdW53aW5kZXIgZHdhcmZfdW53aW5kZXIgPSB7CkBAIC04OTYsNiArOTExLDE1OCBAQAogfQogCiAvKioKKyAqCWR3YXJmX3BhcnNlX3NlY3Rpb24gLSBwYXJzZSBEV0FSRiBzZWN0aW9uCisgKglAZWhfZnJhbWVfc3RhcnQ6IHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIC5laF9mcmFtZSBzZWN0aW9uCisgKglAZWhfZnJhbWVfZW5kOiBlbmQgYWRkcmVzcyBvZiB0aGUgLmVoX2ZyYW1lIHNlY3Rpb24KKyAqCUBtb2Q6IHRoZSBrZXJuZWwgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIC5laF9mcmFtZSBzZWN0aW9uCisgKgorICoJUGFyc2UgdGhlIGluZm9ybWF0aW9uIGluIGEgLmVoX2ZyYW1lIHNlY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgZHdhcmZfcGFyc2Vfc2VjdGlvbihjaGFyICplaF9mcmFtZV9zdGFydCwgY2hhciAqZWhfZnJhbWVfZW5kLAorCQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwl1MzIgZW50cnlfdHlwZTsKKwl2b2lkICpwLCAqZW50cnk7CisJaW50IGNvdW50LCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgY19lbnRyaWVzLCBmX2VudHJpZXM7CisJdW5zaWduZWQgY2hhciAqZW5kOworCisJY19lbnRyaWVzID0gMDsKKwlmX2VudHJpZXMgPSAwOworCWVudHJ5ID0gZWhfZnJhbWVfc3RhcnQ7CisKKwl3aGlsZSAoKGNoYXIgKillbnRyeSA8IGVoX2ZyYW1lX2VuZCkgeworCQlwID0gZW50cnk7CisKKwkJY291bnQgPSBkd2FyZl9lbnRyeV9sZW4ocCwgJmxlbik7CisJCWlmIChjb3VudCA9PSAwKSB7CisJCQkvKgorCQkJICogV2UgcmVhZCBhIGJvZ3VzIGxlbmd0aCBmaWVsZCB2YWx1ZS4gVGhlcmUgaXMKKwkJCSAqIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgYXBhcnQgZnJvbSBkaXNhYmxpbmcKKwkJCSAqIHRoZSBEV0FSRiB1bndpbmRlci4gV2UgY2FuJ3QgZXZlbiBza2lwIHRoaXMKKwkJCSAqIGVudHJ5IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSBiZWNhdXNlICdsZW4nCisJCQkgKiB0ZWxscyB1cyB3aGVyZSBvdXIgbmV4dCBlbnRyeSBpcy4KKwkJCSAqLworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UKKwkJCXAgKz0gY291bnQ7CisKKwkJLyogaW5pdGlhbCBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSBpdHNlbGYgKi8KKwkJZW5kID0gcCArIGxlbjsKKworCQllbnRyeV90eXBlID0gZ2V0X3VuYWxpZ25lZCgodTMyICopcCk7CisJCXAgKz0gNDsKKworCQlpZiAoZW50cnlfdHlwZSA9PSBEV19FSF9GUkFNRV9DSUUpIHsKKwkJCWVyciA9IGR3YXJmX3BhcnNlX2NpZShlbnRyeSwgcCwgbGVuLCBlbmQsIG1vZCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWVsc2UKKwkJCQljX2VudHJpZXMrKzsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IGR3YXJmX3BhcnNlX2ZkZShlbnRyeSwgZW50cnlfdHlwZSwgcCwgbGVuLAorCQkJCQkgICAgICBlbmQsIG1vZCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWVsc2UKKwkJCQlmX2VudHJpZXMrKzsKKwkJfQorCisJCWVudHJ5ID0gKGNoYXIgKillbnRyeSArIGxlbiArIDQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiRFdBUkYgdW53aW5kZXIgaW5pdGlhbGlzZWQ6IHJlYWQgJXUgQ0lFcywgJXUgRkRFc1xuIiwKKwkgICAgICAgY19lbnRyaWVzLCBmX2VudHJpZXMpOworCisJcmV0dXJuIDA7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX01PRFVMRVMKK2ludCBtb2R1bGVfZHdhcmZfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCXVuc2lnbmVkIGludCBpLCBlcnI7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCWNoYXIgKnNlY3N0cmluZ3MgPSAodm9pZCAqKWhkciArIHNlY2hkcnNbaGRyLT5lX3Noc3RybmR4XS5zaF9vZmZzZXQ7CisKKwlzdGFydCA9IGVuZCA9IDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKKwkJLyogQWxsb2MgYml0IGNsZWFyZWQgbWVhbnMgImlnbm9yZSBpdC4iICovCisJCWlmICgoc2VjaGRyc1tpXS5zaF9mbGFncyAmIFNIRl9BTExPQykKKwkJICAgICYmICFzdHJjbXAoc2Vjc3RyaW5ncytzZWNoZHJzW2ldLnNoX25hbWUsICIuZWhfZnJhbWUiKSkgeworCQkJc3RhcnQgPSBzZWNoZHJzW2ldLnNoX2FkZHI7CisJCQllbmQgPSBzdGFydCArIHNlY2hkcnNbaV0uc2hfc2l6ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogRGlkIHdlIGZpbmQgdGhlIC5laF9mcmFtZSBzZWN0aW9uPyAqLworCWlmIChpICE9IGhkci0+ZV9zaG51bSkgeworCQllcnIgPSBkd2FyZl9wYXJzZV9zZWN0aW9uKChjaGFyICopc3RhcnQsIChjaGFyICopZW5kLCBtZSk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gcGFyc2UgRFdBUkYgaW5mb1xuIiwKKwkJCSAgICAgICBtZS0+bmFtZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJbW9kdWxlX2R3YXJmX2NsZWFudXAgLSByZW1vdmUgRkRFL0NJRXMgYXNzb2NpYXRlZCB3aXRoIEBtb2QKKyAqCUBtb2Q6IHRoZSBtb2R1bGUgdGhhdCBpcyBiZWluZyB1bmxvYWRlZAorICoKKyAqCVJlbW92ZSBhbnkgRkRFcyBhbmQgQ0lFcyBmcm9tIHRoZSBnbG9iYWwgbGlzdHMgdGhhdCBjYW1lIGZyb20KKyAqCUBtb2QncyAuZWhfZnJhbWUgc2VjdGlvbiBiZWNhdXNlIEBtb2QgaXMgYmVpbmcgdW5sb2FkZWQuCisgKi8KK3ZvaWQgbW9kdWxlX2R3YXJmX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXN0cnVjdCBkd2FyZl9mZGUgKmZkZTsKKwlzdHJ1Y3QgZHdhcmZfY2llICpjaWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkd2FyZl9jaWVfbG9jaywgZmxhZ3MpOworCithZ2Fpbl9jaWU6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaWUsICZkd2FyZl9jaWVfbGlzdCwgbGluaykgeworCQlpZiAoY2llLT5tb2QgPT0gbW9kKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCZjaWUtPmxpbmsgIT0gJmR3YXJmX2NpZV9saXN0KSB7CisJCWxpc3RfZGVsKCZjaWUtPmxpbmspOworCQlrZnJlZShjaWUpOworCQlnb3RvIGFnYWluX2NpZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd2FyZl9jaWVfbG9jaywgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR3YXJmX2ZkZV9sb2NrLCBmbGFncyk7CisKK2FnYWluX2ZkZToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZkZSwgJmR3YXJmX2ZkZV9saXN0LCBsaW5rKSB7CisJCWlmIChmZGUtPm1vZCA9PSBtb2QpCisJCQlicmVhazsKKwl9CisKKwlpZiAoJmZkZS0+bGluayAhPSAmZHdhcmZfZmRlX2xpc3QpIHsKKwkJbGlzdF9kZWwoJmZkZS0+bGluayk7CisJCWtmcmVlKGZkZSk7CisJCWdvdG8gYWdhaW5fZmRlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3YXJmX2ZkZV9sb2NrLCBmbGFncyk7Cit9CisjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KKworLyoqCiAgKglkd2FyZl91bndpbmRlcl9pbml0IC0gaW5pdGlhbGlzZSB0aGUgZHdhcmYgdW53aW5kZXIKICAqCiAgKglCdWlsZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGRlc2NyaWJpbmcgdGhlIC5kd2FyZl9mcmFtZSBzZWN0aW9uIHRvCkBAIC05MDYsMTkgKzEwNzMsMTAgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgZHdhcmZfdW53aW5kZXJfaW5pdCh2b2lkKQogewotCXUzMiBlbnRyeV90eXBlOwotCXZvaWQgKnAsICplbnRyeTsKLQlpbnQgY291bnQsIGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBsZW47Ci0JdW5zaWduZWQgaW50IGNfZW50cmllcywgZl9lbnRyaWVzOwotCXVuc2lnbmVkIGNoYXIgKmVuZDsKKwlpbnQgZXJyOwogCUlOSVRfTElTVF9IRUFEKCZkd2FyZl9jaWVfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmR3YXJmX2ZkZV9saXN0KTsKIAotCWNfZW50cmllcyA9IDA7Ci0JZl9lbnRyaWVzID0gMDsKLQllbnRyeSA9ICZfX3N0YXJ0X2VoX2ZyYW1lOwotCiAJZHdhcmZfZnJhbWVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImR3YXJmX2ZyYW1lcyIsCiAJCQlzaXplb2Yoc3RydWN0IGR3YXJmX2ZyYW1lKSwgMCwKIAkJCVNMQUJfUEFOSUMgfCBTTEFCX0hXQ0FDSEVfQUxJR04gfCBTTEFCX05PVFJBQ0ssIE5VTEwpOwpAQCAtOTM3LDQ3ICsxMDk1LDkgQEAKIAkJCQkJIG1lbXBvb2xfZnJlZV9zbGFiLAogCQkJCQkgZHdhcmZfcmVnX2NhY2hlcCk7CiAKLQl3aGlsZSAoKGNoYXIgKillbnRyeSA8IF9fc3RvcF9laF9mcmFtZSkgewotCQlwID0gZW50cnk7Ci0KLQkJY291bnQgPSBkd2FyZl9lbnRyeV9sZW4ocCwgJmxlbik7Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQkvKgotCQkJICogV2UgcmVhZCBhIGJvZ3VzIGxlbmd0aCBmaWVsZCB2YWx1ZS4gVGhlcmUgaXMKLQkJCSAqIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgYXBhcnQgZnJvbSBkaXNhYmxpbmcKLQkJCSAqIHRoZSBEV0FSRiB1bndpbmRlci4gV2UgY2FuJ3QgZXZlbiBza2lwIHRoaXMKLQkJCSAqIGVudHJ5IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSBiZWNhdXNlICdsZW4nCi0JCQkgKiB0ZWxscyB1cyB3aGVyZSBvdXIgbmV4dCBlbnRyeSBpcy4KLQkJCSAqLwotCQkJZ290byBvdXQ7Ci0JCX0gZWxzZQotCQkJcCArPSBjb3VudDsKLQotCQkvKiBpbml0aWFsIGxlbmd0aCBkb2VzIG5vdCBpbmNsdWRlIGl0c2VsZiAqLwotCQllbmQgPSBwICsgbGVuOwotCi0JCWVudHJ5X3R5cGUgPSBnZXRfdW5hbGlnbmVkKCh1MzIgKilwKTsKLQkJcCArPSA0OwotCi0JCWlmIChlbnRyeV90eXBlID09IERXX0VIX0ZSQU1FX0NJRSkgewotCQkJZXJyID0gZHdhcmZfcGFyc2VfY2llKGVudHJ5LCBwLCBsZW4sIGVuZCk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlnb3RvIG91dDsKLQkJCWVsc2UKLQkJCQljX2VudHJpZXMrKzsKLQkJfSBlbHNlIHsKLQkJCWVyciA9IGR3YXJmX3BhcnNlX2ZkZShlbnRyeSwgZW50cnlfdHlwZSwgcCwgbGVuLCBlbmQpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJZ290byBvdXQ7Ci0JCQllbHNlCi0JCQkJZl9lbnRyaWVzKys7Ci0JCX0KLQotCQllbnRyeSA9IChjaGFyICopZW50cnkgKyBsZW4gKyA0OwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gIkRXQVJGIHVud2luZGVyIGluaXRpYWxpc2VkOiByZWFkICV1IENJRXMsICV1IEZERXNcbiIsCi0JICAgICAgIGNfZW50cmllcywgZl9lbnRyaWVzKTsKKwllcnIgPSBkd2FyZl9wYXJzZV9zZWN0aW9uKF9fc3RhcnRfZWhfZnJhbWUsIF9fc3RvcF9laF9mcmFtZSwgTlVMTCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAKIAllcnIgPSB1bndpbmRlcl9yZWdpc3RlcigmZHdhcmZfdW53aW5kZXIpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9lbnRyeS1jb21tb24uUyBiL2FyY2gvc2gva2VybmVsL2VudHJ5LWNvbW1vbi5TCmluZGV4IDNlYjg0OTMuLmYwYWJkNTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2VudHJ5LWNvbW1vbi5TCisrKyBiL2FyY2gvc2gva2VybmVsL2VudHJ5LWNvbW1vbi5TCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkhIHI4OiBjdXJyZW50X3RocmVhZF9pbmZvCiAJISB0OiAgcmVzdWx0IG9mICJ0c3QJI19USUZfTkVFRF9SRVNDSEVELCByMCIKIAliZi9zCXdvcmtfcmVzY2hlZAotCSB0c3QJIyhfVElGX1NJR1BFTkRJTkcgfCBfVElGX1JFU1RPUkVfU0lHTUFTSyksIHIwCisJIHRzdAkjX1RJRl9TSUdQRU5ESU5HLCByMAogd29ya19ub3RpZnlzaWc6CiAJYnQvcwlfX3Jlc3RvcmVfYWxsCiAJIG1vdglyMTUsIHI0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCmluZGV4IDJjNDhlMjYuLmI2ZjQxYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCkBAIC02Miw2ICs2MiwxNTAgQEAKIAlyZXR1cm4gZnRyYWNlX3JlcGxhY2VkX2NvZGU7CiB9CiAKKy8qCisgKiBNb2RpZnlpbmcgY29kZSBtdXN0IHRha2UgZXh0cmEgY2FyZS4gT24gYW4gU01QIG1hY2hpbmUsIGlmCisgKiB0aGUgY29kZSBiZWluZyBtb2RpZmllZCBpcyBhbHNvIGJlaW5nIGV4ZWN1dGVkIG9uIGFub3RoZXIgQ1BVCisgKiB0aGF0IENQVSB3aWxsIGhhdmUgdW5kZWZpbmVkIHJlc3VsdHMgYW5kIHBvc3NpYmx5IHRha2UgYSBHUEYuCisgKiBXZSB1c2Uga3N0b3BfbWFjaGluZSB0byBzdG9wIG90aGVyIENQVVMgZnJvbSBleGVjdHVpbmcgY29kZS4KKyAqIEJ1dCB0aGlzIGRvZXMgbm90IHN0b3AgTk1JcyBmcm9tIGhhcHBlbmluZy4gV2Ugc3RpbGwgbmVlZAorICogdG8gcHJvdGVjdCBhZ2FpbnN0IHRoYXQuIFdlIHNlcGFyYXRlIG91dCB0aGUgbW9kaWZpY2F0aW9uIG9mCisgKiB0aGUgY29kZSB0byB0YWtlIGNhcmUgb2YgdGhpcy4KKyAqCisgKiBUd28gYnVmZmVycyBhcmUgYWRkZWQ6IEFuIElQIGJ1ZmZlciBhbmQgYSAiY29kZSIgYnVmZmVyLgorICoKKyAqIDEpIFB1dCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBpbnRvIHRoZSBJUCBidWZmZXIKKyAqICAgIGFuZCB0aGUgbmV3IGNvZGUgaW50byB0aGUgImNvZGUiIGJ1ZmZlci4KKyAqIDIpIFdhaXQgZm9yIGFueSBydW5uaW5nIE5NSXMgdG8gZmluaXNoIGFuZCBzZXQgYSBmbGFnIHRoYXQgc2F5cworICogICAgd2UgYXJlIG1vZGlmeWluZyBjb2RlLCBpdCBpcyBkb25lIGluIGFuIGF0b21pYyBvcGVyYXRpb24uCisgKiAzKSBXcml0ZSB0aGUgY29kZQorICogNCkgY2xlYXIgdGhlIGZsYWcuCisgKiA1KSBXYWl0IGZvciBhbnkgcnVubmluZyBOTUlzIHRvIGZpbmlzaC4KKyAqCisgKiBJZiBhbiBOTUkgaXMgZXhlY3V0ZWQsIHRoZSBmaXJzdCB0aGluZyBpdCBkb2VzIGlzIHRvIGNhbGwKKyAqICJmdHJhY2Vfbm1pX2VudGVyIi4gVGhpcyB3aWxsIGNoZWNrIGlmIHRoZSBmbGFnIGlzIHNldCB0byB3cml0ZQorICogYW5kIGlmIGl0IGlzLCBpdCB3aWxsIHdyaXRlIHdoYXQgaXMgaW4gdGhlIElQIGFuZCAiY29kZSIgYnVmZmVycy4KKyAqCisgKiBUaGUgdHJpY2sgaXMsIGl0IGRvZXMgbm90IG1hdHRlciBpZiBldmVyeW9uZSBpcyB3cml0aW5nIHRoZSBzYW1lCisgKiBjb250ZW50IHRvIHRoZSBjb2RlIGxvY2F0aW9uLiBBbHNvLCBpZiBhIENQVSBpcyBleGVjdXRpbmcgY29kZQorICogaXQgaXMgT0sgdG8gd3JpdGUgdG8gdGhhdCBjb2RlIGxvY2F0aW9uIGlmIHRoZSBjb250ZW50cyBiZWluZyB3cml0dGVuCisgKiBhcmUgdGhlIHNhbWUgYXMgd2hhdCBleGlzdHMuCisgKi8KKyNkZWZpbmUgTU9EX0NPREVfV1JJVEVfRkxBRyAoMSA8PCAzMSkJLyogc2V0IHdoZW4gTk1JIHNob3VsZCBkbyB0aGUgd3JpdGUgKi8KK3N0YXRpYyBhdG9taWNfdCBubWlfcnVubmluZyA9IEFUT01JQ19JTklUKDApOworc3RhdGljIGludCBtb2RfY29kZV9zdGF0dXM7CQkvKiBob2xkcyByZXR1cm4gdmFsdWUgb2YgdGV4dCB3cml0ZSAqLworc3RhdGljIHZvaWQgKm1vZF9jb2RlX2lwOwkJLyogaG9sZHMgdGhlIElQIHRvIHdyaXRlIHRvICovCitzdGF0aWMgdm9pZCAqbW9kX2NvZGVfbmV3Y29kZTsJCS8qIGhvbGRzIHRoZSB0ZXh0IHRvIHdyaXRlIHRvIHRoZSBJUCAqLworCitzdGF0aWMgdW5zaWduZWQgbm1pX3dhaXRfY291bnQ7CitzdGF0aWMgYXRvbWljX3Qgbm1pX3VwZGF0ZV9jb3VudCA9IEFUT01JQ19JTklUKDApOworCitpbnQgZnRyYWNlX2FyY2hfcmVhZF9keW5faW5mbyhjaGFyICpidWYsIGludCBzaXplKQoreworCWludCByOworCisJciA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiV1ICV1IiwKKwkJICAgICBubWlfd2FpdF9jb3VudCwKKwkJICAgICBhdG9taWNfcmVhZCgmbm1pX3VwZGF0ZV9jb3VudCkpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9tb2RfZmxhZyh2b2lkKQoreworCWludCBvbGQgPSBhdG9taWNfcmVhZCgmbm1pX3J1bm5pbmcpOworCisJZm9yICg7OykgeworCQlpbnQgbmV3ID0gb2xkICYgfk1PRF9DT0RFX1dSSVRFX0ZMQUc7CisKKwkJaWYgKG9sZCA9PSBuZXcpCisJCQlicmVhazsKKworCQlvbGQgPSBhdG9taWNfY21weGNoZygmbm1pX3J1bm5pbmcsIG9sZCwgbmV3KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZ0cmFjZV9tb2RfY29kZSh2b2lkKQoreworCS8qCisJICogWWVzLCBtb3JlIHRoYW4gb25lIENQVSBwcm9jZXNzIGNhbiBiZSB3cml0aW5nIHRvIG1vZF9jb2RlX3N0YXR1cy4KKwkgKiAgICAoYW5kIHRoZSBjb2RlIGl0c2VsZikKKwkgKiBCdXQgaWYgb25lIHdlcmUgdG8gZmFpbCwgdGhlbiB0aGV5IGFsbCBzaG91bGQsIGFuZCBpZiBvbmUgd2VyZQorCSAqIHRvIHN1Y2NlZWQsIHRoZW4gdGhleSBhbGwgc2hvdWxkLgorCSAqLworCW1vZF9jb2RlX3N0YXR1cyA9IHByb2JlX2tlcm5lbF93cml0ZShtb2RfY29kZV9pcCwgbW9kX2NvZGVfbmV3Y29kZSwKKwkJCQkJICAgICBNQ09VTlRfSU5TTl9TSVpFKTsKKworCS8qIGlmIHdlIGZhaWwsIHRoZW4ga2lsbCBhbnkgbmV3IHdyaXRlcnMgKi8KKwlpZiAobW9kX2NvZGVfc3RhdHVzKQorCQljbGVhcl9tb2RfZmxhZygpOworfQorCit2b2lkIGZ0cmFjZV9ubWlfZW50ZXIodm9pZCkKK3sKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJm5taV9ydW5uaW5nKSAmIE1PRF9DT0RFX1dSSVRFX0ZMQUcpIHsKKwkJc21wX3JtYigpOworCQlmdHJhY2VfbW9kX2NvZGUoKTsKKwkJYXRvbWljX2luYygmbm1pX3VwZGF0ZV9jb3VudCk7CisJfQorCS8qIE11c3QgaGF2ZSBwcmV2aW91cyBjaGFuZ2VzIHNlZW4gYmVmb3JlIGV4ZWN1dGlvbnMgKi8KKwlzbXBfbWIoKTsKK30KKwordm9pZCBmdHJhY2Vfbm1pX2V4aXQodm9pZCkKK3sKKwkvKiBGaW5pc2ggYWxsIGV4ZWN1dGlvbnMgYmVmb3JlIGNsZWFyaW5nIG5taV9ydW5uaW5nICovCisJc21wX21iKCk7CisJYXRvbWljX2RlYygmbm1pX3J1bm5pbmcpOworfQorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9ubWlfYW5kX3NldF9tb2RfZmxhZyh2b2lkKQoreworCWlmICghYXRvbWljX2NtcHhjaGcoJm5taV9ydW5uaW5nLCAwLCBNT0RfQ09ERV9XUklURV9GTEFHKSkKKwkJcmV0dXJuOworCisJZG8geworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChhdG9taWNfY21weGNoZygmbm1pX3J1bm5pbmcsIDAsIE1PRF9DT0RFX1dSSVRFX0ZMQUcpKTsKKworCW5taV93YWl0X2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX25taSh2b2lkKQoreworCWlmICghYXRvbWljX3JlYWQoJm5taV9ydW5uaW5nKSkKKwkJcmV0dXJuOworCisJZG8geworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChhdG9taWNfcmVhZCgmbm1pX3J1bm5pbmcpKTsKKworCW5taV93YWl0X2NvdW50Kys7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2Z0cmFjZV9tb2RfY29kZSh1bnNpZ25lZCBsb25nIGlwLCB2b2lkICpuZXdfY29kZSkKK3sKKwltb2RfY29kZV9pcCA9ICh2b2lkICopaXA7CisJbW9kX2NvZGVfbmV3Y29kZSA9IG5ld19jb2RlOworCisJLyogVGhlIGJ1ZmZlcnMgbmVlZCB0byBiZSB2aXNpYmxlIGJlZm9yZSB3ZSBsZXQgTk1JcyB3cml0ZSB0aGVtICovCisJc21wX21iKCk7CisKKwl3YWl0X2Zvcl9ubWlfYW5kX3NldF9tb2RfZmxhZygpOworCisJLyogTWFrZSBzdXJlIGFsbCBydW5uaW5nIE5NSXMgaGF2ZSBmaW5pc2hlZCBiZWZvcmUgd2Ugd3JpdGUgdGhlIGNvZGUgKi8KKwlzbXBfbWIoKTsKKworCWZ0cmFjZV9tb2RfY29kZSgpOworCisJLyogTWFrZSBzdXJlIHRoZSB3cml0ZSBoYXBwZW5zIGJlZm9yZSBjbGVhcmluZyB0aGUgYml0ICovCisJc21wX21iKCk7CisKKwljbGVhcl9tb2RfZmxhZygpOworCXdhaXRfZm9yX25taSgpOworCisJcmV0dXJuIG1vZF9jb2RlX3N0YXR1czsKK30KKwogc3RhdGljIGludCBmdHJhY2VfbW9kaWZ5X2NvZGUodW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgY2hhciAqb2xkX2NvZGUsCiAJCSAgICAgICB1bnNpZ25lZCBjaGFyICpuZXdfY29kZSkKIHsKQEAgLTg2LDcgKzIzMCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogcmVwbGFjZSB0aGUgdGV4dCB3aXRoIHRoZSBuZXcgdGV4dCAqLwotCWlmIChwcm9iZV9rZXJuZWxfd3JpdGUoKHZvaWQgKilpcCwgbmV3X2NvZGUsIE1DT1VOVF9JTlNOX1NJWkUpKQorCWlmIChkb19mdHJhY2VfbW9kX2NvZGUoaXAsIG5ld19jb2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWZsdXNoX2ljYWNoZV9yYW5nZShpcCwgaXAgKyBNQ09VTlRfSU5TTl9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2hlYWRfMzIuUyBiL2FyY2gvc2gva2VybmVsL2hlYWRfMzIuUwppbmRleCBhNzhiZTc0Li4xMTUxZWNkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaGVhZF8zMi5TCkBAIC0zMyw3ICszMyw3IEBACiAJLmxvbmcJMQkJLyogTE9BREVSX1RZUEUgKi8KIAkubG9uZwkweDAwMDAwMDAwCS8qIElOSVRSRF9TVEFSVCAqLwogCS5sb25nCTB4MDAwMDAwMDAJLyogSU5JVFJEX1NJWkUgKi8KLSNpZmRlZiBDT05GSUdfMzJCSVQKKyNpZiBkZWZpbmVkKENPTkZJR18zMkJJVCkgJiYgZGVmaW5lZChDT05GSUdfUE1CX0ZJWEVEKQogCS5sb25nCTB4NTM0NTNmMDAgKyAzMgkvKiAiU0U/IiA9IDMyIGJpdCAqLwogI2Vsc2UKIAkubG9uZwkweDUzNDUzZjAwICsgMjkJLyogIlNFPyIgPSAyOSBiaXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lkbGUuYyBiL2FyY2gvc2gva2VybmVsL2lkbGUuYwppbmRleCAyN2ZmMmRjLi5hYWZmMDAzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pZGxlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaWRsZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiBzdGF0aWMgaW50IGhsdF9jb3VudGVyOwotdm9pZCAoKnBtX2lkbGUpKHZvaWQpOwordm9pZCAoKnBtX2lkbGUpKHZvaWQpID0gTlVMTDsKIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOwogRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCkBAIC0zOSw0OCArMzksOTIgQEAKIH0KIF9fc2V0dXAoImhsdCIsIGhsdF9zZXR1cCk7CiAKLXZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBobHRfd29ya3Modm9pZCkKIHsKLQlpZiAoIWhsdF9jb3VudGVyKSB7Ci0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0JCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7Ci0JCXNldF9ibF9iaXQoKTsKLQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7Ci0KLQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkKLQkJCWNwdV9zbGVlcCgpOwotCi0JCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKLQkJY2xlYXJfYmxfYml0KCk7Ci0JCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCX0gZWxzZQotCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJY3B1X3JlbGF4KCk7CisJcmV0dXJuICFobHRfY291bnRlcjsKIH0KIAorLyoKKyAqIE9uIFNNUCBpdCdzIHNsaWdodGx5IGZhc3RlciAoYnV0IG11Y2ggbW9yZSBwb3dlci1jb25zdW1pbmchKQorICogdG8gcG9sbCB0aGUgLT53b3JrLm5lZWRfcmVzY2hlZCBmbGFnIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlCisgKiBjcm9zcy1DUFUgSVBJIHRvIGFycml2ZS4gVXNlIHRoaXMgb3B0aW9uIHdpdGggY2F1dGlvbi4KKyAqLworc3RhdGljIHZvaWQgcG9sbF9pZGxlKHZvaWQpCit7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCisJCWNwdV9yZWxheCgpOworfQorCit2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQoreworCWlmIChobHRfd29ya3MoKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCisJCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCWNwdV9zbGVlcCgpOworCQl9IGVsc2UKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwl9IGVsc2UKKwkJcG9sbF9pZGxlKCk7Cit9CisKKy8qCisgKiBUaGUgaWRsZSB0aHJlYWQuIFRoZXJlJ3Mgbm8gdXNlZnVsIHdvcmsgdG8gYmUgZG9uZSwgc28ganVzdCB0cnkgdG8gY29uc2VydmUKKyAqIHBvd2VyIGFuZCBoYXZlIGEgbG93IGV4aXQgbGF0ZW5jeSAoaWUgc2l0IGluIGEgbG9vcCB3YWl0aW5nIGZvciBzb21lYm9keSB0bworICogc2F5IHRoYXQgdGhleSdkIGxpa2UgdG8gcmVzY2hlZHVsZSkKKyAqLwogdm9pZCBjcHVfaWRsZSh2b2lkKQogeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKIAlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAogCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCiAJd2hpbGUgKDEpIHsKLQkJdm9pZCAoKmlkbGUpKHZvaWQpID0gcG1faWRsZTsKLQotCQlpZiAoIWlkbGUpCi0JCQlpZGxlID0gZGVmYXVsdF9pZGxlOwotCiAJCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7Ci0JCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCi0JCQlpZGxlKCk7Ci0JCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKIAorCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmIGNwdV9vbmxpbmUoY3B1KSkgeworCQkJY2hlY2tfcGd0X2NhY2hlKCk7CisJCQlybWIoKTsKKworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCS8qIERvbid0IHRyYWNlIGlycXMgb2ZmIGZvciBpZGxlICovCisJCQlzdG9wX2NyaXRpY2FsX3RpbWluZ3MoKTsKKwkJCXBtX2lkbGUoKTsKKwkJCS8qCisJCQkgKiBTYW5pdHkgY2hlY2sgdG8gZW5zdXJlIHRoYXQgcG1faWRsZSgpIHJldHVybnMKKwkJCSAqIHdpdGggSVJRcyBlbmFibGVkCisJCQkgKi8KKwkJCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKKwkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKKwkJfQorCisJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJY2hlY2tfcGd0X2NhY2hlKCk7CiAJfQogfQogCit2b2lkIF9fY3B1aW5pdCBzZWxlY3RfaWRsZV9yb3V0aW5lKHZvaWQpCit7CisJLyoKKwkgKiBJZiBhIHBsYXRmb3JtIGhhcyBzZXQgaXRzIG93biBpZGxlIHJvdXRpbmUsIGxlYXZlIGl0IGFsb25lLgorCSAqLworCWlmIChwbV9pZGxlKQorCQlyZXR1cm47CisKKwlpZiAoaGx0X3dvcmtzKCkpCisJCXBtX2lkbGUgPSBkZWZhdWx0X2lkbGU7CisJZWxzZQorCQlwbV9pZGxlID0gcG9sbF9pZGxlOworfQorCiBzdGF0aWMgdm9pZCBkb19ub3RoaW5nKHZvaWQgKnVudXNlZCkKIHsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYyBiL2FyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYwppbmRleCBiOGZhNjUyLi5lMWUxZGJkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pb19nZW5lcmljLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jCkBAIC0yNCw3ICsyNCw3IEBACiAjZGVmaW5lIGR1bW15X3JlYWQoKQogI2VuZGlmCiAKLXVuc2lnbmVkIGxvbmcgZ2VuZXJpY19pb19iYXNlOwordW5zaWduZWQgbG9uZyBnZW5lcmljX2lvX2Jhc2UgPSAwOwogCiB1OCBnZW5lcmljX2luYih1bnNpZ25lZCBsb25nIHBvcnQpCiB7CkBAIC0xNDcsOCArMTQ3LDEwIEBACiAKIHZvaWQgX19pb21lbSAqZ2VuZXJpY19pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IHNpemUpCiB7CisjaWZkZWYgUDFTRUcKIAlpZiAoUFhTRUcoYWRkcikgPj0gUDFTRUcpCiAJCXJldHVybiAodm9pZCBfX2lvbWVtICopYWRkcjsKKyNlbmRpZgogCiAJcmV0dXJuICh2b2lkIF9faW9tZW0gKikoYWRkciArIGdlbmVyaWNfaW9fYmFzZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pcnEuYyBiL2FyY2gvc2gva2VybmVsL2lycS5jCmluZGV4IGVhYzdkYTcuLmUxOTEzZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lycS5jCkBAIC0zNyw3ICszNywxNSBAQAogICovCiBzdGF0aWMgaW50IHNob3dfb3RoZXJfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGludCBwcmVjKQogeworCWludCBqOworCisJc2VxX3ByaW50ZihwLCAiJSpzOiAiLCBwcmVjLCAiTk1JIik7CisJZm9yX2VhY2hfb25saW5lX2NwdShqKQorCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGlycV9zdGF0W2pdLl9fbm1pX2NvdW50KTsKKwlzZXFfcHJpbnRmKHAsICIgIE5vbi1tYXNrYWJsZSBpbnRlcnJ1cHRzXG4iKTsKKwogCXNlcV9wcmludGYocCwgIiUqczogJTEwdVxuIiwgcHJlYywgIkVSUiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU1LDYgKzI2MywxMiBAQAogewogCXBsYXRfaXJxX3NldHVwKCk7CiAKKwkvKgorCSAqIFBpbiBhbnkgb2YgdGhlIGxlZ2FjeSBJUlEgdmVjdG9ycyB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuCisJICogZ3JhYmJlZCBieSB0aGUgcGxhdGZvcm0KKwkgKi8KKwlyZXNlcnZlX2lycV9sZWdhY3koKTsKKwogCS8qIFBlcmZvcm0gdGhlIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gKi8KIAlpZiAoc2hfbXYubXZfaW5pdF9pcnEpCiAJCXNoX212Lm12X2luaXRfaXJxKCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pcnFfMzIuYyBiL2FyY2gvc2gva2VybmVsL2lycV8zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzM2FiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9pcnFfMzIuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogU0hjb21wYWN0IGlycWZsYWdzIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA5IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwordm9pZCBub3RyYWNlIHJhd19sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxOworCisJaWYgKGZsYWdzID09IFJBV19JUlFfRElTQUJMRUQpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkJInN0YwlzciwgJTBcblx0IgorCQkJIm9yCSMweGYwLCAlMFxuXHQiCisJCQkibGRjCSUwLCBzclxuXHQiCisJCQk6ICI9JnoiIChfX2R1bW15MCkKKwkJCTogLyogbm8gaW5wdXRzICovCisJCQk6ICJtZW1vcnkiCisJCSk7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkJInN0YwlzciwgJTBcblx0IgorCQkJImFuZAklMSwgJTBcblx0IgorI2lmZGVmIENPTkZJR19DUFVfSEFTX1NSX1JCCisJCQkic3RjCXI2X2JhbmssICUxXG5cdCIKKwkJCSJvcgklMSwgJTBcblx0IgorI2VuZGlmCisJCQkibGRjCSUwLCBzclxuXHQiCisJCQk6ICI9JnIiIChfX2R1bW15MCksICI9ciIgKF9fZHVtbXkxKQorCQkJOiAiMSIgKH5SQVdfSVJRX0RJU0FCTEVEKQorCQkJOiAibWVtb3J5IgorCQkpOworCX0KK30KK0VYUE9SVF9TWU1CT0wocmF3X2xvY2FsX2lycV9yZXN0b3JlKTsKKwordW5zaWduZWQgbG9uZyBub3RyYWNlIF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkic3RjCXNyLCAlMFxuXHQiCisJCSJhbmQJIzB4ZjAsICUwXG5cdCIKKwkJOiAiPSZ6IiAoZmxhZ3MpCisJCTogLyogbm8gaW5wdXRzICovCisJCTogIm1lbW9yeSIKKwkpOworCisJcmV0dXJuIGZsYWdzOworfQorRVhQT1JUX1NZTUJPTChfX3Jhd19sb2NhbF9zYXZlX2ZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lycV82NC5jIGIvYXJjaC9zaC9rZXJuZWwvaXJxXzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzNjViYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2lycV82NC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBTSG1lZGlhIGlycWZsYWdzIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA5IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxjcHUvcmVnaXN0ZXJzLmg+CisKK3ZvaWQgbm90cmFjZSByYXdfbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTsKKworCWlmIChmbGFncyA9PSBSQVdfSVJRX0RJU0FCTEVEKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSJnZXRjb24JIiBfX1NSICIsICUwXG5cdCIKKwkJCSJvcgklMCwgJTEsICUwXG5cdCIKKwkJCSJwdXRjb24JJTAsICIgX19TUiAiXG5cdCIKKwkJCTogIj0mciIgKF9fZHVtbXkpCisJCQk6ICJyIiAoUkFXX0lSUV9ESVNBQkxFRCkKKwkJKTsKKwl9IGVsc2UgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkiZ2V0Y29uCSIgX19TUiAiLCAlMFxuXHQiCisJCQkiYW5kCSUwLCAlMSwgJTBcblx0IgorCQkJInB1dGNvbgklMCwgIiBfX1NSICJcblx0IgorCQkJOiAiPSZyIiAoX19kdW1teSkKKwkJCTogInIiICh+UkFXX0lSUV9ESVNBQkxFRCkKKwkJKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHJhd19sb2NhbF9pcnFfcmVzdG9yZSk7CisKK3Vuc2lnbmVkIGxvbmcgbm90cmFjZSBfX3Jhd19sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJImdldGNvbgkiIF9fU1IgIiwgJTBcblx0IgorCQkiYW5kCSUwLCAlMSwgJTAiCisJCTogIj0mciIgKGZsYWdzKQorCQk6ICJyIiAoUkFXX0lSUV9ESVNBQkxFRCkKKwkpOworCisJcmV0dXJuIGZsYWdzOworfQorRVhQT1JUX1NZTUJPTChfX3Jhd19sb2NhbF9zYXZlX2ZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCA3ZWEyNzA0Li43NmYyODAyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC00NiwxMiArNDYsNiBAQAogICovCiBpbnQgbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQogewotCS8qIG9sZGVyIHZlcnNpb25zIG9mIGtleGVjLXRvb2xzIGFyZSBwYXNzaW5nCi0JICogdGhlIHpJbWFnZSBlbnRyeSBwb2ludCBhcyBhIHZpcnR1YWwgYWRkcmVzcy4KLQkgKi8KLQlpZiAoaW1hZ2UtPnN0YXJ0ICE9IFBIWVNBRERSKGltYWdlLT5zdGFydCkpCi0JCXJldHVybiAtRUlOVkFMOyAvKiB1cGdyYWRlIHlvdXIga2V4ZWMtdG9vbHMgKi8KLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKaW5kZXggY2JjZTYzOS4uMTY1MjM0MCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvbWFjaHZlYy5jCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2h2ZWMuYwpAQCAtMTM1LDUgKzEzNSw5IEBACiAJaWYgKCFzaF9tdi5tdl9ucl9pcnFzKQogCQlzaF9tdi5tdl9ucl9pcnFzID0gTlJfSVJRUzsKIAorI2lmZGVmIFAyU0VHCiAJX19zZXRfaW9fcG9ydF9iYXNlKFAyU0VHKTsKKyNlbHNlCisJX19zZXRfaW9fcG9ydF9iYXNlKDApOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvc2gva2VybmVsL21vZHVsZS5jCmluZGV4IGMyZWZkY2QuLjQzYWRkZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL21vZHVsZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS9kd2FyZi5oPgogCiB2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQogewpAQCAtMTQ1LDEwICsxNDYsMTYgQEAKIAkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAogCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCiB7Ci0JcmV0dXJuIG1vZHVsZV9idWdfZmluYWxpemUoaGRyLCBzZWNoZHJzLCBtZSk7CisJaW50IHJldCA9IDA7CisKKwlyZXQgfD0gbW9kdWxlX2R3YXJmX2ZpbmFsaXplKGhkciwgc2VjaGRycywgbWUpOworCXJldCB8PSBtb2R1bGVfYnVnX2ZpbmFsaXplKGhkciwgc2VjaGRycywgbWUpOworCisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAltb2R1bGVfYnVnX2NsZWFudXAobW9kKTsKKwltb2R1bGVfZHdhcmZfY2xlYW51cChtb2QpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcGVyZl9jYWxsY2hhaW4uYyBiL2FyY2gvc2gva2VybmVsL3BlcmZfY2FsbGNoYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlYTgzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3BlcmZfY2FsbGNoYWluLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGV2ZW50IGNhbGxjaGFpbiBzdXBwb3J0IC0gU3VwZXJIIGFyY2hpdGVjdHVyZSBjb2RlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vdW53aW5kZXIuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWxsY2hhaW5fc3RvcmUoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSwgdTY0IGlwKQoreworCWlmIChlbnRyeS0+bnIgPCBQRVJGX01BWF9TVEFDS19ERVBUSCkKKwkJZW50cnktPmlwW2VudHJ5LT5ucisrXSA9IGlwOworfQorCitzdGF0aWMgdm9pZCBjYWxsY2hhaW5fd2FybmluZyh2b2lkICpkYXRhLCBjaGFyICptc2cpCit7Cit9CisKK3N0YXRpYyB2b2lkCitjYWxsY2hhaW5fd2FybmluZ19zeW1ib2wodm9pZCAqZGF0YSwgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIHN5bWJvbCkKK3sKK30KKworc3RhdGljIGludCBjYWxsY2hhaW5fc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2FsbGNoYWluX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCit7CisJc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSA9IGRhdGE7CisKKwlpZiAocmVsaWFibGUpCisJCWNhbGxjaGFpbl9zdG9yZShlbnRyeSwgYWRkcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgY2FsbGNoYWluX29wcyA9IHsKKwkud2FybmluZwk9IGNhbGxjaGFpbl93YXJuaW5nLAorCS53YXJuaW5nX3N5bWJvbAk9IGNhbGxjaGFpbl93YXJuaW5nX3N5bWJvbCwKKwkuc3RhY2sJCT0gY2FsbGNoYWluX3N0YWNrLAorCS5hZGRyZXNzCT0gY2FsbGNoYWluX2FkZHJlc3MsCit9OworCitzdGF0aWMgdm9pZAorcGVyZl9jYWxsY2hhaW5fa2VybmVsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5KQoreworCWNhbGxjaGFpbl9zdG9yZShlbnRyeSwgUEVSRl9DT05URVhUX0tFUk5FTCk7CisJY2FsbGNoYWluX3N0b3JlKGVudHJ5LCByZWdzLT5wYyk7CisKKwl1bndpbmRfc3RhY2soTlVMTCwgcmVncywgTlVMTCwgJmNhbGxjaGFpbl9vcHMsIGVudHJ5KTsKK30KKworc3RhdGljIHZvaWQKK3BlcmZfZG9fY2FsbGNoYWluKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5KQoreworCWludCBpc191c2VyOworCisJaWYgKCFyZWdzKQorCQlyZXR1cm47CisKKwlpc191c2VyID0gdXNlcl9tb2RlKHJlZ3MpOworCisJaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQtPnBpZCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoaXNfdXNlciAmJiBjdXJyZW50LT5zdGF0ZSAhPSBUQVNLX1JVTk5JTkcpCisJCXJldHVybjsKKworCS8qCisJICogT25seSB0aGUga2VybmVsIHNpZGUgaXMgaW1wbGVtZW50ZWQgZm9yIG5vdy4KKwkgKi8KKwlpZiAoIWlzX3VzZXIpCisJCXBlcmZfY2FsbGNoYWluX2tlcm5lbChyZWdzLCBlbnRyeSk7Cit9CisKKy8qCisgKiBObyBuZWVkIGZvciBzZXBhcmF0ZSBJUlEgYW5kIE5NSSBlbnRyaWVzLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5LCBjYWxsY2hhaW4pOworCitzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKnBlcmZfY2FsbGNoYWluKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnkgPSAmX19nZXRfY3B1X3ZhcihjYWxsY2hhaW4pOworCisJZW50cnktPm5yID0gMDsKKworCXBlcmZfZG9fY2FsbGNoYWluKHJlZ3MsIGVudHJ5KTsKKworCXJldHVybiBlbnRyeTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvc2gva2VybmVsL3BlcmZfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmYwOTQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogUGVyZm9ybWFuY2UgZXZlbnQgc3VwcG9ydCBmcmFtZXdvcmsgZm9yIFN1cGVySCBoYXJkd2FyZSBjb3VudGVycy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBQYXVsIE11bmR0CisgKgorICogSGVhdmlseSBiYXNlZCBvbiB0aGUgeDg2IGFuZCBQb3dlclBDIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiB4ODY6CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEphc3dpbmRlciBTaW5naCBSYWpwdXQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiwgUm9iZXJ0IFJpY2h0ZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBSZWQgSGF0LCBJbmMuLCBQZXRlciBaaWpsc3RyYSA8cHppamxzdHJAcmVkaGF0LmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24sIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4KKyAqCisgKiBwcGM6CisgKiAgQ29weXJpZ2h0IDIwMDgtMjAwOSBQYXVsIE1hY2tlcnJhcywgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworc3RydWN0IGNwdV9od19ldmVudHMgeworCXN0cnVjdCBwZXJmX2V2ZW50CSpldmVudHNbTUFYX0hXRVZFTlRTXTsKKwl1bnNpZ25lZCBsb25nCQl1c2VkX21hc2tbQklUU19UT19MT05HUyhNQVhfSFdFVkVOVFMpXTsKKwl1bnNpZ25lZCBsb25nCQlhY3RpdmVfbWFza1tCSVRTX1RPX0xPTkdTKE1BWF9IV0VWRU5UUyldOworfTsKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9od19ldmVudHMsIGNwdV9od19ldmVudHMpOworCitzdGF0aWMgc3RydWN0IHNoX3BtdSAqc2hfcG11IF9fcmVhZF9tb3N0bHk7CisKKy8qIE51bWJlciBvZiBwZXJmX2V2ZW50cyBjb3VudGluZyBoYXJkd2FyZSBldmVudHMgKi8KK3N0YXRpYyBhdG9taWNfdCBudW1fZXZlbnRzOworLyogVXNlZCB0byBhdm9pZCByYWNlcyBpbiBjYWxsaW5nIHJlc2VydmUvcmVsZWFzZV9wbWNfaGFyZHdhcmUgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgocG1jX3Jlc2VydmVfbXV0ZXgpOworCisvKgorICogU3R1YiB0aGVzZSBvdXQgZm9yIG5vdywgZG8gc29tZXRoaW5nIG1vcmUgcHJvZm91bmQgbGF0ZXIuCisgKi8KK2ludCByZXNlcnZlX3BtY19oYXJkd2FyZSh2b2lkKQoreworCXJldHVybiAwOworfQorCit2b2lkIHJlbGVhc2VfcG1jX2hhcmR3YXJlKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoX3BtdV9pbml0aWFsaXplZCh2b2lkKQoreworCXJldHVybiAhIXNoX3BtdTsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIFBNVSBpZiB0aGlzIGlzIHRoZSBsYXN0IHBlcmZfZXZlbnQuCisgKi8KK3N0YXRpYyB2b2lkIGh3X3BlcmZfZXZlbnRfZGVzdHJveShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJaWYgKCFhdG9taWNfYWRkX3VubGVzcygmbnVtX2V2ZW50cywgLTEsIDEpKSB7CisJCW11dGV4X2xvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZudW1fZXZlbnRzKSA9PSAwKQorCQkJcmVsZWFzZV9wbWNfaGFyZHdhcmUoKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbWNfcmVzZXJ2ZV9tdXRleCk7CisJfQorfQorCitzdGF0aWMgaW50IGh3X3BlcmZfY2FjaGVfZXZlbnQoaW50IGNvbmZpZywgaW50ICpldnApCit7CisJdW5zaWduZWQgbG9uZyB0eXBlLCBvcCwgcmVzdWx0OworCWludCBldjsKKworCWlmICghc2hfcG11LT5jYWNoZV9ldmVudHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdW5wYWNrIGNvbmZpZyAqLworCXR5cGUgPSBjb25maWcgJiAweGZmOworCW9wID0gKGNvbmZpZyA+PiA4KSAmIDB4ZmY7CisJcmVzdWx0ID0gKGNvbmZpZyA+PiAxNikgJiAweGZmOworCisJaWYgKHR5cGUgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9NQVggfHwKKwkgICAgb3AgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVggfHwKKwkgICAgcmVzdWx0ID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlldiA9ICgqc2hfcG11LT5jYWNoZV9ldmVudHMpW3R5cGVdW29wXVtyZXN1bHRdOworCWlmIChldiA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKGV2ID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqZXZwID0gZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19od19wZXJmX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIgPSAmZXZlbnQtPmF0dHI7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisJaW50IGNvbmZpZyA9IC0xOworCWludCBlcnI7CisKKwlpZiAoIXNoX3BtdV9pbml0aWFsaXplZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogQWxsIG9mIHRoZSBvbi1jaGlwIGNvdW50ZXJzIGFyZSAibGltaXRlZCIsIGluIHRoYXQgdGhleSBoYXZlCisJICogbm8gaW50ZXJydXB0cywgYW5kIGFyZSB0aGVyZWZvcmUgdW5hYmxlIHRvIGRvIHNhbXBsaW5nIHdpdGhvdXQKKwkgKiBmdXJ0aGVyIHdvcmsgYW5kIHRpbWVyIGFzc2lzdGFuY2UuCisJICovCisJaWYgKGh3Yy0+c2FtcGxlX3BlcmlvZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFNlZSBpZiB3ZSBuZWVkIHRvIHJlc2VydmUgdGhlIGNvdW50ZXIuCisJICoKKwkgKiBJZiBubyBldmVudHMgYXJlIGN1cnJlbnRseSBpbiB1c2UsIHRoZW4gd2UgaGF2ZSB0byB0YWtlIGEKKwkgKiBtdXRleCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCByYWNlIHdpdGggYW5vdGhlciB0YXNrIGRvaW5nCisJICogcmVzZXJ2ZV9wbWNfaGFyZHdhcmUgb3IgcmVsZWFzZV9wbWNfaGFyZHdhcmUuCisJICovCisJZXJyID0gMDsKKwlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJm51bV9ldmVudHMpKSB7CisJCW11dGV4X2xvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwkJaWYgKGF0b21pY19yZWFkKCZudW1fZXZlbnRzKSA9PSAwICYmCisJCSAgICByZXNlcnZlX3BtY19oYXJkd2FyZSgpKQorCQkJZXJyID0gLUVCVVNZOworCQllbHNlCisJCQlhdG9taWNfaW5jKCZudW1fZXZlbnRzKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbWNfcmVzZXJ2ZV9tdXRleCk7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWV2ZW50LT5kZXN0cm95ID0gaHdfcGVyZl9ldmVudF9kZXN0cm95OworCisJc3dpdGNoIChhdHRyLT50eXBlKSB7CisJY2FzZSBQRVJGX1RZUEVfUkFXOgorCQljb25maWcgPSBhdHRyLT5jb25maWcgJiBzaF9wbXUtPnJhd19ldmVudF9tYXNrOworCQlicmVhazsKKwljYXNlIFBFUkZfVFlQRV9IV19DQUNIRToKKwkJZXJyID0gaHdfcGVyZl9jYWNoZV9ldmVudChhdHRyLT5jb25maWcsICZjb25maWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBQRVJGX1RZUEVfSEFSRFdBUkU6CisJCWlmIChhdHRyLT5jb25maWcgPj0gc2hfcG11LT5tYXhfZXZlbnRzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY29uZmlnID0gc2hfcG11LT5ldmVudF9tYXAoYXR0ci0+Y29uZmlnKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNvbmZpZyA9PSAtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlod2MtPmNvbmZpZyB8PSBjb25maWc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hfcGVyZl9ldmVudF91cGRhdGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCit7CisJdTY0IHByZXZfcmF3X2NvdW50LCBuZXdfcmF3X2NvdW50OworCXM2NCBkZWx0YTsKKwlpbnQgc2hpZnQgPSAwOworCisJLyoKKwkgKiBEZXBlbmRpbmcgb24gdGhlIGNvdW50ZXIgY29uZmlndXJhdGlvbiwgdGhleSBtYXkgb3IgbWF5IG5vdAorCSAqIGJlIGNoYWluZWQsIGluIHdoaWNoIGNhc2UgdGhlIHByZXZpb3VzIGNvdW50ZXIgdmFsdWUgY2FuIGJlCisJICogdXBkYXRlZCB1bmRlcm5lYXRoIHVzIGlmIHRoZSBsb3dlci1oYWxmIG92ZXJmbG93cy4KKwkgKgorCSAqIE91ciB0YWN0aWMgdG8gaGFuZGxlIHRoaXMgaXMgdG8gZmlyc3QgYXRvbWljYWxseSByZWFkIGFuZAorCSAqIGV4Y2hhbmdlIGEgbmV3IHJhdyBjb3VudCAtIHRoZW4gYWRkIHRoYXQgbmV3LXByZXYgZGVsdGEKKwkgKiBjb3VudCB0byB0aGUgZ2VuZXJpYyBjb3VudGVyIGF0b21pY2FsbHkuCisJICoKKwkgKiBBcyB0aGVyZSBpcyBubyBpbnRlcnJ1cHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdmVyZmxvdyBldmVudHMsCisJICogdGhpcyBpcyB0aGUgc2ltcGxlc3QgYXBwcm9hY2ggZm9yIG1haW50YWluaW5nIGNvbnNpc3RlbmN5LgorCSAqLworYWdhaW46CisJcHJldl9yYXdfY291bnQgPSBhdG9taWM2NF9yZWFkKCZod2MtPnByZXZfY291bnQpOworCW5ld19yYXdfY291bnQgPSBzaF9wbXUtPnJlYWQoaWR4KTsKKworCWlmIChhdG9taWM2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXZfcmF3X2NvdW50LAorCQkJICAgICBuZXdfcmF3X2NvdW50KSAhPSBwcmV2X3Jhd19jb3VudCkKKwkJZ290byBhZ2FpbjsKKworCS8qCisJICogTm93IHdlIGhhdmUgdGhlIG5ldyByYXcgdmFsdWUgYW5kIGhhdmUgdXBkYXRlZCB0aGUgcHJldgorCSAqIHRpbWVzdGFtcCBhbHJlYWR5LiBXZSBjYW4gbm93IGNhbGN1bGF0ZSB0aGUgZWxhcHNlZCBkZWx0YQorCSAqIChjb3VudGVyLSl0aW1lIGFuZCBhZGQgdGhhdCB0byB0aGUgZ2VuZXJpYyBjb3VudGVyLgorCSAqCisJICogQ2FyZWZ1bCwgbm90IGFsbCBodyBzaWduLWV4dGVuZHMgYWJvdmUgdGhlIHBoeXNpY2FsIHdpZHRoCisJICogb2YgdGhlIGNvdW50LgorCSAqLworCWRlbHRhID0gKG5ld19yYXdfY291bnQgPDwgc2hpZnQpIC0gKHByZXZfcmF3X2NvdW50IDw8IHNoaWZ0KTsKKwlkZWx0YSA+Pj0gc2hpZnQ7CisKKwlhdG9taWM2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOworfQorCitzdGF0aWMgdm9pZCBzaF9wbXVfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgaWR4ID0gaHdjLT5pZHg7CisKKwljbGVhcl9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzayk7CisJc2hfcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKKworCWJhcnJpZXIoKTsKKworCXNoX3BlcmZfZXZlbnRfdXBkYXRlKGV2ZW50LCAmZXZlbnQtPmh3LCBpZHgpOworCisJY3B1Yy0+ZXZlbnRzW2lkeF0gPSBOVUxMOworCWNsZWFyX2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzayk7CisKKwlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7Cit9CisKK3N0YXRpYyBpbnQgc2hfcG11X2VuYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgaWR4ID0gaHdjLT5pZHg7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpIHsKKwkJaWR4ID0gZmluZF9maXJzdF96ZXJvX2JpdChjcHVjLT51c2VkX21hc2ssIHNoX3BtdS0+bnVtX2V2ZW50cyk7CisJCWlmIChpZHggPT0gc2hfcG11LT5udW1fZXZlbnRzKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzayk7CisJCWh3Yy0+aWR4ID0gaWR4OworCX0KKworCXNoX3BtdS0+ZGlzYWJsZShod2MsIGlkeCk7CisKKwljcHVjLT5ldmVudHNbaWR4XSA9IGV2ZW50OworCXNldF9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzayk7CisKKwlzaF9wbXUtPmVuYWJsZShod2MsIGlkeCk7CisKKwlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hfcG11X3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXNoX3BlcmZfZXZlbnRfdXBkYXRlKGV2ZW50LCAmZXZlbnQtPmh3LCBldmVudC0+aHcuaWR4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbXUgcG11ID0geworCS5lbmFibGUJCT0gc2hfcG11X2VuYWJsZSwKKwkuZGlzYWJsZQk9IHNoX3BtdV9kaXNhYmxlLAorCS5yZWFkCQk9IHNoX3BtdV9yZWFkLAorfTsKKworY29uc3Qgc3RydWN0IHBtdSAqaHdfcGVyZl9ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpbnQgZXJyID0gX19od19wZXJmX2V2ZW50X2luaXQoZXZlbnQpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChldmVudC0+ZGVzdHJveSkKKwkJCWV2ZW50LT5kZXN0cm95KGV2ZW50KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwlyZXR1cm4gJnBtdTsKK30KKwordm9pZCBod19wZXJmX2V2ZW50X3NldHVwKGludCBjcHUpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWh3ID0gJnBlcl9jcHUoY3B1X2h3X2V2ZW50cywgY3B1KTsKKworCW1lbXNldChjcHVodywgMCwgc2l6ZW9mKHN0cnVjdCBjcHVfaHdfZXZlbnRzKSk7Cit9CisKK3ZvaWQgaHdfcGVyZl9lbmFibGUodm9pZCkKK3sKKwlpZiAoIXNoX3BtdV9pbml0aWFsaXplZCgpKQorCQlyZXR1cm47CisKKwlzaF9wbXUtPmVuYWJsZV9hbGwoKTsKK30KKwordm9pZCBod19wZXJmX2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoIXNoX3BtdV9pbml0aWFsaXplZCgpKQorCQlyZXR1cm47CisKKwlzaF9wbXUtPmRpc2FibGVfYWxsKCk7Cit9CisKK2ludCByZWdpc3Rlcl9zaF9wbXUoc3RydWN0IHNoX3BtdSAqcG11KQoreworCWlmIChzaF9wbXUpCisJCXJldHVybiAtRUJVU1k7CisJc2hfcG11ID0gcG11OworCisJcHJfaW5mbygiUGVyZm9ybWFuY2UgRXZlbnRzOiAlcyBzdXBwb3J0IHJlZ2lzdGVyZWRcbiIsIHBtdS0+bmFtZSk7CisKKwlXQVJOX09OKHBtdS0+bnVtX2V2ZW50cyA+IE1BWF9IV0VWRU5UUyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCAwNjczYzQ3Li5kOGFmODg5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC0xMzQsNyArMTM0LDEwIEBACiAJcmVncy5yZWdzWzVdID0gKHVuc2lnbmVkIGxvbmcpZm47CiAKIAlyZWdzLnBjID0gKHVuc2lnbmVkIGxvbmcpa2VybmVsX3RocmVhZF9oZWxwZXI7Ci0JcmVncy5zciA9ICgxIDw8IDMwKTsKKwlyZWdzLnNyID0gU1JfTUQ7CisjaWYgZGVmaW5lZChDT05GSUdfU0hfRlBVKQorCXJlZ3Muc3IgfD0gU1JfRkQ7CisjZW5kaWYKIAogCS8qIE9rLCBjcmVhdGUgdGhlIG5ldyBwcm9jZXNzLi4gKi8KIAlwaWQgPSBkb19mb3JrKGZsYWdzIHwgQ0xPTkVfVk0gfCBDTE9ORV9VTlRSQUNFRCwgMCwKQEAgLTE0Miw2ICsxNDUsNyBAQAogCiAJcmV0dXJuIHBpZDsKIH0KK0VYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CiAKIC8qCiAgKiBGcmVlIGN1cnJlbnQgdGhyZWFkIGRhdGEgc3RydWN0dXJlcyBldGMuLgpAQCAtMTg2LDYgKzE5MCwxNiBAQAogCiAJcmV0dXJuIGZwdmFsaWQ7CiB9CitFWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKKworLyoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgYmVmb3JlIHdlIGFsbG9jYXRlIGEgbmV3IHRocmVhZCBhbmQgY29weQorICogdGhlIGN1cnJlbnQgdGFzayBpbnRvIGl0LgorICovCit2b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwl1bmxhenlfZnB1KHRzaywgdGFza19wdF9yZWdzKHRzaykpOworfQogCiBhc21saW5rYWdlIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKIApAQCAtMTk1LDE2ICsyMDksMTAgQEAKIHsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzOwotI2lmIGRlZmluZWQoQ09ORklHX1NIX0ZQVSkgfHwgZGVmaW5lZChDT05GSUdfU0hfRFNQKQorI2lmIGRlZmluZWQoQ09ORklHX1NIX0RTUCkKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NIX0ZQVSkKLQl1bmxhenlfZnB1KHRzaywgcmVncyk7Ci0JcC0+dGhyZWFkLmZwdSA9IHRzay0+dGhyZWFkLmZwdTsKLQljb3B5X3RvX3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKHApOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TSF9EU1ApCiAJaWYgKGlzX2RzcF9lbmFibGVkKHRzaykpIHsKIAkJLyogV2UgY2FuIHVzZSB0aGUgX19zYXZlX2RzcCBvciBqdXN0IGNvcHkgdGhlIHN0cnVjdDoKQEAgLTIyNCw2ICsyMzIsOCBAQAogCX0gZWxzZSB7CiAJCWNoaWxkcmVncy0+cmVnc1sxNV0gPSAodW5zaWduZWQgbG9uZyljaGlsZHJlZ3M7CiAJCXRpLT5hZGRyX2xpbWl0ID0gS0VSTkVMX0RTOworCQl0aS0+c3RhdHVzICY9IH5UU19VU0VERlBVOworCQlwLT5mcHVfY291bnRlciA9IDA7CiAJfQogCiAJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQpAQCAtMjg4LDkgKzI5OCwxMyBAQAogX19ub3RyYWNlX2Z1bmNncmFwaCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKgogX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfU0hfRlBVKQorCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0X3QgPSAmbmV4dC0+dGhyZWFkOworCiAJdW5sYXp5X2ZwdShwcmV2LCB0YXNrX3B0X3JlZ3MocHJldikpOwotI2VuZGlmCisKKwkvKiB3ZSdyZSBnb2luZyB0byB1c2UgdGhpcyBzb29uLCBhZnRlciBhIGZldyBleHBlbnNpdmUgdGhpbmdzICovCisJaWYgKG5leHQtPmZwdV9jb3VudGVyID4gNSkKKwkJcHJlZmV0Y2goJm5leHRfdC0+ZnB1LmhhcmQpOwogCiAjaWZkZWYgQ09ORklHX01NVQogCS8qCkBAIC0zMjEsNiArMzM1LDE0IEBACiAjZW5kaWYKIAl9CiAKKwkvKgorCSAqIElmIHRoZSB0YXNrIGhhcyB1c2VkIGZwdSB0aGUgbGFzdCA1IHRpbWVzbGljZXMsIGp1c3QgZG8gYSBmdWxsCisJICogcmVzdG9yZSBvZiB0aGUgbWF0aCBzdGF0ZSBpbW1lZGlhdGVseSB0byBhdm9pZCB0aGUgdHJhcDsgdGhlCisJICogY2hhbmNlcyBvZiBuZWVkaW5nIEZQVSBzb29uIGFyZSBvYnZpb3VzbHkgaGlnaCBub3cKKwkgKi8KKwlpZiAobmV4dC0+ZnB1X2NvdW50ZXIgPiA1KQorCQlmcHVfc3RhdGVfcmVzdG9yZSh0YXNrX3B0X3JlZ3MobmV4dCkpOworCiAJcmV0dXJuIHByZXY7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCAxMTkyMzk4Li4zNTliOGEyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC0zMzUsNiArMzM1LDcgQEAKIAlyZXR1cm4gZG9fZm9yayhmbGFncyB8IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQsIDAsCiAJCSAgICAgICZyZWdzLCAwLCBOVUxMLCBOVUxMKTsKIH0KK0VYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CiAKIC8qCiAgKiBGcmVlIGN1cnJlbnQgdGhyZWFkIGRhdGEgc3RydWN0dXJlcyBldGMuLgpAQCAtNDE3LDYgKzQxOCw3IEBACiAJcmV0dXJuIDA7IC8qIFRhc2sgZGlkbid0IHVzZSB0aGUgZnB1IGF0IGFsbC4gKi8KICNlbmRpZgogfQorRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CiAKIGFzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9yZXR1cm5fYWRkcmVzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcmV0dXJuX2FkZHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNhYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvcmV0dXJuX2FkZHJlc3MuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvcmV0dXJuX2FkZHJlc3MuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgTWF0dCBGbGVtaW5nCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9kd2FyZi5oPgorCisjaWZkZWYgQ09ORklHX0RXQVJGX1VOV0lOREVSCisKK3ZvaWQgKnJldHVybl9hZGRyZXNzKHVuc2lnbmVkIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgZHdhcmZfZnJhbWUgKmZyYW1lOworCXVuc2lnbmVkIGxvbmcgcmE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwLCBmcmFtZSA9IE5VTEwsIHJhID0gMDsgaSA8PSBkZXB0aDsgaSsrKSB7CisJCXN0cnVjdCBkd2FyZl9mcmFtZSAqdG1wOworCisJCXRtcCA9IGR3YXJmX3Vud2luZF9zdGFjayhyYSwgZnJhbWUpOworCisJCWlmIChmcmFtZSkKKwkJCWR3YXJmX2ZyZWVfZnJhbWUoZnJhbWUpOworCisJCWZyYW1lID0gdG1wOworCisJCWlmICghZnJhbWUgfHwgIWZyYW1lLT5yZXR1cm5fYWRkcikKKwkJCWJyZWFrOworCisJCXJhID0gZnJhbWUtPnJldHVybl9hZGRyOworCX0KKworCS8qIEZhaWxlZCB0byB1bndpbmQgdGhlIHN0YWNrIHRvIHRoZSBzcGVjaWZpZWQgZGVwdGguICovCisJV0FSTl9PTihpICE9IGRlcHRoICsgMSk7CisKKwlpZiAoZnJhbWUpCisJCWR3YXJmX2ZyZWVfZnJhbWUoZnJhbWUpOworCisJcmV0dXJuICh2b2lkICopcmE7Cit9CisKKyNlbHNlCisKK3ZvaWQgKnJldHVybl9hZGRyZXNzKHVuc2lnbmVkIGludCBkZXB0aCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCA5OWI0ZmI1Li41YTk0N2EyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTQ1Myw2ICs0NTMsMTAgQEAKIAogCXBhZ2luZ19pbml0KCk7CiAKKyNpZmRlZiBDT05GSUdfUE1CX0VOQUJMRQorCXBtYl9pbml0KCk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TTVAKIAlwbGF0X3NtcF9zZXR1cCgpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltc18zMi5jIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXNfMzIuYwppbmRleCA0NDRjY2UzLi4zODk2ZjI2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltc18zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zXzMyLmMKQEAgLTEsMzcgKzEsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vZnRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKLWV4dGVybiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKiwgZWxmX2ZwcmVnc2V0X3QgKik7Ci0KLS8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCi1FWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKLUVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHN0cmxlbik7Ci0KLS8qIFBDSSBleHBvcnRzICovCi0jaWZkZWYgQ09ORklHX1BDSQotRVhQT1JUX1NZTUJPTChwY2lfYWxsb2NfY29uc2lzdGVudCk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9mcmVlX2NvbnNpc3RlbnQpOwotI2VuZGlmCi0KLS8qIG1lbSBleHBvcnRzICovCiBFWFBPUlRfU1lNQk9MKG1lbWNocik7CiBFWFBPUlRfU1lNQk9MKG1lbWNweSk7CiBFWFBPUlRfU1lNQk9MKG1lbXNldCk7CkBAIC00MCw2ICsxNCwxMyBAQAogRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7CiBFWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKIEVYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOworRVhQT1JUX1NZTUJPTChzdHJsZW4pOworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKTsKK0VYUE9SVF9TWU1CT0woY29weV9wYWdlKTsKK0VYUE9SVF9TWU1CT0woX19jbGVhcl91c2VyKTsKK0VYUE9SVF9TWU1CT0woX2Vic3MpOworRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOwogCiAjZGVmaW5lIERFQ0xBUkVfRVhQT1JUKG5hbWUpCQlcCiAJZXh0ZXJuIHZvaWQgbmFtZSh2b2lkKTtFWFBPUlRfU1lNQk9MKG5hbWUpCkBAIC0xMDcsMzAgKzg4LDYgQEAKIERFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpM19pNCk7CiBERUNMQVJFX0VYUE9SVChfX3NkaXZzaTNfaTRpKTsKIERFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpM19pNGkpOwotCi0jaWYgIWRlZmluZWQoQ09ORklHX0NBQ0hFX09GRikgJiYgKGRlZmluZWQoQ09ORklHX0NQVV9TSDQpIHx8IFwKLQlkZWZpbmVkKENPTkZJR19TSDc3MDVfQ0FDSEVfMzJLQikpCi0vKiBuZWVkZWQgYnkgc29tZSBtb2R1bGVzICovCi1FWFBPUlRfU1lNQk9MKGZsdXNoX2NhY2hlX2FsbCk7Ci1FWFBPUlRfU1lNQk9MKGZsdXNoX2NhY2hlX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woZmx1c2hfZGNhY2hlX3BhZ2UpOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTUNPVU5UCiBERUNMQVJFX0VYUE9SVChtY291bnQpOwogI2VuZGlmCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7Ci1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMpOwotI2lmZGVmIENPTkZJR19JUFY2Ci1FWFBPUlRfU1lNQk9MKGNzdW1faXB2Nl9tYWdpYyk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0woY29weV9wYWdlKTsKLUVYUE9SVF9TWU1CT0woX19jbGVhcl91c2VyKTsKLUVYUE9SVF9TWU1CT0woX2Vic3MpOwotRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOwotCi0jaWZuZGVmIENPTkZJR19DQUNIRV9PRkYKLUVYUE9SVF9TWU1CT0woX19mbHVzaF9wdXJnZV9yZWdpb24pOwotRVhQT1JUX1NZTUJPTChfX2ZsdXNoX3diYWNrX3JlZ2lvbik7Ci1FWFBPUlRfU1lNQk9MKF9fZmx1c2hfaW52YWxpZGF0ZV9yZWdpb24pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltc182NC5jIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXNfNjQuYwppbmRleCBkMDA4ZTE3Li40NWFmYTVjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltc182NC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zXzY0LmMKQEAgLTI0LDE2ICsyNCw2IEBACiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi1leHRlcm4gaW50IGR1bXBfZnB1KHN0cnVjdCBwdF9yZWdzICosIGVsZl9mcHJlZ3NldF90ICopOwotCi0vKiBwbGF0Zm9ybSBkZXBlbmRlbnQgc3VwcG9ydCAqLwotRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7Ci1FWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwotCi0jaWZkZWYgQ09ORklHX1ZUCi1FWFBPUlRfU1lNQk9MKHNjcmVlbl9pbmZvKTsKLSNlbmRpZgotCiBFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfYXNtX2IpOwogRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyX2FzbV93KTsKIEVYUE9SVF9TWU1CT0woX19wdXRfdXNlcl9hc21fbCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IDNkYjM3NDIuLjEyODE1Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbF8zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbF8zMi5jCkBAIC02Nyw3ICs2Nyw4IEBACiAKIAljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKIAlzY2hlZHVsZSgpOwotCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CisKIAlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCkBAIC01OTAsNyArNTkxLDcgQEAKIAlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQlnb3RvIG5vX3NpZ25hbDsKIAotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmIFRTX1JFU1RPUkVfU0lHTUFTSykKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CiAJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKQEAgLTYwMiwxMiArNjAzLDEzIEBACiAJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwogCQlpZiAoaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LAogCQkJCSAgcmVncywgc2F2ZV9yMCkgPT0gMCkgewotCQkJLyogYSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZAorCQkJLyoKKwkJCSAqIEEgc2lnbmFsIHdhcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkOyB0aGUgc2F2ZWQKIAkJCSAqIHNpZ21hc2sgd2lsbCBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSBzaWduYWwgZnJhbWUsCiAJCQkgKiBhbmQgd2lsbCBiZSByZXN0b3JlZCBieSBzaWdyZXR1cm4sIHNvIHdlIGNhbiBzaW1wbHkKLQkJCSAqIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KLQkJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQotCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQkJICogY2xlYXIgdGhlIFRTX1JFU1RPUkVfU0lHTUFTSyBmbGFnCisJCQkgKi8KKwkJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19SRVNUT1JFX1NJR01BU0s7CiAKIAkJCXRyYWNlaG9va19zaWduYWxfaGFuZGxlcihzaWduciwgJmluZm8sICZrYSwgcmVncywKIAkJCQkJdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpOwpAQCAtNjMxLDEwICs2MzMsMTIgQEAKIAkJfQogCX0KIAotCS8qIGlmIHRoZXJlJ3Mgbm8gc2lnbmFsIHRvIGRlbGl2ZXIsIHdlIGp1c3QgcHV0IHRoZSBzYXZlZCBzaWdtYXNrCi0JICogYmFjayAqLwotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKSB7Ci0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCS8qCisJICogSWYgdGhlcmUncyBubyBzaWduYWwgdG8gZGVsaXZlciwgd2UganVzdCBwdXQgdGhlIHNhdmVkIHNpZ21hc2sKKwkgKiBiYWNrLgorCSAqLworCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmIFRTX1JFU1RPUkVfU0lHTUFTSykgeworCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmPSB+VFNfUkVTVE9SRV9TSUdNQVNLOwogCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NpZ25hbF82NC5jIGIvYXJjaC9zaC9rZXJuZWwvc2lnbmFsXzY0LmMKaW5kZXggNzQ3OTNjOC4uZmViM2RkZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2lnbmFsXzY0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2lnbmFsXzY0LmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCWdvdG8gbm9fc2lnbmFsOwogCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICYgVFNfUkVTVE9SRV9TSUdNQVNLKQogCQlvbGRzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKIAllbHNlIGlmICghb2xkc2V0KQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKQEAgLTExNSwxMSArMTE1LDkgQEAKIAkJCS8qCiAJCQkgKiBJZiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCwgdGhlCiAJCQkgKiBzYXZlZCBzaWdtYXNrIGlzIGluIGl0cyBmcmFtZSwgYW5kIHdlIGNhbgotCQkJICogY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZy4KKwkJCSAqIGNsZWFyIHRoZSBUU19SRVNUT1JFX1NJR01BU0sgZmxhZy4KIAkJCSAqLwotCQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCi0JCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0KKwkJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19SRVNUT1JFX1NJR01BU0s7CiAJCQl0cmFjZWhvb2tfc2lnbmFsX2hhbmRsZXIoc2lnbnIsICZpbmZvLCAma2EsIHJlZ3MsIDApOwogCQkJcmV0dXJuIDE7CiAJCX0KQEAgLTE0Niw4ICsxNDQsOCBAQAogCX0KIAogCS8qIE5vIHNpZ25hbCB0byBkZWxpdmVyIC0tIHB1dCB0aGUgc2F2ZWQgc2lnbWFzayBiYWNrICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICYgVFNfUkVTVE9SRV9TSUdNQVNLKSB7CisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19SRVNUT1JFX1NJR01BU0s7CiAJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CiAJfQogCkBAIC0xNzYsNiArMTc0LDcgQEAKIAl3aGlsZSAoMSkgewogCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKIAkJc2NoZWR1bGUoKTsKKwkJc2V0X3Jlc3RvcmVfc2lnbWFzaygpOwogCQlyZWdzLT5wYyArPSA0OyAgICAvKiBiZWNhdXNlIHN5c19zaWdyZXR1cm4gZGVjcmVtZW50cyB0aGUgcGMgKi8KIAkJaWYgKGRvX3NpZ25hbChyZWdzLCAmc2F2ZXNldCkpIHsKIAkJCS8qIHBjIG5vdyBwb2ludHMgYXQgc2lnbmFsIGhhbmRsZXIuIE5lZWQgdG8gZGVjcmVtZW50CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zbXAuYyBiL2FyY2gvc2gva2VybmVsL3NtcC5jCmluZGV4IDE2MGRiMTAuLjk4M2UwNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NtcC5jCkBAIC0xMjIsNyArMTIyLDkgQEAKIAlzdGFja19zdGFydC5ic3Nfc3RhcnQgPSAwOyAvKiBkb24ndCBjbGVhciBic3MgZm9yIHNlY29uZGFyeSBjcHVzICovCiAJc3RhY2tfc3RhcnQuc3RhcnRfa2VybmVsX2ZuID0gc3RhcnRfc2Vjb25kYXJ5OwogCi0JZmx1c2hfY2FjaGVfYWxsKCk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSZzdGFja19zdGFydCwKKwkJCSAgICh1bnNpZ25lZCBsb25nKSZzdGFja19zdGFydCArIHNpemVvZihzdGFja19zdGFydCkpOworCXdtYigpOwogCiAJcGxhdF9zdGFydF9jcHUoY3B1LCAodW5zaWduZWQgbG9uZylfc3RleHQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCAwODM4OTQyLi45YjBiNjMzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKQEAgLTE2LDYgKzE2LDMyIEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1LCBjcHVfZGV2aWNlcyk7CiAKK2NwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU107CisKK3N0YXRpYyBjcHVtYXNrX3QgY3B1X2NvcmVncm91cF9tYXAodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIFByZXNlbnRseSBhbGwgU0gtWDMgU01QIGNvcmVzIGFyZSBtdWx0aS1jb3Jlcywgc28ganVzdCBrZWVwIGl0CisJICogc2ltcGxlIHVudGlsIHdlIGhhdmUgYSBtZXRob2QgZm9yIGRldGVybWluaW5nIHRvcG9sb2d5Li4KKwkgKi8KKwlyZXR1cm4gY3B1X3Bvc3NpYmxlX21hcDsKK30KKworY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9jb3JlZ3JvdXBfbWFzayh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAmY3B1X2NvcmVfbWFwW2NwdV07Cit9CisKK2ludCBhcmNoX3VwZGF0ZV9jcHVfdG9wb2xvZ3kodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJY3B1X2NvcmVfbWFwW2NwdV0gPSBjcHVfY29yZWdyb3VwX21hcChjcHUpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKIHsKIAlpbnQgaSwgcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKaW5kZXggYTgzOTZmMy4uN2IwMzYzMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCkBAIC05LDggKzksOCBAQAogI2luY2x1ZGUgPGFzbS91bndpbmRlci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2lmZGVmIENPTkZJR19CVUcKLXZvaWQgaGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19CVUcKK3N0YXRpYyB2b2lkIGhhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSAqYnVnOwogCXVuc2lnbmVkIGxvbmcgYnVnYWRkciA9IHJlZ3MtPnBjOwpAQCAtODEsNyArODEsNyBAQAogCQkgICAgICAgU0lHVFJBUCkgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKIAotI2lmZGVmIENPTkZJR19CVUcKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19CVUcKIAlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGluc3RydWN0aW9uX3BvaW50ZXIocmVncykpKSB7CiAJCWluc25fc2l6ZV90IGluc24gPSAqKGluc25fc2l6ZV90ICopaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKIAkJaWYgKGluc24gPT0gVFJBUEFfQlVHX09QQ09ERSkKQEAgLTk1LDkgKzk1LDExIEBACiAKIEJVSUxEX1RSQVBfSEFORExFUihubWkpCiB7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlUUkFQX0hBTkRMRVJfREVDTDsKIAogCW5taV9lbnRlcigpOworCW5taV9jb3VudChjcHUpKys7CiAKIAlzd2l0Y2ggKG5vdGlmeV9kaWUoRElFX05NSSwgIk5NSSIsIHJlZ3MsIDAsIHZlYyAmIDB4ZmYsIFNJR0lOVCkpIHsKIAljYXNlIE5PVElGWV9PSzoKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCmluZGV4IDdhMmVlM2EuLjNkYTVhMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTY4LDYxICs2OSw0OSBAQAogCSJzaWduYWwrd2FybiIKIH07CiAKLXN0YXRpYyBpbnQKLXByb2NfYWxpZ25tZW50X3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCi0JCSAgICB2b2lkICpkYXRhKQorc3RhdGljIGludCBhbGlnbm1lbnRfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQljaGFyICpwID0gcGFnZTsKLQlpbnQgbGVuOwotCi0JcCArPSBzcHJpbnRmKHAsICJVc2VyOlx0XHQlbHVcbiIsIHNlX3VzZXIpOwotCXAgKz0gc3ByaW50ZihwLCAiU3lzdGVtOlx0XHQlbHVcbiIsIHNlX3N5cyk7Ci0JcCArPSBzcHJpbnRmKHAsICJIYWxmOlx0XHQlbHVcbiIsIHNlX2hhbGYpOwotCXAgKz0gc3ByaW50ZihwLCAiV29yZDpcdFx0JWx1XG4iLCBzZV93b3JkKTsKLQlwICs9IHNwcmludGYocCwgIkRXb3JkOlx0XHQlbHVcbiIsIHNlX2R3b3JkKTsKLQlwICs9IHNwcmludGYocCwgIk11bHRpOlx0XHQlbHVcbiIsIHNlX211bHRpKTsKLQlwICs9IHNwcmludGYocCwgIlVzZXIgZmF1bHRzOlx0JWkgKCVzKVxuIiwgc2VfdXNlcm1vZGUsCisJc2VxX3ByaW50ZihtLCAiVXNlcjpcdFx0JWx1XG4iLCBzZV91c2VyKTsKKwlzZXFfcHJpbnRmKG0sICJTeXN0ZW06XHRcdCVsdVxuIiwgc2Vfc3lzKTsKKwlzZXFfcHJpbnRmKG0sICJIYWxmOlx0XHQlbHVcbiIsIHNlX2hhbGYpOworCXNlcV9wcmludGYobSwgIldvcmQ6XHRcdCVsdVxuIiwgc2Vfd29yZCk7CisJc2VxX3ByaW50ZihtLCAiRFdvcmQ6XHRcdCVsdVxuIiwgc2VfZHdvcmQpOworCXNlcV9wcmludGYobSwgIk11bHRpOlx0XHQlbHVcbiIsIHNlX211bHRpKTsKKwlzZXFfcHJpbnRmKG0sICJVc2VyIGZhdWx0czpcdCVpICglcylcbiIsIHNlX3VzZXJtb2RlLAogCQkJc2VfdXNlcm1vZGVfYWN0aW9uW3NlX3VzZXJtb2RlXSk7Ci0JcCArPSBzcHJpbnRmKHAsICJLZXJuZWwgZmF1bHRzOlx0JWkgKGZpeHVwJXMpXG4iLCBzZV9rZXJubW9kZV93YXJuLAorCXNlcV9wcmludGYobSwgIktlcm5lbCBmYXVsdHM6XHQlaSAoZml4dXAlcylcbiIsIHNlX2tlcm5tb2RlX3dhcm4sCiAJCQlzZV9rZXJubW9kZV93YXJuID8gIit3YXJuIiA6ICIiKTsKLQotCWxlbiA9IChwIC0gcGFnZSkgLSBvZmY7Ci0JaWYgKGxlbiA8IDApCi0JCWxlbiA9IDA7Ci0KLQkqZW9mID0gKGxlbiA8PSBjb3VudCkgPyAxIDogMDsKLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCi0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX2FsaWdubWVudF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQorc3RhdGljIGludCBhbGlnbm1lbnRfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogeworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhbGlnbm1lbnRfcHJvY19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgYWxpZ25tZW50X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJaW50ICpkYXRhID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCWNoYXIgbW9kZTsKIAogCWlmIChjb3VudCA+IDApIHsKIAkJaWYgKGdldF91c2VyKG1vZGUsIGJ1ZmZlcikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKG1vZGUgPj0gJzAnICYmIG1vZGUgPD0gJzUnKQotCQkJc2VfdXNlcm1vZGUgPSBtb2RlIC0gJzAnOworCQkJKmRhdGEgPSBtb2RlIC0gJzAnOwogCX0KIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19hbGlnbm1lbnRfa2Vybl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0JY2hhciBtb2RlOwotCi0JaWYgKGNvdW50ID4gMCkgewotCQlpZiAoZ2V0X3VzZXIobW9kZSwgYnVmZmVyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAobW9kZSA+PSAnMCcgJiYgbW9kZSA8PSAnMScpCi0JCQlzZV9rZXJubW9kZV93YXJuID0gbW9kZSAtICcwJzsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWxpZ25tZW50X3Byb2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gYWxpZ25tZW50X3Byb2Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS53cml0ZQkJPSBhbGlnbm1lbnRfcHJvY193cml0ZSwKK307CiAjZW5kaWYKIAogc3RhdGljIHZvaWQgZHVtcF9tZW0oY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGJvdHRvbSwgdW5zaWduZWQgbG9uZyB0b3ApCkBAIC05NDUsMTQgKzkzNCw5IEBACiAJc2V0X2V4Y2VwdGlvbl90YWJsZV9ldnQoMHg4MDAsIGRvX3Jlc2VydmVkX2luc3QpOwogCXNldF9leGNlcHRpb25fdGFibGVfZXZ0KDB4ODIwLCBkb19pbGxlZ2FsX3Nsb3RfaW5zdCk7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19TSF9GUFUpCi0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMKLQlzZXRfZXhjZXB0aW9uX3RhYmxlX2V2dCgweGQ4MCwgZnB1X3N0YXRlX3Jlc3RvcmVfdHJhcF9oYW5kbGVyKTsKLQlzZXRfZXhjZXB0aW9uX3RhYmxlX2V2dCgweGRhMCwgZnB1X3N0YXRlX3Jlc3RvcmVfdHJhcF9oYW5kbGVyKTsKLSNlbHNlCiAJc2V0X2V4Y2VwdGlvbl90YWJsZV9ldnQoMHg4MDAsIGZwdV9zdGF0ZV9yZXN0b3JlX3RyYXBfaGFuZGxlcik7CiAJc2V0X2V4Y2VwdGlvbl90YWJsZV9ldnQoMHg4MjAsIGZwdV9zdGF0ZV9yZXN0b3JlX3RyYXBfaGFuZGxlcik7CiAjZW5kaWYKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0NQVV9TSDIKIAlzZXRfZXhjZXB0aW9uX3RhYmxlX3ZlYyhUUkFQX0FERFJFU1NfRVJST1IsIGFkZHJlc3NfZXJyb3JfdHJhcF9oYW5kbGVyKTsKQEAgLTEwMTEsMjAgKzk5NSwxNiBAQAogCWlmICghZGlyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlcyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJhbGlnbm1lbnQiLCBTX0lXVVNSIHwgU19JUlVHTywgZGlyKTsKKwlyZXMgPSBwcm9jX2NyZWF0ZV9kYXRhKCJhbGlnbm1lbnQiLCBTX0lXVVNSIHwgU19JUlVHTywgZGlyLAorCQkJICAgICAgICZhbGlnbm1lbnRfcHJvY19mb3BzLCAmc2VfdXNlcm1vZGUpOwogCWlmICghcmVzKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlcy0+cmVhZF9wcm9jID0gcHJvY19hbGlnbm1lbnRfcmVhZDsKLQlyZXMtPndyaXRlX3Byb2MgPSBwcm9jX2FsaWdubWVudF93cml0ZTsKLQotICAgICAgICByZXMgPSBjcmVhdGVfcHJvY19lbnRyeSgia2VybmVsX2FsaWdubWVudCIsIFNfSVdVU1IgfCBTX0lSVUdPLCBkaXIpOworICAgICAgICByZXMgPSBwcm9jX2NyZWF0ZV9kYXRhKCJrZXJuZWxfYWxpZ25tZW50IiwgU19JV1VTUiB8IFNfSVJVR08sIGRpciwKKwkJCSAgICAgICAmYWxpZ25tZW50X3Byb2NfZm9wcywgJnNlX2tlcm5tb2RlX3dhcm4pOwogICAgICAgICBpZiAoIXJlcykKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKIAotICAgICAgICByZXMtPnJlYWRfcHJvYyA9IHByb2NfYWxpZ25tZW50X3JlYWQ7Ci0gICAgICAgIHJlcy0+d3JpdGVfcHJvYyA9IHByb2NfYWxpZ25tZW50X2tlcm5fd3JpdGU7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWIvTWFrZWZpbGUgYi9hcmNoL3NoL2xpYi9NYWtlZmlsZQppbmRleCBhOTY5YjQ3Li5kYWI0ZDIxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2xpYi9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIFN1cGVySC1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KICMKIAotbGliLXkgID0gZGVsYXkubyBtZW1zZXQubyBtZW1tb3ZlLm8gbWVtY2hyLm8gXAorbGliLXkgID0gZGVsYXkubyBtZW1tb3ZlLm8gbWVtY2hyLm8gXAogCSBjaGVja3N1bS5vIHN0cmxlbi5vIGRpdjY0Lm8gZGl2NjQtZ2VuZXJpYy5vCiAKICMgRXh0cmFjdGVkIGZyb20gbGliZ2NjCkBAIC0yMyw4ICsyMywxMSBAQAogbWVtY3B5LXkJCQk6PSBtZW1jcHkubwogbWVtY3B5LSQoQ09ORklHX0NQVV9TSDQpCTo9IG1lbWNweS1zaDQubwogCittZW1zZXQteQkJCTo9IG1lbXNldC5vCittZW1zZXQtJChDT05GSUdfQ1BVX1NINCkJOj0gbWVtc2V0LXNoNC5vCisKIGxpYi0kKENPTkZJR19NTVUpCQkrPSBjb3B5X3BhZ2UubyBfX2NsZWFyX3VzZXIubwogbGliLSQoQ09ORklHX01DT1VOVCkJCSs9IG1jb3VudC5vCi1saWIteQkJCQkrPSAkKG1lbWNweS15KSAkKHVkaXZzaTMteSkKK2xpYi15CQkJCSs9ICQobWVtY3B5LXkpICQobWVtc2V0LXkpICQodWRpdnNpMy15KQogCiBFWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWIvbWVtc2V0LXNoNC5TIGIvYXJjaC9zaC9saWIvbWVtc2V0LXNoNC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNmUzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2xpYi9tZW1zZXQtc2g0LlMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAibWVtc2V0IiBpbXBsZW1lbnRhdGlvbiBmb3IgU0g0CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqIENvcHlyaWdodCAoYykgMjAwOSAgU1RNaWNyb2VsZWN0cm9uaWNzIExpbWl0ZWQKKyAqIEF1dGhvcjogU3R1YXJ0IE1lbmVmeSA8c3R1YXJ0Lm1lbmVmeTpzdC5jb20+CisgKi8KKworLyoKKyAqICAgICAgICAgICAgdm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworRU5UUlkobWVtc2V0KQorCW1vdgkjMTIscjAKKwlhZGQJcjYscjQKKwljbXAvZ3QJcjYscjAKKwlidC9zCTQwZgkJISBpZiBpdCdzIHRvbyBzbWFsbCwgc2V0IGEgYnl0ZSBhdCBvbmNlCisJIG1vdglyNCxyMAorCWFuZAkjMyxyMAorCWNtcC9lcQkjMCxyMAorCWJ0L3MJMmYJCSEgSXQncyBhbGlnbmVkCisJIHN1YglyMCxyNgorMToKKwlkdAlyMAorCWJmL3MJMWIKKwkgbW92LmIJcjUsQC1yNAorMjoJCQkJISBtYWtlIFZWVlYKKwlleHR1LmIJcjUscjUKKwlzd2FwLmIJcjUscjAJCSEgICBWMAorCW9yCXIwLHI1CQkhICAgVlYKKwlzd2FwLncJcjUscjAJCSEgVlYwMAorCW9yCXIwLHI1CQkhIFZWVlYKKworCSEgQ2hlY2sgaWYgZW5vdWdoIGJ5dGVzIG5lZWQgdG8gYmUgY29waWVkIHRvIGJlIHdvcnRoIHRoZSBiaWcgbG9vcAorCW1vdgkjMHg0MCwgcjAJISAoTVQpCisJY21wL2d0CXI2LHIwCQkhIChNVCkgIDY0ID4gbGVuID0+IHNsb3cgbG9vcAorCisJYnQvcwkyMmYKKwkgbW92CXI2LHIwCisKKwkhIGFsaWduIHRoZSBkc3QgdG8gdGhlIGNhY2hlIGJsb2NrIHNpemUgaWYgbmVjZXNzYXJ5CisJbW92CXI0LCByMworCW1vdgkjfigweDFmKSwgcjEKKworCWFuZAlyMywgcjEKKwljbXAvZXEJcjMsIHIxCisKKwlidC9zCTExZgkJISBkc3QgaXMgYWxyZWFkeSBhbGlnbmVkCisJIHN1YglyMSwgcjMJCSEgcjMtcjEgLT4gcjMKKwlzaGxyMglyMwkJISBudW1iZXIgb2YgbG9vcHMKKworMTA6CW1vdi5sCXI1LEAtcjQKKwlkdAlyMworCWJmL3MJMTBiCisJIGFkZAkjLTQsIHI2CisKKzExOgkhIGRzdCBpcyAzMmJ5dGUgYWxpZ25lZAorCW1vdglyNixyMgorCW1vdgkjLTUscjAKKwlzaGxkCXIwLHIyCQkhIG51bWJlciBvZiBsb29wcworCisJYWRkCSMtMzIsIHI0CisJbW92CXI1LCByMAorMTI6CisJbW92Y2EubAlyMCxAcjQKKwltb3YubAlyNSxAKDQsIHI0KQorCW1vdi5sCXI1LEAoOCwgcjQpCisJbW92LmwJcjUsQCgxMixyNCkKKwltb3YubAlyNSxAKDE2LHI0KQorCW1vdi5sCXI1LEAoMjAscjQpCisJYWRkCSMtMHgyMCwgcjYKKwltb3YubAlyNSxAKDI0LHI0KQorCWR0CXIyCisJbW92LmwJcjUsQCgyOCxyNCkKKwliZi9zCTEyYgorCSBhZGQJIy0zMiwgcjQKKworCWFkZAkjMzIsIHI0CisJbW92CSM4LCByMAorCWNtcC9nZQlyMCwgcjYKKwliZgk0MGYKKworCW1vdglyNixyMAorMjI6CisJc2hscjIJcjAKKwlzaGxyCXIwCQkhIHIwID0gcjYgPj4gMworMzoKKwlkdAlyMAorCW1vdi5sCXI1LEAtcjQJCSEgc2V0IDgtYnl0ZSBhdCBvbmNlCisJYmYvcwkzYgorCSBtb3YubAlyNSxALXI0CisJIQorCW1vdgkjNyxyMAorCWFuZAlyMCxyNgorCisJISBmaWxsIGJ5dGVzIChsZW5ndGggbWF5IGJlIHplcm8pCis0MDoJdHN0CXI2LHI2CisJYnQJNWYKKzQ6CisJZHQJcjYKKwliZi9zCTRiCisJIG1vdi5iCXI1LEAtcjQKKzU6CisJcnRzCisJIG1vdglyNCxyMApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMgYi9hcmNoL3NoL21hdGgtZW11L21hdGguYwppbmRleCBhYzJkN2FiLi5kNmMxNWNhIDEwMDY0NAotLS0gYS9hcmNoL3NoL21hdGgtZW11L21hdGguYworKysgYi9hcmNoL3NoL21hdGgtZW11L21hdGguYwpAQCAtNTU4LDcgKzU1OCw3IEBACiAJCQkJCSAgICAoZmluc24gPj4gOCkgJiAweGYpOwogCQkJdHNrLT50aHJlYWQuZnB1LmhhcmQuZnBzY3IgJj0KIAkJCQl+KEZQU0NSX0NBVVNFX01BU0sgfCBGUFNDUl9GTEFHX01BU0spOwotCQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKKwkJCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzIHw9IFRTX1VTRURGUFU7CiAJCX0gZWxzZSB7CiAJCQlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOwogCQkJaW5mby5zaV9lcnJubyA9IDA7CkBAIC02MTksMTAgKzYxOSwxMCBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcHUgPSAmKHRzay0+dGhyZWFkLmZwdS5zb2Z0KTsKIAotCWlmICghdGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfVVNFREZQVSkpIHsKKwlpZiAoISh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpKSB7CiAJCS8qIGluaXRpYWxpemUgb25jZS4gKi8KIAkJZnB1X2luaXQoZnB1KTsKLQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsKIAl9CiAKIAlyZXR1cm4gZnB1X2VtdWxhdGUoaW5zdCwgZnB1LCByZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vS2NvbmZpZyBiL2FyY2gvc2gvbW0vS2NvbmZpZwppbmRleCA3ZjdiNTJmLi4wZTdiYThlIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL0tjb25maWcKKysrIGIvYXJjaC9zaC9tbS9LY29uZmlnCkBAIC04Miw4ICs4Miw3IEBACiAKIGNvbmZpZyBQTUJfRU5BQkxFCiAJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKLQlkZXBlbmRzIG9uIE1NVSAmJiBFWFBFUklNRU5UQUwgJiYgKENQVV9TVUJUWVBFX1NINzc1NyB8fCBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgQ1BVX1NVQlRZUEVfU0g3Nzg1KQotCXNlbGVjdCAzMkJJVAorCWRlcGVuZHMgb24gTU1VICYmIEVYUEVSSU1FTlRBTCAmJiBDUFVfU0g0QQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCBwaHlzaWNhbCBhZGRyZXNzaW5nIHdpbGwgYmUgZXh0ZW5kZWQgdG8KQEAgLTk3LDggKzk2LDcgQEAKIAogY29uZmlnIFBNQgogCWJvb2wgIlBNQiIKLQlkZXBlbmRzIG9uIE1NVSAmJiBFWFBFUklNRU5UQUwgJiYgKENQVV9TVUJUWVBFX1NINzc1NyB8fCBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgQ1BVX1NVQlRZUEVfU0g3Nzg1KQotCXNlbGVjdCAzMkJJVAorCWRlcGVuZHMgb24gTU1VICYmIEVYUEVSSU1FTlRBTCAmJiBDUFVfU0g0QQogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCBwaHlzaWNhbCBhZGRyZXNzaW5nIHdpbGwgYmUgZXh0ZW5kZWQgdG8KIAkgIDMyLWJpdHMgdGhyb3VnaCB0aGUgU0gtNEEgUE1CLiBJZiB0aGlzIGlzIG5vdCBzZXQsIGxlZ2FjeQpAQCAtMTA2LDkgKzEwNCw3IEBACiAKIGNvbmZpZyBQTUJfRklYRUQKIAlib29sICJmaXhlZCBQTUIiCi0JZGVwZW5kcyBvbiBNTVUgJiYgRVhQRVJJTUVOVEFMICYmIChDUFVfU1VCVFlQRV9TSDc3NTcgfHwgXAotCQkJCQkgICBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgXAotCQkJCQkgICBDUFVfU1VCVFlQRV9TSDc3ODUpCisJZGVwZW5kcyBvbiBNTVUgJiYgRVhQRVJJTUVOVEFMICYmIENQVV9TSDRBCiAJc2VsZWN0IDMyQklUCiAJaGVscAogCSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgZml4ZWQgUE1CIG1hcHBpbmdzIGFyZSBpbmhlcml0ZWQKQEAgLTI1OCw2ICsyNTQsMTUgQEAKIAogc291cmNlICJtbS9LY29uZmlnIgogCitjb25maWcgU0NIRURfTUMKKwlib29sICJNdWx0aS1jb3JlIHNjaGVkdWxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCB5CisJaGVscAorCSAgTXVsdGktY29yZSBzY2hlZHVsZXIgc3VwcG9ydCBpbXByb3ZlcyB0aGUgQ1BVIHNjaGVkdWxlcidzIGRlY2lzaW9uCisJICBtYWtpbmcgd2hlbiBkZWFsaW5nIHdpdGggbXVsdGktY29yZSBDUFUgY2hpcHMgYXQgYSBjb3N0IG9mIHNsaWdodGx5CisJICBpbmNyZWFzZWQgb3ZlcmhlYWQgaW4gc29tZSBwbGFjZXMuIElmIHVuc3VyZSBzYXkgTiBoZXJlLgorCiBlbmRtZW51CiAKIG1lbnUgIkNhY2hlIGNvbmZpZ3VyYXRpb24iCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL01ha2VmaWxlIGIvYXJjaC9zaC9tbS9NYWtlZmlsZQppbmRleCAzNzU5YmY4Li44YTcwNTM1IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvbW0vTWFrZWZpbGUKQEAgLTMzLDggKzMzLDcgQEAKIGVuZGlmCiAKIG9iai0kKENPTkZJR19IVUdFVExCX1BBR0UpCSs9IGh1Z2V0bGJwYWdlLm8KLW9iai0kKENPTkZJR19QTUIpCQkrPSBwbWIubwotb2JqLSQoQ09ORklHX1BNQl9GSVhFRCkJCSs9IHBtYi1maXhlZC5vCitvYmotJChDT05GSUdfUE1CX0VOQUJMRSkJKz0gcG1iLm8KIG9iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCiAKICMgU3BlY2lhbCBmbGFncyBmb3IgZmF1bHRfNjQuby4gIFRoaXMgcHV0cyByZXN0cmljdGlvbnMgb24gdGhlIG51bWJlciBvZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g0LmMKaW5kZXggYjdmMjM1Yy4uZjM2YTA4YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLXNoNC5jCkBAIC0yLDcgKzIsNyBAQAogICogYXJjaC9zaC9tbS9jYWNoZS1zaDQuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiAgTmlpYmUgWXV0YWthCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA3ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA5ICBQYXVsIE11bmR0CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJpY2hhcmQgQ3Vybm93CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU1RNaWNyb2VsZWN0cm9uaWNzIChSJkQpIEx0ZC4KICAqCkBAIC0xNSw2ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIApAQCAtMjMsMjEgKzI1LDEyIEBACiAgKiBmbHVzaGluZy4gQW55dGhpbmcgZXhjZWVkaW5nIHRoaXMgd2lsbCBzaW1wbHkgZmx1c2ggdGhlIGRjYWNoZSBpbiBpdHMKICAqIGVudGlyZXR5LgogICovCi0jZGVmaW5lIE1BWF9EQ0FDSEVfUEFHRVMJNjQJLyogWFhYOiBUdW5lIGZvciB3YXlzICovCiAjZGVmaW5lIE1BWF9JQ0FDSEVfUEFHRVMJMzIKIAogc3RhdGljIHZvaWQgX19mbHVzaF9jYWNoZV9vbmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBoeXMsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBleGVjX29mZnNldCk7CiAKIC8qCi0gKiBUaGlzIGlzIGluaXRpYWxpc2VkIGhlcmUgdG8gZW5zdXJlIHRoYXQgaXQgaXMgbm90IHBsYWNlZCBpbiB0aGUgQlNTLiAgSWYKLSAqIHRoYXQgd2VyZSB0byBoYXBwZW4sIG5vdGUgdGhhdCBjYWNoZV9pbml0IGdldHMgY2FsbGVkIGJlZm9yZSB0aGUgQlNTIGlzCi0gKiBjbGVhcmVkLCBzbyB0aGlzIHdvdWxkIGdldCBudWxsZWQgb3V0IHdoaWNoIHdvdWxkIGJlIGhvcGVsZXNzLgotICovCi1zdGF0aWMgdm9pZCAoKl9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4pKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpID0KLQkodm9pZCAoKikodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpMHhkZWFkYmVlZjsKLQotLyoKICAqIFdyaXRlIGJhY2sgdGhlIHJhbmdlIG9mIEQtY2FjaGUsIGFuZCBwdXJnZSB0aGUgSS1jYWNoZS4KICAqCiAgKiBDYWxsZWQgZnJvbSBrZXJuZWwvbW9kdWxlLmM6c3lzX2luaXRfbW9kdWxlIGFuZCByb3V0aW5lIGZvciBhLm91dCBmb3JtYXQsCkBAIC05NywxNSArOTAsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBleGVjX29mZnNldCA9IDA7CiAKIAkvKgotCSAqIEFsbCB0eXBlcyBvZiBTSC00IHJlcXVpcmUgUEMgdG8gYmUgaW4gUDIgdG8gb3BlcmF0ZSBvbiB0aGUgSS1jYWNoZS4KLQkgKiBTb21lIHR5cGVzIG9mIFNILTQgcmVxdWlyZSBQQyB0byBiZSBpbiBQMiB0byBvcGVyYXRlIG9uIHRoZSBELWNhY2hlLgorCSAqIEFsbCB0eXBlcyBvZiBTSC00IHJlcXVpcmUgUEMgdG8gYmUgdW5jYWNoZWQgdG8gb3BlcmF0ZSBvbiB0aGUgSS1jYWNoZS4KKwkgKiBTb21lIHR5cGVzIG9mIFNILTQgcmVxdWlyZSBQQyB0byBiZSB1bmNhY2hlZCB0byBvcGVyYXRlIG9uIHRoZSBELWNhY2hlLgogCSAqLwogCWlmICgoYm9vdF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfUDJfRkxVU0hfQlVHKSB8fAogCSAgICAoc3RhcnQgPCBDQUNIRV9PQ19BRERSRVNTX0FSUkFZKSkKLQkJZXhlY19vZmZzZXQgPSAweDIwMDAwMDAwOworCQlleGVjX29mZnNldCA9IGNhY2hlZF90b191bmNhY2hlZDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfX2ZsdXNoX2NhY2hlX29uZShzdGFydCB8IFNIX0NBQ0hFX0FTU09DLCBQMVNFR0FERFIocGh5cyksIGV4ZWNfb2Zmc2V0KTsKKwlfX2ZsdXNoX2NhY2hlX29uZShzdGFydCwgcGh5cywgZXhlY19vZmZzZXQpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIApAQCAtMTI0LDcgKzExNyw3IEBACiAJZWxzZQogI2VuZGlmCiAJewotCQl1bnNpZ25lZCBsb25nIHBoeXMgPSBQSFlTQUREUihwYWdlX2FkZHJlc3MocGFnZSkpOworCQl1bnNpZ25lZCBsb25nIHBoeXMgPSBwYWdlX3RvX3BoeXMocGFnZSk7CiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CiAJCWludCBpLCBuOwogCkBAIC0xNTksMTAgKzE1MiwyNyBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2RjYWNoZV9hbGwodm9pZCkKK3N0YXRpYyB2b2lkIGZsdXNoX2RjYWNoZV9hbGwodm9pZCkKIHsKLQkoKl9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4pKDBVTCwgYm9vdF9jcHVfZGF0YS5kY2FjaGUud2F5X3NpemUpOwotCXdtYigpOworCXVuc2lnbmVkIGxvbmcgYWRkciwgZW5kX2FkZHIsIGVudHJ5X29mZnNldDsKKworCWVuZF9hZGRyID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWSArCisJCShjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzIDw8CisJCSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdCkgKgorCQkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5czsKKworCWVudHJ5X29mZnNldCA9IDEgPDwgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQ7CisKKwlmb3IgKGFkZHIgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZOyBhZGRyIDwgZW5kX2FkZHI7ICkgeworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCQlfX3Jhd193cml0ZWwoMCwgYWRkcik7IGFkZHIgKz0gZW50cnlfb2Zmc2V0OworCX0KIH0KIAogc3RhdGljIHZvaWQgc2g0X2ZsdXNoX2NhY2hlX2FsbCh2b2lkICp1bnVzZWQpCkBAIC0xNzEsODkgKzE4MSwxMyBAQAogCWZsdXNoX2ljYWNoZV9hbGwoKTsKIH0KIAotc3RhdGljIHZvaWQgX19mbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JdW5zaWduZWQgbG9uZyBkID0gMCwgcCA9IHN0YXJ0ICYgUEFHRV9NQVNLOwotCXVuc2lnbmVkIGxvbmcgYWxpYXNfbWFzayA9IGJvb3RfY3B1X2RhdGEuZGNhY2hlLmFsaWFzX21hc2s7Ci0JdW5zaWduZWQgbG9uZyBuX2FsaWFzZXMgPSBib290X2NwdV9kYXRhLmRjYWNoZS5uX2FsaWFzZXM7Ci0JdW5zaWduZWQgbG9uZyBzZWxlY3RfYml0OwotCXVuc2lnbmVkIGxvbmcgYWxsX2FsaWFzZXNfbWFzazsKLQl1bnNpZ25lZCBsb25nIGFkZHJfb2Zmc2V0OwotCXBnZF90ICpkaXI7Ci0JcG1kX3QgKnBtZDsKLQlwdWRfdCAqcHVkOwotCXB0ZV90ICpwdGU7Ci0JaW50IGk7Ci0KLQlkaXIgPSBwZ2Rfb2Zmc2V0KG1tLCBwKTsKLQlwdWQgPSBwdWRfb2Zmc2V0KGRpciwgcCk7Ci0JcG1kID0gcG1kX29mZnNldChwdWQsIHApOwotCWVuZCA9IFBBR0VfQUxJR04oZW5kKTsKLQotCWFsbF9hbGlhc2VzX21hc2sgPSAoMSA8PCBuX2FsaWFzZXMpIC0gMTsKLQotCWRvIHsKLQkJaWYgKHBtZF9ub25lKCpwbWQpIHx8IHVubGlrZWx5KHBtZF9iYWQoKnBtZCkpKSB7Ci0JCQlwICY9IFBNRF9NQVNLOwotCQkJcCArPSBQTURfU0laRTsKLQkJCXBtZCsrOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgcCk7Ci0KLQkJZG8gewotCQkJdW5zaWduZWQgbG9uZyBwaHlzOwotCQkJcHRlX3QgZW50cnkgPSAqcHRlOwotCi0JCQlpZiAoIShwdGVfdmFsKGVudHJ5KSAmIF9QQUdFX1BSRVNFTlQpKSB7Ci0JCQkJcHRlKys7Ci0JCQkJcCArPSBQQUdFX1NJWkU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXBoeXMgPSBwdGVfdmFsKGVudHJ5KSAmIFBURV9QSFlTX01BU0s7Ci0KLQkJCWlmICgocCBeIHBoeXMpICYgYWxpYXNfbWFzaykgewotCQkJCWQgfD0gMSA8PCAoKHAgJiBhbGlhc19tYXNrKSA+PiBQQUdFX1NISUZUKTsKLQkJCQlkIHw9IDEgPDwgKChwaHlzICYgYWxpYXNfbWFzaykgPj4gUEFHRV9TSElGVCk7Ci0KLQkJCQlpZiAoZCA9PSBhbGxfYWxpYXNlc19tYXNrKQotCQkJCQlnb3RvIGxvb3BfZXhpdDsKLQkJCX0KLQotCQkJcHRlKys7Ci0JCQlwICs9IFBBR0VfU0laRTsKLQkJfSB3aGlsZSAocCA8IGVuZCAmJiAoKHVuc2lnbmVkIGxvbmcpcHRlICYgflBBR0VfTUFTSykpOwotCQlwbWQrKzsKLQl9IHdoaWxlIChwIDwgZW5kKTsKLQotbG9vcF9leGl0OgotCWFkZHJfb2Zmc2V0ID0gMDsKLQlzZWxlY3RfYml0ID0gMTsKLQotCWZvciAoaSA9IDA7IGkgPCBuX2FsaWFzZXM7IGkrKykgewotCQlpZiAoZCAmIHNlbGVjdF9iaXQpIHsKLQkJCSgqX19mbHVzaF9kY2FjaGVfc2VnbWVudF9mbikoYWRkcl9vZmZzZXQsIFBBR0VfU0laRSk7Ci0JCQl3bWIoKTsKLQkJfQotCi0JCXNlbGVjdF9iaXQgPDw9IDE7Ci0JCWFkZHJfb2Zmc2V0ICs9IFBBR0VfU0laRTsKLQl9Ci19Ci0KIC8qCiAgKiBOb3RlIDogKFJQQykgc2luY2UgdGhlIGNhY2hlcyBhcmUgcGh5c2ljYWxseSB0YWdnZWQsIHRoZSBvbmx5IHBvaW50CiAgKiBvZiBmbHVzaF9jYWNoZV9tbSBmb3IgU0gtNCBpcyB0byBnZXQgcmlkIG9mIGFsaWFzZXMgZnJvbSB0aGUKICAqIEQtY2FjaGUuICBUaGUgYXNzdW1wdGlvbiBlbHNld2hlcmUsIGUuZy4gZmx1c2hfY2FjaGVfcmFuZ2UsIGlzIHRoYXQKICAqIGxpbmVzIGNhbiBzdGF5IHJlc2lkZW50IHNvIGxvbmcgYXMgdGhlIHZpcnR1YWwgYWRkcmVzcyB0aGV5IHdlcmUKICAqIGFjY2Vzc2VkIHdpdGggKGhlbmNlIGNhY2hlIHNldCkgaXMgaW4gYWNjb3JkIHdpdGggdGhlIHBoeXNpY2FsCi0gKiBhZGRyZXNzIChpLmUuIHRhZykuICBJdCdzIG5vIGRpZmZlcmVudCBoZXJlLiAgU28gSSByZWNrb24gd2UgZG9uJ3QKLSAqIG5lZWQgdG8gZmx1c2ggdGhlIEktY2FjaGUsIHNpbmNlIGFsaWFzZXMgZG9uJ3QgbWF0dGVyIGZvciB0aGF0LiAgV2UKLSAqIHNob3VsZCB0cnkgdGhhdC4KKyAqIGFkZHJlc3MgKGkuZS4gdGFnKS4gIEl0J3Mgbm8gZGlmZmVyZW50IGhlcmUuCiAgKgogICogQ2FsbGVyIHRha2VzIG1tLT5tbWFwX3NlbS4KICAqLwpAQCAtMjY0LDMzICsxOTgsNyBAQAogCWlmIChjcHVfY29udGV4dChzbXBfcHJvY2Vzc29yX2lkKCksIG1tKSA9PSBOT19DT05URVhUKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIElmIGNhY2hlIGlzIG9ubHkgNGstcGVyLXdheSwgdGhlcmUgYXJlIG5ldmVyIGFueSAnYWxpYXNlcycuICBTaW5jZQotCSAqIHRoZSBjYWNoZSBpcyBwaHlzaWNhbGx5IHRhZ2dlZCwgdGhlIGRhdGEgY2FuIGp1c3QgYmUgbGVmdCBpbiB0aGVyZS4KLQkgKi8KLQlpZiAoYm9vdF9jcHVfZGF0YS5kY2FjaGUubl9hbGlhc2VzID09IDApCi0JCXJldHVybjsKLQotCS8qCi0JICogRG9uJ3QgYm90aGVyIGdyb3ZlbGluZyBhcm91bmQgdGhlIGRjYWNoZSBmb3IgdGhlIFZNQSByYW5nZXMKLQkgKiBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgUFRFcyB0byBtYWtlIGl0IHdvcnRod2hpbGUuCi0JICovCi0JaWYgKG1tLT5ucl9wdGVzID49IE1BWF9EQ0FDSEVfUEFHRVMpCi0JCWZsdXNoX2RjYWNoZV9hbGwoKTsKLQllbHNlIHsKLQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Ci0KLQkJLyoKLQkJICogSW4gdGhpcyBjYXNlIHRoZXJlIGFyZSByZWFzb25hYmx5IHNpemVkIHJhbmdlcyB0byBmbHVzaCwKLQkJICogaXRlcmF0ZSB0aHJvdWdoIHRoZSBWTUEgbGlzdCBhbmQgdGFrZSBjYXJlIG9mIGFueSBhbGlhc2VzLgotCQkgKi8KLQkJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpCi0JCQlfX2ZsdXNoX2NhY2hlX21tKG1tLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCk7Ci0JfQotCi0JLyogT25seSB0b3VjaCB0aGUgaWNhY2hlIGlmIG9uZSBvZiB0aGUgVk1BcyBoYXMgVk1fRVhFQyBzZXQuICovCi0JaWYgKG1tLT5leGVjX3ZtKQotCQlmbHVzaF9pY2FjaGVfYWxsKCk7CisJZmx1c2hfZGNhY2hlX2FsbCgpOwogfQogCiAvKgpAQCAtMzAzLDQ0ICsyMTEsNjMgQEAKIHsKIAlzdHJ1Y3QgZmx1c2hlcl9kYXRhICpkYXRhID0gYXJnczsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBmbiwgcGh5czsKLQl1bnNpZ25lZCBpbnQgYWxpYXNfbWFzazsKKwlpbnQgbWFwX2NvaGVyZW50ID0gMDsKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXZvaWQgKnZhZGRyOwogCiAJdm1hID0gZGF0YS0+dm1hOwotCWFkZHJlc3MgPSBkYXRhLT5hZGRyMTsKKwlhZGRyZXNzID0gZGF0YS0+YWRkcjEgJiBQQUdFX01BU0s7CiAJcGZuID0gZGF0YS0+YWRkcjI7CiAJcGh5cyA9IHBmbiA8PCBQQUdFX1NISUZUOworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwogCiAJaWYgKGNwdV9jb250ZXh0KHNtcF9wcm9jZXNzb3JfaWQoKSwgdm1hLT52bV9tbSkgPT0gTk9fQ09OVEVYVCkKIAkJcmV0dXJuOwogCi0JYWxpYXNfbWFzayA9IGJvb3RfY3B1X2RhdGEuZGNhY2hlLmFsaWFzX21hc2s7CisJcGdkID0gcGdkX29mZnNldCh2bWEtPnZtX21tLCBhZGRyZXNzKTsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7CisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOworCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcmVzcyk7CiAKLQkvKiBXZSBvbmx5IG5lZWQgdG8gZmx1c2ggRC1jYWNoZSB3aGVuIHdlIGhhdmUgYWxpYXMgKi8KLQlpZiAoKGFkZHJlc3NecGh5cykgJiBhbGlhc19tYXNrKSB7Ci0JCS8qIExvb3AgNEsgb2YgdGhlIEQtY2FjaGUgKi8KLQkJZmx1c2hfY2FjaGVfb25lKAotCQkJQ0FDSEVfT0NfQUREUkVTU19BUlJBWSB8IChhZGRyZXNzICYgYWxpYXNfbWFzayksCi0JCQlwaHlzKTsKLQkJLyogTG9vcCBhbm90aGVyIDRLIG9mIHRoZSBELWNhY2hlICovCi0JCWZsdXNoX2NhY2hlX29uZSgKLQkJCUNBQ0hFX09DX0FERFJFU1NfQVJSQVkgfCAocGh5cyAmIGFsaWFzX21hc2spLAotCQkJcGh5cyk7CisJLyogSWYgdGhlIHBhZ2UgaXNuJ3QgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLiAqLworCWlmICghKHB0ZV92YWwoKnB0ZSkgJiBfUEFHRV9QUkVTRU5UKSkKKwkJcmV0dXJuOworCisJaWYgKCh2bWEtPnZtX21tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkpCisJCXZhZGRyID0gTlVMTDsKKwllbHNlIHsKKwkJLyoKKwkJICogVXNlIGttYXBfY29oZXJlbnQgb3Iga21hcF9hdG9taWMgdG8gZG8gZmx1c2hlcyBmb3IKKwkJICogYW5vdGhlciBBU0lEIHRoYW4gdGhlIGN1cnJlbnQgb25lLgorCQkgKi8KKwkJbWFwX2NvaGVyZW50ID0gKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlcyAmJgorCQkJIXRlc3RfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJnBhZ2UtPmZsYWdzKSAmJgorCQkJcGFnZV9tYXBwZWQocGFnZSkpOworCQlpZiAobWFwX2NvaGVyZW50KQorCQkJdmFkZHIgPSBrbWFwX2NvaGVyZW50KHBhZ2UsIGFkZHJlc3MpOworCQllbHNlCisJCQl2YWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKworCQlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpdmFkZHI7CiAJfQogCi0JYWxpYXNfbWFzayA9IGJvb3RfY3B1X2RhdGEuaWNhY2hlLmFsaWFzX21hc2s7Ci0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSB7Ci0JCS8qCi0JCSAqIEV2aWN0IGVudHJpZXMgZnJvbSB0aGUgcG9ydGlvbiBvZiB0aGUgY2FjaGUgZnJvbSB3aGljaCBjb2RlCi0JCSAqIG1heSBoYXZlIGJlZW4gZXhlY3V0ZWQgYXQgdGhpcyBhZGRyZXNzICh2aXJ0dWFsKS4gIFRoZXJlJ3MKLQkJICogbm8gbmVlZCB0byBldmljdCBmcm9tIHRoZSBwb3J0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0JCSAqIHBoeXNpY2FsIGFkZHJlc3MgYXMgZm9yIHRoZSBELWNhY2hlLCBiZWNhdXNlIHdlIGtub3cgdGhlCi0JCSAqIGtlcm5lbCBoYXMgbmV2ZXIgZXhlY3V0ZWQgdGhlIGNvZGUgdGhyb3VnaCBpdHMgaWRlbnRpdHkKLQkJICogdHJhbnNsYXRpb24uCi0JCSAqLwotCQlmbHVzaF9jYWNoZV9vbmUoCi0JCQlDQUNIRV9JQ19BRERSRVNTX0FSUkFZIHwgKGFkZHJlc3MgJiBhbGlhc19tYXNrKSwKLQkJCXBoeXMpOworCWlmIChwYWdlc19kb19hbGlhcyhhZGRyZXNzLCBwaHlzKSkKKwkJZmx1c2hfY2FjaGVfb25lKENBQ0hFX09DX0FERFJFU1NfQVJSQVkgfAorCQkJKGFkZHJlc3MgJiBzaG1fYWxpZ25fbWFzayksIHBoeXMpOworCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKQorCQlmbHVzaF9pY2FjaGVfYWxsKCk7CisKKwlpZiAodmFkZHIpIHsKKwkJaWYgKG1hcF9jb2hlcmVudCkKKwkJCWt1bm1hcF9jb2hlcmVudCh2YWRkcik7CisJCWVsc2UKKwkJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1VTRVIwKTsKIAl9CiB9CiAKQEAgLTM3MywyNCArMzAwLDEwIEBACiAJaWYgKGJvb3RfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlcyA9PSAwKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIERvbid0IGJvdGhlciB3aXRoIHRoZSBsb29rdXAgYW5kIGFsaWFzIGNoZWNrIGlmIHdlIGhhdmUgYQotCSAqIHdpZGUgcmFuZ2UgdG8gY292ZXIsIGp1c3QgYmxvdyBhd2F5IHRoZSBkY2FjaGUgaW4gaXRzCi0JICogZW50aXJldHkgaW5zdGVhZC4gLS0gUEZNLgotCSAqLwotCWlmICgoKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZUKSA+PSBNQVhfRENBQ0hFX1BBR0VTKQotCQlmbHVzaF9kY2FjaGVfYWxsKCk7Ci0JZWxzZQotCQlfX2ZsdXNoX2NhY2hlX21tKHZtYS0+dm1fbW0sIHN0YXJ0LCBlbmQpOworCWZsdXNoX2RjYWNoZV9hbGwoKTsKIAotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykgewotCQkvKgotCQkgKiBUT0RPOiBJcyB0aGlzIHJlcXVpcmVkPz8/ICBOZWVkIHRvIGxvb2sgYXQgaG93IEktY2FjaGUKLQkJICogY29oZXJlbmN5IGlzIGFzc3VyZWQgd2hlbiBuZXcgcHJvZ3JhbXMgYXJlIGxvYWRlZCB0byBzZWUgaWYKLQkJICogdGhpcyBtYXR0ZXJzLgotCQkgKi8KKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCiAJCWZsdXNoX2ljYWNoZV9hbGwoKTsKLQl9CiB9CiAKIC8qKgpAQCAtNDY0LDI0NSArMzc3LDYgQEAKIAl9IHdoaWxlICgtLXdheV9jb3VudCAhPSAwKTsKIH0KIAotLyoKLSAqIEJyZWFrIHRoZSAxLCAyIGFuZCA0IHdheSB2YXJpYW50cyBvZiB0aGlzIG91dCBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucyB0bwotICogYXZvaWQgbmVhcmx5IGFsbCB0aGUgb3ZlcmhlYWQgb2YgaGF2aW5nIHRoZSBjb25kaXRpb25hbCBzdHVmZiBpbiB0aGUgZnVuY3Rpb24KLSAqIGJvZGllcyAoKyB0aGUgMSBhbmQgMiB3YXkgY2FzZXMgYXZvaWQgc2F2aW5nIGFueSByZWdpc3RlcnMgdG9vKS4KLSAqCi0gKiBXZSB3YW50IHRvIGVsaW1pbmF0ZSB1bm5lY2Vzc2FyeSBidXMgdHJhbnNhY3Rpb25zLCBzbyB0aGlzIGNvZGUgdXNlcwotICogYSBub24tb2J2aW91cyB0ZWNobmlxdWUuCi0gKgotICogTG9vcCBvdmVyIGEgY2FjaGUgd2F5IHNpemVkIGJsb2NrIG9mLCBvbmUgY2FjaGUgbGluZSBhdCBhIHRpbWUuIEZvciBlYWNoCi0gKiBsaW5lLCB1c2UgbW92Y2EuYSB0byBjYXVzZSB0aGUgY3VycmVudCBjYWNoZSBsaW5lIGNvbnRlbnRzIHRvIGJlIHdyaXR0ZW4KLSAqIGJhY2ssIGJ1dCB3aXRob3V0IHJlYWRpbmcgYW55dGhpbmcgZnJvbSBtYWluIG1lbW9yeS4gSG93ZXZlciB0aGlzIGhhcyB0aGUKLSAqIHNpZGUgZWZmZWN0IHRoYXQgdGhlIGNhY2hlIGlzIG5vdyBjYWNoaW5nIHRoYXQgbWVtb3J5IGxvY2F0aW9uLiBTbyBmb2xsb3cKLSAqIHRoaXMgd2l0aCBhIGNhY2hlIGludmFsaWRhdGUgdG8gbWFyayB0aGUgY2FjaGUgbGluZSBpbnZhbGlkLiBBbmQgZG8gYWxsCi0gKiB0aGlzIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCwgdG8gYXZvaWQgdGhlIGNhY2hlIGxpbmUgYmVpbmcgYWNjaWRlbnRseQotICogZXZpY3RlZCB3aGlsZSBpdCBpcyBob2xkaW5nIGdhcmJhZ2UuCi0gKgotICogVGhpcyBhbHNvIGJyZWFrcyBpbiBhIG51bWJlciBvZiBjaXJjdW1zdGFuY2VzOgotICogLSBpZiB0aGVyZSBhcmUgbW9kaWZpY2F0aW9ucyB0byB0aGUgcmVnaW9uIG9mIG1lbW9yeSBqdXN0IGFib3ZlCi0gKiAgIGVtcHR5X3plcm9fcGFnZSAoZm9yIGV4YW1wbGUgYmVjYXVzZSBhIGJyZWFrcG9pbnQgaGFzIGJlZW4gcGxhY2VkCi0gKiAgIHRoZXJlKSwgdGhlbiB0aGVzZSBjYW4gYmUgbG9zdC4KLSAqCi0gKiAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1lbW9yeSBhZGRyZXNzIHdoaWNoIHRoZSBjYWNoZSB0ZW1wb3JhcmlseQotICogICBjYWNoZXMgaW4gdGhlIGFib3ZlIGRlc2NyaXB0aW9uIGlzIGVtcHR5X3plcm9fcGFnZS4gU28gdGhlCi0gKiAgIG1vdmNhLmwgaGl0cyB0aGUgY2FjaGUgKGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBtaXNzZXMsIG9yIGF0IGxlYXN0Ci0gKiAgIGlzbid0IGRpcnR5KSwgbW9kaWZpZXMgdGhlIGxpbmUgYW5kIHRoZW4gaW52YWxpZGF0ZXMgaXQsIGxvc2luZyB0aGUKLSAqICAgcmVxdWlyZWQgY2hhbmdlLgotICoKLSAqIC0gSWYgY2FjaGVzIGFyZSBkaXNhYmxlZCBvciBjb25maWd1cmVkIGluIHdyaXRlLXRocm91Z2ggbW9kZSwgdGhlbgotICogICB0aGUgbW92Y2EubCB3cml0ZXMgZ2FyYmFnZSBkaXJlY3RseSBpbnRvIG1lbW9yeS4KLSAqLwotc3RhdGljIHZvaWQgX19mbHVzaF9kY2FjaGVfc2VnbWVudF93cml0ZXRocm91Z2godW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCQkJICAgICAgICB1bnNpZ25lZCBsb25nIGV4dGVudF9wZXJfd2F5KQotewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlpbnQgaTsKLQotCWFkZHIgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZIHwgKHN0YXJ0ICYgY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9tYXNrKTsKLQotCXdoaWxlIChleHRlbnRfcGVyX3dheSkgewotCQlmb3IgKGkgPSAwOyBpIDwgY3B1X2RhdGEtPmRjYWNoZS53YXlzOyBpKyspCi0JCQlfX3Jhd193cml0ZWwoMCwgYWRkciArIGNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IgKiBpKTsKLQotCQlhZGRyICs9IGNwdV9kYXRhLT5kY2FjaGUubGluZXN6OwotCQlleHRlbnRfcGVyX3dheSAtPSBjcHVfZGF0YS0+ZGNhY2hlLmxpbmVzejsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfMXdheSh1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJCQl1bnNpZ25lZCBsb25nIGV4dGVudF9wZXJfd2F5KQotewotCXVuc2lnbmVkIGxvbmcgb3JpZ19zciwgc3Jfd2l0aF9ibDsKLQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKLQl1bnNpZ25lZCBsb25nIHdheV9pbmNyLCBsaW5lc3osIHdheV9zaXplOwotCXN0cnVjdCBjYWNoZV9pbmZvICpkY2FjaGU7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhMCwgYTBlOwotCi0JYXNtIHZvbGF0aWxlKCJzdGMgc3IsICUwIiA6ICI9ciIgKG9yaWdfc3IpKTsKLQlzcl93aXRoX2JsID0gb3JpZ19zciB8ICgxPDwyOCk7Ci0JYmFzZV9hZGRyID0gKCh1bnNpZ25lZCBsb25nKSZlbXB0eV96ZXJvX3BhZ2VbMF0pOwotCi0JLyoKLQkgKiBUaGUgcHJldmlvdXMgY29kZSBhbGlnbmVkIGJhc2VfYWRkciB0byAxNmssIGkuZS4gdGhlIHdheV9zaXplIG9mIGFsbAotCSAqIGV4aXN0aW5nIFNILTQgRC1jYWNoZXMuICBXaGlsc3QgSSBkb24ndCBzZWUgYSBuZWVkIHRvIGhhdmUgdGhpcwotCSAqIGFsaWduZWQgdG8gYW55IGJldHRlciB0aGFuIHRoZSBjYWNoZSBsaW5lIHNpemUgKHdoaWNoIGl0IHdpbGwgYmUKLQkgKiBhbnl3YXkgYnkgY29uc3RydWN0aW9uKSwgbGV0J3MgYWxpZ24gaXQgdG8gYXQgbGVhc3QgdGhlIHdheV9zaXplIG9mCi0JICogYW55IGV4aXN0aW5nIG9yIGNvbmNlaXZhYmxlIFNILTQgRC1jYWNoZS4gIC0tIFJQQwotCSAqLwotCWJhc2VfYWRkciA9ICgoYmFzZV9hZGRyID4+IDE2KSA8PCAxNik7Ci0JYmFzZV9hZGRyIHw9IHN0YXJ0OwotCi0JZGNhY2hlID0gJmJvb3RfY3B1X2RhdGEuZGNhY2hlOwotCWxpbmVzeiA9IGRjYWNoZS0+bGluZXN6OwotCXdheV9pbmNyID0gZGNhY2hlLT53YXlfaW5jcjsKLQl3YXlfc2l6ZSA9IGRjYWNoZS0+d2F5X3NpemU7Ci0KLQlhMCA9IGJhc2VfYWRkcjsKLQlhMGUgPSBiYXNlX2FkZHIgKyBleHRlbnRfcGVyX3dheTsKLQlkbyB7Ci0JCWFzbSB2b2xhdGlsZSgibGRjICUwLCBzciIgOiA6ICJyIiAoc3Jfd2l0aF9ibCkpOwotCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCi0JCQkgICAgICJvY2JpIEAlMCIgOiA6ICJyIiAoYTApKTsKLQkJYTAgKz0gbGluZXN6OwotCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCi0JCQkgICAgICJvY2JpIEAlMCIgOiA6ICJyIiAoYTApKTsKLQkJYTAgKz0gbGluZXN6OwotCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCi0JCQkgICAgICJvY2JpIEAlMCIgOiA6ICJyIiAoYTApKTsKLQkJYTAgKz0gbGluZXN6OwotCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCi0JCQkgICAgICJvY2JpIEAlMCIgOiA6ICJyIiAoYTApKTsKLQkJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyIiA6IDogInIiIChvcmlnX3NyKSk7Ci0JCWEwICs9IGxpbmVzejsKLQl9IHdoaWxlIChhMCA8IGEwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfMndheSh1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJCQl1bnNpZ25lZCBsb25nIGV4dGVudF9wZXJfd2F5KQotewotCXVuc2lnbmVkIGxvbmcgb3JpZ19zciwgc3Jfd2l0aF9ibDsKLQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKLQl1bnNpZ25lZCBsb25nIHdheV9pbmNyLCBsaW5lc3osIHdheV9zaXplOwotCXN0cnVjdCBjYWNoZV9pbmZvICpkY2FjaGU7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhMCwgYTEsIGEwZTsKLQotCWFzbSB2b2xhdGlsZSgic3RjIHNyLCAlMCIgOiAiPXIiIChvcmlnX3NyKSk7Ci0Jc3Jfd2l0aF9ibCA9IG9yaWdfc3IgfCAoMTw8MjgpOwotCWJhc2VfYWRkciA9ICgodW5zaWduZWQgbG9uZykmZW1wdHlfemVyb19wYWdlWzBdKTsKLQotCS8qIFNlZSBjb21tZW50IHVuZGVyIDEtd2F5IGFib3ZlICovCi0JYmFzZV9hZGRyID0gKChiYXNlX2FkZHIgPj4gMTYpIDw8IDE2KTsKLQliYXNlX2FkZHIgfD0gc3RhcnQ7Ci0KLQlkY2FjaGUgPSAmYm9vdF9jcHVfZGF0YS5kY2FjaGU7Ci0JbGluZXN6ID0gZGNhY2hlLT5saW5lc3o7Ci0Jd2F5X2luY3IgPSBkY2FjaGUtPndheV9pbmNyOwotCXdheV9zaXplID0gZGNhY2hlLT53YXlfc2l6ZTsKLQotCWEwID0gYmFzZV9hZGRyOwotCWExID0gYTAgKyB3YXlfaW5jcjsKLQlhMGUgPSBiYXNlX2FkZHIgKyBleHRlbnRfcGVyX3dheTsKLQlkbyB7Ci0JCWFzbSB2b2xhdGlsZSgibGRjICUwLCBzciIgOiA6ICJyIiAoc3Jfd2l0aF9ibCkpOwotCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCi0JCQkgICAgICJtb3ZjYS5sIHIwLCBAJTFcblx0IgotCQkJICAgICAib2NiaSBAJTBcblx0IgotCQkJICAgICAib2NiaSBAJTEiIDogOgotCQkJICAgICAiciIgKGEwKSwgInIiIChhMSkpOwotCQlhMCArPSBsaW5lc3o7Ci0JCWExICs9IGxpbmVzejsKLQkJYXNtIHZvbGF0aWxlKCJtb3ZjYS5sIHIwLCBAJTBcblx0IgotCQkJICAgICAibW92Y2EubCByMCwgQCUxXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUwXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUxIiA6IDoKLQkJCSAgICAgInIiIChhMCksICJyIiAoYTEpKTsKLQkJYTAgKz0gbGluZXN6OwotCQlhMSArPSBsaW5lc3o7Ci0JCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKLQkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMVxuXHQiCi0JCQkgICAgICJvY2JpIEAlMFxuXHQiCi0JCQkgICAgICJvY2JpIEAlMSIgOiA6Ci0JCQkgICAgICJyIiAoYTApLCAiciIgKGExKSk7Ci0JCWEwICs9IGxpbmVzejsKLQkJYTEgKz0gbGluZXN6OwotCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCi0JCQkgICAgICJtb3ZjYS5sIHIwLCBAJTFcblx0IgotCQkJICAgICAib2NiaSBAJTBcblx0IgotCQkJICAgICAib2NiaSBAJTEiIDogOgotCQkJICAgICAiciIgKGEwKSwgInIiIChhMSkpOwotCQlhc20gdm9sYXRpbGUoImxkYyAlMCwgc3IiIDogOiAiciIgKG9yaWdfc3IpKTsKLQkJYTAgKz0gbGluZXN6OwotCQlhMSArPSBsaW5lc3o7Ci0JfSB3aGlsZSAoYTAgPCBhMGUpOwotfQotCi1zdGF0aWMgdm9pZCBfX2ZsdXNoX2RjYWNoZV9zZWdtZW50XzR3YXkodW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCQkJdW5zaWduZWQgbG9uZyBleHRlbnRfcGVyX3dheSkKLXsKLQl1bnNpZ25lZCBsb25nIG9yaWdfc3IsIHNyX3dpdGhfYmw7Ci0JdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7Ci0JdW5zaWduZWQgbG9uZyB3YXlfaW5jciwgbGluZXN6LCB3YXlfc2l6ZTsKLQlzdHJ1Y3QgY2FjaGVfaW5mbyAqZGNhY2hlOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYTAsIGExLCBhMiwgYTMsIGEwZTsKLQotCWFzbSB2b2xhdGlsZSgic3RjIHNyLCAlMCIgOiAiPXIiIChvcmlnX3NyKSk7Ci0Jc3Jfd2l0aF9ibCA9IG9yaWdfc3IgfCAoMTw8MjgpOwotCWJhc2VfYWRkciA9ICgodW5zaWduZWQgbG9uZykmZW1wdHlfemVyb19wYWdlWzBdKTsKLQotCS8qIFNlZSBjb21tZW50IHVuZGVyIDEtd2F5IGFib3ZlICovCi0JYmFzZV9hZGRyID0gKChiYXNlX2FkZHIgPj4gMTYpIDw8IDE2KTsKLQliYXNlX2FkZHIgfD0gc3RhcnQ7Ci0KLQlkY2FjaGUgPSAmYm9vdF9jcHVfZGF0YS5kY2FjaGU7Ci0JbGluZXN6ID0gZGNhY2hlLT5saW5lc3o7Ci0Jd2F5X2luY3IgPSBkY2FjaGUtPndheV9pbmNyOwotCXdheV9zaXplID0gZGNhY2hlLT53YXlfc2l6ZTsKLQotCWEwID0gYmFzZV9hZGRyOwotCWExID0gYTAgKyB3YXlfaW5jcjsKLQlhMiA9IGExICsgd2F5X2luY3I7Ci0JYTMgPSBhMiArIHdheV9pbmNyOwotCWEwZSA9IGJhc2VfYWRkciArIGV4dGVudF9wZXJfd2F5OwotCWRvIHsKLQkJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyIiA6IDogInIiIChzcl93aXRoX2JsKSk7Ci0JCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKLQkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMVxuXHQiCi0JCQkgICAgICJtb3ZjYS5sIHIwLCBAJTJcblx0IgotCQkJICAgICAibW92Y2EubCByMCwgQCUzXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUwXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUxXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUyXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUzXG5cdCIgOiA6Ci0JCQkgICAgICJyIiAoYTApLCAiciIgKGExKSwgInIiIChhMiksICJyIiAoYTMpKTsKLQkJYTAgKz0gbGluZXN6OwotCQlhMSArPSBsaW5lc3o7Ci0JCWEyICs9IGxpbmVzejsKLQkJYTMgKz0gbGluZXN6OwotCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCi0JCQkgICAgICJtb3ZjYS5sIHIwLCBAJTFcblx0IgotCQkJICAgICAibW92Y2EubCByMCwgQCUyXG5cdCIKLQkJCSAgICAgIm1vdmNhLmwgcjAsIEAlM1xuXHQiCi0JCQkgICAgICJvY2JpIEAlMFxuXHQiCi0JCQkgICAgICJvY2JpIEAlMVxuXHQiCi0JCQkgICAgICJvY2JpIEAlMlxuXHQiCi0JCQkgICAgICJvY2JpIEAlM1xuXHQiIDogOgotCQkJICAgICAiciIgKGEwKSwgInIiIChhMSksICJyIiAoYTIpLCAiciIgKGEzKSk7Ci0JCWEwICs9IGxpbmVzejsKLQkJYTEgKz0gbGluZXN6OwotCQlhMiArPSBsaW5lc3o7Ci0JCWEzICs9IGxpbmVzejsKLQkJYXNtIHZvbGF0aWxlKCJtb3ZjYS5sIHIwLCBAJTBcblx0IgotCQkJICAgICAibW92Y2EubCByMCwgQCUxXG5cdCIKLQkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMlxuXHQiCi0JCQkgICAgICJtb3ZjYS5sIHIwLCBAJTNcblx0IgotCQkJICAgICAib2NiaSBAJTBcblx0IgotCQkJICAgICAib2NiaSBAJTFcblx0IgotCQkJICAgICAib2NiaSBAJTJcblx0IgotCQkJICAgICAib2NiaSBAJTNcblx0IiA6IDoKLQkJCSAgICAgInIiIChhMCksICJyIiAoYTEpLCAiciIgKGEyKSwgInIiIChhMykpOwotCQlhMCArPSBsaW5lc3o7Ci0JCWExICs9IGxpbmVzejsKLQkJYTIgKz0gbGluZXN6OwotCQlhMyArPSBsaW5lc3o7Ci0JCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKLQkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMVxuXHQiCi0JCQkgICAgICJtb3ZjYS5sIHIwLCBAJTJcblx0IgotCQkJICAgICAibW92Y2EubCByMCwgQCUzXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUwXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUxXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUyXG5cdCIKLQkJCSAgICAgIm9jYmkgQCUzXG5cdCIgOiA6Ci0JCQkgICAgICJyIiAoYTApLCAiciIgKGExKSwgInIiIChhMiksICJyIiAoYTMpKTsKLQkJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyIiA6IDogInIiIChvcmlnX3NyKSk7Ci0JCWEwICs9IGxpbmVzejsKLQkJYTEgKz0gbGluZXN6OwotCQlhMiArPSBsaW5lc3o7Ci0JCWEzICs9IGxpbmVzejsKLQl9IHdoaWxlIChhMCA8IGEwZSk7Ci19Ci0KIGV4dGVybiB2b2lkIF9fd2VhayBzaDRfX2ZsdXNoX3JlZ2lvbl9pbml0KHZvaWQpOwogCiAvKgpAQCAtNzEwLDMyICszODQsMTEgQEAKICAqLwogdm9pZCBfX2luaXQgc2g0X2NhY2hlX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgd3RfZW5hYmxlZCA9ICEhKF9fcmF3X3JlYWRsKENDUikgJiBDQ1JfQ0FDSEVfV1QpOwotCiAJcHJpbnRrKCJQVlI9JTA4eCBDVlI9JTA4eCBQUlI9JTA4eFxuIiwKIAkJY3RybF9pbmwoQ0NOX1BWUiksCiAJCWN0cmxfaW5sKENDTl9DVlIpLAogCQljdHJsX2lubChDQ05fUFJSKSk7CiAKLQlpZiAod3RfZW5hYmxlZCkKLQkJX19mbHVzaF9kY2FjaGVfc2VnbWVudF9mbiA9IF9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfd3JpdGV0aHJvdWdoOwotCWVsc2UgewotCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEuZGNhY2hlLndheXMpIHsKLQkJY2FzZSAxOgotCQkJX19mbHVzaF9kY2FjaGVfc2VnbWVudF9mbiA9IF9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfMXdheTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlfX2ZsdXNoX2RjYWNoZV9zZWdtZW50X2ZuID0gX19mbHVzaF9kY2FjaGVfc2VnbWVudF8yd2F5OwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCV9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4gPSBfX2ZsdXNoX2RjYWNoZV9zZWdtZW50XzR3YXk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBhbmljKCJ1bmtub3duIG51bWJlciBvZiBjYWNoZSB3YXlzXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCiAJbG9jYWxfZmx1c2hfaWNhY2hlX3JhbmdlCT0gc2g0X2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAlsb2NhbF9mbHVzaF9kY2FjaGVfcGFnZQkJPSBzaDRfZmx1c2hfZGNhY2hlX3BhZ2U7CiAJbG9jYWxfZmx1c2hfY2FjaGVfYWxsCQk9IHNoNF9mbHVzaF9jYWNoZV9hbGw7CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2NhY2hlLXNoNS5jIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDUuYwppbmRleCA0NjdmZjhlLi5lYjRjYzRlIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NhY2hlLXNoNS5jCisrKyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g1LmMKQEAgLTU2Myw3ICs1NjMsNyBAQAogCiBzdGF0aWMgdm9pZCBzaDVfZmx1c2hfZGNhY2hlX3BhZ2Uodm9pZCAqcGFnZSkKIHsKLQlzaDY0X2RjYWNoZV9wdXJnZV9waHlfcGFnZShwYWdlX3RvX3BoeXMocGFnZSkpOworCXNoNjRfZGNhY2hlX3B1cmdlX3BoeV9wYWdlKHBhZ2VfdG9fcGh5cygoc3RydWN0IHBhZ2UgKilwYWdlKSk7CiAJd21iKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMgYi9hcmNoL3NoL21tL2NhY2hlLXNoNzcwNS5jCmluZGV4IDI2MDE5MzUuLmY1MjdmYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDc3MDUuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJaWYgKG1hcHBpbmcgJiYgIW1hcHBpbmdfbWFwcGVkKG1hcHBpbmcpKQogCQlzZXRfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJnBhZ2UtPmZsYWdzKTsKIAllbHNlCi0JCV9fZmx1c2hfZGNhY2hlX3BhZ2UoUEhZU0FERFIocGFnZV9hZGRyZXNzKHBhZ2UpKSk7CisJCV9fZmx1c2hfZGNhY2hlX3BhZ2UoX19wYShwYWdlX2FkZHJlc3MocGFnZSkpKTsKIH0KIAogc3RhdGljIHZvaWQgX191c2VzX2p1bXBfdG9fdW5jYWNoZWQgc2g3NzA1X2ZsdXNoX2NhY2hlX2FsbCh2b2lkICphcmdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS5jIGIvYXJjaC9zaC9tbS9jYWNoZS5jCmluZGV4IGEyZGM3ZjkuLmU5NDE1ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLmMKQEAgLTI3LDggKzI3LDExIEBACiB2b2lkICgqbG9jYWxfZmx1c2hfY2FjaGVfc2lndHJhbXApKHZvaWQgKmFyZ3MpID0gY2FjaGVfbm9vcDsKIAogdm9pZCAoKl9fZmx1c2hfd2JhY2tfcmVnaW9uKSh2b2lkICpzdGFydCwgaW50IHNpemUpOworRVhQT1JUX1NZTUJPTChfX2ZsdXNoX3diYWNrX3JlZ2lvbik7CiB2b2lkICgqX19mbHVzaF9wdXJnZV9yZWdpb24pKHZvaWQgKnN0YXJ0LCBpbnQgc2l6ZSk7CitFWFBPUlRfU1lNQk9MKF9fZmx1c2hfcHVyZ2VfcmVnaW9uKTsKIHZvaWQgKCpfX2ZsdXNoX2ludmFsaWRhdGVfcmVnaW9uKSh2b2lkICpzdGFydCwgaW50IHNpemUpOworRVhQT1JUX1NZTUJPTChfX2ZsdXNoX2ludmFsaWRhdGVfcmVnaW9uKTsKIAogc3RhdGljIGlubGluZSB2b2lkIG5vb3BfX2ZsdXNoX3JlZ2lvbih2b2lkICpzdGFydCwgaW50IHNpemUpCiB7CkBAIC0xNjEsMTQgKzE2NCwyMSBAQAogewogCWNhY2hlb3Bfb25fZWFjaF9jcHUobG9jYWxfZmx1c2hfY2FjaGVfYWxsLCBOVUxMLCAxKTsKIH0KK0VYUE9SVF9TWU1CT0woZmx1c2hfY2FjaGVfYWxsKTsKIAogdm9pZCBmbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwlpZiAoYm9vdF9jcHVfZGF0YS5kY2FjaGUubl9hbGlhc2VzID09IDApCisJCXJldHVybjsKKwogCWNhY2hlb3Bfb25fZWFjaF9jcHUobG9jYWxfZmx1c2hfY2FjaGVfbW0sIG1tLCAxKTsKIH0KIAogdm9pZCBmbHVzaF9jYWNoZV9kdXBfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CisJaWYgKGJvb3RfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlcyA9PSAwKQorCQlyZXR1cm47CisKIAljYWNoZW9wX29uX2VhY2hfY3B1KGxvY2FsX2ZsdXNoX2NhY2hlX2R1cF9tbSwgbW0sIDEpOwogfQogCkBAIC0xOTUsMTEgKzIwNSwxMyBAQAogCiAJY2FjaGVvcF9vbl9lYWNoX2NwdShsb2NhbF9mbHVzaF9jYWNoZV9yYW5nZSwgKHZvaWQgKikmZGF0YSwgMSk7CiB9CitFWFBPUlRfU1lNQk9MKGZsdXNoX2NhY2hlX3JhbmdlKTsKIAogdm9pZCBmbHVzaF9kY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAljYWNoZW9wX29uX2VhY2hfY3B1KGxvY2FsX2ZsdXNoX2RjYWNoZV9wYWdlLCBwYWdlLCAxKTsKIH0KK0VYUE9SVF9TWU1CT0woZmx1c2hfZGNhY2hlX3BhZ2UpOwogCiB2b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTI2NSw3ICsyNzcsMTEgQEAKIAogdm9pZCBfX2luaXQgY3B1X2NhY2hlX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY2FjaGVfZGlzYWJsZWQgPSAhKF9fcmF3X3JlYWRsKENDUikgJiBDQ1JfQ0FDSEVfRU5BQkxFKTsKKwl1bnNpZ25lZCBpbnQgY2FjaGVfZGlzYWJsZWQgPSAwOworCisjaWZkZWYgQ0NSCisJY2FjaGVfZGlzYWJsZWQgPSAhKF9fcmF3X3JlYWRsKENDUikgJiBDQ1JfQ0FDSEVfRU5BQkxFKTsKKyNlbmRpZgogCiAJY29tcHV0ZV9hbGlhcygmYm9vdF9jcHVfZGF0YS5pY2FjaGUpOwogCWNvbXB1dGVfYWxpYXMoJmJvb3RfY3B1X2RhdGEuZGNhY2hlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY29uc2lzdGVudC5jIGIvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKaW5kZXggZTA5OGVjMS4uOTAyOTY3ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKKysrIGIvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKQEAgLTE1LDExICsxNSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAogI2RlZmluZSBQUkVBTExPQ19ETUFfREVCVUdfRU5UUklFUwk0MDk2CiAKK3N0cnVjdCBkbWFfbWFwX29wcyAqZG1hX29wczsKK0VYUE9SVF9TWU1CT0woZG1hX29wcyk7CisKIHN0YXRpYyBpbnQgX19pbml0IGRtYV9pbml0KHZvaWQpCiB7CiAJZG1hX2RlYnVnX2luaXQoUFJFQUxMT0NfRE1BX0RFQlVHX0VOVFJJRVMpOwpAQCAtMjcsMTUgKzMxLDEyIEBACiB9CiBmc19pbml0Y2FsbChkbWFfaW5pdCk7CiAKLXZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZ2ZwKQordm9pZCAqZG1hX2dlbmVyaWNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZ2ZwKQogewogCXZvaWQgKnJldCwgKnJldF9ub2NhY2hlOwogCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKIAotCWlmIChkbWFfYWxsb2NfZnJvbV9jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsICZyZXQpKQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgb3JkZXIpOwogCWlmICghcmV0KQogCQlyZXR1cm4gTlVMTDsKQEAgLTU3LDM1ICs1OCwyNiBAQAogCiAJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX3BoeXMocmV0KTsKIAotCWRlYnVnX2RtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICpkbWFfaGFuZGxlLCByZXRfbm9jYWNoZSk7Ci0KIAlyZXR1cm4gcmV0X25vY2FjaGU7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19jb2hlcmVudCk7CiAKLXZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQordm9pZCBkbWFfZ2VuZXJpY19mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgICAgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKIAlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CiAJdW5zaWduZWQgbG9uZyBwZm4gPSBkbWFfaGFuZGxlID4+IFBBR0VfU0hJRlQ7CiAJaW50IGs7CiAKLQlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CS8qIGZvciBwb3J0YWJpbGl0eSAqLwotCi0JaWYgKGRtYV9yZWxlYXNlX2Zyb21fY29oZXJlbnQoZGV2LCBvcmRlciwgdmFkZHIpKQotCQlyZXR1cm47Ci0KLQlkZWJ1Z19kbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKIAlmb3IgKGsgPSAwOyBrIDwgKDEgPDwgb3JkZXIpOyBrKyspCiAJCV9fZnJlZV9wYWdlcyhwZm5fdG9fcGFnZShwZm4gKyBrKSwgMCk7CisKIAlpb3VubWFwKHZhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX2ZyZWVfY29oZXJlbnQpOwogCiB2b2lkIGRtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotI2lmZGVmIENPTkZJR19DUFVfU0g1CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINSkgfHwgZGVmaW5lZChDT05GSUdfUE1CKQogCXZvaWQgKnAxYWRkciA9IHZhZGRyOwogI2Vsc2UKIAl2b2lkICpwMWFkZHIgPSAodm9pZCopIFAxU0VHQUREUigodW5zaWduZWQgbG9uZyl2YWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2luaXQuYyBiL2FyY2gvc2gvbW0vaW5pdC5jCmluZGV4IDgxNzNlMzguLjQzMmFjZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaW5pdC5jCisrKyBiL2FyY2gvc2gvbW0vaW5pdC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTE4NiwxMSArMTg3LDIxIEBACiAJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9VTkNBQ0hFRCwgX19wYSgmX191bmNhY2hlZF9zdGFydCkpOwogfQogCisvKgorICogRWFybHkgaW5pdGlhbGl6YXRpb24gZm9yIGFueSBJL08gTU1VcyB3ZSBtaWdodCBoYXZlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW9tbXVfaW5pdCh2b2lkKQoreworCW5vX2lvbW11X2luaXQoKTsKK30KKwogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKIAlpbnQgY29kZXNpemUsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAlpbnQgbmlkOwogCisJaW9tbXVfaW5pdCgpOworCiAJbnVtX3BoeXNwYWdlcyA9IDA7CiAJaGlnaF9tZW1vcnkgPSBOVUxMOwogCkBAIC0zMjMsNCArMzM0LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CiAjZW5kaWYKKwogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqLworCisjaWZkZWYgQ09ORklHX1BNQgoraW50IF9faW5fMjliaXRfbW9kZSh2b2lkKQoreworCXJldHVybiAhKGN0cmxfaW5sKFBNQl9QQVNDUikgJiBQQVNDUl9TRSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNQiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9rbWFwLmMgYi9hcmNoL3NoL21tL2ttYXAuYwppbmRleCAxNmUwMWI1Li4xNWQ3NGVhIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2ttYXAuYworKysgYi9hcmNoL3NoL21tL2ttYXAuYwpAQCAtMzksNyArMzksOSBAQAogCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKIAlpZHggPSBGSVhfQ01BUF9FTkQgLQotCQkoKGFkZHIgJiBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5hbGlhc19tYXNrKSA+PiBQQUdFX1NISUZUKTsKKwkJKCgoYWRkciA+PiBQQUdFX1NISUZUKSAmIChGSVhfTl9DT0xPVVJTIC0gMSkpICsKKwkJIChGSVhfTl9DT0xPVVJTICogc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CisKIAl2YWRkciA9IF9fZml4X3RvX3ZpcnQoaWR4KTsKIAogCUJVR19PTighcHRlX25vbmUoKihrbWFwX2NvaGVyZW50X3B0ZSAtIGlkeCkpKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vbnVtYS5jIGIvYXJjaC9zaC9tbS9udW1hLmMKaW5kZXggOWI3ODRmZC4uNmM1MjQ0NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9udW1hLmMKKysrIGIvYXJjaC9zaC9tbS9udW1hLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGJvb3RtZW1fcGFkZHI7CiAKIAkvKiBEb24ndCBhbGxvdyBib2d1cyBub2RlIGFzc2lnbm1lbnQgKi8KLQlCVUdfT04obmlkID4gTUFYX05VTU5PREVTIHx8IG5pZCA9PSAwKTsKKwlCVUdfT04obmlkID4gTUFYX05VTU5PREVTIHx8IG5pZCA8PSAwKTsKIAogCXN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CiAJZW5kX3BmbiA9IGVuZCA+PiBQQUdFX1NISUZUOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9wbWItZml4ZWQuYyBiL2FyY2gvc2gvbW0vcG1iLWZpeGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzhlYWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9tbS9wbWItZml4ZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL21tL2ZpeGVkX3BtYi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5ICBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0KLXN0YXRpYyBpbnQgX191c2VzX2p1bXBfdG9fdW5jYWNoZWQgZml4ZWRfcG1iX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGFkZHIsIGRhdGE7Ci0KLQlqdW1wX3RvX3VuY2FjaGVkKCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUE1CX0VOVFJZX01BWDsgaSsrKSB7Ci0JCWFkZHIgPSBQTUJfREFUQSArIChpIDw8IFBNQl9FX1NISUZUKTsKLQkJZGF0YSA9IGN0cmxfaW5sKGFkZHIpOwotCQlpZiAoIShkYXRhICYgUE1CX1YpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGRhdGEgJiBQTUJfQykgewotI2lmIGRlZmluZWQoQ09ORklHX0NBQ0hFX1dSSVRFVEhST1VHSCkKLQkJCWRhdGEgfD0gUE1CX1dUOwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfV1JJVEVCQUNLKQotCQkJZGF0YSAmPSB+UE1CX1dUOwotI2Vsc2UKLQkJCWRhdGEgJj0gfihQTUJfQyB8IFBNQl9XVCk7Ci0jZW5kaWYKLQkJfQotCQljdHJsX291dGwoZGF0YSwgYWRkcik7Ci0JfQotCi0JYmFja190b19jYWNoZWQoKTsKLQotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChmaXhlZF9wbWJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3BtYi5jIGIvYXJjaC9zaC9tbS9wbWIuYwppbmRleCBhYWRlMzExLi4yODBmNmExIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3BtYi5jCisrKyBiL2FyY2gvc2gvbW0vcG1iLmMKQEAgLTM1LDI5ICszNSw5IEBACiAKIHN0YXRpYyB2b2lkIF9fcG1iX3VubWFwKHN0cnVjdCBwbWJfZW50cnkgKik7CiAKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcG1iX2NhY2hlOworc3RhdGljIHN0cnVjdCBwbWJfZW50cnkgcG1iX2VudHJ5X2xpc3RbTlJfUE1CX0VOVFJJRVNdOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcG1iX21hcDsKIAotc3RhdGljIHN0cnVjdCBwbWJfZW50cnkgcG1iX2luaXRfbWFwW10gPSB7Ci0JLyogdnBuICAgICAgICAgcHBuICAgICAgICAgZmxhZ3MgKHViL3N6L2Mvd3QpICovCi0KLQkvKiBQMSBTZWN0aW9uIE1hcHBpbmdzICovCi0JeyAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCBQTUJfU1pfNjRNICB8IFBNQl9DLCB9LAotCXsgMHg4NDAwMDAwMCwgMHgwNDAwMDAwMCwgUE1CX1NaXzY0TSAgfCBQTUJfQywgfSwKLQl7IDB4ODgwMDAwMDAsIDB4MDgwMDAwMDAsIFBNQl9TWl8xMjhNIHwgUE1CX0MsIH0sCi0JeyAweDkwMDAwMDAwLCAweDEwMDAwMDAwLCBQTUJfU1pfNjRNICB8IFBNQl9DLCB9LAotCXsgMHg5NDAwMDAwMCwgMHgxNDAwMDAwMCwgUE1CX1NaXzY0TSAgfCBQTUJfQywgfSwKLQl7IDB4OTgwMDAwMDAsIDB4MTgwMDAwMDAsIFBNQl9TWl82NE0gIHwgUE1CX0MsIH0sCi0KLQkvKiBQMiBTZWN0aW9uIE1hcHBpbmdzICovCi0JeyAweGEwMDAwMDAwLCAweDAwMDAwMDAwLCBQTUJfVUIgfCBQTUJfU1pfNjRNICB8IFBNQl9XVCwgfSwKLQl7IDB4YTQwMDAwMDAsIDB4MDQwMDAwMDAsIFBNQl9VQiB8IFBNQl9TWl82NE0gIHwgUE1CX1dULCB9LAotCXsgMHhhODAwMDAwMCwgMHgwODAwMDAwMCwgUE1CX1VCIHwgUE1CX1NaXzEyOE0gfCBQTUJfV1QsIH0sCi0JeyAweGIwMDAwMDAwLCAweDEwMDAwMDAwLCBQTUJfVUIgfCBQTUJfU1pfNjRNICB8IFBNQl9XVCwgfSwKLQl7IDB4YjQwMDAwMDAsIDB4MTQwMDAwMDAsIFBNQl9VQiB8IFBNQl9TWl82NE0gIHwgUE1CX1dULCB9LAotCXsgMHhiODAwMDAwMCwgMHgxODAwMDAwMCwgUE1CX1VCIHwgUE1CX1NaXzY0TSAgfCBQTUJfV1QsIH0sCi19OwotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWtfcG1iX2VudHJ5KHVuc2lnbmVkIGludCBlbnRyeSkKIHsKIAlyZXR1cm4gKGVudHJ5ICYgUE1CX0VfTUFTSykgPDwgUE1CX0VfU0hJRlQ7CkBAIC03Myw4MSArNTMsNjggQEAKIAlyZXR1cm4gbWtfcG1iX2VudHJ5KGVudHJ5KSB8IFBNQl9EQVRBOwogfQogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBtYl9saXN0X2xvY2spOwotc3RhdGljIHN0cnVjdCBwbWJfZW50cnkgKnBtYl9saXN0OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcG1iX2xpc3RfYWRkKHN0cnVjdCBwbWJfZW50cnkgKnBtYmUpCitzdGF0aWMgaW50IHBtYl9hbGxvY19lbnRyeSh2b2lkKQogewotCXN0cnVjdCBwbWJfZW50cnkgKipwLCAqdG1wOworCXVuc2lnbmVkIGludCBwb3M7CiAKLQlwID0gJnBtYl9saXN0OwotCXdoaWxlICgodG1wID0gKnApICE9IE5VTEwpCi0JCXAgPSAmdG1wLT5uZXh0OworcmVwZWF0OgorCXBvcyA9IGZpbmRfZmlyc3RfemVyb19iaXQoJnBtYl9tYXAsIE5SX1BNQl9FTlRSSUVTKTsKIAotCXBtYmUtPm5leHQgPSB0bXA7Ci0JKnAgPSBwbWJlOworCWlmICh1bmxpa2VseShwb3MgPiBOUl9QTUJfRU5UUklFUykpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQocG9zLCAmcG1iX21hcCkpCisJCWdvdG8gcmVwZWF0OworCisJcmV0dXJuIHBvczsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBtYl9saXN0X2RlbChzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQotewotCXN0cnVjdCBwbWJfZW50cnkgKipwLCAqdG1wOwotCi0JZm9yIChwID0gJnBtYl9saXN0OyAodG1wID0gKnApOyBwID0gJnRtcC0+bmV4dCkKLQkJaWYgKHRtcCA9PSBwbWJlKSB7Ci0JCQkqcCA9IHRtcC0+bmV4dDsKLQkJCXJldHVybjsKLQkJfQotfQotCi1zdHJ1Y3QgcG1iX2VudHJ5ICpwbWJfYWxsb2ModW5zaWduZWQgbG9uZyB2cG4sIHVuc2lnbmVkIGxvbmcgcHBuLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgc3RydWN0IHBtYl9lbnRyeSAqcG1iX2FsbG9jKHVuc2lnbmVkIGxvbmcgdnBuLCB1bnNpZ25lZCBsb25nIHBwbiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgZW50cnkpCiB7CiAJc3RydWN0IHBtYl9lbnRyeSAqcG1iZTsKKwlpbnQgcG9zOwogCi0JcG1iZSA9IGttZW1fY2FjaGVfYWxsb2MocG1iX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW50cnkgPT0gUE1CX05PX0VOVFJZKSB7CisJCXBvcyA9IHBtYl9hbGxvY19lbnRyeSgpOworCQlpZiAocG9zIDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKHBvcyk7CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYml0KGVudHJ5LCAmcG1iX21hcCkpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKwkJcG9zID0gZW50cnk7CisJfQorCisJcG1iZSA9ICZwbWJfZW50cnlfbGlzdFtwb3NdOwogCWlmICghcG1iZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlwbWJlLT52cG4JPSB2cG47CiAJcG1iZS0+cHBuCT0gcHBuOwogCXBtYmUtPmZsYWdzCT0gZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxKCZwbWJfbGlzdF9sb2NrKTsKLQlwbWJfbGlzdF9hZGQocG1iZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwbWJfbGlzdF9sb2NrKTsKKwlwbWJlLT5lbnRyeQk9IHBvczsKIAogCXJldHVybiBwbWJlOwogfQogCi12b2lkIHBtYl9mcmVlKHN0cnVjdCBwbWJfZW50cnkgKnBtYmUpCitzdGF0aWMgdm9pZCBwbWJfZnJlZShzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQogewotCXNwaW5fbG9ja19pcnEoJnBtYl9saXN0X2xvY2spOwotCXBtYl9saXN0X2RlbChwbWJlKTsKLQlzcGluX3VubG9ja19pcnEoJnBtYl9saXN0X2xvY2spOworCWludCBwb3MgPSBwbWJlLT5lbnRyeTsKIAotCWttZW1fY2FjaGVfZnJlZShwbWJfY2FjaGUsIHBtYmUpOworCXBtYmUtPnZwbgk9IDA7CisJcG1iZS0+cHBuCT0gMDsKKwlwbWJlLT5mbGFncwk9IDA7CisJcG1iZS0+ZW50cnkJPSAwOworCisJY2xlYXJfYml0KHBvcywgJnBtYl9tYXApOwogfQogCiAvKgogICogTXVzdCBiZSBpbiBQMiBmb3IgX19zZXRfcG1iX2VudHJ5KCkKICAqLwotaW50IF9fc2V0X3BtYl9lbnRyeSh1bnNpZ25lZCBsb25nIHZwbiwgdW5zaWduZWQgbG9uZyBwcG4sCi0JCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgKmVudHJ5KQorc3RhdGljIHZvaWQgX19zZXRfcG1iX2VudHJ5KHVuc2lnbmVkIGxvbmcgdnBuLCB1bnNpZ25lZCBsb25nIHBwbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcG9zKQogewotCXVuc2lnbmVkIGludCBwb3MgPSAqZW50cnk7Ci0KLQlpZiAodW5saWtlbHkocG9zID09IFBNQl9OT19FTlRSWSkpCi0JCXBvcyA9IGZpbmRfZmlyc3RfemVyb19iaXQoJnBtYl9tYXAsIE5SX1BNQl9FTlRSSUVTKTsKLQotcmVwZWF0OgotCWlmICh1bmxpa2VseShwb3MgPiBOUl9QTUJfRU5UUklFUykpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQocG9zLCAmcG1iX21hcCkpIHsKLQkJcG9zID0gZmluZF9maXJzdF96ZXJvX2JpdCgmcG1iX21hcCwgTlJfUE1CX0VOVFJJRVMpOwotCQlnb3RvIHJlcGVhdDsKLQl9Ci0KIAljdHJsX291dGwodnBuIHwgUE1CX1YsIG1rX3BtYl9hZGRyKHBvcykpOwogCiAjaWZkZWYgQ09ORklHX0NBQ0hFX1dSSVRFVEhST1VHSApAQCAtMTYxLDM1ICsxMjgsMjEgQEAKICNlbmRpZgogCiAJY3RybF9vdXRsKHBwbiB8IGZsYWdzIHwgUE1CX1YsIG1rX3BtYl9kYXRhKHBvcykpOwotCi0JKmVudHJ5ID0gcG9zOwotCi0JcmV0dXJuIDA7CiB9CiAKLWludCBfX3VzZXNfanVtcF90b191bmNhY2hlZCBzZXRfcG1iX2VudHJ5KHN0cnVjdCBwbWJfZW50cnkgKnBtYmUpCitzdGF0aWMgdm9pZCBfX3VzZXNfanVtcF90b191bmNhY2hlZCBzZXRfcG1iX2VudHJ5KHN0cnVjdCBwbWJfZW50cnkgKnBtYmUpCiB7Ci0JaW50IHJldDsKLQogCWp1bXBfdG9fdW5jYWNoZWQoKTsKLQlyZXQgPSBfX3NldF9wbWJfZW50cnkocG1iZS0+dnBuLCBwbWJlLT5wcG4sIHBtYmUtPmZsYWdzLCAmcG1iZS0+ZW50cnkpOworCV9fc2V0X3BtYl9lbnRyeShwbWJlLT52cG4sIHBtYmUtPnBwbiwgcG1iZS0+ZmxhZ3MsIHBtYmUtPmVudHJ5KTsKIAliYWNrX3RvX2NhY2hlZCgpOwotCi0JcmV0dXJuIHJldDsKIH0KIAotdm9pZCBfX3VzZXNfanVtcF90b191bmNhY2hlZCBjbGVhcl9wbWJfZW50cnkoc3RydWN0IHBtYl9lbnRyeSAqcG1iZSkKK3N0YXRpYyB2b2lkIF9fdXNlc19qdW1wX3RvX3VuY2FjaGVkIGNsZWFyX3BtYl9lbnRyeShzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQogewogCXVuc2lnbmVkIGludCBlbnRyeSA9IHBtYmUtPmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAotCS8qCi0JICogRG9uJ3QgYWxsb3cgY2xlYXJpbmcgb2Ygd2lyZWQgaW5pdCBlbnRyaWVzLCBQMSBvciBQMiBhY2Nlc3MKLQkgKiB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBtYXBwaW5nIGluIHRoZSBQTUIgd2lsbCBsZWFkIHRvIHJlc2V0Ci0JICogYnkgdGhlIFRMQi4KLQkgKi8KLQlpZiAodW5saWtlbHkoZW50cnkgPCBBUlJBWV9TSVpFKHBtYl9pbml0X21hcCkgfHwKLQkJICAgICBlbnRyeSA+PSBOUl9QTUJfRU5UUklFUykpCisJaWYgKHVubGlrZWx5KGVudHJ5ID49IE5SX1BNQl9FTlRSSUVTKSkKIAkJcmV0dXJuOwogCiAJanVtcF90b191bmNhY2hlZCgpOwpAQCAtMjAyLDggKzE1NSw2IEBACiAJY3RybF9vdXRsKGN0cmxfaW5sKGFkZHIpICYgflBNQl9WLCBhZGRyKTsKIAogCWJhY2tfdG9fY2FjaGVkKCk7Ci0KLQljbGVhcl9iaXQoZW50cnksICZwbWJfbWFwKTsKIH0KIAogCkBAIC0yMzksMjMgKzE5MCwxNyBAQAogCiBhZ2FpbjoKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbWJfc2l6ZXMpOyBpKyspIHsKLQkJaW50IHJldDsKLQogCQlpZiAoc2l6ZSA8IHBtYl9zaXplc1tpXS5zaXplKQogCQkJY29udGludWU7CiAKLQkJcG1iZSA9IHBtYl9hbGxvYyh2YWRkciwgcGh5cywgcG1iX2ZsYWdzIHwgcG1iX3NpemVzW2ldLmZsYWcpOworCQlwbWJlID0gcG1iX2FsbG9jKHZhZGRyLCBwaHlzLCBwbWJfZmxhZ3MgfCBwbWJfc2l6ZXNbaV0uZmxhZywKKwkJCQkgUE1CX05PX0VOVFJZKTsKIAkJaWYgKElTX0VSUihwbWJlKSkgewogCQkJZXJyID0gUFRSX0VSUihwbWJlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJcmV0ID0gc2V0X3BtYl9lbnRyeShwbWJlKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlwbWJfZnJlZShwbWJlKTsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCXNldF9wbWJfZW50cnkocG1iZSk7CiAKIAkJcGh5cwkrPSBwbWJfc2l6ZXNbaV0uc2l6ZTsKIAkJdmFkZHIJKz0gcG1iX3NpemVzW2ldLnNpemU7CkBAIC0yOTIsMTEgKzIzNywxNiBAQAogCiB2b2lkIHBtYl91bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0Jc3RydWN0IHBtYl9lbnRyeSAqKnAsICpwbWJlOworCXN0cnVjdCBwbWJfZW50cnkgKnBtYmUgPSBOVUxMOworCWludCBpOwogCi0JZm9yIChwID0gJnBtYl9saXN0OyAocG1iZSA9ICpwKTsgcCA9ICZwbWJlLT5uZXh0KQotCQlpZiAocG1iZS0+dnBuID09IGFkZHIpCi0JCQlicmVhazsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbWJfZW50cnlfbGlzdCk7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgJnBtYl9tYXApKSB7CisJCQlwbWJlID0gJnBtYl9lbnRyeV9saXN0W2ldOworCQkJaWYgKHBtYmUtPnZwbiA9PSBhZGRyKQorCQkJCWJyZWFrOworCQl9CisJfQogCiAJaWYgKHVubGlrZWx5KCFwbWJlKSkKIAkJcmV0dXJuOwpAQCAtMzA2LDEzICsyNTYsMjIgQEAKIAogc3RhdGljIHZvaWQgX19wbWJfdW5tYXAoc3RydWN0IHBtYl9lbnRyeSAqcG1iZSkKIHsKLQlXQVJOX09OKCF0ZXN0X2JpdChwbWJlLT5lbnRyeSwgJnBtYl9tYXApKTsKKwlCVUdfT04oIXRlc3RfYml0KHBtYmUtPmVudHJ5LCAmcG1iX21hcCkpOwogCiAJZG8gewogCQlzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJsaW5rID0gcG1iZTsKIAotCQlpZiAocG1iZS0+ZW50cnkgIT0gUE1CX05PX0VOVFJZKQotCQkJY2xlYXJfcG1iX2VudHJ5KHBtYmUpOworCQkvKgorCQkgKiBXZSBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIHBtYl9lbnRyeSBoYXMgYmVlbgorCQkgKiBlbnRlcmVkIGludG8gdGhlIFBNQiB0YWJsZSB2aWEgc2V0X3BtYl9lbnRyeSgpLCBidXQKKwkJICogdGhhdCdzIE9LIGJlY2F1c2Ugd2UndmUgYWxsb2NhdGVkIGEgdW5pcXVlIHNsb3QgZm9yCisJCSAqIHRoaXMgZW50cnkgaW4gcG1iX2FsbG9jKCkgKGV2ZW4gaWYgd2UgaGF2ZW4ndCBmaWxsZWQKKwkJICogaXQgeWV0KS4KKwkJICoKKwkJICogVGhlcmVmb3JlLCBjYWxsaW5nIGNsZWFyX3BtYl9lbnRyeSgpIGlzIHNhZmUgYXMgbm8KKwkJICogb3RoZXIgbWFwcGluZyBjYW4gYmUgdXNpbmcgdGhhdCBzbG90LgorCQkgKi8KKwkJY2xlYXJfcG1iX2VudHJ5KHBtYmUpOwogCiAJCXBtYmUgPSBwbWJsaW5rLT5saW5rOwogCkBAIC0zMjAsNDIgKzI3OSwzNCBAQAogCX0gd2hpbGUgKHBtYmUpOwogfQogCi1zdGF0aWMgdm9pZCBwbWJfY2FjaGVfY3Rvcih2b2lkICpwbWIpCisjaWZkZWYgQ09ORklHX1BNQgoraW50IF9fdXNlc19qdW1wX3RvX3VuY2FjaGVkIHBtYl9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHBtYl9lbnRyeSAqcG1iZSA9IHBtYjsKLQotCW1lbXNldChwbWIsIDAsIHNpemVvZihzdHJ1Y3QgcG1iX2VudHJ5KSk7Ci0KLQlwbWJlLT5lbnRyeSA9IFBNQl9OT19FTlRSWTsKLX0KLQotc3RhdGljIGludCBfX3VzZXNfanVtcF90b191bmNhY2hlZCBwbWJfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBucl9lbnRyaWVzID0gQVJSQVlfU0laRShwbWJfaW5pdF9tYXApOwotCXVuc2lnbmVkIGludCBlbnRyeSwgaTsKLQotCUJVR19PTih1bmxpa2VseShucl9lbnRyaWVzID49IE5SX1BNQl9FTlRSSUVTKSk7Ci0KLQlwbWJfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicG1iIiwgc2l6ZW9mKHN0cnVjdCBwbWJfZW50cnkpLCAwLAotCQkJCSAgICAgIFNMQUJfUEFOSUMsIHBtYl9jYWNoZV9jdG9yKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlsb25nIHNpemUsIHJldDsKIAogCWp1bXBfdG9fdW5jYWNoZWQoKTsKIAogCS8qCi0JICogT3JkZXJpbmcgaXMgaW1wb3J0YW50LCBQMiBtdXN0IGJlIG1hcHBlZCBpbiB0aGUgUE1CIGJlZm9yZSB3ZQotCSAqIGNhbiBzZXQgUE1CLlNFLCBhbmQgUDEgbXVzdCBiZSBtYXBwZWQgYmVmb3JlIHdlIGp1bXAgYmFjayB0bwotCSAqIFAxIHNwYWNlLgorCSAqIEluc2VydCBQTUIgZW50cmllcyBmb3IgdGhlIFAxIGFuZCBQMiBhcmVhcyBzbyB0aGF0LCBhZnRlcgorCSAqIHdlJ3ZlIHN3aXRjaGVkIHRoZSBNTVUgdG8gMzItYml0IG1vZGUsIHRoZSBzZW1hbnRpY3Mgb2YgUDEKKwkgKiBhbmQgUDIgYXJlIHRoZSBzYW1lIGFzIGluIDI5LWJpdCBtb2RlLCBlLmcuCisJICoKKwkgKglQMSAtIHByb3ZpZGVzIGEgY2FjaGVkIHdpbmRvdyBvbnRvIHBoeXNpY2FsIG1lbW9yeQorCSAqCVAyIC0gcHJvdmlkZXMgYW4gdW5jYWNoZWQgd2luZG93IG9udG8gcGh5c2ljYWwgbWVtb3J5CiAJICovCi0JZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgbnJfZW50cmllczsgZW50cnkrKykgewotCQlzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlID0gcG1iX2luaXRfbWFwICsgZW50cnk7CisJc2l6ZSA9IF9fTUVNT1JZX1NUQVJUICsgX19NRU1PUllfU0laRTsKIAotCQlfX3NldF9wbWJfZW50cnkocG1iZS0+dnBuLCBwbWJlLT5wcG4sIHBtYmUtPmZsYWdzLCAmZW50cnkpOwotCX0KKwlyZXQgPSBwbWJfcmVtYXAoUDFTRUcsIDB4MDAwMDAwMDAsIHNpemUsIFBNQl9DKTsKKwlCVUdfT04ocmV0ICE9IHNpemUpOworCisJcmV0ID0gcG1iX3JlbWFwKFAyU0VHLCAweDAwMDAwMDAwLCBzaXplLCBQTUJfV1QgfCBQTUJfVUIpOworCUJVR19PTihyZXQgIT0gc2l6ZSk7CiAKIAljdHJsX291dGwoMCwgUE1CX0lSTUNSKTsKIAogCS8qIFBNQi5TRSBhbmQgVUJbN10gKi8KLQljdHJsX291dGwoKDEgPDwgMzEpIHwgKDEgPDwgNyksIFBNQl9QQVNDUik7CisJY3RybF9vdXRsKFBBU0NSX1NFIHwgKDEgPDwgNyksIFBNQl9QQVNDUik7CiAKIAkvKiBGbHVzaCBvdXQgdGhlIFRMQiAqLwogCWkgPSAgY3RybF9pbmwoTU1VQ1IpOwpAQCAtMzY2LDcgKzMxNyw1MyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1hcmNoX2luaXRjYWxsKHBtYl9pbml0KTsKKyNlbHNlCitpbnQgX191c2VzX2p1bXBfdG9fdW5jYWNoZWQgcG1iX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGRhdGE7CisKKwlqdW1wX3RvX3VuY2FjaGVkKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE1CX0VOVFJZX01BWDsgaSsrKSB7CisJCXN0cnVjdCBwbWJfZW50cnkgKnBtYmU7CisJCXVuc2lnbmVkIGxvbmcgdnBuLCBwcG4sIGZsYWdzOworCisJCWFkZHIgPSBQTUJfREFUQSArIChpIDw8IFBNQl9FX1NISUZUKTsKKwkJZGF0YSA9IGN0cmxfaW5sKGFkZHIpOworCQlpZiAoIShkYXRhICYgUE1CX1YpKQorCQkJY29udGludWU7CisKKwkJaWYgKGRhdGEgJiBQTUJfQykgeworI2lmIGRlZmluZWQoQ09ORklHX0NBQ0hFX1dSSVRFVEhST1VHSCkKKwkJCWRhdGEgfD0gUE1CX1dUOworI2VsaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfV1JJVEVCQUNLKQorCQkJZGF0YSAmPSB+UE1CX1dUOworI2Vsc2UKKwkJCWRhdGEgJj0gfihQTUJfQyB8IFBNQl9XVCk7CisjZW5kaWYKKwkJfQorCQljdHJsX291dGwoZGF0YSwgYWRkcik7CisKKwkJcHBuID0gZGF0YSAmIFBNQl9QRk5fTUFTSzsKKworCQlmbGFncyA9IGRhdGEgJiAoUE1CX0MgfCBQTUJfV1QgfCBQTUJfVUIpOworCQlmbGFncyB8PSBkYXRhICYgUE1CX1NaX01BU0s7CisKKwkJYWRkciA9IFBNQl9BRERSICsgKGkgPDwgUE1CX0VfU0hJRlQpOworCQlkYXRhID0gY3RybF9pbmwoYWRkcik7CisKKwkJdnBuID0gZGF0YSAmIFBNQl9QRk5fTUFTSzsKKworCQlwbWJlID0gcG1iX2FsbG9jKHZwbiwgcHBuLCBmbGFncywgaSk7CisJCVdBUk5fT04oSVNfRVJSKHBtYmUpKTsKKwl9CisKKwliYWNrX3RvX2NhY2hlZCgpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNQiAqLwogCiBzdGF0aWMgaW50IHBtYl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmZpbGUsIHZvaWQgKml0ZXIpCiB7CkBAIC00MzQsMTUgKzQzMSwxOCBAQAogc3RhdGljIGludCBwbWJfc3lzZGV2X3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0YXRpYyBwbV9tZXNzYWdlX3QgcHJldl9zdGF0ZTsKKwlpbnQgaTsKIAogCS8qIFJlc3RvcmUgdGhlIFBNQiBhZnRlciBhIHJlc3VtZSBmcm9tIGhpYmVybmF0aW9uICovCiAJaWYgKHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OICYmCiAJICAgIHByZXZfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFKSB7CiAJCXN0cnVjdCBwbWJfZW50cnkgKnBtYmU7Ci0JCXNwaW5fbG9ja19pcnEoJnBtYl9saXN0X2xvY2spOwotCQlmb3IgKHBtYmUgPSBwbWJfbGlzdDsgcG1iZTsgcG1iZSA9IHBtYmUtPm5leHQpCi0JCQlzZXRfcG1iX2VudHJ5KHBtYmUpOwotCQlzcGluX3VubG9ja19pcnEoJnBtYl9saXN0X2xvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbWJfZW50cnlfbGlzdCk7IGkrKykgeworCQkJaWYgKHRlc3RfYml0KGksICZwbWJfbWFwKSkgeworCQkJCXBtYmUgPSAmcG1iX2VudHJ5X2xpc3RbaV07CisJCQkJc2V0X3BtYl9lbnRyeShwbWJlKTsKKwkJCX0KKwkJfQogCX0KIAlwcmV2X3N0YXRlID0gc3RhdGU7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3NoL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9zaC9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCA4ZTZlZWM5Li40ODg2YzVjIDEwMDY0NAotLS0gYS9hcmNoL3NoL29wcm9maWxlL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTcsNyArNywzIEBACiAJCXRpbWVyX2ludC5vICkKIAogb3Byb2ZpbGUteQk6PSAkKERSSVZFUl9PQkpTKSBjb21tb24ubyBiYWNrdHJhY2UubwotCi1vcHJvZmlsZS0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKQkrPSBvcF9tb2RlbF9zaDc3NTAubwotb3Byb2ZpbGUtJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKQkrPSBvcF9tb2RlbF9zaDc3NTAubwotb3Byb2ZpbGUtJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKQkrPSBvcF9tb2RlbF9zaDc3NTAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvc2gvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggNDRmNGUzMS4uYWM2MDQ5MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL3NoL29wcm9maWxlL2NvbW1vbi5jCkBAIC0yMCw5ICsyMCw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgIm9wX2ltcGwuaCIKIAotZXh0ZXJuIHN0cnVjdCBvcF9zaF9tb2RlbCBvcF9tb2RlbF9zaDc3NTBfb3BzIF9fd2VhazsKLWV4dGVybiBzdHJ1Y3Qgb3Bfc2hfbW9kZWwgb3BfbW9kZWxfc2g0YV9vcHMgX193ZWFrOwotCiBzdGF0aWMgc3RydWN0IG9wX3NoX21vZGVsICptb2RlbDsKIAogc3RhdGljIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyBjdHJbMjBdOwpAQCAtOTQsMzMgKzkxLDE0IEBACiAJICovCiAJb3BzLT5iYWNrdHJhY2UgPSBzaF9iYWNrdHJhY2U7CiAKLQlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEudHlwZSkgewotCS8qIFNILTQgdHlwZXMgKi8KLQljYXNlIENQVV9TSDc3NTA6Ci0JY2FzZSBDUFVfU0g3NzUwUzoKLQkJbG1vZGVsID0gJm9wX21vZGVsX3NoNzc1MF9vcHM7Ci0JCWJyZWFrOwotCi0gICAgICAgIC8qIFNILTRBIHR5cGVzICovCi0JY2FzZSBDUFVfU0g3NzYzOgotCWNhc2UgQ1BVX1NINzc3MDoKLQljYXNlIENQVV9TSDc3ODA6Ci0JY2FzZSBDUFVfU0g3NzgxOgotCWNhc2UgQ1BVX1NINzc4NToKLQljYXNlIENQVV9TSDc3ODY6Ci0JY2FzZSBDUFVfU0g3NzIzOgotCWNhc2UgQ1BVX1NINzcyNDoKLQljYXNlIENQVV9TSFgzOgotCQlsbW9kZWwgPSAmb3BfbW9kZWxfc2g0YV9vcHM7Ci0JCWJyZWFrOwotCi0JLyogU0g0QUwtRFNQIHR5cGVzICovCi0JY2FzZSBDUFVfU0g3MzQzOgotCWNhc2UgQ1BVX1NINzcyMjoKLQljYXNlIENQVV9TSDczNjY6Ci0JCWxtb2RlbCA9ICZvcF9tb2RlbF9zaDRhX29wczsKLQkJYnJlYWs7Ci0JfQorCS8qCisJICogWFhYCisJICoKKwkgKiBBbGwgb2YgdGhlIFNINzc1MC9TSC00QSBjb3VudGVycyBoYXZlIGJlZW4gY29udmVydGVkIHRvIHBlcmYsCisJICogdGhpcyBpbmZyYXN0cnVjdHVyZSBob29rIGlzIGxlZnQgZm9yIG90aGVyIHVzZXJzIHVudGlsIHRoZXkndmUKKwkgKiBoYWQgYSBjaGFuY2UgdG8gY29udmVydCBvdmVyLCBhdCB3aGljaCBwb2ludCBhbGwgb2YgdGhpcworCSAqIHdpbGwgYmUgZGVsZXRlZC4KKwkgKi8KIAogCWlmICghbG1vZGVsKQogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvb3Byb2ZpbGUvb3BfaW1wbC5oIGIvYXJjaC9zaC9vcHJvZmlsZS9vcF9pbXBsLmgKaW5kZXggNGQ1MDk5Ny4uMTI0NDQ3OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9vcHJvZmlsZS9vcF9pbXBsLmgKKysrIGIvYXJjaC9zaC9vcHJvZmlsZS9vcF9pbXBsLmgKQEAgLTYsNyArNiw3IEBACiAJdW5zaWduZWQgbG9uZyBlbmFibGVkOwogCXVuc2lnbmVkIGxvbmcgZXZlbnQ7CiAKLQl1bnNpZ25lZCBsb25nIGxvbmcgY291bnQ7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKIAogCS8qIER1bW15IHZhbHVlcyBmb3IgdXNlcnNwYWNlIHRvb2wgY29tcGxpYW5jZSAqLwogCXVuc2lnbmVkIGxvbmcga2VybmVsOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYyBiL2FyY2gvc2gvb3Byb2ZpbGUvb3BfbW9kZWxfc2g3NzUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTJjN2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYwotICoKLSAqIE9Qcm9maWxlIHN1cHBvcnQgZm9yIFNINzc1MC9TSDc3NTBTIFBlcmZvcm1hbmNlIENvdW50ZXJzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwOCAgUGF1bCBNdW5kdAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgIm9wX2ltcGwuaCIKLQotI2RlZmluZSBQTV9DUl9CQVNFCTB4ZmYwMDAwODQJLyogMTYtYml0ICovCi0jZGVmaW5lIFBNX0NUUl9CQVNFCTB4ZmYxMDAwMDQJLyogMzItYml0ICovCi0KLSNkZWZpbmUgUE1DUihuKQkJKFBNX0NSX0JBU0UgKyAoKG4pICogMHgwNCkpCi0jZGVmaW5lIFBNQ1RSSChuKQkoUE1fQ1RSX0JBU0UgKyAweDAwICsgKChuKSAqIDB4MDgpKQotI2RlZmluZSBQTUNUUkwobikJKFBNX0NUUl9CQVNFICsgMHgwNCArICgobikgKiAweDA4KSkKLQotI2RlZmluZSBQTUNSX1BNTV9NQVNLCTB4MDAwMDAwM2YKLQotI2RlZmluZSBQTUNSX0NMS0YJMHgwMDAwMDEwMAotI2RlZmluZSBQTUNSX1BNQ0xSCTB4MDAwMDIwMDAKLSNkZWZpbmUgUE1DUl9QTVNUCTB4MDAwMDQwMDAKLSNkZWZpbmUgUE1DUl9QTUVOCTB4MDAwMDgwMDAKLQotc3RydWN0IG9wX3NoX21vZGVsIG9wX21vZGVsX3NoNzc1MF9vcHM7Ci0KLSNkZWZpbmUgTlJfQ05UUlMJMgotCi1zdGF0aWMgc3RydWN0IHNoNzc1MF9wcGNfcmVnaXN0ZXJfY29uZmlnIHsKLQl1bnNpZ25lZCBpbnQgY3RybDsKLQl1bnNpZ25lZCBsb25nIGNudF9oaTsKLQl1bnNpZ25lZCBsb25nIGNudF9sbzsKLX0gcmVnY2FjaGVbTlJfQ05UUlNdOwotCi0vKgotICogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGV2ZW50cyBzdXBwb3J0ZWQgYnkgZWFjaCBjb3VudGVyICgzMyBpbiB0b3RhbCkuCi0gKiBTaW5jZSB3ZSBoYXZlIDIgY291bnRlcnMsIGVhY2ggY291bnRlciB3aWxsIHRha2UgdGhlIGV2ZW50IGNvZGUgYXMgaXQKLSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBQTUNSIFBNTSBzZXR0aW5nLiBFYWNoIGNvdW50ZXIgY2FuIGJlIGNvbmZpZ3VyZWQKLSAqIGluZGVwZW5kZW50bHkuCi0gKgotICoJRXZlbnQgQ29kZQlEZXNjcmlwdGlvbgotICoJLS0tLS0tLS0tLQktLS0tLS0tLS0tLQotICoKLSAqCTB4MDEJCU9wZXJhbmQgcmVhZCBhY2Nlc3MKLSAqCTB4MDIJCU9wZXJhbmQgd3JpdGUgYWNjZXNzCi0gKgkweDAzCQlVVExCIG1pc3MKLSAqCTB4MDQJCU9wZXJhbmQgY2FjaGUgcmVhZCBtaXNzCi0gKgkweDA1CQlPcGVyYW5kIGNhY2hlIHdyaXRlIG1pc3MKLSAqCTB4MDYJCUluc3RydWN0aW9uIGZldGNoICh3LyBjYWNoZSkKLSAqCTB4MDcJCUluc3RydWN0aW9uIFRMQiBtaXNzCi0gKgkweDA4CQlJbnN0cnVjdGlvbiBjYWNoZSBtaXNzCi0gKgkweDA5CQlBbGwgb3BlcmFuZCBhY2Nlc3NlcwotICoJMHgwYQkJQWxsIGluc3RydWN0aW9uIGFjY2Vzc2VzCi0gKgkweDBiCQlPQyBSQU0gb3BlcmFuZCBhY2Nlc3MKLSAqCTB4MGQJCU9uLWNoaXAgSS9PIHNwYWNlIGFjY2VzcwotICoJMHgwZQkJT3BlcmFuZCBhY2Nlc3MgKHIvdykKLSAqCTB4MGYJCU9wZXJhbmQgY2FjaGUgbWlzcyAoci93KQotICoJMHgxMAkJQnJhbmNoIGluc3RydWN0aW9uCi0gKgkweDExCQlCcmFuY2ggdGFrZW4KLSAqCTB4MTIJCUJTUi9CU1JGL0pTUgotICoJMHgxMwkJSW5zdHJ1Y3Rpb24gZXhlY3V0aW9uCi0gKgkweDE0CQlJbnN0cnVjdGlvbiBleGVjdXRpb24gaW4gcGFyYWxsZWwKLSAqCTB4MTUJCUZQVSBJbnN0cnVjdGlvbiBleGVjdXRpb24KLSAqCTB4MTYJCUludGVycnVwdAotICoJMHgxNwkJTk1JCi0gKgkweDE4CQl0cmFwYSBpbnN0cnVjdGlvbiBleGVjdXRpb24KLSAqCTB4MTkJCVVCQ0EgbWF0Y2gKLSAqCTB4MWEJCVVCQ0IgbWF0Y2gKLSAqCTB4MjEJCUluc3RydWN0aW9uIGNhY2hlIGZpbGwKLSAqCTB4MjIJCU9wZXJhbmQgY2FjaGUgZmlsbAotICoJMHgyMwkJRWxhcHNlZCB0aW1lCi0gKgkweDI0CQlQaXBlbGluZSBmcmVlemUgYnkgSS1jYWNoZSBtaXNzCi0gKgkweDI1CQlQaXBlbGluZSBmcmVlemUgYnkgRC1jYWNoZSBtaXNzCi0gKgkweDI3CQlQaXBlbGluZSBmcmVlemUgYnkgYnJhbmNoIGluc3RydWN0aW9uCi0gKgkweDI4CQlQaXBlbGluZSBmcmVlemUgYnkgQ1BVIHJlZ2lzdGVyCi0gKgkweDI5CQlQaXBlbGluZSBmcmVlemUgYnkgRlBVCi0gKgotICogVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlIGEgbmF0aXZlIGV4Y2VwdGlvbiBvciBpbnRlcnJ1cHQgZm9yIGNvdW50ZXIKLSAqIG92ZXJmbG93IChhbHRob3VnaCBzaW5jZSB0aGVzZSBjb3VudGVycyBjYW4gcnVuIGZvciAxNi4zIGRheXMgd2l0aG91dAotICogb3ZlcmZsb3dpbmcsIGl0J3Mgbm90IHJlYWxseSBuZWNlc3NhcnkpLgotICoKLSAqIE9Qcm9maWxlIG9uIHRoZSBvdGhlciBoYW5kIGxpa2VzIHRvIGhhdmUgc2FtcGxlcyB0YWtlbiBwZXJpb2RpY2FsbHksIHNvCi0gKiBmb3Igbm93IHdlIGp1c3QgcGlnZ3liYWNrIHRoZSB0aW1lciBpbnRlcnJ1cHQgdG8gZ2V0IHRoZSBleHBlY3RlZAotICogYmVoYXZpb3IuCi0gKi8KLQotc3RhdGljIGludCBzaDc3NTBfdGltZXJfbm90aWZ5KHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1NjQgc2g3NzUwX3JlYWRfY291bnRlcihpbnQgY291bnRlcikKLXsKLQlyZXR1cm4gKHU2NCkoKHU2NCkoX19yYXdfcmVhZGwoUE1DVFJIKGNvdW50ZXIpKSAmIDB4ZmZmZikgPDwgMzIpIHwKLQkJCSAgIF9fcmF3X3JlYWRsKFBNQ1RSTChjb3VudGVyKSk7Ci19Ci0KLS8qCi0gKiBGaWxlcyB3aWxsIGJlIGluIGEgcGF0aCBsaWtlOgotICoKLSAqICAvPG9wcm9maWxlZnMgbW91bnQgcG9pbnQ+Lzxjb3VudGVyIG51bWJlcj4vPGZpbGU+Ci0gKgotICogU28gd2hlbiBkZWFsaW5nIHdpdGggPGZpbGU+LCB3ZSBsb29rIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGUgY291bnRlcgotICogbnVtYmVyLgotICovCi1zdGF0aWMgaW5saW5lIGludCB0b19jb3VudGVyKHN0cnVjdCBmaWxlICpmaWxlKQotewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWU7Ci0KLQlyZXR1cm4gKGludClzaW1wbGVfc3RydG9sKG5hbWUsIE5VTEwsIDEwKTsKLX0KLQotLyoKLSAqIFhYWDogV2UgaGF2ZSA0OC1iaXQgY291bnRlcnMsIHNvIHdlJ3JlIHByb2JhYmx5IGdvaW5nIHRvIHdhbnQgc29tZXRoaW5nCi0gKiBtb3JlIGFsb25nIHRoZSBsaW5lcyBvZiBvcHJvZmlsZWZzX3VsbG9uZ190b191c2VyKCkuLiBUcnVuY2F0aW5nIHRvCi0gKiB1bnNpZ25lZCBsb25nIHdvcmtzIGZpbmUgZm9yIG5vdyB0aG91Z2gsIGFzIGxvbmcgYXMgd2UgZG9uJ3QgYXR0ZW1wdCB0bwotICogcHJvZmlsZSBmb3IgdG9vIGhvcnJpYmx5IGxvbmcuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHNoNzc1MF9yZWFkX2NvdW50KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgY291bnRlciA9IHRvX2NvdW50ZXIoZmlsZSk7Ci0JdTY0IHZhbCA9IHNoNzc1MF9yZWFkX2NvdW50ZXIoY291bnRlcik7Ci0KLQlyZXR1cm4gb3Byb2ZpbGVmc191bG9uZ190b191c2VyKCh1bnNpZ25lZCBsb25nKXZhbCwgYnVmLCBjb3VudCwgcHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNoNzc1MF93cml0ZV9jb3VudChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWludCBjb3VudGVyID0gdG9fY291bnRlcihmaWxlKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCWlmIChvcHJvZmlsZWZzX3Vsb25nX2Zyb21fdXNlcigmdmFsLCBidWYsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkvKgotCSAqIEFueSB3cml0ZSB3aWxsIGNsZWFyIHRoZSBjb3VudGVyLCBhbHRob3VnaCBvbmx5IDAgc2hvdWxkIGJlCi0JICogd3JpdHRlbiBmb3IgdGhpcyBwdXJwb3NlLCBhcyB3ZSBkbyBub3Qgc3VwcG9ydCBzZXR0aW5nIHRoZQotCSAqIGNvdW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHZhbHVlLgotCSAqLwotCVdBUk5fT04odmFsICE9IDApOwotCi0JX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBNQ1IoY291bnRlcikpIHwgUE1DUl9QTUNMUiwgUE1DUihjb3VudGVyKSk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvdW50X2ZvcHMgPSB7Ci0JLnJlYWQJCT0gc2g3NzUwX3JlYWRfY291bnQsCi0JLndyaXRlCQk9IHNoNzc1MF93cml0ZV9jb3VudCwKLX07Ci0KLXN0YXRpYyBpbnQgc2g3NzUwX3BwY19jcmVhdGVfZmlsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqZGlyKQotewotCXJldHVybiBvcHJvZmlsZWZzX2NyZWF0ZV9maWxlKHNiLCBkaXIsICJjb3VudCIsICZjb3VudF9mb3BzKTsKLX0KLQotc3RhdGljIHZvaWQgc2g3NzUwX3BwY19yZWdfc2V0dXAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCi17Ci0JdW5zaWduZWQgaW50IGNvdW50ZXJzID0gb3BfbW9kZWxfc2g3NzUwX29wcy5udW1fY291bnRlcnM7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnRlcnM7IGkrKykgewotCQlyZWdjYWNoZVtpXS5jdHJsCT0gMDsKLQkJcmVnY2FjaGVbaV0uY250X2hpCT0gMDsKLQkJcmVnY2FjaGVbaV0uY250X2xvCT0gMDsKLQotCQlpZiAoIWN0cltpXS5lbmFibGVkKQotCQkJY29udGludWU7Ci0KLQkJcmVnY2FjaGVbaV0uY3RybCB8PSBjdHJbaV0uZXZlbnQgfCBQTUNSX1BNRU4gfCBQTUNSX1BNU1Q7Ci0JCXJlZ2NhY2hlW2ldLmNudF9oaSA9ICh1bnNpZ25lZCBsb25nKSgoY3RyLT5jb3VudCA+PiAzMikgJiAweGZmZmYpOwotCQlyZWdjYWNoZVtpXS5jbnRfbG8gPSAodW5zaWduZWQgbG9uZykoY3RyLT5jb3VudCAmIDB4ZmZmZmZmZmYpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc2g3NzUwX3BwY19jcHVfc2V0dXAodm9pZCAqYXJncykKLXsKLQl1bnNpZ25lZCBpbnQgY291bnRlcnMgPSBvcF9tb2RlbF9zaDc3NTBfb3BzLm51bV9jb3VudGVyczsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudGVyczsgaSsrKSB7Ci0JCV9fcmF3X3dyaXRldygwLCBQTUNSKGkpKTsKLQkJX19yYXdfd3JpdGVsKHJlZ2NhY2hlW2ldLmNudF9oaSwgUE1DVFJIKGkpKTsKLQkJX19yYXdfd3JpdGVsKHJlZ2NhY2hlW2ldLmNudF9sbywgUE1DVFJMKGkpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNoNzc1MF9wcGNfY3B1X3N0YXJ0KHZvaWQgKmFyZ3MpCi17Ci0JdW5zaWduZWQgaW50IGNvdW50ZXJzID0gb3BfbW9kZWxfc2g3NzUwX29wcy5udW1fY291bnRlcnM7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnRlcnM7IGkrKykKLQkJX19yYXdfd3JpdGV3KHJlZ2NhY2hlW2ldLmN0cmwsIFBNQ1IoaSkpOwotfQotCi1zdGF0aWMgdm9pZCBzaDc3NTBfcHBjX2NwdV9zdG9wKHZvaWQgKmFyZ3MpCi17Ci0JdW5zaWduZWQgaW50IGNvdW50ZXJzID0gb3BfbW9kZWxfc2g3NzUwX29wcy5udW1fY291bnRlcnM7Ci0JaW50IGk7Ci0KLQkvKiBEaXNhYmxlIHRoZSBjb3VudGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBjb3VudGVyczsgaSsrKQotCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUE1DUihpKSkgJiB+UE1DUl9QTUVOLCBQTUNSKGkpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNoNzc1MF9wcGNfcmVzZXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY291bnRlcnMgPSBvcF9tb2RlbF9zaDc3NTBfb3BzLm51bV9jb3VudGVyczsKLQlpbnQgaTsKLQotCS8qIENsZWFyIHRoZSBjb3VudGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBjb3VudGVyczsgaSsrKQotCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUE1DUihpKSkgfCBQTUNSX1BNQ0xSLCBQTUNSKGkpKTsKLX0KLQotc3RhdGljIGludCBzaDc3NTBfcHBjX2luaXQodm9pZCkKLXsKLQlzaDc3NTBfcHBjX3Jlc2V0KCk7Ci0KLQlyZXR1cm4gcmVnaXN0ZXJfdGltZXJfaG9vayhzaDc3NTBfdGltZXJfbm90aWZ5KTsKLX0KLQotc3RhdGljIHZvaWQgc2g3NzUwX3BwY19leGl0KHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl90aW1lcl9ob29rKHNoNzc1MF90aW1lcl9ub3RpZnkpOwotCi0Jc2g3NzUwX3BwY19yZXNldCgpOwotfQotCi1zdHJ1Y3Qgb3Bfc2hfbW9kZWwgb3BfbW9kZWxfc2g3NzUwX29wcyA9IHsKLQkuY3B1X3R5cGUJPSAic2gvc2g3NzUwIiwKLQkubnVtX2NvdW50ZXJzCT0gTlJfQ05UUlMsCi0JLnJlZ19zZXR1cAk9IHNoNzc1MF9wcGNfcmVnX3NldHVwLAotCS5jcHVfc2V0dXAJPSBzaDc3NTBfcHBjX2NwdV9zZXR1cCwKLQkuY3B1X3N0YXJ0CT0gc2g3NzUwX3BwY19jcHVfc3RhcnQsCi0JLmNwdV9zdG9wCT0gc2g3NzUwX3BwY19jcHVfc3RvcCwKLQkuaW5pdAkJPSBzaDc3NTBfcHBjX2luaXQsCi0JLmV4aXQJCT0gc2g3NzUwX3BwY19leGl0LAotCS5jcmVhdGVfZmlsZXMJPSBzaDc3NTBfcHBjX2NyZWF0ZV9maWxlcywKLX07CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMKaW5kZXggZWIyNDAzMi4uZDIyZjllNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21tYXBwZXJfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tbWFwcGVyX2tlcm4uYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCiAKQEAgLTc4LDcgKzc4LDYgQEAKIAogc3RhdGljIGludCBtbWFwcGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JY3ljbGVfa2VybmVsX2xvY2soKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE1LDE4ICsxMTQsMTYgQEAKIAl2X2J1ZiA9IChjaGFyICopIGZpbmRfaW9tZW0oIm1tYXBwZXIiLCAmbW1hcHBlcl9zaXplKTsKIAlpZiAobW1hcHBlcl9zaXplID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtbWFwcGVyX2luaXQgLSBmaW5kX2lvbWVtIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJcF9idWYgPSBfX3BhKHZfYnVmKTsKIAogCWVyciA9IG1pc2NfcmVnaXN0ZXIoJm1tYXBwZXJfZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibW1hcHBlciAtIG1pc2NfcmVnaXN0ZXIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKIAkJICAgICAgIGVycik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyOzsKIAl9Ci0KLQlwX2J1ZiA9IF9fcGEodl9idWYpOwotb3V0OgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcmFuZG9tLmMgYi9hcmNoL3VtL2RyaXZlcnMvcmFuZG9tLmMKaW5kZXggNmVhYmI3MC4uNDk0OTA0NCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3JhbmRvbS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9yYW5kb20uYwpAQCAtNyw3ICs3LDYgQEAKICAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM0LDggKzMzLDYgQEAKIAogc3RhdGljIGludCBybmdfZGV2X29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWN5Y2xlX2tlcm5lbF9sb2NrKCk7Ci0KIAkvKiBlbmZvcmNlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhpcyBjaHJkZXYgKi8KIAlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID09IDApCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVzY19kZWZzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjX2RlZnMuaAppbmRleCA5ZDY2ODQ4Li4yNzg0NDFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjX2RlZnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjX2RlZnMuaApAQCAtMTIsOSArMTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qCi0gKiBGSVhNRTogQWNlc3NpbmcgdGhlIGRlc2Nfc3RydWN0IHRocm91Z2ggaXRzIGZpZWxkcyBpcyBtb3JlIGVsZWdhbnQsCisgKiBGSVhNRTogQWNjZXNzaW5nIHRoZSBkZXNjX3N0cnVjdCB0aHJvdWdoIGl0cyBmaWVsZHMgaXMgbW9yZSBlbGVnYW50LAogICogYW5kIHNob3VsZCBiZSB0aGUgb25lIHZhbGlkIHRoaW5nIHRvIGRvLiBIb3dldmVyLCBhIGxvdCBvZiBvcGVuIGNvZGUKLSAqIHN0aWxsIHRvdWNoZXMgdGhlIGEgYW5kIGIgYWNlc3NvcnMsIGFuZCBkb2luZyB0aGlzIGFsbG93IHVzIHRvIGRvIGl0CisgKiBzdGlsbCB0b3VjaGVzIHRoZSBhIGFuZCBiIGFjY2Vzc29ycywgYW5kIGRvaW5nIHRoaXMgYWxsb3cgdXMgdG8gZG8gaXQKICAqIGluY3JlbWVudGFsbHkuIFdlIGtlZXAgdGhlIHNpZ25hdHVyZSBhcyBhIHN0cnVjdCwgcmF0aGVyIHRoYW4gYW4gdW5pb24sCiAgKiBzbyB3ZSBjYW4gZ2V0IHJpZCBvZiBpdCB0cmFuc3BhcmVudGx5IGluIHRoZSBmdXR1cmUgLS0gZ2xvbW1lcgogICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXpvbmVfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCmluZGV4IGVkZTY5OTguLjkxZGY3YzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oCkBAIC00Nyw3ICs0Nyw3IEBACiAvKgogICogZ2VuZXJpYyBub2RlIG1lbW9yeSBzdXBwb3J0LCB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zIGFwcGx5OgogICoKLSAqIDEpIG1lbW9yeSBjb21lcyBpbiA2NE1iIGNvbnRpZ2lvdXMgY2h1bmtzIHdoaWNoIGFyZSBlaXRoZXIgcHJlc2VudCBvciBub3QKKyAqIDEpIG1lbW9yeSBjb21lcyBpbiA2NE1iIGNvbnRpZ3VvdXMgY2h1bmtzIHdoaWNoIGFyZSBlaXRoZXIgcHJlc2VudCBvciBub3QKICAqIDIpIHdlIHdpbGwgbm90IGhhdmUgbW9yZSB0aGFuIDY0R2IgaW4gdG90YWwKICAqCiAgKiBmb3Igbm93IGFzc3VtZSB0aGF0IDY0R2IgaXMgbWF4IGFtb3VudCBvZiBSQU0gZm9yIHdob2xlIHN5c3RlbQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmluZGV4IDcyZTVhNDQuLjA0NDU5ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKQEAgLTEyNCw3ICsxMjQsNyBAQAogCSAqIGZwc3RhdGUgaXMgcmVhbGx5IChzdHJ1Y3QgX2Zwc3RhdGUgKikgb3IgKHN0cnVjdCBfeHN0YXRlICopCiAJICogZGVwZW5kaW5nIG9uIHRoZSBGUF9YU1RBVEVfTUFHSUMxIGVuY29kZWQgaW4gdGhlIFNXIHJlc2VydmVkCiAJICogYnl0ZXMgb2YgKHN0cnVjdCBfZnBzdGF0ZSkgYW5kIEZQX1hTVEFURV9NQUdJQzIgcHJlc2VudCBhdCB0aGUgZW5kCi0JICogb2YgZXh0ZW5kZWQgbWVtb3J5IGxheW91dC4gU2VlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbnRpb24gb2YKKwkgKiBvZiBleHRlbmRlZCBtZW1vcnkgbGF5b3V0LiBTZWUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb24gb2YKIAkgKiAoc3RydWN0IF9mcHhfc3dfYnl0ZXMpCiAJICovCiAJdm9pZCBfX3VzZXIgKmZwc3RhdGU7CQkvKiB6ZXJvIHdoZW4gbm8gRlBVL2V4dGVuZGVkIGNvbnRleHQgKi8KQEAgLTIxOSw3ICsyMTksNyBAQAogCSAqIGZwc3RhdGUgaXMgcmVhbGx5IChzdHJ1Y3QgX2Zwc3RhdGUgKikgb3IgKHN0cnVjdCBfeHN0YXRlICopCiAJICogZGVwZW5kaW5nIG9uIHRoZSBGUF9YU1RBVEVfTUFHSUMxIGVuY29kZWQgaW4gdGhlIFNXIHJlc2VydmVkCiAJICogYnl0ZXMgb2YgKHN0cnVjdCBfZnBzdGF0ZSkgYW5kIEZQX1hTVEFURV9NQUdJQzIgcHJlc2VudCBhdCB0aGUgZW5kCi0JICogb2YgZXh0ZW5kZWQgbWVtb3J5IGxheW91dC4gU2VlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbnRpb24gb2YKKwkgKiBvZiBleHRlbmRlZCBtZW1vcnkgbGF5b3V0LiBTZWUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb24gb2YKIAkgKiAoc3RydWN0IF9mcHhfc3dfYnl0ZXMpCiAJICovCiAJdm9pZCBfX3VzZXIgKmZwc3RhdGU7CQkvKiB6ZXJvIHdoZW4gbm8gRlBVL2V4dGVuZGVkIGNvbnRleHQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKaW5kZXggODBlMjk4NC4uYjQxNGQyYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKQEAgLTU1LDcgKzU1LDcgQEAKICNkZWZpbmUgREVTQ19TVEFUVVNfU09VUkNFX1RJTUVPVVQJMwogCiAvKgotICogc291cmNlIHNpZGUgdGhyZXNoaG9sZHMgYXQgd2hpY2ggbWVzc2FnZSByZXRyaWVzIHByaW50IGEgd2FybmluZworICogc291cmNlIHNpZGUgdGhyZXNob2xkcyBhdCB3aGljaCBtZXNzYWdlIHJldHJpZXMgcHJpbnQgYSB3YXJuaW5nCiAgKi8KICNkZWZpbmUgU09VUkNFX1RJTUVPVVRfTElNSVQJCTIwCiAjZGVmaW5lIERFU1RJTkFUSU9OX1RJTUVPVVRfTElNSVQJMjAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCA4N2VlZTA3Li5mYjEwMzVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0xMTIzLDcgKzExMjMsNyBAQAogCWlmICghYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpKQogCQlhY3BpX3NjaV9pb2FwaWNfc2V0dXAoYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0LCAwLCAwKTsKIAotCS8qIEZpbGwgaW4gaWRlbnRpdHkgbGVnYWN5IG1hcGluZ3Mgd2hlcmUgbm8gb3ZlcnJpZGUgKi8KKwkvKiBGaWxsIGluIGlkZW50aXR5IGxlZ2FjeSBtYXBwaW5ncyB3aGVyZSBubyBvdmVycmlkZSAqLwogCW1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCk7CiAKIAljb3VudCA9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKaW5kZXggMzJmYjA5MS4uMWMwZmI0ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwpAQCAtMTc4Myw3ICsxNzgzLDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCS8qCi0JCSAqIGFwZXJ0dXJlIHdhcyBzdWNlc3NmdWxseSBlbmxhcmdlZCBieSAxMjggTUIsIHRyeQorCQkgKiBhcGVydHVyZSB3YXMgc3VjY2Vzc2Z1bGx5IGVubGFyZ2VkIGJ5IDEyOCBNQiwgdHJ5CiAJCSAqIGFsbG9jYXRpb24gYWdhaW4KIAkJICovCiAJCWdvdG8gcmV0cnk7CkBAIC0yNDkwLDcgKzI0OTAsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwogCXUxNiBkZXZpZDsKIAotCS8qIGFsbG9jYXRlIHBhc3N0aHJvdWcgZG9tYWluICovCisJLyogYWxsb2NhdGUgcGFzc3Rocm91Z2ggZG9tYWluICovCiAJcHRfZG9tYWluID0gcHJvdGVjdGlvbl9kb21haW5fYWxsb2MoKTsKIAlpZiAoIXB0X2RvbWFpbikKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCmluZGV4IGNhYmQyZmEuLjdlN2VlYTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCkBAIC04ODUsNyArODg1LDcgQEAKIAogCS8qIEZpbmQgQUNQSSBkYXRhIGZvciBwcm9jZXNzb3IgKi8KIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJQUNQSV9VSU5UMzJfTUFYLCAmbG9uZ2hhdWxfd2Fsa19jYWxsYmFjaywKKwkJCQlBQ1BJX1VJTlQzMl9NQVgsICZsb25naGF1bF93YWxrX2NhbGxiYWNrLCBOVUxMLAogCQkJCU5VTEwsICh2b2lkICopJnByKTsKIAogCS8qIENoZWNrIEFDUEkgc3VwcG9ydCBmb3IgQzMgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKaW5kZXggYzFiYmVkMS4uYWIxYThhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKQEAgLTEyODYsNyArMTI4Niw3IEBACiAJCXJldHVybiAwOwogCiAJLyoKLQkgKiBJZiB3ZSBhcmUgd2F5IG91dHNpZGUgYSByZWFzb2FibGUgcmFuZ2UgdGhlbiBqdXN0IHNraXAgZm9yd2FyZDoKKwkgKiBJZiB3ZSBhcmUgd2F5IG91dHNpZGUgYSByZWFzb25hYmxlIHJhbmdlIHRoZW4ganVzdCBza2lwIGZvcndhcmQ6CiAJICovCiAJaWYgKHVubGlrZWx5KGxlZnQgPD0gLXBlcmlvZCkpIHsKIAkJbGVmdCA9IHBlcmlvZDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDFmMzE4NmMuLjViOGM3NTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYwpAQCAtNDgxLDcgKzQ4MSw3IEBACiAKIC8qCiAgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRyeSBhcyB0cmFwMyBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSBhbmQgdGhleQotICogcmVtYWluIGRpc2FibGVkIHRob3JvdWdoIG91dCB0aGlzIGZ1bmN0aW9uLgorICogcmVtYWluIGRpc2FibGVkIHRocm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4KICAqLwogc3RhdGljIGludCBfX2twcm9iZXMga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC04MTgsNyArODE4LDcgQEAKIAogLyoKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAxIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5Ci0gKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4KKyAqIHJlbWFpbiBkaXNhYmxlZCB0aHJvdWdob3V0IHRoaXMgZnVuY3Rpb24uCiAgKi8KIHN0YXRpYyBpbnQgX19rcHJvYmVzIHBvc3Rfa3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCAzMjRmMmE0Li4yOWU2NzQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCQkuZG9uZQk9IENPTVBMRVRJT05fSU5JVElBTElaRVJfT05TVEFDSyhjX2lkbGUuZG9uZSksCiAJfTsKIAotCUlOSVRfV09SSygmY19pZGxlLndvcmssIGRvX2ZvcmtfaWRsZSk7CisJSU5JVF9XT1JLX09OX1NUQUNLKCZjX2lkbGUud29yaywgZG9fZm9ya19pZGxlKTsKIAogCWFsdGVybmF0aXZlc19zbXBfc3dpdGNoKDEpOwogCkBAIC03MTMsNiArNzEzLDcgQEAKIAogCWlmIChJU19FUlIoY19pZGxlLmlkbGUpKSB7CiAJCXByaW50aygiZmFpbGVkIGZvcmsgZm9yIENQVSAlZFxuIiwgY3B1KTsKKwkJZGVzdHJveV93b3JrX29uX3N0YWNrKCZjX2lkbGUud29yayk7CiAJCXJldHVybiBQVFJfRVJSKGNfaWRsZS5pZGxlKTsKIAl9CiAKQEAgLTgzMSw2ICs4MzIsNyBAQAogCQlzbXBib290X3Jlc3RvcmVfd2FybV9yZXNldF92ZWN0b3IoKTsKIAl9CiAKKwlkZXN0cm95X3dvcmtfb25fc3RhY2soJmNfaWRsZS53b3JrKTsKIAlyZXR1cm4gYm9vdF9lcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0va21taW8uYyBiL2FyY2gveDg2L21tL2ttbWlvLmMKaW5kZXggMTFhNGFkNC4uMDdiY2MzMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0va21taW8uYworKysgYi9hcmNoL3g4Ni9tbS9rbW1pby5jCkBAIC0yMDMsNyArMjAzLDcgQEAKICAqLwogLyoKICAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAzIGlzIGFuIGludGVycnVwdCBnYXRlCi0gKiBhbmQgdGhleSByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2ggb3V0IHRoaXMgZnVuY3Rpb24uCisgKiBhbmQgdGhleSByZW1haW4gZGlzYWJsZWQgdGhyb3VnaG91dCB0aGlzIGZ1bmN0aW9uLgogICovCiBpbnQga21taW9faGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyKQogewpAQCAtMzAyLDcgKzMwMiw3IEBACiAKIC8qCiAgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRyeSBhcyB0cmFwMSBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZQotICogYW5kIHRoZXkgcmVtYWluIGRpc2FibGVkIHRob3JvdWdoIG91dCB0aGlzIGZ1bmN0aW9uLgorICogYW5kIHRoZXkgcmVtYWluIGRpc2FibGVkIHRocm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4KICAqIFRoaXMgbXVzdCBhbHdheXMgZ2V0IGNhbGxlZCBhcyB0aGUgcGFpciB0byBrbW1pb19oYW5kbGVyKCkuCiAgKi8KIHN0YXRpYyBpbnQgcG9zdF9rbW1pb19oYW5kbGVyKHVuc2lnbmVkIGxvbmcgY29uZGl0aW9uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCBjNDYyY2VhLi5iOGU0NWYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0xMzgsMjQgKzEzOCwyMyBAQAogICovCiB2b2lkIHhlbl92Y3B1X3Jlc3RvcmUodm9pZCkKIHsKLQlpZiAoaGF2ZV92Y3B1X2luZm9fcGxhY2VtZW50KSB7Ci0JCWludCBjcHU7CisJaW50IGNwdTsKIAotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQkJYm9vbCBvdGhlcl9jcHUgPSAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJYm9vbCBvdGhlcl9jcHUgPSAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKLQkJCWlmIChvdGhlcl9jcHUgJiYKLQkJCSAgICBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX2Rvd24sIGNwdSwgTlVMTCkpCi0JCQkJQlVHKCk7CisJCWlmIChvdGhlcl9jcHUgJiYKKwkJICAgIEhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfZG93biwgY3B1LCBOVUxMKSkKKwkJCUJVRygpOwogCisJCXhlbl9zZXR1cF9ydW5zdGF0ZV9pbmZvKGNwdSk7CisKKwkJaWYgKGhhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCkKIAkJCXhlbl92Y3B1X3NldHVwKGNwdSk7CiAKLQkJCWlmIChvdGhlcl9jcHUgJiYKLQkJCSAgICBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX3VwLCBjcHUsIE5VTEwpKQotCQkJCUJVRygpOwotCQl9Ci0KLQkJQlVHX09OKCFoYXZlX3ZjcHVfaW5mb19wbGFjZW1lbnQpOworCQlpZiAob3RoZXJfY3B1ICYmCisJCSAgICBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX3VwLCBjcHUsIE5VTEwpKQorCQkJQlVHKCk7CiAJfQogfQogCkBAIC0xMTgwLDYgKzExNzksOCBAQAogCiAJeGVuX3Jhd19jb25zb2xlX3dyaXRlKCJhYm91dCB0byBnZXQgc3RhcnRlZC4uLlxuIik7CiAKKwl4ZW5fc2V0dXBfcnVuc3RhdGVfaW5mbygwKTsKKwogCS8qIFN0YXJ0IHRoZSB3b3JsZCAqLwogI2lmZGVmIENPTkZJR19YODZfMzIKIAlpMzg2X3N0YXJ0X2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL21tdS5jIGIvYXJjaC94ODYveGVuL21tdS5jCmluZGV4IDNiZjdiMWQuLmJmNGNkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tbXUuYworKysgYi9hcmNoL3g4Ni94ZW4vbW11LmMKQEAgLTE4NSw3ICsxODUsNyBAQAogfQogCiAvKiBCdWlsZCB0aGUgcGFyYWxsZWwgcDJtX3RvcF9tZm4gc3RydWN0dXJlcyAqLwotc3RhdGljIHZvaWQgX19pbml0IHhlbl9idWlsZF9tZm5fbGlzdF9saXN0KHZvaWQpCit2b2lkIHhlbl9idWlsZF9tZm5fbGlzdF9saXN0KHZvaWQpCiB7CiAJdW5zaWduZWQgcGZuLCBpZHg7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zbXAuYyBiL2FyY2gveDg2L3hlbi9zbXAuYwppbmRleCA3MzhkYTBjLi42NDc1N2MwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc21wLmMKKysrIGIvYXJjaC94ODYveGVuL3NtcC5jCkBAIC0yOTUsNiArMjk1LDcgQEAKIAkJKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGlkbGUpIC0KIAkJS0VSTkVMX1NUQUNLX09GRlNFVCArIFRIUkVBRF9TSVpFOwogI2VuZGlmCisJeGVuX3NldHVwX3J1bnN0YXRlX2luZm8oY3B1KTsKIAl4ZW5fc2V0dXBfdGltZXIoY3B1KTsKIAl4ZW5faW5pdF9sb2NrX2NwdShjcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc3VzcGVuZC5jIGIvYXJjaC94ODYveGVuL3N1c3BlbmQuYwppbmRleCA5NWJlN2I0Li45ODcyNjdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc3VzcGVuZC5jCisrKyBiL2FyY2gveDg2L3hlbi9zdXNwZW5kLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9ncmFudF90YWJsZS5oPgpAQCAtMjcsNiArMjgsOCBAQAogCiB2b2lkIHhlbl9wb3N0X3N1c3BlbmQoaW50IHN1c3BlbmRfY2FuY2VsbGVkKQogeworCXhlbl9idWlsZF9tZm5fbGlzdF9saXN0KCk7CisKIAl4ZW5fc2V0dXBfc2hhcmVkX2luZm8oKTsKIAogCWlmIChzdXNwZW5kX2NhbmNlbGxlZCkgewpAQCAtNDQsNyArNDcsMTkgQEAKIAogfQogCitzdGF0aWMgdm9pZCB4ZW5fdmNwdV9ub3RpZnlfcmVzdG9yZSh2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgcmVhc29uID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKworCS8qIEJvb3QgcHJvY2Vzc29yIG5vdGlmaWVkIHZpYSBnZW5lcmljIHRpbWVrZWVwaW5nX3Jlc3VtZSgpICovCisJaWYgKCBzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCkKKwkJcmV0dXJuOworCisJY2xvY2tldmVudHNfbm90aWZ5KHJlYXNvbiwgTlVMTCk7Cit9CisKIHZvaWQgeGVuX2FyY2hfcmVzdW1lKHZvaWQpCiB7Ci0JLyogbm90aGluZyAqLworCXNtcF9jYWxsX2Z1bmN0aW9uKHhlbl92Y3B1X25vdGlmeV9yZXN0b3JlLAorCQkJICAgICAgICh2b2lkICopQ0xPQ0tfRVZUX05PVElGWV9SRVNVTUUsIDEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3RpbWUuYyBiL2FyY2gveDg2L3hlbi90aW1lLmMKaW5kZXggMGE1YWE0NC4uOWQxZjg1MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3RpbWUuYworKysgYi9hcmNoL3g4Ni94ZW4vdGltZS5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAlyZXR1cm4gcGVyX2NwdShydW5zdGF0ZSwgdmNwdSkuc3RhdGUgPT0gUlVOU1RBVEVfcnVubmFibGU7CiB9CiAKLXN0YXRpYyB2b2lkIHNldHVwX3J1bnN0YXRlX2luZm8oaW50IGNwdSkKK3ZvaWQgeGVuX3NldHVwX3J1bnN0YXRlX2luZm8oaW50IGNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9yZWdpc3Rlcl9ydW5zdGF0ZV9tZW1vcnlfYXJlYSBhcmVhOwogCkBAIC00MzQsNyArNDM0LDcgQEAKIAkJbmFtZSA9ICI8dGltZXIga2FzcHJpbnRmIGZhaWxlZD4iOwogCiAJaXJxID0gYmluZF92aXJxX3RvX2lycWhhbmRsZXIoVklSUV9USU1FUiwgY3B1LCB4ZW5fdGltZXJfaW50ZXJydXB0LAotCQkJCSAgICAgIElSUUZfRElTQUJMRUR8SVJRRl9QRVJDUFV8SVJRRl9OT0JBTEFOQ0lORywKKwkJCQkgICAgICBJUlFGX0RJU0FCTEVEfElSUUZfUEVSQ1BVfElSUUZfTk9CQUxBTkNJTkd8SVJRRl9USU1FUiwKIAkJCQkgICAgICBuYW1lLCBOVUxMKTsKIAogCWV2dCA9ICZwZXJfY3B1KHhlbl9jbG9ja19ldmVudHMsIGNwdSk7CkBAIC00NDIsOCArNDQyLDYgQEAKIAogCWV2dC0+Y3B1bWFzayA9IGNwdW1hc2tfb2YoY3B1KTsKIAlldnQtPmlycSA9IGlycTsKLQotCXNldHVwX3J1bnN0YXRlX2luZm8oY3B1KTsKIH0KIAogdm9pZCB4ZW5fdGVhcmRvd25fdGltZXIoaW50IGNwdSkKQEAgLTQ5NCw2ICs0OTIsNyBAQAogCiAJc2V0dXBfZm9yY2VfY3B1X2NhcChYODZfRkVBVFVSRV9UU0MpOwogCisJeGVuX3NldHVwX3J1bnN0YXRlX2luZm8oY3B1KTsKIAl4ZW5fc2V0dXBfdGltZXIoY3B1KTsKIAl4ZW5fc2V0dXBfY3B1X2Nsb2NrZXZlbnRzKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4veGVuLWFzbV82NC5TIGIvYXJjaC94ODYveGVuL3hlbi1hc21fNjQuUwppbmRleCAwMmY0OTZhLi41M2FkZWZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4veGVuLWFzbV82NC5TCisrKyBiL2FyY2gveDg2L3hlbi94ZW4tYXNtXzY0LlMKQEAgLTk2LDcgKzk2LDcgQEAKIAlwdXNocSAkX19VU0VSMzJfQ1MKIAlwdXNocSAlcmN4CiAKLQlwdXNocSAkVkdDRl9pbl9zeXNjYWxsCisJcHVzaHEgJDAKIDE6CWptcCBoeXBlcmNhbGxfaXJldAogRU5EUEFUQ0goeGVuX3N5c3JldDMyKQogUkVMT0MoeGVuX3N5c3JldDMyLCAxYisxKQpAQCAtMTUxLDcgKzE1MSw3IEBACiBFTlRSWSh4ZW5fc3lzZW50ZXJfdGFyZ2V0KQogCWxlYSAxNiglcnNwKSwgJXJzcAkvKiBzdHJpcCAlcmN4LCAlcjExICovCiAJbW92ICQtRU5PU1lTLCAlcmF4Ci0JcHVzaHEgJFZHQ0ZfaW5fc3lzY2FsbAorCXB1c2hxICQwCiAJam1wIGh5cGVyY2FsbF9pcmV0CiBFTkRQUk9DKHhlbl9zeXNjYWxsMzJfdGFyZ2V0KQogRU5EUFJPQyh4ZW5fc3lzZW50ZXJfdGFyZ2V0KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3hlbi1vcHMuaCBiL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKaW5kZXggMzU1ZmE2Yi4uZjkxNTNhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3hlbi1vcHMuaAorKysgYi9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIHZvaWQgeGVuX3NldHVwX21mbl9saXN0X2xpc3Qodm9pZCk7CiB2b2lkIHhlbl9zZXR1cF9zaGFyZWRfaW5mbyh2b2lkKTsKK3ZvaWQgeGVuX2J1aWxkX21mbl9saXN0X2xpc3Qodm9pZCk7CiB2b2lkIHhlbl9zZXR1cF9tYWNocGh5c19tYXBwaW5nKHZvaWQpOwogcGdkX3QgKnhlbl9zZXR1cF9rZXJuZWxfcGFnZXRhYmxlKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgbWF4X3Bmbik7CiB2b2lkIHhlbl9pZGVudF9tYXBfSVNBKHZvaWQpOwpAQCAtNDEsNiArNDIsNyBAQAogCiB2b2lkIHhlbl9pbml0X2lycV9vcHModm9pZCk7CiB2b2lkIHhlbl9zZXR1cF90aW1lcihpbnQgY3B1KTsKK3ZvaWQgeGVuX3NldHVwX3J1bnN0YXRlX2luZm8oaW50IGNwdSk7CiB2b2lkIHhlbl90ZWFyZG93bl90aW1lcihpbnQgY3B1KTsKIGN5Y2xlX3QgeGVuX2Nsb2Nrc291cmNlX3JlYWQodm9pZCk7CiB2b2lkIHhlbl9zZXR1cF9jcHVfY2xvY2tldmVudHModm9pZCk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9wb2xsLmMgYi9ibG9jay9ibGstaW9wb2xsLmMKaW5kZXggY2E1NjQyMC4uNTg5MTZhZiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWlvcG9sbC5jCisrKyBiL2Jsb2NrL2Jsay1pb3BvbGwuYwpAQCAtMjgsNyArMjgsNyBAQAogICogRGVzY3JpcHRpb246CiAgKiAgICAgQWRkIHRoaXMgYmxrX2lvcG9sbCBzdHJ1Y3R1cmUgdG8gdGhlIHBlbmRpbmcgcG9sbCBsaXN0IGFuZCB0cmlnZ2VyIHRoZQogICogICAgIHJhaXNlIG9mIHRoZSBibGsgaW9wb2xsIHNvZnRpcnEuIFRoZSBkcml2ZXIgbXVzdCBhbHJlYWR5IGhhdmUgZ290dGVuIGEKLSAqICAgICBzdWNjZXNmdWwgcmV0dXJuIGZyb20gYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCkgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqICAgICBzdWNjZXNzZnVsIHJldHVybiBmcm9tIGJsa19pb3BvbGxfc2NoZWRfcHJlcCgpIGJlZm9yZSBjYWxsaW5nIHRoaXMuCiAgKiovCiB2b2lkIGJsa19pb3BvbGxfc2NoZWQoc3RydWN0IGJsa19pb3BvbGwgKmlvcCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCA0OGJiZGJlLi4yNmU0MzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBkcml2ZXJzL0tjb25maWcKLQogbWVudSAiRGV2aWNlIERyaXZlcnMiCiAKIHNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKaW5kZXggMjhjY2RiYy4uMzU5N2Q3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwpAQCAtNTM3LDcgKzUzNyw3IEBACiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkJICAgICBBQ1BJX1VJTlQzMl9NQVgsCi0JCQkJICAgICBhY3BpX21lbW9yeV9yZWdpc3Rlcl9ub3RpZnlfaGFuZGxlciwKKwkJCQkgICAgIGFjcGlfbWVtb3J5X3JlZ2lzdGVyX25vdGlmeV9oYW5kbGVyLCBOVUxMLAogCQkJCSAgICAgTlVMTCwgTlVMTCk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCSAqLwogCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKIAkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwKLQkJCQkgICAgIGFjcGlfbWVtb3J5X2RlcmVnaXN0ZXJfbm90aWZ5X2hhbmRsZXIsCisJCQkJICAgICBhY3BpX21lbW9yeV9kZXJlZ2lzdGVyX25vdGlmeV9oYW5kbGVyLCBOVUxMLAogCQkJCSAgICAgTlVMTCwgTlVMTCk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZQppbmRleCBlNzk3M2JjLi43NDIzMDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvTWFrZWZpbGUKQEAgLTI4LDcgKzI4LDcgQEAKIGFjcGkteSArPSBuc2FjY2Vzcy5vICBuc2xvYWQubyAgICBuc3NlYXJjaC5vICBuc3hmZXZhbC5vIFwKIAkgbnNhbGxvYy5vICAgbnNldmFsLm8gICAgbnNuYW1lcy5vICAgbnN1dGlscy5vICAgbnN4Zm5hbWUubyBcCiAJIG5zZHVtcC5vICAgIG5zaW5pdC5vICAgIG5zb2JqZWN0Lm8gIG5zd2Fsay5vICAgIG5zeGZvYmoubyAgXAotCSBuc3BhcnNlLm8gICBuc3ByZWRlZi5vICBuc3JlcGFpci5vCisJIG5zcGFyc2UubyAgIG5zcHJlZGVmLm8gIG5zcmVwYWlyLm8gIG5zcmVwYWlyMi5vCiAKIGFjcGktJChBQ1BJX0ZVVFVSRV9VU0FHRSkgKz0gbnNkdW1wZHYubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbWFjcm9zLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbWFjcm9zLmgKaW5kZXggM2FjZDljNi4uN2Q5YmE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY21hY3Jvcy5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNtYWNyb3MuaApAQCAtMzQxLDYgKzM0MSw3IEBACiAjZGVmaW5lIEFDUElfRVJST1JfTkFNRVNQQUNFKHMsIGUpICAgICAgYWNwaV9uc19yZXBvcnRfZXJyb3IgKEFFX0lORk8sIHMsIGUpOwogI2RlZmluZSBBQ1BJX0VSUk9SX01FVEhPRChzLCBuLCBwLCBlKSAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvciAoQUVfSU5GTywgcywgbiwgcCwgZSk7CiAjZGVmaW5lIEFDUElfV0FSTl9QUkVERUZJTkVEKHBsaXN0KSAgICAgYWNwaV91dF9wcmVkZWZpbmVkX3dhcm5pbmcgcGxpc3QKKyNkZWZpbmUgQUNQSV9JTkZPX1BSRURFRklORUQocGxpc3QpICAgICBhY3BpX3V0X3ByZWRlZmluZWRfaW5mbyBwbGlzdAogCiAjZWxzZQogCkBAIC0zNDksNiArMzUwLDggQEAKICNkZWZpbmUgQUNQSV9FUlJPUl9OQU1FU1BBQ0UocywgZSkKICNkZWZpbmUgQUNQSV9FUlJPUl9NRVRIT0QocywgbiwgcCwgZSkKICNkZWZpbmUgQUNQSV9XQVJOX1BSRURFRklORUQocGxpc3QpCisjZGVmaW5lIEFDUElfSU5GT19QUkVERUZJTkVEKHBsaXN0KQorCiAjZW5kaWYJCS8qIEFDUElfTk9fRVJST1JfTUVTU0FHRVMgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNuYW1lc3AuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNuYW1lc3AuaAppbmRleCAwOWEyNzY0Li5hYjgzOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbmFtZXNwLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY25hbWVzcC5oCkBAIC0xMDQsNyArMTA0LDggQEAKIAkJICAgICAgIGFjcGlfaGFuZGxlIHN0YXJ0X29iamVjdCwKIAkJICAgICAgIHUzMiBtYXhfZGVwdGgsCiAJCSAgICAgICB1MzIgZmxhZ3MsCi0JCSAgICAgICBhY3BpX3dhbGtfY2FsbGJhY2sgdXNlcl9mdW5jdGlvbiwKKwkJICAgICAgIGFjcGlfd2Fsa19jYWxsYmFjayBwcmVfb3JkZXJfdmlzaXQsCisJCSAgICAgICBhY3BpX3dhbGtfY2FsbGJhY2sgcG9zdF9vcmRlcl92aXNpdCwKIAkJICAgICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfbmV4dF9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCkBAIC0yNzIsNyArMjczLDggQEAKIAkJCSAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSk7CiAKIC8qCi0gKiBuc3JlcGFpciAtIHJldHVybiBvYmplY3QgcmVwYWlyIGZvciBwcmVkZWZpbmVkIG1ldGhvZHMvb2JqZWN0cworICogbnNyZXBhaXIgLSBHZW5lcmFsIHJldHVybiBvYmplY3QgcmVwYWlyIGZvciBhbGwKKyAqIHByZWRlZmluZWQgbWV0aG9kcy9vYmplY3RzCiAgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX25zX3JlcGFpcl9vYmplY3Qoc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9kYXRhICpkYXRhLApAQCAtMjg1LDYgKzI4NywxNiBAQAogCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfZGVzY19wdHIpOwogCiAvKgorICogbnNyZXBhaXIyIC0gUmV0dXJuIG9iamVjdCByZXBhaXIgZm9yIHNwZWNpZmljCisgKiBwcmVkZWZpbmVkIG1ldGhvZHMvb2JqZWN0cworICovCithY3BpX3N0YXR1cworYWNwaV9uc19jb21wbGV4X3JlcGFpcnMoc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9kYXRhICpkYXRhLAorCQkJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQlhY3BpX3N0YXR1cyB2YWxpZGF0ZV9zdGF0dXMsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX29iamVjdF9wdHIpOworCisvKgogICogbnNzZWFyY2ggLSBOYW1lc3BhY2Ugc2VhcmNoaW5nIGFuZCBlbnRyeQogICovCiBhY3BpX3N0YXR1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaAppbmRleCA4NjNhMjY0Li4zYTQ1MWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaApAQCAtMzg2LDYgKzM4Niw4IEBACiAKIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX3BhY2thZ2Vfb2JqZWN0KHUzMiBjb3VudCk7CiAKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX2ludGVnZXJfb2JqZWN0KHU2NCB2YWx1ZSk7CisKIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoYWNwaV9zaXplIGJ1ZmZlcl9zaXplKTsKIAogdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChhY3BpX3NpemUgc3RyaW5nX3NpemUpOwpAQCAtNDgxLDYgKzQ4MywxMSBAQAogCQkJICAgY2hhciAqcGF0aG5hbWUsCiAJCQkgICB1OCBub2RlX2ZsYWdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CiAKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfdXRfcHJlZGVmaW5lZF9pbmZvKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCQkJdTMyIGxpbmVfbnVtYmVyLAorCQkJY2hhciAqcGF0aG5hbWUsIHU4IG5vZGVfZmxhZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKwogLyogVmFsdWVzIGZvciBCYXNlIGFib3ZlICgxNj1IZXgsIDEwPURlY2ltYWwpICovCiAKICNkZWZpbmUgQUNQSV9BTllfQkFTRSAgICAgICAgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNpbml0LmMKaW5kZXggM2FhZTEzZi4uZjIzZmEwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzaW5pdC5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlzdGF0dXMgPQogCSAgICBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIHN0YXJ0X25vZGUsIEFDUElfVUlOVDMyX01BWCwKIAkJCQkgICBBQ1BJX05TX1dBTEtfVU5MT0NLLCBhY3BpX2RzX2luaXRfb25lX29iamVjdCwKLQkJCQkgICAmaW5mbywgTlVMTCk7CisJCQkJICAgTlVMTCwgJmluZm8sIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIFdhbGtOYW1lc3BhY2UiKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc210aGRhdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc210aGRhdC5jCmluZGV4IDdkMDc3YmIuLjBiYTE5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNtdGhkYXQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbXRoZGF0LmMKQEAgLTQwOSwxMyArNDA5LDExIEBACiAJCS8qIElmIHNsYWNrIGVuYWJsZWQsIGluaXQgdGhlIGxvY2FsX3gvYXJnX3ggdG8gYW4gSW50ZWdlciBvZiB2YWx1ZSB6ZXJvICovCiAKIAkJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgewotCQkJb2JqZWN0ID0KLQkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQkJb2JqZWN0ID0gYWNwaV91dF9jcmVhdGVfaW50ZWdlcl9vYmplY3QoKHU2NCkgMCk7CiAJCQlpZiAoIW9iamVjdCkgewogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQkJfQogCi0JCQlvYmplY3QtPmludGVnZXIudmFsdWUgPSAwOwogCQkJbm9kZS0+b2JqZWN0ID0gb2JqZWN0OwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNvYmplY3QuYwppbmRleCA1MDdlMWYwLi45YmMxYmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc29iamVjdC5jCkBAIC00ODYsNyArNDg2LDcgQEAKIAkJICoKIAkJICogTm90ZTogdGVjaG5pY2FsbHksIHRoaXMgaXMgYW4gZXJyb3IsIGZyb20gQUNQSSBzcGVjOiAiSXQgaXMgYW4gZXJyb3IKIAkJICogZm9yIE51bUVsZW1lbnRzIHRvIGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotCQkgKiBQYWNrYWdlTGlzdCIuIEhvd2V2ZXIsIHdlIGp1c3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQKKwkJICogUGFja2FnZUxpc3QiLiBIb3dldmVyLCB3ZSBqdXN0IHByaW50IGEgbWVzc2FnZSBhbmQKIAkJICogbm8gZXhjZXB0aW9uIGlzIHJldHVybmVkLiBUaGlzIHByb3ZpZGVzIFdpbmRvd3MgY29tcGF0aWJpbGl0eS4gU29tZQogCQkgKiBCSU9TcyB3aWxsIGFsdGVyIHRoZSBudW1fZWxlbWVudHMgb24gdGhlIGZseSwgY3JlYXRpbmcgdGhpcyB0eXBlCiAJCSAqIG9mIGlsbC1mb3JtZWQgcGFja2FnZSBvYmplY3QuCkBAIC01MTAsOSArNTEwLDkgQEAKIAkJCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CiAJCX0KIAotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgIlBhY2thZ2UgTGlzdCBsZW5ndGggKDB4JVgpIGxhcmdlciB0aGFuIE51bUVsZW1lbnRzIGNvdW50ICgweCVYKSwgdHJ1bmNhdGVkXG4iLAotCQkJICAgIGksIGVsZW1lbnRfY291bnQpKTsKKwkJQUNQSV9JTkZPKChBRV9JTkZPLAorCQkJICAgIkFjdHVhbCBQYWNrYWdlIGxlbmd0aCAoMHglWCkgaXMgbGFyZ2VyIHRoYW4gTnVtRWxlbWVudHMgZmllbGQgKDB4JVgpLCB0cnVuY2F0ZWRcbiIsCisJCQkgICBpLCBlbGVtZW50X2NvdW50KSk7CiAJfSBlbHNlIGlmIChpIDwgZWxlbWVudF9jb3VudCkgewogCQkvKgogCQkgKiBBcmcgbGlzdCAoZWxlbWVudHMpIHdhcyBleGhhdXN0ZWQsIGJ1dCB3ZSBkaWQgbm90IHJlYWNoIG51bV9lbGVtZW50cyBjb3VudC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkLmMKaW5kZXggNmRlM2E5OS4uMTBmYzc4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkLmMKQEAgLTYzOSwyNiArNjM5LDQyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfU0NPUEVfT1A6Ci0JCS8qCi0JCSAqIFRoZSBQYXRoIGlzIGFuIG9iamVjdCByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgb2JqZWN0LgotCQkgKiBEb24ndCBlbnRlciB0aGUgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIGJ1dCBsb29rIGl0IHVwCi0JCSAqIGZvciB1c2UgbGF0ZXIuCi0JCSAqLwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwKLQkJCQkgICBvYmplY3RfdHlwZSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwgJihub2RlKSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCi0JCQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewotCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJfSBlbHNlIHsKLQkJCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShidWZmZXJfcHRyLCBzdGF0dXMpOworCisJCS8qIFNwZWNpYWwgY2FzZSBmb3IgU2NvcGUoXCkgLT4gcmVmZXJzIHRvIHRoZSBSb290IG5vZGUgKi8KKworCQlpZiAob3AgJiYgKG9wLT5uYW1lZC5ub2RlID09IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKKwkJCW5vZGUgPSBvcC0+bmFtZWQubm9kZTsKKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gobm9kZSwgb2JqZWN0X3R5cGUsCisJCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIFBhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuCisJCQkgKiBEb24ndCBlbnRlciB0aGUgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIGJ1dCBsb29rIGl0IHVwCisJCQkgKiBmb3IgdXNlIGxhdGVyLgorCQkJICovCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCisJCQkJCSAgIG9iamVjdF90eXBlLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwKKwkJCQkJICAgJihub2RlKSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKyNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgorCQkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IEFFX09LOworCQkJCX0gZWxzZSB7CisJCQkJCUFDUElfRVJST1JfTkFNRVNQQUNFKGJ1ZmZlcl9wdHIsCisJCQkJCQkJICAgICBzdGF0dXMpOworCQkJCX0KICNlbHNlCi0JCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShidWZmZXJfcHRyLCBzdGF0dXMpOworCQkJCUFDUElfRVJST1JfTkFNRVNQQUNFKGJ1ZmZlcl9wdHIsIHN0YXR1cyk7CiAjZW5kaWYKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQogCQl9CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVibGsuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVibGsuYwppbmRleCBhNjBhYWE3Li4yNDc5MjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlYmxrLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWJsay5jCkBAIC05NDUsOCArOTQ1LDggQEAKIAogCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgZ3BlX2RldmljZSwKIAkJCQkJQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLAotCQkJCQlhY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8sIGdwZV9ibG9jaywKLQkJCQkJTlVMTCk7CisJCQkJCWFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbywgTlVMTCwKKwkJCQkJZ3BlX2Jsb2NrLCBOVUxMKTsKIAogCS8qIFJldHVybiB0aGUgbmV3IGJsb2NrICovCiAKQEAgLTEwMjIsOCArMTAyMiw4IEBACiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkJCSAgIEFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX1VOTE9DSywKLQkJCQkJICAgYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZSwgJmdwZV9pbmZvLAotCQkJCQkgICBOVUxMKTsKKwkJCQkJICAgYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZSwgTlVMTCwKKwkJCQkJICAgJmdwZV9pbmZvLCBOVUxMKTsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJlZ2lvbi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJlZ2lvbi5jCmluZGV4IDk4YzdmOWMuLjBiYzgwN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZWdpb24uYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmVnaW9uLmMKQEAgLTUxLDYgKzUxLDEwIEBACiBBQ1BJX01PRFVMRV9OQU1FKCJldnJlZ2lvbiIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1OAorYWNwaV9ldl9oYXNfZGVmYXVsdF9oYW5kbGVyKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQpOworCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXZfcmVnX3J1bihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAogCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwpAQCAtMTQyLDYgKzE0Niw1MCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2hhc19kZWZhdWx0X2hhbmRsZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgZGV2aWNlCisgKiAgICAgICAgICAgICAgc3BhY2VfaWQgICAgICAgICAgICAtIFRoZSBhZGRyZXNzIHNwYWNlIElECisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgZGVmYXVsdCBoYW5kbGVyIGlzIGluc3RhbGxlZCwgRkFMU0Ugb3RoZXJ3aXNlCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGlmIHRoZSBkZWZhdWx0IGhhbmRsZXIgaXMgaW5zdGFsbGVkIGZvciB0aGUgcmVxdWVzdGVkCisgKiAgICAgICAgICAgICAgc3BhY2UgSUQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHU4CithY3BpX2V2X2hhc19kZWZhdWx0X2hhbmRsZXIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKworCS8qIE11c3QgaGF2ZSBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KKworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCWlmIChvYmpfZGVzYykgeworCQloYW5kbGVyX29iaiA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKKworCQkvKiBXYWxrIHRoZSBsaW5rZWQgbGlzdCBvZiBoYW5kbGVycyBmb3IgdGhpcyBvYmplY3QgKi8KKworCQl3aGlsZSAoaGFuZGxlcl9vYmopIHsKKwkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9PSBzcGFjZV9pZCkgeworCQkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyX2ZsYWdzICYKKwkJCQkgICAgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQpIHsKKwkJCQkJcmV0dXJuIChUUlVFKTsKKwkJCQl9CisJCQl9CisKKwkJCWhhbmRsZXJfb2JqID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dDsKKwkJfQorCX0KKworCXJldHVybiAoRkFMU0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucwogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCkBAIC0xNjksMTIgKzIxNywxOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX0RFRkFVTFRfU1BBQ0VTOyBpKyspIHsKIAkJLyoKLQkJICogVEJEOiBNYWtlIHN1cmUgaGFuZGxlciBpcyB0aGUgREVGQVVMVCBoYW5kbGVyLCBvdGhlcndpc2UKLQkJICogX1JFRyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJ1bi4KKwkJICogTWFrZSBzdXJlIHRoZSBpbnN0YWxsZWQgaGFuZGxlciBpcyB0aGUgREVGQVVMVCBoYW5kbGVyLiBJZiBub3QgdGhlCisJCSAqIGRlZmF1bHQsIHRoZSBfUkVHIG1ldGhvZHMgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBydW4gKHdoZW4gdGhlCisJCSAqIGhhbmRsZXIgd2FzIGluc3RhbGxlZCkKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhhY3BpX2dibF9yb290X25vZGUsCi0JCQkJCQkgICAgIGFjcGlfZ2JsX2RlZmF1bHRfYWRkcmVzc19zcGFjZXMKLQkJCQkJCSAgICAgW2ldKTsKKwkJaWYgKGFjcGlfZXZfaGFzX2RlZmF1bHRfaGFuZGxlcihhY3BpX2dibF9yb290X25vZGUsCisJCQkJCQlhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzCisJCQkJCQlbaV0pKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhhY3BpX2dibF9yb290X25vZGUsCisJCQkJCQkJYWNwaV9nYmxfZGVmYXVsdF9hZGRyZXNzX3NwYWNlcworCQkJCQkJCVtpXSk7CisJCX0KIAl9CiAKIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKQEAgLTIzNSwyMyArMjg5LDIwIEBACiAJICogIGNvbm5lY3Rpb24gc3RhdHVzIDEgZm9yIGNvbm5lY3RpbmcgdGhlIGhhbmRsZXIsIDAgZm9yIGRpc2Nvbm5lY3RpbmcKIAkgKiAgdGhlIGhhbmRsZXIgKFBhc3NlZCBhcyBhIHBhcmFtZXRlcikKIAkgKi8KLQlhcmdzWzBdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwlhcmdzWzBdID0KKwkgICAgYWNwaV91dF9jcmVhdGVfaW50ZWdlcl9vYmplY3QoKHU2NCkgcmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKTsKIAlpZiAoIWFyZ3NbMF0pIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXAxOwogCX0KIAotCWFyZ3NbMV0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCWFyZ3NbMV0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlZ2VyX29iamVjdCgodTY0KSBmdW5jdGlvbik7CiAJaWYgKCFhcmdzWzFdKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwMjsKIAl9CiAKLQkvKiBTZXR1cCB0aGUgcGFyYW1ldGVyIG9iamVjdHMgKi8KLQotCWFyZ3NbMF0tPmludGVnZXIudmFsdWUgPSByZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQ7Ci0JYXJnc1sxXS0+aW50ZWdlci52YWx1ZSA9IGZ1bmN0aW9uOwotCWFyZ3NbMl0gPSBOVUxMOworCWFyZ3NbMl0gPSBOVUxMOwkJLyogVGVybWluYXRlIGxpc3QgKi8KIAogCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcmV0dXJuIHZhbHVlICovCiAKQEAgLTk3MSw4ICsxMDIyLDggQEAKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIG5vZGUsIEFDUElfVUlOVDMyX01BWCwKIAkJCQkJQUNQSV9OU19XQUxLX1VOTE9DSywKLQkJCQkJYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIsIGhhbmRsZXJfb2JqLAotCQkJCQlOVUxMKTsKKwkJCQkJYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIsIE5VTEwsCisJCQkJCWhhbmRsZXJfb2JqLCBOVUxMKTsKIAogICAgICAgdW5sb2NrX2FuZF9leGl0OgogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpAQCAtMTAwOCw3ICsxMDU5LDcgQEAKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIG5vZGUsIEFDUElfVUlOVDMyX01BWCwKIAkJCQkJQUNQSV9OU19XQUxLX1VOTE9DSywgYWNwaV9ldl9yZWdfcnVuLAotCQkJCQkmc3BhY2VfaWQsIE5VTEwpOworCQkJCQlOVUxMLCAmc3BhY2VfaWQsIE5VTEwpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uZmlnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uZmlnLmMKaW5kZXggMjRhZmVmOC4uNDZhZGZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmZpZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25maWcuYwpAQCAtMTcwLDE0ICsxNzAsMTIgQEAKIAogCQkvKiBUYWJsZSBub3QgZm91bmQsIHJldHVybiBhbiBJbnRlZ2VyPTAgYW5kIEFFX09LICovCiAKLQkJZGRiX2hhbmRsZSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWRkYl9oYW5kbGUgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlZ2VyX29iamVjdCgodTY0KSAwKTsKIAkJaWYgKCFkZGJfaGFuZGxlKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCi0JCWRkYl9oYW5kbGUtPmludGVnZXIudmFsdWUgPSAwOwogCQkqcmV0dXJuX2Rlc2MgPSBkZGJfaGFuZGxlOwotCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMKaW5kZXggMzdkMGQzOS4uNTFkNWYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbnZydC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb252cnQuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAKIAkvKiBDcmVhdGUgYSBuZXcgaW50ZWdlciAqLwogCi0JcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZWdlcl9vYmplY3QocmVzdWx0KTsKIAlpZiAoIXJldHVybl9kZXNjKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KQEAgLTE3Nyw3ICsxNzcsNiBAQAogCiAJLyogU2F2ZSB0aGUgUmVzdWx0ICovCiAKLQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IHJlc3VsdDsKIAlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKHJldHVybl9kZXNjKTsKIAkqcmVzdWx0X2Rlc2MgPSByZXR1cm5fZGVzYzsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGZpZWxkLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmllbGQuYwppbmRleCAwYjMzZDZjLi4xNTg4YTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmllbGQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmllbGQuYwpAQCAtMTYyLDEzICsxNjIsMTIgQEAKIAl9IGVsc2UgewogCQkvKiBGaWVsZCB3aWxsIGZpdCB3aXRoaW4gYW4gSW50ZWdlciAobm9ybWFsIGNhc2UpICovCiAKLQkJYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVnZXJfb2JqZWN0KCh1NjQpIDApOwogCQlpZiAoIWJ1ZmZlcl9kZXNjKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQogCiAJCWxlbmd0aCA9IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKLQkJYnVmZmVyX2Rlc2MtPmludGVnZXIudmFsdWUgPSAwOwogCQlidWZmZXIgPSAmYnVmZmVyX2Rlc2MtPmludGVnZXIudmFsdWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcxLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcxLmMKaW5kZXggOTYzNWQyMS4uNzUyZmU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYwpAQCAtMTAwLDEyICsxMDAsMTIgQEAKIAogCQkvKiBDcmVhdGUgYSByZXR1cm4gb2JqZWN0IG9mIHR5cGUgSW50ZWdlciAqLwogCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJcmV0dXJuX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZWdlcl9vYmplY3QoYWNwaV9vc19nZXRfdGltZXIoKSk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQotCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IGFjcGlfb3NfZ2V0X3RpbWVyKCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoJCS8qICBVbmtub3duIG9wY29kZSAgKi8KQEAgLTU5OSw3ICs1OTksNyBAQAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CiAJY2FzZSBBTUxfTE5PVF9PUDoJLyogTE5vdCAoT3BlcmFuZCkgKi8KIAotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZWdlcl9vYmplY3QoKHU2NCkgMCk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTcwMiwxMyArNzAyLDExIEBACiAKIAkJLyogQWxsb2NhdGUgYSBkZXNjcmlwdG9yIHRvIGhvbGQgdGhlIHR5cGUuICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVnZXJfb2JqZWN0KCh1NjQpIHR5cGUpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQotCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IHR5cGU7CiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfU0laRV9PRl9PUDoJLyogc2l6ZV9vZiAoc291cmNlX29iamVjdCkgKi8KQEAgLTc3NywxMyArNzc1LDExIEBACiAJCSAqIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHNpemUgb2YgdGhlIG9iamVjdCwgY3JlYXRlIGEgcmVzdWx0CiAJCSAqIG9iamVjdCB0byBob2xkIHRoZSB2YWx1ZQogCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVnZXJfb2JqZWN0KHZhbHVlKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBjbGVhbnVwOwogCQl9Ci0KLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB2YWx1ZTsKIAkJYnJlYWs7CiAKIAljYXNlIEFNTF9SRUZfT0ZfT1A6CS8qIHJlZl9vZiAoc291cmNlX29iamVjdCkgKi8KQEAgLTk0NiwyNCArOTQyLDI0IEBACiAJCQkJCSAqIE5PVEU6IGluZGV4IGludG8gYSBidWZmZXIgaXMgTk9UIGEgcG9pbnRlciB0byBhCiAJCQkJCSAqIHN1Yi1idWZmZXIgb2YgdGhlIG1haW4gYnVmZmVyLCBpdCBpcyBvbmx5IGEgcG9pbnRlciB0byBhCiAJCQkJCSAqIHNpbmdsZSBlbGVtZW50IChieXRlKSBvZiB0aGUgYnVmZmVyIQotCQkJCQkgKi8KLQkJCQkJcmV0dXJuX2Rlc2MgPQotCQkJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0Ci0JCQkJCSAgICAoQUNQSV9UWVBFX0lOVEVHRVIpOwotCQkJCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJCX0KLQotCQkJCQkvKgorCQkJCQkgKgogCQkJCQkgKiBTaW5jZSB3ZSBhcmUgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiB0aGUgYnVmZmVyIGF0IHRoZQogCQkJCQkgKiBpbmRleGVkIGxvY2F0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCBhbiBhZGRpdGlvbmFsCiAJCQkJCSAqIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGl0c2VsZi4KIAkJCQkJICovCi0JCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0KLQkJCQkJICAgIHRlbXBfZGVzYy0+YnVmZmVyLgotCQkJCQkgICAgcG9pbnRlcltvcGVyYW5kWzBdLT5yZWZlcmVuY2UuCi0JCQkJCQkgICAgdmFsdWVdOworCQkJCQlyZXR1cm5fZGVzYyA9CisJCQkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlZ2VyX29iamVjdCgodTY0KQorCQkJCQkJCQkJICB0ZW1wX2Rlc2MtPgorCQkJCQkJCQkJICBidWZmZXIuCisJCQkJCQkJCQkgIHBvaW50ZXIKKwkJCQkJCQkJCSAgW29wZXJhbmQKKwkJCQkJCQkJCSAgIFswXS0+CisJCQkJCQkJCQkgICByZWZlcmVuY2UuCisJCQkJCQkJCQkgICB2YWx1ZV0pOworCQkJCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJCX0KIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnNi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnNi5jCmluZGV4IGFlNDNmNzYuLjI5NTU0MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzYuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3Bhcmc2LmMKQEAgLTI1MywxOCArMjUzLDE1IEBACiAJCX0KIAogCQkvKiBDcmVhdGUgYW4gaW50ZWdlciBmb3IgdGhlIHJldHVybiB2YWx1ZSAqLworCQkvKiBEZWZhdWx0IHJldHVybiB2YWx1ZSBpcyBBQ1BJX0lOVEVHRVJfTUFYIGlmIG5vIG1hdGNoIGZvdW5kICovCiAKLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVnZXJfb2JqZWN0KEFDUElfSU5URUdFUl9NQVgpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAKIAkJfQogCi0JCS8qIERlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIG5vIG1hdGNoIGZvdW5kICovCi0KLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX0lOVEVHRVJfTUFYOwotCiAJCS8qCiAJCSAqIEV4YW1pbmUgZWFjaCBlbGVtZW50IHVudGlsIGEgbWF0Y2ggaXMgZm91bmQuIEJvdGggbWF0Y2ggY29uZGl0aW9ucwogCQkgKiBtdXN0IGJlIHNhdGlzZmllZCBmb3IgYSBtYXRjaCB0byBvY2N1ci4gV2l0aGluIHRoZSBsb29wLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wLmMKaW5kZXggMmJhZDYxMy4uMmRlYjk4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcC5jCkBAIC02MzQsOCArNjM0LDggQEAKIAkodm9pZClhY3BpX25zX3dhbGtfbmFtZXNwYWNlKHR5cGUsIHN0YXJ0X2hhbmRsZSwgbWF4X2RlcHRoLAogCQkJCSAgICAgQUNQSV9OU19XQUxLX05PX1VOTE9DSyB8CiAJCQkJICAgICBBQ1BJX05TX1dBTEtfVEVNUF9OT0RFUywKLQkJCQkgICAgIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0LCAodm9pZCAqKSZpbmZvLAotCQkJCSAgICAgTlVMTCk7CisJCQkJICAgICBhY3BpX25zX2R1bXBfb25lX29iamVjdCwgTlVMTCwKKwkJCQkgICAgICh2b2lkICopJmluZm8sIE5VTEwpOwogfQogI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wZHYuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wZHYuYwppbmRleCAwZmU4N2YxLi4zNmJlN2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcGR2LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXBkdi5jCkBAIC0xMzEsNyArMTMxLDggQEAKIAogCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgc3lzX2J1c19oYW5kbGUsCiAJCQkJCUFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX05PX1VOTE9DSywKLQkJCQkJYWNwaV9uc19kdW1wX29uZV9kZXZpY2UsIE5VTEwsIE5VTEwpOworCQkJCQlhY3BpX25zX2R1bXBfb25lX2RldmljZSwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2V2YWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNldmFsLmMKaW5kZXggODQ2ZDExMy4uZjc3MWU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2V2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZXZhbC5jCkBAIC0zNjYsMzMgKzM2Niw0OSBAQAogYWNwaV9uc19leGVjX21vZHVsZV9jb2RlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1ldGhvZF9vYmosCiAJCQkgc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbykKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyb290X29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYXJlbnRfb2JqOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShuc19leGVjX21vZHVsZV9jb2RlKTsKIAorCS8qCisJICogR2V0IHRoZSBwYXJlbnQgbm9kZS4gV2UgY2hlYXQgYnkgdXNpbmcgdGhlIG5leHRfb2JqZWN0IGZpZWxkCisJICogb2YgdGhlIG1ldGhvZCBvYmplY3QgZGVzY3JpcHRvci4KKwkgKi8KKwlwYXJlbnRfbm9kZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJICAgIG1ldGhvZF9vYmotPm1ldGhvZC5uZXh0X29iamVjdCk7CisJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUocGFyZW50X25vZGUpOworCisJLyogTXVzdCBjbGVhciBuZXh0X29iamVjdCAoYWNwaV9uc19hdHRhY2hfb2JqZWN0IG5lZWRzIHRoZSBmaWVsZCkgKi8KKworCW1ldGhvZF9vYmotPm1ldGhvZC5uZXh0X29iamVjdCA9IE5VTEw7CisKIAkvKiBJbml0aWFsaXplIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCiAKIAlBQ1BJX01FTVNFVChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOwotCWluZm8tPnByZWZpeF9ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOworCWluZm8tPnByZWZpeF9ub2RlID0gcGFyZW50X25vZGU7CiAKIAkvKgotCSAqIEdldCB0aGUgY3VycmVudGx5IGF0dGFjaGVkIHJvb3Qgb2JqZWN0LiBBZGQgYSByZWZlcmVuY2UsIGJlY2F1c2UgdGhlCisJICogR2V0IHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgcGFyZW50IG9iamVjdC4gQWRkIGEgcmVmZXJlbmNlLCBiZWNhdXNlIHRoZQogCSAqIHJlZiBjb3VudCB3aWxsIGJlIGRlY3JlYXNlZCB3aGVuIHRoZSBtZXRob2Qgb2JqZWN0IGlzIGluc3RhbGxlZCB0bwotCSAqIHRoZSByb290IG5vZGUuCisJICogdGhlIHBhcmVudCBub2RlLgogCSAqLwotCXJvb3Rfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7Ci0JYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJvb3Rfb2JqKTsKKwlwYXJlbnRfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KHBhcmVudF9ub2RlKTsKKwlpZiAocGFyZW50X29iaikgeworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocGFyZW50X29iaik7CisJfQogCi0JLyogSW5zdGFsbCB0aGUgbWV0aG9kIChtb2R1bGUtbGV2ZWwgY29kZSkgaW4gdGhlIHJvb3Qgbm9kZSAqLworCS8qIEluc3RhbGwgdGhlIG1ldGhvZCAobW9kdWxlLWxldmVsIGNvZGUpIGluIHRoZSBwYXJlbnQgbm9kZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KGFjcGlfZ2JsX3Jvb3Rfbm9kZSwgbWV0aG9kX29iaiwKKwlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QocGFyZW50X25vZGUsIG1ldGhvZF9vYmosCiAJCQkJICAgICAgIEFDUElfVFlQRV9NRVRIT0QpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGV4aXQ7CiAJfQogCi0JLyogRXhlY3V0ZSB0aGUgcm9vdCBub2RlIGFzIGEgY29udHJvbCBtZXRob2QgKi8KKwkvKiBFeGVjdXRlIHRoZSBwYXJlbnQgbm9kZSBhcyBhIGNvbnRyb2wgbWV0aG9kICovCiAKIAlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOwogCkBAIC00MDEsMTUgKzQxNywxOSBAQAogCiAJLyogRGV0YWNoIHRoZSB0ZW1wb3JhcnkgbWV0aG9kIG9iamVjdCAqLwogCi0JYWNwaV9uc19kZXRhY2hfb2JqZWN0KGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJYWNwaV9uc19kZXRhY2hfb2JqZWN0KHBhcmVudF9ub2RlKTsKIAotCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJvb3Qgb2JqZWN0ICovCisJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGFyZW50IG9iamVjdCAqLwogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KGFjcGlfZ2JsX3Jvb3Rfbm9kZSwgcm9vdF9vYmosCi0JCQkJICBBQ1BJX1RZUEVfREVWSUNFKTsKKwlpZiAocGFyZW50X29iaikgeworCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QocGFyZW50X25vZGUsIHBhcmVudF9vYmosIHR5cGUpOworCX0gZWxzZSB7CisJCXBhcmVudF9ub2RlLT50eXBlID0gKHU4KXR5cGU7CisJfQogCiAgICAgICBleGl0OgotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyb290X29iaik7CisJaWYgKHBhcmVudF9vYmopIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHBhcmVudF9vYmopOworCX0KIAlyZXR1cm5fVk9JRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zaW5pdC5jCmluZGV4IDFkNWIzNjAuLjRmOGFiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2luaXQuYwpAQCAtOTYsNyArOTYsNyBAQAogCS8qIFdhbGsgZW50aXJlIG5hbWVzcGFjZSBmcm9tIHRoZSBzdXBwbGllZCByb290ICovCiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJICAgICBBQ1BJX1VJTlQzMl9NQVgsIGFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0LAorCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLCBhY3BpX25zX2luaXRfb25lX29iamVjdCwgTlVMTCwKIAkJCQkgICAgICZpbmZvLCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkR1cmluZyBXYWxrTmFtZXNwYWNlIikpOwpAQCAtMTU2LDcgKzE1Niw4IEBACiAKIAlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkJCUFDUElfVUlOVDMyX01BWCwgRkFMU0UsCi0JCQkJCWFjcGlfbnNfZmluZF9pbmlfbWV0aG9kcywgJmluZm8sIE5VTEwpOworCQkJCQlhY3BpX25zX2ZpbmRfaW5pX21ldGhvZHMsIE5VTEwsICZpbmZvLAorCQkJCQlOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KQEAgLTE4OSw3ICsxOTAsOCBAQAogCiAJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAogCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIEZBTFNFLAotCQkJCQlhY3BpX25zX2luaXRfb25lX2RldmljZSwgJmluZm8sIE5VTEwpOworCQkJCQlhY3BpX25zX2luaXRfb25lX2RldmljZSwgTlVMTCwgJmluZm8sCisJCQkJCU5VTEwpOwogCiAJQUNQSV9GUkVFKGluZm8uZXZhbHVhdGVfaW5mbyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMKaW5kZXggZjg0MjdhZi4uYjA1ZjQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVkZWYuYwpAQCAtMjMyLDYgKzIzMiwxMiBAQAogCQlzdGF0dXMgPSBhY3BpX25zX2NoZWNrX3BhY2thZ2UoZGF0YSwgcmV0dXJuX29iamVjdF9wdHIpOwogCX0KIAorCS8qCisJICogUGVyZm9ybSBhZGRpdGlvbmFsLCBtb3JlIGNvbXBsaWNhdGVkIHJlcGFpcnMgb24gYSBwZXItbmFtZQorCSAqIGJhc2lzLgorCSAqLworCXN0YXR1cyA9IGFjcGlfbnNfY29tcGxleF9yZXBhaXJzKGRhdGEsIG5vZGUsIHN0YXR1cywgcmV0dXJuX29iamVjdF9wdHIpOworCiBjaGVja192YWxpZGF0aW9uX3N0YXR1czoKIAkvKgogCSAqIElmIHRoZSBvYmplY3QgdmFsaWRhdGlvbiBmYWlsZWQgb3IgaWYgd2Ugc3VjY2Vzc2Z1bGx5IHJlcGFpcmVkIG9uZQpAQCAtNjAxLDcgKzYwNyw4IEBACiAJCSAqIHRoZXJlIGlzIG9ubHkgb25lIGVudHJ5KS4gV2UgbWF5IGJlIGFibGUgdG8gcmVwYWlyIHRoaXMgYnkKIAkJICogd3JhcHBpbmcgdGhlIHJldHVybmVkIFBhY2thZ2Ugd2l0aCBhIG5ldyBvdXRlciBQYWNrYWdlLgogCQkgKi8KLQkJaWYgKCgqZWxlbWVudHMpLT5jb21tb24udHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCQlpZiAoKmVsZW1lbnRzCisJCSAgICAmJiAoKCplbGVtZW50cyktPmNvbW1vbi50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKSkgewogCiAJCQkvKiBDcmVhdGUgdGhlIG5ldyBvdXRlciBwYWNrYWdlIGFuZCBwb3B1bGF0ZSBpdCAqLwogCkBAIC02NzMsNiArNjgwLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzdWJfcGFja2FnZTsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3ViX2VsZW1lbnRzOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCBub25fdHJhaWxpbmdfbnVsbCA9IEZBTFNFOwogCXUzMiBleHBlY3RlZF9jb3VudDsKIAl1MzIgaTsKIAl1MzIgajsKQEAgLTY4MCw2ICs2ODgsNDUgQEAKIAkvKiBWYWxpZGF0ZSBlYWNoIHN1Yi1QYWNrYWdlIGluIHRoZSBwYXJlbnQgUGFja2FnZSAqLwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJLyoKKwkJICogSGFuZGxpbmcgZm9yIE5VTEwgcGFja2FnZSBlbGVtZW50cy4gRm9yIG5vdywgd2Ugd2lsbCBzaW1wbHkgYWxsb3cKKwkJICogYSBwYXJlbnQgcGFja2FnZSB3aXRoIHRyYWlsaW5nIE5VTEwgZWxlbWVudHMuIFRoaXMgY2FuIGhhcHBlbiBpZgorCQkgKiB0aGUgcGFja2FnZSB3YXMgZGVmaW5lZCB0byBiZSBsb25nZXIgdGhhbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KKwkJICogVGhpcyBpcyBsZWdhbCBhcyBwZXIgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4gSXQgaXMgb2Z0ZW4gdXNlZAorCQkgKiB0byBhbGxvdyBmb3IgZHluYW1pYyBpbml0aWFsaXphdGlvbiBvZiBhIFBhY2thZ2UuCisJCSAqCisJCSAqIEEgZnV0dXJlIGVuaGFuY2VtZW50IG1heSBiZSB0byBzaW1wbHkgdHJ1bmNhdGUgdGhlIHBhY2thZ2UgdG8KKwkJICogcmVtb3ZlIHRoZSB0cmFpbGluZyBOVUxMIGVsZW1lbnRzLgorCQkgKi8KKwkJaWYgKCEoKmVsZW1lbnRzKSkgeworCQkJaWYgKCFub25fdHJhaWxpbmdfbnVsbCkgeworCisJCQkJLyogRW5zdXJlIHRoZSByZW1haW5pbmcgZWxlbWVudHMgYXJlIGFsbCBOVUxMICovCisKKwkJCQlmb3IgKGogPSAxOyBqIDwgKGNvdW50IC0gaSArIDEpOyBqKyspIHsKKwkJCQkJaWYgKGVsZW1lbnRzW2pdKSB7CisJCQkJCQlub25fdHJhaWxpbmdfbnVsbCA9IFRSVUU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIW5vbl90cmFpbGluZ19udWxsKSB7CisKKwkJCQkJLyogSWdub3JlIHRoZSB0cmFpbGluZyBOVUxMIGVsZW1lbnRzICovCisKKwkJCQkJcmV0dXJuIChBRV9PSyk7CisJCQkJfQorCQkJfQorCisJCQkvKiBUaGVyZSBhcmUgdHJhaWxpbmcgbm9uLW51bGwgZWxlbWVudHMsIGlzc3VlIHdhcm5pbmcgKi8KKworCQkJQUNQSV9XQVJOX1BSRURFRklORUQoKEFFX0lORk8sIGRhdGEtPnBhdGhuYW1lLAorCQkJCQkgICAgICBkYXRhLT5ub2RlX2ZsYWdzLAorCQkJCQkgICAgICAiRm91bmQgTlVMTCBlbGVtZW50IGF0IHBhY2thZ2UgaW5kZXggJXUiLAorCQkJCQkgICAgICBpKSk7CisJCQllbGVtZW50cysrOworCQkJY29udGludWU7CisJCX0KKwogCQlzdWJfcGFja2FnZSA9ICplbGVtZW50czsKIAkJc3ViX2VsZW1lbnRzID0gc3ViX3BhY2thZ2UtPnBhY2thZ2UuZWxlbWVudHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIuYwppbmRleCBkYjJiMmE5Li5kNTYzZjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpci5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCiAjaW5jbHVkZSAiYWNwcmVkZWYuaCIKIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCkBAIC03Niw3ICs3NywxMyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9vYmplY3QgPSAqcmV0dXJuX29iamVjdF9wdHI7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV3X29iamVjdDsKIAlhY3BpX3NpemUgbGVuZ3RoOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAorCS8qCisJICogQXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGF0IHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2FzIG5vdAorCSAqIG9uZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZXMgZm9yIHRoaXMgcHJlZGVmaW5lZCBuYW1lLiBBdHRlbXB0IHRvCisJICogcmVwYWlyIHRoZSBvYmplY3QuIE9ubHkgYSBsaW1pdGVkIG51bWJlciBvZiByZXBhaXJzIGFyZSBwb3NzaWJsZS4KKwkgKi8KIAlzd2l0Y2ggKHJldHVybl9vYmplY3QtPmNvbW1vbi50eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCkBAIC0xMTEsNDMgKzExOCw5NCBAQAogCQkgKi8KIAkJQUNQSV9NRU1DUFkobmV3X29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCiAJCQkgICAgcmV0dXJuX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aCk7CisJCWJyZWFrOwogCi0JCS8qCi0JCSAqIElmIHRoZSBvcmlnaW5hbCBvYmplY3QgaXMgYSBwYWNrYWdlIGVsZW1lbnQsIHdlIG5lZWQgdG86Ci0JCSAqIDEuIFNldCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBuZXcgb2JqZWN0IHRvIG1hdGNoIHRoZQotCQkgKiAgICByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9sZCBvYmplY3QuCi0JCSAqIDIuIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuCi0JCSAqLwotCQlpZiAocGFja2FnZV9pbmRleCAhPSBBQ1BJX05PVF9QQUNLQUdFX0VMRU1FTlQpIHsKLQkJCW5ld19vYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPQotCQkJICAgIHJldHVybl9vYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQ7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQkJaWYgKHJldHVybl9vYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPiAxKSB7Ci0JCQkJcmV0dXJuX29iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudC0tOworCQkvKiAxKSBEb2VzIHRoZSBtZXRob2Qvb2JqZWN0IGxlZ2FsbHkgcmV0dXJuIGEgYnVmZmVyPyAqLworCisJCWlmIChleHBlY3RlZF9idHlwZXMgJiBBQ1BJX1JUWVBFX0JVRkZFUikgeworCQkJLyoKKwkJCSAqIENvbnZlcnQgdGhlIEludGVnZXIgdG8gYSBwYWNrZWQtYnl0ZSBidWZmZXIuIF9NQVQgbmVlZHMKKwkJCSAqIHRoaXMgc29tZXRpbWVzLCBpZiBhIHJlYWQgaGFzIGJlZW4gcGVyZm9ybWVkIG9uIGEgRmllbGQKKwkJCSAqIG9iamVjdCB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2xvYmFsIGludGVnZXIKKwkJCSAqIHNpemUgKDMyIG9yIDY0IGJpdHMpLgorCQkJICovCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfY29udmVydF90b19idWZmZXIocmV0dXJuX29iamVjdCwKKwkJCQkJCSAgICAgICZuZXdfb2JqZWN0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybiAoc3RhdHVzKTsKIAkJCX0KLQotCQkJQUNQSV9XQVJOX1BSRURFRklORUQoKEFFX0lORk8sIGRhdGEtPnBhdGhuYW1lLAotCQkJCQkgICAgICBkYXRhLT5ub2RlX2ZsYWdzLAotCQkJCQkgICAgICAiQ29udmVydGVkIEJ1ZmZlciB0byBleHBlY3RlZCBTdHJpbmcgYXQgaW5kZXggJXUiLAotCQkJCQkgICAgICBwYWNrYWdlX2luZGV4KSk7Ci0JCX0gZWxzZSB7Ci0JCQlBQ1BJX1dBUk5fUFJFREVGSU5FRCgoQUVfSU5GTywgZGF0YS0+cGF0aG5hbWUsCi0JCQkJCSAgICAgIGRhdGEtPm5vZGVfZmxhZ3MsCi0JCQkJCSAgICAgICJDb252ZXJ0ZWQgQnVmZmVyIHRvIGV4cGVjdGVkIFN0cmluZyIpKTsKIAkJfQogCi0JCS8qIERlbGV0ZSBvbGQgb2JqZWN0LCBpbnN0YWxsIHRoZSBuZXcgcmV0dXJuIG9iamVjdCAqLworCQkvKiAyKSBEb2VzIHRoZSBtZXRob2Qvb2JqZWN0IGxlZ2FsbHkgcmV0dXJuIGEgc3RyaW5nPyAqLwogCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fb2JqZWN0KTsKLQkJKnJldHVybl9vYmplY3RfcHRyID0gbmV3X29iamVjdDsKLQkJZGF0YS0+ZmxhZ3MgfD0gQUNQSV9PQkpFQ1RfUkVQQUlSRUQ7Ci0JCXJldHVybiAoQUVfT0spOworCQllbHNlIGlmIChleHBlY3RlZF9idHlwZXMgJiBBQ1BJX1JUWVBFX1NUUklORykgeworCQkJLyoKKwkJCSAqIFRoZSBvbmx5IHN1cHBvcnRlZCBJbnRlZ2VyLXRvLVN0cmluZyBjb252ZXJzaW9uIGlzIHRvIGNvbnZlcnQKKwkJCSAqIGFuIGludGVnZXIgb2YgdmFsdWUgMCB0byBhIE5VTEwgc3RyaW5nLiBUaGUgbGFzdCBlbGVtZW50IG9mCisJCQkgKiBfQklGIGFuZCBfQklYIHBhY2thZ2VzIG9jY2FzaW9uYWxseSBuZWVkIHRoaXMgZml4LgorCQkJICovCisJCQlpZiAocmV0dXJuX29iamVjdC0+aW50ZWdlci52YWx1ZSAhPSAwKSB7CisJCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCX0KKworCQkJLyogQWxsb2NhdGUgYSBuZXcgTlVMTCBzdHJpbmcgb2JqZWN0ICovCisKKwkJCW5ld19vYmplY3QgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KDApOworCQkJaWYgKCFuZXdfb2JqZWN0KSB7CisJCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJfQorCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJyZWFrOworCisJCS8qIFdlIGNhbm5vdCByZXBhaXIgdGhpcyBvYmplY3QgKi8KKworCQlyZXR1cm4gKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KIAotCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJLyogT2JqZWN0IHdhcyBzdWNjZXNzZnVsbHkgcmVwYWlyZWQgKi8KKworCS8qCisJICogSWYgdGhlIG9yaWdpbmFsIG9iamVjdCBpcyBhIHBhY2thZ2UgZWxlbWVudCwgd2UgbmVlZCB0bzoKKwkgKiAxLiBTZXQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgbmV3IG9iamVjdCB0byBtYXRjaCB0aGUKKwkgKiAgICByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9sZCBvYmplY3QuCisJICogMi4gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9yaWdpbmFsIG9iamVjdC4KKwkgKi8KKwlpZiAocGFja2FnZV9pbmRleCAhPSBBQ1BJX05PVF9QQUNLQUdFX0VMRU1FTlQpIHsKKwkJbmV3X29iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9CisJCSAgICByZXR1cm5fb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50OworCisJCWlmIChyZXR1cm5fb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID4gMSkgeworCQkJcmV0dXJuX29iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudC0tOworCQl9CisKKwkJQUNQSV9JTkZPX1BSRURFRklORUQoKEFFX0lORk8sIGRhdGEtPnBhdGhuYW1lLCBkYXRhLT5ub2RlX2ZsYWdzLAorCQkJCSAgICAgICJDb252ZXJ0ZWQgJXMgdG8gZXhwZWN0ZWQgJXMgYXQgaW5kZXggJXUiLAorCQkJCSAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkgICAgICAocmV0dXJuX29iamVjdCksCisJCQkJICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShuZXdfb2JqZWN0KSwKKwkJCQkgICAgICBwYWNrYWdlX2luZGV4KSk7CisJfSBlbHNlIHsKKwkJQUNQSV9JTkZPX1BSRURFRklORUQoKEFFX0lORk8sIGRhdGEtPnBhdGhuYW1lLCBkYXRhLT5ub2RlX2ZsYWdzLAorCQkJCSAgICAgICJDb252ZXJ0ZWQgJXMgdG8gZXhwZWN0ZWQgJXMiLAorCQkJCSAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkgICAgICAocmV0dXJuX29iamVjdCksCisJCQkJICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCSAgICAgIChuZXdfb2JqZWN0KSkpOworCX0KKworCS8qIERlbGV0ZSBvbGQgb2JqZWN0LCBpbnN0YWxsIHRoZSBuZXcgcmV0dXJuIG9iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9vYmplY3QpOworCSpyZXR1cm5fb2JqZWN0X3B0ciA9IG5ld19vYmplY3Q7CisJZGF0YS0+ZmxhZ3MgfD0gQUNQSV9PQkpFQ1RfUkVQQUlSRUQ7CisJcmV0dXJuIChBRV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOTYsOCArMjU0LDggQEAKIAkqb2JqX2Rlc2NfcHRyID0gcGtnX29ial9kZXNjOwogCWRhdGEtPmZsYWdzIHw9IEFDUElfT0JKRUNUX1JFUEFJUkVEOwogCi0JQUNQSV9XQVJOX1BSRURFRklORUQoKEFFX0lORk8sIGRhdGEtPnBhdGhuYW1lLCBkYXRhLT5ub2RlX2ZsYWdzLAotCQkJICAgICAgIkluY29ycmVjdGx5IGZvcm1lZCBQYWNrYWdlLCBhdHRlbXB0aW5nIHJlcGFpciIpKTsKKwlBQ1BJX0lORk9fUFJFREVGSU5FRCgoQUVfSU5GTywgZGF0YS0+cGF0aG5hbWUsIGRhdGEtPm5vZGVfZmxhZ3MsCisJCQkgICAgICAiUmVwYWlyZWQgSW5jb3JyZWN0bHkgZm9ybWVkIFBhY2thZ2UiKSk7CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2I2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyMi5jCkBAIC0wLDAgKzEsNTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IG5zcmVwYWlyMiAtIFJlcGFpciBmb3Igb2JqZWN0cyByZXR1cm5lZCBieSBzcGVjaWZpYworICogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWQgbWV0aG9kcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDksIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCitBQ1BJX01PRFVMRV9OQU1FKCJuc3JlcGFpcjIiKQorCisvKgorICogSW5mb3JtYXRpb24gc3RydWN0dXJlIGFuZCBoYW5kbGVyIGZvciBBQ1BJIHByZWRlZmluZWQgbmFtZXMgdGhhdCBjYW4KKyAqIGJlIHJlcGFpcmVkIG9uIGEgcGVyLW5hbWUgYmFzaXMuCisgKi8KK3R5cGVkZWYKK2FjcGlfc3RhdHVzKCphY3BpX3JlcGFpcl9mdW5jdGlvbikgKHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfZGF0YSAqZGF0YSwKKwkJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmplY3RfcHRyKTsKKwordHlwZWRlZiBzdHJ1Y3QgYWNwaV9yZXBhaXJfaW5mbyB7CisJY2hhciBuYW1lW0FDUElfTkFNRV9TSVpFXTsKKwlhY3BpX3JlcGFpcl9mdW5jdGlvbiByZXBhaXJfZnVuY3Rpb247CisKK30gYWNwaV9yZXBhaXJfaW5mbzsKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfcmVwYWlyX2luZm8gKmFjcGlfbnNfbWF0Y2hfcmVwYWlyYWJsZV9uYW1lKHN0cnVjdAorCQkJCQkJCQkgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCQkgICAgKm5vZGUpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfcmVwYWlyX0FMUihzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX2RhdGEgKmRhdGEsCisJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fb2JqZWN0X3B0cik7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19yZXBhaXJfUFNTKHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfZGF0YSAqZGF0YSwKKwkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmplY3RfcHRyKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX3JlcGFpcl9UU1Moc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9kYXRhICpkYXRhLAorCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX29iamVjdF9wdHIpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfY2hlY2tfc29ydGVkX2xpc3Qoc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9kYXRhICpkYXRhLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0LAorCQkJICB1MzIgZXhwZWN0ZWRfY291bnQsCisJCQkgIHUzMiBzb3J0X2luZGV4LAorCQkJICB1OCBzb3J0X2RpcmVjdGlvbiwgY2hhciAqc29ydF9rZXlfbmFtZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19yZW1vdmVfbnVsbF9lbGVtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX3NvcnRfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZWxlbWVudHMsCisJCSAgdTMyIGNvdW50LCB1MzIgaW5kZXgsIHU4IHNvcnRfZGlyZWN0aW9uKTsKKworLyogVmFsdWVzIGZvciBzb3J0X2RpcmVjdGlvbiBhYm92ZSAqLworCisjZGVmaW5lIEFDUElfU09SVF9BU0NFTkRJTkcgICAgIDAKKyNkZWZpbmUgQUNQSV9TT1JUX0RFU0NFTkRJTkcgICAgMQorCisvKgorICogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgbmFtZXMgb2YgdGhlIHByZWRlZmluZWQgbWV0aG9kcyBmb3Igd2hpY2ggd2UgY2FuCisgKiBwZXJmb3JtIG1vcmUgY29tcGxleCByZXBhaXJzLgorICoKKyAqIF9BTFI6IFNvcnQgdGhlIGxpc3QgYXNjZW5kaW5nIGJ5IGFtYmllbnRfaWxsdW1pbmFuY2UgaWYgbmVjZXNzYXJ5CisgKiBfUFNTOiBTb3J0IHRoZSBsaXN0IGRlc2NlbmRpbmcgYnkgUG93ZXIgaWYgbmVjZXNzYXJ5CisgKiBfVFNTOiBTb3J0IHRoZSBsaXN0IGRlc2NlbmRpbmcgYnkgUG93ZXIgaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9yZXBhaXJfaW5mbyBhY3BpX25zX3JlcGFpcmFibGVfbmFtZXNbXSA9IHsKKwl7Il9BTFIiLCBhY3BpX25zX3JlcGFpcl9BTFJ9LAorCXsiX1BTUyIsIGFjcGlfbnNfcmVwYWlyX1BTU30sCisJeyJfVFNTIiwgYWNwaV9uc19yZXBhaXJfVFNTfSwKKwl7ezAsIDAsIDAsIDB9LCBOVUxMfQkvKiBUYWJsZSB0ZXJtaW5hdG9yICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY29tcGxleF9yZXBhaXJzCisgKgorICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHZhbGlkYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBtZXRob2Qvb2JqZWN0CisgKiAgICAgICAgICAgICAgdmFsaWRhdGVfc3RhdHVzICAgICAtIE9yaWdpbmFsIHN0YXR1cyBvZiBlYXJsaWVyIHZhbGlkYXRpb24KKyAqICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0X3B0ciAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgYSBtZXRob2Qgb3Igb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cy4gQUVfT0sgaWYgcmVwYWlyIHdhcyBzdWNjZXNzZnVsLiBJZiBuYW1lIGlzIG5vdAorICogICAgICAgICAgICAgIG1hdGNoZWQsIHZhbGlkYXRlX3N0YXR1cyBpcyByZXR1cm5lZC4KKyAqCisgKiBERVNDUklQVElPTjogQXR0ZW1wdCB0byByZXBhaXIvY29udmVydCBhIHJldHVybiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgd2FzCisgKiAgICAgICAgICAgICAgbm90IGV4cGVjdGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfY29tcGxleF9yZXBhaXJzKHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfZGF0YSAqZGF0YSwKKwkJCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJYWNwaV9zdGF0dXMgdmFsaWRhdGVfc3RhdHVzLAorCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmplY3RfcHRyKQoreworCWNvbnN0IHN0cnVjdCBhY3BpX3JlcGFpcl9pbmZvICpwcmVkZWZpbmVkOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIENoZWNrIGlmIHRoaXMgbmFtZSBpcyBpbiB0aGUgbGlzdCBvZiByZXBhaXJhYmxlIG5hbWVzICovCisKKwlwcmVkZWZpbmVkID0gYWNwaV9uc19tYXRjaF9yZXBhaXJhYmxlX25hbWUobm9kZSk7CisJaWYgKCFwcmVkZWZpbmVkKSB7CisJCXJldHVybiAodmFsaWRhdGVfc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPSBwcmVkZWZpbmVkLT5yZXBhaXJfZnVuY3Rpb24oZGF0YSwgcmV0dXJuX29iamVjdF9wdHIpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX21hdGNoX3JlcGFpcmFibGVfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBtZXRob2Qvb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gZW50cnkgaW4gcmVwYWlyIHRhYmxlLiBOVUxMIGluZGljYXRlcyBub3QgZm91bmQuCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGFuIG9iamVjdCBuYW1lIGFnYWluc3QgdGhlIHJlcGFpcmFibGUgb2JqZWN0IGxpc3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfcmVwYWlyX2luZm8gKmFjcGlfbnNfbWF0Y2hfcmVwYWlyYWJsZV9uYW1lKHN0cnVjdAorCQkJCQkJCQkgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCQkgICAgKm5vZGUpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfcmVwYWlyX2luZm8gKnRoaXNfbmFtZTsKKworCS8qIFNlYXJjaCBpbmZvIHRhYmxlIGZvciBhIHJlcGFpcmFibGUgcHJlZGVmaW5lZCBtZXRob2Qvb2JqZWN0IG5hbWUgKi8KKworCXRoaXNfbmFtZSA9IGFjcGlfbnNfcmVwYWlyYWJsZV9uYW1lczsKKwl3aGlsZSAodGhpc19uYW1lLT5yZXBhaXJfZnVuY3Rpb24pIHsKKwkJaWYgKEFDUElfQ09NUEFSRV9OQU1FKG5vZGUtPm5hbWUuYXNjaWksIHRoaXNfbmFtZS0+bmFtZSkpIHsKKwkJCXJldHVybiAodGhpc19uYW1lKTsKKwkJfQorCQl0aGlzX25hbWUrKzsKKwl9CisKKwlyZXR1cm4gKE5VTEwpOwkJLyogTm90IGZvdW5kICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19yZXBhaXJfQUxSCisgKgorICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHZhbGlkYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0X3B0ciAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgYSBtZXRob2Qgb3Igb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cy4gQUVfT0sgaWYgb2JqZWN0IGlzIE9LIG9yIHdhcyByZXBhaXJlZCBzdWNjZXNzZnVsbHkKKyAqCisgKiBERVNDUklQVElPTjogUmVwYWlyIGZvciB0aGUgX0FMUiBvYmplY3QuIElmIG5lY2Vzc2FyeSwgc29ydCB0aGUgb2JqZWN0IGxpc3QKKyAqICAgICAgICAgICAgICBhc2NlbmRpbmcgYnkgdGhlIGFtYmllbnQgaWxsdW1pbmFuY2UgdmFsdWVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX3JlcGFpcl9BTFIoc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9kYXRhICpkYXRhLAorCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX29iamVjdF9wdHIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCA9ICpyZXR1cm5fb2JqZWN0X3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBhY3BpX25zX2NoZWNrX3NvcnRlZF9saXN0KGRhdGEsIHJldHVybl9vYmplY3QsIDIsIDEsCisJCQkJCSAgIEFDUElfU09SVF9BU0NFTkRJTkcsCisJCQkJCSAgICJBbWJpZW50SWxsdW1pbmFuY2UiKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3JlcGFpcl9UU1MKKyAqCisgKiBQQVJBTUVURVJTOiAgRGF0YSAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdmFsaWRhdGlvbiBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICAgIHJldHVybl9vYmplY3RfcHRyICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiBhIG1ldGhvZCBvciBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLiBBRV9PSyBpZiBvYmplY3QgaXMgT0sgb3Igd2FzIHJlcGFpcmVkIHN1Y2Nlc3NmdWxseQorICoKKyAqIERFU0NSSVBUSU9OOiBSZXBhaXIgZm9yIHRoZSBfVFNTIG9iamVjdC4gSWYgbmVjZXNzYXJ5LCBzb3J0IHRoZSBvYmplY3QgbGlzdAorICogICAgICAgICAgICAgIGRlc2NlbmRpbmcgYnkgdGhlIHBvd2VyIGRpc3NpcGF0aW9uIHZhbHVlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19yZXBhaXJfVFNTKHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfZGF0YSAqZGF0YSwKKwkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmplY3RfcHRyKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9vYmplY3QgPSAqcmV0dXJuX29iamVjdF9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gYWNwaV9uc19jaGVja19zb3J0ZWRfbGlzdChkYXRhLCByZXR1cm5fb2JqZWN0LCA1LCAxLAorCQkJCQkgICBBQ1BJX1NPUlRfREVTQ0VORElORywKKwkJCQkJICAgIlBvd2VyRGlzc2lwYXRpb24iKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3JlcGFpcl9QU1MKKyAqCisgKiBQQVJBTUVURVJTOiAgRGF0YSAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdmFsaWRhdGlvbiBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICAgIHJldHVybl9vYmplY3RfcHRyICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiBhIG1ldGhvZCBvciBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLiBBRV9PSyBpZiBvYmplY3QgaXMgT0sgb3Igd2FzIHJlcGFpcmVkIHN1Y2Nlc3NmdWxseQorICoKKyAqIERFU0NSSVBUSU9OOiBSZXBhaXIgZm9yIHRoZSBfUFNTIG9iamVjdC4gSWYgbmVjZXNzYXJ5LCBzb3J0IHRoZSBvYmplY3QgbGlzdAorICogICAgICAgICAgICAgIGJ5IHRoZSBDUFUgZnJlcXVlbmNpZXMuIENoZWNrIHRoYXQgdGhlIHBvd2VyIGRpc3NpcGF0aW9uIHZhbHVlcworICogICAgICAgICAgICAgIGFyZSBhbGwgcHJvcG9ydGlvbmFsIHRvIENQVSBmcmVxdWVuY3kgKGkuZS4sIHNvcnRpbmcgYnkKKyAqICAgICAgICAgICAgICBmcmVxdWVuY3kgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHNvcnRpbmcgYnkgcG93ZXIuKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX3JlcGFpcl9QU1Moc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9kYXRhICpkYXRhLAorCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX29iamVjdF9wdHIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCA9ICpyZXR1cm5fb2JqZWN0X3B0cjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3V0ZXJfZWxlbWVudHM7CisJdTMyIG91dGVyX2VsZW1lbnRfY291bnQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmVsZW1lbnRzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXUzMiBwcmV2aW91c192YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CisKKwkvKgorCSAqIEVudHJpZXMgKHN1Yi1wYWNrYWdlcykgaW4gdGhlIF9QU1MgUGFja2FnZSBtdXN0IGJlIHNvcnRlZCBieSBwb3dlcgorCSAqIGRpc3NpcGF0aW9uLCBpbiBkZXNjZW5kaW5nIG9yZGVyLiBJZiBpdCBhcHBlYXJzIHRoYXQgdGhlIGxpc3QgaXMKKwkgKiBpbmNvcnJlY3RseSBzb3J0ZWQsIHNvcnQgaXQuIFdlIHNvcnQgYnkgY3B1X2ZyZXF1ZW5jeSwgc2luY2UgdGhpcworCSAqIHNob3VsZCBiZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvd2VyLgorCSAqLworCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfc29ydGVkX2xpc3QoZGF0YSwgcmV0dXJuX29iamVjdCwgNiwgMCwKKwkJCQkJICAgQUNQSV9TT1JUX0RFU0NFTkRJTkcsCisJCQkJCSAgICJDcHVGcmVxdWVuY3kiKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qCisJICogV2Ugbm93IGtub3cgdGhlIGxpc3QgaXMgY29ycmVjdGx5IHNvcnRlZCBieSBDUFUgZnJlcXVlbmN5LiBDaGVjayBpZgorCSAqIHRoZSBwb3dlciBkaXNzaXBhdGlvbiB2YWx1ZXMgYXJlIHByb3BvcnRpb25hbC4KKwkgKi8KKwlwcmV2aW91c192YWx1ZSA9IEFDUElfVUlOVDMyX01BWDsKKwlvdXRlcl9lbGVtZW50cyA9IHJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CisJb3V0ZXJfZWxlbWVudF9jb3VudCA9IHJldHVybl9vYmplY3QtPnBhY2thZ2UuY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3V0ZXJfZWxlbWVudF9jb3VudDsgaSsrKSB7CisJCWVsZW1lbnRzID0gKCpvdXRlcl9lbGVtZW50cyktPnBhY2thZ2UuZWxlbWVudHM7CisJCW9ial9kZXNjID0gZWxlbWVudHNbMV07CS8qIEluZGV4MSA9IHBvd2VyX2Rpc3NpcGF0aW9uICovCisKKwkJaWYgKCh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlID4gcHJldmlvdXNfdmFsdWUpIHsKKwkJCUFDUElfV0FSTl9QUkVERUZJTkVEKChBRV9JTkZPLCBkYXRhLT5wYXRobmFtZSwKKwkJCQkJICAgICAgZGF0YS0+bm9kZV9mbGFncywKKwkJCQkJICAgICAgIlN1YlBhY2thZ2VbJXUsJXVdIC0gc3VzcGljaW91cyBwb3dlciBkaXNzaXBhdGlvbiB2YWx1ZXMiLAorCQkJCQkgICAgICBpIC0gMSwgaSkpOworCQl9CisKKwkJcHJldmlvdXNfdmFsdWUgPSAodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKKwkJb3V0ZXJfZWxlbWVudHMrKzsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2NoZWNrX3NvcnRlZF9saXN0CisgKgorICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHZhbGlkYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxldmVsIHJldHVybmVkIG9iamVjdAorICogICAgICAgICAgICAgIGV4cGVjdGVkX2NvdW50ICAgICAgLSBNaW5pbXVtIGxlbmd0aCBvZiBlYWNoIHN1Yi1wYWNrYWdlCisgKiAgICAgICAgICAgICAgc29ydF9pbmRleCAgICAgICAgICAtIFN1Yi1wYWNrYWdlIGVudHJ5IHRvIHNvcnQgb24KKyAqICAgICAgICAgICAgICBzb3J0X2RpcmVjdGlvbiAgICAgIC0gQXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcKKyAqICAgICAgICAgICAgICBzb3J0X2tleV9uYW1lICAgICAgIC0gTmFtZSBvZiB0aGUgc29ydF9pbmRleCBmaWVsZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMuIEFFX09LIGlmIHRoZSBsaXN0IGlzIHZhbGlkIGFuZCBpcyBzb3J0ZWQgY29ycmVjdGx5IG9yCisgKiAgICAgICAgICAgICAgaGFzIGJlZW4gcmVwYWlyZWQgYnkgc29ydGluZyB0aGUgbGlzdC4KKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgaWYgdGhlIHBhY2thZ2UgbGlzdCBpcyB2YWxpZCBhbmQgc29ydGVkIGNvcnJlY3RseSBieSB0aGUKKyAqICAgICAgICAgICAgICBzb3J0X2luZGV4LiBJZiBub3QsIHRoZW4gc29ydCB0aGUgbGlzdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19jaGVja19zb3J0ZWRfbGlzdChzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX2RhdGEgKmRhdGEsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9vYmplY3QsCisJCQkgIHUzMiBleHBlY3RlZF9jb3VudCwKKwkJCSAgdTMyIHNvcnRfaW5kZXgsCisJCQkgIHU4IHNvcnRfZGlyZWN0aW9uLCBjaGFyICpzb3J0X2tleV9uYW1lKQoreworCXUzMiBvdXRlcl9lbGVtZW50X2NvdW50OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvdXRlcl9lbGVtZW50czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZWxlbWVudHM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdTMyIGk7CisJdTMyIHByZXZpb3VzX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIFRoZSB0b3AtbGV2ZWwgb2JqZWN0IG11c3QgYmUgYSBwYWNrYWdlICovCisKKwlpZiAocmV0dXJuX29iamVjdC0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwl9CisKKwkvKgorCSAqIERldGVjdCBhbnkgTlVMTCBwYWNrYWdlIGVsZW1lbnRzIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZQorCSAqIHBhY2thZ2UuCisJICoKKwkgKiBUQkQ6IFdlIG1heSB3YW50IHRvIGRvIHRoaXMgZm9yIGFsbCBwcmVkZWZpbmVkIG5hbWVzIHRoYXQKKwkgKiByZXR1cm4gYSB2YXJpYWJsZS1sZW5ndGggcGFja2FnZSBvZiBwYWNrYWdlcy4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX25zX3JlbW92ZV9udWxsX2VsZW1lbnRzKHJldHVybl9vYmplY3QpOworCWlmIChzdGF0dXMgPT0gQUVfTlVMTF9FTlRSWSkgeworCQlBQ1BJX0lORk9fUFJFREVGSU5FRCgoQUVfSU5GTywgZGF0YS0+cGF0aG5hbWUsIGRhdGEtPm5vZGVfZmxhZ3MsCisJCQkJICAgICAgIk5VTEwgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHBhY2thZ2UiKSk7CisKKwkJLyogRXhpdCBpZiBwYWNrYWdlIGlzIG5vdyB6ZXJvIGxlbmd0aCAqLworCisJCWlmICghcmV0dXJuX29iamVjdC0+cGFja2FnZS5jb3VudCkgeworCQkJcmV0dXJuIChBRV9OVUxMX0VOVFJZKTsKKwkJfQorCX0KKworCW91dGVyX2VsZW1lbnRzID0gcmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50czsKKwlvdXRlcl9lbGVtZW50X2NvdW50ID0gcmV0dXJuX29iamVjdC0+cGFja2FnZS5jb3VudDsKKwlpZiAoIW91dGVyX2VsZW1lbnRfY291bnQpIHsKKwkJcmV0dXJuIChBRV9BTUxfUEFDS0FHRV9MSU1JVCk7CisJfQorCisJcHJldmlvdXNfdmFsdWUgPSAwOworCWlmIChzb3J0X2RpcmVjdGlvbiA9PSBBQ1BJX1NPUlRfREVTQ0VORElORykgeworCQlwcmV2aW91c192YWx1ZSA9IEFDUElfVUlOVDMyX01BWDsKKwl9CisKKwkvKiBFeGFtaW5lIGVhY2ggc3VicGFja2FnZSAqLworCisJZm9yIChpID0gMDsgaSA8IG91dGVyX2VsZW1lbnRfY291bnQ7IGkrKykgeworCisJCS8qIEVhY2ggZWxlbWVudCBvZiB0aGUgdG9wLWxldmVsIHBhY2thZ2UgbXVzdCBhbHNvIGJlIGEgcGFja2FnZSAqLworCisJCWlmICgoKm91dGVyX2VsZW1lbnRzKS0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKworCQkvKiBFYWNoIHN1Yi1wYWNrYWdlIG11c3QgaGF2ZSB0aGUgbWluaW11bSBsZW5ndGggKi8KKworCQlpZiAoKCpvdXRlcl9lbGVtZW50cyktPnBhY2thZ2UuY291bnQgPCBleHBlY3RlZF9jb3VudCkgeworCQkJcmV0dXJuIChBRV9BTUxfUEFDS0FHRV9MSU1JVCk7CisJCX0KKworCQllbGVtZW50cyA9ICgqb3V0ZXJfZWxlbWVudHMpLT5wYWNrYWdlLmVsZW1lbnRzOworCQlvYmpfZGVzYyA9IGVsZW1lbnRzW3NvcnRfaW5kZXhdOworCisJCWlmIChvYmpfZGVzYy0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKworCQkvKgorCQkgKiBUaGUgbGlzdCBtdXN0IGJlIHNvcnRlZCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLiBJZiB3ZSBkZXRlY3QgYQorCQkgKiBkaXNjcmVwYW5jeSwgaXNzdWUgYSB3YXJuaW5nIGFuZCBzb3J0IHRoZSBlbnRpcmUgbGlzdAorCQkgKi8KKwkJaWYgKCgoc29ydF9kaXJlY3Rpb24gPT0gQUNQSV9TT1JUX0FTQ0VORElORykgJiYKKwkJICAgICAob2JqX2Rlc2MtPmludGVnZXIudmFsdWUgPCBwcmV2aW91c192YWx1ZSkpIHx8CisJCSAgICAoKHNvcnRfZGlyZWN0aW9uID09IEFDUElfU09SVF9ERVNDRU5ESU5HKSAmJgorCQkgICAgIChvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA+IHByZXZpb3VzX3ZhbHVlKSkpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9uc19zb3J0X2xpc3QocmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50cywKKwkJCQkJICAgICAgb3V0ZXJfZWxlbWVudF9jb3VudCwgc29ydF9pbmRleCwKKwkJCQkJICAgICAgc29ydF9kaXJlY3Rpb24pOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJfQorCisJCQlkYXRhLT5mbGFncyB8PSBBQ1BJX09CSkVDVF9SRVBBSVJFRDsKKworCQkJQUNQSV9JTkZPX1BSRURFRklORUQoKEFFX0lORk8sIGRhdGEtPnBhdGhuYW1lLAorCQkJCQkgICAgICBkYXRhLT5ub2RlX2ZsYWdzLAorCQkJCQkgICAgICAiUmVwYWlyZWQgdW5zb3J0ZWQgbGlzdCAtIG5vdyBzb3J0ZWQgYnkgJXMiLAorCQkJCQkgICAgICBzb3J0X2tleV9uYW1lKSk7CisJCQlyZXR1cm4gKEFFX09LKTsKKwkJfQorCisJCXByZXZpb3VzX3ZhbHVlID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CisJCW91dGVyX2VsZW1lbnRzKys7CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19yZW1vdmVfbnVsbF9lbGVtZW50cworICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gQSBQYWNrYWdlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMuIEFFX05VTExfRU5UUlkgbWVhbnMgdGhhdCBvbmUgb3IgbW9yZSBlbGVtZW50cyB3ZXJlCisgKiAgICAgICAgICAgICAgcmVtb3ZlZC4KKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIGFsbCBOVUxMIHBhY2thZ2UgZWxlbWVudHMgYW5kIHVwZGF0ZSB0aGUgcGFja2FnZSBjb3VudC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19yZW1vdmVfbnVsbF9lbGVtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc291cmNlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZXN0OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiBjb3VudDsKKwl1MzIgbmV3X2NvdW50OworCXUzMiBpOworCisJY291bnQgPSBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsKKwluZXdfY291bnQgPSBjb3VudDsKKworCXNvdXJjZSA9IG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzOworCWRlc3QgPSBzb3VyY2U7CisKKwkvKiBFeGFtaW5lIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFja2FnZSBvYmplY3QgKi8KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmICghKnNvdXJjZSkgeworCQkJc3RhdHVzID0gQUVfTlVMTF9FTlRSWTsKKwkJCW5ld19jb3VudC0tOworCQl9IGVsc2UgeworCQkJKmRlc3QgPSAqc291cmNlOworCQkJZGVzdCsrOworCQl9CisJCXNvdXJjZSsrOworCX0KKworCWlmIChzdGF0dXMgPT0gQUVfTlVMTF9FTlRSWSkgeworCisJCS8qIE5VTEwgdGVybWluYXRlIGxpc3QgYW5kIHVwZGF0ZSB0aGUgcGFja2FnZSBjb3VudCAqLworCisJCSpkZXN0ID0gTlVMTDsKKwkJb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQgPSBuZXdfY291bnQ7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc29ydF9saXN0CisgKgorICogUEFSQU1FVEVSUzogIEVsZW1lbnRzICAgICAgICAgICAgLSBQYWNrYWdlIG9iamVjdCBlbGVtZW50IGxpc3QKKyAqICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgIC0gRWxlbWVudCBjb3VudCBmb3IgYWJvdmUKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gU29ydCBieSB3aGljaCBwYWNrYWdlIGVsZW1lbnQKKyAqICAgICAgICAgICAgICBzb3J0X2RpcmVjdGlvbiAgICAgIC0gQXNjZW5kaW5nIG9yIERlc2NlbmRpbmcgc29ydAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU29ydCB0aGUgb2JqZWN0cyB0aGF0IGFyZSBpbiBhIHBhY2thZ2UgZWxlbWVudCBsaXN0LgorICoKKyAqIE5PVEU6IEFzc3VtZXMgdGhhdCBhbGwgTlVMTCBlbGVtZW50cyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWNrYWdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX3NvcnRfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZWxlbWVudHMsCisJCSAgdTMyIGNvdW50LCB1MzIgaW5kZXgsIHU4IHNvcnRfZGlyZWN0aW9uKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjMTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzI7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGVtcF9vYmo7CisJdTMyIGk7CisJdTMyIGo7CisKKwkvKiBTaW1wbGUgYnViYmxlIHNvcnQgKi8KKworCWZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisJCWZvciAoaiA9IChjb3VudCAtIDEpOyBqID49IGk7IGotLSkgeworCQkJb2JqX2Rlc2MxID0gZWxlbWVudHNbaiAtIDFdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKKwkJCW9ial9kZXNjMiA9IGVsZW1lbnRzW2pdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKKworCQkJaWYgKCgoc29ydF9kaXJlY3Rpb24gPT0gQUNQSV9TT1JUX0FTQ0VORElORykgJiYKKwkJCSAgICAgKG9ial9kZXNjMS0+aW50ZWdlci52YWx1ZSA+CisJCQkgICAgICBvYmpfZGVzYzItPmludGVnZXIudmFsdWUpKQorCQkJICAgIHx8ICgoc29ydF9kaXJlY3Rpb24gPT0gQUNQSV9TT1JUX0RFU0NFTkRJTkcpCisJCQkJJiYgKG9ial9kZXNjMS0+aW50ZWdlci52YWx1ZSA8CisJCQkJICAgIG9ial9kZXNjMi0+aW50ZWdlci52YWx1ZSkpKSB7CisJCQkJdGVtcF9vYmogPSBlbGVtZW50c1tqIC0gMV07CisJCQkJZWxlbWVudHNbaiAtIDFdID0gZWxlbWVudHNbal07CisJCQkJZWxlbWVudHNbal0gPSB0ZW1wX29iajsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN3YWxrLmMKaW5kZXggMzU1MzlkZi4uZDdlNmI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3dhbGsuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zd2Fsay5jCkBAIC0xNjUsMjQgKzE2NSwyNyBAQAogICogICAgICAgICAgICAgIG1heF9kZXB0aCAgICAgICAgICAgLSBEZXB0aCB0byB3aGljaCBzZWFyY2ggaXMgdG8gcmVhY2gKICAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gV2hldGhlciB0byB1bmxvY2sgdGhlIE5TIGJlZm9yZSBpbnZva2luZwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGJhY2sgcm91dGluZQotICogICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gICAgICAgLSBDYWxsZWQgd2hlbiBhbiBvYmplY3Qgb2YgIlR5cGUiIGlzIGZvdW5kCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCB0byB1c2VyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIGZyb20gdGhlIHVzZXJfZnVuY3Rpb24gaWYgdGVybWluYXRlZCBlYXJseS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm5zIE5VTEwuCisgKiAgICAgICAgICAgICAgcHJlX29yZGVyX3Zpc2l0ICAgICAtIENhbGxlZCBkdXJpbmcgdHJlZSBwcmUtb3JkZXIgdmlzaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3Qgb2YgIlR5cGUiIGlzIGZvdW5kCisgKiAgICAgICAgICAgICAgcG9zdF9vcmRlcl92aXNpdCAgICAtIENhbGxlZCBkdXJpbmcgdHJlZSBwb3N0LW9yZGVyIHZpc2l0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IG9mICJUeXBlIiBpcyBmb3VuZAorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgdG8gdXNlciBmdW5jdGlvbihzKSBhYm92ZQorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBmcm9tIHRoZSB1c2VyX2Z1bmN0aW9uIGlmIHRlcm1pbmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFybHkuIE90aGVyd2lzZSwgcmV0dXJucyBOVUxMLgogICogUkVUVVJOUzogICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBQZXJmb3JtcyBhIG1vZGlmaWVkIGRlcHRoLWZpcnN0IHdhbGsgb2YgdGhlIG5hbWVzcGFjZSB0cmVlLAogICogICAgICAgICAgICAgIHN0YXJ0aW5nIChhbmQgZW5kaW5nKSBhdCB0aGUgbm9kZSBzcGVjaWZpZWQgYnkgc3RhcnRfaGFuZGxlLgotICogICAgICAgICAgICAgIFRoZSB1c2VyX2Z1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5vZGUgdGhhdCBtYXRjaGVzCi0gKiAgICAgICAgICAgICAgdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGZvdW5kLiAgSWYgdGhlIHVzZXIgZnVuY3Rpb24gcmV0dXJucworICogICAgICAgICAgICAgIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBub2RlIHRoYXQgbWF0Y2hlcworICogICAgICAgICAgICAgIHRoZSB0eXBlIHBhcmFtZXRlciBpcyBmb3VuZC4gSWYgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJldHVybnMKICAqICAgICAgICAgICAgICBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgc2VhcmNoIGlzIHRlcm1pbmF0ZWQgaW1tZWRpYXRlbHkgYW5kCiAgKiAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgogICoKICAqICAgICAgICAgICAgICBUaGUgcG9pbnQgb2YgdGhpcyBwcm9jZWR1cmUgaXMgdG8gcHJvdmlkZSBhIGdlbmVyaWMgbmFtZXNwYWNlCiAgKiAgICAgICAgICAgICAgd2FsayByb3V0aW5lIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIHBsYWNlcyB0bwotICogICAgICAgICAgICAgIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXM7ICB0aGUgVXNlciBGdW5jdGlvbiBjYW4gYmUgdGFpbG9yZWQKLSAqICAgICAgICAgICAgICB0byBlYWNoIHRhc2ssIHdoZXRoZXIgaXQgaXMgYSBwcmludCBmdW5jdGlvbiwgYSBjb21wYXJlCi0gKiAgICAgICAgICAgICAgZnVuY3Rpb24sIGV0Yy4KKyAqICAgICAgICAgICAgICBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzOyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24ocykgY2FuIGJlCisgKiAgICAgICAgICAgICAgdGFpbG9yZWQgdG8gZWFjaCB0YXNrLCB3aGV0aGVyIGl0IGlzIGEgcHJpbnQgZnVuY3Rpb24sCisgKiAgICAgICAgICAgICAgYSBjb21wYXJlIGZ1bmN0aW9uLCBldGMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTkxLDcgKzE5NCw4IEBACiAJCSAgICAgICBhY3BpX2hhbmRsZSBzdGFydF9ub2RlLAogCQkgICAgICAgdTMyIG1heF9kZXB0aCwKIAkJICAgICAgIHUzMiBmbGFncywKLQkJICAgICAgIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAorCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHByZV9vcmRlcl92aXNpdCwKKwkJICAgICAgIGFjcGlfd2Fsa19jYWxsYmFjayBwb3N0X29yZGVyX3Zpc2l0LAogCQkgICAgICAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC0yMDAsNiArMjA0LDcgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CiAJYWNwaV9vYmplY3RfdHlwZSBjaGlsZF90eXBlOwogCXUzMiBsZXZlbDsKKwl1OCBub2RlX3ByZXZpb3VzbHlfdmlzaXRlZCA9IEZBTFNFOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShuc193YWxrX25hbWVzcGFjZSk7CiAKQEAgLTIxMiw3ICsyMTcsNyBAQAogCS8qIE51bGwgY2hpbGQgbWVhbnMgImdldCBmaXJzdCBub2RlIiAqLwogCiAJcGFyZW50X25vZGUgPSBzdGFydF9ub2RlOwotCWNoaWxkX25vZGUgPSBOVUxMOworCWNoaWxkX25vZGUgPSBhY3BpX25zX2dldF9uZXh0X25vZGUocGFyZW50X25vZGUsIE5VTEwpOwogCWNoaWxkX3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCWxldmVsID0gMTsKIApAQCAtMjIxLDEwMiArMjI2LDEyOSBAQAogCSAqIHN0YXJ0ZWQuIFdoZW4gTGV2ZWwgaXMgemVybywgdGhlIGxvb3AgaXMgZG9uZSBiZWNhdXNlIHdlIGhhdmUKIAkgKiBidWJibGVkIHVwIHRvIChhbmQgcGFzc2VkKSB0aGUgb3JpZ2luYWwgcGFyZW50IGhhbmRsZSAoc3RhcnRfZW50cnkpCiAJICovCi0Jd2hpbGUgKGxldmVsID4gMCkgewotCi0JCS8qIEdldCB0aGUgbmV4dCBub2RlIGluIHRoaXMgc2NvcGUuICBOdWxsIGlmIG5vdCBmb3VuZCAqLwotCisJd2hpbGUgKGxldmVsID4gMCAmJiBjaGlsZF9ub2RlKSB7CiAJCXN0YXR1cyA9IEFFX09LOworCisJCS8qIEZvdW5kIG5leHQgY2hpbGQsIGdldCB0aGUgdHlwZSBpZiB3ZSBhcmUgbm90IHNlYXJjaGluZyBmb3IgQU5ZICovCisKKwkJaWYgKHR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgeworCQkJY2hpbGRfdHlwZSA9IGNoaWxkX25vZGUtPnR5cGU7CisJCX0KKworCQkvKgorCQkgKiBJZ25vcmUgYWxsIHRlbXBvcmFyeSBuYW1lc3BhY2Ugbm9kZXMgKGNyZWF0ZWQgZHVyaW5nIGNvbnRyb2wKKwkJICogbWV0aG9kIGV4ZWN1dGlvbikgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLiBUaGVzZSB0ZW1wb3Jhcnkgbm9kZXMKKwkJICogY2FuIGNhdXNlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSB0aGV5IGNhbiBiZSBkZWxldGVkIGR1cmluZworCQkgKiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB1c2VyIGZ1bmN0aW9uIChpZiB0aGUgbmFtZXNwYWNlIGlzCisJCSAqIHVubG9ja2VkIGJlZm9yZSBpbnZvY2F0aW9uIG9mIHRoZSB1c2VyIGZ1bmN0aW9uLikgT25seSB0aGUKKwkJICogZGVidWdnZXIgbmFtZXNwYWNlIGR1bXAgd2lsbCBleGFtaW5lIHRoZSB0ZW1wb3Jhcnkgbm9kZXMuCisJCSAqLworCQlpZiAoKGNoaWxkX25vZGUtPmZsYWdzICYgQU5PQkpfVEVNUE9SQVJZKSAmJgorCQkgICAgIShmbGFncyAmIEFDUElfTlNfV0FMS19URU1QX05PREVTKSkgeworCQkJc3RhdHVzID0gQUVfQ1RSTF9ERVBUSDsKKwkJfQorCisJCS8qIFR5cGUgbXVzdCBtYXRjaCByZXF1ZXN0ZWQgdHlwZSAqLworCisJCWVsc2UgaWYgKGNoaWxkX3R5cGUgPT0gdHlwZSkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgbWF0Y2hpbmcgbm9kZSwgaW52b2tlIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCQkJICogVW5sb2NrIHRoZSBuYW1lc3BhY2UgaWYgZmxhZyBpcyBzZXQuCisJCQkgKi8KKwkJCWlmIChmbGFncyAmIEFDUElfTlNfV0FMS19VTkxPQ0spIHsKKwkJCQltdXRleF9zdGF0dXMgPQorCQkJCSAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKG11dGV4X3N0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKG11dGV4X3N0YXR1cyk7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogSW52b2tlIHRoZSB1c2VyIGZ1bmN0aW9uLCBlaXRoZXIgcHJlLW9yZGVyIG9yIHBvc3Qtb3JkZXIKKwkJCSAqIG9yIGJvdGguCisJCQkgKi8KKwkJCWlmICghbm9kZV9wcmV2aW91c2x5X3Zpc2l0ZWQpIHsKKwkJCQlpZiAocHJlX29yZGVyX3Zpc2l0KSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBwcmVfb3JkZXJfdmlzaXQoY2hpbGRfbm9kZSwgbGV2ZWwsCisJCQkJCQkJICAgIGNvbnRleHQsCisJCQkJCQkJICAgIHJldHVybl92YWx1ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocG9zdF9vcmRlcl92aXNpdCkgeworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgcG9zdF9vcmRlcl92aXNpdChjaGlsZF9ub2RlLCBsZXZlbCwKKwkJCQkJCQkgICAgIGNvbnRleHQsCisJCQkJCQkJICAgICByZXR1cm5fdmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGZsYWdzICYgQUNQSV9OU19XQUxLX1VOTE9DSykgeworCQkJCW11dGV4X3N0YXR1cyA9CisJCQkJICAgIGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUobXV0ZXhfc3RhdHVzKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMobXV0ZXhfc3RhdHVzKTsKKwkJCQl9CisJCQl9CisKKwkJCXN3aXRjaCAoc3RhdHVzKSB7CisJCQljYXNlIEFFX09LOgorCQkJY2FzZSBBRV9DVFJMX0RFUFRIOgorCisJCQkJLyogSnVzdCBrZWVwIGdvaW5nICovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUVfQ1RSTF9URVJNSU5BVEU6CisKKwkJCQkvKiBFeGl0IG5vdywgd2l0aCBPSyBzdGF0dXMgKi8KKworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQkvKiBBbGwgb3RoZXJzIGFyZSB2YWxpZCBleGNlcHRpb25zICovCisKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERlcHRoIGZpcnN0IHNlYXJjaDogQXR0ZW1wdCB0byBnbyBkb3duIGFub3RoZXIgbGV2ZWwgaW4gdGhlCisJCSAqIG5hbWVzcGFjZSBpZiB3ZSBhcmUgYWxsb3dlZCB0by4gIERvbid0IGdvIGFueSBmdXJ0aGVyIGlmIHdlIGhhdmUKKwkJICogcmVhY2hlZCB0aGUgY2FsbGVyIHNwZWNpZmllZCBtYXhpbXVtIGRlcHRoIG9yIGlmIHRoZSB1c2VyCisJCSAqIGZ1bmN0aW9uIGhhcyBzcGVjaWZpZWQgdGhhdCB0aGUgbWF4aW11bSBkZXB0aCBoYXMgYmVlbiByZWFjaGVkLgorCQkgKi8KKwkJaWYgKCFub2RlX3ByZXZpb3VzbHlfdmlzaXRlZCAmJgorCQkgICAgKGxldmVsIDwgbWF4X2RlcHRoKSAmJiAoc3RhdHVzICE9IEFFX0NUUkxfREVQVEgpKSB7CisJCQlpZiAoY2hpbGRfbm9kZS0+Y2hpbGQpIHsKKworCQkJCS8qIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZCBvZiB0aGlzIG5vZGUsIHZpc2l0IGl0ICovCisKKwkJCQlsZXZlbCsrOworCQkJCXBhcmVudF9ub2RlID0gY2hpbGRfbm9kZTsKKwkJCQljaGlsZF9ub2RlID0KKwkJCQkgICAgYWNwaV9uc19nZXRfbmV4dF9ub2RlKHBhcmVudF9ub2RlLCBOVUxMKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIE5vIG1vcmUgY2hpbGRyZW4sIHJlLXZpc2l0IHRoaXMgbm9kZSAqLworCisJCWlmICghbm9kZV9wcmV2aW91c2x5X3Zpc2l0ZWQpIHsKKwkJCW5vZGVfcHJldmlvdXNseV92aXNpdGVkID0gVFJVRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTm8gbW9yZSBjaGlsZHJlbiwgdmlzaXQgcGVlcnMgKi8KKwogCQljaGlsZF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF9ub2RlKHBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKTsKIAkJaWYgKGNoaWxkX25vZGUpIHsKKwkJCW5vZGVfcHJldmlvdXNseV92aXNpdGVkID0gRkFMU0U7CisJCX0KIAotCQkJLyogRm91bmQgbmV4dCBjaGlsZCwgZ2V0IHRoZSB0eXBlIGlmIHdlIGFyZSBub3Qgc2VhcmNoaW5nIGZvciBBTlkgKi8KKwkJLyogTm8gcGVlcnMsIHJlLXZpc2l0IHBhcmVudCAqLwogCi0JCQlpZiAodHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKSB7Ci0JCQkJY2hpbGRfdHlwZSA9IGNoaWxkX25vZGUtPnR5cGU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJZ25vcmUgYWxsIHRlbXBvcmFyeSBuYW1lc3BhY2Ugbm9kZXMgKGNyZWF0ZWQgZHVyaW5nIGNvbnRyb2wKLQkJCSAqIG1ldGhvZCBleGVjdXRpb24pIHVubGVzcyB0b2xkIG90aGVyd2lzZS4gVGhlc2UgdGVtcG9yYXJ5IG5vZGVzCi0JCQkgKiBjYW4gY2F1c2UgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIHRoZXkgY2FuIGJlIGRlbGV0ZWQgZHVyaW5nCi0JCQkgKiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB1c2VyIGZ1bmN0aW9uIChpZiB0aGUgbmFtZXNwYWNlIGlzCi0JCQkgKiB1bmxvY2tlZCBiZWZvcmUgaW52b2NhdGlvbiBvZiB0aGUgdXNlciBmdW5jdGlvbi4pIE9ubHkgdGhlCi0JCQkgKiBkZWJ1Z2dlciBuYW1lc3BhY2UgZHVtcCB3aWxsIGV4YW1pbmUgdGhlIHRlbXBvcmFyeSBub2Rlcy4KLQkJCSAqLwotCQkJaWYgKChjaGlsZF9ub2RlLT5mbGFncyAmIEFOT0JKX1RFTVBPUkFSWSkgJiYKLQkJCSAgICAhKGZsYWdzICYgQUNQSV9OU19XQUxLX1RFTVBfTk9ERVMpKSB7Ci0JCQkJc3RhdHVzID0gQUVfQ1RSTF9ERVBUSDsKLQkJCX0KLQotCQkJLyogVHlwZSBtdXN0IG1hdGNoIHJlcXVlc3RlZCB0eXBlICovCi0KLQkJCWVsc2UgaWYgKGNoaWxkX3R5cGUgPT0gdHlwZSkgewotCQkJCS8qCi0JCQkJICogRm91bmQgYSBtYXRjaGluZyBub2RlLCBpbnZva2UgdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0JCQkJICogVW5sb2NrIHRoZSBuYW1lc3BhY2UgaWYgZmxhZyBpcyBzZXQuCi0JCQkJICovCi0JCQkJaWYgKGZsYWdzICYgQUNQSV9OU19XQUxLX1VOTE9DSykgewotCQkJCQltdXRleF9zdGF0dXMgPQotCQkJCQkgICAgYWNwaV91dF9yZWxlYXNlX211dGV4Ci0JCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShtdXRleF9zdGF0dXMpKSB7Ci0JCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKLQkJCQkJCSAgICAobXV0ZXhfc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIHVzZXJfZnVuY3Rpb24oY2hpbGRfbm9kZSwgbGV2ZWwsIGNvbnRleHQsCi0JCQkJCQkgIHJldHVybl92YWx1ZSk7Ci0KLQkJCQlpZiAoZmxhZ3MgJiBBQ1BJX05TX1dBTEtfVU5MT0NLKSB7Ci0JCQkJCW11dGV4X3N0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgKLQkJCQkJICAgIChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKG11dGV4X3N0YXR1cykpIHsKLQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUwotCQkJCQkJICAgIChtdXRleF9zdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCQljYXNlIEFFX09LOgotCQkJCWNhc2UgQUVfQ1RSTF9ERVBUSDoKLQotCQkJCQkvKiBKdXN0IGtlZXAgZ29pbmcgKi8KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEFFX0NUUkxfVEVSTUlOQVRFOgotCi0JCQkJCS8qIEV4aXQgbm93LCB3aXRoIE9LIHN0YXR1cyAqLwotCi0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLQkJCQlkZWZhdWx0OgotCi0JCQkJCS8qIEFsbCBvdGhlcnMgYXJlIHZhbGlkIGV4Y2VwdGlvbnMgKi8KLQotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBEZXB0aCBmaXJzdCBzZWFyY2g6IEF0dGVtcHQgdG8gZ28gZG93biBhbm90aGVyIGxldmVsIGluIHRoZQotCQkJICogbmFtZXNwYWNlIGlmIHdlIGFyZSBhbGxvd2VkIHRvLiAgRG9uJ3QgZ28gYW55IGZ1cnRoZXIgaWYgd2UgaGF2ZQotCQkJICogcmVhY2hlZCB0aGUgY2FsbGVyIHNwZWNpZmllZCBtYXhpbXVtIGRlcHRoIG9yIGlmIHRoZSB1c2VyCi0JCQkgKiBmdW5jdGlvbiBoYXMgc3BlY2lmaWVkIHRoYXQgdGhlIG1heGltdW0gZGVwdGggaGFzIGJlZW4gcmVhY2hlZC4KLQkJCSAqLwotCQkJaWYgKChsZXZlbCA8IG1heF9kZXB0aCkgJiYgKHN0YXR1cyAhPSBBRV9DVFJMX0RFUFRIKSkgewotCQkJCWlmIChjaGlsZF9ub2RlLT5jaGlsZCkgewotCi0JCQkJCS8qIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZCBvZiB0aGlzIG5vZGUsIHZpc2l0IGl0ICovCi0KLQkJCQkJbGV2ZWwrKzsKLQkJCQkJcGFyZW50X25vZGUgPSBjaGlsZF9ub2RlOwotCQkJCQljaGlsZF9ub2RlID0gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7CisJCWVsc2UgewogCQkJLyoKIAkJCSAqIE5vIG1vcmUgY2hpbGRyZW4gb2YgdGhpcyBub2RlIChhY3BpX25zX2dldF9uZXh0X25vZGUgZmFpbGVkKSwgZ28KIAkJCSAqIGJhY2sgdXB3YXJkcyBpbiB0aGUgbmFtZXNwYWNlIHRyZWUgdG8gdGhlIG5vZGUncyBwYXJlbnQuCkBAIC0zMjQsNiArMzU2LDggQEAKIAkJCWxldmVsLS07CiAJCQljaGlsZF9ub2RlID0gcGFyZW50X25vZGU7CiAJCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKKworCQkJbm9kZV9wcmV2aW91c2x5X3Zpc2l0ZWQgPSBUUlVFOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZldmFsLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZldmFsLmMKaW5kZXggNDkyOWRiZC4uZjJiZDFkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4ZmV2YWwuYwpAQCAtNDMzLDggKzQzMywxMSBAQAogICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBhY3BpX29iamVjdF90eXBlIHRvIHNlYXJjaCBmb3IKICAqICAgICAgICAgICAgICBzdGFydF9vYmplY3QgICAgICAgIC0gSGFuZGxlIGluIG5hbWVzcGFjZSB3aGVyZSBzZWFyY2ggYmVnaW5zCiAgKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIERlcHRoIHRvIHdoaWNoIHNlYXJjaCBpcyB0byByZWFjaAotICogICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gICAgICAgLSBDYWxsZWQgd2hlbiBhbiBvYmplY3Qgb2YgIlR5cGUiIGlzIGZvdW5kCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCB0byB1c2VyIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgcHJlX29yZGVyX3Zpc2l0ICAgICAtIENhbGxlZCBkdXJpbmcgdHJlZSBwcmUtb3JkZXIgdmlzaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBhbiBvYmplY3Qgb2YgIlR5cGUiIGlzIGZvdW5kCisgKiAgICAgICAgICAgICAgcG9zdF9vcmRlcl92aXNpdCAgICAtIENhbGxlZCBkdXJpbmcgdHJlZSBwb3N0LW9yZGVyIHZpc2l0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYW4gb2JqZWN0IG9mICJUeXBlIiBpcyBmb3VuZAorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgdG8gdXNlciBmdW5jdGlvbihzKSBhYm92ZQogICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBMb2NhdGlvbiB3aGVyZSByZXR1cm4gdmFsdWUgb2YKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiBpcyBwdXQgaWYgdGVybWluYXRlZCBlYXJseQogICoKQEAgLTQ0MywxNiArNDQ2LDE2IEBACiAgKgogICogREVTQ1JJUFRJT046IFBlcmZvcm1zIGEgbW9kaWZpZWQgZGVwdGgtZmlyc3Qgd2FsayBvZiB0aGUgbmFtZXNwYWNlIHRyZWUsCiAgKiAgICAgICAgICAgICAgc3RhcnRpbmcgKGFuZCBlbmRpbmcpIGF0IHRoZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IHN0YXJ0X2hhbmRsZS4KLSAqICAgICAgICAgICAgICBUaGUgdXNlcl9mdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IHRoYXQgbWF0Y2hlcwotICogICAgICAgICAgICAgIHRoZSB0eXBlIHBhcmFtZXRlciBpcyBmb3VuZC4gIElmIHRoZSB1c2VyIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgICAgICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIG9iamVjdCB0aGF0IG1hdGNoZXMKKyAqICAgICAgICAgICAgICB0aGUgdHlwZSBwYXJhbWV0ZXIgaXMgZm91bmQuIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zCiAgKiAgICAgICAgICAgICAgYSBub24temVybyB2YWx1ZSwgdGhlIHNlYXJjaCBpcyB0ZXJtaW5hdGVkIGltbWVkaWF0ZWx5IGFuZCB0aGlzCiAgKiAgICAgICAgICAgICAgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KICAqCiAgKiAgICAgICAgICAgICAgVGhlIHBvaW50IG9mIHRoaXMgcHJvY2VkdXJlIGlzIHRvIHByb3ZpZGUgYSBnZW5lcmljIG5hbWVzcGFjZQogICogICAgICAgICAgICAgIHdhbGsgcm91dGluZSB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSBwbGFjZXMgdG8KLSAqICAgICAgICAgICAgICBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzOyAgdGhlIFVzZXIgRnVuY3Rpb24gY2FuIGJlIHRhaWxvcmVkCi0gKiAgICAgICAgICAgICAgdG8gZWFjaCB0YXNrLCB3aGV0aGVyIGl0IGlzIGEgcHJpbnQgZnVuY3Rpb24sIGEgY29tcGFyZQotICogICAgICAgICAgICAgIGZ1bmN0aW9uLCBldGMuCisgKiAgICAgICAgICAgICAgcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlczsgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uKHMpIGNhbiBiZQorICogICAgICAgICAgICAgIHRhaWxvcmVkIHRvIGVhY2ggdGFzaywgd2hldGhlciBpdCBpcyBhIHByaW50IGZ1bmN0aW9uLAorICogICAgICAgICAgICAgIGEgY29tcGFyZSBmdW5jdGlvbiwgZXRjLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ2MCw3ICs0NjMsOCBAQAogYWNwaV93YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCiAJCSAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCiAJCSAgICB1MzIgbWF4X2RlcHRoLAotCQkgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICBhY3BpX3dhbGtfY2FsbGJhY2sgcHJlX29yZGVyX3Zpc2l0LAorCQkgICAgYWNwaV93YWxrX2NhbGxiYWNrIHBvc3Rfb3JkZXJfdmlzaXQsCiAJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTQ2OSw3ICs0NzMsOCBAQAogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAotCWlmICgodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHx8ICghbWF4X2RlcHRoKSB8fCAoIXVzZXJfZnVuY3Rpb24pKSB7CisJaWYgKCh0eXBlID4gQUNQSV9UWVBFX0xPQ0FMX01BWCkgfHwKKwkgICAgKCFtYXhfZGVwdGgpIHx8ICghcHJlX29yZGVyX3Zpc2l0ICYmICFwb3N0X29yZGVyX3Zpc2l0KSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC01MDEsOCArNTA2LDkgQEAKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKHR5cGUsIHN0YXJ0X29iamVjdCwgbWF4X2RlcHRoLAotCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLCB1c2VyX2Z1bmN0aW9uLAotCQkJCQljb250ZXh0LCByZXR1cm5fdmFsdWUpOworCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLCBwcmVfb3JkZXJfdmlzaXQsCisJCQkJCXBvc3Rfb3JkZXJfdmlzaXQsIGNvbnRleHQsCisJCQkJCXJldHVybl92YWx1ZSk7CiAKIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIApAQCAtNjgxLDggKzY4Nyw4IEBACiAKIAlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkJCUFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX1VOTE9DSywKLQkJCQkJYWNwaV9uc19nZXRfZGV2aWNlX2NhbGxiYWNrLCAmaW5mbywKLQkJCQkJcmV0dXJuX3ZhbHVlKTsKKwkJCQkJYWNwaV9uc19nZXRfZGV2aWNlX2NhbGxiYWNrLCBOVUxMLAorCQkJCQkmaW5mbywgcmV0dXJuX3ZhbHVlKTsKIAogCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc2xvb3AuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNsb29wLmMKaW5kZXggY2Q3OTk1Yi4uMDk4OGU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc2xvb3AuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzbG9vcC5jCkBAIC04Nyw3ICs4Nyw4IEBACiAJCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgYWNwaV9zdGF0dXMgc3RhdHVzKTsKIAogc3RhdGljIHZvaWQKLWFjcGlfcHNfbGlua19tb2R1bGVfY29kZSh1OCAqYW1sX3N0YXJ0LCB1MzIgYW1sX2xlbmd0aCwgYWNwaV9vd25lcl9pZCBvd25lcl9pZCk7CithY3BpX3BzX2xpbmtfbW9kdWxlX2NvZGUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudF9vcCwKKwkJCSB1OCAqYW1sX3N0YXJ0LCB1MzIgYW1sX2xlbmd0aCwgYWNwaV9vd25lcl9pZCBvd25lcl9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDc5LDExICs0ODAsMTQgQEAKIAkJCQkgKi8KIAkJCQlpZiAod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPT0KIAkJCQkgICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxKSB7Ci0JCQkJCWFjcGlfcHNfbGlua19tb2R1bGVfY29kZShhbWxfb3Bfc3RhcnQsCi0JCQkJCQkJCSB3YWxrX3N0YXRlLT4KKwkJCQkJYWNwaV9wc19saW5rX21vZHVsZV9jb2RlKG9wLT5jb21tb24uCisJCQkJCQkJCSBwYXJlbnQsCisJCQkJCQkJCSBhbWxfb3Bfc3RhcnQsCisJCQkJCQkJCSAodTMyKQorCQkJCQkJCQkgKHdhbGtfc3RhdGUtPgogCQkJCQkJCQkgcGFyc2VyX3N0YXRlLgogCQkJCQkJCQkgcGtnX2VuZCAtCi0JCQkJCQkJCSBhbWxfb3Bfc3RhcnQsCisJCQkJCQkJCSBhbWxfb3Bfc3RhcnQpLAogCQkJCQkJCQkgd2Fsa19zdGF0ZS0+CiAJCQkJCQkJCSBvd25lcl9pZCk7CiAJCQkJfQpAQCAtNTk4LDcgKzYwMiw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfbGlua19tb2R1bGVfY29kZQogICoKLSAqIFBBUkFNRVRFUlM6ICBhbWxfc3RhcnQgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgQU1MCisgKiBQQVJBTUVURVJTOiAgcGFyZW50X29wICAgICAgICAgICAtIFBhcmVudCBwYXJzZXIgb3AKKyAqICAgICAgICAgICAgICBhbWxfc3RhcnQgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgQU1MCiAgKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgICAgICAtIExlbmd0aCBvZiBleGVjdXRhYmxlIEFNTAogICogICAgICAgICAgICAgIG93bmVyX2lkICAgICAgICAgICAgLSBvd25lcl9pZCBvZiBtb2R1bGUgbGV2ZWwgY29kZQogICoKQEAgLTYxMSwxMSArNjE2LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV9wc19saW5rX21vZHVsZV9jb2RlKHU4ICphbWxfc3RhcnQsIHUzMiBhbWxfbGVuZ3RoLCBhY3BpX293bmVyX2lkIG93bmVyX2lkKQorYWNwaV9wc19saW5rX21vZHVsZV9jb2RlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnRfb3AsCisJCQkgdTggKmFtbF9zdGFydCwgdTMyIGFtbF9sZW5ndGgsIGFjcGlfb3duZXJfaWQgb3duZXJfaWQpCiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcHJldjsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0OwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1ldGhvZF9vYmo7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCiAJLyogR2V0IHRoZSB0YWlsIG9mIHRoZSBsaXN0ICovCiAKQEAgLTYzOSwxMSArNjQ2LDI0IEBACiAJCQlyZXR1cm47CiAJCX0KIAorCQlpZiAocGFyZW50X29wLT5jb21tb24ubm9kZSkgeworCQkJcGFyZW50X25vZGUgPSBwYXJlbnRfb3AtPmNvbW1vbi5ub2RlOworCQl9IGVsc2UgeworCQkJcGFyZW50X25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CisJCX0KKwogCQltZXRob2Rfb2JqLT5tZXRob2QuYW1sX3N0YXJ0ID0gYW1sX3N0YXJ0OwogCQltZXRob2Rfb2JqLT5tZXRob2QuYW1sX2xlbmd0aCA9IGFtbF9sZW5ndGg7CiAJCW1ldGhvZF9vYmotPm1ldGhvZC5vd25lcl9pZCA9IG93bmVyX2lkOwogCQltZXRob2Rfb2JqLT5tZXRob2QuZmxhZ3MgfD0gQU9QT0JKX01PRFVMRV9MRVZFTDsKIAorCQkvKgorCQkgKiBTYXZlIHRoZSBwYXJlbnQgbm9kZSBpbiBuZXh0X29iamVjdC4gVGhpcyBpcyBjaGVhdGluZywgYnV0IHdlCisJCSAqIGRvbid0IHdhbnQgdG8gZXhwYW5kIHRoZSBtZXRob2Qgb2JqZWN0LgorCQkgKi8KKwkJbWV0aG9kX29iai0+bWV0aG9kLm5leHRfb2JqZWN0ID0KKwkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgcGFyZW50X25vZGUpOworCiAJCWlmICghcHJldikgewogCQkJYWNwaV9nYmxfbW9kdWxlX2NvZGVfbGlzdCA9IG1ldGhvZF9vYmo7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzcGFyc2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCmluZGV4IDcwODM4ZTkuLjRkZjhmMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCkBAIC02MTAsMTcgKzYxMCwxMyBAQAogCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iaikgewogCQkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+CiAJCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iaiA9Ci0JCQkJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0Ci0JCQkJCQkgICAgKEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJCQkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlZ2VyX29iamVjdAorCQkJCQkJICAgICgodTY0KSAwKTsKIAkJCQkJCWlmICghcHJldmlvdXNfd2Fsa19zdGF0ZS0+CiAJCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iaikgewogCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUwogCQkJCQkJCSAgICAoQUVfTk9fTUVNT1JZKTsKIAkJCQkJCX0KLQotCQkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+Ci0JCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iai0+Ci0JCQkJCQkgICAgaW50ZWdlci52YWx1ZSA9IDA7CiAJCQkJCX0KIAogCQkJCQkvKiBSZXN0YXJ0IHRoZSBjYWxsaW5nIGNvbnRyb2wgbWV0aG9kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCmluZGV4IGRkOTczMWMuLjEyOTM0YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCkBAIC0zMDYsMTQgKzMwNiwxMiBAQAogCSAqLwogCWlmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHsKIAkJd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiA9Ci0JCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZWdlcl9vYmplY3QoKHU2NCkgMCk7CiAJCWlmICghd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQotCi0JCXdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmotPmludGVnZXIudmFsdWUgPSAwOwogCX0KIAogCS8qIFBhcnNlIHRoZSBBTUwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRtaXNjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bWlzYy5jCmluZGV4IDYxZjYzMTUuLjZjNmE1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG1pc2MuYwpAQCAtMTE2MSwzICsxMTYxLDQ1IEBACiAJQUNQSV9DT01NT05fTVNHX1NVRkZJWDsKIAl2YV9lbmQoYXJncyk7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHJlZGVmaW5lZF9pbmZvCisgKgorICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQorICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQorICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIEZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUKKyAqICAgICAgICAgICAgICBub2RlX2ZsYWdzICAgICAgLSBGcm9tIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgbWV0aG9kL29iamVjdAorICogICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgc3RyaW5nICsgYWRkaXRpb25hbCBhcmdzCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogSW5mbyBtZXNzYWdlcyBmb3IgdGhlIHByZWRlZmluZWQgdmFsaWRhdGlvbiBtb2R1bGUuIE1lc3NhZ2VzCisgKiAgICAgICAgICAgICAgYXJlIG9ubHkgZW1pdHRlZCB0aGUgZmlyc3QgdGltZSBhIHByb2JsZW0gd2l0aCBhIHBhcnRpY3VsYXIKKyAqICAgICAgICAgICAgICBtZXRob2Qvb2JqZWN0IGlzIGRldGVjdGVkLiBUaGlzIHByZXZlbnRzIGEgZmxvb2Qgb2YKKyAqICAgICAgICAgICAgICBtZXNzYWdlcyBmb3IgbWV0aG9kcyB0aGF0IGFyZSByZXBlYXRlZGx5IGV2YWx1YXRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCithY3BpX3V0X3ByZWRlZmluZWRfaW5mbyhjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkJCXUzMiBsaW5lX251bWJlciwKKwkJCWNoYXIgKnBhdGhuYW1lLCB1OCBub2RlX2ZsYWdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwkvKgorCSAqIFdhcm5pbmcgbWVzc2FnZXMgZm9yIHRoaXMgbWV0aG9kL29iamVjdCB3aWxsIGJlIGRpc2FibGVkIGFmdGVyIHRoZQorCSAqIGZpcnN0IHRpbWUgYSB2YWxpZGF0aW9uIGZhaWxzIG9yIGFuIG9iamVjdCBpcyBzdWNjZXNzZnVsbHkgcmVwYWlyZWQuCisJICovCisJaWYgKG5vZGVfZmxhZ3MgJiBBTk9CSl9FVkFMVUFURUQpIHsKKwkJcmV0dXJuOworCX0KKworCWFjcGlfb3NfcHJpbnRmKCJBQ1BJIEluZm8gZm9yICVzOiAiLCBwYXRobmFtZSk7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOworCUFDUElfQ09NTU9OX01TR19TVUZGSVg7CisJdmFfZW5kKGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG9iamVjdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG9iamVjdC5jCmluZGV4IDAyMDdiNjIuLjQyZTY1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b2JqZWN0LmMKQEAgLTE5MCw2ICsxOTAsMzUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfaW50ZWdlcl9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgaW5pdGlhbF92YWx1ZSAgICAgICAtIEluaXRpYWwgdmFsdWUgZm9yIHRoZSBpbnRlZ2VyCisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgSW50ZWdlciBvYmplY3QsIG51bGwgb24gZmFpbHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYW4gaW5pdGlhbGl6ZWQgaW50ZWdlciBvYmplY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9pbnRlZ2VyX29iamVjdCh1NjQgaW5pdGlhbF92YWx1ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlZ2VyX2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NyZWF0ZV9pbnRlZ2VyX29iamVjdCk7CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgaW50ZWdlciBvYmplY3QgKi8KKworCWludGVnZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJaWYgKCFpbnRlZ2VyX2Rlc2MpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwlpbnRlZ2VyX2Rlc2MtPmludGVnZXIudmFsdWUgPSBpbml0aWFsX3ZhbHVlOworCXJldHVybl9QVFIoaW50ZWdlcl9kZXNjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdAogICoKICAqIFBBUkFNRVRFUlM6ICBidWZmZXJfc2l6ZSAgICAgICAgICAgIC0gU2l6ZSBvZiBidWZmZXIgdG8gYmUgY3JlYXRlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCmluZGV4IDY0MmJiMzAuLjVmYWY2YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwKIAkJCSAgICBBQ1BJX1JPT1RfT0JKRUNULAogCQkJICAgIEFDUElfVUlOVDMyX01BWCwKLQkJCSAgICBjb250YWluZXJfd2Fsa19uYW1lc3BhY2VfY2IsICZhY3Rpb24sIE5VTEwpOworCQkJICAgIGNvbnRhaW5lcl93YWxrX25hbWVzcGFjZV9jYiwgTlVMTCwgJmFjdGlvbiwgTlVMTCk7CiAKIAlyZXR1cm4gKDApOwogfQpAQCAtMjcxLDcgKzI3MSw3IEBACiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLAogCQkJICAgIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkgICAgQUNQSV9VSU5UMzJfTUFYLAotCQkJICAgIGNvbnRhaW5lcl93YWxrX25hbWVzcGFjZV9jYiwgJmFjdGlvbiwgTlVMTCk7CisJCQkgICAgY29udGFpbmVyX3dhbGtfbmFtZXNwYWNlX2NiLCBOVUxMLCAmYWN0aW9uLCBOVUxMKTsKIAogCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NvbnRhaW5lcl9kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZG9jay5jIGIvZHJpdmVycy9hY3BpL2RvY2suYwppbmRleCA3MzM4YjZhLi4zMGJlM2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZG9jay5jCisrKyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKQEAgLTEwMzAsOCArMTAzMCw4IEBACiAKIAkvKiBGaW5kIGRlcGVuZGVudCBkZXZpY2VzICovCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJICAgIEFDUElfVUlOVDMyX01BWCwgZmluZF9kb2NrX2RldmljZXMsIGRvY2tfc3RhdGlvbiwKLQkJCSAgICBOVUxMKTsKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfZG9ja19kZXZpY2VzLCBOVUxMLAorCQkJICAgIGRvY2tfc3RhdGlvbiwgTlVMTCk7CiAKIAkvKiBhZGQgdGhlIGRvY2sgc3RhdGlvbiBhcyBhIGRldmljZSBkZXBlbmRlbnQgb24gaXRzZWxmICovCiAJZGQgPSBhbGxvY19kb2NrX2RlcGVuZGVudF9kZXZpY2UoaGFuZGxlKTsKQEAgLTExMjcsMTEgKzExMjcsMTEgQEAKIAogCS8qIGxvb2sgZm9yIGEgZG9jayBzdGF0aW9uICovCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJICAgIEFDUElfVUlOVDMyX01BWCwgZmluZF9kb2NrLCBOVUxMLCBOVUxMKTsKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfZG9jaywgTlVMTCwgTlVMTCwgTlVMTCk7CiAKIAkvKiBsb29rIGZvciBiYXkgKi8KIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQlBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfYmF5LCBOVUxMLCBOVUxMKTsKKwkJCUFDUElfVUlOVDMyX01BWCwgZmluZF9iYXksIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmICghZG9ja19zdGF0aW9uX2NvdW50KSB7CiAJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJObyBkb2NrIGRldmljZXMgZm91bmQuXG4iKTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IGJhZWYyOGMuLjc1YjE0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC04MjAsNyArODIwLDcgQEAKIAogCS8qIEZpbmQgYW5kIHJlZ2lzdGVyIGFsbCBxdWVyeSBtZXRob2RzICovCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfTUVUSE9ELCBlYy0+aGFuZGxlLCAxLAotCQkJICAgIGFjcGlfZWNfcmVnaXN0ZXJfcXVlcnlfbWV0aG9kcywgZWMsIE5VTEwpOworCQkJICAgIGFjcGlfZWNfcmVnaXN0ZXJfcXVlcnlfbWV0aG9kcywgTlVMTCwgZWMsIE5VTEwpOwogCiAJaWYgKCFmaXJzdF9lYykKIAkJZmlyc3RfZWMgPSBlYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IGM2NjQ1ZjIuLjRjOGZjZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBOVUxMOwogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgcGFyZW50LAotCQkJICAgIDEsIGRvX2FjcGlfZmluZF9jaGlsZCwgJmZpbmQsIE5VTEwpOworCQkJICAgIDEsIGRvX2FjcGlfZmluZF9jaGlsZCwgTlVMTCwgJmZpbmQsIE5VTEwpOwogCXJldHVybiBmaW5kLmhhbmRsZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9zbG90LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Nsb3QuYwppbmRleCA0NWRhMmJhLi4xMWYyMTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Nsb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Nsb3QuYwpAQCAtMjE5LDEyICsyMTksMTIgQEAKIAogCWRiZygicDJwIGJyaWRnZSB3YWxrLCBwY2lfYnVzID0gJXhcbiIsIGRldi0+c3Vib3JkaW5hdGUtPm51bWJlcik7CiAJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsICh1MzIpMSwKLQkJCQkgICAgIHVzZXJfZnVuY3Rpb24sICZjaGlsZF9jb250ZXh0LCBOVUxMKTsKKwkJCQkgICAgIHVzZXJfZnVuY3Rpb24sIE5VTEwsICZjaGlsZF9jb250ZXh0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWdvdG8gb3V0OwogCiAJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsICh1MzIpMSwKLQkJCQkgICAgIHdhbGtfcDJwX2JyaWRnZSwgJmNoaWxkX2NvbnRleHQsIE5VTEwpOworCQkJCSAgICAgd2Fsa19wMnBfYnJpZGdlLCBOVUxMLCAmY2hpbGRfY29udGV4dCwgTlVMTCk7CiBvdXQ6CiAJcGNpX2Rldl9wdXQoZGV2KTsKIAlyZXR1cm4gQUVfT0s7CkBAIC0yNzcsMTIgKzI3NywxMiBAQAogCiAJZGJnKCJyb290IGJyaWRnZSB3YWxrLCBwY2lfYnVzID0gJXhcbiIsIHBjaV9idXMtPm51bWJlcik7CiAJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsICh1MzIpMSwKLQkJCQkgICAgIHVzZXJfZnVuY3Rpb24sICZjb250ZXh0LCBOVUxMKTsKKwkJCQkgICAgIHVzZXJfZnVuY3Rpb24sIE5VTEwsICZjb250ZXh0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgKHUzMikxLAotCQkJCSAgICAgd2Fsa19wMnBfYnJpZGdlLCAmY29udGV4dCwgTlVMTCk7CisJCQkJICAgICB3YWxrX3AycF9icmlkZ2UsIE5VTEwsICZjb250ZXh0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWVycigiJXM6IHdhbGtfcDJwX2JyaWRnZSBmYWlsdXJlIC0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IGVjNzQyYTQuLmNiNDI4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCkBAIC0xMTAyLDcgKzExMDIsNyBAQAogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwKIAkJCSAgICBBQ1BJX1JPT1RfT0JKRUNULAogCQkJICAgIEFDUElfVUlOVDMyX01BWCwKLQkJCSAgICBwcm9jZXNzb3Jfd2Fsa19uYW1lc3BhY2VfY2IsICZhY3Rpb24sIE5VTEwpOworCQkJICAgIHByb2Nlc3Nvcl93YWxrX25hbWVzcGFjZV9jYiwgTlVMTCwgJmFjdGlvbiwgTlVMTCk7CiAjZW5kaWYKIAlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmFjcGlfY3B1X25vdGlmaWVyKTsKIH0KQEAgLTExMTUsNyArMTExNSw3IEBACiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfUFJPQ0VTU09SLAogCQkJICAgIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkgICAgQUNQSV9VSU5UMzJfTUFYLAotCQkJICAgIHByb2Nlc3Nvcl93YWxrX25hbWVzcGFjZV9jYiwgJmFjdGlvbiwgTlVMTCk7CisJCQkgICAgcHJvY2Vzc29yX3dhbGtfbmFtZXNwYWNlX2NiLCBOVUxMLCAmYWN0aW9uLCBOVUxMKTsKICNlbmRpZgogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZhY3BpX2NwdV9ub3RpZmllcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCAxNGE3NDgxLi5mZjlmNjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTEzMzIsNyArMTMzMiw3IEBACiAJc3RhdHVzID0gYWNwaV9idXNfY2hlY2tfYWRkKGhhbmRsZSwgMCwgb3BzLCAmZGV2aWNlKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgaGFuZGxlLCBBQ1BJX1VJTlQzMl9NQVgsCi0JCQkJICAgIGFjcGlfYnVzX2NoZWNrX2FkZCwgb3BzLCAmZGV2aWNlKTsKKwkJCQkgICAgYWNwaV9idXNfY2hlY2tfYWRkLCBOVUxMLCBvcHMsICZkZXZpY2UpOwogCiAJaWYgKGNoaWxkKQogCQkqY2hpbGQgPSBkZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKaW5kZXggNTc1NTkzYS4uZmMyZjI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYwpAQCAtNyw3ICs3LDcgQEAKICAqIHZpZGVvX2RldGVjdC5jOgogICogUHJvdmlkZXMgYWNwaV9pc192aWRlb19kZXZpY2UoKSBmb3IgZWFybHkgc2Nhbm5pbmcgb2YgQUNQSSBkZXZpY2VzIGluIHNjYW4uYwogICogVGhlcmUgYSBMaW51eCBzcGVjaWZpYyAoU3BlYyBkb2VzIG5vdCBwcm92aWRlIGEgSElEIGZvciB2aWRlbyBkZXZpY2VzKSBpcwotICogYXNzaW5nZWQKKyAqIGFzc2lnbmVkCiAgKgogICogQWZ0ZXIgUENJIGRldmljZXMgYXJlIGdsdWVkIHdpdGggQUNQSSBkZXZpY2VzCiAgKiBhY3BpX2dldF9wY2lfZGV2KCkgY2FuIGJlIGNhbGxlZCB0byBpZGVudGlmeSBBQ1BJIGdyYXBoaWNzCkBAIC04MywxNiArODMsMTYgQEAKIAlpZiAoIWRldmljZSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBEb2VzIHRoaXMgZGV2aWNlIGFibGUgdG8gc3VwcG9ydCB2aWRlbyBzd2l0Y2hpbmcgPyAqLworCS8qIElzIHRoaXMgZGV2aWNlIGFibGUgdG8gc3VwcG9ydCB2aWRlbyBzd2l0Y2hpbmcgPyAqLwogCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RPRCIsICZoX2R1bW15KSkgfHwKIAkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9ET1MiLCAmaF9kdW1teSkpKQogCQl2aWRlb19jYXBzIHw9IEFDUElfVklERU9fT1VUUFVUX1NXSVRDSElORzsKIAotCS8qIERvZXMgdGhpcyBkZXZpY2UgYWJsZSB0byByZXRyaWV2ZSBhIHZpZGVvIFJPTSA/ICovCisJLyogSXMgdGhpcyBkZXZpY2UgYWJsZSB0byByZXRyaWV2ZSBhIHZpZGVvIFJPTSA/ICovCiAJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfUk9NIiwgJmhfZHVtbXkpKSkKIAkJdmlkZW9fY2FwcyB8PSBBQ1BJX1ZJREVPX1JPTV9BVkFJTEFCTEU7CiAKLQkvKiBEb2VzIHRoaXMgZGV2aWNlIGFibGUgdG8gY29uZmlndXJlIHdoaWNoIHZpZGVvIGhlYWQgdG8gYmUgUE9TVGVkID8gKi8KKwkvKiBJcyB0aGlzIGRldmljZSBhYmxlIHRvIGNvbmZpZ3VyZSB3aGljaCB2aWRlbyBoZWFkIHRvIGJlIFBPU1RlZCA/ICovCiAJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfVlBPIiwgJmhfZHVtbXkpKSAmJgogCSAgICBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0dQRCIsICZoX2R1bW15KSkgJiYKIAkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9TUEQiLCAmaF9kdW1teSkpKQpAQCAtMTAxLDcgKzEwMSw3IEBACiAJLyogT25seSBjaGVjayBmb3IgYmFja2xpZ2h0IGZ1bmN0aW9uYWxpdHkgaWYgb25lIG9mIHRoZSBhYm92ZSBoaXQuICovCiAJaWYgKHZpZGVvX2NhcHMpCiAJCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgZGV2aWNlLT5oYW5kbGUsCi0JCQkJICAgIEFDUElfVUlOVDMyX01BWCwgYWNwaV9iYWNrbGlnaHRfY2FwX21hdGNoLAorCQkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGFjcGlfYmFja2xpZ2h0X2NhcF9tYXRjaCwgTlVMTCwKIAkJCQkgICAgJnZpZGVvX2NhcHMsIE5VTEwpOwogCiAJcmV0dXJuIHZpZGVvX2NhcHM7CkBAIC0xMzcsNyArMTM3LDcgQEAKICAqCiAgKiBpZiBOVUxMIGlzIHBhc3NlZCBhcyBhcmd1bWVudCBhbGwgQUNQSSBkZXZpY2VzIGFyZSBlbnVtZXJhdGVkIGFuZAogICogYWxsIGdyYXBoaWNzIGNhcGFiaWxpdGllcyBvZiBwaHlzaWNhbGx5IHByZXNlbnQgZGV2aWNlcyBhcmUKLSAqIHN1bW1lcml6ZWQgYW5kIHJldHVybmVkLiBUaGlzIGlzIGNhY2hlZCBhbmQgZG9uZSBvbmx5IG9uY2UuCisgKiBzdW1tYXJpemVkIGFuZCByZXR1cm5lZC4gVGhpcyBpcyBjYWNoZWQgYW5kIGRvbmUgb25seSBvbmNlLgogICovCiBsb25nIGFjcGlfdmlkZW9fZ2V0X2NhcGFiaWxpdGllcyhhY3BpX2hhbmRsZSBncmFwaGljc19oYW5kbGUpCiB7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAlpZiAoIWdyYXBoaWNzX2hhbmRsZSkgewogCQkvKiBPbmx5IGRvIHRoZSBnbG9iYWwgd2FsayB0aHJvdWdoIGFsbCBncmFwaGljcyBkZXZpY2VzIG9uY2UgKi8KIAkJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfdmlkZW8sCisJCQkJICAgIEFDUElfVUlOVDMyX01BWCwgZmluZF92aWRlbywgTlVMTCwKIAkJCQkgICAgJmNhcHMsIE5VTEwpOwogCQkvKiBUaGVyZSBtaWdodCBiZSBib290IHBhcmFtIGZsYWdzIHNldCBhbHJlYWR5Li4uICovCiAJCWFjcGlfdmlkZW9fc3VwcG9ydCB8PSBjYXBzOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGdyYXBoaWNzX2hhbmRsZSwKLQkJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBmaW5kX3ZpZGVvLAorCQkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfdmlkZW8sIE5VTEwsCiAJCQkJICAgICZjYXBzLCBOVUxMKTsKIAl9CiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiV2UgaGF2ZSAweCVsWCB2aWRlbyBzdXBwb3J0ICVzICVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggMGM2MTU1Zi4uMTkxMzZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC01OTksNyArNTk5LDcgQEAKIAl7IDB4MjdERiwgMHgxMDI4LCAweDAyYjAgfSwJLyogSUNINyBvbiB1bmtub3duIERlbGwgKi8KIAl7IDB4MjdERiwgMHgxMDQzLCAweDEyNjcgfSwJLyogSUNINyBvbiBBc3VzIFc1RiAqLwogCXsgMHgyN0RGLCAweDEwM0MsIDB4MzBBMSB9LAkvKiBJQ0g3IG9uIEhQIENvbXBhcSBuYzI0MDAgKi8KLQl7IDB4MjdERiwgMHgxMDNDLCAweDM2MWEgfSwJLyogSUNINyBvbiB1bmtvd24gSFAgICovCisJeyAweDI3REYsIDB4MTAzQywgMHgzNjFhIH0sCS8qIElDSDcgb24gdW5rbm93biBIUCAgKi8KIAl7IDB4MjdERiwgMHgxMDcxLCAweEQyMjEgfSwJLyogSUNINyBvbiBIZXJjdWxlcyBFQy05MDAgKi8KIAl7IDB4MjdERiwgMHgxNTJELCAweDA3NzggfSwJLyogSUNINyBvbiB1bmtub3duIEludGVsICovCiAJeyAweDI0Q0EsIDB4MTAyNSwgMHgwMDYxIH0sCS8qIElDSDQgb24gQUNFUiBBc3BpcmUgMjAyM1dMTWkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDYyZTZiOWUuLjE2ODNlYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMTIwOCw2ICsxMjA4LDcgQEAKICAqCWF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIFNDU0kgY2FsbGJhY2sgZm9yIHF1ZXVlIGRlcHRoIGNvbmZpZwogICoJQHNkZXY6IFNDU0kgZGV2aWNlIHRvIGNvbmZpZ3VyZSBxdWV1ZSBkZXB0aCBmb3IKICAqCUBxdWV1ZV9kZXB0aDogbmV3IHF1ZXVlIGRlcHRoCisgKglAcmVhc29uOiBjYWxsaW5nIGNvbnRleHQKICAqCiAgKglUaGlzIGlzIGxpYmF0YSBzdGFuZGFyZCBob3N0dC0+Y2hhbmdlX3F1ZXVlX2RlcHRoIGNhbGxiYWNrLgogICoJU0NTSSB3aWxsIGNhbGwgaW50byB0aGlzIGNhbGxiYWNrIHdoZW4gdXNlciB0cmllcyB0byBzZXQgcXVldWUKQEAgLTEyMTksMTIgKzEyMjAsMTYgQEAKICAqCVJFVFVSTlM6CiAgKglOZXdseSBjb25maWd1cmVkIHF1ZXVlIGRlcHRoLgogICovCi1pbnQgYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHF1ZXVlX2RlcHRoKQoraW50IGF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxdWV1ZV9kZXB0aCwKKwkJCQlpbnQgcmVhc29uKQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhdGFfc2hvc3RfdG9fcG9ydChzZGV2LT5ob3N0KTsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChxdWV1ZV9kZXB0aCA8IDEgfHwgcXVldWVfZGVwdGggPT0gc2Rldi0+cXVldWVfZGVwdGgpCiAJCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCmluZGV4IDUxZWIxZTIuLmVmYTg3NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCiAJCS8qCiAJCSAqIFVzZSBpbyoxNl9yZXAoKSBhY2Nlc3NvcnMgaGVyZSBhcyB3ZWxsIHRvIGF2b2lkIHBvaW50bGVzc2x5Ci0JCSAqIHN3YXBwaW5nIGJ5dGVzIHRvIGFuZCBmcm8gb24gdGhlIGJpZyBlbmRpYW4gbWFjaGluZXMuLi4KKwkJICogc3dhcHBpbmcgYnl0ZXMgdG8gYW5kIGZyb20gb24gdGhlIGJpZyBlbmRpYW4gbWFjaGluZXMuLi4KIAkJICovCiAJCWlmIChydyA9PSBSRUFEKSB7CiAJCQlpb3JlYWQxNl9yZXAoZGF0YV9hZGRyLCBwYWQsIDEpOwpAQCAtNzc2LDcgKzc3Niw3IEBACiAJdm9pZCBfX2lvbWVtICpkYXRhX2FkZHIgPSBhcC0+aW9hZGRyLmRhdGFfYWRkcjsKIAl1bnNpZ25lZCBpbnQgd29yZHMgPSBidWZsZW4gPj4gMjsKIAlpbnQgc2xvcCA9IGJ1ZmxlbiAmIDM7Ci0JCisKIAlpZiAoIShhcC0+cGZsYWdzICYgQVRBX1BGTEFHX1BJTzMyKSkKIAkJcmV0dXJuIGF0YV9zZmZfZGF0YV94ZmVyKGRldiwgYnVmLCBidWZsZW4sIHJ3KTsKIApAQCAtNzk1LDcgKzc5NSw3IEBACiAKIAkJLyoKIAkJICogVXNlIGlvKl9yZXAoKSBhY2Nlc3NvcnMgaGVyZSBhcyB3ZWxsIHRvIGF2b2lkIHBvaW50bGVzc2x5Ci0JCSAqIHN3YXBwaW5nIGJ5dGVzIHRvIGFuZCBmcm8gb24gdGhlIGJpZyBlbmRpYW4gbWFjaGluZXMuLi4KKwkJICogc3dhcHBpbmcgYnl0ZXMgdG8gYW5kIGZyb20gb24gdGhlIGJpZyBlbmRpYW4gbWFjaGluZXMuLi4KIAkJICovCiAJCWlmIChydyA9PSBSRUFEKSB7CiAJCQlpZiAoc2xvcCA8IDMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYwppbmRleCA0MDNmNTYxLi43MWNlZjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKQEAgLTQsNyArNCw3IEBACiAgKgkJCSAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKiBiYXNlZCB1cG9uIGNzNTUzNS5jIGZyb20gQU1EIDxKZW5zLkFsdG1hbm5AYW1kLmNvbT4gYXMgY2xlYW5lZCB1cCBhbmQKLSAqIG1hZGUgcmVhZGFibGUgYW5kIExpbnV4IHN0eWxlIGJ5IFdvbGZnYW5nIFp1bGVnZXIgPHdvbGZnYW5nLnp1bGVnZXJAZ214LmRlCisgKiBtYWRlIHJlYWRhYmxlIGFuZCBMaW51eCBzdHlsZSBieSBXb2xmZ2FuZyBadWxlZ2VyIDx3b2xmZ2FuZy56dWxlZ2VyQGdteC5kZT4KICAqIGFuZCBBbGV4YW5kZXIgS2lhdXNjaCA8YWxleC5raWF1c2NoQHQtb25saW5lLmRlPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX2ZzbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9mc2wuYwppbmRleCA4YTVkMzViLi5jZTQxMzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2ZzbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfZnNsLmMKQEAgLTQzLDkgKzQzLDkgQEAKIAkvKgogCSAqIFNBVEEtRlNMIGhvc3QgY29udHJvbGxlciBzdXBwb3J0cyBhIG1heC4gb2YgKDE1KzEpIGRpcmVjdCBQUkRFcywgYW5kCiAJICogY2hhaW5lZCBpbmRpcmVjdCBQUkRFcyB1cHRvIGEgbWF4IGNvdW50IG9mIDYzLgotCSAqIFdlIGFyZSBhbGxvY2F0aW5nIGFuIGFycmF5IG9mIDYzIFBSREVzIGNvbnRpZ2lvdXNseSwgYnV0IFBSREUjMTUgd2lsbAorCSAqIFdlIGFyZSBhbGxvY2F0aW5nIGFuIGFycmF5IG9mIDYzIFBSREVzIGNvbnRpZ3VvdXNseSwgYnV0IFBSREUjMTUgd2lsbAogCSAqIGJlIHNldHVwIGFzIGFuIGluZGlyZWN0IGRlc2NyaXB0b3IsIHBvaW50aW5nIHRvIGl0J3MgbmV4dAotCSAqIChjb250aWdpb3VzKSBQUkRFLiBUaG91Z2ggY2hhaW5lZCBpbmRpcmVjdCBQUkRFIGFycmF5cyBhcmUKKwkgKiAoY29udGlndW91cykgUFJERS4gVGhvdWdoIGNoYWluZWQgaW5kaXJlY3QgUFJERSBhcnJheXMgYXJlCiAJICogc3VwcG9ydGVkLGl0IHdpbGwgYmUgbW9yZSBlZmZpY2llbnQgdG8gdXNlIGEgZGlyZWN0IFBSRFQgYW5kCiAJICogYSBzaW5nbGUgY2hhaW4vbGluayB0byBpbmRpcmVjdCBQUkRFIGFycmF5L1BSRFQuCiAJICovCkBAIC0zMTQsNyArMzE0LDcgQEAKIAl1MzIgdHRsX2R3b3JkcyA9IDA7CiAKIAkvKgotCSAqIE5PVEUgOiBkaXJlY3QgJiBpbmRpcmVjdCBwcmR0J3MgYXJlIGNvbnRpZ2lvdXNseSBhbGxvY2F0ZWQKKwkgKiBOT1RFIDogZGlyZWN0ICYgaW5kaXJlY3QgcHJkdCdzIGFyZSBjb250aWd1b3VzbHkgYWxsb2NhdGVkCiAJICovCiAJc3RydWN0IHByZGUgKnByZCA9IChzdHJ1Y3QgcHJkZSAqKSYoKHN0cnVjdCBjb21tYW5kX2Rlc2MgKikKIAkJCQkJICAgIGNtZF9kZXNjKS0+cHJkdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwppbmRleCAxZWI0ZTAyLi4wYzgyZDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCkBAIC0xOTc1LDcgKzE5NzUsNyBAQAogCWF0YV9pZF9jX3N0cmluZyhkZXYtPmlkLCBtb2RlbF9udW0sIEFUQV9JRF9QUk9ELCBzaXplb2YobW9kZWxfbnVtKSk7CiAKIAlpZiAoc3RybmNtcChtb2RlbF9udW0sICJNYXh0b3IiLCA2KSA9PSAwKSB7Ci0JCWF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LCAxKTsKKwkJYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsIDEsIFNDU0lfUURFUFRIX0RFRkFVTFQpOwogCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fTk9USUNFLAogCQkJIkRpc2FibGluZyBTV05DUSBtb2RlIChkZXB0aCAleClcbiIsIHNkZXYtPnF1ZXVlX2RlcHRoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9pcGhhc2UuYyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCmluZGV4IGIyYzFiMzcuLmY3MzRiMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jCisrKyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCkBAIC0xMTMyLDcgKzExMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICBJRl9FUlIocHJpbnRrKCIgY2F1c2U6IHBhY2tldCB0aW1lIG91dFxuIik7KQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSUZfRVJSKHByaW50aygiIGNhdXNlOiBidWZmZXIgb3ZlciBmbG93XG4iKTspCisgICAgICAgICAgICAgICAgICAgIElGX0VSUihwcmludGsoIiBjYXVzZTogYnVmZmVyIG92ZXJmbG93XG4iKTspCiAgICAgICAgICAgICAgICAgfQogCQlnb3RvIG91dF9mcmVlX2Rlc2M7CiAJfSAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDk3OWQxNTkuLmVlOTVjNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC0xODgsNyArMTg4LDcgQEAKICAqIEBkZXY6IGRldmljZSB0byB0cnkgdG8gYmluZCB0byB0aGUgZHJpdmVyCiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FTk9ERVYgaWYgdGhlIGRldmljZSBpcyBub3QgcmVnaXN0ZXJlZCwKLSAqIDEgaWYgdGhlIGRldmljZSBpcyBib3VuZCBzdWNlc3NmdWxseSBhbmQgMCBvdGhlcndpc2UuCisgKiAxIGlmIHRoZSBkZXZpY2UgaXMgYm91bmQgc3VjY2Vzc2Z1bGx5IGFuZCAwIG90aGVyd2lzZS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggQGRldi0+c2VtIGhlbGQuICBXaGVuIGNhbGxlZCBmb3IgYQogICogVVNCIGludGVyZmFjZSwgQGRldi0+cGFyZW50LT5zZW0gbXVzdCBiZSBoZWxkIGFzIHdlbGwuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCmluZGV4IDg0N2E5ZTUuLmE1YWYxZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCkBAIC0xNDc4LDEwICsxNDc4LDcgQEAKIAlzdGRtYV9sb2NrKGZsb3BweV9pcnEsIE5VTEwpOwogCiAJYXRhcmlfZGlzYWJsZV9pcnEoIElSUV9NRlBfRkRDICk7Ci0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CS8qIFRoZSByZXF1ZXN0IGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGludHMKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwkJICogZGlzYWJsZWQuLi4gc28gbXVzdCBzYXZlIHRoZSBJUEwgZm9yIGxhdGVyICovIAogCXJlZG9fZmRfcmVxdWVzdCgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlhdGFyaV9lbmFibGVfaXJxKCBJUlFfTUZQX0ZEQyApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oIGIvZHJpdmVycy9ibG9jay9jY2lzc19jbWQuaAppbmRleCBiNTBhOWIyLi42YWZhNzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3NfY21kLmgKQEAgLTUsNyArNSw3IEBACiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogI2RlZmluZSBDSVNTX1ZFUlNJT04gIjEuMDAiCiAKLS8vZ2VuZXJhbCBib3VuZGFyeSBkZWZpbnRpb25zCisvL2dlbmVyYWwgYm91bmRhcnkgZGVmaW5pdGlvbnMKICNkZWZpbmUgU0VOU0VJTkZPQllURVMgICAgICAgICAgMzIvL25vdGUgdGhhdCB0aGlzIHZhbHVlIG1heSB2YXJ5IGJldHdlZW4gaG9zdCBpbXBsZW1lbnRhdGlvbnMKICNkZWZpbmUgTUFYU0dFTlRSSUVTICAgICAgICAgICAgMzIKICNkZWZpbmUgQ0NJU1NfU0dfQ0hBSU4gICAgICAgICAgMHg4MDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmMKaW5kZXggMWU2ZWIxYS4uZjM2ZGVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5jCkBAIC01MzUsNyArNTM1LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlCVF9FUlIoIlVua25vdyBwYWNrZXQgdHlwZTolZCIsIHR5cGUpOworCQlCVF9FUlIoIlVua25vd24gcGFja2V0IHR5cGU6JWQiLCB0eXBlKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgcGF5bG9hZCwKIAkJCQkJCWJsa3N6ICogYnVmX2Jsb2NrX2xlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKaW5kZXggNDg5NWYwZS4uYWEwOTE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCXN0cnVjdCBoY2lfdWFydCAqaHU7CiAKIAlpZiAoIWhkZXYpIHsKLQkJQlRfRVJSKCJGcmFtZSBmb3IgdWtub3duIGRldmljZSAoaGRldj1OVUxMKSIpOworCQlCVF9FUlIoIkZyYW1lIGZvciB1bmtub3duIGRldmljZSAoaGRldj1OVUxMKSIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vZ2Ryb20uYyBiL2RyaXZlcnMvY2Ryb20vZ2Ryb20uYwppbmRleCBhNzYyMjgzLi5lNzg5ZTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL2dkcm9tLmMKKysrIGIvZHJpdmVycy9jZHJvbS9nZHJvbS5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJZ2Ryb21fZ2V0c2Vuc2UoTlVMTCk7CiAJCXJldHVybjsKIAl9Ci0Jb3V0c3coUEhZU0FERFIoR0RST01fREFUQV9SRUcpLCBjbWQsIDYpOworCW91dHN3KEdEUk9NX0RBVEFfUkVHLCBjbWQsIDYpOwogfQogCiAKQEAgLTI5OCw3ICsyOTgsNyBAQAogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGNsZWFudXBfcmVhZHRvYzsKIAl9Ci0JaW5zdyhQSFlTQUREUihHRFJPTV9EQVRBX1JFRyksIHRvYywgdG9jc2l6ZS8yKTsKKwlpbnN3KEdEUk9NX0RBVEFfUkVHLCB0b2MsIHRvY3NpemUvMik7CiAJaWYgKGdkLnN0YXR1cyAmIDB4MDEpCiAJCWVyciA9IC1FSU5WQUw7CiAKQEAgLTQ0OSw3ICs0NDksNyBAQAogCQlHRFJPTV9ERUZBVUxUX1RJTUVPVVQpOwogCWlmIChnZC5wZW5kaW5nKQogCQlnb3RvIGNsZWFudXBfc2Vuc2U7Ci0JaW5zdyhQSFlTQUREUihHRFJPTV9EQVRBX1JFRyksICZzZW5zZSwgc2Vuc2VfY29tbWFuZC0+YnVmbGVuLzIpOworCWluc3coR0RST01fREFUQV9SRUcsICZzZW5zZSwgc2Vuc2VfY29tbWFuZC0+YnVmbGVuLzIpOwogCWlmIChzZW5zZVsxXSAmIDQwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkdEUk9NOiBEcml2ZSBub3QgcmVhZHkgLSBjb21tYW5kIGFib3J0ZWRcbiIpOwogCQlnb3RvIGNsZWFudXBfc2Vuc2U7CkBAIC01ODYsNyArNTg2LDcgQEAKIAkJc3Bpbl91bmxvY2soJmdkcm9tX2xvY2spOwogCQlibG9jayA9IGJsa19ycV9wb3MocmVxKS9HRF9UT19CTEsgKyBHRF9TRVNTSU9OX09GRlNFVDsKIAkJYmxvY2tfY250ID0gYmxrX3JxX3NlY3RvcnMocmVxKS9HRF9UT19CTEs7Ci0JCWN0cmxfb3V0bChQSFlTQUREUihyZXEtPmJ1ZmZlciksIEdEUk9NX0RNQV9TVEFSVEFERFJfUkVHKTsKKwkJY3RybF9vdXRsKHZpcnRfdG9fcGh5cyhyZXEtPmJ1ZmZlciksIEdEUk9NX0RNQV9TVEFSVEFERFJfUkVHKTsKIAkJY3RybF9vdXRsKGJsb2NrX2NudCAqIEdEUk9NX0hBUkRfU0VDVE9SLCBHRFJPTV9ETUFfTEVOR1RIX1JFRyk7CiAJCWN0cmxfb3V0bCgxLCBHRFJPTV9ETUFfRElSRUNUSU9OX1JFRyk7CiAJCWN0cmxfb3V0bCgxLCBHRFJPTV9ETUFfRU5BQkxFX1JFRyk7CkBAIC02MTUsNyArNjE1LDcgQEAKIAkJCWNwdV9yZWxheCgpOwogCQlnZC5wZW5kaW5nID0gMTsKIAkJZ2QudHJhbnNmZXIgPSAxOwotCQlvdXRzdyhQSFlTQUREUihHRFJPTV9EQVRBX1JFRyksICZyZWFkX2NvbW1hbmQtPmNtZCwgNik7CisJCW91dHN3KEdEUk9NX0RBVEFfUkVHLCAmcmVhZF9jb21tYW5kLT5jbWQsIDYpOwogCQl0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMjsKIAkJLyogV2FpdCBmb3IgYW55IHBlbmRpbmcgRE1BIHRvIGZpbmlzaCAqLwogCQl3aGlsZSAoY3RybF9pbmIoR0RST01fRE1BX1NUQVRVU19SRUcpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKaW5kZXggYTk2ZjMxOS4uNDM0MTJjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwpAQCAtNjc2LDI1ICs2NzYsMjUgQEAKIAlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwogCXN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBhZ3BfY2xpZW50ICpjbGllbnQ7Ci0JaW50IHJjID0gLUVOWElPOwotCi0JbG9ja19rZXJuZWwoKTsKLQltdXRleF9sb2NrKCYoYWdwX2ZlLmFncF9tdXRleCkpOwogCiAJaWYgKG1pbm9yICE9IEFHUEdBUlRfTUlOT1IpCi0JCWdvdG8gZXJyX291dDsKKwkJcmV0dXJuIC1FTlhJTzsKKworCW11dGV4X2xvY2soJihhZ3BfZmUuYWdwX211dGV4KSk7CiAKIAlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFncF9maWxlX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJpdiA9PSBOVUxMKQotCQlnb3RvIGVycl9vdXRfbm9tZW07CisJaWYgKHByaXYgPT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJihhZ3BfZmUuYWdwX211dGV4KSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAogCXNldF9iaXQoQUdQX0ZGX0FMTE9XX0NMSUVOVCwgJnByaXYtPmFjY2Vzc19mbGFncyk7CiAJcHJpdi0+bXlfcGlkID0gY3VycmVudC0+cGlkOwogCi0JaWYgKGNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHsKKwlpZiAoY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJLyogUm9vdCBwcml2LCBjYW4gYmUgY29udHJvbGxlciAqLwogCQlzZXRfYml0KEFHUF9GRl9BTExPV19DT05UUk9MTEVSLCAmcHJpdi0+YWNjZXNzX2ZsYWdzKTsKLQl9CisKIAljbGllbnQgPSBhZ3BfZmluZF9jbGllbnRfYnlfcGlkKGN1cnJlbnQtPnBpZCk7CiAKIAlpZiAoY2xpZW50ICE9IE5VTEwpIHsKQEAgLTcwNCwxNiArNzA0LDEwIEBACiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgcHJpdjsKIAlhZ3BfaW5zZXJ0X2ZpbGVfcHJpdmF0ZShwcml2KTsKIAlEQkcoInByaXZhdGU9JXAsIGNsaWVudD0lcCIsIHByaXYsIGNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCYoYWdwX2ZlLmFncF9tdXRleCkpOwotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gMDsKIAotZXJyX291dF9ub21lbToKLQlyYyA9IC1FTk9NRU07Ci1lcnJfb3V0OgogCW11dGV4X3VubG9jaygmKGFncF9mZS5hZ3BfbXV0ZXgpKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2NzNTUzNV9ncGlvLmMgYi9kcml2ZXJzL2NoYXIvY3M1NTM1X2dwaW8uYwppbmRleCAwNGJhOTA2Li40ZDgzMGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY3M1NTM1X2dwaW8uYworKysgYi9kcml2ZXJzL2NoYXIvY3M1NTM1X2dwaW8uYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtMTU4LDcgKzE1OCw2IEBACiB7CiAJdTMyIG0gPSBpbWlub3IoaW5vZGUpOwogCi0JY3ljbGVfa2VybmVsX2xvY2soKTsKIAkvKiB0aGUgbWFzayBzYXlzIHdoaWNoIHBpbnMgYXJlIHVzYWJsZSBieSB0aGlzIGRyaXZlciAqLwogCWlmICgobWFzayAmICgxIDw8IG0pKSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lZmlydGMuYyBiL2RyaXZlcnMvY2hhci9lZmlydGMuYwppbmRleCAzNGQxNWQ1Li4yNmE0N2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZWZpcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL2VmaXJ0Yy5jCkBAIC0yNyw4ICsyNyw2IEBACiAgKiAJLSBBZGQgbW9kdWxlIHN1cHBvcnQKICAqLwogCi0KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CkBAIC0xNzQsMTMgKzE3MiwxMiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJY2FzZSBSVENfUkRfVElNRToKLQkJCWxvY2tfa2VybmVsKCk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CiAKIAkJCXN0YXR1cyA9IGVmaS5nZXRfdGltZSgmZWZ0LCAmY2FwKTsKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKLQkJCXVubG9ja19rZXJuZWwoKTsKKwogCQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewogCQkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJCQlwcmludGsoS0VSTl9FUlIgImVmaXRpbWU6IGNhbid0IHJlYWQgdGltZVxuIik7CkBAIC0yMDIsMTMgKzE5OSwxMSBAQAogCiAJCQljb252ZXJ0X3RvX2VmaV90aW1lKCZ3dGltZSwgJmVmdCk7CiAKLQkJCWxvY2tfa2VybmVsKCk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CiAKIAkJCXN0YXR1cyA9IGVmaS5zZXRfdGltZSgmZWZ0KTsKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWZpX3J0Y19sb2NrLGZsYWdzKTsKLQkJCXVubG9ja19rZXJuZWwoKTsKIAogCQkJcmV0dXJuIHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOwogCkBAIC0yMjQsNyArMjE5LDYgQEAKIAogCQkJY29udmVydF90b19lZmlfdGltZSgmd3RpbWUsICZlZnQpOwogCi0JCQlsb2NrX2tlcm5lbCgpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVmaV9ydGNfbG9jaywgZmxhZ3MpOwogCQkJLyoKIAkJCSAqIFhYWCBGaXhtZToKQEAgLTIzNSwxOSArMjI5LDE2IEBACiAJCQlzdGF0dXMgPSBlZmkuc2V0X3dha2V1cF90aW1lKChlZmlfYm9vbF90KWVuYWJsZWQsICZlZnQpOwogCiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZmlfcnRjX2xvY2ssZmxhZ3MpOwotCQkJdW5sb2NrX2tlcm5lbCgpOwogCiAJCQlyZXR1cm4gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7CiAKIAkJY2FzZSBSVENfV0tBTE1fUkQ6CiAKLQkJCWxvY2tfa2VybmVsKCk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWZpX3J0Y19sb2NrLCBmbGFncyk7CiAKIAkJCXN0YXR1cyA9IGVmaS5nZXRfd2FrZXVwX3RpbWUoKGVmaV9ib29sX3QgKikmZW5hYmxlZCwgKGVmaV9ib29sX3QgKikmcGVuZGluZywgJmVmdCk7CiAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmaV9ydGNfbG9jayxmbGFncyk7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CiAKIAkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCkBAIC0yNzcsNyArMjY4LDYgQEAKIAkgKiBXZSBkbyBhY2NlcHQgbXVsdGlwbGUgb3BlbiBmaWxlcyBhdCB0aGUgc2FtZSB0aW1lIGFzIHdlCiAJICogc3luY2hyb25pemUgb24gdGhlIHBlciBjYWxsIG9wZXJhdGlvbi4KIAkgKi8KLQljeWNsZV9rZXJuZWxfbG9jaygpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19udnJhbS5jIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfbnZyYW0uYwppbmRleCBlZjMxNzM4Li5mZGE0MTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19udnJhbS5jCisrKyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX252cmFtLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9udnJhbS5oPgogI2lmZGVmIENPTkZJR19QUENfUE1BQwpAQCAtMzIsNyArMzEsNiBAQAogCiBzdGF0aWMgbG9mZl90IG52cmFtX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKLQlsb2NrX2tlcm5lbCgpOwogCXN3aXRjaCAob3JpZ2luKSB7CiAJY2FzZSAxOgogCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CkBAIC00MSwxMiArMzksMTEgQEAKIAkJb2Zmc2V0ICs9IG52cmFtX2xlbjsKIAkJYnJlYWs7CiAJfQotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwlpZiAob2Zmc2V0IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCiAJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7Ci0JdW5sb2NrX2tlcm5lbCgpOworCiAJcmV0dXJuIGZpbGUtPmZfcG9zOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jCmluZGV4IDhiN2Q1NmEuLmU5ODlmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jCkBAIC03Niw3ICs3Niw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JY3ljbGVfa2VybmVsX2xvY2soKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwppbmRleCA5NTA4MzdjLi41NjE5MDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYworKysgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwpAQCAtNDYsOCArNDYsNiBAQAogCiBleHRlcm4gdm9pZCBjdHJsX2FsdF9kZWwodm9pZCk7CiAKLSNkZWZpbmUgdG9faGFuZGxlX2gobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCBpbnB1dF9oYW5kbGUsIGhfbm9kZSkKLQogLyoKICAqIEV4cG9ydGVkIGZ1bmN0aW9ucy92YXJpYWJsZXMKICAqLwpAQCAtMTMyLDYgKzEzMCw3IEBACiAgKi8KIAogc3RhdGljIHN0cnVjdCBpbnB1dF9oYW5kbGVyIGtiZF9oYW5kbGVyOworc3RhdGljIERFRklORV9TUElOTE9DSyhrYmRfZXZlbnRfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBrZXlfZG93bltCSVRTX1RPX0xPTkdTKEtFWV9DTlQpXTsJLyoga2V5Ym9hcmQga2V5IGJpdG1hcCAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hpZnRfZG93bltOUl9TSElGVF07CQkvKiBzaGlmdCBzdGF0ZSBjb3VudGVycy4uICovCiBzdGF0aWMgaW50IGRlYWRfa2V5X25leHQ7CkBAIC0xOTAsNzggKzE4OSw4NSBAQAogICogIGV0Yy4pLiBTbyB0aGlzIG1lYW5zIHRoYXQgc2NhbmNvZGVzIGZvciB0aGUgZXh0cmEgZnVuY3Rpb24ga2V5cyB3b24ndAogICogIGJlIHZhbGlkIGZvciB0aGUgZmlyc3QgZXZlbnQgZGV2aWNlLCBidXQgd2lsbCBiZSBmb3IgdGhlIHNlY29uZC4KICAqLworCitzdHJ1Y3QgZ2V0c2V0X2tleWNvZGVfZGF0YSB7CisJdW5zaWduZWQgaW50IHNjYW5jb2RlOworCXVuc2lnbmVkIGludCBrZXljb2RlOworCWludCBlcnJvcjsKK307CisKK3N0YXRpYyBpbnQgZ2V0a2V5Y29kZV9oZWxwZXIoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZXRzZXRfa2V5Y29kZV9kYXRhICpkID0gZGF0YTsKKworCWQtPmVycm9yID0gaW5wdXRfZ2V0X2tleWNvZGUoaGFuZGxlLT5kZXYsIGQtPnNjYW5jb2RlLCAmZC0+a2V5Y29kZSk7CisKKwlyZXR1cm4gZC0+ZXJyb3IgPT0gMDsgLyogc3RvcCBhcyBzb29uIGFzIHdlIHN1Y2Nlc3NmdWxseSBnZXQgb25lICovCit9CisKIGludCBnZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSkKIHsKLQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGU7Ci0JaW50IGtleWNvZGU7Ci0JaW50IGVycm9yID0gLUVOT0RFVjsKKwlzdHJ1Y3QgZ2V0c2V0X2tleWNvZGVfZGF0YSBkID0geyBzY2FuY29kZSwgMCwgLUVOT0RFViB9OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShoYW5kbGUsICZrYmRfaGFuZGxlci5oX2xpc3QsIGhfbm9kZSkgewotCQllcnJvciA9IGlucHV0X2dldF9rZXljb2RlKGhhbmRsZS0+ZGV2LCBzY2FuY29kZSwgJmtleWNvZGUpOwotCQlpZiAoIWVycm9yKQotCQkJcmV0dXJuIGtleWNvZGU7Ci0JfQorCWlucHV0X2hhbmRsZXJfZm9yX2VhY2hfaGFuZGxlKCZrYmRfaGFuZGxlciwgJmQsIGdldGtleWNvZGVfaGVscGVyKTsKIAotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gZC5lcnJvciA/OiBkLmtleWNvZGU7Cit9CisKK3N0YXRpYyBpbnQgc2V0a2V5Y29kZV9oZWxwZXIoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZXRzZXRfa2V5Y29kZV9kYXRhICpkID0gZGF0YTsKKworCWQtPmVycm9yID0gaW5wdXRfc2V0X2tleWNvZGUoaGFuZGxlLT5kZXYsIGQtPnNjYW5jb2RlLCBkLT5rZXljb2RlKTsKKworCXJldHVybiBkLT5lcnJvciA9PSAwOyAvKiBzdG9wIGFzIHNvb24gYXMgd2Ugc3VjY2Vzc2Z1bGx5IHNldCBvbmUgKi8KIH0KIAogaW50IHNldGtleWNvZGUodW5zaWduZWQgaW50IHNjYW5jb2RlLCB1bnNpZ25lZCBpbnQga2V5Y29kZSkKIHsKLQlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGU7Ci0JaW50IGVycm9yID0gLUVOT0RFVjsKKwlzdHJ1Y3QgZ2V0c2V0X2tleWNvZGVfZGF0YSBkID0geyBzY2FuY29kZSwga2V5Y29kZSwgLUVOT0RFViB9OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShoYW5kbGUsICZrYmRfaGFuZGxlci5oX2xpc3QsIGhfbm9kZSkgewotCQllcnJvciA9IGlucHV0X3NldF9rZXljb2RlKGhhbmRsZS0+ZGV2LCBzY2FuY29kZSwga2V5Y29kZSk7Ci0JCWlmICghZXJyb3IpCi0JCQlicmVhazsKLQl9CisJaW5wdXRfaGFuZGxlcl9mb3JfZWFjaF9oYW5kbGUoJmtiZF9oYW5kbGVyLCAmZCwgc2V0a2V5Y29kZV9oZWxwZXIpOwogCi0JcmV0dXJuIGVycm9yOworCXJldHVybiBkLmVycm9yOwogfQogCiAvKgogICogTWFraW5nIGJlZXBzIGFuZCBiZWxscy4KICAqLworCitzdGF0aWMgaW50IGtkX3NvdW5kX2hlbHBlcihzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgaW50ICpoeiA9IGRhdGE7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGFuZGxlLT5kZXY7CisKKwlpZiAodGVzdF9iaXQoRVZfU05ELCBkZXYtPmV2Yml0KSkgeworCQlpZiAodGVzdF9iaXQoU05EX1RPTkUsIGRldi0+c25kYml0KSkKKwkJCWlucHV0X2luamVjdF9ldmVudChoYW5kbGUsIEVWX1NORCwgU05EX1RPTkUsICpoeik7CisJCWlmICh0ZXN0X2JpdChTTkRfQkVMTCwgaGFuZGxlLT5kZXYtPnNuZGJpdCkpCisJCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9TTkQsIFNORF9CRUxMLCAqaHogPyAxIDogMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGtkX25vc291bmQodW5zaWduZWQgbG9uZyBpZ25vcmVkKQogewotCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHplcm87CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZSwgJmtiZF9oYW5kbGVyLmhfbGlzdCwgaF9ub2RlKSB7Ci0JCWlmICh0ZXN0X2JpdChFVl9TTkQsIGhhbmRsZS0+ZGV2LT5ldmJpdCkpIHsKLQkJCWlmICh0ZXN0X2JpdChTTkRfVE9ORSwgaGFuZGxlLT5kZXYtPnNuZGJpdCkpCi0JCQkJaW5wdXRfaW5qZWN0X2V2ZW50KGhhbmRsZSwgRVZfU05ELCBTTkRfVE9ORSwgMCk7Ci0JCQlpZiAodGVzdF9iaXQoU05EX0JFTEwsIGhhbmRsZS0+ZGV2LT5zbmRiaXQpKQotCQkJCWlucHV0X2luamVjdF9ldmVudChoYW5kbGUsIEVWX1NORCwgU05EX0JFTEwsIDApOwotCQl9Ci0JfQorCWlucHV0X2hhbmRsZXJfZm9yX2VhY2hfaGFuZGxlKCZrYmRfaGFuZGxlciwgJnplcm8sIGtkX3NvdW5kX2hlbHBlcik7CiB9CiAKIHN0YXRpYyBERUZJTkVfVElNRVIoa2RfbWtzb3VuZF90aW1lciwga2Rfbm9zb3VuZCwgMCwgMCk7CiAKIHZvaWQga2RfbWtzb3VuZCh1bnNpZ25lZCBpbnQgaHosIHVuc2lnbmVkIGludCB0aWNrcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOworCWRlbF90aW1lcl9zeW5jKCZrZF9ta3NvdW5kX3RpbWVyKTsKIAotCWRlbF90aW1lcigma2RfbWtzb3VuZF90aW1lcik7CisJaW5wdXRfaGFuZGxlcl9mb3JfZWFjaF9oYW5kbGUoJmtiZF9oYW5kbGVyLCAmaHosIGtkX3NvdW5kX2hlbHBlcik7CiAKLQlpZiAoaHopIHsKLQkJbGlzdF9mb3JfZWFjaF9wcmV2KG5vZGUsICZrYmRfaGFuZGxlci5oX2xpc3QpIHsKLQkJCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSA9IHRvX2hhbmRsZV9oKG5vZGUpOwotCQkJaWYgKHRlc3RfYml0KEVWX1NORCwgaGFuZGxlLT5kZXYtPmV2Yml0KSkgewotCQkJCWlmICh0ZXN0X2JpdChTTkRfVE9ORSwgaGFuZGxlLT5kZXYtPnNuZGJpdCkpIHsKLQkJCQkJaW5wdXRfaW5qZWN0X2V2ZW50KGhhbmRsZSwgRVZfU05ELCBTTkRfVE9ORSwgaHopOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHRlc3RfYml0KFNORF9CRUxMLCBoYW5kbGUtPmRldi0+c25kYml0KSkgewotCQkJCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9TTkQsIFNORF9CRUxMLCAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0aWNrcykKLQkJCW1vZF90aW1lcigma2RfbWtzb3VuZF90aW1lciwgamlmZmllcyArIHRpY2tzKTsKLQl9IGVsc2UKLQkJa2Rfbm9zb3VuZCgwKTsKKwlpZiAoaHogJiYgdGlja3MpCisJCW1vZF90aW1lcigma2RfbWtzb3VuZF90aW1lciwgamlmZmllcyArIHRpY2tzKTsKIH0KIEVYUE9SVF9TWU1CT0woa2RfbWtzb3VuZCk7CiAKQEAgLTI2OSwyNyArMjc1LDM0IEBACiAgKiBTZXR0aW5nIHRoZSBrZXlib2FyZCByYXRlLgogICovCiAKK3N0YXRpYyBpbnQga2JkX3JhdGVfaGVscGVyKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoYW5kbGUtPmRldjsKKwlzdHJ1Y3Qga2JkX3JlcGVhdCAqcmVwID0gZGF0YTsKKworCWlmICh0ZXN0X2JpdChFVl9SRVAsIGRldi0+ZXZiaXQpKSB7CisKKwkJaWYgKHJlcFswXS5kZWxheSA+IDApCisJCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLAorCQkJCQkgICBFVl9SRVAsIFJFUF9ERUxBWSwgcmVwWzBdLmRlbGF5KTsKKwkJaWYgKHJlcFswXS5wZXJpb2QgPiAwKQorCQkJaW5wdXRfaW5qZWN0X2V2ZW50KGhhbmRsZSwKKwkJCQkJICAgRVZfUkVQLCBSRVBfUEVSSU9ELCByZXBbMF0ucGVyaW9kKTsKKworCQlyZXBbMV0uZGVsYXkgPSBkZXYtPnJlcFtSRVBfREVMQVldOworCQlyZXBbMV0ucGVyaW9kID0gZGV2LT5yZXBbUkVQX1BFUklPRF07CisJfQorCisJcmV0dXJuIDA7Cit9CisKIGludCBrYmRfcmF0ZShzdHJ1Y3Qga2JkX3JlcGVhdCAqcmVwKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7Ci0JdW5zaWduZWQgaW50IGQgPSAwOwotCXVuc2lnbmVkIGludCBwID0gMDsKKwlzdHJ1Y3Qga2JkX3JlcGVhdCBkYXRhWzJdID0geyAqcmVwIH07CiAKLQlsaXN0X2Zvcl9lYWNoKG5vZGUsICZrYmRfaGFuZGxlci5oX2xpc3QpIHsKLQkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7Ci0JCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGhhbmRsZS0+ZGV2OworCWlucHV0X2hhbmRsZXJfZm9yX2VhY2hfaGFuZGxlKCZrYmRfaGFuZGxlciwgZGF0YSwga2JkX3JhdGVfaGVscGVyKTsKKwkqcmVwID0gZGF0YVsxXTsJLyogQ29weSBjdXJyZW50bHkgdXNlZCBzZXR0aW5ncyAqLwogCi0JCWlmICh0ZXN0X2JpdChFVl9SRVAsIGRldi0+ZXZiaXQpKSB7Ci0JCQlpZiAocmVwLT5kZWxheSA+IDApCi0JCQkJaW5wdXRfaW5qZWN0X2V2ZW50KGhhbmRsZSwgRVZfUkVQLCBSRVBfREVMQVksIHJlcC0+ZGVsYXkpOwotCQkJaWYgKHJlcC0+cGVyaW9kID4gMCkKLQkJCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9SRVAsIFJFUF9QRVJJT0QsIHJlcC0+cGVyaW9kKTsKLQkJCWQgPSBkZXYtPnJlcFtSRVBfREVMQVldOwotCQkJcCA9IGRldi0+cmVwW1JFUF9QRVJJT0RdOwotCQl9Ci0JfQotCXJlcC0+ZGVsYXkgID0gZDsKLQlyZXAtPnBlcmlvZCA9IHA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5NywzNiArMTAxMCwzNiBAQAogCXJldHVybiBsZWRzOwogfQogCi0vKgotICogVGhpcyByb3V0aW5lIGlzIHRoZSBib3R0b20gaGFsZiBvZiB0aGUga2V5Ym9hcmQgaW50ZXJydXB0Ci0gKiByb3V0aW5lLCBhbmQgcnVucyB3aXRoIGFsbCBpbnRlcnJ1cHRzIGVuYWJsZWQuIEl0IGRvZXMKLSAqIGNvbnNvbGUgY2hhbmdpbmcsIGxlZCBzZXR0aW5nIGFuZCBjb3B5X3RvX2Nvb2tlZCwgd2hpY2ggY2FuCi0gKiB0YWtlIGEgcmVhc29uYWJseSBsb25nIHRpbWUuCi0gKgotICogQXNpZGUgZnJvbSB0aW1pbmcgKHdoaWNoIGlzbid0IHJlYWxseSB0aGF0IGltcG9ydGFudCBmb3IKLSAqIGtleWJvYXJkIGludGVycnVwdHMgYXMgdGhleSBoYXBwZW4gb2Z0ZW4pLCB1c2luZyB0aGUgc29mdHdhcmUKLSAqIGludGVycnVwdCByb3V0aW5lcyBmb3IgdGhpcyB0aGluZyBhbGxvd3MgdXMgdG8gZWFzaWx5IG1hc2sKLSAqIHRoaXMgd2hlbiB3ZSBkb24ndCB3YW50IGFueSBvZiB0aGUgYWJvdmUgdG8gaGFwcGVuLgotICogVGhpcyBhbGxvd3MgZm9yIGVhc3kgYW5kIGVmZmljaWVudCByYWNlLWNvbmRpdGlvbiBwcmV2ZW50aW9uCi0gKiBmb3Iga2JkX3N0YXJ0ID0+IGlucHV0X2luamVjdF9ldmVudChkZXYsIEVWX0xFRCwgLi4uKSA9PiAuLi4KLSAqLworc3RhdGljIGludCBrYmRfdXBkYXRlX2xlZHNfaGVscGVyKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGxlZHMgPSAqKHVuc2lnbmVkIGNoYXIgKilkYXRhOwogCisJaWYgKHRlc3RfYml0KEVWX0xFRCwgaGFuZGxlLT5kZXYtPmV2Yml0KSkgeworCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9MRUQsIExFRF9TQ1JPTExMLCAhIShsZWRzICYgMHgwMSkpOworCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9MRUQsIExFRF9OVU1MLCAgICAhIShsZWRzICYgMHgwMikpOworCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9MRUQsIExFRF9DQVBTTCwgICAhIShsZWRzICYgMHgwNCkpOworCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9TWU4sIFNZTl9SRVBPUlQsIDApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyB0aGUgdGFza2xldCB0aGF0IHVwZGF0ZXMgTEVEIHN0YXRlIG9uIGFsbCBrZXlib2FyZHMKKyAqIGF0dGFjaGVkIHRvIHRoZSBib3guIFRoZSByZWFzb24gd2UgdXNlIHRhc2tsZXQgaXMgdGhhdCB3ZQorICogbmVlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZW4ga2V5Ym9hcmQgaGFuZGxlciBpcyBub3QKKyAqIHJlZ2lzdGVyZWQgeWV0IGJ1dCB3ZSBhbHJlYWR5IGdldHRpbmcgdXBkYXRlcyBmb3JtIFZUIHRvCisgKiB1cGRhdGUgbGVkIHN0YXRlLgorICovCiBzdGF0aWMgdm9pZCBrYmRfYmgodW5zaWduZWQgbG9uZyBkdW1teSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOwogCXVuc2lnbmVkIGNoYXIgbGVkcyA9IGdldGxlZHMoKTsKIAogCWlmIChsZWRzICE9IGxlZHN0YXRlKSB7Ci0JCWxpc3RfZm9yX2VhY2gobm9kZSwgJmtiZF9oYW5kbGVyLmhfbGlzdCkgewotCQkJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlID0gdG9faGFuZGxlX2gobm9kZSk7Ci0JCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9MRUQsIExFRF9TQ1JPTExMLCAhIShsZWRzICYgMHgwMSkpOwotCQkJaW5wdXRfaW5qZWN0X2V2ZW50KGhhbmRsZSwgRVZfTEVELCBMRURfTlVNTCwgICAgISEobGVkcyAmIDB4MDIpKTsKLQkJCWlucHV0X2luamVjdF9ldmVudChoYW5kbGUsIEVWX0xFRCwgTEVEX0NBUFNMLCAgICEhKGxlZHMgJiAweDA0KSk7Ci0JCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9TWU4sIFNZTl9SRVBPUlQsIDApOwotCQl9CisJCWlucHV0X2hhbmRsZXJfZm9yX2VhY2hfaGFuZGxlKCZrYmRfaGFuZGxlciwgJmxlZHMsCisJCQkJCSAgICAgIGtiZF91cGRhdGVfbGVkc19oZWxwZXIpOworCQlsZWRzdGF0ZSA9IGxlZHM7CiAJfQotCi0JbGVkc3RhdGUgPSBsZWRzOwogfQogCiBERUNMQVJFX1RBU0tMRVRfRElTQUJMRUQoa2V5Ym9hcmRfdGFza2xldCwga2JkX2JoLCAwKTsKQEAgLTExMzYsNyArMTE0OSw3IEBACiBzdGF0aWMgdm9pZCBrYmRfcmF3Y29kZSh1bnNpZ25lZCBjaGFyIGRhdGEpCiB7CiAJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOwotCWtiZCA9IGtiZF90YWJsZSArIGZnX2NvbnNvbGU7CisJa2JkID0ga2JkX3RhYmxlICsgdmMtPnZjX251bTsKIAlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1JBVykKIAkJcHV0X3F1ZXVlKHZjLCBkYXRhKTsKIH0KQEAgLTExNTcsNyArMTE3MCw3IEBACiAJCXR0eS0+ZHJpdmVyX2RhdGEgPSB2YzsKIAl9CiAKLQlrYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOworCWtiZCA9IGtiZF90YWJsZSArIHZjLT52Y19udW07CiAKIAlpZiAoa2V5Y29kZSA9PSBLRVlfTEVGVEFMVCB8fCBrZXljb2RlID09IEtFWV9SSUdIVEFMVCkKIAkJc3lzcnFfYWx0ID0gZG93biA/IGtleWNvZGUgOiAwOwpAQCAtMTI5NiwxMCArMTMwOSwxNiBAQAogc3RhdGljIHZvaWQga2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwgdW5zaWduZWQgaW50IGV2ZW50X3R5cGUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBldmVudF9jb2RlLCBpbnQgdmFsdWUpCiB7CisJLyogV2UgYXJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGp1c3QgdGFrZSB0aGUgbG9jayAqLworCXNwaW5fbG9jaygma2JkX2V2ZW50X2xvY2spOworCiAJaWYgKGV2ZW50X3R5cGUgPT0gRVZfTVNDICYmIGV2ZW50X2NvZGUgPT0gTVNDX1JBVyAmJiBIV19SQVcoaGFuZGxlLT5kZXYpKQogCQlrYmRfcmF3Y29kZSh2YWx1ZSk7CiAJaWYgKGV2ZW50X3R5cGUgPT0gRVZfS0VZKQogCQlrYmRfa2V5Y29kZShldmVudF9jb2RlLCB2YWx1ZSwgSFdfUkFXKGhhbmRsZS0+ZGV2KSk7CisKKwlzcGluX3VubG9jaygma2JkX2V2ZW50X2xvY2spOworCiAJdGFza2xldF9zY2hlZHVsZSgma2V5Ym9hcmRfdGFza2xldCk7CiAJZG9fcG9rZV9ibGFua2VkX2NvbnNvbGUgPSAxOwogCXNjaGVkdWxlX2NvbnNvbGVfY2FsbGJhY2soKTsKQEAgLTEzNjMsMTUgKzEzODIsMTEgQEAKICAqLwogc3RhdGljIHZvaWQga2JkX3N0YXJ0KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKIHsKLQl1bnNpZ25lZCBjaGFyIGxlZHMgPSBsZWRzdGF0ZTsKLQogCXRhc2tsZXRfZGlzYWJsZSgma2V5Ym9hcmRfdGFza2xldCk7Ci0JaWYgKGxlZHMgIT0gMHhmZikgewotCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9MRUQsIExFRF9TQ1JPTExMLCAhIShsZWRzICYgMHgwMSkpOwotCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9MRUQsIExFRF9OVU1MLCAgICAhIShsZWRzICYgMHgwMikpOwotCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9MRUQsIExFRF9DQVBTTCwgICAhIShsZWRzICYgMHgwNCkpOwotCQlpbnB1dF9pbmplY3RfZXZlbnQoaGFuZGxlLCBFVl9TWU4sIFNZTl9SRVBPUlQsIDApOwotCX0KKworCWlmIChsZWRzdGF0ZSAhPSAweGZmKQorCQlrYmRfdXBkYXRlX2xlZHNfaGVscGVyKGhhbmRsZSwgJmxlZHN0YXRlKTsKKwogCXRhc2tsZXRfZW5hYmxlKCZrZXlib2FyZF90YXNrbGV0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IGEwNzRmY2UuLjMwZWZmODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTUsNyArNSw3IEBACiAgKgogICogIEFkZGVkIGRldmZzIHN1cHBvcnQuIAogICogICAgSmFuLTExLTE5OTgsIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PgotICogIFNoYXJlZCAvZGV2L3plcm8gbW1hcGluZyBzdXBwb3J0LCBGZWIgMjAwMCwgS2Fub2ogU2FyY2FyIDxrYW5vakBzZ2kuY29tPgorICogIFNoYXJlZCAvZGV2L3plcm8gbW1hcHBpbmcgc3VwcG9ydCwgRmViIDIwMDAsIEthbm9qIFNhcmNhciA8a2Fub2pAc2dpLmNvbT4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC04OTIsMjkgKzg5MSwyMyBAQAogewogCWludCBtaW5vcjsKIAljb25zdCBzdHJ1Y3QgbWVtZGV2ICpkZXY7Ci0JaW50IHJldCA9IC1FTlhJTzsKLQotCWxvY2tfa2VybmVsKCk7CiAKIAltaW5vciA9IGltaW5vcihpbm9kZSk7CiAJaWYgKG1pbm9yID49IEFSUkFZX1NJWkUoZGV2bGlzdCkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVOWElPOwogCiAJZGV2ID0gJmRldmxpc3RbbWlub3JdOwogCWlmICghZGV2LT5mb3BzKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWZpbHAtPmZfb3AgPSBkZXYtPmZvcHM7CiAJaWYgKGRldi0+ZGV2X2luZm8pCiAJCWZpbHAtPmZfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9IGRldi0+ZGV2X2luZm87CiAKIAlpZiAoZGV2LT5mb3BzLT5vcGVuKQotCQlyZXQgPSBkZXYtPmZvcHMtPm9wZW4oaW5vZGUsIGZpbHApOwotCWVsc2UKLQkJcmV0ID0gMDsKLW91dDoKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJldDsKKwkJcmV0dXJuIGRldi0+Zm9wcy0+b3Blbihpbm9kZSwgZmlscCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtb3J5X2ZvcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwppbmRleCAwN2ZhNjEyLi45NmYxY2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWlzYy5jCisrKyBiL2RyaXZlcnMvY2hhci9taXNjLmMKQEAgLTQ5LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAogLyoKICAqIEhlYWQgZW50cnkgZm9yIHRoZSBkb3VibHkgbGlua2VkIG1pc2NkZXZpY2UgbGlzdApAQCAtMTE4LDggKzExNyw3IEBACiAJc3RydWN0IG1pc2NkZXZpY2UgKmM7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHMsICpuZXdfZm9wcyA9IE5VTEw7Ci0JCi0JbG9ja19rZXJuZWwoKTsKKwogCW11dGV4X2xvY2soJm1pc2NfbXR4KTsKIAkKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZtaXNjX2xpc3QsIGxpc3QpIHsKQEAgLTE1Nyw3ICsxNTUsNiBAQAogCWZvcHNfcHV0KG9sZF9mb3BzKTsKIGZhaWw6CiAJbXV0ZXhfdW5sb2NrKCZtaXNjX210eCk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tc3BlYy5jIGIvZHJpdmVycy9jaGFyL21zcGVjLmMKaW5kZXggMTk5NzI3MC4uZWNiODlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21zcGVjLmMKKysrIGIvZHJpdmVycy9jaGFyL21zcGVjLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogLyoKICAqIG1zcGVjX21tYXAKICAqCi0gKiBDYWxsZWQgd2hlbiBtbWFwaW5nIHRoZSBkZXZpY2UuICBJbml0aWFsaXplcyB0aGUgdm1hIHdpdGggYSBmYXVsdCBoYW5kbGVyCisgKiBDYWxsZWQgd2hlbiBtbWFwcGluZyB0aGUgZGV2aWNlLiAgSW5pdGlhbGl6ZXMgdGhlIHZtYSB3aXRoIGEgZmF1bHQgaGFuZGxlcgogICogYW5kIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFsbG9jYXRlLCB0cmFjaywgYW5kIGZyZWUgdGhlCiAgKiB1bmRlcmx5aW5nIHBhZ2VzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwppbmRleCA2OTM0MDI1Li5jMWQ4YjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKQEAgLTYwMiw3ICs2MDIsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUjM5NjRfV0FJVF9GT1JfUlhfUkVQRUFUOgotCQkvKiBGQUxMVFJPVUdIICovCisJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBSMzk2NF9JRExFOgogCQlpZiAoYyA9PSBTVFgpIHsKIAkJCS8qIFByZXZlbnQgcnhfcXVldWUgZnJvbSBvdmVyZmxvdzogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9udnJhbS5jIGIvZHJpdmVycy9jaGFyL252cmFtLmMKaW5kZXggODhjZWU0MC4uNDAwOGUyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL252cmFtLmMKKysrIGIvZHJpdmVycy9jaGFyL252cmFtLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNkZWZpbmUgTlZSQU1fVkVSU0lPTgkiMS4zIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgogCiAjZGVmaW5lIFBDCQkxCkBAIC0xMTEsNiArMTEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKQEAgLTIxNCw3ICsyMTQsNiBAQAogCiBzdGF0aWMgbG9mZl90IG52cmFtX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKLQlsb2NrX2tlcm5lbCgpOwogCXN3aXRjaCAob3JpZ2luKSB7CiAJY2FzZSAwOgogCQkvKiBub3RoaW5nIHRvIGRvICovCkBAIC0yMjYsNyArMjI1LDcgQEAKIAkJb2Zmc2V0ICs9IE5WUkFNX0JZVEVTOwogCQlicmVhazsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOworCiAJcmV0dXJuIChvZmZzZXQgPj0gMCkgPyAoZmlsZS0+Zl9wb3MgPSBvZmZzZXQpIDogLUVJTlZBTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjODczNnhfZ3Bpby5jIGIvZHJpdmVycy9jaGFyL3BjODczNnhfZ3Bpby5jCmluZGV4IDNmN2RhOGMuLjhlY2JjYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wYzg3MzZ4X2dwaW8uYworKysgYi9kcml2ZXJzL2NoYXIvcGM4NzM2eF9ncGlvLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L25zY19ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjZGVmaW5lIERFVk5BTUUgInBjODczNnhfZ3BpbyIKQEAgLTIyMyw3ICsyMjIsNiBAQAogCXVuc2lnbmVkIG0gPSBpbWlub3IoaW5vZGUpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9ICZwYzg3MzZ4X2dwaW9fb3BzOwogCi0JY3ljbGVfa2VybmVsX2xvY2soKTsKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJvcGVuICVkXG4iLCBtKTsKIAogCWlmIChtID49IFBDODczNlhfR1BJT19DVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcm91dGUuaCBiL2RyaXZlcnMvY2hhci9yaW8vcm91dGUuaAppbmRleCAyMGVkNzNmLi40NmU5NjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3JvdXRlLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yb3V0ZS5oCkBAIC02Nyw3ICs2Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCBDT1NUX1JPVVRFIENPU1RfUk9VVEU7CiBzdHJ1Y3QgQ09TVF9ST1VURSB7CiAJdW5zaWduZWQgY2hhciBjb3N0OwkvKiBDb3N0IGRvd24gdGhpcyBsaW5rICovCi0JdW5zaWduZWQgY2hhciByb3V0ZVtOT0RFX0JZVEVTXTsJLyogTm9kZXMgdGhvcm91Z2ggdGhpcyByb3V0ZSAqLworCXVuc2lnbmVkIGNoYXIgcm91dGVbTk9ERV9CWVRFU107CS8qIE5vZGVzIHRocm91Z2ggdGhpcyByb3V0ZSAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgUk9VVEVfU1RSIFJPVVRFX1NUUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zY3gyMDBfZ3Bpby5jIGIvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMKaW5kZXggMWQ5MTAwNS4uOTllNTI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMKKysrIGIvZHJpdmVycy9jaGFyL3NjeDIwMF9ncGlvLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC01Miw3ICs1MSw2IEBACiAJdW5zaWduZWQgbSA9IGltaW5vcihpbm9kZSk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJnNjeDIwMF9ncGlvX29wczsKIAotCWN5Y2xlX2tlcm5lbF9sb2NrKCk7CiAJaWYgKG0gPj0gTUFYX1BJTlMpCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90YjAyMTkuYyBiL2RyaXZlcnMvY2hhci90YjAyMTkuYwppbmRleCBiM2VjOWIxLi5jYWQ0ZWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKKysrIGIvZHJpdmVycy9jaGFyL3RiMDIxOS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KQEAgLTM4LDcgKzM3LDcgQEAKIAogc3RhdGljIHZvaWQgKCpvbGRfbWFjaGluZV9yZXN0YXJ0KShjaGFyICpjb21tYW5kKTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnRiMDIxOV9iYXNlOwotc3RhdGljIHNwaW5sb2NrX3QgdGIwMjE5X2xvY2s7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRiMDIxOV9sb2NrKTsKIAogI2RlZmluZSB0YjAyMTlfcmVhZChvZmZzZXQpCQlyZWFkdyh0YjAyMTlfYmFzZSArIChvZmZzZXQpKQogI2RlZmluZSB0YjAyMTlfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIHRiMDIxOV9iYXNlICsgKG9mZnNldCkpCkBAIC0yMzcsNyArMjM2LDYgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbWlub3I7CiAKLQljeWNsZV9rZXJuZWxfbG9jaygpOwogCW1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAlzd2l0Y2ggKG1pbm9yKSB7CiAJY2FzZSAwOgpAQCAtMzA2LDggKzMwNCw2IEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0Jc3Bpbl9sb2NrX2luaXQoJnRiMDIxOV9sb2NrKTsKLQogCW9sZF9tYWNoaW5lX3Jlc3RhcnQgPSBfbWFjaGluZV9yZXN0YXJ0OwogCV9tYWNoaW5lX3Jlc3RhcnQgPSB0YjAyMTlfcmVzdGFydDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCmluZGV4IDhlNjdkNWMuLjZiZDVmODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKQEAgLTMxNSw3ICszMTUsNyBAQAogICoJRm9yIG1heGltYWwgYmFjayBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IFNZUzUvUE9TSVggKm5peCBiZWhhdmlvdXIKICAqCXdlIG5lZWQgdG8gY2FyZWZ1bGx5IHNldCB0aGUgYml0cyB3aGVuIHRoZSB1c2VyIGRvZXMgbm90IGdldCB0aGUKICAqCWRlc2lyZWQgc3BlZWQuIFdlIGFsbG93IHNtYWxsIG1hcmdpbnMgYW5kIHByZXNlcnZlIGFzIG11Y2ggb2YgcG9zc2libGUKLSAqCW9mIHRoZSBpbnB1dCBpbnRlbnQgdG8ga2VlcCBjb21wYXRpYmxpdHkuCisgKglvZiB0aGUgaW5wdXQgaW50ZW50IHRvIGtlZXAgY29tcGF0aWJpbGl0eS4KICAqCiAgKglMb2NraW5nOiBDYWxsZXIgc2hvdWxkIGhvbGQgdGVybWlvcyBsb2NrLiBUaGlzIGlzIGFscmVhZHkgaGVsZAogICoJd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZHJpdmVyIHRlcm1pb3MgaGFuZGxlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vci5jIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9yLmMKaW5kZXggNzBiNTk2NC4uNzI0YzE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9yLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9yLmMKQEAgLTIxLDcgKzIxLDcgQEAKICAqIF9fY3B1aWRsZV9maW5kX2dvdmVybm9yIC0gZmluZHMgYSBnb3Zlcm5vciBvZiB0aGUgc3BlY2lmaWVkIG5hbWUKICAqIEBzdHI6IHRoZSBuYW1lCiAgKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCBjcHVpZGxlX2xvY2sgYXF1aXJlZC4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggY3B1aWRsZV9sb2NrIGFjcXVpcmVkLgogICovCiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfZ292ZXJub3IgKiBfX2NwdWlkbGVfZmluZF9nb3Zlcm5vcihjb25zdCBjaGFyICpzdHIpCiB7CkBAIC0zOSw3ICszOSw3IEBACiAgKiBAZ292OiB0aGUgbmV3IHRhcmdldCBnb3Zlcm5vcgogICoKICAqIE5PVEU6ICJnb3YiIGNhbiBiZSBOVUxMIHRvIHNwZWNpZnkgZGlzYWJsZWQKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggY3B1aWRsZV9sb2NrIGFxdWlyZWQuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGNwdWlkbGVfbG9jayBhY3F1aXJlZC4KICAqLwogaW50IGNwdWlkbGVfc3dpdGNoX2dvdmVybm9yKHN0cnVjdCBjcHVpZGxlX2dvdmVybm9yICpnb3YpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9oaWZuXzc5NXguYyBiL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCmluZGV4IDVmNzUzZmMuLjA5YWQ5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCkBAIC04NjMsNyArODYzLDcgQEAKIAkJZGV2LT5kbWFyZWcgfD0gSElGTl9ETUFJRVJfUFVCRE9ORTsKIAkJaGlmbl93cml0ZV8xKGRldiwgSElGTl8xX0RNQV9JRVIsIGRldi0+ZG1hcmVnKTsKIAotCQlkcHJpbnRrKCJDaGlwICVzOiBQdWJsaWMga2V5IGVuZ2luZSBoYXMgYmVlbiBzdWNlc3NmdWxseSAiCisJCWRwcmludGsoIkNoaXAgJXM6IFB1YmxpYyBrZXkgZW5naW5lIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSAiCiAJCQkJImluaXRpYWxpc2VkLlxuIiwgZGV2LT5uYW1lKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCmluZGV4IDc1ODVjNDEuLmM1MmFjOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvYXRfaGRtYWMuYwpAQCAtOTksNyArOTksNyBAQAogfQogCiAvKioKLSAqIGF0Y19kZXNjX2dldCAtIGdldCBhIHVuc3VzZWQgZGVzY3JpcHRvciBmcm9tIGZyZWVfbGlzdAorICogYXRjX2Rlc2NfZ2V0IC0gZ2V0IGFuIHVudXNlZCBkZXNjcmlwdG9yIGZyb20gZnJlZV9saXN0CiAgKiBAYXRjaGFuOiBjaGFubmVsIHdlIHdhbnQgYSBuZXcgZGVzY3JpcHRvciBmb3IKICAqLwogc3RhdGljIHN0cnVjdCBhdF9kZXNjICphdGNfZGVzY19nZXQoc3RydWN0IGF0X2RtYV9jaGFuICphdGNoYW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdG9wb2xvZ3kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10b3BvbG9neS5jCmluZGV4IDlhNWYzOGMuLjkzZWM2NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10b3BvbG9neS5jCkBAIC0xODMsNyArMTgzLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b3BvbG9neSBnaXZlbgogICogYnkgdGhlIHNlbGYgSURzIGZyb20gdGhlIGxhdGVzdCBidXMgcmVzZXQuICBEdXJpbmcgdGhlIGNvbnN0cnVjdGlvbgogICogb2YgdGhlIHRyZWUsIHRoZSBmdW5jdGlvbiBjaGVja3MgdGhhdCB0aGUgc2VsZiBJRHMgYXJlIHZhbGlkIGFuZAotICogaW50ZXJuYWxseSBjb25zaXN0ZW50LiAgT24gc3VjY2Nlc3MgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZQorICogaW50ZXJuYWxseSBjb25zaXN0ZW50LiAgT24gc3VjY2VzcyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCiAgKiBmd19ub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2FsIGNhcmQgb3RoZXJ3aXNlIE5VTEwuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZndfbm9kZSAqYnVpbGRfdHJlZShzdHJ1Y3QgZndfY2FyZCAqY2FyZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwppbmRleCA5MzgxMDBmLi4zYTJjY2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCkBAIC00MjksNyArNDI5LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkbWktPm1hdGNoZXMpOyBpKyspIHsKIAkJaW50IHMgPSBkbWktPm1hdGNoZXNbaV0uc2xvdDsKIAkJaWYgKHMgPT0gRE1JX05PTkUpCi0JCQljb250aW51ZTsKKwkJCWJyZWFrOwogCQlpZiAoZG1pX2lkZW50W3NdCiAJCSAgICAmJiBzdHJzdHIoZG1pX2lkZW50W3NdLCBkbWktPm1hdGNoZXNbaV0uc3Vic3RyKSkKIAkJCWNvbnRpbnVlOwpAQCAtNDQwLDYgKzQ0MCwxNSBAQAogfQogCiAvKioKKyAqCWRtaV9pc19lbmRfb2ZfdGFibGUgLSBjaGVjayBmb3IgZW5kLW9mLXRhYmxlIG1hcmtlcgorICoJQGRtaTogcG9pbnRlciB0byB0aGUgZG1pX3N5c3RlbV9pZCBzdHJ1Y3R1cmUgdG8gY2hlY2sKKyAqLworc3RhdGljIGJvb2wgZG1pX2lzX2VuZF9vZl90YWJsZShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZG1pKQoreworCXJldHVybiBkbWktPm1hdGNoZXNbMF0uc2xvdCA9PSBETUlfTk9ORTsKK30KKworLyoqCiAgKglkbWlfY2hlY2tfc3lzdGVtIC0gY2hlY2sgc3lzdGVtIERNSSBkYXRhCiAgKglAbGlzdDogYXJyYXkgb2YgZG1pX3N5c3RlbV9pZCBzdHJ1Y3R1cmVzIHRvIG1hdGNoIGFnYWluc3QKICAqCQlBbGwgbm9uLW51bGwgZWxlbWVudHMgb2YgdGhlIGxpc3QgbXVzdCBtYXRjaApAQCAtNDU3LDcgKzQ2Niw3IEBACiAJaW50IGNvdW50ID0gMDsKIAljb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZDsKIAotCWZvciAoZCA9IGxpc3Q7IGQtPmlkZW50OyBkKyspCisJZm9yIChkID0gbGlzdDsgIWRtaV9pc19lbmRfb2ZfdGFibGUoZCk7IGQrKykKIAkJaWYgKGRtaV9tYXRjaGVzKGQpKSB7CiAJCQljb3VudCsrOwogCQkJaWYgKGQtPmNhbGxiYWNrICYmIGQtPmNhbGxiYWNrKGQpKQpAQCAtNDg0LDcgKzQ5Myw3IEBACiB7CiAJY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQ7CiAKLQlmb3IgKGQgPSBsaXN0OyBkLT5pZGVudDsgZCsrKQorCWZvciAoZCA9IGxpc3Q7ICFkbWlfaXNfZW5kX29mX3RhYmxlKGQpOyBkKyspCiAJCWlmIChkbWlfbWF0Y2hlcyhkKSkKIAkJCXJldHVybiBkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCmluZGV4IDVjYWUwYjMuLjNmN2M1MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCkBAIC0yNzIsNyArMjcyLDcgQEAKICAqIGZ1bmN0aW9ucyAmIGRldmljZSBmaWxlIGFuZCBhZGRzIGl0IHRvIHRoZSBtYXN0ZXIgZmQgbGlzdC4KICAqCiAgKiBSRVRVUk5TOgotICogWmVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGZhbHVyZS4KKyAqIFplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCiBpbnQgZHJtX2ZyYW1lYnVmZmVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCiAJCQkgY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyAqZnVuY3MpCkBAIC0yMzI4LDcgKzIzMjgsNyBAQAogCX0gZWxzZSBpZiAoY29ubmVjdG9yLT5mdW5jcy0+c2V0X3Byb3BlcnR5KQogCQlyZXQgPSBjb25uZWN0b3ItPmZ1bmNzLT5zZXRfcHJvcGVydHkoY29ubmVjdG9yLCBwcm9wZXJ0eSwgb3V0X3Jlc3AtPnZhbHVlKTsKIAotCS8qIHN0b3JlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpZiBzdWNjZXNmdWwgKi8KKwkvKiBzdG9yZSB0aGUgcHJvcGVydHkgdmFsdWUgaWYgc3VjY2Vzc2Z1bCAqLwogCWlmICghcmV0KQogCQlkcm1fY29ubmVjdG9yX3Byb3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsIHByb3BlcnR5LCBvdXRfcmVzcC0+dmFsdWUpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggYWJmYzI3Yi4uYTJhM2ZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCkBAIC0xMzA5LDcgKzEzMDksNyBAQAogICogaTkxNV9nZW1fcmVsZWFzZV9tbWFwIC0gcmVtb3ZlIHBoeXNpY2FsIHBhZ2UgbWFwcGluZ3MKICAqIEBvYmo6IG9iaiBpbiBxdWVzdGlvbgogICoKLSAqIFByZXNlcnZlIHRoZSByZXNlcnZhdGlvbiBvZiB0aGUgbW1hcGluZyB3aXRoIHRoZSBEUk0gY29yZSBjb2RlLCBidXQKKyAqIFByZXNlcnZlIHRoZSByZXNlcnZhdGlvbiBvZiB0aGUgbW1hcHBpbmcgd2l0aCB0aGUgRFJNIGNvcmUgY29kZSwgYnV0CiAgKiByZWxpbnF1aXNoIG93bmVyc2hpcCBvZiB0aGUgcGFnZXMgYmFjayB0byB0aGUgc3lzdGVtLgogICoKICAqIEl0IGlzIHZpdGFsIHRoYXQgd2UgcmVtb3ZlIHRoZSBwYWdlIG1hcHBpbmcgaWYgd2UgaGF2ZSBtYXBwZWQgYSB0aWxlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMKaW5kZXggMmIwZmU1NC4uNDBmY2Y2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jCkBAIC03MCw3ICs3MCw3IEBACiAKIAogLyoqCi0gKiBDdXJyZXRseSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG9sZCBmcmFtZWJ1ZmZlciBpcyByZXVzZWQuCisgKiBDdXJyZW50bHkgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBvbGQgZnJhbWVidWZmZXIgaXMgcmV1c2VkLgogICoKICAqIExPQ0tJTkcKICAqIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgbW9kZSBjb25maWcgbG9jay4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCAwNTU5OGFlLi5lYjM2NTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC04OTksNyArODk5LDcgQEAKIAogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKIAkJCQlBQ1BJX1VJTlQzMl9NQVgsCi0JCQkJY2hlY2tfbGlkX2RldmljZSwgJmxpZF9wcmVzZW50LCBOVUxMKTsKKwkJCQljaGVja19saWRfZGV2aWNlLCBOVUxMLCAmbGlkX3ByZXNlbnQsIE5VTEwpOwogCiAJcmV0dXJuIGxpZF9wcmVzZW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCmluZGV4IDA4M2JlYzIuLmU3ZmEzMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKQEAgLTI3MjYsNyArMjcyNiw3IEBACiAJLyogV3JhcCB3aXRoIG91ciBjdXN0b20gYWxnbyB3aGljaCBzd2l0Y2hlcyB0byBEREMgbW9kZSAqLwogCWludGVsX291dHB1dC0+ZGRjX2J1cy0+YWxnbyA9ICZpbnRlbF9zZHZvX2kyY19iaXRfYWxnbzsKIAotCS8qIEluIGRlZmF1dCBjYXNlIHNkdm8gbHZkcyBpcyBmYWxzZSAqLworCS8qIEluIGRlZmF1bHQgY2FzZSBzZHZvIGx2ZHMgaXMgZmFsc2UgKi8KIAlpbnRlbF9zZHZvX2dldF9jYXBhYmlsaXRpZXMoaW50ZWxfb3V0cHV0LCAmc2R2b19wcml2LT5jYXBzKTsKIAogCWlmIChpbnRlbF9zZHZvX291dHB1dF9zZXR1cChpbnRlbF9vdXRwdXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmgKaW5kZXggYzExZGRkZC4uNjY0M2FmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaApAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIC8qIHVjVGFibGVGb3JtYXRSZXZpc2lvbj0xLHVjVGFibGVDb250ZW50UmV2aXNpb249MiAqLwogdHlwZWRlZiBzdHJ1Y3QgX0xWRFNfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjIgewogCVVTSE9SVCB1c1BpeGVsQ2xvY2s7CS8qICBpbiAxMEtIejsgZm9yIGJpb3MgY29udmVuaWVudCAqLwotCVVDSEFSIHVjTWlzYzsJCS8qICBzZWUgUEFORUxfRU5DT0RFUl9NSVNDX3h4IGRlZmludGlvbnMgYmVsb3cgKi8KKwlVQ0hBUiB1Y01pc2M7CQkvKiAgc2VlIFBBTkVMX0VOQ09ERVJfTUlTQ194eCBkZWZpbml0aW9ucyBiZWxvdyAqLwogCVVDSEFSIHVjQWN0aW9uOwkJLyogIDA6IHR1cm4gb2ZmIGVuY29kZXIgKi8KIAkvKiAgMTogc2V0dXAgYW5kIHR1cm4gb24gZW5jb2RlciAqLwogCVVDSEFSIHVjVHJ1bmNhdGU7CS8qICBiaXQwPTA6IERpc2FibGUgdHJ1bmNhdGUgKi8KQEAgLTE0MjQsNyArMTQyNCw3IEBACiAvKiAgU3RydWN0dXJlcyB1c2VkIGluIEZpcm13YXJlSW5mb1RhYmxlICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogIHVzQklPU0NhcGFiaWxpdHkgRGVmaW50aW9uOiAqLworLyogIHVzQklPU0NhcGFiaWxpdHkgRGVmaW5pdGlvbjogKi8KIC8qICBCaXQgMCA9IDA6IEJpb3MgaW1hZ2UgaXMgbm90IFBvc3RlZCwgPTE6QmlvcyBpbWFnZSBpcyBQb3N0ZWQ7ICovCiAvKiAgQml0IDEgPSAwOiBEdWFsIENSVEMgaXMgbm90IHN1cHBvcnRlZCwgPTE6IER1YWwgQ1JUQyBpcyBzdXBwb3J0ZWQ7ICovCiAvKiAgQml0IDIgPSAwOiBFeHRlbmRlZCBEZXNrdG9wIGlzIG5vdCBzdXBwb3J0ZWQsID0xOiBFeHRlbmRlZCBEZXNrdG9wIGlzIHN1cHBvcnRlZDsgKi8KQEAgLTIzODYsNyArMjM4Niw3IEBACiB9IEFUT01fQU5BTE9HX1RWX0lORk9fVjFfMjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIFZSQU0gdXNhZ2UgYW5kIHRoZWlyIGRlZmludGlvbnMgKi8KKy8qICBWUkFNIHVzYWdlIGFuZCB0aGVpciBkZWZpbml0aW9ucyAqLwogCiAvKiAgT25lIGNodW5rIG9mIFZSQU0gdXNlZCBieSBCaW9zIGFyZSBmb3IgSFdJQ09OIHN1cmZhY2VzLEVESUQgZGF0YS4gKi8KIC8qICBDdXJyZW50IE1vZGUgdGltaW5nIGFuZCBEYWlsIFRpbWluZyBhbmQvb3IgU1REIHRpbWluZyBkYXRhIEVBQ0ggZGV2aWNlLiBUaGV5IGNhbiBiZSBicm9rZW4gZG93biBhcyBiZWxvdy4gKi8KQEAgLTMwNDYsNyArMzA0Niw3IEBACiAjZGVmaW5lIEFUT01fUzBfU1lTVEVNX1BPV0VSX1NUQVRFX1ZBTFVFX0RDICAgICAyCiAjZGVmaW5lIEFUT01fUzBfU1lTVEVNX1BPV0VSX1NUQVRFX1ZBTFVFX0xJVEVBQyAzCiAKLS8qIEJ5dGUgYWxpZ25lZCBkZWZpbnRpb24gZm9yIEJJT1MgdXNhZ2UgKi8KKy8qIEJ5dGUgYWxpZ25lZCBkZWZpbml0aW9uIGZvciBCSU9TIHVzYWdlICovCiAjZGVmaW5lIEFUT01fUzBfQ1JUMV9NT05PYjAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBBVE9NX1MwX0NSVDFfQ09MT1JiMCAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgQVRPTV9TMF9DUlQxX01BU0tiMCAgICAgICAgICAgICAoQVRPTV9TMF9DUlQxX01PTk9iMCtBVE9NX1MwX0NSVDFfQ09MT1JiMCkKQEAgLTMxMzEsNyArMzEzMSw3IEBACiAjZGVmaW5lIEFUT01fUzJfRElTUExBWV9ST1RBVElPTl9ERUdSRUVfU0hJRlQgMzAKICNkZWZpbmUgQVRPTV9TMl9ESVNQTEFZX1JPVEFUSU9OX0FOR0xFX01BU0sgICAweEMwMDAwMDAwTAogCi0vKiBCeXRlIGFsaWduZWQgZGVmaW50aW9uIGZvciBCSU9TIHVzYWdlICovCisvKiBCeXRlIGFsaWduZWQgZGVmaW5pdGlvbiBmb3IgQklPUyB1c2FnZSAqLwogI2RlZmluZSBBVE9NX1MyX1RWMV9TVEFOREFSRF9NQVNLYjAgICAgIDB4MEYKICNkZWZpbmUgQVRPTV9TMl9DVVJSRU5UX0JMX0xFVkVMX01BU0tiMSAweEZGCiAjZGVmaW5lIEFUT01fUzJfQ1JUMV9EUE1TX1NUQVRFYjIgICAgICAgMHgwMQpAQCAtMzE5MCw3ICszMTkwLDcgQEAKICNkZWZpbmUgQVRPTV9TM19BTExPV19GQVNUX1BXUl9TV0lUQ0ggICAweDQwMDAwMDAwTAogI2RlZmluZSBBVE9NX1MzX1JRU1RfR1BVX1VTRV9NSU5fUFdSICAgIDB4ODAwMDAwMDBMCiAKLS8qIEJ5dGUgYWxpZ25lZCBkZWZpbnRpb24gZm9yIEJJT1MgdXNhZ2UgKi8KKy8qIEJ5dGUgYWxpZ25lZCBkZWZpbml0aW9uIGZvciBCSU9TIHVzYWdlICovCiAjZGVmaW5lIEFUT01fUzNfQ1JUMV9BQ1RJVkViMCAgICAgICAgICAgMHgwMQogI2RlZmluZSBBVE9NX1MzX0xDRDFfQUNUSVZFYjAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgQVRPTV9TM19UVjFfQUNUSVZFYjAgICAgICAgICAgICAweDA0CkBAIC0zMjMwLDcgKzMyMzAsNyBAQAogI2RlZmluZSBBVE9NX1M0X0xDRDFfUkVGUkVTSF9NQVNLICAgICAgIDB4MDAwMEZGMDBMCiAjZGVmaW5lIEFUT01fUzRfTENEMV9SRUZSRVNIX1NISUZUICAgICAgOAogCi0vKiBCeXRlIGFsaWduZWQgZGVmaW50aW9uIGZvciBCSU9TIHVzYWdlICovCisvKiBCeXRlIGFsaWduZWQgZGVmaW5pdGlvbiBmb3IgQklPUyB1c2FnZSAqLwogI2RlZmluZSBBVE9NX1M0X0xDRDFfUEFORUxfSURfTUFTS2IwCSAgMHgwRkYKICNkZWZpbmUgQVRPTV9TNF9MQ0QxX1JFRlJFU0hfTUFTS2IxCQkgIEFUT01fUzRfTENEMV9QQU5FTF9JRF9NQVNLYjAKICNkZWZpbmUgQVRPTV9TNF9WUkFNX0lORk9fTUFTS2IyICAgICAgICBBVE9NX1M0X0xDRDFfUEFORUxfSURfTUFTS2IwCkBAIC0zMzEwLDcgKzMzMTAsNyBAQAogI2RlZmluZSBBVE9NX1M2X1ZSSV9CUklHSFRORVNTX0NIQU5HRSAgICAgICAweDQwMDAwMDAwTAogI2RlZmluZSBBVE9NX1M2X0NPTkZJR19ESVNQTEFZX0NIQU5HRV9NQVNLICAweDgwMDAwMDAwTAogCi0vKiBCeXRlIGFsaWduZWQgZGVmaW50aW9uIGZvciBCSU9TIHVzYWdlICovCisvKiBCeXRlIGFsaWduZWQgZGVmaW5pdGlvbiBmb3IgQklPUyB1c2FnZSAqLwogI2RlZmluZSBBVE9NX1M2X0RFVklDRV9DSEFOR0ViMCAgICAgICAgIDB4MDEKICNkZWZpbmUgQVRPTV9TNl9TQ0FMRVJfQ0hBTkdFYjAgICAgICAgICAweDAyCiAjZGVmaW5lIEFUT01fUzZfTElEX0NIQU5HRWIwICAgICAgICAgICAgMHgwNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwppbmRleCAyNzhmNjQ2Li42NzQwZWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwpAQCAtMzk0LDExICszOTQsMTEgQEAKIAkJICogQUdQIHNvIHRoYXQgR1BVIGNhbiBjYXRjaCBvdXQgb2YgVlJBTS9BR1AgYWNjZXNzCiAJCSAqLwogCQlpZiAocmRldi0+bWMuZ3R0X2xvY2F0aW9uID4gcmRldi0+bWMubWNfdnJhbV9zaXplKSB7Ci0JCQkvKiBFbm91Z2h0IHBsYWNlIGJlZm9yZSAqLworCQkJLyogRW5vdWdoIHBsYWNlIGJlZm9yZSAqLwogCQkJcmRldi0+bWMudnJhbV9sb2NhdGlvbiA9IHJkZXYtPm1jLmd0dF9sb2NhdGlvbiAtCiAJCQkJCQkJcmRldi0+bWMubWNfdnJhbV9zaXplOwogCQl9IGVsc2UgaWYgKHRtcCA+IHJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSkgewotCQkJLyogRW5vdWdodCBwbGFjZSBhZnRlciAqLworCQkJLyogRW5vdWdoIHBsYWNlIGFmdGVyICovCiAJCQlyZGV2LT5tYy52cmFtX2xvY2F0aW9uID0gcmRldi0+bWMuZ3R0X2xvY2F0aW9uICsKIAkJCQkJCQlyZGV2LT5tYy5ndHRfc2l6ZTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYi5jCmluZGV4IGIzOGM0YzguLmQxMGViNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYwpAQCAtNTksNyArNTksNyBAQAogfTsKIAogLyoqCi0gKiBDdXJyZXRseSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG9sZCBmcmFtZWJ1ZmZlciBpcyByZXVzZWQuCisgKiBDdXJyZW50bHkgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBvbGQgZnJhbWVidWZmZXIgaXMgcmV1c2VkLgogICoKICAqIExPQ0tJTkcKICAqIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgbW9kZSBjb25maWcgbG9jay4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jCmluZGV4IDM4NTM3ZDkuLjA2NzE2N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc3RhdGUuYwpAQCAtMTk1MCw3ICsxOTUwLDcgQEAKICAqIE5vdGUgdGhhdCByZWZjb3VudCBjYW4gYmUgYXQgbW9zdCAyLCBzaW5jZSBkdXJpbmcgYSBmcmVlIHJlZmNvdW50PTMKICAqIG1pZ2h0IG1lYW4gd2UgaGF2ZSB0byBhbGxvY2F0ZSBhIG5ldyBzdXJmYWNlIHdoaWNoIG1pZ2h0IG5vdCBhbHdheXMKICAqIGJlIGF2YWlsYWJsZS4KLSAqIEZvciBleGFtcGxlIDogd2UgYWxsb2NhdGUgdGhyZWUgY29udGlnb3VzIHN1cmZhY2VzIEFCQy4gSWYgQiBpcworICogRm9yIGV4YW1wbGUgOiB3ZSBhbGxvY2F0ZSB0aHJlZSBjb250aWd1b3VzIHN1cmZhY2VzIEFCQy4gSWYgQiBpcwogICogZnJlZWQsIHdlIHN1ZGRlbmx5IG5lZWQgdHdvIHN1cmZhY2VzIHRvIHN0b3JlIEEgYW5kIEMsIHdoaWNoIG1pZ2h0CiAgKiBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90dG0uYwppbmRleCAxMzgxZTA2Li5lZGE0YWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90dG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90dG0uYwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJICAgICBuZXdfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfU1lTVEVNKSB8fAogCSAgICAob2xkX21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSAmJgogCSAgICAgbmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1RUKSkgewotCQkvKiBiaW5kIGlzIGVub3VnaHQgKi8KKwkJLyogYmluZCBpcyBlbm91Z2ggKi8KIAkJcmFkZW9uX21vdmVfbnVsbChibywgbmV3X21lbSk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwppbmRleCBiMGVmZDBkLi41ZTA2ZWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCkBAIC04MjksMTEgKzgyOSwxMSBAQAogCQkgKiBBR1Agc28gdGhhdCBHUFUgY2FuIGNhdGNoIG91dCBvZiBWUkFNL0FHUCBhY2Nlc3MKIAkJICovCiAJCWlmIChyZGV2LT5tYy5ndHRfbG9jYXRpb24gPiByZGV2LT5tYy5tY192cmFtX3NpemUpIHsKLQkJCS8qIEVub3VnaHQgcGxhY2UgYmVmb3JlICovCisJCQkvKiBFbm91Z2ggcGxhY2UgYmVmb3JlICovCiAJCQlyZGV2LT5tYy52cmFtX2xvY2F0aW9uID0gcmRldi0+bWMuZ3R0X2xvY2F0aW9uIC0KIAkJCQkJCQlyZGV2LT5tYy5tY192cmFtX3NpemU7CiAJCX0gZWxzZSBpZiAodG1wID4gcmRldi0+bWMubWNfdnJhbV9zaXplKSB7Ci0JCQkvKiBFbm91Z2h0IHBsYWNlIGFmdGVyICovCisJCQkvKiBFbm91Z2ggcGxhY2UgYWZ0ZXIgKi8KIAkJCXJkZXYtPm1jLnZyYW1fbG9jYXRpb24gPSByZGV2LT5tYy5ndHRfbG9jYXRpb24gKwogCQkJCQkJCXJkZXYtPm1jLmd0dF9zaXplOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCmluZGV4IGM3MDkyN2UuLjYxYzU1NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gdXNlIHZtYXAgdG8gZ2V0IHRoZSBkZXNpcmVkIHBhZ2UgcHJvdGVjdGlvbgotCQkgKiBvciB0byBtYWtlIHRoZSBidWZmZXIgb2JqZWN0IGxvb2sgY29udGlnb3VzLgorCQkgKiBvciB0byBtYWtlIHRoZSBidWZmZXIgb2JqZWN0IGxvb2sgY29udGlndW91cy4KIAkJICovCiAJCXByb3QgPSAobWVtLT5wbGFjZW1lbnQgJiBUVE1fUExfRkxBR19DQUNIRUQpID8KIAkJCVBBR0VfS0VSTkVMIDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IDdkMDVjNGIuLjgwNzkyZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMzksOCArMzksNiBAQAogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjYiCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIkFuZHJlYXMgR2FsLCBWb2p0ZWNoIFBhdmxpaywgSmlyaSBLb3NpbmEiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJISUQgY29yZSBkcml2ZXIiCiAjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCiAKQEAgLTEyOTQsNiArMTI5Miw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NISUNPTlksIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9UQUNUSUNBTF9QQUQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19NT1VTRSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRFJBR09OUklTRSwgMHgwMDA2KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FWktFWSwgVVNCX0RFVklDRV9JRF9CVENfODE5MykgfSwKQEAgLTEzMjYsNiArMTMyNSw4IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PTU9fV0hFRUwyKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjVfV0hFRUwpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX1NQQUNFVFJBVkVMTEVSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9TUEFDRU5BVklHQVRPUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX1NJREVXSU5ERVJfR1YpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19ORTRLKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfTEs2SykgfSwKQEAgLTE2MjAsNiArMTYyMSw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tCR0VBUiwgVVNCX0RFVklDRV9JRF9LQkdFQVJfSkFNU1RVRElPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LV09STEQsIFVTQl9ERVZJQ0VfSURfS1dPUkxEX1JBRElPX0ZNNzAwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX0dQRU5fNTYwKSB9LAorCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsIDB4MDA1OCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfQ0FTU1kpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1BPQ0tFVENBU1NZKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NT0JJTEVDQVNTWSkgfSwKQEAgLTE5MTgsNSArMTkyMCw4IEBACiBtb2R1bGVfaW5pdChoaWRfaW5pdCk7CiBtb2R1bGVfZXhpdChoaWRfZXhpdCk7CiAKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgR2FsIik7CitNT0RVTEVfQVVUSE9SKCJWb2p0ZWNoIFBhdmxpayIpOworTU9EVUxFX0FVVEhPUigiSmlyaSBLb3NpbmEiKTsKIE1PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYyBiL2RyaXZlcnMvaGlkL2hpZC1jeXByZXNzLmMKaW5kZXggNjJlOWNiMS4uOTk4YjZmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY3lwcmVzcy5jCkBAIC0xMjYsNiArMTI2LDggQEAKIAkJLmRyaXZlcl9kYXRhID0gQ1BfUkRFU0NfU1dBUFBFRF9NSU5fTUFYIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIpLAogCQkuZHJpdmVyX2RhdGEgPSBDUF9SREVTQ19TV0FQUEVEX01JTl9NQVggfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMyksCisJCS5kcml2ZXJfZGF0YSA9IENQX1JERVNDX1NXQVBQRURfTUlOX01BWCB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UpLAogCQkuZHJpdmVyX2RhdGEgPSBDUF8yV0hFRUxfTU9VU0VfSEFDSyB9LAogCXsgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCmluZGV4IGFkYmVmNWQuLjM4MzkzNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKQEAgLTExNyw2ICsxMTcsNyBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIX1BST19QRURBTFMJMHgwMGYyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hfQ09NQkFUU1RJQ0sJMHgwMGY0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hfRkxJR0hUX1NJTV9ZT0tFCTB4MDBmZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIXzNBWElTXzVCVVRUT05fU1RJQ0sJMHgwMGQzCiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSEVSUlkJCTB4MDQ2YQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTgkweDAwMjMKQEAgLTE0NSw2ICsxNDYsNyBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRQkweDc0MTcKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMQkweGRlNjEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMgkweGRlNjQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMwkweGJjYTEKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFQUxFWFRSRUFNRQkweDEwYzUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUFMRVhUUkVBTUVfUkFESU9fU0k0NzAxCTB4ODE5YQpAQCAtMzA0LDYgKzMwNiw4IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yCTB4YzUxNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDAJMHhjNTEyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSCTB4YzUxMworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NQQUNFVFJBVkVMTEVSCTB4YzYyMworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NQQUNFTkFWSUdBVE9SCTB4YzYyNgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19ERVNLVE9QCTB4YzcwNAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19FREdFCTB4YzcxNAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19NSU5JCTB4YzcxZgpAQCAtMzQ2LDYgKzM1MCw5IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkVDCQkweDA3M2UKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORUNfVVNCX0dBTUVfUEFECTB4MDMwMQogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkVYVFdJTkRPVwkweDE5MjYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORVhUV0lORE9XX1RPVUNIU0NSRUVOCTB4MDAwMworCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfTlRSSUcgICAgICAgICAgICAgICAgMHgxYjk2CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTlRSSUdfVE9VQ0hfU0NSRUVOICAgMHgwMDAxCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZy5jIGIvZHJpdmVycy9oaWQvaGlkLWxnLmMKaW5kZXggMGY4NzBhMy4uOWZjZDNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNkZWZpbmUgTEdfTk9HRVQJCTB4MTAwCiAjZGVmaW5lIExHX0ZGCQkJMHgyMDAKICNkZWZpbmUgTEdfRkYyCQkJMHg0MDAKKyNkZWZpbmUgTEdfUkRFU0NfUkVMX0FCUwkweDgwMAogCiAvKgogICogQ2VydGFpbiBMb2dpdGVjaCBrZXlib2FyZHMgc2VuZCBpbiByZXBvcnQgIzMga2V5cyB3aGljaCBhcmUgZmFyCkBAIC01MSw2ICs1MiwxMyBAQAogCQlyZGVzY1s4NF0gPSByZGVzY1s4OV0gPSAweDRkOwogCQlyZGVzY1s4NV0gPSByZGVzY1s5MF0gPSAweDEwOwogCX0KKwlpZiAoKHF1aXJrcyAmIExHX1JERVNDX1JFTF9BQlMpICYmIHJzaXplID49IDUwICYmCisJCQlyZGVzY1szMl0gPT0gMHg4MSAmJiByZGVzY1szM10gPT0gMHgwNiAmJgorCQkJcmRlc2NbNDldID09IDB4ODEgJiYgcmRlc2NbNTBdID09IDB4MDYpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCByZWwvYWJzIGluIExvZ2l0ZWNoICIKKwkJCQkicmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1szM10gPSByZGVzY1s1MF0gPSAweDAyOworCX0KIH0KIAogI2RlZmluZSBsZ19tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXApAQCAtODksNiArOTcsMjIgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBsZ19kaW5vdm9fbWFwcGluZyhzdHJ1Y3QgaGlkX2lucHV0ICpoaSwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTE9HSVZFTkRPUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKworCWNhc2UgMHgwMGQ6IGxnX21hcF9rZXlfY2xlYXIoS0VZX01FRElBKTsJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisKKwl9CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgbGdfd2lyZWxlc3NfbWFwcGluZyhzdHJ1Y3QgaGlkX2lucHV0ICpoaSwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCiAJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQogewpAQCAtMTY0LDYgKzE4OCwxMCBAQAogCQkJbGdfdWx0cmF4X3JlbW90ZV9tYXBwaW5nKGhpLCB1c2FnZSwgYml0LCBtYXgpKQogCQlyZXR1cm4gMTsKIAorCWlmIChoZGV2LT5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfRElOT1ZPX01JTkkgJiYKKwkJCWxnX2Rpbm92b19tYXBwaW5nKGhpLCB1c2FnZSwgYml0LCBtYXgpKQorCQlyZXR1cm4gMTsKKwogCWlmICgocXVpcmtzICYgTEdfV0lSRUxFU1MpICYmIGxnX3dpcmVsZXNzX21hcHBpbmcoaGksIHVzYWdlLCBiaXQsIG1heCkpCiAJCXJldHVybiAxOwogCkBAIC0zMDMsOCArMzMxLDEzIEBACiAJCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDIpLAogCQkuZHJpdmVyX2RhdGEgPSBMR19GRjIgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfU1BBQ0VOQVZJR0FUT1IpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19SREVTQ19SRUxfQUJTIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX1NQQUNFVFJBVkVMTEVSKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfUkRFU0NfUkVMX0FCUyB9LAogCXsgfQogfTsKKwogTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGxnX2RldmljZXMpOwogCiBzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgbGdfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwppbmRleCAwM2JkNzAzLi4wMjU4Mjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwpAQCAtNDEsOCArNDEsNiBAQAogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjYiCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIkFuZHJlYXMgR2FsLCBWb2p0ZWNoIFBhdmxpaywgSmlyaSBLb3NpbmEiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgSElEIGNvcmUgZHJpdmVyIgogI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgogCkBAIC05OTgsNyArOTk2LDggQEAKIAl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2RtYSA9IHVzYmhpZC0+Y3RybGJ1Zl9kbWE7CiAJdXNiaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7CiAKLQl1c2JoaWRfaW5pdF9yZXBvcnRzKGhpZCk7CisJaWYgKCEoaGlkLT5xdWlya3MgJiBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTKSkKKwkJdXNiaGlkX2luaXRfcmVwb3J0cyhoaWQpOwogCiAJc2V0X2JpdChISURfU1RBUlRFRCwgJnVzYmhpZC0+aW9mbCk7CiAKQEAgLTEzOTUsOCArMTM5NCw3IEBACiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZoaWRfZHJpdmVyKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIHVzYl9yZWdpc3Rlcl9mYWlsOwotCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBEUklWRVJfVkVSU0lPTiAiOiIKLQkJCURSSVZFUl9ERVNDICJcbiIpOworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBEUklWRVJfREVTQyAiXG4iKTsKIAogCXJldHVybiAwOwogdXNiX3JlZ2lzdGVyX2ZhaWw6CkBAIC0xNDIzLDYgKzE0MjEsOCBAQAogbW9kdWxlX2luaXQoaGlkX2luaXQpOwogbW9kdWxlX2V4aXQoaGlkX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0FVVEhPUigiQW5kcmVhcyBHYWwiKTsKK01PRFVMRV9BVVRIT1IoIlZvanRlY2ggUGF2bGlrIik7CitNT0RVTEVfQVVUSE9SKCJKaXJpIEtvc2luYSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYwppbmRleCA0ODRlM2VlLi5lNTY1ZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCkBAIC0xMTgxLDEyICsxMTgxLDExIEBACiAJdXNiaGlkX3dhaXRfaW8oaGlkKTsKIAogCWlmIChwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWUpIHsKLQkJaW50IHNpbV9lZmZlY3RzID0gcGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdOwotCQl3aGlsZSAoc2ltX2VmZmVjdHMgPCAyKSB7CisJCXdoaWxlIChwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWVbMF0gPCAyKSB7CiAJCQlpZiAoaSsrID4gMjApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWQtcGlkZmY6IGRldmljZSByZXBvcnRzICIKIAkJCQkgICAgICAgIiVkIHNpbXVsdGFuZW91cyBlZmZlY3RzXG4iLAotCQkJCSAgICAgICBzaW1fZWZmZWN0cyk7CisJCQkJICAgICAgIHBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZVswXSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZWJ1ZygicGlkX3Bvb2wgcmVxdWVzdGVkIGFnYWluIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCAwZDkwNDVhLi4zODc3M2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0ZJR0hUSU5HLCBISURfUVVJUktfQkFEUEFEIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX05BVFNVLCBVU0JfREVWSUNFX0lEX05BVFNVX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAl7IFVTQl9WRU5ET1JfSURfTkVDLCBVU0JfREVWSUNFX0lEX05FQ19VU0JfR0FNRV9QQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKKwl7IFVTQl9WRU5ET1JfSURfTkVYVFdJTkRPVywgVVNCX0RFVklDRV9JRF9ORVhUV0lORE9XX1RPVUNIU0NSRUVOLCBISURfUVVJUktfTVVMVElfSU5QVVR9LAogCXsgVVNCX1ZFTkRPUl9JRF9TQUlURUssIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JVTUJMRVBBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9UT1BNQVgsIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAKQEAgLTUzLDYgKzU0LDcgQEAKIAl7IFVTQl9WRU5ET1JfSURfQ0gsIFVTQl9ERVZJQ0VfSURfQ0hfQ09NQkFUU1RJQ0ssIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DSCwgVVNCX0RFVklDRV9JRF9DSF9GTElHSFRfU0lNX1lPS0UsIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DSCwgVVNCX0RFVklDRV9JRF9DSF9QUk9fUEVEQUxTLCBISURfUVVJUktfTk9HRVQgfSwKKwl7IFVTQl9WRU5ET1JfSURfQ0gsIFVTQl9ERVZJQ0VfSURfQ0hfM0FYSVNfNUJVVFRPTl9TVElDSywgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX0RNSSwgVVNCX0RFVklDRV9JRF9ETUlfRU5DLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfRUxPLCBVU0JfREVWSUNFX0lEX0VMT19UUzI3MDAsIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9TVU4sIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFLCBISURfUVVJUktfTk9HRVQgfSwKQEAgLTI4MCw3ICsyODIsNyBAQAogCWlmIChpZFZlbmRvciA9PSBVU0JfVkVORE9SX0lEX05DUiAmJgogCQkJaWRQcm9kdWN0ID49IFVTQl9ERVZJQ0VfSURfTkNSX0ZJUlNUICYmCiAJCQlpZFByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9OQ1JfTEFTVCkKLQkJCXJldHVybiBISURfUVVJUktfTk9HRVQ7CisJCQlyZXR1cm4gSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUzsKIAogCWRvd25fcmVhZCgmZHF1aXJrc19yd3NlbSk7CiAJYmxfZW50cnkgPSB1c2JoaWRfZXhpc3RzX2RxdWlyayhpZFZlbmRvciwgaWRQcm9kdWN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwppbmRleCA4YjZlZTI0Li44NjdlMDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCkBAIC00NTAsNyArNDUwLDYgQEAKIAl1cmVmX211bHRpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhpZGRldl91c2FnZV9yZWZfbXVsdGkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyZWZfbXVsdGkpCiAJCXJldHVybiAtRU5PTUVNOwotCWxvY2tfa2VybmVsKCk7CiAJdXJlZiA9ICZ1cmVmX211bHRpLT51cmVmOwogCWlmIChjbWQgPT0gSElESU9DR1VTQUdFUyB8fCBjbWQgPT0gSElESU9DU1VTQUdFUykgewogCQlpZiAoY29weV9mcm9tX3VzZXIodXJlZl9tdWx0aSwgdXNlcl9hcmcsCkBAIC01MjgsNyArNTI3LDYgQEAKIAogCQljYXNlIEhJRElPQ0dDT0xMRUNUSU9OSU5ERVg6CiAJCQlpID0gZmllbGQtPnVzYWdlW3VyZWYtPnVzYWdlX2luZGV4XS5jb2xsZWN0aW9uX2luZGV4OwotCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJa2ZyZWUodXJlZl9tdWx0aSk7CiAJCQlyZXR1cm4gaTsKIAkJY2FzZSBISURJT0NHVVNBR0VTOgpAQCAtNTQ3LDE1ICs1NDUsMTIgQEAKIAkJfQogCiBnb29kcmV0dXJuOgotCQl1bmxvY2tfa2VybmVsKCk7CiAJCWtmcmVlKHVyZWZfbXVsdGkpOwogCQlyZXR1cm4gMDsKIGZhdWx0OgotCQl1bmxvY2tfa2VybmVsKCk7CiAJCWtmcmVlKHVyZWZfbXVsdGkpOwogCQlyZXR1cm4gLUVGQVVMVDsKIGludmFsOgotCQl1bmxvY2tfa2VybmVsKCk7CiAJCWtmcmVlKHVyZWZfbXVsdGkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKaW5kZXggYjM0MjkyNi4uZjg0MzQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYwpAQCAtMjY2LDcgKzI2Niw3IEBACiAJCQkgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCiAJdXNiX21ha2VfcGF0aChkZXYsIGtiZC0+cGh5cywgc2l6ZW9mKGtiZC0+cGh5cykpOwotCXN0cmxjcHkoa2JkLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihrYmQtPnBoeXMpKTsKKwlzdHJsY2F0KGtiZC0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2Yoa2JkLT5waHlzKSk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSBrYmQtPm5hbWU7CiAJaW5wdXRfZGV2LT5waHlzID0ga2JkLT5waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IDcwMGU5M2EuLjllNjQwYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTE5MSwyMSArMTkxLDI3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBhZHQ3NDcwLgogCiBjb25maWcgU0VOU09SU19BRFQ3NDczCi0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDc0NzMiCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDc0NzMgKERFUFJFQ0FURUQpIgogCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTRU5TT1JTX0FEVDc0NzUKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCiAJICBBRFQ3NDczIHRlbXBlcmF0dXJlIG1vbml0b3JpbmcgY2hpcHMuCiAKKwkgIFRoaXMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQsIHlvdSBzaG91bGQgdXNlIHRoZSBhZHQ3NDc1IGRyaXZlcgorCSAgaW5zdGVhZC4KKwogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBhZHQ3NDczLgogCiBjb25maWcgU0VOU09SU19BRFQ3NDc1Ci0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDc0NzUiCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDc0NzMsIEFEVDc0NzUsIEFEVDc0NzYgYW5kIEFEVDc0OTAiCiAJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQW5hbG9nIERldmljZXMKLQkgIEFEVDc0NzUgaGFyZHdhcmUgbW9uaXRvcmluZyBjaGlwcy4KKwkgIEFEVDc0NzMsIEFEVDc0NzUsIEFEVDc0NzYgYW5kIEFEVDc0OTAgaGFyZHdhcmUgbW9uaXRvcmluZworCSAgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxkIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGFkdDc0NzUuCkBAIC0zMDUsMTIgKzMxMSwxMiBAQAogCSAgd2lsbCBiZSBjYWxsZWQgZjcxODA1Zi4KIAogY29uZmlnIFNFTlNPUlNfRjcxODgyRkcKLQl0cmlzdGF0ZSAiRmludGVrIEY3MTg1OEZHLCBGNzE4NjJGRywgRjcxODgyRkcgYW5kIEY4MDAwIgorCXRyaXN0YXRlICJGaW50ZWsgRjcxODU4RkcsIEY3MTg2MkZHLCBGNzE4ODJGRywgRjcxODg5RkcgYW5kIEY4MDAwIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGZlYXR1cmVzIG9mIHRoZSBGaW50ZWsgRjcxODU4RkcsIEY3MTg2MkZHLzcxODYzRkcsIEY3MTg4MkZHL0Y3MTg4M0ZHCi0JICBhbmQgRjgwMDAgU3VwZXItSS9PIGNoaXBzLgorCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4NThGRywgRjcxODYyRkcvNzE4NjNGRywgRjcxODgyRkcvRjcxODgzRkcsCisJICBGNzE4ODlGRyBhbmQgRjgwMDAgU3VwZXItSS9PIGNoaXBzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBmNzE4ODJmZy4KQEAgLTQ0Miw2ICs0NDgsMTUgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtNzAuCiAKK2NvbmZpZyBTRU5TT1JTX0xNNzMKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTczIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MworCSAgc2Vuc29yIGNoaXBzLgorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG03My4KKwogY29uZmlnIFNFTlNPUlNfTE03NQogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzUgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCkBAIC04NDEsNyArODU2LDcgQEAKIAogY29uZmlnIFNFTlNPUlNfVzgzNzkxRAogCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc5MUQiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJMkMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc5MUQgY2hpcC4KQEAgLTEwMDgsNiArMTAyMywxMiBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBhcHBsaWNhYmxlIGxhcHRvcCBhbmQgd2FudCB0byBleHBlcmllbmNlCiAJICB0aGUgYXdlc29tZSBwb3dlciBvZiBhcHBsZXNtYy4KIAorY29uZmlnIFNFTlNPUlNfTUMxMzc4M19BREMKKyAgICAgICAgdHJpc3RhdGUgIkZyZWVzY2FsZSBNQzEzNzgzIEFEQyIKKyAgICAgICAgZGVwZW5kcyBvbiBNRkRfTUMxMzc4MworICAgICAgICBoZWxwCisgICAgICAgICAgU3VwcG9ydCBmb3IgdGhlIEEvRCBjb252ZXJ0ZXIgb24gTUMxMzc4MyBQTUlDLgorCiBpZiBBQ1BJCiAKIGNvbW1lbnQgIkFDUEkgZHJpdmVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDlmNDZjYjAuLjMzYzJlZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtNTcsNiArNTcsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTElTM19TUEkpCSs9IGxpczNsdjAyZC5vIGxpczNsdjAyZF9zcGkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE02MykJKz0gbG02My5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTcwKQkrPSBsbTcwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNzMpCSs9IGxtNzMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NSkJKz0gbG03NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTc3KQkrPSBsbTc3Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNNzgpCSs9IGxtNzgubwpAQCAtNzMsNiArNzQsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTExMSkJKz0gbWF4MTExMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjE5KQkrPSBtYXgxNjE5Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDY2NTApCSs9IG1heDY2NTAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUMxMzc4M19BREMpKz0gbWMxMzc4My1hZGMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUEM4NzM2MCkJKz0gcGM4NzM2MC5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQzg3NDI3KQkrPSBwYzg3NDI3Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1OTEpCSs9IHBjZjg1OTEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDIxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwppbmRleCBhZmM1OTQzLi4zM2FjZjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwpAQCAtMjg4LDkgKzI4OCw4IEBACiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7Ci0JaW50IGk7Ci0JY29uc3QgY2hhciAqdHlwZV9uYW1lID0gIiI7Ci0JaW50IGNvbnZfcmF0ZSwgc3RhdHVzLCBjb25maWc7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lOworCWludCBjb252X3JhdGUsIHN0YXR1cywgY29uZmlnLCBtYW5faWQsIGRldl9pZDsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewogCQlwcl9kZWJ1ZygiYWRtMTAyMTogZGV0ZWN0IGZhaWxlZCwgIgpAQCAtMzAzLDYyICszMDIsMzcgQEAKIAkJCQkJICAgICBBRE0xMDIxX1JFR19DT05WX1JBVEVfUik7CiAJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyMV9SRUdfQ09ORklHX1IpOwogCi0JLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KLQlpZiAoa2luZCA8IDApIHsKLQkJaWYgKChzdGF0dXMgJiAweDAzKSAhPSAweDAwIHx8IChjb25maWcgJiAweDNGKSAhPSAweDAwCi0JCSAgICB8fCAoY29udl9yYXRlICYgMHhGOCkgIT0gMHgwMCkgewotCQkJcHJfZGVidWcoImFkbTEwMjE6IGRldGVjdCBmYWlsZWQsICIKLQkJCQkgImNoaXAgbm90IGRldGVjdGVkIVxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQorCS8qIENoZWNrIHVudXNlZCBiaXRzICovCisJaWYgKChzdGF0dXMgJiAweDAzKSB8fCAoY29uZmlnICYgMHgzRikgfHwgKGNvbnZfcmF0ZSAmIDB4RjgpKSB7CisJCXByX2RlYnVnKCJhZG0xMDIxOiBkZXRlY3QgZmFpbGVkLCBjaGlwIG5vdCBkZXRlY3RlZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KLQlpZiAoa2luZCA8PSAwKSB7Ci0JCWkgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDIxX1JFR19NQU5fSUQpOwotCQlpZiAoaSA9PSAweDQxKQotCQkJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQlBRE0xMDIxX1JFR19ERVZfSUQpICYgMHhGMCkgPT0gMHgzMCkKLQkJCQlraW5kID0gYWRtMTAyMzsKLQkJCWVsc2UKLQkJCQlraW5kID0gYWRtMTAyMTsKLQkJZWxzZSBpZiAoaSA9PSAweDQ5KQotCQkJa2luZCA9IHRobWMxMDsKLQkJZWxzZSBpZiAoaSA9PSAweDIzKQotCQkJa2luZCA9IGdsNTIzc207Ci0JCWVsc2UgaWYgKChpID09IDB4NGQpICYmCi0JCQkgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgICBBRE0xMDIxX1JFR19ERVZfSUQpID09IDB4MDEpKQotCQkJa2luZCA9IG1heDE2MTdhOwotCQllbHNlIGlmIChpID09IDB4NTQpCi0JCQlraW5kID0gbWMxMDY2OwotCQkvKiBMTTg0IE1mciBJRCBpbiBhIGRpZmZlcmVudCBwbGFjZSwgYW5kIGl0IGhhcyBtb3JlIHVudXNlZCBiaXRzICovCi0JCWVsc2UgaWYgKGNvbnZfcmF0ZSA9PSAweDAwCi0JCQkgJiYgKGtpbmQgPT0gMCAvKiBza2lwIGV4dHJhIGRldGVjdGlvbiAqLwotCQkJICAgICB8fCAoKGNvbmZpZyAmIDB4N0YpID09IDB4MDAKLQkJCQkgJiYgKHN0YXR1cyAmIDB4QUIpID09IDB4MDApKSkKLQkJCWtpbmQgPSBsbTg0OwotCQllbHNlCi0JCQlraW5kID0gbWF4MTYxNzsKLQl9CisJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyMV9SRUdfTUFOX0lEKTsKKwlkZXZfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDIxX1JFR19ERVZfSUQpOwogCi0JaWYgKGtpbmQgPT0gbWF4MTYxNykgewotCQl0eXBlX25hbWUgPSAibWF4MTYxNyI7Ci0JfSBlbHNlIGlmIChraW5kID09IG1heDE2MTdhKSB7CisJaWYgKG1hbl9pZCA9PSAweDRkICYmIGRldl9pZCA9PSAweDAxKQogCQl0eXBlX25hbWUgPSAibWF4MTYxN2EiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBhZG0xMDIxKSB7Ci0JCXR5cGVfbmFtZSA9ICJhZG0xMDIxIjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gYWRtMTAyMykgewotCQl0eXBlX25hbWUgPSAiYWRtMTAyMyI7Ci0JfSBlbHNlIGlmIChraW5kID09IHRobWMxMCkgeworCWVsc2UgaWYgKG1hbl9pZCA9PSAweDQxKSB7CisJCWlmICgoZGV2X2lkICYgMHhGMCkgPT0gMHgzMCkKKwkJCXR5cGVfbmFtZSA9ICJhZG0xMDIzIjsKKwkJZWxzZQorCQkJdHlwZV9uYW1lID0gImFkbTEwMjEiOworCX0gZWxzZSBpZiAobWFuX2lkID09IDB4NDkpCiAJCXR5cGVfbmFtZSA9ICJ0aG1jMTAiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBsbTg0KSB7Ci0JCXR5cGVfbmFtZSA9ICJsbTg0IjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gZ2w1MjNzbSkgeworCWVsc2UgaWYgKG1hbl9pZCA9PSAweDIzKQogCQl0eXBlX25hbWUgPSAiZ2w1MjNzbSI7Ci0JfSBlbHNlIGlmIChraW5kID09IG1jMTA2NikgeworCWVsc2UgaWYgKG1hbl9pZCA9PSAweDU0KQogCQl0eXBlX25hbWUgPSAibWMxMDY2IjsKLQl9CisJLyogTE04NCBNZnIgSUQgaW4gYSBkaWZmZXJlbnQgcGxhY2UsIGFuZCBpdCBoYXMgbW9yZSB1bnVzZWQgYml0cyAqLworCWVsc2UgaWYgKGNvbnZfcmF0ZSA9PSAweDAwCisJCSAmJiAoY29uZmlnICYgMHg3RikgPT0gMHgwMAorCQkgJiYgKHN0YXR1cyAmIDB4QUIpID09IDB4MDApCisJCXR5cGVfbmFtZSA9ICJsbTg0IjsKKwllbHNlCisJCXR5cGVfbmFtZSA9ICJtYXgxNjE3IjsKKwogCXByX2RlYnVnKCJhZG0xMDIxOiBEZXRlY3RlZCBjaGlwICVzIGF0IGFkYXB0ZXIgJWQsIGFkZHJlc3MgMHglMDJ4LlxuIiwKIAkJIHR5cGVfbmFtZSwgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGNsaWVudC0+YWRkcik7CiAJc3RybGNweShpbmZvLT50eXBlLCB0eXBlX25hbWUsIEkyQ19OQU1FX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDI1LmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYwppbmRleCA0ZGIwNGQ2Li5kYjZhYzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYwpAQCAtMiw3ICsyLDcgQEAKICAqIGFkbTEwMjUuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCAgICAgICBDaGVuLVl1YW4gV3UgPGd3dUBlc29mdC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAgKgogICogVGhlIEFETTEwMjUgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IEFuYWxvZyBEZXZpY2VzLiBJdCByZXBvcnRzIHVwIHRvIDYKICAqIHZvbHRhZ2VzIChpbmNsdWRpbmcgaXRzIG93biBwb3dlciBzb3VyY2UpIGFuZCB1cCB0byB0d28gdGVtcGVyYXR1cmVzCkBAIC00MTMsNjcgKzQxMywzNCBAQAogCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwotCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKLQl1OCBjb25maWc7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCBtYW5faWQsIGNoaXBfaWQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyoKLQkgKiBOb3cgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEEgbmVnYXRpdmUga2luZCBtZWFucyB0aGF0Ci0JICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UgcGFyYW1ldGVyIChkZWZhdWx0KSwgc28gd2UKLQkgKiBtdXN0IGJvdGggZGV0ZWN0IGFuZCBpZGVudGlmeSB0aGUgY2hpcC4gQSB6ZXJvIGtpbmQgbWVhbnMgdGhhdAotCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIsIHRoZSBkZXRlY3Rpb24KLQkgKiBzdGVwIHNoYWxsIGJlIHNraXBwZWQuIEEgcG9zaXRpdmUga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIKLQkgKiB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciBhbmQgYSBnaXZlbiBraW5kIG9mIGNoaXAgaXMKLQkgKiByZXF1ZXN0ZWQsIHNvIGJvdGggdGhlIGRldGVjdGlvbiBhbmQgdGhlIGlkZW50aWZpY2F0aW9uIHN0ZXBzCi0JICogYXJlIHNraXBwZWQuCi0JICovCi0JY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfQ09ORklHKTsKLQlpZiAoa2luZCA8IDApIHsgLyogZGV0ZWN0aW9uICovCi0JCWlmICgoY29uZmlnICYgMHg4MCkgIT0gMHgwMAotCQkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCSAgICAgQURNMTAyNV9SRUdfU1RBVFVTMSkgJiAweEMwKSAhPSAweDAwCi0JCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJICAgICBBRE0xMDI1X1JFR19TVEFUVVMyKSAmIDB4QkMpICE9IDB4MDApIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKLQkJCQkiQURNMTAyNSBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeC5cbiIsCi0JCQkJY2xpZW50LT5hZGRyKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJLyogQ2hlY2sgZm9yIHVudXNlZCBiaXRzICovCisJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19DT05GSUcpICYgMHg4MCkKKwkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX1NUQVRVUzEpICYgMHhDMCkKKwkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX1NUQVRVUzIpICYgMHhCQykpIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiQURNMTAyNSBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCWNsaWVudC0+YWRkcik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gKi8KLQkJdTggbWFuX2lkLCBjaGlwX2lkOworCS8qIElkZW50aWZpY2F0aW9uICovCisJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX0NISVBfSUQpOworCWlmICgoY2hpcF9pZCAmIDB4RjApICE9IDB4MjApCisJCXJldHVybiAtRU5PREVWOwogCi0JCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX01BTl9JRCk7Ci0JCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19DSElQX0lEKTsKLQotCQlpZiAobWFuX2lkID09IDB4NDEpIHsgLyogQW5hbG9nIERldmljZXMgKi8KLQkJCWlmICgoY2hpcF9pZCAmIDB4RjApID09IDB4MjApIHsgLyogQURNMTAyNS9BRE0xMDI1QSAqLwotCQkJCWtpbmQgPSBhZG0xMDI1OwotCQkJfQotCQl9IGVsc2UKLQkJaWYgKG1hbl9pZCA9PSAweEExKSB7IC8qIFBoaWxpcHMgKi8KLQkJCWlmIChjbGllbnQtPmFkZHIgIT0gMHgyRQotCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHgyMCkgeyAvKiBORTE2MTkgKi8KLQkJCQlraW5kID0gbmUxNjE5OwotCQkJfQotCQl9Ci0KLQkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KLQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCi0JCQkgICAgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwMlgsICIKLQkJCSAgICAiY2hpcF9pZD0weCUwMlgpLlxuIiwgbWFuX2lkLCBjaGlwX2lkKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaWYgKGtpbmQgPT0gYWRtMTAyNSkgeworCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX01BTl9JRCk7CisJaWYgKG1hbl9pZCA9PSAweDQxKQogCQluYW1lID0gImFkbTEwMjUiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBuZTE2MTkpIHsKKwllbHNlIGlmIChtYW5faWQgPT0gMHhBMSAmJiBjbGllbnQtPmFkZHIgIT0gMHgyRSkKIAkJbmFtZSA9ICJuZTE2MTkiOwotCX0KKwllbHNlCisJCXJldHVybiAtRU5PREVWOworCiAJc3RybGNweShpbmZvLT50eXBlLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDI2LmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjYuYwppbmRleCBmZjdkZTQwLi5mYjUzNjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjYuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjYuYwpAQCAtMTY3MiwzNSArMTY3MiwyNiBAQAogCQlpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIsCiAJCWNvbXBhbnksIHZlcnN0ZXApOwogCi0JLyogSWYgYXV0by1kZXRlY3RpbmcsIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLwotCWlmIChraW5kIDw9IDApIHsKLQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiQXV0b2RldGVjdGluZyBkZXZpY2UgYXQgJWQsMHglMDJ4ICIKLQkJCSIuLi5cbiIsIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKLQkJaWYgKGNvbXBhbnkgPT0gQURNMTAyNl9DT01QQU5ZX0FOQUxPR19ERVYKLQkJICAgICYmIHZlcnN0ZXAgPT0gQURNMTAyNl9WRVJTVEVQX0FETTEwMjYpIHsKLQkJCWtpbmQgPSBhZG0xMDI2OwotCQl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gQURNMTAyNl9DT01QQU5ZX0FOQUxPR19ERVYKLQkJCSYmICh2ZXJzdGVwICYgMHhmMCkgPT0gQURNMTAyNl9WRVJTVEVQX0dFTkVSSUMpIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIlVucmVjb2duaXplZCBzdGVwcGluZyAiCi0JCQkJIjB4JTAyeC4gRGVmYXVsdGluZyB0byBBRE0xMDI2LlxuIiwgdmVyc3RlcCk7Ci0JCQlraW5kID0gYWRtMTAyNjsKLQkJfSBlbHNlIGlmICgodmVyc3RlcCAmIDB4ZjApID09IEFETTEwMjZfVkVSU1RFUF9HRU5FUklDKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJGb3VuZCB2ZXJzaW9uL3N0ZXBwaW5nICIKLQkJCQkiMHglMDJ4LiBBc3N1bWluZyBnZW5lcmljIEFETTEwMjYuXG4iLAotCQkJCXZlcnN0ZXApOwotCQkJa2luZCA9IGFueV9jaGlwOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiQXV0b2RldGVjdGlvbiBmYWlsZWRcbiIpOwotCQkJLyogTm90IGFuIEFETTEwMjYgLi4uICovCi0JCQlpZiAoa2luZCA9PSAwKSB7IC8qIFVzZXIgdXNlZCBmb3JjZT14LHkgKi8KLQkJCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJHZW5lcmljIEFETTEwMjYgbm90ICIKLQkJCQkJImZvdW5kIGF0ICVkLDB4JTAyeC4gIFRyeSAiCi0JCQkJCSJmb3JjZV9hZG0xMDI2LlxuIiwKLQkJCQkJaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGFkZHJlc3MpOwotCQkJfQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KKwlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJBdXRvZGV0ZWN0aW5nIGRldmljZSBhdCAlZCwweCUwMnguLi5cbiIsCisJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKKwlpZiAoY29tcGFueSA9PSBBRE0xMDI2X0NPTVBBTllfQU5BTE9HX0RFVgorCSAgICAmJiB2ZXJzdGVwID09IEFETTEwMjZfVkVSU1RFUF9BRE0xMDI2KSB7CisJCS8qIEFuYWxvZyBEZXZpY2VzIEFETTEwMjYgKi8KKwl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gQURNMTAyNl9DT01QQU5ZX0FOQUxPR19ERVYKKwkJJiYgKHZlcnN0ZXAgJiAweGYwKSA9PSBBRE0xMDI2X1ZFUlNURVBfR0VORVJJQykgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJVbnJlY29nbml6ZWQgc3RlcHBpbmcgIgorCQkJIjB4JTAyeC4gRGVmYXVsdGluZyB0byBBRE0xMDI2LlxuIiwgdmVyc3RlcCk7CisJfSBlbHNlIGlmICgodmVyc3RlcCAmIDB4ZjApID09IEFETTEwMjZfVkVSU1RFUF9HRU5FUklDKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIkZvdW5kIHZlcnNpb24vc3RlcHBpbmcgIgorCQkJIjB4JTAyeC4gQXNzdW1pbmcgZ2VuZXJpYyBBRE0xMDI2LlxuIiwKKwkJCXZlcnN0ZXApOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkF1dG9kZXRlY3Rpb24gZmFpbGVkXG4iKTsKKwkJLyogTm90IGFuIEFETTEwMjYuLi4gKi8KKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCiAJc3RybGNweShpbmZvLT50eXBlLCAiYWRtMTAyNiIsIEkyQ19OQU1FX1NJWkUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjkuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyOS5jCmluZGV4IDM2NzE4MTUuLmVmOTFlMmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjkuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjkuYwpAQCAtMzAxLDU5ICszMDEsMzYgQEAKIAkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwl1OCBtYW5faWQsIGNoaXBfaWQsIHRlbXBfZGV2aWNlc19pbnN0YWxsZWQsIG5iX2Zhbl9zdXBwb3J0OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIE5vdyB3ZSBkbyB0aGUgZGV0ZWN0aW9uIGFuZCBpZGVudGlmaWNhdGlvbi4gQSBuZWdhdGl2ZSBraW5kCi0JICogbWVhbnMgdGhhdCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIKLQkgKiAoZGVmYXVsdCksIHNvIHdlIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwCi0JICogKGFjdHVhbGx5IHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIGtpbmQgb2YgY2hpcCBmb3Igbm93LCBhZG0xMDI5KS4KLQkgKiBBIHplcm8ga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZQotCSAqIHBhcmFtZXRlciwgdGhlIGRldGVjdGlvbiBzdGVwIHNoYWxsIGJlIHNraXBwZWQuIEEgcG9zaXRpdmUga2luZAotCSAqIG1lYW5zIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciBhbmQgYQotCSAqIGdpdmVuIGtpbmQgb2YgY2hpcCBpcyByZXF1ZXN0ZWQsIHNvIGJvdGggdGhlIGRldGVjdGlvbiBhbmQgdGhlCi0JICogaWRlbnRpZmljYXRpb24gc3RlcHMgYXJlIHNraXBwZWQuICovCi0KLQkvKiBEZWZhdWx0IHRvIGFuIGFkbTEwMjkgaWYgZm9yY2VkICovCi0JaWYgKGtpbmQgPT0gMCkKLQkJa2luZCA9IGFkbTEwMjk7Ci0KIAkvKiBBRE0xMDI5IGRvZXNuJ3QgaGF2ZSBDSElQIElELCBjaGVjayBqdXN0IE1BTiBJRAogCSAqIEZvciBiZXR0ZXIgZGV0ZWN0aW9uIHdlIGNoZWNrIGFsc28gQURNMTAyOV9URU1QX0RFVklDRVNfSU5TVEFMTEVELAogCSAqIEFETTEwMjlfUkVHX05CX0ZBTl9TVVBQT1JUIGFuZCBjb21wYXJlIGl0IHdpdGggcG9zc2libGUgdmFsdWVzCiAJICogZG9jdW1lbnRlZAogCSAqLwogCi0JaWYgKGtpbmQgPD0gMCkgewkvKiBpZGVudGlmaWNhdGlvbiAqLwotCQl1OCBtYW5faWQsIGNoaXBfaWQsIHRlbXBfZGV2aWNlc19pbnN0YWxsZWQsIG5iX2Zhbl9zdXBwb3J0OwotCi0JCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjlfUkVHX01BTl9JRCk7Ci0JCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI5X1JFR19DSElQX0lEKTsKLQkJdGVtcF9kZXZpY2VzX2luc3RhbGxlZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyOV9SRUdfTUFOX0lEKTsKKwljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyOV9SRUdfQ0hJUF9JRCk7CisJdGVtcF9kZXZpY2VzX2luc3RhbGxlZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCUFETTEwMjlfUkVHX1RFTVBfREVWSUNFU19JTlNUQUxMRUQpOwotCQluYl9mYW5fc3VwcG9ydCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJbmJfZmFuX3N1cHBvcnQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAogCQkJCQkJQURNMTAyOV9SRUdfTkJfRkFOX1NVUFBPUlQpOwotCQkvKiAweDQxIGlzIEFuYWxvZyBEZXZpY2VzICovCi0JCWlmIChtYW5faWQgPT0gMHg0MSAmJiAodGVtcF9kZXZpY2VzX2luc3RhbGxlZCAmIDB4ZjkpID09IDB4MDEKLQkJICAgICYmIG5iX2Zhbl9zdXBwb3J0ID09IDB4MDMpIHsKLQkJCWlmICgoY2hpcF9pZCAmIDB4RjApID09IDB4MDApIHsKLQkJCQlraW5kID0gYWRtMTAyOTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogVGhlcmUgYXJlIG5vICJvZmZpY2lhbCIgQ0hJUCBJRCwgc28gYWN0dWFsbHkKLQkJCQkgKiB3ZSB1c2UgTWFqb3IvTWlub3IgcmV2aXNpb24gZm9yIHRoYXQgKi8KLQkJCQlwcmludGsoS0VSTl9JTkZPCi0JCQkJICAgICAgICJhZG0xMDI5OiBVbmtub3duIG1ham9yIHJldmlzaW9uICV4LCAiCi0JCQkJICAgICAgICJwbGVhc2UgbGV0IHVzIGtub3dcbiIsIGNoaXBfaWQpOwotCQkJfQotCQl9CisJLyogMHg0MSBpcyBBbmFsb2cgRGV2aWNlcyAqLworCWlmIChtYW5faWQgIT0gMHg0MSB8fCAodGVtcF9kZXZpY2VzX2luc3RhbGxlZCAmIDB4ZjkpICE9IDB4MDEKKwkgICAgfHwgbmJfZmFuX3N1cHBvcnQgIT0gMHgwMykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJaWYgKGtpbmQgPD0gMCkgewkvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KLQkJCXByX2RlYnVnKCJhZG0xMDI5OiBVbnN1cHBvcnRlZCBjaGlwIChtYW5faWQ9MHglMDJYLCAiCi0JCQkJICJjaGlwX2lkPTB4JTAyWClcbiIsIG1hbl9pZCwgY2hpcF9pZCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQorCWlmICgoY2hpcF9pZCAmIDB4RjApICE9IDB4MDApIHsKKwkJLyogVGhlcmUgYXJlIG5vICJvZmZpY2lhbCIgQ0hJUCBJRCwgc28gYWN0dWFsbHkKKwkJICogd2UgdXNlIE1ham9yL01pbm9yIHJldmlzaW9uIGZvciB0aGF0ICovCisJCXByX2luZm8oImFkbTEwMjk6IFVua25vd24gbWFqb3IgcmV2aXNpb24gJXgsICIKKwkJCSJwbGVhc2UgbGV0IHVzIGtub3dcbiIsIGNoaXBfaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisKIAlzdHJsY3B5KGluZm8tPnR5cGUsICJhZG0xMDI5IiwgSTJDX05BTUVfU0laRSk7CiAKIAlyZXR1cm4gMDsKQEAgLTQzMiw3ICs0MDksNyBAQAogfQogCiAvKgotZnVuY3Rpb24gdGhhdCB1cGRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgY2hpcHMgKHRlbXBlcmF0dXJlIGZvciBleGVtcGxlKQorZnVuY3Rpb24gdGhhdCB1cGRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgY2hpcHMgKHRlbXBlcmF0dXJlIGZvciBleGFtcGxlKQogKi8KIHN0YXRpYyBzdHJ1Y3QgYWRtMTAyOV9kYXRhICphZG0xMDI5X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDMxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwppbmRleCA1NjkwNTk1Li4wZTcyMjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwpAQCAtODE3LDMxICs4MTcsMTkgQEAKIAkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKLQljb25zdCBjaGFyICpuYW1lID0gIiI7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgaWQsIGNvOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChraW5kIDwgMCkgewotCQlpbnQgaWQsIGNvOwotCQlpZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIDB4M2QpOwotCQljbyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIDB4M2UpOworCWlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgMHgzZCk7CisJY28gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAweDNlKTsKIAotCQlpZiAoISgoaWQgPT0gMHgzMSB8fCBpZCA9PSAweDMwKSAmJiBjbyA9PSAweDQxKSkKLQkJCXJldHVybiAtRU5PREVWOwotCQlraW5kID0gKGlkID09IDB4MzApID8gYWRtMTAzMCA6IGFkbTEwMzE7Ci0JfQorCWlmICghKChpZCA9PSAweDMxIHx8IGlkID09IDB4MzApICYmIGNvID09IDB4NDEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwluYW1lID0gKGlkID09IDB4MzApID8gImFkbTEwMzAiIDogImFkbTEwMzEiOwogCi0JaWYgKGtpbmQgPD0gMCkKLQkJa2luZCA9IGFkbTEwMzE7Ci0KLQkvKiBHaXZlbiB0aGUgZGV0ZWN0ZWQgY2hpcCB0eXBlLCBzZXQgdGhlIGNoaXAgbmFtZSBhbmQgdGhlCi0JICogYXV0byBmYW4gY29udHJvbCBoZWxwZXIgdGFibGUuICovCi0JaWYgKGtpbmQgPT0gYWRtMTAzMCkgewotCQluYW1lID0gImFkbTEwMzAiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBhZG0xMDMxKSB7Ci0JCW5hbWUgPSAiYWRtMTAzMSI7Ci0JfQogCXN0cmxjcHkoaW5mby0+dHlwZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRtOTI0MC5jIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKaW5kZXggMjQ0NGIxNS4uMjBlMDQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZG05MjQwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKQEAgLTU1Niw1MSArNTU2LDM0IEBACiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChraW5kID09IDApIHsKLQkJa2luZCA9IGFkbTkyNDA7CisJLyogdmVyaWZ5IGNoaXA6IHJlZyBhZGRyZXNzIHNob3VsZCBtYXRjaCBpMmMgYWRkcmVzcyAqLworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgQURNOTI0MF9SRUdfSTJDX0FERFIpCisJCQkhPSBhZGRyZXNzKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImRldGVjdCBmYWlsOiBhZGRyZXNzIG1hdGNoLCAweCUwMnhcbiIsCisJCQlhZGRyZXNzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKGtpbmQgPCAwKSB7Ci0KLQkJLyogdmVyaWZ5IGNoaXA6IHJlZyBhZGRyZXNzIHNob3VsZCBtYXRjaCBpMmMgYWRkcmVzcyAqLwotCQlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIEFETTkyNDBfUkVHX0kyQ19BRERSKQotCQkJCSE9IGFkZHJlc3MpIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImRldGVjdCBmYWlsOiBhZGRyZXNzIG1hdGNoLCAiCi0JCQkJCSIweCUwMnhcbiIsIGFkZHJlc3MpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKiBjaGVjayBrbm93biBjaGlwIG1hbnVmYWN0dXJlciAqLwotCQltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQlBRE05MjQwX1JFR19NQU5fSUQpOwotCQlpZiAobWFuX2lkID09IDB4MjMpIHsKLQkJCWtpbmQgPSBhZG05MjQwOwotCQl9IGVsc2UgaWYgKG1hbl9pZCA9PSAweGRhKSB7Ci0JCQlraW5kID0gZHMxNzgwOwotCQl9IGVsc2UgaWYgKG1hbl9pZCA9PSAweDAxKSB7Ci0JCQlraW5kID0gbG04MTsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImRldGVjdCBmYWlsOiB1bmtub3duIG1hbnVmLCAiCi0JCQkJCSIweCUwMnhcbiIsIG1hbl9pZCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCS8qIHN1Y2Nlc3NmdWwgZGV0ZWN0LCBwcmludCBjaGlwIGluZm8gKi8KLQkJZGllX3JldiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCUFETTkyNDBfUkVHX0RJRV9SRVYpOwotCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAiZm91bmQgJXMgcmV2aXNpb24gJXVcbiIsCi0JCQkJbWFuX2lkID09IDB4MjMgPyAiQURNOTI0MCIgOgotCQkJCW1hbl9pZCA9PSAweGRhID8gIkRTMTc4MCIgOiAiTE04MSIsIGRpZV9yZXYpOwotCX0KLQotCS8qIGVpdGhlciBmb3JjZWQgb3IgZGV0ZWN0ZWQgY2hpcCBraW5kICovCi0JaWYgKGtpbmQgPT0gYWRtOTI0MCkgeworCS8qIGNoZWNrIGtub3duIGNoaXAgbWFudWZhY3R1cmVyICovCisJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIEFETTkyNDBfUkVHX01BTl9JRCk7CisJaWYgKG1hbl9pZCA9PSAweDIzKSB7CiAJCW5hbWUgPSAiYWRtOTI0MCI7Ci0JfSBlbHNlIGlmIChraW5kID09IGRzMTc4MCkgeworCX0gZWxzZSBpZiAobWFuX2lkID09IDB4ZGEpIHsKIAkJbmFtZSA9ICJkczE3ODAiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBsbTgxKSB7CisJfSBlbHNlIGlmIChtYW5faWQgPT0gMHgwMSkgewogCQluYW1lID0gImxtODEiOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgImRldGVjdCBmYWlsOiB1bmtub3duIG1hbnVmLCAweCUwMnhcbiIsCisJCQltYW5faWQpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisKKwkvKiBzdWNjZXNzZnVsIGRldGVjdCwgcHJpbnQgY2hpcCBpbmZvICovCisJZGllX3JldiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBBRE05MjQwX1JFR19ESUVfUkVWKTsKKwlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAiZm91bmQgJXMgcmV2aXNpb24gJXVcbiIsCisJCSBtYW5faWQgPT0gMHgyMyA/ICJBRE05MjQwIiA6CisJCSBtYW5faWQgPT0gMHhkYSA/ICJEUzE3ODAiIDogIkxNODEiLCBkaWVfcmV2KTsKKwogCXN0cmxjcHkoaW5mby0+dHlwZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jIGIvZHJpdmVycy9od21vbi9hZHM3ODI4LmMKaW5kZXggNWMzOWI0YS4uNDUxOTc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHM3ODI4LmMKKysrIGIvZHJpdmVycy9od21vbi9hZHM3ODI4LmMKQEAgLTE5MSw2ICsxOTEsNyBAQAogCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCWludCBjaDsKIAogCS8qIENoZWNrIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQgKi8KIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBKSkKQEAgLTIwMiwyMCArMjAzLDE3IEBACiAJLSBSZWFkIGZyb20gdGhlIDggY2hhbm5lbCBhZGRyZXNzZXMKIAktIENoZWNrIHRoZSB0b3AgNCBiaXRzIG9mIGVhY2ggcmVzdWx0IGFyZSBub3Qgc2V0ICgxMiBkYXRhIGJpdHMpCiAJKi8KLQlpZiAoa2luZCA8IDApIHsKLQkJaW50IGNoOwotCQlmb3IgKGNoID0gMDsgY2ggPCBBRFM3ODI4X05DSDsgY2grKykgewotCQkJdTE2IGluX2RhdGE7Ci0JCQl1OCBjbWQgPSBjaGFubmVsX2NtZF9ieXRlKGNoKTsKLQkJCWluX2RhdGEgPSBhZHM3ODI4X3JlYWRfdmFsdWUoY2xpZW50LCBjbWQpOwotCQkJaWYgKGluX2RhdGEgJiAweEYwMDApIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCSIlcyA6IERvZXNuJ3QgbG9vayBsaWtlIGFuIGFkczc4MjggZGV2aWNlXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KKwlmb3IgKGNoID0gMDsgY2ggPCBBRFM3ODI4X05DSDsgY2grKykgeworCQl1MTYgaW5fZGF0YTsKKwkJdTggY21kID0gY2hhbm5lbF9jbWRfYnl0ZShjaCk7CisJCWluX2RhdGEgPSBhZHM3ODI4X3JlYWRfdmFsdWUoY2xpZW50LCBjbWQpOworCQlpZiAoaW5fZGF0YSAmIDB4RjAwMCkgeworCQkJcHJfZGVidWcoIiVzIDogRG9lc24ndCBsb29rIGxpa2UgYW4gYWRzNzgyOCBkZXZpY2VcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQorCiAJc3RybGNweShpbmZvLT50eXBlLCAiYWRzNzgyOCIsIEkyQ19OQU1FX1NJWkUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NjIuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCmluZGV4IDE4NTJmMjcuLmY5Yzk1NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCkBAIC0xOTA2LDI3ICsxOTA2LDIyIEBACiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJaW50IHZlbmRvciwgZGV2aWNlLCByZXZpc2lvbjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoa2luZCA8PSAwKSB7Ci0JCWludCB2ZW5kb3IsIGRldmljZSwgcmV2aXNpb247CisJdmVuZG9yID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ2Ml9SRUdfVkVORE9SKTsKKwlpZiAodmVuZG9yICE9IEFEVDc0NjJfVkVORE9SKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCQl2ZW5kb3IgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDYyX1JFR19WRU5ET1IpOwotCQlpZiAodmVuZG9yICE9IEFEVDc0NjJfVkVORE9SKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJZGV2aWNlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ2Ml9SRUdfREVWSUNFKTsKKwlpZiAoZGV2aWNlICE9IEFEVDc0NjJfREVWSUNFKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlkZXZpY2UgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDYyX1JFR19ERVZJQ0UpOwotCQlpZiAoZGV2aWNlICE9IEFEVDc0NjJfREVWSUNFKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJcmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJICAgIEFEVDc0NjJfUkVHX1JFVklTSU9OKTsKLQkJaWYgKHJldmlzaW9uICE9IEFEVDc0NjJfUkVWSVNJT04pCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UKLQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZGV0ZWN0aW9uIGZvcmNlZFxuIik7CisJcmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDYyX1JFR19SRVZJU0lPTik7CisJaWYgKHJldmlzaW9uICE9IEFEVDc0NjJfUkVWSVNJT04pCisJCXJldHVybiAtRU5PREVWOwogCiAJc3RybGNweShpbmZvLT50eXBlLCAiYWR0NzQ2MiIsIEkyQ19OQU1FX1NJWkUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCmluZGV4IDYzM2UxYTEuLjMyYjE3NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCkBAIC0xMjI5LDI3ICsxMjI5LDIyIEBACiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJaW50IHZlbmRvciwgZGV2aWNlLCByZXZpc2lvbjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoa2luZCA8PSAwKSB7Ci0JCWludCB2ZW5kb3IsIGRldmljZSwgcmV2aXNpb247CisJdmVuZG9yID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfVkVORE9SKTsKKwlpZiAodmVuZG9yICE9IEFEVDc0NzBfVkVORE9SKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCQl2ZW5kb3IgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19WRU5ET1IpOwotCQlpZiAodmVuZG9yICE9IEFEVDc0NzBfVkVORE9SKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJZGV2aWNlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfREVWSUNFKTsKKwlpZiAoZGV2aWNlICE9IEFEVDc0NzBfREVWSUNFKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlkZXZpY2UgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19ERVZJQ0UpOwotCQlpZiAoZGV2aWNlICE9IEFEVDc0NzBfREVWSUNFKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJcmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJICAgIEFEVDc0NzBfUkVHX1JFVklTSU9OKTsKLQkJaWYgKHJldmlzaW9uICE9IEFEVDc0NzBfUkVWSVNJT04pCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UKLQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZGV0ZWN0aW9uIGZvcmNlZFxuIik7CisJcmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19SRVZJU0lPTik7CisJaWYgKHJldmlzaW9uICE9IEFEVDc0NzBfUkVWSVNJT04pCisJCXJldHVybiAtRU5PREVWOwogCiAJc3RybGNweShpbmZvLT50eXBlLCAiYWR0NzQ3MCIsIEkyQ19OQU1FX1NJWkUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3My5jCmluZGV4IDBhNmNlMjMuLmFlYTI0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3My5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3My5jCkBAIC0xNzQsNyArMTc0LDYgQEAKIAl7ICJhZHQ3NDczIiwgYWR0NzQ3MyB9LAogCXsgfQogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHQ3NDczX2lkKTsKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkdDc0NzNfZHJpdmVyID0gewogCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCkBAIC0xMDkwLDI3ICsxMDg5LDIyIEBACiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJaW50IHZlbmRvciwgZGV2aWNlLCByZXZpc2lvbjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoa2luZCA8PSAwKSB7Ci0JCWludCB2ZW5kb3IsIGRldmljZSwgcmV2aXNpb247CisJdmVuZG9yID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3M19SRUdfVkVORE9SKTsKKwlpZiAodmVuZG9yICE9IEFEVDc0NzNfVkVORE9SKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCQl2ZW5kb3IgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDczX1JFR19WRU5ET1IpOwotCQlpZiAodmVuZG9yICE9IEFEVDc0NzNfVkVORE9SKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJZGV2aWNlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3M19SRUdfREVWSUNFKTsKKwlpZiAoZGV2aWNlICE9IEFEVDc0NzNfREVWSUNFKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlkZXZpY2UgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDczX1JFR19ERVZJQ0UpOwotCQlpZiAoZGV2aWNlICE9IEFEVDc0NzNfREVWSUNFKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJcmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJICAgIEFEVDc0NzNfUkVHX1JFVklTSU9OKTsKLQkJaWYgKHJldmlzaW9uICE9IEFEVDc0NzNfUkVWXzY4ICYmIHJldmlzaW9uICE9IEFEVDc0NzNfUkVWXzY5KQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfSBlbHNlCi0JCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImRldGVjdGlvbiBmb3JjZWRcbiIpOworCXJldmlzaW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3M19SRUdfUkVWSVNJT04pOworCWlmIChyZXZpc2lvbiAhPSBBRFQ3NDczX1JFVl82OCAmJiByZXZpc2lvbiAhPSBBRFQ3NDczX1JFVl82OSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzdHJsY3B5KGluZm8tPnR5cGUsICJhZHQ3NDczIiwgSTJDX05BTUVfU0laRSk7CiAKQEAgLTExNzEsNiArMTE2NSw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFkdDc0NzNfaW5pdCh2b2lkKQogeworCXByX25vdGljZSgiVGhlIGFkdDc0NzMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgdGhlIGFkdDc0NzUgIgorCQkgICJkcml2ZXIgaW5zdGVhZFxuIik7CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZHQ3NDczX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3NS5jIGIvZHJpdmVycy9od21vbi9hZHQ3NDc1LmMKaW5kZXggYjVhOTUxOS4uOTlhYmZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHQ3NDc1LmMKKysrIGIvZHJpdmVycy9od21vbi9hZHQ3NDc1LmMKQEAgLTMsNyArMyw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCwgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA4IEpvcmRhbiBDcm91c2UgPGpvcmRhbkBjb3NtaWNwZW5ndWluLm5ldD4KICAqIENvcHlyaWdodCAoQykgMjAwOCBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgotCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKgogICogRGVyaXZlZCBmcm9tIHRoZSBsbTgzIGRyaXZlciBieSBKZWFuIERlbHZhcmUKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTcsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogLyogSW5kZXhlcyBmb3IgdGhlIHN5c2ZzIGhvb2tzICovCkBAIC0zOSw3ICs0MSwxMiBAQAogCiAvKiA3NDc1IENvbW1vbiBSZWdpc3RlcnMgKi8KIAotI2RlZmluZSBSRUdfVk9MVEFHRV9CQVNFCTB4MjEKKyNkZWZpbmUgUkVHX0RFVlJFVjIJCTB4MTIJLyogQURUNzQ5MCBvbmx5ICovCisKKyNkZWZpbmUgUkVHX1ZUVAkJCTB4MUUJLyogQURUNzQ5MCBvbmx5ICovCisjZGVmaW5lIFJFR19FWFRFTkQzCQkweDFGCS8qIEFEVDc0OTAgb25seSAqLworCisjZGVmaW5lIFJFR19WT0xUQUdFX0JBU0UJMHgyMAogI2RlZmluZSBSRUdfVEVNUF9CQVNFCQkweDI1CiAjZGVmaW5lIFJFR19UQUNIX0JBU0UJCTB4MjgKICNkZWZpbmUgUkVHX1BXTV9CQVNFCQkweDMwCkBAIC00NywxMiArNTQsMTUgQEAKIAogI2RlZmluZSBSRUdfREVWSUQJCTB4M0QKICNkZWZpbmUgUkVHX1ZFTkRJRAkJMHgzRQorI2RlZmluZSBSRUdfREVWSUQyCQkweDNGCiAKICNkZWZpbmUgUkVHX1NUQVRVUzEJCTB4NDEKICNkZWZpbmUgUkVHX1NUQVRVUzIJCTB4NDIKIAotI2RlZmluZSBSRUdfVk9MVEFHRV9NSU5fQkFTRQkweDQ2Ci0jZGVmaW5lIFJFR19WT0xUQUdFX01BWF9CQVNFCTB4NDcKKyNkZWZpbmUgUkVHX1ZJRAkJCTB4NDMJLyogQURUNzQ3NiBvbmx5ICovCisKKyNkZWZpbmUgUkVHX1ZPTFRBR0VfTUlOX0JBU0UJMHg0NAorI2RlZmluZSBSRUdfVk9MVEFHRV9NQVhfQkFTRQkweDQ1CiAKICNkZWZpbmUgUkVHX1RFTVBfTUlOX0JBU0UJMHg0RQogI2RlZmluZSBSRUdfVEVNUF9NQVhfQkFTRQkweDRGCkBAIC03MywxNiArODMsMzkgQEAKIAogI2RlZmluZSBSRUdfVEVNUF9PRkZTRVRfQkFTRQkweDcwCiAKKyNkZWZpbmUgUkVHX0NPTkZJRzIJCTB4NzMKKwogI2RlZmluZSBSRUdfRVhURU5EMQkJMHg3NgogI2RlZmluZSBSRUdfRVhURU5EMgkJMHg3NworCisjZGVmaW5lIFJFR19DT05GSUczCQkweDc4CiAjZGVmaW5lIFJFR19DT05GSUc1CQkweDdDCisjZGVmaW5lIFJFR19DT05GSUc0CQkweDdECisKKyNkZWZpbmUgUkVHX1NUQVRVUzQJCTB4ODEJLyogQURUNzQ5MCBvbmx5ICovCisKKyNkZWZpbmUgUkVHX1ZUVF9NSU4JCTB4ODQJLyogQURUNzQ5MCBvbmx5ICovCisjZGVmaW5lIFJFR19WVFRfTUFYCQkweDg2CS8qIEFEVDc0OTAgb25seSAqLworCisjZGVmaW5lIFZJRF9WSURTRUwJCTB4ODAJLyogQURUNzQ3NiBvbmx5ICovCisKKyNkZWZpbmUgQ09ORklHMl9BVFROCQkweDIwCisKKyNkZWZpbmUgQ09ORklHM19TTUJBTEVSVAkweDAxCisjZGVmaW5lIENPTkZJRzNfVEhFUk0JCTB4MDIKKworI2RlZmluZSBDT05GSUc0X1BJTkZVTkMJCTB4MDMKKyNkZWZpbmUgQ09ORklHNF9NQVhEVVRZCQkweDA4CisjZGVmaW5lIENPTkZJRzRfQVRUTl9JTjEwCTB4MzAKKyNkZWZpbmUgQ09ORklHNF9BVFROX0lONDMJMHhDMAogCiAjZGVmaW5lIENPTkZJRzVfVFdPU0NPTVAJMHgwMQogI2RlZmluZSBDT05GSUc1X1RFTVBPRkZTRVQJMHgwMgorI2RlZmluZSBDT05GSUc1X1ZJREdQSU8JCTB4MTAJLyogQURUNzQ3NiBvbmx5ICovCiAKIC8qIEFEVDc0NzUgU2V0dGluZ3MgKi8KIAotI2RlZmluZSBBRFQ3NDc1X1ZPTFRBR0VfQ09VTlQJMgorI2RlZmluZSBBRFQ3NDc1X1ZPTFRBR0VfQ09VTlQJNQkvKiBOb3QgY291bnRpbmcgVnR0ICovCiAjZGVmaW5lIEFEVDc0NzVfVEVNUF9DT1VOVAkzCiAjZGVmaW5lIEFEVDc0NzVfVEFDSF9DT1VOVAk0CiAjZGVmaW5lIEFEVDc0NzVfUFdNX0NPVU5UCTMKQEAgLTExMywxMiArMTQ2LDE1IEBACiAjZGVmaW5lIFRFTVBfT0ZGU0VUX1JFRyhpZHgpIChSRUdfVEVNUF9PRkZTRVRfQkFTRSArIChpZHgpKQogI2RlZmluZSBURU1QX1RSQU5HRV9SRUcoaWR4KSAoUkVHX1RFTVBfVFJBTkdFX0JBU0UgKyAoaWR4KSkKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyZSwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EIH07CiAKLUkyQ19DTElFTlRfSU5TTU9EXzEoYWR0NzQ3NSk7CitJMkNfQ0xJRU5UX0lOU01PRF80KGFkdDc0NzMsIGFkdDc0NzUsIGFkdDc0NzYsIGFkdDc0OTApOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWR0NzQ3NV9pZFtdID0geworCXsgImFkdDc0NzMiLCBhZHQ3NDczIH0sCiAJeyAiYWR0NzQ3NSIsIGFkdDc0NzUgfSwKKwl7ICJhZHQ3NDc2IiwgYWR0NzQ3NiB9LAorCXsgImFkdDc0OTAiLCBhZHQ3NDkwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkdDc0NzVfaWQpOwpAQCAtMTMxLDE1ICsxNjcsMjQgQEAKIAl1bnNpZ25lZCBsb25nIGxpbWl0c191cGRhdGVkOwogCWNoYXIgdmFsaWQ7CiAKKwl1OCBjb25maWc0OwogCXU4IGNvbmZpZzU7Ci0JdTE2IGFsYXJtczsKLQl1MTYgdm9sdGFnZVszXVszXTsKKwl1OCBoYXNfdm9sdGFnZTsKKwl1OCBieXBhc3NfYXR0bjsJCS8qIEJ5cGFzcyB2b2x0YWdlIGF0dGVudWF0b3IgKi8KKwl1OCBoYXNfcHdtMjoxOworCXU4IGhhc19mYW40OjE7CisJdTggaGFzX3ZpZDoxOworCXUzMiBhbGFybXM7CisJdTE2IHZvbHRhZ2VbM11bNl07CiAJdTE2IHRlbXBbN11bM107CiAJdTE2IHRhY2hbMl1bNF07CiAJdTggcHdtWzRdWzNdOwogCXU4IHJhbmdlWzNdOwogCXU4IHB3bWN0bFszXTsKIAl1OCBwd21jaGFuWzNdOworCisJdTggdmlkOworCXU4IHZybTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZHQ3NDc1X2RyaXZlcjsKQEAgLTE5NiwyNiArMjQxLDM1IEBACiAJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDkwMDAwICogNjApIC8gcnBtLCAxLCAweEZGRkYpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByZWcydmNjKHUxNiByZWcpCisvKiBTY2FsaW5nIGZhY3RvcnMgZm9yIHZvbHRhZ2UgaW5wdXRzLCB0YWtlbiBmcm9tIHRoZSBBRFQ3NDkwIGRhdGFzaGVldCAqLworc3RhdGljIGNvbnN0IGludCBhZHQ3NDczX2luX3NjYWxpbmdbQURUNzQ3NV9WT0xUQUdFX0NPVU5UICsgMV1bMl0gPSB7CisJeyA0NSwgOTQgfSwJLyogKzIuNVYgKi8KKwl7IDE3NSwgNTI1IH0sCS8qIFZjY3AgKi8KKwl7IDY4LCA3MSB9LAkvKiBWY2MgKi8KKwl7IDkzLCA0NyB9LAkvKiArNVYgKi8KKwl7IDEyMCwgMjAgfSwJLyogKzEyViAqLworCXsgNDUsIDQ1IH0sCS8qIFZ0dCAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgcmVnMnZvbHQoaW50IGNoYW5uZWwsIHUxNiByZWcsIHU4IGJ5cGFzc19hdHRuKQogewotCXJldHVybiAoNDI5NiAqIHJlZykgLyAxMDAwOworCWNvbnN0IGludCAqciA9IGFkdDc0NzNfaW5fc2NhbGluZ1tjaGFubmVsXTsKKworCWlmIChieXBhc3NfYXR0biAmICgxIDw8IGNoYW5uZWwpKQorCQlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QocmVnICogMjI1MCwgMTAyNCk7CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKHJlZyAqIChyWzBdICsgclsxXSkgKiAyMjUwLCByWzFdICogMTAyNCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlZzJ2Y2NwKHUxNiByZWcpCitzdGF0aWMgaW5saW5lIHUxNiB2b2x0MnJlZyhpbnQgY2hhbm5lbCwgbG9uZyB2b2x0LCB1OCBieXBhc3NfYXR0bikKIHsKLQlyZXR1cm4gKDI5MjkgKiByZWcpIC8gMTAwMDsKLX0KKwljb25zdCBpbnQgKnIgPSBhZHQ3NDczX2luX3NjYWxpbmdbY2hhbm5lbF07CisJbG9uZyByZWc7CiAKLXN0YXRpYyBpbmxpbmUgdTE2IHZjYzJyZWcobG9uZyB2Y2MpCi17Ci0JdmNjID0gU0VOU09SU19MSU1JVCh2Y2MsIDAsIDQzOTYpOwotCXJldHVybiAodmNjICogMTAwMCkgLyA0Mjk2OwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiB2Y2NwMnJlZyhsb25nIHZjYykKLXsKLQl2Y2MgPSBTRU5TT1JTX0xJTUlUKHZjYywgMCwgMjk5OCk7Ci0JcmV0dXJuICh2Y2MgKiAxMDAwKSAvIDI5Mjk7CisJaWYgKGJ5cGFzc19hdHRuICYgKDEgPDwgY2hhbm5lbCkpCisJCXJlZyA9ICh2b2x0ICogMTAyNCkgLyAyMjUwOworCWVsc2UKKwkJcmVnID0gKHZvbHQgKiByWzFdICogMTAyNCkgLyAoKHJbMF0gKyByWzFdKSAqIDIyNTApOworCXJldHVybiBTRU5TT1JTX0xJTUlUKHJlZywgMCwgMTAyMykgJiAoMHhmZiA8PCAyKTsKIH0KIAogc3RhdGljIHUxNiBhZHQ3NDc1X3JlYWRfd29yZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcmVnKQpAQCAtMjcxLDEyICszMjUsMTEgQEAKIAlzd2l0Y2ggKHNhdHRyLT5ucikgewogCWNhc2UgQUxBUk06CiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkJICAgICAgIChkYXRhLT5hbGFybXMgPj4gKHNhdHRyLT5pbmRleCArIDEpKSAmIDEpOworCQkJICAgICAgIChkYXRhLT5hbGFybXMgPj4gc2F0dHItPmluZGV4KSAmIDEpOwogCWRlZmF1bHQ6CiAJCXZhbCA9IGRhdGEtPnZvbHRhZ2Vbc2F0dHItPm5yXVtzYXR0ci0+aW5kZXhdOwogCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJCSAgICAgICBzYXR0ci0+aW5kZXggPT0KLQkJCSAgICAgICAwID8gcmVnMnZjY3AodmFsKSA6IHJlZzJ2Y2ModmFsKSk7CisJCQkgICAgICAgcmVnMnZvbHQoc2F0dHItPmluZGV4LCB2YWwsIGRhdGEtPmJ5cGFzc19hdHRuKSk7CiAJfQogfQogCkBAIC0yOTYsMTIgKzM0OSwxOSBAQAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCiAJZGF0YS0+dm9sdGFnZVtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF0gPQotCQlzYXR0ci0+aW5kZXggPyB2Y2MycmVnKHZhbCkgOiB2Y2NwMnJlZyh2YWwpOworCQkJCXZvbHQycmVnKHNhdHRyLT5pbmRleCwgdmFsLCBkYXRhLT5ieXBhc3NfYXR0bik7CiAKLQlpZiAoc2F0dHItPm5yID09IE1JTikKLQkJcmVnID0gVk9MVEFHRV9NSU5fUkVHKHNhdHRyLT5pbmRleCk7Ci0JZWxzZQotCQlyZWcgPSBWT0xUQUdFX01BWF9SRUcoc2F0dHItPmluZGV4KTsKKwlpZiAoc2F0dHItPmluZGV4IDwgQURUNzQ3NV9WT0xUQUdFX0NPVU5UKSB7CisJCWlmIChzYXR0ci0+bnIgPT0gTUlOKQorCQkJcmVnID0gVk9MVEFHRV9NSU5fUkVHKHNhdHRyLT5pbmRleCk7CisJCWVsc2UKKwkJCXJlZyA9IFZPTFRBR0VfTUFYX1JFRyhzYXR0ci0+aW5kZXgpOworCX0gZWxzZSB7CisJCWlmIChzYXR0ci0+bnIgPT0gTUlOKQorCQkJcmVnID0gUkVHX1ZUVF9NSU47CisJCWVsc2UKKwkJCXJlZyA9IFJFR19WVFRfTUFYOworCX0KIAogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsCiAJCQkJICBkYXRhLT52b2x0YWdlW3NhdHRyLT5ucl1bc2F0dHItPmluZGV4XSA+PiAyKTsKQEAgLTc3OCwxOCArODM4LDEwMyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCBJTlBVVCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4xX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F0X2NyaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkdDc0NzVfZGF0YSAqZGF0YSA9IGFkdDc0NzVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShkYXRhLT5jb25maWc0ICYgQ09ORklHNF9NQVhEVVRZKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wd21fYXRfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWRhdGEtPmNvbmZpZzQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBSRUdfQ09ORklHNCk7CisJaWYgKHZhbCkKKwkJZGF0YS0+Y29uZmlnNCB8PSBDT05GSUc0X01BWERVVFk7CisJZWxzZQorCQlkYXRhLT5jb25maWc0ICY9IH5DT05GSUc0X01BWERVVFk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFJFR19DT05GSUc0LCBkYXRhLT5jb25maWc0KTsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGludClkYXRhLT52cm0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCA8IDAgfHwgdmFsID4gMjU1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkYXRhLT52cm0gPSB2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGFkdDc0NzVfZGF0YSAqZGF0YSA9IGFkdDc0NzVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCBJTlBVVCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4wX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKIAkJCSAgICBzZXRfdm9sdGFnZSwgTUFYLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192b2x0YWdlLAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMF9taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZvbHRhZ2UsCiAJCQkgICAgc2V0X3ZvbHRhZ2UsIE1JTiwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIEFMQVJNLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgSU5QVVQsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZvbHRhZ2UsCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4wX2FsYXJtLCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIEFMQVJNLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgSU5QVVQsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZvbHRhZ2UsCiAJCQkgICAgc2V0X3ZvbHRhZ2UsIE1BWCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192b2x0YWdlLAogCQkJICAgIHNldF92b2x0YWdlLCBNSU4sIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9hbGFybSwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCBBTEFSTSwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIEFMQVJNLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgSU5QVVQsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZvbHRhZ2UsCisJCQkgICAgc2V0X3ZvbHRhZ2UsIE1BWCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKKwkJCSAgICBzZXRfdm9sdGFnZSwgTUlOLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfYWxhcm0sIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgQUxBUk0sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCBJTlBVVCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKKwkJCSAgICBzZXRfdm9sdGFnZSwgTUFYLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192b2x0YWdlLAorCQkJICAgIHNldF92b2x0YWdlLCBNSU4sIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19hbGFybSwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCBBTEFSTSwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW40X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIElOUFVULCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjRfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192b2x0YWdlLAorCQkJICAgIHNldF92b2x0YWdlLCBNQVgsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZvbHRhZ2UsCisJCQkgICAgc2V0X3ZvbHRhZ2UsIE1JTiwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIEFMQVJNLCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgSU5QVVQsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZvbHRhZ2UsCisJCQkgICAgc2V0X3ZvbHRhZ2UsIE1BWCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW41X21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKKwkJCSAgICBzZXRfdm9sdGFnZSwgTUlOLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfYWxhcm0sIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgQUxBUk0sIDMxKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCBJTlBVVCwgMCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgQUxBUk0sIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAxX2ZhdWx0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIEZBVUxULCAwKTsKQEAgLTg5Myw2ICsxMDM4LDEzIEBACiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIocHdtM19hdXRvX3BvaW50Ml9wd20sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bSwKIAkJCSAgICBzZXRfcHdtLCBNQVgsIDIpOwogCisvKiBOb24tc3RhbmRhcmQgbmFtZSwgbWlnaHQgbmVlZCByZXZpc2l0aW5nICovCitzdGF0aWMgREVWSUNFX0FUVFIocHdtX3VzZV9wb2ludDJfcHdtX2F0X2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBzaG93X3B3bV9hdF9jcml0LCBzZXRfcHdtX2F0X2NyaXQpOworCitzdGF0aWMgREVWSUNFX0FUVFIodnJtLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd192cm0sIHNldF92cm0pOworc3RhdGljIERFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZCwgTlVMTCk7CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDc1X2F0dHJzW10gPSB7CiAJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKQEAgLTk0MCw2MCArMTA5MiwxNTYgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfbWluLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW40X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW40X21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9mcmVxLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9hdXRvX2NoYW5uZWxzX3RlbXAuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTFfYXV0b19wb2ludDFfcHdtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20xX2F1dG9fcG9pbnQyX3B3bS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9mcmVxLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20yX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9hdXRvX2NoYW5uZWxzX3RlbXAuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfYXV0b19wb2ludDFfcHdtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20yX2F1dG9fcG9pbnQyX3B3bS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtMy5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtM19mcmVxLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20zX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtM19hdXRvX2NoYW5uZWxzX3RlbXAuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfYXV0b19wb2ludDFfcHdtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20zX2F1dG9fcG9pbnQyX3B3bS5kZXZfYXR0ci5hdHRyLAorCSZkZXZfYXR0cl9wd21fdXNlX3BvaW50Ml9wd21fYXRfY3JpdC5hdHRyLAogCU5VTEwsCiB9OwogCi1zdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc0NzVfYXR0cl9ncm91cCA9IHsgLmF0dHJzID0gYWR0NzQ3NV9hdHRycyB9Oworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZhbjRfYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnB3bTJfYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfZnJlcS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9lbmFibGUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfYXV0b19jaGFubmVsc190ZW1wLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yX2F1dG9fcG9pbnQxX3B3bS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9hdXRvX3BvaW50Ml9wd20uZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW4wX2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbjNfYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmluNF9hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW41X2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aWRfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfY3B1MF92aWQuYXR0ciwKKwkmZGV2X2F0dHJfdnJtLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzQ3NV9hdHRyX2dyb3VwID0geyAuYXR0cnMgPSBhZHQ3NDc1X2F0dHJzIH07CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmYW40X2F0dHJfZ3JvdXAgPSB7IC5hdHRycyA9IGZhbjRfYXR0cnMgfTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHB3bTJfYXR0cl9ncm91cCA9IHsgLmF0dHJzID0gcHdtMl9hdHRycyB9Oworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW4wX2F0dHJfZ3JvdXAgPSB7IC5hdHRycyA9IGluMF9hdHRycyB9Oworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW4zX2F0dHJfZ3JvdXAgPSB7IC5hdHRycyA9IGluM19hdHRycyB9Oworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW40X2F0dHJfZ3JvdXAgPSB7IC5hdHRycyA9IGluNF9hdHRycyB9Oworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW41X2F0dHJfZ3JvdXAgPSB7IC5hdHRycyA9IGluNV9hdHRycyB9Oworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmlkX2F0dHJfZ3JvdXAgPSB7IC5hdHRycyA9IHZpZF9hdHRycyB9OwogCiBzdGF0aWMgaW50IGFkdDc0NzVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBraW5kLAogCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCWludCB2ZW5kaWQsIGRldmlkLCBkZXZpZDI7CisJY29uc3QgY2hhciAqbmFtZTsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoa2luZCA8PSAwKSB7Ci0JCWlmIChhZHQ3NDc1X3JlYWQoUkVHX1ZFTkRJRCkgIT0gMHg0MSB8fAotCQkgICAgYWR0NzQ3NV9yZWFkKFJFR19ERVZJRCkgIT0gMHg3NSkgewotCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAotCQkJCSJDb3VsZG4ndCBkZXRlY3QgYSBhZHQ3NDc1IHBhcnQgYXQgMHglMDJ4XG4iLAotCQkJCSh1bnNpZ25lZCBpbnQpY2xpZW50LT5hZGRyKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJdmVuZGlkID0gYWR0NzQ3NV9yZWFkKFJFR19WRU5ESUQpOworCWRldmlkMiA9IGFkdDc0NzVfcmVhZChSRUdfREVWSUQyKTsKKwlpZiAodmVuZGlkICE9IDB4NDEgfHwJCS8qIEFuYWxvZyBEZXZpY2VzICovCisJICAgIChkZXZpZDIgJiAweGY4KSAhPSAweDY4KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldmlkID0gYWR0NzQ3NV9yZWFkKFJFR19ERVZJRCk7CisJaWYgKGRldmlkID09IDB4NzMpCisJCW5hbWUgPSAiYWR0NzQ3MyI7CisJZWxzZSBpZiAoZGV2aWQgPT0gMHg3NSAmJiBjbGllbnQtPmFkZHIgPT0gMHgyZSkKKwkJbmFtZSA9ICJhZHQ3NDc1IjsKKwllbHNlIGlmIChkZXZpZCA9PSAweDc2KQorCQluYW1lID0gImFkdDc0NzYiOworCWVsc2UgaWYgKChkZXZpZDIgJiAweGZjKSA9PSAweDZjKQorCQluYW1lID0gImFkdDc0OTAiOworCWVsc2UgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkiQ291bGRuJ3QgZGV0ZWN0IGFuIEFEVDc0NzMvNzUvNzYvOTAgcGFydCBhdCAiCisJCQkiMHglMDJ4XG4iLCAodW5zaWduZWQgaW50KWNsaWVudC0+YWRkcik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXN0cmxjcHkoaW5mby0+dHlwZSwgYWR0NzQ3NV9pZFswXS5uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKwlzdHJsY3B5KGluZm8tPnR5cGUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGFkdDc0NzVfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJIHN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWR0NzQ3NV9hdHRyX2dyb3VwKTsKKwlpZiAoZGF0YS0+aGFzX2ZhbjQpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmZhbjRfYXR0cl9ncm91cCk7CisJaWYgKGRhdGEtPmhhc19wd20yKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZwd20yX2F0dHJfZ3JvdXApOworCWlmIChkYXRhLT5oYXNfdm9sdGFnZSAmICgxIDw8IDApKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZpbjBfYXR0cl9ncm91cCk7CisJaWYgKGRhdGEtPmhhc192b2x0YWdlICYgKDEgPDwgMykpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmluM19hdHRyX2dyb3VwKTsKKwlpZiAoZGF0YS0+aGFzX3ZvbHRhZ2UgJiAoMSA8PCA0KSkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmaW40X2F0dHJfZ3JvdXApOworCWlmIChkYXRhLT5oYXNfdm9sdGFnZSAmICgxIDw8IDUpKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZpbjVfYXR0cl9ncm91cCk7CisJaWYgKGRhdGEtPmhhc192aWQpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnZpZF9hdHRyX2dyb3VwKTsKK30KKwogc3RhdGljIGludCBhZHQ3NDc1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogeworCXN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1tdID0geworCQlbYWR0NzQ3M10gPSAiQURUNzQ3MyIsCisJCVthZHQ3NDc1XSA9ICJBRFQ3NDc1IiwKKwkJW2FkdDc0NzZdID0gIkFEVDc0NzYiLAorCQlbYWR0NzQ5MF0gPSAiQURUNzQ5MCIsCisJfTsKKwogCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGE7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IGksIHJldCA9IDAsIHJldmlzaW9uOworCXU4IGNvbmZpZzIsIGNvbmZpZzM7CiAKIAlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGF0YSA9PSBOVUxMKQpAQCAtMTAwMiw2ICsxMjUwLDcwIEBACiAJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CiAKKwkvKiBJbml0aWFsaXplIGRldmljZS1zcGVjaWZpYyB2YWx1ZXMgKi8KKwlzd2l0Y2ggKGlkLT5kcml2ZXJfZGF0YSkgeworCWNhc2UgYWR0NzQ3NjoKKwkJZGF0YS0+aGFzX3ZvbHRhZ2UgPSAweDBlOwkvKiBpbjEgdG8gaW4zICovCisJCXJldmlzaW9uID0gYWR0NzQ3NV9yZWFkKFJFR19ERVZJRDIpICYgMHgwNzsKKwkJYnJlYWs7CisJY2FzZSBhZHQ3NDkwOgorCQlkYXRhLT5oYXNfdm9sdGFnZSA9IDB4M2U7CS8qIGluMSB0byBpbjUgKi8KKwkJcmV2aXNpb24gPSBhZHQ3NDc1X3JlYWQoUkVHX0RFVklEMikgJiAweDAzOworCQlpZiAocmV2aXNpb24gPT0gMHgwMykKKwkJCXJldmlzaW9uICs9IGFkdDc0NzVfcmVhZChSRUdfREVWUkVWMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRhdGEtPmhhc192b2x0YWdlID0gMHgwNjsJLyogaW4xLCBpbjIgKi8KKwkJcmV2aXNpb24gPSBhZHQ3NDc1X3JlYWQoUkVHX0RFVklEMikgJiAweDA3OworCX0KKworCWNvbmZpZzMgPSBhZHQ3NDc1X3JlYWQoUkVHX0NPTkZJRzMpOworCS8qIFBpbiBQV00yIG1heSBhbHRlcm5hdGl2ZWx5IGJlIHVzZWQgZm9yIEFMRVJUIG91dHB1dCAqLworCWlmICghKGNvbmZpZzMgJiBDT05GSUczX1NNQkFMRVJUKSkKKwkJZGF0YS0+aGFzX3B3bTIgPSAxOworCS8qIE1lYW5pbmcgb2YgdGhpcyBiaXQgaXMgaW52ZXJ0ZWQgZm9yIHRoZSBBRFQ3NDczLTEgKi8KKwlpZiAoaWQtPmRyaXZlcl9kYXRhID09IGFkdDc0NzMgJiYgcmV2aXNpb24gPj0gMSkKKwkJZGF0YS0+aGFzX3B3bTIgPSAhZGF0YS0+aGFzX3B3bTI7CisKKwlkYXRhLT5jb25maWc0ID0gYWR0NzQ3NV9yZWFkKFJFR19DT05GSUc0KTsKKwkvKiBQaW4gVEFDSDQgbWF5IGFsdGVybmF0aXZlbHkgYmUgdXNlZCBmb3IgVEhFUk0gKi8KKwlpZiAoKGRhdGEtPmNvbmZpZzQgJiBDT05GSUc0X1BJTkZVTkMpID09IDB4MCkKKwkJZGF0YS0+aGFzX2ZhbjQgPSAxOworCisJLyogVEhFUk0gY29uZmlndXJhdGlvbiBpcyBtb3JlIGNvbXBsZXggb24gdGhlIEFEVDc0NzYgYW5kIEFEVDc0OTAsCisJICAgYmVjYXVzZSAyIGRpZmZlcmVudCBwaW5zIChUQUNINCBhbmQgKzIuNSBWaW4pIGNhbiBiZSB1c2VkIGZvcgorCSAgIHRoaXMgZnVuY3Rpb24gKi8KKwlpZiAoaWQtPmRyaXZlcl9kYXRhID09IGFkdDc0OTApIHsKKwkJaWYgKChkYXRhLT5jb25maWc0ICYgQ09ORklHNF9QSU5GVU5DKSA9PSAweDEgJiYKKwkJICAgICEoY29uZmlnMyAmIENPTkZJRzNfVEhFUk0pKQorCQkJZGF0YS0+aGFzX2ZhbjQgPSAxOworCX0KKwlpZiAoaWQtPmRyaXZlcl9kYXRhID09IGFkdDc0NzYgfHwgaWQtPmRyaXZlcl9kYXRhID09IGFkdDc0OTApIHsKKwkJaWYgKCEoY29uZmlnMyAmIENPTkZJRzNfVEhFUk0pIHx8CisJCSAgICAoZGF0YS0+Y29uZmlnNCAmIENPTkZJRzRfUElORlVOQykgPT0gMHgxKQorCQkJZGF0YS0+aGFzX3ZvbHRhZ2UgfD0gKDEgPDwgMCk7CQkvKiBpbjAgKi8KKwl9CisKKwkvKiBPbiB0aGUgQURUNzQ3NiwgdGhlICsxMlYgaW5wdXQgcGluIG1heSBpbnN0ZWFkIGJlIHVzZWQgYXMgVklENSwKKwkgICBhbmQgVklEIHBpbnMgbWF5IGFsdGVybmF0aXZlbHkgYmUgdXNlZCBhcyBHUElPICovCisJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSBhZHQ3NDc2KSB7CisJCXU4IHZpZCA9IGFkdDc0NzVfcmVhZChSRUdfVklEKTsKKwkJaWYgKCEodmlkICYgVklEX1ZJRFNFTCkpCisJCQlkYXRhLT5oYXNfdm9sdGFnZSB8PSAoMSA8PCA0KTsJCS8qIGluNCAqLworCisJCWRhdGEtPmhhc192aWQgPSAhKGFkdDc0NzVfcmVhZChSRUdfQ09ORklHNSkgJiBDT05GSUc1X1ZJREdQSU8pOworCX0KKworCS8qIFZvbHRhZ2UgYXR0ZW51YXRvcnMgY2FuIGJlIGJ5cGFzc2VkLCBnbG9iYWxseSBvciBpbmRpdmlkdWFsbHkgKi8KKwljb25maWcyID0gYWR0NzQ3NV9yZWFkKFJFR19DT05GSUcyKTsKKwlpZiAoY29uZmlnMiAmIENPTkZJRzJfQVRUTikgeworCQlkYXRhLT5ieXBhc3NfYXR0biA9ICgweDMgPDwgMykgfCAweDM7CisJfSBlbHNlIHsKKwkJZGF0YS0+YnlwYXNzX2F0dG4gPSAoKGRhdGEtPmNvbmZpZzQgJiBDT05GSUc0X0FUVE5fSU4xMCkgPj4gNCkgfAorCQkJCSAgICAoKGRhdGEtPmNvbmZpZzQgJiBDT05GSUc0X0FUVE5fSU40MykgPj4gMyk7CisJfQorCWRhdGEtPmJ5cGFzc19hdHRuICY9IGRhdGEtPmhhc192b2x0YWdlOworCiAJLyogQ2FsbCBhZHQ3NDc1X3JlYWRfcHdtIGZvciBhbGwgcHdtJ3MgYXMgdGhpcyB3aWxsIHJlcHJvZ3JhbSBhbnkKIAkgICBwd20ncyB3aGljaCBhcmUgZGlzYWJsZWQgdG8gbWFudWFsIG1vZGUgd2l0aCAwJSBkdXR5IGN5Y2xlICovCiAJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfUFdNX0NPVU5UOyBpKyspCkBAIC0xMDExLDE2ICsxMzIzLDcwIEBACiAJaWYgKHJldCkKIAkJZ290byBlZnJlZTsKIAorCS8qIEZlYXR1cmVzIHRoYXQgY2FuIGJlIGRpc2FibGVkIGluZGl2aWR1YWxseSAqLworCWlmIChkYXRhLT5oYXNfZmFuNCkgeworCQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZmYW40X2F0dHJfZ3JvdXApOworCQlpZiAocmV0KQorCQkJZ290byBlcmVtb3ZlOworCX0KKwlpZiAoZGF0YS0+aGFzX3B3bTIpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmcHdtMl9hdHRyX2dyb3VwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJlbW92ZTsKKwl9CisJaWYgKGRhdGEtPmhhc192b2x0YWdlICYgKDEgPDwgMCkpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmaW4wX2F0dHJfZ3JvdXApOworCQlpZiAocmV0KQorCQkJZ290byBlcmVtb3ZlOworCX0KKwlpZiAoZGF0YS0+aGFzX3ZvbHRhZ2UgJiAoMSA8PCAzKSkgeworCQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZpbjNfYXR0cl9ncm91cCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVyZW1vdmU7CisJfQorCWlmIChkYXRhLT5oYXNfdm9sdGFnZSAmICgxIDw8IDQpKSB7CisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmluNF9hdHRyX2dyb3VwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJlbW92ZTsKKwl9CisJaWYgKGRhdGEtPmhhc192b2x0YWdlICYgKDEgPDwgNSkpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmaW41X2F0dHJfZ3JvdXApOworCQlpZiAocmV0KQorCQkJZ290byBlcmVtb3ZlOworCX0KKwlpZiAoZGF0YS0+aGFzX3ZpZCkgeworCQlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnZpZF9hdHRyX2dyb3VwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJlbW92ZTsKKwl9CisKIAlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwogCQlnb3RvIGVyZW1vdmU7CiAJfQogCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgZGV2aWNlLCByZXZpc2lvbiAlZFxuIiwKKwkJIG5hbWVzW2lkLT5kcml2ZXJfZGF0YV0sIHJldmlzaW9uKTsKKwlpZiAoKGRhdGEtPmhhc192b2x0YWdlICYgMHgxMSkgfHwgZGF0YS0+aGFzX2ZhbjQgfHwgZGF0YS0+aGFzX3B3bTIpCisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIk9wdGlvbmFsIGZlYXR1cmVzOiVzJXMlcyVzJXNcbiIsCisJCQkgKGRhdGEtPmhhc192b2x0YWdlICYgKDEgPDwgMCkpID8gIiBpbjAiIDogIiIsCisJCQkgKGRhdGEtPmhhc192b2x0YWdlICYgKDEgPDwgNCkpID8gIiBpbjQiIDogIiIsCisJCQkgZGF0YS0+aGFzX2ZhbjQgPyAiIGZhbjQiIDogIiIsCisJCQkgZGF0YS0+aGFzX3B3bTIgPyAiIHB3bTIiIDogIiIsCisJCQkgZGF0YS0+aGFzX3ZpZCA/ICIgdmlkIiA6ICIiKTsKKwlpZiAoZGF0YS0+YnlwYXNzX2F0dG4pCisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkJ5cGFzc2luZyBhdHRlbnVhdG9ycyBvbjolcyVzJXMlc1xuIiwKKwkJCSAoZGF0YS0+YnlwYXNzX2F0dG4gJiAoMSA8PCAwKSkgPyAiIGluMCIgOiAiIiwKKwkJCSAoZGF0YS0+YnlwYXNzX2F0dG4gJiAoMSA8PCAxKSkgPyAiIGluMSIgOiAiIiwKKwkJCSAoZGF0YS0+YnlwYXNzX2F0dG4gJiAoMSA8PCAzKSkgPyAiIGluMyIgOiAiIiwKKwkJCSAoZGF0YS0+YnlwYXNzX2F0dG4gJiAoMSA8PCA0KSkgPyAiIGluNCIgOiAiIik7CisKIAlyZXR1cm4gMDsKIAogZXJlbW92ZToKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZhZHQ3NDc1X2F0dHJfZ3JvdXApOworCWFkdDc0NzVfcmVtb3ZlX2ZpbGVzKGNsaWVudCwgZGF0YSk7CiBlZnJlZToKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTAzMSw3ICsxMzk3LDcgQEAKIAlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkdDc0NzVfYXR0cl9ncm91cCk7CisJYWR0NzQ3NV9yZW1vdmVfZmlsZXMoY2xpZW50LCBkYXRhKTsKIAlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwpAQCAtMTExNiw3ICsxNDgyLDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQl1OCBleHQ7CisJdTE2IGV4dDsKIAlpbnQgaTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtMTEyNywyNSArMTQ5Myw0NCBAQAogCQlkYXRhLT5hbGFybXMgPSBhZHQ3NDc1X3JlYWQoUkVHX1NUQVRVUzIpIDw8IDg7CiAJCWRhdGEtPmFsYXJtcyB8PSBhZHQ3NDc1X3JlYWQoUkVHX1NUQVRVUzEpOwogCi0JCWV4dCA9IGFkdDc0NzVfcmVhZChSRUdfRVhURU5EMSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1ZPTFRBR0VfQ09VTlQ7IGkrKykKKwkJZXh0ID0gKGFkdDc0NzVfcmVhZChSRUdfRVhURU5EMikgPDwgOCkgfAorCQkJYWR0NzQ3NV9yZWFkKFJFR19FWFRFTkQxKTsKKwkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfVk9MVEFHRV9DT1VOVDsgaSsrKSB7CisJCQlpZiAoIShkYXRhLT5oYXNfdm9sdGFnZSAmICgxIDw8IGkpKSkKKwkJCQljb250aW51ZTsKIAkJCWRhdGEtPnZvbHRhZ2VbSU5QVVRdW2ldID0KIAkJCQkoYWR0NzQ3NV9yZWFkKFZPTFRBR0VfUkVHKGkpKSA8PCAyKSB8Ci0JCQkJKChleHQgPj4gKChpICsgMSkgKiAyKSkgJiAzKTsKKwkJCQkoKGV4dCA+PiAoaSAqIDIpKSAmIDMpOworCQl9CiAKLQkJZXh0ID0gYWR0NzQ3NV9yZWFkKFJFR19FWFRFTkQyKTsKIAkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfVEVNUF9DT1VOVDsgaSsrKQogCQkJZGF0YS0+dGVtcFtJTlBVVF1baV0gPQogCQkJCShhZHQ3NDc1X3JlYWQoVEVNUF9SRUcoaSkpIDw8IDIpIHwKLQkJCQkoKGV4dCA+PiAoKGkgKyAxKSAqIDIpKSAmIDMpOworCQkJCSgoZXh0ID4+ICgoaSArIDUpICogMikpICYgMyk7CiAKLQkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfVEFDSF9DT1VOVDsgaSsrKQorCQlpZiAoZGF0YS0+aGFzX3ZvbHRhZ2UgJiAoMSA8PCA1KSkgeworCQkJZGF0YS0+YWxhcm1zIHw9IGFkdDc0NzVfcmVhZChSRUdfU1RBVFVTNCkgPDwgMjQ7CisJCQlleHQgPSBhZHQ3NDc1X3JlYWQoUkVHX0VYVEVORDMpOworCQkJZGF0YS0+dm9sdGFnZVtJTlBVVF1bNV0gPSBhZHQ3NDc1X3JlYWQoUkVHX1ZUVCkgPDwgMiB8CisJCQkJKChleHQgPj4gNCkgJiAzKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1RBQ0hfQ09VTlQ7IGkrKykgeworCQkJaWYgKGkgPT0gMyAmJiAhZGF0YS0+aGFzX2ZhbjQpCisJCQkJY29udGludWU7CiAJCQlkYXRhLT50YWNoW0lOUFVUXVtpXSA9CiAJCQkJYWR0NzQ3NV9yZWFkX3dvcmQoY2xpZW50LCBUQUNIX1JFRyhpKSk7CisJCX0KIAogCQkvKiBVcGRhdGVkIGJ5IGh3IHdoZW4gaW4gYXV0byBtb2RlICovCi0JCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1BXTV9DT1VOVDsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3NV9QV01fQ09VTlQ7IGkrKykgeworCQkJaWYgKGkgPT0gMSAmJiAhZGF0YS0+aGFzX3B3bTIpCisJCQkJY29udGludWU7CiAJCQlkYXRhLT5wd21bSU5QVVRdW2ldID0gYWR0NzQ3NV9yZWFkKFBXTV9SRUcoaSkpOworCQl9CisKKwkJaWYgKGRhdGEtPmhhc192aWQpCisJCQlkYXRhLT52aWQgPSBhZHQ3NDc1X3JlYWQoUkVHX1ZJRCkgJiAweDNmOwogCiAJCWRhdGEtPm1lYXN1cmVfdXBkYXRlZCA9IGppZmZpZXM7CiAJfQpAQCAtMTE1Myw5ICsxNTM4LDEyIEBACiAJLyogTGltaXRzIGFuZCBzZXR0aW5ncywgc2hvdWxkIG5ldmVyIGNoYW5nZSB1cGRhdGUgZXZlcnkgNjAgc2Vjb25kcyAqLwogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxpbWl0c191cGRhdGVkICsgSFogKiA2MCkgfHwKIAkgICAgIWRhdGEtPnZhbGlkKSB7CisJCWRhdGEtPmNvbmZpZzQgPSBhZHQ3NDc1X3JlYWQoUkVHX0NPTkZJRzQpOwogCQlkYXRhLT5jb25maWc1ID0gYWR0NzQ3NV9yZWFkKFJFR19DT05GSUc1KTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3NV9WT0xUQUdFX0NPVU5UOyBpKyspIHsKKwkJCWlmICghKGRhdGEtPmhhc192b2x0YWdlICYgKDEgPDwgaSkpKQorCQkJCWNvbnRpbnVlOwogCQkJLyogQWRqdXN0IHZhbHVlcyBzbyB0aGV5IG1hdGNoIHRoZSBpbnB1dCBwcmVjaXNpb24gKi8KIAkJCWRhdGEtPnZvbHRhZ2VbTUlOXVtpXSA9CiAJCQkJYWR0NzQ3NV9yZWFkKFZPTFRBR0VfTUlOX1JFRyhpKSkgPDwgMjsKQEAgLTExNjMsNiArMTU1MSwxMSBAQAogCQkJCWFkdDc0NzVfcmVhZChWT0xUQUdFX01BWF9SRUcoaSkpIDw8IDI7CiAJCX0KIAorCQlpZiAoZGF0YS0+aGFzX3ZvbHRhZ2UgJiAoMSA8PCA1KSkgeworCQkJZGF0YS0+dm9sdGFnZVtNSU5dWzVdID0gYWR0NzQ3NV9yZWFkKFJFR19WVFRfTUlOKSA8PCAyOworCQkJZGF0YS0+dm9sdGFnZVtNQVhdWzVdID0gYWR0NzQ3NV9yZWFkKFJFR19WVFRfTUFYKSA8PCAyOworCQl9CisKIAkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfVEVNUF9DT1VOVDsgaSsrKSB7CiAJCQkvKiBBZGp1c3QgdmFsdWVzIHNvIHRoZXkgbWF0Y2ggdGhlIGlucHV0IHByZWNpc2lvbiAqLwogCQkJZGF0YS0+dGVtcFtNSU5dW2ldID0KQEAgLTExNzgsMTEgKzE1NzEsMTYgQEAKIAkJfQogCQlhZHQ3NDc1X3JlYWRfaHlzdGVyc2lzKGNsaWVudCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfVEFDSF9DT1VOVDsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3NV9UQUNIX0NPVU5UOyBpKyspIHsKKwkJCWlmIChpID09IDMgJiYgIWRhdGEtPmhhc19mYW40KQorCQkJCWNvbnRpbnVlOwogCQkJZGF0YS0+dGFjaFtNSU5dW2ldID0KIAkJCQlhZHQ3NDc1X3JlYWRfd29yZChjbGllbnQsIFRBQ0hfTUlOX1JFRyhpKSk7CisJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3NV9QV01fQ09VTlQ7IGkrKykgeworCQkJaWYgKGkgPT0gMSAmJiAhZGF0YS0+aGFzX3B3bTIpCisJCQkJY29udGludWU7CiAJCQlkYXRhLT5wd21bTUFYXVtpXSA9IGFkdDc0NzVfcmVhZChQV01fTUFYX1JFRyhpKSk7CiAJCQlkYXRhLT5wd21bTUlOXVtpXSA9IGFkdDc0NzVfcmVhZChQV01fTUlOX1JFRyhpKSk7CiAJCQkvKiBTZXQgdGhlIGNoYW5uZWwgYW5kIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCmluZGV4IDhhY2Y4MjkuLjQ4MGY4MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwpAQCAtNzAxLDYgKzcwMSw3IEBACiAJCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwlpbnQgdmFsMSwgdmFsMjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewogCQlwcl9kZWJ1ZygiYXNiMTAwLm86IGRldGVjdCBmYWlsZWQsICIKQEAgLTcwOCw1MCArNzA5LDMwIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCS8qIFRoZSBjaGlwIG1heSBiZSBzdHVjayBpbiBzb21lIG90aGVyIGJhbmsgdGhhbiBiYW5rIDAuIFRoaXMgbWF5Ci0JICAgbWFrZSByZWFkaW5nIG90aGVyIGluZm9ybWF0aW9uIGltcG9zc2libGUuIFNwZWNpZnkgYSBmb3JjZT0uLi4gb3IKLQkgICBmb3JjZV8qPS4uLiBwYXJhbWV0ZXIsIGFuZCB0aGUgY2hpcCB3aWxsIGJlIHJlc2V0IHRvIHRoZSByaWdodAotCSAgIGJhbmsuICovCi0JaWYgKGtpbmQgPCAwKSB7CisJdmFsMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFTQjEwMF9SRUdfQkFOSyk7CisJdmFsMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFTQjEwMF9SRUdfQ0hJUE1BTik7CiAKLQkJaW50IHZhbDEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBU0IxMDBfUkVHX0JBTkspOwotCQlpbnQgdmFsMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFTQjEwMF9SRUdfQ0hJUE1BTik7CisJLyogSWYgd2UncmUgaW4gYmFuayAwICovCisJaWYgKCghKHZhbDEgJiAweDA3KSkgJiYKKwkJCS8qIENoZWNrIGZvciBBU0IxMDAgSUQgKGxvdyBieXRlKSAqLworCQkJKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4OTQpKSB8fAorCQkJLyogQ2hlY2sgZm9yIEFTQjEwMCBJRCAoaGlnaCBieXRlICkgKi8KKwkJCSgodmFsMSAmIDB4ODApICYmICh2YWwyICE9IDB4MDYpKSkpIHsKKwkJcHJfZGVidWcoImFzYjEwMDogZGV0ZWN0IGZhaWxlZCwgYmFkIGNoaXAgaWQgMHglMDJ4IVxuIiwgdmFsMik7CisJCXJldHVybiAtRU5PREVWOworCX0KIAotCQkvKiBJZiB3ZSdyZSBpbiBiYW5rIDAgKi8KLQkJaWYgKCghKHZhbDEgJiAweDA3KSkgJiYKLQkJCQkvKiBDaGVjayBmb3IgQVNCMTAwIElEIChsb3cgYnl0ZSkgKi8KLQkJCQkoKCghKHZhbDEgJiAweDgwKSkgJiYgKHZhbDIgIT0gMHg5NCkpIHx8Ci0JCQkJLyogQ2hlY2sgZm9yIEFTQjEwMCBJRCAoaGlnaCBieXRlICkgKi8KLQkJCQkoKHZhbDEgJiAweDgwKSAmJiAodmFsMiAhPSAweDA2KSkpKSB7Ci0JCQlwcl9kZWJ1ZygiYXNiMTAwLm86IGRldGVjdCBmYWlsZWQsICIKLQkJCQkJImJhZCBjaGlwIGlkIDB4JTAyeCFcbiIsIHZhbDIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCX0gLyoga2luZCA8IDAgKi8KLQotCS8qIFdlIGhhdmUgZWl0aGVyIGhhZCBhIGZvcmNlIHBhcmFtZXRlciwgb3Igd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkCi0JICAgV2luYm9uZC4gUHV0IGl0IG5vdyBpbnRvIGJhbmsgMCBhbmQgVmVuZG9yIElEIEhpZ2ggQnl0ZSAqLworCS8qIFB1dCBpdCBub3cgaW50byBiYW5rIDAgYW5kIFZlbmRvciBJRCBIaWdoIEJ5dGUgKi8KIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LLAogCQkoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LKSAmIDB4NzgpCiAJCXwgMHg4MCk7CiAKIAkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KLQlpZiAoa2luZCA8PSAwKSB7Ci0JCWludCB2YWwxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQVNCMTAwX1JFR19XQ0hJUElEKTsKLQkJaW50IHZhbDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBU0IxMDBfUkVHX0NISVBNQU4pOworCXZhbDEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBU0IxMDBfUkVHX1dDSElQSUQpOworCXZhbDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBU0IxMDBfUkVHX0NISVBNQU4pOwogCi0JCWlmICgodmFsMSA9PSAweDMxKSAmJiAodmFsMiA9PSAweDA2KSkKLQkJCWtpbmQgPSBhc2IxMDA7Ci0JCWVsc2UgewotCQkJaWYgKGtpbmQgPT0gMCkKLQkJCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAiaWdub3JpbmcgIgotCQkJCQkiJ2ZvcmNlJyBwYXJhbWV0ZXIgZm9yIHVua25vd24gY2hpcCAiCi0JCQkJCSJhdCBhZGFwdGVyICVkLCBhZGRyZXNzIDB4JTAyeC5cbiIsCi0JCQkJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBjbGllbnQtPmFkZHIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9CisJaWYgKHZhbDEgIT0gMHgzMSB8fCB2YWwyICE9IDB4MDYpCisJCXJldHVybiAtRU5PREVWOwogCiAJc3RybGNweShpbmZvLT50eXBlLCAiYXNiMTAwIiwgSTJDX05BTUVfU0laRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jIGIvZHJpdmVycy9od21vbi9kbWUxNzM3LmMKaW5kZXggMjdkNjI1Ny4uNDM3N2JiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9kbWUxNzM3LmMKKysrIGIvZHJpdmVycy9od21vbi9kbWUxNzM3LmMKQEAgLTIyMjAsMzMgKzIyMjAsMjMgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UKLQkgKiBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZSBtdXN0IGlkZW50aWZ5IHRoZSBjaGlwLiAqLwotCWlmIChraW5kIDwgMCkgewotCQljb21wYW55ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRE1FMTczN19SRUdfQ09NUEFOWSk7Ci0JCXZlcnN0ZXAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBETUUxNzM3X1JFR19WRVJTVEVQKTsKKwljb21wYW55ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRE1FMTczN19SRUdfQ09NUEFOWSk7CisJdmVyc3RlcCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERNRTE3MzdfUkVHX1ZFUlNURVApOwogCi0JCWlmIChjb21wYW55ID09IERNRTE3MzdfQ09NUEFOWV9TTVNDICYmCi0JCSAgICAodmVyc3RlcCAmIERNRTE3MzdfVkVSU1RFUF9NQVNLKSA9PSBETUUxNzM3X1ZFUlNURVApIHsKLQkJCWtpbmQgPSBkbWUxNzM3OwotCQl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gRE1FMTczN19DT01QQU5ZX1NNU0MgJiYKLQkJCSAgIHZlcnN0ZXAgPT0gU0NINTAyN19WRVJTVEVQKSB7Ci0JCQlraW5kID0gc2NoNTAyNzsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaWYgKGtpbmQgPT0gc2NoNTAyNykgeworCWlmIChjb21wYW55ID09IERNRTE3MzdfQ09NUEFOWV9TTVNDICYmCisJICAgIHZlcnN0ZXAgPT0gU0NINTAyN19WRVJTVEVQKSB7CiAJCW5hbWUgPSAic2NoNTAyNyI7Ci0JfSBlbHNlIHsKLQkJa2luZCA9IGRtZTE3Mzc7CisKKwl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gRE1FMTczN19DT01QQU5ZX1NNU0MgJiYKKwkJICAgKHZlcnN0ZXAgJiBETUUxNzM3X1ZFUlNURVBfTUFTSykgPT0gRE1FMTczN19WRVJTVEVQKSB7CiAJCW5hbWUgPSAiZG1lMTczNyI7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZGV2X2luZm8oZGV2LCAiRm91bmQgYSAlcyBjaGlwIGF0IDB4JTAyeCAocmV2IDB4JTAyeCkuXG4iLAotCQkga2luZCA9PSBzY2g1MDI3ID8gIlNDSDUwMjciIDogIkRNRTE3MzciLCBjbGllbnQtPmFkZHIsCi0JCSB2ZXJzdGVwKTsKKwkJIHZlcnN0ZXAgPT0gU0NINTAyN19WRVJTVEVQID8gIlNDSDUwMjciIDogIkRNRTE3MzciLAorCQkgY2xpZW50LT5hZGRyLCB2ZXJzdGVwKTsKIAlzdHJsY3B5KGluZm8tPnR5cGUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jIGIvZHJpdmVycy9od21vbi9kczE2MjEuYwppbmRleCA1M2Y4OGY1Li4yYTRjNmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMKQEAgLTIzNywyMCArMjM3LDE2IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gSXQgaXMgbG91c3kuICovCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCS8qIFRoZSBOVkIgYml0IHNob3VsZCBiZSBsb3cgaWYgbm8gRUVQUk9NIHdyaXRlIGhhcyBiZWVuIAotCQkgICByZXF1ZXN0ZWQgZHVyaW5nIHRoZSBsYXRlc3QgMTBtcywgd2hpY2ggaXMgaGlnaGx5IAotCQkgICBpbXByb2JhYmxlIGluIG91ciBjYXNlLiAqLwotCQljb25mID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxNjIxX1JFR19DT05GKTsKLQkJaWYgKGNvbmYgPCAwIHx8IGNvbmYgJiBEUzE2MjFfUkVHX0NPTkZJR19OVkIpCisJLyogVGhlIE5WQiBiaXQgc2hvdWxkIGJlIGxvdyBpZiBubyBFRVBST00gd3JpdGUgaGFzIGJlZW4gIHJlcXVlc3RlZAorCSAgIGR1cmluZyB0aGUgbGF0ZXN0IDEwbXMsIHdoaWNoIGlzIGhpZ2hseSBpbXByb2JhYmxlIGluIG91ciBjYXNlLiAqLworCWNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzE2MjFfUkVHX0NPTkYpOworCWlmIChjb25mIDwgMCB8fCBjb25mICYgRFMxNjIxX1JFR19DT05GSUdfTlZCKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBUaGUgNyBsb3dlc3QgYml0cyBvZiBhIHRlbXBlcmF0dXJlIHNob3VsZCBhbHdheXMgYmUgMC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShEUzE2MjFfUkVHX1RFTVApOyBpKyspIHsKKwkJdGVtcCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIERTMTYyMV9SRUdfVEVNUFtpXSk7CisJCWlmICh0ZW1wIDwgMCB8fCAodGVtcCAmIDB4N2YwMCkpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJLyogVGhlIDcgbG93ZXN0IGJpdHMgb2YgYSB0ZW1wZXJhdHVyZSBzaG91bGQgYWx3YXlzIGJlIDAuICovCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKERTMTYyMV9SRUdfVEVNUCk7IGkrKykgewotCQkJdGVtcCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCi0JCQkJCQkJRFMxNjIxX1JFR19URU1QW2ldKTsKLQkJCWlmICh0ZW1wIDwgMCB8fCAodGVtcCAmIDB4N2YwMCkpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KIAl9CiAKIAlzdHJsY3B5KGluZm8tPnR5cGUsICJkczE2MjEiLCBJMkNfTkFNRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwppbmRleCA0MTQ2MTA1Li5hOTVmYTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCkBAIC00OCw2ICs0OCw3IEBACiAjZGVmaW5lIFNJT19GNzE4NThfSUQJCTB4MDUwNyAgLyogQ2hpcHNldCBJRCAqLwogI2RlZmluZSBTSU9fRjcxODYyX0lECQkweDA2MDEJLyogQ2hpcHNldCBJRCAqLwogI2RlZmluZSBTSU9fRjcxODgyX0lECQkweDA1NDEJLyogQ2hpcHNldCBJRCAqLworI2RlZmluZSBTSU9fRjcxODg5X0lECQkweDA3MjMJLyogQ2hpcHNldCBJRCAqLwogI2RlZmluZSBTSU9fRjgwMDBfSUQJCTB4MDU4MQkvKiBDaGlwc2V0IElEICovCiAKICNkZWZpbmUgUkVHSU9OX0xFTkdUSAkJOApAQCAtOTUsMTIgKzk2LDEzIEBACiBtb2R1bGVfcGFyYW0oZm9yY2VfaWQsIHVzaG9ydCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2lkLCAiT3ZlcnJpZGUgdGhlIGRldGVjdGVkIGRldmljZSBJRCIpOwogCi1lbnVtIGNoaXBzIHsgZjcxODU4ZmcsIGY3MTg2MmZnLCBmNzE4ODJmZywgZjgwMDAgfTsKK2VudW0gY2hpcHMgeyBmNzE4NThmZywgZjcxODYyZmcsIGY3MTg4MmZnLCBmNzE4ODlmZywgZjgwMDAgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmY3MTg4MmZnX25hbWVzW10gPSB7CiAJImY3MTg1OGZnIiwKIAkiZjcxODYyZmciLAogCSJmNzE4ODJmZyIsCisJImY3MTg4OWZnIiwKIAkiZjgwMDAiLAogfTsKIApAQCAtMTU1LDcgKzE1Nyw3IEBACiAJdTgJcHdtX2F1dG9fcG9pbnRfaHlzdFsyXTsKIAl1OAlwd21fYXV0b19wb2ludF9tYXBwaW5nWzRdOwogCXU4CXB3bV9hdXRvX3BvaW50X3B3bVs0XVs1XTsKLQl1OAlwd21fYXV0b19wb2ludF90ZW1wWzRdWzRdOworCXM4CXB3bV9hdXRvX3BvaW50X3RlbXBbNF1bNF07CiB9OwogCiAvKiBTeXNmcyBpbiAqLwpAQCAtMjU4LDcgKzI2MCw5IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOwogCi0vKiBUZW1wIGFuZCBpbiBhdHRyIGZvciB0aGUgZjcxODU4ZmcgKi8KKy8qIFRlbXAgYW5kIGluIGF0dHIgZm9yIHRoZSBmNzE4NThmZywgdGhlIGY3MTg1OGZnIGlzIHNwZWNpYWwgYXMgaXQKKyAgIGhhcyBpdHMgdGVtcGVyYXR1cmUgaW5kZXhlcyBzdGFydCBhdCAwICh0aGUgb3RoZXJzIHN0YXJ0IGF0IDEpIGFuZAorICAgaXQgb25seSBoYXMgMyB2b2x0YWdlIGlucHV0cyAqLwogc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGY3MTg1OGZnX2luX3RlbXBfYXR0cltdID0gewogCVNFTlNPUl9BVFRSXzIoaW4wX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAwKSwKIAlTRU5TT1JfQVRUUl8yKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMSksCkBAIC0zMDIsOCArMzA2LDggQEAKIAlTRU5TT1JfQVRUUl8yKHRlbXAzX2ZhdWx0LCBTX0lSVUdPLCBzaG93X3RlbXBfZmF1bHQsIE5VTEwsIDAsIDIpLAogfTsKIAotLyogVGVtcCBhbmQgaW4gYXR0ciBjb21tb24gdG8gYm90aCB0aGUgZjcxODYyZmcgYW5kIGY3MTg4MmZnICovCi1zdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjcxOHgyZmdfaW5fdGVtcF9hdHRyW10gPSB7CisvKiBUZW1wIGFuZCBpbiBhdHRyIGNvbW1vbiB0byB0aGUgZjcxODYyZmcsIGY3MTg4MmZnIGFuZCBmNzE4ODlmZyAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGZ4eHh4X2luX3RlbXBfYXR0cltdID0gewogCVNFTlNPUl9BVFRSXzIoaW4wX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAwKSwKIAlTRU5TT1JfQVRUUl8yKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMSksCiAJU0VOU09SX0FUVFJfMihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDIpLApAQCAtMzcxLDggKzM3NSw4IEBACiAJU0VOU09SX0FUVFJfMih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd190ZW1wX2ZhdWx0LCBOVUxMLCAwLCAzKSwKIH07CiAKLS8qIFRlbXAgYW5kIGluIGF0dHIgZm91bmQgb25seSBvbiB0aGUgZjcxODgyZmcgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4ODJmZ19pbl90ZW1wX2F0dHJbXSA9IHsKKy8qIEZvciBtb2RlbHMgd2l0aCBpbjEgYWxhcm0gY2FwYWJpbGl0eSAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGZ4eHh4X2luMV9hbGFybV9hdHRyW10gPSB7CiAJU0VOU09SX0FUVFJfMihpbjFfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsCiAJCTAsIDEpLAogCVNFTlNPUl9BVFRSXzIoaW4xX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19pbl9iZWVwLCBzdG9yZV9pbl9iZWVwLApAQCAtMzgzLDYgKzM4Nyw3IEBACiAvKiBUZW1wIGFuZCBpbiBhdHRyIGZvciB0aGUgZjgwMDAKICAgIE5vdGUgb24gdGhlIGY4MDAwIHRlbXBfb3Z0IChjcml0KSBpcyB1c2VkIGFzIG1heCwgYW5kIHRlbXBfaGlnaCAobWF4KQogICAgaXMgdXNlZCBhcyBoeXN0ZXJlc2lzIHZhbHVlIHRvIGNsZWFyIGFsYXJtcworICAgQWxzbyBsaWtlIHRoZSBmNzE4NThmZyBpdHMgdGVtcGVyYXR1cmUgaW5kZXhlcyBzdGFydCBhdCAwCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmODAwMF9pbl90ZW1wX2F0dHJbXSA9IHsKIAlTRU5TT1JfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMCksCkBAIC00MTMsNjEgKzQxOCw3MCBAQAogfTsKIAogLyogRmFuIC8gUFdNIGF0dHIgY29tbW9uIHRvIGFsbCBtb2RlbHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmeHh4eF9mYW5fYXR0cltdID0geworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGZ4eHh4X2Zhbl9hdHRyWzRdWzZdID0geyB7CiAJU0VOU09SX0FUVFJfMihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCwgMCksCiAJU0VOU09SX0FUVFJfMihmYW4xX2Z1bGxfc3BlZWQsIFNfSVJVR098U19JV1VTUiwKIAkJICAgICAgc2hvd19mYW5fZnVsbF9zcGVlZCwKIAkJICAgICAgc3RvcmVfZmFuX2Z1bGxfc3BlZWQsIDAsIDApLAogCVNFTlNPUl9BVFRSXzIoZmFuMV9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDApLAotCVNFTlNPUl9BVFRSXzIoZmFuMl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDAsIDEpLAotCVNFTlNPUl9BVFRSXzIoZmFuMl9mdWxsX3NwZWVkLCBTX0lSVUdPfFNfSVdVU1IsCi0JCSAgICAgIHNob3dfZmFuX2Z1bGxfc3BlZWQsCi0JCSAgICAgIHN0b3JlX2Zhbl9mdWxsX3NwZWVkLCAwLCAxKSwKLQlTRU5TT1JfQVRUUl8yKGZhbjJfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAwLCAxKSwKLQlTRU5TT1JfQVRUUl8yKGZhbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAyKSwKLQlTRU5TT1JfQVRUUl8yKGZhbjNfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAotCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAotCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMiksCi0JU0VOU09SX0FUVFJfMihmYW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCwgMiksCi0KIAlTRU5TT1JfQVRUUl8yKHB3bTEsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMCksCiAJU0VOU09SX0FUVFJfMihwd20xX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCiAJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDApLAogCVNFTlNPUl9BVFRSXzIocHdtMV9pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAogCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAwKSwKLQlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCi0JCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKLQkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMCksCi0KK30sIHsKKwlTRU5TT1JfQVRUUl8yKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjJfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAorCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMSksCisJU0VOU09SX0FUVFJfMihmYW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCwgMSksCiAJU0VOU09SX0FUVFJfMihwd20yLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtLCBzdG9yZV9wd20sIDAsIDEpLAogCVNFTlNPUl9BVFRSXzIocHdtMl9lbmFibGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd21fZW5hYmxlLAogCQkgICAgICBzdG9yZV9wd21fZW5hYmxlLCAwLCAxKSwKIAlTRU5TT1JfQVRUUl8yKHB3bTJfaW50ZXJwb2xhdGUsIFNfSVJVR098U19JV1VTUiwKIAkJICAgICAgc2hvd19wd21faW50ZXJwb2xhdGUsIHN0b3JlX3B3bV9pbnRlcnBvbGF0ZSwgMCwgMSksCi0JU0VOU09SX0FUVFJfMihwd20yX2F1dG9fY2hhbm5lbHNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAotCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsCi0JCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsIDAsIDEpLAotCit9LCB7CisJU0VOU09SX0FUVFJfMihmYW4zX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCwgMiksCisJU0VOU09SX0FUVFJfMihmYW4zX2Z1bGxfc3BlZWQsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19mYW5fZnVsbF9zcGVlZCwKKwkJICAgICAgc3RvcmVfZmFuX2Z1bGxfc3BlZWQsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDIpLAogCVNFTlNPUl9BVFRSXzIocHdtMywgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAyKSwKIAlTRU5TT1JfQVRUUl8yKHB3bTNfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKIAkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMiksCiAJU0VOU09SX0FUVFJfMihwd20zX2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCiAJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDIpLAotCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKLQkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAotCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAyKSwKLX07Cit9LCB7CisJU0VOU09SX0FUVFJfMihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihmYW40X2Z1bGxfc3BlZWQsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19mYW5fZnVsbF9zcGVlZCwKKwkJICAgICAgc3RvcmVfZmFuX2Z1bGxfc3BlZWQsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIoZmFuNF9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKKwkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDMpLAorfSB9OwogCi0vKiBGYW4gLyBQV00gYXR0ciBmb3IgdGhlIGY3MTg2MmZnLCBsZXNzIHB3bXMgYW5kIGxlc3Mgem9uZXMgcGVyIHB3bSB0aGFuIHRoZQotICAgZjcxODgyZmcgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4NjJmZ19mYW5fYXR0cltdID0geworLyogQXR0ciBmb3IgbW9kZWxzIHdoaWNoIGNhbiBiZWVwIG9uIEZhbiBhbGFybSAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGZ4eHh4X2Zhbl9iZWVwX2F0dHJbXSA9IHsKIAlTRU5TT1JfQVRUUl8yKGZhbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAogCQlzdG9yZV9mYW5fYmVlcCwgMCwgMCksCiAJU0VOU09SX0FUVFJfMihmYW4yX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKIAkJc3RvcmVfZmFuX2JlZXAsIDAsIDEpLAogCVNFTlNPUl9BVFRSXzIoZmFuM19iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCiAJCXN0b3JlX2Zhbl9iZWVwLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjRfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAorCQlzdG9yZV9mYW5fYmVlcCwgMCwgMyksCit9OwogCisvKiBQV00gYXR0ciBmb3IgdGhlIGY3MTg2MmZnLCBmZXdlciBwd21zIGFuZCBmZXdlciB6b25lcyBwZXIgcHdtIHRoYW4gdGhlCisgICBmNzE4NThmZyAvIGY3MTg4MmZnIC8gZjcxODg5ZmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4NjJmZ19hdXRvX3B3bV9hdHRyW10gPSB7CisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fY2hhbm5lbHNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsIDAsIDApLAogCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKIAkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKIAkJICAgICAgMSwgMCksCkBAIC00ODcsNiArNTAxLDkgQEAKIAlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMCksCiAKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMSksCiAJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAogCQkgICAgICAxLCAxKSwKQEAgLTUwNiw2ICs1MjMsOSBAQAogCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml90ZW1wX2h5c3QsIFNfSVJVR08sCiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAxKSwKIAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAyKSwKIAlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCiAJCSAgICAgIDEsIDIpLApAQCAtNTI2LDggKzU0NiwxMSBAQAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCiB9OwogCi0vKiBGYW4gLyBQV00gYXR0ciBjb21tb24gdG8gYm90aCB0aGUgZjcxODgyZmcgYW5kIGY3MTg1OGZnICovCi1zdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjcxODgyZmdfZjcxODU4ZmdfZmFuX2F0dHJbXSA9IHsKKy8qIFBXTSBhdHRyIGNvbW1vbiB0byB0aGUgZjcxODU4ZmcsIGY3MTg4MmZnIGFuZCBmNzE4ODlmZyAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGZ4eHh4X2F1dG9fcHdtX2F0dHJbNF1bMTRdID0geyB7CisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fY2hhbm5lbHNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsIDAsIDApLAogCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKIAkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKIAkJICAgICAgMCwgMCksCkBAIC01NjUsNyArNTg4LDEwIEBACiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAwKSwKIAlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMCksCi0KK30sIHsKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMSksCiAJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAogCQkgICAgICAwLCAxKSwKQEAgLTYwMyw3ICs2MjksMTAgQEAKIAkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDEpLAogCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAxKSwKLQorfSwgeworCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAyKSwKIAlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCiAJCSAgICAgIDAsIDIpLApAQCAtNjQxLDMwICs2NzAsNyBAQAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMiwgMiksCiAJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQ0X3RlbXBfaHlzdCwgU19JUlVHTywKIAkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDMsIDIpLAotfTsKLQotLyogRmFuIC8gUFdNIGF0dHIgZm91bmQgb24gdGhlIGY3MTg4MmZnIGJ1dCBub3Qgb24gdGhlIGY3MTg1OGZnICovCi1zdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjcxODgyZmdfZmFuX2F0dHJbXSA9IHsKLQlTRU5TT1JfQVRUUl8yKGZhbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAotCQlzdG9yZV9mYW5fYmVlcCwgMCwgMCksCi0JU0VOU09SX0FUVFJfMihmYW4yX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKLQkJc3RvcmVfZmFuX2JlZXAsIDAsIDEpLAotCVNFTlNPUl9BVFRSXzIoZmFuM19iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCi0JCXN0b3JlX2Zhbl9iZWVwLCAwLCAyKSwKLQotCVNFTlNPUl9BVFRSXzIoZmFuNF9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDAsIDMpLAotCVNFTlNPUl9BVFRSXzIoZmFuNF9mdWxsX3NwZWVkLCBTX0lSVUdPfFNfSVdVU1IsCi0JCSAgICAgIHNob3dfZmFuX2Z1bGxfc3BlZWQsCi0JCSAgICAgIHN0b3JlX2Zhbl9mdWxsX3NwZWVkLCAwLCAzKSwKLQlTRU5TT1JfQVRUUl8yKGZhbjRfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAotCQlzdG9yZV9mYW5fYmVlcCwgMCwgMyksCi0JU0VOU09SX0FUVFJfMihmYW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCwgMyksCi0KLQlTRU5TT1JfQVRUUl8yKHB3bTQsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMyksCi0JU0VOU09SX0FUVFJfMihwd200X2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCi0JCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDMpLAotCVNFTlNPUl9BVFRSXzIocHdtNF9pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAotCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAzKSwKK30sIHsKIAlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKIAkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMyksCkBAIC03MDUsMTQgKzcxMSwyMCBAQAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMiwgMyksCiAJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQ0X3RlbXBfaHlzdCwgU19JUlVHTywKIAkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDMsIDMpLAotfTsKK30gfTsKIAotLyogRmFuIC8gUFdNIGF0dHIgZm9yIHRoZSBmODAwMCwgem9uZXMgbWFwcGVkIHRvIHRlbXAgaW5zdGVhZCBvZiB0byBwd20hCi0gICBBbHNvIHRoZSByZWdpc3RlciBibG9jayBhdCBvZmZzZXQgQTAgbWFwcyB0byBURU1QMSAoc28gb3VyIHRlbXAyLCBhcyB0aGUKLSAgIEY4MDAwIHN0YXJ0cyBjb3VudGluZyB0ZW1wcyBhdCAwKSwgQjAgbWFwcyB0aGUgVEVNUDIgYW5kIEMwIG1hcHMgdG8gVEVNUDAgKi8KKy8qIEZhbiBhdHRyIHNwZWNpZmljIHRvIHRoZSBmODAwMCAoNHRoIGZhbiBpbnB1dCBjYW4gb25seSBtZWFzdXJlIHNwZWVkKSAqLwogc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGY4MDAwX2Zhbl9hdHRyW10gPSB7CiAJU0VOU09SX0FUVFJfMihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCwgMyksCit9OwogCisvKiBQV00gYXR0ciBmb3IgdGhlIGY4MDAwLCB6b25lcyBtYXBwZWQgdG8gdGVtcCBpbnN0ZWFkIG9mIHRvIHB3bSEKKyAgIEFsc28gdGhlIHJlZ2lzdGVyIGJsb2NrIGF0IG9mZnNldCBBMCBtYXBzIHRvIFRFTVAxIChzbyBvdXIgdGVtcDIsIGFzIHRoZQorICAgRjgwMDAgc3RhcnRzIGNvdW50aW5nIHRlbXBzIGF0IDApLCBCMCBtYXBzIHRoZSBURU1QMiBhbmQgQzAgbWFwcyB0byBURU1QMCAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGY4MDAwX2F1dG9fcHdtX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMCksCiAJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKIAkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKIAkJICAgICAgMCwgMiksCkBAIC03NTEsNiArNzYzLDkgQEAKIAlTRU5TT1JfQVRUUl8yKHRlbXAxX2F1dG9fcG9pbnQ0X3RlbXBfaHlzdCwgU19JUlVHTywKIAkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDMsIDIpLAogCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fY2hhbm5lbHNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X2NoYW5uZWwsIDAsIDEpLAogCVNFTlNPUl9BVFRSXzIodGVtcDJfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCiAJCSAgICAgIDAsIDApLApAQCAtNzg5LDYgKzgwNCw5IEBACiAJU0VOU09SX0FUVFJfMih0ZW1wMl9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCiAJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKIAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAyKSwKIAlTRU5TT1JfQVRUUl8yKHRlbXAzX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAogCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAogCQkgICAgICAwLCAxKSwKQEAgLTkyOSw3ICs5NDcsNyBAQAogCS8qIFVwZGF0ZSBvbmNlIGV2ZXJ5IDYwIHNlY29uZHMgKi8KIAlpZiAoIHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF9saW1pdHMgKyA2MCAqIEhaICkgfHwKIAkJCSFkYXRhLT52YWxpZCkgewotCQlpZiAoZGF0YS0+dHlwZSA9PSBmNzE4ODJmZykgeworCQlpZiAoZGF0YS0+dHlwZSA9PSBmNzE4ODJmZyB8fCBkYXRhLT50eXBlID09IGY3MTg4OWZnKSB7CiAJCQlkYXRhLT5pbjFfbWF4ID0KIAkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfSU4xX0hJR0gpOwogCQkJZGF0YS0+aW5fYmVlcCA9CkBAIC05NTEsNyArOTY5LDggQEAKIAkJCQkJCUY3MTg4MkZHX1JFR19URU1QX0hZU1QoMSkpOwogCQl9CiAKLQkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODYyZmcgfHwgZGF0YS0+dHlwZSA9PSBmNzE4ODJmZykgeworCQlpZiAoZGF0YS0+dHlwZSA9PSBmNzE4NjJmZyB8fCBkYXRhLT50eXBlID09IGY3MTg4MmZnIHx8CisJCSAgICBkYXRhLT50eXBlID09IGY3MTg4OWZnKSB7CiAJCQlkYXRhLT5mYW5fYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfRkFOX0JFRVApOwogCQkJZGF0YS0+dGVtcF9iZWVwID0gZjcxODgyZmdfcmVhZDgoZGF0YSwKQEAgLTk2MSwxNSArOTgwLDMzIEBACiAJCQlkYXRhLT50ZW1wX3R5cGVbMl0gPSAocmVnICYgMHgwNCkgPyAyIDogNDsKIAkJCWRhdGEtPnRlbXBfdHlwZVszXSA9IChyZWcgJiAweDA4KSA/IDIgOiA0OwogCQl9Ci0JCXJlZzIgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUEVDSSk7Ci0JCWlmICgocmVnMiAmIDB4MDMpID09IDB4MDEpCi0JCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA2IC8qIFBFQ0kgKi87Ci0JCWVsc2UgaWYgKChyZWcyICYgMHgwMykgPT0gMHgwMikKLQkJCWRhdGEtPnRlbXBfdHlwZVsxXSA9IDUgLyogQU1EU0kgKi87Ci0JCWVsc2UgaWYgKGRhdGEtPnR5cGUgPT0gZjcxODYyZmcgfHwgZGF0YS0+dHlwZSA9PSBmNzE4ODJmZykKLQkJCWRhdGEtPnRlbXBfdHlwZVsxXSA9IChyZWcgJiAweDAyKSA/IDIgOiA0OwotCQllbHNlCi0JCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSAyOyAvKiBPbmx5IHN1cHBvcnRzIEJKVCAqLworCQkvKiBEZXRlcm1pbmUgdGVtcCBpbmRleCAxIHNlbnNvciB0eXBlICovCisJCWlmIChkYXRhLT50eXBlID09IGY3MTg4OWZnKSB7CisJCQlyZWcyID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1NUQVJUKTsKKwkJCXN3aXRjaCAoKHJlZzIgJiAweDYwKSA+PiA1KSB7CisJCQljYXNlIDB4MDA6IC8qIEJKVCAvIFRoZXJtaXN0b3IgKi8KKwkJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSAocmVnICYgMHgwMikgPyAyIDogNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMTogLyogQU1EU0kgKi8KKwkJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA1OworCQkJCWJyZWFrOworCQkJY2FzZSAweDAyOiAvKiBQRUNJICovCisJCQljYXNlIDB4MDM6IC8qIEliZXggUGVhayA/PyBSZXBvcnQgYXMgUEVDSSBmb3Igbm93ICovCisJCQkJZGF0YS0+dGVtcF90eXBlWzFdID0gNjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlZzIgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUEVDSSk7CisJCQlpZiAoKHJlZzIgJiAweDAzKSA9PSAweDAxKQorCQkJCWRhdGEtPnRlbXBfdHlwZVsxXSA9IDY7IC8qIFBFQ0kgKi8KKwkJCWVsc2UgaWYgKChyZWcyICYgMHgwMykgPT0gMHgwMikKKwkJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA1OyAvKiBBTURTSSAqLworCQkJZWxzZSBpZiAoZGF0YS0+dHlwZSA9PSBmNzE4NjJmZyB8fAorCQkJCSBkYXRhLT50eXBlID09IGY3MTg4MmZnKQorCQkJCWRhdGEtPnRlbXBfdHlwZVsxXSA9IChyZWcgJiAweDAyKSA/IDIgOiA0OworCQkJZWxzZSAvKiBmNzE4NThmZyBhbmQgZjgwMDAgb25seSBzdXBwb3J0IEJKVCAqLworCQkJCWRhdGEtPnRlbXBfdHlwZVsxXSA9IDI7CisJCX0KIAogCQlkYXRhLT5wd21fZW5hYmxlID0gZjcxODgyZmdfcmVhZDgoZGF0YSwKIAkJCQkJCSAgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUpOwpAQCAtMTA0Niw3ICsxMDgzLDcgQEAKIAkJaWYgKGRhdGEtPnR5cGUgPT0gZjgwMDApCiAJCQlkYXRhLT5mYW5bM10gPSBmNzE4ODJmZ19yZWFkMTYoZGF0YSwKIAkJCQkJCUY3MTg4MkZHX1JFR19GQU4oMykpOwotCQlpZiAoZGF0YS0+dHlwZSA9PSBmNzE4ODJmZykKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODgyZmcgfHwgZGF0YS0+dHlwZSA9PSBmNzE4ODlmZykKIAkJCWRhdGEtPmluX3N0YXR1cyA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfSU5fU1RBVFVTKTsKIAkJZm9yIChuciA9IDA7IG5yIDwgbnJfaW5zOyBucisrKQpAQCAtMTc2NCw3ICsxODAxLDExIEBACiAJaW50IHB3bSA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CiAJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKLQl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKKworCWlmIChkYXRhLT50eXBlID09IGY3MTg4OWZnKQorCQl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgLTEyOCwgMTI3KTsKKwllbHNlCisJCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAwLCAxMjcpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBGNzE4ODJGR19SRUdfUE9JTlRfVEVNUChwd20sIHBvaW50KSwgdmFsKTsKQEAgLTE3OTQsNiArMTgzNSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBmNzE4ODJmZ19yZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciwgaW50IGNvdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmYXR0cltpXS5kZXZfYXR0cik7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGY3MTg4MmZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGE7CkBAIC0xODQ2LDE2ICsxODk2LDE3IEBACiAJCQkJCUFSUkFZX1NJWkUoZjcxODU4ZmdfaW5fdGVtcF9hdHRyKSk7CiAJCQlicmVhazsKIAkJY2FzZSBmNzE4ODJmZzoKKwkJY2FzZSBmNzE4ODlmZzoKIAkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAotCQkJCQlmNzE4ODJmZ19pbl90ZW1wX2F0dHIsCi0JCQkJCUFSUkFZX1NJWkUoZjcxODgyZmdfaW5fdGVtcF9hdHRyKSk7CisJCQkJCWZ4eHh4X2luMV9hbGFybV9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2luMV9hbGFybV9hdHRyKSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCQkJLyogZmFsbCB0aHJvdWdoISAqLwogCQljYXNlIGY3MTg2MmZnOgogCQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsCi0JCQkJCWY3MTh4MmZnX2luX3RlbXBfYXR0ciwKLQkJCQkJQVJSQVlfU0laRShmNzE4eDJmZ19pbl90ZW1wX2F0dHIpKTsKKwkJCQkJZnh4eHhfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2luX3RlbXBfYXR0cikpOwogCQkJYnJlYWs7CiAJCWNhc2UgZjgwMDA6CiAJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKQEAgLTE4ODMsNiArMTkzNCw3IEBACiAJCQllcnIgPSAoZGF0YS0+cHdtX2VuYWJsZSAmIDB4MTUpICE9IDB4MTU7CiAJCQlicmVhazsKIAkJY2FzZSBmNzE4ODJmZzoKKwkJY2FzZSBmNzE4ODlmZzoKIAkJCWVyciA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBmODAwMDoKQEAgLTE4OTcsMzQgKzE5NDksNTUgQEAKIAkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCQl9CiAKLQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsIGZ4eHh4X2Zhbl9hdHRyLAotCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2Zhbl9hdHRyKSk7CisJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LCAmZnh4eHhfZmFuX2F0dHJbMF1bMF0sCisJCQkJQVJSQVlfU0laRShmeHh4eF9mYW5fYXR0clswXSkgKiBucl9mYW5zKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCisJCWlmIChkYXRhLT50eXBlID09IGY3MTg2MmZnIHx8IGRhdGEtPnR5cGUgPT0gZjcxODgyZmcgfHwKKwkJICAgIGRhdGEtPnR5cGUgPT0gZjcxODg5ZmcpIHsKKwkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCQlmeHh4eF9mYW5fYmVlcF9hdHRyLCBucl9mYW5zKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CisJCX0KKwogCQlzd2l0Y2ggKGRhdGEtPnR5cGUpIHsKIAkJY2FzZSBmNzE4NjJmZzoKIAkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAotCQkJCQlmNzE4NjJmZ19mYW5fYXR0ciwKLQkJCQkJQVJSQVlfU0laRShmNzE4NjJmZ19mYW5fYXR0cikpOwotCQkJYnJlYWs7Ci0JCWNhc2UgZjcxODgyZmc6Ci0JCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKLQkJCQkJZjcxODgyZmdfZmFuX2F0dHIsCi0JCQkJCUFSUkFZX1NJWkUoZjcxODgyZmdfZmFuX2F0dHIpKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7Ci0JCQkvKiBmYWxsIHRocm91Z2ghICovCi0JCWNhc2UgZjcxODU4Zmc6Ci0JCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKLQkJCQkJZjcxODgyZmdfZjcxODU4ZmdfZmFuX2F0dHIsCi0JCQkJCUFSUkFZX1NJWkUoZjcxODgyZmdfZjcxODU4ZmdfZmFuX2F0dHIpKTsKKwkJCQkJZjcxODYyZmdfYXV0b19wd21fYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4NjJmZ19hdXRvX3B3bV9hdHRyKSk7CiAJCQlicmVhazsKIAkJY2FzZSBmODAwMDoKIAkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAogCQkJCQlmODAwMF9mYW5fYXR0ciwKIAkJCQkJQVJSQVlfU0laRShmODAwMF9mYW5fYXR0cikpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKwkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCQlmODAwMF9hdXRvX3B3bV9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2F1dG9fcHdtX2F0dHIpKTsKIAkJCWJyZWFrOworCQljYXNlIGY3MTg4OWZnOgorCQkJZm9yIChpID0gMDsgaSA8IG5yX2ZhbnM7IGkrKykgeworCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbaV0gPQorCQkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcoaSkpOworCQkJCWlmIChkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW2ldICYgMHg4MCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaSAhPSBucl9mYW5zKSB7CisJCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkJICJBdXRvIHB3bSBjb250cm9sbGVkIGJ5IHJhdyBkaWdpdGFsICIKKwkJCQkJICJkYXRhLCBkaXNhYmxpbmcgcHdtIGF1dG9fcG9pbnQgIgorCQkJCQkgInN5c2ZzIGF0dHJpYnV0ZXNcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6IC8qIGY3MTg1OGZnIC8gZjcxODgyZmcgKi8KKwkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCSZmeHh4eF9hdXRvX3B3bV9hdHRyWzBdWzBdLAorCQkJCUFSUkFZX1NJWkUoZnh4eHhfYXV0b19wd21fYXR0clswXSkgKiBucl9mYW5zKTsKIAkJfQogCQlpZiAoZXJyKQogCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CkBAIC0xOTU0LDMzICsyMDI3LDc2IEBACiAKIHN0YXRpYyBpbnQgZjcxODgyZmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGk7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgbnJfZmFucyA9IChkYXRhLT50eXBlID09IGY3MTg4MmZnKSA/IDQgOiAzOworCXU4IHN0YXJ0X3JlZyA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19TVEFSVCk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlpZiAoZGF0YS0+aHdtb25fZGV2KQogCQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCi0JLyogTm90ZSB3ZSBhcmUgbm90IGxvb3Bpbmcgb3ZlciBhbGwgYXR0ciBhcnJheXMgd2UgaGF2ZSBhcyB0aGUgb25lcwotCSAgIGJlbG93IGFyZSBzdXBlcnNldHMgb2YgdGhlIG9uZXMgc2tpcHBlZC4gKi8KIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxOHgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCQkJJmY3MTh4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7CisJaWYgKHN0YXJ0X3JlZyAmIDB4MDEpIHsKKwkJc3dpdGNoIChkYXRhLT50eXBlKSB7CisJCWNhc2UgZjcxODU4Zmc6CisJCQlpZiAoZGF0YS0+dGVtcF9jb25maWcgJiAweDEwKQorCQkJCWY3MTg4MmZnX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCQlmODAwMF9pbl90ZW1wX2F0dHIsCisJCQkJCUFSUkFZX1NJWkUoZjgwMDBfaW5fdGVtcF9hdHRyKSk7CisJCQllbHNlCisJCQkJZjcxODgyZmdfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY3MTg1OGZnX2luX3RlbXBfYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4NThmZ19pbl90ZW1wX2F0dHIpKTsKKwkJCWJyZWFrOworCQljYXNlIGY3MTg4MmZnOgorCQljYXNlIGY3MTg4OWZnOgorCQkJZjcxODgyZmdfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWZ4eHh4X2luMV9hbGFybV9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2luMV9hbGFybV9hdHRyKSk7CisJCQkvKiBmYWxsIHRocm91Z2ghICovCisJCWNhc2UgZjcxODYyZmc6CisJCQlmNzE4ODJmZ19yZW1vdmVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZnh4eHhfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjgwMDA6CisJCQlmNzE4ODJmZ19yZW1vdmVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjgwMDBfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19pbl90ZW1wX2F0dHIpOyBpKyspCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LAotCQkJCQkmZjcxODgyZmdfaW5fdGVtcF9hdHRyW2ldLmRldl9hdHRyKTsKKwlpZiAoc3RhcnRfcmVnICYgMHgwMikgeworCQlmNzE4ODJmZ19yZW1vdmVfc3lzZnNfZmlsZXMocGRldiwgJmZ4eHh4X2Zhbl9hdHRyWzBdWzBdLAorCQkJCUFSUkFZX1NJWkUoZnh4eHhfZmFuX2F0dHJbMF0pICogbnJfZmFucyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmeHh4eF9mYW5fYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmeHh4eF9mYW5fYXR0cltpXS5kZXZfYXR0cik7CisJCWlmIChkYXRhLT50eXBlID09IGY3MTg2MmZnIHx8IGRhdGEtPnR5cGUgPT0gZjcxODgyZmcgfHwKKwkJICAgIGRhdGEtPnR5cGUgPT0gZjcxODg5ZmcpCisJCQlmNzE4ODJmZ19yZW1vdmVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZnh4eHhfZmFuX2JlZXBfYXR0ciwgbnJfZmFucyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19mYW5fYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19mYW5fYXR0cltpXS5kZXZfYXR0cik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmODAwMF9mYW5fYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmODAwMF9mYW5fYXR0cltpXS5kZXZfYXR0cik7CisJCXN3aXRjaCAoZGF0YS0+dHlwZSkgeworCQljYXNlIGY3MTg2MmZnOgorCQkJZjcxODgyZmdfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY3MTg2MmZnX2F1dG9fcHdtX2F0dHIsCisJCQkJCUFSUkFZX1NJWkUoZjcxODYyZmdfYXV0b19wd21fYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjgwMDA6CisJCQlmNzE4ODJmZ19yZW1vdmVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjgwMDBfZmFuX2F0dHIsCisJCQkJCUFSUkFZX1NJWkUoZjgwMDBfZmFuX2F0dHIpKTsKKwkJCWY3MTg4MmZnX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCQlmODAwMF9hdXRvX3B3bV9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2F1dG9fcHdtX2F0dHIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBmNzE4NThmZyAvIGY3MTg4MmZnIC8gZjcxODg5ZmcgKi8KKwkJCWY3MTg4MmZnX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCSZmeHh4eF9hdXRvX3B3bV9hdHRyWzBdWzBdLAorCQkJCUFSUkFZX1NJWkUoZnh4eHhfYXV0b19wd21fYXR0clswXSkgKiBucl9mYW5zKTsKKwkJfQorCX0KIAogCWtmcmVlKGRhdGEpOwogCkBAIC0yMDEyLDExICsyMTI4LDE1IEBACiAJY2FzZSBTSU9fRjcxODgyX0lEOgogCQlzaW9fZGF0YS0+dHlwZSA9IGY3MTg4MmZnOwogCQlicmVhazsKKwljYXNlIFNJT19GNzE4ODlfSUQ6CisJCXNpb19kYXRhLT50eXBlID0gZjcxODg5Zmc7CisJCWJyZWFrOwogCWNhc2UgU0lPX0Y4MDAwX0lEOgogCQlzaW9fZGF0YS0+dHlwZSA9IGY4MDAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogVW5zdXBwb3J0ZWQgRmludGVrIGRldmljZVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBVbnN1cHBvcnRlZCBGaW50ZWsgZGV2aWNlOiAlMDR4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClkZXZpZCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjc1Mzc1cy5jIGIvZHJpdmVycy9od21vbi9mNzUzNzVzLmMKaW5kZXggZTIxMDdlNS4uNDBkZmJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mNzUzNzVzLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzUzNzVzLmMKQEAgLTY4MSwzMCArNjgxLDIwIEBACiAJCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKLQl1OCB2ZXJzaW9uID0gMDsKLQljb25zdCBjaGFyICpuYW1lID0gIiI7CisJdTE2IHZlbmRpZCwgY2hpcGlkOworCXU4IHZlcnNpb247CisJY29uc3QgY2hhciAqbmFtZTsKIAotCWlmIChraW5kIDwgMCkgewotCQl1MTYgdmVuZGlkID0gZjc1Mzc1X3JlYWQxNihjbGllbnQsIEY3NTM3NV9SRUdfVkVORE9SKTsKLQkJdTE2IGNoaXBpZCA9IGY3NTM3NV9yZWFkMTYoY2xpZW50LCBGNzUzNzVfQ0hJUF9JRCk7Ci0JCXZlcnNpb24gPSBmNzUzNzVfcmVhZDgoY2xpZW50LCBGNzUzNzVfUkVHX1ZFUlNJT04pOwotCQlpZiAoY2hpcGlkID09IDB4MDMwNiAmJiB2ZW5kaWQgPT0gMHgxOTM0KSB7Ci0JCQlraW5kID0gZjc1Mzc1OwotCQl9IGVsc2UgaWYgKGNoaXBpZCA9PSAweDAyMDQgJiYgdmVuZGlkID09IDB4MTkzNCkgewotCQkJa2luZCA9IGY3NTM3MzsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwKLQkJCQkiZmFpbGVkLCUwMlgsJTAyWCwlMDJYXG4iLAotCQkJCWNoaXBpZCwgdmVyc2lvbiwgdmVuZGlkKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaWYgKGtpbmQgPT0gZjc1Mzc1KSB7CisJdmVuZGlkID0gZjc1Mzc1X3JlYWQxNihjbGllbnQsIEY3NTM3NV9SRUdfVkVORE9SKTsKKwljaGlwaWQgPSBmNzUzNzVfcmVhZDE2KGNsaWVudCwgRjc1Mzc1X0NISVBfSUQpOworCWlmIChjaGlwaWQgPT0gMHgwMzA2ICYmIHZlbmRpZCA9PSAweDE5MzQpCiAJCW5hbWUgPSAiZjc1Mzc1IjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gZjc1MzczKSB7CisJZWxzZSBpZiAoY2hpcGlkID09IDB4MDIwNCAmJiB2ZW5kaWQgPT0gMHgxOTM0KQogCQluYW1lID0gImY3NTM3MyI7Ci0JfQorCWVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2ZXJzaW9uID0gZjc1Mzc1X3JlYWQ4KGNsaWVudCwgRjc1Mzc1X1JFR19WRVJTSU9OKTsKIAlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAiZm91bmQgJXMgdmVyc2lvbjogJTAyWFxuIiwgbmFtZSwgdmVyc2lvbik7CiAJc3RybGNweShpbmZvLT50eXBlLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mc2NobWQuYyBiL2RyaXZlcnMvaHdtb24vZnNjaG1kLmMKaW5kZXggZGExYjFmOS4uMjgxODI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mc2NobWQuYworKysgYi9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jCkBAIC0xMDAwLDQzICsxMDAwLDM4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGZzY2htZF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGtpbmQsCitzdGF0aWMgaW50IGZzY2htZF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IF9raW5kLAogCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKKwllbnVtIGNoaXBzIGtpbmQ7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCWNoYXIgaWRbNF07CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogRGV0ZWN0ICYgSWRlbnRpZnkgdGhlIGNoaXAgKi8KLQlpZiAoa2luZCA8PSAwKSB7Ci0JCWNoYXIgaWRbNF07CisJaWRbMF0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGU0NITURfUkVHX0lERU5UXzApOworCWlkWzFdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlNDSE1EX1JFR19JREVOVF8xKTsKKwlpZFsyXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEZTQ0hNRF9SRUdfSURFTlRfMik7CisJaWRbM10gPSAnXDAnOwogCi0JCWlkWzBdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQlGU0NITURfUkVHX0lERU5UXzApOwotCQlpZFsxXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJRlNDSE1EX1JFR19JREVOVF8xKTsKLQkJaWRbMl0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCUZTQ0hNRF9SRUdfSURFTlRfMik7Ci0JCWlkWzNdID0gJ1wwJzsKLQotCQlpZiAoIXN0cmNtcChpZCwgIlBFRyIpKQotCQkJa2luZCA9IGZzY3BvczsKLQkJZWxzZSBpZiAoIXN0cmNtcChpZCwgIkhFUiIpKQotCQkJa2luZCA9IGZzY2hlcjsKLQkJZWxzZSBpZiAoIXN0cmNtcChpZCwgIlNDWSIpKQotCQkJa2luZCA9IGZzY3NjeTsKLQkJZWxzZSBpZiAoIXN0cmNtcChpZCwgIkhSQyIpKQotCQkJa2luZCA9IGZzY2hyYzsKLQkJZWxzZSBpZiAoIXN0cmNtcChpZCwgIkhNRCIpKQotCQkJa2luZCA9IGZzY2htZDsKLQkJZWxzZSBpZiAoIXN0cmNtcChpZCwgIkhEUyIpKQotCQkJa2luZCA9IGZzY2hkczsKLQkJZWxzZSBpZiAoIXN0cmNtcChpZCwgIlNZTCIpKQotCQkJa2luZCA9IGZzY3N5bDsKLQkJZWxzZQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlmICghc3RyY21wKGlkLCAiUEVHIikpCisJCWtpbmQgPSBmc2Nwb3M7CisJZWxzZSBpZiAoIXN0cmNtcChpZCwgIkhFUiIpKQorCQlraW5kID0gZnNjaGVyOworCWVsc2UgaWYgKCFzdHJjbXAoaWQsICJTQ1kiKSkKKwkJa2luZCA9IGZzY3NjeTsKKwllbHNlIGlmICghc3RyY21wKGlkLCAiSFJDIikpCisJCWtpbmQgPSBmc2NocmM7CisJZWxzZSBpZiAoIXN0cmNtcChpZCwgIkhNRCIpKQorCQlraW5kID0gZnNjaG1kOworCWVsc2UgaWYgKCFzdHJjbXAoaWQsICJIRFMiKSkKKwkJa2luZCA9IGZzY2hkczsKKwllbHNlIGlmICghc3RyY21wKGlkLCAiU1lMIikpCisJCWtpbmQgPSBmc2NzeWw7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgZnNjaG1kX2lkW2tpbmQgLSAxXS5uYW1lLCBJMkNfTkFNRV9TSVpFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9nbDUxOHNtLmMgYi9kcml2ZXJzL2h3bW9uL2dsNTE4c20uYwppbmRleCA3ODIwZGY0Li4xZDY5NDU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKQEAgLTQ4OCwzNiArNDg4LDIxIEBACiAJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwotCWludCBpOworCWludCByZXY7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CiAJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCi0KLQlpZiAoa2luZCA8IDApIHsKLQkJaWYgKChnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0NISVBfSUQpICE9IDB4ODApCi0JCSB8fCAoZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19DT05GKSAmIDB4ODApKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlmICgoZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19DSElQX0lEKSAhPSAweDgwKQorCSB8fCAoZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19DT05GKSAmIDB4ODApKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLwotCWlmIChraW5kIDw9IDApIHsKLQkJaSA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfUkVWSVNJT04pOwotCQlpZiAoaSA9PSAweDAwKSB7Ci0JCQlraW5kID0gZ2w1MThzbV9yMDA7Ci0JCX0gZWxzZSBpZiAoaSA9PSAweDgwKSB7Ci0JCQlraW5kID0gZ2w1MThzbV9yODA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoa2luZCA8PSAwKQotCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCi0JCQkJICAgICJJZ25vcmluZyAnZm9yY2UnIHBhcmFtZXRlciBmb3IgdW5rbm93biAiCi0JCQkJICAgICJjaGlwIGF0IGFkYXB0ZXIgJWQsIGFkZHJlc3MgMHglMDJ4XG4iLAotCQkJCSAgICBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgY2xpZW50LT5hZGRyKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQorCXJldiA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfUkVWSVNJT04pOworCWlmIChyZXYgIT0gMHgwMCAmJiByZXYgIT0gMHg4MCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzdHJsY3B5KGluZm8tPnR5cGUsICJnbDUxOHNtIiwgSTJDX05BTUVfU0laRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZ2w1MjBzbS5jIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKaW5kZXggMTk2MTZmMi4uOTJiNTcyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKQEAgLTY5MSwxMyArNjkxLDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCWlmICgoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DSElQX0lEKSAhPSAweDIwKSB8fAotCQkgICAgKChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1JFVklTSU9OKSAmIDB4N2YpICE9IDB4MDApIHx8Ci0JCSAgICAoKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORikgJiAweDgwKSAhPSAweDAwKSkgewotCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVbmtub3duIGNoaXAgdHlwZSwgc2tpcHBpbmdcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwlpZiAoKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ0hJUF9JRCkgIT0gMHgyMCkgfHwKKwkgICAgKChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1JFVklTSU9OKSAmIDB4N2YpICE9IDB4MDApIHx8CisJICAgICgoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GKSAmIDB4ODApICE9IDB4MDApKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVW5rbm93biBjaGlwIHR5cGUsIHNraXBwaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc3RybGNweShpbmZvLT50eXBlLCAiZ2w1MjBzbSIsIEkyQ19OQU1FX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pdDg3LmMgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwppbmRleCBhMzc0OWNiLi4wZmZlODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2l0ODcuYworKysgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwpAQCAtMTI0LDYgKzEyNCw4IEBACiAjZGVmaW5lIElUODdfQkFTRV9SRUcgMHg2MAogCiAvKiBMb2dpY2FsIGRldmljZSA3IHJlZ2lzdGVycyAoSVQ4NzEyRiBhbmQgbGF0ZXIpICovCisjZGVmaW5lIElUODdfU0lPX0dQSU8zX1JFRwkweDI3CisjZGVmaW5lIElUODdfU0lPX0dQSU81X1JFRwkweDI5CiAjZGVmaW5lIElUODdfU0lPX1BJTlgyX1JFRwkweDJjCS8qIFBpbiBzZWxlY3Rpb24gKi8KICNkZWZpbmUgSVQ4N19TSU9fVklEX1JFRwkweGZjCS8qIFZJRCB2YWx1ZSAqLwogCkBAIC0yNDQsNyArMjQ2LDkgQEAKIAkvKiBWYWx1ZXMgcmVhZCBmcm9tIFN1cGVyLUkvTyBjb25maWcgc3BhY2UgKi8KIAl1OCByZXZpc2lvbjsKIAl1OCB2aWRfdmFsdWU7Ci0JLyogVmFsdWVzIHNldCBiYXNlZCBvbiBETUkgc3RyaW5ncyAqLworCS8qIEZlYXR1cmVzIHNraXBwZWQgYmFzZWQgb24gY29uZmlnIG9yIERNSSAqLworCXU4IHNraXBfdmlkOworCXU4IHNraXBfZmFuOwogCXU4IHNraXBfcHdtOwogfTsKIApAQCAtMTAyOCwxMSArMTAzMiwzNSBAQAogCQljaGlwX3R5cGUsICphZGRyZXNzLCBzaW9fZGF0YS0+cmV2aXNpb24pOwogCiAJLyogUmVhZCBHUElPIGNvbmZpZyBhbmQgVklEIHZhbHVlIGZyb20gTEROIDcgKEdQSU8pICovCi0JaWYgKHNpb19kYXRhLT50eXBlICE9IGl0ODcpIHsKKwlpZiAoc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NykgeworCQkvKiBUaGUgSVQ4NzA1RiBkb2Vzbid0IGhhdmUgVklEIHBpbnMgYXQgYWxsICovCisJCXNpb19kYXRhLT5za2lwX3ZpZCA9IDE7CisJfSBlbHNlIHsKIAkJaW50IHJlZzsKIAogCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKLQkJaWYgKHNpb19kYXRhLT50eXBlID09IGl0ODcxOCB8fCBzaW9fZGF0YS0+dHlwZSA9PSBpdDg3MjApCisJCS8qIFdlIG5lZWQgYXQgbGVhc3QgNCBWSUQgcGlucyAqLworCQlyZWcgPSBzdXBlcmlvX2luYihJVDg3X1NJT19HUElPM19SRUcpOworCQlpZiAocmVnICYgMHgwZikgeworCQkJcHJfaW5mbygiaXQ4NzogVklEIGlzIGRpc2FibGVkIChwaW5zIHVzZWQgZm9yIEdQSU8pXG4iKTsKKwkJCXNpb19kYXRhLT5za2lwX3ZpZCA9IDE7CisJCX0KKworCQkvKiBDaGVjayBpZiBmYW4zIGlzIHRoZXJlIG9yIG5vdCAqLworCQlpZiAocmVnICYgKDEgPDwgNikpCisJCQlzaW9fZGF0YS0+c2tpcF9wd20gfD0gKDEgPDwgMik7CisJCWlmIChyZWcgJiAoMSA8PCA3KSkKKwkJCXNpb19kYXRhLT5za2lwX2ZhbiB8PSAoMSA8PCAyKTsKKworCQkvKiBDaGVjayBpZiBmYW4yIGlzIHRoZXJlIG9yIG5vdCAqLworCQlyZWcgPSBzdXBlcmlvX2luYihJVDg3X1NJT19HUElPNV9SRUcpOworCQlpZiAocmVnICYgKDEgPDwgMSkpCisJCQlzaW9fZGF0YS0+c2tpcF9wd20gfD0gKDEgPDwgMSk7CisJCWlmIChyZWcgJiAoMSA8PCAyKSkKKwkJCXNpb19kYXRhLT5za2lwX2ZhbiB8PSAoMSA8PCAxKTsKKworCQlpZiAoKHNpb19kYXRhLT50eXBlID09IGl0ODcxOCB8fCBzaW9fZGF0YS0+dHlwZSA9PSBpdDg3MjApCisJCSAmJiAhKHNpb19kYXRhLT5za2lwX3ZpZCkpCiAJCQlzaW9fZGF0YS0+dmlkX3ZhbHVlID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fVklEX1JFRyk7CiAKIAkJcmVnID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fUElOWDJfUkVHKTsKQEAgLTEyMzYsOCArMTI2NCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoZGF0YS0+dHlwZSA9PSBpdDg3MTIgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTYKLQkgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTggfHwgZGF0YS0+dHlwZSA9PSBpdDg3MjApIHsKKwlpZiAoIXNpb19kYXRhLT5za2lwX3ZpZCkgewogCQlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CiAJCS8qIFZJRCByZWFkaW5nIGZyb20gU3VwZXItSS9PIGNvbmZpZyBzcGFjZSBpZiBhdmFpbGFibGUgKi8KIAkJZGF0YS0+dmlkID0gc2lvX2RhdGEtPnZpZF92YWx1ZTsKQEAgLTEzNTUsOCArMTM4MiwxMCBAQAogLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBJVDg3LiAqLwogc3RhdGljIHZvaWQgX19kZXZpbml0IGl0ODdfaW5pdF9kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgaXQ4N19zaW9fZGF0YSAqc2lvX2RhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJaW50IHRtcCwgaTsKKwl1OCBtYXNrOwogCiAJLyogaW5pdGlhbGl6ZSB0byBzYW5lIGRlZmF1bHRzOgogCSAqIC0gaWYgdGhlIGNoaXAgaXMgaW4gbWFudWFsIHB3bSBtb2RlLCB0aGlzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aApAQCAtMTQwMiwxMCArMTQzMSwxMSBAQAogCX0KIAogCS8qIENoZWNrIGlmIHRhY2hvbWV0ZXJzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLworCW1hc2sgPSAweDcwICYgfihzaW9fZGF0YS0+c2tpcF9mYW4gPDwgNCk7CiAJZGF0YS0+ZmFuX21haW5fY3RybCA9IGl0ODdfcmVhZF92YWx1ZShkYXRhLCBJVDg3X1JFR19GQU5fTUFJTl9DVFJMKTsKLQlpZiAoKGRhdGEtPmZhbl9tYWluX2N0cmwgJiAweDcwKSA9PSAwKSB7CisJaWYgKChkYXRhLT5mYW5fbWFpbl9jdHJsICYgbWFzaykgPT0gMCkgewogCQkvKiBFbmFibGUgYWxsIGZhbiB0YWNob21ldGVycyAqLwotCQlkYXRhLT5mYW5fbWFpbl9jdHJsIHw9IDB4NzA7CisJCWRhdGEtPmZhbl9tYWluX2N0cmwgfD0gbWFzazsKIAkJaXQ4N193cml0ZV92YWx1ZShkYXRhLCBJVDg3X1JFR19GQU5fTUFJTl9DVFJMLCBkYXRhLT5mYW5fbWFpbl9jdHJsKTsKIAl9CiAJZGF0YS0+aGFzX2ZhbiA9IChkYXRhLT5mYW5fbWFpbl9jdHJsID4+IDQpICYgMHgwNzsKQEAgLTE0MjgsNiArMTQ1OCw5IEBACiAJCX0KIAl9CiAKKwkvKiBGYW4gaW5wdXQgcGlucyBtYXkgYmUgdXNlZCBmb3IgYWx0ZXJuYXRpdmUgZnVuY3Rpb25zICovCisJZGF0YS0+aGFzX2ZhbiAmPSB+c2lvX2RhdGEtPnNraXBfZmFuOworCiAJLyogU2V0IGN1cnJlbnQgZmFuIG1vZGUgcmVnaXN0ZXJzIGFuZCB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlCiAJICogb3RoZXIgbW9kZSByZWdpc3RlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNjMuYyBiL2RyaXZlcnMvaHdtb24vbG02My5jCmluZGV4IDMxOTVhMjYuLjVkYTY2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG02My5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG02My5jCkBAIC00MjcsNDAgKzQyNywzNCBAQAogCQkgICAgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CisJdTggbWFuX2lkLCBjaGlwX2lkLCByZWdfY29uZmlnMSwgcmVnX2NvbmZpZzI7CisJdTggcmVnX2FsZXJ0X3N0YXR1cywgcmVnX2FsZXJ0X21hc2s7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGtpbmQgPCAwKSB7IC8qIG11c3QgaWRlbnRpZnkgKi8KLQkJdTggbWFuX2lkLCBjaGlwX2lkLCByZWdfY29uZmlnMSwgcmVnX2NvbmZpZzI7Ci0JCXU4IHJlZ19hbGVydF9zdGF0dXMsIHJlZ19hbGVydF9tYXNrOworCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTYzX1JFR19NQU5fSUQpOworCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE02M19SRUdfQ0hJUF9JRCk7CiAKLQkJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkgTE02M19SRUdfTUFOX0lEKTsKLQkJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJICBMTTYzX1JFR19DSElQX0lEKTsKLQkJcmVnX2NvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCSAgICAgIExNNjNfUkVHX0NPTkZJRzEpOwotCQlyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJICAgICAgTE02M19SRUdfQ09ORklHMik7Ci0JCXJlZ19hbGVydF9zdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkgICBMTTYzX1JFR19BTEVSVF9TVEFUVVMpOwotCQlyZWdfYWxlcnRfbWFzayA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCSBMTTYzX1JFR19BTEVSVF9NQVNLKTsKKwlyZWdfY29uZmlnMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkgICAgICBMTTYzX1JFR19DT05GSUcxKTsKKwlyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCQkgICAgICBMTTYzX1JFR19DT05GSUcyKTsKKwlyZWdfYWxlcnRfc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgICBMTTYzX1JFR19BTEVSVF9TVEFUVVMpOworCXJlZ19hbGVydF9tYXNrID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkgTE02M19SRUdfQUxFUlRfTUFTSyk7CiAKLQkJaWYgKG1hbl9pZCA9PSAweDAxIC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KLQkJICYmIGNoaXBfaWQgPT0gMHg0MSAvKiBMTTYzICovCi0JCSAmJiAocmVnX2NvbmZpZzEgJiAweDE4KSA9PSAweDAwCi0JCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwCi0JCSAmJiAocmVnX2FsZXJ0X3N0YXR1cyAmIDB4MjApID09IDB4MDAKLQkJICYmIChyZWdfYWxlcnRfbWFzayAmIDB4QTQpID09IDB4QTQpIHsKLQkJCWtpbmQgPSBsbTYzOwotCQl9IGVsc2UgeyAvKiBmYWlsZWQgKi8KLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIlVuc3VwcG9ydGVkIGNoaXAgIgotCQkJCSIobWFuX2lkPTB4JTAyWCwgY2hpcF9pZD0weCUwMlgpLlxuIiwKLQkJCQltYW5faWQsIGNoaXBfaWQpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwlpZiAobWFuX2lkICE9IDB4MDEgLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAqLworCSB8fCBjaGlwX2lkICE9IDB4NDEgLyogTE02MyAqLworCSB8fCAocmVnX2NvbmZpZzEgJiAweDE4KSAhPSAweDAwCisJIHx8IChyZWdfY29uZmlnMiAmIDB4RjgpICE9IDB4MDAKKwkgfHwgKHJlZ19hbGVydF9zdGF0dXMgJiAweDIwKSAhPSAweDAwCisJIHx8IChyZWdfYWxlcnRfbWFzayAmIDB4QTQpICE9IDB4QTQpIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwMlgsIGNoaXBfaWQ9MHglMDJYKVxuIiwKKwkJCW1hbl9pZCwgY2hpcF9pZCk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgImxtNjMiLCBJMkNfTkFNRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03My5jIGIvZHJpdmVycy9od21vbi9sbTczLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmOGIyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbG03My5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogTE03MyBTZW5zb3IgZHJpdmVyCisgKiBCYXNlZCBvbiBMTTc1CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCBDZW5vU1lTICh3d3cuY2Vub3N5cy5jb20pLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBCb2xsb3JlIHRlbGVjb20gKHd3dy5ib2xsb3JldGVsZWNvbS5ldSkuCisgKgorICogR3VpbGxhdW1lIExpZ25ldWwgPGd1aWxsYXVtZS5saWduZXVsQGdtYWlsLmNvbT4KKyAqIEFkcmllbiBEZW1hcmV6IDxhZHJpZW4uZGVtYXJlekBib2xsb3JldGVsZWNvbS5ldT4KKyAqIEplcmVteSBMYWluZSA8amVyZW15LmxhaW5lQGJvbGxvcmV0ZWxlY29tLmV1PgorICoKKyAqIFRoaXMgc29mdHdhcmUgcHJvZ3JhbSBpcyBsaWNlbnNlZCBzdWJqZWN0IHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogKEdQTCkuVmVyc2lvbiAyLEp1bmUgMTk5MSwgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworCisvKiBBZGRyZXNzZXMgc2Nhbm5lZCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YywKKwkJCQkJMHg0ZCwgMHg0ZSwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK0kyQ19DTElFTlRfSU5TTU9EXzEobG03Myk7CisKKy8qIExNNzMgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNNzNfUkVHX0lOUFVUCQkweDAwCisjZGVmaW5lIExNNzNfUkVHX0NPTkYJCTB4MDEKKyNkZWZpbmUgTE03M19SRUdfTUFYCQkweDAyCisjZGVmaW5lIExNNzNfUkVHX01JTgkJMHgwMworI2RlZmluZSBMTTczX1JFR19DVFJMCQkweDA0CisjZGVmaW5lIExNNzNfUkVHX0lECQkweDA3CisKKyNkZWZpbmUgTE03M19JRAkJCTB4OTAwMSAvKiBvciAweDE5MCBhZnRlciBhIHN3YWIxNigpICovCisjZGVmaW5lIERSVk5BTUUJCQkibG03MyIKKyNkZWZpbmUgTE03M19URU1QX01JTgkJKC00MCkKKyNkZWZpbmUgTE03M19URU1QX01BWAkJMTUwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWxvbmcgdGVtcDsKKwlzaG9ydCB2YWx1ZTsKKworCWludCBzdGF0dXMgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIFdyaXRlIHZhbHVlICovCisJdmFsdWUgPSAoc2hvcnQpIFNFTlNPUlNfTElNSVQodGVtcC8yNTAsIChMTTczX1RFTVBfTUlOKjQpLAorCQkoTE03M19URU1QX01BWCo0KSkgPDwgNTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgYXR0ci0+aW5kZXgsIHN3YWIxNih2YWx1ZSkpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJLyogdXNlIGludGVnZXIgZGl2aXNpb24gaW5zdGVhZCBvZiBlcXVpdmFsZW50IHJpZ2h0IHNoaWZ0IHRvCisJICAgZ3VhcmFudGVlIGFyaXRobWV0aWMgc2hpZnQgYW5kIHByZXNlcnZlIHRoZSBzaWduICovCisJaW50IHRlbXAgPSAoKHMxNikgKHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQlhdHRyLT5pbmRleCkpKSoyNTApIC8gMzI7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzeXNmcyBhdHRyaWJ1dGVzIGZvciBod21vbiAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQlzaG93X3RlbXAsIHNldF90ZW1wLCBMTTczX1JFR19NQVgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJc2hvd190ZW1wLCBzZXRfdGVtcCwgTE03M19SRUdfTUlOKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sCisJCQlzaG93X3RlbXAsIE5VTEwsIExNNzNfUkVHX0lOUFVUKTsKKworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG03M19hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKKworCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtNzNfZ3JvdXAgPSB7CisJLmF0dHJzID0gbG03M19hdHRyaWJ1dGVzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZhbCAqLworCitzdGF0aWMgaW50CitsbTczX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJaW50IHN0YXR1czsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJc3RhdHVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG03M19ncm91cCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoaHdtb25fZGV2KSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGh3bW9uX2Rldik7CisJCWdvdG8gZXhpdF9yZW1vdmU7CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGh3bW9uX2Rldik7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlczogc2Vuc29yICclcydcbiIsCisJCSBkZXZfbmFtZShod21vbl9kZXYpLCBjbGllbnQtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2V4aXRfcmVtb3ZlOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmxtNzNfZ3JvdXApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbG03M19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGh3bW9uX2Rldik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG03M19ncm91cCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsbTczX2lkc1tdID0geworCXsgImxtNzMiLCBsbTczIH0sCisJeyAvKiBMSVNUIEVORCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGxtNzNfaWRzKTsKKworLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IGxtNzNfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LCBpbnQga2luZCwKKwkJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOworCXUxNiBpZDsKKwl1OCBjdHJsOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAorCQkJCQlJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIGRldmljZSBJRCAqLworCWlkID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIExNNzNfUkVHX0lEKTsKKwljdHJsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNNzNfUkVHX0NUUkwpOworCWlmICgoaWQgIT0gTE03M19JRCkgfHwgKGN0cmwgJiAweDEwKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzdHJsY3B5KGluZm8tPnR5cGUsICJsbTczIiwgSTJDX05BTUVfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtNzNfZHJpdmVyID0geworCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibG03MyIsCisJfSwKKwkucHJvYmUJCT0gbG03M19wcm9iZSwKKwkucmVtb3ZlCQk9IGxtNzNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGxtNzNfaWRzLAorCS5kZXRlY3QJCT0gbG03M19kZXRlY3QsCisJLmFkZHJlc3NfZGF0YQk9ICZhZGRyX2RhdGEsCit9OworCisvKiBtb2R1bGUgZ2x1ZSAqLworCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtNzNfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG03M19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTczX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG03M19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJHdWlsbGF1bWUgTGlnbmV1bCA8Z3VpbGxhdW1lLmxpZ25ldWxAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTczIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtNzNfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtNzNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzUuYyBiL2RyaXZlcnMvaHdtb24vbG03NS5jCmluZGV4IDU1YmQ4N2MuLmUzOTI1NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03NS5jCkBAIC0yMzksNiArMjM5LDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOwogCWludCBpOworCWludCBjdXIsIGNvbmYsIGh5c3QsIG9zOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAogCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKQEAgLTI1MSw0MCArMjUyLDM1IEBACiAJICAgVGhlIGN5Y2xpbmcrdW51c2VkIGFkZHJlc3NlcyBjb21iaW5hdGlvbiBpcyBub3QgdGVzdGVkLAogCSAgIHNpbmNlIGl0IHdvdWxkIHNpZ25pZmljYW50bHkgc2xvdyB0aGUgZGV0ZWN0aW9uIGRvd24gYW5kIHdvdWxkCiAJICAgaGFyZGx5IGFkZCBhbnkgdmFsdWUuICovCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCWludCBjdXIsIGNvbmYsIGh5c3QsIG9zOwogCi0JCS8qIFVudXNlZCBhZGRyZXNzZXMgKi8KLQkJY3VyID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDApOwotCQljb25mID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDEpOwotCQloeXN0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDIpOwotCQlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpICE9IGh5c3QKLQkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA1KSAhPSBoeXN0Ci0JCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNikgIT0gaHlzdAotCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDcpICE9IGh5c3QpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJb3MgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMyk7Ci0JCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNCkgIT0gb3MKLQkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA1KSAhPSBvcwotCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDYpICE9IG9zCi0JCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gb3MpCi0JCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBVbnVzZWQgYWRkcmVzc2VzICovCisJY3VyID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDApOworCWNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMSk7CisJaHlzdCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCAyKTsKKwlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpICE9IGh5c3QKKwkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDUpICE9IGh5c3QKKwkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDYpICE9IGh5c3QKKwkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDcpICE9IGh5c3QpCisJCXJldHVybiAtRU5PREVWOworCW9zID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDMpOworCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNCkgIT0gb3MKKwkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDUpICE9IG9zCisJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA2KSAhPSBvcworCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gb3MpCisJCXJldHVybiAtRU5PREVWOwogCi0JCS8qIFVudXNlZCBiaXRzICovCi0JCWlmIChjb25mICYgMHhlMCkKLQkJCXJldHVybiAtRU5PREVWOworCS8qIFVudXNlZCBiaXRzICovCisJaWYgKGNvbmYgJiAweGUwKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCQkvKiBBZGRyZXNzZXMgY3ljbGluZyAqLwotCQlmb3IgKGkgPSA4OyBpIDwgMHhmZjsgaSArPSA4KQotCQkJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBpICsgMSkgIT0gY29uZgotCQkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMikgIT0gaHlzdAotCQkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMykgIT0gb3MpCi0JCQkJcmV0dXJuIC1FTk9ERVY7CisJLyogQWRkcmVzc2VzIGN5Y2xpbmcgKi8KKwlmb3IgKGkgPSA4OyBpIDwgMHhmZjsgaSArPSA4KSB7CisJCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgaSArIDEpICE9IGNvbmYKKwkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMikgIT0gaHlzdAorCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIGkgKyAzKSAhPSBvcykKKwkJCXJldHVybiAtRU5PREVWOwogCX0KIAotCS8qIE5PVEU6IHdlIHRyZWF0ICJmb3JjZT0uLi4iIGFuZCAiZm9yY2VfbG03NT0uLi4iIHRoZSBzYW1lLgotCSAqIE9ubHkgbmV3LXN0eWxlIGRyaXZlciBiaW5kaW5nIGRpc3Rpbmd1aXNoZXMgY2hpcCB0eXBlcy4KLQkgKi8KIAlzdHJsY3B5KGluZm8tPnR5cGUsICJsbTc1IiwgSTJDX05BTUVfU0laRSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03Ny5jIGIvZHJpdmVycy9od21vbi9sbTc3LmMKaW5kZXggODY2YjQwMS4uYWMwNjdmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc3LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc3LmMKQEAgLTI0OSw2ICsyNDksNyBAQAogCQkgICAgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CisJaW50IGksIGN1ciwgY29uZiwgaHlzdCwgY3JpdCwgbWluLCBtYXg7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CiAJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQpAQCAtMjY1LDUyICsyNjYsNDkgQEAKIAkgICA0LiByZWdpc3RlcnMgY3ljbGluZyBvdmVyIDgtYWRkcmVzcyBib3VuZGFyaWVzCiAKIAkgICBXb3JkLXNpemVkIHJlZ2lzdGVycyBhcmUgaGlnaC1ieXRlIGZpcnN0LiAqLwotCWlmIChraW5kIDwgMCkgewotCQlpbnQgaSwgY3VyLCBjb25mLCBoeXN0LCBjcml0LCBtaW4sIG1heDsKIAotCQkvKiBhZGRyZXNzZXMgY3ljbGluZyAqLwotCQljdXIgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMCk7Ci0JCWNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMSk7Ci0JCWh5c3QgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMik7Ci0JCWNyaXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMyk7Ci0JCW1pbiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA0KTsKLQkJbWF4ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDUpOwotCQlmb3IgKGkgPSA4OyBpIDw9IDB4ZmY7IGkgKz0gOCkKLQkJCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgaSArIDEpICE9IGNvbmYKLQkJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgaSArIDIpICE9IGh5c3QKLQkJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgaSArIDMpICE9IGNyaXQKLQkJCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgaSArIDQpICE9IG1pbgotCQkJICAgIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgNSkgIT0gbWF4KQotCQkJCXJldHVybiAtRU5PREVWOwotCi0JCS8qIHNpZ24gYml0cyAqLwotCQlpZiAoKChjdXIgJiAweDAwZjApICE9IDB4ZjAgJiYgKGN1ciAmIDB4MDBmMCkgIT0gMHgwKQotCQkgICAgfHwgKChoeXN0ICYgMHgwMGYwKSAhPSAweGYwICYmIChoeXN0ICYgMHgwMGYwKSAhPSAweDApCi0JCSAgICB8fCAoKGNyaXQgJiAweDAwZjApICE9IDB4ZjAgJiYgKGNyaXQgJiAweDAwZjApICE9IDB4MCkKLQkJICAgIHx8ICgobWluICYgMHgwMGYwKSAhPSAweGYwICYmIChtaW4gJiAweDAwZjApICE9IDB4MCkKLQkJICAgIHx8ICgobWF4ICYgMHgwMGYwKSAhPSAweGYwICYmIChtYXggJiAweDAwZjApICE9IDB4MCkpCisJLyogYWRkcmVzc2VzIGN5Y2xpbmcgKi8KKwljdXIgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMCk7CisJY29uZiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAxKTsKKwloeXN0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDIpOworCWNyaXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMyk7CisJbWluID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpOworCW1heCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA1KTsKKwlmb3IgKGkgPSA4OyBpIDw9IDB4ZmY7IGkgKz0gOCkgeworCQlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAxKSAhPSBjb25mCisJCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgaSArIDIpICE9IGh5c3QKKwkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgMykgIT0gY3JpdAorCQkgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIGkgKyA0KSAhPSBtaW4KKwkJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBpICsgNSkgIT0gbWF4KQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJLyogdW51c2VkIGJpdHMgKi8KLQkJaWYgKGNvbmYgJiAweGUwKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJLyogMHgwNiBhbmQgMHgwNyByZXR1cm4gdGhlIGxhc3QgcmVhZCB2YWx1ZSAqLwotCQljdXIgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMCk7Ci0JCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNikgIT0gY3VyCi0JCSAgICB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gY3VyKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWh5c3QgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgMik7Ci0JCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNikgIT0gaHlzdAotCQkgICAgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDcpICE9IGh5c3QpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJbWluID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpOwotCQlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDYpICE9IG1pbgotCQkgICAgfHwgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDcpICE9IG1pbikKLQkJCXJldHVybiAtRU5PREVWOwotCiAJfQogCisJLyogc2lnbiBiaXRzICovCisJaWYgKCgoY3VyICYgMHgwMGYwKSAhPSAweGYwICYmIChjdXIgJiAweDAwZjApICE9IDB4MCkKKwkgfHwgKChoeXN0ICYgMHgwMGYwKSAhPSAweGYwICYmIChoeXN0ICYgMHgwMGYwKSAhPSAweDApCisJIHx8ICgoY3JpdCAmIDB4MDBmMCkgIT0gMHhmMCAmJiAoY3JpdCAmIDB4MDBmMCkgIT0gMHgwKQorCSB8fCAoKG1pbiAmIDB4MDBmMCkgIT0gMHhmMCAmJiAobWluICYgMHgwMGYwKSAhPSAweDApCisJIHx8ICgobWF4ICYgMHgwMGYwKSAhPSAweGYwICYmIChtYXggJiAweDAwZjApICE9IDB4MCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogdW51c2VkIGJpdHMgKi8KKwlpZiAoY29uZiAmIDB4ZTApCisJCXJldHVybiAtRU5PREVWOworCisJLyogMHgwNiBhbmQgMHgwNyByZXR1cm4gdGhlIGxhc3QgcmVhZCB2YWx1ZSAqLworCWN1ciA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCAwKTsKKwlpZiAoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDYpICE9IGN1cgorCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gY3VyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwloeXN0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDIpOworCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNikgIT0gaHlzdAorCSB8fCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNykgIT0gaHlzdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbWluID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIDQpOworCWlmIChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEobmV3X2NsaWVudCwgNikgIT0gbWluCisJIHx8IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCA3KSAhPSBtaW4pCisJCXJldHVybiAtRU5PREVWOworCiAJc3RybGNweShpbmZvLT50eXBlLCAibG03NyIsIEkyQ19OQU1FX1NJWkUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzguYyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCmluZGV4IGY3ZTcwMTYuLjU5NzgyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03OC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCkBAIC01NzYsNTIgKzU3NiwzNCBAQAogCWlmIChpc2EpCiAJCW11dGV4X2xvY2soJmlzYS0+dXBkYXRlX2xvY2spOwogCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE03OF9SRUdfQ09ORklHKSAmIDB4ODApCi0JCSB8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTc4X1JFR19JMkNfQUREUikKLQkJICAgICE9IGFkZHJlc3MpCi0JCQlnb3RvIGVycl9ub2RldjsKKwlpZiAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNNzhfUkVHX0NPTkZJRykgJiAweDgwKQorCSB8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTc4X1JFR19JMkNfQUREUikgIT0gYWRkcmVzcykKKwkJZ290byBlcnJfbm9kZXY7CiAKLQkJLyogRXhwbGljaXRseSBwcmV2ZW50IHRoZSBtaXNkZXRlY3Rpb24gb2YgV2luYm9uZCBjaGlwcyAqLwotCQlpID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgMHg0Zik7Ci0JCWlmIChpID09IDB4YTMgfHwgaSA9PSAweDVjKQotCQkJZ290byBlcnJfbm9kZXY7Ci0JfQorCS8qIEV4cGxpY2l0bHkgcHJldmVudCB0aGUgbWlzZGV0ZWN0aW9uIG9mIFdpbmJvbmQgY2hpcHMgKi8KKwlpID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgMHg0Zik7CisJaWYgKGkgPT0gMHhhMyB8fCBpID09IDB4NWMpCisJCWdvdG8gZXJyX25vZGV2OwogCiAJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCi0JaWYgKGtpbmQgPD0gMCkgewotCQlpID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE03OF9SRUdfQ0hJUElEKTsKLQkJaWYgKGkgPT0gMHgwMCB8fCBpID09IDB4MjAJLyogTE03OCAqLwotCQkgfHwgaSA9PSAweDQwKQkJCS8qIExNNzgtSiAqLwotCQkJa2luZCA9IGxtNzg7Ci0JCWVsc2UgaWYgKChpICYgMHhmZSkgPT0gMHhjMCkKLQkJCWtpbmQgPSBsbTc5OwotCQllbHNlIHsKLQkJCWlmIChraW5kID09IDApCi0JCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIklnbm9yaW5nICdmb3JjZScgIgotCQkJCQkicGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgYXQgIgotCQkJCQkiYWRhcHRlciAlZCwgYWRkcmVzcyAweCUwMnhcbiIsCi0JCQkJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKLQkJCWdvdG8gZXJyX25vZGV2OwotCQl9CisJaSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNNzhfUkVHX0NISVBJRCk7CisJaWYgKGkgPT0gMHgwMCB8fCBpID09IDB4MjAJLyogTE03OCAqLworCSB8fCBpID09IDB4NDApCQkJLyogTE03OC1KICovCisJCWNsaWVudF9uYW1lID0gImxtNzgiOworCWVsc2UgaWYgKChpICYgMHhmZSkgPT0gMHhjMCkKKwkJY2xpZW50X25hbWUgPSAibG03OSI7CisJZWxzZQorCQlnb3RvIGVycl9ub2RldjsKIAotCQlpZiAobG03OF9hbGlhc19kZXRlY3QoY2xpZW50LCBpKSkgewotCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV2aWNlIGF0IDB4JTAyeCBhcHBlYXJzIHRvICIKLQkJCQkiYmUgdGhlIHNhbWUgYXMgSVNBIGRldmljZVxuIiwgYWRkcmVzcyk7Ci0JCQlnb3RvIGVycl9ub2RldjsKLQkJfQorCWlmIChsbTc4X2FsaWFzX2RldGVjdChjbGllbnQsIGkpKSB7CisJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkRldmljZSBhdCAweCUwMnggYXBwZWFycyB0byAiCisJCQkiYmUgdGhlIHNhbWUgYXMgSVNBIGRldmljZVxuIiwgYWRkcmVzcyk7CisJCWdvdG8gZXJyX25vZGV2OwogCX0KIAogCWlmIChpc2EpCiAJCW11dGV4X3VubG9jaygmaXNhLT51cGRhdGVfbG9jayk7CiAKLQlzd2l0Y2ggKGtpbmQpIHsKLQljYXNlIGxtNzk6Ci0JCWNsaWVudF9uYW1lID0gImxtNzkiOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQljbGllbnRfbmFtZSA9ICJsbTc4IjsKLQl9CiAJc3RybGNweShpbmZvLT50eXBlLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04My5jIGIvZHJpdmVycy9od21vbi9sbTgzLmMKaW5kZXggZTU5ZTJkMS4uMDhiMDNlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTgzLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTgzLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbG04My5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKICAqICAgICAgICAgIG1vbml0b3JpbmcKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA5ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KICAqCiAgKiBIZWF2aWx5IGluc3BpcmVkIGZyb20gdGhlIGxtNzgsIGxtNzUgYW5kIGFkbTEwMjEgZHJpdmVycy4gVGhlIExNODMgaXMKICAqIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBOYXRpb25hbCBTZW1pY29uZHVjdG9yLiBJdCByZXBvcnRzIHVwIHRvIGZvdXIKQEAgLTI5NSw2OSArMjk1LDQwIEBACiAJCSAgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gbmV3X2NsaWVudC0+YWRhcHRlcjsKLQljb25zdCBjaGFyICpuYW1lID0gIiI7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCBtYW5faWQsIGNoaXBfaWQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogTm93IHdlIGRvIHRoZSBkZXRlY3Rpb24gYW5kIGlkZW50aWZpY2F0aW9uLiBBIG5lZ2F0aXZlIGtpbmQKLQkgKiBtZWFucyB0aGF0IHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlIHBhcmFtZXRlcgotCSAqIChkZWZhdWx0KSwgc28gd2UgbXVzdCBib3RoIGRldGVjdCBhbmQgaWRlbnRpZnkgdGhlIGNoaXAKLQkgKiAoYWN0dWFsbHkgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUga2luZCBvZiBjaGlwIGZvciBub3csIExNODMpLgotCSAqIEEgemVybyBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlCi0JICogcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uIHN0ZXAgc2hhbGwgYmUgc2tpcHBlZC4gQSBwb3NpdGl2ZSBraW5kCi0JICogbWVhbnMgdGhhdCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyIGFuZCBhCi0JICogZ2l2ZW4ga2luZCBvZiBjaGlwIGlzIHJlcXVlc3RlZCwgc28gYm90aCB0aGUgZGV0ZWN0aW9uIGFuZCB0aGUKLQkgKiBpZGVudGlmaWNhdGlvbiBzdGVwcyBhcmUgc2tpcHBlZC4gKi8KLQotCS8qIERlZmF1bHQgdG8gYW4gTE04MyBpZiBmb3JjZWQgKi8KLQlpZiAoa2luZCA9PSAwKQotCQlraW5kID0gbG04MzsKLQotCWlmIChraW5kIDwgMCkgeyAvKiBkZXRlY3Rpb24gKi8KLQkJaWYgKCgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNODNfUkVHX1JfU1RBVFVTMSkKLQkJICAgICYgMHhBOCkgIT0gMHgwMCkgfHwKLQkJICAgICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNODNfUkVHX1JfU1RBVFVTMikKLQkJICAgICYgMHg0OCkgIT0gMHgwMCkgfHwKLQkJICAgICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNODNfUkVHX1JfQ09ORklHKQotCQkgICAgJiAweDQxKSAhPSAweDAwKSkgewotCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAotCQkJCSJMTTgzIGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKLQkJCQluZXdfY2xpZW50LT5hZGRyKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJLyogRGV0ZWN0aW9uICovCisJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE04M19SRUdfUl9TVEFUVVMxKSAmIDB4QTgpIHx8CisJICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE04M19SRUdfUl9TVEFUVVMyKSAmIDB4NDgpIHx8CisJICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE04M19SRUdfUl9DT05GSUcpICYgMHg0MSkpIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiTE04MyBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCW5ld19jbGllbnQtPmFkZHIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCi0JCXU4IG1hbl9pZCwgY2hpcF9pZDsKKwkvKiBJZGVudGlmaWNhdGlvbiAqLworCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTgzX1JFR19SX01BTl9JRCk7CisJaWYgKG1hbl9pZCAhPSAweDAxKQkvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCisJCXJldHVybiAtRU5PREVWOwogCi0JCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkgICAgTE04M19SRUdfUl9NQU5fSUQpOwotCQljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCSAgICBMTTgzX1JFR19SX0NISVBfSUQpOwotCi0JCWlmIChtYW5faWQgPT0gMHgwMSkgeyAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCi0JCQlpZiAoY2hpcF9pZCA9PSAweDAzKSB7Ci0JCQkJa2luZCA9IGxtODM7Ci0JCQl9IGVsc2UKLQkJCWlmIChjaGlwX2lkID09IDB4MDEpIHsKLQkJCQlraW5kID0gbG04MjsKLQkJCX0KLQkJfQotCi0JCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gZmFpbGVkICovCi0JCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LAotCQkJICAgICJVbnN1cHBvcnRlZCBjaGlwIChtYW5faWQ9MHglMDJYLCAiCi0JCQkgICAgImNoaXBfaWQ9MHglMDJYKS5cbiIsIG1hbl9pZCwgY2hpcF9pZCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCWlmIChraW5kID09IGxtODMpIHsKKwljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNODNfUkVHX1JfQ0hJUF9JRCk7CisJc3dpdGNoIChjaGlwX2lkKSB7CisJY2FzZSAweDAzOgogCQluYW1lID0gImxtODMiOwotCX0gZWxzZQotCWlmIChraW5kID09IGxtODIpIHsKKwkJYnJlYWs7CisJY2FzZSAweDAxOgogCQluYW1lID0gImxtODIiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KKwkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCSAiVW5zdXBwb3J0ZWQgY2hpcCAobWFuX2lkPTB4JTAyWCwgY2hpcF9pZD0weCUwMlgpXG4iLAorCQkJIG1hbl9pZCwgY2hpcF9pZCk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtODUuYyBiL2RyaXZlcnMvaHdtb24vbG04NS5jCmluZGV4IDZjNTNkOTguLmQ1NmRhMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG04NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG04NS5jCkBAIC01LDcgKzUsNyBAQAogICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyAgUGhpbGlwIFBva29ybnkgPHBwb2tvcm55QHBlbmd1aW5jb21wdXRpbmcuY29tPgogICAgIENvcHlyaWdodCAoYykgMjAwMyAgICAgICAgTWFyZ2l0IFNjaHViZXJ0LVdoaWxlIDxtYXJnaXRzd0B0LW9ubGluZS5kZT4KICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgICAgICAgIEp1c3RpbiBUaGllc3NlbiA8anRoaWVzc2VuQHBlbmd1aW5jb21wdXRpbmcuY29tPgotICAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA3LS0yMDA5ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIAogICAgIENoaXAgZGV0YWlscyBhdAkgICAgICA8aHR0cDovL3d3dy5uYXRpb25hbC5jb20vZHMvTE0vTE04NS5wZGY+CiAKQEAgLTExNjIsMTA3ICsxMTYyLDgwIEBACiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwogCWludCBhZGRyZXNzID0gY2xpZW50LT5hZGRyOwogCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKKwlpbnQgY29tcGFueSwgdmVyc3RlcDsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewogCQkvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZG8gYnl0ZSBJL08gKi8KIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogSWYgYXV0by1kZXRlY3RpbmcsIGRldGVybWluZSB0aGUgY2hpcCB0eXBlICovCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCWludCBjb21wYW55ID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQ09NUEFOWSk7Ci0JCWludCB2ZXJzdGVwID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfVkVSU1RFUCk7CisJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUgKi8KKwljb21wYW55ID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQ09NUEFOWSk7CisJdmVyc3RlcCA9IGxtODVfcmVhZF92YWx1ZShjbGllbnQsIExNODVfUkVHX1ZFUlNURVApOwogCi0JCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkRldGVjdGluZyBkZXZpY2UgYXQgMHglMDJ4IHdpdGggIgotCQkJIkNPTVBBTlk6IDB4JTAyeCBhbmQgVkVSU1RFUDogMHglMDJ4XG4iLAotCQkJYWRkcmVzcywgY29tcGFueSwgdmVyc3RlcCk7CisJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW5nIGRldmljZSBhdCAweCUwMnggd2l0aCAiCisJCSJDT01QQU5ZOiAweCUwMnggYW5kIFZFUlNURVA6IDB4JTAyeFxuIiwKKwkJYWRkcmVzcywgY29tcGFueSwgdmVyc3RlcCk7CiAKLQkJLyogQWxsIHN1cHBvcnRlZCBjaGlwcyBoYXZlIHRoZSB2ZXJzaW9uIGluIGNvbW1vbiAqLwotCQlpZiAoKHZlcnN0ZXAgJiBMTTg1X1ZFUlNURVBfVk1BU0spICE9IExNODVfVkVSU1RFUF9HRU5FUklDICYmCi0JCSAgICAodmVyc3RlcCAmIExNODVfVkVSU1RFUF9WTUFTSykgIT0gTE04NV9WRVJTVEVQX0dFTkVSSUMyKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJBdXRvZGV0ZWN0aW9uIGZhaWxlZDogIgotCQkJCSJ1bnN1cHBvcnRlZCB2ZXJzaW9uXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOworCS8qIEFsbCBzdXBwb3J0ZWQgY2hpcHMgaGF2ZSB0aGUgdmVyc2lvbiBpbiBjb21tb24gKi8KKwlpZiAoKHZlcnN0ZXAgJiBMTTg1X1ZFUlNURVBfVk1BU0spICE9IExNODVfVkVSU1RFUF9HRU5FUklDICYmCisJICAgICh2ZXJzdGVwICYgTE04NV9WRVJTVEVQX1ZNQVNLKSAhPSBMTTg1X1ZFUlNURVBfR0VORVJJQzIpIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJIkF1dG9kZXRlY3Rpb24gZmFpbGVkOiB1bnN1cHBvcnRlZCB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXR5cGVfbmFtZSA9ICJsbTg1IjsKKworCS8qIE5vdywgcmVmaW5lIHRoZSBkZXRlY3Rpb24gKi8KKwlpZiAoY29tcGFueSA9PSBMTTg1X0NPTVBBTllfTkFUSU9OQUwpIHsKKwkJc3dpdGNoICh2ZXJzdGVwKSB7CisJCWNhc2UgTE04NV9WRVJTVEVQX0xNODVDOgorCQkJdHlwZV9uYW1lID0gImxtODVjIjsKKwkJCWJyZWFrOworCQljYXNlIExNODVfVkVSU1RFUF9MTTg1QjoKKwkJCXR5cGVfbmFtZSA9ICJsbTg1YiI7CisJCQlicmVhazsKKwkJY2FzZSBMTTg1X1ZFUlNURVBfTE05NjAwMF8xOgorCQljYXNlIExNODVfVkVSU1RFUF9MTTk2MDAwXzI6CisJCQkvKiBDaGVjayBmb3IgV2luYm9uZCBXUENEMzc3SSAqLworCQkJaWYgKGxtODVfaXNfZmFrZShjbGllbnQpKSB7CisJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJCQkiRm91bmQgV2luYm9uZCBXUENEMzc3SSwgaWdub3JpbmdcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJYnJlYWs7CiAJCX0KLQkJa2luZCA9IGFueV9jaGlwOwotCi0JCS8qIE5vdywgcmVmaW5lIHRoZSBkZXRlY3Rpb24gKi8KLQkJaWYgKGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX05BVElPTkFMKSB7Ci0JCQlzd2l0Y2ggKHZlcnN0ZXApIHsKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0xNODVDOgotCQkJCWtpbmQgPSBsbTg1YzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0xNODVCOgotCQkJCWtpbmQgPSBsbTg1YjsKLQkJCQlicmVhazsKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0xNOTYwMDBfMToKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0xNOTYwMDBfMjoKLQkJCQkvKiBDaGVjayBmb3IgV2luYm9uZCBXUENEMzc3SSAqLwotCQkJCWlmIChsbTg1X2lzX2Zha2UoY2xpZW50KSkgewotCQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCi0JCQkJCQkiRm91bmQgV2luYm9uZCBXUENEMzc3SSwgIgotCQkJCQkJImlnbm9yaW5nXG4iKTsKLQkJCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX0FOQUxPR19ERVYpIHsKLQkJCXN3aXRjaCAodmVyc3RlcCkgewotCQkJY2FzZSBMTTg1X1ZFUlNURVBfQURNMTAyNzoKLQkJCQlraW5kID0gYWRtMTAyNzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0FEVDc0NjM6Ci0JCQljYXNlIExNODVfVkVSU1RFUF9BRFQ3NDYzQzoKLQkJCQlraW5kID0gYWR0NzQ2MzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0FEVDc0NjhfMToKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0FEVDc0NjhfMjoKLQkJCQlraW5kID0gYWR0NzQ2ODsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb21wYW55ID09IExNODVfQ09NUEFOWV9TTVNDKSB7Ci0JCQlzd2l0Y2ggKHZlcnN0ZXApIHsKLQkJCWNhc2UgTE04NV9WRVJTVEVQX0VNQzZEMTAwX0EwOgotCQkJY2FzZSBMTTg1X1ZFUlNURVBfRU1DNkQxMDBfQTE6Ci0JCQkJLyogTm90ZTogd2UgY2FuJ3QgdGVsbCBhICcxMDAgZnJvbSBhICcxMDEgKi8KLQkJCQlraW5kID0gZW1jNmQxMDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIExNODVfVkVSU1RFUF9FTUM2RDEwMjoKLQkJCQlraW5kID0gZW1jNmQxMDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJBdXRvZGV0ZWN0aW9uIGZhaWxlZDogIgotCQkJCSJ1bmtub3duIHZlbmRvclxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gTE04NV9DT01QQU5ZX0FOQUxPR19ERVYpIHsKKwkJc3dpdGNoICh2ZXJzdGVwKSB7CisJCWNhc2UgTE04NV9WRVJTVEVQX0FETTEwMjc6CisJCQl0eXBlX25hbWUgPSAiYWRtMTAyNyI7CisJCQlicmVhazsKKwkJY2FzZSBMTTg1X1ZFUlNURVBfQURUNzQ2MzoKKwkJY2FzZSBMTTg1X1ZFUlNURVBfQURUNzQ2M0M6CisJCQl0eXBlX25hbWUgPSAiYWR0NzQ2MyI7CisJCQlicmVhazsKKwkJY2FzZSBMTTg1X1ZFUlNURVBfQURUNzQ2OF8xOgorCQljYXNlIExNODVfVkVSU1RFUF9BRFQ3NDY4XzI6CisJCQl0eXBlX25hbWUgPSAiYWR0NzQ2OCI7CisJCQlicmVhazsKIAkJfQorCX0gZWxzZSBpZiAoY29tcGFueSA9PSBMTTg1X0NPTVBBTllfU01TQykgeworCQlzd2l0Y2ggKHZlcnN0ZXApIHsKKwkJY2FzZSBMTTg1X1ZFUlNURVBfRU1DNkQxMDBfQTA6CisJCWNhc2UgTE04NV9WRVJTVEVQX0VNQzZEMTAwX0ExOgorCQkJLyogTm90ZTogd2UgY2FuJ3QgdGVsbCBhICcxMDAgZnJvbSBhICcxMDEgKi8KKwkJCXR5cGVfbmFtZSA9ICJlbWM2ZDEwMCI7CisJCQlicmVhazsKKwkJY2FzZSBMTTg1X1ZFUlNURVBfRU1DNkQxMDI6CisJCQl0eXBlX25hbWUgPSAiZW1jNmQxMDIiOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkiQXV0b2RldGVjdGlvbiBmYWlsZWQ6IHVua25vd24gdmVuZG9yXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3dpdGNoIChraW5kKSB7Ci0JY2FzZSBsbTg1YjoKLQkJdHlwZV9uYW1lID0gImxtODViIjsKLQkJYnJlYWs7Ci0JY2FzZSBsbTg1YzoKLQkJdHlwZV9uYW1lID0gImxtODVjIjsKLQkJYnJlYWs7Ci0JY2FzZSBhZG0xMDI3OgotCQl0eXBlX25hbWUgPSAiYWRtMTAyNyI7Ci0JCWJyZWFrOwotCWNhc2UgYWR0NzQ2MzoKLQkJdHlwZV9uYW1lID0gImFkdDc0NjMiOwotCQlicmVhazsKLQljYXNlIGFkdDc0Njg6Ci0JCXR5cGVfbmFtZSA9ICJhZHQ3NDY4IjsKLQkJYnJlYWs7Ci0JY2FzZSBlbWM2ZDEwMDoKLQkJdHlwZV9uYW1lID0gImVtYzZkMTAwIjsKLQkJYnJlYWs7Ci0JY2FzZSBlbWM2ZDEwMjoKLQkJdHlwZV9uYW1lID0gImVtYzZkMTAyIjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdHlwZV9uYW1lID0gImxtODUiOwotCX0KIAlzdHJsY3B5KGluZm8tPnR5cGUsIHR5cGVfbmFtZSwgSTJDX05BTUVfU0laRSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04Ny5jIGIvZHJpdmVycy9od21vbi9sbTg3LmMKaW5kZXggMmU0YTNjZS4uNDkyOWIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTg3LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTg3LmMKQEAgLTY2NiwzNyArNjY2LDMyIEBACiAJCSAgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gbmV3X2NsaWVudC0+YWRhcHRlcjsKLQlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsgImxtODciLCAiYWRtMTAyNCIgfTsKKwljb25zdCBjaGFyICpuYW1lOworCXU4IGNpZCwgcmV2OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIERlZmF1bHQgdG8gYW4gTE04NyBpZiBmb3JjZWQgKi8KLQlpZiAoa2luZCA9PSAwKQotCQlraW5kID0gbG04NzsKKwlpZiAobG04N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODdfUkVHX0NPTkZJRykgJiAweDgwKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCXU4IGNpZCA9IGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19DT01QQU5ZX0lEKTsKLQkJdTggcmV2ID0gbG04N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODdfUkVHX1JFVklTSU9OKTsKKwljaWQgPSBsbTg3X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE04N19SRUdfQ09NUEFOWV9JRCk7CisJcmV2ID0gbG04N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODdfUkVHX1JFVklTSU9OKTsKIAotCQlpZiAoY2lkID09IDB4MDIJCQkvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCi0JCSAmJiAocmV2ID49IDB4MDEgJiYgcmV2IDw9IDB4MDgpKQotCQkJa2luZCA9IGxtODc7Ci0JCWVsc2UgaWYgKGNpZCA9PSAweDQxCQkvKiBBbmFsb2cgRGV2aWNlcyAqLwotCQkgICAgICAmJiAocmV2ICYgMHhmMCkgPT0gMHgxMCkKLQkJCWtpbmQgPSBhZG0xMDI0OwotCi0JCWlmIChraW5kIDwgMAotCQkgfHwgKGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19DT05GSUcpICYgMHg4MCkpIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKLQkJCQkiTE04NyBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeC5cbiIsCi0JCQkJbmV3X2NsaWVudC0+YWRkcik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQorCWlmIChjaWQgPT0gMHgwMgkJCS8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KKwkgJiYgKHJldiA+PSAweDAxICYmIHJldiA8PSAweDA4KSkKKwkJbmFtZSA9ICJsbTg3IjsKKwllbHNlIGlmIChjaWQgPT0gMHg0MQkJLyogQW5hbG9nIERldmljZXMgKi8KKwkgICAgICAmJiAocmV2ICYgMHhmMCkgPT0gMHgxMCkKKwkJbmFtZSA9ICJhZG0xMDI0IjsKKwllbHNlIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiTE04NyBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCW5ld19jbGllbnQtPmFkZHIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzdHJsY3B5KGluZm8tPnR5cGUsIG5hbWVzW2tpbmQgLSAxXSwgSTJDX05BTUVfU0laRSk7CisJc3RybGNweShpbmZvLT50eXBlLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkwLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwppbmRleCAxYWZmNzU3Li5iN2M5MDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBsbTkwLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQogICogICAgICAgICAgbW9uaXRvcmluZwotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgogICoKICAqIEJhc2VkIG9uIHRoZSBsbTgzIGRyaXZlci4gVGhlIExNOTAgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsCiAgKiBTZW1pY29uZHVjdG9yLiBJdCByZXBvcnRzIHVwIHRvIHR3byB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gcGx1cyB1cCB0bwpAQCAtNjYxLDE1NCArNjYxLDExOCBAQAogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CiAJaW50IGFkZHJlc3MgPSBuZXdfY2xpZW50LT5hZGRyOwotCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgbWFuX2lkLCBjaGlwX2lkLCByZWdfY29uZmlnMSwgcmVnX2NvbnZyYXRlOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qCi0JICogTm93IHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBBIG5lZ2F0aXZlIGtpbmQgbWVhbnMgdGhhdAotCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlIHBhcmFtZXRlciAoZGVmYXVsdCksIHNvIHdlCi0JICogbXVzdCBib3RoIGRldGVjdCBhbmQgaWRlbnRpZnkgdGhlIGNoaXAuIEEgemVybyBraW5kIG1lYW5zIHRoYXQKLQkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCi0JICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCi0JICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCi0JICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcwotCSAqIGFyZSBza2lwcGVkLgotCSAqLwotCi0JLyogRGVmYXVsdCB0byBhbiBMTTkwIGlmIGZvcmNlZCAqLwotCWlmIChraW5kID09IDApCi0JCWtpbmQgPSBsbTkwOwotCi0JaWYgKGtpbmQgPCAwKSB7IC8qIGRldGVjdGlvbiBhbmQgaWRlbnRpZmljYXRpb24gKi8KLQkJaW50IG1hbl9pZCwgY2hpcF9pZCwgcmVnX2NvbmZpZzEsIHJlZ19jb252cmF0ZTsKLQotCQlpZiAoKG1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCS8qIGRldGVjdGlvbiBhbmQgaWRlbnRpZmljYXRpb24gKi8KKwlpZiAoKG1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAogCQkJCQkJTE05MF9SRUdfUl9NQU5fSUQpKSA8IDAKLQkJIHx8IChjaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJIHx8IChjaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCiAJCQkJCQlMTTkwX1JFR19SX0NISVBfSUQpKSA8IDAKLQkJIHx8IChyZWdfY29uZmlnMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCSB8fCAocmVnX2NvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKIAkJCQkJCUxNOTBfUkVHX1JfQ09ORklHMSkpIDwgMAotCQkgfHwgKHJlZ19jb252cmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAorCSB8fCAocmVnX2NvbnZyYXRlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCiAJCQkJCQlMTTkwX1JFR19SX0NPTlZSQVRFKSkgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoYWRkcmVzcyA9PSAweDRDIHx8IGFkZHJlc3MgPT0gMHg0RCkKKwkgJiYgbWFuX2lkID09IDB4MDEpIHsgLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAqLworCQlpbnQgcmVnX2NvbmZpZzI7CisKKwkJcmVnX2NvbmZpZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCQkJCUxNOTBfUkVHX1JfQ09ORklHMik7CisJCWlmIChyZWdfY29uZmlnMiA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCi0JCWlmICgoYWRkcmVzcyA9PSAweDRDIHx8IGFkZHJlc3MgPT0gMHg0RCkKLQkJICYmIG1hbl9pZCA9PSAweDAxKSB7IC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KLQkJCWludCByZWdfY29uZmlnMjsKIAotCQkJaWYgKChyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCQkJTE05MF9SRUdfUl9DT05GSUcyKSkgPCAwKQotCQkJCXJldHVybiAtRU5PREVWOwotCi0JCQlpZiAoKHJlZ19jb25maWcxICYgMHgyQSkgPT0gMHgwMAotCQkJICYmIChyZWdfY29uZmlnMiAmIDB4RjgpID09IDB4MDAKLQkJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgewotCQkJCWlmIChhZGRyZXNzID09IDB4NEMKLQkJCQkgJiYgKGNoaXBfaWQgJiAweEYwKSA9PSAweDIwKSB7IC8qIExNOTAgKi8KLQkJCQkJa2luZCA9IGxtOTA7Ci0JCQkJfSBlbHNlCi0JCQkJaWYgKChjaGlwX2lkICYgMHhGMCkgPT0gMHgzMCkgeyAvKiBMTTg5L0xNOTkgKi8KLQkJCQkJa2luZCA9IGxtOTk7Ci0JCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCi0JCQkJCQkgIkFzc3VtaW5nIExNOTkgY2hpcCBhdCAiCi0JCQkJCQkgIjB4JTAyeFxuIiwgYWRkcmVzcyk7Ci0JCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCi0JCQkJCQkgIklmIGl0IGlzIGFuIExNODksIHBhc3MgIgotCQkJCQkJICJmb3JjZV9sbTg2PSVkLDB4JTAyeCB3aGVuICIKLQkJCQkJCSAibG9hZGluZyB0aGUgbG05MCBkcml2ZXJcbiIsCi0JCQkJCQkgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksCi0JCQkJCQkgYWRkcmVzcyk7Ci0JCQkJfSBlbHNlCi0JCQkJaWYgKGFkZHJlc3MgPT0gMHg0QwotCQkJCSAmJiAoY2hpcF9pZCAmIDB4RjApID09IDB4MTApIHsgLyogTE04NiAqLwotCQkJCQlraW5kID0gbG04NjsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZQotCQlpZiAoKGFkZHJlc3MgPT0gMHg0QyB8fCBhZGRyZXNzID09IDB4NEQpCi0JCSAmJiBtYW5faWQgPT0gMHg0MSkgeyAvKiBBbmFsb2cgRGV2aWNlcyAqLwotCQkJaWYgKChjaGlwX2lkICYgMHhGMCkgPT0gMHg0MCAvKiBBRE0xMDMyICovCi0JCQkgJiYgKHJlZ19jb25maWcxICYgMHgzRikgPT0gMHgwMAotCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDBBKSB7Ci0JCQkJa2luZCA9IGFkbTEwMzI7CisJCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCisJCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwCisJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgeworCQkJaWYgKGFkZHJlc3MgPT0gMHg0QworCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHgyMCkgeyAvKiBMTTkwICovCisJCQkJbmFtZSA9ICJsbTkwIjsKIAkJCX0gZWxzZQotCQkJaWYgKGNoaXBfaWQgPT0gMHg1MSAvKiBBRFQ3NDYxICovCi0JCQkgJiYgKHJlZ19jb25maWcxICYgMHgxQikgPT0gMHgwMAotCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDBBKSB7Ci0JCQkJa2luZCA9IGFkdDc0NjE7Ci0JCQl9Ci0JCX0gZWxzZQotCQlpZiAobWFuX2lkID09IDB4NEQpIHsgLyogTWF4aW0gKi8KLQkJCS8qCi0JCQkgKiBUaGUgTUFYNjY1NywgTUFYNjY1OCBhbmQgTUFYNjY1OSBkbyBOT1QgaGF2ZSBhCi0JCQkgKiBjaGlwX2lkIHJlZ2lzdGVyLiBSZWFkaW5nIGZyb20gdGhhdCBhZGRyZXNzIHdpbGwKLQkJCSAqIHJldHVybiB0aGUgbGFzdCByZWFkIHZhbHVlLCB3aGljaCBpbiBvdXIgY2FzZSBpcwotCQkJICogdGhvc2Ugb2YgdGhlIG1hbl9pZCByZWdpc3Rlci4gTGlrZXdpc2UsIHRoZSBjb25maWcxCi0JCQkgKiByZWdpc3RlciBzZWVtcyB0byBsYWNrIGEgbG93IG5pYmJsZSwgc28gdGhlIHZhbHVlCi0JCQkgKiB3aWxsIGJlIHRob3NlIG9mIHRoZSBwcmV2aW91cyByZWFkLCBzbyBpbiBvdXIgY2FzZQotCQkJICogdGhvc2Ugb2YgdGhlIG1hbl9pZCByZWdpc3Rlci4KLQkJCSAqLwotCQkJaWYgKGNoaXBfaWQgPT0gbWFuX2lkCi0JCQkgJiYgKGFkZHJlc3MgPT0gMHg0QyB8fCBhZGRyZXNzID09IDB4NEQpCi0JCQkgJiYgKHJlZ19jb25maWcxICYgMHgxRikgPT0gKG1hbl9pZCAmIDB4MEYpCi0JCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDkpIHsKLQkJCSAJa2luZCA9IG1heDY2NTc7CisJCQlpZiAoKGNoaXBfaWQgJiAweEYwKSA9PSAweDMwKSB7IC8qIExNODkvTE05OSAqLworCQkJCW5hbWUgPSAibG05OSI7CisJCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCQkJICJBc3N1bWluZyBMTTk5IGNoaXAgYXQgMHglMDJ4XG4iLAorCQkJCQkgYWRkcmVzcyk7CisJCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCQkJICJJZiBpdCBpcyBhbiBMTTg5LCBpbnN0YW50aWF0ZSBpdCAiCisJCQkJCSAid2l0aCB0aGUgbmV3X2RldmljZSBzeXNmcyAiCisJCQkJCSAiaW50ZXJmYWNlXG4iKTsKIAkJCX0gZWxzZQotCQkJLyogVGhlIGNoaXBfaWQgcmVnaXN0ZXIgb2YgdGhlIE1BWDY2ODAgYW5kIE1BWDY2ODEKLQkJCSAqIGhvbGRzIHRoZSByZXZpc2lvbiBvZiB0aGUgY2hpcC4KLQkJCSAqIHRoZSBsb3dlc3QgYml0IG9mIHRoZSBjb25maWcxIHJlZ2lzdGVyIGlzIHVudXNlZAotCQkJICogYW5kIHNob3VsZCByZXR1cm4gemVybyB3aGVuIHJlYWQsIHNvIHNob3VsZCB0aGUKLQkJCSAqIHNlY29uZCB0byBsYXN0IGJpdCBvZiBjb25maWcxIChzb2Z0d2FyZSByZXNldCkKLQkJCSAqLwotCQkJaWYgKGNoaXBfaWQgPT0gMHgwMQotCQkJICYmIChyZWdfY29uZmlnMSAmIDB4MDMpID09IDB4MDAKLQkJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwNykgewotCQkJIAlraW5kID0gbWF4NjY4MDsKLQkJCX0gZWxzZQotCQkJLyogVGhlIGNoaXBfaWQgcmVnaXN0ZXIgb2YgdGhlIE1BWDY2NDYvNjY0Ny82NjQ5Ci0JCQkgKiBob2xkcyB0aGUgcmV2aXNpb24gb2YgdGhlIGNoaXAuCi0JCQkgKiBUaGUgbG93ZXN0IDYgYml0cyBvZiB0aGUgY29uZmlnMSByZWdpc3RlciBhcmUKLQkJCSAqIHVudXNlZCBhbmQgc2hvdWxkIHJldHVybiB6ZXJvIHdoZW4gcmVhZC4KLQkJCSAqLwotCQkJaWYgKGNoaXBfaWQgPT0gMHg1OQotCQkJICYmIChyZWdfY29uZmlnMSAmIDB4M2YpID09IDB4MDAKLQkJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwNykgewotCQkJCWtpbmQgPSBtYXg2NjQ2OworCQkJaWYgKGFkZHJlc3MgPT0gMHg0QworCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHgxMCkgeyAvKiBMTTg2ICovCisJCQkJbmFtZSA9ICJsbTg2IjsKIAkJCX0KIAkJfQotCi0JCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gZmFpbGVkICovCi0JCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCi0JCQkJIlVuc3VwcG9ydGVkIGNoaXAgYXQgMHglMDJ4IChtYW5faWQ9MHglMDJYLCAiCi0JCQkJImNoaXBfaWQ9MHglMDJYKVxuIiwgYWRkcmVzcywgbWFuX2lkLCBjaGlwX2lkKTsKLQkJCXJldHVybiAtRU5PREVWOworCX0gZWxzZQorCWlmICgoYWRkcmVzcyA9PSAweDRDIHx8IGFkZHJlc3MgPT0gMHg0RCkKKwkgJiYgbWFuX2lkID09IDB4NDEpIHsgLyogQW5hbG9nIERldmljZXMgKi8KKwkJaWYgKChjaGlwX2lkICYgMHhGMCkgPT0gMHg0MCAvKiBBRE0xMDMyICovCisJCSAmJiAocmVnX2NvbmZpZzEgJiAweDNGKSA9PSAweDAwCisJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwQSkgeworCQkJbmFtZSA9ICJhZG0xMDMyIjsKKwkJCS8qIFRoZSBBRE0xMDMyIHN1cHBvcnRzIFBFQywgYnV0IG9ubHkgaWYgY29tYmluZWQKKwkJCSAgIHRyYW5zYWN0aW9ucyBhcmUgbm90IHVzZWQuICovCisJCQlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwKKwkJCQkJCSAgICBJMkNfRlVOQ19TTUJVU19CWVRFKSkKKwkJCQlpbmZvLT5mbGFncyB8PSBJMkNfQ0xJRU5UX1BFQzsKKwkJfSBlbHNlCisJCWlmIChjaGlwX2lkID09IDB4NTEgLyogQURUNzQ2MSAqLworCQkgJiYgKHJlZ19jb25maWcxICYgMHgxQikgPT0gMHgwMAorCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MEEpIHsKKwkJCW5hbWUgPSAiYWR0NzQ2MSI7CisJCX0KKwl9IGVsc2UKKwlpZiAobWFuX2lkID09IDB4NEQpIHsgLyogTWF4aW0gKi8KKwkJLyoKKwkJICogVGhlIE1BWDY2NTcsIE1BWDY2NTggYW5kIE1BWDY2NTkgZG8gTk9UIGhhdmUgYSBjaGlwX2lkCisJCSAqIHJlZ2lzdGVyLiBSZWFkaW5nIGZyb20gdGhhdCBhZGRyZXNzIHdpbGwgcmV0dXJuIHRoZSBsYXN0CisJCSAqIHJlYWQgdmFsdWUsIHdoaWNoIGluIG91ciBjYXNlIGlzIHRob3NlIG9mIHRoZSBtYW5faWQKKwkJICogcmVnaXN0ZXIuIExpa2V3aXNlLCB0aGUgY29uZmlnMSByZWdpc3RlciBzZWVtcyB0byBsYWNrIGEKKwkJICogbG93IG5pYmJsZSwgc28gdGhlIHZhbHVlIHdpbGwgYmUgdGhvc2Ugb2YgdGhlIHByZXZpb3VzCisJCSAqIHJlYWQsIHNvIGluIG91ciBjYXNlIHRob3NlIG9mIHRoZSBtYW5faWQgcmVnaXN0ZXIuCisJCSAqLworCQlpZiAoY2hpcF9pZCA9PSBtYW5faWQKKwkJICYmIChhZGRyZXNzID09IDB4NEMgfHwgYWRkcmVzcyA9PSAweDREKQorCQkgJiYgKHJlZ19jb25maWcxICYgMHgxRikgPT0gKG1hbl9pZCAmIDB4MEYpCisJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgeworCQkJbmFtZSA9ICJtYXg2NjU3IjsKKwkJfSBlbHNlCisJCS8qCisJCSAqIFRoZSBjaGlwX2lkIHJlZ2lzdGVyIG9mIHRoZSBNQVg2NjgwIGFuZCBNQVg2NjgxIGhvbGRzIHRoZQorCQkgKiByZXZpc2lvbiBvZiB0aGUgY2hpcC4gVGhlIGxvd2VzdCBiaXQgb2YgdGhlIGNvbmZpZzEgcmVnaXN0ZXIKKwkJICogaXMgdW51c2VkIGFuZCBzaG91bGQgcmV0dXJuIHplcm8gd2hlbiByZWFkLCBzbyBzaG91bGQgdGhlCisJCSAqIHNlY29uZCB0byBsYXN0IGJpdCBvZiBjb25maWcxIChzb2Z0d2FyZSByZXNldCkuCisJCSAqLworCQlpZiAoY2hpcF9pZCA9PSAweDAxCisJCSAmJiAocmVnX2NvbmZpZzEgJiAweDAzKSA9PSAweDAwCisJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwNykgeworCQkJbmFtZSA9ICJtYXg2NjgwIjsKKwkJfSBlbHNlCisJCS8qCisJCSAqIFRoZSBjaGlwX2lkIHJlZ2lzdGVyIG9mIHRoZSBNQVg2NjQ2LzY2NDcvNjY0OSBob2xkcyB0aGUKKwkJICogcmV2aXNpb24gb2YgdGhlIGNoaXAuIFRoZSBsb3dlc3QgNiBiaXRzIG9mIHRoZSBjb25maWcxCisJCSAqIHJlZ2lzdGVyIGFyZSB1bnVzZWQgYW5kIHNob3VsZCByZXR1cm4gemVybyB3aGVuIHJlYWQuCisJCSAqLworCQlpZiAoY2hpcF9pZCA9PSAweDU5CisJCSAmJiAocmVnX2NvbmZpZzEgJiAweDNmKSA9PSAweDAwCisJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwNykgeworCQkJbmFtZSA9ICJtYXg2NjQ2IjsKIAkJfQogCX0KIAotCS8qIEZpbGwgdGhlIGkyYyBib2FyZCBpbmZvICovCi0JaWYgKGtpbmQgPT0gbG05MCkgewotCQluYW1lID0gImxtOTAiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBhZG0xMDMyKSB7Ci0JCW5hbWUgPSAiYWRtMTAzMiI7Ci0JCS8qIFRoZSBBRE0xMDMyIHN1cHBvcnRzIFBFQywgYnV0IG9ubHkgaWYgY29tYmluZWQKLQkJICAgdHJhbnNhY3Rpb25zIGFyZSBub3QgdXNlZC4gKi8KLQkJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEUpKQotCQkJaW5mby0+ZmxhZ3MgfD0gSTJDX0NMSUVOVF9QRUM7Ci0JfSBlbHNlIGlmIChraW5kID09IGxtOTkpIHsKLQkJbmFtZSA9ICJsbTk5IjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gbG04NikgewotCQluYW1lID0gImxtODYiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBtYXg2NjU3KSB7Ci0JCW5hbWUgPSAibWF4NjY1NyI7Ci0JfSBlbHNlIGlmIChraW5kID09IG1heDY2ODApIHsKLQkJbmFtZSA9ICJtYXg2NjgwIjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gYWR0NzQ2MSkgewotCQluYW1lID0gImFkdDc0NjEiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBtYXg2NjQ2KSB7Ci0JCW5hbWUgPSAibWF4NjY0NiI7CisJaWYgKCFuYW1lKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkiVW5zdXBwb3J0ZWQgY2hpcCBhdCAweCUwMnggKG1hbl9pZD0weCUwMlgsICIKKwkJCSJjaGlwX2lkPTB4JTAyWClcbiIsIGFkZHJlc3MsIG1hbl9pZCwgY2hpcF9pZCk7CisJCXJldHVybiAtRU5PREVWOwogCX0KKwogCXN0cmxjcHkoaW5mby0+dHlwZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05Mi5jIGIvZHJpdmVycy9od21vbi9sbTkyLmMKaW5kZXggYjJlMDBjNS4uNDdhYzY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTkyLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTkyLmMKQEAgLTMyMywzMSArMzIzLDIyIEBACiAJCSAgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gbmV3X2NsaWVudC0+YWRhcHRlcjsKKwl1OCBjb25maWc7CisJdTE2IG1hbl9pZDsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBCiAJCQkJCSAgICB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UKLQkgICBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZSBtdXN0IGlkZW50aWZ5IHRoZSBjaGlwLiAqLwotCWlmIChraW5kIDwgMCkgewotCQl1OCBjb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCSAgICAgTE05Ml9SRUdfQ09ORklHKTsKLQkJdTE2IG1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LAotCQkJICAgICBMTTkyX1JFR19NQU5fSUQpOworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTkyX1JFR19DT05GSUcpOworCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBMTTkyX1JFR19NQU5fSUQpOwogCi0JCWlmICgoY29uZmlnICYgMHhlMCkgPT0gMHgwMAotCQkgJiYgbWFuX2lkID09IDB4MDE4MCkgewotCQkJcHJfaW5mbygibG05MjogRm91bmQgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkyIGNoaXBcbiIpOwotCSAJCWtpbmQgPSBsbTkyOwotCQl9IGVsc2UKLQkJaWYgKG1heDY2MzVfY2hlY2sobmV3X2NsaWVudCkpIHsKLQkJCXByX2luZm8oImxtOTI6IEZvdW5kIE1heGltIE1BWDY2MzUgY2hpcFxuIik7Ci0JCQlraW5kID0gbG05MjsgLyogTm8gc2VwYXJhdGUgcHJlZml4ICovCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlmICgoY29uZmlnICYgMHhlMCkgPT0gMHgwMCAmJiBtYW5faWQgPT0gMHgwMTgwKQorCQlwcl9pbmZvKCJsbTkyOiBGb3VuZCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTIgY2hpcFxuIik7CisJZWxzZSBpZiAobWF4NjYzNV9jaGVjayhuZXdfY2xpZW50KSkKKwkJcHJfaW5mbygibG05MjogRm91bmQgTWF4aW0gTUFYNjYzNSBjaGlwXG4iKTsKKwllbHNlCisJCXJldHVybiAtRU5PREVWOwogCiAJc3RybGNweShpbmZvLT50eXBlLCAibG05MiIsIEkyQ19OQU1FX1NJWkUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTMuYyBiL2RyaXZlcnMvaHdtb24vbG05My5jCmluZGV4IGZjMzZjYWQuLjEyNGRkN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05My5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05My5jCkBAIC05MjgsNyArOTI4LDcgQEAKIAlkYXRhLT5wcm9jaG90X2ludGVydmFsID0gbG05M19yZWFkX2J5dGUoY2xpZW50LAogCQkJTE05M19SRUdfUFJPQ0hPVF9JTlRFUlZBTCk7CiAKLQkvKiBGYW4gQm9vc3QgVGVybXBlcmF0dXJlIHJlZ2lzdGVycyAqLworCS8qIEZhbiBCb29zdCBUZW1wZXJhdHVyZSByZWdpc3RlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlkYXRhLT5ib29zdFtpXSA9IGxtOTNfcmVhZF9ieXRlKGNsaWVudCwgTE05M19SRUdfQk9PU1QoaSkpOwogCkBAIC0yNTA1LDM0ICsyNTA1LDI0IEBACiAJCSAgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCWludCBtZnIsIHZlcjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgTE05M19TTUJVU19GVU5DX01JTikpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogZGV0ZWN0aW9uICovCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCWludCBtZnIgPSBsbTkzX3JlYWRfYnl0ZShjbGllbnQsIExNOTNfUkVHX01GUl9JRCk7Ci0KLQkJaWYgKG1mciAhPSAweDAxKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsImRldGVjdCBmYWlsZWQsICIKLQkJCQkiYmFkIG1hbnVmYWN0dXJlciBpZCAweCUwMnghXG4iLCBtZnIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwltZnIgPSBsbTkzX3JlYWRfYnl0ZShjbGllbnQsIExNOTNfUkVHX01GUl9JRCk7CisJaWYgKG1mciAhPSAweDAxKSB7CisJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCSJkZXRlY3QgZmFpbGVkLCBiYWQgbWFudWZhY3R1cmVyIGlkIDB4JTAyeCFcbiIsIG1mcik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChraW5kIDw9IDApIHsKLQkJaW50IHZlciA9IGxtOTNfcmVhZF9ieXRlKGNsaWVudCwgTE05M19SRUdfVkVSKTsKLQotCQlpZiAoKHZlciA9PSBMTTkzX01GUl9JRCkgfHwgKHZlciA9PSBMTTkzX01GUl9JRF9QUk9UT1RZUEUpKSB7Ci0JCQlraW5kID0gbG05MzsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwiZGV0ZWN0IGZhaWxlZCwgIgotCQkJCSJiYWQgdmVyc2lvbiBpZCAweCUwMnghXG4iLCB2ZXIpOwotCQkJaWYgKGtpbmQgPT0gMCkKLQkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCi0JCQkJCSIoaWdub3JlZCAnZm9yY2UnIHBhcmFtZXRlcilcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwl2ZXIgPSBsbTkzX3JlYWRfYnl0ZShjbGllbnQsIExNOTNfUkVHX1ZFUik7CisJaWYgKHZlciAhPSBMTTkzX01GUl9JRCAmJiB2ZXIgIT0gTE05M19NRlJfSURfUFJPVE9UWVBFKSB7CisJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCSJkZXRlY3QgZmFpbGVkLCBiYWQgdmVyc2lvbiBpZCAweCUwMnghXG4iLCB2ZXIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlzdHJsY3B5KGluZm8tPnR5cGUsICJsbTkzIiwgSTJDX05BTUVfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCmluZGV4IGUzNGY5ZTQuLjkwNmI4OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCkBAIC0zMTUsNTEgKzMxNSwyMyBAQAogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CiAJaW50IGFkZHJlc3MgPSBuZXdfY2xpZW50LT5hZGRyOwotCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKwljb25zdCBjaGFyICpuYW1lOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qCi0JICogTm93IHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiBBIG5lZ2F0aXZlIGtpbmQgbWVhbnMgdGhhdAotCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIG5vIGZvcmNlIHBhcmFtZXRlciAoZGVmYXVsdCksIHNvIHdlCi0JICogbXVzdCBib3RoIGRldGVjdCBhbmQgaWRlbnRpZnkgdGhlIGNoaXAuIEEgemVybyBraW5kIG1lYW5zIHRoYXQKLQkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCi0JICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCi0JICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCi0JICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcwotCSAqIGFyZSBza2lwcGVkLgotCSAqLwotCWlmIChraW5kIDwgMCkgewkvKiBkZXRlY3Rpb24gKi8KLQkJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9NQU5fSUQpCi0JCSAgICAgIT0gTUFOVUZBQ1RVUkVSX0lEKQotCQl8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfQ0hJUF9JRCkKLQkJICAgIDwgREVGQVVMVF9SRVZJU0lPTikpIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKLQkJCQkiTE05NTI0MSBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeC5cbiIsCi0JCQkJYWRkcmVzcyk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gKi8KLQkJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9NQU5fSUQpCi0JCSAgICAgPT0gTUFOVUZBQ1RVUkVSX0lEKQotCQkmJiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfQ0hJUF9JRCkKLQkJICAgID49IERFRkFVTFRfUkVWSVNJT04pKSB7Ci0KLQkJCWtpbmQgPSBsbTk1MjQxOwotCi0JCQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLwotCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsICJVbnN1cHBvcnRlZCBjaGlwXG4iKTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQkJfQorCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfTUFOX0lEKQorCSAgICAgPT0gTUFOVUZBQ1RVUkVSX0lEKQorCSAmJiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfQ0hJUF9JRCkKKwkgICAgID49IERFRkFVTFRfUkVWSVNJT04pKSB7CisJCW5hbWUgPSAibG05NTI0MSI7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiTE05NTI0MSBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCWFkZHJlc3MpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBGaWxsIHRoZSBpMmMgYm9hcmQgaW5mbyAqLwotCWlmIChraW5kID09IGxtOTUyNDEpCi0JCW5hbWUgPSAibG05NTI0MSI7CiAJc3RybGNweShpbmZvLT50eXBlLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MTYxOS5jIGIvZHJpdmVycy9od21vbi9tYXgxNjE5LmMKaW5kZXggNzg5Nzc1NC4uN2ZjZjVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXgxNjE5LmMKKysrIGIvZHJpdmVycy9od21vbi9tYXgxNjE5LmMKQEAgLTIyNiw1OCArMjI2LDM0IEBACiAgKi8KIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW50IG1heDE2MTlfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LCBpbnQga2luZCwKK3N0YXRpYyBpbnQgbWF4MTYxOV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGtpbmQsCiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOwotCXU4IHJlZ19jb25maWc9MCwgcmVnX2NvbnZyYXRlPTAsIHJlZ19zdGF0dXM9MDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJdTggcmVnX2NvbmZpZywgcmVnX2NvbnZyYXRlLCByZWdfc3RhdHVzLCBtYW5faWQsIGNoaXBfaWQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyoKLQkgKiBOb3cgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEEgbmVnYXRpdmUga2luZCBtZWFucyB0aGF0Ci0JICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UgcGFyYW1ldGVyIChkZWZhdWx0KSwgc28gd2UKLQkgKiBtdXN0IGJvdGggZGV0ZWN0IGFuZCBpZGVudGlmeSB0aGUgY2hpcC4gQSB6ZXJvIGtpbmQgbWVhbnMgdGhhdAotCSAqIHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIsIHRoZSBkZXRlY3Rpb24KLQkgKiBzdGVwIHNoYWxsIGJlIHNraXBwZWQuIEEgcG9zaXRpdmUga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIKLQkgKiB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciBhbmQgYSBnaXZlbiBraW5kIG9mIGNoaXAgaXMKLQkgKiByZXF1ZXN0ZWQsIHNvIGJvdGggdGhlIGRldGVjdGlvbiBhbmQgdGhlIGlkZW50aWZpY2F0aW9uIHN0ZXBzCi0JICogYXJlIHNraXBwZWQuCi0JICovCi0JaWYgKGtpbmQgPCAwKSB7IC8qIGRldGVjdGlvbiAqLwotCQlyZWdfY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkgICAgICBNQVgxNjE5X1JFR19SX0NPTkZJRyk7Ci0JCXJlZ19jb252cmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJICAgICAgIE1BWDE2MTlfUkVHX1JfQ09OVlJBVEUpOwotCQlyZWdfc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJTUFYMTYxOV9SRUdfUl9TVEFUVVMpOwotCQlpZiAoKHJlZ19jb25maWcgJiAweDAzKSAhPSAweDAwCi0JCSB8fCByZWdfY29udnJhdGUgPiAweDA3IHx8IChyZWdfc3RhdHVzICYgMHg2MSApICE9MHgwMCkgewotCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAotCQkJCSJNQVgxNjE5IGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKLQkJCQluZXdfY2xpZW50LT5hZGRyKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJLyogZGV0ZWN0aW9uICovCisJcmVnX2NvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2MTlfUkVHX1JfQ09ORklHKTsKKwlyZWdfY29udnJhdGUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjE5X1JFR19SX0NPTlZSQVRFKTsKKwlyZWdfc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTYxOV9SRUdfUl9TVEFUVVMpOworCWlmICgocmVnX2NvbmZpZyAmIDB4MDMpICE9IDB4MDAKKwkgfHwgcmVnX2NvbnZyYXRlID4gMHgwNyB8fCAocmVnX3N0YXR1cyAmIDB4NjEpICE9IDB4MDApIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiTUFYMTYxOSBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCWNsaWVudC0+YWRkcik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gKi8KLQkJdTggbWFuX2lkLCBjaGlwX2lkOwotCQotCQltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCSBNQVgxNjE5X1JFR19SX01BTl9JRCk7Ci0JCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCSAgTUFYMTYxOV9SRUdfUl9DSElQX0lEKTsKLQkJCi0JCWlmICgobWFuX2lkID09IDB4NEQpICYmIChjaGlwX2lkID09IDB4MDQpKQotCQkJa2luZCA9IG1heDE2MTk7Ci0KLQkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KLQkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCi0JCQkgICAgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwMlgsICIKLQkJCSAgICAiY2hpcF9pZD0weCUwMlgpLlxuIiwgbWFuX2lkLCBjaGlwX2lkKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJLyogaWRlbnRpZmljYXRpb24gKi8KKwltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjE5X1JFR19SX01BTl9JRCk7CisJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2MTlfUkVHX1JfQ0hJUF9JRCk7CisJaWYgKG1hbl9pZCAhPSAweDREIHx8IGNoaXBfaWQgIT0gMHgwNCkgeworCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LAorCQkJICJVbnN1cHBvcnRlZCBjaGlwIChtYW5faWQ9MHglMDJYLCBjaGlwX2lkPTB4JTAyWCkuXG4iLAorCQkJIG1hbl9pZCwgY2hpcF9pZCk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgIm1heDE2MTkiLCBJMkNfTkFNRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4NjY1MC5jIGIvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKaW5kZXggNThmNjZiZS4uMWRhNTYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKKysrIGIvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKQEAgLTUzNCw3ICs1MzQsNyBAQAogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKIAlpbnQgYWRkcmVzcyA9IGNsaWVudC0+YWRkcjsKIAotCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIm1heDY2NTBfZGV0ZWN0IGNhbGxlZCwga2luZCA9ICVkXG4iLCBraW5kKTsKKwlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJtYXg2NjUwX2RldGVjdCBjYWxsZWRcbiIpOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CiAJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIm1heDY2NTA6IEkyQyBidXMgZG9lc24ndCBzdXBwb3J0ICIKQEAgLTU0MiwyMyArNTQyLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyoKLQkgKiBOb3cgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEEgbmVnYXRpdmUga2luZCBtZWFucyB0aGF0Ci0JICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UgcGFyYW1ldGVyIChkZWZhdWx0KSwgc28gd2UKLQkgKiBtdXN0IGJvdGggZGV0ZWN0IGFuZCBpZGVudGlmeSB0aGUgY2hpcCAoYWN0dWFsbHkgdGhlcmUgaXMgb25seQotCSAqIG9uZSBwb3NzaWJsZSBraW5kIG9mIGNoaXAgZm9yIG5vdywgbWF4NjY1MCkuIEEgemVybyBraW5kIG1lYW5zIHRoYXQKLQkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCi0JICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCi0JICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCi0JICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcwotCSAqIGFyZSBza2lwcGVkLgotCSAqCi0JICogQ3VycmVudGx5IEkgY2FuIGZpbmQgbm8gd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBNQVg2NjUwIGFuZAotCSAqIGEgTUFYNjY1MS4gVGhpcyBkcml2ZXIgaGFzIG9ubHkgYmVlbiB0cmllZCBvbiB0aGUgZm9ybWVyLgotCSAqLwotCi0JaWYgKChraW5kIDwgMCkgJiYKLQkgICAoICAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQ09ORklHKSAmIDB4QzApCisJaWYgKCgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQ09ORklHKSAmIDB4QzApCiAJICAgIHx8KGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0dQSU9fU1RBVCkgJiAweEUwKQogCSAgICB8fChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19BTEFSTV9FTikgJiAweEUwKQogCSAgICB8fChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19BTEFSTSkgJiAweEUwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYzEzNzgzLWFkYy5jIGIvZHJpdmVycy9od21vbi9tYzEzNzgzLWFkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4M2ZhODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL21jMTM3ODMtYWRjLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBNQzEzNzgzIGFkYy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MQorICogRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21mZC9tYzEzNzgzLXByaXZhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjZGVmaW5lIE1DMTM3ODNfQURDX05BTUUJIm1jMTM3ODMtYWRjIgorCitzdHJ1Y3QgbWMxMzc4M19hZGNfcHJpdiB7CisJc3RydWN0IG1jMTM3ODMgKm1jMTM3ODM7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworfTsKKworc3RhdGljIHNzaXplX3QgbWMxMzc4M19hZGNfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgICAgICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAibWMxMzc4M19hZGNcbiIpOworfQorCitzdGF0aWMgaW50IG1jMTM3ODNfYWRjX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgdW5zaWduZWQgaW50ICp2YWwpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtYzEzNzgzX2FkY19wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXVuc2lnbmVkIGludCBjaGFubmVsID0gYXR0ci0+aW5kZXg7CisJdW5zaWduZWQgaW50IHNhbXBsZVs0XTsKKwlpbnQgcmV0OworCisJcmV0ID0gbWMxMzc4M19hZGNfZG9fY29udmVyc2lvbihwcml2LT5tYzEzNzgzLAorCQkJTUMxMzc4M19BRENfTU9ERV9NVUxUX0NIQU4sCisJCQljaGFubmVsLCBzYW1wbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljaGFubmVsICY9IDB4NzsKKworCSp2YWwgPSAoc2FtcGxlW2NoYW5uZWwgJSA0XSA+PiAoY2hhbm5lbCA+IDMgPyAxNCA6IDIpKSAmIDB4M2ZmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1jMTM3ODNfYWRjX3JlYWRfYnAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIHZhbDsKKwlpbnQgcmV0ID0gbWMxMzc4M19hZGNfcmVhZChkZXYsIGRldmF0dHIsICZ2YWwpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQlAgKGNoYW5uZWwgMikgcmVwb3J0cyB3aXRoIG9mZnNldCAyLjRWIHRvIHRoZSBhY3R1YWwgdmFsdWUgdG8gZml0CisJICogdGhlIGlucHV0IHJhbmdlIG9mIHRoZSBBREMuICB1bml0ID0gMi4yNW1WID0gOS80IG1WLgorCSAqLworCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCAqIDksIDQpICsgMjQwMDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBtYzEzNzgzX2FkY19yZWFkX2dwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCB2YWw7CisJaW50IHJldCA9IG1jMTM3ODNfYWRjX3JlYWQoZGV2LCBkZXZhdHRyLCAmdmFsKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIGlucHV0IHJhbmdlIGlzIFswLCAyLjNWXSwgdmFsIGhhcyAxMCBiaXRzLCBzbyBlYWNoIGJpdAorCSAqIGlzIHdvcnRoIDkvNCBtVi4KKwkgKi8KKwl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwgKiA5LCA0KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgbWMxMzc4M19hZGNfc2hvd19uYW1lLCBOVUxMKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2JwLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2dwLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2dwLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW43X2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2dwLCBOVUxMLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW44X2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2dwLCBOVUxMLCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW45X2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2dwLCBOVUxMLCA5KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMF9pbnB1dCwgU19JUlVHTywgbWMxMzc4M19hZGNfcmVhZF9ncCwgTlVMTCwgMTApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjExX2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2dwLCBOVUxMLCAxMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTJfaW5wdXQsIFNfSVJVR08sIG1jMTM3ODNfYWRjX3JlYWRfZ3AsIE5VTEwsIDEyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xM19pbnB1dCwgU19JUlVHTywgbWMxMzc4M19hZGNfcmVhZF9ncCwgTlVMTCwgMTMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE0X2lucHV0LCBTX0lSVUdPLCBtYzEzNzgzX2FkY19yZWFkX2dwLCBOVUxMLCAxNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTVfaW5wdXQsIFNfSVJVR08sIG1jMTM3ODNfYWRjX3JlYWRfZ3AsIE5VTEwsIDE1KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1jMTM3ODNfYXR0cltdID0geworCSZkZXZfYXR0cl9uYW1lLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW42X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjEwX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjExX2lucHV0LmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWMxMzc4M19ncm91cCA9IHsKKwkuYXR0cnMgPSBtYzEzNzgzX2F0dHIsCit9OworCisvKiBsYXN0IGZvdXIgY2hhbm5lbHMgbWF5IGJlIG9jY3VwaWVkIGJ5IHRoZSB0b3VjaHNjcmVlbiAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1jMTM3ODNfYXR0cl90c1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW4xMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1jMTM3ODNfZ3JvdXBfdHMgPSB7CisJLmF0dHJzID0gbWMxMzc4M19hdHRyX3RzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWMxMzc4M19hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWMxMzc4M19hZGNfcHJpdiAqcHJpdjsKKwlpbnQgcmV0OworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJm1jMTM3ODNfZ3JvdXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2Vycl9jcmVhdGUxOworCisJaWYgKCEocHJpdi0+bWMxMzc4My0+ZmxhZ3MgJiBNQzEzNzgzX1VTRV9UT1VDSFNDUkVFTikpCisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZtYzEzNzgzX2dyb3VwX3RzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2Vycl9jcmVhdGUyOworCisJcHJpdi0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIocHJpdi0+aHdtb25fZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHByaXYtPmh3bW9uX2Rldik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiaHdtb25fZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZCB3aXRoICVkLlxuIiwgcmV0KTsKKwkJZ290byBvdXRfZXJyX3JlZ2lzdGVyOworCX0KKworCisJcmV0dXJuIDA7CisKK291dF9lcnJfcmVnaXN0ZXI6CisKKwlpZiAoIShwcml2LT5tYzEzNzgzLT5mbGFncyAmIE1DMTM3ODNfVVNFX1RPVUNIU0NSRUVOKSkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJm1jMTM3ODNfZ3JvdXBfdHMpOworb3V0X2Vycl9jcmVhdGUyOgorCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJm1jMTM3ODNfZ3JvdXApOworb3V0X2Vycl9jcmVhdGUxOgorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocHJpdik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYzEzNzgzX2FkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWMxMzc4M19hZGNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+aHdtb25fZGV2KTsKKworCWlmICghKHByaXYtPm1jMTM3ODMtPmZsYWdzICYgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4pKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbWMxMzc4M19ncm91cF90cyk7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbWMxMzc4M19ncm91cCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYzEzNzgzX2FkY19kcml2ZXIgPSB7CisJLnJlbW92ZSAJPSBfX2RldmV4aXRfcChtYzEzNzgzX2FkY19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSBNQzEzNzgzX0FEQ19OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYzEzNzgzX2FkY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmbWMxMzc4M19hZGNfZHJpdmVyLCBtYzEzNzgzX2FkY19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYzEzNzgzX2FkY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1jMTM3ODNfYWRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1jMTM3ODNfYWRjX2luaXQpOworbW9kdWxlX2V4aXQobWMxMzc4M19hZGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTUMxMzc4MyBBREMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMdW90YW8gRnUgPGwuZnVAcGVuZ3V0cm9uaXguZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgTUMxMzc4M19BRENfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3MzYy1od21vbi5jIGIvZHJpdmVycy9od21vbi9zM2MtaHdtb24uYwppbmRleCA3MTgzNTQxLi4zZjNmOWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3MzYy1od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vczNjLWh3bW9uLmMKQEAgLTMyMyw3ICszMjMsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5pbik7IGkrKykgewotCQlzdHJ1Y3QgczNjMjR4eF9hZGNfaHdtb25faW5jZmcgKmNmZyA9IHBkYXRhLT5pbltpXTsKKwkJc3RydWN0IHMzY19od21vbl9jaGNmZyAqY2ZnID0gcGRhdGEtPmluW2ldOwogCiAJCWlmICghY2ZnKQogCQkJY29udGludWU7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJCQkgImNoYW5uZWwgJWQgbXVsdGlwbGllciB0b28gbGFyZ2VcbiIsCiAJCQkJIGkpOwogCi0JCWlmIChjZmctPmRpdmlkZXIgPT0gMCkgeworCQlpZiAoY2ZnLT5kaXYgPT0gMCkgewogCQkJZGV2X2VycigmZGV2LT5kZXYsICJjaGFubmVsICVkIGRpdmlkZXIgemVyb1xuIiwgaSk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdtMTkyLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xOTIuYwppbmRleCA4YmI1Y2I1Li40ZDg4YzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xOTIuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xOTIuYwpAQCAtNDkxLDI0ICs0OTEsMjIgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBEZXRlY3Rpb24gY3JpdGVyaWEgZnJvbSBzZW5zb3JzX2RldGVjdCBzY3JpcHQgKi8KLQlpZiAoa2luZCA8IDApIHsKLQkJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJdmVyc2lvbiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFNNU0M0N00xOTJfUkVHX1ZFUlNJT04pOworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAogCQkJCVNNU0M0N00xOTJfUkVHX0NPTVBBTllfSUQpID09IDB4NTUKLQkJICYmICgodmVyc2lvbiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJU01TQzQ3TTE5Ml9SRUdfVkVSU0lPTikpICYgMHhmMCkgPT0gMHgyMAotCQkgJiYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJICYmICh2ZXJzaW9uICYgMHhmMCkgPT0gMHgyMAorCSAmJiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQlTTVNDNDdNMTkyX1JFR19WSUQpICYgMHg3MCkgPT0gMHgwMAotCQkgJiYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAogCQkJCVNNU0M0N00xOTJfUkVHX1ZJRDQpICYgMHhmZSkgPT0gMHg4MCkgewotCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKLQkJCQkgImZvdW5kIFNNU0M0N00xOTIgb3IgY29tcGF0aWJsZSwgIgotCQkJCSAidmVyc2lvbiAyLCBzdGVwcGluZyBBJWRcbiIsIHZlcnNpb24gJiAweDBmKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKLQkJCQkiU01TQzQ3TTE5MiBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKLQkJCQljbGllbnQtPmFkZHIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCSAiZm91bmQgU01TQzQ3TTE5MiBvciBjb21wYXRpYmxlLCAiCisJCQkgInZlcnNpb24gMiwgc3RlcHBpbmcgQSVkXG4iLCB2ZXJzaW9uICYgMHgwZik7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJIlNNU0M0N00xOTIgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnhcbiIsCisJCQljbGllbnQtPmFkZHIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlzdHJsY3B5KGluZm8tPnR5cGUsICJzbXNjNDdtMTkyIiwgSTJDX05BTUVfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3RobWM1MC5jIGIvZHJpdmVycy9od21vbi90aG1jNTAuYwppbmRleCA3ZDk3NDMxLi40Yjc5Mzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3RobWM1MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdGhtYzUwLmMKQEAgLTM2LDcgKzM2LDExIEBACiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF8yKHRobWM1MCwgYWRtMTAyMik7Ci1JMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGFkbTEwMjJfdGVtcDMsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyAiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhZG0xMDIyX3RlbXAzWzE2XTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWRtMTAyMl90ZW1wM19udW07Cittb2R1bGVfcGFyYW1fYXJyYXkoYWRtMTAyMl90ZW1wMywgdXNob3J0LCAmYWRtMTAyMl90ZW1wM19udW0sIDApOworTU9EVUxFX1BBUk1fREVTQyhhZG0xMDIyX3RlbXAzLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgIgogCQkJInRvIGVuYWJsZSAzcmQgdGVtcGVyYXR1cmUgKEFETTEwMjIgb25seSkiKTsKIAogLyogTWFueSBUSE1DNTAgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLwpAQCAtMjg5LDcgKzI5Myw2IEBACiAJdW5zaWduZWQgcmV2aXNpb247CiAJdW5zaWduZWQgY29uZmlnOwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKLQlpbnQgZXJyID0gMDsKIAljb25zdCBjaGFyICp0eXBlX25hbWU7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKQEAgLTMwMSwzMSArMzA0LDEzIEBACiAJcHJfZGVidWcoInRobWM1MDogUHJvYmluZyBmb3IgVEhNQzUwIGF0IDB4JTJYIG9uIGJ1cyAlZFxuIiwKIAkJIGNsaWVudC0+YWRkciwgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSk7CiAKLQkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLwogCWNvbXBhbnkgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBUSE1DNTBfUkVHX0NPTVBBTllfSUQpOwogCXJldmlzaW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVEhNQzUwX1JFR19ESUVfQ09ERSk7CiAJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVEhNQzUwX1JFR19DT05GKTsKKwlpZiAocmV2aXNpb24gPCAweGMwIHx8IChjb25maWcgJiAweDEwKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoa2luZCA9PSAwKQotCQlraW5kID0gdGhtYzUwOwotCWVsc2UgaWYgKGtpbmQgPCAwKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWlmIChyZXZpc2lvbiA+PSAweGMwICYmICgoY29uZmlnICYgMHgxMCkgPT0gMCkpIHsKLQkJCWlmIChjb21wYW55ID09IDB4NDkpIHsKLQkJCQlraW5kID0gdGhtYzUwOwotCQkJCWVyciA9IDA7Ci0JCQl9IGVsc2UgaWYgKGNvbXBhbnkgPT0gMHg0MSkgewotCQkJCWtpbmQgPSBhZG0xMDIyOwotCQkJCWVyciA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGVyciA9PSAtRU5PREVWKSB7Ci0JCXByX2RlYnVnKCJ0aG1jNTA6IERldGVjdGlvbiBvZiBUSE1DNTAvQURNMTAyMiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChraW5kID09IGFkbTEwMjIpIHsKKwlpZiAoY29tcGFueSA9PSAweDQxKSB7CiAJCWludCBpZCA9IGkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlcik7CiAJCWludCBpOwogCkBAIC0zNDAsOSArMzI1LDEzIEBACiAJCQkJCQkJICBjb25maWcpOwogCQkJCWJyZWFrOwogCQkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChjb21wYW55ID09IDB4NDkpIHsKIAkJdHlwZV9uYW1lID0gInRobWM1MCI7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoInRobWM1MDogRGV0ZWN0aW9uIG9mIFRITUM1MC9BRE0xMDIyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KKwogCXByX2RlYnVnKCJ0aG1jNTA6IERldGVjdGVkICVzICh2ZXJzaW9uICV4LCByZXZpc2lvbiAleClcbiIsCiAJCSB0eXBlX25hbWUsIChyZXZpc2lvbiA+PiA0KSAtIDB4YywgcmV2aXNpb24gJiAweGYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3RtcDQwMS5jIGIvZHJpdmVycy9od21vbi90bXA0MDEuYwppbmRleCA3YjM0ZjJjLi5lZTk2NzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3RtcDQwMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdG1wNDAxLmMKQEAgLTQ4OCw0NiArNDg4LDQzIEBACiAJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBUTVA0MDFfQ09ORklHX1dSSVRFLCBjb25maWcpOwogfQogCi1zdGF0aWMgaW50IHRtcDQwMV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGtpbmQsCitzdGF0aWMgaW50IHRtcDQwMV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IF9raW5kLAogCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKKwllbnVtIGNoaXBzIGtpbmQ7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCXU4IHJlZzsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBEZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwICovCi0JaWYgKGtpbmQgPD0gMCkgewotCQl1OCByZWc7CisJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVE1QNDAxX01BTlVGQUNUVVJFUl9JRF9SRUcpOworCWlmIChyZWcgIT0gVE1QNDAxX01BTlVGQUNUVVJFUl9JRCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJICAgICAgIFRNUDQwMV9NQU5VRkFDVFVSRVJfSURfUkVHKTsKLQkJaWYgKHJlZyAhPSBUTVA0MDFfTUFOVUZBQ1RVUkVSX0lEKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVE1QNDAxX0RFVklDRV9JRF9SRUcpOwogCi0JCXJlZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFRNUDQwMV9ERVZJQ0VfSURfUkVHKTsKLQotCQlzd2l0Y2ggKHJlZykgewotCQljYXNlIFRNUDQwMV9ERVZJQ0VfSUQ6Ci0JCQlraW5kID0gdG1wNDAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE1QNDExX0RFVklDRV9JRDoKLQkJCWtpbmQgPSB0bXA0MTE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVE1QNDAxX0NPTkZJR19SRUFEKTsKLQkJaWYgKHJlZyAmIDB4MWIpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkgICAgICAgVE1QNDAxX0NPTlZFUlNJT05fUkFURV9SRUFEKTsKLQkJLyogRGF0YXNoZWV0IHNheXM6IDB4MS0weDYgKi8KLQkJaWYgKHJlZyA+IDE1KQotCQkJcmV0dXJuIC1FTk9ERVY7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFRNUDQwMV9ERVZJQ0VfSUQ6CisJCWtpbmQgPSB0bXA0MDE7CisJCWJyZWFrOworCWNhc2UgVE1QNDExX0RFVklDRV9JRDoKKwkJa2luZCA9IHRtcDQxMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCisJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVE1QNDAxX0NPTkZJR19SRUFEKTsKKwlpZiAocmVnICYgMHgxYikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBUTVA0MDFfQ09OVkVSU0lPTl9SQVRFX1JFQUQpOworCS8qIERhdGFzaGVldCBzYXlzOiAweDEtMHg2ICovCisJaWYgKHJlZyA+IDE1KQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXN0cmxjcHkoaW5mby0+dHlwZSwgdG1wNDAxX2lkW2tpbmQgLSAxXS5uYW1lLCBJMkNfTkFNRV9TSVpFKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi90bXA0MjEuYyBiL2RyaXZlcnMvaHdtb24vdG1wNDIxLmMKaW5kZXggMjA5MjQzNC4uYmI1NDY0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi90bXA0MjEuYworKysgYi9kcml2ZXJzL2h3bW9uL3RtcDQyMS5jCkBAIC0yMjMsMzkgKzIyMywzNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRtcDQyMV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGtpbmQsCitzdGF0aWMgaW50IHRtcDQyMV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IF9raW5kLAogCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKKwllbnVtIGNoaXBzIGtpbmQ7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwogCWNvbnN0IGNoYXIgKm5hbWVzW10gPSB7ICJUTVA0MjEiLCAiVE1QNDIyIiwgIlRNUDQyMyIgfTsKKwl1OCByZWc7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGtpbmQgPD0gMCkgewotCQl1OCByZWc7CisJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVE1QNDIxX01BTlVGQUNUVVJFUl9JRF9SRUcpOworCWlmIChyZWcgIT0gVE1QNDIxX01BTlVGQUNUVVJFUl9JRCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJICAgICAgIFRNUDQyMV9NQU5VRkFDVFVSRVJfSURfUkVHKTsKLQkJaWYgKHJlZyAhPSBUTVA0MjFfTUFOVUZBQ1RVUkVSX0lEKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJICAgICAgIFRNUDQyMV9ERVZJQ0VfSURfUkVHKTsKLQkJc3dpdGNoIChyZWcpIHsKLQkJY2FzZSBUTVA0MjFfREVWSUNFX0lEOgotCQkJa2luZCA9IHRtcDQyMTsKLQkJCWJyZWFrOwotCQljYXNlIFRNUDQyMl9ERVZJQ0VfSUQ6Ci0JCQlraW5kID0gdG1wNDIyOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE1QNDIzX0RFVklDRV9JRDoKLQkJCWtpbmQgPSB0bXA0MjM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVE1QNDIxX0RFVklDRV9JRF9SRUcpOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBUTVA0MjFfREVWSUNFX0lEOgorCQlraW5kID0gdG1wNDIxOworCQlicmVhazsKKwljYXNlIFRNUDQyMl9ERVZJQ0VfSUQ6CisJCWtpbmQgPSB0bXA0MjI7CisJCWJyZWFrOworCWNhc2UgVE1QNDIzX0RFVklDRV9JRDoKKwkJa2luZCA9IHRtcDQyMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCiAJc3RybGNweShpbmZvLT50eXBlLCB0bXA0MjFfaWRba2luZCAtIDFdLm5hbWUsIEkyQ19OQU1FX1NJWkUpOwogCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsICJEZXRlY3RlZCBUSSAlcyBjaGlwIGF0IDB4JTAyeFxuIiwKIAkJIG5hbWVzW2tpbmQgLSAxXSwgY2xpZW50LT5hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCAyYmUyOGFjLi5iMjU3YzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC01OSwxMCArNTksMTEgQEAKICNkZWZpbmUgRFJWTkFNRSAidzgzNjI3aGYiCiBlbnVtIGNoaXBzIHsgdzgzNjI3aGYsIHc4MzYyN3RoZiwgdzgzNjk3aGYsIHc4MzYzN2hmLCB3ODM2ODd0aGYgfTsKIAotc3RhdGljIHUxNiBmb3JjZV9hZGRyOwotbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCi0JCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CitzdHJ1Y3QgdzgzNjI3aGZfc2lvX2RhdGEgeworCWVudW0gY2hpcHMgdHlwZTsKKwlpbnQgc2lvYWRkcjsKK307CisKIHN0YXRpYyB1OCBmb3JjZV9pMmMgPSAweDFmOwogbW9kdWxlX3BhcmFtKGZvcmNlX2kyYywgYnl0ZSwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2kyYywKQEAgLTc3LDkgKzc4LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaWQsICJPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgZGV2aWNlIElEIik7CiAKIC8qIG1vZGlmaWVkIGZyb20ga2VybmVsL2luY2x1ZGUvdHJhcHMuYyAqLwotc3RhdGljIGludCBSRUc7CQkvKiBUaGUgcmVnaXN0ZXIgdG8gcmVhZC93cml0ZSAqLwogI2RlZmluZQlERVYJMHgwNwkvKiBSZWdpc3RlcjogTG9naWNhbCBkZXZpY2Ugc2VsZWN0ICovCi1zdGF0aWMgaW50IFZBTDsJCS8qIFRoZSB2YWx1ZSB0byByZWFkL3dyaXRlICovCiAKIC8qIGxvZ2ljYWwgZGV2aWNlIG51bWJlcnMgZm9yIHN1cGVyaW9fc2VsZWN0IChiZWxvdykgKi8KICNkZWZpbmUgVzgzNjI3SEZfTERfRkRDCQkweDAwCkBAIC0xMDksMzcgKzEwOCwzNyBAQAogI2RlZmluZSBXODM2ODdUSEZfVklEX0RBVEEJMHhGMSAvKiB3ODM2ODd0aGYgb25seSAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXN1cGVyaW9fb3V0YihpbnQgcmVnLCBpbnQgdmFsKQorc3VwZXJpb19vdXRiKHN0cnVjdCB3ODM2MjdoZl9zaW9fZGF0YSAqc2lvLCBpbnQgcmVnLCBpbnQgdmFsKQogewotCW91dGIocmVnLCBSRUcpOwotCW91dGIodmFsLCBWQUwpOworCW91dGIocmVnLCBzaW8tPnNpb2FkZHIpOworCW91dGIodmFsLCBzaW8tPnNpb2FkZHIgKyAxKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLXN1cGVyaW9faW5iKGludCByZWcpCitzdXBlcmlvX2luYihzdHJ1Y3QgdzgzNjI3aGZfc2lvX2RhdGEgKnNpbywgaW50IHJlZykKIHsKLQlvdXRiKHJlZywgUkVHKTsKLQlyZXR1cm4gaW5iKFZBTCk7CisJb3V0YihyZWcsIHNpby0+c2lvYWRkcik7CisJcmV0dXJuIGluYihzaW8tPnNpb2FkZHIgKyAxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1zdXBlcmlvX3NlbGVjdChpbnQgbGQpCitzdXBlcmlvX3NlbGVjdChzdHJ1Y3QgdzgzNjI3aGZfc2lvX2RhdGEgKnNpbywgaW50IGxkKQogewotCW91dGIoREVWLCBSRUcpOwotCW91dGIobGQsIFZBTCk7CisJb3V0YihERVYsIHNpby0+c2lvYWRkcik7CisJb3V0YihsZCwgIHNpby0+c2lvYWRkciArIDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXN1cGVyaW9fZW50ZXIodm9pZCkKK3N1cGVyaW9fZW50ZXIoc3RydWN0IHc4MzYyN2hmX3Npb19kYXRhICpzaW8pCiB7Ci0Jb3V0YigweDg3LCBSRUcpOwotCW91dGIoMHg4NywgUkVHKTsKKwlvdXRiKDB4ODcsIHNpby0+c2lvYWRkcik7CisJb3V0YigweDg3LCBzaW8tPnNpb2FkZHIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXN1cGVyaW9fZXhpdCh2b2lkKQorc3VwZXJpb19leGl0KHN0cnVjdCB3ODM2MjdoZl9zaW9fZGF0YSAqc2lvKQogewotCW91dGIoMHhBQSwgUkVHKTsKKwlvdXRiKDB4QUEsIHNpby0+c2lvYWRkcik7CiB9CiAKICNkZWZpbmUgVzYyN19ERVZJRCAweDUyCkBAIC0zODAsMTAgKzM3OSw2IEBACiAJdTggdnJtX292dDsJCS8qIFJlZ2lzdGVyIHZhbHVlLCA2MjdUSEYvNjM3SEYvNjg3VEhGIG9ubHkgKi8KIH07CiAKLXN0cnVjdCB3ODM2MjdoZl9zaW9fZGF0YSB7Ci0JZW51bSBjaGlwcyB0eXBlOwotfTsKLQogCiBzdGF0aWMgaW50IHc4MzYyN2hmX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogc3RhdGljIGludCBfX2RldmV4aXQgdzgzNjI3aGZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpAQCAtMTE0MCwxMSArMTEzNSw4IEBACiAJCSJXODM2ODdUSEYiLAogCX07CiAKLQlSRUcgPSBzaW9hZGRyOwotCVZBTCA9IHNpb2FkZHIgKyAxOwotCi0Jc3VwZXJpb19lbnRlcigpOwotCXZhbCA9IGZvcmNlX2lkID8gZm9yY2VfaWQgOiBzdXBlcmlvX2luYihERVZJRCk7CisJc3VwZXJpb19lbnRlcihzaW9fZGF0YSk7CisJdmFsID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW5iKHNpb19kYXRhLCBERVZJRCk7CiAJc3dpdGNoICh2YWwpIHsKIAljYXNlIFc2MjdfREVWSUQ6CiAJCXNpb19kYXRhLT50eXBlID0gdzgzNjI3aGY7CkBAIC0xMTY4LDE2ICsxMTYwLDkgQEAKIAkJZ290byBleGl0OwogCX0KIAotCXN1cGVyaW9fc2VsZWN0KFc4MzYyN0hGX0xEX0hXTSk7Ci0JZm9yY2VfYWRkciAmPSBXSU5CX0FMSUdOTUVOVDsKLQlpZiAoZm9yY2VfYWRkcikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRm9yY2luZyBhZGRyZXNzIDB4JXhcbiIsCi0JCSAgICAgICBmb3JjZV9hZGRyKTsKLQkJc3VwZXJpb19vdXRiKFdJTkJfQkFTRV9SRUcsIGZvcmNlX2FkZHIgPj4gOCk7Ci0JCXN1cGVyaW9fb3V0YihXSU5CX0JBU0VfUkVHICsgMSwgZm9yY2VfYWRkciAmIDB4ZmYpOwotCX0KLQl2YWwgPSAoc3VwZXJpb19pbmIoV0lOQl9CQVNFX1JFRykgPDwgOCkgfAotCSAgICAgICBzdXBlcmlvX2luYihXSU5CX0JBU0VfUkVHICsgMSk7CisJc3VwZXJpb19zZWxlY3Qoc2lvX2RhdGEsIFc4MzYyN0hGX0xEX0hXTSk7CisJdmFsID0gKHN1cGVyaW9faW5iKHNpb19kYXRhLCBXSU5CX0JBU0VfUkVHKSA8PCA4KSB8CisJICAgICAgIHN1cGVyaW9faW5iKHNpb19kYXRhLCBXSU5CX0JBU0VfUkVHICsgMSk7CiAJKmFkZHIgPSB2YWwgJiBXSU5CX0FMSUdOTUVOVDsKIAlpZiAoKmFkZHIgPT0gMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogQmFzZSBhZGRyZXNzIG5vdCBzZXQsICIKQEAgLTExODUsMTggKzExNzAsMTkgQEAKIAkJZ290byBleGl0OwogCX0KIAotCXZhbCA9IHN1cGVyaW9faW5iKFdJTkJfQUNUX1JFRyk7CisJdmFsID0gc3VwZXJpb19pbmIoc2lvX2RhdGEsIFdJTkJfQUNUX1JFRyk7CiAJaWYgKCEodmFsICYgMHgwMSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEVuYWJsaW5nIEhXTSBsb2dpY2FsIGRldmljZVxuIik7Ci0JCXN1cGVyaW9fb3V0YihXSU5CX0FDVF9SRUcsIHZhbCB8IDB4MDEpOworCQlzdXBlcmlvX291dGIoc2lvX2RhdGEsIFdJTkJfQUNUX1JFRywgdmFsIHwgMHgwMSk7CiAJfQogCiAJZXJyID0gMDsKKwlzaW9fZGF0YS0+c2lvYWRkciA9IHNpb2FkZHI7CiAJcHJfaW5mbyhEUlZOQU1FICI6IEZvdW5kICVzIGNoaXAgYXQgJSN4XG4iLAogCQluYW1lc1tzaW9fZGF0YS0+dHlwZV0sICphZGRyKTsKIAogIGV4aXQ6Ci0Jc3VwZXJpb19leGl0KCk7CisJc3VwZXJpb19leGl0KHNpb19kYXRhKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNTExLDIwICsxNDk3LDIxIEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHc4MzYyN3RoZl9yZWFkX2dwaW81KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHc4MzYyN2hmX3Npb19kYXRhICpzaW9fZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludCByZXMgPSAweGZmLCBzZWw7CiAKLQlzdXBlcmlvX2VudGVyKCk7Ci0Jc3VwZXJpb19zZWxlY3QoVzgzNjI3SEZfTERfR1BJTzUpOworCXN1cGVyaW9fZW50ZXIoc2lvX2RhdGEpOworCXN1cGVyaW9fc2VsZWN0KHNpb19kYXRhLCBXODM2MjdIRl9MRF9HUElPNSk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlc2UgR1BJTyBwaW5zIGFyZSBlbmFibGVkICovCi0JaWYgKCEoc3VwZXJpb19pbmIoVzgzNjI3VEhGX0dQSU81X0VOKSAmICgxPDwzKSkpIHsKKwlpZiAoIShzdXBlcmlvX2luYihzaW9fZGF0YSwgVzgzNjI3VEhGX0dQSU81X0VOKSAmICgxPDwzKSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiR1BJTzUgZGlzYWJsZWQsIG5vIFZJRCBmdW5jdGlvblxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHBpbnMgYXJlIGNvbmZpZ3VyZWQgZm9yIGlucHV0CiAJICAgVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBmaXZlIChWUk0gOSksIGFuZCBwb3NzaWJseSA2IChWUk0gMTApICovCi0Jc2VsID0gc3VwZXJpb19pbmIoVzgzNjI3VEhGX0dQSU81X0lPU1IpICYgMHgzZjsKKwlzZWwgPSBzdXBlcmlvX2luYihzaW9fZGF0YSwgVzgzNjI3VEhGX0dQSU81X0lPU1IpICYgMHgzZjsKIAlpZiAoKHNlbCAmIDB4MWYpICE9IDB4MWYpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiR1BJTzUgbm90IGNvbmZpZ3VyZWQgZm9yIFZJRCAiCiAJCQkiZnVuY3Rpb25cbiIpOwpAQCAtMTUzMiwzNyArMTUxOSwzOCBAQAogCX0KIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSZWFkaW5nIFZJRCBmcm9tIEdQSU81XG4iKTsKLQlyZXMgPSBzdXBlcmlvX2luYihXODM2MjdUSEZfR1BJTzVfRFIpICYgc2VsOworCXJlcyA9IHN1cGVyaW9faW5iKHNpb19kYXRhLCBXODM2MjdUSEZfR1BJTzVfRFIpICYgc2VsOwogCiBleGl0OgotCXN1cGVyaW9fZXhpdCgpOworCXN1cGVyaW9fZXhpdChzaW9fZGF0YSk7CiAJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdzgzNjg3dGhmX3JlYWRfdmlkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHc4MzYyN2hmX3Npb19kYXRhICpzaW9fZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludCByZXMgPSAweGZmOwogCi0Jc3VwZXJpb19lbnRlcigpOwotCXN1cGVyaW9fc2VsZWN0KFc4MzYyN0hGX0xEX0hXTSk7CisJc3VwZXJpb19lbnRlcihzaW9fZGF0YSk7CisJc3VwZXJpb19zZWxlY3Qoc2lvX2RhdGEsIFc4MzYyN0hGX0xEX0hXTSk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlc2UgR1BJTyBwaW5zIGFyZSBlbmFibGVkICovCi0JaWYgKCEoc3VwZXJpb19pbmIoVzgzNjg3VEhGX1ZJRF9FTikgJiAoMSA8PCAyKSkpIHsKKwlpZiAoIShzdXBlcmlvX2luYihzaW9fZGF0YSwgVzgzNjg3VEhGX1ZJRF9FTikgJiAoMSA8PCAyKSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVklEIGRpc2FibGVkLCBubyBWSUQgZnVuY3Rpb25cbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJLyogTWFrZSBzdXJlIHRoZSBwaW5zIGFyZSBjb25maWd1cmVkIGZvciBpbnB1dCAqLwotCWlmICghKHN1cGVyaW9faW5iKFc4MzY4N1RIRl9WSURfQ0ZHKSAmICgxIDw8IDQpKSkgeworCWlmICghKHN1cGVyaW9faW5iKHNpb19kYXRhLCBXODM2ODdUSEZfVklEX0NGRykgJiAoMSA8PCA0KSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVklEIGNvbmZpZ3VyZWQgYXMgb3V0cHV0LCAiCiAJCQkibm8gVklEIGZ1bmN0aW9uXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAotCXJlcyA9IHN1cGVyaW9faW5iKFc4MzY4N1RIRl9WSURfREFUQSkgJiAweDNmOworCXJlcyA9IHN1cGVyaW9faW5iKHNpb19kYXRhLCBXODM2ODdUSEZfVklEX0RBVEEpICYgMHgzZjsKIAogZXhpdDoKLQlzdXBlcmlvX2V4aXQoKTsKKwlzdXBlcmlvX2V4aXQoc2lvX2RhdGEpOwogCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jIGIvZHJpdmVycy9od21vbi93ODM3ODFkLmMKaW5kZXggZDI3ZWQxYi4uN2FiNzk2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3ODFkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3ODFkLmMKQEAgLTEwNTQsMTEgKzEwNTQsMTEgQEAKIHc4Mzc4MWRfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBraW5kLAogCSAgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7Ci0JaW50IHZhbDEgPSAwLCB2YWwyOworCWludCB2YWwxLCB2YWwyOwogCXN0cnVjdCB3ODM3ODFkX2RhdGEgKmlzYSA9IHc4Mzc4MWRfZGF0YV9pZl9pc2EoKTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CiAJaW50IGFkZHJlc3MgPSBjbGllbnQtPmFkZHI7Ci0JY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiIjsKKwljb25zdCBjaGFyICpjbGllbnRfbmFtZTsKIAllbnVtIHZlbmRvciB7IHdpbmJvbmQsIGFzdXMgfSB2ZW5kaWQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCkBAIC0xMDcwLDk4ICsxMDcwLDczIEBACiAJaWYgKGlzYSkKIAkJbXV0ZXhfbG9jaygmaXNhLT51cGRhdGVfbG9jayk7CiAKLQkvKiBUaGUgdzgzNzg/ZCBtYXkgYmUgc3R1Y2sgaW4gc29tZSBvdGhlciBiYW5rIHRoYW4gYmFuayAwLiBUaGlzIG1heQotCSAgIG1ha2UgcmVhZGluZyBvdGhlciBpbmZvcm1hdGlvbiBpbXBvc3NpYmxlLiBTcGVjaWZ5IGEgZm9yY2U9Li4uIG9yCi0JICAgZm9yY2VfKj0uLi4gcGFyYW1ldGVyLCBhbmQgdGhlIFdpbmJvbmQgd2lsbCBiZSByZXNldCB0byB0aGUgcmlnaHQKLQkgICBiYW5rLiAqLwotCWlmIChraW5kIDwgMCkgewotCQlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhCi0JCSAgICAoY2xpZW50LCBXODM3ODFEX1JFR19DT05GSUcpICYgMHg4MCkgewotCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgY2hpcCAiCi0JCQkJImZhaWxlZCBhdCBzdGVwIDNcbiIpOworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19DT05GSUcpICYgMHg4MCkgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgY2hpcCBmYWlsZWQgYXQgc3RlcCAzXG4iKTsKKwkJZ290byBlcnJfbm9kZXY7CisJfQorCisJdmFsMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFc4Mzc4MURfUkVHX0JBTkspOworCXZhbDIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19DSElQTUFOKTsKKwkvKiBDaGVjayBmb3IgV2luYm9uZCBvciBBc3VzIElEIGlmIGluIGJhbmsgMCAqLworCWlmICghKHZhbDEgJiAweDA3KSAmJgorCSAgICAoKCEodmFsMSAmIDB4ODApICYmIHZhbDIgIT0gMHhhMyAmJiB2YWwyICE9IDB4YzMpIHx8CisJICAgICAoICh2YWwxICYgMHg4MCkgJiYgdmFsMiAhPSAweDVjICYmIHZhbDIgIT0gMHgxMikpKSB7CisJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCSJEZXRlY3Rpb24gb2YgdzgzNzgxZCBjaGlwIGZhaWxlZCBhdCBzdGVwIDRcbiIpOworCQlnb3RvIGVycl9ub2RldjsKKwl9CisJLyogSWYgV2luYm9uZCBTTUJ1cywgY2hlY2sgYWRkcmVzcyBhdCAweDQ4LgorCSAgIEFzdXMgZG9lc24ndCBzdXBwb3J0LCBleGNlcHQgZm9yIGFzOTkxMjdmIHJldi4yICovCisJaWYgKCghKHZhbDEgJiAweDgwKSAmJiB2YWwyID09IDB4YTMpIHx8CisJICAgICggKHZhbDEgJiAweDgwKSAmJiB2YWwyID09IDB4NWMpKSB7CisJCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19JMkNfQUREUikKKwkJICAgICE9IGFkZHJlc3MpIHsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCQkiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgY2hpcCBmYWlsZWQgYXQgc3RlcCA1XG4iKTsKIAkJCWdvdG8gZXJyX25vZGV2OwogCQl9Ci0JCXZhbDEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19CQU5LKTsKLQkJdmFsMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFc4Mzc4MURfUkVHX0NISVBNQU4pOwotCQkvKiBDaGVjayBmb3IgV2luYm9uZCBvciBBc3VzIElEIGlmIGluIGJhbmsgMCAqLwotCQlpZiAoKCEodmFsMSAmIDB4MDcpKSAmJgotCQkgICAgKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4YTMpICYmICh2YWwyICE9IDB4YzMpKQotCQkgICAgIHx8ICgodmFsMSAmIDB4ODApICYmICh2YWwyICE9IDB4NWMpICYmICh2YWwyICE9IDB4MTIpKSkpIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkRldGVjdGlvbiBvZiB3ODM3ODFkIGNoaXAgIgotCQkJCSJmYWlsZWQgYXQgc3RlcCA0XG4iKTsKLQkJCWdvdG8gZXJyX25vZGV2OwotCQl9Ci0JCS8qIElmIFdpbmJvbmQgU01CdXMsIGNoZWNrIGFkZHJlc3MgYXQgMHg0OC4KLQkJICAgQXN1cyBkb2Vzbid0IHN1cHBvcnQsIGV4Y2VwdCBmb3IgYXM5OTEyN2YgcmV2LjIgKi8KLQkJaWYgKCghKHZhbDEgJiAweDgwKSAmJiAodmFsMiA9PSAweGEzKSkgfHwKLQkJICAgICgodmFsMSAmIDB4ODApICYmICh2YWwyID09IDB4NWMpKSkgewotCQkJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YQotCQkJICAgIChjbGllbnQsIFc4Mzc4MURfUkVHX0kyQ19BRERSKSAhPSBhZGRyZXNzKSB7Ci0JCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgIgotCQkJCQkiY2hpcCBmYWlsZWQgYXQgc3RlcCA1XG4iKTsKLQkJCQlnb3RvIGVycl9ub2RldjsKLQkJCX0KLQkJfQogCX0KIAotCS8qIFdlIGhhdmUgZWl0aGVyIGhhZCBhIGZvcmNlIHBhcmFtZXRlciwgb3Igd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIHRoZQotCSAgIFdpbmJvbmQuIFB1dCBpdCBub3cgaW50byBiYW5rIDAgYW5kIFZlbmRvciBJRCBIaWdoIEJ5dGUgKi8KKwkvKiBQdXQgaXQgbm93IGludG8gYmFuayAwIGFuZCBWZW5kb3IgSUQgSGlnaCBCeXRlICovCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFc4Mzc4MURfUkVHX0JBTkssCiAJCShpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19CQU5LKQogCQkgJiAweDc4KSB8IDB4ODApOwogCisJLyogR2V0IHRoZSB2ZW5kb3IgSUQgKi8KKwl2YWwyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzgxRF9SRUdfQ0hJUE1BTik7CisJaWYgKHZhbDIgPT0gMHg1YykKKwkJdmVuZGlkID0gd2luYm9uZDsKKwllbHNlIGlmICh2YWwyID09IDB4MTIpCisJCXZlbmRpZCA9IGFzdXM7CisJZWxzZSB7CisJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCSJ3ODM3ODFkIGNoaXAgdmVuZG9yIGlzIG5laXRoZXIgV2luYm9uZCBub3IgQXN1c1xuIik7CisJCWdvdG8gZXJyX25vZGV2OworCX0KKwogCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLwotCWlmIChraW5kIDw9IDApIHsKLQkJLyogZ2V0IHZlbmRvciBJRCAqLwotCQl2YWwyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzgxRF9SRUdfQ0hJUE1BTik7Ci0JCWlmICh2YWwyID09IDB4NWMpCi0JCQl2ZW5kaWQgPSB3aW5ib25kOwotCQllbHNlIGlmICh2YWwyID09IDB4MTIpCi0JCQl2ZW5kaWQgPSBhc3VzOwotCQllbHNlIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgInc4Mzc4MWQgY2hpcCB2ZW5kb3IgaXMgIgotCQkJCSJuZWl0aGVyIFdpbmJvbmQgbm9yIEFzdXNcbiIpOwotCQkJZ290byBlcnJfbm9kZXY7Ci0JCX0KKwl2YWwxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzgxRF9SRUdfV0NISVBJRCk7CisJaWYgKCh2YWwxID09IDB4MTAgfHwgdmFsMSA9PSAweDExKSAmJiB2ZW5kaWQgPT0gd2luYm9uZCkKKwkJY2xpZW50X25hbWUgPSAidzgzNzgxZCI7CisJZWxzZSBpZiAodmFsMSA9PSAweDMwICYmIHZlbmRpZCA9PSB3aW5ib25kKQorCQljbGllbnRfbmFtZSA9ICJ3ODM3ODJkIjsKKwllbHNlIGlmICh2YWwxID09IDB4NDAgJiYgdmVuZGlkID09IHdpbmJvbmQgJiYgYWRkcmVzcyA9PSAweDJkKQorCQljbGllbnRfbmFtZSA9ICJ3ODM3ODNzIjsKKwllbHNlIGlmICh2YWwxID09IDB4MzEpCisJCWNsaWVudF9uYW1lID0gImFzOTkxMjdmIjsKKwllbHNlCisJCWdvdG8gZXJyX25vZGV2OwogCi0JCXZhbDEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3ODFEX1JFR19XQ0hJUElEKTsKLQkJaWYgKCh2YWwxID09IDB4MTAgfHwgdmFsMSA9PSAweDExKSAmJiB2ZW5kaWQgPT0gd2luYm9uZCkKLQkJCWtpbmQgPSB3ODM3ODFkOwotCQllbHNlIGlmICh2YWwxID09IDB4MzAgJiYgdmVuZGlkID09IHdpbmJvbmQpCi0JCQlraW5kID0gdzgzNzgyZDsKLQkJZWxzZSBpZiAodmFsMSA9PSAweDQwICYmIHZlbmRpZCA9PSB3aW5ib25kICYmIGFkZHJlc3MgPT0gMHgyZCkKLQkJCWtpbmQgPSB3ODM3ODNzOwotCQllbHNlIGlmICh2YWwxID09IDB4MzEpCi0JCQlraW5kID0gYXM5OTEyN2Y7Ci0JCWVsc2UgewotCQkJaWYgKGtpbmQgPT0gMCkKLQkJCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAiSWdub3JpbmcgJ2ZvcmNlJyAiCi0JCQkJCSAicGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgYXQgIgotCQkJCQkgImFkZHJlc3MgMHglMDJ4XG4iLCBhZGRyZXNzKTsKLQkJCWdvdG8gZXJyX25vZGV2OwotCQl9Ci0KLQkJaWYgKChraW5kID09IHc4Mzc4MWQgfHwga2luZCA9PSB3ODM3ODJkKQotCQkgJiYgdzgzNzgxZF9hbGlhc19kZXRlY3QoY2xpZW50LCB2YWwxKSkgewotCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV2aWNlIGF0IDB4JTAyeCBhcHBlYXJzIHRvICIKLQkJCQkiYmUgdGhlIHNhbWUgYXMgSVNBIGRldmljZVxuIiwgYWRkcmVzcyk7Ci0JCQlnb3RvIGVycl9ub2RldjsKLQkJfQorCWlmICh2YWwxIDw9IDB4MzAgJiYgdzgzNzgxZF9hbGlhc19kZXRlY3QoY2xpZW50LCB2YWwxKSkgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJEZXZpY2UgYXQgMHglMDJ4IGFwcGVhcnMgdG8gIgorCQkJImJlIHRoZSBzYW1lIGFzIElTQSBkZXZpY2VcbiIsIGFkZHJlc3MpOworCQlnb3RvIGVycl9ub2RldjsKIAl9CiAKIAlpZiAoaXNhKQogCQltdXRleF91bmxvY2soJmlzYS0+dXBkYXRlX2xvY2spOwogCi0JaWYgKGtpbmQgPT0gdzgzNzgxZCkgewotCQljbGllbnRfbmFtZSA9ICJ3ODM3ODFkIjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gdzgzNzgyZCkgewotCQljbGllbnRfbmFtZSA9ICJ3ODM3ODJkIjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gdzgzNzgzcykgewotCQljbGllbnRfbmFtZSA9ICJ3ODM3ODNzIjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gYXM5OTEyN2YpIHsKLQkJY2xpZW50X25hbWUgPSAiYXM5OTEyN2YiOwotCX0KLQogCXN0cmxjcHkoaW5mby0+dHlwZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCmluZGV4IDk3ODUxYzUuLjA0MTBiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCkBAIC0xMjcwLDU2ICsxMjcwLDMyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCS8qIFRoZSB3ODM3OTFkIG1heSBiZSBzdHVjayBpbiBzb21lIG90aGVyIGJhbmsgdGhhbiBiYW5rIDAuIFRoaXMgbWF5Ci0JICAgbWFrZSByZWFkaW5nIG90aGVyIGluZm9ybWF0aW9uIGltcG9zc2libGUuIFNwZWNpZnkgYSBmb3JjZT0uLi4KLQkgICBwYXJhbWV0ZXIsIGFuZCB0aGUgV2luYm9uZCB3aWxsIGJlIHJlc2V0IHRvIHRoZSByaWdodCBiYW5rLiAqLwotCWlmIChraW5kIDwgMCkgewotCQlpZiAodzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfQ09ORklHKSAmIDB4ODApIHsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCXZhbDEgPSB3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19CQU5LKTsKLQkJdmFsMiA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0NISVBNQU4pOwotCQkvKiBDaGVjayBmb3IgV2luYm9uZCBJRCBpZiBpbiBiYW5rIDAgKi8KLQkJaWYgKCEodmFsMSAmIDB4MDcpKSB7Ci0JCQkvKiB5ZXMgaXQgaXMgQmFuazAgKi8KLQkJCWlmICgoKCEodmFsMSAmIDB4ODApKSAmJiAodmFsMiAhPSAweGEzKSkgfHwKLQkJCSAgICAoKHZhbDEgJiAweDgwKSAmJiAodmFsMiAhPSAweDVjKSkpIHsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQkJfQotCQkvKiBJZiBXaW5ib25kIGNoaXAsIGFkZHJlc3Mgb2YgY2hpcCBhbmQgVzgzNzkxRF9SRUdfSTJDX0FERFIKLQkJICAgc2hvdWxkIG1hdGNoICovCi0JCWlmICh3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19JMkNfQUREUikgIT0gYWRkcmVzcykgeworCWlmICh3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19DT05GSUcpICYgMHg4MCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWwxID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfQkFOSyk7CisJdmFsMiA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0NISVBNQU4pOworCS8qIENoZWNrIGZvciBXaW5ib25kIElEIGlmIGluIGJhbmsgMCAqLworCWlmICghKHZhbDEgJiAweDA3KSkgeworCQlpZiAoKCEodmFsMSAmIDB4ODApICYmIHZhbDIgIT0gMHhhMykgfHwKKwkJICAgICggKHZhbDEgJiAweDgwKSAmJiB2YWwyICE9IDB4NWMpKSB7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KKwkvKiBJZiBXaW5ib25kIGNoaXAsIGFkZHJlc3Mgb2YgY2hpcCBhbmQgVzgzNzkxRF9SRUdfSTJDX0FERFIKKwkgICBzaG91bGQgbWF0Y2ggKi8KKwlpZiAodzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfSTJDX0FERFIpICE9IGFkZHJlc3MpCisJCXJldHVybiAtRU5PREVWOwogCi0JLyogV2UgZWl0aGVyIGhhdmUgYSBmb3JjZSBwYXJhbWV0ZXIgb3Igd2UgaGF2ZSByZWFzb24gdG8KLQkgICBiZWxpZXZlIGl0IGlzIGEgV2luYm9uZCBjaGlwLiBFaXRoZXIgd2F5LCB3ZSB3YW50IGJhbmsgMCBhbmQKLQkgICBWZW5kb3IgSUQgaGlnaCBieXRlICovCisJLyogV2Ugd2FudCBiYW5rIDAgYW5kIFZlbmRvciBJRCBoaWdoIGJ5dGUgKi8KIAl2YWwxID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfQkFOSykgJiAweDc4OwogCXc4Mzc5MWRfd3JpdGUoY2xpZW50LCBXODM3OTFEX1JFR19CQU5LLCB2YWwxIHwgMHg4MCk7CiAKIAkvKiBWZXJpZnkgaXQgaXMgYSBXaW5ib25kIHc4Mzc5MWQgKi8KLQlpZiAoa2luZCA8PSAwKSB7Ci0JCS8qIGdldCB2ZW5kb3IgSUQgKi8KLQkJdmFsMiA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0NISVBNQU4pOwotCQlpZiAodmFsMiAhPSAweDVjKSB7CS8qIHRoZSB2ZW5kb3IgaXMgTk9UIFdpbmJvbmQgKi8KLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCXZhbDEgPSB3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19XQ0hJUElEKTsKLQkJaWYgKHZhbDEgPT0gMHg3MSkgewotCQkJa2luZCA9IHc4Mzc5MWQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoa2luZCA9PSAwKQotCQkJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsCi0JCQkJCSJ3ODM3OTFkOiBJZ25vcmluZyAnZm9yY2UnIHBhcmFtZXRlciAiCi0JCQkJCSJmb3IgdW5rbm93biBjaGlwIGF0IGFkYXB0ZXIgJWQsICIKLQkJCQkJImFkZHJlc3MgMHglMDJ4XG4iLAotCQkJCQlpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KKwl2YWwxID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfV0NISVBJRCk7CisJdmFsMiA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0NISVBNQU4pOworCWlmICh2YWwxICE9IDB4NzEgfHwgdmFsMiAhPSAweDVjKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgInc4Mzc5MWQiLCBJMkNfTkFNRV9TSVpFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3OTJkLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYwppbmRleCAyYmUxNjE5Li4zODk3ODg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYwpAQCAtMTI3Myw1OCArMTI3MywzMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQkvKiBUaGUgdzgzNzkyZCBtYXkgYmUgc3R1Y2sgaW4gc29tZSBvdGhlciBiYW5rIHRoYW4gYmFuayAwLiBUaGlzIG1heQotCSAgIG1ha2UgcmVhZGluZyBvdGhlciBpbmZvcm1hdGlvbiBpbXBvc3NpYmxlLiBTcGVjaWZ5IGEgZm9yY2U9Li4uIG9yCi0JICAgZm9yY2VfKj0uLi4gcGFyYW1ldGVyLCBhbmQgdGhlIFdpbmJvbmQgd2lsbCBiZSByZXNldCB0byB0aGUgcmlnaHQKLQkgICBiYW5rLiAqLwotCWlmIChraW5kIDwgMCkgewotCQlpZiAodzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfQ09ORklHKSAmIDB4ODApIHsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCXZhbDEgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19CQU5LKTsKLQkJdmFsMiA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0NISVBNQU4pOwotCQkvKiBDaGVjayBmb3IgV2luYm9uZCBJRCBpZiBpbiBiYW5rIDAgKi8KLQkJaWYgKCEodmFsMSAmIDB4MDcpKSB7ICAvKiBpcyBCYW5rMCAqLwotCQkJaWYgKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4YTMpKSB8fAotCQkJICAgICAoKHZhbDEgJiAweDgwKSAmJiAodmFsMiAhPSAweDVjKSkpIHsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQkJfQotCQkvKiBJZiBXaW5ib25kIGNoaXAsIGFkZHJlc3Mgb2YgY2hpcCBhbmQgVzgzNzkyRF9SRUdfSTJDX0FERFIKLQkJICAgc2hvdWxkIG1hdGNoICovCi0JCWlmICh3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAotCQkJCQlXODM3OTJEX1JFR19JMkNfQUREUikgIT0gYWRkcmVzcykgewotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9CisJaWYgKHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0NPTkZJRykgJiAweDgwKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIFdlIGhhdmUgZWl0aGVyIGhhZCBhIGZvcmNlIHBhcmFtZXRlciwgb3Igd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIHRoZQotCSAgIFdpbmJvbmQuIFB1dCBpdCBub3cgaW50byBiYW5rIDAgYW5kIFZlbmRvciBJRCBIaWdoIEJ5dGUgKi8KKwl2YWwxID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfQkFOSyk7CisJdmFsMiA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0NISVBNQU4pOworCS8qIENoZWNrIGZvciBXaW5ib25kIElEIGlmIGluIGJhbmsgMCAqLworCWlmICghKHZhbDEgJiAweDA3KSkgeyAgLyogaXMgQmFuazAgKi8KKwkJaWYgKCghKHZhbDEgJiAweDgwKSAmJiB2YWwyICE9IDB4YTMpIHx8CisJCSAgICAoICh2YWwxICYgMHg4MCkgJiYgdmFsMiAhPSAweDVjKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBJZiBXaW5ib25kIGNoaXAsIGFkZHJlc3Mgb2YgY2hpcCBhbmQgVzgzNzkyRF9SRUdfSTJDX0FERFIKKwkgICBzaG91bGQgbWF0Y2ggKi8KKwlpZiAodzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfSTJDX0FERFIpICE9IGFkZHJlc3MpCisJCXJldHVybiAtRU5PREVWOworCisJLyogIFB1dCBpdCBub3cgaW50byBiYW5rIDAgYW5kIFZlbmRvciBJRCBIaWdoIEJ5dGUgKi8KIAl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwKIAkJCSAgICBXODM3OTJEX1JFR19CQU5LLAogCQkJICAgICh3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAogCQkJCVc4Mzc5MkRfUkVHX0JBTkspICYgMHg3OCkgfCAweDgwKTsKIAogCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLwotCWlmIChraW5kIDw9IDApIHsKLQkJLyogZ2V0IHZlbmRvciBJRCAqLwotCQl2YWwyID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfQ0hJUE1BTik7Ci0JCWlmICh2YWwyICE9IDB4NWMpIHsgIC8qIHRoZSB2ZW5kb3IgaXMgTk9UIFdpbmJvbmQgKi8KLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCXZhbDEgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19XQ0hJUElEKTsKLQkJaWYgKHZhbDEgPT0gMHg3YSkgewotCQkJa2luZCA9IHc4Mzc5MmQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoa2luZCA9PSAwKQotCQkJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsCi0JCQkJCSJ3ODM3OTJkOiBJZ25vcmluZyAnZm9yY2UnIHBhcmFtZXRlciBmb3IiCi0JCQkJCSIgdW5rbm93biBjaGlwIGF0IGFkYXB0ZXIgJWQsIGFkZHJlc3MiCi0JCQkJCSIgMHglMDJ4XG4iLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwKLQkJCQkJYWRkcmVzcyk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KKwl2YWwxID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfV0NISVBJRCk7CisJdmFsMiA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0NISVBNQU4pOworCWlmICh2YWwxICE9IDB4N2EgfHwgdmFsMiAhPSAweDVjKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgInc4Mzc5MmQiLCBJMkNfTkFNRV9TSVpFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3OTMuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKaW5kZXggNDdkZDM5OC4uODBhMjE5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTMuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jCkBAIC0xMTY0LDcgKzExNjQsNyBAQAogc3RhdGljIGludCB3ODM3OTNfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBraW5kLAogCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKLQl1OCB0bXAsIGJhbms7CisJdTggdG1wLCBiYW5rLCBjaGlwX2lkOwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKIAl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzID0gY2xpZW50LT5hZGRyOwogCkBAIC0xMTc0LDQ0ICsxMTc0LDI3IEBACiAKIAliYW5rID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzkzX1JFR19CQU5LU0VMKTsKIAotCWlmIChraW5kIDwgMCkgewotCQl0bXAgPSBiYW5rICYgMHg4MCA/IDB4NWMgOiAweGEzOwotCQkvKiBDaGVjayBXaW5ib25kIHZlbmRvciBJRCAqLwotCQlpZiAodG1wICE9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkJVzgzNzkzX1JFR19WRU5ET1JJRCkpIHsKLQkJCXByX2RlYnVnKCJ3ODM3OTM6IERldGVjdGlvbiBmYWlsZWQgYXQgY2hlY2sgIgotCQkJCSAidmVuZG9yIGlkXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJLyogSWYgV2luYm9uZCBjaGlwLCBhZGRyZXNzIG9mIGNoaXAgYW5kIFc4Mzc5M19SRUdfSTJDX0FERFIKLQkJICAgc2hvdWxkIG1hdGNoICovCi0JCWlmICgoYmFuayAmIDB4MDcpID09IDAKLQkJICYmIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFc4Mzc5M19SRUdfSTJDX0FERFIpICE9Ci0JCSAgICAoYWRkcmVzcyA8PCAxKSkgewotCQkJcHJfZGVidWcoInc4Mzc5MzogRGV0ZWN0aW9uIGZhaWxlZCBhdCBjaGVjayAiCi0JCQkJICJpMmMgYWRkclxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCisJdG1wID0gYmFuayAmIDB4ODAgPyAweDVjIDogMHhhMzsKKwkvKiBDaGVjayBXaW5ib25kIHZlbmRvciBJRCAqLworCWlmICh0bXAgIT0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzkzX1JFR19WRU5ET1JJRCkpIHsKKwkJcHJfZGVidWcoInc4Mzc5MzogRGV0ZWN0aW9uIGZhaWxlZCBhdCBjaGVjayB2ZW5kb3IgaWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQkvKiBXZSBoYXZlIGVpdGhlciBoYWQgYSBmb3JjZSBwYXJhbWV0ZXIsIG9yIHdlIGhhdmUgYWxyZWFkeSBkZXRlY3RlZCB0aGUKLQkgICBXaW5ib25kLiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZSBub3cgKi8KLQotCWlmIChraW5kIDw9IDApIHsKLQkJaWYgKDB4N2IgPT0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSAgICAgVzgzNzkzX1JFR19DSElQSUQpKSB7Ci0JCQlraW5kID0gdzgzNzkzOwotCQl9IGVsc2UgewotCQkJaWYgKGtpbmQgPT0gMCkKLQkJCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAidzgzNzkzOiBJZ25vcmluZyAiCi0JCQkJCSAiJ2ZvcmNlJyBwYXJhbWV0ZXIgZm9yIHVua25vd24gY2hpcCAiCi0JCQkJCSAiYXQgYWRkcmVzcyAweCUwMnhcbiIsIGFkZHJlc3MpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwkvKiBJZiBXaW5ib25kIGNoaXAsIGFkZHJlc3Mgb2YgY2hpcCBhbmQgVzgzNzkzX1JFR19JMkNfQUREUgorCSAgIHNob3VsZCBtYXRjaCAqLworCWlmICgoYmFuayAmIDB4MDcpID09IDAKKwkgJiYgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVzgzNzkzX1JFR19JMkNfQUREUikgIT0KKwkgICAgKGFkZHJlc3MgPDwgMSkpIHsKKwkJcHJfZGVidWcoInc4Mzc5MzogRGV0ZWN0aW9uIGZhaWxlZCBhdCBjaGVjayBpMmMgYWRkclxuIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAorCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlIG5vdyAqLworCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3OTNfUkVHX0NISVBJRCk7CisJaWYgKGNoaXBfaWQgIT0gMHg3YikKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlzdHJsY3B5KGluZm8tPnR5cGUsICJ3ODM3OTMiLCBJMkNfTkFNRV9TSVpFKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODNsNzg1dHMuYyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4NXRzLmMKaW5kZXggZWEyOTViOS4uOWI2YzRjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODNsNzg1dHMuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIHc4M2w3ODV0cy5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKICAqICAgICAgICAgICAgICAgbW9uaXRvcmluZwotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgogICoKICAqIEluc3BpcmVkIGZyb20gdGhlIGxtODMgZHJpdmVyLiBUaGUgVzgzTDc4NVRTLVMgaXMgYSBzZW5zb3IgY2hpcCBtYWRlCiAgKiBieSBXaW5ib25kLiBJdCByZXBvcnRzIGEgc2luZ2xlIGV4dGVybmFsIHRlbXBlcmF0dXJlIHdpdGggYSAxIGRlZwpAQCAtMTQ2LDYwICsxNDYsMzYgQEAKICAqLwogCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgdzgzbDc4NXRzX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwgaW50IGtpbmQsCitzdGF0aWMgaW50IHc4M2w3ODV0c19kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGtpbmQsCiAJCQkgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCXUxNiBtYW5faWQ7CisJdTggY2hpcF9pZDsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKgotCSAqIE5vdyB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQKLQkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZQotCSAqIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwIChhY3R1YWxseSB0aGVyZSBpcyBvbmx5Ci0JICogb25lIHBvc3NpYmxlIGtpbmQgb2YgY2hpcCBmb3Igbm93LCBXODNMNzg1VFMtUykuIEEgemVybyBraW5kIG1lYW5zCi0JICogdGhhdCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyLCB0aGUgZGV0ZWN0aW9uCi0JICogc3RlcCBzaGFsbCBiZSBza2lwcGVkLiBBIHBvc2l0aXZlIGtpbmQgbWVhbnMgdGhhdCB0aGUgZHJpdmVyCi0JICogd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIgYW5kIGEgZ2l2ZW4ga2luZCBvZiBjaGlwIGlzCi0JICogcmVxdWVzdGVkLCBzbyBib3RoIHRoZSBkZXRlY3Rpb24gYW5kIHRoZSBpZGVudGlmaWNhdGlvbiBzdGVwcwotCSAqIGFyZSBza2lwcGVkLgotCSAqLwotCWlmIChraW5kIDwgMCkgeyAvKiBkZXRlY3Rpb24gKi8KLQkJaWYgKCgodzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKLQkJICAgICAgVzgzTDc4NVRTX1JFR19DT05GSUcsIDApICYgMHg4MCkgIT0gMHgwMCkKLQkJIHx8ICgodzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKLQkJICAgICAgVzgzTDc4NVRTX1JFR19UWVBFLCAwKSAmIDB4RkMpICE9IDB4MDApKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCi0JCQkJIlc4M0w3ODVUUy1TIGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKLQkJCQluZXdfY2xpZW50LT5hZGRyKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJLyogZGV0ZWN0aW9uICovCisJaWYgKCh3ODNsNzg1dHNfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODVUU19SRUdfQ09ORklHLCAwKSAmIDB4ODApCisJIHx8ICh3ODNsNzg1dHNfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODVUU19SRUdfVFlQRSwgMCkgJiAweEZDKSkgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkiVzgzTDc4NVRTLVMgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnhcbiIsCisJCQljbGllbnQtPmFkZHIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCi0JCXUxNiBtYW5faWQ7Ci0JCXU4IGNoaXBfaWQ7CisJLyogSWRlbnRpZmljYXRpb24gKi8KKwltYW5faWQgPSAodzgzbDc4NXRzX3JlYWRfdmFsdWUoY2xpZW50LCBXODNMNzg1VFNfUkVHX01BTl9JRDEsIDApIDw8IDgpCisJICAgICAgICsgdzgzbDc4NXRzX3JlYWRfdmFsdWUoY2xpZW50LCBXODNMNzg1VFNfUkVHX01BTl9JRDIsIDApOworCWNoaXBfaWQgPSB3ODNsNzg1dHNfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODVUU19SRUdfQ0hJUF9JRCwgMCk7CiAKLQkJbWFuX2lkID0gKHc4M2w3ODV0c19yZWFkX3ZhbHVlKG5ld19jbGllbnQsCi0JCQkgVzgzTDc4NVRTX1JFR19NQU5fSUQxLCAwKSA8PCA4KSArCi0JCQkgdzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKLQkJCSBXODNMNzg1VFNfUkVHX01BTl9JRDIsIDApOwotCQljaGlwX2lkID0gdzgzbDc4NXRzX3JlYWRfdmFsdWUobmV3X2NsaWVudCwKLQkJCSAgVzgzTDc4NVRTX1JFR19DSElQX0lELCAwKTsKLQotCQlpZiAobWFuX2lkID09IDB4NUNBMykgeyAvKiBXaW5ib25kICovCi0JCQlpZiAoY2hpcF9pZCA9PSAweDcwKSB7IC8qIFc4M0w3ODVUUy1TICovCi0JCQkJa2luZCA9IHc4M2w3ODV0czsJCQkKLQkJCX0KLQkJfQotCQotCQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLwotCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKLQkJCQkgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwNFgsICIKLQkJCQkgImNoaXBfaWQ9MHglMDJYKS5cbiIsIG1hbl9pZCwgY2hpcF9pZCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQorCWlmIChtYW5faWQgIT0gMHg1Q0EzCQkvKiBXaW5ib25kICovCisJIHx8IGNoaXBfaWQgIT0gMHg3MCkgewkJLyogVzgzTDc4NVRTLVMgKi8KKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwNFgsIGNoaXBfaWQ9MHglMDJYKVxuIiwKKwkJCW1hbl9pZCwgY2hpcF9pZCk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgInc4M2w3ODV0cyIsIEkyQ19OQU1FX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODNsNzg2bmcuYyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4Nm5nLmMKaW5kZXggYmFkY2E3Ni4uMjdkYTdkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODNsNzg2bmcuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4M2w3ODZuZy5jCkBAIC01OTAsNTMgKzU5MCwzMSBAQAogCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwl1MTYgbWFuX2lkOworCXU4IGNoaXBfaWQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyoKLQkgKiBOb3cgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEEgbmVnYXRpdmUga2luZCBtZWFucyB0aGF0Ci0JICogdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UgcGFyYW1ldGVyIChkZWZhdWx0KSwgc28gd2UKLQkgKiBtdXN0IGJvdGggZGV0ZWN0IGFuZCBpZGVudGlmeSB0aGUgY2hpcCAoYWN0dWFsbHkgdGhlcmUgaXMgb25seQotCSAqIG9uZSBwb3NzaWJsZSBraW5kIG9mIGNoaXAgZm9yIG5vdywgVzgzTDc4Nk5HKS4gQSB6ZXJvIGtpbmQgbWVhbnMKLQkgKiB0aGF0IHRoZSBkcml2ZXIgd2FzIGxvYWRlZCB3aXRoIHRoZSBmb3JjZSBwYXJhbWV0ZXIsIHRoZSBkZXRlY3Rpb24KLQkgKiBzdGVwIHNoYWxsIGJlIHNraXBwZWQuIEEgcG9zaXRpdmUga2luZCBtZWFucyB0aGF0IHRoZSBkcml2ZXIKLQkgKiB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciBhbmQgYSBnaXZlbiBraW5kIG9mIGNoaXAgaXMKLQkgKiByZXF1ZXN0ZWQsIHNvIGJvdGggdGhlIGRldGVjdGlvbiBhbmQgdGhlIGlkZW50aWZpY2F0aW9uIHN0ZXBzCi0JICogYXJlIHNraXBwZWQuCi0JICovCi0JaWYgKGtpbmQgPCAwKSB7IC8qIGRldGVjdGlvbiAqLwotCQlpZiAoKCh3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsCi0JCSAgICBXODNMNzg2TkdfUkVHX0NPTkZJRykgJiAweDgwKSAhPSAweDAwKSkgewotCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAotCQkJCSJXODNMNzg2TkcgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnguXG4iLAotCQkJCWNsaWVudC0+YWRkcik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQorCS8qIERldGVjdGlvbiAqLworCWlmICgodzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX0NPTkZJRykgJiAweDgwKSkgeworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJXODNMNzg2TkcgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnhcbiIsCisJCQljbGllbnQtPmFkZHIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCi0JCXUxNiBtYW5faWQ7Ci0JCXU4IGNoaXBfaWQ7CisJLyogSWRlbnRpZmljYXRpb24gKi8KKwltYW5faWQgPSAodzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX01BTl9JRDEpIDw8IDgpICsKKwkJIHc4M2w3ODZuZ19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19NQU5fSUQyKTsKKwljaGlwX2lkID0gdzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX0NISVBfSUQpOwogCi0JCW1hbl9pZCA9ICh3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsCi0JCSAgICBXODNMNzg2TkdfUkVHX01BTl9JRDEpIDw8IDgpICsKLQkJICAgIHc4M2w3ODZuZ19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19NQU5fSUQyKTsKLQkJY2hpcF9pZCA9IHc4M2w3ODZuZ19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19DSElQX0lEKTsKLQotCQlpZiAobWFuX2lkID09IDB4NUNBMykgeyAvKiBXaW5ib25kICovCi0JCQlpZiAoY2hpcF9pZCA9PSAweDgwKSB7IC8qIFc4M0w3ODZORyAqLwotCQkJCWtpbmQgPSB3ODNsNzg2bmc7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLwotCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKLQkJCSAgICAiVW5zdXBwb3J0ZWQgY2hpcCAobWFuX2lkPTB4JTA0WCwgIgotCQkJICAgICJjaGlwX2lkPTB4JTAyWCkuXG4iLCBtYW5faWQsIGNoaXBfaWQpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwlpZiAobWFuX2lkICE9IDB4NUNBMyB8fAkJLyogV2luYm9uZCAqLworCSAgICBjaGlwX2lkICE9IDB4ODApIHsJCS8qIFc4M0w3ODZORyAqLworCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkiVW5zdXBwb3J0ZWQgY2hpcCAobWFuX2lkPTB4JTA0WCwgY2hpcF9pZD0weCUwMlgpXG4iLAorCQkJbWFuX2lkLCBjaGlwX2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc3RybGNweShpbmZvLT50eXBlLCAidzgzbDc4Nm5nIiwgSTJDX05BTUVfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS5jCmluZGV4IGI0NDQ3NjIuLjllMThlZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFN5bm9wc3lzIERlc2lnbndhcmUgSTJDIGFkYXB0ZXIgZHJpdmVyIChtYXN0ZXIgb25seSkuCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyIGRyaXZlciAobWFzdGVyIG9ubHkpLgogICoKICAqIEJhc2VkIG9uIHRoZSBUSSBEQVZJTkNJIEkyQyBhZGFwdGVyIGRyaXZlci4KICAqCkBAIC00OSw3ICs0OSwyMCBAQAogI2RlZmluZSBEV19JQ19GU19TQ0xfTENOVAkweDIwCiAjZGVmaW5lIERXX0lDX0lOVFJfU1RBVAkJMHgyYwogI2RlZmluZSBEV19JQ19JTlRSX01BU0sJCTB4MzAKKyNkZWZpbmUgRFdfSUNfUkFXX0lOVFJfU1RBVAkweDM0CisjZGVmaW5lIERXX0lDX1JYX1RMCQkweDM4CisjZGVmaW5lIERXX0lDX1RYX1RMCQkweDNjCiAjZGVmaW5lIERXX0lDX0NMUl9JTlRSCQkweDQwCisjZGVmaW5lIERXX0lDX0NMUl9SWF9VTkRFUgkweDQ0CisjZGVmaW5lIERXX0lDX0NMUl9SWF9PVkVSCTB4NDgKKyNkZWZpbmUgRFdfSUNfQ0xSX1RYX09WRVIJMHg0YworI2RlZmluZSBEV19JQ19DTFJfUkRfUkVRCTB4NTAKKyNkZWZpbmUgRFdfSUNfQ0xSX1RYX0FCUlQJMHg1NAorI2RlZmluZSBEV19JQ19DTFJfUlhfRE9ORQkweDU4CisjZGVmaW5lIERXX0lDX0NMUl9BQ1RJVklUWQkweDVjCisjZGVmaW5lIERXX0lDX0NMUl9TVE9QX0RFVAkweDYwCisjZGVmaW5lIERXX0lDX0NMUl9TVEFSVF9ERVQJMHg2NAorI2RlZmluZSBEV19JQ19DTFJfR0VOX0NBTEwJMHg2OAogI2RlZmluZSBEV19JQ19FTkFCTEUJCTB4NmMKICNkZWZpbmUgRFdfSUNfU1RBVFVTCQkweDcwCiAjZGVmaW5lIERXX0lDX1RYRkxSCQkweDc0CkBAIC02NCw5ICs3NywyMyBAQAogI2RlZmluZSBEV19JQ19DT05fUkVTVEFSVF9FTgkJMHgyMAogI2RlZmluZSBEV19JQ19DT05fU0xBVkVfRElTQUJMRQkJMHg0MAogCi0jZGVmaW5lIERXX0lDX0lOVFJfVFhfRU1QVFkJMHgxMAotI2RlZmluZSBEV19JQ19JTlRSX1RYX0FCUlQJMHg0MAorI2RlZmluZSBEV19JQ19JTlRSX1JYX1VOREVSCTB4MDAxCisjZGVmaW5lIERXX0lDX0lOVFJfUlhfT1ZFUgkweDAwMgorI2RlZmluZSBEV19JQ19JTlRSX1JYX0ZVTEwJMHgwMDQKKyNkZWZpbmUgRFdfSUNfSU5UUl9UWF9PVkVSCTB4MDA4CisjZGVmaW5lIERXX0lDX0lOVFJfVFhfRU1QVFkJMHgwMTAKKyNkZWZpbmUgRFdfSUNfSU5UUl9SRF9SRVEJMHgwMjAKKyNkZWZpbmUgRFdfSUNfSU5UUl9UWF9BQlJUCTB4MDQwCisjZGVmaW5lIERXX0lDX0lOVFJfUlhfRE9ORQkweDA4MAorI2RlZmluZSBEV19JQ19JTlRSX0FDVElWSVRZCTB4MTAwCiAjZGVmaW5lIERXX0lDX0lOVFJfU1RPUF9ERVQJMHgyMDAKKyNkZWZpbmUgRFdfSUNfSU5UUl9TVEFSVF9ERVQJMHg0MDAKKyNkZWZpbmUgRFdfSUNfSU5UUl9HRU5fQ0FMTAkweDgwMAorCisjZGVmaW5lIERXX0lDX0lOVFJfREVGQVVMVF9NQVNLCQkoRFdfSUNfSU5UUl9SWF9GVUxMIHwgXAorCQkJCQkgRFdfSUNfSU5UUl9UWF9FTVBUWSB8IFwKKwkJCQkJIERXX0lDX0lOVFJfVFhfQUJSVCB8IFwKKwkJCQkJIERXX0lDX0lOVFJfU1RPUF9ERVQpCiAKICNkZWZpbmUgRFdfSUNfU1RBVFVTX0FDVElWSVRZCTB4MQogCkBAIC05NiwzMSArMTIzLDQ5IEBACiAjZGVmaW5lIEFCUlRfU0JZVEVfQUNLREVUCTcKICNkZWZpbmUgQUJSVF9TQllURV9OT1JTVFJUCTkKICNkZWZpbmUgQUJSVF8xMEJfUkRfTk9SU1RSVAkxMAotI2RlZmluZSBBUkJfTUFTVEVSX0RJUwkJMTEKKyNkZWZpbmUgQUJSVF9NQVNURVJfRElTCQkxMQogI2RlZmluZSBBUkJfTE9TVAkJMTIKIAorI2RlZmluZSBEV19JQ19UWF9BQlJUXzdCX0FERFJfTk9BQ0sJKDFVTCA8PCBBQlJUXzdCX0FERFJfTk9BQ0spCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfMTBBRERSMV9OT0FDSwkoMVVMIDw8IEFCUlRfMTBBRERSMV9OT0FDSykKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF8xMEFERFIyX05PQUNLCSgxVUwgPDwgQUJSVF8xMEFERFIyX05PQUNLKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX1RYREFUQV9OT0FDSwkoMVVMIDw8IEFCUlRfVFhEQVRBX05PQUNLKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX0dDQUxMX05PQUNLCSgxVUwgPDwgQUJSVF9HQ0FMTF9OT0FDSykKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF9HQ0FMTF9SRUFECSgxVUwgPDwgQUJSVF9HQ0FMTF9SRUFEKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX1NCWVRFX0FDS0RFVAkoMVVMIDw8IEFCUlRfU0JZVEVfQUNLREVUKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX1NCWVRFX05PUlNUUlQJKDFVTCA8PCBBQlJUX1NCWVRFX05PUlNUUlQpCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfMTBCX1JEX05PUlNUUlQJKDFVTCA8PCBBQlJUXzEwQl9SRF9OT1JTVFJUKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX01BU1RFUl9ESVMJKDFVTCA8PCBBQlJUX01BU1RFUl9ESVMpCisjZGVmaW5lIERXX0lDX1RYX0FSQl9MT1NUCQkoMVVMIDw8IEFSQl9MT1NUKQorCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfTk9BQ0sJCShEV19JQ19UWF9BQlJUXzdCX0FERFJfTk9BQ0sgfCBcCisJCQkJCSBEV19JQ19UWF9BQlJUXzEwQUREUjFfTk9BQ0sgfCBcCisJCQkJCSBEV19JQ19UWF9BQlJUXzEwQUREUjJfTk9BQ0sgfCBcCisJCQkJCSBEV19JQ19UWF9BQlJUX1RYREFUQV9OT0FDSyB8IFwKKwkJCQkJIERXX0lDX1RYX0FCUlRfR0NBTExfTk9BQ0spCisKIHN0YXRpYyBjaGFyICphYm9ydF9zb3VyY2VzW10gPSB7Ci0JW0FCUlRfN0JfQUREUl9OT0FDS10JPQorCVtBQlJUXzdCX0FERFJfTk9BQ0tdID0KIAkJInNsYXZlIGFkZHJlc3Mgbm90IGFja25vd2xlZGdlZCAoN2JpdCBtb2RlKSIsCi0JW0FCUlRfMTBBRERSMV9OT0FDS10JPQorCVtBQlJUXzEwQUREUjFfTk9BQ0tdID0KIAkJImZpcnN0IGFkZHJlc3MgYnl0ZSBub3QgYWNrbm93bGVkZ2VkICgxMGJpdCBtb2RlKSIsCi0JW0FCUlRfMTBBRERSMl9OT0FDS10JPQorCVtBQlJUXzEwQUREUjJfTk9BQ0tdID0KIAkJInNlY29uZCBhZGRyZXNzIGJ5dGUgbm90IGFja25vd2xlZGdlZCAoMTBiaXQgbW9kZSkiLAotCVtBQlJUX1RYREFUQV9OT0FDS10JCT0KKwlbQUJSVF9UWERBVEFfTk9BQ0tdID0KIAkJImRhdGEgbm90IGFja25vd2xlZGdlZCIsCi0JW0FCUlRfR0NBTExfTk9BQ0tdCQk9CisJW0FCUlRfR0NBTExfTk9BQ0tdID0KIAkJIm5vIGFja25vd2xlZGdlbWVudCBmb3IgYSBnZW5lcmFsIGNhbGwiLAotCVtBQlJUX0dDQUxMX1JFQURdCQk9CisJW0FCUlRfR0NBTExfUkVBRF0gPQogCQkicmVhZCBhZnRlciBnZW5lcmFsIGNhbGwiLAotCVtBQlJUX1NCWVRFX0FDS0RFVF0JCT0KKwlbQUJSVF9TQllURV9BQ0tERVRdID0KIAkJInN0YXJ0IGJ5dGUgYWNrbm93bGVkZ2VkIiwKLQlbQUJSVF9TQllURV9OT1JTVFJUXQk9CisJW0FCUlRfU0JZVEVfTk9SU1RSVF0gPQogCQkidHJ5aW5nIHRvIHNlbmQgc3RhcnQgYnl0ZSB3aGVuIHJlc3RhcnQgaXMgZGlzYWJsZWQiLAotCVtBQlJUXzEwQl9SRF9OT1JTVFJUXQk9CisJW0FCUlRfMTBCX1JEX05PUlNUUlRdID0KIAkJInRyeWluZyB0byByZWFkIHdoZW4gcmVzdGFydCBpcyBkaXNhYmxlZCAoMTBiaXQgbW9kZSkiLAotCVtBUkJfTUFTVEVSX0RJU10JCT0KKwlbQUJSVF9NQVNURVJfRElTXSA9CiAJCSJ0cnlpbmcgdG8gdXNlIGRpc2FibGVkIGFkYXB0ZXIiLAotCVtBUkJfTE9TVF0JCQk9CisJW0FSQl9MT1NUXSA9CiAJCSJsb3N0IGFyYml0cmF0aW9uIiwKIH07CiAKQEAgLTEyOSw3ICsxNzQsNiBAQAogICogQGRldjogZHJpdmVyIG1vZGVsIGRldmljZSBub2RlCiAgKiBAYmFzZTogSU8gcmVnaXN0ZXJzIHBvaW50ZXIKICAqIEBjbWRfY29tcGxldGU6IHR4IGNvbXBsZXRpb24gaW5kaWNhdG9yCi0gKiBAcHVtcF9tc2c6IGNvbnRpbnVlIGluIHByb2dyZXNzIHRyYW5zZmVycwogICogQGxvY2s6IHByb3RlY3QgdGhpcyBzdHJ1Y3QgYW5kIElPIHJlZ2lzdGVycwogICogQGNsazogaW5wdXQgcmVmZXJlbmNlIGNsb2NrCiAgKiBAY21kX2VycjogcnVuIHRpbWUgaGFkd2FyZSBlcnJvciBjb2RlCkBAIC0xNTUsMjcgKzE5OSw4MSBAQAogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKIAlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGU7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXB1bXBfbXNnOwogCXN0cnVjdCBtdXRleAkJbG9jazsKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCWludAkJCWNtZF9lcnI7CiAJc3RydWN0IGkyY19tc2cJCSptc2dzOwogCWludAkJCW1zZ3NfbnVtOwogCWludAkJCW1zZ193cml0ZV9pZHg7Ci0JdTE2CQkJdHhfYnVmX2xlbjsKKwl1MzIJCQl0eF9idWZfbGVuOwogCXU4CQkJKnR4X2J1ZjsKIAlpbnQJCQltc2dfcmVhZF9pZHg7Ci0JdTE2CQkJcnhfYnVmX2xlbjsKKwl1MzIJCQlyeF9idWZfbGVuOwogCXU4CQkJKnJ4X2J1ZjsKIAlpbnQJCQltc2dfZXJyOwogCXVuc2lnbmVkIGludAkJc3RhdHVzOwotCXUxNgkJCWFib3J0X3NvdXJjZTsKKwl1MzIJCQlhYm9ydF9zb3VyY2U7CiAJaW50CQkJaXJxOwogCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwdGVyOwogCXVuc2lnbmVkIGludAkJdHhfZmlmb19kZXB0aDsKIAl1bnNpZ25lZCBpbnQJCXJ4X2ZpZm9fZGVwdGg7CiB9OwogCitzdGF0aWMgdTMyCitpMmNfZHdfc2NsX2hjbnQodTMyIGljX2NsaywgdTMyIHRTWU1CT0wsIHUzMiB0ZiwgaW50IGNvbmQsIGludCBvZmZzZXQpCit7CisJLyoKKwkgKiBEZXNpZ25XYXJlIEkyQyBjb3JlIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHNvbGlkIHN0cmF0ZWd5IHRvIG1lZXQKKwkgKiB0aGUgdEhEO1NUQSB0aW1pbmcgc3BlYy4gIENvbmZpZ3VyaW5nIF9IQ05UIGJhc2VkIG9uIHRISUdIIHNwZWMKKwkgKiB3aWxsIHJlc3VsdCBpbiB2aW9sYXRpb24gb2YgdGhlIHRIRDtTVEEgc3BlYy4KKwkgKi8KKwlpZiAoY29uZCkKKwkJLyoKKwkJICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKKwkJICoKKwkJICogICBJQ19bRlNdU19TQ0xfSENOVCArICgxKzQrMykgPj0gSUNfQ0xLICogdEhJR0gKKwkJICoKKwkJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgRFcgbWFudWFscywgYW5kIHJlcHJlc2VudHMgYW4gaWRlYWwKKwkJICogY29uZmlndXJhdGlvbi4gIFRoZSByZXN1bHRpbmcgSTJDIGJ1cyBzcGVlZCB3aWxsIGJlCisJCSAqIGZhc3RlciB0aGFuIGFueSBvZiB0aGUgb3RoZXJzLgorCQkgKgorCQkgKiBJZiB5b3VyIGhhcmR3YXJlIGlzIGZyZWUgZnJvbSB0SEQ7U1RBIGlzc3VlLCB0cnkgdGhpcyBvbmUuCisJCSAqLworCQlyZXR1cm4gKGljX2NsayAqIHRTWU1CT0wgKyA1MDAwKSAvIDEwMDAwIC0gOCArIG9mZnNldDsKKwllbHNlCisJCS8qCisJCSAqIENvbmRpdGlvbmFsIGV4cHJlc3Npb246CisJCSAqCisJCSAqICAgSUNfW0ZTXVNfU0NMX0hDTlQgKyAzID49IElDX0NMSyAqICh0SEQ7U1RBICsgdGYpCisJCSAqCisJCSAqIFRoaXMgaXMganVzdCBleHBlcmltZW50YWwgcnVsZTsgdGhlIHRIRDtTVEEgcGVyaW9kIHR1cm5lZAorCQkgKiBvdXQgdG8gYmUgcHJvcG9ydGluYWwgdG8gKF9IQ05UICsgMykuICBXaXRoIHRoaXMgc2V0dGluZywKKwkJICogd2UgY291bGQgbWVldCBib3RoIHRISUdIIGFuZCB0SEQ7U1RBIHRpbWluZyBzcGVjcy4KKwkJICoKKwkJICogSWYgdW5zdXJlLCB5b3UnZCBiZXR0ZXIgdG8gdGFrZSB0aGlzIGFsdGVybmF0aXZlLgorCQkgKgorCQkgKiBUaGUgcmVhc29uIHdoeSB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50ICJ0ZiIgaGVyZSwKKwkJICogaXMgdGhlIHNhbWUgYXMgZGVzY3JpYmVkIGluIGkyY19kd19zY2xfbGNudCgpLgorCQkgKi8KKwkJcmV0dXJuIChpY19jbGsgKiAodFNZTUJPTCArIHRmKSArIDUwMDApIC8gMTAwMDAgLSAzICsgb2Zmc2V0OworfQorCitzdGF0aWMgdTMyIGkyY19kd19zY2xfbGNudCh1MzIgaWNfY2xrLCB1MzIgdExPVywgdTMyIHRmLCBpbnQgb2Zmc2V0KQoreworCS8qCisJICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKKwkgKgorCSAqICAgSUNfW0ZTXVNfU0NMX0xDTlQgKyAxID49IElDX0NMSyAqICh0TE9XICsgdGYpCisJICoKKwkgKiBEVyBJMkMgY29yZSBzdGFydHMgY291bnRpbmcgdGhlIFNDTCBDTlRzIGZvciB0aGUgTE9XIHBlcmlvZAorCSAqIG9mIHRoZSBTQ0wgY2xvY2sgKHRMT1cpIGFzIHNvb24gYXMgaXQgcHVsbHMgdGhlIFNDTCBsaW5lLgorCSAqIEluIG9yZGVyIHRvIG1lZXQgdGhlIHRMT1cgdGltaW5nIHNwZWMsIHdlIG5lZWQgdG8gdGFrZSBpbnRvCisJICogYWNjb3VudCB0aGUgZmFsbCB0aW1lIG9mIFNDTCBzaWduYWwgKHRmKS4gIERlZmF1bHQgdGYgdmFsdWUKKwkgKiBzaG91bGQgYmUgMC4zIHVzLCBmb3Igc2FmZXR5LgorCSAqLworCXJldHVybiAoKGljX2NsayAqICh0TE9XICsgdGYpICsgNTAwMCkgLyAxMDAwMCkgLSAxICsgb2Zmc2V0OworfQorCiAvKioKICAqIGkyY19kd19pbml0KCkgLSBpbml0aWFsaXplIHRoZSBkZXNpZ253YXJlIGkyYyBtYXN0ZXIgaGFyZHdhcmUKICAqIEBkZXY6IGRldmljZSBwcml2YXRlIGRhdGEKQEAgLTE4NywyNSArMjg1LDQ5IEBACiBzdGF0aWMgdm9pZCBpMmNfZHdfaW5pdChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQogewogCXUzMiBpbnB1dF9jbG9ja19raHogPSBjbGtfZ2V0X3JhdGUoZGV2LT5jbGspIC8gMTAwMDsKLQl1MTYgaWNfY29uOworCXUzMiBpY19jb24sIGhjbnQsIGxjbnQ7CiAKIAkvKiBEaXNhYmxlIHRoZSBhZGFwdGVyICovCi0Jd3JpdGViKDAsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7CisJd3JpdGVsKDAsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7CiAKIAkvKiBzZXQgc3RhbmRhcmQgYW5kIGZhc3Qgc3BlZWQgZGV2aWRlcnMgZm9yIGhpZ2gvbG93IHBlcmlvZHMgKi8KLQl3cml0ZXcoKGlucHV0X2Nsb2NrX2toeiAqIDQwIC8gMTAwMDApKzEsIC8qIHN0ZCBzcGVlZCBoaWdoLCA0dXMgKi8KLQkJCWRldi0+YmFzZSArIERXX0lDX1NTX1NDTF9IQ05UKTsKLQl3cml0ZXcoKGlucHV0X2Nsb2NrX2toeiAqIDQ3IC8gMTAwMDApKzEsIC8qIHN0ZCBzcGVlZCBsb3csIDQuN3VzICovCi0JCQlkZXYtPmJhc2UgKyBEV19JQ19TU19TQ0xfTENOVCk7Ci0Jd3JpdGV3KChpbnB1dF9jbG9ja19raHogKiAgNiAvIDEwMDAwKSsxLCAvKiBmYXN0IHNwZWVkIGhpZ2gsIDAuNnVzICovCi0JCQlkZXYtPmJhc2UgKyBEV19JQ19GU19TQ0xfSENOVCk7Ci0Jd3JpdGV3KChpbnB1dF9jbG9ja19raHogKiAxMyAvIDEwMDAwKSsxLCAvKiBmYXN0IHNwZWVkIGxvdywgMS4zdXMgKi8KLQkJCWRldi0+YmFzZSArIERXX0lDX0ZTX1NDTF9MQ05UKTsKKworCS8qIFN0YW5kYXJkLW1vZGUgKi8KKwloY250ID0gaTJjX2R3X3NjbF9oY250KGlucHV0X2Nsb2NrX2toeiwKKwkJCQk0MCwJLyogdEhEO1NUQSA9IHRISUdIID0gNC4wIHVzICovCisJCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KKwkJCQkwLAkvKiAwOiBEVyBkZWZhdWx0LCAxOiBJZGVhbCAqLworCQkJCTApOwkvKiBObyBvZmZzZXQgKi8KKwlsY250ID0gaTJjX2R3X3NjbF9sY250KGlucHV0X2Nsb2NrX2toeiwKKwkJCQk0NywJLyogdExPVyA9IDQuNyB1cyAqLworCQkJCTMsCS8qIHRmID0gMC4zIHVzICovCisJCQkJMCk7CS8qIE5vIG9mZnNldCAqLworCXdyaXRlbChoY250LCBkZXYtPmJhc2UgKyBEV19JQ19TU19TQ0xfSENOVCk7CisJd3JpdGVsKGxjbnQsIGRldi0+YmFzZSArIERXX0lDX1NTX1NDTF9MQ05UKTsKKwlkZXZfZGJnKGRldi0+ZGV2LCAiU3RhbmRhcmQtbW9kZSBIQ05UOkxDTlQgPSAlZDolZFxuIiwgaGNudCwgbGNudCk7CisKKwkvKiBGYXN0LW1vZGUgKi8KKwloY250ID0gaTJjX2R3X3NjbF9oY250KGlucHV0X2Nsb2NrX2toeiwKKwkJCQk2LAkvKiB0SEQ7U1RBID0gdEhJR0ggPSAwLjYgdXMgKi8KKwkJCQkzLAkvKiB0ZiA9IDAuMyB1cyAqLworCQkJCTAsCS8qIDA6IERXIGRlZmF1bHQsIDE6IElkZWFsICovCisJCQkJMCk7CS8qIE5vIG9mZnNldCAqLworCWxjbnQgPSBpMmNfZHdfc2NsX2xjbnQoaW5wdXRfY2xvY2tfa2h6LAorCQkJCTEzLAkvKiB0TE9XID0gMS4zIHVzICovCisJCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KKwkJCQkwKTsJLyogTm8gb2Zmc2V0ICovCisJd3JpdGVsKGhjbnQsIGRldi0+YmFzZSArIERXX0lDX0ZTX1NDTF9IQ05UKTsKKwl3cml0ZWwobGNudCwgZGV2LT5iYXNlICsgRFdfSUNfRlNfU0NMX0xDTlQpOworCWRldl9kYmcoZGV2LT5kZXYsICJGYXN0LW1vZGUgSENOVDpMQ05UID0gJWQ6JWRcbiIsIGhjbnQsIGxjbnQpOworCisJLyogQ29uZmlndXJlIFR4L1J4IEZJRk8gdGhyZXNob2xkIGxldmVscyAqLworCXdyaXRlbChkZXYtPnR4X2ZpZm9fZGVwdGggLSAxLCBkZXYtPmJhc2UgKyBEV19JQ19UWF9UTCk7CisJd3JpdGVsKDAsIGRldi0+YmFzZSArIERXX0lDX1JYX1RMKTsKIAogCS8qIGNvbmZpZ3VyZSB0aGUgaTJjIG1hc3RlciAqLwogCWljX2NvbiA9IERXX0lDX0NPTl9NQVNURVIgfCBEV19JQ19DT05fU0xBVkVfRElTQUJMRSB8CiAJCURXX0lDX0NPTl9SRVNUQVJUX0VOIHwgRFdfSUNfQ09OX1NQRUVEX0ZBU1Q7Ci0Jd3JpdGV3KGljX2NvbiwgZGV2LT5iYXNlICsgRFdfSUNfQ09OKTsKKwl3cml0ZWwoaWNfY29uLCBkZXYtPmJhc2UgKyBEV19JQ19DT04pOwogfQogCiAvKgpAQCAtMjE1LDcgKzMzNyw3IEBACiB7CiAJaW50IHRpbWVvdXQgPSBUSU1FT1VUOwogCi0Jd2hpbGUgKHJlYWRiKGRldi0+YmFzZSArIERXX0lDX1NUQVRVUykgJiBEV19JQ19TVEFUVVNfQUNUSVZJVFkpIHsKKwl3aGlsZSAocmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfU1RBVFVTKSAmIERXX0lDX1NUQVRVU19BQ1RJVklUWSkgewogCQlpZiAodGltZW91dCA8PSAwKSB7CiAJCQlkZXZfd2FybihkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgYnVzIHJlYWR5XG4iKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwpAQCAtMjI3LDEwNiArMzQ5LDEyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpMmNfZHdfeGZlcl9pbml0KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJc3RydWN0IGkyY19tc2cgKm1zZ3MgPSBkZXYtPm1zZ3M7CisJdTMyIGljX2NvbjsKKworCS8qIERpc2FibGUgdGhlIGFkYXB0ZXIgKi8KKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfRU5BQkxFKTsKKworCS8qIHNldCB0aGUgc2xhdmUgKHRhcmdldCkgYWRkcmVzcyAqLworCXdyaXRlbChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkciwgZGV2LT5iYXNlICsgRFdfSUNfVEFSKTsKKworCS8qIGlmIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIHRlbiBiaXQgYWRkcmVzcywgZW5hYmxlIDEwQklUQUREUiAqLworCWljX2NvbiA9IHJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NPTik7CisJaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5mbGFncyAmIEkyQ19NX1RFTikKKwkJaWNfY29uIHw9IERXX0lDX0NPTl8xMEJJVEFERFJfTUFTVEVSOworCWVsc2UKKwkJaWNfY29uICY9IH5EV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKKwl3cml0ZWwoaWNfY29uLCBkZXYtPmJhc2UgKyBEV19JQ19DT04pOworCisJLyogRW5hYmxlIHRoZSBhZGFwdGVyICovCisJd3JpdGVsKDEsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCXdyaXRlbChEV19JQ19JTlRSX0RFRkFVTFRfTUFTSywgZGV2LT5iYXNlICsgRFdfSUNfSU5UUl9NQVNLKTsKK30KKwogLyoKLSAqIEluaXRpYXRlIGxvdyBsZXZlbCBtYXN0ZXIgcmVhZC93cml0ZSB0cmFuc2FjdGlvbi4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gaTJjX2R3X3hmZXIgd2hlbiBzdGFydGluZyBhIHRyYW5zZmVyLgotICogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIGR3X2kyY19wdW1wX21zZyB0byBjb250aW51ZSBhIHRyYW5zZmVyCi0gKiB0aGF0IGlzIGxvbmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBUWCBGSUZPLgorICogSW5pdGlhdGUgKGFuZCBjb250aW51ZSkgbG93IGxldmVsIG1hc3RlciByZWFkL3dyaXRlIHRyYW5zYWN0aW9uLgorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGkyY19kd19pc3IsIGFuZCBwdW1waW5nIGkyY19tc2cKKyAqIG1lc3NhZ2VzIGludG8gdGhlIHR4IGJ1ZmZlci4gIEV2ZW4gaWYgdGhlIHNpemUgb2YgaTJjX21zZyBkYXRhIGlzCisgKiBsb25nZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgdHggYnVmZmVyLCBpdCBoYW5kbGVzIGV2ZXJ5dGhpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCi1pMmNfZHdfeGZlcl9tc2coc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoraTJjX2R3X3hmZXJfbXNnKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJc3RydWN0IGkyY19tc2cgKm1zZ3MgPSBkZXYtPm1zZ3M7Ci0JaW50IG51bSA9IGRldi0+bXNnc19udW07Ci0JdTE2IGljX2NvbiwgaW50cl9tYXNrOwotCWludCB0eF9saW1pdCA9IGRldi0+dHhfZmlmb19kZXB0aCAtIHJlYWRiKGRldi0+YmFzZSArIERXX0lDX1RYRkxSKTsKLQlpbnQgcnhfbGltaXQgPSBkZXYtPnJ4X2ZpZm9fZGVwdGggLSByZWFkYihkZXYtPmJhc2UgKyBEV19JQ19SWEZMUik7Ci0JdTE2IGFkZHIgPSBtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkcjsKLQl1MTYgYnVmX2xlbiA9IGRldi0+dHhfYnVmX2xlbjsKKwl1MzIgaW50cl9tYXNrOworCWludCB0eF9saW1pdCwgcnhfbGltaXQ7CisJdTMyIGFkZHIgPSBtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkcjsKKwl1MzIgYnVmX2xlbiA9IGRldi0+dHhfYnVmX2xlbjsKKwl1OCAqYnVmID0gZGV2LT50eF9idWY7OwogCi0JaWYgKCEoZGV2LT5zdGF0dXMgJiBTVEFUVVNfV1JJVEVfSU5fUFJPR1JFU1MpKSB7Ci0JCS8qIERpc2FibGUgdGhlIGFkYXB0ZXIgKi8KLQkJd3JpdGViKDAsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7CisJaW50cl9tYXNrID0gRFdfSUNfSU5UUl9ERUZBVUxUX01BU0s7CiAKLQkJLyogc2V0IHRoZSBzbGF2ZSAodGFyZ2V0KSBhZGRyZXNzICovCi0JCXdyaXRldyhtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkciwgZGV2LT5iYXNlICsgRFdfSUNfVEFSKTsKLQotCQkvKiBpZiB0aGUgc2xhdmUgYWRkcmVzcyBpcyB0ZW4gYml0IGFkZHJlc3MsIGVuYWJsZSAxMEJJVEFERFIgKi8KLQkJaWNfY29uID0gcmVhZHcoZGV2LT5iYXNlICsgRFdfSUNfQ09OKTsKLQkJaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5mbGFncyAmIEkyQ19NX1RFTikKLQkJCWljX2NvbiB8PSBEV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKLQkJZWxzZQotCQkJaWNfY29uICY9IH5EV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKLQkJd3JpdGV3KGljX2NvbiwgZGV2LT5iYXNlICsgRFdfSUNfQ09OKTsKLQotCQkvKiBFbmFibGUgdGhlIGFkYXB0ZXIgKi8KLQkJd3JpdGViKDEsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7Ci0JfQotCi0JZm9yICg7IGRldi0+bXNnX3dyaXRlX2lkeCA8IG51bTsgZGV2LT5tc2dfd3JpdGVfaWR4KyspIHsKLQkJLyogaWYgdGFyZ2V0IGFkZHJlc3MgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8KKwlmb3IgKDsgZGV2LT5tc2dfd3JpdGVfaWR4IDwgZGV2LT5tc2dzX251bTsgZGV2LT5tc2dfd3JpdGVfaWR4KyspIHsKKwkJLyoKKwkJICogaWYgdGFyZ2V0IGFkZHJlc3MgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8KIAkJICogcmVwcm9ncmFtIHRoZSB0YXJnZXQgYWRkcmVzcyBpbiB0aGUgaTJjCiAJCSAqIGFkYXB0ZXIgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgdHJhbnNmZXIKIAkJICovCi0JCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkciAhPSBhZGRyKQotCQkJcmV0dXJuOworCQlpZiAobXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmFkZHIgIT0gYWRkcikgeworCQkJZGV2X2VycihkZXYtPmRldiwKKwkJCQkiJXM6IGludmFsaWQgdGFyZ2V0IGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKKwkJCWRldi0+bXNnX2VyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCiAJCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0ubGVuID09IDApIHsKIAkJCWRldl9lcnIoZGV2LT5kZXYsCiAJCQkJIiVzOiBpbnZhbGlkIG1lc3NhZ2UgbGVuZ3RoXG4iLCBfX2Z1bmNfXyk7CiAJCQlkZXYtPm1zZ19lcnIgPSAtRUlOVkFMOwotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAoIShkZXYtPnN0YXR1cyAmIFNUQVRVU19XUklURV9JTl9QUk9HUkVTUykpIHsKIAkJCS8qIG5ldyBpMmNfbXNnICovCi0JCQlkZXYtPnR4X2J1ZiA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5idWY7CisJCQlidWYgPSBtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYnVmOwogCQkJYnVmX2xlbiA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5sZW47CiAJCX0KIAorCQl0eF9saW1pdCA9IGRldi0+dHhfZmlmb19kZXB0aCAtIHJlYWRsKGRldi0+YmFzZSArIERXX0lDX1RYRkxSKTsKKwkJcnhfbGltaXQgPSBkZXYtPnJ4X2ZpZm9fZGVwdGggLSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19SWEZMUik7CisKIAkJd2hpbGUgKGJ1Zl9sZW4gPiAwICYmIHR4X2xpbWl0ID4gMCAmJiByeF9saW1pdCA+IDApIHsKIAkJCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uZmxhZ3MgJiBJMkNfTV9SRCkgewotCQkJCXdyaXRldygweDEwMCwgZGV2LT5iYXNlICsgRFdfSUNfREFUQV9DTUQpOworCQkJCXdyaXRlbCgweDEwMCwgZGV2LT5iYXNlICsgRFdfSUNfREFUQV9DTUQpOwogCQkJCXJ4X2xpbWl0LS07CiAJCQl9IGVsc2UKLQkJCQl3cml0ZXcoKihkZXYtPnR4X2J1ZisrKSwKLQkJCQkJCWRldi0+YmFzZSArIERXX0lDX0RBVEFfQ01EKTsKKwkJCQl3cml0ZWwoKmJ1ZisrLCBkZXYtPmJhc2UgKyBEV19JQ19EQVRBX0NNRCk7CiAJCQl0eF9saW1pdC0tOyBidWZfbGVuLS07CiAJCX0KKworCQlkZXYtPnR4X2J1ZiA9IGJ1ZjsKKwkJZGV2LT50eF9idWZfbGVuID0gYnVmX2xlbjsKKworCQlpZiAoYnVmX2xlbiA+IDApIHsKKwkJCS8qIG1vcmUgYnl0ZXMgdG8gYmUgd3JpdHRlbiAqLworCQkJZGV2LT5zdGF0dXMgfD0gU1RBVFVTX1dSSVRFX0lOX1BST0dSRVNTOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJZGV2LT5zdGF0dXMgJj0gflNUQVRVU19XUklURV9JTl9QUk9HUkVTUzsKIAl9CiAKLQlpbnRyX21hc2sgPSBEV19JQ19JTlRSX1NUT1BfREVUIHwgRFdfSUNfSU5UUl9UWF9BQlJUOwotCWlmIChidWZfbGVuID4gMCkgeyAvKiBtb3JlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gKi8KLQkJaW50cl9tYXNrIHw9IERXX0lDX0lOVFJfVFhfRU1QVFk7Ci0JCWRldi0+c3RhdHVzIHw9IFNUQVRVU19XUklURV9JTl9QUk9HUkVTUzsKLQl9IGVsc2UKLQkJZGV2LT5zdGF0dXMgJj0gflNUQVRVU19XUklURV9JTl9QUk9HUkVTUzsKLQl3cml0ZXcoaW50cl9tYXNrLCBkZXYtPmJhc2UgKyBEV19JQ19JTlRSX01BU0spOworCS8qCisJICogSWYgaTJjX21zZyBpbmRleCBzZWFyY2ggaXMgY29tcGxldGVkLCB3ZSBkb24ndCBuZWVkIFRYX0VNUFRZCisJICogaW50ZXJydXB0IGFueSBtb3JlLgorCSAqLworCWlmIChkZXYtPm1zZ193cml0ZV9pZHggPT0gZGV2LT5tc2dzX251bSkKKwkJaW50cl9tYXNrICY9IH5EV19JQ19JTlRSX1RYX0VNUFRZOwogCi0JZGV2LT50eF9idWZfbGVuID0gYnVmX2xlbjsKKwlpZiAoZGV2LT5tc2dfZXJyKQorCQlpbnRyX21hc2sgPSAwOworCisJd3JpdGVsKGludHJfbWFzaywgZGV2LT5iYXNlICsgRFdfSUNfSU5UUl9NQVNLKTsKIH0KIAogc3RhdGljIHZvaWQKLWkyY19kd19yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK2kyY19kd19yZWFkKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJc3RydWN0IGkyY19tc2cgKm1zZ3MgPSBkZXYtPm1zZ3M7Ci0JaW50IG51bSA9IGRldi0+bXNnc19udW07Ci0JdTE2IGFkZHIgPSBtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5hZGRyOwotCWludCByeF92YWxpZCA9IHJlYWR3KGRldi0+YmFzZSArIERXX0lDX1JYRkxSKTsKKwlpbnQgcnhfdmFsaWQ7CiAKLQlmb3IgKDsgZGV2LT5tc2dfcmVhZF9pZHggPCBudW07IGRldi0+bXNnX3JlYWRfaWR4KyspIHsKLQkJdTE2IGxlbjsKKwlmb3IgKDsgZGV2LT5tc2dfcmVhZF9pZHggPCBkZXYtPm1zZ3NfbnVtOyBkZXYtPm1zZ19yZWFkX2lkeCsrKSB7CisJCXUzMiBsZW47CiAJCXU4ICpidWY7CiAKIAkJaWYgKCEobXNnc1tkZXYtPm1zZ19yZWFkX2lkeF0uZmxhZ3MgJiBJMkNfTV9SRCkpCiAJCQljb250aW51ZTsKIAotCQkvKiBkaWZmZXJlbnQgaTJjIGNsaWVudCwgcmVwcm9ncmFtIHRoZSBpMmMgYWRhcHRlciAqLwotCQlpZiAobXNnc1tkZXYtPm1zZ19yZWFkX2lkeF0uYWRkciAhPSBhZGRyKQotCQkJcmV0dXJuOwotCiAJCWlmICghKGRldi0+c3RhdHVzICYgU1RBVFVTX1JFQURfSU5fUFJPR1JFU1MpKSB7CiAJCQlsZW4gPSBtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5sZW47CiAJCQlidWYgPSBtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5idWY7CkBAIC0zMzUsOCArNDc2LDEwIEBACiAJCQlidWYgPSBkZXYtPnJ4X2J1ZjsKIAkJfQogCisJCXJ4X3ZhbGlkID0gcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfUlhGTFIpOworCiAJCWZvciAoOyBsZW4gPiAwICYmIHJ4X3ZhbGlkID4gMDsgbGVuLS0sIHJ4X3ZhbGlkLS0pCi0JCQkqYnVmKysgPSByZWFkYihkZXYtPmJhc2UgKyBEV19JQ19EQVRBX0NNRCk7CisJCQkqYnVmKysgPSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19EQVRBX0NNRCk7CiAKIAkJaWYgKGxlbiA+IDApIHsKIAkJCWRldi0+c3RhdHVzIHw9IFNUQVRVU19SRUFEX0lOX1BST0dSRVNTOwpAQCAtMzQ4LDYgKzQ5MSwyOSBAQAogCX0KIH0KIAorc3RhdGljIGludCBpMmNfZHdfaGFuZGxlX3R4X2Fib3J0KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBhYm9ydF9zb3VyY2UgPSBkZXYtPmFib3J0X3NvdXJjZTsKKwlpbnQgaTsKKworCWlmIChhYm9ydF9zb3VyY2UgJiBEV19JQ19UWF9BQlJUX05PQUNLKSB7CisJCWZvcl9lYWNoX2JpdChpLCAmYWJvcnRfc291cmNlLCBBUlJBWV9TSVpFKGFib3J0X3NvdXJjZXMpKQorCQkJZGV2X2RiZyhkZXYtPmRldiwKKwkJCQkiJXM6ICVzXG4iLCBfX2Z1bmNfXywgYWJvcnRfc291cmNlc1tpXSk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCWZvcl9lYWNoX2JpdChpLCAmYWJvcnRfc291cmNlLCBBUlJBWV9TSVpFKGFib3J0X3NvdXJjZXMpKQorCQlkZXZfZXJyKGRldi0+ZGV2LCAiJXM6ICVzXG4iLCBfX2Z1bmNfXywgYWJvcnRfc291cmNlc1tpXSk7CisKKwlpZiAoYWJvcnRfc291cmNlICYgRFdfSUNfVFhfQVJCX0xPU1QpCisJCXJldHVybiAtRUFHQUlOOworCWVsc2UgaWYgKGFib3J0X3NvdXJjZSAmIERXX0lDX1RYX0FCUlRfR0NBTExfUkVBRCkKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIHdyb25nIG1zZ3NbXSBkYXRhICovCisJZWxzZQorCQlyZXR1cm4gLUVJTzsKK30KKwogLyoKICAqIFByZXBhcmUgY29udHJvbGxlciBmb3IgYSB0cmFuc2FjdGlvbiBhbmQgY2FsbCBpMmNfZHdfeGZlcl9tc2cKICAqLwpAQCAtMzY5LDEzICs1MzUsMTQgQEAKIAlkZXYtPm1zZ19yZWFkX2lkeCA9IDA7CiAJZGV2LT5tc2dfZXJyID0gMDsKIAlkZXYtPnN0YXR1cyA9IFNUQVRVU19JRExFOworCWRldi0+YWJvcnRfc291cmNlID0gMDsKIAogCXJldCA9IGkyY19kd193YWl0X2J1c19ub3RfYnVzeShkZXYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGRvbmU7CiAKIAkvKiBzdGFydCB0aGUgdHJhbnNmZXJzICovCi0JaTJjX2R3X3hmZXJfbXNnKGFkYXApOworCWkyY19kd194ZmVyX2luaXQoZGV2KTsKIAogCS8qIHdhaXQgZm9yIHR4IHRvIGNvbXBsZXRlICovCiAJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmRldi0+Y21kX2NvbXBsZXRlLCBIWik7CkBAIC0zOTQsMjMgKzU2MSwxNiBAQAogCiAJLyogbm8gZXJyb3IgKi8KIAlpZiAobGlrZWx5KCFkZXYtPmNtZF9lcnIpKSB7Ci0JCS8qIHJlYWQgcnggZmlmbywgYW5kIGRpc2FibGUgdGhlIGFkYXB0ZXIgKi8KLQkJZG8gewotCQkJaTJjX2R3X3JlYWQoYWRhcCk7Ci0JCX0gd2hpbGUgKGRldi0+c3RhdHVzICYgU1RBVFVTX1JFQURfSU5fUFJPR1JFU1MpOwotCQl3cml0ZWIoMCwgZGV2LT5iYXNlICsgRFdfSUNfRU5BQkxFKTsKKwkJLyogRGlzYWJsZSB0aGUgYWRhcHRlciAqLworCQl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfRU5BQkxFKTsKIAkJcmV0ID0gbnVtOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJLyogV2UgaGF2ZSBhbiBlcnJvciAqLwogCWlmIChkZXYtPmNtZF9lcnIgPT0gRFdfSUNfRVJSX1RYX0FCUlQpIHsKLQkJdW5zaWduZWQgbG9uZyBhYm9ydF9zb3VyY2UgPSBkZXYtPmFib3J0X3NvdXJjZTsKLQkJaW50IGk7Ci0KLQkJZm9yX2VhY2hfYml0KGksICZhYm9ydF9zb3VyY2UsIEFSUkFZX1NJWkUoYWJvcnRfc291cmNlcykpIHsKLQkJICAgIGRldl9lcnIoZGV2LT5kZXYsICIlczogJXNcbiIsIF9fZnVuY19fLCBhYm9ydF9zb3VyY2VzW2ldKTsKLQkJfQorCQlyZXQgPSBpMmNfZHdfaGFuZGxlX3R4X2Fib3J0KGRldik7CisJCWdvdG8gZG9uZTsKIAl9CiAJcmV0ID0gLUVJTzsKIApAQCAtNDIyLDIxICs1ODIsNjcgQEAKIAogc3RhdGljIHUzMiBpMmNfZHdfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7Ci0JcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DXzEwQklUX0FERFI7CisJcmV0dXJuCUkyQ19GVU5DX0kyQyB8CisJCUkyQ19GVU5DXzEwQklUX0FERFIgfAorCQlJMkNfRlVOQ19TTUJVU19CWVRFIHwKKwkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKKwkJSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLOwogfQogCi1zdGF0aWMgdm9pZCBkd19pMmNfcHVtcF9tc2codW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHUzMiBpMmNfZHdfcmVhZF9jbGVhcl9pbnRyYml0cyhzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQogewotCXN0cnVjdCBkd19pMmNfZGV2ICpkZXYgPSAoc3RydWN0IGR3X2kyY19kZXYgKikgZGF0YTsKLQl1MTYgaW50cl9tYXNrOworCXUzMiBzdGF0OwogCi0JaTJjX2R3X3JlYWQoJmRldi0+YWRhcHRlcik7Ci0JaTJjX2R3X3hmZXJfbXNnKCZkZXYtPmFkYXB0ZXIpOworCS8qCisJICogVGhlIElDX0lOVFJfU1RBVCByZWdpc3RlciBqdXN0IGluZGljYXRlcyAiZW5hYmxlZCIgaW50ZXJydXB0cy4KKwkgKiBUaHMgdW5tYXNrZWQgcmF3IHZlcnNpb24gb2YgaW50ZXJydXB0IHN0YXR1cyBiaXRzIGFyZSBhdmFpbGFibGUKKwkgKiBpbiB0aGUgSUNfUkFXX0lOVFJfU1RBVCByZWdpc3Rlci4KKwkgKgorCSAqIFRoYXQgaXMsCisJICogICBzdGF0ID0gcmVhZGwoSUNfSU5UUl9TVEFUKTsKKwkgKiBlcXVhbHMgdG8sCisJICogICBzdGF0ID0gcmVhZGwoSUNfUkFXX0lOVFJfU1RBVCkgJiByZWFkbChJQ19JTlRSX01BU0spOworCSAqCisJICogVGhlIHJhdyB2ZXJzaW9uIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCSAqLworCXN0YXQgPSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19JTlRSX1NUQVQpOwogCi0JaW50cl9tYXNrID0gRFdfSUNfSU5UUl9TVE9QX0RFVCB8IERXX0lDX0lOVFJfVFhfQUJSVDsKLQlpZiAoZGV2LT5zdGF0dXMgJiBTVEFUVVNfV1JJVEVfSU5fUFJPR1JFU1MpCi0JCWludHJfbWFzayB8PSBEV19JQ19JTlRSX1RYX0VNUFRZOwotCXdyaXRldyhpbnRyX21hc2ssIGRldi0+YmFzZSArIERXX0lDX0lOVFJfTUFTSyk7CisJLyoKKwkgKiBEbyBub3QgdXNlIHRoZSBJQ19DTFJfSU5UUiByZWdpc3RlciB0byBjbGVhciBpbnRlcnJ1cHRzLCBvcgorCSAqIHlvdSdsbCBtaXNzIHNvbWUgaW50ZXJydXB0cywgdHJpZ2dlcmVkIGR1cmluZyB0aGUgcGVyaW9kIGZyb20KKwkgKiByZWFkbChJQ19JTlRSX1NUQVQpIHRvIHJlYWRsKElDX0NMUl9JTlRSKS4KKwkgKgorCSAqIEluc3RlYWQsIHVzZSB0aGUgc2VwYXJhdGVseS1wcmVwYXJlZCBJQ19DTFJfKiByZWdpc3RlcnMuCisJICovCisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JYX1VOREVSKQorCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfUlhfVU5ERVIpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9PVkVSKQorCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfUlhfT1ZFUik7CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX09WRVIpCisJCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9UWF9PVkVSKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUkRfUkVRKQorCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfUkRfUkVRKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfQUJSVCkgeworCQkvKgorCQkgKiBUaGUgSUNfVFhfQUJSVF9TT1VSQ0UgcmVnaXN0ZXIgaXMgY2xlYXJlZCB3aGVuZXZlcgorCQkgKiB0aGUgSUNfQ0xSX1RYX0FCUlQgaXMgcmVhZC4gIFByZXNlcnZlIGl0IGJlZm9yZWhhbmQuCisJCSAqLworCQlkZXYtPmFib3J0X3NvdXJjZSA9IHJlYWRsKGRldi0+YmFzZSArIERXX0lDX1RYX0FCUlRfU09VUkNFKTsKKwkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1RYX0FCUlQpOworCX0KKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUlhfRE9ORSkKKwkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1JYX0RPTkUpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9BQ1RJVklUWSkKKwkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX0FDVElWSVRZKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfU1RPUF9ERVQpCisJCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9TVE9QX0RFVCk7CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1NUQVJUX0RFVCkKKwkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1NUQVJUX0RFVCk7CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX0dFTl9DQUxMKQorCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfR0VOX0NBTEwpOworCisJcmV0dXJuIHN0YXQ7CiB9CiAKIC8qCkBAIC00NDYsMjAgKzY1MiwzNyBAQAogc3RhdGljIGlycXJldHVybl90IGkyY19kd19pc3IoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IGRldl9pZDsKLQl1MTYgc3RhdDsKKwl1MzIgc3RhdDsKIAotCXN0YXQgPSByZWFkdyhkZXYtPmJhc2UgKyBEV19JQ19JTlRSX1NUQVQpOworCXN0YXQgPSBpMmNfZHdfcmVhZF9jbGVhcl9pbnRyYml0cyhkZXYpOwogCWRldl9kYmcoZGV2LT5kZXYsICIlczogc3RhdD0weCV4XG4iLCBfX2Z1bmNfXywgc3RhdCk7CisKIAlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfQUJSVCkgewotCQlkZXYtPmFib3J0X3NvdXJjZSA9IHJlYWR3KGRldi0+YmFzZSArIERXX0lDX1RYX0FCUlRfU09VUkNFKTsKIAkJZGV2LT5jbWRfZXJyIHw9IERXX0lDX0VSUl9UWF9BQlJUOwogCQlkZXYtPnN0YXR1cyA9IFNUQVRVU19JRExFOwotCX0gZWxzZSBpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfRU1QVFkpCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+cHVtcF9tc2cpOwogCi0JcmVhZGIoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX0lOVFIpOwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCi0Jd3JpdGV3KDAsIGRldi0+YmFzZSArIERXX0lDX0lOVFJfTUFTSyk7CS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCWlmIChzdGF0ICYgKERXX0lDX0lOVFJfVFhfQUJSVCB8IERXX0lDX0lOVFJfU1RPUF9ERVQpKQorCQkvKgorCQkgKiBBbnl0aW1lIFRYX0FCUlQgaXMgc2V0LCB0aGUgY29udGVudHMgb2YgdGhlIHR4L3J4CisJCSAqIGJ1ZmZlcnMgYXJlIGZsdXNoZWQuICBNYWtlIHN1cmUgdG8gc2tpcCB0aGVtLgorCQkgKi8KKwkJd3JpdGVsKDAsIGRldi0+YmFzZSArIERXX0lDX0lOVFJfTUFTSyk7CisJCWdvdG8gdHhfYWJvcnRlZDsKKwl9CisKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUlhfRlVMTCkKKwkJaTJjX2R3X3JlYWQoZGV2KTsKKworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9UWF9FTVBUWSkKKwkJaTJjX2R3X3hmZXJfbXNnKGRldik7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gbW9kaWZ5IG9yIGRpc2FibGUgdGhlIGludGVycnVwdCBtYXNrIGhlcmUuCisJICogaTJjX2R3X3hmZXJfbXNnKCkgd2lsbCB0YWtlIGNhcmUgb2YgaXQgYWNjb3JkaW5nIHRvCisJICogdGhlIGN1cnJlbnQgdHJhbnNtaXQgc3RhdHVzLgorCSAqLworCit0eF9hYm9ydGVkOgorCWlmICgoc3RhdCAmIChEV19JQ19JTlRSX1RYX0FCUlQgfCBEV19JQ19JTlRSX1NUT1BfREVUKSkgfHwgZGV2LT5tc2dfZXJyKQogCQljb21wbGV0ZSgmZGV2LT5jbWRfY29tcGxldGUpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNDc0LDggKzY5Nyw4IEBACiB7CiAJc3RydWN0IGR3X2kyY19kZXYgKmRldjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7Ci0Jc3RydWN0IHJlc291cmNlICptZW0sICppcnEsICppb2FyZWE7Ci0JaW50IHI7CisJc3RydWN0IHJlc291cmNlICptZW0sICppb2FyZWE7CisJaW50IGlycSwgcjsKIAogCS8qIE5PVEU6IGRyaXZlciB1c2VzIHRoZSBzdGF0aWMgcmVnaXN0ZXIgbWFwcGluZyAqLwogCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CkBAIC00ODQsMTAgKzcwNywxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwotCWlmICghaXJxKSB7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgcmVzb3VyY2U/XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBpcnE7IC8qIC1FTlhJTyAqLwogCX0KIAogCWlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCkBAIC01MDQsMTAgKzcyNyw5IEBACiAJfQogCiAJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jb21wbGV0ZSk7Ci0JdGFza2xldF9pbml0KCZkZXYtPnB1bXBfbXNnLCBkd19pMmNfcHVtcF9tc2csICh1bnNpZ25lZCBsb25nKSBkZXYpOwogCW11dGV4X2luaXQoJmRldi0+bG9jayk7CiAJZGV2LT5kZXYgPSBnZXRfZGV2aWNlKCZwZGV2LT5kZXYpOwotCWRldi0+aXJxID0gaXJxLT5zdGFydDsKKwlkZXYtPmlycSA9IGlycTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCiAJZGV2LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwpAQCAtNTMxLDggKzc1Myw4IEBACiAJfQogCWkyY19kd19pbml0KGRldik7CiAKLQl3cml0ZXcoMCwgZGV2LT5iYXNlICsgRFdfSUNfSU5UUl9NQVNLKTsgLyogZGlzYWJsZSBJUlEgKi8KLQlyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGkyY19kd19pc3IsIDAsIHBkZXYtPm5hbWUsIGRldik7CisJd3JpdGVsKDAsIGRldi0+YmFzZSArIERXX0lDX0lOVFJfTUFTSyk7IC8qIGRpc2FibGUgSVJRICovCisJciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBpMmNfZHdfaXNyLCBJUlFGX0RJU0FCTEVELCBwZGV2LT5uYW1lLCBkZXYpOwogCWlmIChyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgcmVxdWVzdGluZyBpcnEgJWlcbiIsIGRldi0+aXJxKTsKIAkJZ290byBlcnJfaW91bm1hcDsKQEAgLTU4Nyw3ICs4MDksNyBAQAogCWNsa19wdXQoZGV2LT5jbGspOwogCWRldi0+Y2xrID0gTlVMTDsKIAotCXdyaXRlYigwLCBkZXYtPmJhc2UgKyBEV19JQ19FTkFCTEUpOworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBEV19JQ19FTkFCTEUpOwogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCWtmcmVlKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKaW5kZXggODI3ZGEwOC4uNzViZjNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKQEAgLTE3OCw2ICsxNzgsMTIgQEAKIAl1bnNpZ25lZAkJYl9odzoxOwkJLyogYmFkIGgvdyBmaXhlcyAqLwogCXVuc2lnbmVkCQlpZGxlOjE7CiAJdTE2CQkJaWVzdGF0ZTsJLyogU2F2ZWQgaW50ZXJydXB0IHJlZ2lzdGVyICovCisJdTE2CQkJcHNjc3RhdGU7CisJdTE2CQkJc2NsbHN0YXRlOworCXUxNgkJCXNjbGhzdGF0ZTsKKwl1MTYJCQlidWZzdGF0ZTsKKwl1MTYJCQlzeXNjc3RhdGU7CisJdTE2CQkJd2VzdGF0ZTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2kyY193cml0ZV9yZWcoc3RydWN0IG9tYXBfaTJjX2RldiAqaTJjX2RldiwKQEAgLTIzMCw5ICsyMzYsMTggQEAKIAogCWNsa19lbmFibGUoZGV2LT5pY2xrKTsKIAljbGtfZW5hYmxlKGRldi0+ZmNsayk7CisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOworCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19QU0NfUkVHLCBkZXYtPnBzY3N0YXRlKTsKKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU0NMTF9SRUcsIGRldi0+c2NsbHN0YXRlKTsKKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU0NMSF9SRUcsIGRldi0+c2NsaHN0YXRlKTsKKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQlVGX1JFRywgZGV2LT5idWZzdGF0ZSk7CisJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NZU0NfUkVHLCBkZXYtPnN5c2NzdGF0ZSk7CisJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1dFX1JFRywgZGV2LT53ZXN0YXRlKTsKKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgT01BUF9JMkNfQ09OX0VOKTsKKwl9CiAJZGV2LT5pZGxlID0gMDsKLQlpZiAoZGV2LT5pZXN0YXRlKQotCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcsIGRldi0+aWVzdGF0ZSk7CisJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLCBkZXYtPmllc3RhdGUpOwogfQogCiBzdGF0aWMgdm9pZCBvbWFwX2kyY19pZGxlKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKQEAgLTI1OCw3ICsyNzMsNyBAQAogCiBzdGF0aWMgaW50IG9tYXBfaTJjX2luaXQoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQogewotCXUxNiBwc2MgPSAwLCBzY2xsID0gMCwgc2NsaCA9IDA7CisJdTE2IHBzYyA9IDAsIHNjbGwgPSAwLCBzY2xoID0gMCwgYnVmID0gMDsKIAl1MTYgZnNzY2xsID0gMCwgZnNzY2xoID0gMCwgaHNzY2xsID0gMCwgaHNzY2xoID0gMDsKIAl1bnNpZ25lZCBsb25nIGZjbGtfcmF0ZSA9IDEyMDAwMDAwOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKQEAgLTI4NywyNCArMzAyLDIyIEBACiAJCQkJCSAgIFNZU0NfQVVUT0lETEVfTUFTSyk7CiAKIAkJfSBlbHNlIGlmIChkZXYtPnJldiA+PSBPTUFQX0kyQ19SRVZfT05fMzQzMCkgewotCQkJdTMyIHY7Ci0KLQkJCXYgPSBTWVNDX0FVVE9JRExFX01BU0s7Ci0JCQl2IHw9IFNZU0NfRU5BV0FLRVVQX01BU0s7Ci0JCQl2IHw9IChTWVNDX0lETEVNT0RFX1NNQVJUIDw8CisJCQlkZXYtPnN5c2NzdGF0ZSA9IFNZU0NfQVVUT0lETEVfTUFTSzsKKwkJCWRldi0+c3lzY3N0YXRlIHw9IFNZU0NfRU5BV0FLRVVQX01BU0s7CisJCQlkZXYtPnN5c2NzdGF0ZSB8PSAoU1lTQ19JRExFTU9ERV9TTUFSVCA8PAogCQkJICAgICAgX19mZnMoU1lTQ19TSURMRU1PREVfTUFTSykpOwotCQkJdiB8PSAoU1lTQ19DTE9DS0FDVElWSVRZX0ZDTEsgPDwKKwkJCWRldi0+c3lzY3N0YXRlIHw9IChTWVNDX0NMT0NLQUNUSVZJVFlfRkNMSyA8PAogCQkJICAgICAgX19mZnMoU1lTQ19DTE9DS0FDVElWSVRZX01BU0spKTsKIAotCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsIHYpOworCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsCisJCQkJCQkJZGV2LT5zeXNjc3RhdGUpOwogCQkJLyoKIAkJCSAqIEVuYWJsaW5nIGFsbCB3YWt1cCBzb3VyY2VzIHRvIHN0b3AgSTJDIGZyZWV6aW5nIG9uCiAJCQkgKiBXRkkgaW5zdHJ1Y3Rpb24uCiAJCQkgKiBSRVZJU0lUOiBTb21lIHdrdXAgc291cmNlcyBtaWdodCBub3QgYmUgbmVlZGVkLgogCQkJICovCi0JCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19XRV9SRUcsCi0JCQkJCQkJT01BUF9JMkNfV0VfQUxMKTsKLQorCQkJZGV2LT53ZXN0YXRlID0gT01BUF9JMkNfV0VfQUxMOworCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfV0VfUkVHLCBkZXYtPndlc3RhdGUpOwogCQl9CiAJfQogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOwpAQCAtMzk0LDIzICs0MDcsMjggQEAKIAlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TQ0xMX1JFRywgc2NsbCk7CiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU0NMSF9SRUcsIHNjbGgpOwogCi0JaWYgKGRldi0+Zmlmb19zaXplKQotCQkvKiBOb3RlOiBzZXR1cCByZXF1aXJlZCBmaWZvIHNpemUgLSAxICovCi0JCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0JVRl9SRUcsCi0JCQkJCShkZXYtPmZpZm9fc2l6ZSAtIDEpIDw8IDggfCAvKiBSVFJTSCAqLwotCQkJCQlPTUFQX0kyQ19CVUZfUlhGSUZfQ0xSIHwKLQkJCQkJKGRldi0+Zmlmb19zaXplIC0gMSkgfCAvKiBYVFJTSCAqLwotCQkJCQlPTUFQX0kyQ19CVUZfVFhGSUZfQ0xSKTsKKwlpZiAoZGV2LT5maWZvX3NpemUpIHsKKwkJLyogTm90ZTogc2V0dXAgcmVxdWlyZWQgZmlmbyBzaXplIC0gMS4gUlRSU0ggYW5kIFhUUlNIICovCisJCWJ1ZiA9IChkZXYtPmZpZm9fc2l6ZSAtIDEpIDw8IDggfCBPTUFQX0kyQ19CVUZfUlhGSUZfQ0xSIHwKKwkJCShkZXYtPmZpZm9fc2l6ZSAtIDEpIHwgT01BUF9JMkNfQlVGX1RYRklGX0NMUjsKKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQlVGX1JFRywgYnVmKTsKKwl9CiAKIAkvKiBUYWtlIHRoZSBJMkMgbW9kdWxlIG91dCBvZiByZXNldDogKi8KIAlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCBPTUFQX0kyQ19DT05fRU4pOwogCiAJLyogRW5hYmxlIGludGVycnVwdHMgKi8KLQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcsCi0JCQkoT01BUF9JMkNfSUVfWFJEWSB8IE9NQVBfSTJDX0lFX1JSRFkgfAorCWRldi0+aWVzdGF0ZSA9IChPTUFQX0kyQ19JRV9YUkRZIHwgT01BUF9JMkNfSUVfUlJEWSB8CiAJCQlPTUFQX0kyQ19JRV9BUkRZIHwgT01BUF9JMkNfSUVfTkFDSyB8CiAJCQlPTUFQX0kyQ19JRV9BTCkgIHwgKChkZXYtPmZpZm9fc2l6ZSkgPwotCQkJCShPTUFQX0kyQ19JRV9SRFIgfCBPTUFQX0kyQ19JRV9YRFIpIDogMCkpOworCQkJCShPTUFQX0kyQ19JRV9SRFIgfCBPTUFQX0kyQ19JRV9YRFIpIDogMCk7CisJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLCBkZXYtPmllc3RhdGUpOworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCQlkZXYtPnBzY3N0YXRlID0gcHNjOworCQlkZXYtPnNjbGxzdGF0ZSA9IHNjbGw7CisJCWRldi0+c2NsaHN0YXRlID0gc2NsaDsKKwkJZGV2LT5idWZzdGF0ZSA9IGJ1ZjsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG54LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBueC5jCmluZGV4IGZiYWI2ODQuLjVkMWMyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG54LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbnguYwpAQCAtNjM4LDcgKzYzOCw4IEBACiAKIAkvKiBSZWdpc3RlciB0aGlzIGFkYXB0ZXIgd2l0aCB0aGUgSTJDIHN1YnN5c3RlbSAqLwogCWkyY19wbngtPmFkYXB0ZXItPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCXJldCA9IGkyY19hZGRfYWRhcHRlcihpMmNfcG54LT5hZGFwdGVyKTsKKwlpMmNfcG54LT5hZGFwdGVyLT5uciA9IHBkZXYtPmlkOworCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihpMmNfcG54LT5hZGFwdGVyKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJMkM6IEZhaWxlZCB0byBhZGQgYnVzXG4iKTsKIAkJZ290byBvdXRfaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zY21pLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNjbWkuYwppbmRleCBiNGE1NWQ0Li4zNjVlMGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNjbWkuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNjbWkuYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJc21idXNfY21pLT5jYXBfd3JpdGUgPSAwOwogCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfTUVUSE9ELCBzbWJ1c19jbWktPmhhbmRsZSwgMSwKLQkJCSAgICBhY3BpX3NtYnVzX2NtaV9xdWVyeV9tZXRob2RzLCBzbWJ1c19jbWksIE5VTEwpOworCQkJICAgIGFjcGlfc21idXNfY21pX3F1ZXJ5X21ldGhvZHMsIE5VTEwsIHNtYnVzX2NtaSwgTlVMTCk7CiAKIAlpZiAoc21idXNfY21pLT5jYXBfaW5mbyA9PSAwKQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL0tjb25maWcgYi9kcml2ZXJzL2lkZS9LY29uZmlnCmluZGV4IDlhNWQwYWEuLjk4Y2NmZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL0tjb25maWcKKysrIGIvZHJpdmVycy9pZGUvS2NvbmZpZwpAQCAtNyw1MCArNywyNSBAQAogCWJvb2wKIAogbWVudWNvbmZpZyBJREUKLQl0cmlzdGF0ZSAiQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydCAoREVQUkVDQVRFRCkiCiAJZGVwZW5kcyBvbiBIQVZFX0lERQogCWRlcGVuZHMgb24gQkxPQ0sKIAktLS1oZWxwLS0tCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91ciBrZXJuZWwgd2lsbCBiZSBhYmxlIHRvIG1hbmFnZSBsb3cgY29zdCBtYXNzCi0JICBzdG9yYWdlIHVuaXRzIHN1Y2ggYXMgQVRBLyhFKUlERSBhbmQgQVRBUEkgdW5pdHMuIFRoZSBtb3N0IGNvbW1vbgotCSAgY2FzZXMgYXJlIElERSBoYXJkIGRyaXZlcyBhbmQgQVRBUEkgQ0QtUk9NIGRyaXZlcy4KKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3VyIGtlcm5lbCB3aWxsIGJlIGFibGUgdG8gbWFuYWdlIEFUQS8oRSlJREUgYW5kCisJICBBVEFQSSB1bml0cy4gVGhlIG1vc3QgY29tbW9uIGNhc2VzIGFyZSBJREUgaGFyZCBkcml2ZXMgYW5kIEFUQVBJCisJICBDRC1ST00gZHJpdmVzLgogCi0JICBJZiB5b3VyIHN5c3RlbSBpcyBwdXJlIFNDU0kgYW5kIGRvZXNuJ3QgdXNlIHRoZXNlIGludGVyZmFjZXMsIHlvdQotCSAgY2FuIHNheSBOIGhlcmUuCi0KLQkgIEludGVncmF0ZWQgRGlzayBFbGVjdHJvbmljcyAoSURFIGFrYSBBVEEtMSkgaXMgYSBjb25uZWN0aW5nIHN0YW5kYXJkCi0JICBmb3IgbWFzcyBzdG9yYWdlIHVuaXRzIHN1Y2ggYXMgaGFyZCBkaXNrcy4gSXQgd2FzIGRlc2lnbmVkIGJ5Ci0JICBXZXN0ZXJuIERpZ2l0YWwgYW5kIENvbXBhcSBDb21wdXRlciBpbiAxOTg0LiBJdCB3YXMgdGhlbiBuYW1lZAotCSAgU1Q1MDYuIFF1aXRlIGEgbnVtYmVyIG9mIGRpc2tzIHVzZSB0aGUgSURFIGludGVyZmFjZS4KLQotCSAgQVQgQXR0YWNobWVudCAoQVRBKSBpcyB0aGUgc3VwZXJzZXQgb2YgdGhlIElERSBzcGVjaWZpY2F0aW9ucy4KLQkgIFNUNTA2IHdhcyBhbHNvIGNhbGxlZCBBVEEtMS4KLQotCSAgRmFzdC1JREUgaXMgQVRBLTIgKGFsc28gbmFtZWQgRmFzdCBBVEEpLCBFbmhhbmNlZCBJREUgKEVJREUpIGlzCi0JICBBVEEtMy4gSXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgbGFyZ2VyIGRpc2tzICh1cCB0byA4LjRHQiBieSBtZWFucyBvZgotCSAgdGhlIExCQSBzdGFuZGFyZCksIG1vcmUgZGlza3MgKDQgaW5zdGVhZCBvZiAyKSBhbmQgZm9yIG90aGVyIG1hc3MKLQkgIHN0b3JhZ2UgdW5pdHMgc3VjaCBhcyB0YXBlcyBhbmQgY2Ryb20uIFVETUEvMzMgKGFrYSBVbHRyYURNQS8zMykgaXMKLQkgIEFUQS00IGFuZCBwcm92aWRlcyBmYXN0ZXIgKGFuZCBtb3JlIENQVSBmcmllbmRseSkgdHJhbnNmZXIgbW9kZXMKLQkgIHRoYW4gcHJldmlvdXMgUElPIChQcm9ncmFtbWVkIHByb2Nlc3NvciBJbnB1dC9PdXRwdXQpIGZyb20gcHJldmlvdXMKLQkgIEFUQS9JREUgc3RhbmRhcmRzIGJ5IG1lYW5zIG9mIGZhc3QgRE1BIGNvbnRyb2xsZXJzLgotCi0JICBBVEEgUGFja2V0IEludGVyZmFjZSAoQVRBUEkpIGlzIGEgcHJvdG9jb2wgdXNlZCBieSBFSURFIHRhcGUgYW5kCi0JICBDRC1ST00gZHJpdmVzLCBzaW1pbGFyIGluIG1hbnkgcmVzcGVjdHMgdG8gdGhlIFNDU0kgcHJvdG9jb2wuCi0KLQkgIFNNQVJUIElERSAoU2VsZiBNb25pdG9yaW5nLCBBbmFseXNpcyBhbmQgUmVwb3J0aW5nIFRlY2hub2xvZ3kpIHdhcwotCSAgZGVzaWduZWQgaW4gb3JkZXIgdG8gcHJldmVudCBkYXRhIGNvcnJ1cHRpb24gYW5kIGRpc2sgY3Jhc2ggYnkKLQkgIGRldGVjdGluZyBwcmUgaGFyZHdhcmUgZmFpbHVyZSBjb25kaXRpb25zIChoZWF0LCBhY2Nlc3MgdGltZSwgYW5kCi0JICB0aGUgbGlrZS4uLikuIERpc2tzIGJ1aWx0IHNpbmNlIEp1bmUgMTk5NSBtYXkgZm9sbG93IHRoaXMgc3RhbmRhcmQuCi0JICBUaGUga2VybmVsIGl0c2VsZiBkb2Vzbid0IG1hbmFnZSB0aGlzOyBob3dldmVyIHRoZXJlIGFyZSBxdWl0ZSBhCi0JICBudW1iZXIgb2YgdXNlciBwcm9ncmFtcyBzdWNoIGFzIHNtYXJ0IHRoYXQgY2FuIHF1ZXJ5IHRoZSBzdGF0dXMgb2YKLQkgIFNNQVJUIHBhcmFtZXRlcnMgZnJvbSBkaXNrIGRyaXZlcy4KKwkgIFRoaXMgc3Vic3lzdGVtIGlzIGN1cnJlbnRseSBpbiBtYWludGVuYW5jZSBtb2RlIHdpdGggb25seSBidWcgZml4CisJICBjaGFuZ2VzIGFwcGxpZWQuIFVzZXJzIG9mIEFUQSBoYXJkd2FyZSBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvCisJICB0aGUgbmV3ZXIgQVRBIHN1YnN5c3RlbSAoIlNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEKKwkgIChleHBlcmltZW50YWwpIGRyaXZlcnMiKSB3aGljaCBpcyBtb3JlIGFjdGl2ZWx5IG1haW50YWluZWQuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlkZS1jb3JlLgogCiAJICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9pZGUvaWRlLnR4dD4uCiAKLQkgIElmIHVuc3VyZSwgc2F5IFkuCisJICBJZiB1bnN1cmUsIHNheSBOLgogCiBpZiBJREUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYWxpbTE1eDMuYyBiL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMKaW5kZXggZTU5YjZkZS4uMGFiYzQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYWxpbTE1eDMuYworKysgYi9kcml2ZXJzL2lkZS9hbGltMTV4My5jCkBAIC00MCwxNiArNDAsNiBAQAogI2RlZmluZSBEUlZfTkFNRSAiYWxpbTE1eDMiCiAKIC8qCi0gKiBBbGxvdyBVRE1BIG9uIE0xNTQzQy1FIGNoaXBzZXQgZm9yIFdEQyBkaXNrcyB0aGF0IGlnbm9yZSBDUkMgY2hlY2tpbmcKLSAqICh0aGlzIGlzIERBTkdFUk9VUyBhbmQgY291bGQgcmVzdWx0IGluIGRhdGEgY29ycnVwdGlvbikuCi0gKi8KLXN0YXRpYyBpbnQgd2RjX3VkbWE7Ci0KLW1vZHVsZV9wYXJhbSh3ZGNfdWRtYSwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdkY191ZG1hLAotCQkgImFsbG93IFVETUEgb24gTTE1NDNDLUUgY2hpcHNldCBmb3IgV0RDIGRpc2tzIChEQU5HRVJPVVMpIik7Ci0KLS8qCiAgKglBTGkgZGV2aWNlcyBhcmUgbm90IHBsdWcgaW4uIE90aGVyd2lzZSB0aGVzZSBzdGF0aWMgdmFsdWVzIHdvdWxkCiAgKgluZWVkIHRvIGdvLiBUaGV5IG91Z2h0IHRvIGdvIGF3YXkgYW55d2F5CiAgKi8KQEAgLTEzMiw3ICsxMjIsNyBAQAogCWlmIChtNTIyOV9yZXZpc2lvbiA+IDB4MjAgJiYgbTUyMjlfcmV2aXNpb24gPCAweEMyKSB7CiAJCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spCiAJCQlyZXR1cm4gMDsKLQkJaWYgKHdkY191ZG1hID09IDAgJiYgY2hpcF9pc18xNTQzY19lICYmCisJCWlmIChjaGlwX2lzXzE1NDNjX2UgJiYKIAkJICAgIHN0cnN0cigoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX1BST0RdLCAiV0RDICIpKQogCQkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jIGIvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jCmluZGV4IDU4MTIxYmQuLjg3Y2VmMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYworKysgYi9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMKQEAgLTUzMiwxNCArNTMyLDEzIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsCi0JCQkJZGV2LT5uYW1lKSkgeworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgZGV2LT5uYW1lKSkgewogCQlwcl9kZWJ1ZygiJXM6IHJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWRcbiIsIERSVl9OQU1FKTsKIAkJcmV0ID0gIC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQogCi0JYWh3aWYtPnJlZ2Jhc2UgPSAodTMyKWlvcmVtYXAocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJYWh3aWYtPnJlZ2Jhc2UgPSAodTMyKWlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoYWh3aWYtPnJlZ2Jhc2UgPT0gMCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTU3NSw3ICs1NzQsNyBAQAogCWlvdW5tYXAoKHZvaWQgKilhaHdpZi0+cmVnYmFzZSk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jbWQ2NHguYyBiL2RyaXZlcnMvaWRlL2NtZDY0eC5jCmluZGV4IGNhMGM0NmYuLmYyNTAwYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NtZDY0eC5jCisrKyBiL2RyaXZlcnMvaWRlL2NtZDY0eC5jCkBAIC0yMCwxNCArMjAsNiBAQAogCiAjZGVmaW5lIERSVl9OQU1FICJjbWQ2NHgiCiAKLSNkZWZpbmUgQ01EX0RFQlVHIDAKLQotI2lmIENNRF9ERUJVRwotI2RlZmluZSBjbWRwcmludGsoeC4uLikJcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZSBjbWRwcmludGsoeC4uLikKLSNlbmRpZgotCiAvKgogICogQ01ENjR4IHNwZWNpZmljIHJlZ2lzdGVycyBkZWZpbml0aW9uLgogICovCkBAIC03Niw5ICs2OCw2IEBACiAJCXsxNSwgMTUsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMH07CiAJc3RhdGljIGNvbnN0IHU4IGRyd3RpbV9yZWdzWzRdID0ge0RSV1RJTTAsIERSV1RJTTEsIERSV1RJTTIsIERSV1RJTTN9OwogCi0JY21kcHJpbnRrKCJwcm9ncmFtX2N5Y2xlX3RpbWVzIHBhcmFtZXRlcnM6IHRvdGFsPSVkLCBhY3RpdmU9JWRcbiIsCi0JCSAgY3ljbGVfdGltZSwgYWN0aXZlX3RpbWUpOwotCiAJY3ljbGVfY291bnQJPSBxdWFudGl6ZV90aW1pbmcoIGN5Y2xlX3RpbWUsIGNsb2NrX3RpbWUpOwogCWFjdGl2ZV9jb3VudAk9IHF1YW50aXplX3RpbWluZyhhY3RpdmVfdGltZSwgY2xvY2tfdGltZSk7CiAJcmVjb3ZlcnlfY291bnQJPSBjeWNsZV9jb3VudCAtIGFjdGl2ZV9jb3VudDsKQEAgLTk0LDkgKzgzLDYgQEAKIAlpZiAoYWN0aXZlX2NvdW50ID4gMTYpCQkvKiBzaG91bGRuJ3QgYWN0dWFsbHkgaGFwcGVuLi4uICovCiAJIAlhY3RpdmVfY291bnQgPSAxNjsKIAotCWNtZHByaW50aygiRmluYWwgY291bnRzOiB0b3RhbD0lZCwgYWN0aXZlPSVkLCByZWNvdmVyeT0lZFxuIiwKLQkJICBjeWNsZV9jb3VudCwgYWN0aXZlX2NvdW50LCByZWNvdmVyeV9jb3VudCk7Ci0KIAkvKgogCSAqIENvbnZlcnQgdmFsdWVzIHRvIGludGVybmFsIGNoaXBzZXQgcmVwcmVzZW50YXRpb24KIAkgKi8KQEAgLTEwNiw3ICs5Miw2IEBACiAJLyogUHJvZ3JhbSB0aGUgYWN0aXZlL3JlY292ZXJ5IGNvdW50cyBpbnRvIHRoZSBEUldUSU0gcmVnaXN0ZXIgKi8KIAlkcnd0aW0gPSAoYWN0aXZlX2NvdW50IDw8IDQpIHwgcmVjb3ZlcnlfY291bnQ7CiAJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGRyd3RpbV9yZWdzW2RyaXZlLT5kbl0sIGRyd3RpbSk7Ci0JY21kcHJpbnRrKCJXcml0ZSAweCUwMnggdG8gcmVnIDB4JXhcbiIsIGRyd3RpbSwgZHJ3dGltX3JlZ3NbZHJpdmUtPmRuXSk7CiB9CiAKIC8qCkBAIC0xNTAsNyArMTM1LDYgQEAKIAogCWlmIChzZXR1cF9jb3VudCA+IDUpCQkvKiBzaG91bGRuJ3QgYWN0dWFsbHkgaGFwcGVuLi4uICovCiAJCXNldHVwX2NvdW50ID0gNTsKLQljbWRwcmludGsoIkZpbmFsIGFkZHJlc3Mgc2V0dXAgY291bnQ6ICVkXG4iLCBzZXR1cF9jb3VudCk7CiAKIAkvKgogCSAqIFByb2dyYW0gdGhlIGFkZHJlc3Mgc2V0dXAgY2xvY2tzIGludG8gdGhlIEFSVFRJTSByZWdpc3RlcnMuCkBAIC0xNjIsNyArMTQ2LDYgQEAKIAlhcnR0aW0gJj0gfjB4YzA7CiAJYXJ0dGltIHw9IHNldHVwX3ZhbHVlc1tzZXR1cF9jb3VudF07CiAJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIGFydHRpbV9yZWdzW2RyaXZlLT5kbl0sIGFydHRpbSk7Ci0JY21kcHJpbnRrKCJXcml0ZSAweCUwMnggdG8gcmVnIDB4JXhcbiIsIGFydHRpbSwgYXJ0dGltX3JlZ3NbZHJpdmUtPmRuXSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jczU1MzUuYyBiL2RyaXZlcnMvaWRlL2NzNTUzNS5jCmluZGV4IDk4M2Q5NTcuLmI4ODM4MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NzNTUzNS5jCisrKyBiL2RyaXZlcnMvaWRlL2NzNTUzNS5jCkBAIC0xODcsNiArMTg3LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNzNTUzNV9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkRFVklDRShOUywgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfSURFKSwgMCB9LAorCXsgUENJX1ZERVZJQ0UoQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzVfSURFKSwgfSwKIAl7IDAsIH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jeTgyYzY5My5jIGIvZHJpdmVycy9pZGUvY3k4MmM2OTMuYwppbmRleCA3NGZjNTQwLi5kNmUyY2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCisrKyBiL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKQEAgLTUxLDExICs1MSw2IEBACiAjZGVmaW5lIERSVl9OQU1FICJjeTgyYzY5MyIKIAogLyoKLSAqCVRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gZGVidWcgdGhlIGRyaXZlci4KLSAqLwotI2RlZmluZSBDWTgyQzY5M19ERUJVR19JTkZPCTAKLQotLyoKICAqCU5PVEU6IHRoZSB2YWx1ZSBmb3IgYnVzbWFzdGVyIHRpbWVvdXQgaXMgdHJpY2t5IGFuZCBJIGdvdCBpdCBieQogICoJdHJpYWwgYW5kIGVycm9yISAgQnkgdXNpbmcgYSB0byBsb3cgdmFsdWUgd2lsbCBjYXVzZSBETUEgdGltZW91dHMKICAqCWFuZCBkcm9wIElERSBwZXJmb3JtYW5jZSwgYW5kIGJ5IHVzaW5nIGEgdG8gaGlnaCB2YWx1ZSB3aWxsIGNhdXNlCkBAIC0xNzYsMTEgKzE3MSw2IEBACiAJb3V0YihpbmRleCwgQ1k4Ml9JTkRFWF9QT1JUKTsKIAlvdXRiKGRhdGEsIENZODJfREFUQV9QT1JUKTsKIAotI2lmIENZODJDNjkzX0RFQlVHX0lORk8KLQlwcmludGsoS0VSTl9JTkZPICIlcyAoY2g9JWQsIGRldj0lZCk6IHNldCBETUEgbW9kZSB0byAlZCAoc2luZ2xlPSVkKVxuIiwKLQkJZHJpdmUtPm5hbWUsIGh3aWYtPmNoYW5uZWwsIGRyaXZlLT5kbiAmIDEsIG1vZGUgJiAzLCBzaW5nbGUpOwotI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KLQogCS8qCiAJICogbm90ZTogYmVsb3cgd2Ugc2V0IHRoZSB2YWx1ZSBmb3IgQnVzIE1hc3RlciBJREUgVGltZU91dCBSZWdpc3RlcgogCSAqIEknbSBub3QgYWJzb2x1dGx5IHN1cmUgd2hhdCB0aGlzIGRvZXMsIGJ1dCBpdCBzb2x2ZWQgbXkgcHJvYmxlbQpAQCAtMTk0LDExICsxODQsNiBAQAogCWRhdGEgPSBCVVNNQVNURVJfVElNRU9VVDsKIAlvdXRiKENZODJfSU5ERVhfVElNRU9VVCwgQ1k4Ml9JTkRFWF9QT1JUKTsKIAlvdXRiKGRhdGEsIENZODJfREFUQV9QT1JUKTsKLQotI2lmIENZODJDNjkzX0RFQlVHX0lORk8KLQlwcmludGsoS0VSTl9JTkZPICIlczogU2V0IElERSBCdXMgTWFzdGVyIFRpbWVPdXQgUmVnaXN0ZXIgdG8gMHglWFxuIiwKLQkJZHJpdmUtPm5hbWUsIGRhdGEpOwotI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KIH0KIAogc3RhdGljIHZvaWQgY3k4MmM2OTNfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQpAQCAtMjM5LDggKzIyNCw2IEBACiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX01BU1RFUl9JT1IsIHBjbGsudGltZV8xNnIpOwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9NQVNURVJfSU9XLCBwY2xrLnRpbWVfMTZ3KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfTUFTVEVSXzhCSVQsIHBjbGsudGltZV84KTsKLQotCQlhZGRyQ3RybCAmPSAweEY7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogc2V0IHNsYXZlIGRyaXZlCkBAIC0yNTcsMTcgKzI0MCw3IEBACiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX1NMQVZFX0lPUiwgcGNsay50aW1lXzE2cik7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX1NMQVZFX0lPVywgcGNsay50aW1lXzE2dyk7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX1NMQVZFXzhCSVQsIHBjbGsudGltZV84KTsKLQotCQlhZGRyQ3RybCA+Pj0gNDsKLQkJYWRkckN0cmwgJj0gMHhGOwogCX0KLQotI2lmIENZODJDNjkzX0RFQlVHX0lORk8KLQlwcmludGsoS0VSTl9JTkZPICIlcyAoY2g9JWQsIGRldj0lZCk6IHNldCBQSU8gdGltaW5nIHRvICIKLQkJIihhZGRyPTB4JVgsIGlvcj0weCVYLCBpb3c9MHglWCwgOGJpdD0weCVYKVxuIiwKLQkJZHJpdmUtPm5hbWUsIGh3aWYtPmNoYW5uZWwsIGRyaXZlLT5kbiAmIDEsCi0JCWFkZHJDdHJsLCBwY2xrLnRpbWVfMTZyLCBwY2xrLnRpbWVfMTZ3LCBwY2xrLnRpbWVfOCk7Ci0jZW5kaWYgLyogQ1k4MkM2OTNfREVCVUdfSU5GTyAqLwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9pb3BzX2N5ODJjNjkzKGlkZV9od2lmX3QgKmh3aWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9ocHQzNjYuYyBiL2RyaXZlcnMvaWRlL2hwdDM2Ni5jCmluZGV4IDdjZTY4ZWYuLjRkOTBhYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2hwdDM2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL2hwdDM2Ni5jCkBAIC0yOTcsNjggKzI5Nyw2IEBACiAJLyogWEZFUl9QSU9fMCAqLwkweGMwZDA4NTg1CiB9OwogCi0jaWYgMAotLyogVGhlc2UgYXJlIHRoZSB0aW1pbmcgdGFibGVzIGZyb20gdGhlIEhpZ2hQb2ludCBvcGVuIHNvdXJjZSBkcml2ZXJzLi4uICovCi1zdGF0aWMgdTMyIHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3eFtdID0gewotCS8qIFhGRVJfVURNQV82ICovCTB4MTI0NDYyMzEsCS8qIDB4MTI2NDYyMzEgPz8gKi8KLQkvKiBYRkVSX1VETUFfNSAqLwkweDEyNDQ2MjMxLAotCS8qIFhGRVJfVURNQV80ICovCTB4MTI0NDYyMzEsCi0JLyogWEZFUl9VRE1BXzMgKi8JMHgxMjZjNjIzMSwKLQkvKiBYRkVSX1VETUFfMiAqLwkweDEyNDg2MjMxLAotCS8qIFhGRVJfVURNQV8xICovCTB4MTI0YzYyMzMsCi0JLyogWEZFUl9VRE1BXzAgKi8JMHgxMjUwNjI5NywKLQotCS8qIFhGRVJfTVdfRE1BXzIgKi8JMHgyMjQwNmMzMSwKLQkvKiBYRkVSX01XX0RNQV8xICovCTB4MjI0MDZjMzMsCi0JLyogWEZFUl9NV19ETUFfMCAqLwkweDIyNDA2Yzk3LAotCi0JLyogWEZFUl9QSU9fNCAqLwkweDA2NDE0ZTMxLAotCS8qIFhGRVJfUElPXzMgKi8JMHgwNjQxNGU0MiwKLQkvKiBYRkVSX1BJT18yICovCTB4MDY0MTRlNTMsCi0JLyogWEZFUl9QSU9fMSAqLwkweDA2ODE0ZTkzLAotCS8qIFhGRVJfUElPXzAgKi8JMHgwNjgxNGVhNwotfTsKLQotc3RhdGljIHUzMiBmaWZ0eV9iYXNlX2hwdDM3eFtdID0gewotCS8qIFhGRVJfVURNQV82ICovCTB4MTI4NDgyNDIsCi0JLyogWEZFUl9VRE1BXzUgKi8JMHgxMjg0ODI0MiwKLQkvKiBYRkVSX1VETUFfNCAqLwkweDEyYWM4MjQyLAotCS8qIFhGRVJfVURNQV8zICovCTB4MTI4YzgyNDIsCi0JLyogWEZFUl9VRE1BXzIgKi8JMHgxMjBjODI0MiwKLQkvKiBYRkVSX1VETUFfMSAqLwkweDEyMTQ4MjU0LAotCS8qIFhGRVJfVURNQV8wICovCTB4MTIxODgyZWEsCi0KLQkvKiBYRkVSX01XX0RNQV8yICovCTB4MjI4MDgyNDIsCi0JLyogWEZFUl9NV19ETUFfMSAqLwkweDIyODA4MjU0LAotCS8qIFhGRVJfTVdfRE1BXzAgKi8JMHgyMjgwODJlYSwKLQotCS8qIFhGRVJfUElPXzQgKi8JMHgwYTgxZjQ0MiwKLQkvKiBYRkVSX1BJT18zICovCTB4MGE4MWY0NDMsCi0JLyogWEZFUl9QSU9fMiAqLwkweDBhODFmNDU0LAotCS8qIFhGRVJfUElPXzEgKi8JMHgwYWMxZjQ2NSwKLQkvKiBYRkVSX1BJT18wICovCTB4MGFjMWY0OGEKLX07Ci0KLXN0YXRpYyB1MzIgc2l4dHlfc2l4X2Jhc2VfaHB0Mzd4W10gPSB7Ci0JLyogWEZFUl9VRE1BXzYgKi8JMHgxYzg2OWM2MiwKLQkvKiBYRkVSX1VETUFfNSAqLwkweDFjYWU5YzYyLAkvKiAweDFjOGE5YzYyICovCi0JLyogWEZFUl9VRE1BXzQgKi8JMHgxYzhhOWM2MiwKLQkvKiBYRkVSX1VETUFfMyAqLwkweDFjOGU5YzYyLAotCS8qIFhGRVJfVURNQV8yICovCTB4MWM5MjljNjIsCi0JLyogWEZFUl9VRE1BXzEgKi8JMHgxYzlhOWM2MiwKLQkvKiBYRkVSX1VETUFfMCAqLwkweDFjODI5YzYyLAotCi0JLyogWEZFUl9NV19ETUFfMiAqLwkweDJjODI5YzYyLAotCS8qIFhGRVJfTVdfRE1BXzEgKi8JMHgyYzgyOWM2NiwKLQkvKiBYRkVSX01XX0RNQV8wICovCTB4MmM4MjlkMmUsCi0KLQkvKiBYRkVSX1BJT180ICovCTB4MGM4MjljNjIsCi0JLyogWEZFUl9QSU9fMyAqLwkweDBjODI5Yzg0LAotCS8qIFhGRVJfUElPXzIgKi8JMHgwYzgyOWNhNiwKLQkvKiBYRkVSX1BJT18xICovCTB4MGQwMjlkMjYsCi0JLyogWEZFUl9QSU9fMCAqLwkweDBkMDI5ZDVlCi19OwotI2Vsc2UKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbmV3IHRpbWluZyB0YWJsZXMgd2l0aCBQSU8gbW9kZSBkYXRhL3Rhc2tmaWxlIHRyYW5zZmVyCiAgKiBvdmVyY2xvY2tpbmcgZml4ZWQuLi4KQEAgLTQyNCwxNiArMzYyLDEzIEBACiAJLyogWEZFUl9QSU9fMSAqLwkweDBkMDJmZjI2LAogCS8qIFhGRVJfUElPXzAgKi8JMHgwZDQyZmY3ZgogfTsKLSNlbmRpZgogCi0jZGVmaW5lIEhQVDM2Nl9ERUJVR19EUklWRV9JTkZPCQkwCiAjZGVmaW5lIEhQVDM3MV9BTExPV19BVEExMzNfNgkJMQogI2RlZmluZSBIUFQzMDJfQUxMT1dfQVRBMTMzXzYJCTEKICNkZWZpbmUgSFBUMzcyX0FMTE9XX0FUQTEzM182CQkxCiAjZGVmaW5lIEhQVDM3MF9BTExPV19BVEExMDBfNQkJMAogI2RlZmluZSBIUFQzNjZfQUxMT1dfQVRBNjZfNAkJMQogI2RlZmluZSBIUFQzNjZfQUxMT1dfQVRBNjZfMwkJMQotI2RlZmluZSBIUFQzNjZfTUFYX0RFVlMJCQk4CiAKIC8qIFN1cHBvcnRlZCBBVEEgY2xvY2sgZnJlcXVlbmNpZXMgKi8KIGVudW0gYXRhX2Nsb2NrIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IDU4ZmM5MjAuLjZhMGU2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtMjIxLDYgKzIyMSw4IEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgoaWRldGFwZV9yZWZfbXV0ZXgpOwogCitzdGF0aWMgREVGSU5FX01VVEVYKGlkZXRhcGVfY2hyZGV2X211dGV4KTsKKwogc3RhdGljIHN0cnVjdCBjbGFzcyAqaWRldGFwZV9zeXNmc19jbGFzczsKIAogc3RhdGljIHZvaWQgaWRlX3RhcGVfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICopOwpAQCAtMTQ1NywxMCArMTQ1OSwxMSBAQAogCWlmIChpID49IE1BWF9IV0lGUyAqIE1BWF9EUklWRVMpCiAJCXJldHVybiAtRU5YSU87CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJmlkZXRhcGVfY2hyZGV2X211dGV4KTsKKwogCXRhcGUgPSBpZGVfdGFwZV9nZXQoTlVMTCwgdHJ1ZSwgaSk7CiAJaWYgKCF0YXBlKSB7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwkJbXV0ZXhfdW5sb2NrKCZpZGV0YXBlX2NocmRldl9tdXRleCk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCkBAIC0xNTE5LDEyICsxNTIyLDE1IEBACiAJCQkJdGFwZS0+ZG9vcl9sb2NrZWQgPSBET09SX0xPQ0tFRDsKIAkJfQogCX0KLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZpZGV0YXBlX2NocmRldl9tdXRleCk7CisKIAlyZXR1cm4gMDsKIAogb3V0X3B1dF90YXBlOgogCWlkZV90YXBlX3B1dCh0YXBlKTsKLQl1bmxvY2tfa2VybmVsKCk7CisKKwltdXRleF91bmxvY2soJmlkZXRhcGVfY2hyZGV2X211dGV4KTsKKwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE1NTEsNyArMTU1Nyw4IEBACiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdGFwZS0+ZHJpdmU7CiAJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmaWRldGFwZV9jaHJkZXZfbXV0ZXgpOworCiAJdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAogCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiZW50ZXIiKTsKQEAgLTE1NzUsNyArMTU4Miw5IEBACiAJfQogCWNsZWFyX2JpdChpbG9nMihJREVfQUZMQUdfQlVTWSksICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwogCWlkZV90YXBlX3B1dCh0YXBlKTsKLQl1bmxvY2tfa2VybmVsKCk7CisKKwltdXRleF91bmxvY2soJmlkZXRhcGVfY2hyZGV2X211dGV4KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGVfcGxhdGZvcm0uYyBiL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jCmluZGV4IGI1NzlmYmUuLjQyOTY1YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jCkBAIC04MSwxNCArODEsMTQgQEAKIAogCWlmIChtbWlvKSB7CiAJCWJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwKLQkJCXJlc19iYXNlLT5zdGFydCwgcmVzX2Jhc2UtPmVuZCAtIHJlc19iYXNlLT5zdGFydCArIDEpOworCQkJcmVzX2Jhc2UtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlc19iYXNlKSk7CiAJCWFsdF9iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsCi0JCQlyZXNfYWx0LT5zdGFydCwgcmVzX2FsdC0+ZW5kIC0gcmVzX2FsdC0+c3RhcnQgKyAxKTsKKwkJCXJlc19hbHQtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlc19hbHQpKTsKIAl9IGVsc2UgewogCQliYXNlID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsCi0JCQlyZXNfYmFzZS0+c3RhcnQsIHJlc19iYXNlLT5lbmQgLSByZXNfYmFzZS0+c3RhcnQgKyAxKTsKKwkJCXJlc19iYXNlLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXNfYmFzZSkpOwogCQlhbHRfYmFzZSA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LAotCQkJcmVzX2FsdC0+c3RhcnQsIHJlc19hbHQtPmVuZCAtIHJlc19hbHQtPnN0YXJ0ICsgMSk7CisJCQlyZXNfYWx0LT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXNfYWx0KSk7CiAJfQogCiAJbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9vbGQuYyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCmluZGV4IGNiODEyZjMuLjM1MTYxZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCisrKyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCkBAIC0yMSw4ICsyMSw2IEBACiAKICNkZWZpbmUgRFJWX05BTUUgInBkYzIwMnh4X29sZCIKIAotI2RlZmluZSBQREMyMDJYWF9ERUJVR19EUklWRV9JTkZPCTAKLQogc3RhdGljIHZvaWQgcGRjX29sZF9kaXNhYmxlXzY2TUh6X2Nsb2NrKGlkZV9od2lmX3QgKik7CiAKIHN0YXRpYyB2b2lkIHBkYzIwMnh4X3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCkBAIC0zNCwxMSArMzIsNiBAQAogCXU4CQkJQVAgPSAwLCBCUCA9IDAsIENQID0gMDsKIAl1OAkJCVRBID0gMCwgVEIgPSAwLCBUQyA9IDA7CiAKLSNpZiBQREMyMDJYWF9ERUJVR19EUklWRV9JTkZPCi0JdTMyCQkJZHJpdmVfY29uZiA9IDA7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgZHJpdmVfcGNpLCAmZHJpdmVfY29uZik7Ci0jZW5kaWYKLQogCS8qCiAJICogVE9ETzogZG8gdGhpcyBvbmNlIHBlciBjaGFubmVsCiAJICovCkBAIC04OSwxNCArODIsNiBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBkcml2ZV9wY2kgKyAxLCBCUCB8IFRCKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgZHJpdmVfcGNpICsgMiwgQ1AgfCBUQyk7CiAJfQotCi0jaWYgUERDMjAyWFhfREVCVUdfRFJJVkVfSU5GTwotCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgZHJpdmUlZCAweCUwOHggIiwKLQkJZHJpdmUtPm5hbWUsIGlkZV94ZmVyX3ZlcmJvc2Uoc3BlZWQpLAotCQlkcml2ZS0+ZG4sIGRyaXZlX2NvbmYpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGRyaXZlX3BjaSwgJmRyaXZlX2NvbmYpOwotCXByaW50aygiMHglMDh4XG4iLCBkcml2ZV9jb25mKTsKLSNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBwZGMyMDJ4eF9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zaXM1NTEzLmMgYi9kcml2ZXJzL2lkZS9zaXM1NTEzLmMKaW5kZXggM2I4OGViYS4uNDY4NzA2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2lzNTUxMy5jCisrKyBiL2RyaXZlcnMvaWRlL3NpczU1MTMuYwpAQCAtNjMyLDEyICs2MzIsMyBAQAogTU9EVUxFX0FVVEhPUigiTGlvbmVsIEJvdXRvbiwgTCBDIENoYW5nLCBBbmRyZSBIZWRyaWNrLCBWb2p0ZWNoIFBhdmxpayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgU0lTIElERSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKgotICogVE9ETzoKLSAqCS0gQ0xFQU5VUAotICoJLSBNb3JlIGNoZWNrcyBpbiB0aGUgY29uZmlnIHJlZ2lzdGVycyAoZm9yY2UgdmFsdWVzIGluc3RlYWQgb2YKLSAqCSAgcmVseWluZyBvbiB0aGUgQklPUyBzZXR0aW5nIHRoZW0gY29ycmVjdGx5KS4KLSAqCS0gRnVydGhlciBvcHRpbWlzYXRpb25zID8KLSAqCSAgLiBmb3IgZXhhbXBsZSBBVEE2NisgcmVncyAweDQ4ICYgMHg0QQotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zbDgyYzEwNS5jIGIvZHJpdmVycy9pZGUvc2w4MmMxMDUuYwppbmRleCBkNjk4ZGE0Li4zYzJiYmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zbDgyYzEwNS5jCisrKyBiL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMKQEAgLTI0LDEzICsyNCw2IEBACiAKICNkZWZpbmUgRFJWX05BTUUgInNsODJjMTA1IgogCi0jdW5kZWYgREVCVUcKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyhhcmcpIHByaW50ayBhcmcKLSNlbHNlCi0jZGVmaW5lIERCRyhmbXQsLi4uKQotI2VuZGlmCiAvKgogICogU0w4MkMxMDUgUENJIGNvbmZpZyByZWdpc3RlciAweDQwIGJpdHMuCiAgKi8KQEAgLTEwNCw5ICs5Nyw2IEBACiAJdW5zaWduZWQgbG9uZyB0aW1pbmdzID0gKHVuc2lnbmVkIGxvbmcpaWRlX2dldF9kcml2ZWRhdGEoZHJpdmUpOwogCXUxNiBkcnZfY3RybDsKIAotIAlEQkcoKCJzbDgyYzEwNV90dW5lX2NoaXBzZXQoZHJpdmU6JXMsIHNwZWVkOiVzKVxuIiwKLQkgICAgIGRyaXZlLT5uYW1lLCBpZGVfeGZlcl92ZXJib3NlKHNwZWVkKSkpOwotCiAJZHJ2X2N0cmwgPSBtd2RtYV90aW1pbmdzW3NwZWVkIC0gWEZFUl9NV19ETUFfMF07CiAKIAkvKgpAQCAtMTk2LDggKzE4Niw2IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgcmVnIAkJPSAweDQ0ICsgZHJpdmUtPmRuICogNDsKIAotCURCRygoIiVzKGRyaXZlOiVzKVxuIiwgX19mdW5jX18sIGRyaXZlLT5uYW1lKSk7Ci0KIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCByZWcsCiAJCQkgICAgICAodW5zaWduZWQgbG9uZylpZGVfZ2V0X2RyaXZlZGF0YShkcml2ZSkgPj4gMTYpOwogCkBAIC0yMDksOCArMTk3LDYgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihkcml2ZS0+aHdpZi0+ZGV2KTsKIAotCURCRygoInNsODJjMTA1X2RtYV9jbGVhcihkcml2ZTolcylcbiIsIGRyaXZlLT5uYW1lKSk7Ci0KIAlzbDgyYzEwNV9yZXNldF9ob3N0KGRldik7CiB9CiAKQEAgLTIxOCwxMSArMjA0LDcgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihkcml2ZS0+aHdpZi0+ZGV2KTsKIAlpbnQgcmVnIAkJPSAweDQ0ICsgZHJpdmUtPmRuICogNDsKLQlpbnQgcmV0OwotCi0JREJHKCgiJXMoZHJpdmU6JXMpXG4iLCBfX2Z1bmNfXywgZHJpdmUtPm5hbWUpKTsKLQotCXJldCA9IGlkZV9kbWFfZW5kKGRyaXZlKTsKKwlpbnQgcmV0CQkJPSBpZGVfZG1hX2VuZChkcml2ZSk7CiAKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCByZWcsCiAJCQkgICAgICAodW5zaWduZWQgbG9uZylpZGVfZ2V0X2RyaXZlZGF0YShkcml2ZSkpOwpAQCAtMjM5LDggKzIyMSw2IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoZHJpdmUtPmh3aWYtPmRldik7CiAJdTMyIHZhbDsKIAotCURCRygoInNsODJjMTA1X3Jlc2V0cHJvYyhkcml2ZTolcylcbiIsIGRyaXZlLT5uYW1lKSk7Ci0KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAmdmFsKTsKIAl2YWwgfD0gKENUUkxfUDFGMTYgfCBDVFJMX1AwRjE2KTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgdmFsKTsKQEAgLTI5MSw4ICsyNzEsNiBAQAogewogCXUzMiB2YWw7CiAKLQlEQkcoKCJpbml0X2NoaXBzZXRfc2w4MmMxMDUoKVxuIikpOwotCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJnZhbCk7CiAJdmFsIHw9IENUUkxfUDBFTiB8IENUUkxfUDBGMTYgfCBDVFJMX1AxRjE2OwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQwLCB2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2xjOTBlNjYuYyBiL2RyaXZlcnMvaWRlL3NsYzkwZTY2LmMKaW5kZXggOWFlYzc4ZC4uMWNjZmI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2xjOTBlNjYuYworKysgYi9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jCkBAIC05MSw4ICs5MSw3IEBACiAKIAkJaWYgKCEocmVnNDggJiB1X2ZsYWcpKQogCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0OCwgcmVnNDh8dV9mbGFnKTsKLQkJLyogRklYTUU6IChyZWc0YSAmIGFfc3BlZWQpID8gKi8KLQkJaWYgKChyZWc0YSAmIHVfc3BlZWQpICE9IHVfc3BlZWQpIHsKKwkJaWYgKChyZWc0YSAmIGFfc3BlZWQpICE9IHVfc3BlZWQpIHsKIAkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NGEsIHJlZzRhICYgfmFfc3BlZWQpOwogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAmcmVnNGEpOwogCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgcmVnNGF8dV9zcGVlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS90eDQ5MzhpZGUuYyBiL2RyaXZlcnMvaWRlL3R4NDkzOGlkZS5jCmluZGV4IGVhODlmZGQuLmZkNTljMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3R4NDkzOGlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL3R4NDkzOGlkZS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCi0JCQkJICAgICByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLCAidHg0OTM4aWRlIikpCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksICJ0eDQ5MzhpZGUiKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAltYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCiAJCQkJCSAgICAgIDggPDwgcGRhdGEtPmlvcG9ydF9zaGlmdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYwppbmRleCAyY2QwMGI1Li45ZmQ0YTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgMCAtIG5vIGRlYnVnZ2luZyBtZXNzYWdlcwogICAgMSAtIHNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzLCBidXQgbm9uZSBkdXJpbmcgRE1BIGZyYW1lIHRyYW5zbWlzc2lvbgogICAgMiAtIGxvdHMgb2YgbWVzc2FnZXMsIGluY2x1ZGluZyBkdXJpbmcgRE1BIGZyYW1lIHRyYW5zbWlzc2lvbgotICAgICAgICh3aWxsIGNhdXNlIHVuZGVmbG93cyBpZiB5b3VyIG1hY2hpbmUgaXMgdG9vIHNsb3chKQorICAgICAgICh3aWxsIGNhdXNlIHVuZGVyZmxvd3MgaWYgeW91ciBtYWNoaW5lIGlzIHRvbyBzbG93ISkKICovCiAKICNkZWZpbmUgRFYxMzk0X0RFQlVHX0xFVkVMIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9jeGlvX2hhbC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2N4aW9faGFsLmMKaW5kZXggNzJlZDMzOS4uMDY3N2ZjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2N4aW9faGFsLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2N4aW9faGFsLmMKQEAgLTU4OSw3ICs1ODksNyBAQAogCiAvKiB3cml0ZSBsZW4gYnl0ZXMgb2YgZGF0YSBpbnRvIGFkZHIgKDMyQiBhbGlnbmVkIGFkZHJlc3MpCiAgKiBJZiBkYXRhIGlzIE5VTEwsIGNsZWFyIGxlbiBieXRlIG9mIG1lbW9yeSB0byB6ZXJvLgotICogY2FsbGVyIGFxdWlyZXMgdGhlIGN0cmxfcXAgbG9jayBiZWZvcmUgdGhlIGNhbGwKKyAqIGNhbGxlciBhY3F1aXJlcyB0aGUgY3RybF9xcCBsb2NrIGJlZm9yZSB0aGUgY2FsbAogICovCiBzdGF0aWMgaW50IGN4aW9faGFsX2N0cmxfcXBfd3JpdGVfbWVtKHN0cnVjdCBjeGlvX3JkZXYgKnJkZXZfcCwgdTMyIGFkZHIsCiAJCQkJICAgICAgdTMyIGxlbiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKaW5kZXggNDBkYmU1NC4uNzM5MzNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKQEAgLTE4MjEsNyArMTgyMSw2IEBACiBzdGF0aWMgaW50IGlwYXRoX29wZW4oc3RydWN0IGlub2RlICppbiwgc3RydWN0IGZpbGUgKmZwKQogewogCS8qIFRoZSByZWFsIHdvcmsgaXMgcGVyZm9ybWVkIGxhdGVyIGluIGlwYXRoX2Fzc2lnbl9wb3J0KCkgKi8KLQljeWNsZV9rZXJuZWxfbG9jaygpOwogCWZwLT5wcml2YXRlX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBhdGhfZmlsZWRhdGEpLCBHRlBfS0VSTkVMKTsKIAlyZXR1cm4gZnAtPnByaXZhdGVfZGF0YSA/IDAgOiAtRU5PTUVNOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMTAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTEwLmMKaW5kZXggNGJkMzljOC4uMzdkMTJlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMTAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjExMC5jCkBAIC0zODEsNyArMzgxLDcgQEAKICNkZWZpbmUgSVBBVEhfR1BJT19TQ0wgXAogCSgxVUxMIDw8IChfSVBBVEhfR1BJT19TQ0xfTlVNK0lORklOSVBBVEhfRVhUQ19HUElPT0VfU0hJRlQpKQogCi0vKiBrZWVwIHRoZSBjb2RlIGJlbG93IHNvbWV3aGF0IG1vcmUgcmVhZG9uYWJsZTsgbm90IHVzZWQgZWxzZXdoZXJlICovCisvKiBrZWVwIHRoZSBjb2RlIGJlbG93IHNvbWV3aGF0IG1vcmUgcmVhZGFibGU7IG5vdCB1c2VkIGVsc2V3aGVyZSAqLwogI2RlZmluZSBfSVBBVEhfSFRMSU5LMF9DUkNCSVRTIChpbmZpbmlwYXRoX2h3ZV9odGNsbmthYnl0ZTBjcmNlcnIgfAlcCiAJCQkJaW5maW5pcGF0aF9od2VfaHRjbG5rYWJ5dGUxY3JjZXJyKQogI2RlZmluZSBfSVBBVEhfSFRMSU5LMV9DUkNCSVRTIChpbmZpbmlwYXRoX2h3ZV9odGNsbmtiYnl0ZTBjcmNlcnIgfAlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc2Q3MjIwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc2Q3MjIwLmMKaW5kZXggYWE0N2ViNS4uMmE2OGQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3NkNzIyMC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zZDcyMjAuYwpAQCAtNjE0LDcgKzYxNCw3IEBACiAgKiBAd2Q6IFdyaXRlIERhdGEgLSB2YWx1ZSB0byBzZXQgaW4gcmVnaXN0ZXIKICAqIEBtYXNrOiBvbmVzIHdoZXJlIGRhdGEgc2hvdWxkIGJlIHNwbGljZWQgaW50byByZWcuCiAgKgotICogQmFzaWMgcmVnaXN0ZXIgcmVhZC9tb2RpZnkvd3JpdGUsIHdpdGggdW4tbmVlZGVkIGFjZXNzZXMgZWxpZGVkLiBUaGF0IGlzLAorICogQmFzaWMgcmVnaXN0ZXIgcmVhZC9tb2RpZnkvd3JpdGUsIHdpdGggdW4tbmVlZGVkIGFjY2Vzc2VzIGVsaWRlZC4gVGhhdCBpcywKICAqIGEgbWFzayBvZiB6ZXJvIHdpbGwgcHJldmVudCB3cml0ZSwgd2hpbGUgYSBtYXNrIG9mIDB4RkYgd2lsbCBwcmV2ZW50IHJlYWQuCiAgKiByZXR1cm5zIGN1cnJlbnQgKHByZXN1bWVkLCBpZiBhIHdyaXRlIHdhcyBkb25lKSBjb250ZW50cyBvZiBzZWxlY3RlZAogICogcmVnaXN0ZXIsIG9yIDwwIGlmIGVycm9ycy4KQEAgLTk4OSw3ICs5ODksNyBAQAogCS8qIFNldCBERkVMVEhGRFIvSERSIHRocmVzaG9sZHMgKi8KIAlSWEVRX1ZBTCg3LCA4LCAgICAwLCAwLCAwLCAwKSwgLyogRkRSICovCiAJUlhFUV9WQUwoNywgMHgyMSwgMCwgMCwgMCwgMCksIC8qIEhEUiAqLwotCS8qIFNldCBUTFRIRkRSL0hEUiB0aGVzaG9sZCAqLworCS8qIFNldCBUTFRIRkRSL0hEUiB0aHJlc2hvbGQgKi8KIAlSWEVRX1ZBTCg3LCA5LCAgICAyLCAyLCAyLCAyKSwgLyogRkRSICovCiAJUlhFUV9WQUwoNywgMHgyMywgMiwgMiwgMiwgMiksIC8qIEhEUiAqLwogCS8qIFNldCBQcmVhbXAgc2V0dGluZyAyIChaRlIvWkNOVCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCmluZGV4IDIxOWIxMDMuLjI1NmEwMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJICogYW55bW9yZSwgc28gd2UgZG8gdGhpcyBvbmx5IGlmIHNlbGVjdGl2ZSBzaWduYWxpbmcgaXMgb2ZmLgogCSAqCiAJICogRnVydGhlciwgb24gMzItYml0IHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlIHZtYXAoKSB0byBtYWtlCi0JICogdGhlIFFQIGJ1ZmZlciB2aXJ0dWFsbHkgY29udGlnaW91cy4gIFRodXMgd2UgaGF2ZSB0byB1c2UKKwkgKiB0aGUgUVAgYnVmZmVyIHZpcnR1YWxseSBjb250aWd1b3VzLiAgVGh1cyB3ZSBoYXZlIHRvIHVzZQogCSAqIGNvbnN0YW50LXNpemVkIFdScyB0byBtYWtlIHN1cmUgYSBXUiBpcyBhbHdheXMgZnVsbHkgd2l0aGluCiAJICogYSBzaW5nbGUgcGFnZS1zaXplZCBjaHVuay4KIAkgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKaW5kZXggYWRkOTE4OC4uNWY3YTZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCkBAIC02MjUsNiArNjI1LDcgQEAKIAkJCQkgIElTQ1NJX1VTRVJOQU1FIHwgSVNDU0lfUEFTU1dPUkQgfAogCQkJCSAgSVNDU0lfVVNFUk5BTUVfSU4gfCBJU0NTSV9QQVNTV09SRF9JTiB8CiAJCQkJICBJU0NTSV9GQVNUX0FCT1JUIHwgSVNDU0lfQUJPUlRfVE1PIHwKKwkJCQkgIElTQ1NJX0xVX1JFU0VUX1RNTyB8IElTQ1NJX1RHVF9SRVNFVF9UTU8gfAogCQkJCSAgSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8CiAJCQkJICBJU0NTSV9JRkFDRV9OQU1FIHwgSVNDU0lfSU5JVElBVE9SX05BTUUsCiAJLmhvc3RfcGFyYW1fbWFzawk9IElTQ1NJX0hPU1RfSFdBRERSRVNTIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl92ZXJicy5jCmluZGV4IGVhOWUxNTUuLjg1NzlmMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfdmVyYnMuYwpAQCAtNDk5LDcgKzQ5OSw3IEBACiAKICAvKioKICAqIHN0YXJ0cyB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIHRvIHRoZSB0YXJnZXQKLSAqIHNsZWVwcyB1bnRpbGwgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgb3IgcmVqZWN0ZWQKKyAqIHNsZWVwcyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBvciByZWplY3RlZAogICovCiBpbnQgaXNlcl9jb25uZWN0KHN0cnVjdCBpc2VyX2Nvbm4gICAqaWJfY29ubiwKIAkJIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3JjX2FkZHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L0tjb25maWcgYi9kcml2ZXJzL2lucHV0L0tjb25maWcKaW5kZXggY2Q1MGMwMC4uMDdjMmNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvS2NvbmZpZwpAQCAtOCw3ICs4LDcgQEAKIGNvbmZpZyBJTlBVVAogCXRyaXN0YXRlICJHZW5lcmljIGlucHV0IGxheWVyIChuZWVkZWQgZm9yIGtleWJvYXJkLCBtb3VzZSwgLi4uKSIgaWYgRU1CRURERUQKIAlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCisJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbnkgaW5wdXQgZGV2aWNlIChtb3VzZSwga2V5Ym9hcmQsIHRhYmxldCwKIAkgIGpveXN0aWNrLCBzdGVlcmluZyB3aGVlbCAuLi4pIGNvbm5lY3RlZCB0byB5b3VyIHN5c3RlbSBhbmQgd2FudAogCSAgaXQgdG8gYmUgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucy4gVGhpcyBpbmNsdWRlcyBzdGFuZGFyZCBQUy8yCkBAIC0yNyw4ICsyNyw3IEBACiAKIGNvbmZpZyBJTlBVVF9GRl9NRU1MRVNTCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIG1lbW9yeWxlc3MgZm9yY2UtZmVlZGJhY2sgZGV2aWNlcyIKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCisJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBtZW1vcnlsZXNzIGZvcmNlLWZlZWRiYWNrIGlucHV0IGRldmljZQogCSAgc3VjaCBhcyBMb2dpdGVjaCBXaW5nTWFuIEZvcmNlIDNELCBUaHJ1c3RNYXN0ZXIgRmlyZVN0b3JtIER1YWwKIAkgIFBvd2VyIDIsIG9yIHNpbWlsYXIuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBlbmFibGUgaGFyZHdhcmUtc3BlY2lmaWMKQEAgLTUyLDEyICs1MSwyNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaW5wdXQtcG9sbGRldi4KIAorY29uZmlnIElOUFVUX1NQQVJTRUtNQVAKKwl0cmlzdGF0ZSAiU3BhcnNlIGtleW1hcCBzdXBwb3J0IGxpYnJhcnkiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIGEgZHJpdmVyIGZvciBhbiBpbnB1dAorCSAgZGV2aWNlIHRoYXQgdXNlcyBzcGFyc2Uga2V5bWFwLiBUaGlzIG9wdGlvbiBpcyBvbmx5CisJICB1c2VmdWwgZm9yIG91dC1vZi10cmVlIGRyaXZlcnMgc2luY2UgaW4tdHJlZSBkcml2ZXJzCisJICBzZWxlY3QgaXQgYXV0b21hdGljYWxseS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3BhcnNlLWtleW1hcC4KKwogY29tbWVudCAiVXNlcmxhbmQgaW50ZXJmYWNlcyIKIAogY29uZmlnIElOUFVUX01PVVNFREVWCiAJdHJpc3RhdGUgIk1vdXNlIGludGVyZmFjZSIgaWYgRU1CRURERUQKIAlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCisJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIG1vdXNlIHRvIGJlIGFjY2Vzc2libGUgYXMgY2hhciBkZXZpY2VzCiAJICAxMzozMisgLSAvZGV2L2lucHV0L21vdXNlWCBhbmQgMTM6NjMgLSAvZGV2L2lucHV0L21pY2UgYXMgYW4KIAkgIGVtdWxhdGVkIEludGVsbGlNb3VzZSBFeHBsb3JlciBQUy8yIG1vdXNlLiBUaGF0IHdheSwgYWxsIHVzZXIgc3BhY2UKQEAgLTczLDcgKzg1LDcgQEAKIAlib29sICJQcm92aWRlIGxlZ2FjeSAvZGV2L3BzYXV4IGRldmljZSIKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIElOUFVUX01PVVNFREVWCi0JLS0taGVscC0tLQorCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgeW91ciBtb3VzZSBhbHNvIGJlIGFjY2Vzc2libGUgYXMgY2hhciBkZXZpY2UKIAkgIDEwOjEgLSAvZGV2L3BzYXV4LiBUaGUgZGF0YSBhdmFpbGFibGUgdGhyb3VnaCAvZGV2L3BzYXV4IGlzIGV4YWN0bHkKIAkgIHRoZSBzYW1lIGFzIHRoZSBkYXRhIGZyb20gL2Rldi9pbnB1dC9taWNlLgpAQCAtMTAzLDcgKzExNSw3IEBACiAKIGNvbmZpZyBJTlBVVF9KT1lERVYKIAl0cmlzdGF0ZSAiSm95c3RpY2sgaW50ZXJmYWNlIgotCS0tLWhlbHAtLS0KKwloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHlvdXIgam95c3RpY2sgb3IgZ2FtZXBhZCB0byBiZQogCSAgYWNjZXNzaWJsZSBhcyBjaGFyIGRldmljZSAxMzowKyAtIC9kZXYvaW5wdXQvanNYIGRldmljZS4KIApAQCAtMTI1LDcgKzEzNyw3IEBACiAKIGNvbmZpZyBJTlBVVF9FVkJVRwogCXRyaXN0YXRlICJFdmVudCBkZWJ1Z2dpbmciCi0JLS0taGVscC0tLQorCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBwcm9ibGVtIHdpdGggdGhlIGlucHV0IHN1YnN5c3RlbSBhbmQKIAkgIHdhbnQgYWxsIGV2ZW50cyAoa2V5cHJlc3NlcywgbW91c2UgbW92ZW1lbnRzKSwgdG8gYmUgb3V0cHV0IHRvCiAJICB0aGUgc3lzdGVtIGxvZy4gV2hpbGUgdGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZywgaXQncyBhbHNvCkBAIC0xNDAsNyArMTUyLDcgQEAKIGNvbmZpZyBJTlBVVF9BUE1QT1dFUgogCXRyaXN0YXRlICJJbnB1dCBQb3dlciBFdmVudCAtPiBBUE0gQnJpZGdlIiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gSU5QVVQgJiYgQVBNX0VNVUxBVElPTgotCS0tLWhlbHAtLS0KKwloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1c3BlbmQga2V5IGV2ZW50cyB0byB0cmlnZ2VyIGEgdXNlcgogCSAgcmVxdWVzdGVkIHN1c3BlbmQgdGhyb3VnaCBBUE0uIFRoaXMgaXMgdXNlZnVsIG9uIGVtYmVkZGVkCiAJICBzeXN0ZW1zIHdoZXJlIHN1Y2ggYmVoYXZpb3VyIGlzIGRlc2lyZWQgd2l0aG91dCB1c2Vyc3BhY2UKQEAgLTE1Myw2ICsxNjUsNyBAQAogCXRyaXN0YXRlICJYZW4gdmlydHVhbCBrZXlib2FyZCBhbmQgbW91c2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFhFTl9GQkRFVl9GUk9OVEVORAogCWRlZmF1bHQgeQorCXNlbGVjdCBYRU5fWEVOQlVTX0ZST05URU5ECiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyB0aGUgZnJvbnQtZW5kIG9mIHRoZSBYZW4gdmlydHVhbAogCSAga2V5Ym9hcmQgYW5kIG1vdXNlIGRldmljZSBkcml2ZXIuICBJdCBjb21tdW5pY2F0ZXMgd2l0aCBhIGJhY2stZW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9NYWtlZmlsZQppbmRleCA0YzljNzQ1Li43YWQyMTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUKQEAgLTksNiArOSw3IEBACiAKIG9iai0kKENPTkZJR19JTlBVVF9GRl9NRU1MRVNTKQkrPSBmZi1tZW1sZXNzLm8KIG9iai0kKENPTkZJR19JTlBVVF9QT0xMREVWKQkrPSBpbnB1dC1wb2xsZGV2Lm8KK29iai0kKENPTkZJR19JTlBVVF9TUEFSU0VLTUFQKQkrPSBzcGFyc2Uta2V5bWFwLm8KIAogb2JqLSQoQ09ORklHX0lOUFVUX01PVVNFREVWKQkrPSBtb3VzZWRldi5vCiBvYmotJChDT05GSUdfSU5QVVRfSk9ZREVWKQkrPSBqb3lkZXYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9mZi1jb3JlLmMgYi9kcml2ZXJzL2lucHV0L2ZmLWNvcmUuYwppbmRleCAzOGRmODFmLi5iMmYwN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2ZmLWNvcmUuYworKysgYi9kcml2ZXJzL2lucHV0L2ZmLWNvcmUuYwpAQCAtMzUzLDcgKzM1Myw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChpbnB1dF9mZl9jcmVhdGUpOwogCiAvKioKLSAqIGlucHV0X2ZmX2ZyZWUoKSAtIGZyZWVzIGZvcmNlIGZlZWRiYWNrIHBvcnRpb24gb2YgaW5wdXQgZGV2aWNlCisgKiBpbnB1dF9mZl9kZXN0cm95KCkgLSBmcmVlcyBmb3JjZSBmZWVkYmFjayBwb3J0aW9uIG9mIGlucHV0IGRldmljZQogICogQGRldjogaW5wdXQgZGV2aWNlIHN1cHBvcnRpbmcgZm9yY2UgZmVlZGJhY2sKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIGluIGVycm9yIHBhdGggYXMgaW5wdXQgY29yZSB3aWxsCkBAIC0zNjksNiArMzY5LDcgQEAKIAkJaWYgKGZmLT5kZXN0cm95KQogCQkJZmYtPmRlc3Ryb3koZmYpOwogCQlrZnJlZShmZi0+cHJpdmF0ZSk7CisJCWtmcmVlKGZmLT5lZmZlY3RzKTsKIAkJa2ZyZWUoZmYpOwogCQlkZXYtPmZmID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LXBvbGxkZXYuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCmluZGV4IDBkM2NlN2EuLmFhNjcxM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCkBAIC01NiwxNCArNTYsMTAgQEAKIAltdXRleF91bmxvY2soJnBvbGxkZXZfbXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBpbnB1dF9wb2xsZWRfZGV2aWNlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgaW5wdXRfcG9sbGRldl9xdWV1ZV93b3JrKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmRldiA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaW5wdXRfcG9sbGVkX2Rldiwgd29yay53b3JrKTsKIAl1bnNpZ25lZCBsb25nIGRlbGF5OwogCi0JZGV2LT5wb2xsKGRldik7Ci0KIAlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoZGV2LT5wb2xsX2ludGVydmFsKTsKIAlpZiAoZGVsYXkgPj0gSFopCiAJCWRlbGF5ID0gcm91bmRfamlmZmllc19yZWxhdGl2ZShkZWxheSk7CkBAIC03MSw2ICs2NywxNSBAQAogCXF1ZXVlX2RlbGF5ZWRfd29yayhwb2xsZGV2X3dxLCAmZGV2LT53b3JrLCBkZWxheSk7CiB9CiAKK3N0YXRpYyB2b2lkIGlucHV0X3BvbGxlZF9kZXZpY2Vfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmRldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaW5wdXRfcG9sbGVkX2Rldiwgd29yay53b3JrKTsKKworCWRldi0+cG9sbChkZXYpOworCWlucHV0X3BvbGxkZXZfcXVldWVfd29yayhkZXYpOworfQorCiBzdGF0aWMgaW50IGlucHV0X29wZW5fcG9sbGVkX2RldmljZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKIHsKIAlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOwpAQCAtODAsMTEgKzg1LDEyIEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoZGV2LT5mbHVzaCkKLQkJZGV2LT5mbHVzaChkZXYpOworCWlmIChkZXYtPm9wZW4pCisJCWRldi0+b3BlbihkZXYpOwogCi0JcXVldWVfZGVsYXllZF93b3JrKHBvbGxkZXZfd3EsICZkZXYtPndvcmssCi0JCQkgICBtc2Vjc190b19qaWZmaWVzKGRldi0+cG9sbF9pbnRlcnZhbCkpOworCS8qIE9ubHkgc3RhcnQgcG9sbGluZyBpZiBwb2xsaW5nIGlzIGVuYWJsZWQgKi8KKwlpZiAoZGV2LT5wb2xsX2ludGVydmFsID4gMCkKKwkJcXVldWVfZGVsYXllZF93b3JrKHBvbGxkZXZfd3EsICZkZXYtPndvcmssIDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NSw4ICsxMDEsODggQEAKIAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGV2LT53b3JrKTsKIAlpbnB1dF9wb2xsZGV2X3N0b3Bfd29ya3F1ZXVlKCk7CisKKwlpZiAoZGV2LT5jbG9zZSkKKwkJZGV2LT5jbG9zZShkZXYpOwogfQogCisvKiBTWVNGUyBpbnRlcmZhY2UgKi8KKworc3RhdGljIHNzaXplX3QgaW5wdXRfcG9sbGRldl9nZXRfcG9sbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqcG9sbGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBvbGxkZXYtPnBvbGxfaW50ZXJ2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBpbnB1dF9wb2xsZGV2X3NldF9wb2xsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqcG9sbGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gcG9sbGRldi0+aW5wdXQ7CisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZpbnRlcnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGludGVydmFsIDwgcG9sbGRldi0+cG9sbF9pbnRlcnZhbF9taW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGludGVydmFsID4gcG9sbGRldi0+cG9sbF9pbnRlcnZhbF9tYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaW5wdXQtPm11dGV4KTsKKworCXBvbGxkZXYtPnBvbGxfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworCWlmIChpbnB1dC0+dXNlcnMpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwb2xsZGV2LT53b3JrKTsKKwkJaWYgKHBvbGxkZXYtPnBvbGxfaW50ZXJ2YWwgPiAwKQorCQkJaW5wdXRfcG9sbGRldl9xdWV1ZV93b3JrKHBvbGxkZXYpOworCX0KKworCW11dGV4X3VubG9jaygmaW5wdXQtPm11dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHBvbGwsIFNfSVJVR08gfCBTX0lXVVNSLCBpbnB1dF9wb2xsZGV2X2dldF9wb2xsLAorCQkJCQkgICAgaW5wdXRfcG9sbGRldl9zZXRfcG9sbCk7CisKKworc3RhdGljIHNzaXplX3QgaW5wdXRfcG9sbGRldl9nZXRfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBvbGxkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwb2xsZGV2LT5wb2xsX2ludGVydmFsX21heCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihtYXgsIFNfSVJVR08sIGlucHV0X3BvbGxkZXZfZ2V0X21heCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGlucHV0X3BvbGxkZXZfZ2V0X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwb2xsZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcG9sbGRldi0+cG9sbF9pbnRlcnZhbF9taW4pOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobWluLCBTX0lSVUdPLCBpbnB1dF9wb2xsZGV2X2dldF9taW4sIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3lzZnNfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcG9sbC5hdHRyLAorCSZkZXZfYXR0cl9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbWluLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW5wdXRfcG9sbGRldl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gc3lzZnNfYXR0cnMKK307CisKIC8qKgogICogaW5wdXRfYWxsb2NhdGVfcG9sbGVkX2RldmljZSAtIGFsbG9jYXRlZCBtZW1vcnkgcG9sbGVkIGRldmljZQogICoKQEAgLTEyNiw3ICsyMTIsNyBAQAogICogQGRldjogZGV2aWNlIHRvIGZyZWUKICAqCiAgKiBUaGUgZnVuY3Rpb24gZnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBmb3IgcG9sbGluZyBkZXZpY2UgYW5kIGRyb3BzCi0gKiByZWZlcmVuY2UgdG8gdGhlIGFzc29jaWF0ZWQgaW5wdXQgZGV2aWNlIChpZiBwcmVzZW50KS4KKyAqIHJlZmVyZW5jZSB0byB0aGUgYXNzb2NpYXRlZCBpbnB1dCBkZXZpY2UuCiAgKi8KIHZvaWQgaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpkZXYpCiB7CkBAIC0xNTAsMTUgKzIzNiwzOCBAQAogaW50IGlucHV0X3JlZ2lzdGVyX3BvbGxlZF9kZXZpY2Uoc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGRldi0+aW5wdXQ7CisJaW50IGVycm9yOwogCiAJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXQsIGRldik7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmRldi0+d29yaywgaW5wdXRfcG9sbGVkX2RldmljZV93b3JrKTsKIAlpZiAoIWRldi0+cG9sbF9pbnRlcnZhbCkKIAkJZGV2LT5wb2xsX2ludGVydmFsID0gNTAwOworCWlmICghZGV2LT5wb2xsX2ludGVydmFsX21heCkKKwkJZGV2LT5wb2xsX2ludGVydmFsX21heCA9IGRldi0+cG9sbF9pbnRlcnZhbDsKIAlpbnB1dC0+b3BlbiA9IGlucHV0X29wZW5fcG9sbGVkX2RldmljZTsKIAlpbnB1dC0+Y2xvc2UgPSBpbnB1dF9jbG9zZV9wb2xsZWRfZGV2aWNlOwogCi0JcmV0dXJuIGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlucHV0LT5kZXYua29iaiwKKwkJCQkgICAmaW5wdXRfcG9sbGRldl9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChlcnJvcikgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKgorCSAqIFRha2UgZXh0cmEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGlucHV0IGRldmljZSBzbworCSAqIHRoYXQgaXQgc3Vydml2ZXMgY2FsbCB0byBpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoKQorCSAqIGFuZCBpcyBkZWxldGVkIG9ubHkgYWZ0ZXIgaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKCkKKwkgKiBoYXMgYmVlbiBpbnZva2VkLiBUaGlzIGlzIG5lZWRlZCB0byBlYXNlIHRhc2sgb2YgZnJlZWluZworCSAqIHNwYXJzZSBrZXltYXBzLgorCSAqLworCWlucHV0X2dldF9kZXZpY2UoaW5wdXQpOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGlucHV0X3JlZ2lzdGVyX3BvbGxlZF9kZXZpY2UpOwogCkBAIC0xNjksMTMgKzI3OCwxMyBAQAogICogVGhlIGZ1bmN0aW9uIHVucmVnaXN0ZXJzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBwb2xsZWQgaW5wdXQKICAqIGRldmljZSBmcm9tIGlucHV0IGxheWVyLiBQb2xsaW5nIGlzIHN0b3BwZWQgYW5kIGRldmljZSBpcwogICogcmVhZHkgdG8gYmUgZnJlZWQgd2l0aCBjYWxsIHRvIGlucHV0X2ZyZWVfcG9sbGVkX2RldmljZSgpLgotICogQ2FsbGVycyBzaG91bGQgbm90IGF0dGVtcHQgdG8gYWNjZXNzIGRldi0+aW5wdXQgcG9pbnRlcgotICogYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCiB2b2lkIGlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZShzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2KQogeworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5pbnB1dC0+ZGV2LmtvYmosCisJCQkgICAmaW5wdXRfcG9sbGRldl9hdHRyaWJ1dGVfZ3JvdXApOworCiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pbnB1dCk7Ci0JZGV2LT5pbnB1dCA9IE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKGlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwppbmRleCAyMjY2ZWNiLi41YzE2MDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCkBAIC0xNjU4LDYgKzE2NTgsMzggQEAKIEVYUE9SVF9TWU1CT0woaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGVyKTsKIAogLyoqCisgKiBpbnB1dF9oYW5kbGVyX2Zvcl9lYWNoX2hhbmRsZSAtIGhhbmRsZSBpdGVyYXRvcgorICogQGhhbmRsZXI6IGlucHV0IGhhbmRsZXIgdG8gaXRlcmF0ZQorICogQGRhdGE6IGRhdGEgZm9yIHRoZSBjYWxsYmFjaworICogQGZuOiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggaGFuZGxlCisgKgorICogSXRlcmF0ZSBvdmVyIEBidXMncyBsaXN0IG9mIGRldmljZXMsIGFuZCBjYWxsIEBmbiBmb3IgZWFjaCwgcGFzc2luZworICogaXQgQGRhdGEgYW5kIHN0b3Agd2hlbiBAZm4gcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLiBUaGUgZnVuY3Rpb24gaXMKKyAqIHVzaW5nIFJDVSB0byB0cmF2ZXJzZSB0aGUgbGlzdCBhbmQgdGhlcmVmb3JlIG1heSBiZSB1c2luZCBpbiBhdG9uaWMKKyAqIGNvbnRleHRzLiBUaGUgQGZuIGNhbGxiYWNrIGlzIGludm9rZWQgZnJvbSBSQ1UgY3JpdGljYWwgc2VjdGlvbiBhbmQKKyAqIHRodXMgbXVzdCBub3Qgc2xlZXAuCisgKi8KK2ludCBpbnB1dF9oYW5kbGVyX2Zvcl9lYWNoX2hhbmRsZShzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqaGFuZGxlciwgdm9pZCAqZGF0YSwKKwkJCQkgIGludCAoKmZuKShzdHJ1Y3QgaW5wdXRfaGFuZGxlICosIHZvaWQgKikpCit7CisJc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlOworCWludCByZXR2YWwgPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaGFuZGxlLCAmaGFuZGxlci0+aF9saXN0LCBoX25vZGUpIHsKKwkJcmV0dmFsID0gZm4oaGFuZGxlLCBkYXRhKTsKKwkJaWYgKHJldHZhbCkKKwkJCWJyZWFrOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woaW5wdXRfaGFuZGxlcl9mb3JfZWFjaF9oYW5kbGUpOworCisvKioKICAqIGlucHV0X3JlZ2lzdGVyX2hhbmRsZSAtIHJlZ2lzdGVyIGEgbmV3IGlucHV0IGhhbmRsZQogICogQGhhbmRsZTogaGFuZGxlIHRvIHJlZ2lzdGVyCiAgKgpAQCAtMTY5MCw3ICsxNzIyLDcgQEAKIAkgKiB3ZSBjYW4ndCBiZSByYWNpbmcgd2l0aCBpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZSgpCiAJICogYW5kIHNvIHNlcGFyYXRlIGxvY2sgaXMgbm90IG5lZWRlZCBoZXJlLgogCSAqLwotCWxpc3RfYWRkX3RhaWwoJmhhbmRsZS0+aF9ub2RlLCAmaGFuZGxlci0+aF9saXN0KTsKKwlsaXN0X2FkZF90YWlsX3JjdSgmaGFuZGxlLT5oX25vZGUsICZoYW5kbGVyLT5oX2xpc3QpOwogCiAJaWYgKGhhbmRsZXItPnN0YXJ0KQogCQloYW5kbGVyLT5zdGFydChoYW5kbGUpOwpAQCAtMTcxMyw3ICsxNzQ1LDcgQEAKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoYW5kbGUtPmRldjsKIAotCWxpc3RfZGVsX2luaXQoJmhhbmRsZS0+aF9ub2RlKTsKKwlsaXN0X2RlbF9yY3UoJmhhbmRsZS0+aF9ub2RlKTsKIAogCS8qCiAJICogVGFrZSBkZXYtPm11dGV4IHRvIHByZXZlbnQgcmFjZSB3aXRoIGlucHV0X3JlbGVhc2VfZGV2aWNlKCkuCkBAIC0xNzIxLDYgKzE3NTMsNyBAQAogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCWxpc3RfZGVsX3JjdSgmaGFuZGxlLT5kX25vZGUpOwogCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIEVYUE9SVF9TWU1CT0woaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay94cGFkLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYwppbmRleCA3OWUzZWRjLi40ODJjYjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYwpAQCAtMTI1LDYgKzEyNSw3IEBACiAJeyAweDA3MzgsIDB4NDU0MCwgIk1hZCBDYXR6IEJlYXQgUGFkIiwgTUFQX0RQQURfVE9fQlVUVE9OUywgWFRZUEVfWEJPWCB9LAogCXsgMHgwNzM4LCAweDQ1NTYsICJNYWQgQ2F0eiBMeW54IFdpcmVsZXNzIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCiAJeyAweDA3MzgsIDB4NDcxNiwgIk1hZCBDYXR6IFdpcmVkIFhib3ggMzYwIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YMzYwIH0sCisJeyAweDA3MzgsIDB4NDczOCwgIk1hZCBDYXR6IFdpcmVkIFhib3ggMzYwIENvbnRyb2xsZXIgKFNGSVYpIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWDM2MCB9LAogCXsgMHgwNzM4LCAweDYwNDAsICJNYWQgQ2F0eiBCZWF0IFBhZCBQcm8iLCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9YIH0sCiAJeyAweDBjMTIsIDB4ODgwMiwgIlplcm9wbHVzIFhib3ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKIAl7IDB4MGMxMiwgMHg4ODBhLCAiUGVsaWNhbiBFY2xpcHNlIFBMLTIwMjMiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCkBAIC0xNDYsNiArMTQ3LDcgQEAKIAl7IDB4MTQ2YiwgMHgwNjAxLCAiQmlnQmVuIEludGVyYWN0aXZlIFhCT1ggMzYwIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YMzYwIH0sCiAJeyAweDA0NWUsIDB4MDI4ZSwgIk1pY3Jvc29mdCBYLUJveCAzNjAgcGFkIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWDM2MCB9LAogCXsgMHgxYmFkLCAweDAwMDMsICJIYXJtb25peCBSb2NrIEJhbmQgRHJ1bWtpdCIsIE1BUF9EUEFEX1RPX0JVVFRPTlMsIFhUWVBFX1hCT1gzNjAgfSwKKwl7IDB4MGYwZCwgMHgwMDE2LCAiSG9yaSBSZWFsIEFyY2FkZSBQcm8uRVgiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YMzYwIH0sCiAJeyAweGZmZmYsIDB4ZmZmZiwgIkNoaW5lc2UtbWFkZSBYYm94IENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCiAJeyAweDAwMDAsIDB4MDAwMCwgIkdlbmVyaWMgWC1Cb3ggcGFkIiwgTUFQX0RQQURfVU5LTk9XTiwgWFRZUEVfVU5LTk9XTiB9CiB9OwpAQCAtMjEyLDYgKzIxNCw3IEBACiAJWFBBRF9YQk9YMzYwX1ZFTkRPUigweDE0MzApLAkJLyogUmVkT2N0YW5lIFgtQm94IDM2MCBjb250cm9sbGVycyAqLwogCVhQQURfWEJPWDM2MF9WRU5ET1IoMHgxNDZiKSwJCS8qIEJpZ0JlbiBJbnRlcmFjdGl2ZSBDb250cm9sbGVycyAqLwogCVhQQURfWEJPWDM2MF9WRU5ET1IoMHgxYmFkKSwJCS8qIFJvY2sgQmFuZCBEcnVtcyAqLworCVhQQURfWEJPWDM2MF9WRU5ET1IoMHgwZjBkKSwgICAgICAgICAgICAvKiBIb3JpIENvbnRyb2xsZXJzICovCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKaW5kZXggZWU5OGIxYi4uMjAzYjg4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwpAQCAtMzYxLDYgKzM2MSwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2hfa2V5c2MuCiAKK2NvbmZpZyBLRVlCT0FSRF9EQVZJTkNJCisJdHJpc3RhdGUgIlRJIERhVmluY2kgS2V5IFNjYW4iCisJZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0lfRE0zNjUKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUga2V5cGFkIG1vZHVsZSBzdXBwb3J0IGZvciB0aGUgVEkgRGFWaW5jaQorCSAgcGxhdGZvcm1zIChETTM2NSkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRhdmluY2lfa2V5c2Nhbi4KKwogY29uZmlnIEtFWUJPQVJEX09NQVAKIAl0cmlzdGF0ZSAiVEkgT01BUCBrZXlwYWQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIChBUkNIX09NQVAxIHx8IEFSQ0hfT01BUDIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCBiYWJhZDVlLi42OGMwMTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAKIG9iai0kKENPTkZJR19LRVlCT0FSRF9BVEtCRCkJCSs9IGF0a2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9CRklOKQkJKz0gYmY1NHgta2V5cy5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQ09SR0kpCQkrPSBjb3JnaWtiZC5vCitvYmotJChDT05GSUdfS0VZQk9BUkRfREFWSU5DSSkJCSs9IGRhdmluY2lfa2V5c2Nhbi5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfRVA5M1hYKQkJKz0gZXA5M3h4X2tleXBhZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfR1BJTykJCSs9IGdwaW9fa2V5cy5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfSElMKQkJKz0gaGlsX2tiZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKaW5kZXggMjhlNjExMC4uYTM1NzM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwpAQCAtMTU2Nyw5ICsxNTY3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGF0a2JkX2RtaV9xdWlya190YWJsZVtdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgYXRrYmRfZG1pX3F1aXJrX3RhYmxlW10gX19pbml0Y29uc3QgPSB7CiAJewotCQkuaWRlbnQgPSAiRGVsbCBMYXB0b3AiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAogCQkJRE1JX01BVENIKERNSV9DSEFTU0lTX1RZUEUsICI4IiksIC8qIFBvcnRhYmxlICovCkBAIC0xNTc4LDcgKzE1NzcsNiBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9kZWxsX2xhcHRvcF9mb3JjZWRfcmVsZWFzZV9rZXlzLAogCX0sCiAJewotCQkuaWRlbnQgPSAiRGVsbCBMYXB0b3AiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKIAkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiOCIpLCAvKiBQb3J0YWJsZSAqLwpAQCAtMTU4Nyw3ICsxNTg1LDYgQEAKIAkJLmRyaXZlcl9kYXRhID0gYXRrYmRfZGVsbF9sYXB0b3BfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIkhQIDIxMzMiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIUCAyMTMzIiksCkBAIC0xNTk2LDcgKzE1OTMsNiBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9ocF9mb3JjZWRfcmVsZWFzZV9rZXlzLAogCX0sCiAJewotCQkuaWRlbnQgPSAiSFAgUGF2aWxpb24gWlY2MTAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUGF2aWxpb24gWlY2MTAwIiksCkBAIC0xNjA1LDcgKzE2MDEsNiBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIkhQIFByZXNhcmlvIFI0MDAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUHJlc2FyaW8gUjQwMDAiKSwKQEAgLTE2MTQsNyArMTYwOSw2IEBACiAJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX3ZvbHVtZV9mb3JjZWRfcmVsZWFzZV9rZXlzLAogCX0sCiAJewotCQkuaWRlbnQgPSAiSFAgUHJlc2FyaW8gUjQxMDAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQcmVzYXJpbyBSNDEwMCIpLApAQCAtMTYyMyw3ICsxNjE3LDYgQEAKIAkJLmRyaXZlcl9kYXRhID0gYXRrYmRfdm9sdW1lX2ZvcmNlZF9yZWxlYXNlX2tleXMsCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJIUCBQcmVzYXJpbyBSNDIwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlByZXNhcmlvIFI0MjAwIiksCkBAIC0xNjMyLDcgKzE2MjUsNyBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIkludmVudGVjIFN5bXBob255IiwKKwkJLyogSW52ZW50ZWMgU3ltcGhvbnkgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJJTlZFTlRFQyIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTWU1QSE9OWSA2LjAvNy4wIiksCkBAIC0xNjQxLDcgKzE2MzQsNyBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIlNhbXN1bmcgTkMxMCIsCisJCS8qIFNhbXN1bmcgTkMxMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk5DMTAiKSwKQEAgLTE2NTAsNyArMTY0Myw3IEBACiAJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX3NhbXN1bmdfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIlNhbXN1bmcgTkMyMCIsCisJCS8qIFNhbXN1bmcgTkMyMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk5DMjAiKSwKQEAgLTE2NTksNyArMTY1Miw3IEBACiAJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX3NhbXN1bmdfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIlNhbXN1bmcgU1E0NVM3MFMiLAorCQkvKiBTYW1zdW5nIFNRNDVTNzBTICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU1E0NVM3MFMiKSwKQEAgLTE2NjgsNyArMTY2MSw3IEBACiAJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX3NhbXN1bmdfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UgQW1pbG8gUEEgMTUxMCIsCisJCS8qIEZ1aml0c3UgQW1pbG8gUEEgMTUxMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBQYSAxNTEwIiksCkBAIC0xNjc3LDcgKzE2NzAsNyBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UgQW1pbG8gUGkgMzUyNSIsCisJCS8qIEZ1aml0c3UgQW1pbG8gUGkgMzUyNSAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBQaSAzNTI1IiksCkBAIC0xNjg2LDcgKzE2NzksNyBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9hbWlsb19waTM1MjVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UgQW1pbG8gWGkgMzY1MCIsCisJCS8qIEZ1aml0c3UgQW1pbG8gWGkgMzY1MCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBYaSAzNjUwIiksCkBAIC0xNjk1LDcgKzE2ODgsNiBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9hbWlsb194aTM2NTBfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIlNvbHRlY2ggQ29ycG9yYXRpb24gVEExMiIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29sdGVjaCBDb3Jwb3JhdGlvbiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUQTEyIiksCkBAIC0xNzA0LDcgKzE2OTYsNyBAQAogCQkuZHJpdmVyX2RhdGEgPSBhdGtkYl9zb2x0ZWNoX3RhMTJfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKLQkJLmlkZW50ID0gIk9RTyBNb2RlbCAwMSsiLAorCQkvKiBPUU8gTW9kZWwgMDErICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiT1FPIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlpFUFRPIiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2RhdmluY2lfa2V5c2Nhbi5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9kYXZpbmNpX2tleXNjYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTUyZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9kYXZpbmNpX2tleXNjYW4uYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIERhVmluY2kgS2V5IFNjYW4gRHJpdmVyIGZvciBUSSBwbGF0Zm9ybXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYworICoKKyAqIEF1dGhvcjogTWlndWVsIEFndWlsYXIgPG1pZ3VlbC5hZ3VpbGFyQHJpZGdlcnVuLmNvbT4KKyAqCisgKiBJbnRpYWwgQ29kZTogU2FuZGVlcCBQYXVscmFqIDxzLXBhdWxyYWpAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgPG1hY2gva2V5c2Nhbi5oPgorCisvKiBLZXkgc2NhbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0tFWUNUUkwJCTB4MDAwMAorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fSU5URU5BCQkweDAwMDQKKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0lOVEZMQUcJCTB4MDAwOAorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fSU5UQ0xSCQkweDAwMGMKKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX1NUUkJXSURUSAkweDAwMTAKKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0lOVEVSVkFMCTB4MDAxNAorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fQ09OVFRJTUUJMHgwMDE4CisjZGVmaW5lIERBVklOQ0lfS0VZU0NBTl9DVVJSRU5UU1QJMHgwMDFjCisjZGVmaW5lIERBVklOQ0lfS0VZU0NBTl9QUkVWU1RBVEUJMHgwMDIwCisjZGVmaW5lIERBVklOQ0lfS0VZU0NBTl9FTVVDVFJMCQkweDAwMjQKKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0lPREZUQ1RSTAkweDAwMmMKKworLyogS2V5IENvbnRyb2wgUmVnaXN0ZXIgKEtFWUNUUkwpICovCisjZGVmaW5lIERBVklOQ0lfS0VZU0NBTl9LRVlFTgkJMHgwMDAwMDAwMQorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fUFJFVk1PREUJMHgwMDAwMDAwMgorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fQ0hBVE9GRgkJMHgwMDAwMDAwNAorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fQVVUT0RFVAkJMHgwMDAwMDAwOAorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fU0NBTk1PREUJMHgwMDAwMDAxMAorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fT1VUVFlQRQkJMHgwMDAwMDAyMAorCisvKiBNYXNrcyBmb3IgdGhlIGludGVycnVwdHMgKi8KKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0lOVF9DT05UCTB4MDAwMDAwMDgKKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0lOVF9PRkYJCTB4MDAwMDAwMDQKKyNkZWZpbmUgREFWSU5DSV9LRVlTQ0FOX0lOVF9PTgkJMHgwMDAwMDAwMgorI2RlZmluZSBEQVZJTkNJX0tFWVNDQU5fSU5UX0NIQU5HRQkweDAwMDAwMDAxCisjZGVmaW5lIERBVklOQ0lfS0VZU0NBTl9JTlRfQUxMCQkweDAwMDAwMDBmCisKK3N0cnVjdCBkYXZpbmNpX2tzIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2CQkqaW5wdXQ7CisJc3RydWN0IGRhdmluY2lfa3NfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisJaW50CQkJCWlycTsKKwl2b2lkIF9faW9tZW0JCQkqYmFzZTsKKwlyZXNvdXJjZV9zaXplX3QJCQlwYmFzZTsKKwlzaXplX3QJCQkJYmFzZV9zaXplOworCXVuc2lnbmVkIHNob3J0CQkJa2V5bWFwW107Cit9OworCisvKiBJbml0aWFsaXppbmcgdGhlIGtwIE1vZHVsZSAqLworc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9rc19pbml0aWFsaXplKHN0cnVjdCBkYXZpbmNpX2tzICpkYXZpbmNpX2tzKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXZpbmNpX2tzLT5pbnB1dC0+ZGV2OworCXN0cnVjdCBkYXZpbmNpX2tzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGF2aW5jaV9rcy0+cGRhdGE7CisJdTMyIG1hdHJpeF9jdHJsOworCisJLyogRW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJX19yYXdfd3JpdGVsKERBVklOQ0lfS0VZU0NBTl9JTlRfQUxMLAorCQkgICAgIGRhdmluY2lfa3MtPmJhc2UgKyBEQVZJTkNJX0tFWVNDQU5fSU5URU5BKTsKKworCS8qIENsZWFyIGludGVycnVwdHMgaWYgYW55ICovCisJX19yYXdfd3JpdGVsKERBVklOQ0lfS0VZU0NBTl9JTlRfQUxMLAorCQkgICAgIGRhdmluY2lfa3MtPmJhc2UgKyBEQVZJTkNJX0tFWVNDQU5fSU5UQ0xSKTsKKworCS8qIFNldHVwIHRoZSBzY2FuIHBlcmlvZCA9IHN0cm9iZSArIGludGVydmFsICovCisJX19yYXdfd3JpdGVsKHBkYXRhLT5zdHJvYmUsCisJCSAgICAgZGF2aW5jaV9rcy0+YmFzZSArIERBVklOQ0lfS0VZU0NBTl9TVFJCV0lEVEgpOworCV9fcmF3X3dyaXRlbChwZGF0YS0+aW50ZXJ2YWwsCisJCSAgICAgZGF2aW5jaV9rcy0+YmFzZSArIERBVklOQ0lfS0VZU0NBTl9JTlRFUlZBTCk7CisJX19yYXdfd3JpdGVsKDB4MDEsCisJCSAgICAgZGF2aW5jaV9rcy0+YmFzZSArIERBVklOQ0lfS0VZU0NBTl9DT05UVElNRSk7CisKKwkvKiBEZWZpbmUgbWF0cml4IHR5cGUgKi8KKwlzd2l0Y2ggKHBkYXRhLT5tYXRyaXhfdHlwZSkgeworCWNhc2UgREFWSU5DSV9LRVlTQ0FOX01BVFJJWF80WDQ6CisJCW1hdHJpeF9jdHJsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBEQVZJTkNJX0tFWVNDQU5fTUFUUklYXzVYMzoKKwkJbWF0cml4X2N0cmwgPSAoMSA8PCA2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYtPnBhcmVudCwgIndyb25nIG1hdHJpeCB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRW5hYmxlIGtleSBzY2FuIG1vZHVsZSBhbmQgc2V0IG1hdHJpeCB0eXBlICovCisJX19yYXdfd3JpdGVsKERBVklOQ0lfS0VZU0NBTl9BVVRPREVUIHwgREFWSU5DSV9LRVlTQ0FOX0tFWUVOIHwKKwkJICAgICBtYXRyaXhfY3RybCwgZGF2aW5jaV9rcy0+YmFzZSArIERBVklOQ0lfS0VZU0NBTl9LRVlDVFJMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZGF2aW5jaV9rc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkYXZpbmNpX2tzICpkYXZpbmNpX2tzID0gZGV2X2lkOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXZpbmNpX2tzLT5pbnB1dC0+ZGV2OworCXVuc2lnbmVkIHNob3J0ICprZXltYXAgPSBkYXZpbmNpX2tzLT5rZXltYXA7CisJaW50IGtleW1hcHNpemUgPSBkYXZpbmNpX2tzLT5wZGF0YS0+a2V5bWFwc2l6ZTsKKwl1MzIgcHJldl9zdGF0dXMsIG5ld19zdGF0dXMsIGNoYW5nZWQ7CisJYm9vbCByZWxlYXNlOworCWludCBrZXljb2RlID0gS0VZX1VOS05PV047CisJaW50IGk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdCAqLworCV9fcmF3X3dyaXRlbCgweDAsIGRhdmluY2lfa3MtPmJhc2UgKyBEQVZJTkNJX0tFWVNDQU5fSU5URU5BKTsKKworCS8qIFJlYWRpbmcgcHJldmlvdXMgYW5kIG5ldyBzdGF0dXMgb2YgdGhlIGtleSBzY2FuICovCisJcHJldl9zdGF0dXMgPSBfX3Jhd19yZWFkbChkYXZpbmNpX2tzLT5iYXNlICsgREFWSU5DSV9LRVlTQ0FOX1BSRVZTVEFURSk7CisJbmV3X3N0YXR1cyA9IF9fcmF3X3JlYWRsKGRhdmluY2lfa3MtPmJhc2UgKyBEQVZJTkNJX0tFWVNDQU5fQ1VSUkVOVFNUKTsKKworCWNoYW5nZWQgPSBwcmV2X3N0YXR1cyBeIG5ld19zdGF0dXM7CisKKwlpZiAoY2hhbmdlZCkgeworCQkvKgorCQkgKiBJdCBnb2VzIHRocm91Z2ggYWxsIGJpdHMgaW4gJ2NoYW5nZWQnIHRvIGVuc3VyZQorCQkgKiB0aGF0IG5vIGtleSBjaGFuZ2VzIGFyZSBiZWluZyBtaXNzZWQKKwkJICovCisJCWZvciAoaSA9IDAgOyBpIDwga2V5bWFwc2l6ZTsgaSsrKSB7CisJCQlpZiAoKGNoYW5nZWQ+PmkpICYgMHgxKSB7CisJCQkJa2V5Y29kZSA9IGtleW1hcFtpXTsKKwkJCQlyZWxlYXNlID0gKG5ld19zdGF0dXMgPj4gaSkgJiAweDE7CisJCQkJZGV2X2RiZyhkZXYtPnBhcmVudCwgImtleSAlZCAlc1xuIiwga2V5Y29kZSwKKwkJCQkJcmVsZWFzZSA/ICJyZWxlYXNlZCIgOiAicHJlc3NlZCIpOworCQkJCWlucHV0X3JlcG9ydF9rZXkoZGF2aW5jaV9rcy0+aW5wdXQsIGtleWNvZGUsCisJCQkJCQkgIXJlbGVhc2UpOworCQkJCWlucHV0X3N5bmMoZGF2aW5jaV9rcy0+aW5wdXQpOworCQkJfQorCQl9CisJCS8qIENsZWFyaW5nIGludGVycnVwdCAqLworCQlfX3Jhd193cml0ZWwoREFWSU5DSV9LRVlTQ0FOX0lOVF9BTEwsCisJCQkgICAgIGRhdmluY2lfa3MtPmJhc2UgKyBEQVZJTkNJX0tFWVNDQU5fSU5UQ0xSKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCV9fcmF3X3dyaXRlbCgweDEsIGRhdmluY2lfa3MtPmJhc2UgKyBEQVZJTkNJX0tFWVNDQU5fSU5URU5BKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9rc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYXZpbmNpX2tzICpkYXZpbmNpX2tzOworCXN0cnVjdCBpbnB1dF9kZXYgKmtleV9kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXMsICptZW07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGF2aW5jaV9rc19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBlcnJvciwgaTsKKworCWlmICghcGRhdGEtPmtleW1hcCkgeworCQlkZXZfZGJnKGRldiwgIm5vIGtleW1hcCBmcm9tIHBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF2aW5jaV9rcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkYXZpbmNpX2tzKSArCisJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkgKiBwZGF0YS0+a2V5bWFwc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXZpbmNpX2tzKSB7CisJCWRldl9kYmcoZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcHJpdmF0ZSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KGRhdmluY2lfa3MtPmtleW1hcCwgcGRhdGEtPmtleW1hcCwKKwkJc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIHBkYXRhLT5rZXltYXBzaXplKTsKKworCWtleV9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWtleV9kZXYpIHsKKwkJZGV2X2RiZyhkZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwxOworCX0KKworCWRhdmluY2lfa3MtPmlucHV0ID0ga2V5X2RldjsKKworCWRhdmluY2lfa3MtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGRhdmluY2lfa3MtPmlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBrZXkgc2NhbiBpcnFcbiIpOworCQllcnJvciA9IGRhdmluY2lfa3MtPmlycTsKKwkJZ290byBmYWlsMjsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtIHJlc291cmNlXG4iKTsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGZhaWwyOworCX0KKworCWRhdmluY2lfa3MtPnBiYXNlID0gcmVzLT5zdGFydDsKKwlkYXZpbmNpX2tzLT5iYXNlX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisKKwltZW0gPSByZXF1ZXN0X21lbV9yZWdpb24oZGF2aW5jaV9rcy0+cGJhc2UsIGRhdmluY2lfa3MtPmJhc2Vfc2l6ZSwKKwkJCQkgcGRldi0+bmFtZSk7CisJaWYgKCFtZW0pIHsKKwkJZGV2X2VycihkZXYsICJrZXkgc2NhbiByZWdpc3RlcnMgYXQgJTA4eCBhcmUgbm90IGZyZWVcbiIsCisJCQlkYXZpbmNpX2tzLT5wYmFzZSk7CisJCWVycm9yID0gLUVCVVNZOworCQlnb3RvIGZhaWwyOworCX0KKworCWRhdmluY2lfa3MtPmJhc2UgPSBpb3JlbWFwKGRhdmluY2lfa3MtPnBiYXNlLCBkYXZpbmNpX2tzLT5iYXNlX3NpemUpOworCWlmICghZGF2aW5jaV9rcy0+YmFzZSkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGlvcmVtYXAgTUVNIHJlc291cmNlLlxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsMzsKKwl9CisKKwkvKiBFbmFibGUgYXV0byByZXBlYXQgZmVhdHVyZSBvZiBMaW51eCBpbnB1dCBzdWJzeXN0ZW0gKi8KKwlpZiAocGRhdGEtPnJlcCkKKwkJX19zZXRfYml0KEVWX1JFUCwga2V5X2Rldi0+ZXZiaXQpOworCisJLyogU2V0dXAgaW5wdXQgZGV2aWNlICovCisJX19zZXRfYml0KEVWX0tFWSwga2V5X2Rldi0+ZXZiaXQpOworCisJLyogU2V0dXAgdGhlIHBsYXRmb3JtIGRhdGEgKi8KKwlkYXZpbmNpX2tzLT5wZGF0YSA9IHBkYXRhOworCisJZm9yIChpID0gMDsgaSA8IGRhdmluY2lfa3MtPnBkYXRhLT5rZXltYXBzaXplOyBpKyspCisJCV9fc2V0X2JpdChkYXZpbmNpX2tzLT5wZGF0YS0+a2V5bWFwW2ldLCBrZXlfZGV2LT5rZXliaXQpOworCisJa2V5X2Rldi0+bmFtZSA9ICJkYXZpbmNpX2tleXNjYW4iOworCWtleV9kZXYtPnBoeXMgPSAiZGF2aW5jaV9rZXlzY2FuL2lucHV0MCI7CisJa2V5X2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJa2V5X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWtleV9kZXYtPmlkLnZlbmRvciA9IDB4MDAwMTsKKwlrZXlfZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOworCWtleV9kZXYtPmlkLnZlcnNpb24gPSAweDAwMDE7CisJa2V5X2Rldi0+a2V5Y29kZSA9IGRhdmluY2lfa3MtPmtleW1hcDsKKwlrZXlfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZihkYXZpbmNpX2tzLT5rZXltYXBbMF0pOworCWtleV9kZXYtPmtleWNvZGVtYXggPSBkYXZpbmNpX2tzLT5wZGF0YS0+a2V5bWFwc2l6ZTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGRhdmluY2lfa3MtPmlucHV0KTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGRhdmluY2kga2V5IHNjYW4gZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsNDsKKwl9CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGRhdmluY2lfa3MtPmlycSwgZGF2aW5jaV9rc19pbnRlcnJ1cHQsCisJCQkgIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGRhdmluY2lfa3MpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgZGF2aW5jaSBrZXkgc2NhbiBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGZhaWw1OworCX0KKworCWVycm9yID0gZGF2aW5jaV9rc19pbml0aWFsaXplKGRhdmluY2lfa3MpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gaW5pdGlhbGl6ZSBkYXZpbmNpIGtleSBzY2FuIGRldmljZVxuIik7CisJCWdvdG8gZmFpbDY7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF2aW5jaV9rcyk7CisJcmV0dXJuIDA7CisKK2ZhaWw2OgorCWZyZWVfaXJxKGRhdmluY2lfa3MtPmlycSwgZGF2aW5jaV9rcyk7CitmYWlsNToKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkYXZpbmNpX2tzLT5pbnB1dCk7CisJa2V5X2RldiA9IE5VTEw7CitmYWlsNDoKKwlpb3VubWFwKGRhdmluY2lfa3MtPmJhc2UpOworZmFpbDM6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRhdmluY2lfa3MtPnBiYXNlLCBkYXZpbmNpX2tzLT5iYXNlX3NpemUpOworZmFpbDI6CisJaW5wdXRfZnJlZV9kZXZpY2Uoa2V5X2Rldik7CitmYWlsMToKKwlrZnJlZShkYXZpbmNpX2tzKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGF2aW5jaV9rc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9rcyAqZGF2aW5jaV9rcyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZnJlZV9pcnEoZGF2aW5jaV9rcy0+aXJxLCBkYXZpbmNpX2tzKTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRhdmluY2lfa3MtPmlucHV0KTsKKworCWlvdW5tYXAoZGF2aW5jaV9rcy0+YmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRhdmluY2lfa3MtPnBiYXNlLCBkYXZpbmNpX2tzLT5iYXNlX3NpemUpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlrZnJlZShkYXZpbmNpX2tzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkYXZpbmNpX2tzX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZSA9ICJkYXZpbmNpX2tleXNjYW4iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChkYXZpbmNpX2tzX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX2tzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZkYXZpbmNpX2tzX2RyaXZlciwgZGF2aW5jaV9rc19wcm9iZSk7Cit9Cittb2R1bGVfaW5pdChkYXZpbmNpX2tzX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZGF2aW5jaV9rc19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRhdmluY2lfa3NfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGRhdmluY2lfa3NfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pZ3VlbCBBZ3VpbGFyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRleGFzIEluc3RydW1lbnRzIERhVmluY2kgS2V5IFNjYW4gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwppbmRleCA3N2QxMzA5Li4xYWZmM2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKQEAgLTIzLDggKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKIHN0cnVjdCBncGlvX2J1dHRvbl9kYXRhIHsKIAlzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiAqYnV0dG9uOwpAQCAtMzgsMTAgKzM3LDggQEAKIAlzdHJ1Y3QgZ3Bpb19idXR0b25fZGF0YSBkYXRhWzBdOwogfTsKIAotc3RhdGljIHZvaWQgZ3Bpb19rZXlzX3JlcG9ydF9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBncGlvX2tleXNfcmVwb3J0X2V2ZW50KHN0cnVjdCBncGlvX2J1dHRvbl9kYXRhICpiZGF0YSkKIHsKLQlzdHJ1Y3QgZ3Bpb19idXR0b25fZGF0YSAqYmRhdGEgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEsIHdvcmspOwogCXN0cnVjdCBncGlvX2tleXNfYnV0dG9uICpidXR0b24gPSBiZGF0YS0+YnV0dG9uOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gYmRhdGEtPmlucHV0OwogCXVuc2lnbmVkIGludCB0eXBlID0gYnV0dG9uLT50eXBlID86IEVWX0tFWTsKQEAgLTUxLDYgKzQ4LDE0IEBACiAJaW5wdXRfc3luYyhpbnB1dCk7CiB9CiAKK3N0YXRpYyB2b2lkIGdwaW9fa2V5c193b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBncGlvX2J1dHRvbl9kYXRhICpiZGF0YSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ3Bpb19idXR0b25fZGF0YSwgd29yayk7CisKKwlncGlvX2tleXNfcmVwb3J0X2V2ZW50KGJkYXRhKTsKK30KKwogc3RhdGljIHZvaWQgZ3Bpb19rZXlzX3RpbWVyKHVuc2lnbmVkIGxvbmcgX2RhdGEpCiB7CiAJc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEgKmRhdGEgPSAoc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEgKilfZGF0YTsKQEAgLTc0LDEwICs3OSw2MiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb19rZXlzX3NldHVwX2tleShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZ3Bpb19idXR0b25fZGF0YSAqYmRhdGEsCisJCQkJCSBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiAqYnV0dG9uKQoreworCWNoYXIgKmRlc2MgPSBidXR0b24tPmRlc2MgPyBidXR0b24tPmRlc2MgOiAiZ3Bpb19rZXlzIjsKKwlpbnQgaXJxLCBlcnJvcjsKKworCXNldHVwX3RpbWVyKCZiZGF0YS0+dGltZXIsIGdwaW9fa2V5c190aW1lciwgKHVuc2lnbmVkIGxvbmcpYmRhdGEpOworCUlOSVRfV09SSygmYmRhdGEtPndvcmssIGdwaW9fa2V5c193b3JrX2Z1bmMpOworCisJZXJyb3IgPSBncGlvX3JlcXVlc3QoYnV0dG9uLT5ncGlvLCBkZXNjKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyAlZCwgZXJyb3IgJWRcbiIsCisJCQlidXR0b24tPmdwaW8sIGVycm9yKTsKKwkJZ290byBmYWlsMjsKKwl9CisKKwllcnJvciA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGJ1dHRvbi0+Z3Bpbyk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjb25maWd1cmUiCisJCQkiIGRpcmVjdGlvbiBmb3IgR1BJTyAlZCwgZXJyb3IgJWRcbiIsCisJCQlidXR0b24tPmdwaW8sIGVycm9yKTsKKwkJZ290byBmYWlsMzsKKwl9CisKKwlpcnEgPSBncGlvX3RvX2lycShidXR0b24tPmdwaW8pOworCWlmIChpcnEgPCAwKSB7CisJCWVycm9yID0gaXJxOworCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBnZXQgaXJxIG51bWJlciBmb3IgR1BJTyAlZCwgZXJyb3IgJWRcbiIsCisJCQlidXR0b24tPmdwaW8sIGVycm9yKTsKKwkJZ290byBmYWlsMzsKKwl9CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgZ3Bpb19rZXlzX2lzciwKKwkJCSAgICBJUlFGX1NIQVJFRCB8CisJCQkgICAgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJICAgIGRlc2MsIGJkYXRhKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gY2xhaW0gaXJxICVkOyBlcnJvciAlZFxuIiwKKwkJCWlycSwgZXJyb3IpOworCQlnb3RvIGZhaWwzOworCX0KKworCXJldHVybiAwOworCitmYWlsMzoKKwlncGlvX2ZyZWUoYnV0dG9uLT5ncGlvKTsKK2ZhaWwyOgorCXJldHVybiBlcnJvcjsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb19rZXlzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBncGlvX2tleXNfZHJ2ZGF0YSAqZGRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKIAlpbnQgaSwgZXJyb3I7CiAJaW50IHdha2V1cCA9IDA7CkBAIC04Nyw2ICsxNDQsNyBAQAogCQkJR0ZQX0tFUk5FTCk7CiAJaW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWRkYXRhIHx8ICFpbnB1dCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBzdGF0ZVxuIik7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBmYWlsMTsKIAl9CkBAIC0xMTEsNTIgKzE2OSwxNCBAQAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bmJ1dHRvbnM7IGkrKykgewogCQlzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiAqYnV0dG9uID0gJnBkYXRhLT5idXR0b25zW2ldOwogCQlzdHJ1Y3QgZ3Bpb19idXR0b25fZGF0YSAqYmRhdGEgPSAmZGRhdGEtPmRhdGFbaV07Ci0JCWludCBpcnE7CiAJCXVuc2lnbmVkIGludCB0eXBlID0gYnV0dG9uLT50eXBlID86IEVWX0tFWTsKIAogCQliZGF0YS0+aW5wdXQgPSBpbnB1dDsKIAkJYmRhdGEtPmJ1dHRvbiA9IGJ1dHRvbjsKLQkJc2V0dXBfdGltZXIoJmJkYXRhLT50aW1lciwKLQkJCSAgICBncGlvX2tleXNfdGltZXIsICh1bnNpZ25lZCBsb25nKWJkYXRhKTsKLQkJSU5JVF9XT1JLKCZiZGF0YS0+d29yaywgZ3Bpb19rZXlzX3JlcG9ydF9ldmVudCk7CiAKLQkJZXJyb3IgPSBncGlvX3JlcXVlc3QoYnV0dG9uLT5ncGlvLCBidXR0b24tPmRlc2MgPzogImdwaW9fa2V5cyIpOwotCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlwcl9lcnIoImdwaW8ta2V5czogZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyAlZCwiCi0JCQkJIiBlcnJvciAlZFxuIiwgYnV0dG9uLT5ncGlvLCBlcnJvcik7CisJCWVycm9yID0gZ3Bpb19rZXlzX3NldHVwX2tleShkZXYsIGJkYXRhLCBidXR0b24pOworCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGZhaWwyOwotCQl9Ci0KLQkJZXJyb3IgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChidXR0b24tPmdwaW8pOwotCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlwcl9lcnIoImdwaW8ta2V5czogZmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnB1dCIKLQkJCQkiIGRpcmVjdGlvbiBmb3IgR1BJTyAlZCwgZXJyb3IgJWRcbiIsCi0JCQkJYnV0dG9uLT5ncGlvLCBlcnJvcik7Ci0JCQlncGlvX2ZyZWUoYnV0dG9uLT5ncGlvKTsKLQkJCWdvdG8gZmFpbDI7Ci0JCX0KLQotCQlpcnEgPSBncGlvX3RvX2lycShidXR0b24tPmdwaW8pOwotCQlpZiAoaXJxIDwgMCkgewotCQkJZXJyb3IgPSBpcnE7Ci0JCQlwcl9lcnIoImdwaW8ta2V5czogVW5hYmxlIHRvIGdldCBpcnEgbnVtYmVyIgotCQkJCSIgZm9yIEdQSU8gJWQsIGVycm9yICVkXG4iLAotCQkJCWJ1dHRvbi0+Z3BpbywgZXJyb3IpOwotCQkJZ3Bpb19mcmVlKGJ1dHRvbi0+Z3Bpbyk7Ci0JCQlnb3RvIGZhaWwyOwotCQl9Ci0KLQkJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIGdwaW9fa2V5c19pc3IsCi0JCQkJICAgIElSUUZfU0hBUkVEIHwKLQkJCQkgICAgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAotCQkJCSAgICBidXR0b24tPmRlc2MgPyBidXR0b24tPmRlc2MgOiAiZ3Bpb19rZXlzIiwKLQkJCQkgICAgYmRhdGEpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXByX2VycigiZ3Bpby1rZXlzOiBVbmFibGUgdG8gY2xhaW0gaXJxICVkOyBlcnJvciAlZFxuIiwKLQkJCQlpcnEsIGVycm9yKTsKLQkJCWdwaW9fZnJlZShidXR0b24tPmdwaW8pOwotCQkJZ290byBmYWlsMjsKLQkJfQogCiAJCWlmIChidXR0b24tPndha2V1cCkKIAkJCXdha2V1cCA9IDE7CkBAIC0xNjYsMTEgKzE4NiwxNiBAQAogCiAJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOwogCWlmIChlcnJvcikgewotCQlwcl9lcnIoImdwaW8ta2V5czogVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZSwgIgorCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZWdpc3RlciBpbnB1dCBkZXZpY2UsICIKIAkJCSJlcnJvcjogJWRcbiIsIGVycm9yKTsKIAkJZ290byBmYWlsMjsKIAl9CiAKKwkvKiBnZXQgY3VycmVudCBzdGF0ZSBvZiBidXR0b25zICovCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5uYnV0dG9uczsgaSsrKQorCQlncGlvX2tleXNfcmVwb3J0X2V2ZW50KCZkZGF0YS0+ZGF0YVtpXSk7CisJaW5wdXRfc3luYyhpbnB1dCk7CisKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgd2FrZXVwKTsKIAogCXJldHVybiAwOwpAQCAtMjM5LDE4ICsyNjQsMjEgQEAKIHN0YXRpYyBpbnQgZ3Bpb19rZXlzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBncGlvX2tleXNfZHJ2ZGF0YSAqZGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IGk7CiAKLQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5uYnV0dG9uczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiAqYnV0dG9uID0gJnBkYXRhLT5idXR0b25zW2ldOwotCQkJaWYgKGJ1dHRvbi0+d2FrZXVwKSB7Ci0JCQkJaW50IGlycSA9IGdwaW9fdG9faXJxKGJ1dHRvbi0+Z3Bpbyk7Ci0JCQkJZGlzYWJsZV9pcnFfd2FrZShpcnEpOwotCQkJfQorCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bmJ1dHRvbnM7IGkrKykgeworCisJCXN0cnVjdCBncGlvX2tleXNfYnV0dG9uICpidXR0b24gPSAmcGRhdGEtPmJ1dHRvbnNbaV07CisJCWlmIChidXR0b24tPndha2V1cCAmJiBkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkgeworCQkJaW50IGlycSA9IGdwaW9fdG9faXJxKGJ1dHRvbi0+Z3Bpbyk7CisJCQlkaXNhYmxlX2lycV93YWtlKGlycSk7CiAJCX0KKworCQlncGlvX2tleXNfcmVwb3J0X2V2ZW50KCZkZGF0YS0+ZGF0YVtpXSk7CiAJfQorCWlucHV0X3N5bmMoZGRhdGEtPmlucHV0KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCmluZGV4IGY5ODQ3ZTAuLmZhOWJiNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMKQEAgLTcyLDkgKzcyLDkgQEAKIAogI2RlZmluZSBEUklWRVJfREVTQwkiTEsga2V5Ym9hcmQgZHJpdmVyIgogCi1NT0RVTEVfQVVUSE9SICgiSmFuLUJlbmVkaWN0IEdsYXcgPGpiZ2xhd0BsdWctb3dsLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OIChEUklWRVJfREVTQyk7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmFuLUJlbmVkaWN0IEdsYXcgPGpiZ2xhd0BsdWctb3dsLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogLyoKICAqIEtub3duIHBhcmFtZXRlcnM6CkBAIC04NSwyNyArODUsMjcgQEAKICAqIFBsZWFzZSBub3RpY2UgdGhhdCB0aGVyZSdzIG5vdCB5ZXQgYW4gQVBJIHRvIHNldCB0aGVzZSBhdCBydW50aW1lLgogICovCiBzdGF0aWMgaW50IGJlbGxfdm9sdW1lID0gMTAwOyAvKiAlICovCi1tb2R1bGVfcGFyYW0gKGJlbGxfdm9sdW1lLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyAoYmVsbF92b2x1bWUsICJCZWxsIHZvbHVtZSAoaW4gJSkuIGRlZmF1bHQgaXMgMTAwJSIpOworbW9kdWxlX3BhcmFtKGJlbGxfdm9sdW1lLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhiZWxsX3ZvbHVtZSwgIkJlbGwgdm9sdW1lIChpbiAlKS4gZGVmYXVsdCBpcyAxMDAlIik7CiAKIHN0YXRpYyBpbnQga2V5Y2xpY2tfdm9sdW1lID0gMTAwOyAvKiAlICovCi1tb2R1bGVfcGFyYW0gKGtleWNsaWNrX3ZvbHVtZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MgKGtleWNsaWNrX3ZvbHVtZSwgIktleWNsaWNrIHZvbHVtZSAoaW4gJSksIGRlZmF1bHQgaXMgMTAwJSIpOworbW9kdWxlX3BhcmFtKGtleWNsaWNrX3ZvbHVtZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moa2V5Y2xpY2tfdm9sdW1lLCAiS2V5Y2xpY2sgdm9sdW1lIChpbiAlKSwgZGVmYXVsdCBpcyAxMDAlIik7CiAKIHN0YXRpYyBpbnQgY3RybGNsaWNrX3ZvbHVtZSA9IDEwMDsgLyogJSAqLwotbW9kdWxlX3BhcmFtIChjdHJsY2xpY2tfdm9sdW1lLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyAoY3RybGNsaWNrX3ZvbHVtZSwgIkN0cmxjbGljayB2b2x1bWUgKGluICUpLCBkZWZhdWx0IGlzIDEwMCUiKTsKK21vZHVsZV9wYXJhbShjdHJsY2xpY2tfdm9sdW1lLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjdHJsY2xpY2tfdm9sdW1lLCAiQ3RybGNsaWNrIHZvbHVtZSAoaW4gJSksIGRlZmF1bHQgaXMgMTAwJSIpOwogCiBzdGF0aWMgaW50IGxrMjAxX2NvbXBvc2VfaXNfYWx0OwotbW9kdWxlX3BhcmFtIChsazIwMV9jb21wb3NlX2lzX2FsdCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MgKGxrMjAxX2NvbXBvc2VfaXNfYWx0LCAiSWYgc2V0IG5vbi16ZXJvLCBMSzIwMScgQ29tcG9zZSBrZXkgIgotCQkid2lsbCBhY3QgYXMgYW4gQWx0IGtleSIpOworbW9kdWxlX3BhcmFtKGxrMjAxX2NvbXBvc2VfaXNfYWx0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhsazIwMV9jb21wb3NlX2lzX2FsdCwKKwkJICJJZiBzZXQgbm9uLXplcm8sIExLMjAxJyBDb21wb3NlIGtleSB3aWxsIGFjdCBhcyBhbiBBbHQga2V5Iik7CiAKIAogCiAjdW5kZWYgTEtLQkRfREVCVUcKICNpZmRlZiBMS0tCRF9ERUJVRwotI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrICh4KQorI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKHgpCiAjZWxzZQogI2RlZmluZSBEQkcoeC4uLikgZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKQEAgLTEyMiw3ICsxMjIsNyBAQAogI2RlZmluZSBMS19NT0RFX0RPV04JCTB4ODAKICNkZWZpbmUgTEtfTU9ERV9BVVRPRE9XTgkweDgyCiAjZGVmaW5lIExLX01PREVfVVBET1dOCQkweDg2Ci0jZGVmaW5lIExLX0NNRF9TRVRfTU9ERShtb2RlLGRpdikJKChtb2RlKSB8ICgoZGl2KSA8PCAzKSkKKyNkZWZpbmUgTEtfQ01EX1NFVF9NT0RFKG1vZGUsIGRpdikJKChtb2RlKSB8ICgoZGl2KSA8PCAzKSkKIAogLyogTWlzYyBjb21tYW5kcyAqLwogI2RlZmluZSBMS19DTURfRU5BQkxFX0tFWUNMSUNLCTB4MWIKQEAgLTE1MiwxMSArMTUyLDggQEAKIAogI2RlZmluZSBMS19OVU1fS0VZQ09ERVMJCTI1NgogI2RlZmluZSBMS19OVU1fSUdOT1JFX0JZVEVTCTYKLXR5cGVkZWYgdV9pbnQxNl90IGxrX2tleWNvZGVfdDsKIAotCi0KLXN0YXRpYyBsa19rZXljb2RlX3QgbGtrYmRfa2V5Y29kZVtMS19OVU1fS0VZQ09ERVNdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGxra2JkX2tleWNvZGVbTEtfTlVNX0tFWUNPREVTXSA9IHsKIAlbMHg1Nl0gPSBLRVlfRjEsCiAJWzB4NTddID0gS0VZX0YyLAogCVsweDU4XSA9IEtFWV9GMywKQEAgLTI2OCw3ICsyNjUsNyBAQAogfTsKIAogI2RlZmluZSBDSEVDS19MRUQoTEssIFZBUl9PTiwgVkFSX09GRiwgTEVELCBCSVRTKSBkbyB7CQlcCi0JaWYgKHRlc3RfYml0IChMRUQsIChMSyktPmRldi0+bGVkKSkJCQlcCisJaWYgKHRlc3RfYml0KExFRCwgKExLKS0+ZGV2LT5sZWQpKQkJCVwKIAkJVkFSX09OIHw9IEJJVFM7CQkJCQlcCiAJZWxzZQkJCQkJCQlcCiAJCVZBUl9PRkYgfD0gQklUUzsJCQkJXApAQCAtMjc4LDcgKzI3NSw3IEBACiAgKiBQZXIta2V5Ym9hcmQgZGF0YQogICovCiBzdHJ1Y3QgbGtrYmQgewotCWxrX2tleWNvZGVfdCBrZXljb2RlW0xLX05VTV9LRVlDT0RFU107CisJdW5zaWduZWQgc2hvcnQga2V5Y29kZVtMS19OVU1fS0VZQ09ERVNdOwogCWludCBpZ25vcmVfYnl0ZXM7CiAJdW5zaWduZWQgY2hhciBpZFtMS19OVU1fSUdOT1JFX0JZVEVTXTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CkBAIC0zMDEsMjYgKzI5OCwyNSBAQAogCXVuc2lnbmVkIGNoYXIgKm5hbWU7CiB9IGxrX3Jlc3BvbnNlW10gPSB7CiAjZGVmaW5lIFJFU1BPTlNFKHgpIHsgLnZhbHVlID0gKHgpLCAubmFtZSA9ICN4LCB9Ci0JUkVTUE9OU0UgKExLX1NUVUNLX0tFWSksCi0JUkVTUE9OU0UgKExLX1NFTEZURVNUX0ZBSUxFRCksCi0JUkVTUE9OU0UgKExLX0FMTF9LRVlTX1VQKSwKLQlSRVNQT05TRSAoTEtfTUVUUk9OT01FKSwKLQlSRVNQT05TRSAoTEtfT1VUUFVUX0VSUk9SKSwKLQlSRVNQT05TRSAoTEtfSU5QVVRfRVJST1IpLAotCVJFU1BPTlNFIChMS19LQkRfTE9DS0VEKSwKLQlSRVNQT05TRSAoTEtfS0JEX1RFU1RfTU9ERV9BQ0spLAotCVJFU1BPTlNFIChMS19QUkVGSVhfS0VZX0RPV04pLAotCVJFU1BPTlNFIChMS19NT0RFX0NIQU5HRV9BQ0spLAotCVJFU1BPTlNFIChMS19SRVNQT05TRV9SRVNFUlZFRCksCisJUkVTUE9OU0UoTEtfU1RVQ0tfS0VZKSwKKwlSRVNQT05TRShMS19TRUxGVEVTVF9GQUlMRUQpLAorCVJFU1BPTlNFKExLX0FMTF9LRVlTX1VQKSwKKwlSRVNQT05TRShMS19NRVRST05PTUUpLAorCVJFU1BPTlNFKExLX09VVFBVVF9FUlJPUiksCisJUkVTUE9OU0UoTEtfSU5QVVRfRVJST1IpLAorCVJFU1BPTlNFKExLX0tCRF9MT0NLRUQpLAorCVJFU1BPTlNFKExLX0tCRF9URVNUX01PREVfQUNLKSwKKwlSRVNQT05TRShMS19QUkVGSVhfS0VZX0RPV04pLAorCVJFU1BPTlNFKExLX01PREVfQ0hBTkdFX0FDSyksCisJUkVTUE9OU0UoTEtfUkVTUE9OU0VfUkVTRVJWRUQpLAogI3VuZGVmIFJFU1BPTlNFCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1yZXNwb25zZV9uYW1lICh1bnNpZ25lZCBjaGFyIHZhbHVlKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlX25hbWUodW5zaWduZWQgY2hhciB2YWx1ZSkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChsa19yZXNwb25zZSk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsa19yZXNwb25zZSk7IGkrKykKIAkJaWYgKGxrX3Jlc3BvbnNlW2ldLnZhbHVlID09IHZhbHVlKQogCQkJcmV0dXJuIGxrX3Jlc3BvbnNlW2ldLm5hbWU7CiAKQEAgLTMzMSw4ICszMjcsNyBAQAogLyoKICAqIENhbGN1bGF0ZSB2b2x1bWUgcGFyYW1ldGVyIGJ5dGUgZm9yIGEgZ2l2ZW4gdm9sdW1lLgogICovCi1zdGF0aWMgdW5zaWduZWQgY2hhcgotdm9sdW1lX3RvX2h3IChpbnQgdm9sdW1lX3BlcmNlbnQpCitzdGF0aWMgdW5zaWduZWQgY2hhciB2b2x1bWVfdG9faHcoaW50IHZvbHVtZV9wZXJjZW50KQogewogCXVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKIApAQCAtMzYzLDggKzM1OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQKLWxra2JkX2RldGVjdGlvbl9kb25lIChzdHJ1Y3QgbGtrYmQgKmxrKQorc3RhdGljIHZvaWQgbGtrYmRfZGV0ZWN0aW9uX2RvbmUoc3RydWN0IGxra2JkICpsaykKIHsKIAlpbnQgaTsKIApAQCAtMzc3LDE5MCArMzcxLDIwMiBAQAogCSAqIFByaW50IGtleWJvYXJkIG5hbWUgYW5kIG1vZGlmeSBDb21wb3NlPUFsdCBvbiB1c2VyJ3MgcmVxdWVzdC4KIAkgKi8KIAlzd2l0Y2ggKGxrLT5pZFs0XSkgewotCQljYXNlIDE6Ci0JCQlzdHJsY3B5IChsay0+bmFtZSwgIkRFQyBMSzIwMSBrZXlib2FyZCIsCi0JCQkJIHNpemVvZiAobGstPm5hbWUpKTsKKwljYXNlIDE6CisJCXN0cmxjcHkobGstPm5hbWUsICJERUMgTEsyMDEga2V5Ym9hcmQiLCBzaXplb2YobGstPm5hbWUpKTsKIAotCQkJaWYgKGxrMjAxX2NvbXBvc2VfaXNfYWx0KQotCQkJCWxrLT5rZXljb2RlWzB4YjFdID0gS0VZX0xFRlRBTFQ7Ci0JCQlicmVhazsKKwkJaWYgKGxrMjAxX2NvbXBvc2VfaXNfYWx0KQorCQkJbGstPmtleWNvZGVbMHhiMV0gPSBLRVlfTEVGVEFMVDsKKwkJYnJlYWs7CiAKLQkJY2FzZSAyOgotCQkJc3RybGNweSAobGstPm5hbWUsICJERUMgTEs0MDEga2V5Ym9hcmQiLAotCQkJCSBzaXplb2YgKGxrLT5uYW1lKSk7Ci0JCQlicmVhazsKKwljYXNlIDI6CisJCXN0cmxjcHkobGstPm5hbWUsICJERUMgTEs0MDEga2V5Ym9hcmQiLCBzaXplb2YobGstPm5hbWUpKTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCXN0cmxjcHkgKGxrLT5uYW1lLCAiVW5rbm93biBERUMga2V5Ym9hcmQiLAotCQkJCSBzaXplb2YgKGxrLT5uYW1lKSk7Ci0JCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDoga2V5Ym9hcmQgb24gJXMgaXMgdW5rbm93biwgIgotCQkJCQkicGxlYXNlIHJlcG9ydCB0byBKYW4tQmVuZWRpY3QgR2xhdyAiCi0JCQkJCSI8amJnbGF3QGx1Zy1vd2wuZGU+XG4iLCBsay0+cGh5cyk7Ci0JCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDoga2V5Ym9hcmQgSUQnZWQgYXM6Iik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTEtfTlVNX0lHTk9SRV9CWVRFUzsgaSsrKQotCQkJCXByaW50ayAoIiAweCUwMngiLCBsay0+aWRbaV0pOwotCQkJcHJpbnRrICgiXG4iKTsKLQkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0cmxjcHkobGstPm5hbWUsICJVbmtub3duIERFQyBrZXlib2FyZCIsIHNpemVvZihsay0+bmFtZSkpOworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJsa2tiZDoga2V5Ym9hcmQgb24gJXMgaXMgdW5rbm93biwgcGxlYXNlIHJlcG9ydCB0byAiCisJCQkiSmFuLUJlbmVkaWN0IEdsYXcgPGpiZ2xhd0BsdWctb3dsLmRlPlxuIiwgbGstPnBoeXMpOworCQlwcmludGsoS0VSTl9FUlIgImxra2JkOiBrZXlib2FyZCBJRCdlZCBhczoiKTsKKwkJZm9yIChpID0gMDsgaSA8IExLX05VTV9JR05PUkVfQllURVM7IGkrKykKKwkJCXByaW50aygiIDB4JTAyeCIsIGxrLT5pZFtpXSk7CisJCXByaW50aygiXG4iKTsKKwkJYnJlYWs7CiAJfQotCXByaW50ayAoS0VSTl9JTkZPICJsa2tiZDoga2V5Ym9hcmQgb24gJXMgaWRlbnRpZmllZCBhczogJXNcbiIsCi0JCQlsay0+cGh5cywgbGstPm5hbWUpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibGtrYmQ6IGtleWJvYXJkIG9uICVzIGlkZW50aWZpZWQgYXM6ICVzXG4iLAorCQlsay0+cGh5cywgbGstPm5hbWUpOwogCiAJLyoKIAkgKiBSZXBvcnQgZXJyb3JzIGR1cmluZyBrZXlib2FyZCBib290LXVwLgogCSAqLwogCXN3aXRjaCAobGstPmlkWzJdKSB7Ci0JCWNhc2UgMHgwMDoKLQkJCS8qIEFsbCBva2F5ICovCi0JCQlicmVhazsKKwljYXNlIDB4MDA6CisJCS8qIEFsbCBva2F5ICovCisJCWJyZWFrOwogCi0JCWNhc2UgTEtfU1RVQ0tfS0VZOgotCQkJcHJpbnRrIChLRVJOX0VSUiAibGtrYmQ6IFN0dWNrIGtleSBvbiBrZXlib2FyZCBhdCAiCi0JCQkJCSIlc1xuIiwgbGstPnBoeXMpOwotCQkJYnJlYWs7CisJY2FzZSBMS19TVFVDS19LRVk6CisJCXByaW50ayhLRVJOX0VSUiAibGtrYmQ6IFN0dWNrIGtleSBvbiBrZXlib2FyZCBhdCAlc1xuIiwKKwkJCWxrLT5waHlzKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBMS19TRUxGVEVTVF9GQUlMRUQ6Ci0JCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDogU2VsZnRlc3QgZmFpbGVkIG9uIGtleWJvYXJkICIKLQkJCQkJImF0ICVzLCBrZXlib2FyZCBtYXkgbm90IHdvcmsgIgotCQkJCQkicHJvcGVybHlcbiIsIGxrLT5waHlzKTsKLQkJCWJyZWFrOworCWNhc2UgTEtfU0VMRlRFU1RfRkFJTEVEOgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJsa2tiZDogU2VsZnRlc3QgZmFpbGVkIG9uIGtleWJvYXJkIGF0ICVzLCAiCisJCQkia2V5Ym9hcmQgbWF5IG5vdCB3b3JrIHByb3Blcmx5XG4iLCBsay0+cGh5cyk7CisJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsgKEtFUk5fRVJSICJsa2tiZDogVW5rbm93biBlcnJvciAlMDJ4IG9uICIKLQkJCQkJImtleWJvYXJkIGF0ICVzXG4iLCBsay0+aWRbMl0sCi0JCQkJCWxrLT5waHlzKTsKLQkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImxra2JkOiBVbmtub3duIGVycm9yICUwMnggb24ga2V5Ym9hcmQgYXQgJXNcbiIsCisJCQlsay0+aWRbMl0sIGxrLT5waHlzKTsKKwkJYnJlYWs7CiAJfQogCiAJLyoKIAkgKiBUcnkgdG8gaGludCB1c2VyIGlmIHRoZXJlJ3MgYSBzdHVjayBrZXkuCiAJICovCiAJaWYgKGxrLT5pZFsyXSA9PSBMS19TVFVDS19LRVkgJiYgbGstPmlkWzNdICE9IDApCi0JCXByaW50ayAoS0VSTl9FUlIgIlNjYW5jb2RlIG9mIHN0dWNrIGtleSBpcyAweCUwMngsIGtleWNvZGUgIgotCQkJCSJpcyAweCUwNHhcbiIsIGxrLT5pZFszXSwKLQkJCQlsay0+a2V5Y29kZVtsay0+aWRbM11dKTsKLQotCXJldHVybjsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiU2NhbmNvZGUgb2Ygc3R1Y2sga2V5IGlzIDB4JTAyeCwga2V5Y29kZSBpcyAweCUwNHhcbiIsCisJCQlsay0+aWRbM10sIGxrLT5rZXljb2RlW2xrLT5pZFszXV0pOwogfQogCiAvKgogICogbGtrYmRfaW50ZXJydXB0KCkgaXMgY2FsbGVkIGJ5IHRoZSBsb3cgbGV2ZWwgZHJpdmVyIHdoZW4gYSBjaGFyYWN0ZXIKICAqIGlzIHJlY2VpdmVkLgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QKLWxra2JkX2ludGVycnVwdCAoc3RydWN0IHNlcmlvICpzZXJpbywgdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgbGtrYmRfaW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sCisJCQkJICAgdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGxra2JkICpsayA9IHNlcmlvX2dldF9kcnZkYXRhIChzZXJpbyk7CisJc3RydWN0IGxra2JkICpsayA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBsay0+ZGV2OworCXVuc2lnbmVkIGludCBrZXljb2RlOwogCWludCBpOwogCi0JREJHIChLRVJOX0lORk8gIkdvdCBieXRlIDB4JTAyeFxuIiwgZGF0YSk7CisJREJHKEtFUk5fSU5GTyAiR290IGJ5dGUgMHglMDJ4XG4iLCBkYXRhKTsKIAogCWlmIChsay0+aWdub3JlX2J5dGVzID4gMCkgewotCQlEQkcgKEtFUk5fSU5GTyAiSWdub3JpbmcgYSBieXRlIG9uICVzXG4iLCBsay0+bmFtZSk7CisJCURCRyhLRVJOX0lORk8gIklnbm9yaW5nIGEgYnl0ZSBvbiAlc1xuIiwgbGstPm5hbWUpOwogCQlsay0+aWRbTEtfTlVNX0lHTk9SRV9CWVRFUyAtIGxrLT5pZ25vcmVfYnl0ZXMtLV0gPSBkYXRhOwogCiAJCWlmIChsay0+aWdub3JlX2J5dGVzID09IDApCi0JCQlsa2tiZF9kZXRlY3Rpb25fZG9uZSAobGspOworCQkJbGtrYmRfZGV0ZWN0aW9uX2RvbmUobGspOwogCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKIAlzd2l0Y2ggKGRhdGEpIHsKLQkJY2FzZSBMS19BTExfS0VZU19VUDoKLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChsa2tiZF9rZXljb2RlKTsgaSsrKQotCQkJCWlmIChsay0+a2V5Y29kZVtpXSAhPSBLRVlfUkVTRVJWRUQpCi0JCQkJCWlucHV0X3JlcG9ydF9rZXkgKGxrLT5kZXYsIGxrLT5rZXljb2RlW2ldLCAwKTsKLQkJCWlucHV0X3N5bmMgKGxrLT5kZXYpOwotCQkJYnJlYWs7CisJY2FzZSBMS19BTExfS0VZU19VUDoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGtrYmRfa2V5Y29kZSk7IGkrKykKKwkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfZGV2LCBsay0+a2V5Y29kZVtpXSwgMCk7CisJCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKKwkJYnJlYWs7CiAKLQkJY2FzZSAweDAxOgotCQkJREJHIChLRVJOX0lORk8gIkdvdCAweDAxLCBzY2hlZHVsaW5nIHJlLWluaXRpYWxpemF0aW9uXG4iKTsKLQkJCWxrLT5pZ25vcmVfYnl0ZXMgPSBMS19OVU1fSUdOT1JFX0JZVEVTOwotCQkJbGstPmlkW0xLX05VTV9JR05PUkVfQllURVMgLSBsay0+aWdub3JlX2J5dGVzLS1dID0gZGF0YTsKLQkJCXNjaGVkdWxlX3dvcmsgKCZsay0+dHEpOwotCQkJYnJlYWs7CisJY2FzZSAweDAxOgorCQlEQkcoS0VSTl9JTkZPICJHb3QgMHgwMSwgc2NoZWR1bGluZyByZS1pbml0aWFsaXphdGlvblxuIik7CisJCWxrLT5pZ25vcmVfYnl0ZXMgPSBMS19OVU1fSUdOT1JFX0JZVEVTOworCQlsay0+aWRbTEtfTlVNX0lHTk9SRV9CWVRFUyAtIGxrLT5pZ25vcmVfYnl0ZXMtLV0gPSBkYXRhOworCQlzY2hlZHVsZV93b3JrKCZsay0+dHEpOworCQlicmVhazsKIAotCQljYXNlIExLX01FVFJPTk9NRToKLQkJY2FzZSBMS19PVVRQVVRfRVJST1I6Ci0JCWNhc2UgTEtfSU5QVVRfRVJST1I6Ci0JCWNhc2UgTEtfS0JEX0xPQ0tFRDoKLQkJY2FzZSBMS19LQkRfVEVTVF9NT0RFX0FDSzoKLQkJY2FzZSBMS19QUkVGSVhfS0VZX0RPV046Ci0JCWNhc2UgTEtfTU9ERV9DSEFOR0VfQUNLOgotCQljYXNlIExLX1JFU1BPTlNFX1JFU0VSVkVEOgotCQkJREJHIChLRVJOX0lORk8gIkdvdCAlcyBhbmQgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLi4uXG4iLAotCQkJCQlyZXNwb25zZV9uYW1lIChkYXRhKSk7Ci0JCQlicmVhazsKKwljYXNlIExLX01FVFJPTk9NRToKKwljYXNlIExLX09VVFBVVF9FUlJPUjoKKwljYXNlIExLX0lOUFVUX0VSUk9SOgorCWNhc2UgTEtfS0JEX0xPQ0tFRDoKKwljYXNlIExLX0tCRF9URVNUX01PREVfQUNLOgorCWNhc2UgTEtfUFJFRklYX0tFWV9ET1dOOgorCWNhc2UgTEtfTU9ERV9DSEFOR0VfQUNLOgorCWNhc2UgTEtfUkVTUE9OU0VfUkVTRVJWRUQ6CisJCURCRyhLRVJOX0lORk8gIkdvdCAlcyBhbmQgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLi4uXG4iLAorCQkJcmVzcG9uc2VfbmFtZShkYXRhKSk7CisJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlpZiAobGstPmtleWNvZGVbZGF0YV0gIT0gS0VZX1JFU0VSVkVEKSB7Ci0JCQkJaWYgKCF0ZXN0X2JpdCAobGstPmtleWNvZGVbZGF0YV0sIGxrLT5kZXYtPmtleSkpCi0JCQkJCWlucHV0X3JlcG9ydF9rZXkgKGxrLT5kZXYsIGxrLT5rZXljb2RlW2RhdGFdLCAxKTsKLQkJCQllbHNlCi0JCQkJCWlucHV0X3JlcG9ydF9rZXkgKGxrLT5kZXYsIGxrLT5rZXljb2RlW2RhdGFdLCAwKTsKLQkJCQlpbnB1dF9zeW5jIChsay0+ZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IFVua25vd24ga2V5IHdpdGggIgotCQkJCQkJInNjYW5jb2RlIDB4JTAyeCBvbiAlcy5cbiIsCi0JCQkJCQlfX0ZJTEVfXywgZGF0YSwgbGstPm5hbWUpOworCWRlZmF1bHQ6CisJCWtleWNvZGUgPSBsay0+a2V5Y29kZVtkYXRhXTsKKwkJaWYgKGtleWNvZGUgIT0gS0VZX1JFU0VSVkVEKSB7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2Rldiwga2V5Y29kZSwKKwkJCQkJICF0ZXN0X2JpdChrZXljb2RlLCBpbnB1dF9kZXYtPmtleSkpOworCQkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSIlczogVW5rbm93biBrZXkgd2l0aCBzY2FuY29kZSAweCUwMnggb24gJXMuXG4iLAorCQkJCV9fRklMRV9fLCBkYXRhLCBsay0+bmFtZSk7CisJCX0KIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qCi0gKiBsa2tiZF9ldmVudCgpIGhhbmRsZXMgZXZlbnRzIGZyb20gdGhlIGlucHV0IG1vZHVsZS4KLSAqLwotc3RhdGljIGludAotbGtrYmRfZXZlbnQgKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLAotCQlpbnQgdmFsdWUpCitzdGF0aWMgdm9pZCBsa2tiZF90b2dnbGVfbGVkcyhzdHJ1Y3QgbGtrYmQgKmxrKQogewotCXN0cnVjdCBsa2tiZCAqbGsgPSBpbnB1dF9nZXRfZHJ2ZGF0YSAoZGV2KTsKKwlzdHJ1Y3Qgc2VyaW8gKnNlcmlvID0gbGstPnNlcmlvOwogCXVuc2lnbmVkIGNoYXIgbGVkc19vbiA9IDA7CiAJdW5zaWduZWQgY2hhciBsZWRzX29mZiA9IDA7CiAKKwlDSEVDS19MRUQobGssIGxlZHNfb24sIGxlZHNfb2ZmLCBMRURfQ0FQU0wsIExLX0xFRF9TSElGVExPQ0spOworCUNIRUNLX0xFRChsaywgbGVkc19vbiwgbGVkc19vZmYsIExFRF9DT01QT1NFLCBMS19MRURfQ09NUE9TRSk7CisJQ0hFQ0tfTEVEKGxrLCBsZWRzX29uLCBsZWRzX29mZiwgTEVEX1NDUk9MTEwsIExLX0xFRF9TQ1JPTExMT0NLKTsKKwlDSEVDS19MRUQobGssIGxlZHNfb24sIGxlZHNfb2ZmLCBMRURfU0xFRVAsIExLX0xFRF9XQUlUKTsKKwlpZiAobGVkc19vbiAhPSAwKSB7CisJCXNlcmlvX3dyaXRlKHNlcmlvLCBMS19DTURfTEVEX09OKTsKKwkJc2VyaW9fd3JpdGUoc2VyaW8sIGxlZHNfb24pOworCX0KKwlpZiAobGVkc19vZmYgIT0gMCkgeworCQlzZXJpb193cml0ZShzZXJpbywgTEtfQ01EX0xFRF9PRkYpOworCQlzZXJpb193cml0ZShzZXJpbywgbGVkc19vZmYpOworCX0KK30KKworc3RhdGljIHZvaWQgbGtrYmRfdG9nZ2xlX2tleWNsaWNrKHN0cnVjdCBsa2tiZCAqbGssIGJvb2wgb24pCit7CisJc3RydWN0IHNlcmlvICpzZXJpbyA9IGxrLT5zZXJpbzsKKworCWlmIChvbikgeworCQlEQkcoIiVzOiBBY3RpdmF0aW5nIGtleSBjbGlja3NcbiIsIF9fZnVuY19fKTsKKwkJc2VyaW9fd3JpdGUoc2VyaW8sIExLX0NNRF9FTkFCTEVfS0VZQ0xJQ0spOworCQlzZXJpb193cml0ZShzZXJpbywgdm9sdW1lX3RvX2h3KGxrLT5rZXljbGlja192b2x1bWUpKTsKKwkJc2VyaW9fd3JpdGUoc2VyaW8sIExLX0NNRF9FTkFCTEVfQ1RSQ0xJQ0spOworCQlzZXJpb193cml0ZShzZXJpbywgdm9sdW1lX3RvX2h3KGxrLT5jdHJsY2xpY2tfdm9sdW1lKSk7CisJfSBlbHNlIHsKKwkJREJHKCIlczogRGVhY3RpdmF0aW5nIGtleSBjbGlja3NcbiIsIF9fZnVuY19fKTsKKwkJc2VyaW9fd3JpdGUoc2VyaW8sIExLX0NNRF9ESVNBQkxFX0tFWUNMSUNLKTsKKwkJc2VyaW9fd3JpdGUoc2VyaW8sIExLX0NNRF9ESVNBQkxFX0NUUkNMSUNLKTsKKwl9CisKK30KKworLyoKKyAqIGxra2JkX2V2ZW50KCkgaGFuZGxlcyBldmVudHMgZnJvbSB0aGUgaW5wdXQgbW9kdWxlLgorICovCitzdGF0aWMgaW50IGxra2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCXVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQoreworCXN0cnVjdCBsa2tiZCAqbGsgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCiAJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgRVZfTEVEOgotCQkJQ0hFQ0tfTEVEIChsaywgbGVkc19vbiwgbGVkc19vZmYsIExFRF9DQVBTTCwgTEtfTEVEX1NISUZUTE9DSyk7Ci0JCQlDSEVDS19MRUQgKGxrLCBsZWRzX29uLCBsZWRzX29mZiwgTEVEX0NPTVBPU0UsIExLX0xFRF9DT01QT1NFKTsKLQkJCUNIRUNLX0xFRCAobGssIGxlZHNfb24sIGxlZHNfb2ZmLCBMRURfU0NST0xMTCwgTEtfTEVEX1NDUk9MTExPQ0spOwotCQkJQ0hFQ0tfTEVEIChsaywgbGVkc19vbiwgbGVkc19vZmYsIExFRF9TTEVFUCwgTEtfTEVEX1dBSVQpOwotCQkJaWYgKGxlZHNfb24gIT0gMCkgewotCQkJCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9MRURfT04pOwotCQkJCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIGxlZHNfb24pOwotCQkJfQotCQkJaWYgKGxlZHNfb2ZmICE9IDApIHsKLQkJCQlzZXJpb193cml0ZSAobGstPnNlcmlvLCBMS19DTURfTEVEX09GRik7Ci0JCQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgbGVkc19vZmYpOwotCQkJfQorCWNhc2UgRVZfTEVEOgorCQlsa2tiZF90b2dnbGVfbGVkcyhsayk7CisJCXJldHVybiAwOworCisJY2FzZSBFVl9TTkQ6CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIFNORF9DTElDSzoKKwkJCWxra2JkX3RvZ2dsZV9rZXljbGljayhsaywgdmFsdWUpOwogCQkJcmV0dXJuIDA7CiAKLQkJY2FzZSBFVl9TTkQ6Ci0JCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCQljYXNlIFNORF9DTElDSzoKLQkJCQkJaWYgKHZhbHVlID09IDApIHsKLQkJCQkJCURCRyAoIiVzOiBEZWFjdGl2YXRpbmcga2V5IGNsaWNrc1xuIiwgX19mdW5jX18pOwotCQkJCQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0RJU0FCTEVfS0VZQ0xJQ0spOwotCQkJCQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0RJU0FCTEVfQ1RSQ0xJQ0spOwotCQkJCQl9IGVsc2UgewotCQkJCQkJREJHICgiJXM6IEFjdGl2YXRpbmcga2V5IGNsaWNrc1xuIiwgX19mdW5jX18pOwotCQkJCQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0VOQUJMRV9LRVlDTElDSyk7Ci0JCQkJCQlzZXJpb193cml0ZSAobGstPnNlcmlvLCB2b2x1bWVfdG9faHcgKGxrLT5rZXljbGlja192b2x1bWUpKTsKLQkJCQkJCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfQ1RSQ0xJQ0spOwotCQkJCQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgdm9sdW1lX3RvX2h3IChsay0+Y3RybGNsaWNrX3ZvbHVtZSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiAwOworCQljYXNlIFNORF9CRUxMOgorCQkJaWYgKHZhbHVlICE9IDApCisJCQkJc2VyaW9fd3JpdGUobGstPnNlcmlvLCBMS19DTURfU09VTkRfQkVMTCk7CiAKLQkJCQljYXNlIFNORF9CRUxMOgotCQkJCQlpZiAodmFsdWUgIT0gMCkKLQkJCQkJCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9TT1VORF9CRUxMKTsKKwkJCXJldHVybiAwOworCQl9CiAKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlicmVhazsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCXByaW50ayAoS0VSTl9FUlIgIiVzICgpOiBHb3QgdW5rbm93biB0eXBlICVkLCBjb2RlICVkLCB2YWx1ZSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHR5cGUsIGNvZGUsIHZhbHVlKTsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIiVzKCk6IEdvdCB1bmtub3duIHR5cGUgJWQsIGNvZGUgJWQsIHZhbHVlICVkXG4iLAorCQkJX19mdW5jX18sIHR5cGUsIGNvZGUsIHZhbHVlKTsKIAl9CiAKIAlyZXR1cm4gLTE7CkBAIC01NzAsNzkgKzU3Niw1NiBAQAogICogbGtrYmRfcmVpbml0KCkgc2V0cyBsZWRzIGFuZCBiZWVwcyB0byBhIHN0YXRlIHRoZSBjb21wdXRlciByZW1lbWJlcnMgdGhleQogICogd2VyZSBpbi4KICAqLwotc3RhdGljIHZvaWQKLWxra2JkX3JlaW5pdCAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgbGtrYmRfcmVpbml0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgbGtrYmQgKmxrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsa2tiZCwgdHEpOwogCWludCBkaXZpc2lvbjsKLQl1bnNpZ25lZCBjaGFyIGxlZHNfb24gPSAwOwotCXVuc2lnbmVkIGNoYXIgbGVkc19vZmYgPSAwOwogCiAJLyogQXNrIGZvciBJRCAqLwotCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9SRVFVRVNUX0lEKTsKKwlzZXJpb193cml0ZShsay0+c2VyaW8sIExLX0NNRF9SRVFVRVNUX0lEKTsKIAogCS8qIFJlc2V0IHBhcmFtZXRlcnMgKi8KLQlzZXJpb193cml0ZSAobGstPnNlcmlvLCBMS19DTURfU0VUX0RFRkFVTFRTKTsKKwlzZXJpb193cml0ZShsay0+c2VyaW8sIExLX0NNRF9TRVRfREVGQVVMVFMpOwogCiAJLyogU2V0IExFRHMgKi8KLQlDSEVDS19MRUQgKGxrLCBsZWRzX29uLCBsZWRzX29mZiwgTEVEX0NBUFNMLCBMS19MRURfU0hJRlRMT0NLKTsKLQlDSEVDS19MRUQgKGxrLCBsZWRzX29uLCBsZWRzX29mZiwgTEVEX0NPTVBPU0UsIExLX0xFRF9DT01QT1NFKTsKLQlDSEVDS19MRUQgKGxrLCBsZWRzX29uLCBsZWRzX29mZiwgTEVEX1NDUk9MTEwsIExLX0xFRF9TQ1JPTExMT0NLKTsKLQlDSEVDS19MRUQgKGxrLCBsZWRzX29uLCBsZWRzX29mZiwgTEVEX1NMRUVQLCBMS19MRURfV0FJVCk7Ci0JaWYgKGxlZHNfb24gIT0gMCkgewotCQlzZXJpb193cml0ZSAobGstPnNlcmlvLCBMS19DTURfTEVEX09OKTsKLQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgbGVkc19vbik7Ci0JfQotCWlmIChsZWRzX29mZiAhPSAwKSB7Ci0JCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9MRURfT0ZGKTsKLQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgbGVkc19vZmYpOwotCX0KKwlsa2tiZF90b2dnbGVfbGVkcyhsayk7CiAKIAkvKgogCSAqIFRyeSB0byBhY3RpdmF0ZSBleHRlbmRlZCBMSzQwMSBtb2RlLiBUaGlzIGNvbW1hbmQgd2lsbAogCSAqIG9ubHkgd29yayB3aXRoIGEgTEs0MDEga2V5Ym9hcmQgYW5kIGdyYW50cyBhY2Nlc3MgdG8KIAkgKiBMQWx0LCBSQWx0LCBSQ29tcG9zZSBhbmQgUlNoaWZ0LgogCSAqLwotCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfTEs0MDEpOworCXNlcmlvX3dyaXRlKGxrLT5zZXJpbywgTEtfQ01EX0VOQUJMRV9MSzQwMSk7CiAKIAkvKiBTZXQgYWxsIGtleXMgdG8gVVBET1dOIG1vZGUgKi8KIAlmb3IgKGRpdmlzaW9uID0gMTsgZGl2aXNpb24gPD0gMTQ7IGRpdmlzaW9uKyspCi0JCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9TRVRfTU9ERSAoTEtfTU9ERV9VUERPV04sCi0JCQkJCWRpdmlzaW9uKSk7CisJCXNlcmlvX3dyaXRlKGxrLT5zZXJpbywKKwkJCSAgICBMS19DTURfU0VUX01PREUoTEtfTU9ERV9VUERPV04sIGRpdmlzaW9uKSk7CiAKIAkvKiBFbmFibGUgYmVsbCBhbmQgc2V0IHZvbHVtZSAqLwotCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfQkVMTCk7Ci0Jc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgdm9sdW1lX3RvX2h3IChsay0+YmVsbF92b2x1bWUpKTsKKwlzZXJpb193cml0ZShsay0+c2VyaW8sIExLX0NNRF9FTkFCTEVfQkVMTCk7CisJc2VyaW9fd3JpdGUobGstPnNlcmlvLCB2b2x1bWVfdG9faHcobGstPmJlbGxfdm9sdW1lKSk7CiAKIAkvKiBFbmFibGUvZGlzYWJsZSBrZXljbGljayAoYW5kIHBvc3NpYmx5IHNldCB2b2x1bWUpICovCi0JaWYgKHRlc3RfYml0IChTTkRfQ0xJQ0ssIGxrLT5kZXYtPnNuZCkpIHsKLQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0VOQUJMRV9LRVlDTElDSyk7Ci0JCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIHZvbHVtZV90b19odyAobGstPmtleWNsaWNrX3ZvbHVtZSkpOwotCQlzZXJpb193cml0ZSAobGstPnNlcmlvLCBMS19DTURfRU5BQkxFX0NUUkNMSUNLKTsKLQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgdm9sdW1lX3RvX2h3IChsay0+Y3RybGNsaWNrX3ZvbHVtZSkpOwotCX0gZWxzZSB7Ci0JCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9ESVNBQkxFX0tFWUNMSUNLKTsKLQkJc2VyaW9fd3JpdGUgKGxrLT5zZXJpbywgTEtfQ01EX0RJU0FCTEVfQ1RSQ0xJQ0spOwotCX0KKwlsa2tiZF90b2dnbGVfa2V5Y2xpY2sobGssIHRlc3RfYml0KFNORF9DTElDSywgbGstPmRldi0+c25kKSk7CiAKIAkvKiBTb3VuZCB0aGUgYmVsbCBpZiBuZWVkZWQgKi8KLQlpZiAodGVzdF9iaXQgKFNORF9CRUxMLCBsay0+ZGV2LT5zbmQpKQotCQlzZXJpb193cml0ZSAobGstPnNlcmlvLCBMS19DTURfU09VTkRfQkVMTCk7CisJaWYgKHRlc3RfYml0KFNORF9CRUxMLCBsay0+ZGV2LT5zbmQpKQorCQlzZXJpb193cml0ZShsay0+c2VyaW8sIExLX0NNRF9TT1VORF9CRUxMKTsKIH0KIAogLyoKICAqIGxra2JkX2Nvbm5lY3QoKSBwcm9iZXMgZm9yIGEgTEsga2V5Ym9hcmQgYW5kIGZpbGxzIHRoZSBuZWNlc3Nhcnkgc3RydWN0dXJlcy4KICAqLwotc3RhdGljIGludAotbGtrYmRfY29ubmVjdCAoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQorc3RhdGljIGludCBsa2tiZF9jb25uZWN0KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgbGtrYmQgKmxrOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgaTsKIAlpbnQgZXJyOwogCi0JbGsgPSBremFsbG9jIChzaXplb2YgKHN0cnVjdCBsa2tiZCksIEdGUF9LRVJORUwpOwotCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSAoKTsKKwlsayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsa2tiZCksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghbGsgfHwgIWlucHV0X2RldikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWwxOwpAQCAtNjUwLDE0ICs2MzMsMTQgQEAKIAogCWxrLT5zZXJpbyA9IHNlcmlvOwogCWxrLT5kZXYgPSBpbnB1dF9kZXY7Ci0JSU5JVF9XT1JLICgmbGstPnRxLCBsa2tiZF9yZWluaXQpOworCUlOSVRfV09SSygmbGstPnRxLCBsa2tiZF9yZWluaXQpOwogCWxrLT5iZWxsX3ZvbHVtZSA9IGJlbGxfdm9sdW1lOwogCWxrLT5rZXljbGlja192b2x1bWUgPSBrZXljbGlja192b2x1bWU7CiAJbGstPmN0cmxjbGlja192b2x1bWUgPSBjdHJsY2xpY2tfdm9sdW1lOwotCW1lbWNweSAobGstPmtleWNvZGUsIGxra2JkX2tleWNvZGUsIHNpemVvZiAobGtfa2V5Y29kZV90KSAqIExLX05VTV9LRVlDT0RFUyk7CisJbWVtY3B5KGxrLT5rZXljb2RlLCBsa2tiZF9rZXljb2RlLCBzaXplb2YobGstPmtleWNvZGUpKTsKIAotCXN0cmxjcHkgKGxrLT5uYW1lLCAiREVDIExLIGtleWJvYXJkIiwgc2l6ZW9mKGxrLT5uYW1lKSk7Ci0Jc25wcmludGYgKGxrLT5waHlzLCBzaXplb2YobGstPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCXN0cmxjcHkobGstPm5hbWUsICJERUMgTEsga2V5Ym9hcmQiLCBzaXplb2YobGstPm5hbWUpKTsKKwlzbnByaW50Zihsay0+cGh5cywgc2l6ZW9mKGxrLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9IGxrLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyA9IGxrLT5waHlzOwpAQCAtNjY4LDYyICs2NTEsNjEgQEAKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKIAlpbnB1dF9kZXYtPmV2ZW50ID0gbGtrYmRfZXZlbnQ7CiAKLQlpbnB1dF9zZXRfZHJ2ZGF0YSAoaW5wdXRfZGV2LCBsayk7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBsayk7CiAKLQlzZXRfYml0IChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOwotCXNldF9iaXQgKEVWX0xFRCwgaW5wdXRfZGV2LT5ldmJpdCk7Ci0Jc2V0X2JpdCAoRVZfU05ELCBpbnB1dF9kZXYtPmV2Yml0KTsKLQlzZXRfYml0IChFVl9SRVAsIGlucHV0X2Rldi0+ZXZiaXQpOwotCXNldF9iaXQgKExFRF9DQVBTTCwgaW5wdXRfZGV2LT5sZWRiaXQpOwotCXNldF9iaXQgKExFRF9TTEVFUCwgaW5wdXRfZGV2LT5sZWRiaXQpOwotCXNldF9iaXQgKExFRF9DT01QT1NFLCBpbnB1dF9kZXYtPmxlZGJpdCk7Ci0Jc2V0X2JpdCAoTEVEX1NDUk9MTEwsIGlucHV0X2Rldi0+bGVkYml0KTsKLQlzZXRfYml0IChTTkRfQkVMTCwgaW5wdXRfZGV2LT5zbmRiaXQpOwotCXNldF9iaXQgKFNORF9DTElDSywgaW5wdXRfZGV2LT5zbmRiaXQpOworCV9fc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOworCV9fc2V0X2JpdChFVl9MRUQsIGlucHV0X2Rldi0+ZXZiaXQpOworCV9fc2V0X2JpdChFVl9TTkQsIGlucHV0X2Rldi0+ZXZiaXQpOworCV9fc2V0X2JpdChFVl9SRVAsIGlucHV0X2Rldi0+ZXZiaXQpOworCV9fc2V0X2JpdChMRURfQ0FQU0wsIGlucHV0X2Rldi0+bGVkYml0KTsKKwlfX3NldF9iaXQoTEVEX1NMRUVQLCBpbnB1dF9kZXYtPmxlZGJpdCk7CisJX19zZXRfYml0KExFRF9DT01QT1NFLCBpbnB1dF9kZXYtPmxlZGJpdCk7CisJX19zZXRfYml0KExFRF9TQ1JPTExMLCBpbnB1dF9kZXYtPmxlZGJpdCk7CisJX19zZXRfYml0KFNORF9CRUxMLCBpbnB1dF9kZXYtPnNuZGJpdCk7CisJX19zZXRfYml0KFNORF9DTElDSywgaW5wdXRfZGV2LT5zbmRiaXQpOwogCiAJaW5wdXRfZGV2LT5rZXljb2RlID0gbGstPmtleWNvZGU7Ci0JaW5wdXRfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZiAobGtfa2V5Y29kZV90KTsKLQlpbnB1dF9kZXYtPmtleWNvZGVtYXggPSBMS19OVU1fS0VZQ09ERVM7CisJaW5wdXRfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZihsay0+a2V5Y29kZVswXSk7CisJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShsay0+a2V5Y29kZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTEtfTlVNX0tFWUNPREVTOyBpKyspCi0JCV9fc2V0X2JpdCAobGstPmtleWNvZGVbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKKwkJX19zZXRfYml0KGxrLT5rZXljb2RlW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJX19jbGVhcl9iaXQoS0VZX1JFU0VSVkVELCBpbnB1dF9kZXYtPmtleWJpdCk7CiAKLQlzZXJpb19zZXRfZHJ2ZGF0YSAoc2VyaW8sIGxrKTsKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgbGspOwogCi0JZXJyID0gc2VyaW9fb3BlbiAoc2VyaW8sIGRydik7CisJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWwyOwogCi0JZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlIChsay0+ZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobGstPmRldik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsMzsKIAotCXNlcmlvX3dyaXRlIChsay0+c2VyaW8sIExLX0NNRF9QT1dFUkNZQ0xFX1JFU0VUKTsKKwlzZXJpb193cml0ZShsay0+c2VyaW8sIExLX0NNRF9QT1dFUkNZQ0xFX1JFU0VUKTsKIAogCXJldHVybiAwOwogCi0gZmFpbDM6CXNlcmlvX2Nsb3NlIChzZXJpbyk7Ci0gZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhIChzZXJpbywgTlVMTCk7Ci0gZmFpbDE6CWlucHV0X2ZyZWVfZGV2aWNlIChpbnB1dF9kZXYpOwotCWtmcmVlIChsayk7CisgZmFpbDM6CXNlcmlvX2Nsb3NlKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworIGZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGxrKTsKIAlyZXR1cm4gZXJyOwogfQogCiAvKgogICogbGtrYmRfZGlzY29ubmVjdCgpIHVucmVnaXN0ZXJzIGFuZCBjbG9zZXMgYmVoaW5kIHVzLgogICovCi1zdGF0aWMgdm9pZAotbGtrYmRfZGlzY29ubmVjdCAoc3RydWN0IHNlcmlvICpzZXJpbykKK3N0YXRpYyB2b2lkIGxra2JkX2Rpc2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKLQlzdHJ1Y3QgbGtrYmQgKmxrID0gc2VyaW9fZ2V0X2RydmRhdGEgKHNlcmlvKTsKKwlzdHJ1Y3QgbGtrYmQgKmxrID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOwogCi0JaW5wdXRfZ2V0X2RldmljZSAobGstPmRldik7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UgKGxrLT5kZXYpOwotCXNlcmlvX2Nsb3NlIChzZXJpbyk7Ci0Jc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9wdXRfZGV2aWNlIChsay0+ZGV2KTsKLQlrZnJlZSAobGspOworCWlucHV0X2dldF9kZXZpY2UobGstPmRldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UobGstPmRldik7CisJc2VyaW9fY2xvc2Uoc2VyaW8pOworCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKwlpbnB1dF9wdXRfZGV2aWNlKGxrLT5kZXYpOworCWtmcmVlKGxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzZXJpb19kZXZpY2VfaWQgbGtrYmRfc2VyaW9faWRzW10gPSB7CkBAIC03NTIsMTggKzczNCwxNiBAQAogLyoKICAqIFRoZSBmdW5jdGlvbnMgZm9yIGluc2VyaW5nL3JlbW92aW5nIHVzIGFzIGEgbW9kdWxlLgogICovCi1zdGF0aWMgaW50IF9faW5pdAotbGtrYmRfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGxra2JkX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZsa2tiZF9kcnYpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWxra2JkX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgbGtrYmRfZXhpdCh2b2lkKQogewogCXNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZsa2tiZF9kcnYpOwogfQogCi1tb2R1bGVfaW5pdCAobGtrYmRfaW5pdCk7Ci1tb2R1bGVfZXhpdCAobGtrYmRfZXhpdCk7Cittb2R1bGVfaW5pdChsa2tiZF9pbml0KTsKK21vZHVsZV9leGl0KGxra2JkX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL21hdHJpeF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCmluZGV4IDkxY2ZlNTEuLjM0ZjRhMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCkBAIC0yMTMsOCArMjEzLDkgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBtYXRyaXhfa2V5cGFkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBtYXRyaXhfa2V5cGFkX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgbWF0cml4X2tleXBhZCAqa2V5cGFkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOwogCWludCBpOwpAQCAtMjI4LDggKzIyOSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWF0cml4X2tleXBhZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgbWF0cml4X2tleXBhZF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgbWF0cml4X2tleXBhZCAqa2V5cGFkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOwogCWludCBpOwpAQCAtMjQyLDkgKzI0NCw5IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jZGVmaW5lIG1hdHJpeF9rZXlwYWRfc3VzcGVuZAlOVUxMCi0jZGVmaW5lIG1hdHJpeF9rZXlwYWRfcmVzdW1lCU5VTEwKKworc3RhdGljIGNvbnN0IFNJTVBMRV9ERVZfUE1fT1BTKG1hdHJpeF9rZXlwYWRfcG1fb3BzLAorCQkJCW1hdHJpeF9rZXlwYWRfc3VzcGVuZCwgbWF0cml4X2tleXBhZF9yZXN1bWUpOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfbWF0cml4X2dwaW8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKQEAgLTQxNywxMSArNDE5LDEyIEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYXRyaXhfa2V5cGFkX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gbWF0cml4X2tleXBhZF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1hdHJpeF9rZXlwYWRfcmVtb3ZlKSwKLQkuc3VzcGVuZAk9IG1hdHJpeF9rZXlwYWRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IG1hdHJpeF9rZXlwYWRfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJtYXRyaXgta2V5cGFkIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZtYXRyaXhfa2V5cGFkX3BtX29wcywKKyNlbmRpZgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NoX2tleXNjLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NoX2tleXNjLmMKaW5kZXggODg3YWY3OS4uMDc2MTExZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zaF9rZXlzYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc2hfa2V5c2MuYwpAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NoX2tleXNjLmg+CiAKICNkZWZpbmUgS1lDUjFfT0ZGUyAgIDB4MDAKICNkZWZpbmUgS1lDUjJfT0ZGUyAgIDB4MDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKaW5kZXggYTliYjI1NC4uMTZlYzUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKQEAgLTgwLDYgKzgwLDcgQEAKIAl0cmlzdGF0ZSAieDg2IFdpc3Ryb24gbGFwdG9wIGJ1dHRvbiBpbnRlcmZhY2UiCiAJZGVwZW5kcyBvbiBYODYgJiYgIVg4Nl82NAogCXNlbGVjdCBJTlBVVF9QT0xMREVWCisJc2VsZWN0IElOUFVUX1NQQVJTRUtNQVAKIAlzZWxlY3QgTkVXX0xFRFMKIAlzZWxlY3QgTEVEU19DTEFTUwogCXNlbGVjdCBDSEVDS19TSUdOQVRVUkUKQEAgLTI4MSw2ICsyODIsNyBAQAogY29uZmlnIElOUFVUX0RNMzU1RVZNCiAJdHJpc3RhdGUgIlRJIERhVmluY2kgRE0zNTUgRVZNIEtleXBhZCBhbmQgSVIgUmVtb3RlIgogCWRlcGVuZHMgb24gTUZEX0RNMzU1RVZNX01TUAorCXNlbGVjdCBJTlBVVF9TUEFSU0VLTUFQCiAJaGVscAogCSAgU3VwcG9ydHMgdGhlIHB1c2hidXR0b25zIGFuZCBJUiByZW1vdGUgdXNlZCB3aXRoCiAJICB0aGUgRE0zNTUgRVZNIGJvYXJkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlLmMKaW5kZXggZTI5MGZkZS4uNjE0YjY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYXRpX3JlbW90ZS5jCkBAIC03NjYsNyArNzY2LDcgQEAKIAlhdGlfcmVtb3RlLT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiAKIAl1c2JfbWFrZV9wYXRoKHVkZXYsIGF0aV9yZW1vdGUtPnBoeXMsIHNpemVvZihhdGlfcmVtb3RlLT5waHlzKSk7Ci0Jc3RybGNweShhdGlfcmVtb3RlLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihhdGlfcmVtb3RlLT5waHlzKSk7CisJc3RybGNhdChhdGlfcmVtb3RlLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihhdGlfcmVtb3RlLT5waHlzKSk7CiAKIAlpZiAodWRldi0+bWFudWZhY3R1cmVyKQogCQlzdHJsY3B5KGF0aV9yZW1vdGUtPm5hbWUsIHVkZXYtPm1hbnVmYWN0dXJlciwgc2l6ZW9mKGF0aV9yZW1vdGUtPm5hbWUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9kbTM1NWV2bV9rZXlzLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvZG0zNTVldm1fa2V5cy5jCmluZGV4IGYyYjY3ZGMuLjc2NmMwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9kbTM1NWV2bV9rZXlzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2RtMzU1ZXZtX2tleXMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NwYXJzZS1rZXltYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIApAQCAtMzMsMTIgKzM0LDggQEAKIAlpbnQJCQlpcnE7CiB9OwogCi0vKiBUaGVzZSBpbml0aWFsIGtleWNvZGVzIGNhbiBiZSByZW1hcHBlZCBieSBkbTM1NWV2bV9zZXRrZXljb2RlKCkuICovCi1zdGF0aWMgc3RydWN0IHsKLQl1MTYJZXZlbnQ7Ci0JdTE2CWtleWNvZGU7Ci19IGRtMzU1ZXZtX2tleXNbXSA9IHsKLQorLyogVGhlc2UgaW5pdGlhbCBrZXljb2RlcyBjYW4gYmUgcmVtYXBwZWQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5IGRtMzU1ZXZtX2tleXNbXSA9IHsKIAkvKgogCSAqIFB1c2hidXR0b25zIG9uIHRoZSBFVk0gYm9hcmQgLi4uIG5vdGUgdGhhdCB0aGUgbGFiZWxzIGZvciB0aGVzZQogCSAqIGFyZSBTVzEwL1NXMTEvZXRjIG9uIHRoZSBQQyBib2FyZC4gIFRoZSBsZWZ0L3JpZ2h0IG9yaWVudGF0aW9uCkBAIC00NywxMSArNDQsMTEgQEAKIAkgKiBpcyB0byB0aGUgcmlnaHQuICAoVGhhdCBpcywgcm90YXRlIHRoZSBib2FyZCBjb3VudGVyLWNsb2Nrd2lzZQogCSAqIGJ5IDkwIGRlZ3JlZXMgZnJvbSB0aGUgU1cxMC9ldGMgYW5kICJETTM1NSBFVk0iIGxhYmVscy4pCiAJICovCi0JeyAweDAwZDgsIEtFWV9PSywgfSwJCS8qIFNXMTIgKi8KLQl7IDB4MDBiOCwgS0VZX1VQLCB9LAkJLyogU1cxMyAqLwotCXsgMHgwMGU4LCBLRVlfRE9XTiwgfSwJCS8qIFNXMTEgKi8KLQl7IDB4MDA3OCwgS0VZX0xFRlQsIH0sCQkvKiBTVzE0ICovCi0JeyAweDAwZjAsIEtFWV9SSUdIVCwgfSwJCS8qIFNXMTAgKi8KKwl7IEtFX0tFWSwgMHgwMGQ4LCB7IEtFWV9PSyB9IH0sCQkvKiBTVzEyICovCisJeyBLRV9LRVksIDB4MDBiOCwgeyBLRVlfVVAgfSB9LAkJLyogU1cxMyAqLworCXsgS0VfS0VZLCAweDAwZTgsIHsgS0VZX0RPV04gfSB9LAkvKiBTVzExICovCisJeyBLRV9LRVksIDB4MDA3OCwgeyBLRVlfTEVGVCB9IH0sCS8qIFNXMTQgKi8KKwl7IEtFX0tFWSwgMHgwMGYwLCB7IEtFWV9SSUdIVCB9IH0sCS8qIFNXMTAgKi8KIAogCS8qCiAJICogSVIgYnV0dG9ucyAuLi4gY29kZXMgYXNzaWduZWQgdG8gbWF0Y2ggdGhlIHVuaXZlcnNhbCByZW1vdGUKQEAgLTY1LDM1ICs2MiwzNSBAQAogCSAqIFJDNSBjb2RlcyBhcmUgMTQgYml0cywgd2l0aCB0d28gc3RhcnQgYml0cyAoMHgzIHByZWZpeCkKIAkgKiBhbmQgYSB0b2dnbGUgYml0IChtYXNrZWQgb3V0IGJlbG93KS4KIAkgKi8KLQl7IDB4MzAwYywgS0VZX1BPV0VSLCB9LAkJLyogTk9URTogZG9jcyBvbWl0IHRoaXMgKi8KLQl7IDB4MzAwMCwgS0VZX05VTUVSSUNfMCwgfSwKLQl7IDB4MzAwMSwgS0VZX05VTUVSSUNfMSwgfSwKLQl7IDB4MzAwMiwgS0VZX05VTUVSSUNfMiwgfSwKLQl7IDB4MzAwMywgS0VZX05VTUVSSUNfMywgfSwKLQl7IDB4MzAwNCwgS0VZX05VTUVSSUNfNCwgfSwKLQl7IDB4MzAwNSwgS0VZX05VTUVSSUNfNSwgfSwKLQl7IDB4MzAwNiwgS0VZX05VTUVSSUNfNiwgfSwKLQl7IDB4MzAwNywgS0VZX05VTUVSSUNfNywgfSwKLQl7IDB4MzAwOCwgS0VZX05VTUVSSUNfOCwgfSwKLQl7IDB4MzAwOSwgS0VZX05VTUVSSUNfOSwgfSwKLQl7IDB4MzAyMiwgS0VZX0VOVEVSLCB9LAotCXsgMHgzMGVjLCBLRVlfTU9ERSwgfSwJCS8qICJ0di92Y3IvLi4uIiAqLwotCXsgMHgzMDBmLCBLRVlfU0VMRUNULCB9LAkvKiAiaW5mbyIgKi8KLQl7IDB4MzAyMCwgS0VZX0NIQU5ORUxVUCwgfSwJLyogInVwIiAqLwotCXsgMHgzMDJlLCBLRVlfTUVOVSwgfSwJCS8qICJpbi9vdXQiICovCi0JeyAweDMwMTEsIEtFWV9WT0xVTUVET1dOLCB9LAkvKiAibGVmdCIgKi8KLQl7IDB4MzAwZCwgS0VZX01VVEUsIH0sCQkvKiAib2siICovCi0JeyAweDMwMTAsIEtFWV9WT0xVTUVVUCwgfSwJLyogInJpZ2h0IiAqLwotCXsgMHgzMDFlLCBLRVlfU1VCVElUTEUsIH0sCS8qICJjYyIgKi8KLQl7IDB4MzAyMSwgS0VZX0NIQU5ORUxET1dOLCB9LAkvKiAiZG93biIgKi8KLQl7IDB4MzAyMiwgS0VZX1BSRVZJT1VTLCB9LAotCXsgMHgzMDI2LCBLRVlfU0xFRVAsIH0sCi0JeyAweDMxNzIsIEtFWV9SRVdJTkQsIH0sCS8qIE5PVEU6IGRvY3Mgd3JvbmdseSBzYXkgMHgzMGNhICovCi0JeyAweDMxNzUsIEtFWV9QTEFZLCB9LAotCXsgMHgzMTc0LCBLRVlfRkFTVEZPUldBUkQsIH0sCi0JeyAweDMxNzcsIEtFWV9SRUNPUkQsIH0sCi0JeyAweDMxNzYsIEtFWV9TVE9QLCB9LAotCXsgMHgzMTY5LCBLRVlfUEFVU0UsIH0sCisJeyBLRV9LRVksIDB4MzAwYywgeyBLRVlfUE9XRVIgfSB9LAkvKiBOT1RFOiBkb2NzIG9taXQgdGhpcyAqLworCXsgS0VfS0VZLCAweDMwMDAsIHsgS0VZX05VTUVSSUNfMCB9IH0sCisJeyBLRV9LRVksIDB4MzAwMSwgeyBLRVlfTlVNRVJJQ18xIH0gfSwKKwl7IEtFX0tFWSwgMHgzMDAyLCB7IEtFWV9OVU1FUklDXzIgfSB9LAorCXsgS0VfS0VZLCAweDMwMDMsIHsgS0VZX05VTUVSSUNfMyB9IH0sCisJeyBLRV9LRVksIDB4MzAwNCwgeyBLRVlfTlVNRVJJQ180IH0gfSwKKwl7IEtFX0tFWSwgMHgzMDA1LCB7IEtFWV9OVU1FUklDXzUgfSB9LAorCXsgS0VfS0VZLCAweDMwMDYsIHsgS0VZX05VTUVSSUNfNiB9IH0sCisJeyBLRV9LRVksIDB4MzAwNywgeyBLRVlfTlVNRVJJQ183IH0gfSwKKwl7IEtFX0tFWSwgMHgzMDA4LCB7IEtFWV9OVU1FUklDXzggfSB9LAorCXsgS0VfS0VZLCAweDMwMDksIHsgS0VZX05VTUVSSUNfOSB9IH0sCisJeyBLRV9LRVksIDB4MzAyMiwgeyBLRVlfRU5URVIgfSB9LAorCXsgS0VfS0VZLCAweDMwZWMsIHsgS0VZX01PREUgfSB9LAkvKiAidHYvdmNyLy4uLiIgKi8KKwl7IEtFX0tFWSwgMHgzMDBmLCB7IEtFWV9TRUxFQ1QgfSB9LAkvKiAiaW5mbyIgKi8KKwl7IEtFX0tFWSwgMHgzMDIwLCB7IEtFWV9DSEFOTkVMVVAgfSB9LAkvKiAidXAiICovCisJeyBLRV9LRVksIDB4MzAyZSwgeyBLRVlfTUVOVSB9IH0sCS8qICJpbi9vdXQiICovCisJeyBLRV9LRVksIDB4MzAxMSwgeyBLRVlfVk9MVU1FRE9XTiB9IH0sCS8qICJsZWZ0IiAqLworCXsgS0VfS0VZLCAweDMwMGQsIHsgS0VZX01VVEUgfSB9LAkvKiAib2siICovCisJeyBLRV9LRVksIDB4MzAxMCwgeyBLRVlfVk9MVU1FVVAgfSB9LAkvKiAicmlnaHQiICovCisJeyBLRV9LRVksIDB4MzAxZSwgeyBLRVlfU1VCVElUTEUgfSB9LAkvKiAiY2MiICovCisJeyBLRV9LRVksIDB4MzAyMSwgeyBLRVlfQ0hBTk5FTERPV04gfSB9LC8qICJkb3duIiAqLworCXsgS0VfS0VZLCAweDMwMjIsIHsgS0VZX1BSRVZJT1VTIH0gfSwKKwl7IEtFX0tFWSwgMHgzMDI2LCB7IEtFWV9TTEVFUCB9IH0sCisJeyBLRV9LRVksIDB4MzE3MiwgeyBLRVlfUkVXSU5EIH0gfSwJLyogTk9URTogZG9jcyB3cm9uZ2x5IHNheSAweDMwY2EgKi8KKwl7IEtFX0tFWSwgMHgzMTc1LCB7IEtFWV9QTEFZIH0gfSwKKwl7IEtFX0tFWSwgMHgzMTc0LCB7IEtFWV9GQVNURk9SV0FSRCB9IH0sCisJeyBLRV9LRVksIDB4MzE3NywgeyBLRVlfUkVDT1JEIH0gfSwKKwl7IEtFX0tFWSwgMHgzMTc2LCB7IEtFWV9TVE9QIH0gfSwKKwl7IEtFX0tFWSwgMHgzMTY5LCB7IEtFWV9QQVVTRSB9IH0sCiB9OwogCiAvKgpAQCAtMTA1LDE5ICsxMDIsMTggQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IGRtMzU1ZXZtX2tleXNfaXJxKGludCBpcnEsIHZvaWQgKl9rZXlzKQogewotCXN0cnVjdCBkbTM1NWV2bV9rZXlzCSprZXlzID0gX2tleXM7Ci0JaW50CQkJc3RhdHVzOworCXN0YXRpYyB1MTYgbGFzdF9ldmVudDsKKwlzdHJ1Y3QgZG0zNTVldm1fa2V5cyAqa2V5cyA9IF9rZXlzOworCWNvbnN0IHN0cnVjdCBrZXlfZW50cnkgKmtlOworCXVuc2lnbmVkIGludCBrZXljb2RlOworCWludCBzdGF0dXM7CisJdTE2IGV2ZW50OwogCiAJLyogRm9yIHNpbXBsaWNpdHkgd2UgaWdub3JlIElOUFVUX0NPVU5UIGFuZCBqdXN0IHJlYWQKIAkgKiBldmVudHMgdW50aWwgd2UgZ2V0IHRoZSAicXVldWUgZW1wdHkiIGluZGljYXRvci4KIAkgKiBSZWFkaW5nIElOUFVUX0xPVyBkZWNyZW1lbnRzIHRoZSBjb3VudC4KIAkgKi8KIAlmb3IgKDs7KSB7Ci0JCXN0YXRpYyB1MTYJbGFzdF9ldmVudDsKLQkJdTE2CQlldmVudDsKLQkJaW50CQlrZXljb2RlOwotCQlpbnQJCWk7Ci0KIAkJc3RhdHVzID0gZG0zNTVldm1fbXNwX3JlYWQoRE0zNTVFVk1fTVNQX0lOUFVUX0hJR0gpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJZGV2X2RiZyhrZXlzLT5kZXYsICJpbnB1dCBoaWdoIGVyciAlZFxuIiwKQEAgLTE1NiwxNCArMTUyLDkgQEAKIAkJLyogaWdub3JlIHRoZSBSQzUgdG9nZ2xlIGJpdCAqLwogCQlldmVudCAmPSB+MHgwODAwOwogCi0JCS8qIGZpbmQgdGhlIGtleSwgb3IgbGVhdmUgaXQgYXMgdW5rbm93biAqLwotCQlrZXljb2RlID0gS0VZX1VOS05PV047Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRtMzU1ZXZtX2tleXMpOyBpKyspIHsKLQkJCWlmIChkbTM1NWV2bV9rZXlzW2ldLmV2ZW50ICE9IGV2ZW50KQotCQkJCWNvbnRpbnVlOwotCQkJa2V5Y29kZSA9IGRtMzU1ZXZtX2tleXNbaV0ua2V5Y29kZTsKLQkJCWJyZWFrOwotCQl9CisJCS8qIGZpbmQgdGhlIGtleSwgb3IgcmVwb3J0IGl0IGFzIHVua25vd24gKi8KKwkJa2UgPSBzcGFyc2Vfa2V5bWFwX2VudHJ5X2Zyb21fc2NhbmNvZGUoa2V5cy0+aW5wdXQsIGV2ZW50KTsKKwkJa2V5Y29kZSA9IGtlID8ga2UtPmtleWNvZGUgOiBLRVlfVU5LTk9XTjsKIAkJZGV2X2RiZyhrZXlzLT5kZXYsCiAJCQkiaW5wdXQgZXZlbnQgMHglMDR4LS0+IGtleWNvZGUgJWRcbiIsCiAJCQlldmVudCwga2V5Y29kZSk7CkBAIC0xNzQsMzggKzE2NSwxMCBAQAogCQlpbnB1dF9yZXBvcnRfa2V5KGtleXMtPmlucHV0LCBrZXljb2RlLCAwKTsKIAkJaW5wdXRfc3luYyhrZXlzLT5pbnB1dCk7CiAJfQorCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IGRtMzU1ZXZtX3NldGtleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgaW5kZXgsIGludCBrZXljb2RlKQotewotCXUxNgkJb2xkX2tleWNvZGU7Ci0JdW5zaWduZWQJaTsKLQotCWlmICgoKHVuc2lnbmVkKWluZGV4KSA+PSBBUlJBWV9TSVpFKGRtMzU1ZXZtX2tleXMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9sZF9rZXljb2RlID0gZG0zNTVldm1fa2V5c1tpbmRleF0ua2V5Y29kZTsKLQlkbTM1NWV2bV9rZXlzW2luZGV4XS5rZXljb2RlID0ga2V5Y29kZTsKLQlzZXRfYml0KGtleWNvZGUsIGRldi0+a2V5Yml0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRtMzU1ZXZtX2tleXMpOyBpKyspIHsKLQkJaWYgKGRtMzU1ZXZtX2tleXNbaW5kZXhdLmtleWNvZGUgPT0gb2xkX2tleWNvZGUpCi0JCQlnb3RvIGRvbmU7Ci0JfQotCWNsZWFyX2JpdChvbGRfa2V5Y29kZSwgZGV2LT5rZXliaXQpOwotZG9uZToKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbTM1NWV2bV9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IGluZGV4LCBpbnQgKmtleWNvZGUpCi17Ci0JaWYgKCgodW5zaWduZWQpaW5kZXgpID49IEFSUkFZX1NJWkUoZG0zNTVldm1fa2V5cykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGRtMzU1ZXZtX2tleXNbaW5kZXhdLmtleWNvZGU7Ci19Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRtMzU1ZXZtX2tleXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTIxMyw3ICsxNzYsNiBAQAogCXN0cnVjdCBkbTM1NWV2bV9rZXlzCSprZXlzOwogCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0OwogCWludAkJCXN0YXR1czsKLQlpbnQJCQlpOwogCiAJLyogYWxsb2NhdGUgaW5zdGFuY2Ugc3RydWN0IGFuZCBpbnB1dCBkZXYgKi8KIAlrZXlzID0ga3phbGxvYyhzaXplb2YgKmtleXMsIEdGUF9LRVJORUwpOwpAQCAtMjQyLDMxICsyMDQsMzAgQEAKIAlpbnB1dC0+aWQucHJvZHVjdCA9IDB4MDM1NTsKIAlpbnB1dC0+aWQudmVyc2lvbiA9IGRtMzU1ZXZtX21zcF9yZWFkKERNMzU1RVZNX01TUF9GSVJNUkVWKTsKIAotCWlucHV0LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRtMzU1ZXZtX2tleXMpOyBpKyspCi0JCV9fc2V0X2JpdChkbTM1NWV2bV9rZXlzW2ldLmtleWNvZGUsIGlucHV0LT5rZXliaXQpOwotCi0JaW5wdXQtPnNldGtleWNvZGUgPSBkbTM1NWV2bV9zZXRrZXljb2RlOwotCWlucHV0LT5nZXRrZXljb2RlID0gZG0zNTVldm1fZ2V0a2V5Y29kZTsKKwlzdGF0dXMgPSBzcGFyc2Vfa2V5bWFwX3NldHVwKGlucHV0LCBkbTM1NWV2bV9rZXlzLCBOVUxMKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZhaWwxOwogCiAJLyogUkVWSVNJVDogIGZsdXNoIHRoZSBldmVudCBxdWV1ZT8gKi8KIAogCXN0YXR1cyA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGtleXMtPmlycSwgTlVMTCwgZG0zNTVldm1fa2V5c19pcnEsCiAJCQlJUlFGX1RSSUdHRVJfRkFMTElORywgZGV2X25hbWUoJnBkZXYtPmRldiksIGtleXMpOwogCWlmIChzdGF0dXMgPCAwKQotCQlnb3RvIGZhaWwxOworCQlnb3RvIGZhaWwyOwogCiAJLyogcmVnaXN0ZXIgKi8KIAlzdGF0dXMgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOwogCWlmIChzdGF0dXMgPCAwKQotCQlnb3RvIGZhaWwyOworCQlnb3RvIGZhaWwzOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwga2V5cyk7CiAKIAlyZXR1cm4gMDsKIAotZmFpbDI6CitmYWlsMzoKIAlmcmVlX2lycShrZXlzLT5pcnEsIGtleXMpOworZmFpbDI6CisJc3BhcnNlX2tleW1hcF9mcmVlKGlucHV0KTsKIGZhaWwxOgogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKIAlrZnJlZShrZXlzKTsKQEAgLTI4MCw2ICsyNDEsNyBAQAogCXN0cnVjdCBkbTM1NWV2bV9rZXlzCSprZXlzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlmcmVlX2lycShrZXlzLT5pcnEsIGtleXMpOworCXNwYXJzZV9rZXltYXBfZnJlZShrZXlzLT5pbnB1dCk7CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoa2V5cy0+aW5wdXQpOwogCWtmcmVlKGtleXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2hwX3NkY19ydGMuYwppbmRleCBlYTgyMWI1Li5hZDczMGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMKQEAgLTM1LDcgKzM1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hwX3NkYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQwOSw3ICs0MDgsNiBAQAogCiBzdGF0aWMgaW50IGhwX3NkY19ydGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQljeWNsZV9rZXJuZWxfbG9jaygpOwogICAgICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3Bvd2VybWF0ZS5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3Bvd2VybWF0ZS5jCmluZGV4IGE1M2M0ODguLjY2ODkxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wb3dlcm1hdGUuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcG93ZXJtYXRlLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCXBtLT5pbnB1dCA9IGlucHV0X2RldjsKIAogCXVzYl9tYWtlX3BhdGgodWRldiwgcG0tPnBoeXMsIHNpemVvZihwbS0+cGh5cykpOwotCXN0cmxjcHkocG0tPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKHBtLT5waHlzKSk7CisJc3RybGNhdChwbS0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YocG0tPnBoeXMpKTsKIAogCXNwaW5fbG9ja19pbml0KCZwbS0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYwppbmRleCBhOTMyMTc5Li4zOGRhNmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mvd2lzdHJvbl9idG5zLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0LXBvbGxkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjI0LDE5ICsyMjUsOCBAQAogCiAvKiBIYXJkd2FyZSBkYXRhYmFzZSAqLwogCi1zdHJ1Y3Qga2V5X2VudHJ5IHsKLQljaGFyIHR5cGU7CQkvKiBTZWUgS0VfKiBiZWxvdyAqLwotCXU4IGNvZGU7Ci0JdW5pb24gewotCQl1MTYga2V5Y29kZTsJCS8qIEZvciBLRV9LRVkgKi8KLQkJc3RydWN0IHsJCS8qIEZvciBLRV9TVyAqLwotCQkJdTggY29kZTsKLQkJCXU4IHZhbHVlOwotCQl9IHN3OwotCX07Ci19OwotCi1lbnVtIHsgS0VfRU5ELCBLRV9LRVksIEtFX1NXLCBLRV9XSUZJLCBLRV9CTFVFVE9PVEggfTsKKyNkZWZpbmUgS0VfV0lGSQkJKEtFX0xBU1QgKyAxKQorI2RlZmluZSBLRV9CTFVFVE9PVEgJKEtFX0xBU1QgKyAyKQogCiAjZGVmaW5lIEZFX01BSUxfTEVEIDB4MDEKICNkZWZpbmUgRkVfV0lGSV9MRUQgMHgwMgpAQCAtNjQ0LDEwICs2MzQsMTAgQEAKICAqIGEgbGlzdCBvZiBidXR0b25zIGFuZCB0aGVpciBrZXkgY29kZXMgKHJlcG9ydGVkIHdoZW4gbG9hZGluZyB0aGlzIG1vZHVsZQogICogd2l0aCBmb3JjZT0xKSBhbmQgdGhlIG91dHB1dCBvZiBkbWlkZWNvZGUgdG8gJE1PRFVMRV9BVVRIT1IuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBkbWlfaWRzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRjb25zdCBkbWlfaWRzW10gPSB7CiAJeworCQkvKiBGdWppdHN1LVNpZW1lbnMgQW1pbG8gUHJvIFYyMDAwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIEFtaWxvIFBybyBWMjAwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFNSUxPIFBybyBWMjAwMCIpLApAQCAtNjU1LDggKzY0NSw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9mc19hbWlsb19wcm9fdjIwMDAKIAl9LAogCXsKKwkJLyogRnVqaXRzdS1TaWVtZW5zIEFtaWxvIFBybyBFZGl0aW9uIFYzNTA1ICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIEFtaWxvIFBybyBFZGl0aW9uIFYzNTA1IiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQU1JTE8gUHJvIEVkaXRpb24gVjM1MDUiKSwKQEAgLTY2NCw4ICs2NTQsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfZnNfYW1pbG9fcHJvX3YzNTA1CiAJfSwKIAl7CisJCS8qIEZ1aml0c3UtU2llbWVucyBBbWlsbyBNNzQwMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkZ1aml0c3UtU2llbWVucyBBbWlsbyBNNzQwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFNSUxPIE0gICAgICAgICIpLApAQCAtNjczLDggKzY2Myw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9mc19hbWlsb19wcm9fdjIwMDAKIAl9LAogCXsKKwkJLyogTWF4ZGF0YSBQcm8gNzAwMCBEWCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIk1heGRhdGEgUHJvIDcwMDAgRFgiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1BWERBVEEiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUHJvIDcwMDAiKSwKQEAgLTY4Miw4ICs2NzIsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfZnNfYW1pbG9fcHJvX3YyMDAwCiAJfSwKIAl7CisJCS8qIEZ1aml0c3UgTjM1MTAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJGdWppdHN1IE4zNTEwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk4zNTEwIiksCkBAIC02OTEsOCArNjgxLDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2Z1aml0c3VfbjM1MTAKIAl9LAogCXsKKwkJLyogQWNlciBBc3BpcmUgMTUwMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDE1MDAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDE1MDAiKSwKQEAgLTcwMCw4ICs2OTAsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl9hc3BpcmVfMTUwMAogCX0sCiAJeworCQkvKiBBY2VyIEFzcGlyZSAxNjAwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBBc3BpcmUgMTYwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBc3BpcmUgMTYwMCIpLApAQCAtNzA5LDggKzY5OSw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9hY2VyX2FzcGlyZV8xNjAwCiAJfSwKIAl7CisJCS8qIEFjZXIgQXNwaXJlIDMwMjAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJBY2VyIEFzcGlyZSAzMDIwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSAzMDIwIiksCkBAIC03MTgsOCArNzA4LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfYXNwaXJlXzUwMjAKIAl9LAogCXsKKwkJLyogQWNlciBBc3BpcmUgNTAyMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDUwMjAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDUwMjAiKSwKQEAgLTcyNyw4ICs3MTcsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl9hc3BpcmVfNTAyMAogCX0sCiAJeworCQkvKiBBY2VyIFRyYXZlbE1hdGUgMjEwMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAyMTAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMjEwMCIpLApAQCAtNzM2LDggKzcyNiw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9hY2VyX2FzcGlyZV81MDIwCiAJfSwKIAl7CisJCS8qIEFjZXIgVHJhdmVsTWF0ZSAyNDEwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDI0MTAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAyNDEwIiksCkBAIC03NDUsOCArNzM1LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV8yNDEwCiAJfSwKIAl7CisJCS8qIEFjZXIgVHJhdmVsTWF0ZSBDMzAwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIEMzMDAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSBDMzAwIiksCkBAIC03NTQsOCArNzQ0LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV8zMDAKIAl9LAogCXsKKwkJLyogQWNlciBUcmF2ZWxNYXRlIEMxMDAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgQzEwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIEMxMDAiKSwKQEAgLTc2Myw4ICs3NTMsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl90cmF2ZWxtYXRlXzMwMAogCX0sCiAJeworCQkvKiBBY2VyIFRyYXZlbE1hdGUgQzExMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSBDMTEwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgQzExMCIpLApAQCAtNzcyLDggKzc2Miw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9hY2VyX3RyYXZlbG1hdGVfMTEwCiAJfSwKIAl7CisJCS8qIEFjZXIgVHJhdmVsTWF0ZSAzODAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgMzgwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMzgwIiksCkBAIC03ODEsOCArNzcxLDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV8zODAKIAl9LAogCXsKKwkJLyogQWNlciBUcmF2ZWxNYXRlIDM3MCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAzNzAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAzNzAiKSwKQEAgLTc5MCw4ICs3ODAsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl90cmF2ZWxtYXRlXzM4MCAvKiBrZXlib2FyZCBtaW51cyAxIGtleSAqLwogCX0sCiAJeworCQkvKiBBY2VyIFRyYXZlbE1hdGUgMjIwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDIyMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDIyMCIpLApAQCAtNzk5LDggKzc4OSw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9hY2VyX3RyYXZlbG1hdGVfMjIwCiAJfSwKIAl7CisJCS8qIEFjZXIgVHJhdmVsTWF0ZSAyNjAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgMjYwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMjYwIiksCkBAIC04MDgsOCArNzk4LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV8yMjAKIAl9LAogCXsKKwkJLyogQWNlciBUcmF2ZWxNYXRlIDIzMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAyMzAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAyMzAiKSwKQEAgLTgxOCw4ICs4MDgsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl90cmF2ZWxtYXRlXzIzMAogCX0sCiAJeworCQkvKiBBY2VyIFRyYXZlbE1hdGUgMjgwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDI4MCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDI4MCIpLApAQCAtODI3LDggKzgxNyw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9hY2VyX3RyYXZlbG1hdGVfMjMwCiAJfSwKIAl7CisJCS8qIEFjZXIgVHJhdmVsTWF0ZSAyNDAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgMjQwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMjQwIiksCkBAIC04MzYsOCArODI2LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV8yNDAKIAl9LAogCXsKKwkJLyogQWNlciBUcmF2ZWxNYXRlIDI1MCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAyNTAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAyNTAiKSwKQEAgLTg0NSw4ICs4MzUsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl90cmF2ZWxtYXRlXzI0MAogCX0sCiAJeworCQkvKiBBY2VyIFRyYXZlbE1hdGUgMjQyNE5XWENpICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDI0MjROV1hDaSIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDI0MjAiKSwKQEAgLTg1NCw4ICs4NDQsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl90cmF2ZWxtYXRlXzI0MAogCX0sCiAJeworCQkvKiBBY2VyIFRyYXZlbE1hdGUgMzUwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDM1MCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDM1MCIpLApAQCAtODYzLDggKzg1Myw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9hY2VyX3RyYXZlbG1hdGVfMzUwCiAJfSwKIAl7CisJCS8qIEFjZXIgVHJhdmVsTWF0ZSAzNjAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgMzYwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMzYwIiksCkBAIC04NzIsOCArODYyLDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV8zNjAKIAl9LAogCXsKKwkJLyogQWNlciBUcmF2ZWxNYXRlIDYxMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSA2MTAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFDRVIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSA2MTAiKSwKQEAgLTg4MSw4ICs4NzEsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl90cmF2ZWxtYXRlXzYxMAogCX0sCiAJeworCQkvKiBBY2VyIFRyYXZlbE1hdGUgNjIwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDYyMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDYyMCIpLApAQCAtODkwLDggKzg4MCw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF9hY2VyX3RyYXZlbG1hdGVfNjMwCiAJfSwKIAl7CisJCS8qIEFjZXIgVHJhdmVsTWF0ZSA2MzAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgNjMwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgNjMwIiksCkBAIC04OTksOCArODg5LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV82MzAKIAl9LAogCXsKKwkJLyogQU9wZW4gMTU1OUFTICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiQU9wZW4gMTU1OUFTIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkUyVSIpLAogCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiRTJVIiksCkBAIC05MDgsOCArODk4LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FvcGVuXzE1NTlhcwogCX0sCiAJeworCQkvKiBNZWRpb24gTUQgOTc4MyAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIk1lZGlvbiBNRCA5NzgzIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNRURJT05OQiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNRCA5NzgzIiksCkBAIC05MTcsOCArOTA3LDggQEAKIAkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX3dpc3Ryb25fbXMyMTExCiAJfSwKIAl7CisJCS8qIE1lZGlvbiBNRCA0MDEwMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIk1lZGlvbiBNRCA0MDEwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTUVESU9OTkIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV0lEMjAwMCIpLApAQCAtOTI2LDggKzkxNiw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IGtleW1hcF93aXN0cm9uX21kNDAxMDAKIAl9LAogCXsKKwkJLyogTWVkaW9uIE1EIDI5MDAgKi8KIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCi0JCS5pZGVudCA9ICJNZWRpb24gTUQgMjkwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTUVESU9OTkIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV0lNIDIwMDAiKSwKQEAgLTkzNSw4ICs5MjUsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfd2lzdHJvbl9tZDI5MDAKIAl9LAogCXsKKwkJLyogTWVkaW9uIE1EIDQyMjAwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiTWVkaW9uIE1EIDQyMjAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNZWRpb24iKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV0lNIDIwMzAiKSwKQEAgLTk0NCw4ICs5MzQsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfZnNfYW1pbG9fcHJvX3YyMDAwCiAJfSwKIAl7CisJCS8qIE1lZGlvbiBNRCA5NjUwMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIk1lZGlvbiBNRCA5NjUwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTUVESU9OUEMiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV0lNIDIwNDAiKSwKQEAgLTk1Myw4ICs5NDMsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfd2lzdHJvbl9tZDk2NTAwCiAJfSwKIAl7CisJCS8qIE1lZGlvbiBNRCA5NTQwMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIk1lZGlvbiBNRCA5NTQwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTUVESU9OUEMiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV0lNIDIwNTAiKSwKQEAgLTk2Miw4ICs5NTIsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfd2lzdHJvbl9tZDk2NTAwCiAJfSwKIAl7CisJCS8qIEZ1aml0c3UgU2llbWVucyBBbWlsbyBENzgyMCAqLwogCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKLQkJLmlkZW50ID0gIkZ1aml0c3UgU2llbWVucyBBbWlsbyBENzgyMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksIC8qIG5vdCBzdXJlICovCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFtaWxvIEQiKSwKQEAgLTk3MSw4ICs5NjEsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfZnNfYW1pbG9fZDg4eDAKIAl9LAogCXsKKwkJLyogRnVqaXRzdSBTaWVtZW5zIEFtaWxvIEQ4OHgwICovCiAJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAotCQkuaWRlbnQgPSAiRnVqaXRzdSBTaWVtZW5zIEFtaWxvIEQ4OHgwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQU1JTE8gRCIpLApAQCAtMTAzNywyMSArMTAyNyw2IEBACiBzdGF0aWMgYm9vbCB3aWZpX2VuYWJsZWQ7CiBzdGF0aWMgYm9vbCBibHVldG9vdGhfZW5hYmxlZDsKIAotc3RhdGljIHZvaWQgcmVwb3J0X2tleShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBrZXljb2RlKQotewotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXljb2RlLCAxKTsKLQlpbnB1dF9zeW5jKGRldik7Ci0JaW5wdXRfcmVwb3J0X2tleShkZXYsIGtleWNvZGUsIDApOwotCWlucHV0X3N5bmMoZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgcmVwb3J0X3N3aXRjaChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCi17Ci0JaW5wdXRfcmVwb3J0X3N3aXRjaChkZXYsIGNvZGUsIHZhbHVlKTsKLQlpbnB1dF9zeW5jKGRldik7Ci19Ci0KLQogIC8qIGxlZCBtYW5hZ2VtZW50ICovCiBzdGF0aWMgdm9pZCB3aXN0cm9uX21haWxfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKIAkJCQllbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQpAQCAtMTEyOCw0MyArMTEwMywxMyBAQAogCQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZ3aXN0cm9uX3dpZmlfbGVkKTsKIH0KIAotc3RhdGljIHN0cnVjdCBrZXlfZW50cnkgKndpc3Ryb25fZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKGludCBjb2RlKQotewotCXN0cnVjdCBrZXlfZW50cnkgKmtleTsKLQotCWZvciAoa2V5ID0ga2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykKLQkJaWYgKGNvZGUgPT0ga2V5LT5jb2RlKQotCQkJcmV0dXJuIGtleTsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGtleV9lbnRyeSAqd2lzdHJvbl9nZXRfZW50cnlfYnlfa2V5Y29kZShpbnQga2V5Y29kZSkKLXsKLQlzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7Ci0KLQlmb3IgKGtleSA9IGtleW1hcDsga2V5LT50eXBlICE9IEtFX0VORDsga2V5KyspCi0JCWlmIChrZXktPnR5cGUgPT0gS0VfS0VZICYmIGtleWNvZGUgPT0ga2V5LT5rZXljb2RlKQotCQkJcmV0dXJuIGtleTsKLQotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgdm9pZCBoYW5kbGVfa2V5KHU4IGNvZGUpCiB7Ci0JY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2V5ID0gd2lzdHJvbl9nZXRfZW50cnlfYnlfc2NhbmNvZGUoY29kZSk7CisJY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2V5ID0KKwkJc3BhcnNlX2tleW1hcF9lbnRyeV9mcm9tX3NjYW5jb2RlKHdpc3Ryb25faWRldi0+aW5wdXQsIGNvZGUpOwogCiAJaWYgKGtleSkgewogCQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCQljYXNlIEtFX0tFWToKLQkJCXJlcG9ydF9rZXkod2lzdHJvbl9pZGV2LT5pbnB1dCwga2V5LT5rZXljb2RlKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgS0VfU1c6Ci0JCQlyZXBvcnRfc3dpdGNoKHdpc3Ryb25faWRldi0+aW5wdXQsCi0JCQkJICAgICAga2V5LT5zdy5jb2RlLCBrZXktPnN3LnZhbHVlKTsKLQkJCWJyZWFrOwotCiAJCWNhc2UgS0VfV0lGSToKIAkJCWlmIChoYXZlX3dpZmkpIHsKIAkJCQl3aWZpX2VuYWJsZWQgPSAhd2lmaV9lbmFibGVkOwpAQCAtMTE4MCw3ICsxMTI1LDkgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKKwkJCXNwYXJzZV9rZXltYXBfcmVwb3J0X2VudHJ5KHdpc3Ryb25faWRldi0+aW5wdXQsCisJCQkJCQkgICBrZXksIDEsIHRydWUpOworCQkJYnJlYWs7CiAJCX0KIAkJamlmZmllc19sYXN0X3ByZXNzID0gamlmZmllczsKIAl9IGVsc2UKQEAgLTEyMjAsNDIgKzExNjcsMzkgQEAKIAkJZGV2LT5wb2xsX2ludGVydmFsID0gUE9MTF9JTlRFUlZBTF9ERUZBVUxUOwogfQogCi1zdGF0aWMgaW50IHdpc3Ryb25fZ2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50ICprZXljb2RlKQorc3RhdGljIGludCBfX2RldmluaXQgd2lzdHJvbl9zZXR1cF9rZXltYXAoc3RydWN0IGlucHV0X2RldiAqZGV2LAorCQkJCQkgIHN0cnVjdCBrZXlfZW50cnkgKmVudHJ5KQogewotCWNvbnN0IHN0cnVjdCBrZXlfZW50cnkgKmtleSA9IHdpc3Ryb25fZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKHNjYW5jb2RlKTsKKwlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CiAKLQlpZiAoa2V5ICYmIGtleS0+dHlwZSA9PSBLRV9LRVkpIHsKLQkJKmtleWNvZGUgPSBrZXktPmtleWNvZGU7Ci0JCXJldHVybiAwOworCS8qIGlmIHdpZmkgb3IgYmx1ZXRvb3RoIGFyZSBub3QgYXZhaWxhYmxlLCBjcmVhdGUgbm9ybWFsIGtleXMgKi8KKwljYXNlIEtFX1dJRkk6CisJCWlmICghaGF2ZV93aWZpKSB7CisJCQllbnRyeS0+dHlwZSA9IEtFX0tFWTsKKwkJCWVudHJ5LT5rZXljb2RlID0gS0VZX1dMQU47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEtFX0JMVUVUT09USDoKKwkJaWYgKCFoYXZlX2JsdWV0b290aCkgeworCQkJZW50cnktPnR5cGUgPSBLRV9LRVk7CisJCQllbnRyeS0+a2V5Y29kZSA9IEtFWV9CTFVFVE9PVEg7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEtFX0VORDoKKwkJaWYgKGVudHJ5LT5jb2RlICYgRkVfVU5URVNURUQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbnRlc3RlZCBsYXB0b3AgbXVsdGltZWRpYSBrZXlzLCAiCisJCQkJInBsZWFzZSByZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlIHRvICIKKwkJCQkiZXJpYy5waWVsQHRyZW1wbGluLXV0Yy5uZXRcbiIpOworCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCB3aXN0cm9uX3NldGtleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc2NhbmNvZGUsIGludCBrZXljb2RlKQotewotCXN0cnVjdCBrZXlfZW50cnkgKmtleTsKLQlpbnQgb2xkX2tleWNvZGU7Ci0KLQlpZiAoa2V5Y29kZSA8IDAgfHwga2V5Y29kZSA+IEtFWV9NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Ja2V5ID0gd2lzdHJvbl9nZXRfZW50cnlfYnlfc2NhbmNvZGUoc2NhbmNvZGUpOwotCWlmIChrZXkgJiYga2V5LT50eXBlID09IEtFX0tFWSkgewotCQlvbGRfa2V5Y29kZSA9IGtleS0+a2V5Y29kZTsKLQkJa2V5LT5rZXljb2RlID0ga2V5Y29kZTsKLQkJc2V0X2JpdChrZXljb2RlLCBkZXYtPmtleWJpdCk7Ci0JCWlmICghd2lzdHJvbl9nZXRfZW50cnlfYnlfa2V5Y29kZShvbGRfa2V5Y29kZSkpCi0JCQljbGVhcl9iaXQob2xkX2tleWNvZGUsIGRldi0+a2V5Yml0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNldHVwX2lucHV0X2Rldih2b2lkKQogewotCXN0cnVjdCBrZXlfZW50cnkgKmtleTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAJaW50IGVycm9yOwogCkBAIC0xMjYzLDcgKzEyMDcsNyBAQAogCWlmICghd2lzdHJvbl9pZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXdpc3Ryb25faWRldi0+Zmx1c2ggPSB3aXN0cm9uX2ZsdXNoOworCXdpc3Ryb25faWRldi0+b3BlbiA9IHdpc3Ryb25fZmx1c2g7CiAJd2lzdHJvbl9pZGV2LT5wb2xsID0gd2lzdHJvbl9wb2xsOwogCXdpc3Ryb25faWRldi0+cG9sbF9pbnRlcnZhbCA9IFBPTExfSU5URVJWQUxfREVGQVVMVDsKIApAQCAtMTI3Myw1NiArMTIxNywyMSBAQAogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwogCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZ3aXN0cm9uX2RldmljZS0+ZGV2OwogCi0JaW5wdXRfZGV2LT5nZXRrZXljb2RlID0gd2lzdHJvbl9nZXRrZXljb2RlOwotCWlucHV0X2Rldi0+c2V0a2V5Y29kZSA9IHdpc3Ryb25fc2V0a2V5Y29kZTsKLQotCWZvciAoa2V5ID0ga2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykgewotCQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCQkJY2FzZSBLRV9LRVk6Ci0JCQkJc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOwotCQkJCXNldF9iaXQoa2V5LT5rZXljb2RlLCBpbnB1dF9kZXYtPmtleWJpdCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgS0VfU1c6Ci0JCQkJc2V0X2JpdChFVl9TVywgaW5wdXRfZGV2LT5ldmJpdCk7Ci0JCQkJc2V0X2JpdChrZXktPnN3LmNvZGUsIGlucHV0X2Rldi0+c3diaXQpOwotCQkJCWJyZWFrOwotCi0JCQkvKiBpZiB3aWZpIG9yIGJsdWV0b290aCBhcmUgbm90IGF2YWlsYWJsZSwgY3JlYXRlIG5vcm1hbCBrZXlzICovCi0JCQljYXNlIEtFX1dJRkk6Ci0JCQkJaWYgKCFoYXZlX3dpZmkpIHsKLQkJCQkJa2V5LT50eXBlID0gS0VfS0VZOwotCQkJCQlrZXktPmtleWNvZGUgPSBLRVlfV0xBTjsKLQkJCQkJa2V5LS07Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIEtFX0JMVUVUT09USDoKLQkJCQlpZiAoIWhhdmVfYmx1ZXRvb3RoKSB7Ci0JCQkJCWtleS0+dHlwZSA9IEtFX0tFWTsKLQkJCQkJa2V5LT5rZXljb2RlID0gS0VZX0JMVUVUT09USDsKLQkJCQkJa2V5LS07Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogcmVhZHMgaW5mb3JtYXRpb24gZmxhZ3Mgb24gS0VfRU5EICovCi0JaWYgKGtleS0+Y29kZSAmIEZFX1VOVEVTVEVEKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbnRlc3RlZCBsYXB0b3AgbXVsdGltZWRpYSBrZXlzLCAiCi0JCQkicGxlYXNlIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgdG8gZXJpYy5waWVsIgotCQkJIkB0cmVtcGxpbi11dGMubmV0XG4iKTsKKwllcnJvciA9IHNwYXJzZV9rZXltYXBfc2V0dXAoaW5wdXRfZGV2LCBrZXltYXAsIHdpc3Ryb25fc2V0dXBfa2V5bWFwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfZGV2OwogCiAJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKHdpc3Ryb25faWRldik7Ci0JaWYgKGVycm9yKSB7Ci0JCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZSh3aXN0cm9uX2lkZXYpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQorCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9rZXltYXA7CiAKIAlyZXR1cm4gMDsKKworIGVycl9mcmVlX2tleW1hcDoKKwlzcGFyc2Vfa2V5bWFwX2ZyZWUoaW5wdXRfZGV2KTsKKyBlcnJfZnJlZV9kZXY6CisJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKHdpc3Ryb25faWRldik7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKiBEcml2ZXIgY29yZSAqLwpAQCAtMTM3MSw2ICsxMjgwLDcgQEAKIHsKIAl3aXN0cm9uX2xlZF9yZW1vdmUoKTsKIAlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2Uod2lzdHJvbl9pZGV2KTsKKwlzcGFyc2Vfa2V5bWFwX2ZyZWUod2lzdHJvbl9pZGV2LT5pbnB1dCk7CiAJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKHdpc3Ryb25faWRldik7CiAJYmlvc19kZXRhY2goKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwppbmRleCBmMzYxMTA2Li5hM2Y0OTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwpAQCAtMjgsMTMgKzI4LDE2IEBACiAjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAotI2RlZmluZSBBTFBTX0RVQUxQT0lOVAkweDAxCi0jZGVmaW5lIEFMUFNfV0hFRUwJMHgwMgotI2RlZmluZSBBTFBTX0ZXX0JLXzEJMHgwNAotI2RlZmluZSBBTFBTXzRCVE4JMHgwOAotI2RlZmluZSBBTFBTX09MRFBST1RPCTB4MTAKLSNkZWZpbmUgQUxQU19QQVNTCTB4MjAKLSNkZWZpbmUgQUxQU19GV19CS18yCTB4NDAKKworI2RlZmluZSBBTFBTX09MRFBST1RPCQkweDAxCS8qIG9sZCBzdHlsZSBpbnB1dCAqLworI2RlZmluZSBBTFBTX0RVQUxQT0lOVAkJMHgwMgkvKiB0b3VjaHBhZCBoYXMgdHJhY2tzdGljayAqLworI2RlZmluZSBBTFBTX1BBU1MJCTB4MDQJLyogZGV2aWNlIGhhcyBhIHBhc3MtdGhyb3VnaCBwb3J0ICovCisKKyNkZWZpbmUgQUxQU19XSEVFTAkJMHgwOAkvKiBoYXJkd2FyZSB3aGVlbCBwcmVzZW50ICovCisjZGVmaW5lIEFMUFNfRldfQktfMQkJMHgxMAkvKiBmcm9udCAmIGJhY2sgYnV0dG9ucyBwcmVzZW50ICovCisjZGVmaW5lIEFMUFNfRldfQktfMgkJMHgyMAkvKiBmcm9udCAmIGJhY2sgYnV0dG9ucyBwcmVzZW50ICovCisjZGVmaW5lIEFMUFNfRk9VUl9CVVRUT05TCTB4NDAJLyogNCBkaXJlY3Rpb24gYnV0dG9uIHByZXNlbnQgKi8KKwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFscHNfbW9kZWxfaW5mbyBhbHBzX21vZGVsX2RhdGFbXSA9IHsKIAl7IHsgMHgzMiwgMHgwMiwgMHgxNCB9LAkweGY4LCAweGY4LCBBTFBTX1BBU1MgfCBBTFBTX0RVQUxQT0lOVCB9LCAvKiBUb3NoaWJhIFNhbGVsbGl0ZSBQcm8gTTEwICovCkBAIC01Niw3ICs1OSw3IEBACiAJeyB7IDB4MjIsIDB4MDIsIDB4MGEgfSwJMHhmOCwgMHhmOCwgQUxQU19QQVNTIHwgQUxQU19EVUFMUE9JTlQgfSwKIAl7IHsgMHgyMiwgMHgwMiwgMHgxNCB9LCAweGZmLCAweGZmLCBBTFBTX1BBU1MgfCBBTFBTX0RVQUxQT0lOVCB9LCAvKiBEZWxsIExhdGl0dWRlIEQ2MDAgKi8KIAl7IHsgMHg2MiwgMHgwMiwgMHgxNCB9LCAweGNmLCAweGNmLCBBTFBTX1BBU1MgfCBBTFBTX0RVQUxQT0lOVCB9LCAvKiBEZWxsIExhdGl0dWRlIEU2NTAwICovCi0JeyB7IDB4NzMsIDB4MDIsIDB4NTAgfSwgMHhjZiwgMHhjZiwgQUxQU19GV19CS18xIH0sCQkgIC8qIERlbGwgVm9zdHJvIDE0MDAgKi8KKwl7IHsgMHg3MywgMHgwMiwgMHg1MCB9LCAweGNmLCAweGNmLCBBTFBTX0ZPVVJfQlVUVE9OUyB9LAkgIC8qIERlbGwgVm9zdHJvIDE0MDAgKi8KIH07CiAKIC8qCkBAIC04Myw2ICs4Niw3IEBACiBzdGF0aWMgdm9pZCBhbHBzX3Byb2Nlc3NfcGFja2V0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCXN0cnVjdCBhbHBzX2RhdGEgKnByaXYgPSBwc21vdXNlLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCBhbHBzX21vZGVsX2luZm8gKm1vZGVsID0gcHJpdi0+aTsKIAl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OwogCXN0cnVjdCBpbnB1dF9kZXYgKmRldjIgPSBwcml2LT5kZXYyOwpAQCAtMTAxLDcgKzEwNSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAocHJpdi0+aS0+ZmxhZ3MgJiBBTFBTX09MRFBST1RPKSB7CisJaWYgKG1vZGVsLT5mbGFncyAmIEFMUFNfT0xEUFJPVE8pIHsKIAkJbGVmdCA9IHBhY2tldFsyXSAmIDB4MTA7CiAJCXJpZ2h0ID0gcGFja2V0WzJdICYgMHgwODsKIAkJbWlkZGxlID0gMDsKQEAgLTExNywxMiArMTIxLDEyIEBACiAJCXogPSBwYWNrZXRbNV07CiAJfQogCi0JaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19GV19CS18xKSB7CisJaWYgKG1vZGVsLT5mbGFncyAmIEFMUFNfRldfQktfMSkgewogCQliYWNrID0gcGFja2V0WzBdICYgMHgxMDsKIAkJZm9yd2FyZCA9IHBhY2tldFsyXSAmIDQ7CiAJfQogCi0JaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19GV19CS18yKSB7CisJaWYgKG1vZGVsLT5mbGFncyAmIEFMUFNfRldfQktfMikgewogCQliYWNrID0gcGFja2V0WzNdICYgNDsKIAkJZm9yd2FyZCA9IHBhY2tldFsyXSAmIDQ7CiAJCWlmICgobWlkZGxlID0gZm9yd2FyZCAmJiBiYWNrKSkKQEAgLTEzMiw3ICsxMzYsNyBAQAogCWdlcyA9IHBhY2tldFsyXSAmIDE7CiAJZmluID0gcGFja2V0WzJdICYgMjsKIAotCWlmICgocHJpdi0+aS0+ZmxhZ3MgJiBBTFBTX0RVQUxQT0lOVCkgJiYgeiA9PSAxMjcpIHsKKwlpZiAoKG1vZGVsLT5mbGFncyAmIEFMUFNfRFVBTFBPSU5UKSAmJiB6ID09IDEyNykgewogCQlpbnB1dF9yZXBvcnRfcmVsKGRldjIsIFJFTF9YLCAgKHggPiAzODMgPyAoeCAtIDc2OCkgOiB4KSk7CiAJCWlucHV0X3JlcG9ydF9yZWwoZGV2MiwgUkVMX1ksIC0oeSA+IDI1NSA/ICh5IC0gNTEyKSA6IHkpKTsKIApAQCAtMTUwLDcgKzE1NCw4IEBACiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIG1pZGRsZSk7CiAKIAkvKiBDb252ZXJ0IGhhcmR3YXJlIHRhcCB0byBhIHJlYXNvbmFibGUgWiB2YWx1ZSAqLwotCWlmIChnZXMgJiYgIWZpbikgeiA9IDQwOworCWlmIChnZXMgJiYgIWZpbikKKwkJeiA9IDQwOwogCiAJLyoKIAkgKiBBICJ0YXAgYW5kIGRyYWciIG9wZXJhdGlvbiBpcyByZXBvcnRlZCBieSB0aGUgaGFyZHdhcmUgYXMgYSB0cmFuc2l0aW9uCkBAIC0xNjYsOCArMTcxLDEwIEBACiAJfQogCXByaXYtPnByZXZfZmluID0gZmluOwogCi0JaWYgKHogPiAzMCkgaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgMSk7Ci0JaWYgKHogPCAyNSkgaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgMCk7CisJaWYgKHogPiAzMCkKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgMSk7CisJaWYgKHogPCAyNSkKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgMCk7CiAKIAlpZiAoeiA+IDApIHsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCB4KTsKQEAgLTE3NywxNCArMTg0LDIxIEBACiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgeik7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0ZJTkdFUiwgeiA+IDApOwogCi0JaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19XSEVFTCkKKwlpZiAobW9kZWwtPmZsYWdzICYgQUxQU19XSEVFTCkKIAkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgKChwYWNrZXRbMl0gPDwgMSkgJiAweDA4KSAtICgocGFja2V0WzBdID4+IDQpICYgMHgwNykpOwogCi0JaWYgKHByaXYtPmktPmZsYWdzICYgKEFMUFNfRldfQktfMSB8IEFMUFNfRldfQktfMikpIHsKKwlpZiAobW9kZWwtPmZsYWdzICYgKEFMUFNfRldfQktfMSB8IEFMUFNfRldfQktfMikpIHsKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCBmb3J3YXJkKTsKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CQUNLLCBiYWNrKTsKIAl9CiAKKwlpZiAobW9kZWwtPmZsYWdzICYgQUxQU19GT1VSX0JVVFRPTlMpIHsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8wLCBwYWNrZXRbMl0gJiA0KTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8xLCBwYWNrZXRbMF0gJiAweDEwKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8yLCBwYWNrZXRbM10gJiA0KTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8zLCBwYWNrZXRbMF0gJiAweDIwKTsKKwl9CisKIAlpbnB1dF9zeW5jKGRldik7CiB9CiAKQEAgLTM5MywxNSArNDA3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxwc19od19pbml0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBpbnQgKnZlcnNpb24pCitzdGF0aWMgaW50IGFscHNfaHdfaW5pdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKIHsKIAlzdHJ1Y3QgYWxwc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwljb25zdCBzdHJ1Y3QgYWxwc19tb2RlbF9pbmZvICptb2RlbCA9IHByaXYtPmk7CiAKLQlwcml2LT5pID0gYWxwc19nZXRfbW9kZWwocHNtb3VzZSwgdmVyc2lvbik7Ci0JaWYgKCFwcml2LT5pKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoKHByaXYtPmktPmZsYWdzICYgQUxQU19QQVNTKSAmJgorCWlmICgobW9kZWwtPmZsYWdzICYgQUxQU19QQVNTKSAmJgogCSAgICBhbHBzX3Bhc3N0aHJvdWdoX21vZGUocHNtb3VzZSwgdHJ1ZSkpIHsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQxNiw3ICs0MjcsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKChwcml2LT5pLT5mbGFncyAmIEFMUFNfUEFTUykgJiYKKwlpZiAoKG1vZGVsLT5mbGFncyAmIEFMUFNfUEFTUykgJiYKIAkgICAgYWxwc19wYXNzdGhyb3VnaF9tb2RlKHBzbW91c2UsIGZhbHNlKSkgewogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNDMyLDEyICs0NDMsMTUgQEAKIAogc3RhdGljIGludCBhbHBzX3JlY29ubmVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKIHsKKwljb25zdCBzdHJ1Y3QgYWxwc19tb2RlbF9pbmZvICptb2RlbDsKKwogCXBzbW91c2VfcmVzZXQocHNtb3VzZSk7CiAKLQlpZiAoYWxwc19od19pbml0KHBzbW91c2UsIE5VTEwpKQorCW1vZGVsID0gYWxwc19nZXRfbW9kZWwocHNtb3VzZSwgTlVMTCk7CisJaWYgKCFtb2RlbCkKIAkJcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGFscHNfaHdfaW5pdChwc21vdXNlKTsKIH0KIAogc3RhdGljIHZvaWQgYWxwc19kaXNjb25uZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQpAQCAtNDUyLDYgKzQ2Niw3IEBACiBpbnQgYWxwc19pbml0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCXN0cnVjdCBhbHBzX2RhdGEgKnByaXY7CisJY29uc3Qgc3RydWN0IGFscHNfbW9kZWxfaW5mbyAqbW9kZWw7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2MSA9IHBzbW91c2UtPmRldiwgKmRldjI7CiAJaW50IHZlcnNpb247CiAKQEAgLTQ2MywzMyArNDc4LDQ4IEBACiAJcHJpdi0+ZGV2MiA9IGRldjI7CiAJcHNtb3VzZS0+cHJpdmF0ZSA9IHByaXY7CiAKLQlpZiAoYWxwc19od19pbml0KHBzbW91c2UsICZ2ZXJzaW9uKSkKKwltb2RlbCA9IGFscHNfZ2V0X21vZGVsKHBzbW91c2UsICZ2ZXJzaW9uKTsKKwlpZiAoIW1vZGVsKQorCQlnb3RvIGluaXRfZmFpbDsKKworCXByaXYtPmkgPSBtb2RlbDsKKworCWlmIChhbHBzX2h3X2luaXQocHNtb3VzZSkpCiAJCWdvdG8gaW5pdF9mYWlsOwogCiAJZGV2MS0+ZXZiaXRbQklUX1dPUkQoRVZfS0VZKV0gfD0gQklUX01BU0soRVZfS0VZKTsKIAlkZXYxLT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gfD0gQklUX01BU0soQlROX1RPVUNIKTsKIAlkZXYxLT5rZXliaXRbQklUX1dPUkQoQlROX1RPT0xfRklOR0VSKV0gfD0gQklUX01BU0soQlROX1RPT0xfRklOR0VSKTsKLQlkZXYxLT5rZXliaXRbQklUX1dPUkQoQlROX0xFRlQpXSB8PSBCSVRfTUFTSyhCVE5fTEVGVCkgfAotCQlCSVRfTUFTSyhCVE5fTUlERExFKSB8IEJJVF9NQVNLKEJUTl9SSUdIVCk7CisJZGV2MS0+a2V5Yml0W0JJVF9XT1JEKEJUTl9MRUZUKV0gfD0KKwkJQklUX01BU0soQlROX0xFRlQpIHwgQklUX01BU0soQlROX1JJR0hUKTsKIAogCWRldjEtPmV2Yml0W0JJVF9XT1JEKEVWX0FCUyldIHw9IEJJVF9NQVNLKEVWX0FCUyk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2MSwgQUJTX1gsIDAsIDEwMjMsIDAsIDApOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldjEsIEFCU19ZLCAwLCA3NjcsIDAsIDApOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldjEsIEFCU19QUkVTU1VSRSwgMCwgMTI3LCAwLCAwKTsKIAotCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfV0hFRUwpIHsKKwlpZiAobW9kZWwtPmZsYWdzICYgQUxQU19XSEVFTCkgewogCQlkZXYxLT5ldmJpdFtCSVRfV09SRChFVl9SRUwpXSB8PSBCSVRfTUFTSyhFVl9SRUwpOwogCQlkZXYxLT5yZWxiaXRbQklUX1dPUkQoUkVMX1dIRUVMKV0gfD0gQklUX01BU0soUkVMX1dIRUVMKTsKIAl9CiAKLQlpZiAocHJpdi0+aS0+ZmxhZ3MgJiAoQUxQU19GV19CS18xIHwgQUxQU19GV19CS18yKSkgeworCWlmIChtb2RlbC0+ZmxhZ3MgJiAoQUxQU19GV19CS18xIHwgQUxQU19GV19CS18yKSkgewogCQlkZXYxLT5rZXliaXRbQklUX1dPUkQoQlROX0ZPUldBUkQpXSB8PSBCSVRfTUFTSyhCVE5fRk9SV0FSRCk7CiAJCWRldjEtPmtleWJpdFtCSVRfV09SRChCVE5fQkFDSyldIHw9IEJJVF9NQVNLKEJUTl9CQUNLKTsKIAl9CiAKKwlpZiAobW9kZWwtPmZsYWdzICYgQUxQU19GT1VSX0JVVFRPTlMpIHsKKwkJZGV2MS0+a2V5Yml0W0JJVF9XT1JEKEJUTl8wKV0gfD0gQklUX01BU0soQlROXzApOworCQlkZXYxLT5rZXliaXRbQklUX1dPUkQoQlROXzEpXSB8PSBCSVRfTUFTSyhCVE5fMSk7CisJCWRldjEtPmtleWJpdFtCSVRfV09SRChCVE5fMildIHw9IEJJVF9NQVNLKEJUTl8yKTsKKwkJZGV2MS0+a2V5Yml0W0JJVF9XT1JEKEJUTl8zKV0gfD0gQklUX01BU0soQlROXzMpOworCX0gZWxzZSB7CisJCWRldjEtPmtleWJpdFtCSVRfV09SRChCVE5fTUlERExFKV0gfD0gQklUX01BU0soQlROX01JRERMRSk7CisJfQorCiAJc25wcmludGYocHJpdi0+cGh5cywgc2l6ZW9mKHByaXYtPnBoeXMpLCAiJXMvaW5wdXQxIiwgcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKIAlkZXYyLT5waHlzID0gcHJpdi0+cGh5czsKLQlkZXYyLT5uYW1lID0gKHByaXYtPmktPmZsYWdzICYgQUxQU19EVUFMUE9JTlQpID8gIkR1YWxQb2ludCBTdGljayIgOiAiUFMvMiBNb3VzZSI7CisJZGV2Mi0+bmFtZSA9IChtb2RlbC0+ZmxhZ3MgJiBBTFBTX0RVQUxQT0lOVCkgPyAiRHVhbFBvaW50IFN0aWNrIiA6ICJQUy8yIE1vdXNlIjsKIAlkZXYyLT5pZC5idXN0eXBlID0gQlVTX0k4MDQyOwogCWRldjItPmlkLnZlbmRvciAgPSAweDAwMDI7CiAJZGV2Mi0+aWQucHJvZHVjdCA9IFBTTU9VU0VfQUxQUzsKQEAgLTQ5Nyw5ICs1MjcsOSBAQAogCWRldjItPmRldi5wYXJlbnQgPSAmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXY7CiAKIAlkZXYyLT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9SRUwpOwotCWRldjItPnJlbGJpdFtCSVRfV09SRChSRUxfWCldIHw9IEJJVF9NQVNLKFJFTF9YKSB8IEJJVF9NQVNLKFJFTF9ZKTsKLQlkZXYyLT5rZXliaXRbQklUX1dPUkQoQlROX0xFRlQpXSB8PSBCSVRfTUFTSyhCVE5fTEVGVCkgfAotCQlCSVRfTUFTSyhCVE5fTUlERExFKSB8IEJJVF9NQVNLKEJUTl9SSUdIVCk7CisJZGV2Mi0+cmVsYml0W0JJVF9XT1JEKFJFTF9YKV0gPSBCSVRfTUFTSyhSRUxfWCkgfCBCSVRfTUFTSyhSRUxfWSk7CisJZGV2Mi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9MRUZUKV0gPQorCQlCSVRfTUFTSyhCVE5fTEVGVCkgfCBCSVRfTUFTSyhCVE5fTUlERExFKSB8IEJJVF9NQVNLKEJUTl9SSUdIVCk7CiAKIAlpZiAoaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHByaXYtPmRldjIpKQogCQlnb3RvIGluaXRfZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYwppbmRleCBmZGEzNWU2Li5iMjc2ODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW50ZWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5jCkBAIC00MjAsNiArNDIwLDcgQEAKIAogCV9fc2V0X2JpdChFVl9LRVksIGRldi0+ZXZiaXQpOwogCV9fc2V0X2JpdChFVl9BQlMsIGRldi0+ZXZiaXQpOworCV9fY2xlYXJfYml0KEVWX1JFTCwgZGV2LT5ldmJpdCk7CiAKIAlfX3NldF9iaXQoQlROX0xFRlQsIGRldi0+a2V5Yml0KTsKIAlfX3NldF9iaXQoQlROX1JJR0hULCBkZXYtPmtleWJpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCmluZGV4IGRlMWU1NTMuLmIxNDYyMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCkBAIC00MzAsMTkgKzQzMCw2IEBACiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OwogCWludCBlcnI7CiAKLQkvKiB1bnNldCB0aGUgdGhpbmdzIHRoYXQgcHNtb3VzZS1iYXNlIHNldHMgd2hpY2ggd2UgZG9uJ3QgaGF2ZSAqLwotCV9fY2xlYXJfYml0KEJUTl9NSURETEUsIGRldi0+a2V5Yml0KTsKLQotCS8qIHNldCB0aGUgdGhpbmdzIHdlIGRvIGhhdmUgKi8KLQlfX3NldF9iaXQoRVZfS0VZLCBkZXYtPmV2Yml0KTsKLQlfX3NldF9iaXQoRVZfUkVMLCBkZXYtPmV2Yml0KTsKLQotCV9fc2V0X2JpdChSRUxfWCwgZGV2LT5yZWxiaXQpOwotCV9fc2V0X2JpdChSRUxfWSwgZGV2LT5yZWxiaXQpOwotCi0JX19zZXRfYml0KEJUTl9MRUZULCBkZXYtPmtleWJpdCk7Ci0JX19zZXRfYml0KEJUTl9SSUdIVCwgZGV2LT5rZXliaXQpOwotCiAJLyogcmVnaXN0ZXIgaGFuZGxlcnMgKi8KIAlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gaGdwa19wcm9jZXNzX2J5dGU7CiAJcHNtb3VzZS0+cG9sbCA9IGhncGtfcG9sbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYwppbmRleCA4MjgxMTU1Li4yZTZiZGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCkBAIC0yNSwxMSArMjUsMTMgQEAKIAljaGFyIHBoeXNbMzJdOwogfTsKIAorc3RhdGljIGJvb2wgbGlmZWJvb2tfcHJlc2VudDsKKwogc3RhdGljIGNvbnN0IGNoYXIgKmRlc2lyZWRfc2VyaW9fcGh5czsKIAotc3RhdGljIGludCBsaWZlYm9va19zZXRfc2VyaW9fcGh5cyhjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3N0YXRpYyBpbnQgbGlmZWJvb2tfbGltaXRfc2VyaW8zKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQogewotCWRlc2lyZWRfc2VyaW9fcGh5cyA9IGQtPmRyaXZlcl9kYXRhOworCWRlc2lyZWRfc2VyaW9fcGh5cyA9ICJpc2EwMDYwL3NlcmlvMyI7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxLDUzICs0Myw1MyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgbGlmZWJvb2tfZG1pX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0Y29uc3QgbGlmZWJvb2tfZG1pX3RhYmxlW10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfRE1JKSAmJiBkZWZpbmVkKENPTkZJR19YODYpCiAJewotCQkuaWRlbnQgPSAiRkxPUkEtaWUgNTVtaSIsCisJCS8qIEZMT1JBLWllIDU1bWkgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkZMT1JBLWllIDU1bWkiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkxpZmVCb29rIEIiLAorCQkvKiBMaWZlQm9vayBCICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMaWZlQm9vayBCIFNlcmllcyIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiTGlmZWJvb2sgQiIsCisJCS8qIExpZmVib29rIEIgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxJRkVCT09LIEIgU2VyaWVzIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJMaWZlYm9vayBCLTIxMzAiLAorCQkvKiBMaWZlYm9vayBCLTIxMzAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJaRVBIWVIiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkxpZmVib29rIEIyMTN4L0IyMTUwIiwKKwkJLyogTGlmZWJvb2sgQjIxM3gvQjIxNTAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpZmVCb29rIEIyMTMxL0IyMTMzL0IyMTUwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJaZXBoeXIiLAorCQkvKiBaZXBoeXIgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlpFUEhZUiIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiQ0YtMTgiLAorCQkvKiBQYW5hc29uaWMgQ0YtMTggKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkNGLTE4IiksCiAJCX0sCi0JCS5jYWxsYmFjayA9IGxpZmVib29rX3NldF9zZXJpb19waHlzLAotCQkuZHJpdmVyX2RhdGEgPSAiaXNhMDA2MC9zZXJpbzMiLAorCQkuY2FsbGJhY2sgPSBsaWZlYm9va19saW1pdF9zZXJpbzMsCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJQYW5hc29uaWMgQ0YtMjgiLAorCQkvKiBQYW5hc29uaWMgQ0YtMjggKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNYXRzdXNoaXRhIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkNGLTI4IiksCkBAIC05NSw3ICs5Nyw3IEBACiAJCS5jYWxsYmFjayA9IGxpZmVib29rX3NldF82Ynl0ZV9wcm90bywKIAl9LAogCXsKLQkJLmlkZW50ID0gIlBhbmFzb25pYyBDRi0yOSIsCisJCS8qIFBhbmFzb25pYyBDRi0yOSAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1hdHN1c2hpdGEiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQ0YtMjkiKSwKQEAgLTEwMywyMSArMTA1LDI3IEBACiAJCS5jYWxsYmFjayA9IGxpZmVib29rX3NldF82Ynl0ZV9wcm90bywKIAl9LAogCXsKLQkJLmlkZW50ID0gIkNGLTcyIiwKKwkJLyogUGFuYXNvbmljIENGLTcyICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJDRi03MiIpLAogCQl9LAogCQkuY2FsbGJhY2sgPSBsaWZlYm9va19zZXRfNmJ5dGVfcHJvdG8sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJMaWZlYm9vayBCMTQyIiwKKwkJLyogTGlmZWJvb2sgQjE0MiAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGlmZUJvb2sgQjE0MiIpLAogCQl9LAogCX0sCiAJeyB9CisjZW5kaWYKIH07CiAKK3ZvaWQgX19pbml0IGxpZmVib29rX21vZHVsZV9pbml0KHZvaWQpCit7CisJbGlmZWJvb2tfcHJlc2VudCA9IGRtaV9jaGVja19zeXN0ZW0obGlmZWJvb2tfZG1pX3RhYmxlKTsKK30KKwogc3RhdGljIHBzbW91c2VfcmV0X3QgbGlmZWJvb2tfcHJvY2Vzc19ieXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCXN0cnVjdCBsaWZlYm9va19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKQEAgLTE5OCwxMCArMjA2LDEwIEBACiAJCXJldHVybiAtMTsKIAogCS8qCi0JICAgRW5hYmxlIGFic29sdXRlIG91dHB1dCAtLSBwczJfY29tbWFuZCBmYWlscyBhbHdheXMgYnV0IGlmCi0JICAgeW91IGxlYXZlIHRoaXMgY2FsbCBvdXQgdGhlIHRvdWNoc3JlZW4gd2lsbCBuZXZlciBzZW5kCi0JICAgYWJzb2x1dGUgY29vcmRpbmF0ZXMKLQkqLworCSAqIEVuYWJsZSBhYnNvbHV0ZSBvdXRwdXQgLS0gcHMyX2NvbW1hbmQgZmFpbHMgYWx3YXlzIGJ1dCBpZgorCSAqIHlvdSBsZWF2ZSB0aGlzIGNhbGwgb3V0IHRoZSB0b3VjaHNyZWVuIHdpbGwgbmV2ZXIgc2VuZAorCSAqIGFic29sdXRlIGNvb3JkaW5hdGVzCisJICovCiAJcGFyYW0gPSBsaWZlYm9va191c2VfNmJ5dGVfcHJvdG8gPyAweDA4IDogMHgwNzsKIAlwczJfY29tbWFuZChwczJkZXYsICZwYXJhbSwgUFNNT1VTRV9DTURfU0VUUkVTKTsKIApAQCAtMjQzLDcgKzI1MSw3IEBACiAKIGludCBsaWZlYm9va19kZXRlY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGJvb2wgc2V0X3Byb3BlcnRpZXMpCiB7Ci0gICAgICAgIGlmICghZG1pX2NoZWNrX3N5c3RlbShsaWZlYm9va19kbWlfdGFibGUpKQorICAgICAgICBpZiAoIWxpZmVib29rX3ByZXNlbnQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCiAJaWYgKGRlc2lyZWRfc2VyaW9fcGh5cyAmJgpAQCAtMjgzLDggKzI5MSw4IEBACiAKIAlkZXYyLT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9SRUwpOwogCWRldjItPnJlbGJpdFtCSVRfV09SRChSRUxfWCldID0gQklUX01BU0soUkVMX1gpIHwgQklUX01BU0soUkVMX1kpOwotCWRldjItPmtleWJpdFtCSVRfV09SRChCVE5fTEVGVCldID0gQklUX01BU0soQlROX0xFRlQpIHwKLQkJQklUX01BU0soQlROX1JJR0hUKTsKKwlkZXYyLT5rZXliaXRbQklUX1dPUkQoQlROX0xFRlQpXSA9CisJCQkJQklUX01BU0soQlROX0xFRlQpIHwgQklUX01BU0soQlROX1JJR0hUKTsKIAogCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHByaXYtPmRldjIpOwogCWlmIChlcnJvcikKQEAgLTMwOSw2ICszMTcsNyBAQAogCiAJZGV2MS0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9BQlMpIHwgQklUX01BU0soRVZfS0VZKTsKIAlkZXYxLT5yZWxiaXRbMF0gPSAwOworCWRldjEtPmtleWJpdFtCSVRfV09SRChCVE5fTU9VU0UpXSA9IDA7CiAJZGV2MS0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYxLCBBQlNfWCwgMCwgbWF4X2Nvb3JkLCAwLCAwKTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYxLCBBQlNfWSwgMCwgbWF4X2Nvb3JkLCAwLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suaAppbmRleCA0MDdjYjIyLi40YzQzMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5oCkBAIC0xMiw5ICsxMiwxMyBAQAogI2RlZmluZSBfTElGRUJPT0tfSAogCiAjaWZkZWYgQ09ORklHX01PVVNFX1BTMl9MSUZFQk9PSwordm9pZCBsaWZlYm9va19tb2R1bGVfaW5pdCh2b2lkKTsKIGludCBsaWZlYm9va19kZXRlY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGJvb2wgc2V0X3Byb3BlcnRpZXMpOwogaW50IGxpZmVib29rX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwogI2Vsc2UKK2lubGluZSB2b2lkIGxpZmVib29rX21vZHVsZV9pbml0KHZvaWQpCit7Cit9CiBpbmxpbmUgaW50IGxpZmVib29rX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgYm9vbCBzZXRfcHJvcGVydGllcykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCmluZGV4IGFiNWRjNWYuLjU0M2MyNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwpAQCAtNDA0LDggKzQwNCw4IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoYnV0dG9ucyA8IDMpCi0JCQlfX2NsZWFyX2JpdChCVE5fTUlERExFLCBwc21vdXNlLT5kZXYtPmtleWJpdCk7CisJCWlmIChidXR0b25zID49IDMpCisJCQlfX3NldF9iaXQoQlROX01JRERMRSwgcHNtb3VzZS0+ZGV2LT5rZXliaXQpOwogCiAJCWlmIChtb2RlbF9pbmZvKQogCQkJcHMycHBfc2V0X21vZGVsX3Byb3BlcnRpZXMocHNtb3VzZSwgbW9kZWxfaW5mbywgdXNlX3BzMnBwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCmluZGV4IDA3YzUzNzkuLmZkMGJjMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwpAQCAtNDI1LDYgKzQyNSw3IEBACiAJCXJldHVybiAtMTsKIAogCWlmIChzZXRfcHJvcGVydGllcykgeworCQlfX3NldF9iaXQoQlROX01JRERMRSwgcHNtb3VzZS0+ZGV2LT5rZXliaXQpOwogCQlfX3NldF9iaXQoQlROX0VYVFJBLCBwc21vdXNlLT5kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fU0lERSwgcHNtb3VzZS0+ZGV2LT5rZXliaXQpOwogCQlfX3NldF9iaXQoUkVMX1dIRUVMLCBwc21vdXNlLT5kZXYtPnJlbGJpdCk7CkBAIC00NjAsOCArNDYxLDEwIEBACiAJCV9fc2V0X2JpdChCVE5fTUlERExFLCBwc21vdXNlLT5kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChSRUxfV0hFRUwsIHBzbW91c2UtPmRldi0+cmVsYml0KTsKIAotCQlpZiAoIXBzbW91c2UtPnZlbmRvcikgcHNtb3VzZS0+dmVuZG9yID0gIkdlbmVyaWMiOwotCQlpZiAoIXBzbW91c2UtPm5hbWUpIHBzbW91c2UtPm5hbWUgPSAiV2hlZWwgTW91c2UiOworCQlpZiAoIXBzbW91c2UtPnZlbmRvcikKKwkJCXBzbW91c2UtPnZlbmRvciA9ICJHZW5lcmljIjsKKwkJaWYgKCFwc21vdXNlLT5uYW1lKQorCQkJcHNtb3VzZS0+bmFtZSA9ICJXaGVlbCBNb3VzZSI7CiAJCXBzbW91c2UtPnBrdHNpemUgPSA0OwogCX0KIApAQCAtNTA0LDggKzUwNywxMCBAQAogCQlfX3NldF9iaXQoQlROX1NJREUsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAkJX19zZXRfYml0KEJUTl9FWFRSQSwgcHNtb3VzZS0+ZGV2LT5rZXliaXQpOwogCi0JCWlmICghcHNtb3VzZS0+dmVuZG9yKSBwc21vdXNlLT52ZW5kb3IgPSAiR2VuZXJpYyI7Ci0JCWlmICghcHNtb3VzZS0+bmFtZSkgcHNtb3VzZS0+bmFtZSA9ICJFeHBsb3JlciBNb3VzZSI7CisJCWlmICghcHNtb3VzZS0+dmVuZG9yKQorCQkJcHNtb3VzZS0+dmVuZG9yID0gIkdlbmVyaWMiOworCQlpZiAoIXBzbW91c2UtPm5hbWUpCisJCQlwc21vdXNlLT5uYW1lID0gIkV4cGxvcmVyIE1vdXNlIjsKIAkJcHNtb3VzZS0+cGt0c2l6ZSA9IDQ7CiAJfQogCkBAIC01MzYsNiArNTQxLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKHNldF9wcm9wZXJ0aWVzKSB7CisJCV9fc2V0X2JpdChCVE5fTUlERExFLCBwc21vdXNlLT5kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fRVhUUkEsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAogCQlwc21vdXNlLT52ZW5kb3IgPSAiS2Vuc2luZ3RvbiI7CkBAIC01NTEsOCArNTU3LDE2IEBACiBzdGF0aWMgaW50IHBzMmJhcmVfZGV0ZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBib29sIHNldF9wcm9wZXJ0aWVzKQogewogCWlmIChzZXRfcHJvcGVydGllcykgewotCQlpZiAoIXBzbW91c2UtPnZlbmRvcikgcHNtb3VzZS0+dmVuZG9yID0gIkdlbmVyaWMiOwotCQlpZiAoIXBzbW91c2UtPm5hbWUpIHBzbW91c2UtPm5hbWUgPSAiTW91c2UiOworCQlpZiAoIXBzbW91c2UtPnZlbmRvcikKKwkJCXBzbW91c2UtPnZlbmRvciA9ICJHZW5lcmljIjsKKwkJaWYgKCFwc21vdXNlLT5uYW1lKQorCQkJcHNtb3VzZS0+bmFtZSA9ICJNb3VzZSI7CisKKy8qCisgKiBXZSBoYXZlIG5vIHdheSBvZiBmaWd1cmluZyB0cnVlIG51bWJlciBvZiBidXR0b25zIHNvIGxldCdzCisgKiBhc3N1bWUgdGhhdCB0aGUgZGV2aWNlIGhhcyAzLgorICovCisJCV9fc2V0X2JpdChCVE5fTUlERExFLCBwc21vdXNlLT5kZXYtPmtleWJpdCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01NjcsNiArNTgxLDggQEAKIAlpZiAoc2V0X3Byb3BlcnRpZXMpIHsKIAkJcHNtb3VzZS0+dmVuZG9yID0gIkNvcnRyb24iOwogCQlwc21vdXNlLT5uYW1lID0gIlBTLzIgVHJhY2tiYWxsIjsKKworCQlfX3NldF9iaXQoQlROX01JRERMRSwgcHNtb3VzZS0+ZGV2LT5rZXliaXQpOwogCQlfX3NldF9iaXQoQlROX1NJREUsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAl9CiAKQEAgLTExODQsMTUgKzEyMDAsMTYgQEAKIAltdXRleF91bmxvY2soJnBzbW91c2VfbXV0ZXgpOwogfQogCi1zdGF0aWMgaW50IHBzbW91c2Vfc3dpdGNoX3Byb3RvY29sKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBjb25zdCBzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCAqcHJvdG8pCitzdGF0aWMgaW50IHBzbW91c2Vfc3dpdGNoX3Byb3RvY29sKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwc21vdXNlX3Byb3RvY29sICpwcm90bykKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBwc21vdXNlLT5kZXY7CiAKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXY7CiAKIAlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX1JFTCk7Ci0JaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPSBCSVRfTUFTSyhCVE5fTEVGVCkgfAotCQlCSVRfTUFTSyhCVE5fTUlERExFKSB8IEJJVF9NQVNLKEJUTl9SSUdIVCk7CisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPQorCQkJCUJJVF9NQVNLKEJUTl9MRUZUKSB8IEJJVF9NQVNLKEJUTl9SSUdIVCk7CiAJaW5wdXRfZGV2LT5yZWxiaXRbMF0gPSBCSVRfTUFTSyhSRUxfWCkgfCBCSVRfTUFTSyhSRUxfWSk7CiAKIAlwc21vdXNlLT5zZXRfcmF0ZSA9IHBzbW91c2Vfc2V0X3JhdGU7CkBAIC0xMjA5LDggKzEyMjYsNyBAQAogCQkJcmV0dXJuIC0xOwogCiAJCXBzbW91c2UtPnR5cGUgPSBwcm90by0+dHlwZTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlwc21vdXNlLT50eXBlID0gcHNtb3VzZV9leHRlbnNpb25zKHBzbW91c2UsCiAJCQkJCQkgICBwc21vdXNlX21heF9wcm90bywgdHJ1ZSk7CiAKQEAgLTE2ODAsNiArMTY5Niw5IEBACiB7CiAJaW50IGVycjsKIAorCWxpZmVib29rX21vZHVsZV9pbml0KCk7CisJc3luYXB0aWNzX21vZHVsZV9pbml0KCk7CisKIAlrcHNtb3VzZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3BzbW91c2VkIik7CiAJaWYgKCFrcHNtb3VzZWRfd3EpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwc21vdXNlOiBmYWlsZWQgdG8gY3JlYXRlIGtwc21vdXNlZCB3b3JrcXVldWVcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zZW50ZWxpYy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zZW50ZWxpYy5jCmluZGV4IGY4NGNiZDkuLjc3YjlmZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmMKQEAgLTgzNiw2ICs4MzYsNyBAQAogCXByaXYtPmZsYWdzIHw9IEZTUERSVl9GTEFHX0VOX09QQzsKIAogCS8qIFNldCB1cCB2YXJpb3VzIHN1cHBvcnRlZCBpbnB1dCBldmVudCBiaXRzICovCisJX19zZXRfYml0KEJUTl9NSURETEUsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAlfX3NldF9iaXQoQlROX0JBQ0ssIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAlfX3NldF9iaXQoQlROX0ZPUldBUkQsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKIAlfX3NldF9iaXQoUkVMX1dIRUVMLCBwc21vdXNlLT5kZXYtPnJlbGJpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwppbmRleCBmNGE2MTI1Li4wNTY4OWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYnBzMi5oPgpAQCAtNjI5LDI1ICs2MzAsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoX19pMzg2X18pCi0jaW5jbHVkZSA8bGludXgvZG1pLmg+Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgdG9zaGliYV9kbWlfdGFibGVbXSA9IHsKK3N0YXRpYyBib29sIGltcGFpcmVkX3Rvc2hpYmFfa2JjOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0Y29uc3QgdG9zaGliYV9kbWlfdGFibGVbXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19ETUkpICYmIGRlZmluZWQoQ09ORklHX1g4NikKIAl7Ci0JCS5pZGVudCA9ICJUb3NoaWJhIFNhdGVsbGl0ZSIsCisJCS8qIFRvc2hpYmEgU2F0ZWxsaXRlICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVE9TSElCQSIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTYXRlbGxpdGUiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIlRvc2hpYmEgRHluYWJvb2siLAorCQkvKiBUb3NoaWJhIER5bmFib29rICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVE9TSElCQSIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJkeW5hYm9vayIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiVG9zaGliYSBQb3J0ZWdlIE0zMDAiLAorCQkvKiBUb3NoaWJhIFBvcnRlZ2UgTTMwMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUE9SVEVHRSBNMzAwIiksCkBAIC02NTUsNyArNjU3LDcgQEAKIAogCX0sCiAJewotCQkuaWRlbnQgPSAiVG9zaGliYSBQb3J0ZWdlIE0zMDAiLAorCQkvKiBUb3NoaWJhIFBvcnRlZ2UgTTMwMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG9ydGFibGUgUEMiKSwKQEAgLTY2NCw4ICs2NjYsMTMgQEAKIAogCX0sCiAJeyB9Ci19OwogI2VuZGlmCit9OworCit2b2lkIF9faW5pdCBzeW5hcHRpY3NfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbXBhaXJlZF90b3NoaWJhX2tiYyA9IGRtaV9jaGVja19zeXN0ZW0odG9zaGliYV9kbWlfdGFibGUpOworfQogCiBpbnQgc3luYXB0aWNzX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CkBAIC03MTgsMTggKzcyNSwxNiBAQAogCWlmIChTWU5fQ0FQX1BBU1NfVEhST1VHSChwcml2LT5jYXBhYmlsaXRpZXMpKQogCQlzeW5hcHRpY3NfcHRfY3JlYXRlKHBzbW91c2UpOwogCi0jaWYgZGVmaW5lZChfX2kzODZfXykKIAkvKgogCSAqIFRvc2hpYmEncyBLQkMgc2VlbXMgdG8gaGF2ZSB0cm91YmxlIGhhbmRsaW5nIGRhdGEgZnJvbQogCSAqIFN5bmFwdGljcyBhcyBmdWxsIHJhdGUsIHN3aXRjaCB0byBsb3dlciByYXRlIHdoaWNoIGlzIHJvdWdobHkKIAkgKiB0aHllIHNhbWUgYXMgcmF0ZSBvZiBzdGFuZGFyZCBQUy8yIG1vdXNlLgogCSAqLwotCWlmIChwc21vdXNlLT5yYXRlID49IDgwICYmIGRtaV9jaGVja19zeXN0ZW0odG9zaGliYV9kbWlfdGFibGUpKSB7CisJaWYgKHBzbW91c2UtPnJhdGUgPj0gODAgJiYgaW1wYWlyZWRfdG9zaGliYV9rYmMpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAic3luYXB0aWNzOiBUb3NoaWJhICVzIGRldGVjdGVkLCBsaW1pdGluZyByYXRlIHRvIDQwcHBzLlxuIiwKIAkJCWRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfTkFNRSkpOwogCQlwc21vdXNlLT5yYXRlID0gNDA7CiAJfQotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIApAQCAtNzQwLDYgKzc0NSwxMCBAQAogCiAjZWxzZSAvKiBDT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUyAqLwogCit2b2lkIF9faW5pdCBzeW5hcHRpY3NfbW9kdWxlX2luaXQodm9pZCkKK3sKK30KKwogaW50IHN5bmFwdGljc19pbml0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCXJldHVybiAtRU5PU1lTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuaCBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmgKaW5kZXggODcxZjZmZS4uODM4ZTdmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIAlpbnQgc2Nyb2xsOwogfTsKIAordm9pZCBzeW5hcHRpY3NfbW9kdWxlX2luaXQodm9pZCk7CiBpbnQgc3luYXB0aWNzX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgYm9vbCBzZXRfcHJvcGVydGllcyk7CiBpbnQgc3luYXB0aWNzX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwogdm9pZCBzeW5hcHRpY3NfcmVzZXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljc19pMmMuYwppbmRleCA3MjgzYzc4Li45ODY3ZGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljc19pMmMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljc19pMmMuYwpAQCAtNDIwLDggKzQyMCw4IEBACiB9CiAKIC8qIENvbnRyb2wgdGhlIERldmljZSBwb2xsaW5nIHJhdGUgLyBXb3JrIEhhbmRsZXIgc2xlZXAgdGltZSAqLwotdW5zaWduZWQgbG9uZyBzeW5hcHRpY3NfaTJjX2FkanVzdF9kZWxheShzdHJ1Y3Qgc3luYXB0aWNzX2kyYyAqdG91Y2gsCi0JCQkJCSBib29sIGhhdmVfZGF0YSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN5bmFwdGljc19pMmNfYWRqdXN0X2RlbGF5KHN0cnVjdCBzeW5hcHRpY3NfaTJjICp0b3VjaCwKKwkJCQkJCWJvb2wgaGF2ZV9kYXRhKQogewogCXVuc2lnbmVkIGxvbmcgZGVsYXksIG5vZGF0YV9jb3VudF90aHJlczsKIApAQCAtNTIwLDcgKzUyMCw3IEBACiAJX19zZXRfYml0KEJUTl9MRUZULCBpbnB1dC0+a2V5Yml0KTsKIH0KIAotc3RydWN0IHN5bmFwdGljc19pMmMgKnN5bmFwdGljc19pMmNfdG91Y2hfY3JlYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgc3RydWN0IHN5bmFwdGljc19pMmMgKnN5bmFwdGljc19pMmNfdG91Y2hfY3JlYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHN5bmFwdGljc19pMmMgKnRvdWNoOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3RvdWNoa2l0X3BzMi5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90b3VjaGtpdF9wczIuYwppbmRleCAwMzA4YTBmLi45MDk0MzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3RvdWNoa2l0X3BzMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdG91Y2hraXRfcHMyLmMKQEAgLTg2LDcgKzg2LDggQEAKIAogCWlmIChzZXRfcHJvcGVydGllcykgewogCQlkZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7Ci0JCV9fc2V0X2JpdChCVE5fVE9VQ0gsIGRldi0+a2V5Yml0KTsKKwkJZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPSAwOworCQlkZXYtPmtleWJpdFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCk7CiAJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1gsIDAsIFRPVUNIS0lUX01BWF9YQywgMCwgMCk7CiAJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1ksIDAsIFRPVUNIS0lUX01BWF9ZQywgMCwgMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKaW5kZXggZTM1NDM2Mi4uNjNkNGE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKQEAgLTI4NCw3ICsyODQsNiBAQAogCiBpbnQgdHJhY2twb2ludF9kZXRlY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGJvb2wgc2V0X3Byb3BlcnRpZXMpCiB7Ci0Jc3RydWN0IHRyYWNrcG9pbnRfZGF0YSAqcHJpdjsKIAlzdHJ1Y3QgcHMyZGV2ICpwczJkZXYgPSAmcHNtb3VzZS0+cHMyZGV2OwogCXVuc2lnbmVkIGNoYXIgZmlybXdhcmVfaWQ7CiAJdW5zaWduZWQgY2hhciBidXR0b25faW5mbzsKQEAgLTMwMSw4ICszMDAsOCBAQAogCQlidXR0b25faW5mbyA9IDA7CiAJfQogCi0JcHNtb3VzZS0+cHJpdmF0ZSA9IHByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhY2twb2ludF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KQorCXBzbW91c2UtPnByaXZhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhY2twb2ludF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwc21vdXNlLT5wcml2YXRlKQogCQlyZXR1cm4gLTE7CiAKIAlwc21vdXNlLT52ZW5kb3IgPSAiSUJNIjsKQEAgLTMxMSw3ICszMTAsMTAgQEAKIAlwc21vdXNlLT5yZWNvbm5lY3QgPSB0cmFja3BvaW50X3JlY29ubmVjdDsKIAlwc21vdXNlLT5kaXNjb25uZWN0ID0gdHJhY2twb2ludF9kaXNjb25uZWN0OwogCi0JdHJhY2twb2ludF9kZWZhdWx0cyhwcml2KTsKKwlpZiAoKGJ1dHRvbl9pbmZvICYgMHgwZikgPj0gMykKKwkJX19zZXRfYml0KEJUTl9NSURETEUsIHBzbW91c2UtPmRldi0+a2V5Yml0KTsKKworCXRyYWNrcG9pbnRfZGVmYXVsdHMocHNtb3VzZS0+cHJpdmF0ZSk7CiAJdHJhY2twb2ludF9zeW5jKHBzbW91c2UpOwogCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBzMmRldi0+c2VyaW8tPmRldi5rb2JqLCAmdHJhY2twb2ludF9hdHRyX2dyb3VwKTsKQEAgLTMxOSw3ICszMjEsOCBAQAogCQlwcmludGsoS0VSTl9FUlIKIAkJCSJ0cmFja3BvaW50LmM6IGZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlcywgZXJyb3I6ICVkXG4iLAogCQkJZXJyb3IpOwotCQlrZnJlZShwcml2KTsKKwkJa2ZyZWUocHNtb3VzZS0+cHJpdmF0ZSk7CisJCXBzbW91c2UtPnByaXZhdGUgPSBOVUxMOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3ZzeHh4YWEuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCmluZGV4IDcwMTExNDQuLmJmMmMwYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCkBAIC04NiwyNyArODYsMjggQEAKIAogI2RlZmluZSBEUklWRVJfREVTQyAiRHJpdmVyIGZvciBERUMgVlNYWFgtQUEgYW5kIC1HQSBtaWNlIGFuZCBWU1hYWC1BQiB0YWJsZXQiCiAKLU1PRFVMRV9BVVRIT1IgKCJKYW4tQmVuZWRpY3QgR2xhdyA8amJnbGF3QGx1Zy1vd2wuZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKERSSVZFUl9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKYW4tQmVuZWRpY3QgR2xhdyA8amJnbGF3QGx1Zy1vd2wuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjdW5kZWYgVlNYWFhBQV9ERUJVRwogI2lmZGVmIFZTWFhYQUFfREVCVUcKLSNkZWZpbmUgREJHKHguLi4pIHByaW50ayAoeCkKKyNkZWZpbmUgREJHKHguLi4pIHByaW50ayh4KQogI2Vsc2UKICNkZWZpbmUgREJHKHguLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKICNkZWZpbmUgVlNYWFhBQV9JTlRST19NQVNLCTB4ODAKICNkZWZpbmUgVlNYWFhBQV9JTlRST19IRUFECTB4ODAKLSNkZWZpbmUgSVNfSERSX0JZVEUoeCkJCSgoKHgpICYgVlNYWFhBQV9JTlRST19NQVNLKQlcCi0JCQkJCT09IFZTWFhYQUFfSU5UUk9fSEVBRCkKKyNkZWZpbmUgSVNfSERSX0JZVEUoeCkJCQlcCisJKCgoeCkgJiBWU1hYWEFBX0lOVFJPX01BU0spID09IFZTWFhYQUFfSU5UUk9fSEVBRCkKIAogI2RlZmluZSBWU1hYWEFBX1BBQ0tFVF9NQVNLCTB4ZTAKICNkZWZpbmUgVlNYWFhBQV9QQUNLRVRfUkVMCTB4ODAKICNkZWZpbmUgVlNYWFhBQV9QQUNLRVRfQUJTCTB4YzAKICNkZWZpbmUgVlNYWFhBQV9QQUNLRVRfUE9SCTB4YTAKLSNkZWZpbmUgTUFUQ0hfUEFDS0VUX1RZUEUoZGF0YSwgdHlwZSkJKCgoZGF0YSkgJiBWU1hYWEFBX1BBQ0tFVF9NQVNLKSA9PSAodHlwZSkpCisjZGVmaW5lIE1BVENIX1BBQ0tFVF9UWVBFKGRhdGEsIHR5cGUpCVwKKwkoKChkYXRhKSAmIFZTWFhYQUFfUEFDS0VUX01BU0spID09ICh0eXBlKSkKIAogCiAKQEAgLTEyMyw1MiArMTI0LDUwIEBACiAJY2hhciBwaHlzWzMyXTsKIH07CiAKLXN0YXRpYyB2b2lkCi12c3h4eGFhX2Ryb3BfYnl0ZXMgKHN0cnVjdCB2c3h4eGFhICptb3VzZSwgaW50IG51bSkKK3N0YXRpYyB2b2lkIHZzeHh4YWFfZHJvcF9ieXRlcyhzdHJ1Y3QgdnN4eHhhYSAqbW91c2UsIGludCBudW0pCiB7Ci0JaWYgKG51bSA+PSBtb3VzZS0+Y291bnQpCisJaWYgKG51bSA+PSBtb3VzZS0+Y291bnQpIHsKIAkJbW91c2UtPmNvdW50ID0gMDsKLQllbHNlIHsKLQkJbWVtbW92ZSAobW91c2UtPmJ1ZiwgbW91c2UtPmJ1ZiArIG51bSAtIDEsIEJVRkxFTiAtIG51bSk7CisJfSBlbHNlIHsKKwkJbWVtbW92ZShtb3VzZS0+YnVmLCBtb3VzZS0+YnVmICsgbnVtIC0gMSwgQlVGTEVOIC0gbnVtKTsKIAkJbW91c2UtPmNvdW50IC09IG51bTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi12c3h4eGFhX3F1ZXVlX2J5dGUgKHN0cnVjdCB2c3h4eGFhICptb3VzZSwgdW5zaWduZWQgY2hhciBieXRlKQorc3RhdGljIHZvaWQgdnN4eHhhYV9xdWV1ZV9ieXRlKHN0cnVjdCB2c3h4eGFhICptb3VzZSwgdW5zaWduZWQgY2hhciBieXRlKQogewogCWlmIChtb3VzZS0+Y291bnQgPT0gQlVGTEVOKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiVzIG9uICVzOiBEcm9wcGluZyBhIGJ5dGUgb2YgZnVsbCBidWZmZXIuXG4iLAotCQkJCW1vdXNlLT5uYW1lLCBtb3VzZS0+cGh5cyk7Ci0JCXZzeHh4YWFfZHJvcF9ieXRlcyAobW91c2UsIDEpOworCQlwcmludGsoS0VSTl9FUlIgIiVzIG9uICVzOiBEcm9wcGluZyBhIGJ5dGUgb2YgZnVsbCBidWZmZXIuXG4iLAorCQkJbW91c2UtPm5hbWUsIG1vdXNlLT5waHlzKTsKKwkJdnN4eHhhYV9kcm9wX2J5dGVzKG1vdXNlLCAxKTsKIAl9Ci0JREJHIChLRVJOX0lORk8gIlF1ZXVlaW5nIGJ5dGUgMHglMDJ4XG4iLCBieXRlKTsKKworCURCRyhLRVJOX0lORk8gIlF1ZXVlaW5nIGJ5dGUgMHglMDJ4XG4iLCBieXRlKTsKIAogCW1vdXNlLT5idWZbbW91c2UtPmNvdW50KytdID0gYnl0ZTsKIH0KIAotc3RhdGljIHZvaWQKLXZzeHh4YWFfZGV0ZWN0aW9uX2RvbmUgKHN0cnVjdCB2c3h4eGFhICptb3VzZSkKK3N0YXRpYyB2b2lkIHZzeHh4YWFfZGV0ZWN0aW9uX2RvbmUoc3RydWN0IHZzeHh4YWEgKm1vdXNlKQogewogCXN3aXRjaCAobW91c2UtPnR5cGUpIHsKLQkJY2FzZSAweDAyOgotCQkJc3RybGNweSAobW91c2UtPm5hbWUsICJERUMgVlNYWFgtQUEvLUdBIG1vdXNlIiwKLQkJCQkgc2l6ZW9mIChtb3VzZS0+bmFtZSkpOwotCQkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlzdHJsY3B5KG1vdXNlLT5uYW1lLCAiREVDIFZTWFhYLUFBLy1HQSBtb3VzZSIsCisJCQlzaXplb2YobW91c2UtPm5hbWUpKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSAweDA0OgotCQkJc3RybGNweSAobW91c2UtPm5hbWUsICJERUMgVlNYWFgtQUIgZGlnaXRpemVyIiwKLQkJCQkgc2l6ZW9mIChtb3VzZS0+bmFtZSkpOwotCQkJYnJlYWs7CisJY2FzZSAweDA0OgorCQlzdHJsY3B5KG1vdXNlLT5uYW1lLCAiREVDIFZTWFhYLUFCIGRpZ2l0aXplciIsCisJCQlzaXplb2YobW91c2UtPm5hbWUpKTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCXNucHJpbnRmIChtb3VzZS0+bmFtZSwgc2l6ZW9mIChtb3VzZS0+bmFtZSksCi0JCQkJICAidW5rbm93biBERUMgcG9pbnRlciBkZXZpY2UgKHR5cGUgPSAweCUwMngpIiwKLQkJCQkgIG1vdXNlLT50eXBlKTsKLQkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNucHJpbnRmKG1vdXNlLT5uYW1lLCBzaXplb2YobW91c2UtPm5hbWUpLAorCQkJICJ1bmtub3duIERFQyBwb2ludGVyIGRldmljZSAodHlwZSA9IDB4JTAyeCkiLAorCQkJIG1vdXNlLT50eXBlKTsKKwkJYnJlYWs7CiAJfQogCi0JcHJpbnRrIChLRVJOX0lORk8KKwlwcmludGsoS0VSTl9JTkZPCiAJCSJGb3VuZCAlcyB2ZXJzaW9uIDB4JTAyeCBmcm9tIGNvdW50cnkgMHglMDJ4IG9uIHBvcnQgJXNcbiIsCiAJCW1vdXNlLT5uYW1lLCBtb3VzZS0+dmVyc2lvbiwgbW91c2UtPmNvdW50cnksIG1vdXNlLT5waHlzKTsKIH0KQEAgLTE3Niw0MiArMTc1LDM4IEBACiAvKgogICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgZHJvcHBlZCwgMCBpZiBwYWNrZXQgaXMgb2theS4KICAqLwotc3RhdGljIGludAotdnN4eHhhYV9jaGVja19wYWNrZXQgKHN0cnVjdCB2c3h4eGFhICptb3VzZSwgaW50IHBhY2tldF9sZW4pCitzdGF0aWMgaW50IHZzeHh4YWFfY2hlY2tfcGFja2V0KHN0cnVjdCB2c3h4eGFhICptb3VzZSwgaW50IHBhY2tldF9sZW4pCiB7CiAJaW50IGk7CiAKIAkvKiBGaXJzdCBieXRlIG11c3QgYmUgYSBoZWFkZXIgYnl0ZSAqLwotCWlmICghSVNfSERSX0JZVEUgKG1vdXNlLT5idWZbMF0pKSB7Ci0JCURCRyAoInZzY2s6IGxlbj0lZCwgMXN0PTB4JTAyeFxuIiwgcGFja2V0X2xlbiwgbW91c2UtPmJ1ZlswXSk7CisJaWYgKCFJU19IRFJfQllURShtb3VzZS0+YnVmWzBdKSkgeworCQlEQkcoInZzY2s6IGxlbj0lZCwgMXN0PTB4JTAyeFxuIiwgcGFja2V0X2xlbiwgbW91c2UtPmJ1ZlswXSk7CiAJCXJldHVybiAxOwogCX0KIAogCS8qIENoZWNrIGFsbCBmb2xsb3dpbmcgYnl0ZXMgKi8KLQlpZiAocGFja2V0X2xlbiA+IDEpIHsKLQkJZm9yIChpID0gMTsgaSA8IHBhY2tldF9sZW47IGkrKykgewotCQkJaWYgKElTX0hEUl9CWVRFIChtb3VzZS0+YnVmW2ldKSkgewotCQkJCXByaW50ayAoS0VSTl9FUlIgIk5lZWQgdG8gZHJvcCAlZCBieXRlcyAiCi0JCQkJCQkib2YgYSBicm9rZW4gcGFja2V0LlxuIiwKLQkJCQkJCWkgLSAxKTsKLQkJCQlEQkcgKEtFUk5fSU5GTyAiY2hlY2s6IGxlbj0lZCwgYlslZF09MHglMDJ4XG4iLAotCQkJCQkJcGFja2V0X2xlbiwgaSwgbW91c2UtPmJ1ZltpXSk7Ci0JCQkJcmV0dXJuIGkgLSAxOwotCQkJfQorCWZvciAoaSA9IDE7IGkgPCBwYWNrZXRfbGVuOyBpKyspIHsKKwkJaWYgKElTX0hEUl9CWVRFKG1vdXNlLT5idWZbaV0pKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiTmVlZCB0byBkcm9wICVkIGJ5dGVzIG9mIGEgYnJva2VuIHBhY2tldC5cbiIsCisJCQkJaSAtIDEpOworCQkJREJHKEtFUk5fSU5GTyAiY2hlY2s6IGxlbj0lZCwgYlslZF09MHglMDJ4XG4iLAorCQkJICAgIHBhY2tldF9sZW4sIGksIG1vdXNlLT5idWZbaV0pOworCQkJcmV0dXJuIGkgLSAxOwogCQl9CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludAotdnN4eHhhYV9zbWVsbHNfbGlrZV9wYWNrZXQgKHN0cnVjdCB2c3h4eGFhICptb3VzZSwgdW5zaWduZWQgY2hhciB0eXBlLCBzaXplX3QgbGVuKQorc3RhdGljIGlubGluZSBpbnQgdnN4eHhhYV9zbWVsbHNfbGlrZV9wYWNrZXQoc3RydWN0IHZzeHh4YWEgKm1vdXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgdHlwZSwgc2l6ZV90IGxlbikKIHsKLQlyZXR1cm4gKG1vdXNlLT5jb3VudCA+PSBsZW4pICYmIE1BVENIX1BBQ0tFVF9UWVBFIChtb3VzZS0+YnVmWzBdLCB0eXBlKTsKKwlyZXR1cm4gbW91c2UtPmNvdW50ID49IGxlbiAmJiBNQVRDSF9QQUNLRVRfVFlQRShtb3VzZS0+YnVmWzBdLCB0eXBlKTsKIH0KIAotc3RhdGljIHZvaWQKLXZzeHh4YWFfaGFuZGxlX1JFTF9wYWNrZXQgKHN0cnVjdCB2c3h4eGFhICptb3VzZSkKK3N0YXRpYyB2b2lkIHZzeHh4YWFfaGFuZGxlX1JFTF9wYWNrZXQoc3RydWN0IHZzeHh4YWEgKm1vdXNlKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IG1vdXNlLT5kZXY7CiAJdW5zaWduZWQgY2hhciAqYnVmID0gbW91c2UtPmJ1ZjsKQEAgLTIzMiw0MyArMjI3LDQyIEBACiAJICogMCwgYml0IDQgb2YgYnl0ZSAwIGlzIGRpcmVjdGlvbi4KIAkgKi8KIAlkeCA9IGJ1ZlsxXSAmIDB4N2Y7Ci0JZHggKj0gKChidWZbMF0gPj4gNCkgJiAweDAxKT8gMTogLTE7CisJZHggKj0gKChidWZbMF0gPj4gNCkgJiAweDAxKSA/IDEgOiAtMTsKIAogCS8qCiAJICogTG93IDcgYml0IG9mIGJ5dGUgMiBhcmUgYWJzKGR5KSwgYml0IDcgaXMKIAkgKiAwLCBiaXQgMyBvZiBieXRlIDAgaXMgZGlyZWN0aW9uLgogCSAqLwogCWR5ID0gYnVmWzJdICYgMHg3ZjsKLQlkeSAqPSAoKGJ1ZlswXSA+PiAzKSAmIDB4MDEpPyAtMTogMTsKKwlkeSAqPSAoKGJ1ZlswXSA+PiAzKSAmIDB4MDEpID8gLTEgOiAxOwogCiAJLyoKIAkgKiBHZXQgYnV0dG9uIHN0YXRlLiBJdCdzIHRoZSBsb3cgdGhyZWUgYml0cwogCSAqIChmb3IgdGhyZWUgYnV0dG9ucykgb2YgYnl0ZSAwLgogCSAqLwotCWxlZnQJPSAoYnVmWzBdICYgMHgwNCk/IDE6IDA7Ci0JbWlkZGxlCT0gKGJ1ZlswXSAmIDB4MDIpPyAxOiAwOwotCXJpZ2h0CT0gKGJ1ZlswXSAmIDB4MDEpPyAxOiAwOworCWxlZnQJPSBidWZbMF0gJiAweDA0OworCW1pZGRsZQk9IGJ1ZlswXSAmIDB4MDI7CisJcmlnaHQJPSBidWZbMF0gJiAweDAxOwogCi0JdnN4eHhhYV9kcm9wX2J5dGVzIChtb3VzZSwgMyk7CisJdnN4eHhhYV9kcm9wX2J5dGVzKG1vdXNlLCAzKTsKIAotCURCRyAoS0VSTl9JTkZPICIlcyBvbiAlczogZHg9JWQsIGR5PSVkLCBidXR0b25zPSVzJXMlc1xuIiwKLQkJCW1vdXNlLT5uYW1lLCBtb3VzZS0+cGh5cywgZHgsIGR5LAotCQkJbGVmdD8gIkwiOiAibCIsIG1pZGRsZT8gIk0iOiAibSIsIHJpZ2h0PyAiUiI6ICJyIik7CisJREJHKEtFUk5fSU5GTyAiJXMgb24gJXM6IGR4PSVkLCBkeT0lZCwgYnV0dG9ucz0lcyVzJXNcbiIsCisJICAgIG1vdXNlLT5uYW1lLCBtb3VzZS0+cGh5cywgZHgsIGR5LAorCSAgICBsZWZ0ID8gIkwiIDogImwiLCBtaWRkbGUgPyAiTSIgOiAibSIsIHJpZ2h0ID8gIlIiIDogInIiKTsKIAogCS8qCiAJICogUmVwb3J0IHdoYXQgd2UndmUgZm91bmQgc28gZmFyLi4uCiAJICovCi0JaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fTEVGVCwgbGVmdCk7Ci0JaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fTUlERExFLCBtaWRkbGUpOwotCWlucHV0X3JlcG9ydF9rZXkgKGRldiwgQlROX1JJR0hULCByaWdodCk7Ci0JaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fVE9VQ0gsIDApOwotCWlucHV0X3JlcG9ydF9yZWwgKGRldiwgUkVMX1gsIGR4KTsKLQlpbnB1dF9yZXBvcnRfcmVsIChkZXYsIFJFTF9ZLCBkeSk7Ci0JaW5wdXRfc3luYyAoZGV2KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGxlZnQpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBtaWRkbGUpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHJpZ2h0KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCAwKTsKKwlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIGR4KTsKKwlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIGR5KTsKKwlpbnB1dF9zeW5jKGRldik7CiB9CiAKLXN0YXRpYyB2b2lkCi12c3h4eGFhX2hhbmRsZV9BQlNfcGFja2V0IChzdHJ1Y3QgdnN4eHhhYSAqbW91c2UpCitzdGF0aWMgdm9pZCB2c3h4eGFhX2hhbmRsZV9BQlNfcGFja2V0KHN0cnVjdCB2c3h4eGFhICptb3VzZSkKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBtb3VzZS0+ZGV2OwogCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IG1vdXNlLT5idWY7CkBAIC0yOTYsMzIgKzI5MCwzMSBAQAogCS8qCiAJICogR2V0IGJ1dHRvbiBzdGF0ZS4gSXQncyBiaXRzIDw0Li4xPiBvZiBieXRlIDAuCiAJICovCi0JbGVmdAk9IChidWZbMF0gJiAweDAyKT8gMTogMDsKLQltaWRkbGUJPSAoYnVmWzBdICYgMHgwNCk/IDE6IDA7Ci0JcmlnaHQJPSAoYnVmWzBdICYgMHgwOCk/IDE6IDA7Ci0JdG91Y2gJPSAoYnVmWzBdICYgMHgxMCk/IDE6IDA7CisJbGVmdAk9IGJ1ZlswXSAmIDB4MDI7CisJbWlkZGxlCT0gYnVmWzBdICYgMHgwNDsKKwlyaWdodAk9IGJ1ZlswXSAmIDB4MDg7CisJdG91Y2gJPSBidWZbMF0gJiAweDEwOwogCi0JdnN4eHhhYV9kcm9wX2J5dGVzIChtb3VzZSwgNSk7CisJdnN4eHhhYV9kcm9wX2J5dGVzKG1vdXNlLCA1KTsKIAotCURCRyAoS0VSTl9JTkZPICIlcyBvbiAlczogeD0lZCwgeT0lZCwgYnV0dG9ucz0lcyVzJXMlc1xuIiwKLQkJCW1vdXNlLT5uYW1lLCBtb3VzZS0+cGh5cywgeCwgeSwKLQkJCWxlZnQ/ICJMIjogImwiLCBtaWRkbGU/ICJNIjogIm0iLAotCQkJcmlnaHQ/ICJSIjogInIiLCB0b3VjaD8gIlQiOiAidCIpOworCURCRyhLRVJOX0lORk8gIiVzIG9uICVzOiB4PSVkLCB5PSVkLCBidXR0b25zPSVzJXMlcyVzXG4iLAorCSAgICBtb3VzZS0+bmFtZSwgbW91c2UtPnBoeXMsIHgsIHksCisJICAgIGxlZnQgPyAiTCIgOiAibCIsIG1pZGRsZSA/ICJNIiA6ICJtIiwKKwkgICAgcmlnaHQgPyAiUiIgOiAiciIsIHRvdWNoID8gIlQiIDogInQiKTsKIAogCS8qCiAJICogUmVwb3J0IHdoYXQgd2UndmUgZm91bmQgc28gZmFyLi4uCiAJICovCi0JaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fTEVGVCwgbGVmdCk7Ci0JaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fTUlERExFLCBtaWRkbGUpOwotCWlucHV0X3JlcG9ydF9rZXkgKGRldiwgQlROX1JJR0hULCByaWdodCk7Ci0JaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fVE9VQ0gsIHRvdWNoKTsKLQlpbnB1dF9yZXBvcnRfYWJzIChkZXYsIEFCU19YLCB4KTsKLQlpbnB1dF9yZXBvcnRfYWJzIChkZXYsIEFCU19ZLCB5KTsKLQlpbnB1dF9zeW5jIChkZXYpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgbGVmdCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIG1pZGRsZSk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgcmlnaHQpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIHRvdWNoKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIHgpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgeSk7CisJaW5wdXRfc3luYyhkZXYpOwogfQogCi1zdGF0aWMgdm9pZAotdnN4eHhhYV9oYW5kbGVfUE9SX3BhY2tldCAoc3RydWN0IHZzeHh4YWEgKm1vdXNlKQorc3RhdGljIHZvaWQgdnN4eHhhYV9oYW5kbGVfUE9SX3BhY2tldChzdHJ1Y3QgdnN4eHhhYSAqbW91c2UpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gbW91c2UtPmRldjsKIAl1bnNpZ25lZCBjaGFyICpidWYgPSBtb3VzZS0+YnVmOwpAQCAtMzU2LDI0ICszNDksMjQgQEAKIAkgKiAoZm9yIHRocmVlIGJ1dHRvbnMpIG9mIGJ5dGUgMC4gTWF5YmUgZXZlbiB0aGUgYml0IDwzPgogCSAqIGhhcyBzb21lIG1lYW5pbmcgaWYgYSB0YWJsZXQgaXMgYXR0YWNoZWQuCiAJICovCi0JbGVmdAk9IChidWZbMF0gJiAweDA0KT8gMTogMDsKLQltaWRkbGUJPSAoYnVmWzBdICYgMHgwMik/IDE6IDA7Ci0JcmlnaHQJPSAoYnVmWzBdICYgMHgwMSk/IDE6IDA7CisJbGVmdAk9IGJ1ZlswXSAmIDB4MDQ7CisJbWlkZGxlCT0gYnVmWzBdICYgMHgwMjsKKwlyaWdodAk9IGJ1ZlswXSAmIDB4MDE7CiAKLQl2c3h4eGFhX2Ryb3BfYnl0ZXMgKG1vdXNlLCA0KTsKLQl2c3h4eGFhX2RldGVjdGlvbl9kb25lIChtb3VzZSk7CisJdnN4eHhhYV9kcm9wX2J5dGVzKG1vdXNlLCA0KTsKKwl2c3h4eGFhX2RldGVjdGlvbl9kb25lKG1vdXNlKTsKIAogCWlmIChlcnJvciA8PSAweDFmKSB7CiAJCS8qIE5vIChzZXJpb3VzKSBlcnJvci4gUmVwb3J0IGJ1dHRvbnMgKi8KLQkJaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fTEVGVCwgbGVmdCk7Ci0JCWlucHV0X3JlcG9ydF9rZXkgKGRldiwgQlROX01JRERMRSwgbWlkZGxlKTsKLQkJaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fUklHSFQsIHJpZ2h0KTsKLQkJaW5wdXRfcmVwb3J0X2tleSAoZGV2LCBCVE5fVE9VQ0gsIDApOwotCQlpbnB1dF9zeW5jIChkZXYpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGxlZnQpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgbWlkZGxlKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgcmlnaHQpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCAwKTsKKwkJaW5wdXRfc3luYyhkZXYpOwogCiAJCWlmIChlcnJvciAhPSAwKQotCQkJcHJpbnRrIChLRVJOX0lORk8gIllvdXIgJXMgb24gJXMgcmVwb3J0cyBlcnJvcj0weCUwMnhcbiIsCi0JCQkJCW1vdXNlLT5uYW1lLCBtb3VzZS0+cGh5cywgZXJyb3IpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiWW91ciAlcyBvbiAlcyByZXBvcnRzIGVycm9yPTB4JTAyeFxuIiwKKwkJCQltb3VzZS0+bmFtZSwgbW91c2UtPnBoeXMsIGVycm9yKTsKIAogCX0KIApAQCAtMzgxLDE4ICszNzQsMTggQEAKIAkgKiBJZiB0aGUgbW91c2Ugd2FzIGhvdC1wbHVnZ2VkLCB3ZSBuZWVkIHRvIGZvcmNlIGRpZmZlcmVudGlhbCBtb2RlCiAJICogbm93Li4uIEhvd2V2ZXIsIGdpdmUgaXQgYSBzZWNvbmQgdG8gcmVjb3ZlciBmcm9tIGl0J3MgcmVzZXQuCiAJICovCi0JcHJpbnRrIChLRVJOX05PVElDRSAiJXMgb24gJXM6IEZvcmNlaW5nIHN0YW5kYXJkIHBhY2tldCBmb3JtYXQsICIKLQkJCSJpbmNyZW1lbnRhbCBzdHJlYW1pbmcgbW9kZSBhbmQgNzIgc2FtcGxlcy9zZWNcbiIsCi0JCQltb3VzZS0+bmFtZSwgbW91c2UtPnBoeXMpOwotCXNlcmlvX3dyaXRlIChtb3VzZS0+c2VyaW8sICdTJyk7CS8qIFN0YW5kYXJkIGZvcm1hdCAqLwotCW1kZWxheSAoNTApOwotCXNlcmlvX3dyaXRlIChtb3VzZS0+c2VyaW8sICdSJyk7CS8qIEluY3JlbWVudGFsICovCi0JbWRlbGF5ICg1MCk7Ci0Jc2VyaW9fd3JpdGUgKG1vdXNlLT5zZXJpbywgJ0wnKTsJLyogNzIgc2FtcGxlcy9zZWMgKi8KKwlwcmludGsoS0VSTl9OT1RJQ0UKKwkJIiVzIG9uICVzOiBGb3JjaW5nIHN0YW5kYXJkIHBhY2tldCBmb3JtYXQsICIKKwkJImluY3JlbWVudGFsIHN0cmVhbWluZyBtb2RlIGFuZCA3MiBzYW1wbGVzL3NlY1xuIiwKKwkJbW91c2UtPm5hbWUsIG1vdXNlLT5waHlzKTsKKwlzZXJpb193cml0ZShtb3VzZS0+c2VyaW8sICdTJyk7CS8qIFN0YW5kYXJkIGZvcm1hdCAqLworCW1kZWxheSg1MCk7CisJc2VyaW9fd3JpdGUobW91c2UtPnNlcmlvLCAnUicpOwkvKiBJbmNyZW1lbnRhbCAqLworCW1kZWxheSg1MCk7CisJc2VyaW9fd3JpdGUobW91c2UtPnNlcmlvLCAnTCcpOwkvKiA3MiBzYW1wbGVzL3NlYyAqLwogfQogCi1zdGF0aWMgdm9pZAotdnN4eHhhYV9wYXJzZV9idWZmZXIgKHN0cnVjdCB2c3h4eGFhICptb3VzZSkKK3N0YXRpYyB2b2lkIHZzeHh4YWFfcGFyc2VfYnVmZmVyKHN0cnVjdCB2c3h4eGFhICptb3VzZSkKIHsKIAl1bnNpZ25lZCBjaGFyICpidWYgPSBtb3VzZS0+YnVmOwogCWludCBzdHJheV9ieXRlczsKQEAgLTQwOSwxMjIgKzQwMiwxMDcgQEAKIAkJICogYWN0aXZpdHkgb24gdGhlIG1vdXNlLgogCQkgKi8KIAkJd2hpbGUgKG1vdXNlLT5jb3VudCA+IDAgJiYgIUlTX0hEUl9CWVRFKGJ1ZlswXSkpIHsKLQkJCXByaW50ayAoS0VSTl9FUlIgIiVzIG9uICVzOiBEcm9wcGluZyBhIGJ5dGUgdG8gcmVnYWluICIKLQkJCQkJInN5bmMgd2l0aCBtb3VzZSBkYXRhIHN0cmVhbS4uLlxuIiwKLQkJCQkJbW91c2UtPm5hbWUsIG1vdXNlLT5waHlzKTsKLQkJCXZzeHh4YWFfZHJvcF9ieXRlcyAobW91c2UsIDEpOworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBvbiAlczogRHJvcHBpbmcgYSBieXRlIHRvIHJlZ2FpbiAiCisJCQkJInN5bmMgd2l0aCBtb3VzZSBkYXRhIHN0cmVhbS4uLlxuIiwKKwkJCQltb3VzZS0+bmFtZSwgbW91c2UtPnBoeXMpOworCQkJdnN4eHhhYV9kcm9wX2J5dGVzKG1vdXNlLCAxKTsKIAkJfQogCiAJCS8qCiAJCSAqIENoZWNrIGZvciBwYWNrZXRzIHdlIGtub3cgYWJvdXQuCiAJCSAqLwogCi0JCWlmICh2c3h4eGFhX3NtZWxsc19saWtlX3BhY2tldCAobW91c2UsIFZTWFhYQUFfUEFDS0VUX1JFTCwgMykpIHsKKwkJaWYgKHZzeHh4YWFfc21lbGxzX2xpa2VfcGFja2V0KG1vdXNlLCBWU1hYWEFBX1BBQ0tFVF9SRUwsIDMpKSB7CiAJCQkvKiBDaGVjayBmb3IgYnJva2VuIHBhY2tldCAqLwotCQkJc3RyYXlfYnl0ZXMgPSB2c3h4eGFhX2NoZWNrX3BhY2tldCAobW91c2UsIDMpOwotCQkJaWYgKHN0cmF5X2J5dGVzID4gMCkgewotCQkJCXByaW50ayAoS0VSTl9FUlIgIkRyb3BwaW5nICVkIGJ5dGVzIG5vdy4uLlxuIiwKLQkJCQkJCXN0cmF5X2J5dGVzKTsKLQkJCQl2c3h4eGFhX2Ryb3BfYnl0ZXMgKG1vdXNlLCBzdHJheV9ieXRlcyk7Ci0JCQkJY29udGludWU7Ci0JCQl9CisJCQlzdHJheV9ieXRlcyA9IHZzeHh4YWFfY2hlY2tfcGFja2V0KG1vdXNlLCAzKTsKKwkJCWlmICghc3RyYXlfYnl0ZXMpCisJCQkJdnN4eHhhYV9oYW5kbGVfUkVMX3BhY2tldChtb3VzZSk7CiAKLQkJCXZzeHh4YWFfaGFuZGxlX1JFTF9wYWNrZXQgKG1vdXNlKTsKLQkJCWNvbnRpbnVlOyAvKiBNb3JlIHRvIHBhcnNlPyAqLworCQl9IGVsc2UgaWYgKHZzeHh4YWFfc21lbGxzX2xpa2VfcGFja2V0KG1vdXNlLAorCQkJCQkJICAgICAgVlNYWFhBQV9QQUNLRVRfQUJTLCA1KSkgeworCQkJLyogQ2hlY2sgZm9yIGJyb2tlbiBwYWNrZXQgKi8KKwkJCXN0cmF5X2J5dGVzID0gdnN4eHhhYV9jaGVja19wYWNrZXQobW91c2UsIDUpOworCQkJaWYgKCFzdHJheV9ieXRlcykKKwkJCQl2c3h4eGFhX2hhbmRsZV9BQlNfcGFja2V0KG1vdXNlKTsKKworCQl9IGVsc2UgaWYgKHZzeHh4YWFfc21lbGxzX2xpa2VfcGFja2V0KG1vdXNlLAorCQkJCQkJICAgICAgVlNYWFhBQV9QQUNLRVRfUE9SLCA0KSkgeworCQkJLyogQ2hlY2sgZm9yIGJyb2tlbiBwYWNrZXQgKi8KKwkJCXN0cmF5X2J5dGVzID0gdnN4eHhhYV9jaGVja19wYWNrZXQobW91c2UsIDQpOworCQkJaWYgKCFzdHJheV9ieXRlcykKKwkJCQl2c3h4eGFhX2hhbmRsZV9QT1JfcGFja2V0KG1vdXNlKTsKKworCQl9IGVsc2UgeworCQkJYnJlYWs7IC8qIE5vIFJFTCwgQUJTIG9yIFBPUiBwYWNrZXQgZm91bmQgKi8KIAkJfQogCi0JCWlmICh2c3h4eGFhX3NtZWxsc19saWtlX3BhY2tldCAobW91c2UsIFZTWFhYQUFfUEFDS0VUX0FCUywgNSkpIHsKLQkJCS8qIENoZWNrIGZvciBicm9rZW4gcGFja2V0ICovCi0JCQlzdHJheV9ieXRlcyA9IHZzeHh4YWFfY2hlY2tfcGFja2V0IChtb3VzZSwgNSk7Ci0JCQlpZiAoc3RyYXlfYnl0ZXMgPiAwKSB7Ci0JCQkJcHJpbnRrIChLRVJOX0VSUiAiRHJvcHBpbmcgJWQgYnl0ZXMgbm93Li4uXG4iLAotCQkJCQkJc3RyYXlfYnl0ZXMpOwotCQkJCXZzeHh4YWFfZHJvcF9ieXRlcyAobW91c2UsIHN0cmF5X2J5dGVzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJdnN4eHhhYV9oYW5kbGVfQUJTX3BhY2tldCAobW91c2UpOwotCQkJY29udGludWU7IC8qIE1vcmUgdG8gcGFyc2U/ICovCisJCWlmIChzdHJheV9ieXRlcyA+IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRHJvcHBpbmcgJWQgYnl0ZXMgbm93Li4uXG4iLAorCQkJCXN0cmF5X2J5dGVzKTsKKwkJCXZzeHh4YWFfZHJvcF9ieXRlcyhtb3VzZSwgc3RyYXlfYnl0ZXMpOwogCQl9CiAKLQkJaWYgKHZzeHh4YWFfc21lbGxzX2xpa2VfcGFja2V0IChtb3VzZSwgVlNYWFhBQV9QQUNLRVRfUE9SLCA0KSkgewotCQkJLyogQ2hlY2sgZm9yIGJyb2tlbiBwYWNrZXQgKi8KLQkJCXN0cmF5X2J5dGVzID0gdnN4eHhhYV9jaGVja19wYWNrZXQgKG1vdXNlLCA0KTsKLQkJCWlmIChzdHJheV9ieXRlcyA+IDApIHsKLQkJCQlwcmludGsgKEtFUk5fRVJSICJEcm9wcGluZyAlZCBieXRlcyBub3cuLi5cbiIsCi0JCQkJCQlzdHJheV9ieXRlcyk7Ci0JCQkJdnN4eHhhYV9kcm9wX2J5dGVzIChtb3VzZSwgc3RyYXlfYnl0ZXMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQl2c3h4eGFhX2hhbmRsZV9QT1JfcGFja2V0IChtb3VzZSk7Ci0JCQljb250aW51ZTsgLyogTW9yZSB0byBwYXJzZT8gKi8KLQkJfQotCi0JCWJyZWFrOyAvKiBObyBSRUwsIEFCUyBvciBQT1IgcGFja2V0IGZvdW5kICovCiAJfSB3aGlsZSAoMSk7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdAotdnN4eHhhYV9pbnRlcnJ1cHQgKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzKQorc3RhdGljIGlycXJldHVybl90IHZzeHh4YWFfaW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgdnN4eHhhYSAqbW91c2UgPSBzZXJpb19nZXRfZHJ2ZGF0YSAoc2VyaW8pOworCXN0cnVjdCB2c3h4eGFhICptb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKIAotCXZzeHh4YWFfcXVldWVfYnl0ZSAobW91c2UsIGRhdGEpOwotCXZzeHh4YWFfcGFyc2VfYnVmZmVyIChtb3VzZSk7CisJdnN4eHhhYV9xdWV1ZV9ieXRlKG1vdXNlLCBkYXRhKTsKKwl2c3h4eGFhX3BhcnNlX2J1ZmZlcihtb3VzZSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkCi12c3h4eGFhX2Rpc2Nvbm5lY3QgKHN0cnVjdCBzZXJpbyAqc2VyaW8pCitzdGF0aWMgdm9pZCB2c3h4eGFhX2Rpc2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKLQlzdHJ1Y3QgdnN4eHhhYSAqbW91c2UgPSBzZXJpb19nZXRfZHJ2ZGF0YSAoc2VyaW8pOworCXN0cnVjdCB2c3h4eGFhICptb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKIAotCXNlcmlvX2Nsb3NlIChzZXJpbyk7Ci0Jc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSAobW91c2UtPmRldik7Ci0Ja2ZyZWUgKG1vdXNlKTsKKwlzZXJpb19jbG9zZShzZXJpbyk7CisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKG1vdXNlLT5kZXYpOworCWtmcmVlKG1vdXNlKTsKIH0KIAotc3RhdGljIGludAotdnN4eHhhYV9jb25uZWN0IChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCitzdGF0aWMgaW50IHZzeHh4YWFfY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCiB7CiAJc3RydWN0IHZzeHh4YWEgKm1vdXNlOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAotCW1vdXNlID0ga3phbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdnN4eHhhYSksIEdGUF9LRVJORUwpOwotCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSAoKTsKKwltb3VzZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2c3h4eGFhKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFtb3VzZSB8fCAhaW5wdXRfZGV2KQogCQlnb3RvIGZhaWwxOwogCiAJbW91c2UtPmRldiA9IGlucHV0X2RldjsKIAltb3VzZS0+c2VyaW8gPSBzZXJpbzsKLQlzdHJsY2F0IChtb3VzZS0+bmFtZSwgIkRFQyBWU1hYWC1BQS8tR0EgbW91c2Ugb3IgVlNYWFgtQUIgZGlnaXRpemVyIiwKLQkJIHNpemVvZiAobW91c2UtPm5hbWUpKTsKLQlzbnByaW50ZiAobW91c2UtPnBoeXMsIHNpemVvZiAobW91c2UtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCXN0cmxjYXQobW91c2UtPm5hbWUsICJERUMgVlNYWFgtQUEvLUdBIG1vdXNlIG9yIFZTWFhYLUFCIGRpZ2l0aXplciIsCisJCSBzaXplb2YobW91c2UtPm5hbWUpKTsKKwlzbnByaW50Zihtb3VzZS0+cGh5cywgc2l6ZW9mKG1vdXNlLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9IG1vdXNlLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyA9IG1vdXNlLT5waHlzOwogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19SUzIzMjsKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKIAotCXNldF9iaXQgKEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CQkvKiBXZSBoYXZlIGJ1dHRvbnMgKi8KLQlzZXRfYml0IChFVl9SRUwsIGlucHV0X2Rldi0+ZXZiaXQpOwotCXNldF9iaXQgKEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7Ci0Jc2V0X2JpdCAoQlROX0xFRlQsIGlucHV0X2Rldi0+a2V5Yml0KTsJCS8qIFdlIGhhdmUgMyBidXR0b25zICovCi0Jc2V0X2JpdCAoQlROX01JRERMRSwgaW5wdXRfZGV2LT5rZXliaXQpOwotCXNldF9iaXQgKEJUTl9SSUdIVCwgaW5wdXRfZGV2LT5rZXliaXQpOwotCXNldF9iaXQgKEJUTl9UT1VDSCwgaW5wdXRfZGV2LT5rZXliaXQpOwkJLyogLi4uYW5kIFRhYmxldCAqLwotCXNldF9iaXQgKFJFTF9YLCBpbnB1dF9kZXYtPnJlbGJpdCk7Ci0Jc2V0X2JpdCAoUkVMX1ksIGlucHV0X2Rldi0+cmVsYml0KTsKLQlpbnB1dF9zZXRfYWJzX3BhcmFtcyAoaW5wdXRfZGV2LCBBQlNfWCwgMCwgMTAyMywgMCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMgKGlucHV0X2RldiwgQUJTX1ksIDAsIDEwMjMsIDAsIDApOworCV9fc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOwkJLyogV2UgaGF2ZSBidXR0b25zICovCisJX19zZXRfYml0KEVWX1JFTCwgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEJUTl9MRUZULCBpbnB1dF9kZXYtPmtleWJpdCk7CQkvKiBXZSBoYXZlIDMgYnV0dG9ucyAqLworCV9fc2V0X2JpdChCVE5fTUlERExFLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJX19zZXRfYml0KEJUTl9SSUdIVCwgaW5wdXRfZGV2LT5rZXliaXQpOworCV9fc2V0X2JpdChCVE5fVE9VQ0gsIGlucHV0X2Rldi0+a2V5Yml0KTsJLyogLi4uYW5kIFRhYmxldCAqLworCV9fc2V0X2JpdChSRUxfWCwgaW5wdXRfZGV2LT5yZWxiaXQpOworCV9fc2V0X2JpdChSRUxfWSwgaW5wdXRfZGV2LT5yZWxiaXQpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIDEwMjMsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsIDEwMjMsIDAsIDApOwogCi0Jc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBtb3VzZSk7CisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIG1vdXNlKTsKIAotCWVyciA9IHNlcmlvX29wZW4gKHNlcmlvLCBkcnYpOworCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsMjsKIApAQCAtNTMyLDE4ICs1MTAsMTggQEAKIAkgKiBSZXF1ZXN0IHNlbGZ0ZXN0LiBTdGFuZGFyZCBwYWNrZXQgZm9ybWF0IGFuZCBkaWZmZXJlbnRpYWwKIAkgKiBtb2RlIHdpbGwgYmUgcmVxdWVzdGVkIGFmdGVyIHRoZSBkZXZpY2UgSUQnZWQgc3VjY2Vzc2Z1bGx5LgogCSAqLwotCXNlcmlvX3dyaXRlIChzZXJpbywgJ1QnKTsgLyogVGVzdCAqLworCXNlcmlvX3dyaXRlKHNlcmlvLCAnVCcpOyAvKiBUZXN0ICovCiAKLQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UgKGlucHV0X2Rldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsMzsKIAogCXJldHVybiAwOwogCi0gZmFpbDM6CXNlcmlvX2Nsb3NlIChzZXJpbyk7Ci0gZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhIChzZXJpbywgTlVMTCk7Ci0gZmFpbDE6CWlucHV0X2ZyZWVfZGV2aWNlIChpbnB1dF9kZXYpOwotCWtmcmVlIChtb3VzZSk7CisgZmFpbDM6CXNlcmlvX2Nsb3NlKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworIGZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKG1vdXNlKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC01NzAsMTggKzU0OCwxNiBAQAogCS5kaXNjb25uZWN0CT0gdnN4eHhhYV9kaXNjb25uZWN0LAogfTsKIAotc3RhdGljIGludCBfX2luaXQKLXZzeHh4YWFfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHZzeHh4YWFfaW5pdCh2b2lkKQogewogCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnZzeHh4YWFfZHJ2KTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0Ci12c3h4eGFhX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdnN4eHhhYV9leGl0KHZvaWQpCiB7CiAJc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZzeHh4YWFfZHJ2KTsKIH0KIAotbW9kdWxlX2luaXQgKHZzeHh4YWFfaW5pdCk7Ci1tb2R1bGVfZXhpdCAodnN4eHhhYV9leGl0KTsKK21vZHVsZV9pbml0KHZzeHh4YWFfaW5pdCk7Cittb2R1bGVfZXhpdCh2c3h4eGFhX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcKaW5kZXggYWE1MzNjZS4uN2UzMTlkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vS2NvbmZpZwpAQCAtMjAxLDQgKzIwMSwxMiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgeGlsaW54X3BzMi4KIAorY29uZmlnIFNFUklPX0FMVEVSQV9QUzIKKwl0cmlzdGF0ZSAiQWx0ZXJhIFVQIFBTLzIgY29udHJvbGxlciIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIEFsdGVyYSBVbml2ZXJzaXR5IFByb2dyYW0gUFMvMiBwb3J0cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWx0ZXJhX3BzMi4KKwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L3NlcmlvL01ha2VmaWxlCmluZGV4IDliNmM4MTMuLmJmOTQ1ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9NYWtlZmlsZQpAQCAtMjIsMyArMjIsNCBAQAogb2JqLSQoQ09ORklHX1NFUklPX0xJQlBTMikJKz0gbGlicHMyLm8KIG9iai0kKENPTkZJR19TRVJJT19SQVcpCQkrPSBzZXJpb19yYXcubwogb2JqLSQoQ09ORklHX1NFUklPX1hJTElOWF9YUFNfUFMyKQkrPSB4aWxpbnhfcHMyLm8KK29iai0kKENPTkZJR19TRVJJT19BTFRFUkFfUFMyKQkrPSBhbHRlcmFfcHMyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vYWx0ZXJhX3BzMi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9hbHRlcmFfcHMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3OWVhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vYWx0ZXJhX3BzMi5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQWx0ZXJhIFVuaXZlcnNpdHkgUHJvZ3JhbSBQUzIgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhvbWFzIENob3UgPHRob21hc0B3eXRyb24uY29tLnR3PgorICoKKyAqIEJhc2VkIG9uIHNhMTExMXBzMi5jLCB3aGljaCBpczoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgImFsdGVyYV9wczIiCisKK3N0cnVjdCBwczJpZiB7CisJc3RydWN0IHNlcmlvICppbzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvbWVtX3JlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgaXJxOworfTsKKworLyoKKyAqIFJlYWQgYWxsIGJ5dGVzIHdhaXRpbmcgaW4gdGhlIFBTMiBwb3J0LiAgVGhlcmUgc2hvdWxkIGJlCisgKiBhdCB0aGUgbW9zdCBvbmUsIGJ1dCB3ZSBsb29wIGZvciBzYWZldHkuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhbHRlcmFfcHMyX3J4aW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcHMyaWYgKnBzMmlmID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IGhhbmRsZWQgPSBJUlFfTk9ORTsKKworCXdoaWxlICgoc3RhdHVzID0gcmVhZGwocHMyaWYtPmJhc2UpKSAmIDB4ZmZmZjAwMDApIHsKKwkJc2VyaW9faW50ZXJydXB0KHBzMmlmLT5pbywgc3RhdHVzICYgMHhmZiwgMCk7CisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworLyoKKyAqIFdyaXRlIGEgYnl0ZSB0byB0aGUgUFMyIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgYWx0ZXJhX3BzMl93cml0ZShzdHJ1Y3Qgc2VyaW8gKmlvLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlzdHJ1Y3QgcHMyaWYgKnBzMmlmID0gaW8tPnBvcnRfZGF0YTsKKworCXdyaXRlbCh2YWwsIHBzMmlmLT5iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHRlcmFfcHMyX29wZW4oc3RydWN0IHNlcmlvICppbykKK3sKKwlzdHJ1Y3QgcHMyaWYgKnBzMmlmID0gaW8tPnBvcnRfZGF0YTsKKworCS8qIGNsZWFyIGZpZm8gKi8KKwl3aGlsZSAocmVhZGwocHMyaWYtPmJhc2UpICYgMHhmZmZmMDAwMCkKKwkJLyogZW1wdHkgKi87CisKKwl3cml0ZWwoMSwgcHMyaWYtPmJhc2UgKyA0KTsgLyogZW5hYmxlIHJ4IGlycSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbHRlcmFfcHMyX2Nsb3NlKHN0cnVjdCBzZXJpbyAqaW8pCit7CisJc3RydWN0IHBzMmlmICpwczJpZiA9IGlvLT5wb3J0X2RhdGE7CisKKwl3cml0ZWwoMCwgcHMyaWYtPmJhc2UpOyAvKiBkaXNhYmxlIHJ4IGlycSAqLworfQorCisvKgorICogQWRkIG9uZSBkZXZpY2UgdG8gdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgYWx0ZXJhX3BzMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwczJpZiAqcHMyaWY7CisJc3RydWN0IHNlcmlvICpzZXJpbzsKKwlpbnQgZXJyb3I7CisKKwlwczJpZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczJpZiksIEdGUF9LRVJORUwpOworCXNlcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwczJpZiB8fCAhc2VyaW8pIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlzZXJpby0+aWQudHlwZQkJPSBTRVJJT184MDQyOworCXNlcmlvLT53cml0ZQkJPSBhbHRlcmFfcHMyX3dyaXRlOworCXNlcmlvLT5vcGVuCQk9IGFsdGVyYV9wczJfb3BlbjsKKwlzZXJpby0+Y2xvc2UJCT0gYWx0ZXJhX3BzMl9jbG9zZTsKKwlzdHJsY3B5KHNlcmlvLT5uYW1lLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7CisJc3RybGNweShzZXJpby0+cGh5cywgZGV2X25hbWUoJnBkZXYtPmRldiksIHNpemVvZihzZXJpby0+cGh5cykpOworCXNlcmlvLT5wb3J0X2RhdGEJPSBwczJpZjsKKwlzZXJpby0+ZGV2LnBhcmVudAk9ICZwZGV2LT5kZXY7CisJcHMyaWYtPmlvCQk9IHNlcmlvOworCisJcHMyaWYtPmlvbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHBzMmlmLT5pb21lbV9yZXMgPT0gTlVMTCkgeworCQllcnJvciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCXBzMmlmLT5pcnEgID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocHMyaWYtPmlycSA8IDApIHsKKwkJZXJyb3IgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBzMmlmLT5pb21lbV9yZXMtPnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUocHMyaWYtPmlvbWVtX3JlcyksIHBkZXYtPm5hbWUpKSB7CisJCWVycm9yID0gLUVCVVNZOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlwczJpZi0+YmFzZSA9IGlvcmVtYXAocHMyaWYtPmlvbWVtX3Jlcy0+c3RhcnQsCisJCQkgICAgICByZXNvdXJjZV9zaXplKHBzMmlmLT5pb21lbV9yZXMpKTsKKwlpZiAoIXBzMmlmLT5iYXNlKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9yZXM7CisJfQorCisJZXJyb3IgPSByZXF1ZXN0X2lycShwczJpZi0+aXJxLCBhbHRlcmFfcHMyX3J4aW50LCAwLCBwZGV2LT5uYW1lLCBwczJpZik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBJUlEgJWQ6ICVkXG4iLAorCQkJcHMyaWYtPmlycSwgZXJyb3IpOworCQlnb3RvIGVycl91bm1hcDsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiYmFzZSAlcCwgaXJxICVkXG4iLCBwczJpZi0+YmFzZSwgcHMyaWYtPmlycSk7CisKKwlzZXJpb19yZWdpc3Rlcl9wb3J0KHBzMmlmLT5pbyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHMyaWYpOworCisJcmV0dXJuIDA7CisKKyBlcnJfdW5tYXA6CisJaW91bm1hcChwczJpZi0+YmFzZSk7CisgZXJyX2ZyZWVfcmVzOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihwczJpZi0+aW9tZW1fcmVzLT5zdGFydCwKKwkJCSAgIHJlc291cmNlX3NpemUocHMyaWYtPmlvbWVtX3JlcykpOworIGVycl9mcmVlX21lbToKKwlrZnJlZShwczJpZik7CisJa2ZyZWUoc2VyaW8pOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJlbW92ZSBvbmUgZGV2aWNlIGZyb20gdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgYWx0ZXJhX3BzMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHMyaWYgKnBzMmlmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlzZXJpb191bnJlZ2lzdGVyX3BvcnQocHMyaWYtPmlvKTsKKwlmcmVlX2lycShwczJpZi0+aXJxLCBwczJpZik7CisJaW91bm1hcChwczJpZi0+YmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBzMmlmLT5pb21lbV9yZXMtPnN0YXJ0LAorCQkJICAgcmVzb3VyY2Vfc2l6ZShwczJpZi0+aW9tZW1fcmVzKSk7CisJa2ZyZWUocHMyaWYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPdXIgZGV2aWNlIGRyaXZlciBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWx0ZXJhX3BzMl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFsdGVyYV9wczJfcHJvYmUsCisJLnJlbW92ZQkJPSBhbHRlcmFfcHMyX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9IERSVl9OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbHRlcmFfcHMyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbHRlcmFfcHMyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHRlcmFfcHMyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWx0ZXJhX3BzMl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbHRlcmFfcHMyX2luaXQpOworbW9kdWxlX2V4aXQoYWx0ZXJhX3BzMl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbHRlcmEgVW5pdmVyc2l0eSBQcm9ncmFtIFBTMiBjb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVGhvbWFzIENob3UgPHRob21hc0B3eXRyb24uY29tLnR3PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hwX3NkYy5jCmluZGV4IDFjOTQxMGQuLmJjYzJkMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9ocF9zZGMuYwpAQCAtOTU1LDcgKzk1NSw3IEBACiAJSU5JVF9ERUxBWUVEX1dPUksoJm1vZHVsZWxvYWRlcl93b3JrLCByZXF1ZXN0X21vZHVsZV9kZWxheWVkKTsKIAogCXJldCA9IGhwX3NkY19pbml0KCk7Ci0JLyogYWZ0ZXIgc3VjZXNzZnVsbCBpbml0aWFsaXphdGlvbiBnaXZlIFNEQyBzb21lIHRpbWUgdG8gc2V0dGxlCisJLyogYWZ0ZXIgc3VjY2Vzc2Z1bGwgaW5pdGlhbGl6YXRpb24gZ2l2ZSBTREMgc29tZSB0aW1lIHRvIHNldHRsZQogCSAqIGFuZCB0aGVuIGxvYWQgdGhlIGhwX3NkY19tbGMgdXBwZXIgbGF5ZXIgZHJpdmVyICovCiAJaWYgKCFyZXQpCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbW9kdWxlbG9hZGVyX3dvcmssCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2hwX3NkY19tbGMuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjX21sYy5jCmluZGV4IDgyMGU1MTYuLjdkMmI4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjX21sYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjX21sYy5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5rb3duIEhJTCBFcnJvciBzdGF0dXMgKCV4KSFcbiIsIGRhdGEpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5rbm93biBISUwgRXJyb3Igc3RhdHVzICgleCkhXG4iLCBkYXRhKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAppbmRleCAyYmNmMWFjLi43ZmJmZmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKQEAgLTY3LDEwICs2NywxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGk4MDQyX2RtaV9ub2xvb3BfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRjb25zdCBpODA0Ml9kbWlfbm9sb29wX3RhYmxlW10gPSB7CiAJewotCQkvKiBBVVggTE9PUCBjb21tYW5kIGRvZXMgbm90IHJhaXNlIEFVWCBJUlEgKi8KLQkJLmlkZW50ID0gIkFyaW1hLVJpb3dvcmtzIEhEQU1CIiwKKwkJLyoKKwkJICogQXJpbWEtUmlvd29ya3MgSERBTUIgLQorCQkgKiBBVVggTE9PUCBjb21tYW5kIGRvZXMgbm90IHJhaXNlIEFVWCBJUlEKKwkJICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJSSU9XT1JLUyIpLAogCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiSERBTUIiKSwKQEAgLTc4LDcgKzgwLDcgQEAKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkFTVVMgRzFTIiwKKwkJLyogQVNVUyBHMVMgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSW5jLiIpLAogCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiRzFTIiksCkBAIC04Niw4ICs4OCw3IEBACiAJCX0sCiAJfSwKIAl7Ci0JCS8qIEFVWCBMT09QIGNvbW1hbmQgZG9lcyBub3QgcmFpc2UgQVVYIElSUSAqLwotCQkuaWRlbnQgPSAiQVNVUyBQNjVVUDUiLAorCQkvKiBBU1VTIFA2NVVQNSAtIEFVWCBMT09QIGNvbW1hbmQgZG9lcyBub3QgcmFpc2UgQVVYIElSUSAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQL0ktUDY1VVA1IiksCkBAIC05NSw3ICs5Niw2IEBACiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJDb21wYXEgUHJvbGlhbnQgODUwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQ29tcGFxIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSAsICJQcm9MaWFudCIpLApAQCAtMTAzLDcgKzEwMyw2IEBACiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJDb21wYXEgUHJvbGlhbnQgREw3NjAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbXBhcSIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUgLCAiUHJvTGlhbnQiKSwKQEAgLTExMSw3ICsxMTAsNyBAQAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiT1FPIE1vZGVsIDAxIiwKKwkJLyogT1FPIE1vZGVsIDAxICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiT1FPIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlpFUFRPIiksCkBAIC0xMTksOCArMTE4LDcgQEAKIAkJfSwKIAl9LAogCXsKLQkJLyogQVVYIExPT1AgZG9lcyBub3Qgd29yayBwcm9wZXJseSAqLwotCQkuaWRlbnQgPSAiVUxJIEVWNDg3MyIsCisJCS8qIFVMSSBFVjQ4NzMgLSBBVVggTE9PUCBkb2VzIG5vdCB3b3JrIHByb3Blcmx5ICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVUxJIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkVWNDg3MyIpLApAQCAtMTI4LDcgKzEyNiw3IEBACiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJNaWNyb3NvZnQgVmlydHVhbCBNYWNoaW5lIiwKKwkJLyogTWljcm9zb2Z0IFZpcnR1YWwgTWFjaGluZSAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1pY3Jvc29mdCBDb3Jwb3JhdGlvbiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWaXJ0dWFsIE1hY2hpbmUiKSwKQEAgLTEzNiw3ICsxMzQsNyBAQAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiTWVkaW9uIE1BTSAyMDcwIiwKKwkJLyogTWVkaW9uIE1BTSAyMDcwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTm90ZWJvb2siKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTUFNIDIwNzAiKSwKQEAgLTE0NCw3ICsxNDIsNyBAQAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiQmx1ZSBGQjU2MDEiLAorCQkvKiBCbHVlIEZCNTYwMSAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgImJsdWUiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiRkI1NjAxIiksCkBAIC0xNTIsNyArMTUwLDcgQEAKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkdpZ2FieXRlIE05MTIiLAorCQkvKiBHaWdhYnl0ZSBNOTEyICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiR0lHQUJZVEUiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTTkxMiIpLApAQCAtMTYwLDcgKzE1OCw2IEBACiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJIUCBEVjk3MDAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIUCBQYXZpbGlvbiBkdjk3MDAiKSwKQEAgLTE3Nyw3MiArMTc0LDcyIEBACiAgKiAuLi4gYXBwYXJlbnRseSBzb21lIFRvc2hpYmFzIGRvbid0IGxpa2UgTVVYIG1vZGUgZWl0aGVyIGFuZAogICogZGllIGhvcnJpYmxlIGRlYXRoIG9uIHJlYm9vdC4KICAqLwotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgaTgwNDJfZG1pX25vbXV4X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0Y29uc3QgaTgwNDJfZG1pX25vbXV4X3RhYmxlW10gPSB7CiAJewotCQkuaWRlbnQgPSAiRnVqaXRzdSBMaWZlYm9vayBQNzAxMC9QNzAxMEQiLAorCQkvKiBGdWppdHN1IExpZmVib29rIFA3MDEwL1A3MDEwRCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUDcwMTAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UgTGlmZWJvb2sgUDcwMTAiLAorCQkvKiBGdWppdHN1IExpZmVib29rIFA3MDEwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjAwMDAwMDAwMDAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UgTGlmZWJvb2sgUDUwMjBEIiwKKwkJLyogRnVqaXRzdSBMaWZlYm9vayBQNTAyMEQgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpZmVCb29rIFAgU2VyaWVzIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJGdWppdHN1IExpZmVib29rIFMyMDAwIiwKKwkJLyogRnVqaXRzdSBMaWZlYm9vayBTMjAwMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGlmZUJvb2sgUyBTZXJpZXMiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UgTGlmZWJvb2sgUzYyMzAiLAorCQkvKiBGdWppdHN1IExpZmVib29rIFM2MjMwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMaWZlQm9vayBTNjIzMCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiRnVqaXRzdSBUNzBIIiwKKwkJLyogRnVqaXRzdSBUNzBIICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJGTVZMVDcwSCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIExpZmVib29rIFQzMDEwIiwKKwkJLyogRnVqaXRzdS1TaWVtZW5zIExpZmVib29rIFQzMDEwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxJRkVCT09LIFQzMDEwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJGdWppdHN1LVNpZW1lbnMgTGlmZWJvb2sgRTQwMTAiLAorCQkvKiBGdWppdHN1LVNpZW1lbnMgTGlmZWJvb2sgRTQwMTAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTElGRUJPT0sgRTQwMTAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UtU2llbWVucyBBbWlsbyBQcm8gMjAxMCIsCisJCS8qIEZ1aml0c3UtU2llbWVucyBBbWlsbyBQcm8gMjAxMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBQcm8gVjIwMTAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkZ1aml0c3UtU2llbWVucyBBbWlsbyBQcm8gMjAzMCIsCisJCS8qIEZ1aml0c3UtU2llbWVucyBBbWlsbyBQcm8gMjAzMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBQUk8gVjIwMzAiKSwKQEAgLTI1Myw3ICsyNTAsNyBAQAogCQkgKiBObyBkYXRhIGlzIGNvbWluZyBmcm9tIHRoZSB0b3VjaHNjcmVlbiB1bmxlc3MgS0JDCiAJCSAqIGlzIGluIGxlZ2FjeSBtb2RlLgogCQkgKi8KLQkJLmlkZW50ID0gIlBhbmFzb25pYyBDRi0yOSIsCisJCS8qIFBhbmFzb25pYyBDRi0yOSAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1hdHN1c2hpdGEiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQ0YtMjkiKSwKQEAgLTI2MSwxMCArMjU4LDEwIEBACiAJfSwKIAl7CiAJCS8qCi0JCSAqIEVycm9ycyBvbiBNVVggcG9ydHMgYXJlIHJlcG9ydGVkIHdpdGhvdXQgcmFpc2luZyBBVVhEQVRBCisJCSAqIEhQIFBhdmlsaW9uIERWNDAxN0VBIC0KKwkJICogZXJyb3JzIG9uIE1VWCBwb3J0cyBhcmUgcmVwb3J0ZWQgd2l0aG91dCByYWlzaW5nIEFVWERBVEEKIAkJICogY2F1c2luZyAic3B1cmlvdXMgTkFLIiBtZXNzYWdlcy4KIAkJICovCi0JCS5pZGVudCA9ICJIUCBQYXZpbGlvbiBEVjQwMTdFQSIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBhdmlsaW9uIGR2NDAwMCAoRUEwMzJFQSNBQkYpIiksCkBAIC0yNzIsOSArMjY5LDkgQEAKIAl9LAogCXsKIAkJLyoKLQkJICogTGlrZSBEVjQwMTdFQSBkb2VzIG5vdCByYWlzZSBBVVhFUlIgZm9yIGVycm9ycyBvbiBNVVggcG9ydHMuCisJCSAqIEhQIFBhdmlsaW9uIFpUMTAwMCAtCisJCSAqIGxpa2UgRFY0MDE3RUEgZG9lcyBub3QgcmFpc2UgQVVYRVJSIGZvciBlcnJvcnMgb24gTVVYIHBvcnRzLgogCQkgKi8KLQkJLmlkZW50ID0gIkhQIFBhdmlsaW9uIFpUMTAwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIFBhdmlsaW9uIE5vdGVib29rIFBDIiksCkBAIC0yODMsNDQgKzI4MCw0MSBAQAogCX0sCiAJewogCQkvKgotCQkgKiBMaWtlIERWNDAxN0VBIGRvZXMgbm90IHJhaXNlIEFVWEVSUiBmb3IgZXJyb3JzIG9uIE1VWCBwb3J0cy4KKwkJICogSFAgUGF2aWxpb24gRFY0MjcwY2EgLQorCQkgKiBsaWtlIERWNDAxN0VBIGRvZXMgbm90IHJhaXNlIEFVWEVSUiBmb3IgZXJyb3JzIG9uIE1VWCBwb3J0cy4KIAkJICovCi0JCS5pZGVudCA9ICJIUCBQYXZpbGlvbiBEVjQyNzBjYSIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBhdmlsaW9uIGR2NDAwMCAoRUg0NzZVQSNBQkwpIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJUb3NoaWJhIFAxMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVE9TSElCQSIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTYXRlbGxpdGUgUDEwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJUb3NoaWJhIEVxdWl1bSBBMTEwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUT1NISUJBIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkVRVUlVTSBBMTEwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJBbGllbndhcmUgU2VudGlhIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBTElFTldBUkUiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU2VudGlhIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJTaGFycCBBY3RpdXMgTU0yMCIsCisJCS8qIFNoYXJwIEFjdGl1cyBNTTIwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0hBUlAiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUEMtTU0yMCBTZXJpZXMiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIlNvbnkgVmFpbyBGUy0xMTViIiwKKwkJLyogU29ueSBWYWlvIEZTLTExNWIgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1GUzExNUIiKSwKQEAgLTMyOCw3MyArMzIyLDcyIEBACiAJfSwKIAl7CiAJCS8qCi0JCSAqIFJlc2V0IGFuZCBHRVQgSUQgY29tbWFuZHMgaXNzdWVkIHZpYSBLQkQgcG9ydCBhcmUKKwkJICogU29ueSBWYWlvIEZaLTI0MEUgLQorCQkgKiByZXNldCBhbmQgR0VUIElEIGNvbW1hbmRzIGlzc3VlZCB2aWEgS0JEIHBvcnQgYXJlCiAJCSAqIHNvbWV0aW1lcyBiZWluZyBkZWxpdmVyZWQgdG8gQVVYMy4KIAkJICovCi0JCS5pZGVudCA9ICJTb255IFZhaW8gRlotMjQwRSIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tRloyNDBFIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJBbW9pIE02MzYvQTczNyIsCisJCS8qIEFtb2kgTTYzNi9BNzM3ICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQW1vaSBFbGVjdHJvbmljcyBDTy4sTFRELiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNNjM2L0E3MzcgcGxhdGZvcm0iKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkxlbm92byAzMDAwIG4xMDAiLAorCQkvKiBMZW5vdm8gMzAwMCBuMTAwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTEVOT1ZPIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjA3NjgwNFUiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDEzNjAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDEzNjAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkdlcmljb20gQmVsbGFnaW8iLAorCQkvKiBHZXJpY29tIEJlbGxhZ2lvICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiR2VyaWNvbSIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOMzRBUzYiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIklCTSAyNjU2IiwKKwkJLyogSUJNIDI2NTYgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJJQk0iKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiMjY1NiIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiRGVsbCBYUFMgTTE1MzAiLAorCQkvKiBEZWxsIFhQUyBNMTUzMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMgTTE1MzAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkNvbXBhbCBIRUw4MEkiLAorCQkvKiBDb21wYWwgSEVMODBJICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQ09NUEFMIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhFTDgwSSIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiRGVsbCBWb3N0cm8gMTUxMCIsCisJCS8qIERlbGwgVm9zdHJvIDE1MTAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9zdHJvMTUxMCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiQWNlciBBc3BpcmUgNTUzNiIsCisJCS8qIEFjZXIgQXNwaXJlIDU1MzYgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSA1NTM2IiksCkBAIC00MDQsNjUgKzM5Nyw2NSBAQAogCXsgfQogfTsKIAotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgaTgwNDJfZG1pX3Jlc2V0X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0Y29uc3QgaTgwNDJfZG1pX3Jlc2V0X3RhYmxlW10gPSB7CiAJewotCQkuaWRlbnQgPSAiTVNJIFdpbmQgVS0xMDAiLAorCQkvKiBNU0kgV2luZCBVLTEwMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlUtMTAwIiksCiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIk1JQ1JPLVNUQVIgSU5URVJOQVRJT05BTCBDTy4sIExURCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiTEcgRWxlY3Ryb25pY3MgWDExMCIsCisJCS8qIExHIEVsZWN0cm9uaWNzIFgxMTAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJYMTEwIiksCiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkxHIEVsZWN0cm9uaWNzIEluYy4iKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIE9uZSAxNTAiLAorCQkvKiBBY2VyIEFzcGlyZSBPbmUgMTUwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBT0ExNTAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkFkdmVudCA0MjExIiwKKwkJLyogQWR2ZW50IDQyMTEgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJESVhPTlNYUCIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBZHZlbnQgNDIxMSIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiTWVkaW9uIEFrb3lhIE1pbmkgRTEyMTAiLAorCQkvKiBNZWRpb24gQWtveWEgTWluaSBFMTIxMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1FRElPTiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJFMTIxMCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiTWl2dnkgTTMxMCIsCisJCS8qIE1pdnZ5IE0zMTAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJWSU9PTyIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOMTAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkRlbGwgVm9zdHJvIDEzMjAiLAorCQkvKiBEZWxsIFZvc3RybyAxMzIwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZvc3RybyAxMzIwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJEZWxsIFZvc3RybyAxNTIwIiwKKwkJLyogRGVsbCBWb3N0cm8gMTUyMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWb3N0cm8gMTUyMCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiRGVsbCBWb3N0cm8gMTcyMCIsCisJCS8qIERlbGwgVm9zdHJvIDE3MjAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9zdHJvIDE3MjAiKSwKQEAgLTQ3MiwxNiArNDY1LDE2IEBACiB9OwogCiAjaWZkZWYgQ09ORklHX1BOUAotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgaTgwNDJfZG1pX25vcG5wX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0Y29uc3QgaTgwNDJfZG1pX25vcG5wX3RhYmxlW10gPSB7CiAJewotCQkuaWRlbnQgPSAiSW50ZWwgTUJPIERlc2t0b3AgRDg0NVBFU1YiLAorCQkvKiBJbnRlbCBNQk8gRGVza3RvcCBEODQ1UEVTViAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkQ4NDVQRVNWIiksCiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkludGVsIENvcnBvcmF0aW9uIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJNU0kgV2luZCBVLTEwMCIsCisJCS8qIE1TSSBXaW5kIFUtMTAwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiVS0xMDAiKSwKIAkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiTUlDUk8tU1RBUiBJTlRFUk5BVElPTkFMIENPLiwgTFREIiksCkBAIC00OTAsMjcgKzQ4MywyMyBAQAogCXsgfQogfTsKIAotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgaTgwNDJfZG1pX2xhcHRvcF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGNvbnN0IGk4MDQyX2RtaV9sYXB0b3BfdGFibGVbXSA9IHsKIAl7Ci0JCS5pZGVudCA9ICJQb3J0YWJsZSIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9DSEFTU0lTX1RZUEUsICI4IiksIC8qIFBvcnRhYmxlICovCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJMYXB0b3AiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiOSIpLCAvKiBMYXB0b3AgKi8KIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIk5vdGVib29rIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX0NIQVNTSVNfVFlQRSwgIjEwIiksIC8qIE5vdGVib29rICovCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJTdWItTm90ZWJvb2siLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiMTQiKSwgLyogU3ViLU5vdGVib29rICovCiAJCX0sCkBAIC01MjUsNTggKzUxNCw1OCBAQAogICogT3JpZ2luYWxseSwgdGhpcyB3YXMganVzdCBjb25maW5lZCB0byBvbGRlciBsYXB0b3BzLCBidXQgYSBmZXcgQWNlciBsYXB0b3BzCiAgKiBoYXZlIHR1cm5lZCB1cCBpbiAyMDA3IHRoYXQgYWxzbyBuZWVkIHRoaXMgYWdhaW4uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGk4MDQyX2RtaV9kcml0ZWtfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRjb25zdCBpODA0Ml9kbWlfZHJpdGVrX3RhYmxlW10gPSB7CiAJewotCQkuaWRlbnQgPSAiQWNlciBBc3BpcmUgNTYzMCIsCisJCS8qIEFjZXIgQXNwaXJlIDU2MzAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSA1NjMwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJBY2VyIEFzcGlyZSA1NjUwIiwKKwkJLyogQWNlciBBc3BpcmUgNTY1MCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2NTAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDU2ODAiLAorCQkvKiBBY2VyIEFzcGlyZSA1NjgwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBc3BpcmUgNTY4MCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiQWNlciBBc3BpcmUgNTcyMCIsCisJCS8qIEFjZXIgQXNwaXJlIDU3MjAgKi8KIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSA1NzIwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJBY2VyIEFzcGlyZSA5MTEwIiwKKwkJLyogQWNlciBBc3BpcmUgOTExMCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDkxMTAiKSwKIAkJfSwKIAl9LAogCXsKLQkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSA2NjAiLAorCQkvKiBBY2VyIFRyYXZlbE1hdGUgNjYwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDY2MCIpLAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDI0OTAiLAorCQkvKiBBY2VyIFRyYXZlbE1hdGUgMjQ5MCAqLwogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAyNDkwIiksCiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgNDI4MCIsCisJCS8qIEFjZXIgVHJhdmVsTWF0ZSA0MjgwICovCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDQyODAiKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc3BhcnNlLWtleW1hcC5jIGIvZHJpdmVycy9pbnB1dC9zcGFyc2Uta2V5bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkMzk4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvc3BhcnNlLWtleW1hcC5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogR2VuZXJpYyBzdXBwb3J0IGZvciBzcGFyc2Uga2V5bWFwcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEbWl0cnkgVG9yb2tob3YKKyAqCisgKiBEZXJpdmVkIGZyb20gd2lzdHJvbiBidXR0b24gZHJpdmVyOgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1pbG9zbGF2IFRybWFjIDxtaXRyQHZvbG55LmN6PgorICogQ29weXJpZ2h0IChDKSAyMDA1IEJlcm5oYXJkIFJvc2Vua3JhZW56ZXIgPGJlcm9AYXJrbGludXgub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IERtaXRyeSBUb3Jva2hvdiA8ZHRvckBtYWlsLnJ1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oPgorCitNT0RVTEVfQVVUSE9SKCJEbWl0cnkgVG9yb2tob3YgPGR0b3JAbWFpbC5ydT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBzdXBwb3J0IGZvciBzcGFyc2Uga2V5bWFwcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oIjAuMSIpOworCisvKioKKyAqIHNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9zY2FuY29kZSAtIHBlcmZvcm0gc3BhcnNlIGtleW1hcCBsb29rdXAKKyAqIEBkZXY6IElucHV0IGRldmljZSB1c2luZyBzcGFyc2Uga2V5bWFwCisgKiBAY29kZTogU2NhbiBjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBlcmZvcm0gJnN0cnVjdCBrZXlfZW50cnkgbG9va3VwIGluIGFuCisgKiBpbnB1dCBkZXZpY2UgdXNpbmcgc3BhcnNlIGtleW1hcC4KKyAqLworc3RydWN0IGtleV9lbnRyeSAqc3BhcnNlX2tleW1hcF9lbnRyeV9mcm9tX3NjYW5jb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CisKKwlmb3IgKGtleSA9IGRldi0+a2V5Y29kZTsga2V5LT50eXBlICE9IEtFX0VORDsga2V5KyspCisJCWlmIChjb2RlID09IGtleS0+Y29kZSkKKwkJCXJldHVybiBrZXk7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3BhcnNlX2tleW1hcF9lbnRyeV9mcm9tX3NjYW5jb2RlKTsKKworLyoqCisgKiBzcGFyc2Vfa2V5bWFwX2VudHJ5X2Zyb21fa2V5Y29kZSAtIHBlcmZvcm0gc3BhcnNlIGtleW1hcCBsb29rdXAKKyAqIEBkZXY6IElucHV0IGRldmljZSB1c2luZyBzcGFyc2Uga2V5bWFwCisgKiBAa2V5Y29kZTogS2V5IGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVyZm9ybSAmc3RydWN0IGtleV9lbnRyeSBsb29rdXAgaW4gYW4KKyAqIGlucHV0IGRldmljZSB1c2luZyBzcGFyc2Uga2V5bWFwLgorICovCitzdHJ1Y3Qga2V5X2VudHJ5ICpzcGFyc2Vfa2V5bWFwX2VudHJ5X2Zyb21fa2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQga2V5Y29kZSkKK3sKKwlzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CisKKwlmb3IgKGtleSA9IGRldi0+a2V5Y29kZTsga2V5LT50eXBlICE9IEtFX0VORDsga2V5KyspCisJCWlmIChrZXktPnR5cGUgPT0gS0VfS0VZICYmIGtleWNvZGUgPT0ga2V5LT5rZXljb2RlKQorCQkJcmV0dXJuIGtleTsKKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzcGFyc2Vfa2V5bWFwX2VudHJ5X2Zyb21fa2V5Y29kZSk7CisKK3N0YXRpYyBpbnQgc3BhcnNlX2tleW1hcF9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCQkgICAgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpCit7CisJY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2V5ID0KKwkJCXNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9zY2FuY29kZShkZXYsIHNjYW5jb2RlKTsKKworCWlmIChrZXkgJiYga2V5LT50eXBlID09IEtFX0tFWSkgeworCQkqa2V5Y29kZSA9IGtleS0+a2V5Y29kZTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc3BhcnNlX2tleW1hcF9zZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCQkgICAgaW50IHNjYW5jb2RlLCBpbnQga2V5Y29kZSkKK3sKKwlzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CisJaW50IG9sZF9rZXljb2RlOworCisJaWYgKGtleWNvZGUgPCAwIHx8IGtleWNvZGUgPiBLRVlfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtleSA9IHNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9zY2FuY29kZShkZXYsIHNjYW5jb2RlKTsKKwlpZiAoa2V5ICYmIGtleS0+dHlwZSA9PSBLRV9LRVkpIHsKKwkJb2xkX2tleWNvZGUgPSBrZXktPmtleWNvZGU7CisJCWtleS0+a2V5Y29kZSA9IGtleWNvZGU7CisJCXNldF9iaXQoa2V5Y29kZSwgZGV2LT5rZXliaXQpOworCQlpZiAoIXNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9rZXljb2RlKGRldiwgb2xkX2tleWNvZGUpKQorCQkJY2xlYXJfYml0KG9sZF9rZXljb2RlLCBkZXYtPmtleWJpdCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHNwYXJzZV9rZXltYXBfc2V0dXAgLSBzZXQgdXAgc3BhcnNlIGtleW1hcCBmb3IgYW4gaW5wdXQgZGV2aWNlCisgKiBAZGV2OiBJbnB1dCBkZXZpY2UKKyAqIEBrZXltYXA6IEtleW1hcCBpbiBmb3JtIG9mIGFycmF5IG9mICZrZXlfZW50cnkgc3RydWN0dXJlcyBlbmRpbmcKKyAqCXdpdGggJUtFX0VORCB0eXBlIGVudHJ5CisgKiBAc2V0dXA6IEZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRqdXN0IGtleW1hcCBlbnRyaWVzCisgKglkZXBlbmRpbmcgb24gZGV2aWNlJ3MgZGVlZHMsIG1heSBiZSAlTlVMTAorICoKKyAqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHNpemUgYW5kIGFsbG9jYXRlcyBjb3B5IG9mIHRoZSBvcmlnaW5hbAorICoga2V5bWFwIGFmdGVyIHdoaWNoIHNldHMgdXAgaW5wdXQgZGV2aWNlIGV2ZW50IGJpdHMgYXBwcm9wcmlhdGVseS4KKyAqIEJlZm9yZSBkZXN0cm95aW5nIGlucHV0IGRldmljZSBhbGxvY2F0ZWQga2V5bWFwIHNob3VsZCBiZSBmcmVlZAorICogd2l0aCBhIGNhbGwgdG8gc3BhcnNlX2tleW1hcF9mcmVlKCkuCisgKi8KK2ludCBzcGFyc2Vfa2V5bWFwX3NldHVwKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCWNvbnN0IHN0cnVjdCBrZXlfZW50cnkgKmtleW1hcCwKKwkJCWludCAoKnNldHVwKShzdHJ1Y3QgaW5wdXRfZGV2ICosIHN0cnVjdCBrZXlfZW50cnkgKikpCit7CisJc2l6ZV90IG1hcF9zaXplID0gMTsgLyogdG8gYWNjb3VudCBmb3IgdGhlIGxhc3QgS0VfRU5EIGVudHJ5ICovCisJY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqZTsKKwlzdHJ1Y3Qga2V5X2VudHJ5ICptYXAsICplbnRyeTsKKwlpbnQgaTsKKwlpbnQgZXJyb3I7CisKKwlmb3IgKGUgPSBrZXltYXA7IGUtPnR5cGUgIT0gS0VfRU5EOyBlKyspCisJCW1hcF9zaXplKys7CisKKwltYXAgPSBrY2FsbG9jKG1hcF9zaXplLCBzaXplb2YgKHN0cnVjdCBrZXlfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobWFwLCBrZXltYXAsIG1hcF9zaXplICogc2l6ZW9mIChzdHJ1Y3Qga2V5X2VudHJ5KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFwX3NpemU7IGkrKykgeworCQllbnRyeSA9ICZtYXBbaV07CisKKwkJaWYgKHNldHVwKSB7CisJCQllcnJvciA9IHNldHVwKGRldiwgZW50cnkpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwkJY2FzZSBLRV9LRVk6CisJCQlfX3NldF9iaXQoRVZfS0VZLCBkZXYtPmV2Yml0KTsKKwkJCV9fc2V0X2JpdChlbnRyeS0+a2V5Y29kZSwgZGV2LT5rZXliaXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBLRV9TVzoKKwkJCV9fc2V0X2JpdChFVl9TVywgZGV2LT5ldmJpdCk7CisJCQlfX3NldF9iaXQoZW50cnktPnN3LmNvZGUsIGRldi0+c3diaXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZXYtPmtleWNvZGUgPSBtYXA7CisJZGV2LT5rZXljb2RlbWF4ID0gbWFwX3NpemU7CisJZGV2LT5nZXRrZXljb2RlID0gc3BhcnNlX2tleW1hcF9nZXRrZXljb2RlOworCWRldi0+c2V0a2V5Y29kZSA9IHNwYXJzZV9rZXltYXBfc2V0a2V5Y29kZTsKKworCXJldHVybiAwOworCisgZXJyX291dDoKKwlrZnJlZShrZXltYXApOworCXJldHVybiBlcnJvcjsKKworfQorRVhQT1JUX1NZTUJPTChzcGFyc2Vfa2V5bWFwX3NldHVwKTsKKworLyoqCisgKiBzcGFyc2Vfa2V5bWFwX2ZyZWUgLSBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNwYXJzZSBrZXltYXAKKyAqIEBkZXY6IElucHV0IGRldmljZSB1c2luZyBzcGFyc2Uga2V5bWFwCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBzcGFyc2Uga2V5bWFwCisgKiBpbiBhbiBpbnB1dCBkZXZpY2UgdGhhdCB3YXMgc2V0IHVwIGJ5IHNwYXJzZV9rZXltYXBfc2V0dXAoKS4KKyAqLwordm9pZCBzcGFyc2Vfa2V5bWFwX2ZyZWUoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCWtmcmVlKGRldi0+a2V5Y29kZSk7CisJZGV2LT5rZXljb2RlID0gTlVMTDsKKwlkZXYtPmtleWNvZGVtYXggPSAwOworCWRldi0+Z2V0a2V5Y29kZSA9IE5VTEw7CisJZGV2LT5zZXRrZXljb2RlID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3BhcnNlX2tleW1hcF9mcmVlKTsKKworLyoqCisgKiBzcGFyc2Vfa2V5bWFwX3JlcG9ydF9lbnRyeSAtIHJlcG9ydCBldmVudCBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGtleSBlbnRyeQorICogQGRldjogSW5wdXQgZGV2aWNlIGZvciB3aGljaCBldmVudCBzaG91bGQgYmUgcmVwb3J0ZWQKKyAqIEBrZToga2V5IGVudHJ5IGRlc2NyaWJpbmcgZXZlbnQKKyAqIEB2YWx1ZTogVmFsdWUgdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgKGlnbm9yZWQgYnkgJUtFX1NXIGVudHJpZXMpCisgKiBAYXV0b3JlbGVhc2U6IFNpZ25hbHMgd2hldGhlciByZWxlYXNlIGV2ZW50IHNob3VsZCBiZSBlbWl0dGVkIGZvciAlS0VfS0VZCisgKgllbnRyaWVzIHJpZ2h0IGFmdGVyIHJlcG9ydGluZyBwcmVzcyBldmVudCwgaWdub3JlZCBieSBhbGwgb3RoZXIKKyAqCWVudHJpZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVwb3J0IGlucHV0IGV2ZW50IGRlc2NyaWJlZCBieSBnaXZlbgorICogJnN0cnVjdCBrZXlfZW50cnkuCisgKi8KK3ZvaWQgc3BhcnNlX2tleW1hcF9yZXBvcnRfZW50cnkoc3RydWN0IGlucHV0X2RldiAqZGV2LCBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5ICprZSwKKwkJCQl1bnNpZ25lZCBpbnQgdmFsdWUsIGJvb2wgYXV0b3JlbGVhc2UpCit7CisJc3dpdGNoIChrZS0+dHlwZSkgeworCWNhc2UgS0VfS0VZOgorCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwga2UtPmtleWNvZGUsIHZhbHVlKTsKKwkJaW5wdXRfc3luYyhkZXYpOworCQlpZiAodmFsdWUgJiYgYXV0b3JlbGVhc2UpIHsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZS0+a2V5Y29kZSwgMCk7CisJCQlpbnB1dF9zeW5jKGRldik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEtFX1NXOgorCQl2YWx1ZSA9IGtlLT5zdy52YWx1ZTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIEtFX1ZTVzoKKwkJaW5wdXRfcmVwb3J0X3N3aXRjaChkZXYsIGtlLT5zdy5jb2RlLCB2YWx1ZSk7CisJCWJyZWFrOworCX0KK30KK0VYUE9SVF9TWU1CT0woc3BhcnNlX2tleW1hcF9yZXBvcnRfZW50cnkpOworCisvKioKKyAqIHNwYXJzZV9rZXltYXBfcmVwb3J0X2V2ZW50IC0gcmVwb3J0IGV2ZW50IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gc2NhbmNvZGUKKyAqIEBkZXY6IElucHV0IGRldmljZSB1c2luZyBzcGFyc2Uga2V5bWFwCisgKiBAY29kZTogU2NhbiBjb2RlCisgKiBAdmFsdWU6IFZhbHVlIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIChpZ25vcmVkIGJ5ICVLRV9TVyBlbnRyaWVzKQorICogQGF1dG9yZWxlYXNlOiBTaWduYWxzIHdoZXRoZXIgcmVsZWFzZSBldmVudCBzaG91bGQgYmUgZW1pdHRlZCBmb3IgJUtFX0tFWQorICoJZW50cmllcyByaWdodCBhZnRlciByZXBvcnRpbmcgcHJlc3MgZXZlbnQsIGlnbm9yZWQgYnkgYWxsIG90aGVyCisgKgllbnRyaWVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBlcmZvcm0gbG9va3VwIGluIGFuIGlucHV0IGRldmljZSB1c2luZyBzcGFyc2UKKyAqIGtleW1hcCBhbmQgcmVwb3J0IGNvcnJlc3BvbmRpbmcgZXZlbnQuIFJldHVybnMgJXRydWUgaWYgbG9va3VwIHdhcworICogc3VjY2Vzc2Z1bCBhbmQgJWZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBzcGFyc2Vfa2V5bWFwX3JlcG9ydF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjb2RlLAorCQkJCXVuc2lnbmVkIGludCB2YWx1ZSwgYm9vbCBhdXRvcmVsZWFzZSkKK3sKKwljb25zdCBzdHJ1Y3Qga2V5X2VudHJ5ICprZSA9CisJCXNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9zY2FuY29kZShkZXYsIGNvZGUpOworCisJaWYgKGtlKSB7CisJCXNwYXJzZV9rZXltYXBfcmVwb3J0X2VudHJ5KGRldiwga2UsIHZhbHVlLCBhdXRvcmVsZWFzZSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0woc3BhcnNlX2tleW1hcF9yZXBvcnRfZXZlbnQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKaW5kZXggOGNjNDUzYy4uMzJmYzhiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwpAQCAtMTExLDYgKzExMSwxOCBAQAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIHN1cHBvcnQgZm9yIHRoZSB0b3VjaHNjcmVlbiBmb3VuZAogCSAgb24gRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDM0IFBNSUMuCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9EWU5BUFJPCisJdHJpc3RhdGUgIkR5bmFwcm8gc2VyaWFsIHRvdWNoc2NyZWVuIgorCXNlbGVjdCBTRVJJTworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBEeW5hcHJvIHNlcmlhbCB0b3VjaHNjcmVlbiBjb25uZWN0ZWQgdG8KKwkgIHlvdXIgc3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkeW5hcHJvLgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fRUVUSQogCXRyaXN0YXRlICJFRVRJIHRvdWNoc2NyZWVuIHBhbmVsIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTEzMyw2ICsxNDUsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGZ1aml0c3UtdHMuCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9TM0MyNDEwCisJdHJpc3RhdGUgIlNhbXN1bmcgUzNDMjQxMCB0b3VjaHNjcmVlbiBpbnB1dCBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKKwlzZWxlY3QgUzNDMjRYWF9BREMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHRoZSBzM2MyNDEwIHRvdWNoc2NyZWVuLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzM2MyNDEwX3RzLgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fR1VOWkUKIAl0cmlzdGF0ZSAiR3VuemUgQUhMLTUxUyB0b3VjaHNjcmVlbiIKIAlzZWxlY3QgU0VSSU8KQEAgLTI5Nyw3ICszMjEsNyBAQAogCiBjb25maWcgVE9VQ0hTQ1JFRU5fQVRNRUxfVFNBRENDCiAJdHJpc3RhdGUgIkF0bWVsIFRvdWNoc2NyZWVuIEludGVyZmFjZSIKLQlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVNBTTlSTAorCWRlcGVuZHMgb24gQVJDSF9BVDkxU0FNOVJMIHx8IEFSQ0hfQVQ5MVNBTTlHNDUKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgNC13aXJlIHRvdWNoc2NyZWVuIGNvbm5lY3RlZCB0byB0aGUKICAgICAgICAgICBBREMgQ29udHJvbGxlciBvbiB5b3VyIEF0bWVsIFNvQyAoc3VjaCBhcyB0aGUgQVQ5MVNBTTlSTCkuCkBAIC00MTgsNiArNDQyLDcgQEAKIAkgIC0gSWRlYWxURUsgVVJUQzEwMDAKIAkgIC0gR29Ub3AgU3VwZXJfUTIvR29nb1Blbi9QZW5Qb3dlciB0YWJsZXRzCiAJICAtIEpBU1RFQyBVU0IgVG91Y2ggQ29udHJvbGxlci9EaWdpVGVjaCBEVFItMDJVCisJICAtIFp5dHJvbmljIGNvbnRyb2xsZXJzCiAKIAkgIEhhdmUgYSBsb29rIGF0IDxodHRwOi8vbGludXguY2hhcHRlcjcuY2gvdG91Y2hraXQvPiBmb3IKIAkgIGEgdXNhZ2UgZGVzY3JpcHRpb24gYW5kIHRoZSByZXF1aXJlZCB1c2VyLXNwYWNlIHN0dWZmLgpAQCAtNDkwLDYgKzUxNSwxNiBAQAogCWJvb2wgImUyaSBUb3VjaHNjcmVlbiBjb250cm9sbGVyIChlLmcuIGZyb20gTWltbyA3NDApIgogCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURQogCitjb25maWcgVE9VQ0hTQ1JFRU5fVVNCX1pZVFJPTklDCisJZGVmYXVsdCB5CisJYm9vbCAiWnl0cm9uaWMgY29udHJvbGxlciIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFRPVUNIU0NSRUVOX1VTQl9DT01QT1NJVEUKKworY29uZmlnIFRPVUNIU0NSRUVOX1VTQl9FVFRfVEM1VUgKKwlkZWZhdWx0IHkKKwlib29sICJFVCZUIFRDNVVIIHRvdWNoc2NyZWVuIGNvbnRyb2xlciBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURQorCiBjb25maWcgVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMwogCXRyaXN0YXRlICJTYWhhcmEgVG91Y2hJVC0yMTMgdG91Y2hzY3JlZW4iCiAJc2VsZWN0IFNFUklPCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQppbmRleCAxNWZhNjJjLi5mMWY1OWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKQEAgLTEyLDYgKzEyLDcgQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9BVE1FTF9UU0FEQ0MpCSs9IGF0bWVsX3RzYWRjYy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQklUU1kpCQkrPSBoMzYwMF90c19pbnB1dC5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQ09SR0kpCQkrPSBjb3JnaV90cy5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fRFlOQVBSTykJKz0gZHluYXByby5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fR1VOWkUpCQkrPSBndW56ZS5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fRUVUSSkJCSs9IGVldGlfdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0VMTykJCSs9IGVsby5vCkBAIC0yNSw3ICsyNiw5IEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fSFA3WFgpCQkrPSBqb3JuYWRhNzIwX3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9IVENQRU4pCSs9IGh0Y3Blbi5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSkJKz0gdXNidG91Y2hzY3JlZW4ubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1BDQVApCQkrPSBwY2FwX3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCkJKz0gcGVubW91bnQubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1MzQzI0MTApCSs9IHMzYzI0MTBfdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMpCSs9IHRvdWNoaXQyMTMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQpCSs9IHRvdWNocmlnaHQubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOKQkrPSB0b3VjaHdpbi5vCkBAIC00MSw0ICs0NCwzIEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYX01BSU5TVE9ORSkJKz0gbWFpbnN0b25lLXdtOTd4eC5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYX1pZTE9OSVRFKQkrPSB6eWxvbml0ZS13bTk3eHgubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1c5MFg5MDApCSs9IHc5MHA5MTBfdHMubwotb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1BDQVApCQkrPSBwY2FwX3RzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKaW5kZXggMDljODEwOS4uNTJkMmNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTI5LDEwICsyOSw5IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLQogLyoKICAqIFRoaXMgY29kZSBoYXMgYmVlbiBoZWF2aWx5IHRlc3RlZCBvbiBhIE5va2lhIDc3MCwgYW5kIGxpZ2h0bHkKLSAqIHRlc3RlZCBvbiBvdGhlciBhZHM3ODQ2IGRldmljZXMgKE9TSy9NaXN0cmFsLCBMdWJib2NrKS4KKyAqIHRlc3RlZCBvbiBvdGhlciBhZHM3ODQ2IGRldmljZXMgKE9TSy9NaXN0cmFsLCBMdWJib2NrLCBTcGl0eikuCiAgKiBUU0MyMDQ2IGlzIGp1c3QgbmV3ZXIgYWRzNzg0NiBzaWxpY29uLgogICogU3VwcG9ydCBmb3IgYWRzNzg0MyB0ZXN0ZWQgb24gQXRtZWwgYXQ5MXNhbTkyNngtRUsuCiAgKiBTdXBwb3J0IGZvciBhZHM3ODQ1IGhhcyBvbmx5IGJlZW4gc3R1YmJlZCBpbi4KQEAgLTQzLDcgKzQyLDcgQEAKICAqIGhhdmUgdG8gbWFpbnRhaW4gb3VyIG93biBTVyBJUlEgZGlzYWJsZWQgc3RhdHVzLiBUaGlzIHNob3VsZCBiZQogICogcmVtb3ZlZCBhcyBzb29uIGFzIHRoZSBhZmZlY3RlZCBwbGF0Zm9ybSdzIElSUSBoYW5kbGluZyBpcyBmaXhlZC4KICAqCi0gKiBhcHAgbm90ZSBzYmFhMDM2IHRhbGtzIGluIG1vcmUgZGV0YWlsIGFib3V0IGFjY3VyYXRlIHNhbXBsaW5nLi4uCisgKiBBcHAgbm90ZSBzYmFhMDM2IHRhbGtzIGluIG1vcmUgZGV0YWlsIGFib3V0IGFjY3VyYXRlIHNhbXBsaW5nLi4uCiAgKiB0aGF0IG91Z2h0IHRvIGhlbHAgaW4gc2l0dWF0aW9ucyBsaWtlIExDRHMgaW5kdWNpbmcgbm9pc2UgKHdoaWNoCiAgKiBjYW4gYWxzbyBiZSBoZWxwZWQgYnkgdXNpbmcgc3luY2ggc2lnbmFscykgYW5kIG1vcmUgZ2VuZXJhbGx5LgogICogVGhpcyBkcml2ZXIgdHJpZXMgdG8gdXRpbGl6ZSB0aGUgbWVhc3VyZXMgZGVzY3JpYmVkIGluIHRoZSBhcHAKQEAgLTU2NiwxMCArNTY1LDggQEAKIAkgKiBvbmNlIG1vcmUgdGhlIG1lYXN1cmVtZW50CiAJICovCiAJaWYgKHBhY2tldC0+dGMuaWdub3JlIHx8IFJ0ID4gdHMtPnByZXNzdXJlX21heCkgewotI2lmZGVmIFZFUkJPU0UKLQkJcHJfZGVidWcoIiVzOiBpZ25vcmVkICVkIHByZXNzdXJlICVkXG4iLAotCQkJZGV2X25hbWUoJnRzLT5zcGktPmRldiksIHBhY2tldC0+dGMuaWdub3JlLCBSdCk7Ci0jZW5kaWYKKwkJZGV2X3ZkYmcoJnRzLT5zcGktPmRldiwgImlnbm9yZWQgJWQgcHJlc3N1cmUgJWRcbiIsCisJCQkgcGFja2V0LT50Yy5pZ25vcmUsIFJ0KTsKIAkJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9QRVJJT0QpLAogCQkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CiAJCXJldHVybjsKQEAgLTU5OCw5ICs1OTUsNyBAQAogCQlpZiAoIXRzLT5wZW5kb3duKSB7CiAJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDEpOwogCQkJdHMtPnBlbmRvd24gPSAxOwotI2lmZGVmIFZFUkJPU0UKLQkJCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIkRPV05cbiIpOwotI2VuZGlmCisJCQlkZXZfdmRiZygmdHMtPnNwaS0+ZGV2LCAiRE9XTlxuIik7CiAJCX0KIAogCQlpZiAodHMtPnN3YXBfeHkpCkBAIC02MDgsMTIgKzYwMywxMCBAQAogCiAJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19YLCB4KTsKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1ksIHkpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfUFJFU1NVUkUsIFJ0KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1BSRVNTVVJFLCB0cy0+cHJlc3N1cmVfbWF4IC0gUnQpOwogCiAJCWlucHV0X3N5bmMoaW5wdXQpOwotI2lmZGVmIFZFUkJPU0UKLQkJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJTRkLyU0ZC8lNGRcbiIsIHgsIHksIFJ0KTsKLSNlbmRpZgorCQlkZXZfdmRiZygmdHMtPnNwaS0+ZGV2LCAiJTRkLyU0ZC8lNGRcbiIsIHgsIHksIFJ0KTsKIAl9CiAKIAlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX1BFUklPRCksCkBAIC03MjMsOSArNzE2LDcgQEAKIAkJCWlucHV0X3N5bmMoaW5wdXQpOwogCiAJCQl0cy0+cGVuZG93biA9IDA7Ci0jaWZkZWYgVkVSQk9TRQotCQkJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiVVBcbiIpOwotI2VuZGlmCisJCQlkZXZfdmRiZygmdHMtPnNwaS0+ZGV2LCAiVVBcbiIpOwogCQl9CiAKIAkJLyogbWVhc3VyZW1lbnQgY3ljbGUgZW5kZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWwtd205N3h4LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsLXdtOTd4eC5jCmluZGV4IDM1Mzc3ZjUuLmExMjI0MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWwtd205N3h4LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbC13bTk3eHguYwpAQCAtNTksNyArNTksNyBAQAogI2RlZmluZSBBVE1FTF9XTTk3WFhfQUM5N0NfSVJRCQkoMjkpCiAjZGVmaW5lIEFUTUVMX1dNOTdYWF9HUElPX0RFRkFVTFQJKDMyKzE2KSAvKiBQaW4gMTYgb24gcG9ydCBCLiAqLwogI2Vsc2UKLSNlcnJvciBVbmtvd24gQ1BVLCB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIEFUMzJBUDcwMFggQ1BVcy4KKyNlcnJvciBVbmtub3duIENQVSwgdGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyBBVDMyQVA3MDBYIENQVXMuCiAjZW5kaWYKIAogc3RydWN0IGNvbnRpbnVvdXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF90c2FkY2MuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfdHNhZGNjLmMKaW5kZXggOWM3ZmNlNC4uM2Q5YjUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF90c2FkY2MuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX3RzYWRjYy5jCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIAogLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgYmFzZWQgb24gQVQ5MVNBTTlSTDY0IHByZWxpbWluYXJ5IGRyYWZ0IGRhdGFzaGVldCAqLwogCkBAIC0zNiw3ICszOCw5IEBACiAjZGVmaW5lCSAgQVRNRUxfVFNBRENDX0xPV1JFUwkoMSAgICA8PCAgNCkJLyogUmVzb2x1dGlvbiBzZWxlY3Rpb24gKi8KICNkZWZpbmUJICBBVE1FTF9UU0FEQ0NfU0xFRVAJKDEgICAgPDwgIDUpCS8qIFNsZWVwIG1vZGUgKi8KICNkZWZpbmUJICBBVE1FTF9UU0FEQ0NfUEVOREVUCSgxICAgIDw8ICA2KQkvKiBQZW4gRGV0ZWN0IHNlbGVjdGlvbiAqLworI2RlZmluZQkgIEFUTUVMX1RTQURDQ19QUkVTCSgxICAgIDw8ICA3KQkvKiBQcmVzc3VyZSBNZWFzdXJlbWVudCBTZWxlY3Rpb24gKi8KICNkZWZpbmUJICBBVE1FTF9UU0FEQ0NfUFJFU0NBTAkoMHgzZiA8PCAgOCkJLyogUHJlc2NhbGFyIFJhdGUgU2VsZWN0aW9uICovCisjZGVmaW5lCSAgQVRNRUxfVFNBRENDX0VQUkVTQ0FMCSgweGZmIDw8ICA4KQkvKiBQcmVzY2FsYXIgUmF0ZSBTZWxlY3Rpb24gKEV4dGVuZGVkKSAqLwogI2RlZmluZQkgIEFUTUVMX1RTQURDQ19TVEFSVFVQCSgweDdmIDw8IDE2KQkvKiBTdGFydCBVcCB0aW1lICovCiAjZGVmaW5lCSAgQVRNRUxfVFNBRENDX1NIVElNCSgweGYgIDw8IDI0KQkvKiBTYW1wbGUgJiBIb2xkIHRpbWUgKi8KICNkZWZpbmUJICBBVE1FTF9UU0FEQ0NfUEVOREJDCSgweGYgIDw8IDI4KQkvKiBQZW4gRGV0ZWN0IGRlYm91bmNpbmcgdGltZSAqLwpAQCAtODQsNyArODgsMTMgQEAKICNkZWZpbmUgQVRNRUxfVFNBRENDX0NEUjQJMHg0MAkvKiBDaGFubmVsIERhdGEgNCAqLwogI2RlZmluZSBBVE1FTF9UU0FEQ0NfQ0RSNQkweDQ0CS8qIENoYW5uZWwgRGF0YSA1ICovCiAKLSNkZWZpbmUgQURDX0NMT0NLCTEwMDAwMDAKKyNkZWZpbmUgQVRNRUxfVFNBRENDX1hQT1MJMHg1MAorI2RlZmluZSBBVE1FTF9UU0FEQ0NfWjFEQVQJMHg1NAorI2RlZmluZSBBVE1FTF9UU0FEQ0NfWjJEQVQJMHg1OAorCisjZGVmaW5lIFBSRVNDQUxFUl9WQUwoeCkJKCh4KSA+PiA4KQorCisjZGVmaW5lIEFEQ19ERUZBVUxUX0NMT0NLCTEwMDAwMAogCiBzdHJ1Y3QgYXRtZWxfdHNhZGNjIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dDsKQEAgLTE3Miw2ICsxODIsNyBAQAogCXN0cnVjdCBhdG1lbF90c2FkY2MJKnRzX2RldjsKIAlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dF9kZXY7CiAJc3RydWN0IHJlc291cmNlCQkqcmVzOworCXN0cnVjdCBhdDkxX3RzYWRjY19kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludAkJZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQJcHJzYzsKIAl1bnNpZ25lZCBpbnQJcmVnOwpAQCAtMjQyLDMxICsyNTMsNDkgQEAKIAlpbnB1dF9kZXYtPnBoeXMgPSB0c19kZXYtPnBoeXM7CiAJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAotCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKLQlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCk7Ci0KKwlfX3NldF9iaXQoRVZfQUJTLCBpbnB1dF9kZXYtPmV2Yml0KTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLCAweDNGRiwgMCwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwgMHgzRkYsIDAsIDApOwogCisJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9LRVksIEJUTl9UT1VDSCk7CisKIAkvKiBjbGtfZW5hYmxlKCkgYWx3YXlzIHJldHVybnMgMCwgbm8gbmVlZCB0byBjaGVjayBpdCAqLwogCWNsa19lbmFibGUodHNfZGV2LT5jbGspOwogCiAJcHJzYyA9IGNsa19nZXRfcmF0ZSh0c19kZXYtPmNsayk7CiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIk1hc3RlciBjbG9jayBpcyBzZXQgYXQ6ICVkIEh6XG4iLCBwcnNjKTsKIAotCXByc2MgPSBwcnNjIC8gQURDX0NMT0NLIC8gMiAtIDE7CisJaWYgKCFwZGF0YSkKKwkJZ290byBlcnJfZmFpbDsKKworCWlmICghcGRhdGEtPmFkY19jbG9jaykKKwkJcGRhdGEtPmFkY19jbG9jayA9IEFEQ19ERUZBVUxUX0NMT0NLOworCisJcHJzYyA9IChwcnNjIC8gKDIgKiBwZGF0YS0+YWRjX2Nsb2NrKSkgLSAxOworCisJLyogc2F0dXJhdGUgaWYgdGhpcyB2YWx1ZSBpcyB0b28gaGlnaCAqLworCWlmIChjcHVfaXNfYXQ5MXNhbTlybCgpKSB7CisJCWlmIChwcnNjID4gUFJFU0NBTEVSX1ZBTChBVE1FTF9UU0FEQ0NfUFJFU0NBTCkpCisJCQlwcnNjID0gUFJFU0NBTEVSX1ZBTChBVE1FTF9UU0FEQ0NfUFJFU0NBTCk7CisJfSBlbHNlIHsKKwkJaWYgKHByc2MgPiBQUkVTQ0FMRVJfVkFMKEFUTUVMX1RTQURDQ19FUFJFU0NBTCkpCisJCQlwcnNjID0gUFJFU0NBTEVSX1ZBTChBVE1FTF9UU0FEQ0NfRVBSRVNDQUwpOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJQcmVzY2FsZXIgaXMgc2V0IGF0OiAlZFxuIiwgcHJzYyk7CiAKIAlyZWcgPSBBVE1FTF9UU0FEQ0NfVFNBTU9EX1RTX09OTFlfTU9ERQkJfAogCQkoKDB4MDAgPDwgNSkgJiBBVE1FTF9UU0FEQ0NfU0xFRVApCXwJLyogTm9ybWFsIE1vZGUgKi8KIAkJKCgweDAxIDw8IDYpICYgQVRNRUxfVFNBRENDX1BFTkRFVCkJfAkvKiBFbmFibGUgUGVuIERldGVjdCAqLwotCQkoKHByc2MgPDwgOCkgJiBBVE1FTF9UU0FEQ0NfUFJFU0NBTCkJfAkvKiBQUkVTQ0FMICovCi0JCSgoMHgxMyA8PCAxNikgJiBBVE1FTF9UU0FEQ0NfU1RBUlRVUCkJfAkvKiBTVEFSVFVQICovCi0JCSgoMHgwRiA8PCAyOCkgJiBBVE1FTF9UU0FEQ0NfUEVOREJDKTsJCS8qIFBFTkRCQyAqLworCQkocHJzYyA8PCA4KQkJCQl8CisJCSgoMHgyNiA8PCAxNikgJiBBVE1FTF9UU0FEQ0NfU1RBUlRVUCkJfAorCQkoKHBkYXRhLT5wZW5kZXRfZGVib3VuY2UgPDwgMjgpICYgQVRNRUxfVFNBRENDX1BFTkRCQyk7CiAKIAlhdG1lbF90c2FkY2Nfd3JpdGUoQVRNRUxfVFNBRENDX0NSLCBBVE1FTF9UU0FEQ0NfU1dSU1QpOwogCWF0bWVsX3RzYWRjY193cml0ZShBVE1FTF9UU0FEQ0NfTVIsIHJlZyk7CiAJYXRtZWxfdHNhZGNjX3dyaXRlKEFUTUVMX1RTQURDQ19UUkdSLCBBVE1FTF9UU0FEQ0NfVFJHTU9EX05PTkUpOwotCWF0bWVsX3RzYWRjY193cml0ZShBVE1FTF9UU0FEQ0NfVFNSLCAoMHgzIDw8IDI0KSAmIEFUTUVMX1RTQURDQ19UU1NIVElNKTsKKwlhdG1lbF90c2FkY2Nfd3JpdGUoQVRNRUxfVFNBRENDX1RTUiwKKwkJKHBkYXRhLT50c19zYW1wbGVfaG9sZF90aW1lIDw8IDI0KSAmIEFUTUVMX1RTQURDQ19UU1NIVElNKTsKIAogCWF0bWVsX3RzYWRjY19yZWFkKEFUTUVMX1RTQURDQ19TUik7CiAJYXRtZWxfdHNhZGNjX3dyaXRlKEFUTUVMX1RTQURDQ19JRVIsIEFUTUVMX1RTQURDQ19QRU5DTlQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9keW5hcHJvLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2R5bmFwcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTUzNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9keW5hcHJvLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBEeW5hcHJvIHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgVGlhcyBHdW5zCisgKiBCYXNlZCBvbiB0aGUgaW5leGlvIGRyaXZlciAoYykgVm9qdGVjaCBQYXZsaWsgYW5kIERhbiBTdHJlZXRtYW4gYW5kCisgKiBSaWNoYXJkIExlbW9uCisgKgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiAyMDA5LzA5LzE5IFRpYXMgR3VucyA8dGlhc0B1bHlzc2lzLm9yZz4KKyAqICAgQ29waWVkIGluZXhpby5jIGFuZCBlZGl0ZWQgZm9yIER5bmFwcm8gcHJvdG9jb2wgKGZyb20gcmV0aXJlZCBYb3JnIG1vZHVsZSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBEUklWRVJfREVTQwkiRHluYXBybyBzZXJpYWwgdG91Y2hzY3JlZW4gZHJpdmVyIgorCitNT0RVTEVfQVVUSE9SKCJUaWFzIEd1bnMgPHRpYXNAdWx5c3Npcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogRGVmaW5pdGlvbnMgJiBnbG9iYWwgYXJyYXlzLgorICovCisKKyNkZWZpbmUgRFlOQVBST19GT1JNQVRfVE9VQ0hfQklUIDB4NDAKKyNkZWZpbmUgRFlOQVBST19GT1JNQVRfTEVOR1RIIDMKKyNkZWZpbmUgRFlOQVBST19SRVNQT05TRV9CRUdJTl9CWVRFIDB4ODAKKworI2RlZmluZSBEWU5BUFJPX01JTl9YQyAwCisjZGVmaW5lIERZTkFQUk9fTUFYX1hDIDB4M2ZmCisjZGVmaW5lIERZTkFQUk9fTUlOX1lDIDAKKyNkZWZpbmUgRFlOQVBST19NQVhfWUMgMHgzZmYKKworI2RlZmluZSBEWU5BUFJPX0dFVF9YQyhkYXRhKSAoZGF0YVsxXSB8ICgoZGF0YVswXSAmIDB4MzgpIDw8IDQpKQorI2RlZmluZSBEWU5BUFJPX0dFVF9ZQyhkYXRhKSAoZGF0YVsyXSB8ICgoZGF0YVswXSAmIDB4MDcpIDw8IDcpKQorI2RlZmluZSBEWU5BUFJPX0dFVF9UT1VDSEVEKGRhdGEpIChEWU5BUFJPX0ZPUk1BVF9UT1VDSF9CSVQgJiBkYXRhWzBdKQorCisvKgorICogUGVyLXRvdWNoc2NyZWVuIGRhdGEuCisgKi8KKworc3RydWN0IGR5bmFwcm8geworCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKKwlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOworCWludCBpZHg7CisJdW5zaWduZWQgY2hhciBkYXRhW0RZTkFQUk9fRk9STUFUX0xFTkdUSF07CisJY2hhciBwaHlzWzMyXTsKK307CisKK3N0YXRpYyB2b2lkIGR5bmFwcm9fcHJvY2Vzc19kYXRhKHN0cnVjdCBkeW5hcHJvICpwZHluYXBybykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwZHluYXByby0+ZGV2OworCisJaWYgKERZTkFQUk9fRk9STUFUX0xFTkdUSCA9PSArK3BkeW5hcHJvLT5pZHgpIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBEWU5BUFJPX0dFVF9YQyhwZHluYXByby0+ZGF0YSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIERZTkFQUk9fR0VUX1lDKHBkeW5hcHJvLT5kYXRhKSk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsCisJCQkJIERZTkFQUk9fR0VUX1RPVUNIRUQocGR5bmFwcm8tPmRhdGEpKTsKKwkJaW5wdXRfc3luYyhkZXYpOworCisJCXBkeW5hcHJvLT5pZHggPSAwOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGR5bmFwcm9faW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sCisJCXVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBkeW5hcHJvICpwZHluYXBybyA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCXBkeW5hcHJvLT5kYXRhW3BkeW5hcHJvLT5pZHhdID0gZGF0YTsKKworCWlmIChEWU5BUFJPX1JFU1BPTlNFX0JFR0lOX0JZVEUgJiBwZHluYXByby0+ZGF0YVswXSkKKwkJZHluYXByb19wcm9jZXNzX2RhdGEocGR5bmFwcm8pOworCWVsc2UKKwkJZGV2X2RiZygmc2VyaW8tPmRldiwgInVua25vd24vdW5zeW5jaHJvbml6ZWQgZGF0YTogJXhcbiIsCisJCQlwZHluYXByby0+ZGF0YVswXSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGR5bmFwcm9fZGlzY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQoreworCXN0cnVjdCBkeW5hcHJvICpwZHluYXBybyA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCWlucHV0X2dldF9kZXZpY2UocGR5bmFwcm8tPmRldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocGR5bmFwcm8tPmRldik7CisJc2VyaW9fY2xvc2Uoc2VyaW8pOworCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKwlpbnB1dF9wdXRfZGV2aWNlKHBkeW5hcHJvLT5kZXYpOworCWtmcmVlKHBkeW5hcHJvKTsKK30KKworLyoKKyAqIGR5bmFwcm9fY29ubmVjdCgpIGlzIHRoZSByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW4gc29tZW9uZSBhZGRzIGEKKyAqIG5ldyBzZXJpbyBkZXZpY2UgdGhhdCBzdXBwb3J0cyBkeW5hcHJvIHByb3RvY29sIGFuZCByZWdpc3RlcnMgaXQgYXMKKyAqIGFuIGlucHV0IGRldmljZS4gVGhpcyBpcyB1c3VhbGx5IGFjY29tcGxpc2hlZCB1c2luZyBpbnB1dGF0dGFjaC4KKyAqLworCitzdGF0aWMgaW50IGR5bmFwcm9fY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGR5bmFwcm8gKnBkeW5hcHJvOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgZXJyOworCisJcGR5bmFwcm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHluYXBybyksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghcGR5bmFwcm8gfHwgIWlucHV0X2RldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwxOworCX0KKworCXBkeW5hcHJvLT5zZXJpbyA9IHNlcmlvOworCXBkeW5hcHJvLT5kZXYgPSBpbnB1dF9kZXY7CisJc25wcmludGYocGR5bmFwcm8tPnBoeXMsIHNpemVvZihwZHluYXByby0+cGh5cyksCisJCSAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOworCisJaW5wdXRfZGV2LT5uYW1lID0gIkR5bmFwcm8gU2VyaWFsIFRvdWNoU2NyZWVuIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSBwZHluYXByby0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUlMyMzI7CisJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBTRVJJT19EWU5BUFJPOworCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDA7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMDAxOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZzZXJpby0+ZGV2OworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKKwlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocGR5bmFwcm8tPmRldiwgQUJTX1gsCisJCQkgICAgIERZTkFQUk9fTUlOX1hDLCBEWU5BUFJPX01BWF9YQywgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocGR5bmFwcm8tPmRldiwgQUJTX1ksCisJCQkgICAgIERZTkFQUk9fTUlOX1lDLCBEWU5BUFJPX01BWF9ZQywgMCwgMCk7CisKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgcGR5bmFwcm8pOworCisJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwyOworCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBkeW5hcHJvLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKKwlyZXR1cm4gMDsKKworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwlrZnJlZShwZHluYXBybyk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZSBzZXJpbyBkcml2ZXIgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkIGR5bmFwcm9fc2VyaW9faWRzW10gPSB7CisJeworCQkudHlwZQk9IFNFUklPX1JTMjMyLAorCQkucHJvdG8JPSBTRVJJT19EWU5BUFJPLAorCQkuaWQJPSBTRVJJT19BTlksCisJCS5leHRyYQk9IFNFUklPX0FOWSwKKwl9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHNlcmlvLCBkeW5hcHJvX3NlcmlvX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaW9fZHJpdmVyIGR5bmFwcm9fZHJ2ID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJkeW5hcHJvIiwKKwl9LAorCS5kZXNjcmlwdGlvbgk9IERSSVZFUl9ERVNDLAorCS5pZF90YWJsZQk9IGR5bmFwcm9fc2VyaW9faWRzLAorCS5pbnRlcnJ1cHQJPSBkeW5hcHJvX2ludGVycnVwdCwKKwkuY29ubmVjdAk9IGR5bmFwcm9fY29ubmVjdCwKKwkuZGlzY29ubmVjdAk9IGR5bmFwcm9fZGlzY29ubmVjdCwKK307CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGZvciBpbnNlcnRpbmcvcmVtb3ZpbmcgdXMgYXMgYSBtb2R1bGUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZHluYXByb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmZHluYXByb19kcnYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHluYXByb19leGl0KHZvaWQpCit7CisJc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmR5bmFwcm9fZHJ2KTsKK30KKworbW9kdWxlX2luaXQoZHluYXByb19pbml0KTsKK21vZHVsZV9leGl0KGR5bmFwcm9fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21haW5zdG9uZS13bTk3eHguYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWFpbnN0b25lLXdtOTd4eC5jCmluZGV4IDhmYzNiMDguLjZjZGNmMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWFpbnN0b25lLXdtOTd4eC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWFpbnN0b25lLXdtOTd4eC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKgogICogTm90ZXM6CiAgKiAgICAgVGhpcyBpcyBhIHdtOTd4eCBleHRlbmRlZCB0b3VjaCBkcml2ZXIgdG8gY2FwdHVyZSB0b3VjaAotICogICAgIGRhdGEgaW4gYSBjb250aW51b3VzIG1hbm5lciBvbiB0aGUgSW50ZWwgWFNjYWxlIGFyY2hpY3RlY3R1cmUKKyAqICAgICBkYXRhIGluIGEgY29udGludW91cyBtYW5uZXIgb24gdGhlIEludGVsIFhTY2FsZSBhcmNoaXRlY3R1cmUKICAqCiAgKiAgRmVhdHVyZXM6CiAgKiAgICAgICAtIGNvZGVjcyBzdXBwb3J0ZWQ6LSBXTTk3MDUsIFdNOTcxMiwgV005NzEzCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkvKiBXaGVuIHRoZSBBQzk3IHF1ZXVlIGhhcyBiZWVuIGRyYWluZWQgd2UgbmVlZCB0byBhbGxvdyB0aW1lCiAJICogdG8gYnVmZmVyIHVwIHNhbXBsZXMgb3RoZXJ3aXNlIHdlIGVuZCB1cCBzcGlubmluZyBwb2xsaW5nCiAJICogZm9yIHNhbXBsZXMuICBUaGUgY29udHJvbGxlciBjYW4ndCBoYXZlIGEgc3VpdGFibHkgbG93Ci0JICogdGhyZWFzaG9sZCBzZXQgdG8gdXNlIHRoZSBub3RpZmljYXRpb25zIGl0IGdpdmVzLgorCSAqIHRocmVzaG9sZCBzZXQgdG8gdXNlIHRoZSBub3RpZmljYXRpb25zIGl0IGdpdmVzLgogCSAqLwogCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3MzYzI0MTBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vczNjMjQxMF90cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODZiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3MzYzI0MTBfdHMuYwpAQCAtMCwwICsxLDQ1NyBAQAorLyoKKyAqIFNhbXN1bmcgUzNDMjRYWCB0b3VjaHNjcmVlbiBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm0gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQ29weXJpZ2h0IDIwMDQgQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqIENvcHlyaWdodCAyMDA4IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KKyAqIENvcHlyaWdodCAyMDA5IFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgorICoKKyAqIEFkZGl0aW9uYWwgd29yayBieSBIZXJiZXJ0IFDDtnR6bCA8aGVyYmVydEAxM3RoZmxvb3IuYXQ+IGFuZAorICogSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG9wZW5tb2tvLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPHBsYXQvYWRjLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWFkYy5oPgorCisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL3RzLmg+CisKKyNkZWZpbmUgVFNDX1NMRUVQICAoUzNDMjQxMF9BRENUU0NfUFVMTF9VUF9ESVNBQkxFIHwgUzNDMjQxMF9BRENUU0NfWFlfUFNUKDApKQorCisjZGVmaW5lIElOVF9ET1dOCSgwKQorI2RlZmluZSBJTlRfVVAJCSgxIDw8IDgpCisKKyNkZWZpbmUgV0FJVDRJTlQJKFMzQzI0MTBfQURDVFNDX1lNX1NFTiB8IFwKKwkJCSBTM0MyNDEwX0FEQ1RTQ19ZUF9TRU4gfCBcCisJCQkgUzNDMjQxMF9BRENUU0NfWFBfU0VOIHwgXAorCQkJIFMzQzI0MTBfQURDVFNDX1hZX1BTVCgzKSkKKworI2RlZmluZSBBVVRPUFNUCQkoUzNDMjQxMF9BRENUU0NfWU1fU0VOIHwgXAorCQkJIFMzQzI0MTBfQURDVFNDX1lQX1NFTiB8IFwKKwkJCSBTM0MyNDEwX0FEQ1RTQ19YUF9TRU4gfCBcCisJCQkgUzNDMjQxMF9BRENUU0NfQVVUT19QU1QgfCBcCisJCQkgUzNDMjQxMF9BRENUU0NfWFlfUFNUKDApKQorCisvKiBQZXItdG91Y2hzY3JlZW4gZGF0YS4gKi8KKworLyoqCisgKiBzdHJ1Y3QgczNjMjQxMHRzIC0gZHJpdmVyIHRvdWNoc2NyZWVuIHN0YXRlLgorICogQGNsaWVudDogVGhlIEFEQyBjbGllbnQgd2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjb3JlIGRyaXZlci4KKyAqIEBkZXY6IFRoZSBkZXZpY2Ugd2UgYXJlIGJvdW5kIHRvLgorICogQGlucHV0OiBUaGUgaW5wdXQgZGV2aWNlIHdlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgaW5wdXQgc3Vic3lzdGVtLgorICogQGNsb2NrOiBUaGUgY2xvY2sgZm9yIHRoZSBhZGMuCisgKiBAaW86IFBvaW50ZXIgdG8gdGhlIElPIGJhc2UuCisgKiBAeHA6IFRoZSBhY2N1bXVsYXRlZCBYIHBvc2l0aW9uIGRhdGEuCisgKiBAeXA6IFRoZSBhY2N1bXVsYXRlZCBZIHBvc2l0aW9uIGRhdGEuCisgKiBAaXJxX3RjOiBUaGUgaW50ZXJydXB0IG51bWJlciBmb3IgcGVuIHVwL2Rvd24gaW50ZXJydXB0CisgKiBAY291bnQ6IFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBjb2xsZWN0ZWQuCisgKiBAc2hpZnQ6IFRoZSBsb2cyIG9mIHRoZSBtYXhpbXVtIGNvdW50IHRvIHJlYWQgaW4gb25lIGdvLgorICovCitzdHJ1Y3QgczNjMjQxMHRzIHsKKwlzdHJ1Y3QgczNjX2FkY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IGNsayAqY2xvY2s7CisJdm9pZCBfX2lvbWVtICppbzsKKwl1bnNpZ25lZCBsb25nIHhwOworCXVuc2lnbmVkIGxvbmcgeXA7CisJaW50IGlycV90YzsKKwlpbnQgY291bnQ7CisJaW50IHNoaWZ0OworfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwdHMgdHM7CisKKy8qKgorICogczNjMjQxMF90c19jb25uZWN0IC0gY29uZmlndXJlIGdwaW8gZm9yIHMzYzI0MTAgc3lzdGVtcworICoKKyAqIENvbmZpZ3VyZSB0aGUgR1BJTyBmb3IgdGhlIFMzQzI0MTAgc3lzdGVtLCB3aGVyZSB3ZSBoYXZlIGV4dGVybmFsIEZFVHMKKyAqIGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlIChsYXRlciBzeXN0ZW1zIHN1Y2ggYXMgdGhlIFMzQzI0NDAgaW50ZWdyYXRlCisgKiB0aGVzZSBpbnRvIHRoZSBkZXZpY2UpLgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX3RzX2Nvbm5lY3Qodm9pZCkKK3sKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BHKDEyKSwgUzNDMjQxMF9HUEcxMl9YTU9OKTsKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BHKDEzKSwgUzNDMjQxMF9HUEcxM19uWFBPTik7CisJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRygxNCksIFMzQzI0MTBfR1BHMTRfWU1PTik7CisJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRygxNSksIFMzQzI0MTBfR1BHMTVfbllQT04pOworfQorCisvKioKKyAqIGdldF9kb3duIC0gcmV0dXJuIHRoZSBkb3duIHN0YXRlIG9mIHRoZSBwZW4KKyAqIEBkYXRhMDogVGhlIGRhdGEgcmVhZCBmcm9tIEFEQ0RBVDAgcmVnaXN0ZXIuCisgKiBAZGF0YTE6IFRoZSBkYXRhIHJlYWQgZnJvbSBBRENEQVQxIHJlZ2lzdGVyLgorICoKKyAqIFJldHVybiBub24temVybyBpZiBib3RoIHJlYWRpbmdzIHNob3cgdGhhdCB0aGUgcGVuIGlzIGRvd24uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBnZXRfZG93bih1bnNpZ25lZCBsb25nIGRhdGEwLCB1bnNpZ25lZCBsb25nIGRhdGExKQoreworCS8qIHJldHVybnMgdHJ1ZSBpZiBib3RoIGRhdGEgdmFsdWVzIHNob3cgc3R5bHVzIGRvd24gKi8KKwlyZXR1cm4gKCEoZGF0YTAgJiBTM0MyNDEwX0FEQ0RBVDBfVVBET1dOKSAmJgorCQkhKGRhdGExICYgUzNDMjQxMF9BRENEQVQwX1VQRE9XTikpOworfQorCitzdGF0aWMgdm9pZCB0b3VjaF90aW1lcl9maXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGEwOworCXVuc2lnbmVkIGxvbmcgZGF0YTE7CisJYm9vbCBkb3duOworCisJZGF0YTAgPSByZWFkbCh0cy5pbyArIFMzQzI0MTBfQURDREFUMCk7CisJZGF0YTEgPSByZWFkbCh0cy5pbyArIFMzQzI0MTBfQURDREFUMSk7CisKKwlkb3duID0gZ2V0X2Rvd24oZGF0YTAsIGRhdGExKTsKKworCWlmICh0cy5jb3VudCA9PSAoMSA8PCB0cy5zaGlmdCkpIHsKKwkJdHMueHAgPj49IHRzLnNoaWZ0OworCQl0cy55cCA+Pj0gdHMuc2hpZnQ7CisKKwkJZGV2X2RiZyh0cy5kZXYsICIlczogWD0lbHUsIFk9JWx1LCBjb3VudD0lZFxuIiwKKwkJCV9fZnVuY19fLCB0cy54cCwgdHMueXAsIHRzLmNvdW50KTsKKworCQlpbnB1dF9yZXBvcnRfYWJzKHRzLmlucHV0LCBBQlNfWCwgdHMueHApOworCQlpbnB1dF9yZXBvcnRfYWJzKHRzLmlucHV0LCBBQlNfWSwgdHMueXApOworCisJCWlucHV0X3JlcG9ydF9rZXkodHMuaW5wdXQsIEJUTl9UT1VDSCwgMSk7CisJCWlucHV0X3N5bmModHMuaW5wdXQpOworCisJCXRzLnhwID0gMDsKKwkJdHMueXAgPSAwOworCQl0cy5jb3VudCA9IDA7CisJfQorCisJaWYgKGRvd24pIHsKKwkJczNjX2FkY19zdGFydCh0cy5jbGllbnQsIDAsIDEgPDwgdHMuc2hpZnQpOworCX0gZWxzZSB7CisJCXRzLmNvdW50ID0gMDsKKworCQlpbnB1dF9yZXBvcnRfa2V5KHRzLmlucHV0LCBCVE5fVE9VQ0gsIDApOworCQlpbnB1dF9zeW5jKHRzLmlucHV0KTsKKworCQl3cml0ZWwoV0FJVDRJTlQgfCBJTlRfRE9XTiwgdHMuaW8gKyBTM0MyNDEwX0FEQ1RTQyk7CisJfQorfQorCitzdGF0aWMgREVGSU5FX1RJTUVSKHRvdWNoX3RpbWVyLCB0b3VjaF90aW1lcl9maXJlLCAwLCAwKTsKKworLyoqCisgKiBzdHlsdXNfaXJxIC0gdG91Y2hzY3JlZW4gc3R5bHVzIGV2ZW50IGludGVycnVwdAorICogQGlycTogVGhlIGludGVycnVwdCBudW1iZXIKKyAqIEBkZXZfaWQ6IFRoZSBkZXZpY2UgSUQuCisgKgorICogQ2FsbGVkIHdoZW4gdGhlIElSUV9UQyBpcyBmaXJlZCBmb3IgYSBwZW4gdXAgb3IgZG93biBldmVudC4KKyAqLworc3RhdGljIGlycXJldHVybl90IHN0eWx1c19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXVuc2lnbmVkIGxvbmcgZGF0YTA7CisJdW5zaWduZWQgbG9uZyBkYXRhMTsKKwlib29sIGRvd247CisKKwlkYXRhMCA9IHJlYWRsKHRzLmlvICsgUzNDMjQxMF9BRENEQVQwKTsKKwlkYXRhMSA9IHJlYWRsKHRzLmlvICsgUzNDMjQxMF9BRENEQVQxKTsKKworCWRvd24gPSBnZXRfZG93bihkYXRhMCwgZGF0YTEpOworCisJLyogVE9ETyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGFuIGludGVycnVwdCB3aXRoIGRvd24gc2V0IHdoaWxlCisJICogdGhlIHRpbWVyIGlzIHJ1bm5pbmcsIGJ1dCBtYXliZSB3ZSBvdWdodCB0byB2ZXJpZnkgdGhhdCB0aGUKKwkgKiB0aW1lciBpc24ndCBydW5uaW5nIGFueXdheXMuICovCisKKwlpZiAoZG93bikKKwkJczNjX2FkY19zdGFydCh0cy5jbGllbnQsIDAsIDEgPDwgdHMuc2hpZnQpOworCWVsc2UKKwkJZGV2X2luZm8odHMuZGV2LCAiJXM6IGNvdW50PSVkXG4iLCBfX2Z1bmNfXywgdHMuY291bnQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHMzYzI0eHhfdHNfY29udmVyc2lvbiAtIEFEQyBjb252ZXJzaW9uIGNhbGxiYWNrCisgKiBAY2xpZW50OiBUaGUgY2xpZW50IHRoYXQgd2FzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQURDIGNvcmUuCisgKiBAZGF0YTA6IFRoZSByZWFkaW5nIGZyb20gQURDREFUMC4KKyAqIEBkYXRhMTogVGhlIHJlYWRpbmcgZnJvbSBBRENEQVQxLgorICogQGxlZnQ6IFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBsZWZ0LgorICoKKyAqIENhbGxlZCB3aGVuIGEgY29udmVyc2lvbiBoYXMgZmluaXNoZWQuCisgKi8KK3N0YXRpYyB2b2lkIHMzYzI0eHhfdHNfY29udmVyc2lvbihzdHJ1Y3QgczNjX2FkY19jbGllbnQgKmNsaWVudCwKKwkJCQkgIHVuc2lnbmVkIGRhdGEwLCB1bnNpZ25lZCBkYXRhMSwKKwkJCQkgIHVuc2lnbmVkICpsZWZ0KQoreworCWRldl9kYmcodHMuZGV2LCAiJXM6ICVkLCVkXG4iLCBfX2Z1bmNfXywgZGF0YTAsIGRhdGExKTsKKworCXRzLnhwICs9IGRhdGEwOworCXRzLnlwICs9IGRhdGExOworCisJdHMuY291bnQrKzsKKworCS8qIEZyb20gdGVzdHMsIGl0IHNlZW1zIHRoYXQgaXQgaXMgdW5saWtlbHkgdG8gZ2V0IGEgcGVuLXVwCisJICogZXZlbnQgZHVyaW5nIHRoZSBjb252ZXJzaW9uIHByb2Nlc3Mgd2hpY2ggbWVhbnMgd2UgY2FuCisJICogaWdub3JlIGFueSBwZW4tdXAgZXZlbnRzIHdpdGggbGVzcyB0aGFuIHRoZSByZXF1aXNpdGUKKwkgKiBjb3VudCBkb25lLgorCSAqCisJICogSW4gc2V2ZXJhbCB0aG91c2FuZCBjb252ZXJzaW9ucywgbm8gcGVuLXVwcyB3aGVyZSBkZXRlY3RlZAorCSAqIGJlZm9yZSBjb3VudCBjb21wbGV0ZWQuCisJICovCit9CisKKy8qKgorICogczNjMjR4eF90c19zZWxlY3QgLSBBREMgc2VsZWN0aW9uIGNhbGxiYWNrLgorICogQGNsaWVudDogVGhlIGNsaWVudCB0aGF0IHdhcyByZWdpc3RlcmVkIHdpdGggdGhlIEFEQyBjb3JlLgorICogQHNlbGVjdDogVGhlIHJlYXNvbiBmb3Igc2VsZWN0LgorICoKKyAqIENhbGxlZCB3aGVuIHRoZSBBREMgY29yZSBzZWxlY3RzIChvciBkZXNsZWN0cykgdXMgYXMgYSBjbGllbnQuCisgKi8KK3N0YXRpYyB2b2lkIHMzYzI0eHhfdHNfc2VsZWN0KHN0cnVjdCBzM2NfYWRjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBzZWxlY3QpCit7CisJaWYgKHNlbGVjdCkgeworCQl3cml0ZWwoUzNDMjQxMF9BRENUU0NfUFVMTF9VUF9ESVNBQkxFIHwgQVVUT1BTVCwKKwkJICAgICAgIHRzLmlvICsgUzNDMjQxMF9BRENUU0MpOworCX0gZWxzZSB7CisJCW1vZF90aW1lcigmdG91Y2hfdGltZXIsIGppZmZpZXMrMSk7CisJCXdyaXRlbChXQUlUNElOVCB8IElOVF9VUCwgdHMuaW8gKyBTM0MyNDEwX0FEQ1RTQyk7CisJfQorfQorCisvKioKKyAqIHMzYzI0MTB0c19wcm9iZSAtIGRldmljZSBjb3JlIHByb2JlIGVudHJ5IHBvaW50CisgKiBAcGRldjogVGhlIGRldmljZSB3ZSBhcmUgYmVpbmcgYm91bmQgdG8uCisgKgorICogSW5pdGlhbGlzZSwgZmluZCBhbmQgYWxsb2NhdGUgYW55IHJlc291cmNlcyB3ZSBuZWVkIHRvIHJ1biBhbmQgdGhlbgorICogcmVnaXN0ZXIgd2l0aCB0aGUgQURDIGFuZCBpbnB1dCBzeXN0ZW1zLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzM2MyNDEwdHNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gKmluZm87CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKiBJbml0aWFsaXNlIGlucHV0IHN0dWZmICovCisJbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwdHMpKTsKKworCXRzLmRldiA9IGRldjsKKworCWluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIWluZm8pIHsKKwkJZGV2X2VycihkZXYsICJubyBwbGF0Zm9ybSBkYXRhLCBjYW5ub3QgYXR0YWNoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkZXYsICJpbml0aWFsaXNpbmcgdG91Y2hzY3JlZW5cbiIpOworCisJdHMuY2xvY2sgPSBjbGtfZ2V0KGRldiwgImFkYyIpOworCWlmIChJU19FUlIodHMuY2xvY2spKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBhZGMgY2xvY2sgc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2xrX2VuYWJsZSh0cy5jbG9jayk7CisJZGV2X2RiZyhkZXYsICJnb3QgYW5kIGVuYWJsZWQgY2xvY2tzXG4iKTsKKworCXRzLmlycV90YyA9IHJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJubyByZXNvdXJjZSBmb3IgaW50ZXJydXB0XG4iKTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycihkZXYsICJubyByZXNvdXJjZSBmb3IgcmVnaXN0ZXJzXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfY2xrOworCX0KKworCXRzLmlvID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICh0cy5pbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IG1hcCByZWdpc3RlcnNcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJLyogQ29uZmlndXJlIHRoZSB0b3VjaHNjcmVlbiBleHRlcm5hbCBGRVRzIG9uIHRoZSBTM0MyNDEwICovCisJaWYgKCFwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YSkKKwkJczNjMjQxMF90c19jb25uZWN0KCk7CisKKwl0cy5jbGllbnQgPSBzM2NfYWRjX3JlZ2lzdGVyKHBkZXYsIHMzYzI0eHhfdHNfc2VsZWN0LAorCQkJCSAgICAgczNjMjR4eF90c19jb252ZXJzaW9uLCAxKTsKKwlpZiAoSVNfRVJSKHRzLmNsaWVudCkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYWRjIGNsaWVudFxuIik7CisJCXJldCA9IFBUUl9FUlIodHMuY2xpZW50KTsKKwkJZ290byBlcnJfaW9tYXA7CisJfQorCisJLyogSW5pdGlhbGlzZSByZWdpc3RlcnMgKi8KKwlpZiAoKGluZm8tPmRlbGF5ICYgMHhmZmZmKSA+IDApCisJCXdyaXRlbChpbmZvLT5kZWxheSAmIDB4ZmZmZiwgdHMuaW8gKyBTM0MyNDEwX0FEQ0RMWSk7CisKKwl3cml0ZWwoV0FJVDRJTlQgfCBJTlRfRE9XTiwgdHMuaW8gKyBTM0MyNDEwX0FEQ1RTQyk7CisKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikgeworCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgaW5wdXQgZGV2aWNlICEhXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9tYXA7CisJfQorCisJdHMuaW5wdXQgPSBpbnB1dF9kZXY7CisJdHMuaW5wdXQtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJdHMuaW5wdXQtPmtleWJpdFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXModHMuaW5wdXQsIEFCU19YLCAwLCAweDNGRiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXModHMuaW5wdXQsIEFCU19ZLCAwLCAweDNGRiwgMCwgMCk7CisKKwl0cy5pbnB1dC0+bmFtZSA9ICJTM0MyNFhYIFRvdWNoU2NyZWVuIjsKKwl0cy5pbnB1dC0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCXRzLmlucHV0LT5pZC52ZW5kb3IgPSAweERFQUQ7CisJdHMuaW5wdXQtPmlkLnByb2R1Y3QgPSAweEJFRUY7CisJdHMuaW5wdXQtPmlkLnZlcnNpb24gPSAweDAxMDI7CisKKwl0cy5zaGlmdCA9IGluZm8tPm92ZXJzYW1wbGluZ19zaGlmdDsKKworCXJldCA9IHJlcXVlc3RfaXJxKHRzLmlycV90Yywgc3R5bHVzX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgInMzYzI0MTBfdHNfcGVuIiwgdHMuaW5wdXQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IFRDIGludGVycnVwdFxuIik7CisJCWdvdG8gZXJyX2lucHV0ZGV2OworCX0KKworCWRldl9pbmZvKGRldiwgImRyaXZlciBhdHRhY2hlZCwgcmVnaXN0ZXJpbmcgaW5wdXQgZGV2aWNlXG4iKTsKKworCS8qIEFsbCB3ZW50IG9rLCBzbyByZWdpc3RlciB0byB0aGUgaW5wdXQgc3lzdGVtICovCisJcmV0ID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHRzLmlucHV0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl90Y2lycTsKKwl9CisKKwlyZXR1cm4gMDsKKworIGVycl90Y2lycToKKwlmcmVlX2lycSh0cy5pcnFfdGMsIHRzLmlucHV0KTsKKyBlcnJfaW5wdXRkZXY6CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodHMuaW5wdXQpOworIGVycl9pb21hcDoKKwlpb3VubWFwKHRzLmlvKTsKKyBlcnJfY2xrOgorCWRlbF90aW1lcl9zeW5jKCZ0b3VjaF90aW1lcik7CisJY2xrX3B1dCh0cy5jbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzM2MyNDEwdHNfcmVtb3ZlIC0gZGV2aWNlIGNvcmUgcmVtb3ZhbCBlbnRyeSBwb2ludAorICogQHBkZXY6IFRoZSBkZXZpY2Ugd2UgYXJlIGJlaW5nIHJlbW92ZWQgZnJvbS4KKyAqCisgKiBGcmVlIHVwIG91ciBzdGF0ZSByZWFkeSB0byBiZSByZW1vdmVkLgorICovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzM2MyNDEwdHNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZnJlZV9pcnEodHMuaXJxX3RjLCB0cy5pbnB1dCk7CisJZGVsX3RpbWVyX3N5bmMoJnRvdWNoX3RpbWVyKTsKKworCWNsa19kaXNhYmxlKHRzLmNsb2NrKTsKKwljbGtfcHV0KHRzLmNsb2NrKTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRzLmlucHV0KTsKKwlpb3VubWFwKHRzLmlvKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHMzYzI0MTB0c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl3cml0ZWwoVFNDX1NMRUVQLCB0cy5pbyArIFMzQzI0MTBfQURDVFNDKTsKKwlkaXNhYmxlX2lycSh0cy5pcnFfdGMpOworCWNsa19kaXNhYmxlKHRzLmNsb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0MTB0c19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gKmluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWNsa19lbmFibGUodHMuY2xvY2spOworCisJLyogSW5pdGlhbGlzZSByZWdpc3RlcnMgKi8KKwlpZiAoKGluZm8tPmRlbGF5ICYgMHhmZmZmKSA+IDApCisJCXdyaXRlbChpbmZvLT5kZWxheSAmIDB4ZmZmZiwgdHMuaW8gKyBTM0MyNDEwX0FEQ0RMWSk7CisKKwl3cml0ZWwoV0FJVDRJTlQgfCBJTlRfRE9XTiwgdHMuaW8gKyBTM0MyNDEwX0FEQ1RTQyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHMzY190c19wbW9wcyA9IHsKKwkuc3VzcGVuZAk9IHMzYzI0MTB0c19zdXNwZW5kLAorCS5yZXN1bWUJCT0gczNjMjQxMHRzX3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgczNjdHNfZHJpdmVyX2lkc1tdID0geworCXsgInMzYzI0MTAtdHMiLCAwIH0sCisJeyAiczNjMjQ0MC10cyIsIDEgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBzM2N0c19kcml2ZXJfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjX3RzX2RyaXZlciA9IHsKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAiczNjMjR4eC10cyIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtCT0gJnMzY190c19wbW9wcywKKyNlbmRpZgorCX0sCisJLmlkX3RhYmxlCT0gczNjdHNfZHJpdmVyX2lkcywKKwkucHJvYmUJCT0gczNjMjQxMHRzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoczNjMjQxMHRzX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzM2MyNDEwdHNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnMzY190c19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgczNjMjQxMHRzX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjX3RzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHMzYzI0MTB0c19pbml0KTsKK21vZHVsZV9leGl0KHMzYzI0MTB0c19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4sICIKKwkgICAgICAiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiwgIgorCSAgICAgICJTaW10ZWMgRWxlY3Ryb25pY3MgPGxpbnV4QHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUzNDMjRYWCBUb3VjaHNjcmVlbiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKaW5kZXggMDk1Zjg0Yi4uODlkY2JlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKQEAgLTM1NSwxMCArMzU1LDEzIEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWVycm9yID0gdWNiMTQwMF90c19kZXRlY3RfaXJxKHVjYik7Ci0JaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVUNCMTQwMDogSVJRIHByb2JlIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfZGV2czsKKwkvKiBPbmx5IGluIGNhc2UgdGhlIElSUSBsaW5lIHdhc24ndCBzdXBwbGllZCwgdHJ5IGRldGVjdGluZyBpdCAqLworCWlmICh1Y2ItPmlycSA8IDApIHsKKwkJZXJyb3IgPSB1Y2IxNDAwX3RzX2RldGVjdF9pcnEodWNiKTsKKwkJaWYgKGVycm9yKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlVDQjE0MDA6IElSUSBwcm9iZSBmYWlsZWRcbiIpOworCQkJZ290byBlcnJfZnJlZV9kZXZzOworCQl9CiAJfQogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdWNiLT50c193YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYwppbmRleCA2OGVjZTU4Li4wOWE1ZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiAgLSBHZW5lcmFsIFRvdWNoCiAgKiAgLSBHb1RvcCBTdXBlcl9RMi9Hb2dvUGVuL1BlblBvd2VyIHRhYmxldHMKICAqICAtIEpBU1RFQyBVU0IgdG91Y2ggY29udHJvbGxlci9EaWdpVGVjaCBEVFItMDJVCisgKiAgLSBaeXRyb25pYyBjYXBhY2l0aXZlIHRvdWNoc2NyZWVuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgYnkgRGFuaWVsIFJpdHogPGRhbmllbC5yaXR6QGdteC5jaD4KICAqIENvcHlyaWdodCAoQykgYnkgVG9kZCBFLiBKb2huc29uIChtdG91Y2h1c2IuYykKQEAgLTczLDYgKzc0LDE1IEBACiAJaW50IG1pbl9wcmVzcywgbWF4X3ByZXNzOwogCWludCByZXB0X3NpemU7CiAKKwkvKgorCSAqIEFsd2F5cyBzZXJ2aWNlIHRoZSBVU0IgZGV2aWNlcyBpcnEgbm90IGp1c3Qgd2hlbiB0aGUgaW5wdXQgZGV2aWNlIGlzCisJICogb3Blbi4gVGhpcyBpcyB1c2VmdWwgd2hlbiBkZXZpY2VzIGhhdmUgYSB3YXRjaGRvZyB3aGljaCBwcmV2ZW50cyB1cworCSAqIGZyb20gcGVyaW9kaWNhbGx5IHBvbGxpbmcgdGhlIGRldmljZS4gTGVhdmUgdGhpcyB1bnNldCB1bmxlc3MgeW91cgorCSAqIHRvdWNoc2NyZWVuIGRldmljZSByZXF1aXJlcyBpdCwgYXMgaXQgZG9lcyBjb25zdW1lIG1vcmUgb2YgdGhlIFVTQgorCSAqIGJhbmR3aWR0aC4KKwkgKi8KKwlib29sIGlycV9hbHdheXM7CisKIAl2b2lkICgqcHJvY2Vzc19wa3QpIChzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCwgdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKTsKIAogCS8qCkBAIC0xMjEsNiArMTMxLDggQEAKIAlERVZUWVBFX0dPVE9QLAogCURFVlRZUEVfSkFTVEVDLAogCURFVlRZUEVfRTJJLAorCURFVlRZUEVfWllUUk9OSUMsCisJREVWVFlQRV9UQzVVSCwKIH07CiAKICNkZWZpbmUgVVNCX0RFVklDRV9ISURfQ0xBU1ModmVuZCwgcHJvZCkgXApAQCAtMjAxLDYgKzIxMywxNSBAQAogI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfRTJJCiAJe1VTQl9ERVZJQ0UoMHgxYWM3LCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBERVZUWVBFX0UySX0sCiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfWllUUk9OSUMKKwl7VVNCX0RFVklDRSgweDE0YzgsIDB4MDAwMyksIC5kcml2ZXJfaW5mbyA9IERFVlRZUEVfWllUUk9OSUN9LAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0VUVF9UQzVVSAorCXtVU0JfREVWSUNFKDB4MDY2NCwgMHgwMzA5KSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9UQzVVSH0sCisjZW5kaWYKKwogCXt9CiB9OwogCkBAIC01MzgsNiArNTU5LDE5IEBACiB9CiAjZW5kaWYKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFVCZUIFRDNVVIIHBhcnQKKyAqLworI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfRVRUX1RDNVVICitzdGF0aWMgaW50IHRjNXVoX3JlYWRfZGF0YShzdHJ1Y3QgdXNidG91Y2hfdXNiICpkZXYsIHVuc2lnbmVkIGNoYXIgKnBrdCkKK3sKKwlkZXYtPnggPSAoKHBrdFsyXSAmIDB4MEYpIDw8IDgpIHwgcGt0WzFdOworCWRldi0+eSA9ICgocGt0WzRdICYgMHgwRikgPDwgOCkgfCBwa3RbM107CisJZGV2LT50b3VjaCA9IHBrdFswXSAmIDB4MDE7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElkZWFsVEVLIFVSVEMxMDAwIFBhcnQKQEAgLTYyMSw2ICs2NTUsMzkgQEAKIH0KICNlbmRpZgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFp5dHJvbmljIFBhcnQKKyAqLworI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfWllUUk9OSUMKK3N0YXRpYyBpbnQgenl0cm9uaWNfcmVhZF9kYXRhKHN0cnVjdCB1c2J0b3VjaF91c2IgKmRldiwgdW5zaWduZWQgY2hhciAqcGt0KQoreworCXN3aXRjaCAocGt0WzBdKSB7CisJY2FzZSAweDNBOiAvKiBjb21tYW5kIHJlc3BvbnNlICovCisJCWRiZygiJXM6IENvbW1hbmQgcmVzcG9uc2UgJWQiLCBfX2Z1bmNfXywgcGt0WzFdKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4QzA6IC8qIGRvd24gKi8KKwkJZGV2LT54ID0gKHBrdFsxXSAmIDB4N2YpIHwgKChwa3RbMl0gJiAweDA3KSA8PCA3KTsKKwkJZGV2LT55ID0gKHBrdFszXSAmIDB4N2YpIHwgKChwa3RbNF0gJiAweDA3KSA8PCA3KTsKKwkJZGV2LT50b3VjaCA9IDE7CisJCWRiZygiJXM6IGRvd24gJWQsJWQiLCBfX2Z1bmNfXywgZGV2LT54LCBkZXYtPnkpOworCQlyZXR1cm4gMTsKKworCWNhc2UgMHg4MDogLyogdXAgKi8KKwkJZGV2LT54ID0gKHBrdFsxXSAmIDB4N2YpIHwgKChwa3RbMl0gJiAweDA3KSA8PCA3KTsKKwkJZGV2LT55ID0gKHBrdFszXSAmIDB4N2YpIHwgKChwa3RbNF0gJiAweDA3KSA8PCA3KTsKKwkJZGV2LT50b3VjaCA9IDA7CisJCWRiZygiJXM6IHVwICVkLCVkIiwgX19mdW5jX18sIGRldi0+eCwgZGV2LT55KTsKKwkJcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCQlkYmcoIiVzOiBVbmtub3duIHJldHVybiAlZCIsIF9fZnVuY19fLCBwa3RbMF0pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHRoZSBkaWZmZXJlbnQgZGV2aWNlIGRlc2NyaXB0b3JzCkBAIC03ODMsNiArODUwLDI5IEBACiAJCS5yZWFkX2RhdGEJPSBlMmlfcmVhZF9kYXRhLAogCX0sCiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfWllUUk9OSUMKKwlbREVWVFlQRV9aWVRST05JQ10gPSB7CisJCS5taW5feGMJCT0gMHgwLAorCQkubWF4X3hjCQk9IDB4MDNmZiwKKwkJLm1pbl95YwkJPSAweDAsCisJCS5tYXhfeWMJCT0gMHgwM2ZmLAorCQkucmVwdF9zaXplCT0gNSwKKwkJLnJlYWRfZGF0YQk9IHp5dHJvbmljX3JlYWRfZGF0YSwKKwkJLmlycV9hbHdheXMgICAgID0gdHJ1ZSwKKwl9LAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0VUVF9UQzVVSAorCVtERVZUWVBFX1RDNVVIXSA9IHsKKwkJLm1pbl94YwkJPSAweDAsCisJCS5tYXhfeGMJCT0gMHgwZmZmLAorCQkubWluX3ljCQk9IDB4MCwKKwkJLm1heF95YwkJPSAweDBmZmYsCisJCS5yZXB0X3NpemUJPSA1LAorCQkucmVhZF9kYXRhCT0gdGM1dWhfcmVhZF9kYXRhLAorCX0sCisjZW5kaWYKIH07CiAKIApAQCAtOTMzLDggKzEwMjMsMTAgQEAKIAogCXVzYnRvdWNoLT5pcnEtPmRldiA9IHVzYnRvdWNoLT51ZGV2OwogCi0JaWYgKHVzYl9zdWJtaXRfdXJiKHVzYnRvdWNoLT5pcnEsIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXVzYnRvdWNoLT50eXBlLT5pcnFfYWx3YXlzKSB7CisJCWlmICh1c2Jfc3VibWl0X3VyYih1c2J0b3VjaC0+aXJxLCBHRlBfS0VSTkVMKSkKKwkJICByZXR1cm4gLUVJTzsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk0Myw3ICsxMDM1LDggQEAKIHsKIAlzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0KTsKIAotCXVzYl9raWxsX3VyYih1c2J0b3VjaC0+aXJxKTsKKwlpZiAoIXVzYnRvdWNoLT50eXBlLT5pcnFfYWx3YXlzKQorCQl1c2Jfa2lsbF91cmIodXNidG91Y2gtPmlycSk7CiB9CiAKIApAQCAtMTA2Niw2ICsxMTU5LDkgQEAKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgdXNidG91Y2gpOwogCisJaWYgKHVzYnRvdWNoLT50eXBlLT5pcnFfYWx3YXlzKQorCQl1c2Jfc3VibWl0X3VyYih1c2J0b3VjaC0+aXJxLCBHRlBfS0VSTkVMKTsKKwogCXJldHVybiAwOwogCiBvdXRfZnJlZV9idWZmZXJzOgpAQCAtMTA4Nyw3ICsxMTgzLDcgQEAKIAogCWRiZygiJXMgLSB1c2J0b3VjaCBpcyBpbml0aWFsaXplZCwgY2xlYW5pbmcgdXAiLCBfX2Z1bmNfXyk7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQl1c2Jfa2lsbF91cmIodXNidG91Y2gtPmlycSk7CisJLyogdGhpcyB3aWxsIHN0b3AgSU8gdmlhIGNsb3NlICovCiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodXNidG91Y2gtPmlucHV0KTsKIAl1c2JfZnJlZV91cmIodXNidG91Y2gtPmlycSk7CiAJdXNidG91Y2hfZnJlZV9idWZmZXJzKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIHVzYnRvdWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4venlsb25pdGUtd205N3h4LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3p5bG9uaXRlLXdtOTd4eC5jCmluZGV4IDQxZTQzNTkuLmVjYTU0ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4venlsb25pdGUtd205N3h4LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi96eWxvbml0ZS13bTk3eHguYwpAQCAtOTYsNyArOTYsNyBAQAogCS8qIFdoZW4gdGhlIEFDOTcgcXVldWUgaGFzIGJlZW4gZHJhaW5lZCB3ZSBuZWVkIHRvIGFsbG93IHRpbWUKIAkgKiB0byBidWZmZXIgdXAgc2FtcGxlcyBvdGhlcndpc2Ugd2UgZW5kIHVwIHNwaW5uaW5nIHBvbGxpbmcKIAkgKiBmb3Igc2FtcGxlcy4gIFRoZSBjb250cm9sbGVyIGNhbid0IGhhdmUgYSBzdWl0YWJseSBsb3cKLQkgKiB0aHJlYXNob2xkIHNldCB0byB1c2UgdGhlIG5vdGlmaWNhdGlvbnMgaXQgZ2l2ZXMuCisJICogdGhyZXNob2xkIHNldCB0byB1c2UgdGhlIG5vdGlmaWNhdGlvbnMgaXQgZ2l2ZXMuCiAJICovCiAJbXNsZWVwKDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2FjdDIwMDAvS2NvbmZpZwppbmRleCAzZmMxYTU0Li5mYTI2NzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9hY3QyMDAwL0tjb25maWcKQEAgLTEsNiArMSwzIEBACi0jCi0jIENvbmZpZy5pbiBmb3IgSUJNIEFjdGl2ZSAyMDAwIElTRE4gZHJpdmVyCi0jCiBjb25maWcgSVNETl9EUlZfQUNUMjAwMAogCXRyaXN0YXRlICJJQk0gQWN0aXZlIDIwMDAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElTQQpAQCAtMTAsNCArNywzIEBACiAJICBpbnRvIHRoZSBjYXJkIHVzaW5nIGEgdXRpbGl0eSB3aGljaCBpcyBwYXJ0IG9mIHRoZSBsYXRlc3QKIAkgIGlzZG40ay11dGlscyBwYWNrYWdlLiBQbGVhc2UgcmVhZCB0aGUgZmlsZQogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5hY3QyMDAwPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKaW5kZXggZTFhZmQ2MC4uYjJhMDQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCkBAIC0xLDYgKzEsMyBAQAotIwotIyBDb25maWcuaW4gZm9yIHRoZSBDQVBJIHN1YnN5c3RlbQotIwogY29uZmlnIElTRE5fRFJWX0FWTUIxX1ZFUkJPU0VfUkVBU09OCiAJYm9vbCAiVmVyYm9zZSByZWFzb24gY29kZSByZXBvcnRpbmciCiAJZGVmYXVsdCB5CkBAIC01OSw0ICs1NiwzIEBACiAJICB0aGUgbGVnYWN5IGlzZG40bGludXggbGluayBsYXllci4gIElmIHlvdSBoYXZlIGEgY2FyZCB3aGljaCBpcwogCSAgc3VwcG9ydGVkIGJ5IGEgQ0FQSSBkcml2ZXIsIGJ1dCBzdGlsbCB3YW50IHRvIHVzZSBvbGQgZmVhdHVyZXMgbGlrZQogCSAgaXBwcCBpbnRlcmZhY2VzIG9yIHR0eUkgZW11bGF0aW9uLCBzYXkgWS9NIGhlcmUuCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYwppbmRleCAzZTZkMTdmLi42NmI3ZDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCkBAIC04MzAsNyArODMwLDcgQEAKIAkJICAgICAgY2FzZSAwOiBicmVhazsKIAkJICAgICAgY2FzZSAxOiBzID0gInVua25vd24gY2xhc3MiOyBicmVhazsKIAkJICAgICAgY2FzZSAyOiBzID0gInVua25vd24gZnVuY3Rpb24iOyBicmVhazsKLQkJICAgICAgZGVmYXVsdDogcyA9ICJ1bmtvd24gZXJyb3IiOyBicmVhazsKKwkJICAgICAgZGVmYXVsdDogcyA9ICJ1bmtub3duIGVycm9yIjsgYnJlYWs7CiAJCSAgIH0KIAkJICAgaWYgKHMpCiAJICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjYXBpZHJ2LSVkOiAlcyBmcm9tIGNvbnRyb2xsZXIgMHgleCBmdW5jdGlvbiAlZDogJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaS5jCmluZGV4IGIwMjlkMTMuLmNiMTRhZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaS5jCkBAIC04MDYsNyArODA2LDcgQEAKICAgICAgICAgICBERUxJVkVSWSAtIGluZGljYXRpb24gZW50ZXJlZCBpc2RuX3JjIGZ1bmN0aW9uCiAgICAgICAgICAgUk5SPS4uLiAgLSBhcHBsaWNhdGlvbiBoYWQgcmV0dXJuZWQgUk5SPS4uLiBhZnRlciB0aGUKICAgICAgICAgICAgICAgICAgICAgIGxvb2sgYWhlYWQgY2FsbGJhY2sKLSAgICAgICAgICBSTnVtPTAgICAtIGFwbGljYXRpb24gaGFkIG5vdCByZXR1cm5lZCBhbnkgYnVmZmVyIHRvIGNvcHkKKyAgICAgICAgICBSTnVtPTAgICAtIGFwcGxpY2F0aW9uIGhhZCBub3QgcmV0dXJuZWQgYW55IGJ1ZmZlciB0byBjb3B5CiAgICAgICAgICAgICAgICAgICAgICB0aGlzIGluZGljYXRpb24gYW5kIHdpbGwgY29weSBpdCBzZWxmCiAgICAgICAgICAgQ09NUExFVEUgLSBYREkgaGFkIGNvcGllZCB0aGUgZGF0YSB0byB0aGUgYnVmZmVycyBwcm92aWRlZAogICAgICAgICAgICAgICAgICAgICAgYnUgdGhlIGFwcGxpY2F0aW9uIGFuZCBpcyBhYm91dCB0byBpc3N1ZSB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9tYWludGlkaS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL21haW50aWRpLmMKaW5kZXggNDFjMjZlNy4uNTM0OTc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL21haW50aWRpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL21haW50aWRpLmMKQEAgLTM4NSw3ICszODUsNyBAQAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIGRpdmFfbW50X2ludGVybmFsX2RwcmludGYgKDAsIERMSV9FUlIsICJVbmtub24gSURJIEluZCAoRE1BIG1vZGUpOiAlMDJ4IiwgSW5kKTsKKyAgICAgICAgICAgICAgICAgIGRpdmFfbW50X2ludGVybmFsX2RwcmludGYgKDAsIERMSV9FUlIsICJVbmtub3duIElESSBJbmQgKERNQSBtb2RlKTogJTAyeCIsIEluZCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgcCArPSAodGhpc19pbmRfbGVuZ3RoKzEpOwogICAgICAgICAgICAgICB0b3RhbF9sZW5ndGggLT0gKDQgKyB0aGlzX2luZF9sZW5ndGgpOwpAQCAtNDIwLDcgKzQyMCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZGl2YV9tbnRfaW50ZXJuYWxfZHByaW50ZiAoMCwgRExJX0VSUiwgIlVua25vbiBJREkgSW5kOiAlMDJ4IiwgSW5kKTsKKyAgICAgICAgICAgIGRpdmFfbW50X2ludGVybmFsX2RwcmludGYgKDAsIERMSV9FUlIsICJVbmtub3duIElESSBJbmQ6ICUwMngiLCBJbmQpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmMKaW5kZXggZmM0NmEyNi4uYTY0YmI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjc3VzYi5jCkBAIC03MjEsNyArNzIxLDcgQEAKIAlzd2l0Y2ggKHByb3RvY29sKSB7CiAJY2FzZSAoLTEpOgkvKiB1c2VkIGZvciBpbml0ICovCiAJCWJjaC0+c3RhdGUgPSAtMTsKLQkJLyogZmFsbCB0cm91Z2ggKi8KKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSAoSVNETl9QX05PTkUpOgogCQlpZiAoYmNoLT5zdGF0ZSA9PSBJU0ROX1BfTk9ORSkKIAkJCXJldHVybiAwOyAvKiBhbHJlYWR5IGluIGlkbGUgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmggYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjc3VzYi5oCmluZGV4IDQzZWZlNzMuLjM2OTE5NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmgKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuaApAQCAtMTUwLDcgKzE1MCw3IEBACiAJZm9yIChpID0gMDsgbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJaWYgKGxpc3RbaV0ubnVtID09IG51bSkKIAkJCXJldHVybiBsaXN0W2ldLm5hbWU7Ci0JcmV0dXJuICI8dW5rb3duIFVTQiBFcnJvcj4iOworCXJldHVybiAiPHVua25vd24gVVNCIEVycm9yPiI7CiB9CiAKIC8qIFVTQiBkZXNjcmlwdG9yIG5lZWQgdG8gY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBFbmRQb2ludCBjb21iaW5hdGlvbjogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlzYXIuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlzYXIuYwppbmRleCBkZTM1MmExLi4wOTA5NWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pc2FyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXNhci5jCkBAIC04NjAsNyArODYwLDcgQEAKIAkJcHJfZGVidWcoIiVzOiBwdW1wIHN0ZXYgR1NUTiBDTEVBUlxuIiwgY2gtPmlzLT5uYW1lKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJfaW5mbygidSVzOiBua25vd24gcHVtcCBzdGV2ICV4XG4iLCBjaC0+aXMtPm5hbWUsIGRldnQpOworCQlwcl9pbmZvKCJ1JXM6IHVua25vd24gcHVtcCBzdGV2ICV4XG4iLCBjaC0+aXMtPm5hbWUsIGRldnQpOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3VzYi5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuYwppbmRleCBhNDIwYjY0Li5hYWFlYWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3VzYi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfdXNiLmMKQEAgLTEwODYsNyArMTA4Niw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURCRyhIRkNVU0JfREJHX1NUQVRFUywKLQkJCSAgICAgICAiSEZDX1VTQjogaGZjX3VzYl9kX2wybDE6IHVua293biBzdGF0ZSA6ICUjeCIsIHByKTsKKwkJCSAgICAgICAiSEZDX1VTQjogaGZjX3VzYl9kX2wybDE6IHVua25vd24gc3RhdGUgOiAlI3giLCBwcik7CiAJCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9LY29uZmlnCmluZGV4IGM5ZTQyMzEuLmU4NmJjNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9LY29uZmlnCkBAIC0xLDYgKzEsMyBAQAotIwotIyBDb25maWcuaW4gZm9yIEhZU0ROIElTRE4gZHJpdmVyCi0jCiBjb25maWcgSFlTRE4KIAl0cmlzdGF0ZSAiSHlwZXJjb3BlIEhZU0ROIGNhcmRzIChDaGFtcCwgRXJnbywgTWV0cm8pIHN1cHBvcnQgKG1vZHVsZSBvbmx5KSIKIAlkZXBlbmRzIG9uIG0gJiYgUFJPQ19GUyAmJiBQQ0kKQEAgLTE1LDQgKzEyLDMgQEAKIAlkZXBlbmRzIG9uIEhZU0ROICYmIElTRE5fQ0FQSQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGxpa2UgdG8gdXNlIEh5cGVyY29wZSdzIENBUEkgMi4wIGludGVyZmFjZS4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCmluZGV4IDkwYjU2ZWQuLjUwN2UxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKQEAgLTE1NjMsNyArMTU2Myw3IEBACiAJKihfX2JlMzIgKikocCArICA0KSA9IGNwdV90b19iZTMyKENJU0NPX1NMQVJQX0tFRVBBTElWRSk7CiAJKihfX2JlMzIgKikocCArICA4KSA9IGNwdV90b19iZTMyKGxwLT5jaXNjb19teXNlcSk7CiAJKihfX2JlMzIgKikocCArIDEyKSA9IGNwdV90b19iZTMyKGxwLT5jaXNjb195b3Vyc2VxKTsKLQkqKF9fYmUxNiAqKShwICsgMTYpID0gY3B1X3RvX2JlMTYoMHhmZmZmKTsgLy8gcmVsaWFibGl0eSwgYWx3YXlzIDB4ZmZmZgorCSooX19iZTE2ICopKHAgKyAxNikgPSBjcHVfdG9fYmUxNigweGZmZmYpOyAvLyByZWxpYWJpbGl0eSwgYWx3YXlzIDB4ZmZmZgogCXAgKz0gMTg7CiAKIAlpc2RuX25ldF93cml0ZV9zdXBlcihscCwgc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYwppbmRleCA2NDJkNWFhLi40NWRmNjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCkBAIC04MzYsNyArODM2LDcgQEAKIAkJCXVuc2lnbmVkIHNob3J0IGhsOwogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJCS8qCi0JCQkgKiB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdodCBzcGFjZSBpbiBmcm9udCBvZgorCQkJICogd2UgbmVlZCB0byByZXNlcnZlIGVub3VnaCBzcGFjZSBpbiBmcm9udCBvZgogCQkJICogc2tfYnVmZi4gb2xkIGNhbGwgdG8gZGV2X2FsbG9jX3NrYiBvbmx5IHJlc2VydmVkCiAJCQkgKiAxNiBieXRlcywgbm93IHdlIGFyZSBsb29raW5nIHdoYXQgdGhlIGRyaXZlciB3YW50CiAJCQkgKi8KQEAgLTEzMjYsNyArMTMyNiw3IEBACiAJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOwogCSAgICAgICAgdW5zaWduZWQgc2hvcnQgaGw7CiAJCS8qCi0JCSAqIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2h0IHNwYWNlIGluIGZyb250IG9mCisJCSAqIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggc3BhY2UgaW4gZnJvbnQgb2YKIAkJICogc2tfYnVmZi4gb2xkIGNhbGwgdG8gZGV2X2FsbG9jX3NrYiBvbmx5IHJlc2VydmVkCiAJCSAqIDE2IGJ5dGVzLCBub3cgd2UgYXJlIGxvb2tpbmcgd2hhdCB0aGUgZHJpdmVyIHdhbnQuCiAJCSAqLwpAQCAtMTY3NCw3ICsxNjc0LDcgQEAKIAkgKiAtIGluc2VydCBuZXcgZnJhZ21lbnQgaW50byB0aGUgcHJvcGVyIHNlcXVlbmNlIHNsb3QgKG9uY2UgdGhhdCdzIGRvbmUKIAkgKiAgIG5ld2ZyYWcgd2lsbCBiZSBzZXQgdG8gTlVMTCkKIAkgKiAtIHJlYXNzZW1ibGUgYW55IGNvbXBsZXRlIGZyYWdtZW50IHNlcXVlbmNlIChub24tbnVsbCAnc3RhcnQnCi0JICogICBpbmRpY2F0ZXMgdGhlcmUgaXMgYSBjb250aW5ndW91cyBzZXF1ZW5jZSBwcmVzZW50KQorCSAqICAgaW5kaWNhdGVzIHRoZXJlIGlzIGEgY29udGlndW91cyBzZXF1ZW5jZSBwcmVzZW50KQogCSAqIC0gZGlzY2FyZCBhbnkgaW5jb21wbGV0ZSBzZXF1ZW5jZXMgdGhhdCBhcmUgYmVsb3cgbWluc2VxIC0tIGR1ZQogCSAqICAgdG8gdGhlIGZhY3QgdGhhdCBzZW5kZXIgYWx3YXlzIGluY3JlbWVudCBzZXF1ZW5jZSBudW1iZXIsIGlmIHRoZXJlCiAJICogICBpcyBhbiBpbmNvbXBsZXRlIHNlcXVlbmNlIGJlbG93IG1pbnNlcSwgbm8gbmV3IGZyYWdtZW50cyB3b3VsZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eWZheC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eWZheC5jCmluZGV4IDc4Zjc2NjAuLjRjNDFmMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHlmYXguYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5ZmF4LmMKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCQl9CiAJCXJldHVybiAwOwogCX0KLQkvKiBCQURNVUw9dmFsdWUgLSBkdW1teSAwPWRpc2FibGUgZXJyb3JjaGsgZGlzYWJsZWQgKHRyZXNob2xkIG11bHRpcGxpZXIpICovCisJLyogQkFETVVMPXZhbHVlIC0gZHVtbXkgMD1kaXNhYmxlIGVycm9yY2hrIGRpc2FibGVkICh0aHJlc2hvbGQgbXVsdGlwbGllcikgKi8KIAlpZiAoIXN0cm5jbXAocFswXSwgIkJBRE1VTCIsIDYpKSB7CiAJCXBbMF0gKz0gNjsKIAkJc3dpdGNoICgqcFswXSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2ljbi9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2ljbi9LY29uZmlnCmluZGV4IDg5ZDE1ZWUuLjQ1MzRmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pY24vS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaWNuL0tjb25maWcKQEAgLTEsNiArMSwzIEBACi0jCi0jIENvbmZpZy5pbiBmb3IgSUNOIElTRE4gZHJpdmVyCi0jCiBjb25maWcgSVNETl9EUlZfSUNOCiAJdHJpc3RhdGUgIklDTiAyQiBhbmQgNEIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElTQQpAQCAtMTMsNCArMTAsMyBAQAogCSAgc2VwYXJhdGVseS4gIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2lzZG4vUkVBRE1FPiBhbmQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuaWNuPiBmb3IgbW9yZQogCSAgaW5mb3JtYXRpb24uCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY29yZS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jb3JlLmMKaW5kZXggNzdlZTI4Ni4uNDNmZjRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jb3JlLmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jb3JlLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogICogY3Jvc3Njb25uZWN0aW9ucyBhbmQgY29uZmVyZW5jZXMgdmlhIHNvZnR3YXJlIGlmIG5vdCBwb3NzaWJsZSB0aHJvdWdoCiAgKiBoYXJkd2FyZS4gSWYgaGFyZHdhcmUgY2FwYWJpbGl0eSBpcyBhdmFpbGFibGUsIGhhcmR3YXJlIGlzIHVzZWQuCiAgKgotICogRWNobzogSXMgZ2VuZXJhdGVkIGJ5IENNWCBhbmQgaXMgdXNlZCB0byBjaGVjayBwZXJmb3JtYW5lIG9mIGhhcmQgYW5kCisgKiBFY2hvOiBJcyBnZW5lcmF0ZWQgYnkgQ01YIGFuZCBpcyB1c2VkIHRvIGNoZWNrIHBlcmZvcm1hbmNlIG9mIGhhcmQgYW5kCiAgKiBzb2Z0d2FyZSBDTVguCiAgKgogICogVGhlIENNWCBoYXMgc3BlY2lhbCBmdW5jdGlvbnMgZm9yIGNvbmZlcmVuY2VzIHdpdGggb25lLCB0d28gYW5kIG1vcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYwppbmRleCBlMDRiYWQ2Li42ZDRkYTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCkBAIC03MjUsNyArNzI1LDcgQEAKIAlpZiAodG0tPnJjbnQgPT0gMSkgewogCQlpZiAoKmRlYnVnICYgREVCVUdfTDJfVEVJKQogCQkJdG0tPnRlaV9tLnByaW50ZGVidWcoZmksCi0JCQkgICAgImNoZWNrIHJlcSBmb3IgdGVpICVkIHN1Y2Vzc2Z1bFxuIiwgdG0tPmwyLT50ZWkpOworCQkJICAgICJjaGVjayByZXEgZm9yIHRlaSAlZCBzdWNjZXNzZnVsXG4iLCB0bS0+bDItPnRlaSk7CiAJCW1JU0ROX0ZzbUNoYW5nZVN0YXRlKGZpLCBTVF9URUlfTk9QKTsKIAl9IGVsc2UgaWYgKHRtLT5yY250ID4gMSkgewogCQkvKiBkdXBsaWNhdGUgYXNzaWdubWVudDsgcmVtb3ZlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vcGNiaXQvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9LY29uZmlnCmluZGV4IGZmYmE2ZWMuLmU5YjJkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9wY2JpdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9LY29uZmlnCkBAIC0xLDYgKzEsMyBAQAotIwotIyBDb25maWcuaW4gZm9yIFBDQklUIElTRE4gZHJpdmVyCi0jCiBjb25maWcgSVNETl9EUlZfUENCSVQKIAl0cmlzdGF0ZSAiUENCSVQtRCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNBICYmIChCUk9LRU4gfHwgWDg2KQpAQCAtMTEsNCArOCwzIEBACiAJICB0aGUgY2FyZCB1c2luZyBhIHV0aWxpdHkgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseS4gIFNlZQogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRT4gYW5kCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2lzZG4vUkVBRE1FLnBjYml0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3NjL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vc2MvS2NvbmZpZwppbmRleCBlNjUxMGNhLi43NDY5ODYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vc2MvS2NvbmZpZwpAQCAtMSw2ICsxLDMgQEAKLSMKLSMgQ29uZmlnLmluIGZvciBTcGVsbGNhc3RlciBJU0ROIGRyaXZlcgotIwogY29uZmlnIElTRE5fRFJWX1NDCiAJdHJpc3RhdGUgIlNwZWxsY2FzdGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJU0EKQEAgLTksNCArNiwzIEBACiAJICBkcml2ZXIgY3VycmVudGx5IGJ1aWxkcyBvbmx5IGluIGEgbW9kdWxhcml6ZWQgdmVyc2lvbi4KIAkgIFRvIGJ1aWxkIGl0LCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjLgogCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuc2M+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9hbnMtbGNkLmMgYi9kcml2ZXJzL21hY2ludG9zaC9hbnMtbGNkLmMKaW5kZXggNmE4MjIxOC4uYTNkMjVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvYW5zLWxjZC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2Fucy1sY2QuYwpAQCAtMyw3ICszLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgpAQCAtMjYsNiArMjUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYW5zbGNkX3Nob3J0X2RlbGF5ID0gODA7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbnNsY2RfbG9uZ19kZWxheSA9IDMyODA7CiBzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICphbnNsY2RfcHRyOworc3RhdGljIERFRklORV9NVVRFWChhbnNsY2RfbXV0ZXgpOwogCiAjdW5kZWYgREVCVUcKIApAQCAtNjUsMjYgKzY1LDMxIEBACiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOworCisJbXV0ZXhfbG9jaygmYW5zbGNkX211dGV4KTsKIAlmb3IgKCBpID0gKnBwb3M7IGNvdW50ID4gMDsgKytpLCArK3AsIC0tY291bnQgKSAKIAl7CiAJCWNoYXIgYzsKIAkJX19nZXRfdXNlcihjLCBwKTsKIAkJYW5zbGNkX3dyaXRlX2J5dGVfZGF0YSggYyApOwogCX0KKwltdXRleF91bmxvY2soJmFuc2xjZF9tdXRleCk7CiAJKnBwb3MgPSBpOwogCXJldHVybiBwIC0gYnVmOwogfQogCi1zdGF0aWMgaW50Ci1hbnNsY2RfaW9jdGwoIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQorc3RhdGljIGxvbmcKK2Fuc2xjZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJY2hhciBjaCwgX191c2VyICp0ZW1wOworCWxvbmcgcmV0ID0gMDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgIkxDRDogaW9jdGwoJWQsJWQpXG4iLGNtZCxhcmcpOwogI2VuZGlmCiAKKwltdXRleF9sb2NrKCZhbnNsY2RfbXV0ZXgpOworCiAJc3dpdGNoICggY21kICkKIAl7CiAJY2FzZSBBTlNMQ0RfQ0xFQVI6CkBAIC05Myw3ICs5OCw3IEBACiAJCWFuc2xjZF93cml0ZV9ieXRlX2N0cmwgKCAweDA2ICk7CiAJCWFuc2xjZF93cml0ZV9ieXRlX2N0cmwgKCAweDAxICk7CiAJCWFuc2xjZF93cml0ZV9ieXRlX2N0cmwgKCAweDAyICk7Ci0JCXJldHVybiAwOworCQlicmVhazsKIAljYXNlIEFOU0xDRF9TRU5EQ1RSTDoKIAkJdGVtcCA9IChjaGFyIF9fdXNlciAqKSBhcmc7CiAJCV9fZ2V0X3VzZXIoY2gsIHRlbXApOwpAQCAtMTAxLDMzICsxMDYsMzcgQEAKIAkJCWFuc2xjZF93cml0ZV9ieXRlX2N0cmwgKCBjaCApOwogCQkJX19nZXRfdXNlcihjaCwgdGVtcCk7CiAJCX0KLQkJcmV0dXJuIDA7CisJCWJyZWFrOwogCWNhc2UgQU5TTENEX1NFVFNIT1JUREVMQVk6CiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRUFDQ0VTOwotCQlhbnNsY2Rfc2hvcnRfZGVsYXk9YXJnOwotCQlyZXR1cm4gMDsKKwkJCXJldCA9LUVBQ0NFUzsKKwkJZWxzZQorCQkJYW5zbGNkX3Nob3J0X2RlbGF5PWFyZzsKKwkJYnJlYWs7CiAJY2FzZSBBTlNMQ0RfU0VUTE9OR0RFTEFZOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJYW5zbGNkX2xvbmdfZGVsYXk9YXJnOwotCQlyZXR1cm4gMDsKKwkJCXJldCA9IC1FQUNDRVM7CisJCWVsc2UKKwkJCWFuc2xjZF9sb25nX2RlbGF5PWFyZzsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IC1FSU5WQUw7CiAJfQorCisJbXV0ZXhfdW5sb2NrKCZhbnNsY2RfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQKIGFuc2xjZF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlICkKIHsKLQljeWNsZV9rZXJuZWxfbG9jaygpOwogCXJldHVybiAwOwogfQogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFuc2xjZF9mb3BzID0gewotCS53cml0ZQk9IGFuc2xjZF93cml0ZSwKLQkuaW9jdGwJPSBhbnNsY2RfaW9jdGwsCi0JLm9wZW4JPSBhbnNsY2Rfb3BlbiwKKwkud3JpdGUJCT0gYW5zbGNkX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IGFuc2xjZF9pb2N0bCwKKwkub3BlbgkJPSBhbnNsY2Rfb3BlbiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhbnNsY2RfZGV2ID0gewpAQCAtMTY4LDYgKzE3Nyw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIkxDRDogaW5pdFxuIik7CiAjZW5kaWYKIAorCW11dGV4X2xvY2soJmFuc2xjZF9tdXRleCk7CiAJYW5zbGNkX3dyaXRlX2J5dGVfY3RybCAoIDB4MzggKTsKIAlhbnNsY2Rfd3JpdGVfYnl0ZV9jdHJsICggMHgwYyApOwogCWFuc2xjZF93cml0ZV9ieXRlX2N0cmwgKCAweDA2ICk7CkBAIC0xNzYsNiArMTg2LDcgQEAKIAlmb3IoYT0wO2E8ODA7YSsrKSB7CiAJCWFuc2xjZF93cml0ZV9ieXRlX2RhdGEoYW5zbGNkX2xvZ29bYV0pOwogCX0KKwltdXRleF91bmxvY2soJmFuc2xjZF9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYwppbmRleCA4YjkzNjQ0Li4zZmJlNDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jCkBAIC0xNSw3ICsxNSw3IEBACiAgKgogICoJV0FSTklORzogVGhpcyBkcml2ZXIgaGFzIG9ubHkgYmVlbiB0ZXN0ZW4gb24gQXBwbGUncwogICoJMS4yNSBNSHogRHVhbCBHNCAoTWFyY2ggMDMpLiBJdCBpcyB0dW5lZCBmb3IgYSBDUFUKLSAqCXRlbXBlcmF0dXIgYXJvdW5kIDU3IEMuCisgKgl0ZW1wZXJhdHVyZSBhcm91bmQgNTcgQy4KICAqCiAgKiAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBTYW11ZWwgUnlkaCAoc2FtdWVsQGlicml1bS5zZSkKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggZWQxMDM4MS4uZTQxMjk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtOTg4LDcgKzk4OCw3IEBACiAJCWdvdG8gYmFkX2NpcGhlcjsKIAl9CiAKLQkvKiBDb21wYXRpYmxpdHkgbW9kZSBmb3Igb2xkIGRtLWNyeXB0IGNpcGhlciBzdHJpbmdzICovCisJLyogQ29tcGF0aWJpbGl0eSBtb2RlIGZvciBvbGQgZG0tY3J5cHQgY2lwaGVyIHN0cmluZ3MgKi8KIAlpZiAoIWNoYWlubW9kZSB8fCAoc3RyY21wKGNoYWlubW9kZSwgInBsYWluIikgPT0gMCAmJiAhaXZtb2RlKSkgewogCQljaGFpbm1vZGUgPSAiY2JjIjsKIAkJaXZtb2RlID0gInBsYWluIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwppbmRleCAzMmQwYjg3Li5kY2U5NzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMKKysrIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCkBAIC0xMTE2LDggKzExMTYsOSBAQAogCXJldHVybiBsaW1pdF9yZWFjaGVkOwogfQogCi1zdGF0aWMgdm9pZCBwZ19pbml0X2RvbmUoc3RydWN0IGRtX3BhdGggKnBhdGgsIGludCBlcnJvcnMpCitzdGF0aWMgdm9pZCBwZ19pbml0X2RvbmUodm9pZCAqZGF0YSwgaW50IGVycm9ycykKIHsKKwlzdHJ1Y3QgZG1fcGF0aCAqcGF0aCA9IGRhdGE7CiAJc3RydWN0IHBncGF0aCAqcGdwYXRoID0gcGF0aF90b19wZ3BhdGgocGF0aCk7CiAJc3RydWN0IHByaW9yaXR5X2dyb3VwICpwZyA9IHBncGF0aC0+cGc7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IHBnLT5tOwpAQCAtMTE4MywxMiArMTE4NCwxMSBAQAogCiBzdGF0aWMgdm9pZCBhY3RpdmF0ZV9wYXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBwZ3BhdGggKnBncGF0aCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGdwYXRoLCBhY3RpdmF0ZV9wYXRoKTsKIAotCXJldCA9IHNjc2lfZGhfYWN0aXZhdGUoYmRldl9nZXRfcXVldWUocGdwYXRoLT5wYXRoLmRldi0+YmRldikpOwotCXBnX2luaXRfZG9uZSgmcGdwYXRoLT5wYXRoLCByZXQpOworCXNjc2lfZGhfYWN0aXZhdGUoYmRldl9nZXRfcXVldWUocGdwYXRoLT5wYXRoLmRldi0+YmRldiksCisJCQkJcGdfaW5pdF9kb25lLCAmcGdwYXRoLT5wYXRoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9jb21tb24vTWFrZWZpbGUKaW5kZXggMzUxYjk4Yi4uMTY5YjMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBzYWE3MTQ2LW9ianMgICAgOj0gc2FhNzE0Nl9pMmMubyBzYWE3MTQ2X2NvcmUubwogc2FhNzE0Nl92di1vYmpzIDo9IHNhYTcxNDZfZm9wcy5vIHNhYTcxNDZfdmlkZW8ubyBzYWE3MTQ2X2hscC5vIHNhYTcxNDZfdmJpLm8KLWlyLWNvbW1vbi1vYmpzICA6PSBpci1mdW5jdGlvbnMubyBpci1rZXltYXBzLm8KK2lyLWNvbW1vbi1vYmpzICA6PSBpci1mdW5jdGlvbnMubyBpci1rZXltYXBzLm8gaXIta2V5dGFibGUubwogCiBvYmoteSArPSB0dW5lcnMvCiBvYmotJChDT05GSUdfVklERU9fU0FBNzE0NikgKz0gc2FhNzE0Ni5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1mdW5jdGlvbnMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWZ1bmN0aW9ucy5jCmluZGV4IGFiZDQ3OTEuLmU2MTZmNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWZ1bmN0aW9ucy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWZ1bmN0aW9ucy5jCkBAIC0zNCwyMiArMzQsMTkgQEAKIG1vZHVsZV9wYXJhbShyZXBlYXQsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlcGVhdCwiYXV0by1yZXBlYXQgZm9yIElSIGtleXMgKGRlZmF1bHQ6IG9uKSIpOwogCi1zdGF0aWMgaW50IGRlYnVnOyAgICAvKiBkZWJ1ZyBsZXZlbCAoMCwxLDIpICovCi1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci0KLSNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pCWlmIChkZWJ1ZyA+PSBsZXZlbCkgXAotCXByaW50ayhLRVJOX0RFQlVHIGZtdCAsICMjIGFyZykKK2ludCBtZWRpYV9pcl9kZWJ1ZzsgICAgLyogbWVkaWFfaXJfZGVidWcgbGV2ZWwgKDAsMSwyKSAqLworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBtZWRpYV9pcl9kZWJ1ZywgaW50LCAwNjQ0KTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHZvaWQgaXJfaW5wdXRfa2V5X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgc3RydWN0IGlyX2lucHV0X3N0YXRlICppcikKIHsKIAlpZiAoS0VZX1JFU0VSVkVEID09IGlyLT5rZXljb2RlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmtub3duIGtleToga2V5PTB4JTAyeCByYXc9MHglMDJ4IGRvd249JWRcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsaXItPmlyX2tleSxpci0+aXJfcmF3LGlyLT5rZXlwcmVzc2VkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVua25vd24ga2V5OiBrZXk9MHglMDJ4IGRvd249JWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGlyLT5pcl9rZXksIGlyLT5rZXlwcmVzc2VkKTsKIAkJcmV0dXJuOwogCX0KLQlkcHJpbnRrKDEsIiVzOiBrZXkgZXZlbnQgY29kZT0lZCBkb3duPSVkXG4iLAorCUlSX2RwcmludGsoMSwiJXM6IGtleSBldmVudCBjb2RlPSVkIGRvd249JWRcbiIsCiAJCWRldi0+bmFtZSxpci0+a2V5Y29kZSxpci0+a2V5cHJlc3NlZCk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsaXItPmtleWNvZGUsaXItPmtleXByZXNzZWQpOwogCWlucHV0X3N5bmMoZGV2KTsKQEAgLTU3LDM5ICs1NCwzNCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIGlyX2lucHV0X2luaXQoc3RydWN0IGlucHV0X2RldiAqZGV2LCBzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgKmlyLAoraW50IGlyX2lucHV0X2luaXQoc3RydWN0IGlucHV0X2RldiAqZGV2LCBzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgKmlyLAogCQkgICBpbnQgaXJfdHlwZSwgc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlICppcl9jb2RlcykKIHsKLQlpbnQgaTsKLQogCWlyLT5pcl90eXBlID0gaXJfdHlwZTsKIAotCW1lbXNldChpci0+aXJfY29kZXMsIDAsIHNpemVvZihpci0+aXJfY29kZXMpKTsKKwlpci0+a2V5dGFibGUuc2l6ZSA9IGlyX3JvdW5kdXBfdGFibGVzaXplKGlyX2NvZGVzLT5zaXplKTsKKwlpci0+a2V5dGFibGUuc2NhbiA9IGt6YWxsb2MoaXItPmtleXRhYmxlLnNpemUgKgorCQkJCSAgICBzaXplb2Yoc3RydWN0IGlyX3NjYW5jb2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpci0+a2V5dGFibGUuc2NhbikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKgotCSAqIEZJWE1FOiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gdXNlIHRoZSBuZXcgSVIgdGFibGVzCi0JICogd2l0aCB0aGUgb2xkIGFwcHJvYWNoLiBMYXRlciBwYXRjaGVzIHdpbGwgcmVwbGFjZSB0aGlzIHRvIGEKLQkgKiBwcm9wZXIgbWV0aG9kCi0JICovCisJSVJfZHByaW50aygxLCAiQWxsb2NhdGVkIHNwYWNlIGZvciAlZCBrZXljb2RlIGVudHJpZXMgKCV6ZCBieXRlcylcbiIsCisJCWlyLT5rZXl0YWJsZS5zaXplLAorCQlpci0+a2V5dGFibGUuc2l6ZSAqIHNpemVvZihpci0+a2V5dGFibGUuc2NhbikpOwogCi0JaWYgKGlyX2NvZGVzKQotCQlmb3IgKGkgPSAwOyBpIDwgaXJfY29kZXMtPnNpemU7IGkrKykKLQkJCWlmIChpcl9jb2Rlcy0+c2NhbltpXS5zY2FuY29kZSA8IElSX0tFWVRBQl9TSVpFKQotCQkJCWlyLT5pcl9jb2Rlc1tpcl9jb2Rlcy0+c2NhbltpXS5zY2FuY29kZV0gPSBpcl9jb2Rlcy0+c2NhbltpXS5rZXljb2RlOworCWlyX2NvcHlfdGFibGUoJmlyLT5rZXl0YWJsZSwgaXJfY29kZXMpOworCWlyX3NldF9rZXljb2RlX3RhYmxlKGRldiwgJmlyLT5rZXl0YWJsZSk7CiAKLQlkZXYtPmtleWNvZGUgICAgID0gaXItPmlyX2NvZGVzOwotCWRldi0+a2V5Y29kZXNpemUgPSBzaXplb2YoSVJfS0VZVEFCX1RZUEUpOwotCWRldi0+a2V5Y29kZW1heCAgPSBJUl9LRVlUQUJfU0laRTsKLQlmb3IgKGkgPSAwOyBpIDwgSVJfS0VZVEFCX1NJWkU7IGkrKykKLQkJc2V0X2JpdChpci0+aXJfY29kZXNbaV0sIGRldi0+a2V5Yml0KTsKIAljbGVhcl9iaXQoMCwgZGV2LT5rZXliaXQpOwotCiAJc2V0X2JpdChFVl9LRVksIGRldi0+ZXZiaXQpOwogCWlmIChyZXBlYXQpCiAJCXNldF9iaXQoRVZfUkVQLCBkZXYtPmV2Yml0KTsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJfaW5wdXRfaW5pdCk7CiAKKwogdm9pZCBpcl9pbnB1dF9ub2tleShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAqaXIpCiB7CiAJaWYgKGlyLT5rZXlwcmVzc2VkKSB7CkBAIC0xMDAsOSArOTIsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaXJfaW5wdXRfbm9rZXkpOwogCiB2b2lkIGlyX2lucHV0X2tleWRvd24oc3RydWN0IGlucHV0X2RldiAqZGV2LCBzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgKmlyLAotCQkgICAgICB1MzIgaXJfa2V5LCB1MzIgaXJfcmF3KQorCQkgICAgICB1MzIgaXJfa2V5KQogewotCXUzMiBrZXljb2RlID0gSVJfS0VZQ09ERShpci0+aXJfY29kZXMsIGlyX2tleSk7CisJdTMyIGtleWNvZGUgPSBpcl9nX2tleWNvZGVfZnJvbV90YWJsZShkZXYsIGlyX2tleSk7CiAKIAlpZiAoaXItPmtleXByZXNzZWQgJiYgaXItPmtleWNvZGUgIT0ga2V5Y29kZSkgewogCQlpci0+a2V5cHJlc3NlZCA9IDA7CkBAIC0xMTAsNyArMTAyLDYgQEAKIAl9CiAJaWYgKCFpci0+a2V5cHJlc3NlZCkgewogCQlpci0+aXJfa2V5ICA9IGlyX2tleTsKLQkJaXItPmlyX3JhdyAgPSBpcl9yYXc7CiAJCWlyLT5rZXljb2RlID0ga2V5Y29kZTsKIAkJaXItPmtleXByZXNzZWQgPSAxOwogCQlpcl9pbnB1dF9rZXlfZXZlbnQoZGV2LGlyKTsKQEAgLTI3NSw3ICsyNjYsNyBAQAogICogc2FhNzEzNCAqLwogCiAvKiBkZWNvZGUgcmF3IGJpdCBwYXR0ZXJuIHRvIFJDNSBjb2RlICovCi1zdGF0aWMgdTMyIGlyX3JjNV9kZWNvZGUodW5zaWduZWQgaW50IGNvZGUpCit1MzIgaXJfcmM1X2RlY29kZSh1bnNpZ25lZCBpbnQgY29kZSkKIHsKIAl1bnNpZ25lZCBpbnQgb3JnX2NvZGUgPSBjb2RlOwogCXVuc2lnbmVkIGludCBwYWlyOwpAQCAtMjk1LDE1ICsyODYsMTYgQEAKIAkJCXJjNSB8PSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKLQkJCWRwcmludGsoMSwgImlyLWNvbW1vbjogaXJfcmM1X2RlY29kZSgleCkgYmFkIGNvZGVcbiIsIG9yZ19jb2RlKTsKKwkJCUlSX2RwcmludGsoMSwgImlyLWNvbW1vbjogaXJfcmM1X2RlY29kZSgleCkgYmFkIGNvZGVcbiIsIG9yZ19jb2RlKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCWRwcmludGsoMSwgImlyLWNvbW1vbjogY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwgdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCisJSVJfZHByaW50aygxLCAiaXItY29tbW9uOiBjb2RlPSV4LCByYzU9JXgsIHN0YXJ0PSV4LCB0b2dnbGU9JXgsIGFkZHJlc3M9JXgsICIKIAkJImluc3RyPSV4XG4iLCByYzUsIG9yZ19jb2RlLCBSQzVfU1RBUlQocmM1KSwKIAkJUkM1X1RPR0dMRShyYzUpLCBSQzVfQUREUihyYzUpLCBSQzVfSU5TVFIocmM1KSk7CiAJcmV0dXJuIHJjNTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlyX3JjNV9kZWNvZGUpOwogCiB2b2lkIGlyX3JjNV90aW1lcl9lbmQodW5zaWduZWQgbG9uZyBkYXRhKQogewpAQCAtMzMwLDIwICszMjIsMjAgQEAKIAogCS8qIEFsbG93IHNvbWUgdGltZXIgaml0dGVyIChSQzUgaXMgfjI0bXMgYW55d2F5IHNvIHRoaXMgaXMgb2spICovCiAJaWYgKGdhcCA8IDI4MDAwKSB7Ci0JCWRwcmludGsoMSwgImlyLWNvbW1vbjogc3B1cmlvdXMgdGltZXJfZW5kXG4iKTsKKwkJSVJfZHByaW50aygxLCAiaXItY29tbW9uOiBzcHVyaW91cyB0aW1lcl9lbmRcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGlyLT5sYXN0X2JpdCA8IDIwKSB7CiAJCS8qIGlnbm9yZSBzcHVyaW91cyBjb2RlcyAoY2F1c2VkIGJ5IGxpZ2h0L290aGVyIHJlbW90ZXMpICovCi0JCWRwcmludGsoMSwgImlyLWNvbW1vbjogc2hvcnQgY29kZTogJXhcbiIsIGlyLT5jb2RlKTsKKwkJSVJfZHByaW50aygxLCAiaXItY29tbW9uOiBzaG9ydCBjb2RlOiAleFxuIiwgaXItPmNvZGUpOwogCX0gZWxzZSB7CiAJCWlyLT5jb2RlID0gKGlyLT5jb2RlIDw8IGlyLT5zaGlmdF9ieSkgfCAxOwogCQlyYzUgPSBpcl9yYzVfZGVjb2RlKGlyLT5jb2RlKTsKIAogCQkvKiB0d28gc3RhcnQgYml0cz8gKi8KIAkJaWYgKFJDNV9TVEFSVChyYzUpICE9IGlyLT5zdGFydCkgewotCQkJZHByaW50aygxLCAiaXItY29tbW9uOiByYzUgc3RhcnQgYml0cyBpbnZhbGlkOiAldVxuIiwgUkM1X1NUQVJUKHJjNSkpOworCQkJSVJfZHByaW50aygxLCAiaXItY29tbW9uOiByYzUgc3RhcnQgYml0cyBpbnZhbGlkOiAldVxuIiwgUkM1X1NUQVJUKHJjNSkpOwogCiAJCQkvKiByaWdodCBhZGRyZXNzPyAqLwogCQl9IGVsc2UgaWYgKFJDNV9BRERSKHJjNSkgPT0gaXItPmFkZHIpIHsKQEAgLTM1MywxMSArMzQ1LDEwIEBACiAJCQkvKiBHb29kIGNvZGUsIGRlY2lkZSBpZiByZXBlYXQvcmVwcmVzcyAqLwogCQkJaWYgKHRvZ2dsZSAhPSBSQzVfVE9HR0xFKGlyLT5sYXN0X3JjNSkgfHwKIAkJCSAgICBpbnN0ciAhPSBSQzVfSU5TVFIoaXItPmxhc3RfcmM1KSkgewotCQkJCWRwcmludGsoMSwgImlyLWNvbW1vbjogaW5zdHJ1Y3Rpb24gJXgsIHRvZ2dsZSAleFxuIiwgaW5zdHIsCisJCQkJSVJfZHByaW50aygxLCAiaXItY29tbW9uOiBpbnN0cnVjdGlvbiAleCwgdG9nZ2xlICV4XG4iLCBpbnN0ciwKIAkJCQkJdG9nZ2xlKTsKIAkJCQlpcl9pbnB1dF9ub2tleShpci0+ZGV2LCAmaXItPmlyKTsKLQkJCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGluc3RyLAotCQkJCQkJIGluc3RyKTsKKwkJCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGluc3RyKTsKIAkJCX0KIAogCQkJLyogU2V0L3Jlc2V0IGtleS11cCB0aW1lciAqLwpAQCAtMzc2LDcgKzM2Nyw3IEBACiB7CiAJc3RydWN0IGNhcmRfaXIgKmlyID0gKHN0cnVjdCBjYXJkX2lyICopZGF0YTsKIAotCWRwcmludGsoMSwgImlyLWNvbW1vbjoga2V5IHJlbGVhc2VkXG4iKTsKKwlJUl9kcHJpbnRrKDEsICJpci1jb21tb246IGtleSByZWxlYXNlZFxuIik7CiAJaXJfaW5wdXRfbm9rZXkoaXItPmRldiwgJmlyLT5pcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9yYzVfdGltZXJfa2V5dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCmluZGV4IGY2NzkwMTcuLjMyOGM5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKQEAgLTE3MDUsNiArMTcwNSw3IEBACiAJeyAweDM3LCBLRVlfUkFESU8gfSwJCS8qIEZNICovCiAJeyAweDM4LCBLRVlfRFZEIH0sCiAKKwl7IDB4MWEsIEtFWV9NT0RFfSwJCS8qIGNoYW5nZSB0byBNQ0UgbW9kZSBvbiBZMDRHMDA1MSAqLwogCXsgMHgzZSwgS0VZX0YyMSB9LAkJLyogTUNFICtWT0wsIG9uIFkwNEcwMDMzICovCiAJeyAweDNhLCBLRVlfRjIyIH0sCQkvKiBNQ0UgLVZPTCwgb24gWTA0RzAwMzMgKi8KIAl7IDB4M2IsIEtFWV9GMjMgfSwJCS8qIE1DRSArQ0gsICBvbiBZMDRHMDAzMyAqLwpAQCAtMTg0Niw2ICsxODQ3LDc2IEBACiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfaGF1cHBhdWdlX25ld190YWJsZSk7CiAKKy8qCisgKiBIYXVwcGF1Z2U6dGhlIG5ld2VyLCBncmF5IHJlbW90ZXMgKHNlZW1zIHRoZXJlIGFyZSBtdWx0aXBsZQorICogc2xpZ2h0bHkgZGlmZmVyZW50IHZlcnNpb25zKSwgc2hpcHBlZCB3aXRoIGN4ODgraXZ0diBjYXJkcy4KKyAqCisgKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBSQzUgY29kZSwgaW5zdGVhZCBvZiBqdXN0IHRoZSBkYXRhIHBhcnQKKyAqLworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19yYzVfaGF1cHBhdWdlX25ld1tdID0geworCS8qIEtleXMgMCB0byA5ICovCisJeyAweDFlMDAsIEtFWV8wIH0sCisJeyAweDFlMDEsIEtFWV8xIH0sCisJeyAweDFlMDIsIEtFWV8yIH0sCisJeyAweDFlMDMsIEtFWV8zIH0sCisJeyAweDFlMDQsIEtFWV80IH0sCisJeyAweDFlMDUsIEtFWV81IH0sCisJeyAweDFlMDYsIEtFWV82IH0sCisJeyAweDFlMDcsIEtFWV83IH0sCisJeyAweDFlMDgsIEtFWV84IH0sCisJeyAweDFlMDksIEtFWV85IH0sCisKKwl7IDB4MWUwYSwgS0VZX1RFWFQgfSwJCS8qIGtleXBhZCBhc3RlcmlzayBhcyB3ZWxsICovCisJeyAweDFlMGIsIEtFWV9SRUQgfSwJCS8qIHJlZCBidXR0b24gKi8KKwl7IDB4MWUwYywgS0VZX1JBRElPIH0sCisJeyAweDFlMGQsIEtFWV9NRU5VIH0sCisJeyAweDFlMGUsIEtFWV9TVUJUSVRMRSB9LAkJLyogYWxzbyB0aGUgIyBrZXkgKi8KKwl7IDB4MWUwZiwgS0VZX01VVEUgfSwKKwl7IDB4MWUxMCwgS0VZX1ZPTFVNRVVQIH0sCisJeyAweDFlMTEsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDFlMTIsIEtFWV9QUkVWSU9VUyB9LAkJLyogcHJldmlvdXMgY2hhbm5lbCAqLworCXsgMHgxZTE0LCBLRVlfVVAgfSwKKwl7IDB4MWUxNSwgS0VZX0RPV04gfSwKKwl7IDB4MWUxNiwgS0VZX0xFRlQgfSwKKwl7IDB4MWUxNywgS0VZX1JJR0hUIH0sCisJeyAweDFlMTgsIEtFWV9WSURFTyB9LAkJLyogVmlkZW9zICovCisJeyAweDFlMTksIEtFWV9BVURJTyB9LAkJLyogTXVzaWMgKi8KKwkvKiAweDFlMWE6IFBpY3R1cmVzIC0gcHJlc3VtZSB0aGlzIG1lYW5zCisJICAgIk11bHRpbWVkaWEgSG9tZSBQbGF0Zm9ybSIgLQorCSAgIG5vICJQSUNUVVJFUyIga2V5IGluIGlucHV0LmgKKwkgKi8KKwl7IDB4MWUxYSwgS0VZX01IUCB9LAorCisJeyAweDFlMWIsIEtFWV9FUEcgfSwJCS8qIEd1aWRlICovCisJeyAweDFlMWMsIEtFWV9UViB9LAorCXsgMHgxZTFlLCBLRVlfTkVYVFNPTkcgfSwJCS8qIHNraXAgPnwgKi8KKwl7IDB4MWUxZiwgS0VZX0VYSVQgfSwJCS8qIGJhY2svZXhpdCAqLworCXsgMHgxZTIwLCBLRVlfQ0hBTk5FTFVQIH0sCS8qIGNoYW5uZWwgLyBwcm9ncmFtICsgKi8KKwl7IDB4MWUyMSwgS0VZX0NIQU5ORUxET1dOIH0sCS8qIGNoYW5uZWwgLyBwcm9ncmFtIC0gKi8KKwl7IDB4MWUyMiwgS0VZX0NIQU5ORUwgfSwJCS8qIHNvdXJjZSAob2xkIGJsYWNrIHJlbW90ZSkgKi8KKwl7IDB4MWUyNCwgS0VZX1BSRVZJT1VTU09ORyB9LAkvKiByZXBsYXkgfDwgKi8KKwl7IDB4MWUyNSwgS0VZX0VOVEVSIH0sCQkvKiBPSyAqLworCXsgMHgxZTI2LCBLRVlfU0xFRVAgfSwJCS8qIG1pbmltaXplIChvbGQgYmxhY2sgcmVtb3RlKSAqLworCXsgMHgxZTI5LCBLRVlfQkxVRSB9LAkJLyogYmx1ZSBrZXkgKi8KKwl7IDB4MWUyZSwgS0VZX0dSRUVOIH0sCQkvKiBncmVlbiBidXR0b24gKi8KKwl7IDB4MWUzMCwgS0VZX1BBVVNFIH0sCQkvKiBwYXVzZSAqLworCXsgMHgxZTMyLCBLRVlfUkVXSU5EIH0sCQkvKiBiYWNrd2FyZCA8PCAqLworCXsgMHgxZTM0LCBLRVlfRkFTVEZPUldBUkQgfSwJLyogZm9yd2FyZCA+PiAqLworCXsgMHgxZTM1LCBLRVlfUExBWSB9LAorCXsgMHgxZTM2LCBLRVlfU1RPUCB9LAorCXsgMHgxZTM3LCBLRVlfUkVDT1JEIH0sCQkvKiByZWNvcmRpbmcgKi8KKwl7IDB4MWUzOCwgS0VZX1lFTExPVyB9LAkJLyogeWVsbG93IGtleSAqLworCXsgMHgxZTNiLCBLRVlfU0VMRUNUIH0sCQkvKiB0b3AgcmlnaHQgYnV0dG9uICovCisJeyAweDFlM2MsIEtFWV9aT09NIH0sCQkvKiBmdWxsICovCisJeyAweDFlM2QsIEtFWV9QT1dFUiB9LAkJLyogc3lzdGVtIHBvd2VyIChncmVlbiBidXR0b24pICovCit9OworCitzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfcmM1X2hhdXBwYXVnZV9uZXdfdGFibGUgPSB7CisJLnNjYW4gPSBpcl9jb2Rlc19yYzVfaGF1cHBhdWdlX25ldywKKwkuc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfcmM1X2hhdXBwYXVnZV9uZXcpLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3JjNV9oYXVwcGF1Z2VfbmV3X3RhYmxlKTsKKwogc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19ucGd0ZWNoW10gPSB7CiAJeyAweDFkLCBLRVlfU1dJVENIVklERU9NT0RFIH0sCS8qIHN3aXRjaCBpbnB1dHMgKi8KIAl7IDB4MmEsIEtFWV9GUk9OVCB9LApAQCAtMjk2NCw2ICszMDM1LDEwMSBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX2RtMTEwNV9uZWNfdGFibGUpOwogCitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX3RldmlpX25lY1tdID0geworCXsgMHgwYSwgS0VZX1BPV0VSMn0sCisJeyAweDBjLCBLRVlfTVVURX0sCisJeyAweDExLCBLRVlfMX0sCisJeyAweDEyLCBLRVlfMn0sCisJeyAweDEzLCBLRVlfM30sCisJeyAweDE0LCBLRVlfNH0sCisJeyAweDE1LCBLRVlfNX0sCisJeyAweDE2LCBLRVlfNn0sCisJeyAweDE3LCBLRVlfN30sCisJeyAweDE4LCBLRVlfOH0sCisJeyAweDE5LCBLRVlfOX0sCisJeyAweDEwLCBLRVlfMH0sCisJeyAweDFjLCBLRVlfTUVOVX0sCisJeyAweDBmLCBLRVlfVk9MVU1FRE9XTn0sCisJeyAweDFhLCBLRVlfTEFTVH0sCisJeyAweDBlLCBLRVlfT1BFTn0sCisJeyAweDA0LCBLRVlfUkVDT1JEfSwKKwl7IDB4MDksIEtFWV9WT0xVTUVVUH0sCisJeyAweDA4LCBLRVlfQ0hBTk5FTFVQfSwKKwl7IDB4MDcsIEtFWV9QVlJ9LAorCXsgMHgwYiwgS0VZX1RJTUV9LAorCXsgMHgwMiwgS0VZX1JJR0hUfSwKKwl7IDB4MDMsIEtFWV9MRUZUfSwKKwl7IDB4MDAsIEtFWV9VUH0sCisJeyAweDFmLCBLRVlfT0t9LAorCXsgMHgwMSwgS0VZX0RPV059LAorCXsgMHgwNSwgS0VZX1RVTkVSfSwKKwl7IDB4MDYsIEtFWV9DSEFOTkVMRE9XTn0sCisJeyAweDQwLCBLRVlfUExBWVBBVVNFfSwKKwl7IDB4MWUsIEtFWV9SRVdJTkR9LAorCXsgMHgxYiwgS0VZX0ZBVk9SSVRFU30sCisJeyAweDFkLCBLRVlfQkFDS30sCisJeyAweDRkLCBLRVlfRkFTVEZPUldBUkR9LAorCXsgMHg0NCwgS0VZX0VQR30sCisJeyAweDRjLCBLRVlfSU5GT30sCisJeyAweDQxLCBLRVlfQUJ9LAorCXsgMHg0MywgS0VZX0FVRElPfSwKKwl7IDB4NDUsIEtFWV9TVUJUSVRMRX0sCisJeyAweDRhLCBLRVlfTElTVH0sCisJeyAweDQ2LCBLRVlfRjF9LAorCXsgMHg0NywgS0VZX0YyfSwKKwl7IDB4NWUsIEtFWV9GM30sCisJeyAweDVjLCBLRVlfRjR9LAorCXsgMHg1MiwgS0VZX0Y1fSwKKwl7IDB4NWEsIEtFWV9GNn0sCisJeyAweDU2LCBLRVlfTU9ERX0sCisJeyAweDU4LCBLRVlfU1dJVENIVklERU9NT0RFfSwKK307CitzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfdGV2aWlfbmVjX3RhYmxlID0geworCS5zY2FuID0gaXJfY29kZXNfdGV2aWlfbmVjLAorCS5zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc190ZXZpaV9uZWMpLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3RldmlpX25lY190YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfdGJzX25lY1tdID0geworCXsgMHgwNCwgS0VZX1BPV0VSMn0sCS8qcG93ZXIqLworCXsgMHgxNCwgS0VZX01VVEV9LAkvKm11dGUqLworCXsgMHgwNywgS0VZXzF9LAorCXsgMHgwNiwgS0VZXzJ9LAorCXsgMHgwNSwgS0VZXzN9LAorCXsgMHgwYiwgS0VZXzR9LAorCXsgMHgwYSwgS0VZXzV9LAorCXsgMHgwOSwgS0VZXzZ9LAorCXsgMHgwZiwgS0VZXzd9LAorCXsgMHgwZSwgS0VZXzh9LAorCXsgMHgwZCwgS0VZXzl9LAorCXsgMHgxMiwgS0VZXzB9LAorCXsgMHgxNiwgS0VZX0NIQU5ORUxVUH0sCS8qY2grKi8KKwl7IDB4MTEsIEtFWV9DSEFOTkVMRE9XTn0sLypjaC0qLworCXsgMHgxMywgS0VZX1ZPTFVNRVVQfSwJLyp2b2wrKi8KKwl7IDB4MGMsIEtFWV9WT0xVTUVET1dOfSwvKnZvbC0qLworCXsgMHgwMywgS0VZX1JFQ09SRH0sCS8qcmVjKi8KKwl7IDB4MTgsIEtFWV9QQVVTRX0sCS8qcGF1c2UqLworCXsgMHgxOSwgS0VZX09LfSwJLypvayovCisJeyAweDFhLCBLRVlfQ0FNRVJBfSwJLyogc25hcHNob3QgKi8KKwl7IDB4MDEsIEtFWV9VUH0sCisJeyAweDEwLCBLRVlfTEVGVH0sCisJeyAweDAyLCBLRVlfUklHSFR9LAorCXsgMHgwOCwgS0VZX0RPV059LAorCXsgMHgxNSwgS0VZX0ZBVk9SSVRFU30sCisJeyAweDE3LCBLRVlfU1VCVElUTEV9LAorCXsgMHgxZCwgS0VZX1pPT019LAorCXsgMHgxZiwgS0VZX0VYSVR9LAorCXsgMHgxZSwgS0VZX01FTlV9LAorCXsgMHgxYywgS0VZX0VQR30sCisJeyAweDAwLCBLRVlfUFJFVklPVVN9LAorCXsgMHgxYiwgS0VZX01PREV9LAorfTsKK3N0cnVjdCBpcl9zY2FuY29kZV90YWJsZSBpcl9jb2Rlc190YnNfbmVjX3RhYmxlID0geworCS5zY2FuID0gaXJfY29kZXNfdGJzX25lYywKKwkuc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfdGJzX25lYyksCit9OworRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfdGJzX25lY190YWJsZSk7CisKIC8qIFRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFQgVVNCIFhTCiAgICBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGxpbnV4dHYub3JnPgogICovCkBAIC0zMTQ3LDMgKzMzMTMsNCBAQAogCS5zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc19nYWRtZWlfcm0wMDh6KSwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19nYWRtZWlfcm0wMDh6X3RhYmxlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5dGFibGUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleXRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjZTViYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleXRhYmxlLmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qIGlyLXJlZ2lzdGVyLmMgLSBoYW5kbGUgSVIgc2NhbmNvZGUtPmtleWNvZGUgdGFibGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KKworI2luY2x1ZGUgPG1lZGlhL2lyLWNvbW1vbi5oPgorCisjZGVmaW5lIElSX1RBQl9NSU5fU0laRQkzMgorI2RlZmluZSBJUl9UQUJfTUFYX1NJWkUJMTAyNAorCisvKioKKyAqIGlyX3NlZWtfdGFibGUoKSAtIHJldHVybnMgdGhlIGVsZW1lbnQgb3JkZXIgb24gdGhlIHRhYmxlCisgKiBAcmNfdGFiOgl0aGUgaXJfc2NhbmNvZGVfdGFibGUgd2l0aCB0aGUga2V5bWFwIHRvIGJlIHVzZWQKKyAqIEBzY2FuY29kZToJdGhlIHNjYW5jb2RlIHRoYXQgd2UncmUgc2Vla2luZworICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBpbnB1dCByb3V0aW5lcyB3aGVuIGEga2V5IGlzIHByZXNzZWQgYXQgdGhlCisgKiBJUi4gVGhlIHNjYW5jb2RlIGlzIHJlY2VpdmVkIGFuZCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgaW50byBhIGtleWNvZGUuCisgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgaXQgcmV0dXJucyBLRVlfVU5LTk9XTi4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZQorICogY29ycmVzcG9uZGluZyBrZXljb2RlIGZyb20gdGhlIHRhYmxlLgorICovCitzdGF0aWMgaW50IGlyX3NlZWtfdGFibGUoc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlICpyY190YWIsIHUzMiBzY2FuY29kZSkKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXJfc2NhbmNvZGUgKmtleW1hcCA9IHJjX3RhYi0+c2NhbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyY190YWItPmxvY2ssIGZsYWdzKTsKKworCS8qIEZJWE1FOiByZXBsYWNlIGl0IGJ5IGEgYmluYXJ5IHNlYXJjaCAqLworCisJZm9yIChyYyA9IDA7IHJjIDwgcmNfdGFiLT5zaXplOyByYysrKQorCQlpZiAoa2V5bWFwW3JjXS5zY2FuY29kZSA9PSBzY2FuY29kZSkKKwkJCWdvdG8gZXhpdDsKKworCS8qIE5vdCBmb3VuZCAqLworCXJjID0gLUVJTlZBTDsKKworZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY190YWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXJfcm91bmR1cF90YWJsZXNpemUoKSAtIGdldHMgYW4gb3B0aW11bSB2YWx1ZSBmb3IgdGhlIHRhYmxlIHNpemUKKyAqIEBuX2VsZW1zOgkJbWluaW11bSBudW1iZXIgb2YgZW50cmllcyB0byBzdG9yZSBrZXljb2RlcworICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNob29zZSB0aGUga2V5Y29kZSB0YWJsZSBzaXplLgorICoKKyAqIEluIG9yZGVyIHRvIGhhdmUgc29tZSBlbXB0eSBzcGFjZSBmb3IgbmV3IGtleWNvZGVzLAorICogYW5kIGtub3dpbmcgaW4gYWR2YW5jZSB0aGF0IGttYWxsb2MgYWxsb2NhdGVzIG9ubHkgcG93ZXIgb2YgdHdvCisgKiBzZWdtZW50cywgaXQgb3B0aW1pemVzIHRoZSBhbGxvY2F0ZWQgc3BhY2UgdG8gaGF2ZSBzb21lIHNwYXJlIHNwYWNlCisgKiBmb3IgdGhvc2UgbmV3IGtleWNvZGVzIGJ5IHVzaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQKKyAqIHdpbGwgYmUgZWZmZWN0aXZlbHkgYmUgYWxsb2NhdGVkIGJ5IGttYWxsb2MuCisgKiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIHF1YW50aXR5IG9mIHRhYmxlIHJlc2l6ZXMsIGl0IGhhcyBhIG1pbmltdW0KKyAqIHRhYmxlIHNpemUgb2YgSVJfVEFCX01JTl9TSVpFLgorICovCitpbnQgaXJfcm91bmR1cF90YWJsZXNpemUoaW50IG5fZWxlbXMpCit7CisJc2l6ZV90IHNpemU7CisKKwlpZiAobl9lbGVtcyA8IElSX1RBQl9NSU5fU0laRSkKKwkJbl9lbGVtcyA9IElSX1RBQl9NSU5fU0laRTsKKworCS8qCisJICogQXMga21hbGxvYyBvbmx5IGFsbG9jYXRlcyBzaXplcyBvZiBwb3dlciBvZiB0d28sIGdldCBhcworCSAqIG11Y2ggZW50cmllcyBhcyBwb3NzaWJsZSBmb3IgdGhlIGFsbG9jYXRlZCBtZW1vcnkgc2VnbWVudAorCSAqLworCXNpemUgPSByb3VuZHVwX3Bvd19vZl90d28obl9lbGVtcyAqIHNpemVvZihzdHJ1Y3QgaXJfc2NhbmNvZGUpKTsKKwluX2VsZW1zID0gc2l6ZSAvIHNpemVvZihzdHJ1Y3QgaXJfc2NhbmNvZGUpOworCisJcmV0dXJuIG5fZWxlbXM7Cit9CisKKy8qKgorICogaXJfY29weV90YWJsZSgpIC0gY29waWVzIGEga2V5dGFibGUsIGRpc2NhcmRpbmcgdGhlIHVudXNlZCBlbnRyaWVzCisgKiBAZGVzdGluOglkZXN0aW4gdGFibGUKKyAqIEBvcmlnaW46CW9yaWdpbiB0YWJsZQorICoKKyAqIENvcGllcyBhbGwgZW50cmllcyB3aGVyZSB0aGUga2V5Y29kZSBpcyBub3QgS0VZX1VOS05PV04vS0VZX1JFU0VSVkVECisgKi8KKworaW50IGlyX2NvcHlfdGFibGUoc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlICpkZXN0aW4sCisJCSBjb25zdCBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgKm9yaWdpbikKK3sKKwlpbnQgaSwgaiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3JpZ2luLT5zaXplOyBpKyspIHsKKwkJaWYgKG9yaWdpbi0+c2NhbltpXS5rZXljb2RlID09IEtFWV9VTktOT1dOIHx8CisJCSAgIG9yaWdpbi0+c2NhbltpXS5rZXljb2RlID09IEtFWV9SRVNFUlZFRCkKKwkJCWNvbnRpbnVlOworCisJCW1lbWNweSgmZGVzdGluLT5zY2FuW2pdLCAmb3JpZ2luLT5zY2FuW2ldLCBzaXplb2Yoc3RydWN0IGlyX3NjYW5jb2RlKSk7CisJCWorKzsKKwl9CisJZGVzdGluLT5zaXplID0gajsKKworCUlSX2RwcmludGsoMSwgIkNvcGllZCAlZCBzY2FuY29kZXMgdG8gdGhlIG5ldyBrZXljb2RlIHRhYmxlXG4iLCBkZXN0aW4tPnNpemUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXJfZ2V0a2V5Y29kZSgpIC0gZ2V0IGEga2V5Y29kZSBhdCB0aGUgZXZkZXYgc2NhbmNvZGUgLT5rZXljb2RlIHRhYmxlCisgKiBAZGV2Ogl0aGUgc3RydWN0IGlucHV0X2RldiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNjYW5jb2RlOgl0aGUgZGVzaXJlZCBzY2FuY29kZQorICogQGtleWNvZGU6CXRoZSBrZXljb2RlIHRvIGJlIHJldG9ybmVkLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGhhbmRsZSBldmRldiBFVklPQ0dLRVkgaW9jdGwuCisgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyAtRUlOVkFMLCBvdGhlcndpc2UsIHJldHVybnMgMC4KKyAqLworc3RhdGljIGludCBpcl9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCSBpbnQgc2NhbmNvZGUsIGludCAqa2V5Y29kZSkKK3sKKwlpbnQgZWxlbTsKKwlzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgKnJjX3RhYiA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwllbGVtID0gaXJfc2Vla190YWJsZShyY190YWIsIHNjYW5jb2RlKTsKKwlpZiAoZWxlbSA+PSAwKSB7CisJCSprZXljb2RlID0gcmNfdGFiLT5zY2FuW2VsZW1dLmtleWNvZGU7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogU2NhbmNvZGUgbm90IGZvdW5kIGFuZCB0YWJsZSBjYW4ndCBiZSBleHBhbmRlZAorCSAqLworCWlmIChlbGVtIDwgMCAmJiByY190YWItPnNpemUgPT0gSVJfVEFCX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogSWYgaXMgdGhlcmUgZXh0cmEgc3BhY2UsIHJldHVybnMgS0VZX1JFU0VSVkVELAorCSAqIG90aGVyd2lzZSwgaW5wdXQgY29yZSB3b24ndCBsZXQgaXJfc2V0a2V5Y29kZSB0byB3b3JrCisJICovCisJKmtleWNvZGUgPSBLRVlfUkVTRVJWRUQ7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBpcl9pc19yZXNpemVfbmVlZGVkKCkgLSBDaGVjayBpZiB0aGUgdGFibGUgbmVlZHMgcmV6aXNlCisgKiBAdGFibGU6CQlrZXljb2RlIHRhYmxlIHRoYXQgbWF5IG5lZWQgdG8gcmVzaXplCisgKiBAbl9lbGVtczoJCW1pbmltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gc3RvcmUga2V5Y29kZXMKKyAqCisgKiBDb25zaWRlcmluZyB0aGF0IGttYWxsb2MgdXNlcyBwb3dlciBvZiB0d28gc3RvcmFnZSBhcmVhcywgdGhpcworICogcm91dGluZSBkZXRlY3RzIGlmIHRoZSByZWFsIGFsbG9jZWQgc2l6ZSB3aWxsIGNoYW5nZS4gSWYgbm90LCBpdAorICoganVzdCByZXR1cm5zIHdpdGhvdXQgZG9pbmcgbm90aGluZy4gT3RoZXJ3aXNlLCBpdCB3aWxsIGV4dGVuZCBvcgorICogcmVkdWNlIHRoZSB0YWJsZSBzaXplIHRvIG1lZXQgdGhlIG5ldyBuZWVkcy4KKyAqCisgKiBJdCByZXR1cm5zIDAgaWYgbm8gcmVzaXplIGlzIG5lZWRlZCwgMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgaXJfaXNfcmVzaXplX25lZWRlZChzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgKnRhYmxlLCBpbnQgbl9lbGVtcykKK3sKKwlpbnQgY3VyX3NpemUgPSBpcl9yb3VuZHVwX3RhYmxlc2l6ZSh0YWJsZS0+c2l6ZSk7CisJaW50IG5ld19zaXplID0gaXJfcm91bmR1cF90YWJsZXNpemUobl9lbGVtcyk7CisKKwlpZiAoY3VyX3NpemUgPT0gbmV3X3NpemUpCisJCXJldHVybiAwOworCisJLyogUmVzaXplIGlzIG5lZWRlZCAqLworCXJldHVybiAxOworfQorCisvKioKKyAqIGlyX2RlbGV0ZV9rZXkoKSAtIHJlbW92ZSBhIGtleWNvZGUgZnJvbSB0aGUgdGFibGUKKyAqIEByY190YWI6CQlrZXljb2RlIHRhYmxlCisgKiBAZWxlbToJCWVsZW1lbnQgdG8gYmUgcmVtb3ZlZAorICoKKyAqLworc3RhdGljIHZvaWQgaXJfZGVsZXRlX2tleShzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgKnJjX3RhYiwgaW50IGVsZW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IG5ld3NpemUgPSByY190YWItPnNpemUgLSAxOworCWludCByZXNpemUgPSBpcl9pc19yZXNpemVfbmVlZGVkKHJjX3RhYiwgbmV3c2l6ZSk7CisJc3RydWN0IGlyX3NjYW5jb2RlICpvbGRrZXltYXAgPSByY190YWItPnNjYW47CisJc3RydWN0IGlyX3NjYW5jb2RlICpuZXdrZXltYXA7CisKKwlpZiAocmVzaXplKSB7CisJCW5ld2tleW1hcCA9IGt6YWxsb2MoaXJfcm91bmR1cF90YWJsZXNpemUobmV3c2l6ZSkgKgorCQkJCSAgICBzaXplb2YoKm5ld2tleW1hcCksIEdGUF9BVE9NSUMpOworCisJCS8qIFRoZXJlJ3Mgbm8gbWVtb3J5IGZvciByZXNpemUuIEtlZXAgdGhlIG9sZCB0YWJsZSAqLworCQlpZiAoIW5ld2tleW1hcCkKKwkJCXJlc2l6ZSA9IDA7CisJfQorCisJaWYgKCFyZXNpemUpIHsKKwkJbmV3a2V5bWFwID0gb2xka2V5bWFwOworCisJCS8qIFdlJ2xsIG1vZGlmeSB0aGUgbGl2ZSB0YWJsZS4gTG9jayBpdCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmNfdGFiLT5sb2NrLCBmbGFncyk7CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBlbGVtZW50cyBiZWZvcmUgdGhlIG9uZSB0aGF0IHdpbGwgYmUgZGVsZXRlZAorCSAqIGlmICghcmVzaXplKSwgYm90aCBvbGRrZXltYXAgYW5kIG5ld2tleW1hcCBwb2ludHMKKwkgKiB0byB0aGUgc2FtZSBwbGFjZSwgc28sIHRoZXJlJ3Mgbm8gbmVlZCB0byBjb3B5CisJICovCisJaWYgKHJlc2l6ZSAmJiBlbGVtID4gMCkKKwkJbWVtY3B5KG5ld2tleW1hcCwgb2xka2V5bWFwLAorCQkgICAgICAgZWxlbSAqIHNpemVvZigqbmV3a2V5bWFwKSk7CisKKwkvKgorCSAqIENvcHkgdGhlIG90aGVyIGVsZW1lbnRzIG92ZXJ3cml0aW5nIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWQKKwkgKiBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIHRvIGJvdGggcmVzaXplIGFuZCBub24tcmVzaXplIGNhc2UKKwkgKi8KKwlpZiAoZWxlbSA8IG5ld3NpemUpCisJCW1lbWNweSgmbmV3a2V5bWFwW2VsZW1dLCAmb2xka2V5bWFwW2VsZW0gKyAxXSwKKwkJICAgICAgIChuZXdzaXplIC0gZWxlbSkgKiBzaXplb2YoKm5ld2tleW1hcCkpOworCisJaWYgKHJlc2l6ZSkgeworCQkvKgorCQkgKiBBcyB0aGUgY29weSBoYXBwZW5lZCB0byBhIHRlbXBvcmFyeSB0YWJsZSwgb25seSBoZXJlCisJCSAqIGl0IG5lZWRzIHRvIGxvY2sgd2hpbGUgcmVwbGFjaW5nIHRoZSB0YWJsZSBwb2ludGVycworCQkgKiB0byB1c2UgdGhlIG5ldyB0YWJsZQorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJjX3RhYi0+bG9jaywgZmxhZ3MpOworCQlyY190YWItPnNpemUgPSBuZXdzaXplOworCQlyY190YWItPnNjYW4gPSBuZXdrZXltYXA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjX3RhYi0+bG9jaywgZmxhZ3MpOworCisJCS8qIEZyZWVzIHRoZSBvbGQga2V5dGFibGUgKi8KKwkJa2ZyZWUob2xka2V5bWFwKTsKKwl9IGVsc2UgeworCQlyY190YWItPnNpemUgPSBuZXdzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY190YWItPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qKgorICogaXJfaW5zZXJ0X2tleSgpIC0gaW5zZXJ0IGEga2V5Y29kZSBhdCB0aGUgdGFibGUKKyAqIEByY190YWI6CQlrZXljb2RlIHRhYmxlCisgKiBAc2NhbmNvZGU6CXRoZSBkZXNpcmVkIHNjYW5jb2RlCisgKiBAa2V5Y29kZToJdGhlIGtleWNvZGUgdG8gYmUgcmV0b3JuZWQuCisgKgorICovCitzdGF0aWMgaW50IGlyX2luc2VydF9rZXkoc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlICpyY190YWIsCisJCQkgIGludCBzY2FuY29kZSwgaW50IGtleWNvZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZWxlbSA9IHJjX3RhYi0+c2l6ZTsKKwlpbnQgbmV3c2l6ZSA9IHJjX3RhYi0+c2l6ZSArIDE7CisJaW50IHJlc2l6ZSA9IGlyX2lzX3Jlc2l6ZV9uZWVkZWQocmNfdGFiLCBuZXdzaXplKTsKKwlzdHJ1Y3QgaXJfc2NhbmNvZGUgKm9sZGtleW1hcCA9IHJjX3RhYi0+c2NhbjsKKwlzdHJ1Y3QgaXJfc2NhbmNvZGUgKm5ld2tleW1hcDsKKworCWlmIChyZXNpemUpIHsKKwkJbmV3a2V5bWFwID0ga3phbGxvYyhpcl9yb3VuZHVwX3RhYmxlc2l6ZShuZXdzaXplKSAqCisJCQkJICAgIHNpemVvZigqbmV3a2V5bWFwKSwgR0ZQX0FUT01JQyk7CisJCWlmICghbmV3a2V5bWFwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtY3B5KG5ld2tleW1hcCwgb2xka2V5bWFwLAorCQkgICAgICAgcmNfdGFiLT5zaXplICogc2l6ZW9mKCpuZXdrZXltYXApKTsKKwl9IGVsc2UKKwkJbmV3a2V5bWFwICA9IG9sZGtleW1hcDsKKworCS8qIFN0b3JlcyB0aGUgbmV3IGNvZGUgYXQgdGhlIHRhYmxlICovCisJSVJfZHByaW50aygxLCAiIyVkOiBOZXcgc2NhbiAweCUwNHggd2l0aCBrZXkgMHglMDR4XG4iLAorCQkgICByY190YWItPnNpemUsIHNjYW5jb2RlLCBrZXljb2RlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyY190YWItPmxvY2ssIGZsYWdzKTsKKwlyY190YWItPnNpemUgPSBuZXdzaXplOworCWlmIChyZXNpemUpIHsKKwkJcmNfdGFiLT5zY2FuID0gbmV3a2V5bWFwOworCQlrZnJlZShvbGRrZXltYXApOworCX0KKwluZXdrZXltYXBbZWxlbV0uc2NhbmNvZGUgPSBzY2FuY29kZTsKKwluZXdrZXltYXBbZWxlbV0ua2V5Y29kZSAgPSBrZXljb2RlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjX3RhYi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXJfc2V0a2V5Y29kZSgpIC0gc2V0IGEga2V5Y29kZSBhdCB0aGUgZXZkZXYgc2NhbmNvZGUgLT5rZXljb2RlIHRhYmxlCisgKiBAZGV2Ogl0aGUgc3RydWN0IGlucHV0X2RldiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNjYW5jb2RlOgl0aGUgZGVzaXJlZCBzY2FuY29kZQorICogQGtleWNvZGU6CXRoZSBrZXljb2RlIHRvIGJlIHJldG9ybmVkLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGhhbmRsZSBldmRldiBFVklPQ1NLRVkgaW9jdGwuCisgKiBUaGVyZSdzIG9uZSBjYXZlYXQgaGVyZTogaG93IGNhbiB3ZSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgdGFibGU/CisgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyAtRUlOVkFMLCBvdGhlcndpc2UsIHJldHVybnMgMC4KKyAqLworc3RhdGljIGludCBpcl9zZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCSBpbnQgc2NhbmNvZGUsIGludCBrZXljb2RlKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlICpyY190YWIgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpcl9zY2FuY29kZSAqa2V5bWFwID0gcmNfdGFiLT5zY2FuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIEhhbmRsZSBrZXljb2RlIHRhYmxlIGRlbGV0aW9ucworCSAqCisJICogSWYgdXNlcnNwYWNlIGlzIGFkZGluZyBhIEtFWV9VTktOT1dOIG9yIEtFWV9SRVNFUlZFRCwKKwkgKiBkZWFsIGFzIGEgdHJpYWwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIHNjYW5jb2RlIGF0dHJpYnV0aW9uCisJICogaWYgdGFibGUgYmVjb21lIHRvbyBiaWcsIHJlZHVjZSBpdCB0byBzYXZlIHNwYWNlCisJICovCisJaWYgKGtleWNvZGUgPT0gS0VZX1VOS05PV04gfHwga2V5Y29kZSA9PSBLRVlfUkVTRVJWRUQpIHsKKwkJcmMgPSBpcl9zZWVrX3RhYmxlKHJjX3RhYiwgc2NhbmNvZGUpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIDA7CisKKwkJSVJfZHByaW50aygxLCAiIyVkOiBEZWxldGluZyBzY2FuIDB4JTA0eFxuIiwgcmMsIHNjYW5jb2RlKTsKKwkJY2xlYXJfYml0KGtleW1hcFtyY10ua2V5Y29kZSwgZGV2LT5rZXliaXQpOworCQlpcl9kZWxldGVfa2V5KHJjX3RhYiwgcmMpOworCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSGFuZGxlIGtleWNvZGUgcmVwbGFjZW1lbnRzCisJICoKKwkgKiBJZiB0aGUgc2NhbmNvZGUgZXhpc3RzLCBqdXN0IHJlcGxhY2UgYnkgdGhlIG5ldyB2YWx1ZQorCSAqLworCXJjID0gaXJfc2Vla190YWJsZShyY190YWIsIHNjYW5jb2RlKTsKKwlpZiAocmMgPj0gMCkgeworCQlJUl9kcHJpbnRrKDEsICIjJWQ6IFJlcGxhY2luZyBzY2FuIDB4JTA0eCB3aXRoIGtleSAweCUwNHhcbiIsCisJCQlyYywgc2NhbmNvZGUsIGtleWNvZGUpOworCisJCWNsZWFyX2JpdChrZXltYXBbcmNdLmtleWNvZGUsIGRldi0+a2V5Yml0KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmNfdGFiLT5sb2NrLCBmbGFncyk7CisJCWtleW1hcFtyY10ua2V5Y29kZSA9IGtleWNvZGU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjX3RhYi0+bG9jaywgZmxhZ3MpOworCisJCXNldF9iaXQoa2V5Y29kZSwgZGV2LT5rZXliaXQpOworCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSGFuZGxlIG5ldyBzY2FuY29kZSBpbnNlcnRzCisJICoKKwkgKiByZWFsbG9jYXRlIHRhYmxlIGlmIG5lZWRlZCBhbmQgaW5zZXJ0IGEgbmV3IGtleWNvZGUKKwkgKi8KKworCS8qIEF2b2lkIGdyb3dpbmcgdGhlIHRhYmxlIGluZGVmaW5pdGVseSAqLworCWlmIChyY190YWItPnNpemUgKyAxID4gSVJfVEFCX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gaXJfaW5zZXJ0X2tleShyY190YWIsIHNjYW5jb2RlLCBrZXljb2RlKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJc2V0X2JpdChrZXljb2RlLCBkZXYtPmtleWJpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcl9nX2tleWNvZGVfZnJvbV90YWJsZSgpIC0gZ2V0cyB0aGUga2V5Y29kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2NhbmNvZGUKKyAqIEBpbnB1dF9kZXY6CXRoZSBzdHJ1Y3QgaW5wdXRfZGV2IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZQorICogQHNjYW5jb2RlOgl0aGUgc2NhbmNvZGUgdGhhdCB3ZSdyZSBzZWVraW5nCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGlucHV0IHJvdXRpbmVzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBhdCB0aGUKKyAqIElSLiBUaGUgc2NhbmNvZGUgaXMgcmVjZWl2ZWQgYW5kIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGEga2V5Y29kZS4KKyAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCBpdCByZXR1cm5zIEtFWV9VTktOT1dOLiBPdGhlcndpc2UsIHJldHVybnMgdGhlCisgKiBjb3JyZXNwb25kaW5nIGtleWNvZGUgZnJvbSB0aGUgdGFibGUuCisgKi8KK3UzMiBpcl9nX2tleWNvZGVfZnJvbV90YWJsZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHUzMiBzY2FuY29kZSkKK3sKKwlzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgKnJjX3RhYiA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlyX3NjYW5jb2RlICprZXltYXAgPSByY190YWItPnNjYW47CisJaW50IGVsZW07CisKKwllbGVtID0gaXJfc2Vla190YWJsZShyY190YWIsIHNjYW5jb2RlKTsKKwlpZiAoZWxlbSA+PSAwKSB7CisJCUlSX2RwcmludGsoMSwgIiVzOiBzY2FuY29kZSAweCUwNHgga2V5Y29kZSAweCUwMnhcbiIsCisJCQkgICBkZXYtPm5hbWUsIHNjYW5jb2RlLCBrZXltYXBbZWxlbV0ua2V5Y29kZSk7CisKKwkJcmV0dXJuIHJjX3RhYi0+c2NhbltlbGVtXS5rZXljb2RlOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmtub3duIGtleSBmb3Igc2NhbmNvZGUgMHglMDR4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHNjYW5jb2RlKTsKKworCS8qIFJlcG9ydHMgdXNlcnNwYWNlIHRoYXQgYW4gdW5rbm93biBrZXljb2RlIHdlcmUgZ290ICovCisJcmV0dXJuIEtFWV9SRVNFUlZFRDsKK30KKworLyoqCisgKiBpcl9zZXRfa2V5Y29kZV90YWJsZSgpIC0gc2V0cyB0aGUgSVIga2V5Y29kZSB0YWJsZSBhbmQgYWRkIHRoZSBoYW5kbGVycworICoJCQkgICAgZm9yIGtleW1hcCB0YWJsZSBnZXQvc2V0CisgKiBAaW5wdXRfZGV2Ogl0aGUgc3RydWN0IGlucHV0X2RldiBkZXNjcmlwdG9yIG9mIHRoZSBkZXZpY2UKKyAqIEByY190YWI6CXRoZSBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgdGFibGUgb2Ygc2NhbmNvZGUva2V5bWFwCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgaW5wdXQgaW5mcmFzdHJ1Y3R1cmUgdG8gd29yayB3aXRoCisgKiBhbiBJUi4KKyAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBJUiBkZXZpY2UuCisgKi8KK2ludCBpcl9zZXRfa2V5Y29kZV90YWJsZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsCisJCQkgc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlICpyY190YWIpCit7CisJc3RydWN0IGlyX3NjYW5jb2RlICprZXltYXAgPSByY190YWItPnNjYW47CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmcmNfdGFiLT5sb2NrKTsKKworCWlmIChyY190YWItPnNjYW4gPT0gTlVMTCB8fCAhcmNfdGFiLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNldCB0aGUgYml0cyBmb3IgdGhlIGtleXMgKi8KKwlJUl9kcHJpbnRrKDEsICJrZXkgbWFwIHNpemU6ICVkXG4iLCByY190YWItPnNpemUpOworCWZvciAoaSA9IDA7IGkgPCByY190YWItPnNpemU7IGkrKykgeworCQlJUl9kcHJpbnRrKDEsICIjJWQ6IHNldHRpbmcgYml0IGZvciBrZXljb2RlIDB4JTA0eFxuIiwKKwkJCWksIGtleW1hcFtpXS5rZXljb2RlKTsKKwkJc2V0X2JpdChrZXltYXBbaV0ua2V5Y29kZSwgaW5wdXRfZGV2LT5rZXliaXQpOworCX0KKworCWlucHV0X2Rldi0+Z2V0a2V5Y29kZSA9IGlyX2dldGtleWNvZGU7CisJaW5wdXRfZGV2LT5zZXRrZXljb2RlID0gaXJfc2V0a2V5Y29kZTsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIHJjX3RhYik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpcl9pbnB1dF9mcmVlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgKnJjX3RhYiA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwlJUl9kcHJpbnRrKDEsICJGcmVlZCBrZXljb2RlIHRhYmxlXG4iKTsKKworCXJjX3RhYi0+c2l6ZSA9IDA7CisJa2ZyZWUocmNfdGFiLT5zY2FuKTsKKwlyY190YWItPnNjYW4gPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJfaW5wdXRfZnJlZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jCmluZGV4IDdlOGY1NjguLjQ4Y2IxNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYwpAQCAtOTgsNyArOTgsNyBAQAogCiAJCW9wX2NvdW50Kys7CiAKLQkJLyogbG9vcCB0aHJvZ2ggYWxsIGJ5dGVzIG9mIG1lc3NhZ2UgaSAqLworCQkvKiBsb29wIHRocm91Z2ggYWxsIGJ5dGVzIG9mIG1lc3NhZ2UgaSAqLwogCQlmb3IoaiA9IDA7IGogPCBtW2ldLmxlbjsgaisrKSB7CiAJCQkvKiB3cml0ZSBiYWNrIGFsbCBieXRlcyB0aGF0IGNvdWxkIGhhdmUgYmVlbiByZWFkICovCiAJCQltW2ldLmJ1ZltqXSA9IChsZTMyX3RvX2NwdShvcFtvcF9jb3VudC8zXSkgPj4gKCgzLShvcF9jb3VudCUzKSkqOCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCmluZGV4IDU1MmRhYjQuLmJlY2JhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKQEAgLTEyMDUsNiArMTIwNSwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCByZWxlYXNlX2FsbF9wYWdldGFibGVzKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZikKK3sKKwlzYWE3MTQ2X3BndGFibGVfZnJlZShkZXYtPnBjaSwgJmJ1Zi0+cHRbMF0pOworCXNhYTcxNDZfcGd0YWJsZV9mcmVlKGRldi0+cGNpLCAmYnVmLT5wdFsxXSk7CisJc2FhNzE0Nl9wZ3RhYmxlX2ZyZWUoZGV2LT5wY2ksICZidWYtPnB0WzJdKTsKK30KKwogc3RhdGljIGludCBidWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCiAJCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLCBlbnVtIHY0bDJfZmllbGQgZmllbGQpCiB7CkBAIC0xMjU3LDE2ICsxMjY0LDEyIEBACiAKIAkJc2ZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZGV2LGJ1Zi0+Zm10LT5waXhlbGZvcm1hdCk7CiAKKwkJcmVsZWFzZV9hbGxfcGFnZXRhYmxlcyhkZXYsIGJ1Zik7CiAJCWlmKCAwICE9IElTX1BMQU5BUihzZm10LT50cmFucykpIHsKLQkJCXNhYTcxNDZfcGd0YWJsZV9mcmVlKGRldi0+cGNpLCAmYnVmLT5wdFswXSk7Ci0JCQlzYWE3MTQ2X3BndGFibGVfZnJlZShkZXYtPnBjaSwgJmJ1Zi0+cHRbMV0pOwotCQkJc2FhNzE0Nl9wZ3RhYmxlX2ZyZWUoZGV2LT5wY2ksICZidWYtPnB0WzJdKTsKLQogCQkJc2FhNzE0Nl9wZ3RhYmxlX2FsbG9jKGRldi0+cGNpLCAmYnVmLT5wdFswXSk7CiAJCQlzYWE3MTQ2X3BndGFibGVfYWxsb2MoZGV2LT5wY2ksICZidWYtPnB0WzFdKTsKIAkJCXNhYTcxNDZfcGd0YWJsZV9hbGxvYyhkZXYtPnBjaSwgJmJ1Zi0+cHRbMl0pOwogCQl9IGVsc2UgewotCQkJc2FhNzE0Nl9wZ3RhYmxlX2ZyZWUoZGV2LT5wY2ksICZidWYtPnB0WzBdKTsKIAkJCXNhYTcxNDZfcGd0YWJsZV9hbGxvYyhkZXYtPnBjaSwgJmJ1Zi0+cHRbMF0pOwogCQl9CiAKQEAgLTEzMjksNiArMTMzMiw5IEBACiAJc3RydWN0IHNhYTcxNDZfYnVmICpidWYgPSAoc3RydWN0IHNhYTcxNDZfYnVmICopdmI7CiAKIAlERUJfQ0FQKCgidmJ1ZjolcFxuIix2YikpOworCisJcmVsZWFzZV9hbGxfcGFnZXRhYmxlcyhkZXYsIGJ1Zik7CisKIAlzYWE3MTQ2X2RtYV9mcmVlKGRldixxLGJ1Zik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL0tjb25maWcKaW5kZXggNjA3ZDMxOS4uNDA5YTQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL0tjb25maWcKQEAgLTE3Miw0ICsxNzIsMTEgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEZyZWVzY2FsZSBNQzQ0UzgwMyBiYXNlZCB0dW5lcnMKIAorY29uZmlnIE1FRElBX1RVTkVSX01BWDIxNjUKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMjE2NSBzaWxpY29uIHR1bmVyIgorCWRlcGVuZHMgb24gVklERU9fTUVESUEgJiYgSTJDCisJZGVmYXVsdCBtIGlmIE1FRElBX1RVTkVSX0NVU1RPTUlTRQorCWhlbHAKKwkgIEEgZHJpdmVyIGZvciB0aGUgc2lsaWNvbiB0dW5lciBNQVgyMTY1IGZyb20gTWF4aW0uCisKIGVuZGlmICMgTUVESUFfVFVORVJfQ1VTVE9NSVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUKaW5kZXggNDEzMmIyYi4uYTU0Mzg1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZQpAQCAtMjMsNiArMjMsNyBAQAogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX01YTDUwMDVTKSArPSBteGw1MDA1cy5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfTVhMNTAwN1QpICs9IG14bDUwMDd0Lm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9NQzQ0UzgwMykgKz0gbWM0NHM4MDMubworb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX01BWDIxNjUpICs9IG1heDIxNjUubwogCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbWF4MjE2NS5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL21heDIxNjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDAzNjQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL21heDIxNjUuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqICBEcml2ZXIgZm9yIE1heGltIE1BWDIxNjUgc2lsaWNvbiB0dW5lcgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgRGF2aWQgVC4gTC4gV29uZyA8ZGF2aWR0bHdvbmdAZ21haWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKworI2luY2x1ZGUgIm1heDIxNjUuaCIKKyNpbmNsdWRlICJtYXgyMTY1X3ByaXYuaCIKKyNpbmNsdWRlICJ0dW5lci1pMmMuaCIKKworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnKSBcCisJCQlwcmludGsoS0VSTl9ERUJVRyAibWF4MjE2NTogIiBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CisKK3N0YXRpYyBpbnQgbWF4MjE2NV93cml0ZV9yZWcoc3RydWN0IG1heDIxNjVfcHJpdiAqcHJpdiwgdTggcmVnLCB1OCBkYXRhKQoreworCWludCByZXQ7CisJdTggYnVmW10gPSB7IHJlZywgZGF0YSB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKKworCW1zZy5hZGRyID0gcHJpdi0+Y29uZmlnLT5pMmNfYWRkcmVzczsKKworCWlmIChkZWJ1ZyA+PSAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlZz0weCUwMlgsIGRhdGE9MHglMDJYXG4iLAorCQkJX19mdW5jX18sIHJlZywgZGF0YSk7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnLCAxKTsKKworCWlmIChyZXQgIT0gMSkKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogZXJyb3IgcmVnPTB4JXgsIGRhdGE9MHgleCwgcmV0PSVpXG4iLAorCQkJX19mdW5jX18sIHJlZywgZGF0YSwgcmV0KTsKKworCXJldHVybiAocmV0ICE9IDEpID8gLUVJTyA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9yZWFkX3JlZyhzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2LCB1OCByZWcsIHU4ICpwX2RhdGEpCit7CisJaW50IHJldDsKKwl1OCBkZXZfYWRkciA9IHByaXYtPmNvbmZpZy0+aTJjX2FkZHJlc3M7CisKKwl1OCBiMFtdID0geyByZWcgfTsKKwl1OCBiMVtdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsgLmFkZHIgPSBkZXZfYWRkciwgLmZsYWdzID0gMCwgLmJ1ZiA9IGIwLCAubGVuID0gMSB9LAorCQl7IC5hZGRyID0gZGV2X2FkZHIsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH0sCisJfTsKKworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsIG1zZywgMik7CisJaWYgKHJldCAhPSAyKSB7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVycm9yIHJlZz0weCV4LCByZXQ9JWlcbiIsCisJCQlfX2Z1bmNfXywgcmVnLCByZXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkqcF9kYXRhID0gYjFbMF07CisJaWYgKGRlYnVnID49IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVnPTB4JTAyWCwgZGF0YT0weCUwMlhcbiIsCisJCQlfX2Z1bmNfXywgcmVnLCBiMVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9tYXNrX3dyaXRlX3JlZyhzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2LCB1OCByZWcsCisJdTggbWFzaywgdTggZGF0YSkKK3sKKwlpbnQgcmV0OworCXU4IHY7CisKKwlkYXRhICY9IG1hc2s7CisJcmV0ID0gbWF4MjE2NV9yZWFkX3JlZyhwcml2LCByZWcsICZ2KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJdiAmPSB+bWFzazsKKwl2IHw9IGRhdGE7CisJcmV0ID0gbWF4MjE2NV93cml0ZV9yZWcocHJpdiwgcmVnLCB2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9yZWFkX3JvbV90YWJsZShzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2KQoreworCXU4IGRhdFszXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJbWF4MjE2NV93cml0ZV9yZWcocHJpdiwgUkVHX1JPTV9UQUJMRV9BRERSLCBpICsgMSk7CisJCW1heDIxNjVfcmVhZF9yZWcocHJpdiwgUkVHX1JPTV9UQUJMRV9EQVRBLCAmZGF0W2ldKTsKKwl9CisKKwlwcml2LT50Zl9udGNoX2xvd19jZmcgPSBkYXRbMF0gPj4gNDsKKwlwcml2LT50Zl9udGNoX2hpX2NmZyA9IGRhdFswXSAmIDB4MEY7CisJcHJpdi0+dGZfYmFsdW5fbG93X3JlZiA9IGRhdFsxXSAmIDB4MEY7CisJcHJpdi0+dGZfYmFsdW5faGlfcmVmID0gZGF0WzFdID4+IDQ7CisJcHJpdi0+YmJfZmlsdGVyXzdtaHpfY2ZnID0gZGF0WzJdICYgMHgwRjsKKwlwcml2LT5iYl9maWx0ZXJfOG1oel9jZmcgPSBkYXRbMl0gPj4gNDsKKworCWRwcmludGsoInRmX250Y2hfbG93X2NmZyA9IDB4JVhcbiIsIHByaXYtPnRmX250Y2hfbG93X2NmZyk7CisJZHByaW50aygidGZfbnRjaF9oaV9jZmcgPSAweCVYXG4iLCBwcml2LT50Zl9udGNoX2hpX2NmZyk7CisJZHByaW50aygidGZfYmFsdW5fbG93X3JlZiA9IDB4JVhcbiIsIHByaXYtPnRmX2JhbHVuX2xvd19yZWYpOworCWRwcmludGsoInRmX2JhbHVuX2hpX3JlZiA9IDB4JVhcbiIsIHByaXYtPnRmX2JhbHVuX2hpX3JlZik7CisJZHByaW50aygiYmJfZmlsdGVyXzdtaHpfY2ZnID0gMHglWFxuIiwgcHJpdi0+YmJfZmlsdGVyXzdtaHpfY2ZnKTsKKwlkcHJpbnRrKCJiYl9maWx0ZXJfOG1oel9jZmcgPSAweCVYXG4iLCBwcml2LT5iYl9maWx0ZXJfOG1oel9jZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9zZXRfb3NjKHN0cnVjdCBtYXgyMTY1X3ByaXYgKnByaXYsIHU4IG9zYyAvKk1IeiovKQoreworCXU4IHY7CisKKwl2ID0gKG9zYyAvIDIpOworCWlmICh2ID09IDIpCisJCXYgPSAweDc7CisJZWxzZQorCQl2IC09IDg7CisKKwltYXgyMTY1X21hc2tfd3JpdGVfcmVnKHByaXYsIFJFR19QTExfQ0ZHLCAweDA3LCB2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDIxNjVfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2LCB1MzIgYncpCit7CisJdTggdmFsOworCisJaWYgKGJ3ID09IEJBTkRXSURUSF84X01IWikKKwkJdmFsID0gcHJpdi0+YmJfZmlsdGVyXzhtaHpfY2ZnOworCWVsc2UKKwkJdmFsID0gcHJpdi0+YmJfZmlsdGVyXzdtaHpfY2ZnOworCisJbWF4MjE2NV9tYXNrX3dyaXRlX3JlZyhwcml2LCBSRUdfQkFTRUJBTkRfQ1RSTCwgMHhGMCwgdmFsIDw8IDQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBmaXhwdF9kaXYzMih1MzIgZGl2aWRlbmQsIHUzMiBkaXZpc29yLCB1MzIgKnF1b3RpZW50LCB1MzIgKmZyYWN0aW9uKQoreworCXUzMiByZW1haW5kZXI7CisJdTMyIHEsIGYgPSAwOworCWludCBpOworCisJaWYgKDAgPT0gZGl2aXNvcikKKwkJcmV0dXJuIC0xOworCisJcSA9IGRpdmlkZW5kIC8gZGl2aXNvcjsKKwlyZW1haW5kZXIgPSBkaXZpZGVuZCAtIHEgKiBkaXZpc29yOworCisJZm9yIChpID0gMDsgaSA8IDMxOyBpKyspIHsKKwkJcmVtYWluZGVyIDw8PSAxOworCQlpZiAocmVtYWluZGVyID49IGRpdmlzb3IpIHsKKwkJCWYgKz0gMTsKKwkJCXJlbWFpbmRlciAtPSBkaXZpc29yOworCQl9CisJCWYgPDw9IDE7CisJfQorCisJKnF1b3RpZW50ID0gcTsKKwkqZnJhY3Rpb24gPSBmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9zZXRfcmYoc3RydWN0IG1heDIxNjVfcHJpdiAqcHJpdiwgdTMyIGZyZXEpCit7CisJdTggdGY7CisJdTggdGZfbnRjaDsKKwl1MzIgdDsKKwl1MzIgcXVvdGllbnQsIGZyYWN0aW9uOworCisJLyogU2V0IFBMTCBkaXZpZGVyIGFjY29yZGluZyB0byBSRiBmcmVxdWVuY3kgKi8KKwlmaXhwdF9kaXYzMihmcmVxIC8gMTAwMCwgcHJpdi0+Y29uZmlnLT5vc2NfY2xrICogMTAwMCwKKwkJJnF1b3RpZW50LCAmZnJhY3Rpb24pOworCisJLyogMjAtYml0IGZyYWN0aW9uICovCisJZnJhY3Rpb24gPj49IDEyOworCisJbWF4MjE2NV93cml0ZV9yZWcocHJpdiwgUkVHX05ESVZfSU5ULCBxdW90aWVudCk7CisJbWF4MjE2NV9tYXNrX3dyaXRlX3JlZyhwcml2LCBSRUdfTkRJVl9GUkFDMiwgMHgwRiwgZnJhY3Rpb24gPj4gMTYpOworCW1heDIxNjVfd3JpdGVfcmVnKHByaXYsIFJFR19ORElWX0ZSQUMxLCBmcmFjdGlvbiA+PiA4KTsKKwltYXgyMTY1X3dyaXRlX3JlZyhwcml2LCBSRUdfTkRJVl9GUkFDMCwgZnJhY3Rpb24pOworCisJLyogTm9yY2ggRmlsdGVyICovCisJdGZfbnRjaCA9IChmcmVxIDwgNzI1MDAwMDAwKSA/CisJCXByaXYtPnRmX250Y2hfbG93X2NmZyA6IHByaXYtPnRmX250Y2hfaGlfY2ZnOworCisJLyogVHJhY2tpbmcgZmlsdGVyIGJhbHVuICovCisJdCA9IHByaXYtPnRmX2JhbHVuX2xvd19yZWY7CisJdCArPSAocHJpdi0+dGZfYmFsdW5faGlfcmVmIC0gcHJpdi0+dGZfYmFsdW5fbG93X3JlZikKKwkJKiAoZnJlcSAvIDEwMDAgLSA0NzAwMDApIC8gKDc4MDAwMCAtIDQ3MDAwMCk7CisKKwl0ZiA9IHQ7CisJZHByaW50aygidGYgPSAlWFxuIiwgdGYpOworCXRmIHw9IHRmX250Y2ggPDwgNDsKKworCW1heDIxNjVfd3JpdGVfcmVnKHByaXYsIFJFR19UUkFDS19GSUxURVIsIHRmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXgyMTY1X2RlYnVnX3N0YXR1cyhzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2KQoreworCXU4IHN0YXR1cywgYXV0b3R1bmU7CisJdTggYXV0b192Y29fc3VjY2VzcywgYXV0b192Y29fYWN0aXZlOworCXU4IHBsbF9sb2NrZWQ7CisJdTggZGNfb2Zmc2V0X2xvdywgZGNfb2Zmc2V0X2hpOworCXU4IHNpZ25hbF9sdl9vdmVyX3RocmVzaG9sZDsKKwl1OCB2Y28sIHZjb19zdWJfYmFuZCwgYWRjOworCisJbWF4MjE2NV9yZWFkX3JlZyhwcml2LCBSRUdfU1RBVFVTLCAmc3RhdHVzKTsKKwltYXgyMTY1X3JlYWRfcmVnKHByaXYsIFJFR19BVVRPVFVORSwgJmF1dG90dW5lKTsKKworCWF1dG9fdmNvX3N1Y2Nlc3MgPSAoc3RhdHVzID4+IDYpICYgMHgwMTsKKwlhdXRvX3Zjb19hY3RpdmUgPSAoc3RhdHVzID4+IDUpICYgMHgwMTsKKwlwbGxfbG9ja2VkID0gKHN0YXR1cyA+PiA0KSAmIDB4MDE7CisJZGNfb2Zmc2V0X2xvdyA9IChzdGF0dXMgPj4gMykgJiAweDAxOworCWRjX29mZnNldF9oaSA9IChzdGF0dXMgPj4gMikgJiAweDAxOworCXNpZ25hbF9sdl9vdmVyX3RocmVzaG9sZCA9IHN0YXR1cyAmIDB4MDE7CisKKwl2Y28gPSBhdXRvdHVuZSA+PiA2OworCXZjb19zdWJfYmFuZCA9IChhdXRvdHVuZSA+PiAzKSAmIDB4NzsKKwlhZGMgPSBhdXRvdHVuZSAmIDB4NzsKKworCWRwcmludGsoImF1dG8gVkNPIGFjdGl2ZTogJWQsIGF1dG8gVkNPIHN1Y2Nlc3M6ICVkXG4iLAorCQlhdXRvX3Zjb19hY3RpdmUsIGF1dG9fdmNvX3N1Y2Nlc3MpOworCWRwcmludGsoIlBMTCBsb2NrZWQ6ICVkXG4iLCBwbGxfbG9ja2VkKTsKKwlkcHJpbnRrKCJEQyBvZmZzZXQgbG93OiAlZCwgREMgb2Zmc2V0IGhpZ2g6ICVkXG4iLAorCQlkY19vZmZzZXRfbG93LCBkY19vZmZzZXRfaGkpOworCWRwcmludGsoIlNpZ25hbCBsdmwgb3ZlciB0aHJlc2hvbGQ6ICVkXG4iLCBzaWduYWxfbHZfb3Zlcl90aHJlc2hvbGQpOworCWRwcmludGsoIlZDTzogJWQsIFZDTyBTdWItYmFuZDogJWQsIEFEQzogJWRcbiIsIHZjbywgdmNvX3N1Yl9iYW5kLCBhZGMpOworfQorCitzdGF0aWMgaW50IG1heDIxNjVfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJldDsKKworCWRwcmludGsoIiVzKCkgZnJlcXVlbmN5PSVkIChIeilcbiIsIF9fZnVuY19fLCBwYXJhbXMtPmZyZXF1ZW5jeSk7CisJaWYgKGZlLT5vcHMuaW5mby50eXBlID09IEZFX0FUU0MpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgeworCQlkcHJpbnRrKCIlcygpIE9GRE1cbiIsIF9fZnVuY19fKTsKKwkJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGgpIHsKKwkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQkJcHJpdi0+ZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJCQlwcml2LT5iYW5kd2lkdGggPSBwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiTUFYMjE2NSBiYW5kd2lkdGggbm90IHNldCFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIk1BWDIxNjUgbW9kdWxhdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZHByaW50aygiJXMoKSBmcmVxdWVuY3k9JWRcbiIsIF9fZnVuY19fLCBwcml2LT5mcmVxdWVuY3kpOworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwltYXgyMTY1X3NldF9iYW5kd2lkdGgocHJpdiwgcHJpdi0+YmFuZHdpZHRoKTsKKwlyZXQgPSBtYXgyMTY1X3NldF9yZihwcml2LCBwcml2LT5mcmVxdWVuY3kpOworCW1kZWxheSg1MCk7CisJbWF4MjE2NV9kZWJ1Z19zdGF0dXMocHJpdik7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXgyMTY1X2dldF9mcmVxdWVuY3koc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqZnJlcSkKK3sKKwlzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCSpmcmVxID0gcHJpdi0+ZnJlcXVlbmN5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDIxNjVfZ2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpidykKK3sKKwlzdHJ1Y3QgbWF4MjE2NV9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCisJKmJ3ID0gcHJpdi0+YmFuZHdpZHRoOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDIxNjVfZ2V0X3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpzdGF0dXMpCit7CisJc3RydWN0IG1heDIxNjVfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXUxNiBsb2NrX3N0YXR1cyA9IDA7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKworCW1heDIxNjVfZGVidWdfc3RhdHVzKHByaXYpOworCSpzdGF0dXMgPSBsb2NrX3N0YXR1czsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBtYXgyMTY1X3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCisJLyogU2V0dXAgaW5pdGlhbCB2YWx1ZXMgKi8KKwkvKiBGcmFjdGlvbmFsIE1vZGUgb24gKi8KKwltYXgyMTY1X3dyaXRlX3JlZyhwcml2LCBSRUdfTkRJVl9GUkFDMiwgMHgxOCk7CisJLyogTE5BIG9uICovCisJbWF4MjE2NV93cml0ZV9yZWcocHJpdiwgUkVHX0xOQSwgMHgwMSk7CisJbWF4MjE2NV93cml0ZV9yZWcocHJpdiwgUkVHX1BMTF9DRkcsIDB4N0EpOworCW1heDIxNjVfd3JpdGVfcmVnKHByaXYsIFJFR19URVNULCAweDA4KTsKKwltYXgyMTY1X3dyaXRlX3JlZyhwcml2LCBSRUdfU0hVVERPV04sIDB4NDApOworCW1heDIxNjVfd3JpdGVfcmVnKHByaXYsIFJFR19WQ09fQ1RSTCwgMHg4NCk7CisJbWF4MjE2NV93cml0ZV9yZWcocHJpdiwgUkVHX0JBU0VCQU5EX0NUUkwsIDB4QzMpOworCW1heDIxNjVfd3JpdGVfcmVnKHByaXYsIFJFR19EQ19PRkZTRVRfQ1RSTCwgMHg3NSk7CisJbWF4MjE2NV93cml0ZV9yZWcocHJpdiwgUkVHX0RDX09GRlNFVF9EQUMsIDB4MDApOworCW1heDIxNjVfd3JpdGVfcmVnKHByaXYsIFJFR19ST01fVEFCTEVfQUREUiwgMHgwMCk7CisKKwltYXgyMTY1X3NldF9vc2MocHJpdiwgcHJpdi0+Y29uZmlnLT5vc2NfY2xrKTsKKworCW1heDIxNjVfcmVhZF9yb21fdGFibGUocHJpdik7CisKKwltYXgyMTY1X3NldF9iYW5kd2lkdGgocHJpdiwgQkFORFdJRFRIXzhfTUhaKTsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MjE2NV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBtYXgyMTY1X3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlrZnJlZShwcml2KTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkdmJfdHVuZXJfb3BzIG1heDIxNjVfdHVuZXJfb3BzID0geworCS5pbmZvID0geworCQkubmFtZSAgICAgICAgICAgPSAiTWF4aW0gTUFYMjE2NSIsCisJCS5mcmVxdWVuY3lfbWluICA9IDQ3MDAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggID0gNzgwMDAwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXAgPSAgICAgNTAwMDAsCisJfSwKKworCS5yZWxlYXNlCSAgID0gbWF4MjE2NV9yZWxlYXNlLAorCS5pbml0CQkgICA9IG1heDIxNjVfaW5pdCwKKwkuc2xlZXAJCSAgID0gbWF4MjE2NV9zbGVlcCwKKworCS5zZXRfcGFyYW1zCSAgID0gbWF4MjE2NV9zZXRfcGFyYW1zLAorCS5zZXRfYW5hbG9nX3BhcmFtcyA9IE5VTEwsCisJLmdldF9mcmVxdWVuY3kJICAgPSBtYXgyMTY1X2dldF9mcmVxdWVuY3ksCisJLmdldF9iYW5kd2lkdGgJICAgPSBtYXgyMTY1X2dldF9iYW5kd2lkdGgsCisJLmdldF9zdGF0dXMJICAgPSBtYXgyMTY1X2dldF9zdGF0dXMKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKm1heDIxNjVfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCSAgIHN0cnVjdCBtYXgyMTY1X2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBtYXgyMTY1X3ByaXYgKnByaXYgPSBOVUxMOworCisJZHByaW50aygiJXMoJWQtJTA0eClcbiIsIF9fZnVuY19fLAorCQlpMmMgPyBpMmNfYWRhcHRlcl9pZChpMmMpIDogLTEsCisJCWNmZyA/IGNmZy0+aTJjX2FkZHJlc3MgOiAtMSk7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1heDIxNjVfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJm1heDIxNjVfdHVuZXJfb3BzLAorCQlzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKworCXByaXYtPmNvbmZpZyA9IGNmZzsKKwlwcml2LT5pMmMgPSBpMmM7CisJZmUtPnR1bmVyX3ByaXYgPSBwcml2OworCisJbWF4MjE2NV9pbml0KGZlKTsKKwltYXgyMTY1X2RlYnVnX3N0YXR1cyhwcml2KTsKKworCXJldHVybiBmZTsKK30KK0VYUE9SVF9TWU1CT0wobWF4MjE2NV9hdHRhY2gpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBULiBMLiBXb25nIDxkYXZpZHRsd29uZ0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIE1BWDIxNjUgc2lsaWNvbiB0dW5lciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9tYXgyMTY1LmggYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbWF4MjE2NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjNjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbWF4MjE2NS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiAgRHJpdmVyIGZvciBNYXhpbSBNQVgyMTY1IHNpbGljb24gdHVuZXIKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IERhdmlkIFQuIEwuIFdvbmcgPGRhdmlkdGx3b25nQGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTUFYMjE2NV9IX18KKyNkZWZpbmUgX19NQVgyMTY1X0hfXworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kOworc3RydWN0IGkyY19hZGFwdGVyOworCitzdHJ1Y3QgbWF4MjE2NV9jb25maWcgeworCXU4IGkyY19hZGRyZXNzOworCXU4IG9zY19jbGs7IC8qIGluIE1Ieiwgc2VsZWN0YWJsZSB2YWx1ZXM6IDQsMTYsMTgsMjAsMjIsMjQsMjYsMjggKi8KK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9UVU5FUl9NQVgyMTY1KSB8fCBcCisgICAgKGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX01BWDIxNjVfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqbWF4MjE2NV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJc3RydWN0IG1heDIxNjVfY29uZmlnICpjZmcpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqbWF4MjE2NV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJc3RydWN0IG1heDIxNjVfY29uZmlnICpjZmcpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbWF4MjE2NV9wcml2LmggYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbWF4MjE2NV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiYmUwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9tYXgyMTY1X3ByaXYuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogIERyaXZlciBmb3IgTWF4aW0gTUFYMjE2NSBzaWxpY29uIHR1bmVyCisgKgorICogIENvcHlyaWdodCAoYykgMjAwOSBEYXZpZCBULiBMLiBXb25nIDxkYXZpZHRsd29uZ0BnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX01BWDIxNjVfUFJJVl9IX18KKyNkZWZpbmUgX19NQVgyMTY1X1BSSVZfSF9fCisKKyNkZWZpbmUgUkVHX05ESVZfSU5UIDB4MDAKKyNkZWZpbmUgUkVHX05ESVZfRlJBQzIgMHgwMQorI2RlZmluZSBSRUdfTkRJVl9GUkFDMSAweDAyCisjZGVmaW5lIFJFR19ORElWX0ZSQUMwIDB4MDMKKyNkZWZpbmUgUkVHX1RSQUNLX0ZJTFRFUiAweDA0CisjZGVmaW5lIFJFR19MTkEgMHgwNQorI2RlZmluZSBSRUdfUExMX0NGRyAweDA2CisjZGVmaW5lIFJFR19URVNUIDB4MDcKKyNkZWZpbmUgUkVHX1NIVVRET1dOIDB4MDgKKyNkZWZpbmUgUkVHX1ZDT19DVFJMIDB4MDkKKyNkZWZpbmUgUkVHX0JBU0VCQU5EX0NUUkwgMHgwQQorI2RlZmluZSBSRUdfRENfT0ZGU0VUX0NUUkwgMHgwQgorI2RlZmluZSBSRUdfRENfT0ZGU0VUX0RBQyAweDBDCisjZGVmaW5lIFJFR19ST01fVEFCTEVfQUREUiAweDBECisKKy8qIFJlYWQgT25seSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHX1JPTV9UQUJMRV9EQVRBIDB4MTAKKyNkZWZpbmUgUkVHX1NUQVRVUyAweDExCisjZGVmaW5lIFJFR19BVVRPVFVORSAweDEyCisKK3N0cnVjdCBtYXgyMTY1X3ByaXYgeworCXN0cnVjdCBtYXgyMTY1X2NvbmZpZyAqY29uZmlnOworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgYmFuZHdpZHRoOworCisJdTggdGZfbnRjaF9sb3dfY2ZnOworCXU4IHRmX250Y2hfaGlfY2ZnOworCXU4IHRmX2JhbHVuX2xvd19yZWY7CisJdTggdGZfYmFsdW5faGlfcmVmOworCXU4IGJiX2ZpbHRlcl83bWh6X2NmZzsKKwl1OCBiYl9maWx0ZXJfOG1oel9jZmc7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA1cy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKaW5kZXggMDgwM2RhYi4uNjA1ZTI4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKQEAgLTI3ODksNyArMjc4OSwxMCBAQAogCiAJLyogYWRkIGZvciAyLjYuNSBTcGVjaWFsIHNldHRpbmcgZm9yIFFBTSAqLwogCWlmIChzdGF0ZS0+TW9kX1R5cGUgPT0gTVhMX1FBTSkgewotCQlpZiAoc3RhdGUtPlJGX0lOIDwgNjgwMDAwMDAwKQorCQlpZiAoc3RhdGUtPmNvbmZpZy0+cWFtX2dhaW4gIT0gMCkKKwkJCXN0YXR1cyArPSBNWExfQ29udHJvbFdyaXRlKGZlLCBSRlNZTl9DSFBfR0FJTiwKKwkJCQkJCSAgIHN0YXRlLT5jb25maWctPnFhbV9nYWluKTsKKwkJZWxzZSBpZiAoc3RhdGUtPlJGX0lOIDwgNjgwMDAwMDAwKQogCQkJc3RhdHVzICs9IE1YTF9Db250cm9sV3JpdGUoZmUsIFJGU1lOX0NIUF9HQUlOLCAzKTsKIAkJZWxzZQogCQkJc3RhdHVzICs9IE1YTF9Db250cm9sV3JpdGUoZmUsIFJGU1lOX0NIUF9HQUlOLCAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA1cy5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmgKaW5kZXggN2FjNjgxNS4uZmM4YTFmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmgKQEAgLTEwOCw2ICsxMDgsMTAgQEAKICNkZWZpbmUgTVhMX0xPV19JRiAgMQogCXU4IGlmX21vZGU7CiAKKwkvKiBTb21lIGJvYXJkcyBuZWVkIHRvIG92ZXJyaWRlIHRoZSBidWlsdC1pbiBsb2dpYyBmb3IgZGV0ZXJtaW5pbmcKKwkgICB0aGUgZ2FpbiB3aGVuIGluIFFBTSBtb2RlICh0aGUgSFZSLTE2MDAgaXMgb25lIHN1Y2ggY2FzZSkgKi8KKwl1OCBxYW1fZ2FpbjsKKwogCS8qIFN0dWZmIEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggKi8KIAl1OCBBZ2NNYXN0ZXJCeXRlOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA3dC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKaW5kZXggMmQwMjY5OC4uN2ViMWJmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCWkgPSBqID0gMDsKIAogCXdoaWxlIChyZWdfcGFpcjFbaV0ucmVnIHx8IHJlZ19wYWlyMVtpXS52YWwpIHsKLQkJd2hpbGUgKHJlZ19wYWlyMltqXS5yZWcgfHwgcmVnX3BhaXIyW2pdLnJlZykgeworCQl3aGlsZSAocmVnX3BhaXIyW2pdLnJlZyB8fCByZWdfcGFpcjJbal0udmFsKSB7CiAJCQlpZiAocmVnX3BhaXIxW2ldLnJlZyAhPSByZWdfcGFpcjJbal0ucmVnKSB7CiAJCQkJaisrOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWNvbW1vbi5jCmluZGV4IDE1NWM5M2UuLmUxZjY3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtY29tbW9uLmMKQEAgLTMyNiwxMiArMzI2LDI0IEBACiAJcmVnc1tSX0VCMjJdID0gMHg0ODsKIAlyZWdzW1JfRUIyM10gPSAweGIwOwogCi0JaWYgKHByaXYtPnNtYWxsX2kyYykgeworCXN3aXRjaCAocHJpdi0+c21hbGxfaTJjKSB7CisJY2FzZSBUREExODI3MV8wOF9CWVRFX0NIVU5LX0lOSVQ6CisJCXRkYTE4MjcxX3dyaXRlX3JlZ3MoZmUsIDB4MDAsIDB4MDgpOworCQl0ZGExODI3MV93cml0ZV9yZWdzKGZlLCAweDA4LCAweDA4KTsKKwkJdGRhMTgyNzFfd3JpdGVfcmVncyhmZSwgMHgxMCwgMHgwOCk7CisJCXRkYTE4MjcxX3dyaXRlX3JlZ3MoZmUsIDB4MTgsIDB4MDgpOworCQl0ZGExODI3MV93cml0ZV9yZWdzKGZlLCAweDIwLCAweDA3KTsKKwkJYnJlYWs7CisJY2FzZSBUREExODI3MV8xNl9CWVRFX0NIVU5LX0lOSVQ6CiAJCXRkYTE4MjcxX3dyaXRlX3JlZ3MoZmUsIDB4MDAsIDB4MTApOwogCQl0ZGExODI3MV93cml0ZV9yZWdzKGZlLCAweDEwLCAweDEwKTsKIAkJdGRhMTgyNzFfd3JpdGVfcmVncyhmZSwgMHgyMCwgMHgwNyk7Ci0JfSBlbHNlCisJCWJyZWFrOworCWNhc2UgVERBMTgyNzFfMzlfQllURV9DSFVOS19JTklUOgorCWRlZmF1bHQ6CiAJCXRkYTE4MjcxX3dyaXRlX3JlZ3MoZmUsIDB4MDAsIFREQTE4MjcxX05VTV9SRUdTKTsKKwkJYnJlYWs7CisJfQogCiAJLyogc2V0dXAgYWdjMSBnYWluICovCiAJcmVnc1tSX0VCMTddID0gMHgwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWZlLmMKaW5kZXggM2E1MGNlOS4uYjJlMTU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWZlLmMKQEAgLTI1Niw4ICsyNTYsOSBAQAogCXN0cnVjdCB0ZGExODI3MV9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CiAJc3RydWN0IHRkYTE4MjcxX3JmX3RyYWNraW5nX2ZpbHRlcl9jYWwgKm1hcCA9IHByaXYtPnJmX2NhbF9zdGF0ZTsKIAl1bnNpZ25lZCBjaGFyICpyZWdzID0gcHJpdi0+dGRhMTgyNzFfcmVnczsKLQlpbnQgdG1fY3VycmVudCwgcmZjYWxfY29tcCwgYXBwcm94LCBpLCByZXQ7Ci0JdTggZGNfb3Zlcl9kdCwgcmZfdGFiOworCWludCBpLCByZXQ7CisJdTggdG1fY3VycmVudCwgZGNfb3Zlcl9kdCwgcmZfdGFiOworCXMzMiByZmNhbF9jb21wLCBhcHByb3g7CiAKIAkvKiBwb3dlciB1cCAqLwogCXJldCA9IHRkYTE4MjcxX3NldF9zdGFuZGJ5X21vZGUoZmUsIDAsIDAsIDApOwpAQCAtMjc3LDExICsyNzgsMTEgQEAKIAkJcmV0dXJuIGk7CiAKIAlpZiAoKDAgPT0gbWFwW2ldLnJmMykgfHwgKGZyZXEgLyAxMDAwIDwgbWFwW2ldLnJmMikpIHsKLQkJYXBwcm94ID0gbWFwW2ldLnJmX2ExICoKLQkJCShmcmVxIC8gMTAwMCAtIG1hcFtpXS5yZjEpICsgbWFwW2ldLnJmX2IxICsgcmZfdGFiOworCQlhcHByb3ggPSBtYXBbaV0ucmZfYTEgKiAoczMyKShmcmVxIC8gMTAwMCAtIG1hcFtpXS5yZjEpICsKKwkJCW1hcFtpXS5yZl9iMSArIHJmX3RhYjsKIAl9IGVsc2UgewotCQlhcHByb3ggPSBtYXBbaV0ucmZfYTIgKgotCQkJKGZyZXEgLyAxMDAwIC0gbWFwW2ldLnJmMikgKyBtYXBbaV0ucmZfYjIgKyByZl90YWI7CisJCWFwcHJveCA9IG1hcFtpXS5yZl9hMiAqIChzMzIpKGZyZXEgLyAxMDAwIC0gbWFwW2ldLnJmMikgKworCQkJbWFwW2ldLnJmX2IyICsgcmZfdGFiOwogCX0KIAogCWlmIChhcHByb3ggPCAwKQpAQCAtMjkyLDkgKzI5Myw5IEBACiAJdGRhMTgyNzFfbG9va3VwX21hcChmZSwgUkZfQ0FMX0RDX09WRVJfRFQsICZmcmVxLCAmZGNfb3Zlcl9kdCk7CiAKIAkvKiBjYWxjdWxhdGUgdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCi0JcmZjYWxfY29tcCA9IGRjX292ZXJfZHQgKiAodG1fY3VycmVudCAtIHByaXYtPnRtX3JmY2FsKSAvIDEwMDA7CisJcmZjYWxfY29tcCA9IGRjX292ZXJfZHQgKiAoczMyKSh0bV9jdXJyZW50IC0gcHJpdi0+dG1fcmZjYWwpIC8gMTAwMDsKIAotCXJlZ3NbUl9FQjE0XSA9IGFwcHJveCArIHJmY2FsX2NvbXA7CisJcmVnc1tSX0VCMTRdID0gKHVuc2lnbmVkIGNoYXIpKGFwcHJveCArIHJmY2FsX2NvbXApOwogCXJldCA9IHRkYTE4MjcxX3dyaXRlX3JlZ3MoZmUsIFJfRUIxNCwgMSk7CiBmYWlsOgogCXJldHVybiByZXQ7CkBAIC01NzIsNiArNTczLDcgQEAKIAlzdHJ1Y3QgdGRhMTgyNzFfcmZfdHJhY2tpbmdfZmlsdGVyX2NhbCAqbWFwID0gcHJpdi0+cmZfY2FsX3N0YXRlOwogCXVuc2lnbmVkIGNoYXIgKnJlZ3MgPSBwcml2LT50ZGExODI3MV9yZWdzOwogCWludCBiY2FsLCByZiwgaTsKKwlzMzIgZGl2aXNvciwgZGl2aWRlbmQ7CiAjZGVmaW5lIFJGMSAwCiAjZGVmaW5lIFJGMiAxCiAjZGVmaW5lIFJGMyAyCkBAIC02MTAsMjAgKzYxMiwyMiBAQAogCQlzd2l0Y2ggKHJmKSB7CiAJCWNhc2UgUkYxOgogCQkJbWFwW2ldLnJmX2ExID0gMDsKLQkJCW1hcFtpXS5yZl9iMSA9IHByb2dfY2FsW1JGMV0gLSBwcm9nX3RhYltSRjFdOworCQkJbWFwW2ldLnJmX2IxID0gKHMzMikocHJvZ19jYWxbUkYxXSAtIHByb2dfdGFiW1JGMV0pOwogCQkJbWFwW2ldLnJmMSAgID0gcmZfZnJlcVtSRjFdIC8gMTAwMDsKIAkJCWJyZWFrOwogCQljYXNlIFJGMjoKLQkJCW1hcFtpXS5yZl9hMSA9IChwcm9nX2NhbFtSRjJdIC0gcHJvZ190YWJbUkYyXSAtCi0JCQkJCXByb2dfY2FsW1JGMV0gKyBwcm9nX3RhYltSRjFdKSAvCi0JCQkJKHMzMikoKHJmX2ZyZXFbUkYyXSAtIHJmX2ZyZXFbUkYxXSkgLyAxMDAwKTsKKwkJCWRpdmlkZW5kID0gKHMzMikocHJvZ19jYWxbUkYyXSAtIHByb2dfdGFiW1JGMl0pIC0KKwkJCQkgICAoczMyKShwcm9nX2NhbFtSRjFdICsgcHJvZ190YWJbUkYxXSk7CisJCQlkaXZpc29yID0gKHMzMikocmZfZnJlcVtSRjJdIC0gcmZfZnJlcVtSRjFdKSAvIDEwMDA7CisJCQltYXBbaV0ucmZfYTEgPSAoZGl2aWRlbmQgLyBkaXZpc29yKTsKIAkJCW1hcFtpXS5yZjIgICA9IHJmX2ZyZXFbUkYyXSAvIDEwMDA7CiAJCQlicmVhazsKIAkJY2FzZSBSRjM6Ci0JCQltYXBbaV0ucmZfYTIgPSAocHJvZ19jYWxbUkYzXSAtIHByb2dfdGFiW1JGM10gLQotCQkJCQlwcm9nX2NhbFtSRjJdICsgcHJvZ190YWJbUkYyXSkgLwotCQkJCShzMzIpKChyZl9mcmVxW1JGM10gLSByZl9mcmVxW1JGMl0pIC8gMTAwMCk7Ci0JCQltYXBbaV0ucmZfYjIgPSBwcm9nX2NhbFtSRjJdIC0gcHJvZ190YWJbUkYyXTsKKwkJCWRpdmlkZW5kID0gKHMzMikocHJvZ19jYWxbUkYzXSAtIHByb2dfdGFiW1JGM10pIC0KKwkJCQkgICAoczMyKShwcm9nX2NhbFtSRjJdICsgcHJvZ190YWJbUkYyXSk7CisJCQlkaXZpc29yID0gKHMzMikocmZfZnJlcVtSRjNdIC0gcmZfZnJlcVtSRjJdKSAvIDEwMDA7CisJCQltYXBbaV0ucmZfYTIgPSAoZGl2aWRlbmQgLyBkaXZpc29yKTsKKwkJCW1hcFtpXS5yZl9iMiA9IChzMzIpKHByb2dfY2FsW1JGMl0gLSBwcm9nX3RhYltSRjJdKTsKIAkJCW1hcFtpXS5yZjMgICA9IHJmX2ZyZXFbUkYzXSAvIDEwMDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTExODEsNiArMTE4NSw0OCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgdGRhMTgyNzFfc2V0dXBfY29uZmlndXJhdGlvbihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJc3RydWN0IHRkYTE4MjcxX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCB0ZGExODI3MV9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisKKwlwcml2LT5nYXRlID0gKGNmZykgPyBjZmctPmdhdGUgOiBUREExODI3MV9HQVRFX0FVVE87CisJcHJpdi0+cm9sZSA9IChjZmcpID8gY2ZnLT5yb2xlIDogVERBMTgyNzFfTUFTVEVSOworCXByaXYtPmNvbmZpZyA9IChjZmcpID8gY2ZnLT5jb25maWcgOiAwOworCXByaXYtPnNtYWxsX2kyYyA9IChjZmcpID8KKwkJY2ZnLT5zbWFsbF9pMmMgOiBUREExODI3MV8zOV9CWVRFX0NIVU5LX0lOSVQ7CisJcHJpdi0+b3V0cHV0X29wdCA9IChjZmcpID8KKwkJY2ZnLT5vdXRwdXRfb3B0IDogVERBMTgyNzFfT1VUUFVUX0xUX1hUX09OOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRkYTE4MjcxX25lZWRfY2FsX29uX3N0YXJ0dXAoc3RydWN0IHRkYTE4MjcxX2NvbmZpZyAqY2ZnKQoreworCS8qIHRkYTE4MjcxX2NhbF9vbl9zdGFydHVwID09IC0xIHdoZW4gY2FsIG1vZHVsZSBvcHRpb24gaXMgdW5zZXQgKi8KKwlyZXR1cm4gKCh0ZGExODI3MV9jYWxfb25fc3RhcnR1cCA9PSAtMSkgPworCQkvKiBob25vciBjb25maWd1cmF0aW9uIHNldHRpbmcgKi8KKwkJKChjZmcpICYmIChjZmctPnJmX2NhbF9vbl9zdGFydHVwKSkgOgorCQkvKiBtb2R1bGUgb3B0aW9uIG92ZXJyaWRlcyBjb25maWd1cmF0aW9uIHNldHRpbmcgKi8KKwkJKHRkYTE4MjcxX2NhbF9vbl9zdGFydHVwKSkgPyAxIDogMDsKK30KKworc3RhdGljIGludCB0ZGExODI3MV9zZXRfY29uZmlnKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB2b2lkICpwcml2X2NmZykKK3sKKwlzdHJ1Y3QgdGRhMTgyNzFfY29uZmlnICpjZmcgPSAoc3RydWN0IHRkYTE4MjcxX2NvbmZpZyAqKSBwcml2X2NmZzsKKworCXRkYTE4MjcxX3NldHVwX2NvbmZpZ3VyYXRpb24oZmUsIGNmZyk7CisKKwlpZiAodGRhMTgyNzFfbmVlZF9jYWxfb25fc3RhcnR1cChjZmcpKQorCQl0ZGExODI3MV9pbml0KGZlKTsKKworCS8qIG92ZXJyaWRlIGRlZmF1bHQgc3RkIG1hcCB3aXRoIHZhbHVlcyBpbiBjb25maWcgc3RydWN0ICovCisJaWYgKChjZmcpICYmIChjZmctPnN0ZF9tYXApKQorCQl0ZGExODI3MV91cGRhdGVfc3RkX21hcChmZSwgY2ZnLT5zdGRfbWFwKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGR2Yl90dW5lcl9vcHMgdGRhMTgyNzFfdHVuZXJfb3BzID0gewogCS5pbmZvID0gewogCQkubmFtZSA9ICJOWFAgVERBMTgyNzFIRCIsCkBAIC0xMTkzLDYgKzEyMzksNyBAQAogCS5zZXRfcGFyYW1zICAgICAgICA9IHRkYTE4MjcxX3NldF9wYXJhbXMsCiAJLnNldF9hbmFsb2dfcGFyYW1zID0gdGRhMTgyNzFfc2V0X2FuYWxvZ19wYXJhbXMsCiAJLnJlbGVhc2UgICAgICAgICAgID0gdGRhMTgyNzFfcmVsZWFzZSwKKwkuc2V0X2NvbmZpZyAgICAgICAgPSB0ZGExODI3MV9zZXRfY29uZmlnLAogCS5nZXRfZnJlcXVlbmN5ICAgICA9IHRkYTE4MjcxX2dldF9mcmVxdWVuY3ksCiAJLmdldF9iYW5kd2lkdGggICAgID0gdGRhMTgyNzFfZ2V0X2JhbmR3aWR0aCwKIH07CkBAIC0xMjEzLDMzICsxMjYwLDE0IEBACiAJY2FzZSAwOgogCQlnb3RvIGZhaWw7CiAJY2FzZSAxOgotCXsKIAkJLyogbmV3IHR1bmVyIGluc3RhbmNlICovCi0JCWludCByZl9jYWxfb25fc3RhcnR1cDsKKwkJZmUtPnR1bmVyX3ByaXYgPSBwcml2OwogCi0JCXByaXYtPmdhdGUgPSAoY2ZnKSA/IGNmZy0+Z2F0ZSA6IFREQTE4MjcxX0dBVEVfQVVUTzsKLQkJcHJpdi0+cm9sZSA9IChjZmcpID8gY2ZnLT5yb2xlIDogVERBMTgyNzFfTUFTVEVSOwotCQlwcml2LT5jb25maWcgPSAoY2ZnKSA/IGNmZy0+Y29uZmlnIDogMDsKLQkJcHJpdi0+c21hbGxfaTJjID0gKGNmZykgPyBjZmctPnNtYWxsX2kyYyA6IDA7Ci0JCXByaXYtPm91dHB1dF9vcHQgPSAoY2ZnKSA/Ci0JCQljZmctPm91dHB1dF9vcHQgOiBUREExODI3MV9PVVRQVVRfTFRfWFRfT047Ci0KLQkJLyogdGRhMTgyNzFfY2FsX29uX3N0YXJ0dXAgPT0gLTEgd2hlbiBjYWwKLQkJICogbW9kdWxlIG9wdGlvbiBpcyB1bnNldCAqLwotCQlpZiAodGRhMTgyNzFfY2FsX29uX3N0YXJ0dXAgPT0gLTEpIHsKLQkJCS8qIGhvbm9yIGF0dGFjaC10aW1lIGNvbmZpZ3VyYXRpb24gKi8KLQkJCXJmX2NhbF9vbl9zdGFydHVwID0KLQkJCQkoKGNmZykgJiYgKGNmZy0+cmZfY2FsX29uX3N0YXJ0dXApKSA/IDEgOiAwOwotCQl9IGVsc2UgewotCQkJLyogbW9kdWxlIG9wdGlvbiBvdmVycmlkZXMgYXR0YWNoIGNvbmZpZ3VyYXRpb24gKi8KLQkJCXJmX2NhbF9vbl9zdGFydHVwID0gdGRhMTgyNzFfY2FsX29uX3N0YXJ0dXA7Ci0JCX0KKwkJdGRhMTgyNzFfc2V0dXBfY29uZmlndXJhdGlvbihmZSwgY2ZnKTsKIAogCQlwcml2LT5jYWxfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAkJbXV0ZXhfaW5pdCgmcHJpdi0+bG9jayk7CiAKLQkJZmUtPnR1bmVyX3ByaXYgPSBwcml2OwotCiAJCWlmICh0ZGFfZmFpbCh0ZGExODI3MV9nZXRfaWQoZmUpKSkKIAkJCWdvdG8gZmFpbDsKIApAQCAtMTI0OSwxMiArMTI3NywxMiBAQAogCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKIAkJdGRhMTgyNzFfaW5pdF9yZWdzKGZlKTsKIAotCQlpZiAoKHJmX2NhbF9vbl9zdGFydHVwKSAmJiAocHJpdi0+aWQgPT0gVERBMTgyNzFIREMyKSkKKwkJaWYgKCh0ZGExODI3MV9uZWVkX2NhbF9vbl9zdGFydHVwKGNmZykpICYmCisJCSAgICAocHJpdi0+aWQgPT0gVERBMTgyNzFIREMyKSkKIAkJCXRkYTE4MjcxYzJfcmZfY2FsX2luaXQoZmUpOwogCiAJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CiAJCWJyZWFrOwotCX0KIAlkZWZhdWx0OgogCQkvKiBleGlzdGluZyB0dW5lciBpbnN0YW5jZSAqLwogCQlmZS0+dHVuZXJfcHJpdiA9IHByaXY7CkBAIC0xMjcxLDcgKzEyOTksMTEgQEAKIAkJCQlwcml2LT5zbWFsbF9pMmMgPSBjZmctPnNtYWxsX2kyYzsKIAkJCWlmIChjZmctPm91dHB1dF9vcHQpCiAJCQkJcHJpdi0+b3V0cHV0X29wdCA9IGNmZy0+b3V0cHV0X29wdDsKKwkJCWlmIChjZmctPnN0ZF9tYXApCisJCQkJdGRhMTgyNzFfdXBkYXRlX3N0ZF9tYXAoZmUsIGNmZy0+c3RkX21hcCk7CiAJCX0KKwkJaWYgKHRkYTE4MjcxX25lZWRfY2FsX29uX3N0YXJ0dXAoY2ZnKSkKKwkJCXRkYTE4MjcxX2luaXQoZmUpOwogCQlicmVhazsKIAl9CiAKQEAgLTEyOTgsNyArMTMzMCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIk5YUCBUREExODI3MUhEIGFuYWxvZyAvIGRpZ2l0YWwgdHVuZXIgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEtydWZreSA8bWtydWZreUBsaW51eHR2Lm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKCIwLjMiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjQiKTsKIAogLyoKICAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLW1hcHMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1tYXBzLmMKaW5kZXggZTIxZmRlZi4uZTdmODRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLW1hcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtbWFwcy5jCkBAIC05NzgsNiArOTc4LDcgQEAKIGludCB0ZGExODI3MV9sb29rdXBfY2lkX3RhcmdldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCSAgICAgICB1MzIgKmZyZXEsIHU4ICpjaWRfdGFyZ2V0LCB1MTYgKmNvdW50X2xpbWl0KQogeworCXN0cnVjdCB0ZGExODI3MV9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CiAJaW50IGkgPSAwOwogCiAJd2hpbGUgKCh0ZGExODI3MV9jaWRfdGFyZ2V0W2ldLnJmbWF4ICogMTAwMCkgPCAqZnJlcSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLXByaXYuaCBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1wcml2LmgKaW5kZXggMmJlZTIyOS4uOTU4OWFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLXByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtcHJpdi5oCkBAIC04MCwxMCArODAsMTAgQEAKIAl1MzIgcmYxOwogCXUzMiByZjI7CiAJdTMyIHJmMzsKLQlpbnQgcmZfYTE7Ci0JaW50IHJmX2IxOwotCWludCByZl9hMjsKLQlpbnQgcmZfYjI7CisJczMyIHJmX2ExOworCXMzMiByZl9iMTsKKwlzMzIgcmZfYTI7CisJczMyIHJmX2IyOwogfTsKIAogZW51bSB0ZGExODI3MV9wbGwgewpAQCAtMTA5LDExICsxMDksMTIgQEAKIAllbnVtIHRkYTE4MjcxX2kyY19nYXRlIGdhdGU7CiAJZW51bSB0ZGExODI3MV92ZXIgaWQ7CiAJZW51bSB0ZGExODI3MV9vdXRwdXRfb3B0aW9ucyBvdXRwdXRfb3B0OworCWVudW0gdGRhMTgyNzFfc21hbGxfaTJjIHNtYWxsX2kyYzsKIAogCXVuc2lnbmVkIGludCBjb25maWc7IC8qIGludGVyZmFjZSB0byBzYWE3MTN4IC8gdGRhODI5eCAqLwotCXVuc2lnbmVkIGludCB0bV9yZmNhbDsKIAl1bnNpZ25lZCBpbnQgY2FsX2luaXRpYWxpemVkOjE7Ci0JdW5zaWduZWQgaW50IHNtYWxsX2kyYzoxOworCisJdTggdG1fcmZjYWw7CiAKIAlzdHJ1Y3QgdGRhMTgyNzFfbWFwX2xheW91dCAqbWFwczsKIAlzdHJ1Y3QgdGRhMTgyNzFfc3RkX21hcCBzdGQ7CkBAIC0xMzUsMjcgKzEzNiwzNyBAQAogI2RlZmluZSBEQkdfQURWICA4CiAjZGVmaW5lIERCR19DQUwgIDE2CiAKLSNkZWZpbmUgdGRhX3ByaW50ayhrZXJuLCBmbXQsIGFyZy4uLikgXAotCXByaW50ayhrZXJuICIlczogIiBmbXQsIF9fZnVuY19fLCAjI2FyZykKKyNkZWZpbmUgdGRhX3ByaW50ayhzdCwga2VybiwgZm10LCBhcmcuLi4pIGRvIHtcCisJaWYgKHN0KSB7IFwKKwkJc3RydWN0IHRkYTE4MjcxX3ByaXYgKnN0YXRlID0gc3Q7IFwKKwkJcHJpbnRrKGtlcm4gIiVzOiBbJWQtJTA0eHwlc10gIiBmbXQsIF9fZnVuY19fLCBcCisJCQlpMmNfYWRhcHRlcl9pZChzdGF0ZS0+aTJjX3Byb3BzLmFkYXApLCBcCisJCQlzdGF0ZS0+aTJjX3Byb3BzLmFkZHIsIFwKKwkJCShzdGF0ZS0+cm9sZSA9PSBUREExODI3MV9NQVNURVIpIFwKKwkJCT8gIk0iIDogIlMiLCAjI2FyZyk7IFwKKwl9IGVsc2UgXAorCQlwcmludGsoa2VybiAiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNhcmcpOyBcCit9IHdoaWxlICgwKQogCi0jZGVmaW5lIHRkYV9kcHJpbnRrKGx2bCwgZm10LCBhcmcuLi4pIGRvIHtcCisjZGVmaW5lIHRkYV9kcHJpbnRrKHN0LCBsdmwsIGZtdCwgYXJnLi4uKSBkbyB7XAogCWlmICh0ZGExODI3MV9kZWJ1ZyAmIGx2bCkgXAotCQl0ZGFfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpOyB9IHdoaWxlICgwKQorCQl0ZGFfcHJpbnRrKHN0LCBLRVJOX0RFQlVHLCBmbXQsICMjYXJnKTsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSB0ZGFfaW5mbyhmbXQsIGFyZy4uLikgICAgIHByaW50ayhLRVJOX0lORk8gICAgIGZtdCwgIyNhcmcpCi0jZGVmaW5lIHRkYV93YXJuKGZtdCwgYXJnLi4uKSB0ZGFfcHJpbnRrKEtFUk5fV0FSTklORywgZm10LCAjI2FyZykKLSNkZWZpbmUgdGRhX2VycihmbXQsIGFyZy4uLikgIHRkYV9wcmludGsoS0VSTl9FUlIsICAgICBmbXQsICMjYXJnKQotI2RlZmluZSB0ZGFfZGJnKGZtdCwgYXJnLi4uKSAgdGRhX2RwcmludGsoREJHX0lORk8sICAgIGZtdCwgIyNhcmcpCi0jZGVmaW5lIHRkYV9tYXAoZm10LCBhcmcuLi4pICB0ZGFfZHByaW50ayhEQkdfTUFQLCAgICAgZm10LCAjI2FyZykKLSNkZWZpbmUgdGRhX3JlZyhmbXQsIGFyZy4uLikgIHRkYV9kcHJpbnRrKERCR19SRUcsICAgICBmbXQsICMjYXJnKQotI2RlZmluZSB0ZGFfY2FsKGZtdCwgYXJnLi4uKSAgdGRhX2RwcmludGsoREJHX0NBTCwgICAgIGZtdCwgIyNhcmcpCisjZGVmaW5lIHRkYV93YXJuKGZtdCwgYXJnLi4uKSB0ZGFfcHJpbnRrKHByaXYsIEtFUk5fV0FSTklORywgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX2VycihmbXQsIGFyZy4uLikgIHRkYV9wcmludGsocHJpdiwgS0VSTl9FUlIsICAgICBmbXQsICMjYXJnKQorI2RlZmluZSB0ZGFfZGJnKGZtdCwgYXJnLi4uKSAgdGRhX2RwcmludGsocHJpdiwgREJHX0lORk8sICAgIGZtdCwgIyNhcmcpCisjZGVmaW5lIHRkYV9tYXAoZm10LCBhcmcuLi4pICB0ZGFfZHByaW50ayhwcml2LCBEQkdfTUFQLCAgICAgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX3JlZyhmbXQsIGFyZy4uLikgIHRkYV9kcHJpbnRrKHByaXYsIERCR19SRUcsICAgICBmbXQsICMjYXJnKQorI2RlZmluZSB0ZGFfY2FsKGZtdCwgYXJnLi4uKSAgdGRhX2RwcmludGsocHJpdiwgREJHX0NBTCwgICAgIGZtdCwgIyNhcmcpCiAKICNkZWZpbmUgdGRhX2ZhaWwocmV0KQkJCQkJCQkgICAgIFwKICh7CQkJCQkJCQkJICAgICBcCiAJaW50IF9fcmV0OwkJCQkJCQkgICAgIFwKIAlfX3JldCA9IChyZXQgPCAwKTsJCQkJCQkgICAgIFwKIAlpZiAoX19yZXQpCQkJCQkJCSAgICAgXAotCQl0ZGFfcHJpbnRrKEtFUk5fRVJSLCAiZXJyb3IgJWQgb24gbGluZSAlZFxuIiwgcmV0LCBfX0xJTkVfXyk7XAorCQl0ZGFfcHJpbnRrKHByaXYsIEtFUk5fRVJSLAkJCQkgICAgIFwKKwkJCSAgICJlcnJvciAlZCBvbiBsaW5lICVkXG4iLCByZXQsIF9fTElORV9fKTsJICAgICBcCiAJX19yZXQ7CQkJCQkJCQkgICAgIFwKIH0pCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLmgKaW5kZXggMzIzZjI5MS4uZDdmY2MzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLmgKQEAgLTc4LDYgKzc4LDEyIEBACiAJVERBMTgyNzFfT1VUUFVUX1hUX09GRiA9IDIsCiB9OwogCitlbnVtIHRkYTE4MjcxX3NtYWxsX2kyYyB7CisJVERBMTgyNzFfMzlfQllURV9DSFVOS19JTklUID0gMCwKKwlUREExODI3MV8xNl9CWVRFX0NIVU5LX0lOSVQgPSAxLAorCVREQTE4MjcxXzA4X0JZVEVfQ0hVTktfSU5JVCA9IDIsCit9OworCiBzdHJ1Y3QgdGRhMTgyNzFfY29uZmlnIHsKIAkvKiBvdmVycmlkZSBkZWZhdWx0IGlmIGZyZXEgLyBzdGQgc2V0dGluZ3MgKG9wdGlvbmFsKSAqLwogCXN0cnVjdCB0ZGExODI3MV9zdGRfbWFwICpzdGRfbWFwOwpAQCAtOTEsMTIgKzk3LDEyIEBACiAJLyogb3V0cHV0IG9wdGlvbnMgdGhhdCBjYW4gYmUgZGlzYWJsZWQgKi8KIAllbnVtIHRkYTE4MjcxX291dHB1dF9vcHRpb25zIG91dHB1dF9vcHQ7CiAKKwkvKiBzb21lIGkyYyBwcm92aWRlcnMgY2FudCB3cml0ZSBhbGwgMzkgcmVnaXN0ZXJzIGF0IG9uY2UgKi8KKwllbnVtIHRkYTE4MjcxX3NtYWxsX2kyYyBzbWFsbF9pMmM7CisKIAkvKiBmb3JjZSByZiB0cmFja2luZyBmaWx0ZXIgY2FsaWJyYXRpb24gb24gc3RhcnR1cCAqLwogCXVuc2lnbmVkIGludCByZl9jYWxfb25fc3RhcnR1cDoxOwogCi0JLyogc29tZSBpMmMgcHJvdmlkZXJzIGNhbnQgd3JpdGUgYWxsIDM5IHJlZ2lzdGVycyBhdCBvbmNlICovCi0JdW5zaWduZWQgaW50IHNtYWxsX2kyYzoxOwotCiAJLyogaW50ZXJmYWNlIHRvIHNhYTcxM3ggLyB0ZGE4Mjl4ICovCiAJdW5zaWduZWQgaW50IGNvbmZpZzsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuYwppbmRleCAwNjRkMTRjLi5jMTkwYjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMKQEAgLTMzLDYgKzMzLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgdmVyYm9zZSBkZWJ1ZyBtZXNzYWdlcyIpOwogCiBzdGF0aWMgaW50IGRlZW1waGFzaXNfNTA7Cittb2R1bGVfcGFyYW0oZGVlbXBoYXNpc181MCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVlbXBoYXNpc181MCwgIjAgLSA3NXVzIGRlZW1waGFzaXM7IDEgLSA1MHVzIGRlZW1waGFzaXMiKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTk4ODcuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE5ODg3LmMKaW5kZXggNTQ0Y2RiZS4uYTcxYzEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTk4ODcuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhOTg4Ny5jCkBAIC00NjMsNyArNDYzLDcgQEAKIAkJCWJ1ZlsxXSAmPSB+Y1FTUzsKIAl9CiAKLQlpZiAoYWRqdXN0ID49IDB4MDAgJiYgYWRqdXN0IDwgMHgyMCkgeworCWlmIChhZGp1c3QgPCAweDIwKSB7CiAJCWJ1ZlsyXSAmPSB+Y1RvcE1hc2s7CiAJCWJ1ZlsyXSB8PSBhZGp1c3Q7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5jCmluZGV4IGY0ZmZjZGMuLjQzMjAwM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAl1MzIgYmFuZHdpZHRoOwogCXU4ICB2aWRlb19zdGFuZGFyZDsKIAl1OCAgcmZfbW9kZTsKKwl1OCAgcmFkaW9faW5wdXQ7CiB9OwogCiAvKiBNaXNjIERlZmluZXMgKi8KQEAgLTYzMiw4ICs2MzMsMTIgQEAKIAlzdHJ1Y3QgeGM1MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKIAlpbnQgcmV0OwogCi0JaWYgKHhjNTAwMF9pc19maXJtd2FyZV9sb2FkZWQoZmUpICE9IFhDX1JFU1VMVF9TVUNDRVNTKQotCQl4Y19sb2FkX2Z3X2FuZF9pbml0X3R1bmVyKGZlKTsKKwlpZiAoeGM1MDAwX2lzX2Zpcm13YXJlX2xvYWRlZChmZSkgIT0gWENfUkVTVUxUX1NVQ0NFU1MpIHsKKwkJaWYgKHhjX2xvYWRfZndfYW5kX2luaXRfdHVuZXIoZmUpICE9IFhDX1JFU1VMVF9TVUNDRVNTKSB7CisJCQlkcHJpbnRrKDEsICJVbmFibGUgdG8gbG9hZCBmaXJtd2FyZSBhbmQgaW5pdCB0dW5lclxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KIAogCWRwcmludGsoMSwgIiVzKCkgZnJlcXVlbmN5PSVkIChIeilcbiIsIF9fZnVuY19fLCBwYXJhbXMtPmZyZXF1ZW5jeSk7CiAKQEAgLTczOSwxNSArNzQ0LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB4YzUwMDBfc2V0X2FuYWxvZ19wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCitzdGF0aWMgaW50IHhjNTAwMF9zZXRfdHZfZnJlcShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAlzdHJ1Y3QgYW5hbG9nX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgeGM1MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKIAlpbnQgcmV0OwogCi0JaWYgKHhjNTAwMF9pc19maXJtd2FyZV9sb2FkZWQoZmUpICE9IFhDX1JFU1VMVF9TVUNDRVNTKQotCQl4Y19sb2FkX2Z3X2FuZF9pbml0X3R1bmVyKGZlKTsKLQogCWRwcmludGsoMSwgIiVzKCkgZnJlcXVlbmN5PSVkIChpbiB1bml0cyBvZiA2Mi41a2h6KVxuIiwKIAkJX19mdW5jX18sIHBhcmFtcy0+ZnJlcXVlbmN5KTsKIApAQCAtODI3LDYgKzgyOSw4NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHhjNTAwMF9zZXRfcmFkaW9fZnJlcShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgYW5hbG9nX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgeGM1MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1OCByYWRpb19pbnB1dDsKKworCWRwcmludGsoMSwgIiVzKCkgZnJlcXVlbmN5PSVkIChpbiB1bml0cyBvZiBraHopXG4iLAorCQlfX2Z1bmNfXywgcGFyYW1zLT5mcmVxdWVuY3kpOworCisJaWYgKHByaXYtPnJhZGlvX2lucHV0ID09IFhDNTAwMF9SQURJT19OT1RfQ09ORklHVVJFRCkgeworCQlkcHJpbnRrKDEsICIlcygpIHJhZGlvIGlucHV0IG5vdCBjb25maWd1cmVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwcml2LT5yYWRpb19pbnB1dCA9PSBYQzUwMDBfUkFESU9fRk0xKQorCQlyYWRpb19pbnB1dCA9IEZNX1JhZGlvX0lOUFVUMTsKKwllbHNlIGlmICAocHJpdi0+cmFkaW9faW5wdXQgPT0gWEM1MDAwX1JBRElPX0ZNMikKKwkJcmFkaW9faW5wdXQgPSBGTV9SYWRpb19JTlBVVDI7CisJZWxzZSB7CisJCWRwcmludGsoMSwgIiVzKCkgdW5rbm93biByYWRpbyBpbnB1dCAlZFxuIiwgX19mdW5jX18sCisJCQlwcml2LT5yYWRpb19pbnB1dCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAqIDEyNSAvIDI7CisKKwlwcml2LT5yZl9tb2RlID0gWENfUkZfTU9ERV9BSVI7CisKKwlyZXQgPSB4Y19TZXRUVlN0YW5kYXJkKHByaXYsIFhDNTAwMF9TdGFuZGFyZFtyYWRpb19pbnB1dF0uVmlkZW9Nb2RlLAorCQkJICAgICAgIFhDNTAwMF9TdGFuZGFyZFtyYWRpb19pbnB1dF0uQXVkaW9Nb2RlKTsKKworCWlmIChyZXQgIT0gWENfUkVTVUxUX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4YzUwMDA6IHhjX1NldFRWU3RhbmRhcmQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJcmV0ID0geGNfU2V0U2lnbmFsU291cmNlKHByaXYsIHByaXYtPnJmX21vZGUpOworCWlmIChyZXQgIT0gWENfUkVTVUxUX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkieGM1MDAwOiB4Y19TZXRTaWduYWxTb3VyY2UoJWQpIGZhaWxlZFxuIiwKKwkJCXByaXYtPnJmX21vZGUpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwl4Y190dW5lX2NoYW5uZWwocHJpdiwgcHJpdi0+ZnJlcV9oeiwgWENfVFVORV9BTkFMT0cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGM1MDAwX3NldF9hbmFsb2dfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICAgICBzdHJ1Y3QgYW5hbG9nX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgeGM1MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChwcml2LT5pMmNfcHJvcHMuYWRhcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh4YzUwMDBfaXNfZmlybXdhcmVfbG9hZGVkKGZlKSAhPSBYQ19SRVNVTFRfU1VDQ0VTUykgeworCQlpZiAoeGNfbG9hZF9md19hbmRfaW5pdF90dW5lcihmZSkgIT0gWENfUkVTVUxUX1NVQ0NFU1MpIHsKKwkJCWRwcmludGsoMSwgIlVuYWJsZSB0byBsb2FkIGZpcm13YXJlIGFuZCBpbml0IHR1bmVyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJc3dpdGNoIChwYXJhbXMtPm1vZGUpIHsKKwljYXNlIFY0TDJfVFVORVJfUkFESU86CisJCXJldCA9IHhjNTAwMF9zZXRfcmFkaW9fZnJlcShmZSwgcGFyYW1zKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1RVTkVSX0FOQUxPR19UVjoKKwljYXNlIFY0TDJfVFVORVJfRElHSVRBTF9UVjoKKwkJcmV0ID0geGM1MDAwX3NldF90dl9mcmVxKGZlLCBwYXJhbXMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKIHN0YXRpYyBpbnQgeGM1MDAwX2dldF9mcmVxdWVuY3koc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqZnJlcSkKIHsKIAlzdHJ1Y3QgeGM1MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKQEAgLTEwMDAsNiArMTA4Miw5IEBACiAJCXByaXYtPmlmX2toeiA9IGNmZy0+aWZfa2h6OwogCX0KIAorCWlmIChwcml2LT5yYWRpb19pbnB1dCA9PSAwKQorCQlwcml2LT5yYWRpb19pbnB1dCA9IGNmZy0+cmFkaW9faW5wdXQ7CisKIAkvKiBDaGVjayBpZiBmaXJtd2FyZSBoYXMgYmVlbiBsb2FkZWQuIEl0IGlzIHBvc3NpYmxlIHRoYXQgYW5vdGhlcgogCSAgIGluc3RhbmNlIG9mIHRoZSBkcml2ZXIgaGFzIGxvYWRlZCB0aGUgZmlybXdhcmUuCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmggYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmgKaW5kZXggZjRjMTQ2Ni4uZTZkNzIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDAuaApAQCAtMzAsMTEgKzMwLDE3IEBACiBzdHJ1Y3QgeGM1MDAwX2NvbmZpZyB7CiAJdTggICBpMmNfYWRkcmVzczsKIAl1MzIgIGlmX2toejsKKwl1OCAgIHJhZGlvX2lucHV0OwogfTsKIAogLyogeGM1MDAwIGNhbGxiYWNrIGNvbW1hbmQgKi8KICNkZWZpbmUgWEM1MDAwX1RVTkVSX1JFU0VUCQkwCiAKKy8qIFBvc3NpYmxlIFJhZGlvIGlucHV0cyAqLworI2RlZmluZSBYQzUwMDBfUkFESU9fTk9UX0NPTkZJR1VSRUQJCTAKKyNkZWZpbmUgWEM1MDAwX1JBRElPX0ZNMQkJCTEKKyNkZWZpbmUgWEM1MDAwX1JBRElPX0ZNMgkJCTIKKwogLyogRm9yIGVhY2ggYnJpZGdlIGZyYW1ld29yaywgd2hlbiBpdCBhdHRhY2hlcyBlaXRoZXIgYW5hbG9nIG9yIGRpZ2l0YWwsCiAgKiBpdCBoYXMgdG8gc3RvcmUgYSByZWZlcmVuY2UgYmFjayB0byBpdHMgX2NvcmUgZXF1aXZhbGVudCBzdHJ1Y3R1cmUsCiAgKiBzbyB0aGF0IGl0IGNhbiBzZXJ2aWNlIHRoZSBoYXJkd2FyZSBieSBzdGVlcmluZyBncGlvJ3MgZXRjLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwppbmRleCBiMTg1N2MxLi43OGZjNDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJCWZyZXEgPSAyMTUwMDAwOyAvKiBzYXRlbGxpdGUgSUYgaXMgOTUwLi4yMTUwTUh6ICovCiAKIAkvKiBkZWNpZGUgd2hpY2ggVkNPIHRvIHVzZSBmb3IgdGhlIGlucHV0IGZyZXF1ZW5jeSAqLwotCWZvcihpID0gMTsgKGkgPCBBUlJBWV9TSVpFKG9zY2kpKSAmJiAob3NjaVtpXSA8IGZyZXEpOyBpKyspOworCWZvcihpID0gMTsgKGkgPCBBUlJBWV9TSVpFKG9zY2kpIC0gMSkgJiYgKG9zY2lbaV0gPCBmcmVxKTsgaSsrKTsKIAlwcmludGsoImN4MjQxMDggZGVidWc6IHNlbGVjdCB2Y28gIyVkIChmPSVkKVxuIixpLGZyZXEpOwogCWJhbmQ9YmFuZHNlbFtpXTsKIAkvKiB0aGUgZ2FpbiB2YWx1ZXMgbXVzdCBiZSBzZXQgYnkgU2V0U3ltYm9scmF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L2RtMTEwNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L2RtMTEwNS5jCmluZGV4IDJkMDk5ZTIuLjUzZTNmMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9kbTExMDUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvZG0xMTA1LmMKQEAgLTUxMCw3ICs1MTAsNyBAQAogCiAJZGF0YSA9IChpcmNvbSA+PiA4KSAmIDB4N2Y7CiAKLQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dF9kZXYsICZpci0+aXIsIGRhdGEsIGRhdGEpOworCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0X2RldiwgJmlyLT5pciwgZGF0YSk7CiAJaXJfaW5wdXRfbm9rZXkoaXItPmlucHV0X2RldiwgJmlyLT5pcik7CiB9CiAKQEAgLTU4OSw3ICs1ODksMTIgQEAKIAlzbnByaW50ZihkbTExMDUtPmlyLmlucHV0X3BoeXMsIHNpemVvZihkbTExMDUtPmlyLmlucHV0X3BoeXMpLAogCQkicGNpLSVzL2lyMCIsIHBjaV9uYW1lKGRtMTEwNS0+cGRldikpOwogCi0JaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZkbTExMDUtPmlyLmlyLCBpcl90eXBlLCBpcl9jb2Rlcyk7CisJZXJyID0gaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZkbTExMDUtPmlyLmlyLCBpcl90eXBlLCBpcl9jb2Rlcyk7CisJaWYgKGVyciA8IDApIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAlpbnB1dF9kZXYtPm5hbWUgPSAiRFZCIG9uLWNhcmQgSVIgcmVjZWl2ZXIiOwogCWlucHV0X2Rldi0+cGh5cyA9IGRtMTEwNS0+aXIuaW5wdXRfcGh5czsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOwpAQCAtNjA4LDYgKzYxMyw3IEBACiAKIAllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKIAlpZiAoZXJyKSB7CisJCWlyX2lucHV0X2ZyZWUoaW5wdXRfZGV2KTsKIAkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC02MTcsOCArNjIzLDggQEAKIAogdm9pZCBfX2RldmV4aXQgZG0xMTA1X2lyX2V4aXQoc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1KQogeworCWlyX2lucHV0X2ZyZWUoZG0xMTA1LT5pci5pbnB1dF9kZXYpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRtMTEwNS0+aXIuaW5wdXRfZGV2KTsKLQogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBkbTExMDVkdmJfaHdfaW5pdChzdHJ1Y3QgZG0xMTA1ZHZiICpkbTExMDVkdmIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCmluZGV4IDkxYzUzN2IuLmI3OGNmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiAjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCiAKQEAgLTQ0LDYgKzQ1LDExIEBACiBNT0RVTEVfUEFSTV9ERVNDKGR2Yl9kZW11eF90c2NoZWNrLAogCQkiZW5hYmxlIHRyYW5zcG9ydCBzdHJlYW0gY29udGludWl0eSBhbmQgVEVJIGNoZWNrIik7CiAKK3N0YXRpYyBpbnQgZHZiX2RlbXV4X3NwZWVkY2hlY2s7Cittb2R1bGVfcGFyYW0oZHZiX2RlbXV4X3NwZWVkY2hlY2ssIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR2Yl9kZW11eF9zcGVlZGNoZWNrLAorCQkiZW5hYmxlIHRyYW5zcG9ydCBzdHJlYW0gc3BlZWQgY2hlY2siKTsKKwogI2RlZmluZSBkcHJpbnRrX3RzY2hlY2soeC4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJaWYgKGR2Yl9kZW11eF90c2NoZWNrICYmIHByaW50a19yYXRlbGltaXQoKSkgICAgXAogCQkJcHJpbnRrKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM4Nyw2ICszOTMsMzkgQEAKIAl1MTYgcGlkID0gdHNfcGlkKGJ1Zik7CiAJaW50IGR2cl9kb25lID0gMDsKIAorCWlmIChkdmJfZGVtdXhfc3BlZWRjaGVjaykgeworCQlzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWUsIGRlbHRhX3RpbWU7CisJCXU2NCBzcGVlZF9ieXRlcywgc3BlZWRfdGltZWRlbHRhOworCisJCWRlbXV4LT5zcGVlZF9wa3RzX2NudCsrOworCisJCS8qIHNob3cgc3BlZWQgZXZlcnkgU1BFRURfUEtUU19JTlRFUlZBTCBwYWNrZXRzICovCisJCWlmICghKGRlbXV4LT5zcGVlZF9wa3RzX2NudCAlIFNQRUVEX1BLVFNfSU5URVJWQUwpKSB7CisJCQljdXJfdGltZSA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKKworCQkJaWYgKGRlbXV4LT5zcGVlZF9sYXN0X3RpbWUudHZfc2VjICE9IDAgJiYKKwkJCQkJZGVtdXgtPnNwZWVkX2xhc3RfdGltZS50dl9uc2VjICE9IDApIHsKKwkJCQlkZWx0YV90aW1lID0gdGltZXNwZWNfc3ViKGN1cl90aW1lLAorCQkJCQkJZGVtdXgtPnNwZWVkX2xhc3RfdGltZSk7CisJCQkJc3BlZWRfYnl0ZXMgPSAodTY0KWRlbXV4LT5zcGVlZF9wa3RzX2NudAorCQkJCQkqIDE4OCAqIDg7CisJCQkJLyogY29udmVydCB0byAxMDI0IGJhc2lzICovCisJCQkJc3BlZWRfYnl0ZXMgPSAxMDAwICogZGl2NjRfdTY0KHNwZWVkX2J5dGVzLAorCQkJCQkJMTAyNCk7CisJCQkJc3BlZWRfdGltZWRlbHRhID0KKwkJCQkJKHU2NCl0aW1lc3BlY190b19ucygmZGVsdGFfdGltZSk7CisJCQkJc3BlZWRfdGltZWRlbHRhID0gZGl2NjRfdTY0KHNwZWVkX3RpbWVkZWx0YSwKKwkJCQkJCTEwMDAwMDApOyAvKiBuc2VjIC0+IHVzZWMgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICJUUyBzcGVlZCAlbGx1IEtiaXRzL3NlYyBcbiIsCisJCQkJCQlkaXY2NF91NjQoc3BlZWRfYnl0ZXMsCisJCQkJCQkJc3BlZWRfdGltZWRlbHRhKSk7CisJCQl9OworCisJCQlkZW11eC0+c3BlZWRfbGFzdF90aW1lID0gY3VyX3RpbWU7CisJCQlkZW11eC0+c3BlZWRfcGt0c19jbnQgPSAwOworCQl9OworCX07CisKIAlpZiAoZHZiX2RlbXV4X3RzY2hlY2spIHsKIAkJaWYgKCFkZW11eC0+Y250X3N0b3JhZ2UpCiAJCQlkZW11eC0+Y250X3N0b3JhZ2UgPSB2bWFsbG9jKE1BWF9QSUQgKyAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmgKaW5kZXggMmZlMDVkMC4uYTdkODc2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmgKQEAgLTQ0LDYgKzQ0LDggQEAKIAogI2RlZmluZSBNQVhfUElEIDB4MWZmZgogCisjZGVmaW5lIFNQRUVEX1BLVFNfSU5URVJWQUwgNTAwMDAKKwogc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgewogCXN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgZmlsdGVyOwogCXU4IG1hc2thbmRtb2RlW0RNWF9NQVhfRklMVEVSX1NJWkVdOwpAQCAtMTMxLDYgKzEzMyw5IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCiAJdWludDhfdCAqY250X3N0b3JhZ2U7IC8qIGZvciBUUyBjb250aW51aXR5IGNoZWNrICovCisKKwlzdHJ1Y3QgdGltZXNwZWMgc3BlZWRfbGFzdF90aW1lOyAvKiBmb3IgVFMgc3BlZWQgY2hlY2sgKi8KKwl1aW50MzJfdCBzcGVlZF9wa3RzX2NudDsgLyogZm9yIFRTIHNwZWVkIGNoZWNrICovCiB9OwogCiBpbnQgZHZiX2RteF9pbml0KHN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggOTgwODI0MS4uMDc0NjEyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTg5NSwxMDQgKzg5NSwyNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGR0dl9jbWRzX2ggZHR2X2NtZHNbXSA9IHsKLQlbRFRWX1RVTkVdID0gewotCQkubmFtZQk9ICJEVFZfVFVORSIsCi0JCS5jbWQJPSBEVFZfVFVORSwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX0NMRUFSXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0NMRUFSIiwKLQkJLmNtZAk9IERUVl9DTEVBUiwKLQkJLnNldAk9IDEsCi0JfSwKKwlfRFRWX0NNRChEVFZfVFVORSwgMSwgMCksCisJX0RUVl9DTUQoRFRWX0NMRUFSLCAxLCAwKSwKIAogCS8qIFNldCAqLwotCVtEVFZfRlJFUVVFTkNZXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0ZSRVFVRU5DWSIsCi0JCS5jbWQJPSBEVFZfRlJFUVVFTkNZLAotCQkuc2V0CT0gMSwKLQl9LAotCVtEVFZfQkFORFdJRFRIX0haXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0JBTkRXSURUSF9IWiIsCi0JCS5jbWQJPSBEVFZfQkFORFdJRFRIX0haLAotCQkuc2V0CT0gMSwKLQl9LAotCVtEVFZfTU9EVUxBVElPTl0gPSB7Ci0JCS5uYW1lCT0gIkRUVl9NT0RVTEFUSU9OIiwKLQkJLmNtZAk9IERUVl9NT0RVTEFUSU9OLAotCQkuc2V0CT0gMSwKLQl9LAotCVtEVFZfSU5WRVJTSU9OXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0lOVkVSU0lPTiIsCi0JCS5jbWQJPSBEVFZfSU5WRVJTSU9OLAotCQkuc2V0CT0gMSwKLQl9LAotCVtEVFZfRElTRVFDX01BU1RFUl0gPSB7Ci0JCS5uYW1lCT0gIkRUVl9ESVNFUUNfTUFTVEVSIiwKLQkJLmNtZAk9IERUVl9ESVNFUUNfTUFTVEVSLAotCQkuc2V0CT0gMSwKLQkJLmJ1ZmZlcgk9IDEsCi0JfSwKLQlbRFRWX1NZTUJPTF9SQVRFXSA9IHsKLQkJLm5hbWUJPSAiRFRWX1NZTUJPTF9SQVRFIiwKLQkJLmNtZAk9IERUVl9TWU1CT0xfUkFURSwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX0lOTkVSX0ZFQ10gPSB7Ci0JCS5uYW1lCT0gIkRUVl9JTk5FUl9GRUMiLAotCQkuY21kCT0gRFRWX0lOTkVSX0ZFQywKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX1ZPTFRBR0VdID0gewotCQkubmFtZQk9ICJEVFZfVk9MVEFHRSIsCi0JCS5jbWQJPSBEVFZfVk9MVEFHRSwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX1RPTkVdID0gewotCQkubmFtZQk9ICJEVFZfVE9ORSIsCi0JCS5jbWQJPSBEVFZfVE9ORSwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX1BJTE9UXSA9IHsKLQkJLm5hbWUJPSAiRFRWX1BJTE9UIiwKLQkJLmNtZAk9IERUVl9QSUxPVCwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX1JPTExPRkZdID0gewotCQkubmFtZQk9ICJEVFZfUk9MTE9GRiIsCi0JCS5jbWQJPSBEVFZfUk9MTE9GRiwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX0RFTElWRVJZX1NZU1RFTV0gPSB7Ci0JCS5uYW1lCT0gIkRUVl9ERUxJVkVSWV9TWVNURU0iLAotCQkuY21kCT0gRFRWX0RFTElWRVJZX1NZU1RFTSwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX0hJRVJBUkNIWV0gPSB7Ci0JCS5uYW1lCT0gIkRUVl9ISUVSQVJDSFkiLAotCQkuY21kCT0gRFRWX0hJRVJBUkNIWSwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX0NPREVfUkFURV9IUF0gPSB7Ci0JCS5uYW1lCT0gIkRUVl9DT0RFX1JBVEVfSFAiLAotCQkuY21kCT0gRFRWX0NPREVfUkFURV9IUCwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX0NPREVfUkFURV9MUF0gPSB7Ci0JCS5uYW1lCT0gIkRUVl9DT0RFX1JBVEVfTFAiLAotCQkuY21kCT0gRFRWX0NPREVfUkFURV9MUCwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX0dVQVJEX0lOVEVSVkFMXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0dVQVJEX0lOVEVSVkFMIiwKLQkJLmNtZAk9IERUVl9HVUFSRF9JTlRFUlZBTCwKLQkJLnNldAk9IDEsCi0JfSwKLQlbRFRWX1RSQU5TTUlTU0lPTl9NT0RFXSA9IHsKLQkJLm5hbWUJPSAiRFRWX1RSQU5TTUlTU0lPTl9NT0RFIiwKLQkJLmNtZAk9IERUVl9UUkFOU01JU1NJT05fTU9ERSwKLQkJLnNldAk9IDEsCi0JfSwKKwlfRFRWX0NNRChEVFZfRlJFUVVFTkNZLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfQkFORFdJRFRIX0haLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfTU9EVUxBVElPTiwgMSwgMCksCisJX0RUVl9DTUQoRFRWX0lOVkVSU0lPTiwgMSwgMCksCisJX0RUVl9DTUQoRFRWX0RJU0VRQ19NQVNURVIsIDEsIDEpLAorCV9EVFZfQ01EKERUVl9TWU1CT0xfUkFURSwgMSwgMCksCisJX0RUVl9DTUQoRFRWX0lOTkVSX0ZFQywgMSwgMCksCisJX0RUVl9DTUQoRFRWX1ZPTFRBR0UsIDEsIDApLAorCV9EVFZfQ01EKERUVl9UT05FLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfUElMT1QsIDEsIDApLAorCV9EVFZfQ01EKERUVl9ST0xMT0ZGLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfREVMSVZFUllfU1lTVEVNLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfSElFUkFSQ0hZLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfQ09ERV9SQVRFX0hQLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfQ09ERV9SQVRFX0xQLCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfR1VBUkRfSU5URVJWQUwsIDEsIDApLAorCV9EVFZfQ01EKERUVl9UUkFOU01JU1NJT05fTU9ERSwgMSwgMCksCiAKIAlfRFRWX0NNRChEVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT04sIDEsIDApLAogCV9EVFZfQ01EKERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkcsIDEsIDApLApAQCAtMTAzNSw0MyArOTU4LDEzIEBACiAJX0RUVl9DTUQoRFRWX0lTREJTX1RTX0lELCAxLCAwKSwKIAogCS8qIEdldCAqLwotCVtEVFZfRElTRVFDX1NMQVZFX1JFUExZXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0RJU0VRQ19TTEFWRV9SRVBMWSIsCi0JCS5jbWQJPSBEVFZfRElTRVFDX1NMQVZFX1JFUExZLAotCQkuc2V0CT0gMCwKLQkJLmJ1ZmZlcgk9IDEsCi0JfSwKLQotCVtEVFZfQVBJX1ZFUlNJT05dID0gewotCQkubmFtZQk9ICJEVFZfQVBJX1ZFUlNJT04iLAotCQkuY21kCT0gRFRWX0FQSV9WRVJTSU9OLAotCQkuc2V0CT0gMCwKLQl9LAotCVtEVFZfQ09ERV9SQVRFX0hQXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0NPREVfUkFURV9IUCIsCi0JCS5jbWQJPSBEVFZfQ09ERV9SQVRFX0hQLAotCQkuc2V0CT0gMCwKLQl9LAotCVtEVFZfQ09ERV9SQVRFX0xQXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0NPREVfUkFURV9MUCIsCi0JCS5jbWQJPSBEVFZfQ09ERV9SQVRFX0xQLAotCQkuc2V0CT0gMCwKLQl9LAotCVtEVFZfR1VBUkRfSU5URVJWQUxdID0gewotCQkubmFtZQk9ICJEVFZfR1VBUkRfSU5URVJWQUwiLAotCQkuY21kCT0gRFRWX0dVQVJEX0lOVEVSVkFMLAotCQkuc2V0CT0gMCwKLQl9LAotCVtEVFZfVFJBTlNNSVNTSU9OX01PREVdID0gewotCQkubmFtZQk9ICJEVFZfVFJBTlNNSVNTSU9OX01PREUiLAotCQkuY21kCT0gRFRWX1RSQU5TTUlTU0lPTl9NT0RFLAotCQkuc2V0CT0gMCwKLQl9LAotCVtEVFZfSElFUkFSQ0hZXSA9IHsKLQkJLm5hbWUJPSAiRFRWX0hJRVJBUkNIWSIsCi0JCS5jbWQJPSBEVFZfSElFUkFSQ0hZLAotCQkuc2V0CT0gMCwKLQl9LAorCV9EVFZfQ01EKERUVl9ESVNFUUNfU0xBVkVfUkVQTFksIDAsIDEpLAorCV9EVFZfQ01EKERUVl9BUElfVkVSU0lPTiwgMCwgMCksCisJX0RUVl9DTUQoRFRWX0NPREVfUkFURV9IUCwgMCwgMCksCisJX0RUVl9DTUQoRFRWX0NPREVfUkFURV9MUCwgMCwgMCksCisJX0RUVl9DTUQoRFRWX0dVQVJEX0lOVEVSVkFMLCAwLCAwKSwKKwlfRFRWX0NNRChEVFZfVFJBTlNNSVNTSU9OX01PREUsIDAsIDApLAorCV9EVFZfQ01EKERUVl9ISUVSQVJDSFksIDAsIDApLAogfTsKIAogc3RhdGljIHZvaWQgZHR2X3Byb3BlcnR5X2R1bXAoc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwKQpAQCAtMTcxMiw3ICsxNjA1LDE4IEBACiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSA9IGR2YmRldi0+cHJpdjsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwotCWludCBlcnIgPSAtRU9QTk9UU1VQUDsKKwlpbnQgY2JfZXJyLCBlcnIgPSAtRU9QTk9UU1VQUDsKKworCWlmIChmZS0+ZHZiLT5mZV9pb2N0bF9vdmVycmlkZSkgeworCQljYl9lcnIgPSBmZS0+ZHZiLT5mZV9pb2N0bF9vdmVycmlkZShmZSwgY21kLCBwYXJnLAorCQkJCQkJICAgIERWQl9GRV9JT0NUTF9QUkUpOworCQlpZiAoY2JfZXJyIDwgMCkKKwkJCXJldHVybiBjYl9lcnI7CisJCWlmIChjYl9lcnIgPiAwKQorCQkJcmV0dXJuIDA7CisJCS8qIGZlX2lvY3RsX292ZXJyaWRlIHJldHVybmluZyAwIGFsbG93cworCQkgKiBkdmItY29yZSB0byBjb250aW51ZSBoYW5kbGluZyB0aGUgaW9jdGwgKi8KKwl9CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRkVfR0VUX0lORk86IHsKQEAgLTE5NzgsNiArMTg4MiwxMyBAQAogCQlicmVhazsKIAl9OwogCisJaWYgKGZlLT5kdmItPmZlX2lvY3RsX292ZXJyaWRlKSB7CisJCWNiX2VyciA9IGZlLT5kdmItPmZlX2lvY3RsX292ZXJyaWRlKGZlLCBjbWQsIHBhcmcsCisJCQkJCQkgICAgRFZCX0ZFX0lPQ1RMX1BPU1QpOworCQlpZiAoY2JfZXJyIDwgMCkKKwkJCXJldHVybiBjYl9lcnI7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaAppbmRleCA4MTBmMDdkLi41MmU0Y2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaApAQCAtMTYwLDcgKzE2MCw3IEBACiAgKiBzZWFyY2ggY2FsbGJhY2sgcG9zc2libGUgcmV0dXJuIHN0YXR1cwogICoKICAqIERWQkZFX0FMR09fU0VBUkNIX1NVQ0NFU1MKLSAqIFRoZSBmcm9udGVuZCBzZWFyY2ggYWxnb3JpdGhtIGNvbXBsZXRlZCBhbmQgcmV0dXJuZWQgc3VjY2VzZnVsbHkKKyAqIFRoZSBmcm9udGVuZCBzZWFyY2ggYWxnb3JpdGhtIGNvbXBsZXRlZCBhbmQgcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5CiAgKgogICogRFZCRkVfQUxHT19TRUFSQ0hfQVNMRUVQCiAgKiBUaGUgZnJvbnRlbmQgc2VhcmNoIGFsZ29yaXRobSBpcyBzbGVlcGluZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCmluZGV4IDAyNDFhN2MuLjhiODU1OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTEzOTYsNyArMTM5Niw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogYmluYXJ5IGNvbXBhdGlibGl0eSBjcnVmdCAqLworCS8qIGJpbmFyeSBjb21wYXRpYmlsaXR5IGNydWZ0ICovCiAJY2FzZSBfX05FVF9BRERfSUZfT0xEOgogCXsKIAkJc3RydWN0IF9fZHZiX25ldF9pZl9vbGQgKmR2Ym5ldGlmID0gcGFyZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKaW5kZXggMDFmYzcwNC4uZjdiNDk5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKQEAgLTU0LDYgKzU0LDggQEAKIAltb2R1bGVfcGFyYW1fYXJyYXkoYWRhcHRlcl9uciwgc2hvcnQsIE5VTEwsIDA0NDQpOyBcCiAJTU9EVUxFX1BBUk1fREVTQyhhZGFwdGVyX25yLCAiRFZCIGFkYXB0ZXIgbnVtYmVycyIpCiAKK3N0cnVjdCBkdmJfZnJvbnRlbmQ7CisKIHN0cnVjdCBkdmJfYWRhcHRlciB7CiAJaW50IG51bTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfaGVhZDsKQEAgLTY5LDYgKzcxLDMyIEBACiAJaW50IG1mZV9zaGFyZWQ7CQkJLyogaW5kaWNhdGVzIG11dHVhbGx5IGV4Y2x1c2l2ZSBmcm9udGVuZHMgKi8KIAlzdHJ1Y3QgZHZiX2RldmljZSAqbWZlX2R2YmRldjsJLyogZnJvbnRlbmQgZGV2aWNlIGluIHVzZSAqLwogCXN0cnVjdCBtdXRleCBtZmVfbG9jazsJCS8qIGFjY2VzcyBsb2NrIGZvciB0aHJlYWQgY3JlYXRpb24gKi8KKworCS8qIEFsbG93IHRoZSBhZGFwdGVyL2JyaWRnZSBkcml2ZXIgdG8gcGVyZm9ybSBhbiBhY3Rpb24gYmVmb3JlIGFuZC9vcgorCSAqIGFmdGVyIHRoZSBjb3JlIGhhbmRsZXMgYW4gaW9jdGw6CisJICoKKwkgKiBEVkJfRkVfSU9DVExfUFJFIGluZGljYXRlcyB0aGF0IHRoZSBpb2N0bCBoYXMgbm90IHlldCBiZWVuIGhhbmRsZWQuCisJICogRFZCX0ZFX0lPQ1RMX1BPU1QgaW5kaWNhdGVzIHRoYXQgdGhlIGlvY3RsIGhhcyBiZWVuIGhhbmRsZWQuCisJICoKKwkgKiBXaGVuIERWQl9GRV9JT0NUTF9QUkUgaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyB0aGUgc3RhZ2UgYXJnOgorCSAqCisJICogcmV0dXJuIDAgdG8gYWxsb3cgZHZiLWNvcmUgdG8gaGFuZGxlIHRoZSBpb2N0bC4KKwkgKiByZXR1cm4gYSBwb3NpdGl2ZSBpbnQgdG8gcHJldmVudCBkdmItY29yZSBmcm9tIGhhbmRsaW5nIHRoZSBpb2N0bCwKKwkgKiAJYW5kIGV4aXQgd2l0aG91dCBlcnJvci4KKwkgKiByZXR1cm4gYSBuZWdhdGl2ZSBpbnQgdG8gcHJldmVudCBkdmItY29yZSBmcm9tIGhhbmRsaW5nIHRoZSBpb2N0bCwKKwkgKiAJYW5kIHJldHVybiB0aGF0IHZhbHVlIGFzIGFuIGVycm9yLgorCSAqCisJICogV2hlbiBEVkJfRkVfSU9DVExfUE9TVCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzIHRoZSBzdGFnZSBhcmc6CisJICoKKwkgKiByZXR1cm4gMCB0byBhbGxvdyB0aGUgZHZiX2Zyb250ZW5kIGlvY3RsIGhhbmRsZXIgdG8gZXhpdCBub3JtYWxseS4KKwkgKiByZXR1cm4gYSBuZWdhdGl2ZSBpbnQgdG8gY2F1c2UgdGhlIGR2Yl9mcm9udGVuZCBpb2N0bCBoYW5kbGVyIHRvCisJICogCXJldHVybiB0aGF0IHZhbHVlIGFzIGFuIGVycm9yLgorCSAqLworI2RlZmluZSBEVkJfRkVfSU9DVExfUFJFIDAKKyNkZWZpbmUgRFZCX0ZFX0lPQ1RMX1BPU1QgMQorCWludCAoKmZlX2lvY3RsX292ZXJyaWRlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZywKKwkJCQkgdW5zaWduZWQgaW50IHN0YWdlKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCmluZGV4IDBlNGI5N2YuLjJkZWUxYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKQEAgLTMyMiwzICszMjIsMTEgQEAKIAlkZXBlbmRzIG9uIERWQl9VU0IKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEphcGFuZXNlIERUViByZWNlaXZlciBGcmlpby4KKworY29uZmlnIERWQl9VU0JfRUMxNjgKKwl0cmlzdGF0ZSAiRTNDIEVDMTY4IERWQi1UIFVTQjIuMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gRFZCX1VTQiAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgRFZCX0VDMTAwCisJc2VsZWN0IE1FRElBX1RVTkVSX01YTDUwMDVTIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEUzQyBFQzE2OCBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQppbmRleCA4NWI4M2E0Li43MmM5MmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKQEAgLTgyLDYgKzgyLDkgQEAKIGR2Yi11c2ItZnJpaW8tb2JqcyA9IGZyaWlvLm8gZnJpaW8tZmUubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRlJJSU8pICs9IGR2Yi11c2ItZnJpaW8ubwogCitkdmItdXNiLWVjMTY4LW9ianMgPSBlYzE2OC5vCitvYmotJChDT05GSUdfRFZCX1VTQl9FQzE2OCkgKz0gZHZiLXVzYi1lYzE2OC5vCisKIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KICMgZHVlIHRvIHR1bmVyLXhjMzAyOAogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYwppbmRleCBjZjA0MmIzLi44YjYwYTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKQEAgLTczMCw3ICs3MzAsNyBAQAogCQlnb3RvIGVycm9yOwogCWRlYl9pbmZvKCIlczogSVIgbW9kZTolZFxuIiwgX19mdW5jX18sIHZhbCk7CiAJZm9yIChpID0gMDsgaSA8IGFmOTAxNV9wcm9wZXJ0aWVzX2NvdW50OyBpKyspIHsKLQkJaWYgKHZhbCA9PSBBRjkwMTVfSVJfTU9ERV9ESVNBQkxFRCB8fCB2YWwgPT0gMHgwNCkgeworCQlpZiAodmFsID09IEFGOTAxNV9JUl9NT0RFX0RJU0FCTEVEKSB7CiAJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwID0gTlVMTDsKIAkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSAgPSAwOwogCQl9IGVsc2UgaWYgKGR2Yl91c2JfYWY5MDE1X3JlbW90ZSkgewpAQCAtODY4LDYgKzg2OCwxNiBAQAogCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGVfc2l6ZSA9CiAJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9pcl90YWJsZV9hdmVybWVkaWEpOwogCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfVklEX01TSV8yOgorCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXAgPQorCQkJCSAgYWY5MDE1X3JjX2tleXNfbXNpX2RpZ2l2b3hfaWlpOworCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9yY19rZXlzX21zaV9kaWdpdm94X2lpaSk7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZSA9CisJCQkJICBhZjkwMTVfaXJfdGFibGVfbXNpX2RpZ2l2b3hfaWlpOworCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGVfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9pcl90YWJsZV9tc2lfZGlnaXZveF9paWkpOworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJfQpAQCAtMTI4Myw2ICsxMjkzLDggQEAKIAl7VVNCX0RFVklDRShVU0JfVklEX0tXT1JMRF8yLCAgVVNCX1BJRF9LV09STERfTUM4MTApfSwKIAl7VVNCX0RFVklDRShVU0JfVklEX0tZRSwgICAgICAgVVNCX1BJRF9HRU5JVVNfVFZHT19EVkJfVDAzKX0sCiAvKiAyNSAqL3tVU0JfREVWSUNFKFVTQl9WSURfS1dPUkxEXzIsICBVU0JfUElEX0tXT1JMRF8zOTlVXzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVklEX0tXT1JMRF8yLCAgVVNCX1BJRF9LV09STERfUEMxNjBfVCl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfS1dPUkxEXzIsICBVU0JfUElEX1NWRU9OX1NUVjIwKX0sCiAJezB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBhZjkwMTVfdXNiX3RhYmxlKTsKQEAgLTEyOTYsNyArMTMwOCw3IEBACiAJCS5maXJtd2FyZSA9ICJkdmItdXNiLWFmOTAxNS5mdyIsCiAJCS5ub19yZWNvbm5lY3QgPSAxLAogCi0JCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0IGFmOTAxNV9zdGF0ZSksIFwKKwkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QgYWY5MDE1X3N0YXRlKSwKIAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CkBAIC0xNDAyLDcgKzE0MTQsNyBAQAogCQkuZmlybXdhcmUgPSAiZHZiLXVzYi1hZjkwMTUuZnciLAogCQkubm9fcmVjb25uZWN0ID0gMSwKIAotCQkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdCBhZjkwMTVfc3RhdGUpLCBcCisJCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0IGFmOTAxNV9zdGF0ZSksCiAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewpAQCAtMTUwOCw3ICsxNTIwLDcgQEAKIAkJLmZpcm13YXJlID0gImR2Yi11c2ItYWY5MDE1LmZ3IiwKIAkJLm5vX3JlY29ubmVjdCA9IDEsCiAKLQkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QgYWY5MDE1X3N0YXRlKSwgXAorCQkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdCBhZjkwMTVfc3RhdGUpLAogCiAJCS5udW1fYWRhcHRlcnMgPSAyLAogCQkuYWRhcHRlciA9IHsKQEAgLTE1NTQsNyArMTU2Niw3IEBACiAKIAkJLmkyY19hbGdvID0gJmFmOTAxNV9pMmNfYWxnbywKIAotCQkubnVtX2RldmljZV9kZXNjcyA9IDQsIC8qIG1heCA5ICovCisJCS5udW1fZGV2aWNlX2Rlc2NzID0gNiwgLyogbWF4IDkgKi8KIAkJLmRldmljZXMgPSB7CiAJCQl7CiAJCQkJLm5hbWUgPSAiQXZlck1lZGlhIEFWZXJUViBWb2xhciBHUFMgODA1IChBODA1KSIsCkBAIC0xNTc3LDYgKzE1ODksMTcgQEAKIAkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMjRdLCBOVUxMfSwKIAkJCQkud2FybV9pZHMgPSB7TlVMTH0sCiAJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIktXb3JsZCBQbHVzVFYgRFZCLVQgUENJIFBybyBDYXJkICIgXAorCQkJCQkiKERWQi1UIFBDMTYwLVQpIiwKKwkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMjZdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlN2ZW9uIFNUVjIwIFR1bmVyIFVTQiBEVkItVCBIRFRWIiwKKwkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMjddLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAogCQl9CiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaAppbmRleCBjNDFmMzBlLi45MzFjODUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmgKQEAgLTk1LDYgKzk1LDcgQEAKIAlBRjkwMTVfSVJfTU9ERV9ISUQsCiAJQUY5MDE1X0lSX01PREVfUkxDLAogCUFGOTAxNV9JUl9NT0RFX1JDNiwKKwlBRjkwMTVfSVJfTU9ERV9QT0xMSU5HLCAvKiBqdXN0IGd1ZXNzICovCiB9OwogCiBzdHJ1Y3QgYWY5MDE1X3N0YXRlIHsKQEAgLTExOSw2ICsxMjAsNyBAQAogLyogNSAqLwlBRjkwMTVfUkVNT1RFX0FWRVJNRURJQV9LUywKIH07CiAKKy8qIExlYWRUZWsgLSBZMDRHMDA1MSAqLwogLyogTGVhZHRlayBXaW5GYXN0IERUViBEb25nbGUgR29sZCAqLwogc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBhZjkwMTVfcmNfa2V5c19sZWFkdGVrW10gPSB7CiAJeyAweDAwMWUsIEtFWV8xIH0sCkBAIC0xMzEsNjQgKzEzMyw5NiBAQAogCXsgMHgwMDI1LCBLRVlfOCB9LAogCXsgMHgwMDI2LCBLRVlfOSB9LAogCXsgMHgwMDI3LCBLRVlfMCB9LAotCXsgMHgwMDI4LCBLRVlfRU5URVIgfSwKLQl7IDB4MDA0ZiwgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDAwNTAsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweDAwNTEsIEtFWV9DSEFOTkVMRE9XTiB9LAotCXsgMHgwMDUyLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDAwMjgsIEtFWV9PSyB9LAorCXsgMHgwMDRmLCBLRVlfUklHSFQgfSwKKwl7IDB4MDA1MCwgS0VZX0xFRlQgfSwKKwl7IDB4MDA1MSwgS0VZX0RPV04gfSwKKwl7IDB4MDA1MiwgS0VZX1VQIH0sCisJeyAweDAxMWEsIEtFWV9QT1dFUjIgfSwKKwl7IDB4MDRiNCwgS0VZX1RWIH0sCisJeyAweDA0YjMsIEtFWV9SRUQgfSwKKwl7IDB4MDRiMiwgS0VZX0dSRUVOIH0sCisJeyAweDA0YjEsIEtFWV9ZRUxMT1cgfSwKKwl7IDB4MDRiMCwgS0VZX0JMVUUgfSwKKwl7IDB4MDAzZCwgS0VZX1RFWFQgfSwKKwl7IDB4MDExMywgS0VZX1NMRUVQIH0sCisJeyAweDAwMTAsIEtFWV9NVVRFIH0sCisJeyAweDAxMDUsIEtFWV9FU0MgfSwKKwl7IDB4MDAwOSwgS0VZX1NDUkVFTiB9LAorCXsgMHgwMTBmLCBLRVlfTUVOVSB9LAorCXsgMHgwMDNmLCBLRVlfQ0hBTk5FTCB9LAorCXsgMHgwMDEzLCBLRVlfUkVXSU5EIH0sCisJeyAweDAwMTIsIEtFWV9QTEFZIH0sCisJeyAweDAwMTEsIEtFWV9GQVNURk9SV0FSRCB9LAorCXsgMHgwMDA1LCBLRVlfUFJFVklPVVMgfSwKKwl7IDB4MDAyOSwgS0VZX1NUT1AgfSwKKwl7IDB4MDAyYiwgS0VZX05FWFQgfSwKKwl7IDB4MDA0MSwgS0VZX0VQRyB9LAorCXsgMHgwMDE5LCBLRVlfVklERU8gfSwKKwl7IDB4MDAxNiwgS0VZX0FVRElPIH0sCisJeyAweDAwMzcsIEtFWV9ET1QgfSwKKwl7IDB4MDAyYSwgS0VZX0FHQUlOIH0sCisJeyAweDAwMmMsIEtFWV9DQU1FUkEgfSwKKwl7IDB4MDAzYywgS0VZX05FVyB9LAorCXsgMHgwMTE1LCBLRVlfUkVDT1JEIH0sCisJeyAweDAxMGIsIEtFWV9USU1FIH0sCisJeyAweDAwNDMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwMDQyLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMDRiLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDAwNGUsIEtFWV9DSEFOTkVMRE9XTiB9LAogfTsKIAogc3RhdGljIHU4IGFmOTAxNV9pcl90YWJsZV9sZWFkdGVrW10gPSB7Ci0JMHgwMywgMHhmYywgMHgwMCwgMHhmZiwgMHgxYSwgMHgwMSwgMHgwMCwKLQkweDAzLCAweGZjLCAweDU2LCAweGE5LCAweDAwLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4NGIsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg0YywgMHhiMywgMHhiMiwgMHgwNCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDRkLCAweGIyLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4NGUsIDB4YjEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHgxZiwgMHhlMCwgMHgzZCwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDQwLCAweGJmLCAweDEzLCAweDAxLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MTQsIDB4ZWIsIDB4MTAsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg0OSwgMHhiNiwgMHgwNSwgMHgwMSwgMHgwMCwKLQkweDAzLCAweGZjLCAweDUwLCAweGFmLCAweDI5LCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MGMsIDB4ZjMsIDB4NTIsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHgwMywgMHhmYywgMHgwOSwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDA4LCAweGY3LCAweDUwLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MTMsIDB4ZWMsIDB4MjgsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHgwNCwgMHhmYiwgMHg0ZiwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDRmLCAweGIwLCAweDBmLCAweDAxLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MTAsIDB4ZWYsIDB4NTEsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg1MSwgMHhhZSwgMHgzZiwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDQyLCAweGJkLCAweDEzLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4NDMsIDB4YmMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg0NCwgMHhiYiwgMHgxMSwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDUyLCAweGFkLCAweDE5LCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4NTQsIDB4YWIsIDB4MDUsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg0NiwgMHhiOSwgMHgyOSwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDU1LCAweGFhLCAweDJiLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4NTMsIDB4YWMsIDB4NDEsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHgwNSwgMHhmYSwgMHgxZSwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDA2LCAweGY5LCAweDFmLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MDcsIDB4ZjgsIDB4MjAsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHgxZSwgMHhlMSwgMHgxOSwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDA5LCAweGY2LCAweDIxLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MGEsIDB4ZjUsIDB4MjIsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHgwYiwgMHhmNCwgMHgyMywgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDFiLCAweGU0LCAweDE2LCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MGQsIDB4ZjIsIDB4MjQsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHgwZSwgMHhmMSwgMHgyNSwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDBmLCAweGYwLCAweDI2LCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MTYsIDB4ZTksIDB4MjgsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg0MSwgMHhiZSwgMHgzNywgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDEyLCAweGVkLCAweDI3LCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4MTEsIDB4ZWUsIDB4MmEsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg0OCwgMHhiNywgMHgyYywgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDRhLCAweGI1LCAweDNjLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4NDcsIDB4YjgsIDB4MTUsIDB4MDEsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg0NSwgMHhiYSwgMHgwYiwgMHgwMSwgMHgwMCwKLQkweDAzLCAweGZjLCAweDVlLCAweGExLCAweDQzLCAweDAwLCAweDAwLAotCTB4MDMsIDB4ZmMsIDB4NWEsIDB4YTUsIDB4NDIsIDB4MDAsIDB4MDAsCi0JMHgwMywgMHhmYywgMHg1YiwgMHhhNCwgMHg0YiwgMHgwMCwgMHgwMCwKLQkweDAzLCAweGZjLCAweDVmLCAweGEwLCAweDRlLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MDAsIDB4ZmYsIDB4MWEsIDB4MDEsIDB4MDAsIC8qIEtFWV9QT1dFUjIgKi8KKwkweDAzLCAweGZjLCAweDU2LCAweGE5LCAweGI0LCAweDA0LCAweDAwLCAvKiBLRVlfVFYgKi8KKwkweDAzLCAweGZjLCAweDRiLCAweGI0LCAweGIzLCAweDA0LCAweDAwLCAvKiBLRVlfUkVEICovCisJMHgwMywgMHhmYywgMHg0YywgMHhiMywgMHhiMiwgMHgwNCwgMHgwMCwgLyogS0VZX0dSRUVOICovCisJMHgwMywgMHhmYywgMHg0ZCwgMHhiMiwgMHhiMSwgMHgwNCwgMHgwMCwgLyogS0VZX1lFTExPVyAqLworCTB4MDMsIDB4ZmMsIDB4NGUsIDB4YjEsIDB4YjAsIDB4MDQsIDB4MDAsIC8qIEtFWV9CTFVFICovCisJMHgwMywgMHhmYywgMHgxZiwgMHhlMCwgMHgzZCwgMHgwMCwgMHgwMCwgLyogS0VZX1RFWFQgKi8KKwkweDAzLCAweGZjLCAweDQwLCAweGJmLCAweDEzLCAweDAxLCAweDAwLCAvKiBLRVlfU0xFRVAgKi8KKwkweDAzLCAweGZjLCAweDE0LCAweGViLCAweDEwLCAweDAwLCAweDAwLCAvKiBLRVlfTVVURSAqLworCTB4MDMsIDB4ZmMsIDB4NDksIDB4YjYsIDB4MDUsIDB4MDEsIDB4MDAsIC8qIEtFWV9FU0MgKi8KKwkweDAzLCAweGZjLCAweDUwLCAweGFmLCAweDI5LCAweDAwLCAweDAwLCAvKiBLRVlfU1RPUCAoMSkqLworCTB4MDMsIDB4ZmMsIDB4MGMsIDB4ZjMsIDB4NTIsIDB4MDAsIDB4MDAsIC8qIEtFWV9VUCAqLworCTB4MDMsIDB4ZmMsIDB4MDMsIDB4ZmMsIDB4MDksIDB4MDAsIDB4MDAsIC8qIEtFWV9TQ1JFRU4gKi8KKwkweDAzLCAweGZjLCAweDA4LCAweGY3LCAweDUwLCAweDAwLCAweDAwLCAvKiBLRVlfTEVGVCAqLworCTB4MDMsIDB4ZmMsIDB4MTMsIDB4ZWMsIDB4MjgsIDB4MDAsIDB4MDAsIC8qIEtFWV9PSyAoMSkgKi8KKwkweDAzLCAweGZjLCAweDA0LCAweGZiLCAweDRmLCAweDAwLCAweDAwLCAvKiBLRVlfUklHSFQgKi8KKwkweDAzLCAweGZjLCAweDRmLCAweGIwLCAweDBmLCAweDAxLCAweDAwLCAvKiBLRVlfTUVOVSAqLworCTB4MDMsIDB4ZmMsIDB4MTAsIDB4ZWYsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIEtFWV9ET1dOICovCisJMHgwMywgMHhmYywgMHg1MSwgMHhhZSwgMHgzZiwgMHgwMCwgMHgwMCwgLyogS0VZX0NIQU5ORUwgKi8KKwkweDAzLCAweGZjLCAweDQyLCAweGJkLCAweDEzLCAweDAwLCAweDAwLCAvKiBLRVlfUkVXSU5EICovCisJMHgwMywgMHhmYywgMHg0MywgMHhiYywgMHgxMiwgMHgwMCwgMHgwMCwgLyogS0VZX1BMQVkgKi8KKwkweDAzLCAweGZjLCAweDQ0LCAweGJiLCAweDExLCAweDAwLCAweDAwLCAvKiBLRVlfRkFTVEZPUldBUkQgKi8KKwkweDAzLCAweGZjLCAweDUyLCAweGFkLCAweDE5LCAweDAwLCAweDAwLCAvKiBLRVlfVklERU8gKDEpICovCisJMHgwMywgMHhmYywgMHg1NCwgMHhhYiwgMHgwNSwgMHgwMCwgMHgwMCwgLyogS0VZX1BSRVZJT1VTICovCisJMHgwMywgMHhmYywgMHg0NiwgMHhiOSwgMHgyOSwgMHgwMCwgMHgwMCwgLyogS0VZX1NUT1AgKDIpICovCisJMHgwMywgMHhmYywgMHg1NSwgMHhhYSwgMHgyYiwgMHgwMCwgMHgwMCwgLyogS0VZX05FWFQgKi8KKwkweDAzLCAweGZjLCAweDUzLCAweGFjLCAweDQxLCAweDAwLCAweDAwLCAvKiBLRVlfRVBHICovCisJMHgwMywgMHhmYywgMHgwNSwgMHhmYSwgMHgxZSwgMHgwMCwgMHgwMCwgLyogS0VZXzEgKi8KKwkweDAzLCAweGZjLCAweDA2LCAweGY5LCAweDFmLCAweDAwLCAweDAwLCAvKiBLRVlfMiAqLworCTB4MDMsIDB4ZmMsIDB4MDcsIDB4ZjgsIDB4MjAsIDB4MDAsIDB4MDAsIC8qIEtFWV8zICovCisJMHgwMywgMHhmYywgMHgxZSwgMHhlMSwgMHgxOSwgMHgwMCwgMHgwMCwgLyogS0VZX1ZJREVPICgyKSAqLworCTB4MDMsIDB4ZmMsIDB4MDksIDB4ZjYsIDB4MjEsIDB4MDAsIDB4MDAsIC8qIEtFWV80ICovCisJMHgwMywgMHhmYywgMHgwYSwgMHhmNSwgMHgyMiwgMHgwMCwgMHgwMCwgLyogS0VZXzUgKi8KKwkweDAzLCAweGZjLCAweDBiLCAweGY0LCAweDIzLCAweDAwLCAweDAwLCAvKiBLRVlfNiAqLworCTB4MDMsIDB4ZmMsIDB4MWIsIDB4ZTQsIDB4MTYsIDB4MDAsIDB4MDAsIC8qIEtFWV9BVURJTyAqLworCTB4MDMsIDB4ZmMsIDB4MGQsIDB4ZjIsIDB4MjQsIDB4MDAsIDB4MDAsIC8qIEtFWV83ICovCisJMHgwMywgMHhmYywgMHgwZSwgMHhmMSwgMHgyNSwgMHgwMCwgMHgwMCwgLyogS0VZXzggKi8KKwkweDAzLCAweGZjLCAweDBmLCAweGYwLCAweDI2LCAweDAwLCAweDAwLCAvKiBLRVlfOSAqLworCTB4MDMsIDB4ZmMsIDB4MTYsIDB4ZTksIDB4MjgsIDB4MDAsIDB4MDAsIC8qIEtFWV9PSyAoMikgKi8KKwkweDAzLCAweGZjLCAweDQxLCAweGJlLCAweDM3LCAweDAwLCAweDAwLCAvKiBLRVlfRE9UICovCisJMHgwMywgMHhmYywgMHgxMiwgMHhlZCwgMHgyNywgMHgwMCwgMHgwMCwgLyogS0VZXzAgKi8KKwkweDAzLCAweGZjLCAweDExLCAweGVlLCAweDJhLCAweDAwLCAweDAwLCAvKiBLRVlfQUdBSU4gKi8KKwkweDAzLCAweGZjLCAweDQ4LCAweGI3LCAweDJjLCAweDAwLCAweDAwLCAvKiBLRVlfQ0FNRVJBICovCisJMHgwMywgMHhmYywgMHg0YSwgMHhiNSwgMHgzYywgMHgwMCwgMHgwMCwgLyogS0VZX05FVyAqLworCTB4MDMsIDB4ZmMsIDB4NDcsIDB4YjgsIDB4MTUsIDB4MDEsIDB4MDAsIC8qIEtFWV9SRUNPUkQgKi8KKwkweDAzLCAweGZjLCAweDQ1LCAweGJhLCAweDBiLCAweDAxLCAweDAwLCAvKiBLRVlfVElNRSAqLworCTB4MDMsIDB4ZmMsIDB4NWUsIDB4YTEsIDB4NDMsIDB4MDAsIDB4MDAsIC8qIEtFWV9WT0xVTUVVUCAqLworCTB4MDMsIDB4ZmMsIDB4NWEsIDB4YTUsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIEtFWV9WT0xVTUVET1dOICovCisJMHgwMywgMHhmYywgMHg1YiwgMHhhNCwgMHg0YiwgMHgwMCwgMHgwMCwgLyogS0VZX0NIQU5ORUxVUCAqLworCTB4MDMsIDB4ZmMsIDB4NWYsIDB4YTAsIDB4NGUsIDB4MDAsIDB4MDAsIC8qIEtFWV9DSEFOTkVMRE9XTiAqLwogfTsKIAogLyogVHdpbkhhbiBBenVyZVdhdmUgQUQtVFU3MDAoNzA0SikgKi8KQEAgLTc0Niw0ICs3ODAsNzUgQEAKIAkweDAwLCAweGZmLCAweDg0LCAweDdiLCAweDI3LCAweDA3LCAweDAwLAogfTsKIAorLyogTVNJIERJR0lWT1ggbWluaSBJSUkgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgYWY5MDE1X3JjX2tleXNfbXNpX2RpZ2l2b3hfaWlpW10gPSB7CisJeyAweDA3MTMsIEtFWV9QT1dFUiB9LCAgICAgICAvKiBbcmVkIHBvd2VyIGJ1dHRvbl0gKi8KKwl7IDB4MDczYiwgS0VZX1ZJREVPIH0sICAgICAgIC8qIFNvdXJjZSAqLworCXsgMHgwNzNlLCBLRVlfWk9PTSB9LCAgICAgICAgLyogWm9vbSAqLworCXsgMHgwNzBiLCBLRVlfUE9XRVIyIH0sICAgICAgLyogU2h1dERvd24gKi8KKwl7IDB4MDcxZSwgS0VZXzEgfSwKKwl7IDB4MDcxZiwgS0VZXzIgfSwKKwl7IDB4MDcyMCwgS0VZXzMgfSwKKwl7IDB4MDcyMSwgS0VZXzQgfSwKKwl7IDB4MDcyMiwgS0VZXzUgfSwKKwl7IDB4MDcyMywgS0VZXzYgfSwKKwl7IDB4MDcyNCwgS0VZXzcgfSwKKwl7IDB4MDcyNSwgS0VZXzggfSwKKwl7IDB4MDcyNiwgS0VZXzkgfSwKKwl7IDB4MDcyNywgS0VZXzAgfSwKKwl7IDB4MDc1MiwgS0VZX0NIQU5ORUxVUCB9LCAgIC8qIENIKyAqLworCXsgMHgwNzUxLCBLRVlfQ0hBTk5FTERPV04gfSwgLyogQ0gtICovCisJeyAweDA3NTAsIEtFWV9WT0xVTUVVUCB9LCAgICAvKiBWb2wrICovCisJeyAweDA3NGYsIEtFWV9WT0xVTUVET1dOIH0sICAvKiBWb2wtICovCisJeyAweDA3MDUsIEtFWV9FU0MgfSwgICAgICAgICAvKiBbYmFjayB1cCBhcnJvd10gKi8KKwl7IDB4MDcwOCwgS0VZX09LIH0sICAgICAgICAgIC8qIFtlbnRlciBhcnJvd10gKi8KKwl7IDB4MDczZiwgS0VZX1JFQ09SRCB9LCAgICAgIC8qIFJlYyAqLworCXsgMHgwNzE2LCBLRVlfU1RPUCB9LCAgICAgICAgLyogU3RvcCAqLworCXsgMHgwNzJhLCBLRVlfUExBWSB9LCAgICAgICAgLyogUGxheSAqLworCXsgMHgwNzNjLCBLRVlfTVVURSB9LCAgICAgICAgLyogTXV0ZSAqLworCXsgMHgwNzE4LCBLRVlfVVAgfSwKKwl7IDB4MDcwNywgS0VZX0RPV04gfSwKKwl7IDB4MDcwZiwgS0VZX0xFRlQgfSwKKwl7IDB4MDcxNSwgS0VZX1JJR0hUIH0sCisJeyAweDA3MzYsIEtFWV9SRUQgfSwKKwl7IDB4MDczNywgS0VZX0dSRUVOIH0sCisJeyAweDA3MmQsIEtFWV9ZRUxMT1cgfSwKKwl7IDB4MDcyZSwgS0VZX0JMVUUgfSwKK307CisKK3N0YXRpYyB1OCBhZjkwMTVfaXJfdGFibGVfbXNpX2RpZ2l2b3hfaWlpW10gPSB7CisJMHg2MSwgMHhkNiwgMHg0MywgMHhiYywgMHgxMywgMHgwNywgMHgwMCwgLyogS0VZX1BPV0VSICovCisJMHg2MSwgMHhkNiwgMHgwMSwgMHhmZSwgMHgzYiwgMHgwNywgMHgwMCwgLyogS0VZX1ZJREVPICovCisJMHg2MSwgMHhkNiwgMHgwYiwgMHhmNCwgMHgzZSwgMHgwNywgMHgwMCwgLyogS0VZX1pPT00gKi8KKwkweDYxLCAweGQ2LCAweDAzLCAweGZjLCAweDBiLCAweDA3LCAweDAwLCAvKiBLRVlfUE9XRVIyICovCisJMHg2MSwgMHhkNiwgMHgwNCwgMHhmYiwgMHgxZSwgMHgwNywgMHgwMCwgLyogS0VZXzEgKi8KKwkweDYxLCAweGQ2LCAweDA4LCAweGY3LCAweDFmLCAweDA3LCAweDAwLCAvKiBLRVlfMiAqLworCTB4NjEsIDB4ZDYsIDB4MDIsIDB4ZmQsIDB4MjAsIDB4MDcsIDB4MDAsIC8qIEtFWV8zICovCisJMHg2MSwgMHhkNiwgMHgwZiwgMHhmMCwgMHgyMSwgMHgwNywgMHgwMCwgLyogS0VZXzQgKi8KKwkweDYxLCAweGQ2LCAweDA1LCAweGZhLCAweDIyLCAweDA3LCAweDAwLCAvKiBLRVlfNSAqLworCTB4NjEsIDB4ZDYsIDB4MDYsIDB4ZjksIDB4MjMsIDB4MDcsIDB4MDAsIC8qIEtFWV82ICovCisJMHg2MSwgMHhkNiwgMHgwYywgMHhmMywgMHgyNCwgMHgwNywgMHgwMCwgLyogS0VZXzcgKi8KKwkweDYxLCAweGQ2LCAweDBkLCAweGYyLCAweDI1LCAweDA3LCAweDAwLCAvKiBLRVlfOCAqLworCTB4NjEsIDB4ZDYsIDB4MGEsIDB4ZjUsIDB4MjYsIDB4MDcsIDB4MDAsIC8qIEtFWV85ICovCisJMHg2MSwgMHhkNiwgMHgxMSwgMHhlZSwgMHgyNywgMHgwNywgMHgwMCwgLyogS0VZXzAgKi8KKwkweDYxLCAweGQ2LCAweDA5LCAweGY2LCAweDUyLCAweDA3LCAweDAwLCAvKiBLRVlfQ0hBTk5FTFVQICovCisJMHg2MSwgMHhkNiwgMHgwNywgMHhmOCwgMHg1MSwgMHgwNywgMHgwMCwgLyogS0VZX0NIQU5ORUxET1dOICovCisJMHg2MSwgMHhkNiwgMHgwZSwgMHhmMSwgMHg1MCwgMHgwNywgMHgwMCwgLyogS0VZX1ZPTFVNRVVQICovCisJMHg2MSwgMHhkNiwgMHgxMywgMHhlYywgMHg0ZiwgMHgwNywgMHgwMCwgLyogS0VZX1ZPTFVNRURPV04gKi8KKwkweDYxLCAweGQ2LCAweDEwLCAweGVmLCAweDA1LCAweDA3LCAweDAwLCAvKiBLRVlfRVNDICovCisJMHg2MSwgMHhkNiwgMHgxMiwgMHhlZCwgMHgwOCwgMHgwNywgMHgwMCwgLyogS0VZX09LICovCisJMHg2MSwgMHhkNiwgMHgxNCwgMHhlYiwgMHgzZiwgMHgwNywgMHgwMCwgLyogS0VZX1JFQ09SRCAqLworCTB4NjEsIDB4ZDYsIDB4MTUsIDB4ZWEsIDB4MTYsIDB4MDcsIDB4MDAsIC8qIEtFWV9TVE9QICovCisJMHg2MSwgMHhkNiwgMHgxNiwgMHhlOSwgMHgyYSwgMHgwNywgMHgwMCwgLyogS0VZX1BMQVkgKi8KKwkweDYxLCAweGQ2LCAweDE3LCAweGU4LCAweDNjLCAweDA3LCAweDAwLCAvKiBLRVlfTVVURSAqLworCTB4NjEsIDB4ZDYsIDB4MTgsIDB4ZTcsIDB4MTgsIDB4MDcsIDB4MDAsIC8qIEtFWV9VUCAqLworCTB4NjEsIDB4ZDYsIDB4MTksIDB4ZTYsIDB4MDcsIDB4MDcsIDB4MDAsIC8qIEtFWV9ET1dOICovCisJMHg2MSwgMHhkNiwgMHgxYSwgMHhlNSwgMHgwZiwgMHgwNywgMHgwMCwgLyogS0VZX0xFRlQgKi8KKwkweDYxLCAweGQ2LCAweDFiLCAweGU0LCAweDE1LCAweDA3LCAweDAwLCAvKiBLRVlfUklHSFQgKi8KKwkweDYxLCAweGQ2LCAweDFjLCAweGUzLCAweDM2LCAweDA3LCAweDAwLCAvKiBLRVlfUkVEICovCisJMHg2MSwgMHhkNiwgMHgxZCwgMHhlMiwgMHgzNywgMHgwNywgMHgwMCwgLyogS0VZX0dSRUVOICovCisJMHg2MSwgMHhkNiwgMHgxZSwgMHhlMSwgMHgyZCwgMHgwNywgMHgwMCwgLyogS0VZX1lFTExPVyAqLworCTB4NjEsIDB4ZDYsIDB4MWYsIDB4ZTAsIDB4MmUsIDB4MDcsIDB4MDAsIC8qIEtFWV9CTFVFICovCit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCmluZGV4IDJhZTdmNjQuLmJiNjlmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWVycigiVW5rb3duIEFueXNlZSB2ZXJzaW9uOiAlMDJ4ICUwMnggJTAyeC4gIlwKKwllcnIoIlVua25vd24gQW55c2VlIHZlcnNpb246ICUwMnggJTAyeCAlMDJ4LiAiXAogCSAgICAiUGxlYXNlIHJlcG9ydCB0aGUgPGxpbnV4LWR2YkBsaW51eHR2Lm9yZz4uIiwKIAkgICAgaHdfaW5mb1swXSwgaHdfaW5mb1sxXSwgaHdfaW5mb1syXSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCAyYTUzZGQwLi4wNWZiMjhlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwpAQCAtMzYsOSArMzYsMTEgQEAKICNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKICNpbmNsdWRlICJ0dW5lci1zaW1wbGUuaCIKICNpbmNsdWRlICJteGw1MDA1cy5oIgorI2luY2x1ZGUgIm1heDIxNjUuaCIKICNpbmNsdWRlICJkaWI3MDAwcC5oIgogI2luY2x1ZGUgImRpYjAwNzAuaCIKICNpbmNsdWRlICJsZ3M4Z3h4LmgiCisjaW5jbHVkZSAiYXRibTg4MzAuaCIKIAogLyogZGVidWcgKi8KIHN0YXRpYyBpbnQgZHZiX3VzYl9jeHVzYl9kZWJ1ZzsKQEAgLTcxNCw2ICs3MTYsMTEgQEAKIAkuQWdjTWFzdGVyQnl0ZSAgID0gMHgwMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWF4MjE2NV9jb25maWcgbXlnaWNhX2Q2ODlfbWF4MjE2NV9jZmcgPSB7CisJLmkyY19hZGRyZXNzID0gMHg2MCwKKwkub3NjX2NsayA9IDIwCit9OworCiAvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KIHN0YXRpYyBpbnQgY3h1c2JfZm1kMTIxNm1lX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewpAQCAtODEzLDYgKzgyMCwxNCBAQAogCXJldHVybiAoZmUgPT0gTlVMTCkgPyAtRUlPIDogMDsKIH0KIAorc3RhdGljIGludCBjeHVzYl9teWdpY2FfZDY4OV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKKwlmZSA9IGR2Yl9hdHRhY2gobWF4MjE2NV9hdHRhY2gsIGFkYXAtPmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZteWdpY2FfZDY4OV9tYXgyMTY1X2NmZyk7CisJcmV0dXJuIChmZSA9PSBOVUxMKSA/IC1FSU8gOiAwOworfQorCiBzdGF0aWMgaW50IGN4dXNiX2N4MjI3MDJfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJdTggYjsKQEAgLTExNjAsNiArMTE3NSw1NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGF0Ym04ODMwX2NvbmZpZyBteWdpY2FfZDY4OV9hdGJtODgzMF9jZmcgPSB7CisJLnByb2QgPSBBVEJNODgzMF9QUk9EXzg4MzAsCisJLmRlbW9kX2FkZHJlc3MgPSAweDQwLAorCS5zZXJpYWxfdHMgPSAwLAorCS50c19zYW1wbGluZ19lZGdlID0gMSwKKwkudHNfY2xrX2dhdGVkID0gMCwKKwkub3NjX2Nsa19mcmVxID0gMzA0MDAsIC8qIGluIGtIeiAqLworCS5pZl9mcmVxID0gMCwgLyogemVybyBJRiAqLworCS56aWZfc3dhcF9pcSA9IDEsCit9OworCitzdGF0aWMgaW50IGN4dXNiX215Z2ljYV9kNjg5X2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGFkYXAtPmRldjsKKworCS8qIFNlbGVjdCByZXF1aXJlZCBVU0IgY29uZmlndXJhdGlvbiAqLworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LCAwLCAwKSA8IDApCisJCWVycigic2V0IGludGVyZmFjZSBmYWlsZWQiKTsKKworCS8qIFVuYmxvY2sgYWxsIFVTQiBwaXBlcyAqLworCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsCisJCXVzYl9zbmRidWxrcGlwZShkLT51ZGV2LCBkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCkpOworCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsCisJCXVzYl9yY3ZidWxrcGlwZShkLT51ZGV2LCBkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCkpOworCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsCisJCXVzYl9yY3ZidWxrcGlwZShkLT51ZGV2LCBkLT5wcm9wcy5hZGFwdGVyWzBdLnN0cmVhbS5lbmRwb2ludCkpOworCisKKwkvKiBSZXNldCB0aGUgdHVuZXIgKi8KKwlpZiAoY3h1c2JfZDY4MF9kbWJfZ3Bpb190dW5lcihkLCAweDA3LCAwKSA8IDApIHsKKwkJZXJyKCJjbGVhciB0dW5lciBncGlvIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNsZWVwKDEwMCk7CisJaWYgKGN4dXNiX2Q2ODBfZG1iX2dwaW9fdHVuZXIoZCwgMHgwNywgMSkgPCAwKSB7CisJCWVycigic2V0IHR1bmVyIGdwaW8gZmFpbGVkIik7CisJCXJldHVybiAtRUlPOworCX0KKwltc2xlZXAoMTAwKTsKKworCS8qIEF0dGFjaCBmcm9udGVuZCAqLworCWFkYXAtPmZlID0gZHZiX2F0dGFjaChhdGJtODgzMF9hdHRhY2gsICZteWdpY2FfZDY4OV9hdGJtODgzMF9jZmcsCisJCSZkLT5pMmNfYWRhcCk7CisJaWYgKGFkYXAtPmZlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBEVmlDTyBoYXMgc2hpcHBlZCB0d28gZGV2aWNlcyB3aXRoIHRoZSBzYW1lIFVTQiBJRCwgYnV0IG9ubHkgb25lIG9mIHRoZW0KICAqIG5lZWRzIGEgZmlybXdhcmUgZG93bmxvYWQuICBDaGVjayB0aGUgZGV2aWNlIGNsYXNzIGRldGFpbHMgdG8gc2VlIGlmIHRoZXkKQEAgLTEyNDAsNiArMTMwNCw3IEBACiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgY3h1c2JfYmx1ZWJpcmRfbmFubzJfbmVlZHNmaXJtd2FyZV9wcm9wZXJ0aWVzOwogc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGN4dXNiX2F2ZXJfYTg2OHJfcHJvcGVydGllczsKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBjeHVzYl9kNjgwX2RtYl9wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGN4dXNiX215Z2ljYV9kNjg5X3Byb3BlcnRpZXM7CiAKIHN0YXRpYyBpbnQgY3h1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCkBAIC0xMjY4LDYgKzEzMzMsOCBAQAogCQkJCSAgICAgVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpIHx8CiAJICAgIDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmY3h1c2JfZDY4MF9kbWJfcHJvcGVydGllcywKIAkJCQkgICAgIFRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSB8fAorCSAgICAwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJmN4dXNiX215Z2ljYV9kNjg5X3Byb3BlcnRpZXMsCisJCQkJICAgICBUSElTX01PRFVMRSwgTlVMTCwgYWRhcHRlcl9ucikgfHwKIAkgICAgMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTEyOTQsNiArMTM2MSw3IEBACiAJeyBVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBLCBVU0JfUElEX0FWRVJNRURJQV9WT0xBUl9BODY4UikgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzRfUkVWXzIpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WSURfQ09ORVhBTlQsIFVTQl9QSURfQ09ORVhBTlRfRDY4MF9ETUIpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfQ09ORVhBTlQsIFVTQl9QSURfTVlHSUNBX0Q2ODkpIH0sCiAJe30JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBjeHVzYl90YWJsZSk7CkBAIC0xODM3LDYgKzE5MDUsNTUgQEAKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgY3h1c2JfbXlnaWNhX2Q2ODlfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisKKwkudXNiX2N0cmwgICAgICAgICA9IENZUFJFU1NfRlgyLAorCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGN4dXNiX3N0YXRlKSwKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX2Q2ODBfZG1iX3N0cmVhbWluZ19jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9teWdpY2FfZDY4OV9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX215Z2ljYV9kNjg5X3R1bmVyX2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJCS5jb3VudCA9IDUsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCisJCQkJCX0KKwkJCQl9CisJCQl9LAorCQl9LAorCX0sCisKKwkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX2Q2ODBfZG1iX3Bvd2VyX2N0cmwsCisKKwkuaTJjX2FsZ28gICAgICAgICA9ICZjeHVzYl9pMmNfYWxnbywKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisKKwkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkucmNfa2V5X21hcCAgICAgICA9IGQ2ODBfZG1iX3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGQ2ODBfZG1iX3JjX2tleXMpLAorCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfZDY4MF9kbWJfcmNfcXVlcnksCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsKKwkJCSJNeWdpY2EgRDY4OSBETUItVEgiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZjeHVzYl90YWJsZVsxOV0sIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY3h1c2JfZHJpdmVyID0gewogCS5uYW1lCQk9ICJkdmJfdXNiX2N4dXNiIiwKIAkucHJvYmUJCT0gY3h1c2JfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwppbmRleCA2YmQ4OTUxLi42ODQxNDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKQEAgLTU1OCw4ICs1NTgsNyBAQAogc3RydWN0IGRpYjA3MDBfcmNfcmVzcG9uc2UgewogCXU4IHJlcG9ydF9pZDsKIAl1OCBkYXRhX3N0YXRlOwotCXU4IHN5c3RlbV9tc2I7Ci0JdTggc3lzdGVtX2xzYjsKKwl1MTYgc3lzdGVtOwogCXU4IGRhdGE7CiAJdTggbm90X2RhdGE7CiB9OwpAQCAtNTg5LDM3ICs1ODgsNTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGFjdGxlbiAhPSBzaXplb2YoYnVmKSkgewotCQkvKiBXZSBkaWRuJ3QgZ2V0IGJhY2sgdGhlIDYgYnl0ZSBtZXNzYWdlIHdlIGV4cGVjdGVkICovCi0JCWVycigiVW5leHBlY3RlZCBSQyByZXNwb25zZSBzaXplIFslZF0iLCBhY3RsZW4pOwotCQlyZXR1cm4gLTE7CisKKwlzd2l0Y2ggKGR2Yl91c2JfZGliMDcwMF9pcl9wcm90bykgeworCWNhc2UgMDoKKwkJcG9sbF9yZXBseS5yZXBvcnRfaWQgID0gMDsKKwkJcG9sbF9yZXBseS5kYXRhX3N0YXRlID0gMTsKKwkJcG9sbF9yZXBseS5zeXN0ZW0gICAgID0gYnVmWzJdOworCQlwb2xsX3JlcGx5LmRhdGEgICAgICAgPSBidWZbNF07CisJCXBvbGxfcmVwbHkubm90X2RhdGEgICA9IGJ1Zls1XTsKKworCQkvKiBORUMgcHJvdG9jb2wgc2VuZHMgcmVwZWF0IGNvZGUgYXMgMCAwIDAgRkYgKi8KKwkJaWYgKChwb2xsX3JlcGx5LnN5c3RlbSA9PSAweDAwKSAmJiAocG9sbF9yZXBseS5kYXRhID09IDB4MDApCisJCSAgICAmJiAocG9sbF9yZXBseS5ub3RfZGF0YSA9PSAweGZmKSkgeworCQkJcG9sbF9yZXBseS5kYXRhX3N0YXRlID0gMjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChhY3RsZW4gIT0gc2l6ZW9mKGJ1ZikpIHsKKwkJCS8qIFdlIGRpZG4ndCBnZXQgYmFjayB0aGUgNiBieXRlIG1lc3NhZ2Ugd2UgZXhwZWN0ZWQgKi8KKwkJCWVycigiVW5leHBlY3RlZCBSQyByZXNwb25zZSBzaXplIFslZF0iLCBhY3RsZW4pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcG9sbF9yZXBseS5yZXBvcnRfaWQgID0gYnVmWzBdOworCQlwb2xsX3JlcGx5LmRhdGFfc3RhdGUgPSBidWZbMV07CisJCXBvbGxfcmVwbHkuc3lzdGVtICAgICA9IChidWZbMl0gPDwgOCkgfCBidWZbM107CisJCXBvbGxfcmVwbHkuZGF0YSAgICAgICA9IGJ1Zls0XTsKKwkJcG9sbF9yZXBseS5ub3RfZGF0YSAgID0gYnVmWzVdOworCisJCWJyZWFrOwogCX0KIAotCXBvbGxfcmVwbHkucmVwb3J0X2lkICA9IGJ1ZlswXTsKLQlwb2xsX3JlcGx5LmRhdGFfc3RhdGUgPSBidWZbMV07Ci0JcG9sbF9yZXBseS5zeXN0ZW1fbXNiID0gYnVmWzJdOwotCXBvbGxfcmVwbHkuc3lzdGVtX2xzYiA9IGJ1ZlszXTsKLQlwb2xsX3JlcGx5LmRhdGEgICAgICAgPSBidWZbNF07Ci0JcG9sbF9yZXBseS5ub3RfZGF0YSAgID0gYnVmWzVdOwotCi0JLyoKLQlpbmZvKCJyaWQ9JTAyeCBkcz0lMDJ4IHNtPSUwMnggc2w9JTAyeCBkPSUwMnggbmQ9JTAyeFxuIiwKLQkgICAgIHBvbGxfcmVwbHkucmVwb3J0X2lkLCBwb2xsX3JlcGx5LmRhdGFfc3RhdGUsCi0JICAgICBwb2xsX3JlcGx5LnN5c3RlbV9tc2IsIHBvbGxfcmVwbHkuc3lzdGVtX2xzYiwKLQkgICAgIHBvbGxfcmVwbHkuZGF0YSwgcG9sbF9yZXBseS5ub3RfZGF0YSk7Ci0JKi8KLQogCWlmICgocG9sbF9yZXBseS5kYXRhICsgcG9sbF9yZXBseS5ub3RfZGF0YSkgIT0gMHhmZikgewogCQkvKiBLZXkgZmFpbGVkIGludGVncml0eSBjaGVjayAqLwotCQllcnIoImtleSBmYWlsZWQgaW50ZWdyaXR5IGNoZWNrOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKLQkJICAgIHBvbGxfcmVwbHkuc3lzdGVtX21zYiwgcG9sbF9yZXBseS5zeXN0ZW1fbHNiLAorCQllcnIoImtleSBmYWlsZWQgaW50ZWdyaXR5IGNoZWNrOiAlMDR4ICUwMnggJTAyeCIsCisJCSAgICBwb2xsX3JlcGx5LnN5c3RlbSwKIAkJICAgIHBvbGxfcmVwbHkuZGF0YSwgcG9sbF9yZXBseS5ub3RfZGF0YSk7CiAJCXJldHVybiAtMTsKIAl9CiAKKwogCS8qIEZpbmQgdGhlIGtleSBpbiB0aGUgbWFwICovCiAJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKSB7Ci0JCWlmIChyYzVfY3VzdG9tKCZrZXltYXBbaV0pID09IHBvbGxfcmVwbHkuc3lzdGVtX2xzYiAmJgorCQlpZiAocmM1X2N1c3RvbSgma2V5bWFwW2ldKSA9PSAocG9sbF9yZXBseS5zeXN0ZW0gJiAweGZmKSAmJgogCQkgICAgcmM1X2RhdGEoJmtleW1hcFtpXSkgPT0gcG9sbF9yZXBseS5kYXRhKSB7CiAJCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7CiAJCQlmb3VuZCA9IDE7CkBAIC02MjgsOCArNjQwLDggQEAKIAl9CiAKIAlpZiAoZm91bmQgPT0gMCkgewotCQllcnIoIlVua25vd24gcmVtb3RlIGNvbnRyb2xsZXIga2V5OiAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKLQkJICAgIHBvbGxfcmVwbHkuc3lzdGVtX21zYiwgcG9sbF9yZXBseS5zeXN0ZW1fbHNiLAorCQllcnIoIlVua25vd24gcmVtb3RlIGNvbnRyb2xsZXIga2V5OiAlMDR4ICUwMnggJTAyeCIsCisJCSAgICBwb2xsX3JlcGx5LnN5c3RlbSwKIAkJICAgIHBvbGxfcmVwbHkuZGF0YSwgcG9sbF9yZXBseS5ub3RfZGF0YSk7CiAJCWQtPmxhc3RfZXZlbnQgPSAwOwogCQlyZXR1cm4gMDsKQEAgLTg3NCw2ICs4ODYsNDkgQEAKIAl7IDB4MWQzNywgS0VZX1JFQ09SRCB9LAogCXsgMHgxZDNiLCBLRVlfR09UTyB9LAogCXsgMHgxZDNkLCBLRVlfUE9XRVIgfSwKKworCS8qIEtleSBjb2RlcyBmb3IgdGhlIFBpeGVsdmlldyBTQlRWRCByZW1vdGUgKHByb3RvIE5FQykgKi8KKwl7IDB4ODYxMywgS0VZX01VVEUgfSwKKwl7IDB4ODYxMiwgS0VZX1BPV0VSIH0sCisJeyAweDg2MDEsIEtFWV8xIH0sCisJeyAweDg2MDIsIEtFWV8yIH0sCisJeyAweDg2MDMsIEtFWV8zIH0sCisJeyAweDg2MDQsIEtFWV80IH0sCisJeyAweDg2MDUsIEtFWV81IH0sCisJeyAweDg2MDYsIEtFWV82IH0sCisJeyAweDg2MDcsIEtFWV83IH0sCisJeyAweDg2MDgsIEtFWV84IH0sCisJeyAweDg2MDksIEtFWV85IH0sCisJeyAweDg2MDAsIEtFWV8wIH0sCisJeyAweDg2MGQsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4ODYxOSwgS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweDg2MTAsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHg4NjBjLCBLRVlfVk9MVU1FRE9XTiB9LAorCisJeyAweDg2MGEsIEtFWV9DQU1FUkEgfSwKKwl7IDB4ODYwYiwgS0VZX1pPT00gfSwKKwl7IDB4ODYxYiwgS0VZX0JBQ0tTUEFDRSB9LAorCXsgMHg4NjE1LCBLRVlfRU5URVIgfSwKKworCXsgMHg4NjFkLCBLRVlfVVAgfSwKKwl7IDB4ODYxZSwgS0VZX0RPV04gfSwKKwl7IDB4ODYwZSwgS0VZX0xFRlQgfSwKKwl7IDB4ODYwZiwgS0VZX1JJR0hUIH0sCisKKwl7IDB4ODYxOCwgS0VZX1JFQ09SRCB9LAorCXsgMHg4NjFhLCBLRVlfU1RPUCB9LAorCisJLyogS2V5IGNvZGVzIGZvciB0aGUgRXZvbHV0ZVBDIFRWV2F5KyByZW1vdGUgKHByb3RvIE5FQykgKi8KKwl7IDB4N2EwMCwgS0VZX01FTlUgfSwKKwl7IDB4N2EwMSwgS0VZX1JFQ09SRCB9LAorCXsgMHg3YTAyLCBLRVlfUExBWSB9LAorCXsgMHg3YTAzLCBLRVlfU1RPUCB9LAorCXsgMHg3YTEwLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDdhMTEsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHg3YTEyLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4N2ExMywgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4N2E0MCwgS0VZX1BPV0VSIH0sCisJeyAweDdhNDEsIEtFWV9NVVRFIH0sCiB9OwogCiAvKiBTVEs3NzAwUDogSGF1cHBhdWdlIE5vdmEtVCBTdGljaywgQVZlck1lZGlhIFZvbGFyICovCkBAIC0xMTMzLDYgKzExODgsNyBAQAogCSAuY2xvY2tfa2h6ID0gMTIwMDAsCiAJIC5jbG9ja19wYWRfZHJpdmUgPSAwLAogCSAuZmxpcF9jaGlwID0gMSwKKwkgLmNoYXJnZV9wdW1wID0gMiwKIH07CiAKIHN0YXRpYyBpbnQgZGliNzA3MF9zZXRfcGFyYW1fb3ZlcnJpZGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQpAQCAtMTIwOSw2ICsxMjY1LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3RrNzB4MHBfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKyAgICByZXR1cm4gZGliNzAwMHBfcGlkX2ZpbHRlcihhZGFwdGVyLT5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOworfQorCitzdGF0aWMgaW50IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgb25vZmYpCit7CisgICAgcmV0dXJuIGRpYjcwMDBwX3BpZF9maWx0ZXJfY3RybChhZGFwdGVyLT5mZSwgb25vZmYpOworfQorCiBzdGF0aWMgc3RydWN0IGRpYngwMDBfYmFuZHdpZHRoX2NvbmZpZyBkaWI3MDcwX2J3X2NvbmZpZ18xMl9taHogPSB7CiAJNjAwMDAsIDE1MDAwLCAvLyBpbnRlcm5hbCwgc2FtcGxpbmcKIAkxLCAyMCwgMywgMSwgMCwgLy8gcGxsX2NmZzogcHJlZGl2LCByYXRpbywgcmFuZ2UsIHJlc2V0LCBieXBhc3MKQEAgLTE1MDAsNiArMTU2NiwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN0azgwN3hfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKyAgICByZXR1cm4gZGliODAwMF9waWRfZmlsdGVyKGFkYXB0ZXItPmZlLCBpbmRleCwgcGlkLCBvbm9mZik7Cit9CisKK3N0YXRpYyBpbnQgc3RrODA3eF9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcHRlciwgaW50IG9ub2ZmKQoreworICAgIHJldHVybiBkaWI4MDAwX3BpZF9maWx0ZXJfY3RybChhZGFwdGVyLT5mZSwgb25vZmYpOworfQogCiAvKiBTVEs4MDd4ICovCiBzdGF0aWMgaW50IHN0azgwN3hfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCkBAIC0xODYxLDYgKzE5MzYsNyBAQAogCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwgICAgVVNCX1BJRF9ESUJDT01fU1RLODA3WFBWUikgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ESUJDT00sICAgIFVTQl9QSURfRElCQ09NX1NUSzgwN1hQKSB9LAogCXsgVVNCX0RFVklDRShVU0JfVklEX1BJWEVMVklFVywgVVNCX1BJRF9QSVhFTFZJRVdfU0JUVkQpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfRVZPTFVURVBDLCBVU0JfUElEX1RWV0FZX1BMVVMpIH0sCiAJeyAwIH0JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRpYjA3MDBfdXNiX2lkX3RhYmxlKTsKQEAgLTE4OTUsNiArMTk3MSwxMCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKwkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAorCQkJCS5waWRfZmlsdGVyICAgICAgID0gc3RrNzB4MHBfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsICA9IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybCwKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHN0azc3MDBwX2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBwX3R1bmVyX2F0dGFjaCwKIApAQCAtMTk3NiwxMSArMjA1NiwxOSBAQAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKwkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAorCQkJCS5waWRfZmlsdGVyICAgICAgID0gc3RrNzB4MHBfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsICA9IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybCwKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHN0azc3MDBkX2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBkX3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAogCQkJfSwgeworCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCisJCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBzdGs3MHgwcF9waWRfZmlsdGVyX2N0cmwsCiAJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBzdGs3NzAwZF9mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBzdGs3NzAwZF90dW5lcl9hdHRhY2gsCiAKQEAgLTIwMjMsNiArMjExMSwxMCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKwkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAorCQkJCS5waWRfZmlsdGVyICAgICAgID0gc3RrNzB4MHBfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsICA9IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybCwKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHN0azc3MDBQMl9mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBzdGs3NzAwZF90dW5lcl9hdHRhY2gsCiAKQEAgLTIwNTUsNiArMjE0NywxMCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKwkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAorCQkJCS5waWRfZmlsdGVyICAgICAgID0gc3RrNzB4MHBfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsICA9IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybCwKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHN0azcwNzBwX2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYjcwNzBwX3R1bmVyX2F0dGFjaCwKIApAQCAtMjEyMiw2ICsyMjE4LDEwIEBACiAJCS5udW1fYWRhcHRlcnMgPSAxLAogCQkuYWRhcHRlciA9IHsKIAkJCXsKKwkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAorCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCisJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLAorCQkJCS5waWRfZmlsdGVyX2N0cmwgID0gc3RrNzB4MHBfcGlkX2ZpbHRlcl9jdHJsLAogCQkJCS5mcm9udGVuZF9hdHRhY2ggID0gc3RrNzA3MHBfZnJvbnRlbmRfYXR0YWNoLAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzA3MHBfdHVuZXJfYXR0YWNoLAogCkBAIC0yMTU3LDYgKzIyNTcsMTAgQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCisJCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBzdGs3MHgwcF9waWRfZmlsdGVyX2N0cmwsCiAJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBzdGs3MDcwcGRfZnJvbnRlbmRfYXR0YWNoMCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYjcwNzBwX3R1bmVyX2F0dGFjaCwKIApAQCAtMjE2NCw2ICsyMjY4LDEwIEBACiAKIAkJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sIHsKKwkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAorCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCisJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLAorCQkJCS5waWRfZmlsdGVyX2N0cmwgID0gc3RrNzB4MHBfcGlkX2ZpbHRlcl9jdHJsLAogCQkJCS5mcm9udGVuZF9hdHRhY2ggID0gc3RrNzA3MHBkX2Zyb250ZW5kX2F0dGFjaDEsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCiAKQEAgLTIyMTAsNiArMjMxOCwxMCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKwkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAorCQkJCS5waWRfZmlsdGVyICAgICAgID0gc3RrNzB4MHBfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsICA9IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybCwKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHN0azc3MDBwaF9mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBzdGs3NzAwcGhfdHVuZXJfYXR0YWNoLAogCkBAIC0yMzIyLDYgKzI0MzQsMTAgQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCisJCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBzdGs3MHgwcF9waWRfZmlsdGVyX2N0cmwsCiAJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBzdGs3MDcwcF9mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3NzcwcF90dW5lcl9hdHRhY2gsCiAKQEAgLTIzNTMsNiArMjQ2OSwxMCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkJLmNhcHMgID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwkJCQkucGlkX2ZpbHRlciA9IHN0azgwN3hfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsID0gc3RrODA3eF9waWRfZmlsdGVyX2N0cmwsCiAJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBzdGs4MDd4X2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYjgwN3hfdHVuZXJfYXR0YWNoLAogCkBAIC0yMzYzLDcgKzI0ODMsNyBAQAogCQkJfSwKIAkJfSwKIAotCQkubnVtX2RldmljZV9kZXNjcyA9IDIsCisJCS5udW1fZGV2aWNlX2Rlc2NzID0gMywKIAkJLmRldmljZXMgPSB7CiAJCQl7ICAgIkRpQmNvbSBTVEs4MDd4UCByZWZlcmVuY2UgZGVzaWduIiwKIAkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVs2Ml0sIE5VTEwgfSwKQEAgLTIzNzMsNiArMjQ5MywxMCBAQAogCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzYzXSwgTlVMTCB9LAogCQkJCXsgTlVMTCB9LAogCQkJfSwKKwkJCXsgICAiRXZvbHV0ZVBDIFRWV2F5KyIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNjRdLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAogCQl9LAogCiAJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKQEAgLTIzODQsNiArMjUwOCwxMCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkJLmNhcHMgID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwkJCQkucGlkX2ZpbHRlciA9IHN0azgwN3hfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsID0gc3RrODA3eF9waWRfZmlsdGVyX2N0cmwsCiAJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBzdGs4MDd4cHZyX2Zyb250ZW5kX2F0dGFjaDAsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI4MDd4X3R1bmVyX2F0dGFjaCwKIApAQCAtMjM5Myw2ICsyNTIxLDEwIEBACiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCiAJCQl7CisJCQkJLmNhcHMgID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwkJCQkucGlkX2ZpbHRlciA9IHN0azgwN3hfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsID0gc3RrODA3eF9waWRfZmlsdGVyX2N0cmwsCiAJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBzdGs4MDd4cHZyX2Zyb250ZW5kX2F0dGFjaDEsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI4MDd4X3R1bmVyX2F0dGFjaCwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKaW5kZXggZWVlZjUwYmYuLjVjMDEyNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzldLCAgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMTFdLCBOVUxMIH0sCiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzEwXSwgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMTJdLCBOVUxMIH0sCiAJCX0sCi0JCXsJIlVua293biBVU0IxLjEgRFZCLVQgZGV2aWNlID8/Pz8gcGxlYXNlIHJlcG9ydCB0aGUgbmFtZSB0byB0aGUgYXV0aG9yIiwKKwkJewkiVW5rbm93biBVU0IxLjEgRFZCLVQgZGV2aWNlID8/Pz8gcGxlYXNlIHJlcG9ydCB0aGUgbmFtZSB0byB0aGUgYXV0aG9yIiwKIAkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMTNdLCBOVUxMIH0sCiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzE0XSwgTlVMTCB9LAogCQl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCmluZGV4IDhhN2Q4N2IuLmRmMWVjM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKQEAgLTg4LDYgKzg4LDcgQEAKIAkJZ290byBlcnI7CiAJfQogCWFkYXAtPmR2Yl9hZGFwLnByaXYgPSBhZGFwOworCWFkYXAtPmR2Yl9hZGFwLmZlX2lvY3RsX292ZXJyaWRlID0gYWRhcC0+cHJvcHMuZmVfaW9jdGxfb3ZlcnJpZGU7CiAKIAlpZiAoYWRhcC0+ZGV2LT5wcm9wcy5yZWFkX21hY19hZGRyZXNzKSB7CiAJCWlmIChhZGFwLT5kZXYtPnByb3BzLnJlYWRfbWFjX2FkZHJlc3MoYWRhcC0+ZGV2LGFkYXAtPmR2Yl9hZGFwLnByb3Bvc2VkX21hYykgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCBhNTQ4YzE0Li5mMTYwMmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIFVTQl9WSURfRElCQ09NCQkJCTB4MTBiOAogI2RlZmluZSBVU0JfVklEX0RQT1NICQkJCTB4MTQ5OAogI2RlZmluZSBVU0JfVklEX0RWSUNPCQkJCTB4MGZlOQorI2RlZmluZSBVU0JfVklEX0UzQwkJCQkweDE4YjQKICNkZWZpbmUgVVNCX1ZJRF9FTEdBVE8JCQkJMHgwZmQ5CiAjZGVmaW5lIFVTQl9WSURfRU1QSUEJCQkJMHhlYjFhCiAjZGVmaW5lIFVTQl9WSURfR0VOUElYCQkJCTB4MDljMApAQCAtNjEsNiArNjIsNyBAQAogI2RlZmluZSBVU0JfVklEX1hURU5TSU9OUwkJCTB4MWFlNwogI2RlZmluZSBVU0JfVklEX0hVTUFYX0NPRVgJCQkweDEwYjkKICNkZWZpbmUgVVNCX1ZJRF83NzQJCQkJMHg3YTY5CisjZGVmaW5lIFVTQl9WSURfRVZPTFVURVBDCQkJMHgxZTU5CiAKIC8qIFByb2R1Y3QgSURzICovCiAjZGVmaW5lIFVTQl9QSURfQURTVEVDSF9VU0IyX0NPTEQJCQkweGEzMzMKQEAgLTEwMyw2ICsxMDUsMTEgQEAKICNkZWZpbmUgVVNCX1BJRF9ESUJDT01fU1RLNzc3MFAJCQkJMHgxZTgwCiAjZGVmaW5lIFVTQl9QSURfRFBPU0hfTTkyMDZfQ09MRAkJCTB4OTIwNgogI2RlZmluZSBVU0JfUElEX0RQT1NIX005MjA2X1dBUk0JCQkweGEwOTAKKyNkZWZpbmUgVVNCX1BJRF9FM0NfRUMxNjgJCQkJMHgxNjg5CisjZGVmaW5lIFVTQl9QSURfRTNDX0VDMTY4XzIJCQkJMHhmZmZhCisjZGVmaW5lIFVTQl9QSURfRTNDX0VDMTY4XzMJCQkJMHhmZmZiCisjZGVmaW5lIFVTQl9QSURfRTNDX0VDMTY4XzQJCQkJMHgxMDAxCisjZGVmaW5lIFVTQl9QSURfRTNDX0VDMTY4XzUJCQkJMHgxMDAyCiAjZGVmaW5lIFVTQl9QSURfVU5JV0lMTF9TVEs3NzAwUAkJCTB4NjAwMwogI2RlZmluZSBVU0JfUElEX0dFTklVU19UVkdPX0RWQl9UMDMJCQkweDQwMTIKICNkZWZpbmUgVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQl9DT0xECQkJMHgwZmEwCkBAIC0xMTUsNiArMTIyLDcgQEAKICNkZWZpbmUgVVNCX1BJRF9LV09STERfMzk1VV8zCQkJCTB4ZTM5NQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF9NQzgxMAkJCQkweGM4MTAKICNkZWZpbmUgVVNCX1BJRF9LV09STERfUEMxNjBfMlQJCQkJMHhjMTYwCisjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1BDMTYwX1QJCQkJMHhjMTYxCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fQ09MRAkJCTB4MTdkZQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF9WU1RSRUFNX1dBUk0JCQkweDE3ZGYKICNkZWZpbmUgVVNCX1BJRF9URVJSQVRFQ19DSU5FUkdZX1RfVVNCX1hFCQkweDAwNTUKQEAgLTI3MSwxMCArMjc5LDEzIEBACiAjZGVmaW5lIFVTQl9QSURfVEVMRVNUQVJfU1RBUlNUSUNLXzIJCQkweDgwMDAKICNkZWZpbmUgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSUkgICAgICAgICAgICAgICAgICAgMHg4ODA3CiAjZGVmaW5lIFVTQl9QSURfU09OWV9QTEFZVFYJCQkJMHgwMDAzCisjZGVmaW5lIFVTQl9QSURfTVlHSUNBX0Q2ODkJCQkJMHhkODExCiAjZGVmaW5lIFVTQl9QSURfRUxHQVRPX0VZRVRWX0RUVAkJCTB4MDAyMQogI2RlZmluZSBVU0JfUElEX0VMR0FUT19FWUVUVl9EVFRfRGx4CQkJMHgwMDIwCiAjZGVmaW5lIFVTQl9QSURfRFZCX1RfVVNCX1NUSUNLX0hJR0hfU1BFRURfQ09MRAkJMHg1MDAwCiAjZGVmaW5lIFVTQl9QSURfRFZCX1RfVVNCX1NUSUNLX0hJR0hfU1BFRURfV0FSTQkJMHg1MDAxCiAjZGVmaW5lIFVTQl9QSURfRlJJSU9fV0hJVEUJCQkJMHgwMDAxCisjZGVmaW5lIFVTQl9QSURfVFZXQVlfUExVUwkJCQkweDAwMDIKKyNkZWZpbmUgVVNCX1BJRF9TVkVPTl9TVFYyMAkJCQkweGUzOWQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMKaW5kZXggZWRkZTg3Yy4uNmI1ZGVkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXJlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1yZW1vdGUuYwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1JFUEVBVDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGViX2VycigidW5rb3duIHR5cGUgb2YgcmVtb3RlIHN0YXR1czogJWRcbiIsa2V5YnVmWzBdKTsKKwkJCWRlYl9lcnIoInVua25vd24gdHlwZSBvZiByZW1vdGUgc3RhdHVzOiAlZFxuIixrZXlidWZbMF0pOwogCQkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAppbmRleCBmZTJiODdlLi4wMTQzYWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaApAQCAtMTYyLDYgKzE2Miw5IEBACiAJc3RydWN0IHVzYl9kYXRhX3N0cmVhbV9wcm9wZXJ0aWVzIHN0cmVhbTsKIAogCWludCBzaXplX29mX3ByaXY7CisKKwlpbnQgKCpmZV9pb2N0bF9vdmVycmlkZSkgKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwKKwkJCQkgIHVuc2lnbmVkIGludCwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2VjMTY4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2VjMTY4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmNWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZWMxNjguYwpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqIEUzQyBFQzE2OCBEVkIgVVNCIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVjMTY4LmgiCisjaW5jbHVkZSAiZWMxMDAuaCIKKyNpbmNsdWRlICJteGw1MDA1cy5oIgorCisvKiBkZWJ1ZyAqLworc3RhdGljIGludCBkdmJfdXNiX2VjMTY4X2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX2VjMTY4X2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwiIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKK0RWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOworCitzdGF0aWMgc3RydWN0IGVjMTAwX2NvbmZpZyBlYzE2OF9lYzEwMF9jb25maWc7CisKK3N0YXRpYyBpbnQgZWMxNjhfcndfdWRldihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IGVjMTY4X3JlcSAqcmVxKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHBpcGU7CisJdTggcmVxdWVzdCwgcmVxdWVzdHR5cGU7CisJdTggYnVmW3JlcS0+c2l6ZV07CisKKwlzd2l0Y2ggKHJlcS0+Y21kKSB7CisJY2FzZSBET1dOTE9BRF9GSVJNV0FSRToKKwljYXNlIEdQSU86CisJY2FzZSBXUklURV9JMkM6CisJY2FzZSBTVFJFQU1JTkdfQ1RSTDoKKwkJcmVxdWVzdHR5cGUgPSAoVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQpOworCQlyZXF1ZXN0ID0gcmVxLT5jbWQ7CisJCWJyZWFrOworCWNhc2UgUkVBRF9JMkM6CisJCXJlcXVlc3R0eXBlID0gKFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4pOworCQlyZXF1ZXN0ID0gcmVxLT5jbWQ7CisJCWJyZWFrOworCWNhc2UgR0VUX0NPTkZJRzoKKwkJcmVxdWVzdHR5cGUgPSAoVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTik7CisJCXJlcXVlc3QgPSBDT05GSUc7CisJCWJyZWFrOworCWNhc2UgU0VUX0NPTkZJRzoKKwkJcmVxdWVzdHR5cGUgPSAoVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQpOworCQlyZXF1ZXN0ID0gQ09ORklHOworCQlicmVhazsKKwljYXNlIFdSSVRFX0RFTU9EOgorCQlyZXF1ZXN0dHlwZSA9IChVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCk7CisJCXJlcXVlc3QgPSBERU1PRF9SVzsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX0RFTU9EOgorCQlyZXF1ZXN0dHlwZSA9IChVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOKTsKKwkJcmVxdWVzdCA9IERFTU9EX1JXOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoInVua25vd24gY29tbWFuZDolMDJ4IiwgcmVxLT5jbWQpOworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHJlcXVlc3R0eXBlID09IChVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCkpIHsKKwkJLyogd3JpdGUgKi8KKwkJbWVtY3B5KGJ1ZiwgcmVxLT5kYXRhLCByZXEtPnNpemUpOworCQlwaXBlID0gdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApOworCX0gZWxzZSB7CisJCS8qIHJlYWQgKi8KKwkJcGlwZSA9IHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKTsKKwl9CisKKwltc2xlZXAoMSk7IC8qIGF2b2lkIEkyQyBlcnJvcnMgKi8KKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCBwaXBlLCByZXF1ZXN0LCByZXF1ZXN0dHlwZSwgcmVxLT52YWx1ZSwKKwkJcmVxLT5pbmRleCwgYnVmLCBzaXplb2YoYnVmKSwgRUMxNjhfVVNCX1RJTUVPVVQpOworCisJZWMxNjhfZGVidWdfZHVtcChyZXF1ZXN0LCByZXF1ZXN0dHlwZSwgcmVxLT52YWx1ZSwgcmVxLT5pbmRleCwgYnVmLAorCQlyZXEtPnNpemUsIGRlYl94ZmVyKTsKKworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCWVsc2UKKwkJcmV0ID0gMDsKKworCS8qIHJlYWQgcmVxdWVzdCwgY29weSByZXR1cm5lZCBkYXRhIHRvIHJldHVybiBidWYgKi8KKwlpZiAoIXJldCAmJiByZXF1ZXN0dHlwZSA9PSAoVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTikpCisJCW1lbWNweShyZXEtPmRhdGEsIGJ1ZiwgcmVxLT5zaXplKTsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkZWJfaW5mbygiJXM6IGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlYzE2OF9jdHJsX21zZyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHN0cnVjdCBlYzE2OF9yZXEgKnJlcSkKK3sKKwlyZXR1cm4gZWMxNjhfcndfdWRldihkLT51ZGV2LCByZXEpOworfQorCisvKiBJMkMgKi8KK3N0YXRpYyBpbnQgZWMxNjhfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dbXSwKKwlpbnQgbnVtKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJc3RydWN0IGVjMTY4X3JlcSByZXE7CisJaW50IGkgPSAwOworCWludCByZXQ7CisKKwlpZiAobnVtID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfbXV0ZXgpIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwl3aGlsZSAoaSA8IG51bSkgeworCQlpZiAobnVtID4gaSArIDEgJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCQlpZiAobXNnW2ldLmFkZHIgPT0gZWMxNjhfZWMxMDBfY29uZmlnLmRlbW9kX2FkZHJlc3MpIHsKKwkJCQlyZXEuY21kID0gUkVBRF9ERU1PRDsKKwkJCQlyZXEudmFsdWUgPSAwOworCQkJCXJlcS5pbmRleCA9IDB4ZmYwMCArIG1zZ1tpXS5idWZbMF07IC8qIHJlZyAqLworCQkJCXJlcS5zaXplID0gbXNnW2krMV0ubGVuOyAvKiBieXRlcyB0byByZWFkICovCisJCQkJcmVxLmRhdGEgPSAmbXNnW2krMV0uYnVmWzBdOworCQkJCXJldCA9IGVjMTY4X2N0cmxfbXNnKGQsICZyZXEpOworCQkJCWkgKz0gMjsKKwkJCX0gZWxzZSB7CisJCQkJZXJyKCJJMkMgcmVhZCBub3QgaW1wbGVtZW50ZWQiKTsKKwkJCQlyZXQgPSAtRU5PU1lTOworCQkJCWkgKz0gMjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtc2dbaV0uYWRkciA9PSBlYzE2OF9lYzEwMF9jb25maWcuZGVtb2RfYWRkcmVzcykgeworCQkJCXJlcS5jbWQgPSBXUklURV9ERU1PRDsKKwkJCQlyZXEudmFsdWUgPSBtc2dbaV0uYnVmWzFdOyAvKiB2YWwgKi8KKwkJCQlyZXEuaW5kZXggPSAweGZmMDAgKyBtc2dbaV0uYnVmWzBdOyAvKiByZWcgKi8KKwkJCQlyZXEuc2l6ZSA9IDA7CisJCQkJcmVxLmRhdGEgPSBOVUxMOworCQkJCXJldCA9IGVjMTY4X2N0cmxfbXNnKGQsICZyZXEpOworCQkJCWkgKz0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmVxLmNtZCA9IFdSSVRFX0kyQzsKKwkJCQlyZXEudmFsdWUgPSBtc2dbaV0uYnVmWzBdOyAvKiB2YWwgKi8KKwkJCQlyZXEuaW5kZXggPSAweDAxMDAgKyBtc2dbaV0uYWRkcjsgLyogSTJDIGFkZHIgKi8KKwkJCQlyZXEuc2l6ZSA9IG1zZ1tpXS5sZW4tMTsKKwkJCQlyZXEuZGF0YSA9ICZtc2dbaV0uYnVmWzFdOworCQkJCXJldCA9IGVjMTY4X2N0cmxfbXNnKGQsICZyZXEpOworCQkJCWkgKz0gMTsKKwkJCX0KKwkJfQorCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCX0KKwlyZXQgPSBpOworCitlcnJvcjoKKwltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7CisJcmV0dXJuIGk7Cit9CisKKworc3RhdGljIHUzMiBlYzE2OF9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGVjMTY4X2kyY19hbGdvID0geworCS5tYXN0ZXJfeGZlciAgID0gZWMxNjhfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBlYzE2OF9pMmNfZnVuYywKK307CisKKy8qIENhbGxiYWNrcyBmb3IgRFZCIFVTQiAqLworc3RhdGljIHN0cnVjdCBlYzEwMF9jb25maWcgZWMxNjhfZWMxMDBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHhmZiwgLyogbm90IHJlYWwgYWRkcmVzcywgZGVtb2QgaXMgaW50ZWdyYXRlZCAqLworfTsKKworc3RhdGljIGludCBlYzE2OF9lYzEwMF9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGVjMTAwX2F0dGFjaCwgJmVjMTY4X2VjMTAwX2NvbmZpZywKKwkJJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG14bDUwMDVzX2NvbmZpZyBlYzE2OF9teGw1MDAzc19jb25maWcgPSB7CisJLmkyY19hZGRyZXNzICAgICA9IDB4YzYsCisJLmlmX2ZyZXEgICAgICAgICA9IElGX0ZSRVFfNDU3MDAwMEhaLAorCS54dGFsX2ZyZXEgICAgICAgPSBDUllTVEFMX0ZSRVFfMTYwMDAwMDBIWiwKKwkuYWdjX21vZGUgICAgICAgID0gTVhMX1NJTkdMRV9BR0MsCisJLnRyYWNraW5nX2ZpbHRlciA9IE1YTF9URl9PRkYsCisJLnJzc2lfZW5hYmxlICAgICA9IE1YTF9SU1NJX0VOQUJMRSwKKwkuY2FwX3NlbGVjdCAgICAgID0gTVhMX0NBUF9TRUxfRU5BQkxFLAorCS5kaXZfb3V0ICAgICAgICAgPSBNWExfRElWX09VVF80LAorCS5jbG9ja19vdXQgICAgICAgPSBNWExfQ0xPQ0tfT1VUX0RJU0FCTEUsCisJLm91dHB1dF9sb2FkICAgICA9IE1YTDUwMDVTX0lGX09VVFBVVF9MT0FEXzIwMF9PSE0sCisJLnRvcAkJID0gTVhMNTAwNVNfVE9QXzI1UDIsCisJLm1vZF9tb2RlICAgICAgICA9IE1YTF9ESUdJVEFMX01PREUsCisJLmlmX21vZGUgICAgICAgICA9IE1YTF9aRVJPX0lGLAorCS5BZ2NNYXN0ZXJCeXRlICAgPSAweDAwLAorfTsKKworc3RhdGljIGludCBlYzE2OF9teGw1MDAzc190dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCSZlYzE2OF9teGw1MDAzc19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKK30KKworc3RhdGljIGludCBlYzE2OF9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJc3RydWN0IGVjMTY4X3JlcSByZXEgPSB7U1RSRUFNSU5HX0NUUkwsIDB4N2YwMSwgMHgwMjAyLCAwLCBOVUxMfTsKKwlkZWJfaW5mbygiJXM6IG9ub2ZmOiVkXG4iLCBfX2Z1bmNfXywgb25vZmYpOworCWlmIChvbm9mZikKKwkJcmVxLmluZGV4ID0gMHgwMTAyOworCXJldHVybiBlYzE2OF9jdHJsX21zZyhhZGFwLT5kZXYsICZyZXEpOworfQorCitzdGF0aWMgaW50IGVjMTY4X2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCit7CisJaW50IGksIGxlbiwgcGFja2V0cywgcmVtYWluZGVyLCByZXQ7CisJdTE2IGFkZHIgPSAweDAwMDA7IC8qIGZpcm13YXJlIHN0YXJ0IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgZWMxNjhfcmVxIHJlcSA9IHtET1dOTE9BRF9GSVJNV0FSRSwgMCwgMCwgMCwgTlVMTH07CisJZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOworCisJI2RlZmluZSBGV19QQUNLRVRfTUFYX0RBVEEgIDIwNDgKKwlwYWNrZXRzID0gZnctPnNpemUgLyBGV19QQUNLRVRfTUFYX0RBVEE7CisJcmVtYWluZGVyID0gZnctPnNpemUgJSBGV19QQUNLRVRfTUFYX0RBVEE7CisJbGVuID0gRldfUEFDS0VUX01BWF9EQVRBOworCWZvciAoaSA9IDA7IGkgPD0gcGFja2V0czsgaSsrKSB7CisJCWlmIChpID09IHBhY2tldHMpICAvKiBzZXQgc2l6ZSBvZiB0aGUgbGFzdCBwYWNrZXQgKi8KKwkJCWxlbiA9IHJlbWFpbmRlcjsKKworCQlyZXEuc2l6ZSA9IGxlbjsKKwkJcmVxLmRhdGEgPSAodTggKikoZnctPmRhdGEgKyBpICogRldfUEFDS0VUX01BWF9EQVRBKTsKKwkJcmVxLmluZGV4ID0gYWRkcjsKKwkJYWRkciArPSBGV19QQUNLRVRfTUFYX0RBVEE7CisKKwkJcmV0ID0gZWMxNjhfcndfdWRldih1ZGV2LCAmcmVxKTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWQ6JWQgcGFja2V0OiVkIiwgcmV0LCBpKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJcmVxLnNpemUgPSAwOworCisJLyogc2V0ICJ3YXJtIj8gKi8KKwlyZXEuY21kID0gU0VUX0NPTkZJRzsKKwlyZXEudmFsdWUgPSAwOworCXJlcS5pbmRleCA9IDB4MDAwMTsKKwlyZXQgPSBlYzE2OF9yd191ZGV2KHVkZXYsICZyZXEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiByZWFsbHkgbmVlZGVkIC0gbm8gaWRlYSB3aGF0IGRvZXMgKi8KKwlyZXEuY21kID0gR1BJTzsKKwlyZXEudmFsdWUgPSAwOworCXJlcS5pbmRleCA9IDB4MDIwNjsKKwlyZXQgPSBlYzE2OF9yd191ZGV2KHVkZXYsICZyZXEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBhY3RpdmF0ZSB0dW5lciBJMkM/ICovCisJcmVxLmNtZCA9IFdSSVRFX0kyQzsKKwlyZXEudmFsdWUgPSAwOworCXJlcS5pbmRleCA9IDB4MDBjNjsKKwlyZXQgPSBlYzE2OF9yd191ZGV2KHVkZXYsICZyZXEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGViX2luZm8oIiVzOiBmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZWMxNjhfaWRlbnRpZnlfc3RhdGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgKnByb3BzLAorCXN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqKmRlc2MsIGludCAqY29sZCkKK3sKKwlpbnQgcmV0OworCXU4IHJlcGx5OworCXN0cnVjdCBlYzE2OF9yZXEgcmVxID0ge0dFVF9DT05GSUcsIDAsIDEsIHNpemVvZihyZXBseSksICZyZXBseX07CisJZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOworCisJcmV0ID0gZWMxNjhfcndfdWRldih1ZGV2LCAmcmVxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJZGViX2luZm8oIiVzOiByZXBseTolMDJ4XG4iLCBfX2Z1bmNfXywgcmVwbHkpOworCisJaWYgKHJlcGx5ID09IDB4MDEpCisJCSpjb2xkID0gMDsKKwllbHNlCisJCSpjb2xkID0gMTsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkZWJfaW5mbygiJXM6IGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogRFZCIFVTQiBEcml2ZXIgc3R1ZmYgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBlYzE2OF9wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IGVjMTY4X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCWRlYl9pbmZvKCIlczogaW50ZXJmYWNlOiVkXG4iLCBfX2Z1bmNfXywKKwkJaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisKKwlyZXQgPSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZlYzE2OF9wcm9wZXJ0aWVzLCBUSElTX01PRFVMRSwgTlVMTCwKKwkJYWRhcHRlcl9ucik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkZWJfaW5mbygiJXM6IGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBFM0NfRUMxNjhfMTY4OSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFM0NfRUMxNjhfRkZGQSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBFM0NfRUMxNjhfRkZGQiAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBFM0NfRUMxNjhfMTAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBFM0NfRUMxNjhfMTAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgNAorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZWMxNjhfaWRbXSA9IHsKKwlbRTNDX0VDMTY4XzE2ODldID0KKwkJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9FM0MsIFVTQl9QSURfRTNDX0VDMTY4KX0sCisJW0UzQ19FQzE2OF9GRkZBXSA9CisJCXtVU0JfREVWSUNFKFVTQl9WSURfRTNDLCBVU0JfUElEX0UzQ19FQzE2OF8yKX0sCisJW0UzQ19FQzE2OF9GRkZCXSA9CisJCXtVU0JfREVWSUNFKFVTQl9WSURfRTNDLCBVU0JfUElEX0UzQ19FQzE2OF8zKX0sCisJW0UzQ19FQzE2OF8xMDAxXSA9CisJCXtVU0JfREVWSUNFKFVTQl9WSURfRTNDLCBVU0JfUElEX0UzQ19FQzE2OF80KX0sCisJW0UzQ19FQzE2OF8xMDAyXSA9CisJCXtVU0JfREVWSUNFKFVTQl9WSURfRTNDLCBVU0JfUElEX0UzQ19FQzE2OF81KX0sCisJe30gLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBlYzE2OF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBlYzE2OF9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKworCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKwkuZG93bmxvYWRfZmlybXdhcmUgPSBlYzE2OF9kb3dubG9hZF9maXJtd2FyZSwKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1lYzE2OC5mdyIsCisJLm5vX3JlY29ubmVjdCA9IDEsCisKKwkuc2l6ZV9vZl9wcml2ID0gMCwKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGVjMTY4X3N0cmVhbWluZ19jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBlYzE2OF9lYzEwMF9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGVjMTY4X214bDUwMDNzX3R1bmVyX2F0dGFjaCwKKwkJCS5zdHJlYW0gPSB7CisJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkuY291bnQgPSA2LAorCQkJCS5lbmRwb2ludCA9IDB4ODIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSAoMzIqNTEyKSwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCisJCX0KKwl9LAorCisJLmlkZW50aWZ5X3N0YXRlID0gZWMxNjhfaWRlbnRpZnlfc3RhdGUsCisKKwkuaTJjX2FsZ28gPSAmZWMxNjhfaTJjX2FsZ28sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsKKwkJCS5uYW1lID0gIkUzQyBFQzE2OCBEVkItVCBVU0IyLjAgcmVmZXJlbmNlIGRlc2lnbiIsCisJCQkuY29sZF9pZHMgPSB7CisJCQkJJmVjMTY4X2lkW0UzQ19FQzE2OF8xNjg5XSwKKwkJCQkmZWMxNjhfaWRbRTNDX0VDMTY4X0ZGRkFdLAorCQkJCSZlYzE2OF9pZFtFM0NfRUMxNjhfRkZGQl0sCisJCQkJJmVjMTY4X2lkW0UzQ19FQzE2OF8xMDAxXSwKKwkJCQkmZWMxNjhfaWRbRTNDX0VDMTY4XzEwMDJdLAorCQkJCU5VTEx9LAorCQkJLndhcm1faWRzID0ge05VTEx9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlYzE2OF9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgPSAiZHZiX3VzYl9lYzE2OCIsCisJLnByb2JlICAgICAgPSBlYzE2OF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlICAgPSBlYzE2OF9pZCwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgZWMxNjhfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKKwlyZXQgPSB1c2JfcmVnaXN0ZXIoJmVjMTY4X2RyaXZlcik7CisJaWYgKHJldCkKKwkJZXJyKCJtb2R1bGUgaW5pdCBmYWlsZWQ6JWQiLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVjMTY4X21vZHVsZV9leGl0KHZvaWQpCit7CisJZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZlYzE2OF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlYzE2OF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChlYzE2OF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFM0MgRUMxNjggRFZCLVQgVVNCMi4wIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9lYzE2OC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9lYzE2OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTBiODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2VjMTY4LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIEUzQyBFQzE2OCBEVkIgVVNCIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBFQzE2OF9ICisjZGVmaW5lIEVDMTY4X0gKKworI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggImVjMTY4IgorI2luY2x1ZGUgImR2Yi11c2IuaCIKKworI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2JfZWMxNjhfZGVidWcsIDB4MDEsIGFyZ3MpCisjZGVmaW5lIGRlYl9yYyhhcmdzLi4uKSAgIGRwcmludGsoZHZiX3VzYl9lYzE2OF9kZWJ1ZywgMHgwMiwgYXJncykKKyNkZWZpbmUgZGViX3hmZXIoYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2VjMTY4X2RlYnVnLCAweDA0LCBhcmdzKQorI2RlZmluZSBkZWJfcmVnKGFyZ3MuLi4pICBkcHJpbnRrKGR2Yl91c2JfZWMxNjhfZGVidWcsIDB4MDgsIGFyZ3MpCisjZGVmaW5lIGRlYl9pMmMoYXJncy4uLikgIGRwcmludGsoZHZiX3VzYl9lYzE2OF9kZWJ1ZywgMHgxMCwgYXJncykKKyNkZWZpbmUgZGViX2Z3KGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2VjMTY4X2RlYnVnLCAweDIwLCBhcmdzKQorCisjZGVmaW5lIGVjMTY4X2RlYnVnX2R1bXAociwgdCwgdiwgaSwgYiwgbCwgZnVuYykgeyBcCisJaW50IGxvb3BfOyBcCisJZnVuYygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwgXAorCQl0LCByLCB2ICYgMHhmZiwgdiA+PiA4LCBpICYgMHhmZiwgaSA+PiA4LCBsICYgMHhmZiwgbCA+PiA4KTsgXAorCWlmICh0ID09IChVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCkpIFwKKwkJZnVuYygiID4+PiAiKTsgXAorCWVsc2UgXAorCQlmdW5jKCIgPDw8ICIpOyBcCisJZm9yIChsb29wXyA9IDA7IGxvb3BfIDwgbDsgbG9vcF8rKykgXAorCQlmdW5jKCIlMDJ4ICIsIGJbbG9vcF9dKTsgXAorCWZ1bmMoIlxuIik7XAorfQorCisjZGVmaW5lIEVDMTY4X1VTQl9USU1FT1VUIDEwMDAKKworc3RydWN0IGVjMTY4X3JlcSB7CisJdTggIGNtZDsgICAgICAgLyogWzFdICovCisJdTE2IHZhbHVlOyAgICAgLyogWzJ8M10gKi8KKwl1MTYgaW5kZXg7ICAgICAvKiBbNHw1XSAqLworCXUxNiBzaXplOyAgICAgIC8qIFs2fDddICovCisJdTggICpkYXRhOworfTsKKworZW51bSBlYzE2OF9jbWQgeworCURPV05MT0FEX0ZJUk1XQVJFICAgID0gMHgwMCwKKwlDT05GSUcgICAgICAgICAgICAgICA9IDB4MDEsCisJREVNT0RfUlcgICAgICAgICAgICAgPSAweDAzLAorCUdQSU8gICAgICAgICAgICAgICAgID0gMHgwNCwKKwlTVFJFQU1JTkdfQ1RSTCAgICAgICA9IDB4MTAsCisJUkVBRF9JMkMgICAgICAgICAgICAgPSAweDIwLAorCVdSSVRFX0kyQyAgICAgICAgICAgID0gMHgyMSwKKwlISURfRE9XTkxPQUQgICAgICAgICA9IDB4MzAsCisJR0VUX0NPTkZJRywKKwlTRVRfQ09ORklHLAorCVJFQURfREVNT0QsCisJV1JJVEVfREVNT0QsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZnJpaW8tZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZnJpaW8tZmUuYwppbmRleCBjNGRmZTI1Li45Y2JiZTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2ZyaWlvLWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9mcmlpby1mZS5jCkBAIC0yMzIsMTIgKzIzMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgamR2YnQ5MDUwMl9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiZXIpCi17Ci0JKmJlciA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgamR2YnQ5MDUwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQkJICAgdTE2ICpzdHJlbmd0aCkKIHsKQEAgLTI2NCwyNiArMjU4LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgamR2YnQ5MDUwMl9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCi17Ci0JKnNuciA9IDB4MDEwMTsKLQlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludCBqZHZidDkwNTAyX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdWNibG9ja3MpCisvKiBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCBwcm9wZXJ0aWVzIHRvIG5vdGlmeSB1c2VycyAqLworc3RhdGljIGludCBqZHZidDkwNTAyX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnApCiB7Ci0JKnVjYmxvY2tzID0gMDsKLQlyZXR1cm4gMDsKLX0KKwlpbnQgciA9IDA7CiAKLXN0YXRpYyBpbnQgamR2YnQ5MDUwMl9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQkJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICpmcykKLXsKLQlmcy0+bWluX2RlbGF5X21zID0gNTAwOwotCWZzLT5zdGVwX3NpemUgPSAwOwotCWZzLT5tYXhfZHJpZnQgPSAwOwotCi0JcmV0dXJuIDA7CisJc3dpdGNoICh0dnAtPmNtZCkgeworCWNhc2UgRFRWX0RFTElWRVJZX1NZU1RFTToKKwkJaWYgKHR2cC0+dS5kYXRhICE9IFNZU19JU0RCVCkKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIERUVl9DTEVBUjoKKwljYXNlIERUVl9UVU5FOgorCWNhc2UgRFRWX0ZSRVFVRU5DWToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC1FSU5WQUw7CisJfQorCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50IGpkdmJ0OTA1MDJfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLApAQCAtMzE0LDYgKzMwOCw5IEBACiAKIAlkZWJfZmUoIiVzOiBGcmVxOiVkXG4iLCBfX2Z1bmNfXywgcC0+ZnJlcXVlbmN5KTsKIAorCS8qIGZvciByZWNvdmVyeSBmcm9tIERUVl9DTEVBTiAqLworCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuZGVsaXZlcnlfc3lzdGVtID0gU1lTX0lTREJUOworCiAJcmV0ID0gamR2YnQ5MDUwMl9wbGxfc2V0X2ZyZXEoc3RhdGUsIHAtPmZyZXF1ZW5jeSk7CiAJaWYgKHJldCkgewogCQlkZWJfZmUoIiVzOnJldCA9PSAlZFxuIiwgX19mdW5jX18sIHJldCk7CkBAIC0zMjMsMTIgKzMyMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgamR2YnQ5MDUwMl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlkZWJfZmUoIiVzIGNhbGxlZC5cbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQogCiAvKioKICAqIChyZWcsIHZhbCkgY29tbWFkIGxpc3QgdG8gaW5pdGlhbGl6ZSB0aGlzIG1vZHVsZS4KQEAgLTM5NCw2ICszODUsNyBAQAogCQlpZiAocmV0ICE9IDEpCiAJCQlnb3RvIGVycm9yOwogCX0KKwlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19JU0RCVDsKIAltc2xlZXAoMTAwKTsKIAogCXJldHVybiAwOwpAQCAtNDY4LDE2ICs0NjAsMTMgQEAKIAkucmVsZWFzZSA9IGpkdmJ0OTA1MDJfcmVsZWFzZSwKIAogCS5pbml0ID0gamR2YnQ5MDUwMl9pbml0LAotCS5zbGVlcCA9IGpkdmJ0OTA1MDJfc2xlZXAsCiAJLndyaXRlID0gX2pkdmJ0OTA1MDJfd3JpdGUsCiAKKwkuc2V0X3Byb3BlcnR5ID0gamR2YnQ5MDUwMl9zZXRfcHJvcGVydHksCisKIAkuc2V0X2Zyb250ZW5kID0gamR2YnQ5MDUwMl9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGpkdmJ0OTA1MDJfZ2V0X2Zyb250ZW5kLAotCS5nZXRfdHVuZV9zZXR0aW5ncyA9IGpkdmJ0OTA1MDJfZ2V0X3R1bmVfc2V0dGluZ3MsCiAKIAkucmVhZF9zdGF0dXMgPSBqZHZidDkwNTAyX3JlYWRfc3RhdHVzLAotCS5yZWFkX2JlciA9IGpkdmJ0OTA1MDJfcmVhZF9iZXIsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gamR2YnQ5MDUwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKLQkucmVhZF9zbnIgPSBqZHZidDkwNTAyX3JlYWRfc25yLAotCS5yZWFkX3VjYmxvY2tzID0gamR2YnQ5MDUwMl9yZWFkX3VjYmxvY2tzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdXNiLXVyYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91c2ItdXJiLmMKaW5kZXggOWRhMmNjOS4uZjk3MDJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91c2ItdXJiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91c2ItdXJiLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAkJCQlzdHJlYW0tPmNvbXBsZXRlKHN0cmVhbSwgYiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZXJyKCJ1bmtvd24gZW5kcG9pbnQgdHlwZSBpbiBjb21wbGV0aXRpb24gaGFuZGxlci4iKTsKKwkJCWVycigidW5rbm93biBlbmRwb2ludCB0eXBlIGluIGNvbXBsZXRpdGlvbiBoYW5kbGVyLiIpOwogCQkJcmV0dXJuOwogCX0KIAl1c2Jfc3VibWl0X3VyYih1cmIsR0ZQX0FUT01JQyk7CkBAIC0yMjgsNyArMjI4LDcgQEAKIAkJY2FzZSBVU0JfSVNPQzoKIAkJCXJldHVybiB1c2JfaXNvY191cmJfaW5pdChzdHJlYW0pOwogCQlkZWZhdWx0OgotCQkJZXJyKCJ1bmtvd24gVVJCLXR5cGUgZm9yIGRhdGEgdHJhbnNmZXIuIik7CisJCQllcnIoInVua25vd24gVVJCLXR5cGUgZm9yIGRhdGEgdHJhbnNmZXIuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvS2NvbmZpZwppbmRleCA2OTAyODI1Li40YWZhMjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgRFZCX0ZJUkVEVFYKIAl0cmlzdGF0ZSAiRmlyZURUViBhbmQgRmxvcHB5RFRWIgotCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSUVFRTEzOTQKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIChGSVJFV0lSRSB8fCBJRUVFMTM5NCkKIAloZWxwCiAJICBTdXBwb3J0IGZvciBEVkIgcmVjZWl2ZXJzIGZyb20gRGlnaXRhbCBFdmVyeXdoZXJlCiAJICB3aGljaCBhcmUgY29ubmVjdGVkIHZpYSBJRUVFIDEzOTQgKEZpcmVXaXJlKS4KQEAgLTEzLDggKzEzLDExIEBACiAKIGlmIERWQl9GSVJFRFRWCiAKK2NvbmZpZyBEVkJfRklSRURUVl9GSVJFV0lSRQorCWRlZl9ib29sIEZJUkVXSVJFID0geSB8fCAoRklSRVdJUkUgPSBtICYmIERWQl9GSVJFRFRWID0gbSkKKwogY29uZmlnIERWQl9GSVJFRFRWX0lFRUUxMzk0Ci0JZGVmX2Jvb2wgSUVFRTEzOTQKKwlkZWZfYm9vbCBJRUVFMTM5NCA9IHkgfHwgKElFRUUxMzk0ID0gbSAmJiBEVkJfRklSRURUViA9IG0pCiAKIGNvbmZpZyBEVkJfRklSRURUVl9JTlBVVAogCWRlZl9ib29sIElOUFVUID0geSB8fCAoSU5QVVQgPSBtICYmIERWQl9GSVJFRFRWID0gbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvTWFrZWZpbGUKaW5kZXggMjAzNDY5NS4uZGE4NDIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBvYmotJChDT05GSUdfRFZCX0ZJUkVEVFYpICs9IGZpcmVkdHYubwogCiBmaXJlZHR2LXkgOj0gZmlyZWR0di1hdmMubyBmaXJlZHR2LWNpLm8gZmlyZWR0di1kdmIubyBmaXJlZHR2LWZlLm8KK2ZpcmVkdHYtJChDT05GSUdfRFZCX0ZJUkVEVFZfRklSRVdJUkUpICs9IGZpcmVkdHYtZncubwogZmlyZWR0di0kKENPTkZJR19EVkJfRklSRURUVl9JRUVFMTM5NCkgKz0gZmlyZWR0di0xMzk0Lm8KIGZpcmVkdHYtJChDT05GSUdfRFZCX0ZJUkVEVFZfSU5QVVQpICAgICs9IGZpcmVkdHYtcmMubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LTEzOTQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtMTM5NC5jCmluZGV4IDJiNmVlZWEuLjdjNTQ1OWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LTEzOTQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LTEzOTQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBGaXJlRFRWIGRyaXZlciAoZm9ybWVybHkga25vd24gYXMgRmlyZVNBVCkKKyAqIEZpcmVEVFYgZHJpdmVyIC0tIGllZWUxMzk0IEkvTyBiYWNrZW5kCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFuZHJlYXMgTW9uaXR6ZXIgPGFuZHlAbW9uaXR6ZXIuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQmVuIEJhY2t4IDxiZW5AYmJhY2t4LmNvbT4KQEAgLTI2LDEzICsyNiwxNiBAQAogI2luY2x1ZGUgPGlzby5oPgogI2luY2x1ZGUgPG5vZGVtZ3IuaD4KIAorI2luY2x1ZGUgPGR2Yl9kZW11eC5oPgorCiAjaW5jbHVkZSAiZmlyZWR0di5oIgogCiBzdGF0aWMgTElTVF9IRUFEKG5vZGVfbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5vZGVfbGlzdF9sb2NrKTsKIAotI2RlZmluZSBGSVJFV0lSRV9IRUFERVJfU0laRQk0Ci0jZGVmaW5lIENJUF9IRUFERVJfU0laRQkJOAorI2RlZmluZSBDSVBfSEVBREVSX1NJWkUJCQk4CisjZGVmaW5lIE1QRUcyX1RTX0hFQURFUl9TSVpFCQk0CisjZGVmaW5lIE1QRUcyX1RTX1NPVVJDRV9QQUNLRVRfU0laRQkoNCArIDE4OCkKIAogc3RhdGljIHZvaWQgcmF3aXNvX2FjdGl2aXR5X2NiKHN0cnVjdCBocHNiX2lzbyAqaXNvKQogewpAQCAtNjIsMjAgKzY1LDIwIEBACiAJCWJ1ZiA9IGRtYV9yZWdpb25faSgmaXNvLT5kYXRhX2J1ZiwgdW5zaWduZWQgY2hhciwKIAkJCWlzby0+aW5mb3NbcGFja2V0XS5vZmZzZXQgKyBDSVBfSEVBREVSX1NJWkUpOwogCQljb3VudCA9IChpc28tPmluZm9zW3BhY2tldF0ubGVuIC0gQ0lQX0hFQURFUl9TSVpFKSAvCi0JCQkoMTg4ICsgRklSRVdJUkVfSEVBREVSX1NJWkUpOworCQkJTVBFRzJfVFNfU09VUkNFX1BBQ0tFVF9TSVpFOwogCiAJCS8qIGlnbm9yZSBlbXB0eSBwYWNrZXQgKi8KIAkJaWYgKGlzby0+aW5mb3NbcGFja2V0XS5sZW4gPD0gQ0lQX0hFQURFUl9TSVpFKQogCQkJY29udGludWU7CiAKIAkJd2hpbGUgKGNvdW50LS0pIHsKLQkJCWlmIChidWZbRklSRVdJUkVfSEVBREVSX1NJWkVdID09IDB4NDcpCisJCQlpZiAoYnVmW01QRUcyX1RTX0hFQURFUl9TSVpFXSA9PSAweDQ3KQogCQkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cygmZmR0di0+ZGVtdXgsCi0JCQkJCQkmYnVmW0ZJUkVXSVJFX0hFQURFUl9TSVpFXSwgMSk7CisJCQkJCQkmYnVmW01QRUcyX1RTX0hFQURFUl9TSVpFXSwgMSk7CiAJCQllbHNlCiAJCQkJZGV2X2VycihmZHR2LT5kZXZpY2UsCiAJCQkJCSJza2lwcGluZyBpbnZhbGlkIHBhY2tldFxuIik7Ci0JCQlidWYgKz0gMTg4ICsgRklSRVdJUkVfSEVBREVSX1NJWkU7CisJCQlidWYgKz0gTVBFRzJfVFNfU09VUkNFX1BBQ0tFVF9TSVpFOwogCQl9CiAJfQogb3V0OgpAQCAtODcsMTUgKzkwLDIwIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihmZHR2LT5kZXZpY2UsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgZGV2aWNlKS0+bmU7CiB9CiAKLXN0YXRpYyBpbnQgbm9kZV9sb2NrKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB1NjQgYWRkciwgdm9pZCAqZGF0YSwgX19iZTMyIGFyZykKK3N0YXRpYyBpbnQgbm9kZV9sb2NrKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB1NjQgYWRkciwgX19iZTMyIGRhdGFbXSkKIHsKLQlyZXR1cm4gaHBzYl9ub2RlX2xvY2sobm9kZV9vZihmZHR2KSwgYWRkciwgRVhUQ09ERV9DT01QQVJFX1NXQVAsIGRhdGEsCi0JCQkgICAgICAoX19mb3JjZSBxdWFkbGV0X3QpYXJnKTsKKwlpbnQgcmV0OworCisJcmV0ID0gaHBzYl9ub2RlX2xvY2sobm9kZV9vZihmZHR2KSwgYWRkciwgRVhUQ09ERV9DT01QQVJFX1NXQVAsCisJCShfX2ZvcmNlIHF1YWRsZXRfdCAqKSZkYXRhWzFdLCAoX19mb3JjZSBxdWFkbGV0X3QpZGF0YVswXSk7CisJZGF0YVswXSA9IGRhdGFbMV07CisKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG5vZGVfcmVhZChzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdTY0IGFkZHIsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IG5vZGVfcmVhZChzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdTY0IGFkZHIsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIGhwc2Jfbm9kZV9yZWFkKG5vZGVfb2YoZmR0diksIGFkZHIsIGRhdGEsIGxlbik7CisJcmV0dXJuIGhwc2Jfbm9kZV9yZWFkKG5vZGVfb2YoZmR0diksIGFkZHIsIGRhdGEsIDQpOwogfQogCiBzdGF0aWMgaW50IG5vZGVfd3JpdGUoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHU2NCBhZGRyLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQpAQCAtMjEyLDYgKzIyMCw3IEBACiAJCWdvdG8gZmFpbDsKIAogCWF2Y19yZWdpc3Rlcl9yZW1vdGVfY29udHJvbChmZHR2KTsKKwogCXJldHVybiAwOwogZmFpbDoKIAlzcGluX2xvY2tfaXJxKCZub2RlX2xpc3RfbG9jayk7CkBAIC0yMjAsNiArMjI5LDcgQEAKIAlmZHR2X3VucmVnaXN0ZXJfcmMoZmR0dik7CiBmYWlsX2ZyZWU6CiAJa2ZyZWUoZmR0dik7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMzMsMTAgKzI0Myw5IEBACiAJbGlzdF9kZWwoJmZkdHYtPmxpc3QpOwogCXNwaW5fdW5sb2NrX2lycSgmbm9kZV9saXN0X2xvY2spOwogCi0JY2FuY2VsX3dvcmtfc3luYygmZmR0di0+cmVtb3RlX2N0cmxfd29yayk7CiAJZmR0dl91bnJlZ2lzdGVyX3JjKGZkdHYpOwotCiAJa2ZyZWUoZmR0dik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjUyLDYgKzI2MSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgZmR0dl9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gImZpcmVkdHYiLAorCS5pZF90YWJsZQk9IGZkdHZfaWRfdGFibGUsCiAJLnVwZGF0ZQkJPSBub2RlX3VwZGF0ZSwKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5wcm9iZSAgPSBub2RlX3Byb2JlLApAQCAtMjY0LDEyICsyNzQsMTEgQEAKIAkuZmNwX3JlcXVlc3QJPSBmY3BfcmVxdWVzdCwKIH07CiAKLWludCBfX2luaXQgZmR0dl8xMzk0X2luaXQoc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBpZF90YWJsZVtdKQoraW50IF9faW5pdCBmZHR2XzEzOTRfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKIAlocHNiX3JlZ2lzdGVyX2hpZ2hsZXZlbCgmZmR0dl9oaWdobGV2ZWwpOwotCWZkdHZfZHJpdmVyLmlkX3RhYmxlID0gaWRfdGFibGU7CiAJcmV0ID0gaHBzYl9yZWdpc3Rlcl9wcm90b2NvbCgmZmR0dl9kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmaXJlZHR2OiBmYWlsZWQgdG8gcmVnaXN0ZXIgcHJvdG9jb2xcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1hdmMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtYXZjLmMKaW5kZXggNDg1ZDA2MS4uNTBjNDJhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1hdmMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWF2Yy5jCkBAIC0xMjM2LDE0ICsxMjM2LDE0IEBACiAKICNkZWZpbmUgQ01QX09VVFBVVF9QTFVHX0NPTlRST0xfUkVHXzAJMHhmZmZmZjAwMDA5MDRVTEwKIAotc3RhdGljIGludCBjbXBfcmVhZChzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdm9pZCAqYnVmLCB1NjQgYWRkciwgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgY21wX3JlYWQoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHU2NCBhZGRyLCBfX2JlMzIgKmRhdGEpCiB7CiAJaW50IHJldDsKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZkdHYtPmF2Y19tdXRleCkpCiAJCXJldHVybiAtRUlOVFI7CiAKLQlyZXQgPSBmZHR2LT5iYWNrZW5kLT5yZWFkKGZkdHYsIGFkZHIsIGJ1ZiwgbGVuKTsKKwlyZXQgPSBmZHR2LT5iYWNrZW5kLT5yZWFkKGZkdHYsIGFkZHIsIGRhdGEpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKGZkdHYtPmRldmljZSwgIkNNUDogcmVhZCBJL08gZXJyb3JcbiIpOwogCkBAIC0xMjUxLDE0ICsxMjUxLDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBjbXBfbG9jayhzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdm9pZCAqZGF0YSwgdTY0IGFkZHIsIF9fYmUzMiBhcmcpCitzdGF0aWMgaW50IGNtcF9sb2NrKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB1NjQgYWRkciwgX19iZTMyIGRhdGFbXSkKIHsKIAlpbnQgcmV0OwogCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZmR0di0+YXZjX211dGV4KSkKIAkJcmV0dXJuIC1FSU5UUjsKIAotCXJldCA9IGZkdHYtPmJhY2tlbmQtPmxvY2soZmR0diwgYWRkciwgZGF0YSwgYXJnKTsKKwlyZXQgPSBmZHR2LT5iYWNrZW5kLT5sb2NrKGZkdHYsIGFkZHIsIGRhdGEpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKGZkdHYtPmRldmljZSwgIkNNUDogbG9jayBJL08gZXJyb3JcbiIpOwogCkBAIC0xMjg4LDI1ICsxMjg4LDI1IEBACiAKIGludCBjbXBfZXN0YWJsaXNoX3BwX2Nvbm5lY3Rpb24oc3RydWN0IGZpcmVkdHYgKmZkdHYsIGludCBwbHVnLCBpbnQgY2hhbm5lbCkKIHsKLQlfX2JlMzIgb2xkX29wY3IsIG9wY3I7CisJX19iZTMyIG9sZF9vcGNyLCBvcGNyWzJdOwogCXU2NCBvcGNyX2FkZHJlc3MgPSBDTVBfT1VUUFVUX1BMVUdfQ09OVFJPTF9SRUdfMCArIChwbHVnIDw8IDIpOwogCWludCBhdHRlbXB0cyA9IDA7CiAJaW50IHJldDsKIAotCXJldCA9IGNtcF9yZWFkKGZkdHYsICZvcGNyLCBvcGNyX2FkZHJlc3MsIDQpOworCXJldCA9IGNtcF9yZWFkKGZkdHYsIG9wY3JfYWRkcmVzcywgb3Bjcik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIHJlcGVhdDoKLQlpZiAoIWdldF9vcGNyX29ubGluZShvcGNyKSkgeworCWlmICghZ2V0X29wY3Jfb25saW5lKCpvcGNyKSkgewogCQlkZXZfZXJyKGZkdHYtPmRldmljZSwgIkNNUDogb3V0cHV0IG9mZmxpbmVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCW9sZF9vcGNyID0gb3BjcjsKKwlvbGRfb3BjciA9ICpvcGNyOwogCi0JaWYgKGdldF9vcGNyX3AycF9jb25uZWN0aW9ucyhvcGNyKSkgewotCQlpZiAoZ2V0X29wY3JfY2hhbm5lbChvcGNyKSAhPSBjaGFubmVsKSB7CisJaWYgKGdldF9vcGNyX3AycF9jb25uZWN0aW9ucygqb3BjcikpIHsKKwkJaWYgKGdldF9vcGNyX2NoYW5uZWwoKm9wY3IpICE9IGNoYW5uZWwpIHsKIAkJCWRldl9lcnIoZmR0di0+ZGV2aWNlLCAiQ01QOiBjYW5ub3QgY2hhbmdlIGNoYW5uZWxcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQpAQCAtMTMxNCwxMSArMTMxNCwxMSBAQAogCiAJCS8qIFdlIGRvbid0IGFsbG9jYXRlIGlzb2Nocm9ub3VzIHJlc291cmNlcy4gKi8KIAl9IGVsc2UgewotCQlzZXRfb3Bjcl9jaGFubmVsKCZvcGNyLCBjaGFubmVsKTsKLQkJc2V0X29wY3JfZGF0YV9yYXRlKCZvcGNyLCAyKTsgLyogUzQwMCAqLworCQlzZXRfb3Bjcl9jaGFubmVsKG9wY3IsIGNoYW5uZWwpOworCQlzZXRfb3Bjcl9kYXRhX3JhdGUob3BjciwgMik7IC8qIFM0MDAgKi8KIAogCQkvKiBGSVhNRTogdGhpcyBpcyBmb3IgdGhlIHdvcnN0IGNhc2UgLSBvcHRpbWl6ZSAqLwotCQlzZXRfb3Bjcl9vdmVyaGVhZF9pZCgmb3BjciwgMCk7CisJCXNldF9vcGNyX292ZXJoZWFkX2lkKG9wY3IsIDApOwogCiAJCS8qCiAJCSAqIEZJWE1FOiBhbGxvY2F0ZSBpc29jaHJvbm91cyBjaGFubmVsIGFuZCBiYW5kd2lkdGggYXQgSVJNCkBAIC0xMzI2LDEzICsxMzI2LDE2IEBACiAJCSAqLwogCX0KIAotCXNldF9vcGNyX3AycF9jb25uZWN0aW9ucygmb3BjciwgZ2V0X29wY3JfcDJwX2Nvbm5lY3Rpb25zKG9wY3IpICsgMSk7CisJc2V0X29wY3JfcDJwX2Nvbm5lY3Rpb25zKG9wY3IsIGdldF9vcGNyX3AycF9jb25uZWN0aW9ucygqb3BjcikgKyAxKTsKIAotCXJldCA9IGNtcF9sb2NrKGZkdHYsICZvcGNyLCBvcGNyX2FkZHJlc3MsIG9sZF9vcGNyKTsKKwlvcGNyWzFdID0gKm9wY3I7CisJb3BjclswXSA9IG9sZF9vcGNyOworCisJcmV0ID0gY21wX2xvY2soZmR0diwgb3Bjcl9hZGRyZXNzLCBvcGNyKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChvbGRfb3BjciAhPSBvcGNyKSB7CisJaWYgKG9sZF9vcGNyICE9ICpvcGNyKSB7CiAJCS8qCiAJCSAqIEZJWE1FOiBpZiBvbGRfb3Bjci5QMlBfQ29ubmVjdGlvbnMgPiAwLAogCQkgKiBkZWFsbG9jYXRlIGlzb2Nocm9ub3VzIGNoYW5uZWwgYW5kIGJhbmR3aWR0aCBhdCBJUk0KQEAgLTEzNTAsMjcgKzEzNTMsMzAgQEAKIAogdm9pZCBjbXBfYnJlYWtfcHBfY29ubmVjdGlvbihzdHJ1Y3QgZmlyZWR0diAqZmR0diwgaW50IHBsdWcsIGludCBjaGFubmVsKQogewotCV9fYmUzMiBvbGRfb3Bjciwgb3BjcjsKKwlfX2JlMzIgb2xkX29wY3IsIG9wY3JbMl07CiAJdTY0IG9wY3JfYWRkcmVzcyA9IENNUF9PVVRQVVRfUExVR19DT05UUk9MX1JFR18wICsgKHBsdWcgPDwgMik7CiAJaW50IGF0dGVtcHRzID0gMDsKIAotCWlmIChjbXBfcmVhZChmZHR2LCAmb3Bjciwgb3Bjcl9hZGRyZXNzLCA0KSA8IDApCisJaWYgKGNtcF9yZWFkKGZkdHYsIG9wY3JfYWRkcmVzcywgb3BjcikgPCAwKQogCQlyZXR1cm47CiAKIHJlcGVhdDoKLQlpZiAoIWdldF9vcGNyX29ubGluZShvcGNyKSB8fCAhZ2V0X29wY3JfcDJwX2Nvbm5lY3Rpb25zKG9wY3IpIHx8Ci0JICAgIGdldF9vcGNyX2NoYW5uZWwob3BjcikgIT0gY2hhbm5lbCkgeworCWlmICghZ2V0X29wY3Jfb25saW5lKCpvcGNyKSB8fCAhZ2V0X29wY3JfcDJwX2Nvbm5lY3Rpb25zKCpvcGNyKSB8fAorCSAgICBnZXRfb3Bjcl9jaGFubmVsKCpvcGNyKSAhPSBjaGFubmVsKSB7CiAJCWRldl9lcnIoZmR0di0+ZGV2aWNlLCAiQ01QOiBubyBjb25uZWN0aW9uIHRvIGJyZWFrXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCW9sZF9vcGNyID0gb3BjcjsKLQlzZXRfb3Bjcl9wMnBfY29ubmVjdGlvbnMoJm9wY3IsIGdldF9vcGNyX3AycF9jb25uZWN0aW9ucyhvcGNyKSAtIDEpOworCW9sZF9vcGNyID0gKm9wY3I7CisJc2V0X29wY3JfcDJwX2Nvbm5lY3Rpb25zKG9wY3IsIGdldF9vcGNyX3AycF9jb25uZWN0aW9ucygqb3BjcikgLSAxKTsKIAotCWlmIChjbXBfbG9jayhmZHR2LCAmb3Bjciwgb3Bjcl9hZGRyZXNzLCBvbGRfb3BjcikgPCAwKQorCW9wY3JbMV0gPSAqb3BjcjsKKwlvcGNyWzBdID0gb2xkX29wY3I7CisKKwlpZiAoY21wX2xvY2soZmR0diwgb3Bjcl9hZGRyZXNzLCBvcGNyKSA8IDApCiAJCXJldHVybjsKIAotCWlmIChvbGRfb3BjciAhPSBvcGNyKSB7CisJaWYgKG9sZF9vcGNyICE9ICpvcGNyKSB7CiAJCS8qCiAJCSAqIEZJWE1FOiBpZiBvbGRfb3Bjci5QMlBfQ29ubmVjdGlvbnMgPT0gMSwgaS5lLiB3ZSB3ZXJlIGxhc3QKIAkJICogb3duZXIsIGRlYWxsb2NhdGUgaXNvY2hyb25vdXMgY2hhbm5lbCBhbmQgYmFuZHdpZHRoIGF0IElSTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtZHZiLmMKaW5kZXggNTc0MmZkZS4uZmM5OTk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWR2Yi5jCkBAIC0yOTcsNyArMjk3LDcgQEAKICNkZWZpbmUgQVZDX1VOSVRfU1BFQ19JRF9FTlRSWQkweDAwYTAyZAogI2RlZmluZSBBVkNfU1dfVkVSU0lPTl9FTlRSWQkweDAxMDAwMQogCi1zdGF0aWMgc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBmZHR2X2lkX3RhYmxlW10gPSB7Citjb25zdCBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkIGZkdHZfaWRfdGFibGVbXSA9IHsKIAl7CiAJCS8qIEZsb3BweURUViBTL0NJIGFuZCBGbG9wcHlEVFYgUzIgKi8KIAkJLm1hdGNoX2ZsYWdzCT0gTUFUQ0hfRkxBR1MsCkBAIC0zNDYsMTIgKzM0NiwyMyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBmZHR2X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZmR0dl8xMzk0X2luaXQoZmR0dl9pZF90YWJsZSk7CisJaW50IHJldDsKKworCXJldCA9IGZkdHZfZndfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZmR0dl8xMzk0X2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJZmR0dl9md19leGl0KCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmR0dl9leGl0KHZvaWQpCiB7CiAJZmR0dl8xMzk0X2V4aXQoKTsKKwlmZHR2X2Z3X2V4aXQoKTsKIH0KIAogbW9kdWxlX2luaXQoZmR0dl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtZncuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQ0Nzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1mdy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogRmlyZURUViBkcml2ZXIgLS0gZmlyZXdpcmUgSS9PIGJhY2tlbmQKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLWNvbnN0YW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSA8ZHZiX2RlbXV4Lmg+CisKKyNpbmNsdWRlICJmaXJlZHR2LmgiCisKK3N0YXRpYyBMSVNUX0hFQUQobm9kZV9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobm9kZV9saXN0X2xvY2spOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmd19kZXZpY2UgKmRldmljZV9vZihzdHJ1Y3QgZmlyZWR0diAqZmR0dikKK3sKKwlyZXR1cm4gZndfZGV2aWNlKGZkdHYtPmRldmljZS0+cGFyZW50KTsKK30KKworc3RhdGljIGludCBub2RlX3JlcShzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdTY0IGFkZHIsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sCisJCSAgICBpbnQgdGNvZGUpCit7CisJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlID0gZGV2aWNlX29mKGZkdHYpOworCWludCByY29kZSwgZ2VuZXJhdGlvbiA9IGRldmljZS0+Z2VuZXJhdGlvbjsKKworCXNtcF9ybWIoKTsgLyogbm9kZV9pZCB2cy4gZ2VuZXJhdGlvbiAqLworCisJcmNvZGUgPSBmd19ydW5fdHJhbnNhY3Rpb24oZGV2aWNlLT5jYXJkLCB0Y29kZSwgZGV2aWNlLT5ub2RlX2lkLAorCQkJZ2VuZXJhdGlvbiwgZGV2aWNlLT5tYXhfc3BlZWQsIGFkZHIsIGRhdGEsIGxlbik7CisKKwlyZXR1cm4gcmNvZGUgIT0gUkNPREVfQ09NUExFVEUgPyAtRUlPIDogMDsKK30KKworc3RhdGljIGludCBub2RlX2xvY2soc3RydWN0IGZpcmVkdHYgKmZkdHYsIHU2NCBhZGRyLCBfX2JlMzIgZGF0YVtdKQoreworCXJldHVybiBub2RlX3JlcShmZHR2LCBhZGRyLCBkYXRhLCA4LCBUQ09ERV9MT0NLX0NPTVBBUkVfU1dBUCk7Cit9CisKK3N0YXRpYyBpbnQgbm9kZV9yZWFkKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB1NjQgYWRkciwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gbm9kZV9yZXEoZmR0diwgYWRkciwgZGF0YSwgNCwgVENPREVfUkVBRF9RVUFETEVUX1JFUVVFU1QpOworfQorCitzdGF0aWMgaW50IG5vZGVfd3JpdGUoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHU2NCBhZGRyLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXJldHVybiBub2RlX3JlcShmZHR2LCBhZGRyLCBkYXRhLCBsZW4sIFRDT0RFX1dSSVRFX0JMT0NLX1JFUVVFU1QpOworfQorCisjZGVmaW5lIElTT19IRUFERVJfU0laRQkJCTQKKyNkZWZpbmUgQ0lQX0hFQURFUl9TSVpFCQkJOAorI2RlZmluZSBNUEVHMl9UU19IRUFERVJfU0laRQkJNAorI2RlZmluZSBNUEVHMl9UU19TT1VSQ0VfUEFDS0VUX1NJWkUJKDQgKyAxODgpCisKKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFCQkxMDI0ICAvKiA3NzYsIHJvdW5kZWQgdXAgdG8gMl5uICovCisjZGVmaW5lIFBBQ0tFVFNfUEVSX1BBR0UJKFBBR0VfU0laRSAvIE1BWF9QQUNLRVRfU0laRSkKKyNkZWZpbmUgTl9QQUNLRVRTCQk2NCAgICAvKiBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBOX1BBR0VTCQkJRElWX1JPVU5EX1VQKE5fUEFDS0VUUywgUEFDS0VUU19QRVJfUEFHRSkKKyNkZWZpbmUgSVJRX0lOVEVSVkFMCQkxNgorCitzdHJ1Y3QgZmlyZWR0dl9yZWNlaXZlX2NvbnRleHQgeworCXN0cnVjdCBmd19pc29fY29udGV4dCAqY29udGV4dDsKKwlzdHJ1Y3QgZndfaXNvX2J1ZmZlciBidWZmZXI7CisJaW50IGludGVycnVwdF9wYWNrZXQ7CisJaW50IGN1cnJlbnRfcGFja2V0OworCWNoYXIgKnBhZ2VzW05fUEFHRVNdOworfTsKKworc3RhdGljIGludCBxdWV1ZV9pc28oc3RydWN0IGZpcmVkdHZfcmVjZWl2ZV9jb250ZXh0ICpjdHgsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZndfaXNvX3BhY2tldCBwOworCisJcC5wYXlsb2FkX2xlbmd0aCA9IE1BWF9QQUNLRVRfU0laRTsKKwlwLmludGVycnVwdCA9ICEoKytjdHgtPmludGVycnVwdF9wYWNrZXQgJiAoSVJRX0lOVEVSVkFMIC0gMSkpOworCXAuc2tpcCA9IDA7CisJcC5oZWFkZXJfbGVuZ3RoID0gSVNPX0hFQURFUl9TSVpFOworCisJcmV0dXJuIGZ3X2lzb19jb250ZXh0X3F1ZXVlKGN0eC0+Y29udGV4dCwgJnAsICZjdHgtPmJ1ZmZlciwKKwkJCQkgICAgaW5kZXggKiBNQVhfUEFDS0VUX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfaXNvKHN0cnVjdCBmd19pc29fY29udGV4dCAqY29udGV4dCwgdTMyIGN5Y2xlLAorCQkgICAgICAgc2l6ZV90IGhlYWRlcl9sZW5ndGgsIHZvaWQgKmhlYWRlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZmlyZWR0diAqZmR0diA9IGRhdGE7CisJc3RydWN0IGZpcmVkdHZfcmVjZWl2ZV9jb250ZXh0ICpjdHggPSBmZHR2LT5iYWNrZW5kX2RhdGE7CisJX19iZTMyICpoLCAqaF9lbmQ7CisJaW50IGxlbmd0aCwgZXJyLCBpID0gY3R4LT5jdXJyZW50X3BhY2tldDsKKwljaGFyICpwLCAqcF9lbmQ7CisKKwlmb3IgKGggPSBoZWFkZXIsIGhfZW5kID0gaCArIGhlYWRlcl9sZW5ndGggLyA0OyBoIDwgaF9lbmQ7IGgrKykgeworCQlsZW5ndGggPSBiZTMyX3RvX2NwdXAoaCkgPj4gMTY7CisJCWlmICh1bmxpa2VseShsZW5ndGggPiBNQVhfUEFDS0VUX1NJWkUpKSB7CisJCQlkZXZfZXJyKGZkdHYtPmRldmljZSwgImxlbmd0aCA9ICVkXG4iLCBsZW5ndGgpOworCQkJbGVuZ3RoID0gTUFYX1BBQ0tFVF9TSVpFOworCQl9CisKKwkJcCA9IGN0eC0+cGFnZXNbaSAvIFBBQ0tFVFNfUEVSX1BBR0VdCisJCQkJKyAoaSAlIFBBQ0tFVFNfUEVSX1BBR0UpICogTUFYX1BBQ0tFVF9TSVpFOworCQlwX2VuZCA9IHAgKyBsZW5ndGg7CisKKwkJZm9yIChwICs9IENJUF9IRUFERVJfU0laRSArIE1QRUcyX1RTX0hFQURFUl9TSVpFOyBwIDwgcF9lbmQ7CisJCSAgICAgcCArPSBNUEVHMl9UU19TT1VSQ0VfUEFDS0VUX1NJWkUpCisJCQlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoJmZkdHYtPmRlbXV4LCBwLCAxKTsKKworCQllcnIgPSBxdWV1ZV9pc28oY3R4LCBpKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlkZXZfZXJyKGZkdHYtPmRldmljZSwgInJlcXVldWUgZmFpbGVkXG4iKTsKKworCQlpID0gKGkgKyAxKSAmIChOX1BBQ0tFVFMgLSAxKTsKKwl9CisJY3R4LT5jdXJyZW50X3BhY2tldCA9IGk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfaXNvKHN0cnVjdCBmaXJlZHR2ICpmZHR2KQoreworCXN0cnVjdCBmaXJlZHR2X3JlY2VpdmVfY29udGV4dCAqY3R4OworCXN0cnVjdCBmd19kZXZpY2UgKmRldmljZSA9IGRldmljZV9vZihmZHR2KTsKKwlpbnQgaSwgZXJyOworCisJY3R4ID0ga21hbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN0eC0+Y29udGV4dCA9IGZ3X2lzb19jb250ZXh0X2NyZWF0ZShkZXZpY2UtPmNhcmQsCisJCQlGV19JU09fQ09OVEVYVF9SRUNFSVZFLCBmZHR2LT5pc29jaGFubmVsLAorCQkJZGV2aWNlLT5tYXhfc3BlZWQsIElTT19IRUFERVJfU0laRSwgaGFuZGxlX2lzbywgZmR0dik7CisJaWYgKElTX0VSUihjdHgtPmNvbnRleHQpKSB7CisJCWVyciA9IFBUUl9FUlIoY3R4LT5jb250ZXh0KTsKKwkJZ290byBmYWlsX2ZyZWU7CisJfQorCisJZXJyID0gZndfaXNvX2J1ZmZlcl9pbml0KCZjdHgtPmJ1ZmZlciwgZGV2aWNlLT5jYXJkLAorCQkJCSBOX1BBR0VTLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9jb250ZXh0X2Rlc3Ryb3k7CisKKwljdHgtPmludGVycnVwdF9wYWNrZXQgPSAwOworCWN0eC0+Y3VycmVudF9wYWNrZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5fUEFHRVM7IGkrKykKKwkJY3R4LT5wYWdlc1tpXSA9IHBhZ2VfYWRkcmVzcyhjdHgtPmJ1ZmZlci5wYWdlc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9QQUNLRVRTOyBpKyspIHsKKwkJZXJyID0gcXVldWVfaXNvKGN0eCwgaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gZndfaXNvX2NvbnRleHRfc3RhcnQoY3R4LT5jb250ZXh0LCAtMSwgMCwKKwkJCQkgICBGV19JU09fQ09OVEVYVF9NQVRDSF9BTExfVEFHUyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJZmR0di0+YmFja2VuZF9kYXRhID0gY3R4OworCisJcmV0dXJuIDA7CitmYWlsOgorCWZ3X2lzb19idWZmZXJfZGVzdHJveSgmY3R4LT5idWZmZXIsIGRldmljZS0+Y2FyZCk7CitmYWlsX2NvbnRleHRfZGVzdHJveToKKwlmd19pc29fY29udGV4dF9kZXN0cm95KGN0eC0+Y29udGV4dCk7CitmYWlsX2ZyZWU6CisJa2ZyZWUoY3R4KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfaXNvKHN0cnVjdCBmaXJlZHR2ICpmZHR2KQoreworCXN0cnVjdCBmaXJlZHR2X3JlY2VpdmVfY29udGV4dCAqY3R4ID0gZmR0di0+YmFja2VuZF9kYXRhOworCisJZndfaXNvX2NvbnRleHRfc3RvcChjdHgtPmNvbnRleHQpOworCWZ3X2lzb19idWZmZXJfZGVzdHJveSgmY3R4LT5idWZmZXIsIGRldmljZV9vZihmZHR2KS0+Y2FyZCk7CisJZndfaXNvX2NvbnRleHRfZGVzdHJveShjdHgtPmNvbnRleHQpOworCWtmcmVlKGN0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlyZWR0dl9iYWNrZW5kIGJhY2tlbmQgPSB7CisJLmxvY2sJCT0gbm9kZV9sb2NrLAorCS5yZWFkCQk9IG5vZGVfcmVhZCwKKwkud3JpdGUJCT0gbm9kZV93cml0ZSwKKwkuc3RhcnRfaXNvCT0gc3RhcnRfaXNvLAorCS5zdG9wX2lzbwk9IHN0b3BfaXNvLAorfTsKKworc3RhdGljIHZvaWQgaGFuZGxlX2ZjcChzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgc3RydWN0IGZ3X3JlcXVlc3QgKnJlcXVlc3QsCisJCSAgICAgICBpbnQgdGNvZGUsIGludCBkZXN0aW5hdGlvbiwgaW50IHNvdXJjZSwgaW50IGdlbmVyYXRpb24sCisJCSAgICAgICBpbnQgc3BlZWQsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsCisJCSAgICAgICB2b2lkICpwYXlsb2FkLCBzaXplX3QgbGVuZ3RoLCB2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBmaXJlZHR2ICpmLCAqZmR0diA9IE5VTEw7CisJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN1OworCisJaWYgKCh0Y29kZSAhPSBUQ09ERV9XUklURV9RVUFETEVUX1JFUVVFU1QgJiYKKwkgICAgIHRjb2RlICE9IFRDT0RFX1dSSVRFX0JMT0NLX1JFUVVFU1QpIHx8CisJICAgIG9mZnNldCAhPSBDU1JfUkVHSVNURVJfQkFTRSArIENTUl9GQ1BfUkVTUE9OU0UgfHwKKwkgICAgbGVuZ3RoID09IDAgfHwKKwkgICAgKCgodTggKilwYXlsb2FkKVswXSAmIDB4ZjApICE9IDApIHsKKwkJZndfc2VuZF9yZXNwb25zZShjYXJkLCByZXF1ZXN0LCBSQ09ERV9UWVBFX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCXN1ID0gKCh1OCAqKXBheWxvYWQpWzFdICYgMHg3OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5vZGVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmbm9kZV9saXN0LCBsaXN0KSB7CisJCWRldmljZSA9IGRldmljZV9vZihmKTsKKwkJaWYgKGRldmljZS0+Z2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKQorCQkJY29udGludWU7CisKKwkJc21wX3JtYigpOyAvKiBub2RlX2lkIHZzLiBnZW5lcmF0aW9uICovCisKKwkJaWYgKGRldmljZS0+Y2FyZCA9PSBjYXJkICYmCisJCSAgICBkZXZpY2UtPm5vZGVfaWQgPT0gc291cmNlICYmCisJCSAgICAoZi0+c3VidW5pdCA9PSBzdSB8fCAoZi0+c3VidW5pdCA9PSAwICYmIHN1ID09IDB4NykpKSB7CisJCQlmZHR2ID0gZjsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5vZGVfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoZmR0dikgeworCQlhdmNfcmVjdihmZHR2LCBwYXlsb2FkLCBsZW5ndGgpOworCQlmd19zZW5kX3Jlc3BvbnNlKGNhcmQsIHJlcXVlc3QsIFJDT0RFX0NPTVBMRVRFKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZndfYWRkcmVzc19oYW5kbGVyIGZjcF9oYW5kbGVyID0geworCS5sZW5ndGggICAgICAgICAgID0gQ1NSX0ZDUF9FTkQgLSBDU1JfRkNQX1JFU1BPTlNFLAorCS5hZGRyZXNzX2NhbGxiYWNrID0gaGFuZGxlX2ZjcCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZndfYWRkcmVzc19yZWdpb24gZmNwX3JlZ2lvbiA9IHsKKwkuc3RhcnQJPSBDU1JfUkVHSVNURVJfQkFTRSArIENTUl9GQ1BfUkVTUE9OU0UsCisJLmVuZAk9IENTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX0ZDUF9FTkQsCit9OworCisvKiBBZGp1c3QgdGhlIHRlbXBsYXRlIHN0cmluZyBpZiBtb2RlbHMgd2l0aCBsb25nZXIgbmFtZXMgYXBwZWFyLiAqLworI2RlZmluZSBNQVhfTU9ERUxfTkFNRV9MRU4gKChpbnQpRElWX1JPVU5EX1VQKHNpemVvZigiRmlyZURUViA/Pz8/IiksIDQpKQorCitzdGF0aWMgc2l6ZV90IG1vZGVsX25hbWUodTMyICpkaXJlY3RvcnksIF9fYmUzMiAqYnVmZmVyKQoreworCXN0cnVjdCBmd19jc3JfaXRlcmF0b3IgY2k7CisJaW50IGksIGxlbmd0aCwga2V5LCB2YWx1ZSwgbGFzdF9rZXkgPSAwOworCXUzMiAqYmxvY2sgPSBOVUxMOworCisJZndfY3NyX2l0ZXJhdG9yX2luaXQoJmNpLCBkaXJlY3RvcnkpOworCXdoaWxlIChmd19jc3JfaXRlcmF0b3JfbmV4dCgmY2ksICZrZXksICZ2YWx1ZSkpIHsKKwkJaWYgKGxhc3Rfa2V5ID09IENTUl9NT0RFTCAmJgorCQkgICAga2V5ID09IChDU1JfREVTQ1JJUFRPUiB8IENTUl9MRUFGKSkKKwkJCWJsb2NrID0gY2kucCAtIDEgKyB2YWx1ZTsKKwkJbGFzdF9rZXkgPSBrZXk7CisJfQorCisJaWYgKGJsb2NrID09IE5VTEwpCisJCXJldHVybiAwOworCisJbGVuZ3RoID0gbWluKChpbnQpKGJsb2NrWzBdID4+IDE2KSAtIDIsIE1BWF9NT0RFTF9OQU1FX0xFTik7CisJaWYgKGxlbmd0aCA8PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGZhc3QtZm9yd2FyZCB0byB0ZXh0IHN0cmluZyAqLworCWJsb2NrICs9IDM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCWJ1ZmZlcltpXSA9IGNwdV90b19iZTMyKGJsb2NrW2ldKTsKKworCXJldHVybiBsZW5ndGggKiA0OworfQorCitzdGF0aWMgaW50IG5vZGVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaXJlZHR2ICpmZHR2OworCV9fYmUzMiBuYW1lW01BWF9NT0RFTF9OQU1FX0xFTl07CisJaW50IG5hbWVfbGVuLCBlcnI7CisKKwluYW1lX2xlbiA9IG1vZGVsX25hbWUoZndfdW5pdChkZXYpLT5kaXJlY3RvcnksIG5hbWUpOworCisJZmR0diA9IGZkdHZfYWxsb2MoZGV2LCAmYmFja2VuZCwgKGNoYXIgKiluYW1lLCBuYW1lX2xlbik7CisJaWYgKCFmZHR2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGZkdHZfcmVnaXN0ZXJfcmMoZmR0diwgZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfZnJlZTsKKworCXNwaW5fbG9ja19pcnEoJm5vZGVfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZmZHR2LT5saXN0LCAmbm9kZV9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJm5vZGVfbGlzdF9sb2NrKTsKKworCWVyciA9IGF2Y19pZGVudGlmeV9zdWJ1bml0KGZkdHYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCWVyciA9IGZkdHZfZHZiX3JlZ2lzdGVyKGZkdHYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCWF2Y19yZWdpc3Rlcl9yZW1vdGVfY29udHJvbChmZHR2KTsKKworCXJldHVybiAwOworZmFpbDoKKwlzcGluX2xvY2tfaXJxKCZub2RlX2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmZkdHYtPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmbm9kZV9saXN0X2xvY2spOworCWZkdHZfdW5yZWdpc3Rlcl9yYyhmZHR2KTsKK2ZhaWxfZnJlZToKKwlrZnJlZShmZHR2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbm9kZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaXJlZHR2ICpmZHR2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlmZHR2X2R2Yl91bnJlZ2lzdGVyKGZkdHYpOworCisJc3Bpbl9sb2NrX2lycSgmbm9kZV9saXN0X2xvY2spOworCWxpc3RfZGVsKCZmZHR2LT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJm5vZGVfbGlzdF9sb2NrKTsKKworCWZkdHZfdW5yZWdpc3Rlcl9yYyhmZHR2KTsKKworCWtmcmVlKGZkdHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBub2RlX3VwZGF0ZShzdHJ1Y3QgZndfdW5pdCAqdW5pdCkKK3sKKwlzdHJ1Y3QgZmlyZWR0diAqZmR0diA9IGRldl9nZXRfZHJ2ZGF0YSgmdW5pdC0+ZGV2aWNlKTsKKworCWlmIChmZHR2LT5pc29jaGFubmVsID49IDApCisJCWNtcF9lc3RhYmxpc2hfcHBfY29ubmVjdGlvbihmZHR2LCBmZHR2LT5zdWJ1bml0LAorCQkJCQkgICAgZmR0di0+aXNvY2hhbm5lbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZndfZHJpdmVyIGZkdHZfZHJpdmVyID0geworCS5kcml2ZXIgICA9IHsKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkubmFtZSAgID0gImZpcmVkdHYiLAorCQkuYnVzICAgID0gJmZ3X2J1c190eXBlLAorCQkucHJvYmUgID0gbm9kZV9wcm9iZSwKKwkJLnJlbW92ZSA9IG5vZGVfcmVtb3ZlLAorCX0sCisJLnVwZGF0ZSAgID0gbm9kZV91cGRhdGUsCisJLmlkX3RhYmxlID0gZmR0dl9pZF90YWJsZSwKK307CisKK2ludCBfX2luaXQgZmR0dl9md19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGZ3X2NvcmVfYWRkX2FkZHJlc3NfaGFuZGxlcigmZmNwX2hhbmRsZXIsICZmY3BfcmVnaW9uKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmZkdHZfZHJpdmVyLmRyaXZlcik7Cit9CisKK3ZvaWQgZmR0dl9md19leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmZkdHZfZHJpdmVyLmRyaXZlcik7CisJZndfY29yZV9yZW1vdmVfYWRkcmVzc19oYW5kbGVyKCZmY3BfaGFuZGxlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LXJjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LXJjLmMKaW5kZXggMjdiY2EyZS4uNTk5ZDY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1yYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtcmMuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlICJmaXJlZHR2LmgiCiAKQEAgLTE2Myw2ICsxNjQsNyBAQAogCiB2b2lkIGZkdHZfdW5yZWdpc3Rlcl9yYyhzdHJ1Y3QgZmlyZWR0diAqZmR0dikKIHsKKwljYW5jZWxfd29ya19zeW5jKCZmZHR2LT5yZW1vdGVfY3RybF93b3JrKTsKIAlrZnJlZShmZHR2LT5yZW1vdGVfY3RybF9kZXYtPmtleWNvZGUpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGZkdHYtPnJlbW90ZV9jdHJsX2Rldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LmgKaW5kZXggZDQ4NTMwYi4uMzUwODBkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYuaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2R2Yi9kbXguaD4KICNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9ja190eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC03Miw4ICs3Myw4IEBACiBzdHJ1Y3QgZmlyZWR0djsKIAogc3RydWN0IGZpcmVkdHZfYmFja2VuZCB7Ci0JaW50ICgqbG9jaykoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHU2NCBhZGRyLCB2b2lkICpkYXRhLCBfX2JlMzIgYXJnKTsKLQlpbnQgKCpyZWFkKShzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdTY0IGFkZHIsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCWludCAoKmxvY2spKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB1NjQgYWRkciwgX19iZTMyIGRhdGFbXSk7CisJaW50ICgqcmVhZCkoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHU2NCBhZGRyLCB2b2lkICpkYXRhKTsKIAlpbnQgKCp3cml0ZSkoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHU2NCBhZGRyLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKIAlpbnQgKCpzdGFydF9pc28pKHN0cnVjdCBmaXJlZHR2ICpmZHR2KTsKIAl2b2lkICgqc3RvcF9pc28pKHN0cnVjdCBmaXJlZHR2ICpmZHR2KTsKQEAgLTExOSwxMCArMTIwLDEwIEBACiAKIC8qIGZpcmVkdHYtMTM5NC5jICovCiAjaWZkZWYgQ09ORklHX0RWQl9GSVJFRFRWX0lFRUUxMzk0Ci1pbnQgZmR0dl8xMzk0X2luaXQoc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBpZF90YWJsZVtdKTsKK2ludCBmZHR2XzEzOTRfaW5pdCh2b2lkKTsKIHZvaWQgZmR0dl8xMzk0X2V4aXQodm9pZCk7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgZmR0dl8xMzk0X2luaXQoc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBpdFtdKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBmZHR2XzEzOTRfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZmR0dl8xMzk0X2V4aXQodm9pZCkge30KICNlbmRpZgogCkBAIC0xNjMsMTAgKzE2NCwyMCBAQAogCQkJICAgY29uc3Qgc3RydWN0IGZpcmVkdHZfYmFja2VuZCAqYmFja2VuZCwKIAkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbik7CiBleHRlcm4gY29uc3QgY2hhciAqZmR0dl9tb2RlbF9uYW1lc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQgZmR0dl9pZF90YWJsZVtdOwogCiAvKiBmaXJlZHR2LWZlLmMgKi8KIHZvaWQgZmR0dl9mcm9udGVuZF9pbml0KHN0cnVjdCBmaXJlZHR2ICpmZHR2KTsKIAorLyogZmlyZWR0di1mdy5jICovCisjaWZkZWYgQ09ORklHX0RWQl9GSVJFRFRWX0ZJUkVXSVJFCitpbnQgZmR0dl9md19pbml0KHZvaWQpOwordm9pZCBmZHR2X2Z3X2V4aXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZmR0dl9md19pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmZHR2X2Z3X2V4aXQodm9pZCkge30KKyNlbmRpZgorCiAvKiBmaXJlZHR2LXJjLmMgKi8KICNpZmRlZiBDT05GSUdfRFZCX0ZJUkVEVFZfSU5QVVQKIGludCBmZHR2X3JlZ2lzdGVyX3JjKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwppbmRleCBkN2M0ODM3Li41OGFhYzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwpAQCAtMjAxLDYgKzIwMSwxMyBAQAogCWhlbHAKIAkgIEEgRFZCLVMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAorY29uZmlnIERWQl9EUzMwMDAKKwl0cmlzdGF0ZSAiTW9udGFnZSBUZWhub2xvZ3kgRFMzMDAwIGJhc2VkIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBBIERWQi1TL1MyIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIkRWQi1UICh0ZXJyZXN0cmlhbCkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApAQCAtMzQyLDYgKzM0OSwxMyBAQAogCWhlbHAKIAkgIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX0VDMTAwCisJdHJpc3RhdGUgIkUzQyBFQzEwMCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIkRWQi1DIChjYWJsZSkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApAQCAtNTU3LDYgKzU3MSwxMyBAQAogCWhlbHAKIAkgIEEgRE1CLVRIIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKK2NvbmZpZyBEVkJfQVRCTTg4MzAKKwl0cmlzdGF0ZSAiQWx0b0JlYW0gQVRCTTg4MzAvODgzMSBETUItVEggZGVtb2R1bGF0b3IiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIEEgRE1CLVRIIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIlRvb2xzIHRvIGRldmVsb3AgbmV3IGZyb250ZW5kcyIKIAogY29uZmlnIERWQl9EVU1NWV9GRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCmluZGV4IDM1MjM3NjcuLjgyMzQ4MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKQEAgLTY0LDYgKzY0LDcgQEAKIG9iai0kKENPTkZJR19EVkJfUzVIMTQxMSkgKz0gczVoMTQxMS5vCiBvYmotJChDT05GSUdfRFZCX0xHUzhHTDUpICs9IGxnczhnbDUubwogb2JqLSQoQ09ORklHX0RWQl9MR1M4R1hYKSArPSBsZ3M4Z3h4Lm8KK29iai0kKENPTkZJR19EVkJfQVRCTTg4MzApICs9IGF0Ym04ODMwLm8KIG9iai0kKENPTkZJR19EVkJfRFVNTVlfRkUpICs9IGR2Yl9kdW1teV9mZS5vCiBvYmotJChDT05GSUdfRFZCX0FGOTAxMykgKz0gYWY5MDEzLm8KIG9iai0kKENPTkZJR19EVkJfQ1gyNDExNikgKz0gY3gyNDExNi5vCkBAIC03NiwzICs3Nyw1IEBACiBvYmotJChDT05GSUdfRFZCX1NUVjA5MHgpICs9IHN0djA5MHgubwogb2JqLSQoQ09ORklHX0RWQl9TVFY2MTEweCkgKz0gc3R2NjExMHgubwogb2JqLSQoQ09ORklHX0RWQl9JU0w2NDIzKSArPSBpc2w2NDIzLm8KK29iai0kKENPTkZJR19EVkJfRUMxMDApICs9IGVjMTAwLm8KK29iai0kKENPTkZJR19EVkJfRFMzMDAwKSArPSBkczMwMDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F0Ym04ODMwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXRibTg4MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg4MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F0Ym04ODMwLmMKQEAgLTAsMCArMSw0OTUgQEAKKy8qCisgKiAgICBTdXBwb3J0IGZvciBBbHRvQmVhbSBHQjIwNjAwIChhLmsuYSBETUItVEgpIGRlbW9kdWxhdG9yCisgKiAgICBBVEJNODgzMCwgQVRCTTg4MzEKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgVC5MLiBXb25nIDxkYXZpZHRsd29uZ0BnbWFpbC5jb20+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCisjaW5jbHVkZSAiYXRibTg4MzAuaCIKKyNpbmNsdWRlICJhdGJtODgzMF9wcml2LmgiCisKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmIChkZWJ1ZykgXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImF0Ym04ODMwOiAiIGFyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBkZWJ1ZzsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOworCitzdGF0aWMgaW50IGF0Ym04ODMwX3dyaXRlX3JlZyhzdHJ1Y3QgYXRibV9zdGF0ZSAqcHJpdiwgdTE2IHJlZywgdTggZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCBkZXZfYWRkcjsKKwl1OCBidWYxW10gPSB7IHJlZyA+PiA4LCByZWcgJiAweEZGIH07CisJdTggYnVmMltdID0geyBkYXRhIH07CisJc3RydWN0IGkyY19tc2cgbXNnMSA9IHsgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZjEsIC5sZW4gPSAyIH07CisJc3RydWN0IGkyY19tc2cgbXNnMiA9IHsgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZjIsIC5sZW4gPSAxIH07CisKKwlkZXZfYWRkciA9IHByaXYtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzczsKKwltc2cxLmFkZHIgPSBkZXZfYWRkcjsKKwltc2cyLmFkZHIgPSBkZXZfYWRkcjsKKworCWlmIChkZWJ1ZyA+PSAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlZz0weCUwNFgsIGRhdGE9MHglMDJYXG4iLAorCQkJX19mdW5jX18sIHJlZywgZGF0YSk7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnMSwgMSk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsICZtc2cyLCAxKTsKKwlyZXR1cm4gKHJldCAhPSAxKSA/IC1FSU8gOiAwOworfQorCitzdGF0aWMgaW50IGF0Ym04ODMwX3JlYWRfcmVnKHN0cnVjdCBhdGJtX3N0YXRlICpwcml2LCB1MTYgcmVnLCB1OCAqcF9kYXRhKQoreworCWludCByZXQ7CisJdTggZGV2X2FkZHI7CisKKwl1OCBidWYxW10gPSB7IHJlZyA+PiA4LCByZWcgJiAweEZGIH07CisJdTggYnVmMltdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnMSA9IHsgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZjEsIC5sZW4gPSAyIH07CisJc3RydWN0IGkyY19tc2cgbXNnMiA9IHsgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBidWYyLCAubGVuID0gMSB9OworCisJZGV2X2FkZHIgPSBwcml2LT5jb25maWctPmRlbW9kX2FkZHJlc3M7CisJbXNnMS5hZGRyID0gZGV2X2FkZHI7CisJbXNnMi5hZGRyID0gZGV2X2FkZHI7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnMSwgMSk7CisJaWYgKHJldCAhPSAxKSB7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVycm9yIHJlZz0weCUwNHgsIHJldD0laVxuIiwKKwkJCV9fZnVuY19fLCByZWcsIHJldCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsICZtc2cyLCAxKTsKKwlpZiAocmV0ICE9IDEpCisJCXJldHVybiAtRUlPOworCisJKnBfZGF0YSA9IGJ1ZjJbMF07CisJaWYgKGRlYnVnID49IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVnPTB4JTA0WCwgZGF0YT0weCUwMlhcbiIsCisJCQlfX2Z1bmNfXywgcmVnLCBidWYyWzBdKTsKKworCXJldHVybiAwOworfQorCisvKiBMb2NrIHJlZ2lzdGVyIGxhdGNoIHNvIHRoYXQgbXVsdGktcmVnaXN0ZXIgcmVhZCBpcyBhdG9taWMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0Ym04ODMwX3JlZ2xhdGNoX2xvY2soc3RydWN0IGF0Ym1fc3RhdGUgKnByaXYsIGludCBsb2NrKQoreworCXJldHVybiBhdGJtODgzMF93cml0ZV9yZWcocHJpdiwgUkVHX1JFQURfTEFUQ0gsIGxvY2sgPyAxIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X29zY19mcmVxKHN0cnVjdCBhdGJtX3N0YXRlICpwcml2LCB1MzIgZnJlcSAvKmluIGtIeiovKQoreworCXUzMiB2YWw7CisJdTY0IHQ7CisKKwkvKiAweDEwMDAwMCAqIGZyZXEgLyAzMC40TUh6ICovCisJdCA9ICh1NjQpMHgxMDAwMDAgKiBmcmVxOworCWRvX2Rpdih0LCAzMDQwMCk7CisJdmFsID0gdDsKKworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCBSRUdfT1NDX0NMSywgdmFsKTsKKwlhdGJtODgzMF93cml0ZV9yZWcocHJpdiwgUkVHX09TQ19DTEsgKyAxLCB2YWwgPj4gOCk7CisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIFJFR19PU0NfQ0xLICsgMiwgdmFsID4+IDE2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9pZl9mcmVxKHN0cnVjdCBhdGJtX3N0YXRlICpwcml2LCB1MzIgZnJlcSAvKmluIGtIeiovKQoreworCisJdTMyIGZzID0gcHJpdi0+Y29uZmlnLT5vc2NfY2xrX2ZyZXE7CisJdTY0IHQ7CisJdTMyIHZhbDsKKwl1OCBkYXQ7CisKKwlpZiAoZnJlcSAhPSAwKSB7CisJCS8qIDIgKiBQSSAqIChmcmVxIC0gZnMpIC8gZnMgKiAoMiBeIDIyKSAqLworCQl0ID0gKHU2NCkgMiAqIDMxNDE2ICogKGZyZXEgLSBmcyk7CisJCXQgPDw9IDIyOworCQlkb19kaXYodCwgZnMpOworCQlkb19kaXYodCwgMTAwMCk7CisJCXZhbCA9IHQ7CisKKwkJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIFJFR19UVU5FUl9CQVNFQkFORCwgMSk7CisJCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCBSRUdfSUZfRlJFUSwgdmFsKTsKKwkJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIFJFR19JRl9GUkVRKzEsIHZhbCA+PiA4KTsKKwkJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIFJFR19JRl9GUkVRKzIsIHZhbCA+PiAxNik7CisKKwkJYXRibTg4MzBfcmVhZF9yZWcocHJpdiwgUkVHX0FEQ19DT05GSUcsICZkYXQpOworCQlkYXQgJj0gMHhGQzsKKwkJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIFJFR19BRENfQ09ORklHLCBkYXQpOworCX0gZWxzZSB7CisJCS8qIFplcm8gSUYgKi8KKwkJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIFJFR19UVU5FUl9CQVNFQkFORCwgMCk7CisKKwkJYXRibTg4MzBfcmVhZF9yZWcocHJpdiwgUkVHX0FEQ19DT05GSUcsICZkYXQpOworCQlkYXQgJj0gMHhGQzsKKwkJZGF0IHw9IDB4MDI7CisJCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCBSRUdfQURDX0NPTkZJRywgZGF0KTsKKworCQlpZiAocHJpdi0+Y29uZmlnLT56aWZfc3dhcF9pcSkKKwkJCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCBSRUdfU1dBUF9JX1EsIDB4MDMpOworCQllbHNlCisJCQlhdGJtODgzMF93cml0ZV9yZWcocHJpdiwgUkVHX1NXQVBfSV9RLCAweDAxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19sb2NrZWQoc3RydWN0IGF0Ym1fc3RhdGUgKnByaXYsIHU4ICpsb2NrZWQpCit7CisJdTggc3RhdHVzOworCisJYXRibTg4MzBfcmVhZF9yZWcocHJpdiwgUkVHX0xPQ0tfU1RBVFVTLCAmc3RhdHVzKTsKKworCWlmIChsb2NrZWQgIT0gTlVMTCkKKwkJKmxvY2tlZCA9IChzdGF0dXMgPT0gMSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzZXRfc3RhdGljX2NoYW5uZWxfbW9kZShzdHJ1Y3QgYXRibV9zdGF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCAweDA5OUIgKyBpLCAweDA4KTsKKworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCAweDA5NUIsIDB4N0YpOworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCAweDA5Q0IsIDB4MDEpOworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCAweDA5Q0MsIDB4N0YpOworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCAweDA5Q0QsIDB4N0YpOworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCAweDBFMDEsIDB4MjApOworCisJLyogRm9yIHNpbmdsZSBjYXJyaWVyICovCisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIDB4MEIwMywgMHgwQSk7CisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIDB4MDkzNSwgMHgxMCk7CisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIDB4MDkzNiwgMHgwOCk7CisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIDB4MDkzRSwgMHgwOCk7CisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIDB4MDk2RSwgMHgwNik7CisKKwkvKiBmcmFtZV9jb3VudF9tYXgwICovCisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIDB4MEIwOSwgMHgwMCk7CisJLyogZnJhbWVfY291bnRfbWF4MSAqLworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCAweDBCMEEsIDB4MDgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3RzX2NvbmZpZyhzdHJ1Y3QgYXRibV9zdGF0ZSAqcHJpdikKK3sKKwljb25zdCBzdHJ1Y3QgYXRibTg4MzBfY29uZmlnICpjZmcgPSBwcml2LT5jb25maWc7CisKKwkvKlNldCBwYXJhbGxlbC9zZXJpYWwgdHMgbW9kZSovCisJYXRibTg4MzBfd3JpdGVfcmVnKHByaXYsIFJFR19UU19TRVJJQUwsIGNmZy0+c2VyaWFsX3RzID8gMSA6IDApOworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCBSRUdfVFNfQ0xLX01PREUsIGNmZy0+c2VyaWFsX3RzID8gMSA6IDApOworCS8qU2V0IHRzIHNhbXBsaW5nIGVkZ2UqLworCWF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCBSRUdfVFNfU0FNUExFX0VER0UsCisJCWNmZy0+dHNfc2FtcGxpbmdfZWRnZSA/IDEgOiAwKTsKKwkvKlNldCB0cyBjbG9jayBmcmVlcnVuKi8KKwlhdGJtODgzMF93cml0ZV9yZWcocHJpdiwgUkVHX1RTX0NMS19GUkVFUlVOLAorCQljZmctPnRzX2Nsa19nYXRlZCA/IDAgOiAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0Ym04ODMwX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGF0Ym1fc3RhdGUgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwljb25zdCBzdHJ1Y3QgYXRibTg4MzBfY29uZmlnICpjZmcgPSBwcml2LT5jb25maWc7CisKKwkvKlNldCBvc2NpbGxhdG9yIGZyZXF1ZW5jeSovCisJc2V0X29zY19mcmVxKHByaXYsIGNmZy0+b3NjX2Nsa19mcmVxKTsKKworCS8qU2V0IElGIGZyZXF1ZW5jeSovCisJc2V0X2lmX2ZyZXEocHJpdiwgY2ZnLT5pZl9mcmVxKTsKKworCisJLypTZXQgc3RhdGljIGNoYW5uZWwgbW9kZSovCisJc2V0X3N0YXRpY19jaGFubmVsX21vZGUocHJpdik7CisKKwlzZXRfdHNfY29uZmlnKHByaXYpOworCS8qVHVybiBvZmYgRFNQIHJlc2V0Ki8KKwlhdGJtODgzMF93cml0ZV9yZWcocHJpdiwgMHgwMDBBLCAwKTsKKworCS8qU1cgdmVyc2lvbiB0ZXN0Ki8KKwlhdGJtODgzMF93cml0ZV9yZWcocHJpdiwgMHgwMjBDLCAxMSk7CisKKwkvKiBSdW4gKi8KKwlhdGJtODgzMF93cml0ZV9yZWcocHJpdiwgUkVHX0RFTU9EX1JVTiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhdGJtODgzMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBhdGJtX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYXRibTg4MzBfc2V0X2ZlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlX3BhcmFtcykKK3sKKwlzdHJ1Y3QgYXRibV9zdGF0ZSAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCBpOworCXU4IGxvY2tlZCA9IDA7CisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIHNldCBmcmVxdWVuY3kgKi8KKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgZmVfcGFyYW1zKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQorCisJLyogc3RhcnQgYXV0byBsb2NrICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJbWRlbGF5KDEwMCk7CisJCWRwcmludGsoIlRyeSAlZFxuIiwgaSk7CisJCWlzX2xvY2tlZChwcml2LCAmbG9ja2VkKTsKKwkJaWYgKGxvY2tlZCAhPSAwKSB7CisJCQlkcHJpbnRrKCJBVEJNODgzMCBsb2NrZWQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRibTg4MzBfZ2V0X2ZlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlX3BhcmFtcykKK3sKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogVE9ETzogZ2V0IHJlYWwgcmVhZGluZ3MgZnJvbSBkZXZpY2UgKi8KKwkvKiBpbnZlcnNpb24gc3RhdHVzICovCisJZmVfcGFyYW1zLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOworCisJLyogYmFuZHdpZHRoICovCisJZmVfcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoID0gQkFORFdJRFRIXzhfTUhaOworCisJZmVfcGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0hQID0gRkVDX0FVVE87CisJZmVfcGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0xQID0gRkVDX0FVVE87CisKKwlmZV9wYXJhbXMtPnUub2ZkbS5jb25zdGVsbGF0aW9uID0gUUFNX0FVVE87CisKKwkvKiB0cmFuc21pc3Npb24gbW9kZSAqLworCWZlX3BhcmFtcy0+dS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfQVVUTzsKKworCS8qIGd1YXJkIGludGVydmFsICovCisJZmVfcGFyYW1zLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF9BVVRPOworCisJLyogaGllcmFyY2h5ICovCisJZmVfcGFyYW1zLT51Lm9mZG0uaGllcmFyY2h5X2luZm9ybWF0aW9uID0gSElFUkFSQ0hZX05PTkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGJtODgzMF9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKmZlc2V0dGluZ3MpCit7CisJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMDsKKwlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAwOworCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRibTg4MzBfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpmZV9zdGF0dXMpCit7CisJc3RydWN0IGF0Ym1fc3RhdGUgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBsb2NrZWQgPSAwOworCXU4IGFnY19sb2NrZWQgPSAwOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKwkqZmVfc3RhdHVzID0gMDsKKworCWlzX2xvY2tlZChwcml2LCAmbG9ja2VkKTsKKwlpZiAobG9ja2VkKSB7CisJCSpmZV9zdGF0dXMgfD0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwKKwkJCUZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKwl9CisJZHByaW50aygiJXM6IGZlX3N0YXR1cz0weCV4XG4iLCBfX2Z1bmNfXywgKmZlX3N0YXR1cyk7CisKKwlhdGJtODgzMF9yZWFkX3JlZyhwcml2LCBSRUdfQUdDX0xPQ0ssICZhZ2NfbG9ja2VkKTsKKwlkcHJpbnRrKCJBR0MgTG9jazogJWRcbiIsIGFnY19sb2NrZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRibTg4MzBfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCXN0cnVjdCBhdGJtX3N0YXRlICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTMyIGZyYW1lX2VycjsKKwl1OCB0OworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCWF0Ym04ODMwX3JlZ2xhdGNoX2xvY2socHJpdiwgMSk7CisKKwlhdGJtODgzMF9yZWFkX3JlZyhwcml2LCBSRUdfRlJBTUVfRVJSX0NOVCArIDEsICZ0KTsKKwlmcmFtZV9lcnIgPSB0ICYgMHg3RjsKKwlmcmFtZV9lcnIgPDw9IDg7CisJYXRibTg4MzBfcmVhZF9yZWcocHJpdiwgUkVHX0ZSQU1FX0VSUl9DTlQsICZ0KTsKKwlmcmFtZV9lcnIgfD0gdDsKKworCWF0Ym04ODMwX3JlZ2xhdGNoX2xvY2socHJpdiwgMCk7CisKKwkqYmVyID0gZnJhbWVfZXJyICogMTAwIC8gMzI3Njc7CisKKwlkcHJpbnRrKCIlczogYmVyPTB4JXhcbiIsIF9fZnVuY19fLCAqYmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGJtODgzMF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzaWduYWwpCit7CisJc3RydWN0IGF0Ym1fc3RhdGUgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MzIgcHdtOworCXU4IHQ7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCWF0Ym04ODMwX3JlZ2xhdGNoX2xvY2socHJpdiwgMSk7CisKKwlhdGJtODgzMF9yZWFkX3JlZyhwcml2LCBSRUdfQUdDX1BXTV9WQUwgKyAxLCAmdCk7CisJcHdtID0gdCAmIDB4MDM7CisJcHdtIDw8PSA4OworCWF0Ym04ODMwX3JlYWRfcmVnKHByaXYsIFJFR19BR0NfUFdNX1ZBTCwgJnQpOworCXB3bSB8PSB0OworCisJYXRibTg4MzBfcmVnbGF0Y2hfbG9jayhwcml2LCAwKTsKKworCWRwcmludGsoIkFHQyBQV00gPSAweCUwMlhcbiIsIHB3bSk7CisJcHdtID0gMHg0MDAgLSBwd207CisKKwkqc2lnbmFsID0gcHdtICogMHgxMDAwMCAvIDB4NDAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRibTg4MzBfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQoreworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisJKnNuciA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRibTg4MzBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCSp1Y2Jsb2NrcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRibTg4MzBfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYXRibV9zdGF0ZSAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJcmV0dXJuIGF0Ym04ODMwX3dyaXRlX3JlZyhwcml2LCBSRUdfSTJDX0dBVEUsIGVuYWJsZSA/IDEgOiAwKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGF0Ym04ODMwX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiQWx0b0JlYW0gQVRCTTg4MzAvODgzMSBETUItVEgiLAorCQkudHlwZSA9IEZFX09GRE0sCisJCS5mcmVxdWVuY3lfbWluID0gNDc0MDAwMDAwLAorCQkuZnJlcXVlbmN5X21heCA9IDg1ODAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDEwMDAwLAorCQkuY2FwcyA9CisJCQlGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FBTV9BVVRPIHwKKwkJCUZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPIHwKKwkJCUZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPCisJfSwKKworCS5yZWxlYXNlID0gYXRibTg4MzBfcmVsZWFzZSwKKworCS5pbml0ID0gYXRibTg4MzBfaW5pdCwKKwkuc2xlZXAgPSBOVUxMLAorCS53cml0ZSA9IE5VTEwsCisJLmkyY19nYXRlX2N0cmwgPSBhdGJtODgzMF9pMmNfZ2F0ZV9jdHJsLAorCisJLnNldF9mcm9udGVuZCA9IGF0Ym04ODMwX3NldF9mZSwKKwkuZ2V0X2Zyb250ZW5kID0gYXRibTg4MzBfZ2V0X2ZlLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IGF0Ym04ODMwX2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzID0gYXRibTg4MzBfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gYXRibTg4MzBfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gYXRibTg4MzBfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gYXRibTg4MzBfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBhdGJtODgzMF9yZWFkX3VjYmxvY2tzLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqYXRibTg4MzBfYXR0YWNoKGNvbnN0IHN0cnVjdCBhdGJtODgzMF9jb25maWcgKmNvbmZpZywKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgYXRibV9zdGF0ZSAqcHJpdiA9IE5VTEw7CisJdTggZGF0YSA9IDA7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY29uZmlnID09IE5VTEwgfHwgaTJjID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGJtX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlwcml2LT5jb25maWcgPSBjb25maWc7CisJcHJpdi0+aTJjID0gaTJjOworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCisJaWYgKGF0Ym04ODMwX3JlYWRfcmVnKHByaXYsIFJFR19DSElQX0lELCAmZGF0YSkgIT0gMCkgeworCQlkcHJpbnRrKCIlcyBhdGJtODgzMC84ODMxIG5vdCBmb3VuZCBhdCBpMmMgYWRkciAweCUwMlhcbiIsCisJCQlfX2Z1bmNfXywgcHJpdi0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCWRwcmludGsoImF0Ym04ODMwIGNoaXAgaWQ6IDB4JTAyWFxuIiwgZGF0YSk7CisKKwltZW1jcHkoJnByaXYtPmZyb250ZW5kLm9wcywgJmF0Ym04ODMwX29wcywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJcHJpdi0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHByaXY7CisKKwlhdGJtODgzMF9pbml0KCZwcml2LT5mcm9udGVuZCk7CisKKwlhdGJtODgzMF9pMmNfZ2F0ZV9jdHJsKCZwcml2LT5mcm9udGVuZCwgMSk7CisKKwlyZXR1cm4gJnByaXYtPmZyb250ZW5kOworCitlcnJvcl9vdXQ6CisJZHByaW50aygiJXMoKSBlcnJvcl9vdXRcbiIsIF9fZnVuY19fKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gTlVMTDsKKworfQorRVhQT1JUX1NZTUJPTChhdGJtODgzMF9hdHRhY2gpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFsdG9CZWFtIEFUQk04ODMwLzg4MzEgR0IyMDYwMCBkZW1vZHVsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFQuIEwuIFdvbmcgPGRhdmlkdGx3b25nQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdGJtODgzMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F0Ym04ODMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNDlmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdGJtODgzMC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAgICBTdXBwb3J0IGZvciBBbHRvQmVhbSBHQjIwNjAwIChhLmsuYSBETUItVEgpIGRlbW9kdWxhdG9yCisgKiAgICBBVEJNODgzMCwgQVRCTTg4MzEKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgVC5MLiBXb25nIDxkYXZpZHRsd29uZ0BnbWFpbC5jb20+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FUQk04ODMwX0hfXworI2RlZmluZSBfX0FUQk04ODMwX0hfXworCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNkZWZpbmUgQVRCTTg4MzBfUFJPRF84ODMwIDAKKyNkZWZpbmUgQVRCTTg4MzBfUFJPRF84ODMxIDEKKworc3RydWN0IGF0Ym04ODMwX2NvbmZpZyB7CisKKwkvKiBwcm9kdWN0IHR5cGUgKi8KKwl1OCBwcm9kOworCisJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KKwl1OCBkZW1vZF9hZGRyZXNzOworCisJLyogcGFyYWxsZWwgb3Igc2VyaWFsIHRyYW5zcG9ydCBzdHJlYW0gKi8KKwl1OCBzZXJpYWxfdHM7CisKKwkvKiB0cmFuc3BvcnQgc3RyZWFtIGNsb2NrIG91dHB1dCBvbmx5IHdoZW4gcmVjZXZpbmcgdmFsaWQgc3RyZWFtICovCisJdTggdHNfY2xrX2dhdGVkOworCisJLyogRGVjb2RlciBzYW1wbGUgVFMgZGF0YSBhdCByaXNpbmcgZWRnZSBvZiBjbG9jayAqLworCXU4IHRzX3NhbXBsaW5nX2VkZ2U7CisKKwkvKiBPc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeSAqLworCXUzMiBvc2NfY2xrX2ZyZXE7IC8qIGluIGtIeiAqLworCisJLyogSUYgZnJlcXVlbmN5ICovCisJdTMyIGlmX2ZyZXE7IC8qIGluIGtIeiAqLworCisJLyogU3dhcCBJL1EgZm9yIHplcm8gSUYgKi8KKwl1OCB6aWZfc3dhcF9pcTsKKworCS8qIFR1bmVyIEFHQyBzZXR0aW5ncyAqLworCXU4IGFnY19taW47CisJdTggYWdjX21heDsKKwl1OCBhZ2NfaG9sZF9sb29wOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9BVEJNODgzMCkgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfQVRCTTg4MzBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqYXRibTg4MzBfYXR0YWNoKGNvbnN0IHN0cnVjdCBhdGJtODgzMF9jb25maWcgKmNvbmZpZywKKwkJc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKmF0Ym04ODMwX2F0dGFjaChjb25zdCBzdHJ1Y3QgYXRibTg4MzBfY29uZmlnICpjb25maWcsCisJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9BVEJNODgzMCAqLworCisjZW5kaWYgLyogX19BVEJNODgzMF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdGJtODgzMF9wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXRibTg4MzBfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTYwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXRibTg4MzBfcHJpdi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiAgICBTdXBwb3J0IGZvciBBbHRvQmVhbSBHQjIwNjAwIChhLmsuYSBETUItVEgpIGRlbW9kdWxhdG9yCisgKiAgICBBVEJNODgzMCwgQVRCTTg4MzEKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgVC5MLiBXb25nIDxkYXZpZHRsd29uZ0BnbWFpbC5jb20+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyAKKyNpZm5kZWYgX19BVEJNODgzMF9QUklWX0gKKyNkZWZpbmUgX19BVEJNODgzMF9QUklWX0gKKworc3RydWN0IGF0Ym1fc3RhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwljb25zdCBzdHJ1Y3QgYXRibTg4MzBfY29uZmlnICpjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKK307CisKKyNkZWZpbmUgUkVHX0NISVBfSUQJMHgwMDAwCisjZGVmaW5lIFJFR19UVU5FUl9CQVNFQkFORAkweDAwMDEKKyNkZWZpbmUgUkVHX0RFTU9EX1JVTgkweDAwMDQKKyNkZWZpbmUgUkVHX0RTUF9SRVNFVAkweDAwMDUKKyNkZWZpbmUgUkVHX1JBTV9SRVNFVAkweDAwMDYKKyNkZWZpbmUgUkVHX0FEQ19SRVNFVAkweDAwMDcKKyNkZWZpbmUgUkVHX1RTUE9SVF9SRVNFVAkweDAwMDgKKyNkZWZpbmUgUkVHX0JMS0VSUl9QT0wJMHgwMDBDCisjZGVmaW5lIFJFR19JMkNfR0FURQkweDAxMDMKKyNkZWZpbmUgUkVHX1RTX1NBTVBMRV9FREdFCTB4MDMwMQorI2RlZmluZSBSRUdfVFNfUEtUX0xFTl8yMDQJMHgwMzAyCisjZGVmaW5lIFJFR19UU19QS1RfTEVOX0FVVE8JMHgwMzAzCisjZGVmaW5lIFJFR19UU19TRVJJQUwJMHgwMzA1CisjZGVmaW5lIFJFR19UU19DTEtfRlJFRVJVTgkweDAzMDYKKyNkZWZpbmUgUkVHX1RTX1ZBTElEX01PREUJMHgwMzA3CisjZGVmaW5lIFJFR19UU19DTEtfTU9ERQkweDAzMEIgLyogMSBmb3Igc2VyaWFsLCAwIGZvciBwYXJhbGxlbCAqLworCisjZGVmaW5lIFJFR19UU19FUlJCSVRfVVNFCTB4MDMwQworI2RlZmluZSBSRUdfTE9DS19TVEFUVVMJMHgwMzBECisjZGVmaW5lIFJFR19BRENfQ09ORklHCTB4MDYwMgorI2RlZmluZSBSRUdfQ0FSUklFUl9PRkZTRVQJMHgwODI3IC8qIDB4MDgyNy0weDA4MjkgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBSRUdfREVURUNURURfUE5fTU9ERQkweDA4MkQKKyNkZWZpbmUgUkVHX1JFQURfTEFUQ0gJMHgwODRECisjZGVmaW5lIFJFR19JRl9GUkVRCTB4MEEwMCAvKiAweDBBMDAtMHgwQTAyIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgUkVHX09TQ19DTEsJMHgwQTAzIC8qIDB4MEEwMy0weDBBMDUgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBSRUdfQllQQVNTX0NDSQkweDBBMDYKKyNkZWZpbmUgUkVHX0FOQUxPR19MVU1BX0RFVEVDVEVECTB4MEEyNQorI2RlZmluZSBSRUdfQU5BTE9HX0FVRElPX0RFVEVDVEVECTB4MEEyNgorI2RlZmluZSBSRUdfQU5BTE9HX0NIUk9NQV9ERVRFQ1RFRAkweDBBMzkKKyNkZWZpbmUgUkVHX0ZSQU1FX0VSUl9DTlQJMHgwQjA0CisjZGVmaW5lIFJFR19VU0VfRVhUX0FEQwkweDBDMDAKKyNkZWZpbmUgUkVHX1NXQVBfSV9RCTB4MEMwMQorI2RlZmluZSBSRUdfVFBTX01BTlVBTAkweDBEMDEKKyNkZWZpbmUgUkVHX1RQU19DT05GSUcJMHgwRDAyCisjZGVmaW5lIFJFR19CWVBBU1NfREVJTlRFUkxFQVZFUgkweDBFMDAKKyNkZWZpbmUgUkVHX0FHQ19UQVJHRVQJMHgxMDAzIC8qIDB4MTAwMy0weDEwMDUgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBSRUdfQUdDX01JTgkweDEwMjAKKyNkZWZpbmUgUkVHX0FHQ19NQVgJMHgxMDIzCisjZGVmaW5lIFJFR19BR0NfTE9DSwkweDEwMjcKKyNkZWZpbmUgUkVHX0FHQ19QV01fVkFMCTB4MTAyOCAvKiAweDEwMjgtMHgxMDI5IGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgUkVHX0FHQ19IT0xEX0xPT1AJMHgxMDMxCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX2RlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdTg1MjJfZGVjb2Rlci5jCmluZGV4IDc0OTgxZWUuLjJkYzI3MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdTg1MjJfZGVjb2Rlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdTg1MjJfZGVjb2Rlci5jCkBAIC0yMyw3ICsyMyw2IEBACiAvKiBEZXZlbG9wZXIgbm90ZXM6CiAgKgogICogVkJJIHN1cHBvcnQgaXMgbm90IHlldCB3b3JraW5nCi0gKiBTYXR1cmF0aW9uIGFuZCBodWUgc2V0dGluZyBhcmUgbm90IHlldCB3b3JraW5nCiAgKiBFbm91Z2ggaXMgaW1wbGVtZW50ZWQgaGVyZSBmb3IgQ1ZCUyBhbmQgUy1WaWRlbyBpbnB1dHMsIGJ1dCB0aGUgYWN0dWFsCiAgKiAgYW5hbG9nIGRlbW9kdWxhdG9yIGNvZGUgaXNuJ3QgaW1wbGVtZW50ZWQgKG5vdCBuZWVkZWQgZm9yIHhjNTAwMCBzaW5jZSBpdAogICogIGhhcyBpdHMgb3duIGRlbW9kdWxhdG9yIGFuZCBvdXRwdXRzIENWQlMpCkBAIC0yMzYsOCArMjM1LDEwIEBACiAJc3RhdGUtPmNvbnRyYXN0ID0gMHg3OTsKIAlhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIEFVODUyMl9UVkRFQ19TQVRVUkFUSU9OX0NCX1JFRzAwQ0gsIDB4ODApOwogCWF1ODUyMl93cml0ZXJlZyhzdGF0ZSwgQVU4NTIyX1RWREVDX1NBVFVSQVRJT05fQ1JfUkVHMDBESCwgMHg4MCk7CisJc3RhdGUtPnNhdHVyYXRpb24gPSAweDgwOwogCWF1ODUyMl93cml0ZXJlZyhzdGF0ZSwgQVU4NTIyX1RWREVDX0hVRV9IX1JFRzAwRUgsIDB4MDApOwogCWF1ODUyMl93cml0ZXJlZyhzdGF0ZSwgQVU4NTIyX1RWREVDX0hVRV9MX1JFRzAwRkgsIDB4MDApOworCXN0YXRlLT5odWUgPSAweDAwOwogCiAJLyogT3RoZXIgZGVjb2RlciByZWdpc3RlcnMgKi8KIAlhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIEFVODUyMl9UVkRFQ19JTlRfTUFTS19SRUcwMTBILCAweDAwKTsKQEAgLTMxNSw3ICszMTYsNyBAQAogCWlmIChpbnB1dF9tb2RlID09IEFVODUyMl9JTlBVVF9DT05UUk9MX1JFRzA4MUhfU1ZJREVPX0NIMTMgfHwKIAkgICAgaW5wdXRfbW9kZSA9PSBBVTg1MjJfSU5QVVRfQ09OVFJPTF9SRUcwODFIX1NWSURFT19DSDI0KSB7CiAJCS8qIERlc3BpdGUgd2hhdCB0aGUgdGFibGUgc2F5cywgZm9yIHRoZSBIVlItOTUwcSB3ZSBzdGlsbCBuZWVkCi0JCSAgIHRvIGJlIGluIENWQlMgbW9kZSBmb3IgdGhlIFMtVmlkZW8gaW5wdXQgKHJlYXNvbiB1a25vd24pLiAqLworCQkgICB0byBiZSBpbiBDVkJTIG1vZGUgZm9yIHRoZSBTLVZpZGVvIGlucHV0IChyZWFzb24gdW5rbm93bikuICovCiAJCS8qIGZpbHRlcl9jb2VmX3R5cGUgPSAzOyAqLwogCQlmaWx0ZXJfY29lZl90eXBlID0gNTsKIAl9IGVsc2UgewpAQCAtNTA0LDcgKzUwNSwxOSBAQAogCQkJCWN0cmwtPnZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQlzdGF0ZS0+c2F0dXJhdGlvbiA9IGN0cmwtPnZhbHVlOworCQlhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIEFVODUyMl9UVkRFQ19TQVRVUkFUSU9OX0NCX1JFRzAwQ0gsCisJCQkJY3RybC0+dmFsdWUpOworCQlhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIEFVODUyMl9UVkRFQ19TQVRVUkFUSU9OX0NSX1JFRzAwREgsCisJCQkJY3RybC0+dmFsdWUpOworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hVRToKKwkJc3RhdGUtPmh1ZSA9IGN0cmwtPnZhbHVlOworCQlhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIEFVODUyMl9UVkRFQ19IVUVfSF9SRUcwMEVILAorCQkJCWN0cmwtPnZhbHVlID4+IDgpOworCQlhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIEFVODUyMl9UVkRFQ19IVUVfTF9SRUcwMEZILAorCQkJCWN0cmwtPnZhbHVlICYgMHhGRik7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgogCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKQEAgLTUzNCw3ICs1NDcsMTEgQEAKIAkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+Y29udHJhc3Q7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+c2F0dXJhdGlvbjsKKwkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWN0cmwtPnZhbHVlID0gc3RhdGUtPmh1ZTsKKwkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgogCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgpAQCAtNjMyLDggKzY0OSw5IEBACiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgogCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDI1NSwgMSwgMTI4KTsKIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgMCwgMjU1LCAxLCAxMjgpOwogCWNhc2UgVjRMMl9DSURfSFVFOgotCQkvKiBOb3QgeWV0IGltcGxlbWVudGVkICovCisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgLTMyNzY4LCAzMjc2OCwgMSwgMCk7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMl9wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX3ByaXYuaAppbmRleCBmMzI4ZjJiLi5jNzRjNGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX3ByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX3ByaXYuaApAQCAtNjIsNiArNjIsOCBAQAogCXUzMiByZXY7CiAJdTggYnJpZ2h0bmVzczsKIAl1OCBjb250cmFzdDsKKwl1OCBzYXR1cmF0aW9uOworCXMxNiBodWU7CiB9OwogCiAvKiBUaGVzZSBhcmUgcm91dGluZXMgc2hhcmVkIGJ5IGJvdGggdGhlIFZTQi9RQU0gZGVtb2R1bGF0b3IgYW5kIHRoZSBhbmFsb2cKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5jCmluZGV4IGZmYmNmYWIuLjAwYTRlOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYwpAQCAtMSw0ICsxLDQgQEAKLQkvKgorLyoKICAgICBjeDI0MTEwIC0gU2luZ2xlIENoaXAgU2F0ZWxsaXRlIENoYW5uZWwgUmVjZWl2ZXIgZHJpdmVyIG1vZHVsZQogCiAgICAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEhldHRrYW1wIDxwZXRlci5oZXR0a2FtcEBodHAtdGVsLmRlPiBiYXNlZCBvbgpAQCAtOTYsNyArOTYsNyBAQAogCSB7MHg0MiwweDAwfSwgLyogQCBtaWRkbGUgYnl0ZXMgIiAqLwogCSB7MHg0MywweDAwfSwgLyogQCBMU0IgICAgICAgICAgIiAqLwogCQkgICAgICAvKiBsZWF2ZSB0aGUgY2FycmllciB0cmFja2luZyBsb29wIHBhcmFtZXRlcnMgb24gZGVmYXVsdCAqLwotCQkgICAgICAvKiBsZWF2ZSB0aGUgYml0IHRpbWluZyBsb29wIHBhcmFtZXRlcnMgYXQgZ2VmYXVsdCAqLworCQkgICAgICAvKiBsZWF2ZSB0aGUgYml0IHRpbWluZyBsb29wIHBhcmFtZXRlcnMgYXQgZGVmYXVsdCAqLwogCSB7MHg1NiwweDRkfSwgLyogc2V0IHRoZSBmaWx0dW5lIHZvbHRhZ2UgdG8gMi43ViwgYXMgcmVjb21tZW5kZWQgYnkgKi8KIAkJICAgICAgLyogdGhlIGN4MjQxMDggZGF0YSBzaGVldCBmb3Igc3ltYm9sIHJhdGVzIGFib3ZlIDE1TVMvcyAqLwogCSB7MHg1NywweDAwfSwgLyogQCBGaWx0ZXIgc2lnbWEgZGVsdGEgZW5hYmxlZCwgcG9zaXRpdmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMy5jCmluZGV4IDA3NWIyYjUuLmU5ZWU1NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJCWluZm8oImRldGVjdGVkIENYMjQxMTMgdmFyaWFudFxuIik7CiAJCWJyZWFrOwogCWNhc2UgUkVWX0NYMjQxMTM6Ci0JCWluZm8oInN1Y2Vzc2Z1bGx5IGRldGVjdGVkXG4iKTsKKwkJaW5mbygic3VjY2Vzc2Z1bGx5IGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyKCJ1bnN1cHBvcnRlZCBkZXZpY2UgaWQ6ICV4XG4iLCBzdGF0ZS0+cmV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwppbmRleCAxMzZiOWQyLi5hZDRjOGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJCWNhc2UgQkFORFdJRFRIX0FVVE86CiAJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCQkJZGVmYXVsdDoKLQkJCQllcnIoInVua293biBiYW5kd2lkdGggdmFsdWUuIik7CisJCQkJZXJyKCJ1bmtub3duIGJhbmR3aWR0aCB2YWx1ZS4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKaW5kZXggMDc4MWY5NC4uNzUwYWU2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCiAJb3V0cmVnID0gMDsKIAlmaWZvX3RocmVzaG9sZCA9IDE3OTI7Ci0Jc21vX21vZGUgPSAoZGliNzAwMHBfcmVhZF93b3JkKHN0YXRlLCAyMzUpICYgMHgwMDEwKSB8ICgxIDw8IDEpOworCXNtb19tb2RlID0gKGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSwgMjM1KSAmIDB4MDA1MCkgfCAoMSA8PCAxKTsKIAogCWRwcmludGsoICJzZXR0aW5nIG91dHB1dCBtb2RlIGZvciBkZW1vZCAlcCB0byAlZCIsCiAJCQkmc3RhdGUtPmRlbW9kLCBtb2RlKTsKQEAgLTE2MiwxOCArMTYyLDE5IEBACiAJaWYgKHN0YXRlLT5kaXZfZm9yY2Vfb2ZmKSB7CiAJCWRwcmludGsoICJkaXZlcnNpdHkgY29tYmluYXRpb24gZGVhY3RpdmF0ZWQgLSBmb3JjZWQgYnkgQ09GRE0gcGFyYW1ldGVycyIpOwogCQlvbm9mZiA9IDA7Ci0JfQorCQlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDcsIDApOworCX0gZWxzZQorCQlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDcsIChzdGF0ZS0+ZGl2X3N5bmNfd2FpdCA8PCA0KSB8ICgxIDw8IDIpIHwgKDIgPDwgMCkpOworCiAJc3RhdGUtPmRpdl9zdGF0ZSA9ICh1OClvbm9mZjsKIAogCWlmIChvbm9mZikgewogCQlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDQsIDYpOwogCQlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDUsIDE2KTsKIAkJLyogUF9kdnN5X3N5bmNfbW9kZSA9IDAsIFBfZHZzeV9zeW5jX2VuYWJsZT0xLCBQX2R2Y2JfY29tYl9tb2RlPTIgKi8KLQkJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMjA3LCAoc3RhdGUtPmRpdl9zeW5jX3dhaXQgPDwgNCkgfCAoMSA8PCAyKSB8ICgyIDw8IDApKTsKIAl9IGVsc2UgewogCQlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDQsIDEpOwogCQlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDUsIDApOwotCQlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDcsIDApOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTE4OCw3ICsxMTg5LDcgQEAKIAkJKnN0YXQgfD0gRkVfSEFTX1ZJVEVSQkk7CiAJaWYgKGxvY2sgJiAweDAwMTApCiAJCSpzdGF0IHw9IEZFX0hBU19TWU5DOwotCWlmIChsb2NrICYgMHgwMDA4KQorICAgIGlmICgobG9jayAmIDB4MDAzOCkgPT0gMHgzOCkKIAkJKnN0YXQgfD0gRkVfSEFTX0xPQ0s7CiAKIAlyZXR1cm4gMDsKQEAgLTEzMDIsNiArMTMwMywyNCBAQAogfQogRVhQT1JUX1NZTUJPTChkaWI3MDAwcF9nZXRfaTJjX21hc3Rlcik7CiAKK2ludCBkaWI3MDAwcF9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IG9ub2ZmKQoreworICAgIHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKyAgICB1MTYgdmFsID0gZGliNzAwMHBfcmVhZF93b3JkKHN0YXRlLCAyMzUpICYgMHhmZmVmOworICAgIHZhbCB8PSAob25vZmYgJiAweDEpIDw8IDQ7CisgICAgZHByaW50aygiUElEIGZpbHRlciBlbmFibGVkICVkIiwgb25vZmYpOworICAgIHJldHVybiBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMzUsIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MKGRpYjcwMDBwX3BpZF9maWx0ZXJfY3RybCk7CisKK2ludCBkaWI3MDAwcF9waWRfZmlsdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1OCBpZCwgdTE2IHBpZCwgdTggb25vZmYpCit7CisgICAgc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworICAgIGRwcmludGsoIlBJRCBmaWx0ZXI6IGluZGV4ICV4LCBQSUQgJWQsIE9uT2ZmICVkIiwgaWQsIHBpZCwgb25vZmYpOworICAgIHJldHVybiBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyNDEgKyBpZCwgb25vZmYgPyAoMSA8PCAxMykgfCBwaWQgOiAwKTsKK30KK0VYUE9SVF9TWU1CT0woZGliNzAwMHBfcGlkX2ZpbHRlcik7CisKIGludCBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24oc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGludCBub19vZl9kZW1vZHMsIHU4IGRlZmF1bHRfYWRkciwgc3RydWN0IGRpYjcwMDBwX2NvbmZpZyBjZmdbXSkKIHsKIAlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgc3QgPSB7IC5pMmNfYWRhcCA9IGkyYyB9OwpAQCAtMTMxNCw4ICsxMzMzLDEwIEBACiAJCS8qIGRlc2lnbmF0ZWQgaTJjIGFkZHJlc3MgKi8KIAkJbmV3X2FkZHIgICAgICAgICAgPSAoMHg0MCArIGspIDw8IDE7CiAJCXN0LmkyY19hZGRyID0gbmV3X2FkZHI7CisJCWRpYjcwMDBwX3dyaXRlX3dvcmQoJnN0LCAxMjg3LCAweDAwMDMpOyAvKiBzcmFtIGxlYWQgaW4sIHJkeSAqLwogCQlpZiAoZGliNzAwMHBfaWRlbnRpZnkoJnN0KSAhPSAwKSB7CiAJCQlzdC5pMmNfYWRkciA9IGRlZmF1bHRfYWRkcjsKKwkJCWRpYjcwMDBwX3dyaXRlX3dvcmQoJnN0LCAxMjg3LCAweDAwMDMpOyAvKiBzcmFtIGxlYWQgaW4sIHJkeSAqLwogCQkJaWYgKGRpYjcwMDBwX2lkZW50aWZ5KCZzdCkgIT0gMCkgewogCQkJCWRwcmludGsoIkRpQjcwMDBQICMlZDogbm90IGlkZW50aWZpZWRcbiIsIGspOwogCQkJCXJldHVybiAtRUlPOwpAQCAtMTM3Miw2ICsxMzkzLDggQEAKIAlkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdiA9IHN0OwogCW1lbWNweSgmc3QtPmRlbW9kLm9wcywgJmRpYjcwMDBwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKKyAgICBkaWI3MDAwcF93cml0ZV93b3JkKHN0LCAxMjg3LCAweDAwMDMpOyAvKiBzcmFtIGxlYWQgaW4sIHJkeSAqLworCiAJaWYgKGRpYjcwMDBwX2lkZW50aWZ5KHN0KSAhPSAwKQogCQlnb3RvIGVycm9yOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5oCmluZGV4IDAyYTRjODIuLjgwNWRkMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5oCkBAIC01MSw2ICs1MSw4IEBACiBleHRlcm4gaW50IGRpYjcwMDBwX3NldF9ncGlvKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgdTggbnVtLCB1OCBkaXIsIHU4IHZhbCk7CiBleHRlcm4gaW50IGRpYjcwMDBwX3NldF93YmRfcmVmKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgdTE2IHZhbHVlKTsKIGV4dGVybiBpbnQgZGliNzAwMHBjX2RldGVjdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwKTsKK2V4dGVybiBpbnQgZGliNzAwMHBfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHU4IGlkLCB1MTYgcGlkLCB1OCBvbm9mZik7CitleHRlcm4gaW50IGRpYjcwMDBwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggb25vZmYpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRpYjcwMDBwX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCB1OCBpMmNfYWRkciwKQEAgLTk1LDYgKzk3LDE3IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CitzdGF0aWMgaW5saW5lIGludCBkaWI3MDAwcF9waWRfZmlsdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1OCBpZCwgdTE2IHBpZCwgdTggb25vZmYpCit7CisgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpYjcwMDBwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdWludDhfdCBvbm9mZikKK3sKKyAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gLUVOT0RFVjsKK30KICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI4MDAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliODAwMC5jCmluZGV4IDg1MmM3OTAuLjg5ODQwMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI4MDAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjgwMDAuYwpAQCAtOTU0LDcgKzk1NCw3IEBACiAJdTggZ3VhcmQsIGNyYXRlLCBjb25zdGVsbGF0aW9uLCB0aW1lSTsKIAl1OCBwZXJtdV9zZWdbXSA9IHsgNiwgNSwgNywgNCwgOCwgMywgOSwgMiwgMTAsIDEsIDExLCAwLCAxMiB9OwogCXUxNiBpLCBjb2VmZls0XSwgUF9jZnJfbGVmdF9lZGdlID0gMCwgUF9jZnJfcmlnaHRfZWRnZSA9IDAsIHNlZ19tYXNrMTMgPSAweDFmZmY7CS8vIEFsbCAxMyBzZWdtZW50cyBlbmFibGVkCi0JY29uc3QgczE2ICpuY29lZmYsICphbmFfZmU7CisJY29uc3QgczE2ICpuY29lZmYgPSBOVUxMLCAqYW5hX2ZlOwogCXUxNiB0bWNjX3BvdyA9IDA7CiAJdTE2IGNvZmZfcG93ID0gMHgyODAwOwogCXUxNiBpbml0X3ByYnMgPSAweGZmZjsKQEAgLTIxMjEsNyArMjEyMSw3IEBACiAJZWxzZQogCQlyZXN1bHQgLT0gaW50bG9nMTAoMikgKiAxMCAqIG5vaXNlX2V4cCAtIDEwMDsKIAotCSpzbnIgPSByZXN1bHQgLyAoMSA8PCAyNCk7CisJKnNuciA9IHJlc3VsdCAvICgoMSA8PCAyNCkgLyAxMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxOTUsNiArMjE5NSwyNSBAQAogCiBFWFBPUlRfU1lNQk9MKGRpYjgwMDBfZ2V0X2kyY19tYXN0ZXIpOwogCitpbnQgZGliODAwMF9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IG9ub2ZmKQoreworCXN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworICAgIHUxNiB2YWwgPSBkaWI4MDAwX3JlYWRfd29yZChzdCwgMjk5KSAmIDB4ZmZlZjsKKyAgICB2YWwgfD0gKG9ub2ZmICYgMHgxKSA8PCA0OworCisgICAgZHByaW50aygicGlkIGZpbHRlciBlbmFibGVkICVkIiwgb25vZmYpOworICAgIHJldHVybiBkaWI4MDAwX3dyaXRlX3dvcmQoc3QsIDI5OSwgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0woZGliODAwMF9waWRfZmlsdGVyX2N0cmwpOworCitpbnQgZGliODAwMF9waWRfZmlsdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1OCBpZCwgdTE2IHBpZCwgdTggb25vZmYpCit7CisJc3RydWN0IGRpYjgwMDBfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisgICAgZHByaW50aygiSW5kZXggJXgsIFBJRCAlZCwgT25PZmYgJWQiLCBpZCwgcGlkLCBvbm9mZik7CisgICAgcmV0dXJuIGRpYjgwMDBfd3JpdGVfd29yZChzdCwgMzA1ICsgaWQsIG9ub2ZmID8gKDEgPDwgMTMpIHwgcGlkIDogMCk7Cit9CitFWFBPUlRfU1lNQk9MKGRpYjgwMDBfcGlkX2ZpbHRlcik7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkaWI4MDAwX29wcyA9IHsKIAkuaW5mbyA9IHsKIAkJIC5uYW1lID0gIkRpQmNvbSA4MDAwIElTREItVCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliODAwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjgwMDAuaAppbmRleCBhODZkZTM0Li44Yzg5NDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliODAwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI4MDAwLmgKQEAgLTQ0LDYgKzQ0LDggQEAKIAogZXh0ZXJuIGludCBkaWI4MDAwX3NldF9ncGlvKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgdTggbnVtLCB1OCBkaXIsIHU4IHZhbCk7CiBleHRlcm4gaW50IGRpYjgwMDBfc2V0X3diZF9yZWYoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCB1MTYgdmFsdWUpOworZXh0ZXJuIGludCBkaWI4MDAwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHU4IG9ub2ZmKTsKK2V4dGVybiBpbnQgZGliODAwMF9waWRfZmlsdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgdTggaWQsIHUxNiBwaWQsIHU4IG9ub2ZmKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRpYjgwMDBfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHU4IGkyY19hZGRyLCBzdHJ1Y3QgZGliODAwMF9jb25maWcgKmNmZykKIHsKQEAgLTc0LDYgKzc2LDE4IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CisKK2ludCBkaWI4MDAwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggb25vZmYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2ludCBkaWI4MDAwX3BpZF9maWx0ZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IGlkLCB1MTYgcGlkLCB1OCBvbm9mZikKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeDM5N3hELmMKaW5kZXggMDEwMDc1NS4uODY4Yjc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeDM5N3hELmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeDM5N3hELmMKQEAgLTgxLDcgKzgxLDcgQEAKICNpbmNsdWRlICJkcngzOTd4RF9mdy5oIgogfTsKIAotLyogdXNlIG9ubHkgd2l0aCB3cml0ZXIgbG9jayBhcXVpcmVkICovCisvKiB1c2Ugb25seSB3aXRoIHdyaXRlciBsb2NrIGFjcXVpcmVkICovCiBzdGF0aWMgdm9pZCBfZHJ4X3JlbGVhc2VfZncoc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzLCBlbnVtIGZ3X2l4IGl4KQogewogCW1lbXNldCgmZndbaXhdLmRhdGFbMF0sIDAsIHNpemVvZihmd1swXS5kYXRhKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHMzMDAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHMzMDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmMzUzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kczMwMDAuYwpAQCAtMCwwICsxLDEzNjcgQEAKKy8qCisgICAgTW9udGFnZSBUZWNobm9sb2d5IERTMzAwMC9UUzIwMjAgLSBEVkJTL1MyIERlbW9kdWxhdG9yL1R1bmVyIGRyaXZlcgorICAgIENvcHlyaWdodCAoQykgMjAwOSBLb25zdGFudGluIERpbWl0cm92IDxrb3Npby5kaW1pdHJvdkBnbWFpbC5jb20+CisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDkgVHVyYm9TaWdodC5jb20KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImRzMzAwMC5oIgorCitzdGF0aWMgaW50IGRlYnVnOworCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcpIFwKKwkJCXByaW50ayhhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIGFzIG9mIE1hcmNoIDIwMDkgY3VycmVudCBEUzMwMDAgZmlybXdhcmUgdmVyc2lvbiBpcyAxLjc4ICovCisvKiBEUzMwMDAgRlcgdjEuNzggTUQ1OiBhMzJkMTc5MTBjNGYzNzAwNzNmOTM0NmU3MWQzNGI4MCAqLworI2RlZmluZSBEUzMwMDBfREVGQVVMVF9GSVJNV0FSRSAiZHZiLWZlLWRzMzAwMC5mdyIKKworI2RlZmluZSBEUzMwMDBfU0FNUExFX1JBVEUgOTYwMDAgLyogaW4ga0h6ICovCisjZGVmaW5lIERTMzAwMF9YVEFMX0ZSRVEgICAyNzAwMCAvKiBpbiBrSHogKi8KKworLyogUmVnaXN0ZXIgdmFsdWVzIHRvIGluaXRpYWxpc2UgdGhlIGRlbW9kIGluIERWQi1TIG1vZGUgKi8KK3N0YXRpYyB1OCBkczMwMDBfZHZic19pbml0X3RhYltdID0geworCTB4MjMsIDB4MDUsCisJMHgwOCwgMHgwMywKKwkweDBjLCAweDAwLAorCTB4MjEsIDB4NTQsCisJMHgyNSwgMHg4MiwKKwkweDI3LCAweDMxLAorCTB4MzAsIDB4MDgsCisJMHgzMSwgMHg0MCwKKwkweDMyLCAweDMyLAorCTB4MzMsIDB4MzUsCisJMHgzNSwgMHhmZiwKKwkweDNhLCAweDAwLAorCTB4MzcsIDB4MTAsCisJMHgzOCwgMHgxMCwKKwkweDM5LCAweDAyLAorCTB4NDIsIDB4NjAsCisJMHg0YSwgMHg0MCwKKwkweDRiLCAweDA0LAorCTB4NGQsIDB4OTEsCisJMHg1ZCwgMHhjOCwKKwkweDUwLCAweDc3LAorCTB4NTEsIDB4NzcsCisJMHg1MiwgMHgzNiwKKwkweDUzLCAweDM2LAorCTB4NTYsIDB4MDEsCisJMHg2MywgMHg0MywKKwkweDY0LCAweDMwLAorCTB4NjUsIDB4NDAsCisJMHg2OCwgMHgyNiwKKwkweDY5LCAweDRjLAorCTB4NzAsIDB4MjAsCisJMHg3MSwgMHg3MCwKKwkweDcyLCAweDA0LAorCTB4NzMsIDB4MDAsCisJMHg3MCwgMHg0MCwKKwkweDcxLCAweDcwLAorCTB4NzIsIDB4MDQsCisJMHg3MywgMHgwMCwKKwkweDcwLCAweDYwLAorCTB4NzEsIDB4NzAsCisJMHg3MiwgMHgwNCwKKwkweDczLCAweDAwLAorCTB4NzAsIDB4ODAsCisJMHg3MSwgMHg3MCwKKwkweDcyLCAweDA0LAorCTB4NzMsIDB4MDAsCisJMHg3MCwgMHhhMCwKKwkweDcxLCAweDcwLAorCTB4NzIsIDB4MDQsCisJMHg3MywgMHgwMCwKKwkweDcwLCAweDFmLAorCTB4NzYsIDB4MDAsCisJMHg3NywgMHhkMSwKKwkweDc4LCAweDBjLAorCTB4NzksIDB4ODAsCisJMHg3ZiwgMHgwNCwKKwkweDdjLCAweDAwLAorCTB4ODAsIDB4ODYsCisJMHg4MSwgMHhhNiwKKwkweDg1LCAweDA0LAorCTB4Y2QsIDB4ZjQsCisJMHg5MCwgMHgzMywKKwkweGEwLCAweDQ0LAorCTB4YzAsIDB4MTgsCisJMHhjMywgMHgxMCwKKwkweGM0LCAweDA4LAorCTB4YzUsIDB4ODAsCisJMHhjNiwgMHg4MCwKKwkweGM3LCAweDBhLAorCTB4YzgsIDB4MWEsCisJMHhjOSwgMHg4MCwKKwkweGZlLCAweDkyLAorCTB4ZTAsIDB4ZjgsCisJMHhlNiwgMHg4YiwKKwkweGQwLCAweDQwLAorCTB4ZjgsIDB4MjAsCisJMHhmYSwgMHgwZiwKKwkweGZkLCAweDIwLAorCTB4YWQsIDB4MjAsCisJMHhhZSwgMHgwNywKKwkweGI4LCAweDAwLAorfTsKKworLyogUmVnaXN0ZXIgdmFsdWVzIHRvIGluaXRpYWxpc2UgdGhlIGRlbW9kIGluIERWQi1TMiBtb2RlICovCitzdGF0aWMgdTggZHMzMDAwX2R2YnMyX2luaXRfdGFiW10gPSB7CisJMHgyMywgMHgwZiwKKwkweDA4LCAweDA3LAorCTB4MGMsIDB4MDAsCisJMHgyMSwgMHg1NCwKKwkweDI1LCAweDgyLAorCTB4MjcsIDB4MzEsCisJMHgzMCwgMHgwOCwKKwkweDMxLCAweDMyLAorCTB4MzIsIDB4MzIsCisJMHgzMywgMHgzNSwKKwkweDM1LCAweGZmLAorCTB4M2EsIDB4MDAsCisJMHgzNywgMHgxMCwKKwkweDM4LCAweDEwLAorCTB4MzksIDB4MDIsCisJMHg0MiwgMHg2MCwKKwkweDRhLCAweDgwLAorCTB4NGIsIDB4MDQsCisJMHg0ZCwgMHg4MSwKKwkweDVkLCAweDg4LAorCTB4NTAsIDB4MzYsCisJMHg1MSwgMHgzNiwKKwkweDUyLCAweDM2LAorCTB4NTMsIDB4MzYsCisJMHg2MywgMHg2MCwKKwkweDY0LCAweDEwLAorCTB4NjUsIDB4MTAsCisJMHg2OCwgMHgwNCwKKwkweDY5LCAweDI5LAorCTB4NzAsIDB4MjAsCisJMHg3MSwgMHg3MCwKKwkweDcyLCAweDA0LAorCTB4NzMsIDB4MDAsCisJMHg3MCwgMHg0MCwKKwkweDcxLCAweDcwLAorCTB4NzIsIDB4MDQsCisJMHg3MywgMHgwMCwKKwkweDcwLCAweDYwLAorCTB4NzEsIDB4NzAsCisJMHg3MiwgMHgwNCwKKwkweDczLCAweDAwLAorCTB4NzAsIDB4ODAsCisJMHg3MSwgMHg3MCwKKwkweDcyLCAweDA0LAorCTB4NzMsIDB4MDAsCisJMHg3MCwgMHhhMCwKKwkweDcxLCAweDcwLAorCTB4NzIsIDB4MDQsCisJMHg3MywgMHgwMCwKKwkweDcwLCAweDFmLAorCTB4YTAsIDB4NDQsCisJMHhjMCwgMHgwOCwKKwkweGMxLCAweDEwLAorCTB4YzIsIDB4MDgsCisJMHhjMywgMHgxMCwKKwkweGM0LCAweDA4LAorCTB4YzUsIDB4ZjAsCisJMHhjNiwgMHhmMCwKKwkweGM3LCAweDBhLAorCTB4YzgsIDB4MWEsCisJMHhjOSwgMHg4MCwKKwkweGNhLCAweDIzLAorCTB4Y2IsIDB4MjQsCisJMHhjZSwgMHg3NCwKKwkweDkwLCAweDAzLAorCTB4NzYsIDB4ODAsCisJMHg3NywgMHg0MiwKKwkweDc4LCAweDBhLAorCTB4NzksIDB4ODAsCisJMHhhZCwgMHg0MCwKKwkweGFlLCAweDA3LAorCTB4N2YsIDB4ZDQsCisJMHg3YywgMHgwMCwKKwkweDgwLCAweGE4LAorCTB4ODEsIDB4ZGEsCisJMHg3YywgMHgwMSwKKwkweDgwLCAweGRhLAorCTB4ODEsIDB4ZWMsCisJMHg3YywgMHgwMiwKKwkweDgwLCAweGNhLAorCTB4ODEsIDB4ZWIsCisJMHg3YywgMHgwMywKKwkweDgwLCAweGJhLAorCTB4ODEsIDB4ZGIsCisJMHg4NSwgMHgwOCwKKwkweDg2LCAweDAwLAorCTB4ODcsIDB4MDIsCisJMHg4OSwgMHg4MCwKKwkweDhiLCAweDQ0LAorCTB4OGMsIDB4YWEsCisJMHg4YSwgMHgxMCwKKwkweGJhLCAweDAwLAorCTB4ZjUsIDB4MDQsCisJMHhmZSwgMHg0NCwKKwkweGQyLCAweDMyLAorCTB4YjgsIDB4MDAsCit9OworCisvKiBEUzMwMDAgZG9lc24ndCBuZWVkIHNvbWUgcGFyYW1ldGVycyBhcyBpbnB1dCBhbmQgYXV0by1kZXRlY3RzIHRoZW0gKi8KKy8qIHNhdmUgaW5wdXQgZnJvbSB0aGUgYXBwbGljYXRpb24gb2YgdGhvc2UgcGFyYW1ldGVycyAqLworc3RydWN0IGRzMzAwMF90dW5pbmcgeworCXUzMiBmcmVxdWVuY3k7CisJdTMyIHN5bWJvbF9yYXRlOworCWZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbjsKKwllbnVtIGZlX2NvZGVfcmF0ZSBmZWM7CisKKwkvKiBpbnB1dCB2YWx1ZXMgKi8KKwl1OCBpbnZlcnNpb25fdmFsOworCWZlX21vZHVsYXRpb25fdCBkZWxpdmVyeTsKKwl1OCByb2xsb2ZmOworfTsKKworc3RydWN0IGRzMzAwMF9zdGF0ZSB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJY29uc3Qgc3RydWN0IGRzMzAwMF9jb25maWcgKmNvbmZpZzsKKworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CisKKwlzdHJ1Y3QgZHMzMDAwX3R1bmluZyBkY3VyOworCXN0cnVjdCBkczMwMDBfdHVuaW5nIGRueHQ7CisKKwl1OCBza2lwX2Z3X2xvYWQ7CisKKwkvKiBwcmV2aW91cyB1bmNvcnJlY3RlZCBibG9jayBjb3VudGVyIGZvciBEVkItUzIgKi8KKwl1MTYgcHJldlVDQlMyOworfTsKKworc3RhdGljIGludCBkczMwMDBfd3JpdGVyZWcoc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUsIGludCByZWcsIGludCBkYXRhKQoreworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKKwlpbnQgZXJyOworCisJZHByaW50aygiJXM6IHdyaXRlIHJlZyAweCUwMngsIHZhbHVlIDB4JTAyeFxuIiwgX19mdW5jX18sIHJlZywgZGF0YSk7CisKKwllcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSk7CisJaWYgKGVyciAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHdyaXRlcmVnIGVycm9yKGVyciA9PSAlaSwgcmVnID09IDB4JTAyeCwiCisJCQkgIiB2YWx1ZSA9PSAweCUwMngpXG4iLCBfX2Z1bmNfXywgZXJyLCByZWcsIGRhdGEpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUsIGludCByZWcsIGludCBkYXRhKQoreworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHg2MCwKKwkJLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKKwlpbnQgZXJyOworCisJZHByaW50aygiJXM6IHdyaXRlIHJlZyAweCUwMngsIHZhbHVlIDB4JTAyeFxuIiwgX19mdW5jX18sIHJlZywgZGF0YSk7CisKKwlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4MTEpOworCWVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKTsKKwlpZiAoZXJyICE9IDEpIHsKKwkJcHJpbnRrKCIlczogd3JpdGVyZWcgZXJyb3IoZXJyID09ICVpLCByZWcgPT0gMHglMDJ4LCIKKwkJCSAiIHZhbHVlID09IDB4JTAyeClcbiIsIF9fZnVuY19fLCBlcnIsIHJlZywgZGF0YSk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKiBJMkMgd3JpdGUgZm9yIDhrIGZpcm13YXJlIGxvYWQgKi8KK3N0YXRpYyBpbnQgZHMzMDAwX3dyaXRlRlcoc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUsIGludCByZWcsCisJCQkJY29uc3QgdTggKmRhdGEsIHUxNiBsZW4pCit7CisJaW50IGksIHJldCA9IC1FUkVNT1RFSU87CisJc3RydWN0IGkyY19tc2cgbXNnOworCXU4ICpidWY7CisKKwlidWYgPSBrbWFsbG9jKDMsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBrbWFsbG9jXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqKGJ1ZikgPSByZWc7CisKKwltc2cuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3M7CisJbXNnLmZsYWdzID0gMDsKKwltc2cuYnVmID0gYnVmOworCW1zZy5sZW4gPSAzOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7CisJCW1lbWNweShidWYgKyAxLCBkYXRhICsgaSwgMik7CisKKwkJZHByaW50aygiJXM6IHdyaXRlIHJlZyAweCUwMngsIGxlbiA9ICVkXG4iLCBfX2Z1bmNfXywgcmVnLCBsZW4pOworCisJCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKTsKKwkJaWYgKHJldCAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB3cml0ZSBlcnJvcihlcnIgPT0gJWksICIKKwkJCQkicmVnID09IDB4JTAyeFxuIiwgX19mdW5jX18sIHJldCwgcmVnKTsKKwkJCXJldCA9IC1FUkVNT1RFSU87CisJCX0KKwl9CisKK2Vycm9yOgorCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzMzAwMF9yZWFkcmVnKHN0cnVjdCBkczMwMDBfc3RhdGUgKnN0YXRlLCB1OCByZWcpCit7CisJaW50IHJldDsKKwl1OCBiMFtdID0geyByZWcgfTsKKwl1OCBiMVtdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsKKwkJCS5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCS5mbGFncyA9IDAsCisJCQkuYnVmID0gYjAsCisJCQkubGVuID0gMQorCQl9LCB7CisJCQkuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5idWYgPSBiMSwKKwkJCS5sZW4gPSAxCisJCX0KKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMik7CisKKwlpZiAocmV0ICE9IDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnPTB4JXgoZXJyb3I9JWQpXG4iLCBfX2Z1bmNfXywgcmVnLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRwcmludGsoIiVzOiByZWFkIHJlZyAweCUwMngsIHZhbHVlIDB4JTAyeFxuIiwgX19mdW5jX18sIHJlZywgYjFbMF0pOworCisJcmV0dXJuIGIxWzBdOworfQorCitzdGF0aWMgaW50IGRzMzAwMF90dW5lcl9yZWFkcmVnKHN0cnVjdCBkczMwMDBfc3RhdGUgKnN0YXRlLCB1OCByZWcpCit7CisJaW50IHJldDsKKwl1OCBiMFtdID0geyByZWcgfTsKKwl1OCBiMVtdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsKKwkJCS5hZGRyID0gMHg2MCwKKwkJCS5mbGFncyA9IDAsCisJCQkuYnVmID0gYjAsCisJCQkubGVuID0gMQorCQl9LCB7CisJCQkuYWRkciA9IDB4NjAsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5idWYgPSBiMSwKKwkJCS5sZW4gPSAxCisJCX0KKwl9OworCisJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweDAzLCAweDEyKTsKKwlyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgbXNnLCAyKTsKKworCWlmIChyZXQgIT0gMikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWc9MHgleChlcnJvcj0lZClcbiIsIF9fZnVuY19fLCByZWcsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZHByaW50aygiJXM6IHJlYWQgcmVnIDB4JTAyeCwgdmFsdWUgMHglMDJ4XG4iLCBfX2Z1bmNfXywgcmVnLCBiMVswXSk7CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyBpbnQgZHMzMDAwX3NldF9pbnZlcnNpb24oc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUsCisJCQkJCWZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbikKK3sKKwlkcHJpbnRrKCIlcyglZClcbiIsIF9fZnVuY19fLCBpbnZlcnNpb24pOworCisJc3dpdGNoIChpbnZlcnNpb24pIHsKKwljYXNlIElOVkVSU0lPTl9PRkY6CisJY2FzZSBJTlZFUlNJT05fT046CisJY2FzZSBJTlZFUlNJT05fQVVUTzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdGUtPmRueHQuaW52ZXJzaW9uID0gaW52ZXJzaW9uOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMzMDAwX3NldF9zeW1ib2xyYXRlKHN0cnVjdCBkczMwMDBfc3RhdGUgKnN0YXRlLCB1MzIgcmF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWRwcmludGsoIiVzKCkgc3ltYm9sX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sIHN0YXRlLT5kbnh0LnN5bWJvbF9yYXRlKTsKKworCS8qICBjaGVjayBpZiBzeW1ib2wgcmF0ZSBpcyB3aXRoaW4gbGltaXRzICovCisJaWYgKChzdGF0ZS0+ZG54dC5zeW1ib2xfcmF0ZSA+CisJCQkJc3RhdGUtPmZyb250ZW5kLm9wcy5pbmZvLnN5bWJvbF9yYXRlX21heCkgfHwKKwkgICAgKHN0YXRlLT5kbnh0LnN5bWJvbF9yYXRlIDwKKwkJCQlzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8uc3ltYm9sX3JhdGVfbWluKSkKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlzdGF0ZS0+ZG54dC5zeW1ib2xfcmF0ZSA9IHJhdGU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzMzAwMF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KTsKKworc3RhdGljIGludCBkczMwMDBfZmlybXdhcmVfb25kZW1hbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWludCByZXQgPSAwOworCisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGIyKSA8PSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHN0YXRlLT5za2lwX2Z3X2xvYWQpCisJCXJldHVybiAwOworCS8qIExvYWQgZmlybXdhcmUgKi8KKwkvKiByZXF1ZXN0IHRoZSBmaXJtd2FyZSwgdGhpcyB3aWxsIGJsb2NrIHVudGlsIHNvbWVvbmUgdXBsb2FkcyBpdCAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBXYWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQgKCVzKS4uLlxuIiwgX19mdW5jX18sCisJCQkJRFMzMDAwX0RFRkFVTFRfRklSTVdBUkUpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBEUzMwMDBfREVGQVVMVF9GSVJNV0FSRSwKKwkJCQlzdGF0ZS0+aTJjLT5kZXYucGFyZW50KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogV2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkKDIpLi4uXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBmaXJtd2FyZSB1cGxvYWRlZCAodGltZW91dCBvciBmaWxlIG5vdCAiCisJCQkJImZvdW5kPylcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjdXJzZSBiYWNrIHRocm91Z2ggaGVyZSBkdXJpbmcgbG9hZGluZyAqLworCXN0YXRlLT5za2lwX2Z3X2xvYWQgPSAxOworCisJcmV0ID0gZHMzMDAwX2xvYWRfZmlybXdhcmUoZmUsIGZ3KTsKKwlpZiAocmV0KQorCQlwcmludGsoIiVzOiBXcml0aW5nIGZpcm13YXJlIHRvIGRldmljZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJZHByaW50aygiJXM6IEZpcm13YXJlIHVwbG9hZCAlc1xuIiwgX19mdW5jX18sCisJCQlyZXQgPT0gMCA/ICJjb21wbGV0ZSIgOiAiZmFpbGVkIik7CisKKwkvKiBFbnN1cmUgZmlybXdhcmUgaXMgYWx3YXlzIGxvYWRlZCBpZiByZXF1aXJlZCAqLworCXN0YXRlLT5za2lwX2Z3X2xvYWQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkczMwMDBfbG9hZF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCJGaXJtd2FyZSBpcyAlenUgYnl0ZXMgKCUwMnggJTAyeCAuLiAlMDJ4ICUwMngpXG4iLAorCQkJZnctPnNpemUsCisJCQlmdy0+ZGF0YVswXSwKKwkJCWZ3LT5kYXRhWzFdLAorCQkJZnctPmRhdGFbZnctPnNpemUgLSAyXSwKKwkJCWZ3LT5kYXRhW2Z3LT5zaXplIC0gMV0pOworCisJLyogQmVnaW4gdGhlIGZpcm13YXJlIGxvYWQgcHJvY2VzcyAqLworCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhiMiwgMHgwMSk7CisJLyogd3JpdGUgdGhlIGVudGlyZSBmaXJtd2FyZSAqLworCWRzMzAwMF93cml0ZUZXKHN0YXRlLCAweGIwLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhiMiwgMHgwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHMzMDAwX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkczMwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHgsIHksIHJlZyA9IDAsIHZhbDsKKworCWZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisJCWRwcmludGsoIiVzOiAlMDJ4OiAiLCBfX2Z1bmNfXywgeSk7CisJCWZvciAoeCA9IDA7IHggPCAxNjsgeCsrKSB7CisJCQlyZWcgPSAoeSA8PCA0KSArIHg7CisJCQl2YWwgPSBkczMwMDBfcmVhZHJlZyhzdGF0ZSwgcmVnKTsKKwkJCWlmICh4ICE9IDE1KQorCQkJCWRwcmludGsoIiUwMnggIiwgIHZhbCk7CisJCQllbHNlCisJCQkJZHByaW50aygiJTAyeFxuIiwgdmFsKTsKKwkJfQorCX0KKwlkcHJpbnRrKCIlczogLS0gRFMzMDAwIERVTVAgRE9ORSAtLVxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IGRzMzAwMF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCWludCBsb2NrOworCisJKnN0YXR1cyA9IDA7CisKKwlzd2l0Y2ggKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCWNhc2UgU1lTX0RWQlM6CisJCWxvY2sgPSBkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhkMSk7CisJCWlmICgobG9jayAmIDB4MDcpID09IDB4MDcpCisJCQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwKKwkJCQlGRV9IQVNfVklURVJCSSB8IEZFX0hBU19TWU5DIHwKKwkJCQlGRV9IQVNfTE9DSzsKKworCQlicmVhazsKKwljYXNlIFNZU19EVkJTMjoKKwkJbG9jayA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweDBkKTsKKwkJaWYgKChsb2NrICYgMHg4ZikgPT0gMHg4ZikKKwkJCSpzdGF0dXMgPSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVIgfAorCQkJCUZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMgfAorCQkJCUZFX0hBU19MT0NLOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KKworCWRwcmludGsoIiVzOiBzdGF0dXMgPSAweCUwMnhcbiIsIF9fZnVuY19fLCBsb2NrKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEZFX0lTX1RVTkVEIChGRV9IQVNfU0lHTkFMICsgRkVfSEFTX0xPQ0spCitzdGF0aWMgaW50IGRzMzAwMF9pc190dW5lZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlmZV9zdGF0dXNfdCB0dW5lcnN0YXQ7CisKKwlkczMwMDBfcmVhZF9zdGF0dXMoZmUsICZ0dW5lcnN0YXQpOworCisJcmV0dXJuICgodHVuZXJzdGF0ICYgRkVfSVNfVFVORUQpID09IEZFX0lTX1RVTkVEKTsKK30KKworLyogcmVhZCBEUzMwMDAgQkVSIHZhbHVlICovCitzdGF0aWMgaW50IGRzMzAwMF9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyKiBiZXIpCit7CisJc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKwl1OCBkYXRhOworCXUzMiBiZXJfcmVhZGluZywgbHBkY19mcmFtZXM7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlzd2l0Y2ggKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCWNhc2UgU1lTX0RWQlM6CisJCS8qIHNldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNoZWNrZWQgZHVyaW5nCisJCUJFUiBlc3RpbWF0aW9uICovCisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhmOSwgMHgwNCk7CisJCS8qIHJlYWQgQkVSIGVzdGltYXRpb24gc3RhdHVzICovCisJCWRhdGEgPSBkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhmOCk7CisJCS8qIGNoZWNrIGlmIEJFUiBlc3RpbWF0aW9uIGlzIHJlYWR5ICovCisJCWlmICgoZGF0YSAmIDB4MTApID09IDApIHsKKwkJCS8qIHRoaXMgaXMgdGhlIG51bWJlciBvZiBlcnJvciBiaXRzLAorCQkJdG8gY2FsY3VsYXRlIHRoZSBiaXQgZXJyb3IgcmF0ZQorCQkJZGl2aWRlIHRvIDgzODg2MDggKi8KKwkJCSpiZXIgPSAoZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZjcpIDw8IDgpIHwKKwkJCQlkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhmNik7CisJCQkvKiBzdGFydCBjb3VudGluZyBlcnJvciBiaXRzICovCisJCQkvKiBuZWVkIHRvIGJlIHNldCB0d2ljZQorCQkJb3RoZXJ3aXNlIGl0IGZhaWxzIHNvbWV0aW1lcyAqLworCQkJZGF0YSB8PSAweDEwOworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGY4LCBkYXRhKTsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhmOCwgZGF0YSk7CisJCX0gZWxzZQorCQkJLyogdXNlZCB0byBpbmRpY2F0ZSB0aGF0IEJFUiBlc3RpbWF0aW9uCisJCQlpcyBub3QgcmVhZHksIGkuZS4gQkVSIGlzIHVua25vd24gKi8KKwkJCSpiZXIgPSAweGZmZmZmZmZmOworCQlicmVhazsKKwljYXNlIFNZU19EVkJTMjoKKwkJLyogcmVhZCB0aGUgbnVtYmVyIG9mIExQREMgZGVjb2RlZCBmcmFtZXMgKi8KKwkJbHBkY19mcmFtZXMgPSAoZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZDcpIDw8IDE2KSB8CisJCQkJKGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGQ2KSA8PCA4KSB8CisJCQkJZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZDUpOworCQkvKiByZWFkIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3aXRoIGJhZCBDUkMgKi8KKwkJYmVyX3JlYWRpbmcgPSAoZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZjgpIDw8IDgpIHwKKwkJCQlkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhmNyk7CisJCWlmIChscGRjX2ZyYW1lcyA+IDc1MCkgeworCQkJLyogY2xlYXIgTFBEQyBmcmFtZSBjb3VudGVycyAqLworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGQxLCAweDAxKTsKKwkJCS8qIGNsZWFyIGJhZCBwYWNrZXRzIGNvdW50ZXIgKi8KKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhmOSwgMHgwMSk7CisJCQkvKiBlbmFibGUgYmFkIHBhY2tldHMgY291bnRlciAqLworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGY5LCAweDAwKTsKKwkJCS8qIGVuYWJsZSBMUERDIGZyYW1lIGNvdW50ZXJzICovCisJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4ZDEsIDB4MDApOworCQkJKmJlciA9IGJlcl9yZWFkaW5nOworCQl9IGVsc2UKKwkJCS8qIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBCRVIgZXN0aW1hdGlvbiBpcyBub3QgcmVhZHksCisJCQlpLmUuIEJFUiBpcyB1bmtub3duICovCisJCQkqYmVyID0gMHhmZmZmZmZmZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgVFMyMDIwIHNpZ25hbCBzdHJlbmd0aCAqLworc3RhdGljIGludCBkczMwMDBfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQl1MTYgKnNpZ25hbF9zdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUxNiBzaWdfcmVhZGluZywgc2lnX3N0cmVuZ3RoOworCXU4IHJmZ2FpbiwgYmJnYWluOworCisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCisJcmZnYWluID0gZHMzMDAwX3R1bmVyX3JlYWRyZWcoc3RhdGUsIDB4M2QpICYgMHgxZjsKKwliYmdhaW4gPSBkczMwMDBfdHVuZXJfcmVhZHJlZyhzdGF0ZSwgMHgyMSkgJiAweDFmOworCisJaWYgKHJmZ2FpbiA+IDE1KQorCQlyZmdhaW4gPSAxNTsKKwlpZiAoYmJnYWluID4gMTMpCisJCWJiZ2FpbiA9IDEzOworCisJc2lnX3JlYWRpbmcgPSByZmdhaW4gKiAyICsgYmJnYWluICogMzsKKworCXNpZ19zdHJlbmd0aCA9IDQwICsgKDY0IC0gc2lnX3JlYWRpbmcpICogNTAgLyA2NCA7CisKKwkvKiBjb29rIHRoZSB2YWx1ZSB0byBiZSBzdWl0YWJsZSBmb3Igc3phcC1zMiBodW1hbiByZWFkYWJsZSBvdXRwdXQgKi8KKwkqc2lnbmFsX3N0cmVuZ3RoID0gc2lnX3N0cmVuZ3RoICogMTAwMDsKKworCWRwcmludGsoIiVzOiByYXcgLyBjb29rZWQgPSAweCUwNHggLyAweCUwNHhcbiIsIF9fZnVuY19fLAorCQkJc2lnX3JlYWRpbmcsICpzaWduYWxfc3RyZW5ndGgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGN1bGF0ZSBEUzMwMDAgc25yIHZhbHVlIGluIGRCICovCitzdGF0aWMgaW50IGRzMzAwMF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKwl1OCBzbnJfcmVhZGluZywgc25yX3ZhbHVlOworCXUzMiBkdmJzMl9zaWduYWxfcmVhZGluZywgZHZiczJfbm9pc2VfcmVhZGluZywgdG1wOworCXN0YXRpYyBjb25zdCB1MTYgZHZic19zbnJfdGFiW10gPSB7IC8qIDIwIHggVGFibGUgKHJvdW5kZWQgdXApICovCisJCTB4MDAwMCwgMHgxYjEzLCAweDJhZWEsIDB4MzYyNywgMHgzZWRlLCAweDQ1ZmUsIDB4NGMwMywKKwkJMHg1MTNhLCAweDU1ZDQsIDB4NTlmMiwgMHg1ZGFiLCAweDYxMTEsIDB4NjQzMSwgMHg2NzE3LAorCQkweDY5YzksIDB4NmM0ZSwgMHg2ZWFjLCAweDcwZTgsIDB4NzMwNCwgMHg3NTA1CisJfTsKKwlzdGF0aWMgY29uc3QgdTE2IGR2YnMyX3Nucl90YWJbXSA9IHsgLyogODAgeCBUYWJsZSAocm91bmRlZCB1cCkgKi8KKwkJMHgwMDAwLCAweDBiYzIsIDB4MTJhMywgMHgxNzg1LCAweDFiNGUsIDB4MWU2NSwgMHgyMTAzLAorCQkweDIzNDcsIDB4MjU0NiwgMHgyNzEwLCAweDI4YWUsIDB4MmEyOCwgMHgyYjgzLCAweDJjYzUsCisJCTB4MmRmMSwgMHgyZjA5LCAweDMwMTAsIDB4MzEwOSwgMHgzMWY0LCAweDMyZDIsIDB4MzNhNiwKKwkJMHgzNDcwLCAweDM1MzEsIDB4MzVlYSwgMHgzNjliLCAweDM3NDYsIDB4MzdlYSwgMHgzODg4LAorCQkweDM5MjAsIDB4MzliMywgMHgzYTQyLCAweDNhY2MsIDB4M2I1MSwgMHgzYmQzLCAweDNjNTEsCisJCTB4M2NjYiwgMHgzZDQyLCAweDNkYjYsIDB4M2UyNywgMHgzZTk1LCAweDNmMDAsIDB4M2Y2OCwKKwkJMHgzZmNmLCAweDQwMzMsIDB4NDA5NCwgMHg0MGY0LCAweDQxNTEsIDB4NDFhYywgMHg0MjA2LAorCQkweDQyNWUsIDB4NDJiNCwgMHg0MzA4LCAweDQzNWIsIDB4NDNhYywgMHg0M2ZjLCAweDQ0NGEsCisJCTB4NDQ5NywgMHg0NGUyLCAweDQ1MmQsIDB4NDU3NiwgMHg0NWJkLCAweDQ2MDQsIDB4NDY0OSwKKwkJMHg0NjhlLCAweDQ2ZDEsIDB4NDcxMywgMHg0NzU1LCAweDQ3OTUsIDB4NDdkNCwgMHg0ODEzLAorCQkweDQ4NTEsIDB4NDg4ZCwgMHg0OGM5LCAweDQ5MDQsIDB4NDkzZiwgMHg0OTc4LCAweDQ5YjEsCisJCTB4NDllOSwgMHg0YTIwLCAweDRhNTcKKwl9OworCisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCisJc3dpdGNoIChjLT5kZWxpdmVyeV9zeXN0ZW0pIHsKKwljYXNlIFNZU19EVkJTOgorCQlzbnJfcmVhZGluZyA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGZmKTsKKwkJc25yX3JlYWRpbmcgLz0gODsKKwkJaWYgKHNucl9yZWFkaW5nID09IDApCisJCQkqc25yID0gMHgwMDAwOworCQllbHNlIHsKKwkJCWlmIChzbnJfcmVhZGluZyA+IDIwKQorCQkJCXNucl9yZWFkaW5nID0gMjA7CisJCQlzbnJfdmFsdWUgPSBkdmJzX3Nucl90YWJbc25yX3JlYWRpbmcgLSAxXSAqIDEwIC8gMjMwMjY7CisJCQkvKiBjb29rIHRoZSB2YWx1ZSB0byBiZSBzdWl0YWJsZSBmb3Igc3phcC1zMgorCQkJaHVtYW4gcmVhZGFibGUgb3V0cHV0ICovCisJCQkqc25yID0gc25yX3ZhbHVlICogOCAqIDY1NTsKKwkJfQorCQlkcHJpbnRrKCIlczogcmF3IC8gY29va2VkID0gMHglMDJ4IC8gMHglMDR4XG4iLCBfX2Z1bmNfXywKKwkJCQlzbnJfcmVhZGluZywgKnNucik7CisJCWJyZWFrOworCWNhc2UgU1lTX0RWQlMyOgorCQlkdmJzMl9ub2lzZV9yZWFkaW5nID0gKGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweDhjKSAmIDB4M2YpICsKKwkJCQkoZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4OGQpIDw8IDQpOworCQlkdmJzMl9zaWduYWxfcmVhZGluZyA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweDhlKTsKKwkJdG1wID0gZHZiczJfc2lnbmFsX3JlYWRpbmcgKiBkdmJzMl9zaWduYWxfcmVhZGluZyA+PiAxOworCQlpZiAoZHZiczJfc2lnbmFsX3JlYWRpbmcgPT0gMCkgeworCQkJKnNuciA9IDB4MDAwMDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChkdmJzMl9ub2lzZV9yZWFkaW5nID09IDApIHsKKwkJCXNucl92YWx1ZSA9IDB4MDAxMzsKKwkJCS8qIGNvb2sgdGhlIHZhbHVlIHRvIGJlIHN1aXRhYmxlIGZvciBzemFwLXMyCisJCQlodW1hbiByZWFkYWJsZSBvdXRwdXQgKi8KKwkJCSpzbnIgPSAweGZmZmY7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAodG1wID4gZHZiczJfbm9pc2VfcmVhZGluZykgeworCQkJc25yX3JlYWRpbmcgPSB0bXAgLyBkdmJzMl9ub2lzZV9yZWFkaW5nOworCQkJaWYgKHNucl9yZWFkaW5nID4gODApCisJCQkJc25yX3JlYWRpbmcgPSA4MDsKKwkJCXNucl92YWx1ZSA9IGR2YnMyX3Nucl90YWJbc25yX3JlYWRpbmcgLSAxXSAvIDEwMDA7CisJCQkvKiBjb29rIHRoZSB2YWx1ZSB0byBiZSBzdWl0YWJsZSBmb3Igc3phcC1zMgorCQkJaHVtYW4gcmVhZGFibGUgb3V0cHV0ICovCisJCQkqc25yID0gc25yX3ZhbHVlICogNSAqIDY1NTsKKwkJfSBlbHNlIHsKKwkJCXNucl9yZWFkaW5nID0gZHZiczJfbm9pc2VfcmVhZGluZyAvIHRtcDsKKwkJCWlmIChzbnJfcmVhZGluZyA+IDgwKQorCQkJCXNucl9yZWFkaW5nID0gODA7CisJCQkqc25yID0gLShkdmJzMl9zbnJfdGFiW3Nucl9yZWFkaW5nXSAvIDEwMDApOworCQl9CisJCWRwcmludGsoIiVzOiByYXcgLyBjb29rZWQgPSAweCUwMnggLyAweCUwNHhcbiIsIF9fZnVuY19fLAorCQkJCXNucl9yZWFkaW5nLCAqc25yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgRFMzMDAwIHVuY29ycmVjdGVkIGJsb2NrcyAqLworc3RhdGljIGludCBkczMwMDBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCXU4IGRhdGE7CisJdTE2IF91Y2Jsb2NrczsKKworCWRwcmludGsoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAoYy0+ZGVsaXZlcnlfc3lzdGVtKSB7CisJY2FzZSBTWVNfRFZCUzoKKwkJKnVjYmxvY2tzID0gKGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGY1KSA8PCA4KSB8CisJCQkJZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZjQpOworCQlkYXRhID0gZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZjgpOworCQkvKiBjbGVhciBwYWNrZXQgY291bnRlcnMgKi8KKwkJZGF0YSAmPSB+MHgyMDsKKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGY4LCBkYXRhKTsKKwkJLyogZW5hYmxlIHBhY2tldCBjb3VudGVycyAqLworCQlkYXRhIHw9IDB4MjA7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhmOCwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU1lTX0RWQlMyOgorCQlfdWNibG9ja3MgPSAoZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZTIpIDw8IDgpIHwKKwkJCQlkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhlMSk7CisJCWlmIChfdWNibG9ja3MgPiBzdGF0ZS0+cHJldlVDQlMyKQorCQkJKnVjYmxvY2tzID0gX3VjYmxvY2tzIC0gc3RhdGUtPnByZXZVQ0JTMjsKKwkJZWxzZQorCQkJKnVjYmxvY2tzID0gc3RhdGUtPnByZXZVQ0JTMiAtIF91Y2Jsb2NrczsKKwkJc3RhdGUtPnByZXZVQ0JTMiA9IF91Y2Jsb2NrczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE92ZXJ3cml0ZSB0aGUgY3VycmVudCB0dW5pbmcgcGFyYW1zLCB3ZSBhcmUgYWJvdXQgdG8gdHVuZSAqLworc3RhdGljIHZvaWQgZHMzMDAwX2Nsb25lX3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCW1lbWNweSgmc3RhdGUtPmRjdXIsICZzdGF0ZS0+ZG54dCwgc2l6ZW9mKHN0YXRlLT5kY3VyKSk7Cit9CisKK3N0YXRpYyBpbnQgZHMzMDAwX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGRhdGE7CisKKwlkcHJpbnRrKCIlcyglZClcbiIsIF9fZnVuY19fLCB0b25lKTsKKwlpZiAoKHRvbmUgIT0gU0VDX1RPTkVfT04pICYmICh0b25lICE9IFNFQ19UT05FX09GRikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCwgdG9uZT0lZFxuIiwgX19mdW5jX18sIHRvbmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0gZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4YTIpOworCWRhdGEgJj0gfjB4YzA7CisJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGEyLCBkYXRhKTsKKworCXN3aXRjaCAodG9uZSkgeworCWNhc2UgU0VDX1RPTkVfT046CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHRvbmUgb25cbiIsIF9fZnVuY19fKTsKKwkJZGF0YSA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGExKTsKKwkJZGF0YSAmPSB+MHg0MzsKKwkJZGF0YSB8PSAweDA0OworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTEsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJZHByaW50aygiJXM6IHNldHRpbmcgdG9uZSBvZmZcbiIsIF9fZnVuY19fKTsKKwkJZGF0YSA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGEyKTsKKwkJZGF0YSB8PSAweDgwOworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTIsIGRhdGEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczMwMDBfc2VuZF9kaXNlcWNfbXNnKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCXN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmQpCit7CisJc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgaTsKKwl1OCBkYXRhOworCisJLyogRHVtcCBEaVNFcUMgbWVzc2FnZSAqLworCWRwcmludGsoIiVzKCIsIF9fZnVuY19fKTsKKwlmb3IgKGkgPSAwIDsgaSA8IGQtPm1zZ19sZW47KSB7CisJCWRwcmludGsoIjB4JTAyeCIsIGQtPm1zZ1tpXSk7CisJCWlmICgrK2kgPCBkLT5tc2dfbGVuKQorCQkJZHByaW50aygiLCAiKTsKKwl9CisKKwkvKiBlbmFibGUgRGlTRXFDIG1lc3NhZ2Ugc2VuZCBwaW4gKi8KKwlkYXRhID0gZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4YTIpOworCWRhdGEgJj0gfjB4YzA7CisJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGEyLCBkYXRhKTsKKworCS8qIERpU0VxQyBtZXNzYWdlICovCisJZm9yIChpID0gMDsgaSA8IGQtPm1zZ19sZW47IGkrKykKKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGEzICsgaSwgZC0+bXNnW2ldKTsKKworCWRhdGEgPSBkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhhMSk7CisJLyogY2xlYXIgRGlTRXFDIG1lc3NhZ2UgbGVuZ3RoIGFuZCBzdGF0dXMsCisJZW5hYmxlIERpU0VxQyBtZXNzYWdlIHNlbmQgKi8KKwlkYXRhICY9IH4weGY4OworCS8qIHNldCBEaVNFcUMgbW9kZSwgbW9kdWxhdGlvbiBhY3RpdmUgZHVyaW5nIDMzIHB1bHNlcywKKwlzZXQgRGlTRXFDIG1lc3NhZ2UgbGVuZ3RoICovCisJZGF0YSB8PSAoKGQtPm1zZ19sZW4gLSAxKSA8PCAzKSB8IDB4MDc7CisJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGExLCBkYXRhKTsKKworCS8qIHdhaXQgdXAgdG8gMTUwbXMgZm9yIERpU0VxQyB0cmFuc21pc3Npb24gdG8gY29tcGxldGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworCQlkYXRhID0gZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4YTEpOworCQlpZiAoKGRhdGEgJiAweDQwKSA9PSAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMCk7CisJfQorCisJLyogRGlTRXFDIHRpbWVvdXQgYWZ0ZXIgMTUwbXMgKi8KKwlpZiAoaSA9PSAxNSkgeworCQlkYXRhID0gZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4YTEpOworCQlkYXRhICY9IH4weDgwOworCQlkYXRhIHw9IDB4NDA7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhhMSwgZGF0YSk7CisKKwkJZGF0YSA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGEyKTsKKwkJZGF0YSAmPSB+MHhjMDsKKwkJZGF0YSB8PSAweDgwOworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTIsIGRhdGEpOworCisJCXJldHVybiAxOworCX0KKworCWRhdGEgPSBkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhhMik7CisJZGF0YSAmPSB+MHhjMDsKKwlkYXRhIHw9IDB4ODA7CisJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGEyLCBkYXRhKTsKKworCXJldHVybiAwOworfQorCisvKiBTZW5kIERpU0VxQyBidXJzdCAqLworc3RhdGljIGludCBkczMwMDBfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCWZlX3NlY19taW5pX2NtZF90IGJ1cnN0KQoreworCXN0cnVjdCBkczMwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IGk7CisJdTggZGF0YTsKKworCWRwcmludGsoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWRhdGEgPSBkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhhMik7CisJZGF0YSAmPSB+MHhjMDsKKwlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTIsIGRhdGEpOworCisJLyogRGlTRXFDIGJ1cnN0ICovCisJaWYgKGJ1cnN0ID09IFNFQ19NSU5JX0EpCisJCS8qIFVubW9kdWxhdGVkIHRvbmUgYnVyc3QgKi8KKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGExLCAweDAyKTsKKwllbHNlIGlmIChidXJzdCA9PSBTRUNfTUlOSV9CKQorCQkvKiBNb2R1bGF0ZWQgdG9uZSBidXJzdCAqLworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTEsIDB4MDEpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2xlZXAoMTMpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJZGF0YSA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGExKTsKKwkJaWYgKChkYXRhICYgMHg0MCkgPT0gMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfQorCisJaWYgKGkgPT0gNSkgeworCQlkYXRhID0gZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4YTEpOworCQlkYXRhICY9IH4weDgwOworCQlkYXRhIHw9IDB4NDA7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhhMSwgZGF0YSk7CisKKwkJZGF0YSA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweGEyKTsKKwkJZGF0YSAmPSB+MHhjMDsKKwkJZGF0YSB8PSAweDgwOworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YTIsIGRhdGEpOworCisJCXJldHVybiAxOworCX0KKworCWRhdGEgPSBkczMwMDBfcmVhZHJlZyhzdGF0ZSwgMHhhMik7CisJZGF0YSAmPSB+MHhjMDsKKwlkYXRhIHw9IDB4ODA7CisJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGEyLCBkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkczMwMDBfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHMzMDAwX29wczsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqZHMzMDAwX2F0dGFjaChjb25zdCBzdHJ1Y3QgZHMzMDAwX2NvbmZpZyAqY29uZmlnLAorCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgZHMzMDAwX3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJaW50IHJldDsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzMzAwMF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGttYWxsb2NcbiIpOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgZHMzMDAwX3N0YXRlKSk7CisKKwlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCXN0YXRlLT5pMmMgPSBpMmM7CisJc3RhdGUtPnByZXZVQ0JTMiA9IDA7CisKKwkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgcHJlc2VudCAqLworCXJldCA9IGRzMzAwMF9yZWFkcmVnKHN0YXRlLCAweDAwKSAmIDB4ZmU7CisJaWYgKHJldCAhPSAweGUwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBwcm9iZSwgcHJvYmFibHkgbm90IGEgRFMzMDAwXG4iKTsKKwkJZ290byBlcnJvcjM7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiRFMzMDAwIGNoaXAgdmVyc2lvbjogJWQuJWQgYXR0YWNoZWQuXG4iLAorCQkJZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4MDIpLAorCQkJZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4MDEpKTsKKworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmRzMzAwMF9vcHMsCisJCQlzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworCitlcnJvcjM6CisJa2ZyZWUoc3RhdGUpOworZXJyb3IyOgorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkczMwMDBfYXR0YWNoKTsKKworc3RhdGljIGludCBkczMwMDBfc2V0X3Byb3BlcnR5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCkKK3sKKwlkcHJpbnRrKCIlcyguLilcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczMwMDBfZ2V0X3Byb3BlcnR5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCkKK3sKKwlkcHJpbnRrKCIlcyguLilcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczMwMDBfdHVuZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGRzMzAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKworCWludCByZXQgPSAwLCByZXR1bmUsIGk7CisJdTggc3RhdHVzLCBtbHBmLCBtbHBmX25ldywgbWxwZl9tYXgsIG1scGZfbWluLCBubHBmOworCXUxNiB2YWx1ZSwgbmRpdjsKKwl1MzIgZjNkYjsKKworCWRwcmludGsoIiVzKCkgIiwgX19mdW5jX18pOworCisJLyogTG9hZCB0aGUgZmlybXdhcmUgaWYgcmVxdWlyZWQgKi8KKwlyZXQgPSBkczMwMDBfZmlybXdhcmVfb25kZW1hbmQoZmUpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgaW5pdGlhbGlzZSB0aGUgZmlybXdhcmVcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzdGF0ZS0+ZG54dC5kZWxpdmVyeSA9IGMtPm1vZHVsYXRpb247CisJc3RhdGUtPmRueHQuZnJlcXVlbmN5ID0gYy0+ZnJlcXVlbmN5OworCXN0YXRlLT5kbnh0LnJvbGxvZmYgPSAyOyAvKiBmaXhtZSAqLworCXN0YXRlLT5kbnh0LmZlYyA9IGMtPmZlY19pbm5lcjsKKworCXJldCA9IGRzMzAwMF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOworCWlmIChyZXQgIT0gIDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkczMwMDBfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIGMtPnN5bWJvbF9yYXRlKTsKKwlpZiAocmV0ICE9ICAwKQorCQlyZXR1cm4gcmV0OworCisJLyogZGlzY2FyZCB0aGUgJ2N1cnJlbnQnIHR1bmluZyBwYXJhbWV0ZXJzIGFuZCBwcmVwYXJlIHRvIHR1bmUgKi8KKwlkczMwMDBfY2xvbmVfcGFyYW1zKGZlKTsKKworCXJldHVuZSA9IDE7CS8qIHRyeSAxIHRpbWVzICovCisJZHByaW50aygiJXM6ICAgcmV0dW5lID0gJWRcbiIsIF9fZnVuY19fLCByZXR1bmUpOworCWRwcmludGsoIiVzOiAgIGZyZXF1ZW5jeSAgID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0ZS0+ZGN1ci5mcmVxdWVuY3kpOworCWRwcmludGsoIiVzOiAgIHN5bWJvbF9yYXRlID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0ZS0+ZGN1ci5zeW1ib2xfcmF0ZSk7CisJZHByaW50aygiJXM6ICAgRkVDCSA9ICVkIFxuIiwgX19mdW5jX18sCisJCXN0YXRlLT5kY3VyLmZlYyk7CisJZHByaW50aygiJXM6ICAgSW52ZXJzaW9uICAgPSAlZFxuIiwgX19mdW5jX18sIHN0YXRlLT5kY3VyLmludmVyc2lvbik7CisKKwlkbyB7CisJCS8qIFJlc2V0IHN0YXR1cyByZWdpc3RlciAqLworCQlzdGF0dXMgPSAwOworCQkvKiBUdW5lICovCisJCS8qIFRTMjAyMCBpbml0ICovCisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg0MiwgMHg3Myk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgMHgwMSk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg2MiwgMHhmNSk7CisJCS8qIHVua25vd24gKi8KKwkJZHMzMDAwX3R1bmVyX3dyaXRlcmVnKHN0YXRlLCAweDA3LCAweDAyKTsKKwkJZHMzMDAwX3R1bmVyX3dyaXRlcmVnKHN0YXRlLCAweDEwLCAweDAwKTsKKwkJZHMzMDAwX3R1bmVyX3dyaXRlcmVnKHN0YXRlLCAweDYwLCAweDc5KTsKKwkJZHMzMDAwX3R1bmVyX3dyaXRlcmVnKHN0YXRlLCAweDA4LCAweDAxKTsKKwkJZHMzMDAwX3R1bmVyX3dyaXRlcmVnKHN0YXRlLCAweDAwLCAweDAxKTsKKwkJLyogY2FsY3VsYXRlIGFuZCBzZXQgZnJlcSBkaXZpZGVyICovCisJCWlmIChzdGF0ZS0+ZGN1ci5mcmVxdWVuY3kgPCAxMTQ2MDAwKSB7CisJCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4MTAsIDB4MTEpOworCQkJbmRpdiA9ICgoc3RhdGUtPmRjdXIuZnJlcXVlbmN5ICogKDYgKyA4KSAqIDQpICsKKwkJCQkJKERTMzAwMF9YVEFMX0ZSRVEgLyAyKSkgLworCQkJCQlEUzMwMDBfWFRBTF9GUkVRIC0gMTAyNDsKKwkJfSBlbHNlIHsKKwkJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHgxMCwgMHgwMSk7CisJCQluZGl2ID0gKChzdGF0ZS0+ZGN1ci5mcmVxdWVuY3kgKiAoNiArIDgpICogMikgKworCQkJCQkoRFMzMDAwX1hUQUxfRlJFUSAvIDIpKSAvCisJCQkJCURTMzAwMF9YVEFMX0ZSRVEgLSAxMDI0OworCQl9CisKKwkJZHMzMDAwX3R1bmVyX3dyaXRlcmVnKHN0YXRlLCAweDAxLCAobmRpdiAmIDB4MGYwMCkgPj4gOCk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHgwMiwgbmRpdiAmIDB4MDBmZik7CisKKwkJLyogc2V0IHBsbCAqLworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4MDYpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTEsIDB4MGYpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTEsIDB4MWYpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTAsIDB4MTApOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTAsIDB4MDApOworCQltc2xlZXAoNSk7CisKKwkJLyogdW5rbm93biAqLworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTEsIDB4MTcpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTEsIDB4MWYpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTAsIDB4MDgpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTAsIDB4MDApOworCQltc2xlZXAoNSk7CisKKwkJdmFsdWUgPSBkczMwMDBfdHVuZXJfcmVhZHJlZyhzdGF0ZSwgMHgzZCk7CisJCXZhbHVlICY9IDB4MGY7CisJCWlmICgodmFsdWUgPiA0KSAmJiAodmFsdWUgPCAxNSkpIHsKKwkJCXZhbHVlIC09IDM7CisJCQlpZiAodmFsdWUgPCA0KQorCQkJCXZhbHVlID0gNDsKKwkJCXZhbHVlID0gKCh2YWx1ZSA8PCAzKSB8IDB4MDEpICYgMHg3OTsKKwkJfQorCisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg2MCwgdmFsdWUpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTEsIDB4MTcpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTEsIDB4MWYpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTAsIDB4MDgpOworCQlkczMwMDBfdHVuZXJfd3JpdGVyZWcoc3RhdGUsIDB4NTAsIDB4MDApOworCisJCS8qIHNldCBsb3ctcGFzcyBmaWx0ZXIgcGVyaW9kICovCisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHgwNCwgMHgyZSk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MSwgMHgxYik7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MSwgMHgxZik7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MCwgMHgwNCk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MCwgMHgwMCk7CisJCW1zbGVlcCg1KTsKKworCQlmM2RiID0gKChzdGF0ZS0+ZGN1ci5zeW1ib2xfcmF0ZSAvIDEwMDApIDw8IDIpIC8gNSArIDIwMDA7CisJCWlmICgoc3RhdGUtPmRjdXIuc3ltYm9sX3JhdGUgLyAxMDAwKSA8IDUwMDApCisJCQlmM2RiICs9IDMwMDA7CisJCWlmIChmM2RiIDwgNzAwMCkKKwkJCWYzZGIgPSA3MDAwOworCQlpZiAoZjNkYiA+IDQwMDAwKQorCQkJZjNkYiA9IDQwMDAwOworCisJCS8qIHNldCBsb3ctcGFzcyBmaWx0ZXIgYmFzZWJhbmQgKi8KKwkJdmFsdWUgPSBkczMwMDBfdHVuZXJfcmVhZHJlZyhzdGF0ZSwgMHgyNik7CisJCW1scGYgPSAweDJlICogMjA3IC8gKCh2YWx1ZSA8PCAxKSArIDE1MSk7CisJCW1scGZfbWF4ID0gbWxwZiAqIDEzNSAvIDEwMDsKKwkJbWxwZl9taW4gPSBtbHBmICogNzggLyAxMDA7CisJCWlmIChtbHBmX21heCA+IDYzKQorCQkJbWxwZl9tYXggPSA2MzsKKworCQkvKiByb3VuZGVkIHRvIHRoZSBjbG9zZXN0IGludGVnZXIgKi8KKwkJbmxwZiA9ICgobWxwZiAqIGYzZGIgKiAxMDAwKSArICgyNzY2ICogRFMzMDAwX1hUQUxfRlJFUSAvIDIpKQorCQkJCS8gKDI3NjYgKiBEUzMwMDBfWFRBTF9GUkVRKTsKKwkJaWYgKG5scGYgPiAyMykKKwkJCW5scGYgPSAyMzsKKwkJaWYgKG5scGYgPCAxKQorCQkJbmxwZiA9IDE7CisKKwkJLyogcm91bmRlZCB0byB0aGUgY2xvc2VzdCBpbnRlZ2VyICovCisJCW1scGZfbmV3ID0gKChEUzMwMDBfWFRBTF9GUkVRICogbmxwZiAqIDI3NjYpICsKKwkJCQkoMTAwMCAqIGYzZGIgLyAyKSkgLyAoMTAwMCAqIGYzZGIpOworCisJCWlmIChtbHBmX25ldyA8IG1scGZfbWluKSB7CisJCQlubHBmKys7CisJCQltbHBmX25ldyA9ICgoRFMzMDAwX1hUQUxfRlJFUSAqIG5scGYgKiAyNzY2KSArCisJCQkJCSgxMDAwICogZjNkYiAvIDIpKSAvICgxMDAwICogZjNkYik7CisJCX0KKworCQlpZiAobWxwZl9uZXcgPiBtbHBmX21heCkKKwkJCW1scGZfbmV3ID0gbWxwZl9tYXg7CisKKwkJZHMzMDAwX3R1bmVyX3dyaXRlcmVnKHN0YXRlLCAweDA0LCBtbHBmX25ldyk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHgwNiwgbmxwZik7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MSwgMHgxYik7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MSwgMHgxZik7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MCwgMHgwNCk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MCwgMHgwMCk7CisJCW1zbGVlcCg1KTsKKworCQkvKiB1bmtub3duICovCisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MSwgMHgxZSk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MSwgMHgxZik7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MCwgMHgwMSk7CisJCWRzMzAwMF90dW5lcl93cml0ZXJlZyhzdGF0ZSwgMHg1MCwgMHgwMCk7CisJCW1zbGVlcCg2MCk7CisKKwkJLyogZHMzMDAwIGdsb2JhbCByZXNldCAqLworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4MDcsIDB4ODApOworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4MDcsIDB4MDApOworCQkvKiBkczMwMDAgYnVpbGQtaW4gdUMgcmVzZXQgKi8KKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGIyLCAweDAxKTsKKwkJLyogZHMzMDAwIHNvZnR3YXJlIHJlc2V0ICovCisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgwMSk7CisKKwkJc3dpdGNoIChjLT5kZWxpdmVyeV9zeXN0ZW0pIHsKKwkJY2FzZSBTWVNfRFZCUzoKKwkJCS8qIGluaXRpYWxpc2UgdGhlIGRlbW9kIGluIERWQi1TIG1vZGUgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZHMzMDAwX2R2YnNfaW5pdF90YWIpOyBpICs9IDIpCisJCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLAorCQkJCQlkczMwMDBfZHZic19pbml0X3RhYltpXSwKKwkJCQkJZHMzMDAwX2R2YnNfaW5pdF90YWJbaSArIDFdKTsKKwkJCXZhbHVlID0gZHMzMDAwX3JlYWRyZWcoc3RhdGUsIDB4ZmUpOworCQkJdmFsdWUgJj0gMHhjMDsKKwkJCXZhbHVlIHw9IDB4MWI7CisJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4ZmUsIHZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19EVkJTMjoKKwkJCS8qIGluaXRpYWxpc2UgdGhlIGRlbW9kIGluIERWQi1TMiBtb2RlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRzMzAwMF9kdmJzMl9pbml0X3RhYik7IGkgKz0gMikKKwkJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsCisJCQkJCWRzMzAwMF9kdmJzMl9pbml0X3RhYltpXSwKKwkJCQkJZHMzMDAwX2R2YnMyX2luaXRfdGFiW2kgKyAxXSk7CisJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4ZmUsIDB4NTQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIGVuYWJsZSAyN01IeiBjbG9jayBvdXRwdXQgKi8KKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweDI5LCAweDgwKTsKKwkJLyogZW5hYmxlIGFjIGNvdXBsaW5nICovCisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHgyNSwgMHg4YSk7CisKKwkJLyogZW5oYW5jZSBzeW1ib2wgcmF0ZSBwZXJmb3JtYW5jZSAqLworCQlpZiAoKHN0YXRlLT5kY3VyLnN5bWJvbF9yYXRlIC8gMTAwMCkgPD0gNTAwMCkgeworCQkJdmFsdWUgPSAyOTc3NyAvIChzdGF0ZS0+ZGN1ci5zeW1ib2xfcmF0ZSAvIDEwMDApICsgMTsKKwkJCWlmICh2YWx1ZSAlIDIgIT0gMCkKKwkJCQl2YWx1ZSsrOworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGMzLCAweDBkKTsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhjOCwgdmFsdWUpOworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGM0LCAweDEwKTsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhjNywgMHgwZSk7CisJCX0gZWxzZSBpZiAoKHN0YXRlLT5kY3VyLnN5bWJvbF9yYXRlIC8gMTAwMCkgPD0gMTAwMDApIHsKKwkJCXZhbHVlID0gOTIxNjYgLyAoc3RhdGUtPmRjdXIuc3ltYm9sX3JhdGUgLyAxMDAwKSArIDE7CisJCQlpZiAodmFsdWUgJSAyICE9IDApCisJCQkJdmFsdWUrKzsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhjMywgMHgwNyk7CisJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YzgsIHZhbHVlKTsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhjNCwgMHgwOSk7CisJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YzcsIDB4MTIpOworCQl9IGVsc2UgaWYgKChzdGF0ZS0+ZGN1ci5zeW1ib2xfcmF0ZSAvIDEwMDApIDw9IDIwMDAwKSB7CisJCQl2YWx1ZSA9IDY0NTE2IC8gKHN0YXRlLT5kY3VyLnN5bWJvbF9yYXRlIC8gMTAwMCkgKyAxOworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGMzLCB2YWx1ZSk7CisJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YzgsIDB4MGUpOworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGM0LCAweDA3KTsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhjNywgMHgxOCk7CisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IDEyOTAzMiAvIChzdGF0ZS0+ZGN1ci5zeW1ib2xfcmF0ZSAvIDEwMDApICsgMTsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhjMywgdmFsdWUpOworCQkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweGM4LCAweDBhKTsKKwkJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhjNCwgMHgwNSk7CisJCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YzcsIDB4MjQpOworCQl9CisKKwkJLyogbm9ybWFsaXplZCBzeW1ib2wgcmF0ZSByb3VuZGVkIHRvIHRoZSBjbG9zZXN0IGludGVnZXIgKi8KKwkJdmFsdWUgPSAoKChzdGF0ZS0+ZGN1ci5zeW1ib2xfcmF0ZSAvIDEwMDApIDw8IDE2KSArCisJCQkJKERTMzAwMF9TQU1QTEVfUkFURSAvIDIpKSAvIERTMzAwMF9TQU1QTEVfUkFURTsKKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweDYxLCB2YWx1ZSAmIDB4MDBmZik7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHg2MiwgKHZhbHVlICYgMHhmZjAwKSA+PiA4KTsKKworCQkvKiBjby1jaGFubmVsIGludGVyZmVyZW5jZSBjYW5jZWxsYXRpb24gZGlzYWJsZWQgKi8KKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweDU2LCAweDAwKTsKKworCQkvKiBlcXVhbGl6ZXIgZGlzYWJsZWQgKi8KKwkJZHMzMDAwX3dyaXRlcmVnKHN0YXRlLCAweDc2LCAweDAwKTsKKworCQkvKmRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHgwOCwgMHgwMyk7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhmZCwgMHgyMik7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHgwOCwgMHgwNyk7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHhmZCwgMHg0Mik7CisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHgwOCwgMHgwNyk7Ki8KKworCQkvKiBkczMwMDAgb3V0IG9mIHNvZnR3YXJlIHJlc2V0ICovCisJCWRzMzAwMF93cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgwMCk7CisJCS8qIHN0YXJ0IGRzMzAwMCBidWlsZC1pbiB1QyAqLworCQlkczMwMDBfd3JpdGVyZWcoc3RhdGUsIDB4YjIsIDB4MDApOworCisJCS8qIFRPRE86IGNhbGN1bGF0ZSBhbmQgc2V0IGNhcnJpZXIgb2Zmc2V0ICovCisKKwkJLyogd2FpdCBiZWZvcmUgcmV0cnlpbmcgKi8KKwkJZm9yIChpID0gMDsgaSA8IDMwIDsgaSsrKSB7CisJCQlpZiAoZHMzMDAwX2lzX3R1bmVkKGZlKSkgeworCQkJCWRwcmludGsoIiVzOiBUdW5lZFxuIiwgX19mdW5jX18pOworCQkJCWRzMzAwMF9kdW1wX3JlZ2lzdGVycyhmZSk7CisJCQkJZ290byB0dW5lZDsKKwkJCX0KKwkJCW1zbGVlcCgxKTsKKwkJfQorCisJCWRwcmludGsoIiVzOiBOb3QgdHVuZWRcbiIsIF9fZnVuY19fKTsKKwkJZHMzMDAwX2R1bXBfcmVnaXN0ZXJzKGZlKTsKKworCX0gd2hpbGUgKC0tcmV0dW5lKTsKKwordHVuZWQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gZHZiZmVfYWxnbyBkczMwMDBfZ2V0X2FsZ28oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCXJldHVybiBEVkJGRV9BTEdPX1NXOworfQorCisvKgorICogSW5pdGlhbGlzZSBvciB3YWtlIHVwIGRldmljZQorICoKKyAqIFBvd2VyIGNvbmZpZyB3aWxsIHJlc2V0IGFuZCBsb2FkIGluaXRpYWwgZmlybXdhcmUgaWYgcmVxdWlyZWQKKyAqLworc3RhdGljIGludCBkczMwMDBfaW5pdGZlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWRwcmludGsoIiVzKClcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLyogUHV0IGRldmljZSB0byBzbGVlcCAqLworc3RhdGljIGludCBkczMwMDBfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHMzMDAwX29wcyA9IHsKKworCS5pbmZvID0geworCQkubmFtZSA9ICJNb250YWdlIFRlY2hub2xvZ3kgRFMzMDAwL1RTMjAyMCIsCisJCS50eXBlID0gRkVfUVBTSywKKwkJLmZyZXF1ZW5jeV9taW4gPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gMjE1MDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDEwMTEsIC8qIGtIeiBmb3IgUVBTSyBmcm9udGVuZHMgKi8KKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UgPSA1MDAwLAorCQkuc3ltYm9sX3JhdGVfbWluID0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCA9IDQ1MDAwMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9JTlZFUlNJT05fQVVUTyB8CisJCQlGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQkJRkVfQ0FOX0ZFQ180XzUgfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfNl83IHwKKwkJCUZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ19BVVRPIHwKKwkJCUZFX0NBTl8yR19NT0RVTEFUSU9OIHwKKwkJCUZFX0NBTl9RUFNLIHwgRkVfQ0FOX1JFQ09WRVIKKwl9LAorCisJLnJlbGVhc2UgPSBkczMwMDBfcmVsZWFzZSwKKworCS5pbml0ID0gZHMzMDAwX2luaXRmZSwKKwkuc2xlZXAgPSBkczMwMDBfc2xlZXAsCisJLnJlYWRfc3RhdHVzID0gZHMzMDAwX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IGRzMzAwMF9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkczMwMDBfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gZHMzMDAwX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gZHMzMDAwX3JlYWRfdWNibG9ja3MsCisJLnNldF90b25lID0gZHMzMDAwX3NldF90b25lLAorCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZHMzMDAwX3NlbmRfZGlzZXFjX21zZywKKwkuZGlzZXFjX3NlbmRfYnVyc3QgPSBkczMwMDBfZGlzZXFjX3NlbmRfYnVyc3QsCisJLmdldF9mcm9udGVuZF9hbGdvID0gZHMzMDAwX2dldF9hbGdvLAorCisJLnNldF9wcm9wZXJ0eSA9IGRzMzAwMF9zZXRfcHJvcGVydHksCisJLmdldF9wcm9wZXJ0eSA9IGRzMzAwMF9nZXRfcHJvcGVydHksCisJLnNldF9mcm9udGVuZCA9IGRzMzAwMF90dW5lLAorfTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkFjdGl2YXRlcyBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6MCkiKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEVkIgRnJvbnRlbmQgbW9kdWxlIGZvciBNb250YWdlIFRlY2hub2xvZ3kgIgorCQkJIkRTMzAwMC9UUzIwMjAgaGFyZHdhcmUiKTsKK01PRFVMRV9BVVRIT1IoIktvbnN0YW50aW4gRGltaXRyb3YiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kczMwMDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kczMwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Y2NzAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RzMzAwMC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgICAgTW9udGFnZSBUZWNobm9sb2d5IERTMzAwMC9UUzIwMjAgLSBEVkJTL1MyIFNhdGVsbGl0ZSBkZW1vZC90dW5lciBkcml2ZXIKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDkgS29uc3RhbnRpbiBEaW1pdHJvdiA8a29zaW8uZGltaXRyb3ZAZ21haWwuY29tPgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA5IFR1cmJvU2lnaHQuY29tCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgRFMzMDAwX0gKKyNkZWZpbmUgRFMzMDAwX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgZHMzMDAwX2NvbmZpZyB7CisJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KKwl1OCBkZW1vZF9hZGRyZXNzOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9EUzMwMDApIHx8IFwKKwkJCShkZWZpbmVkKENPTkZJR19EVkJfRFMzMDAwX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRzMzAwMF9hdHRhY2goY29uc3Qgc3RydWN0IGRzMzAwMF9jb25maWcgKmNvbmZpZywKKwkJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKmRzMzAwMF9hdHRhY2goY29uc3Qgc3RydWN0IGRzMzAwMF9jb25maWcgKmNvbmZpZywKKwkJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9EUzMwMDAgKi8KKyNlbmRpZiAvKiBEUzMwMDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2VjMTAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZWMxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE0ZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2VjMTAwLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBFM0MgRUMxMDAgZGVtb2R1bGF0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiZWMxMDBfcHJpdi5oIgorI2luY2x1ZGUgImVjMTAwLmgiCisKK2ludCBlYzEwMF9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZWMxMDBfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZnJvbnRlbmQgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CisKK3N0cnVjdCBlYzEwMF9zdGF0ZSB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKwlzdHJ1Y3QgZWMxMDBfY29uZmlnIGNvbmZpZzsKKworCXUxNiBiZXI7Cit9OworCisvKiB3cml0ZSBzaW5nbGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQgZWMxMDBfd3JpdGVfcmVnKHN0cnVjdCBlYzEwMF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTggdmFsKQoreworCXU4IGJ1ZlsyXSA9IHtyZWcsIHZhbH07CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciA9IHN0YXRlLT5jb25maWcuZGVtb2RfYWRkcmVzcywKKwkJLmZsYWdzID0gMCwKKwkJLmxlbiA9IDIsCisJCS5idWYgPSBidWZ9OworCisJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSAhPSAxKSB7CisJCXdhcm4oIkkyQyB3cml0ZSBmYWlsZWQgcmVnOiUwMngiLCByZWcpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgc2luZ2xlIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IGVjMTAwX3JlYWRfcmVnKHN0cnVjdCBlYzEwMF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCXsKKwkJCS5hZGRyID0gc3RhdGUtPmNvbmZpZy5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9ICZyZWcKKwkJfSwgeworCQkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLmRlbW9kX2FkZHJlc3MsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IHZhbAorCQl9CisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgbXNnLCAyKSAhPSAyKSB7CisJCXdhcm4oIkkyQyByZWFkIGZhaWxlZCByZWc6JTAyeCIsIHJlZyk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlYzEwMF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IGVjMTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisJdTggdG1wLCB0bXAyOworCisJZGViX2luZm8oIiVzOiBmcmVxOiVkIGJ3OiVkXG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5mcmVxdWVuY3ksCisJCXBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CisKKwkvKiBwcm9ncmFtIHR1bmVyICovCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpCisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHBhcmFtcyk7CisKKwlyZXQgPSBlYzEwMF93cml0ZV9yZWcoc3RhdGUsIDB4MDQsIDB4MDYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gZWMxMDBfd3JpdGVfcmVnKHN0YXRlLCAweDY3LCAweDU4KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGVjMTAwX3dyaXRlX3JlZyhzdGF0ZSwgMHgwNSwgMHgxOCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHJlZy9idyB8ICAgNiAgfCAgIDcgIHwgICA4CisJICAgLS0tLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLQorCSAgIEEgMHgxYiB8IDB4YTEgfCAweGU3IHwgMHgyYworCSAgIEEgMHgxYyB8IDB4NTUgfCAweDYzIHwgMHg3MgorCSAgIC0tLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0KKwkgICBCIDB4MWIgfCAweGI3IHwgMHgwMCB8IDB4NDkKKwkgICBCIDB4MWMgfCAweDU1IHwgMHg2NCB8IDB4NzIgKi8KKworCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCXRtcCA9IDB4Yjc7CisJCXRtcDIgPSAweDU1OworCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJdG1wID0gMHgwMDsKKwkJdG1wMiA9IDB4NjQ7CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCWRlZmF1bHQ6CisJCXRtcCA9IDB4NDk7CisJCXRtcDIgPSAweDcyOworCX0KKworCXJldCA9IGVjMTAwX3dyaXRlX3JlZyhzdGF0ZSwgMHgxYiwgdG1wKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGVjMTAwX3dyaXRlX3JlZyhzdGF0ZSwgMHgxYywgdG1wMik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGVjMTAwX3dyaXRlX3JlZyhzdGF0ZSwgMHgwYywgMHhiYik7IC8qIGlmIGZyZXEgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGVjMTAwX3dyaXRlX3JlZyhzdGF0ZSwgMHgwZCwgMHgzMSk7IC8qIGlmIGZyZXEgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gZWMxMDBfd3JpdGVfcmVnKHN0YXRlLCAweDA4LCAweDI0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gZWMxMDBfd3JpdGVfcmVnKHN0YXRlLCAweDAwLCAweDAwKTsgLyogZ28gKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGVjMTAwX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMCwgMHgyMCk7IC8qIGdvICovCisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkZWJfaW5mbygiJXM6IGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlYzEwMF9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKmZlc2V0dGluZ3MpCit7CisJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMzAwOworCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDA7CisJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVjMTAwX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zdGF0dXNfdCAqc3RhdHVzKQoreworCXN0cnVjdCBlYzEwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IHRtcDsKKwkqc3RhdHVzID0gMDsKKworCXJldCA9IGVjMTAwX3JlYWRfcmVnKHN0YXRlLCAweDQyLCAmdG1wKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJaWYgKHRtcCAmIDB4ODApIHsKKwkJLyogYml0NyBzZXQgLSBoYXZlIGxvY2sgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfVklURVJCSSB8CisJCQlGRV9IQVNfU1lOQyB8IEZFX0hBU19MT0NLOworCX0gZWxzZSB7CisJCXJldCA9IGVjMTAwX3JlYWRfcmVnKHN0YXRlLCAweDAxLCAmdG1wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKHRtcCAmIDB4MTApIHsKKwkJCS8qIGJpdDQgc2V0IC0gaGF2ZSBzaWduYWwgKi8KKwkJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKKwkJCWlmICghKHRtcCAmIDB4MDEpKSB7CisJCQkJLyogYml0MCBjbGVhciAtIGhhdmUgfnZhbGlkIHNpZ25hbCAqLworCQkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVIgfCAgRkVfSEFTX1ZJVEVSQkk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGViX2luZm8oIiVzOiBmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZWMxMDBfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCXN0cnVjdCBlYzEwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IHRtcCwgdG1wMjsKKwl1MTYgYmVyMjsKKworCSpiZXIgPSAwOworCisJcmV0ID0gZWMxMDBfcmVhZF9yZWcoc3RhdGUsIDB4NjUsICZ0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gZWMxMDBfcmVhZF9yZWcoc3RhdGUsIDB4NjYsICZ0bXAyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJYmVyMiA9ICh0bXAyIDw8IDgpIHwgdG1wOworCisJLyogaWYgY291bnRlciBvdmVyZmxvdyBvciBjbGVhciAqLworCWlmIChiZXIyIDwgc3RhdGUtPmJlcikKKwkJKmJlciA9IGJlcjI7CisJZWxzZQorCQkqYmVyID0gYmVyMiAtIHN0YXRlLT5iZXI7CisKKwlzdGF0ZS0+YmVyID0gYmVyMjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkZWJfaW5mbygiJXM6IGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlYzEwMF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgZWMxMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldDsKKwl1OCB0bXA7CisKKwlyZXQgPSBlYzEwMF9yZWFkX3JlZyhzdGF0ZSwgMHgyNCwgJnRtcCk7CisJaWYgKHJldCkgeworCQkqc3RyZW5ndGggPSAwOworCQlnb3RvIGVycm9yOworCX0KKworCSpzdHJlbmd0aCA9ICgodG1wIDw8IDgpIHwgdG1wKTsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkZWJfaW5mbygiJXM6IGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlYzEwMF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJKnNuciA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWMxMDBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwkqdWNibG9ja3MgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlYzEwMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBlYzEwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBlYzEwMF9vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKmVjMTAwX2F0dGFjaChjb25zdCBzdHJ1Y3QgZWMxMDBfY29uZmlnICpjb25maWcsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZWMxMDBfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwl1OCB0bXA7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVjMTAwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmc3RhdGUtPmNvbmZpZywgY29uZmlnLCBzaXplb2Yoc3RydWN0IGVjMTAwX2NvbmZpZykpOworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCisJcmV0ID0gZWMxMDBfcmVhZF9yZWcoc3RhdGUsIDB4MzMsICZ0bXApOworCWlmIChyZXQgfHwgdG1wICE9IDB4MGIpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmZWMxMDBfb3BzLAorCQlzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CitlcnJvcjoKKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGVjMTAwX2F0dGFjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBlYzEwMF9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lID0gIkUzQyBFQzEwMCBEVkItVCIsCisJCS50eXBlID0gRkVfT0ZETSwKKwkJLmNhcHMgPQorCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwKKwkJCUZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAorCQkJRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPIHwKKwkJCUZFX0NBTl9NVVRFX1RTCisJfSwKKworCS5yZWxlYXNlID0gZWMxMDBfcmVsZWFzZSwKKwkuc2V0X2Zyb250ZW5kID0gZWMxMDBfc2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IGVjMTAwX2dldF90dW5lX3NldHRpbmdzLAorCS5yZWFkX3N0YXR1cyA9IGVjMTAwX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IGVjMTAwX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGVjMTAwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IGVjMTAwX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gZWMxMDBfcmVhZF91Y2Jsb2NrcywKK307CisKK01PRFVMRV9BVVRIT1IoIkFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFM0MgRUMxMDAgRFZCLVQgZGVtb2R1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZWMxMDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9lYzEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOGU1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZWMxMDAuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogRTNDIEVDMTAwIGRlbW9kdWxhdG9yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBFQzEwMF9ICisjZGVmaW5lIEVDMTAwX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgZWMxMDBfY29uZmlnIHsKKwkvKiBkZW1vZHVsYXRvcidzIEkyQyBhZGRyZXNzICovCisJdTggZGVtb2RfYWRkcmVzczsKK307CisKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9FQzEwMCkgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfRUMxMDBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqZWMxMDBfYXR0YWNoKGNvbnN0IHN0cnVjdCBlYzEwMF9jb25maWcgKmNvbmZpZywKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICplYzEwMF9hdHRhY2goCisJY29uc3Qgc3RydWN0IGVjMTAwX2NvbmZpZyAqY29uZmlnLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogRUMxMDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2VjMTAwX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9lYzEwMF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5OTAxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9lYzEwMF9wcml2LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIEUzQyBFQzEwMCBkZW1vZHVsYXRvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgRUMxMDBfUFJJVgorI2RlZmluZSBFQzEwMF9QUklWCisKKyNkZWZpbmUgTE9HX1BSRUZJWCAiZWMxMDAiCisKKyNkZWZpbmUgZHByaW50ayh2YXIsIGxldmVsLCBhcmdzLi4uKSBcCisJZG8geyBpZiAoKHZhciAmIGxldmVsKSkgcHJpbnRrKGFyZ3MpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pIGRwcmludGsoZWMxMDBfZGVidWcsIDB4MDEsIGFyZ3MpCisKKyN1bmRlZiBlcnIKKyNkZWZpbmUgZXJyKGYsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAgICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIGluZm8KKyNkZWZpbmUgaW5mbyhmLCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIHdhcm4KKyNkZWZpbmUgd2FybihmLCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorCisjZW5kaWYgLyogRUMxMDBfUFJJViAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYwppbmRleCAwNTYzODdiLi40Mzk3MWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYwpAQCAtNDc5LDcgKzQ3OSw3IEBACiAJc3dpdGNoIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uKSB7CiAJY2FzZSBRQU1fMjU2OgogCWNhc2UgUUFNXzY0OgotCQkvKiBOZWVkIHRvIHVuZGVzdGFuZCB3aHkgdGhlcmUgYXJlIDMgbG9jayBsZXZlbHMgaGVyZSAqLworCQkvKiBOZWVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoZXJlIGFyZSAzIGxvY2sgbGV2ZWxzIGhlcmUgKi8KIAkJaWYgKChidWZbMF0gJiAweDA3KSA9PSAweDA3KQogCQkJKnN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKIAkJYnJlYWs7CkBAIC01MjAsNyArNTIwLDcgQEAKIAlzd2l0Y2ggKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24pIHsKIAljYXNlIFFBTV8yNTY6CiAJY2FzZSBRQU1fNjQ6Ci0JCS8qIE5lZWQgdG8gdW5kZXN0YW5kIHdoeSB0aGVyZSBhcmUgMyBsb2NrIGxldmVscyBoZXJlICovCisJCS8qIE5lZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhlcmUgYXJlIDMgbG9jayBsZXZlbHMgaGVyZSAqLwogCQlpZiAoKGJ1ZlswXSAmIDB4MDcpID09IDB4MDcpCiAJCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQwOS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MDkuYwppbmRleCBmYjMwMTE1Li4wZTJmNjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQwOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDA5LmMKQEAgLTQ0LDcgKzQ0LDE1IEBACiAJaW50IGlmX2ZyZXE7CiAKIAl1MzIgaXNfcWFtX2xvY2tlZDsKLQl1MzIgcWFtX3N0YXRlOworCisJLyogUUFNIHR1bmluZyBzdGF0ZSBnb2VzIHRocm91Z2ggdGhlIGZvbGxvd2luZyBzdGF0ZSB0cmFuc2l0aW9ucyAqLworI2RlZmluZSBRQU1fU1RBVEVfVU5UVU5FRCAwCisjZGVmaW5lIFFBTV9TVEFURV9UVU5JTkdfU1RBUlRFRCAxCisjZGVmaW5lIFFBTV9TVEFURV9JTlRFUkxFQVZFX1NFVCAyCisjZGVmaW5lIFFBTV9TVEFURV9RQU1fT1BUSU1JWkVEX0wxIDMKKyNkZWZpbmUgUUFNX1NUQVRFX1FBTV9PUFRJTUlaRURfTDIgNAorI2RlZmluZSBRQU1fU1RBVEVfUUFNX09QVElNSVpFRF9MMyA1CisJdTggIHFhbV9zdGF0ZTsKIH07CiAKIHN0YXRpYyBpbnQgZGVidWc7CkBAIC0zNDcsNyArMzU1LDcgQEAKIAlzNWgxNDA5X3dyaXRlcmVnKHN0YXRlLCAweGY1LCAwKTsKIAlzNWgxNDA5X3dyaXRlcmVnKHN0YXRlLCAweGY1LCAxKTsKIAlzdGF0ZS0+aXNfcWFtX2xvY2tlZCA9IDA7Ci0Jc3RhdGUtPnFhbV9zdGF0ZSA9IDA7CisJc3RhdGUtPnFhbV9zdGF0ZSA9IFFBTV9TVEFURV9VTlRVTkVEOwogCXJldHVybiAwOwogfQogCkBAIC00NzQsNiArNDgyLDU5IEBACiAJc3RydWN0IHM1aDE0MDlfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTE2IHJlZzsKIAorCWlmIChzdGF0ZS0+cWFtX3N0YXRlIDwgUUFNX1NUQVRFX0lOVEVSTEVBVkVfU0VUKSB7CisJCS8qIFdlIHNob3VsZCBub3QgcGVyZm9ybSBhbWh1bSBvcHRpbWl6YXRpb24gdW50aWwKKwkJICAgdGhlIGludGVybGVhdmUgbW9kZSBoYXMgYmVlbiBjb25maWd1cmVkICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhdGUtPnFhbV9zdGF0ZSA9PSBRQU1fU1RBVEVfUUFNX09QVElNSVpFRF9MMykgeworCQkvKiBXZSd2ZSBhbHJlYWR5IHJlYWNoZWQgdGhlIG1heGltdW0gb3B0aW1pemF0aW9uIGxldmVsLCBzbworCQkgICBkb250IGJvdGhlciBiYW5naW5nIG9uIHRoZSBzdGF0dXMgcmVnaXN0ZXJzICovCisJCXJldHVybjsKKwl9CisKKwkvKiBRQU0gRVEgbG9jayBjaGVjayAqLworCXJlZyA9IHM1aDE0MDlfcmVhZHJlZyhzdGF0ZSwgMHhmMCk7CisKKwlpZiAoKHJlZyA+PiAxMykgJiAweDEpIHsKKwkJcmVnICY9IDB4ZmY7CisKKwkJczVoMTQwOV93cml0ZXJlZyhzdGF0ZSwgMHg5NiwgMHgwMDBjKTsKKwkJaWYgKHJlZyA8IDB4NjgpIHsKKwkJCWlmIChzdGF0ZS0+cWFtX3N0YXRlIDwgUUFNX1NUQVRFX1FBTV9PUFRJTUlaRURfTDMpIHsKKwkJCQlkcHJpbnRrKCIlcygpIHNldHRpbmcgUUFNIHN0YXRlIHRvIE9QVF9MM1xuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXM1aDE0MDlfd3JpdGVyZWcoc3RhdGUsIDB4OTMsIDB4MzEzMCk7CisJCQkJczVoMTQwOV93cml0ZXJlZyhzdGF0ZSwgMHg5ZSwgMHgyODM2KTsKKwkJCQlzdGF0ZS0+cWFtX3N0YXRlID0gUUFNX1NUQVRFX1FBTV9PUFRJTUlaRURfTDM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoc3RhdGUtPnFhbV9zdGF0ZSA8IFFBTV9TVEFURV9RQU1fT1BUSU1JWkVEX0wyKSB7CisJCQkJZHByaW50aygiJXMoKSBzZXR0aW5nIFFBTSBzdGF0ZSB0byBPUFRfTDJcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlzNWgxNDA5X3dyaXRlcmVnKHN0YXRlLCAweDkzLCAweDMzMzIpOworCQkJCXM1aDE0MDlfd3JpdGVyZWcoc3RhdGUsIDB4OWUsIDB4MmMzNyk7CisJCQkJc3RhdGUtPnFhbV9zdGF0ZSA9IFFBTV9TVEFURV9RQU1fT1BUSU1JWkVEX0wyOworCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQlpZiAoc3RhdGUtPnFhbV9zdGF0ZSA8IFFBTV9TVEFURV9RQU1fT1BUSU1JWkVEX0wxKSB7CisJCQlkcHJpbnRrKCIlcygpIHNldHRpbmcgUUFNIHN0YXRlIHRvIE9QVF9MMVxuIiwgX19mdW5jX18pOworCQkJczVoMTQwOV93cml0ZXJlZyhzdGF0ZSwgMHg5NiwgMHgwMDA4KTsKKwkJCXM1aDE0MDlfd3JpdGVyZWcoc3RhdGUsIDB4OTMsIDB4MzMzMik7CisJCQlzNWgxNDA5X3dyaXRlcmVnKHN0YXRlLCAweDllLCAweDJjMzcpOworCQkJc3RhdGUtPnFhbV9zdGF0ZSA9IFFBTV9TVEFURV9RQU1fT1BUSU1JWkVEX0wxOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzNWgxNDA5X3NldF9xYW1fYW1odW1fbW9kZV9sZWdhY3koc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHM1aDE0MDlfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IHJlZzsKKwogCWlmIChzdGF0ZS0+aXNfcWFtX2xvY2tlZCkKIAkJcmV0dXJuOwogCkBAIC01MDYsNiArNTY3LDQ0IEBACiAJc3RydWN0IHM1aDE0MDlfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTE2IHJlZywgcmVnMSwgcmVnMjsKIAorCWlmIChzdGF0ZS0+cWFtX3N0YXRlID49IFFBTV9TVEFURV9JTlRFUkxFQVZFX1NFVCkgeworCQkvKiBXZSd2ZSBkb25lIHRoZSBvcHRpbWl6YXRpb24gYWxyZWFkeSAqLworCQlyZXR1cm47CisJfQorCisJcmVnID0gczVoMTQwOV9yZWFkcmVnKHN0YXRlLCAweGYxKTsKKworCS8qIE1hc3RlciBsb2NrICovCisJaWYgKChyZWcgPj4gMTUpICYgMHgxKSB7CisJCWlmIChzdGF0ZS0+cWFtX3N0YXRlID09IFFBTV9TVEFURV9VTlRVTkVEIHx8CisJCSAgICBzdGF0ZS0+cWFtX3N0YXRlID09IFFBTV9TVEFURV9UVU5JTkdfU1RBUlRFRCkgeworCQkJZHByaW50aygiJXMoKSBzZXR0aW5nIFFBTSBzdGF0ZSB0byBJTlRFUkxFQVZFX1NFVFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZWcxID0gczVoMTQwOV9yZWFkcmVnKHN0YXRlLCAweGIyKTsKKwkJCXJlZzIgPSBzNWgxNDA5X3JlYWRyZWcoc3RhdGUsIDB4YWQpOworCisJCQlzNWgxNDA5X3dyaXRlcmVnKHN0YXRlLCAweDk2LCAweDAwMjApOworCQkJczVoMTQwOV93cml0ZXJlZyhzdGF0ZSwgMHhhZCwKKwkJCQkoKChyZWcxICYgMHhmMDAwKSA+PiA0KSB8IChyZWcyICYgMHhmMGZmKSkpOworCQkJc3RhdGUtPnFhbV9zdGF0ZSA9IFFBTV9TVEFURV9JTlRFUkxFQVZFX1NFVDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdGF0ZS0+cWFtX3N0YXRlID09IFFBTV9TVEFURV9VTlRVTkVEKSB7CisJCQlkcHJpbnRrKCIlcygpIHNldHRpbmcgUUFNIHN0YXRlIHRvIFRVTklOR19TVEFSVEVEXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXM1aDE0MDlfd3JpdGVyZWcoc3RhdGUsIDB4OTYsIDB4MDgpOworCQkJczVoMTQwOV93cml0ZXJlZyhzdGF0ZSwgMHhhYiwKKwkJCQlzNWgxNDA5X3JlYWRyZWcoc3RhdGUsIDB4YWIpIHwgMHgxMDAxKTsKKwkJCXN0YXRlLT5xYW1fc3RhdGUgPSBRQU1fU1RBVEVfVFVOSU5HX1NUQVJURUQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHM1aDE0MDlfc2V0X3FhbV9pbnRlcmxlYXZlX21vZGVfbGVnYWN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzNWgxNDA5X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUxNiByZWcsIHJlZzEsIHJlZzI7CisKIAlyZWcgPSBzNWgxNDA5X3JlYWRyZWcoc3RhdGUsIDB4ZjEpOwogCiAJLyogTWFzdGVyIGxvY2sgKi8KQEAgLTU1MywxNiArNjUyLDI0IEBACiAJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCX0KIAotCS8qIE9wdGltaXplIHRoZSBkZW1vZCBmb3IgUUFNICovCi0JaWYgKHAtPnUudnNiLm1vZHVsYXRpb24gIT0gVlNCXzgpIHsKLQkJczVoMTQwOV9zZXRfcWFtX2FtaHVtX21vZGUoZmUpOwotCQlzNWgxNDA5X3NldF9xYW1faW50ZXJsZWF2ZV9tb2RlKGZlKTsKLQl9Ci0KIAkvKiBJc3N1ZSBhIHJlc2V0IHRvIHRoZSBkZW1vZCBzbyBpdCBrbm93cyB0byByZXN5bmMgYWdhaW5zdCB0aGUKIAkgICBuZXdseSB0dW5lZCBmcmVxdWVuY3kgKi8KIAlzNWgxNDA5X3NvZnRyZXNldChmZSk7CiAKKwkvKiBPcHRpbWl6ZSB0aGUgZGVtb2QgZm9yIFFBTSAqLworCWlmIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uICE9IFZTQl84KSB7CisJCS8qIFRoaXMgYWxtb3N0IGNlcnRhaW5seSBhcHBsaWVzIHRvIGFsbCBib2FyZHMsIGJ1dCBmb3Igbm93CisJCSAgIG9ubHkgZG8gaXQgZm9yIHRoZSBIVlItMTYwMC4gIE9uY2UgdGhlIG90aGVyIGJvYXJkcyBhcmUKKwkJICAgdGVzdGVkLCB0aGUgImxlZ2FjeSIgdmVyc2lvbnMgY2FuIGp1c3QgZ28gYXdheSAqLworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aHZyMTYwMF9vcHQgPT0gUzVIMTQwOV9IVlIxNjAwX09QVElNSVpFKSB7CisJCQlzNWgxNDA5X3NldF9xYW1faW50ZXJsZWF2ZV9tb2RlKGZlKTsKKwkJCXM1aDE0MDlfc2V0X3FhbV9hbWh1bV9tb2RlKGZlKTsKKwkJfSBlbHNlIHsKKwkJCXM1aDE0MDlfc2V0X3FhbV9hbWh1bV9tb2RlX2xlZ2FjeShmZSk7CisJCQlzNWgxNDA5X3NldF9xYW1faW50ZXJsZWF2ZV9tb2RlX2xlZ2FjeShmZSk7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjE0LDYgKzcyMSwyMSBAQAogCS8qIFRoZSBkYXRhc2hlZXQgc2F5cyB0aGF0IGFmdGVyIGluaXRpYWxpc2F0aW9uLCBWU0IgaXMgZGVmYXVsdCAqLwogCXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPSBWU0JfODsKIAorCS8qIE9wdGltaXplIGZvciB0aGUgSFZSLTE2MDAgaWYgYXBwcm9wcmlhdGUuICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZQorCSAgIG1heSBnZXQgZm9sZGVkIGludG8gdGhlIGdlbmVyaWMgY2FzZSBhZnRlciB0ZXN0aW5nIHdpdGggb3RoZXIKKwkgICBkZXZpY2VzICovCisJaWYgKHN0YXRlLT5jb25maWctPmh2cjE2MDBfb3B0ID09IFM1SDE0MDlfSFZSMTYwMF9PUFRJTUlaRSkgeworCQkvKiBWU0IgQUdDIFJFRiAqLworCQlzNWgxNDA5X3dyaXRlcmVnKHN0YXRlLCAweDA5LCAweDAwNTApOworCisJCS8qIFVua25vd24gYnV0IFdpbmRvd3MgZHJpdmVyIGRvZXMgaXQuLi4gKi8KKwkJczVoMTQwOV93cml0ZXJlZyhzdGF0ZSwgMHgyMSwgMHgwMDAxKTsKKwkJczVoMTQwOV93cml0ZXJlZyhzdGF0ZSwgMHg1MCwgMHgwMzBlKTsKKworCQkvKiBRQU0gQUdDIFJFRiAqLworCQlzNWgxNDA5X3dyaXRlcmVnKHN0YXRlLCAweDgyLCAweDA4MDApOworCX0KKwogCWlmIChzdGF0ZS0+Y29uZmlnLT5vdXRwdXRfbW9kZSA9PSBTNUgxNDA5X1NFUklBTF9PVVRQVVQpCiAJCXM1aDE0MDlfd3JpdGVyZWcoc3RhdGUsIDB4YWIsCiAJCQlzNWgxNDA5X3JlYWRyZWcoc3RhdGUsIDB4YWIpIHwgMHgxMDApOyAvKiBTZXJpYWwgKi8KQEAgLTY0MSw2ICs3NjMsMTcgQEAKIAogCSpzdGF0dXMgPSAwOwogCisJLyogT3B0aW1pemUgdGhlIGRlbW9kIGZvciBRQU0gKi8KKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiAhPSBWU0JfOCkgeworCQkvKiBUaGlzIGFsbW9zdCBjZXJ0YWlubHkgYXBwbGllcyB0byBhbGwgYm9hcmRzLCBidXQgZm9yIG5vdworCQkgICBvbmx5IGRvIGl0IGZvciB0aGUgSFZSLTE2MDAuICBPbmNlIHRoZSBvdGhlciBib2FyZHMgYXJlCisJCSAgIHRlc3RlZCwgdGhlICJsZWdhY3kiIHZlcnNpb25zIGNhbiBqdXN0IGdvIGF3YXkgKi8KKwkJaWYgKHN0YXRlLT5jb25maWctPmh2cjE2MDBfb3B0ID09IFM1SDE0MDlfSFZSMTYwMF9PUFRJTUlaRSkgeworCQkJczVoMTQwOV9zZXRfcWFtX2ludGVybGVhdmVfbW9kZShmZSk7CisJCQlzNWgxNDA5X3NldF9xYW1fYW1odW1fbW9kZShmZSk7CisJCX0KKwl9CisKIAkvKiBHZXQgdGhlIGRlbW9kdWxhdG9yIHN0YXR1cyAqLwogCXJlZyA9IHM1aDE0MDlfcmVhZHJlZyhzdGF0ZSwgMHhmMSk7CiAJaWYgKHJlZyAmIDB4MTAwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDA5LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQwOS5oCmluZGV4IDA3MGQ5NzQuLjkxZjJlYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDA5LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MDkuaApAQCAtNTcsNiArNTcsMTMgQEAKICNkZWZpbmUgUzVIMTQwOV9NUEVHVElNSU5HX05PTkNPTlRJTk9VU19JTlZFUlRJTkdfQ0xPQ0sgICAgMgogI2RlZmluZSBTNUgxNDA5X01QRUdUSU1JTkdfTk9OQ09OVElOT1VTX05PTklOVkVSVElOR19DTE9DSyAzCiAJdTE2IG1wZWdfdGltaW5nOworCisJLyogSFZSLTE2MDAgb3B0aW1pemF0aW9ucyAodG8gYmV0dGVyIHdvcmsgd2l0aCBNWEw1MDA1cykKKwkgICBOb3RlOiBzb21lIG9mIHRoZXNlIGFyZSBsaWtlbHkgdG8gYmUgZm9sZGVkIGludG8gdGhlIGdlbmVyaWMgZHJpdmVyCisJICAgYWZ0ZXIgYmVpbmcgcmVncmVzc2lvbiB0ZXN0ZWQgd2l0aCBvdGhlciBib2FyZHMgKi8KKyNkZWZpbmUgUzVIMTQwOV9IVlIxNjAwX05PT1BUSU1JWkUgMAorI2RlZmluZSBTNUgxNDA5X0hWUjE2MDBfT1BUSU1JWkUgICAxCisJdTggaHZyMTYwMF9vcHQ7CiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfRFZCX1M1SDE0MDkpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfUzVIMTQwOV9NT0RVTEUpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKaW5kZXggYTA0Yzc4Mi4uMTU3MDY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKQEAgLTE1NzEsNyArMTU3MSw3IEBACiAgKiBzdGIwODk5X3RyYWNrCiAgKiBwZXJpb2RpY2FsbHkgY2hlY2sgdGhlIHNpZ25hbCBsZXZlbCBhZ2FpbnN0IGEgc3BlY2lmaWVkCiAgKiB0aHJlc2hvbGQgbGV2ZWwgYW5kIHBlcmZvcm0gZGVyb3RhdG9yIGNlbnRlcmluZy4KLSAqIGNhbGxlZCBvbmNlIHdlIGhhdmUgYSBsb2NrIGZyb20gYSBzdWNjZXNmdWwgc2VhcmNoCisgKiBjYWxsZWQgb25jZSB3ZSBoYXZlIGEgbG9jayBmcm9tIGEgc3VjY2Vzc2Z1bCBzZWFyY2gKICAqIGV2ZW50LgogICoKICAqIFdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseSBjYWxsZWQgdG8gbWFpbnRhaW4gdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjEwMF9wcm9jLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjEwMF9wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyMTYzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGI2MTAwX3Byb2MuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKwlTVEI2MTAwIFNpbGljb24gVHVuZXIgd3JhcHBlcgorCUNvcHlyaWdodCAoQykyMDA5IElnb3IgTS4gTGlwbGlhbmluIChsaXBsaWFuaW5AbWUuYnkpCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKK3N0YXRpYyBpbnQgc3RiNjEwMF9nZXRfZnJlcShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCit7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMJKmZyb250ZW5kX29wcyA9IE5VTEw7CisJc3RydWN0IGR2Yl90dW5lcl9vcHMJKnR1bmVyX29wcyA9IE5VTEw7CisJc3RydWN0IHR1bmVyX3N0YXRlCXN0YXRlOworCWludCBlcnIgPSAwOworCisJaWYgKCZmZS0+b3BzKQorCQlmcm9udGVuZF9vcHMgPSAmZmUtPm9wczsKKwlpZiAoJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzKQorCQl0dW5lcl9vcHMgPSAmZnJvbnRlbmRfb3BzLT50dW5lcl9vcHM7CisJaWYgKHR1bmVyX29wcy0+Z2V0X3N0YXRlKSB7CisJCWlmIChmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwpCisJCQlmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwoZmUsIDEpOworCisJCWVyciA9IHR1bmVyX29wcy0+Z2V0X3N0YXRlKGZlLCBEVkJGRV9UVU5FUl9GUkVRVUVOQ1ksICZzdGF0ZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmIChmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwpCisJCQlmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwoZmUsIDApOworCisJCSpmcmVxdWVuY3kgPSBzdGF0ZS5mcmVxdWVuY3k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9zZXRfZnJlcShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIGZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcwkqZnJvbnRlbmRfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcwkqdHVuZXJfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgdHVuZXJfc3RhdGUJc3RhdGU7CisJaW50IGVyciA9IDA7CisKKwlzdGF0ZS5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisJaWYgKCZmZS0+b3BzKQorCQlmcm9udGVuZF9vcHMgPSAmZmUtPm9wczsKKwlpZiAoJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzKQorCQl0dW5lcl9vcHMgPSAmZnJvbnRlbmRfb3BzLT50dW5lcl9vcHM7CisJaWYgKHR1bmVyX29wcy0+c2V0X3N0YXRlKSB7CisJCWlmIChmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwpCisJCQlmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwoZmUsIDEpOworCisJCWVyciA9IHR1bmVyX29wcy0+c2V0X3N0YXRlKGZlLCBEVkJGRV9UVU5FUl9GUkVRVUVOQ1ksICZzdGF0ZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmIChmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwpCisJCQlmcm9udGVuZF9vcHMtPmkyY19nYXRlX2N0cmwoZmUsIDApOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9nZXRfYmFuZHcoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKQoreworCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzCSpmcm9udGVuZF9vcHMgPSBOVUxMOworCXN0cnVjdCBkdmJfdHVuZXJfb3BzCSp0dW5lcl9vcHMgPSBOVUxMOworCXN0cnVjdCB0dW5lcl9zdGF0ZQlzdGF0ZTsKKwlpbnQgZXJyID0gMDsKKworCWlmICgmZmUtPm9wcykKKwkJZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7CisJaWYgKCZmcm9udGVuZF9vcHMtPnR1bmVyX29wcykKKwkJdHVuZXJfb3BzID0gJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzOworCWlmICh0dW5lcl9vcHMtPmdldF9zdGF0ZSkgeworCQlpZiAoZnJvbnRlbmRfb3BzLT5pMmNfZ2F0ZV9jdHJsKQorCQkJZnJvbnRlbmRfb3BzLT5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKworCQllcnIgPSB0dW5lcl9vcHMtPmdldF9zdGF0ZShmZSwgRFZCRkVfVFVORVJfQkFORFdJRFRILCAmc3RhdGUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAoZnJvbnRlbmRfb3BzLT5pMmNfZ2F0ZV9jdHJsKQorCQkJZnJvbnRlbmRfb3BzLT5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKworCQkqYmFuZHdpZHRoID0gc3RhdGUuYmFuZHdpZHRoOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjYxMDBfc2V0X2JhbmR3KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgYmFuZHdpZHRoKQoreworCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzCSpmcm9udGVuZF9vcHMgPSBOVUxMOworCXN0cnVjdCBkdmJfdHVuZXJfb3BzCSp0dW5lcl9vcHMgPSBOVUxMOworCXN0cnVjdCB0dW5lcl9zdGF0ZQlzdGF0ZTsKKwlpbnQgZXJyID0gMDsKKworCXN0YXRlLmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKKwlpZiAoJmZlLT5vcHMpCisJCWZyb250ZW5kX29wcyA9ICZmZS0+b3BzOworCWlmICgmZnJvbnRlbmRfb3BzLT50dW5lcl9vcHMpCisJCXR1bmVyX29wcyA9ICZmcm9udGVuZF9vcHMtPnR1bmVyX29wczsKKwlpZiAodHVuZXJfb3BzLT5zZXRfc3RhdGUpIHsKKwkJaWYgKGZyb250ZW5kX29wcy0+aTJjX2dhdGVfY3RybCkKKwkJCWZyb250ZW5kX29wcy0+aTJjX2dhdGVfY3RybChmZSwgMSk7CisKKwkJZXJyID0gdHVuZXJfb3BzLT5zZXRfc3RhdGUoZmUsIERWQkZFX1RVTkVSX0JBTkRXSURUSCwgJnN0YXRlKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcGFyYW1ldGVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJaWYgKGZyb250ZW5kX29wcy0+aTJjX2dhdGVfY3RybCkKKwkJCWZyb250ZW5kX29wcy0+aTJjX2dhdGVfY3RybChmZSwgMCk7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTAwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMC5oCmluZGV4IGJmNGU5YjYuLjI5YzNmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTAwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDAuaApAQCAtMzYsNiArMzYsNyBAQAogCiBzdHJ1Y3Qgc3R2MDkwMF9jb25maWcgewogCXU4IGRlbW9kX2FkZHJlc3M7CisJdTggZGVtb2RfbW9kZTsKIAl1MzIgeHRhbDsKIAl1OCBjbGttb2RlOy8qIDAgZm9yIENMS0ksICAyIGZvciBYVEFMSSAqLwogCkBAIC00OCw2ICs0OSw4IEBACiAJdTggdHVuMl9tYWRkcmVzczsKIAl1OCB0dW4xX2FkYzsvKiAxIGZvciBzdHY2MTEwLCAyIGZvciBzdGI2MTAwICovCiAJdTggdHVuMl9hZGM7CisJLyogU2V0IGRldmljZSBwYXJhbSB0byBzdGFydCBkbWEgKi8KKwlpbnQgKCpzZXRfdHNfcGFyYW1zKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGlzX3B1bmN0dXJlZCk7CiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NUVjA5MDApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfU1RWMDkwMF9NT0RVTEUpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTAwX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTAwX2NvcmUuYwppbmRleCAzYmRlMzMyLi5kZjQ5ZWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfY29yZS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAic3R2MDkwMF9wcml2LmgiCiAjaW5jbHVkZSAic3R2MDkwMF9pbml0LmgiCiAKLXN0YXRpYyBpbnQgc3R2ZGVidWcgPSAxOworaW50IHN0dmRlYnVnID0gMTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Zywgc3R2ZGVidWcsIGludCwgMDY0NCk7CiAKIC8qIGludGVybmFsIHBhcmFtcyBub2RlICovCkBAIC0xMDUsNyArMTA1LDggQEAKIAkJd2hpbGUgKG5ld19ub2RlLT5uZXh0X2lub2RlICE9IE5VTEwpCiAJCQluZXdfbm9kZSA9IG5ld19ub2RlLT5uZXh0X2lub2RlOwogCi0JCW5ld19ub2RlLT5uZXh0X2lub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN0djA5MDBfaW5vZGUpLCBHRlBfS0VSTkVMKTsKKwkJbmV3X25vZGUtPm5leHRfaW5vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3R2MDkwMF9pbm9kZSksCisJCQkJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAobmV3X25vZGUtPm5leHRfaW5vZGUgIT0gTlVMTCkKIAkJCW5ld19ub2RlID0gbmV3X25vZGUtPm5leHRfaW5vZGU7CiAJCWVsc2UKQEAgLTEyOCwxMyArMTI5LDEzIEBACiAJCXJldHVybiAoYSA+PSAoMSA8PCAod2lkdGggLSAxKSkpID8gKGEgLSAoMSA8PCB3aWR0aCkpIDogYTsKIH0KIAotdm9pZCBzdHYwOTAwX3dyaXRlX3JlZyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsIHUxNiByZWdfYWRkciwKK3ZvaWQgc3R2MDkwMF93cml0ZV9yZWcoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsIHUxNiByZWdfYWRkciwKIAkJCQkJCQkJdTggcmVnX2RhdGEpCiB7CiAJdTggZGF0YVszXTsKIAlpbnQgcmV0OwogCXN0cnVjdCBpMmNfbXNnIGkyY21zZyA9IHsKLQkJLmFkZHIgID0gaV9wYXJhbXMtPmkyY19hZGRyLAorCQkuYWRkciAgPSBpbnRwLT5pMmNfYWRkciwKIAkJLmZsYWdzID0gMCwKIAkJLmxlbiAgID0gMywKIAkJLmJ1ZiAgID0gZGF0YSwKQEAgLTE0NCwzMyArMTQ1LDMzIEBACiAJZGF0YVsxXSA9IExTQihyZWdfYWRkcik7CiAJZGF0YVsyXSA9IHJlZ19kYXRhOwogCi0JcmV0ID0gaTJjX3RyYW5zZmVyKGlfcGFyYW1zLT5pMmNfYWRhcCwgJmkyY21zZywgMSk7CisJcmV0ID0gaTJjX3RyYW5zZmVyKGludHAtPmkyY19hZGFwLCAmaTJjbXNnLCAxKTsKIAlpZiAocmV0ICE9IDEpCi0JCWRwcmludGsoS0VSTl9FUlIgIiVzOiBpMmMgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkcHJpbnRrKCIlczogaTJjIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIH0KIAotdTggc3R2MDkwMF9yZWFkX3JlZyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsIHUxNiByZWcpCit1OCBzdHYwOTAwX3JlYWRfcmVnKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLCB1MTYgcmVnKQogewogCWludCByZXQ7CiAJdTggYjBbXSA9IHsgTVNCKHJlZyksIExTQihyZWcpIH07CiAJdTggYnVmID0gMDsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKIAkJewotCQkJLmFkZHIJPSBpX3BhcmFtcy0+aTJjX2FkZHIsCisJCQkuYWRkcgk9IGludHAtPmkyY19hZGRyLAogCQkJLmZsYWdzCT0gMCwKIAkJCS5idWYgPSBiMCwKIAkJCS5sZW4gPSAyLAogCQl9LCB7Ci0JCQkuYWRkcgk9IGlfcGFyYW1zLT5pMmNfYWRkciwKKwkJCS5hZGRyCT0gaW50cC0+aTJjX2FkZHIsCiAJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKIAkJCS5idWYgPSAmYnVmLAogCQkJLmxlbiA9IDEsCiAJCX0sCiAJfTsKIAotCXJldCA9IGkyY190cmFuc2ZlcihpX3BhcmFtcy0+aTJjX2FkYXAsIG1zZywgMik7CisJcmV0ID0gaTJjX3RyYW5zZmVyKGludHAtPmkyY19hZGFwLCBtc2csIDIpOwogCWlmIChyZXQgIT0gMikKLQkJZHByaW50ayhLRVJOX0VSUiAiJXM6IGkyYyBlcnJvciAlZCwgcmVnWzB4JTAyeF1cbiIsCisJCWRwcmludGsoIiVzOiBpMmMgZXJyb3IgJWQsIHJlZ1sweCUwMnhdXG4iLAogCQkJCV9fZnVuY19fLCByZXQsIHJlZyk7CiAKIAlyZXR1cm4gYnVmOwpAQCAtMTkwLDE2OSArMTkxLDE2NSBAQAogCSgqcG9zKSA9IChpIC0gMSk7CiB9CiAKLXZvaWQgc3R2MDkwMF93cml0ZV9iaXRzKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywgdTMyIGxhYmVsLCB1OCB2YWwpCit2b2lkIHN0djA5MDBfd3JpdGVfYml0cyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwgdTMyIGxhYmVsLCB1OCB2YWwpCiB7CiAJdTggcmVnLCBtYXNrLCBwb3M7CiAKLQlyZWcgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCAobGFiZWwgPj4gMTYpICYgMHhmZmZmKTsKKwlyZWcgPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIChsYWJlbCA+PiAxNikgJiAweGZmZmYpOwogCWV4dHJhY3RfbWFza19wb3MobGFiZWwsICZtYXNrLCAmcG9zKTsKIAogCXZhbCA9IG1hc2sgJiAodmFsIDw8IHBvcyk7CiAKIAlyZWcgPSAocmVnICYgKH5tYXNrKSkgfCB2YWw7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIChsYWJlbCA+PiAxNikgJiAweGZmZmYsIHJlZyk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgKGxhYmVsID4+IDE2KSAmIDB4ZmZmZiwgcmVnKTsKIAogfQogCi11OCBzdHYwOTAwX2dldF9iaXRzKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywgdTMyIGxhYmVsKQordTggc3R2MDkwMF9nZXRfYml0cyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwgdTMyIGxhYmVsKQogewogCXU4IHZhbCA9IDB4ZmY7CiAJdTggbWFzaywgcG9zOwogCiAJZXh0cmFjdF9tYXNrX3BvcyhsYWJlbCwgJm1hc2ssICZwb3MpOwogCi0JdmFsID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgbGFiZWwgPj4gMTYpOworCXZhbCA9IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgbGFiZWwgPj4gMTYpOwogCXZhbCA9ICh2YWwgJiBtYXNrKSA+PiBwb3M7CiAKIAlyZXR1cm4gdmFsOwogfQogCi1lbnVtIGZlX3N0djA5MDBfZXJyb3Igc3R2MDkwMF9pbml0aWFsaXplKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcykKK2VudW0gZmVfc3R2MDkwMF9lcnJvciBzdHYwOTAwX2luaXRpYWxpemUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHApCiB7CiAJczMyIGk7Ci0JZW51bSBmZV9zdHYwOTAwX2Vycm9yIGVycm9yOwogCi0JaWYgKGlfcGFyYW1zICE9IE5VTEwpIHsKLQkJaV9wYXJhbXMtPmNoaXBfaWQgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9NSUQpOwotCQlpZiAoaV9wYXJhbXMtPmVycnMgPT0gU1RWMDkwMF9OT19FUlJPUikgewotCQkJLypTdGFydHVwIHNlcXVlbmNlKi8KLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4NWMpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRElTVEFURSwgMHg1Yyk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVE5SQ0ZHLCAweDZjKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTlJDRkcsIDB4NmYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0kyQ1JQVCwgMHgyMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfSTJDUlBULCAweDIwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9OQ09BUlNFLCAweDEzKTsKLQkJCW1zbGVlcCgzKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9JMkNDRkcsIDB4MDgpOworCWlmIChpbnRwID09IE5VTEwpCisJCXJldHVybiBTVFYwOTAwX0lOVkFMSURfSEFORExFOwogCi0JCQlzd2l0Y2ggKGlfcGFyYW1zLT5jbGttb2RlKSB7Ci0JCQljYXNlIDA6Ci0JCQljYXNlIDI6Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1NZTlRDVFJMLCAweDIwCi0JCQkJCQl8IGlfcGFyYW1zLT5jbGttb2RlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogcHJlc2VydmUgU0VMT1NDSSBiaXQgKi8KLQkJCQlpID0gMHgwMiAmIHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1NZTlRDVFJMKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfU1lOVENUUkwsIDB4MjAgfCBpKTsKLQkJCQlicmVhazsKLQkJCX0KKwlpbnRwLT5jaGlwX2lkID0gc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBSMDkwMF9NSUQpOwogCi0JCQltc2xlZXAoMyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTgyOyBpKyspCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFNUVjA5MDBfSW5pdFZhbFtpXVswXSwgU1RWMDkwMF9Jbml0VmFsW2ldWzFdKTsKKwlpZiAoaW50cC0+ZXJycyAhPSBTVFYwOTAwX05PX0VSUk9SKQorCQlyZXR1cm4gaW50cC0+ZXJyczsKIAotCQkJaWYgKHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX01JRCkgPj0gMHgyMCkgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9UU0dFTkVSQUwsIDB4MGMpOwotCQkJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgU1RWMDkwMF9DdXQyMF9BZGRPblZhbFtpXVswXSwgU1RWMDkwMF9DdXQyMF9BZGRPblZhbFtpXVsxXSk7Ci0JCQl9CisJLypTdGFydHVwIHNlcXVlbmNlKi8KKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4NWMpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AyX0RNRElTVEFURSwgMHg1Yyk7CisJbXNsZWVwKDMpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AxX1ROUkNGRywgMHg2Yyk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfUDJfVE5SQ0ZHLCAweDZmKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMV9JMkNSUFQsIDB4MjApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AyX0kyQ1JQVCwgMHgyMCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfTkNPQVJTRSwgMHgxMyk7CisJbXNsZWVwKDMpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX0kyQ0NGRywgMHgwOCk7CiAKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9GU1BZQ0ZHLCAweDZjKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9GU1BZQ0ZHLCAweDZjKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9UU1RSRVMwLCAweDgwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9UU1RSRVMwLCAweDAwKTsKLQkJfQotCQllcnJvciA9IGlfcGFyYW1zLT5lcnJzOwotCX0gZWxzZQotCQllcnJvciA9IFNUVjA5MDBfSU5WQUxJRF9IQU5ETEU7CisJc3dpdGNoIChpbnRwLT5jbGttb2RlKSB7CisJY2FzZSAwOgorCWNhc2UgMjoKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfU1lOVENUUkwsIDB4MjAKKwkJCQl8IGludHAtPmNsa21vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBwcmVzZXJ2ZSBTRUxPU0NJIGJpdCAqLworCQlpID0gMHgwMiAmIHN0djA5MDBfcmVhZF9yZWcoaW50cCwgUjA5MDBfU1lOVENUUkwpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9TWU5UQ1RSTCwgMHgyMCB8IGkpOworCQlicmVhazsKKwl9CiAKLQlyZXR1cm4gZXJyb3I7CisJbXNsZWVwKDMpOworCWZvciAoaSA9IDA7IGkgPCAxODE7IGkrKykKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU1RWMDkwMF9Jbml0VmFsW2ldWzBdLAorCQkJCVNUVjA5MDBfSW5pdFZhbFtpXVsxXSk7CiAKKwlpZiAoc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBSMDkwMF9NSUQpID49IDB4MjApIHsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfVFNHRU5FUkFMLCAweDBjKTsKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBTVFYwOTAwX0N1dDIwX0FkZE9uVmFsW2ldWzBdLAorCQkJCQlTVFYwOTAwX0N1dDIwX0FkZE9uVmFsW2ldWzFdKTsKKwl9CisKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMV9GU1BZQ0ZHLCAweDZjKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMl9GU1BZQ0ZHLCAweDZjKTsKKworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AxX1BERUxDVFJMMiwgMHgwMSk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfUDJfUERFTENUUkwyLCAweDIxKTsKKworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AxX1BERUxDVFJMMywgMHgyMCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfUDJfUERFTENUUkwzLCAweDIwKTsKKworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1RTVFJFUzAsIDB4ODApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1RTVFJFUzAsIDB4MDApOworCisJcmV0dXJuIFNUVjA5MDBfTk9fRVJST1I7CiB9CiAKLXUzMiBzdHYwOTAwX2dldF9tY2xrX2ZyZXEoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLCB1MzIgZXh0X2NsaykKK3UzMiBzdHYwOTAwX2dldF9tY2xrX2ZyZXEoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsIHUzMiBleHRfY2xrKQogewogCXUzMiBtY2xrID0gOTAwMDAwMDAsIGRpdiA9IDAsIGFkX2RpdiA9IDA7CiAKLQlkaXYgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9NX0RJVik7Ci0JYWRfZGl2ID0gKChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9TRUxYMVJBVElPKSA9PSAxKSA/IDQgOiA2KTsKKwlkaXYgPSBzdHYwOTAwX2dldF9iaXRzKGludHAsIEYwOTAwX01fRElWKTsKKwlhZF9kaXYgPSAoKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgRjA5MDBfU0VMWDFSQVRJTykgPT0gMSkgPyA0IDogNik7CiAKIAltY2xrID0gKGRpdiArIDEpICogZXh0X2NsayAvIGFkX2RpdjsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlczogQ2FsY3VsYXRlZCBNY2xrID0gJWRcbiIsIF9fZnVuY19fLCBtY2xrKTsKKwlkcHJpbnRrKCIlczogQ2FsY3VsYXRlZCBNY2xrID0gJWRcbiIsIF9fZnVuY19fLCBtY2xrKTsKIAogCXJldHVybiBtY2xrOwogfQogCi1lbnVtIGZlX3N0djA5MDBfZXJyb3Igc3R2MDkwMF9zZXRfbWNsayhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsIHUzMiBtY2xrKQorZW51bSBmZV9zdHYwOTAwX2Vycm9yIHN0djA5MDBfc2V0X21jbGsoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsIHUzMiBtY2xrKQogewotCWVudW0gZmVfc3R2MDkwMF9lcnJvciBlcnJvciA9IFNUVjA5MDBfTk9fRVJST1I7CiAJdTMyIG1fZGl2LCBjbGtfc2VsOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzOiBNY2xrIHNldCB0byAlZCwgUXVhcnR6ID0gJWRcbiIsIF9fZnVuY19fLCBtY2xrLAotCQkJaV9wYXJhbXMtPnF1YXJ0eik7CisJZHByaW50aygiJXM6IE1jbGsgc2V0IHRvICVkLCBRdWFydHogPSAlZFxuIiwgX19mdW5jX18sIG1jbGssCisJCQlpbnRwLT5xdWFydHopOwogCi0JaWYgKGlfcGFyYW1zID09IE5VTEwpCi0JCWVycm9yID0gU1RWMDkwMF9JTlZBTElEX0hBTkRMRTsKLQllbHNlIHsKLQkJaWYgKGlfcGFyYW1zLT5lcnJzKQotCQkJZXJyb3IgPSBTVFYwOTAwX0kyQ19FUlJPUjsKLQkJZWxzZSB7Ci0JCQljbGtfc2VsID0gKChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9TRUxYMVJBVElPKSA9PSAxKSA/IDQgOiA2KTsKLQkJCW1fZGl2ID0gKChjbGtfc2VsICogbWNsaykgLyBpX3BhcmFtcy0+cXVhcnR6KSAtIDE7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX01fRElWLCBtX2Rpdik7Ci0JCQlpX3BhcmFtcy0+bWNsayA9IHN0djA5MDBfZ2V0X21jbGtfZnJlcShpX3BhcmFtcywKLQkJCQkJCQlpX3BhcmFtcy0+cXVhcnR6KTsKKwlpZiAoaW50cCA9PSBOVUxMKQorCQlyZXR1cm4gU1RWMDkwMF9JTlZBTElEX0hBTkRMRTsKIAotCQkJLypTZXQgdGhlIERpc2VxQyBmcmVxdWVuY3kgdG8gMjJLSHogKi8KLQkJCS8qCi0JCQkJRm9ybXVsYToKLQkJCQlEaXNlcUNfVFhfRnJlcT0gTWFzdGVyQ2xvY2svKDMyKkYyMlRYX1JlZykKLQkJCQlEaXNlcUNfUlhfRnJlcT0gTWFzdGVyQ2xvY2svKDMyKkYyMlJYX1JlZykKLQkJCSovCi0JCQltX2RpdiA9IGlfcGFyYW1zLT5tY2xrIC8gNzA0MDAwOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0YyMlRYLCBtX2Rpdik7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRjIyUlgsIG1fZGl2KTsKKwlpZiAoaW50cC0+ZXJycykKKwkJcmV0dXJuIFNUVjA5MDBfSTJDX0VSUk9SOwogCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRjIyVFgsIG1fZGl2KTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9GMjJSWCwgbV9kaXYpOworCWNsa19zZWwgPSAoKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgRjA5MDBfU0VMWDFSQVRJTykgPT0gMSkgPyA0IDogNik7CisJbV9kaXYgPSAoKGNsa19zZWwgKiBtY2xrKSAvIGludHAtPnF1YXJ0eikgLSAxOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9NX0RJViwgbV9kaXYpOworCWludHAtPm1jbGsgPSBzdHYwOTAwX2dldF9tY2xrX2ZyZXEoaW50cCwKKwkJCQkJaW50cC0+cXVhcnR6KTsKIAotCQkJaWYgKChpX3BhcmFtcy0+ZXJycykpCi0JCQkJZXJyb3IgPSBTVFYwOTAwX0kyQ19FUlJPUjsKLQkJfQotCX0KKwkvKlNldCB0aGUgRGlzZXFDIGZyZXF1ZW5jeSB0byAyMktIeiAqLworCS8qCisJCUZvcm11bGE6CisJCURpc2VxQ19UWF9GcmVxPSBNYXN0ZXJDbG9jay8oMzIqRjIyVFhfUmVnKQorCQlEaXNlcUNfUlhfRnJlcT0gTWFzdGVyQ2xvY2svKDMyKkYyMlJYX1JlZykKKwkqLworCW1fZGl2ID0gaW50cC0+bWNsayAvIDcwNDAwMDsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMV9GMjJUWCwgbV9kaXYpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AxX0YyMlJYLCBtX2Rpdik7CiAKLQlyZXR1cm4gZXJyb3I7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfUDJfRjIyVFgsIG1fZGl2KTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMl9GMjJSWCwgbV9kaXYpOworCisJaWYgKChpbnRwLT5lcnJzKSkKKwkJcmV0dXJuIFNUVjA5MDBfSTJDX0VSUk9SOworCisJcmV0dXJuIFNUVjA5MDBfTk9fRVJST1I7CiB9CiAKLXUzMiBzdHYwOTAwX2dldF9lcnJfY291bnQoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLCBpbnQgY250ciwKK3UzMiBzdHYwOTAwX2dldF9lcnJfY291bnQoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsIGludCBjbnRyLAogCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQogewogCXUzMiBsc2IsIG1zYiwgaHNiLCBlcnJfdmFsOwotCXMzMiBlcnIxZmllbGRfaHNiLCBlcnIxZmllbGRfbXNiLCBlcnIxZmllbGRfbHNiOwotCXMzMiBlcnIyZmllbGRfaHNiLCBlcnIyZmllbGRfbXNiLCBlcnIyZmllbGRfbHNiOwotCi0JZG1kX3JlZyhlcnIxZmllbGRfaHNiLCBGMDkwMF9QMV9FUlJfQ05UMTIsIEYwOTAwX1AyX0VSUl9DTlQxMik7Ci0JZG1kX3JlZyhlcnIxZmllbGRfbXNiLCBGMDkwMF9QMV9FUlJfQ05UMTEsIEYwOTAwX1AyX0VSUl9DTlQxMSk7Ci0JZG1kX3JlZyhlcnIxZmllbGRfbHNiLCBGMDkwMF9QMV9FUlJfQ05UMTAsIEYwOTAwX1AyX0VSUl9DTlQxMCk7Ci0KLQlkbWRfcmVnKGVycjJmaWVsZF9oc2IsIEYwOTAwX1AxX0VSUl9DTlQyMiwgRjA5MDBfUDJfRVJSX0NOVDIyKTsKLQlkbWRfcmVnKGVycjJmaWVsZF9tc2IsIEYwOTAwX1AxX0VSUl9DTlQyMSwgRjA5MDBfUDJfRVJSX0NOVDIxKTsKLQlkbWRfcmVnKGVycjJmaWVsZF9sc2IsIEYwOTAwX1AxX0VSUl9DTlQyMCwgRjA5MDBfUDJfRVJSX0NOVDIwKTsKIAogCXN3aXRjaCAoY250cikgewogCWNhc2UgMDoKIAlkZWZhdWx0OgotCQloc2IgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBlcnIxZmllbGRfaHNiKTsKLQkJbXNiID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgZXJyMWZpZWxkX21zYik7Ci0JCWxzYiA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIGVycjFmaWVsZF9sc2IpOworCQloc2IgPSBzdHYwOTAwX2dldF9iaXRzKGludHAsIEVSUl9DTlQxMik7CisJCW1zYiA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgRVJSX0NOVDExKTsKKwkJbHNiID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBFUlJfQ05UMTApOwogCQlicmVhazsKIAljYXNlIDE6Ci0JCWhzYiA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIGVycjJmaWVsZF9oc2IpOwotCQltc2IgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBlcnIyZmllbGRfbXNiKTsKLQkJbHNiID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgZXJyMmZpZWxkX2xzYik7CisJCWhzYiA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgRVJSX0NOVDIyKTsKKwkJbXNiID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBFUlJfQ05UMjEpOworCQlsc2IgPSBzdHYwOTAwX2dldF9iaXRzKGludHAsIEVSUl9DTlQyMCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzY0LDI2ICszNjEsMjIgQEAKIHN0YXRpYyBpbnQgc3R2MDkwMF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwogCi0JdTMyIGZpMmM7Ci0KLQlkbWRfcmVnKGZpMmMsIEYwOTAwX1AxX0kyQ1RfT04sIEYwOTAwX1AyX0kyQ1RfT04pOwotCi0Jc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBmaTJjLCBlbmFibGUpOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBJMkNUX09OLCBlbmFibGUpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHN0djA5MDBfc2V0X3RzX3BhcmFsbGVsX3NlcmlhbChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitzdGF0aWMgdm9pZCBzdHYwOTAwX3NldF90c19wYXJhbGxlbF9zZXJpYWwoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9jbG9ja190eXBlIHBhdGgxX3RzLAogCQkJCQllbnVtIGZlX3N0djA5MDBfY2xvY2tfdHlwZSBwYXRoMl90cykKIHsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgX19mdW5jX18pOworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgeworCWlmIChpbnRwLT5jaGlwX2lkID49IDB4MjApIHsKIAkJc3dpdGNoIChwYXRoMV90cykgewogCQljYXNlIFNUVjA5MDBfUEFSQUxMRUxfUFVOQ1RfQ0xPQ0s6CiAJCWNhc2UgU1RWMDkwMF9EVkJDSV9DTE9DSzoKQEAgLTM5MSwyMCArMzg0LDIwIEBACiAJCQljYXNlIFNUVjA5MDBfU0VSSUFMX1BVTkNUX0NMT0NLOgogCQkJY2FzZSBTVFYwOTAwX1NFUklBTF9DT05UX0NMT0NLOgogCQkJZGVmYXVsdDoKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfVFNHRU5FUkFMLAorCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1RTR0VORVJBTCwKIAkJCQkJCQkweDAwKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgU1RWMDkwMF9QQVJBTExFTF9QVU5DVF9DTE9DSzoKIAkJCWNhc2UgU1RWMDkwMF9EVkJDSV9DTE9DSzoKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfVFNHRU5FUkFMLAorCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1RTR0VORVJBTCwKIAkJCQkJCQkweDA2KTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsCisJCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsCiAJCQkJCQlGMDkwMF9QMV9UU0ZJRk9fTUFOU1BFRUQsIDMpOwotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywKKwkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwKIAkJCQkJCUYwOTAwX1AyX1RTRklGT19NQU5TUEVFRCwgMCk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsCisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwKIAkJCQkJCVIwOTAwX1AxX1RTU1BFRUQsIDB4MTQpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLAorCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsCiAJCQkJCQlSMDkwMF9QMl9UU1NQRUVELCAweDI4KTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTQxNiwxNCArNDA5LDE0IEBACiAJCQljYXNlIFNUVjA5MDBfU0VSSUFMX1BVTkNUX0NMT0NLOgogCQkJY2FzZSBTVFYwOTAwX1NFUklBTF9DT05UX0NMT0NLOgogCQkJZGVmYXVsdDoKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLAogCQkJCQkJUjA5MDBfVFNHRU5FUkFMLCAweDBDKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgU1RWMDkwMF9QQVJBTExFTF9QVU5DVF9DTE9DSzoKIAkJCWNhc2UgU1RWMDkwMF9EVkJDSV9DTE9DSzoKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLAogCQkJCQkJUjA5MDBfVFNHRU5FUkFMLCAweDBBKTsKLQkJCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDB4MGFcbiIsIF9fZnVuY19fKTsKKwkJCQlkcHJpbnRrKCIlczogMHgwYVxuIiwgX19mdW5jX18pOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlYWs7CkBAIC00MzYsMjAgKzQyOSwyMCBAQAogCQkJY2FzZSBTVFYwOTAwX1NFUklBTF9QVU5DVF9DTE9DSzoKIAkJCWNhc2UgU1RWMDkwMF9TRVJJQUxfQ09OVF9DTE9DSzoKIAkJCWRlZmF1bHQ6Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1RTR0VORVJBTDFYLAorCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1RTR0VORVJBTDFYLAogCQkJCQkJCTB4MTApOwogCQkJCWJyZWFrOwogCQkJY2FzZSBTVFYwOTAwX1BBUkFMTEVMX1BVTkNUX0NMT0NLOgogCQkJY2FzZSBTVFYwOTAwX0RWQkNJX0NMT0NLOgotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9UU0dFTkVSQUwxWCwKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9UU0dFTkVSQUwxWCwKIAkJCQkJCQkweDE2KTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsCisJCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsCiAJCQkJCQlGMDkwMF9QMV9UU0ZJRk9fTUFOU1BFRUQsIDMpOwotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywKKwkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwKIAkJCQkJCUYwOTAwX1AyX1RTRklGT19NQU5TUEVFRCwgMCk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1RTU1BFRUQsCisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfUDFfVFNTUEVFRCwKIAkJCQkJCQkweDE0KTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVFNTUEVFRCwKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMl9UU1NQRUVELAogCQkJCQkJCTB4MjgpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNDYyLDE0ICs0NTUsMTQgQEAKIAkJCWNhc2UgU1RWMDkwMF9TRVJJQUxfUFVOQ1RfQ0xPQ0s6CiAJCQljYXNlIFNUVjA5MDBfU0VSSUFMX0NPTlRfQ0xPQ0s6CiAJCQlkZWZhdWx0OgotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9UU0dFTkVSQUwxWCwKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9UU0dFTkVSQUwxWCwKIAkJCQkJCQkweDE0KTsKIAkJCQlicmVhazsKIAkJCWNhc2UgU1RWMDkwMF9QQVJBTExFTF9QVU5DVF9DTE9DSzoKIAkJCWNhc2UgU1RWMDkwMF9EVkJDSV9DTE9DSzoKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfVFNHRU5FUkFMMVgsCisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfVFNHRU5FUkFMMVgsCiAJCQkJCQkJMHgxMik7Ci0JCQkJZHByaW50ayhLRVJOX0lORk8gIiVzOiAweDEyXG4iLCBfX2Z1bmNfXyk7CisJCQkJZHByaW50aygiJXM6IDB4MTJcbiIsIF9fZnVuY19fKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtNDc5LDIwICs0NzIsMjAgQEAKIAogCXN3aXRjaCAocGF0aDFfdHMpIHsKIAljYXNlIFNUVjA5MDBfUEFSQUxMRUxfUFVOQ1RfQ0xPQ0s6Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfVFNGSUZPX1NFUklBTCwgMHgwMCk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfVFNGSUZPX0RWQkNJLCAweDAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AxX1RTRklGT19TRVJJQUwsIDB4MDApOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDFfVFNGSUZPX0RWQkNJLCAweDAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTVFYwOTAwX0RWQkNJX0NMT0NLOgotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1RTRklGT19TRVJJQUwsIDB4MDApOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1RTRklGT19EVkJDSSwgMHgwMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMV9UU0ZJRk9fU0VSSUFMLCAweDAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AxX1RTRklGT19EVkJDSSwgMHgwMSk7CiAJCWJyZWFrOwogCWNhc2UgU1RWMDkwMF9TRVJJQUxfUFVOQ1RfQ0xPQ0s6Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfVFNGSUZPX1NFUklBTCwgMHgwMSk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfVFNGSUZPX0RWQkNJLCAweDAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AxX1RTRklGT19TRVJJQUwsIDB4MDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDFfVFNGSUZPX0RWQkNJLCAweDAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTVFYwOTAwX1NFUklBTF9DT05UX0NMT0NLOgotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1RTRklGT19TRVJJQUwsIDB4MDEpOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1RTRklGT19EVkJDSSwgMHgwMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMV9UU0ZJRk9fU0VSSUFMLCAweDAxKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AxX1RTRklGT19EVkJDSSwgMHgwMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNTAwLDI5ICs0OTMsMjkgQEAKIAogCXN3aXRjaCAocGF0aDJfdHMpIHsKIAljYXNlIFNUVjA5MDBfUEFSQUxMRUxfUFVOQ1RfQ0xPQ0s6Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfVFNGSUZPX1NFUklBTCwgMHgwMCk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfVFNGSUZPX0RWQkNJLCAweDAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AyX1RTRklGT19TRVJJQUwsIDB4MDApOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDJfVFNGSUZPX0RWQkNJLCAweDAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTVFYwOTAwX0RWQkNJX0NMT0NLOgotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1RTRklGT19TRVJJQUwsIDB4MDApOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1RTRklGT19EVkJDSSwgMHgwMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMl9UU0ZJRk9fU0VSSUFMLCAweDAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AyX1RTRklGT19EVkJDSSwgMHgwMSk7CiAJCWJyZWFrOwogCWNhc2UgU1RWMDkwMF9TRVJJQUxfUFVOQ1RfQ0xPQ0s6Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfVFNGSUZPX1NFUklBTCwgMHgwMSk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfVFNGSUZPX0RWQkNJLCAweDAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AyX1RTRklGT19TRVJJQUwsIDB4MDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDJfVFNGSUZPX0RWQkNJLCAweDAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTVFYwOTAwX1NFUklBTF9DT05UX0NMT0NLOgotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1RTRklGT19TRVJJQUwsIDB4MDEpOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1RTRklGT19EVkJDSSwgMHgwMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMl9UU0ZJRk9fU0VSSUFMLCAweDAxKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AyX1RTRklGT19EVkJDSSwgMHgwMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAotCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfUlNUX0hXQVJFLCAxKTsKLQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1JTVF9IV0FSRSwgMCk7Ci0Jc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9SU1RfSFdBUkUsIDEpOwotCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfUlNUX0hXQVJFLCAwKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDJfUlNUX0hXQVJFLCAxKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDJfUlNUX0hXQVJFLCAwKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDFfUlNUX0hXQVJFLCAxKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDFfUlNUX0hXQVJFLCAwKTsKIH0KIAogdm9pZCBzdHYwOTAwX3NldF90dW5lcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIGZyZXF1ZW5jeSwKQEAgLTU3NCw3ICs1NjcsNyBAQAogCX0KIH0KIAotc3RhdGljIHMzMiBzdHYwOTAwX2dldF9yZl9sZXZlbChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitzdGF0aWMgczMyIHN0djA5MDBfZ2V0X3JmX2xldmVsKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCWNvbnN0IHN0cnVjdCBzdHYwOTAwX3RhYmxlICpsb29rdXAsCiAJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKQEAgLTU4NCw0NSArNTc3LDQxIEBACiAJCWksCiAJCXJmX2x2bCA9IDA7CiAKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKChsb29rdXAgIT0gTlVMTCkgJiYgbG9va3VwLT5zaXplKSB7Ci0JCXN3aXRjaCAoZGVtb2QpIHsKLQkJY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JCWRlZmF1bHQ6Ci0JCQlhZ2NfZ2FpbiA9IE1BS0VXT1JEKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0FHQ0lRX1ZBTFVFMSksCi0JCQkJCQlzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9BR0NJUV9WQUxVRTApKTsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCWFnY19nYWluID0gTUFLRVdPUkQoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfQUdDSVFfVkFMVUUxKSwKLQkJCQkJCXN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0FHQ0lRX1ZBTFVFMCkpOwotCQkJYnJlYWs7CisJaWYgKChsb29rdXAgPT0gTlVMTCkgfHwgKGxvb2t1cC0+c2l6ZSA8PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlhZ2NfZ2FpbiA9IE1BS0VXT1JEKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgQUdDSVFfVkFMVUUxKSwKKwkJCQlzdHYwOTAwX2dldF9iaXRzKGludHAsIEFHQ0lRX1ZBTFVFMCkpOworCisJaW1pbiA9IDA7CisJaW1heCA9IGxvb2t1cC0+c2l6ZSAtIDE7CisJaWYgKElOUkFOR0UobG9va3VwLT50YWJsZVtpbWluXS5yZWd2YWwsIGFnY19nYWluLAorCQkJCQlsb29rdXAtPnRhYmxlW2ltYXhdLnJlZ3ZhbCkpIHsKKwkJd2hpbGUgKChpbWF4IC0gaW1pbikgPiAxKSB7CisJCQlpID0gKGltYXggKyBpbWluKSA+PiAxOworCisJCQlpZiAoSU5SQU5HRShsb29rdXAtPnRhYmxlW2ltaW5dLnJlZ3ZhbCwKKwkJCQkJYWdjX2dhaW4sCisJCQkJCWxvb2t1cC0+dGFibGVbaV0ucmVndmFsKSkKKwkJCQlpbWF4ID0gaTsKKwkJCWVsc2UKKwkJCQlpbWluID0gaTsKIAkJfQogCi0JCWltaW4gPSAwOwotCQlpbWF4ID0gbG9va3VwLT5zaXplIC0gMTsKLQkJaWYgKElOUkFOR0UobG9va3VwLT50YWJsZVtpbWluXS5yZWd2YWwsIGFnY19nYWluLCBsb29rdXAtPnRhYmxlW2ltYXhdLnJlZ3ZhbCkpIHsKLQkJCXdoaWxlICgoaW1heCAtIGltaW4pID4gMSkgewotCQkJCWkgPSAoaW1heCArIGltaW4pID4+IDE7CisJCXJmX2x2bCA9IChzMzIpYWdjX2dhaW4gLSBsb29rdXAtPnRhYmxlW2ltaW5dLnJlZ3ZhbDsKKwkJcmZfbHZsICo9IChsb29rdXAtPnRhYmxlW2ltYXhdLnJlYWx2YWwgLQorCQkJCWxvb2t1cC0+dGFibGVbaW1pbl0ucmVhbHZhbCk7CisJCXJmX2x2bCAvPSAobG9va3VwLT50YWJsZVtpbWF4XS5yZWd2YWwgLQorCQkJCWxvb2t1cC0+dGFibGVbaW1pbl0ucmVndmFsKTsKKwkJcmZfbHZsICs9IGxvb2t1cC0+dGFibGVbaW1pbl0ucmVhbHZhbDsKKwl9IGVsc2UgaWYgKGFnY19nYWluID4gbG9va3VwLT50YWJsZVswXS5yZWd2YWwpCisJCXJmX2x2bCA9IDU7CisJZWxzZSBpZiAoYWdjX2dhaW4gPCBsb29rdXAtPnRhYmxlW2xvb2t1cC0+c2l6ZS0xXS5yZWd2YWwpCisJCXJmX2x2bCA9IC0xMDA7CiAKLQkJCQlpZiAoSU5SQU5HRShsb29rdXAtPnRhYmxlW2ltaW5dLnJlZ3ZhbCwgYWdjX2dhaW4sIGxvb2t1cC0+dGFibGVbaV0ucmVndmFsKSkKLQkJCQkJaW1heCA9IGk7Ci0JCQkJZWxzZQotCQkJCQlpbWluID0gaTsKLQkJCX0KLQotCQkJcmZfbHZsID0gKCgoczMyKWFnY19nYWluIC0gbG9va3VwLT50YWJsZVtpbWluXS5yZWd2YWwpCi0JCQkJCSogKGxvb2t1cC0+dGFibGVbaW1heF0ucmVhbHZhbCAtIGxvb2t1cC0+dGFibGVbaW1pbl0ucmVhbHZhbCkKLQkJCQkJLyAobG9va3VwLT50YWJsZVtpbWF4XS5yZWd2YWwgLSBsb29rdXAtPnRhYmxlW2ltaW5dLnJlZ3ZhbCkpCi0JCQkJCSsgbG9va3VwLT50YWJsZVtpbWluXS5yZWFsdmFsOwotCQl9IGVsc2UgaWYgKGFnY19nYWluID4gbG9va3VwLT50YWJsZVswXS5yZWd2YWwpCi0JCQlyZl9sdmwgPSA1OwotCQllbHNlIGlmIChhZ2NfZ2FpbiA8IGxvb2t1cC0+dGFibGVbbG9va3VwLT5zaXplLTFdLnJlZ3ZhbCkKLQkJCXJmX2x2bCA9IC0xMDA7Ci0KLQl9Ci0KLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJGTGV2ZWwgPSAlZFxuIiwgX19mdW5jX18sIHJmX2x2bCk7CisJZHByaW50aygiJXM6IFJGTGV2ZWwgPSAlZFxuIiwgX19mdW5jX18sIHJmX2x2bCk7CiAKIAlyZXR1cm4gcmZfbHZsOwogfQpAQCAtNjM0LDUwICs2MjMsNTEgQEAKIAlzMzIgcmZsZXZlbCA9IHN0djA5MDBfZ2V0X3JmX2xldmVsKGludGVybmFsLCAmc3R2MDkwMF9yZiwKIAkJCQkJCQkJc3RhdGUtPmRlbW9kKTsKIAotCSpzdHJlbmd0aCA9IChyZmxldmVsICsgMTAwKSAqICgxNjM4MyAvIDEwNSk7CisJcmZsZXZlbCA9IChyZmxldmVsICsgMTAwKSAqICg2NTUzNSAvIDcwKTsKKwlpZiAocmZsZXZlbCA8IDApCisJCXJmbGV2ZWwgPSAwOworCisJaWYgKHJmbGV2ZWwgPiA2NTUzNSkKKwkJcmZsZXZlbCA9IDY1NTM1OworCisJKnN0cmVuZ3RoID0gcmZsZXZlbDsKIAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBzMzIgc3R2MDkwMF9jYXJyX2dldF9xdWFsaXR5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAogCQkJCQljb25zdCBzdHJ1Y3Qgc3R2MDkwMF90YWJsZSAqbG9va3VwKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwogCi0JczMyIGNfbiA9IC0xMDAsCi0JCXJlZ3ZhbCwgaW1pbiwgaW1heCwKKwlzMzIJY19uID0gLTEwMCwKKwkJcmVndmFsLAorCQlpbWluLAorCQlpbWF4LAogCQlpLAotCQlsb2NrX2ZsYWdfZmllbGQsCiAJCW5vaXNlX2ZpZWxkMSwKIAkJbm9pc2VfZmllbGQwOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBfX2Z1bmNfXyk7CisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKIAotCWRtZF9yZWcobG9ja19mbGFnX2ZpZWxkLCBGMDkwMF9QMV9MT0NLX0RFRklOSVRJRiwKLQkJCQkJRjA5MDBfUDJfTE9DS19ERUZJTklUSUYpOwogCWlmIChzdHYwOTAwX2dldF9zdGFuZGFyZChmZSwgZGVtb2QpID09IFNUVjA5MDBfRFZCUzJfU1RBTkRBUkQpIHsKLQkJZG1kX3JlZyhub2lzZV9maWVsZDEsIEYwOTAwX1AxX05PU1BMSFRfTk9STUVEMSwKLQkJCQkJRjA5MDBfUDJfTk9TUExIVF9OT1JNRUQxKTsKLQkJZG1kX3JlZyhub2lzZV9maWVsZDAsIEYwOTAwX1AxX05PU1BMSFRfTk9STUVEMCwKLQkJCQkJRjA5MDBfUDJfTk9TUExIVF9OT1JNRUQwKTsKKwkJbm9pc2VfZmllbGQxID0gTk9TUExIVF9OT1JNRUQxOworCQlub2lzZV9maWVsZDAgPSBOT1NQTEhUX05PUk1FRDA7CiAJfSBlbHNlIHsKLQkJZG1kX3JlZyhub2lzZV9maWVsZDEsIEYwOTAwX1AxX05PU0RBVEFUX05PUk1FRDEsCi0JCQkJCUYwOTAwX1AyX05PU0RBVEFUX05PUk1FRDEpOwotCQlkbWRfcmVnKG5vaXNlX2ZpZWxkMCwgRjA5MDBfUDFfTk9TREFUQVRfTk9STUVEMCwKLQkJCQkJRjA5MDBfUDJfTk9TREFUQVRfTk9STUVEMCk7CisJCW5vaXNlX2ZpZWxkMSA9IE5PU0RBVEFUX05PUk1FRDE7CisJCW5vaXNlX2ZpZWxkMCA9IE5PU0RBVEFUX05PUk1FRDA7CiAJfQogCi0JaWYgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIGxvY2tfZmxhZ19maWVsZCkpIHsKKwlpZiAoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBMT0NLX0RFRklOSVRJRikpIHsKIAkJaWYgKChsb29rdXAgIT0gTlVMTCkgJiYgbG9va3VwLT5zaXplKSB7CiAJCQlyZWd2YWwgPSAwOwogCQkJbXNsZWVwKDUpOwogCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCQlyZWd2YWwgKz0gTUFLRVdPUkQoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywKKwkJCQlyZWd2YWwgKz0gTUFLRVdPUkQoc3R2MDkwMF9nZXRfYml0cyhpbnRwLAogCQkJCQkJCQlub2lzZV9maWVsZDEpLAotCQkJCQkJc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywKKwkJCQkJCXN0djA5MDBfZ2V0X2JpdHMoaW50cCwKIAkJCQkJCQkJbm9pc2VfZmllbGQwKSk7CiAJCQkJbXNsZWVwKDEpOwogCQkJfQpAQCAtNzE1LDEwICs3MDUsOSBAQAogc3RhdGljIGludCBzdHYwOTAwX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqIHVjYmxvY2tzKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwogCXU4IGVycl92YWwxLCBlcnJfdmFsMDsKLQlzMzIgZXJyX2ZpZWxkMSwgZXJyX2ZpZWxkMDsKIAl1MzIgaGVhZGVyX2Vycl92YWwgPSAwOwogCiAJKnVjYmxvY2tzID0gMHgwOwpAQCAtNzI2LDI0ICs3MTUsMTQgQEAKIAkJLyogRFZCLVMyIGRlbGluZWF0b3IgZXJyb3JzIGNvdW50ICovCiAKIAkJLyogcmV0cmVpdmluZyBudW1iZXIgZm9yIGVycm5vdXMgaGVhZGVycyAqLwotCQlkbWRfcmVnKGVycl9maWVsZDAsIFIwOTAwX1AxX0JCRkNSQ0tPMCwKLQkJCQkJUjA5MDBfUDJfQkJGQ1JDS08wKTsKLQkJZG1kX3JlZyhlcnJfZmllbGQxLCBSMDkwMF9QMV9CQkZDUkNLTzEsCi0JCQkJCVIwOTAwX1AyX0JCRkNSQ0tPMSk7Ci0KLQkJZXJyX3ZhbDEgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBlcnJfZmllbGQxKTsKLQkJZXJyX3ZhbDAgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBlcnJfZmllbGQwKTsKLQkJaGVhZGVyX2Vycl92YWwgPSAoZXJyX3ZhbDE8PDgpIHwgZXJyX3ZhbDA7CisJCWVycl92YWwxID0gc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBCQkZDUkNLTzEpOworCQllcnJfdmFsMCA9IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgQkJGQ1JDS08wKTsKKwkJaGVhZGVyX2Vycl92YWwgPSAoZXJyX3ZhbDEgPDwgOCkgfCBlcnJfdmFsMDsKIAogCQkvKiByZXRyZWl2aW5nIG51bWJlciBmb3IgZXJybm91cyBwYWNrZXRzICovCi0JCWRtZF9yZWcoZXJyX2ZpZWxkMCwgUjA5MDBfUDFfVVBDUkNLTzAsCi0JCQkJCVIwOTAwX1AyX1VQQ1JDS08wKTsKLQkJZG1kX3JlZyhlcnJfZmllbGQxLCBSMDkwMF9QMV9VUENSQ0tPMSwKLQkJCQkJUjA5MDBfUDJfVVBDUkNLTzEpOwotCi0JCWVycl92YWwxID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgZXJyX2ZpZWxkMSk7Ci0JCWVycl92YWwwID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgZXJyX2ZpZWxkMCk7Ci0JCSp1Y2Jsb2NrcyA9IChlcnJfdmFsMTw8OCkgfCBlcnJfdmFsMDsKKwkJZXJyX3ZhbDEgPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIFVQQ1JDS08xKTsKKwkJZXJyX3ZhbDAgPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIFVQQ1JDS08wKTsKKwkJKnVjYmxvY2tzID0gKGVycl92YWwxIDw8IDgpIHwgZXJyX3ZhbDA7CiAJCSp1Y2Jsb2NrcyArPSBoZWFkZXJfZXJyX3ZhbDsKIAl9CiAKQEAgLTc1MiwzMyArNzMxLDI3IEBACiAKIHN0YXRpYyBpbnQgc3R2MDkwMF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCiB7Ci0JKnNuciA9IHN0djA5MDBfY2Fycl9nZXRfcXVhbGl0eShmZSwKKwlzMzIgc25ybGNsID0gc3R2MDkwMF9jYXJyX2dldF9xdWFsaXR5KGZlLAogCQkJKGNvbnN0IHN0cnVjdCBzdHYwOTAwX3RhYmxlICopJnN0djA5MDBfczJfY24pOwotCSpzbnIgKz0gMzA7Ci0JKnNuciAqPSAoMTYzODMgLyAxMDMwKTsKKwlzbnJsY2wgPSAoc25ybGNsICsgMzApICogMzg0OworCWlmIChzbnJsY2wgPCAwKQorCQlzbnJsY2wgPSAwOworCisJaWYgKHNucmxjbCA+IDY1NTM1KQorCQlzbnJsY2wgPSA2NTUzNTsKKworCSpzbnIgPSBzbnJsY2w7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBzdHYwOTAwX2dldF9iZXIoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAorc3RhdGljIHUzMiBzdHYwOTAwX2dldF9iZXIoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKIAl1MzIgYmVyID0gMTAwMDAwMDAsIGk7Ci0JczMyIGRtZF9zdGF0ZV9yZWc7CiAJczMyIGRlbW9kX3N0YXRlOwotCXMzMiB2c3RhdHVzX3JlZzsKLQlzMzIgcHJ2aXRfZmllbGQ7Ci0JczMyIHBkZWxfc3RhdHVzX3JlZzsKLQlzMzIgcGRlbF9sb2NrX2ZpZWxkOwogCi0JZG1kX3JlZyhkbWRfc3RhdGVfcmVnLCBGMDkwMF9QMV9IRUFERVJfTU9ERSwgRjA5MDBfUDJfSEVBREVSX01PREUpOwotCWRtZF9yZWcodnN0YXR1c19yZWcsIFIwOTAwX1AxX1ZTVEFUVVNWSVQsIFIwOTAwX1AyX1ZTVEFUVVNWSVQpOwotCWRtZF9yZWcocHJ2aXRfZmllbGQsIEYwOTAwX1AxX1BSRlZJVCwgRjA5MDBfUDJfUFJGVklUKTsKLQlkbWRfcmVnKHBkZWxfc3RhdHVzX3JlZywgUjA5MDBfUDFfUERFTFNUQVRVUzEsIFIwOTAwX1AyX1BERUxTVEFUVVMxKTsKLQlkbWRfcmVnKHBkZWxfbG9ja19maWVsZCwgRjA5MDBfUDFfUEtUREVMSU5fTE9DSywKLQkJCQlGMDkwMF9QMl9QS1RERUxJTl9MT0NLKTsKLQotCWRlbW9kX3N0YXRlID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgZG1kX3N0YXRlX3JlZyk7CisJZGVtb2Rfc3RhdGUgPSBzdHYwOTAwX2dldF9iaXRzKGludHAsIEhFQURFUl9NT0RFKTsKIAogCXN3aXRjaCAoZGVtb2Rfc3RhdGUpIHsKIAljYXNlIFNUVjA5MDBfU0VBUkNIOgpAQCAtNzkwLDExICs3NjMsMTEgQEAKIAkJYmVyID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQkJbXNsZWVwKDUpOwotCQkJYmVyICs9IHN0djA5MDBfZ2V0X2Vycl9jb3VudChpX3BhcmFtcywgMCwgZGVtb2QpOworCQkJYmVyICs9IHN0djA5MDBfZ2V0X2Vycl9jb3VudChpbnRwLCAwLCBkZW1vZCk7CiAJCX0KIAogCQliZXIgLz0gNTsKLQkJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIHBydml0X2ZpZWxkKSkgeworCQlpZiAoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBQUkZWSVQpKSB7CiAJCQliZXIgKj0gOTc2NjsKIAkJCWJlciA9IGJlciA+PiAxMzsKIAkJfQpAQCAtODA0LDExICs3NzcsMTEgQEAKIAkJYmVyID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQkJbXNsZWVwKDUpOwotCQkJYmVyICs9IHN0djA5MDBfZ2V0X2Vycl9jb3VudChpX3BhcmFtcywgMCwgZGVtb2QpOworCQkJYmVyICs9IHN0djA5MDBfZ2V0X2Vycl9jb3VudChpbnRwLCAwLCBkZW1vZCk7CiAJCX0KIAogCQliZXIgLz0gNTsKLQkJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIHBkZWxfbG9ja19maWVsZCkpIHsKKwkJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgUEtUREVMSU5fTE9DSykpIHsKIAkJCWJlciAqPSA5NzY2OwogCQkJYmVyID0gYmVyID4+IDEzOwogCQl9CkBAIC04MjksMjAgKzgwMiwxNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitpbnQgc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QsIHMzMiB0aW1lX291dCkKIHsKIAlzMzIgdGltZXIgPSAwLAotCQlsb2NrID0gMCwKLQkJaGVhZGVyX2ZpZWxkLAotCQlsb2NrX2ZpZWxkOworCQlsb2NrID0gMDsKIAogCWVudW0gZmVfc3R2MDkwMF9zZWFyY2hfc3RhdGUJZG1kX3N0YXRlOwogCi0JZG1kX3JlZyhoZWFkZXJfZmllbGQsIEYwOTAwX1AxX0hFQURFUl9NT0RFLCBGMDkwMF9QMl9IRUFERVJfTU9ERSk7Ci0JZG1kX3JlZyhsb2NrX2ZpZWxkLCBGMDkwMF9QMV9MT0NLX0RFRklOSVRJRiwgRjA5MDBfUDJfTE9DS19ERUZJTklUSUYpOwogCXdoaWxlICgodGltZXIgPCB0aW1lX291dCkgJiYgKGxvY2sgPT0gMCkpIHsKLQkJZG1kX3N0YXRlID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgaGVhZGVyX2ZpZWxkKTsKKwkJZG1kX3N0YXRlID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBIRUFERVJfTU9ERSk7CiAJCWRwcmludGsoIkRlbW9kIFN0YXRlID0gJWRcbiIsIGRtZF9zdGF0ZSk7CiAJCXN3aXRjaCAoZG1kX3N0YXRlKSB7CiAJCWNhc2UgU1RWMDkwMF9TRUFSQ0g6CkBAIC04NTIsNyArODIxLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFNUVjA5MDBfRFZCUzJfRk9VTkQ6CiAJCWNhc2UgU1RWMDkwMF9EVkJTX0ZPVU5EOgotCQkJbG9jayA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIGxvY2tfZmllbGQpOworCQkJbG9jayA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgTE9DS19ERUZJTklUSUYpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtODcwLDU2ICs4MzksNDAgQEAKIAlyZXR1cm4gbG9jazsKIH0KIAotdm9pZCBzdHYwOTAwX3N0b3BfYWxsX3MyX21vZGNvZChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCit2b2lkIHN0djA5MDBfc3RvcF9hbGxfczJfbW9kY29kKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7CiAJczMyIHJlZ2ZsaXN0LAogCWk7CiAKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCi0JZG1kX3JlZyhyZWdmbGlzdCwgUjA5MDBfUDFfTU9EQ09ETFNUMCwgUjA5MDBfUDJfTU9EQ09ETFNUMCk7CisJcmVnZmxpc3QgPSBNT0RDT0RMU1QwOwogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCByZWdmbGlzdCArIGksIDB4ZmYpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCByZWdmbGlzdCArIGksIDB4ZmYpOwogfQogCi12b2lkIHN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kZShzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCit2b2lkIHN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7CiAJdTMyIG1hdHlwZSwKLQltb2RfY29kZSwKLQlmbW9kLAotCXJlZ19pbmRleCwKLQlmaWVsZF9pbmRleDsKKwkJbW9kX2NvZGUsCisJCWZtb2QsCisJCXJlZ19pbmRleCwKKwkJZmllbGRfaW5kZXg7CiAKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKGlfcGFyYW1zLT5jaGlwX2lkIDw9IDB4MTEpIHsKKwlpZiAoaW50cC0+Y2hpcF9pZCA8PSAweDExKSB7CiAJCW1zbGVlcCg1KTsKIAotCQlzd2l0Y2ggKGRlbW9kKSB7Ci0JCWNhc2UgU1RWMDkwMF9ERU1PRF8xOgotCQlkZWZhdWx0OgotCQkJbW9kX2NvZGUgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLAotCQkJCQkJCVIwOTAwX1AxX1BMSE1PRENPRCk7Ci0JCQltYXR5cGUgPSBtb2RfY29kZSAmIDB4MzsKLQkJCW1vZF9jb2RlID0gKG1vZF9jb2RlICYgMHg3ZikgPj4gMjsKKwkJbW9kX2NvZGUgPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIFBMSE1PRENPRCk7CisJCW1hdHlwZSA9IG1vZF9jb2RlICYgMHgzOworCQltb2RfY29kZSA9IChtb2RfY29kZSAmIDB4N2YpID4+IDI7CiAKLQkJCXJlZ19pbmRleCA9IFIwOTAwX1AxX01PRENPRExTVEYgLSBtb2RfY29kZSAvIDI7Ci0JCQlmaWVsZF9pbmRleCA9IG1vZF9jb2RlICUgMjsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCW1vZF9jb2RlID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywKLQkJCQkJCQlSMDkwMF9QMl9QTEhNT0RDT0QpOwotCQkJbWF0eXBlID0gbW9kX2NvZGUgJiAweDM7Ci0JCQltb2RfY29kZSA9IChtb2RfY29kZSAmIDB4N2YpID4+IDI7Ci0KLQkJCXJlZ19pbmRleCA9IFIwOTAwX1AyX01PRENPRExTVEYgLSBtb2RfY29kZSAvIDI7Ci0JCQlmaWVsZF9pbmRleCA9IG1vZF9jb2RlICUgMjsKLQkJCWJyZWFrOwotCQl9Ci0KKwkJcmVnX2luZGV4ID0gTU9EQ09ETFNURiAtIG1vZF9jb2RlIC8gMjsKKwkJZmllbGRfaW5kZXggPSBtb2RfY29kZSAlIDI7CiAKIAkJc3dpdGNoIChtYXR5cGUpIHsKIAkJY2FzZSAwOgpAQCAtOTM4LDcwICs4OTEsNDEgQEAKIAkJfQogCiAJCWlmICgoSU5SQU5HRShTVFYwOTAwX1FQU0tfMTIsIG1vZF9jb2RlLCBTVFYwOTAwXzhQU0tfOTEwKSkKLQkJCQkJCQkmJiAobWF0eXBlIDw9IDEpKSB7CisJCQkJCQkmJiAobWF0eXBlIDw9IDEpKSB7CiAJCQlpZiAoZmllbGRfaW5kZXggPT0gMCkKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgcmVnX2luZGV4LAorCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIHJlZ19pbmRleCwKIAkJCQkJCQkweGYwIHwgZm1vZCk7CiAJCQllbHNlCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHJlZ19pbmRleCwKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCByZWdfaW5kZXgsCiAJCQkJCQkJKGZtb2QgPDwgNCkgfCAweGYpOwogCQl9Ci0JfSBlbHNlIGlmIChpX3BhcmFtcy0+Y2hpcF9pZCA+PSAweDEyKSB7Ci0JCXN3aXRjaCAoZGVtb2QpIHsKLQkJY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JCWRlZmF1bHQ6Ci0JCQlmb3IgKHJlZ19pbmRleCA9IDA7IHJlZ19pbmRleCA8IDc7IHJlZ19pbmRleCsrKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9NT0RDT0RMU1QwICsgcmVnX2luZGV4LCAweGZmKTsKIAotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX01PRENPRExTVEUsIDB4ZmYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX01PRENPRExTVEYsIDB4Y2YpOwotCQkJZm9yIChyZWdfaW5kZXggPSAwOyByZWdfaW5kZXggPCA4OyByZWdfaW5kZXgrKykKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfTU9EQ09ETFNUNyArIHJlZ19pbmRleCwgMHhjYyk7CisJfSBlbHNlIGlmIChpbnRwLT5jaGlwX2lkID49IDB4MTIpIHsKKwkJZm9yIChyZWdfaW5kZXggPSAwOyByZWdfaW5kZXggPCA3OyByZWdfaW5kZXgrKykKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIE1PRENPRExTVDAgKyByZWdfaW5kZXgsIDB4ZmYpOwogCi0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0RFTU9EXzI6Ci0JCQlmb3IgKHJlZ19pbmRleCA9IDA7IHJlZ19pbmRleCA8IDc7IHJlZ19pbmRleCsrKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9NT0RDT0RMU1QwICsgcmVnX2luZGV4LCAweGZmKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgTU9EQ09ETFNURSwgMHhmZik7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIE1PRENPRExTVEYsIDB4Y2YpOworCQlmb3IgKHJlZ19pbmRleCA9IDA7IHJlZ19pbmRleCA8IDg7IHJlZ19pbmRleCsrKQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgTU9EQ09ETFNUNyArIHJlZ19pbmRleCwgMHhjYyk7CiAKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9NT0RDT0RMU1RFLCAweGZmKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9NT0RDT0RMU1RGLCAweGNmKTsKLQkJCWZvciAocmVnX2luZGV4ID0gMDsgcmVnX2luZGV4IDwgODsgcmVnX2luZGV4KyspCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX01PRENPRExTVDcgKyByZWdfaW5kZXgsIDB4Y2MpOwotCi0JCQlicmVhazsKLQkJfQogCiAJfQogfQogCi12b2lkIHN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kZV9zaW5nbGUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAordm9pZCBzdHYwOTAwX2FjdGl2YXRlX3MyX21vZGNvZF9zaW5nbGUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7CiAJdTMyIHJlZ19pbmRleDsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgX19mdW5jX18pOworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX01PRENPRExTVDAsIDB4ZmYpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfTU9EQ09ETFNUMSwgMHhmMCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9NT0RDT0RMU1RGLCAweDBmKTsKLQkJZm9yIChyZWdfaW5kZXggPSAwOyByZWdfaW5kZXggPCAxMzsgcmVnX2luZGV4KyspCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywKLQkJCQkJUjA5MDBfUDFfTU9EQ09ETFNUMiArIHJlZ19pbmRleCwgMCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgTU9EQ09ETFNUMCwgMHhmZik7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgTU9EQ09ETFNUMSwgMHhmMCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgTU9EQ09ETFNURiwgMHgwZik7CisJZm9yIChyZWdfaW5kZXggPSAwOyByZWdfaW5kZXggPCAxMzsgcmVnX2luZGV4KyspCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIE1PRENPRExTVDIgKyByZWdfaW5kZXgsIDApOwogCi0JCWJyZWFrOwotCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfTU9EQ09ETFNUMCwgMHhmZik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9NT0RDT0RMU1QxLCAweGYwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX01PRENPRExTVEYsIDB4MGYpOwotCQlmb3IgKHJlZ19pbmRleCA9IDA7IHJlZ19pbmRleCA8IDEzOyByZWdfaW5kZXgrKykKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLAotCQkJCQlSMDkwMF9QMl9NT0RDT0RMU1QyICsgcmVnX2luZGV4LCAwKTsKLQotCQlicmVhazsKLQl9CiB9CiAKIHN0YXRpYyBlbnVtIGR2YmZlX2FsZ28gc3R2MDkwMF9mcm9udGVuZF9hbGdvKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQpAQCAtMTAxMiw3ICs5MzYsNyBAQAogc3RhdGljIGludCBzdGIwOTAwX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQlzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnApCiB7Ci0JZHByaW50ayhLRVJOX0lORk8gIiVzKC4uKVxuIiwgX19mdW5jX18pOworCWRwcmludGsoIiVzKC4uKVxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDIwLDE2NiArOTQ0LDEyMyBAQAogc3RhdGljIGludCBzdGIwOTAwX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQlzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnApCiB7Ci0JZHByaW50ayhLRVJOX0lORk8gIiVzKC4uKVxuIiwgX19mdW5jX18pOworCWRwcmludGsoIiVzKC4uKVxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgc3R2MDkwMF9zdGFydF9zZWFyY2goc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAordm9pZCBzdHYwOTAwX3N0YXJ0X3NlYXJjaChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQogeworCXUzMiBmcmVxOworCXMxNiBmcmVxX3MxNiA7CiAKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9JMkNfREVNT0RfTU9ERSwgMHgxZik7CisJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIERFTU9EX01PREUsIDB4MWYpOworCWlmIChpbnRwLT5jaGlwX2lkID09IDB4MTApCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENPUlJFTEVYUCwgMHhhYSk7CiAKLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID09IDB4MTApCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ09SUkVMRVhQLCAweGFhKTsKKwlpZiAoaW50cC0+Y2hpcF9pZCA8IDB4MjApCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkhEUiwgMHg1NSk7CiAKLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkIDwgMHgyMCkKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJIRFIsIDB4NTUpOwotCi0JCWlmIChpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSA8PSA1MDAwMDAwKSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSQ0ZHLCAweDQ0KTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DRlJVUDEsIDB4MGYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUlVQMCwgMHhmZik7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSTE9XMSwgMHhmMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSTE9XMCwgMHgwMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfUlRDUzIsIDB4NjgpOworCWlmIChpbnRwLT5jaGlwX2lkIDw9IDB4MjApIHsKKwkJaWYgKGludHAtPnN5bWJvbF9yYXRlWzBdIDw9IDUwMDAwMDApIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkNGRywgMHg0NCk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJVUDEsIDB4MGYpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSVVAwLCAweGZmKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENGUkxPVzEsIDB4ZjApOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSTE9XMCwgMHgwMCk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSVENTMiwgMHg2OCk7CiAJCX0gZWxzZSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSQ0ZHLCAweGM0KTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9SVENTMiwgMHg0NCk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJDRkcsIDB4YzQpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUlRDUzIsIDB4NDQpOwogCQl9CiAKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQxLCAwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQwLCAwKTsKKwl9IGVsc2UgeyAvKmN1dCAzLjAgYWJvdmUqLworCQlpZiAoaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdIDw9IDUwMDAwMDApCisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSVENTMiwgMHg2OCk7CisJCWVsc2UKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFJUQ1MyLCAweDQ0KTsKIAotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0VRVUFMQ0ZHLCAweDQxKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9GRkVDRkcsIDB4NDEpOwotCi0JCQlpZiAoKGlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQgPT0gU1RWMDkwMF9TRUFSQ0hfRFZCUzEpIHx8IChpX3BhcmFtcy0+ZG1kMV9zcmNoX3N0YW5kYXJkID09IFNUVjA5MDBfU0VBUkNIX0RTUykgfHwgKGlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQgPT0gU1RWMDkwMF9BVVRPX1NFQVJDSCkpIHsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVklUU0NBTEUsIDB4ODIpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9WQVZTUlZJVCwgMHgwKTsKLQkJCX0KLQkJfQotCi0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJTVEVQLCAweDAwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1RNR1RIUklTRSwgMHhlMCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdUSEZBTEwsIDB4YzApOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1NDQU5fRU5BQkxFLCAwKTsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9DRlJfQVVUT1NDQU4sIDApOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1MxUzJfU0VRVUVOVElBTCwgMCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9SVEMsIDB4ODgpOwotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlIDwgMjAwMDAwMCkgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJGUkVRLCAweDM5KTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSSERSLCAweDQwKTsKLQkJCX0KLQotCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlIDwgMTAwMDAwMDApIHsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSRlJFUSwgMHg0Yyk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NBUkhEUiwgMHgyMCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJGUkVRLCAweDRiKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSSERSLCAweDIwKTsKLQkJCX0KLQorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJDRkcsIDB4NDYpOworCQlpZiAoaW50cC0+c3JjaF9hbGdvW2RlbW9kXSA9PSBTVFYwOTAwX1dBUk1fU1RBUlQpIHsKKwkJCWZyZXEgPSAxMDAwIDw8IDE2OworCQkJZnJlcSAvPSAoaW50cC0+bWNsayAvIDEwMDApOworCQkJZnJlcV9zMTYgPSAoczE2KWZyZXE7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGUgPCAxMDAwMDAwMCkKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSRlJFUSwgMHhlZik7CisJCQlmcmVxID0gKGludHAtPnNyY2hfcmFuZ2VbZGVtb2RdIC8gMjAwMCk7CisJCQlpZiAoaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdIDw9IDUwMDAwMDApCisJCQkJZnJlcSArPSA4MDsKIAkJCWVsc2UKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSRlJFUSwgMHhlZCk7CisJCQkJZnJlcSArPSA2MDA7CisKKwkJCWZyZXEgPSBmcmVxIDw8IDE2OworCQkJZnJlcSAvPSAoaW50cC0+bWNsayAvIDEwMDApOworCQkJZnJlcV9zMTYgPSAoczE2KWZyZXE7CiAJCX0KIAotCQlzd2l0Y2ggKGlfcGFyYW1zLT5kbWQxX3NyY2hfYWxnbykgewotCQljYXNlIFNUVjA5MDBfV0FSTV9TVEFSVDoKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MWYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0NPTERfU1RBUlQ6Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1ESVNUQVRFLCAweDFmKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MTUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIENGUl9VUDEsIE1TQihmcmVxX3MxNikpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgQ0ZSX1VQMCwgTFNCKGZyZXFfczE2KSk7CisJCWZyZXFfczE2ICo9ICgtMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBDRlJfTE9XMSwgTVNCKGZyZXFfczE2KSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBDRlJfTE9XMCwgTFNCKGZyZXFfczE2KSk7CisJfQorCisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDEsIDApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENGUklOSVQwLCAwKTsKKworCWlmIChpbnRwLT5jaGlwX2lkID49IDB4MjApIHsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRVFVQUxDRkcsIDB4NDEpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBGRkVDRkcsIDB4NDEpOworCisJCWlmICgoaW50cC0+c3JjaF9zdGFuZGFyZFtkZW1vZF0gPT0gU1RWMDkwMF9TRUFSQ0hfRFZCUzEpIHx8CisJCQkoaW50cC0+c3JjaF9zdGFuZGFyZFtkZW1vZF0gPT0gU1RWMDkwMF9TRUFSQ0hfRFNTKSB8fAorCQkJKGludHAtPnNyY2hfc3RhbmRhcmRbZGVtb2RdID09IFNUVjA5MDBfQVVUT19TRUFSQ0gpKSB7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBWSVRTQ0FMRSwKKwkJCQkJCQkJMHg4Mik7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBWQVZTUlZJVCwgMHgwKTsKKwkJfQorCX0KKworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUlNURVAsIDB4MDApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFRNR1RIUklTRSwgMHhlMCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVE1HVEhGQUxMLCAweGMwKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgU0NBTl9FTkFCTEUsIDApOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBDRlJfQVVUT1NDQU4sIDApOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBTMVMyX1NFUVVFTlRJQUwsIDApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFJUQywgMHg4OCk7CisJaWYgKGludHAtPmNoaXBfaWQgPj0gMHgyMCkgeworCQlpZiAoaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdIDwgMjAwMDAwMCkgeworCQkJaWYgKGludHAtPmNoaXBfaWQgPD0gMHgyMCkKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJGUkVRLCAweDM5KTsKKwkJCWVsc2UgIC8qY3V0IDMuMCovCisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSRlJFUSwgMHg4OSk7CisKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkhEUiwgMHg0MCk7CisJCX0gZWxzZSBpZiAoaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdIDwgMTAwMDAwMDApIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4NGMpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSSERSLCAweDIwKTsKKwkJfSBlbHNlIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4NGIpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSSERSLCAweDIwKTsKIAkJfQogCisJfSBlbHNlIHsKKwkJaWYgKGludHAtPnN5bWJvbF9yYXRlW2RlbW9kXSA8IDEwMDAwMDAwKQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSRlJFUSwgMHhlZik7CisJCWVsc2UKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4ZWQpOworCX0KKworCXN3aXRjaCAoaW50cC0+c3JjaF9hbGdvW2RlbW9kXSkgeworCWNhc2UgU1RWMDkwMF9XQVJNX1NUQVJUOgorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURJU1RBVEUsIDB4MWYpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURJU1RBVEUsIDB4MTgpOwogCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9JMkNfREVNT0RfTU9ERSwgMHgxZik7Ci0JCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA9PSAweDEwKQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NPUlJFTEVYUCwgMHhhYSk7Ci0KLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkIDwgMHgyMCkKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJIRFIsIDB4NTUpOwotCi0JCWlmIChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA8PSA1MDAwMDAwKSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0FSQ0ZHLCAweDQ0KTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJVUDEsIDB4MGYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUlVQMCwgMHhmZik7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSTE9XMSwgMHhmMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSTE9XMCwgMHgwMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfUlRDUzIsIDB4NjgpOwotCQl9IGVsc2UgewotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkNGRywgMHhjNCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfUlRDUzIsIDB4NDQpOwotCQl9Ci0KLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUklOSVQxLCAwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUklOSVQwLCAwKTsKLQotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0VRVUFMQ0ZHLCAweDQxKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9GRkVDRkcsIDB4NDEpOwotCQkJaWYgKChpX3BhcmFtcy0+ZG1kMl9zcmNoX3N0bmRyZCA9PSBTVFYwOTAwX1NFQVJDSF9EVkJTMSkgfHwgKGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkID09IFNUVjA5MDBfU0VBUkNIX0RTUykgfHwgKGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkID09IFNUVjA5MDBfQVVUT19TRUFSQ0gpKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1ZJVFNDQUxFLCAweDgyKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVkFWU1JWSVQsIDB4MCk7Ci0JCQl9Ci0JCX0KLQotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSU1RFUCwgMHgwMCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTUdUSFJJU0UsIDB4ZTApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HVEhGQUxMLCAweGMwKTsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9TQ0FOX0VOQUJMRSwgMCk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfQ0ZSX0FVVE9TQ0FOLCAwKTsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9TMVMyX1NFUVVFTlRJQUwsIDApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfUlRDLCAweDg4KTsKLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApIHsKLQkJCWlmIChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA8IDIwMDAwMDApIHsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0FSRlJFUSwgMHgzOSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkhEUiwgMHg0MCk7Ci0JCQl9Ci0KLQkJCWlmIChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA8IDEwMDAwMDAwKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkZSRVEsIDB4NGMpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJIRFIsIDB4MjApOwotCQkJfSBlbHNlIHsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0FSRlJFUSwgMHg0Yik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkhEUiwgMHgyMCk7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA8IDEwMDAwMDAwKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJGUkVRLCAweGVmKTsKLQkJCWVsc2UKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0FSRlJFUSwgMHhlZCk7Ci0JCX0KLQotCQlzd2l0Y2ggKGlfcGFyYW1zLT5kbWQyX3NyY2hfYWxnbykgewotCQljYXNlIFNUVjA5MDBfV0FSTV9TVEFSVDoKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MWYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRElTVEFURSwgMHgxOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0NPTERfU1RBUlQ6Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1ESVNUQVRFLCAweDFmKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MTUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCisJY2FzZSBTVFYwOTAwX0NPTERfU1RBUlQ6CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxZik7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxNSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIH0KQEAgLTExODgsMzMgKzEwNjksNDAgQEAKIAkJCQkJCQlzMzIgcGlsb3QsIHU4IGNoaXBfaWQpCiB7CiAJdTggYWNsY192YWx1ZSA9IDB4Mjk7Ci0JczMyCWk7Ci0JY29uc3Qgc3RydWN0IHN0djA5MDBfY2FyX2xvb3Bfb3B0aW0gKmNhcl9sb29wX3MyOworCXMzMiBpOworCWNvbnN0IHN0cnVjdCBzdHYwOTAwX2Nhcl9sb29wX29wdGltICpjbHMyLCAqY2xscXMyLCAqY2xsYXMyOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBfX2Z1bmNfXyk7CisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKIAotCWlmIChjaGlwX2lkIDw9IDB4MTIpCi0JCWNhcl9sb29wX3MyID0gRkVfU1RWMDkwMF9TMkNhckxvb3A7Ci0JZWxzZSBpZiAoY2hpcF9pZCA9PSAweDIwKQotCQljYXJfbG9vcF9zMiA9IEZFX1NUVjA5MDBfUzJDYXJMb29wQ3V0MjA7Ci0JZWxzZQotCQljYXJfbG9vcF9zMiA9IEZFX1NUVjA5MDBfUzJDYXJMb29wOworCWlmIChjaGlwX2lkIDw9IDB4MTIpIHsKKwkJY2xzMiA9IEZFX1NUVjA5MDBfUzJDYXJMb29wOworCQljbGxxczIgPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MzA7CisJCWNsbGFzMiA9IEZFX1NUVjA5MDBfUzJBUFNLQ2FyTG9vcEN1dDMwOworCX0gZWxzZSBpZiAoY2hpcF9pZCA9PSAweDIwKSB7CisJCWNsczIgPSBGRV9TVFYwOTAwX1MyQ2FyTG9vcEN1dDIwOworCQljbGxxczIgPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MjA7CisJCWNsbGFzMiA9IEZFX1NUVjA5MDBfUzJBUFNLQ2FyTG9vcEN1dDIwOworCX0gZWxzZSB7CisJCWNsczIgPSBGRV9TVFYwOTAwX1MyQ2FyTG9vcEN1dDMwOworCQljbGxxczIgPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MzA7CisJCWNsbGFzMiA9IEZFX1NUVjA5MDBfUzJBUFNLQ2FyTG9vcEN1dDMwOworCX0KIAogCWlmIChtb2Rjb2RlIDwgU1RWMDkwMF9RUFNLXzEyKSB7CiAJCWkgPSAwOwotCQl3aGlsZSAoKGkgPCAzKSAmJiAobW9kY29kZSAhPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MjBbaV0ubW9kY29kZSkpCisJCXdoaWxlICgoaSA8IDMpICYmIChtb2Rjb2RlICE9IGNsbHFzMltpXS5tb2Rjb2RlKSkKIAkJCWkrKzsKIAogCQlpZiAoaSA+PSAzKQogCQkJaSA9IDI7CiAJfSBlbHNlIHsKIAkJaSA9IDA7Ci0JCXdoaWxlICgoaSA8IDE0KSAmJiAobW9kY29kZSAhPSBjYXJfbG9vcF9zMltpXS5tb2Rjb2RlKSkKKwkJd2hpbGUgKChpIDwgMTQpICYmIChtb2Rjb2RlICE9IGNsczJbaV0ubW9kY29kZSkpCiAJCQlpKys7CiAKIAkJaWYgKGkgPj0gMTQpIHsKIAkJCWkgPSAwOwotCQkJd2hpbGUgKChpIDwgMTEpICYmIChtb2Rjb2RlICE9IEZFX1NUVjA5MDBfUzJBUFNLQ2FyTG9vcEN1dDIwW2ldLm1vZGNvZGUpKQorCQkJd2hpbGUgKChpIDwgMTEpICYmIChtb2Rjb2RlICE9IGNsbGFzMltpXS5tb2Rjb2RlKSkKIAkJCQlpKys7CiAKIAkJCWlmIChpID49IDExKQpAQCAtMTIyNSw3NiArMTExMyw4MiBAQAogCWlmIChtb2Rjb2RlIDw9IFNUVjA5MDBfUVBTS18yNSkgewogCQlpZiAocGlsb3QpIHsKIAkJCWlmIChzcmF0ZSA8PSAzMDAwMDAwKQotCQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MjBbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzI7CisJCQkJYWNsY192YWx1ZSA9IGNsbHFzMltpXS5jYXJfbG9vcF9waWxvdHNfb25fMjsKIAkJCWVsc2UgaWYgKHNyYXRlIDw9IDcwMDAwMDApCi0JCQkJYWNsY192YWx1ZSA9IEZFX1NUVjA5MDBfUzJMb3dRUENhckxvb3BDdXQyMFtpXS5jYXJfbG9vcF9waWxvdHNfb25fNTsKKwkJCQlhY2xjX3ZhbHVlID0gY2xscXMyW2ldLmNhcl9sb29wX3BpbG90c19vbl81OwogCQkJZWxzZSBpZiAoc3JhdGUgPD0gMTUwMDAwMDApCi0JCQkJYWNsY192YWx1ZSA9IEZFX1NUVjA5MDBfUzJMb3dRUENhckxvb3BDdXQyMFtpXS5jYXJfbG9vcF9waWxvdHNfb25fMTA7CisJCQkJYWNsY192YWx1ZSA9IGNsbHFzMltpXS5jYXJfbG9vcF9waWxvdHNfb25fMTA7CiAJCQllbHNlIGlmIChzcmF0ZSA8PSAyNTAwMDAwMCkKLQkJCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMkxvd1FQQ2FyTG9vcEN1dDIwW2ldLmNhcl9sb29wX3BpbG90c19vbl8yMDsKKwkJCQlhY2xjX3ZhbHVlID0gY2xscXMyW2ldLmNhcl9sb29wX3BpbG90c19vbl8yMDsKIAkJCWVsc2UKLQkJCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMkxvd1FQQ2FyTG9vcEN1dDIwW2ldLmNhcl9sb29wX3BpbG90c19vbl8zMDsKKwkJCQlhY2xjX3ZhbHVlID0gY2xscXMyW2ldLmNhcl9sb29wX3BpbG90c19vbl8zMDsKIAkJfSBlbHNlIHsKIAkJCWlmIChzcmF0ZSA8PSAzMDAwMDAwKQotCQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MjBbaV0uY2FyX2xvb3BfcGlsb3RzX29mZl8yOworCQkJCWFjbGNfdmFsdWUgPSBjbGxxczJbaV0uY2FyX2xvb3BfcGlsb3RzX29mZl8yOwogCQkJZWxzZSBpZiAoc3JhdGUgPD0gNzAwMDAwMCkKLQkJCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMkxvd1FQQ2FyTG9vcEN1dDIwW2ldLmNhcl9sb29wX3BpbG90c19vZmZfNTsKKwkJCQlhY2xjX3ZhbHVlID0gY2xscXMyW2ldLmNhcl9sb29wX3BpbG90c19vZmZfNTsKIAkJCWVsc2UgaWYgKHNyYXRlIDw9IDE1MDAwMDAwKQotCQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MjBbaV0uY2FyX2xvb3BfcGlsb3RzX29mZl8xMDsKKwkJCQlhY2xjX3ZhbHVlID0gY2xscXMyW2ldLmNhcl9sb29wX3BpbG90c19vZmZfMTA7CiAJCQllbHNlIGlmIChzcmF0ZSA8PSAyNTAwMDAwMCkKLQkJCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMkxvd1FQQ2FyTG9vcEN1dDIwW2ldLmNhcl9sb29wX3BpbG90c19vZmZfMjA7CisJCQkJYWNsY192YWx1ZSA9IGNsbHFzMltpXS5jYXJfbG9vcF9waWxvdHNfb2ZmXzIwOwogCQkJZWxzZQotCQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MjBbaV0uY2FyX2xvb3BfcGlsb3RzX29mZl8zMDsKKwkJCQlhY2xjX3ZhbHVlID0gY2xscXMyW2ldLmNhcl9sb29wX3BpbG90c19vZmZfMzA7CiAJCX0KIAogCX0gZWxzZSBpZiAobW9kY29kZSA8PSBTVFYwOTAwXzhQU0tfOTEwKSB7CiAJCWlmIChwaWxvdCkgewogCQkJaWYgKHNyYXRlIDw9IDMwMDAwMDApCi0JCQkJYWNsY192YWx1ZSA9IGNhcl9sb29wX3MyW2ldLmNhcl9sb29wX3BpbG90c19vbl8yOworCQkJCWFjbGNfdmFsdWUgPSBjbHMyW2ldLmNhcl9sb29wX3BpbG90c19vbl8yOwogCQkJZWxzZSBpZiAoc3JhdGUgPD0gNzAwMDAwMCkKLQkJCQlhY2xjX3ZhbHVlID0gY2FyX2xvb3BfczJbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzU7CisJCQkJYWNsY192YWx1ZSA9IGNsczJbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzU7CiAJCQllbHNlIGlmIChzcmF0ZSA8PSAxNTAwMDAwMCkKLQkJCQlhY2xjX3ZhbHVlID0gY2FyX2xvb3BfczJbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzEwOworCQkJCWFjbGNfdmFsdWUgPSBjbHMyW2ldLmNhcl9sb29wX3BpbG90c19vbl8xMDsKIAkJCWVsc2UgaWYgKHNyYXRlIDw9IDI1MDAwMDAwKQotCQkJCWFjbGNfdmFsdWUgPSBjYXJfbG9vcF9zMltpXS5jYXJfbG9vcF9waWxvdHNfb25fMjA7CisJCQkJYWNsY192YWx1ZSA9IGNsczJbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzIwOwogCQkJZWxzZQotCQkJCWFjbGNfdmFsdWUgPSBjYXJfbG9vcF9zMltpXS5jYXJfbG9vcF9waWxvdHNfb25fMzA7CisJCQkJYWNsY192YWx1ZSA9IGNsczJbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzMwOwogCQl9IGVsc2UgewogCQkJaWYgKHNyYXRlIDw9IDMwMDAwMDApCi0JCQkJYWNsY192YWx1ZSA9IGNhcl9sb29wX3MyW2ldLmNhcl9sb29wX3BpbG90c19vZmZfMjsKKwkJCQlhY2xjX3ZhbHVlID0gY2xzMltpXS5jYXJfbG9vcF9waWxvdHNfb2ZmXzI7CiAJCQllbHNlIGlmIChzcmF0ZSA8PSA3MDAwMDAwKQotCQkJCWFjbGNfdmFsdWUgPSBjYXJfbG9vcF9zMltpXS5jYXJfbG9vcF9waWxvdHNfb2ZmXzU7CisJCQkJYWNsY192YWx1ZSA9IGNsczJbaV0uY2FyX2xvb3BfcGlsb3RzX29mZl81OwogCQkJZWxzZSBpZiAoc3JhdGUgPD0gMTUwMDAwMDApCi0JCQkJYWNsY192YWx1ZSA9IGNhcl9sb29wX3MyW2ldLmNhcl9sb29wX3BpbG90c19vZmZfMTA7CisJCQkJYWNsY192YWx1ZSA9IGNsczJbaV0uY2FyX2xvb3BfcGlsb3RzX29mZl8xMDsKIAkJCWVsc2UgaWYgKHNyYXRlIDw9IDI1MDAwMDAwKQotCQkJCWFjbGNfdmFsdWUgPSBjYXJfbG9vcF9zMltpXS5jYXJfbG9vcF9waWxvdHNfb2ZmXzIwOworCQkJCWFjbGNfdmFsdWUgPSBjbHMyW2ldLmNhcl9sb29wX3BpbG90c19vZmZfMjA7CiAJCQllbHNlCi0JCQkJYWNsY192YWx1ZSA9IGNhcl9sb29wX3MyW2ldLmNhcl9sb29wX3BpbG90c19vZmZfMzA7CisJCQkJYWNsY192YWx1ZSA9IGNsczJbaV0uY2FyX2xvb3BfcGlsb3RzX29mZl8zMDsKIAkJfQogCiAJfSBlbHNlIHsKIAkJaWYgKHNyYXRlIDw9IDMwMDAwMDApCi0JCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMkFQU0tDYXJMb29wQ3V0MjBbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzI7CisJCQlhY2xjX3ZhbHVlID0gY2xsYXMyW2ldLmNhcl9sb29wX3BpbG90c19vbl8yOwogCQllbHNlIGlmIChzcmF0ZSA8PSA3MDAwMDAwKQotCQkJYWNsY192YWx1ZSA9IEZFX1NUVjA5MDBfUzJBUFNLQ2FyTG9vcEN1dDIwW2ldLmNhcl9sb29wX3BpbG90c19vbl81OworCQkJYWNsY192YWx1ZSA9IGNsbGFzMltpXS5jYXJfbG9vcF9waWxvdHNfb25fNTsKIAkJZWxzZSBpZiAoc3JhdGUgPD0gMTUwMDAwMDApCi0JCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMkFQU0tDYXJMb29wQ3V0MjBbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzEwOworCQkJYWNsY192YWx1ZSA9IGNsbGFzMltpXS5jYXJfbG9vcF9waWxvdHNfb25fMTA7CiAJCWVsc2UgaWYgKHNyYXRlIDw9IDI1MDAwMDAwKQotCQkJYWNsY192YWx1ZSA9IEZFX1NUVjA5MDBfUzJBUFNLQ2FyTG9vcEN1dDIwW2ldLmNhcl9sb29wX3BpbG90c19vbl8yMDsKKwkJCWFjbGNfdmFsdWUgPSBjbGxhczJbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzIwOwogCQllbHNlCi0JCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMkFQU0tDYXJMb29wQ3V0MjBbaV0uY2FyX2xvb3BfcGlsb3RzX29uXzMwOworCQkJYWNsY192YWx1ZSA9IGNsbGFzMltpXS5jYXJfbG9vcF9waWxvdHNfb25fMzA7CiAJfQogCiAJcmV0dXJuIGFjbGNfdmFsdWU7CiB9CiAKLXU4IHN0djA5MDBfZ2V0X29wdGltX3Nob3J0X2NhcnJfbG9vcChzMzIgc3JhdGUsIGVudW0gZmVfc3R2MDkwMF9tb2R1bGF0aW9uIG1vZHVsYXRpb24sIHU4IGNoaXBfaWQpCit1OCBzdHYwOTAwX2dldF9vcHRpbV9zaG9ydF9jYXJyX2xvb3AoczMyIHNyYXRlLAorCQkJCWVudW0gZmVfc3R2MDkwMF9tb2R1bGF0aW9uIG1vZHVsYXRpb24sCisJCQkJdTggY2hpcF9pZCkKIHsKKwljb25zdCBzdHJ1Y3Qgc3R2MDkwMF9zaG9ydF9mcmFtZXNfY2FyX2xvb3Bfb3B0aW0gKnMyc2NsOworCWNvbnN0IHN0cnVjdCBzdHYwOTAwX3Nob3J0X2ZyYW1lc19jYXJfbG9vcF9vcHRpbV92c19tb2QgKnMyc2NsYzMwOwogCXMzMiBtb2RfaW5kZXggPSAwOwotCiAJdTggYWNsY192YWx1ZSA9IDB4MGI7CiAKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJczJzY2wgPSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wOworCXMyc2NsYzMwID0gRkVfU1RWMDkwMF9TMlNob3J0Q2FyTG9vcEN1dDMwOwogCiAJc3dpdGNoIChtb2R1bGF0aW9uKSB7CiAJY2FzZSBTVFYwOTAwX1FQU0s6CkBAIC0xMzEyLDc1ICsxMjA2LDExNiBAQAogCQlicmVhazsKIAl9CiAKLQlzd2l0Y2ggKGNoaXBfaWQpIHsKLQljYXNlIDB4MjA6CisJaWYgKGNoaXBfaWQgPj0gMHgzMCkgewogCQlpZiAoc3JhdGUgPD0gMzAwMDAwMCkKLQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wW21vZF9pbmRleF0uY2FyX2xvb3BfY3V0MjBfMjsKKwkJCWFjbGNfdmFsdWUgPSBzMnNjbGMzMFttb2RfaW5kZXhdLmNhcl9sb29wXzI7CiAJCWVsc2UgaWYgKHNyYXRlIDw9IDcwMDAwMDApCi0JCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMlNob3J0Q2FyTG9vcFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDIwXzU7CisJCQlhY2xjX3ZhbHVlID0gczJzY2xjMzBbbW9kX2luZGV4XS5jYXJfbG9vcF81OwogCQllbHNlIGlmIChzcmF0ZSA8PSAxNTAwMDAwMCkKLQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wW21vZF9pbmRleF0uY2FyX2xvb3BfY3V0MjBfMTA7CisJCQlhY2xjX3ZhbHVlID0gczJzY2xjMzBbbW9kX2luZGV4XS5jYXJfbG9vcF8xMDsKIAkJZWxzZSBpZiAoc3JhdGUgPD0gMjUwMDAwMDApCi0JCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMlNob3J0Q2FyTG9vcFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDIwXzIwOworCQkJYWNsY192YWx1ZSA9IHMyc2NsYzMwW21vZF9pbmRleF0uY2FyX2xvb3BfMjA7CiAJCWVsc2UKLQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wW21vZF9pbmRleF0uY2FyX2xvb3BfY3V0MjBfMzA7CisJCQlhY2xjX3ZhbHVlID0gczJzY2xjMzBbbW9kX2luZGV4XS5jYXJfbG9vcF8zMDsKIAotCQlicmVhazsKLQljYXNlIDB4MTI6Ci0JZGVmYXVsdDoKKwl9IGVsc2UgaWYgKGNoaXBfaWQgPj0gMHgyMCkgewogCQlpZiAoc3JhdGUgPD0gMzAwMDAwMCkKLQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wW21vZF9pbmRleF0uY2FyX2xvb3BfY3V0MTJfMjsKKwkJCWFjbGNfdmFsdWUgPSBzMnNjbFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDIwXzI7CiAJCWVsc2UgaWYgKHNyYXRlIDw9IDcwMDAwMDApCi0JCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMlNob3J0Q2FyTG9vcFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDEyXzU7CisJCQlhY2xjX3ZhbHVlID0gczJzY2xbbW9kX2luZGV4XS5jYXJfbG9vcF9jdXQyMF81OwogCQllbHNlIGlmIChzcmF0ZSA8PSAxNTAwMDAwMCkKLQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wW21vZF9pbmRleF0uY2FyX2xvb3BfY3V0MTJfMTA7CisJCQlhY2xjX3ZhbHVlID0gczJzY2xbbW9kX2luZGV4XS5jYXJfbG9vcF9jdXQyMF8xMDsKIAkJZWxzZSBpZiAoc3JhdGUgPD0gMjUwMDAwMDApCi0JCQlhY2xjX3ZhbHVlID0gRkVfU1RWMDkwMF9TMlNob3J0Q2FyTG9vcFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDEyXzIwOworCQkJYWNsY192YWx1ZSA9IHMyc2NsW21vZF9pbmRleF0uY2FyX2xvb3BfY3V0MjBfMjA7CiAJCWVsc2UKLQkJCWFjbGNfdmFsdWUgPSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wW21vZF9pbmRleF0uY2FyX2xvb3BfY3V0MTJfMzA7CisJCQlhY2xjX3ZhbHVlID0gczJzY2xbbW9kX2luZGV4XS5jYXJfbG9vcF9jdXQyMF8zMDsKIAotCQlicmVhazsKKwl9IGVsc2UgeworCQlpZiAoc3JhdGUgPD0gMzAwMDAwMCkKKwkJCWFjbGNfdmFsdWUgPSBzMnNjbFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDEyXzI7CisJCWVsc2UgaWYgKHNyYXRlIDw9IDcwMDAwMDApCisJCQlhY2xjX3ZhbHVlID0gczJzY2xbbW9kX2luZGV4XS5jYXJfbG9vcF9jdXQxMl81OworCQllbHNlIGlmIChzcmF0ZSA8PSAxNTAwMDAwMCkKKwkJCWFjbGNfdmFsdWUgPSBzMnNjbFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDEyXzEwOworCQllbHNlIGlmIChzcmF0ZSA8PSAyNTAwMDAwMCkKKwkJCWFjbGNfdmFsdWUgPSBzMnNjbFttb2RfaW5kZXhdLmNhcl9sb29wX2N1dDEyXzIwOworCQllbHNlCisJCQlhY2xjX3ZhbHVlID0gczJzY2xbbW9kX2luZGV4XS5jYXJfbG9vcF9jdXQxMl8zMDsKKwogCX0KIAogCXJldHVybiBhY2xjX3ZhbHVlOwogfQogCi1zdGF0aWMgZW51bSBmZV9zdHYwOTAwX2Vycm9yIHN0djA5MDBfc3RfZHZiczJfc2luZ2xlKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK3N0YXRpYworZW51bSBmZV9zdHYwOTAwX2Vycm9yIHN0djA5MDBfc3RfZHZiczJfc2luZ2xlKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbW9kZSBMRFBDX01vZGUsCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7CiAJZW51bSBmZV9zdHYwOTAwX2Vycm9yIGVycm9yID0gU1RWMDkwMF9OT19FUlJPUjsKKwlzMzIgcmVnX2luZDsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgX19mdW5jX18pOworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKExEUENfTW9kZSkgewogCWNhc2UgU1RWMDkwMF9EVUFMOgogCWRlZmF1bHQ6Ci0JCWlmICgoaV9wYXJhbXMtPmRlbW9kX21vZGUgIT0gU1RWMDkwMF9EVUFMKQotCQkJfHwgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX0RERU1PRCkgIT0gMSkpIHsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9HRU5DRkcsIDB4MWQpOworCQlpZiAoKGludHAtPmRlbW9kX21vZGUgIT0gU1RWMDkwMF9EVUFMKQorCQkJfHwgKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgRjA5MDBfRERFTU9EKSAhPSAxKSkgeworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfR0VOQ0ZHLCAweDFkKTsKIAotCQkJaV9wYXJhbXMtPmRlbW9kX21vZGUgPSBTVFYwOTAwX0RVQUw7CisJCQlpbnRwLT5kZW1vZF9tb2RlID0gU1RWMDkwMF9EVUFMOwogCi0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX0ZSRVNGRUMsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9GUkVTRkVDLCAwKTsKKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9GUkVTRkVDLCAxKTsKKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9GUkVTRkVDLCAwKTsKKworCQkJZm9yIChyZWdfaW5kID0gMDsgcmVnX2luZCA8IDc7IHJlZ19pbmQrKykKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLAorCQkJCQkJUjA5MDBfUDFfTU9EQ09ETFNUMCArIHJlZ19pbmQsCisJCQkJCQkweGZmKTsKKwkJCWZvciAocmVnX2luZCA9IDA7IHJlZ19pbmQgPCA4OyByZWdfaW5kKyspCisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwKKwkJCQkJCVIwOTAwX1AxX01PRENPRExTVDcgKyByZWdfaW5kLAorCQkJCQkJMHhjYyk7CisKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AxX01PRENPRExTVEUsIDB4ZmYpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfUDFfTU9EQ09ETFNURiwgMHhjZik7CisKKwkJCWZvciAocmVnX2luZCA9IDA7IHJlZ19pbmQgPCA3OyByZWdfaW5kKyspCisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwKKwkJCQkJCVIwOTAwX1AyX01PRENPRExTVDAgKyByZWdfaW5kLAorCQkJCQkJMHhmZik7CisJCQlmb3IgKHJlZ19pbmQgPSAwOyByZWdfaW5kIDwgODsgcmVnX2luZCsrKQorCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsCisJCQkJCQlSMDkwMF9QMl9NT0RDT0RMU1Q3ICsgcmVnX2luZCwKKwkJCQkJCTB4Y2MpOworCisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9QMl9NT0RDT0RMU1RFLCAweGZmKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1AyX01PRENPRExTVEYsIDB4Y2YpOwogCQl9CiAKIAkJYnJlYWs7CiAJY2FzZSBTVFYwOTAwX1NJTkdMRToKLQkJaWYgKGRlbW9kID09IFNUVjA5MDBfREVNT0RfMikKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9HRU5DRkcsIDB4MDYpOwotCQllbHNlCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfR0VOQ0ZHLCAweDA0KTsKKwkJaWYgKGRlbW9kID09IFNUVjA5MDBfREVNT0RfMikgeworCQkJc3R2MDkwMF9zdG9wX2FsbF9zMl9tb2Rjb2QoaW50cCwgU1RWMDkwMF9ERU1PRF8xKTsKKwkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kX3NpbmdsZShpbnRwLAorCQkJCQkJCVNUVjA5MDBfREVNT0RfMik7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9HRU5DRkcsIDB4MDYpOworCQl9IGVsc2UgeworCQkJc3R2MDkwMF9zdG9wX2FsbF9zMl9tb2Rjb2QoaW50cCwgU1RWMDkwMF9ERU1PRF8yKTsKKwkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kX3NpbmdsZShpbnRwLAorCQkJCQkJCVNUVjA5MDBfREVNT0RfMSk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9HRU5DRkcsIDB4MDQpOworCQl9CiAKLQkJaV9wYXJhbXMtPmRlbW9kX21vZGUgPSBTVFYwOTAwX1NJTkdMRTsKKwkJaW50cC0+ZGVtb2RfbW9kZSA9IFNUVjA5MDBfU0lOR0xFOwogCi0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfRlJFU0ZFQywgMSk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfRlJFU0ZFQywgMCk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfQUxHT1NXUlNULCAxKTsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9BTEdPU1dSU1QsIDApOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0FMR09TV1JTVCwgMSk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfQUxHT1NXUlNULCAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX0ZSRVNGRUMsIDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfRlJFU0ZFQywgMCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMV9BTEdPU1dSU1QsIDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDFfQUxHT1NXUlNULCAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AyX0FMR09TV1JTVCwgMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMl9BTEdPU1dSU1QsIDApOwogCQlicmVhazsKIAl9CiAKQEAgLTEzOTMsMTMxICsxMzI4LDEzMSBAQAogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWVudW0gZmVfc3R2MDkwMF9lcnJvciBlcnJvciA9IFNUVjA5MDBfTk9fRVJST1I7CiAJZW51bSBmZV9zdHYwOTAwX2Vycm9yIGRlbW9kRXJyb3IgPSBTVFYwOTAwX05PX0VSUk9SOworCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwID0gTlVMTDsKKwogCWludCBzZWxvc2NpLCBpOwogCiAJc3RydWN0IHN0djA5MDBfaW5vZGUgKnRlbXBfaW50ID0gZmluZF9pbm9kZShzdGF0ZS0+aTJjX2FkYXAsCiAJCQkJCQlzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzKTsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgX19mdW5jX18pOworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAodGVtcF9pbnQgIT0gTlVMTCkgeworCWlmICgodGVtcF9pbnQgIT0gTlVMTCkgJiYgKHBfaW5pdC0+ZGVtb2RfbW9kZSA9PSBTVFYwOTAwX0RVQUwpKSB7CiAJCXN0YXRlLT5pbnRlcm5hbCA9IHRlbXBfaW50LT5pbnRlcm5hbDsKIAkJKHN0YXRlLT5pbnRlcm5hbC0+ZG1kc191c2VkKSsrOwotCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpbmQgSW50ZXJuYWwgU3RydWN0dXJlIVxuIiwgX19mdW5jX18pOworCQlkcHJpbnRrKCIlczogRmluZCBJbnRlcm5hbCBTdHJ1Y3R1cmUhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBTVFYwOTAwX05PX0VSUk9SOwogCX0gZWxzZSB7Ci0JCXN0YXRlLT5pbnRlcm5hbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsKSwgR0ZQX0tFUk5FTCk7CisJCXN0YXRlLT5pbnRlcm5hbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCXRlbXBfaW50ID0gYXBwZW5kX2ludGVybmFsKHN0YXRlLT5pbnRlcm5hbCk7CiAJCXN0YXRlLT5pbnRlcm5hbC0+ZG1kc191c2VkID0gMTsKIAkJc3RhdGUtPmludGVybmFsLT5pMmNfYWRhcCA9IHN0YXRlLT5pMmNfYWRhcDsKIAkJc3RhdGUtPmludGVybmFsLT5pMmNfYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3M7CiAJCXN0YXRlLT5pbnRlcm5hbC0+Y2xrbW9kZSA9IHN0YXRlLT5jb25maWctPmNsa21vZGU7CiAJCXN0YXRlLT5pbnRlcm5hbC0+ZXJycyA9IFNUVjA5MDBfTk9fRVJST1I7Ci0JCWRwcmludGsoS0VSTl9JTkZPICIlczogQ3JlYXRlIE5ldyBJbnRlcm5hbCBTdHJ1Y3R1cmUhXG4iLCBfX2Z1bmNfXyk7CisJCWRwcmludGsoIiVzOiBDcmVhdGUgTmV3IEludGVybmFsIFN0cnVjdHVyZSFcbiIsIF9fZnVuY19fKTsKIAl9CiAKLQlpZiAoc3RhdGUtPmludGVybmFsICE9IE5VTEwpIHsKLQkJZGVtb2RFcnJvciA9IHN0djA5MDBfaW5pdGlhbGl6ZShzdGF0ZS0+aW50ZXJuYWwpOwotCQlpZiAoZGVtb2RFcnJvciA9PSBTVFYwOTAwX05PX0VSUk9SKSB7Ci0JCQkJZXJyb3IgPSBTVFYwOTAwX05PX0VSUk9SOwotCQl9IGVsc2UgewotCQkJaWYgKGRlbW9kRXJyb3IgPT0gU1RWMDkwMF9JTlZBTElEX0hBTkRMRSkKLQkJCQllcnJvciA9IFNUVjA5MDBfSU5WQUxJRF9IQU5ETEU7Ci0JCQllbHNlCi0JCQkJZXJyb3IgPSBTVFYwOTAwX0kyQ19FUlJPUjsKLQkJfQorCWlmIChzdGF0ZS0+aW50ZXJuYWwgPT0gTlVMTCkgeworCQllcnJvciA9IFNUVjA5MDBfSU5WQUxJRF9IQU5ETEU7CisJCXJldHVybiBlcnJvcjsKKwl9CiAKLQkJaWYgKHN0YXRlLT5pbnRlcm5hbCAhPSBOVUxMKSB7Ci0JCQlpZiAoZXJyb3IgPT0gU1RWMDkwMF9OT19FUlJPUikgewotCQkJCXN0YXRlLT5pbnRlcm5hbC0+ZGVtb2RfbW9kZSA9IHBfaW5pdC0+ZGVtb2RfbW9kZTsKLQotCQkJCXN0djA5MDBfc3RfZHZiczJfc2luZ2xlKHN0YXRlLT5pbnRlcm5hbCwgc3RhdGUtPmludGVybmFsLT5kZW1vZF9tb2RlLCBTVFYwOTAwX0RFTU9EXzEpOwotCi0JCQkJc3RhdGUtPmludGVybmFsLT5jaGlwX2lkID0gc3R2MDkwMF9yZWFkX3JlZyhzdGF0ZS0+aW50ZXJuYWwsIFIwOTAwX01JRCk7Ci0JCQkJc3RhdGUtPmludGVybmFsLT5yb2xsb2ZmID0gcF9pbml0LT5yb2xsb2ZmOwotCQkJCXN0YXRlLT5pbnRlcm5hbC0+cXVhcnR6ID0gcF9pbml0LT5kbWRfcmVmX2NsazsKLQotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhzdGF0ZS0+aW50ZXJuYWwsIEYwOTAwX1AxX1JPTExPRkZfQ09OVFJPTCwgcF9pbml0LT5yb2xsb2ZmKTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoc3RhdGUtPmludGVybmFsLCBGMDkwMF9QMl9ST0xMT0ZGX0NPTlRST0wsIHBfaW5pdC0+cm9sbG9mZik7Ci0KLQkJCQlzdGF0ZS0+aW50ZXJuYWwtPnRzX2NvbmZpZyA9IHBfaW5pdC0+dHNfY29uZmlnOwotCQkJCWlmIChzdGF0ZS0+aW50ZXJuYWwtPnRzX2NvbmZpZyA9PSBOVUxMKQotCQkJCQlzdHYwOTAwX3NldF90c19wYXJhbGxlbF9zZXJpYWwoc3RhdGUtPmludGVybmFsLAotCQkJCQkJCXBfaW5pdC0+cGF0aDFfdHNfY2xvY2ssCi0JCQkJCQkJcF9pbml0LT5wYXRoMl90c19jbG9jayk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaSA9IDA7IHN0YXRlLT5pbnRlcm5hbC0+dHNfY29uZmlnW2ldLmFkZHIgIT0gMHhmZmZmOyBpKyspCi0JCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhzdGF0ZS0+aW50ZXJuYWwsCi0JCQkJCQkJCXN0YXRlLT5pbnRlcm5hbC0+dHNfY29uZmlnW2ldLmFkZHIsCi0JCQkJCQkJCXN0YXRlLT5pbnRlcm5hbC0+dHNfY29uZmlnW2ldLnZhbCk7Ci0KLQkJCQkJc3R2MDkwMF93cml0ZV9iaXRzKHN0YXRlLT5pbnRlcm5hbCwgRjA5MDBfUDJfUlNUX0hXQVJFLCAxKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9iaXRzKHN0YXRlLT5pbnRlcm5hbCwgRjA5MDBfUDJfUlNUX0hXQVJFLCAwKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9iaXRzKHN0YXRlLT5pbnRlcm5hbCwgRjA5MDBfUDFfUlNUX0hXQVJFLCAxKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9iaXRzKHN0YXRlLT5pbnRlcm5hbCwgRjA5MDBfUDFfUlNUX0hXQVJFLCAwKTsKLQkJCQl9Ci0KLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoc3RhdGUtPmludGVybmFsLCBGMDkwMF9QMV9UVU5fTUFERFJFU1MsIHBfaW5pdC0+dHVuMV9tYWRkcmVzcyk7Ci0JCQkJc3dpdGNoIChwX2luaXQtPnR1bmVyMV9hZGMpIHsKLQkJCQljYXNlIDE6Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKHN0YXRlLT5pbnRlcm5hbCwgUjA5MDBfVFNUVE5SMSwgMHgyNik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhzdGF0ZS0+aW50ZXJuYWwsIEYwOTAwX1AyX1RVTl9NQUREUkVTUywgcF9pbml0LT50dW4yX21hZGRyZXNzKTsKLQkJCQlzd2l0Y2ggKHBfaW5pdC0+dHVuZXIyX2FkYykgewotCQkJCWNhc2UgMToKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoc3RhdGUtPmludGVybmFsLCBSMDkwMF9UU1RUTlIzLCAweDI2KTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJc3R2MDkwMF93cml0ZV9iaXRzKHN0YXRlLT5pbnRlcm5hbCwgRjA5MDBfUDFfVFVOX0lRU1dBUCwgcF9pbml0LT50dW4xX2lxX2ludmVyc2lvbik7Ci0JCQkJc3R2MDkwMF93cml0ZV9iaXRzKHN0YXRlLT5pbnRlcm5hbCwgRjA5MDBfUDJfVFVOX0lRU1dBUCwgcF9pbml0LT50dW4yX2lxX2ludmVyc2lvbik7Ci0JCQkJc3R2MDkwMF9zZXRfbWNsayhzdGF0ZS0+aW50ZXJuYWwsIDEzNTAwMDAwMCk7Ci0JCQkJbXNsZWVwKDMpOwotCi0JCQkJc3dpdGNoIChzdGF0ZS0+aW50ZXJuYWwtPmNsa21vZGUpIHsKLQkJCQljYXNlIDA6Ci0JCQkJY2FzZSAyOgotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhzdGF0ZS0+aW50ZXJuYWwsIFIwOTAwX1NZTlRDVFJMLCAweDIwIHwgc3RhdGUtPmludGVybmFsLT5jbGttb2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2Vsb3NjaSA9IDB4MDIgJiBzdHYwOTAwX3JlYWRfcmVnKHN0YXRlLT5pbnRlcm5hbCwgUjA5MDBfU1lOVENUUkwpOwotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhzdGF0ZS0+aW50ZXJuYWwsIFIwOTAwX1NZTlRDVFJMLCAweDIwIHwgc2Vsb3NjaSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQltc2xlZXAoMyk7Ci0KLQkJCQlzdGF0ZS0+aW50ZXJuYWwtPm1jbGsgPSBzdHYwOTAwX2dldF9tY2xrX2ZyZXEoc3RhdGUtPmludGVybmFsLCBzdGF0ZS0+aW50ZXJuYWwtPnF1YXJ0eik7Ci0JCQkJaWYgKHN0YXRlLT5pbnRlcm5hbC0+ZXJycykKLQkJCQkJZXJyb3IgPSBTVFYwOTAwX0kyQ19FUlJPUjsKLQkJCX0KLQkJfSBlbHNlIHsKKwlkZW1vZEVycm9yID0gc3R2MDkwMF9pbml0aWFsaXplKHN0YXRlLT5pbnRlcm5hbCk7CisJaWYgKGRlbW9kRXJyb3IgPT0gU1RWMDkwMF9OT19FUlJPUikgeworCQkJZXJyb3IgPSBTVFYwOTAwX05PX0VSUk9SOworCX0gZWxzZSB7CisJCWlmIChkZW1vZEVycm9yID09IFNUVjA5MDBfSU5WQUxJRF9IQU5ETEUpCiAJCQllcnJvciA9IFNUVjA5MDBfSU5WQUxJRF9IQU5ETEU7Ci0JCX0KKwkJZWxzZQorCQkJZXJyb3IgPSBTVFYwOTAwX0kyQ19FUlJPUjsKKworCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJaWYgKHN0YXRlLT5pbnRlcm5hbCA9PSBOVUxMKSB7CisJCWVycm9yID0gU1RWMDkwMF9JTlZBTElEX0hBTkRMRTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWludHAgPSBzdGF0ZS0+aW50ZXJuYWw7CisKKwlpbnRwLT5kZW1vZF9tb2RlID0gcF9pbml0LT5kZW1vZF9tb2RlOworCXN0djA5MDBfc3RfZHZiczJfc2luZ2xlKGludHAsIGludHAtPmRlbW9kX21vZGUsCVNUVjA5MDBfREVNT0RfMSk7CisJaW50cC0+Y2hpcF9pZCA9IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgUjA5MDBfTUlEKTsKKwlpbnRwLT5yb2xsb2ZmID0gcF9pbml0LT5yb2xsb2ZmOworCWludHAtPnF1YXJ0eiA9IHBfaW5pdC0+ZG1kX3JlZl9jbGs7CisKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDFfUk9MTE9GRl9DT05UUk9MLCBwX2luaXQtPnJvbGxvZmYpOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMl9ST0xMT0ZGX0NPTlRST0wsIHBfaW5pdC0+cm9sbG9mZik7CisKKwlpbnRwLT50c19jb25maWcgPSBwX2luaXQtPnRzX2NvbmZpZzsKKwlpZiAoaW50cC0+dHNfY29uZmlnID09IE5VTEwpCisJCXN0djA5MDBfc2V0X3RzX3BhcmFsbGVsX3NlcmlhbChpbnRwLAorCQkJCXBfaW5pdC0+cGF0aDFfdHNfY2xvY2ssCisJCQkJcF9pbml0LT5wYXRoMl90c19jbG9jayk7CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGludHAtPnRzX2NvbmZpZ1tpXS5hZGRyICE9IDB4ZmZmZjsgaSsrKQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwKKwkJCQkJaW50cC0+dHNfY29uZmlnW2ldLmFkZHIsCisJCQkJCWludHAtPnRzX2NvbmZpZ1tpXS52YWwpOworCisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMl9SU1RfSFdBUkUsIDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDJfUlNUX0hXQVJFLCAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AxX1JTVF9IV0FSRSwgMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMV9SU1RfSFdBUkUsIDApOworCX0KKworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMV9UVU5fTUFERFJFU1MsIHBfaW5pdC0+dHVuMV9tYWRkcmVzcyk7CisJc3dpdGNoIChwX2luaXQtPnR1bmVyMV9hZGMpIHsKKwljYXNlIDE6CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFIwOTAwX1RTVFROUjEsIDB4MjYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRjA5MDBfUDJfVFVOX01BRERSRVNTLCBwX2luaXQtPnR1bjJfbWFkZHJlc3MpOworCXN3aXRjaCAocF9pbml0LT50dW5lcjJfYWRjKSB7CisJY2FzZSAxOgorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSMDkwMF9UU1RUTlIzLCAweDI2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEYwOTAwX1AxX1RVTl9JUVNXQVAsIHBfaW5pdC0+dHVuMV9pcV9pbnYpOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBGMDkwMF9QMl9UVU5fSVFTV0FQLCBwX2luaXQtPnR1bjJfaXFfaW52KTsKKwlzdHYwOTAwX3NldF9tY2xrKGludHAsIDEzNTAwMDAwMCk7CisJbXNsZWVwKDMpOworCisJc3dpdGNoIChpbnRwLT5jbGttb2RlKSB7CisJY2FzZSAwOgorCWNhc2UgMjoKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfU1lOVENUUkwsIDB4MjAgfCBpbnRwLT5jbGttb2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2Vsb3NjaSA9IDB4MDIgJiBzdHYwOTAwX3JlYWRfcmVnKGludHAsIFIwOTAwX1NZTlRDVFJMKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUjA5MDBfU1lOVENUUkwsIDB4MjAgfCBzZWxvc2NpKTsKKwkJYnJlYWs7CisJfQorCW1zbGVlcCgzKTsKKworCWludHAtPm1jbGsgPSBzdHYwOTAwX2dldF9tY2xrX2ZyZXEoaW50cCwgaW50cC0+cXVhcnR6KTsKKwlpZiAoaW50cC0+ZXJycykKKwkJZXJyb3IgPSBTVFYwOTAwX0kyQ19FUlJPUjsKKwogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBzdHYwOTAwX3N0YXR1cyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitzdGF0aWMgaW50IHN0djA5MDBfc3RhdHVzKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQogewogCWVudW0gZmVfc3R2MDkwMF9zZWFyY2hfc3RhdGUgZGVtb2Rfc3RhdGU7Ci0JczMyIG1vZGVfZmllbGQsIGRlbGluX2ZpZWxkLCBsb2NrX2ZpZWxkLCBmaWZvX2ZpZWxkLCBsb2NrZWR2aXRfZmllbGQ7CiAJaW50IGxvY2tlZCA9IEZBTFNFOwogCi0JZG1kX3JlZyhtb2RlX2ZpZWxkLCBGMDkwMF9QMV9IRUFERVJfTU9ERSwgRjA5MDBfUDJfSEVBREVSX01PREUpOwotCWRtZF9yZWcobG9ja19maWVsZCwgRjA5MDBfUDFfTE9DS19ERUZJTklUSUYsIEYwOTAwX1AyX0xPQ0tfREVGSU5JVElGKTsKLQlkbWRfcmVnKGRlbGluX2ZpZWxkLCBGMDkwMF9QMV9QS1RERUxJTl9MT0NLLCBGMDkwMF9QMl9QS1RERUxJTl9MT0NLKTsKLQlkbWRfcmVnKGZpZm9fZmllbGQsIEYwOTAwX1AxX1RTRklGT19MSU5FT0ssIEYwOTAwX1AyX1RTRklGT19MSU5FT0spOwotCWRtZF9yZWcobG9ja2Vkdml0X2ZpZWxkLCBGMDkwMF9QMV9MT0NLRURWSVQsIEYwOTAwX1AyX0xPQ0tFRFZJVCk7Ci0KLQlkZW1vZF9zdGF0ZSA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIG1vZGVfZmllbGQpOworCWRlbW9kX3N0YXRlID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBIRUFERVJfTU9ERSk7CiAJc3dpdGNoIChkZW1vZF9zdGF0ZSkgewogCWNhc2UgU1RWMDkwMF9TRUFSQ0g6CiAJY2FzZSBTVFYwOTAwX1BMSF9ERVRFQ1RFRDoKQEAgLTE1MjUsMTcgKzE0NjAsMTkgQEAKIAkJbG9ja2VkID0gRkFMU0U7CiAJCWJyZWFrOwogCWNhc2UgU1RWMDkwMF9EVkJTMl9GT1VORDoKLQkJbG9ja2VkID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgbG9ja19maWVsZCkgJiYKLQkJCQlzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBkZWxpbl9maWVsZCkgJiYKLQkJCQlzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBmaWZvX2ZpZWxkKTsKKwkJbG9ja2VkID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBMT0NLX0RFRklOSVRJRikgJiYKKwkJCQlzdHYwOTAwX2dldF9iaXRzKGludHAsIFBLVERFTElOX0xPQ0spICYmCisJCQkJc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBUU0ZJRk9fTElORU9LKTsKIAkJYnJlYWs7CiAJY2FzZSBTVFYwOTAwX0RWQlNfRk9VTkQ6Ci0JCWxvY2tlZCA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIGxvY2tfZmllbGQpICYmCi0JCQkJc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgbG9ja2Vkdml0X2ZpZWxkKSAmJgotCQkJCXN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIGZpZm9fZmllbGQpOworCQlsb2NrZWQgPSBzdHYwOTAwX2dldF9iaXRzKGludHAsIExPQ0tfREVGSU5JVElGKSAmJgorCQkJCXN0djA5MDBfZ2V0X2JpdHMoaW50cCwgTE9DS0VEVklUKSAmJgorCQkJCXN0djA5MDBfZ2V0X2JpdHMoaW50cCwgVFNGSUZPX0xJTkVPSyk7CiAJCWJyZWFrOwogCX0KIAorCWRwcmludGsoIiVzOiBsb2NrZWQgPSAlZFxuIiwgX19mdW5jX18sIGxvY2tlZCk7CisKIAlyZXR1cm4gbG9ja2VkOwogfQogCkBAIC0xNTQzLDcgKzE0ODAsOCBAQAogCQkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3Qgc3R2MDkwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMgPSBzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAgPSBzdGF0ZS0+aW50ZXJuYWw7CisJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCA9IHN0YXRlLT5kZW1vZDsKIAlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKIAogCXN0cnVjdCBzdHYwOTAwX3NlYXJjaF9wYXJhbXMgcF9zZWFyY2g7CkBAIC0xNTUxLDEwICsxNDg5LDE2IEBACiAKIAllbnVtIGZlX3N0djA5MDBfZXJyb3IgZXJyb3IgPSBTVFYwOTAwX05PX0VSUk9SOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzOiAiLCBfX2Z1bmNfXyk7CisJZHByaW50aygiJXM6ICIsIF9fZnVuY19fKTsKKworCWlmICghKElOUkFOR0UoMTAwMDAwLCBjLT5zeW1ib2xfcmF0ZSwgNzAwMDAwMDApKSkKKwkJcmV0dXJuIERWQkZFX0FMR09fU0VBUkNIX0ZBSUxFRDsKKworCWlmIChzdGF0ZS0+Y29uZmlnLT5zZXRfdHNfcGFyYW1zKQorCQlzdGF0ZS0+Y29uZmlnLT5zZXRfdHNfcGFyYW1zKGZlLCAwKTsKIAogCXBfcmVzdWx0LmxvY2tlZCA9IEZBTFNFOwotCXBfc2VhcmNoLnBhdGggPSBzdGF0ZS0+ZGVtb2Q7CisJcF9zZWFyY2gucGF0aCA9IGRlbW9kOwogCXBfc2VhcmNoLmZyZXF1ZW5jeSA9IGMtPmZyZXF1ZW5jeTsKIAlwX3NlYXJjaC5zeW1ib2xfcmF0ZSA9IGMtPnN5bWJvbF9yYXRlOwogCXBfc2VhcmNoLnNlYXJjaF9yYW5nZSA9IDEwMDAwMDAwOwpAQCAtMTU2MywxMDMgKzE1MDcsNDcgQEAKIAlwX3NlYXJjaC5pcV9pbnZlcnNpb24gPSBTVFYwOTAwX0lRX0FVVE87CiAJcF9zZWFyY2guc2VhcmNoX2FsZ28gPSBTVFYwOTAwX0JMSU5EX1NFQVJDSDsKIAotCWlmICgoSU5SQU5HRSgxMDAwMDAsIHBfc2VhcmNoLnN5bWJvbF9yYXRlLCA3MDAwMDAwMCkpICYmCi0JCQkoSU5SQU5HRSgxMDAwMDAsIHBfc2VhcmNoLnNlYXJjaF9yYW5nZSwgNTAwMDAwMDApKSkgewotCQlzd2l0Y2ggKHBfc2VhcmNoLnBhdGgpIHsKLQkJY2FzZSBTVFYwOTAwX0RFTU9EXzE6CisJaW50cC0+c3JjaF9zdGFuZGFyZFtkZW1vZF0gPSBwX3NlYXJjaC5zdGFuZGFyZDsKKwlpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPSBwX3NlYXJjaC5zeW1ib2xfcmF0ZTsKKwlpbnRwLT5zcmNoX3JhbmdlW2RlbW9kXSA9IHBfc2VhcmNoLnNlYXJjaF9yYW5nZTsKKwlpbnRwLT5mcmVxW2RlbW9kXSA9IHBfc2VhcmNoLmZyZXF1ZW5jeTsKKwlpbnRwLT5zcmNoX2FsZ29bZGVtb2RdID0gcF9zZWFyY2guc2VhcmNoX2FsZ287CisJaW50cC0+c3JjaF9pcV9pbnZbZGVtb2RdID0gcF9zZWFyY2guaXFfaW52ZXJzaW9uOworCWludHAtPmZlY1tkZW1vZF0gPSBwX3NlYXJjaC5mZWM7CisJaWYgKChzdHYwOTAwX2FsZ28oZmUpID09IFNUVjA5MDBfUkFOR0VPSykgJiYKKwkJCQkoaW50cC0+ZXJycyA9PSBTVFYwOTAwX05PX0VSUk9SKSkgeworCQlwX3Jlc3VsdC5sb2NrZWQgPSBpbnRwLT5yZXN1bHRbZGVtb2RdLmxvY2tlZDsKKwkJcF9yZXN1bHQuc3RhbmRhcmQgPSBpbnRwLT5yZXN1bHRbZGVtb2RdLnN0YW5kYXJkOworCQlwX3Jlc3VsdC5mcmVxdWVuY3kgPSBpbnRwLT5yZXN1bHRbZGVtb2RdLmZyZXF1ZW5jeTsKKwkJcF9yZXN1bHQuc3ltYm9sX3JhdGUgPSBpbnRwLT5yZXN1bHRbZGVtb2RdLnN5bWJvbF9yYXRlOworCQlwX3Jlc3VsdC5mZWMgPSBpbnRwLT5yZXN1bHRbZGVtb2RdLmZlYzsKKwkJcF9yZXN1bHQubW9kY29kZSA9IGludHAtPnJlc3VsdFtkZW1vZF0ubW9kY29kZTsKKwkJcF9yZXN1bHQucGlsb3QgPSBpbnRwLT5yZXN1bHRbZGVtb2RdLnBpbG90OworCQlwX3Jlc3VsdC5mcmFtZV9sZW4gPSBpbnRwLT5yZXN1bHRbZGVtb2RdLmZyYW1lX2xlbjsKKwkJcF9yZXN1bHQuc3BlY3RydW0gPSBpbnRwLT5yZXN1bHRbZGVtb2RdLnNwZWN0cnVtOworCQlwX3Jlc3VsdC5yb2xsb2ZmID0gaW50cC0+cmVzdWx0W2RlbW9kXS5yb2xsb2ZmOworCQlwX3Jlc3VsdC5tb2R1bGF0aW9uID0gaW50cC0+cmVzdWx0W2RlbW9kXS5tb2R1bGF0aW9uOworCX0gZWxzZSB7CisJCXBfcmVzdWx0LmxvY2tlZCA9IEZBTFNFOworCQlzd2l0Y2ggKGludHAtPmVycltkZW1vZF0pIHsKKwkJY2FzZSBTVFYwOTAwX0kyQ19FUlJPUjoKKwkJCWVycm9yID0gU1RWMDkwMF9JMkNfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBTVFYwOTAwX05PX0VSUk9SOgogCQlkZWZhdWx0OgotCQkJaV9wYXJhbXMtPmRtZDFfc3JjaF9zdGFuZGFyZCA9IHBfc2VhcmNoLnN0YW5kYXJkOwotCQkJaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGUgPSBwX3NlYXJjaC5zeW1ib2xfcmF0ZTsKLQkJCWlfcGFyYW1zLT5kbWQxX3NyY2hfcmFuZ2UgPSBwX3NlYXJjaC5zZWFyY2hfcmFuZ2U7Ci0JCQlpX3BhcmFtcy0+dHVuZXIxX2ZyZXEgPSBwX3NlYXJjaC5mcmVxdWVuY3k7Ci0JCQlpX3BhcmFtcy0+ZG1kMV9zcmNoX2FsZ28gPSBwX3NlYXJjaC5zZWFyY2hfYWxnbzsKLQkJCWlfcGFyYW1zLT5kbWQxX3NyY2hfaXFfaW52ID0gcF9zZWFyY2guaXFfaW52ZXJzaW9uOwotCQkJaV9wYXJhbXMtPmRtZDFfZmVjID0gcF9zZWFyY2guZmVjOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVFYwOTAwX0RFTU9EXzI6Ci0JCQlpX3BhcmFtcy0+ZG1kMl9zcmNoX3N0bmRyZCA9IHBfc2VhcmNoLnN0YW5kYXJkOwotCQkJaV9wYXJhbXMtPmRtZDJfc3ltYm9sX3JhdGUgPSBwX3NlYXJjaC5zeW1ib2xfcmF0ZTsKLQkJCWlfcGFyYW1zLT5kbWQyX3NyY2hfcmFuZ2UgPSBwX3NlYXJjaC5zZWFyY2hfcmFuZ2U7Ci0JCQlpX3BhcmFtcy0+dHVuZXIyX2ZyZXEgPSBwX3NlYXJjaC5mcmVxdWVuY3k7Ci0JCQlpX3BhcmFtcy0+ZG1kMl9zcmNoX2FsZ28gPSBwX3NlYXJjaC5zZWFyY2hfYWxnbzsKLQkJCWlfcGFyYW1zLT5kbWQyX3NyY2hfaXFfaW52ID0gcF9zZWFyY2guaXFfaW52ZXJzaW9uOwotCQkJaV9wYXJhbXMtPmRtZDJfZmVjID0gcF9zZWFyY2guZmVjOworCQkJZXJyb3IgPSBTVFYwOTAwX1NFQVJDSF9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgoc3R2MDkwMF9hbGdvKGZlKSA9PSBTVFYwOTAwX1JBTkdFT0spICYmCi0JCQkJCShpX3BhcmFtcy0+ZXJycyA9PSBTVFYwOTAwX05PX0VSUk9SKSkgewotCQkJc3dpdGNoIChwX3NlYXJjaC5wYXRoKSB7Ci0JCQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQkJCWRlZmF1bHQ6Ci0JCQkJcF9yZXN1bHQubG9ja2VkID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMubG9ja2VkOwotCQkJCXBfcmVzdWx0LnN0YW5kYXJkID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMuc3RhbmRhcmQ7Ci0JCQkJcF9yZXN1bHQuZnJlcXVlbmN5ID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMuZnJlcXVlbmN5OwotCQkJCXBfcmVzdWx0LnN5bWJvbF9yYXRlID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMuc3ltYm9sX3JhdGU7Ci0JCQkJcF9yZXN1bHQuZmVjID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMuZmVjOwotCQkJCXBfcmVzdWx0Lm1vZGNvZGUgPSBpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2Rjb2RlOwotCQkJCXBfcmVzdWx0LnBpbG90ID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMucGlsb3Q7Ci0JCQkJcF9yZXN1bHQuZnJhbWVfbGVuZ3RoID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMuZnJhbWVfbGVuZ3RoOwotCQkJCXBfcmVzdWx0LnNwZWN0cnVtID0gaV9wYXJhbXMtPmRtZDFfcnNsdHMuc3BlY3RydW07Ci0JCQkJcF9yZXN1bHQucm9sbG9mZiA9IGlfcGFyYW1zLT5kbWQxX3JzbHRzLnJvbGxvZmY7Ci0JCQkJcF9yZXN1bHQubW9kdWxhdGlvbiA9IGlfcGFyYW1zLT5kbWQxX3JzbHRzLm1vZHVsYXRpb247Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCQlwX3Jlc3VsdC5sb2NrZWQgPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5sb2NrZWQ7Ci0JCQkJcF9yZXN1bHQuc3RhbmRhcmQgPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5zdGFuZGFyZDsKLQkJCQlwX3Jlc3VsdC5mcmVxdWVuY3kgPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5mcmVxdWVuY3k7Ci0JCQkJcF9yZXN1bHQuc3ltYm9sX3JhdGUgPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5zeW1ib2xfcmF0ZTsKLQkJCQlwX3Jlc3VsdC5mZWMgPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5mZWM7Ci0JCQkJcF9yZXN1bHQubW9kY29kZSA9IGlfcGFyYW1zLT5kbWQyX3JzbHRzLm1vZGNvZGU7Ci0JCQkJcF9yZXN1bHQucGlsb3QgPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5waWxvdDsKLQkJCQlwX3Jlc3VsdC5mcmFtZV9sZW5ndGggPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5mcmFtZV9sZW5ndGg7Ci0JCQkJcF9yZXN1bHQuc3BlY3RydW0gPSBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5zcGVjdHJ1bTsKLQkJCQlwX3Jlc3VsdC5yb2xsb2ZmID0gaV9wYXJhbXMtPmRtZDJfcnNsdHMucm9sbG9mZjsKLQkJCQlwX3Jlc3VsdC5tb2R1bGF0aW9uID0gaV9wYXJhbXMtPmRtZDJfcnNsdHMubW9kdWxhdGlvbjsKLQkJCQlicmVhazsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJcF9yZXN1bHQubG9ja2VkID0gRkFMU0U7Ci0JCQlzd2l0Y2ggKHBfc2VhcmNoLnBhdGgpIHsKLQkJCWNhc2UgU1RWMDkwMF9ERU1PRF8xOgotCQkJCXN3aXRjaCAoaV9wYXJhbXMtPmRtZDFfZXJyKSB7Ci0JCQkJY2FzZSBTVFYwOTAwX0kyQ19FUlJPUjoKLQkJCQkJZXJyb3IgPSBTVFYwOTAwX0kyQ19FUlJPUjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTVFYwOTAwX05PX0VSUk9SOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCWVycm9yID0gU1RWMDkwMF9TRUFSQ0hfRkFJTEVEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCQlzd2l0Y2ggKGlfcGFyYW1zLT5kbWQyX2VycikgewotCQkJCWNhc2UgU1RWMDkwMF9JMkNfRVJST1I6Ci0JCQkJCWVycm9yID0gU1RWMDkwMF9JMkNfRVJST1I7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1RWMDkwMF9OT19FUlJPUjoKLQkJCQlkZWZhdWx0OgotCQkJCQllcnJvciA9IFNUVjA5MDBfU0VBUkNIX0ZBSUxFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9IGVsc2UKLQkJZXJyb3IgPSBTVFYwOTAwX0JBRF9QQVJBTUVURVI7CisJfQogCiAJaWYgKChwX3Jlc3VsdC5sb2NrZWQgPT0gVFJVRSkgJiYgKGVycm9yID09IFNUVjA5MDBfTk9fRVJST1IpKSB7Ci0JCWRwcmludGsoS0VSTl9JTkZPICJTZWFyY2ggU3VjY2Vzc1xuIik7CisJCWRwcmludGsoIlNlYXJjaCBTdWNjZXNzXG4iKTsKIAkJcmV0dXJuIERWQkZFX0FMR09fU0VBUkNIX1NVQ0NFU1M7CiAJfSBlbHNlIHsKLQkJZHByaW50ayhLRVJOX0lORk8gIlNlYXJjaCBGYWlsXG4iKTsKKwkJZHByaW50aygiU2VhcmNoIEZhaWxcbiIpOwogCQlyZXR1cm4gRFZCRkVfQUxHT19TRUFSQ0hfRkFJTEVEOwogCX0KIAotCXJldHVybiBEVkJGRV9BTEdPX1NFQVJDSF9FUlJPUjsKIH0KIAogc3RhdGljIGludCBzdHYwOTAwX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBlbnVtIGZlX3N0YXR1cyAqc3RhdHVzKQpAQCAtMTY5MCwxNiArMTU3OCwxMyBAQAogewogCiAJc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Jc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zID0gc3RhdGUtPmludGVybmFsOworCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwID0gc3RhdGUtPmludGVybmFsOwogCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QgPSBzdGF0ZS0+ZGVtb2Q7Ci0JczMyIHJzdF9maWVsZDsKLQotCWRtZF9yZWcocnN0X2ZpZWxkLCBGMDkwMF9QMV9SU1RfSFdBUkUsIEYwOTAwX1AyX1JTVF9IV0FSRSk7CiAKIAlpZiAoc3RvcF90cyA9PSBUUlVFKQotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIHJzdF9maWVsZCwgMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDEpOwogCWVsc2UKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCByc3RfZmllbGQsIDApOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgUlNUX0hXQVJFLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTcwNywyMyArMTU5MiwxOSBAQAogc3RhdGljIGludCBzdHYwOTAwX2Rpc2VxY19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwotCXMzMiBtb2RlX2ZpZWxkLCByZXNldF9maWVsZDsKIAotCWRtZF9yZWcobW9kZV9maWVsZCwgRjA5MDBfUDFfRElTVFhfTU9ERSwgRjA5MDBfUDJfRElTVFhfTU9ERSk7Ci0JZG1kX3JlZyhyZXNldF9maWVsZCwgRjA5MDBfUDFfRElTRVFDX1JFU0VULCBGMDkwMF9QMl9ESVNFUUNfUkVTRVQpOwotCi0Jc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBtb2RlX2ZpZWxkLCBzdGF0ZS0+Y29uZmlnLT5kaXNlcWNfbW9kZSk7Ci0Jc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCByZXNldF9maWVsZCwgMSk7Ci0Jc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCByZXNldF9maWVsZCwgMCk7CisJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIERJU1RYX01PREUsIHN0YXRlLT5jb25maWctPmRpc2VxY19tb2RlKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRElTRVFDX1JFU0VULCAxKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRElTRVFDX1JFU0VULCAwKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHN0djA5MDBfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCiAJc3R2MDkwMF9zdG9wX3RzKGZlLCAxKTsKIAlzdHYwOTAwX2Rpc2VxY19pbml0KGZlKTsKQEAgLTE3MzEsNDggKzE2MTIsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdHYwOTAwX2Rpc2VxY19zZW5kKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyAsIHU4ICpEYXRhLAorc3RhdGljIGludCBzdHYwOTAwX2Rpc2VxY19zZW5kKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwICwgdTggKmRhdGEsCiAJCQkJdTMyIE5iRGF0YSwgZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKIAlzMzIgaSA9IDA7CiAKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9ESVNfUFJFQ0hBUkdFLCAxKTsKLQkJd2hpbGUgKGkgPCBOYkRhdGEpIHsKLQkJCXdoaWxlIChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9GSUZPX0ZVTEwpKQotCQkJCTsvKiBjaGVja3BhdGNoIGNvbXBsYWlucyAqLwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RJU1RYREFUQSwgRGF0YVtpXSk7Ci0JCQlpKys7Ci0JCX0KKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRElTX1BSRUNIQVJHRSwgMSk7CisJd2hpbGUgKGkgPCBOYkRhdGEpIHsKKwkJd2hpbGUgKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgRklGT19GVUxMKSkKKwkJCTsvKiBjaGVja3BhdGNoIGNvbXBsYWlucyAqLworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBESVNUWERBVEEsIGRhdGFbaV0pOworCQlpKys7CisJfQogCi0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRElTX1BSRUNIQVJHRSwgMCk7Ci0JCWkgPSAwOwotCQl3aGlsZSAoKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1RYX0lETEUpICE9IDEpICYmIChpIDwgMTApKSB7Ci0JCQltc2xlZXAoMTApOwotCQkJaSsrOwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzI6Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRElTX1BSRUNIQVJHRSwgMSk7Ci0KLQkJd2hpbGUgKGkgPCBOYkRhdGEpIHsKLQkJCXdoaWxlIChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9GSUZPX0ZVTEwpKQotCQkJCTsvKiBjaGVja3BhdGNoIGNvbXBsYWlucyAqLwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RJU1RYREFUQSwgRGF0YVtpXSk7Ci0JCQlpKys7Ci0JCX0KLQotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0RJU19QUkVDSEFSR0UsIDApOwotCQlpID0gMDsKLQkJd2hpbGUgKChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9UWF9JRExFKSAhPSAxKSAmJiAoaSA8IDEwKSkgewotCQkJbXNsZWVwKDEwKTsKLQkJCWkrKzsKLQkJfQotCi0JCWJyZWFrOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBESVNfUFJFQ0hBUkdFLCAwKTsKKwlpID0gMDsKKwl3aGlsZSAoKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgVFhfSURMRSkgIT0gMSkgJiYgKGkgPCAxMCkpIHsKKwkJbXNsZWVwKDEwKTsKKwkJaSsrOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTc5MiwyMiArMTY0OSwyMSBAQAogc3RhdGljIGludCBzdHYwOTAwX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY19taW5pX2NtZF90IGJ1cnN0KQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwotCXMzMiBtb2RlX2ZpZWxkOwotCXUzMiBkaXNlcWNfZmlmbzsKKwl1OCBkYXRhOwogCi0JZG1kX3JlZyhtb2RlX2ZpZWxkLCBGMDkwMF9QMV9ESVNUWF9NT0RFLCBGMDkwMF9QMl9ESVNUWF9NT0RFKTsKLQlkbWRfcmVnKGRpc2VxY19maWZvLCBSMDkwMF9QMV9ESVNUWERBVEEsIFIwOTAwX1AyX0RJU1RYREFUQSk7CiAKIAlzd2l0Y2ggKGJ1cnN0KSB7CiAJY2FzZSBTRUNfTUlOSV9BOgotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIG1vZGVfZmllbGQsIDMpOy8qIFVubW9kdWxhdGVkICovCi0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBkaXNlcWNfZmlmbywgMHgwMCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBESVNUWF9NT0RFLCAzKTsvKiBVbm1vZHVsYXRlZCAqLworCQlkYXRhID0gMHgwMDsKKwkJc3R2MDkwMF9kaXNlcWNfc2VuZChpbnRwLCAmZGF0YSwgMSwgc3RhdGUtPmRlbW9kKTsKIAkJYnJlYWs7CiAJY2FzZSBTRUNfTUlOSV9COgotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIG1vZGVfZmllbGQsIDIpOy8qIE1vZHVsYXRlZCAqLwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgZGlzZXFjX2ZpZm8sIDB4ZmYpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRElTVFhfTU9ERSwgMik7LyogTW9kdWxhdGVkICovCisJCWRhdGEgPSAweGZmOworCQlzdHYwOTAwX2Rpc2VxY19zZW5kKGludHAsICZkYXRhLCAxLCBzdGF0ZS0+ZGVtb2QpOwogCQlicmVhazsKIAl9CiAKQEAgLTE4MTgsNjggKzE2NzQsNTQgQEAKIAkJCQlzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSAqcmVwbHkpCiB7CiAJc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Jc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zID0gc3RhdGUtPmludGVybmFsOworCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwID0gc3RhdGUtPmludGVybmFsOworCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QgPSBzdGF0ZS0+ZGVtb2Q7CiAJczMyIGkgPSAwOwogCi0Jc3dpdGNoIChzdGF0ZS0+ZGVtb2QpIHsKLQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQlkZWZhdWx0OgotCQlyZXBseS0+bXNnX2xlbiA9IDA7CisJcmVwbHktPm1zZ19sZW4gPSAwOwogCi0JCXdoaWxlICgoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfUlhfRU5EKSAhPSAxKSAmJiAoaSA8IDEwKSkgewotCQkJbXNsZWVwKDEwKTsKLQkJCWkrKzsKLQkJfQorCXdoaWxlICgoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBSWF9FTkQpICE9IDEpICYmIChpIDwgMTApKSB7CisJCW1zbGVlcCgxMCk7CisJCWkrKzsKKwl9CiAKLQkJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1JYX0VORCkpIHsKLQkJCXJlcGx5LT5tc2dfbGVuID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRklGT19CWVRFTkJSKTsKKwlpZiAoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBSWF9FTkQpKSB7CisJCXJlcGx5LT5tc2dfbGVuID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBGSUZPX0JZVEVOQlIpOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgcmVwbHktPm1zZ19sZW47IGkrKykKLQkJCQlyZXBseS0+bXNnW2ldID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRElTUlhEQVRBKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJcmVwbHktPm1zZ19sZW4gPSAwOwotCi0JCXdoaWxlICgoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfUlhfRU5EKSAhPSAxKSAmJiAoaSA8IDEwKSkgewotCQkJbXNsZWVwKDEwKTsKLQkJCWkrKzsKLQkJfQotCi0JCWlmIChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9SWF9FTkQpKSB7Ci0JCQlyZXBseS0+bXNnX2xlbiA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0ZJRk9fQllURU5CUik7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCByZXBseS0+bXNnX2xlbjsgaSsrKQotCQkJCXJlcGx5LT5tc2dbaV0gPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ESVNSWERBVEEpOwotCQl9Ci0JCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgcmVwbHktPm1zZ19sZW47IGkrKykKKwkJCXJlcGx5LT5tc2dbaV0gPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIERJU1JYREFUQSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3R2MDkwMF9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCitzdGF0aWMgaW50IHN0djA5MDBfc2V0X3RvbmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY190b25lX21vZGVfdCB0b25lb2ZmKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwotCXMzMiBtb2RlX2ZpZWxkLCByZXNldF9maWVsZDsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlczogJXNcbiIsIF9fZnVuY19fLCAoKHRvbmUgPT0gMCkgPyAiT2ZmIiA6ICJPbiIpKTsKKwlkcHJpbnRrKCIlczogJXNcbiIsIF9fZnVuY19fLCAoKHRvbmVvZmYgPT0gMCkgPyAiT24iIDogIk9mZiIpKTsKIAotCWRtZF9yZWcobW9kZV9maWVsZCwgRjA5MDBfUDFfRElTVFhfTU9ERSwgRjA5MDBfUDJfRElTVFhfTU9ERSk7Ci0JZG1kX3JlZyhyZXNldF9maWVsZCwgRjA5MDBfUDFfRElTRVFDX1JFU0VULCBGMDkwMF9QMl9ESVNFUUNfUkVTRVQpOwotCi0JaWYgKHRvbmUpIHsKLQkJLypTZXQgdGhlIERpc2VxQyBtb2RlIHRvIDIyS2h6IGNvbnRpbnVlcyB0b25lKi8KLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBtb2RlX2ZpZWxkLCAwKTsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCByZXNldF9maWVsZCwgMSk7CisJc3dpdGNoICh0b25lb2ZmKSB7CisJY2FzZSBTRUNfVE9ORV9PTjoKKwkJLypTZXQgdGhlIERpc2VxQyBtb2RlIHRvIDIyS2h6IF9jb250aW51ZXNfIHRvbmUqLworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRElTVFhfTU9ERSwgMCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBESVNFUUNfUkVTRVQsIDEpOwogCQkvKnJlbGVhc2UgRGlzZXFDIHJlc2V0IHRvIGVuYWJsZSB0aGUgMjJLSHogdG9uZSovCi0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgcmVzZXRfZmllbGQsIDApOwotCX0gZWxzZSB7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgbW9kZV9maWVsZCwgMCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBESVNFUUNfUkVTRVQsIDApOworCQlicmVhazsKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJLypyZXR1cm4gZGlzZXFjIG1vZGUgdG8gY29uZmlnLT5kaXNlcWNfbW9kZS4KKwkJVXN1YWxseSBpdCdzIHdpdGhvdXQgX2NvbnRpbnVlc18gdG9uZSAqLworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRElTVFhfTU9ERSwKKwkJCQlzdGF0ZS0+Y29uZmlnLT5kaXNlcWNfbW9kZSk7CiAJCS8qbWFpbnRhaW4gdGhlIERpc2VxQyByZXNldCB0byBkaXNhYmxlIHRoZSAyMktIeiB0b25lKi8KLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCByZXNldF9maWVsZCwgMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBESVNFUUNfUkVTRVQsIDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRElTRVFDX1JFU0VULCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xODg5LDExICsxNzMxLDExIEBACiB7CiAJc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKCgtLShzdGF0ZS0+aW50ZXJuYWwtPmRtZHNfdXNlZCkpIDw9IDApIHsKIAotCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFjdHVhbGx5IHJlbW92aW5nXG4iLCBfX2Z1bmNfXyk7CisJCWRwcmludGsoIiVzOiBBY3R1YWxseSByZW1vdmluZ1xuIiwgX19mdW5jX18pOwogCiAJCXJlbW92ZV9pbm9kZShzdGF0ZS0+aW50ZXJuYWwpOwogCQlrZnJlZShzdGF0ZS0+aW50ZXJuYWwpOwpAQCAtMTk2MywxNyArMTgwNSwxNyBAQAogCWNhc2UgMDoKIAljYXNlIDE6CiAJCWluaXRfcGFyYW1zLmRtZF9yZWZfY2xrICAJPSBjb25maWctPnh0YWw7Ci0JCWluaXRfcGFyYW1zLmRlbW9kX21vZGUJCT0gU1RWMDkwMF9EVUFMOworCQlpbml0X3BhcmFtcy5kZW1vZF9tb2RlCQk9IGNvbmZpZy0+ZGVtb2RfbW9kZTsKIAkJaW5pdF9wYXJhbXMucm9sbG9mZgkJPSBTVFYwOTAwXzM1OwogCQlpbml0X3BhcmFtcy5wYXRoMV90c19jbG9jawk9IGNvbmZpZy0+cGF0aDFfbW9kZTsKIAkJaW5pdF9wYXJhbXMudHVuMV9tYWRkcmVzcwk9IGNvbmZpZy0+dHVuMV9tYWRkcmVzczsKLQkJaW5pdF9wYXJhbXMudHVuMV9pcV9pbnZlcnNpb24JPSBTVFYwOTAwX0lRX05PUk1BTDsKKwkJaW5pdF9wYXJhbXMudHVuMV9pcV9pbnYJCT0gU1RWMDkwMF9JUV9OT1JNQUw7CiAJCWluaXRfcGFyYW1zLnR1bmVyMV9hZGMJCT0gY29uZmlnLT50dW4xX2FkYzsKIAkJaW5pdF9wYXJhbXMucGF0aDJfdHNfY2xvY2sJPSBjb25maWctPnBhdGgyX21vZGU7CiAJCWluaXRfcGFyYW1zLnRzX2NvbmZpZwkJPSBjb25maWctPnRzX2NvbmZpZ19yZWdzOwogCQlpbml0X3BhcmFtcy50dW4yX21hZGRyZXNzCT0gY29uZmlnLT50dW4yX21hZGRyZXNzOwogCQlpbml0X3BhcmFtcy50dW5lcjJfYWRjCQk9IGNvbmZpZy0+dHVuMl9hZGM7Ci0JCWluaXRfcGFyYW1zLnR1bjJfaXFfaW52ZXJzaW9uCT0gU1RWMDkwMF9JUV9TV0FQUEVEOworCQlpbml0X3BhcmFtcy50dW4yX2lxX2ludgkJPSBTVFYwOTAwX0lRX1NXQVBQRUQ7CiAKIAkJZXJyX3N0djA5MDAgPSBzdHYwOTAwX2luaXRfaW50ZXJuYWwoJnN0YXRlLT5mcm9udGVuZCwKIAkJCQkJCQkmaW5pdF9wYXJhbXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfaW5pdC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfaW5pdC5oCmluZGV4IGZmMzg4YjQuLmI2ODRkZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTAwX2luaXQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMF9pbml0LmgKQEAgLTE0MSw4NSArMTQxLDIyOCBAQAogCiB9OwogCitzdHJ1Y3Qgc3R2MDkwMF9zaG9ydF9mcmFtZXNfY2FyX2xvb3Bfb3B0aW1fdnNfbW9kIHsKKwllbnVtIGZlX3N0djA5MDBfbW9kdWxhdGlvbiBtb2R1bGF0aW9uOworCXU4IGNhcl9sb29wXzI7CSAgLyogU1I8M21zcHMgICAgICAqLworCXU4IGNhcl9sb29wXzU7CSAgLyogMzxTUjw9N21zcHMgICAqLworCXU4IGNhcl9sb29wXzEwOyAgIC8qIDc8U1I8PTE1bXNwcyAgKi8KKwl1OCBjYXJfbG9vcF8yMDsgICAvKiAxMDxTUjw9MjVtc3BzICovCisJdTggY2FyX2xvb3BfMzA7ICAgLyogMTA8U1I8PTQ1bXNwcyAqLworfTsKKwogLyogQ3V0IDEueCBUcmFja2luZyBjYXJyaWVyIGxvb3AgY2FycmllciBRUFNLIDEvMiB0byA4UFNLIDkvMTAgbG9uZyBGcmFtZSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzdHYwOTAwX2Nhcl9sb29wX29wdGltCUZFX1NUVjA5MDBfUzJDYXJMb29wWzE0XSA9IHsKLQkvKk1vZGNvZAkJMk1Qb24gCTJNUG9mZgk1TVBvbiAJNU1Qb2ZmCTEwTVBvbiAJMTBNUG9mZgkyME1Qb24gCTIwTVBvZmYJMzBNUG9uIAkzME1Qb2ZmICovCi0JeyBTVFYwOTAwX1FQU0tfMTIsCTB4MUMsCTB4MEQsCTB4MUIsCTB4MkMsCTB4M0EsCTB4MUMsCTB4MkEsCTB4M0IsCTB4MkEsCTB4MUIgfSwKLQl7IFNUVjA5MDBfUVBTS18zNSwJMHgyQywJMHgwRCwJMHgyQiwJMHgyQywJMHgzQSwJMHgwQywJMHgzQSwJMHgyQiwJMHgyQSwJMHgwQiB9LAotCXsgU1RWMDkwMF9RUFNLXzIzLAkweDJDLAkweDBELAkweDJCLAkweDJDLAkweDBCLAkweDBDLAkweDNBLAkweDFCLAkweDJBLAkweDNBIH0sCi0JeyBTVFYwOTAwX1FQU0tfMzQsCTB4M0MsCTB4MEQsCTB4M0IsCTB4MUMsCTB4MEIsCTB4M0IsCTB4M0EsCTB4MEIsCTB4MkEsCTB4M0EgfSwKLQl7IFNUVjA5MDBfUVBTS180NSwJMHgzQywJMHgwRCwJMHgzQiwJMHgxQywJMHgwQiwJMHgzQiwJMHgzQSwJMHgwQiwJMHgyQSwJMHgzQSB9LAotCXsgU1RWMDkwMF9RUFNLXzU2LAkweDBELAkweDBELAkweDNCLAkweDFDLAkweDBCLAkweDNCLAkweDNBLAkweDBCLAkweDJBLAkweDNBIH0sCi0JeyBTVFYwOTAwX1FQU0tfODksCTB4MEQsCTB4MEQsCTB4M0IsCTB4MUMsCTB4MUIsCTB4M0IsCTB4M0EsCTB4MEIsCTB4MkEsCTB4M0EgfSwKLQl7IFNUVjA5MDBfUVBTS185MTAsCTB4MUQsCTB4MEQsCTB4M0IsCTB4MUMsCTB4MUIsCTB4M0IsCTB4M0EsCTB4MEIsCTB4MkEsCTB4M0EgfSwKLQl7IFNUVjA5MDBfOFBTS18zNSwJMHgyOSwJMHgzQiwJMHgwOSwJMHgyQiwJMHgzOCwJMHgwQiwJMHgxOCwJMHgxQSwJMHgwOCwJMHgwQSB9LAotCXsgU1RWMDkwMF84UFNLXzIzLAkweDBBLAkweDNCLAkweDI5LAkweDJCLAkweDE5LAkweDBCLAkweDM4LAkweDFBLAkweDE4LAkweDBBIH0sCi0JeyBTVFYwOTAwXzhQU0tfMzQsCTB4M0EsCTB4M0IsCTB4MkEsCTB4MkIsCTB4MzksCTB4MEIsCTB4MTksCTB4MUEsCTB4MzgsCTB4MEEgfSwKLQl7IFNUVjA5MDBfOFBTS181NiwJMHgxQiwJMHgzQiwJMHgwQiwJMHgyQiwJMHgxQSwJMHgwQiwJMHgzOSwJMHgxQSwJMHgxOSwJMHgwQSB9LAotCXsgU1RWMDkwMF84UFNLXzg5LAkweDNCLAkweDNCLAkweDBCLAkweDJCLAkweDJBLAkweDBCLAkweDM5LAkweDFBLAkweDI5LAkweDM5IH0sCi0JeyBTVFYwOTAwXzhQU0tfOTEwLAkweDNCLAkweDNCLCAJMHgwQiwJMHgyQiwgCTB4MkEsCTB4MEIsCTB4MzksCTB4MUEsCTB4MjksCTB4MzkgfQorc3RhdGljIGNvbnN0IHN0cnVjdCBzdHYwOTAwX2Nhcl9sb29wX29wdGltIEZFX1NUVjA5MDBfUzJDYXJMb29wWzE0XSA9IHsKKwkvKk1vZGNvZAkJMk1Qb24gCTJNUG9mZgk1TVBvbiAJNU1Qb2ZmCTEwTVBvbgorCQkJCTEwTVBvZmYJMjBNUG9uIAkyME1Qb2ZmCTMwTVBvbiAJMzBNUG9mZiAqLworCXsgU1RWMDkwMF9RUFNLXzEyLAkweDFDLAkweDBELAkweDFCLAkweDJDLAkweDNBLAorCQkJCTB4MUMsCTB4MkEsCTB4M0IsCTB4MkEsCTB4MUIgfSwKKwl7IFNUVjA5MDBfUVBTS18zNSwJMHgyQywJMHgwRCwJMHgyQiwJMHgyQywJMHgzQSwKKwkJCQkweDBDLAkweDNBLAkweDJCLAkweDJBLAkweDBCIH0sCisJeyBTVFYwOTAwX1FQU0tfMjMsCTB4MkMsCTB4MEQsCTB4MkIsCTB4MkMsCTB4MEIsCisJCQkJMHgwQywJMHgzQSwJMHgxQiwJMHgyQSwJMHgzQSB9LAorCXsgU1RWMDkwMF9RUFNLXzM0LAkweDNDLAkweDBELAkweDNCLAkweDFDLAkweDBCLAorCQkJCTB4M0IsCTB4M0EsCTB4MEIsCTB4MkEsCTB4M0EgfSwKKwl7IFNUVjA5MDBfUVBTS180NSwJMHgzQywJMHgwRCwJMHgzQiwJMHgxQywJMHgwQiwKKwkJCQkweDNCLAkweDNBLAkweDBCLAkweDJBLAkweDNBIH0sCisJeyBTVFYwOTAwX1FQU0tfNTYsCTB4MEQsCTB4MEQsCTB4M0IsCTB4MUMsCTB4MEIsCisJCQkJMHgzQiwJMHgzQSwJMHgwQiwJMHgyQSwJMHgzQSB9LAorCXsgU1RWMDkwMF9RUFNLXzg5LAkweDBELAkweDBELAkweDNCLAkweDFDLAkweDFCLAorCQkJCTB4M0IsCTB4M0EsCTB4MEIsCTB4MkEsCTB4M0EgfSwKKwl7IFNUVjA5MDBfUVBTS185MTAsCTB4MUQsCTB4MEQsCTB4M0IsCTB4MUMsCTB4MUIsCisJCQkJMHgzQiwJMHgzQSwJMHgwQiwJMHgyQSwJMHgzQSB9LAorCXsgU1RWMDkwMF84UFNLXzM1LAkweDI5LAkweDNCLAkweDA5LAkweDJCLAkweDM4LAorCQkJCTB4MEIsCTB4MTgsCTB4MUEsCTB4MDgsCTB4MEEgfSwKKwl7IFNUVjA5MDBfOFBTS18yMywJMHgwQSwJMHgzQiwJMHgyOSwJMHgyQiwJMHgxOSwKKwkJCQkweDBCLAkweDM4LAkweDFBLAkweDE4LAkweDBBIH0sCisJeyBTVFYwOTAwXzhQU0tfMzQsCTB4M0EsCTB4M0IsCTB4MkEsCTB4MkIsCTB4MzksCisJCQkJMHgwQiwJMHgxOSwJMHgxQSwJMHgzOCwJMHgwQSB9LAorCXsgU1RWMDkwMF84UFNLXzU2LAkweDFCLAkweDNCLAkweDBCLAkweDJCLAkweDFBLAorCQkJCTB4MEIsCTB4MzksCTB4MUEsCTB4MTksCTB4MEEgfSwKKwl7IFNUVjA5MDBfOFBTS184OSwJMHgzQiwJMHgzQiwJMHgwQiwJMHgyQiwJMHgyQSwKKwkJCQkweDBCLAkweDM5LAkweDFBLAkweDI5LAkweDM5IH0sCisJeyBTVFYwOTAwXzhQU0tfOTEwLAkweDNCLAkweDNCLCAJMHgwQiwJMHgyQiwgCTB4MkEsCisJCQkJMHgwQiwJMHgzOSwJMHgxQSwJMHgyOSwJMHgzOSB9CiB9OwogCiAKIC8qIEN1dCAyLjAgVHJhY2tpbmcgY2FycmllciBsb29wIGNhcnJpZXIgUVBTSyAxLzIgdG8gOFBTSyA5LzEwIGxvbmcgRnJhbWUgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3R2MDkwMF9jYXJfbG9vcF9vcHRpbQlGRV9TVFYwOTAwX1MyQ2FyTG9vcEN1dDIwWzE0XQk9IHsKLQkvKiBNb2Rjb2QJCTJNUG9uIAkyTVBvZmYJNU1Qb24gCTVNUG9mZgkxME1Qb24gCTEwTVBvZmYJMjBNUG9uIAkyME1Qb2ZmCTMwTVBvbiAJMzBNUG9mZiAqLwotCXsgU1RWMDkwMF9RUFNLXzEyLAkweDFGLAkweDNGLAkweDFFLAkweDNGLAkweDNELAkweDFGLAkweDNELAkweDNFLAkweDNELAkweDFFIH0sCi0JeyBTVFYwOTAwX1FQU0tfMzUsCTB4MkYsCTB4M0YsCTB4MkUsCTB4MkYsCTB4M0QsCTB4MEYsCTB4MEUsCTB4MkUsCTB4M0QsCTB4MEUgfSwKLQl7IFNUVjA5MDBfUVBTS18yMywJMHgyRiwJMHgzRiwJMHgyRSwJMHgyRiwJMHgwRSwJMHgwRiwJMHgwRSwJMHgxRSwJMHgzRCwJMHgzRCB9LAotCXsgU1RWMDkwMF9RUFNLXzM0LAkweDNGLAkweDNGLAkweDNFLAkweDFGLAkweDBFLAkweDNFLAkweDBFLAkweDFFLAkweDNELAkweDNEIH0sCi0JeyBTVFYwOTAwX1FQU0tfNDUsCTB4M0YsCTB4M0YsCTB4M0UsCTB4MUYsCTB4MEUsCTB4M0UsCTB4MEUsCTB4MUUsCTB4M0QsCTB4M0QgfSwKLQl7IFNUVjA5MDBfUVBTS181NiwJMHgzRiwJMHgzRiwJMHgzRSwJMHgxRiwJMHgwRSwJMHgzRSwJMHgwRSwJMHgxRSwJMHgzRCwJMHgzRCB9LAotCXsgU1RWMDkwMF9RUFNLXzg5LAkweDNGLAkweDNGLAkweDNFLAkweDFGLAkweDFFLAkweDNFLAkweDBFLAkweDFFLAkweDNELAkweDNEIH0sCi0JeyBTVFYwOTAwX1FQU0tfOTEwLAkweDNGLAkweDNGLAkweDNFLAkweDFGLAkweDFFLAkweDNFLAkweDBFLAkweDFFLAkweDNELAkweDNEIH0sCi0JeyBTVFYwOTAwXzhQU0tfMzUsCTB4M2MsCTB4MGMsCTB4MWMsCTB4M2IsCTB4MGMsCTB4M2IsCTB4MmIsCTB4MmIsCTB4MWIsCTB4MmIgfSwKLQl7IFNUVjA5MDBfOFBTS18yMywJMHgxZCwJMHgwYywJMHgzYywJMHgwYywJMHgyYywJMHgzYiwJMHgwYywJMHgyYiwJMHgyYiwJMHgyYiB9LAotCXsgU1RWMDkwMF84UFNLXzM0LAkweDBlLAkweDFjLAkweDNkLAkweDBjLAkweDBkLAkweDNiLAkweDJjLAkweDNiLAkweDBjLAkweDJiIH0sCi0JeyBTVFYwOTAwXzhQU0tfNTYsCTB4MmUsCTB4M2UsCTB4MWUsCTB4MmUsCTB4MmQsCTB4MWUsCTB4M2MsCTB4MmQsCTB4MmMsCTB4MWQgfSwKLQl7IFNUVjA5MDBfOFBTS184OSwJMHgzZSwJMHgzZSwJMHgxZSwJMHgyZSwJMHgzZCwJMHgxZSwJMHgwZCwJMHgyZCwJMHgzYywJMHgxZCB9LAotCXsgU1RWMDkwMF84UFNLXzkxMCwJMHgzZSwJMHgzZSwgCTB4MWUsCTB4MmUsIAkweDNkLAkweDFlLAkweDFkLAkweDJkLAkweDBkLAkweDFkIH0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3R2MDkwMF9jYXJfbG9vcF9vcHRpbSBGRV9TVFYwOTAwX1MyQ2FyTG9vcEN1dDIwWzE0XSA9IHsKKwkvKiBNb2Rjb2QJCTJNUG9uIAkyTVBvZmYJNU1Qb24gCTVNUG9mZgkxME1Qb24KKwkJCQkxME1Qb2ZmCTIwTVBvbiAJMjBNUG9mZgkzME1Qb24gCTMwTVBvZmYgKi8KKwl7IFNUVjA5MDBfUVBTS18xMiwJMHgxRiwJMHgzRiwJMHgxRSwJMHgzRiwJMHgzRCwKKwkJCQkweDFGLAkweDNELAkweDNFLAkweDNELAkweDFFIH0sCisJeyBTVFYwOTAwX1FQU0tfMzUsCTB4MkYsCTB4M0YsCTB4MkUsCTB4MkYsCTB4M0QsCisJCQkJMHgwRiwJMHgwRSwJMHgyRSwJMHgzRCwJMHgwRSB9LAorCXsgU1RWMDkwMF9RUFNLXzIzLAkweDJGLAkweDNGLAkweDJFLAkweDJGLAkweDBFLAorCQkJCTB4MEYsCTB4MEUsCTB4MUUsCTB4M0QsCTB4M0QgfSwKKwl7IFNUVjA5MDBfUVBTS18zNCwJMHgzRiwJMHgzRiwJMHgzRSwJMHgxRiwJMHgwRSwKKwkJCQkweDNFLAkweDBFLAkweDFFLAkweDNELAkweDNEIH0sCisJeyBTVFYwOTAwX1FQU0tfNDUsCTB4M0YsCTB4M0YsCTB4M0UsCTB4MUYsCTB4MEUsCisJCQkJMHgzRSwJMHgwRSwJMHgxRSwJMHgzRCwJMHgzRCB9LAorCXsgU1RWMDkwMF9RUFNLXzU2LAkweDNGLAkweDNGLAkweDNFLAkweDFGLAkweDBFLAorCQkJCTB4M0UsCTB4MEUsCTB4MUUsCTB4M0QsCTB4M0QgfSwKKwl7IFNUVjA5MDBfUVBTS184OSwJMHgzRiwJMHgzRiwJMHgzRSwJMHgxRiwJMHgxRSwKKwkJCQkweDNFLAkweDBFLAkweDFFLAkweDNELAkweDNEIH0sCisJeyBTVFYwOTAwX1FQU0tfOTEwLAkweDNGLAkweDNGLAkweDNFLAkweDFGLAkweDFFLAorCQkJCTB4M0UsCTB4MEUsCTB4MUUsCTB4M0QsCTB4M0QgfSwKKwl7IFNUVjA5MDBfOFBTS18zNSwJMHgzYywJMHgwYywJMHgxYywJMHgzYiwJMHgwYywKKwkJCQkweDNiLAkweDJiLAkweDJiLAkweDFiLAkweDJiIH0sCisJeyBTVFYwOTAwXzhQU0tfMjMsCTB4MWQsCTB4MGMsCTB4M2MsCTB4MGMsCTB4MmMsCisJCQkJMHgzYiwJMHgwYywJMHgyYiwJMHgyYiwJMHgyYiB9LAorCXsgU1RWMDkwMF84UFNLXzM0LAkweDBlLAkweDFjLAkweDNkLAkweDBjLAkweDBkLAorCQkJCTB4M2IsCTB4MmMsCTB4M2IsCTB4MGMsCTB4MmIgfSwKKwl7IFNUVjA5MDBfOFBTS181NiwJMHgyZSwJMHgzZSwJMHgxZSwJMHgyZSwJMHgyZCwKKwkJCQkweDFlLAkweDNjLAkweDJkLAkweDJjLAkweDFkIH0sCisJeyBTVFYwOTAwXzhQU0tfODksCTB4M2UsCTB4M2UsCTB4MWUsCTB4MmUsCTB4M2QsCisJCQkJMHgxZSwJMHgwZCwJMHgyZCwJMHgzYywJMHgxZCB9LAorCXsgU1RWMDkwMF84UFNLXzkxMCwJMHgzZSwJMHgzZSwgCTB4MWUsCTB4MmUsIAkweDNkLAorCQkJCTB4MWUsCTB4MWQsCTB4MmQsCTB4MGQsCTB4MWQgfSwKIH07CiAKIAogCiAvKiBDdXQgMi4wIFRyYWNraW5nIGNhcnJpZXIgbG9vcCBjYXJyaWVyIDE2QVBTSyAyLzMgdG8gMzJBUFNLIDkvMTAgbG9uZyBGcmFtZSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzdHYwOTAwX2Nhcl9sb29wX29wdGltIEZFX1NUVjA5MDBfUzJBUFNLQ2FyTG9vcEN1dDIwWzExXSA9IHsKLQkvKiBNb2Rjb2QJCTJNUG9uIAkyTVBvZmYJNU1Qb24gCTVNUG9mZgkxME1Qb24gCTEwTVBvZmYJMjBNUG9uIAkyME1Qb2ZmCTMwTVBvbiAJMzBNUG9mZiAqLwotCXsgU1RWMDkwMF8xNkFQU0tfMjMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MUQsCTB4MEMsCTB4M0MsCTB4MEMsCTB4MkMsCTB4MEMgfSwKLQl7IFNUVjA5MDBfMTZBUFNLXzM0LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBFLAkweDBDLAkweDJELAkweDBDLAkweDFELAkweDBDIH0sCi0JeyBTVFYwOTAwXzE2QVBTS180NSwJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgxRSwJMHgwQywJMHgzRCwJMHgwQywJMHgyRCwJMHgwQyB9LAotCXsgU1RWMDkwMF8xNkFQU0tfNTYsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MUUsCTB4MEMsCTB4M0QsCTB4MEMsCTB4MkQsCTB4MEMgfSwKLQl7IFNUVjA5MDBfMTZBUFNLXzg5LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDJFLAkweDBDLAkweDBFLAkweDBDLAkweDNELAkweDBDIH0sCi0JeyBTVFYwOTAwXzE2QVBTS185MTAsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MkUsCTB4MEMsCTB4MEUsCTB4MEMsCTB4M0QsCTB4MEMgfSwKLQl7IFNUVjA5MDBfMzJBUFNLXzM0LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDIH0sCi0JeyBTVFYwOTAwXzMyQVBTS180NSwJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgwQyB9LAotCXsgU1RWMDkwMF8zMkFQU0tfNTYsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMgfSwKLQl7IFNUVjA5MDBfMzJBUFNLXzg5LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDIH0sCi0JeyBTVFYwOTAwXzMyQVBTS185MTAsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMgfQorCS8qIE1vZGNvZAkJMk1Qb24gCTJNUG9mZgk1TVBvbiAJNU1Qb2ZmCTEwTVBvbgorCQkJCTEwTVBvZmYJMjBNUG9uIAkyME1Qb2ZmCTMwTVBvbiAJMzBNUG9mZiAqLworCXsgU1RWMDkwMF8xNkFQU0tfMjMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MUQsCisJCQkJMHgwQywJMHgzQywJMHgwQywJMHgyQywJMHgwQyB9LAorCXsgU1RWMDkwMF8xNkFQU0tfMzQsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEUsCisJCQkJMHgwQywJMHgyRCwJMHgwQywJMHgxRCwJMHgwQyB9LAorCXsgU1RWMDkwMF8xNkFQU0tfNDUsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MUUsCisJCQkJMHgwQywJMHgzRCwJMHgwQywJMHgyRCwJMHgwQyB9LAorCXsgU1RWMDkwMF8xNkFQU0tfNTYsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MUUsCisJCQkJMHgwQywJMHgzRCwJMHgwQywJMHgyRCwJMHgwQyB9LAorCXsgU1RWMDkwMF8xNkFQU0tfODksCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MkUsCisJCQkJMHgwQywJMHgwRSwJMHgwQywJMHgzRCwJMHgwQyB9LAorCXsgU1RWMDkwMF8xNkFQU0tfOTEwLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDJFLAorCQkJCTB4MEMsCTB4MEUsCTB4MEMsCTB4M0QsCTB4MEMgfSwKKwl7IFNUVjA5MDBfMzJBUFNLXzM0LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAorCQkJCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMgfSwKKwl7IFNUVjA5MDBfMzJBUFNLXzQ1LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAorCQkJCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMgfSwKKwl7IFNUVjA5MDBfMzJBUFNLXzU2LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAorCQkJCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMgfSwKKwl7IFNUVjA5MDBfMzJBUFNLXzg5LAkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDLAorCQkJCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMsCTB4MEMgfSwKKwl7IFNUVjA5MDBfMzJBUFNLXzkxMCwJMHgwQywJMHgwQywJMHgwQywJMHgwQywJMHgwQywKKwkJCQkweDBDLAkweDBDLAkweDBDLAkweDBDLAkweDBDIH0sCiB9OwogCiAKIC8qIEN1dCAyLjAgVHJhY2tpbmcgY2FycmllciBsb29wIGNhcnJpZXIgUVBTSyAxLzQgdG8gUVBTSyAyLzUgbG9uZyBGcmFtZSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzdHYwOTAwX2Nhcl9sb29wX29wdGltIEZFX1NUVjA5MDBfUzJMb3dRUENhckxvb3BDdXQyMFszXSA9IHsKLQkvKiBNb2Rjb2QJCTJNUG9uIAkyTVBvZmYJNU1Qb24gCTVNUG9mZgkxME1Qb24gCTEwTVBvZmYJMjBNUG9uIAkyME1Qb2ZmCTMwTVBvbiAJMzBNUG9mZiAqLwotCXsgU1RWMDkwMF9RUFNLXzE0LAkweDBGLAkweDNGLAkweDBFLAkweDNGLAkweDJELAkweDJGLAkweDJELAkweDFGLAkweDNELAkweDNFIH0sCi0JeyBTVFYwOTAwX1FQU0tfMTMsCTB4MEYsCTB4M0YsCTB4MEUsCTB4M0YsCTB4MkQsCTB4MkYsCTB4M0QsCTB4MEYsCTB4M0QsCTB4MkUgfSwKLQl7IFNUVjA5MDBfUVBTS18yNSwJMHgxRiwJMHgzRiwJMHgxRSwJMHgzRiwJMHgzRCwJMHgxRiwJMHgzRCwJMHgzRSwJMHgzRCwJMHgyRSB9CisJLyogTW9kY29kCQkyTVBvbiAJMk1Qb2ZmCTVNUG9uIAk1TVBvZmYJMTBNUG9uCisJCQkJMTBNUG9mZgkyME1Qb24gCTIwTVBvZmYJMzBNUG9uIAkzME1Qb2ZmICovCisJeyBTVFYwOTAwX1FQU0tfMTQsCTB4MEYsCTB4M0YsCTB4MEUsCTB4M0YsCTB4MkQsCisJCQkJMHgyRiwJMHgyRCwJMHgxRiwJMHgzRCwJMHgzRSB9LAorCXsgU1RWMDkwMF9RUFNLXzEzLAkweDBGLAkweDNGLAkweDBFLAkweDNGLAkweDJELAorCQkJCTB4MkYsCTB4M0QsCTB4MEYsCTB4M0QsCTB4MkUgfSwKKwl7IFNUVjA5MDBfUVBTS18yNSwJMHgxRiwJMHgzRiwJMHgxRSwJMHgzRiwJMHgzRCwKKwkJCQkweDFGLAkweDNELAkweDNFLAkweDNELAkweDJFIH0KIH07CiAKIAogLyogQ3V0IDIuMCBUcmFja2luZyBjYXJyaWVyIGxvb3AgY2FycmllciAgc2hvcnQgRnJhbWUsIGN1dCAxLjIgYW5kIDIuMCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzdHYwOTAwX3Nob3J0X2ZyYW1lc19jYXJfbG9vcF9vcHRpbSBGRV9TVFYwOTAwX1MyU2hvcnRDYXJMb29wWzRdCT0gewotCS8qTW9kCTJNX2N1dDEuMiAyTV9jdXQyLjAgNU1fY3V0MS4yIDVNX2N1dDIuMCAxME1fY3V0MS4yIDEwTV9jdXQyLjAgMjBNX2N1dDEuMiAyME1fY3V0Mi4wIDMwTV9jdXQxLjIgMzBNX2N1dDIuMCAqLwotCXsgU1RWMDkwMF9RUFNLLAkJMHgzQywJMHgyRiwJMHgyQiwJMHgyRSwJMHgwQiwJMHgwRSwJMHgzQSwJMHgwRSwJMHgyQSwJMHgzRCB9LAotCXsgU1RWMDkwMF84UFNLLAkJMHgwQiwJMHgzRSwJMHgyQSwJMHgwRSwJMHgwQSwJMHgyRCwJMHgxOSwJMHgwRCwJMHgwOSwJMHgzQyB9LAotCXsgU1RWMDkwMF8xNkFQU0ssCTB4MUIsCTB4MUUsCTB4MUIsCTB4MUUsCTB4MUIsCTB4MUUsCTB4M0EsCTB4M0QsCTB4MkEsCTB4MkQgfSwKLQl7IFNUVjA5MDBfMzJBUFNLLAkweDFCLAkweDFFLAkweDFCLAkweDFFLAkweDFCLAkweDFFLAkweDNBLAkweDNELAkweDJBLAkweDJEIH0KK3N0YXRpYyBjb25zdAorc3RydWN0IHN0djA5MDBfc2hvcnRfZnJhbWVzX2Nhcl9sb29wX29wdGltIEZFX1NUVjA5MDBfUzJTaG9ydENhckxvb3BbNF0gPSB7CisJLypNb2QJCTJNY3V0MS4yIDJNY3V0Mi4wIDVNY3V0MS4yIDVNY3V0Mi4wIDEwTWN1dDEuMgorCQkJMTBNY3V0Mi4wIDIwTWN1dDEuMiAyME1fY3V0Mi4wIDMwTWN1dDEuMiAzME1jdXQyLjAqLworCXsgU1RWMDkwMF9RUFNLLAkJMHgzQywJMHgyRiwJMHgyQiwJMHgyRSwJMHgwQiwKKwkJCQkweDBFLAkweDNBLAkweDBFLAkweDJBLAkweDNEIH0sCisJeyBTVFYwOTAwXzhQU0ssCQkweDBCLAkweDNFLAkweDJBLAkweDBFLAkweDBBLAorCQkJCTB4MkQsCTB4MTksCTB4MEQsCTB4MDksCTB4M0MgfSwKKwl7IFNUVjA5MDBfMTZBUFNLLAkweDFCLAkweDFFLAkweDFCLAkweDFFLAkweDFCLAorCQkJCTB4MUUsCTB4M0EsCTB4M0QsCTB4MkEsCTB4MkQgfSwKKwl7IFNUVjA5MDBfMzJBUFNLLAkweDFCLAkweDFFLAkweDFCLAkweDFFLAkweDFCLAorCQkJCTB4MUUsCTB4M0EsCTB4M0QsCTB4MkEsCTB4MkQgfQogfTsKIAotc3RhdGljIGNvbnN0IHUxNiBTVFYwOTAwX0luaXRWYWxbMTgyXVsyXSA9IHsKK3N0YXRpYwljb25zdCBzdHJ1Y3Qgc3R2MDkwMF9jYXJfbG9vcF9vcHRpbSBGRV9TVFYwOTAwX1MyQ2FyTG9vcEN1dDMwWzE0XSA9IHsKKwkvKk1vZGNvZAkJMk1Qb24gCTJNUG9mZgk1TVBvbiAJNU1Qb2ZmCTEwTVBvbgorCQkJCTEwTVBvZmYJMjBNUG9uIAkyME1Qb2ZmCTMwTVBvbiAJMzBNUG9mZgkqLworCXsgU1RWMDkwMF9RUFNLXzEyLAkweDNDLAkweDJDLAkweDBDLAkweDJDLAkweDFCLAorCQkJCTB4MkMsCTB4MUIsCTB4MUMsCTB4MEIsIAkweDNCIH0sCisJeyBTVFYwOTAwX1FQU0tfMzUsCTB4MEQsCTB4MEQsCTB4MEMsCTB4MEQsCTB4MUIsCisJCQkJMHgzQywJMHgxQiwJMHgxQywJMHgwQiwJMHgzQiB9LAorCXsgU1RWMDkwMF9RUFNLXzIzLAkweDFELAkweDBELAkweDBDLAkweDFELAkweDJCLAorCQkJCTB4M0MsCTB4MUIsCTB4MUMsCTB4MEIsCTB4M0IgfSwKKwl7IFNUVjA5MDBfUVBTS18zNCwJMHgxRCwJMHgxRCwJMHgwQywJMHgxRCwJMHgyQiwKKwkJCQkweDNDLAkweDFCLAkweDFDLAkweDBCLAkweDNCIH0sCisJeyBTVFYwOTAwX1FQU0tfNDUsCTB4MkQsCTB4MUQsCTB4MUMsCTB4MUQsCTB4MkIsCisJCQkJMHgzQywJMHgyQiwJMHgwQywJMHgxQiwJMHgzQiB9LAorCXsgU1RWMDkwMF9RUFNLXzU2LAkweDJELAkweDFELAkweDFDLAkweDFELAkweDJCLAorCQkJCTB4M0MsCTB4MkIsCTB4MEMsCTB4MUIsCTB4M0IgfSwKKwl7IFNUVjA5MDBfUVBTS184OSwJMHgzRCwJMHgyRCwJMHgxQywJMHgxRCwJMHgzQiwKKwkJCQkweDNDLAkweDJCLAkweDBDLAkweDFCLAkweDNCIH0sCisJeyBTVFYwOTAwX1FQU0tfOTEwLAkweDNELAkweDJELAkweDFDLAkweDFELAkweDNCLAorCQkJCTB4M0MsCTB4MkIsCTB4MEMsCTB4MUIsCTB4M0IgfSwKKwl7IFNUVjA5MDBfOFBTS18zNSwJMHgzOSwJMHgxOSwJMHgzOSwJMHgxOSwJMHgxOSwKKwkJCQkweDE5LAkweDE5LAkweDE5LAkweDA5LAkweDE5IH0sCisJeyBTVFYwOTAwXzhQU0tfMjMsCTB4MkEsCTB4MzksCTB4MUEsCTB4MEEsCTB4MzksCisJCQkJMHgwQSwJMHgyOSwJMHgzOSwJMHgyOSwJMHgwQSB9LAorCXsgU1RWMDkwMF84UFNLXzM0LAkweDBCLAkweDNBLAkweDBCLAkweDBCLAkweDNBLAorCQkJCTB4MUIsCTB4MUEsCTB4MEIsCTB4MUEsCTB4M0EgfSwKKwl7IFNUVjA5MDBfOFBTS181NiwJMHgwQywJMHgxQiwJMHgzQiwJMHgyQiwJMHgxQiwKKwkJCQkweDNCLAkweDNBLAkweDNCLAkweDNBLAkweDFCIH0sCisJeyBTVFYwOTAwXzhQU0tfODksCTB4MkMsCTB4MkMsCTB4MkMsCTB4MUMsCTB4MkIsCisJCQkJMHgwQywJMHgwQiwJMHgzQiwJMHgwQiwJMHgxQiB9LAorCXsgU1RWMDkwMF84UFNLXzkxMCwJMHgyQywJMHgzQywJMHgyQywJMHgxQywJMHgzQiwKKwkJCQkweDFDLAkweDBCLAkweDNCLAkweDBCLAkweDFCIH0KK307CisKK3N0YXRpYwljb25zdAorc3RydWN0IHN0djA5MDBfY2FyX2xvb3Bfb3B0aW0gRkVfU1RWMDkwMF9TMkFQU0tDYXJMb29wQ3V0MzBbMTFdID0geworCS8qTW9kY29kCQkyTVBvbiAJMk1Qb2ZmCTVNUG9uIAk1TVBvZmYJMTBNUG9uCisJCQkJMTBNUG9mZgkyME1Qb24gCTIwTVBvZmYJMzBNUG9uIAkzME1Qb2ZmCSovCisJeyBTVFYwOTAwXzE2QVBTS18yMywJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgxQSwKKwkJCQkweDBBLAkweDNBLAkweDBBLAkweDJBLAkweDBBIH0sCisJeyBTVFYwOTAwXzE2QVBTS18zNCwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQiwKKwkJCQkweDBBLAkweDNCLAkweDBBLAkweDFCLAkweDBBIH0sCisJeyBTVFYwOTAwXzE2QVBTS180NSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgxQiwKKwkJCQkweDBBLAkweDNCLAkweDBBLAkweDJCLAkweDBBIH0sCisJeyBTVFYwOTAwXzE2QVBTS181NiwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgxQiwKKwkJCQkweDBBLAkweDNCLAkweDBBLAkweDJCLAkweDBBIH0sCisJeyBTVFYwOTAwXzE2QVBTS184OSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgyQiwKKwkJCQkweDBBLAkweDBDLAkweDBBLAkweDNCLAkweDBBIH0sCisJeyBTVFYwOTAwXzE2QVBTS185MTAsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MkIsCisJCQkJMHgwQSwJMHgwQywJMHgwQSwJMHgzQiwJMHgwQSB9LAorCXsgU1RWMDkwMF8zMkFQU0tfMzQsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCisJCQkJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSB9LAorCXsgU1RWMDkwMF8zMkFQU0tfNDUsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCisJCQkJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSB9LAorCXsgU1RWMDkwMF8zMkFQU0tfNTYsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCisJCQkJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSB9LAorCXsgU1RWMDkwMF8zMkFQU0tfODksCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCisJCQkJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSwJMHgwQSB9LAorCXsgU1RWMDkwMF8zMkFQU0tfOTEwLAkweDBBLAkweDBBLAkweDBBLAkweDBBLAkweDBBLAorCQkJCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEsCTB4MEEgfQorfTsKKworc3RhdGljCWNvbnN0CitzdHJ1Y3Qgc3R2MDkwMF9jYXJfbG9vcF9vcHRpbSBGRV9TVFYwOTAwX1MyTG93UVBDYXJMb29wQ3V0MzBbM10gPSB7CisJLypNb2Rjb2QJCTJNUG9uIAkyTVBvZmYJNU1Qb24gCTVNUG9mZgkxME1Qb24KKwkJCQkxME1Qb2ZmCTIwTVBvbiAJMjBNUG9mZgkzME1Qb24gCTMwTVBvZmYqLworCXsgU1RWMDkwMF9RUFNLXzE0LAkweDBDLAkweDNDLAkweDBCLAkweDNDLAkweDJBLAorCQkJCTB4MkMsCTB4MkEsCTB4MUMsCTB4M0EsCTB4M0IgfSwKKwl7IFNUVjA5MDBfUVBTS18xMywJMHgwQywJMHgzQywJMHgwQiwJMHgzQywJMHgyQSwKKwkJCQkweDJDLAkweDNBLAkweDBDLAkweDNBLAkweDJCIH0sCisJeyBTVFYwOTAwX1FQU0tfMjUsCTB4MUMsCTB4M0MsCTB4MUIsCTB4M0MsCTB4M0EsCisJCQkJMHgxQywJMHgzQSwJMHgzQiwJMHgzQSwJMHgyQiB9Cit9OworCitzdGF0aWMJY29uc3Qgc3RydWN0IHN0djA5MDBfc2hvcnRfZnJhbWVzX2Nhcl9sb29wX29wdGltX3ZzX21vZAorRkVfU1RWMDkwMF9TMlNob3J0Q2FyTG9vcEN1dDMwWzRdID0geworCS8qTW9kCQkyTWN1dDMuMCA1TWN1dDMuMCAxME1jdXQzLjAgMjBNY3V0My4wIDMwTWN1dDMuMCovCisJeyBTVFYwOTAwX1FQU0ssCQkweDJDLAkweDJCLAkweDBCLAkweDBCLAkweDNBIH0sCisJeyBTVFYwOTAwXzhQU0ssCQkweDNCLAkweDBCLAkweDJBLAkweDBBLAkweDM5IH0sCisJeyBTVFYwOTAwXzE2QVBTSywJMHgxQiwJMHgxQiwJMHgxQiwJMHgzQSwJMHgyQSB9LAorCXsgU1RWMDkwMF8zMkFQU0ssCTB4MUIsCTB4MUIsCTB4MUIsCTB4M0EsCTB4MkEgfSwKKworfTsKKworc3RhdGljIGNvbnN0IHUxNiBTVFYwOTAwX0luaXRWYWxbMTgxXVsyXSA9IHsKIAl7IFIwOTAwX09VVENGRwkJLCAweDAwCX0sCi0JeyBSMDkwMF9NT0RFQ0ZHCQksIDB4ZmYJfSwKIAl7IFIwOTAwX0FHQ1JGMUNGRwksIDB4MTEJfSwKIAl7IFIwOTAwX0FHQ1JGMkNGRwksIDB4MTMJfSwKIAl7IFIwOTAwX1RTR0VORVJBTDFYCSwgMHgxNAl9LApAQCAtMzgxLDcgKzUyNCw3IEBACiAJeyBSMDkwMF9HQUlOTExSX05GMTUJLCAweDFBCX0sCiAJeyBSMDkwMF9HQUlOTExSX05GMTYJLCAweDFGCX0sCiAJeyBSMDkwMF9HQUlOTExSX05GMTcJLCAweDIxCX0sCi0JeyBSMDkwMF9SQ0NGR0gJCSwgMHgyMAl9LAorCXsgUjA5MDBfUkNDRkcyCQksIDB4MjAJfSwKIAl7IFIwOTAwX1AxX0ZFQ00JCSwgMHgwMQl9LCAvKmRpc2FibGUgRFNTIG1vZGVzKi8KIAl7IFIwOTAwX1AyX0ZFQ00JCSwgMHgwMQl9LCAvKmRpc2FibGUgRFNTIG1vZGVzKi8KIAl7IFIwOTAwX1AxX1BSVklUCSwgMHgyRgl9LCAvKmRpc2FibGUgcHVuY3R1cmUgcmF0ZSA2LzcqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfcHJpdi5oCmluZGV4IDVlZDdhMTQuLmQ4YmE4YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTAwX3ByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMF9wcml2LmgKQEAgLTQ2LDIyICs0Niw2IEBACiAjZGVmaW5lIEZBTFNFICghVFJVRSkKICNlbmRpZgogCi0jZGVmaW5lCWRtZF9yZWcoYSwgYiwgYykgXAotCWRvIHsgXAotCQlhID0gMDsgXAotCQlzd2l0Y2ggKGRlbW9kKSB7IFwKLQkJY2FzZSBTVFYwOTAwX0RFTU9EXzE6IFwKLQkJZGVmYXVsdDogXAotCQkJYSA9IGI7IFwKLQkJCWJyZWFrOyBcCi0JCWNhc2UgU1RWMDkwMF9ERU1PRF8yOiBcCi0JCQlhID0gYzsgXAotCQkJYnJlYWs7IFwKLQkJfSBcCi0JfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCBzdHZkZWJ1ZzsKLQogI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIFwKIAlkbyB7IFwKIAkJaWYgKHN0dmRlYnVnKSBcCkBAIC03MCw2ICs1NCw4IEBACiAKICNkZWZpbmUgU1RWMDkwMF9NQVhMT09LVVBTSVpFIDUwMAogI2RlZmluZSBTVFYwOTAwX0JMSU5EX1NFQVJDSF9BR0MyX1RIIDcwMAorI2RlZmluZSBTVFYwOTAwX0JMSU5EX1NFQVJDSF9BR0MyX1RIX0NVVDMwIDE0MDAKKyNkZWZpbmUgSVFQT1dFUl9USFJFU0hPTEQgIDMwCiAKIC8qIE9uZSBwb2ludCBvZiB0aGUgbG9va3VwIHRhYmxlICovCiBzdHJ1Y3Qgc3R2MDAwX2xvb2twb2ludCB7CkBAIC0yNjMsMTQgKzI0OSwxNCBAQAogCWludAl0dW5lcjFfYWRjOwogCiAJLyogSVEgZnJvbSB0aGUgdHVuZXIxIHRvIHRoZSBkZW1vZCAqLwotCWVudW0gc3R2MDkwMF9pcV9pbnZlcnNpb24JdHVuMV9pcV9pbnZlcnNpb247CisJZW51bSBzdHYwOTAwX2lxX2ludmVyc2lvbgl0dW4xX2lxX2ludjsKIAllbnVtIGZlX3N0djA5MDBfY2xvY2tfdHlwZQlwYXRoMl90c19jbG9jazsKIAogCXU4CXR1bjJfbWFkZHJlc3M7CiAJaW50CXR1bmVyMl9hZGM7CiAKIAkvKiBJUSBmcm9tIHRoZSB0dW5lcjIgdG8gdGhlIGRlbW9kICovCi0JZW51bSBzdHYwOTAwX2lxX2ludmVyc2lvbgl0dW4yX2lxX2ludmVyc2lvbjsKKwllbnVtIHN0djA5MDBfaXFfaW52ZXJzaW9uCXR1bjJfaXFfaW52OwogCXN0cnVjdCBzdHYwOTAwX3JlZwkJKnRzX2NvbmZpZzsKIH07CiAKQEAgLTMwMCw3ICsyODYsNyBAQAogCWVudW0gZmVfc3R2MDkwMF9tb2Rjb2RlCQkJbW9kY29kZTsKIAllbnVtIGZlX3N0djA5MDBfbW9kdWxhdGlvbgkJbW9kdWxhdGlvbjsKIAllbnVtIGZlX3N0djA5MDBfcGlsb3QJCQlwaWxvdDsKLQllbnVtIGZlX3N0djA5MDBfZnJhbWVfbGVuZ3RoCQlmcmFtZV9sZW5ndGg7CisJZW51bSBmZV9zdHYwOTAwX2ZyYW1lX2xlbmd0aAkJZnJhbWVfbGVuOwogCWVudW0gc3R2MDkwMF9pcV9pbnZlcnNpb24JCXNwZWN0cnVtOwogCWVudW0gZmVfc3R2MDkwMF9yb2xsb2ZmCQkJcm9sbG9mZjsKIApAQCAtMzE4LDQ3ICszMDQsMjUgQEAKIAkvKiBEZW1vZHVsYXRvciB1c2UgZm9yIHNpbmdsZSBkZW1vZCBvciBmb3IgZHVhbCBkZW1vZCkgKi8KIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbW9kZQlkZW1vZF9tb2RlOwogCi0JLypEZW1vZCAxKi8KLQlzMzIJdHVuZXIxX2ZyZXE7Ci0JczMyCXR1bmVyMV9idzsKLQlzMzIJZG1kMV9zeW1ib2xfcmF0ZTsKLQlzMzIJZG1kMV9zcmNoX3JhbmdlOworCS8qRGVtb2RzICovCisJczMyCWZyZXFbMl07CisJczMyCWJ3WzJdOworCXMzMglzeW1ib2xfcmF0ZVsyXTsKKwlzMzIJc3JjaF9yYW5nZVsyXTsKIAogCS8qIGFsZ29yaXRobSBmb3Igc2VhcmNoIEJsaW5kLCBDb2xkIG9yIFdhcm0qLwotCWVudW0gZmVfc3R2MDkwMF9zZWFyY2hfYWxnbwlkbWQxX3NyY2hfYWxnbzsKKwllbnVtIGZlX3N0djA5MDBfc2VhcmNoX2FsZ28Jc3JjaF9hbGdvWzJdOwogCS8qIHNlYXJjaCBzdGFuZGFyZDogQXV0bywgRFZCUzEvRFNTIG9ubHkgb3IgRFZCUzIgb25seSovCi0JZW51bSBmZV9zdHYwOTAwX3NlYXJjaF9zdGFuZGFyZAlkbWQxX3NyY2hfc3RhbmRhcmQ7CisJZW51bSBmZV9zdHYwOTAwX3NlYXJjaF9zdGFuZGFyZAlzcmNoX3N0YW5kYXJkWzJdOwogCS8qIGludmVyc2lvbiBzZWFyY2ggOiBhdXRvLCBhdXRvIG5vcm1hIGZpcnN0LCBub3JtYWwgb3IgaW52ZXJ0ZWQgKi8KLQllbnVtIGZlX3N0djA5MDBfc2VhcmNoX2lxCWRtZDFfc3JjaF9pcV9pbnY7Ci0JZW51bSBmZV9zdHYwOTAwX21vZGNvZGUJCWRtZDFfbW9kY29kZTsKLQllbnVtIGZlX3N0djA5MDBfbW9kdWxhdGlvbglkbWQxX21vZHVsYXRpb247Ci0JZW51bSBmZV9zdHYwOTAwX2ZlYwkJZG1kMV9mZWM7CisJZW51bSBmZV9zdHYwOTAwX3NlYXJjaF9pcQlzcmNoX2lxX2ludlsyXTsKKwllbnVtIGZlX3N0djA5MDBfbW9kY29kZQkJbW9kY29kZVsyXTsKKwllbnVtIGZlX3N0djA5MDBfbW9kdWxhdGlvbgltb2R1bGF0aW9uWzJdOworCWVudW0gZmVfc3R2MDkwMF9mZWMJCWZlY1syXTsKIAotCXN0cnVjdCBzdHYwOTAwX3NpZ25hbF9pbmZvCWRtZDFfcnNsdHM7Ci0JZW51bSBmZV9zdHYwOTAwX3NpZ25hbF90eXBlCWRtZDFfc3RhdGU7CisJc3RydWN0IHN0djA5MDBfc2lnbmFsX2luZm8JcmVzdWx0WzJdOworCWVudW0gZmVfc3R2MDkwMF9lcnJvcgkJZXJyWzJdOwogCi0JZW51bSBmZV9zdHYwOTAwX2Vycm9yCQlkbWQxX2VycjsKLQotCS8qRGVtb2QgMiovCi0JczMyCXR1bmVyMl9mcmVxOwotCXMzMgl0dW5lcjJfYnc7Ci0JczMyCWRtZDJfc3ltYm9sX3JhdGU7Ci0JczMyCWRtZDJfc3JjaF9yYW5nZTsKLQotCWVudW0gZmVfc3R2MDkwMF9zZWFyY2hfYWxnbwlkbWQyX3NyY2hfYWxnbzsKLQllbnVtIGZlX3N0djA5MDBfc2VhcmNoX3N0YW5kYXJkCWRtZDJfc3JjaF9zdG5kcmQ7Ci0JLyogaW52ZXJzaW9uIHNlYXJjaCA6IGF1dG8sIGF1dG8gbm9ybWFsIGZpcnN0LCBub3JtYWwgb3IgaW52ZXJ0ZWQgKi8KLQllbnVtIGZlX3N0djA5MDBfc2VhcmNoX2lxCWRtZDJfc3JjaF9pcV9pbnY7Ci0JZW51bSBmZV9zdHYwOTAwX21vZGNvZGUJCWRtZDJfbW9kY29kZTsKLQllbnVtIGZlX3N0djA5MDBfbW9kdWxhdGlvbglkbWQyX21vZHVsYXRpb247Ci0JZW51bSBmZV9zdHYwOTAwX2ZlYwkJZG1kMl9mZWM7Ci0KLQkvKiByZXN1bHRzIG9mIHRoZSBzZWFyY2gqLwotCXN0cnVjdCBzdHYwOTAwX3NpZ25hbF9pbmZvCWRtZDJfcnNsdHM7Ci0JLyogY3VycmVudCBzdGF0ZSBvZiB0aGUgc2VhcmNoIGFsZ29yaXRobSAqLwotCWVudW0gZmVfc3R2MDkwMF9zaWduYWxfdHlwZQlkbWQyX3N0YXRlOwotCi0JZW51bSBmZV9zdHYwOTAwX2Vycm9yCQlkbWQyX2VycjsKIAogCXN0cnVjdCBpMmNfYWRhcHRlcgkqaTJjX2FkYXA7CiAJdTgJCQlpMmNfYWRkcjsKQEAgLTM3OSw2ICszNDMsOCBAQAogCWludCBkZW1vZDsKIH07CiAKK2V4dGVybiBpbnQgc3R2ZGVidWc7CisKIGV4dGVybiBzMzIgZ2UyY29tcChzMzIgYSwgczMyIHdpZHRoKTsKIAogZXh0ZXJuIHZvaWQgc3R2MDkwMF93cml0ZV9yZWcoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLApAQCAtNDE4LDEzICszODQsMTQgQEAKIGV4dGVybiB2b2lkIHN0djA5MDBfc3RvcF9hbGxfczJfbW9kY29kKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKIAkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKTsKIAotZXh0ZXJuIHZvaWQgc3R2MDkwMF9hY3RpdmF0ZV9zMl9tb2Rjb2RlKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK2V4dGVybiB2b2lkIHN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKIAkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKTsKIAotZXh0ZXJuIHZvaWQgc3R2MDkwMF9hY3RpdmF0ZV9zMl9tb2Rjb2RlX3NpbmdsZShzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitleHRlcm4gdm9pZCBzdHYwOTAwX2FjdGl2YXRlX3MyX21vZGNvZF9zaW5nbGUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAogCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpOwogCi1leHRlcm4gZW51bSBmZV9zdHYwOTAwX3RyYWNraW5nX3N0YW5kYXJkIHN0djA5MDBfZ2V0X3N0YW5kYXJkKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorZXh0ZXJuIGVudW0KK2ZlX3N0djA5MDBfdHJhY2tpbmdfc3RhbmRhcmQgc3R2MDkwMF9nZXRfc3RhbmRhcmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCiAJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfcmVnLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMF9yZWcuaAppbmRleCAyNjRmOWNmLi43YjhlZGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMF9yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMF9yZWcuaApAQCAtMTQsNyArMTQsNyBAQAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQogICoKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgpAQCAtMjYsMzc2MiArMjYsMzk1MCBAQAogI2lmbmRlZiBTVFYwOTAwX1JFR19ICiAjZGVmaW5lIFNUVjA5MDBfUkVHX0gKIAorZXh0ZXJuIHMzMiBzaGlmdHgoczMyIHgsIGludCBkZW1vZCwgczMyIHNoaWZ0KTsKKworI2RlZmluZSBSRUd4KHgpIHNoaWZ0eCh4LCBkZW1vZCwgMHgyMDApCisjZGVmaW5lIEZMRHgoeCkgc2hpZnR4KHgsIGRlbW9kLCAweDIwMDAwMDApCisKIC8qTUlEKi8KLSNkZWZpbmUgUjA5MDBfTUlEICAweGYxMDAKLSNkZWZpbmUgRjA5MDBfTUNISVBfSURFTlQgIDB4ZjEwMDAwZjAKLSNkZWZpbmUgRjA5MDBfTVJFTEVBU0UgIDB4ZjEwMDAwMGYKKyNkZWZpbmUgUjA5MDBfTUlEIDB4ZjEwMAorI2RlZmluZSBGMDkwMF9NQ0hJUF9JREVOVCAweGYxMDAwMGYwCisjZGVmaW5lIEYwOTAwX01SRUxFQVNFIDB4ZjEwMDAwMGYKIAogLypEQUNSMSovCi0jZGVmaW5lIFIwOTAwX0RBQ1IxICAweGYxMTMKLSNkZWZpbmUgRjA5MDBfREFDX01PREUgIDB4ZjExMzAwZTAKLSNkZWZpbmUgRjA5MDBfREFDX1ZBTFVFMSAgMHhmMTEzMDAwZgorI2RlZmluZSBSMDkwMF9EQUNSMSAweGYxMTMKKyNkZWZpbmUgRjA5MDBfREFDX01PREUgMHhmMTEzMDBlMAorI2RlZmluZSBGMDkwMF9EQUNfVkFMVUUxIDB4ZjExMzAwMGYKIAogLypEQUNSMiovCi0jZGVmaW5lIFIwOTAwX0RBQ1IyICAweGYxMTQKLSNkZWZpbmUgRjA5MDBfREFDX1ZBTFVFMCAgMHhmMTE0MDBmZgorI2RlZmluZSBSMDkwMF9EQUNSMiAweGYxMTQKKyNkZWZpbmUgRjA5MDBfREFDX1ZBTFVFMCAweGYxMTQwMGZmCiAKIC8qT1VUQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfT1VUQ0ZHICAweGYxMWMKLSNkZWZpbmUgRjA5MDBfSU5WX0RBVEE2ICAweGYxMWMwMDgwCi0jZGVmaW5lIEYwOTAwX09VVFNFUlJTMV9IWiAgMHhmMTFjMDA0MAotI2RlZmluZSBGMDkwMF9PVVRTRVJSUzJfSFogIDB4ZjExYzAwMjAKLSNkZWZpbmUgRjA5MDBfT1VUU0VSUlMzX0haICAweGYxMWMwMDEwCi0jZGVmaW5lIEYwOTAwX09VVFBBUlJTM19IWiAgMHhmMTFjMDAwOAotI2RlZmluZSBGMDkwMF9PVVRIWjNfQ09OVFJPTCAgMHhmMTFjMDAwNwotCi0vKk1PREVDRkcqLwotI2RlZmluZSBSMDkwMF9NT0RFQ0ZHICAweGYxMWQKLSNkZWZpbmUgRjA5MDBfRkVDU1BZX1NFTF8yICAweGYxMWQwMDIwCi0jZGVmaW5lIEYwOTAwX0hXQVJFX1NFTF8yICAweGYxMWQwMDEwCi0jZGVmaW5lIEYwOTAwX1BLVERFTF9TRUxfMiAgMHhmMTFkMDAwOAotI2RlZmluZSBGMDkwMF9ESVNFUUNfU0VMXzIgIDB4ZjExZDAwMDQKLSNkZWZpbmUgRjA5MDBfVklUX1NFTF8yICAweGYxMWQwMDAyCi0jZGVmaW5lIEYwOTAwX0RFTU9EX1NFTF8yICAweGYxMWQwMDAxCisjZGVmaW5lIFIwOTAwX09VVENGRyAweGYxMWMKKyNkZWZpbmUgRjA5MDBfT1VUU0VSUlMxX0haIDB4ZjExYzAwNDAKKyNkZWZpbmUgRjA5MDBfT1VUU0VSUlMyX0haIDB4ZjExYzAwMjAKKyNkZWZpbmUgRjA5MDBfT1VUU0VSUlMzX0haIDB4ZjExYzAwMTAKKyNkZWZpbmUgRjA5MDBfT1VUUEFSUlMzX0haIDB4ZjExYzAwMDgKIAogLypJUlFTVEFUVVMzKi8KLSNkZWZpbmUgUjA5MDBfSVJRU1RBVFVTMyAgMHhmMTIwCi0jZGVmaW5lIEYwOTAwX1NQTExfTE9DSyAgMHhmMTIwMDAyMAotI2RlZmluZSBGMDkwMF9TU1RSRUFNX0xDS18zICAweGYxMjAwMDEwCi0jZGVmaW5lIEYwOTAwX1NTVFJFQU1fTENLXzIgIDB4ZjEyMDAwMDgKLSNkZWZpbmUgRjA5MDBfU1NUUkVBTV9MQ0tfMSAgMHhmMTIwMDAwNAotI2RlZmluZSBGMDkwMF9TRFZCUzFfUFJGXzIgIDB4ZjEyMDAwMDIKLSNkZWZpbmUgRjA5MDBfU0RWQlMxX1BSRl8xICAweGYxMjAwMDAxCisjZGVmaW5lIFIwOTAwX0lSUVNUQVRVUzMgMHhmMTIwCisjZGVmaW5lIEYwOTAwX1NQTExfTE9DSyAweGYxMjAwMDIwCisjZGVmaW5lIEYwOTAwX1NTVFJFQU1fTENLXzMgMHhmMTIwMDAxMAorI2RlZmluZSBGMDkwMF9TU1RSRUFNX0xDS18yIDB4ZjEyMDAwMDgKKyNkZWZpbmUgRjA5MDBfU1NUUkVBTV9MQ0tfMSAweGYxMjAwMDA0CisjZGVmaW5lIEYwOTAwX1NEVkJTMV9QUkZfMiAweGYxMjAwMDAyCisjZGVmaW5lIEYwOTAwX1NEVkJTMV9QUkZfMSAweGYxMjAwMDAxCiAKIC8qSVJRU1RBVFVTMiovCi0jZGVmaW5lIFIwOTAwX0lSUVNUQVRVUzIgIDB4ZjEyMQotI2RlZmluZSBGMDkwMF9TU1BZX0VORFNJTV8zICAweGYxMjEwMDgwCi0jZGVmaW5lIEYwOTAwX1NTUFlfRU5EU0lNXzIgIDB4ZjEyMTAwNDAKLSNkZWZpbmUgRjA5MDBfU1NQWV9FTkRTSU1fMSAgMHhmMTIxMDAyMAotI2RlZmluZSBGMDkwMF9TUEtUREVMX0VSUk9SXzIgIDB4ZjEyMTAwMTAKLSNkZWZpbmUgRjA5MDBfU1BLVERFTF9MT0NLQl8yICAweGYxMjEwMDA4Ci0jZGVmaW5lIEYwOTAwX1NQS1RERUxfTE9DS18yICAweGYxMjEwMDA0Ci0jZGVmaW5lIEYwOTAwX1NQS1RERUxfRVJST1JfMSAgMHhmMTIxMDAwMgotI2RlZmluZSBGMDkwMF9TUEtUREVMX0xPQ0tCXzEgIDB4ZjEyMTAwMDEKKyNkZWZpbmUgUjA5MDBfSVJRU1RBVFVTMiAweGYxMjEKKyNkZWZpbmUgRjA5MDBfU1NQWV9FTkRTSU1fMyAweGYxMjEwMDgwCisjZGVmaW5lIEYwOTAwX1NTUFlfRU5EU0lNXzIgMHhmMTIxMDA0MAorI2RlZmluZSBGMDkwMF9TU1BZX0VORFNJTV8xIDB4ZjEyMTAwMjAKKyNkZWZpbmUgRjA5MDBfU1BLVERFTF9FUlJPUl8yIDB4ZjEyMTAwMTAKKyNkZWZpbmUgRjA5MDBfU1BLVERFTF9MT0NLQl8yIDB4ZjEyMTAwMDgKKyNkZWZpbmUgRjA5MDBfU1BLVERFTF9MT0NLXzIgMHhmMTIxMDAwNAorI2RlZmluZSBGMDkwMF9TUEtUREVMX0VSUk9SXzEgMHhmMTIxMDAwMgorI2RlZmluZSBGMDkwMF9TUEtUREVMX0xPQ0tCXzEgMHhmMTIxMDAwMQogCiAvKklSUVNUQVRVUzEqLwotI2RlZmluZSBSMDkwMF9JUlFTVEFUVVMxICAweGYxMjIKLSNkZWZpbmUgRjA5MDBfU1BLVERFTF9MT0NLXzEgIDB4ZjEyMjAwODAKLSNkZWZpbmUgRjA5MDBfU0VYVFBJTkIyICAweGYxMjIwMDQwCi0jZGVmaW5lIEYwOTAwX1NFWFRQSU4yICAweGYxMjIwMDIwCi0jZGVmaW5lIEYwOTAwX1NFWFRQSU5CMSAgMHhmMTIyMDAxMAotI2RlZmluZSBGMDkwMF9TRVhUUElOMSAgMHhmMTIyMDAwOAotI2RlZmluZSBGMDkwMF9TREVNT0RfTE9DS0JfMiAgMHhmMTIyMDAwNAotI2RlZmluZSBGMDkwMF9TREVNT0RfTE9DS18yICAweGYxMjIwMDAyCi0jZGVmaW5lIEYwOTAwX1NERU1PRF9JUlFfMiAgMHhmMTIyMDAwMQorI2RlZmluZSBSMDkwMF9JUlFTVEFUVVMxIDB4ZjEyMgorI2RlZmluZSBGMDkwMF9TUEtUREVMX0xPQ0tfMSAweGYxMjIwMDgwCisjZGVmaW5lIEYwOTAwX1NERU1PRF9MT0NLQl8yIDB4ZjEyMjAwMDQKKyNkZWZpbmUgRjA5MDBfU0RFTU9EX0xPQ0tfMiAweGYxMjIwMDAyCisjZGVmaW5lIEYwOTAwX1NERU1PRF9JUlFfMiAweGYxMjIwMDAxCiAKIC8qSVJRU1RBVFVTMCovCi0jZGVmaW5lIFIwOTAwX0lSUVNUQVRVUzAgIDB4ZjEyMwotI2RlZmluZSBGMDkwMF9TREVNT0RfTE9DS0JfMSAgMHhmMTIzMDA4MAotI2RlZmluZSBGMDkwMF9TREVNT0RfTE9DS18xICAweGYxMjMwMDQwCi0jZGVmaW5lIEYwOTAwX1NERU1PRF9JUlFfMSAgMHhmMTIzMDAyMAotI2RlZmluZSBGMDkwMF9TQkNIX0VSUkZMQUcgIDB4ZjEyMzAwMTAKLSNkZWZpbmUgRjA5MDBfU0RJU0VRQzJSWF9JUlEgIDB4ZjEyMzAwMDgKLSNkZWZpbmUgRjA5MDBfU0RJU0VRQzJUWF9JUlEgIDB4ZjEyMzAwMDQKLSNkZWZpbmUgRjA5MDBfU0RJU0VRQzFSWF9JUlEgIDB4ZjEyMzAwMDIKLSNkZWZpbmUgRjA5MDBfU0RJU0VRQzFUWF9JUlEgIDB4ZjEyMzAwMDEKKyNkZWZpbmUgUjA5MDBfSVJRU1RBVFVTMCAweGYxMjMKKyNkZWZpbmUgRjA5MDBfU0RFTU9EX0xPQ0tCXzEgMHhmMTIzMDA4MAorI2RlZmluZSBGMDkwMF9TREVNT0RfTE9DS18xIDB4ZjEyMzAwNDAKKyNkZWZpbmUgRjA5MDBfU0RFTU9EX0lSUV8xIDB4ZjEyMzAwMjAKKyNkZWZpbmUgRjA5MDBfU0JDSF9FUlJGTEFHIDB4ZjEyMzAwMTAKKyNkZWZpbmUgRjA5MDBfU0RJU0VRQzJSWF9JUlEgMHhmMTIzMDAwOAorI2RlZmluZSBGMDkwMF9TRElTRVFDMlRYX0lSUSAweGYxMjMwMDA0CisjZGVmaW5lIEYwOTAwX1NESVNFUUMxUlhfSVJRIDB4ZjEyMzAwMDIKKyNkZWZpbmUgRjA5MDBfU0RJU0VRQzFUWF9JUlEgMHhmMTIzMDAwMQogCiAvKklSUU1BU0szKi8KLSNkZWZpbmUgUjA5MDBfSVJRTUFTSzMgIDB4ZjEyNAotI2RlZmluZSBGMDkwMF9NUExMX0xPQ0sgIDB4ZjEyNDAwMjAKLSNkZWZpbmUgRjA5MDBfTVNUUkVBTV9MQ0tfMyAgMHhmMTI0MDAxMAotI2RlZmluZSBGMDkwMF9NU1RSRUFNX0xDS18yICAweGYxMjQwMDA4Ci0jZGVmaW5lIEYwOTAwX01TVFJFQU1fTENLXzEgIDB4ZjEyNDAwMDQKLSNkZWZpbmUgRjA5MDBfTURWQlMxX1BSRl8yICAweGYxMjQwMDAyCi0jZGVmaW5lIEYwOTAwX01EVkJTMV9QUkZfMSAgMHhmMTI0MDAwMQorI2RlZmluZSBSMDkwMF9JUlFNQVNLMyAweGYxMjQKKyNkZWZpbmUgRjA5MDBfTVBMTF9MT0NLIDB4ZjEyNDAwMjAKKyNkZWZpbmUgRjA5MDBfTVNUUkVBTV9MQ0tfMyAweGYxMjQwMDEwCisjZGVmaW5lIEYwOTAwX01TVFJFQU1fTENLXzIgMHhmMTI0MDAwOAorI2RlZmluZSBGMDkwMF9NU1RSRUFNX0xDS18xIDB4ZjEyNDAwMDQKKyNkZWZpbmUgRjA5MDBfTURWQlMxX1BSRl8yIDB4ZjEyNDAwMDIKKyNkZWZpbmUgRjA5MDBfTURWQlMxX1BSRl8xIDB4ZjEyNDAwMDEKIAogLypJUlFNQVNLMiovCi0jZGVmaW5lIFIwOTAwX0lSUU1BU0syICAweGYxMjUKLSNkZWZpbmUgRjA5MDBfTVNQWV9FTkRTSU1fMyAgMHhmMTI1MDA4MAotI2RlZmluZSBGMDkwMF9NU1BZX0VORFNJTV8yICAweGYxMjUwMDQwCi0jZGVmaW5lIEYwOTAwX01TUFlfRU5EU0lNXzEgIDB4ZjEyNTAwMjAKLSNkZWZpbmUgRjA5MDBfTVBLVERFTF9FUlJPUl8yICAweGYxMjUwMDEwCi0jZGVmaW5lIEYwOTAwX01QS1RERUxfTE9DS0JfMiAgMHhmMTI1MDAwOAotI2RlZmluZSBGMDkwMF9NUEtUREVMX0xPQ0tfMiAgMHhmMTI1MDAwNAotI2RlZmluZSBGMDkwMF9NUEtUREVMX0VSUk9SXzEgIDB4ZjEyNTAwMDIKLSNkZWZpbmUgRjA5MDBfTVBLVERFTF9MT0NLQl8xICAweGYxMjUwMDAxCisjZGVmaW5lIFIwOTAwX0lSUU1BU0syIDB4ZjEyNQorI2RlZmluZSBGMDkwMF9NU1BZX0VORFNJTV8zIDB4ZjEyNTAwODAKKyNkZWZpbmUgRjA5MDBfTVNQWV9FTkRTSU1fMiAweGYxMjUwMDQwCisjZGVmaW5lIEYwOTAwX01TUFlfRU5EU0lNXzEgMHhmMTI1MDAyMAorI2RlZmluZSBGMDkwMF9NUEtUREVMX0VSUk9SXzIgMHhmMTI1MDAxMAorI2RlZmluZSBGMDkwMF9NUEtUREVMX0xPQ0tCXzIgMHhmMTI1MDAwOAorI2RlZmluZSBGMDkwMF9NUEtUREVMX0xPQ0tfMiAweGYxMjUwMDA0CisjZGVmaW5lIEYwOTAwX01QS1RERUxfRVJST1JfMSAweGYxMjUwMDAyCisjZGVmaW5lIEYwOTAwX01QS1RERUxfTE9DS0JfMSAweGYxMjUwMDAxCiAKIC8qSVJRTUFTSzEqLwotI2RlZmluZSBSMDkwMF9JUlFNQVNLMSAgMHhmMTI2Ci0jZGVmaW5lIEYwOTAwX01QS1RERUxfTE9DS18xICAweGYxMjYwMDgwCi0jZGVmaW5lIEYwOTAwX01FWFRQSU5CMiAgMHhmMTI2MDA0MAotI2RlZmluZSBGMDkwMF9NRVhUUElOMiAgMHhmMTI2MDAyMAotI2RlZmluZSBGMDkwMF9NRVhUUElOQjEgIDB4ZjEyNjAwMTAKLSNkZWZpbmUgRjA5MDBfTUVYVFBJTjEgIDB4ZjEyNjAwMDgKLSNkZWZpbmUgRjA5MDBfTURFTU9EX0xPQ0tCXzIgIDB4ZjEyNjAwMDQKLSNkZWZpbmUgRjA5MDBfTURFTU9EX0xPQ0tfMiAgMHhmMTI2MDAwMgotI2RlZmluZSBGMDkwMF9NREVNT0RfSVJRXzIgIDB4ZjEyNjAwMDEKKyNkZWZpbmUgUjA5MDBfSVJRTUFTSzEgMHhmMTI2CisjZGVmaW5lIEYwOTAwX01QS1RERUxfTE9DS18xIDB4ZjEyNjAwODAKKyNkZWZpbmUgRjA5MDBfTUVYVFBJTkIyIDB4ZjEyNjAwNDAKKyNkZWZpbmUgRjA5MDBfTUVYVFBJTjIgMHhmMTI2MDAyMAorI2RlZmluZSBGMDkwMF9NRVhUUElOQjEgMHhmMTI2MDAxMAorI2RlZmluZSBGMDkwMF9NRVhUUElOMSAweGYxMjYwMDA4CisjZGVmaW5lIEYwOTAwX01ERU1PRF9MT0NLQl8yIDB4ZjEyNjAwMDQKKyNkZWZpbmUgRjA5MDBfTURFTU9EX0xPQ0tfMiAweGYxMjYwMDAyCisjZGVmaW5lIEYwOTAwX01ERU1PRF9JUlFfMiAweGYxMjYwMDAxCiAKIC8qSVJRTUFTSzAqLwotI2RlZmluZSBSMDkwMF9JUlFNQVNLMCAgMHhmMTI3Ci0jZGVmaW5lIEYwOTAwX01ERU1PRF9MT0NLQl8xICAweGYxMjcwMDgwCi0jZGVmaW5lIEYwOTAwX01ERU1PRF9MT0NLXzEgIDB4ZjEyNzAwNDAKLSNkZWZpbmUgRjA5MDBfTURFTU9EX0lSUV8xICAweGYxMjcwMDIwCi0jZGVmaW5lIEYwOTAwX01CQ0hfRVJSRkxBRyAgMHhmMTI3MDAxMAotI2RlZmluZSBGMDkwMF9NRElTRVFDMlJYX0lSUSAgMHhmMTI3MDAwOAotI2RlZmluZSBGMDkwMF9NRElTRVFDMlRYX0lSUSAgMHhmMTI3MDAwNAotI2RlZmluZSBGMDkwMF9NRElTRVFDMVJYX0lSUSAgMHhmMTI3MDAwMgotI2RlZmluZSBGMDkwMF9NRElTRVFDMVRYX0lSUSAgMHhmMTI3MDAwMQorI2RlZmluZSBSMDkwMF9JUlFNQVNLMCAweGYxMjcKKyNkZWZpbmUgRjA5MDBfTURFTU9EX0xPQ0tCXzEgMHhmMTI3MDA4MAorI2RlZmluZSBGMDkwMF9NREVNT0RfTE9DS18xIDB4ZjEyNzAwNDAKKyNkZWZpbmUgRjA5MDBfTURFTU9EX0lSUV8xIDB4ZjEyNzAwMjAKKyNkZWZpbmUgRjA5MDBfTUJDSF9FUlJGTEFHIDB4ZjEyNzAwMTAKKyNkZWZpbmUgRjA5MDBfTURJU0VRQzJSWF9JUlEgMHhmMTI3MDAwOAorI2RlZmluZSBGMDkwMF9NRElTRVFDMlRYX0lSUSAweGYxMjcwMDA0CisjZGVmaW5lIEYwOTAwX01ESVNFUUMxUlhfSVJRIDB4ZjEyNzAwMDIKKyNkZWZpbmUgRjA5MDBfTURJU0VRQzFUWF9JUlEgMHhmMTI3MDAwMQogCiAvKkkyQ0NGRyovCi0jZGVmaW5lIFIwOTAwX0kyQ0NGRyAgMHhmMTI5Ci0jZGVmaW5lIEYwOTAwX0kyQzJfRkFTVE1PREUgIDB4ZjEyOTAwODAKLSNkZWZpbmUgRjA5MDBfU1RBVFVTX1dSMiAgMHhmMTI5MDA0MAotI2RlZmluZSBGMDkwMF9JMkMyQUREUl9JTkMgIDB4ZjEyOTAwMzAKLSNkZWZpbmUgRjA5MDBfSTJDX0ZBU1RNT0RFICAweGYxMjkwMDA4Ci0jZGVmaW5lIEYwOTAwX1NUQVRVU19XUiAgMHhmMTI5MDAwNAotI2RlZmluZSBGMDkwMF9JMkNBRERSX0lOQyAgMHhmMTI5MDAwMworI2RlZmluZSBSMDkwMF9JMkNDRkcgMHhmMTI5CisjZGVmaW5lIEYwOTAwX0kyQ19GQVNUTU9ERSAweGYxMjkwMDA4CisjZGVmaW5lIEYwOTAwX0kyQ0FERFJfSU5DIDB4ZjEyOTAwMDMKIAogLypQMV9JMkNSUFQqLwotI2RlZmluZSBSMDkwMF9QMV9JMkNSUFQgIDB4ZjEyYQotI2RlZmluZSBGMDkwMF9QMV9JMkNUX09OICAweGYxMmEwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0VOQVJQVF9MRVZFTCAgMHhmMTJhMDA3MAotI2RlZmluZSBGMDkwMF9QMV9TQ0xUX0RFTEFZICAweGYxMmEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX1NUT1BfRU5BQkxFICAweGYxMmEwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX1NUT1BfU0RBVDJTREEgIDB4ZjEyYTAwMDIKKyNkZWZpbmUgUjA5MDBfUDFfSTJDUlBUIDB4ZjEyYQorI2RlZmluZSBJMkNSUFQgc2hpZnR4KFIwOTAwX1AxX0kyQ1JQVCwgZGVtb2QsIC0xKQorI2RlZmluZSBGMDkwMF9QMV9JMkNUX09OIDB4ZjEyYTAwODAKKyNkZWZpbmUgSTJDVF9PTiBzaGlmdHgoRjA5MDBfUDFfSTJDVF9PTiwgZGVtb2QsIC0weDEwMDAwKQorI2RlZmluZSBGMDkwMF9QMV9FTkFSUFRfTEVWRUwgMHhmMTJhMDA3MAorI2RlZmluZSBGMDkwMF9QMV9TQ0xUX0RFTEFZIDB4ZjEyYTAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfU1RPUF9FTkFCTEUgMHhmMTJhMDAwNAorI2RlZmluZSBGMDkwMF9QMV9TVE9QX1NEQVQyU0RBIDB4ZjEyYTAwMDIKIAogLypQMl9JMkNSUFQqLwotI2RlZmluZSBSMDkwMF9QMl9JMkNSUFQgIDB4ZjEyYgotI2RlZmluZSBGMDkwMF9QMl9JMkNUX09OICAweGYxMmIwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0VOQVJQVF9MRVZFTCAgMHhmMTJiMDA3MAotI2RlZmluZSBGMDkwMF9QMl9TQ0xUX0RFTEFZICAweGYxMmIwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX1NUT1BfRU5BQkxFICAweGYxMmIwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX1NUT1BfU0RBVDJTREEgIDB4ZjEyYjAwMDIKKyNkZWZpbmUgUjA5MDBfUDJfSTJDUlBUIDB4ZjEyYgorI2RlZmluZSBGMDkwMF9QMl9JMkNUX09OIDB4ZjEyYjAwODAKKyNkZWZpbmUgRjA5MDBfUDJfRU5BUlBUX0xFVkVMIDB4ZjEyYjAwNzAKKyNkZWZpbmUgRjA5MDBfUDJfU0NMVF9ERUxBWSAweGYxMmIwMDA4CisjZGVmaW5lIEYwOTAwX1AyX1NUT1BfRU5BQkxFIDB4ZjEyYjAwMDQKKyNkZWZpbmUgRjA5MDBfUDJfU1RPUF9TREFUMlNEQSAweGYxMmIwMDAyCisKKy8qSU9QVkFMVUU2Ki8KKyNkZWZpbmUgUjA5MDBfSU9QVkFMVUU2IDB4ZjEzOAorI2RlZmluZSBGMDkwMF9WU0NMIDB4ZjEzODAwMDQKKyNkZWZpbmUgRjA5MDBfVlNEQSAweGYxMzgwMDAyCisjZGVmaW5lIEYwOTAwX1ZEQVRBM18wIDB4ZjEzODAwMDEKKworLypJT1BWQUxVRTUqLworI2RlZmluZSBSMDkwMF9JT1BWQUxVRTUgMHhmMTM5CisjZGVmaW5lIEYwOTAwX1ZEQVRBM18xIDB4ZjEzOTAwODAKKyNkZWZpbmUgRjA5MDBfVkRBVEEzXzIgMHhmMTM5MDA0MAorI2RlZmluZSBGMDkwMF9WREFUQTNfMyAweGYxMzkwMDIwCisjZGVmaW5lIEYwOTAwX1ZEQVRBM180IDB4ZjEzOTAwMTAKKyNkZWZpbmUgRjA5MDBfVkRBVEEzXzUgMHhmMTM5MDAwOAorI2RlZmluZSBGMDkwMF9WREFUQTNfNiAweGYxMzkwMDA0CisjZGVmaW5lIEYwOTAwX1ZEQVRBM183IDB4ZjEzOTAwMDIKKyNkZWZpbmUgRjA5MDBfVkNMS09VVDMgMHhmMTM5MDAwMQorCisvKklPUFZBTFVFNCovCisjZGVmaW5lIFIwOTAwX0lPUFZBTFVFNCAweGYxM2EKKyNkZWZpbmUgRjA5MDBfVlNUUk9VVDMgMHhmMTNhMDA4MAorI2RlZmluZSBGMDkwMF9WRFBOMyAweGYxM2EwMDQwCisjZGVmaW5lIEYwOTAwX1ZFUlJPUjMgMHhmMTNhMDAyMAorI2RlZmluZSBGMDkwMF9WREFUQTJfNyAweGYxM2EwMDEwCisjZGVmaW5lIEYwOTAwX1ZDTEtPVVQyIDB4ZjEzYTAwMDgKKyNkZWZpbmUgRjA5MDBfVlNUUk9VVDIgMHhmMTNhMDAwNAorI2RlZmluZSBGMDkwMF9WRFBOMiAweGYxM2EwMDAyCisjZGVmaW5lIEYwOTAwX1ZFUlJPUjIgMHhmMTNhMDAwMQorCisvKklPUFZBTFVFMyovCisjZGVmaW5lIFIwOTAwX0lPUFZBTFVFMyAweGYxM2IKKyNkZWZpbmUgRjA5MDBfVkRBVEExXzcgMHhmMTNiMDA4MAorI2RlZmluZSBGMDkwMF9WQ0xLT1VUMSAweGYxM2IwMDQwCisjZGVmaW5lIEYwOTAwX1ZTVFJPVVQxIDB4ZjEzYjAwMjAKKyNkZWZpbmUgRjA5MDBfVkRQTjEgMHhmMTNiMDAxMAorI2RlZmluZSBGMDkwMF9WRVJST1IxIDB4ZjEzYjAwMDgKKyNkZWZpbmUgRjA5MDBfVkNMS09VVDI3IDB4ZjEzYjAwMDQKKyNkZWZpbmUgRjA5MDBfVkRJU0VRQ09VVDIgMHhmMTNiMDAwMgorI2RlZmluZSBGMDkwMF9WU0NMVDIgMHhmMTNiMDAwMQorCisvKklPUFZBTFVFMiovCisjZGVmaW5lIFIwOTAwX0lPUFZBTFVFMiAweGYxM2MKKyNkZWZpbmUgRjA5MDBfVlNEQVQyIDB4ZjEzYzAwODAKKyNkZWZpbmUgRjA5MDBfVkFHQ1JGMiAweGYxM2MwMDQwCisjZGVmaW5lIEYwOTAwX1ZESVNFUUNPVVQxIDB4ZjEzYzAwMjAKKyNkZWZpbmUgRjA5MDBfVlNDTFQxIDB4ZjEzYzAwMTAKKyNkZWZpbmUgRjA5MDBfVlNEQVQxIDB4ZjEzYzAwMDgKKyNkZWZpbmUgRjA5MDBfVkFHQ1JGMSAweGYxM2MwMDA0CisjZGVmaW5lIEYwOTAwX1ZESVJDTEsgMHhmMTNjMDAwMgorI2RlZmluZSBGMDkwMF9WU1REQlkgMHhmMTNjMDAwMQorCisvKklPUFZBTFVFMSovCisjZGVmaW5lIFIwOTAwX0lPUFZBTFVFMSAweGYxM2QKKyNkZWZpbmUgRjA5MDBfVkNTMSAweGYxM2QwMDgwCisjZGVmaW5lIEYwOTAwX1ZDUzAgMHhmMTNkMDA0MAorI2RlZmluZSBGMDkwMF9WR1BJTzEzIDB4ZjEzZDAwMjAKKyNkZWZpbmUgRjA5MDBfVkdQSU8xMiAweGYxM2QwMDEwCisjZGVmaW5lIEYwOTAwX1ZHUElPMTEgMHhmMTNkMDAwOAorI2RlZmluZSBGMDkwMF9WR1BJTzEwIDB4ZjEzZDAwMDQKKyNkZWZpbmUgRjA5MDBfVkdQSU85IDB4ZjEzZDAwMDIKKyNkZWZpbmUgRjA5MDBfVkdQSU84IDB4ZjEzZDAwMDEKKworLypJT1BWQUxVRTAqLworI2RlZmluZSBSMDkwMF9JT1BWQUxVRTAgMHhmMTNlCisjZGVmaW5lIEYwOTAwX1ZHUElPNyAweGYxM2UwMDgwCisjZGVmaW5lIEYwOTAwX1ZHUElPNiAweGYxM2UwMDQwCisjZGVmaW5lIEYwOTAwX1ZHUElPNSAweGYxM2UwMDIwCisjZGVmaW5lIEYwOTAwX1ZHUElPNCAweGYxM2UwMDEwCisjZGVmaW5lIEYwOTAwX1ZHUElPMyAweGYxM2UwMDA4CisjZGVmaW5lIEYwOTAwX1ZHUElPMiAweGYxM2UwMDA0CisjZGVmaW5lIEYwOTAwX1ZHUElPMSAweGYxM2UwMDAyCisjZGVmaW5lIEYwOTAwX1ZDTEtJMiAweGYxM2UwMDAxCiAKIC8qQ0xLSTJDRkcqLwotI2RlZmluZSBSMDkwMF9DTEtJMkNGRyAgMHhmMTQwCi0jZGVmaW5lIEYwOTAwX0NMS0kyX09QRCAgMHhmMTQwMDA4MAotI2RlZmluZSBGMDkwMF9DTEtJMl9DT05GSUcgIDB4ZjE0MDAwN2UKLSNkZWZpbmUgRjA5MDBfQ0xLSTJfWE9SICAweGYxNDAwMDAxCisjZGVmaW5lIFIwOTAwX0NMS0kyQ0ZHIDB4ZjE0MAorI2RlZmluZSBGMDkwMF9DTEtJMl9PUEQgMHhmMTQwMDA4MAorI2RlZmluZSBGMDkwMF9DTEtJMl9DT05GSUcgMHhmMTQwMDA3ZQorI2RlZmluZSBGMDkwMF9DTEtJMl9YT1IgMHhmMTQwMDAwMQogCiAvKkdQSU8xQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfR1BJTzFDRkcgIDB4ZjE0MQotI2RlZmluZSBGMDkwMF9HUElPMV9PUEQgIDB4ZjE0MTAwODAKLSNkZWZpbmUgRjA5MDBfR1BJTzFfQ09ORklHICAweGYxNDEwMDdlCi0jZGVmaW5lIEYwOTAwX0dQSU8xX1hPUiAgMHhmMTQxMDAwMQorI2RlZmluZSBSMDkwMF9HUElPMUNGRyAweGYxNDEKKyNkZWZpbmUgRjA5MDBfR1BJTzFfT1BEIDB4ZjE0MTAwODAKKyNkZWZpbmUgRjA5MDBfR1BJTzFfQ09ORklHIDB4ZjE0MTAwN2UKKyNkZWZpbmUgRjA5MDBfR1BJTzFfWE9SIDB4ZjE0MTAwMDEKIAogLypHUElPMkNGRyovCi0jZGVmaW5lIFIwOTAwX0dQSU8yQ0ZHICAweGYxNDIKLSNkZWZpbmUgRjA5MDBfR1BJTzJfT1BEICAweGYxNDIwMDgwCi0jZGVmaW5lIEYwOTAwX0dQSU8yX0NPTkZJRyAgMHhmMTQyMDA3ZQotI2RlZmluZSBGMDkwMF9HUElPMl9YT1IgIDB4ZjE0MjAwMDEKKyNkZWZpbmUgUjA5MDBfR1BJTzJDRkcgMHhmMTQyCisjZGVmaW5lIEYwOTAwX0dQSU8yX09QRCAweGYxNDIwMDgwCisjZGVmaW5lIEYwOTAwX0dQSU8yX0NPTkZJRyAweGYxNDIwMDdlCisjZGVmaW5lIEYwOTAwX0dQSU8yX1hPUiAweGYxNDIwMDAxCiAKIC8qR1BJTzNDRkcqLwotI2RlZmluZSBSMDkwMF9HUElPM0NGRyAgMHhmMTQzCi0jZGVmaW5lIEYwOTAwX0dQSU8zX09QRCAgMHhmMTQzMDA4MAotI2RlZmluZSBGMDkwMF9HUElPM19DT05GSUcgIDB4ZjE0MzAwN2UKLSNkZWZpbmUgRjA5MDBfR1BJTzNfWE9SICAweGYxNDMwMDAxCisjZGVmaW5lIFIwOTAwX0dQSU8zQ0ZHIDB4ZjE0MworI2RlZmluZSBGMDkwMF9HUElPM19PUEQgMHhmMTQzMDA4MAorI2RlZmluZSBGMDkwMF9HUElPM19DT05GSUcgMHhmMTQzMDA3ZQorI2RlZmluZSBGMDkwMF9HUElPM19YT1IgMHhmMTQzMDAwMQogCiAvKkdQSU80Q0ZHKi8KLSNkZWZpbmUgUjA5MDBfR1BJTzRDRkcgIDB4ZjE0NAotI2RlZmluZSBGMDkwMF9HUElPNF9PUEQgIDB4ZjE0NDAwODAKLSNkZWZpbmUgRjA5MDBfR1BJTzRfQ09ORklHICAweGYxNDQwMDdlCi0jZGVmaW5lIEYwOTAwX0dQSU80X1hPUiAgMHhmMTQ0MDAwMQorI2RlZmluZSBSMDkwMF9HUElPNENGRyAweGYxNDQKKyNkZWZpbmUgRjA5MDBfR1BJTzRfT1BEIDB4ZjE0NDAwODAKKyNkZWZpbmUgRjA5MDBfR1BJTzRfQ09ORklHIDB4ZjE0NDAwN2UKKyNkZWZpbmUgRjA5MDBfR1BJTzRfWE9SIDB4ZjE0NDAwMDEKIAogLypHUElPNUNGRyovCi0jZGVmaW5lIFIwOTAwX0dQSU81Q0ZHICAweGYxNDUKLSNkZWZpbmUgRjA5MDBfR1BJTzVfT1BEICAweGYxNDUwMDgwCi0jZGVmaW5lIEYwOTAwX0dQSU81X0NPTkZJRyAgMHhmMTQ1MDA3ZQotI2RlZmluZSBGMDkwMF9HUElPNV9YT1IgIDB4ZjE0NTAwMDEKKyNkZWZpbmUgUjA5MDBfR1BJTzVDRkcgMHhmMTQ1CisjZGVmaW5lIEYwOTAwX0dQSU81X09QRCAweGYxNDUwMDgwCisjZGVmaW5lIEYwOTAwX0dQSU81X0NPTkZJRyAweGYxNDUwMDdlCisjZGVmaW5lIEYwOTAwX0dQSU81X1hPUiAweGYxNDUwMDAxCiAKIC8qR1BJTzZDRkcqLwotI2RlZmluZSBSMDkwMF9HUElPNkNGRyAgMHhmMTQ2Ci0jZGVmaW5lIEYwOTAwX0dQSU82X09QRCAgMHhmMTQ2MDA4MAotI2RlZmluZSBGMDkwMF9HUElPNl9DT05GSUcgIDB4ZjE0NjAwN2UKLSNkZWZpbmUgRjA5MDBfR1BJTzZfWE9SICAweGYxNDYwMDAxCisjZGVmaW5lIFIwOTAwX0dQSU82Q0ZHIDB4ZjE0NgorI2RlZmluZSBGMDkwMF9HUElPNl9PUEQgMHhmMTQ2MDA4MAorI2RlZmluZSBGMDkwMF9HUElPNl9DT05GSUcgMHhmMTQ2MDA3ZQorI2RlZmluZSBGMDkwMF9HUElPNl9YT1IgMHhmMTQ2MDAwMQogCiAvKkdQSU83Q0ZHKi8KLSNkZWZpbmUgUjA5MDBfR1BJTzdDRkcgIDB4ZjE0NwotI2RlZmluZSBGMDkwMF9HUElPN19PUEQgIDB4ZjE0NzAwODAKLSNkZWZpbmUgRjA5MDBfR1BJTzdfQ09ORklHICAweGYxNDcwMDdlCi0jZGVmaW5lIEYwOTAwX0dQSU83X1hPUiAgMHhmMTQ3MDAwMQorI2RlZmluZSBSMDkwMF9HUElPN0NGRyAweGYxNDcKKyNkZWZpbmUgRjA5MDBfR1BJTzdfT1BEIDB4ZjE0NzAwODAKKyNkZWZpbmUgRjA5MDBfR1BJTzdfQ09ORklHIDB4ZjE0NzAwN2UKKyNkZWZpbmUgRjA5MDBfR1BJTzdfWE9SIDB4ZjE0NzAwMDEKIAogLypHUElPOENGRyovCi0jZGVmaW5lIFIwOTAwX0dQSU84Q0ZHICAweGYxNDgKLSNkZWZpbmUgRjA5MDBfR1BJTzhfT1BEICAweGYxNDgwMDgwCi0jZGVmaW5lIEYwOTAwX0dQSU84X0NPTkZJRyAgMHhmMTQ4MDA3ZQotI2RlZmluZSBGMDkwMF9HUElPOF9YT1IgIDB4ZjE0ODAwMDEKKyNkZWZpbmUgUjA5MDBfR1BJTzhDRkcgMHhmMTQ4CisjZGVmaW5lIEYwOTAwX0dQSU84X09QRCAweGYxNDgwMDgwCisjZGVmaW5lIEYwOTAwX0dQSU84X0NPTkZJRyAweGYxNDgwMDdlCisjZGVmaW5lIEYwOTAwX0dQSU84X1hPUiAweGYxNDgwMDAxCiAKIC8qR1BJTzlDRkcqLwotI2RlZmluZSBSMDkwMF9HUElPOUNGRyAgMHhmMTQ5Ci0jZGVmaW5lIEYwOTAwX0dQSU85X09QRCAgMHhmMTQ5MDA4MAotI2RlZmluZSBGMDkwMF9HUElPOV9DT05GSUcgIDB4ZjE0OTAwN2UKLSNkZWZpbmUgRjA5MDBfR1BJTzlfWE9SICAweGYxNDkwMDAxCisjZGVmaW5lIFIwOTAwX0dQSU85Q0ZHIDB4ZjE0OQorI2RlZmluZSBGMDkwMF9HUElPOV9PUEQgMHhmMTQ5MDA4MAorI2RlZmluZSBGMDkwMF9HUElPOV9DT05GSUcgMHhmMTQ5MDA3ZQorI2RlZmluZSBGMDkwMF9HUElPOV9YT1IgMHhmMTQ5MDAwMQogCiAvKkdQSU8xMENGRyovCi0jZGVmaW5lIFIwOTAwX0dQSU8xMENGRyAgMHhmMTRhCi0jZGVmaW5lIEYwOTAwX0dQSU8xMF9PUEQgIDB4ZjE0YTAwODAKLSNkZWZpbmUgRjA5MDBfR1BJTzEwX0NPTkZJRyAgMHhmMTRhMDA3ZQotI2RlZmluZSBGMDkwMF9HUElPMTBfWE9SICAweGYxNGEwMDAxCisjZGVmaW5lIFIwOTAwX0dQSU8xMENGRyAweGYxNGEKKyNkZWZpbmUgRjA5MDBfR1BJTzEwX09QRCAweGYxNGEwMDgwCisjZGVmaW5lIEYwOTAwX0dQSU8xMF9DT05GSUcgMHhmMTRhMDA3ZQorI2RlZmluZSBGMDkwMF9HUElPMTBfWE9SIDB4ZjE0YTAwMDEKIAogLypHUElPMTFDRkcqLwotI2RlZmluZSBSMDkwMF9HUElPMTFDRkcgIDB4ZjE0YgotI2RlZmluZSBGMDkwMF9HUElPMTFfT1BEICAweGYxNGIwMDgwCi0jZGVmaW5lIEYwOTAwX0dQSU8xMV9DT05GSUcgIDB4ZjE0YjAwN2UKLSNkZWZpbmUgRjA5MDBfR1BJTzExX1hPUiAgMHhmMTRiMDAwMQorI2RlZmluZSBSMDkwMF9HUElPMTFDRkcgMHhmMTRiCisjZGVmaW5lIEYwOTAwX0dQSU8xMV9PUEQgMHhmMTRiMDA4MAorI2RlZmluZSBGMDkwMF9HUElPMTFfQ09ORklHIDB4ZjE0YjAwN2UKKyNkZWZpbmUgRjA5MDBfR1BJTzExX1hPUiAweGYxNGIwMDAxCiAKIC8qR1BJTzEyQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfR1BJTzEyQ0ZHICAweGYxNGMKLSNkZWZpbmUgRjA5MDBfR1BJTzEyX09QRCAgMHhmMTRjMDA4MAotI2RlZmluZSBGMDkwMF9HUElPMTJfQ09ORklHICAweGYxNGMwMDdlCi0jZGVmaW5lIEYwOTAwX0dQSU8xMl9YT1IgIDB4ZjE0YzAwMDEKKyNkZWZpbmUgUjA5MDBfR1BJTzEyQ0ZHIDB4ZjE0YworI2RlZmluZSBGMDkwMF9HUElPMTJfT1BEIDB4ZjE0YzAwODAKKyNkZWZpbmUgRjA5MDBfR1BJTzEyX0NPTkZJRyAweGYxNGMwMDdlCisjZGVmaW5lIEYwOTAwX0dQSU8xMl9YT1IgMHhmMTRjMDAwMQogCiAvKkdQSU8xM0NGRyovCi0jZGVmaW5lIFIwOTAwX0dQSU8xM0NGRyAgMHhmMTRkCi0jZGVmaW5lIEYwOTAwX0dQSU8xM19PUEQgIDB4ZjE0ZDAwODAKLSNkZWZpbmUgRjA5MDBfR1BJTzEzX0NPTkZJRyAgMHhmMTRkMDA3ZQotI2RlZmluZSBGMDkwMF9HUElPMTNfWE9SICAweGYxNGQwMDAxCisjZGVmaW5lIFIwOTAwX0dQSU8xM0NGRyAweGYxNGQKKyNkZWZpbmUgRjA5MDBfR1BJTzEzX09QRCAweGYxNGQwMDgwCisjZGVmaW5lIEYwOTAwX0dQSU8xM19DT05GSUcgMHhmMTRkMDA3ZQorI2RlZmluZSBGMDkwMF9HUElPMTNfWE9SIDB4ZjE0ZDAwMDEKIAogLypDUzBDRkcqLwotI2RlZmluZSBSMDkwMF9DUzBDRkcgIDB4ZjE0ZQotI2RlZmluZSBGMDkwMF9DUzBfT1BEICAweGYxNGUwMDgwCi0jZGVmaW5lIEYwOTAwX0NTMF9DT05GSUcgIDB4ZjE0ZTAwN2UKLSNkZWZpbmUgRjA5MDBfQ1MwX1hPUiAgMHhmMTRlMDAwMQorI2RlZmluZSBSMDkwMF9DUzBDRkcgMHhmMTRlCisjZGVmaW5lIEYwOTAwX0NTMF9PUEQgMHhmMTRlMDA4MAorI2RlZmluZSBGMDkwMF9DUzBfQ09ORklHIDB4ZjE0ZTAwN2UKKyNkZWZpbmUgRjA5MDBfQ1MwX1hPUiAweGYxNGUwMDAxCiAKIC8qQ1MxQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfQ1MxQ0ZHICAweGYxNGYKLSNkZWZpbmUgRjA5MDBfQ1MxX09QRCAgMHhmMTRmMDA4MAotI2RlZmluZSBGMDkwMF9DUzFfQ09ORklHICAweGYxNGYwMDdlCi0jZGVmaW5lIEYwOTAwX0NTMV9YT1IgIDB4ZjE0ZjAwMDEKKyNkZWZpbmUgUjA5MDBfQ1MxQ0ZHIDB4ZjE0ZgorI2RlZmluZSBGMDkwMF9DUzFfT1BEIDB4ZjE0ZjAwODAKKyNkZWZpbmUgRjA5MDBfQ1MxX0NPTkZJRyAweGYxNGYwMDdlCisjZGVmaW5lIEYwOTAwX0NTMV9YT1IgMHhmMTRmMDAwMQogCiAvKlNUREJZQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfU1REQllDRkcgIDB4ZjE1MAotI2RlZmluZSBGMDkwMF9TVERCWV9PUEQgIDB4ZjE1MDAwODAKLSNkZWZpbmUgRjA5MDBfU1REQllfQ09ORklHICAweGYxNTAwMDdlCi0jZGVmaW5lIEYwOTAwX1NUQkRZX1hPUiAgMHhmMTUwMDAwMQorI2RlZmluZSBSMDkwMF9TVERCWUNGRyAweGYxNTAKKyNkZWZpbmUgRjA5MDBfU1REQllfT1BEIDB4ZjE1MDAwODAKKyNkZWZpbmUgRjA5MDBfU1REQllfQ09ORklHIDB4ZjE1MDAwN2UKKyNkZWZpbmUgRjA5MDBfU1RCRFlfWE9SIDB4ZjE1MDAwMDEKIAogLypESVJDTEtDRkcqLwotI2RlZmluZSBSMDkwMF9ESVJDTEtDRkcgIDB4ZjE1MQotI2RlZmluZSBGMDkwMF9ESVJDTEtfT1BEICAweGYxNTEwMDgwCi0jZGVmaW5lIEYwOTAwX0RJUkNMS19DT05GSUcgIDB4ZjE1MTAwN2UKLSNkZWZpbmUgRjA5MDBfRElSQ0xLX1hPUiAgMHhmMTUxMDAwMQorI2RlZmluZSBSMDkwMF9ESVJDTEtDRkcgMHhmMTUxCisjZGVmaW5lIEYwOTAwX0RJUkNMS19PUEQgMHhmMTUxMDA4MAorI2RlZmluZSBGMDkwMF9ESVJDTEtfQ09ORklHIDB4ZjE1MTAwN2UKKyNkZWZpbmUgRjA5MDBfRElSQ0xLX1hPUiAweGYxNTEwMDAxCiAKIC8qQUdDUkYxQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfQUdDUkYxQ0ZHICAweGYxNTIKLSNkZWZpbmUgRjA5MDBfQUdDUkYxX09QRCAgMHhmMTUyMDA4MAotI2RlZmluZSBGMDkwMF9BR0NSRjFfQ09ORklHICAweGYxNTIwMDdlCi0jZGVmaW5lIEYwOTAwX0FHQ1JGMV9YT1IgIDB4ZjE1MjAwMDEKKyNkZWZpbmUgUjA5MDBfQUdDUkYxQ0ZHIDB4ZjE1MgorI2RlZmluZSBGMDkwMF9BR0NSRjFfT1BEIDB4ZjE1MjAwODAKKyNkZWZpbmUgRjA5MDBfQUdDUkYxX0NPTkZJRyAweGYxNTIwMDdlCisjZGVmaW5lIEYwOTAwX0FHQ1JGMV9YT1IgMHhmMTUyMDAwMQogCiAvKlNEQVQxQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfU0RBVDFDRkcgIDB4ZjE1MwotI2RlZmluZSBGMDkwMF9TREFUMV9PUEQgIDB4ZjE1MzAwODAKLSNkZWZpbmUgRjA5MDBfU0RBVDFfQ09ORklHICAweGYxNTMwMDdlCi0jZGVmaW5lIEYwOTAwX1NEQVQxX1hPUiAgMHhmMTUzMDAwMQorI2RlZmluZSBSMDkwMF9TREFUMUNGRyAweGYxNTMKKyNkZWZpbmUgRjA5MDBfU0RBVDFfT1BEIDB4ZjE1MzAwODAKKyNkZWZpbmUgRjA5MDBfU0RBVDFfQ09ORklHIDB4ZjE1MzAwN2UKKyNkZWZpbmUgRjA5MDBfU0RBVDFfWE9SIDB4ZjE1MzAwMDEKIAogLypTQ0xUMUNGRyovCi0jZGVmaW5lIFIwOTAwX1NDTFQxQ0ZHICAweGYxNTQKLSNkZWZpbmUgRjA5MDBfU0NMVDFfT1BEICAweGYxNTQwMDgwCi0jZGVmaW5lIEYwOTAwX1NDTFQxX0NPTkZJRyAgMHhmMTU0MDA3ZQotI2RlZmluZSBGMDkwMF9TQ0xUMV9YT1IgIDB4ZjE1NDAwMDEKKyNkZWZpbmUgUjA5MDBfU0NMVDFDRkcgMHhmMTU0CisjZGVmaW5lIEYwOTAwX1NDTFQxX09QRCAweGYxNTQwMDgwCisjZGVmaW5lIEYwOTAwX1NDTFQxX0NPTkZJRyAweGYxNTQwMDdlCisjZGVmaW5lIEYwOTAwX1NDTFQxX1hPUiAweGYxNTQwMDAxCiAKIC8qRElTRVFDTzFDRkcqLwotI2RlZmluZSBSMDkwMF9ESVNFUUNPMUNGRyAgMHhmMTU1Ci0jZGVmaW5lIEYwOTAwX0RJU0VRQ08xX09QRCAgMHhmMTU1MDA4MAotI2RlZmluZSBGMDkwMF9ESVNFUUNPMV9DT05GSUcgIDB4ZjE1NTAwN2UKLSNkZWZpbmUgRjA5MDBfRElTRVFDMV9YT1IgIDB4ZjE1NTAwMDEKKyNkZWZpbmUgUjA5MDBfRElTRVFDTzFDRkcgMHhmMTU1CisjZGVmaW5lIEYwOTAwX0RJU0VRQ08xX09QRCAweGYxNTUwMDgwCisjZGVmaW5lIEYwOTAwX0RJU0VRQ08xX0NPTkZJRyAweGYxNTUwMDdlCisjZGVmaW5lIEYwOTAwX0RJU0VRQzFfWE9SIDB4ZjE1NTAwMDEKIAogLypBR0NSRjJDRkcqLwotI2RlZmluZSBSMDkwMF9BR0NSRjJDRkcgIDB4ZjE1NgotI2RlZmluZSBGMDkwMF9BR0NSRjJfT1BEICAweGYxNTYwMDgwCi0jZGVmaW5lIEYwOTAwX0FHQ1JGMl9DT05GSUcgIDB4ZjE1NjAwN2UKLSNkZWZpbmUgRjA5MDBfQUdDUkYyX1hPUiAgMHhmMTU2MDAwMQorI2RlZmluZSBSMDkwMF9BR0NSRjJDRkcgMHhmMTU2CisjZGVmaW5lIEYwOTAwX0FHQ1JGMl9PUEQgMHhmMTU2MDA4MAorI2RlZmluZSBGMDkwMF9BR0NSRjJfQ09ORklHIDB4ZjE1NjAwN2UKKyNkZWZpbmUgRjA5MDBfQUdDUkYyX1hPUiAweGYxNTYwMDAxCiAKIC8qU0RBVDJDRkcqLwotI2RlZmluZSBSMDkwMF9TREFUMkNGRyAgMHhmMTU3Ci0jZGVmaW5lIEYwOTAwX1NEQVQyX09QRCAgMHhmMTU3MDA4MAotI2RlZmluZSBGMDkwMF9TREFUMl9DT05GSUcgIDB4ZjE1NzAwN2UKLSNkZWZpbmUgRjA5MDBfU0RBVDJfWE9SICAweGYxNTcwMDAxCisjZGVmaW5lIFIwOTAwX1NEQVQyQ0ZHIDB4ZjE1NworI2RlZmluZSBGMDkwMF9TREFUMl9PUEQgMHhmMTU3MDA4MAorI2RlZmluZSBGMDkwMF9TREFUMl9DT05GSUcgMHhmMTU3MDA3ZQorI2RlZmluZSBGMDkwMF9TREFUMl9YT1IgMHhmMTU3MDAwMQogCiAvKlNDTFQyQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfU0NMVDJDRkcgIDB4ZjE1OAotI2RlZmluZSBGMDkwMF9TQ0xUMl9PUEQgIDB4ZjE1ODAwODAKLSNkZWZpbmUgRjA5MDBfU0NMVDJfQ09ORklHICAweGYxNTgwMDdlCi0jZGVmaW5lIEYwOTAwX1NDTFQyX1hPUiAgMHhmMTU4MDAwMQorI2RlZmluZSBSMDkwMF9TQ0xUMkNGRyAweGYxNTgKKyNkZWZpbmUgRjA5MDBfU0NMVDJfT1BEIDB4ZjE1ODAwODAKKyNkZWZpbmUgRjA5MDBfU0NMVDJfQ09ORklHIDB4ZjE1ODAwN2UKKyNkZWZpbmUgRjA5MDBfU0NMVDJfWE9SIDB4ZjE1ODAwMDEKIAogLypESVNFUUNPMkNGRyovCi0jZGVmaW5lIFIwOTAwX0RJU0VRQ08yQ0ZHICAweGYxNTkKLSNkZWZpbmUgRjA5MDBfRElTRVFDTzJfT1BEICAweGYxNTkwMDgwCi0jZGVmaW5lIEYwOTAwX0RJU0VRQ08yX0NPTkZJRyAgMHhmMTU5MDA3ZQotI2RlZmluZSBGMDkwMF9ESVNFUUMyX1hPUiAgMHhmMTU5MDAwMQorI2RlZmluZSBSMDkwMF9ESVNFUUNPMkNGRyAweGYxNTkKKyNkZWZpbmUgRjA5MDBfRElTRVFDTzJfT1BEIDB4ZjE1OTAwODAKKyNkZWZpbmUgRjA5MDBfRElTRVFDTzJfQ09ORklHIDB4ZjE1OTAwN2UKKyNkZWZpbmUgRjA5MDBfRElTRVFDMl9YT1IgMHhmMTU5MDAwMQogCiAvKkNMS09VVDI3Q0ZHKi8KLSNkZWZpbmUgUjA5MDBfQ0xLT1VUMjdDRkcgIDB4ZjE1YQotI2RlZmluZSBGMDkwMF9DTEtPVVQyN19PUEQgIDB4ZjE1YTAwODAKLSNkZWZpbmUgRjA5MDBfQ0xLT1VUMjdfQ09ORklHICAweGYxNWEwMDdlCi0jZGVmaW5lIEYwOTAwX0NMS09VVDI3X1hPUiAgMHhmMTVhMDAwMQorI2RlZmluZSBSMDkwMF9DTEtPVVQyN0NGRyAweGYxNWEKKyNkZWZpbmUgRjA5MDBfQ0xLT1VUMjdfT1BEIDB4ZjE1YTAwODAKKyNkZWZpbmUgRjA5MDBfQ0xLT1VUMjdfQ09ORklHIDB4ZjE1YTAwN2UKKyNkZWZpbmUgRjA5MDBfQ0xLT1VUMjdfWE9SIDB4ZjE1YTAwMDEKIAogLypFUlJPUjFDRkcqLwotI2RlZmluZSBSMDkwMF9FUlJPUjFDRkcgIDB4ZjE1YgotI2RlZmluZSBGMDkwMF9FUlJPUjFfT1BEICAweGYxNWIwMDgwCi0jZGVmaW5lIEYwOTAwX0VSUk9SMV9DT05GSUcgIDB4ZjE1YjAwN2UKLSNkZWZpbmUgRjA5MDBfRVJST1IxX1hPUiAgMHhmMTViMDAwMQorI2RlZmluZSBSMDkwMF9FUlJPUjFDRkcgMHhmMTViCisjZGVmaW5lIEYwOTAwX0VSUk9SMV9PUEQgMHhmMTViMDA4MAorI2RlZmluZSBGMDkwMF9FUlJPUjFfQ09ORklHIDB4ZjE1YjAwN2UKKyNkZWZpbmUgRjA5MDBfRVJST1IxX1hPUiAweGYxNWIwMDAxCiAKIC8qRFBOMUNGRyovCi0jZGVmaW5lIFIwOTAwX0RQTjFDRkcgIDB4ZjE1YwotI2RlZmluZSBGMDkwMF9EUE4xX09QRCAgMHhmMTVjMDA4MAotI2RlZmluZSBGMDkwMF9EUE4xX0NPTkZJRyAgMHhmMTVjMDA3ZQotI2RlZmluZSBGMDkwMF9EUE4xX1hPUiAgMHhmMTVjMDAwMQorI2RlZmluZSBSMDkwMF9EUE4xQ0ZHIDB4ZjE1YworI2RlZmluZSBGMDkwMF9EUE4xX09QRCAweGYxNWMwMDgwCisjZGVmaW5lIEYwOTAwX0RQTjFfQ09ORklHIDB4ZjE1YzAwN2UKKyNkZWZpbmUgRjA5MDBfRFBOMV9YT1IgMHhmMTVjMDAwMQogCiAvKlNUUk9VVDFDRkcqLwotI2RlZmluZSBSMDkwMF9TVFJPVVQxQ0ZHICAweGYxNWQKLSNkZWZpbmUgRjA5MDBfU1RST1VUMV9PUEQgIDB4ZjE1ZDAwODAKLSNkZWZpbmUgRjA5MDBfU1RST1VUMV9DT05GSUcgIDB4ZjE1ZDAwN2UKLSNkZWZpbmUgRjA5MDBfU1RST1VUMV9YT1IgIDB4ZjE1ZDAwMDEKKyNkZWZpbmUgUjA5MDBfU1RST1VUMUNGRyAweGYxNWQKKyNkZWZpbmUgRjA5MDBfU1RST1VUMV9PUEQgMHhmMTVkMDA4MAorI2RlZmluZSBGMDkwMF9TVFJPVVQxX0NPTkZJRyAweGYxNWQwMDdlCisjZGVmaW5lIEYwOTAwX1NUUk9VVDFfWE9SIDB4ZjE1ZDAwMDEKIAogLypDTEtPVVQxQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfQ0xLT1VUMUNGRyAgMHhmMTVlCi0jZGVmaW5lIEYwOTAwX0NMS09VVDFfT1BEICAweGYxNWUwMDgwCi0jZGVmaW5lIEYwOTAwX0NMS09VVDFfQ09ORklHICAweGYxNWUwMDdlCi0jZGVmaW5lIEYwOTAwX0NMS09VVDFfWE9SICAweGYxNWUwMDAxCisjZGVmaW5lIFIwOTAwX0NMS09VVDFDRkcgMHhmMTVlCisjZGVmaW5lIEYwOTAwX0NMS09VVDFfT1BEIDB4ZjE1ZTAwODAKKyNkZWZpbmUgRjA5MDBfQ0xLT1VUMV9DT05GSUcgMHhmMTVlMDA3ZQorI2RlZmluZSBGMDkwMF9DTEtPVVQxX1hPUiAweGYxNWUwMDAxCiAKIC8qREFUQTcxQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfREFUQTcxQ0ZHICAweGYxNWYKLSNkZWZpbmUgRjA5MDBfREFUQTcxX09QRCAgMHhmMTVmMDA4MAotI2RlZmluZSBGMDkwMF9EQVRBNzFfQ09ORklHICAweGYxNWYwMDdlCi0jZGVmaW5lIEYwOTAwX0RBVEE3MV9YT1IgIDB4ZjE1ZjAwMDEKKyNkZWZpbmUgUjA5MDBfREFUQTcxQ0ZHIDB4ZjE1ZgorI2RlZmluZSBGMDkwMF9EQVRBNzFfT1BEIDB4ZjE1ZjAwODAKKyNkZWZpbmUgRjA5MDBfREFUQTcxX0NPTkZJRyAweGYxNWYwMDdlCisjZGVmaW5lIEYwOTAwX0RBVEE3MV9YT1IgMHhmMTVmMDAwMQogCiAvKkVSUk9SMkNGRyovCi0jZGVmaW5lIFIwOTAwX0VSUk9SMkNGRyAgMHhmMTYwCi0jZGVmaW5lIEYwOTAwX0VSUk9SMl9PUEQgIDB4ZjE2MDAwODAKLSNkZWZpbmUgRjA5MDBfRVJST1IyX0NPTkZJRyAgMHhmMTYwMDA3ZQotI2RlZmluZSBGMDkwMF9FUlJPUjJfWE9SICAweGYxNjAwMDAxCisjZGVmaW5lIFIwOTAwX0VSUk9SMkNGRyAweGYxNjAKKyNkZWZpbmUgRjA5MDBfRVJST1IyX09QRCAweGYxNjAwMDgwCisjZGVmaW5lIEYwOTAwX0VSUk9SMl9DT05GSUcgMHhmMTYwMDA3ZQorI2RlZmluZSBGMDkwMF9FUlJPUjJfWE9SIDB4ZjE2MDAwMDEKIAogLypEUE4yQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfRFBOMkNGRyAgMHhmMTYxCi0jZGVmaW5lIEYwOTAwX0RQTjJfT1BEICAweGYxNjEwMDgwCi0jZGVmaW5lIEYwOTAwX0RQTjJfQ09ORklHICAweGYxNjEwMDdlCi0jZGVmaW5lIEYwOTAwX0RQTjJfWE9SICAweGYxNjEwMDAxCisjZGVmaW5lIFIwOTAwX0RQTjJDRkcgMHhmMTYxCisjZGVmaW5lIEYwOTAwX0RQTjJfT1BEIDB4ZjE2MTAwODAKKyNkZWZpbmUgRjA5MDBfRFBOMl9DT05GSUcgMHhmMTYxMDA3ZQorI2RlZmluZSBGMDkwMF9EUE4yX1hPUiAweGYxNjEwMDAxCiAKIC8qU1RST1VUMkNGRyovCi0jZGVmaW5lIFIwOTAwX1NUUk9VVDJDRkcgIDB4ZjE2MgotI2RlZmluZSBGMDkwMF9TVFJPVVQyX09QRCAgMHhmMTYyMDA4MAotI2RlZmluZSBGMDkwMF9TVFJPVVQyX0NPTkZJRyAgMHhmMTYyMDA3ZQotI2RlZmluZSBGMDkwMF9TVFJPVVQyX1hPUiAgMHhmMTYyMDAwMQorI2RlZmluZSBSMDkwMF9TVFJPVVQyQ0ZHIDB4ZjE2MgorI2RlZmluZSBGMDkwMF9TVFJPVVQyX09QRCAweGYxNjIwMDgwCisjZGVmaW5lIEYwOTAwX1NUUk9VVDJfQ09ORklHIDB4ZjE2MjAwN2UKKyNkZWZpbmUgRjA5MDBfU1RST1VUMl9YT1IgMHhmMTYyMDAwMQogCiAvKkNMS09VVDJDRkcqLwotI2RlZmluZSBSMDkwMF9DTEtPVVQyQ0ZHICAweGYxNjMKLSNkZWZpbmUgRjA5MDBfQ0xLT1VUMl9PUEQgIDB4ZjE2MzAwODAKLSNkZWZpbmUgRjA5MDBfQ0xLT1VUMl9DT05GSUcgIDB4ZjE2MzAwN2UKLSNkZWZpbmUgRjA5MDBfQ0xLT1VUMl9YT1IgIDB4ZjE2MzAwMDEKKyNkZWZpbmUgUjA5MDBfQ0xLT1VUMkNGRyAweGYxNjMKKyNkZWZpbmUgRjA5MDBfQ0xLT1VUMl9PUEQgMHhmMTYzMDA4MAorI2RlZmluZSBGMDkwMF9DTEtPVVQyX0NPTkZJRyAweGYxNjMwMDdlCisjZGVmaW5lIEYwOTAwX0NMS09VVDJfWE9SIDB4ZjE2MzAwMDEKIAogLypEQVRBNzJDRkcqLwotI2RlZmluZSBSMDkwMF9EQVRBNzJDRkcgIDB4ZjE2NAotI2RlZmluZSBGMDkwMF9EQVRBNzJfT1BEICAweGYxNjQwMDgwCi0jZGVmaW5lIEYwOTAwX0RBVEE3Ml9DT05GSUcgIDB4ZjE2NDAwN2UKLSNkZWZpbmUgRjA5MDBfREFUQTcyX1hPUiAgMHhmMTY0MDAwMQorI2RlZmluZSBSMDkwMF9EQVRBNzJDRkcgMHhmMTY0CisjZGVmaW5lIEYwOTAwX0RBVEE3Ml9PUEQgMHhmMTY0MDA4MAorI2RlZmluZSBGMDkwMF9EQVRBNzJfQ09ORklHIDB4ZjE2NDAwN2UKKyNkZWZpbmUgRjA5MDBfREFUQTcyX1hPUiAweGYxNjQwMDAxCiAKIC8qRVJST1IzQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfRVJST1IzQ0ZHICAweGYxNjUKLSNkZWZpbmUgRjA5MDBfRVJST1IzX09QRCAgMHhmMTY1MDA4MAotI2RlZmluZSBGMDkwMF9FUlJPUjNfQ09ORklHICAweGYxNjUwMDdlCi0jZGVmaW5lIEYwOTAwX0VSUk9SM19YT1IgIDB4ZjE2NTAwMDEKKyNkZWZpbmUgUjA5MDBfRVJST1IzQ0ZHIDB4ZjE2NQorI2RlZmluZSBGMDkwMF9FUlJPUjNfT1BEIDB4ZjE2NTAwODAKKyNkZWZpbmUgRjA5MDBfRVJST1IzX0NPTkZJRyAweGYxNjUwMDdlCisjZGVmaW5lIEYwOTAwX0VSUk9SM19YT1IgMHhmMTY1MDAwMQogCiAvKkRQTjNDRkcqLwotI2RlZmluZSBSMDkwMF9EUE4zQ0ZHICAweGYxNjYKLSNkZWZpbmUgRjA5MDBfRFBOM19PUEQgIDB4ZjE2NjAwODAKLSNkZWZpbmUgRjA5MDBfRFBOM19DT05GSUcgIDB4ZjE2NjAwN2UKLSNkZWZpbmUgRjA5MDBfRFBOM19YT1IgIDB4ZjE2NjAwMDEKKyNkZWZpbmUgUjA5MDBfRFBOM0NGRyAweGYxNjYKKyNkZWZpbmUgRjA5MDBfRFBOM19PUEQgMHhmMTY2MDA4MAorI2RlZmluZSBGMDkwMF9EUE4zX0NPTkZJRyAweGYxNjYwMDdlCisjZGVmaW5lIEYwOTAwX0RQTjNfWE9SIDB4ZjE2NjAwMDEKIAogLypTVFJPVVQzQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfU1RST1VUM0NGRyAgMHhmMTY3Ci0jZGVmaW5lIEYwOTAwX1NUUk9VVDNfT1BEICAweGYxNjcwMDgwCi0jZGVmaW5lIEYwOTAwX1NUUk9VVDNfQ09ORklHICAweGYxNjcwMDdlCi0jZGVmaW5lIEYwOTAwX1NUUk9VVDNfWE9SICAweGYxNjcwMDAxCisjZGVmaW5lIFIwOTAwX1NUUk9VVDNDRkcgMHhmMTY3CisjZGVmaW5lIEYwOTAwX1NUUk9VVDNfT1BEIDB4ZjE2NzAwODAKKyNkZWZpbmUgRjA5MDBfU1RST1VUM19DT05GSUcgMHhmMTY3MDA3ZQorI2RlZmluZSBGMDkwMF9TVFJPVVQzX1hPUiAweGYxNjcwMDAxCiAKIC8qQ0xLT1VUM0NGRyovCi0jZGVmaW5lIFIwOTAwX0NMS09VVDNDRkcgIDB4ZjE2OAotI2RlZmluZSBGMDkwMF9DTEtPVVQzX09QRCAgMHhmMTY4MDA4MAotI2RlZmluZSBGMDkwMF9DTEtPVVQzX0NPTkZJRyAgMHhmMTY4MDA3ZQotI2RlZmluZSBGMDkwMF9DTEtPVVQzX1hPUiAgMHhmMTY4MDAwMQorI2RlZmluZSBSMDkwMF9DTEtPVVQzQ0ZHIDB4ZjE2OAorI2RlZmluZSBGMDkwMF9DTEtPVVQzX09QRCAweGYxNjgwMDgwCisjZGVmaW5lIEYwOTAwX0NMS09VVDNfQ09ORklHIDB4ZjE2ODAwN2UKKyNkZWZpbmUgRjA5MDBfQ0xLT1VUM19YT1IgMHhmMTY4MDAwMQogCiAvKkRBVEE3M0NGRyovCi0jZGVmaW5lIFIwOTAwX0RBVEE3M0NGRyAgMHhmMTY5Ci0jZGVmaW5lIEYwOTAwX0RBVEE3M19PUEQgIDB4ZjE2OTAwODAKLSNkZWZpbmUgRjA5MDBfREFUQTczX0NPTkZJRyAgMHhmMTY5MDA3ZQotI2RlZmluZSBGMDkwMF9EQVRBNzNfWE9SICAweGYxNjkwMDAxCisjZGVmaW5lIFIwOTAwX0RBVEE3M0NGRyAweGYxNjkKKyNkZWZpbmUgRjA5MDBfREFUQTczX09QRCAweGYxNjkwMDgwCisjZGVmaW5lIEYwOTAwX0RBVEE3M19DT05GSUcgMHhmMTY5MDA3ZQorI2RlZmluZSBGMDkwMF9EQVRBNzNfWE9SIDB4ZjE2OTAwMDEKKworLypTVFJTVEFUVVMxKi8KKyNkZWZpbmUgUjA5MDBfU1RSU1RBVFVTMSAweGYxNmEKKyNkZWZpbmUgRjA5MDBfU1RSU1RBVFVTX1NFTDIgMHhmMTZhMDBmMAorI2RlZmluZSBGMDkwMF9TVFJTVEFUVVNfU0VMMSAweGYxNmEwMDBmCisKKy8qU1RSU1RBVFVTMiovCisjZGVmaW5lIFIwOTAwX1NUUlNUQVRVUzIgMHhmMTZiCisjZGVmaW5lIEYwOTAwX1NUUlNUQVRVU19TRUw0IDB4ZjE2YjAwZjAKKyNkZWZpbmUgRjA5MDBfU1RSU1RBVFVTX1NFTDMgMHhmMTZiMDAwZgorCisvKlNUUlNUQVRVUzMqLworI2RlZmluZSBSMDkwMF9TVFJTVEFUVVMzIDB4ZjE2YworI2RlZmluZSBGMDkwMF9TVFJTVEFUVVNfU0VMNiAweGYxNmMwMGYwCisjZGVmaW5lIEYwOTAwX1NUUlNUQVRVU19TRUw1IDB4ZjE2YzAwMGYKIAogLypGU0tURkMyKi8KLSNkZWZpbmUgUjA5MDBfRlNLVEZDMiAgMHhmMTcwCi0jZGVmaW5lIEYwOTAwX0ZTS1RfS01PRCAgMHhmMTcwMDBmYwotI2RlZmluZSBGMDkwMF9GU0tUX0NBUjIgIDB4ZjE3MDAwMDMKKyNkZWZpbmUgUjA5MDBfRlNLVEZDMiAweGYxNzAKKyNkZWZpbmUgRjA5MDBfRlNLVF9LTU9EIDB4ZjE3MDAwZmMKKyNkZWZpbmUgRjA5MDBfRlNLVF9DQVIyIDB4ZjE3MDAwMDMKIAogLypGU0tURkMxKi8KLSNkZWZpbmUgUjA5MDBfRlNLVEZDMSAgMHhmMTcxCi0jZGVmaW5lIEYwOTAwX0ZTS1RfQ0FSMSAgMHhmMTcxMDBmZgorI2RlZmluZSBSMDkwMF9GU0tURkMxIDB4ZjE3MQorI2RlZmluZSBGMDkwMF9GU0tUX0NBUjEgMHhmMTcxMDBmZgogCiAvKkZTS1RGQzAqLwotI2RlZmluZSBSMDkwMF9GU0tURkMwICAweGYxNzIKLSNkZWZpbmUgRjA5MDBfRlNLVF9DQVIwICAweGYxNzIwMGZmCisjZGVmaW5lIFIwOTAwX0ZTS1RGQzAgMHhmMTcyCisjZGVmaW5lIEYwOTAwX0ZTS1RfQ0FSMCAweGYxNzIwMGZmCiAKIC8qRlNLVERFTFRBRjEqLwotI2RlZmluZSBSMDkwMF9GU0tUREVMVEFGMSAgMHhmMTczCi0jZGVmaW5lIEYwOTAwX0ZTS1RfREVMVEFGMSAgMHhmMTczMDAwZgorI2RlZmluZSBSMDkwMF9GU0tUREVMVEFGMSAweGYxNzMKKyNkZWZpbmUgRjA5MDBfRlNLVF9ERUxUQUYxIDB4ZjE3MzAwMGYKIAogLypGU0tUREVMVEFGMCovCi0jZGVmaW5lIFIwOTAwX0ZTS1RERUxUQUYwICAweGYxNzQKLSNkZWZpbmUgRjA5MDBfRlNLVF9ERUxUQUYwICAweGYxNzQwMGZmCisjZGVmaW5lIFIwOTAwX0ZTS1RERUxUQUYwIDB4ZjE3NAorI2RlZmluZSBGMDkwMF9GU0tUX0RFTFRBRjAgMHhmMTc0MDBmZgogCiAvKkZTS1RDVFJMKi8KLSNkZWZpbmUgUjA5MDBfRlNLVENUUkwgIDB4ZjE3NQotI2RlZmluZSBGMDkwMF9GU0tUX0VOX1NHTiAgMHhmMTc1MDA0MAotI2RlZmluZSBGMDkwMF9GU0tUX01PRF9TR04gIDB4ZjE3NTAwMjAKLSNkZWZpbmUgRjA5MDBfRlNLVF9NT0RfRU4gIDB4ZjE3NTAwMWMKLSNkZWZpbmUgRjA5MDBfRlNLVF9EQUNNT0RFICAweGYxNzUwMDAzCisjZGVmaW5lIFIwOTAwX0ZTS1RDVFJMIDB4ZjE3NQorI2RlZmluZSBGMDkwMF9GU0tUX0VOX1NHTiAweGYxNzUwMDQwCisjZGVmaW5lIEYwOTAwX0ZTS1RfTU9EX1NHTiAweGYxNzUwMDIwCisjZGVmaW5lIEYwOTAwX0ZTS1RfTU9EX0VOIDB4ZjE3NTAwMWMKKyNkZWZpbmUgRjA5MDBfRlNLVF9EQUNNT0RFIDB4ZjE3NTAwMDMKIAogLypGU0tSRkMyKi8KLSNkZWZpbmUgUjA5MDBfRlNLUkZDMiAgMHhmMTc2Ci0jZGVmaW5lIEYwOTAwX0ZTS1JfREVUU0dOICAweGYxNzYwMDQwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfT1VUU0dOICAweGYxNzYwMDIwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfS0FHQyAgMHhmMTc2MDAxYwotI2RlZmluZSBGMDkwMF9GU0tSX0NBUjIgIDB4ZjE3NjAwMDMKKyNkZWZpbmUgUjA5MDBfRlNLUkZDMiAweGYxNzYKKyNkZWZpbmUgRjA5MDBfRlNLUl9ERVRTR04gMHhmMTc2MDA0MAorI2RlZmluZSBGMDkwMF9GU0tSX09VVFNHTiAweGYxNzYwMDIwCisjZGVmaW5lIEYwOTAwX0ZTS1JfS0FHQyAweGYxNzYwMDFjCisjZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSMiAweGYxNzYwMDAzCiAKIC8qRlNLUkZDMSovCi0jZGVmaW5lIFIwOTAwX0ZTS1JGQzEgIDB4ZjE3NwotI2RlZmluZSBGMDkwMF9GU0tSX0NBUjEgIDB4ZjE3NzAwZmYKKyNkZWZpbmUgUjA5MDBfRlNLUkZDMSAweGYxNzcKKyNkZWZpbmUgRjA5MDBfRlNLUl9DQVIxIDB4ZjE3NzAwZmYKIAogLypGU0tSRkMwKi8KLSNkZWZpbmUgUjA5MDBfRlNLUkZDMCAgMHhmMTc4Ci0jZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSMCAgMHhmMTc4MDBmZgorI2RlZmluZSBSMDkwMF9GU0tSRkMwIDB4ZjE3OAorI2RlZmluZSBGMDkwMF9GU0tSX0NBUjAgMHhmMTc4MDBmZgogCiAvKkZTS1JLMSovCi0jZGVmaW5lIFIwOTAwX0ZTS1JLMSAgMHhmMTc5Ci0jZGVmaW5lIEYwOTAwX0ZTS1JfSzFfRVhQICAweGYxNzkwMGUwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfSzFfTUFOVCAgMHhmMTc5MDAxZgorI2RlZmluZSBSMDkwMF9GU0tSSzEgMHhmMTc5CisjZGVmaW5lIEYwOTAwX0ZTS1JfSzFfRVhQIDB4ZjE3OTAwZTAKKyNkZWZpbmUgRjA5MDBfRlNLUl9LMV9NQU5UIDB4ZjE3OTAwMWYKIAogLypGU0tSSzIqLwotI2RlZmluZSBSMDkwMF9GU0tSSzIgIDB4ZjE3YQotI2RlZmluZSBGMDkwMF9GU0tSX0syX0VYUCAgMHhmMTdhMDBlMAotI2RlZmluZSBGMDkwMF9GU0tSX0syX01BTlQgIDB4ZjE3YTAwMWYKKyNkZWZpbmUgUjA5MDBfRlNLUksyIDB4ZjE3YQorI2RlZmluZSBGMDkwMF9GU0tSX0syX0VYUCAweGYxN2EwMGUwCisjZGVmaW5lIEYwOTAwX0ZTS1JfSzJfTUFOVCAweGYxN2EwMDFmCiAKIC8qRlNLUkFHQ1IqLwotI2RlZmluZSBSMDkwMF9GU0tSQUdDUiAgMHhmMTdiCi0jZGVmaW5lIEYwOTAwX0ZTS1JfT1VUQ1RMICAweGYxN2IwMGMwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfQUdDX1JFRiAgMHhmMTdiMDAzZgorI2RlZmluZSBSMDkwMF9GU0tSQUdDUiAweGYxN2IKKyNkZWZpbmUgRjA5MDBfRlNLUl9PVVRDVEwgMHhmMTdiMDBjMAorI2RlZmluZSBGMDkwMF9GU0tSX0FHQ19SRUYgMHhmMTdiMDAzZgogCiAvKkZTS1JBR0MqLwotI2RlZmluZSBSMDkwMF9GU0tSQUdDICAweGYxN2MKLSNkZWZpbmUgRjA5MDBfRlNLUl9BR0NfQUNDVSAgMHhmMTdjMDBmZgorI2RlZmluZSBSMDkwMF9GU0tSQUdDIDB4ZjE3YworI2RlZmluZSBGMDkwMF9GU0tSX0FHQ19BQ0NVIDB4ZjE3YzAwZmYKIAogLypGU0tSQUxQSEEqLwotI2RlZmluZSBSMDkwMF9GU0tSQUxQSEEgIDB4ZjE3ZAotI2RlZmluZSBGMDkwMF9GU0tSX0FMUEhBX0VYUCAgMHhmMTdkMDAxYwotI2RlZmluZSBGMDkwMF9GU0tSX0FMUEhBX00gIDB4ZjE3ZDAwMDMKKyNkZWZpbmUgUjA5MDBfRlNLUkFMUEhBIDB4ZjE3ZAorI2RlZmluZSBGMDkwMF9GU0tSX0FMUEhBX0VYUCAweGYxN2QwMDFjCisjZGVmaW5lIEYwOTAwX0ZTS1JfQUxQSEFfTSAweGYxN2QwMDAzCiAKIC8qRlNLUlBMVEgxKi8KLSNkZWZpbmUgUjA5MDBfRlNLUlBMVEgxICAweGYxN2UKLSNkZWZpbmUgRjA5MDBfRlNLUl9CRVRBICAweGYxN2UwMGYwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfUExMX1RSRVNIMSAgMHhmMTdlMDAwZgorI2RlZmluZSBSMDkwMF9GU0tSUExUSDEgMHhmMTdlCisjZGVmaW5lIEYwOTAwX0ZTS1JfQkVUQSAweGYxN2UwMGYwCisjZGVmaW5lIEYwOTAwX0ZTS1JfUExMX1RSRVNIMSAweGYxN2UwMDBmCiAKIC8qRlNLUlBMVEgwKi8KLSNkZWZpbmUgUjA5MDBfRlNLUlBMVEgwICAweGYxN2YKLSNkZWZpbmUgRjA5MDBfRlNLUl9QTExfVFJFU0gwICAweGYxN2YwMGZmCisjZGVmaW5lIFIwOTAwX0ZTS1JQTFRIMCAweGYxN2YKKyNkZWZpbmUgRjA5MDBfRlNLUl9QTExfVFJFU0gwIDB4ZjE3ZjAwZmYKIAogLypGU0tSREYxKi8KLSNkZWZpbmUgUjA5MDBfRlNLUkRGMSAgMHhmMTgwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfT1VUICAweGYxODAwMDgwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfREVMVEFGMSAgMHhmMTgwMDAxZgorI2RlZmluZSBSMDkwMF9GU0tSREYxIDB4ZjE4MAorI2RlZmluZSBGMDkwMF9GU0tSX09VVCAweGYxODAwMDgwCisjZGVmaW5lIEYwOTAwX0ZTS1JfREVMVEFGMSAweGYxODAwMDFmCiAKIC8qRlNLUkRGMCovCi0jZGVmaW5lIFIwOTAwX0ZTS1JERjAgIDB4ZjE4MQotI2RlZmluZSBGMDkwMF9GU0tSX0RFTFRBRjAgIDB4ZjE4MTAwZmYKKyNkZWZpbmUgUjA5MDBfRlNLUkRGMCAweGYxODEKKyNkZWZpbmUgRjA5MDBfRlNLUl9ERUxUQUYwIDB4ZjE4MTAwZmYKIAogLypGU0tSU1RFUFAqLwotI2RlZmluZSBSMDkwMF9GU0tSU1RFUFAgIDB4ZjE4MgotI2RlZmluZSBGMDkwMF9GU0tSX1NURVBfUExVUyAgMHhmMTgyMDBmZgorI2RlZmluZSBSMDkwMF9GU0tSU1RFUFAgMHhmMTgyCisjZGVmaW5lIEYwOTAwX0ZTS1JfU1RFUF9QTFVTIDB4ZjE4MjAwZmYKIAogLypGU0tSU1RFUE0qLwotI2RlZmluZSBSMDkwMF9GU0tSU1RFUE0gIDB4ZjE4MwotI2RlZmluZSBGMDkwMF9GU0tSX1NURVBfTUlOVVMgIDB4ZjE4MzAwZmYKKyNkZWZpbmUgUjA5MDBfRlNLUlNURVBNIDB4ZjE4MworI2RlZmluZSBGMDkwMF9GU0tSX1NURVBfTUlOVVMgMHhmMTgzMDBmZgogCiAvKkZTS1JERVQxKi8KLSNkZWZpbmUgUjA5MDBfRlNLUkRFVDEgIDB4ZjE4NAotI2RlZmluZSBGMDkwMF9GU0tSX0RFVEVDVCAgMHhmMTg0MDA4MAotI2RlZmluZSBGMDkwMF9GU0tSX0NBUkRFVF9BQ0NVMSAgMHhmMTg0MDAwZgorI2RlZmluZSBSMDkwMF9GU0tSREVUMSAweGYxODQKKyNkZWZpbmUgRjA5MDBfRlNLUl9ERVRFQ1QgMHhmMTg0MDA4MAorI2RlZmluZSBGMDkwMF9GU0tSX0NBUkRFVF9BQ0NVMSAweGYxODQwMDBmCiAKIC8qRlNLUkRFVDAqLwotI2RlZmluZSBSMDkwMF9GU0tSREVUMCAgMHhmMTg1Ci0jZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSREVUX0FDQ1UwICAweGYxODUwMGZmCisjZGVmaW5lIFIwOTAwX0ZTS1JERVQwIDB4ZjE4NQorI2RlZmluZSBGMDkwMF9GU0tSX0NBUkRFVF9BQ0NVMCAweGYxODUwMGZmCiAKIC8qRlNLUkRUSDEqLwotI2RlZmluZSBSMDkwMF9GU0tSRFRIMSAgMHhmMTg2Ci0jZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSTE9TU19USFJFU0gxICAweGYxODYwMGYwCi0jZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSREVUX1RIUkVTSDEgIDB4ZjE4NjAwMGYKKyNkZWZpbmUgUjA5MDBfRlNLUkRUSDEgMHhmMTg2CisjZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSTE9TU19USFJFU0gxIDB4ZjE4NjAwZjAKKyNkZWZpbmUgRjA5MDBfRlNLUl9DQVJERVRfVEhSRVNIMSAweGYxODYwMDBmCiAKIC8qRlNLUkRUSDAqLwotI2RlZmluZSBSMDkwMF9GU0tSRFRIMCAgMHhmMTg3Ci0jZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSREVUX1RIUkVTSDAgIDB4ZjE4NzAwZmYKKyNkZWZpbmUgUjA5MDBfRlNLUkRUSDAgMHhmMTg3CisjZGVmaW5lIEYwOTAwX0ZTS1JfQ0FSREVUX1RIUkVTSDAgMHhmMTg3MDBmZgogCiAvKkZTS1JMT1NTKi8KLSNkZWZpbmUgUjA5MDBfRlNLUkxPU1MgIDB4ZjE4OAotI2RlZmluZSBGMDkwMF9GU0tSX0NBUkxPU1NfVEhSRVNIMCAgMHhmMTg4MDBmZgorI2RlZmluZSBSMDkwMF9GU0tSTE9TUyAweGYxODgKKyNkZWZpbmUgRjA5MDBfRlNLUl9DQVJMT1NTX1RIUkVTSDAgMHhmMTg4MDBmZgogCiAvKlAyX0RJU1RYQ1RMKi8KLSNkZWZpbmUgUjA5MDBfUDJfRElTVFhDVEwgIDB4ZjE5MAotI2RlZmluZSBGMDkwMF9QMl9USU1fT0ZGICAweGYxOTAwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0RJU0VRQ19SRVNFVCAgMHhmMTkwMDA0MAotI2RlZmluZSBGMDkwMF9QMl9USU1fQ01EICAweGYxOTAwMDMwCi0jZGVmaW5lIEYwOTAwX1AyX0RJU19QUkVDSEFSR0UgIDB4ZjE5MDAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfRElTVFhfTU9ERSAgMHhmMTkwMDAwNworI2RlZmluZSBSMDkwMF9QMl9ESVNUWENUTCAweGYxOTAKKyNkZWZpbmUgRjA5MDBfUDJfVElNX09GRiAweGYxOTAwMDgwCisjZGVmaW5lIEYwOTAwX1AyX0RJU0VRQ19SRVNFVCAweGYxOTAwMDQwCisjZGVmaW5lIEYwOTAwX1AyX1RJTV9DTUQgMHhmMTkwMDAzMAorI2RlZmluZSBGMDkwMF9QMl9ESVNfUFJFQ0hBUkdFIDB4ZjE5MDAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfRElTVFhfTU9ERSAweGYxOTAwMDA3CiAKIC8qUDJfRElTUlhDVEwqLwotI2RlZmluZSBSMDkwMF9QMl9ESVNSWENUTCAgMHhmMTkxCi0jZGVmaW5lIEYwOTAwX1AyX1JFQ0VJVkVSX09OICAweGYxOTEwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0lHTk9fU0hPUlQyMksgIDB4ZjE5MTAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfT05FQ0hJUF9UUlggIDB4ZjE5MTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfRVhUX0VOVkVMT1AgIDB4ZjE5MTAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfUElOX1NFTEVDVCAgMHhmMTkxMDAwYwotI2RlZmluZSBGMDkwMF9QMl9JUlFfUlhFTkQgIDB4ZjE5MTAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfSVJRXzROQllURVMgIDB4ZjE5MTAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfRElTUlhDVEwgMHhmMTkxCisjZGVmaW5lIEYwOTAwX1AyX1JFQ0VJVkVSX09OIDB4ZjE5MTAwODAKKyNkZWZpbmUgRjA5MDBfUDJfSUdOT19TSE9SVDIySyAweGYxOTEwMDQwCisjZGVmaW5lIEYwOTAwX1AyX09ORUNISVBfVFJYIDB4ZjE5MTAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfRVhUX0VOVkVMT1AgMHhmMTkxMDAxMAorI2RlZmluZSBGMDkwMF9QMl9QSU5fU0VMRUNUMCAweGYxOTEwMDBjCisjZGVmaW5lIEYwOTAwX1AyX0lSUV9SWEVORCAweGYxOTEwMDAyCisjZGVmaW5lIEYwOTAwX1AyX0lSUV80TkJZVEVTIDB4ZjE5MTAwMDEKIAogLypQMl9ESVNSWF9TVDAqLwotI2RlZmluZSBSMDkwMF9QMl9ESVNSWF9TVDAgIDB4ZjE5NAotI2RlZmluZSBGMDkwMF9QMl9SWF9FTkQgIDB4ZjE5NDAwODAKLSNkZWZpbmUgRjA5MDBfUDJfUlhfQUNUSVZFICAweGYxOTQwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX1NIT1JUXzIyS0haICAweGYxOTQwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX0NPTlRfVE9ORSAgMHhmMTk0MDAxMAotI2RlZmluZSBGMDkwMF9QMl9GSUZPXzRCUkVBRFkgIDB4ZjE5NDAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfRklGT19FTVBUWSAgMHhmMTk0MDAwNAotI2RlZmluZSBGMDkwMF9QMl9BQk9SVF9ESVNSWCAgMHhmMTk0MDAwMQorI2RlZmluZSBSMDkwMF9QMl9ESVNSWF9TVDAgMHhmMTk0CisjZGVmaW5lIEYwOTAwX1AyX1JYX0VORCAweGYxOTQwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1JYX0FDVElWRSAweGYxOTQwMDQwCisjZGVmaW5lIEYwOTAwX1AyX1NIT1JUXzIyS0haIDB4ZjE5NDAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfQ09OVF9UT05FIDB4ZjE5NDAwMTAKKyNkZWZpbmUgRjA5MDBfUDJfRklGT180QlJFQURZIDB4ZjE5NDAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfRklGT19FTVBUWSAweGYxOTQwMDA0CisjZGVmaW5lIEYwOTAwX1AyX0FCT1JUX0RJU1JYIDB4ZjE5NDAwMDEKIAogLypQMl9ESVNSWF9TVDEqLwotI2RlZmluZSBSMDkwMF9QMl9ESVNSWF9TVDEgIDB4ZjE5NQotI2RlZmluZSBGMDkwMF9QMl9SWF9GQUlMICAweGYxOTUwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0ZJRk9fUEFSSVRZRkFJTCAgMHhmMTk1MDA0MAotI2RlZmluZSBGMDkwMF9QMl9SWF9OT05CWVRFICAweGYxOTUwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX0ZJRk9fT1ZFUkZMT1cgIDB4ZjE5NTAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfRklGT19CWVRFTkJSICAweGYxOTUwMDBmCisjZGVmaW5lIFIwOTAwX1AyX0RJU1JYX1NUMSAweGYxOTUKKyNkZWZpbmUgRjA5MDBfUDJfUlhfRkFJTCAweGYxOTUwMDgwCisjZGVmaW5lIEYwOTAwX1AyX0ZJRk9fUEFSSVRZRkFJTCAweGYxOTUwMDQwCisjZGVmaW5lIEYwOTAwX1AyX1JYX05PTkJZVEUgMHhmMTk1MDAyMAorI2RlZmluZSBGMDkwMF9QMl9GSUZPX09WRVJGTE9XIDB4ZjE5NTAwMTAKKyNkZWZpbmUgRjA5MDBfUDJfRklGT19CWVRFTkJSIDB4ZjE5NTAwMGYKIAogLypQMl9ESVNSWERBVEEqLwotI2RlZmluZSBSMDkwMF9QMl9ESVNSWERBVEEgIDB4ZjE5NgotI2RlZmluZSBGMDkwMF9QMl9ESVNSWF9EQVRBICAweGYxOTYwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0RJU1JYREFUQSAweGYxOTYKKyNkZWZpbmUgRjA5MDBfUDJfRElTUlhfREFUQSAweGYxOTYwMGZmCiAKIC8qUDJfRElTVFhEQVRBKi8KLSNkZWZpbmUgUjA5MDBfUDJfRElTVFhEQVRBICAweGYxOTcKLSNkZWZpbmUgRjA5MDBfUDJfRElTRVFDX0ZJRk8gIDB4ZjE5NzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRElTVFhEQVRBIDB4ZjE5NworI2RlZmluZSBGMDkwMF9QMl9ESVNFUUNfRklGTyAweGYxOTcwMGZmCiAKIC8qUDJfRElTVFhTVEFUVVMqLwotI2RlZmluZSBSMDkwMF9QMl9ESVNUWFNUQVRVUyAgMHhmMTk4Ci0jZGVmaW5lIEYwOTAwX1AyX1RYX0ZBSUwgIDB4ZjE5ODAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRklGT19GVUxMICAweGYxOTgwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX1RYX0lETEUgIDB4ZjE5ODAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfR0FQX0JVUlNUICAweGYxOTgwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX1RYRklGT19CWVRFUyAgMHhmMTk4MDAwZgorI2RlZmluZSBSMDkwMF9QMl9ESVNUWFNUQVRVUyAweGYxOTgKKyNkZWZpbmUgRjA5MDBfUDJfVFhfRkFJTCAweGYxOTgwMDgwCisjZGVmaW5lIEYwOTAwX1AyX0ZJRk9fRlVMTCAweGYxOTgwMDQwCisjZGVmaW5lIEYwOTAwX1AyX1RYX0lETEUgMHhmMTk4MDAyMAorI2RlZmluZSBGMDkwMF9QMl9HQVBfQlVSU1QgMHhmMTk4MDAxMAorI2RlZmluZSBGMDkwMF9QMl9UWEZJRk9fQllURVMgMHhmMTk4MDAwZgogCiAvKlAyX0YyMlRYKi8KLSNkZWZpbmUgUjA5MDBfUDJfRjIyVFggIDB4ZjE5OQotI2RlZmluZSBGMDkwMF9QMl9GMjJfUkVHICAweGYxOTkwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0YyMlRYIDB4ZjE5OQorI2RlZmluZSBGMDkwMF9QMl9GMjJfUkVHIDB4ZjE5OTAwZmYKIAogLypQMl9GMjJSWCovCi0jZGVmaW5lIFIwOTAwX1AyX0YyMlJYICAweGYxOWEKLSNkZWZpbmUgRjA5MDBfUDJfRjIyUlhfUkVHICAweGYxOWEwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0YyMlJYIDB4ZjE5YQorI2RlZmluZSBGMDkwMF9QMl9GMjJSWF9SRUcgMHhmMTlhMDBmZgogCiAvKlAyX0FDUlBSRVNDKi8KLSNkZWZpbmUgUjA5MDBfUDJfQUNSUFJFU0MgIDB4ZjE5YwotI2RlZmluZSBGMDkwMF9QMl9BQ1JfQ09ERlJEWSAgMHhmMTljMDAwOAotI2RlZmluZSBGMDkwMF9QMl9BQ1JfUFJFU0MgIDB4ZjE5YzAwMDcKKyNkZWZpbmUgUjA5MDBfUDJfQUNSUFJFU0MgMHhmMTljCisjZGVmaW5lIEYwOTAwX1AyX0FDUl9QUkVTQyAweGYxOWMwMDA3CiAKIC8qUDJfQUNSRElWKi8KLSNkZWZpbmUgUjA5MDBfUDJfQUNSRElWICAweGYxOWQKLSNkZWZpbmUgRjA5MDBfUDJfQUNSX0RJViAgMHhmMTlkMDBmZgorI2RlZmluZSBSMDkwMF9QMl9BQ1JESVYgMHhmMTlkCisjZGVmaW5lIEYwOTAwX1AyX0FDUl9ESVYgMHhmMTlkMDBmZgogCiAvKlAxX0RJU1RYQ1RMKi8KLSNkZWZpbmUgUjA5MDBfUDFfRElTVFhDVEwgIDB4ZjFhMAotI2RlZmluZSBGMDkwMF9QMV9USU1fT0ZGICAweGYxYTAwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU0VRQ19SRVNFVCAgMHhmMWEwMDA0MAotI2RlZmluZSBGMDkwMF9QMV9USU1fQ01EICAweGYxYTAwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19QUkVDSEFSR0UgIDB4ZjFhMDAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfRElTVFhfTU9ERSAgMHhmMWEwMDAwNworI2RlZmluZSBSMDkwMF9QMV9ESVNUWENUTCAweGYxYTAKKyNkZWZpbmUgRElTVFhDVEwgc2hpZnR4KFIwOTAwX1AxX0RJU1RYQ1RMLCBkZW1vZCwgMHgxMCkKKyNkZWZpbmUgRjA5MDBfUDFfVElNX09GRiAweGYxYTAwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0RJU0VRQ19SRVNFVCAweGYxYTAwMDQwCisjZGVmaW5lIERJU0VRQ19SRVNFVCBzaGlmdHgoRjA5MDBfUDFfRElTRVFDX1JFU0VULCBkZW1vZCwgMHgxMDAwMDApCisjZGVmaW5lIEYwOTAwX1AxX1RJTV9DTUQgMHhmMWEwMDAzMAorI2RlZmluZSBGMDkwMF9QMV9ESVNfUFJFQ0hBUkdFIDB4ZjFhMDAwMDgKKyNkZWZpbmUgRElTX1BSRUNIQVJHRSBzaGlmdHgoRjA5MDBfUDFfRElTX1BSRUNIQVJHRSwgZGVtb2QsIDB4MTAwMDAwKQorI2RlZmluZSBGMDkwMF9QMV9ESVNUWF9NT0RFIDB4ZjFhMDAwMDcKKyNkZWZpbmUgRElTVFhfTU9ERSBzaGlmdHgoRjA5MDBfUDFfRElTVFhfTU9ERSwgZGVtb2QsIDB4MTAwMDAwKQogCiAvKlAxX0RJU1JYQ1RMKi8KLSNkZWZpbmUgUjA5MDBfUDFfRElTUlhDVEwgIDB4ZjFhMQotI2RlZmluZSBGMDkwMF9QMV9SRUNFSVZFUl9PTiAgMHhmMWExMDA4MAotI2RlZmluZSBGMDkwMF9QMV9JR05PX1NIT1JUMjJLICAweGYxYTEwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX09ORUNISVBfVFJYICAweGYxYTEwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX0VYVF9FTlZFTE9QICAweGYxYTEwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX1BJTl9TRUxFQ1QgIDB4ZjFhMTAwMGMKLSNkZWZpbmUgRjA5MDBfUDFfSVJRX1JYRU5EICAweGYxYTEwMDAyCi0jZGVmaW5lIEYwOTAwX1AxX0lSUV80TkJZVEVTICAweGYxYTEwMDAxCisjZGVmaW5lIFIwOTAwX1AxX0RJU1JYQ1RMIDB4ZjFhMQorI2RlZmluZSBESVNSWENUTCBzaGlmdHgoUjA5MDBfUDFfRElTUlhDVEwsIGRlbW9kLCAweDEwKQorI2RlZmluZSBGMDkwMF9QMV9SRUNFSVZFUl9PTiAweGYxYTEwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0lHTk9fU0hPUlQyMksgMHhmMWExMDA0MAorI2RlZmluZSBGMDkwMF9QMV9PTkVDSElQX1RSWCAweGYxYTEwMDIwCisjZGVmaW5lIEYwOTAwX1AxX0VYVF9FTlZFTE9QIDB4ZjFhMTAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfUElOX1NFTEVDVDAgMHhmMWExMDAwYworI2RlZmluZSBGMDkwMF9QMV9JUlFfUlhFTkQgMHhmMWExMDAwMgorI2RlZmluZSBGMDkwMF9QMV9JUlFfNE5CWVRFUyAweGYxYTEwMDAxCiAKIC8qUDFfRElTUlhfU1QwKi8KLSNkZWZpbmUgUjA5MDBfUDFfRElTUlhfU1QwICAweGYxYTQKLSNkZWZpbmUgRjA5MDBfUDFfUlhfRU5EICAweGYxYTQwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1JYX0FDVElWRSAgMHhmMWE0MDA0MAotI2RlZmluZSBGMDkwMF9QMV9TSE9SVF8yMktIWiAgMHhmMWE0MDAyMAotI2RlZmluZSBGMDkwMF9QMV9DT05UX1RPTkUgIDB4ZjFhNDAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfRklGT180QlJFQURZICAweGYxYTQwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0ZJRk9fRU1QVFkgIDB4ZjFhNDAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfQUJPUlRfRElTUlggIDB4ZjFhNDAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfRElTUlhfU1QwIDB4ZjFhNAorI2RlZmluZSBESVNSWF9TVDAgc2hpZnR4KFIwOTAwX1AxX0RJU1JYX1NUMCwgZGVtb2QsIDB4MTApCisjZGVmaW5lIEYwOTAwX1AxX1JYX0VORCAweGYxYTQwMDgwCisjZGVmaW5lIFJYX0VORCBzaGlmdHgoRjA5MDBfUDFfUlhfRU5ELCBkZW1vZCwgMHgxMDAwMDApCisjZGVmaW5lIEYwOTAwX1AxX1JYX0FDVElWRSAweGYxYTQwMDQwCisjZGVmaW5lIEYwOTAwX1AxX1NIT1JUXzIyS0haIDB4ZjFhNDAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfQ09OVF9UT05FIDB4ZjFhNDAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfRklGT180QlJFQURZIDB4ZjFhNDAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfRklGT19FTVBUWSAweGYxYTQwMDA0CisjZGVmaW5lIEYwOTAwX1AxX0FCT1JUX0RJU1JYIDB4ZjFhNDAwMDEKIAogLypQMV9ESVNSWF9TVDEqLwotI2RlZmluZSBSMDkwMF9QMV9ESVNSWF9TVDEgIDB4ZjFhNQotI2RlZmluZSBGMDkwMF9QMV9SWF9GQUlMICAweGYxYTUwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0ZJRk9fUEFSSVRZRkFJTCAgMHhmMWE1MDA0MAotI2RlZmluZSBGMDkwMF9QMV9SWF9OT05CWVRFICAweGYxYTUwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX0ZJRk9fT1ZFUkZMT1cgIDB4ZjFhNTAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfRklGT19CWVRFTkJSICAweGYxYTUwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0RJU1JYX1NUMSAweGYxYTUKKyNkZWZpbmUgRElTUlhfU1QxIHNoaWZ0eChSMDkwMF9QMV9ESVNSWF9TVDEsIGRlbW9kLCAweDEwKQorI2RlZmluZSBGMDkwMF9QMV9SWF9GQUlMIDB4ZjFhNTAwODAKKyNkZWZpbmUgRjA5MDBfUDFfRklGT19QQVJJVFlGQUlMIDB4ZjFhNTAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfUlhfTk9OQllURSAweGYxYTUwMDIwCisjZGVmaW5lIEYwOTAwX1AxX0ZJRk9fT1ZFUkZMT1cgMHhmMWE1MDAxMAorI2RlZmluZSBGMDkwMF9QMV9GSUZPX0JZVEVOQlIgMHhmMWE1MDAwZgorI2RlZmluZSBGSUZPX0JZVEVOQlIgc2hpZnR4KEYwOTAwX1AxX0ZJRk9fQllURU5CUiwgZGVtb2QsIDB4MTAwMDAwKQogCiAvKlAxX0RJU1JYREFUQSovCi0jZGVmaW5lIFIwOTAwX1AxX0RJU1JYREFUQSAgMHhmMWE2Ci0jZGVmaW5lIEYwOTAwX1AxX0RJU1JYX0RBVEEgIDB4ZjFhNjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRElTUlhEQVRBIDB4ZjFhNgorI2RlZmluZSBESVNSWERBVEEgc2hpZnR4KFIwOTAwX1AxX0RJU1JYREFUQSwgZGVtb2QsIDB4MTApCisjZGVmaW5lIEYwOTAwX1AxX0RJU1JYX0RBVEEgMHhmMWE2MDBmZgogCiAvKlAxX0RJU1RYREFUQSovCi0jZGVmaW5lIFIwOTAwX1AxX0RJU1RYREFUQSAgMHhmMWE3Ci0jZGVmaW5lIEYwOTAwX1AxX0RJU0VRQ19GSUZPICAweGYxYTcwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0RJU1RYREFUQSAweGYxYTcKKyNkZWZpbmUgRElTVFhEQVRBIHNoaWZ0eChSMDkwMF9QMV9ESVNUWERBVEEsIGRlbW9kLCAweDEwKQorI2RlZmluZSBGMDkwMF9QMV9ESVNFUUNfRklGTyAweGYxYTcwMGZmCiAKIC8qUDFfRElTVFhTVEFUVVMqLwotI2RlZmluZSBSMDkwMF9QMV9ESVNUWFNUQVRVUyAgMHhmMWE4Ci0jZGVmaW5lIEYwOTAwX1AxX1RYX0ZBSUwgIDB4ZjFhODAwODAKLSNkZWZpbmUgRjA5MDBfUDFfRklGT19GVUxMICAweGYxYTgwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1RYX0lETEUgIDB4ZjFhODAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfR0FQX0JVUlNUICAweGYxYTgwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX1RYRklGT19CWVRFUyAgMHhmMWE4MDAwZgorI2RlZmluZSBSMDkwMF9QMV9ESVNUWFNUQVRVUyAweGYxYTgKKyNkZWZpbmUgRjA5MDBfUDFfVFhfRkFJTCAweGYxYTgwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0ZJRk9fRlVMTCAweGYxYTgwMDQwCisjZGVmaW5lIEZJRk9fRlVMTCBzaGlmdHgoRjA5MDBfUDFfRklGT19GVUxMLCBkZW1vZCwgMHgxMDAwMDApCisjZGVmaW5lIEYwOTAwX1AxX1RYX0lETEUgMHhmMWE4MDAyMAorI2RlZmluZSBUWF9JRExFIHNoaWZ0eChGMDkwMF9QMV9UWF9JRExFLCBkZW1vZCwgMHgxMDAwMDApCisjZGVmaW5lIEYwOTAwX1AxX0dBUF9CVVJTVCAweGYxYTgwMDEwCisjZGVmaW5lIEYwOTAwX1AxX1RYRklGT19CWVRFUyAweGYxYTgwMDBmCiAKIC8qUDFfRjIyVFgqLwotI2RlZmluZSBSMDkwMF9QMV9GMjJUWCAgMHhmMWE5Ci0jZGVmaW5lIEYwOTAwX1AxX0YyMl9SRUcgIDB4ZjFhOTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRjIyVFggMHhmMWE5CisjZGVmaW5lIEYyMlRYIHNoaWZ0eChSMDkwMF9QMV9GMjJUWCwgZGVtb2QsIDB4MTApCisjZGVmaW5lIEYwOTAwX1AxX0YyMl9SRUcgMHhmMWE5MDBmZgogCiAvKlAxX0YyMlJYKi8KLSNkZWZpbmUgUjA5MDBfUDFfRjIyUlggIDB4ZjFhYQotI2RlZmluZSBGMDkwMF9QMV9GMjJSWF9SRUcgIDB4ZjFhYTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRjIyUlggMHhmMWFhCisjZGVmaW5lIEYyMlJYIHNoaWZ0eChSMDkwMF9QMV9GMjJSWCwgZGVtb2QsIDB4MTApCisjZGVmaW5lIEYwOTAwX1AxX0YyMlJYX1JFRyAweGYxYWEwMGZmCiAKIC8qUDFfQUNSUFJFU0MqLwotI2RlZmluZSBSMDkwMF9QMV9BQ1JQUkVTQyAgMHhmMWFjCi0jZGVmaW5lIEYwOTAwX1AxX0FDUl9DT0RGUkRZICAweGYxYWMwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0FDUl9QUkVTQyAgMHhmMWFjMDAwNworI2RlZmluZSBSMDkwMF9QMV9BQ1JQUkVTQyAweGYxYWMKKyNkZWZpbmUgQUNSUFJFU0Mgc2hpZnR4KFIwOTAwX1AxX0FDUlBSRVNDLCBkZW1vZCwgMHgxMCkKKyNkZWZpbmUgRjA5MDBfUDFfQUNSX1BSRVNDIDB4ZjFhYzAwMDcKIAogLypQMV9BQ1JESVYqLwotI2RlZmluZSBSMDkwMF9QMV9BQ1JESVYgIDB4ZjFhZAotI2RlZmluZSBGMDkwMF9QMV9BQ1JfRElWICAweGYxYWQwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0FDUkRJViAweGYxYWQKKyNkZWZpbmUgQUNSRElWIHNoaWZ0eChSMDkwMF9QMV9BQ1JESVYsIGRlbW9kLCAweDEwKQorI2RlZmluZSBGMDkwMF9QMV9BQ1JfRElWIDB4ZjFhZDAwZmYKIAogLypOQ09BUlNFKi8KLSNkZWZpbmUgUjA5MDBfTkNPQVJTRSAgMHhmMWIzCi0jZGVmaW5lIEYwOTAwX01fRElWICAweGYxYjMwMGZmCisjZGVmaW5lIFIwOTAwX05DT0FSU0UgMHhmMWIzCisjZGVmaW5lIEYwOTAwX01fRElWIDB4ZjFiMzAwZmYKIAogLypTWU5UQ1RSTCovCi0jZGVmaW5lIFIwOTAwX1NZTlRDVFJMICAweGYxYjYKLSNkZWZpbmUgRjA5MDBfU1RBTkRCWSAgMHhmMWI2MDA4MAotI2RlZmluZSBGMDkwMF9CWVBBU1NQTExDT1JFICAweGYxYjYwMDQwCi0jZGVmaW5lIEYwOTAwX1NFTFgxUkFUSU8gIDB4ZjFiNjAwMjAKLSNkZWZpbmUgRjA5MDBfSTJDX1RVRCAgMHhmMWI2MDAxMAotI2RlZmluZSBGMDkwMF9TVE9QX1BMTCAgMHhmMWI2MDAwOAotI2RlZmluZSBGMDkwMF9CWVBBU1NQTExGU0sgIDB4ZjFiNjAwMDQKLSNkZWZpbmUgRjA5MDBfU0VMT1NDSSAgMHhmMWI2MDAwMgotI2RlZmluZSBGMDkwMF9CWVBBU1NQTExBREMgIDB4ZjFiNjAwMDEKKyNkZWZpbmUgUjA5MDBfU1lOVENUUkwgMHhmMWI2CisjZGVmaW5lIEYwOTAwX1NUQU5EQlkgMHhmMWI2MDA4MAorI2RlZmluZSBGMDkwMF9CWVBBU1NQTExDT1JFIDB4ZjFiNjAwNDAKKyNkZWZpbmUgRjA5MDBfU0VMWDFSQVRJTyAweGYxYjYwMDIwCisjZGVmaW5lIEYwOTAwX1NUT1BfUExMIDB4ZjFiNjAwMDgKKyNkZWZpbmUgRjA5MDBfQllQQVNTUExMRlNLIDB4ZjFiNjAwMDQKKyNkZWZpbmUgRjA5MDBfU0VMT1NDSSAweGYxYjYwMDAyCisjZGVmaW5lIEYwOTAwX0JZUEFTU1BMTEFEQyAweGYxYjYwMDAxCiAKIC8qRklMVENUUkwqLwotI2RlZmluZSBSMDkwMF9GSUxUQ1RSTCAgMHhmMWI3Ci0jZGVmaW5lIEYwOTAwX0lOVl9DTEsxMzUgIDB4ZjFiNzAwODAKLSNkZWZpbmUgRjA5MDBfUEVSTV9CWVBESVMgIDB4ZjFiNzAwNDAKLSNkZWZpbmUgRjA5MDBfU0VMX0ZTS0NLRElWICAweGYxYjcwMDA0Ci0jZGVmaW5lIEYwOTAwX0lOVl9DTEtGU0sgIDB4ZjFiNzAwMDIKLSNkZWZpbmUgRjA5MDBfQllQQVNTX0FQUExJICAweGYxYjcwMDAxCisjZGVmaW5lIFIwOTAwX0ZJTFRDVFJMIDB4ZjFiNworI2RlZmluZSBGMDkwMF9JTlZfQ0xLMTM1IDB4ZjFiNzAwODAKKyNkZWZpbmUgRjA5MDBfU0VMX0ZTS0NLRElWIDB4ZjFiNzAwMDQKKyNkZWZpbmUgRjA5MDBfSU5WX0NMS0ZTSyAweGYxYjcwMDAyCisjZGVmaW5lIEYwOTAwX0JZUEFTU19BUFBMSSAweGYxYjcwMDAxCiAKIC8qUExMU1RBVCovCi0jZGVmaW5lIFIwOTAwX1BMTFNUQVQgIDB4ZjFiOAotI2RlZmluZSBGMDkwMF9BQ01fU0VMICAweGYxYjgwMDgwCi0jZGVmaW5lIEYwOTAwX0RUVl9TRUwgIDB4ZjFiODAwNDAKLSNkZWZpbmUgRjA5MDBfUExMTE9DSyAgMHhmMWI4MDAwMQorI2RlZmluZSBSMDkwMF9QTExTVEFUIDB4ZjFiOAorI2RlZmluZSBGMDkwMF9QTExMT0NLIDB4ZjFiODAwMDEKIAogLypTVE9QQ0xLMSovCi0jZGVmaW5lIFIwOTAwX1NUT1BDTEsxICAweGYxYzIKLSNkZWZpbmUgRjA5MDBfU1RPUF9DTEtQS0RUMiAgMHhmMWMyMDA0MAotI2RlZmluZSBGMDkwMF9TVE9QX0NMS1BLRFQxICAweGYxYzIwMDIwCi0jZGVmaW5lIEYwOTAwX1NUT1BfQ0xLRkVDICAweGYxYzIwMDEwCi0jZGVmaW5lIEYwOTAwX1NUT1BfQ0xLQURDSTIgIDB4ZjFjMjAwMDgKLSNkZWZpbmUgRjA5MDBfSU5WX0NMS0FEQ0kyICAweGYxYzIwMDA0Ci0jZGVmaW5lIEYwOTAwX1NUT1BfQ0xLQURDSTEgIDB4ZjFjMjAwMDIKLSNkZWZpbmUgRjA5MDBfSU5WX0NMS0FEQ0kxICAweGYxYzIwMDAxCisjZGVmaW5lIFIwOTAwX1NUT1BDTEsxIDB4ZjFjMgorI2RlZmluZSBGMDkwMF9TVE9QX0NMS1BLRFQyIDB4ZjFjMjAwNDAKKyNkZWZpbmUgRjA5MDBfU1RPUF9DTEtQS0RUMSAweGYxYzIwMDIwCisjZGVmaW5lIEYwOTAwX1NUT1BfQ0xLRkVDIDB4ZjFjMjAwMTAKKyNkZWZpbmUgRjA5MDBfU1RPUF9DTEtBRENJMiAweGYxYzIwMDA4CisjZGVmaW5lIEYwOTAwX0lOVl9DTEtBRENJMiAweGYxYzIwMDA0CisjZGVmaW5lIEYwOTAwX1NUT1BfQ0xLQURDSTEgMHhmMWMyMDAwMgorI2RlZmluZSBGMDkwMF9JTlZfQ0xLQURDSTEgMHhmMWMyMDAwMQogCiAvKlNUT1BDTEsyKi8KLSNkZWZpbmUgUjA5MDBfU1RPUENMSzIgIDB4ZjFjMwotI2RlZmluZSBGMDkwMF9TVE9QX0NMS1NBTVAyICAweGYxYzMwMDEwCi0jZGVmaW5lIEYwOTAwX1NUT1BfQ0xLU0FNUDEgIDB4ZjFjMzAwMDgKLSNkZWZpbmUgRjA5MDBfU1RPUF9DTEtWSVQyICAweGYxYzMwMDA0Ci0jZGVmaW5lIEYwOTAwX1NUT1BfQ0xLVklUMSAgMHhmMWMzMDAwMgotI2RlZmluZSBGMDkwMF9TVE9QX0NMS1RTICAweGYxYzMwMDAxCisjZGVmaW5lIFIwOTAwX1NUT1BDTEsyIDB4ZjFjMworI2RlZmluZSBGMDkwMF9TVE9QX0NMS1NBTVAyIDB4ZjFjMzAwMTAKKyNkZWZpbmUgRjA5MDBfU1RPUF9DTEtTQU1QMSAweGYxYzMwMDA4CisjZGVmaW5lIEYwOTAwX1NUT1BfQ0xLVklUMiAweGYxYzMwMDA0CisjZGVmaW5lIEYwOTAwX1NUT1BfQ0xLVklUMSAweGYxYzMwMDAyCisjZGVmaW5lIFNUT1BfQ0xLVklUIHNoaWZ0eChGMDkwMF9TVE9QX0NMS1ZJVDEsIGRlbW9kLCAtMikKKyNkZWZpbmUgRjA5MDBfU1RPUF9DTEtUUyAweGYxYzMwMDAxCiAKIC8qVFNUVE5SMCovCi0jZGVmaW5lIFIwOTAwX1RTVFROUjAgIDB4ZjFkZgotI2RlZmluZSBGMDkwMF9TRUxfRlNLICAweGYxZGYwMDgwCi0jZGVmaW5lIEYwOTAwX0ZTS19QT04gIDB4ZjFkZjAwMDQKLSNkZWZpbmUgRjA5MDBfRlNLX09QRU5MT09QICAweGYxZGYwMDAyCisjZGVmaW5lIFIwOTAwX1RTVFROUjAgMHhmMWRmCisjZGVmaW5lIEYwOTAwX1NFTF9GU0sgMHhmMWRmMDA4MAorI2RlZmluZSBGMDkwMF9GU0tfUE9OIDB4ZjFkZjAwMDQKIAogLypUU1RUTlIxKi8KLSNkZWZpbmUgUjA5MDBfVFNUVE5SMSAgMHhmMWUwCi0jZGVmaW5lIEYwOTAwX0JZUEFTU19BREMxICAweGYxZTAwMDgwCi0jZGVmaW5lIEYwOTAwX0lOVkFEQzFfQ0tPVVQgIDB4ZjFlMDAwNDAKLSNkZWZpbmUgRjA5MDBfU0VMSVFTUkMxICAweGYxZTAwMDMwCi0jZGVmaW5lIEYwOTAwX0FEQzFfUE9OICAweGYxZTAwMDAyCi0jZGVmaW5lIEYwOTAwX0FEQzFfSU5NT0RFICAweGYxZTAwMDAxCisjZGVmaW5lIFIwOTAwX1RTVFROUjEgMHhmMWUwCisjZGVmaW5lIEYwOTAwX0FEQzFfUE9OIDB4ZjFlMDAwMDIKKyNkZWZpbmUgRjA5MDBfQURDMV9JTk1PREUgMHhmMWUwMDAwMQogCiAvKlRTVFROUjIqLwotI2RlZmluZSBSMDkwMF9UU1RUTlIyICAweGYxZTEKLSNkZWZpbmUgRjA5MDBfRElTRVFDMV9QT04gIDB4ZjFlMTAwMjAKLSNkZWZpbmUgRjA5MDBfRElTRVFDMV9URVNUICAweGYxZTEwMDFmCisjZGVmaW5lIFIwOTAwX1RTVFROUjIgMHhmMWUxCisjZGVmaW5lIEYwOTAwX0RJU0VRQzFfUE9OIDB4ZjFlMTAwMjAKIAogLypUU1RUTlIzKi8KLSNkZWZpbmUgUjA5MDBfVFNUVE5SMyAgMHhmMWUyCi0jZGVmaW5lIEYwOTAwX0JZUEFTU19BREMyICAweGYxZTIwMDgwCi0jZGVmaW5lIEYwOTAwX0lOVkFEQzJfQ0tPVVQgIDB4ZjFlMjAwNDAKLSNkZWZpbmUgRjA5MDBfU0VMSVFTUkMyICAweGYxZTIwMDMwCi0jZGVmaW5lIEYwOTAwX0FEQzJfUE9OICAweGYxZTIwMDAyCi0jZGVmaW5lIEYwOTAwX0FEQzJfSU5NT0RFICAweGYxZTIwMDAxCisjZGVmaW5lIFIwOTAwX1RTVFROUjMgMHhmMWUyCisjZGVmaW5lIEYwOTAwX0FEQzJfUE9OIDB4ZjFlMjAwMDIKKyNkZWZpbmUgRjA5MDBfQURDMl9JTk1PREUgMHhmMWUyMDAwMQogCiAvKlRTVFROUjQqLwotI2RlZmluZSBSMDkwMF9UU1RUTlI0ICAweGYxZTMKLSNkZWZpbmUgRjA5MDBfRElTRVFDMl9QT04gIDB4ZjFlMzAwMjAKLSNkZWZpbmUgRjA5MDBfRElTRVFDMl9URVNUICAweGYxZTMwMDFmCisjZGVmaW5lIFIwOTAwX1RTVFROUjQgMHhmMWUzCisjZGVmaW5lIEYwOTAwX0RJU0VRQzJfUE9OIDB4ZjFlMzAwMjAKIAogLypQMl9JUUNPTlNUKi8KLSNkZWZpbmUgUjA5MDBfUDJfSVFDT05TVCAgMHhmMjAwCi0jZGVmaW5lIEYwOTAwX1AyX0NPTlNURUxfU0VMRUNUICAweGYyMDAwMDYwCi0jZGVmaW5lIEYwOTAwX1AyX0lRU1lNQl9TRUwgIDB4ZjIwMDAwMWYKKyNkZWZpbmUgUjA5MDBfUDJfSVFDT05TVCAweGYyMDAKKyNkZWZpbmUgRjA5MDBfUDJfQ09OU1RFTF9TRUxFQ1QgMHhmMjAwMDA2MAorI2RlZmluZSBGMDkwMF9QMl9JUVNZTUJfU0VMIDB4ZjIwMDAwMWYKIAogLypQMl9OT1NDRkcqLwotI2RlZmluZSBSMDkwMF9QMl9OT1NDRkcgIDB4ZjIwMQotI2RlZmluZSBGMDkwMF9QMl9EVU1NWVBMX05PU0RBVEEgIDB4ZjIwMTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfTk9TUExIX0JFVEEgIDB4ZjIwMTAwMTgKLSNkZWZpbmUgRjA5MDBfUDJfTk9TREFUQV9CRVRBICAweGYyMDEwMDA3CisjZGVmaW5lIFIwOTAwX1AyX05PU0NGRyAweGYyMDEKKyNkZWZpbmUgRjA5MDBfUDJfRFVNTVlQTF9OT1NEQVRBIDB4ZjIwMTAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfTk9TUExIX0JFVEEgMHhmMjAxMDAxOAorI2RlZmluZSBGMDkwMF9QMl9OT1NEQVRBX0JFVEEgMHhmMjAxMDAwNwogCiAvKlAyX0lTWU1CKi8KLSNkZWZpbmUgUjA5MDBfUDJfSVNZTUIgIDB4ZjIwMgotI2RlZmluZSBGMDkwMF9QMl9JX1NZTUJPTCAgMHhmMjAyMDFmZgorI2RlZmluZSBSMDkwMF9QMl9JU1lNQiAweGYyMDIKKyNkZWZpbmUgRjA5MDBfUDJfSV9TWU1CT0wgMHhmMjAyMDFmZgogCiAvKlAyX1FTWU1CKi8KLSNkZWZpbmUgUjA5MDBfUDJfUVNZTUIgIDB4ZjIwMwotI2RlZmluZSBGMDkwMF9QMl9RX1NZTUJPTCAgMHhmMjAzMDFmZgorI2RlZmluZSBSMDkwMF9QMl9RU1lNQiAweGYyMDMKKyNkZWZpbmUgRjA5MDBfUDJfUV9TWU1CT0wgMHhmMjAzMDFmZgogCiAvKlAyX0FHQzFDRkcqLwotI2RlZmluZSBSMDkwMF9QMl9BR0MxQ0ZHICAweGYyMDQKLSNkZWZpbmUgRjA5MDBfUDJfRENfRlJPWkVOICAweGYyMDQwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0RDX0NPUlJFQ1QgIDB4ZjIwNDAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQU1NX0ZST1pFTiAgMHhmMjA0MDAyMAotI2RlZmluZSBGMDkwMF9QMl9BTU1fQ09SUkVDVCAgMHhmMjA0MDAxMAotI2RlZmluZSBGMDkwMF9QMl9RVUFEX0ZST1pFTiAgMHhmMjA0MDAwOAotI2RlZmluZSBGMDkwMF9QMl9RVUFEX0NPUlJFQ1QgIDB4ZjIwNDAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfRENDT01QX1NMT1cgIDB4ZjIwNDAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfSVFNSVNNX1NMT1cgIDB4ZjIwNDAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfQUdDMUNGRyAweGYyMDQKKyNkZWZpbmUgRjA5MDBfUDJfRENfRlJPWkVOIDB4ZjIwNDAwODAKKyNkZWZpbmUgRjA5MDBfUDJfRENfQ09SUkVDVCAweGYyMDQwMDQwCisjZGVmaW5lIEYwOTAwX1AyX0FNTV9GUk9aRU4gMHhmMjA0MDAyMAorI2RlZmluZSBGMDkwMF9QMl9BTU1fQ09SUkVDVCAweGYyMDQwMDEwCisjZGVmaW5lIEYwOTAwX1AyX1FVQURfRlJPWkVOIDB4ZjIwNDAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfUVVBRF9DT1JSRUNUIDB4ZjIwNDAwMDQKIAogLypQMl9BR0MxQ04qLwotI2RlZmluZSBSMDkwMF9QMl9BR0MxQ04gIDB4ZjIwNgotI2RlZmluZSBGMDkwMF9QMl9BR0MxX0xPQ0tFRCAgMHhmMjA2MDA4MAotI2RlZmluZSBGMDkwMF9QMl9BR0MxX09WRVJGTE9XICAweGYyMDYwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX0FHQzFfTk9TTE9XTEsgIDB4ZjIwNjAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMV9NSU5QT1dFUiAgMHhmMjA2MDAxMAotI2RlZmluZSBGMDkwMF9QMl9BR0NPVVRfRkFTVCAgMHhmMjA2MDAwOAotI2RlZmluZSBGMDkwMF9QMl9BR0NJUV9CRVRBICAweGYyMDYwMDA3CisjZGVmaW5lIFIwOTAwX1AyX0FHQzFDTiAweGYyMDYKKyNkZWZpbmUgRjA5MDBfUDJfQUdDMV9MT0NLRUQgMHhmMjA2MDA4MAorI2RlZmluZSBGMDkwMF9QMl9BR0MxX01JTlBPV0VSIDB4ZjIwNjAwMTAKKyNkZWZpbmUgRjA5MDBfUDJfQUdDT1VUX0ZBU1QgMHhmMjA2MDAwOAorI2RlZmluZSBGMDkwMF9QMl9BR0NJUV9CRVRBIDB4ZjIwNjAwMDcKIAogLypQMl9BR0MxUkVGKi8KLSNkZWZpbmUgUjA5MDBfUDJfQUdDMVJFRiAgMHhmMjA3Ci0jZGVmaW5lIEYwOTAwX1AyX0FHQ0lRX1JFRiAgMHhmMjA3MDBmZgorI2RlZmluZSBSMDkwMF9QMl9BR0MxUkVGIDB4ZjIwNworI2RlZmluZSBGMDkwMF9QMl9BR0NJUV9SRUYgMHhmMjA3MDBmZgogCiAvKlAyX0lEQ0NPTVAqLwotI2RlZmluZSBSMDkwMF9QMl9JRENDT01QICAweGYyMDgKLSNkZWZpbmUgRjA5MDBfUDJfSUFWRVJBR0VfQURKICAweGYyMDgwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0lEQ0NPTVAgMHhmMjA4CisjZGVmaW5lIEYwOTAwX1AyX0lBVkVSQUdFX0FESiAweGYyMDgwMWZmCiAKIC8qUDJfUURDQ09NUCovCi0jZGVmaW5lIFIwOTAwX1AyX1FEQ0NPTVAgIDB4ZjIwOQotI2RlZmluZSBGMDkwMF9QMl9RQVZFUkFHRV9BREogIDB4ZjIwOTAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfUURDQ09NUCAweGYyMDkKKyNkZWZpbmUgRjA5MDBfUDJfUUFWRVJBR0VfQURKIDB4ZjIwOTAxZmYKIAogLypQMl9QT1dFUkkqLwotI2RlZmluZSBSMDkwMF9QMl9QT1dFUkkgIDB4ZjIwYQotI2RlZmluZSBGMDkwMF9QMl9QT1dFUl9JICAweGYyMGEwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1BPV0VSSSAweGYyMGEKKyNkZWZpbmUgRjA5MDBfUDJfUE9XRVJfSSAweGYyMGEwMGZmCiAKIC8qUDJfUE9XRVJRKi8KLSNkZWZpbmUgUjA5MDBfUDJfUE9XRVJRICAweGYyMGIKLSNkZWZpbmUgRjA5MDBfUDJfUE9XRVJfUSAgMHhmMjBiMDBmZgorI2RlZmluZSBSMDkwMF9QMl9QT1dFUlEgMHhmMjBiCisjZGVmaW5lIEYwOTAwX1AyX1BPV0VSX1EgMHhmMjBiMDBmZgogCiAvKlAyX0FHQzFBTU0qLwotI2RlZmluZSBSMDkwMF9QMl9BR0MxQU1NICAweGYyMGMKLSNkZWZpbmUgRjA5MDBfUDJfQU1NX1ZBTFVFICAweGYyMGMwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0FHQzFBTU0gMHhmMjBjCisjZGVmaW5lIEYwOTAwX1AyX0FNTV9WQUxVRSAweGYyMGMwMGZmCiAKIC8qUDJfQUdDMVFVQUQqLwotI2RlZmluZSBSMDkwMF9QMl9BR0MxUVVBRCAgMHhmMjBkCi0jZGVmaW5lIEYwOTAwX1AyX1FVQURfVkFMVUUgIDB4ZjIwZDAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfQUdDMVFVQUQgMHhmMjBkCisjZGVmaW5lIEYwOTAwX1AyX1FVQURfVkFMVUUgMHhmMjBkMDFmZgogCiAvKlAyX0FHQ0lRSU4xKi8KLSNkZWZpbmUgUjA5MDBfUDJfQUdDSVFJTjEgIDB4ZjIwZQotI2RlZmluZSBGMDkwMF9QMl9BR0NJUV9WQUxVRTEgIDB4ZjIwZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfQUdDSVFJTjEgMHhmMjBlCisjZGVmaW5lIEYwOTAwX1AyX0FHQ0lRX1ZBTFVFMSAweGYyMGUwMGZmCiAKIC8qUDJfQUdDSVFJTjAqLwotI2RlZmluZSBSMDkwMF9QMl9BR0NJUUlOMCAgMHhmMjBmCi0jZGVmaW5lIEYwOTAwX1AyX0FHQ0lRX1ZBTFVFMCAgMHhmMjBmMDBmZgorI2RlZmluZSBSMDkwMF9QMl9BR0NJUUlOMCAweGYyMGYKKyNkZWZpbmUgRjA5MDBfUDJfQUdDSVFfVkFMVUUwIDB4ZjIwZjAwZmYKIAogLypQMl9ERU1PRCovCi0jZGVmaW5lIFIwOTAwX1AyX0RFTU9EICAweGYyMTAKLSNkZWZpbmUgRjA5MDBfUDJfREVNT0RfU1RPUCAgMHhmMjEwMDA0MAotI2RlZmluZSBGMDkwMF9QMl9TUEVDSU5WX0NPTlRST0wgIDB4ZjIxMDAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfRk9SQ0VfRU5BU0FNUCAgMHhmMjEwMDAwOAotI2RlZmluZSBGMDkwMF9QMl9NQU5VQUxfUk9MTE9GRiAgMHhmMjEwMDAwNAotI2RlZmluZSBGMDkwMF9QMl9ST0xMT0ZGX0NPTlRST0wgIDB4ZjIxMDAwMDMKKyNkZWZpbmUgUjA5MDBfUDJfREVNT0QgMHhmMjEwCisjZGVmaW5lIEYwOTAwX1AyX01BTlVBTFMyX1JPTExPRkYgMHhmMjEwMDA4MAorI2RlZmluZSBGMDkwMF9QMl9TUEVDSU5WX0NPTlRST0wgMHhmMjEwMDAzMAorI2RlZmluZSBGMDkwMF9QMl9GT1JDRV9FTkFTQU1QIDB4ZjIxMDAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfTUFOVUFMU1hfUk9MTE9GRiAweGYyMTAwMDA0CisjZGVmaW5lIEYwOTAwX1AyX1JPTExPRkZfQ09OVFJPTCAweGYyMTAwMDAzCiAKIC8qUDJfRE1ETU9EQ09EKi8KLSNkZWZpbmUgUjA5MDBfUDJfRE1ETU9EQ09EICAweGYyMTEKLSNkZWZpbmUgRjA5MDBfUDJfTUFOVUFMX01PRENPRCAgMHhmMjExMDA4MAotI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9NT0RDT0QgIDB4ZjIxMTAwN2MKLSNkZWZpbmUgRjA5MDBfUDJfREVNT0RfVFlQRSAgMHhmMjExMDAwMworI2RlZmluZSBSMDkwMF9QMl9ETURNT0RDT0QgMHhmMjExCisjZGVmaW5lIEYwOTAwX1AyX01BTlVBTF9NT0RDT0QgMHhmMjExMDA4MAorI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9NT0RDT0QgMHhmMjExMDA3YworI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9UWVBFIDB4ZjIxMTAwMDMKIAogLypQMl9EU1RBVFVTKi8KLSNkZWZpbmUgUjA5MDBfUDJfRFNUQVRVUyAgMHhmMjEyCi0jZGVmaW5lIEYwOTAwX1AyX0NBUl9MT0NLICAweGYyMTIwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1RNR0xPQ0tfUVVBTElUWSAgMHhmMjEyMDA2MAotI2RlZmluZSBGMDkwMF9QMl9TRFZCUzFfRU5BQkxFICAweGYyMTIwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0xPQ0tfREVGSU5JVElGICAweGYyMTIwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX1RJTUlOR19JU19MT0NLRUQgIDB4ZjIxMjAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfQ09BUlNFX1RNR0xPQ0sgIDB4ZjIxMjAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfQ09BUlNFX0NBUkxPQ0sgIDB4ZjIxMjAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfRFNUQVRVUyAweGYyMTIKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSX0xPQ0sgMHhmMjEyMDA4MAorI2RlZmluZSBGMDkwMF9QMl9UTUdMT0NLX1FVQUxJVFkgMHhmMjEyMDA2MAorI2RlZmluZSBGMDkwMF9QMl9MT0NLX0RFRklOSVRJRiAweGYyMTIwMDA4CisjZGVmaW5lIEYwOTAwX1AyX09WQURDX0RFVEVDVCAweGYyMTIwMDAxCiAKIC8qUDJfRFNUQVRVUzIqLwotI2RlZmluZSBSMDkwMF9QMl9EU1RBVFVTMiAgMHhmMjEzCi0jZGVmaW5lIEYwOTAwX1AyX0RFTU9EX0RFTE9DSyAgMHhmMjEzMDA4MAotI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9USU1FT1VUICAweGYyMTMwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX01PRENPRFJRX1NZTkNUQUcgIDB4ZjIxMzAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfUE9MWVBIX1NBVEVWRU5UICAweGYyMTMwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0FHQzFfTk9TSUdOQUxBQ0sgIDB4ZjIxMzAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMl9PVkVSRkxPVyAgMHhmMjEzMDAwNAotI2RlZmluZSBGMDkwMF9QMl9DRlJfT1ZFUkZMT1cgIDB4ZjIxMzAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfR0FNTUFfT1ZFUlVOREVSICAweGYyMTMwMDAxCisjZGVmaW5lIFIwOTAwX1AyX0RTVEFUVVMyIDB4ZjIxMworI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9ERUxPQ0sgMHhmMjEzMDA4MAorI2RlZmluZSBGMDkwMF9QMl9BR0MxX05PU0lHTkFMQUNLIDB4ZjIxMzAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfQUdDMl9PVkVSRkxPVyAweGYyMTMwMDA0CisjZGVmaW5lIEYwOTAwX1AyX0NGUl9PVkVSRkxPVyAweGYyMTMwMDAyCisjZGVmaW5lIEYwOTAwX1AyX0dBTU1BX09WRVJVTkRFUiAweGYyMTMwMDAxCiAKIC8qUDJfRE1EQ0ZHTUQqLwotI2RlZmluZSBSMDkwMF9QMl9ETURDRkdNRCAgMHhmMjE0Ci0jZGVmaW5lIEYwOTAwX1AyX0RWQlMyX0VOQUJMRSAgMHhmMjE0MDA4MAotI2RlZmluZSBGMDkwMF9QMl9EVkJTMV9FTkFCTEUgIDB4ZjIxNDAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSX0FVVE9TQ0FOICAweGYyMTQwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX1NDQU5fRU5BQkxFICAweGYyMTQwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX1RVTl9BVVRPU0NBTiAgMHhmMjE0MDAwOAotI2RlZmluZSBGMDkwMF9QMl9OT0ZPUkNFX1JFTE9DSyAgMHhmMjE0MDAwNAotI2RlZmluZSBGMDkwMF9QMl9UVU5fUk5HICAweGYyMTQwMDAzCisjZGVmaW5lIFIwOTAwX1AyX0RNRENGR01EIDB4ZjIxNAorI2RlZmluZSBGMDkwMF9QMl9EVkJTMl9FTkFCTEUgMHhmMjE0MDA4MAorI2RlZmluZSBGMDkwMF9QMl9EVkJTMV9FTkFCTEUgMHhmMjE0MDA0MAorI2RlZmluZSBGMDkwMF9QMl9TQ0FOX0VOQUJMRSAweGYyMTQwMDEwCisjZGVmaW5lIEYwOTAwX1AyX0NGUl9BVVRPU0NBTiAweGYyMTQwMDA4CisjZGVmaW5lIEYwOTAwX1AyX1RVTl9STkcgMHhmMjE0MDAwMwogCiAvKlAyX0RNRENGRzIqLwotI2RlZmluZSBSMDkwMF9QMl9ETURDRkcyICAweGYyMTUKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMV9XQUlUTE9DSyAgMHhmMjE1MDA4MAotI2RlZmluZSBGMDkwMF9QMl9TMVMyX1NFUVVFTlRJQUwgIDB4ZjIxNTAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfT1ZFUkZMT1dfVElNRU9VVCAgMHhmMjE1MDAyMAotI2RlZmluZSBGMDkwMF9QMl9TQ0FORkFJTF9USU1FT1VUICAweGYyMTUwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0RNRFRPVVRfQkFDSyAgMHhmMjE1MDAwOAotI2RlZmluZSBGMDkwMF9QMl9DQVJMT0NLX1MxRU5BQkxFICAweGYyMTUwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX0NPQVJTRV9MSzNNT0RFICAweGYyMTUwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX0NPQVJTRV9MSzJNT0RFICAweGYyMTUwMDAxCisjZGVmaW5lIFIwOTAwX1AyX0RNRENGRzIgMHhmMjE1CisjZGVmaW5lIEYwOTAwX1AyX1MxUzJfU0VRVUVOVElBTCAweGYyMTUwMDQwCisjZGVmaW5lIEYwOTAwX1AyX0lORklOSVRFX1JFTE9DSyAweGYyMTUwMDEwCiAKIC8qUDJfRE1ESVNUQVRFKi8KLSNkZWZpbmUgUjA5MDBfUDJfRE1ESVNUQVRFICAweGYyMTYKLSNkZWZpbmUgRjA5MDBfUDJfSTJDX05PUkVTRVRETU9ERSAgMHhmMjE2MDA4MAotI2RlZmluZSBGMDkwMF9QMl9GT1JDRV9FVEFQRUQgIDB4ZjIxNjAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfU0RNRFJTVF9ESVJDTEsgIDB4ZjIxNjAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfSTJDX0RFTU9EX01PREUgIDB4ZjIxNjAwMWYKKyNkZWZpbmUgUjA5MDBfUDJfRE1ESVNUQVRFIDB4ZjIxNgorI2RlZmluZSBGMDkwMF9QMl9JMkNfREVNT0RfTU9ERSAweGYyMTYwMDFmCiAKIC8qUDJfRE1EVDBNKi8KLSNkZWZpbmUgUjA5MDBfUDJfRE1EVDBNICAweGYyMTcKLSNkZWZpbmUgRjA5MDBfUDJfRE1EVDBfTUlOICAweGYyMTcwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0RNRFQwTSAweGYyMTcKKyNkZWZpbmUgRjA5MDBfUDJfRE1EVDBfTUlOIDB4ZjIxNzAwZmYKIAogLypQMl9ETURTVEFURSovCi0jZGVmaW5lIFIwOTAwX1AyX0RNRFNUQVRFICAweGYyMWIKLSNkZWZpbmUgRjA5MDBfUDJfREVNT0RfTE9DS0VEICAweGYyMWIwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0hFQURFUl9NT0RFICAweGYyMWIwMDYwCi0jZGVmaW5lIEYwOTAwX1AyX0RFTU9EX01PREUgIDB4ZjIxYjAwMWYKKyNkZWZpbmUgUjA5MDBfUDJfRE1EU1RBVEUgMHhmMjFiCisjZGVmaW5lIEYwOTAwX1AyX0hFQURFUl9NT0RFIDB4ZjIxYjAwNjAKIAogLypQMl9ETURGTFlXKi8KLSNkZWZpbmUgUjA5MDBfUDJfRE1ERkxZVyAgMHhmMjFjCi0jZGVmaW5lIEYwOTAwX1AyX0kyQ19JUlFWQUwgIDB4ZjIxYzAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfRkxZV0hFRUxfQ1BUICAweGYyMWMwMDBmCisjZGVmaW5lIFIwOTAwX1AyX0RNREZMWVcgMHhmMjFjCisjZGVmaW5lIEYwOTAwX1AyX0kyQ19JUlFWQUwgMHhmMjFjMDBmMAorI2RlZmluZSBGMDkwMF9QMl9GTFlXSEVFTF9DUFQgMHhmMjFjMDAwZgogCiAvKlAyX0RTVEFUVVMzKi8KLSNkZWZpbmUgUjA5MDBfUDJfRFNUQVRVUzMgIDB4ZjIxZAotI2RlZmluZSBGMDkwMF9QMl9DRlJfWklHWkFHICAweGYyMWQwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0RFTU9EX0NGR01PREUgIDB4ZjIxZDAwNjAKLSNkZWZpbmUgRjA5MDBfUDJfR0FNTUFfTE9XQkFVRFJBVEUgIDB4ZjIxZDAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfUkVMT0NLX01PREUgIDB4ZjIxZDAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfREVNT0RfRkFJTCAgMHhmMjFkMDAwNAotI2RlZmluZSBGMDkwMF9QMl9FVEFQRTFBX0RWQlhNRU0gIDB4ZjIxZDAwMDMKKyNkZWZpbmUgUjA5MDBfUDJfRFNUQVRVUzMgMHhmMjFkCisjZGVmaW5lIEYwOTAwX1AyX0RFTU9EX0NGR01PREUgMHhmMjFkMDA2MAogCiAvKlAyX0RNRENGRzMqLwotI2RlZmluZSBSMDkwMF9QMl9ETURDRkczICAweGYyMWUKLSNkZWZpbmUgRjA5MDBfUDJfRFZCUzFfVE1HV0FJVCAgMHhmMjFlMDA4MAotI2RlZmluZSBGMDkwMF9QMl9OT19CV0NFTlRFUklORyAgMHhmMjFlMDA0MAotI2RlZmluZSBGMDkwMF9QMl9JTlZfU0VRU1JDSCAgMHhmMjFlMDAyMAotI2RlZmluZSBGMDkwMF9QMl9ESVNfU0ZSVVBMT1dfVFJLICAweGYyMWUwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX05PU1RPUF9GSUZPRlVMTCAgMHhmMjFlMDAwOAotI2RlZmluZSBGMDkwMF9QMl9MT0NLVElNRV9NT0RFICAweGYyMWUwMDA3CisjZGVmaW5lIFIwOTAwX1AyX0RNRENGRzMgMHhmMjFlCisjZGVmaW5lIEYwOTAwX1AyX05PU1RPUF9GSUZPRlVMTCAweGYyMWUwMDA4CiAKIC8qUDJfRE1EQ0ZHNCovCi0jZGVmaW5lIFIwOTAwX1AyX0RNRENGRzQgIDB4ZjIxZgotI2RlZmluZSBGMDkwMF9QMl9UVU5FUl9OUkVMQVVOQ0ggIDB4ZjIxZjAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfRElTX0NMS0VOQUJMRSAgMHhmMjFmMDAwNAotI2RlZmluZSBGMDkwMF9QMl9ESVNfSERSRElWTE9DSyAgMHhmMjFmMDAwMgotI2RlZmluZSBGMDkwMF9QMl9OT19UTlJXQklOSVQgIDB4ZjIxZjAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfRE1EQ0ZHNCAweGYyMWYKKyNkZWZpbmUgRjA5MDBfUDJfVFVORVJfTlJFTEFVTkNIIDB4ZjIxZjAwMDgKIAogLypQMl9DT1JSRUxNQU5UKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ09SUkVMTUFOVCAgMHhmMjIwCi0jZGVmaW5lIEYwOTAwX1AyX0NPUlJFTF9NQU5UICAweGYyMjAwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0NPUlJFTE1BTlQgMHhmMjIwCisjZGVmaW5lIEYwOTAwX1AyX0NPUlJFTF9NQU5UIDB4ZjIyMDAwZmYKIAogLypQMl9DT1JSRUxBQlMqLwotI2RlZmluZSBSMDkwMF9QMl9DT1JSRUxBQlMgIDB4ZjIyMQotI2RlZmluZSBGMDkwMF9QMl9DT1JSRUxfQUJTICAweGYyMjEwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0NPUlJFTEFCUyAweGYyMjEKKyNkZWZpbmUgRjA5MDBfUDJfQ09SUkVMX0FCUyAweGYyMjEwMGZmCiAKIC8qUDJfQ09SUkVMRVhQKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ09SUkVMRVhQICAweGYyMjIKLSNkZWZpbmUgRjA5MDBfUDJfQ09SUkVMX0FCU0VYUCAgMHhmMjIyMDBmMAotI2RlZmluZSBGMDkwMF9QMl9DT1JSRUxfRVhQICAweGYyMjIwMDBmCisjZGVmaW5lIFIwOTAwX1AyX0NPUlJFTEVYUCAweGYyMjIKKyNkZWZpbmUgRjA5MDBfUDJfQ09SUkVMX0FCU0VYUCAweGYyMjIwMGYwCisjZGVmaW5lIEYwOTAwX1AyX0NPUlJFTF9FWFAgMHhmMjIyMDAwZgogCiAvKlAyX1BMSE1PRENPRCovCi0jZGVmaW5lIFIwOTAwX1AyX1BMSE1PRENPRCAgMHhmMjI0Ci0jZGVmaW5lIEYwOTAwX1AyX1NQRUNJTlZfREVNT0QgIDB4ZjIyNDAwODAKLSNkZWZpbmUgRjA5MDBfUDJfUExIX01PRENPRCAgMHhmMjI0MDA3YwotI2RlZmluZSBGMDkwMF9QMl9QTEhfVFlQRSAgMHhmMjI0MDAwMworI2RlZmluZSBSMDkwMF9QMl9QTEhNT0RDT0QgMHhmMjI0CisjZGVmaW5lIEYwOTAwX1AyX1NQRUNJTlZfREVNT0QgMHhmMjI0MDA4MAorI2RlZmluZSBGMDkwMF9QMl9QTEhfTU9EQ09EIDB4ZjIyNDAwN2MKKyNkZWZpbmUgRjA5MDBfUDJfUExIX1RZUEUgMHhmMjI0MDAwMwogCi0vKlAyX0FHQ0szMiovCi0jZGVmaW5lIFIwOTAwX1AyX0FHQ0szMiAgMHhmMjJiCi0jZGVmaW5lIEYwOTAwX1AyX1IzQURKT0ZGXzMyQVBTSyAgMHhmMjJiMDA4MAotI2RlZmluZSBGMDkwMF9QMl9SMkFESk9GRl8zMkFQU0sgIDB4ZjIyYjAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfUjFBREpPRkZfMzJBUFNLICAweGYyMmIwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX1JBREpfMzJBUFNLICAweGYyMmIwMDFmCisvKlAyX0RNRFJFRyovCisjZGVmaW5lIFIwOTAwX1AyX0RNRFJFRyAweGYyMjUKKyNkZWZpbmUgRjA5MDBfUDJfREVDSU1fUExGUkFNRVMgMHhmMjI1MDAwMQogCiAvKlAyX0FHQzJPKi8KLSNkZWZpbmUgUjA5MDBfUDJfQUdDMk8gIDB4ZjIyYwotI2RlZmluZSBGMDkwMF9QMl9BR0MyUkVGX0FESlVTVElORyAgMHhmMjJjMDA4MAotI2RlZmluZSBGMDkwMF9QMl9BR0MyX0NPQVJTRUZBU1QgIDB4ZjIyYzAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMl9MS1NRUlQgIDB4ZjIyYzAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMl9MS01PREUgIDB4ZjIyYzAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMl9MS0VRVUEgIDB4ZjIyYzAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMl9DT0VGICAweGYyMmMwMDA3CisjZGVmaW5lIFIwOTAwX1AyX0FHQzJPIDB4ZjIyYworI2RlZmluZSBGMDkwMF9QMl9BR0MyX0NPRUYgMHhmMjJjMDAwNwogCiAvKlAyX0FHQzJSRUYqLwotI2RlZmluZSBSMDkwMF9QMl9BR0MyUkVGICAweGYyMmQKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMl9SRUYgIDB4ZjIyZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfQUdDMlJFRiAweGYyMmQKKyNkZWZpbmUgRjA5MDBfUDJfQUdDMl9SRUYgMHhmMjJkMDBmZgogCiAvKlAyX0FHQzFBREoqLwotI2RlZmluZSBSMDkwMF9QMl9BR0MxQURKICAweGYyMmUKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMUFESl9NQU5VQUwgIDB4ZjIyZTAwODAKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMV9BREpVU1RFRCAgMHhmMjJlMDE3ZgorI2RlZmluZSBSMDkwMF9QMl9BR0MxQURKIDB4ZjIyZQorI2RlZmluZSBGMDkwMF9QMl9BR0MxX0FESlVTVEVEIDB4ZjIyZTAwN2YKIAogLypQMl9BR0MySTEqLwotI2RlZmluZSBSMDkwMF9QMl9BR0MySTEgIDB4ZjIzNgotI2RlZmluZSBGMDkwMF9QMl9BR0MyX0lOVEVHUkFUT1IxICAweGYyMzYwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0FHQzJJMSAweGYyMzYKKyNkZWZpbmUgRjA5MDBfUDJfQUdDMl9JTlRFR1JBVE9SMSAweGYyMzYwMGZmCiAKIC8qUDJfQUdDMkkwKi8KLSNkZWZpbmUgUjA5MDBfUDJfQUdDMkkwICAweGYyMzcKLSNkZWZpbmUgRjA5MDBfUDJfQUdDMl9JTlRFR1JBVE9SMCAgMHhmMjM3MDBmZgorI2RlZmluZSBSMDkwMF9QMl9BR0MySTAgMHhmMjM3CisjZGVmaW5lIEYwOTAwX1AyX0FHQzJfSU5URUdSQVRPUjAgMHhmMjM3MDBmZgogCiAvKlAyX0NBUkNGRyovCi0jZGVmaW5lIFIwOTAwX1AyX0NBUkNGRyAgMHhmMjM4Ci0jZGVmaW5lIEYwOTAwX1AyX0NGUlVQTE9XX0FVVE8gIDB4ZjIzODAwODAKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSVVBMT1dfVEVTVCAgMHhmMjM4MDA0MAotI2RlZmluZSBGMDkwMF9QMl9FTl9DQVIyQ0VOVEVSICAweGYyMzgwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUkhEUl9OT0RJVjggIDB4ZjIzODAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfSTJDX1JPVEEgIDB4ZjIzODAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfUk9UQU9OICAweGYyMzgwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX1BIX0RFVF9BTEdPICAweGYyMzgwMDAzCisjZGVmaW5lIFIwOTAwX1AyX0NBUkNGRyAweGYyMzgKKyNkZWZpbmUgRjA5MDBfUDJfQ0ZSVVBMT1dfQVVUTyAweGYyMzgwMDgwCisjZGVmaW5lIEYwOTAwX1AyX0NGUlVQTE9XX1RFU1QgMHhmMjM4MDA0MAorI2RlZmluZSBGMDkwMF9QMl9ST1RBT04gMHhmMjM4MDAwNAorI2RlZmluZSBGMDkwMF9QMl9QSF9ERVRfQUxHTyAweGYyMzgwMDAzCiAKIC8qUDJfQUNMQyovCi0jZGVmaW5lIFIwOTAwX1AyX0FDTEMgIDB4ZjIzOQotI2RlZmluZSBGMDkwMF9QMl9TVE9QX1MyQUxQSEEgIDB4ZjIzOTAwYzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSX0FMUEhBX01BTlQgIDB4ZjIzOTAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSX0FMUEhBX0VYUCAgMHhmMjM5MDAwZgorI2RlZmluZSBSMDkwMF9QMl9BQ0xDIDB4ZjIzOQorI2RlZmluZSBGMDkwMF9QMl9DQVJfQUxQSEFfTUFOVCAweGYyMzkwMDMwCisjZGVmaW5lIEYwOTAwX1AyX0NBUl9BTFBIQV9FWFAgMHhmMjM5MDAwZgogCiAvKlAyX0JDTEMqLwotI2RlZmluZSBSMDkwMF9QMl9CQ0xDICAweGYyM2EKLSNkZWZpbmUgRjA5MDBfUDJfU1RPUF9TMkJFVEEgIDB4ZjIzYTAwYzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSX0JFVEFfTUFOVCAgMHhmMjNhMDAzMAotI2RlZmluZSBGMDkwMF9QMl9DQVJfQkVUQV9FWFAgIDB4ZjIzYTAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfQkNMQyAweGYyM2EKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSX0JFVEFfTUFOVCAweGYyM2EwMDMwCisjZGVmaW5lIEYwOTAwX1AyX0NBUl9CRVRBX0VYUCAweGYyM2EwMDBmCiAKIC8qUDJfQ0FSRlJFUSovCi0jZGVmaW5lIFIwOTAwX1AyX0NBUkZSRVEgIDB4ZjIzZAotI2RlZmluZSBGMDkwMF9QMl9LQ19DT0FSU0VfRVhQICAweGYyM2QwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX0JFVEFfRlJFUSAgMHhmMjNkMDAwZgorI2RlZmluZSBSMDkwMF9QMl9DQVJGUkVRIDB4ZjIzZAorI2RlZmluZSBGMDkwMF9QMl9LQ19DT0FSU0VfRVhQIDB4ZjIzZDAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfQkVUQV9GUkVRIDB4ZjIzZDAwMGYKIAogLypQMl9DQVJIRFIqLwotI2RlZmluZSBSMDkwMF9QMl9DQVJIRFIgIDB4ZjIzZQotI2RlZmluZSBGMDkwMF9QMl9LX0ZSRVFfSERSICAweGYyM2UwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0NBUkhEUiAweGYyM2UKKyNkZWZpbmUgRjA5MDBfUDJfS19GUkVRX0hEUiAweGYyM2UwMGZmCiAKIC8qUDJfTERUKi8KLSNkZWZpbmUgUjA5MDBfUDJfTERUICAweGYyM2YKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSTE9DS19USFJFUyAgMHhmMjNmMDFmZgorI2RlZmluZSBSMDkwMF9QMl9MRFQgMHhmMjNmCisjZGVmaW5lIEYwOTAwX1AyX0NBUkxPQ0tfVEhSRVMgMHhmMjNmMDFmZgogCiAvKlAyX0xEVDIqLwotI2RlZmluZSBSMDkwMF9QMl9MRFQyICAweGYyNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSTE9DS19USFJFUzIgIDB4ZjI0MDAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfTERUMiAweGYyNDAKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSTE9DS19USFJFUzIgMHhmMjQwMDFmZgogCiAvKlAyX0NGUklDRkcqLwotI2RlZmluZSBSMDkwMF9QMl9DRlJJQ0ZHICAweGYyNDEKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSSU5JVF9VTlZBTFJORyAgMHhmMjQxMDA4MAotI2RlZmluZSBGMDkwMF9QMl9DRlJJTklUX0xVTlZBTENQVCAgMHhmMjQxMDA0MAotI2RlZmluZSBGMDkwMF9QMl9DRlJJTklUX0FCT1JUREJMICAweGYyNDEwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX0NGUklOSVRfQUJPUlRQUkVEICAweGYyNDEwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0NGUklOSVRfVU5WQUxTS0lQICAweGYyNDEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX0NGUklOSVRfQ1NUSU5DICAweGYyNDEwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX05FR19DRlJTVEVQICAweGYyNDEwMDAxCisjZGVmaW5lIFIwOTAwX1AyX0NGUklDRkcgMHhmMjQxCisjZGVmaW5lIEYwOTAwX1AyX05FR19DRlJTVEVQIDB4ZjI0MTAwMDEKIAogLypQMl9DRlJVUDEqLwotI2RlZmluZSBSMDkwMF9QMl9DRlJVUDEgIDB4ZjI0MgotI2RlZmluZSBGMDkwMF9QMl9DRlJfVVAxICAweGYyNDIwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0NGUlVQMSAweGYyNDIKKyNkZWZpbmUgRjA5MDBfUDJfQ0ZSX1VQMSAweGYyNDIwMWZmCiAKIC8qUDJfQ0ZSVVAwKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ0ZSVVAwICAweGYyNDMKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSX1VQMCAgMHhmMjQzMDBmZgorI2RlZmluZSBSMDkwMF9QMl9DRlJVUDAgMHhmMjQzCisjZGVmaW5lIEYwOTAwX1AyX0NGUl9VUDAgMHhmMjQzMDBmZgogCiAvKlAyX0NGUkxPVzEqLwotI2RlZmluZSBSMDkwMF9QMl9DRlJMT1cxICAweGYyNDYKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSX0xPVzEgIDB4ZjI0NjAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfQ0ZSTE9XMSAweGYyNDYKKyNkZWZpbmUgRjA5MDBfUDJfQ0ZSX0xPVzEgMHhmMjQ2MDFmZgogCiAvKlAyX0NGUkxPVzAqLwotI2RlZmluZSBSMDkwMF9QMl9DRlJMT1cwICAweGYyNDcKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSX0xPVzAgIDB4ZjI0NzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfQ0ZSTE9XMCAweGYyNDcKKyNkZWZpbmUgRjA5MDBfUDJfQ0ZSX0xPVzAgMHhmMjQ3MDBmZgogCiAvKlAyX0NGUklOSVQxKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ0ZSSU5JVDEgIDB4ZjI0OAotI2RlZmluZSBGMDkwMF9QMl9DRlJfSU5JVDEgIDB4ZjI0ODAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfQ0ZSSU5JVDEgMHhmMjQ4CisjZGVmaW5lIEYwOTAwX1AyX0NGUl9JTklUMSAweGYyNDgwMWZmCiAKIC8qUDJfQ0ZSSU5JVDAqLwotI2RlZmluZSBSMDkwMF9QMl9DRlJJTklUMCAgMHhmMjQ5Ci0jZGVmaW5lIEYwOTAwX1AyX0NGUl9JTklUMCAgMHhmMjQ5MDBmZgorI2RlZmluZSBSMDkwMF9QMl9DRlJJTklUMCAweGYyNDkKKyNkZWZpbmUgRjA5MDBfUDJfQ0ZSX0lOSVQwIDB4ZjI0OTAwZmYKIAogLypQMl9DRlJJTkMxKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ0ZSSU5DMSAgMHhmMjRhCi0jZGVmaW5lIEYwOTAwX1AyX01BTlVBTF9DRlJJTkMgIDB4ZjI0YTAwODAKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSX0lOQzEgIDB4ZjI0YTAxN2YKKyNkZWZpbmUgUjA5MDBfUDJfQ0ZSSU5DMSAweGYyNGEKKyNkZWZpbmUgRjA5MDBfUDJfTUFOVUFMX0NGUklOQyAweGYyNGEwMDgwCisjZGVmaW5lIEYwOTAwX1AyX0NGUl9JTkMxIDB4ZjI0YTAwM2YKIAogLypQMl9DRlJJTkMwKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ0ZSSU5DMCAgMHhmMjRiCi0jZGVmaW5lIEYwOTAwX1AyX0NGUl9JTkMwICAweGYyNGIwMGYwCisjZGVmaW5lIFIwOTAwX1AyX0NGUklOQzAgMHhmMjRiCisjZGVmaW5lIEYwOTAwX1AyX0NGUl9JTkMwIDB4ZjI0YjAwZjgKIAogLypQMl9DRlIyKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ0ZSMiAgMHhmMjRjCi0jZGVmaW5lIEYwOTAwX1AyX0NBUl9GUkVRMiAgMHhmMjRjMDFmZgorI2RlZmluZSBSMDkwMF9QMl9DRlIyIDB4ZjI0YworI2RlZmluZSBGMDkwMF9QMl9DQVJfRlJFUTIgMHhmMjRjMDFmZgogCiAvKlAyX0NGUjEqLwotI2RlZmluZSBSMDkwMF9QMl9DRlIxICAweGYyNGQKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSX0ZSRVExICAweGYyNGQwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0NGUjEgMHhmMjRkCisjZGVmaW5lIEYwOTAwX1AyX0NBUl9GUkVRMSAweGYyNGQwMGZmCiAKIC8qUDJfQ0ZSMCovCi0jZGVmaW5lIFIwOTAwX1AyX0NGUjAgIDB4ZjI0ZQotI2RlZmluZSBGMDkwMF9QMl9DQVJfRlJFUTAgIDB4ZjI0ZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfQ0ZSMCAweGYyNGUKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSX0ZSRVEwIDB4ZjI0ZTAwZmYKIAogLypQMl9MREkqLwotI2RlZmluZSBSMDkwMF9QMl9MREkgIDB4ZjI0ZgotI2RlZmluZSBGMDkwMF9QMl9MT0NLX0RFVF9JTlRFR1IgIDB4ZjI0ZjAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfTERJIDB4ZjI0ZgorI2RlZmluZSBGMDkwMF9QMl9MT0NLX0RFVF9JTlRFR1IgMHhmMjRmMDFmZgogCiAvKlAyX1RNR0NGRyovCi0jZGVmaW5lIFIwOTAwX1AyX1RNR0NGRyAgMHhmMjUwCi0jZGVmaW5lIEYwOTAwX1AyX1RNR0xPQ0tfQkVUQSAgMHhmMjUwMDBjMAotI2RlZmluZSBGMDkwMF9QMl9OT1RNR19HUk9VUERFTEFZICAweGYyNTAwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX0RPX1RJTUlOR19DT1JSICAweGYyNTAwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX01BTlVBTF9TQ0FOICAweGYyNTAwMDBjCi0jZGVmaW5lIEYwOTAwX1AyX1RNR19NSU5GUkVRICAweGYyNTAwMDAzCisjZGVmaW5lIFIwOTAwX1AyX1RNR0NGRyAweGYyNTAKKyNkZWZpbmUgRjA5MDBfUDJfVE1HTE9DS19CRVRBIDB4ZjI1MDAwYzAKKyNkZWZpbmUgRjA5MDBfUDJfRE9fVElNSU5HX0NPUlIgMHhmMjUwMDAxMAorI2RlZmluZSBGMDkwMF9QMl9UTUdfTUlORlJFUSAweGYyNTAwMDAzCiAKIC8qUDJfUlRDKi8KLSNkZWZpbmUgUjA5MDBfUDJfUlRDICAweGYyNTEKLSNkZWZpbmUgRjA5MDBfUDJfVE1HQUxQSEFfRVhQICAweGYyNTEwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX1RNR0JFVEFfRVhQICAweGYyNTEwMDBmCisjZGVmaW5lIFIwOTAwX1AyX1JUQyAweGYyNTEKKyNkZWZpbmUgRjA5MDBfUDJfVE1HQUxQSEFfRVhQIDB4ZjI1MTAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfVE1HQkVUQV9FWFAgMHhmMjUxMDAwZgogCiAvKlAyX1JUQ1MyKi8KLSNkZWZpbmUgUjA5MDBfUDJfUlRDUzIgIDB4ZjI1MgotI2RlZmluZSBGMDkwMF9QMl9UTUdBTFBIQVMyX0VYUCAgMHhmMjUyMDBmMAotI2RlZmluZSBGMDkwMF9QMl9UTUdCRVRBUzJfRVhQICAweGYyNTIwMDBmCisjZGVmaW5lIFIwOTAwX1AyX1JUQ1MyIDB4ZjI1MgorI2RlZmluZSBGMDkwMF9QMl9UTUdBTFBIQVMyX0VYUCAweGYyNTIwMGYwCisjZGVmaW5lIEYwOTAwX1AyX1RNR0JFVEFTMl9FWFAgMHhmMjUyMDAwZgogCiAvKlAyX1RNR1RIUklTRSovCi0jZGVmaW5lIFIwOTAwX1AyX1RNR1RIUklTRSAgMHhmMjUzCi0jZGVmaW5lIEYwOTAwX1AyX1RNR0xPQ0tfVEhSSVNFICAweGYyNTMwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1RNR1RIUklTRSAweGYyNTMKKyNkZWZpbmUgRjA5MDBfUDJfVE1HTE9DS19USFJJU0UgMHhmMjUzMDBmZgogCiAvKlAyX1RNR1RIRkFMTCovCi0jZGVmaW5lIFIwOTAwX1AyX1RNR1RIRkFMTCAgMHhmMjU0Ci0jZGVmaW5lIEYwOTAwX1AyX1RNR0xPQ0tfVEhGQUxMICAweGYyNTQwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1RNR1RIRkFMTCAweGYyNTQKKyNkZWZpbmUgRjA5MDBfUDJfVE1HTE9DS19USEZBTEwgMHhmMjU0MDBmZgogCiAvKlAyX1NGUlVQUkFUSU8qLwotI2RlZmluZSBSMDkwMF9QMl9TRlJVUFJBVElPICAweGYyNTUKLSNkZWZpbmUgRjA5MDBfUDJfU0ZSX1VQUkFUSU8gIDB4ZjI1NTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfU0ZSVVBSQVRJTyAweGYyNTUKKyNkZWZpbmUgRjA5MDBfUDJfU0ZSX1VQUkFUSU8gMHhmMjU1MDBmZgogCiAvKlAyX1NGUkxPV1JBVElPKi8KLSNkZWZpbmUgUjA5MDBfUDJfU0ZSTE9XUkFUSU8gIDB4ZjI1NgotI2RlZmluZSBGMDkwMF9QMl9TRlJfTE9XUkFUSU8gIDB4ZjI1NjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfU0ZSTE9XUkFUSU8gMHhmMjU2CisjZGVmaW5lIEYwOTAwX1AyX1NGUl9MT1dSQVRJTyAweGYyNTYwMGZmCiAKIC8qUDJfS1JFRlRNRyovCi0jZGVmaW5lIFIwOTAwX1AyX0tSRUZUTUcgIDB4ZjI1OAotI2RlZmluZSBGMDkwMF9QMl9LUkVGX1RNRyAgMHhmMjU4MDBmZgorI2RlZmluZSBSMDkwMF9QMl9LUkVGVE1HIDB4ZjI1OAorI2RlZmluZSBGMDkwMF9QMl9LUkVGX1RNRyAweGYyNTgwMGZmCiAKIC8qUDJfU0ZSU1RFUCovCi0jZGVmaW5lIFIwOTAwX1AyX1NGUlNURVAgIDB4ZjI1OQotI2RlZmluZSBGMDkwMF9QMl9TRlJfU0NBTlNURVAgIDB4ZjI1OTAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfU0ZSX0NFTlRFUlNURVAgIDB4ZjI1OTAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfU0ZSU1RFUCAweGYyNTkKKyNkZWZpbmUgRjA5MDBfUDJfU0ZSX1NDQU5TVEVQIDB4ZjI1OTAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfU0ZSX0NFTlRFUlNURVAgMHhmMjU5MDAwZgogCiAvKlAyX1RNR0NGRzIqLwotI2RlZmluZSBSMDkwMF9QMl9UTUdDRkcyICAweGYyNWEKLSNkZWZpbmUgRjA5MDBfUDJfRElTX0FVVE9TQU1QICAweGYyNWEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX1NDQU5JTklUX1FVQVJUICAweGYyNWEwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX05PVE1HX0RWQlMxREVSQVQgIDB4ZjI1YTAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfU0ZSUkFUSU9fRklORSAgMHhmMjVhMDAwMQorI2RlZmluZSBSMDkwMF9QMl9UTUdDRkcyIDB4ZjI1YQorI2RlZmluZSBGMDkwMF9QMl9TRlJSQVRJT19GSU5FIDB4ZjI1YTAwMDEKKworLypQMl9LUkVGVE1HMiovCisjZGVmaW5lIFIwOTAwX1AyX0tSRUZUTUcyIDB4ZjI1YgorI2RlZmluZSBGMDkwMF9QMl9LUkVGX1RNRzIgMHhmMjViMDBmZgogCiAvKlAyX1NGUklOSVQxKi8KLSNkZWZpbmUgUjA5MDBfUDJfU0ZSSU5JVDEgIDB4ZjI1ZQotI2RlZmluZSBGMDkwMF9QMl9TRlJfSU5JVDEgIDB4ZjI1ZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfU0ZSSU5JVDEgMHhmMjVlCisjZGVmaW5lIEYwOTAwX1AyX1NGUl9JTklUMSAweGYyNWUwMDdmCiAKIC8qUDJfU0ZSSU5JVDAqLwotI2RlZmluZSBSMDkwMF9QMl9TRlJJTklUMCAgMHhmMjVmCi0jZGVmaW5lIEYwOTAwX1AyX1NGUl9JTklUMCAgMHhmMjVmMDBmZgorI2RlZmluZSBSMDkwMF9QMl9TRlJJTklUMCAweGYyNWYKKyNkZWZpbmUgRjA5MDBfUDJfU0ZSX0lOSVQwIDB4ZjI1ZjAwZmYKIAogLypQMl9TRlJVUDEqLwotI2RlZmluZSBSMDkwMF9QMl9TRlJVUDEgIDB4ZjI2MAotI2RlZmluZSBGMDkwMF9QMl9BVVRPX0dVUCAgMHhmMjYwMDA4MAotI2RlZmluZSBGMDkwMF9QMl9TWU1CX0ZSRVFfVVAxICAweGYyNjAwMDdmCisjZGVmaW5lIFIwOTAwX1AyX1NGUlVQMSAweGYyNjAKKyNkZWZpbmUgRjA5MDBfUDJfQVVUT19HVVAgMHhmMjYwMDA4MAorI2RlZmluZSBGMDkwMF9QMl9TWU1CX0ZSRVFfVVAxIDB4ZjI2MDAwN2YKIAogLypQMl9TRlJVUDAqLwotI2RlZmluZSBSMDkwMF9QMl9TRlJVUDAgIDB4ZjI2MQotI2RlZmluZSBGMDkwMF9QMl9TWU1CX0ZSRVFfVVAwICAweGYyNjEwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1NGUlVQMCAweGYyNjEKKyNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRX1VQMCAweGYyNjEwMGZmCiAKIC8qUDJfU0ZSTE9XMSovCi0jZGVmaW5lIFIwOTAwX1AyX1NGUkxPVzEgIDB4ZjI2MgotI2RlZmluZSBGMDkwMF9QMl9BVVRPX0dMT1cgIDB4ZjI2MjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRX0xPVzEgIDB4ZjI2MjAwN2YKKyNkZWZpbmUgUjA5MDBfUDJfU0ZSTE9XMSAweGYyNjIKKyNkZWZpbmUgRjA5MDBfUDJfQVVUT19HTE9XIDB4ZjI2MjAwODAKKyNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRX0xPVzEgMHhmMjYyMDA3ZgogCiAvKlAyX1NGUkxPVzAqLwotI2RlZmluZSBSMDkwMF9QMl9TRlJMT1cwICAweGYyNjMKLSNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRX0xPVzAgIDB4ZjI2MzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfU0ZSTE9XMCAweGYyNjMKKyNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRX0xPVzAgMHhmMjYzMDBmZgogCiAvKlAyX1NGUjMqLwotI2RlZmluZSBSMDkwMF9QMl9TRlIzICAweGYyNjQKLSNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRMyAgMHhmMjY0MDBmZgorI2RlZmluZSBSMDkwMF9QMl9TRlIzIDB4ZjI2NAorI2RlZmluZSBGMDkwMF9QMl9TWU1CX0ZSRVEzIDB4ZjI2NDAwZmYKIAogLypQMl9TRlIyKi8KLSNkZWZpbmUgUjA5MDBfUDJfU0ZSMiAgMHhmMjY1Ci0jZGVmaW5lIEYwOTAwX1AyX1NZTUJfRlJFUTIgIDB4ZjI2NTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfU0ZSMiAweGYyNjUKKyNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRMiAweGYyNjUwMGZmCiAKIC8qUDJfU0ZSMSovCi0jZGVmaW5lIFIwOTAwX1AyX1NGUjEgIDB4ZjI2NgotI2RlZmluZSBGMDkwMF9QMl9TWU1CX0ZSRVExICAweGYyNjYwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1NGUjEgMHhmMjY2CisjZGVmaW5lIEYwOTAwX1AyX1NZTUJfRlJFUTEgMHhmMjY2MDBmZgogCiAvKlAyX1NGUjAqLwotI2RlZmluZSBSMDkwMF9QMl9TRlIwICAweGYyNjcKLSNkZWZpbmUgRjA5MDBfUDJfU1lNQl9GUkVRMCAgMHhmMjY3MDBmZgorI2RlZmluZSBSMDkwMF9QMl9TRlIwIDB4ZjI2NworI2RlZmluZSBGMDkwMF9QMl9TWU1CX0ZSRVEwIDB4ZjI2NzAwZmYKIAogLypQMl9UTUdSRUcyKi8KLSNkZWZpbmUgUjA5MDBfUDJfVE1HUkVHMiAgMHhmMjY4Ci0jZGVmaW5lIEYwOTAwX1AyX1RNR1JFRzIgIDB4ZjI2ODAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfVE1HUkVHMiAweGYyNjgKKyNkZWZpbmUgRjA5MDBfUDJfVE1HUkVHMiAweGYyNjgwMGZmCiAKIC8qUDJfVE1HUkVHMSovCi0jZGVmaW5lIFIwOTAwX1AyX1RNR1JFRzEgIDB4ZjI2OQotI2RlZmluZSBGMDkwMF9QMl9UTUdSRUcxICAweGYyNjkwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1RNR1JFRzEgMHhmMjY5CisjZGVmaW5lIEYwOTAwX1AyX1RNR1JFRzEgMHhmMjY5MDBmZgogCiAvKlAyX1RNR1JFRzAqLwotI2RlZmluZSBSMDkwMF9QMl9UTUdSRUcwICAweGYyNmEKLSNkZWZpbmUgRjA5MDBfUDJfVE1HUkVHMCAgMHhmMjZhMDBmZgorI2RlZmluZSBSMDkwMF9QMl9UTUdSRUcwIDB4ZjI2YQorI2RlZmluZSBGMDkwMF9QMl9UTUdSRUcwIDB4ZjI2YTAwZmYKIAogLypQMl9UTUdMT0NLMSovCi0jZGVmaW5lIFIwOTAwX1AyX1RNR0xPQ0sxICAweGYyNmIKLSNkZWZpbmUgRjA5MDBfUDJfVE1HTE9DS19MRVZFTDEgIDB4ZjI2YjAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfVE1HTE9DSzEgMHhmMjZiCisjZGVmaW5lIEYwOTAwX1AyX1RNR0xPQ0tfTEVWRUwxIDB4ZjI2YjAxZmYKIAogLypQMl9UTUdMT0NLMCovCi0jZGVmaW5lIFIwOTAwX1AyX1RNR0xPQ0swICAweGYyNmMKLSNkZWZpbmUgRjA5MDBfUDJfVE1HTE9DS19MRVZFTDAgIDB4ZjI2YzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfVE1HTE9DSzAgMHhmMjZjCisjZGVmaW5lIEYwOTAwX1AyX1RNR0xPQ0tfTEVWRUwwIDB4ZjI2YzAwZmYKIAogLypQMl9UTUdPQlMqLwotI2RlZmluZSBSMDkwMF9QMl9UTUdPQlMgIDB4ZjI2ZAotI2RlZmluZSBGMDkwMF9QMl9ST0xMT0ZGX1NUQVRVUyAgMHhmMjZkMDBjMAotI2RlZmluZSBGMDkwMF9QMl9TQ0FOX1NJR04gIDB4ZjI2ZDAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfVE1HX1NDQU5OSU5HICAweGYyNmQwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX0NIQ0VOVEVSSU5HX01PREUgIDB4ZjI2ZDAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfVE1HX1NDQU5GQUlMICAweGYyNmQwMDAyCisjZGVmaW5lIFIwOTAwX1AyX1RNR09CUyAweGYyNmQKKyNkZWZpbmUgRjA5MDBfUDJfUk9MTE9GRl9TVEFUVVMgMHhmMjZkMDBjMAogCiAvKlAyX0VRVUFMQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfUDJfRVFVQUxDRkcgIDB4ZjI2ZgotI2RlZmluZSBGMDkwMF9QMl9OT1RNR19ORUdBTFdBSVQgIDB4ZjI2ZjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQUxfT04gIDB4ZjI2ZjAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfU0VMX0VRVUFMQ09SICAweGYyNmYwMDM4Ci0jZGVmaW5lIEYwOTAwX1AyX01VX0VRVUFMREZFICAweGYyNmYwMDA3CisjZGVmaW5lIFIwOTAwX1AyX0VRVUFMQ0ZHIDB4ZjI2ZgorI2RlZmluZSBGMDkwMF9QMl9FUVVBTF9PTiAweGYyNmYwMDQwCisjZGVmaW5lIEYwOTAwX1AyX01VX0VRVUFMREZFIDB4ZjI2ZjAwMDcKIAogLypQMl9FUVVBSTEqLwotI2RlZmluZSBSMDkwMF9QMl9FUVVBSTEgIDB4ZjI3MAotI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ0kxICAweGYyNzAwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0VRVUFJMSAweGYyNzAKKyNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NJMSAweGYyNzAwMWZmCiAKIC8qUDJfRVFVQVExKi8KLSNkZWZpbmUgUjA5MDBfUDJfRVFVQVExICAweGYyNzEKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NRMSAgMHhmMjcxMDFmZgorI2RlZmluZSBSMDkwMF9QMl9FUVVBUTEgMHhmMjcxCisjZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDUTEgMHhmMjcxMDFmZgogCiAvKlAyX0VRVUFJMiovCi0jZGVmaW5lIFIwOTAwX1AyX0VRVUFJMiAgMHhmMjcyCi0jZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDSTIgIDB4ZjI3MjAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRVFVQUkyIDB4ZjI3MgorI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ0kyIDB4ZjI3MjAxZmYKIAogLypQMl9FUVVBUTIqLwotI2RlZmluZSBSMDkwMF9QMl9FUVVBUTIgIDB4ZjI3MwotI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ1EyICAweGYyNzMwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0VRVUFRMiAweGYyNzMKKyNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NRMiAweGYyNzMwMWZmCiAKIC8qUDJfRVFVQUkzKi8KLSNkZWZpbmUgUjA5MDBfUDJfRVFVQUkzICAweGYyNzQKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NJMyAgMHhmMjc0MDFmZgorI2RlZmluZSBSMDkwMF9QMl9FUVVBSTMgMHhmMjc0CisjZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDSTMgMHhmMjc0MDFmZgogCiAvKlAyX0VRVUFRMyovCi0jZGVmaW5lIFIwOTAwX1AyX0VRVUFRMyAgMHhmMjc1Ci0jZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDUTMgIDB4ZjI3NTAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRVFVQVEzIDB4ZjI3NQorI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ1EzIDB4ZjI3NTAxZmYKIAogLypQMl9FUVVBSTQqLwotI2RlZmluZSBSMDkwMF9QMl9FUVVBSTQgIDB4ZjI3NgotI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ0k0ICAweGYyNzYwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0VRVUFJNCAweGYyNzYKKyNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NJNCAweGYyNzYwMWZmCiAKIC8qUDJfRVFVQVE0Ki8KLSNkZWZpbmUgUjA5MDBfUDJfRVFVQVE0ICAweGYyNzcKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NRNCAgMHhmMjc3MDFmZgorI2RlZmluZSBSMDkwMF9QMl9FUVVBUTQgMHhmMjc3CisjZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDUTQgMHhmMjc3MDFmZgogCiAvKlAyX0VRVUFJNSovCi0jZGVmaW5lIFIwOTAwX1AyX0VRVUFJNSAgMHhmMjc4Ci0jZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDSTUgIDB4ZjI3ODAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRVFVQUk1IDB4ZjI3OAorI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ0k1IDB4ZjI3ODAxZmYKIAogLypQMl9FUVVBUTUqLwotI2RlZmluZSBSMDkwMF9QMl9FUVVBUTUgIDB4ZjI3OQotI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ1E1ICAweGYyNzkwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0VRVUFRNSAweGYyNzkKKyNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NRNSAweGYyNzkwMWZmCiAKIC8qUDJfRVFVQUk2Ki8KLSNkZWZpbmUgUjA5MDBfUDJfRVFVQUk2ICAweGYyN2EKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NJNiAgMHhmMjdhMDFmZgorI2RlZmluZSBSMDkwMF9QMl9FUVVBSTYgMHhmMjdhCisjZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDSTYgMHhmMjdhMDFmZgogCiAvKlAyX0VRVUFRNiovCi0jZGVmaW5lIFIwOTAwX1AyX0VRVUFRNiAgMHhmMjdiCi0jZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDUTYgIDB4ZjI3YjAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRVFVQVE2IDB4ZjI3YgorI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ1E2IDB4ZjI3YjAxZmYKIAogLypQMl9FUVVBSTcqLwotI2RlZmluZSBSMDkwMF9QMl9FUVVBSTcgIDB4ZjI3YwotI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ0k3ICAweGYyN2MwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0VRVUFJNyAweGYyN2MKKyNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NJNyAweGYyN2MwMWZmCiAKIC8qUDJfRVFVQVE3Ki8KLSNkZWZpbmUgUjA5MDBfUDJfRVFVQVE3ICAweGYyN2QKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NRNyAgMHhmMjdkMDFmZgorI2RlZmluZSBSMDkwMF9QMl9FUVVBUTcgMHhmMjdkCisjZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDUTcgMHhmMjdkMDFmZgogCiAvKlAyX0VRVUFJOCovCi0jZGVmaW5lIFIwOTAwX1AyX0VRVUFJOCAgMHhmMjdlCi0jZGVmaW5lIEYwOTAwX1AyX0VRVUFfQUNDSTggIDB4ZjI3ZTAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRVFVQUk4IDB4ZjI3ZQorI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ0k4IDB4ZjI3ZTAxZmYKIAogLypQMl9FUVVBUTgqLwotI2RlZmluZSBSMDkwMF9QMl9FUVVBUTggIDB4ZjI3ZgotI2RlZmluZSBGMDkwMF9QMl9FUVVBX0FDQ1E4ICAweGYyN2YwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0VRVUFROCAweGYyN2YKKyNkZWZpbmUgRjA5MDBfUDJfRVFVQV9BQ0NROCAweGYyN2YwMWZmCiAKIC8qUDJfTk5PU0RBVEFUMSovCi0jZGVmaW5lIFIwOTAwX1AyX05OT1NEQVRBVDEgIDB4ZjI4MAotI2RlZmluZSBGMDkwMF9QMl9OT1NEQVRBVF9OT1JNRUQxICAweGYyODAwMGZmCisjZGVmaW5lIFIwOTAwX1AyX05OT1NEQVRBVDEgMHhmMjgwCisjZGVmaW5lIEYwOTAwX1AyX05PU0RBVEFUX05PUk1FRDEgMHhmMjgwMDBmZgogCiAvKlAyX05OT1NEQVRBVDAqLwotI2RlZmluZSBSMDkwMF9QMl9OTk9TREFUQVQwICAweGYyODEKLSNkZWZpbmUgRjA5MDBfUDJfTk9TREFUQVRfTk9STUVEMCAgMHhmMjgxMDBmZgorI2RlZmluZSBSMDkwMF9QMl9OTk9TREFUQVQwIDB4ZjI4MQorI2RlZmluZSBGMDkwMF9QMl9OT1NEQVRBVF9OT1JNRUQwIDB4ZjI4MTAwZmYKIAogLypQMl9OTk9TREFUQTEqLwotI2RlZmluZSBSMDkwMF9QMl9OTk9TREFUQTEgIDB4ZjI4MgotI2RlZmluZSBGMDkwMF9QMl9OT1NEQVRBX05PUk1FRDEgIDB4ZjI4MjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTk5PU0RBVEExIDB4ZjI4MgorI2RlZmluZSBGMDkwMF9QMl9OT1NEQVRBX05PUk1FRDEgMHhmMjgyMDBmZgogCiAvKlAyX05OT1NEQVRBMCovCi0jZGVmaW5lIFIwOTAwX1AyX05OT1NEQVRBMCAgMHhmMjgzCi0jZGVmaW5lIEYwOTAwX1AyX05PU0RBVEFfTk9STUVEMCAgMHhmMjgzMDBmZgorI2RlZmluZSBSMDkwMF9QMl9OTk9TREFUQTAgMHhmMjgzCisjZGVmaW5lIEYwOTAwX1AyX05PU0RBVEFfTk9STUVEMCAweGYyODMwMGZmCiAKIC8qUDJfTk5PU1BMSFQxKi8KLSNkZWZpbmUgUjA5MDBfUDJfTk5PU1BMSFQxICAweGYyODQKLSNkZWZpbmUgRjA5MDBfUDJfTk9TUExIVF9OT1JNRUQxICAweGYyODQwMGZmCisjZGVmaW5lIFIwOTAwX1AyX05OT1NQTEhUMSAweGYyODQKKyNkZWZpbmUgRjA5MDBfUDJfTk9TUExIVF9OT1JNRUQxIDB4ZjI4NDAwZmYKIAogLypQMl9OTk9TUExIVDAqLwotI2RlZmluZSBSMDkwMF9QMl9OTk9TUExIVDAgIDB4ZjI4NQotI2RlZmluZSBGMDkwMF9QMl9OT1NQTEhUX05PUk1FRDAgIDB4ZjI4NTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTk5PU1BMSFQwIDB4ZjI4NQorI2RlZmluZSBGMDkwMF9QMl9OT1NQTEhUX05PUk1FRDAgMHhmMjg1MDBmZgogCiAvKlAyX05OT1NQTEgxKi8KLSNkZWZpbmUgUjA5MDBfUDJfTk5PU1BMSDEgIDB4ZjI4NgotI2RlZmluZSBGMDkwMF9QMl9OT1NQTEhfTk9STUVEMSAgMHhmMjg2MDBmZgorI2RlZmluZSBSMDkwMF9QMl9OTk9TUExIMSAweGYyODYKKyNkZWZpbmUgRjA5MDBfUDJfTk9TUExIX05PUk1FRDEgMHhmMjg2MDBmZgogCiAvKlAyX05OT1NQTEgwKi8KLSNkZWZpbmUgUjA5MDBfUDJfTk5PU1BMSDAgIDB4ZjI4NwotI2RlZmluZSBGMDkwMF9QMl9OT1NQTEhfTk9STUVEMCAgMHhmMjg3MDBmZgorI2RlZmluZSBSMDkwMF9QMl9OTk9TUExIMCAweGYyODcKKyNkZWZpbmUgRjA5MDBfUDJfTk9TUExIX05PUk1FRDAgMHhmMjg3MDBmZgogCiAvKlAyX05PU0RBVEFUMSovCi0jZGVmaW5lIFIwOTAwX1AyX05PU0RBVEFUMSAgMHhmMjg4Ci0jZGVmaW5lIEYwOTAwX1AyX05PU0RBVEFUX1VOTk9STUVEMSAgMHhmMjg4MDBmZgorI2RlZmluZSBSMDkwMF9QMl9OT1NEQVRBVDEgMHhmMjg4CisjZGVmaW5lIEYwOTAwX1AyX05PU0RBVEFUX1VOTk9STUVEMSAweGYyODgwMGZmCiAKIC8qUDJfTk9TREFUQVQwKi8KLSNkZWZpbmUgUjA5MDBfUDJfTk9TREFUQVQwICAweGYyODkKLSNkZWZpbmUgRjA5MDBfUDJfTk9TREFUQVRfVU5OT1JNRUQwICAweGYyODkwMGZmCisjZGVmaW5lIFIwOTAwX1AyX05PU0RBVEFUMCAweGYyODkKKyNkZWZpbmUgRjA5MDBfUDJfTk9TREFUQVRfVU5OT1JNRUQwIDB4ZjI4OTAwZmYKIAogLypQMl9OT1NEQVRBMSovCi0jZGVmaW5lIFIwOTAwX1AyX05PU0RBVEExICAweGYyOGEKLSNkZWZpbmUgRjA5MDBfUDJfTk9TREFUQV9VTk5PUk1FRDEgIDB4ZjI4YTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTk9TREFUQTEgMHhmMjhhCisjZGVmaW5lIEYwOTAwX1AyX05PU0RBVEFfVU5OT1JNRUQxIDB4ZjI4YTAwZmYKIAogLypQMl9OT1NEQVRBMCovCi0jZGVmaW5lIFIwOTAwX1AyX05PU0RBVEEwICAweGYyOGIKLSNkZWZpbmUgRjA5MDBfUDJfTk9TREFUQV9VTk5PUk1FRDAgIDB4ZjI4YjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTk9TREFUQTAgMHhmMjhiCisjZGVmaW5lIEYwOTAwX1AyX05PU0RBVEFfVU5OT1JNRUQwIDB4ZjI4YjAwZmYKIAogLypQMl9OT1NQTEhUMSovCi0jZGVmaW5lIFIwOTAwX1AyX05PU1BMSFQxICAweGYyOGMKLSNkZWZpbmUgRjA5MDBfUDJfTk9TUExIVF9VTk5PUk1FRDEgIDB4ZjI4YzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTk9TUExIVDEgMHhmMjhjCisjZGVmaW5lIEYwOTAwX1AyX05PU1BMSFRfVU5OT1JNRUQxIDB4ZjI4YzAwZmYKIAogLypQMl9OT1NQTEhUMCovCi0jZGVmaW5lIFIwOTAwX1AyX05PU1BMSFQwICAweGYyOGQKLSNkZWZpbmUgRjA5MDBfUDJfTk9TUExIVF9VTk5PUk1FRDAgIDB4ZjI4ZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTk9TUExIVDAgMHhmMjhkCisjZGVmaW5lIEYwOTAwX1AyX05PU1BMSFRfVU5OT1JNRUQwIDB4ZjI4ZDAwZmYKIAogLypQMl9OT1NQTEgxKi8KLSNkZWZpbmUgUjA5MDBfUDJfTk9TUExIMSAgMHhmMjhlCi0jZGVmaW5lIEYwOTAwX1AyX05PU1BMSF9VTk5PUk1FRDEgIDB4ZjI4ZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTk9TUExIMSAweGYyOGUKKyNkZWZpbmUgRjA5MDBfUDJfTk9TUExIX1VOTk9STUVEMSAweGYyOGUwMGZmCiAKIC8qUDJfTk9TUExIMCovCi0jZGVmaW5lIFIwOTAwX1AyX05PU1BMSDAgIDB4ZjI4ZgotI2RlZmluZSBGMDkwMF9QMl9OT1NQTEhfVU5OT1JNRUQwICAweGYyOGYwMGZmCisjZGVmaW5lIFIwOTAwX1AyX05PU1BMSDAgMHhmMjhmCisjZGVmaW5lIEYwOTAwX1AyX05PU1BMSF9VTk5PUk1FRDAgMHhmMjhmMDBmZgogCiAvKlAyX0NBUjJDRkcqLwotI2RlZmluZSBSMDkwMF9QMl9DQVIyQ0ZHICAweGYyOTAKLSNkZWZpbmUgRjA5MDBfUDJfREVTQ1JBTUJfT0ZGICAweGYyOTAwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1BONF9TRUxFQ1QgIDB4ZjI5MDAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ0ZSMl9TVE9QRFZCUzEgIDB4ZjI5MDAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfU1RPUF9DRlIyVVBEQVRFICAweGYyOTAwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX1NUT1BfTkNPMlVQREFURSAgMHhmMjkwMDAwOAotI2RlZmluZSBGMDkwMF9QMl9ST1RBMk9OICAweGYyOTAwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX1BIX0RFVF9BTEdPMiAgMHhmMjkwMDAwMworI2RlZmluZSBSMDkwMF9QMl9DQVIyQ0ZHIDB4ZjI5MAorI2RlZmluZSBGMDkwMF9QMl9DQVJSSUVSM19ESVNBQkxFIDB4ZjI5MDAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfUk9UQTJPTiAweGYyOTAwMDA0CisjZGVmaW5lIEYwOTAwX1AyX1BIX0RFVF9BTEdPMiAweGYyOTAwMDAzCiAKLS8qUDJfQUNMQzIqLwotI2RlZmluZSBSMDkwMF9QMl9BQ0xDMiAgMHhmMjkxCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJfUFVOQ1RfQURFUkFUICAweGYyOTEwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJfQUxQSEFfTUFOVCAgMHhmMjkxMDAzMAotI2RlZmluZSBGMDkwMF9QMl9DQVIyX0FMUEhBX0VYUCAgMHhmMjkxMDAwZgotCi0vKlAyX0JDTEMyKi8KLSNkZWZpbmUgUjA5MDBfUDJfQkNMQzIgIDB4ZjI5MgotI2RlZmluZSBGMDkwMF9QMl9EVkJTMl9OSVAgIDB4ZjI5MjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMl9QVU5DVF9CREVSQVQgIDB4ZjI5MjAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMl9CRVRBX01BTlQgIDB4ZjI5MjAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMl9CRVRBX0VYUCAgMHhmMjkyMDAwZgorLypQMl9DRlIyQ0ZSMSovCisjZGVmaW5lIFIwOTAwX1AyX0NGUjJDRlIxIDB4ZjI5MQorI2RlZmluZSBGMDkwMF9QMl9DRlIyVE9DRlIxX0RWQlMxIDB4ZjI5MTAwYzAKKyNkZWZpbmUgRjA5MDBfUDJfRU5fUzJDQVIyQ0VOVEVSIDB4ZjI5MTAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfRElTX0JDSEVSUkNGUjIgMHhmMjkxMDAxMAorI2RlZmluZSBGMDkwMF9QMl9DRlIyVE9DRlIxX0JFVEEgMHhmMjkxMDAwNwogCiAvKlAyX0NGUjIyKi8KLSNkZWZpbmUgUjA5MDBfUDJfQ0ZSMjIgIDB4ZjI5MwotI2RlZmluZSBGMDkwMF9QMl9DQVIyX0ZSRVEyICAweGYyOTMwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0NGUjIyIDB4ZjI5MworI2RlZmluZSBGMDkwMF9QMl9DQVIyX0ZSRVEyIDB4ZjI5MzAxZmYKIAogLypQMl9DRlIyMSovCi0jZGVmaW5lIFIwOTAwX1AyX0NGUjIxICAweGYyOTQKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMl9GUkVRMSAgMHhmMjk0MDBmZgorI2RlZmluZSBSMDkwMF9QMl9DRlIyMSAweGYyOTQKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSMl9GUkVRMSAweGYyOTQwMGZmCiAKIC8qUDJfQ0ZSMjAqLwotI2RlZmluZSBSMDkwMF9QMl9DRlIyMCAgMHhmMjk1Ci0jZGVmaW5lIEYwOTAwX1AyX0NBUjJfRlJFUTAgIDB4ZjI5NTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfQ0ZSMjAgMHhmMjk1CisjZGVmaW5lIEYwOTAwX1AyX0NBUjJfRlJFUTAgMHhmMjk1MDBmZgogCiAvKlAyX0FDTEMyUzJRKi8KLSNkZWZpbmUgUjA5MDBfUDJfQUNMQzJTMlEgIDB4ZjI5NwotI2RlZmluZSBGMDkwMF9QMl9FTkFCX1NQU0tTWU1CICAweGYyOTcwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl9RQURFUkFUICAweGYyOTcwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl9RX0FMUEhfTSAgMHhmMjk3MDAzMAotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfUV9BTFBIX0UgIDB4ZjI5NzAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfQUNMQzJTMlEgMHhmMjk3CisjZGVmaW5lIEYwOTAwX1AyX0VOQUJfU1BTS1NZTUIgMHhmMjk3MDA4MAorI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfUV9BTFBIX00gMHhmMjk3MDAzMAorI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfUV9BTFBIX0UgMHhmMjk3MDAwZgogCiAvKlAyX0FDTEMyUzI4Ki8KLSNkZWZpbmUgUjA5MDBfUDJfQUNMQzJTMjggIDB4ZjI5OAotI2RlZmluZSBGMDkwMF9QMl9PTERJM1FfTU9ERSAgMHhmMjk4MDA4MAotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfOEFERVJBVCAgMHhmMjk4MDA0MAotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfOF9BTFBIX00gIDB4ZjI5ODAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzhfQUxQSF9FICAweGYyOTgwMDBmCisjZGVmaW5lIFIwOTAwX1AyX0FDTEMyUzI4IDB4ZjI5OAorI2RlZmluZSBGMDkwMF9QMl9PTERJM1FfTU9ERSAweGYyOTgwMDgwCisjZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl84X0FMUEhfTSAweGYyOTgwMDMwCisjZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl84X0FMUEhfRSAweGYyOTgwMDBmCiAKIC8qUDJfQUNMQzJTMjE2QSovCi0jZGVmaW5lIFIwOTAwX1AyX0FDTEMyUzIxNkEgIDB4ZjI5OQotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfMTZBREVSQVQgIDB4ZjI5OTAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzE2QV9BTFBIX00gIDB4ZjI5OTAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzE2QV9BTFBIX0UgIDB4ZjI5OTAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfQUNMQzJTMjE2QSAweGYyOTkKKyNkZWZpbmUgRjA5MDBfUDJfRElTX0MzU1RPUEEyIDB4ZjI5OTAwODAKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzE2QURFUkFUIDB4ZjI5OTAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzE2QV9BTFBIX00gMHhmMjk5MDAzMAorI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfMTZBX0FMUEhfRSAweGYyOTkwMDBmCiAKIC8qUDJfQUNMQzJTMjMyQSovCi0jZGVmaW5lIFIwOTAwX1AyX0FDTEMyUzIzMkEgIDB4ZjI5YQotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfMzJBREVSQVQgIDB4ZjI5YTAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzMyQV9BTFBIX00gIDB4ZjI5YTAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzMyQV9BTFBIX0UgIDB4ZjI5YTAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfQUNMQzJTMjMyQSAweGYyOWEKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzMyQURFUkFUIDB4ZjI5YTAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzMyQV9BTFBIX00gMHhmMjlhMDAzMAorI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfMzJBX0FMUEhfRSAweGYyOWEwMDBmCiAKIC8qUDJfQkNMQzJTMlEqLwotI2RlZmluZSBSMDkwMF9QMl9CQ0xDMlMyUSAgMHhmMjljCi0jZGVmaW5lIEYwOTAwX1AyX0RWQlMyUzJRX05JUCAgMHhmMjljMDA4MAotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfUUJERVJBVCAgMHhmMjljMDA0MAotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfUV9CRVRBX00gIDB4ZjI5YzAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyX1FfQkVUQV9FICAweGYyOWMwMDBmCisjZGVmaW5lIFIwOTAwX1AyX0JDTEMyUzJRIDB4ZjI5YworI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfUV9CRVRBX00gMHhmMjljMDAzMAorI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfUV9CRVRBX0UgMHhmMjljMDAwZgogCiAvKlAyX0JDTEMyUzI4Ki8KLSNkZWZpbmUgUjA5MDBfUDJfQkNMQzJTMjggIDB4ZjI5ZAotI2RlZmluZSBGMDkwMF9QMl9EVkJTMlMyOF9OSVAgIDB4ZjI5ZDAwODAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzhCREVSQVQgIDB4ZjI5ZDAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzhfQkVUQV9NICAweGYyOWQwMDMwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl84X0JFVEFfRSAgMHhmMjlkMDAwZgorI2RlZmluZSBSMDkwMF9QMl9CQ0xDMlMyOCAweGYyOWQKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzhfQkVUQV9NIDB4ZjI5ZDAwMzAKKyNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzhfQkVUQV9FIDB4ZjI5ZDAwMGYKIAogLypQMl9CQ0xDMlMyMTZBKi8KLSNkZWZpbmUgUjA5MDBfUDJfQkNMQzJTMjE2QSAgMHhmMjllCi0jZGVmaW5lIEYwOTAwX1AyX0RWQlMyUzIxNkFfTklQICAweGYyOWUwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl8xNkJERVJBVCAgMHhmMjllMDA0MAotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfMTZBX0JFVEFfTSAgMHhmMjllMDAzMAotI2RlZmluZSBGMDkwMF9QMl9DQVIyUzJfMTZBX0JFVEFfRSAgMHhmMjllMDAwZgorI2RlZmluZSBSMDkwMF9QMl9CQ0xDMlMyMTZBIDB4ZjI5ZQogCiAvKlAyX0JDTEMyUzIzMkEqLwotI2RlZmluZSBSMDkwMF9QMl9CQ0xDMlMyMzJBICAweGYyOWYKLSNkZWZpbmUgRjA5MDBfUDJfRFZCUzJTMjMyQV9OSVAgIDB4ZjI5ZjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfQ0FSMlMyXzMyQkRFUkFUICAweGYyOWYwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl8zMkFfQkVUQV9NICAweGYyOWYwMDMwCi0jZGVmaW5lIEYwOTAwX1AyX0NBUjJTMl8zMkFfQkVUQV9FICAweGYyOWYwMDBmCisjZGVmaW5lIFIwOTAwX1AyX0JDTEMyUzIzMkEgMHhmMjlmCiAKIC8qUDJfUExST09UMiovCi0jZGVmaW5lIFIwOTAwX1AyX1BMUk9PVDIgIDB4ZjJhYwotI2RlZmluZSBGMDkwMF9QMl9TSE9SVEZSX0RJU0FCTEUgIDB4ZjJhYzAwODAKLSNkZWZpbmUgRjA5MDBfUDJfTE9OR0ZSX0RJU0FCTEUgIDB4ZjJhYzAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfRFVNTVlQTF9ESVNBQkxFICAweGYyYWMwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX1NIT1JURlJfQVZPSUQgIDB4ZjJhYzAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfUExTQ1JBTUJfTU9ERSAgMHhmMmFjMDAwYwotI2RlZmluZSBGMDkwMF9QMl9QTFNDUkFNQl9ST09UMiAgMHhmMmFjMDAwMworI2RlZmluZSBSMDkwMF9QMl9QTFJPT1QyIDB4ZjJhYworI2RlZmluZSBGMDkwMF9QMl9QTFNDUkFNQl9NT0RFIDB4ZjJhYzAwMGMKKyNkZWZpbmUgRjA5MDBfUDJfUExTQ1JBTUJfUk9PVDIgMHhmMmFjMDAwMwogCiAvKlAyX1BMUk9PVDEqLwotI2RlZmluZSBSMDkwMF9QMl9QTFJPT1QxICAweGYyYWQKLSNkZWZpbmUgRjA5MDBfUDJfUExTQ1JBTUJfUk9PVDEgIDB4ZjJhZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfUExST09UMSAweGYyYWQKKyNkZWZpbmUgRjA5MDBfUDJfUExTQ1JBTUJfUk9PVDEgMHhmMmFkMDBmZgogCiAvKlAyX1BMUk9PVDAqLwotI2RlZmluZSBSMDkwMF9QMl9QTFJPT1QwICAweGYyYWUKLSNkZWZpbmUgRjA5MDBfUDJfUExTQ1JBTUJfUk9PVDAgIDB4ZjJhZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfUExST09UMCAweGYyYWUKKyNkZWZpbmUgRjA5MDBfUDJfUExTQ1JBTUJfUk9PVDAgMHhmMmFlMDBmZgogCiAvKlAyX01PRENPRExTVDAqLwotI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1QwICAweGYyYjAKLSNkZWZpbmUgRjA5MDBfUDJfRU5fVE9LRU4zMSAgMHhmMmIwMDA4MAotI2RlZmluZSBGMDkwMF9QMl9TWU5DVEFHX1NFTEVDVCAgMHhmMmIwMDA0MAotI2RlZmluZSBGMDkwMF9QMl9NT0RDT0RSUV9NT0RFICAweGYyYjAwMDMwCisjZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDAgMHhmMmIwCiAKIC8qUDJfTU9EQ09ETFNUMSovCi0jZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDEgIDB4ZjJiMQotI2RlZmluZSBGMDkwMF9QMl9ESVNfTU9EQ09EMjkgIDB4ZjJiMTAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfRElTXzMyUFNLXzlfMTAgIDB4ZjJiMTAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUMSAweGYyYjEKKyNkZWZpbmUgRjA5MDBfUDJfRElTX01PRENPRDI5IDB4ZjJiMTAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzMyUFNLXzlfMTAgMHhmMmIxMDAwZgogCiAvKlAyX01PRENPRExTVDIqLwotI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1QyICAweGYyYjIKLSNkZWZpbmUgRjA5MDBfUDJfRElTXzMyUFNLXzhfOSAgMHhmMmIyMDBmMAotI2RlZmluZSBGMDkwMF9QMl9ESVNfMzJQU0tfNV82ICAweGYyYjIwMDBmCisjZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDIgMHhmMmIyCisjZGVmaW5lIEYwOTAwX1AyX0RJU18zMlBTS184XzkgMHhmMmIyMDBmMAorI2RlZmluZSBGMDkwMF9QMl9ESVNfMzJQU0tfNV82IDB4ZjJiMjAwMGYKIAogLypQMl9NT0RDT0RMU1QzKi8KLSNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUMyAgMHhmMmIzCi0jZGVmaW5lIEYwOTAwX1AyX0RJU18zMlBTS180XzUgIDB4ZjJiMzAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfRElTXzMyUFNLXzNfNCAgMHhmMmIzMDAwZgorI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1QzIDB4ZjJiMworI2RlZmluZSBGMDkwMF9QMl9ESVNfMzJQU0tfNF81IDB4ZjJiMzAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzMyUFNLXzNfNCAweGYyYjMwMDBmCiAKIC8qUDJfTU9EQ09ETFNUNCovCi0jZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDQgIDB4ZjJiNAotI2RlZmluZSBGMDkwMF9QMl9ESVNfMTZQU0tfOV8xMCAgMHhmMmI0MDBmMAotI2RlZmluZSBGMDkwMF9QMl9ESVNfMTZQU0tfOF85ICAweGYyYjQwMDBmCisjZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDQgMHhmMmI0CisjZGVmaW5lIEYwOTAwX1AyX0RJU18xNlBTS185XzEwIDB4ZjJiNDAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzE2UFNLXzhfOSAweGYyYjQwMDBmCiAKIC8qUDJfTU9EQ09ETFNUNSovCi0jZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDUgIDB4ZjJiNQotI2RlZmluZSBGMDkwMF9QMl9ESVNfMTZQU0tfNV82ICAweGYyYjUwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX0RJU18xNlBTS180XzUgIDB4ZjJiNTAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUNSAweGYyYjUKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzE2UFNLXzVfNiAweGYyYjUwMGYwCisjZGVmaW5lIEYwOTAwX1AyX0RJU18xNlBTS180XzUgMHhmMmI1MDAwZgogCiAvKlAyX01PRENPRExTVDYqLwotI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1Q2ICAweGYyYjYKLSNkZWZpbmUgRjA5MDBfUDJfRElTXzE2UFNLXzNfNCAgMHhmMmI2MDBmMAotI2RlZmluZSBGMDkwMF9QMl9ESVNfMTZQU0tfMl8zICAweGYyYjYwMDBmCisjZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDYgMHhmMmI2CisjZGVmaW5lIEYwOTAwX1AyX0RJU18xNlBTS18zXzQgMHhmMmI2MDBmMAorI2RlZmluZSBGMDkwMF9QMl9ESVNfMTZQU0tfMl8zIDB4ZjJiNjAwMGYKIAogLypQMl9NT0RDT0RMU1Q3Ki8KLSNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUNyAgMHhmMmI3Ci0jZGVmaW5lIEYwOTAwX1AyX0RJU184UF85XzEwICAweGYyYjcwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX0RJU184UF84XzkgIDB4ZjJiNzAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUNyAweGYyYjcKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzhQXzlfMTAgMHhmMmI3MDBmMAorI2RlZmluZSBGMDkwMF9QMl9ESVNfOFBfOF85IDB4ZjJiNzAwMGYKIAogLypQMl9NT0RDT0RMU1Q4Ki8KLSNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUOCAgMHhmMmI4Ci0jZGVmaW5lIEYwOTAwX1AyX0RJU184UF81XzYgIDB4ZjJiODAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfRElTXzhQXzNfNCAgMHhmMmI4MDAwZgorI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1Q4IDB4ZjJiOAorI2RlZmluZSBGMDkwMF9QMl9ESVNfOFBfNV82IDB4ZjJiODAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzhQXzNfNCAweGYyYjgwMDBmCiAKIC8qUDJfTU9EQ09ETFNUOSovCi0jZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVDkgIDB4ZjJiOQotI2RlZmluZSBGMDkwMF9QMl9ESVNfOFBfMl8zICAweGYyYjkwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX0RJU184UF8zXzUgIDB4ZjJiOTAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUOSAweGYyYjkKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzhQXzJfMyAweGYyYjkwMGYwCisjZGVmaW5lIEYwOTAwX1AyX0RJU184UF8zXzUgMHhmMmI5MDAwZgogCiAvKlAyX01PRENPRExTVEEqLwotI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1RBICAweGYyYmEKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1FQXzlfMTAgIDB4ZjJiYTAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1FQXzhfOSAgMHhmMmJhMDAwZgorI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1RBIDB4ZjJiYQorI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfOV8xMCAweGYyYmEwMGYwCisjZGVmaW5lIEYwOTAwX1AyX0RJU19RUF84XzkgMHhmMmJhMDAwZgogCiAvKlAyX01PRENPRExTVEIqLwotI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1RCICAweGYyYmIKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1FQXzVfNiAgMHhmMmJiMDBmMAotI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfNF81ICAweGYyYmIwMDBmCisjZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVEIgMHhmMmJiCisjZGVmaW5lIEYwOTAwX1AyX0RJU19RUF81XzYgMHhmMmJiMDBmMAorI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfNF81IDB4ZjJiYjAwMGYKIAogLypQMl9NT0RDT0RMU1RDKi8KLSNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNUQyAgMHhmMmJjCi0jZGVmaW5lIEYwOTAwX1AyX0RJU19RUF8zXzQgIDB4ZjJiYzAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1FQXzJfMyAgMHhmMmJjMDAwZgorI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1RDIDB4ZjJiYworI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfM180IDB4ZjJiYzAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfRElTX1FQXzJfMyAweGYyYmMwMDBmCiAKIC8qUDJfTU9EQ09ETFNURCovCi0jZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVEQgIDB4ZjJiZAotI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfM181ICAweGYyYmQwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX0RJU19RUF8xXzIgIDB4ZjJiZDAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNURCAweGYyYmQKKyNkZWZpbmUgRjA5MDBfUDJfRElTX1FQXzNfNSAweGYyYmQwMGYwCisjZGVmaW5lIEYwOTAwX1AyX0RJU19RUF8xXzIgMHhmMmJkMDAwZgogCiAvKlAyX01PRENPRExTVEUqLwotI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1RFICAweGYyYmUKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1FQXzJfNSAgMHhmMmJlMDBmMAotI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfMV8zICAweGYyYmUwMDBmCisjZGVmaW5lIFIwOTAwX1AyX01PRENPRExTVEUgMHhmMmJlCisjZGVmaW5lIEYwOTAwX1AyX0RJU19RUF8yXzUgMHhmMmJlMDBmMAorI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfMV8zIDB4ZjJiZTAwMGYKIAogLypQMl9NT0RDT0RMU1RGKi8KLSNkZWZpbmUgUjA5MDBfUDJfTU9EQ09ETFNURiAgMHhmMmJmCi0jZGVmaW5lIEYwOTAwX1AyX0RJU19RUF8xXzQgIDB4ZjJiZjAwZjAKLSNkZWZpbmUgRjA5MDBfUDJfRERFTU9EX1NFVCAgMHhmMmJmMDAwMgotI2RlZmluZSBGMDkwMF9QMl9EREVNT0RfTUFTSyAgMHhmMmJmMDAwMQorI2RlZmluZSBSMDkwMF9QMl9NT0RDT0RMU1RGIDB4ZjJiZgorI2RlZmluZSBGMDkwMF9QMl9ESVNfUVBfMV80IDB4ZjJiZjAwZjAKKworLypQMl9HQVVTU1IwKi8KKyNkZWZpbmUgUjA5MDBfUDJfR0FVU1NSMCAweGYyYzAKKyNkZWZpbmUgRjA5MDBfUDJfRU5fQ0NJTU9ERSAweGYyYzAwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1IwX0dBVVNTSUVOIDB4ZjJjMDAwN2YKKworLypQMl9DQ0lSMCovCisjZGVmaW5lIFIwOTAwX1AyX0NDSVIwIDB4ZjJjMQorI2RlZmluZSBGMDkwMF9QMl9DQ0lERVRFQ1RfUExIT05MWSAweGYyYzEwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1IwX0NDSSAweGYyYzEwMDdmCisKKy8qUDJfQ0NJUVVBTlQqLworI2RlZmluZSBSMDkwMF9QMl9DQ0lRVUFOVCAweGYyYzIKKyNkZWZpbmUgRjA5MDBfUDJfQ0NJX0JFVEEgMHhmMmMyMDBlMAorI2RlZmluZSBGMDkwMF9QMl9DQ0lfUVVBTlQgMHhmMmMyMDAxZgorCisvKlAyX0NDSVRIUkVTKi8KKyNkZWZpbmUgUjA5MDBfUDJfQ0NJVEhSRVMgMHhmMmMzCisjZGVmaW5lIEYwOTAwX1AyX0NDSV9USFJFU0hPTEQgMHhmMmMzMDBmZgorCisvKlAyX0NDSUFDQyovCisjZGVmaW5lIFIwOTAwX1AyX0NDSUFDQyAweGYyYzQKKyNkZWZpbmUgRjA5MDBfUDJfQ0NJX1ZBTFVFIDB4ZjJjNDAwZmYKIAogLypQMl9ETURSRVNDRkcqLwotI2RlZmluZSBSMDkwMF9QMl9ETURSRVNDRkcgIDB4ZjJjNgotI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfUkVTRVQgIDB4ZjJjNjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX05PSVNFU1FSICAweGYyYzYwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19TVFJBTEwgIDB4ZjJjNjAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX05FV09OTFkgIDB4ZjJjNjAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX05PU1RPUkUgIDB4ZjJjNjAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX0FHQzJNRU0gIDB4ZjJjNjAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTQ0ZHIDB4ZjJjNgorI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfUkVTRVQgMHhmMmM2MDA4MAorI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfU1RSQUxMIDB4ZjJjNjAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX05FV09OTFkgMHhmMmM2MDAwNAorI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfTk9TVE9SRSAweGYyYzYwMDAyCiAKIC8qUDJfRE1EUkVTQURSKi8KLSNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTQURSICAweGYyYzcKLSNkZWZpbmUgRjA5MDBfUDJfU1VTUF9QUkVEQ0FOQUwgIDB4ZjJjNzAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX1ZBTElEQ0ZSICAweGYyYzcwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19NRU1GVUxMICAweGYyYzcwMDMwCi0jZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19SRVNOQlIgIDB4ZjJjNzAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTQURSIDB4ZjJjNworI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfVkFMSURDRlIgMHhmMmM3MDA0MAorI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfTUVNRlVMTCAweGYyYzcwMDMwCisjZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19SRVNOQlIgMHhmMmM3MDAwZgogCiAvKlAyX0RNRFJFU0RBVEE3Ki8KLSNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTREFUQTcgIDB4ZjJjOAotI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfREFUQTcgIDB4ZjJjODAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTREFUQTcgMHhmMmM4CisjZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19EQVRBNyAweGYyYzgwMGZmCiAKIC8qUDJfRE1EUkVTREFUQTYqLwotI2RlZmluZSBSMDkwMF9QMl9ETURSRVNEQVRBNiAgMHhmMmM5Ci0jZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19EQVRBNiAgMHhmMmM5MDBmZgorI2RlZmluZSBSMDkwMF9QMl9ETURSRVNEQVRBNiAweGYyYzkKKyNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX0RBVEE2IDB4ZjJjOTAwZmYKIAogLypQMl9ETURSRVNEQVRBNSovCi0jZGVmaW5lIFIwOTAwX1AyX0RNRFJFU0RBVEE1ICAweGYyY2EKLSNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX0RBVEE1ICAweGYyY2EwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0RNRFJFU0RBVEE1IDB4ZjJjYQorI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfREFUQTUgMHhmMmNhMDBmZgogCiAvKlAyX0RNRFJFU0RBVEE0Ki8KLSNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTREFUQTQgIDB4ZjJjYgotI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfREFUQTQgIDB4ZjJjYjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTREFUQTQgMHhmMmNiCisjZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19EQVRBNCAweGYyY2IwMGZmCiAKIC8qUDJfRE1EUkVTREFUQTMqLwotI2RlZmluZSBSMDkwMF9QMl9ETURSRVNEQVRBMyAgMHhmMmNjCi0jZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19EQVRBMyAgMHhmMmNjMDBmZgorI2RlZmluZSBSMDkwMF9QMl9ETURSRVNEQVRBMyAweGYyY2MKKyNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX0RBVEEzIDB4ZjJjYzAwZmYKIAogLypQMl9ETURSRVNEQVRBMiovCi0jZGVmaW5lIFIwOTAwX1AyX0RNRFJFU0RBVEEyICAweGYyY2QKLSNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX0RBVEEyICAweGYyY2QwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0RNRFJFU0RBVEEyIDB4ZjJjZAorI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfREFUQTIgMHhmMmNkMDBmZgogCiAvKlAyX0RNRFJFU0RBVEExKi8KLSNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTREFUQTEgIDB4ZjJjZQotI2RlZmluZSBGMDkwMF9QMl9ETURSRVNfREFUQTEgIDB4ZjJjZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRE1EUkVTREFUQTEgMHhmMmNlCisjZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19EQVRBMSAweGYyY2UwMGZmCiAKIC8qUDJfRE1EUkVTREFUQTAqLwotI2RlZmluZSBSMDkwMF9QMl9ETURSRVNEQVRBMCAgMHhmMmNmCi0jZGVmaW5lIEYwOTAwX1AyX0RNRFJFU19EQVRBMCAgMHhmMmNmMDBmZgorI2RlZmluZSBSMDkwMF9QMl9ETURSRVNEQVRBMCAweGYyY2YKKyNkZWZpbmUgRjA5MDBfUDJfRE1EUkVTX0RBVEEwIDB4ZjJjZjAwZmYKIAogLypQMl9GRkVJMSovCi0jZGVmaW5lIFIwOTAwX1AyX0ZGRUkxICAweGYyZDAKLSNkZWZpbmUgRjA5MDBfUDJfRkZFX0FDQ0kxICAweGYyZDAwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0ZGRUkxIDB4ZjJkMAorI2RlZmluZSBGMDkwMF9QMl9GRkVfQUNDSTEgMHhmMmQwMDFmZgogCiAvKlAyX0ZGRVExKi8KLSNkZWZpbmUgUjA5MDBfUDJfRkZFUTEgIDB4ZjJkMQotI2RlZmluZSBGMDkwMF9QMl9GRkVfQUNDUTEgIDB4ZjJkMTAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkZFUTEgMHhmMmQxCisjZGVmaW5lIEYwOTAwX1AyX0ZGRV9BQ0NRMSAweGYyZDEwMWZmCiAKIC8qUDJfRkZFSTIqLwotI2RlZmluZSBSMDkwMF9QMl9GRkVJMiAgMHhmMmQyCi0jZGVmaW5lIEYwOTAwX1AyX0ZGRV9BQ0NJMiAgMHhmMmQyMDFmZgorI2RlZmluZSBSMDkwMF9QMl9GRkVJMiAweGYyZDIKKyNkZWZpbmUgRjA5MDBfUDJfRkZFX0FDQ0kyIDB4ZjJkMjAxZmYKIAogLypQMl9GRkVRMiovCi0jZGVmaW5lIFIwOTAwX1AyX0ZGRVEyICAweGYyZDMKLSNkZWZpbmUgRjA5MDBfUDJfRkZFX0FDQ1EyICAweGYyZDMwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0ZGRVEyIDB4ZjJkMworI2RlZmluZSBGMDkwMF9QMl9GRkVfQUNDUTIgMHhmMmQzMDFmZgogCiAvKlAyX0ZGRUkzKi8KLSNkZWZpbmUgUjA5MDBfUDJfRkZFSTMgIDB4ZjJkNAotI2RlZmluZSBGMDkwMF9QMl9GRkVfQUNDSTMgIDB4ZjJkNDAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkZFSTMgMHhmMmQ0CisjZGVmaW5lIEYwOTAwX1AyX0ZGRV9BQ0NJMyAweGYyZDQwMWZmCiAKIC8qUDJfRkZFUTMqLwotI2RlZmluZSBSMDkwMF9QMl9GRkVRMyAgMHhmMmQ1Ci0jZGVmaW5lIEYwOTAwX1AyX0ZGRV9BQ0NRMyAgMHhmMmQ1MDFmZgorI2RlZmluZSBSMDkwMF9QMl9GRkVRMyAweGYyZDUKKyNkZWZpbmUgRjA5MDBfUDJfRkZFX0FDQ1EzIDB4ZjJkNTAxZmYKIAogLypQMl9GRkVJNCovCi0jZGVmaW5lIFIwOTAwX1AyX0ZGRUk0ICAweGYyZDYKLSNkZWZpbmUgRjA5MDBfUDJfRkZFX0FDQ0k0ICAweGYyZDYwMWZmCisjZGVmaW5lIFIwOTAwX1AyX0ZGRUk0IDB4ZjJkNgorI2RlZmluZSBGMDkwMF9QMl9GRkVfQUNDSTQgMHhmMmQ2MDFmZgogCiAvKlAyX0ZGRVE0Ki8KLSNkZWZpbmUgUjA5MDBfUDJfRkZFUTQgIDB4ZjJkNwotI2RlZmluZSBGMDkwMF9QMl9GRkVfQUNDUTQgIDB4ZjJkNzAxZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkZFUTQgMHhmMmQ3CisjZGVmaW5lIEYwOTAwX1AyX0ZGRV9BQ0NRNCAweGYyZDcwMWZmCiAKIC8qUDJfRkZFQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfUDJfRkZFQ0ZHICAweGYyZDgKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQUxGRkVfT04gIDB4ZjJkODAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfRVFVQUxfVVNFRFNZTUIgIDB4ZjJkODAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfTVVfRVFVQUxGRkUgIDB4ZjJkODAwMDcKKyNkZWZpbmUgUjA5MDBfUDJfRkZFQ0ZHIDB4ZjJkOAorI2RlZmluZSBGMDkwMF9QMl9FUVVBTEZGRV9PTiAweGYyZDgwMDQwCisjZGVmaW5lIEYwOTAwX1AyX01VX0VRVUFMRkZFIDB4ZjJkODAwMDcKIAogLypQMl9UTlJDRkcqLwotI2RlZmluZSBSMDkwMF9QMl9UTlJDRkcgIDB4ZjJlMAotI2RlZmluZSBGMDkwMF9QMl9UVU5fQUNLRkFJTCAgMHhmMmUwMDA4MAotI2RlZmluZSBGMDkwMF9QMl9UVU5fVFlQRSAgMHhmMmUwMDA3MAotI2RlZmluZSBGMDkwMF9QMl9UVU5fU0VDU1RPUCAgMHhmMmUwMDAwOAotI2RlZmluZSBGMDkwMF9QMl9UVU5fVkNPU1JDSCAgMHhmMmUwMDAwNAotI2RlZmluZSBGMDkwMF9QMl9UVU5fTUFERFJFU1MgIDB4ZjJlMDAwMDMKKyNkZWZpbmUgUjA5MDBfUDJfVE5SQ0ZHIDB4ZjJlMAorI2RlZmluZSBGMDkwMF9QMl9UVU5fQUNLRkFJTCAweGYyZTAwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9UWVBFIDB4ZjJlMDAwNzAKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX1NFQ1NUT1AgMHhmMmUwMDAwOAorI2RlZmluZSBGMDkwMF9QMl9UVU5fVkNPU1JDSCAweGYyZTAwMDA0CisjZGVmaW5lIEYwOTAwX1AyX1RVTl9NQUREUkVTUyAweGYyZTAwMDAzCiAKIC8qUDJfVE5SQ0ZHMiovCi0jZGVmaW5lIFIwOTAwX1AyX1ROUkNGRzIgIDB4ZjJlMQotI2RlZmluZSBGMDkwMF9QMl9UVU5fSVFTV0FQICAweGYyZTEwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1NUQjYxMTBfU1RFUDJNSFogIDB4ZjJlMTAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfU1RCNjEyMF9EQkxJMkMgIDB4ZjJlMTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfRElTX0ZDQ0sgIDB4ZjJlMTAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfRElTX0xQRU4gIDB4ZjJlMTAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfRElTX0JXQ0FMQyAgMHhmMmUxMDAwNAotI2RlZmluZSBGMDkwMF9QMl9TSE9SVF9XQUlUU1RBVEVTICAweGYyZTEwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX0RJU18yQldBR0MxICAweGYyZTEwMDAxCisjZGVmaW5lIFIwOTAwX1AyX1ROUkNGRzIgMHhmMmUxCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9JUVNXQVAgMHhmMmUxMDA4MAorI2RlZmluZSBGMDkwMF9QMl9ESVNfQldDQUxDIDB4ZjJlMTAwMDQKKyNkZWZpbmUgRjA5MDBfUDJfU0hPUlRfV0FJVFNUQVRFUyAweGYyZTEwMDAyCiAKIC8qUDJfVE5SWFRBTCovCi0jZGVmaW5lIFIwOTAwX1AyX1ROUlhUQUwgIDB4ZjJlNAotI2RlZmluZSBGMDkwMF9QMl9UVU5fTUNMS0RFQ0lNQUwgIDB4ZjJlNDAwZTAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX1hUQUxGUkVRICAweGYyZTQwMDFmCisjZGVmaW5lIFIwOTAwX1AyX1ROUlhUQUwgMHhmMmU0CisjZGVmaW5lIEYwOTAwX1AyX1RVTl9YVEFMRlJFUSAweGYyZTQwMDFmCiAKIC8qUDJfVE5SU1RFUFMqLwotI2RlZmluZSBSMDkwMF9QMl9UTlJTVEVQUyAgMHhmMmU3Ci0jZGVmaW5lIEYwOTAwX1AyX1RVTkVSX0JXMVA2ICAweGYyZTcwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0JXSU5DX09GRlNFVCAgMHhmMmU3MDA3MAotI2RlZmluZSBGMDkwMF9QMl9TT0ZUU1RFUF9STkcgIDB4ZjJlNzAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0JXT0ZGU0VUICAweGYyZTcwMTA3CisjZGVmaW5lIFIwOTAwX1AyX1ROUlNURVBTIDB4ZjJlNworI2RlZmluZSBGMDkwMF9QMl9UVU5FUl9CVzBQMTI1IDB4ZjJlNzAwODAKKyNkZWZpbmUgRjA5MDBfUDJfQldJTkNfT0ZGU0VUIDB4ZjJlNzAxNzAKKyNkZWZpbmUgRjA5MDBfUDJfU09GVFNURVBfUk5HIDB4ZjJlNzAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX0JXT0ZGU0VUIDB4ZjJlNzAwMDcKIAogLypQMl9UTlJHQUlOKi8KLSNkZWZpbmUgUjA5MDBfUDJfVE5SR0FJTiAgMHhmMmU4Ci0jZGVmaW5lIEYwOTAwX1AyX1RVTl9LRElWRU4gIDB4ZjJlODAwYzAKLSNkZWZpbmUgRjA5MDBfUDJfU1RCNlgwMF9PQ0sgIDB4ZjJlODAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0dBSU4gIDB4ZjJlODAwMGYKKyNkZWZpbmUgUjA5MDBfUDJfVE5SR0FJTiAweGYyZTgKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX0tESVZFTiAweGYyZTgwMGMwCisjZGVmaW5lIEYwOTAwX1AyX1NUQjZYMDBfT0NLIDB4ZjJlODAwMzAKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX0dBSU4gMHhmMmU4MDAwZgogCiAvKlAyX1ROUlJGMSovCi0jZGVmaW5lIFIwOTAwX1AyX1ROUlJGMSAgMHhmMmU5Ci0jZGVmaW5lIEYwOTAwX1AyX1RVTl9SRkZSRVEyICAweGYyZTkwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ROUlJGMSAweGYyZTkKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX1JGRlJFUTIgMHhmMmU5MDBmZgogCiAvKlAyX1ROUlJGMCovCi0jZGVmaW5lIFIwOTAwX1AyX1ROUlJGMCAgMHhmMmVhCi0jZGVmaW5lIEYwOTAwX1AyX1RVTl9SRkZSRVExICAweGYyZWEwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ROUlJGMCAweGYyZWEKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX1JGRlJFUTEgMHhmMmVhMDBmZgogCiAvKlAyX1ROUkJXKi8KLSNkZWZpbmUgUjA5MDBfUDJfVE5SQlcgIDB4ZjJlYgotI2RlZmluZSBGMDkwMF9QMl9UVU5fUkZGUkVRMCAgMHhmMmViMDBjMAotI2RlZmluZSBGMDkwMF9QMl9UVU5fQlcgIDB4ZjJlYjAwM2YKKyNkZWZpbmUgUjA5MDBfUDJfVE5SQlcgMHhmMmViCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9SRkZSRVEwIDB4ZjJlYjAwYzAKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX0JXIDB4ZjJlYjAwM2YKIAogLypQMl9UTlJBREoqLwotI2RlZmluZSBSMDkwMF9QMl9UTlJBREogIDB4ZjJlYwotI2RlZmluZSBGMDkwMF9QMl9TVEI2MVgwX1JDTEsgIDB4ZjJlYzAwODAKLSNkZWZpbmUgRjA5MDBfUDJfU1RCNjFYMF9DQUxUSU1FICAweGYyZWMwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX1NUQjZYMDBfRExCICAweGYyZWMwMDM4Ci0jZGVmaW5lIEYwOTAwX1AyX1NUQjYwMDBfRkNMICAweGYyZWMwMDA3CisjZGVmaW5lIFIwOTAwX1AyX1ROUkFESiAweGYyZWMKKyNkZWZpbmUgRjA5MDBfUDJfU1RCNjFYMF9DQUxUSU1FIDB4ZjJlYzAwNDAKIAogLypQMl9UTlJDVEwyKi8KLSNkZWZpbmUgUjA5MDBfUDJfVE5SQ1RMMiAgMHhmMmVkCi0jZGVmaW5lIEYwOTAwX1AyX1NUQjYxWDBfTENQMV9SQ0NLT0ZGICAweGYyZWQwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1NUQjYxWDBfTENQMCAgMHhmMmVkMDA0MAotI2RlZmluZSBGMDkwMF9QMl9TVEI2MVgwX1hUT1VUX1JGT1VUUyAgMHhmMmVkMDAyMAotI2RlZmluZSBGMDkwMF9QMl9TVEI2MVgwX1hUT05fTUNLRFYgIDB4ZjJlZDAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfU1RCNjFYMF9DQUxPRkZfRENPRkYgIDB4ZjJlZDAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfU1RCNjExMF9MUFQgIDB4ZjJlZDAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfU1RCNjExMF9SWCAgMHhmMmVkMDAwMgotI2RlZmluZSBGMDkwMF9QMl9TVEI2MTEwX1NZTiAgMHhmMmVkMDAwMQorI2RlZmluZSBSMDkwMF9QMl9UTlJDVEwyIDB4ZjJlZAorI2RlZmluZSBGMDkwMF9QMl9TVEI2MVgwX1JDQ0tPRkYgMHhmMmVkMDA4MAorI2RlZmluZSBGMDkwMF9QMl9TVEI2MVgwX0lDUF9TRE9GRiAweGYyZWQwMDQwCisjZGVmaW5lIEYwOTAwX1AyX1NUQjYxWDBfRENMT09QT0ZGIDB4ZjJlZDAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfU1RCNjFYMF9SRUZPVVRTRUwgMHhmMmVkMDAxMAorI2RlZmluZSBGMDkwMF9QMl9TVEI2MVgwX0NBTE9GRiAweGYyZWQwMDA4CisjZGVmaW5lIEYwOTAwX1AyX1NUQjZYWDBfTFBUX0JFTiAweGYyZWQwMDA0CisjZGVmaW5lIEYwOTAwX1AyX1NUQjZYWDBfUlhfT1NDUCAweGYyZWQwMDAyCisjZGVmaW5lIEYwOTAwX1AyX1NUQjZYWDBfU1lOIDB4ZjJlZDAwMDEKIAogLypQMl9UTlJDRkczKi8KLSNkZWZpbmUgUjA5MDBfUDJfVE5SQ0ZHMyAgMHhmMmVlCi0jZGVmaW5lIEYwOTAwX1AyX1NUQjYxMjBfRElTQ1RSTDEgIDB4ZjJlZTAwODAKLSNkZWZpbmUgRjA5MDBfUDJfU1RCNjEyMF9JTlZPUkRFUiAgMHhmMmVlMDA0MAotI2RlZmluZSBGMDkwMF9QMl9TVEI2MTIwX0VOQ1RSTDYgIDB4ZjJlZTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX1BMTEZSRVEgIDB4ZjJlZTAwMWMKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0kyQ0ZSRVFfTU9ERSAgMHhmMmVlMDAwMworI2RlZmluZSBSMDkwMF9QMl9UTlJDRkczIDB4ZjJlZQorI2RlZmluZSBGMDkwMF9QMl9UVU5fUExMRlJFUSAweGYyZWUwMDFjCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9JMkNGUkVRX01PREUgMHhmMmVlMDAwMwogCiAvKlAyX1ROUkxBVU5DSCovCi0jZGVmaW5lIFIwOTAwX1AyX1ROUkxBVU5DSCAgMHhmMmYwCisjZGVmaW5lIFIwOTAwX1AyX1ROUkxBVU5DSCAweGYyZjAKIAogLypQMl9UTlJMRCovCi0jZGVmaW5lIFIwOTAwX1AyX1ROUkxEICAweGYyZjAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOTERfVkNPSU5HICAweGYyZjAwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1RVTl9SRUcxRkFJTCAgMHhmMmYwMDA0MAotI2RlZmluZSBGMDkwMF9QMl9UVU5fUkVHMkZBSUwgIDB4ZjJmMDAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX1JFRzNGQUlMICAweGYyZjAwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX1RVTl9SRUc0RkFJTCAgMHhmMmYwMDAwOAotI2RlZmluZSBGMDkwMF9QMl9UVU5fUkVHNUZBSUwgIDB4ZjJmMDAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0JXSU5HICAweGYyZjAwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX1RVTl9MT0NLRUQgIDB4ZjJmMDAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfVE5STEQgMHhmMmYwCisjZGVmaW5lIEYwOTAwX1AyX1RVTkxEX1ZDT0lORyAweGYyZjAwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9SRUcxRkFJTCAweGYyZjAwMDQwCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9SRUcyRkFJTCAweGYyZjAwMDIwCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9SRUczRkFJTCAweGYyZjAwMDEwCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9SRUc0RkFJTCAweGYyZjAwMDA4CisjZGVmaW5lIEYwOTAwX1AyX1RVTl9SRUc1RkFJTCAweGYyZjAwMDA0CisjZGVmaW5lIEYwOTAwX1AyX1RVTl9CV0lORyAweGYyZjAwMDAyCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9MT0NLRUQgMHhmMmYwMDAwMQogCiAvKlAyX1ROUk9CU0wqLwotI2RlZmluZSBSMDkwMF9QMl9UTlJPQlNMICAweGYyZjYKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0kyQ0FCT1JURUQgIDB4ZjJmNjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0xQRU4gIDB4ZjJmNjAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0ZDQ0sgIDB4ZjJmNjAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX0kyQ0xPQ0tFRCAgMHhmMmY2MDAxMAotI2RlZmluZSBGMDkwMF9QMl9UVU5fUFJPR0RPTkUgIDB4ZjJmNjAwMGMKLSNkZWZpbmUgRjA5MDBfUDJfVFVOX1JGUkVTVEUxICAweGYyZjYwMDAzCisjZGVmaW5lIFIwOTAwX1AyX1ROUk9CU0wgMHhmMmY2CisjZGVmaW5lIEYwOTAwX1AyX1RVTl9JMkNBQk9SVEVEIDB4ZjJmNjAwODAKKyNkZWZpbmUgRjA5MDBfUDJfVFVOX0xQRU4gMHhmMmY2MDA0MAorI2RlZmluZSBGMDkwMF9QMl9UVU5fRkNDSyAweGYyZjYwMDIwCisjZGVmaW5lIEYwOTAwX1AyX1RVTl9JMkNMT0NLRUQgMHhmMmY2MDAxMAorI2RlZmluZSBGMDkwMF9QMl9UVU5fUFJPR0RPTkUgMHhmMmY2MDAwYworI2RlZmluZSBGMDkwMF9QMl9UVU5fUkZSRVNURTEgMHhmMmY2MDAwMwogCiAvKlAyX1ROUlJFU1RFKi8KLSNkZWZpbmUgUjA5MDBfUDJfVE5SUkVTVEUgIDB4ZjJmNwotI2RlZmluZSBGMDkwMF9QMl9UVU5fUkZSRVNURTAgIDB4ZjJmNzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfVE5SUkVTVEUgMHhmMmY3CisjZGVmaW5lIEYwOTAwX1AyX1RVTl9SRlJFU1RFMCAweGYyZjcwMGZmCiAKIC8qUDJfU01BUENPRUY3Ki8KLSNkZWZpbmUgUjA5MDBfUDJfU01BUENPRUY3ICAweGYzMDAKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1FTQ0FMRSAgMHhmMzAwMDA4MAotI2RlZmluZSBGMDkwMF9QMl9TTUFQQ09FRl9RX0xMUjEyICAweGYzMDAwMTdmCisjZGVmaW5lIFIwOTAwX1AyX1NNQVBDT0VGNyAweGYzMDAKKyNkZWZpbmUgRjA5MDBfUDJfRElTX1FTQ0FMRSAweGYzMDAwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1NNQVBDT0VGX1FfTExSMTIgMHhmMzAwMDE3ZgogCiAvKlAyX1NNQVBDT0VGNiovCi0jZGVmaW5lIFIwOTAwX1AyX1NNQVBDT0VGNiAgMHhmMzAxCi0jZGVmaW5lIEYwOTAwX1AyX0RJU19ORVdTQ0FMRSAgMHhmMzAxMDAwOAotI2RlZmluZSBGMDkwMF9QMl9BREpfOFBTS0xMUjEgIDB4ZjMwMTAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfT0xEXzhQU0tMTFIxICAweGYzMDEwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX0RJU19BQjhQU0sgIDB4ZjMwMTAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfU01BUENPRUY2IDB4ZjMwMQorI2RlZmluZSBGMDkwMF9QMl9BREpfOFBTS0xMUjEgMHhmMzAxMDAwNAorI2RlZmluZSBGMDkwMF9QMl9PTERfOFBTS0xMUjEgMHhmMzAxMDAwMgorI2RlZmluZSBGMDkwMF9QMl9ESVNfQUI4UFNLIDB4ZjMwMTAwMDEKIAogLypQMl9TTUFQQ09FRjUqLwotI2RlZmluZSBSMDkwMF9QMl9TTUFQQ09FRjUgIDB4ZjMwMgotI2RlZmluZSBGMDkwMF9QMl9ESVNfOFNDQUxFICAweGYzMDIwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1NNQVBDT0VGXzhQX0xMUjIzICAweGYzMDIwMTdmCisjZGVmaW5lIFIwOTAwX1AyX1NNQVBDT0VGNSAweGYzMDIKKyNkZWZpbmUgRjA5MDBfUDJfRElTXzhTQ0FMRSAweGYzMDIwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1NNQVBDT0VGXzhQX0xMUjIzIDB4ZjMwMjAxN2YKKworLypQMl9OQ08yTUFYMSovCisjZGVmaW5lIFIwOTAwX1AyX05DTzJNQVgxIDB4ZjMxNAorI2RlZmluZSBGMDkwMF9QMl9URVRBMl9NQVhWQUJTMSAweGYzMTQwMGZmCisKKy8qUDJfTkNPMk1BWDAqLworI2RlZmluZSBSMDkwMF9QMl9OQ08yTUFYMCAweGYzMTUKKyNkZWZpbmUgRjA5MDBfUDJfVEVUQTJfTUFYVkFCUzAgMHhmMzE1MDBmZgorCisvKlAyX05DTzJGUjEqLworI2RlZmluZSBSMDkwMF9QMl9OQ08yRlIxIDB4ZjMxNgorI2RlZmluZSBGMDkwMF9QMl9OQ08yRklOQUxfQU5HTEUxIDB4ZjMxNjAwZmYKKworLypQMl9OQ08yRlIwKi8KKyNkZWZpbmUgUjA5MDBfUDJfTkNPMkZSMCAweGYzMTcKKyNkZWZpbmUgRjA5MDBfUDJfTkNPMkZJTkFMX0FOR0xFMCAweGYzMTcwMGZmCisKKy8qUDJfQ0ZSMkFWUkdFMSovCisjZGVmaW5lIFIwOTAwX1AyX0NGUjJBVlJHRTEgMHhmMzE4CisjZGVmaW5lIEYwOTAwX1AyX0kyQ19DRlIyQVZFUkFHRTEgMHhmMzE4MDBmZgorCisvKlAyX0NGUjJBVlJHRTAqLworI2RlZmluZSBSMDkwMF9QMl9DRlIyQVZSR0UwIDB4ZjMxOQorI2RlZmluZSBGMDkwMF9QMl9JMkNfQ0ZSMkFWRVJBR0UwIDB4ZjMxOTAwZmYKIAogLypQMl9ETURQTEhTVEFUKi8KLSNkZWZpbmUgUjA5MDBfUDJfRE1EUExIU1RBVCAgMHhmMzIwCi0jZGVmaW5lIEYwOTAwX1AyX1BMSF9TVEFUSVNUSUMgIDB4ZjMyMDAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRE1EUExIU1RBVCAweGYzMjAKKyNkZWZpbmUgRjA5MDBfUDJfUExIX1NUQVRJU1RJQyAweGYzMjAwMGZmCiAKIC8qUDJfTE9DS1RJTUUzKi8KLSNkZWZpbmUgUjA5MDBfUDJfTE9DS1RJTUUzICAweGYzMjIKLSNkZWZpbmUgRjA5MDBfUDJfREVNT0RfTE9DS1RJTUUzICAweGYzMjIwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0xPQ0tUSU1FMyAweGYzMjIKKyNkZWZpbmUgRjA5MDBfUDJfREVNT0RfTE9DS1RJTUUzIDB4ZjMyMjAwZmYKIAogLypQMl9MT0NLVElNRTIqLwotI2RlZmluZSBSMDkwMF9QMl9MT0NLVElNRTIgIDB4ZjMyMwotI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9MT0NLVElNRTIgIDB4ZjMyMzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTE9DS1RJTUUyIDB4ZjMyMworI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9MT0NLVElNRTIgMHhmMzIzMDBmZgogCiAvKlAyX0xPQ0tUSU1FMSovCi0jZGVmaW5lIFIwOTAwX1AyX0xPQ0tUSU1FMSAgMHhmMzI0Ci0jZGVmaW5lIEYwOTAwX1AyX0RFTU9EX0xPQ0tUSU1FMSAgMHhmMzI0MDBmZgorI2RlZmluZSBSMDkwMF9QMl9MT0NLVElNRTEgMHhmMzI0CisjZGVmaW5lIEYwOTAwX1AyX0RFTU9EX0xPQ0tUSU1FMSAweGYzMjQwMGZmCiAKIC8qUDJfTE9DS1RJTUUwKi8KLSNkZWZpbmUgUjA5MDBfUDJfTE9DS1RJTUUwICAweGYzMjUKLSNkZWZpbmUgRjA5MDBfUDJfREVNT0RfTE9DS1RJTUUwICAweGYzMjUwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0xPQ0tUSU1FMCAweGYzMjUKKyNkZWZpbmUgRjA5MDBfUDJfREVNT0RfTE9DS1RJTUUwIDB4ZjMyNTAwZmYKIAogLypQMl9WSVRTQ0FMRSovCi0jZGVmaW5lIFIwOTAwX1AyX1ZJVFNDQUxFICAweGYzMzIKLSNkZWZpbmUgRjA5MDBfUDJfTlZUSF9OT1NSQU5HRSAgMHhmMzMyMDA4MAotI2RlZmluZSBGMDkwMF9QMl9WRVJST1JfTUFYTU9ERSAgMHhmMzMyMDA0MAotI2RlZmluZSBGMDkwMF9QMl9LRElWX01PREUgIDB4ZjMzMjAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfTlNMT1dTTl9MT0NLRUQgIDB4ZjMzMjAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfREVMT0NLX1BSRkxPU1MgIDB4ZjMzMjAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1JTRkxPQ0sgIDB4ZjMzMjAwMDIKKyNkZWZpbmUgUjA5MDBfUDJfVklUU0NBTEUgMHhmMzMyCisjZGVmaW5lIEYwOTAwX1AyX05WVEhfTk9TUkFOR0UgMHhmMzMyMDA4MAorI2RlZmluZSBGMDkwMF9QMl9WRVJST1JfTUFYTU9ERSAweGYzMzIwMDQwCisjZGVmaW5lIEYwOTAwX1AyX05TTE9XU05fTE9DS0VEIDB4ZjMzMjAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfRElTX1JTRkxPQ0sgMHhmMzMyMDAwMgogCiAvKlAyX0ZFQ00qLwotI2RlZmluZSBSMDkwMF9QMl9GRUNNICAweGYzMzMKLSNkZWZpbmUgRjA5MDBfUDJfRFNTX0RWQiAgMHhmMzMzMDA4MAotI2RlZmluZSBGMDkwMF9QMl9ERU1PRF9CWVBBU1MgIDB4ZjMzMzAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfQ01QX1NMT1dNT0RFICAweGYzMzMwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX0RTU19TUkNIICAweGYzMzMwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0RJRkZfTU9ERVZJVCAgMHhmMzMzMDAwNAotI2RlZmluZSBGMDkwMF9QMl9TWU5DVklUICAweGYzMzMwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX0lRSU5WICAweGYzMzMwMDAxCisjZGVmaW5lIFIwOTAwX1AyX0ZFQ00gMHhmMzMzCisjZGVmaW5lIEYwOTAwX1AyX0RTU19EVkIgMHhmMzMzMDA4MAorI2RlZmluZSBGMDkwMF9QMl9EU1NfU1JDSCAweGYzMzMwMDEwCisjZGVmaW5lIEYwOTAwX1AyX1NZTkNWSVQgMHhmMzMzMDAwMgorI2RlZmluZSBGMDkwMF9QMl9JUUlOViAweGYzMzMwMDAxCiAKIC8qUDJfVlRIMTIqLwotI2RlZmluZSBSMDkwMF9QMl9WVEgxMiAgMHhmMzM0Ci0jZGVmaW5lIEYwOTAwX1AyX1ZUSDEyICAweGYzMzQwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ZUSDEyIDB4ZjMzNAorI2RlZmluZSBGMDkwMF9QMl9WVEgxMiAweGYzMzQwMGZmCiAKIC8qUDJfVlRIMjMqLwotI2RlZmluZSBSMDkwMF9QMl9WVEgyMyAgMHhmMzM1Ci0jZGVmaW5lIEYwOTAwX1AyX1ZUSDIzICAweGYzMzUwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ZUSDIzIDB4ZjMzNQorI2RlZmluZSBGMDkwMF9QMl9WVEgyMyAweGYzMzUwMGZmCiAKIC8qUDJfVlRIMzQqLwotI2RlZmluZSBSMDkwMF9QMl9WVEgzNCAgMHhmMzM2Ci0jZGVmaW5lIEYwOTAwX1AyX1ZUSDM0ICAweGYzMzYwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ZUSDM0IDB4ZjMzNgorI2RlZmluZSBGMDkwMF9QMl9WVEgzNCAweGYzMzYwMGZmCiAKIC8qUDJfVlRINTYqLwotI2RlZmluZSBSMDkwMF9QMl9WVEg1NiAgMHhmMzM3Ci0jZGVmaW5lIEYwOTAwX1AyX1ZUSDU2ICAweGYzMzcwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ZUSDU2IDB4ZjMzNworI2RlZmluZSBGMDkwMF9QMl9WVEg1NiAweGYzMzcwMGZmCiAKIC8qUDJfVlRINjcqLwotI2RlZmluZSBSMDkwMF9QMl9WVEg2NyAgMHhmMzM4Ci0jZGVmaW5lIEYwOTAwX1AyX1ZUSDY3ICAweGYzMzgwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ZUSDY3IDB4ZjMzOAorI2RlZmluZSBGMDkwMF9QMl9WVEg2NyAweGYzMzgwMGZmCiAKIC8qUDJfVlRINzgqLwotI2RlZmluZSBSMDkwMF9QMl9WVEg3OCAgMHhmMzM5Ci0jZGVmaW5lIEYwOTAwX1AyX1ZUSDc4ICAweGYzMzkwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1ZUSDc4IDB4ZjMzOQorI2RlZmluZSBGMDkwMF9QMl9WVEg3OCAweGYzMzkwMGZmCiAKIC8qUDJfVklUQ1VSUFVOKi8KLSNkZWZpbmUgUjA5MDBfUDJfVklUQ1VSUFVOICAweGYzM2EKLSNkZWZpbmUgRjA5MDBfUDJfVklUX01BUFBJTkcgIDB4ZjMzYTAwZTAKLSNkZWZpbmUgRjA5MDBfUDJfVklUX0NVUlBVTiAgMHhmMzNhMDAxZgorI2RlZmluZSBSMDkwMF9QMl9WSVRDVVJQVU4gMHhmMzNhCisjZGVmaW5lIEYwOTAwX1AyX1ZJVF9DVVJQVU4gMHhmMzNhMDAxZgogCiAvKlAyX1ZFUlJPUiovCi0jZGVmaW5lIFIwOTAwX1AyX1ZFUlJPUiAgMHhmMzNiCi0jZGVmaW5lIEYwOTAwX1AyX1JFR0VSUl9WSVQgIDB4ZjMzYjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfVkVSUk9SIDB4ZjMzYgorI2RlZmluZSBGMDkwMF9QMl9SRUdFUlJfVklUIDB4ZjMzYjAwZmYKIAogLypQMl9QUlZJVCovCi0jZGVmaW5lIFIwOTAwX1AyX1BSVklUICAweGYzM2MKLSNkZWZpbmUgRjA5MDBfUDJfRElTX1ZUSExPQ0sgIDB4ZjMzYzAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfRTdfOFZJVCAgMHhmMzNjMDAyMAotI2RlZmluZSBGMDkwMF9QMl9FNl83VklUICAweGYzM2MwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0U1XzZWSVQgIDB4ZjMzYzAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfRTNfNFZJVCAgMHhmMzNjMDAwNAotI2RlZmluZSBGMDkwMF9QMl9FMl8zVklUICAweGYzM2MwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX0UxXzJWSVQgIDB4ZjMzYzAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfUFJWSVQgMHhmMzNjCisjZGVmaW5lIEYwOTAwX1AyX0RJU19WVEhMT0NLIDB4ZjMzYzAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfRTdfOFZJVCAweGYzM2MwMDIwCisjZGVmaW5lIEYwOTAwX1AyX0U2XzdWSVQgMHhmMzNjMDAxMAorI2RlZmluZSBGMDkwMF9QMl9FNV82VklUIDB4ZjMzYzAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfRTNfNFZJVCAweGYzM2MwMDA0CisjZGVmaW5lIEYwOTAwX1AyX0UyXzNWSVQgMHhmMzNjMDAwMgorI2RlZmluZSBGMDkwMF9QMl9FMV8yVklUIDB4ZjMzYzAwMDEKIAogLypQMl9WQVZTUlZJVCovCi0jZGVmaW5lIFIwOTAwX1AyX1ZBVlNSVklUICAweGYzM2QKLSNkZWZpbmUgRjA5MDBfUDJfQU1WSVQgIDB4ZjMzZDAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRlJPWkVOVklUICAweGYzM2QwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX1NOVklUICAweGYzM2QwMDMwCi0jZGVmaW5lIEYwOTAwX1AyX1RPVlZJVCAgMHhmMzNkMDAwYwotI2RlZmluZSBGMDkwMF9QMl9IWVBWSVQgIDB4ZjMzZDAwMDMKKyNkZWZpbmUgUjA5MDBfUDJfVkFWU1JWSVQgMHhmMzNkCisjZGVmaW5lIEYwOTAwX1AyX0FNVklUIDB4ZjMzZDAwODAKKyNkZWZpbmUgRjA5MDBfUDJfRlJPWkVOVklUIDB4ZjMzZDAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfU05WSVQgMHhmMzNkMDAzMAorI2RlZmluZSBGMDkwMF9QMl9UT1ZWSVQgMHhmMzNkMDAwYworI2RlZmluZSBGMDkwMF9QMl9IWVBWSVQgMHhmMzNkMDAwMwogCiAvKlAyX1ZTVEFUVVNWSVQqLwotI2RlZmluZSBSMDkwMF9QMl9WU1RBVFVTVklUICAweGYzM2UKLSNkZWZpbmUgRjA5MDBfUDJfVklURVJCSV9PTiAgMHhmMzNlMDA4MAotI2RlZmluZSBGMDkwMF9QMl9FTkRfTE9PUFZJVCAgMHhmMzNlMDA0MAotI2RlZmluZSBGMDkwMF9QMl9WSVRFUkJJX0RFUFJGICAweGYzM2UwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX1BSRlZJVCAgMHhmMzNlMDAxMAotI2RlZmluZSBGMDkwMF9QMl9MT0NLRURWSVQgIDB4ZjMzZTAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfVklURVJCSV9ERUxPQ0sgIDB4ZjMzZTAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfVklUX0RFTU9EU0VMICAweGYzM2UwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX1ZJVEVSQklfQ09NUE9VVCAgMHhmMzNlMDAwMQorI2RlZmluZSBSMDkwMF9QMl9WU1RBVFVTVklUIDB4ZjMzZQorI2RlZmluZSBGMDkwMF9QMl9QUkZWSVQgMHhmMzNlMDAxMAorI2RlZmluZSBGMDkwMF9QMl9MT0NLRURWSVQgMHhmMzNlMDAwOAogCiAvKlAyX1ZUSElOVVNFKi8KLSNkZWZpbmUgUjA5MDBfUDJfVlRISU5VU0UgIDB4ZjMzZgotI2RlZmluZSBGMDkwMF9QMl9WSVRfSU5VU0UgIDB4ZjMzZjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfVlRISU5VU0UgMHhmMzNmCisjZGVmaW5lIEYwOTAwX1AyX1ZJVF9JTlVTRSAweGYzM2YwMGZmCiAKIC8qUDJfS0RJVjEyKi8KLSNkZWZpbmUgUjA5MDBfUDJfS0RJVjEyICAweGYzNDAKLSNkZWZpbmUgRjA5MDBfUDJfS0RJVjEyX01BTlVBTCAgMHhmMzQwMDA4MAotI2RlZmluZSBGMDkwMF9QMl9LX0RJVklERVJfMTIgIDB4ZjM0MDAwN2YKKyNkZWZpbmUgUjA5MDBfUDJfS0RJVjEyIDB4ZjM0MAorI2RlZmluZSBGMDkwMF9QMl9LX0RJVklERVJfMTIgMHhmMzQwMDA3ZgogCiAvKlAyX0tESVYyMyovCi0jZGVmaW5lIFIwOTAwX1AyX0tESVYyMyAgMHhmMzQxCi0jZGVmaW5lIEYwOTAwX1AyX0tESVYyM19NQU5VQUwgIDB4ZjM0MTAwODAKLSNkZWZpbmUgRjA5MDBfUDJfS19ESVZJREVSXzIzICAweGYzNDEwMDdmCisjZGVmaW5lIFIwOTAwX1AyX0tESVYyMyAweGYzNDEKKyNkZWZpbmUgRjA5MDBfUDJfS19ESVZJREVSXzIzIDB4ZjM0MTAwN2YKIAogLypQMl9LRElWMzQqLwotI2RlZmluZSBSMDkwMF9QMl9LRElWMzQgIDB4ZjM0MgotI2RlZmluZSBGMDkwMF9QMl9LRElWMzRfTUFOVUFMICAweGYzNDIwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0tfRElWSURFUl8zNCAgMHhmMzQyMDA3ZgorI2RlZmluZSBSMDkwMF9QMl9LRElWMzQgMHhmMzQyCisjZGVmaW5lIEYwOTAwX1AyX0tfRElWSURFUl8zNCAweGYzNDIwMDdmCiAKIC8qUDJfS0RJVjU2Ki8KLSNkZWZpbmUgUjA5MDBfUDJfS0RJVjU2ICAweGYzNDMKLSNkZWZpbmUgRjA5MDBfUDJfS0RJVjU2X01BTlVBTCAgMHhmMzQzMDA4MAotI2RlZmluZSBGMDkwMF9QMl9LX0RJVklERVJfNTYgIDB4ZjM0MzAwN2YKKyNkZWZpbmUgUjA5MDBfUDJfS0RJVjU2IDB4ZjM0MworI2RlZmluZSBGMDkwMF9QMl9LX0RJVklERVJfNTYgMHhmMzQzMDA3ZgogCiAvKlAyX0tESVY2NyovCi0jZGVmaW5lIFIwOTAwX1AyX0tESVY2NyAgMHhmMzQ0Ci0jZGVmaW5lIEYwOTAwX1AyX0tESVY2N19NQU5VQUwgIDB4ZjM0NDAwODAKLSNkZWZpbmUgRjA5MDBfUDJfS19ESVZJREVSXzY3ICAweGYzNDQwMDdmCisjZGVmaW5lIFIwOTAwX1AyX0tESVY2NyAweGYzNDQKKyNkZWZpbmUgRjA5MDBfUDJfS19ESVZJREVSXzY3IDB4ZjM0NDAwN2YKIAogLypQMl9LRElWNzgqLwotI2RlZmluZSBSMDkwMF9QMl9LRElWNzggIDB4ZjM0NQotI2RlZmluZSBGMDkwMF9QMl9LRElWNzhfTUFOVUFMICAweGYzNDUwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX0tfRElWSURFUl83OCAgMHhmMzQ1MDA3ZgorI2RlZmluZSBSMDkwMF9QMl9LRElWNzggMHhmMzQ1CisjZGVmaW5lIEYwOTAwX1AyX0tfRElWSURFUl83OCAweGYzNDUwMDdmCiAKIC8qUDJfUERFTENUUkwxKi8KLSNkZWZpbmUgUjA5MDBfUDJfUERFTENUUkwxICAweGYzNTAKLSNkZWZpbmUgRjA5MDBfUDJfSU5WX01JU01BU0sgIDB4ZjM1MDAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRk9SQ0VfQUNDRVBURUQgIDB4ZjM1MDAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfRklMVEVSX0VOICAweGYzNTAwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX0ZPUkNFX1BLVERFTElOVVNFICAweGYzNTAwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0hZU1RFTiAgMHhmMzUwMDAwOAotI2RlZmluZSBGMDkwMF9QMl9IWVNUU1dSU1QgIDB4ZjM1MDAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfRU5fTUlTMDAgIDB4ZjM1MDAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfQUxHT1NXUlNUICAweGYzNTAwMDAxCisjZGVmaW5lIFIwOTAwX1AyX1BERUxDVFJMMSAweGYzNTAKKyNkZWZpbmUgRjA5MDBfUDJfSU5WX01JU01BU0sgMHhmMzUwMDA4MAorI2RlZmluZSBGMDkwMF9QMl9GSUxURVJfRU4gMHhmMzUwMDAyMAorI2RlZmluZSBGMDkwMF9QMl9FTl9NSVMwMCAweGYzNTAwMDAyCisjZGVmaW5lIEYwOTAwX1AyX0FMR09TV1JTVCAweGYzNTAwMDAxCiAKIC8qUDJfUERFTENUUkwyKi8KLSNkZWZpbmUgUjA5MDBfUDJfUERFTENUUkwyICAweGYzNTEKLSNkZWZpbmUgRjA5MDBfUDJfRk9SQ0VfQ09OVElOVU9VUyAgMHhmMzUxMDA4MAotI2RlZmluZSBGMDkwMF9QMl9SRVNFVF9VUEtPX0NPVU5UICAweGYzNTEwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX1VTRVJfUEtUREVMSU5fTkIgIDB4ZjM1MTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfRk9SQ0VfTE9DS0VEICAweGYzNTEwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX0RBVEFfVU5CQlNDUkFNICAweGYzNTEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX0ZPUkNFX0xPTkdQS1QgIDB4ZjM1MTAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfRlJBTUVfTU9ERSAgMHhmMzUxMDAwMgorI2RlZmluZSBSMDkwMF9QMl9QREVMQ1RSTDIgMHhmMzUxCisjZGVmaW5lIEYwOTAwX1AyX1JFU0VUX1VQS09fQ09VTlQgMHhmMzUxMDA0MAorI2RlZmluZSBGMDkwMF9QMl9GUkFNRV9NT0RFIDB4ZjM1MTAwMDIKKyNkZWZpbmUgRjA5MDBfUDJfTk9CQ0hFUlJGTEdfVVNFIDB4ZjM1MTAwMDEKIAogLypQMl9IWVNUVEhSRVNIKi8KLSNkZWZpbmUgUjA5MDBfUDJfSFlTVFRIUkVTSCAgMHhmMzU0Ci0jZGVmaW5lIEYwOTAwX1AyX1VOTENLX1RIUkVTSCAgMHhmMzU0MDBmMAotI2RlZmluZSBGMDkwMF9QMl9ERUxJTl9MQ0tfVEhSRVNIICAweGYzNTQwMDBmCisjZGVmaW5lIFIwOTAwX1AyX0hZU1RUSFJFU0ggMHhmMzU0CisjZGVmaW5lIEYwOTAwX1AyX1VOTENLX1RIUkVTSCAweGYzNTQwMGYwCisjZGVmaW5lIEYwOTAwX1AyX0RFTElOX0xDS19USFJFU0ggMHhmMzU0MDAwZgogCiAvKlAyX0lTSUVOVFJZKi8KLSNkZWZpbmUgUjA5MDBfUDJfSVNJRU5UUlkgIDB4ZjM1ZQotI2RlZmluZSBGMDkwMF9QMl9JU0lfRU5UUlkgIDB4ZjM1ZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfSVNJRU5UUlkgMHhmMzVlCisjZGVmaW5lIEYwOTAwX1AyX0lTSV9FTlRSWSAweGYzNWUwMGZmCiAKIC8qUDJfSVNJQklURU5BKi8KLSNkZWZpbmUgUjA5MDBfUDJfSVNJQklURU5BICAweGYzNWYKLSNkZWZpbmUgRjA5MDBfUDJfSVNJX0JJVF9FTiAgMHhmMzVmMDBmZgorI2RlZmluZSBSMDkwMF9QMl9JU0lCSVRFTkEgMHhmMzVmCisjZGVmaW5lIEYwOTAwX1AyX0lTSV9CSVRfRU4gMHhmMzVmMDBmZgogCiAvKlAyX01BVFNUUjEqLwotI2RlZmluZSBSMDkwMF9QMl9NQVRTVFIxICAweGYzNjAKLSNkZWZpbmUgRjA5MDBfUDJfTUFUWVBFX0NVUlJFTlQxICAweGYzNjAwMGZmCisjZGVmaW5lIFIwOTAwX1AyX01BVFNUUjEgMHhmMzYwCisjZGVmaW5lIEYwOTAwX1AyX01BVFlQRV9DVVJSRU5UMSAweGYzNjAwMGZmCiAKIC8qUDJfTUFUU1RSMCovCi0jZGVmaW5lIFIwOTAwX1AyX01BVFNUUjAgIDB4ZjM2MQotI2RlZmluZSBGMDkwMF9QMl9NQVRZUEVfQ1VSUkVOVDAgIDB4ZjM2MTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfTUFUU1RSMCAweGYzNjEKKyNkZWZpbmUgRjA5MDBfUDJfTUFUWVBFX0NVUlJFTlQwIDB4ZjM2MTAwZmYKIAogLypQMl9VUExTVFIxKi8KLSNkZWZpbmUgUjA5MDBfUDJfVVBMU1RSMSAgMHhmMzYyCi0jZGVmaW5lIEYwOTAwX1AyX1VQTF9DVVJSRU5UMSAgMHhmMzYyMDBmZgorI2RlZmluZSBSMDkwMF9QMl9VUExTVFIxIDB4ZjM2MgorI2RlZmluZSBGMDkwMF9QMl9VUExfQ1VSUkVOVDEgMHhmMzYyMDBmZgogCiAvKlAyX1VQTFNUUjAqLwotI2RlZmluZSBSMDkwMF9QMl9VUExTVFIwICAweGYzNjMKLSNkZWZpbmUgRjA5MDBfUDJfVVBMX0NVUlJFTlQwICAweGYzNjMwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1VQTFNUUjAgMHhmMzYzCisjZGVmaW5lIEYwOTAwX1AyX1VQTF9DVVJSRU5UMCAweGYzNjMwMGZmCiAKIC8qUDJfREZMU1RSMSovCi0jZGVmaW5lIFIwOTAwX1AyX0RGTFNUUjEgIDB4ZjM2NAotI2RlZmluZSBGMDkwMF9QMl9ERkxfQ1VSUkVOVDEgIDB4ZjM2NDAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfREZMU1RSMSAweGYzNjQKKyNkZWZpbmUgRjA5MDBfUDJfREZMX0NVUlJFTlQxIDB4ZjM2NDAwZmYKIAogLypQMl9ERkxTVFIwKi8KLSNkZWZpbmUgUjA5MDBfUDJfREZMU1RSMCAgMHhmMzY1Ci0jZGVmaW5lIEYwOTAwX1AyX0RGTF9DVVJSRU5UMCAgMHhmMzY1MDBmZgorI2RlZmluZSBSMDkwMF9QMl9ERkxTVFIwIDB4ZjM2NQorI2RlZmluZSBGMDkwMF9QMl9ERkxfQ1VSUkVOVDAgMHhmMzY1MDBmZgogCiAvKlAyX1NZTkNTVFIqLwotI2RlZmluZSBSMDkwMF9QMl9TWU5DU1RSICAweGYzNjYKLSNkZWZpbmUgRjA5MDBfUDJfU1lOQ19DVVJSRU5UICAweGYzNjYwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1NZTkNTVFIgMHhmMzY2CisjZGVmaW5lIEYwOTAwX1AyX1NZTkNfQ1VSUkVOVCAweGYzNjYwMGZmCiAKIC8qUDJfU1lOQ0RTVFIxKi8KLSNkZWZpbmUgUjA5MDBfUDJfU1lOQ0RTVFIxICAweGYzNjcKLSNkZWZpbmUgRjA5MDBfUDJfU1lOQ0RfQ1VSUkVOVDEgIDB4ZjM2NzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfU1lOQ0RTVFIxIDB4ZjM2NworI2RlZmluZSBGMDkwMF9QMl9TWU5DRF9DVVJSRU5UMSAweGYzNjcwMGZmCiAKIC8qUDJfU1lOQ0RTVFIwKi8KLSNkZWZpbmUgUjA5MDBfUDJfU1lOQ0RTVFIwICAweGYzNjgKLSNkZWZpbmUgRjA5MDBfUDJfU1lOQ0RfQ1VSUkVOVDAgIDB4ZjM2ODAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfU1lOQ0RTVFIwIDB4ZjM2OAorI2RlZmluZSBGMDkwMF9QMl9TWU5DRF9DVVJSRU5UMCAweGYzNjgwMGZmCiAKIC8qUDJfUERFTFNUQVRVUzEqLwotI2RlZmluZSBSMDkwMF9QMl9QREVMU1RBVFVTMSAgMHhmMzY5Ci0jZGVmaW5lIEYwOTAwX1AyX1BLVERFTElOX0RFTE9DSyAgMHhmMzY5MDA4MAotI2RlZmluZSBGMDkwMF9QMl9TWU5DRFVQREZMX0JBRERGTCAgMHhmMzY5MDA0MAotI2RlZmluZSBGMDkwMF9QMl9DT05USU5VT1VTX1NUUkVBTSAgMHhmMzY5MDAyMAotI2RlZmluZSBGMDkwMF9QMl9VTkFDQ0VQVEVEX1NUUkVBTSAgMHhmMzY5MDAxMAotI2RlZmluZSBGMDkwMF9QMl9CQ0hfRVJST1JfRkxBRyAgMHhmMzY5MDAwOAotI2RlZmluZSBGMDkwMF9QMl9CQkhDUkNLTyAgMHhmMzY5MDAwNAotI2RlZmluZSBGMDkwMF9QMl9QS1RERUxJTl9MT0NLICAweGYzNjkwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX0ZJUlNUX0xPQ0sgIDB4ZjM2OTAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfUERFTFNUQVRVUzEgMHhmMzY5CisjZGVmaW5lIEYwOTAwX1AyX1BLVERFTElOX0RFTE9DSyAweGYzNjkwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1NZTkNEVVBERkxfQkFEREZMIDB4ZjM2OTAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfQ09OVElOVU9VU19TVFJFQU0gMHhmMzY5MDAyMAorI2RlZmluZSBGMDkwMF9QMl9VTkFDQ0VQVEVEX1NUUkVBTSAweGYzNjkwMDEwCisjZGVmaW5lIEYwOTAwX1AyX0JDSF9FUlJPUl9GTEFHIDB4ZjM2OTAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfUEtUREVMSU5fTE9DSyAweGYzNjkwMDAyCisjZGVmaW5lIEYwOTAwX1AyX0ZJUlNUX0xPQ0sgMHhmMzY5MDAwMQogCiAvKlAyX1BERUxTVEFUVVMyKi8KLSNkZWZpbmUgUjA5MDBfUDJfUERFTFNUQVRVUzIgIDB4ZjM2YQotI2RlZmluZSBGMDkwMF9QMl9QS1RERUxfREVNT0RTRUwgIDB4ZjM2YTAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRlJBTUVfTU9EQ09EICAweGYzNmEwMDdjCi0jZGVmaW5lIEYwOTAwX1AyX0ZSQU1FX1RZUEUgIDB4ZjM2YTAwMDMKKyNkZWZpbmUgUjA5MDBfUDJfUERFTFNUQVRVUzIgMHhmMzZhCisjZGVmaW5lIEYwOTAwX1AyX0ZSQU1FX01PRENPRCAweGYzNmEwMDdjCisjZGVmaW5lIEYwOTAwX1AyX0ZSQU1FX1RZUEUgMHhmMzZhMDAwMwogCiAvKlAyX0JCRkNSQ0tPMSovCi0jZGVmaW5lIFIwOTAwX1AyX0JCRkNSQ0tPMSAgMHhmMzZiCi0jZGVmaW5lIEYwOTAwX1AyX0JCSENSQ19LT0NOVDEgIDB4ZjM2YjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfQkJGQ1JDS08xIDB4ZjM2YgorI2RlZmluZSBGMDkwMF9QMl9CQkhDUkNfS09DTlQxIDB4ZjM2YjAwZmYKIAogLypQMl9CQkZDUkNLTzAqLwotI2RlZmluZSBSMDkwMF9QMl9CQkZDUkNLTzAgIDB4ZjM2YwotI2RlZmluZSBGMDkwMF9QMl9CQkhDUkNfS09DTlQwICAweGYzNmMwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0JCRkNSQ0tPMCAweGYzNmMKKyNkZWZpbmUgRjA5MDBfUDJfQkJIQ1JDX0tPQ05UMCAweGYzNmMwMGZmCiAKIC8qUDJfVVBDUkNLTzEqLwotI2RlZmluZSBSMDkwMF9QMl9VUENSQ0tPMSAgMHhmMzZkCi0jZGVmaW5lIEYwOTAwX1AyX1BLVENSQ19LT0NOVDEgIDB4ZjM2ZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfVVBDUkNLTzEgMHhmMzZkCisjZGVmaW5lIEYwOTAwX1AyX1BLVENSQ19LT0NOVDEgMHhmMzZkMDBmZgogCiAvKlAyX1VQQ1JDS08wKi8KLSNkZWZpbmUgUjA5MDBfUDJfVVBDUkNLTzAgIDB4ZjM2ZQotI2RlZmluZSBGMDkwMF9QMl9QS1RDUkNfS09DTlQwICAweGYzNmUwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1VQQ1JDS08wIDB4ZjM2ZQorI2RlZmluZSBGMDkwMF9QMl9QS1RDUkNfS09DTlQwIDB4ZjM2ZTAwZmYKKworLypQMl9QREVMQ1RSTDMqLworI2RlZmluZSBSMDkwMF9QMl9QREVMQ1RSTDMgMHhmMzZmCisjZGVmaW5lIEYwOTAwX1AyX1BLVERFTF9DT05URkFJTCAweGYzNmYwMDgwCisjZGVmaW5lIEYwOTAwX1AyX05PRklGT19CQ0hFUlIgMHhmMzZmMDAyMAogCiAvKlAyX1RTU1RBVEVNKi8KLSNkZWZpbmUgUjA5MDBfUDJfVFNTVEFURU0gIDB4ZjM3MAotI2RlZmluZSBGMDkwMF9QMl9UU0RJTF9PTiAgMHhmMzcwMDA4MAotI2RlZmluZSBGMDkwMF9QMl9UU1NLSVBSU19PTiAgMHhmMzcwMDA0MAotI2RlZmluZSBGMDkwMF9QMl9UU1JTX09OICAweGYzNzAwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX1RTREVTQ1JBTUJfT04gIDB4ZjM3MDAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGUkFNRV9NT0RFICAweGYzNzAwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX1RTX0RJU0FCTEUgIDB4ZjM3MDAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfVFNBQ01fTU9ERSAgMHhmMzcwMDAwMgotI2RlZmluZSBGMDkwMF9QMl9UU09VVF9OT1NZTkMgIDB4ZjM3MDAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfVFNTVEFURU0gMHhmMzcwCisjZGVmaW5lIEYwOTAwX1AyX1RTRElMX09OIDB4ZjM3MDAwODAKKyNkZWZpbmUgRjA5MDBfUDJfVFNSU19PTiAweGYzNzAwMDIwCisjZGVmaW5lIEYwOTAwX1AyX1RTREVTQ1JBTUJfT04gMHhmMzcwMDAxMAorI2RlZmluZSBGMDkwMF9QMl9UU0ZSQU1FX01PREUgMHhmMzcwMDAwOAorI2RlZmluZSBGMDkwMF9QMl9UU19ESVNBQkxFIDB4ZjM3MDAwMDQKKyNkZWZpbmUgRjA5MDBfUDJfVFNPVVRfTk9TWU5DIDB4ZjM3MDAwMDEKIAogLypQMl9UU0NGR0gqLwotI2RlZmluZSBSMDkwMF9QMl9UU0NGR0ggIDB4ZjM3MgotI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fRFZCQ0kgIDB4ZjM3MjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX1NFUklBTCAgMHhmMzcyMDA0MAotI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fVEVJVVBEQVRFICAweGYzNzIwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19EVVRZNTAgIDB4ZjM3MjAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0hTR05MT1VUICAweGYzNzIwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19FUlJNT0RFICAweGYzNzIwMDA2Ci0jZGVmaW5lIEYwOTAwX1AyX1JTVF9IV0FSRSAgMHhmMzcyMDAwMQorI2RlZmluZSBSMDkwMF9QMl9UU0NGR0ggMHhmMzcyCisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19EVkJDSSAweGYzNzIwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19TRVJJQUwgMHhmMzcyMDA0MAorI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fVEVJVVBEQVRFIDB4ZjM3MjAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0RVVFk1MCAweGYzNzIwMDEwCisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19IU0dOTE9VVCAweGYzNzIwMDA4CisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19FUlJNT0RFIDB4ZjM3MjAwMDYKKyNkZWZpbmUgRjA5MDBfUDJfUlNUX0hXQVJFIDB4ZjM3MjAwMDEKIAogLypQMl9UU0NGR00qLwotI2RlZmluZSBSMDkwMF9QMl9UU0NGR00gIDB4ZjM3MwotI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fTUFOU1BFRUQgIDB4ZjM3MzAwYzAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX1BFUk1EQVRBICAweGYzNzMwMDIwCi0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19OT05FV1NHTkwgIDB4ZjM3MzAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0JJVFNQRUVEICAweGYzNzMwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX05QRF9TUEVDRFZCUzIgIDB4ZjM3MzAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX1NUT1BDS0RJUyAgMHhmMzczMDAwMgotI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fSU5WREFUQSAgMHhmMzczMDAwMQorI2RlZmluZSBSMDkwMF9QMl9UU0NGR00gMHhmMzczCisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19NQU5TUEVFRCAweGYzNzMwMGMwCisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19QRVJNREFUQSAweGYzNzMwMDIwCisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19EUFVOQUNUIDB4ZjM3MzAwMDIKKyNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0lOVkRBVEEgMHhmMzczMDAwMQogCiAvKlAyX1RTQ0ZHTCovCi0jZGVmaW5lIFIwOTAwX1AyX1RTQ0ZHTCAgMHhmMzc0Ci0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19CQ0xLREVMMUNLICAweGYzNzQwMGMwCi0jZGVmaW5lIEYwOTAwX1AyX0JDSEVSUk9SX01PREUgIDB4ZjM3NDAwMzAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX05TR05MMkRBVEEgIDB4ZjM3NDAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0VNQklORFZCICAweGYzNzQwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19EUFVOQUNUICAweGYzNzQwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19OUERPRkYgIDB4ZjM3NDAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfVFNDRkdMIDB4ZjM3NAorI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fQkNMS0RFTDFDSyAweGYzNzQwMGMwCisjZGVmaW5lIEYwOTAwX1AyX0JDSEVSUk9SX01PREUgMHhmMzc0MDAzMAorI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fTlNHTkwyREFUQSAweGYzNzQwMDA4CisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19FTUJJTkRWQiAweGYzNzQwMDA0CisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19CSVRTUEVFRCAweGYzNzQwMDAzCiAKIC8qUDJfVFNJTlNERUxIKi8KLSNkZWZpbmUgUjA5MDBfUDJfVFNJTlNERUxIICAweGYzNzYKLSNkZWZpbmUgRjA5MDBfUDJfVFNERUxfU1lOQ0JZVEUgIDB4ZjM3NjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfVFNERUxfWFhIRUFERVIgIDB4ZjM3NjAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfVFNERUxfQkJIRUFERVIgIDB4ZjM3NjAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfVFNERUxfREFUQUZJRUxEICAweGYzNzYwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX1RTSU5TREVMX0lTQ1IgIDB4ZjM3NjAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfVFNJTlNERUxfTlBEICAweGYzNzYwMDA0Ci0jZGVmaW5lIEYwOTAwX1AyX1RTSU5TREVMX1JTUEFSSVRZICAweGYzNzYwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX1RTSU5TREVMX0NSQzggIDB4ZjM3NjAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfVFNJTlNERUxIIDB4ZjM3NgorI2RlZmluZSBGMDkwMF9QMl9UU0RFTF9TWU5DQllURSAweGYzNzYwMDgwCisjZGVmaW5lIEYwOTAwX1AyX1RTREVMX1hYSEVBREVSIDB4ZjM3NjAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfVFNERUxfQkJIRUFERVIgMHhmMzc2MDAyMAorI2RlZmluZSBGMDkwMF9QMl9UU0RFTF9EQVRBRklFTEQgMHhmMzc2MDAxMAorI2RlZmluZSBGMDkwMF9QMl9UU0lOU0RFTF9JU0NSIDB4ZjM3NjAwMDgKKyNkZWZpbmUgRjA5MDBfUDJfVFNJTlNERUxfTlBEIDB4ZjM3NjAwMDQKKyNkZWZpbmUgRjA5MDBfUDJfVFNJTlNERUxfUlNQQVJJVFkgMHhmMzc2MDAwMgorI2RlZmluZSBGMDkwMF9QMl9UU0lOU0RFTF9DUkM4IDB4ZjM3NjAwMDEKKworLypQMl9UU0RJVk4qLworI2RlZmluZSBSMDkwMF9QMl9UU0RJVk4gMHhmMzc5CisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19TUEVFRE1PREUgMHhmMzc5MDBjMAorCisvKlAyX1RTQ0ZHNCovCisjZGVmaW5lIFIwOTAwX1AyX1RTQ0ZHNCAweGYzN2EKKyNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX1RTU1BFRURNT0RFIDB4ZjM3YTAwYzAKIAogLypQMl9UU1NQRUVEKi8KLSNkZWZpbmUgUjA5MDBfUDJfVFNTUEVFRCAgMHhmMzgwCi0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19PVVRTUEVFRCAgMHhmMzgwMDBmZgorI2RlZmluZSBSMDkwMF9QMl9UU1NQRUVEIDB4ZjM4MAorI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fT1VUU1BFRUQgMHhmMzgwMDBmZgogCiAvKlAyX1RTU1RBVFVTKi8KLSNkZWZpbmUgUjA5MDBfUDJfVFNTVEFUVVMgIDB4ZjM4MQotI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fTElORU9LICAweGYzODEwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19FUlJPUiAgMHhmMzgxMDA0MAotI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fREFUQTcgIDB4ZjM4MTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX05PU1lOQyAgMHhmMzgxMDAxMAotI2RlZmluZSBGMDkwMF9QMl9JU0NSX0lOSVRJQUxJWkVEICAweGYzODEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AyX0lTQ1JfVVBEQVRFRCAgMHhmMzgxMDAwNAotI2RlZmluZSBGMDkwMF9QMl9TT0ZGSUZPX1VOUkVHVUwgIDB4ZjM4MTAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfRElMX1JFQURZICAweGYzODEwMDAxCisjZGVmaW5lIFIwOTAwX1AyX1RTU1RBVFVTIDB4ZjM4MQorI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fTElORU9LIDB4ZjM4MTAwODAKKyNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0VSUk9SIDB4ZjM4MTAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfRElMX1JFQURZIDB4ZjM4MTAwMDEKIAogLypQMl9UU1NUQVRVUzIqLwotI2RlZmluZSBSMDkwMF9QMl9UU1NUQVRVUzIgIDB4ZjM4MgotI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fREVNT0RTRUwgIDB4ZjM4MjAwODAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPU1BFRURfU1RPUkUgIDB4ZjM4MjAwNDAKLSNkZWZpbmUgRjA5MDBfUDJfRElMWFhfUkVTRVQgIDB4ZjM4MjAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfVFNTRVJJQUxfSU1QT1MgIDB4ZjM4MjAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0xJTkVOT0sgIDB4ZjM4MjAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfQklUU1BFRURfRVZFTlQgIDB4ZjM4MjAwMDQKLSNkZWZpbmUgRjA5MDBfUDJfU0NSQU1CREVURUNUICAweGYzODIwMDAyCi0jZGVmaW5lIEYwOTAwX1AyX1VMRFRWNjdfRkFMU0VMT0NLICAweGYzODIwMDAxCisjZGVmaW5lIFIwOTAwX1AyX1RTU1RBVFVTMiAweGYzODIKKyNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0RFTU9EU0VMIDB4ZjM4MjAwODAKKyNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPU1BFRURfU1RPUkUgMHhmMzgyMDA0MAorI2RlZmluZSBGMDkwMF9QMl9ESUxYWF9SRVNFVCAweGYzODIwMDIwCisjZGVmaW5lIEYwOTAwX1AyX1RTU0VSSUFMX0lNUE9TIDB4ZjM4MjAwMTAKKyNkZWZpbmUgRjA5MDBfUDJfU0NSQU1CREVURUNUIDB4ZjM4MjAwMDIKIAogLypQMl9UU0JJVFJBVEUxKi8KLSNkZWZpbmUgUjA5MDBfUDJfVFNCSVRSQVRFMSAgMHhmMzgzCi0jZGVmaW5lIEYwOTAwX1AyX1RTRklGT19CSVRSQVRFMSAgMHhmMzgzMDBmZgorI2RlZmluZSBSMDkwMF9QMl9UU0JJVFJBVEUxIDB4ZjM4MworI2RlZmluZSBGMDkwMF9QMl9UU0ZJRk9fQklUUkFURTEgMHhmMzgzMDBmZgogCiAvKlAyX1RTQklUUkFURTAqLwotI2RlZmluZSBSMDkwMF9QMl9UU0JJVFJBVEUwICAweGYzODQKLSNkZWZpbmUgRjA5MDBfUDJfVFNGSUZPX0JJVFJBVEUwICAweGYzODQwMGZmCisjZGVmaW5lIFIwOTAwX1AyX1RTQklUUkFURTAgMHhmMzg0CisjZGVmaW5lIEYwOTAwX1AyX1RTRklGT19CSVRSQVRFMCAweGYzODQwMGZmCiAKIC8qUDJfRVJSQ1RSTDEqLwotI2RlZmluZSBSMDkwMF9QMl9FUlJDVFJMMSAgMHhmMzk4Ci0jZGVmaW5lIEYwOTAwX1AyX0VSUl9TT1VSQ0UxICAweGYzOTgwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX05VTV9FVkVOVDEgIDB4ZjM5ODAwMDcKKyNkZWZpbmUgUjA5MDBfUDJfRVJSQ1RSTDEgMHhmMzk4CisjZGVmaW5lIEYwOTAwX1AyX0VSUl9TT1VSQ0UxIDB4ZjM5ODAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfTlVNX0VWRU5UMSAweGYzOTgwMDA3CiAKIC8qUDJfRVJSQ05UMTIqLwotI2RlZmluZSBSMDkwMF9QMl9FUlJDTlQxMiAgMHhmMzk5Ci0jZGVmaW5lIEYwOTAwX1AyX0VSUkNOVDFfT0xEVkFMVUUgIDB4ZjM5OTAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRVJSX0NOVDEyICAweGYzOTkwMDdmCisjZGVmaW5lIFIwOTAwX1AyX0VSUkNOVDEyIDB4ZjM5OQorI2RlZmluZSBGMDkwMF9QMl9FUlJDTlQxX09MRFZBTFVFIDB4ZjM5OTAwODAKKyNkZWZpbmUgRjA5MDBfUDJfRVJSX0NOVDEyIDB4ZjM5OTAwN2YKIAogLypQMl9FUlJDTlQxMSovCi0jZGVmaW5lIFIwOTAwX1AyX0VSUkNOVDExICAweGYzOWEKLSNkZWZpbmUgRjA5MDBfUDJfRVJSX0NOVDExICAweGYzOWEwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0VSUkNOVDExIDB4ZjM5YQorI2RlZmluZSBGMDkwMF9QMl9FUlJfQ05UMTEgMHhmMzlhMDBmZgogCiAvKlAyX0VSUkNOVDEwKi8KLSNkZWZpbmUgUjA5MDBfUDJfRVJSQ05UMTAgIDB4ZjM5YgotI2RlZmluZSBGMDkwMF9QMl9FUlJfQ05UMTAgIDB4ZjM5YjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRVJSQ05UMTAgMHhmMzliCisjZGVmaW5lIEYwOTAwX1AyX0VSUl9DTlQxMCAweGYzOWIwMGZmCiAKIC8qUDJfRVJSQ1RSTDIqLwotI2RlZmluZSBSMDkwMF9QMl9FUlJDVFJMMiAgMHhmMzljCi0jZGVmaW5lIEYwOTAwX1AyX0VSUl9TT1VSQ0UyICAweGYzOWMwMGYwCi0jZGVmaW5lIEYwOTAwX1AyX05VTV9FVkVOVDIgIDB4ZjM5YzAwMDcKKyNkZWZpbmUgUjA5MDBfUDJfRVJSQ1RSTDIgMHhmMzljCisjZGVmaW5lIEYwOTAwX1AyX0VSUl9TT1VSQ0UyIDB4ZjM5YzAwZjAKKyNkZWZpbmUgRjA5MDBfUDJfTlVNX0VWRU5UMiAweGYzOWMwMDA3CiAKIC8qUDJfRVJSQ05UMjIqLwotI2RlZmluZSBSMDkwMF9QMl9FUlJDTlQyMiAgMHhmMzlkCi0jZGVmaW5lIEYwOTAwX1AyX0VSUkNOVDJfT0xEVkFMVUUgIDB4ZjM5ZDAwODAKLSNkZWZpbmUgRjA5MDBfUDJfRVJSX0NOVDIyICAweGYzOWQwMDdmCisjZGVmaW5lIFIwOTAwX1AyX0VSUkNOVDIyIDB4ZjM5ZAorI2RlZmluZSBGMDkwMF9QMl9FUlJDTlQyX09MRFZBTFVFIDB4ZjM5ZDAwODAKKyNkZWZpbmUgRjA5MDBfUDJfRVJSX0NOVDIyIDB4ZjM5ZDAwN2YKIAogLypQMl9FUlJDTlQyMSovCi0jZGVmaW5lIFIwOTAwX1AyX0VSUkNOVDIxICAweGYzOWUKLSNkZWZpbmUgRjA5MDBfUDJfRVJSX0NOVDIxICAweGYzOWUwMGZmCisjZGVmaW5lIFIwOTAwX1AyX0VSUkNOVDIxIDB4ZjM5ZQorI2RlZmluZSBGMDkwMF9QMl9FUlJfQ05UMjEgMHhmMzllMDBmZgogCiAvKlAyX0VSUkNOVDIwKi8KLSNkZWZpbmUgUjA5MDBfUDJfRVJSQ05UMjAgIDB4ZjM5ZgotI2RlZmluZSBGMDkwMF9QMl9FUlJfQ05UMjAgIDB4ZjM5ZjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRVJSQ05UMjAgMHhmMzlmCisjZGVmaW5lIEYwOTAwX1AyX0VSUl9DTlQyMCAweGYzOWYwMGZmCiAKIC8qUDJfRkVDU1BZKi8KLSNkZWZpbmUgUjA5MDBfUDJfRkVDU1BZICAweGYzYTAKLSNkZWZpbmUgRjA5MDBfUDJfU1BZX0VOQUJMRSAgMHhmM2EwMDA4MAotI2RlZmluZSBGMDkwMF9QMl9OT19TWU5DQllURSAgMHhmM2EwMDA0MAotI2RlZmluZSBGMDkwMF9QMl9TRVJJQUxfTU9ERSAgMHhmM2EwMDAyMAotI2RlZmluZSBGMDkwMF9QMl9VTlVTVUFMX1BBQ0tFVCAgMHhmM2EwMDAxMAotI2RlZmluZSBGMDkwMF9QMl9CRVJfUEFDS01PREUgIDB4ZjNhMDAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfQkVSTUVURVJfTE1PREUgIDB4ZjNhMDAwMDIKLSNkZWZpbmUgRjA5MDBfUDJfQkVSTUVURVJfUkVTRVQgIDB4ZjNhMDAwMDEKKyNkZWZpbmUgUjA5MDBfUDJfRkVDU1BZIDB4ZjNhMAorI2RlZmluZSBGMDkwMF9QMl9TUFlfRU5BQkxFIDB4ZjNhMDAwODAKKyNkZWZpbmUgRjA5MDBfUDJfTk9fU1lOQ0JZVEUgMHhmM2EwMDA0MAorI2RlZmluZSBGMDkwMF9QMl9TRVJJQUxfTU9ERSAweGYzYTAwMDIwCisjZGVmaW5lIEYwOTAwX1AyX1VOVVNVQUxfUEFDS0VUIDB4ZjNhMDAwMTAKKyNkZWZpbmUgRjA5MDBfUDJfQkVSTUVURVJfREFUQU1PREUgMHhmM2EwMDAwOAorI2RlZmluZSBGMDkwMF9QMl9CRVJNRVRFUl9MTU9ERSAweGYzYTAwMDAyCisjZGVmaW5lIEYwOTAwX1AyX0JFUk1FVEVSX1JFU0VUIDB4ZjNhMDAwMDEKIAogLypQMl9GU1BZQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfUDJfRlNQWUNGRyAgMHhmM2ExCi0jZGVmaW5lIEYwOTAwX1AyX0ZFQ1NQWV9JTlBVVCAgMHhmM2ExMDBjMAotI2RlZmluZSBGMDkwMF9QMl9SU1RfT05fRVJST1IgIDB4ZjNhMTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfT05FX1NIT1QgIDB4ZjNhMTAwMTAKLSNkZWZpbmUgRjA5MDBfUDJfSTJDX01PREUgIDB4ZjNhMTAwMGMKLSNkZWZpbmUgRjA5MDBfUDJfU1BZX0hZU1RFUkVTSVMgIDB4ZjNhMTAwMDMKKyNkZWZpbmUgUjA5MDBfUDJfRlNQWUNGRyAweGYzYTEKKyNkZWZpbmUgRjA5MDBfUDJfRkVDU1BZX0lOUFVUIDB4ZjNhMTAwYzAKKyNkZWZpbmUgRjA5MDBfUDJfUlNUX09OX0VSUk9SIDB4ZjNhMTAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfT05FX1NIT1QgMHhmM2ExMDAxMAorI2RlZmluZSBGMDkwMF9QMl9JMkNfTU9ERSAweGYzYTEwMDBjCisjZGVmaW5lIEYwOTAwX1AyX1NQWV9IWVNURVJFU0lTIDB4ZjNhMTAwMDMKIAogLypQMl9GU1BZREFUQSovCi0jZGVmaW5lIFIwOTAwX1AyX0ZTUFlEQVRBICAweGYzYTIKLSNkZWZpbmUgRjA5MDBfUDJfU1BZX1NUVUZGSU5HICAweGYzYTIwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX05PRVJST1JfUEtUSklUVEVSICAweGYzYTIwMDQwCi0jZGVmaW5lIEYwOTAwX1AyX1NQWV9DTlVMTFBLVCAgMHhmM2EyMDAyMAotI2RlZmluZSBGMDkwMF9QMl9TUFlfT1VUREFUQV9NT0RFICAweGYzYTIwMDFmCisjZGVmaW5lIFIwOTAwX1AyX0ZTUFlEQVRBIDB4ZjNhMgorI2RlZmluZSBGMDkwMF9QMl9TUFlfU1RVRkZJTkcgMHhmM2EyMDA4MAorI2RlZmluZSBGMDkwMF9QMl9TUFlfQ05VTExQS1QgMHhmM2EyMDAyMAorI2RlZmluZSBGMDkwMF9QMl9TUFlfT1VUREFUQV9NT0RFIDB4ZjNhMjAwMWYKIAogLypQMl9GU1BZT1VUKi8KLSNkZWZpbmUgUjA5MDBfUDJfRlNQWU9VVCAgMHhmM2EzCi0jZGVmaW5lIEYwOTAwX1AyX0ZTUFlfRElSRUNUICAweGYzYTMwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1NQWV9PVVREQVRBX0JVUyAgMHhmM2EzMDAzOAotI2RlZmluZSBGMDkwMF9QMl9TVFVGRl9NT0RFICAweGYzYTMwMDA3CisjZGVmaW5lIFIwOTAwX1AyX0ZTUFlPVVQgMHhmM2EzCisjZGVmaW5lIEYwOTAwX1AyX0ZTUFlfRElSRUNUIDB4ZjNhMzAwODAKKyNkZWZpbmUgRjA5MDBfUDJfU1RVRkZfTU9ERSAweGYzYTMwMDA3CiAKIC8qUDJfRlNUQVRVUyovCi0jZGVmaW5lIFIwOTAwX1AyX0ZTVEFUVVMgIDB4ZjNhNAotI2RlZmluZSBGMDkwMF9QMl9TUFlfRU5EU0lNICAweGYzYTQwMDgwCi0jZGVmaW5lIEYwOTAwX1AyX1ZBTElEX1NJTSAgMHhmM2E0MDA0MAotI2RlZmluZSBGMDkwMF9QMl9GT1VORF9TSUdOQUwgIDB4ZjNhNDAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfRFNTX1NZTkNCWVRFICAweGYzYTQwMDEwCi0jZGVmaW5lIEYwOTAwX1AyX1JFU1VMVF9TVEFURSAgMHhmM2E0MDAwZgorI2RlZmluZSBSMDkwMF9QMl9GU1RBVFVTIDB4ZjNhNAorI2RlZmluZSBGMDkwMF9QMl9TUFlfRU5EU0lNIDB4ZjNhNDAwODAKKyNkZWZpbmUgRjA5MDBfUDJfVkFMSURfU0lNIDB4ZjNhNDAwNDAKKyNkZWZpbmUgRjA5MDBfUDJfRk9VTkRfU0lHTkFMIDB4ZjNhNDAwMjAKKyNkZWZpbmUgRjA5MDBfUDJfRFNTX1NZTkNCWVRFIDB4ZjNhNDAwMTAKKyNkZWZpbmUgRjA5MDBfUDJfUkVTVUxUX1NUQVRFIDB4ZjNhNDAwMGYKIAogLypQMl9GQkVSQ1BUNCovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJDUFQ0ICAweGYzYTgKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0NQVDQgIDB4ZjNhODAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkNQVDQgMHhmM2E4CisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9DUFQ0IDB4ZjNhODAwZmYKIAogLypQMl9GQkVSQ1BUMyovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJDUFQzICAweGYzYTkKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0NQVDMgIDB4ZjNhOTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkNQVDMgMHhmM2E5CisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9DUFQzIDB4ZjNhOTAwZmYKIAogLypQMl9GQkVSQ1BUMiovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJDUFQyICAweGYzYWEKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0NQVDIgIDB4ZjNhYTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkNQVDIgMHhmM2FhCisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9DUFQyIDB4ZjNhYTAwZmYKIAogLypQMl9GQkVSQ1BUMSovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJDUFQxICAweGYzYWIKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0NQVDEgIDB4ZjNhYjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkNQVDEgMHhmM2FiCisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9DUFQxIDB4ZjNhYjAwZmYKIAogLypQMl9GQkVSQ1BUMCovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJDUFQwICAweGYzYWMKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0NQVDAgIDB4ZjNhYzAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkNQVDAgMHhmM2FjCisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9DUFQwIDB4ZjNhYzAwZmYKIAogLypQMl9GQkVSRVJSMiovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJFUlIyICAweGYzYWQKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0VSUjIgIDB4ZjNhZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkVSUjIgMHhmM2FkCisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9FUlIyIDB4ZjNhZDAwZmYKIAogLypQMl9GQkVSRVJSMSovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJFUlIxICAweGYzYWUKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0VSUjEgIDB4ZjNhZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkVSUjEgMHhmM2FlCisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9FUlIxIDB4ZjNhZTAwZmYKIAogLypQMl9GQkVSRVJSMCovCi0jZGVmaW5lIFIwOTAwX1AyX0ZCRVJFUlIwICAweGYzYWYKLSNkZWZpbmUgRjA5MDBfUDJfRkJFUk1FVEVSX0VSUjAgIDB4ZjNhZjAwZmYKKyNkZWZpbmUgUjA5MDBfUDJfRkJFUkVSUjAgMHhmM2FmCisjZGVmaW5lIEYwOTAwX1AyX0ZCRVJNRVRFUl9FUlIwIDB4ZjNhZjAwZmYKIAogLypQMl9GU1BZQkVSKi8KLSNkZWZpbmUgUjA5MDBfUDJfRlNQWUJFUiAgMHhmM2IyCi0jZGVmaW5lIEYwOTAwX1AyX0ZTUFlPQlNfWE9SUkVBRCAgMHhmM2IyMDA0MAotI2RlZmluZSBGMDkwMF9QMl9GU1BZQkVSX09CU01PREUgIDB4ZjNiMjAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfRlNQWUJFUl9TWU5DQllURSAgMHhmM2IyMDAxMAotI2RlZmluZSBGMDkwMF9QMl9GU1BZQkVSX1VOU1lOQyAgMHhmM2IyMDAwOAotI2RlZmluZSBGMDkwMF9QMl9GU1BZQkVSX0NUSU1FICAweGYzYjIwMDA3CisjZGVmaW5lIFIwOTAwX1AyX0ZTUFlCRVIgMHhmM2IyCisjZGVmaW5lIEYwOTAwX1AyX0ZTUFlCRVJfU1lOQ0JZVEUgMHhmM2IyMDAxMAorI2RlZmluZSBGMDkwMF9QMl9GU1BZQkVSX1VOU1lOQyAweGYzYjIwMDA4CisjZGVmaW5lIEYwOTAwX1AyX0ZTUFlCRVJfQ1RJTUUgMHhmM2IyMDAwNwogCiAvKlAxX0lRQ09OU1QqLwotI2RlZmluZSBSMDkwMF9QMV9JUUNPTlNUICAweGY0MDAKLSNkZWZpbmUgRjA5MDBfUDFfQ09OU1RFTF9TRUxFQ1QgIDB4ZjQwMDAwNjAKLSNkZWZpbmUgRjA5MDBfUDFfSVFTWU1CX1NFTCAgMHhmNDAwMDAxZgorI2RlZmluZSBSMDkwMF9QMV9JUUNPTlNUIDB4ZjQwMAorI2RlZmluZSBJUUNPTlNUIFJFR3goUjA5MDBfUDFfSVFDT05TVCkKKyNkZWZpbmUgRjA5MDBfUDFfQ09OU1RFTF9TRUxFQ1QgMHhmNDAwMDA2MAorI2RlZmluZSBGMDkwMF9QMV9JUVNZTUJfU0VMIDB4ZjQwMDAwMWYKIAogLypQMV9OT1NDRkcqLwotI2RlZmluZSBSMDkwMF9QMV9OT1NDRkcgIDB4ZjQwMQotI2RlZmluZSBGMDkwMF9QMV9EVU1NWVBMX05PU0RBVEEgIDB4ZjQwMTAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfTk9TUExIX0JFVEEgIDB4ZjQwMTAwMTgKLSNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQV9CRVRBICAweGY0MDEwMDA3CisjZGVmaW5lIFIwOTAwX1AxX05PU0NGRyAweGY0MDEKKyNkZWZpbmUgTk9TQ0ZHIFJFR3goUjA5MDBfUDFfTk9TQ0ZHKQorI2RlZmluZSBGMDkwMF9QMV9EVU1NWVBMX05PU0RBVEEgMHhmNDAxMDAyMAorI2RlZmluZSBGMDkwMF9QMV9OT1NQTEhfQkVUQSAweGY0MDEwMDE4CisjZGVmaW5lIEYwOTAwX1AxX05PU0RBVEFfQkVUQSAweGY0MDEwMDA3CiAKIC8qUDFfSVNZTUIqLwotI2RlZmluZSBSMDkwMF9QMV9JU1lNQiAgMHhmNDAyCi0jZGVmaW5lIEYwOTAwX1AxX0lfU1lNQk9MICAweGY0MDIwMWZmCisjZGVmaW5lIFIwOTAwX1AxX0lTWU1CIDB4ZjQwMgorI2RlZmluZSBJU1lNQiBSRUd4KFIwOTAwX1AxX0lTWU1CKQorI2RlZmluZSBGMDkwMF9QMV9JX1NZTUJPTCAweGY0MDIwMWZmCiAKIC8qUDFfUVNZTUIqLwotI2RlZmluZSBSMDkwMF9QMV9RU1lNQiAgMHhmNDAzCi0jZGVmaW5lIEYwOTAwX1AxX1FfU1lNQk9MICAweGY0MDMwMWZmCisjZGVmaW5lIFIwOTAwX1AxX1FTWU1CIDB4ZjQwMworI2RlZmluZSBRU1lNQiBSRUd4KFIwOTAwX1AxX1FTWU1CKQorI2RlZmluZSBGMDkwMF9QMV9RX1NZTUJPTCAweGY0MDMwMWZmCiAKIC8qUDFfQUdDMUNGRyovCi0jZGVmaW5lIFIwOTAwX1AxX0FHQzFDRkcgIDB4ZjQwNAotI2RlZmluZSBGMDkwMF9QMV9EQ19GUk9aRU4gIDB4ZjQwNDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfRENfQ09SUkVDVCAgMHhmNDA0MDA0MAotI2RlZmluZSBGMDkwMF9QMV9BTU1fRlJPWkVOICAweGY0MDQwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX0FNTV9DT1JSRUNUICAweGY0MDQwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX1FVQURfRlJPWkVOICAweGY0MDQwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX1FVQURfQ09SUkVDVCAgMHhmNDA0MDAwNAotI2RlZmluZSBGMDkwMF9QMV9EQ0NPTVBfU0xPVyAgMHhmNDA0MDAwMgotI2RlZmluZSBGMDkwMF9QMV9JUU1JU01fU0xPVyAgMHhmNDA0MDAwMQorI2RlZmluZSBSMDkwMF9QMV9BR0MxQ0ZHIDB4ZjQwNAorI2RlZmluZSBBR0MxQ0ZHIFJFR3goUjA5MDBfUDFfQUdDMUNGRykKKyNkZWZpbmUgRjA5MDBfUDFfRENfRlJPWkVOIDB4ZjQwNDAwODAKKyNkZWZpbmUgRjA5MDBfUDFfRENfQ09SUkVDVCAweGY0MDQwMDQwCisjZGVmaW5lIEYwOTAwX1AxX0FNTV9GUk9aRU4gMHhmNDA0MDAyMAorI2RlZmluZSBGMDkwMF9QMV9BTU1fQ09SUkVDVCAweGY0MDQwMDEwCisjZGVmaW5lIEYwOTAwX1AxX1FVQURfRlJPWkVOIDB4ZjQwNDAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfUVVBRF9DT1JSRUNUIDB4ZjQwNDAwMDQKIAogLypQMV9BR0MxQ04qLwotI2RlZmluZSBSMDkwMF9QMV9BR0MxQ04gIDB4ZjQwNgotI2RlZmluZSBGMDkwMF9QMV9BR0MxX0xPQ0tFRCAgMHhmNDA2MDA4MAotI2RlZmluZSBGMDkwMF9QMV9BR0MxX09WRVJGTE9XICAweGY0MDYwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0FHQzFfTk9TTE9XTEsgIDB4ZjQwNjAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfQUdDMV9NSU5QT1dFUiAgMHhmNDA2MDAxMAotI2RlZmluZSBGMDkwMF9QMV9BR0NPVVRfRkFTVCAgMHhmNDA2MDAwOAotI2RlZmluZSBGMDkwMF9QMV9BR0NJUV9CRVRBICAweGY0MDYwMDA3CisjZGVmaW5lIFIwOTAwX1AxX0FHQzFDTiAweGY0MDYKKyNkZWZpbmUgQUdDMUNOIFJFR3goUjA5MDBfUDFfQUdDMUNOKQorI2RlZmluZSBGMDkwMF9QMV9BR0MxX0xPQ0tFRCAweGY0MDYwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0FHQzFfTUlOUE9XRVIgMHhmNDA2MDAxMAorI2RlZmluZSBGMDkwMF9QMV9BR0NPVVRfRkFTVCAweGY0MDYwMDA4CisjZGVmaW5lIEYwOTAwX1AxX0FHQ0lRX0JFVEEgMHhmNDA2MDAwNwogCiAvKlAxX0FHQzFSRUYqLwotI2RlZmluZSBSMDkwMF9QMV9BR0MxUkVGICAweGY0MDcKLSNkZWZpbmUgRjA5MDBfUDFfQUdDSVFfUkVGICAweGY0MDcwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0FHQzFSRUYgMHhmNDA3CisjZGVmaW5lIEFHQzFSRUYgUkVHeChSMDkwMF9QMV9BR0MxUkVGKQorI2RlZmluZSBGMDkwMF9QMV9BR0NJUV9SRUYgMHhmNDA3MDBmZgogCiAvKlAxX0lEQ0NPTVAqLwotI2RlZmluZSBSMDkwMF9QMV9JRENDT01QICAweGY0MDgKLSNkZWZpbmUgRjA5MDBfUDFfSUFWRVJBR0VfQURKICAweGY0MDgwMWZmCisjZGVmaW5lIFIwOTAwX1AxX0lEQ0NPTVAgMHhmNDA4CisjZGVmaW5lIElEQ0NPTVAgUkVHeChSMDkwMF9QMV9JRENDT01QKQorI2RlZmluZSBGMDkwMF9QMV9JQVZFUkFHRV9BREogMHhmNDA4MDFmZgogCiAvKlAxX1FEQ0NPTVAqLwotI2RlZmluZSBSMDkwMF9QMV9RRENDT01QICAweGY0MDkKLSNkZWZpbmUgRjA5MDBfUDFfUUFWRVJBR0VfQURKICAweGY0MDkwMWZmCisjZGVmaW5lIFIwOTAwX1AxX1FEQ0NPTVAgMHhmNDA5CisjZGVmaW5lIFFEQ0NPTVAgUkVHeChSMDkwMF9QMV9RRENDT01QKQorI2RlZmluZSBGMDkwMF9QMV9RQVZFUkFHRV9BREogMHhmNDA5MDFmZgogCiAvKlAxX1BPV0VSSSovCi0jZGVmaW5lIFIwOTAwX1AxX1BPV0VSSSAgMHhmNDBhCi0jZGVmaW5lIEYwOTAwX1AxX1BPV0VSX0kgIDB4ZjQwYTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfUE9XRVJJIDB4ZjQwYQorI2RlZmluZSBQT1dFUkkgUkVHeChSMDkwMF9QMV9QT1dFUkkpCisjZGVmaW5lIEYwOTAwX1AxX1BPV0VSX0kgMHhmNDBhMDBmZgorI2RlZmluZSBQT1dFUl9JIEZMRHgoRjA5MDBfUDFfUE9XRVJfSSkKIAogLypQMV9QT1dFUlEqLwotI2RlZmluZSBSMDkwMF9QMV9QT1dFUlEgIDB4ZjQwYgotI2RlZmluZSBGMDkwMF9QMV9QT1dFUl9RICAweGY0MGIwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1BPV0VSUSAweGY0MGIKKyNkZWZpbmUgUE9XRVJRIFJFR3goUjA5MDBfUDFfUE9XRVJRKQorI2RlZmluZSBGMDkwMF9QMV9QT1dFUl9RIDB4ZjQwYjAwZmYKKyNkZWZpbmUgUE9XRVJfUSBGTER4KEYwOTAwX1AxX1BPV0VSX1EpCiAKIC8qUDFfQUdDMUFNTSovCi0jZGVmaW5lIFIwOTAwX1AxX0FHQzFBTU0gIDB4ZjQwYwotI2RlZmluZSBGMDkwMF9QMV9BTU1fVkFMVUUgIDB4ZjQwYzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfQUdDMUFNTSAweGY0MGMKKyNkZWZpbmUgQUdDMUFNTSBSRUd4KFIwOTAwX1AxX0FHQzFBTU0pCisjZGVmaW5lIEYwOTAwX1AxX0FNTV9WQUxVRSAweGY0MGMwMGZmCiAKIC8qUDFfQUdDMVFVQUQqLwotI2RlZmluZSBSMDkwMF9QMV9BR0MxUVVBRCAgMHhmNDBkCi0jZGVmaW5lIEYwOTAwX1AxX1FVQURfVkFMVUUgIDB4ZjQwZDAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfQUdDMVFVQUQgMHhmNDBkCisjZGVmaW5lIEFHQzFRVUFEIFJFR3goUjA5MDBfUDFfQUdDMVFVQUQpCisjZGVmaW5lIEYwOTAwX1AxX1FVQURfVkFMVUUgMHhmNDBkMDFmZgogCiAvKlAxX0FHQ0lRSU4xKi8KLSNkZWZpbmUgUjA5MDBfUDFfQUdDSVFJTjEgIDB4ZjQwZQotI2RlZmluZSBGMDkwMF9QMV9BR0NJUV9WQUxVRTEgIDB4ZjQwZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfQUdDSVFJTjEgMHhmNDBlCisjZGVmaW5lIEFHQ0lRSU4xIFJFR3goUjA5MDBfUDFfQUdDSVFJTjEpCisjZGVmaW5lIEYwOTAwX1AxX0FHQ0lRX1ZBTFVFMSAweGY0MGUwMGZmCisjZGVmaW5lIEFHQ0lRX1ZBTFVFMSBGTER4KEYwOTAwX1AxX0FHQ0lRX1ZBTFVFMSkKIAogLypQMV9BR0NJUUlOMCovCi0jZGVmaW5lIFIwOTAwX1AxX0FHQ0lRSU4wICAweGY0MGYKLSNkZWZpbmUgRjA5MDBfUDFfQUdDSVFfVkFMVUUwICAweGY0MGYwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0FHQ0lRSU4wIDB4ZjQwZgorI2RlZmluZSBBR0NJUUlOMCBSRUd4KFIwOTAwX1AxX0FHQ0lRSU4wKQorI2RlZmluZSBGMDkwMF9QMV9BR0NJUV9WQUxVRTAgMHhmNDBmMDBmZgorI2RlZmluZSBBR0NJUV9WQUxVRTAgRkxEeChGMDkwMF9QMV9BR0NJUV9WQUxVRTApCiAKIC8qUDFfREVNT0QqLwotI2RlZmluZSBSMDkwMF9QMV9ERU1PRCAgMHhmNDEwCi0jZGVmaW5lIEYwOTAwX1AxX0RFTU9EX1NUT1AgIDB4ZjQxMDAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfU1BFQ0lOVl9DT05UUk9MICAweGY0MTAwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX0ZPUkNFX0VOQVNBTVAgIDB4ZjQxMDAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfTUFOVUFMX1JPTExPRkYgIDB4ZjQxMDAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfUk9MTE9GRl9DT05UUk9MICAweGY0MTAwMDAzCisjZGVmaW5lIFIwOTAwX1AxX0RFTU9EIDB4ZjQxMAorI2RlZmluZSBERU1PRCBSRUd4KFIwOTAwX1AxX0RFTU9EKQorI2RlZmluZSBGMDkwMF9QMV9NQU5VQUxTMl9ST0xMT0ZGIDB4ZjQxMDAwODAKKyNkZWZpbmUgTUFOVUFMUzJfUk9MTE9GRiBGTER4KEYwOTAwX1AxX01BTlVBTFMyX1JPTExPRkYpCisKKyNkZWZpbmUgRjA5MDBfUDFfU1BFQ0lOVl9DT05UUk9MIDB4ZjQxMDAwMzAKKyNkZWZpbmUgU1BFQ0lOVl9DT05UUk9MIEZMRHgoRjA5MDBfUDFfU1BFQ0lOVl9DT05UUk9MKQorI2RlZmluZSBGMDkwMF9QMV9GT1JDRV9FTkFTQU1QIDB4ZjQxMDAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfTUFOVUFMU1hfUk9MTE9GRiAweGY0MTAwMDA0CisjZGVmaW5lIE1BTlVBTFNYX1JPTExPRkYgRkxEeChGMDkwMF9QMV9NQU5VQUxTWF9ST0xMT0ZGKQorI2RlZmluZSBGMDkwMF9QMV9ST0xMT0ZGX0NPTlRST0wgMHhmNDEwMDAwMworI2RlZmluZSBST0xMT0ZGX0NPTlRST0wgRkxEeChGMDkwMF9QMV9ST0xMT0ZGX0NPTlRST0wpCiAKIC8qUDFfRE1ETU9EQ09EKi8KLSNkZWZpbmUgUjA5MDBfUDFfRE1ETU9EQ09EICAweGY0MTEKLSNkZWZpbmUgRjA5MDBfUDFfTUFOVUFMX01PRENPRCAgMHhmNDExMDA4MAotI2RlZmluZSBGMDkwMF9QMV9ERU1PRF9NT0RDT0QgIDB4ZjQxMTAwN2MKLSNkZWZpbmUgRjA5MDBfUDFfREVNT0RfVFlQRSAgMHhmNDExMDAwMworI2RlZmluZSBSMDkwMF9QMV9ETURNT0RDT0QgMHhmNDExCisjZGVmaW5lIERNRE1PRENPRCBSRUd4KFIwOTAwX1AxX0RNRE1PRENPRCkKKyNkZWZpbmUgRjA5MDBfUDFfTUFOVUFMX01PRENPRCAweGY0MTEwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0RFTU9EX01PRENPRCAweGY0MTEwMDdjCisjZGVmaW5lIERFTU9EX01PRENPRCBGTER4KEYwOTAwX1AxX0RFTU9EX01PRENPRCkKKyNkZWZpbmUgRjA5MDBfUDFfREVNT0RfVFlQRSAweGY0MTEwMDAzCisjZGVmaW5lIERFTU9EX1RZUEUgRkxEeChGMDkwMF9QMV9ERU1PRF9UWVBFKQogCiAvKlAxX0RTVEFUVVMqLwotI2RlZmluZSBSMDkwMF9QMV9EU1RBVFVTICAweGY0MTIKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSX0xPQ0sgIDB4ZjQxMjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfVE1HTE9DS19RVUFMSVRZICAweGY0MTIwMDYwCi0jZGVmaW5lIEYwOTAwX1AxX1NEVkJTMV9FTkFCTEUgIDB4ZjQxMjAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfTE9DS19ERUZJTklUSUYgIDB4ZjQxMjAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfVElNSU5HX0lTX0xPQ0tFRCAgMHhmNDEyMDAwNAotI2RlZmluZSBGMDkwMF9QMV9DT0FSU0VfVE1HTE9DSyAgMHhmNDEyMDAwMgotI2RlZmluZSBGMDkwMF9QMV9DT0FSU0VfQ0FSTE9DSyAgMHhmNDEyMDAwMQorI2RlZmluZSBSMDkwMF9QMV9EU1RBVFVTIDB4ZjQxMgorI2RlZmluZSBEU1RBVFVTIFJFR3goUjA5MDBfUDFfRFNUQVRVUykKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSX0xPQ0sgMHhmNDEyMDA4MAorI2RlZmluZSBGMDkwMF9QMV9UTUdMT0NLX1FVQUxJVFkgMHhmNDEyMDA2MAorI2RlZmluZSBUTUdMT0NLX1FVQUxJVFkgRkxEeChGMDkwMF9QMV9UTUdMT0NLX1FVQUxJVFkpCisjZGVmaW5lIEYwOTAwX1AxX0xPQ0tfREVGSU5JVElGIDB4ZjQxMjAwMDgKKyNkZWZpbmUgTE9DS19ERUZJTklUSUYgRkxEeChGMDkwMF9QMV9MT0NLX0RFRklOSVRJRikKKyNkZWZpbmUgRjA5MDBfUDFfT1ZBRENfREVURUNUIDB4ZjQxMjAwMDEKIAogLypQMV9EU1RBVFVTMiovCi0jZGVmaW5lIFIwOTAwX1AxX0RTVEFUVVMyICAweGY0MTMKLSNkZWZpbmUgRjA5MDBfUDFfREVNT0RfREVMT0NLICAweGY0MTMwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0RFTU9EX1RJTUVPVVQgIDB4ZjQxMzAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfTU9EQ09EUlFfU1lOQ1RBRyAgMHhmNDEzMDAyMAotI2RlZmluZSBGMDkwMF9QMV9QT0xZUEhfU0FURVZFTlQgIDB4ZjQxMzAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfQUdDMV9OT1NJR05BTEFDSyAgMHhmNDEzMDAwOAotI2RlZmluZSBGMDkwMF9QMV9BR0MyX09WRVJGTE9XICAweGY0MTMwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX0NGUl9PVkVSRkxPVyAgMHhmNDEzMDAwMgotI2RlZmluZSBGMDkwMF9QMV9HQU1NQV9PVkVSVU5ERVIgIDB4ZjQxMzAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfRFNUQVRVUzIgMHhmNDEzCisjZGVmaW5lIERTVEFUVVMyIFJFR3goUjA5MDBfUDFfRFNUQVRVUzIpCisjZGVmaW5lIEYwOTAwX1AxX0RFTU9EX0RFTE9DSyAweGY0MTMwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0FHQzFfTk9TSUdOQUxBQ0sgMHhmNDEzMDAwOAorI2RlZmluZSBGMDkwMF9QMV9BR0MyX09WRVJGTE9XIDB4ZjQxMzAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfQ0ZSX09WRVJGTE9XIDB4ZjQxMzAwMDIKKyNkZWZpbmUgRjA5MDBfUDFfR0FNTUFfT1ZFUlVOREVSIDB4ZjQxMzAwMDEKIAogLypQMV9ETURDRkdNRCovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRENGR01EICAweGY0MTQKLSNkZWZpbmUgRjA5MDBfUDFfRFZCUzJfRU5BQkxFICAweGY0MTQwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0RWQlMxX0VOQUJMRSAgMHhmNDE0MDA0MAotI2RlZmluZSBGMDkwMF9QMV9DRlJfQVVUT1NDQU4gIDB4ZjQxNDAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfU0NBTl9FTkFCTEUgIDB4ZjQxNDAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfVFVOX0FVVE9TQ0FOICAweGY0MTQwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX05PRk9SQ0VfUkVMT0NLICAweGY0MTQwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX1RVTl9STkcgIDB4ZjQxNDAwMDMKKyNkZWZpbmUgUjA5MDBfUDFfRE1EQ0ZHTUQgMHhmNDE0CisjZGVmaW5lIERNRENGR01EIFJFR3goUjA5MDBfUDFfRE1EQ0ZHTUQpCisjZGVmaW5lIEYwOTAwX1AxX0RWQlMyX0VOQUJMRSAweGY0MTQwMDgwCisjZGVmaW5lIERWQlMyX0VOQUJMRSBGTER4KEYwOTAwX1AxX0RWQlMyX0VOQUJMRSkKKyNkZWZpbmUgRjA5MDBfUDFfRFZCUzFfRU5BQkxFIDB4ZjQxNDAwNDAKKyNkZWZpbmUgRFZCUzFfRU5BQkxFIEZMRHgoRjA5MDBfUDFfRFZCUzFfRU5BQkxFKQorI2RlZmluZSBGMDkwMF9QMV9TQ0FOX0VOQUJMRSAweGY0MTQwMDEwCisjZGVmaW5lIFNDQU5fRU5BQkxFIEZMRHgoRjA5MDBfUDFfU0NBTl9FTkFCTEUpCisjZGVmaW5lIEYwOTAwX1AxX0NGUl9BVVRPU0NBTiAweGY0MTQwMDA4CisjZGVmaW5lIENGUl9BVVRPU0NBTiBGTER4KEYwOTAwX1AxX0NGUl9BVVRPU0NBTikKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JORyAweGY0MTQwMDAzCiAKIC8qUDFfRE1EQ0ZHMiovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRENGRzIgIDB4ZjQxNQotI2RlZmluZSBGMDkwMF9QMV9BR0MxX1dBSVRMT0NLICAweGY0MTUwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1MxUzJfU0VRVUVOVElBTCAgMHhmNDE1MDA0MAotI2RlZmluZSBGMDkwMF9QMV9PVkVSRkxPV19USU1FT1VUICAweGY0MTUwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX1NDQU5GQUlMX1RJTUVPVVQgIDB4ZjQxNTAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfRE1EVE9VVF9CQUNLICAweGY0MTUwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0NBUkxPQ0tfUzFFTkFCTEUgIDB4ZjQxNTAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfQ09BUlNFX0xLM01PREUgIDB4ZjQxNTAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfQ09BUlNFX0xLMk1PREUgIDB4ZjQxNTAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfRE1EQ0ZHMiAweGY0MTUKKyNkZWZpbmUgRE1EQ0ZHMiBSRUd4KFIwOTAwX1AxX0RNRENGRzIpCisjZGVmaW5lIEYwOTAwX1AxX1MxUzJfU0VRVUVOVElBTCAweGY0MTUwMDQwCisjZGVmaW5lIFMxUzJfU0VRVUVOVElBTCBGTER4KEYwOTAwX1AxX1MxUzJfU0VRVUVOVElBTCkKKyNkZWZpbmUgRjA5MDBfUDFfSU5GSU5JVEVfUkVMT0NLIDB4ZjQxNTAwMTAKIAogLypQMV9ETURJU1RBVEUqLwotI2RlZmluZSBSMDkwMF9QMV9ETURJU1RBVEUgIDB4ZjQxNgotI2RlZmluZSBGMDkwMF9QMV9JMkNfTk9SRVNFVERNT0RFICAweGY0MTYwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0ZPUkNFX0VUQVBFRCAgMHhmNDE2MDA0MAotI2RlZmluZSBGMDkwMF9QMV9TRE1EUlNUX0RJUkNMSyAgMHhmNDE2MDAyMAotI2RlZmluZSBGMDkwMF9QMV9JMkNfREVNT0RfTU9ERSAgMHhmNDE2MDAxZgorI2RlZmluZSBSMDkwMF9QMV9ETURJU1RBVEUgMHhmNDE2CisjZGVmaW5lIERNRElTVEFURSBSRUd4KFIwOTAwX1AxX0RNRElTVEFURSkKKyNkZWZpbmUgRjA5MDBfUDFfSTJDX0RFTU9EX01PREUgMHhmNDE2MDAxZgorI2RlZmluZSBERU1PRF9NT0RFIEZMRHgoRjA5MDBfUDFfSTJDX0RFTU9EX01PREUpCiAKIC8qUDFfRE1EVDBNKi8KLSNkZWZpbmUgUjA5MDBfUDFfRE1EVDBNICAweGY0MTcKLSNkZWZpbmUgRjA5MDBfUDFfRE1EVDBfTUlOICAweGY0MTcwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0RNRFQwTSAweGY0MTcKKyNkZWZpbmUgRE1EVDBNIFJFR3goUjA5MDBfUDFfRE1EVDBNKQorI2RlZmluZSBGMDkwMF9QMV9ETURUMF9NSU4gMHhmNDE3MDBmZgogCiAvKlAxX0RNRFNUQVRFKi8KLSNkZWZpbmUgUjA5MDBfUDFfRE1EU1RBVEUgIDB4ZjQxYgotI2RlZmluZSBGMDkwMF9QMV9ERU1PRF9MT0NLRUQgIDB4ZjQxYjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfSEVBREVSX01PREUgIDB4ZjQxYjAwNjAKLSNkZWZpbmUgRjA5MDBfUDFfREVNT0RfTU9ERSAgMHhmNDFiMDAxZgorI2RlZmluZSBSMDkwMF9QMV9ETURTVEFURSAweGY0MWIKKyNkZWZpbmUgRE1EU1RBVEUgUkVHeChSMDkwMF9QMV9ETURTVEFURSkKKyNkZWZpbmUgRjA5MDBfUDFfSEVBREVSX01PREUgMHhmNDFiMDA2MAorI2RlZmluZSBIRUFERVJfTU9ERSBGTER4KEYwOTAwX1AxX0hFQURFUl9NT0RFKQogCiAvKlAxX0RNREZMWVcqLwotI2RlZmluZSBSMDkwMF9QMV9ETURGTFlXICAweGY0MWMKLSNkZWZpbmUgRjA5MDBfUDFfSTJDX0lSUVZBTCAgMHhmNDFjMDBmMAotI2RlZmluZSBGMDkwMF9QMV9GTFlXSEVFTF9DUFQgIDB4ZjQxYzAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfRE1ERkxZVyAweGY0MWMKKyNkZWZpbmUgRE1ERkxZVyBSRUd4KFIwOTAwX1AxX0RNREZMWVcpCisjZGVmaW5lIEYwOTAwX1AxX0kyQ19JUlFWQUwgMHhmNDFjMDBmMAorI2RlZmluZSBGMDkwMF9QMV9GTFlXSEVFTF9DUFQgMHhmNDFjMDAwZgorI2RlZmluZSBGTFlXSEVFTF9DUFQgRkxEeChGMDkwMF9QMV9GTFlXSEVFTF9DUFQpCiAKIC8qUDFfRFNUQVRVUzMqLwotI2RlZmluZSBSMDkwMF9QMV9EU1RBVFVTMyAgMHhmNDFkCi0jZGVmaW5lIEYwOTAwX1AxX0NGUl9aSUdaQUcgIDB4ZjQxZDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfREVNT0RfQ0ZHTU9ERSAgMHhmNDFkMDA2MAotI2RlZmluZSBGMDkwMF9QMV9HQU1NQV9MT1dCQVVEUkFURSAgMHhmNDFkMDAxMAotI2RlZmluZSBGMDkwMF9QMV9SRUxPQ0tfTU9ERSAgMHhmNDFkMDAwOAotI2RlZmluZSBGMDkwMF9QMV9ERU1PRF9GQUlMICAweGY0MWQwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX0VUQVBFMUFfRFZCWE1FTSAgMHhmNDFkMDAwMworI2RlZmluZSBSMDkwMF9QMV9EU1RBVFVTMyAweGY0MWQKKyNkZWZpbmUgRFNUQVRVUzMgUkVHeChSMDkwMF9QMV9EU1RBVFVTMykKKyNkZWZpbmUgRjA5MDBfUDFfREVNT0RfQ0ZHTU9ERSAweGY0MWQwMDYwCiAKIC8qUDFfRE1EQ0ZHMyovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRENGRzMgIDB4ZjQxZQotI2RlZmluZSBGMDkwMF9QMV9EVkJTMV9UTUdXQUlUICAweGY0MWUwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX05PX0JXQ0VOVEVSSU5HICAweGY0MWUwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0lOVl9TRVFTUkNIICAweGY0MWUwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19TRlJVUExPV19UUksgIDB4ZjQxZTAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfTk9TVE9QX0ZJRk9GVUxMICAweGY0MWUwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0xPQ0tUSU1FX01PREUgIDB4ZjQxZTAwMDcKKyNkZWZpbmUgUjA5MDBfUDFfRE1EQ0ZHMyAweGY0MWUKKyNkZWZpbmUgRE1EQ0ZHMyBSRUd4KFIwOTAwX1AxX0RNRENGRzMpCisjZGVmaW5lIEYwOTAwX1AxX05PU1RPUF9GSUZPRlVMTCAweGY0MWUwMDA4CiAKIC8qUDFfRE1EQ0ZHNCovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRENGRzQgIDB4ZjQxZgotI2RlZmluZSBGMDkwMF9QMV9UVU5FUl9OUkVMQVVOQ0ggIDB4ZjQxZjAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfRElTX0NMS0VOQUJMRSAgMHhmNDFmMDAwNAotI2RlZmluZSBGMDkwMF9QMV9ESVNfSERSRElWTE9DSyAgMHhmNDFmMDAwMgotI2RlZmluZSBGMDkwMF9QMV9OT19UTlJXQklOSVQgIDB4ZjQxZjAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfRE1EQ0ZHNCAweGY0MWYKKyNkZWZpbmUgRE1EQ0ZHNCBSRUd4KFIwOTAwX1AxX0RNRENGRzQpCisjZGVmaW5lIEYwOTAwX1AxX1RVTkVSX05SRUxBVU5DSCAweGY0MWYwMDA4CiAKIC8qUDFfQ09SUkVMTUFOVCovCi0jZGVmaW5lIFIwOTAwX1AxX0NPUlJFTE1BTlQgIDB4ZjQyMAotI2RlZmluZSBGMDkwMF9QMV9DT1JSRUxfTUFOVCAgMHhmNDIwMDBmZgorI2RlZmluZSBSMDkwMF9QMV9DT1JSRUxNQU5UIDB4ZjQyMAorI2RlZmluZSBDT1JSRUxNQU5UIFJFR3goUjA5MDBfUDFfQ09SUkVMTUFOVCkKKyNkZWZpbmUgRjA5MDBfUDFfQ09SUkVMX01BTlQgMHhmNDIwMDBmZgogCiAvKlAxX0NPUlJFTEFCUyovCi0jZGVmaW5lIFIwOTAwX1AxX0NPUlJFTEFCUyAgMHhmNDIxCi0jZGVmaW5lIEYwOTAwX1AxX0NPUlJFTF9BQlMgIDB4ZjQyMTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfQ09SUkVMQUJTIDB4ZjQyMQorI2RlZmluZSBDT1JSRUxBQlMgUkVHeChSMDkwMF9QMV9DT1JSRUxBQlMpCisjZGVmaW5lIEYwOTAwX1AxX0NPUlJFTF9BQlMgMHhmNDIxMDBmZgogCiAvKlAxX0NPUlJFTEVYUCovCi0jZGVmaW5lIFIwOTAwX1AxX0NPUlJFTEVYUCAgMHhmNDIyCi0jZGVmaW5lIEYwOTAwX1AxX0NPUlJFTF9BQlNFWFAgIDB4ZjQyMjAwZjAKLSNkZWZpbmUgRjA5MDBfUDFfQ09SUkVMX0VYUCAgMHhmNDIyMDAwZgorI2RlZmluZSBSMDkwMF9QMV9DT1JSRUxFWFAgMHhmNDIyCisjZGVmaW5lIENPUlJFTEVYUCBSRUd4KFIwOTAwX1AxX0NPUlJFTEVYUCkKKyNkZWZpbmUgRjA5MDBfUDFfQ09SUkVMX0FCU0VYUCAweGY0MjIwMGYwCisjZGVmaW5lIEYwOTAwX1AxX0NPUlJFTF9FWFAgMHhmNDIyMDAwZgogCiAvKlAxX1BMSE1PRENPRCovCi0jZGVmaW5lIFIwOTAwX1AxX1BMSE1PRENPRCAgMHhmNDI0Ci0jZGVmaW5lIEYwOTAwX1AxX1NQRUNJTlZfREVNT0QgIDB4ZjQyNDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfUExIX01PRENPRCAgMHhmNDI0MDA3YwotI2RlZmluZSBGMDkwMF9QMV9QTEhfVFlQRSAgMHhmNDI0MDAwMworI2RlZmluZSBSMDkwMF9QMV9QTEhNT0RDT0QgMHhmNDI0CisjZGVmaW5lIFBMSE1PRENPRCBSRUd4KFIwOTAwX1AxX1BMSE1PRENPRCkKKyNkZWZpbmUgRjA5MDBfUDFfU1BFQ0lOVl9ERU1PRCAweGY0MjQwMDgwCisjZGVmaW5lIFNQRUNJTlZfREVNT0QgRkxEeChGMDkwMF9QMV9TUEVDSU5WX0RFTU9EKQorI2RlZmluZSBGMDkwMF9QMV9QTEhfTU9EQ09EIDB4ZjQyNDAwN2MKKyNkZWZpbmUgRjA5MDBfUDFfUExIX1RZUEUgMHhmNDI0MDAwMwogCi0vKlAxX0FHQ0szMiovCi0jZGVmaW5lIFIwOTAwX1AxX0FHQ0szMiAgMHhmNDJiCi0jZGVmaW5lIEYwOTAwX1AxX1IzQURKT0ZGXzMyQVBTSyAgMHhmNDJiMDA4MAotI2RlZmluZSBGMDkwMF9QMV9SMkFESk9GRl8zMkFQU0sgIDB4ZjQyYjAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfUjFBREpPRkZfMzJBUFNLICAweGY0MmIwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX1JBREpfMzJBUFNLICAweGY0MmIwMDFmCisvKlAxX0RNRFJFRyovCisjZGVmaW5lIFIwOTAwX1AxX0RNRFJFRyAweGY0MjUKKyNkZWZpbmUgRE1EUkVHIFJFR3goUjA5MDBfUDFfRE1EUkVHKQorI2RlZmluZSBGMDkwMF9QMV9ERUNJTV9QTEZSQU1FUyAweGY0MjUwMDAxCiAKIC8qUDFfQUdDMk8qLwotI2RlZmluZSBSMDkwMF9QMV9BR0MyTyAgMHhmNDJjCi0jZGVmaW5lIEYwOTAwX1AxX0FHQzJSRUZfQURKVVNUSU5HICAweGY0MmMwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0FHQzJfQ09BUlNFRkFTVCAgMHhmNDJjMDA0MAotI2RlZmluZSBGMDkwMF9QMV9BR0MyX0xLU1FSVCAgMHhmNDJjMDAyMAotI2RlZmluZSBGMDkwMF9QMV9BR0MyX0xLTU9ERSAgMHhmNDJjMDAxMAotI2RlZmluZSBGMDkwMF9QMV9BR0MyX0xLRVFVQSAgMHhmNDJjMDAwOAotI2RlZmluZSBGMDkwMF9QMV9BR0MyX0NPRUYgIDB4ZjQyYzAwMDcKKyNkZWZpbmUgUjA5MDBfUDFfQUdDMk8gMHhmNDJjCisjZGVmaW5lIEFHQzJPIFJFR3goUjA5MDBfUDFfQUdDMk8pCisjZGVmaW5lIEYwOTAwX1AxX0FHQzJfQ09FRiAweGY0MmMwMDA3CiAKIC8qUDFfQUdDMlJFRiovCi0jZGVmaW5lIFIwOTAwX1AxX0FHQzJSRUYgIDB4ZjQyZAotI2RlZmluZSBGMDkwMF9QMV9BR0MyX1JFRiAgMHhmNDJkMDBmZgorI2RlZmluZSBSMDkwMF9QMV9BR0MyUkVGIDB4ZjQyZAorI2RlZmluZSBBR0MyUkVGIFJFR3goUjA5MDBfUDFfQUdDMlJFRikKKyNkZWZpbmUgRjA5MDBfUDFfQUdDMl9SRUYgMHhmNDJkMDBmZgogCiAvKlAxX0FHQzFBREoqLwotI2RlZmluZSBSMDkwMF9QMV9BR0MxQURKICAweGY0MmUKLSNkZWZpbmUgRjA5MDBfUDFfQUdDMUFESl9NQU5VQUwgIDB4ZjQyZTAwODAKLSNkZWZpbmUgRjA5MDBfUDFfQUdDMV9BREpVU1RFRCAgMHhmNDJlMDE3ZgorI2RlZmluZSBSMDkwMF9QMV9BR0MxQURKIDB4ZjQyZQorI2RlZmluZSBBR0MxQURKIFJFR3goUjA5MDBfUDFfQUdDMUFESikKKyNkZWZpbmUgRjA5MDBfUDFfQUdDMV9BREpVU1RFRCAweGY0MmUwMDdmCiAKIC8qUDFfQUdDMkkxKi8KLSNkZWZpbmUgUjA5MDBfUDFfQUdDMkkxICAweGY0MzYKLSNkZWZpbmUgRjA5MDBfUDFfQUdDMl9JTlRFR1JBVE9SMSAgMHhmNDM2MDBmZgorI2RlZmluZSBSMDkwMF9QMV9BR0MySTEgMHhmNDM2CisjZGVmaW5lIEFHQzJJMSBSRUd4KFIwOTAwX1AxX0FHQzJJMSkKKyNkZWZpbmUgRjA5MDBfUDFfQUdDMl9JTlRFR1JBVE9SMSAweGY0MzYwMGZmCiAKIC8qUDFfQUdDMkkwKi8KLSNkZWZpbmUgUjA5MDBfUDFfQUdDMkkwICAweGY0MzcKLSNkZWZpbmUgRjA5MDBfUDFfQUdDMl9JTlRFR1JBVE9SMCAgMHhmNDM3MDBmZgorI2RlZmluZSBSMDkwMF9QMV9BR0MySTAgMHhmNDM3CisjZGVmaW5lIEFHQzJJMCBSRUd4KFIwOTAwX1AxX0FHQzJJMCkKKyNkZWZpbmUgRjA5MDBfUDFfQUdDMl9JTlRFR1JBVE9SMCAweGY0MzcwMGZmCiAKIC8qUDFfQ0FSQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfUDFfQ0FSQ0ZHICAweGY0MzgKLSNkZWZpbmUgRjA5MDBfUDFfQ0ZSVVBMT1dfQVVUTyAgMHhmNDM4MDA4MAotI2RlZmluZSBGMDkwMF9QMV9DRlJVUExPV19URVNUICAweGY0MzgwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0VOX0NBUjJDRU5URVIgIDB4ZjQzODAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSSERSX05PRElWOCAgMHhmNDM4MDAxMAotI2RlZmluZSBGMDkwMF9QMV9JMkNfUk9UQSAgMHhmNDM4MDAwOAotI2RlZmluZSBGMDkwMF9QMV9ST1RBT04gIDB4ZjQzODAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfUEhfREVUX0FMR08gIDB4ZjQzODAwMDMKKyNkZWZpbmUgUjA5MDBfUDFfQ0FSQ0ZHIDB4ZjQzOAorI2RlZmluZSBDQVJDRkcgUkVHeChSMDkwMF9QMV9DQVJDRkcpCisjZGVmaW5lIEYwOTAwX1AxX0NGUlVQTE9XX0FVVE8gMHhmNDM4MDA4MAorI2RlZmluZSBGMDkwMF9QMV9DRlJVUExPV19URVNUIDB4ZjQzODAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfUk9UQU9OIDB4ZjQzODAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfUEhfREVUX0FMR08gMHhmNDM4MDAwMwogCiAvKlAxX0FDTEMqLwotI2RlZmluZSBSMDkwMF9QMV9BQ0xDICAweGY0MzkKLSNkZWZpbmUgRjA5MDBfUDFfU1RPUF9TMkFMUEhBICAweGY0MzkwMGMwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUl9BTFBIQV9NQU5UICAweGY0MzkwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUl9BTFBIQV9FWFAgIDB4ZjQzOTAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfQUNMQyAweGY0MzkKKyNkZWZpbmUgQUNMQyBSRUd4KFIwOTAwX1AxX0FDTEMpCisjZGVmaW5lIEYwOTAwX1AxX0NBUl9BTFBIQV9NQU5UIDB4ZjQzOTAwMzAKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSX0FMUEhBX0VYUCAweGY0MzkwMDBmCiAKIC8qUDFfQkNMQyovCi0jZGVmaW5lIFIwOTAwX1AxX0JDTEMgIDB4ZjQzYQotI2RlZmluZSBGMDkwMF9QMV9TVE9QX1MyQkVUQSAgMHhmNDNhMDBjMAotI2RlZmluZSBGMDkwMF9QMV9DQVJfQkVUQV9NQU5UICAweGY0M2EwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUl9CRVRBX0VYUCAgMHhmNDNhMDAwZgorI2RlZmluZSBSMDkwMF9QMV9CQ0xDIDB4ZjQzYQorI2RlZmluZSBCQ0xDIFJFR3goUjA5MDBfUDFfQkNMQykKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSX0JFVEFfTUFOVCAweGY0M2EwMDMwCisjZGVmaW5lIEYwOTAwX1AxX0NBUl9CRVRBX0VYUCAweGY0M2EwMDBmCiAKIC8qUDFfQ0FSRlJFUSovCi0jZGVmaW5lIFIwOTAwX1AxX0NBUkZSRVEgIDB4ZjQzZAotI2RlZmluZSBGMDkwMF9QMV9LQ19DT0FSU0VfRVhQICAweGY0M2QwMGYwCi0jZGVmaW5lIEYwOTAwX1AxX0JFVEFfRlJFUSAgMHhmNDNkMDAwZgorI2RlZmluZSBSMDkwMF9QMV9DQVJGUkVRIDB4ZjQzZAorI2RlZmluZSBDQVJGUkVRIFJFR3goUjA5MDBfUDFfQ0FSRlJFUSkKKyNkZWZpbmUgRjA5MDBfUDFfS0NfQ09BUlNFX0VYUCAweGY0M2QwMGYwCisjZGVmaW5lIEYwOTAwX1AxX0JFVEFfRlJFUSAweGY0M2QwMDBmCiAKIC8qUDFfQ0FSSERSKi8KLSNkZWZpbmUgUjA5MDBfUDFfQ0FSSERSICAweGY0M2UKLSNkZWZpbmUgRjA5MDBfUDFfS19GUkVRX0hEUiAgMHhmNDNlMDBmZgorI2RlZmluZSBSMDkwMF9QMV9DQVJIRFIgMHhmNDNlCisjZGVmaW5lIENBUkhEUiBSRUd4KFIwOTAwX1AxX0NBUkhEUikKKyNkZWZpbmUgRjA5MDBfUDFfS19GUkVRX0hEUiAweGY0M2UwMGZmCiAKIC8qUDFfTERUKi8KLSNkZWZpbmUgUjA5MDBfUDFfTERUICAweGY0M2YKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSTE9DS19USFJFUyAgMHhmNDNmMDFmZgorI2RlZmluZSBSMDkwMF9QMV9MRFQgMHhmNDNmCisjZGVmaW5lIExEVCBSRUd4KFIwOTAwX1AxX0xEVCkKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSTE9DS19USFJFUyAweGY0M2YwMWZmCiAKIC8qUDFfTERUMiovCi0jZGVmaW5lIFIwOTAwX1AxX0xEVDIgIDB4ZjQ0MAotI2RlZmluZSBGMDkwMF9QMV9DQVJMT0NLX1RIUkVTMiAgMHhmNDQwMDFmZgorI2RlZmluZSBSMDkwMF9QMV9MRFQyIDB4ZjQ0MAorI2RlZmluZSBMRFQyIFJFR3goUjA5MDBfUDFfTERUMikKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSTE9DS19USFJFUzIgMHhmNDQwMDFmZgogCiAvKlAxX0NGUklDRkcqLwotI2RlZmluZSBSMDkwMF9QMV9DRlJJQ0ZHICAweGY0NDEKLSNkZWZpbmUgRjA5MDBfUDFfQ0ZSSU5JVF9VTlZBTFJORyAgMHhmNDQxMDA4MAotI2RlZmluZSBGMDkwMF9QMV9DRlJJTklUX0xVTlZBTENQVCAgMHhmNDQxMDA0MAotI2RlZmluZSBGMDkwMF9QMV9DRlJJTklUX0FCT1JUREJMICAweGY0NDEwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX0NGUklOSVRfQUJPUlRQUkVEICAweGY0NDEwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX0NGUklOSVRfVU5WQUxTS0lQICAweGY0NDEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0NGUklOSVRfQ1NUSU5DICAweGY0NDEwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX05FR19DRlJTVEVQICAweGY0NDEwMDAxCisjZGVmaW5lIFIwOTAwX1AxX0NGUklDRkcgMHhmNDQxCisjZGVmaW5lIENGUklDRkcgUkVHeChSMDkwMF9QMV9DRlJJQ0ZHKQorI2RlZmluZSBGMDkwMF9QMV9ORUdfQ0ZSU1RFUCAweGY0NDEwMDAxCiAKIC8qUDFfQ0ZSVVAxKi8KLSNkZWZpbmUgUjA5MDBfUDFfQ0ZSVVAxICAweGY0NDIKLSNkZWZpbmUgRjA5MDBfUDFfQ0ZSX1VQMSAgMHhmNDQyMDFmZgorI2RlZmluZSBSMDkwMF9QMV9DRlJVUDEgMHhmNDQyCisjZGVmaW5lIENGUlVQMSBSRUd4KFIwOTAwX1AxX0NGUlVQMSkKKyNkZWZpbmUgRjA5MDBfUDFfQ0ZSX1VQMSAweGY0NDIwMWZmCisjZGVmaW5lIENGUl9VUDEgRkxEeChGMDkwMF9QMV9DRlJfVVAxKQogCiAvKlAxX0NGUlVQMCovCi0jZGVmaW5lIFIwOTAwX1AxX0NGUlVQMCAgMHhmNDQzCi0jZGVmaW5lIEYwOTAwX1AxX0NGUl9VUDAgIDB4ZjQ0MzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfQ0ZSVVAwIDB4ZjQ0MworI2RlZmluZSBDRlJVUDAgUkVHeChSMDkwMF9QMV9DRlJVUDApCisjZGVmaW5lIEYwOTAwX1AxX0NGUl9VUDAgMHhmNDQzMDBmZgorI2RlZmluZSBDRlJfVVAwIEZMRHgoRjA5MDBfUDFfQ0ZSX1VQMCkKIAogLypQMV9DRlJMT1cxKi8KLSNkZWZpbmUgUjA5MDBfUDFfQ0ZSTE9XMSAgMHhmNDQ2Ci0jZGVmaW5lIEYwOTAwX1AxX0NGUl9MT1cxICAweGY0NDYwMWZmCisjZGVmaW5lIFIwOTAwX1AxX0NGUkxPVzEgMHhmNDQ2CisjZGVmaW5lIENGUkxPVzEgUkVHeChSMDkwMF9QMV9DRlJMT1cxKQorI2RlZmluZSBGMDkwMF9QMV9DRlJfTE9XMSAweGY0NDYwMWZmCisjZGVmaW5lIENGUl9MT1cxIEZMRHgoRjA5MDBfUDFfQ0ZSX0xPVzEpCiAKIC8qUDFfQ0ZSTE9XMCovCi0jZGVmaW5lIFIwOTAwX1AxX0NGUkxPVzAgIDB4ZjQ0NwotI2RlZmluZSBGMDkwMF9QMV9DRlJfTE9XMCAgMHhmNDQ3MDBmZgorI2RlZmluZSBSMDkwMF9QMV9DRlJMT1cwIDB4ZjQ0NworI2RlZmluZSBDRlJMT1cwIFJFR3goUjA5MDBfUDFfQ0ZSTE9XMCkKKyNkZWZpbmUgRjA5MDBfUDFfQ0ZSX0xPVzAgMHhmNDQ3MDBmZgorI2RlZmluZSBDRlJfTE9XMCBGTER4KEYwOTAwX1AxX0NGUl9MT1cwKQogCiAvKlAxX0NGUklOSVQxKi8KLSNkZWZpbmUgUjA5MDBfUDFfQ0ZSSU5JVDEgIDB4ZjQ0OAotI2RlZmluZSBGMDkwMF9QMV9DRlJfSU5JVDEgIDB4ZjQ0ODAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfQ0ZSSU5JVDEgMHhmNDQ4CisjZGVmaW5lIENGUklOSVQxIFJFR3goUjA5MDBfUDFfQ0ZSSU5JVDEpCisjZGVmaW5lIEYwOTAwX1AxX0NGUl9JTklUMSAweGY0NDgwMWZmCisjZGVmaW5lIENGUl9JTklUMSBGTER4KEYwOTAwX1AxX0NGUl9JTklUMSkKIAogLypQMV9DRlJJTklUMCovCi0jZGVmaW5lIFIwOTAwX1AxX0NGUklOSVQwICAweGY0NDkKLSNkZWZpbmUgRjA5MDBfUDFfQ0ZSX0lOSVQwICAweGY0NDkwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0NGUklOSVQwIDB4ZjQ0OQorI2RlZmluZSBDRlJJTklUMCBSRUd4KFIwOTAwX1AxX0NGUklOSVQwKQorI2RlZmluZSBGMDkwMF9QMV9DRlJfSU5JVDAgMHhmNDQ5MDBmZgorI2RlZmluZSBDRlJfSU5JVDAgRkxEeChGMDkwMF9QMV9DRlJfSU5JVDApCiAKIC8qUDFfQ0ZSSU5DMSovCi0jZGVmaW5lIFIwOTAwX1AxX0NGUklOQzEgIDB4ZjQ0YQotI2RlZmluZSBGMDkwMF9QMV9NQU5VQUxfQ0ZSSU5DICAweGY0NGEwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0NGUl9JTkMxICAweGY0NGEwMTdmCisjZGVmaW5lIFIwOTAwX1AxX0NGUklOQzEgMHhmNDRhCisjZGVmaW5lIENGUklOQzEgUkVHeChSMDkwMF9QMV9DRlJJTkMxKQorI2RlZmluZSBGMDkwMF9QMV9NQU5VQUxfQ0ZSSU5DIDB4ZjQ0YTAwODAKKyNkZWZpbmUgRjA5MDBfUDFfQ0ZSX0lOQzEgMHhmNDRhMDAzZgogCiAvKlAxX0NGUklOQzAqLwotI2RlZmluZSBSMDkwMF9QMV9DRlJJTkMwICAweGY0NGIKLSNkZWZpbmUgRjA5MDBfUDFfQ0ZSX0lOQzAgIDB4ZjQ0YjAwZjAKKyNkZWZpbmUgUjA5MDBfUDFfQ0ZSSU5DMCAweGY0NGIKKyNkZWZpbmUgQ0ZSSU5DMCBSRUd4KFIwOTAwX1AxX0NGUklOQzApCisjZGVmaW5lIEYwOTAwX1AxX0NGUl9JTkMwIDB4ZjQ0YjAwZjgKIAogLypQMV9DRlIyKi8KLSNkZWZpbmUgUjA5MDBfUDFfQ0ZSMiAgMHhmNDRjCi0jZGVmaW5lIEYwOTAwX1AxX0NBUl9GUkVRMiAgMHhmNDRjMDFmZgorI2RlZmluZSBSMDkwMF9QMV9DRlIyIDB4ZjQ0YworI2RlZmluZSBDRlIyIFJFR3goUjA5MDBfUDFfQ0ZSMikKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSX0ZSRVEyIDB4ZjQ0YzAxZmYKKyNkZWZpbmUgQ0FSX0ZSRVEyIEZMRHgoRjA5MDBfUDFfQ0FSX0ZSRVEyKQogCiAvKlAxX0NGUjEqLwotI2RlZmluZSBSMDkwMF9QMV9DRlIxICAweGY0NGQKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSX0ZSRVExICAweGY0NGQwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0NGUjEgMHhmNDRkCisjZGVmaW5lIENGUjEgUkVHeChSMDkwMF9QMV9DRlIxKQorI2RlZmluZSBGMDkwMF9QMV9DQVJfRlJFUTEgMHhmNDRkMDBmZgorI2RlZmluZSBDQVJfRlJFUTEgRkxEeChGMDkwMF9QMV9DQVJfRlJFUTEpCiAKIC8qUDFfQ0ZSMCovCi0jZGVmaW5lIFIwOTAwX1AxX0NGUjAgIDB4ZjQ0ZQotI2RlZmluZSBGMDkwMF9QMV9DQVJfRlJFUTAgIDB4ZjQ0ZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfQ0ZSMCAweGY0NGUKKyNkZWZpbmUgQ0ZSMCBSRUd4KFIwOTAwX1AxX0NGUjApCisjZGVmaW5lIEYwOTAwX1AxX0NBUl9GUkVRMCAweGY0NGUwMGZmCisjZGVmaW5lIENBUl9GUkVRMCBGTER4KEYwOTAwX1AxX0NBUl9GUkVRMCkKIAogLypQMV9MREkqLwotI2RlZmluZSBSMDkwMF9QMV9MREkgIDB4ZjQ0ZgotI2RlZmluZSBGMDkwMF9QMV9MT0NLX0RFVF9JTlRFR1IgIDB4ZjQ0ZjAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfTERJIDB4ZjQ0ZgorI2RlZmluZSBMREkgUkVHeChSMDkwMF9QMV9MREkpCisjZGVmaW5lIEYwOTAwX1AxX0xPQ0tfREVUX0lOVEVHUiAweGY0NGYwMWZmCiAKIC8qUDFfVE1HQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE1HQ0ZHICAweGY0NTAKLSNkZWZpbmUgRjA5MDBfUDFfVE1HTE9DS19CRVRBICAweGY0NTAwMGMwCi0jZGVmaW5lIEYwOTAwX1AxX05PVE1HX0dST1VQREVMQVkgIDB4ZjQ1MDAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfRE9fVElNSU5HX0NPUlIgIDB4ZjQ1MDAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfTUFOVUFMX1NDQU4gIDB4ZjQ1MDAwMGMKLSNkZWZpbmUgRjA5MDBfUDFfVE1HX01JTkZSRVEgIDB4ZjQ1MDAwMDMKKyNkZWZpbmUgUjA5MDBfUDFfVE1HQ0ZHIDB4ZjQ1MAorI2RlZmluZSBUTUdDRkcgUkVHeChSMDkwMF9QMV9UTUdDRkcpCisjZGVmaW5lIEYwOTAwX1AxX1RNR0xPQ0tfQkVUQSAweGY0NTAwMGMwCisjZGVmaW5lIEYwOTAwX1AxX0RPX1RJTUlOR19DT1JSIDB4ZjQ1MDAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfVE1HX01JTkZSRVEgMHhmNDUwMDAwMwogCiAvKlAxX1JUQyovCi0jZGVmaW5lIFIwOTAwX1AxX1JUQyAgMHhmNDUxCi0jZGVmaW5lIEYwOTAwX1AxX1RNR0FMUEhBX0VYUCAgMHhmNDUxMDBmMAotI2RlZmluZSBGMDkwMF9QMV9UTUdCRVRBX0VYUCAgMHhmNDUxMDAwZgorI2RlZmluZSBSMDkwMF9QMV9SVEMgMHhmNDUxCisjZGVmaW5lIFJUQyBSRUd4KFIwOTAwX1AxX1JUQykKKyNkZWZpbmUgRjA5MDBfUDFfVE1HQUxQSEFfRVhQIDB4ZjQ1MTAwZjAKKyNkZWZpbmUgRjA5MDBfUDFfVE1HQkVUQV9FWFAgMHhmNDUxMDAwZgogCiAvKlAxX1JUQ1MyKi8KLSNkZWZpbmUgUjA5MDBfUDFfUlRDUzIgIDB4ZjQ1MgotI2RlZmluZSBGMDkwMF9QMV9UTUdBTFBIQVMyX0VYUCAgMHhmNDUyMDBmMAotI2RlZmluZSBGMDkwMF9QMV9UTUdCRVRBUzJfRVhQICAweGY0NTIwMDBmCisjZGVmaW5lIFIwOTAwX1AxX1JUQ1MyIDB4ZjQ1MgorI2RlZmluZSBSVENTMiBSRUd4KFIwOTAwX1AxX1JUQ1MyKQorI2RlZmluZSBGMDkwMF9QMV9UTUdBTFBIQVMyX0VYUCAweGY0NTIwMGYwCisjZGVmaW5lIEYwOTAwX1AxX1RNR0JFVEFTMl9FWFAgMHhmNDUyMDAwZgogCiAvKlAxX1RNR1RIUklTRSovCi0jZGVmaW5lIFIwOTAwX1AxX1RNR1RIUklTRSAgMHhmNDUzCi0jZGVmaW5lIEYwOTAwX1AxX1RNR0xPQ0tfVEhSSVNFICAweGY0NTMwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1RNR1RIUklTRSAweGY0NTMKKyNkZWZpbmUgVE1HVEhSSVNFIFJFR3goUjA5MDBfUDFfVE1HVEhSSVNFKQorI2RlZmluZSBGMDkwMF9QMV9UTUdMT0NLX1RIUklTRSAweGY0NTMwMGZmCiAKIC8qUDFfVE1HVEhGQUxMKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE1HVEhGQUxMICAweGY0NTQKLSNkZWZpbmUgRjA5MDBfUDFfVE1HTE9DS19USEZBTEwgIDB4ZjQ1NDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVE1HVEhGQUxMIDB4ZjQ1NAorI2RlZmluZSBUTUdUSEZBTEwgUkVHeChSMDkwMF9QMV9UTUdUSEZBTEwpCisjZGVmaW5lIEYwOTAwX1AxX1RNR0xPQ0tfVEhGQUxMIDB4ZjQ1NDAwZmYKIAogLypQMV9TRlJVUFJBVElPKi8KLSNkZWZpbmUgUjA5MDBfUDFfU0ZSVVBSQVRJTyAgMHhmNDU1Ci0jZGVmaW5lIEYwOTAwX1AxX1NGUl9VUFJBVElPICAweGY0NTUwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1NGUlVQUkFUSU8gMHhmNDU1CisjZGVmaW5lIFNGUlVQUkFUSU8gUkVHeChSMDkwMF9QMV9TRlJVUFJBVElPKQorI2RlZmluZSBGMDkwMF9QMV9TRlJfVVBSQVRJTyAweGY0NTUwMGZmCiAKIC8qUDFfU0ZSTE9XUkFUSU8qLwotI2RlZmluZSBSMDkwMF9QMV9TRlJMT1dSQVRJTyAgMHhmNDU2Ci0jZGVmaW5lIEYwOTAwX1AxX1NGUl9MT1dSQVRJTyAgMHhmNDU2MDBmZgorI2RlZmluZSBSMDkwMF9QMV9TRlJMT1dSQVRJTyAweGY0NTYKKyNkZWZpbmUgRjA5MDBfUDFfU0ZSX0xPV1JBVElPIDB4ZjQ1NjAwZmYKIAogLypQMV9LUkVGVE1HKi8KLSNkZWZpbmUgUjA5MDBfUDFfS1JFRlRNRyAgMHhmNDU4Ci0jZGVmaW5lIEYwOTAwX1AxX0tSRUZfVE1HICAweGY0NTgwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0tSRUZUTUcgMHhmNDU4CisjZGVmaW5lIEtSRUZUTUcgUkVHeChSMDkwMF9QMV9LUkVGVE1HKQorI2RlZmluZSBGMDkwMF9QMV9LUkVGX1RNRyAweGY0NTgwMGZmCiAKIC8qUDFfU0ZSU1RFUCovCi0jZGVmaW5lIFIwOTAwX1AxX1NGUlNURVAgIDB4ZjQ1OQotI2RlZmluZSBGMDkwMF9QMV9TRlJfU0NBTlNURVAgIDB4ZjQ1OTAwZjAKLSNkZWZpbmUgRjA5MDBfUDFfU0ZSX0NFTlRFUlNURVAgIDB4ZjQ1OTAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSU1RFUCAweGY0NTkKKyNkZWZpbmUgU0ZSU1RFUCBSRUd4KFIwOTAwX1AxX1NGUlNURVApCisjZGVmaW5lIEYwOTAwX1AxX1NGUl9TQ0FOU1RFUCAweGY0NTkwMGYwCisjZGVmaW5lIEYwOTAwX1AxX1NGUl9DRU5URVJTVEVQIDB4ZjQ1OTAwMGYKIAogLypQMV9UTUdDRkcyKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE1HQ0ZHMiAgMHhmNDVhCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19BVVRPU0FNUCAgMHhmNDVhMDAwOAotI2RlZmluZSBGMDkwMF9QMV9TQ0FOSU5JVF9RVUFSVCAgMHhmNDVhMDAwNAotI2RlZmluZSBGMDkwMF9QMV9OT1RNR19EVkJTMURFUkFUICAweGY0NWEwMDAyCi0jZGVmaW5lIEYwOTAwX1AxX1NGUlJBVElPX0ZJTkUgIDB4ZjQ1YTAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfVE1HQ0ZHMiAweGY0NWEKKyNkZWZpbmUgVE1HQ0ZHMiBSRUd4KFIwOTAwX1AxX1RNR0NGRzIpCisjZGVmaW5lIEYwOTAwX1AxX1NGUlJBVElPX0ZJTkUgMHhmNDVhMDAwMQorCisvKlAxX0tSRUZUTUcyKi8KKyNkZWZpbmUgUjA5MDBfUDFfS1JFRlRNRzIgMHhmNDViCisjZGVmaW5lIEtSRUZUTUcyIFJFR3goUjA5MDBfUDFfS1JFRlRNRzIpCisjZGVmaW5lIEYwOTAwX1AxX0tSRUZfVE1HMiAweGY0NWIwMGZmCiAKIC8qUDFfU0ZSSU5JVDEqLwotI2RlZmluZSBSMDkwMF9QMV9TRlJJTklUMSAgMHhmNDVlCi0jZGVmaW5lIEYwOTAwX1AxX1NGUl9JTklUMSAgMHhmNDVlMDBmZgorI2RlZmluZSBSMDkwMF9QMV9TRlJJTklUMSAweGY0NWUKKyNkZWZpbmUgU0ZSSU5JVDEgUkVHeChSMDkwMF9QMV9TRlJJTklUMSkKKyNkZWZpbmUgRjA5MDBfUDFfU0ZSX0lOSVQxIDB4ZjQ1ZTAwN2YKIAogLypQMV9TRlJJTklUMCovCi0jZGVmaW5lIFIwOTAwX1AxX1NGUklOSVQwICAweGY0NWYKLSNkZWZpbmUgRjA5MDBfUDFfU0ZSX0lOSVQwICAweGY0NWYwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1NGUklOSVQwIDB4ZjQ1ZgorI2RlZmluZSBTRlJJTklUMCBSRUd4KFIwOTAwX1AxX1NGUklOSVQwKQorI2RlZmluZSBGMDkwMF9QMV9TRlJfSU5JVDAgMHhmNDVmMDBmZgogCiAvKlAxX1NGUlVQMSovCi0jZGVmaW5lIFIwOTAwX1AxX1NGUlVQMSAgMHhmNDYwCi0jZGVmaW5lIEYwOTAwX1AxX0FVVE9fR1VQICAweGY0NjAwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUV9VUDEgIDB4ZjQ2MDAwN2YKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSVVAxIDB4ZjQ2MAorI2RlZmluZSBTRlJVUDEgUkVHeChSMDkwMF9QMV9TRlJVUDEpCisjZGVmaW5lIEYwOTAwX1AxX0FVVE9fR1VQIDB4ZjQ2MDAwODAKKyNkZWZpbmUgQVVUT19HVVAgRkxEeChGMDkwMF9QMV9BVVRPX0dVUCkKKyNkZWZpbmUgRjA5MDBfUDFfU1lNQl9GUkVRX1VQMSAweGY0NjAwMDdmCiAKIC8qUDFfU0ZSVVAwKi8KLSNkZWZpbmUgUjA5MDBfUDFfU0ZSVVAwICAweGY0NjEKLSNkZWZpbmUgRjA5MDBfUDFfU1lNQl9GUkVRX1VQMCAgMHhmNDYxMDBmZgorI2RlZmluZSBSMDkwMF9QMV9TRlJVUDAgMHhmNDYxCisjZGVmaW5lIFNGUlVQMCBSRUd4KFIwOTAwX1AxX1NGUlVQMCkKKyNkZWZpbmUgRjA5MDBfUDFfU1lNQl9GUkVRX1VQMCAweGY0NjEwMGZmCiAKIC8qUDFfU0ZSTE9XMSovCi0jZGVmaW5lIFIwOTAwX1AxX1NGUkxPVzEgIDB4ZjQ2MgotI2RlZmluZSBGMDkwMF9QMV9BVVRPX0dMT1cgIDB4ZjQ2MjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfU1lNQl9GUkVRX0xPVzEgIDB4ZjQ2MjAwN2YKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSTE9XMSAweGY0NjIKKyNkZWZpbmUgU0ZSTE9XMSBSRUd4KFIwOTAwX1AxX1NGUkxPVzEpCisjZGVmaW5lIEYwOTAwX1AxX0FVVE9fR0xPVyAweGY0NjIwMDgwCisjZGVmaW5lIEFVVE9fR0xPVyBGTER4KEYwOTAwX1AxX0FVVE9fR0xPVykKKyNkZWZpbmUgRjA5MDBfUDFfU1lNQl9GUkVRX0xPVzEgMHhmNDYyMDA3ZgogCiAvKlAxX1NGUkxPVzAqLwotI2RlZmluZSBSMDkwMF9QMV9TRlJMT1cwICAweGY0NjMKLSNkZWZpbmUgRjA5MDBfUDFfU1lNQl9GUkVRX0xPVzAgIDB4ZjQ2MzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSTE9XMCAweGY0NjMKKyNkZWZpbmUgU0ZSTE9XMCBSRUd4KFIwOTAwX1AxX1NGUkxPVzApCisjZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUV9MT1cwIDB4ZjQ2MzAwZmYKIAogLypQMV9TRlIzKi8KLSNkZWZpbmUgUjA5MDBfUDFfU0ZSMyAgMHhmNDY0Ci0jZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTMgIDB4ZjQ2NDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSMyAweGY0NjQKKyNkZWZpbmUgU0ZSMyBSRUd4KFIwOTAwX1AxX1NGUjMpCisjZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTMgMHhmNDY0MDBmZgorI2RlZmluZSBTWU1CX0ZSRVEzIEZMRHgoRjA5MDBfUDFfU1lNQl9GUkVRMykKIAogLypQMV9TRlIyKi8KLSNkZWZpbmUgUjA5MDBfUDFfU0ZSMiAgMHhmNDY1Ci0jZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTIgIDB4ZjQ2NTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSMiAweGY0NjUKKyNkZWZpbmUgU0ZSMiBSRUd4KFIwOTAwX1AxX1NGUjIpCisjZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTIgMHhmNDY1MDBmZgorI2RlZmluZSBTWU1CX0ZSRVEyIEZMRHgoRjA5MDBfUDFfU1lNQl9GUkVRMikKIAogLypQMV9TRlIxKi8KLSNkZWZpbmUgUjA5MDBfUDFfU0ZSMSAgMHhmNDY2Ci0jZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTEgIDB4ZjQ2NjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSMSAweGY0NjYKKyNkZWZpbmUgU0ZSMSBSRUd4KFIwOTAwX1AxX1NGUjEpCisjZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTEgMHhmNDY2MDBmZgorI2RlZmluZSBTWU1CX0ZSRVExIEZMRHgoRjA5MDBfUDFfU1lNQl9GUkVRMSkKIAogLypQMV9TRlIwKi8KLSNkZWZpbmUgUjA5MDBfUDFfU0ZSMCAgMHhmNDY3Ci0jZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTAgIDB4ZjQ2NzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfU0ZSMCAweGY0NjcKKyNkZWZpbmUgU0ZSMCBSRUd4KFIwOTAwX1AxX1NGUjApCisjZGVmaW5lIEYwOTAwX1AxX1NZTUJfRlJFUTAgMHhmNDY3MDBmZgorI2RlZmluZSBTWU1CX0ZSRVEwIEZMRHgoRjA5MDBfUDFfU1lNQl9GUkVRMCkKIAogLypQMV9UTUdSRUcyKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE1HUkVHMiAgMHhmNDY4Ci0jZGVmaW5lIEYwOTAwX1AxX1RNR1JFRzIgIDB4ZjQ2ODAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVE1HUkVHMiAweGY0NjgKKyNkZWZpbmUgVE1HUkVHMiBSRUd4KFIwOTAwX1AxX1RNR1JFRzIpCisjZGVmaW5lIEYwOTAwX1AxX1RNR1JFRzIgMHhmNDY4MDBmZgogCiAvKlAxX1RNR1JFRzEqLwotI2RlZmluZSBSMDkwMF9QMV9UTUdSRUcxICAweGY0NjkKLSNkZWZpbmUgRjA5MDBfUDFfVE1HUkVHMSAgMHhmNDY5MDBmZgorI2RlZmluZSBSMDkwMF9QMV9UTUdSRUcxIDB4ZjQ2OQorI2RlZmluZSBUTUdSRUcxIFJFR3goUjA5MDBfUDFfVE1HUkVHMSkKKyNkZWZpbmUgRjA5MDBfUDFfVE1HUkVHMSAweGY0NjkwMGZmCiAKIC8qUDFfVE1HUkVHMCovCi0jZGVmaW5lIFIwOTAwX1AxX1RNR1JFRzAgIDB4ZjQ2YQotI2RlZmluZSBGMDkwMF9QMV9UTUdSRUcwICAweGY0NmEwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1RNR1JFRzAgMHhmNDZhCisjZGVmaW5lIFRNR1JFRzAgUkVHeChSMDkwMF9QMV9UTUdSRUcwKQorI2RlZmluZSBGMDkwMF9QMV9UTUdSRUcwIDB4ZjQ2YTAwZmYKIAogLypQMV9UTUdMT0NLMSovCi0jZGVmaW5lIFIwOTAwX1AxX1RNR0xPQ0sxICAweGY0NmIKLSNkZWZpbmUgRjA5MDBfUDFfVE1HTE9DS19MRVZFTDEgIDB4ZjQ2YjAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfVE1HTE9DSzEgMHhmNDZiCisjZGVmaW5lIFRNR0xPQ0sxIFJFR3goUjA5MDBfUDFfVE1HTE9DSzEpCisjZGVmaW5lIEYwOTAwX1AxX1RNR0xPQ0tfTEVWRUwxIDB4ZjQ2YjAxZmYKIAogLypQMV9UTUdMT0NLMCovCi0jZGVmaW5lIFIwOTAwX1AxX1RNR0xPQ0swICAweGY0NmMKLSNkZWZpbmUgRjA5MDBfUDFfVE1HTE9DS19MRVZFTDAgIDB4ZjQ2YzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVE1HTE9DSzAgMHhmNDZjCisjZGVmaW5lIFRNR0xPQ0swIFJFR3goUjA5MDBfUDFfVE1HTE9DSzApCisjZGVmaW5lIEYwOTAwX1AxX1RNR0xPQ0tfTEVWRUwwIDB4ZjQ2YzAwZmYKIAogLypQMV9UTUdPQlMqLwotI2RlZmluZSBSMDkwMF9QMV9UTUdPQlMgIDB4ZjQ2ZAotI2RlZmluZSBGMDkwMF9QMV9ST0xMT0ZGX1NUQVRVUyAgMHhmNDZkMDBjMAotI2RlZmluZSBGMDkwMF9QMV9TQ0FOX1NJR04gIDB4ZjQ2ZDAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfVE1HX1NDQU5OSU5HICAweGY0NmQwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0NIQ0VOVEVSSU5HX01PREUgIDB4ZjQ2ZDAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfVE1HX1NDQU5GQUlMICAweGY0NmQwMDAyCisjZGVmaW5lIFIwOTAwX1AxX1RNR09CUyAweGY0NmQKKyNkZWZpbmUgVE1HT0JTIFJFR3goUjA5MDBfUDFfVE1HT0JTKQorI2RlZmluZSBGMDkwMF9QMV9ST0xMT0ZGX1NUQVRVUyAweGY0NmQwMGMwCisjZGVmaW5lIFJPTExPRkZfU1RBVFVTIEZMRHgoRjA5MDBfUDFfUk9MTE9GRl9TVEFUVVMpCiAKIC8qUDFfRVFVQUxDRkcqLwotI2RlZmluZSBSMDkwMF9QMV9FUVVBTENGRyAgMHhmNDZmCi0jZGVmaW5lIEYwOTAwX1AxX05PVE1HX05FR0FMV0FJVCAgMHhmNDZmMDA4MAotI2RlZmluZSBGMDkwMF9QMV9FUVVBTF9PTiAgMHhmNDZmMDA0MAotI2RlZmluZSBGMDkwMF9QMV9TRUxfRVFVQUxDT1IgIDB4ZjQ2ZjAwMzgKLSNkZWZpbmUgRjA5MDBfUDFfTVVfRVFVQUxERkUgIDB4ZjQ2ZjAwMDcKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUxDRkcgMHhmNDZmCisjZGVmaW5lIEVRVUFMQ0ZHIFJFR3goUjA5MDBfUDFfRVFVQUxDRkcpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFMX09OIDB4ZjQ2ZjAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfTVVfRVFVQUxERkUgMHhmNDZmMDAwNwogCiAvKlAxX0VRVUFJMSovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJMSAgMHhmNDcwCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTEgIDB4ZjQ3MDAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUkxIDB4ZjQ3MAorI2RlZmluZSBFUVVBSTEgUkVHeChSMDkwMF9QMV9FUVVBSTEpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTEgMHhmNDcwMDFmZgogCiAvKlAxX0VRVUFRMSovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFRMSAgMHhmNDcxCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTEgIDB4ZjQ3MTAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVExIDB4ZjQ3MQorI2RlZmluZSBFUVVBUTEgUkVHeChSMDkwMF9QMV9FUVVBUTEpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTEgMHhmNDcxMDFmZgogCiAvKlAxX0VRVUFJMiovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJMiAgMHhmNDcyCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTIgIDB4ZjQ3MjAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUkyIDB4ZjQ3MgorI2RlZmluZSBFUVVBSTIgUkVHeChSMDkwMF9QMV9FUVVBSTIpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTIgMHhmNDcyMDFmZgogCiAvKlAxX0VRVUFRMiovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFRMiAgMHhmNDczCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTIgIDB4ZjQ3MzAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVEyIDB4ZjQ3MworI2RlZmluZSBFUVVBUTIgUkVHeChSMDkwMF9QMV9FUVVBUTIpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTIgMHhmNDczMDFmZgogCiAvKlAxX0VRVUFJMyovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJMyAgMHhmNDc0Ci0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTMgIDB4ZjQ3NDAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUkzIDB4ZjQ3NAorI2RlZmluZSBFUVVBSTMgUkVHeChSMDkwMF9QMV9FUVVBSTMpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTMgMHhmNDc0MDFmZgogCiAvKlAxX0VRVUFRMyovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFRMyAgMHhmNDc1Ci0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTMgIDB4ZjQ3NTAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVEzIDB4ZjQ3NQorI2RlZmluZSBFUVVBUTMgUkVHeChSMDkwMF9QMV9FUVVBUTMpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTMgMHhmNDc1MDFmZgogCiAvKlAxX0VRVUFJNCovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJNCAgMHhmNDc2Ci0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTQgIDB4ZjQ3NjAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUk0IDB4ZjQ3NgorI2RlZmluZSBFUVVBSTQgUkVHeChSMDkwMF9QMV9FUVVBSTQpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTQgMHhmNDc2MDFmZgogCiAvKlAxX0VRVUFRNCovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFRNCAgMHhmNDc3Ci0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTQgIDB4ZjQ3NzAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVE0IDB4ZjQ3NworI2RlZmluZSBFUVVBUTQgUkVHeChSMDkwMF9QMV9FUVVBUTQpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTQgMHhmNDc3MDFmZgogCiAvKlAxX0VRVUFJNSovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJNSAgMHhmNDc4Ci0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTUgIDB4ZjQ3ODAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUk1IDB4ZjQ3OAorI2RlZmluZSBFUVVBSTUgUkVHeChSMDkwMF9QMV9FUVVBSTUpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTUgMHhmNDc4MDFmZgogCiAvKlAxX0VRVUFRNSovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFRNSAgMHhmNDc5Ci0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTUgIDB4ZjQ3OTAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVE1IDB4ZjQ3OQorI2RlZmluZSBFUVVBUTUgUkVHeChSMDkwMF9QMV9FUVVBUTUpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTUgMHhmNDc5MDFmZgogCiAvKlAxX0VRVUFJNiovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJNiAgMHhmNDdhCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTYgIDB4ZjQ3YTAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUk2IDB4ZjQ3YQorI2RlZmluZSBFUVVBSTYgUkVHeChSMDkwMF9QMV9FUVVBSTYpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTYgMHhmNDdhMDFmZgogCiAvKlAxX0VRVUFRNiovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFRNiAgMHhmNDdiCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTYgIDB4ZjQ3YjAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVE2IDB4ZjQ3YgorI2RlZmluZSBFUVVBUTYgUkVHeChSMDkwMF9QMV9FUVVBUTYpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTYgMHhmNDdiMDFmZgogCiAvKlAxX0VRVUFJNyovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJNyAgMHhmNDdjCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTcgIDB4ZjQ3YzAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUk3IDB4ZjQ3YworI2RlZmluZSBFUVVBSTcgUkVHeChSMDkwMF9QMV9FUVVBSTcpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTcgMHhmNDdjMDFmZgogCiAvKlAxX0VRVUFRNyovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFRNyAgMHhmNDdkCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTcgIDB4ZjQ3ZDAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVE3IDB4ZjQ3ZAorI2RlZmluZSBFUVVBUTcgUkVHeChSMDkwMF9QMV9FUVVBUTcpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTcgMHhmNDdkMDFmZgogCiAvKlAxX0VRVUFJOCovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFJOCAgMHhmNDdlCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTggIDB4ZjQ3ZTAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQUk4IDB4ZjQ3ZQorI2RlZmluZSBFUVVBSTggUkVHeChSMDkwMF9QMV9FUVVBSTgpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDSTggMHhmNDdlMDFmZgogCiAvKlAxX0VRVUFROCovCi0jZGVmaW5lIFIwOTAwX1AxX0VRVUFROCAgMHhmNDdmCi0jZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTggIDB4ZjQ3ZjAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRVFVQVE4IDB4ZjQ3ZgorI2RlZmluZSBFUVVBUTggUkVHeChSMDkwMF9QMV9FUVVBUTgpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFfQUNDUTggMHhmNDdmMDFmZgogCiAvKlAxX05OT1NEQVRBVDEqLwotI2RlZmluZSBSMDkwMF9QMV9OTk9TREFUQVQxICAweGY0ODAKLSNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQVRfTk9STUVEMSAgMHhmNDgwMDBmZgorI2RlZmluZSBSMDkwMF9QMV9OTk9TREFUQVQxIDB4ZjQ4MAorI2RlZmluZSBOTk9TREFUQVQxIFJFR3goUjA5MDBfUDFfTk5PU0RBVEFUMSkKKyNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQVRfTk9STUVEMSAweGY0ODAwMGZmCisjZGVmaW5lIE5PU0RBVEFUX05PUk1FRDEgRkxEeChGMDkwMF9QMV9OT1NEQVRBVF9OT1JNRUQxKQogCiAvKlAxX05OT1NEQVRBVDAqLwotI2RlZmluZSBSMDkwMF9QMV9OTk9TREFUQVQwICAweGY0ODEKLSNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQVRfTk9STUVEMCAgMHhmNDgxMDBmZgorI2RlZmluZSBSMDkwMF9QMV9OTk9TREFUQVQwIDB4ZjQ4MQorI2RlZmluZSBOTk9TREFUQVQwIFJFR3goUjA5MDBfUDFfTk5PU0RBVEFUMCkKKyNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQVRfTk9STUVEMCAweGY0ODEwMGZmCisjZGVmaW5lIE5PU0RBVEFUX05PUk1FRDAgRkxEeChGMDkwMF9QMV9OT1NEQVRBVF9OT1JNRUQwKQogCiAvKlAxX05OT1NEQVRBMSovCi0jZGVmaW5lIFIwOTAwX1AxX05OT1NEQVRBMSAgMHhmNDgyCi0jZGVmaW5lIEYwOTAwX1AxX05PU0RBVEFfTk9STUVEMSAgMHhmNDgyMDBmZgorI2RlZmluZSBSMDkwMF9QMV9OTk9TREFUQTEgMHhmNDgyCisjZGVmaW5lIE5OT1NEQVRBMSBSRUd4KFIwOTAwX1AxX05OT1NEQVRBMSkKKyNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQV9OT1JNRUQxIDB4ZjQ4MjAwZmYKIAogLypQMV9OTk9TREFUQTAqLwotI2RlZmluZSBSMDkwMF9QMV9OTk9TREFUQTAgIDB4ZjQ4MwotI2RlZmluZSBGMDkwMF9QMV9OT1NEQVRBX05PUk1FRDAgIDB4ZjQ4MzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTk5PU0RBVEEwIDB4ZjQ4MworI2RlZmluZSBOTk9TREFUQTAgUkVHeChSMDkwMF9QMV9OTk9TREFUQTApCisjZGVmaW5lIEYwOTAwX1AxX05PU0RBVEFfTk9STUVEMCAweGY0ODMwMGZmCiAKIC8qUDFfTk5PU1BMSFQxKi8KLSNkZWZpbmUgUjA5MDBfUDFfTk5PU1BMSFQxICAweGY0ODQKLSNkZWZpbmUgRjA5MDBfUDFfTk9TUExIVF9OT1JNRUQxICAweGY0ODQwMGZmCisjZGVmaW5lIFIwOTAwX1AxX05OT1NQTEhUMSAweGY0ODQKKyNkZWZpbmUgTk5PU1BMSFQxIFJFR3goUjA5MDBfUDFfTk5PU1BMSFQxKQorI2RlZmluZSBGMDkwMF9QMV9OT1NQTEhUX05PUk1FRDEgMHhmNDg0MDBmZgorI2RlZmluZSBOT1NQTEhUX05PUk1FRDEgRkxEeChGMDkwMF9QMV9OT1NQTEhUX05PUk1FRDEpCiAKIC8qUDFfTk5PU1BMSFQwKi8KLSNkZWZpbmUgUjA5MDBfUDFfTk5PU1BMSFQwICAweGY0ODUKLSNkZWZpbmUgRjA5MDBfUDFfTk9TUExIVF9OT1JNRUQwICAweGY0ODUwMGZmCisjZGVmaW5lIFIwOTAwX1AxX05OT1NQTEhUMCAweGY0ODUKKyNkZWZpbmUgTk5PU1BMSFQwIFJFR3goUjA5MDBfUDFfTk5PU1BMSFQwKQorI2RlZmluZSBGMDkwMF9QMV9OT1NQTEhUX05PUk1FRDAgMHhmNDg1MDBmZgorI2RlZmluZSBOT1NQTEhUX05PUk1FRDAgRkxEeChGMDkwMF9QMV9OT1NQTEhUX05PUk1FRDApCiAKIC8qUDFfTk5PU1BMSDEqLwotI2RlZmluZSBSMDkwMF9QMV9OTk9TUExIMSAgMHhmNDg2Ci0jZGVmaW5lIEYwOTAwX1AxX05PU1BMSF9OT1JNRUQxICAweGY0ODYwMGZmCisjZGVmaW5lIFIwOTAwX1AxX05OT1NQTEgxIDB4ZjQ4NgorI2RlZmluZSBOTk9TUExIMSBSRUd4KFIwOTAwX1AxX05OT1NQTEgxKQorI2RlZmluZSBGMDkwMF9QMV9OT1NQTEhfTk9STUVEMSAweGY0ODYwMGZmCiAKIC8qUDFfTk5PU1BMSDAqLwotI2RlZmluZSBSMDkwMF9QMV9OTk9TUExIMCAgMHhmNDg3Ci0jZGVmaW5lIEYwOTAwX1AxX05PU1BMSF9OT1JNRUQwICAweGY0ODcwMGZmCisjZGVmaW5lIFIwOTAwX1AxX05OT1NQTEgwIDB4ZjQ4NworI2RlZmluZSBOTk9TUExIMCBSRUd4KFIwOTAwX1AxX05OT1NQTEgwKQorI2RlZmluZSBGMDkwMF9QMV9OT1NQTEhfTk9STUVEMCAweGY0ODcwMGZmCiAKIC8qUDFfTk9TREFUQVQxKi8KLSNkZWZpbmUgUjA5MDBfUDFfTk9TREFUQVQxICAweGY0ODgKLSNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQVRfVU5OT1JNRUQxICAweGY0ODgwMGZmCisjZGVmaW5lIFIwOTAwX1AxX05PU0RBVEFUMSAweGY0ODgKKyNkZWZpbmUgTk9TREFUQVQxIFJFR3goUjA5MDBfUDFfTk9TREFUQVQxKQorI2RlZmluZSBGMDkwMF9QMV9OT1NEQVRBVF9VTk5PUk1FRDEgMHhmNDg4MDBmZgogCiAvKlAxX05PU0RBVEFUMCovCi0jZGVmaW5lIFIwOTAwX1AxX05PU0RBVEFUMCAgMHhmNDg5Ci0jZGVmaW5lIEYwOTAwX1AxX05PU0RBVEFUX1VOTk9STUVEMCAgMHhmNDg5MDBmZgorI2RlZmluZSBSMDkwMF9QMV9OT1NEQVRBVDAgMHhmNDg5CisjZGVmaW5lIE5PU0RBVEFUMCBSRUd4KFIwOTAwX1AxX05PU0RBVEFUMCkKKyNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQVRfVU5OT1JNRUQwIDB4ZjQ4OTAwZmYKIAogLypQMV9OT1NEQVRBMSovCi0jZGVmaW5lIFIwOTAwX1AxX05PU0RBVEExICAweGY0OGEKLSNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQV9VTk5PUk1FRDEgIDB4ZjQ4YTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTk9TREFUQTEgMHhmNDhhCisjZGVmaW5lIE5PU0RBVEExIFJFR3goUjA5MDBfUDFfTk9TREFUQTEpCisjZGVmaW5lIEYwOTAwX1AxX05PU0RBVEFfVU5OT1JNRUQxIDB4ZjQ4YTAwZmYKIAogLypQMV9OT1NEQVRBMCovCi0jZGVmaW5lIFIwOTAwX1AxX05PU0RBVEEwICAweGY0OGIKLSNkZWZpbmUgRjA5MDBfUDFfTk9TREFUQV9VTk5PUk1FRDAgIDB4ZjQ4YjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTk9TREFUQTAgMHhmNDhiCisjZGVmaW5lIE5PU0RBVEEwIFJFR3goUjA5MDBfUDFfTk9TREFUQTApCisjZGVmaW5lIEYwOTAwX1AxX05PU0RBVEFfVU5OT1JNRUQwIDB4ZjQ4YjAwZmYKIAogLypQMV9OT1NQTEhUMSovCi0jZGVmaW5lIFIwOTAwX1AxX05PU1BMSFQxICAweGY0OGMKLSNkZWZpbmUgRjA5MDBfUDFfTk9TUExIVF9VTk5PUk1FRDEgIDB4ZjQ4YzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTk9TUExIVDEgMHhmNDhjCisjZGVmaW5lIE5PU1BMSFQxIFJFR3goUjA5MDBfUDFfTk9TUExIVDEpCisjZGVmaW5lIEYwOTAwX1AxX05PU1BMSFRfVU5OT1JNRUQxIDB4ZjQ4YzAwZmYKIAogLypQMV9OT1NQTEhUMCovCi0jZGVmaW5lIFIwOTAwX1AxX05PU1BMSFQwICAweGY0OGQKLSNkZWZpbmUgRjA5MDBfUDFfTk9TUExIVF9VTk5PUk1FRDAgIDB4ZjQ4ZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTk9TUExIVDAgMHhmNDhkCisjZGVmaW5lIE5PU1BMSFQwIFJFR3goUjA5MDBfUDFfTk9TUExIVDApCisjZGVmaW5lIEYwOTAwX1AxX05PU1BMSFRfVU5OT1JNRUQwIDB4ZjQ4ZDAwZmYKIAogLypQMV9OT1NQTEgxKi8KLSNkZWZpbmUgUjA5MDBfUDFfTk9TUExIMSAgMHhmNDhlCi0jZGVmaW5lIEYwOTAwX1AxX05PU1BMSF9VTk5PUk1FRDEgIDB4ZjQ4ZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTk9TUExIMSAweGY0OGUKKyNkZWZpbmUgTk9TUExIMSBSRUd4KFIwOTAwX1AxX05PU1BMSDEpCisjZGVmaW5lIEYwOTAwX1AxX05PU1BMSF9VTk5PUk1FRDEgMHhmNDhlMDBmZgogCiAvKlAxX05PU1BMSDAqLwotI2RlZmluZSBSMDkwMF9QMV9OT1NQTEgwICAweGY0OGYKLSNkZWZpbmUgRjA5MDBfUDFfTk9TUExIX1VOTk9STUVEMCAgMHhmNDhmMDBmZgorI2RlZmluZSBSMDkwMF9QMV9OT1NQTEgwIDB4ZjQ4ZgorI2RlZmluZSBOT1NQTEgwIFJFR3goUjA5MDBfUDFfTk9TUExIMCkKKyNkZWZpbmUgRjA5MDBfUDFfTk9TUExIX1VOTk9STUVEMCAweGY0OGYwMGZmCiAKIC8qUDFfQ0FSMkNGRyovCi0jZGVmaW5lIFIwOTAwX1AxX0NBUjJDRkcgIDB4ZjQ5MAotI2RlZmluZSBGMDkwMF9QMV9ERVNDUkFNQl9PRkYgIDB4ZjQ5MDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfUE40X1NFTEVDVCAgMHhmNDkwMDA0MAotI2RlZmluZSBGMDkwMF9QMV9DRlIyX1NUT1BEVkJTMSAgMHhmNDkwMDAyMAotI2RlZmluZSBGMDkwMF9QMV9TVE9QX0NGUjJVUERBVEUgIDB4ZjQ5MDAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfU1RPUF9OQ08yVVBEQVRFICAweGY0OTAwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX1JPVEEyT04gIDB4ZjQ5MDAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfUEhfREVUX0FMR08yICAweGY0OTAwMDAzCisjZGVmaW5lIFIwOTAwX1AxX0NBUjJDRkcgMHhmNDkwCisjZGVmaW5lIENBUjJDRkcgUkVHeChSMDkwMF9QMV9DQVIyQ0ZHKQorI2RlZmluZSBGMDkwMF9QMV9DQVJSSUVSM19ESVNBQkxFIDB4ZjQ5MDAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfUk9UQTJPTiAweGY0OTAwMDA0CisjZGVmaW5lIEYwOTAwX1AxX1BIX0RFVF9BTEdPMiAweGY0OTAwMDAzCiAKLS8qUDFfQUNMQzIqLwotI2RlZmluZSBSMDkwMF9QMV9BQ0xDMiAgMHhmNDkxCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJfUFVOQ1RfQURFUkFUICAweGY0OTEwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJfQUxQSEFfTUFOVCAgMHhmNDkxMDAzMAotI2RlZmluZSBGMDkwMF9QMV9DQVIyX0FMUEhBX0VYUCAgMHhmNDkxMDAwZgotCi0vKlAxX0JDTEMyKi8KLSNkZWZpbmUgUjA5MDBfUDFfQkNMQzIgIDB4ZjQ5MgotI2RlZmluZSBGMDkwMF9QMV9EVkJTMl9OSVAgIDB4ZjQ5MjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMl9QVU5DVF9CREVSQVQgIDB4ZjQ5MjAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMl9CRVRBX01BTlQgIDB4ZjQ5MjAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMl9CRVRBX0VYUCAgMHhmNDkyMDAwZgorLypQMV9DRlIyQ0ZSMSovCisjZGVmaW5lIFIwOTAwX1AxX0NGUjJDRlIxIDB4ZjQ5MQorI2RlZmluZSBDRlIyQ0ZSMSBSRUd4KFIwOTAwX1AxX0NGUjJDRlIxKQorI2RlZmluZSBGMDkwMF9QMV9DRlIyVE9DRlIxX0RWQlMxIDB4ZjQ5MTAwYzAKKyNkZWZpbmUgRjA5MDBfUDFfRU5fUzJDQVIyQ0VOVEVSIDB4ZjQ5MTAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfRElTX0JDSEVSUkNGUjIgMHhmNDkxMDAxMAorI2RlZmluZSBGMDkwMF9QMV9DRlIyVE9DRlIxX0JFVEEgMHhmNDkxMDAwNwogCiAvKlAxX0NGUjIyKi8KLSNkZWZpbmUgUjA5MDBfUDFfQ0ZSMjIgIDB4ZjQ5MwotI2RlZmluZSBGMDkwMF9QMV9DQVIyX0ZSRVEyICAweGY0OTMwMWZmCisjZGVmaW5lIFIwOTAwX1AxX0NGUjIyIDB4ZjQ5MworI2RlZmluZSBDRlIyMiBSRUd4KFIwOTAwX1AxX0NGUjIyKQorI2RlZmluZSBGMDkwMF9QMV9DQVIyX0ZSRVEyIDB4ZjQ5MzAxZmYKIAogLypQMV9DRlIyMSovCi0jZGVmaW5lIFIwOTAwX1AxX0NGUjIxICAweGY0OTQKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMl9GUkVRMSAgMHhmNDk0MDBmZgorI2RlZmluZSBSMDkwMF9QMV9DRlIyMSAweGY0OTQKKyNkZWZpbmUgQ0ZSMjEgUkVHeChSMDkwMF9QMV9DRlIyMSkKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSMl9GUkVRMSAweGY0OTQwMGZmCiAKIC8qUDFfQ0ZSMjAqLwotI2RlZmluZSBSMDkwMF9QMV9DRlIyMCAgMHhmNDk1Ci0jZGVmaW5lIEYwOTAwX1AxX0NBUjJfRlJFUTAgIDB4ZjQ5NTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfQ0ZSMjAgMHhmNDk1CisjZGVmaW5lIENGUjIwIFJFR3goUjA5MDBfUDFfQ0ZSMjApCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJfRlJFUTAgMHhmNDk1MDBmZgogCiAvKlAxX0FDTEMyUzJRKi8KLSNkZWZpbmUgUjA5MDBfUDFfQUNMQzJTMlEgIDB4ZjQ5NwotI2RlZmluZSBGMDkwMF9QMV9FTkFCX1NQU0tTWU1CICAweGY0OTcwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl9RQURFUkFUICAweGY0OTcwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl9RX0FMUEhfTSAgMHhmNDk3MDAzMAotI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfUV9BTFBIX0UgIDB4ZjQ5NzAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfQUNMQzJTMlEgMHhmNDk3CisjZGVmaW5lIEFDTEMyUzJRIFJFR3goUjA5MDBfUDFfQUNMQzJTMlEpCisjZGVmaW5lIEYwOTAwX1AxX0VOQUJfU1BTS1NZTUIgMHhmNDk3MDA4MAorI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfUV9BTFBIX00gMHhmNDk3MDAzMAorI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfUV9BTFBIX0UgMHhmNDk3MDAwZgogCiAvKlAxX0FDTEMyUzI4Ki8KLSNkZWZpbmUgUjA5MDBfUDFfQUNMQzJTMjggIDB4ZjQ5OAotI2RlZmluZSBGMDkwMF9QMV9PTERJM1FfTU9ERSAgMHhmNDk4MDA4MAotI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfOEFERVJBVCAgMHhmNDk4MDA0MAotI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfOF9BTFBIX00gIDB4ZjQ5ODAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzhfQUxQSF9FICAweGY0OTgwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0FDTEMyUzI4IDB4ZjQ5OAorI2RlZmluZSBBQ0xDMlMyOCBSRUd4KFIwOTAwX1AxX0FDTEMyUzI4KQorI2RlZmluZSBGMDkwMF9QMV9PTERJM1FfTU9ERSAweGY0OTgwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl84X0FMUEhfTSAweGY0OTgwMDMwCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl84X0FMUEhfRSAweGY0OTgwMDBmCiAKIC8qUDFfQUNMQzJTMjE2QSovCi0jZGVmaW5lIFIwOTAwX1AxX0FDTEMyUzIxNkEgIDB4ZjQ5OQotI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfMTZBREVSQVQgIDB4ZjQ5OTAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzE2QV9BTFBIX00gIDB4ZjQ5OTAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzE2QV9BTFBIX0UgIDB4ZjQ5OTAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfQUNMQzJTMjE2QSAweGY0OTkKKyNkZWZpbmUgQUNMQzJTMjE2QSBSRUd4KFIwOTAwX1AxX0FDTEMyUzIxNkEpCisjZGVmaW5lIEYwOTAwX1AxX0RJU19DM1NUT1BBMiAweGY0OTkwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8xNkFERVJBVCAweGY0OTkwMDQwCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8xNkFfQUxQSF9NIDB4ZjQ5OTAwMzAKKyNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzE2QV9BTFBIX0UgMHhmNDk5MDAwZgogCiAvKlAxX0FDTEMyUzIzMkEqLwotI2RlZmluZSBSMDkwMF9QMV9BQ0xDMlMyMzJBICAweGY0OWEKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzMyQURFUkFUICAweGY0OWEwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8zMkFfQUxQSF9NICAweGY0OWEwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8zMkFfQUxQSF9FICAweGY0OWEwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0FDTEMyUzIzMkEgMHhmNDlhCisjZGVmaW5lIEFDTEMyUzIzMkEgUkVHeChSMDkwMF9QMV9BQ0xDMlMyMzJBKQorI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfMzJBREVSQVQgMHhmNDlhMDA0MAorI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfMzJBX0FMUEhfTSAweGY0OWEwMDMwCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8zMkFfQUxQSF9FIDB4ZjQ5YTAwMGYKIAogLypQMV9CQ0xDMlMyUSovCi0jZGVmaW5lIFIwOTAwX1AxX0JDTEMyUzJRICAweGY0OWMKLSNkZWZpbmUgRjA5MDBfUDFfRFZCUzJTMlFfTklQICAweGY0OWMwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl9RQkRFUkFUICAweGY0OWMwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl9RX0JFVEFfTSAgMHhmNDljMDAzMAotI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfUV9CRVRBX0UgIDB4ZjQ5YzAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfQkNMQzJTMlEgMHhmNDljCisjZGVmaW5lIEJDTEMyUzJRIFJFR3goUjA5MDBfUDFfQkNMQzJTMlEpCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl9RX0JFVEFfTSAweGY0OWMwMDMwCisjZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl9RX0JFVEFfRSAweGY0OWMwMDBmCiAKIC8qUDFfQkNMQzJTMjgqLwotI2RlZmluZSBSMDkwMF9QMV9CQ0xDMlMyOCAgMHhmNDlkCi0jZGVmaW5lIEYwOTAwX1AxX0RWQlMyUzI4X05JUCAgMHhmNDlkMDA4MAotI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfOEJERVJBVCAgMHhmNDlkMDA0MAotI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfOF9CRVRBX00gIDB4ZjQ5ZDAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzhfQkVUQV9FICAweGY0OWQwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0JDTEMyUzI4IDB4ZjQ5ZAorI2RlZmluZSBCQ0xDMlMyOCBSRUd4KFIwOTAwX1AxX0JDTEMyUzI4KQorI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfOF9CRVRBX00gMHhmNDlkMDAzMAorI2RlZmluZSBGMDkwMF9QMV9DQVIyUzJfOF9CRVRBX0UgMHhmNDlkMDAwZgogCiAvKlAxX0JDTEMyUzIxNkEqLwotI2RlZmluZSBSMDkwMF9QMV9CQ0xDMlMyMTZBICAweGY0OWUKLSNkZWZpbmUgRjA5MDBfUDFfRFZCUzJTMjE2QV9OSVAgIDB4ZjQ5ZTAwODAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzE2QkRFUkFUICAweGY0OWUwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8xNkFfQkVUQV9NICAweGY0OWUwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8xNkFfQkVUQV9FICAweGY0OWUwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0JDTEMyUzIxNkEgMHhmNDllCisjZGVmaW5lIEJDTEMyUzIxNkEgUkVHeChSMDkwMF9QMV9CQ0xDMlMyMTZBKQogCiAvKlAxX0JDTEMyUzIzMkEqLwotI2RlZmluZSBSMDkwMF9QMV9CQ0xDMlMyMzJBICAweGY0OWYKLSNkZWZpbmUgRjA5MDBfUDFfRFZCUzJTMjMyQV9OSVAgIDB4ZjQ5ZjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfQ0FSMlMyXzMyQkRFUkFUICAweGY0OWYwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8zMkFfQkVUQV9NICAweGY0OWYwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX0NBUjJTMl8zMkFfQkVUQV9FICAweGY0OWYwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0JDTEMyUzIzMkEgMHhmNDlmCisjZGVmaW5lIEJDTEMyUzIzMkEgUkVHeChSMDkwMF9QMV9CQ0xDMlMyMzJBKQogCiAvKlAxX1BMUk9PVDIqLwotI2RlZmluZSBSMDkwMF9QMV9QTFJPT1QyICAweGY0YWMKLSNkZWZpbmUgRjA5MDBfUDFfU0hPUlRGUl9ESVNBQkxFICAweGY0YWMwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0xPTkdGUl9ESVNBQkxFICAweGY0YWMwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0RVTU1ZUExfRElTQUJMRSAgMHhmNGFjMDAyMAotI2RlZmluZSBGMDkwMF9QMV9TSE9SVEZSX0FWT0lEICAweGY0YWMwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX1BMU0NSQU1CX01PREUgIDB4ZjRhYzAwMGMKLSNkZWZpbmUgRjA5MDBfUDFfUExTQ1JBTUJfUk9PVDIgIDB4ZjRhYzAwMDMKKyNkZWZpbmUgUjA5MDBfUDFfUExST09UMiAweGY0YWMKKyNkZWZpbmUgUExST09UMiBSRUd4KFIwOTAwX1AxX1BMUk9PVDIpCisjZGVmaW5lIEYwOTAwX1AxX1BMU0NSQU1CX01PREUgMHhmNGFjMDAwYworI2RlZmluZSBGMDkwMF9QMV9QTFNDUkFNQl9ST09UMiAweGY0YWMwMDAzCiAKIC8qUDFfUExST09UMSovCi0jZGVmaW5lIFIwOTAwX1AxX1BMUk9PVDEgIDB4ZjRhZAotI2RlZmluZSBGMDkwMF9QMV9QTFNDUkFNQl9ST09UMSAgMHhmNGFkMDBmZgorI2RlZmluZSBSMDkwMF9QMV9QTFJPT1QxIDB4ZjRhZAorI2RlZmluZSBQTFJPT1QxIFJFR3goUjA5MDBfUDFfUExST09UMSkKKyNkZWZpbmUgRjA5MDBfUDFfUExTQ1JBTUJfUk9PVDEgMHhmNGFkMDBmZgogCiAvKlAxX1BMUk9PVDAqLwotI2RlZmluZSBSMDkwMF9QMV9QTFJPT1QwICAweGY0YWUKLSNkZWZpbmUgRjA5MDBfUDFfUExTQ1JBTUJfUk9PVDAgIDB4ZjRhZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfUExST09UMCAweGY0YWUKKyNkZWZpbmUgUExST09UMCBSRUd4KFIwOTAwX1AxX1BMUk9PVDApCisjZGVmaW5lIEYwOTAwX1AxX1BMU0NSQU1CX1JPT1QwIDB4ZjRhZTAwZmYKIAogLypQMV9NT0RDT0RMU1QwKi8KLSNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUMCAgMHhmNGIwCi0jZGVmaW5lIEYwOTAwX1AxX0VOX1RPS0VOMzEgIDB4ZjRiMDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfU1lOQ1RBR19TRUxFQ1QgIDB4ZjRiMDAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfTU9EQ09EUlFfTU9ERSAgMHhmNGIwMDAzMAorI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1QwIDB4ZjRiMAorI2RlZmluZSBNT0RDT0RMU1QwIFJFR3goUjA5MDBfUDFfTU9EQ09ETFNUMCkKIAogLypQMV9NT0RDT0RMU1QxKi8KLSNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUMSAgMHhmNGIxCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19NT0RDT0QyOSAgMHhmNGIxMDBmMAotI2RlZmluZSBGMDkwMF9QMV9ESVNfMzJQU0tfOV8xMCAgMHhmNGIxMDAwZgorI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1QxIDB4ZjRiMQorI2RlZmluZSBNT0RDT0RMU1QxIFJFR3goUjA5MDBfUDFfTU9EQ09ETFNUMSkKKyNkZWZpbmUgRjA5MDBfUDFfRElTX01PRENPRDI5IDB4ZjRiMTAwZjAKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzMyUFNLXzlfMTAgMHhmNGIxMDAwZgogCiAvKlAxX01PRENPRExTVDIqLwotI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1QyICAweGY0YjIKLSNkZWZpbmUgRjA5MDBfUDFfRElTXzMyUFNLXzhfOSAgMHhmNGIyMDBmMAotI2RlZmluZSBGMDkwMF9QMV9ESVNfMzJQU0tfNV82ICAweGY0YjIwMDBmCisjZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVDIgMHhmNGIyCisjZGVmaW5lIE1PRENPRExTVDIgUkVHeChSMDkwMF9QMV9NT0RDT0RMU1QyKQorI2RlZmluZSBGMDkwMF9QMV9ESVNfMzJQU0tfOF85IDB4ZjRiMjAwZjAKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzMyUFNLXzVfNiAweGY0YjIwMDBmCiAKIC8qUDFfTU9EQ09ETFNUMyovCi0jZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVDMgIDB4ZjRiMwotI2RlZmluZSBGMDkwMF9QMV9ESVNfMzJQU0tfNF81ICAweGY0YjMwMGYwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU18zMlBTS18zXzQgIDB4ZjRiMzAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUMyAweGY0YjMKKyNkZWZpbmUgTU9EQ09ETFNUMyBSRUd4KFIwOTAwX1AxX01PRENPRExTVDMpCisjZGVmaW5lIEYwOTAwX1AxX0RJU18zMlBTS180XzUgMHhmNGIzMDBmMAorI2RlZmluZSBGMDkwMF9QMV9ESVNfMzJQU0tfM180IDB4ZjRiMzAwMGYKIAogLypQMV9NT0RDT0RMU1Q0Ki8KLSNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUNCAgMHhmNGI0Ci0jZGVmaW5lIEYwOTAwX1AxX0RJU18xNlBTS185XzEwICAweGY0YjQwMGYwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU18xNlBTS184XzkgIDB4ZjRiNDAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUNCAweGY0YjQKKyNkZWZpbmUgTU9EQ09ETFNUNCBSRUd4KFIwOTAwX1AxX01PRENPRExTVDQpCisjZGVmaW5lIEYwOTAwX1AxX0RJU18xNlBTS185XzEwIDB4ZjRiNDAwZjAKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzE2UFNLXzhfOSAweGY0YjQwMDBmCiAKIC8qUDFfTU9EQ09ETFNUNSovCi0jZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVDUgIDB4ZjRiNQotI2RlZmluZSBGMDkwMF9QMV9ESVNfMTZQU0tfNV82ICAweGY0YjUwMGYwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU18xNlBTS180XzUgIDB4ZjRiNTAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUNSAweGY0YjUKKyNkZWZpbmUgTU9EQ09ETFNUNSBSRUd4KFIwOTAwX1AxX01PRENPRExTVDUpCisjZGVmaW5lIEYwOTAwX1AxX0RJU18xNlBTS181XzYgMHhmNGI1MDBmMAorI2RlZmluZSBGMDkwMF9QMV9ESVNfMTZQU0tfNF81IDB4ZjRiNTAwMGYKIAogLypQMV9NT0RDT0RMU1Q2Ki8KLSNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUNiAgMHhmNGI2Ci0jZGVmaW5lIEYwOTAwX1AxX0RJU18xNlBTS18zXzQgIDB4ZjRiNjAwZjAKLSNkZWZpbmUgRjA5MDBfUDFfRElTXzE2UFNLXzJfMyAgMHhmNGI2MDAwZgorI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1Q2IDB4ZjRiNgorI2RlZmluZSBNT0RDT0RMU1Q2IFJFR3goUjA5MDBfUDFfTU9EQ09ETFNUNikKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzE2UFNLXzNfNCAweGY0YjYwMGYwCisjZGVmaW5lIEYwOTAwX1AxX0RJU18xNlBTS18yXzMgMHhmNGI2MDAwZgogCiAvKlAxX01PRENPRExTVDcqLwotI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1Q3ICAweGY0YjcKLSNkZWZpbmUgRjA5MDBfUDFfRElTXzhQXzlfMTAgIDB4ZjRiNzAwZjAKLSNkZWZpbmUgRjA5MDBfUDFfRElTXzhQXzhfOSAgMHhmNGI3MDAwZgorI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1Q3IDB4ZjRiNworI2RlZmluZSBNT0RDT0RMU1Q3IFJFR3goUjA5MDBfUDFfTU9EQ09ETFNUNykKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzhQXzlfMTAgMHhmNGI3MDBmMAorI2RlZmluZSBGMDkwMF9QMV9ESVNfOFBfOF85IDB4ZjRiNzAwMGYKIAogLypQMV9NT0RDT0RMU1Q4Ki8KLSNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUOCAgMHhmNGI4Ci0jZGVmaW5lIEYwOTAwX1AxX0RJU184UF81XzYgIDB4ZjRiODAwZjAKLSNkZWZpbmUgRjA5MDBfUDFfRElTXzhQXzNfNCAgMHhmNGI4MDAwZgorI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1Q4IDB4ZjRiOAorI2RlZmluZSBNT0RDT0RMU1Q4IFJFR3goUjA5MDBfUDFfTU9EQ09ETFNUOCkKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzhQXzVfNiAweGY0YjgwMGYwCisjZGVmaW5lIEYwOTAwX1AxX0RJU184UF8zXzQgMHhmNGI4MDAwZgogCiAvKlAxX01PRENPRExTVDkqLwotI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1Q5ICAweGY0YjkKLSNkZWZpbmUgRjA5MDBfUDFfRElTXzhQXzJfMyAgMHhmNGI5MDBmMAotI2RlZmluZSBGMDkwMF9QMV9ESVNfOFBfM181ICAweGY0YjkwMDBmCisjZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVDkgMHhmNGI5CisjZGVmaW5lIE1PRENPRExTVDkgUkVHeChSMDkwMF9QMV9NT0RDT0RMU1Q5KQorI2RlZmluZSBGMDkwMF9QMV9ESVNfOFBfMl8zIDB4ZjRiOTAwZjAKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzhQXzNfNSAweGY0YjkwMDBmCiAKIC8qUDFfTU9EQ09ETFNUQSovCi0jZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVEEgIDB4ZjRiYQotI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfOV8xMCAgMHhmNGJhMDBmMAotI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfOF85ICAweGY0YmEwMDBmCisjZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVEEgMHhmNGJhCisjZGVmaW5lIE1PRENPRExTVEEgUkVHeChSMDkwMF9QMV9NT0RDT0RMU1RBKQorI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfOV8xMCAweGY0YmEwMGYwCisjZGVmaW5lIEYwOTAwX1AxX0RJU19RUF84XzkgMHhmNGJhMDAwZgogCiAvKlAxX01PRENPRExTVEIqLwotI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1RCICAweGY0YmIKLSNkZWZpbmUgRjA5MDBfUDFfRElTX1FQXzVfNiAgMHhmNGJiMDBmMAotI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfNF81ICAweGY0YmIwMDBmCisjZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVEIgMHhmNGJiCisjZGVmaW5lIE1PRENPRExTVEIgUkVHeChSMDkwMF9QMV9NT0RDT0RMU1RCKQorI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfNV82IDB4ZjRiYjAwZjAKKyNkZWZpbmUgRjA5MDBfUDFfRElTX1FQXzRfNSAweGY0YmIwMDBmCiAKIC8qUDFfTU9EQ09ETFNUQyovCi0jZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVEMgIDB4ZjRiYwotI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfM180ICAweGY0YmMwMGYwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19RUF8yXzMgIDB4ZjRiYzAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNUQyAweGY0YmMKKyNkZWZpbmUgTU9EQ09ETFNUQyBSRUd4KFIwOTAwX1AxX01PRENPRExTVEMpCisjZGVmaW5lIEYwOTAwX1AxX0RJU19RUF8zXzQgMHhmNGJjMDBmMAorI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfMl8zIDB4ZjRiYzAwMGYKIAogLypQMV9NT0RDT0RMU1REKi8KLSNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNURCAgMHhmNGJkCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19RUF8zXzUgIDB4ZjRiZDAwZjAKLSNkZWZpbmUgRjA5MDBfUDFfRElTX1FQXzFfMiAgMHhmNGJkMDAwZgorI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1REIDB4ZjRiZAorI2RlZmluZSBNT0RDT0RMU1REIFJFR3goUjA5MDBfUDFfTU9EQ09ETFNURCkKKyNkZWZpbmUgRjA5MDBfUDFfRElTX1FQXzNfNSAweGY0YmQwMGYwCisjZGVmaW5lIEYwOTAwX1AxX0RJU19RUF8xXzIgMHhmNGJkMDAwZgogCiAvKlAxX01PRENPRExTVEUqLwotI2RlZmluZSBSMDkwMF9QMV9NT0RDT0RMU1RFICAweGY0YmUKLSNkZWZpbmUgRjA5MDBfUDFfRElTX1FQXzJfNSAgMHhmNGJlMDBmMAotI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfMV8zICAweGY0YmUwMDBmCisjZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVEUgMHhmNGJlCisjZGVmaW5lIE1PRENPRExTVEUgUkVHeChSMDkwMF9QMV9NT0RDT0RMU1RFKQorI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfMl81IDB4ZjRiZTAwZjAKKyNkZWZpbmUgRjA5MDBfUDFfRElTX1FQXzFfMyAweGY0YmUwMDBmCiAKIC8qUDFfTU9EQ09ETFNURiovCi0jZGVmaW5lIFIwOTAwX1AxX01PRENPRExTVEYgIDB4ZjRiZgotI2RlZmluZSBGMDkwMF9QMV9ESVNfUVBfMV80ICAweGY0YmYwMGYwCi0jZGVmaW5lIEYwOTAwX1AxX0RERU1PRF9TRVQgIDB4ZjRiZjAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfRERFTU9EX01BU0sgIDB4ZjRiZjAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfTU9EQ09ETFNURiAweGY0YmYKKyNkZWZpbmUgTU9EQ09ETFNURiBSRUd4KFIwOTAwX1AxX01PRENPRExTVEYpCisjZGVmaW5lIEYwOTAwX1AxX0RJU19RUF8xXzQgMHhmNGJmMDBmMAorCisvKlAxX0dBVVNTUjAqLworI2RlZmluZSBSMDkwMF9QMV9HQVVTU1IwIDB4ZjRjMAorI2RlZmluZSBHQVVTU1IwIFJFR3goUjA5MDBfUDFfR0FVU1NSMCkKKyNkZWZpbmUgRjA5MDBfUDFfRU5fQ0NJTU9ERSAweGY0YzAwMDgwCisjZGVmaW5lIEYwOTAwX1AxX1IwX0dBVVNTSUVOIDB4ZjRjMDAwN2YKKworLypQMV9DQ0lSMCovCisjZGVmaW5lIFIwOTAwX1AxX0NDSVIwIDB4ZjRjMQorI2RlZmluZSBDQ0lSMCBSRUd4KFIwOTAwX1AxX0NDSVIwKQorI2RlZmluZSBGMDkwMF9QMV9DQ0lERVRFQ1RfUExIT05MWSAweGY0YzEwMDgwCisjZGVmaW5lIEYwOTAwX1AxX1IwX0NDSSAweGY0YzEwMDdmCisKKy8qUDFfQ0NJUVVBTlQqLworI2RlZmluZSBSMDkwMF9QMV9DQ0lRVUFOVCAweGY0YzIKKyNkZWZpbmUgQ0NJUVVBTlQgUkVHeChSMDkwMF9QMV9DQ0lRVUFOVCkKKyNkZWZpbmUgRjA5MDBfUDFfQ0NJX0JFVEEgMHhmNGMyMDBlMAorI2RlZmluZSBGMDkwMF9QMV9DQ0lfUVVBTlQgMHhmNGMyMDAxZgorCisvKlAxX0NDSVRIUkVTKi8KKyNkZWZpbmUgUjA5MDBfUDFfQ0NJVEhSRVMgMHhmNGMzCisjZGVmaW5lIENDSVRIUkVTIFJFR3goUjA5MDBfUDFfQ0NJVEhSRVMpCisjZGVmaW5lIEYwOTAwX1AxX0NDSV9USFJFU0hPTEQgMHhmNGMzMDBmZgorCisvKlAxX0NDSUFDQyovCisjZGVmaW5lIFIwOTAwX1AxX0NDSUFDQyAweGY0YzQKKyNkZWZpbmUgQ0NJQUNDIFJFR3goUjA5MDBfUDFfQ0NJQUNDKQorI2RlZmluZSBGMDkwMF9QMV9DQ0lfVkFMVUUgMHhmNGM0MDBmZgogCiAvKlAxX0RNRFJFU0NGRyovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRFJFU0NGRyAgMHhmNGM2Ci0jZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19SRVNFVCAgMHhmNGM2MDA4MAotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfTk9JU0VTUVIgIDB4ZjRjNjAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX1NUUkFMTCAgMHhmNGM2MDAwOAotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfTkVXT05MWSAgMHhmNGM2MDAwNAotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfTk9TVE9SRSAgMHhmNGM2MDAwMgotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfQUdDMk1FTSAgMHhmNGM2MDAwMQorI2RlZmluZSBSMDkwMF9QMV9ETURSRVNDRkcgMHhmNGM2CisjZGVmaW5lIERNRFJFU0NGRyBSRUd4KFIwOTAwX1AxX0RNRFJFU0NGRykKKyNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX1JFU0VUIDB4ZjRjNjAwODAKKyNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX1NUUkFMTCAweGY0YzYwMDA4CisjZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19ORVdPTkxZIDB4ZjRjNjAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX05PU1RPUkUgMHhmNGM2MDAwMgogCiAvKlAxX0RNRFJFU0FEUiovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRFJFU0FEUiAgMHhmNGM3Ci0jZGVmaW5lIEYwOTAwX1AxX1NVU1BfUFJFRENBTkFMICAweGY0YzcwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19WQUxJRENGUiAgMHhmNGM3MDA0MAotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfTUVNRlVMTCAgMHhmNGM3MDAzMAotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfUkVTTkJSICAweGY0YzcwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0RNRFJFU0FEUiAweGY0YzcKKyNkZWZpbmUgRE1EUkVTQURSIFJFR3goUjA5MDBfUDFfRE1EUkVTQURSKQorI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfVkFMSURDRlIgMHhmNGM3MDA0MAorI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfTUVNRlVMTCAweGY0YzcwMDMwCisjZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19SRVNOQlIgMHhmNGM3MDAwZgogCiAvKlAxX0RNRFJFU0RBVEE3Ki8KLSNkZWZpbmUgUjA5MDBfUDFfRE1EUkVTREFUQTcgIDB4ZjRjOAotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfREFUQTcgIDB4ZjRjODAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRE1EUkVTREFUQTcgMHhmNGM4CisjZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19EQVRBNyAweGY0YzgwMGZmCiAKIC8qUDFfRE1EUkVTREFUQTYqLwotI2RlZmluZSBSMDkwMF9QMV9ETURSRVNEQVRBNiAgMHhmNGM5Ci0jZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19EQVRBNiAgMHhmNGM5MDBmZgorI2RlZmluZSBSMDkwMF9QMV9ETURSRVNEQVRBNiAweGY0YzkKKyNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX0RBVEE2IDB4ZjRjOTAwZmYKIAogLypQMV9ETURSRVNEQVRBNSovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRFJFU0RBVEE1ICAweGY0Y2EKLSNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX0RBVEE1ICAweGY0Y2EwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0RNRFJFU0RBVEE1IDB4ZjRjYQorI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfREFUQTUgMHhmNGNhMDBmZgogCiAvKlAxX0RNRFJFU0RBVEE0Ki8KLSNkZWZpbmUgUjA5MDBfUDFfRE1EUkVTREFUQTQgIDB4ZjRjYgotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfREFUQTQgIDB4ZjRjYjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRE1EUkVTREFUQTQgMHhmNGNiCisjZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19EQVRBNCAweGY0Y2IwMGZmCiAKIC8qUDFfRE1EUkVTREFUQTMqLwotI2RlZmluZSBSMDkwMF9QMV9ETURSRVNEQVRBMyAgMHhmNGNjCi0jZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19EQVRBMyAgMHhmNGNjMDBmZgorI2RlZmluZSBSMDkwMF9QMV9ETURSRVNEQVRBMyAweGY0Y2MKKyNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX0RBVEEzIDB4ZjRjYzAwZmYKIAogLypQMV9ETURSRVNEQVRBMiovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRFJFU0RBVEEyICAweGY0Y2QKLSNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX0RBVEEyICAweGY0Y2QwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0RNRFJFU0RBVEEyIDB4ZjRjZAorI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfREFUQTIgMHhmNGNkMDBmZgogCiAvKlAxX0RNRFJFU0RBVEExKi8KLSNkZWZpbmUgUjA5MDBfUDFfRE1EUkVTREFUQTEgIDB4ZjRjZQotI2RlZmluZSBGMDkwMF9QMV9ETURSRVNfREFUQTEgIDB4ZjRjZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRE1EUkVTREFUQTEgMHhmNGNlCisjZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19EQVRBMSAweGY0Y2UwMGZmCiAKIC8qUDFfRE1EUkVTREFUQTAqLwotI2RlZmluZSBSMDkwMF9QMV9ETURSRVNEQVRBMCAgMHhmNGNmCi0jZGVmaW5lIEYwOTAwX1AxX0RNRFJFU19EQVRBMCAgMHhmNGNmMDBmZgorI2RlZmluZSBSMDkwMF9QMV9ETURSRVNEQVRBMCAweGY0Y2YKKyNkZWZpbmUgRjA5MDBfUDFfRE1EUkVTX0RBVEEwIDB4ZjRjZjAwZmYKIAogLypQMV9GRkVJMSovCi0jZGVmaW5lIFIwOTAwX1AxX0ZGRUkxICAweGY0ZDAKLSNkZWZpbmUgRjA5MDBfUDFfRkZFX0FDQ0kxICAweGY0ZDAwMWZmCisjZGVmaW5lIFIwOTAwX1AxX0ZGRUkxIDB4ZjRkMAorI2RlZmluZSBGRkVJMSBSRUd4KFIwOTAwX1AxX0ZGRUkxKQorI2RlZmluZSBGMDkwMF9QMV9GRkVfQUNDSTEgMHhmNGQwMDFmZgogCiAvKlAxX0ZGRVExKi8KLSNkZWZpbmUgUjA5MDBfUDFfRkZFUTEgIDB4ZjRkMQotI2RlZmluZSBGMDkwMF9QMV9GRkVfQUNDUTEgIDB4ZjRkMTAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkZFUTEgMHhmNGQxCisjZGVmaW5lIEZGRVExIFJFR3goUjA5MDBfUDFfRkZFUTEpCisjZGVmaW5lIEYwOTAwX1AxX0ZGRV9BQ0NRMSAweGY0ZDEwMWZmCiAKIC8qUDFfRkZFSTIqLwotI2RlZmluZSBSMDkwMF9QMV9GRkVJMiAgMHhmNGQyCi0jZGVmaW5lIEYwOTAwX1AxX0ZGRV9BQ0NJMiAgMHhmNGQyMDFmZgorI2RlZmluZSBSMDkwMF9QMV9GRkVJMiAweGY0ZDIKKyNkZWZpbmUgRkZFSTIgUkVHeChSMDkwMF9QMV9GRkVJMikKKyNkZWZpbmUgRjA5MDBfUDFfRkZFX0FDQ0kyIDB4ZjRkMjAxZmYKIAogLypQMV9GRkVRMiovCi0jZGVmaW5lIFIwOTAwX1AxX0ZGRVEyICAweGY0ZDMKLSNkZWZpbmUgRjA5MDBfUDFfRkZFX0FDQ1EyICAweGY0ZDMwMWZmCisjZGVmaW5lIFIwOTAwX1AxX0ZGRVEyIDB4ZjRkMworI2RlZmluZSBGRkVRMiBSRUd4KFIwOTAwX1AxX0ZGRVEyKQorI2RlZmluZSBGMDkwMF9QMV9GRkVfQUNDUTIgMHhmNGQzMDFmZgogCiAvKlAxX0ZGRUkzKi8KLSNkZWZpbmUgUjA5MDBfUDFfRkZFSTMgIDB4ZjRkNAotI2RlZmluZSBGMDkwMF9QMV9GRkVfQUNDSTMgIDB4ZjRkNDAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkZFSTMgMHhmNGQ0CisjZGVmaW5lIEZGRUkzIFJFR3goUjA5MDBfUDFfRkZFSTMpCisjZGVmaW5lIEYwOTAwX1AxX0ZGRV9BQ0NJMyAweGY0ZDQwMWZmCiAKIC8qUDFfRkZFUTMqLwotI2RlZmluZSBSMDkwMF9QMV9GRkVRMyAgMHhmNGQ1Ci0jZGVmaW5lIEYwOTAwX1AxX0ZGRV9BQ0NRMyAgMHhmNGQ1MDFmZgorI2RlZmluZSBSMDkwMF9QMV9GRkVRMyAweGY0ZDUKKyNkZWZpbmUgRkZFUTMgUkVHeChSMDkwMF9QMV9GRkVRMykKKyNkZWZpbmUgRjA5MDBfUDFfRkZFX0FDQ1EzIDB4ZjRkNTAxZmYKIAogLypQMV9GRkVJNCovCi0jZGVmaW5lIFIwOTAwX1AxX0ZGRUk0ICAweGY0ZDYKLSNkZWZpbmUgRjA5MDBfUDFfRkZFX0FDQ0k0ICAweGY0ZDYwMWZmCisjZGVmaW5lIFIwOTAwX1AxX0ZGRUk0IDB4ZjRkNgorI2RlZmluZSBGRkVJNCBSRUd4KFIwOTAwX1AxX0ZGRUk0KQorI2RlZmluZSBGMDkwMF9QMV9GRkVfQUNDSTQgMHhmNGQ2MDFmZgogCiAvKlAxX0ZGRVE0Ki8KLSNkZWZpbmUgUjA5MDBfUDFfRkZFUTQgIDB4ZjRkNwotI2RlZmluZSBGMDkwMF9QMV9GRkVfQUNDUTQgIDB4ZjRkNzAxZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkZFUTQgMHhmNGQ3CisjZGVmaW5lIEZGRVE0IFJFR3goUjA5MDBfUDFfRkZFUTQpCisjZGVmaW5lIEYwOTAwX1AxX0ZGRV9BQ0NRNCAweGY0ZDcwMWZmCiAKIC8qUDFfRkZFQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfUDFfRkZFQ0ZHICAweGY0ZDgKLSNkZWZpbmUgRjA5MDBfUDFfRVFVQUxGRkVfT04gIDB4ZjRkODAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfRVFVQUxfVVNFRFNZTUIgIDB4ZjRkODAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfTVVfRVFVQUxGRkUgIDB4ZjRkODAwMDcKKyNkZWZpbmUgUjA5MDBfUDFfRkZFQ0ZHIDB4ZjRkOAorI2RlZmluZSBGRkVDRkcgUkVHeChSMDkwMF9QMV9GRkVDRkcpCisjZGVmaW5lIEYwOTAwX1AxX0VRVUFMRkZFX09OIDB4ZjRkODAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfTVVfRVFVQUxGRkUgMHhmNGQ4MDAwNwogCiAvKlAxX1ROUkNGRyovCi0jZGVmaW5lIFIwOTAwX1AxX1ROUkNGRyAgMHhmNGUwCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9BQ0tGQUlMICAweGY0ZTAwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9UWVBFICAweGY0ZTAwMDcwCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9TRUNTVE9QICAweGY0ZTAwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX1RVTl9WQ09TUkNIICAweGY0ZTAwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX1RVTl9NQUREUkVTUyAgMHhmNGUwMDAwMworI2RlZmluZSBSMDkwMF9QMV9UTlJDRkcgMHhmNGUwCisjZGVmaW5lIFROUkNGRyBSRUd4KFIwOTAwX1AxX1ROUkNGRykKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX0FDS0ZBSUwgMHhmNGUwMDA4MAorI2RlZmluZSBGMDkwMF9QMV9UVU5fVFlQRSAweGY0ZTAwMDcwCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9TRUNTVE9QIDB4ZjRlMDAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1ZDT1NSQ0ggMHhmNGUwMDAwNAorI2RlZmluZSBGMDkwMF9QMV9UVU5fTUFERFJFU1MgMHhmNGUwMDAwMwogCiAvKlAxX1ROUkNGRzIqLwotI2RlZmluZSBSMDkwMF9QMV9UTlJDRkcyICAweGY0ZTEKLSNkZWZpbmUgRjA5MDBfUDFfVFVOX0lRU1dBUCAgMHhmNGUxMDA4MAotI2RlZmluZSBGMDkwMF9QMV9TVEI2MTEwX1NURVAyTUhaICAweGY0ZTEwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1NUQjYxMjBfREJMSTJDICAweGY0ZTEwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19GQ0NLICAweGY0ZTEwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX0RJU19MUEVOICAweGY0ZTEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0RJU19CV0NBTEMgIDB4ZjRlMTAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfU0hPUlRfV0FJVFNUQVRFUyAgMHhmNGUxMDAwMgotI2RlZmluZSBGMDkwMF9QMV9ESVNfMkJXQUdDMSAgMHhmNGUxMDAwMQorI2RlZmluZSBSMDkwMF9QMV9UTlJDRkcyIDB4ZjRlMQorI2RlZmluZSBUTlJDRkcyIFJFR3goUjA5MDBfUDFfVE5SQ0ZHMikKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX0lRU1dBUCAweGY0ZTEwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0RJU19CV0NBTEMgMHhmNGUxMDAwNAorI2RlZmluZSBGMDkwMF9QMV9TSE9SVF9XQUlUU1RBVEVTIDB4ZjRlMTAwMDIKIAogLypQMV9UTlJYVEFMKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE5SWFRBTCAgMHhmNGU0Ci0jZGVmaW5lIEYwOTAwX1AxX1RVTl9NQ0xLREVDSU1BTCAgMHhmNGU0MDBlMAotI2RlZmluZSBGMDkwMF9QMV9UVU5fWFRBTEZSRVEgIDB4ZjRlNDAwMWYKKyNkZWZpbmUgUjA5MDBfUDFfVE5SWFRBTCAweGY0ZTQKKyNkZWZpbmUgVE5SWFRBTCBSRUd4KFIwOTAwX1AxX1ROUlhUQUwpCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9YVEFMRlJFUSAweGY0ZTQwMDFmCiAKIC8qUDFfVE5SU1RFUFMqLwotI2RlZmluZSBSMDkwMF9QMV9UTlJTVEVQUyAgMHhmNGU3Ci0jZGVmaW5lIEYwOTAwX1AxX1RVTkVSX0JXMVA2ICAweGY0ZTcwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0JXSU5DX09GRlNFVCAgMHhmNGU3MDA3MAotI2RlZmluZSBGMDkwMF9QMV9TT0ZUU1RFUF9STkcgIDB4ZjRlNzAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfVFVOX0JXT0ZGU0VUICAweGY0ZTcwMTA3CisjZGVmaW5lIFIwOTAwX1AxX1ROUlNURVBTIDB4ZjRlNworI2RlZmluZSBUTlJTVEVQUyBSRUd4KFIwOTAwX1AxX1ROUlNURVBTKQorI2RlZmluZSBGMDkwMF9QMV9UVU5FUl9CVzBQMTI1IDB4ZjRlNzAwODAKKyNkZWZpbmUgRjA5MDBfUDFfQldJTkNfT0ZGU0VUIDB4ZjRlNzAxNzAKKyNkZWZpbmUgRjA5MDBfUDFfU09GVFNURVBfUk5HIDB4ZjRlNzAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX0JXT0ZGU0VUIDB4ZjRlNzAwMDcKIAogLypQMV9UTlJHQUlOKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE5SR0FJTiAgMHhmNGU4Ci0jZGVmaW5lIEYwOTAwX1AxX1RVTl9LRElWRU4gIDB4ZjRlODAwYzAKLSNkZWZpbmUgRjA5MDBfUDFfU1RCNlgwMF9PQ0sgIDB4ZjRlODAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfVFVOX0dBSU4gIDB4ZjRlODAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfVE5SR0FJTiAweGY0ZTgKKyNkZWZpbmUgVE5SR0FJTiBSRUd4KFIwOTAwX1AxX1ROUkdBSU4pCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9LRElWRU4gMHhmNGU4MDBjMAorI2RlZmluZSBGMDkwMF9QMV9TVEI2WDAwX09DSyAweGY0ZTgwMDMwCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9HQUlOIDB4ZjRlODAwMGYKIAogLypQMV9UTlJSRjEqLwotI2RlZmluZSBSMDkwMF9QMV9UTlJSRjEgIDB4ZjRlOQotI2RlZmluZSBGMDkwMF9QMV9UVU5fUkZGUkVRMiAgMHhmNGU5MDBmZgorI2RlZmluZSBSMDkwMF9QMV9UTlJSRjEgMHhmNGU5CisjZGVmaW5lIFROUlJGMSBSRUd4KFIwOTAwX1AxX1ROUlJGMSkKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JGRlJFUTIgMHhmNGU5MDBmZgogCiAvKlAxX1ROUlJGMCovCi0jZGVmaW5lIFIwOTAwX1AxX1ROUlJGMCAgMHhmNGVhCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9SRkZSRVExICAweGY0ZWEwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ROUlJGMCAweGY0ZWEKKyNkZWZpbmUgVE5SUkYwIFJFR3goUjA5MDBfUDFfVE5SUkYwKQorI2RlZmluZSBGMDkwMF9QMV9UVU5fUkZGUkVRMSAweGY0ZWEwMGZmCiAKIC8qUDFfVE5SQlcqLwotI2RlZmluZSBSMDkwMF9QMV9UTlJCVyAgMHhmNGViCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9SRkZSRVEwICAweGY0ZWIwMGMwCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9CVyAgMHhmNGViMDAzZgorI2RlZmluZSBSMDkwMF9QMV9UTlJCVyAweGY0ZWIKKyNkZWZpbmUgVE5SQlcgUkVHeChSMDkwMF9QMV9UTlJCVykKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JGRlJFUTAgMHhmNGViMDBjMAorI2RlZmluZSBGMDkwMF9QMV9UVU5fQlcgMHhmNGViMDAzZgogCiAvKlAxX1ROUkFESiovCi0jZGVmaW5lIFIwOTAwX1AxX1ROUkFESiAgMHhmNGVjCi0jZGVmaW5lIEYwOTAwX1AxX1NUQjYxWDBfUkNMSyAgMHhmNGVjMDA4MAotI2RlZmluZSBGMDkwMF9QMV9TVEI2MVgwX0NBTFRJTUUgIDB4ZjRlYzAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfU1RCNlgwMF9ETEIgIDB4ZjRlYzAwMzgKLSNkZWZpbmUgRjA5MDBfUDFfU1RCNjAwMF9GQ0wgIDB4ZjRlYzAwMDcKKyNkZWZpbmUgUjA5MDBfUDFfVE5SQURKIDB4ZjRlYworI2RlZmluZSBUTlJBREogUkVHeChSMDkwMF9QMV9UTlJBREopCisjZGVmaW5lIEYwOTAwX1AxX1NUQjYxWDBfQ0FMVElNRSAweGY0ZWMwMDQwCiAKIC8qUDFfVE5SQ1RMMiovCi0jZGVmaW5lIFIwOTAwX1AxX1ROUkNUTDIgIDB4ZjRlZAotI2RlZmluZSBGMDkwMF9QMV9TVEI2MVgwX0xDUDFfUkNDS09GRiAgMHhmNGVkMDA4MAotI2RlZmluZSBGMDkwMF9QMV9TVEI2MVgwX0xDUDAgIDB4ZjRlZDAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfU1RCNjFYMF9YVE9VVF9SRk9VVFMgIDB4ZjRlZDAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfU1RCNjFYMF9YVE9OX01DS0RWICAweGY0ZWQwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX1NUQjYxWDBfQ0FMT0ZGX0RDT0ZGICAweGY0ZWQwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX1NUQjYxMTBfTFBUICAweGY0ZWQwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX1NUQjYxMTBfUlggIDB4ZjRlZDAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfU1RCNjExMF9TWU4gIDB4ZjRlZDAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfVE5SQ1RMMiAweGY0ZWQKKyNkZWZpbmUgVE5SQ1RMMiBSRUd4KFIwOTAwX1AxX1ROUkNUTDIpCisjZGVmaW5lIEYwOTAwX1AxX1NUQjYxWDBfUkNDS09GRiAweGY0ZWQwMDgwCisjZGVmaW5lIEYwOTAwX1AxX1NUQjYxWDBfSUNQX1NET0ZGIDB4ZjRlZDAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfU1RCNjFYMF9EQ0xPT1BPRkYgMHhmNGVkMDAyMAorI2RlZmluZSBGMDkwMF9QMV9TVEI2MVgwX1JFRk9VVFNFTCAweGY0ZWQwMDEwCisjZGVmaW5lIEYwOTAwX1AxX1NUQjYxWDBfQ0FMT0ZGIDB4ZjRlZDAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfU1RCNlhYMF9MUFRfQkVOIDB4ZjRlZDAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfU1RCNlhYMF9SWF9PU0NQIDB4ZjRlZDAwMDIKKyNkZWZpbmUgRjA5MDBfUDFfU1RCNlhYMF9TWU4gMHhmNGVkMDAwMQogCiAvKlAxX1ROUkNGRzMqLwotI2RlZmluZSBSMDkwMF9QMV9UTlJDRkczICAweGY0ZWUKLSNkZWZpbmUgRjA5MDBfUDFfU1RCNjEyMF9ESVNDVFJMMSAgMHhmNGVlMDA4MAotI2RlZmluZSBGMDkwMF9QMV9TVEI2MTIwX0lOVk9SREVSICAweGY0ZWUwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1NUQjYxMjBfRU5DVFJMNiAgMHhmNGVlMDAyMAotI2RlZmluZSBGMDkwMF9QMV9UVU5fUExMRlJFUSAgMHhmNGVlMDAxYwotI2RlZmluZSBGMDkwMF9QMV9UVU5fSTJDRlJFUV9NT0RFICAweGY0ZWUwMDAzCisjZGVmaW5lIFIwOTAwX1AxX1ROUkNGRzMgMHhmNGVlCisjZGVmaW5lIFROUkNGRzMgUkVHeChSMDkwMF9QMV9UTlJDRkczKQorI2RlZmluZSBGMDkwMF9QMV9UVU5fUExMRlJFUSAweGY0ZWUwMDFjCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9JMkNGUkVRX01PREUgMHhmNGVlMDAwMwogCiAvKlAxX1ROUkxBVU5DSCovCi0jZGVmaW5lIFIwOTAwX1AxX1ROUkxBVU5DSCAgMHhmNGYwCisjZGVmaW5lIFIwOTAwX1AxX1ROUkxBVU5DSCAweGY0ZjAKKyNkZWZpbmUgVE5STEFVTkNIIFJFR3goUjA5MDBfUDFfVE5STEFVTkNIKQogCiAvKlAxX1ROUkxEKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE5STEQgIDB4ZjRmMAotI2RlZmluZSBGMDkwMF9QMV9UVU5MRF9WQ09JTkcgIDB4ZjRmMDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfVFVOX1JFRzFGQUlMICAweGY0ZjAwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9SRUcyRkFJTCAgMHhmNGYwMDAyMAotI2RlZmluZSBGMDkwMF9QMV9UVU5fUkVHM0ZBSUwgIDB4ZjRmMDAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfVFVOX1JFRzRGQUlMICAweGY0ZjAwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX1RVTl9SRUc1RkFJTCAgMHhmNGYwMDAwNAotI2RlZmluZSBGMDkwMF9QMV9UVU5fQldJTkcgIDB4ZjRmMDAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfVFVOX0xPQ0tFRCAgMHhmNGYwMDAwMQorI2RlZmluZSBSMDkwMF9QMV9UTlJMRCAweGY0ZjAKKyNkZWZpbmUgVE5STEQgUkVHeChSMDkwMF9QMV9UTlJMRCkKKyNkZWZpbmUgRjA5MDBfUDFfVFVOTERfVkNPSU5HIDB4ZjRmMDAwODAKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JFRzFGQUlMIDB4ZjRmMDAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JFRzJGQUlMIDB4ZjRmMDAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JFRzNGQUlMIDB4ZjRmMDAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JFRzRGQUlMIDB4ZjRmMDAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX1JFRzVGQUlMIDB4ZjRmMDAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX0JXSU5HIDB4ZjRmMDAwMDIKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX0xPQ0tFRCAweGY0ZjAwMDAxCiAKIC8qUDFfVE5ST0JTTCovCi0jZGVmaW5lIFIwOTAwX1AxX1ROUk9CU0wgIDB4ZjRmNgotI2RlZmluZSBGMDkwMF9QMV9UVU5fSTJDQUJPUlRFRCAgMHhmNGY2MDA4MAotI2RlZmluZSBGMDkwMF9QMV9UVU5fTFBFTiAgMHhmNGY2MDA0MAotI2RlZmluZSBGMDkwMF9QMV9UVU5fRkNDSyAgMHhmNGY2MDAyMAotI2RlZmluZSBGMDkwMF9QMV9UVU5fSTJDTE9DS0VEICAweGY0ZjYwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX1RVTl9QUk9HRE9ORSAgMHhmNGY2MDAwYwotI2RlZmluZSBGMDkwMF9QMV9UVU5fUkZSRVNURTEgIDB4ZjRmNjAwMDMKKyNkZWZpbmUgUjA5MDBfUDFfVE5ST0JTTCAweGY0ZjYKKyNkZWZpbmUgVE5ST0JTTCBSRUd4KFIwOTAwX1AxX1ROUk9CU0wpCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9JMkNBQk9SVEVEIDB4ZjRmNjAwODAKKyNkZWZpbmUgRjA5MDBfUDFfVFVOX0xQRU4gMHhmNGY2MDA0MAorI2RlZmluZSBGMDkwMF9QMV9UVU5fRkNDSyAweGY0ZjYwMDIwCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9JMkNMT0NLRUQgMHhmNGY2MDAxMAorI2RlZmluZSBGMDkwMF9QMV9UVU5fUFJPR0RPTkUgMHhmNGY2MDAwYworI2RlZmluZSBGMDkwMF9QMV9UVU5fUkZSRVNURTEgMHhmNGY2MDAwMwogCiAvKlAxX1ROUlJFU1RFKi8KLSNkZWZpbmUgUjA5MDBfUDFfVE5SUkVTVEUgIDB4ZjRmNwotI2RlZmluZSBGMDkwMF9QMV9UVU5fUkZSRVNURTAgIDB4ZjRmNzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVE5SUkVTVEUgMHhmNGY3CisjZGVmaW5lIFROUlJFU1RFIFJFR3goUjA5MDBfUDFfVE5SUkVTVEUpCisjZGVmaW5lIEYwOTAwX1AxX1RVTl9SRlJFU1RFMCAweGY0ZjcwMGZmCiAKIC8qUDFfU01BUENPRUY3Ki8KLSNkZWZpbmUgUjA5MDBfUDFfU01BUENPRUY3ICAweGY1MDAKLSNkZWZpbmUgRjA5MDBfUDFfRElTX1FTQ0FMRSAgMHhmNTAwMDA4MAotI2RlZmluZSBGMDkwMF9QMV9TTUFQQ09FRl9RX0xMUjEyICAweGY1MDAwMTdmCisjZGVmaW5lIFIwOTAwX1AxX1NNQVBDT0VGNyAweGY1MDAKKyNkZWZpbmUgU01BUENPRUY3IFJFR3goUjA5MDBfUDFfU01BUENPRUY3KQorI2RlZmluZSBGMDkwMF9QMV9ESVNfUVNDQUxFIDB4ZjUwMDAwODAKKyNkZWZpbmUgRjA5MDBfUDFfU01BUENPRUZfUV9MTFIxMiAweGY1MDAwMTdmCiAKIC8qUDFfU01BUENPRUY2Ki8KLSNkZWZpbmUgUjA5MDBfUDFfU01BUENPRUY2ICAweGY1MDEKLSNkZWZpbmUgRjA5MDBfUDFfRElTX05FV1NDQUxFICAweGY1MDEwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0FESl84UFNLTExSMSAgMHhmNTAxMDAwNAotI2RlZmluZSBGMDkwMF9QMV9PTERfOFBTS0xMUjEgIDB4ZjUwMTAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfRElTX0FCOFBTSyAgMHhmNTAxMDAwMQorI2RlZmluZSBSMDkwMF9QMV9TTUFQQ09FRjYgMHhmNTAxCisjZGVmaW5lIFNNQVBDT0VGNiBSRUd4KFIwOTAwX1AxX1NNQVBDT0VGNikKKyNkZWZpbmUgRjA5MDBfUDFfQURKXzhQU0tMTFIxIDB4ZjUwMTAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfT0xEXzhQU0tMTFIxIDB4ZjUwMTAwMDIKKyNkZWZpbmUgRjA5MDBfUDFfRElTX0FCOFBTSyAweGY1MDEwMDAxCiAKIC8qUDFfU01BUENPRUY1Ki8KLSNkZWZpbmUgUjA5MDBfUDFfU01BUENPRUY1ICAweGY1MDIKLSNkZWZpbmUgRjA5MDBfUDFfRElTXzhTQ0FMRSAgMHhmNTAyMDA4MAotI2RlZmluZSBGMDkwMF9QMV9TTUFQQ09FRl84UF9MTFIyMyAgMHhmNTAyMDE3ZgorI2RlZmluZSBSMDkwMF9QMV9TTUFQQ09FRjUgMHhmNTAyCisjZGVmaW5lIFNNQVBDT0VGNSBSRUd4KFIwOTAwX1AxX1NNQVBDT0VGNSkKKyNkZWZpbmUgRjA5MDBfUDFfRElTXzhTQ0FMRSAweGY1MDIwMDgwCisjZGVmaW5lIEYwOTAwX1AxX1NNQVBDT0VGXzhQX0xMUjIzIDB4ZjUwMjAxN2YKKworLypQMV9OQ08yTUFYMSovCisjZGVmaW5lIFIwOTAwX1AxX05DTzJNQVgxIDB4ZjUxNAorI2RlZmluZSBOQ08yTUFYMSBSRUd4KFIwOTAwX1AxX05DTzJNQVgxKQorI2RlZmluZSBGMDkwMF9QMV9URVRBMl9NQVhWQUJTMSAweGY1MTQwMGZmCisKKy8qUDFfTkNPMk1BWDAqLworI2RlZmluZSBSMDkwMF9QMV9OQ08yTUFYMCAweGY1MTUKKyNkZWZpbmUgTkNPMk1BWDAgUkVHeChSMDkwMF9QMV9OQ08yTUFYMCkKKyNkZWZpbmUgRjA5MDBfUDFfVEVUQTJfTUFYVkFCUzAgMHhmNTE1MDBmZgorCisvKlAxX05DTzJGUjEqLworI2RlZmluZSBSMDkwMF9QMV9OQ08yRlIxIDB4ZjUxNgorI2RlZmluZSBOQ08yRlIxIFJFR3goUjA5MDBfUDFfTkNPMkZSMSkKKyNkZWZpbmUgRjA5MDBfUDFfTkNPMkZJTkFMX0FOR0xFMSAweGY1MTYwMGZmCisKKy8qUDFfTkNPMkZSMCovCisjZGVmaW5lIFIwOTAwX1AxX05DTzJGUjAgMHhmNTE3CisjZGVmaW5lIE5DTzJGUjAgUkVHeChSMDkwMF9QMV9OQ08yRlIwKQorI2RlZmluZSBGMDkwMF9QMV9OQ08yRklOQUxfQU5HTEUwIDB4ZjUxNzAwZmYKKworLypQMV9DRlIyQVZSR0UxKi8KKyNkZWZpbmUgUjA5MDBfUDFfQ0ZSMkFWUkdFMSAweGY1MTgKKyNkZWZpbmUgQ0ZSMkFWUkdFMSBSRUd4KFIwOTAwX1AxX0NGUjJBVlJHRTEpCisjZGVmaW5lIEYwOTAwX1AxX0kyQ19DRlIyQVZFUkFHRTEgMHhmNTE4MDBmZgorCisvKlAxX0NGUjJBVlJHRTAqLworI2RlZmluZSBSMDkwMF9QMV9DRlIyQVZSR0UwIDB4ZjUxOQorI2RlZmluZSBDRlIyQVZSR0UwIFJFR3goUjA5MDBfUDFfQ0ZSMkFWUkdFMCkKKyNkZWZpbmUgRjA5MDBfUDFfSTJDX0NGUjJBVkVSQUdFMCAweGY1MTkwMGZmCiAKIC8qUDFfRE1EUExIU1RBVCovCi0jZGVmaW5lIFIwOTAwX1AxX0RNRFBMSFNUQVQgIDB4ZjUyMAotI2RlZmluZSBGMDkwMF9QMV9QTEhfU1RBVElTVElDICAweGY1MjAwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0RNRFBMSFNUQVQgMHhmNTIwCisjZGVmaW5lIERNRFBMSFNUQVQgUkVHeChSMDkwMF9QMV9ETURQTEhTVEFUKQorI2RlZmluZSBGMDkwMF9QMV9QTEhfU1RBVElTVElDIDB4ZjUyMDAwZmYKIAogLypQMV9MT0NLVElNRTMqLwotI2RlZmluZSBSMDkwMF9QMV9MT0NLVElNRTMgIDB4ZjUyMgotI2RlZmluZSBGMDkwMF9QMV9ERU1PRF9MT0NLVElNRTMgIDB4ZjUyMjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTE9DS1RJTUUzIDB4ZjUyMgorI2RlZmluZSBMT0NLVElNRTMgUkVHeChSMDkwMF9QMV9MT0NLVElNRTMpCisjZGVmaW5lIEYwOTAwX1AxX0RFTU9EX0xPQ0tUSU1FMyAweGY1MjIwMGZmCiAKIC8qUDFfTE9DS1RJTUUyKi8KLSNkZWZpbmUgUjA5MDBfUDFfTE9DS1RJTUUyICAweGY1MjMKLSNkZWZpbmUgRjA5MDBfUDFfREVNT0RfTE9DS1RJTUUyICAweGY1MjMwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0xPQ0tUSU1FMiAweGY1MjMKKyNkZWZpbmUgTE9DS1RJTUUyIFJFR3goUjA5MDBfUDFfTE9DS1RJTUUyKQorI2RlZmluZSBGMDkwMF9QMV9ERU1PRF9MT0NLVElNRTIgMHhmNTIzMDBmZgogCiAvKlAxX0xPQ0tUSU1FMSovCi0jZGVmaW5lIFIwOTAwX1AxX0xPQ0tUSU1FMSAgMHhmNTI0Ci0jZGVmaW5lIEYwOTAwX1AxX0RFTU9EX0xPQ0tUSU1FMSAgMHhmNTI0MDBmZgorI2RlZmluZSBSMDkwMF9QMV9MT0NLVElNRTEgMHhmNTI0CisjZGVmaW5lIExPQ0tUSU1FMSBSRUd4KFIwOTAwX1AxX0xPQ0tUSU1FMSkKKyNkZWZpbmUgRjA5MDBfUDFfREVNT0RfTE9DS1RJTUUxIDB4ZjUyNDAwZmYKIAogLypQMV9MT0NLVElNRTAqLwotI2RlZmluZSBSMDkwMF9QMV9MT0NLVElNRTAgIDB4ZjUyNQotI2RlZmluZSBGMDkwMF9QMV9ERU1PRF9MT0NLVElNRTAgIDB4ZjUyNTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTE9DS1RJTUUwIDB4ZjUyNQorI2RlZmluZSBMT0NLVElNRTAgUkVHeChSMDkwMF9QMV9MT0NLVElNRTApCisjZGVmaW5lIEYwOTAwX1AxX0RFTU9EX0xPQ0tUSU1FMCAweGY1MjUwMGZmCiAKIC8qUDFfVklUU0NBTEUqLwotI2RlZmluZSBSMDkwMF9QMV9WSVRTQ0FMRSAgMHhmNTMyCi0jZGVmaW5lIEYwOTAwX1AxX05WVEhfTk9TUkFOR0UgIDB4ZjUzMjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfVkVSUk9SX01BWE1PREUgIDB4ZjUzMjAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfS0RJVl9NT0RFICAweGY1MzIwMDMwCi0jZGVmaW5lIEYwOTAwX1AxX05TTE9XU05fTE9DS0VEICAweGY1MzIwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0RFTE9DS19QUkZMT1NTICAweGY1MzIwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX0RJU19SU0ZMT0NLICAweGY1MzIwMDAyCisjZGVmaW5lIFIwOTAwX1AxX1ZJVFNDQUxFIDB4ZjUzMgorI2RlZmluZSBWSVRTQ0FMRSBSRUd4KFIwOTAwX1AxX1ZJVFNDQUxFKQorI2RlZmluZSBGMDkwMF9QMV9OVlRIX05PU1JBTkdFIDB4ZjUzMjAwODAKKyNkZWZpbmUgRjA5MDBfUDFfVkVSUk9SX01BWE1PREUgMHhmNTMyMDA0MAorI2RlZmluZSBGMDkwMF9QMV9OU0xPV1NOX0xPQ0tFRCAweGY1MzIwMDA4CisjZGVmaW5lIEYwOTAwX1AxX0RJU19SU0ZMT0NLIDB4ZjUzMjAwMDIKIAogLypQMV9GRUNNKi8KLSNkZWZpbmUgUjA5MDBfUDFfRkVDTSAgMHhmNTMzCi0jZGVmaW5lIEYwOTAwX1AxX0RTU19EVkIgIDB4ZjUzMzAwODAKLSNkZWZpbmUgRjA5MDBfUDFfREVNT0RfQllQQVNTICAweGY1MzMwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0NNUF9TTE9XTU9ERSAgMHhmNTMzMDAyMAotI2RlZmluZSBGMDkwMF9QMV9EU1NfU1JDSCAgMHhmNTMzMDAxMAotI2RlZmluZSBGMDkwMF9QMV9ESUZGX01PREVWSVQgIDB4ZjUzMzAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfU1lOQ1ZJVCAgMHhmNTMzMDAwMgotI2RlZmluZSBGMDkwMF9QMV9JUUlOViAgMHhmNTMzMDAwMQorI2RlZmluZSBSMDkwMF9QMV9GRUNNIDB4ZjUzMworI2RlZmluZSBGRUNNIFJFR3goUjA5MDBfUDFfRkVDTSkKKyNkZWZpbmUgRjA5MDBfUDFfRFNTX0RWQiAweGY1MzMwMDgwCisjZGVmaW5lIERTU19EVkIgRkxEeChGMDkwMF9QMV9EU1NfRFZCKQorI2RlZmluZSBGMDkwMF9QMV9EU1NfU1JDSCAweGY1MzMwMDEwCisjZGVmaW5lIEYwOTAwX1AxX1NZTkNWSVQgMHhmNTMzMDAwMgorI2RlZmluZSBGMDkwMF9QMV9JUUlOViAweGY1MzMwMDAxCisjZGVmaW5lIElRSU5WIEZMRHgoRjA5MDBfUDFfSVFJTlYpCiAKIC8qUDFfVlRIMTIqLwotI2RlZmluZSBSMDkwMF9QMV9WVEgxMiAgMHhmNTM0Ci0jZGVmaW5lIEYwOTAwX1AxX1ZUSDEyICAweGY1MzQwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ZUSDEyIDB4ZjUzNAorI2RlZmluZSBWVEgxMiBSRUd4KFIwOTAwX1AxX1ZUSDEyKQorI2RlZmluZSBGMDkwMF9QMV9WVEgxMiAweGY1MzQwMGZmCiAKIC8qUDFfVlRIMjMqLwotI2RlZmluZSBSMDkwMF9QMV9WVEgyMyAgMHhmNTM1Ci0jZGVmaW5lIEYwOTAwX1AxX1ZUSDIzICAweGY1MzUwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ZUSDIzIDB4ZjUzNQorI2RlZmluZSBWVEgyMyBSRUd4KFIwOTAwX1AxX1ZUSDIzKQorI2RlZmluZSBGMDkwMF9QMV9WVEgyMyAweGY1MzUwMGZmCiAKIC8qUDFfVlRIMzQqLwotI2RlZmluZSBSMDkwMF9QMV9WVEgzNCAgMHhmNTM2Ci0jZGVmaW5lIEYwOTAwX1AxX1ZUSDM0ICAweGY1MzYwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ZUSDM0IDB4ZjUzNgorI2RlZmluZSBWVEgzNCBSRUd4KFIwOTAwX1AxX1ZUSDM0KQorI2RlZmluZSBGMDkwMF9QMV9WVEgzNCAweGY1MzYwMGZmCiAKIC8qUDFfVlRINTYqLwotI2RlZmluZSBSMDkwMF9QMV9WVEg1NiAgMHhmNTM3Ci0jZGVmaW5lIEYwOTAwX1AxX1ZUSDU2ICAweGY1MzcwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ZUSDU2IDB4ZjUzNworI2RlZmluZSBWVEg1NiBSRUd4KFIwOTAwX1AxX1ZUSDU2KQorI2RlZmluZSBGMDkwMF9QMV9WVEg1NiAweGY1MzcwMGZmCiAKIC8qUDFfVlRINjcqLwotI2RlZmluZSBSMDkwMF9QMV9WVEg2NyAgMHhmNTM4Ci0jZGVmaW5lIEYwOTAwX1AxX1ZUSDY3ICAweGY1MzgwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ZUSDY3IDB4ZjUzOAorI2RlZmluZSBWVEg2NyBSRUd4KFIwOTAwX1AxX1ZUSDY3KQorI2RlZmluZSBGMDkwMF9QMV9WVEg2NyAweGY1MzgwMGZmCiAKIC8qUDFfVlRINzgqLwotI2RlZmluZSBSMDkwMF9QMV9WVEg3OCAgMHhmNTM5Ci0jZGVmaW5lIEYwOTAwX1AxX1ZUSDc4ICAweGY1MzkwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ZUSDc4IDB4ZjUzOQorI2RlZmluZSBWVEg3OCBSRUd4KFIwOTAwX1AxX1ZUSDc4KQorI2RlZmluZSBGMDkwMF9QMV9WVEg3OCAweGY1MzkwMGZmCiAKIC8qUDFfVklUQ1VSUFVOKi8KLSNkZWZpbmUgUjA5MDBfUDFfVklUQ1VSUFVOICAweGY1M2EKLSNkZWZpbmUgRjA5MDBfUDFfVklUX01BUFBJTkcgIDB4ZjUzYTAwZTAKLSNkZWZpbmUgRjA5MDBfUDFfVklUX0NVUlBVTiAgMHhmNTNhMDAxZgorI2RlZmluZSBSMDkwMF9QMV9WSVRDVVJQVU4gMHhmNTNhCisjZGVmaW5lIFZJVENVUlBVTiBSRUd4KFIwOTAwX1AxX1ZJVENVUlBVTikKKyNkZWZpbmUgRjA5MDBfUDFfVklUX0NVUlBVTiAweGY1M2EwMDFmCisjZGVmaW5lIFZJVF9DVVJQVU4gRkxEeChGMDkwMF9QMV9WSVRfQ1VSUFVOKQogCiAvKlAxX1ZFUlJPUiovCi0jZGVmaW5lIFIwOTAwX1AxX1ZFUlJPUiAgMHhmNTNiCi0jZGVmaW5lIEYwOTAwX1AxX1JFR0VSUl9WSVQgIDB4ZjUzYjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVkVSUk9SIDB4ZjUzYgorI2RlZmluZSBWRVJST1IgUkVHeChSMDkwMF9QMV9WRVJST1IpCisjZGVmaW5lIEYwOTAwX1AxX1JFR0VSUl9WSVQgMHhmNTNiMDBmZgogCiAvKlAxX1BSVklUKi8KLSNkZWZpbmUgUjA5MDBfUDFfUFJWSVQgIDB4ZjUzYwotI2RlZmluZSBGMDkwMF9QMV9ESVNfVlRITE9DSyAgMHhmNTNjMDA0MAotI2RlZmluZSBGMDkwMF9QMV9FN184VklUICAweGY1M2MwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX0U2XzdWSVQgIDB4ZjUzYzAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfRTVfNlZJVCAgMHhmNTNjMDAwOAotI2RlZmluZSBGMDkwMF9QMV9FM180VklUICAweGY1M2MwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX0UyXzNWSVQgIDB4ZjUzYzAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfRTFfMlZJVCAgMHhmNTNjMDAwMQorI2RlZmluZSBSMDkwMF9QMV9QUlZJVCAweGY1M2MKKyNkZWZpbmUgUFJWSVQgUkVHeChSMDkwMF9QMV9QUlZJVCkKKyNkZWZpbmUgRjA5MDBfUDFfRElTX1ZUSExPQ0sgMHhmNTNjMDA0MAorI2RlZmluZSBGMDkwMF9QMV9FN184VklUIDB4ZjUzYzAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfRTZfN1ZJVCAweGY1M2MwMDEwCisjZGVmaW5lIEYwOTAwX1AxX0U1XzZWSVQgMHhmNTNjMDAwOAorI2RlZmluZSBGMDkwMF9QMV9FM180VklUIDB4ZjUzYzAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfRTJfM1ZJVCAweGY1M2MwMDAyCisjZGVmaW5lIEYwOTAwX1AxX0UxXzJWSVQgMHhmNTNjMDAwMQogCiAvKlAxX1ZBVlNSVklUKi8KLSNkZWZpbmUgUjA5MDBfUDFfVkFWU1JWSVQgIDB4ZjUzZAotI2RlZmluZSBGMDkwMF9QMV9BTVZJVCAgMHhmNTNkMDA4MAotI2RlZmluZSBGMDkwMF9QMV9GUk9aRU5WSVQgIDB4ZjUzZDAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfU05WSVQgIDB4ZjUzZDAwMzAKLSNkZWZpbmUgRjA5MDBfUDFfVE9WVklUICAweGY1M2QwMDBjCi0jZGVmaW5lIEYwOTAwX1AxX0hZUFZJVCAgMHhmNTNkMDAwMworI2RlZmluZSBSMDkwMF9QMV9WQVZTUlZJVCAweGY1M2QKKyNkZWZpbmUgVkFWU1JWSVQgUkVHeChSMDkwMF9QMV9WQVZTUlZJVCkKKyNkZWZpbmUgRjA5MDBfUDFfQU1WSVQgMHhmNTNkMDA4MAorI2RlZmluZSBGMDkwMF9QMV9GUk9aRU5WSVQgMHhmNTNkMDA0MAorI2RlZmluZSBGMDkwMF9QMV9TTlZJVCAweGY1M2QwMDMwCisjZGVmaW5lIEYwOTAwX1AxX1RPVlZJVCAweGY1M2QwMDBjCisjZGVmaW5lIEYwOTAwX1AxX0hZUFZJVCAweGY1M2QwMDAzCiAKIC8qUDFfVlNUQVRVU1ZJVCovCi0jZGVmaW5lIFIwOTAwX1AxX1ZTVEFUVVNWSVQgIDB4ZjUzZQotI2RlZmluZSBGMDkwMF9QMV9WSVRFUkJJX09OICAweGY1M2UwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0VORF9MT09QVklUICAweGY1M2UwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1ZJVEVSQklfREVQUkYgIDB4ZjUzZTAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfUFJGVklUICAweGY1M2UwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX0xPQ0tFRFZJVCAgMHhmNTNlMDAwOAotI2RlZmluZSBGMDkwMF9QMV9WSVRFUkJJX0RFTE9DSyAgMHhmNTNlMDAwNAotI2RlZmluZSBGMDkwMF9QMV9WSVRfREVNT0RTRUwgIDB4ZjUzZTAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfVklURVJCSV9DT01QT1VUICAweGY1M2UwMDAxCisjZGVmaW5lIFIwOTAwX1AxX1ZTVEFUVVNWSVQgMHhmNTNlCisjZGVmaW5lIFZTVEFUVVNWSVQgUkVHeChSMDkwMF9QMV9WU1RBVFVTVklUKQorI2RlZmluZSBGMDkwMF9QMV9QUkZWSVQgMHhmNTNlMDAxMAorI2RlZmluZSBQUkZWSVQgRkxEeChGMDkwMF9QMV9QUkZWSVQpCisjZGVmaW5lIEYwOTAwX1AxX0xPQ0tFRFZJVCAweGY1M2UwMDA4CisjZGVmaW5lIExPQ0tFRFZJVCBGTER4KEYwOTAwX1AxX0xPQ0tFRFZJVCkKIAogLypQMV9WVEhJTlVTRSovCi0jZGVmaW5lIFIwOTAwX1AxX1ZUSElOVVNFICAweGY1M2YKLSNkZWZpbmUgRjA5MDBfUDFfVklUX0lOVVNFICAweGY1M2YwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1ZUSElOVVNFIDB4ZjUzZgorI2RlZmluZSBWVEhJTlVTRSBSRUd4KFIwOTAwX1AxX1ZUSElOVVNFKQorI2RlZmluZSBGMDkwMF9QMV9WSVRfSU5VU0UgMHhmNTNmMDBmZgogCiAvKlAxX0tESVYxMiovCi0jZGVmaW5lIFIwOTAwX1AxX0tESVYxMiAgMHhmNTQwCi0jZGVmaW5lIEYwOTAwX1AxX0tESVYxMl9NQU5VQUwgIDB4ZjU0MDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfS19ESVZJREVSXzEyICAweGY1NDAwMDdmCisjZGVmaW5lIFIwOTAwX1AxX0tESVYxMiAweGY1NDAKKyNkZWZpbmUgS0RJVjEyIFJFR3goUjA5MDBfUDFfS0RJVjEyKQorI2RlZmluZSBGMDkwMF9QMV9LX0RJVklERVJfMTIgMHhmNTQwMDA3ZgogCiAvKlAxX0tESVYyMyovCi0jZGVmaW5lIFIwOTAwX1AxX0tESVYyMyAgMHhmNTQxCi0jZGVmaW5lIEYwOTAwX1AxX0tESVYyM19NQU5VQUwgIDB4ZjU0MTAwODAKLSNkZWZpbmUgRjA5MDBfUDFfS19ESVZJREVSXzIzICAweGY1NDEwMDdmCisjZGVmaW5lIFIwOTAwX1AxX0tESVYyMyAweGY1NDEKKyNkZWZpbmUgS0RJVjIzIFJFR3goUjA5MDBfUDFfS0RJVjIzKQorI2RlZmluZSBGMDkwMF9QMV9LX0RJVklERVJfMjMgMHhmNTQxMDA3ZgogCiAvKlAxX0tESVYzNCovCi0jZGVmaW5lIFIwOTAwX1AxX0tESVYzNCAgMHhmNTQyCi0jZGVmaW5lIEYwOTAwX1AxX0tESVYzNF9NQU5VQUwgIDB4ZjU0MjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfS19ESVZJREVSXzM0ICAweGY1NDIwMDdmCisjZGVmaW5lIFIwOTAwX1AxX0tESVYzNCAweGY1NDIKKyNkZWZpbmUgS0RJVjM0IFJFR3goUjA5MDBfUDFfS0RJVjM0KQorI2RlZmluZSBGMDkwMF9QMV9LX0RJVklERVJfMzQgMHhmNTQyMDA3ZgogCiAvKlAxX0tESVY1NiovCi0jZGVmaW5lIFIwOTAwX1AxX0tESVY1NiAgMHhmNTQzCi0jZGVmaW5lIEYwOTAwX1AxX0tESVY1Nl9NQU5VQUwgIDB4ZjU0MzAwODAKLSNkZWZpbmUgRjA5MDBfUDFfS19ESVZJREVSXzU2ICAweGY1NDMwMDdmCisjZGVmaW5lIFIwOTAwX1AxX0tESVY1NiAweGY1NDMKKyNkZWZpbmUgS0RJVjU2IFJFR3goUjA5MDBfUDFfS0RJVjU2KQorI2RlZmluZSBGMDkwMF9QMV9LX0RJVklERVJfNTYgMHhmNTQzMDA3ZgogCiAvKlAxX0tESVY2NyovCi0jZGVmaW5lIFIwOTAwX1AxX0tESVY2NyAgMHhmNTQ0Ci0jZGVmaW5lIEYwOTAwX1AxX0tESVY2N19NQU5VQUwgIDB4ZjU0NDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfS19ESVZJREVSXzY3ICAweGY1NDQwMDdmCisjZGVmaW5lIFIwOTAwX1AxX0tESVY2NyAweGY1NDQKKyNkZWZpbmUgS0RJVjY3IFJFR3goUjA5MDBfUDFfS0RJVjY3KQorI2RlZmluZSBGMDkwMF9QMV9LX0RJVklERVJfNjcgMHhmNTQ0MDA3ZgogCiAvKlAxX0tESVY3OCovCi0jZGVmaW5lIFIwOTAwX1AxX0tESVY3OCAgMHhmNTQ1Ci0jZGVmaW5lIEYwOTAwX1AxX0tESVY3OF9NQU5VQUwgIDB4ZjU0NTAwODAKLSNkZWZpbmUgRjA5MDBfUDFfS19ESVZJREVSXzc4ICAweGY1NDUwMDdmCisjZGVmaW5lIFIwOTAwX1AxX0tESVY3OCAweGY1NDUKKyNkZWZpbmUgS0RJVjc4IFJFR3goUjA5MDBfUDFfS0RJVjc4KQorI2RlZmluZSBGMDkwMF9QMV9LX0RJVklERVJfNzggMHhmNTQ1MDA3ZgogCiAvKlAxX1BERUxDVFJMMSovCi0jZGVmaW5lIFIwOTAwX1AxX1BERUxDVFJMMSAgMHhmNTUwCi0jZGVmaW5lIEYwOTAwX1AxX0lOVl9NSVNNQVNLICAweGY1NTAwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0ZPUkNFX0FDQ0VQVEVEICAweGY1NTAwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0ZJTFRFUl9FTiAgMHhmNTUwMDAyMAotI2RlZmluZSBGMDkwMF9QMV9GT1JDRV9QS1RERUxJTlVTRSAgMHhmNTUwMDAxMAotI2RlZmluZSBGMDkwMF9QMV9IWVNURU4gIDB4ZjU1MDAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfSFlTVFNXUlNUICAweGY1NTAwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX0VOX01JUzAwICAweGY1NTAwMDAyCi0jZGVmaW5lIEYwOTAwX1AxX0FMR09TV1JTVCAgMHhmNTUwMDAwMQorI2RlZmluZSBSMDkwMF9QMV9QREVMQ1RSTDEgMHhmNTUwCisjZGVmaW5lIFBERUxDVFJMMSBSRUd4KFIwOTAwX1AxX1BERUxDVFJMMSkKKyNkZWZpbmUgRjA5MDBfUDFfSU5WX01JU01BU0sgMHhmNTUwMDA4MAorI2RlZmluZSBGMDkwMF9QMV9GSUxURVJfRU4gMHhmNTUwMDAyMAorI2RlZmluZSBGMDkwMF9QMV9FTl9NSVMwMCAweGY1NTAwMDAyCisjZGVmaW5lIEYwOTAwX1AxX0FMR09TV1JTVCAweGY1NTAwMDAxCisjZGVmaW5lIEFMR09TV1JTVCBGTER4KEYwOTAwX1AxX0FMR09TV1JTVCkKIAogLypQMV9QREVMQ1RSTDIqLwotI2RlZmluZSBSMDkwMF9QMV9QREVMQ1RSTDIgIDB4ZjU1MQotI2RlZmluZSBGMDkwMF9QMV9GT1JDRV9DT05USU5VT1VTICAweGY1NTEwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1JFU0VUX1VQS09fQ09VTlQgIDB4ZjU1MTAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfVVNFUl9QS1RERUxJTl9OQiAgMHhmNTUxMDAyMAotI2RlZmluZSBGMDkwMF9QMV9GT1JDRV9MT0NLRUQgIDB4ZjU1MTAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfREFUQV9VTkJCU0NSQU0gIDB4ZjU1MTAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfRk9SQ0VfTE9OR1BLVCAgMHhmNTUxMDAwNAotI2RlZmluZSBGMDkwMF9QMV9GUkFNRV9NT0RFICAweGY1NTEwMDAyCisjZGVmaW5lIFIwOTAwX1AxX1BERUxDVFJMMiAweGY1NTEKKyNkZWZpbmUgUERFTENUUkwyIFJFR3goUjA5MDBfUDFfUERFTENUUkwyKQorI2RlZmluZSBGMDkwMF9QMV9SRVNFVF9VUEtPX0NPVU5UIDB4ZjU1MTAwNDAKKyNkZWZpbmUgUkVTRVRfVVBLT19DT1VOVCBGTER4KEYwOTAwX1AxX1JFU0VUX1VQS09fQ09VTlQpCisjZGVmaW5lIEYwOTAwX1AxX0ZSQU1FX01PREUgMHhmNTUxMDAwMgorI2RlZmluZSBGMDkwMF9QMV9OT0JDSEVSUkZMR19VU0UgMHhmNTUxMDAwMQogCiAvKlAxX0hZU1RUSFJFU0gqLwotI2RlZmluZSBSMDkwMF9QMV9IWVNUVEhSRVNIICAweGY1NTQKLSNkZWZpbmUgRjA5MDBfUDFfVU5MQ0tfVEhSRVNIICAweGY1NTQwMGYwCi0jZGVmaW5lIEYwOTAwX1AxX0RFTElOX0xDS19USFJFU0ggIDB4ZjU1NDAwMGYKKyNkZWZpbmUgUjA5MDBfUDFfSFlTVFRIUkVTSCAweGY1NTQKKyNkZWZpbmUgSFlTVFRIUkVTSCBSRUd4KFIwOTAwX1AxX0hZU1RUSFJFU0gpCisjZGVmaW5lIEYwOTAwX1AxX1VOTENLX1RIUkVTSCAweGY1NTQwMGYwCisjZGVmaW5lIEYwOTAwX1AxX0RFTElOX0xDS19USFJFU0ggMHhmNTU0MDAwZgogCiAvKlAxX0lTSUVOVFJZKi8KLSNkZWZpbmUgUjA5MDBfUDFfSVNJRU5UUlkgIDB4ZjU1ZQotI2RlZmluZSBGMDkwMF9QMV9JU0lfRU5UUlkgIDB4ZjU1ZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfSVNJRU5UUlkgMHhmNTVlCisjZGVmaW5lIElTSUVOVFJZIFJFR3goUjA5MDBfUDFfSVNJRU5UUlkpCisjZGVmaW5lIEYwOTAwX1AxX0lTSV9FTlRSWSAweGY1NWUwMGZmCiAKIC8qUDFfSVNJQklURU5BKi8KLSNkZWZpbmUgUjA5MDBfUDFfSVNJQklURU5BICAweGY1NWYKLSNkZWZpbmUgRjA5MDBfUDFfSVNJX0JJVF9FTiAgMHhmNTVmMDBmZgorI2RlZmluZSBSMDkwMF9QMV9JU0lCSVRFTkEgMHhmNTVmCisjZGVmaW5lIElTSUJJVEVOQSBSRUd4KFIwOTAwX1AxX0lTSUJJVEVOQSkKKyNkZWZpbmUgRjA5MDBfUDFfSVNJX0JJVF9FTiAweGY1NWYwMGZmCiAKIC8qUDFfTUFUU1RSMSovCi0jZGVmaW5lIFIwOTAwX1AxX01BVFNUUjEgIDB4ZjU2MAotI2RlZmluZSBGMDkwMF9QMV9NQVRZUEVfQ1VSUkVOVDEgIDB4ZjU2MDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTUFUU1RSMSAweGY1NjAKKyNkZWZpbmUgTUFUU1RSMSBSRUd4KFIwOTAwX1AxX01BVFNUUjEpCisjZGVmaW5lIEYwOTAwX1AxX01BVFlQRV9DVVJSRU5UMSAweGY1NjAwMGZmCiAKIC8qUDFfTUFUU1RSMCovCi0jZGVmaW5lIFIwOTAwX1AxX01BVFNUUjAgIDB4ZjU2MQotI2RlZmluZSBGMDkwMF9QMV9NQVRZUEVfQ1VSUkVOVDAgIDB4ZjU2MTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfTUFUU1RSMCAweGY1NjEKKyNkZWZpbmUgTUFUU1RSMCBSRUd4KFIwOTAwX1AxX01BVFNUUjApCisjZGVmaW5lIEYwOTAwX1AxX01BVFlQRV9DVVJSRU5UMCAweGY1NjEwMGZmCiAKIC8qUDFfVVBMU1RSMSovCi0jZGVmaW5lIFIwOTAwX1AxX1VQTFNUUjEgIDB4ZjU2MgotI2RlZmluZSBGMDkwMF9QMV9VUExfQ1VSUkVOVDEgIDB4ZjU2MjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVVBMU1RSMSAweGY1NjIKKyNkZWZpbmUgVVBMU1RSMSBSRUd4KFIwOTAwX1AxX1VQTFNUUjEpCisjZGVmaW5lIEYwOTAwX1AxX1VQTF9DVVJSRU5UMSAweGY1NjIwMGZmCiAKIC8qUDFfVVBMU1RSMCovCi0jZGVmaW5lIFIwOTAwX1AxX1VQTFNUUjAgIDB4ZjU2MwotI2RlZmluZSBGMDkwMF9QMV9VUExfQ1VSUkVOVDAgIDB4ZjU2MzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVVBMU1RSMCAweGY1NjMKKyNkZWZpbmUgVVBMU1RSMCBSRUd4KFIwOTAwX1AxX1VQTFNUUjApCisjZGVmaW5lIEYwOTAwX1AxX1VQTF9DVVJSRU5UMCAweGY1NjMwMGZmCiAKIC8qUDFfREZMU1RSMSovCi0jZGVmaW5lIFIwOTAwX1AxX0RGTFNUUjEgIDB4ZjU2NAotI2RlZmluZSBGMDkwMF9QMV9ERkxfQ1VSUkVOVDEgIDB4ZjU2NDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfREZMU1RSMSAweGY1NjQKKyNkZWZpbmUgREZMU1RSMSBSRUd4KFIwOTAwX1AxX0RGTFNUUjEpCisjZGVmaW5lIEYwOTAwX1AxX0RGTF9DVVJSRU5UMSAweGY1NjQwMGZmCiAKIC8qUDFfREZMU1RSMCovCi0jZGVmaW5lIFIwOTAwX1AxX0RGTFNUUjAgIDB4ZjU2NQotI2RlZmluZSBGMDkwMF9QMV9ERkxfQ1VSUkVOVDAgIDB4ZjU2NTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfREZMU1RSMCAweGY1NjUKKyNkZWZpbmUgREZMU1RSMCBSRUd4KFIwOTAwX1AxX0RGTFNUUjApCisjZGVmaW5lIEYwOTAwX1AxX0RGTF9DVVJSRU5UMCAweGY1NjUwMGZmCiAKIC8qUDFfU1lOQ1NUUiovCi0jZGVmaW5lIFIwOTAwX1AxX1NZTkNTVFIgIDB4ZjU2NgotI2RlZmluZSBGMDkwMF9QMV9TWU5DX0NVUlJFTlQgIDB4ZjU2NjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfU1lOQ1NUUiAweGY1NjYKKyNkZWZpbmUgU1lOQ1NUUiBSRUd4KFIwOTAwX1AxX1NZTkNTVFIpCisjZGVmaW5lIEYwOTAwX1AxX1NZTkNfQ1VSUkVOVCAweGY1NjYwMGZmCiAKIC8qUDFfU1lOQ0RTVFIxKi8KLSNkZWZpbmUgUjA5MDBfUDFfU1lOQ0RTVFIxICAweGY1NjcKLSNkZWZpbmUgRjA5MDBfUDFfU1lOQ0RfQ1VSUkVOVDEgIDB4ZjU2NzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfU1lOQ0RTVFIxIDB4ZjU2NworI2RlZmluZSBTWU5DRFNUUjEgUkVHeChSMDkwMF9QMV9TWU5DRFNUUjEpCisjZGVmaW5lIEYwOTAwX1AxX1NZTkNEX0NVUlJFTlQxIDB4ZjU2NzAwZmYKIAogLypQMV9TWU5DRFNUUjAqLwotI2RlZmluZSBSMDkwMF9QMV9TWU5DRFNUUjAgIDB4ZjU2OAotI2RlZmluZSBGMDkwMF9QMV9TWU5DRF9DVVJSRU5UMCAgMHhmNTY4MDBmZgorI2RlZmluZSBSMDkwMF9QMV9TWU5DRFNUUjAgMHhmNTY4CisjZGVmaW5lIFNZTkNEU1RSMCBSRUd4KFIwOTAwX1AxX1NZTkNEU1RSMCkKKyNkZWZpbmUgRjA5MDBfUDFfU1lOQ0RfQ1VSUkVOVDAgMHhmNTY4MDBmZgogCiAvKlAxX1BERUxTVEFUVVMxKi8KLSNkZWZpbmUgUjA5MDBfUDFfUERFTFNUQVRVUzEgIDB4ZjU2OQotI2RlZmluZSBGMDkwMF9QMV9QS1RERUxJTl9ERUxPQ0sgIDB4ZjU2OTAwODAKLSNkZWZpbmUgRjA5MDBfUDFfU1lOQ0RVUERGTF9CQURERkwgIDB4ZjU2OTAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfQ09OVElOVU9VU19TVFJFQU0gIDB4ZjU2OTAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfVU5BQ0NFUFRFRF9TVFJFQU0gIDB4ZjU2OTAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfQkNIX0VSUk9SX0ZMQUcgIDB4ZjU2OTAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfQkJIQ1JDS08gIDB4ZjU2OTAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfUEtUREVMSU5fTE9DSyAgMHhmNTY5MDAwMgotI2RlZmluZSBGMDkwMF9QMV9GSVJTVF9MT0NLICAweGY1NjkwMDAxCisjZGVmaW5lIFIwOTAwX1AxX1BERUxTVEFUVVMxIDB4ZjU2OQorI2RlZmluZSBGMDkwMF9QMV9QS1RERUxJTl9ERUxPQ0sgMHhmNTY5MDA4MAorI2RlZmluZSBGMDkwMF9QMV9TWU5DRFVQREZMX0JBRERGTCAweGY1NjkwMDQwCisjZGVmaW5lIEYwOTAwX1AxX0NPTlRJTlVPVVNfU1RSRUFNIDB4ZjU2OTAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfVU5BQ0NFUFRFRF9TVFJFQU0gMHhmNTY5MDAxMAorI2RlZmluZSBGMDkwMF9QMV9CQ0hfRVJST1JfRkxBRyAweGY1NjkwMDA4CisjZGVmaW5lIEYwOTAwX1AxX1BLVERFTElOX0xPQ0sgMHhmNTY5MDAwMgorI2RlZmluZSBQS1RERUxJTl9MT0NLIEZMRHgoRjA5MDBfUDFfUEtUREVMSU5fTE9DSykKKyNkZWZpbmUgRjA5MDBfUDFfRklSU1RfTE9DSyAweGY1NjkwMDAxCiAKIC8qUDFfUERFTFNUQVRVUzIqLwotI2RlZmluZSBSMDkwMF9QMV9QREVMU1RBVFVTMiAgMHhmNTZhCi0jZGVmaW5lIEYwOTAwX1AxX1BLVERFTF9ERU1PRFNFTCAgMHhmNTZhMDA4MAotI2RlZmluZSBGMDkwMF9QMV9GUkFNRV9NT0RDT0QgIDB4ZjU2YTAwN2MKLSNkZWZpbmUgRjA5MDBfUDFfRlJBTUVfVFlQRSAgMHhmNTZhMDAwMworI2RlZmluZSBSMDkwMF9QMV9QREVMU1RBVFVTMiAweGY1NmEKKyNkZWZpbmUgRjA5MDBfUDFfRlJBTUVfTU9EQ09EIDB4ZjU2YTAwN2MKKyNkZWZpbmUgRjA5MDBfUDFfRlJBTUVfVFlQRSAweGY1NmEwMDAzCiAKIC8qUDFfQkJGQ1JDS08xKi8KLSNkZWZpbmUgUjA5MDBfUDFfQkJGQ1JDS08xICAweGY1NmIKLSNkZWZpbmUgRjA5MDBfUDFfQkJIQ1JDX0tPQ05UMSAgMHhmNTZiMDBmZgorI2RlZmluZSBSMDkwMF9QMV9CQkZDUkNLTzEgMHhmNTZiCisjZGVmaW5lIEJCRkNSQ0tPMSBSRUd4KFIwOTAwX1AxX0JCRkNSQ0tPMSkKKyNkZWZpbmUgRjA5MDBfUDFfQkJIQ1JDX0tPQ05UMSAweGY1NmIwMGZmCiAKIC8qUDFfQkJGQ1JDS08wKi8KLSNkZWZpbmUgUjA5MDBfUDFfQkJGQ1JDS08wICAweGY1NmMKLSNkZWZpbmUgRjA5MDBfUDFfQkJIQ1JDX0tPQ05UMCAgMHhmNTZjMDBmZgorI2RlZmluZSBSMDkwMF9QMV9CQkZDUkNLTzAgMHhmNTZjCisjZGVmaW5lIEJCRkNSQ0tPMCBSRUd4KFIwOTAwX1AxX0JCRkNSQ0tPMCkKKyNkZWZpbmUgRjA5MDBfUDFfQkJIQ1JDX0tPQ05UMCAweGY1NmMwMGZmCiAKIC8qUDFfVVBDUkNLTzEqLwotI2RlZmluZSBSMDkwMF9QMV9VUENSQ0tPMSAgMHhmNTZkCi0jZGVmaW5lIEYwOTAwX1AxX1BLVENSQ19LT0NOVDEgIDB4ZjU2ZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVVBDUkNLTzEgMHhmNTZkCisjZGVmaW5lIFVQQ1JDS08xIFJFR3goUjA5MDBfUDFfVVBDUkNLTzEpCisjZGVmaW5lIEYwOTAwX1AxX1BLVENSQ19LT0NOVDEgMHhmNTZkMDBmZgogCiAvKlAxX1VQQ1JDS08wKi8KLSNkZWZpbmUgUjA5MDBfUDFfVVBDUkNLTzAgIDB4ZjU2ZQotI2RlZmluZSBGMDkwMF9QMV9QS1RDUkNfS09DTlQwICAweGY1NmUwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1VQQ1JDS08wIDB4ZjU2ZQorI2RlZmluZSBVUENSQ0tPMCBSRUd4KFIwOTAwX1AxX1VQQ1JDS08wKQorI2RlZmluZSBGMDkwMF9QMV9QS1RDUkNfS09DTlQwIDB4ZjU2ZTAwZmYKKworLypQMV9QREVMQ1RSTDMqLworI2RlZmluZSBSMDkwMF9QMV9QREVMQ1RSTDMgMHhmNTZmCisjZGVmaW5lIFBERUxDVFJMMyBSRUd4KFIwOTAwX1AxX1BERUxDVFJMMykKKyNkZWZpbmUgRjA5MDBfUDFfUEtUREVMX0NPTlRGQUlMIDB4ZjU2ZjAwODAKKyNkZWZpbmUgRjA5MDBfUDFfTk9GSUZPX0JDSEVSUiAweGY1NmYwMDIwCiAKIC8qUDFfVFNTVEFURU0qLwotI2RlZmluZSBSMDkwMF9QMV9UU1NUQVRFTSAgMHhmNTcwCi0jZGVmaW5lIEYwOTAwX1AxX1RTRElMX09OICAweGY1NzAwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1RTU0tJUFJTX09OICAweGY1NzAwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1RTUlNfT04gIDB4ZjU3MDAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfVFNERVNDUkFNQl9PTiAgMHhmNTcwMDAxMAotI2RlZmluZSBGMDkwMF9QMV9UU0ZSQU1FX01PREUgIDB4ZjU3MDAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfVFNfRElTQUJMRSAgMHhmNTcwMDAwNAotI2RlZmluZSBGMDkwMF9QMV9UU0FDTV9NT0RFICAweGY1NzAwMDAyCi0jZGVmaW5lIEYwOTAwX1AxX1RTT1VUX05PU1lOQyAgMHhmNTcwMDAwMQorI2RlZmluZSBSMDkwMF9QMV9UU1NUQVRFTSAweGY1NzAKKyNkZWZpbmUgVFNTVEFURU0gUkVHeChSMDkwMF9QMV9UU1NUQVRFTSkKKyNkZWZpbmUgRjA5MDBfUDFfVFNESUxfT04gMHhmNTcwMDA4MAorI2RlZmluZSBGMDkwMF9QMV9UU1JTX09OIDB4ZjU3MDAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfVFNERVNDUkFNQl9PTiAweGY1NzAwMDEwCisjZGVmaW5lIEYwOTAwX1AxX1RTRlJBTUVfTU9ERSAweGY1NzAwMDA4CisjZGVmaW5lIEYwOTAwX1AxX1RTX0RJU0FCTEUgMHhmNTcwMDAwNAorI2RlZmluZSBGMDkwMF9QMV9UU09VVF9OT1NZTkMgMHhmNTcwMDAwMQogCiAvKlAxX1RTQ0ZHSCovCi0jZGVmaW5lIFIwOTAwX1AxX1RTQ0ZHSCAgMHhmNTcyCi0jZGVmaW5lIEYwOTAwX1AxX1RTRklGT19EVkJDSSAgMHhmNTcyMDA4MAotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fU0VSSUFMICAweGY1NzIwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1RTRklGT19URUlVUERBVEUgIDB4ZjU3MjAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0RVVFk1MCAgMHhmNTcyMDAxMAotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fSFNHTkxPVVQgIDB4ZjU3MjAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0VSUk1PREUgIDB4ZjU3MjAwMDYKLSNkZWZpbmUgRjA5MDBfUDFfUlNUX0hXQVJFICAweGY1NzIwMDAxCisjZGVmaW5lIFIwOTAwX1AxX1RTQ0ZHSCAweGY1NzIKKyNkZWZpbmUgVFNDRkdIIFJFR3goUjA5MDBfUDFfVFNDRkdIKQorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fRFZCQ0kgMHhmNTcyMDA4MAorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fU0VSSUFMIDB4ZjU3MjAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX1RFSVVQREFURSAweGY1NzIwMDIwCisjZGVmaW5lIEYwOTAwX1AxX1RTRklGT19EVVRZNTAgMHhmNTcyMDAxMAorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fSFNHTkxPVVQgMHhmNTcyMDAwOAorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fRVJSTU9ERSAweGY1NzIwMDA2CisjZGVmaW5lIEYwOTAwX1AxX1JTVF9IV0FSRSAweGY1NzIwMDAxCisjZGVmaW5lIFJTVF9IV0FSRSBGTER4KEYwOTAwX1AxX1JTVF9IV0FSRSkKIAogLypQMV9UU0NGR00qLwotI2RlZmluZSBSMDkwMF9QMV9UU0NGR00gIDB4ZjU3MwotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fTUFOU1BFRUQgIDB4ZjU3MzAwYzAKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX1BFUk1EQVRBICAweGY1NzMwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX1RTRklGT19OT05FV1NHTkwgIDB4ZjU3MzAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0JJVFNQRUVEICAweGY1NzMwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX05QRF9TUEVDRFZCUzIgIDB4ZjU3MzAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX1NUT1BDS0RJUyAgMHhmNTczMDAwMgotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fSU5WREFUQSAgMHhmNTczMDAwMQorI2RlZmluZSBSMDkwMF9QMV9UU0NGR00gMHhmNTczCisjZGVmaW5lIFRTQ0ZHTSBSRUd4KFIwOTAwX1AxX1RTQ0ZHTSkKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX01BTlNQRUVEIDB4ZjU3MzAwYzAKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX1BFUk1EQVRBIDB4ZjU3MzAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0RQVU5BQ1QgMHhmNTczMDAwMgorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fSU5WREFUQSAweGY1NzMwMDAxCiAKIC8qUDFfVFNDRkdMKi8KLSNkZWZpbmUgUjA5MDBfUDFfVFNDRkdMICAweGY1NzQKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0JDTEtERUwxQ0sgIDB4ZjU3NDAwYzAKLSNkZWZpbmUgRjA5MDBfUDFfQkNIRVJST1JfTU9ERSAgMHhmNTc0MDAzMAotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fTlNHTkwyREFUQSAgMHhmNTc0MDAwOAotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fRU1CSU5EVkIgIDB4ZjU3NDAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0RQVU5BQ1QgIDB4ZjU3NDAwMDIKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX05QRE9GRiAgMHhmNTc0MDAwMQorI2RlZmluZSBSMDkwMF9QMV9UU0NGR0wgMHhmNTc0CisjZGVmaW5lIFRTQ0ZHTCBSRUd4KFIwOTAwX1AxX1RTQ0ZHTCkKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0JDTEtERUwxQ0sgMHhmNTc0MDBjMAorI2RlZmluZSBGMDkwMF9QMV9CQ0hFUlJPUl9NT0RFIDB4ZjU3NDAwMzAKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX05TR05MMkRBVEEgMHhmNTc0MDAwOAorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fRU1CSU5EVkIgMHhmNTc0MDAwNAorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fQklUU1BFRUQgMHhmNTc0MDAwMwogCiAvKlAxX1RTSU5TREVMSCovCi0jZGVmaW5lIFIwOTAwX1AxX1RTSU5TREVMSCAgMHhmNTc2Ci0jZGVmaW5lIEYwOTAwX1AxX1RTREVMX1NZTkNCWVRFICAweGY1NzYwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1RTREVMX1hYSEVBREVSICAweGY1NzYwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1RTREVMX0JCSEVBREVSICAweGY1NzYwMDIwCi0jZGVmaW5lIEYwOTAwX1AxX1RTREVMX0RBVEFGSUVMRCAgMHhmNTc2MDAxMAotI2RlZmluZSBGMDkwMF9QMV9UU0lOU0RFTF9JU0NSICAweGY1NzYwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX1RTSU5TREVMX05QRCAgMHhmNTc2MDAwNAotI2RlZmluZSBGMDkwMF9QMV9UU0lOU0RFTF9SU1BBUklUWSAgMHhmNTc2MDAwMgotI2RlZmluZSBGMDkwMF9QMV9UU0lOU0RFTF9DUkM4ICAweGY1NzYwMDAxCisjZGVmaW5lIFIwOTAwX1AxX1RTSU5TREVMSCAweGY1NzYKKyNkZWZpbmUgVFNJTlNERUxIIFJFR3goUjA5MDBfUDFfVFNJTlNERUxIKQorI2RlZmluZSBGMDkwMF9QMV9UU0RFTF9TWU5DQllURSAweGY1NzYwMDgwCisjZGVmaW5lIEYwOTAwX1AxX1RTREVMX1hYSEVBREVSIDB4ZjU3NjAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfVFNERUxfQkJIRUFERVIgMHhmNTc2MDAyMAorI2RlZmluZSBGMDkwMF9QMV9UU0RFTF9EQVRBRklFTEQgMHhmNTc2MDAxMAorI2RlZmluZSBGMDkwMF9QMV9UU0lOU0RFTF9JU0NSIDB4ZjU3NjAwMDgKKyNkZWZpbmUgRjA5MDBfUDFfVFNJTlNERUxfTlBEIDB4ZjU3NjAwMDQKKyNkZWZpbmUgRjA5MDBfUDFfVFNJTlNERUxfUlNQQVJJVFkgMHhmNTc2MDAwMgorI2RlZmluZSBGMDkwMF9QMV9UU0lOU0RFTF9DUkM4IDB4ZjU3NjAwMDEKKworLypQMV9UU0RJVk4qLworI2RlZmluZSBSMDkwMF9QMV9UU0RJVk4gMHhmNTc5CisjZGVmaW5lIFRTRElWTiBSRUd4KFIwOTAwX1AxX1RTRElWTikKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX1NQRUVETU9ERSAweGY1NzkwMGMwCisKKy8qUDFfVFNDRkc0Ki8KKyNkZWZpbmUgUjA5MDBfUDFfVFNDRkc0IDB4ZjU3YQorI2RlZmluZSBUU0NGRzQgUkVHeChSMDkwMF9QMV9UU0NGRzQpCisjZGVmaW5lIEYwOTAwX1AxX1RTRklGT19UU1NQRUVETU9ERSAweGY1N2EwMGMwCiAKIC8qUDFfVFNTUEVFRCovCi0jZGVmaW5lIFIwOTAwX1AxX1RTU1BFRUQgIDB4ZjU4MAotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fT1VUU1BFRUQgIDB4ZjU4MDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfVFNTUEVFRCAweGY1ODAKKyNkZWZpbmUgVFNTUEVFRCBSRUd4KFIwOTAwX1AxX1RTU1BFRUQpCisjZGVmaW5lIEYwOTAwX1AxX1RTRklGT19PVVRTUEVFRCAweGY1ODAwMGZmCiAKIC8qUDFfVFNTVEFUVVMqLwotI2RlZmluZSBSMDkwMF9QMV9UU1NUQVRVUyAgMHhmNTgxCi0jZGVmaW5lIEYwOTAwX1AxX1RTRklGT19MSU5FT0sgIDB4ZjU4MTAwODAKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0VSUk9SICAweGY1ODEwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX1RTRklGT19EQVRBNyAgMHhmNTgxMDAyMAotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fTk9TWU5DICAweGY1ODEwMDEwCi0jZGVmaW5lIEYwOTAwX1AxX0lTQ1JfSU5JVElBTElaRUQgIDB4ZjU4MTAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfSVNDUl9VUERBVEVEICAweGY1ODEwMDA0Ci0jZGVmaW5lIEYwOTAwX1AxX1NPRkZJRk9fVU5SRUdVTCAgMHhmNTgxMDAwMgotI2RlZmluZSBGMDkwMF9QMV9ESUxfUkVBRFkgIDB4ZjU4MTAwMDEKKyNkZWZpbmUgUjA5MDBfUDFfVFNTVEFUVVMgMHhmNTgxCisjZGVmaW5lIFRTU1RBVFVTIFJFR3goUjA5MDBfUDFfVFNTVEFUVVMpCisjZGVmaW5lIEYwOTAwX1AxX1RTRklGT19MSU5FT0sgMHhmNTgxMDA4MAorI2RlZmluZSBUU0ZJRk9fTElORU9LIEZMRHgoRjA5MDBfUDFfVFNGSUZPX0xJTkVPSykKKyNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0VSUk9SIDB4ZjU4MTAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfRElMX1JFQURZIDB4ZjU4MTAwMDEKIAogLypQMV9UU1NUQVRVUzIqLwotI2RlZmluZSBSMDkwMF9QMV9UU1NUQVRVUzIgIDB4ZjU4MgotI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fREVNT0RTRUwgIDB4ZjU4MjAwODAKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPU1BFRURfU1RPUkUgIDB4ZjU4MjAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfRElMWFhfUkVTRVQgIDB4ZjU4MjAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfVFNTRVJJQUxfSU1QT1MgIDB4ZjU4MjAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0xJTkVOT0sgIDB4ZjU4MjAwMDgKLSNkZWZpbmUgRjA5MDBfUDFfQklUU1BFRURfRVZFTlQgIDB4ZjU4MjAwMDQKLSNkZWZpbmUgRjA5MDBfUDFfU0NSQU1CREVURUNUICAweGY1ODIwMDAyCi0jZGVmaW5lIEYwOTAwX1AxX1VMRFRWNjdfRkFMU0VMT0NLICAweGY1ODIwMDAxCisjZGVmaW5lIFIwOTAwX1AxX1RTU1RBVFVTMiAweGY1ODIKKyNkZWZpbmUgVFNTVEFUVVMyIFJFR3goUjA5MDBfUDFfVFNTVEFUVVMyKQorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fREVNT0RTRUwgMHhmNTgyMDA4MAorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9TUEVFRF9TVE9SRSAweGY1ODIwMDQwCisjZGVmaW5lIEYwOTAwX1AxX0RJTFhYX1JFU0VUIDB4ZjU4MjAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfVFNTRVJJQUxfSU1QT1MgMHhmNTgyMDAxMAorI2RlZmluZSBGMDkwMF9QMV9TQ1JBTUJERVRFQ1QgMHhmNTgyMDAwMgogCiAvKlAxX1RTQklUUkFURTEqLwotI2RlZmluZSBSMDkwMF9QMV9UU0JJVFJBVEUxICAweGY1ODMKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0JJVFJBVEUxICAweGY1ODMwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1RTQklUUkFURTEgMHhmNTgzCisjZGVmaW5lIFRTQklUUkFURTEgUkVHeChSMDkwMF9QMV9UU0JJVFJBVEUxKQorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fQklUUkFURTEgMHhmNTgzMDBmZgogCiAvKlAxX1RTQklUUkFURTAqLwotI2RlZmluZSBSMDkwMF9QMV9UU0JJVFJBVEUwICAweGY1ODQKLSNkZWZpbmUgRjA5MDBfUDFfVFNGSUZPX0JJVFJBVEUwICAweGY1ODQwMGZmCisjZGVmaW5lIFIwOTAwX1AxX1RTQklUUkFURTAgMHhmNTg0CisjZGVmaW5lIFRTQklUUkFURTAgUkVHeChSMDkwMF9QMV9UU0JJVFJBVEUwKQorI2RlZmluZSBGMDkwMF9QMV9UU0ZJRk9fQklUUkFURTAgMHhmNTg0MDBmZgogCiAvKlAxX0VSUkNUUkwxKi8KLSNkZWZpbmUgUjA5MDBfUDFfRVJSQ1RSTDEgIDB4ZjU5OAotI2RlZmluZSBGMDkwMF9QMV9FUlJfU09VUkNFMSAgMHhmNTk4MDBmMAotI2RlZmluZSBGMDkwMF9QMV9OVU1fRVZFTlQxICAweGY1OTgwMDA3CisjZGVmaW5lIFIwOTAwX1AxX0VSUkNUUkwxIDB4ZjU5OAorI2RlZmluZSBFUlJDVFJMMSBSRUd4KFIwOTAwX1AxX0VSUkNUUkwxKQorI2RlZmluZSBGMDkwMF9QMV9FUlJfU09VUkNFMSAweGY1OTgwMGYwCisjZGVmaW5lIEYwOTAwX1AxX05VTV9FVkVOVDEgMHhmNTk4MDAwNwogCiAvKlAxX0VSUkNOVDEyKi8KLSNkZWZpbmUgUjA5MDBfUDFfRVJSQ05UMTIgIDB4ZjU5OQotI2RlZmluZSBGMDkwMF9QMV9FUlJDTlQxX09MRFZBTFVFICAweGY1OTkwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0VSUl9DTlQxMiAgMHhmNTk5MDA3ZgorI2RlZmluZSBSMDkwMF9QMV9FUlJDTlQxMiAweGY1OTkKKyNkZWZpbmUgRVJSQ05UMTIgUkVHeChSMDkwMF9QMV9FUlJDTlQxMikKKyNkZWZpbmUgRjA5MDBfUDFfRVJSQ05UMV9PTERWQUxVRSAweGY1OTkwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0VSUl9DTlQxMiAweGY1OTkwMDdmCisjZGVmaW5lIEVSUl9DTlQxMiBGTER4KEYwOTAwX1AxX0VSUl9DTlQxMikKIAogLypQMV9FUlJDTlQxMSovCi0jZGVmaW5lIFIwOTAwX1AxX0VSUkNOVDExICAweGY1OWEKLSNkZWZpbmUgRjA5MDBfUDFfRVJSX0NOVDExICAweGY1OWEwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0VSUkNOVDExIDB4ZjU5YQorI2RlZmluZSBFUlJDTlQxMSBSRUd4KFIwOTAwX1AxX0VSUkNOVDExKQorI2RlZmluZSBGMDkwMF9QMV9FUlJfQ05UMTEgMHhmNTlhMDBmZgorI2RlZmluZSBFUlJfQ05UMTEgRkxEeChGMDkwMF9QMV9FUlJfQ05UMTEpCiAKIC8qUDFfRVJSQ05UMTAqLwotI2RlZmluZSBSMDkwMF9QMV9FUlJDTlQxMCAgMHhmNTliCi0jZGVmaW5lIEYwOTAwX1AxX0VSUl9DTlQxMCAgMHhmNTliMDBmZgorI2RlZmluZSBSMDkwMF9QMV9FUlJDTlQxMCAweGY1OWIKKyNkZWZpbmUgRVJSQ05UMTAgUkVHeChSMDkwMF9QMV9FUlJDTlQxMCkKKyNkZWZpbmUgRjA5MDBfUDFfRVJSX0NOVDEwIDB4ZjU5YjAwZmYKKyNkZWZpbmUgRVJSX0NOVDEwIEZMRHgoRjA5MDBfUDFfRVJSX0NOVDEwKQogCiAvKlAxX0VSUkNUUkwyKi8KLSNkZWZpbmUgUjA5MDBfUDFfRVJSQ1RSTDIgIDB4ZjU5YwotI2RlZmluZSBGMDkwMF9QMV9FUlJfU09VUkNFMiAgMHhmNTljMDBmMAotI2RlZmluZSBGMDkwMF9QMV9OVU1fRVZFTlQyICAweGY1OWMwMDA3CisjZGVmaW5lIFIwOTAwX1AxX0VSUkNUUkwyIDB4ZjU5YworI2RlZmluZSBFUlJDVFJMMiBSRUd4KFIwOTAwX1AxX0VSUkNUUkwyKQorI2RlZmluZSBGMDkwMF9QMV9FUlJfU09VUkNFMiAweGY1OWMwMGYwCisjZGVmaW5lIEYwOTAwX1AxX05VTV9FVkVOVDIgMHhmNTljMDAwNwogCiAvKlAxX0VSUkNOVDIyKi8KLSNkZWZpbmUgUjA5MDBfUDFfRVJSQ05UMjIgIDB4ZjU5ZAotI2RlZmluZSBGMDkwMF9QMV9FUlJDTlQyX09MRFZBTFVFICAweGY1OWQwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX0VSUl9DTlQyMiAgMHhmNTlkMDA3ZgorI2RlZmluZSBSMDkwMF9QMV9FUlJDTlQyMiAweGY1OWQKKyNkZWZpbmUgRVJSQ05UMjIgUkVHeChSMDkwMF9QMV9FUlJDTlQyMikKKyNkZWZpbmUgRjA5MDBfUDFfRVJSQ05UMl9PTERWQUxVRSAweGY1OWQwMDgwCisjZGVmaW5lIEYwOTAwX1AxX0VSUl9DTlQyMiAweGY1OWQwMDdmCisjZGVmaW5lIEVSUl9DTlQyMiBGTER4KEYwOTAwX1AxX0VSUl9DTlQyMikKIAogLypQMV9FUlJDTlQyMSovCi0jZGVmaW5lIFIwOTAwX1AxX0VSUkNOVDIxICAweGY1OWUKLSNkZWZpbmUgRjA5MDBfUDFfRVJSX0NOVDIxICAweGY1OWUwMGZmCisjZGVmaW5lIFIwOTAwX1AxX0VSUkNOVDIxIDB4ZjU5ZQorI2RlZmluZSBFUlJDTlQyMSBSRUd4KFIwOTAwX1AxX0VSUkNOVDIxKQorI2RlZmluZSBGMDkwMF9QMV9FUlJfQ05UMjEgMHhmNTllMDBmZgorI2RlZmluZSBFUlJfQ05UMjEgRkxEeChGMDkwMF9QMV9FUlJfQ05UMjEpCiAKIC8qUDFfRVJSQ05UMjAqLwotI2RlZmluZSBSMDkwMF9QMV9FUlJDTlQyMCAgMHhmNTlmCi0jZGVmaW5lIEYwOTAwX1AxX0VSUl9DTlQyMCAgMHhmNTlmMDBmZgorI2RlZmluZSBSMDkwMF9QMV9FUlJDTlQyMCAweGY1OWYKKyNkZWZpbmUgRVJSQ05UMjAgUkVHeChSMDkwMF9QMV9FUlJDTlQyMCkKKyNkZWZpbmUgRjA5MDBfUDFfRVJSX0NOVDIwIDB4ZjU5ZjAwZmYKKyNkZWZpbmUgRVJSX0NOVDIwIEZMRHgoRjA5MDBfUDFfRVJSX0NOVDIwKQogCiAvKlAxX0ZFQ1NQWSovCi0jZGVmaW5lIFIwOTAwX1AxX0ZFQ1NQWSAgMHhmNWEwCi0jZGVmaW5lIEYwOTAwX1AxX1NQWV9FTkFCTEUgIDB4ZjVhMDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfTk9fU1lOQ0JZVEUgIDB4ZjVhMDAwNDAKLSNkZWZpbmUgRjA5MDBfUDFfU0VSSUFMX01PREUgIDB4ZjVhMDAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfVU5VU1VBTF9QQUNLRVQgIDB4ZjVhMDAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfQkVSX1BBQ0tNT0RFICAweGY1YTAwMDA4Ci0jZGVmaW5lIEYwOTAwX1AxX0JFUk1FVEVSX0xNT0RFICAweGY1YTAwMDAyCi0jZGVmaW5lIEYwOTAwX1AxX0JFUk1FVEVSX1JFU0VUICAweGY1YTAwMDAxCisjZGVmaW5lIFIwOTAwX1AxX0ZFQ1NQWSAweGY1YTAKKyNkZWZpbmUgRkVDU1BZIFJFR3goUjA5MDBfUDFfRkVDU1BZKQorI2RlZmluZSBGMDkwMF9QMV9TUFlfRU5BQkxFIDB4ZjVhMDAwODAKKyNkZWZpbmUgRjA5MDBfUDFfTk9fU1lOQ0JZVEUgMHhmNWEwMDA0MAorI2RlZmluZSBGMDkwMF9QMV9TRVJJQUxfTU9ERSAweGY1YTAwMDIwCisjZGVmaW5lIEYwOTAwX1AxX1VOVVNVQUxfUEFDS0VUIDB4ZjVhMDAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfQkVSTUVURVJfREFUQU1PREUgMHhmNWEwMDAwOAorI2RlZmluZSBGMDkwMF9QMV9CRVJNRVRFUl9MTU9ERSAweGY1YTAwMDAyCisjZGVmaW5lIEYwOTAwX1AxX0JFUk1FVEVSX1JFU0VUIDB4ZjVhMDAwMDEKIAogLypQMV9GU1BZQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfUDFfRlNQWUNGRyAgMHhmNWExCi0jZGVmaW5lIEYwOTAwX1AxX0ZFQ1NQWV9JTlBVVCAgMHhmNWExMDBjMAotI2RlZmluZSBGMDkwMF9QMV9SU1RfT05fRVJST1IgIDB4ZjVhMTAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfT05FX1NIT1QgIDB4ZjVhMTAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfSTJDX01PREUgIDB4ZjVhMTAwMGMKLSNkZWZpbmUgRjA5MDBfUDFfU1BZX0hZU1RFUkVTSVMgIDB4ZjVhMTAwMDMKKyNkZWZpbmUgUjA5MDBfUDFfRlNQWUNGRyAweGY1YTEKKyNkZWZpbmUgRlNQWUNGRyBSRUd4KFIwOTAwX1AxX0ZTUFlDRkcpCisjZGVmaW5lIEYwOTAwX1AxX0ZFQ1NQWV9JTlBVVCAweGY1YTEwMGMwCisjZGVmaW5lIEYwOTAwX1AxX1JTVF9PTl9FUlJPUiAweGY1YTEwMDIwCisjZGVmaW5lIEYwOTAwX1AxX09ORV9TSE9UIDB4ZjVhMTAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfSTJDX01PREUgMHhmNWExMDAwYworI2RlZmluZSBGMDkwMF9QMV9TUFlfSFlTVEVSRVNJUyAweGY1YTEwMDAzCiAKIC8qUDFfRlNQWURBVEEqLwotI2RlZmluZSBSMDkwMF9QMV9GU1BZREFUQSAgMHhmNWEyCi0jZGVmaW5lIEYwOTAwX1AxX1NQWV9TVFVGRklORyAgMHhmNWEyMDA4MAotI2RlZmluZSBGMDkwMF9QMV9OT0VSUk9SX1BLVEpJVFRFUiAgMHhmNWEyMDA0MAotI2RlZmluZSBGMDkwMF9QMV9TUFlfQ05VTExQS1QgIDB4ZjVhMjAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfU1BZX09VVERBVEFfTU9ERSAgMHhmNWEyMDAxZgorI2RlZmluZSBSMDkwMF9QMV9GU1BZREFUQSAweGY1YTIKKyNkZWZpbmUgRlNQWURBVEEgUkVHeChSMDkwMF9QMV9GU1BZREFUQSkKKyNkZWZpbmUgRjA5MDBfUDFfU1BZX1NUVUZGSU5HIDB4ZjVhMjAwODAKKyNkZWZpbmUgRjA5MDBfUDFfU1BZX0NOVUxMUEtUIDB4ZjVhMjAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfU1BZX09VVERBVEFfTU9ERSAweGY1YTIwMDFmCiAKIC8qUDFfRlNQWU9VVCovCi0jZGVmaW5lIFIwOTAwX1AxX0ZTUFlPVVQgIDB4ZjVhMwotI2RlZmluZSBGMDkwMF9QMV9GU1BZX0RJUkVDVCAgMHhmNWEzMDA4MAotI2RlZmluZSBGMDkwMF9QMV9TUFlfT1VUREFUQV9CVVMgIDB4ZjVhMzAwMzgKLSNkZWZpbmUgRjA5MDBfUDFfU1RVRkZfTU9ERSAgMHhmNWEzMDAwNworI2RlZmluZSBSMDkwMF9QMV9GU1BZT1VUIDB4ZjVhMworI2RlZmluZSBGU1BZT1VUIFJFR3goUjA5MDBfUDFfRlNQWU9VVCkKKyNkZWZpbmUgRjA5MDBfUDFfRlNQWV9ESVJFQ1QgMHhmNWEzMDA4MAorI2RlZmluZSBGMDkwMF9QMV9TVFVGRl9NT0RFIDB4ZjVhMzAwMDcKIAogLypQMV9GU1RBVFVTKi8KLSNkZWZpbmUgUjA5MDBfUDFfRlNUQVRVUyAgMHhmNWE0Ci0jZGVmaW5lIEYwOTAwX1AxX1NQWV9FTkRTSU0gIDB4ZjVhNDAwODAKLSNkZWZpbmUgRjA5MDBfUDFfVkFMSURfU0lNICAweGY1YTQwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0ZPVU5EX1NJR05BTCAgMHhmNWE0MDAyMAotI2RlZmluZSBGMDkwMF9QMV9EU1NfU1lOQ0JZVEUgIDB4ZjVhNDAwMTAKLSNkZWZpbmUgRjA5MDBfUDFfUkVTVUxUX1NUQVRFICAweGY1YTQwMDBmCisjZGVmaW5lIFIwOTAwX1AxX0ZTVEFUVVMgMHhmNWE0CisjZGVmaW5lIEZTVEFUVVMgUkVHeChSMDkwMF9QMV9GU1RBVFVTKQorI2RlZmluZSBGMDkwMF9QMV9TUFlfRU5EU0lNIDB4ZjVhNDAwODAKKyNkZWZpbmUgRjA5MDBfUDFfVkFMSURfU0lNIDB4ZjVhNDAwNDAKKyNkZWZpbmUgRjA5MDBfUDFfRk9VTkRfU0lHTkFMIDB4ZjVhNDAwMjAKKyNkZWZpbmUgRjA5MDBfUDFfRFNTX1NZTkNCWVRFIDB4ZjVhNDAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfUkVTVUxUX1NUQVRFIDB4ZjVhNDAwMGYKIAogLypQMV9GQkVSQ1BUNCovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJDUFQ0ICAweGY1YTgKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0NQVDQgIDB4ZjVhODAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkNQVDQgMHhmNWE4CisjZGVmaW5lIEZCRVJDUFQ0IFJFR3goUjA5MDBfUDFfRkJFUkNQVDQpCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9DUFQ0IDB4ZjVhODAwZmYKIAogLypQMV9GQkVSQ1BUMyovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJDUFQzICAweGY1YTkKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0NQVDMgIDB4ZjVhOTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkNQVDMgMHhmNWE5CisjZGVmaW5lIEZCRVJDUFQzIFJFR3goUjA5MDBfUDFfRkJFUkNQVDMpCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9DUFQzIDB4ZjVhOTAwZmYKIAogLypQMV9GQkVSQ1BUMiovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJDUFQyICAweGY1YWEKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0NQVDIgIDB4ZjVhYTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkNQVDIgMHhmNWFhCisjZGVmaW5lIEZCRVJDUFQyIFJFR3goUjA5MDBfUDFfRkJFUkNQVDIpCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9DUFQyIDB4ZjVhYTAwZmYKIAogLypQMV9GQkVSQ1BUMSovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJDUFQxICAweGY1YWIKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0NQVDEgIDB4ZjVhYjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkNQVDEgMHhmNWFiCisjZGVmaW5lIEZCRVJDUFQxIFJFR3goUjA5MDBfUDFfRkJFUkNQVDEpCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9DUFQxIDB4ZjVhYjAwZmYKIAogLypQMV9GQkVSQ1BUMCovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJDUFQwICAweGY1YWMKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0NQVDAgIDB4ZjVhYzAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkNQVDAgMHhmNWFjCisjZGVmaW5lIEZCRVJDUFQwIFJFR3goUjA5MDBfUDFfRkJFUkNQVDApCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9DUFQwIDB4ZjVhYzAwZmYKIAogLypQMV9GQkVSRVJSMiovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJFUlIyICAweGY1YWQKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0VSUjIgIDB4ZjVhZDAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkVSUjIgMHhmNWFkCisjZGVmaW5lIEZCRVJFUlIyIFJFR3goUjA5MDBfUDFfRkJFUkVSUjIpCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9FUlIyIDB4ZjVhZDAwZmYKIAogLypQMV9GQkVSRVJSMSovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJFUlIxICAweGY1YWUKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0VSUjEgIDB4ZjVhZTAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkVSUjEgMHhmNWFlCisjZGVmaW5lIEZCRVJFUlIxIFJFR3goUjA5MDBfUDFfRkJFUkVSUjEpCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9FUlIxIDB4ZjVhZTAwZmYKIAogLypQMV9GQkVSRVJSMCovCi0jZGVmaW5lIFIwOTAwX1AxX0ZCRVJFUlIwICAweGY1YWYKLSNkZWZpbmUgRjA5MDBfUDFfRkJFUk1FVEVSX0VSUjAgIDB4ZjVhZjAwZmYKKyNkZWZpbmUgUjA5MDBfUDFfRkJFUkVSUjAgMHhmNWFmCisjZGVmaW5lIEZCRVJFUlIwIFJFR3goUjA5MDBfUDFfRkJFUkVSUjApCisjZGVmaW5lIEYwOTAwX1AxX0ZCRVJNRVRFUl9FUlIwIDB4ZjVhZjAwZmYKIAogLypQMV9GU1BZQkVSKi8KLSNkZWZpbmUgUjA5MDBfUDFfRlNQWUJFUiAgMHhmNWIyCi0jZGVmaW5lIEYwOTAwX1AxX0ZTUFlPQlNfWE9SUkVBRCAgMHhmNWIyMDA0MAotI2RlZmluZSBGMDkwMF9QMV9GU1BZQkVSX09CU01PREUgIDB4ZjViMjAwMjAKLSNkZWZpbmUgRjA5MDBfUDFfRlNQWUJFUl9TWU5DQllURSAgMHhmNWIyMDAxMAotI2RlZmluZSBGMDkwMF9QMV9GU1BZQkVSX1VOU1lOQyAgMHhmNWIyMDAwOAotI2RlZmluZSBGMDkwMF9QMV9GU1BZQkVSX0NUSU1FICAweGY1YjIwMDA3CisjZGVmaW5lIFIwOTAwX1AxX0ZTUFlCRVIgMHhmNWIyCisjZGVmaW5lIEZTUFlCRVIgUkVHeChSMDkwMF9QMV9GU1BZQkVSKQorI2RlZmluZSBGMDkwMF9QMV9GU1BZQkVSX1NZTkNCWVRFIDB4ZjViMjAwMTAKKyNkZWZpbmUgRjA5MDBfUDFfRlNQWUJFUl9VTlNZTkMgMHhmNWIyMDAwOAorI2RlZmluZSBGMDkwMF9QMV9GU1BZQkVSX0NUSU1FIDB4ZjViMjAwMDcKIAotLypSQ0NGR0gqLwotI2RlZmluZSBSMDkwMF9SQ0NGR0ggIDB4ZjYwMAotI2RlZmluZSBGMDkwMF9UU1JDRklGT19EVkJDSSAgMHhmNjAwMDA4MAotI2RlZmluZSBGMDkwMF9UU1JDRklGT19TRVJJQUwgIDB4ZjYwMDAwNDAKLSNkZWZpbmUgRjA5MDBfVFNSQ0ZJRk9fRElTQUJMRSAgMHhmNjAwMDAyMAotI2RlZmluZSBGMDkwMF9UU0ZJRk9fMlRPUkMgIDB4ZjYwMDAwMTAKLSNkZWZpbmUgRjA5MDBfVFNSQ0ZJRk9fSFNHTkxPVVQgIDB4ZjYwMDAwMDgKLSNkZWZpbmUgRjA5MDBfVFNSQ0ZJRk9fRVJSTU9ERSAgMHhmNjAwMDAwNgorLypSQ0NGRzIqLworI2RlZmluZSBSMDkwMF9SQ0NGRzIgMHhmNjAwCiAKIC8qVFNHRU5FUkFMKi8KLSNkZWZpbmUgUjA5MDBfVFNHRU5FUkFMICAweGY2MzAKLSNkZWZpbmUgRjA5MDBfVFNGSUZPX0JDTEsxQUxMICAweGY2MzAwMDIwCi0jZGVmaW5lIEYwOTAwX01VWFNUUkVBTV9PVVRNT0RFICAweGY2MzAwMDA4Ci0jZGVmaW5lIEYwOTAwX1RTRklGT19QRVJNUEFSQUwgIDB4ZjYzMDAwMDYKLSNkZWZpbmUgRjA5MDBfUlNUX1JFRURTT0xPICAweGY2MzAwMDAxCisjZGVmaW5lIFIwOTAwX1RTR0VORVJBTCAweGY2MzAKKyNkZWZpbmUgRjA5MDBfVFNGSUZPX0RJU1RTMlBBUiAweGY2MzAwMDQwCisjZGVmaW5lIEYwOTAwX01VWFNUUkVBTV9PVVRNT0RFIDB4ZjYzMDAwMDgKKyNkZWZpbmUgRjA5MDBfVFNGSUZPX1BFUk1QQVJBTCAweGY2MzAwMDA2CiAKIC8qVFNHRU5FUkFMMVgqLwotI2RlZmluZSBSMDkwMF9UU0dFTkVSQUwxWCAgMHhmNjcwCi0jZGVmaW5lIEYwOTAwX1RTRklGTzFYX0JDTEsxQUxMICAweGY2NzAwMDIwCi0jZGVmaW5lIEYwOTAwX01VWFNUUkVBTTFYX09VVE1PREUgIDB4ZjY3MDAwMDgKLSNkZWZpbmUgRjA5MDBfVFNGSUZPMVhfUEVSTVBBUkFMICAweGY2NzAwMDA2Ci0jZGVmaW5lIEYwOTAwX1JTVDFYX1JFRURTT0xPICAweGY2NzAwMDAxCisjZGVmaW5lIFIwOTAwX1RTR0VORVJBTDFYIDB4ZjY3MAogCiAvKk5CSVRFUl9ORjQqLwotI2RlZmluZSBSMDkwMF9OQklURVJfTkY0ICAweGZhMDMKLSNkZWZpbmUgRjA5MDBfTkJJVEVSX05GX1FQXzFfMiAgMHhmYTAzMDBmZgorI2RlZmluZSBSMDkwMF9OQklURVJfTkY0IDB4ZmEwMworI2RlZmluZSBGMDkwMF9OQklURVJfTkZfUVBfMV8yIDB4ZmEwMzAwZmYKIAogLypOQklURVJfTkY1Ki8KLSNkZWZpbmUgUjA5MDBfTkJJVEVSX05GNSAgMHhmYTA0Ci0jZGVmaW5lIEYwOTAwX05CSVRFUl9ORl9RUF8zXzUgIDB4ZmEwNDAwZmYKKyNkZWZpbmUgUjA5MDBfTkJJVEVSX05GNSAweGZhMDQKKyNkZWZpbmUgRjA5MDBfTkJJVEVSX05GX1FQXzNfNSAweGZhMDQwMGZmCiAKIC8qTkJJVEVSX05GNiovCi0jZGVmaW5lIFIwOTAwX05CSVRFUl9ORjYgIDB4ZmEwNQotI2RlZmluZSBGMDkwMF9OQklURVJfTkZfUVBfMl8zICAweGZhMDUwMGZmCisjZGVmaW5lIFIwOTAwX05CSVRFUl9ORjYgMHhmYTA1CisjZGVmaW5lIEYwOTAwX05CSVRFUl9ORl9RUF8yXzMgMHhmYTA1MDBmZgogCiAvKk5CSVRFUl9ORjcqLwotI2RlZmluZSBSMDkwMF9OQklURVJfTkY3ICAweGZhMDYKLSNkZWZpbmUgRjA5MDBfTkJJVEVSX05GX1FQXzNfNCAgMHhmYTA2MDBmZgorI2RlZmluZSBSMDkwMF9OQklURVJfTkY3IDB4ZmEwNgorI2RlZmluZSBGMDkwMF9OQklURVJfTkZfUVBfM180IDB4ZmEwNjAwZmYKIAogLypOQklURVJfTkY4Ki8KLSNkZWZpbmUgUjA5MDBfTkJJVEVSX05GOCAgMHhmYTA3Ci0jZGVmaW5lIEYwOTAwX05CSVRFUl9ORl9RUF80XzUgIDB4ZmEwNzAwZmYKKyNkZWZpbmUgUjA5MDBfTkJJVEVSX05GOCAweGZhMDcKKyNkZWZpbmUgRjA5MDBfTkJJVEVSX05GX1FQXzRfNSAweGZhMDcwMGZmCiAKIC8qTkJJVEVSX05GOSovCi0jZGVmaW5lIFIwOTAwX05CSVRFUl9ORjkgIDB4ZmEwOAotI2RlZmluZSBGMDkwMF9OQklURVJfTkZfUVBfNV82ICAweGZhMDgwMGZmCisjZGVmaW5lIFIwOTAwX05CSVRFUl9ORjkgMHhmYTA4CisjZGVmaW5lIEYwOTAwX05CSVRFUl9ORl9RUF81XzYgMHhmYTA4MDBmZgogCiAvKk5CSVRFUl9ORjEwKi8KLSNkZWZpbmUgUjA5MDBfTkJJVEVSX05GMTAgIDB4ZmEwOQotI2RlZmluZSBGMDkwMF9OQklURVJfTkZfUVBfOF85ICAweGZhMDkwMGZmCisjZGVmaW5lIFIwOTAwX05CSVRFUl9ORjEwIDB4ZmEwOQorI2RlZmluZSBGMDkwMF9OQklURVJfTkZfUVBfOF85IDB4ZmEwOTAwZmYKIAogLypOQklURVJfTkYxMSovCi0jZGVmaW5lIFIwOTAwX05CSVRFUl9ORjExICAweGZhMGEKLSNkZWZpbmUgRjA5MDBfTkJJVEVSX05GX1FQXzlfMTAgIDB4ZmEwYTAwZmYKKyNkZWZpbmUgUjA5MDBfTkJJVEVSX05GMTEgMHhmYTBhCisjZGVmaW5lIEYwOTAwX05CSVRFUl9ORl9RUF85XzEwIDB4ZmEwYTAwZmYKIAogLypOQklURVJfTkYxMiovCi0jZGVmaW5lIFIwOTAwX05CSVRFUl9ORjEyICAweGZhMGIKLSNkZWZpbmUgRjA5MDBfTkJJVEVSX05GXzhQXzNfNSAgMHhmYTBiMDBmZgorI2RlZmluZSBSMDkwMF9OQklURVJfTkYxMiAweGZhMGIKKyNkZWZpbmUgRjA5MDBfTkJJVEVSX05GXzhQXzNfNSAweGZhMGIwMGZmCiAKIC8qTkJJVEVSX05GMTMqLwotI2RlZmluZSBSMDkwMF9OQklURVJfTkYxMyAgMHhmYTBjCi0jZGVmaW5lIEYwOTAwX05CSVRFUl9ORl84UF8yXzMgIDB4ZmEwYzAwZmYKKyNkZWZpbmUgUjA5MDBfTkJJVEVSX05GMTMgMHhmYTBjCisjZGVmaW5lIEYwOTAwX05CSVRFUl9ORl84UF8yXzMgMHhmYTBjMDBmZgogCiAvKk5CSVRFUl9ORjE0Ki8KLSNkZWZpbmUgUjA5MDBfTkJJVEVSX05GMTQgIDB4ZmEwZAotI2RlZmluZSBGMDkwMF9OQklURVJfTkZfOFBfM180ICAweGZhMGQwMGZmCisjZGVmaW5lIFIwOTAwX05CSVRFUl9ORjE0IDB4ZmEwZAorI2RlZmluZSBGMDkwMF9OQklURVJfTkZfOFBfM180IDB4ZmEwZDAwZmYKIAogLypOQklURVJfTkYxNSovCi0jZGVmaW5lIFIwOTAwX05CSVRFUl9ORjE1ICAweGZhMGUKLSNkZWZpbmUgRjA5MDBfTkJJVEVSX05GXzhQXzVfNiAgMHhmYTBlMDBmZgorI2RlZmluZSBSMDkwMF9OQklURVJfTkYxNSAweGZhMGUKKyNkZWZpbmUgRjA5MDBfTkJJVEVSX05GXzhQXzVfNiAweGZhMGUwMGZmCiAKIC8qTkJJVEVSX05GMTYqLwotI2RlZmluZSBSMDkwMF9OQklURVJfTkYxNiAgMHhmYTBmCi0jZGVmaW5lIEYwOTAwX05CSVRFUl9ORl84UF84XzkgIDB4ZmEwZjAwZmYKKyNkZWZpbmUgUjA5MDBfTkJJVEVSX05GMTYgMHhmYTBmCisjZGVmaW5lIEYwOTAwX05CSVRFUl9ORl84UF84XzkgMHhmYTBmMDBmZgogCiAvKk5CSVRFUl9ORjE3Ki8KLSNkZWZpbmUgUjA5MDBfTkJJVEVSX05GMTcgIDB4ZmExMAotI2RlZmluZSBGMDkwMF9OQklURVJfTkZfOFBfOV8xMCAgMHhmYTEwMDBmZgorI2RlZmluZSBSMDkwMF9OQklURVJfTkYxNyAweGZhMTAKKyNkZWZpbmUgRjA5MDBfTkJJVEVSX05GXzhQXzlfMTAgMHhmYTEwMDBmZgogCiAvKk5CSVRFUk5PRVJSKi8KLSNkZWZpbmUgUjA5MDBfTkJJVEVSTk9FUlIgIDB4ZmEzZgotI2RlZmluZSBGMDkwMF9OQklURVJfU1RPUF9DUklUICAweGZhM2YwMDBmCisjZGVmaW5lIFIwOTAwX05CSVRFUk5PRVJSIDB4ZmEzZgorI2RlZmluZSBGMDkwMF9OQklURVJfU1RPUF9DUklUIDB4ZmEzZjAwMGYKIAogLypHQUlOTExSX05GNCovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkY0ICAweGZhNDMKLSNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl9RUF8xXzIgIDB4ZmE0MzAwN2YKKyNkZWZpbmUgUjA5MDBfR0FJTkxMUl9ORjQgMHhmYTQzCisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfUVBfMV8yIDB4ZmE0MzAwN2YKIAogLypHQUlOTExSX05GNSovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkY1ICAweGZhNDQKLSNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl9RUF8zXzUgIDB4ZmE0NDAwN2YKKyNkZWZpbmUgUjA5MDBfR0FJTkxMUl9ORjUgMHhmYTQ0CisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfUVBfM181IDB4ZmE0NDAwN2YKIAogLypHQUlOTExSX05GNiovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkY2ICAweGZhNDUKLSNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl9RUF8yXzMgIDB4ZmE0NTAwN2YKKyNkZWZpbmUgUjA5MDBfR0FJTkxMUl9ORjYgMHhmYTQ1CisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfUVBfMl8zIDB4ZmE0NTAwN2YKIAogLypHQUlOTExSX05GNyovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkY3ICAweGZhNDYKLSNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl9RUF8zXzQgIDB4ZmE0NjAwN2YKKyNkZWZpbmUgUjA5MDBfR0FJTkxMUl9ORjcgMHhmYTQ2CisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfUVBfM180IDB4ZmE0NjAwN2YKIAogLypHQUlOTExSX05GOCovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkY4ICAweGZhNDcKLSNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl9RUF80XzUgIDB4ZmE0NzAwN2YKKyNkZWZpbmUgUjA5MDBfR0FJTkxMUl9ORjggMHhmYTQ3CisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfUVBfNF81IDB4ZmE0NzAwN2YKIAogLypHQUlOTExSX05GOSovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkY5ICAweGZhNDgKLSNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl9RUF81XzYgIDB4ZmE0ODAwN2YKKyNkZWZpbmUgUjA5MDBfR0FJTkxMUl9ORjkgMHhmYTQ4CisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfUVBfNV82IDB4ZmE0ODAwN2YKIAogLypHQUlOTExSX05GMTAqLwotI2RlZmluZSBSMDkwMF9HQUlOTExSX05GMTAgIDB4ZmE0OQotI2RlZmluZSBGMDkwMF9HQUlOTExSX05GX1FQXzhfOSAgMHhmYTQ5MDA3ZgorI2RlZmluZSBSMDkwMF9HQUlOTExSX05GMTAgMHhmYTQ5CisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfUVBfOF85IDB4ZmE0OTAwN2YKIAogLypHQUlOTExSX05GMTEqLwotI2RlZmluZSBSMDkwMF9HQUlOTExSX05GMTEgIDB4ZmE0YQotI2RlZmluZSBGMDkwMF9HQUlOTExSX05GX1FQXzlfMTAgIDB4ZmE0YTAwN2YKKyNkZWZpbmUgUjA5MDBfR0FJTkxMUl9ORjExIDB4ZmE0YQorI2RlZmluZSBGMDkwMF9HQUlOTExSX05GX1FQXzlfMTAgMHhmYTRhMDA3ZgogCiAvKkdBSU5MTFJfTkYxMiovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxMiAgMHhmYTRiCi0jZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfOFBfM181ICAweGZhNGIwMDdmCisjZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxMiAweGZhNGIKKyNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl84UF8zXzUgMHhmYTRiMDA3ZgogCiAvKkdBSU5MTFJfTkYxMyovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxMyAgMHhmYTRjCi0jZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfOFBfMl8zICAweGZhNGMwMDdmCisjZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxMyAweGZhNGMKKyNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl84UF8yXzMgMHhmYTRjMDA3ZgogCiAvKkdBSU5MTFJfTkYxNCovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxNCAgMHhmYTRkCi0jZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfOFBfM180ICAweGZhNGQwMDdmCisjZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxNCAweGZhNGQKKyNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl84UF8zXzQgMHhmYTRkMDA3ZgogCiAvKkdBSU5MTFJfTkYxNSovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxNSAgMHhmYTRlCi0jZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfOFBfNV82ICAweGZhNGUwMDdmCisjZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxNSAweGZhNGUKKyNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl84UF81XzYgMHhmYTRlMDA3ZgogCiAvKkdBSU5MTFJfTkYxNiovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxNiAgMHhmYTRmCi0jZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfOFBfOF85ICAweGZhNGYwMDdmCisjZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxNiAweGZhNGYKKyNkZWZpbmUgRjA5MDBfR0FJTkxMUl9ORl84UF84XzkgMHhmYTRmMDA3ZgogCiAvKkdBSU5MTFJfTkYxNyovCi0jZGVmaW5lIFIwOTAwX0dBSU5MTFJfTkYxNyAgMHhmYTUwCi0jZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfOFBfOV8xMCAgMHhmYTUwMDA3ZgorI2RlZmluZSBSMDkwMF9HQUlOTExSX05GMTcgMHhmYTUwCisjZGVmaW5lIEYwOTAwX0dBSU5MTFJfTkZfOFBfOV8xMCAweGZhNTAwMDdmCiAKIC8qQ0ZHRVhUKi8KLSNkZWZpbmUgUjA5MDBfQ0ZHRVhUICAweGZhODAKLSNkZWZpbmUgRjA5MDBfU1RBR01PREUgIDB4ZmE4MDAwODAKLSNkZWZpbmUgRjA5MDBfQllQQkNIICAweGZhODAwMDQwCi0jZGVmaW5lIEYwOTAwX0JZUExEUEMgIDB4ZmE4MDAwMjAKLSNkZWZpbmUgRjA5MDBfTERQQ01PREUgIDB4ZmE4MDAwMTAKLSNkZWZpbmUgRjA5MDBfSU5WTExSU0lHTiAgMHhmYTgwMDAwOAotI2RlZmluZSBGMDkwMF9TSE9SVE1VTFQgIDB4ZmE4MDAwMDQKLSNkZWZpbmUgRjA5MDBfRVhURVJOVFggIDB4ZmE4MDAwMDEKKyNkZWZpbmUgUjA5MDBfQ0ZHRVhUIDB4ZmE4MAorI2RlZmluZSBGMDkwMF9TVEFHTU9ERSAweGZhODAwMDgwCisjZGVmaW5lIEYwOTAwX0JZUEJDSCAweGZhODAwMDQwCisjZGVmaW5lIEYwOTAwX0JZUExEUEMgMHhmYTgwMDAyMAorI2RlZmluZSBGMDkwMF9MRFBDTU9ERSAweGZhODAwMDEwCisjZGVmaW5lIEYwOTAwX0lOVkxMUlNJR04gMHhmYTgwMDAwOAorI2RlZmluZSBGMDkwMF9TSE9SVE1VTFQgMHhmYTgwMDAwNAorI2RlZmluZSBGMDkwMF9FWFRFUk5UWCAweGZhODAwMDAxCiAKIC8qR0VOQ0ZHKi8KLSNkZWZpbmUgUjA5MDBfR0VOQ0ZHICAweGZhODYKLSNkZWZpbmUgRjA5MDBfQlJPQURDQVNUICAweGZhODYwMDEwCi0jZGVmaW5lIEYwOTAwX05PU0hGUkQyICAweGZhODYwMDA4Ci0jZGVmaW5lIEYwOTAwX0JDSEVSUkZMQUcgIDB4ZmE4NjAwMDQKLSNkZWZpbmUgRjA5MDBfUFJJT1JJVFkgIDB4ZmE4NjAwMDIKLSNkZWZpbmUgRjA5MDBfRERFTU9EICAweGZhODYwMDAxCisjZGVmaW5lIFIwOTAwX0dFTkNGRyAweGZhODYKKyNkZWZpbmUgRjA5MDBfQlJPQURDQVNUIDB4ZmE4NjAwMTAKKyNkZWZpbmUgRjA5MDBfUFJJT1JJVFkgMHhmYTg2MDAwMgorI2RlZmluZSBGMDkwMF9EREVNT0QgMHhmYTg2MDAwMQogCiAvKkxEUENFUlIxKi8KLSNkZWZpbmUgUjA5MDBfTERQQ0VSUjEgIDB4ZmE5NgotI2RlZmluZSBGMDkwMF9MRFBDX0VSUk9SU19DT1VOVEVSMSAgMHhmYTk2MDBmZgorI2RlZmluZSBSMDkwMF9MRFBDRVJSMSAweGZhOTYKKyNkZWZpbmUgRjA5MDBfTERQQ19FUlJPUlNfQ09VTlRFUjEgMHhmYTk2MDBmZgogCiAvKkxEUENFUlIwKi8KLSNkZWZpbmUgUjA5MDBfTERQQ0VSUjAgIDB4ZmE5NwotI2RlZmluZSBGMDkwMF9MRFBDX0VSUk9SU19DT1VOVEVSMCAgMHhmYTk3MDBmZgorI2RlZmluZSBSMDkwMF9MRFBDRVJSMCAweGZhOTcKKyNkZWZpbmUgRjA5MDBfTERQQ19FUlJPUlNfQ09VTlRFUjAgMHhmYTk3MDBmZgogCiAvKkJDSEVSUiovCi0jZGVmaW5lIFIwOTAwX0JDSEVSUiAgMHhmYTk4Ci0jZGVmaW5lIEYwOTAwX0VSUk9SRkxBRyAgMHhmYTk4MDAxMAotI2RlZmluZSBGMDkwMF9CQ0hfRVJST1JTX0NPVU5URVIgIDB4ZmE5ODAwMGYKKyNkZWZpbmUgUjA5MDBfQkNIRVJSIDB4ZmE5OAorI2RlZmluZSBGMDkwMF9FUlJPUkZMQUcgMHhmYTk4MDAxMAorI2RlZmluZSBGMDkwMF9CQ0hfRVJST1JTX0NPVU5URVIgMHhmYTk4MDAwZgogCiAvKlRTVFJFUzAqLwotI2RlZmluZSBSMDkwMF9UU1RSRVMwICAweGZmMTEKLSNkZWZpbmUgRjA5MDBfRlJFU0ZFQyAgMHhmZjExMDA4MAotI2RlZmluZSBGMDkwMF9GUkVTVFMgIDB4ZmYxMTAwNDAKLSNkZWZpbmUgRjA5MDBfRlJFU1ZJVDEgIDB4ZmYxMTAwMjAKLSNkZWZpbmUgRjA5MDBfRlJFU1ZJVDIgIDB4ZmYxMTAwMTAKLSNkZWZpbmUgRjA5MDBfRlJFU1NZTTEgIDB4ZmYxMTAwMDgKLSNkZWZpbmUgRjA5MDBfRlJFU1NZTTIgIDB4ZmYxMTAwMDQKLSNkZWZpbmUgRjA5MDBfRlJFU01BUyAgMHhmZjExMDAwMgotI2RlZmluZSBGMDkwMF9GUkVTSU5UICAweGZmMTEwMDAxCisjZGVmaW5lIFIwOTAwX1RTVFJFUzAgMHhmZjExCisjZGVmaW5lIEYwOTAwX0ZSRVNGRUMgMHhmZjExMDA4MAorCisvKlAyX1RDVEw0Ki8KKyNkZWZpbmUgUjA5MDBfUDJfVENUTDQgMHhmZjI4CisjZGVmaW5lIEYwOTAwX1AyX1BONF9TRUxFQ1QgMHhmZjI4MDAyMAorCisvKlAxX1RDVEw0Ki8KKyNkZWZpbmUgUjA5MDBfUDFfVENUTDQgMHhmZjQ4CisjZGVmaW5lIFRDVEw0IHNoaWZ0eChSMDkwMF9QMV9UQ1RMNCwgZGVtb2QsIDB4MjApCisjZGVmaW5lIEYwOTAwX1AxX1BONF9TRUxFQ1QgMHhmZjQ4MDAyMAogCiAvKlAyX1RTVERJU1JYKi8KLSNkZWZpbmUgUjA5MDBfUDJfVFNURElTUlggIDB4ZmY2NQotI2RlZmluZSBGMDkwMF9QMl9FTl9ESVNSWCAgMHhmZjY1MDA4MAotI2RlZmluZSBGMDkwMF9QMl9UU1RfQ1VSUlNSQyAgMHhmZjY1MDA0MAotI2RlZmluZSBGMDkwMF9QMl9JTl9ESUdTSUdOQUwgIDB4ZmY2NTAwMjAKLSNkZWZpbmUgRjA5MDBfUDJfSElaX0NVUlJFTlRTUkMgIDB4ZmY2NTAwMTAKLSNkZWZpbmUgRjA5MDBfVFNUX1AyX1BJTl9TRUxFQ1QgIDB4ZmY2NTAwMDgKLSNkZWZpbmUgRjA5MDBfUDJfVFNUX0RJU1JYICAweGZmNjUwMDA3CisjZGVmaW5lIFIwOTAwX1AyX1RTVERJU1JYIDB4ZmY2NQorI2RlZmluZSBGMDkwMF9QMl9QSU5fU0VMRUNUMSAweGZmNjUwMDA4CiAKIC8qUDFfVFNURElTUlgqLwotI2RlZmluZSBSMDkwMF9QMV9UU1RESVNSWCAgMHhmZjY3Ci0jZGVmaW5lIEYwOTAwX1AxX0VOX0RJU1JYICAweGZmNjcwMDgwCi0jZGVmaW5lIEYwOTAwX1AxX1RTVF9DVVJSU1JDICAweGZmNjcwMDQwCi0jZGVmaW5lIEYwOTAwX1AxX0lOX0RJR1NJR05BTCAgMHhmZjY3MDAyMAotI2RlZmluZSBGMDkwMF9QMV9ISVpfQ1VSUkVOVFNSQyAgMHhmZjY3MDAxMAotI2RlZmluZSBGMDkwMF9UU1RfUDFfUElOX1NFTEVDVCAgMHhmZjY3MDAwOAotI2RlZmluZSBGMDkwMF9QMV9UU1RfRElTUlggIDB4ZmY2NzAwMDcKKyNkZWZpbmUgUjA5MDBfUDFfVFNURElTUlggMHhmZjY3CisjZGVmaW5lIFRTVERJU1JYIHNoaWZ0eChSMDkwMF9QMV9UU1RESVNSWCwgZGVtb2QsIDIpCisjZGVmaW5lIEYwOTAwX1AxX1BJTl9TRUxFQ1QxIDB4ZmY2NzAwMDgKKyNkZWZpbmUgUElOX1NFTEVDVDEgc2hpZnR4KEYwOTAwX1AxX1BJTl9TRUxFQ1QxLCBkZW1vZCwgMHgyMDAwMCkKIAotI2RlZmluZSBTVFYwOTAwX05CUkVHUwkJNjg0Ci0jZGVmaW5lIFNUVjA5MDBfTkJGSUVMRFMJCTE3MDIKKyNkZWZpbmUgU1RWMDkwMF9OQlJFR1MgNzIzCisjZGVmaW5lIFNUVjA5MDBfTkJGSUVMRFMgMTQyMAogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfc3cuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTAwX3N3LmMKaW5kZXggOTYyZmRlMS4uYjhkYTg3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MDBfc3cuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkwMF9zdy5jCkBAIC0yNyw1NiArMjcsNDUgQEAKICNpbmNsdWRlICJzdHYwOTAwX3JlZy5oIgogI2luY2x1ZGUgInN0djA5MDBfcHJpdi5oIgogCi1pbnQgc3R2MDkwMF9jaGVja19zaWduYWxfcHJlc2VuY2Uoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAorczMyIHNoaWZ0eChzMzIgeCwgaW50IGRlbW9kLCBzMzIgc2hpZnQpCit7CisJaWYgKGRlbW9kID09IDEpCisJCXJldHVybiB4IC0gc2hpZnQ7CisKKwlyZXR1cm4geDsKK30KKworaW50IHN0djA5MDBfY2hlY2tfc2lnbmFsX3ByZXNlbmNlKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQogewotCXMzMiBjYXJyX29mZnNldCwKLQlhZ2MyX2ludGVnciwKLQltYXhfY2FycmllcjsKKwlzMzIJY2Fycl9vZmZzZXQsCisJCWFnYzJfaW50ZWdyLAorCQltYXhfY2FycmllcjsKIAotCWludCBub19zaWduYWw7CisJaW50IG5vX3NpZ25hbCA9IEZBTFNFOwogCi0Jc3dpdGNoIChkZW1vZCkgewotCWNhc2UgU1RWMDkwMF9ERU1PRF8xOgotCWRlZmF1bHQ6Ci0JCWNhcnJfb2Zmc2V0ID0gKHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUjIpIDw8IDgpCi0JCQkJCQl8IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsCi0JCQkJCQlSMDkwMF9QMV9DRlIxKTsKLQkJY2Fycl9vZmZzZXQgPSBnZTJjb21wKGNhcnJfb2Zmc2V0LCAxNik7Ci0JCWFnYzJfaW50ZWdyID0gKHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FHQzJJMSkgPDwgOCkKLQkJCQkJCXwgc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywKLQkJCQkJCVIwOTAwX1AxX0FHQzJJMCk7Ci0JCW1heF9jYXJyaWVyID0gaV9wYXJhbXMtPmRtZDFfc3JjaF9yYW5nZSAvIDEwMDA7Ci0JCWJyZWFrOwotCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQljYXJyX29mZnNldCA9IChzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlIyKSA8PCA4KQotCQkJCQkJfCBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLAotCQkJCQkJUjA5MDBfUDJfQ0ZSMSk7Ci0JCWNhcnJfb2Zmc2V0ID0gZ2UyY29tcChjYXJyX29mZnNldCwgMTYpOwotCQlhZ2MyX2ludGVnciA9IChzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BR0MySTEpIDw8IDgpCi0JCQkJCQl8IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsCi0JCQkJCQlSMDkwMF9QMl9BR0MySTApOwotCQltYXhfY2FycmllciA9IGlfcGFyYW1zLT5kbWQyX3NyY2hfcmFuZ2UgLyAxMDAwOwotCQlicmVhazsKLQl9CisJY2Fycl9vZmZzZXQgPSAoc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBDRlIyKSA8PCA4KQorCQkJCQl8IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgQ0ZSMSk7CisJY2Fycl9vZmZzZXQgPSBnZTJjb21wKGNhcnJfb2Zmc2V0LCAxNik7CisJYWdjMl9pbnRlZ3IgPSAoc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBBR0MySTEpIDw8IDgpCisJCQkJCXwgc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBBR0MySTApOworCW1heF9jYXJyaWVyID0gaW50cC0+c3JjaF9yYW5nZVtkZW1vZF0gLyAxMDAwOwogCiAJbWF4X2NhcnJpZXIgKz0gKG1heF9jYXJyaWVyIC8gMTApOwogCW1heF9jYXJyaWVyID0gNjU1MzYgKiAobWF4X2NhcnJpZXIgLyAyKTsKLQltYXhfY2FycmllciAvPSBpX3BhcmFtcy0+bWNsayAvIDEwMDA7CisJbWF4X2NhcnJpZXIgLz0gaW50cC0+bWNsayAvIDEwMDA7CiAJaWYgKG1heF9jYXJyaWVyID4gMHg0MDAwKQogCQltYXhfY2FycmllciA9IDB4NDAwMDsKIAogCWlmICgoYWdjMl9pbnRlZ3IgPiAweDIwMDApCi0JCQl8fCAoY2Fycl9vZmZzZXQgPiArIDIqbWF4X2NhcnJpZXIpCi0JCQl8fCAoY2Fycl9vZmZzZXQgPCAtMiptYXhfY2FycmllcikpCisJCQl8fCAoY2Fycl9vZmZzZXQgPiAoMiAqIG1heF9jYXJyaWVyKSkKKwkJCXx8IChjYXJyX29mZnNldCA8ICgtMiAqIG1heF9jYXJyaWVyKSkpCiAJCW5vX3NpZ25hbCA9IFRSVUU7Ci0JZWxzZQotCQlub19zaWduYWwgPSBGQUxTRTsKIAogCXJldHVybiBub19zaWduYWw7CiB9CiAKLXN0YXRpYyB2b2lkIHN0djA5MDBfZ2V0X3N3X2xvb3BfcGFyYW1zKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK3N0YXRpYyB2b2lkIHN0djA5MDBfZ2V0X3N3X2xvb3BfcGFyYW1zKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCXMzMiAqZnJlcXVlbmN5X2luYywgczMyICpzd190aW1lb3V0LAogCQkJCXMzMiAqc3RlcHMsCiAJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKQEAgLTg1LDMwICs3NCwxOSBAQAogCiAJZW51bSBmZV9zdHYwOTAwX3NlYXJjaF9zdGFuZGFyZAlzdGFuZGFyZDsKIAotCXN3aXRjaCAoZGVtb2QpIHsKLQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQlkZWZhdWx0OgotCQlzcmF0ZSA9IGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlOwotCQltYXhfY2FycmllciA9IGlfcGFyYW1zLT5kbWQxX3NyY2hfcmFuZ2UgLyAxMDAwOwotCQltYXhfY2FycmllciArPSBtYXhfY2FycmllciAvIDEwOwotCQlzdGFuZGFyZCA9IGlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQ7Ci0JCWJyZWFrOwotCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQlzcmF0ZSA9IGlfcGFyYW1zLT5kbWQyX3N5bWJvbF9yYXRlOwotCQltYXhfY2FycmllciA9IGlfcGFyYW1zLT5kbWQyX3NyY2hfcmFuZ2UgLyAxMDAwOwotCQltYXhfY2FycmllciArPSBtYXhfY2FycmllciAvIDEwOwotCQlzdGFuZGFyZCA9IGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkOwotCQlicmVhazsKLQl9CisJc3JhdGUgPSBpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF07CisJbWF4X2NhcnJpZXIgPSBpbnRwLT5zcmNoX3JhbmdlW2RlbW9kXSAvIDEwMDA7CisJbWF4X2NhcnJpZXIgKz0gbWF4X2NhcnJpZXIgLyAxMDsKKwlzdGFuZGFyZCA9IGludHAtPnNyY2hfc3RhbmRhcmRbZGVtb2RdOwogCiAJbWF4X2NhcnJpZXIgPSA2NTUzNiAqIChtYXhfY2FycmllciAvIDIpOwotCW1heF9jYXJyaWVyIC89IGlfcGFyYW1zLT5tY2xrIC8gMTAwMDsKKwltYXhfY2FycmllciAvPSBpbnRwLT5tY2xrIC8gMTAwMDsKIAogCWlmIChtYXhfY2FycmllciA+IDB4NDAwMCkKIAkJbWF4X2NhcnJpZXIgPSAweDQwMDA7CiAKIAlmcmVxX2luYyA9IHNyYXRlOwotCWZyZXFfaW5jIC89IGlfcGFyYW1zLT5tY2xrID4+IDEwOworCWZyZXFfaW5jIC89IGludHAtPm1jbGsgPj4gMTA7CiAJZnJlcV9pbmMgPSBmcmVxX2luYyA8PCA2OwogCiAJc3dpdGNoIChzdGFuZGFyZCkgewpAQCAtMTU0LDcgKzEzMiw3IEBACiAKIH0KIAotc3RhdGljIGludCBzdHYwOTAwX3NlYXJjaF9jYXJyX3N3X2xvb3Aoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAorc3RhdGljIGludCBzdHYwOTAwX3NlYXJjaF9jYXJyX3N3X2xvb3Aoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJczMyIEZyZXFJbmNyLCBzMzIgVGltZW91dCwgaW50IHppZ3phZywKIAkJCQlzMzIgTWF4U3RlcCwgZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKQEAgLTE2NCwyMCArMTQyLDExIEBACiAJCWZyZXFPZmZzZXQsCiAJCW1heF9jYXJyaWVyOwogCi0Jc3dpdGNoIChkZW1vZCkgewotCWNhc2UgU1RWMDkwMF9ERU1PRF8xOgotCWRlZmF1bHQ6Ci0JCW1heF9jYXJyaWVyID0gaV9wYXJhbXMtPmRtZDFfc3JjaF9yYW5nZSAvIDEwMDA7Ci0JCW1heF9jYXJyaWVyICs9IChtYXhfY2FycmllciAvIDEwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzI6Ci0JCW1heF9jYXJyaWVyID0gaV9wYXJhbXMtPmRtZDJfc3JjaF9yYW5nZSAvIDEwMDA7Ci0JCW1heF9jYXJyaWVyICs9IChtYXhfY2FycmllciAvIDEwKTsKLQkJYnJlYWs7Ci0JfQorCW1heF9jYXJyaWVyID0gaW50cC0+c3JjaF9yYW5nZVtkZW1vZF0gLyAxMDAwOworCW1heF9jYXJyaWVyICs9IChtYXhfY2FycmllciAvIDEwKTsKIAogCW1heF9jYXJyaWVyID0gNjU1MzYgKiAobWF4X2NhcnJpZXIgLyAyKTsKLQltYXhfY2FycmllciAvPSBpX3BhcmFtcy0+bWNsayAvIDEwMDA7CisJbWF4X2NhcnJpZXIgLz0gaW50cC0+bWNsayAvIDEwMDA7CiAKIAlpZiAobWF4X2NhcnJpZXIgPiAweDQwMDApCiAJCW1heF9jYXJyaWVyID0gMHg0MDAwOwpAQCAtMTkwLDQwICsxNTksMTUgQEAKIAlzdGVwQ3B0ID0gMDsKIAogCWRvIHsKLQkJc3dpdGNoIChkZW1vZCkgewotCQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQkJZGVmYXVsdDoKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MUMpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQxLAotCQkJCQkoZnJlcU9mZnNldCAvIDI1NikgJiAweEZGKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DRlJJTklUMCwKLQkJCQkJIGZyZXFPZmZzZXQgJiAweEZGKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MTgpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9BTEdPU1dSU1QsIDEpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURJU1RBVEUsIDB4MWMpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJJTklUMSwgKGZyZXFPZmZzZXQgLyAyNTYpICYgMHhmZik7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENGUklOSVQwLCBmcmVxT2Zmc2V0ICYgMHhmZik7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxOCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBBTEdPU1dSU1QsIDEpOwogCi0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPT0gMHgxMikgewotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywKLQkJCQkJCUYwOTAwX1AxX1JTVF9IV0FSRSwgMSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLAotCQkJCQkJRjA5MDBfUDFfUlNUX0hXQVJFLCAwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MUMpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUklOSVQxLAotCQkJCQkoZnJlcU9mZnNldCAvIDI1NikgJiAweEZGKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMCwKLQkJCQkJZnJlcU9mZnNldCAmIDB4RkYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRElTVEFURSwgMHgxOCk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0FMR09TV1JTVCwgMSk7Ci0KLQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA9PSAweDEyKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLAotCQkJCQkJRjA5MDBfUDJfUlNUX0hXQVJFLCAxKTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsCi0JCQkJCQlGMDkwMF9QMl9SU1RfSFdBUkUsIDApOwotCQkJfQotCQkJYnJlYWs7CisJCWlmIChpbnRwLT5jaGlwX2lkID09IDB4MTIpIHsKKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDEpOworCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFJTVF9IV0FSRSwgMCk7CiAJCX0KIAogCQlpZiAoemlnemFnID09IFRSVUUpIHsKQEAgLTIzNSw4ICsxNzksOCBAQAogCQkJZnJlcU9mZnNldCArPSArIDIgKiBGcmVxSW5jcjsKIAogCQlzdGVwQ3B0Kys7Ci0JCWxvY2sgPSBzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgVGltZW91dCk7Ci0JCW5vX3NpZ25hbCA9IHN0djA5MDBfY2hlY2tfc2lnbmFsX3ByZXNlbmNlKGlfcGFyYW1zLCBkZW1vZCk7CisJCWxvY2sgPSBzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGludHAsIGRlbW9kLCBUaW1lb3V0KTsKKwkJbm9fc2lnbmFsID0gc3R2MDkwMF9jaGVja19zaWduYWxfcHJlc2VuY2UoaW50cCwgZGVtb2QpOwogCiAJfSB3aGlsZSAoKGxvY2sgPT0gRkFMU0UpCiAJCQkmJiAobm9fc2lnbmFsID09IEZBTFNFKQpAQCAtMjQ0LDI2OSArMTg4LDEzOCBAQAogCQkJJiYgKChmcmVxT2Zmc2V0ICsgRnJlcUluY3IpID4gLW1heF9jYXJyaWVyKQogCQkJJiYgKHN0ZXBDcHQgPCBNYXhTdGVwKSk7CiAKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9BTEdPU1dSU1QsIDApOwotCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9BTEdPU1dSU1QsIDApOwotCQlicmVhazsKLQl9CisJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEFMR09TV1JTVCwgMCk7CiAKIAlyZXR1cm4gbG9jazsKIH0KIAotaW50IHN0djA5MDBfc3dfYWxnbyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitpbnQgc3R2MDkwMF9zd19hbGdvKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7Ci0JaW50IGxvY2sgPSBGQUxTRTsKKwlpbnQJbG9jayA9IEZBTFNFLAorCQlub19zaWduYWwsCisJCXppZ3phZzsKKwlzMzIJczJmdywKKwkJZnFjX2luYywKKwkJc2Z0X3N0cF90b3V0LAorCQl0cmlhbF9jbnRyLAorCQltYXhfc3RlcHM7CiAKLQlpbnQgbm9fc2lnbmFsLAotCXppZ3phZzsKLQlzMzIgZHZiczJfZmx5X3doZWVsOwotCi0JczMyIGZyZXFJbmNyZW1lbnQsIHNvZnRTdGVwVGltZW91dCwgdHJpYWxDb3VudGVyLCBtYXhfc3RlcHM7Ci0KLQlzdHYwOTAwX2dldF9zd19sb29wX3BhcmFtcyhpX3BhcmFtcywgJmZyZXFJbmNyZW1lbnQsICZzb2Z0U3RlcFRpbWVvdXQsCisJc3R2MDkwMF9nZXRfc3dfbG9vcF9wYXJhbXMoaW50cCwgJmZxY19pbmMsICZzZnRfc3RwX3RvdXQsCiAJCQkJCSZtYXhfc3RlcHMsIGRlbW9kKTsKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3dpdGNoIChpX3BhcmFtcy0+ZG1kMV9zcmNoX3N0YW5kYXJkKSB7Ci0JCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFZCUzE6Ci0JCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFNTOgotCQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NBUkZSRVEsCi0JCQkJCQkweDNCKTsKLQkJCWVsc2UKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSRlJFUSwKLQkJCQkJCTB4ZWYpOworCXN3aXRjaCAoaW50cC0+c3JjaF9zdGFuZGFyZFtkZW1vZF0pIHsKKwljYXNlIFNUVjA5MDBfU0VBUkNIX0RWQlMxOgorCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFNTOgorCQlpZiAoaW50cC0+Y2hpcF9pZCA+PSAweDIwKQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSRlJFUSwgMHgzYik7CisJCWVsc2UKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4ZWYpOwogCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1EQ0ZHTUQsIDB4NDkpOwotCQkJemlnemFnID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX1NFQVJDSF9EVkJTMjoKLQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA+PSAweDIwKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DT1JSRUxBQlMsCi0JCQkJCQkweDc5KTsKLQkJCWVsc2UKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ09SUkVMQUJTLAotCQkJCQkJMHg2OCk7Ci0KLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURDRkdNRCwKLQkJCQkJCTB4ODkpOwotCi0JCQl6aWd6YWcgPSBUUlVFOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1RWMDkwMF9BVVRPX1NFQVJDSDoKLQkJZGVmYXVsdDoKLQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA+PSAweDIwKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NBUkZSRVEsCi0JCQkJCQkJMHgzQik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NPUlJFTEFCUywKLQkJCQkJCQkweDc5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NBUkZSRVEsCi0JCQkJCQkJMHhlZik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NPUlJFTEFCUywKLQkJCQkJCQkweDY4KTsKLQkJCX0KLQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRENGR01ELAotCQkJCQkJCTB4YzkpOwotCQkJemlnemFnID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCXRyaWFsQ291bnRlciA9IDA7Ci0JCWRvIHsKLQkJCWxvY2sgPSBzdHYwOTAwX3NlYXJjaF9jYXJyX3N3X2xvb3AoaV9wYXJhbXMsCi0JCQkJCQkJZnJlcUluY3JlbWVudCwKLQkJCQkJCQlzb2Z0U3RlcFRpbWVvdXQsCi0JCQkJCQkJemlnemFnLAotCQkJCQkJCW1heF9zdGVwcywKLQkJCQkJCQlkZW1vZCk7Ci0JCQlub19zaWduYWwgPSBzdHYwOTAwX2NoZWNrX3NpZ25hbF9wcmVzZW5jZShpX3BhcmFtcywKLQkJCQkJCQkJZGVtb2QpOwotCQkJdHJpYWxDb3VudGVyKys7Ci0JCQlpZiAoKGxvY2sgPT0gVFJVRSkKLQkJCQkJfHwgKG5vX3NpZ25hbCA9PSBUUlVFKQotCQkJCQl8fCAodHJpYWxDb3VudGVyID09IDIpKSB7Ci0KLQkJCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywKLQkJCQkJCQlSMDkwMF9QMV9DQVJGUkVRLAotCQkJCQkJCTB4NDkpOwotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywKLQkJCQkJCQlSMDkwMF9QMV9DT1JSRUxBQlMsCi0JCQkJCQkJMHg5ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsCi0JCQkJCQkJUjA5MDBfUDFfQ0FSRlJFUSwKLQkJCQkJCQkweGVkKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsCi0JCQkJCQkJUjA5MDBfUDFfQ09SUkVMQUJTLAotCQkJCQkJCTB4ODgpOwotCQkJCX0KLQotCQkJCWlmICgobG9jayA9PSBUUlVFKSAmJiAoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfSEVBREVSX01PREUpID09IFNUVjA5MDBfRFZCUzJfRk9VTkQpKSB7Ci0JCQkJCW1zbGVlcChzb2Z0U3RlcFRpbWVvdXQpOwotCQkJCQlkdmJzMl9mbHlfd2hlZWwgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9GTFlXSEVFTF9DUFQpOwotCi0JCQkJCWlmIChkdmJzMl9mbHlfd2hlZWwgPCAweGQpIHsKLQkJCQkJCW1zbGVlcChzb2Z0U3RlcFRpbWVvdXQpOwotCQkJCQkJZHZiczJfZmx5X3doZWVsID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRkxZV0hFRUxfQ1BUKTsKLQkJCQkJfQotCi0JCQkJCWlmIChkdmJzMl9mbHlfd2hlZWwgPCAweGQpIHsKLQkJCQkJCWxvY2sgPSBGQUxTRTsKLQotCQkJCQkJaWYgKHRyaWFsQ291bnRlciA8IDIpIHsKLQkJCQkJCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkKLQkJCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NPUlJFTEFCUywgMHg3OSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ09SUkVMQUJTLCAweDY4KTsKLQotCQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURDRkdNRCwgMHg4OSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfSB3aGlsZSAoKGxvY2sgPT0gRkFMU0UpCi0JCQkmJiAodHJpYWxDb3VudGVyIDwgMikKLQkJCSYmIChub19zaWduYWwgPT0gRkFMU0UpKTsKLQorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURDRkdNRCwgMHg0OSk7CisJCXppZ3phZyA9IEZBTFNFOwogCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJc3dpdGNoIChpX3BhcmFtcy0+ZG1kMl9zcmNoX3N0bmRyZCkgewotCQljYXNlIFNUVjA5MDBfU0VBUkNIX0RWQlMxOgotCQljYXNlIFNUVjA5MDBfU0VBUkNIX0RTUzoKLQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA+PSAweDIwKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJGUkVRLAotCQkJCQkJMHgzYik7Ci0JCQllbHNlCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkZSRVEsCi0JCQkJCQkweGVmKTsKKwljYXNlIFNUVjA5MDBfU0VBUkNIX0RWQlMyOgorCQlpZiAoaW50cC0+Y2hpcF9pZCA+PSAweDIwKQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ09SUkVMQUJTLCAweDc5KTsKKwkJZWxzZQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ09SUkVMQUJTLCAweDY4KTsKIAotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRENGR01ELAotCQkJCQkJMHg0OSk7Ci0JCQl6aWd6YWcgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfU0VBUkNIX0RWQlMyOgotCQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NPUlJFTEFCUywKLQkJCQkJCTB4NzkpOwotCQkJZWxzZQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DT1JSRUxBQlMsCi0JCQkJCQkweDY4KTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1EQ0ZHTUQsIDB4ODkpOwogCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1EQ0ZHTUQsIDB4ODkpOwotCQkJemlnemFnID0gVFJVRTsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfQVVUT19TRUFSQ0g6Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJGUkVRLAotCQkJCQkJMHgzYik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NPUlJFTEFCUywKLQkJCQkJCTB4NzkpOwotCQkJfSBlbHNlIHsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0FSRlJFUSwKLQkJCQkJCTB4ZWYpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DT1JSRUxBQlMsCi0JCQkJCQkweDY4KTsKLQkJCX0KLQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRENGR01ELCAweGM5KTsKLQotCQkJemlnemFnID0gRkFMU0U7Ci0JCQlicmVhazsKKwkJemlnemFnID0gVFJVRTsKKwkJYnJlYWs7CisJY2FzZSBTVFYwOTAwX0FVVE9fU0VBUkNIOgorCWRlZmF1bHQ6CisJCWlmIChpbnRwLT5jaGlwX2lkID49IDB4MjApIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4M2IpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ09SUkVMQUJTLCAweDc5KTsKKwkJfSBlbHNlIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4ZWYpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ09SUkVMQUJTLCAweDY4KTsKIAkJfQogCi0JCXRyaWFsQ291bnRlciA9IDA7Ci0KLQkJZG8gewotCQkJbG9jayA9IHN0djA5MDBfc2VhcmNoX2NhcnJfc3dfbG9vcChpX3BhcmFtcywKLQkJCQkJCQlmcmVxSW5jcmVtZW50LAotCQkJCQkJCXNvZnRTdGVwVGltZW91dCwKLQkJCQkJCQl6aWd6YWcsCi0JCQkJCQkJbWF4X3N0ZXBzLAotCQkJCQkJCWRlbW9kKTsKLQkJCW5vX3NpZ25hbCA9IHN0djA5MDBfY2hlY2tfc2lnbmFsX3ByZXNlbmNlKGlfcGFyYW1zLAotCQkJCQkJCQlkZW1vZCk7Ci0JCQl0cmlhbENvdW50ZXIrKzsKLQkJCWlmICgobG9jayA9PSBUUlVFKQotCQkJCQl8fCAobm9fc2lnbmFsID09IFRSVUUpCi0JCQkJCXx8ICh0cmlhbENvdW50ZXIgPT0gMikpIHsKLQkJCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywKLQkJCQkJCQlSMDkwMF9QMl9DQVJGUkVRLAotCQkJCQkJCTB4NDkpOwotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywKLQkJCQkJCQlSMDkwMF9QMl9DT1JSRUxBQlMsCi0JCQkJCQkJMHg5ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsCi0JCQkJCQkJUjA5MDBfUDJfQ0FSRlJFUSwKLQkJCQkJCQkweGVkKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsCi0JCQkJCQkJUjA5MDBfUDJfQ09SUkVMQUJTLAotCQkJCQkJCTB4ODgpOwotCQkJCX0KLQotCQkJCWlmICgobG9jayA9PSBUUlVFKSAmJiAoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfSEVBREVSX01PREUpID09IFNUVjA5MDBfRFZCUzJfRk9VTkQpKSB7Ci0JCQkJCW1zbGVlcChzb2Z0U3RlcFRpbWVvdXQpOwotCQkJCQlkdmJzMl9mbHlfd2hlZWwgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9GTFlXSEVFTF9DUFQpOwotCQkJCQlpZiAoZHZiczJfZmx5X3doZWVsIDwgMHhkKSB7Ci0JCQkJCQltc2xlZXAoc29mdFN0ZXBUaW1lb3V0KTsKLQkJCQkJCWR2YnMyX2ZseV93aGVlbCA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0ZMWVdIRUVMX0NQVCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZHZiczJfZmx5X3doZWVsIDwgMHhkKSB7Ci0JCQkJCQlsb2NrID0gRkFMU0U7Ci0JCQkJCQlpZiAodHJpYWxDb3VudGVyIDwgMikgewotCQkJCQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA+PSAweDIwKQotCQkJCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ09SUkVMQUJTLCAweDc5KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DT1JSRUxBQlMsIDB4NjgpOwotCi0JCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRENGR01ELCAweDg5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9IHdoaWxlICgobG9jayA9PSBGQUxTRSkgJiYgKHRyaWFsQ291bnRlciA8IDIpICYmIChub19zaWduYWwgPT0gRkFMU0UpKTsKLQorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURDRkdNRCwgMHhjOSk7CisJCXppZ3phZyA9IEZBTFNFOwogCQlicmVhazsKIAl9CiAKKwl0cmlhbF9jbnRyID0gMDsKKwlkbyB7CisJCWxvY2sgPSBzdHYwOTAwX3NlYXJjaF9jYXJyX3N3X2xvb3AoaW50cCwKKwkJCQkJCWZxY19pbmMsCisJCQkJCQlzZnRfc3RwX3RvdXQsCisJCQkJCQl6aWd6YWcsCisJCQkJCQltYXhfc3RlcHMsCisJCQkJCQlkZW1vZCk7CisJCW5vX3NpZ25hbCA9IHN0djA5MDBfY2hlY2tfc2lnbmFsX3ByZXNlbmNlKGludHAsIGRlbW9kKTsKKwkJdHJpYWxfY250cisrOworCQlpZiAoKGxvY2sgPT0gVFJVRSkKKwkJCQl8fCAobm9fc2lnbmFsID09IFRSVUUpCisJCQkJfHwgKHRyaWFsX2NudHIgPT0gMikpIHsKKworCQkJaWYgKGludHAtPmNoaXBfaWQgPj0gMHgyMCkgeworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4NDkpOworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENPUlJFTEFCUywgMHg5ZSk7CisJCQl9IGVsc2UgeworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4ZWQpOworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENPUlJFTEFCUywgMHg4OCk7CisJCQl9CisKKwkJCWlmICgoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBIRUFERVJfTU9ERSkgPT0KKwkJCQkJCVNUVjA5MDBfRFZCUzJfRk9VTkQpICYmCisJCQkJCQkJKGxvY2sgPT0gVFJVRSkpIHsKKwkJCQltc2xlZXAoc2Z0X3N0cF90b3V0KTsKKwkJCQlzMmZ3ID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBGTFlXSEVFTF9DUFQpOworCisJCQkJaWYgKHMyZncgPCAweGQpIHsKKwkJCQkJbXNsZWVwKHNmdF9zdHBfdG91dCk7CisJCQkJCXMyZncgPSBzdHYwOTAwX2dldF9iaXRzKGludHAsCisJCQkJCQkJCUZMWVdIRUVMX0NQVCk7CisJCQkJfQorCisJCQkJaWYgKHMyZncgPCAweGQpIHsKKwkJCQkJbG9jayA9IEZBTFNFOworCisJCQkJCWlmICh0cmlhbF9jbnRyIDwgMikgeworCQkJCQkJaWYgKGludHAtPmNoaXBfaWQgPj0gMHgyMCkKKwkJCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLAorCQkJCQkJCQlDT1JSRUxBQlMsCisJCQkJCQkJCTB4NzkpOworCQkJCQkJZWxzZQorCQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsCisJCQkJCQkJCUNPUlJFTEFCUywKKwkJCQkJCQkJMHg2OCk7CisKKwkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsCisJCQkJCQkJCURNRENGR01ELAorCQkJCQkJCQkweDg5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJfSB3aGlsZSAoKGxvY2sgPT0gRkFMU0UpCisJCSYmICh0cmlhbF9jbnRyIDwgMikKKwkJJiYgKG5vX3NpZ25hbCA9PSBGQUxTRSkpOworCiAJcmV0dXJuIGxvY2s7CiB9CiAKLXN0YXRpYyB1MzIgc3R2MDkwMF9nZXRfc3ltYm9sX3JhdGUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAorc3RhdGljIHUzMiBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQkJdTMyIG1jbGssCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7Ci0JczMyIHNmcl9maWVsZDMsIHNmcl9maWVsZDIsIHNmcl9maWVsZDEsIHNmcl9maWVsZDAsCi0JcmVtMSwgcmVtMiwgaW50dmFsMSwgaW50dmFsMiwgc3JhdGU7CisJczMyCXJlbTEsIHJlbTIsIGludHZhbDEsIGludHZhbDIsIHNyYXRlOwogCi0JZG1kX3JlZyhzZnJfZmllbGQzLCBGMDkwMF9QMV9TWU1CX0ZSRVEzLCBGMDkwMF9QMl9TWU1CX0ZSRVEzKTsKLQlkbWRfcmVnKHNmcl9maWVsZDIsIEYwOTAwX1AxX1NZTUJfRlJFUTIsIEYwOTAwX1AyX1NZTUJfRlJFUTIpOwotCWRtZF9yZWcoc2ZyX2ZpZWxkMSwgRjA5MDBfUDFfU1lNQl9GUkVRMSwgRjA5MDBfUDJfU1lNQl9GUkVRMSk7Ci0JZG1kX3JlZyhzZnJfZmllbGQwLCBGMDkwMF9QMV9TWU1CX0ZSRVEwLCBGMDkwMF9QMl9TWU1CX0ZSRVEwKTsKLQotCXNyYXRlID0gKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIHNmcl9maWVsZDMpIDw8IDI0KSArCi0JCShzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBzZnJfZmllbGQyKSA8PCAxNikgKwotCQkoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgc2ZyX2ZpZWxkMSkgPDwgOCkgKwotCQkoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgc2ZyX2ZpZWxkMCkpOworCXNyYXRlID0gKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgU1lNQl9GUkVRMykgPDwgMjQpICsKKwkJKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgU1lNQl9GUkVRMikgPDwgMTYpICsKKwkJKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgU1lNQl9GUkVRMSkgPDwgOCkgKworCQkoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBTWU1CX0ZSRVEwKSk7CiAJZHByaW50aygibG9jazogc3JhdGU9JWQgcjA9MHgleCByMT0weCV4IHIyPTB4JXggcjM9MHgleCBcbiIsCi0JCXNyYXRlLCBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBzZnJfZmllbGQwKSwKLQkJc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgc2ZyX2ZpZWxkMSksCi0JCXN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIHNmcl9maWVsZDIpLAotCQlzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBzZnJfZmllbGQzKSk7CisJCXNyYXRlLCBzdHYwOTAwX2dldF9iaXRzKGludHAsIFNZTUJfRlJFUTApLAorCQlzdHYwOTAwX2dldF9iaXRzKGludHAsIFNZTUJfRlJFUTEpLAorCQlzdHYwOTAwX2dldF9iaXRzKGludHAsIFNZTUJfRlJFUTIpLAorCQlzdHYwOTAwX2dldF9iaXRzKGludHAsIFNZTUJfRlJFUTMpKTsKIAogCWludHZhbDEgPSAobWNsaykgPj4gMTY7CiAJaW50dmFsMiA9IChzcmF0ZSkgPj4gMTY7CkBAIC01MjAsMTggKzMzMywxNSBAQAogCXJldHVybiBzcmF0ZTsKIH0KIAotc3RhdGljIHZvaWQgc3R2MDkwMF9zZXRfc3ltYm9sX3JhdGUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAorc3RhdGljIHZvaWQgc3R2MDkwMF9zZXRfc3ltYm9sX3JhdGUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJCXUzMiBtY2xrLCB1MzIgc3JhdGUsCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7Ci0JczMyIHNmcl9pbml0X3JlZzsKIAl1MzIgc3ltYjsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlczogTWNsayAlZCwgU1IgJWQsIERtZCAlZFxuIiwgX19mdW5jX18sIG1jbGssCisJZHByaW50aygiJXM6IE1jbGsgJWQsIFNSICVkLCBEbWQgJWRcbiIsIF9fZnVuY19fLCBtY2xrLAogCQkJCQkJCXNyYXRlLCBkZW1vZCk7CiAKLQlkbWRfcmVnKHNmcl9pbml0X3JlZywgUjA5MDBfUDFfU0ZSSU5JVDEsIFIwOTAwX1AyX1NGUklOSVQxKTsKLQogCWlmIChzcmF0ZSA+IDYwMDAwMDAwKSB7CiAJCXN5bWIgPSBzcmF0ZSA8PCA0OwogCQlzeW1iIC89IChtY2xrID4+IDEyKTsKQEAgLTU0MywxOSArMzUzLDE2IEBACiAJCXN5bWIgLz0gKG1jbGsgPj4gNyk7CiAJfQogCi0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHNmcl9pbml0X3JlZywgKHN5bWIgPj4gOCkgJiAweDdGKTsKLQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgc2ZyX2luaXRfcmVnICsgMSwgKHN5bWIgJiAweEZGKSk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSSU5JVDEsIChzeW1iID4+IDgpICYgMHg3Zik7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSSU5JVDEgKyAxLCAoc3ltYiAmIDB4ZmYpKTsKIH0KIAotc3RhdGljIHZvaWQgc3R2MDkwMF9zZXRfbWF4X3N5bWJvbF9yYXRlKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK3N0YXRpYyB2b2lkIHN0djA5MDBfc2V0X21heF9zeW1ib2xfcmF0ZShzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQkJdTMyIG1jbGssIHUzMiBzcmF0ZSwKIAkJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKLQlzMzIgc2ZyX21heF9yZWc7CiAJdTMyIHN5bWI7CiAKLQlkbWRfcmVnKHNmcl9tYXhfcmVnLCBSMDkwMF9QMV9TRlJVUDEsIFIwOTAwX1AyX1NGUlVQMSk7Ci0KIAlzcmF0ZSA9IDEwNSAqIChzcmF0ZSAvIDEwMCk7CiAKIAlpZiAoc3JhdGUgPiA2MDAwMDAwMCkgewpAQCAtNTcwLDIzICszNzcsMjAgQEAKIAl9CiAKIAlpZiAoc3ltYiA8IDB4N2ZmZikgewotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgc2ZyX21heF9yZWcsIChzeW1iID4+IDgpICYgMHg3Rik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBzZnJfbWF4X3JlZyArIDEsIChzeW1iICYgMHhGRikpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBTRlJVUDEsIChzeW1iID4+IDgpICYgMHg3Zik7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUlVQMSArIDEsIChzeW1iICYgMHhmZikpOwogCX0gZWxzZSB7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBzZnJfbWF4X3JlZywgMHg3Rik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBzZnJfbWF4X3JlZyArIDEsIDB4RkYpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBTRlJVUDEsIDB4N2YpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBTRlJVUDEgKyAxLCAweGZmKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHN0djA5MDBfc2V0X21pbl9zeW1ib2xfcmF0ZShzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitzdGF0aWMgdm9pZCBzdHYwOTAwX3NldF9taW5fc3ltYm9sX3JhdGUoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJCXUzMiBtY2xrLCB1MzIgc3JhdGUsCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7Ci0JczMyIHNmcl9taW5fcmVnOwogCXUzMglzeW1iOwogCi0JZG1kX3JlZyhzZnJfbWluX3JlZywgUjA5MDBfUDFfU0ZSTE9XMSwgUjA5MDBfUDJfU0ZSTE9XMSk7Ci0KIAlzcmF0ZSA9IDk1ICogKHNyYXRlIC8gMTAwKTsKIAlpZiAoc3JhdGUgPiA2MDAwMDAwMCkgewogCQlzeW1iID0gc3JhdGUgPDwgNDsKQEAgLTYwMSwyMiArNDA1LDIwIEBACiAJCXN5bWIgLz0gKG1jbGsgPj4gNyk7CiAJfQogCi0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHNmcl9taW5fcmVnLCAoc3ltYiA+PiA4KSAmIDB4RkYpOwotCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBzZnJfbWluX3JlZyArIDEsIChzeW1iICYgMHhGRikpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUkxPVzEsIChzeW1iID4+IDgpICYgMHhmZik7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSTE9XMSArIDEsIChzeW1iICYgMHhmZikpOwogfQogCi1zdGF0aWMgczMyIHN0djA5MDBfZ2V0X3RpbWluZ19vZmZzdChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitzdGF0aWMgczMyIHN0djA5MDBfZ2V0X3RpbWluZ19vZmZzdChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQkJdTMyIHNyYXRlLAogCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQogewotCXMzMiB0bWdyZWcsCi0JdGltaW5nb2Zmc2V0OworCXMzMiB0aW1pbmdvZmZzZXQ7CiAKLQlkbWRfcmVnKHRtZ3JlZywgUjA5MDBfUDFfVE1HUkVHMiwgUjA5MDBfUDJfVE1HUkVHMik7CiAKLQl0aW1pbmdvZmZzZXQgPSAoc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgdG1ncmVnKSA8PCAxNikgKwotCQkgICAgICAgKHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIHRtZ3JlZyArIDEpIDw8IDgpICsKLQkJICAgICAgIChzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCB0bWdyZWcgKyAyKSk7CisJdGltaW5nb2Zmc2V0ID0gKHN0djA5MDBfcmVhZF9yZWcoaW50cCwgVE1HUkVHMikgPDwgMTYpICsKKwkJICAgICAgIChzdHYwOTAwX3JlYWRfcmVnKGludHAsIFRNR1JFRzIgKyAxKSA8PCA4KSArCisJCSAgICAgICAoc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBUTUdSRUcyICsgMikpOwogCiAJdGltaW5nb2Zmc2V0ID0gZ2UyY29tcCh0aW1pbmdvZmZzZXQsIDI0KTsKIApAQCAtNjMwLDIyICs0MzIsMTkgQEAKIAlyZXR1cm4gdGltaW5nb2Zmc2V0OwogfQogCi1zdGF0aWMgdm9pZCBzdHYwOTAwX3NldF9kdmJzMl9yb2xsb2ZmKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK3N0YXRpYyB2b2lkIHN0djA5MDBfc2V0X2R2YnMyX3JvbGxvZmYoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7Ci0JczMyIHJvbGxvZmYsIG1hbl9mbGQsIG1hdHN0cl9yZWcsIHJvbGxvZmZfY3RsX2ZsZDsKKwlzMzIgcm9sbG9mZjsKIAotCWRtZF9yZWcobWFuX2ZsZCwgRjA5MDBfUDFfTUFOVUFMX1JPTExPRkYsIEYwOTAwX1AyX01BTlVBTF9ST0xMT0ZGKTsKLQlkbWRfcmVnKG1hdHN0cl9yZWcsIFIwOTAwX1AxX01BVFNUUjEsIFIwOTAwX1AyX01BVFNUUjEpOwotCWRtZF9yZWcocm9sbG9mZl9jdGxfZmxkLCBGMDkwMF9QMV9ST0xMT0ZGX0NPTlRST0wsCi0JCQkJRjA5MDBfUDJfUk9MTE9GRl9DT05UUk9MKTsKLQotCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA9PSAweDEwKSB7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgbWFuX2ZsZCwgMSk7Ci0JCXJvbGxvZmYgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBtYXRzdHJfcmVnKSAmIDB4MDM7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgcm9sbG9mZl9jdGxfZmxkLCByb2xsb2ZmKTsKLQl9IGVsc2UKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBtYW5fZmxkLCAwKTsKKwlpZiAoaW50cC0+Y2hpcF9pZCA9PSAweDEwKSB7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBNQU5VQUxTWF9ST0xMT0ZGLCAxKTsKKwkJcm9sbG9mZiA9IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgTUFUU1RSMSkgJiAweDAzOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgUk9MTE9GRl9DT05UUk9MLCByb2xsb2ZmKTsKKwl9IGVsc2UgaWYgKGludHAtPmNoaXBfaWQgPD0gMHgyMCkKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIE1BTlVBTFNYX1JPTExPRkYsIDApOworCWVsc2UgLyogY3V0IDMuMCAqLworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgTUFOVUFMUzJfUk9MTE9GRiwgMCk7CiB9CiAKIHN0YXRpYyB1MzIgc3R2MDkwMF9jYXJyaWVyX3dpZHRoKHUzMiBzcmF0ZSwgZW51bSBmZV9zdHYwOTAwX3JvbGxvZmYgcm8pCkBAIC02NjgsODUgKzQ2Nyw0OCBAQAogCXJldHVybiBzcmF0ZSAgKyAoc3JhdGUgKiByb2xsb2ZmKSAvIDEwMDsKIH0KIAotc3RhdGljIGludCBzdHYwOTAwX2NoZWNrX3RpbWluZ19sb2NrKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK3N0YXRpYyBpbnQgc3R2MDkwMF9jaGVja190aW1pbmdfbG9jayhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQogewogCWludCB0aW1pbmdMb2NrID0gRkFMU0U7Ci0JczMyIGksCi0JdGltaW5nY3B0ID0gMDsKLQl1OCBjYXJGcmVxLAotCXRtZ1RIaGlnaCwKLQl0bWdUSExvdzsKKwlzMzIJaSwKKwkJdGltaW5nY3B0ID0gMDsKKwl1OAljYXJfZnJlcSwKKwkJdG1nX3RoX2hpZ2gsCisJCXRtZ190aF9sb3c7CiAKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJY2FyRnJlcSA9IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NBUkZSRVEpOwotCQl0bWdUSGhpZ2ggPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdUSFJJU0UpOwotCQl0bWdUSExvdyA9IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1RNR1RIRkFMTCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdUSFJJU0UsIDB4MjApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVE1HVEhGQUxMLCAweDApOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0NGUl9BVVRPU0NBTiwgMCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9SVEMsIDB4ODApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfUlRDUzIsIDB4NDApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSRlJFUSwgMHgwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQxLCAweDApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDAsIDB4MCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BR0MyUkVGLCAweDY1KTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxOCk7Ci0JCW1zbGVlcCg3KTsKKwljYXJfZnJlcSA9IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgQ0FSRlJFUSk7CisJdG1nX3RoX2hpZ2ggPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIFRNR1RIUklTRSk7CisJdG1nX3RoX2xvdyA9IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgVE1HVEhGQUxMKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBUTUdUSFJJU0UsIDB4MjApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFRNR1RIRkFMTCwgMHgwKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgQ0ZSX0FVVE9TQ0FOLCAwKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBSVEMsIDB4ODApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFJUQ1MyLCAweDQwKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJGUkVRLCAweDApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENGUklOSVQxLCAweDApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENGUklOSVQwLCAweDApOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFHQzJSRUYsIDB4NjUpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxOCk7CisJbXNsZWVwKDcpOwogCi0JCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpZiAoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfVE1HTE9DS19RVUFMSVRZKSA+PSAyKQotCQkJCXRpbWluZ2NwdCsrOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmIChzdHYwOTAwX2dldF9iaXRzKGludHAsIFRNR0xPQ0tfUVVBTElUWSkgPj0gMikKKwkJCXRpbWluZ2NwdCsrOwogCi0JCQltc2xlZXAoMSk7Ci0JCX0KLQotCQlpZiAodGltaW5nY3B0ID49IDMpCi0JCQl0aW1pbmdMb2NrID0gVFJVRTsKLQotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQUdDMlJFRiwgMHgzOCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9SVEMsIDB4ODgpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfUlRDUzIsIDB4NjgpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSRlJFUSwgY2FyRnJlcSk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdUSFJJU0UsIHRtZ1RIaGlnaCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdUSEZBTEwsIHRtZ1RITG93KTsKLQkJYnJlYWs7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzI6Ci0JCWNhckZyZXEgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJGUkVRKTsKLQkJdG1nVEhoaWdoID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HVEhSSVNFKTsKLQkJdG1nVEhMb3cgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTUdUSEZBTEwpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HVEhSSVNFLCAweDIwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1RNR1RIRkFMTCwgMCk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfQ0ZSX0FVVE9TQ0FOLCAwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1JUQywgMHg4MCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9SVENTMiwgMHg0MCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJGUkVRLCAweDApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSSU5JVDEsIDB4MCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMCwgMHgwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FHQzJSRUYsIDB4NjUpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1ESVNUQVRFLCAweDE4KTsKLQkJbXNsZWVwKDUpOwotCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1RNR0xPQ0tfUVVBTElUWSkgPj0gMikKLQkJCQl0aW1pbmdjcHQrKzsKLQotCQkJbXNsZWVwKDEpOwotCQl9Ci0KLQkJaWYgKHRpbWluZ2NwdCA+PSAzKQotCQkJdGltaW5nTG9jayA9IFRSVUU7Ci0KLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FHQzJSRUYsIDB4MzgpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfUlRDLCAweDg4KTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1JUQ1MyLCAweDY4KTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkZSRVEsIGNhckZyZXEpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HVEhSSVNFLCB0bWdUSGhpZ2gpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HVEhGQUxMLCB0bWdUSExvdyk7Ci0JCWJyZWFrOworCQltc2xlZXAoMSk7CiAJfQogCisJaWYgKHRpbWluZ2NwdCA+PSAzKQorCQl0aW1pbmdMb2NrID0gVFJVRTsKKworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFHQzJSRUYsIDB4MzgpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFJUQywgMHg4OCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUlRDUzIsIDB4NjgpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIGNhcl9mcmVxKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBUTUdUSFJJU0UsIHRtZ190aF9oaWdoKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBUTUdUSEZBTEwsIHRtZ190aF9sb3cpOworCiAJcmV0dXJuCXRpbWluZ0xvY2s7CiB9CiAKQEAgLTc1NCwxNDIgKzUxNiwxMTQgQEAKIAkJCQkJczMyIGRlbW9kX3RpbWVvdXQpCiB7CiAJc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Jc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zID0gc3RhdGUtPmludGVybmFsOworCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwID0gc3RhdGUtPmludGVybmFsOwogCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QgPSBzdGF0ZS0+ZGVtb2Q7CisJaW50CWxvY2sgPSBGQUxTRSwKKwkJZCA9IGRlbW9kOworCXMzMglzcmF0ZSwKKwkJc2VhcmNoX3JhbmdlLAorCQlsb2NrdGltZW91dCwKKwkJY3Vycmllcl9zdGVwLAorCQluYl9zdGVwcywKKwkJY3VycmVudF9zdGVwLAorCQlkaXJlY3Rpb24sCisJCXR1bmVyX2ZyZXEsCisJCXRpbWVvdXQsCisJCWZyZXE7CiAKLQlpbnQgbG9jayA9IEZBTFNFOwotCXMzMiBzcmF0ZSwgc2VhcmNoX3JhbmdlLCBsb2NrdGltZW91dCwKLQkJY3Vycmllcl9zdGVwLCBuYl9zdGVwcywgY3VycmVudF9zdGVwLAotCQlkaXJlY3Rpb24sIHR1bmVyX2ZyZXEsIHRpbWVvdXQ7Ci0KLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3JhdGUgPSBpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZTsKLQkJc2VhcmNoX3JhbmdlID0gaV9wYXJhbXMtPmRtZDFfc3JjaF9yYW5nZTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJc3JhdGUgPSBpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZTsKLQkJc2VhcmNoX3JhbmdlID0gaV9wYXJhbXMtPmRtZDJfc3JjaF9yYW5nZTsKLQkJYnJlYWs7Ci0JfQorCXNyYXRlID0gaW50cC0+c3ltYm9sX3JhdGVbZF07CisJc2VhcmNoX3JhbmdlID0gaW50cC0+c3JjaF9yYW5nZVtkXTsKIAogCWlmIChzcmF0ZSA+PSAxMDAwMDAwMCkKIAkJbG9ja3RpbWVvdXQgPSBkZW1vZF90aW1lb3V0IC8gMzsKIAllbHNlCiAJCWxvY2t0aW1lb3V0ID0gZGVtb2RfdGltZW91dCAvIDI7CiAKLQlsb2NrID0gc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpX3BhcmFtcywgZGVtb2QsIGxvY2t0aW1lb3V0KTsKKwlsb2NrID0gc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpbnRwLCBkLCBsb2NrdGltZW91dCk7CiAKLQlpZiAobG9jayA9PSBGQUxTRSkgewotCQlpZiAoc3JhdGUgPj0gMTAwMDAwMDApIHsKLQkJCWlmIChzdHYwOTAwX2NoZWNrX3RpbWluZ19sb2NrKGlfcGFyYW1zLCBkZW1vZCkgPT0gVFJVRSkgewotCQkJCXN3aXRjaCAoZGVtb2QpIHsKLQkJCQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQkJCQlkZWZhdWx0OgotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1ESVNUQVRFLCAweDFmKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxNSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1ESVNUQVRFLCAweDFmKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRElTVEFURSwgMHgxNSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwlpZiAobG9jayAhPSBGQUxTRSkKKwkJcmV0dXJuIGxvY2s7CiAKLQkJCQlsb2NrID0gc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpX3BhcmFtcywgZGVtb2QsIGRlbW9kX3RpbWVvdXQpOwotCQkJfSBlbHNlCi0JCQkJbG9jayA9IEZBTFNFOwotCQl9IGVsc2UgewotCQkJaWYgKHNyYXRlIDw9IDQwMDAwMDApCi0JCQkJY3Vycmllcl9zdGVwID0gMTAwMDsKLQkJCWVsc2UgaWYgKHNyYXRlIDw9IDcwMDAwMDApCi0JCQkJY3Vycmllcl9zdGVwID0gMjAwMDsKLQkJCWVsc2UgaWYgKHNyYXRlIDw9IDEwMDAwMDAwKQotCQkJCWN1cnJpZXJfc3RlcCA9IDMwMDA7Ci0JCQllbHNlCi0JCQkJY3Vycmllcl9zdGVwID0gNTAwMDsKKwlpZiAoc3JhdGUgPj0gMTAwMDAwMDApIHsKKwkJaWYgKHN0djA5MDBfY2hlY2tfdGltaW5nX2xvY2soaW50cCwgZCkgPT0gVFJVRSkgeworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1ESVNUQVRFLCAweDFmKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxNSk7CisJCQlsb2NrID0gc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpbnRwLCBkLCBkZW1vZF90aW1lb3V0KTsKKwkJfSBlbHNlCisJCQlsb2NrID0gRkFMU0U7CiAKLQkJCW5iX3N0ZXBzID0gKChzZWFyY2hfcmFuZ2UgLyAxMDAwKSAvIGN1cnJpZXJfc3RlcCk7Ci0JCQluYl9zdGVwcyAvPSAyOwotCQkJbmJfc3RlcHMgPSAoMiAqIChuYl9zdGVwcyArIDEpKTsKLQkJCWlmIChuYl9zdGVwcyA8IDApCi0JCQkJbmJfc3RlcHMgPSAyOwotCQkJZWxzZSBpZiAobmJfc3RlcHMgPiAxMikKLQkJCQluYl9zdGVwcyA9IDEyOworCQlyZXR1cm4gbG9jazsKKwl9CiAKLQkJCWN1cnJlbnRfc3RlcCA9IDE7Ci0JCQlkaXJlY3Rpb24gPSAxOworCWlmIChpbnRwLT5jaGlwX2lkIDw9IDB4MjApIHsKKwkJaWYgKHNyYXRlIDw9IDEwMDAwMDApCisJCQljdXJyaWVyX3N0ZXAgPSA1MDA7CisJCWVsc2UgaWYgKHNyYXRlIDw9IDQwMDAwMDApCisJCQljdXJyaWVyX3N0ZXAgPSAxMDAwOworCQllbHNlIGlmIChzcmF0ZSA8PSA3MDAwMDAwKQorCQkJY3Vycmllcl9zdGVwID0gMjAwMDsKKwkJZWxzZSBpZiAoc3JhdGUgPD0gMTAwMDAwMDApCisJCQljdXJyaWVyX3N0ZXAgPSAzMDAwOworCQllbHNlCisJCQljdXJyaWVyX3N0ZXAgPSA1MDAwOworCisJCWlmIChzcmF0ZSA+PSAyMDAwMDAwKSB7CiAJCQl0aW1lb3V0ID0gKGRlbW9kX3RpbWVvdXQgLyAzKTsKIAkJCWlmICh0aW1lb3V0ID4gMTAwMCkKIAkJCQl0aW1lb3V0ID0gMTAwMDsKKwkJfSBlbHNlCisJCQl0aW1lb3V0ID0gKGRlbW9kX3RpbWVvdXQgLyAyKTsKKwl9IGVsc2UgeworCQkvKmN1dCAzLjAgKi8KKwkJY3Vycmllcl9zdGVwID0gc3JhdGUgLyA0MDAwOworCQl0aW1lb3V0ID0gKGRlbW9kX3RpbWVvdXQgKiAzKSAvIDQ7CisJfQogCi0JCQlzd2l0Y2ggKGRlbW9kKSB7Ci0JCQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGxvY2sgPT0gRkFMU0UpIHsKLQkJCQkJdHVuZXJfZnJlcSA9IGlfcGFyYW1zLT50dW5lcjFfZnJlcTsKLQkJCQkJaV9wYXJhbXMtPnR1bmVyMV9idyA9IHN0djA5MDBfY2Fycmllcl93aWR0aChpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSwgaV9wYXJhbXMtPnJvbGxvZmYpICsgaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGU7CisJbmJfc3RlcHMgPSAoKHNlYXJjaF9yYW5nZSAvIDEwMDApIC8gY3Vycmllcl9zdGVwKTsKIAotCQkJCQl3aGlsZSAoKGN1cnJlbnRfc3RlcCA8PSBuYl9zdGVwcykgJiYgKGxvY2sgPT0gRkFMU0UpKSB7CisJaWYgKChuYl9zdGVwcyAlIDIpICE9IDApCisJCW5iX3N0ZXBzICs9IDE7CiAKLQkJCQkJCWlmIChkaXJlY3Rpb24gPiAwKQotCQkJCQkJCXR1bmVyX2ZyZXEgKz0gKGN1cnJlbnRfc3RlcCAqIGN1cnJpZXJfc3RlcCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdHVuZXJfZnJlcSAtPSAoY3VycmVudF9zdGVwICogY3Vycmllcl9zdGVwKTsKKwlpZiAobmJfc3RlcHMgPD0gMCkKKwkJbmJfc3RlcHMgPSAyOworCWVsc2UgaWYgKG5iX3N0ZXBzID4gMTIpCisJCW5iX3N0ZXBzID0gMTI7CiAKLQkJCQkJCXN0djA5MDBfc2V0X3R1bmVyKGZlLCB0dW5lcl9mcmVxLCBpX3BhcmFtcy0+dHVuZXIxX2J3KTsKLQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MUMpOwotCQkJCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQgPT0gU1RWMDkwMF9TRUFSQ0hfRFZCUzIpIHsKLQkJCQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RWQlMxX0VOQUJMRSwgMCk7Ci0JCQkJCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9EVkJTMl9FTkFCTEUsIDApOwotCQkJCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RWQlMyX0VOQUJMRSwgMSk7Ci0JCQkJCQl9CisJY3VycmVudF9zdGVwID0gMTsKKwlkaXJlY3Rpb24gPSAxOwogCi0JCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDEsIDApOwotCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQwLCAwKTsKLQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MUYpOwotCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxNSk7Ci0JCQkJCQlsb2NrID0gc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpX3BhcmFtcywgZGVtb2QsIHRpbWVvdXQpOwotCQkJCQkJZGlyZWN0aW9uICo9IC0xOwotCQkJCQkJY3VycmVudF9zdGVwKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCQlpZiAobG9jayA9PSBGQUxTRSkgewotCQkJCQl0dW5lcl9mcmVxID0gaV9wYXJhbXMtPnR1bmVyMl9mcmVxOwotCQkJCQlpX3BhcmFtcy0+dHVuZXIyX2J3ID0gc3R2MDkwMF9jYXJyaWVyX3dpZHRoKHNyYXRlLCBpX3BhcmFtcy0+cm9sbG9mZikgKyBzcmF0ZTsKKwlpZiAoaW50cC0+Y2hpcF9pZCA8PSAweDIwKSB7CisJCXR1bmVyX2ZyZXEgPSBpbnRwLT5mcmVxW2RdOworCQlpbnRwLT5id1tkXSA9IHN0djA5MDBfY2Fycmllcl93aWR0aChpbnRwLT5zeW1ib2xfcmF0ZVtkXSwKKwkJCQlpbnRwLT5yb2xsb2ZmKSArIGludHAtPnN5bWJvbF9yYXRlW2RdOworCX0gZWxzZQorCQl0dW5lcl9mcmVxID0gMDsKIAotCQkJCQl3aGlsZSAoKGN1cnJlbnRfc3RlcCA8PSBuYl9zdGVwcykgJiYgKGxvY2sgPT0gRkFMU0UpKSB7CisJd2hpbGUgKChjdXJyZW50X3N0ZXAgPD0gbmJfc3RlcHMpICYmIChsb2NrID09IEZBTFNFKSkgeworCQlpZiAoZGlyZWN0aW9uID4gMCkKKwkJCXR1bmVyX2ZyZXEgKz0gKGN1cnJlbnRfc3RlcCAqIGN1cnJpZXJfc3RlcCk7CisJCWVsc2UKKwkJCXR1bmVyX2ZyZXEgLT0gKGN1cnJlbnRfc3RlcCAqIGN1cnJpZXJfc3RlcCk7CiAKLQkJCQkJCWlmIChkaXJlY3Rpb24gPiAwKQotCQkJCQkJCXR1bmVyX2ZyZXEgKz0gKGN1cnJlbnRfc3RlcCAqIGN1cnJpZXJfc3RlcCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdHVuZXJfZnJlcSAtPSAoY3VycmVudF9zdGVwICogY3Vycmllcl9zdGVwKTsKLQotCQkJCQkJc3R2MDkwMF9zZXRfdHVuZXIoZmUsIHR1bmVyX2ZyZXEsIGlfcGFyYW1zLT50dW5lcjJfYncpOwotCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRElTVEFURSwgMHgxQyk7Ci0JCQkJCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9zdG5kcmQgPT0gU1RWMDkwMF9TRUFSQ0hfRFZCUzIpIHsKLQkJCQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0RWQlMxX0VOQUJMRSwgMCk7Ci0JCQkJCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMl9FTkFCTEUsIDApOwotCQkJCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0RWQlMyX0VOQUJMRSwgMSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMSwgMCk7Ci0JCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSSU5JVDAsIDApOwotCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRElTVEFURSwgMHgxRik7Ci0JCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1ESVNUQVRFLCAweDE1KTsKLQkJCQkJCWxvY2sgPSBzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgdGltZW91dCk7Ci0JCQkJCQlkaXJlY3Rpb24gKj0gLTE7Ci0JCQkJCQljdXJyZW50X3N0ZXArKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KKwkJaWYgKGludHAtPmNoaXBfaWQgPD0gMHgyMCkgeworCQkJc3R2MDkwMF9zZXRfdHVuZXIoZmUsIHR1bmVyX2ZyZXEsIGludHAtPmJ3W2RdKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxYyk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJJTklUMSwgMCk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJJTklUMCwgMCk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURJU1RBVEUsIDB4MWYpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1ESVNUQVRFLCAweDE1KTsKKwkJfSBlbHNlIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxYyk7CisJCQlmcmVxID0gKHR1bmVyX2ZyZXEgKiA2NTUzNikgLyAoaW50cC0+bWNsayAvIDEwMDApOworCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIENGUl9JTklUMSwgTVNCKGZyZXEpKTsKKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBDRlJfSU5JVDAsIExTQihmcmVxKSk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURJU1RBVEUsIDB4MWYpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1ESVNUQVRFLCAweDA1KTsKIAkJfQorCisJCWxvY2sgPSBzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGludHAsIGQsIHRpbWVvdXQpOworCQlkaXJlY3Rpb24gKj0gLTE7CisJCWN1cnJlbnRfc3RlcCsrOwogCX0KIAogCXJldHVybglsb2NrOwpAQCAtOTMxLDkgKzY2NSw3IEBACiAJCX0gZWxzZSBpZiAoc3JhdGUgPD0gMjAwMDAwMDApIHsKIAkJCSgqZGVtb2RfdGltZW91dCkgPSA0MDA7CiAJCQkoKmZlY190aW1lb3V0KSA9IDEzMDsKLQkJfQotCi0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJKCpkZW1vZF90aW1lb3V0KSA9IDMwMDsKIAkJCSgqZmVjX3RpbWVvdXQpID0gMTAwOwogCQl9CkBAIC05NDYsOTUgKzY3OCw3NyBAQAogCQkoKmRlbW9kX3RpbWVvdXQpIC89IDI7CiB9CiAKLXN0YXRpYyB2b2lkIHN0djA5MDBfc2V0X3ZpdGVyYmlfdHJhY3Eoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAorc3RhdGljIHZvaWQgc3R2MDkwMF9zZXRfdml0ZXJiaV90cmFjcShzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKIAotCXMzMiB2dGhfcmVnOworCXMzMiB2dGhfcmVnID0gVlRIMTI7CiAKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCi0JZG1kX3JlZyh2dGhfcmVnLCBSMDkwMF9QMV9WVEgxMiwgUjA5MDBfUDJfVlRIMTIpOwotCi0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHhkMCk7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHg3ZCk7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHg1Myk7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHgyRik7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHgyNCk7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHgxRik7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgdnRoX3JlZysrLCAweGQwKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCB2dGhfcmVnKyssIDB4N2QpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIHZ0aF9yZWcrKywgMHg1Myk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgdnRoX3JlZysrLCAweDJmKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCB2dGhfcmVnKyssIDB4MjQpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIHZ0aF9yZWcrKywgMHgxZik7CiB9CiAKLXN0YXRpYyB2b2lkIHN0djA5MDBfc2V0X3ZpdGVyYmlfc3RhbmRhcmQoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAotCQkJCSAgIGVudW0gZmVfc3R2MDkwMF9zZWFyY2hfc3RhbmRhcmQgU3RhbmRhcmQsCi0JCQkJICAgZW51bSBmZV9zdHYwOTAwX2ZlYyBQdW5jdHVyZVJhdGUsCitzdGF0aWMgdm9pZCBzdHYwOTAwX3NldF92aXRlcmJpX3N0YW5kYXJkKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAorCQkJCSAgIGVudW0gZmVfc3R2MDkwMF9zZWFyY2hfc3RhbmRhcmQgc3RhbmRhcmQsCisJCQkJICAgZW51bSBmZV9zdHYwOTAwX2ZlYyBmZWMsCiAJCQkJICAgZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKKwlkcHJpbnRrKCIlczogVml0ZXJiaVN0YW5kYXJkID0gIiwgX19mdW5jX18pOwogCi0JczMyIGZlY21SZWcsCi0JcHJ2aXRSZWc7Ci0KLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFZpdGVyYmlTdGFuZGFyZCA9ICIsIF9fZnVuY19fKTsKLQotCXN3aXRjaCAoZGVtb2QpIHsKLQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQlkZWZhdWx0OgotCQlmZWNtUmVnID0gUjA5MDBfUDFfRkVDTTsKLQkJcHJ2aXRSZWcgPSBSMDkwMF9QMV9QUlZJVDsKLQkJYnJlYWs7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzI6Ci0JCWZlY21SZWcgPSBSMDkwMF9QMl9GRUNNOwotCQlwcnZpdFJlZyA9IFIwOTAwX1AyX1BSVklUOwotCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2ggKFN0YW5kYXJkKSB7CisJc3dpdGNoIChzdGFuZGFyZCkgewogCWNhc2UgU1RWMDkwMF9BVVRPX1NFQVJDSDoKIAkJZHByaW50aygiQXV0b1xuIik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBmZWNtUmVnLCAweDEwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHBydml0UmVnLCAweDNGKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRkVDTSwgMHgxMCk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFBSVklULCAweDNmKTsKIAkJYnJlYWs7CiAJY2FzZSBTVFYwOTAwX1NFQVJDSF9EVkJTMToKIAkJZHByaW50aygiRFZCUzFcbiIpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgZmVjbVJlZywgMHgwMCk7Ci0JCXN3aXRjaCAoUHVuY3R1cmVSYXRlKSB7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEZFQ00sIDB4MDApOworCQlzd2l0Y2ggKGZlYykgewogCQljYXNlIFNUVjA5MDBfRkVDX1VOS05PV046CiAJCWRlZmF1bHQ6Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgcHJ2aXRSZWcsIDB4MkYpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUFJWSVQsIDB4MmYpOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RWMDkwMF9GRUNfMV8yOgotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHBydml0UmVnLCAweDAxKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFBSVklULCAweDAxKTsKIAkJCWJyZWFrOwogCQljYXNlIFNUVjA5MDBfRkVDXzJfMzoKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBwcnZpdFJlZywgMHgwMik7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBQUlZJVCwgMHgwMik7CiAJCQlicmVhazsKIAkJY2FzZSBTVFYwOTAwX0ZFQ18zXzQ6Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgcHJ2aXRSZWcsIDB4MDQpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUFJWSVQsIDB4MDQpOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RWMDkwMF9GRUNfNV82OgotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHBydml0UmVnLCAweDA4KTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFBSVklULCAweDA4KTsKIAkJCWJyZWFrOwogCQljYXNlIFNUVjA5MDBfRkVDXzdfODoKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBwcnZpdFJlZywgMHgyMCk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBQUlZJVCwgMHgyMCk7CiAJCQlicmVhazsKIAkJfQogCiAJCWJyZWFrOwogCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFNTOgogCQlkcHJpbnRrKCJEU1NcbiIpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgZmVjbVJlZywgMHg4MCk7Ci0JCXN3aXRjaCAoUHVuY3R1cmVSYXRlKSB7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEZFQ00sIDB4ODApOworCQlzd2l0Y2ggKGZlYykgewogCQljYXNlIFNUVjA5MDBfRkVDX1VOS05PV046CiAJCWRlZmF1bHQ6Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgcHJ2aXRSZWcsIDB4MTMpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUFJWSVQsIDB4MTMpOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RWMDkwMF9GRUNfMV8yOgotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHBydml0UmVnLCAweDAxKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFBSVklULCAweDAxKTsKIAkJCWJyZWFrOwogCQljYXNlIFNUVjA5MDBfRkVDXzJfMzoKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBwcnZpdFJlZywgMHgwMik7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBQUlZJVCwgMHgwMik7CiAJCQlicmVhazsKIAkJY2FzZSBTVFYwOTAwX0ZFQ182Xzc6Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgcHJ2aXRSZWcsIDB4MTApOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgUFJWSVQsIDB4MTApOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMDQzLDQ5NSArNzU3LDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzdHYwOTAwX3RyYWNrX29wdGltaXphdGlvbihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3Qgc3R2MDkwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMgPSBzdGF0ZS0+aW50ZXJuYWw7Ci0JZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCA9IHN0YXRlLT5kZW1vZDsKLQotCXMzMiBzcmF0ZSwgcGlsb3RzLCBhY2xjLCBmcmVxMSwgZnJlcTAsCi0JCWkgPSAwLCB0aW1lZCwgdGltZWYsIGJsaW5kVHVuU3cgPSAwOwotCi0JZW51bSBmZV9zdHYwOTAwX3JvbGxvZmYgcm9sbG9mZjsKLQllbnVtIGZlX3N0djA5MDBfbW9kY29kZSBmb3VuZE1vZGNvZDsKLQotCWRwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgX19mdW5jX18pOwotCi0Jc3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGRlbW9kKTsKLQlzcmF0ZSArPSBzdHYwOTAwX2dldF90aW1pbmdfb2Zmc3QoaV9wYXJhbXMsIHNyYXRlLCBkZW1vZCk7Ci0KLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3dpdGNoIChpX3BhcmFtcy0+ZG1kMV9yc2x0cy5zdGFuZGFyZCkgewotCQljYXNlIFNUVjA5MDBfRFZCUzFfU1RBTkRBUkQ6Ci0JCQlpZiAoaV9wYXJhbXMtPmRtZDFfc3JjaF9zdGFuZGFyZCA9PSBTVFYwOTAwX0FVVE9fU0VBUkNIKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9EVkJTMV9FTkFCTEUsIDEpOwotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzJfRU5BQkxFLCAwKTsKLQkJCX0KLQotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9ST0xMT0ZGX0NPTlRST0wsIGlfcGFyYW1zLT5yb2xsb2ZmKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfTUFOVUFMX1JPTExPRkYsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0VSUkNUUkwxLCAweDc1KTsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfRFNTX1NUQU5EQVJEOgotCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQgPT0gU1RWMDkwMF9BVVRPX1NFQVJDSCkgewotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RWQlMyX0VOQUJMRSwgMCk7Ci0JCQl9Ci0KLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfUk9MTE9GRl9DT05UUk9MLCBpX3BhcmFtcy0+cm9sbG9mZik7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX01BTlVBTF9ST0xMT0ZGLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9FUlJDVFJMMSwgMHg3NSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0RWQlMyX1NUQU5EQVJEOgotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9EVkJTMV9FTkFCTEUsIDApOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9EVkJTMl9FTkFCTEUsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FDTEMsIDApOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0JDTEMsIDApOwotCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3JzbHRzLmZyYW1lX2xlbmd0aCA9PSBTVFYwOTAwX0xPTkdfRlJBTUUpIHsKLQkJCQlmb3VuZE1vZGNvZCA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RFTU9EX01PRENPRCk7Ci0JCQkJcGlsb3RzID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfREVNT0RfVFlQRSkgJiAweDAxOwotCQkJCWFjbGMgPSBzdHYwOTAwX2dldF9vcHRpbV9jYXJyX2xvb3Aoc3JhdGUsIGZvdW5kTW9kY29kLCBwaWxvdHMsIGlfcGFyYW1zLT5jaGlwX2lkKTsKLQkJCQlpZiAoZm91bmRNb2Rjb2QgPD0gU1RWMDkwMF9RUFNLXzkxMCkKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FDTEMyUzJRLCBhY2xjKTsKLQkJCQllbHNlIGlmIChmb3VuZE1vZGNvZCA8PSBTVFYwOTAwXzhQU0tfOTEwKSB7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyOCwgYWNsYyk7Ci0JCQkJfQotCi0JCQkJaWYgKChpX3BhcmFtcy0+ZGVtb2RfbW9kZSA9PSBTVFYwOTAwX1NJTkdMRSkgJiYgKGZvdW5kTW9kY29kID4gU1RWMDkwMF84UFNLXzkxMCkpIHsKLQkJCQkJaWYgKGZvdW5kTW9kY29kIDw9IFNUVjA5MDBfMTZBUFNLXzkxMCkgewotCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FDTEMyUzJRLCAweDJhKTsKLQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyMTZBLCBhY2xjKTsKLQkJCQkJfSBlbHNlIGlmIChmb3VuZE1vZGNvZCA8PSBTVFYwOTAwXzMyQVBTS185MTApIHsKLQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQUNMQzJTMjMyQSwgYWNsYyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJYWNsYyA9IHN0djA5MDBfZ2V0X29wdGltX3Nob3J0X2NhcnJfbG9vcChzcmF0ZSwgaV9wYXJhbXMtPmRtZDFfcnNsdHMubW9kdWxhdGlvbiwgaV9wYXJhbXMtPmNoaXBfaWQpOwotCQkJCWlmIChpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2R1bGF0aW9uID09IFNUVjA5MDBfUVBTSykKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FDTEMyUzJRLCBhY2xjKTsKLQotCQkJCWVsc2UgaWYgKGlfcGFyYW1zLT5kbWQxX3JzbHRzLm1vZHVsYXRpb24gPT0gU1RWMDkwMF84UFNLKSB7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyOCwgYWNsYyk7Ci0JCQkJfSBlbHNlIGlmIChpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2R1bGF0aW9uID09IFNUVjA5MDBfMTZBUFNLKSB7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDMlMyMTZBLCBhY2xjKTsKLQkJCQl9IGVsc2UgaWYgKGlfcGFyYW1zLT5kbWQxX3JzbHRzLm1vZHVsYXRpb24gPT0gU1RWMDkwMF8zMkFQU0spIHsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FDTEMyUzJRLCAweDJhKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FDTEMyUzIzMkEsIGFjbGMpOwotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPD0gMHgxMSkgewotCQkJCWlmIChpX3BhcmFtcy0+ZGVtb2RfbW9kZSAhPSBTVFYwOTAwX1NJTkdMRSkKLQkJCQkJc3R2MDkwMF9hY3RpdmF0ZV9zMl9tb2Rjb2RlKGlfcGFyYW1zLCBkZW1vZCk7Ci0KLQkJCX0KLQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0VSUkNUUkwxLCAweDY3KTsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfVU5LTk9XTl9TVEFOREFSRDoKLQkJZGVmYXVsdDoKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzJfRU5BQkxFLCAxKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZnJlcTEgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DRlIyKTsKLQkJZnJlcTAgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DRlIxKTsKLQkJcm9sbG9mZiA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1JPTExPRkZfU1RBVFVTKTsKLQkJaWYgKGlfcGFyYW1zLT5kbWQxX3NyY2hfYWxnbyA9PSBTVFYwOTAwX0JMSU5EX1NFQVJDSCkgewotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUlNURVAsIDB4MDApOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9TQ0FOX0VOQUJMRSwgMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0NGUl9BVVRPU0NBTiwgMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVE1HQ0ZHMiwgMHgwMSk7Ci0JCQlzdHYwOTAwX3NldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIHNyYXRlLCBkZW1vZCk7Ci0JCQlzdHYwOTAwX3NldF9tYXhfc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCBzcmF0ZSwgZGVtb2QpOwotCQkJc3R2MDkwMF9zZXRfbWluX3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgc3JhdGUsIGRlbW9kKTsKLQkJCWJsaW5kVHVuU3cgPSAxOwotCQl9Ci0KLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApIHsKLQkJCWlmICgoaV9wYXJhbXMtPmRtZDFfc3JjaF9zdGFuZGFyZCA9PSBTVFYwOTAwX1NFQVJDSF9EVkJTMSkgfHwgKGlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQgPT0gU1RWMDkwMF9TRUFSQ0hfRFNTKSB8fCAoaV9wYXJhbXMtPmRtZDFfc3JjaF9zdGFuZGFyZCA9PSBTVFYwOTAwX0FVVE9fU0VBUkNIKSkgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9WQVZTUlZJVCwgMHgwYSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1ZJVFNDQUxFLCAweDApOwotCQkJfQotCQl9Ci0KLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkIDwgMHgyMCkKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJIRFIsIDB4MDgpOwotCi0JCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA9PSAweDEwKQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NPUlJFTEVYUCwgMHgwQSk7Ci0KLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FHQzJSRUYsIDB4MzgpOwotCi0JCWlmICgoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgfHwgKGJsaW5kVHVuU3cgPT0gMSkgfHwgKGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlIDwgMTAwMDAwMDApKSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDEsIGZyZXExKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DRlJJTklUMCwgZnJlcTApOwotCQkJaV9wYXJhbXMtPnR1bmVyMV9idyA9IHN0djA5MDBfY2Fycmllcl93aWR0aChzcmF0ZSwgaV9wYXJhbXMtPnJvbGxvZmYpICsgMTAwMDAwMDA7Ci0KLQkJCWlmICgoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgfHwgKGJsaW5kVHVuU3cgPT0gMSkpIHsKLQkJCQlpZiAoaV9wYXJhbXMtPmRtZDFfc3JjaF9hbGdvICE9IFNUVjA5MDBfV0FSTV9TVEFSVCkKLQkJCQkJc3R2MDkwMF9zZXRfYmFuZHdpZHRoKGZlLCBpX3BhcmFtcy0+dHVuZXIxX2J3KTsKLQkJCX0KLQotCQkJaWYgKChpX3BhcmFtcy0+ZG1kMV9zcmNoX2FsZ28gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpIHx8IChpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSA8IDEwMDAwMDAwKSkKLQkJCQltc2xlZXAoNTApOwotCQkJZWxzZQotCQkJCW1zbGVlcCg1KTsKLQotCQkJc3R2MDkwMF9nZXRfbG9ja190aW1lb3V0KCZ0aW1lZCwgJnRpbWVmLCBzcmF0ZSwgU1RWMDkwMF9XQVJNX1NUQVJUKTsKLQotCQkJaWYgKHN0djA5MDBfZ2V0X2RlbW9kX2xvY2soaV9wYXJhbXMsIGRlbW9kLCB0aW1lZCAvIDIpID09IEZBTFNFKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxRik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQxLCBmcmVxMSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQwLCBmcmVxMCk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxOCk7Ci0JCQkJaSA9IDA7Ci0JCQkJd2hpbGUgKChzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgdGltZWQgLyAyKSA9PSBGQUxTRSkgJiYgKGkgPD0gMikpIHsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxRik7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DRlJJTklUMSwgZnJlcTEpOwotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDAsIGZyZXEwKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRElTVEFURSwgMHgxOCk7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA+PSAweDIwKQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NBUkZSRVEsIDB4NDkpOwotCi0JCWlmICgoaV9wYXJhbXMtPmRtZDFfcnNsdHMuc3RhbmRhcmQgPT0gU1RWMDkwMF9EVkJTMV9TVEFOREFSRCkgfHwgKGlfcGFyYW1zLT5kbWQxX3JzbHRzLnN0YW5kYXJkID09IFNUVjA5MDBfRFNTX1NUQU5EQVJEKSkKLQkJCXN0djA5MDBfc2V0X3ZpdGVyYmlfdHJhY3EoaV9wYXJhbXMsIGRlbW9kKTsKLQotCQlicmVhazsKLQotCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQlzd2l0Y2ggKGlfcGFyYW1zLT5kbWQyX3JzbHRzLnN0YW5kYXJkKSB7Ci0JCWNhc2UgU1RWMDkwMF9EVkJTMV9TVEFOREFSRDoKLQotCQkJaWYgKGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkID09IFNUVjA5MDBfQVVUT19TRUFSQ0gpIHsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0RWQlMxX0VOQUJMRSwgMSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMl9FTkFCTEUsIDApOwotCQkJfQotCi0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1JPTExPRkZfQ09OVFJPTCwgaV9wYXJhbXMtPnJvbGxvZmYpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9NQU5VQUxfUk9MTE9GRiwgMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRVJSQ1RSTDEsIDB4NzUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1RWMDkwMF9EU1NfU1RBTkRBUkQ6Ci0JCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9zdG5kcmQgPT0gU1RWMDkwMF9BVVRPX1NFQVJDSCkgewotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0RWQlMyX0VOQUJMRSwgMCk7Ci0JCQl9Ci0KLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfUk9MTE9GRl9DT05UUk9MLCBpX3BhcmFtcy0+cm9sbG9mZik7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX01BTlVBTF9ST0xMT0ZGLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9FUlJDVFJMMSwgMHg3NSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0RWQlMyX1NUQU5EQVJEOgotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMV9FTkFCTEUsIDApOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMl9FTkFCTEUsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FDTEMsIDApOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0JDTEMsIDApOwotCQkJaWYgKGlfcGFyYW1zLT5kbWQyX3JzbHRzLmZyYW1lX2xlbmd0aCA9PSBTVFYwOTAwX0xPTkdfRlJBTUUpIHsKLQkJCQlmb3VuZE1vZGNvZCA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0RFTU9EX01PRENPRCk7Ci0JCQkJcGlsb3RzID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfREVNT0RfVFlQRSkgJiAweDAxOwotCQkJCWFjbGMgPSBzdHYwOTAwX2dldF9vcHRpbV9jYXJyX2xvb3Aoc3JhdGUsIGZvdW5kTW9kY29kLCBwaWxvdHMsIGlfcGFyYW1zLT5jaGlwX2lkKTsKLQkJCQlpZiAoZm91bmRNb2Rjb2QgPD0gU1RWMDkwMF9RUFNLXzkxMCkKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FDTEMyUzJRLCBhY2xjKTsKLQkJCQllbHNlIGlmIChmb3VuZE1vZGNvZCA8PSBTVFYwOTAwXzhQU0tfOTEwKSB7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyOCwgYWNsYyk7Ci0JCQkJfQotCi0JCQkJaWYgKChpX3BhcmFtcy0+ZGVtb2RfbW9kZSA9PSBTVFYwOTAwX1NJTkdMRSkgJiYgKGZvdW5kTW9kY29kID4gU1RWMDkwMF84UFNLXzkxMCkpIHsKLQkJCQkJaWYgKGZvdW5kTW9kY29kIDw9IFNUVjA5MDBfMTZBUFNLXzkxMCkgewotCQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FDTEMyUzJRLCAweDJhKTsKLQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyMTZBLCBhY2xjKTsKLQkJCQkJfSBlbHNlIGlmIChmb3VuZE1vZGNvZCA8PSBTVFYwOTAwXzMyQVBTS185MTApIHsKLQkJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQUNMQzJTMjMyQSwgYWNsYyk7Ci0JCQkJCX0KLQotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlhY2xjID0gc3R2MDkwMF9nZXRfb3B0aW1fc2hvcnRfY2Fycl9sb29wKHNyYXRlLAotCQkJCQkJCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMubW9kdWxhdGlvbiwKLQkJCQkJCQkJCWlfcGFyYW1zLT5jaGlwX2lkKTsKLQotCQkJCWlmIChpX3BhcmFtcy0+ZG1kMl9yc2x0cy5tb2R1bGF0aW9uID09IFNUVjA5MDBfUVBTSykKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FDTEMyUzJRLCBhY2xjKTsKLQotCQkJCWVsc2UgaWYgKGlfcGFyYW1zLT5kbWQyX3JzbHRzLm1vZHVsYXRpb24gPT0gU1RWMDkwMF84UFNLKSB7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyOCwgYWNsYyk7Ci0JCQkJfSBlbHNlIGlmIChpX3BhcmFtcy0+ZG1kMl9yc2x0cy5tb2R1bGF0aW9uID09IFNUVjA5MDBfMTZBUFNLKSB7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyUSwgMHgyYSk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDMlMyMTZBLCBhY2xjKTsKLQkJCQl9IGVsc2UgaWYgKGlfcGFyYW1zLT5kbWQyX3JzbHRzLm1vZHVsYXRpb24gPT0gU1RWMDkwMF8zMkFQU0spIHsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FDTEMyUzJRLCAweDJhKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FDTEMyUzIzMkEsIGFjbGMpOwotCQkJCX0KLQkJCX0KLQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0VSUkNUUkwxLCAweDY3KTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgU1RWMDkwMF9VTktOT1dOX1NUQU5EQVJEOgotCQlkZWZhdWx0OgotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMV9FTkFCTEUsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMl9FTkFCTEUsIDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlmcmVxMSA9IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUjIpOwotCQlmcmVxMCA9IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUjEpOwotCQlyb2xsb2ZmID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfUk9MTE9GRl9TVEFUVVMpOwotCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSU1RFUCwgMHgwMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1NDQU5fRU5BQkxFLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfQ0ZSX0FVVE9TQ0FOLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTUdDRkcyLCAweDAxKTsKLQkJCXN0djA5MDBfc2V0X3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgc3JhdGUsIGRlbW9kKTsKLQkJCXN0djA5MDBfc2V0X21heF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIHNyYXRlLCBkZW1vZCk7Ci0JCQlzdHYwOTAwX3NldF9taW5fc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCBzcmF0ZSwgZGVtb2QpOwotCQkJYmxpbmRUdW5TdyA9IDE7Ci0JCX0KLQotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJaWYgKChpX3BhcmFtcy0+ZG1kMl9zcmNoX3N0bmRyZCA9PSBTVFYwOTAwX1NFQVJDSF9EVkJTMSkgfHwgKGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkID09IFNUVjA5MDBfU0VBUkNIX0RTUykgfHwgKGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkID09IFNUVjA5MDBfQVVUT19TRUFSQ0gpKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1ZBVlNSVklULCAweDBhKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVklUU0NBTEUsIDB4MCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPCAweDIwKQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkhEUiwgMHgwOCk7Ci0KLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID09IDB4MTApCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ09SUkVMRVhQLCAweDBhKTsKLQotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQUdDMlJFRiwgMHgzOCk7Ci0JCWlmICgoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgfHwgKGJsaW5kVHVuU3cgPT0gMSkgfHwgKGlfcGFyYW1zLT5kbWQyX3N5bWJvbF9yYXRlIDwgMTAwMDAwMDApKSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSSU5JVDEsIGZyZXExKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMCwgZnJlcTApOwotCQkJaV9wYXJhbXMtPnR1bmVyMl9idyA9IHN0djA5MDBfY2Fycmllcl93aWR0aChzcmF0ZSwgaV9wYXJhbXMtPnJvbGxvZmYpICsgMTAwMDAwMDA7Ci0KLQkJCWlmICgoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgfHwgKGJsaW5kVHVuU3cgPT0gMSkpIHsKLQkJCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvICE9IFNUVjA5MDBfV0FSTV9TVEFSVCkKLQkJCQkJc3R2MDkwMF9zZXRfYmFuZHdpZHRoKGZlLCBpX3BhcmFtcy0+dHVuZXIyX2J3KTsKLQkJCX0KLQotCQkJaWYgKChpX3BhcmFtcy0+ZG1kMl9zcmNoX2FsZ28gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpIHx8IChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA8IDEwMDAwMDAwKSkKLQkJCQltc2xlZXAoNTApOwotCQkJZWxzZQotCQkJCW1zbGVlcCg1KTsKLQotCQkJc3R2MDkwMF9nZXRfbG9ja190aW1lb3V0KCZ0aW1lZCwgJnRpbWVmLCBzcmF0ZSwgU1RWMDkwMF9XQVJNX1NUQVJUKTsKLQkJCWlmIChzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgdGltZWQgLyAyKSA9PSBGQUxTRSkgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MUYpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMSwgZnJlcTEpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMCwgZnJlcTApOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MTgpOwotCQkJCWkgPSAwOwotCQkJCXdoaWxlICgoc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpX3BhcmFtcywgZGVtb2QsIHRpbWVkIC8gMikgPT0gRkFMU0UpICYmIChpIDw9IDIpKSB7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MUYpOwotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSSU5JVDEsIGZyZXExKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUklOSVQwLCBmcmVxMCk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MTgpOwotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0FSRlJFUSwgMHg0OSk7Ci0KLQkJaWYgKChpX3BhcmFtcy0+ZG1kMl9yc2x0cy5zdGFuZGFyZCA9PSBTVFYwOTAwX0RWQlMxX1NUQU5EQVJEKSB8fCAoaV9wYXJhbXMtPmRtZDJfcnNsdHMuc3RhbmRhcmQgPT0gU1RWMDkwMF9EU1NfU1RBTkRBUkQpKQotCQkJc3R2MDkwMF9zZXRfdml0ZXJiaV90cmFjcShpX3BhcmFtcywgZGVtb2QpOwotCi0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBzdHYwOTAwX2dldF9mZWNfbG9jayhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsIGVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QsIHMzMiB0aW1lX291dCkKLXsKLQlzMzIgdGltZXIgPSAwLCBsb2NrID0gMCwgaGVhZGVyX2ZpZWxkLCBwa3RkZWxpbl9maWVsZCwgbG9ja192aXRfZmllbGQ7Ci0KLQllbnVtIGZlX3N0djA5MDBfc2VhcmNoX3N0YXRlIGRtZF9zdGF0ZTsKLQotCWRwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgX19mdW5jX18pOwotCi0JZG1kX3JlZyhoZWFkZXJfZmllbGQsIEYwOTAwX1AxX0hFQURFUl9NT0RFLCBGMDkwMF9QMl9IRUFERVJfTU9ERSk7Ci0JZG1kX3JlZyhwa3RkZWxpbl9maWVsZCwgRjA5MDBfUDFfUEtUREVMSU5fTE9DSywgRjA5MDBfUDJfUEtUREVMSU5fTE9DSyk7Ci0JZG1kX3JlZyhsb2NrX3ZpdF9maWVsZCwgRjA5MDBfUDFfTE9DS0VEVklULCBGMDkwMF9QMl9MT0NLRURWSVQpOwotCi0JZG1kX3N0YXRlID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgaGVhZGVyX2ZpZWxkKTsKLQotCXdoaWxlICgodGltZXIgPCB0aW1lX291dCkgJiYgKGxvY2sgPT0gMCkpIHsKLQkJc3dpdGNoIChkbWRfc3RhdGUpIHsKLQkJY2FzZSBTVFYwOTAwX1NFQVJDSDoKLQkJY2FzZSBTVFYwOTAwX1BMSF9ERVRFQ1RFRDoKLQkJZGVmYXVsdDoKLQkJCWxvY2sgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1RWMDkwMF9EVkJTMl9GT1VORDoKLQkJCWxvY2sgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBwa3RkZWxpbl9maWVsZCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0RWQlNfRk9VTkQ6Ci0JCQlsb2NrID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgbG9ja192aXRfZmllbGQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAobG9jayA9PSAwKSB7Ci0JCQltc2xlZXAoMTApOwotCQkJdGltZXIgKz0gMTA7Ci0JCX0KLQl9Ci0KLQlpZiAobG9jaykKLQkJZHByaW50aygiREVNT0QgRkVDIExPQ0sgT0tcbiIpOwotCWVsc2UKLQkJZHByaW50aygiREVNT0QgRkVDIExPQ0sgRkFJTFxuIik7Ci0KLQlyZXR1cm4gbG9jazsKLX0KLQotc3RhdGljIGludCBzdHYwOTAwX3dhaXRfZm9yX2xvY2soc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zLAotCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QsCi0JCQkJczMyIGRtZF90aW1lb3V0LCBzMzIgZmVjX3RpbWVvdXQpCi17Ci0KLQlzMzIgdGltZXIgPSAwLCBsb2NrID0gMCwgc3RyX21lcmdfcnN0X2ZsZCwgc3RyX21lcmdfbG9ja19mbGQ7Ci0KLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKLQotCWRtZF9yZWcoc3RyX21lcmdfcnN0X2ZsZCwgRjA5MDBfUDFfUlNUX0hXQVJFLCBGMDkwMF9QMl9SU1RfSFdBUkUpOwotCWRtZF9yZWcoc3RyX21lcmdfbG9ja19mbGQsIEYwOTAwX1AxX1RTRklGT19MSU5FT0ssIEYwOTAwX1AyX1RTRklGT19MSU5FT0spOwotCi0JbG9jayA9IHN0djA5MDBfZ2V0X2RlbW9kX2xvY2soaV9wYXJhbXMsIGRlbW9kLCBkbWRfdGltZW91dCk7Ci0KLQlpZiAobG9jaykKLQkJbG9jayA9IGxvY2sgJiYgc3R2MDkwMF9nZXRfZmVjX2xvY2soaV9wYXJhbXMsIGRlbW9kLCBmZWNfdGltZW91dCk7Ci0KLQlpZiAobG9jaykgewotCQlsb2NrID0gMDsKLQotCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRpbWVyID0gJWQsIHRpbWVfb3V0ID0gJWRcbiIsIF9fZnVuY19fLCB0aW1lciwgZmVjX3RpbWVvdXQpOwotCi0JCXdoaWxlICgodGltZXIgPCBmZWNfdGltZW91dCkgJiYgKGxvY2sgPT0gMCkpIHsKLQkJCWxvY2sgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBzdHJfbWVyZ19sb2NrX2ZsZCk7Ci0JCQltc2xlZXAoMSk7Ci0JCQl0aW1lcisrOwotCQl9Ci0JfQotCi0JaWYgKGxvY2spCi0JCWRwcmludGsoS0VSTl9JTkZPICIlczogREVNT0QgTE9DSyBPS1xuIiwgX19mdW5jX18pOwotCWVsc2UKLQkJZHByaW50ayhLRVJOX0lORk8gIiVzOiBERU1PRCBMT0NLIEZBSUxcbiIsIF9fZnVuY19fKTsKLQotCWlmIChsb2NrKQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLX0KLQotZW51bSBmZV9zdHYwOTAwX3RyYWNraW5nX3N0YW5kYXJkIHN0djA5MDBfZ2V0X3N0YW5kYXJkKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorc3RhdGljIGVudW0gZmVfc3R2MDkwMF9mZWMgc3R2MDkwMF9nZXRfdml0X2ZlYyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7Ci0Jc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Jc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zID0gc3RhdGUtPmludGVybmFsOwotCWVudW0gZmVfc3R2MDkwMF90cmFja2luZ19zdGFuZGFyZCBmbmRfc3RhbmRhcmQ7Ci0JczMyIHN0YXRlX2ZpZWxkLAotCWRzc19kdmJfZmllbGQ7Ci0KLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKLQotCWRtZF9yZWcoc3RhdGVfZmllbGQsIEYwOTAwX1AxX0hFQURFUl9NT0RFLCBGMDkwMF9QMl9IRUFERVJfTU9ERSk7Ci0JZG1kX3JlZyhkc3NfZHZiX2ZpZWxkLCBGMDkwMF9QMV9EU1NfRFZCLCBGMDkwMF9QMl9EU1NfRFZCKTsKLQotCWlmIChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBzdGF0ZV9maWVsZCkgPT0gMikKLQkJZm5kX3N0YW5kYXJkID0gU1RWMDkwMF9EVkJTMl9TVEFOREFSRDsKLQotCWVsc2UgaWYgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIHN0YXRlX2ZpZWxkKSA9PSAzKSB7Ci0JCWlmIChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBkc3NfZHZiX2ZpZWxkKSA9PSAxKQotCQkJZm5kX3N0YW5kYXJkID0gU1RWMDkwMF9EU1NfU1RBTkRBUkQ7Ci0JCWVsc2UKLQkJCWZuZF9zdGFuZGFyZCA9IFNUVjA5MDBfRFZCUzFfU1RBTkRBUkQ7Ci0JfSBlbHNlCi0JCWZuZF9zdGFuZGFyZCA9IFNUVjA5MDBfVU5LTk9XTl9TVEFOREFSRDsKLQotCXJldHVybiBmbmRfc3RhbmRhcmQ7Ci19Ci0KLXN0YXRpYyBzMzIgc3R2MDkwMF9nZXRfY2Fycl9mcmVxKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywgdTMyIG1jbGssCi0JCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCi17Ci0JczMyIGNmcl9maWVsZDIsIGNmcl9maWVsZDEsIGNmcl9maWVsZDAsCi0JCWRlcm90LCByZW0xLCByZW0yLCBpbnR2YWwxLCBpbnR2YWwyOwotCi0JZG1kX3JlZyhjZnJfZmllbGQyLCBGMDkwMF9QMV9DQVJfRlJFUTIsIEYwOTAwX1AyX0NBUl9GUkVRMik7Ci0JZG1kX3JlZyhjZnJfZmllbGQxLCBGMDkwMF9QMV9DQVJfRlJFUTEsIEYwOTAwX1AyX0NBUl9GUkVRMSk7Ci0JZG1kX3JlZyhjZnJfZmllbGQwLCBGMDkwMF9QMV9DQVJfRlJFUTAsIEYwOTAwX1AyX0NBUl9GUkVRMCk7Ci0KLQlkZXJvdCA9IChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBjZnJfZmllbGQyKSA8PCAxNikgKwotCQkoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgY2ZyX2ZpZWxkMSkgPDwgOCkgKwotCQkoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgY2ZyX2ZpZWxkMCkpOwotCi0JZGVyb3QgPSBnZTJjb21wKGRlcm90LCAyNCk7Ci0JaW50dmFsMSA9IG1jbGsgPj4gMTI7Ci0JaW50dmFsMiA9IGRlcm90ID4+IDEyOwotCXJlbTEgPSBtY2xrICUgMHgxMDAwOwotCXJlbTIgPSBkZXJvdCAlIDB4MTAwMDsKLQlkZXJvdCA9IChpbnR2YWwxICogaW50dmFsMikgKwotCQkoKGludHZhbDEgKiByZW0yKSA+PiAxMikgKwotCQkoKGludHZhbDIgKiByZW0xKSA+PiAxMik7Ci0KLQlyZXR1cm4gZGVyb3Q7Ci19Ci0KLXN0YXRpYyB1MzIgc3R2MDkwMF9nZXRfdHVuZXJfZnJlcShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcwkqZnJvbnRlbmRfb3BzID0gTlVMTDsKLQlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqdHVuZXJfb3BzID0gTlVMTDsKLQl1MzIgZnJlcXVlbmN5ID0gMDsKLQotCWlmICgmZmUtPm9wcykKLQkJZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7Ci0KLQlpZiAoJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzKQotCQl0dW5lcl9vcHMgPSAmZnJvbnRlbmRfb3BzLT50dW5lcl9vcHM7Ci0KLQlpZiAodHVuZXJfb3BzLT5nZXRfZnJlcXVlbmN5KSB7Ci0JCWlmICgodHVuZXJfb3BzLT5nZXRfZnJlcXVlbmN5KGZlLCAmZnJlcXVlbmN5KSkgPCAwKQotCQkJZHByaW50aygiJXM6IEludmFsaWQgcGFyYW1ldGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCWVsc2UKLQkJCWRwcmludGsoIiVzOiBGcmVxdWVuY3k9JWRcbiIsIF9fZnVuY19fLCBmcmVxdWVuY3kpOwotCi0JfQotCi0JcmV0dXJuIGZyZXF1ZW5jeTsKLX0KLQotc3RhdGljIGVudW0gZmVfc3R2MDkwMF9mZWMgc3R2MDkwMF9nZXRfdml0X2ZlYyhzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCi0JCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQotewotCXMzMiByYXRlX2ZsZCwgdml0X2N1cnB1bl9mbGQ7CiAJZW51bSBmZV9zdHYwOTAwX2ZlYyBwcmF0ZTsKLQotCWRtZF9yZWcodml0X2N1cnB1bl9mbGQsIEYwOTAwX1AxX1ZJVF9DVVJQVU4sIEYwOTAwX1AyX1ZJVF9DVVJQVU4pOwotCXJhdGVfZmxkID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgdml0X2N1cnB1bl9mbGQpOworCXMzMiByYXRlX2ZsZCA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgVklUX0NVUlBVTik7CiAKIAlzd2l0Y2ggKHJhdGVfZmxkKSB7CiAJY2FzZSAxMzoKQEAgLTE1NjAsMjU4ICs3OTAsNTMyIEBACiAJcmV0dXJuIHByYXRlOwogfQogCi1zdGF0aWMgZW51bSBmZV9zdHYwOTAwX3NpZ25hbF90eXBlIHN0djA5MDBfZ2V0X3NpZ25hbF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit2b2lkIHN0djA5MDBfc2V0X2R2YnMxX3RyYWNrX2Nhcl9sb29wKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAorCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kLAorCQkJCQl1MzIgc3JhdGUpCit7CisJaWYgKGludHAtPmNoaXBfaWQgPj0gMHgzMCkgeworCQlpZiAoc3JhdGUgPj0gMTUwMDAwMDApIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFDTEMsIDB4MmIpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQkNMQywgMHgxYSk7CisJCX0gZWxzZSBpZiAoKHNyYXRlID49IDcwMDAwMDApICYmICgxNTAwMDAwMCA+IHNyYXRlKSkgeworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUNMQywgMHgwYyk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBCQ0xDLCAweDFiKTsKKwkJfSBlbHNlIGlmIChzcmF0ZSA8IDcwMDAwMDApIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFDTEMsIDB4MmMpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQkNMQywgMHgxYyk7CisJCX0KKworCX0gZWxzZSB7IC8qY3V0IDIuMCBhbmQgMS54Ki8KKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUNMQywgMHgxYSk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEJDTEMsIDB4MDkpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBzdHYwOTAwX3RyYWNrX29wdGltaXphdGlvbihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc3R2MDkwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMgPSBzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAgPSBzdGF0ZS0+aW50ZXJuYWw7CisJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCA9IHN0YXRlLT5kZW1vZDsKKworCXMzMglzcmF0ZSwKKwkJcGlsb3RzLAorCQlhY2xjLAorCQlmcmVxMSwKKwkJZnJlcTAsCisJCWkgPSAwLAorCQl0aW1lZCwKKwkJdGltZWYsCisJCWJsaW5kX3R1bl9zdyA9IDAsCisJCW1vZHVsYXRpb247CisKKwllbnVtIGZlX3N0djA5MDBfcm9sbG9mZiByb2xsb2ZmOworCWVudW0gZmVfc3R2MDkwMF9tb2Rjb2RlIGZvdW5kTW9kY29kOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCXNyYXRlID0gc3R2MDkwMF9nZXRfc3ltYm9sX3JhdGUoaW50cCwgaW50cC0+bWNsaywgZGVtb2QpOworCXNyYXRlICs9IHN0djA5MDBfZ2V0X3RpbWluZ19vZmZzdChpbnRwLCBzcmF0ZSwgZGVtb2QpOworCisJc3dpdGNoIChpbnRwLT5yZXN1bHRbZGVtb2RdLnN0YW5kYXJkKSB7CisJY2FzZSBTVFYwOTAwX0RWQlMxX1NUQU5EQVJEOgorCWNhc2UgU1RWMDkwMF9EU1NfU1RBTkRBUkQ6CisJCWRwcmludGsoIiVzOiBmb3VuZCBEVkItUyBvciBEU1NcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGludHAtPnNyY2hfc3RhbmRhcmRbZGVtb2RdID09IFNUVjA5MDBfQVVUT19TRUFSQ0gpIHsKKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBEVkJTMV9FTkFCTEUsIDEpOworCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIERWQlMyX0VOQUJMRSwgMCk7CisJCX0KKworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgUk9MTE9GRl9DT05UUk9MLCBpbnRwLT5yb2xsb2ZmKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIE1BTlVBTFNYX1JPTExPRkYsIDEpOworCisJCWlmIChpbnRwLT5jaGlwX2lkIDwgMHgzMCkgeworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRVJSQ1RSTDEsIDB4NzUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3R2MDkwMF9nZXRfdml0X2ZlYyhpbnRwLCBkZW1vZCkgPT0gU1RWMDkwMF9GRUNfMV8yKSB7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBHQVVTU1IwLCAweDk4KTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENDSVIwLCAweDE4KTsKKwkJfSBlbHNlIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEdBVVNTUjAsIDB4MTgpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0NJUjAsIDB4MTgpOworCQl9CisKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRVJSQ1RSTDEsIDB4NzUpOworCQlicmVhazsKKwljYXNlIFNUVjA5MDBfRFZCUzJfU1RBTkRBUkQ6CisJCWRwcmludGsoIiVzOiBmb3VuZCBEVkItUzJcbiIsIF9fZnVuY19fKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIERWQlMxX0VOQUJMRSwgMCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBEVkJTMl9FTkFCTEUsIDEpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDLCAwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQkNMQywgMCk7CisJCWlmIChpbnRwLT5yZXN1bHRbZGVtb2RdLmZyYW1lX2xlbiA9PSBTVFYwOTAwX0xPTkdfRlJBTUUpIHsKKwkJCWZvdW5kTW9kY29kID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBERU1PRF9NT0RDT0QpOworCQkJcGlsb3RzID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBERU1PRF9UWVBFKSAmIDB4MDE7CisJCQlhY2xjID0gc3R2MDkwMF9nZXRfb3B0aW1fY2Fycl9sb29wKHNyYXRlLAorCQkJCQkJCWZvdW5kTW9kY29kLAorCQkJCQkJCXBpbG90cywKKwkJCQkJCQlpbnRwLT5jaGlwX2lkKTsKKwkJCWlmIChmb3VuZE1vZGNvZCA8PSBTVFYwOTAwX1FQU0tfOTEwKQorCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFDTEMyUzJRLCBhY2xjKTsKKwkJCWVsc2UgaWYgKGZvdW5kTW9kY29kIDw9IFNUVjA5MDBfOFBTS185MTApIHsKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDMlMyUSwgMHgyYSk7CisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUNMQzJTMjgsIGFjbGMpOworCQkJfQorCisJCQlpZiAoKGludHAtPmRlbW9kX21vZGUgPT0gU1RWMDkwMF9TSU5HTEUpICYmCisJCQkJCShmb3VuZE1vZGNvZCA+IFNUVjA5MDBfOFBTS185MTApKSB7CisJCQkJaWYgKGZvdW5kTW9kY29kIDw9IFNUVjA5MDBfMTZBUFNLXzkxMCkgeworCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDMlMyUSwgMHgyYSk7CisJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFDTEMyUzIxNkEsCisJCQkJCQkJCQlhY2xjKTsKKwkJCQl9IGVsc2UgaWYgKGZvdW5kTW9kY29kIDw9IFNUVjA5MDBfMzJBUFNLXzkxMCkgeworCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDMlMyUSwgMHgyYSk7CisJCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsCUFDTEMyUzIzMkEsCisJCQkJCQkJCQlhY2xjKTsKKwkJCQl9CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCW1vZHVsYXRpb24gPSBpbnRwLT5yZXN1bHRbZGVtb2RdLm1vZHVsYXRpb247CisJCQlhY2xjID0gc3R2MDkwMF9nZXRfb3B0aW1fc2hvcnRfY2Fycl9sb29wKHNyYXRlLAorCQkJCQltb2R1bGF0aW9uLCBpbnRwLT5jaGlwX2lkKTsKKwkJCWlmIChtb2R1bGF0aW9uID09IFNUVjA5MDBfUVBTSykKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDMlMyUSwgYWNsYyk7CisJCQllbHNlIGlmIChtb2R1bGF0aW9uID09IFNUVjA5MDBfOFBTSykgeworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFDTEMyUzJRLCAweDJhKTsKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDMlMyOCwgYWNsYyk7CisJCQl9IGVsc2UgaWYgKG1vZHVsYXRpb24gPT0gU1RWMDkwMF8xNkFQU0spIHsKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDMlMyUSwgMHgyYSk7CisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUNMQzJTMjE2QSwgYWNsYyk7CisJCQl9IGVsc2UgaWYgKG1vZHVsYXRpb24gPT0gU1RWMDkwMF8zMkFQU0spIHsKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBBQ0xDMlMyUSwgMHgyYSk7CisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUNMQzJTMjMyQSwgYWNsYyk7CisJCQl9CisKKwkJfQorCisJCWlmIChpbnRwLT5jaGlwX2lkIDw9IDB4MTEpIHsKKwkJCWlmIChpbnRwLT5kZW1vZF9tb2RlICE9IFNUVjA5MDBfU0lOR0xFKQorCQkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kKGludHAsIGRlbW9kKTsKKworCQl9CisKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRVJSQ1RSTDEsIDB4NjcpOworCQlicmVhazsKKwljYXNlIFNUVjA5MDBfVU5LTk9XTl9TVEFOREFSRDoKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCIlczogZm91bmQgdW5rbm93biBzdGFuZGFyZFxuIiwgX19mdW5jX18pOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRFZCUzFfRU5BQkxFLCAxKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIERWQlMyX0VOQUJMRSwgMSk7CisJCWJyZWFrOworCX0KKworCWZyZXExID0gc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBDRlIyKTsKKwlmcmVxMCA9IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgQ0ZSMSk7CisJcm9sbG9mZiA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgUk9MTE9GRl9TVEFUVVMpOworCWlmIChpbnRwLT5zcmNoX2FsZ29bZGVtb2RdID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKSB7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUlNURVAsIDB4MDApOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgU0NBTl9FTkFCTEUsIDApOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgQ0ZSX0FVVE9TQ0FOLCAwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVE1HQ0ZHMiwgMHhjMSk7CisJCXN0djA5MDBfc2V0X3N5bWJvbF9yYXRlKGludHAsIGludHAtPm1jbGssIHNyYXRlLCBkZW1vZCk7CisJCWJsaW5kX3R1bl9zdyA9IDE7CisJCWlmIChpbnRwLT5yZXN1bHRbZGVtb2RdLnN0YW5kYXJkICE9IFNUVjA5MDBfRFZCUzJfU1RBTkRBUkQpCisJCQlzdHYwOTAwX3NldF9kdmJzMV90cmFja19jYXJfbG9vcChpbnRwLCBkZW1vZCwgc3JhdGUpOworCisJfQorCisJaWYgKGludHAtPmNoaXBfaWQgPj0gMHgyMCkgeworCQlpZiAoKGludHAtPnNyY2hfc3RhbmRhcmRbZGVtb2RdID09IFNUVjA5MDBfU0VBUkNIX0RWQlMxKSB8fAorCQkJCShpbnRwLT5zcmNoX3N0YW5kYXJkW2RlbW9kXSA9PQorCQkJCQkJCVNUVjA5MDBfU0VBUkNIX0RTUykgfHwKKwkJCQkoaW50cC0+c3JjaF9zdGFuZGFyZFtkZW1vZF0gPT0KKwkJCQkJCQlTVFYwOTAwX0FVVE9fU0VBUkNIKSkgeworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVkFWU1JWSVQsIDB4MGEpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVklUU0NBTEUsIDB4MCk7CisJCX0KKwl9CisKKwlpZiAoaW50cC0+Y2hpcF9pZCA8IDB4MjApCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkhEUiwgMHgwOCk7CisKKwlpZiAoaW50cC0+Y2hpcF9pZCA9PSAweDEwKQorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDT1JSRUxFWFAsIDB4MGEpOworCisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUdDMlJFRiwgMHgzOCk7CisKKwlpZiAoKGludHAtPmNoaXBfaWQgPj0gMHgyMCkgfHwKKwkJCShibGluZF90dW5fc3cgPT0gMSkgfHwKKwkJCShpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPCAxMDAwMDAwMCkpIHsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDEsIGZyZXExKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDAsIGZyZXEwKTsKKwkJaW50cC0+YndbZGVtb2RdID0gc3R2MDkwMF9jYXJyaWVyX3dpZHRoKHNyYXRlLAorCQkJCQlpbnRwLT5yb2xsb2ZmKSArIDEwMDAwMDAwOworCisJCWlmICgoaW50cC0+Y2hpcF9pZCA+PSAweDIwKSB8fCAoYmxpbmRfdHVuX3N3ID09IDEpKSB7CisJCQlpZiAoaW50cC0+c3JjaF9hbGdvW2RlbW9kXSAhPSBTVFYwOTAwX1dBUk1fU1RBUlQpCisJCQkJc3R2MDkwMF9zZXRfYmFuZHdpZHRoKGZlLCBpbnRwLT5id1tkZW1vZF0pOworCQl9CisKKwkJaWYgKChpbnRwLT5zcmNoX2FsZ29bZGVtb2RdID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKSB8fAorCQkJCShpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPCAxMDAwMDAwMCkpCisJCQltc2xlZXAoNTApOworCQllbHNlCisJCQltc2xlZXAoNSk7CisKKwkJc3R2MDkwMF9nZXRfbG9ja190aW1lb3V0KCZ0aW1lZCwgJnRpbWVmLCBzcmF0ZSwKKwkJCQkJCVNUVjA5MDBfV0FSTV9TVEFSVCk7CisKKwkJaWYgKHN0djA5MDBfZ2V0X2RlbW9kX2xvY2soaW50cCwgZGVtb2QsIHRpbWVkIC8gMikgPT0gRkFMU0UpIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxZik7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJJTklUMSwgZnJlcTEpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDAsIGZyZXEwKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxOCk7CisJCQlpID0gMDsKKwkJCXdoaWxlICgoc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpbnRwLAorCQkJCQkJCWRlbW9kLAorCQkJCQkJCXRpbWVkIC8gMikgPT0gRkFMU0UpICYmCisJCQkJCQkoaSA8PSAyKSkgeworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxZik7CisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDEsIGZyZXExKTsKKwkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJJTklUMCwgZnJlcTApOworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxOCk7CisJCQkJaSsrOworCQkJfQorCQl9CisKKwl9CisKKwlpZiAoaW50cC0+Y2hpcF9pZCA+PSAweDIwKQorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJGUkVRLCAweDQ5KTsKKworCWlmICgoaW50cC0+cmVzdWx0W2RlbW9kXS5zdGFuZGFyZCA9PSBTVFYwOTAwX0RWQlMxX1NUQU5EQVJEKSB8fAorCQkJKGludHAtPnJlc3VsdFtkZW1vZF0uc3RhbmRhcmQgPT0gU1RWMDkwMF9EU1NfU1RBTkRBUkQpKQorCQlzdHYwOTAwX3NldF92aXRlcmJpX3RyYWNxKGludHAsIGRlbW9kKTsKKworfQorCitzdGF0aWMgaW50IHN0djA5MDBfZ2V0X2ZlY19sb2NrKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAorCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QsIHMzMiB0aW1lX291dCkKK3sKKwlzMzIgdGltZXIgPSAwLCBsb2NrID0gMDsKKworCWVudW0gZmVfc3R2MDkwMF9zZWFyY2hfc3RhdGUgZG1kX3N0YXRlOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCWRtZF9zdGF0ZSA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgSEVBREVSX01PREUpOworCisJd2hpbGUgKCh0aW1lciA8IHRpbWVfb3V0KSAmJiAobG9jayA9PSAwKSkgeworCQlzd2l0Y2ggKGRtZF9zdGF0ZSkgeworCQljYXNlIFNUVjA5MDBfU0VBUkNIOgorCQljYXNlIFNUVjA5MDBfUExIX0RFVEVDVEVEOgorCQlkZWZhdWx0OgorCQkJbG9jayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBTVFYwOTAwX0RWQlMyX0ZPVU5EOgorCQkJbG9jayA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgUEtUREVMSU5fTE9DSyk7CisJCQlicmVhazsKKwkJY2FzZSBTVFYwOTAwX0RWQlNfRk9VTkQ6CisJCQlsb2NrID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBMT0NLRURWSVQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobG9jayA9PSAwKSB7CisJCQltc2xlZXAoMTApOworCQkJdGltZXIgKz0gMTA7CisJCX0KKwl9CisKKwlpZiAobG9jaykKKwkJZHByaW50aygiJXM6IERFTU9EIEZFQyBMT0NLIE9LXG4iLCBfX2Z1bmNfXyk7CisJZWxzZQorCQlkcHJpbnRrKCIlczogREVNT0QgRkVDIExPQ0sgRkFJTFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIGxvY2s7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDkwMF93YWl0X2Zvcl9sb2NrKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAorCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QsCisJCQkJczMyIGRtZF90aW1lb3V0LCBzMzIgZmVjX3RpbWVvdXQpCit7CisKKwlzMzIgdGltZXIgPSAwLCBsb2NrID0gMDsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlsb2NrID0gc3R2MDkwMF9nZXRfZGVtb2RfbG9jayhpbnRwLCBkZW1vZCwgZG1kX3RpbWVvdXQpOworCisJaWYgKGxvY2spCisJCWxvY2sgPSBsb2NrICYmIHN0djA5MDBfZ2V0X2ZlY19sb2NrKGludHAsIGRlbW9kLCBmZWNfdGltZW91dCk7CisKKwlpZiAobG9jaykgeworCQlsb2NrID0gMDsKKworCQlkcHJpbnRrKCIlczogVGltZXIgPSAlZCwgdGltZV9vdXQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdGltZXIsIGZlY190aW1lb3V0KTsKKworCQl3aGlsZSAoKHRpbWVyIDwgZmVjX3RpbWVvdXQpICYmIChsb2NrID09IDApKSB7CisJCQlsb2NrID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBUU0ZJRk9fTElORU9LKTsKKwkJCW1zbGVlcCgxKTsKKwkJCXRpbWVyKys7CisJCX0KKwl9CisKKwlpZiAobG9jaykKKwkJZHByaW50aygiJXM6IERFTU9EIExPQ0sgT0tcbiIsIF9fZnVuY19fKTsKKwllbHNlCisJCWRwcmludGsoIiVzOiBERU1PRCBMT0NLIEZBSUxcbiIsIF9fZnVuY19fKTsKKworCWlmIChsb2NrKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworZW51bSBmZV9zdHYwOTAwX3RyYWNraW5nX3N0YW5kYXJkIHN0djA5MDBfZ2V0X3N0YW5kYXJkKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKK3sKKwlzdHJ1Y3Qgc3R2MDkwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKKwllbnVtIGZlX3N0djA5MDBfdHJhY2tpbmdfc3RhbmRhcmQgZm5kX3N0YW5kYXJkOworCisJaW50IGhkcl9tb2RlID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBIRUFERVJfTU9ERSk7CisKKwlzd2l0Y2ggKGhkcl9tb2RlKSB7CisJY2FzZSAyOgorCQlmbmRfc3RhbmRhcmQgPSBTVFYwOTAwX0RWQlMyX1NUQU5EQVJEOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmIChzdHYwOTAwX2dldF9iaXRzKGludHAsIERTU19EVkIpID09IDEpCisJCQlmbmRfc3RhbmRhcmQgPSBTVFYwOTAwX0RTU19TVEFOREFSRDsKKwkJZWxzZQorCQkJZm5kX3N0YW5kYXJkID0gU1RWMDkwMF9EVkJTMV9TVEFOREFSRDsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbmRfc3RhbmRhcmQgPSBTVFYwOTAwX1VOS05PV05fU1RBTkRBUkQ7CisJfQorCisJZHByaW50aygiJXM6IHN0YW5kYXJkICVkXG4iLCBfX2Z1bmNfXywgZm5kX3N0YW5kYXJkKTsKKworCXJldHVybiBmbmRfc3RhbmRhcmQ7Cit9CisKK3N0YXRpYyBzMzIgc3R2MDkwMF9nZXRfY2Fycl9mcmVxKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLCB1MzIgbWNsaywKKwkJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKK3sKKwlzMzIJZGVyb3QsCisJCXJlbTEsCisJCXJlbTIsCisJCWludHZhbDEsCisJCWludHZhbDI7CisKKwlkZXJvdCA9IChzdHYwOTAwX2dldF9iaXRzKGludHAsIENBUl9GUkVRMikgPDwgMTYpICsKKwkJKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgQ0FSX0ZSRVExKSA8PCA4KSArCisJCShzdHYwOTAwX2dldF9iaXRzKGludHAsIENBUl9GUkVRMCkpOworCisJZGVyb3QgPSBnZTJjb21wKGRlcm90LCAyNCk7CisJaW50dmFsMSA9IG1jbGsgPj4gMTI7CisJaW50dmFsMiA9IGRlcm90ID4+IDEyOworCXJlbTEgPSBtY2xrICUgMHgxMDAwOworCXJlbTIgPSBkZXJvdCAlIDB4MTAwMDsKKwlkZXJvdCA9IChpbnR2YWwxICogaW50dmFsMikgKworCQkoKGludHZhbDEgKiByZW0yKSA+PiAxMikgKworCQkoKGludHZhbDIgKiByZW0xKSA+PiAxMik7CisKKwlyZXR1cm4gZGVyb3Q7Cit9CisKK3N0YXRpYyB1MzIgc3R2MDkwMF9nZXRfdHVuZXJfZnJlcShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcwkqZnJvbnRlbmRfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqdHVuZXJfb3BzID0gTlVMTDsKKwl1MzIgZnJlcSA9IDA7CisKKwlpZiAoJmZlLT5vcHMpCisJCWZyb250ZW5kX29wcyA9ICZmZS0+b3BzOworCisJaWYgKCZmcm9udGVuZF9vcHMtPnR1bmVyX29wcykKKwkJdHVuZXJfb3BzID0gJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzOworCisJaWYgKHR1bmVyX29wcy0+Z2V0X2ZyZXF1ZW5jeSkgeworCQlpZiAoKHR1bmVyX29wcy0+Z2V0X2ZyZXF1ZW5jeShmZSwgJmZyZXEpKSA8IDApCisJCQlkcHJpbnRrKCIlczogSW52YWxpZCBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKKwkJZWxzZQorCQkJZHByaW50aygiJXM6IEZyZXF1ZW5jeT0lZFxuIiwgX19mdW5jX18sIGZyZXEpOworCisJfQorCisJcmV0dXJuIGZyZXE7Cit9CisKK3N0YXRpYyBlbnVtCitmZV9zdHYwOTAwX3NpZ25hbF90eXBlIHN0djA5MDBfZ2V0X3NpZ25hbF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAgPSBzdGF0ZS0+aW50ZXJuYWw7CiAJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCA9IHN0YXRlLT5kZW1vZDsKIAllbnVtIGZlX3N0djA5MDBfc2lnbmFsX3R5cGUgcmFuZ2UgPSBTVFYwOTAwX09VVE9GUkFOR0U7Ci0JczMyIG9mZnNldEZyZXEsCi0Jc3JhdGVfb2Zmc2V0LAotCWkgPSAwOworCXN0cnVjdCBzdHYwOTAwX3NpZ25hbF9pbmZvICpyZXN1bHQgPSAmaW50cC0+cmVzdWx0W2RlbW9kXTsKKwlzMzIJb2Zmc2V0RnJlcSwKKwkJc3JhdGVfb2Zmc2V0OworCWludAlpID0gMCwKKwkJZCA9IGRlbW9kOwogCiAJdTggdGltaW5nOwogCiAJbXNsZWVwKDUpOwotCXN3aXRjaCAoZGVtb2QpIHsKLQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQlkZWZhdWx0OgotCQlpZiAoaV9wYXJhbXMtPmRtZDFfc3JjaF9hbGdvID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKSB7Ci0JCQl0aW1pbmcgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdSRUcyKTsKLQkJCWkgPSAwOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUlNURVAsIDB4NWMpOworCWlmIChpbnRwLT5zcmNoX2FsZ29bZF0gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpIHsKKwkJdGltaW5nID0gc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBUTUdSRUcyKTsKKwkJaSA9IDA7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUlNURVAsIDB4NWMpOwogCi0JCQl3aGlsZSAoKGkgPD0gNTApICYmICh0aW1pbmcgIT0gMCkgJiYgKHRpbWluZyAhPSAweEZGKSkgewotCQkJCXRpbWluZyA9IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1RNR1JFRzIpOwotCQkJCW1zbGVlcCg1KTsKLQkJCQlpICs9IDU7Ci0JCQl9CisJCXdoaWxlICgoaSA8PSA1MCkgJiYgKHRpbWluZyAhPSAwKSAmJiAodGltaW5nICE9IDB4ZmYpKSB7CisJCQl0aW1pbmcgPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIFRNR1JFRzIpOworCQkJbXNsZWVwKDUpOworCQkJaSArPSA1OwogCQl9CisJfQogCi0JCWlfcGFyYW1zLT5kbWQxX3JzbHRzLnN0YW5kYXJkID0gc3R2MDkwMF9nZXRfc3RhbmRhcmQoZmUsIGRlbW9kKTsKLQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMuZnJlcXVlbmN5ID0gc3R2MDkwMF9nZXRfdHVuZXJfZnJlcShmZSk7Ci0JCW9mZnNldEZyZXEgPSBzdHYwOTAwX2dldF9jYXJyX2ZyZXEoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCBkZW1vZCkgLyAxMDAwOwotCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5mcmVxdWVuY3kgKz0gb2Zmc2V0RnJlcTsKLQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMuc3ltYm9sX3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGRlbW9kKTsKLQkJc3JhdGVfb2Zmc2V0ID0gc3R2MDkwMF9nZXRfdGltaW5nX29mZnN0KGlfcGFyYW1zLCBpX3BhcmFtcy0+ZG1kMV9yc2x0cy5zeW1ib2xfcmF0ZSwgZGVtb2QpOwotCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5zeW1ib2xfcmF0ZSArPSBzcmF0ZV9vZmZzZXQ7Ci0JCWlfcGFyYW1zLT5kbWQxX3JzbHRzLmZlYyA9IHN0djA5MDBfZ2V0X3ZpdF9mZWMoaV9wYXJhbXMsIGRlbW9kKTsKLQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMubW9kY29kZSA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RFTU9EX01PRENPRCk7Ci0JCWlfcGFyYW1zLT5kbWQxX3JzbHRzLnBpbG90ID0gc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfREVNT0RfVFlQRSkgJiAweDAxOwotCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5mcmFtZV9sZW5ndGggPSAoKHUzMilzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9ERU1PRF9UWVBFKSkgPj4gMTsKLQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMucm9sbG9mZiA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1JPTExPRkZfU1RBVFVTKTsKLQkJc3dpdGNoIChpX3BhcmFtcy0+ZG1kMV9yc2x0cy5zdGFuZGFyZCkgewotCQljYXNlIFNUVjA5MDBfRFZCUzJfU1RBTkRBUkQ6Ci0JCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5zcGVjdHJ1bSA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1NQRUNJTlZfREVNT0QpOwotCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3JzbHRzLm1vZGNvZGUgPD0gU1RWMDkwMF9RUFNLXzkxMCkKLQkJCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2R1bGF0aW9uID0gU1RWMDkwMF9RUFNLOwotCQkJZWxzZSBpZiAoaV9wYXJhbXMtPmRtZDFfcnNsdHMubW9kY29kZSA8PSBTVFYwOTAwXzhQU0tfOTEwKQotCQkJCWlfcGFyYW1zLT5kbWQxX3JzbHRzLm1vZHVsYXRpb24gPSBTVFYwOTAwXzhQU0s7Ci0JCQllbHNlIGlmIChpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2Rjb2RlIDw9IFNUVjA5MDBfMTZBUFNLXzkxMCkKLQkJCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2R1bGF0aW9uID0gU1RWMDkwMF8xNkFQU0s7Ci0JCQllbHNlIGlmIChpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2Rjb2RlIDw9IFNUVjA5MDBfMzJBUFNLXzkxMCkKLQkJCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5tb2R1bGF0aW9uID0gU1RWMDkwMF8zMkFQU0s7Ci0JCQllbHNlCi0JCQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMubW9kdWxhdGlvbiA9IFNUVjA5MDBfVU5LTk9XTjsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfRFZCUzFfU1RBTkRBUkQ6Ci0JCWNhc2UgU1RWMDkwMF9EU1NfU1RBTkRBUkQ6Ci0JCQlpX3BhcmFtcy0+ZG1kMV9yc2x0cy5zcGVjdHJ1bSA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0lRSU5WKTsKLQkJCWlfcGFyYW1zLT5kbWQxX3JzbHRzLm1vZHVsYXRpb24gPSBTVFYwOTAwX1FQU0s7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKChpX3BhcmFtcy0+ZG1kMV9zcmNoX2FsZ28gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpIHx8IChpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSA8IDEwMDAwMDAwKSkgewotCQkJb2Zmc2V0RnJlcSA9CWlfcGFyYW1zLT5kbWQxX3JzbHRzLmZyZXF1ZW5jeSAtIGlfcGFyYW1zLT50dW5lcjFfZnJlcTsKLQkJCWlfcGFyYW1zLT50dW5lcjFfZnJlcSA9IHN0djA5MDBfZ2V0X3R1bmVyX2ZyZXEoZmUpOwotCQkJaWYgKEFCUyhvZmZzZXRGcmVxKSA8PSAoKGlfcGFyYW1zLT5kbWQxX3NyY2hfcmFuZ2UgLyAyMDAwKSArIDUwMCkpCi0JCQkJcmFuZ2UgPSBTVFYwOTAwX1JBTkdFT0s7Ci0JCQllbHNlCi0JCQkJaWYgKEFCUyhvZmZzZXRGcmVxKSA8PSAoc3R2MDkwMF9jYXJyaWVyX3dpZHRoKGlfcGFyYW1zLT5kbWQxX3JzbHRzLnN5bWJvbF9yYXRlLCBpX3BhcmFtcy0+ZG1kMV9yc2x0cy5yb2xsb2ZmKSAvIDIwMDApKQotCQkJCQlyYW5nZSA9IFNUVjA5MDBfUkFOR0VPSzsKLQkJCQllbHNlCi0JCQkJCXJhbmdlID0gU1RWMDkwMF9PVVRPRlJBTkdFOwotCi0JCX0gZWxzZSB7Ci0JCQlpZiAoQUJTKG9mZnNldEZyZXEpIDw9ICgoaV9wYXJhbXMtPmRtZDFfc3JjaF9yYW5nZSAvIDIwMDApICsgNTAwKSkKLQkJCQlyYW5nZSA9IFNUVjA5MDBfUkFOR0VPSzsKLQkJCWVsc2UKLQkJCQlyYW5nZSA9IFNUVjA5MDBfT1VUT0ZSQU5HRTsKLQkJfQorCXJlc3VsdC0+c3RhbmRhcmQgPSBzdHYwOTAwX2dldF9zdGFuZGFyZChmZSwgZCk7CisJcmVzdWx0LT5mcmVxdWVuY3kgPSBzdHYwOTAwX2dldF90dW5lcl9mcmVxKGZlKTsKKwlvZmZzZXRGcmVxID0gc3R2MDkwMF9nZXRfY2Fycl9mcmVxKGludHAsIGludHAtPm1jbGssIGQpIC8gMTAwMDsKKwlyZXN1bHQtPmZyZXF1ZW5jeSArPSBvZmZzZXRGcmVxOworCXJlc3VsdC0+c3ltYm9sX3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpbnRwLCBpbnRwLT5tY2xrLCBkKTsKKwlzcmF0ZV9vZmZzZXQgPSBzdHYwOTAwX2dldF90aW1pbmdfb2Zmc3QoaW50cCwgcmVzdWx0LT5zeW1ib2xfcmF0ZSwgZCk7CisJcmVzdWx0LT5zeW1ib2xfcmF0ZSArPSBzcmF0ZV9vZmZzZXQ7CisJcmVzdWx0LT5mZWMgPSBzdHYwOTAwX2dldF92aXRfZmVjKGludHAsIGQpOworCXJlc3VsdC0+bW9kY29kZSA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgREVNT0RfTU9EQ09EKTsKKwlyZXN1bHQtPnBpbG90ID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBERU1PRF9UWVBFKSAmIDB4MDE7CisJcmVzdWx0LT5mcmFtZV9sZW4gPSAoKHUzMilzdHYwOTAwX2dldF9iaXRzKGludHAsIERFTU9EX1RZUEUpKSA+PiAxOworCXJlc3VsdC0+cm9sbG9mZiA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgUk9MTE9GRl9TVEFUVVMpOworCXN3aXRjaCAocmVzdWx0LT5zdGFuZGFyZCkgeworCWNhc2UgU1RWMDkwMF9EVkJTMl9TVEFOREFSRDoKKwkJcmVzdWx0LT5zcGVjdHJ1bSA9IHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgU1BFQ0lOVl9ERU1PRCk7CisJCWlmIChyZXN1bHQtPm1vZGNvZGUgPD0gU1RWMDkwMF9RUFNLXzkxMCkKKwkJCXJlc3VsdC0+bW9kdWxhdGlvbiA9IFNUVjA5MDBfUVBTSzsKKwkJZWxzZSBpZiAocmVzdWx0LT5tb2Rjb2RlIDw9IFNUVjA5MDBfOFBTS185MTApCisJCQlyZXN1bHQtPm1vZHVsYXRpb24gPSBTVFYwOTAwXzhQU0s7CisJCWVsc2UgaWYgKHJlc3VsdC0+bW9kY29kZSA8PSBTVFYwOTAwXzE2QVBTS185MTApCisJCQlyZXN1bHQtPm1vZHVsYXRpb24gPSBTVFYwOTAwXzE2QVBTSzsKKwkJZWxzZSBpZiAocmVzdWx0LT5tb2Rjb2RlIDw9IFNUVjA5MDBfMzJBUFNLXzkxMCkKKwkJCXJlc3VsdC0+bW9kdWxhdGlvbiA9IFNUVjA5MDBfMzJBUFNLOworCQllbHNlCisJCQlyZXN1bHQtPm1vZHVsYXRpb24gPSBTVFYwOTAwX1VOS05PV047CiAJCWJyZWFrOwotCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKSB7Ci0JCQl0aW1pbmcgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTUdSRUcyKTsKLQkJCWkgPSAwOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUlNURVAsIDB4NWMpOwotCi0JCQl3aGlsZSAoKGkgPD0gNTApICYmICh0aW1pbmcgIT0gMCkgJiYgKHRpbWluZyAhPSAweGZmKSkgewotCQkJCXRpbWluZyA9IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1RNR1JFRzIpOwotCQkJCW1zbGVlcCg1KTsKLQkJCQlpICs9IDU7Ci0JCQl9Ci0JCX0KLQotCQlpX3BhcmFtcy0+ZG1kMl9yc2x0cy5zdGFuZGFyZCA9IHN0djA5MDBfZ2V0X3N0YW5kYXJkKGZlLCBkZW1vZCk7Ci0JCWlfcGFyYW1zLT5kbWQyX3JzbHRzLmZyZXF1ZW5jeSA9IHN0djA5MDBfZ2V0X3R1bmVyX2ZyZXEoZmUpOwotCQlvZmZzZXRGcmVxID0gc3R2MDkwMF9nZXRfY2Fycl9mcmVxKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgZGVtb2QpIC8gMTAwMDsKLQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMuZnJlcXVlbmN5ICs9IG9mZnNldEZyZXE7Ci0JCWlfcGFyYW1zLT5kbWQyX3JzbHRzLnN5bWJvbF9yYXRlID0gc3R2MDkwMF9nZXRfc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCBkZW1vZCk7Ci0JCXNyYXRlX29mZnNldCA9IHN0djA5MDBfZ2V0X3RpbWluZ19vZmZzdChpX3BhcmFtcywgaV9wYXJhbXMtPmRtZDJfcnNsdHMuc3ltYm9sX3JhdGUsIGRlbW9kKTsKLQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMuc3ltYm9sX3JhdGUgKz0gc3JhdGVfb2Zmc2V0OwotCQlpX3BhcmFtcy0+ZG1kMl9yc2x0cy5mZWMgPSBzdHYwOTAwX2dldF92aXRfZmVjKGlfcGFyYW1zLCBkZW1vZCk7Ci0JCWlfcGFyYW1zLT5kbWQyX3JzbHRzLm1vZGNvZGUgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9ERU1PRF9NT0RDT0QpOwotCQlpX3BhcmFtcy0+ZG1kMl9yc2x0cy5waWxvdCA9IHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0RFTU9EX1RZUEUpICYgMHgwMTsKLQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMuZnJhbWVfbGVuZ3RoID0gKCh1MzIpc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfREVNT0RfVFlQRSkpID4+IDE7Ci0JCWlfcGFyYW1zLT5kbWQyX3JzbHRzLnJvbGxvZmYgPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9ST0xMT0ZGX1NUQVRVUyk7Ci0JCXN3aXRjaCAoaV9wYXJhbXMtPmRtZDJfcnNsdHMuc3RhbmRhcmQpIHsKLQkJY2FzZSBTVFYwOTAwX0RWQlMyX1NUQU5EQVJEOgotCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMuc3BlY3RydW0gPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9TUEVDSU5WX0RFTU9EKTsKLQkJCWlmIChpX3BhcmFtcy0+ZG1kMl9yc2x0cy5tb2Rjb2RlIDw9IFNUVjA5MDBfUVBTS185MTApCi0JCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMubW9kdWxhdGlvbiA9IFNUVjA5MDBfUVBTSzsKLQkJCWVsc2UgaWYgKGlfcGFyYW1zLT5kbWQyX3JzbHRzLm1vZGNvZGUgPD0gU1RWMDkwMF84UFNLXzkxMCkKLQkJCQlpX3BhcmFtcy0+ZG1kMl9yc2x0cy5tb2R1bGF0aW9uID0gU1RWMDkwMF84UFNLOwotCQkJZWxzZSBpZiAoaV9wYXJhbXMtPmRtZDJfcnNsdHMubW9kY29kZSA8PSBTVFYwOTAwXzE2QVBTS185MTApCi0JCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMubW9kdWxhdGlvbiA9IFNUVjA5MDBfMTZBUFNLOwotCQkJZWxzZSBpZiAoaV9wYXJhbXMtPmRtZDJfcnNsdHMubW9kY29kZSA8PSBTVFYwOTAwXzMyQVBTS185MTApCi0JCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMubW9kdWxhdGlvbiA9IFNUVjA5MDBfMzJBUFNLOwotCQkJZWxzZQotCQkJCWlfcGFyYW1zLT5kbWQyX3JzbHRzLm1vZHVsYXRpb24gPSBTVFYwOTAwX1VOS05PV047Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0RWQlMxX1NUQU5EQVJEOgotCQljYXNlIFNUVjA5MDBfRFNTX1NUQU5EQVJEOgotCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMuc3BlY3RydW0gPSBzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9JUUlOVik7Ci0JCQlpX3BhcmFtcy0+ZG1kMl9yc2x0cy5tb2R1bGF0aW9uID0gU1RWMDkwMF9RUFNLOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICgoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKSB8fCAoaV9wYXJhbXMtPmRtZDJfc3ltYm9sX3JhdGUgPCAxMDAwMDAwMCkpIHsKLQkJCW9mZnNldEZyZXEgPQlpX3BhcmFtcy0+ZG1kMl9yc2x0cy5mcmVxdWVuY3kgLSBpX3BhcmFtcy0+dHVuZXIyX2ZyZXE7Ci0JCQlpX3BhcmFtcy0+dHVuZXIyX2ZyZXEgPSBzdHYwOTAwX2dldF90dW5lcl9mcmVxKGZlKTsKLQotCQkJaWYgKEFCUyhvZmZzZXRGcmVxKSA8PSAoKGlfcGFyYW1zLT5kbWQyX3NyY2hfcmFuZ2UgLyAyMDAwKSArIDUwMCkpCi0JCQkJcmFuZ2UgPSBTVFYwOTAwX1JBTkdFT0s7Ci0JCQllbHNlCi0JCQkJaWYgKEFCUyhvZmZzZXRGcmVxKSA8PSAoc3R2MDkwMF9jYXJyaWVyX3dpZHRoKGlfcGFyYW1zLT5kbWQyX3JzbHRzLnN5bWJvbF9yYXRlLCBpX3BhcmFtcy0+ZG1kMl9yc2x0cy5yb2xsb2ZmKSAvIDIwMDApKQotCQkJCQlyYW5nZSA9IFNUVjA5MDBfUkFOR0VPSzsKLQkJCQllbHNlCi0JCQkJCXJhbmdlID0gU1RWMDkwMF9PVVRPRlJBTkdFOwotCQl9IGVsc2UgewotCQkJaWYgKEFCUyhvZmZzZXRGcmVxKSA8PSAoKGlfcGFyYW1zLT5kbWQyX3NyY2hfcmFuZ2UgLyAyMDAwKSArIDUwMCkpCi0JCQkJcmFuZ2UgPSBTVFYwOTAwX1JBTkdFT0s7Ci0JCQllbHNlCi0JCQkJcmFuZ2UgPSBTVFYwOTAwX09VVE9GUkFOR0U7Ci0JCX0KLQorCWNhc2UgU1RWMDkwMF9EVkJTMV9TVEFOREFSRDoKKwljYXNlIFNUVjA5MDBfRFNTX1NUQU5EQVJEOgorCQlyZXN1bHQtPnNwZWN0cnVtID0gc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBJUUlOVik7CisJCXJlc3VsdC0+bW9kdWxhdGlvbiA9IFNUVjA5MDBfUVBTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCisJaWYgKChpbnRwLT5zcmNoX2FsZ29bZF0gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpIHx8CisJCQkJKGludHAtPnN5bWJvbF9yYXRlW2RdIDwgMTAwMDAwMDApKSB7CisJCW9mZnNldEZyZXEgPSByZXN1bHQtPmZyZXF1ZW5jeSAtIGludHAtPmZyZXFbZF07CisJCWludHAtPmZyZXFbZF0gPSBzdHYwOTAwX2dldF90dW5lcl9mcmVxKGZlKTsKKwkJaWYgKEFCUyhvZmZzZXRGcmVxKSA8PSAoKGludHAtPnNyY2hfcmFuZ2VbZF0gLyAyMDAwKSArIDUwMCkpCisJCQlyYW5nZSA9IFNUVjA5MDBfUkFOR0VPSzsKKwkJZWxzZSBpZiAoQUJTKG9mZnNldEZyZXEpIDw9CisJCQkJKHN0djA5MDBfY2Fycmllcl93aWR0aChyZXN1bHQtPnN5bWJvbF9yYXRlLAorCQkJCQkJcmVzdWx0LT5yb2xsb2ZmKSAvIDIwMDApKQorCQkJcmFuZ2UgPSBTVFYwOTAwX1JBTkdFT0s7CisKKwl9IGVsc2UgaWYgKEFCUyhvZmZzZXRGcmVxKSA8PSAoKGludHAtPnNyY2hfcmFuZ2VbZF0gLyAyMDAwKSArIDUwMCkpCisJCXJhbmdlID0gU1RWMDkwMF9SQU5HRU9LOworCisJZHByaW50aygiJXM6IHJhbmdlICVkXG4iLCBfX2Z1bmNfXywgcmFuZ2UpOworCiAJcmV0dXJuIHJhbmdlOwogfQogCi1zdGF0aWMgZW51bSBmZV9zdHYwOTAwX3NpZ25hbF90eXBlIHN0djA5MDBfZHZiczFfYWNxX3dvcmthcm91bmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgZW51bQorZmVfc3R2MDkwMF9zaWduYWxfdHlwZSBzdHYwOTAwX2R2YnMxX2FjcV93b3JrYXJvdW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwotCi0JczMyIHNyYXRlLCBkZW1vZF90aW1lb3V0LAotCQlmZWNfdGltZW91dCwgZnJlcTEsIGZyZXEwOwogCWVudW0gZmVfc3R2MDkwMF9zaWduYWxfdHlwZSBzaWduYWxfdHlwZSA9IFNUVjA5MDBfTk9EQVRBOwogCi0Jc3dpdGNoIChkZW1vZCkgewotCWNhc2UgU1RWMDkwMF9ERU1PRF8xOgotCWRlZmF1bHQ6Ci0JCWlfcGFyYW1zLT5kbWQxX3JzbHRzLmxvY2tlZCA9IEZBTFNFOwotCQlpZiAoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfSEVBREVSX01PREUpID09IFNUVjA5MDBfRFZCU19GT1VORCkgewotCQkJc3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGRlbW9kKTsKLQkJCXNyYXRlICs9IHN0djA5MDBfZ2V0X3RpbWluZ19vZmZzdChpX3BhcmFtcywgc3JhdGUsIGRlbW9kKTsKLQkJCWlmIChpX3BhcmFtcy0+ZG1kMV9zcmNoX2FsZ28gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpCi0JCQkJc3R2MDkwMF9zZXRfc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCBzcmF0ZSwgZGVtb2QpOworCXMzMglzcmF0ZSwKKwkJZGVtb2RfdGltZW91dCwKKwkJZmVjX3RpbWVvdXQsCisJCWZyZXExLAorCQlmcmVxMDsKIAotCQkJc3R2MDkwMF9nZXRfbG9ja190aW1lb3V0KCZkZW1vZF90aW1lb3V0LCAmZmVjX3RpbWVvdXQsIHNyYXRlLCBTVFYwOTAwX1dBUk1fU1RBUlQpOwotCQkJZnJlcTEgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DRlIyKTsKLQkJCWZyZXEwID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0NGUl9BVVRPU0NBTiwgMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1NQRUNJTlZfQ09OVFJPTCwgU1RWMDkwMF9JUV9GT1JDRV9TV0FQUEVEKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MUMpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQxLCBmcmVxMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDAsIGZyZXEwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MTgpOwotCQkJaWYgKHN0djA5MDBfd2FpdF9mb3JfbG9jayhpX3BhcmFtcywgZGVtb2QsIGRlbW9kX3RpbWVvdXQsIGZlY190aW1lb3V0KSA9PSBUUlVFKSB7Ci0JCQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMubG9ja2VkID0gVFJVRTsKKwlpbnRwLT5yZXN1bHRbZGVtb2RdLmxvY2tlZCA9IEZBTFNFOworCisJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgSEVBREVSX01PREUpID09IFNUVjA5MDBfRFZCU19GT1VORCkgeworCQlzcmF0ZSA9IHN0djA5MDBfZ2V0X3N5bWJvbF9yYXRlKGludHAsIGludHAtPm1jbGssIGRlbW9kKTsKKwkJc3JhdGUgKz0gc3R2MDkwMF9nZXRfdGltaW5nX29mZnN0KGludHAsIHNyYXRlLCBkZW1vZCk7CisJCWlmIChpbnRwLT5zcmNoX2FsZ29bZGVtb2RdID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKQorCQkJc3R2MDkwMF9zZXRfc3ltYm9sX3JhdGUoaW50cCwgaW50cC0+bWNsaywgc3JhdGUsIGRlbW9kKTsKKworCQlzdHYwOTAwX2dldF9sb2NrX3RpbWVvdXQoJmRlbW9kX3RpbWVvdXQsICZmZWNfdGltZW91dCwKKwkJCQkJc3JhdGUsIFNUVjA5MDBfV0FSTV9TVEFSVCk7CisJCWZyZXExID0gc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBDRlIyKTsKKwkJZnJlcTAgPSBzdHYwOTAwX3JlYWRfcmVnKGludHAsIENGUjEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgQ0ZSX0FVVE9TQ0FOLCAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFNQRUNJTlZfQ09OVFJPTCwKKwkJCQkJU1RWMDkwMF9JUV9GT1JDRV9TV0FQUEVEKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1ESVNUQVRFLCAweDFjKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDEsIGZyZXExKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDAsIGZyZXEwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1ESVNUQVRFLCAweDE4KTsKKwkJaWYgKHN0djA5MDBfd2FpdF9mb3JfbG9jayhpbnRwLCBkZW1vZCwKKwkJCQlkZW1vZF90aW1lb3V0LCBmZWNfdGltZW91dCkgPT0gVFJVRSkgeworCQkJaW50cC0+cmVzdWx0W2RlbW9kXS5sb2NrZWQgPSBUUlVFOworCQkJc2lnbmFsX3R5cGUgPSBzdHYwOTAwX2dldF9zaWduYWxfcGFyYW1zKGZlKTsKKwkJCXN0djA5MDBfdHJhY2tfb3B0aW1pemF0aW9uKGZlKTsKKwkJfSBlbHNlIHsKKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBTUEVDSU5WX0NPTlRST0wsCisJCQkJCVNUVjA5MDBfSVFfRk9SQ0VfTk9STUFMKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxYyk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJJTklUMSwgZnJlcTEpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDAsIGZyZXEwKTsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxOCk7CisJCQlpZiAoc3R2MDkwMF93YWl0X2Zvcl9sb2NrKGludHAsIGRlbW9kLAorCQkJCQlkZW1vZF90aW1lb3V0LCBmZWNfdGltZW91dCkgPT0gVFJVRSkgeworCQkJCWludHAtPnJlc3VsdFtkZW1vZF0ubG9ja2VkID0gVFJVRTsKIAkJCQlzaWduYWxfdHlwZSA9IHN0djA5MDBfZ2V0X3NpZ25hbF9wYXJhbXMoZmUpOwogCQkJCXN0djA5MDBfdHJhY2tfb3B0aW1pemF0aW9uKGZlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9TUEVDSU5WX0NPTlRST0wsIFNUVjA5MDBfSVFfRk9SQ0VfTk9STUFMKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1ESVNUQVRFLCAweDFjKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDEsIGZyZXExKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDAsIGZyZXEwKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1ESVNUQVRFLCAweDE4KTsKLQkJCQlpZiAoc3R2MDkwMF93YWl0X2Zvcl9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgZGVtb2RfdGltZW91dCwgZmVjX3RpbWVvdXQpID09IFRSVUUpIHsKLQkJCQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMubG9ja2VkID0gVFJVRTsKLQkJCQkJc2lnbmFsX3R5cGUgPSBzdHYwOTAwX2dldF9zaWduYWxfcGFyYW1zKGZlKTsKLQkJCQkJc3R2MDkwMF90cmFja19vcHRpbWl6YXRpb24oZmUpOwotCQkJCX0KLQogCQkJfQogCi0JCX0gZWxzZQotCQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMubG9ja2VkID0gRkFMU0U7CisJCX0KIAotCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMubG9ja2VkID0gRkFMU0U7Ci0JCWlmIChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9IRUFERVJfTU9ERSkgPT0gU1RWMDkwMF9EVkJTX0ZPVU5EKSB7Ci0JCQlzcmF0ZSA9IHN0djA5MDBfZ2V0X3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgZGVtb2QpOwotCQkJc3JhdGUgKz0gc3R2MDkwMF9nZXRfdGltaW5nX29mZnN0KGlfcGFyYW1zLCBzcmF0ZSwgZGVtb2QpOwotCi0JCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKQotCQkJCXN0djA5MDBfc2V0X3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgc3JhdGUsIGRlbW9kKTsKLQotCQkJc3R2MDkwMF9nZXRfbG9ja190aW1lb3V0KCZkZW1vZF90aW1lb3V0LCAmZmVjX3RpbWVvdXQsIHNyYXRlLCBTVFYwOTAwX1dBUk1fU1RBUlQpOwotCQkJZnJlcTEgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlIyKTsKLQkJCWZyZXEwID0gc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0NGUl9BVVRPU0NBTiwgMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1NQRUNJTlZfQ09OVFJPTCwgU1RWMDkwMF9JUV9GT1JDRV9TV0FQUEVEKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MUMpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUklOSVQxLCBmcmVxMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSSU5JVDAsIGZyZXEwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MTgpOwotCi0JCQlpZiAoc3R2MDkwMF93YWl0X2Zvcl9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgZGVtb2RfdGltZW91dCwgZmVjX3RpbWVvdXQpID09IFRSVUUpIHsKLQkJCQlpX3BhcmFtcy0+ZG1kMl9yc2x0cy5sb2NrZWQgPSBUUlVFOwotCQkJCXNpZ25hbF90eXBlID0gc3R2MDkwMF9nZXRfc2lnbmFsX3BhcmFtcyhmZSk7Ci0JCQkJc3R2MDkwMF90cmFja19vcHRpbWl6YXRpb24oZmUpOwotCQkJfSBlbHNlIHsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1NQRUNJTlZfQ09OVFJPTCwgU1RWMDkwMF9JUV9GT1JDRV9OT1JNQUwpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MWMpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMSwgZnJlcTEpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMCwgZnJlcTApOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4MTgpOwotCi0JCQkJaWYgKHN0djA5MDBfd2FpdF9mb3JfbG9jayhpX3BhcmFtcywgZGVtb2QsIGRlbW9kX3RpbWVvdXQsIGZlY190aW1lb3V0KSA9PSBUUlVFKSB7Ci0JCQkJCWlfcGFyYW1zLT5kbWQyX3JzbHRzLmxvY2tlZCA9IFRSVUU7Ci0JCQkJCXNpZ25hbF90eXBlID0gc3R2MDkwMF9nZXRfc2lnbmFsX3BhcmFtcyhmZSk7Ci0JCQkJCXN0djA5MDBfdHJhY2tfb3B0aW1pemF0aW9uKGZlKTsKLQkJCQl9Ci0KLQkJCX0KLQotCQl9IGVsc2UKLQkJCWlfcGFyYW1zLT5kbWQxX3JzbHRzLmxvY2tlZCA9IEZBTFNFOwotCi0JCWJyZWFrOwotCX0KKwl9IGVsc2UKKwkJaW50cC0+cmVzdWx0W2RlbW9kXS5sb2NrZWQgPSBGQUxTRTsKIAogCXJldHVybiBzaWduYWxfdHlwZTsKIH0KIAotc3RhdGljIHUxNiBzdHYwOTAwX2JsaW5kX2NoZWNrX2FnYzJfbWluX2xldmVsKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK3N0YXRpYyB1MTYgc3R2MDkwMF9ibGluZF9jaGVja19hZ2MyX21pbl9sZXZlbChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCwKIAkJCQkJZW51bSBmZV9zdHYwOTAwX2RlbW9kX251bSBkZW1vZCkKIHsKIAl1MzIgbWluYWdjMmxldmVsID0gMHhmZmZmLApAQCAtMTgyMCwxMDUgKzEzMjQsNTQgQEAKIAogCXMzMiBpLCBqLCBuYl9zdGVwcywgZGlyZWN0aW9uOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBfX2Z1bmNfXyk7CisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKIAotCXN3aXRjaCAoZGVtb2QpIHsKLQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQlkZWZhdWx0OgotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQUdDMlJFRiwgMHgzOCk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfU0NBTl9FTkFCTEUsIDEpOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0NGUl9BVVRPU0NBTiwgMSk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUdDMlJFRiwgMHgzOCk7CisJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFNDQU5fRU5BQkxFLCAwKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgQ0ZSX0FVVE9TQ0FOLCAwKTsKIAotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfU0ZSVVAxLCAweDgzKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUlVQMCwgMHhjMCk7CisJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIEFVVE9fR1VQLCAxKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgQVVUT19HTE9XLCAxKTsKIAotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfU0ZSTE9XMSwgMHg4Mik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJMT1cwLCAweGEwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRFQwTSwgMHgwKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURUME0sIDB4MCk7CiAKLQkJc3R2MDkwMF9zZXRfc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCAxMDAwMDAwLCBkZW1vZCk7Ci0JCW5iX3N0ZXBzID0gLTEgKyAoaV9wYXJhbXMtPmRtZDFfc3JjaF9yYW5nZSAvIDEwMDAwMDApOwotCQluYl9zdGVwcyAvPSAyOwotCQluYl9zdGVwcyA9ICgyICogbmJfc3RlcHMpICsgMTsKKwlzdHYwOTAwX3NldF9zeW1ib2xfcmF0ZShpbnRwLCBpbnRwLT5tY2xrLCAxMDAwMDAwLCBkZW1vZCk7CisJbmJfc3RlcHMgPSAtMSArIChpbnRwLT5zcmNoX3JhbmdlW2RlbW9kXSAvIDEwMDAwMDApOworCW5iX3N0ZXBzIC89IDI7CisJbmJfc3RlcHMgPSAoMiAqIG5iX3N0ZXBzKSArIDE7CiAKLQkJaWYgKG5iX3N0ZXBzIDwgMCkKLQkJCW5iX3N0ZXBzID0gMTsKKwlpZiAobmJfc3RlcHMgPCAwKQorCQluYl9zdGVwcyA9IDE7CiAKLQkJZGlyZWN0aW9uID0gMTsKKwlkaXJlY3Rpb24gPSAxOwogCi0JCWZyZXFfc3RlcCA9ICgxMDAwMDAwIDw8IDgpIC8gKGlfcGFyYW1zLT5tY2xrID4+IDgpOworCWZyZXFfc3RlcCA9ICgxMDAwMDAwIDw8IDgpIC8gKGludHAtPm1jbGsgPj4gOCk7CiAKLQkJaW5pdF9mcmVxID0gMDsKKwlpbml0X2ZyZXEgPSAwOwogCi0JCWZvciAoaSA9IDA7IGkgPCBuYl9zdGVwczsgaSsrKSB7Ci0JCQlpZiAoZGlyZWN0aW9uID4gMCkKLQkJCQlpbml0X2ZyZXEgPSBpbml0X2ZyZXEgKyAoZnJlcV9zdGVwICogaSk7Ci0JCQllbHNlCi0JCQkJaW5pdF9mcmVxID0gaW5pdF9mcmVxIC0gKGZyZXFfc3RlcCAqIGkpOworCWZvciAoaSA9IDA7IGkgPCBuYl9zdGVwczsgaSsrKSB7CisJCWlmIChkaXJlY3Rpb24gPiAwKQorCQkJaW5pdF9mcmVxID0gaW5pdF9mcmVxICsgKGZyZXFfc3RlcCAqIGkpOworCQllbHNlCisJCQlpbml0X2ZyZXEgPSBpbml0X2ZyZXEgLSAoZnJlcV9zdGVwICogaSk7CiAKLQkJCWRpcmVjdGlvbiAqPSAtMTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4NUMpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQxLCAoaW5pdF9mcmVxID4+IDgpICYgMHhmZik7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDAsIGluaXRfZnJlcSAgJiAweGZmKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4NTgpOwotCQkJbXNsZWVwKDEwKTsKLQkJCWFnYzJsZXZlbCA9IDA7CisJCWRpcmVjdGlvbiAqPSAtMTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1ESVNUQVRFLCAweDVDKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDEsIChpbml0X2ZyZXEgPj4gOCkgJiAweGZmKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDAsIGluaXRfZnJlcSAgJiAweGZmKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1ESVNUQVRFLCAweDU4KTsKKwkJbXNsZWVwKDEwKTsKKwkJYWdjMmxldmVsID0gMDsKIAotCQkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCi0JCQkJYWdjMmxldmVsICs9IChzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BR0MySTEpIDw8IDgpCi0JCQkJCQl8IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FHQzJJMCk7CisJCWZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorCQkJYWdjMmxldmVsICs9IChzdHYwOTAwX3JlYWRfcmVnKGludHAsIEFHQzJJMSkgPDwgOCkKKwkJCQkJfCBzdHYwOTAwX3JlYWRfcmVnKGludHAsIEFHQzJJMCk7CiAKLQkJCWFnYzJsZXZlbCAvPSAxMDsKKwkJYWdjMmxldmVsIC89IDEwOwogCi0JCQlpZiAoYWdjMmxldmVsIDwgbWluYWdjMmxldmVsKQotCQkJCW1pbmFnYzJsZXZlbCA9IGFnYzJsZXZlbDsKLQkJfQotCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FHQzJSRUYsIDB4MzgpOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1NDQU5fRU5BQkxFLCAxKTsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9DRlJfQVVUT1NDQU4sIDEpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSVVAxLCAweDgzKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUlVQMCwgMHhjMCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9TRlJMT1cxLCAweDgyKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUkxPVzAsIDB4YTApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1EVDBNLCAweDApOwotCQlzdHYwOTAwX3NldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIDEwMDAwMDAsIGRlbW9kKTsKLQkJbmJfc3RlcHMgPSAtMSArIChpX3BhcmFtcy0+ZG1kMl9zcmNoX3JhbmdlIC8gMTAwMDAwMCk7Ci0JCW5iX3N0ZXBzIC89IDI7Ci0JCW5iX3N0ZXBzID0gKDIgKiBuYl9zdGVwcykgKyAxOworCQlpZiAoYWdjMmxldmVsIDwgbWluYWdjMmxldmVsKQorCQkJbWluYWdjMmxldmVsID0gYWdjMmxldmVsOwogCi0JCWlmIChuYl9zdGVwcyA8IDApCi0JCQluYl9zdGVwcyA9IDE7Ci0KLQkJZGlyZWN0aW9uID0gMTsKLQkJZnJlcV9zdGVwID0gKDEwMDAwMDAgPDwgOCkgLyAoaV9wYXJhbXMtPm1jbGsgPj4gOCk7Ci0JCWluaXRfZnJlcSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBuYl9zdGVwczsgaSsrKSB7Ci0JCQlpZiAoZGlyZWN0aW9uID4gMCkKLQkJCQlpbml0X2ZyZXEgPSBpbml0X2ZyZXEgKyAoZnJlcV9zdGVwICogaSk7Ci0JCQllbHNlCi0JCQkJaW5pdF9mcmVxID0gaW5pdF9mcmVxIC0gKGZyZXFfc3RlcCAqIGkpOwotCi0JCQlkaXJlY3Rpb24gKj0gLTE7Ci0KLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4NUMpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NGUklOSVQxLCAoaW5pdF9mcmVxID4+IDgpICYgMHhmZik7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSSU5JVDAsIGluaXRfZnJlcSAgJiAweGZmKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURJU1RBVEUsIDB4NTgpOwotCi0JCQltc2xlZXAoMTApOwotCQkJYWdjMmxldmVsID0gMDsKLQkJCWZvciAoaiA9IDA7IGogPCAxMDsgaisrKQotCQkJCWFnYzJsZXZlbCArPSAoc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQUdDMkkxKSA8PCA4KQotCQkJCQkJfCBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BR0MySTApOwotCi0JCQlhZ2MybGV2ZWwgLz0gMTA7Ci0KLQkJCWlmIChhZ2MybGV2ZWwgPCBtaW5hZ2MybGV2ZWwpCi0JCQkJbWluYWdjMmxldmVsID0gYWdjMmxldmVsOwotCQl9Ci0JCWJyZWFrOwogCX0KIAogCXJldHVybiAodTE2KW1pbmFnYzJsZXZlbDsKQEAgLTE5MjcsMzM2ICsxMzgwLDE5MiBAQAogc3RhdGljIHUzMiBzdHYwOTAwX3NlYXJjaF9zcmF0ZV9jb2Fyc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Jc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zID0gc3RhdGUtPmludGVybmFsOworCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwID0gc3RhdGUtPmludGVybmFsOwogCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QgPSBzdGF0ZS0+ZGVtb2Q7Ci0JaW50IHRpbWluZ0xvY2sgPSBGQUxTRTsKKwlpbnQgdGltaW5nX2xjayA9IEZBTFNFOwogCXMzMiBpLCB0aW1pbmdjcHQgPSAwLAogCQlkaXJlY3Rpb24gPSAxLAogCQluYl9zdGVwcywKIAkJY3VycmVudF9zdGVwID0gMCwKIAkJdHVuZXJfZnJlcTsKKwl1MzIgYWdjMl90aCwKKwkJY29hcnNlX3NyYXRlID0gMCwKKwkJYWdjMl9pbnRlZ3IgPSAwLAorCQljdXJyaWVyX3N0ZXAgPSAxMjAwOwogCi0JdTMyIGNvYXJzZV9zcmF0ZSA9IDAsIGFnYzJfaW50ZWdyID0gMCwgY3Vycmllcl9zdGVwID0gMTIwMDsKKwlpZiAoaW50cC0+Y2hpcF9pZCA+PSAweDMwKQorCQlhZ2MyX3RoID0gMHgyZTAwOworCWVsc2UKKwkJYWdjMl90aCA9IDB4MWYwMDsKIAotCXN3aXRjaCAoZGVtb2QpIHsKLQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQlkZWZhdWx0OgotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0kyQ19ERU1PRF9NT0RFLCAweDFGKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1RNR0NGRywgMHgxMik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdUSFJJU0UsIDB4ZjApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVE1HVEhGQUxMLCAweGUwKTsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9TQ0FOX0VOQUJMRSwgMSk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfQ0ZSX0FVVE9TQ0FOLCAxKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUlVQMSwgMHg4Myk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJVUDAsIDB4YzApOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfU0ZSTE9XMSwgMHg4Mik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJMT1cwLCAweGEwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRFQwTSwgMHgwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FHQzJSRUYsIDB4NTApOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBERU1PRF9NT0RFLCAweDFmKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBUTUdDRkcsIDB4MTIpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFRNR1RIUklTRSwgMHhmMCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVE1HVEhGQUxMLCAweGUwKTsKKwlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgU0NBTl9FTkFCTEUsIDEpOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBDRlJfQVVUT1NDQU4sIDEpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUlVQMSwgMHg4Myk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSVVAwLCAweGMwKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBTRlJMT1cxLCAweDgyKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBTRlJMT1cwLCAweGEwKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURUME0sIDB4MCk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUdDMlJFRiwgMHg1MCk7CiAKLQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApIHsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJGUkVRLCAweDZhKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJTVEVQLCAweDk1KTsKLQkJfSBlbHNlIHsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJGUkVRLCAweGVkKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJTVEVQLCAweDczKTsKLQkJfQotCi0JCWlmIChpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSA8PSAyMDAwMDAwKQotCQkJY3Vycmllcl9zdGVwID0gMTAwMDsKLQkJZWxzZSBpZiAoaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGUgPD0gNTAwMDAwMCkKLQkJCWN1cnJpZXJfc3RlcCA9IDIwMDA7Ci0JCWVsc2UgaWYgKGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlIDw9IDEyMDAwMDAwKQotCQkJY3Vycmllcl9zdGVwID0gMzAwMDsKLQkJZWxzZQotCQkJY3Vycmllcl9zdGVwID0gNTAwMDsKLQotCQluYl9zdGVwcyA9IC0xICsgKChpX3BhcmFtcy0+ZG1kMV9zcmNoX3JhbmdlIC8gMTAwMCkgLyBjdXJyaWVyX3N0ZXApOwotCQluYl9zdGVwcyAvPSAyOwotCQluYl9zdGVwcyA9ICgyICogbmJfc3RlcHMpICsgMTsKLQotCQlpZiAobmJfc3RlcHMgPCAwKQotCQkJbmJfc3RlcHMgPSAxOwotCi0JCWVsc2UgaWYgKG5iX3N0ZXBzID4gMTApIHsKLQkJCW5iX3N0ZXBzID0gMTE7Ci0JCQljdXJyaWVyX3N0ZXAgPSAoaV9wYXJhbXMtPmRtZDFfc3JjaF9yYW5nZSAvIDEwMDApIC8gMTA7Ci0JCX0KLQotCQljdXJyZW50X3N0ZXAgPSAwOwotCi0JCWRpcmVjdGlvbiA9IDE7Ci0JCXR1bmVyX2ZyZXEgPSBpX3BhcmFtcy0+dHVuZXIxX2ZyZXE7Ci0KLQkJd2hpbGUgKCh0aW1pbmdMb2NrID09IEZBTFNFKSAmJiAoY3VycmVudF9zdGVwIDwgbmJfc3RlcHMpKSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1ESVNUQVRFLCAweDVGKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfSTJDX0RFTU9EX01PREUsIDB4MCk7Ci0KLQkJCW1zbGVlcCg1MCk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX1RNR0xPQ0tfUVVBTElUWSkgPj0gMikKLQkJCQkJdGltaW5nY3B0Kys7Ci0KLQkJCQlhZ2MyX2ludGVnciArPSAoc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQUdDMkkxKSA8PCA4KSB8IHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FHQzJJMCk7Ci0KLQkJCX0KLQotCQkJYWdjMl9pbnRlZ3IgLz0gMTA7Ci0JCQljb2Fyc2Vfc3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGRlbW9kKTsKLQkJCWN1cnJlbnRfc3RlcCsrOwotCQkJZGlyZWN0aW9uICo9IC0xOwotCi0JCQlkcHJpbnRrKCJsb2NrOiBJMkNfREVNT0RfTU9ERV9GSUVMRCA9MC4gU2VhcmNoIHN0YXJ0ZWQuIHR1bmVyIGZyZXE9JWQgYWdjMj0weCV4IHNyYXRlX2NvYXJzZT0lZCB0bWdfY3B0PSVkXG4iLCB0dW5lcl9mcmVxLCBhZ2MyX2ludGVnciwgY29hcnNlX3NyYXRlLCB0aW1pbmdjcHQpOwotCi0JCQlpZiAoKHRpbWluZ2NwdCA+PSA1KSAmJiAoYWdjMl9pbnRlZ3IgPCAweDFGMDApICYmIChjb2Fyc2Vfc3JhdGUgPCA1NTAwMDAwMCkgJiYgKGNvYXJzZV9zcmF0ZSA+IDg1MDAwMCkpIHsKLQkJCQl0aW1pbmdMb2NrID0gVFJVRTsKLQkJCX0KLQotCQkJZWxzZSBpZiAoY3VycmVudF9zdGVwIDwgbmJfc3RlcHMpIHsKLQkJCQlpZiAoZGlyZWN0aW9uID4gMCkKLQkJCQkJdHVuZXJfZnJlcSArPSAoY3VycmVudF9zdGVwICogY3Vycmllcl9zdGVwKTsKLQkJCQllbHNlCi0JCQkJCXR1bmVyX2ZyZXEgLT0gKGN1cnJlbnRfc3RlcCAqIGN1cnJpZXJfc3RlcCk7Ci0KLQkJCQlzdHYwOTAwX3NldF90dW5lcihmZSwgdHVuZXJfZnJlcSwgaV9wYXJhbXMtPnR1bmVyMV9idyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGltaW5nTG9jayA9PSBGQUxTRSkKLQkJCWNvYXJzZV9zcmF0ZSA9IDA7Ci0JCWVsc2UKLQkJCWNvYXJzZV9zcmF0ZSA9IHN0djA5MDBfZ2V0X3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgZGVtb2QpOwotCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9JMkNfREVNT0RfTU9ERSwgMHgxRik7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTUdDRkcsIDB4MTIpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HVEhSSVNFLCAweGYwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1RNR1RIRkFMTCwgMHhlMCk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfU0NBTl9FTkFCTEUsIDEpOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX0NGUl9BVVRPU0NBTiwgMSk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9TRlJVUDEsIDB4ODMpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSVVAwLCAweGMwKTsKLQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUkxPVzEsIDB4ODIpOwotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSTE9XMCwgMHhhMCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9ETURUME0sIDB4MCk7Ci0JCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BR0MyUkVGLCAweDUwKTsKLQotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkZSRVEsIDB4NmEpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUlNURVAsIDB4OTUpOwotCQl9IGVsc2UgewotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkZSRVEsIDB4ZWQpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUlNURVAsIDB4NzMpOwotCQl9Ci0KLQkJaWYgKGlfcGFyYW1zLT5kbWQyX3N5bWJvbF9yYXRlIDw9IDIwMDAwMDApCi0JCQljdXJyaWVyX3N0ZXAgPSAxMDAwOwotCQllbHNlIGlmIChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA8PSA1MDAwMDAwKQotCQkJY3Vycmllcl9zdGVwID0gMjAwMDsKLQkJZWxzZSBpZiAoaV9wYXJhbXMtPmRtZDJfc3ltYm9sX3JhdGUgPD0gMTIwMDAwMDApCi0JCQljdXJyaWVyX3N0ZXAgPSAzMDAwOwotCQllbHNlCi0JCQljdXJyaWVyX3N0ZXAgPSA1MDAwOwotCi0KLQkJbmJfc3RlcHMgPSAtMSArICgoaV9wYXJhbXMtPmRtZDJfc3JjaF9yYW5nZSAvIDEwMDApIC8gY3Vycmllcl9zdGVwKTsKLQkJbmJfc3RlcHMgLz0gMjsKLQkJbmJfc3RlcHMgPSAoMiAqIG5iX3N0ZXBzKSArIDE7Ci0KLQkJaWYgKG5iX3N0ZXBzIDwgMCkKLQkJCW5iX3N0ZXBzID0gMTsKLQkJZWxzZSBpZiAobmJfc3RlcHMgPiAxMCkgewotCQkJbmJfc3RlcHMgPSAxMTsKLQkJCWN1cnJpZXJfc3RlcCA9IChpX3BhcmFtcy0+ZG1kMl9zcmNoX3JhbmdlIC8gMTAwMCkgLyAxMDsKLQkJfQotCi0JCWN1cnJlbnRfc3RlcCA9IDA7Ci0JCWRpcmVjdGlvbiA9IDE7Ci0JCXR1bmVyX2ZyZXEgPSBpX3BhcmFtcy0+dHVuZXIyX2ZyZXE7Ci0KLQkJd2hpbGUgKCh0aW1pbmdMb2NrID09IEZBTFNFKSAmJiAoY3VycmVudF9zdGVwIDwgbmJfc3RlcHMpKSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1ESVNUQVRFLCAweDVGKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfSTJDX0RFTU9EX01PREUsIDB4MCk7Ci0KLQkJCW1zbGVlcCg1MCk7Ci0JCQl0aW1pbmdjcHQgPSAwOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgewotCQkJCWlmIChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9UTUdMT0NLX1FVQUxJVFkpID49IDIpCi0JCQkJCXRpbWluZ2NwdCsrOwotCQkJCWFnYzJfaW50ZWdyICs9IChzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BR0MySTEpIDw8IDgpCi0JCQkJCQkJCXwgc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQUdDMkkwKTsKLQkJCX0KLQotCQkJYWdjMl9pbnRlZ3IgLz0gMjA7Ci0JCQljb2Fyc2Vfc3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGRlbW9kKTsKLQkJCWlmICgodGltaW5nY3B0ID49IDEwKSAmJiAoYWdjMl9pbnRlZ3IgPCAweDFGMDApICYmIChjb2Fyc2Vfc3JhdGUgPCA1NTAwMDAwMCkgJiYgKGNvYXJzZV9zcmF0ZSA+IDg1MDAwMCkpCi0JCQkJdGltaW5nTG9jayA9IFRSVUU7Ci0JCQllbHNlIHsKLQkJCQljdXJyZW50X3N0ZXArKzsKLQkJCQlkaXJlY3Rpb24gKj0gLTE7Ci0KLQkJCQlpZiAoZGlyZWN0aW9uID4gMCkKLQkJCQkJdHVuZXJfZnJlcSArPSAoY3VycmVudF9zdGVwICogY3Vycmllcl9zdGVwKTsKLQkJCQllbHNlCi0JCQkJCXR1bmVyX2ZyZXEgLT0gKGN1cnJlbnRfc3RlcCAqIGN1cnJpZXJfc3RlcCk7Ci0KLQkJCQlzdHYwOTAwX3NldF90dW5lcihmZSwgdHVuZXJfZnJlcSwgaV9wYXJhbXMtPnR1bmVyMl9idyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGltaW5nTG9jayA9PSBGQUxTRSkKLQkJCWNvYXJzZV9zcmF0ZSA9IDA7Ci0JCWVsc2UKLQkJCWNvYXJzZV9zcmF0ZSA9IHN0djA5MDBfZ2V0X3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgZGVtb2QpOwotCQlicmVhazsKKwlpZiAoaW50cC0+Y2hpcF9pZCA+PSAweDMwKSB7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4OTkpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBTRlJTVEVQLCAweDk4KTsKKwl9IGVsc2UgaWYgKGludHAtPmNoaXBfaWQgPj0gMHgyMCkgeworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJGUkVRLCAweDZhKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSU1RFUCwgMHg5NSk7CisJfSBlbHNlIHsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSRlJFUSwgMHhlZCk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUlNURVAsIDB4NzMpOwogCX0KIAorCWlmIChpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPD0gMjAwMDAwMCkKKwkJY3Vycmllcl9zdGVwID0gMTAwMDsKKwllbHNlIGlmIChpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPD0gNTAwMDAwMCkKKwkJY3Vycmllcl9zdGVwID0gMjAwMDsKKwllbHNlIGlmIChpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPD0gMTIwMDAwMDApCisJCWN1cnJpZXJfc3RlcCA9IDMwMDA7CisJZWxzZQorCQkJY3Vycmllcl9zdGVwID0gNTAwMDsKKworCW5iX3N0ZXBzID0gLTEgKyAoKGludHAtPnNyY2hfcmFuZ2VbZGVtb2RdIC8gMTAwMCkgLyBjdXJyaWVyX3N0ZXApOworCW5iX3N0ZXBzIC89IDI7CisJbmJfc3RlcHMgPSAoMiAqIG5iX3N0ZXBzKSArIDE7CisKKwlpZiAobmJfc3RlcHMgPCAwKQorCQluYl9zdGVwcyA9IDE7CisJZWxzZSBpZiAobmJfc3RlcHMgPiAxMCkgeworCQluYl9zdGVwcyA9IDExOworCQljdXJyaWVyX3N0ZXAgPSAoaW50cC0+c3JjaF9yYW5nZVtkZW1vZF0gLyAxMDAwKSAvIDEwOworCX0KKworCWN1cnJlbnRfc3RlcCA9IDA7CisJZGlyZWN0aW9uID0gMTsKKworCXR1bmVyX2ZyZXEgPSBpbnRwLT5mcmVxW2RlbW9kXTsKKworCXdoaWxlICgodGltaW5nX2xjayA9PSBGQUxTRSkgJiYgKGN1cnJlbnRfc3RlcCA8IG5iX3N0ZXBzKSkgeworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURJU1RBVEUsIDB4NWYpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgREVNT0RfTU9ERSwgMCk7CisKKwkJbXNsZWVwKDUwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJaWYgKHN0djA5MDBfZ2V0X2JpdHMoaW50cCwgVE1HTE9DS19RVUFMSVRZKSA+PSAyKQorCQkJCXRpbWluZ2NwdCsrOworCisJCQlhZ2MyX2ludGVnciArPSAoc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBBR0MySTEpIDw8IDgpIHwKKwkJCQkJc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBBR0MySTApOworCQl9CisKKwkJYWdjMl9pbnRlZ3IgLz0gMTA7CisJCWNvYXJzZV9zcmF0ZSA9IHN0djA5MDBfZ2V0X3N5bWJvbF9yYXRlKGludHAsIGludHAtPm1jbGssIGRlbW9kKTsKKwkJY3VycmVudF9zdGVwKys7CisJCWRpcmVjdGlvbiAqPSAtMTsKKworCQlkcHJpbnRrKCJsb2NrOiBJMkNfREVNT0RfTU9ERV9GSUVMRCA9MC4gU2VhcmNoIHN0YXJ0ZWQuIgorCQkJIiB0dW5lciBmcmVxPSVkIGFnYzI9MHgleCBzcmF0ZV9jb2Fyc2U9JWQgdG1nX2NwdD0lZFxuIiwKKwkJCXR1bmVyX2ZyZXEsIGFnYzJfaW50ZWdyLCBjb2Fyc2Vfc3JhdGUsIHRpbWluZ2NwdCk7CisKKwkJaWYgKCh0aW1pbmdjcHQgPj0gNSkgJiYKKwkJCQkoYWdjMl9pbnRlZ3IgPCBhZ2MyX3RoKSAmJgorCQkJCShjb2Fyc2Vfc3JhdGUgPCA1NTAwMDAwMCkgJiYKKwkJCQkoY29hcnNlX3NyYXRlID4gODUwMDAwKSkKKwkJCXRpbWluZ19sY2sgPSBUUlVFOworCQllbHNlIGlmIChjdXJyZW50X3N0ZXAgPCBuYl9zdGVwcykgeworCQkJaWYgKGRpcmVjdGlvbiA+IDApCisJCQkJdHVuZXJfZnJlcSArPSAoY3VycmVudF9zdGVwICogY3Vycmllcl9zdGVwKTsKKwkJCWVsc2UKKwkJCQl0dW5lcl9mcmVxIC09IChjdXJyZW50X3N0ZXAgKiBjdXJyaWVyX3N0ZXApOworCisJCQlzdHYwOTAwX3NldF90dW5lcihmZSwgdHVuZXJfZnJlcSwgaW50cC0+YndbZGVtb2RdKTsKKwkJfQorCX0KKworCWlmICh0aW1pbmdfbGNrID09IEZBTFNFKQorCQljb2Fyc2Vfc3JhdGUgPSAwOworCWVsc2UKKwkJY29hcnNlX3NyYXRlID0gc3R2MDkwMF9nZXRfc3ltYm9sX3JhdGUoaW50cCwgaW50cC0+bWNsaywgZGVtb2QpOworCiAJcmV0dXJuIGNvYXJzZV9zcmF0ZTsKIH0KIAogc3RhdGljIHUzMiBzdHYwOTAwX3NlYXJjaF9zcmF0ZV9maW5lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwotCXUzMiBjb2Fyc2Vfc3JhdGUsCi0JY29hcnNlX2ZyZXEsCi0Jc3ltYjsKKwl1MzIJY29hcnNlX3NyYXRlLAorCQljb2Fyc2VfZnJlcSwKKwkJc3ltYiwKKwkJc3ltYm1heCwKKwkJc3ltYm1pbiwKKwkJc3ltYmNvbXA7CiAKLQljb2Fyc2Vfc3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGRlbW9kKTsKKwljb2Fyc2Vfc3JhdGUgPSBzdHYwOTAwX2dldF9zeW1ib2xfcmF0ZShpbnRwLCBpbnRwLT5tY2xrLCBkZW1vZCk7CiAKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJY29hcnNlX2ZyZXEgPSAoc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSMikgPDwgOCkKLQkJCQkJCXwgc3R2MDkwMF9yZWFkX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSMSk7Ci0JCXN5bWIgPSAxMyAqIChjb2Fyc2Vfc3JhdGUgLyAxMCk7CisJaWYgKGNvYXJzZV9zcmF0ZSA+IDMwMDAwMDApIHsKKwkJc3ltYm1heCA9IDEzICogKGNvYXJzZV9zcmF0ZSAvIDEwKTsKKwkJc3ltYm1heCA9IChzeW1ibWF4IC8gMTAwMCkgKiA2NTUzNjsKKwkJc3ltYm1heCAvPSAoaW50cC0+bWNsayAvIDEwMDApOwogCi0JCWlmIChzeW1iIDwgaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGUpCi0JCQljb2Fyc2Vfc3JhdGUgPSAwOwotCQllbHNlIHsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MUYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1RNR0NGRzIsIDB4MDEpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1RNR1RIUklTRSwgMHgyMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVE1HVEhGQUxMLCAweDAwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdDRkcsIDB4ZDIpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9DRlJfQVVUT1NDQU4sIDApOworCQlzeW1ibWluID0gMTAgKiAoY29hcnNlX3NyYXRlIC8gMTMpOworCQlzeW1ibWluID0gKHN5bWJtaW4gLyAxMDAwKSo2NTUzNjsKKwkJc3ltYm1pbiAvPSAoaW50cC0+bWNsayAvIDEwMDApOwogCi0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSRlJFUSwgMHg0OSk7Ci0JCQllbHNlCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NBUkZSRVEsIDB4ZWQpOworCQlzeW1iID0gKGNvYXJzZV9zcmF0ZSAvIDEwMDApICogNjU1MzY7CisJCXN5bWIgLz0gKGludHAtPm1jbGsgLyAxMDAwKTsKKwl9IGVsc2UgeworCQlzeW1ibWF4ID0gMTMgKiAoY29hcnNlX3NyYXRlIC8gMTApOworCQlzeW1ibWF4ID0gKHN5bWJtYXggLyAxMDApICogNjU1MzY7CisJCXN5bWJtYXggLz0gKGludHAtPm1jbGsgLyAxMDApOwogCi0JCQlpZiAoY29hcnNlX3NyYXRlID4gMzAwMDAwMCkgewotCQkJCXN5bWIgPSAxMyAqIChjb2Fyc2Vfc3JhdGUgLyAxMCk7Ci0JCQkJc3ltYiA9IChzeW1iIC8gMTAwMCkgKiA2NTUzNjsKLQkJCQlzeW1iIC89IChpX3BhcmFtcy0+bWNsayAvIDEwMDApOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJVUDEsIChzeW1iID4+IDgpICYgMHg3Rik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUlVQMCwgKHN5bWIgJiAweEZGKSk7CisJCXN5bWJtaW4gPSAxMCAqIChjb2Fyc2Vfc3JhdGUgLyAxNCk7CisJCXN5bWJtaW4gPSAoc3ltYm1pbiAvIDEwMCkgKiA2NTUzNjsKKwkJc3ltYm1pbiAvPSAoaW50cC0+bWNsayAvIDEwMCk7CiAKLQkJCQlzeW1iID0gMTAgKiAoY29hcnNlX3NyYXRlIC8gMTMpOwotCQkJCXN5bWIgPSAoc3ltYiAvIDEwMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDAwKTsKKwkJc3ltYiA9IChjb2Fyc2Vfc3JhdGUgLyAxMDApICogNjU1MzY7CisJCXN5bWIgLz0gKGludHAtPm1jbGsgLyAxMDApOworCX0KIAotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJMT1cxLCAoc3ltYiA+PiA4KSAmIDB4N0YpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJMT1cwLCAoc3ltYiAmIDB4RkYpKTsKKwlzeW1iY29tcCA9IDEzICogKGNvYXJzZV9zcmF0ZSAvIDEwKTsKKwkJY29hcnNlX2ZyZXEgPSAoc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBDRlIyKSA8PCA4KQorCQkJCQl8IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgQ0ZSMSk7CiAKLQkJCQlzeW1iID0gKGNvYXJzZV9zcmF0ZSAvIDEwMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDAwKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfU0ZSSU5JVDEsIChzeW1iID4+IDgpICYgMHhGRik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUklOSVQwLCAoc3ltYiAmIDB4RkYpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3ltYiA9IDEzICogKGNvYXJzZV9zcmF0ZSAvIDEwKTsKLQkJCQlzeW1iID0gKHN5bWIgLyAxMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDApOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJVUDEsIChzeW1iID4+IDgpICYgMHg3Rik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUlVQMCwgKHN5bWIgJiAweEZGKSk7CisJaWYgKHN5bWJjb21wIDwgaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdKQorCQljb2Fyc2Vfc3JhdGUgPSAwOworCWVsc2UgeworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURJU1RBVEUsIDB4MWYpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBUTUdDRkcyLCAweGMxKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVE1HVEhSSVNFLCAweDIwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVE1HVEhGQUxMLCAweDAwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVE1HQ0ZHLCAweGQyKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIENGUl9BVVRPU0NBTiwgMCk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFHQzJSRUYsIDB4MzgpOwogCi0JCQkJc3ltYiA9IDEwICogKGNvYXJzZV9zcmF0ZSAvIDE0KTsKLQkJCQlzeW1iID0gKHN5bWIgLyAxMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDApOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJMT1cxLCAoc3ltYiA+PiA4KSAmIDB4N0YpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJMT1cwLCAoc3ltYiAmIDB4RkYpKTsKKwkJaWYgKGludHAtPmNoaXBfaWQgPj0gMHgzMCkKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkZSRVEsIDB4NzkpOworCQllbHNlIGlmIChpbnRwLT5jaGlwX2lkID49IDB4MjApCisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJGUkVRLCAweDQ5KTsKKwkJZWxzZQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSRlJFUSwgMHhlZCk7CiAKLQkJCQlzeW1iID0gKGNvYXJzZV9zcmF0ZSAvIDEwMCkgKiA2NTUzNjsKLQkJCQlzeW1iIC89IChpX3BhcmFtcy0+bWNsayAvIDEwMCk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1NGUklOSVQxLCAoc3ltYiA+PiA4KSAmIDB4RkYpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9TRlJJTklUMCwgKHN5bWIgJiAweEZGKSk7Ci0JCQl9CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUlVQMSwgKHN5bWJtYXggPj4gOCkgJiAweDdmKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSVVAwLCAoc3ltYm1heCAmIDB4ZmYpKTsKIAotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0RNRFQwTSwgMHgyMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0ZSSU5JVDEsIChjb2Fyc2VfZnJlcSA+PiA4KSAmIDB4ZmYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NGUklOSVQwLCBjb2Fyc2VfZnJlcSAgJiAweGZmKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9ETURJU1RBVEUsIDB4MTUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQljb2Fyc2VfZnJlcSA9IChzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlIyKSA8PCA4KQotCQkJCQkJfCBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlIxKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSTE9XMSwgKHN5bWJtaW4gPj4gOCkgJiAweDdmKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSTE9XMCwgKHN5bWJtaW4gJiAweGZmKSk7CiAKLQkJc3ltYiA9IDEzICogKGNvYXJzZV9zcmF0ZSAvIDEwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgU0ZSSU5JVDEsIChzeW1iID4+IDgpICYgMHhmZik7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFNGUklOSVQwLCAoc3ltYiAmIDB4ZmYpKTsKIAotCQlpZiAoc3ltYiA8IGlfcGFyYW1zLT5kbWQyX3N5bWJvbF9yYXRlKQotCQkJY29hcnNlX3NyYXRlID0gMDsKLQkJZWxzZSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1ESVNUQVRFLCAweDFGKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTUdDRkcyLCAweDAxKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9UTUdUSFJJU0UsIDB4MjApOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1RNR1RIRkFMTCwgMHgwMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HQ0ZHLCAweGQyKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfQ0ZSX0FVVE9TQ0FOLCAwKTsKLQotCQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUkZSRVEsIDB4NDkpOwotCQkJZWxzZQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJGUkVRLCAweGVkKTsKLQotCQkJaWYgKGNvYXJzZV9zcmF0ZSA+IDMwMDAwMDApIHsKLQkJCQlzeW1iID0gMTMgKiAoY29hcnNlX3NyYXRlIC8gMTApOwotCQkJCXN5bWIgPSAoc3ltYiAvIDEwMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDAwKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSVVAxLCAoc3ltYiA+PiA4KSAmIDB4N0YpOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9TRlJVUDAsIChzeW1iICYgMHhGRikpOwotCi0JCQkJc3ltYiA9IDEwICogKGNvYXJzZV9zcmF0ZSAvIDEzKTsKLQkJCQlzeW1iID0gKHN5bWIgLyAxMDAwKSAqIDY1NTM2OwotCQkJCXN5bWIgLz0gKGlfcGFyYW1zLT5tY2xrIC8gMTAwMCk7Ci0KLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSTE9XMSwgKHN5bWIgPj4gOCkgJiAweDdGKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSTE9XMCwgKHN5bWIgJiAweEZGKSk7Ci0KLQkJCQlzeW1iID0gKGNvYXJzZV9zcmF0ZSAvIDEwMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDAwKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSSU5JVDEsIChzeW1iID4+IDgpICYgMHhGRik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUklOSVQwLCAoc3ltYiAmIDB4RkYpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3ltYiA9IDEzICogKGNvYXJzZV9zcmF0ZSAvIDEwKTsKLQkJCQlzeW1iID0gKHN5bWIgLyAxMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDApOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9TRlJVUDEsIChzeW1iID4+IDgpICYgMHg3Rik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUlVQMCwgKHN5bWIgJiAweEZGKSk7Ci0KLQkJCQlzeW1iID0gMTAgKiAoY29hcnNlX3NyYXRlIC8gMTQpOwotCQkJCXN5bWIgPSAoc3ltYiAvIDEwMCkgKiA2NTUzNjsKLQkJCQlzeW1iIC89IChpX3BhcmFtcy0+bWNsayAvIDEwMCk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUkxPVzEsIChzeW1iID4+IDgpICYgMHg3Rik7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1NGUkxPVzAsIChzeW1iICYgMHhGRikpOwotCi0JCQkJc3ltYiA9IChjb2Fyc2Vfc3JhdGUgLyAxMDApICogNjU1MzY7Ci0JCQkJc3ltYiAvPSAoaV9wYXJhbXMtPm1jbGsgLyAxMDApOwotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9TRlJJTklUMSwgKHN5bWIgPj4gOCkgJiAweEZGKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfU0ZSSU5JVDAsIChzeW1iICYgMHhGRikpOwotCQkJfQotCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1EVDBNLCAweDIwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DRlJJTklUMSwgKGNvYXJzZV9mcmVxID4+IDgpICYgMHhmZik7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0ZSSU5JVDAsIGNvYXJzZV9mcmVxICAmIDB4ZmYpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRElTVEFURSwgMHgxNSk7Ci0JCX0KLQotCQlicmVhazsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRE1EVDBNLCAweDIwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0ZSSU5JVDEsIChjb2Fyc2VfZnJlcSA+PiA4KSAmIDB4ZmYpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDRlJJTklUMCwgY29hcnNlX2ZyZXEgICYgMHhmZik7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHgxNSk7CiAJfQogCiAJcmV0dXJuIGNvYXJzZV9zcmF0ZTsKQEAgLTIyNjUsMTYzICsxNTc0LDEzNSBAQAogc3RhdGljIGludCBzdHYwOTAwX2JsaW5kX3NlYXJjaF9hbGdvKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzdHYwOTAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcyA9IHN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaW50cCA9IHN0YXRlLT5pbnRlcm5hbDsKIAllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kID0gc3RhdGUtPmRlbW9kOwotCXU4IGtfcmVmX3RtZywga19yZWZfdG1nX21heCwga19yZWZfdG1nX21pbjsKLQl1MzIgY29hcnNlX3NyYXRlOwotCWludCBsb2NrID0gRkFMU0UsIGNvYXJzZV9mYWlsID0gRkFMU0U7Ci0JczMyIGRlbW9kX3RpbWVvdXQgPSA1MDAsIGZlY190aW1lb3V0ID0gNTAsIGtyZWZfdG1nX3JlZywgZmFpbF9jcHQsIGksIGFnYzJfb3ZlcmZsb3c7Ci0JdTE2IGFnYzJfaW50ZWdyOwotCXU4IGRzdGF0dXMyOworCXU4CWtfcmVmX3RtZywKKwkJa19yZWZfdG1nX21heCwKKwkJa19yZWZfdG1nX21pbjsKKwl1MzIJY29hcnNlX3NyYXRlLAorCQlhZ2MyX3RoOworCWludAlsb2NrID0gRkFMU0UsCisJCWNvYXJzZV9mYWlsID0gRkFMU0U7CisJczMyCWRlbW9kX3RpbWVvdXQgPSA1MDAsCisJCWZlY190aW1lb3V0ID0gNTAsCisJCWZhaWxfY3B0LAorCQlpLAorCQlhZ2MyX292ZXJmbG93OworCXUxNglhZ2MyX2ludDsKKwl1OAlkc3RhdHVzMjsKIAotCWRwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgX19mdW5jX18pOworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPCAweDIwKSB7CisJaWYgKGludHAtPmNoaXBfaWQgPCAweDIwKSB7CiAJCWtfcmVmX3RtZ19tYXggPSAyMzM7CiAJCWtfcmVmX3RtZ19taW4gPSAxNDM7CiAJfSBlbHNlIHsKLQkJa19yZWZfdG1nX21heCA9IDEyMDsKLQkJa19yZWZfdG1nX21pbiA9IDMwOworCQlrX3JlZl90bWdfbWF4ID0gMTEwOworCQlrX3JlZl90bWdfbWluID0gMTA7CiAJfQogCi0JYWdjMl9pbnRlZ3IgPSBzdHYwOTAwX2JsaW5kX2NoZWNrX2FnYzJfbWluX2xldmVsKGlfcGFyYW1zLCBkZW1vZCk7CisJaWYgKGludHAtPmNoaXBfaWQgPD0gMHgyMCkKKwkJYWdjMl90aCA9IFNUVjA5MDBfQkxJTkRfU0VBUkNIX0FHQzJfVEg7CisJZWxzZQorCQlhZ2MyX3RoID0gU1RWMDkwMF9CTElORF9TRUFSQ0hfQUdDMl9USF9DVVQzMDsKIAotCWlmIChhZ2MyX2ludGVnciA+IFNUVjA5MDBfQkxJTkRfU0VBUkNIX0FHQzJfVEgpIHsKLQkJbG9jayA9IEZBTFNFOworCWFnYzJfaW50ID0gc3R2MDkwMF9ibGluZF9jaGVja19hZ2MyX21pbl9sZXZlbChpbnRwLCBkZW1vZCk7CiAKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGRlbW9kKSB7Ci0JCWNhc2UgU1RWMDkwMF9ERU1PRF8xOgotCQlkZWZhdWx0OgotCQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID09IDB4MTApCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0NPUlJFTEVYUCwgMHhBQSk7CisJaWYgKGFnYzJfaW50ID4gU1RWMDkwMF9CTElORF9TRUFSQ0hfQUdDMl9USCkKKwkJcmV0dXJuIEZBTFNFOwogCi0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPCAweDIwKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJIRFIsIDB4NTUpOworCWlmIChpbnRwLT5jaGlwX2lkID09IDB4MTApCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENPUlJFTEVYUCwgMHhhYSk7CiAKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVJDRkcsIDB4QzQpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1JUQ1MyLCAweDQ0KTsKKwlpZiAoaW50cC0+Y2hpcF9pZCA8IDB4MjApCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkhEUiwgMHg1NSk7CisJZWxzZQorCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVJIRFIsIDB4MjApOwogCi0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9FUVVBTENGRywgMHg0MSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0ZGRUNGRywgMHg0MSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX1ZJVFNDQUxFLCAweDgyKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVkFWU1JWSVQsIDB4MCk7Ci0JCQl9CisJaWYgKGludHAtPmNoaXBfaWQgPD0gMHgyMCkKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSQ0ZHLCAweGM0KTsKKwllbHNlCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUkNGRywgMHg2KTsKIAotCQkJa3JlZl90bWdfcmVnID0gUjA5MDBfUDFfS1JFRlRNRzsKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA9PSAweDEwKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DT1JSRUxFWFAsIDB4QUEpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFJUQ1MyLCAweDQ0KTsKIAotCQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkIDwgMHgyMCkKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ0FSSERSLCAweDU1KTsKKwlpZiAoaW50cC0+Y2hpcF9pZCA+PSAweDIwKSB7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEVRVUFMQ0ZHLCAweDQxKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRkZFQ0ZHLCAweDQxKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgVklUU0NBTEUsIDB4ODIpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBWQVZTUlZJVCwgMHgwKTsKKwl9CiAKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVJDRkcsIDB4QzQpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1JUQ1MyLCAweDQ0KTsKKwlrX3JlZl90bWcgPSBrX3JlZl90bWdfbWF4OwogCi0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9FUVVBTENGRywgMHg0MSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0ZGRUNGRywgMHg0MSk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1ZJVFNDQUxFLCAweDgyKTsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVkFWU1JWSVQsIDB4MCk7Ci0JCQl9CisJZG8geworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBLUkVGVE1HLCBrX3JlZl90bWcpOworCQlpZiAoc3R2MDkwMF9zZWFyY2hfc3JhdGVfY29hcnNlKGZlKSAhPSAwKSB7CisJCQljb2Fyc2Vfc3JhdGUgPSBzdHYwOTAwX3NlYXJjaF9zcmF0ZV9maW5lKGZlKTsKIAotCQkJa3JlZl90bWdfcmVnID0gUjA5MDBfUDJfS1JFRlRNRzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJa19yZWZfdG1nID0ga19yZWZfdG1nX21heDsKLQotCQlkbyB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywga3JlZl90bWdfcmVnLCBrX3JlZl90bWcpOwotCQkJaWYgKHN0djA5MDBfc2VhcmNoX3NyYXRlX2NvYXJzZShmZSkgIT0gMCkgewotCQkJCWNvYXJzZV9zcmF0ZSA9IHN0djA5MDBfc2VhcmNoX3NyYXRlX2ZpbmUoZmUpOwotCi0JCQkJaWYgKGNvYXJzZV9zcmF0ZSAhPSAwKSB7Ci0JCQkJCXN0djA5MDBfZ2V0X2xvY2tfdGltZW91dCgmZGVtb2RfdGltZW91dCwgJmZlY190aW1lb3V0LCBjb2Fyc2Vfc3JhdGUsIFNUVjA5MDBfQkxJTkRfU0VBUkNIKTsKLQkJCQkJbG9jayA9IHN0djA5MDBfZ2V0X2RlbW9kX2xvY2soaV9wYXJhbXMsIGRlbW9kLCBkZW1vZF90aW1lb3V0KTsKLQkJCQl9IGVsc2UKLQkJCQkJbG9jayA9IEZBTFNFOwotCQkJfSBlbHNlIHsKLQkJCQlmYWlsX2NwdCA9IDA7Ci0JCQkJYWdjMl9vdmVyZmxvdyA9IDA7Ci0KLQkJCQlzd2l0Y2ggKGRlbW9kKSB7Ci0JCQkJY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQkJCWFnYzJfaW50ZWdyID0gKHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0FHQzJJMSkgPDwgOCkKLQkJCQkJCQkJfCBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BR0MySTApOwotCi0JCQkJCQlpZiAoYWdjMl9pbnRlZ3IgPj0gMHhmZjAwKQotCQkJCQkJCWFnYzJfb3ZlcmZsb3crKzsKLQotCQkJCQkJZHN0YXR1czIgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9EU1RBVFVTMik7Ci0KLQkJCQkJCWlmICgoKGRzdGF0dXMyICYgMHgxKSA9PSAweDEpICYmICgoZHN0YXR1czIgPj4gNykgPT0gMSkpCi0JCQkJCQkJZmFpbF9jcHQrKzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQkJCWFnYzJfaW50ZWdyID0gKHN0djA5MDBfcmVhZF9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FHQzJJMSkgPDwgOCkKLQkJCQkJCQkJfCBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BR0MySTApOwotCi0JCQkJCQlpZiAoYWdjMl9pbnRlZ3IgPj0gMHhmZjAwKQotCQkJCQkJCWFnYzJfb3ZlcmZsb3crKzsKLQotCQkJCQkJZHN0YXR1czIgPSBzdHYwOTAwX3JlYWRfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9EU1RBVFVTMik7Ci0KLQkJCQkJCWlmICgoKGRzdGF0dXMyICYgMHgxKSA9PSAweDEpICYmICgoZHN0YXR1czIgPj4gNykgPT0gMSkpCi0JCQkJCQkJZmFpbF9jcHQrKzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAoKGZhaWxfY3B0ID4gNykgfHwgKGFnYzJfb3ZlcmZsb3cgPiA3KSkKLQkJCQkJY29hcnNlX2ZhaWwgPSBUUlVFOwotCisJCQlpZiAoY29hcnNlX3NyYXRlICE9IDApIHsKKwkJCQlzdHYwOTAwX2dldF9sb2NrX3RpbWVvdXQoJmRlbW9kX3RpbWVvdXQsCisJCQkJCQkJJmZlY190aW1lb3V0LAorCQkJCQkJCWNvYXJzZV9zcmF0ZSwKKwkJCQkJCQlTVFYwOTAwX0JMSU5EX1NFQVJDSCk7CisJCQkJbG9jayA9IHN0djA5MDBfZ2V0X2RlbW9kX2xvY2soaW50cCwKKwkJCQkJCQlkZW1vZCwKKwkJCQkJCQlkZW1vZF90aW1lb3V0KTsKKwkJCX0gZWxzZQogCQkJCWxvY2sgPSBGQUxTRTsKKwkJfSBlbHNlIHsKKwkJCWZhaWxfY3B0ID0gMDsKKwkJCWFnYzJfb3ZlcmZsb3cgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJCWFnYzJfaW50ID0gKHN0djA5MDBfcmVhZF9yZWcoaW50cCwgQUdDMkkxKSA8PCA4KQorCQkJCQl8IHN0djA5MDBfcmVhZF9yZWcoaW50cCwgQUdDMkkwKTsKKworCQkJCWlmIChhZ2MyX2ludCA+PSAweGZmMDApCisJCQkJCWFnYzJfb3ZlcmZsb3crKzsKKworCQkJCWRzdGF0dXMyID0gc3R2MDkwMF9yZWFkX3JlZyhpbnRwLCBEU1RBVFVTMik7CisKKwkJCQlpZiAoKChkc3RhdHVzMiAmIDB4MSkgPT0gMHgxKSAmJgorCQkJCQkJKChkc3RhdHVzMiA+PiA3KSA9PSAxKSkKKwkJCQkJZmFpbF9jcHQrKzsKIAkJCX0KLQkJCWtfcmVmX3RtZyAtPSAzMDsKLQkJfSB3aGlsZSAoKGtfcmVmX3RtZyA+PSBrX3JlZl90bWdfbWluKSAmJiAobG9jayA9PSBGQUxTRSkgJiYgKGNvYXJzZV9mYWlsID09IEZBTFNFKSk7Ci0JfQorCisJCQlpZiAoKGZhaWxfY3B0ID4gNykgfHwgKGFnYzJfb3ZlcmZsb3cgPiA3KSkKKwkJCQljb2Fyc2VfZmFpbCA9IFRSVUU7CisKKwkJCWxvY2sgPSBGQUxTRTsKKwkJfQorCQlrX3JlZl90bWcgLT0gMzA7CisJfSB3aGlsZSAoKGtfcmVmX3RtZyA+PSBrX3JlZl90bWdfbWluKSAmJgorCQkJCShsb2NrID09IEZBTFNFKSAmJgorCQkJCShjb2Fyc2VfZmFpbCA9PSBGQUxTRSkpOwogCiAJcmV0dXJuIGxvY2s7CiB9CiAKLXN0YXRpYyB2b2lkIHN0djA5MDBfc2V0X3ZpdGVyYmlfYWNxKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppX3BhcmFtcywKK3N0YXRpYyB2b2lkIHN0djA5MDBfc2V0X3ZpdGVyYmlfYWNxKHN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwLAogCQkJCQllbnVtIGZlX3N0djA5MDBfZGVtb2RfbnVtIGRlbW9kKQogewotCXMzMiB2dGhfcmVnOworCXMzMiB2dGhfcmVnID0gVlRIMTI7CiAKLQlkcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCi0JZG1kX3JlZyh2dGhfcmVnLCBSMDkwMF9QMV9WVEgxMiwgUjA5MDBfUDJfVlRIMTIpOwotCi0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHg5Nik7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHg2NCk7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHgzNik7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHgyMyk7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHgxRSk7Ci0Jc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIHZ0aF9yZWcrKywgMHgxOSk7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgdnRoX3JlZysrLCAweDk2KTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCB2dGhfcmVnKyssIDB4NjQpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIHZ0aF9yZWcrKywgMHgzNik7CisJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgdnRoX3JlZysrLCAweDIzKTsKKwlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCB2dGhfcmVnKyssIDB4MWUpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIHZ0aF9yZWcrKywgMHgxOSk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0djA5MDBfc2V0X3NlYXJjaF9zdGFuZGFyZChzdHJ1Y3Qgc3R2MDkwMF9pbnRlcm5hbCAqaV9wYXJhbXMsCitzdGF0aWMgdm9pZCBzdHYwOTAwX3NldF9zZWFyY2hfc3RhbmRhcmQoc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmludHAsCiAJCQkJCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QpCiB7CiAKLQlpbnQgc3N0bmRyZDsKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzc3RuZHJkID0gaV9wYXJhbXMtPmRtZDFfc3JjaF9zdGFuZGFyZDsKLQlpZiAoZGVtb2QgPT0gMSkKLQkJc3N0bmRyZCA9IGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkOwotCi0Jc3dpdGNoIChzc3RuZHJkKSB7CisJc3dpdGNoIChpbnRwLT5zcmNoX3N0YW5kYXJkW2RlbW9kXSkgewogCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFZCUzE6CiAJCWRwcmludGsoIlNlYXJjaCBTdGFuZGFyZCA9IERWQlMxXG4iKTsKIAkJYnJlYWs7CkBAIC0yNDM2LDEyOSArMTcxNyw3NCBAQAogCQlicmVhazsKIAl9CiAKLQlzd2l0Y2ggKGRlbW9kKSB7Ci0JY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JZGVmYXVsdDoKLQkJc3dpdGNoIChpX3BhcmFtcy0+ZG1kMV9zcmNoX3N0YW5kYXJkKSB7Ci0JCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFZCUzE6Ci0JCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFNTOgotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9EVkJTMV9FTkFCTEUsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMV9EVkJTMl9FTkFCTEUsIDApOworCXN3aXRjaCAoaW50cC0+c3JjaF9zdGFuZGFyZFtkZW1vZF0pIHsKKwljYXNlIFNUVjA5MDBfU0VBUkNIX0RWQlMxOgorCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFNTOgorCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRFZCUzFfRU5BQkxFLCAxKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIERWQlMyX0VOQUJMRSwgMCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBTVE9QX0NMS1ZJVCwgMCk7CisJCXN0djA5MDBfc2V0X2R2YnMxX3RyYWNrX2Nhcl9sb29wKGludHAsCisJCQkJCQlkZW1vZCwKKwkJCQkJCWludHAtPnN5bWJvbF9yYXRlW2RlbW9kXSk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUjJDRkcsIDB4MjIpOwogCi0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1NUT1BfQ0xLVklUMSwgMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQUNMQywgMHgxYSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQkNMQywgMHgwOSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSMkNGRywgMHgyMik7CisJCXN0djA5MDBfc2V0X3ZpdGVyYmlfYWNxKGludHAsIGRlbW9kKTsKKwkJc3R2MDkwMF9zZXRfdml0ZXJiaV9zdGFuZGFyZChpbnRwLAorCQkJCQlpbnRwLT5zcmNoX3N0YW5kYXJkW2RlbW9kXSwKKwkJCQkJaW50cC0+ZmVjW2RlbW9kXSwgZGVtb2QpOwogCi0JCQlzdHYwOTAwX3NldF92aXRlcmJpX2FjcShpX3BhcmFtcywgZGVtb2QpOwotCQkJc3R2MDkwMF9zZXRfdml0ZXJiaV9zdGFuZGFyZChpX3BhcmFtcywKLQkJCQkJCWlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQsCi0JCQkJCQlpX3BhcmFtcy0+ZG1kMV9mZWMsIGRlbW9kKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgU1RWMDkwMF9TRUFSQ0hfRFZCUzI6Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RWQlMxX0VOQUJMRSwgMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RWQlMyX0VOQUJMRSwgMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RWQlMxX0VOQUJMRSwgMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AxX0RWQlMyX0VOQUJMRSwgMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1NUT1BfQ0xLVklUMSwgMSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQUNMQywgMHgxYSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQkNMQywgMHgwOSk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ0FSMkNGRywgMHgyNik7Ci0JCQlpZiAoaV9wYXJhbXMtPmRlbW9kX21vZGUgIT0gU1RWMDkwMF9TSU5HTEUpIHsKLQkJCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPD0gMHgxMSkKLQkJCQkJc3R2MDkwMF9zdG9wX2FsbF9zMl9tb2Rjb2QoaV9wYXJhbXMsIGRlbW9kKTsKLQkJCQllbHNlCi0JCQkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kZShpX3BhcmFtcywgZGVtb2QpOwotCi0JCQl9IGVsc2UKLQkJCQlzdHYwOTAwX2FjdGl2YXRlX3MyX21vZGNvZGVfc2luZ2xlKGlfcGFyYW1zLCBkZW1vZCk7Ci0KLQkJCXN0djA5MDBfc2V0X3ZpdGVyYmlfdHJhY3EoaV9wYXJhbXMsIGRlbW9kKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgU1RWMDkwMF9BVVRPX1NFQVJDSDoKLQkJZGVmYXVsdDoKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzFfRU5BQkxFLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzJfRU5BQkxFLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfRFZCUzJfRU5BQkxFLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfU1RPUF9DTEtWSVQxLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BQ0xDLCAweDFhKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9CQ0xDLCAweDA5KTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DQVIyQ0ZHLCAweDI2KTsKLQkJCWlmIChpX3BhcmFtcy0+ZGVtb2RfbW9kZSAhPSBTVFYwOTAwX1NJTkdMRSkgewotCQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA8PSAweDExKQotCQkJCQlzdHYwOTAwX3N0b3BfYWxsX3MyX21vZGNvZChpX3BhcmFtcywgZGVtb2QpOwotCQkJCWVsc2UKLQkJCQkJc3R2MDkwMF9hY3RpdmF0ZV9zMl9tb2Rjb2RlKGlfcGFyYW1zLCBkZW1vZCk7Ci0KLQkJCX0gZWxzZQotCQkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kZV9zaW5nbGUoaV9wYXJhbXMsIGRlbW9kKTsKLQotCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlID49IDIwMDAwMDApCi0JCQkJc3R2MDkwMF9zZXRfdml0ZXJiaV9hY3EoaV9wYXJhbXMsIGRlbW9kKTsKLQkJCWVsc2UKLQkJCQlzdHYwOTAwX3NldF92aXRlcmJpX3RyYWNxKGlfcGFyYW1zLCBkZW1vZCk7Ci0KLQkJCXN0djA5MDBfc2V0X3ZpdGVyYmlfc3RhbmRhcmQoaV9wYXJhbXMsIGlfcGFyYW1zLT5kbWQxX3NyY2hfc3RhbmRhcmQsIGlfcGFyYW1zLT5kbWQxX2ZlYywgZGVtb2QpOwotCi0JCQlicmVhazsKLQkJfQogCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJc3dpdGNoIChpX3BhcmFtcy0+ZG1kMl9zcmNoX3N0bmRyZCkgewotCQljYXNlIFNUVjA5MDBfU0VBUkNIX0RWQlMxOgotCQljYXNlIFNUVjA5MDBfU0VBUkNIX0RTUzoKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzJfRU5BQkxFLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfU1RPUF9DTEtWSVQyLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDLCAweDFhKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9CQ0xDLCAweDA5KTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVIyQ0ZHLCAweDIyKTsKLQkJCXN0djA5MDBfc2V0X3ZpdGVyYmlfYWNxKGlfcGFyYW1zLCBkZW1vZCk7Ci0JCQlzdHYwOTAwX3NldF92aXRlcmJpX3N0YW5kYXJkKGlfcGFyYW1zLCBpX3BhcmFtcy0+ZG1kMl9zcmNoX3N0bmRyZCwgaV9wYXJhbXMtPmRtZDJfZmVjLCBkZW1vZCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX1NFQVJDSF9EVkJTMjoKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzFfRU5BQkxFLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzJfRU5BQkxFLCAwKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzFfRU5BQkxFLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDJfRFZCUzJfRU5BQkxFLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfU1RPUF9DTEtWSVQyLCAxKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BQ0xDLCAweDFhKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9CQ0xDLCAweDA5KTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DQVIyQ0ZHLCAweDI2KTsKLQkJCWlmIChpX3BhcmFtcy0+ZGVtb2RfbW9kZSAhPSBTVFYwOTAwX1NJTkdMRSkKLQkJCQlzdHYwOTAwX2FjdGl2YXRlX3MyX21vZGNvZGUoaV9wYXJhbXMsIGRlbW9kKTsKKwljYXNlIFNUVjA5MDBfU0VBUkNIX0RWQlMyOgorCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRFZCUzFfRU5BQkxFLCAwKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIERWQlMyX0VOQUJMRSwgMSk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBTVE9QX0NMS1ZJVCwgMSk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFDTEMsIDB4MWEpOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBCQ0xDLCAweDA5KTsKKwkJaWYgKGludHAtPmNoaXBfaWQgPD0gMHgyMCkgLypjdXQgMS54IGFuZCAyLjAqLworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSMkNGRywgMHgyNik7CisJCWVsc2UKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENBUjJDRkcsIDB4NjYpOworCisJCWlmIChpbnRwLT5kZW1vZF9tb2RlICE9IFNUVjA5MDBfU0lOR0xFKSB7CisJCQlpZiAoaW50cC0+Y2hpcF9pZCA8PSAweDExKQorCQkJCXN0djA5MDBfc3RvcF9hbGxfczJfbW9kY29kKGludHAsIGRlbW9kKTsKIAkJCWVsc2UKLQkJCQlzdHYwOTAwX2FjdGl2YXRlX3MyX21vZGNvZGVfc2luZ2xlKGlfcGFyYW1zLCBkZW1vZCk7CisJCQkJc3R2MDkwMF9hY3RpdmF0ZV9zMl9tb2Rjb2QoaW50cCwgZGVtb2QpOwogCi0JCQlzdHYwOTAwX3NldF92aXRlcmJpX3RyYWNxKGlfcGFyYW1zLCBkZW1vZCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFYwOTAwX0FVVE9fU0VBUkNIOgotCQlkZWZhdWx0OgotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMV9FTkFCTEUsIDApOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMl9FTkFCTEUsIDApOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMV9FTkFCTEUsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9EVkJTMl9FTkFCTEUsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBGMDkwMF9TVE9QX0NMS1ZJVDIsIDApOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FDTEMsIDB4MWEpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0JDTEMsIDB4MDkpOwotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NBUjJDRkcsIDB4MjYpOwotCQkJaWYgKGlfcGFyYW1zLT5kZW1vZF9tb2RlICE9IFNUVjA5MDBfU0lOR0xFKQotCQkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kZShpX3BhcmFtcywgZGVtb2QpOworCQl9IGVsc2UKKwkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kX3NpbmdsZShpbnRwLCBkZW1vZCk7CisKKwkJc3R2MDkwMF9zZXRfdml0ZXJiaV90cmFjcShpbnRwLCBkZW1vZCk7CisKKwkJYnJlYWs7CisJY2FzZSBTVFYwOTAwX0FVVE9fU0VBUkNIOgorCWRlZmF1bHQ6CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBEVkJTMV9FTkFCTEUsIDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgRFZCUzJfRU5BQkxFLCAxKTsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFNUT1BfQ0xLVklULCAwKTsKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQUNMQywgMHgxYSk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEJDTEMsIDB4MDkpOworCQlzdHYwOTAwX3NldF9kdmJzMV90cmFja19jYXJfbG9vcChpbnRwLAorCQkJCQkJZGVtb2QsCisJCQkJCQlpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0pOworCQlpZiAoaW50cC0+Y2hpcF9pZCA8PSAweDIwKSAvKmN1dCAxLnggYW5kIDIuMCovCisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDQVIyQ0ZHLCAweDI2KTsKKwkJZWxzZQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ0FSMkNGRywgMHg2Nik7CisKKwkJaWYgKGludHAtPmRlbW9kX21vZGUgIT0gU1RWMDkwMF9TSU5HTEUpIHsKKwkJCWlmIChpbnRwLT5jaGlwX2lkIDw9IDB4MTEpCisJCQkJc3R2MDkwMF9zdG9wX2FsbF9zMl9tb2Rjb2QoaW50cCwgZGVtb2QpOwogCQkJZWxzZQotCQkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kZV9zaW5nbGUoaV9wYXJhbXMsIGRlbW9kKTsKKwkJCQlzdHYwOTAwX2FjdGl2YXRlX3MyX21vZGNvZChpbnRwLCBkZW1vZCk7CiAKLQkJCWlmIChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA+PSAyMDAwMDAwKQotCQkJCXN0djA5MDBfc2V0X3ZpdGVyYmlfYWNxKGlfcGFyYW1zLCBkZW1vZCk7Ci0JCQllbHNlCi0JCQkJc3R2MDkwMF9zZXRfdml0ZXJiaV90cmFjcShpX3BhcmFtcywgZGVtb2QpOworCQl9IGVsc2UKKwkJCXN0djA5MDBfYWN0aXZhdGVfczJfbW9kY29kX3NpbmdsZShpbnRwLCBkZW1vZCk7CiAKLQkJCXN0djA5MDBfc2V0X3ZpdGVyYmlfc3RhbmRhcmQoaV9wYXJhbXMsIGlfcGFyYW1zLT5kbWQyX3NyY2hfc3RuZHJkLCBpX3BhcmFtcy0+ZG1kMl9mZWMsIGRlbW9kKTsKLQotCQkJYnJlYWs7Ci0JCX0KKwkJc3R2MDkwMF9zZXRfdml0ZXJiaV90cmFjcShpbnRwLCBkZW1vZCk7CisJCXN0djA5MDBfc2V0X3ZpdGVyYmlfc3RhbmRhcmQoaW50cCwKKwkJCQkJCWludHAtPnNyY2hfc3RhbmRhcmRbZGVtb2RdLAorCQkJCQkJaW50cC0+ZmVjW2RlbW9kXSwgZGVtb2QpOwogCiAJCWJyZWFrOwogCX0KQEAgLTI1NjcsMTAgKzE3OTMsMTEgQEAKIGVudW0gZmVfc3R2MDkwMF9zaWduYWxfdHlwZSBzdHYwOTAwX2FsZ28oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHN0djA5MDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Jc3RydWN0IHN0djA5MDBfaW50ZXJuYWwgKmlfcGFyYW1zID0gc3RhdGUtPmludGVybmFsOworCXN0cnVjdCBzdHYwOTAwX2ludGVybmFsICppbnRwID0gc3RhdGUtPmludGVybmFsOwogCWVudW0gZmVfc3R2MDkwMF9kZW1vZF9udW0gZGVtb2QgPSBzdGF0ZS0+ZGVtb2Q7CiAKLQlzMzIgZGVtb2RfdGltZW91dCA9IDUwMCwgZmVjX3RpbWVvdXQgPSA1MCwgc3RyZWFtX21lcmdlcl9maWVsZDsKKwlzMzIgZGVtb2RfdGltZW91dCA9IDUwMCwgZmVjX3RpbWVvdXQgPSA1MDsKKwlzMzIgYXFfcG93ZXIsIGFnYzFfcG93ZXIsIGk7CiAKIAlpbnQgbG9jayA9IEZBTFNFLCBsb3dfc3IgPSBGQUxTRTsKIApAQCAtMjU3OCwxNTcgKzE4MDUsMTE3IEBACiAJZW51bSBmZV9zdHYwOTAwX3NlYXJjaF9hbGdvIGFsZ287CiAJaW50IG5vX3NpZ25hbCA9IEZBTFNFOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBfX2Z1bmNfXyk7CisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKIAotCXN3aXRjaCAoZGVtb2QpIHsKLQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQlkZWZhdWx0OgotCQlhbGdvID0gaV9wYXJhbXMtPmRtZDFfc3JjaF9hbGdvOwotCi0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfUlNUX0hXQVJFLCAxKTsKLQkJc3RyZWFtX21lcmdlcl9maWVsZCA9IEYwOTAwX1AxX1JTVF9IV0FSRTsKLQotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1ESVNUQVRFLCAweDVDKTsKLQotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DT1JSRUxBQlMsIDB4OWUpOworCWFsZ28gPSBpbnRwLT5zcmNoX2FsZ29bZGVtb2RdOworCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDEpOworCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIERNRElTVEFURSwgMHg1Yyk7CisJaWYgKGludHAtPmNoaXBfaWQgPj0gMHgyMCkgeworCQlpZiAoaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdID4gNTAwMDAwMCkKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENPUlJFTEFCUywgMHg5ZSk7CiAJCWVsc2UKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DT1JSRUxBQlMsIDB4ODgpOworCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ09SUkVMQUJTLCAweDgyKTsKKwl9IGVsc2UKKwkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ09SUkVMQUJTLCAweDg4KTsKIAotCQlzdHYwOTAwX2dldF9sb2NrX3RpbWVvdXQoJmRlbW9kX3RpbWVvdXQsICZmZWNfdGltZW91dCwgaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGUsIGlfcGFyYW1zLT5kbWQxX3NyY2hfYWxnbyk7CisJc3R2MDkwMF9nZXRfbG9ja190aW1lb3V0KCZkZW1vZF90aW1lb3V0LCAmZmVjX3RpbWVvdXQsCisJCQkJaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdLAorCQkJCWludHAtPnNyY2hfYWxnb1tkZW1vZF0pOwogCi0JCWlmIChpX3BhcmFtcy0+ZG1kMV9zcmNoX2FsZ28gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpIHsKLQkJCWlfcGFyYW1zLT50dW5lcjFfYncgPSAyICogMzYwMDAwMDA7CisJaWYgKGludHAtPnNyY2hfYWxnb1tkZW1vZF0gPT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpIHsKKwkJaW50cC0+YndbZGVtb2RdID0gMiAqIDM2MDAwMDAwOwogCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVE1HQ0ZHMiwgMHgwMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ09SUkVMTUFOVCwgMHg3MCk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFRNR0NGRzIsIDB4YzApOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBDT1JSRUxNQU5ULCAweDcwKTsKIAotCQkJc3R2MDkwMF9zZXRfc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCAxMDAwMDAwLCBkZW1vZCk7CisJCXN0djA5MDBfc2V0X3N5bWJvbF9yYXRlKGludHAsIGludHAtPm1jbGssIDEwMDAwMDAsIGRlbW9kKTsKKwl9IGVsc2UgeworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBETURUME0sIDB4MjApOworCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBUTUdDRkcsIDB4ZDIpOworCisJCWlmIChpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPCAyMDAwMDAwKQorCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgQ09SUkVMTUFOVCwgMHg2Myk7CisJCWVsc2UKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIENPUlJFTE1BTlQsIDB4NzApOworCisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEFHQzJSRUYsIDB4MzgpOworCisJCWludHAtPmJ3W2RlbW9kXSA9CisJCQkJc3R2MDkwMF9jYXJyaWVyX3dpZHRoKGludHAtPnN5bWJvbF9yYXRlW2RlbW9kXSwKKwkJCQkJCQkJaW50cC0+cm9sbG9mZik7CisJCWlmIChpbnRwLT5jaGlwX2lkID49IDB4MjApIHsKKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEtSRUZUTUcsIDB4NWEpOworCisJCQlpZiAoaW50cC0+c3JjaF9hbGdvW2RlbW9kXSA9PSBTVFYwOTAwX0NPTERfU1RBUlQpIHsKKwkJCQlpbnRwLT5id1tkZW1vZF0gKz0gMTAwMDAwMDA7CisJCQkJaW50cC0+YndbZGVtb2RdICo9IDE1OworCQkJCWludHAtPmJ3W2RlbW9kXSAvPSAxMDsKKwkJCX0gZWxzZSBpZiAoaW50cC0+c3JjaF9hbGdvW2RlbW9kXSA9PSBTVFYwOTAwX1dBUk1fU1RBUlQpCisJCQkJaW50cC0+YndbZGVtb2RdICs9IDEwMDAwMDAwOworCiAJCX0gZWxzZSB7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRE1EVDBNLCAweDIwKTsKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9UTUdDRkcsIDB4ZDIpOwotCi0JCQlpZiAoaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGUgPCAyMDAwMDAwKQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9DT1JSRUxNQU5ULCAweDYzKTsKLQkJCWVsc2UKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfQ09SUkVMTUFOVCwgMHg3MCk7Ci0KLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9BR0MyUkVGLCAweDM4KTsKLQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA+PSAweDIwKSB7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0tSRUZUTUcsIDB4NWEpOwotCi0JCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3NyY2hfYWxnbyA9PSBTVFYwOTAwX0NPTERfU1RBUlQpCi0JCQkJCWlfcGFyYW1zLT50dW5lcjFfYncgPSAoMTUgKiAoc3R2MDkwMF9jYXJyaWVyX3dpZHRoKGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlLCBpX3BhcmFtcy0+cm9sbG9mZikgKyAxMDAwMDAwMCkpIC8gMTA7Ci0JCQkJZWxzZSBpZiAoaV9wYXJhbXMtPmRtZDFfc3JjaF9hbGdvID09IFNUVjA5MDBfV0FSTV9TVEFSVCkKLQkJCQkJaV9wYXJhbXMtPnR1bmVyMV9idyA9IHN0djA5MDBfY2Fycmllcl93aWR0aChpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSwgaV9wYXJhbXMtPnJvbGxvZmYpICsgMTAwMDAwMDA7Ci0JCQl9IGVsc2UgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9LUkVGVE1HLCAweGMxKTsKLQkJCQlpX3BhcmFtcy0+dHVuZXIxX2J3ID0gKDE1ICogKHN0djA5MDBfY2Fycmllcl93aWR0aChpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSwgaV9wYXJhbXMtPnJvbGxvZmYpICsgMTAwMDAwMDApKSAvIDEwOwotCQkJfQotCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfVE1HQ0ZHMiwgMHgwMSk7Ci0KLQkJCXN0djA5MDBfc2V0X3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgaV9wYXJhbXMtPmRtZDFfc3ltYm9sX3JhdGUsIGRlbW9kKTsKLQkJCXN0djA5MDBfc2V0X21heF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlLCBkZW1vZCk7Ci0JCQlzdHYwOTAwX3NldF9taW5fc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCBpX3BhcmFtcy0+ZG1kMV9zeW1ib2xfcmF0ZSwgZGVtb2QpOwotCQkJaWYgKGlfcGFyYW1zLT5kbWQxX3N5bWJvbF9yYXRlID49IDEwMDAwMDAwKQotCQkJCWxvd19zciA9IEZBTFNFOwotCQkJZWxzZQotCQkJCWxvd19zciA9IFRSVUU7Ci0KKwkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEtSRUZUTUcsIDB4YzEpOworCQkJaW50cC0+YndbZGVtb2RdICs9IDEwMDAwMDAwOworCQkJaW50cC0+YndbZGVtb2RdICo9IDE1OworCQkJaW50cC0+YndbZGVtb2RdIC89IDEwOwogCQl9CiAKLQkJc3R2MDkwMF9zZXRfdHVuZXIoZmUsIGlfcGFyYW1zLT50dW5lcjFfZnJlcSwgaV9wYXJhbXMtPnR1bmVyMV9idyk7CisJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIFRNR0NGRzIsIDB4YzEpOwogCi0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfU1BFQ0lOVl9DT05UUk9MLCBpX3BhcmFtcy0+ZG1kMV9zcmNoX2lxX2ludik7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfTUFOVUFMX1JPTExPRkYsIDEpOwotCi0JCXN0djA5MDBfc2V0X3NlYXJjaF9zdGFuZGFyZChpX3BhcmFtcywgZGVtb2QpOwotCi0JCWlmIChpX3BhcmFtcy0+ZG1kMV9zcmNoX2FsZ28gIT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpCi0JCQlzdHYwOTAwX3N0YXJ0X3NlYXJjaChpX3BhcmFtcywgZGVtb2QpOwotCQlicmVhazsKLQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJYWxnbyA9IGlfcGFyYW1zLT5kbWQyX3NyY2hfYWxnbzsKLQotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1JTVF9IV0FSRSwgMSk7Ci0KLQkJc3RyZWFtX21lcmdlcl9maWVsZCA9IEYwOTAwX1AyX1JTVF9IV0FSRTsKLQotCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRE1ESVNUQVRFLCAweDVDKTsKLQotCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPj0gMHgyMCkKLQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9DT1JSRUxBQlMsIDB4OWUpOworCQlzdHYwOTAwX3NldF9zeW1ib2xfcmF0ZShpbnRwLCBpbnRwLT5tY2xrLAorCQkJCQlpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0sIGRlbW9kKTsKKwkJc3R2MDkwMF9zZXRfbWF4X3N5bWJvbF9yYXRlKGludHAsIGludHAtPm1jbGssCisJCQkJCWludHAtPnN5bWJvbF9yYXRlW2RlbW9kXSwgZGVtb2QpOworCQlzdHYwOTAwX3NldF9taW5fc3ltYm9sX3JhdGUoaW50cCwgaW50cC0+bWNsaywKKwkJCQkJaW50cC0+c3ltYm9sX3JhdGVbZGVtb2RdLCBkZW1vZCk7CisJCWlmIChpbnRwLT5zeW1ib2xfcmF0ZVtkZW1vZF0gPj0gMTAwMDAwMDApCisJCQlsb3dfc3IgPSBGQUxTRTsKIAkJZWxzZQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NPUlJFTEFCUywgMHg4OCk7CisJCQlsb3dfc3IgPSBUUlVFOwogCi0JCXN0djA5MDBfZ2V0X2xvY2tfdGltZW91dCgmZGVtb2RfdGltZW91dCwgJmZlY190aW1lb3V0LCBpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSwgaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvKTsKLQotCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvID09IFNUVjA5MDBfQkxJTkRfU0VBUkNIKSB7Ci0JCQlpX3BhcmFtcy0+dHVuZXIyX2J3ID0gMiAqIDM2MDAwMDAwOwotCi0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HQ0ZHMiwgMHgwMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ09SUkVMTUFOVCwgMHg3MCk7Ci0KLQkJCXN0djA5MDBfc2V0X3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgMTAwMDAwMCwgZGVtb2QpOwotCQl9IGVsc2UgewotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0RNRFQwTSwgMHgyMCk7Ci0JCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfVE1HQ0ZHLCAweGQyKTsKLQotCQkJaWYgKGlfcGFyYW1zLT5kbWQyX3N5bWJvbF9yYXRlIDwgMjAwMDAwMCkKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfQ09SUkVMTUFOVCwgMHg2Myk7Ci0JCQllbHNlCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0NPUlJFTE1BTlQsIDB4NzApOwotCi0JCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3ltYm9sX3JhdGUgPj0gMTAwMDAwMDApCi0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0FHQzJSRUYsIDB4MzgpOwotCQkJZWxzZQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9BR0MyUkVGLCAweDYwKTsKLQotCQkJaWYgKGlfcGFyYW1zLT5jaGlwX2lkID49IDB4MjApIHsKLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfS1JFRlRNRywgMHg1YSk7Ci0KLQkJCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvID09IFNUVjA5MDBfQ09MRF9TVEFSVCkKLQkJCQkJaV9wYXJhbXMtPnR1bmVyMl9idyA9ICgxNSAqIChzdHYwOTAwX2NhcnJpZXJfd2lkdGgoaV9wYXJhbXMtPmRtZDJfc3ltYm9sX3JhdGUsCi0JCQkJCQkJaV9wYXJhbXMtPnJvbGxvZmYpICsgMTAwMDAwMDApKSAvIDEwOwotCQkJCWVsc2UgaWYgKGlfcGFyYW1zLT5kbWQyX3NyY2hfYWxnbyA9PSBTVFYwOTAwX1dBUk1fU1RBUlQpCi0JCQkJCWlfcGFyYW1zLT50dW5lcjJfYncgPSBzdHYwOTAwX2NhcnJpZXJfd2lkdGgoaV9wYXJhbXMtPmRtZDJfc3ltYm9sX3JhdGUsCi0JCQkJCQkJaV9wYXJhbXMtPnJvbGxvZmYpICsgMTAwMDAwMDA7Ci0JCQl9IGVsc2UgewotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9LUkVGVE1HLCAweGMxKTsKLQkJCQlpX3BhcmFtcy0+dHVuZXIyX2J3ID0gKDE1ICogKHN0djA5MDBfY2Fycmllcl93aWR0aChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSwKLQkJCQkJCQkJCWlfcGFyYW1zLT5yb2xsb2ZmKSArIDEwMDAwMDAwKSkgLyAxMDsKLQkJCX0KLQotCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX1RNR0NGRzIsIDB4MDEpOwotCi0JCQlzdHYwOTAwX3NldF9zeW1ib2xfcmF0ZShpX3BhcmFtcywgaV9wYXJhbXMtPm1jbGssIGlfcGFyYW1zLT5kbWQyX3N5bWJvbF9yYXRlLCBkZW1vZCk7Ci0JCQlzdHYwOTAwX3NldF9tYXhfc3ltYm9sX3JhdGUoaV9wYXJhbXMsIGlfcGFyYW1zLT5tY2xrLCBpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSwgZGVtb2QpOwotCQkJc3R2MDkwMF9zZXRfbWluX3N5bWJvbF9yYXRlKGlfcGFyYW1zLCBpX3BhcmFtcy0+bWNsaywgaV9wYXJhbXMtPmRtZDJfc3ltYm9sX3JhdGUsIGRlbW9kKTsKLQkJCWlmIChpX3BhcmFtcy0+ZG1kMl9zeW1ib2xfcmF0ZSA+PSAxMDAwMDAwMCkKLQkJCQlsb3dfc3IgPSBGQUxTRTsKLQkJCWVsc2UKLQkJCQlsb3dfc3IgPSBUUlVFOwotCi0JCX0KLQotCQlzdHYwOTAwX3NldF90dW5lcihmZSwgaV9wYXJhbXMtPnR1bmVyMl9mcmVxLCBpX3BhcmFtcy0+dHVuZXIyX2J3KTsKLQotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX1NQRUNJTlZfQ09OVFJPTCwgaV9wYXJhbXMtPmRtZDJfc3JjaF9pcV9pbnYpOwotCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIEYwOTAwX1AyX01BTlVBTF9ST0xMT0ZGLCAxKTsKLQotCQlzdHYwOTAwX3NldF9zZWFyY2hfc3RhbmRhcmQoaV9wYXJhbXMsIGRlbW9kKTsKLQotCQlpZiAoaV9wYXJhbXMtPmRtZDJfc3JjaF9hbGdvICE9IFNUVjA5MDBfQkxJTkRfU0VBUkNIKQotCQkJc3R2MDkwMF9zdGFydF9zZWFyY2goaV9wYXJhbXMsIGRlbW9kKTsKLQkJYnJlYWs7CiAJfQogCi0JaWYgKGlfcGFyYW1zLT5jaGlwX2lkID09IDB4MTIpIHsKLQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBzdHJlYW1fbWVyZ2VyX2ZpZWxkLCAwKTsKKwlzdHYwOTAwX3NldF90dW5lcihmZSwgaW50cC0+ZnJlcVtkZW1vZF0sIGludHAtPmJ3W2RlbW9kXSk7CisKKwlhZ2MxX3Bvd2VyID0gTUFLRVdPUkQoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBBR0NJUV9WQUxVRTEpLAorCQkJCXN0djA5MDBfZ2V0X2JpdHMoaW50cCwgQUdDSVFfVkFMVUUwKSk7CisKKwlhcV9wb3dlciA9IDA7CisKKwlpZiAoYWdjMV9wb3dlciA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQlhcV9wb3dlciArPSAoc3R2MDkwMF9nZXRfYml0cyhpbnRwLCBQT1dFUl9JKSArCisJCQkJCXN0djA5MDBfZ2V0X2JpdHMoaW50cCwgUE9XRVJfUSkpIC8gMjsKKworCQlhcV9wb3dlciAvPSA1OworCX0KKworCWlmICgoYWdjMV9wb3dlciA9PSAwKSAmJiAoYXFfcG93ZXIgPCBJUVBPV0VSX1RIUkVTSE9MRCkpIHsKKwkJaW50cC0+cmVzdWx0W2RlbW9kXS5sb2NrZWQgPSBGQUxTRTsKKwkJc2lnbmFsX3R5cGUgPSBTVFYwOTAwX05PQUdDMTsKKwkJZHByaW50aygiJXM6IE5PIEFHQzEsIFBPV0VSSSwgUE9XRVJRXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFNQRUNJTlZfQ09OVFJPTCwKKwkJCQkJaW50cC0+c3JjaF9pcV9pbnZbZGVtb2RdKTsKKwkJaWYgKGludHAtPmNoaXBfaWQgPD0gMHgyMCkgLypjdXQgMi4wKi8KKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBNQU5VQUxTWF9ST0xMT0ZGLCAxKTsKKwkJZWxzZSAvKmN1dCAzLjAqLworCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIE1BTlVBTFMyX1JPTExPRkYsIDEpOworCisJCXN0djA5MDBfc2V0X3NlYXJjaF9zdGFuZGFyZChpbnRwLCBkZW1vZCk7CisKKwkJaWYgKGludHAtPnNyY2hfYWxnb1tkZW1vZF0gIT0gU1RWMDkwMF9CTElORF9TRUFSQ0gpCisJCQlzdHYwOTAwX3N0YXJ0X3NlYXJjaChpbnRwLCBkZW1vZCk7CisJfQorCisJaWYgKHNpZ25hbF90eXBlID09IFNUVjA5MDBfTk9BR0MxKQorCQlyZXR1cm4gc2lnbmFsX3R5cGU7CisKKwlpZiAoaW50cC0+Y2hpcF9pZCA9PSAweDEyKSB7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDApOwogCQltc2xlZXAoMyk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgc3RyZWFtX21lcmdlcl9maWVsZCwgMSk7Ci0JCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgc3RyZWFtX21lcmdlcl9maWVsZCwgMCk7CisJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDEpOworCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgUlNUX0hXQVJFLCAwKTsKIAl9CiAKIAlpZiAoYWxnbyA9PSBTVFYwOTAwX0JMSU5EX1NFQVJDSCkKQEAgLTI3MzYsMTIgKzE5MjMsMTIgQEAKIAllbHNlIGlmIChhbGdvID09IFNUVjA5MDBfQ09MRF9TVEFSVCkKIAkJbG9jayA9IHN0djA5MDBfZ2V0X2RlbW9kX2NvbGRfbG9jayhmZSwgZGVtb2RfdGltZW91dCk7CiAJZWxzZSBpZiAoYWxnbyA9PSBTVFYwOTAwX1dBUk1fU1RBUlQpCi0JCWxvY2sgPSBzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgZGVtb2RfdGltZW91dCk7CisJCWxvY2sgPSBzdHYwOTAwX2dldF9kZW1vZF9sb2NrKGludHAsIGRlbW9kLCBkZW1vZF90aW1lb3V0KTsKIAogCWlmICgobG9jayA9PSBGQUxTRSkgJiYgKGFsZ28gPT0gU1RWMDkwMF9DT0xEX1NUQVJUKSkgewogCQlpZiAobG93X3NyID09IEZBTFNFKSB7Ci0JCQlpZiAoc3R2MDkwMF9jaGVja190aW1pbmdfbG9jayhpX3BhcmFtcywgZGVtb2QpID09IFRSVUUpCi0JCQkJbG9jayA9IHN0djA5MDBfc3dfYWxnbyhpX3BhcmFtcywgZGVtb2QpOworCQkJaWYgKHN0djA5MDBfY2hlY2tfdGltaW5nX2xvY2soaW50cCwgZGVtb2QpID09IFRSVUUpCisJCQkJbG9jayA9IHN0djA5MDBfc3dfYWxnbyhpbnRwLCBkZW1vZCk7CiAJCX0KIAl9CiAKQEAgLTI3NTAsOTggKzE5MzcsNjQgQEAKIAogCWlmICgobG9jayA9PSBUUlVFKSAmJiAoc2lnbmFsX3R5cGUgPT0gU1RWMDkwMF9SQU5HRU9LKSkgewogCQlzdHYwOTAwX3RyYWNrX29wdGltaXphdGlvbihmZSk7Ci0JCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA8PSAweDExKSB7Ci0JCQlpZiAoKHN0djA5MDBfZ2V0X3N0YW5kYXJkKGZlLCBTVFYwOTAwX0RFTU9EXzEpID09IFNUVjA5MDBfRFZCUzFfU1RBTkRBUkQpICYmIChzdHYwOTAwX2dldF9zdGFuZGFyZChmZSwgU1RWMDkwMF9ERU1PRF8yKSA9PSBTVFYwOTAwX0RWQlMxX1NUQU5EQVJEKSkgeworCQlpZiAoaW50cC0+Y2hpcF9pZCA8PSAweDExKSB7CisJCQlpZiAoKHN0djA5MDBfZ2V0X3N0YW5kYXJkKGZlLCAwKSA9PQorCQkJCQkJU1RWMDkwMF9EVkJTMV9TVEFOREFSRCkgJiYKKwkJCSAgIChzdHYwOTAwX2dldF9zdGFuZGFyZChmZSwgMSkgPT0KKwkJCQkJCVNUVjA5MDBfRFZCUzFfU1RBTkRBUkQpKSB7CiAJCQkJbXNsZWVwKDIwKTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIHN0cmVhbV9tZXJnZXJfZmllbGQsIDApOworCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDApOwogCQkJfSBlbHNlIHsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIHN0cmVhbV9tZXJnZXJfZmllbGQsIDApOworCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDApOwogCQkJCW1zbGVlcCgzKTsKLQkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIHN0cmVhbV9tZXJnZXJfZmllbGQsIDEpOwotCQkJCXN0djA5MDBfd3JpdGVfYml0cyhpX3BhcmFtcywgc3RyZWFtX21lcmdlcl9maWVsZCwgMCk7CisJCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFJTVF9IV0FSRSwgMSk7CisJCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFJTVF9IV0FSRSwgMCk7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPT0gMHgyMCkgewotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBzdHJlYW1fbWVyZ2VyX2ZpZWxkLCAwKTsKKworCQl9IGVsc2UgaWYgKGludHAtPmNoaXBfaWQgPj0gMHgyMCkgeworCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFJTVF9IV0FSRSwgMCk7CiAJCQltc2xlZXAoMyk7Ci0JCQlzdHYwOTAwX3dyaXRlX2JpdHMoaV9wYXJhbXMsIHN0cmVhbV9tZXJnZXJfZmllbGQsIDEpOwotCQkJc3R2MDkwMF93cml0ZV9iaXRzKGlfcGFyYW1zLCBzdHJlYW1fbWVyZ2VyX2ZpZWxkLCAwKTsKKwkJCXN0djA5MDBfd3JpdGVfYml0cyhpbnRwLCBSU1RfSFdBUkUsIDEpOworCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFJTVF9IV0FSRSwgMCk7CiAJCX0KIAotCQlpZiAoc3R2MDkwMF93YWl0X2Zvcl9sb2NrKGlfcGFyYW1zLCBkZW1vZCwgZmVjX3RpbWVvdXQsIGZlY190aW1lb3V0KSA9PSBUUlVFKSB7CisJCWlmIChzdHYwOTAwX3dhaXRfZm9yX2xvY2soaW50cCwgZGVtb2QsCisJCQkJCWZlY190aW1lb3V0LCBmZWNfdGltZW91dCkgPT0gVFJVRSkgewogCQkJbG9jayA9IFRSVUU7Ci0JCQlzd2l0Y2ggKGRlbW9kKSB7Ci0JCQljYXNlIFNUVjA5MDBfREVNT0RfMToKLQkJCWRlZmF1bHQ6Ci0JCQkJaV9wYXJhbXMtPmRtZDFfcnNsdHMubG9ja2VkID0gVFJVRTsKLQkJCQlpZiAoaV9wYXJhbXMtPmRtZDFfcnNsdHMuc3RhbmRhcmQgPT0gU1RWMDkwMF9EVkJTMl9TVEFOREFSRCkgewotCQkJCQlzdHYwOTAwX3NldF9kdmJzMl9yb2xsb2ZmKGlfcGFyYW1zLCBkZW1vZCk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9QREVMQ1RSTDIsIDB4NDApOwotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfUERFTENUUkwyLCAwKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0VSUkNUUkwxLCAweDY3KTsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDFfRVJSQ1RSTDEsIDB4NzUpOwotCQkJCX0KLQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMV9GQkVSQ1BUNCwgMCk7Ci0JCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AxX0VSUkNUUkwyLCAweGMxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RWMDkwMF9ERU1PRF8yOgotCQkJCWlfcGFyYW1zLT5kbWQyX3JzbHRzLmxvY2tlZCA9IFRSVUU7Ci0KLQkJCQlpZiAoaV9wYXJhbXMtPmRtZDJfcnNsdHMuc3RhbmRhcmQgPT0gU1RWMDkwMF9EVkJTMl9TVEFOREFSRCkgewotCQkJCQlzdHYwOTAwX3NldF9kdmJzMl9yb2xsb2ZmKGlfcGFyYW1zLCBkZW1vZCk7Ci0JCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9QREVMQ1RSTDIsIDB4NjApOwotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfUERFTENUUkwyLCAweDIwKTsKLQkJCQkJc3R2MDkwMF93cml0ZV9yZWcoaV9wYXJhbXMsIFIwOTAwX1AyX0VSUkNUUkwxLCAweDY3KTsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRVJSQ1RSTDEsIDB4NzUpOwotCQkJCX0KLQotCQkJCXN0djA5MDBfd3JpdGVfcmVnKGlfcGFyYW1zLCBSMDkwMF9QMl9GQkVSQ1BUNCwgMCk7Ci0KLQkJCQlzdHYwOTAwX3dyaXRlX3JlZyhpX3BhcmFtcywgUjA5MDBfUDJfRVJSQ1RSTDIsIDB4YzEpOwotCQkJCWJyZWFrOworCQkJaW50cC0+cmVzdWx0W2RlbW9kXS5sb2NrZWQgPSBUUlVFOworCQkJaWYgKGludHAtPnJlc3VsdFtkZW1vZF0uc3RhbmRhcmQgPT0KKwkJCQkJCVNUVjA5MDBfRFZCUzJfU1RBTkRBUkQpIHsKKwkJCQlzdHYwOTAwX3NldF9kdmJzMl9yb2xsb2ZmKGludHAsIGRlbW9kKTsKKwkJCQlzdHYwOTAwX3dyaXRlX2JpdHMoaW50cCwgUkVTRVRfVVBLT19DT1VOVCwgMSk7CisJCQkJc3R2MDkwMF93cml0ZV9iaXRzKGludHAsIFJFU0VUX1VQS09fQ09VTlQsIDApOworCQkJCXN0djA5MDBfd3JpdGVfcmVnKGludHAsIEVSUkNUUkwxLCAweDY3KTsKKwkJCX0gZWxzZSB7CisJCQkJc3R2MDkwMF93cml0ZV9yZWcoaW50cCwgRVJSQ1RSTDEsIDB4NzUpOwogCQkJfQorCisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBGQkVSQ1BUNCwgMCk7CisJCQlzdHYwOTAwX3dyaXRlX3JlZyhpbnRwLCBFUlJDVFJMMiwgMHhjMSk7CiAJCX0gZWxzZSB7CiAJCQlsb2NrID0gRkFMU0U7CiAJCQlzaWduYWxfdHlwZSA9IFNUVjA5MDBfTk9EQVRBOwotCQkJbm9fc2lnbmFsID0gc3R2MDkwMF9jaGVja19zaWduYWxfcHJlc2VuY2UoaV9wYXJhbXMsIGRlbW9kKTsKKwkJCW5vX3NpZ25hbCA9IHN0djA5MDBfY2hlY2tfc2lnbmFsX3ByZXNlbmNlKGludHAsIGRlbW9kKTsKIAotCQkJc3dpdGNoIChkZW1vZCkgewotCQkJY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JCQlkZWZhdWx0OgotCQkJCWlfcGFyYW1zLT5kbWQxX3JzbHRzLmxvY2tlZCA9IEZBTFNFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVFYwOTAwX0RFTU9EXzI6Ci0JCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMubG9ja2VkID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJaW50cC0+cmVzdWx0W2RlbW9kXS5sb2NrZWQgPSBGQUxTRTsKIAkJfQogCX0KIAotCWlmICgoc2lnbmFsX3R5cGUgPT0gU1RWMDkwMF9OT0RBVEEpICYmIChub19zaWduYWwgPT0gRkFMU0UpKSB7Ci0JCXN3aXRjaCAoZGVtb2QpIHsKLQkJY2FzZSBTVFYwOTAwX0RFTU9EXzE6Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoaV9wYXJhbXMtPmNoaXBfaWQgPD0gMHgxMSkgewotCQkJCWlmICgoc3R2MDkwMF9nZXRfYml0cyhpX3BhcmFtcywgRjA5MDBfUDFfSEVBREVSX01PREUpID09IFNUVjA5MDBfRFZCU19GT1VORCkgJiYKLQkJCQkJCShpX3BhcmFtcy0+ZG1kMV9zcmNoX2lxX2ludiA8PSBTVFYwOTAwX0lRX0FVVE9fTk9STUFMX0ZJUlNUKSkKLQkJCQkJc2lnbmFsX3R5cGUgPSBzdHYwOTAwX2R2YnMxX2FjcV93b3JrYXJvdW5kKGZlKTsKLQkJCX0gZWxzZQotCQkJCWlfcGFyYW1zLT5kbWQxX3JzbHRzLmxvY2tlZCA9IEZBTFNFOworCWlmICgoc2lnbmFsX3R5cGUgIT0gU1RWMDkwMF9OT0RBVEEpIHx8IChub19zaWduYWwgIT0gRkFMU0UpKQorCQlyZXR1cm4gc2lnbmFsX3R5cGU7CiAKLQkJCWJyZWFrOwotCQljYXNlIFNUVjA5MDBfREVNT0RfMjoKLQkJCWlmIChpX3BhcmFtcy0+Y2hpcF9pZCA8PSAweDExKSB7Ci0JCQkJaWYgKChzdHYwOTAwX2dldF9iaXRzKGlfcGFyYW1zLCBGMDkwMF9QMl9IRUFERVJfTU9ERSkgPT0gU1RWMDkwMF9EVkJTX0ZPVU5EKSAmJgotCQkJCQkJKGlfcGFyYW1zLT5kbWQyX3NyY2hfaXFfaW52IDw9IFNUVjA5MDBfSVFfQVVUT19OT1JNQUxfRklSU1QpKQotCQkJCQlzaWduYWxfdHlwZSA9IHN0djA5MDBfZHZiczFfYWNxX3dvcmthcm91bmQoZmUpOwotCQkJfSBlbHNlCi0JCQkJaV9wYXJhbXMtPmRtZDJfcnNsdHMubG9ja2VkID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQorCWlmIChpbnRwLT5jaGlwX2lkID4gMHgxMSkgeworCQlpbnRwLT5yZXN1bHRbZGVtb2RdLmxvY2tlZCA9IEZBTFNFOworCQlyZXR1cm4gc2lnbmFsX3R5cGU7CiAJfQogCisJaWYgKChzdHYwOTAwX2dldF9iaXRzKGludHAsIEhFQURFUl9NT0RFKSA9PSBTVFYwOTAwX0RWQlNfRk9VTkQpICYmCisJICAgKGludHAtPnNyY2hfaXFfaW52W2RlbW9kXSA8PSBTVFYwOTAwX0lRX0FVVE9fTk9STUFMX0ZJUlNUKSkKKwkJc2lnbmFsX3R5cGUgPSBzdHYwOTAwX2R2YnMxX2FjcV93b3JrYXJvdW5kKGZlKTsKKwogCXJldHVybiBzaWduYWxfdHlwZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTB4LmMKaW5kZXggNDg4YmRmYi4uNDhlZGQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkweC5jCkBAIC04MjUsNyArODI1LDcgQEAKIAkJc3ltIC89IChzdGF0ZS0+bWNsayA+PiA3KTsKIAl9CiAKLQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgU0ZSTE9XMSwgKChzeW0gPj4gOCkgJiAweGZmKSkgPCAwKSAvKiBNU0IgKi8KKwlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgU0ZSTE9XMSwgKChzeW0gPj4gOCkgJiAweDdmKSkgPCAwKSAvKiBNU0IgKi8KIAkJZ290byBlcnI7CiAJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIFNGUkxPVzAsIChzeW0gJiAweGZmKSkgPCAwKSAvKiBMU0IgKi8KIAkJZ290byBlcnI7CkBAIC0xMjM4LDYgKzEyMzgsOCBAQAogCQkJCWdvdG8gZXJyOwogCQl9CiAKKwkJaWYgKHN0djA5MHhfc2V0X3ZpdF90aHRyYWNxKHN0YXRlKSA8IDApCisJCQlnb3RvIGVycjsKIAkJYnJlYWs7CiAKIAljYXNlIFNUVjA5MHhfU0VBUkNIX0FVVE86CkBAIC0xMjc4LDE3ICsxMjgwLDggQEAKIAkJCQlnb3RvIGVycjsKIAkJfQogCi0JCWlmIChzdGF0ZS0+c3JhdGUgPj0gMjAwMDAwMCkgewotCQkJLyogU3JhdGUgPj0gMk1TUFMsIFZpdGVyYmkgdGhyZXNob2xkIHRvIGFjcXVpcmUgKi8KLQkJCWlmIChzdHYwOTB4X3NldF92aXRfdGhhY3Eoc3RhdGUpIDwgMCkKLQkJCQlnb3RvIGVycjsKLQkJfSBlbHNlIHsKLQkJCS8qIFNyYXRlIDwgMk1TUFMsIFJlc2V0IFZpdGVyYmkgdGhyZXNob2xkdG8gdHJhY2sKLQkJCSAqIGFuZCB0aGVuIHJlLWFjcXVpcmUKLQkJCSAqLwotCQkJaWYgKHN0djA5MHhfc2V0X3ZpdF90aHRyYWNxKHN0YXRlKSA8IDApCi0JCQkJZ290byBlcnI7Ci0JCX0KKwkJaWYgKHN0djA5MHhfc2V0X3ZpdF90aGFjcShzdGF0ZSkgPCAwKQorCQkJZ290byBlcnI7CiAKIAkJaWYgKHN0djA5MHhfc2V0X3ZpdGVyYmkoc3RhdGUpIDwgMCkKIAkJCWdvdG8gZXJyOwpAQCAtMTMxNyw3ICsxMzEwLDcgQEAKIAkJCQlnb3RvIGVycjsKIAkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDRlJVUDEsIDB4MGYpIDwgMCkKIAkJCQlnb3RvIGVycjsKLQkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDRlJVUDEsIDB4ZmYpIDwgMCkKKwkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDRlJVUDAsIDB4ZmYpIDwgMCkKIAkJCQlnb3RvIGVycjsKIAkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDRlJMT1cxLCAweGYwKSA8IDApCiAJCQkJZ290byBlcnI7CkBAIC0xMzcxLDcgKzEzNjQsNyBAQAogCiAJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDRlJVUDEsIE1TQihmcmVxKSkgPCAwKQogCQkJZ290byBlcnI7Ci0JCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDRlJVUDEsIExTQihmcmVxKSkgPCAwKQorCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0ZSVVAwLCBMU0IoZnJlcSkpIDwgMCkKIAkJCWdvdG8gZXJyOwogCiAJCWZyZXEgKj0gLTE7CkBAIC0xNDIyLDYgKzE0MTUsOSBAQAogCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBETURDRkcyLCByZWcpIDwgMCkKIAkJZ290byBlcnI7CiAKKwlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgUlRDLCAweDg4KSA8IDApCisJCWdvdG8gZXJyOworCiAJaWYgKHN0YXRlLT5kZXZfdmVyID49IDB4MjApIHsKIAkJLypGcmVxdWVuY3kgb2Zmc2V0IGRldGVjdG9yIHNldHRpbmcqLwogCQlpZiAoc3RhdGUtPnNyYXRlIDwgMjAwMDAwMCkgewpAQCAtMTQzMCwyMCArMTQyNiwyMiBAQAogCQkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDQVJGUkVRLCAweDM5KSA8IDApCiAJCQkJCWdvdG8gZXJyOwogCQkJfSBlbHNlIHsKLQkJCQkvKiBDdXQgMiAqLworCQkJCS8qIEN1dCAzICovCiAJCQkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIENBUkZSRVEsIDB4ODkpIDwgMCkKIAkJCQkJZ290byBlcnI7CiAJCQl9CiAJCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0FSSERSLCAweDQwKSA8IDApCiAJCQkJZ290byBlcnI7Ci0JCX0KLQotCQlpZiAoc3RhdGUtPnNyYXRlIDwgMTAwMDAwMDApIHsKKwkJfSBlbHNlIGlmIChzdGF0ZS0+c3JhdGUgPCAxMDAwMDAwMCkgewogCQkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIENBUkZSRVEsIDB4NGMpIDwgMCkKIAkJCQlnb3RvIGVycjsKKwkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDQVJIRFIsIDB4MjApIDwgMCkKKwkJCQlnb3RvIGVycjsKIAkJfSBlbHNlIHsKIAkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDQVJGUkVRLCAweDRiKSA8IDApCiAJCQkJZ290byBlcnI7CisJCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0FSSERSLCAweDIwKSA8IDApCisJCQkJZ290byBlcnI7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoc3RhdGUtPnNyYXRlIDwgMTAwMDAwMDApIHsKQEAgLTE0ODUsMTQgKzE0ODMsMTQgQEAKIAogc3RhdGljIGludCBzdHYwOTB4X2dldF9hZ2MyX21pbl9sZXZlbChzdHJ1Y3Qgc3R2MDkweF9zdGF0ZSAqc3RhdGUpCiB7Ci0JdTMyIGFnYzJfbWluID0gMCwgYWdjMiA9IDAsIGZyZXFfaW5pdCwgZnJlcV9zdGVwLCByZWc7CisJdTMyIGFnYzJfbWluID0gMHhmZmZmLCBhZ2MyID0gMCwgZnJlcV9pbml0LCBmcmVxX3N0ZXAsIHJlZzsKIAlzMzIgaSwgaiwgc3RlcHMsIGRpcjsKIAogCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBBR0MyUkVGLCAweDM4KSA8IDApCiAJCWdvdG8gZXJyOwogCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgRE1EQ0ZHTUQpOwotCVNUVjA5MHhfU0VURklFTERfUHgocmVnLCBTQ0FOX0VOQUJMRV9GSUVMRCwgMSk7Ci0JU1RWMDkweF9TRVRGSUVMRF9QeChyZWcsIENGUl9BVVRPU0NBTl9GSUVMRCwgMSk7CisJU1RWMDkweF9TRVRGSUVMRF9QeChyZWcsIFNDQU5fRU5BQkxFX0ZJRUxELCAwKTsKKwlTVFYwOTB4X1NFVEZJRUxEX1B4KHJlZywgQ0ZSX0FVVE9TQ0FOX0ZJRUxELCAwKTsKIAlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgRE1EQ0ZHTUQsIHJlZykgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtMTUwOSwxMCArMTUwNyw4IEBACiAJaWYgKHN0djA5MHhfc2V0X3NyYXRlKHN0YXRlLCAxMDAwMDAwKSA8IDApCiAJCWdvdG8gZXJyOwogCi0Jc3RlcHMgID0gLTEgKyBzdGF0ZS0+c2VhcmNoX3JhbmdlIC8gMTAwMDAwMDsKLQlzdGVwcyAvPSAyOwotCXN0ZXBzICA9ICgyICogc3RlcHMpICsgMTsKLQlpZiAoc3RlcHMgPCAwKQorCXN0ZXBzICA9IHN0YXRlLT5zZWFyY2hfcmFuZ2UgLyAxMDAwMDAwOworCWlmIChzdGVwcyA8PSAwKQogCQlzdGVwcyA9IDE7CiAKIAlkaXIgPSAxOwpAQCAtMTUyNSw3ICsxNTIxLDcgQEAKIAkJZWxzZQogCQkJZnJlcV9pbml0ID0gZnJlcV9pbml0IC0gKGZyZXFfc3RlcCAqIGkpOwogCi0JCWRpciA9IC0xOworCQlkaXIgKj0gLTE7CiAKIAkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIERNRElTVEFURSwgMHg1YykgPCAwKSAvKiBEZW1vZCBSRVNFVCAqLwogCQkJZ290byBlcnI7CkBAIC0xNTM2LDEzICsxNTMyLDE0IEBACiAJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBETURJU1RBVEUsIDB4NTgpIDwgMCkgLyogRGVtb2QgUkVTRVQgKi8KIAkJCWdvdG8gZXJyOwogCQltc2xlZXAoMTApOworCisJCWFnYzIgPSAwOwogCQlmb3IgKGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJYWdjMiArPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIEFHQzJJMSkgPDwgODsKLQkJCWFnYzIgfD0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBBR0MySTApOworCQkJYWdjMiArPSAoU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBBR0MySTEpIDw8IDgpIHwKKwkJCQlTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIEFHQzJJMCk7CiAJCX0KIAkJYWdjMiAvPSAxMDsKLQkJYWdjMl9taW4gPSAweGZmZmY7Ci0JCWlmIChhZ2MyIDwgMHhmZmZmKQorCQlpZiAoYWdjMiA8IGFnYzJfbWluKQogCQkJYWdjMl9taW4gPSBhZ2MyOwogCX0KIApAQCAtMTU4NCw2ICsxNTgxLDEyIEBACiAJaW50IHRtZ19sb2NrID0gMCwgaTsKIAlzMzIgdG1nX2NwdCA9IDAsIGRpciA9IDEsIHN0ZXBzLCBjdXJfc3RlcCA9IDAsIGZyZXE7CiAJdTMyIHNyYXRlX2NvYXJzZSA9IDAsIGFnYzIgPSAwLCBjYXJfc3RlcCA9IDEyMDAsIHJlZzsKKwl1MzIgYWdjMnRoOworCisJaWYgKHN0YXRlLT5kZXZfdmVyID49IDB4MzApCisJCWFnYzJ0aCA9IDB4MmUwMDsKKwllbHNlCisJCWFnYzJ0aCA9IDB4MWYwMDsKIAogCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgRE1ESVNUQVRFKTsKIAlTVFYwOTB4X1NFVEZJRUxEX1B4KHJlZywgSTJDX0RFTU9EX01PREVfRklFTEQsIDB4MWYpOyAvKiBEZW1vZCBSRVNFVCAqLwpAQCAtMTU5MSwxMyArMTU5NCwxNSBAQAogCQlnb3RvIGVycjsKIAlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgVE1HQ0ZHLCAweDEyKSA8IDApCiAJCWdvdG8gZXJyOworCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBUTUdDRkcyLCAweGMwKSA8IDApCisJCWdvdG8gZXJyOwogCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBUTUdUSFJJU0UsIDB4ZjApIDwgMCkKIAkJZ290byBlcnI7CiAJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIFRNR1RIRkFMTCwgMHhlMCkgPCAwKQogCQlnb3RvIGVycjsKIAlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIERNRENGR01EKTsKIAlTVFYwOTB4X1NFVEZJRUxEX1B4KHJlZywgU0NBTl9FTkFCTEVfRklFTEQsIDEpOwotCVNUVjA5MHhfU0VURklFTERfUHgocmVnLCBDRlJfQVVUT1NDQU5fRklFTEQsIDEpOworCVNUVjA5MHhfU0VURklFTERfUHgocmVnLCBDRlJfQVVUT1NDQU5fRklFTEQsIDApOwogCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBETURDRkdNRCwgcmVnKSA8IDApCiAJCWdvdG8gZXJyOwogCkBAIC0xNjExLDEzICsxNjE2LDEzIEBACiAJCWdvdG8gZXJyOwogCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBETURUT00sIDB4MDApIDwgMCkKIAkJZ290byBlcnI7Ci0JaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIEFHQzJSRUYsIDB4NjApIDwgMCkKKwlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQUdDMlJFRiwgMHg1MCkgPCAwKQogCQlnb3RvIGVycjsKIAogCWlmIChzdGF0ZS0+ZGV2X3ZlciA+PSAweDMwKSB7CiAJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBDQVJGUkVRLCAweDk5KSA8IDApCiAJCQlnb3RvIGVycjsKLQkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIFNGUlNURVAsIDB4OTUpIDwgMCkKKwkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIFNGUlNURVAsIDB4OTgpIDwgMCkKIAkJCWdvdG8gZXJyOwogCiAJfSBlbHNlIGlmIChzdGF0ZS0+ZGV2X3ZlciA+PSAweDIwKSB7CkBAIC0xNjUyLDIzICsxNjU3LDMxIEBACiAJd2hpbGUgKCghdG1nX2xvY2spICYmIChjdXJfc3RlcCA8IHN0ZXBzKSkgewogCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgRE1ESVNUQVRFLCAweDVmKSA8IDApIC8qIERlbW9kIFJFU0VUICovCiAJCQlnb3RvIGVycjsKLQkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBETURJU1RBVEUpOwotCQlTVFYwOTB4X1NFVEZJRUxEX1B4KHJlZywgSTJDX0RFTU9EX01PREVfRklFTEQsIDB4MDApOyAvKiB0cmlnZ2VyIGFjcXVpc2l0aW9uICovCi0JCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBETURJU1RBVEUsIHJlZykgPCAwKQorCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0ZSSU5JVDEsIDB4MDApIDwgMCkKKwkJCWdvdG8gZXJyOworCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0ZSSU5JVDAsIDB4MDApIDwgMCkKKwkJCWdvdG8gZXJyOworCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgU0ZSSU5JVDEsIDB4MDApIDwgMCkKKwkJCWdvdG8gZXJyOworCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgU0ZSSU5JVDAsIDB4MDApIDwgMCkKKwkJCWdvdG8gZXJyOworCQkvKiB0cmlnZ2VyIGFjcXVpc2l0aW9uICovCisJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBETURJU1RBVEUsIDB4NDApIDwgMCkKIAkJCWdvdG8gZXJyOwogCQltc2xlZXAoNTApOwogCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewogCQkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKIAkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgVE1HTE9DS19RVUFMSVRZX0ZJRUxEKSA+PSAyKQogCQkJCXRtZ19jcHQrKzsKLQkJCWFnYzIgKz0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBBR0MySTEpIDw8IDg7Ci0JCQlhZ2MyIHw9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgQUdDMkkwKTsKKwkJCWFnYzIgKz0gKFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgQUdDMkkxKSA8PCA4KSB8CisJCQkJU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBBR0MySTApOwogCQl9CiAJCWFnYzIgLz0gMTA7CiAJCXNyYXRlX2NvYXJzZSA9IHN0djA5MHhfZ2V0X3NyYXRlKHN0YXRlLCBzdGF0ZS0+bWNsayk7CiAJCWN1cl9zdGVwKys7CiAJCWRpciAqPSAtMTsKLQkJaWYgKCh0bWdfY3B0ID49IDUpICYmIChhZ2MyIDwgMHgxZjAwKSAmJiAoc3JhdGVfY29hcnNlIDwgNTUwMDAwMDApICYmIChzcmF0ZV9jb2Fyc2UgPiA4NTAwMDApKQorCQlpZiAoKHRtZ19jcHQgPj0gNSkgJiYgKGFnYzIgPCBhZ2MydGgpICYmCisJCSAgICAoc3JhdGVfY29hcnNlIDwgNTAwMDAwMDApICYmIChzcmF0ZV9jb2Fyc2UgPiA4NTAwMDApKQogCQkJdG1nX2xvY2sgPSAxOwogCQllbHNlIGlmIChjdXJfc3RlcCA8IHN0ZXBzKSB7CiAJCQlpZiAoZGlyID4gMCkKQEAgLTE2ODEsNyArMTY5NCw3IEBACiAJCQkJZ290byBlcnI7CiAKIAkJCWlmIChzdGF0ZS0+Y29uZmlnLT50dW5lcl9zZXRfZnJlcXVlbmN5KSB7Ci0JCQkJaWYgKHN0YXRlLT5jb25maWctPnR1bmVyX3NldF9mcmVxdWVuY3koZmUsIHN0YXRlLT5mcmVxdWVuY3kpIDwgMCkKKwkJCQlpZiAoc3RhdGUtPmNvbmZpZy0+dHVuZXJfc2V0X2ZyZXF1ZW5jeShmZSwgZnJlcSkgPCAwKQogCQkJCQlnb3RvIGVycjsKIAkJCX0KIApAQCAtMTczOCw3ICsxNzUxLDcgQEAKIAllbHNlIHsKIAkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIERNRElTVEFURSwgMHgxZikgPCAwKSAvKiBEZW1vZCBSRVNFVCAqLwogCQkJZ290byBlcnI7Ci0JCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBUTUdDRkcyLCAweDAxKSA8IDApCisJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBUTUdDRkcyLCAweGMxKSA8IDApCiAJCQlnb3RvIGVycjsKIAkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIFRNR1RIUklTRSwgMHgyMCkgPCAwKQogCQkJZ290byBlcnI7CkBAIC0xNzUxLDYgKzE3NjQsOSBAQAogCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgRE1EQ0ZHTUQsIHJlZykgPCAwKQogCQkJZ290byBlcnI7CiAKKwkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIEFHQzJSRUYsIDB4MzgpIDwgMCkKKwkJCWdvdG8gZXJyOworCiAJCWlmIChzdGF0ZS0+ZGV2X3ZlciA+PSAweDMwKSB7CiAJCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0FSRlJFUSwgMHg3OSkgPCAwKQogCQkJCWdvdG8gZXJyOwpAQCAtMTg1NiwxMiArMTg3MiwxMiBAQAogc3RhdGljIGludCBzdHYwOTB4X2JsaW5kX3NlYXJjaChzdHJ1Y3Qgc3R2MDkweF9zdGF0ZSAqc3RhdGUpCiB7CiAJdTMyIGFnYzIsIHJlZywgc3JhdGVfY29hcnNlOwotCXMzMiB0aW1lb3V0X2RtZCA9IDUwMCwgY3B0X2ZhaWwsIGFnYzJfb3ZmbHcsIGk7CisJczMyIGNwdF9mYWlsLCBhZ2MyX292Zmx3LCBpOwogCXU4IGtfcmVmLCBrX21heCwga19taW47CiAJaW50IGNvYXJzZV9mYWlsLCBsb2NrOwogCi0Ja19tYXggPSAxMjA7Ci0Ja19taW4gPSAzMDsKKwlrX21heCA9IDExMDsKKwlrX21pbiA9IDEwOwogCiAJYWdjMiA9IHN0djA5MHhfZ2V0X2FnYzJfbWluX2xldmVsKHN0YXRlKTsKIApAQCAtMTkwMCw3ICsxOTE2LDggQEAKIAkJCQlzcmF0ZV9jb2Fyc2UgPSBzdHYwOTB4X3NyYXRlX3NyY2hfZmluZShzdGF0ZSk7CiAJCQkJaWYgKHNyYXRlX2NvYXJzZSAhPSAwKSB7CiAJCQkJCXN0djA5MHhfZ2V0X2xvY2tfdG1nKHN0YXRlKTsKLQkJCQkJbG9jayA9IHN0djA5MHhfZ2V0X2RtZGxvY2soc3RhdGUsIHRpbWVvdXRfZG1kKTsKKwkJCQkJbG9jayA9IHN0djA5MHhfZ2V0X2RtZGxvY2soc3RhdGUsCisJCQkJCQkJc3RhdGUtPkRlbW9kVGltZW91dCk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJbG9jayA9IDA7CiAJCQkJfQpAQCAtMTkwOCw4ICsxOTI1LDggQEAKIAkJCQljcHRfZmFpbCA9IDA7CiAJCQkJYWdjMl9vdmZsdyA9IDA7CiAJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQkJYWdjMiAgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIEFHQzJJMSkgPDwgODsKLQkJCQkJYWdjMiB8PSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIEFHQzJJMCk7CisJCQkJCWFnYzIgKz0gKFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgQUdDMkkxKSA8PCA4KSB8CisJCQkJCQlTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIEFHQzJJMCk7CiAJCQkJCWlmIChhZ2MyID49IDB4ZmYwMCkKIAkJCQkJCWFnYzJfb3ZmbHcrKzsKIAkJCQkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTMik7CkBAIC0xOTIzLDcgKzE5NDAsNyBAQAogCiAJCQkJbG9jayA9IDA7CiAJCQl9Ci0JCQlrX3JlZiAtPSAzMDsKKwkJCWtfcmVmIC09IDIwOwogCQl9IHdoaWxlICgoa19yZWYgPj0ga19taW4pICYmICghbG9jaykgJiYgKCFjb2Fyc2VfZmFpbCkpOwogCX0KIApAQCAtMjA2Miw3ICsyMDc5LDcgQEAKIAkJCQkJCWdvdG8gZXJyOwogCiAJCQkJCWlmIChzdGF0ZS0+Y29uZmlnLT50dW5lcl9zZXRfZnJlcXVlbmN5KSB7Ci0JCQkJCQlpZiAoc3RhdGUtPmNvbmZpZy0+dHVuZXJfc2V0X2ZyZXF1ZW5jeShmZSwgc3RhdGUtPmZyZXF1ZW5jeSkgPCAwKQorCQkJCQkJaWYgKHN0YXRlLT5jb25maWctPnR1bmVyX3NldF9mcmVxdWVuY3koZmUsIGZyZXEpIDwgMCkKIAkJCQkJCQlnb3RvIGVycjsKIAkJCQkJfQogCkBAIC0yMDkzLDE3ICsyMTEwLDYgQEAKIAkJCQkJCWdvdG8gZXJyOwogCiAJCQkJCVNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIERNRElTVEFURSwgMHgxYyk7Ci0JCQkJCWlmIChzdGF0ZS0+ZGVsc3lzID09IFNUVjA5MHhfRFZCUzIpIHsKLQkJCQkJCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgRE1EQ0ZHTUQpOwotCQkJCQkJU1RWMDkweF9TRVRGSUVMRF9QeChyZWcsIERWQlMxX0VOQUJMRV9GSUVMRCwgMCk7Ci0JCQkJCQlTVFYwOTB4X1NFVEZJRUxEX1B4KHJlZywgRFZCUzJfRU5BQkxFX0ZJRUxELCAwKTsKLQkJCQkJCWlmIChTVFYwOTB4X1dSSVRFX0RFTU9EKHN0YXRlLCBETURDRkdNRCwgcmVnKSA8IDApCi0JCQkJCQkJZ290byBlcnI7Ci0JCQkJCQlTVFYwOTB4X1NFVEZJRUxEX1B4KHJlZywgRFZCUzFfRU5BQkxFX0ZJRUxELCAxKTsKLQkJCQkJCVNUVjA5MHhfU0VURklFTERfUHgocmVnLCBEVkJTMl9FTkFCTEVfRklFTEQsIDEpOwotCQkJCQkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIERNRENGR01ELCByZWcpIDwgMCkKLQkJCQkJCQlnb3RvIGVycjsKLQkJCQkJfQogCQkJCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0ZSSU5JVDEsIDB4MDApIDwgMCkKIAkJCQkJCWdvdG8gZXJyOwogCQkJCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ0ZSSU5JVDAsIDB4MDApIDwgMCkKQEAgLTI0MjUsNyArMjQzMSw3IEBACiAKIAlkZXJvdCA9IChpbnRfMSAqIGludF8yKSArCiAJCSgoaW50XzEgKiB0bXBfMikgPj4gMTIpICsKLQkJKChpbnRfMSAqIHRtcF8xKSA+PiAxMik7CisJCSgoaW50XzIgKiB0bXBfMSkgPj4gMTIpOwogCiAJcmV0dXJuIGRlcm90OwogfQpAQCAtMjczMiw3ICsyNzM4LDcgQEAKIAlzd2l0Y2ggKHN0YXRlLT5kZWxzeXMpIHsKIAljYXNlIFNUVjA5MHhfRFZCUzE6CiAJY2FzZSBTVFYwOTB4X0RTUzoKLQkJaWYgKHN0YXRlLT5hbGdvID09IFNUVjA5MHhfU0VBUkNIX0FVVE8pIHsKKwkJaWYgKHN0YXRlLT5zZWFyY2hfbW9kZSA9PSBTVFYwOTB4X1NFQVJDSF9BVVRPKSB7CiAJCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIERNRENGR01EKTsKIAkJCVNUVjA5MHhfU0VURklFTERfUHgocmVnLCBEVkJTMV9FTkFCTEVfRklFTEQsIDEpOwogCQkJU1RWMDkweF9TRVRGSUVMRF9QeChyZWcsIERWQlMyX0VOQUJMRV9GSUVMRCwgMCk7CkBAIC0yODU3LDYgKzI4NjMsOSBAQAogCQlpZiAoc3R2MDkweF9zZXRfc3JhdGUoc3RhdGUsIHNyYXRlKSA8IDApCiAJCQlnb3RvIGVycjsKIAkJYmxpbmRfdHVuZSA9IDE7CisKKwkJaWYgKHN0djA5MHhfZHZic190cmFja19jcmwoc3RhdGUpIDwgMCkKKwkJCWdvdG8gZXJyOwogCX0KIAogCWlmIChzdGF0ZS0+ZGV2X3ZlciA+PSAweDIwKSB7CkBAIC0zMDQyLDcgKzMwNTEsNyBAQAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gJnN0YXRlLT5mcm9udGVuZDsKIAllbnVtIHN0djA5MHhfc2lnbmFsX3N0YXRlIHNpZ25hbF9zdGF0ZSA9IFNUVjA5MHhfTk9DQVJSSUVSOwogCXUzMiByZWc7Ci0JczMyIHRpbWVvdXRfZG1kID0gNTAwLCB0aW1lb3V0X2ZlYyA9IDUwLCBhZ2MxX3Bvd2VyLCBwb3dlcl9pcSA9IDAsIGk7CisJczMyIGFnYzFfcG93ZXIsIHBvd2VyX2lxID0gMCwgaTsKIAlpbnQgbG9jayA9IDAsIGxvd19zciA9IDAsIG5vX3NpZ25hbCA9IDA7CiAKIAlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIFRTQ0ZHSCk7CkBAIC0zMDU0LDggKzMwNjMsMTMgQEAKIAkJZ290byBlcnI7CiAKIAlpZiAoc3RhdGUtPmRldl92ZXIgPj0gMHgyMCkgewotCQlpZiAoU1RWMDkweF9XUklURV9ERU1PRChzdGF0ZSwgQ09SUkVMQUJTLCAweDllKSA8IDApIC8qIGN1dCAyLjAgKi8KLQkJCWdvdG8gZXJyOworCQlpZiAoc3RhdGUtPnNyYXRlID4gNTAwMDAwMCkgeworCQkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIENPUlJFTEFCUywgMHg5ZSkgPCAwKQorCQkJCWdvdG8gZXJyOworCQl9IGVsc2UgeworCQkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIENPUlJFTEFCUywgMHg4MikgPCAwKQorCQkJCWdvdG8gZXJyOworCQl9CiAJfQogCiAJc3R2MDkweF9nZXRfbG9ja190bWcoc3RhdGUpOwpAQCAtMzE3NSw3ICszMTg5LDcgQEAKIAlpZiAoKGFnYzFfcG93ZXIgPT0gMCkgJiYgKHBvd2VyX2lxIDwgU1RWMDkweF9JUVBPV0VSX1RIUkVTSE9MRCkpIHsKIAkJZHByaW50ayhGRV9FUlJPUiwgMSwgIk5vIFNpZ25hbDogUE9XRVJfSVE9MHglMDJ4IiwgcG93ZXJfaXEpOwogCQlsb2NrID0gMDsKLQorCQlzaWduYWxfc3RhdGUgPSBTVFYwOTB4X05PQUdDMTsKIAl9IGVsc2UgewogCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIERFTU9EKTsKIAkJU1RWMDkweF9TRVRGSUVMRF9QeChyZWcsIFNQRUNJTlZfQ09OVFJPTF9GSUVMRCwgc3RhdGUtPmludmVyc2lvbik7CkBAIC0zMTk5LDE4ICszMjEzLDE3IEBACiAJCX0KIAl9CiAKLQkvKiBuZWVkIHRvIGNoZWNrIGZvciBBR0MxIHN0YXRlICovCi0KLQorCWlmIChzaWduYWxfc3RhdGUgPT0gU1RWMDkweF9OT0FHQzEpCisJCXJldHVybiBzaWduYWxfc3RhdGU7CiAKIAlpZiAoc3RhdGUtPmFsZ28gPT0gU1RWMDkweF9CTElORF9TRUFSQ0gpCiAJCWxvY2sgPSBzdHYwOTB4X2JsaW5kX3NlYXJjaChzdGF0ZSk7CiAKIAllbHNlIGlmIChzdGF0ZS0+YWxnbyA9PSBTVFYwOTB4X0NPTERfU0VBUkNIKQotCQlsb2NrID0gc3R2MDkweF9nZXRfY29sZGxvY2soc3RhdGUsIHRpbWVvdXRfZG1kKTsKKwkJbG9jayA9IHN0djA5MHhfZ2V0X2NvbGRsb2NrKHN0YXRlLCBzdGF0ZS0+RGVtb2RUaW1lb3V0KTsKIAogCWVsc2UgaWYgKHN0YXRlLT5hbGdvID09IFNUVjA5MHhfV0FSTV9TRUFSQ0gpCi0JCWxvY2sgPSBzdHYwOTB4X2dldF9kbWRsb2NrKHN0YXRlLCB0aW1lb3V0X2RtZCk7CisJCWxvY2sgPSBzdHYwOTB4X2dldF9kbWRsb2NrKHN0YXRlLCBzdGF0ZS0+RGVtb2RUaW1lb3V0KTsKIAogCWlmICgoIWxvY2spICYmIChzdGF0ZS0+YWxnbyA9PSBTVFYwOTB4X0NPTERfU0VBUkNIKSkgewogCQlpZiAoIWxvd19zcikgewpAQCAtMzI0NSw4ICszMjU4LDkgQEAKIAkJCQlnb3RvIGVycjsKIAkJfQogCi0JCWlmIChzdHYwOTB4X2dldF9sb2NrKHN0YXRlLCB0aW1lb3V0X2ZlYywgdGltZW91dF9mZWMpKSB7Ci0JCQlsb2NrID0gMTsKKwkJbG9jayA9IHN0djA5MHhfZ2V0X2xvY2soc3RhdGUsIHN0YXRlLT5GZWNUaW1lb3V0LAorCQkJCXN0YXRlLT5GZWNUaW1lb3V0KTsKKwkJaWYgKGxvY2spIHsKIAkJCWlmIChzdGF0ZS0+ZGVsc3lzID09IFNUVjA5MHhfRFZCUzIpIHsKIAkJCQlzdHYwOTB4X3NldF9zMnJvbGxvZmYoc3RhdGUpOwogCkBAIC0zMjczLDcgKzMyODcsNiBAQAogCQkJaWYgKFNUVjA5MHhfV1JJVEVfREVNT0Qoc3RhdGUsIEVSUkNUUkwyLCAweGMxKSA8IDApCiAJCQkJZ290byBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlsb2NrID0gMDsKIAkJCXNpZ25hbF9zdGF0ZSA9IFNUVjA5MHhfTk9EQVRBOwogCQkJbm9fc2lnbmFsID0gc3R2MDkweF9jaGtfc2lnbmFsKHN0YXRlKTsKIAkJfQpAQCAtMzI5Niw3ICszMzA5LDEzIEBACiAJc3RhdGUtPnNlYXJjaF9tb2RlID0gU1RWMDkweF9TRUFSQ0hfQVVUTzsKIAlzdGF0ZS0+YWxnbyA9IFNUVjA5MHhfQ09MRF9TRUFSQ0g7CiAJc3RhdGUtPmZlYyA9IFNUVjA5MHhfUFJFUlI7Ci0Jc3RhdGUtPnNlYXJjaF9yYW5nZSA9IDIwMDAwMDA7CisJaWYgKHN0YXRlLT5zcmF0ZSA+IDEwMDAwMDAwKSB7CisJCWRwcmludGsoRkVfREVCVUcsIDEsICJTZWFyY2ggcmFuZ2U6IDEwIE1IeiIpOworCQlzdGF0ZS0+c2VhcmNoX3JhbmdlID0gMTAwMDAwMDA7CisJfSBlbHNlIHsKKwkJZHByaW50ayhGRV9ERUJVRywgMSwgIlNlYXJjaCByYW5nZTogNSBNSHoiKTsKKwkJc3RhdGUtPnNlYXJjaF9yYW5nZSA9IDUwMDAwMDA7CisJfQogCiAJaWYgKHN0djA5MHhfYWxnbyhzdGF0ZSkgPT0gU1RWMDkweF9SQU5HRU9LKSB7CiAJCWRwcmludGsoRkVfREVCVUcsIDEsICJTZWFyY2ggc3VjY2VzcyEiKTsKQEAgLTMzMDksNyArMzMyOCw2IEBACiAJcmV0dXJuIERWQkZFX0FMR09fU0VBUkNIX0VSUk9SOwogfQogCi0vKiBGSVhNRSEgKi8KIHN0YXRpYyBpbnQgc3R2MDkweF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZW51bSBmZV9zdGF0dXMgKnN0YXR1cykKIHsKIAlzdHJ1Y3Qgc3R2MDkweF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTMzMzEsOSArMzM0OSwxNSBAQAogCQlkcHJpbnRrKEZFX0RFQlVHLCAxLCAiRGVsaXZlcnkgc3lzdGVtOiBEVkItUzIiKTsKIAkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKIAkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBMT0NLX0RFRklOSVRJRl9GSUVMRCkpIHsKLQkJCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgVFNTVEFUVVMpOwotCQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBUU0ZJRk9fTElORU9LX0ZJRUxEKSkgewotCQkJCSpzdGF0dXMgPSBGRV9IQVNfQ0FSUklFUiB8IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKwkJCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgUERFTFNUQVRVUzEpOworCQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBQS1RERUxJTl9MT0NLX0ZJRUxEKSkgeworCQkJCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgVFNTVEFUVVMpOworCQkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgVFNGSUZPX0xJTkVPS19GSUVMRCkpIHsKKwkJCQkJKnN0YXR1cyA9IEZFX0hBU19DQVJSSUVSIHwKKwkJCQkJCSAgRkVfSEFTX1ZJVEVSQkkgfAorCQkJCQkJICBGRV9IQVNfU1lOQyB8CisJCQkJCQkgIEZFX0hBU19MT0NLOworCQkJCX0KIAkJCX0KIAkJfQogCQlicmVhazsKQEAgLTM0MTIsMTQgKzM0MzYsMTIgQEAKIAlpbnQgcmVzID0gMDsKIAlpbnQgbWluID0gMCwgbWVkOwogCi0JaWYgKHZhbCA8IHRhYlttaW5dLnJlYWQpCi0JCXJlcyA9IHRhYlttaW5dLnJlYWw7Ci0JZWxzZSBpZiAodmFsID49IHRhYlttYXhdLnJlYWQpCi0JCXJlcyA9IHRhYlttYXhdLnJlYWw7Ci0JZWxzZSB7CisJaWYgKCh2YWwgPj0gdGFiW21pbl0ucmVhZCAmJiB2YWwgPCB0YWJbbWF4XS5yZWFkKSB8fAorCSAgICAodmFsID49IHRhYlttYXhdLnJlYWQgJiYgdmFsIDwgdGFiW21pbl0ucmVhZCkpIHsKIAkJd2hpbGUgKChtYXggLSBtaW4pID4gMSkgewogCQkJbWVkID0gKG1heCArIG1pbikgLyAyOwotCQkJaWYgKHZhbCA+PSB0YWJbbWluXS5yZWFkICYmIHZhbCA8IHRhYlttZWRdLnJlYWQpCisJCQlpZiAoKHZhbCA+PSB0YWJbbWluXS5yZWFkICYmIHZhbCA8IHRhYlttZWRdLnJlYWQpIHx8CisJCQkgICAgKHZhbCA+PSB0YWJbbWVkXS5yZWFkICYmIHZhbCA8IHRhYlttaW5dLnJlYWQpKQogCQkJCW1heCA9IG1lZDsKIAkJCWVsc2UKIAkJCQltaW4gPSBtZWQ7CkBAIC0zNDI4LDYgKzM0NTAsMTggQEAKIAkJICAgICAgICh0YWJbbWF4XS5yZWFsIC0gdGFiW21pbl0ucmVhbCkgLwogCQkgICAgICAgKHRhYlttYXhdLnJlYWQgLSB0YWJbbWluXS5yZWFkKSkgKwogCQkJdGFiW21pbl0ucmVhbDsKKwl9IGVsc2UgeworCQlpZiAodGFiW21pbl0ucmVhZCA8IHRhYlttYXhdLnJlYWQpIHsKKwkJCWlmICh2YWwgPCB0YWJbbWluXS5yZWFkKQorCQkJCXJlcyA9IHRhYlttaW5dLnJlYWw7CisJCQllbHNlIGlmICh2YWwgPj0gdGFiW21heF0ucmVhZCkKKwkJCQlyZXMgPSB0YWJbbWF4XS5yZWFsOworCQl9IGVsc2UgeworCQkJaWYgKHZhbCA+PSB0YWJbbWluXS5yZWFkKQorCQkJCXJlcyA9IHRhYlttaW5dLnJlYWw7CisJCQllbHNlIGlmICh2YWwgPCB0YWJbbWF4XS5yZWFkKQorCQkJCXJlcyA9IHRhYlttYXhdLnJlYWw7CisJCX0KIAl9CiAKIAlyZXR1cm4gcmVzOwpAQCAtMzQzNywxNiArMzQ3MSwyMiBAQAogewogCXN0cnVjdCBzdHYwOTB4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXUzMiByZWc7Ci0JczMyIGFnYzsKKwlzMzIgYWdjXzAsIGFnY18xLCBhZ2M7CisJczMyIHN0cjsKIAogCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgQUdDSVFJTjEpOwotCWFnYyA9IFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBBR0NJUV9WQUxVRV9GSUVMRCk7CisJYWdjXzEgPSBTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgQUdDSVFfVkFMVUVfRklFTEQpOworCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgQUdDSVFJTjApOworCWFnY18wID0gU1RWMDkweF9HRVRGSUVMRF9QeChyZWcsIEFHQ0lRX1ZBTFVFX0ZJRUxEKTsKKwlhZ2MgPSBNQUtFV09SRDE2KGFnY18xLCBhZ2NfMCk7CiAKLQkqc3RyZW5ndGggPSBzdHYwOTB4X3RhYmxlX2xvb2t1cChzdHYwOTB4X3JmX3RhYiwgQVJSQVlfU0laRShzdHYwOTB4X3JmX3RhYikgLSAxLCBhZ2MpOworCXN0ciA9IHN0djA5MHhfdGFibGVfbG9va3VwKHN0djA5MHhfcmZfdGFiLAorCQlBUlJBWV9TSVpFKHN0djA5MHhfcmZfdGFiKSAtIDEsIGFnYyk7CiAJaWYgKGFnYyA+IHN0djA5MHhfcmZfdGFiWzBdLnJlYWQpCi0JCSpzdHJlbmd0aCA9IDU7CisJCXN0ciA9IDA7CiAJZWxzZSBpZiAoYWdjIDwgc3R2MDkweF9yZl90YWJbQVJSQVlfU0laRShzdHYwOTB4X3JmX3RhYikgLSAxXS5yZWFkKQotCQkqc3RyZW5ndGggPSAtMTAwOworCQlzdHIgPSAtMTAwOworCSpzdHJlbmd0aCA9IChzdHIgKyAxMDApICogMHhGRkZGIC8gMTAwOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNDU3LDYgKzM0OTcsOCBAQAogCXUzMiByZWdfMCwgcmVnXzEsIHJlZywgaTsKIAlzMzIgdmFsXzAsIHZhbF8xLCB2YWwgPSAwOwogCXU4IGxvY2tfZjsKKwlzMzIgZGl2OworCXUzMiBsYXN0OwogCiAJc3dpdGNoIChzdGF0ZS0+ZGVsc3lzKSB7CiAJY2FzZSBTVFYwOTB4X0RWQlMyOgpAQCAtMzQ2OCwxNCArMzUxMCwxNSBAQAogCQkJCXJlZ18xID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBOTk9TUExIVDEpOwogCQkJCXZhbF8xID0gU1RWMDkweF9HRVRGSUVMRF9QeChyZWdfMSwgTk9TUExIVF9OT1JNRURfRklFTEQpOwogCQkJCXJlZ18wID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBOTk9TUExIVDApOwotCQkJCXZhbF8wID0gU1RWMDkweF9HRVRGSUVMRF9QeChyZWdfMSwgTk9TUExIVF9OT1JNRURfRklFTEQpOworCQkJCXZhbF8wID0gU1RWMDkweF9HRVRGSUVMRF9QeChyZWdfMCwgTk9TUExIVF9OT1JNRURfRklFTEQpOwogCQkJCXZhbCAgKz0gTUFLRVdPUkQxNih2YWxfMSwgdmFsXzApOwogCQkJCW1zbGVlcCgxKTsKIAkJCX0KIAkJCXZhbCAvPSAxNjsKLQkJCSpjbnIgPSBzdHYwOTB4X3RhYmxlX2xvb2t1cChzdHYwOTB4X3MyY25fdGFiLCBBUlJBWV9TSVpFKHN0djA5MHhfczJjbl90YWIpIC0gMSwgdmFsKTsKLQkJCWlmICh2YWwgPCBzdHYwOTB4X3MyY25fdGFiW0FSUkFZX1NJWkUoc3R2MDkweF9zMmNuX3RhYikgLSAxXS5yZWFkKQotCQkJCSpjbnIgPSAxMDAwOworCQkJbGFzdCA9IEFSUkFZX1NJWkUoc3R2MDkweF9zMmNuX3RhYikgLSAxOworCQkJZGl2ID0gc3R2MDkweF9zMmNuX3RhYlswXS5yZWFkIC0KKwkJCSAgICAgIHN0djA5MHhfczJjbl90YWJbbGFzdF0ucmVhZDsKKwkJCSpjbnIgPSAweEZGRkYgLSAoKHZhbCAqIDB4RkZGRikgLyBkaXYpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zNDg5LDE0ICszNTMyLDE1IEBACiAJCQkJcmVnXzEgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIE5PU0RBVEFUMSk7CiAJCQkJdmFsXzEgPSBTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZ18xLCBOT1NEQVRBVF9VTk5PUk1FRF9GSUVMRCk7CiAJCQkJcmVnXzAgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIE5PU0RBVEFUMCk7Ci0JCQkJdmFsXzAgPSBTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZ18xLCBOT1NEQVRBVF9VTk5PUk1FRF9GSUVMRCk7CisJCQkJdmFsXzAgPSBTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZ18wLCBOT1NEQVRBVF9VTk5PUk1FRF9GSUVMRCk7CiAJCQkJdmFsICArPSBNQUtFV09SRDE2KHZhbF8xLCB2YWxfMCk7CiAJCQkJbXNsZWVwKDEpOwogCQkJfQogCQkJdmFsIC89IDE2OwotCQkJKmNuciA9IHN0djA5MHhfdGFibGVfbG9va3VwKHN0djA5MHhfczFjbl90YWIsIEFSUkFZX1NJWkUoc3R2MDkweF9zMWNuX3RhYikgLSAxLCB2YWwpOwotCQkJaWYgKHZhbCA8IHN0djA5MHhfczJjbl90YWJbQVJSQVlfU0laRShzdHYwOTB4X3MxY25fdGFiKSAtIDFdLnJlYWQpCi0JCQkJKmNuciA9IDEwMDA7CisJCQlsYXN0ID0gQVJSQVlfU0laRShzdHYwOTB4X3MxY25fdGFiKSAtIDE7CisJCQlkaXYgPSBzdHYwOTB4X3MxY25fdGFiWzBdLnJlYWQgLQorCQkJICAgICAgc3R2MDkweF9zMWNuX3RhYltsYXN0XS5yZWFkOworCQkJKmNuciA9IDB4RkZGRiAtICgodmFsICogMHhGRkZGKSAvIGRpdik7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM3MzIsNiArMzc3Niw4IEBACiB7CiAJdTMyIHJlZyA9IDA7CiAKKwlyZWcgPSBzdHYwOTB4X3JlYWRfcmVnKHN0YXRlLCBTVFYwOTB4X0dFTkNGRyk7CisKIAlzd2l0Y2ggKGxkcGNfbW9kZSkgewogCWNhc2UgU1RWMDkweF9EVUFMOgogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkweF9wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkweF9wcml2LmgKaW5kZXggNWE0YTAxNy4uNTkyMWE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHhfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTB4X3ByaXYuaApAQCAtODMsNyArODMsNyBAQAogCiAjZGVmaW5lIFNUVjA5MHhfSVFQT1dFUl9USFJFU0hPTEQJICAzMAogI2RlZmluZSBTVFYwOTB4X1NFQVJDSF9BR0MyX1RIX0NVVDIwCSA3MDAKLSNkZWZpbmUgU1RWMDkweF9TRUFSQ0hfQUdDMl9USF9DVVQzMAkxMjAwCisjZGVmaW5lIFNUVjA5MHhfU0VBUkNIX0FHQzJfVEhfQ1VUMzAJMTQwMAogCiAjZGVmaW5lIFNUVjA5MHhfU0VBUkNIX0FHQzJfVEgoX192ZXIpCVwKIAkoKF9fdmVyIDw9IDB4MjApID8JCVwKQEAgLTkxLDYgKzkxLDcgQEAKIAlTVFYwOTB4X1NFQVJDSF9BR0MyX1RIX0NVVDMwKQogCiBlbnVtIHN0djA5MHhfc2lnbmFsX3N0YXRlIHsKKwlTVFYwOTB4X05PQUdDMSwKIAlTVFYwOTB4X05PQ0FSUklFUiwKIAlTVFYwOTB4X05PREFUQSwKIAlTVFYwOTB4X0RBVEFPSywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTB4X3JlZy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHhfcmVnLmgKaW5kZXggNTdiNmFiYi4uMjUwMjg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHhfcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHhfcmVnLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9PVVRTRVJSUzJfSFpfRklFTEQJNQogI2RlZmluZSBTVFYwOTB4X1dJRFRIX09VVFNFUlJTMl9IWl9GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfT1VUU0VSUlMzX0haX0ZJRUxECTQKLSNkZWZpbmUgU1RWMDkweF9XSURUSF9PVVRQQVJSUzNfSFpfRklFTEQJMQorI2RlZmluZSBTVFYwOTB4X1dJRFRIX09VVFNFUlJTM19IWl9GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfT1VUUEFSUlMzX0haX0ZJRUxECTMKICNkZWZpbmUgU1RWMDkweF9XSURUSF9PVVRQQVJSUzNfSFpfRklFTEQJMQogCkBAIC0xMTMsMjQgKzExMywyNCBAQAogI2RlZmluZSBTVFYwOTB4X0lSUU1BU0szCQkJMHhmMTI0CiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVBMTF9MT0NLX0ZJRUxECQk1CiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVBMTF9MT0NLX0ZJRUxECQkxCi0jZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNUUkVBTV9MQ0tfM19GSUVMRAkyCi0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNUUkVBTV9MQ0tfM19GSUVMRAkzCi0jZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNUUkVBTV9MQ0tfMl9GSUVMRAkyCi0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNUUkVBTV9MQ0tfMl9GSUVMRAkzCisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNUUkVBTV9MQ0tfM19GSUVMRAk0CisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNUUkVBTV9MQ0tfM19GSUVMRAkxCisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNUUkVBTV9MQ0tfMl9GSUVMRAkzCisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNUUkVBTV9MQ0tfMl9GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNUUkVBTV9MQ0tfMV9GSUVMRAkyCi0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNUUkVBTV9MQ0tfMV9GSUVMRAkzCisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNUUkVBTV9MQ0tfMV9GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTURWQlMxX1BSRl8yX0ZJRUxECTEKICNkZWZpbmUgU1RWMDkweF9XSURUSF9NRFZCUzFfUFJGXzJfRklFTEQJMQogI2RlZmluZSBTVFYwOTB4X09GRlNUX01EVkJTMV9QUkZfMV9GSUVMRAkwCiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTURWQlMxX1BSRl8xX0ZJRUxECTEKIAogI2RlZmluZSBTVFYwOTB4X0lSUU1BU0syCQkJMHhmMTI1Ci0jZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNQWV9FTkRTSU1fM19GSUVMRAk1Ci0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNQWV9FTkRTSU1fM19GSUVMRAkzCi0jZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNQWV9FTkRTSU1fMl9GSUVMRAk1Ci0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNQWV9FTkRTSU1fMl9GSUVMRAkzCisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNQWV9FTkRTSU1fM19GSUVMRAk3CisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNQWV9FTkRTSU1fM19GSUVMRAkxCisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNQWV9FTkRTSU1fMl9GSUVMRAk2CisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNQWV9FTkRTSU1fMl9GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVNQWV9FTkRTSU1fMV9GSUVMRAk1Ci0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNQWV9FTkRTSU1fMV9GSUVMRAkzCisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfTVNQWV9FTkRTSU1fMV9GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfTVBLVERFTF9FUlJPUl8yX0ZJRUxECTQKICNkZWZpbmUgU1RWMDkweF9XSURUSF9NUEtUREVMX0VSUk9SXzJfRklFTEQJMQogI2RlZmluZSBTVFYwOTB4X09GRlNUX01QS1RERUxfTE9DS0JfMl9GSUVMRAkzCkBAIC0zNzAsNyArMzcwLDcgQEAKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9TRUxYMVJBVElPX0ZJRUxECQk1CiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfU0VMWDFSQVRJT19GSUVMRAkJMQogI2RlZmluZSBTVFYwOTB4X09GRlNUX1NUT1BfUExMX0ZJRUxECQkzCi0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfU0VMWDFSQVRJT19GSUVMRAkJMQorI2RlZmluZSBTVFYwOTB4X1dJRFRIX1NUT1BfUExMX0ZJRUxECQkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfQllQQVNTUExMRlNLX0ZJRUxECTIKICNkZWZpbmUgU1RWMDkweF9XSURUSF9CWVBBU1NQTExGU0tfRklFTEQJMQogI2RlZmluZSBTVFYwOTB4X09GRlNUX1NFTE9TQ0lfRklFTEQJCTEKQEAgLTYxNiw3ICs2MTYsNyBAQAogI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X0NPTlRfVE9ORV9GSUVMRAk0CiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfQ09OVF9UT05FX0ZJRUxECTEKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9GSUZPXzRCUkVBRFlfRklFTEQJMwotI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0ZJRk9fNEJSRUFEWV9GSUVMRAkyCisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfRklGT180QlJFQURZX0ZJRUxECTEKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9GSUZPX0VNUFRZX0ZJRUxECTIKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9GSUZPX0VNUFRZX0ZJRUxECTEKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9BQk9SVF9ESVNSWF9GSUVMRAkwCkBAIC04NDcsMTIgKzg0NywxMCBAQAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0RWQlMyX0VOQUJMRV9GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfRFZCUzFfRU5BQkxFX0ZJRUxECTYKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9EVkJTMV9FTkFCTEVfRklFTEQJMQotI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X0NGUl9BVVRPU0NBTl9GSUVMRAk1IC8qIGNoZWNrICovCi0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfQ0ZSX0FVVE9TQ0FOX0ZJRUxECTEKLSNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9TQ0FOX0VOQUJMRV9GSUVMRAk0IC8qIGNoZWNrICovCisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfU0NBTl9FTkFCTEVfRklFTEQJNAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X1NDQU5fRU5BQkxFX0ZJRUxECTEKLSNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9UVU5fQVVUT1NDQU5fRklFTEQJMwotI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X1RVTl9BVVRPU0NBTl9GSUVMRAkxCisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfQ0ZSX0FVVE9TQ0FOX0ZJRUxECTMKKyNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9DRlJfQVVUT1NDQU5fRklFTEQJMQogI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X05PRk9SQ0VfUkVMT0NLX0ZJRUxECTIKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9OT0ZPUkNFX1JFTE9DS19GSUVMRAkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfVFVOX1JOR19GSUVMRAkJMApAQCAtODg1LDcgKzg4Myw3IEBACiAjZGVmaW5lIFNUVjA5MHhfUDJfRE1ERkxZVwkJCVNUVjA5MHhfUHhfRE1ERkxZVygyKQogI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X0kyQ19JUlFWQUxfRklFTEQJNAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0kyQ19JUlFWQUxfRklFTEQJNAotI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X0ZMWVdIRUVMX0NQVF9GSUVMRAkwIC8qIGNoZWNrICovCisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfRkxZV0hFRUxfQ1BUX0ZJRUxECTAKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9GTFlXSEVFTF9DUFRfRklFTEQJNAogCiAjZGVmaW5lIFNUVjA5MHhfUHhfRFNUQVRVUzMoX194KQkJKDB4RjQxRCAtIChfX3ggLSAxKSAqIDB4MjAwKQpAQCAtMTA0OCwxMiArMTA0NiwxMiBAQAogI2RlZmluZSBTVFYwOTB4X1AxX0NGUklOQzEJCQlTVFYwOTB4X1B4X0NGUklOQzEoMSkKICNkZWZpbmUgU1RWMDkweF9QMl9DRlJJTkMxCQkJU1RWMDkweF9QeF9DRlJJTkMxKDIpCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfQ0ZSX0lOQzFfRklFTEQJCTAKLSNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9DRlJfSU5DMV9GSUVMRAkJNworI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0NGUl9JTkMxX0ZJRUxECQk3IC8qIGNoZWNrICovCiAKICNkZWZpbmUgU1RWMDkweF9QeF9DRlJJTkMwKF9feCkJCQkoMHhGNDRCIC0gKF9feCAtIDEpICogMHgyMDApCiAjZGVmaW5lIFNUVjA5MHhfUDFfQ0ZSSU5DMAkJCVNUVjA5MHhfUHhfQ0ZSSU5DMCgxKQogI2RlZmluZSBTVFYwOTB4X1AyX0NGUklOQzAJCQlTVFYwOTB4X1B4X0NGUklOQzAoMikKLSNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9DRlJfSU5DMF9GSUVMRAkJNAorI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X0NGUl9JTkMwX0ZJRUxECQk0IC8qIGNoZWNrICovCiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfQ0ZSX0lOQzBfRklFTEQJCTQKIAogI2RlZmluZSBTVFYwOTB4X1BuX0NGUnkoX194LCBfX3kpCQkoMHhGNDRFIC0gKF9feCAtIDEpICogMHgyMDAgLSBfX3kgKiAweDEpCkBAIC0xMTQ1LDE0ICsxMTQzLDE0IEBACiAjZGVmaW5lIFNUVjA5MHhfUHhfU0ZSSU5JVDEoX194KQkJKDB4RjQ1RSAtIChfX3ggLSAxKSAqIDB4MjAwKQogI2RlZmluZSBTVFYwOTB4X1AxX1NGUklOSVQxCQkJU1RWMDkweF9QeF9TRlJJTklUMSgxKQogI2RlZmluZSBTVFYwOTB4X1AyX1NGUklOSVQxCQkJU1RWMDkweF9QeF9TRlJJTklUMSgyKQotI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X1NGUl9JTklUX0ZJRUxECQkwCi0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfU0ZSX0lOSVRfRklFTEQJCTgKKyNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9TRlJfSU5JVDFfRklFTEQJMAorI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X1NGUl9JTklUMV9GSUVMRAk3CiAKICNkZWZpbmUgU1RWMDkweF9QeF9TRlJJTklUMChfX3gpCQkoMHhGNDVGIC0gKF9feCAtIDEpICogMHgyMDApCiAjZGVmaW5lIFNUVjA5MHhfUDFfU0ZSSU5JVDAJCQlTVFYwOTB4X1B4X1NGUklOSVQwKDEpCiAjZGVmaW5lIFNUVjA5MHhfUDJfU0ZSSU5JVDAJCQlTVFYwOTB4X1B4X1NGUklOSVQwKDIpCi0jZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfU0ZSX0lOSVRfRklFTEQJCTAKLSNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9TRlJfSU5JVF9GSUVMRAkJOAorI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X1NGUl9JTklUMF9GSUVMRAkwCisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfU0ZSX0lOSVQwX0ZJRUxECTgKIAogI2RlZmluZSBTVFYwOTB4X1B4X1NGUlVQMShfX3gpCQkJKDB4RjQ2MCAtIChfX3ggLSAxKSAqIDB4MjAwKQogI2RlZmluZSBTVFYwOTB4X1AxX1NGUlVQMQkJCVNUVjA5MHhfUHhfU0ZSVVAxKDEpCkBAIC0xMTc4LDcgKzExNzYsNyBAQAogI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X1NZTUJfRlJFUV9MT1cwX0ZJRUxECTAKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9TWU1CX0ZSRVFfTE9XMF9GSUVMRAk4CiAKLSNkZWZpbmUgU1RWMDkweF9QeF9TRlJ5KF9feCwgX195KQkJKDB4RjQ2NCAtIChfX3gtMSkgKiAweDIwMCArICgzIC0gX195KSkKKyNkZWZpbmUgU1RWMDkweF9QeF9TRlJ5KF9feCwgX195KQkJKDB4RjQ2NyAtIChfX3gtMSkgKiAweDIwMCAtIF9feSkKICNkZWZpbmUgU1RWMDkweF9QMV9TRlIwCQkJCVNUVjA5MHhfUHhfU0ZSeSgxLCAwKQogI2RlZmluZSBTVFYwOTB4X1AxX1NGUjEJCQkJU1RWMDkweF9QeF9TRlJ5KDEsIDEpCiAjZGVmaW5lIFNUVjA5MHhfUDFfU0ZSMgkJCQlTVFYwOTB4X1B4X1NGUnkoMSwgMikKQEAgLTExODgsNyArMTE4Niw3IEBACiAjZGVmaW5lIFNUVjA5MHhfUDJfU0ZSMgkJCQlTVFYwOTB4X1B4X1NGUnkoMiwgMikKICNkZWZpbmUgU1RWMDkweF9QMl9TRlIzCQkJCVNUVjA5MHhfUHhfU0ZSeSgyLCAzKQogI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X1NZTUJfRlJFUV9GSUVMRAkwCi0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfU1lNQl9GUkVRX0ZJRUxECTMyCisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfU1lNQl9GUkVRX0ZJRUxECTgKIAogI2RlZmluZSBTVFYwOTB4X1B4X1RNR1JFRzIoX194KQkJCSgweEY0NjggLSAoX194IC0gMSkgKiAweDIwMCkKICNkZWZpbmUgU1RWMDkweF9QMV9UTUdSRUcyCQkJU1RWMDkweF9QeF9UTUdSRUcyKDEpCkBAIC0xMTk4LDcgKzExOTYsNyBAQAogCiAjZGVmaW5lIFNUVjA5MHhfUHhfVE1HUkVHMShfX3gpCQkJKDB4RjQ2OSAtIChfX3ggLSAxKSAqIDB4MjAwKQogI2RlZmluZSBTVFYwOTB4X1AxX1RNR1JFRzEJCQlTVFYwOTB4X1B4X1RNR1JFRzEoMSkKLSNkZWZpbmUgU1RWMDkweF9QMl9UTUdSRUcxCQkJCVNUVjA5MHhfUHhfVE1HUkVHMSgyKQorI2RlZmluZSBTVFYwOTB4X1AyX1RNR1JFRzEJCQlTVFYwOTB4X1B4X1RNR1JFRzEoMikKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9UTUdSRUdfRklFTEQJCTAKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9UTUdSRUdfRklFTEQJCTgKIApAQCAtMTIzMCw3ICsxMjI4LDcgQEAKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9NVV9FUVVBTERGRV9GSUVMRAkwCiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfTVVfRVFVQUxERkVfRklFTEQJMwogCi0jZGVmaW5lIFNUVjA5MHhfUHhfRVFVQUl5KF9feCwgX195KQkJKDB4ZjQ3MCAtIChfX3ggLSAxKSAqIDB4MjAwICsgKF9feSAtIDEpKQorI2RlZmluZSBTVFYwOTB4X1B4X0VRVUFJeShfX3gsIF9feSkJKDB4ZjQ3MCAtIChfX3gtMSkgKiAweDIwMCArIDIgKiAoX195LTEpKQogI2RlZmluZSBTVFYwOTB4X1AxX0VRVUFJMQkJCVNUVjA5MHhfUHhfRVFVQUl5KDEsIDEpCiAjZGVmaW5lIFNUVjA5MHhfUDFfRVFVQUkyCQkJU1RWMDkweF9QeF9FUVVBSXkoMSwgMikKICNkZWZpbmUgU1RWMDkweF9QMV9FUVVBSTMJCQlTVFYwOTB4X1B4X0VRVUFJeSgxLCAzKQpAQCAtMTI1MSw3ICsxMjQ5LDcgQEAKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9FUVVBX0FDQ0l5X0ZJRUxECTAKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9FUVVBX0FDQ0l5X0ZJRUxECTgKIAotI2RlZmluZSBTVFYwOTB4X1B4X0VRVUFReShfX3gsIF9feSkJCSgweGY0NzEgLSAoX194IC0gMSkgKiAweDIwMCArIChfX3kgLSAxKSkKKyNkZWZpbmUgU1RWMDkweF9QeF9FUVVBUXkoX194LCBfX3kpCSgweGY0NzEgLSAoX194LTEpICogMHgyMDAgKyAyICogKF9feS0xKSkKICNkZWZpbmUgU1RWMDkweF9QMV9FUVVBUTEJCQlTVFYwOTB4X1B4X0VRVUFReSgxLCAxKQogI2RlZmluZSBTVFYwOTB4X1AxX0VRVUFRMgkJCVNUVjA5MHhfUHhfRVFVQVF5KDEsIDIpCiAjZGVmaW5lIFNUVjA5MHhfUDFfRVFVQVEzCQkJU1RWMDkweF9QeF9FUVVBUXkoMSwgMykKQEAgLTEzOTAsNyArMTM4OCw3IEBACiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfQ0FSMlMyXzE2QV9BTFBIX0VfRklFTEQJMAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0NBUjJTMl8xNkFfQUxQSF9FX0ZJRUxECTQKIAotI2RlZmluZSBTVFYwOTB4X1B4X0FDTEMyUzIzMkEoX194KQkJKDB4ZjQ5OSAtIChfX3ggLSAxKSAqIDB4MjAwKQorI2RlZmluZSBTVFYwOTB4X1B4X0FDTEMyUzIzMkEoX194KQkJKDB4ZjQ5QSAtIChfX3ggLSAxKSAqIDB4MjAwKQogI2RlZmluZSBTVFYwOTB4X1AxX0FDTEMyUzIzMkEJCQlTVFYwOTB4X1B4X0FDTEMyUzIzMkEoMSkKICNkZWZpbmUgU1RWMDkweF9QMl9BQ0xDMlMyMzJBCQkJU1RWMDkweF9QeF9BQ0xDMlMyMzJBKDIpCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfQ0FSMlMyXzMyQV9BTFBIX01fRklFTEQJNApAQCAtMTQxNCw3ICsxNDEyLDcgQEAKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9DQVIyUzJfOF9CRVRBX0VfRklFTEQJMAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0NBUjJTMl84X0JFVEFfRV9GSUVMRAk0CiAKLSNkZWZpbmUgU1RWMDkweF9QeF9CQ0xDMlMyMTZBKF9feCkJCSgweGY0OWQgLSAoX194IC0gMSkgKiAweDIwMCkKKyNkZWZpbmUgU1RWMDkweF9QeF9CQ0xDMlMyMTZBKF9feCkJCSgweGY0OWUgLSAoX194IC0gMSkgKiAweDIwMCkKICNkZWZpbmUgU1RWMDkweF9QMV9CQ0xDMlMyMTZBCQkJU1RWMDkweF9QeF9CQ0xDMlMyMTZBKDEpCiAjZGVmaW5lIFNUVjA5MHhfUDJfQkNMQzJTMjE2QQkJCVNUVjA5MHhfUHhfQkNMQzJTMjE2QSgxKQogI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X0NBUjJTMl8xNkFfQkVUQV9NX0ZJRUxECTQKQEAgLTE0MjIsNyArMTQyMCw3IEBACiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfQ0FSMlMyXzE2QV9CRVRBX0VfRklFTEQJMAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0NBUjJTMl8xNkFfQkVUQV9FX0ZJRUxECTQKIAotI2RlZmluZSBTVFYwOTB4X1B4X0JDTEMyUzIzMkEoX194KQkJKDB4ZjQ5ZCAtIChfX3ggLSAxKSAqIDB4MjAwKQorI2RlZmluZSBTVFYwOTB4X1B4X0JDTEMyUzIzMkEoX194KQkJKDB4ZjQ5ZiAtIChfX3ggLSAxKSAqIDB4MjAwKQogI2RlZmluZSBTVFYwOTB4X1AxX0JDTEMyUzIzMkEJCQlTVFYwOTB4X1B4X0JDTEMyUzIzMkEoMSkKICNkZWZpbmUgU1RWMDkweF9QMl9CQ0xDMlMyMzJBCQkJU1RWMDkweF9QeF9CQ0xDMlMyMzJBKDEpCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfQ0FSMlMyXzMyQV9CRVRBX01fRklFTEQJNApAQCAtMTQ1OCw3ICsxNDU2LDcgQEAKICNkZWZpbmUgU1RWMDkweF9QMV9NT0RDT0RMU1QxCQkJU1RWMDkweF9QeF9NT0RDT0RMU1QxKDEpCiAjZGVmaW5lIFNUVjA5MHhfUDJfTU9EQ09ETFNUMQkJCVNUVjA5MHhfUHhfTU9EQ09ETFNUMSgyKQogI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X0RJU19NT0RDT0QyOV9GSUVMRAk0Ci0jZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfRElTX01PRENPRDI5VF9GSUVMRAk0CisjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfRElTX01PRENPRDI5X0ZJRUxECTQKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9ESVNfMzJQU0tfOV8xMF9GSUVMRAkwCiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfRElTXzMyUFNLXzlfMTBfRklFTEQJNAogCkBAIC0yMTgwLDcgKzIxNzgsNyBAQAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X1RTRklGT1NQRUVEX1NUT1JFX0ZJRUxECTEKICNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9ESUxYWF9SRVNFVF9GSUVMRAkJNQogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X0RJTFhYX1JFU0VUX0ZJRUxECQkxCi0jZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfVFNTRVJJQUxfSU1QT1NfRklFTEQJCTUKKyNkZWZpbmUgU1RWMDkweF9PRkZTVF9QeF9UU1NFUklBTF9JTVBPU19GSUVMRAkJNAogI2RlZmluZSBTVFYwOTB4X1dJRFRIX1B4X1RTU0VSSUFMX0lNUE9TX0ZJRUxECQkxCiAjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfU0NSQU1CREVURUNUX0ZJRUxECQkxCiAjZGVmaW5lIFNUVjA5MHhfV0lEVEhfUHhfU0NSQU1CREVURUNUX0ZJRUxECQkxCkBAIC0yMTkwLDcgKzIxODgsNyBAQAogI2RlZmluZSBTVFYwOTB4X1AxX1RTQklUUkFURTEJCQkJU1RWMDkweF9QeF9UU0JJVFJBVEV5KDEsIDEpCiAjZGVmaW5lIFNUVjA5MHhfUDJfVFNCSVRSQVRFMAkJCQlTVFYwOTB4X1B4X1RTQklUUkFURXkoMiwgMCkKICNkZWZpbmUgU1RWMDkweF9QMl9UU0JJVFJBVEUxCQkJCVNUVjA5MHhfUHhfVFNCSVRSQVRFeSgyLCAxKQotI2RlZmluZSBTVFYwOTB4X09GRlNUX1B4X1RTRklGT19CSVRSQVRFX0ZJRUxECQk3CisjZGVmaW5lIFNUVjA5MHhfT0ZGU1RfUHhfVFNGSUZPX0JJVFJBVEVfRklFTEQJCTAKICNkZWZpbmUgU1RWMDkweF9XSURUSF9QeF9UU0ZJRk9fQklUUkFURV9GSUVMRAkJOAogCiAjZGVmaW5lIFNUVjA5MHhfUHhfRVJSQ1RSTDEoX194KQkJCSgweEY1OTggLSAoX194IC0gMSkgKiAweDIwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHY2MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2NjExMC5jCmluZGV4IGRjZjFiMjEuLmJlZjBjYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHY2MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djYxMTAuYwpAQCAtMzcsNiArMzcsNyBAQAogCiAJdTMyIG1jbGs7CiAJdTggY2xrX2RpdjsKKwl1OCBnYWluOwogCXU4IHJlZ3NbOF07CiB9OwogCkBAIC0yNTUsNyArMjU2LDcgQEAKIAl1OCByZXQgPSAweDA0OwogCXUzMiBkaXZpZGVyLCByZWYsIHAsIHByZXNjLCBpLCByZXN1bHRfZnJlcSwgdmNvX2ZyZXE7CiAJczMyIHBfY2FsYywgcF9jYWxjX29wdCA9IDEwMDAsIHJfZGl2LCByX2Rpdl9vcHQgPSAwLCBwX3ZhbDsKLQlzMzIgc3JhdGU7IHU4IGdhaW47CisJczMyIHNyYXRlOwogCiAJZHByaW50aygiJXMsIGZyZXE9JWQga0h6LCBtY2xrPSVkIEh6XG4iLCBfX2Z1bmNfXywKIAkJCQkJCWZyZXF1ZW5jeSwgcHJpdi0+bWNsayk7CkBAIC0yNzMsMTUgKzI3NCw4IEBACiAJfSBlbHNlCiAJCXNyYXRlID0gMTUwMDAwMDA7CiAKLQlpZiAoc3JhdGUgPj0gMTUwMDAwMDApCi0JCWdhaW4gPSAzOyAvKiArNiBkQiAqLwotCWVsc2UgaWYgKHNyYXRlID49IDUwMDAwMDApCi0JCWdhaW4gPSAzOyAvKiArNiBkQiAqLwotCWVsc2UKLQkJZ2FpbiA9IDM7IC8qICs2IGRCICovCi0KIAlwcml2LT5yZWdzW1JTVFY2MTEwX0NUUkwyXSAmPSB+MHgwZjsKLQlwcml2LT5yZWdzW1JTVFY2MTEwX0NUUkwyXSB8PSAoZ2FpbiAmIDB4MGYpOworCXByaXYtPnJlZ3NbUlNUVjYxMTBfQ1RSTDJdIHw9IChwcml2LT5nYWluICYgMHgwZik7CiAKIAlpZiAoZnJlcXVlbmN5IDw9IDEwMjMwMDApIHsKIAkJcCA9IDE7CkBAIC00MzYsNiArNDMwLDcgQEAKIAlwcml2LT5pMmMgPSBpMmM7CiAJcHJpdi0+bWNsayA9IGNvbmZpZy0+bWNsazsKIAlwcml2LT5jbGtfZGl2ID0gY29uZmlnLT5jbGtfZGl2OworCXByaXYtPmdhaW4gPSBjb25maWctPmdhaW47CiAKIAltZW1jcHkoJnByaXYtPnJlZ3MsICZyZWcwWzFdLCA4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djYxMTAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHY2MTEwLmgKaW5kZXggOWRiMjQwMi4uZmU3MWJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djYxMTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2NjExMC5oCkBAIC00MSw2ICs0MSw3IEBACiBzdHJ1Y3Qgc3R2NjExMF9jb25maWcgewogCXU4IGkyY19hZGRyZXNzOwogCXUzMiBtY2xrOworCXU4IGdhaW47CiAJdTggY2xrX2RpdjsJLyogZGl2aXNvciB2YWx1ZSBmb3IgdGhlIG91dHB1dCBjbG9jayAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djYxMTB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2NjExMHguYwppbmRleCAzZDhhMmUwLi5iY2ZjYjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2NjExMHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2NjExMHguYwpAQCAtOTUsNyArOTUsNyBAQAogewogCXN0cnVjdCBzdHY2MTEweF9zdGF0ZSAqc3R2NjExMHggPSBmZS0+dHVuZXJfcHJpdjsKIAl1MzIgckRpdiwgZGl2aWRlcjsKLQlzMzIgcFZhbCwgcENhbGMsIHJEaXZPcHQgPSAwOworCXMzMiBwVmFsLCBwQ2FsYywgckRpdk9wdCA9IDAsIHBDYWxjT3B0ID0gMTAwMDsKIAl1OCBpOwogCiAJU1RWNjExMHhfU0VURklFTEQoc3R2NjExMHhfcmVnc1tTVFY2MTEweF9DVFJMMV0sIENUUkwxX0ssIChSRUZDTE9DS19NSHogLSAxNikpOwpAQCAtMTIxLDggKzEyMSwxMCBAQAogCWZvciAockRpdiA9IDA7IHJEaXYgPD0gMzsgckRpdisrKSB7CiAJCXBDYWxjID0gKFJFRkNMT0NLX2tIeiAvIDEwMCkgLyBSX0RJVihyRGl2KTsKIAotCQlpZiAoKGFicygoczMyKShwQ2FsYyAtIHBWYWwpKSkgPCAoYWJzKChzMzIpKDEwMDAgLSBwVmFsKSkpKQorCQlpZiAoKGFicygoczMyKShwQ2FsYyAtIHBWYWwpKSkgPCAoYWJzKChzMzIpKHBDYWxjT3B0IC0gcFZhbCkpKSkKIAkJCXJEaXZPcHQgPSByRGl2OworCisJCXBDYWxjT3B0ID0gKFJFRkNMT0NLX2tIeiAvIDEwMCkgLyBSX0RJVihyRGl2T3B0KTsKIAl9CiAKIAlkaXZpZGVyID0gKGZyZXF1ZW5jeSAqIFJfRElWKHJEaXZPcHQpICogcFZhbCkgLyBSRUZDTE9DS19rSHo7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wdDEvcHQxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wdDEvcHQxLmMKaW5kZXggMWZkODMwNi4uODFlNjIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvcHQxL3B0MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS9wdDEuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSAiZHZiZGV2LmgiCiAjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wdDEvdmExajVqZjgwMDdzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wdDEvdmExajVqZjgwMDdzLmMKaW5kZXggMmRiOTQwZi4uZmM2NTk0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvcHQxL3ZhMWo1amY4MDA3cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS92YTFqNWpmODAwN3MuYwpAQCAtNDgsNiArNDgsNjAgQEAKIAllbnVtIHZhMWo1amY4MDA3c190dW5lX3N0YXRlIHR1bmVfc3RhdGU7CiB9OwogCitzdGF0aWMgaW50IHZhMWo1amY4MDA3c19yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IHZhMWo1amY4MDA3c19zdGF0ZSAqc3RhdGU7CisJdTggYWRkcjsKKwlpbnQgaTsKKwl1OCB3cml0ZV9idWZbMV0sIHJlYWRfYnVmWzFdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl07CisJczMyIHdvcmQsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeTsKKworCXN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3M7CisKKwl3b3JkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXdyaXRlX2J1ZlswXSA9IDB4YmMgKyBpOworCisJCW1zZ3NbMF0uYWRkciA9IGFkZHI7CisJCW1zZ3NbMF0uZmxhZ3MgPSAwOworCQltc2dzWzBdLmxlbiA9IHNpemVvZih3cml0ZV9idWYpOworCQltc2dzWzBdLmJ1ZiA9IHdyaXRlX2J1ZjsKKworCQltc2dzWzFdLmFkZHIgPSBhZGRyOworCQltc2dzWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJCW1zZ3NbMV0ubGVuID0gc2l6ZW9mKHJlYWRfYnVmKTsKKwkJbXNnc1sxXS5idWYgPSByZWFkX2J1ZjsKKworCQlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5hZGFwLCBtc2dzLCAyKSAhPSAyKQorCQkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwkJd29yZCA8PD0gODsKKwkJd29yZCB8PSByZWFkX2J1ZlswXTsKKwl9CisKKwl3b3JkIC09IDMwMDA7CisJaWYgKHdvcmQgPCAwKQorCQl3b3JkID0gMDsKKworCXgxID0gaW50X3NxcnQod29yZCA8PCAxNikgKiAoKDE1NjI1bGwgPDwgMjEpIC8gMTAwMDAwMCk7CisJeDIgPSAoczY0KXgxICogeDEgPj4gMzE7CisJeDMgPSAoczY0KXgyICogeDEgPj4gMzE7CisJeDQgPSAoczY0KXgyICogeDIgPj4gMzE7CisJeDUgPSAoczY0KXg0ICogeDEgPj4gMzE7CisKKwl5ID0gKDU4ODU3bGwgPDwgMjMpIC8gMTAwMDsKKwl5IC09IChzNjQpeDEgKiAoKDg5NTY1bGwgPDwgMjQpIC8gMTAwMCkgPj4gMzA7CisJeSArPSAoczY0KXgyICogKCg4ODk3N2xsIDw8IDI0KSAvIDEwMDApID4+IDI4OworCXkgLT0gKHM2NCl4MyAqICgoNTAyNTlsbCA8PCAyNSkgLyAxMDAwKSA+PiAyNzsKKwl5ICs9IChzNjQpeDQgKiAoKDE0MzQxbGwgPDwgMjcpIC8gMTAwMCkgPj4gMjc7CisJeSAtPSAoczY0KXg1ICogKCgxNjM0NmxsIDw8IDMwKSAvIDEwMDAwKSA+PiAyODsKKworCSpzbnIgPSB5IDwgMCA/IDAgOiB5ID4+IDE1OworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZhMWo1amY4MDA3c19nZXRfZnJvbnRlbmRfYWxnbyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlyZXR1cm4gRFZCRkVfQUxHT19IVzsKQEAgLTMzNyw3ICszOTEsNyBAQAogewogCXN0cnVjdCB2YTFqNWpmODAwN3Nfc3RhdGUgKnN0YXRlOwogCWludCByZXQ7Ci0JaW50IGxvY2s7CisJaW50IGxvY2sgPSAwOwogCiAJc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIApAQCAtNTM2LDYgKzU5MCw3IEBACiAJCQlGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8IEZFX0NBTl9ISUVSQVJDSFlfQVVUTywKIAl9LAogCisJLnJlYWRfc25yID0gdmExajVqZjgwMDdzX3JlYWRfc25yLAogCS5nZXRfZnJvbnRlbmRfYWxnbyA9IHZhMWo1amY4MDA3c19nZXRfZnJvbnRlbmRfYWxnbywKIAkucmVhZF9zdGF0dXMgPSB2YTFqNWpmODAwN3NfcmVhZF9zdGF0dXMsCiAJLnR1bmUgPSB2YTFqNWpmODAwN3NfdHVuZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS92YTFqNWpmODAwN3QuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS92YTFqNWpmODAwN3QuYwppbmRleCA3MTExN2Y0Li4zZGI0ZjNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvcHQxL3ZhMWo1amY4MDA3dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS92YTFqNWpmODAwN3QuYwpAQCAtNDYsNiArNDYsNTIgQEAKIAllbnVtIHZhMWo1amY4MDA3dF90dW5lX3N0YXRlIHR1bmVfc3RhdGU7CiB9OwogCitzdGF0aWMgaW50IHZhMWo1amY4MDA3dF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IHZhMWo1amY4MDA3dF9zdGF0ZSAqc3RhdGU7CisJdTggYWRkcjsKKwlpbnQgaTsKKwl1OCB3cml0ZV9idWZbMV0sIHJlYWRfYnVmWzFdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl07CisJczMyIHdvcmQsIHgsIHk7CisKKwlzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzOworCisJd29yZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl3cml0ZV9idWZbMF0gPSAweDhiICsgaTsKKworCQltc2dzWzBdLmFkZHIgPSBhZGRyOworCQltc2dzWzBdLmZsYWdzID0gMDsKKwkJbXNnc1swXS5sZW4gPSBzaXplb2Yod3JpdGVfYnVmKTsKKwkJbXNnc1swXS5idWYgPSB3cml0ZV9idWY7CisKKwkJbXNnc1sxXS5hZGRyID0gYWRkcjsKKwkJbXNnc1sxXS5mbGFncyA9IEkyQ19NX1JEOworCQltc2dzWzFdLmxlbiA9IHNpemVvZihyZWFkX2J1Zik7CisJCW1zZ3NbMV0uYnVmID0gcmVhZF9idWY7CisKKwkJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+YWRhcCwgbXNncywgMikgIT0gMikKKwkJCXJldHVybiAtRVJFTU9URUlPOworCisJCXdvcmQgPDw9IDg7CisJCXdvcmQgfD0gcmVhZF9idWZbMF07CisJfQorCisJaWYgKCF3b3JkKQorCQlyZXR1cm4gLUVJTzsKKworCXggPSAxMCAqIChpbnRsb2cxMCgweDU0MDAwMCAqIDEwMCAvIHdvcmQpIC0gKDIgPDwgMjQpKTsKKwl5ID0gKDI0bGwgPDwgNDYpIC8gMTAwMDAwMDsKKwl5ID0gKChzNjQpeSAqIHggPj4gMzApIC0gKDE2bGwgPDwgNDApIC8gMTAwMDA7CisJeSA9ICgoczY0KXkgKiB4ID4+IDI5KSArICgzOThsbCA8PCAzNSkgLyAxMDAwMDsKKwl5ID0gKChzNjQpeSAqIHggPj4gMzApICsgKDU0OTFsbCA8PCAyOSkgLyAxMDAwMDsKKwl5ID0gKChzNjQpeSAqIHggPj4gMzApICsgKDMwOTY1bGwgPDwgMjMpIC8gMTAwMDA7CisJKnNuciA9IHkgPj4gMTU7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdmExajVqZjgwMDd0X2dldF9mcm9udGVuZF9hbGdvKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXJldHVybiBEVkJGRV9BTEdPX0hXOwpAQCAtMjI0LDcgKzI3MCw3IEBACiB7CiAJc3RydWN0IHZhMWo1amY4MDA3dF9zdGF0ZSAqc3RhdGU7CiAJaW50IHJldDsKLQlpbnQgbG9jaywgcmV0cnk7CisJaW50IGxvY2sgPSAwLCByZXRyeSA9IDA7CiAKIAlzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCkBAIC0zOTMsNiArNDM5LDcgQEAKIAkJCUZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPIHwgRkVfQ0FOX0hJRVJBUkNIWV9BVVRPLAogCX0sCiAKKwkucmVhZF9zbnIgPSB2YTFqNWpmODAwN3RfcmVhZF9zbnIsCiAJLmdldF9mcm9udGVuZF9hbGdvID0gdmExajVqZjgwMDd0X2dldF9mcm9udGVuZF9hbGdvLAogCS5yZWFkX3N0YXR1cyA9IHZhMWo1amY4MDA3dF9yZWFkX3N0YXR1cywKIAkudHVuZSA9IHZhMWo1amY4MDA3dF90dW5lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYwppbmRleCAwNDIwZTI4Li4xMDY3YjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYwpAQCAtOTcsNyArOTcsNyBAQAogCX0sCiB9OwogCi1zdHJ1Y3Qgc21zX2JvYXJkICpzbXNfZ2V0X2JvYXJkKGludCBpZCkKK3N0cnVjdCBzbXNfYm9hcmQgKnNtc19nZXRfYm9hcmQodW5zaWduZWQgaWQpCiB7CiAJQlVHX09OKGlkID49IEFSUkFZX1NJWkUoc21zX2JvYXJkcykpOwogCkBAIC0yOTQsNiArMjk0LDggQEAKIAljYXNlIFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX09LRU1PX0E6CiAJY2FzZSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9PS0VNT19COgogCWNhc2UgU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfV0lOREhBTToKKwljYXNlIFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1RJR0VSX01JTklDQVJEOgorCWNhc2UgU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfVElHRVJfTUlOSUNBUkRfUjI6CiAJCXJlcXVlc3RfbW9kdWxlKCJzbXNkdmIiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmgKaW5kZXggMzhmMDYyZi4uOGYxOWZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmgKQEAgLTgxLDcgKzgxLDcgQEAKIAlpbnQgbGVkX3Bvd2VyLCBsZWRfaGksIGxlZF9sbywgbG5hX2N0cmwsIHJmX3N3aXRjaDsKIH07CiAKLXN0cnVjdCBzbXNfYm9hcmQgKnNtc19nZXRfYm9hcmQoaW50IGlkKTsKK3N0cnVjdCBzbXNfYm9hcmQgKnNtc19nZXRfYm9hcmQodW5zaWduZWQgaWQpOwogCiBleHRlcm4gc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYwppbmRleCBmYTZhNjIzLi5jYTc1OGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jCkBAIC0xMzczLDcgKzEzNzMsNyBAQAogCiAJKnBHcm91cENmZyA9IDE7CiAKLQlpZiAoUGluTnVtID49IDAgJiYgUGluTnVtIDw9IDEpCXsKKwlpZiAoUGluTnVtIDw9IDEpCXsKIAkJKnBUcmFuc2xhdGVkUGluTnVtID0gMDsKIAkJKnBHcm91cE51bSA9IDk7CiAJCSpwR3JvdXBDZmcgPSAyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zc2Rpby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zc2Rpby5jCmluZGV4IGQxZDY1MmUuLjI0MjA2Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3NkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNzZGlvLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAogc3RhdGljIGludCBzbXNzZGlvX3NlbmRyZXF1ZXN0KHZvaWQgKmNvbnRleHQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgc21zc2Rpb19kZXZpY2UgKnNtc2RldjsKIAogCXNtc2RldiA9IGNvbnRleHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCmluZGV4IDhkNjVjNjUuLmJhZjMxNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCkBAIC0yNDI1LDcgKzI0MjUsNyBAQAogCQkgKiB1c2UgMHgxNSB0byB0cmFjayBWUEUgIGludGVycnVwdHMgLSBpbmNyZWFzZSBieSAxIGV2ZXJ5IHZwZWlycSgpIGlzIGNhbGxlZAogCQkgKi8KIAkJc2FhNzE0Nl93cml0ZShkZXYsIEVDMVNTUiwgKDB4MDM8PDIpIHwgMyApOwotCQkvKiBzZXQgZXZlbnQgY291bnRlciAxIHRyZXNob2xkIHRvIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAgICAgICAgKHJFQyBwNTUpICovCisJCS8qIHNldCBldmVudCBjb3VudGVyIDEgdGhyZXNob2xkIHRvIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAgICAgICAgKHJFQyBwNTUpICovCiAJCXNhYTcxNDZfd3JpdGUoZGV2LCBFQ1QxUiwgIDB4M2ZmZiApOwogI2VuZGlmCiAJCS8qIFNldCBSUFMxIEFkZHJlc3MgcmVnaXN0ZXIgdG8gcG9pbnQgdG8gUlBTIGNvZGUgICAgICAgICAgICAgICAocjEwOCBwNDIpICovCkBAIC0yNTU5LDcgKzI1NTksNyBAQAogCQkgKiB1c2UgMHgxNSB0byB0cmFjayBWUEUgIGludGVycnVwdHMgLSBpbmNyZWFzZSBieSAxIGV2ZXJ5IHZwZWlycSgpIGlzIGNhbGxlZAogCQkgKi8KIAkJc2FhNzE0Nl93cml0ZShkZXYsIEVDMVNTUiwgKDB4MDM8PDIpIHwgMyApOwotCQkvKiBzZXQgZXZlbnQgY291bnRlciAxIHRyZXNob2xkIHRvIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAgICAgICAgKHJFQyBwNTUpICovCisJCS8qIHNldCBldmVudCBjb3VudGVyIDEgdGhyZXNob2xkIHRvIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAgICAgICAgKHJFQyBwNTUpICovCiAJCXNhYTcxNDZfd3JpdGUoZGV2LCBFQ1QxUiwgIDB4M2ZmZiApOwogI2VuZGlmCiAJCS8qIFNldHVwIEJVREdFVFBBVENIIE1BSU4gUlBTMSAicHJvZ3JhbSIgKHAzNSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggOGVhOTE1Mi4uOTgzNjcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTEwNTUsNyArMTA1NSw3IEBACiAJeyBTVEIwODk5X1RTQ0ZHSAkJLCAweDBjIH0sCiAJeyBTVEIwODk5X1RTQ0ZHTQkJLCAweDAwIH0sCiAJeyBTVEIwODk5X1RTQ0ZHTAkJLCAweDBjIH0sCi0JeyBTVEIwODk5X1RTT1VUCQkJLCAweDBkIH0sIC8qIDB4MGQgZm9yIENBTSAqLworCXsgU1RCMDg5OV9UU09VVAkJCSwgMHg0ZCB9LCAvKiAweDBkIGZvciBDQU0gKi8KIAl7IFNUQjA4OTlfUlNTWU5DREVMCQksIDB4MDAgfSwKIAl7IFNUQjA4OTlfVFNJTkhERUxICQksIDB4MDIgfSwKIAl7IFNUQjA4OTlfVFNJTkhERUxNCQksIDB4MDAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKaW5kZXggYjVjNjgxMy4uN2QxOTNlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCWlmIChidWRnZXRfY2ktPmlyLmxhc3RfcmF3ICE9IHJhdyB8fCAhdGltZXJfcGVuZGluZygmYnVkZ2V0X2NpLT5pci50aW1lcl9rZXl1cCkpIHsKIAkJaXJfaW5wdXRfbm9rZXkoZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSk7CiAJCWlyX2lucHV0X2tleWRvd24oZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSwKLQkJCQkgYnVkZ2V0X2NpLT5pci5pcl9rZXksIHJhdyk7CisJCQkJIGJ1ZGdldF9jaS0+aXIuaXJfa2V5KTsKIAkJYnVkZ2V0X2NpLT5pci5sYXN0X3JhdyA9IHJhdzsKIAl9CiAKQEAgLTIyNCw4ICsyMjQsMTAgQEAKIAljYXNlIDB4MTAxMToKIAljYXNlIDB4MTAxMjoKIAkJLyogVGhlIGhhdXBwYXVnZSBrZXltYXAgaXMgYSBzdXBlcnNldCBvZiB0aGVzZSByZW1vdGVzICovCi0JCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSwKKwkJZXJyb3IgPSBpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmJ1ZGdldF9jaS0+aXIuc3RhdGUsCiAJCQkgICAgICBJUl9UWVBFX1JDNSwgJmlyX2NvZGVzX2hhdXBwYXVnZV9uZXdfdGFibGUpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQyOwogCiAJCWlmIChyYzVfZGV2aWNlIDwgMCkKIAkJCWJ1ZGdldF9jaS0+aXIucmM1X2RldmljZSA9IDB4MWY7CkBAIC0yMzYsOCArMjM4LDEwIEBACiAJY2FzZSAweDEwMTc6CiAJY2FzZSAweDEwMWE6CiAJCS8qIGZvciB0aGUgVGVjaG5vdHJlbmQgMTUwMCBidW5kbGVkIHJlbW90ZSAqLwotCQlpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmJ1ZGdldF9jaS0+aXIuc3RhdGUsCisJCWVycm9yID0gaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZidWRnZXRfY2ktPmlyLnN0YXRlLAogCQkJICAgICAgSVJfVFlQRV9SQzUsICZpcl9jb2Rlc190dF8xNTAwX3RhYmxlKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0MjsKIAogCQlpZiAocmM1X2RldmljZSA8IDApCiAJCQlidWRnZXRfY2ktPmlyLnJjNV9kZXZpY2UgPSBJUl9ERVZJQ0VfQU5ZOwpAQCAtMjQ2LDggKzI1MCwxMCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiB1bmtub3duIHJlbW90ZSAqLwotCQlpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmJ1ZGdldF9jaS0+aXIuc3RhdGUsCisJCWVycm9yID0gaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZidWRnZXRfY2ktPmlyLnN0YXRlLAogCQkJICAgICAgSVJfVFlQRV9SQzUsICZpcl9jb2Rlc19idWRnZXRfY2lfb2xkX3RhYmxlKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0MjsKIAogCQlpZiAocmM1X2RldmljZSA8IDApCiAJCQlidWRnZXRfY2ktPmlyLnJjNV9kZXZpY2UgPSBJUl9ERVZJQ0VfQU5ZOwpAQCAtMjgwLDYgKzI4Niw3IEBACiAJcmV0dXJuIDA7CiAKIG91dDI6CisJaXJfaW5wdXRfZnJlZShpbnB1dF9kZXYpOwogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CiBvdXQxOgogCXJldHVybiBlcnJvcjsKQEAgLTI5Nyw2ICszMDQsNyBAQAogCWRlbF90aW1lcl9zeW5jKCZkZXYtPnRpbWVyKTsKIAlpcl9pbnB1dF9ub2tleShkZXYsICZidWRnZXRfY2ktPmlyLnN0YXRlKTsKIAorCWlyX2lucHV0X2ZyZWUoZGV2KTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkZXYpOwogfQogCkBAIC0xMjQ4LDcgKzEyNTYsNyBAQAogCXsgU1RCMDg5OV9UU0NGR0ggICAgICAgIAksIDB4MGMgfSwKIAl7IFNUQjA4OTlfVFNDRkdNICAgICAgICAJLCAweDAwIH0sCiAJeyBTVEIwODk5X1RTQ0ZHTCAgICAgICAgCSwgMHgwYyB9LAotCXsgU1RCMDg5OV9UU09VVAkJCSwgMHgwZCB9LCAvKiAweDBkIGZvciBDQU0gKi8KKwl7IFNUQjA4OTlfVFNPVVQJCQksIDB4NGQgfSwgLyogMHgwZCBmb3IgQ0FNICovCiAJeyBTVEIwODk5X1JTU1lOQ0RFTCAgICAgCSwgMHgwMCB9LAogCXsgU1RCMDg5OV9UU0lOSERFTEggICAgIAksIDB4MDIgfSwKIAl7IFNUQjA4OTlfVFNJTkhERUxNCQksIDB4MDAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKaW5kZXggNjAxMzY2ODguLjljOTJmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jCkBAIC00NTYsNyArNDU2LDcgQEAKIAkvLyB1c2UgMHgwMyB0byB0cmFjayBSUFMxIGludGVycnVwdHMgLSBpbmNyZWFzZSBieSAxIGV2ZXJ5IGdwaW8zIGlzIHRvZ2dsZWQKIAkvLyB1c2UgMHgxNSB0byB0cmFjayBWUEUgIGludGVycnVwdHMgLSBpbmNyZWFzZSBieSAxIGV2ZXJ5IHZwZWlycSgpIGlzIGNhbGxlZAogCXNhYTcxNDZfd3JpdGUoZGV2LCBFQzFTU1IsICgweDAzPDwyKSB8IDMgKTsKLQkvLyBzZXQgZXZlbnQgY291bnRlciAxIHRyZXNob2xkIHRvIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAgICAgICAgKHJFQyBwNTUpCisJLy8gc2V0IGV2ZW50IGNvdW50ZXIgMSB0aHJlc2hvbGQgdG8gbWF4aW11bSBhbGxvd2VkIHZhbHVlICAgICAgICAockVDIHA1NSkKIAlzYWE3MTQ2X3dyaXRlKGRldiwgRUNUMVIsICAweDNmZmYgKTsKICNlbmRpZgogCS8vIEZpeCBWU1lOQyBsZXZlbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCmluZGV4IGQ5MWUwNjMuLjUzYmFjY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKQEAgLTExOTgsNyArMTE5OCw3IEBACiAJaW50IGVycjsKIAogCXVzYl9tYWtlX3BhdGgoZGVjLT51ZGV2LCBkZWMtPnJjX3BoeXMsIHNpemVvZihkZWMtPnJjX3BoeXMpKTsKLQlzdHJsY3B5KGRlYy0+cmNfcGh5cywgIi9pbnB1dDAiLCBzaXplb2YoZGVjLT5yY19waHlzKSk7CisJc3RybGNhdChkZWMtPnJjX3BoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGRlYy0+cmNfcGh5cykpOwogCiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpbnB1dF9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKaW5kZXggYjEzNDU1My4uNGMyYjhhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwpAQCAtMTk3LDcgKzE5Nyw4IEBACiAKIGNvbmZpZyBSQURJT19NSVJPUENNMjAKIAl0cmlzdGF0ZSAibWlyb1NPVU5EIFBDTTIwIHJhZGlvIgotCWRlcGVuZHMgb24gSVNBICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIElTQSAmJiBWSURFT19WNEwyICYmIFNORAorCXNlbGVjdCBTTkRfSVNBCiAJc2VsZWN0IFNORF9NSVJPCiAJLS0taGVscC0tLQogCSAgQ2hvb3NlIFkgaGVyZSBpZiB5b3UgaGF2ZSB0aGlzIEZNIHJhZGlvIGNhcmQuIFlvdSBhbHNvIG5lZWQgdG8gZW5hYmxlCkBAIC00MTksNCArNDIwLDE2IEBACiAJICBTYXkgWSBoZXJlIGlmIFRFQTU3NjQgaGF2ZSBhIDMyNzY4IEh6IGNyeXN0YWwgaW4gY2lyY3VpdCwgc2F5IE4KIAkgIGhlcmUgaWYgVEVBNTc2NCByZWZlcmVuY2UgZnJlcXVlbmN5IGlzIGNvbm5lY3RlZCBpbiBGUkVRSU4uCiAKK2NvbmZpZyBSQURJT19URUY2ODYyCisJdHJpc3RhdGUgIlRFRjY4NjIgQ2FyIFJhZGlvIEVuaGFuY2VkIFNlbGVjdGl2aXR5IFR1bmVyIgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgVEVGNjg2MiBDYXIgUmFkaW8gRW5oYW5jZWQKKwkgIFNlbGVjdGl2aXR5IFR1bmVyLCBmb3VuZCBmb3IgaW5zdGFuY2Ugb24gdGhlIFJ1c3NlbGx2aWxsZSBkZXZlbG9wbWVudAorCSAgYm9hcmQuIE9uIHRoZSBydXNzZWxsdmlsbGUgdGhlIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gaW50ZXJuYWwKKwkgIHRpbWJlcmRhbGUgSTJDIGJ1cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgVEVGNjg2Mi4KKwogZW5kaWYgIyBSQURJT19BREFQVEVSUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUKaW5kZXggOGE2M2Q1NC4uMDE5MjJhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlCkBAIC0yMyw1ICsyMyw2IEBACiBvYmotJChDT05GSUdfUkFESU9fU0k0NzBYKSArPSBzaTQ3MHgvCiBvYmotJChDT05GSUdfVVNCX01SODAwKSArPSByYWRpby1tcjgwMC5vCiBvYmotJChDT05GSUdfUkFESU9fVEVBNTc2NCkgKz0gcmFkaW8tdGVhNTc2NC5vCitvYmotJChDT05GSUdfUkFESU9fVEVGNjg2MikgKz0gdGVmNjg2Mi5vCiAKIEVYVFJBX0NGTEFHUyArPSAtSXNvdW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMKaW5kZXggYTEyMzkwOC4uOTQ5ZjYwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbXI4MDAuYwpAQCAtMjgsNyArMjgsNyBAQAogICogaHR0cDovL2F2LXVzYnJhZGlvLnNvdXJjZWZvcmdlLm5ldC9pbmRleC5waHAKICAqIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYXYtdXNicmFkaW8vCiAgKiBMYXRlc3QgcmVsZWFzZSBvZiB0aGVpcnMgcHJvamVjdCB3YXMgaW4gMjAwNS4KLSAqIFByb2JhYmx5LCB0aGlzIGRyaXZlciBjb3VsZCBiZSBpbXByb3ZlZCB0cm91Z2ggdXNpbmcgdGhlaXIKKyAqIFByb2JhYmx5LCB0aGlzIGRyaXZlciBjb3VsZCBiZSBpbXByb3ZlZCB0aHJvdWdoIHVzaW5nIHRoZWlyCiAgKiBhY2hpZXZlbWVudHMgKHNwZWNpZmljYXRpb25zIGdpdmVuKS4KICAqIEFsc28sIEZhaWRvbiBMaWFtYm90aXMgPHBhcmF2b2lkQGRlYmlhbi5vcmc+IHdyb3RlIG5pY2UgZHJpdmVyIGZvciB0aGlzIHJhZGlvCiAgKiBpbiAyMDA3LiBIZSBhbGxvd2VkIHRvIHVzZSBoaXMgZHJpdmVyIHRvIGltcHJvdmUgY3VycmVudCBtcjgwMCByYWRpbyBkcml2ZXIuCkBAIC04NSw2ICs4NSw5IEBACiAjZGVmaW5lIGFtcmFkaW9fZGV2X3dhcm4oZGV2LCBmbXQsIGFyZy4uLikJCQkJXAogCQlkZXZfd2FybihkZXYsIE1SODAwX0RSSVZFUl9OQU1FICIgLSAiIGZtdCwgIyNhcmcpCiAKKyNkZWZpbmUgYW1yYWRpb19kZXZfZXJyKGRldiwgZm10LCBhcmcuLi4pIFwKKwkJZGV2X2VycihkZXYsIE1SODAwX0RSSVZFUl9OQU1FICIgLSAiIGZtdCwgIyNhcmcpCisKIC8qIFByb2JhYmx5IFVTQl9USU1FT1VUIHNob3VsZCBiZSBtb2RpZmllZCBpbiBtb2R1bGUgcGFyYW1ldGVyICovCiAjZGVmaW5lIEJVRkZFUl9MRU5HVEggOAogI2RlZmluZSBVU0JfVElNRU9VVCA1MDAKQEAgLTEyOSwxOCArMTMyLDIwIEBACiBzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgewogCS8qIHJlZmVyZW5jZSB0byBVU0IgYW5kIHZpZGVvIGRldmljZSAqLwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9kZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IHZpZGVvX2RldmljZSB2aWRlb2RldjsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CiAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJc3RydWN0IG11dGV4IGxvY2s7CS8qIGJ1ZmZlciBsb2NraW5nICovCiAJaW50IGN1cmZyZXE7CiAJaW50IHN0ZXJlbzsKLQlpbnQgdXNlcnM7Ci0JaW50IHJlbW92ZWQ7CiAJaW50IG11dGVkOworCWludCBpbml0aWFsaXplZDsKIH07CiAKKyNkZWZpbmUgdmRldl90b19hbXJhZGlvKHIpIGNvbnRhaW5lcl9vZihyLCBzdHJ1Y3QgYW1yYWRpb19kZXZpY2UsIHZpZGVvZGV2KQorCiAvKiBVU0IgRGV2aWNlIElEIExpc3QgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfYW1yYWRpb19kZXZpY2VfdGFibGVbXSA9IHsKIAl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX0FNUkFESU9fVkVORE9SLCBVU0JfQU1SQURJT19QUk9EVUNULApAQCAtMTU5LDcgKzE2NCw3IEBACiAJLnJlc3VtZQkJCT0gdXNiX2FtcmFkaW9fcmVzdW1lLAogCS5yZXNldF9yZXN1bWUJCT0gdXNiX2FtcmFkaW9fcmVzdW1lLAogCS5pZF90YWJsZQkJPSB1c2JfYW1yYWRpb19kZXZpY2VfdGFibGUsCi0JLnN1cHBvcnRzX2F1dG9zdXNwZW5kCT0gMCwKKwkuc3VwcG9ydHNfYXV0b3N1c3BlbmQJPSAxLAogfTsKIAogLyogc3dpdGNoIG9uL29mZiB0aGUgcmFkaW8uIFNlbmQgOCBieXRlcyB0byBkZXZpY2UgKi8KQEAgLTE2OCwxMSArMTczLDcgQEAKIAlpbnQgcmV0dmFsOwogCWludCBzaXplOwogCi0JLyogc2FmZXR5IGNoZWNrICovCi0JaWYgKHJhZGlvLT5yZW1vdmVkKQotCQlyZXR1cm4gLUVJTzsKLQotCW11dGV4X2xvY2soJnJhZGlvLT5sb2NrKTsKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmcmFkaW8tPmxvY2spKTsKIAogCXJhZGlvLT5idWZmZXJbMF0gPSAweDAwOwogCXJhZGlvLT5idWZmZXJbMV0gPSAweDU1OwpAQCAtMTg3LDE0ICsxODgsMTIgQEAKIAkJKHZvaWQgKikgKHJhZGlvLT5idWZmZXIpLCBCVUZGRVJfTEVOR1RILCAmc2l6ZSwgVVNCX1RJTUVPVVQpOwogCiAJaWYgKHJldHZhbCA8IDAgfHwgc2l6ZSAhPSBCVUZGRVJfTEVOR1RIKSB7Ci0JCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOworCQlhbXJhZGlvX2Rldl93YXJuKCZyYWRpby0+dmlkZW9kZXYuZGV2LCAic2V0IG11dGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAlyYWRpby0+bXV0ZWQgPSBhcmd1bWVudDsKIAotCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOwotCiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjA1LDExICsyMDQsNyBAQAogCWludCBzaXplOwogCXVuc2lnbmVkIHNob3J0IGZyZXFfc2VuZCA9IDB4MTAgKyAoZnJlcSA+PiAzKSAvIDI1OwogCi0JLyogc2FmZXR5IGNoZWNrICovCi0JaWYgKHJhZGlvLT5yZW1vdmVkKQotCQlyZXR1cm4gLUVJTzsKLQotCW11dGV4X2xvY2soJnJhZGlvLT5sb2NrKTsKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmcmFkaW8tPmxvY2spKTsKIAogCXJhZGlvLT5idWZmZXJbMF0gPSAweDAwOwogCXJhZGlvLT5idWZmZXJbMV0gPSAweDU1OwpAQCAtMjIzLDEwICsyMTgsOCBAQAogCXJldHZhbCA9IHVzYl9idWxrX21zZyhyYWRpby0+dXNiZGV2LCB1c2Jfc25kaW50cGlwZShyYWRpby0+dXNiZGV2LCAyKSwKIAkJKHZvaWQgKikgKHJhZGlvLT5idWZmZXIpLCBCVUZGRVJfTEVOR1RILCAmc2l6ZSwgVVNCX1RJTUVPVVQpOwogCi0JaWYgKHJldHZhbCA8IDAgfHwgc2l6ZSAhPSBCVUZGRVJfTEVOR1RIKSB7Ci0JCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KKwlpZiAocmV0dmFsIDwgMCB8fCBzaXplICE9IEJVRkZFUl9MRU5HVEgpCisJCWdvdG8gb3V0X2VycjsKIAogCS8qIGZyZXF1ZW5jeSBpcyBjYWxjdWxhdGVkIGZyb20gZnJlcV9zZW5kIGFuZCBwbGFjZWQgaW4gZmlyc3QgMiBieXRlcyAqLwogCXJhZGlvLT5idWZmZXJbMF0gPSAoZnJlcV9zZW5kID4+IDgpICYgMHhmZjsKQEAgLTI0MCwxMyArMjMzLDE1IEBACiAJcmV0dmFsID0gdXNiX2J1bGtfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9zbmRpbnRwaXBlKHJhZGlvLT51c2JkZXYsIDIpLAogCQkodm9pZCAqKSAocmFkaW8tPmJ1ZmZlciksIEJVRkZFUl9MRU5HVEgsICZzaXplLCBVU0JfVElNRU9VVCk7CiAKLQlpZiAocmV0dmFsIDwgMCB8fCBzaXplICE9IEJVRkZFUl9MRU5HVEgpIHsKLQkJbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQorCWlmIChyZXR2YWwgPCAwIHx8IHNpemUgIT0gQlVGRkVSX0xFTkdUSCkKKwkJZ290byBvdXRfZXJyOwogCi0JbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7CisJcmFkaW8tPmN1cmZyZXEgPSBmcmVxOworCWdvdG8gb3V0OwogCitvdXRfZXJyOgorCWFtcmFkaW9fZGV2X3dhcm4oJnJhZGlvLT52aWRlb2Rldi5kZXYsICJzZXQgZnJlcXVlbmN5IGZhaWxlZFxuIik7CitvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjU1LDExICsyNTAsNyBAQAogCWludCByZXR2YWw7CiAJaW50IHNpemU7CiAKLQkvKiBzYWZldHkgY2hlY2sgKi8KLQlpZiAocmFkaW8tPnJlbW92ZWQpCi0JCXJldHVybiAtRUlPOwotCi0JbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZyYWRpby0+bG9jaykpOwogCiAJcmFkaW8tPmJ1ZmZlclswXSA9IDB4MDA7CiAJcmFkaW8tPmJ1ZmZlclsxXSA9IDB4NTU7CkBAIC0yNzQsMTQgKzI2NSwxNCBAQAogCQkodm9pZCAqKSAocmFkaW8tPmJ1ZmZlciksIEJVRkZFUl9MRU5HVEgsICZzaXplLCBVU0JfVElNRU9VVCk7CiAKIAlpZiAocmV0dmFsIDwgMCB8fCBzaXplICE9IEJVRkZFUl9MRU5HVEgpIHsKLQkJcmFkaW8tPnN0ZXJlbyA9IC0xOwotCQltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKwkJYW1yYWRpb19kZXZfd2FybigmcmFkaW8tPnZpZGVvZGV2LmRldiwgInNldCBzdGVyZW8gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlyYWRpby0+c3RlcmVvID0gMTsKLQotCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOworCWlmIChhcmd1bWVudCA9PSBXQU5UX1NURVJFTykKKwkJcmFkaW8tPnN0ZXJlbyA9IDE7CisJZWxzZQorCQlyYWRpby0+c3RlcmVvID0gMDsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0yOTYsMTkgKzI4NywxOSBAQAogCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOwotCXJhZGlvLT5yZW1vdmVkID0gMTsKKwlyYWRpby0+dXNiZGV2ID0gTlVMTDsKIAltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7Ci0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocmFkaW8tPnZpZGVvZGV2KTsKIAl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZyYWRpby0+djRsMl9kZXYpOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZyYWRpby0+dmlkZW9kZXYpOwogfQogCiAvKiB2aWRpb2NfcXVlcnljYXAgLSBxdWVyeSBkZXZpY2UgY2FwYWJpbGl0aWVzICovCiBzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKIHsKLQlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1tcjgwMCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJBdmVyTWVkaWEgTVIgODAwIFVTQiBGTSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CkBAIC0zMjIsMTMgKzMxMyw5IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCByZXR2YWw7CiAKLQkvKiBzYWZldHkgY2hlY2sgKi8KLQlpZiAocmFkaW8tPnJlbW92ZWQpCi0JCXJldHVybiAtRUlPOwotCiAJaWYgKHYtPmluZGV4ID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTM0MSw5ICszMjgsNiBAQAogICogYW1yYWRpb19zZXRfc3RlcmVvIHNob3VsZG4ndCBiZSBoZXJlCiAgKi8KIAlyZXR2YWwgPSBhbXJhZGlvX3NldF9zdGVyZW8ocmFkaW8sIFdBTlRfU1RFUkVPKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJYW1yYWRpb19kZXZfd2FybigmcmFkaW8tPnZpZGVvZGV2LT5kZXYsCi0JCQkic2V0IHN0ZXJlbyBmYWlsZWRcbiIpOwogCiAJc3RyY3B5KHYtPm5hbWUsICJGTSIpOwogCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwpAQCAtMzU3LDE5ICszNDEsMTYgQEAKIAkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwogCXYtPnNpZ25hbCA9IDB4ZmZmZjsgICAgIC8qIENhbid0IGdldCB0aGUgc2lnbmFsIHN0cmVuZ3RoLCBzYWQuLiAqLwogCXYtPmFmYyA9IDA7IC8qIERvbid0IGtub3cgd2hhdCBpcyB0aGlzICovCi0JcmV0dXJuIDA7CisKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKiB2aWRpb2Nfc190dW5lciAtIHNldCB0dW5lciBhdHRyaWJ1dGVzICovCiBzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKLQlpbnQgcmV0dmFsOwotCi0JLyogc2FmZXR5IGNoZWNrICovCi0JaWYgKHJhZGlvLT5yZW1vdmVkKQotCQlyZXR1cm4gLUVJTzsKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXR2YWwgPSAtRUlOVkFMOwogCiAJaWYgKHYtPmluZGV4ID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNzgsNTcgKzM1OSwzMyBAQAogCXN3aXRjaCAodi0+YXVkbW9kZSkgewogCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CiAJCXJldHZhbCA9IGFtcmFkaW9fc2V0X3N0ZXJlbyhyYWRpbywgV0FOVF9NT05PKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlhbXJhZGlvX2Rldl93YXJuKCZyYWRpby0+dmlkZW9kZXYtPmRldiwKLQkJCQkic2V0IG1vbm8gZmFpbGVkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgogCQlyZXR2YWwgPSBhbXJhZGlvX3NldF9zdGVyZW8ocmFkaW8sIFdBTlRfU1RFUkVPKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlhbXJhZGlvX2Rldl93YXJuKCZyYWRpby0+dmlkZW9kZXYtPmRldiwKLQkJCQkic2V0IHN0ZXJlbyBmYWlsZWRcbiIpOwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKiB2aWRpb2Nfc19mcmVxdWVuY3kgLSBzZXQgdHVuZXIgcmFkaW8gZnJlcXVlbmN5ICovCiBzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwotCWludCByZXR2YWw7CisJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCS8qIHNhZmV0eSBjaGVjayAqLwotCWlmIChyYWRpby0+cmVtb3ZlZCkKLQkJcmV0dXJuIC1FSU87Ci0KLQltdXRleF9sb2NrKCZyYWRpby0+bG9jayk7Ci0JcmFkaW8tPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7Ci0JbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7Ci0KLQlyZXR2YWwgPSBhbXJhZGlvX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJYW1yYWRpb19kZXZfd2FybigmcmFkaW8tPnZpZGVvZGV2LT5kZXYsCi0JCQkic2V0IGZyZXF1ZW5jeSBmYWlsZWRcbiIpOwotCXJldHVybiAwOworCXJldHVybiBhbXJhZGlvX3NldGZyZXEocmFkaW8sIGYtPmZyZXF1ZW5jeSk7CiB9CiAKIC8qIHZpZGlvY19nX2ZyZXF1ZW5jeSAtIGdldCB0dW5lciByYWRpbyBmcmVxdWVuY3kgKi8KIHN0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7Ci0KLQkvKiBzYWZldHkgY2hlY2sgKi8KLQlpZiAocmFkaW8tPnJlbW92ZWQpCi0JCXJldHVybiAtRUlPOworCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKIAlmLT5mcmVxdWVuY3kgPSByYWRpby0+Y3VyZnJlcTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NDgsMTcgKzQwNSwxNCBAQAogc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwotCi0JLyogc2FmZXR5IGNoZWNrICovCi0JaWYgKHJhZGlvLT5yZW1vdmVkKQotCQlyZXR1cm4gLUVJTzsKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKIAkJY3RybC0+dmFsdWUgPSByYWRpby0+bXV0ZWQ7CiAJCXJldHVybiAwOwogCX0KKwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC00NjYsMzMgKzQyMCwyMCBAQAogc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwotCWludCByZXR2YWw7Ci0KLQkvKiBzYWZldHkgY2hlY2sgKi8KLQlpZiAocmFkaW8tPnJlbW92ZWQpCi0JCXJldHVybiAtRUlPOworCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQlpZiAoY3RybC0+dmFsdWUpIHsKKwkJaWYgKGN0cmwtPnZhbHVlKQogCQkJcmV0dmFsID0gYW1yYWRpb19zZXRfbXV0ZShyYWRpbywgQU1SQURJT19TVE9QKTsKLQkJCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQkJYW1yYWRpb19kZXZfd2FybigmcmFkaW8tPnZpZGVvZGV2LT5kZXYsCi0JCQkJCSJhbXJhZGlvX3N0b3AgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCXJldHZhbCA9IGFtcmFkaW9fc2V0X211dGUocmFkaW8sIEFNUkFESU9fU1RBUlQpOwotCQkJaWYgKHJldHZhbCA8IDApIHsKLQkJCQlhbXJhZGlvX2Rldl93YXJuKCZyYWRpby0+dmlkZW9kZXYtPmRldiwKLQkJCQkJImFtcmFkaW9fc3RhcnQgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7CisKKwkJYnJlYWs7CiAJfQotCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyogdmlkaW9jX2dfYXVkaW8gLSBnZXQgYXVkaW8gYXR0cmlidXRlcyAqLwpAQCAtNTMxLDc1ICs0NzIsMTA4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdXNiX2FtcmFkaW9faW5pdChzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBhbXJhZGlvX3NldF9tdXRlKHJhZGlvLCBBTVJBRElPX1NUT1ApOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2VycjsKKworCXJldHZhbCA9IGFtcmFkaW9fc2V0X3N0ZXJlbyhyYWRpbywgV0FOVF9TVEVSRU8pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2VycjsKKworCXJhZGlvLT5pbml0aWFsaXplZCA9IDE7CisJZ290byBvdXQ7CisKK291dF9lcnI6CisJYW1yYWRpb19kZXZfZXJyKCZyYWRpby0+dmlkZW9kZXYuZGV2LCAiaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCiAvKiBvcGVuIGRldmljZSAtIGFtcmFkaW9fc3RhcnQoKSBhbmQgYW1yYWRpb19zZXRmcmVxKCkgKi8KIHN0YXRpYyBpbnQgdXNiX2FtcmFkaW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7Ci0JaW50IHJldHZhbDsKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmRldl90b19hbXJhZGlvKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCWludCByZXR2YWwgPSAwOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZyYWRpby0+bG9jayk7CiAKLQlyYWRpby0+dXNlcnMgPSAxOwotCXJhZGlvLT5tdXRlZCA9IDE7Ci0KLQlyZXR2YWwgPSBhbXJhZGlvX3NldF9tdXRlKHJhZGlvLCBBTVJBRElPX1NUQVJUKTsKLQlpZiAocmV0dmFsIDwgMCkgewotCQlhbXJhZGlvX2Rldl93YXJuKCZyYWRpby0+dmlkZW9kZXYtPmRldiwKLQkJCSJyYWRpbyBkaWQgbm90IHN0YXJ0IHVwIHByb3Blcmx5XG4iKTsKLQkJcmFkaW8tPnVzZXJzID0gMDsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXJhZGlvLT51c2JkZXYpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byB1bmxvY2s7CiAJfQogCi0JcmV0dmFsID0gYW1yYWRpb19zZXRfc3RlcmVvKHJhZGlvLCBXQU5UX1NURVJFTyk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCWFtcmFkaW9fZGV2X3dhcm4oJnJhZGlvLT52aWRlb2Rldi0+ZGV2LAotCQkJInNldCBzdGVyZW8gZmFpbGVkXG4iKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSByYWRpbzsKKwlyZXR2YWwgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UocmFkaW8tPmludGYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gdW5sb2NrOwogCi0JcmV0dmFsID0gYW1yYWRpb19zZXRmcmVxKHJhZGlvLCByYWRpby0+Y3VyZnJlcSk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCWFtcmFkaW9fZGV2X3dhcm4oJnJhZGlvLT52aWRlb2Rldi0+ZGV2LAotCQkJInNldCBmcmVxdWVuY3kgZmFpbGVkXG4iKTsKKwlpZiAodW5saWtlbHkoIXJhZGlvLT5pbml0aWFsaXplZCkpIHsKKwkJcmV0dmFsID0gdXNiX2FtcmFkaW9faW5pdChyYWRpbyk7CisJCWlmIChyZXR2YWwpCisJCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UocmFkaW8tPmludGYpOworCX0KIAotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gMDsKK3VubG9jazoKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKmNsb3NlIGRldmljZSAqLwogc3RhdGljIGludCB1c2JfYW1yYWRpb19jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7Ci0JaW50IHJldHZhbDsKLQotCWlmICghcmFkaW8pCi0JCXJldHVybiAtRU5PREVWOworCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldHZhbCA9IDA7CiAKIAltdXRleF9sb2NrKCZyYWRpby0+bG9jayk7Ci0JcmFkaW8tPnVzZXJzID0gMDsKLQltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKIAotCWlmICghcmFkaW8tPnJlbW92ZWQpIHsKLQkJcmV0dmFsID0gYW1yYWRpb19zZXRfbXV0ZShyYWRpbywgQU1SQURJT19TVE9QKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlhbXJhZGlvX2Rldl93YXJuKCZyYWRpby0+dmlkZW9kZXYtPmRldiwKLQkJCQkiYW1yYWRpb19zdG9wIGZhaWxlZFxuIik7CisJaWYgKCFyYWRpby0+dXNiZGV2KQorCQlyZXR2YWwgPSAtRUlPOworCWVsc2UKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHJhZGlvLT5pbnRmKTsKKworCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBsb25nIHVzYl9hbXJhZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbG9uZyByZXR2YWwgPSAwOworCisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCisJaWYgKCFyYWRpby0+dXNiZGV2KSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gdW5sb2NrOwogCX0KIAotCXJldHVybiAwOworCXJldHZhbCA9IHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKiBTdXNwZW5kIGRldmljZSAtIHN0b3AgZGV2aWNlLiBOZWVkIHRvIGJlIGNoZWNrZWQgYW5kIGZpeGVkICovCiBzdGF0aWMgaW50IHVzYl9hbXJhZGlvX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewogCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSBhbXJhZGlvX3NldF9tdXRlKHJhZGlvLCBBTVJBRElPX1NUT1ApOwotCWlmIChyZXR2YWwgPCAwKQotCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiYW1yYWRpb19zdG9wIGZhaWxlZFxuIik7CisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCisJaWYgKCFyYWRpby0+bXV0ZWQgJiYgcmFkaW8tPmluaXRpYWxpemVkKSB7CisJCWFtcmFkaW9fc2V0X211dGUocmFkaW8sIEFNUkFESU9fU1RPUCk7CisJCXJhZGlvLT5tdXRlZCA9IDA7CisJfQogCiAJZGV2X2luZm8oJmludGYtPmRldiwgImdvaW5nIGludG8gc3VzcGVuZC4uXG4iKTsKIAorCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC02MDcsMTQgKzU4MSwyNiBAQAogc3RhdGljIGludCB1c2JfYW1yYWRpb19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JaW50IHJldHZhbDsKIAotCXJldHZhbCA9IGFtcmFkaW9fc2V0X211dGUocmFkaW8sIEFNUkFESU9fU1RBUlQpOwotCWlmIChyZXR2YWwgPCAwKQotCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiYW1yYWRpb19zdGFydCBmYWlsZWRcbiIpOworCW11dGV4X2xvY2soJnJhZGlvLT5sb2NrKTsKIAorCWlmICh1bmxpa2VseSghcmFkaW8tPmluaXRpYWxpemVkKSkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAocmFkaW8tPnN0ZXJlbykKKwkJYW1yYWRpb19zZXRfc3RlcmVvKHJhZGlvLCBXQU5UX1NURVJFTyk7CisJZWxzZQorCQlhbXJhZGlvX3NldF9zdGVyZW8ocmFkaW8sIFdBTlRfTU9OTyk7CisKKwlhbXJhZGlvX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKTsKKworCWlmICghcmFkaW8tPm11dGVkKQorCQlhbXJhZGlvX3NldF9tdXRlKHJhZGlvLCBBTVJBRElPX1NUQVJUKTsKKwordW5sb2NrOgogCWRldl9pbmZvKCZpbnRmLT5kZXYsICJjb21pbmcgb3V0IG9mIHN1c3BlbmQuLlxuIik7CiAKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjIzLDcgKzYwOSw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQk9IHVzYl9hbXJhZGlvX29wZW4sCiAJLnJlbGVhc2UJPSB1c2JfYW1yYWRpb19jbG9zZSwKLQkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAorCS5pb2N0bAkJPSB1c2JfYW1yYWRpb19pb2N0bCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdXNiX2FtcmFkaW9faW9jdGxfb3BzID0gewpAQCAtNjQzLDEwICs2MjksNyBAQAogCiBzdGF0aWMgdm9pZCB1c2JfYW1yYWRpb192aWRlb19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb2RldikKIHsKLQlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9kZXYpOwotCi0JLyogd2UgY2FsbCB2NGwgdG8gZnJlZSByYWRpby0+dmlkZW9kZXYgKi8KLQl2aWRlb19kZXZpY2VfcmVsZWFzZSh2aWRlb2Rldik7CisJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZkZXZfdG9fYW1yYWRpbyh2aWRlb2Rldik7CiAKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZyYWRpby0+djRsMl9kZXYpOwogCkBAIC02NjAsNzAgKzY0Myw2MyBAQAogCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvOwotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXY7Ci0JaW50IHJldHZhbDsKKwlpbnQgcmV0dmFsID0gMDsKIAogCXJhZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFtcmFkaW9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXJhZGlvKSB7CiAJCWRldl9lcnIoJmludGYtPmRldiwgImttYWxsb2MgZm9yIGFtcmFkaW9fZGV2aWNlIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKIAl9CiAKIAlyYWRpby0+YnVmZmVyID0ga21hbGxvYyhCVUZGRVJfTEVOR1RILCBHRlBfS0VSTkVMKTsKIAogCWlmICghcmFkaW8tPmJ1ZmZlcikgewogCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJrbWFsbG9jIGZvciByYWRpby0+YnVmZmVyIGZhaWxlZFxuIik7Ci0JCWtmcmVlKHJhZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX25vYnVmOwogCX0KIAotCXY0bDJfZGV2ID0gJnJhZGlvLT52NGwyX2RldjsKLQlyZXR2YWwgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmaW50Zi0+ZGV2LCB2NGwyX2Rldik7CisJcmV0dmFsID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmludGYtPmRldiwgJnJhZGlvLT52NGwyX2Rldik7CiAJaWYgKHJldHZhbCA8IDApIHsKIAkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGRuJ3QgcmVnaXN0ZXIgdjRsMl9kZXZpY2VcbiIpOwotCQlrZnJlZShyYWRpby0+YnVmZmVyKTsKLQkJa2ZyZWUocmFkaW8pOwotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIGVycl92NGwyOwogCX0KIAotCXJhZGlvLT52aWRlb2RldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCXN0cmxjcHkocmFkaW8tPnZpZGVvZGV2Lm5hbWUsIHJhZGlvLT52NGwyX2Rldi5uYW1lLAorCQlzaXplb2YocmFkaW8tPnZpZGVvZGV2Lm5hbWUpKTsKKwlyYWRpby0+dmlkZW9kZXYudjRsMl9kZXYgPSAmcmFkaW8tPnY0bDJfZGV2OworCXJhZGlvLT52aWRlb2Rldi5mb3BzID0gJnVzYl9hbXJhZGlvX2ZvcHM7CisJcmFkaW8tPnZpZGVvZGV2LmlvY3RsX29wcyA9ICZ1c2JfYW1yYWRpb19pb2N0bF9vcHM7CisJcmFkaW8tPnZpZGVvZGV2LnJlbGVhc2UgPSB1c2JfYW1yYWRpb192aWRlb19kZXZpY2VfcmVsZWFzZTsKIAotCWlmICghcmFkaW8tPnZpZGVvZGV2KSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgInZpZGVvX2RldmljZV9hbGxvYyBmYWlsZWRcbiIpOwotCQlrZnJlZShyYWRpby0+YnVmZmVyKTsKLQkJa2ZyZWUocmFkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzdHJsY3B5KHJhZGlvLT52aWRlb2Rldi0+bmFtZSwgdjRsMl9kZXYtPm5hbWUsIHNpemVvZihyYWRpby0+dmlkZW9kZXYtPm5hbWUpKTsKLQlyYWRpby0+dmlkZW9kZXYtPnY0bDJfZGV2ID0gdjRsMl9kZXY7Ci0JcmFkaW8tPnZpZGVvZGV2LT5mb3BzID0gJnVzYl9hbXJhZGlvX2ZvcHM7Ci0JcmFkaW8tPnZpZGVvZGV2LT5pb2N0bF9vcHMgPSAmdXNiX2FtcmFkaW9faW9jdGxfb3BzOwotCXJhZGlvLT52aWRlb2Rldi0+cmVsZWFzZSA9IHVzYl9hbXJhZGlvX3ZpZGVvX2RldmljZV9yZWxlYXNlOwotCi0JcmFkaW8tPnJlbW92ZWQgPSAwOwotCXJhZGlvLT51c2VycyA9IDA7CiAJcmFkaW8tPnVzYmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJcmFkaW8tPmludGYgPSBpbnRmOwogCXJhZGlvLT5jdXJmcmVxID0gOTUuMTYgKiBGUkVRX01VTDsKLQlyYWRpby0+c3RlcmVvID0gLTE7CiAKIAltdXRleF9pbml0KCZyYWRpby0+bG9jayk7CiAKLQl2aWRlb19zZXRfZHJ2ZGF0YShyYWRpby0+dmlkZW9kZXYsIHJhZGlvKTsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmcmFkaW8tPnZpZGVvZGV2LCByYWRpbyk7CiAKLQlyZXR2YWwgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocmFkaW8tPnZpZGVvZGV2LAlWRkxfVFlQRV9SQURJTywJcmFkaW9fbnIpOworCXJldHZhbCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmcmFkaW8tPnZpZGVvZGV2LCBWRkxfVFlQRV9SQURJTywKKwkJCQkJcmFkaW9fbnIpOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCWRldl9lcnIoJmludGYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOwotCQl2aWRlb19kZXZpY2VfcmVsZWFzZShyYWRpby0+dmlkZW9kZXYpOwotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKLQkJa2ZyZWUocmFkaW8tPmJ1ZmZlcik7Ci0JCWtmcmVlKHJhZGlvKTsKLQkJcmV0dXJuIC1FSU87CisJCWdvdG8gZXJyX3ZkZXY7CiAJfQogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCByYWRpbyk7CiAJcmV0dXJuIDA7CisKK2Vycl92ZGV2OgorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnJhZGlvLT52NGwyX2Rldik7CitlcnJfdjRsMjoKKwlrZnJlZShyYWRpby0+YnVmZmVyKTsKK2Vycl9ub2J1ZjoKKwlrZnJlZShyYWRpbyk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgYW1yYWRpb19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3RlZjY4NjIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vdGVmNjg2Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjA3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3RlZjY4NjIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIHRlZjY4NjIuYyBQaGlsaXBzIFRFRjY4NjIgQ2FyIFJhZGlvIEVuaGFuY2VkIFNlbGVjdGl2aXR5IFR1bmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgInRlZjY4NjIiCisKKyNkZWZpbmUgRlJFUV9NVUwgMTYwMDAKKworI2RlZmluZSBURUY2ODYyX0xPX0ZSRVEgKDg3NSAqIEZSRVFfTVVMIC8gMTApCisjZGVmaW5lIFRFRjY4NjJfSElfRlJFUSAoMTA4ICogRlJFUV9NVUwpCisKKy8qIFdyaXRlIG1vZGUgc3ViIGFkZHJlc3NlcyAqLworI2RlZmluZSBXTV9TVUJfQkFORFdJRFRICTB4MAorI2RlZmluZSBXTV9TVUJfUExMTQkJMHgxCisjZGVmaW5lIFdNX1NVQl9QTExMCQkweDIKKyNkZWZpbmUgV01fU1VCX0RBQQkJMHgzCisjZGVmaW5lIFdNX1NVQl9BR0MJCTB4NAorI2RlZmluZSBXTV9TVUJfQkFORAkJMHg1CisjZGVmaW5lIFdNX1NVQl9DT05UUk9MCQkweDYKKyNkZWZpbmUgV01fU1VCX0xFVkVMCQkweDcKKyNkZWZpbmUgV01fU1VCX0lGQ0YJCTB4OAorI2RlZmluZSBXTV9TVUJfSUZDQVAJCTB4OQorI2RlZmluZSBXTV9TVUJfQUNECQkweEEKKyNkZWZpbmUgV01fU1VCX1RFU1QJCTB4RgorCisvKiBEaWZmZXJlbnQgbW9kZXMgb2YgdGhlIE1TQSByZWdpc3RlciAqLworI2RlZmluZSBNT0RFX0JVRkZFUgkJMHgwCisjZGVmaW5lIE1PREVfUFJFU0VUCQkweDEKKyNkZWZpbmUgTU9ERV9TRUFSQ0gJCTB4MgorI2RlZmluZSBNT0RFX0FGX1VQREFURQkJMHgzCisjZGVmaW5lIE1PREVfSlVNUAkJMHg0CisjZGVmaW5lIE1PREVfQ0hFQ0sJCTB4NQorI2RlZmluZSBNT0RFX0xPQUQJCTB4NgorI2RlZmluZSBNT0RFX0VORAkJMHg3CisjZGVmaW5lIE1PREVfU0hJRlQJCTUKKworc3RydWN0IHRlZjY4NjJfc3RhdGUgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKKwl1bnNpZ25lZCBsb25nIGZyZXE7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWY2ODYyX3N0YXRlICp0b19zdGF0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCB0ZWY2ODYyX3N0YXRlLCBzZCk7Cit9CisKK3N0YXRpYyB1MTYgdGVmNjg2Ml9zaWdzdHIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1OCBidWZbNF07CisJaW50IGVyciA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChlcnIgPT0gc2l6ZW9mKGJ1ZikpCisJCXJldHVybiBidWZbM10gPDwgODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWY2ODYyX2dfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBvbmx5IHN1cHBvcnQgRk0gZm9yIG5vdyAqLworCXN0cmxjcHkodi0+bmFtZSwgIkZNIiwgc2l6ZW9mKHYtPm5hbWUpKTsKKwl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl2LT5yYW5nZWxvdyA9IFRFRjY4NjJfTE9fRlJFUTsKKwl2LT5yYW5nZWhpZ2ggPSBURUY2ODYyX0hJX0ZSRVE7CisJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKKwl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwl2LT5zaWduYWwgPSB0ZWY2ODYyX3NpZ3N0cih2NGwyX2dldF9zdWJkZXZkYXRhKHNkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWY2ODYyX3NfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJcmV0dXJuIHYtPmluZGV4ID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdGVmNjg2Ml9zX2ZyZXF1ZW5jeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHRlZjY4NjJfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwl1MTYgcGxsOworCXU4IGkyY21zZ1szXTsKKwlpbnQgZXJyOworCisJaWYgKGYtPnR1bmVyICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcGxsID0gMTk2NCArICgoZi0+ZnJlcXVlbmN5IC0gVEVGNjg2Ml9MT19GUkVRKSAqIDIwKSAvIEZSRVFfTVVMOworCWkyY21zZ1swXSA9IChNT0RFX1BSRVNFVCA8PCBNT0RFX1NISUZUKSB8IFdNX1NVQl9QTExNOworCWkyY21zZ1sxXSA9IChwbGwgPj4gOCkgJiAweGZmOworCWkyY21zZ1syXSA9IHBsbCAmIDB4ZmY7CisKKwllcnIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBpMmNtc2csIHNpemVvZihpMmNtc2cpKTsKKwlpZiAoIWVycikKKwkJc3RhdGUtPmZyZXEgPSBmLT5mcmVxdWVuY3k7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZWY2ODYyX2dfZnJlcXVlbmN5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdGVmNjg2Ml9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlpZiAoZi0+dHVuZXIgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJZi0+ZnJlcXVlbmN5ID0gc3RhdGUtPmZyZXE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVmNjg2Ml9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBjaGlwLCBWNEwyX0lERU5UX1RFRjY4NjIsIDApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB0ZWY2ODYyX3R1bmVyX29wcyA9IHsKKwkuZ190dW5lciA9IHRlZjY4NjJfZ190dW5lciwKKwkuc190dW5lciA9IHRlZjY4NjJfc190dW5lciwKKwkuc19mcmVxdWVuY3kgPSB0ZWY2ODYyX3NfZnJlcXVlbmN5LAorCS5nX2ZyZXF1ZW5jeSA9IHRlZjY4NjJfZ19mcmVxdWVuY3ksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHRlZjY4NjJfY29yZV9vcHMgPSB7CisJLmdfY2hpcF9pZGVudCA9IHRlZjY4NjJfZ19jaGlwX2lkZW50LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdGVmNjg2Ml9vcHMgPSB7CisJLmNvcmUgPSAmdGVmNjg2Ml9jb3JlX29wcywKKwkudHVuZXIgPSAmdGVmNjg2Ml90dW5lcl9vcHMsCit9OworCisvKgorICogR2VuZXJpYyBpMmMgcHJvYmUKKyAqIGNvbmNlcm5pbmcgdGhlIGFkZHJlc3NlczogaTJjIHdhbnRzIDcgYml0ICh3aXRob3V0IHRoZSByL3cgYml0KSwgc28gJz4+MScKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZWY2ODYyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHRlZjY4NjJfc3RhdGUgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisKKwkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAtRUlPOworCisJdjRsX2luZm8oY2xpZW50LCAiY2hpcCBmb3VuZCBAIDB4JTAyeCAoJXMpXG4iLAorCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZWY2ODYyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXN0YXRlLT5mcmVxID0gVEVGNjg2Ml9MT19GUkVROworCisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZ0ZWY2ODYyX29wcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdGVmNjg2Ml9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJa2ZyZWUodG9fc3RhdGUoc2QpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRlZjY4NjJfaWRbXSA9IHsKKwl7RFJJVkVSX05BTUUsIDB9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRlZjY4NjJfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdGVmNjg2Ml9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gRFJJVkVSX05BTUUsCisJfSwKKwkucHJvYmUJCT0gdGVmNjg2Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IHRlZjY4NjJfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHRlZjY4NjJfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCB0ZWY2ODYyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnRlZjY4NjJfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHRlZjY4NjJfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ0ZWY2ODYyX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRlZjY4NjJfaW5pdCk7Cittb2R1bGVfZXhpdCh0ZWY2ODYyX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRFRjY4NjIgQ2FyIFJhZGlvIEVuaGFuY2VkIFNlbGVjdGl2aXR5IFR1bmVyIik7CitNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCBlNjE4NmIzLi45ZGM3NGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC02MDAsNyArNjAwLDcgQEAKIAogY29uZmlnIFZJREVPX1BNUwogCXRyaXN0YXRlICJNZWRpYXZpc2lvbiBQcm8gTW92aWUgU3R1ZGlvIFZpZGVvIEZvciBMaW51eCIKLQlkZXBlbmRzIG9uIElTQSAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBJU0EgJiYgVklERU9fVjRMMgogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSB0aGluZy4KIApAQCAtODQ3LDYgKzg0NywxMiBAQAogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1UOVYwMjIgY2FtZXJhcyBmcm9tIE1pY3JvbgogCitjb25maWcgU09DX0NBTUVSQV9SSjU0TjEKKwl0cmlzdGF0ZSAicmo1NG4xY2IwYyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09DX0NBTUVSQSAmJiBJMkMKKwloZWxwCisJICBUaGlzIGlzIGEgcmo1NG4xY2IwYyB2aWRlbyBkcml2ZXIKKwogY29uZmlnIFNPQ19DQU1FUkFfVFc5OTEwCiAJdHJpc3RhdGUgInR3OTkxMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gU09DX0NBTUVSQSAmJiBJMkMKQEAgLTg2NSw2ICs4NzEsMTIgQEAKIAloZWxwCiAJICBUaGlzIGlzIGEgb3Y3NzJ4IGNhbWVyYSBkcml2ZXIKIAorY29uZmlnIFNPQ19DQU1FUkFfT1Y5NjQwCisJdHJpc3RhdGUgIm92OTY0MCBjYW1lcmEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPQ19DQU1FUkEgJiYgSTJDCisJaGVscAorCSAgVGhpcyBpcyBhIG92OTY0MCBjYW1lcmEgZHJpdmVyCisKIGNvbmZpZyBNWDFfVklERU8KIAlib29sCiAKQEAgLTkzOSw5ICs5NTEsMTQgQEAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9LY29uZmlnIgogCiBjb25maWcgVklERU9fT1ZDQU1DSElQCi0JdHJpc3RhdGUgIk9tbmlWaXNpb24gQ2FtZXJhIENoaXAgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiT21uaVZpc2lvbiBDYW1lcmEgQ2hpcCBzdXBwb3J0IChERVBSRUNBVEVEKSIKIAlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwxCiAJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBnc3BjYSBvdjUxOSBtb2R1bGUKKwkgIGluc3RlYWQuIE5vdGUgdGhhdCBmb3IgdGhlIG92NTExIC8gb3Y1MTggc3VwcG9ydCBvZiB0aGUgZ3NwY2EgbW9kdWxlCisJICB5b3UgbmVlZCBhdGxlYXN0IHZlcnNpb24gMC42LjAgb2YgbGlidjRsIGFuZCBmb3IgdGhlIHc5OTY4Y2YKKwkgIGF0bGVhc3QgdmVyc2lvbiAwLjYuMyBvZiBsaWJ2NGwuCisKIAkgIFN1cHBvcnQgZm9yIHRoZSBPbW5pVmlzaW9uIE9WNnh4eCBhbmQgT1Y3eHh4IHNlcmllcyBvZiBjYW1lcmEgY2hpcHMuCiAJICBUaGlzIGRyaXZlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggdGhlIG92NTExIGFuZCB3OTk2OGNmIFVTQgogCSAgY2FtZXJhIGRyaXZlcnMuCkBAIC05NTAsOSArOTY3LDEzIEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3ZjYW1jaGlwLgogCiBjb25maWcgVVNCX1c5OTY4Q0YKLQl0cmlzdGF0ZSAiVVNCIFc5OTZbODddQ0YgSlBFRyBEdWFsIE1vZGUgQ2FtZXJhIHN1cHBvcnQiCisJdHJpc3RhdGUgIlVTQiBXOTk2Wzg3XUNGIEpQRUcgRHVhbCBNb2RlIENhbWVyYSBzdXBwb3J0IChERVBSRUNBVEVEKSIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDEgJiYgSTJDICYmIFZJREVPX09WQ0FNQ0hJUAogCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIERFUFJFQ0FURUQgcGxlYXNlIHVzZSB0aGUgZ3NwY2Egb3Y1MTkgbW9kdWxlCisJICBpbnN0ZWFkLiBOb3RlIHRoYXQgZm9yIHRoZSB3OTk2OGNmIHN1cHBvcnQgb2YgdGhlIGdzcGNhIG1vZHVsZQorCSAgeW91IG5lZWQgYXRsZWFzdCB2ZXJzaW9uIDAuNi4zIG9mIGxpYnY0bC4KKwogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIE9WNjgxIG9yCiAJICBXaW5ib25kIFc5OTY3Q0YvVzk5NjhDRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIENoaXBzLgogCkBAIC05OTUsOSArMTAxNiwxMyBAQAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZyIKIAogY29uZmlnIFVTQl9TVFY2ODAKLQl0cmlzdGF0ZSAiVVNCIFNUVjY4MCAoUGVuY2FtKSBDYW1lcmEgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiVVNCIFNUVjY4MCAoUGVuY2FtKSBDYW1lcmEgc3VwcG9ydCAoREVQUkVDQVRFRCkiCiAJZGVwZW5kcyBvbiBWSURFT19WNEwxCiAJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBnc3BjYSBzdHYwNjgwIG1vZHVsZQorCSAgaW5zdGVhZC4gTm90ZSB0aGF0IGZvciB0aGUgZ3NwY2Egc3R2MDY4MCBtb2R1bGUgeW91IG5lZWQKKwkgIGF0bGVhc3QgdmVyc2lvbiAwLjYuMyBvZiBsaWJ2NGwuCisKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0aGlzIHR5cGUgb2YgY2FtZXJhIHRvIHlvdXIKIAkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIFRoaXMgaW5jbHVkZXMgdGhlIFBlbmNhbSBsaW5lIG9mIGNhbWVyYXMuCiAJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zdHY2ODAudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKaW5kZXggZTU0MTkzMi4uN2EyZGNjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCkBAIC03Nyw2ICs3Nyw4IEBACiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9NVDlUMDMxKQkrPSBtdDl0MDMxLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX01UOVYwMjIpCSs9IG10OXYwMjIubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfT1Y3NzJYKQkJKz0gb3Y3NzJ4Lm8KK29iai0kKENPTkZJR19TT0NfQ0FNRVJBX09WOTY0MCkJCSs9IG92OTY0MC5vCitvYmotJChDT05GSUdfU09DX0NBTUVSQV9SSjU0TjEpCQkrPSByajU0bjFjYjBjLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX1RXOTkxMCkJCSs9IHR3OTkxMC5vCiAKICMgQW5kIG5vdyB0aGUgdjRsMiBkcml2ZXJzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTgwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxODAuYwppbmRleCAxYjNjYmQwLi4wODI2ZjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxODAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxODAuYwpAQCAtMjcsMTcgKzI3LDQwIEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJhZHY3MTgwIgogCi0jZGVmaW5lIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9SRUcJMHgwMAotI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfUEFMX0JHX05UU0NfSl9TRUNBTQkweDAwCi0jZGVmaW5lIEFEVjcxODBfQVVUT0RFVEVDVF9FTkFCTEVfUkVHCTB4MDcKLSNkZWZpbmUgQURWNzE4MF9BVVRPREVURUNUX0RFRkFVTFQJMHg3ZgorI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfUkVHCQkJMHgwMAorI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfQURfUEFMX0JHX05UU0NfSl9TRUNBTQkweDAwCisjZGVmaW5lIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9BRF9QQUxfQkdfTlRTQ19KX1NFQ0FNX1BFRCAweDEwCisjZGVmaW5lIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9BRF9QQUxfTl9OVFNDX0pfU0VDQU0JMHgyMAorI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfQURfUEFMX05fTlRTQ19NX1NFQ0FNCTB4MzAKKyNkZWZpbmUgQURWNzE4MF9JTlBVVF9DT05UUk9MX05UU0NfSgkJCTB4NDAKKyNkZWZpbmUgQURWNzE4MF9JTlBVVF9DT05UUk9MX05UU0NfTQkJCTB4NTAKKyNkZWZpbmUgQURWNzE4MF9JTlBVVF9DT05UUk9MX1BBTDYwCQkJMHg2MAorI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfTlRTQ180NDMJCQkweDcwCisjZGVmaW5lIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9QQUxfQkcJCQkweDgwCisjZGVmaW5lIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9QQUxfTgkJCTB4OTAKKyNkZWZpbmUgQURWNzE4MF9JTlBVVF9DT05UUk9MX1BBTF9NCQkJMHhhMAorI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfUEFMX01fUEVECQkJMHhiMAorI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfUEFMX0NPTUJfTgkJMHhjMAorI2RlZmluZSBBRFY3MTgwX0lOUFVUX0NPTlRST0xfUEFMX0NPTUJfTl9QRUQJCTB4ZDAKKyNkZWZpbmUgQURWNzE4MF9JTlBVVF9DT05UUk9MX1BBTF9TRUNBTQkJCTB4ZTAKKyNkZWZpbmUgQURWNzE4MF9JTlBVVF9DT05UUk9MX1BBTF9TRUNBTV9QRUQJCTB4ZjAKIAorI2RlZmluZSBBRFY3MTgwX0VYVEVOREVEX09VVFBVVF9DT05UUk9MX1JFRwkJMHgwNAorI2RlZmluZSBBRFY3MTgwX0VYVEVOREVEX09VVFBVVF9DT05UUk9MX05UU0NESVMJCTB4QzUKIAotI2RlZmluZSBBRFY3MTgwX1NUQVRVUzFfUkVHIDB4MTAKLSNkZWZpbmUgQURWNzE4MF9TVEFUVVMxX0FVVE9EX01BU0sgMHg3MAorI2RlZmluZSBBRFY3MTgwX0FVVE9ERVRFQ1RfRU5BQkxFX1JFRwkJCTB4MDcKKyNkZWZpbmUgQURWNzE4MF9BVVRPREVURUNUX0RFRkFVTFQJCQkweDdmCisKKyNkZWZpbmUgQURWNzE4MF9BRElfQ1RSTF9SRUcJCQkJMHgwZQorI2RlZmluZSBBRFY3MTgwX0FESV9DVFJMX0lSUV9TUEFDRQkJCTB4MjAKKworI2RlZmluZSBBRFY3MTgwX1NUQVRVUzFfUkVHCQkJCTB4MTAKKyNkZWZpbmUgQURWNzE4MF9TVEFUVVMxX0lOX0xPQ0sJCTB4MDEKKyNkZWZpbmUgQURWNzE4MF9TVEFUVVMxX0FVVE9EX01BU0sJMHg3MAogI2RlZmluZSBBRFY3MTgwX1NUQVRVUzFfQVVUT0RfTlRTTV9NX0oJMHgwMAogI2RlZmluZSBBRFY3MTgwX1NUQVRVUzFfQVVUT0RfTlRTQ180XzQzIDB4MTAKICNkZWZpbmUgQURWNzE4MF9TVEFUVVMxX0FVVE9EX1BBTF9NCTB4MjAKQEAgLTUwLDE4ICs3MywzNyBAQAogI2RlZmluZSBBRFY3MTgwX0lERU5UX1JFRyAweDExCiAjZGVmaW5lIEFEVjcxODBfSURfNzE4MCAweDE4CiAKKyNkZWZpbmUgQURWNzE4MF9JQ09ORjFfQURJCQkweDQwCisjZGVmaW5lIEFEVjcxODBfSUNPTkYxX0FDVElWRV9MT1cJMHgwMQorI2RlZmluZSBBRFY3MTgwX0lDT05GMV9QU1lOQ19PTkxZCTB4MTAKKyNkZWZpbmUgQURWNzE4MF9JQ09ORjFfQUNUSVZFX1RPX0NMUgkweEMwCisKKyNkZWZpbmUgQURWNzE4MF9JUlExX0xPQ0sJMHgwMQorI2RlZmluZSBBRFY3MTgwX0lSUTFfVU5MT0NLCTB4MDIKKyNkZWZpbmUgQURWNzE4MF9JU1IxX0FESQkweDQyCisjZGVmaW5lIEFEVjcxODBfSUNSMV9BREkJMHg0MworI2RlZmluZSBBRFY3MTgwX0lNUjFfQURJCTB4NDQKKyNkZWZpbmUgQURWNzE4MF9JTVIyX0FESQkweDQ4CisjZGVmaW5lIEFEVjcxODBfSVJRM19BRF9DSEFOR0UJMHgwOAorI2RlZmluZSBBRFY3MTgwX0lTUjNfQURJCTB4NEEKKyNkZWZpbmUgQURWNzE4MF9JQ1IzX0FESQkweDRCCisjZGVmaW5lIEFEVjcxODBfSU1SM19BREkJMHg0QworI2RlZmluZSBBRFY3MTgwX0lNUjRfQURJCTB4NTAKIAogc3RydWN0IGFkdjcxODBfc3RhdGUgewotCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYJc2Q7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IG11dGV4CQltdXRleDsgLyogbXV0dWFsIGV4Y2wuIHdoZW4gYWNjZXNzaW5nIGNoaXAgKi8KKwlpbnQJCQlpcnE7CisJdjRsMl9zdGRfaWQJCWN1cnJfbm9ybTsKKwlib29sCQkJYXV0b2RldGVjdDsKIH07CiAKLXN0YXRpYyB2NGwyX3N0ZF9pZCBkZXRlcm1pbmVfbm9ybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHY0bDJfc3RkX2lkIGFkdjcxODBfc3RkX3RvX3Y0bDIodTggc3RhdHVzMSkKIHsKLQl1OCBzdGF0dXMxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9TVEFUVVMxX1JFRyk7Ci0KIAlzd2l0Y2ggKHN0YXR1czEgJiBBRFY3MTgwX1NUQVRVUzFfQVVUT0RfTUFTSykgewogCWNhc2UgQURWNzE4MF9TVEFUVVMxX0FVVE9EX05UU01fTV9KOgotCQlyZXR1cm4gVjRMMl9TVERfTlRTQ19NX0pQOworCQlyZXR1cm4gVjRMMl9TVERfTlRTQzsKIAljYXNlIEFEVjcxODBfU1RBVFVTMV9BVVRPRF9OVFNDXzRfNDM6CiAJCXJldHVybiBWNEwyX1NURF9OVFNDXzQ0MzsKIAljYXNlIEFEVjcxODBfU1RBVFVTMV9BVVRPRF9QQUxfTToKQEAgLTgxLDYgKzEyMyw1MyBAQAogCX0KIH0KIAorc3RhdGljIGludCB2NGwyX3N0ZF90b19hZHY3MTgwKHY0bDJfc3RkX2lkIHN0ZCkKK3sKKwlpZiAoc3RkID09IFY0TDJfU1REX1BBTF82MCkKKwkJcmV0dXJuIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9QQUw2MDsKKwlpZiAoc3RkID09IFY0TDJfU1REX05UU0NfNDQzKQorCQlyZXR1cm4gQURWNzE4MF9JTlBVVF9DT05UUk9MX05UU0NfNDQzOworCWlmIChzdGQgPT0gVjRMMl9TVERfUEFMX04pCisJCXJldHVybiBBRFY3MTgwX0lOUFVUX0NPTlRST0xfUEFMX047CisJaWYgKHN0ZCA9PSBWNEwyX1NURF9QQUxfTSkKKwkJcmV0dXJuIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9QQUxfTTsKKwlpZiAoc3RkID09IFY0TDJfU1REX1BBTF9OYykKKwkJcmV0dXJuIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9QQUxfQ09NQl9OOworCisJaWYgKHN0ZCAmIFY0TDJfU1REX1BBTCkKKwkJcmV0dXJuIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9QQUxfQkc7CisJaWYgKHN0ZCAmIFY0TDJfU1REX05UU0MpCisJCXJldHVybiBBRFY3MTgwX0lOUFVUX0NPTlRST0xfTlRTQ19NOworCWlmIChzdGQgJiBWNEwyX1NURF9TRUNBTSkKKwkJcmV0dXJuIEFEVjcxODBfSU5QVVRfQ09OVFJPTF9QQUxfU0VDQU07CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHUzMiBhZHY3MTgwX3N0YXR1c190b192NGwyKHU4IHN0YXR1czEpCit7CisJaWYgKCEoc3RhdHVzMSAmIEFEVjcxODBfU1RBVFVTMV9JTl9MT0NLKSkKKwkJcmV0dXJuIFY0TDJfSU5fU1RfTk9fU0lHTkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19hZHY3MTgwX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgKnN0YXR1cywKKwl2NGwyX3N0ZF9pZCAqc3RkKQoreworCWludCBzdGF0dXMxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9TVEFUVVMxX1JFRyk7CisKKwlpZiAoc3RhdHVzMSA8IDApCisJCXJldHVybiBzdGF0dXMxOworCisJaWYgKHN0YXR1cykKKwkJKnN0YXR1cyA9IGFkdjcxODBfc3RhdHVzX3RvX3Y0bDIoc3RhdHVzMSk7CisJaWYgKHN0ZCkKKwkJKnN0ZCA9IGFkdjcxODBfc3RkX3RvX3Y0bDIoc3RhdHVzMSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgYWR2NzE4MF9zdGF0ZSAqdG9fc3RhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgYWR2NzE4MF9zdGF0ZSwgc2QpOwpAQCAtODgsMTAgKzE3NywzMSBAQAogCiBzdGF0aWMgaW50IGFkdjcxODBfcXVlcnlzdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKnN0ZCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGFkdjcxODBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCWludCBlcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5tdXRleCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCSpzdGQgPSBkZXRlcm1pbmVfbm9ybShjbGllbnQpOwotCXJldHVybiAwOworCS8qIHdoZW4gd2UgYXJlIGludGVycnVwdCBkcml2ZW4gd2Uga25vdyB0aGUgc3RhdGUgKi8KKwlpZiAoIXN0YXRlLT5hdXRvZGV0ZWN0IHx8IHN0YXRlLT5pcnEgPiAwKQorCQkqc3RkID0gc3RhdGUtPmN1cnJfbm9ybTsKKwllbHNlCisJCWVyciA9IF9fYWR2NzE4MF9zdGF0dXModjRsMl9nZXRfc3ViZGV2ZGF0YShzZCksIE5VTEwsIHN0ZCk7CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhZHY3MTgwX2dfaW5wdXRfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqc3RhdHVzKQoreworCXN0cnVjdCBhZHY3MTgwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlpbnQgcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+bXV0ZXgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBfX2FkdjcxODBfc3RhdHVzKHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpLCBzdGF0dXMsIE5VTEwpOworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFkdjcxODBfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCkBAIC0xMDIsMTIgKzIxMiw1MSBAQAogCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIFY0TDJfSURFTlRfQURWNzE4MCwgMCk7CiB9CiAKK3N0YXRpYyBpbnQgYWR2NzE4MF9zX3N0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBzdGQpCit7CisJc3RydWN0IGFkdjcxODBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlpbnQgcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+bXV0ZXgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBhbGwgc3RhbmRhcmRzIC0+IGF1dG9kZXRlY3QgKi8KKwlpZiAoc3RkID09IFY0TDJfU1REX0FMTCkgeworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCUFEVjcxODBfSU5QVVRfQ09OVFJPTF9SRUcsCisJCQlBRFY3MTgwX0lOUFVUX0NPTlRST0xfQURfUEFMX0JHX05UU0NfSl9TRUNBTSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJX19hZHY3MTgwX3N0YXR1cyhjbGllbnQsIE5VTEwsICZzdGF0ZS0+Y3Vycl9ub3JtKTsKKwkJc3RhdGUtPmF1dG9kZXRlY3QgPSB0cnVlOworCX0gZWxzZSB7CisJCXJldCA9IHY0bDJfc3RkX3RvX2FkdjcxODAoc3RkKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCUFEVjcxODBfSU5QVVRfQ09OVFJPTF9SRUcsIHJldCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJc3RhdGUtPmN1cnJfbm9ybSA9IHN0ZDsKKwkJc3RhdGUtPmF1dG9kZXRlY3QgPSBmYWxzZTsKKwl9CisJcmV0ID0gMDsKK291dDoKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgYWR2NzE4MF92aWRlb19vcHMgPSB7CiAJLnF1ZXJ5c3RkID0gYWR2NzE4MF9xdWVyeXN0ZCwKKwkuZ19pbnB1dF9zdGF0dXMgPSBhZHY3MTgwX2dfaW5wdXRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBhZHY3MTgwX2NvcmVfb3BzID0gewogCS5nX2NoaXBfaWRlbnQgPSBhZHY3MTgwX2dfY2hpcF9pZGVudCwKKwkuc19zdGQgPSBhZHY3MTgwX3Nfc3RkLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgYWR2NzE4MF9vcHMgPSB7CkBAIC0xMTUsMTIgKzI2NCw0NSBAQAogCS52aWRlbyA9ICZhZHY3MTgwX3ZpZGVvX29wcywKIH07CiAKK3N0YXRpYyB2b2lkIGFkdjcxODBfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFkdjcxODBfc3RhdGUgKnN0YXRlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZHY3MTgwX3N0YXRlLAorCQl3b3JrKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmc3RhdGUtPnNkKTsKKwl1OCBpc3IzOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9BRElfQ1RSTF9SRUcsCisJCUFEVjcxODBfQURJX0NUUkxfSVJRX1NQQUNFKTsKKwlpc3IzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9JU1IzX0FESSk7CisJLyogY2xlYXIgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9JQ1IzX0FESSwgaXNyMyk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVjcxODBfQURJX0NUUkxfUkVHLCAwKTsKKworCWlmIChpc3IzICYgQURWNzE4MF9JUlEzX0FEX0NIQU5HRSAmJiBzdGF0ZS0+YXV0b2RldGVjdCkKKwkJX19hZHY3MTgwX3N0YXR1cyhjbGllbnQsIE5VTEwsICZzdGF0ZS0+Y3Vycl9ub3JtKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisKKwllbmFibGVfaXJxKHN0YXRlLT5pcnEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWR2NzE4MF9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGFkdjcxODBfc3RhdGUgKnN0YXRlID0gZGV2aWQ7CisKKwlzY2hlZHVsZV93b3JrKCZzdGF0ZS0+d29yayk7CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoc3RhdGUtPmlycSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIC8qCiAgKiBHZW5lcmljIGkyYyBwcm9iZQogICogY29uY2VybmluZyB0aGUgYWRkcmVzc2VzOiBpMmMgd2FudHMgNyBiaXQgKHdpdGhvdXQgdGhlIHIvdyBiaXQpLCBzbyAnPj4xJwogICovCiAKLXN0YXRpYyBpbnQgYWR2NzE4MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorc3RhdGljIF9fZGV2aW5pdCBpbnQgYWR2NzE4MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBhZHY3MTgwX3N0YXRlICpzdGF0ZTsKQEAgLTEzNSwzMiArMzE3LDExMSBAQAogCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CiAKIAlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHY3MTgwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXN0YXRlLT5pcnEgPSBjbGllbnQtPmlycTsKKwlJTklUX1dPUksoJnN0YXRlLT53b3JrLCBhZHY3MTgwX3dvcmspOworCW11dGV4X2luaXQoJnN0YXRlLT5tdXRleCk7CisJc3RhdGUtPmF1dG9kZXRlY3QgPSB0cnVlOwogCXNkID0gJnN0YXRlLT5zZDsKIAl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmYWR2NzE4MF9vcHMpOwogCiAJLyogSW5pdGlhbGl6ZSBhZHY3MTgwICovCi0JLyogZW5hYmxlIGF1dG9kZXRlY3Rpb24gKi8KKwkvKiBFbmFibGUgYXV0b2RldGVjdGlvbiAqLwogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFY3MTgwX0lOUFVUX0NPTlRST0xfUkVHLAotCQlBRFY3MTgwX0lOUFVUX0NPTlRST0xfUEFMX0JHX05UU0NfSl9TRUNBTSk7Ci0JaWYgKHJldCA+IDApCi0JCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAotCQkJQURWNzE4MF9BVVRPREVURUNUX0VOQUJMRV9SRUcsCi0JCQlBRFY3MTgwX0FVVE9ERVRFQ1RfREVGQVVMVCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCi0JCQkiOiBGYWlsZWQgdG8gY29tbXVuaWNhdGUgdG8gY2hpcDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCUFEVjcxODBfSU5QVVRfQ09OVFJPTF9BRF9QQUxfQkdfTlRTQ19KX1NFQ0FNKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdW5yZWdfc3ViZGV2OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVjcxODBfQVVUT0RFVEVDVF9FTkFCTEVfUkVHLAorCQlBRFY3MTgwX0FVVE9ERVRFQ1RfREVGQVVMVCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnX3N1YmRldjsKKworCS8qIElUVS1SIEJULjY1Ni00IGNvbXBhdGlibGUgKi8KKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJQURWNzE4MF9FWFRFTkRFRF9PVVRQVVRfQ09OVFJPTF9SRUcsCisJCUFEVjcxODBfRVhURU5ERURfT1VUUFVUX0NPTlRST0xfTlRTQ0RJUyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnX3N1YmRldjsKKworCS8qIHJlYWQgY3VycmVudCBub3JtICovCisJX19hZHY3MTgwX3N0YXR1cyhjbGllbnQsIE5VTEwsICZzdGF0ZS0+Y3Vycl9ub3JtKTsKKworCS8qIHJlZ2lzdGVyIGZvciBpbnRlcnJ1cHRzICovCisJaWYgKHN0YXRlLT5pcnEgPiAwKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKHN0YXRlLT5pcnEsIGFkdjcxODBfaXJxLCAwLCBEUklWRVJfTkFNRSwKKwkJCXN0YXRlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3VucmVnX3N1YmRldjsKKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9BRElfQ1RSTF9SRUcsCisJCQlBRFY3MTgwX0FESV9DVFJMX0lSUV9TUEFDRSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfdW5yZWdfc3ViZGV2OworCisJCS8qIGNvbmZpZyB0aGUgSW50ZXJydXB0IHBpbiB0byBiZSBhY3RpdmUgbG93ICovCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFY3MTgwX0lDT05GMV9BREksCisJCQlBRFY3MTgwX0lDT05GMV9BQ1RJVkVfTE9XIHwgQURWNzE4MF9JQ09ORjFfUFNZTkNfT05MWSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfdW5yZWdfc3ViZGV2OworCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFY3MTgwX0lNUjFfQURJLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl91bnJlZ19zdWJkZXY7CisKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVjcxODBfSU1SMl9BREksIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX3VucmVnX3N1YmRldjsKKworCQkvKiBlbmFibGUgQUQgY2hhbmdlIGludGVycnVwdHMgaW50ZXJydXB0cyAqLworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9JTVIzX0FESSwKKwkJCUFEVjcxODBfSVJRM19BRF9DSEFOR0UpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX3VucmVnX3N1YmRldjsKKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURWNzE4MF9JTVI0X0FESSwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfdW5yZWdfc3ViZGV2OworCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFY3MTgwX0FESV9DVFJMX1JFRywKKwkJCTApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX3VucmVnX3N1YmRldjsKIAl9CiAKIAlyZXR1cm4gMDsKKworZXJyX3VucmVnX3N1YmRldjoKKwltdXRleF9kZXN0cm95KCZzdGF0ZS0+bXV0ZXgpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZShzdGF0ZSk7CitlcnI6CisJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IEZhaWxlZCB0byBwcm9iZTogJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhZHY3MTgwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIF9fZGV2ZXhpdCBpbnQgYWR2NzE4MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGFkdjcxODBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCisJaWYgKHN0YXRlLT5pcnEgPiAwKSB7CisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBzdGF0ZSk7CisJCWlmIChjYW5jZWxfd29ya19zeW5jKCZzdGF0ZS0+d29yaykpIHsKKwkJCS8qCisJCQkgKiBXb3JrIHdhcyBwZW5kaW5nLCB0aGVyZWZvcmUgd2UgbmVlZCB0byBlbmFibGUKKwkJCSAqIElSUSBoZXJlIHRvIGJhbGFuY2UgdGhlIGRpc2FibGVfaXJxKCkgZG9uZSBpbiB0aGUKKwkJCSAqIGludGVycnVwdCBoYW5kbGVyLgorCQkJICovCisJCQllbmFibGVfaXJxKHN0YXRlLT5pcnEpOworCQl9CisJfQorCisJbXV0ZXhfZGVzdHJveSgmc3RhdGUtPm11dGV4KTsKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CiAJa2ZyZWUodG9fc3RhdGUoc2QpKTsKIAlyZXR1cm4gMDsKQEAgLTE3OSw3ICs0NDAsNyBAQAogCQkubmFtZQk9IERSSVZFUl9OQU1FLAogCX0sCiAJLnByb2JlCQk9IGFkdjcxODBfcHJvYmUsCi0JLnJlbW92ZQkJPSBhZHY3MTgwX3JlbW92ZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkdjcxODBfcmVtb3ZlKSwKIAkuaWRfdGFibGUJPSBhZHY3MTgwX2lkLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwppbmRleCA1MTUyN2Q3Li4xNDg1YWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwpAQCAtODMwLDcgKzgzMCw3IEBACiAJCWF1MDgyOF91bmluaXRfaXNvYyhkZXYpOwogCiAJCS8qIFNhdmUgc29tZSBwb3dlciBieSBwdXR0aW5nIHR1bmVyIHRvIHNsZWVwICovCi0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19zdGFuZGJ5KTsKKwkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIGNvcmUsIHNfcG93ZXIsIDApOwogCiAJCS8qIFdoZW4gY2xvc2UgdGhlIGRldmljZSwgc2V0IHRoZSB1c2IgaW50ZjAgaW50byBhbHQwIHRvIGZyZWUKIAkJICAgVVNCIGJhbmR3aWR0aCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jCmluZGV4IGY5MzMwZTMuLjViYjBmOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMKQEAgLTI5OSw3ICsyOTksNyBAQAogCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAic2V0IGlucHV0ICV4XG4iLCBpbnB1dCk7CiAKLQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID4gNykKKwlpZiAoaW5wdXQgPiA3KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChzZC0+djRsMl9kZXYgPT0gTlVMTCB8fCBzZC0+djRsMl9kZXYtPm5vdGlmeSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYwppbmRleCBlYmQ1MWFmLi44NGE5NTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYwpAQCAtNzMsMTIgKzczLDEyIEBACiAKIAlpZiAoKGlyLT5tYXNrX2tleWRvd24gICYmICAoMCAhPSAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pKSkgfHwKIAkgICAgKGlyLT5tYXNrX2tleXVwICAgICYmICAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkpKSB7Ci0JCWlyX2lucHV0X2tleWRvd24oaXItPmRldiwmaXItPmlyLGRhdGEsZGF0YSk7CisJCWlyX2lucHV0X2tleWRvd24oaXItPmRldiwgJmlyLT5pciwgZGF0YSk7CiAJfSBlbHNlIHsKIAkJLyogSEFDSzogUHJvYmFibHksIGlyLT5tYXNrX2tleWRvd24gaXMgbWlzc2luZwogCQkgICBmb3IgdGhpcyBib2FyZCAqLwogCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9XSU5GQVNUMjAwMCkKLQkJCWlyX2lucHV0X2tleWRvd24oaXItPmRldiwgJmlyLT5pciwgZGF0YSwgZGF0YSk7CisJCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGRhdGEpOwogCiAJCWlyX2lucHV0X25va2V5KGlyLT5kZXYsJmlyLT5pcik7CiAJfQpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCQlncGlvLCBkYXRhLAogCQkJKGdwaW8gJiBpci0+bWFza19rZXl1cCkgPyAiIHVwIiA6ICJ1cC9kb3duIik7CiAKLQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhKTsKIAkJaWYgKGtleXVwKQogCQkJaXJfaW5wdXRfbm9rZXkoaXItPmRldiwgJmlyLT5pcik7CiAJfSBlbHNlIHsKQEAgLTExOCw3ICsxMTgsNyBAQAogCQlpZiAoa2V5dXApCiAJCQlpcl9pbnB1dF9ub2tleShpci0+ZGV2LCAmaXItPmlyKTsKIAkJZWxzZQotCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJCWlyX2lucHV0X2tleWRvd24oaXItPmRldiwgJmlyLT5pciwgZGF0YSk7CiAJfQogCiAJaXItPmxhc3RfZ3BpbyA9IGRhdGEgfCBrZXl1cDsKQEAgLTM2OCw3ICszNjgsMTAgQEAKIAlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLAogCQkgcGNpX25hbWUoYnR2LT5jLnBjaSkpOwogCi0JaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZpci0+aXIsIGlyX3R5cGUsIGlyX2NvZGVzKTsKKwllcnIgPSBpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgaXJfdHlwZSwgaXJfY29kZXMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKwogCWlucHV0X2Rldi0+bmFtZSA9IGlyLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyA9IGlyLT5waHlzOwogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CkBAIC00MDAsNiArNDAzLDcgQEAKIAlidHR2X2lyX3N0b3AoYnR2KTsKIAlidHYtPnJlbW90ZSA9IE5VTEw7CiAgZXJyX291dF9mcmVlOgorCWlyX2lucHV0X2ZyZWUoaW5wdXRfZGV2KTsKIAlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCWtmcmVlKGlyKTsKIAlyZXR1cm4gZXJyOwpAQCAtNDExLDYgKzQxNSw3IEBACiAJCXJldHVybjsKIAogCWJ0dHZfaXJfc3RvcChidHYpOworCWlyX2lucHV0X2ZyZWUoYnR2LT5yZW1vdGUtPmRldik7CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYnR2LT5yZW1vdGUtPmRldik7CiAJa2ZyZWUoYnR2LT5yZW1vdGUpOwogCWJ0di0+cmVtb3RlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWNvcmUuYwppbmRleCA1MzZkZWRiLi40MzkyYzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5jCkBAIC05OSwxMCArOTksOCBAQAogCQkJICAgICBvcl92YWx1ZSk7CiB9CiAKLXN0YXRpYyBpbnQgY3gxOF9hdl9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiB2YWwpCitzdGF0aWMgdm9pZCBjeDE4X2F2X2luaXQoc3RydWN0IGN4MTggKmN4KQogewotCXN0cnVjdCBjeDE4ICpjeCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCiAJLyoKIAkgKiBUaGUgY3J5c3RhbCBmcmVxIHVzZWQgaW4gY2FsY3VsYXRpb25zIGluIHRoaXMgZHJpdmVyIHdpbGwgYmUKIAkgKiAyOC42MzYzNjAgTUh6LgpAQCAtMTI1LDcgKzEyMyw2IEBACiAKIAkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDE2ICovCiAJY3gxOF9hdl93cml0ZShjeCwgQ1hBREVDX0kyU19NQ0xLLCAweDU2KTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgY3gxOF9hdl9pbml0aWFsaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCkBAIC0xOTgsNyArMTk1LDcgQEAKIAljeDE4X2F2X2FuZF9vcjQoY3gsIENYQURFQ19DSElQX0NUUkwsIDB4RkZGQkZGRkYsIDB4MDAxMjAwMDApOwogCiAJLyogU2V0dXAgdGhlIFZpZGVvIGFuZCBhbmQgQXV4L0F1ZGlvIFBMTHMgKi8KLQljeDE4X2F2X2luaXQoc2QsIDApOworCWN4MThfYXZfaW5pdChjeCk7CiAKIAkvKiBzZXQgdmlkZW8gdG8gYXV0by1kZXRlY3QgKi8KIAkvKiBDbGVhciBiaXRzIDExLTEyIHRvIGVuYWJsZSBzbG93IGxvY2tpbmcgbW9kZS4gIFNldCBhdXRvZGV0ZWN0IG1vZGUgKi8KQEAgLTEzNTUsNyArMTM1Miw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGN4MThfYXZfZ2VuZXJhbF9vcHMgPSB7CiAJLmdfY2hpcF9pZGVudCA9IGN4MThfYXZfZ19jaGlwX2lkZW50LAogCS5sb2dfc3RhdHVzID0gY3gxOF9hdl9sb2dfc3RhdHVzLAotCS5pbml0ID0gY3gxOF9hdl9pbml0LAogCS5sb2FkX2Z3ID0gY3gxOF9hdl9sb2FkX2Z3LAogCS5yZXNldCA9IGN4MThfYXZfcmVzZXQsCiAJLnF1ZXJ5Y3RybCA9IGN4MThfYXZfcXVlcnljdHJsLApAQCAtMTM5OSw2ICsxMzk1LDcgQEAKIHsKIAlzdHJ1Y3QgY3gxOF9hdl9zdGF0ZSAqc3RhdGUgPSAmY3gtPmF2X3N0YXRlOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJaW50IGVycjsKIAogCXN0YXRlLT5yZXYgPSBjeDE4X2F2X3JlYWQ0KGN4LCBDWEFERUNfQ0hJUF9DVFJMKSAmIDB4ZmZmZjsKIAlzdGF0ZS0+aWQgPSAoKHN0YXRlLT5yZXYgPj4gNCkgPT0gQ1hBREVDX0NISVBfVFlQRV9NQUtPKQpAQCAtMTQxNyw1ICsxNDE0LDggQEAKIAlzbnByaW50ZihzZC0+bmFtZSwgc2l6ZW9mKHNkLT5uYW1lKSwKIAkJICIlcyAlMDN4IiwgY3gtPnY0bDJfZGV2Lm5hbWUsIChzdGF0ZS0+cmV2ID4+IDQpKTsKIAlzZC0+Z3JwX2lkID0gQ1gxOF9IV180MThfQVY7Ci0JcmV0dXJuIHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldigmY3gtPnY0bDJfZGV2LCBzZCk7CisJZXJyID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KCZjeC0+djRsMl9kZXYsIHNkKTsKKwlpZiAoIWVycikKKwkJY3gxOF9hdl9pbml0KGN4KTsKKwlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5oCmluZGV4IDliODRhMGMuLmNhZmI3ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmgKQEAgLTI5NCw3ICsyOTQsNyBAQAogI2RlZmluZSBDWEFERUNfUUFNX0NPTlNUX0RFQyAgICAgICAweDkyNAogI2RlZmluZSBDWEFERUNfUUFNX1JPVEFUT1JfRlJFUSAgICAweDk0OAogCi0vKiBCaXQgZGVmaW50aW9ucyAvIHNldHRpbmdzIHVzZWQgaW4gTWFrbyBBdWRpbyAqLworLyogQml0IGRlZmluaXRpb25zIC8gc2V0dGluZ3MgdXNlZCBpbiBNYWtvIEF1ZGlvICovCiAjZGVmaW5lIENYQURFQ19QUkVGX01PREVfTU9OT19MQU5HQSAgICAgICAgMAogI2RlZmluZSBDWEFERUNfUFJFRl9NT0RFX01PTk9fTEFOR0IgICAgICAgIDEKICNkZWZpbmUgQ1hBREVDX1BSRUZfTU9ERV9NT05PX0xBTkdDICAgICAgICAyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jYXJkcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtY2FyZHMuaAppbmRleCA0NDRlM2M3Li5hZjNkNzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jYXJkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWNhcmRzLmgKQEAgLTM0LDYgKzM0LDkgQEAKICNkZWZpbmUgQ1gxOF9IV19aOEYwODExX0lSX0hBVVAJKENYMThfSFdfWjhGMDgxMV9JUl9SWF9IQVVQIHwgXAogCQkJCSBDWDE4X0hXX1o4RjA4MTFfSVJfVFhfSEFVUCkKIAorI2RlZmluZSBDWDE4X0hXX0lSX0FOWSAoQ1gxOF9IV19aOEYwODExX0lSX1JYX0hBVVAgfCBcCisJCQlDWDE4X0hXX1o4RjA4MTFfSVJfVFhfSEFVUCkKKwogLyogdmlkZW8gaW5wdXRzICovCiAjZGVmaW5lCUNYMThfQ0FSRF9JTlBVVF9WSURfVFVORVIJMQogI2RlZmluZQlDWDE4X0NBUkRfSU5QVVRfU1ZJREVPMSAJMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYwppbmRleCA2ZGQ1MWUyLi43ZjY1YTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYwpAQCAtODcsNyArODcsNiBAQAogc3RhdGljIGludCBlbmNfbXBnX2J1ZnNpemUgPSBDWDE4X0RFRkFVTFRfRU5DX01QR19CVUZTSVpFOwogc3RhdGljIGludCBlbmNfaWR4X2J1ZnNpemUgPSBDWDE4X0RFRkFVTFRfRU5DX0lEWF9CVUZTSVpFOwogc3RhdGljIGludCBlbmNfeXV2X2J1ZnNpemUgPSBDWDE4X0RFRkFVTFRfRU5DX1lVVl9CVUZTSVpFOwotLyogVkJJIGJ1ZnNpemUgYmFzZWQgb24gc3RhbmRhcmRzIHN1cHBvcnRlZCBieSBjYXJkIHR1bmVyIGZvciBub3cgKi8KIHN0YXRpYyBpbnQgZW5jX3BjbV9idWZzaXplID0gQ1gxOF9ERUZBVUxUX0VOQ19QQ01fQlVGU0laRTsKIAogc3RhdGljIGludCBlbmNfdHNfYnVmcyA9IC0xOwpAQCAtMTI4LDcgKzEyNyw2IEBACiBtb2R1bGVfcGFyYW0oZW5jX21wZ19idWZzaXplLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGVuY19pZHhfYnVmc2l6ZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShlbmNfeXV2X2J1ZnNpemUsIGludCwgMDY0NCk7Ci0vKiBWQkkgYnVmc2l6ZSBiYXNlZCBvbiBzdGFuZGFyZHMgc3VwcG9ydGVkIGJ5IGNhcmQgdHVuZXIgZm9yIG5vdyAqLwogbW9kdWxlX3BhcmFtKGVuY19wY21fYnVmc2l6ZSwgaW50LCAwNjQ0KTsKIAogbW9kdWxlX3BhcmFtKGVuY190c19idWZzLCBpbnQsIDA2NDQpOwpAQCAtMjExLDcgKzIwOSw5IEBACiAJCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShDWDE4X0RFRkFVTFRfRU5DX1lVVl9CVUZGRVJTKSk7CiBNT0RVTEVfUEFSTV9ERVNDKGVuY195dXZfYnVmc2l6ZSwKIAkJICJTaXplIG9mIGFuIGVuY29kZXIgWVVWIGJ1ZmZlciAoa0IpXG4iCi0JCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShDWDE4X0RFRkFVTFRfRU5DX1lVVl9CVUZTSVpFKSk7CisJCSAiXHRcdFx0QWxsb3dlZCB2YWx1ZXMgYXJlIG11bHRpcGxlcyBvZiAzMy43NSBrQiByb3VuZGVkIHVwXG4iCisJCSAiXHRcdFx0KG11bHRpcGxlcyBvZiBzaXplIHJlcXVpcmVkIGZvciAzMiBzY3JlZW4gbGluZXMpXG4iCisJCSAiXHRcdFx0RGVmYXVsdDogMTAyIik7CiBNT0RVTEVfUEFSTV9ERVNDKGVuY195dXZfYnVmcywKIAkJICJOdW1iZXIgb2YgZW5jb2RlciBZVVYgYnVmZmVyc1xuIgogCQkgIlx0XHRcdERlZmF1bHQgaXMgY29tcHV0ZWQgZnJvbSBvdGhlciBlbmNfeXV2XyogcGFyYW1ldGVycyIpOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShDWDE4X0RFRkFVTFRfRU5DX1ZCSV9CVUZGRVJTKSk7CiBNT0RVTEVfUEFSTV9ERVNDKGVuY192YmlfYnVmcywKIAkJICJOdW1iZXIgb2YgZW5jb2RlciBWQkkgYnVmZmVyc1xuIgotCQkgIlx0XHRcdERlZmF1bHQgaXMgY29tcHV0ZWQgZnJvbSBlbmNfdmJpX2J1ZmZlcnMgJiB0dW5lciBzdGQiKTsKKwkJICJcdFx0XHREZWZhdWx0IGlzIGNvbXB1dGVkIGZyb20gZW5jX3ZiaV9idWZmZXJzIik7CiBNT0RVTEVfUEFSTV9ERVNDKGVuY19wY21fYnVmZmVycywKIAkJICJFbmNvZGVyIFBDTSBidWZmZXIgbWVtb3J5IChNQikuIChlbmNfcGNtX2J1ZnMgY2FuIG92ZXJyaWRlKVxuIgogCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX0VOQ19QQ01fQlVGRkVSUykpOwpAQCAtNDk5LDEwICs0OTksMjcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qCisJCSAqIFlVViBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgc3RyZWFtX2J1Zl9zaXplIG5lZWRzIHRvIGJlCisJCSAqIGFuIGludGVncmFsIG11bHRpcGxlIG9mIDMzLjc1IGtCIChzdG9yYWdlIGZvciAzMiBzY3JlZW5zCisJCSAqIGxpbmVzIHRvIG1haW50YWluIGFsaWdubWVudCBpbiBjYXNlIG9mIGxvc3QgYnVmZmVycworCQkgKi8KKwkJaWYgKGkgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfWVVWKSB7CisJCQljeC0+c3RyZWFtX2J1Zl9zaXplW2ldICo9IDEwMjQ7CisJCQljeC0+c3RyZWFtX2J1Zl9zaXplW2ldIC09CisJCQkgICAoY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSAlIENYMThfVU5JVF9FTkNfWVVWX0JVRlNJWkUpOworCisJCQlpZiAoY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSA8IENYMThfVU5JVF9FTkNfWVVWX0JVRlNJWkUpCisJCQkJY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSA9CisJCQkJCQlDWDE4X1VOSVRfRU5DX1lVVl9CVUZTSVpFOworCQl9CisJCS8qCisJCSAqIFlVViBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgc3RyZWFtX2J1Zl9zaXplIGlzCisJCSAqIG5vdyBpbiBieXRlcy4KIAkJICogVkJJIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBzdHJlYW1fYnVmX3NpemUgaXMgZml4ZWQKIAkJICogYW5kIGFscmVhZHkgaW4gYnl0ZXMKIAkJICovCi0JCWlmIChpID09IENYMThfRU5DX1NUUkVBTV9UWVBFX1ZCSSkgeworCQlpZiAoaSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9WQkkgfHwKKwkJICAgIGkgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfWVVWKSB7CiAJCQlpZiAoY3gtPnN0cmVhbV9idWZmZXJzW2ldIDwgMCkgewogCQkJCWN4LT5zdHJlYW1fYnVmZmVyc1tpXSA9CiAJCQkJCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tpXSAqIDEwMjQgKiAxMDI0CkBAIC01MTMsMTggKzUzMCwyNCBAQAogCQkJCQljeC0+c3RyZWFtX2J1ZmZlcnNbaV0KIAkJCQkJKiBjeC0+c3RyZWFtX2J1Zl9zaXplW2ldLygxMDI0ICogMTAyNCk7CiAJCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBBbGwgb3RoZXIgc3RyZWFtcyBoYXZlIHN0cmVhbV9idWZfc2l6ZSBpbiBrQiBhdCB0aGlzIHBvaW50ICovCi0JCWlmIChjeC0+c3RyZWFtX2J1ZmZlcnNbaV0gPCAwKSB7Ci0JCQljeC0+c3RyZWFtX2J1ZmZlcnNbaV0gPSBjeC0+b3B0aW9ucy5tZWdhYnl0ZXNbaV0gKiAxMDI0Ci0JCQkJCQkvIGN4LT5zdHJlYW1fYnVmX3NpemVbaV07CiAJCX0gZWxzZSB7Ci0JCQkvKiBOLkIuIFRoaXMgbWlnaHQgcm91bmQgZG93biB0byAwICovCi0JCQljeC0+b3B0aW9ucy5tZWdhYnl0ZXNbaV0gPQotCQkJICBjeC0+c3RyZWFtX2J1ZmZlcnNbaV0gKiBjeC0+c3RyZWFtX2J1Zl9zaXplW2ldIC8gMTAyNDsKKwkJCS8qIEFsbCBvdGhlciBzdHJlYW1zIGhhdmUgc3RyZWFtX2J1Zl9zaXplIGluIGtCIGhlcmUgKi8KKwkJCWlmIChjeC0+c3RyZWFtX2J1ZmZlcnNbaV0gPCAwKSB7CisJCQkJY3gtPnN0cmVhbV9idWZmZXJzW2ldID0KKwkJCQkJCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tpXSAqIDEwMjQKKwkJCQkJCS8gY3gtPnN0cmVhbV9idWZfc2l6ZVtpXTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTi5CLiBUaGlzIG1pZ2h0IHJvdW5kIGRvd24gdG8gMCAqLworCQkJCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tpXSA9CisJCQkJCQljeC0+c3RyZWFtX2J1ZmZlcnNbaV0KKwkJCQkJCSogY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSAvIDEwMjQ7CisJCQl9CisJCQkvKiBjb252ZXJ0IGZyb20ga0IgdG8gYnl0ZXMgKi8KKwkJCWN4LT5zdHJlYW1fYnVmX3NpemVbaV0gKj0gMTAyNDsKIAkJfQotCQljeC0+c3RyZWFtX2J1Zl9zaXplW2ldICo9IDEwMjQ7IC8qIGNvbnZlcnQgZnJvbSBrQiB0byBieXRlcyAqLworCQlDWDE4X0RFQlVHX0lORk8oIlN0cmVhbSB0eXBlICVkIG9wdGlvbnM6ICVkIE1CLCAlZCBidWZmZXJzLCAiCisJCQkJIiVkIGJ5dGVzXG4iLCBpLCBjeC0+b3B0aW9ucy5tZWdhYnl0ZXNbaV0sCisJCQkJY3gtPnN0cmVhbV9idWZmZXJzW2ldLCBjeC0+c3RyZWFtX2J1Zl9zaXplW2ldKTsKIAl9CiAKIAljeC0+b3B0aW9ucy5jYXJkdHlwZSA9IGNhcmR0eXBlW2N4LT5pbnN0YW5jZV07CkBAIC02NjksNiArNjkyLDEyIEBACiAJY3gtPnZiaS5pbi50eXBlID0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTsKIAljeC0+dmJpLnNsaWNlZF9pbiA9ICZjeC0+dmJpLmluLmZtdC5zbGljZWQ7CiAKKwkvKiBJVlRWIHN0eWxlIFZCSSBpbnNlcnRpb24gaW50byBNUEVHIHN0cmVhbXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmY3gtPnZiaS5zbGljZWRfbXBlZ19idWYubGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmN4LT52Ymkuc2xpY2VkX21wZWdfbWRsLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjeC0+dmJpLnNsaWNlZF9tcGVnX21kbC5idWZfbGlzdCk7CisJbGlzdF9hZGQoJmN4LT52Ymkuc2xpY2VkX21wZWdfYnVmLmxpc3QsCisJCSAmY3gtPnZiaS5zbGljZWRfbXBlZ19tZGwuYnVmX2xpc3QpOwogCXJldHVybiAwOwogfQogCkBAIC04ODMsNyArOTEyLDYgQEAKIAkJQ1gxOF9FUlIoIkNvdWxkIG5vdCByZWdpc3RlciBBL1YgZGVjb2RlciBzdWJkZXZpY2VcbiIpOwogCQlnb3RvIGZyZWVfbWFwOwogCX0KLQljeDE4X2NhbGxfaHcoY3gsIENYMThfSFdfNDE4X0FWLCBjb3JlLCBpbml0LCAwKTsKIAogCS8qIEluaXRpYWxpemUgR1BJTyBSZXNldCBDb250cm9sbGVyIHRvIGRvIGNoaXAgcmVzZXRzIGR1cmluZyBpMmMgaW5pdCAqLwogCWlmIChjeC0+Y2FyZC0+aHdfYWxsICYgQ1gxOF9IV19HUElPX1JFU0VUX0NUUkwpIHsKQEAgLTEyMDAsNyArMTIyOCw3IEBACiAgICAgICAucmVtb3ZlID0gICBjeDE4X3JlbW92ZSwKIH07CiAKLXN0YXRpYyBpbnQgbW9kdWxlX3N0YXJ0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtb2R1bGVfc3RhcnQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJjeDE4OiAgU3RhcnQgaW5pdGlhbGl6YXRpb24sIHZlcnNpb24gJXNcbiIsIENYMThfVkVSU0lPTik7CiAKQEAgLTEyMjQsNyArMTI1Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgbW9kdWxlX2NsZWFudXAodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmN4MThfcGNpX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCmluZGV4IGM2YTFlOTAuLmUzZjc5MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1rYmQtaTJjLmg+CiAjaW5jbHVkZSAiY3gxOC1tYWlsYm94LmgiCiAjaW5jbHVkZSAiY3gxOC1hdi1jb3JlLmgiCiAjaW5jbHVkZSAiY3gyMzQxOC5oIgpAQCAtMTIwLDEyICsxMjEsMTYgQEAKIC8qIE1heGltdW0gZmlybXdhcmUgRE1BIGJ1ZmZlcnMgcGVyIHN0cmVhbSAqLwogI2RlZmluZSBDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0gNjMKIAorLyogWVVWIGJ1ZmZlciBzaXplcyBpbiBieXRlcyB0byBlbnN1cmUgaW50ZWdlciAjIG9mIGZyYW1lcyBwZXIgYnVmZmVyICovCisjZGVmaW5lIENYMThfVU5JVF9FTkNfWVVWX0JVRlNJWkUJKDcyMCAqICAzMiAqIDMgLyAyKSAvKiBieXRlcyAqLworI2RlZmluZSBDWDE4XzYyNV9MSU5FX0VOQ19ZVVZfQlVGU0laRQkoQ1gxOF9VTklUX0VOQ19ZVVZfQlVGU0laRSAqIDU3Ni8zMikKKyNkZWZpbmUgQ1gxOF81MjVfTElORV9FTkNfWVVWX0JVRlNJWkUJKENYMThfVU5JVF9FTkNfWVVWX0JVRlNJWkUgKiA0ODAvMzIpCisKIC8qIERNQSBidWZmZXIsIGRlZmF1bHQgc2l6ZSBpbiBrQiBhbGxvY2F0ZWQgKi8KICNkZWZpbmUgQ1gxOF9ERUZBVUxUX0VOQ19UU19CVUZTSVpFICAgMzIKICNkZWZpbmUgQ1gxOF9ERUZBVUxUX0VOQ19NUEdfQlVGU0laRSAgMzIKICNkZWZpbmUgQ1gxOF9ERUZBVUxUX0VOQ19JRFhfQlVGU0laRSAgMzIKLSNkZWZpbmUgQ1gxOF9ERUZBVUxUX0VOQ19ZVVZfQlVGU0laRSAxMjgKLS8qIERlZmF1bHQgVkJJIGJ1ZnNpemUgYmFzZWQgb24gc3RhbmRhcmRzIHN1cHBvcnRlZCBieSBjYXJkIHR1bmVyIGZvciBub3cgKi8KKyNkZWZpbmUgQ1gxOF9ERUZBVUxUX0VOQ19ZVVZfQlVGU0laRSAgKENYMThfVU5JVF9FTkNfWVVWX0JVRlNJWkUgKiAzIC8gMTAyNCArIDEpCiAjZGVmaW5lIENYMThfREVGQVVMVF9FTkNfUENNX0JVRlNJWkUgICA0CiAKIC8qIGkyYyBzdHVmZiAqLwpAQCAtMjQ2LDggKzI1MSw4IEBACiAJaW50IHJhZGlvOwkJLyogZW5hYmxlL2Rpc2FibGUgcmFkaW8gKi8KIH07CiAKLS8qIHBlci1idWZmZXIgYml0IGZsYWdzICovCi0jZGVmaW5lIENYMThfRl9CX05FRURfQlVGX1NXQVAgIDAJLyogdGhpcyBidWZmZXIgc2hvdWxkIGJlIGJ5dGUgc3dhcHBlZCAqLworLyogcGVyLW1kbCBiaXQgZmxhZ3MgKi8KKyNkZWZpbmUgQ1gxOF9GX01fTkVFRF9TV0FQICAwCS8qIG1kbCBidWZmZXIgZGF0YSBtdXN0IGJlIGVuZGlhbmVzcyBzd2FwcGVkICovCiAKIC8qIHBlci1zdHJlYW0sIHNfZmxhZ3MgKi8KICNkZWZpbmUgQ1gxOF9GX1NfQ0xBSU1FRCAJMwkvKiB0aGlzIHN0cmVhbSBpcyBjbGFpbWVkICovCkBAIC0yNzQsMTggKzI3OSwyOSBAQAogc3RydWN0IGN4MThfYnVmZmVyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwotCXUzMiBpZDsKLQl1bnNpZ25lZCBsb25nIGJfZmxhZ3M7Ci0JdW5zaWduZWQgc2tpcHBlZDsKIAljaGFyICpidWY7CiAKIAl1MzIgYnl0ZXN1c2VkOwogCXUzMiByZWFkcG9zOwogfTsKIAorc3RydWN0IGN4MThfbWRsIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyIGlkOwkJLyogaW5kZXggaW50byBjeC0+c2NiLT5jcHVfbWRsW10gb2YgMXN0IGN4MThfbWRsX2VudCAqLworCisJdW5zaWduZWQgaW50IHNraXBwZWQ7CisJdW5zaWduZWQgbG9uZyBtX2ZsYWdzOworCisJc3RydWN0IGxpc3RfaGVhZCBidWZfbGlzdDsKKwlzdHJ1Y3QgY3gxOF9idWZmZXIgKmN1cnJfYnVmOyAvKiBjdXJyZW50IGJ1ZmZlciBpbiBsaXN0IGZvciByZWFkaW5nICovCisKKwl1MzIgYnl0ZXN1c2VkOworCXUzMiByZWFkcG9zOworfTsKKwogc3RydWN0IGN4MThfcXVldWUgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlhdG9taWNfdCBidWZmZXJzOworCWF0b21pY190IGRlcHRoOwogCXUzMiBieXRlc3VzZWQ7CiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKQEAgLTMzNyw3ICszNTMsNyBAQAogCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBzdHJlYW0gKi8KIAlpbnQgdHlwZTsJCQkvKiBzdHJlYW0gdHlwZSAqLwogCXUzMiBoYW5kbGU7CQkJLyogdGFzayBoYW5kbGUgKi8KLQl1bnNpZ25lZCBtZGxfb2Zmc2V0OworCXVuc2lnbmVkIGludCBtZGxfYmFzZV9pZHg7CiAKIAl1MzIgaWQ7CiAJdW5zaWduZWQgbG9uZyBzX2ZsYWdzOwkvKiBzdGF0dXMgZmxhZ3MsIHNlZSBhYm92ZSAqLwpAQCAtMzQ2LDE0ICszNjIsMjAgQEAKIAkJCQkgICBQQ0lfRE1BX05PTkUgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKIAotCS8qIEJ1ZmZlciBTdGF0cyAqLwotCXUzMiBidWZmZXJzOwotCXUzMiBidWZfc2l6ZTsKKwkvKiBCdWZmZXJzICovCisJc3RydWN0IGxpc3RfaGVhZCBidWZfcG9vbDsJLyogYnVmZmVycyBub3QgYXR0YWNoZWQgdG8gYW4gTURMICovCisJdTMyIGJ1ZmZlcnM7CQkJLyogdG90YWwgYnVmZmVycyBvd25lZCBieSB0aGlzIHN0cmVhbSAqLworCXUzMiBidWZfc2l6ZTsJCQkvKiBzaXplIGluIGJ5dGVzIG9mIGEgc2luZ2xlIGJ1ZmZlciAqLwogCi0JLyogQnVmZmVyIFF1ZXVlcyAqLwotCXN0cnVjdCBjeDE4X3F1ZXVlIHFfZnJlZTsJLyogZnJlZSBidWZmZXJzICovCi0Jc3RydWN0IGN4MThfcXVldWUgcV9idXN5OwkvKiBidXN5IGJ1ZmZlcnMgLSBpbiB1c2UgYnkgZmlybXdhcmUgKi8KLQlzdHJ1Y3QgY3gxOF9xdWV1ZSBxX2Z1bGw7CS8qIGZ1bGwgYnVmZmVycyAtIGRhdGEgZm9yIHVzZXIgYXBwcyAqLworCS8qIE1ETCBzaXplcyAtIGFsbCBzdHJlYW0gTURMcyBhcmUgdGhlIHNhbWUgc2l6ZSAqLworCXUzMiBidWZzX3Blcl9tZGw7CisJdTMyIG1kbF9zaXplOwkJLyogdG90YWwgYnl0ZXMgaW4gYWxsIGJ1ZmZlcnMgaW4gYSBtZGwgKi8KKworCS8qIE1ETCBRdWV1ZXMgKi8KKwlzdHJ1Y3QgY3gxOF9xdWV1ZSBxX2ZyZWU7CS8qIGZyZWUgLSBpbiByb3RhdGlvbiwgbm90IGNvbW1pdHRlZCAqLworCXN0cnVjdCBjeDE4X3F1ZXVlIHFfYnVzeTsJLyogYnVzeSAtIGluIHVzZSBieSBmaXJtd2FyZSAqLworCXN0cnVjdCBjeDE4X3F1ZXVlIHFfZnVsbDsJLyogZnVsbCAtIGRhdGEgZm9yIHVzZXIgYXBwcyAqLworCXN0cnVjdCBjeDE4X3F1ZXVlIHFfaWRsZTsJLyogaWRsZSAtIG5vdCBpbiByb3RhdGlvbiAqLwogCiAJc3RydWN0IHdvcmtfc3RydWN0IG91dF93b3JrX29yZGVyOwogCkBAIC00ODEsMTAgKzUwMywxMSBAQAogCXUzMiBpbnNlcnRlZF9mcmFtZTsKIAogCS8qCi0JICogQSBkdW1teSBkcml2ZXIgc3RyZWFtIHRyYW5zZmVyIGJ1ZmZlciB3aXRoIGEgY29weSBvZiB0aGUgbmV4dAorCSAqIEEgZHVtbXkgZHJpdmVyIHN0cmVhbSB0cmFuc2ZlciBtZGwgJiBidWZmZXIgd2l0aCBhIGNvcHkgb2YgdGhlIG5leHQKIAkgKiBzbGljZWRfbXBlZ19kYXRhW10gYnVmZmVyIGZvciBvdXRwdXQgdG8gdXNlcmxhbmQgYXBwcy4KIAkgKiBPbmx5IHVzZWQgaW4gY3gxOC1maWxlb3BzLmMsIGJ1dCBpdHMgc3RhdGUgbmVlZHMgdG8gcGVyc2lzdCBhdCB0aW1lcy4KIAkgKi8KKwlzdHJ1Y3QgY3gxOF9tZGwgc2xpY2VkX21wZWdfbWRsOwogCXN0cnVjdCBjeDE4X2J1ZmZlciBzbGljZWRfbXBlZ19idWY7CiB9OwogCkBAIC01MTEsMTAgKzUzNCw5IEBACiAJdTggaXNfNjBoejsKIAl1OCBub2ZfaW5wdXRzOwkJLyogbnVtYmVyIG9mIHZpZGVvIGlucHV0cyAqLwogCXU4IG5vZl9hdWRpb19pbnB1dHM7CS8qIG51bWJlciBvZiBhdWRpbyBpbnB1dHMgKi8KLQl1MTYgYnVmZmVyX2lkOwkJLyogYnVmZmVyIElEIGNvdW50ZXIgKi8KIAl1MzIgdjRsMl9jYXA7CQkvKiBWNEwyIGNhcGFiaWxpdGllcyBvZiBjYXJkICovCiAJdTMyIGh3X2ZsYWdzOyAJCS8qIEhhcmR3YXJlIGRlc2NyaXB0aW9uIG9mIHRoZSBib2FyZCAqLwotCXVuc2lnbmVkIG1kbF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyZWVfbWRsX2lkeDsKIAlzdHJ1Y3QgY3gxOF9zY2IgX19pb21lbSAqc2NiOyAvKiBwb2ludGVyIHRvIFNDQiAqLwogCXN0cnVjdCBtdXRleCBlcHUyYXB1X21iX2xvY2s7IC8qIHByb3RlY3QgZHJpdmVyIHRvIGNoaXAgbWFpbGJveCBpbiBTQ0IqLwogCXN0cnVjdCBtdXRleCBlcHUyY3B1X21iX2xvY2s7IC8qIHByb3RlY3QgZHJpdmVyIHRvIGNoaXAgbWFpbGJveCBpbiBTQ0IqLwpAQCAtNTg1LDYgKzYwNyw4IEBACiAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGkyY19hbGdvWzJdOwogCXN0cnVjdCBjeDE4X2kyY19hbGdvX2NhbGxiYWNrX2RhdGEgaTJjX2FsZ29fY2JfZGF0YVsyXTsKIAorCXN0cnVjdCBJUl9pMmNfaW5pdF9kYXRhIGlyX2kyY19pbml0X2RhdGE7CisKIAkvKiBncGlvICovCiAJdTMyIGdwaW9fZGlyOwogCXUzMiBncGlvX3ZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHZiLmMKaW5kZXggNTFhMGMzMy4uNzFhZDJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHZiLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAkudG9wCQkgPSBNWEw1MDA1U19UT1BfMjVQMiwKIAkubW9kX21vZGUgICAgICAgID0gTVhMX0RJR0lUQUxfTU9ERSwKIAkuaWZfbW9kZSAgICAgICAgID0gTVhMX1pFUk9fSUYsCisJLnFhbV9nYWluICAgICAgICA9IDB4MDIsCiAJLkFnY01hc3RlckJ5dGUgICA9IDB4MDAsCiB9OwogCkBAIC03MSw3ICs3Miw4IEBACiAJLnFhbV9pZiAgICAgICAgPSA0NDAwMCwKIAkuaW52ZXJzaW9uICAgICA9IFM1SDE0MDlfSU5WRVJTSU9OX09GRiwKIAkuc3RhdHVzX21vZGUgICA9IFM1SDE0MDlfREVNT0RMT0NLSU5HLAotCS5tcGVnX3RpbWluZyAgID0gUzVIMTQwOV9NUEVHVElNSU5HX0NPTlRJTk9VU19OT05JTlZFUlRJTkdfQ0xPQ0sKKwkubXBlZ190aW1pbmcgICA9IFM1SDE0MDlfTVBFR1RJTUlOR19DT05USU5PVVNfTk9OSU5WRVJUSU5HX0NMT0NLLAorCS5odnIxNjAwX29wdCAgID0gUzVIMTQwOV9IVlIxNjAwX09QVElNSVpFCiB9OwogCiAvKgpAQCAtMzYwLDkgKzM2MiwxMCBAQAogCWR2Yl9uZXRfaW5pdChkdmJfYWRhcHRlciwgJmR2Yi0+ZHZibmV0LCBkbXgpOwogCiAJQ1gxOF9JTkZPKCJEVkIgRnJvbnRlbmQgcmVnaXN0ZXJlZFxuIik7Ci0JQ1gxOF9JTkZPKCJSZWdpc3RlcmVkIERWQiBhZGFwdGVyJWQgZm9yICVzICglZCB4ICVkIGtCKVxuIiwKKwlDWDE4X0lORk8oIlJlZ2lzdGVyZWQgRFZCIGFkYXB0ZXIlZCBmb3IgJXMgKCVkIHggJWQuJTAyZCBrQilcbiIsCiAJCSAgc3RyZWFtLT5kdmIuZHZiX2FkYXB0ZXIubnVtLCBzdHJlYW0tPm5hbWUsCi0JCSAgc3RyZWFtLT5idWZmZXJzLCBzdHJlYW0tPmJ1Zl9zaXplLzEwMjQpOworCQkgIHN0cmVhbS0+YnVmZmVycywgc3RyZWFtLT5idWZfc2l6ZS8xMDI0LAorCQkgIChzdHJlYW0tPmJ1Zl9zaXplICogMTAwIC8gMTAyNCkgJSAxMDApOwogCiAJbXV0ZXhfaW5pdCgmZHZiLT5mZWVkbG9jayk7CiAJZHZiLT5lbmFibGVkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYwppbmRleCAwNGQ5YzI1Li40ZTI3OGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maWxlb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlsZW9wcy5jCkBAIC0xNjYsMTEgKzE2NiwxMiBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgY3gxOF9idWZmZXIgKmN4MThfZ2V0X2J1ZmZlcihzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIGludCBub25fYmxvY2ssIGludCAqZXJyKQorc3RhdGljIHN0cnVjdCBjeDE4X21kbCAqY3gxOF9nZXRfbWRsKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgaW50IG5vbl9ibG9jaywKKwkJCQkgICAgIGludCAqZXJyKQogewogCXN0cnVjdCBjeDE4ICpjeCA9IHMtPmN4OwogCXN0cnVjdCBjeDE4X3N0cmVhbSAqc192YmkgPSAmY3gtPnN0cmVhbXNbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJXTsKLQlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgY3gxOF9tZGwgKm1kbDsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAogCSplcnIgPSAwOwpAQCAtMTg1LDMyICsxODYsMzMgQEAKIAkJCX0KIAkJCWlmICh0ZXN0X2JpdChDWDE4X0ZfU19JTlRFUk5BTF9VU0UsICZzX3ZiaS0+c19mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQ1gxOF9GX1NfQVBQTF9JTywgJnNfdmJpLT5zX2ZsYWdzKSkgewotCQkJCXdoaWxlICgoYnVmID0gY3gxOF9kZXF1ZXVlKHNfdmJpLCAmc192YmktPnFfZnVsbCkpKSB7CisJCQkJd2hpbGUgKChtZGwgPSBjeDE4X2RlcXVldWUoc192YmksCisJCQkJCQkJICAgJnNfdmJpLT5xX2Z1bGwpKSkgewogCQkJCQkvKiBieXRlc3dhcCBhbmQgcHJvY2VzcyBWQkkgZGF0YSAqLwotCQkJCQljeDE4X3Byb2Nlc3NfdmJpX2RhdGEoY3gsIGJ1ZiwKKwkJCQkJY3gxOF9wcm9jZXNzX3ZiaV9kYXRhKGN4LCBtZGwsCiAJCQkJCQkJICAgICAgc192YmktPnR5cGUpOwotCQkJCQljeDE4X3N0cmVhbV9wdXRfYnVmX2Z3KHNfdmJpLCBidWYpOworCQkJCQljeDE4X3N0cmVhbV9wdXRfbWRsX2Z3KHNfdmJpLCBtZGwpOwogCQkJCX0KIAkJCX0KLQkJCWJ1ZiA9ICZjeC0+dmJpLnNsaWNlZF9tcGVnX2J1ZjsKLQkJCWlmIChidWYtPnJlYWRwb3MgIT0gYnVmLT5ieXRlc3VzZWQpCi0JCQkJcmV0dXJuIGJ1ZjsKKwkJCW1kbCA9ICZjeC0+dmJpLnNsaWNlZF9tcGVnX21kbDsKKwkJCWlmIChtZGwtPnJlYWRwb3MgIT0gbWRsLT5ieXRlc3VzZWQpCisJCQkJcmV0dXJuIG1kbDsKIAkJfQogCiAJCS8qIGRvIHdlIGhhdmUgbmV3IGRhdGE/ICovCi0JCWJ1ZiA9IGN4MThfZGVxdWV1ZShzLCAmcy0+cV9mdWxsKTsKLQkJaWYgKGJ1ZikgewotCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQ1gxOF9GX0JfTkVFRF9CVUZfU1dBUCwKLQkJCQkJCSZidWYtPmJfZmxhZ3MpKQotCQkJCXJldHVybiBidWY7CisJCW1kbCA9IGN4MThfZGVxdWV1ZShzLCAmcy0+cV9mdWxsKTsKKwkJaWYgKG1kbCkgeworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQ1gxOF9GX01fTkVFRF9TV0FQLAorCQkJCQkJJm1kbC0+bV9mbGFncykpCisJCQkJcmV0dXJuIG1kbDsKIAkJCWlmIChzLT50eXBlID09IENYMThfRU5DX1NUUkVBTV9UWVBFX01QRykKIAkJCQkvKiBieXRlc3dhcCBNUEcgZGF0YSAqLwotCQkJCWN4MThfYnVmX3N3YXAoYnVmKTsKKwkJCQljeDE4X21kbF9zd2FwKG1kbCk7CiAJCQllbHNlIHsKIAkJCQkvKiBieXRlc3dhcCBhbmQgcHJvY2VzcyBWQkkgZGF0YSAqLwotCQkJCWN4MThfcHJvY2Vzc192YmlfZGF0YShjeCwgYnVmLCBzLT50eXBlKTsKKwkJCQljeDE4X3Byb2Nlc3NfdmJpX2RhdGEoY3gsIG1kbCwgcy0+dHlwZSk7CiAJCQl9Ci0JCQlyZXR1cm4gYnVmOworCQkJcmV0dXJuIG1kbDsKIAkJfQogCiAJCS8qIHJldHVybiBpZiBlbmQgb2Ygc3RyZWFtICovCkBAIC0yMjksNyArMjMxLDcgQEAKIAkJcHJlcGFyZV90b193YWl0KCZzLT53YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCS8qIE5ldyBidWZmZXJzIG1pZ2h0IGhhdmUgYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgd2Ugd2VyZSBhZGRlZAogCQkgICB0byB0aGUgd2FpdHF1ZXVlICovCi0JCWlmICghYXRvbWljX3JlYWQoJnMtPnFfZnVsbC5idWZmZXJzKSkKKwkJaWYgKCFhdG9taWNfcmVhZCgmcy0+cV9mdWxsLmRlcHRoKSkKIAkJCXNjaGVkdWxlKCk7CiAJCWZpbmlzaF93YWl0KCZzLT53YWl0cSwgJndhaXQpOwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKQEAgLTI0MSwyMSArMjQzLDI4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBjeDE4X3NldHVwX3NsaWNlZF92YmlfYnVmKHN0cnVjdCBjeDE4ICpjeCkKK3N0YXRpYyB2b2lkIGN4MThfc2V0dXBfc2xpY2VkX3ZiaV9tZGwoc3RydWN0IGN4MTggKmN4KQogeworCXN0cnVjdCBjeDE4X21kbCAqbWRsID0gJmN4LT52Ymkuc2xpY2VkX21wZWdfbWRsOworCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmID0gJmN4LT52Ymkuc2xpY2VkX21wZWdfYnVmOwogCWludCBpZHggPSBjeC0+dmJpLmluc2VydGVkX2ZyYW1lICUgQ1gxOF9WQklfRlJBTUVTOwogCi0JY3gtPnZiaS5zbGljZWRfbXBlZ19idWYuYnVmID0gY3gtPnZiaS5zbGljZWRfbXBlZ19kYXRhW2lkeF07Ci0JY3gtPnZiaS5zbGljZWRfbXBlZ19idWYuYnl0ZXN1c2VkID0gY3gtPnZiaS5zbGljZWRfbXBlZ19zaXplW2lkeF07Ci0JY3gtPnZiaS5zbGljZWRfbXBlZ19idWYucmVhZHBvcyA9IDA7CisJYnVmLT5idWYgPSBjeC0+dmJpLnNsaWNlZF9tcGVnX2RhdGFbaWR4XTsKKwlidWYtPmJ5dGVzdXNlZCA9IGN4LT52Ymkuc2xpY2VkX21wZWdfc2l6ZVtpZHhdOworCWJ1Zi0+cmVhZHBvcyA9IDA7CisKKwltZGwtPmN1cnJfYnVmID0gTlVMTDsKKwltZGwtPmJ5dGVzdXNlZCA9IGN4LT52Ymkuc2xpY2VkX21wZWdfc2l6ZVtpZHhdOworCW1kbC0+cmVhZHBvcyA9IDA7CiB9CiAKIHN0YXRpYyBzaXplX3QgY3gxOF9jb3B5X2J1Zl90b191c2VyKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywKLQkJc3RydWN0IGN4MThfYnVmZmVyICpidWYsIGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgdWNvdW50KQorCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IHVjb3VudCwgYm9vbCAqc3RvcCkKIHsKIAlzdHJ1Y3QgY3gxOCAqY3ggPSBzLT5jeDsKIAlzaXplX3QgbGVuID0gYnVmLT5ieXRlc3VzZWQgLSBidWYtPnJlYWRwb3M7CiAKKwkqc3RvcCA9IGZhbHNlOwogCWlmIChsZW4gPiB1Y291bnQpCiAJCWxlbiA9IHVjb3VudDsKIAlpZiAoY3gtPnZiaS5pbnNlcnRfbXBlZyAmJiBzLT50eXBlID09IENYMThfRU5DX1NUUkVBTV9UWVBFX01QRyAmJgpAQCAtMzM1LDcgKzM0NCw4IEBACiAJCQkJLyogV2UgZGVjbGFyZSB3ZSBhY3R1YWxseSBmb3VuZCBhIFByb2dyYW0gUGFjayovCiAJCQkJY3gtPnNlYXJjaF9wYWNrX2hlYWRlciA9IDA7IC8qIGV4cGVjdCB2aWQgUEVTICovCiAJCQkJbGVuID0gKGNoYXIgKilxIC0gc3RhcnQ7Ci0JCQkJY3gxOF9zZXR1cF9zbGljZWRfdmJpX2J1ZihjeCk7CisJCQkJY3gxOF9zZXR1cF9zbGljZWRfdmJpX21kbChjeCk7CisJCQkJKnN0b3AgPSB0cnVlOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0zNTIsNiArMzYyLDYwIEBACiAJcmV0dXJuIGxlbjsKIH0KIAorLyoqCisgKiBsaXN0X2VudHJ5X2lzX3Bhc3RfZW5kIC0gY2hlY2sgaWYgYSBwcmV2aW91cyBsb29wIGN1cnNvciBpcyBvZmYgbGlzdCBlbmQKKyAqIEBwb3M6CXRoZSB0eXBlICogcHJldmlvdXNseSB1c2VkIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBDaGVjayBpZiB0aGUgZW50cnkncyBsaXN0X2hlYWQgaXMgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHRodXMgaXQncyBub3QgYQorICogcmVhbCBlbnRyeSBidXQgd2FzIHRoZSBsb29wIGN1cnNvciB0aGF0IHdhbGtlZCBwYXN0IHRoZSBlbmQKKyAqLworI2RlZmluZSBsaXN0X2VudHJ5X2lzX3Bhc3RfZW5kKHBvcywgaGVhZCwgbWVtYmVyKSBcCisJKCZwb3MtPm1lbWJlciA9PSAoaGVhZCkpCisKK3N0YXRpYyBzaXplX3QgY3gxOF9jb3B5X21kbF90b191c2VyKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywKKwkJc3RydWN0IGN4MThfbWRsICptZGwsIGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgdWNvdW50KQoreworCXNpemVfdCB0b3Rfd3JpdHRlbiA9IDA7CisJaW50IHJjOworCWJvb2wgc3RvcCA9IGZhbHNlOworCisJaWYgKG1kbC0+Y3Vycl9idWYgPT0gTlVMTCkKKwkJbWRsLT5jdXJyX2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJm1kbC0+YnVmX2xpc3QsCisJCQkJCQkgc3RydWN0IGN4MThfYnVmZmVyLCBsaXN0KTsKKworCWlmIChsaXN0X2VudHJ5X2lzX3Bhc3RfZW5kKG1kbC0+Y3Vycl9idWYsICZtZGwtPmJ1Zl9saXN0LCBsaXN0KSkgeworCQkvKgorCQkgKiBGb3Igc29tZSByZWFzb24gd2UndmUgZXhoYXVzdGVkIHRoZSBidWZmZXJzLCBidXQgdGhlIE1ETAorCQkgKiBvYmplY3Qgc3RpbGwgc2FpZCBzb21lIGRhdGEgd2FzIHVucmVhZC4KKwkJICogRml4IHRoYXQgYW5kIGJhaWwgb3V0LgorCQkgKi8KKwkJbWRsLT5yZWFkcG9zID0gbWRsLT5ieXRlc3VzZWQ7CisJCXJldHVybiAwOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbShtZGwtPmN1cnJfYnVmLCAmbWRsLT5idWZfbGlzdCwgbGlzdCkgeworCisJCWlmIChtZGwtPmN1cnJfYnVmLT5yZWFkcG9zID49IG1kbC0+Y3Vycl9idWYtPmJ5dGVzdXNlZCkKKwkJCWNvbnRpbnVlOworCisJCXJjID0gY3gxOF9jb3B5X2J1Zl90b191c2VyKHMsIG1kbC0+Y3Vycl9idWYsIHVidWYgKyB0b3Rfd3JpdHRlbiwKKwkJCQkJICAgdWNvdW50IC0gdG90X3dyaXR0ZW4sICZzdG9wKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJbWRsLT5yZWFkcG9zICs9IHJjOworCQl0b3Rfd3JpdHRlbiArPSByYzsKKworCQlpZiAoc3RvcCB8fAkvKiBGb3JjZWQgc3RvcHBpbmcgcG9pbnQgZm9yIFZCSSBpbnNlcnRpb24gKi8KKwkJICAgIHRvdF93cml0dGVuID49IHVjb3VudCB8fAkvKiBSZWFkZXIgcmVxdWVzdCBzdGF0aXNmaWVkICovCisJCSAgICBtZGwtPmN1cnJfYnVmLT5yZWFkcG9zIDwgbWRsLT5jdXJyX2J1Zi0+Ynl0ZXN1c2VkIHx8CisJCSAgICBtZGwtPnJlYWRwb3MgPj0gbWRsLT5ieXRlc3VzZWQpIC8qIE1ETCBidWZmZXJzIGRyYWluZWQgKi8KKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gdG90X3dyaXR0ZW47Cit9CisKIHN0YXRpYyBzc2l6ZV90IGN4MThfcmVhZChzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIGNoYXIgX191c2VyICp1YnVmLAogCQlzaXplX3QgdG90X2NvdW50LCBpbnQgbm9uX2Jsb2NrKQogewpAQCAtMzczLDEyICs0MzcsMTIgQEAKIAkJc2luZ2xlX2ZyYW1lID0gMTsKIAogCWZvciAoOzspIHsKLQkJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CisJCXN0cnVjdCBjeDE4X21kbCAqbWRsOwogCQlpbnQgcmM7CiAKLQkJYnVmID0gY3gxOF9nZXRfYnVmZmVyKHMsIG5vbl9ibG9jaywgJnJjKTsKKwkJbWRsID0gY3gxOF9nZXRfbWRsKHMsIG5vbl9ibG9jaywgJnJjKTsKIAkJLyogaWYgdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUuLi4gKi8KLQkJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCWlmIChtZGwgPT0gTlVMTCkgewogCQkJLyogaWYgd2UgZ290IGRhdGEsIHRoZW4gcmV0dXJuIHRoYXQgcmVnYXJkbGVzcyAqLwogCQkJaWYgKHRvdF93cml0dGVuKQogCQkJCWJyZWFrOwpAQCAtMzkyLDIwICs0NTYsMjAgQEAKIAkJCXJldHVybiByYzsKIAkJfQogCi0JCXJjID0gY3gxOF9jb3B5X2J1Zl90b191c2VyKHMsIGJ1ZiwgdWJ1ZiArIHRvdF93cml0dGVuLAorCQlyYyA9IGN4MThfY29weV9tZGxfdG9fdXNlcihzLCBtZGwsIHVidWYgKyB0b3Rfd3JpdHRlbiwKIAkJCQl0b3RfY291bnQgLSB0b3Rfd3JpdHRlbik7CiAKLQkJaWYgKGJ1ZiAhPSAmY3gtPnZiaS5zbGljZWRfbXBlZ19idWYpIHsKLQkJCWlmIChidWYtPnJlYWRwb3MgPT0gYnVmLT5ieXRlc3VzZWQpCi0JCQkJY3gxOF9zdHJlYW1fcHV0X2J1Zl9mdyhzLCBidWYpOworCQlpZiAobWRsICE9ICZjeC0+dmJpLnNsaWNlZF9tcGVnX21kbCkgeworCQkJaWYgKG1kbC0+cmVhZHBvcyA9PSBtZGwtPmJ5dGVzdXNlZCkKKwkJCQljeDE4X3N0cmVhbV9wdXRfbWRsX2Z3KHMsIG1kbCk7CiAJCQllbHNlCi0JCQkJY3gxOF9wdXNoKHMsIGJ1ZiwgJnMtPnFfZnVsbCk7Ci0JCX0gZWxzZSBpZiAoYnVmLT5yZWFkcG9zID09IGJ1Zi0+Ynl0ZXN1c2VkKSB7CisJCQkJY3gxOF9wdXNoKHMsIG1kbCwgJnMtPnFfZnVsbCk7CisJCX0gZWxzZSBpZiAobWRsLT5yZWFkcG9zID09IG1kbC0+Ynl0ZXN1c2VkKSB7CiAJCQlpbnQgaWR4ID0gY3gtPnZiaS5pbnNlcnRlZF9mcmFtZSAlIENYMThfVkJJX0ZSQU1FUzsKIAogCQkJY3gtPnZiaS5zbGljZWRfbXBlZ19zaXplW2lkeF0gPSAwOwogCQkJY3gtPnZiaS5pbnNlcnRlZF9mcmFtZSsrOwotCQkJY3gtPnZiaV9kYXRhX2luc2VydGVkICs9IGJ1Zi0+Ynl0ZXN1c2VkOworCQkJY3gtPnZiaV9kYXRhX2luc2VydGVkICs9IG1kbC0+Ynl0ZXN1c2VkOwogCQl9CiAJCWlmIChyYyA8IDApCiAJCQlyZXR1cm4gcmM7CkBAIC01NDMsNyArNjA3LDcgQEAKIAlDWDE4X0RFQlVHX0hJX0ZJTEUoIkVuY29kZXIgcG9sbFxuIik7CiAJcG9sbF93YWl0KGZpbHAsICZzLT53YWl0cSwgd2FpdCk7CiAKLQlpZiAoYXRvbWljX3JlYWQoJnMtPnFfZnVsbC5idWZmZXJzKSkKKwlpZiAoYXRvbWljX3JlYWQoJnMtPnFfZnVsbC5kZXB0aCkpCiAJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogCWlmIChlb2YpCiAJCXJldHVybiBQT0xMSFVQOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pMmMuYwppbmRleCAyNDc3NDYxLi5lZWNmMjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pMmMuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgImN4MTgtZ3Bpby5oIgogI2luY2x1ZGUgImN4MTgtaTJjLmgiCiAjaW5jbHVkZSAiY3gxOC1pcnEuaCIKLSNpbmNsdWRlIDxtZWRpYS9pci1rYmQtaTJjLmg+CiAKICNkZWZpbmUgQ1gxOF9SRUdfSTJDXzFfV1IgICAweGYxNTAwMAogI2RlZmluZSBDWDE4X1JFR19JMkNfMV9SRCAgIDB4ZjE1MDA4CkBAIC05NywxNyArOTYsMTEgQEAKIAkiaXJfcnhfejhmMDgxMV9oYXVwIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgSVJfaTJjX2luaXRfZGF0YSB6OGYwODExX2lyX2luaXRfZGF0YSA9IHsKLQkuaXJfY29kZXMgPSAmaXJfY29kZXNfaGF1cHBhdWdlX25ld190YWJsZSwKLQkuaW50ZXJuYWxfZ2V0X2tleV9mdW5jID0gSVJfS0JEX0dFVF9LRVlfSEFVUF9YVlIsCi0JLnR5cGUgPSBJUl9UWVBFX1JDNSwKLQkubmFtZSA9ICJDWDIzNDE4IFo4RjA4MTEgSGF1cHBhdWdlIiwKLX07Ci0KLXN0YXRpYyBpbnQgY3gxOF9pMmNfbmV3X2lyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTMyIGh3LCBjb25zdCBjaGFyICp0eXBlLAotCQkJICAgdTggYWRkcikKK3N0YXRpYyBpbnQgY3gxOF9pMmNfbmV3X2lyKHN0cnVjdCBjeDE4ICpjeCwgc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1MzIgaHcsCisJCQkgICBjb25zdCBjaGFyICp0eXBlLCB1OCBhZGRyKQogewogCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCXN0cnVjdCBJUl9pMmNfaW5pdF9kYXRhICppbml0X2RhdGEgPSAmY3gtPmlyX2kyY19pbml0X2RhdGE7CiAJdW5zaWduZWQgc2hvcnQgYWRkcl9saXN0WzJdID0geyBhZGRyLCBJMkNfQ0xJRU5UX0VORCB9OwogCiAJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CkBAIC0xMTYsOSArMTA5LDExIEBACiAJLyogT3VyIGRlZmF1bHQgaW5mb3JtYXRpb24gZm9yIGlyLWtiZC1pMmMuYyB0byB1c2UgKi8KIAlzd2l0Y2ggKGh3KSB7CiAJY2FzZSBDWDE4X0hXX1o4RjA4MTFfSVJfUlhfSEFVUDoKLQkJaW5mby5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikgJno4ZjA4MTFfaXJfaW5pdF9kYXRhOwotCQlicmVhazsKLQlkZWZhdWx0OgorCQlpbml0X2RhdGEtPmlyX2NvZGVzID0gJmlyX2NvZGVzX2hhdXBwYXVnZV9uZXdfdGFibGU7CisJCWluaXRfZGF0YS0+aW50ZXJuYWxfZ2V0X2tleV9mdW5jID0gSVJfS0JEX0dFVF9LRVlfSEFVUF9YVlI7CisJCWluaXRfZGF0YS0+dHlwZSA9IElSX1RZUEVfUkM1OworCQlpbml0X2RhdGEtPm5hbWUgPSBjeC0+Y2FyZF9uYW1lOworCQlpbmZvLnBsYXRmb3JtX2RhdGEgPSBpbml0X2RhdGE7CiAJCWJyZWFrOwogCX0KIApAQCAtMTU0LDggKzE0OSw4IEBACiAJCXJldHVybiBzZCAhPSBOVUxMID8gMCA6IC0xOwogCX0KIAotCWlmIChodyAmIENYMThfSFdfWjhGMDgxMV9JUl9IQVVQKQotCQlyZXR1cm4gY3gxOF9pMmNfbmV3X2lyKGFkYXAsIGh3LCB0eXBlLCBod19hZGRyc1tpZHhdKTsKKwlpZiAoaHcgJiBDWDE4X0hXX0lSX0FOWSkKKwkJcmV0dXJuIGN4MThfaTJjX25ld19pcihjeCwgYWRhcCwgaHcsIHR5cGUsIGh3X2FkZHJzW2lkeF0pOwogCiAJLyogSXMgaXQgbm90IGFuIEkyQyBkZXZpY2Ugb3Igb25lIHdlIGRvIG5vdCB3aXNoIHRvIHJlZ2lzdGVyPyAqLwogCWlmICghaHdfYWRkcnNbaWR4XSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCmluZGV4IGZjNzZlNGQuLjNlNGZjMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYwpAQCAtOTEwLDcgKzkxMCw4IEBACiAJCQljb250aW51ZTsKIAkJQ1gxOF9JTkZPKCJTdHJlYW0gJXM6IHN0YXR1cyAweCUwNGx4LCAlZCUlIG9mICVkIEtpQiAoJWQgYnVmZmVycykgaW4gdXNlXG4iLAogCQkJICBzLT5uYW1lLCBzLT5zX2ZsYWdzLAotCQkJICBhdG9taWNfcmVhZCgmcy0+cV9mdWxsLmJ1ZmZlcnMpICogMTAwIC8gcy0+YnVmZmVycywKKwkJCSAgYXRvbWljX3JlYWQoJnMtPnFfZnVsbC5kZXB0aCkgKiBzLT5idWZzX3Blcl9tZGwgKiAxMDAKKwkJCSAgIC8gcy0+YnVmZmVycywKIAkJCSAgKHMtPmJ1ZmZlcnMgKiBzLT5idWZfc2l6ZSkgLyAxMDI0LCBzLT5idWZmZXJzKTsKIAl9CiAJQ1gxOF9JTkZPKCJSZWFkIE1QRUcvVkJJOiAlbGxkLyVsbGQgYnl0ZXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmMKaW5kZXggYWZlNDZjMy4uZjIzMWRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYwpAQCAtMTMxLDEzICsxMzEsMzkgQEAKICAqIEZ1bmN0aW9ucyB0aGF0IHJ1biBpbiBhIHdvcmtfcXVldWUgd29yayBoYW5kbGluZyBjb250ZXh0CiAgKi8KIAorc3RhdGljIHZvaWQgY3gxOF9tZGxfc2VuZF90b19kdmIoc3RydWN0IGN4MThfc3RyZWFtICpzLCBzdHJ1Y3QgY3gxOF9tZGwgKm1kbCkKK3sKKwlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKworCWlmICghcy0+ZHZiLmVuYWJsZWQgfHwgbWRsLT5ieXRlc3VzZWQgPT0gMCkKKwkJcmV0dXJuOworCisJLyogV2UgaWdub3JlIG1kbCBhbmQgYnVmIHJlYWRwb3MgYWNjb3VudGluZyBoZXJlIC0gaXQgZG9lc24ndCBtYXR0ZXIgKi8KKworCS8qIFRoZSBsaWtlbHkgY2FzZSAqLworCWlmIChsaXN0X2lzX3Npbmd1bGFyKCZtZGwtPmJ1Zl9saXN0KSkgeworCQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtZGwtPmJ1Zl9saXN0LCBzdHJ1Y3QgY3gxOF9idWZmZXIsCisJCQkJICAgICAgIGxpc3QpOworCQlpZiAoYnVmLT5ieXRlc3VzZWQpCisJCQlkdmJfZG14X3N3ZmlsdGVyKCZzLT5kdmIuZGVtdXgsCisJCQkJCSBidWYtPmJ1ZiwgYnVmLT5ieXRlc3VzZWQpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShidWYsICZtZGwtPmJ1Zl9saXN0LCBsaXN0KSB7CisJCWlmIChidWYtPmJ5dGVzdXNlZCA9PSAwKQorCQkJYnJlYWs7CisJCWR2Yl9kbXhfc3dmaWx0ZXIoJnMtPmR2Yi5kZW11eCwgYnVmLT5idWYsIGJ1Zi0+Ynl0ZXN1c2VkKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGVwdV9kbWFfZG9uZShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X2luX3dvcmtfb3JkZXIgKm9yZGVyKQogewogCXUzMiBoYW5kbGUsIG1kbF9hY2tfY291bnQsIGlkOwogCXN0cnVjdCBjeDE4X21haWxib3ggKm1iOwogCXN0cnVjdCBjeDE4X21kbF9hY2sgKm1kbF9hY2s7CiAJc3RydWN0IGN4MThfc3RyZWFtICpzOwotCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmOworCXN0cnVjdCBjeDE4X21kbCAqbWRsOwogCWludCBpOwogCiAJbWIgPSAmb3JkZXItPm1iOwpAQCAtMTU4LDcgKzE4NCw3IEBACiAJCWlkID0gbWRsX2Fjay0+aWQ7CiAJCS8qCiAJCSAqIFNpbXBsZSBpbnRlZ3JpdHkgY2hlY2sgZm9yIHByb2Nlc3NpbmcgYSBzdGFsZSAoYW5kIHBvc3NpYmx5Ci0JCSAqIGluY29uc2lzdGVudCBtYWlsYm94KTogbWFrZSBzdXJlIHRoZSBidWZmZXIgaWQgaXMgaW4gdGhlCisJCSAqIGluY29uc2lzdGVudCBtYWlsYm94KTogbWFrZSBzdXJlIHRoZSBNREwgaWQgaXMgaW4gdGhlCiAJCSAqIHZhbGlkIHJhbmdlIGZvciB0aGUgc3RyZWFtLgogCQkgKgogCQkgKiBXZSBnbyB0aHJvdWdoIHRoZSB0cm91YmxlIG9mIGRlYWxpbmcgd2l0aCBzdGFsZSBtYWlsYm94ZXMKQEAgLTE2OSw0NCArMTk1LDQyIEBACiAJCSAqIFRoZXJlIGFyZSBvY2Nhc2lvbnMgd2hlbiB3ZSBnZXQgYSBoYWxmIGNoYW5nZWQgbWFpbGJveCwKIAkJICogd2hpY2ggdGhpcyBjaGVjayBjYXRjaGVzIGZvciBhIGhhbmRsZSAmIGlkIG1pc21hdGNoLiAgSWYgdGhlCiAJCSAqIGhhbmRsZSBhbmQgaWQgZG8gY29ycmVzcG9uZCwgdGhlIHdvcnN0IGNhc2UgaXMgdGhhdCB3ZQotCQkgKiBjb21wbGV0ZWx5IGxvc3QgdGhlIG9sZCBidWZmZXIsIGJ1dCBwaWNrIHVwIHRoZSBuZXcgYnVmZmVyCisJCSAqIGNvbXBsZXRlbHkgbG9zdCB0aGUgb2xkIE1ETCwgYnV0IHBpY2sgdXAgdGhlIG5ldyBNREwKIAkJICogZWFybHkgKGJ1dCB0aGUgbmV3IG1kbF9hY2sgaXMgZ3VhcmFudGVlZCB0byBiZSBnb29kIGluIHRoaXMKIAkJICogY2FzZSBhcyB0aGUgZmlybXdhcmUgd291bGRuJ3QgcG9pbnQgdXMgdG8gYSBuZXcgbWRsX2FjayB1bnRpbAogCQkgKiBpdCdzIGZpbGxlZCBpbikuCiAJCSAqCi0JCSAqIGN4MThfcXVldWVfZ2V0IGJ1ZigpIHdpbGwgZGV0ZWN0IHRoZSBsb3N0IGJ1ZmZlcnMKKwkJICogY3gxOF9xdWV1ZV9nZXRfbWRsKCkgd2lsbCBkZXRlY3QgdGhlIGxvc3QgTURMcwogCQkgKiBhbmQgc2VuZCB0aGVtIGJhY2sgdG8gcV9mcmVlIGZvciBmdyByb3RhdGlvbiBldmVudHVhbGx5LgogCQkgKi8KIAkJaWYgKChvcmRlci0+ZmxhZ3MgJiBDWDE4X0ZfRVdPX01CX1NUQUxFX1VQT05fUkVDRUlQVCkgJiYKLQkJICAgICEoaWQgPj0gcy0+bWRsX29mZnNldCAmJgotCQkgICAgICBpZCA8IChzLT5tZGxfb2Zmc2V0ICsgcy0+YnVmZmVycykpKSB7CisJCSAgICAhKGlkID49IHMtPm1kbF9iYXNlX2lkeCAmJgorCQkgICAgICBpZCA8IChzLT5tZGxfYmFzZV9pZHggKyBzLT5idWZmZXJzKSkpIHsKIAkJCUNYMThfV0FSTigiRmVsbCBiZWhpbmQhIElnbm9yaW5nIHN0YWxlIG1haWxib3ggd2l0aCAiCi0JCQkJICAiIGluY29uc2lzdGVudCBkYXRhLiBMb3N0IGJ1ZmZlciBmb3IgbWFpbGJveCAiCisJCQkJICAiIGluY29uc2lzdGVudCBkYXRhLiBMb3N0IE1ETCBmb3IgbWFpbGJveCAiCiAJCQkJICAic2VxIG5vICVkXG4iLCBtYi0+cmVxdWVzdCk7CiAJCQlicmVhazsKIAkJfQotCQlidWYgPSBjeDE4X3F1ZXVlX2dldF9idWYocywgaWQsIG1kbF9hY2stPmRhdGFfdXNlZCk7CisJCW1kbCA9IGN4MThfcXVldWVfZ2V0X21kbChzLCBpZCwgbWRsX2Fjay0+ZGF0YV91c2VkKTsKIAotCQlDWDE4X0RFQlVHX0hJX0RNQSgiRE1BIERPTkUgZm9yICVzIChidWZmZXIgJWQpXG4iLCBzLT5uYW1lLCBpZCk7Ci0JCWlmIChidWYgPT0gTlVMTCkgewotCQkJQ1gxOF9XQVJOKCJDb3VsZCBub3QgZmluZCBidWYgJWQgZm9yIHN0cmVhbSAlc1xuIiwKKwkJQ1gxOF9ERUJVR19ISV9ETUEoIkRNQSBET05FIGZvciAlcyAoTURMICVkKVxuIiwgcy0+bmFtZSwgaWQpOworCQlpZiAobWRsID09IE5VTEwpIHsKKwkJCUNYMThfV0FSTigiQ291bGQgbm90IGZpbmQgTURMICVkIGZvciBzdHJlYW0gJXNcbiIsCiAJCQkJICBpZCwgcy0+bmFtZSk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCUNYMThfREVCVUdfSElfRE1BKCIlcyByZWN2IGJ5dGVzdXNlZCA9ICVkXG4iLAotCQkJCSAgcy0+bmFtZSwgYnVmLT5ieXRlc3VzZWQpOworCQkJCSAgcy0+bmFtZSwgbWRsLT5ieXRlc3VzZWQpOwogCiAJCWlmIChzLT50eXBlICE9IENYMThfRU5DX1NUUkVBTV9UWVBFX1RTKQotCQkJY3gxOF9lbnF1ZXVlKHMsIGJ1ZiwgJnMtPnFfZnVsbCk7CisJCQljeDE4X2VucXVldWUocywgbWRsLCAmcy0+cV9mdWxsKTsKIAkJZWxzZSB7Ci0JCQlpZiAocy0+ZHZiLmVuYWJsZWQpCi0JCQkJZHZiX2RteF9zd2ZpbHRlcigmcy0+ZHZiLmRlbXV4LCBidWYtPmJ1ZiwKLQkJCQkJCSBidWYtPmJ5dGVzdXNlZCk7Ci0JCQljeDE4X2VucXVldWUocywgYnVmLCAmcy0+cV9mcmVlKTsKKwkJCWN4MThfbWRsX3NlbmRfdG9fZHZiKHMsIG1kbCk7CisJCQljeDE4X2VucXVldWUocywgbWRsLCAmcy0+cV9mcmVlKTsKIAkJfQogCX0KLQkvKiBQdXQgYXMgbWFueSBidWZmZXJzIGFzIHBvc3NpYmxlIGJhY2sgaW50byBmdyB1c2UgKi8KKwkvKiBQdXQgYXMgbWFueSBNRExzIGFzIHBvc3NpYmxlIGJhY2sgaW50byBmdyB1c2UgKi8KIAljeDE4X3N0cmVhbV9sb2FkX2Z3X3F1ZXVlKHMpOwogCiAJd2FrZV91cCgmY3gtPmRtYV93YWl0cSk7CkBAIC02MTYsNyArNjQwLDcgQEAKIAogCS8qCiAJICogV2FpdCBmb3IgWFBVIHRvIHBlcmZvcm0gZXh0cmEgYWN0aW9ucyBmb3IgdGhlIGNhbGxlciBpbiBzb21lIGNhc2VzLgotCSAqIGUuZy4gQ1gxOF9DUFVfREVfUkVMRUFTRV9NREwgd2lsbCBjYXVzZSB0aGUgQ1BVIHRvIHNlbmQgYWxsIGJ1ZmZlcnMKKwkgKiBlLmcuIENYMThfQ1BVX0RFX1JFTEVBU0VfTURMIHdpbGwgY2F1c2UgdGhlIENQVSB0byBzZW5kIGFsbCBNRExzCiAJICogYmFjayBpbiBhIGJ1cnN0IHNob3J0bHkgdGhlcmVhZnRlcgogCSAqLwogCWlmIChpbmZvLT5mbGFncyAmIEFQSV9TTE9XKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5oCmluZGV4IGUyM2FhYWMuLjMzYTM0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmgKQEAgLTM5LDE0ICszOSwxNCBAQAogc3RydWN0IGN4MTg7CiAKIC8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IENQVSB0byBwcm92aWRlIGNvbXBsZXRlZCBidWZmZXJzIGluZm9ybWF0aW9uCi0gKiBJdHMgc3RydWN0dXJlIGlzIGRpY3RyYXRlZCBieSB0aGUgbGF5b3V0IG9mIHRoZSBTQ0IsIHJlcXVpcmVkIGJ5IHRoZQotICogZmlybXdhcmUsIGJ1dCBpdHMgZGVmaW50aW9uIG5lZWRzIHRvIGJlIGhlcmUsIGluc3RlYWQgb2YgaW4gY3gxOC1zY2IuaCwKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgQ1BVIHRvIHByb3ZpZGUgY29tcGxldGVkIE1ETCAmIGJ1ZmZlcnMgaW5mb3JtYXRpb24uCisgKiBJdHMgc3RydWN0dXJlIGlzIGRpY3RhdGVkIGJ5IHRoZSBsYXlvdXQgb2YgdGhlIFNDQiwgcmVxdWlyZWQgYnkgdGhlCisgKiBmaXJtd2FyZSwgYnV0IGl0cyBkZWZpbml0aW9uIG5lZWRzIHRvIGJlIGhlcmUsIGluc3RlYWQgb2YgaW4gY3gxOC1zY2IuaCwKICAqIGZvciBtYWlsYm94IHdvcmsgb3JkZXIgc2NoZWR1bGluZwogICovCiBzdHJ1Y3QgY3gxOF9tZGxfYWNrIHsKICAgICB1MzIgaWQ7ICAgICAgICAvKiBJRCBvZiBhIGNvbXBsZXRlZCBNREwgKi8KLSAgICB1MzIgZGF0YV91c2VkOyAvKiBUb3RhbCBkYXRhIGZpbGxlZCBpbiB0aGUgTURMIGZvciBidWZmZXIgJ2lkJyAqLworICAgIHUzMiBkYXRhX3VzZWQ7IC8qIFRvdGFsIGRhdGEgZmlsbGVkIGluIHRoZSBNREwgd2l0aCAnaWQnICovCiB9OwogCiAvKiBUaGUgY3gxOF9tYWlsYm94IHN0cnVjdCBpcyB0aGUgbWFpbGJveCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgcGFzc2luZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtcXVldWUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXF1ZXVlLmMKaW5kZXggZmExZWQ3OC4uNjMzMDQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtcXVldWUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiY3gxOC1xdWV1ZS5oIgogI2luY2x1ZGUgImN4MTgtc3RyZWFtcy5oIgogI2luY2x1ZGUgImN4MTgtc2NiLmgiCisjaW5jbHVkZSAiY3gxOC1pby5oIgogCiB2b2lkIGN4MThfYnVmX3N3YXAoc3RydWN0IGN4MThfYnVmZmVyICpidWYpCiB7CkBAIC0zNSwxNTEgKzM2LDMxMiBAQAogCQlzd2FiMzJzKCh1MzIgKikoYnVmLT5idWYgKyBpKSk7CiB9CiAKK3ZvaWQgX2N4MThfbWRsX3N3YXAoc3RydWN0IGN4MThfbWRsICptZGwpCit7CisJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1ZiwgJm1kbC0+YnVmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGJ1Zi0+Ynl0ZXN1c2VkID09IDApCisJCQlicmVhazsKKwkJY3gxOF9idWZfc3dhcChidWYpOworCX0KK30KKwogdm9pZCBjeDE4X3F1ZXVlX2luaXQoc3RydWN0IGN4MThfcXVldWUgKnEpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPmxpc3QpOwotCWF0b21pY19zZXQoJnEtPmJ1ZmZlcnMsIDApOworCWF0b21pY19zZXQoJnEtPmRlcHRoLCAwKTsKIAlxLT5ieXRlc3VzZWQgPSAwOwogfQogCi1zdHJ1Y3QgY3gxOF9xdWV1ZSAqX2N4MThfZW5xdWV1ZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAorc3RydWN0IGN4MThfcXVldWUgKl9jeDE4X2VucXVldWUoc3RydWN0IGN4MThfc3RyZWFtICpzLCBzdHJ1Y3QgY3gxOF9tZGwgKm1kbCwKIAkJCQkgc3RydWN0IGN4MThfcXVldWUgKnEsIGludCB0b19mcm9udCkKIHsKLQkvKiBjbGVhciB0aGUgYnVmZmVyIGlmIGl0IGlzIG5vdCB0byBiZSBlbnF1ZXVlZCB0byB0aGUgZnVsbCBxdWV1ZSAqLworCS8qIGNsZWFyIHRoZSBtZGwgaWYgaXQgaXMgbm90IHRvIGJlIGVucXVldWVkIHRvIHRoZSBmdWxsIHF1ZXVlICovCiAJaWYgKHEgIT0gJnMtPnFfZnVsbCkgewotCQlidWYtPmJ5dGVzdXNlZCA9IDA7Ci0JCWJ1Zi0+cmVhZHBvcyA9IDA7Ci0JCWJ1Zi0+Yl9mbGFncyA9IDA7Ci0JCWJ1Zi0+c2tpcHBlZCA9IDA7CisJCW1kbC0+Ynl0ZXN1c2VkID0gMDsKKwkJbWRsLT5yZWFkcG9zID0gMDsKKwkJbWRsLT5tX2ZsYWdzID0gMDsKKwkJbWRsLT5za2lwcGVkID0gMDsKKwkJbWRsLT5jdXJyX2J1ZiA9IE5VTEw7CiAJfQogCiAJLyogcV9idXN5IGlzIHJlc3RyaWN0ZWQgdG8gYSBtYXggYnVmZmVyIGNvdW50IGltcG9zZWQgYnkgZmlybXdhcmUgKi8KIAlpZiAocSA9PSAmcy0+cV9idXN5ICYmCi0JICAgIGF0b21pY19yZWFkKCZxLT5idWZmZXJzKSA+PSBDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0pCisJICAgIGF0b21pY19yZWFkKCZxLT5kZXB0aCkgPj0gQ1gxOF9NQVhfRldfTURMU19QRVJfU1RSRUFNKQogCQlxID0gJnMtPnFfZnJlZTsKIAogCXNwaW5fbG9jaygmcS0+bG9jayk7CiAKIAlpZiAodG9fZnJvbnQpCi0JCWxpc3RfYWRkKCZidWYtPmxpc3QsICZxLT5saXN0KTsgLyogTElGTyAqLworCQlsaXN0X2FkZCgmbWRsLT5saXN0LCAmcS0+bGlzdCk7IC8qIExJRk8gKi8KIAllbHNlCi0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnEtPmxpc3QpOyAvKiBGSUZPICovCi0JcS0+Ynl0ZXN1c2VkICs9IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOwotCWF0b21pY19pbmMoJnEtPmJ1ZmZlcnMpOworCQlsaXN0X2FkZF90YWlsKCZtZGwtPmxpc3QsICZxLT5saXN0KTsgLyogRklGTyAqLworCXEtPmJ5dGVzdXNlZCArPSBtZGwtPmJ5dGVzdXNlZCAtIG1kbC0+cmVhZHBvczsKKwlhdG9taWNfaW5jKCZxLT5kZXB0aCk7CiAKIAlzcGluX3VubG9jaygmcS0+bG9jayk7CiAJcmV0dXJuIHE7CiB9CiAKLXN0cnVjdCBjeDE4X2J1ZmZlciAqY3gxOF9kZXF1ZXVlKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgc3RydWN0IGN4MThfcXVldWUgKnEpCitzdHJ1Y3QgY3gxOF9tZGwgKmN4MThfZGVxdWV1ZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X3F1ZXVlICpxKQogewotCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgY3gxOF9tZGwgKm1kbCA9IE5VTEw7CiAKIAlzcGluX2xvY2soJnEtPmxvY2spOwogCWlmICghbGlzdF9lbXB0eSgmcS0+bGlzdCkpIHsKLQkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcS0+bGlzdCwgc3RydWN0IGN4MThfYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmYnVmLT5saXN0KTsKLQkJcS0+Ynl0ZXN1c2VkIC09IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOwotCQlidWYtPnNraXBwZWQgPSAwOwotCQlhdG9taWNfZGVjKCZxLT5idWZmZXJzKTsKKwkJbWRsID0gbGlzdF9maXJzdF9lbnRyeSgmcS0+bGlzdCwgc3RydWN0IGN4MThfbWRsLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmbWRsLT5saXN0KTsKKwkJcS0+Ynl0ZXN1c2VkIC09IG1kbC0+Ynl0ZXN1c2VkIC0gbWRsLT5yZWFkcG9zOworCQltZGwtPnNraXBwZWQgPSAwOworCQlhdG9taWNfZGVjKCZxLT5kZXB0aCk7CiAJfQogCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKLQlyZXR1cm4gYnVmOworCXJldHVybiBtZGw7CiB9CiAKLXN0cnVjdCBjeDE4X2J1ZmZlciAqY3gxOF9xdWV1ZV9nZXRfYnVmKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgdTMyIGlkLAorc3RhdGljIHZvaWQgX2N4MThfbWRsX3VwZGF0ZV9idWZzX2Zvcl9jcHUoc3RydWN0IGN4MThfc3RyZWFtICpzLAorCQkJCQkgIHN0cnVjdCBjeDE4X21kbCAqbWRsKQoreworCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmOworCXUzMiBidWZfc2l6ZSA9IHMtPmJ1Zl9zaXplOworCXUzMiBieXRlc3VzZWQgPSBtZGwtPmJ5dGVzdXNlZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVmLCAmbWRsLT5idWZfbGlzdCwgbGlzdCkgeworCQlidWYtPnJlYWRwb3MgPSAwOworCQlpZiAoYnl0ZXN1c2VkID49IGJ1Zl9zaXplKSB7CisJCQlidWYtPmJ5dGVzdXNlZCA9IGJ1Zl9zaXplOworCQkJYnl0ZXN1c2VkIC09IGJ1Zl9zaXplOworCQl9IGVsc2UgeworCQkJYnVmLT5ieXRlc3VzZWQgPSBieXRlc3VzZWQ7CisJCQlieXRlc3VzZWQgPSAwOworCQl9CisJCWN4MThfYnVmX3N5bmNfZm9yX2NwdShzLCBidWYpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGN4MThfbWRsX3VwZGF0ZV9idWZzX2Zvcl9jcHUoc3RydWN0IGN4MThfc3RyZWFtICpzLAorCQkJCQkJc3RydWN0IGN4MThfbWRsICptZGwpCit7CisJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CisKKwlpZiAobGlzdF9pc19zaW5ndWxhcigmbWRsLT5idWZfbGlzdCkpIHsKKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmbWRsLT5idWZfbGlzdCwgc3RydWN0IGN4MThfYnVmZmVyLAorCQkJCSAgICAgICBsaXN0KTsKKwkJYnVmLT5ieXRlc3VzZWQgPSBtZGwtPmJ5dGVzdXNlZDsKKwkJYnVmLT5yZWFkcG9zID0gMDsKKwkJY3gxOF9idWZfc3luY19mb3JfY3B1KHMsIGJ1Zik7CisJfSBlbHNlIHsKKwkJX2N4MThfbWRsX3VwZGF0ZV9idWZzX2Zvcl9jcHUocywgbWRsKTsKKwl9Cit9CisKK3N0cnVjdCBjeDE4X21kbCAqY3gxOF9xdWV1ZV9nZXRfbWRsKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgdTMyIGlkLAogCXUzMiBieXRlc3VzZWQpCiB7CiAJc3RydWN0IGN4MTggKmN4ID0gcy0+Y3g7Ci0Jc3RydWN0IGN4MThfYnVmZmVyICpidWY7Ci0Jc3RydWN0IGN4MThfYnVmZmVyICp0bXA7Ci0Jc3RydWN0IGN4MThfYnVmZmVyICpyZXQgPSBOVUxMOworCXN0cnVjdCBjeDE4X21kbCAqbWRsOworCXN0cnVjdCBjeDE4X21kbCAqdG1wOworCXN0cnVjdCBjeDE4X21kbCAqcmV0ID0gTlVMTDsKIAlMSVNUX0hFQUQoc3dlZXBfdXApOwogCiAJLyoKIAkgKiBXZSBkb24ndCBoYXZlIHRvIGFjcXVpcmUgbXVsdGlwbGUgcSBsb2NrcyBoZXJlLCBiZWNhdXNlIHdlIGFyZQogCSAqIHNlcmlhbGl6ZWQgYnkgdGhlIHNpbmdsZSB0aHJlYWRlZCB3b3JrIGhhbmRsZXIuCi0JICogQnVmZmVycyBmcm9tIHRoZSBmaXJtd2FyZSB3aWxsIHRodXMgcmVtYWluIGluIG9yZGVyIGFzCisJICogTURMcyBmcm9tIHRoZSBmaXJtd2FyZSB3aWxsIHRodXMgcmVtYWluIGluIG9yZGVyIGFzCiAJICogdGhleSBhcmUgbW92ZWQgZnJvbSBxX2J1c3kgdG8gcV9mdWxsIG9yIHRvIHRoZSBkdmIgcmluZyBidWZmZXIuCiAJICovCiAJc3Bpbl9sb2NrKCZzLT5xX2J1c3kubG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1ZiwgdG1wLCAmcy0+cV9idXN5Lmxpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWRsLCB0bXAsICZzLT5xX2J1c3kubGlzdCwgbGlzdCkgewogCQkvKgogCQkgKiBXZSBzaG91bGQgZmluZCB3aGF0IHRoZSBmaXJtd2FyZSB0b2xkIHVzIGlzIGRvbmUsCiAJCSAqIHJpZ2h0IGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUuICBJZiB3ZSBkb24ndCwgd2UgbGlrZWx5IGhhdmUKLQkJICogbWlzc2VkIGEgYnVmZmVyIGRvbmUgbWVzc2FnZSBmcm9tIHRoZSBmaXJtd2FyZS4KLQkJICogT25jZSB3ZSBza2lwIGEgYnVmZmVyIHJlcGVhdGVkbHksIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mCisJCSAqIG1pc3NlZCBhbiBtZGwgZG9uZSBtZXNzYWdlIGZyb20gdGhlIGZpcm13YXJlLgorCQkgKiBPbmNlIHdlIHNraXAgYW4gbWRsIHJlcGVhdGVkbHksIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mCiAJCSAqIHFfYnVzeSwgd2UgaGF2ZSBoaWdoIGNvbmZpZGVuY2Ugd2UndmUgbWlzc2VkIGl0LgogCQkgKi8KLQkJaWYgKGJ1Zi0+aWQgIT0gaWQpIHsKLQkJCWJ1Zi0+c2tpcHBlZCsrOwotCQkJaWYgKGJ1Zi0+c2tpcHBlZCA+PSBhdG9taWNfcmVhZCgmcy0+cV9idXN5LmJ1ZmZlcnMpLTEpIHsKLQkJCQkvKiBidWZmZXIgbXVzdCBoYXZlIGZhbGxlbiBvdXQgb2Ygcm90YXRpb24gKi8KLQkJCQlDWDE4X1dBUk4oIlNraXBwZWQgJXMsIGJ1ZmZlciAlZCwgJWQgIgorCQlpZiAobWRsLT5pZCAhPSBpZCkgeworCQkJbWRsLT5za2lwcGVkKys7CisJCQlpZiAobWRsLT5za2lwcGVkID49IGF0b21pY19yZWFkKCZzLT5xX2J1c3kuZGVwdGgpLTEpIHsKKwkJCQkvKiBtZGwgbXVzdCBoYXZlIGZhbGxlbiBvdXQgb2Ygcm90YXRpb24gKi8KKwkJCQlDWDE4X1dBUk4oIlNraXBwZWQgJXMsIE1ETCAlZCwgJWQgIgogCQkJCQkgICJ0aW1lcyAtIGl0IG11c3QgaGF2ZSBkcm9wcGVkIG91dCBvZiAiCi0JCQkJCSAgInJvdGF0aW9uXG4iLCBzLT5uYW1lLCBidWYtPmlkLAotCQkJCQkgIGJ1Zi0+c2tpcHBlZCk7CisJCQkJCSAgInJvdGF0aW9uXG4iLCBzLT5uYW1lLCBtZGwtPmlkLAorCQkJCQkgIG1kbC0+c2tpcHBlZCk7CiAJCQkJLyogU3dlZXAgaXQgdXAgdG8gcHV0IGl0IGJhY2sgaW50byByb3RhdGlvbiAqLwotCQkJCWxpc3RfbW92ZV90YWlsKCZidWYtPmxpc3QsICZzd2VlcF91cCk7Ci0JCQkJYXRvbWljX2RlYygmcy0+cV9idXN5LmJ1ZmZlcnMpOworCQkJCWxpc3RfbW92ZV90YWlsKCZtZGwtPmxpc3QsICZzd2VlcF91cCk7CisJCQkJYXRvbWljX2RlYygmcy0+cV9idXN5LmRlcHRoKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qCi0JCSAqIFdlIHB1bGwgdGhlIGRlc2lyZWQgYnVmZmVyIG9mZiBvZiB0aGUgcXVldWUgaGVyZS4gIFNvbWV0aGluZworCQkgKiBXZSBwdWxsIHRoZSBkZXNpcmVkIG1kbCBvZmYgb2YgdGhlIHF1ZXVlIGhlcmUuICBTb21ldGhpbmcKIAkJICogd2lsbCBoYXZlIHRvIHB1dCBpdCBiYWNrIG9uIGEgcXVldWUgbGF0ZXIuCiAJCSAqLwotCQlsaXN0X2RlbF9pbml0KCZidWYtPmxpc3QpOwotCQlhdG9taWNfZGVjKCZzLT5xX2J1c3kuYnVmZmVycyk7Ci0JCXJldCA9IGJ1ZjsKKwkJbGlzdF9kZWxfaW5pdCgmbWRsLT5saXN0KTsKKwkJYXRvbWljX2RlYygmcy0+cV9idXN5LmRlcHRoKTsKKwkJcmV0ID0gbWRsOwogCQlicmVhazsKIAl9CiAJc3Bpbl91bmxvY2soJnMtPnFfYnVzeS5sb2NrKTsKIAogCS8qCi0JICogV2UgZm91bmQgdGhlIGJ1ZmZlciBmb3Igd2hpY2ggd2Ugd2VyZSBsb29raW5nLiAgR2V0IGl0IHJlYWR5IGZvcgorCSAqIFdlIGZvdW5kIHRoZSBtZGwgZm9yIHdoaWNoIHdlIHdlcmUgbG9va2luZy4gIEdldCBpdCByZWFkeSBmb3IKIAkgKiB0aGUgY2FsbGVyIHRvIHB1dCBvbiBxX2Z1bGwgb3IgaW4gdGhlIGR2YiByaW5nIGJ1ZmZlci4KIAkgKi8KIAlpZiAocmV0ICE9IE5VTEwpIHsKIAkJcmV0LT5ieXRlc3VzZWQgPSBieXRlc3VzZWQ7CiAJCXJldC0+c2tpcHBlZCA9IDA7Ci0JCS8qIHJlYWRwb3MgYW5kIGJfZmxhZ3Mgd2VyZSAwJ2VkIHdoZW4gdGhlIGJ1ZiB3ZW50IG9uIHFfYnVzeSAqLwotCQljeDE4X2J1Zl9zeW5jX2Zvcl9jcHUocywgcmV0KTsKKwkJLyogMCdlZCByZWFkcG9zLCBtX2ZsYWdzICYgY3Vycl9idWYgd2hlbiBtZGwgd2VudCBvbiBxX2J1c3kgKi8KKwkJY3gxOF9tZGxfdXBkYXRlX2J1ZnNfZm9yX2NwdShzLCByZXQpOwogCQlpZiAocy0+dHlwZSAhPSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9UUykKLQkJCXNldF9iaXQoQ1gxOF9GX0JfTkVFRF9CVUZfU1dBUCwgJnJldC0+Yl9mbGFncyk7CisJCQlzZXRfYml0KENYMThfRl9NX05FRURfU1dBUCwgJnJldC0+bV9mbGFncyk7CiAJfQogCi0JLyogUHV0IGFueSBidWZmZXJzIHRoZSBmaXJtd2FyZSBpcyBpZ25vcmluZyBiYWNrIGludG8gbm9ybWFsIHJvdGF0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1ZiwgdG1wLCAmc3dlZXBfdXAsIGxpc3QpIHsKLQkJbGlzdF9kZWxfaW5pdCgmYnVmLT5saXN0KTsKLQkJY3gxOF9lbnF1ZXVlKHMsIGJ1ZiwgJnMtPnFfZnJlZSk7CisJLyogUHV0IGFueSBtZGxzIHRoZSBmaXJtd2FyZSBpcyBpZ25vcmluZyBiYWNrIGludG8gbm9ybWFsIHJvdGF0aW9uICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1kbCwgdG1wLCAmc3dlZXBfdXAsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmbWRsLT5saXN0KTsKKwkJY3gxOF9lbnF1ZXVlKHMsIG1kbCwgJnMtPnFfZnJlZSk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLS8qIE1vdmUgYWxsIGJ1ZmZlcnMgb2YgYSBxdWV1ZSB0byBxX2ZyZWUsIHdoaWxlIGZsdXNoaW5nIHRoZSBidWZmZXJzICovCi1zdGF0aWMgdm9pZCBjeDE4X3F1ZXVlX2ZsdXNoKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgc3RydWN0IGN4MThfcXVldWUgKnEpCisvKiBNb3ZlIGFsbCBtZGxzIG9mIGEgcXVldWUsIHdoaWxlIGZsdXNoaW5nIHRoZSBtZGwgKi8KK3N0YXRpYyB2b2lkIGN4MThfcXVldWVfZmx1c2goc3RydWN0IGN4MThfc3RyZWFtICpzLAorCQkJICAgICBzdHJ1Y3QgY3gxOF9xdWV1ZSAqcV9zcmMsIHN0cnVjdCBjeDE4X3F1ZXVlICpxX2RzdCkKIHsKLQlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgY3gxOF9tZGwgKm1kbDsKIAotCWlmIChxID09ICZzLT5xX2ZyZWUpCisJLyogSXQgb25seSBtYWtlcyBzZW5zZSB0byBmbHVzaCB0byBxX2ZyZWUgb3IgcV9pZGxlICovCisJaWYgKHFfc3JjID09IHFfZHN0IHx8IHFfZHN0ID09ICZzLT5xX2Z1bGwgfHwgcV9kc3QgPT0gJnMtPnFfYnVzeSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKCZxLT5sb2NrKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPmxpc3QpKSB7Ci0JCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJnEtPmxpc3QsIHN0cnVjdCBjeDE4X2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfbW92ZV90YWlsKCZidWYtPmxpc3QsICZzLT5xX2ZyZWUubGlzdCk7Ci0JCWJ1Zi0+Ynl0ZXN1c2VkID0gYnVmLT5yZWFkcG9zID0gYnVmLT5iX2ZsYWdzID0gYnVmLT5za2lwcGVkID0gMDsKLQkJYXRvbWljX2luYygmcy0+cV9mcmVlLmJ1ZmZlcnMpOworCXNwaW5fbG9jaygmcV9zcmMtPmxvY2spOworCXNwaW5fbG9jaygmcV9kc3QtPmxvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmcV9zcmMtPmxpc3QpKSB7CisJCW1kbCA9IGxpc3RfZmlyc3RfZW50cnkoJnFfc3JjLT5saXN0LCBzdHJ1Y3QgY3gxOF9tZGwsIGxpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmbWRsLT5saXN0LCAmcV9kc3QtPmxpc3QpOworCQltZGwtPmJ5dGVzdXNlZCA9IDA7CisJCW1kbC0+cmVhZHBvcyA9IDA7CisJCW1kbC0+bV9mbGFncyA9IDA7CisJCW1kbC0+c2tpcHBlZCA9IDA7CisJCW1kbC0+Y3Vycl9idWYgPSBOVUxMOworCQlhdG9taWNfaW5jKCZxX2RzdC0+ZGVwdGgpOwogCX0KLQljeDE4X3F1ZXVlX2luaXQocSk7Ci0Jc3Bpbl91bmxvY2soJnEtPmxvY2spOworCWN4MThfcXVldWVfaW5pdChxX3NyYyk7CisJc3Bpbl91bmxvY2soJnFfc3JjLT5sb2NrKTsKKwlzcGluX3VubG9jaygmcV9kc3QtPmxvY2spOwogfQogCiB2b2lkIGN4MThfZmx1c2hfcXVldWVzKHN0cnVjdCBjeDE4X3N0cmVhbSAqcykKIHsKLQljeDE4X3F1ZXVlX2ZsdXNoKHMsICZzLT5xX2J1c3kpOwotCWN4MThfcXVldWVfZmx1c2gocywgJnMtPnFfZnVsbCk7CisJY3gxOF9xdWV1ZV9mbHVzaChzLCAmcy0+cV9idXN5LCAmcy0+cV9mcmVlKTsKKwljeDE4X3F1ZXVlX2ZsdXNoKHMsICZzLT5xX2Z1bGwsICZzLT5xX2ZyZWUpOworfQorCisvKgorICogTm90ZSwgcy0+YnVmX3Bvb2wgaXMgbm90IHByb3RlY3RlZCBieSBhIGxvY2ssCisgKiB0aGUgc3RyZWFtIGJldHRlciBub3QgaGF2ZSAqYW55dGhpbmcqIGdvaW5nIG9uIHdoZW4gY2FsbGluZyB0aGlzCisgKi8KK3ZvaWQgY3gxOF91bmxvYWRfcXVldWVzKHN0cnVjdCBjeDE4X3N0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgY3gxOF9xdWV1ZSAqcV9pZGxlID0gJnMtPnFfaWRsZTsKKwlzdHJ1Y3QgY3gxOF9tZGwgKm1kbDsKKwlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKworCS8qIE1vdmUgYWxsIE1ETFMgdG8gcV9pZGxlICovCisJY3gxOF9xdWV1ZV9mbHVzaChzLCAmcy0+cV9idXN5LCBxX2lkbGUpOworCWN4MThfcXVldWVfZmx1c2gocywgJnMtPnFfZnVsbCwgcV9pZGxlKTsKKwljeDE4X3F1ZXVlX2ZsdXNoKHMsICZzLT5xX2ZyZWUsIHFfaWRsZSk7CisKKwkvKiBSZXNldCBNREwgaWQncyBhbmQgbW92ZSBhbGwgYnVmZmVycyBiYWNrIHRvIHRoZSBzdHJlYW0ncyBidWZfcG9vbCAqLworCXNwaW5fbG9jaygmcV9pZGxlLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kbCwgJnFfaWRsZS0+bGlzdCwgbGlzdCkgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJm1kbC0+YnVmX2xpc3QpKSB7CisJCQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtZGwtPmJ1Zl9saXN0LAorCQkJCQkgICAgICAgc3RydWN0IGN4MThfYnVmZmVyLCBsaXN0KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZidWYtPmxpc3QsICZzLT5idWZfcG9vbCk7CisJCQlidWYtPmJ5dGVzdXNlZCA9IDA7CisJCQlidWYtPnJlYWRwb3MgPSAwOworCQl9CisJCW1kbC0+aWQgPSBzLT5tZGxfYmFzZV9pZHg7IC8qIHJlc2V0IGlkIHRvIGEgInNhZmUiIHZhbHVlICovCisJCS8qIGFsbCBvdGhlciBtZGwgZmllbGRzIHdlcmUgY2xlYXJlZCBieSBjeDE4X3F1ZXVlX2ZsdXNoKCkgKi8KKwl9CisJc3Bpbl91bmxvY2soJnFfaWRsZS0+bG9jayk7Cit9CisKKy8qCisgKiBOb3RlLCBzLT5idWZfcG9vbCBpcyBub3QgcHJvdGVjdGVkIGJ5IGEgbG9jaywKKyAqIHRoZSBzdHJlYW0gYmV0dGVyIG5vdCBoYXZlICphbnl0aGluZyogZ29pbmcgb24gd2hlbiBjYWxsaW5nIHRoaXMKKyAqLwordm9pZCBjeDE4X2xvYWRfcXVldWVzKHN0cnVjdCBjeDE4X3N0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgY3gxOCAqY3ggPSBzLT5jeDsKKwlzdHJ1Y3QgY3gxOF9tZGwgKm1kbDsKKwlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKwlpbnQgbWRsX2lkOworCWludCBpOworCXUzMiBwYXJ0aWFsX2J1Zl9zaXplOworCisJLyoKKwkgKiBBdHRhY2ggYnVmZmVycyB0byBNRExzLCBnaXZlIHRoZSBNRExzIGlkcywgYW5kIGFkZCBNRExzIHRvIHFfZnJlZQorCSAqIEV4Y2VzcyBNRExzIGFyZSBsZWZ0IG9uIHFfaWRsZQorCSAqIEV4Y2VzcyBidWZmZXJzIGFyZSBsZWZ0IGluIGJ1Zl9wb29sIGFuZC9vciBvbiBhbiBNREwgaW4gcV9pZGxlCisJICovCisJbWRsX2lkID0gcy0+bWRsX2Jhc2VfaWR4OworCWZvciAobWRsID0gY3gxOF9kZXF1ZXVlKHMsICZzLT5xX2lkbGUpLCBpID0gcy0+YnVmc19wZXJfbWRsOworCSAgICAgbWRsICE9IE5VTEwgJiYgaSA9PSBzLT5idWZzX3Blcl9tZGw7CisJICAgICBtZGwgPSBjeDE4X2RlcXVldWUocywgJnMtPnFfaWRsZSkpIHsKKworCQltZGwtPmlkID0gbWRsX2lkOworCisJCWZvciAoaSA9IDA7IGkgPCBzLT5idWZzX3Blcl9tZGw7IGkrKykgeworCQkJaWYgKGxpc3RfZW1wdHkoJnMtPmJ1Zl9wb29sKSkKKwkJCQlicmVhazsKKworCQkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcy0+YnVmX3Bvb2wsIHN0cnVjdCBjeDE4X2J1ZmZlciwKKwkJCQkJICAgICAgIGxpc3QpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmJ1Zi0+bGlzdCwgJm1kbC0+YnVmX2xpc3QpOworCisJCQkvKiB1cGRhdGUgdGhlIGZpcm13YXJlJ3MgTURMIGFycmF5IHdpdGggdGhpcyBidWZmZXIgKi8KKwkJCWN4MThfd3JpdGVsKGN4LCBidWYtPmRtYV9oYW5kbGUsCisJCQkJICAgICZjeC0+c2NiLT5jcHVfbWRsW21kbF9pZCArIGldLnBhZGRyKTsKKwkJCWN4MThfd3JpdGVsKGN4LCBzLT5idWZfc2l6ZSwKKwkJCQkgICAgJmN4LT5zY2ItPmNwdV9tZGxbbWRsX2lkICsgaV0ubGVuZ3RoKTsKKwkJfQorCisJCWlmIChpID09IHMtPmJ1ZnNfcGVyX21kbCkgeworCQkJLyoKKwkJCSAqIFRoZSBlbmNvZGVyIGRvZXNuJ3QgaG9ub3Igcy0+bWRsX3NpemUuICBTbyBpbiB0aGUKKwkJCSAqIGNhc2Ugb2YgYSBub24taW50ZWdyYWwgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gbWVldAorCQkJICogbWRsX3NpemUsIHdlIGxpZSBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBidWZmZXIKKwkJCSAqIGluIHRoZSBNREwgdG8gZ2V0IHRoZSBlbmNvZGVyIHRvIHJlYWxseSBvbmx5IHNlbmQKKwkJCSAqIHVzIG1kbF9zaXplIGJ5dGVzIHBlciBNREwgdHJhbnNmZXIuCisJCQkgKi8KKwkJCXBhcnRpYWxfYnVmX3NpemUgPSBzLT5tZGxfc2l6ZSAlIHMtPmJ1Zl9zaXplOworCQkJaWYgKHBhcnRpYWxfYnVmX3NpemUpIHsKKwkJCQljeDE4X3dyaXRlbChjeCwgcGFydGlhbF9idWZfc2l6ZSwKKwkJCQkgICAgICAmY3gtPnNjYi0+Y3B1X21kbFttZGxfaWQgKyBpIC0gMV0ubGVuZ3RoKTsKKwkJCX0KKwkJCWN4MThfZW5xdWV1ZShzLCBtZGwsICZzLT5xX2ZyZWUpOworCQl9IGVsc2UgeworCQkJLyogTm90IGVub3VnaCBidWZmZXJzIGZvciB0aGlzIE1ETDsgd2Ugd29uJ3QgdXNlIGl0ICovCisJCQljeDE4X3B1c2gocywgbWRsLCAmcy0+cV9pZGxlKTsKKwkJfQorCQltZGxfaWQgKz0gaTsKKwl9Cit9CisKK3ZvaWQgX2N4MThfbWRsX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X21kbCAqbWRsKQoreworCWludCBkbWEgPSBzLT5kbWE7CisJdTMyIGJ1Zl9zaXplID0gcy0+YnVmX3NpemU7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBzLT5jeC0+cGNpX2RldjsKKwlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVmLCAmbWRsLT5idWZfbGlzdCwgbGlzdCkKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBjaV9kZXYsIGJ1Zi0+ZG1hX2hhbmRsZSwKKwkJCQkJICAgICAgIGJ1Zl9zaXplLCBkbWEpOwogfQogCiBpbnQgY3gxOF9zdHJlYW1fYWxsb2Moc3RydWN0IGN4MThfc3RyZWFtICpzKQpAQCAtMTkwLDQ0ICszNTIsNjIgQEAKIAlpZiAocy0+YnVmZmVycyA9PSAwKQogCQlyZXR1cm4gMDsKIAotCUNYMThfREVCVUdfSU5GTygiQWxsb2NhdGUgJXMgc3RyZWFtOiAlZCB4ICVkIGJ1ZmZlcnMgKCVka0IgdG90YWwpXG4iLAorCUNYMThfREVCVUdfSU5GTygiQWxsb2NhdGUgJXMgc3RyZWFtOiAlZCB4ICVkIGJ1ZmZlcnMgIgorCQkJIiglZC4lMDJkIGtCIHRvdGFsKVxuIiwKIAkJcy0+bmFtZSwgcy0+YnVmZmVycywgcy0+YnVmX3NpemUsCi0JCXMtPmJ1ZmZlcnMgKiBzLT5idWZfc2l6ZSAvIDEwMjQpOworCQlzLT5idWZmZXJzICogcy0+YnVmX3NpemUgLyAxMDI0LAorCQkocy0+YnVmZmVycyAqIHMtPmJ1Zl9zaXplICogMTAwIC8gMTAyNCkgJSAxMDApOwogCi0JaWYgKCgoY2hhciBfX2lvbWVtICopJmN4LT5zY2ItPmNwdV9tZGxbY3gtPm1kbF9vZmZzZXQgKyBzLT5idWZmZXJzXSAtCisJaWYgKCgoY2hhciBfX2lvbWVtICopJmN4LT5zY2ItPmNwdV9tZGxbY3gtPmZyZWVfbWRsX2lkeCArIHMtPmJ1ZmZlcnNdIC0KIAkJCQkoY2hhciBfX2lvbWVtICopY3gtPnNjYikgPiBTQ0JfUkVTRVJWRURfU0laRSkgewogCQl1bnNpZ25lZCBidWZzeiA9ICgoKGNoYXIgX19pb21lbSAqKWN4LT5zY2IpICsgU0NCX1JFU0VSVkVEX1NJWkUgLQogCQkJCQkoKGNoYXIgX19pb21lbSAqKWN4LT5zY2ItPmNwdV9tZGwpKTsKIAogCQlDWDE4X0VSUigiVG9vIG1hbnkgYnVmZmVycywgY2Fubm90IGZpdCBpbiBTQ0IgYXJlYVxuIik7CiAJCUNYMThfRVJSKCJNYXggYnVmZmVycyA9ICV6ZFxuIiwKLQkJCWJ1ZnN6IC8gc2l6ZW9mKHN0cnVjdCBjeDE4X21kbCkpOworCQkJYnVmc3ogLyBzaXplb2Yoc3RydWN0IGN4MThfbWRsX2VudCkpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlzLT5tZGxfb2Zmc2V0ID0gY3gtPm1kbF9vZmZzZXQ7CisJcy0+bWRsX2Jhc2VfaWR4ID0gY3gtPmZyZWVfbWRsX2lkeDsKIAotCS8qIGFsbG9jYXRlIHN0cmVhbSBidWZmZXJzLiBJbml0aWFsbHkgYWxsIGJ1ZmZlcnMgYXJlIGluIHFfZnJlZS4gKi8KKwkvKiBhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycyBhbmQgTURMcyAqLwogCWZvciAoaSA9IDA7IGkgPCBzLT5idWZmZXJzOyBpKyspIHsKLQkJc3RydWN0IGN4MThfYnVmZmVyICpidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3gxOF9idWZmZXIpLAotCQkJCQkJR0ZQX0tFUk5FTHxfX0dGUF9OT1dBUk4pOworCQlzdHJ1Y3QgY3gxOF9tZGwgKm1kbDsKKwkJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CiAKLQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkvKiAxIE1ETCBwZXIgYnVmZmVyIHRvIGhhbmRsZSB0aGUgd29yc3QgJiBhbHNvIGRlZmF1bHQgY2FzZSAqLworCQltZGwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3gxOF9tZGwpLCBHRlBfS0VSTkVMfF9fR0ZQX05PV0FSTik7CisJCWlmIChtZGwgPT0gTlVMTCkKIAkJCWJyZWFrOworCisJCWJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDE4X2J1ZmZlciksCisJCQkJR0ZQX0tFUk5FTHxfX0dGUF9OT1dBUk4pOworCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCWtmcmVlKG1kbCk7CisJCQlicmVhazsKKwkJfQorCiAJCWJ1Zi0+YnVmID0ga21hbGxvYyhzLT5idWZfc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1dBUk4pOwogCQlpZiAoYnVmLT5idWYgPT0gTlVMTCkgeworCQkJa2ZyZWUobWRsKTsKIAkJCWtmcmVlKGJ1Zik7CiAJCQlicmVhazsKIAkJfQotCQlidWYtPmlkID0gY3gtPmJ1ZmZlcl9pZCsrOworCisJCUlOSVRfTElTVF9IRUFEKCZtZGwtPmxpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmbWRsLT5idWZfbGlzdCk7CisJCW1kbC0+aWQgPSBzLT5tZGxfYmFzZV9pZHg7IC8qIGEgc29tZXdoYXQgc2FmZSB2YWx1ZSAqLworCQljeDE4X2VucXVldWUocywgbWRsLCAmcy0+cV9pZGxlKTsKKwogCQlJTklUX0xJU1RfSEVBRCgmYnVmLT5saXN0KTsKIAkJYnVmLT5kbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUocy0+Y3gtPnBjaV9kZXYsCiAJCQkJYnVmLT5idWYsIHMtPmJ1Zl9zaXplLCBzLT5kbWEpOwogCQljeDE4X2J1Zl9zeW5jX2Zvcl9jcHUocywgYnVmKTsKLQkJY3gxOF9lbnF1ZXVlKHMsIGJ1ZiwgJnMtPnFfZnJlZSk7CisJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnMtPmJ1Zl9wb29sKTsKIAl9CiAJaWYgKGkgPT0gcy0+YnVmZmVycykgewotCQljeC0+bWRsX29mZnNldCArPSBzLT5idWZmZXJzOworCQljeC0+ZnJlZV9tZGxfaWR4ICs9IHMtPmJ1ZmZlcnM7CiAJCXJldHVybiAwOwogCX0KIAlDWDE4X0VSUigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgJXMgc3RyZWFtXG4iLCBzLT5uYW1lKTsKQEAgLTIzNywxMyArNDE3LDIxIEBACiAKIHZvaWQgY3gxOF9zdHJlYW1fZnJlZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpCiB7CisJc3RydWN0IGN4MThfbWRsICptZGw7CiAJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CiAKLQkvKiBtb3ZlIGFsbCBidWZmZXJzIHRvIHFfZnJlZSAqLwotCWN4MThfZmx1c2hfcXVldWVzKHMpOworCS8qIG1vdmUgYWxsIGJ1ZmZlcnMgdG8gYnVmX3Bvb2wgYW5kIGFsbCBNRExzIHRvIHFfaWRsZSAqLworCWN4MThfdW5sb2FkX3F1ZXVlcyhzKTsKIAotCS8qIGVtcHR5IHFfZnJlZSAqLwotCXdoaWxlICgoYnVmID0gY3gxOF9kZXF1ZXVlKHMsICZzLT5xX2ZyZWUpKSkgeworCS8qIGVtcHR5IHFfaWRsZSAqLworCXdoaWxlICgobWRsID0gY3gxOF9kZXF1ZXVlKHMsICZzLT5xX2lkbGUpKSkKKwkJa2ZyZWUobWRsKTsKKworCS8qIGVtcHR5IGJ1Zl9wb29sICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzLT5idWZfcG9vbCkpIHsKKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcy0+YnVmX3Bvb2wsIHN0cnVjdCBjeDE4X2J1ZmZlciwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJmJ1Zi0+bGlzdCk7CisKIAkJcGNpX3VubWFwX3NpbmdsZShzLT5jeC0+cGNpX2RldiwgYnVmLT5kbWFfaGFuZGxlLAogCQkJCXMtPmJ1Zl9zaXplLCBzLT5kbWEpOwogCQlrZnJlZShidWYtPmJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtcXVldWUuaAppbmRleCA0ZGUwNjI2Li44OGE2ZDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXF1ZXVlLmgKQEAgLTQwLDMyICs0MCw1OSBAQAogCQkJCXMtPmJ1Zl9zaXplLCBzLT5kbWEpOwogfQogCit2b2lkIF9jeDE4X21kbF9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGN4MThfc3RyZWFtICpzLCBzdHJ1Y3QgY3gxOF9tZGwgKm1kbCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjeDE4X21kbF9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGN4MThfc3RyZWFtICpzLAorCQkJCQkgICAgc3RydWN0IGN4MThfbWRsICptZGwpCit7CisJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJm1kbC0+YnVmX2xpc3QpKQorCQljeDE4X2J1Zl9zeW5jX2Zvcl9kZXZpY2UocywgbGlzdF9maXJzdF9lbnRyeSgmbWRsLT5idWZfbGlzdCwKKwkJCQkJCQkgICAgIHN0cnVjdCBjeDE4X2J1ZmZlciwKKwkJCQkJCQkgICAgIGxpc3QpKTsKKwllbHNlCisJCV9jeDE4X21kbF9zeW5jX2Zvcl9kZXZpY2UocywgbWRsKTsKK30KKwogdm9pZCBjeDE4X2J1Zl9zd2FwKHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmKTsKK3ZvaWQgX2N4MThfbWRsX3N3YXAoc3RydWN0IGN4MThfbWRsICptZGwpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF9tZGxfc3dhcChzdHJ1Y3QgY3gxOF9tZGwgKm1kbCkKK3sKKwlpZiAobGlzdF9pc19zaW5ndWxhcigmbWRsLT5idWZfbGlzdCkpCisJCWN4MThfYnVmX3N3YXAobGlzdF9maXJzdF9lbnRyeSgmbWRsLT5idWZfbGlzdCwKKwkJCQkJICAgICAgIHN0cnVjdCBjeDE4X2J1ZmZlciwgbGlzdCkpOworCWVsc2UKKwkJX2N4MThfbWRsX3N3YXAobWRsKTsKK30KIAogLyogY3gxOF9xdWV1ZSB1dGlsaXR5IGZ1bmN0aW9ucyAqLwotc3RydWN0IGN4MThfcXVldWUgKl9jeDE4X2VucXVldWUoc3RydWN0IGN4MThfc3RyZWFtICpzLCBzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZiwKK3N0cnVjdCBjeDE4X3F1ZXVlICpfY3gxOF9lbnF1ZXVlKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgc3RydWN0IGN4MThfbWRsICptZGwsCiAJCQkJIHN0cnVjdCBjeDE4X3F1ZXVlICpxLCBpbnQgdG9fZnJvbnQpOwogCiBzdGF0aWMgaW5saW5lCi1zdHJ1Y3QgY3gxOF9xdWV1ZSAqY3gxOF9lbnF1ZXVlKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgc3RydWN0IGN4MThfYnVmZmVyICpidWYsCitzdHJ1Y3QgY3gxOF9xdWV1ZSAqY3gxOF9lbnF1ZXVlKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgc3RydWN0IGN4MThfbWRsICptZGwsCiAJCQkJc3RydWN0IGN4MThfcXVldWUgKnEpCiB7Ci0JcmV0dXJuIF9jeDE4X2VucXVldWUocywgYnVmLCBxLCAwKTsgLyogRklGTyAqLworCXJldHVybiBfY3gxOF9lbnF1ZXVlKHMsIG1kbCwgcSwgMCk7IC8qIEZJRk8gKi8KIH0KIAogc3RhdGljIGlubGluZQotc3RydWN0IGN4MThfcXVldWUgKmN4MThfcHVzaChzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAorc3RydWN0IGN4MThfcXVldWUgKmN4MThfcHVzaChzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X21kbCAqbWRsLAogCQkJICAgICBzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSkKIHsKLQlyZXR1cm4gX2N4MThfZW5xdWV1ZShzLCBidWYsIHEsIDEpOyAvKiBMSUZPICovCisJcmV0dXJuIF9jeDE4X2VucXVldWUocywgbWRsLCBxLCAxKTsgLyogTElGTyAqLwogfQogCiB2b2lkIGN4MThfcXVldWVfaW5pdChzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSk7Ci1zdHJ1Y3QgY3gxOF9idWZmZXIgKmN4MThfZGVxdWV1ZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X3F1ZXVlICpxKTsKLXN0cnVjdCBjeDE4X2J1ZmZlciAqY3gxOF9xdWV1ZV9nZXRfYnVmKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgdTMyIGlkLAorc3RydWN0IGN4MThfbWRsICpjeDE4X2RlcXVldWUoc3RydWN0IGN4MThfc3RyZWFtICpzLCBzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSk7CitzdHJ1Y3QgY3gxOF9tZGwgKmN4MThfcXVldWVfZ2V0X21kbChzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHUzMiBpZCwKIAl1MzIgYnl0ZXN1c2VkKTsKIHZvaWQgY3gxOF9mbHVzaF9xdWV1ZXMoc3RydWN0IGN4MThfc3RyZWFtICpzKTsKIAorLyogcXVldWUgTURMIHJlY29uZmlndXJhdGlvbiBoZWxwZXJzICovCit2b2lkIGN4MThfdW5sb2FkX3F1ZXVlcyhzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpOwordm9pZCBjeDE4X2xvYWRfcXVldWVzKHN0cnVjdCBjeDE4X3N0cmVhbSAqcyk7CisKIC8qIGN4MThfc3RyZWFtIHV0aWxpdHkgZnVuY3Rpb25zICovCiBpbnQgY3gxOF9zdHJlYW1fYWxsb2Moc3RydWN0IGN4MThfc3RyZWFtICpzKTsKIHZvaWQgY3gxOF9zdHJlYW1fZnJlZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc2NiLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuaAppbmRleCAxZGMxYzQzLi4zNjhmMjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuaApAQCAtODEsNyArODEsNyBAQAogCiAKIC8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgRVBVIHRvIHByb3ZpZGUgbWVtb3J5IGRlc2NyaXB0b3JzIGluIGl0cyBtZW1vcnkgKi8KLXN0cnVjdCBjeDE4X21kbCB7CitzdHJ1Y3QgY3gxOF9tZGxfZW50IHsKICAgICB1MzIgcGFkZHI7ICAvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGEgYnVmZmVyIHNlZ21lbnQgKi8KICAgICB1MzIgbGVuZ3RoOyAvKiBMZW5ndGggb2YgdGhlIGJ1ZmZlciBzZWdtZW50ICovCiB9OwpAQCAtMjcyLDcgKzI3Miw3IEBACiAJc3RydWN0IGN4MThfbWFpbGJveCAgcHB1MmVwdV9tYjsKIAogCXN0cnVjdCBjeDE4X21kbF9hY2sgIGNwdV9tZGxfYWNrW0NYMThfTUFYX1NUUkVBTVNdW0NYMThfTUFYX01ETF9BQ0tTXTsKLQlzdHJ1Y3QgY3gxOF9tZGwgICAgICBjcHVfbWRsWzFdOworCXN0cnVjdCBjeDE4X21kbF9lbnQgIGNwdV9tZGxbMV07CiB9OwogCiB2b2lkIGN4MThfaW5pdF9zY2Ioc3RydWN0IGN4MTggKmN4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYwppbmRleCA3ZGY1MTNhMi4uYzM5ODY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYwpAQCAtMTE1LDYgKzExNSw5IEBACiAJcy0+ZG1hID0gY3gxOF9zdHJlYW1faW5mb1t0eXBlXS5kbWE7CiAJcy0+YnVmZmVycyA9IGN4LT5zdHJlYW1fYnVmZmVyc1t0eXBlXTsKIAlzLT5idWZfc2l6ZSA9IGN4LT5zdHJlYW1fYnVmX3NpemVbdHlwZV07CisJSU5JVF9MSVNUX0hFQUQoJnMtPmJ1Zl9wb29sKTsKKwlzLT5idWZzX3Blcl9tZGwgPSAxOworCXMtPm1kbF9zaXplID0gcy0+YnVmX3NpemUgKiBzLT5idWZzX3Blcl9tZGw7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT53YWl0cSk7CiAJcy0+aWQgPSAtMTsKQEAgLTEyNCw2ICsxMjcsOCBAQAogCWN4MThfcXVldWVfaW5pdCgmcy0+cV9idXN5KTsKIAlzcGluX2xvY2tfaW5pdCgmcy0+cV9mdWxsLmxvY2spOwogCWN4MThfcXVldWVfaW5pdCgmcy0+cV9mdWxsKTsKKwlzcGluX2xvY2tfaW5pdCgmcy0+cV9pZGxlLmxvY2spOworCWN4MThfcXVldWVfaW5pdCgmcy0+cV9pZGxlKTsKIAogCUlOSVRfV09SSygmcy0+b3V0X3dvcmtfb3JkZXIsIGN4MThfb3V0X3dvcmtfaGFuZGxlcik7CiB9CkBAIC0yNTcsOSArMjYyLDExIEBACiAKIAlzd2l0Y2ggKHZmbF90eXBlKSB7CiAJY2FzZSBWRkxfVFlQRV9HUkFCQkVSOgotCQlDWDE4X0lORk8oIlJlZ2lzdGVyZWQgZGV2aWNlIHZpZGVvJWQgZm9yICVzICglZCB4ICVkIGtCKVxuIiwKKwkJQ1gxOF9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2aWRlbyVkIGZvciAlcyAiCisJCQkgICIoJWQgeCAlZC4lMDJkIGtCKVxuIiwKIAkJCSAgbnVtLCBzLT5uYW1lLCBjeC0+c3RyZWFtX2J1ZmZlcnNbdHlwZV0sCi0JCQkgIGN4LT5zdHJlYW1fYnVmX3NpemVbdHlwZV0vMTAyNCk7CisJCQkgIGN4LT5zdHJlYW1fYnVmX3NpemVbdHlwZV0gLyAxMDI0LAorCQkJICAoY3gtPnN0cmVhbV9idWZfc2l6ZVt0eXBlXSAqIDEwMCAvIDEwMjQpICUgMTAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFZGTF9UWVBFX1JBRElPOgpAQCAtNDQxLDggKzQ0OCw4IEBACiB9CiAKIHN0YXRpYwotc3RydWN0IGN4MThfcXVldWUgKl9jeDE4X3N0cmVhbV9wdXRfYnVmX2Z3KHN0cnVjdCBjeDE4X3N0cmVhbSAqcywKLQkJCQkJICAgc3RydWN0IGN4MThfYnVmZmVyICpidWYpCitzdHJ1Y3QgY3gxOF9xdWV1ZSAqX2N4MThfc3RyZWFtX3B1dF9tZGxfZncoc3RydWN0IGN4MThfc3RyZWFtICpzLAorCQkJCQkgICBzdHJ1Y3QgY3gxOF9tZGwgKm1kbCkKIHsKIAlzdHJ1Y3QgY3gxOCAqY3ggPSBzLT5jeDsKIAlzdHJ1Y3QgY3gxOF9xdWV1ZSAqcTsKQEAgLTQ1MSwxNiArNDU4LDE2IEBACiAJaWYgKHMtPmhhbmRsZSA9PSBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEUgfHwKIAkgICAgdGVzdF9iaXQoQ1gxOF9GX1NfU1RPUFBJTkcsICZzLT5zX2ZsYWdzKSB8fAogCSAgICAhdGVzdF9iaXQoQ1gxOF9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncykpCi0JCXJldHVybiBjeDE4X2VucXVldWUocywgYnVmLCAmcy0+cV9mcmVlKTsKKwkJcmV0dXJuIGN4MThfZW5xdWV1ZShzLCBtZGwsICZzLT5xX2ZyZWUpOwogCi0JcSA9IGN4MThfZW5xdWV1ZShzLCBidWYsICZzLT5xX2J1c3kpOworCXEgPSBjeDE4X2VucXVldWUocywgbWRsLCAmcy0+cV9idXN5KTsKIAlpZiAocSAhPSAmcy0+cV9idXN5KQotCQlyZXR1cm4gcTsgLyogVGhlIGZpcm13YXJlIGhhcyB0aGUgbWF4IGJ1ZmZlcnMgaXQgY2FuIGhhbmRsZSAqLworCQlyZXR1cm4gcTsgLyogVGhlIGZpcm13YXJlIGhhcyB0aGUgbWF4IE1ETHMgaXQgY2FuIGhhbmRsZSAqLwogCi0JY3gxOF9idWZfc3luY19mb3JfZGV2aWNlKHMsIGJ1Zik7CisJY3gxOF9tZGxfc3luY19mb3JfZGV2aWNlKHMsIG1kbCk7CiAJY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9ERV9TRVRfTURMLCA1LCBzLT5oYW5kbGUsCi0JCSAgKHZvaWQgX19pb21lbSAqKSAmY3gtPnNjYi0+Y3B1X21kbFtidWYtPmlkXSAtIGN4LT5lbmNfbWVtLAotCQkgIDEsIGJ1Zi0+aWQsIHMtPmJ1Zl9zaXplKTsKKwkJICAodm9pZCBfX2lvbWVtICopICZjeC0+c2NiLT5jcHVfbWRsW21kbC0+aWRdIC0gY3gtPmVuY19tZW0sCisJCSAgcy0+YnVmc19wZXJfbWRsLCBtZGwtPmlkLCBzLT5tZGxfc2l6ZSk7CiAJcmV0dXJuIHE7CiB9CiAKQEAgLTQ2OCwxOSArNDc1LDE5IEBACiB2b2lkIF9jeDE4X3N0cmVhbV9sb2FkX2Z3X3F1ZXVlKHN0cnVjdCBjeDE4X3N0cmVhbSAqcykKIHsKIAlzdHJ1Y3QgY3gxOF9xdWV1ZSAqcTsKLQlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgY3gxOF9tZGwgKm1kbDsKIAotCWlmIChhdG9taWNfcmVhZCgmcy0+cV9mcmVlLmJ1ZmZlcnMpID09IDAgfHwKLQkgICAgYXRvbWljX3JlYWQoJnMtPnFfYnVzeS5idWZmZXJzKSA+PSBDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0pCisJaWYgKGF0b21pY19yZWFkKCZzLT5xX2ZyZWUuZGVwdGgpID09IDAgfHwKKwkgICAgYXRvbWljX3JlYWQoJnMtPnFfYnVzeS5kZXB0aCkgPj0gQ1gxOF9NQVhfRldfTURMU19QRVJfU1RSRUFNKQogCQlyZXR1cm47CiAKIAkvKiBNb3ZlIGZyb20gcV9mcmVlIHRvIHFfYnVzeSBub3RpZnlpbmcgdGhlIGZpcm13YXJlLCB1bnRpbCB0aGUgbGltaXQgKi8KIAlkbyB7Ci0JCWJ1ZiA9IGN4MThfZGVxdWV1ZShzLCAmcy0+cV9mcmVlKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQltZGwgPSBjeDE4X2RlcXVldWUocywgJnMtPnFfZnJlZSk7CisJCWlmIChtZGwgPT0gTlVMTCkKIAkJCWJyZWFrOwotCQlxID0gX2N4MThfc3RyZWFtX3B1dF9idWZfZncocywgYnVmKTsKLQl9IHdoaWxlIChhdG9taWNfcmVhZCgmcy0+cV9idXN5LmJ1ZmZlcnMpIDwgQ1gxOF9NQVhfRldfTURMU19QRVJfU1RSRUFNCisJCXEgPSBfY3gxOF9zdHJlYW1fcHV0X21kbF9mdyhzLCBtZGwpOworCX0gd2hpbGUgKGF0b21pY19yZWFkKCZzLT5xX2J1c3kuZGVwdGgpIDwgQ1gxOF9NQVhfRldfTURMU19QRVJfU1RSRUFNCiAJCSAmJiBxID09ICZzLT5xX2J1c3kpOwogfQogCkBAIC00OTIsMTEgKzQ5OSw1MSBAQAogCV9jeDE4X3N0cmVhbV9sb2FkX2Z3X3F1ZXVlKHMpOwogfQogCitzdGF0aWMgdm9pZCBjeDE4X3N0cmVhbV9jb25maWd1cmVfbWRscyhzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpCit7CisJY3gxOF91bmxvYWRfcXVldWVzKHMpOworCisJc3dpdGNoIChzLT50eXBlKSB7CisJY2FzZSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9ZVVY6CisJCS8qCisJCSAqIEhlaWdodCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzMiBsaW5lcy4KKwkJICogU2V0IHRoZSBNREwgc2l6ZSB0byB0aGUgZXhhY3Qgc2l6ZSBuZWVkZWQgZm9yIG9uZSBmcmFtZS4KKwkJICogVXNlIGVub3VnaCBidWZmZXJzIHBlciBNREwgdG8gY292ZXIgdGhlIE1ETCBzaXplCisJCSAqLworCQlzLT5tZGxfc2l6ZSA9IDcyMCAqIHMtPmN4LT5wYXJhbXMuaGVpZ2h0ICogMyAvIDI7CisJCXMtPmJ1ZnNfcGVyX21kbCA9IHMtPm1kbF9zaXplIC8gcy0+YnVmX3NpemU7CisJCWlmIChzLT5tZGxfc2l6ZSAlIHMtPmJ1Zl9zaXplKQorCQkJcy0+YnVmc19wZXJfbWRsKys7CisJCWJyZWFrOworCWNhc2UgQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJOgorCQlzLT5idWZzX3Blcl9tZGwgPSAxOworCQlpZiAgKGN4MThfcmF3X3ZiaShzLT5jeCkpIHsKKwkJCXMtPm1kbF9zaXplID0gKHMtPmN4LT5pc182MGh6ID8gMTIgOiAxOCkKKwkJCQkJCSAgICAgICAqIDIgKiB2YmlfYWN0aXZlX3NhbXBsZXM7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogU2VlIGNvbW1lbnQgaW4gY3gxOF92Ymlfc2V0dXAoKSBiZWxvdyBhYm91dCB0aGUKKwkJCSAqIGV4dHJhIGxpbmVzIHdlIGNhcHR1cmUgaW4gc2xpY2VkIFZCSSBtb2RlIGR1ZSB0bworCQkJICogdGhlIGxpbmVzIG9uIHdoaWNoIEVBViBSUCBjb2RlcyB0b2dnbGUuCisJCQkqLworCQkJcy0+bWRsX3NpemUgPSBzLT5jeC0+aXNfNjBoegorCQkJCSAgID8gKDIxIC0gNCArIDEpICogMiAqIHZiaV9oYmxhbmtfc2FtcGxlc182MEh6CisJCQkJICAgOiAoMjMgLSAyICsgMSkgKiAyICogdmJpX2hibGFua19zYW1wbGVzXzUwSHo7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcy0+YnVmc19wZXJfbWRsID0gMTsKKwkJcy0+bWRsX3NpemUgPSBzLT5idWZfc2l6ZSAqIHMtPmJ1ZnNfcGVyX21kbDsKKwkJYnJlYWs7CisJfQorCisJY3gxOF9sb2FkX3F1ZXVlcyhzKTsKK30KKwogaW50IGN4MThfc3RhcnRfdjRsMl9lbmNvZGVfc3RyZWFtKHN0cnVjdCBjeDE4X3N0cmVhbSAqcykKIHsKIAl1MzIgZGF0YVtNQVhfTUJfQVJHVU1FTlRTXTsKIAlzdHJ1Y3QgY3gxOCAqY3ggPSBzLT5jeDsKLQlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKIAlpbnQgY2FwdHlwZSA9IDA7CiAJc3RydWN0IGN4MThfYXBpX2Z1bmNfcHJpdmF0ZSBwcml2OwogCkBAIC02MTksMTQgKzY2Niw3IEBACiAJCSh2b2lkIF9faW9tZW0gKikmY3gtPnNjYi0+Y3B1X21kbF9hY2tbcy0+dHlwZV1bMV0gLSBjeC0+ZW5jX21lbSk7CiAKIAkvKiBJbml0IGFsbCB0aGUgY3B1X21kbHMgZm9yIHRoaXMgc3RyZWFtICovCi0JY3gxOF9mbHVzaF9xdWV1ZXMocyk7Ci0Jc3Bpbl9sb2NrKCZzLT5xX2ZyZWUubG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShidWYsICZzLT5xX2ZyZWUubGlzdCwgbGlzdCkgewotCQljeDE4X3dyaXRlbChjeCwgYnVmLT5kbWFfaGFuZGxlLAotCQkJCQkmY3gtPnNjYi0+Y3B1X21kbFtidWYtPmlkXS5wYWRkcik7Ci0JCWN4MThfd3JpdGVsKGN4LCBzLT5idWZfc2l6ZSwgJmN4LT5zY2ItPmNwdV9tZGxbYnVmLT5pZF0ubGVuZ3RoKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnMtPnFfZnJlZS5sb2NrKTsKKwljeDE4X3N0cmVhbV9jb25maWd1cmVfbWRscyhzKTsKIAlfY3gxOF9zdHJlYW1fbG9hZF9md19xdWV1ZShzKTsKIAogCS8qIGJlZ2luX2NhcHR1cmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuaAppbmRleCAxYWZjM2ZkLi40YTAxZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5oCkBAIC0yOCwxOCArMjgsMTggQEAKIGludCBjeDE4X3N0cmVhbXNfcmVnaXN0ZXIoc3RydWN0IGN4MTggKmN4KTsKIHZvaWQgY3gxOF9zdHJlYW1zX2NsZWFudXAoc3RydWN0IGN4MTggKmN4LCBpbnQgdW5yZWdpc3Rlcik7CiAKLS8qIFJlbGF0ZWQgdG8gc3VibWlzc2lvbiBvZiBidWZmZXJzIHRvIGZpcm13YXJlICovCisvKiBSZWxhdGVkIHRvIHN1Ym1pc3Npb24gb2YgbWRscyB0byBmaXJtd2FyZSAqLwogc3RhdGljIGlubGluZSB2b2lkIGN4MThfc3RyZWFtX2xvYWRfZndfcXVldWUoc3RydWN0IGN4MThfc3RyZWFtICpzKQogewogCXN0cnVjdCBjeDE4ICpjeCA9IHMtPmN4OwogCXF1ZXVlX3dvcmsoY3gtPm91dF93b3JrX3F1ZXVlLCAmcy0+b3V0X3dvcmtfb3JkZXIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3gxOF9zdHJlYW1fcHV0X2J1Zl9mdyhzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsCi0JCQkJCSAgc3RydWN0IGN4MThfYnVmZmVyICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF9zdHJlYW1fcHV0X21kbF9mdyhzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsCisJCQkJCSAgc3RydWN0IGN4MThfbWRsICptZGwpCiB7Ci0JLyogUHV0IGJ1ZiBvbiBxX2ZyZWU7IHRoZSBvdXQgd29yayBoYW5kbGVyIHdpbGwgbW92ZSBidWYocykgdG8gcV9idXN5ICovCi0JY3gxOF9lbnF1ZXVlKHMsIGJ1ZiwgJnMtPnFfZnJlZSk7CisJLyogUHV0IG1kbCBvbiBxX2ZyZWU7IHRoZSBvdXQgd29yayBoYW5kbGVyIHdpbGwgbW92ZSBtZGwocykgdG8gcV9idXN5ICovCisJY3gxOF9lbnF1ZXVlKHMsIG1kbCwgJnMtPnFfZnJlZSk7CiAJY3gxOF9zdHJlYW1fbG9hZF9md19xdWV1ZShzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12YmkuYwppbmRleCBjMmFlZjRhLi41NzRjMWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12YmkuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAKIC8qIENvbXByZXNzIHJhdyBWQkkgZm9ybWF0LCByZW1vdmVzIGxlYWRpbmcgU0FWIGNvZGVzIGFuZCBzdXJwbHVzIHNwYWNlCiAgICBhZnRlciB0aGUgZnJhbWUuICBSZXR1cm5zIG5ldyBjb21wcmVzc2VkIHNpemUuICovCisvKiBGSVhNRSAtIHRoaXMgZnVuY3Rpb24gaWdub3JlcyB0aGUgaW5wdXQgc2l6ZS4gKi8KIHN0YXRpYyB1MzIgY29tcHJlc3NfcmF3X2J1ZihzdHJ1Y3QgY3gxOCAqY3gsIHU4ICpidWYsIHUzMiBzaXplLCB1MzIgaGRyX3NpemUpCiB7CiAJdTMyIGxpbmVfc2l6ZSA9IHZiaV9hY3RpdmVfc2FtcGxlczsKQEAgLTE4NSw4ICsxODYsNyBAQAogCXJldHVybiBsaW5lOwogfQogCi12b2lkIGN4MThfcHJvY2Vzc192YmlfZGF0YShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAotCQkJICAgaW50IHN0cmVhbXR5cGUpCitzdGF0aWMgdm9pZCBfY3gxOF9wcm9jZXNzX3ZiaV9kYXRhKHN0cnVjdCBjeDE4ICpjeCwgc3RydWN0IGN4MThfYnVmZmVyICpidWYpCiB7CiAJLyoKIAkgKiBUaGUgQ1gyMzQxOCBwcm92aWRlcyBhIDEyIGJ5dGUgaGVhZGVyIGluIGl0cyByYXcgVkJJIGJ1ZmZlcnMgdG8gdXM6CkBAIC0yMDMsOSArMjAzLDYgQEAKIAl1MzIgcHRzOwogCWludCBsaW5lczsKIAotCWlmIChzdHJlYW10eXBlICE9IENYMThfRU5DX1NUUkVBTV9UWVBFX1ZCSSkKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBUaGUgQ1gyMzQxOCBzZW5kcyB1cyBkYXRhIHRoYXQgaXMgMzIgYml0IGxpdHRsZS1lbmRpYW4gc3dhcHBlZCwKIAkgKiBidXQgd2Ugd2FudCB0aGUgcmF3IFZCSSBieXRlcyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGluIHRoZSByYXN0ZXIKQEAgLTI1MCwzICsyNDcsMzEgQEAKIAkJY29weV92YmlfZGF0YShjeCwgbGluZXMsIHB0cyk7CiAJY3gtPnZiaS5mcmFtZSsrOwogfQorCit2b2lkIGN4MThfcHJvY2Vzc192YmlfZGF0YShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X21kbCAqbWRsLAorCQkJICAgaW50IHN0cmVhbXR5cGUpCit7CisJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CisJdTMyIG9yaWdfdXNlZDsKKworCWlmIChzdHJlYW10eXBlICE9IENYMThfRU5DX1NUUkVBTV9UWVBFX1ZCSSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBCaWcgYXNzdW1wdGlvbiBoZXJlOgorCSAqIEV2ZXJ5IGJ1ZmZlciBob29rZWQgdG8gdGhlIE1ETCdzIGJ1Zl9saXN0IGlzIGEgY29tcGxldGUgVkJJIGZyYW1lCisJICogdGhhdCBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkgKgorCSAqIFRvIGFzc3VtZSBhbnl0aGluZyBlbHNlIHdvdWxkIG1ha2UgdGhlIGNvZGUgaW4gdGhpcyBmaWxlCisJICogbW9yZSBjb21wbGV4LCBvciByZXF1aXJlIGV4dHJhIG1lbWNweSgpJ3MgdG8gbWFrZSB0aGUKKwkgKiBidWZmZXJzIHNhdGlzZnkgdGhlIGFib3ZlIGFzc3VtcHRpb24uICBJdCdzIGp1c3Qgc2ltcGxlciB0byBzZXQKKwkgKiB1cCB0aGUgZW5jb2RlciBidWZmZXIgdHJhbnNmZXJzIHRvIG1ha2UgdGhlIGFzc3VtcHRpb24gdHJ1ZS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1ZiwgJm1kbC0+YnVmX2xpc3QsIGxpc3QpIHsKKwkJb3JpZ191c2VkID0gYnVmLT5ieXRlc3VzZWQ7CisJCWlmIChvcmlnX3VzZWQgPT0gMCkKKwkJCWJyZWFrOworCQlfY3gxOF9wcm9jZXNzX3ZiaV9kYXRhKGN4LCBidWYpOworCQltZGwtPmJ5dGVzdXNlZCAtPSAob3JpZ191c2VkIC0gYnVmLT5ieXRlc3VzZWQpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZiaS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmJpLmgKaW5kZXggZTdlMWFlNC4uYjM2NWNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmJpLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmJpLmgKQEAgLTIxLDYgKzIxLDYgQEAKICAqICAwMjExMS0xMzA3ICBVU0EKICAqLwogCi12b2lkIGN4MThfcHJvY2Vzc192YmlfZGF0YShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAordm9pZCBjeDE4X3Byb2Nlc3NfdmJpX2RhdGEoc3RydWN0IGN4MTggKmN4LCBzdHJ1Y3QgY3gxOF9tZGwgKm1kbCwKIAkJCSAgIGludCBzdHJlYW10eXBlKTsKIGludCBjeDE4X3VzZWRfbGluZShzdHJ1Y3QgY3gxOCAqY3gsIGludCBsaW5lLCBpbnQgZmllbGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oCmluZGV4IDQ1NDk0YjAuLjljMGI1YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZlcnNpb24uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2RlZmluZSBDWDE4X0RSSVZFUl9OQU1FICJjeDE4IgogI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgQ1gxOF9EUklWRVJfVkVSU0lPTl9NSU5PUiAyCisjZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fTUlOT1IgMwogI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwgMAogCiAjZGVmaW5lIENYMThfVkVSU0lPTiBfX3N0cmluZ2lmeShDWDE4X0RSSVZFUl9WRVJTSU9OX01BSk9SKSAiLiIgX19zdHJpbmdpZnkoQ1gxOF9EUklWRVJfVkVSU0lPTl9NSU5PUikgIi4iIF9fc3RyaW5naWZ5KENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDIzNDE4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gyMzQxOC5oCmluZGV4IDk5NTZhYmYuLjg2ODgwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDIzNDE4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MjM0MTguaApAQCAtMzYzLDcgKzM2Myw3IEBACiAvKiBEZXNjcmlwdGlvbjogVGhpcyBjb21tYW5kIHByb3ZpZGVzIHRoZSBvZmZzZXQgdG8gYSBNZW1vcnkgRGVzY3JpcHRvciBMaXN0CiAgICBJTlswXSAtIFRhc2sgaGFuZGxlLiBIYW5kbGUgb2YgdGhlIHRhc2sgdG8gc3RhcnQKICAgIElOWzFdIC0gT2Zmc2V0IG9mIHRoZSBNREwgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb2NhbCBERFIuCi0gICBJTlsyXSAtIE51bWJlciBvZiBjeDE4X21kbCBzdHJ1Y3R1cmVzIGluIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5IElOWzFdCisgICBJTlsyXSAtIE51bWJlciBvZiBjeDE4X21kbF9lbnQgc3RydWN0dXJlcyBpbiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSBJTlsxXQogICAgSU5bM10gLSBCdWZmZXIgSUQKICAgIElOWzRdIC0gVG90YWwgYnVmZmVyIGxlbmd0aAogICAgUmV0dXJuQ29kZSAtIE9uZSBvZiB0aGUgRVJSX0RFXy4uLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtYXZjb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1hdmNvcmUuYwppbmRleCAyOGY0OGY0Li5jMjE3NDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1hdmNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1hdmNvcmUuYwpAQCAtMjQxNCw5ICsyNDE0LDExIEBACiAJCWN4MjMxeHhfaW5mbygiTm8gQUNLIGFmdGVyICVkIG1zZWMgLUdQSU8gSTJDIGZhaWxlZCEiLAogCQkJICAgICBuSW5pdCAqIDEwKTsKIAotCS8qIHJlYWRBY2sKLQkgICB0aHJvdXRoIGNsb2NrIHN0cmV0Y2ggLHNsYXZlIGhhcyBnaXZlbiBhIFNDTCBzaWduYWwsCi0JICAgc28gdGhlIFNEQSBkYXRhIGNhbiBiZSBkaXJlY3RseSByZWFkLiAgKi8KKwkvKgorCSAqIHJlYWRBY2sKKwkgKiB0aHJvdWdoIGNsb2NrIHN0cmV0Y2gsIHNsYXZlIGhhcyBnaXZlbiBhIFNDTCBzaWduYWwsCisJICogc28gdGhlIFNEQSBkYXRhIGNhbiBiZSBkaXJlY3RseSByZWFkLgorCSAqLwogCXN0YXR1cyA9IGN4MjMxeHhfZ2V0X2dwaW9fYml0KGRldiwgZGV2LT5ncGlvX2RpciwgKHU4ICopJmRldi0+Z3Bpb192YWwpOwogCiAJaWYgKChkZXYtPmdwaW9fdmFsICYgMSA8PCBkZXYtPmJvYXJkLnR1bmVyX3NkYV9ncGlvKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtaW5wdXQuYwppbmRleCA0OGYyMmZhLi5jZDEzNWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWlucHV0LmMKQEAgLTEyNiw4ICsxMjYsNyBAQAogCiAJaWYgKGRvX3NlbmRrZXkpIHsKIAkJZHByaW50aygic2VuZGluZyBrZXlwcmVzc1xuIik7Ci0JCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBwb2xsX3Jlc3VsdC5yY19kYXRhWzBdLAotCQkJCSBwb2xsX3Jlc3VsdC5yY19kYXRhWzBdKTsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIHBvbGxfcmVzdWx0LnJjX2RhdGFbMF0pOwogCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOwogCX0KIApAQCAtMTk4LDcgKzE5NywxMSBAQAogCXVzYl9tYWtlX3BhdGgoZGV2LT51ZGV2LCBpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSk7CiAJc3RybGNhdChpci0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoaXItPnBoeXMpKTsKIAotCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBJUl9UWVBFX09USEVSLCBkZXYtPmJvYXJkLmlyX2NvZGVzKTsKKwllcnIgPSBpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgSVJfVFlQRV9PVEhFUiwKKwkJCSAgICBkZXYtPmJvYXJkLmlyX2NvZGVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKIAlpbnB1dF9kZXYtPm5hbWUgPSBpci0+bmFtZTsKIAlpbnB1dF9kZXYtPnBoeXMgPSBpci0+cGh5czsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwpAQCAtMjIzLDYgKzIyNiw3IEBACiAJY3gyMzF4eF9pcl9zdG9wKGlyKTsKIAlkZXYtPmlyID0gTlVMTDsKIGVycl9vdXRfZnJlZToKKwlpcl9pbnB1dF9mcmVlKGlucHV0X2Rldik7CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShpcik7CiAJcmV0dXJuIGVycjsKQEAgLTIzNyw2ICsyNDEsNyBAQAogCQlyZXR1cm4gMDsKIAogCWN4MjMxeHhfaXJfc3RvcChpcik7CisJaXJfaW5wdXRfZnJlZShpci0+aW5wdXQpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlyLT5pbnB1dCk7CiAJa2ZyZWUoaXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtdmlkZW8uYwppbmRleCAzNjUwMzcyLi5kMDk1YWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LXZpZGVvLmMKQEAgLTIxMDYsNyArMjEwNiw3IEBACiAJCX0KIAogCQkvKiBTYXZlIHNvbWUgcG93ZXIgYnkgcHV0dGluZyB0dW5lciB0byBzbGVlcCAqLwotCQljYWxsX2FsbChkZXYsIHR1bmVyLCBzX3N0YW5kYnkpOworCQljYWxsX2FsbChkZXYsIGNvcmUsIHNfcG93ZXIsIDApOwogCiAJCS8qIGRvIHRoaXMgYmVmb3JlIHNldHRpbmcgYWx0ZXJuYXRlISAqLwogCQljeDIzMXh4X3VuaW5pdF9pc29jKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCmluZGV4IGZkM2ZjM2UuLmJjZGRhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCkBAIC0xOCw3ICsxOCw5IEBACiAJc2VsZWN0IERWQl9UREExMDA0OCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTE5CUDIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFY2MTEwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9DWDI0MTE2IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFYwOTAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9EUzMwMDAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfTVQyMTMxIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfWEMyMDI4IGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfVERBODI5MCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvTWFrZWZpbGUKaW5kZXggYWI4ZWEzNS4uNTc4N2FlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKIGN4MjM4ODUtb2Jqcwk6PSBjeDIzODg1LWNhcmRzLm8gY3gyMzg4NS12aWRlby5vIGN4MjM4ODUtdmJpLm8gXAogCQkgICAgY3gyMzg4NS1jb3JlLm8gY3gyMzg4NS1pMmMubyBjeDIzODg1LWR2Yi5vIGN4MjM4ODUtNDE3Lm8gXAotCQkgICAgbmV0dXAtaW5pdC5vIGNpbWF4Mi5vIG5ldHVwLWVlcHJvbS5vCisJCSAgICBjeDIzODg1LWlvY3RsLm8gY3gyMzg4NS1pci5vIGN4MjM4ODUtaW5wdXQubyBjeDIzODg4LWlyLm8gXAorCQkgICAgbmV0dXAtaW5pdC5vIGNpbWF4Mi5vIG5ldHVwLWVlcHJvbS5vIGN4MjM4ODUtZjMwMC5vCiAKIG9iai0kKENPTkZJR19WSURFT19DWDIzODg1KSArPSBjeDIzODg1Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtNDE3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwppbmRleCA2YzNiNTFjLi4wZWVkODUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2N4MjM0MXguaD4KIAogI2luY2x1ZGUgImN4MjM4ODUuaCIKKyNpbmNsdWRlICJjeDIzODg1LWlvY3RsLmgiCiAKICNkZWZpbmUgQ1gyMzg4NV9GSVJNX0lNQUdFX1NJWkUgMzc2ODM2CiAjZGVmaW5lIENYMjM4ODVfRklSTV9JTUFHRV9OQU1FICJ2NGwtY3gyMzg4NS1lbmMuZnciCkBAIC0zMTgsNyArMzE5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbWM0MTdfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUxNiBhZGRyZXNzLCB1MzIgdmFsdWUpCitpbnQgbWM0MTdfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUxNiBhZGRyZXNzLCB1MzIgdmFsdWUpCiB7CiAJdTMyIHJlZ3ZhbDsKIApAQCAtMzgyLDcgKzM4Myw3IEBACiAJcmV0dXJuIG1jNDE3X3dhaXRfcmVhZHkoZGV2KTsKIH0KIAotc3RhdGljIGludCBtYzQxN19yZWdpc3Rlcl9yZWFkKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MTYgYWRkcmVzcywgdTMyICp2YWx1ZSkKK2ludCBtYzQxN19yZWdpc3Rlcl9yZWFkKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MTYgYWRkcmVzcywgdTMyICp2YWx1ZSkKIHsKIAlpbnQgcmV0dmFsOwogCXUzMiByZWd2YWw7CkBAIC0xNzI0LDYgKzE3MjUsMTEgQEAKIAkudmlkaW9jX2xvZ19zdGF0dXMJID0gdmlkaW9jX2xvZ19zdGF0dXMsCiAJLnZpZGlvY19xdWVyeW1lbnUJID0gdmlkaW9jX3F1ZXJ5bWVudSwKIAkudmlkaW9jX3F1ZXJ5Y3RybAkgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jaGlwX2lkZW50CSA9IGN4MjM4ODVfZ19jaGlwX2lkZW50LAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwkudmlkaW9jX2dfcmVnaXN0ZXIJID0gY3gyMzg4NV9nX3JlZ2lzdGVyLAorCS52aWRpb2Nfc19yZWdpc3RlcgkgPSBjeDIzODg1X3NfcmVnaXN0ZXIsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjM4ODVfbXBlZ190ZW1wbGF0ZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCmluZGV4IGJmZGY3OWYuLjFlYzQ4MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImN4MjM4ODUuaCIKICNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKICNpbmNsdWRlICJuZXR1cC1pbml0LmgiCisjaW5jbHVkZSAiY3gyMzg4OC1pci5oIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGJvYXJkIGNvbmZpZyBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTk5LDExICsyMDAsNjEgQEAKIAl9LAogCVtDWDIzODg1X0JPQVJEX01ZR0lDQV9YODUwNl0gPSB7CiAJCS5uYW1lCQk9ICJNeWdpY2EgWDg1MDYgRE1CLVRIIiwKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9YQzUwMDAsCisJCS50dW5lcl9hZGRyID0gMHg2MSwKKwkJLnBvcnRhCQk9IENYMjM4ODVfQU5BTE9HX1ZJREVPLAogCQkucG9ydGIJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKKwkJLmlucHV0CQk9IHsKKwkJCXsKKwkJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX1RFTEVWSVNJT04sCisJCQkJLnZtdXggICA9IENYMjU4NDBfQ09NUE9TSVRFMiwKKwkJCX0sCisJCQl7CisJCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUxLAorCQkJCS52bXV4ICAgPSBDWDI1ODQwX0NPTVBPU0lURTgsCisJCQl9LAorCQkJeworCQkJCS50eXBlICAgPSBDWDIzODg1X1ZNVVhfU1ZJREVPLAorCQkJCS52bXV4ICAgPSBDWDI1ODQwX1NWSURFT19MVU1BMyB8CisJCQkJCQlDWDI1ODQwX1NWSURFT19DSFJPTUE0LAorCQkJfSwKKwkJCXsKKwkJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX0NPTVBPTkVOVCwKKwkJCQkudm11eCAgID0gQ1gyNTg0MF9DT01QT05FTlRfT04gfAorCQkJCQlDWDI1ODQwX1ZJTjFfQ0gxIHwKKwkJCQkJQ1gyNTg0MF9WSU42X0NIMiB8CisJCQkJCUNYMjU4NDBfVklON19DSDMsCisJCQl9LAorCQl9LAogCX0sCiAJW0NYMjM4ODVfQk9BUkRfTUFHSUNQUk9fUFJPSERUVkUyXSA9IHsKIAkJLm5hbWUJCT0gIk1hZ2ljLVBybyBQcm9IRFRWIEV4dHJlbWUgMiIsCisJCS50dW5lcl90eXBlID0gVFVORVJfWEM1MDAwLAorCQkudHVuZXJfYWRkciA9IDB4NjEsCisJCS5wb3J0YQkJPSBDWDIzODg1X0FOQUxPR19WSURFTywKIAkJLnBvcnRiCQk9IENYMjM4ODVfTVBFR19EVkIsCisJCS5pbnB1dAkJPSB7CisJCQl7CisJCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9URUxFVklTSU9OLAorCQkJCS52bXV4ICAgPSBDWDI1ODQwX0NPTVBPU0lURTIsCisJCQl9LAorCQkJeworCQkJCS50eXBlICAgPSBDWDIzODg1X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCQkudm11eCAgID0gQ1gyNTg0MF9DT01QT1NJVEU4LAorCQkJfSwKKwkJCXsKKwkJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX1NWSURFTywKKwkJCQkudm11eCAgID0gQ1gyNTg0MF9TVklERU9fTFVNQTMgfAorCQkJCQkJQ1gyNTg0MF9TVklERU9fQ0hST01BNCwKKwkJCX0sCisJCQl7CisJCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT05FTlQsCisJCQkJLnZtdXggICA9IENYMjU4NDBfQ09NUE9ORU5UX09OIHwKKwkJCQkJQ1gyNTg0MF9WSU4xX0NIMSB8CisJCQkJCUNYMjU4NDBfVklONl9DSDIgfAorCQkJCQlDWDI1ODQwX1ZJTjdfQ0gzLAorCQkJfSwKKwkJfSwKIAl9LAogCVtDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwXSA9IHsKIAkJLm5hbWUJCT0gIkhhdXBwYXVnZSBXaW5UVi1IVlIxODUwIiwKQEAgLTIxNCw2ICsyNjUsMTUgQEAKIAkJLm5hbWUJCT0gIkNvbXBybyBWaWRlb01hdGUgRTgwMCIsCiAJCS5wb3J0YwkJPSBDWDIzODg1X01QRUdfRFZCLAogCX0sCisJW0NYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTBdID0geworCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjEyOTAiLAorCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKKwl9LAorCVtDWDIzODg1X0JPQVJEX01ZR0lDQV9YODU1OFBST10gPSB7CisJCS5uYW1lCQk9ICJNeWdpY2EgWDg1NTggUFJPIERNQi1USCIsCisJCS5wb3J0YgkJPSBDWDIzODg1X01QRUdfRFZCLAorCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDIzODg1X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3gyMzg4NV9ib2FyZHMpOwogCkBAIC0zNDksNiArNDA5LDE0IEBACiAJCS5zdWJ2ZW5kb3IgPSAweDE4NTgsCiAJCS5zdWJkZXZpY2UgPSAweGU4MDAsCiAJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTgwMCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDg1NTEsCisJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MTRmMSwKKwkJLnN1YmRldmljZSA9IDB4ODU3OCwKKwkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfTVlHSUNBX1g4NTU4UFJPLAogCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGN4MjM4ODVfaWRjb3VudCA9IEFSUkFZX1NJWkUoY3gyMzg4NV9zdWJpZHMpOwpAQCAtNTA5LDkgKzU3NywxMyBAQAogCQkgKiBEVkItVCBhbmQgTVBFRzIgSFcgRW5jb2RlciAqLwogCQlicmVhazsKIAljYXNlIDg1MDIxOgotCQkvKiBXaW5UVi1IVlIxODUwIChQQ0llLCBPRU0sIFJDQSBpbiwgSVIsIEZNLAorCQkvKiBXaW5UVi1IVlIxODUwIChQQ0llLCBSZXRhaWwsIDMuNW1tIGluLCBJUiwgRk0sCiAJCQlEdWFsIGNoYW5uZWwgQVRTQyBhbmQgTVBFRzIgSFcgRW5jb2RlciAqLwogCQlicmVhazsKKwljYXNlIDg1NzIxOgorCQkvKiBXaW5UVi1IVlIxMjkwIChQQ0llLCBPRU0sIFJDQSBpbiwgSVIsCisJCQlEdWFsIGNoYW5uZWwgQVRTQyBhbmQgQmFzaWMgYW5hbG9nICovCisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXJuaW5nOiAiCiAJCQkidW5rbm93biBoYXVwcGF1Z2UgbW9kZWwgIyVkXG4iLApAQCAtNzEwLDEwICs3ODIsMTQgQEAKIAkJY3hfc2V0KEdQMF9JTywgMHgwMDA0MDAwNCk7CiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9UQlNfNjkyMDoKLQljYXNlIENYMjM4ODVfQk9BUkRfVEVWSUlfUzQ3MDoKIAkJY3hfd3JpdGUoTUM0MTdfQ1RMLCAweDAwMDAwMDM2KTsKIAkJY3hfd3JpdGUoTUM0MTdfT0VOLCAweDAwMDAxMDAwKTsKLQkJY3hfd3JpdGUoTUM0MTdfUldELCAweDAwMDAxODAwKTsKKwkJY3hfc2V0KE1DNDE3X1JXRCwgMHgwMDAwMDAwMik7CisJCW1kZWxheSgyMDApOworCQljeF9jbGVhcihNQzQxN19SV0QsIDB4MDAwMDA4MDApOworCQltZGVsYXkoMjAwKTsKKwkJY3hfc2V0KE1DNDE3X1JXRCwgMHgwMDAwMDgwMCk7CisJCW1kZWxheSgyMDApOwogCQlicmVhazsKIAljYXNlIENYMjM4ODVfQk9BUkRfTkVUVVBfRFVBTF9EVkJTMl9DSToKIAkJLyogR1BJTy0wIElOVEEgZnJvbSBDaU1heDEKQEAgLTc1OCwxNSArODM0LDI2IEBACiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9NWUdJQ0FfWDg1MDY6CiAJY2FzZSBDWDIzODg1X0JPQVJEX01BR0lDUFJPX1BST0hEVFZFMjoKKwkJLyogR1BJTy0wICgwKUFuYWxvZyAvICgxKURpZ2l0YWwgVFYgKi8KIAkJLyogR1BJTy0xIHJlc2V0IFhDNTAwMCAqLwogCQkvKiBHUElPLTIgcmVzZXQgTEdTOEdMNSAvIExHUzhHNzUgKi8KLQkJY3hfc2V0KEdQMF9JTywgMHgwMDA2MDAwMCk7Ci0JCWN4X2NsZWFyKEdQMF9JTywgMHgwMDAwMDAwNik7CisJCWN4MjM4ODVfZ3Bpb19lbmFibGUoZGV2LCBHUElPXzAgfCBHUElPXzEgfCBHUElPXzIsIDEpOworCQljeDIzODg1X2dwaW9fY2xlYXIoZGV2LCBHUElPXzEgfCBHUElPXzIpOwogCQltZGVsYXkoMTAwKTsKLQkJY3hfc2V0KEdQMF9JTywgMHgwMDA2MDAwNik7CisJCWN4MjM4ODVfZ3Bpb19zZXQoZGV2LCBHUElPXzAgfCBHUElPXzEgfCBHUElPXzIpOworCQltZGVsYXkoMTAwKTsKKwkJYnJlYWs7CisJY2FzZSBDWDIzODg1X0JPQVJEX01ZR0lDQV9YODU1OFBSTzoKKwkJLyogR1BJTy0wIHJlc2V0IGZpcnN0IEFUQk04ODMwICovCisJCS8qIEdQSU8tMSByZXNldCBzZWNvbmQgQVRCTTg4MzAgKi8KKwkJY3gyMzg4NV9ncGlvX2VuYWJsZShkZXYsIEdQSU9fMCB8IEdQSU9fMSwgMSk7CisJCWN4MjM4ODVfZ3Bpb19jbGVhcihkZXYsIEdQSU9fMCB8IEdQSU9fMSk7CisJCW1kZWxheSgxMDApOworCQljeDIzODg1X2dwaW9fc2V0KGRldiwgR1BJT18wIHwgR1BJT18xKTsKIAkJbWRlbGF5KDEwMCk7CiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJCS8qIEdQSU8tMCA2NTZfQ0xLICovCiAJCS8qIEdQSU8tMSA2NTZfRDAgKi8KIAkJLyogR1BJTy0yIFdha2UjICovCkBAIC04MDEsNiArODg4LDcgQEAKIAogaW50IGN4MjM4ODVfaXJfaW5pdChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKIHsKKwlpbnQgcmV0ID0gMDsKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNTAwOgpAQCAtODEyLDE1ICs5MDAsNDYgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzU6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjU1OgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMDoKLQljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJCS8qIEZJWE1FOiBJbXBsZW1lbnQgbWUgKi8KIAkJYnJlYWs7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKKwkJcmV0ID0gY3gyMzg4OF9pcl9wcm9iZShkZXYpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWRldi0+c2RfaXIgPSBjeDIzODg1X2ZpbmRfaHcoZGV2LCBDWDIzODg1X0hXXzg4OF9JUik7CisJCWRldi0+cGNpX2lycW1hc2sgfD0gUENJX01TS19JUjsKKwkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfRFVBTF9FWFA6CiAJCXJlcXVlc3RfbW9kdWxlKCJpci1rYmQtaTJjIik7CiAJCWJyZWFrOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY3gyMzg4NV9pcl9maW5pKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQoreworCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CisJCWRldi0+cGNpX2lycW1hc2sgJj0gflBDSV9NU0tfSVI7CisJCWN4X2NsZWFyKFBDSV9JTlRfTVNLLCBQQ0lfTVNLX0lSKTsKKwkJY3gyMzg4OF9pcl9yZW1vdmUoZGV2KTsKKwkJZGV2LT5zZF9pciA9IE5VTEw7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBjeDIzODg1X2lyX3BjaV9pbnRfZW5hYmxlKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQoreworCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CisJCWlmIChkZXYtPnNkX2lyICYmIChkZXYtPnBjaV9pcnFtYXNrICYgUENJX01TS19JUikpCisJCQljeF9zZXQoUENJX0lOVF9NU0ssIFBDSV9NU0tfSVIpOworCQlicmVhazsKKwl9CiB9CiAKIHZvaWQgY3gyMzg4NV9jYXJkX3NldHVwKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQpAQCAtODUzLDYgKzk3Miw3IEBACiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjU1OgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCQlpZiAoZGV2LT5pMmNfYnVzWzBdLmkyY19yYyA9PSAwKQogCQkJaGF1cHBhdWdlX2VlcHJvbShkZXYsIGVlcHJvbSsweGMwKTsKIAkJYnJlYWs7CkBAIC04ODYsOCArMTAwNiwxMiBAQAogCQl0czItPnRzX2Nsa19lbl92YWwgPSAweDE7IC8qIEVuYWJsZSBUU19DTEsgKi8KIAkJdHMyLT5zcmNfc2VsX3ZhbCAgID0gQ1gyMzg4NV9TUkNfU0VMX1BBUkFMTEVMX01QRUdfVklERU87CiAJCWJyZWFrOwotCWNhc2UgQ1gyMzg4NV9CT0FSRF9URVZJSV9TNDcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9UQlNfNjkyMDoKKwkJdHMxLT5nZW5fY3RybF92YWwgID0gMHg0OyAvKiBQYXJhbGxlbCAqLworCQl0czEtPnRzX2Nsa19lbl92YWwgPSAweDE7IC8qIEVuYWJsZSBUU19DTEsgKi8KKwkJdHMxLT5zcmNfc2VsX3ZhbCAgID0gQ1gyMzg4NV9TUkNfU0VMX1BBUkFMTEVMX01QRUdfVklERU87CisJCWJyZWFrOworCWNhc2UgQ1gyMzg4NV9CT0FSRF9URVZJSV9TNDcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9EVkJXT1JMRF8yMDA1OgogCQl0czEtPmdlbl9jdHJsX3ZhbCAgPSAweDU7IC8qIFBhcmFsbGVsICovCiAJCXRzMS0+dHNfY2xrX2VuX3ZhbCA9IDB4MTsgLyogRW5hYmxlIFRTX0NMSyAqLwpAQCAtOTA3LDYgKzEwMzEsMTQgQEAKIAkJdHMxLT50c19jbGtfZW5fdmFsID0gMHgxOyAvKiBFbmFibGUgVFNfQ0xLICovCiAJCXRzMS0+c3JjX3NlbF92YWwgICA9IENYMjM4ODVfU1JDX1NFTF9QQVJBTExFTF9NUEVHX1ZJREVPOwogCQlicmVhazsKKwljYXNlIENYMjM4ODVfQk9BUkRfTVlHSUNBX1g4NTU4UFJPOgorCQl0czEtPmdlbl9jdHJsX3ZhbCAgPSAweDU7IC8qIFBhcmFsbGVsICovCisJCXRzMS0+dHNfY2xrX2VuX3ZhbCA9IDB4MTsgLyogRW5hYmxlIFRTX0NMSyAqLworCQl0czEtPnNyY19zZWxfdmFsICAgPSBDWDIzODg1X1NSQ19TRUxfUEFSQUxMRUxfTVBFR19WSURFTzsKKwkJdHMyLT5nZW5fY3RybF92YWwgID0gMHhjOyAvKiBTZXJpYWwgYnVzICsgcHVuY3R1cmVkIGNsb2NrICovCisJCXRzMi0+dHNfY2xrX2VuX3ZhbCA9IDB4MTsgLyogRW5hYmxlIFRTX0NMSyAqLworCQl0czItPnNyY19zZWxfdmFsICAgPSBDWDIzODg1X1NSQ19TRUxfUEFSQUxMRUxfTVBFR19WSURFTzsKKwkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTUwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDBROgpAQCAtOTIyLDYgKzEwNTQsNyBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTgwMDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJZGVmYXVsdDoKIAkJdHMyLT5nZW5fY3RybF92YWwgID0gMHhjOyAvKiBTZXJpYWwgYnVzICsgcHVuY3R1cmVkIGNsb2NrICovCiAJCXRzMi0+dHNfY2xrX2VuX3ZhbCA9IDB4MTsgLyogRW5hYmxlIFRTX0NMSyAqLwpAQCAtOTM5LDYgKzEwNzIsMTAgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAljYXNlIENYMjM4ODVfQk9BUkRfTkVUVVBfRFVBTF9EVkJTMl9DSToKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FODAwOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKKwljYXNlIENYMjM4ODVfQk9BUkRfTVlHSUNBX1g4NTA2OgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9NQUdJQ1BST19QUk9IRFRWRTI6CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCQlkZXYtPnNkX2N4MjU4NDAgPSB2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LAogCQkJCSZkZXYtPmkyY19idXNbMl0uaTJjX2FkYXAsCiAJCQkJImN4MjU4NDAiLCAiY3gyNTg0MCIsIDB4ODggPj4gMSwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKaW5kZXggYzMxMjg0Yi4uMDRiMTJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYwpAQCAtMzIsNiArMzIsOSBAQAogCiAjaW5jbHVkZSAiY3gyMzg4NS5oIgogI2luY2x1ZGUgImNpbWF4Mi5oIgorI2luY2x1ZGUgImN4MjM4ODgtaXIuaCIKKyNpbmNsdWRlICJjeDIzODg1LWlyLmgiCisjaW5jbHVkZSAiY3gyMzg4NS1pbnB1dC5oIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgY3gyMzg4NSBiYXNlZCBUViBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiIpOwpAQCAtNzUzLDYgKzc1NiwyMyBAQAogCQkJX19mdW5jX18sIGRldi0+aHdyZXZpc2lvbik7CiB9CiAKKy8qIEZpbmQgdGhlIGZpcnN0IHY0bDJfc3ViZGV2IG1lbWJlciBvZiB0aGUgZ3JvdXAgaWQgaW4gaHcgKi8KK3N0cnVjdCB2NGwyX3N1YmRldiAqY3gyMzg4NV9maW5kX2h3KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgaHcpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpyZXN1bHQgPSBOVUxMOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisKKwlzcGluX2xvY2soJmRldi0+djRsMl9kZXYubG9jayk7CisJdjRsMl9kZXZpY2VfZm9yX2VhY2hfc3ViZGV2KHNkLCAmZGV2LT52NGwyX2RldikgeworCQlpZiAoc2QtPmdycF9pZCA9PSBodykgeworCQkJcmVzdWx0ID0gc2Q7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZGV2LT52NGwyX2Rldi5sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiBzdGF0aWMgaW50IGN4MjM4ODVfZGV2X3NldHVwKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQogewogCWludCBpOwpAQCAtODk5LDcgKzkxOSw3IEBACiAJY3gyMzg4NV9pMmNfcmVnaXN0ZXIoJmRldi0+aTJjX2J1c1sxXSk7CiAJY3gyMzg4NV9pMmNfcmVnaXN0ZXIoJmRldi0+aTJjX2J1c1syXSk7CiAJY3gyMzg4NV9jYXJkX3NldHVwKGRldik7Ci0JY2FsbF9hbGwoZGV2LCB0dW5lciwgc19zdGFuZGJ5KTsKKwljYWxsX2FsbChkZXYsIGNvcmUsIHNfcG93ZXIsIDApOwogCWN4MjM4ODVfaXJfaW5pdChkZXYpOwogCiAJaWYgKGN4MjM4ODVfYm9hcmRzW2Rldi0+Ym9hcmRdLnBvcnRhID09IENYMjM4ODVfQU5BTE9HX1ZJREVPKSB7CkBAIC0xNjM3LDYgKzE2NTcsNyBAQAogCXUzMiB0czFfc3RhdHVzLCB0czFfbWFzazsKIAl1MzIgdHMyX3N0YXR1cywgdHMyX21hc2s7CiAJaW50IHZpZGFfY291bnQgPSAwLCB0czFfY291bnQgPSAwLCB0czJfY291bnQgPSAwLCBoYW5kbGVkID0gMDsKKwlib29sIGlyX2hhbmRsZWQgPSBmYWxzZTsKIAogCXBjaV9zdGF0dXMgPSBjeF9yZWFkKFBDSV9JTlRfU1RBVCk7CiAJcGNpX21hc2sgPSBjeF9yZWFkKFBDSV9JTlRfTVNLKTsKQEAgLTE2NjIsMTggKzE2ODMsMTIgQEAKIAlkcHJpbnRrKDcsICJ0czJfc3RhdHVzOiAweCUwOHggIHRzMl9tYXNrOiAweCUwOHggY291bnQ6IDB4JXhcbiIsCiAJCXRzMl9zdGF0dXMsIHRzMl9tYXNrLCB0czJfY291bnQpOwogCi0JaWYgKChwY2lfc3RhdHVzICYgUENJX01TS19SSVNDX1JEKSB8fAotCSAgICAocGNpX3N0YXR1cyAmIFBDSV9NU0tfUklTQ19XUikgfHwKLQkgICAgKHBjaV9zdGF0dXMgJiBQQ0lfTVNLX0FMX1JEKSB8fAotCSAgICAocGNpX3N0YXR1cyAmIFBDSV9NU0tfQUxfV1IpIHx8Ci0JICAgIChwY2lfc3RhdHVzICYgUENJX01TS19BUEJfRE1BKSB8fAotCSAgICAocGNpX3N0YXR1cyAmIFBDSV9NU0tfVklEX0MpIHx8Ci0JICAgIChwY2lfc3RhdHVzICYgUENJX01TS19WSURfQikgfHwKLQkgICAgKHBjaV9zdGF0dXMgJiBQQ0lfTVNLX1ZJRF9BKSB8fAotCSAgICAocGNpX3N0YXR1cyAmIFBDSV9NU0tfQVVEX0lOVCkgfHwKLQkgICAgKHBjaV9zdGF0dXMgJiBQQ0lfTVNLX0FVRF9FWFQpIHx8Ci0JICAgIChwY2lfc3RhdHVzICYgUENJX01TS19HUElPMCkgfHwKLQkgICAgKHBjaV9zdGF0dXMgJiBQQ0lfTVNLX0dQSU8xKSkgeworCWlmIChwY2lfc3RhdHVzICYgKFBDSV9NU0tfUklTQ19SRCB8IFBDSV9NU0tfUklTQ19XUiB8CisJCQkgIFBDSV9NU0tfQUxfUkQgICB8IFBDSV9NU0tfQUxfV1IgICB8IFBDSV9NU0tfQVBCX0RNQSB8CisJCQkgIFBDSV9NU0tfVklEX0MgICB8IFBDSV9NU0tfVklEX0IgICB8IFBDSV9NU0tfVklEX0EgICB8CisJCQkgIFBDSV9NU0tfQVVEX0lOVCB8IFBDSV9NU0tfQVVEX0VYVCB8CisJCQkgIFBDSV9NU0tfR1BJTzAgICB8IFBDSV9NU0tfR1BJTzEgICB8CisJCQkgIFBDSV9NU0tfSVIpKSB7CiAKIAkJaWYgKHBjaV9zdGF0dXMgJiBQQ0lfTVNLX1JJU0NfUkQpCiAJCQlkcHJpbnRrKDcsICIgKFBDSV9NU0tfUklTQ19SRCAgIDB4JTA4eClcbiIsCkBAIC0xNzIyLDYgKzE3MzcsMTAgQEAKIAkJaWYgKHBjaV9zdGF0dXMgJiBQQ0lfTVNLX0dQSU8xKQogCQkJZHByaW50ayg3LCAiIChQQ0lfTVNLX0dQSU8xICAgICAweCUwOHgpXG4iLAogCQkJCVBDSV9NU0tfR1BJTzEpOworCisJCWlmIChwY2lfc3RhdHVzICYgUENJX01TS19JUikKKwkJCWRwcmludGsoNywgIiAoUENJX01TS19JUiAgICAgICAgMHglMDh4KVxuIiwKKwkJCQlQQ0lfTVNLX0lSKTsKIAl9CiAKIAlpZiAoY3gyMzg4NV9ib2FyZHNbZGV2LT5ib2FyZF0uY2ltYXggPiAwICYmCkBAIC0xNzUyLDEyICsxNzcxLDQ4IEBACiAJaWYgKHZpZGFfc3RhdHVzKQogCQloYW5kbGVkICs9IGN4MjM4ODVfdmlkZW9faXJxKGRldiwgdmlkYV9zdGF0dXMpOwogCisJaWYgKHBjaV9zdGF0dXMgJiBQQ0lfTVNLX0lSKSB7CisJCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9pciwgaXIsIGludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUsCisJCQkJIHBjaV9zdGF0dXMsICZpcl9oYW5kbGVkKTsKKwkJaWYgKGlyX2hhbmRsZWQpCisJCQloYW5kbGVkKys7CisJfQorCiAJaWYgKGhhbmRsZWQpCiAJCWN4X3dyaXRlKFBDSV9JTlRfU1RBVCwgcGNpX3N0YXR1cyk7CiBvdXQ6CiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CiAKK3N0YXRpYyB2b2lkIGN4MjM4ODVfdjRsMl9kZXZfbm90aWZ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICAgIHVuc2lnbmVkIGludCBub3RpZmljYXRpb24sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldjsKKworCWlmIChzZCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlkZXYgPSB0b19jeDIzODg1KHNkLT52NGwyX2Rldik7CisKKwlzd2l0Y2ggKG5vdGlmaWNhdGlvbikgeworCWNhc2UgVjRMMl9TVUJERVZfSVJfUlhfTk9USUZZOiAvKiBDYWxsZWQgaW4gYW4gSVJRIGNvbnRleHQgKi8KKwkJaWYgKHNkID09IGRldi0+c2RfaXIpCisJCQljeDIzODg1X2lyX3J4X3Y0bDJfZGV2X25vdGlmeShzZCwgKih1MzIgKilhcmcpOworCQlicmVhazsKKwljYXNlIFY0TDJfU1VCREVWX0lSX1RYX05PVElGWTogLyogQ2FsbGVkIGluIGFuIElSUSBjb250ZXh0ICovCisJCWlmIChzZCA9PSBkZXYtPnNkX2lyKQorCQkJY3gyMzg4NV9pcl90eF92NGwyX2Rldl9ub3RpZnkoc2QsICoodTMyICopYXJnKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBjeDIzODg1X3Y0bDJfZGV2X25vdGlmeV9pbml0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQoreworCUlOSVRfV09SSygmZGV2LT5pcl9yeF93b3JrLCBjeDIzODg1X2lyX3J4X3dvcmtfaGFuZGxlcik7CisJSU5JVF9XT1JLKCZkZXYtPmlyX3R4X3dvcmssIGN4MjM4ODVfaXJfdHhfd29ya19oYW5kbGVyKTsKKwlkZXYtPnY0bDJfZGV2Lm5vdGlmeSA9IGN4MjM4ODVfdjRsMl9kZXZfbm90aWZ5OworfQorCiBzdGF0aWMgaW5saW5lIGludCBlbmNvZGVyX29uX3BvcnRiKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQogewogCXJldHVybiBjeDIzODg1X2JvYXJkc1tkZXYtPmJvYXJkXS5wb3J0YiA9PSBDWDIzODg1X01QRUdfRU5DT0RFUjsKQEAgLTE4MTYsNiArMTg3MSwyNiBAQAogCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWRcbiIsIGRldi0+bmFtZSk7CiB9CiAKK3UzMiBjeDIzODg1X2dwaW9fZ2V0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgbWFzaykKK3sKKwlpZiAobWFzayAmIDB4MDAwMDAwMDcpCisJCXJldHVybiAoY3hfcmVhZChHUDBfSU8pID4+IDgpICYgbWFzayAmIDB4NzsKKworCWlmIChtYXNrICYgMHgwMDA3ZmZmOCkgeworCQlpZiAoZW5jb2Rlcl9vbl9wb3J0YihkZXYpIHx8IGVuY29kZXJfb25fcG9ydGMoZGV2KSkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogUmVhZGluZyBHUElPIG1vdmluZyBvbiBlbmNvZGVyIHBvcnRzXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCXJldHVybiAoY3hfcmVhZChNQzQxN19SV0QpICYgKChtYXNrICYgMHg3ZmZmOCkgPj4gMykpIDw8IDM7CisJfQorCisJLyogVE9ETzogMjMtMTkgKi8KKwlpZiAobWFzayAmIDB4MDBmODAwMDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCiB2b2lkIGN4MjM4ODVfZ3Bpb19lbmFibGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBtYXNrLCBpbnQgYXNvdXRwdXQpCiB7CiAJaWYgKChtYXNrICYgMHgwMDAwMDAwNykgJiYgYXNvdXRwdXQpCkBAIC0xODU0LDYgKzE5MjksOSBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGZhaWxfZnJlZTsKIAorCS8qIFByZXBhcmUgdG8gaGFuZGxlIG5vdGlmaWNhdGlvbnMgZnJvbSBzdWJkZXZpY2VzICovCisJY3gyMzg4NV92NGwyX2Rldl9ub3RpZnlfaW5pdChkZXYpOworCiAJLyogcGNpIGluaXQgKi8KIAlkZXYtPnBjaSA9IHBjaV9kZXY7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKSB7CkBAIC0xODk2LDYgKzE5NzQsMTQgQEAKIAkJYnJlYWs7CiAJfQogCisJLyoKKwkgKiBUaGUgQ1gyMzg4WzU4XSBJUiBjb250cm9sbGVyIGNhbiBzdGFydCBmaXJpbmcgaW50ZXJydXB0cyB3aGVuCisJICogZW5hYmxlZCwgc28gdGhlc2UgaGF2ZSB0byB0YWtlIHBsYWNlIGFmdGVyIHRoZSBjeDIzODg1X2lycSgpIGhhbmRsZXIKKwkgKiBpcyBob29rZWQgdXAgYnkgdGhlIGNhbGwgdG8gcmVxdWVzdF9pcnEoKSBhYm92ZS4KKwkgKi8KKwljeDIzODg1X2lyX3BjaV9pbnRfZW5hYmxlKGRldik7CisJY3gyMzg4NV9pbnB1dF9pbml0KGRldik7CisKIAlyZXR1cm4gMDsKIAogZmFpbF9pcnE6CkBAIC0xOTEyLDYgKzE5OTgsOSBAQAogCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSB0b19jeDIzODg1KHY0bDJfZGV2KTsKIAorCWN4MjM4ODVfaW5wdXRfZmluaShkZXYpOworCWN4MjM4ODVfaXJfZmluaShkZXYpOworCiAJY3gyMzg4NV9zaHV0ZG93bihkZXYpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOwpAQCAtMTk1Nyw3ICsyMDQ2LDcgQEAKIAkucmVzdW1lICAgPSBOVUxMLAogfTsKIAotc3RhdGljIGludCBjeDIzODg1X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGN4MjM4ODVfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gImN4MjM4ODUgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAogCSAgICAgICAoQ1gyMzg4NV9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKQEAgLTE5NzAsNyArMjA1OSw3IEBACiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4MjM4ODVfcGNpX2RyaXZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIGN4MjM4ODVfZmluaSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGN4MjM4ODVfZmluaSh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3gyMzg4NV9wY2lfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMKaW5kZXggNDVlMTNlZS4uZTQ1ZDJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJ0ZGExODI3MS5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCisjaW5jbHVkZSAibWF4MjE2NS5oIgogI2luY2x1ZGUgInRkYTEwMDQ4LmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAjaW5jbHVkZSAidHVuZXItc2ltcGxlLmgiCkBAIC01NCw2ICs1NSw5IEBACiAjaW5jbHVkZSAibmV0dXAtZWVwcm9tLmgiCiAjaW5jbHVkZSAibmV0dXAtaW5pdC5oIgogI2luY2x1ZGUgImxnZHQzMzA1LmgiCisjaW5jbHVkZSAiYXRibTg4MzAuaCIKKyNpbmNsdWRlICJkczMwMDAuaCIKKyNpbmNsdWRlICJjeDIzODg1LWYzMDAuaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKIApAQCAtNDAwLDYgKzQwNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3R2MDkwMF9jb25maWcgbmV0dXBfc3R2MDkwMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDY4LAorCS5kZW1vZF9tb2RlID0gMSwgLyogZHVhbCAqLwogCS54dGFsID0gODAwMDAwMCwKIAkuY2xrbW9kZSA9IDMsLyogMC1DTEtJLCAyLVhUQUxJLCBlbHNlIEFVVE8gKi8KIAkuZGlzZXFjX21vZGUgPSAyLC8qIDIvMyBQV00gKi8KQEAgLTQxNCwzNCArNDE5LDIyIEBACiAJLmkyY19hZGRyZXNzID0gMHg2MCwKIAkubWNsayA9IDE2MDAwMDAwLAogCS5jbGtfZGl2ID0gMSwKKwkuZ2FpbiA9IDgsIC8qICsxNiBkQiAgLSBtYXhpbXVtIGdhaW4gKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3R2NjExMF9jb25maWcgbmV0dXBfc3R2NjExMF90dW5lcmNvbmZpZ19iID0gewogCS5pMmNfYWRkcmVzcyA9IDB4NjMsCiAJLm1jbGsgPSAxNjAwMDAwMCwKIAkuY2xrX2RpdiA9IDEsCisJLmdhaW4gPSA4LCAvKiArMTYgZEIgIC0gbWF4aW11bSBnYWluICovCiB9OwogCi1zdGF0aWMgaW50IHRic19zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQotewotCXN0cnVjdCBjeDIzODg1X3RzcG9ydCAqcG9ydCA9IGZlLT5kdmItPnByaXY7Ci0Jc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBwb3J0LT5kZXY7Ci0KLQlpZiAodm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xOCkKLQkJY3hfd3JpdGUoTUM0MTdfUldELCAweDAwMDAxZTAwKTsvKiBHUElPLTEzIGhpZ2ggKi8KLQllbHNlIGlmICh2b2x0YWdlID09IFNFQ19WT0xUQUdFXzEzKQotCQljeF93cml0ZShNQzQxN19SV0QsIDB4MDAwMDFhMDApOy8qIEdQSU8tMTMgbG93ICovCi0JZWxzZQotCQljeF93cml0ZShNQzQxN19SV0QsIDB4MDAwMDE4MDApOy8qIEdQSU8tMTIgbG93ICovCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgY3gyNDExNl9jb25maWcgdGJzX2N4MjQxMTZfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHgwNSwKKwkuZGVtb2RfYWRkcmVzcyA9IDB4NTUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGN4MjQxMTZfY29uZmlnIHRldmlpX2N4MjQxMTZfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKK3N0YXRpYyBzdHJ1Y3QgZHMzMDAwX2NvbmZpZyB0ZXZpaV9kczMwMDBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY3gyNDExNl9jb25maWcgZHZid29ybGRfY3gyNDExNl9jb25maWcgPSB7CkBAIC00ODYsMTEgKzQ3OSw0MCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBDWDIzODg1X0JPQVJEX01ZR0lDQV9YODUwNjoKKwljYXNlIENYMjM4ODVfQk9BUkRfTUFHSUNQUk9fUFJPSERUVkUyOgorCQkvKiBTZWxlY3QgRGlnaXRhbCBUViAqLworCQljeDIzODg1X2dwaW9fc2V0KGRldiwgR1BJT18wKTsKKwkJYnJlYWs7CiAJfQotCXJldHVybiAocG9ydC0+c2V0X2Zyb250ZW5kX3NhdmUpID8KLQkJcG9ydC0+c2V0X2Zyb250ZW5kX3NhdmUoZmUsIHBhcmFtKSA6IC1FTk9ERVY7CisJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY3gyMzg4NV9kdmJfZmVfaW9jdGxfb3ZlcnJpZGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnLAorCQkJCQkgdW5zaWduZWQgaW50IHN0YWdlKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChzdGFnZSkgeworCWNhc2UgRFZCX0ZFX0lPQ1RMX1BSRToKKworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEZFX1NFVF9GUk9OVEVORDoKKwkJCWVyciA9IGN4MjM4ODVfZHZiX3NldF9mcm9udGVuZChmZSwKKwkJCQkoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICopIHBhcmcpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIERWQl9GRV9JT0NUTF9QT1NUOgorCQkvKiBubyBwb3N0LWlvY3RsIGhhbmRsaW5nIHJlcXVpcmVkICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfTsKKworCiBzdGF0aWMgc3RydWN0IGxnczhneHhfY29uZmlnIG1hZ2ljcHJvX3Byb2hkdHZlMl9sZ3M4Zzc1X2NvbmZpZyA9IHsKIAkucHJvZCA9IExHUzhHWFhfUFJPRF9MR1M4Rzc1LAogCS5kZW1vZF9hZGRyZXNzID0gMHgxOSwKQEAgLTUxMSw2ICs1MzMsMzggQEAKIAkuaWZfa2h6ID0gNjUwMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgYXRibTg4MzBfY29uZmlnIG15Z2ljYV94ODU1OHByb19hdGJtODgzMF9jZmcxID0geworCS5wcm9kID0gQVRCTTg4MzBfUFJPRF84ODMwLAorCS5kZW1vZF9hZGRyZXNzID0gMHg0NCwKKwkuc2VyaWFsX3RzID0gMCwKKwkudHNfc2FtcGxpbmdfZWRnZSA9IDEsCisJLnRzX2Nsa19nYXRlZCA9IDAsCisJLm9zY19jbGtfZnJlcSA9IDMwNDAwLCAvKiBpbiBrSHogKi8KKwkuaWZfZnJlcSA9IDAsIC8qIHplcm8gSUYgKi8KKwkuemlmX3N3YXBfaXEgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXgyMTY1X2NvbmZpZyBteWdpY194ODU1OHByb19tYXgyMTY1X2NmZzEgPSB7CisJLmkyY19hZGRyZXNzID0gMHg2MCwKKwkub3NjX2NsayA9IDIwCit9OworCitzdGF0aWMgc3RydWN0IGF0Ym04ODMwX2NvbmZpZyBteWdpY2FfeDg1NThwcm9fYXRibTg4MzBfY2ZnMiA9IHsKKwkucHJvZCA9IEFUQk04ODMwX1BST0RfODgzMCwKKwkuZGVtb2RfYWRkcmVzcyA9IDB4NDQsCisJLnNlcmlhbF90cyA9IDEsCisJLnRzX3NhbXBsaW5nX2VkZ2UgPSAxLAorCS50c19jbGtfZ2F0ZWQgPSAwLAorCS5vc2NfY2xrX2ZyZXEgPSAzMDQwMCwgLyogaW4ga0h6ICovCisJLmlmX2ZyZXEgPSAwLCAvKiB6ZXJvIElGICovCisJLnppZl9zd2FwX2lxID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4MjE2NV9jb25maWcgbXlnaWNfeDg1NThwcm9fbWF4MjE2NV9jZmcyID0geworCS5pMmNfYWRkcmVzcyA9IDB4NjAsCisJLm9zY19jbGsgPSAyMAorfTsKKwogc3RhdGljIGludCBkdmJfcmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfdHNwb3J0ICpwb3J0KQogewogCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gcG9ydC0+ZGV2OwpAQCAtNTUwLDEyICs2MDQsNiBAQAogCQkJCSAgIDB4NjAsICZkZXYtPmkyY19idXNbMV0uaTJjX2FkYXAsCiAJCQkJICAgJmhhdXBwYXVnZV9odnIxMjd4X2NvbmZpZyk7CiAJCX0KLQotCQkvKiBGSVhNRTogdGVtcG9yYXJ5IGhhY2sgKi8KLQkJLyogZGVmaW5lIGJyaWRnZSBvdmVycmlkZSB0byBzZXRfZnJvbnRlbmQgKi8KLQkJcG9ydC0+c2V0X2Zyb250ZW5kX3NhdmUgPSBmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLnNldF9mcm9udGVuZDsKLQkJZmUwLT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfZnJvbnRlbmQgPSBjeDIzODg1X2R2Yl9zZXRfZnJvbnRlbmQ7Ci0KIAkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjU1OgogCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1swXTsKQEAgLTc3MiwyMyArODIwLDIzIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX1RCU182OTIwOgotCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1swXTsKKwkJaTJjX2J1cyA9ICZkZXYtPmkyY19idXNbMV07CiAKIAkJZmUwLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGN4MjQxMTZfYXR0YWNoLAotCQkJJnRic19jeDI0MTE2X2NvbmZpZywKLQkJCSZpMmNfYnVzLT5pMmNfYWRhcCk7CisJCQkJCSZ0YnNfY3gyNDExNl9jb25maWcsCisJCQkJCSZpMmNfYnVzLT5pMmNfYWRhcCk7CiAJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKQotCQkJZmUwLT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfdm9sdGFnZSA9IHRic19zZXRfdm9sdGFnZTsKKwkJCWZlMC0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPSBmMzAwX3NldF92b2x0YWdlOwogCiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9URVZJSV9TNDcwOgogCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1sxXTsKIAotCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyNDExNl9hdHRhY2gsCi0JCQkmdGV2aWlfY3gyNDExNl9jb25maWcsCi0JCQkmaTJjX2J1cy0+aTJjX2FkYXApOworCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goZHMzMDAwX2F0dGFjaCwKKwkJCQkJJnRldmlpX2RzMzAwMF9jb25maWcsCisJCQkJCSZpMmNfYnVzLT5pMmNfYWRhcCk7CiAJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKQotCQkJZmUwLT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfdm9sdGFnZSA9IHRic19zZXRfdm9sdGFnZTsKKwkJCWZlMC0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPSBmMzAwX3NldF92b2x0YWdlOwogCiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9EVkJXT1JMRF8yMDA1OgpAQCAtODE0LDggKzg2Miw4IEBACiAJCQkJCWlmICghZHZiX2F0dGFjaChsbmJoMjRfYXR0YWNoLAogCQkJCQkJCWZlMC0+ZHZiLmZyb250ZW5kLAogCQkJCQkJCSZpMmNfYnVzLT5pMmNfYWRhcCwKLQkJCQkJCQlMTkJIMjRfUENMLAotCQkJCQkJCUxOQkgyNF9UVFgsIDB4MDkpKQorCQkJCQkJCUxOQkgyNF9QQ0wgfCBMTkJIMjRfVFRYLAorCQkJCQkJCUxOQkgyNF9URU4sIDB4MDkpKQogCQkJCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJCQkJIk5vIExOQkgyNCBmb3VuZCFcbiIpOwogCkBAIC04MzUsOCArODgzLDggQEAKIAkJCQkJaWYgKCFkdmJfYXR0YWNoKGxuYmgyNF9hdHRhY2gsCiAJCQkJCQkJZmUwLT5kdmIuZnJvbnRlbmQsCiAJCQkJCQkJJmkyY19idXMtPmkyY19hZGFwLAotCQkJCQkJCUxOQkgyNF9QQ0wsCi0JCQkJCQkJTE5CSDI0X1RUWCwgMHgwYSkpCisJCQkJCQkJTE5CSDI0X1BDTCB8IExOQkgyNF9UVFgsCisJCQkJCQkJTE5CSDI0X1RFTiwgMHgwYSkpCiAJCQkJCQlwcmludGsoS0VSTl9FUlIKIAkJCQkJCQkiTm8gTE5CSDI0IGZvdW5kIVxuIik7CiAKQEAgLTg3Miw2ICs5MjAsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJCWkyY19idXMgPSAmZGV2LT5pMmNfYnVzWzBdOwogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goczVoMTQxMV9hdHRhY2gsCiAJCQkmaGN3X3M1aDE0MTFfY29uZmlnLApAQCAtODgxLDYgKzkzMCwzNiBAQAogCQkJCTB4NjAsICZkZXYtPmkyY19idXNbMF0uaTJjX2FkYXAsCiAJCQkJJmhhdXBwYXVnZV90ZGExODI3MV9jb25maWcpOwogCQlicmVhazsKKwljYXNlIENYMjM4ODVfQk9BUkRfTVlHSUNBX1g4NTU4UFJPOgorCQlzd2l0Y2ggKHBvcnQtPm5yKSB7CisJCS8qIHBvcnQgQiAqLworCQljYXNlIDE6CisJCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1swXTsKKwkJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChhdGJtODgzMF9hdHRhY2gsCisJCQkJJm15Z2ljYV94ODU1OHByb19hdGJtODgzMF9jZmcxLAorCQkJCSZpMmNfYnVzLT5pMmNfYWRhcCk7CisJCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJCWR2Yl9hdHRhY2gobWF4MjE2NV9hdHRhY2gsCisJCQkJCWZlMC0+ZHZiLmZyb250ZW5kLAorCQkJCQkmaTJjX2J1cy0+aTJjX2FkYXAsCisJCQkJCSZteWdpY194ODU1OHByb19tYXgyMTY1X2NmZzEpOworCQkJfQorCQkJYnJlYWs7CisJCS8qIHBvcnQgQyAqLworCQljYXNlIDI6CisJCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1sxXTsKKwkJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChhdGJtODgzMF9hdHRhY2gsCisJCQkJJm15Z2ljYV94ODU1OHByb19hdGJtODgzMF9jZmcyLAorCQkJCSZpMmNfYnVzLT5pMmNfYWRhcCk7CisJCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJCWR2Yl9hdHRhY2gobWF4MjE2NV9hdHRhY2gsCisJCQkJCWZlMC0+ZHZiLmZyb250ZW5kLAorCQkJCQkmaTJjX2J1cy0+aTJjX2FkYXAsCisJCQkJCSZteWdpY194ODU1OHByb19tYXgyMTY1X2NmZzIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCAiCkBAIC04OTcsMTQgKzk3NiwxNSBAQAogCWZlMC0+ZHZiLmZyb250ZW5kLT5jYWxsYmFjayA9IGN4MjM4ODVfdHVuZXJfY2FsbGJhY2s7CiAKIAkvKiBQdXQgdGhlIGFuYWxvZyBkZWNvZGVyIGluIHN0YW5kYnkgdG8ga2VlcCBpdCBxdWlldCAqLwotCWNhbGxfYWxsKGRldiwgdHVuZXIsIHNfc3RhbmRieSk7CisJY2FsbF9hbGwoZGV2LCBjb3JlLCBzX3Bvd2VyLCAwKTsKIAogCWlmIChmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLmFuYWxvZ19vcHMuc3RhbmRieSkKIAkJZmUwLT5kdmIuZnJvbnRlbmQtPm9wcy5hbmFsb2dfb3BzLnN0YW5kYnkoZmUwLT5kdmIuZnJvbnRlbmQpOwogCiAJLyogcmVnaXN0ZXIgZXZlcnl0aGluZyAqLwogCXJldCA9IHZpZGVvYnVmX2R2Yl9yZWdpc3Rlcl9idXMoJnBvcnQtPmZyb250ZW5kcywgVEhJU19NT0RVTEUsIHBvcnQsCi0JCSZkZXYtPnBjaS0+ZGV2LCBhZGFwdGVyX25yLCAwKTsKKwkJCQkJJmRldi0+cGNpLT5kZXYsIGFkYXB0ZXJfbnIsIDAsCisJCQkJCWN4MjM4ODVfZHZiX2ZlX2lvY3RsX292ZXJyaWRlKTsKIAogCS8qIGluaXQgQ0kgJiBNQUMgKi8KIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKQEAgLTk0MCw3ICsxMDIwLDcgQEAKIAlpbnQgZXJyLCBpOwogCiAJLyogSGVyZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBmcm9udGVuZHMsCi0JICogYXMgcmVmbGVjdGVkIGluIHRoZSBjYXJkcyBzdHJ1Y3QuIFRoZSByZWFsaXR5IGlzIHRoYXQgY3VycnJlbnRseQorCSAqIGFzIHJlZmxlY3RlZCBpbiB0aGUgY2FyZHMgc3RydWN0LiBUaGUgcmVhbGl0eSBpcyB0aGF0IGN1cnJlbnRseQogCSAqIG5vIGN4MjM4ODUgYm9hcmRzIHN1cHBvcnQgdGhpcyAtIHlldC4gQnV0LCBpZiB3ZSBkb24ndCBtb2RpZnkgdGhpcwogCSAqIGNvZGUgdGhlbiB0aGUgc2Vjb25kIGZyb250ZW5kIHdvdWxkIG5ldmVyIGJlIGFsbG9jYXRlZCAobGF0ZXIpCiAJICogYW5kIGZhaWwgd2l0aCBlcnJvciBiZWZvcmUgdGhlIGF0dGFjaCBpbiBkdmJfcmVnaXN0ZXIoKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWYzMDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWYzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk5OGYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZjMwMC5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogRHJpdmVyIGZvciBTaWxpY29uIExhYnMgQzgwNTFGMzAwIG1pY3JvY29udHJvbGxlci4KKyAqCisgKiBJdCBpcyB1c2VkIGZvciBMTkIgcG93ZXIgY29udHJvbCBpbiBUZVZpaSBTNDcwLAorICogVEJTIDY5MjAgUENJZSBEVkItUzIgY2FyZHMuCisgKgorICogTWljcm9jb250cm9sbGVyIGNvbm5lY3RlZCB0byBjeDIzODg1IEdQSU8gcGluczoKKyAqIEdQSU8wIC0gZGF0YQkJLSBQMC4zIEYzMDAKKyAqIEdQSU8xIC0gcmVzZXQJLSBQMC4yIEYzMDAKKyAqIEdQSU8yIC0gY2xrCQktIFAwLjEgRjMwMAorICogR1BJTzMgLSBidXN5CQktIFAwLjAgRjMwMAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG1lLmJ5PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY3gyMzg4NS5oIgorCisjZGVmaW5lIEYzMDBfREFUQQlHUElPXzAKKyNkZWZpbmUgRjMwMF9SRVNFVAlHUElPXzEKKyNkZWZpbmUgRjMwMF9DTEsJR1BJT18yCisjZGVmaW5lIEYzMDBfQlVTWQlHUElPXzMKKworc3RhdGljIHZvaWQgZjMwMF9zZXRfbGluZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIGxpbmUsIHU4IGx2bCkKK3sKKwljeDIzODg1X2dwaW9fZW5hYmxlKGRldiwgbGluZSwgMSk7CisJaWYgKGx2bCA9PSAxKQorCQljeDIzODg1X2dwaW9fc2V0KGRldiwgbGluZSk7CisJZWxzZQorCQljeDIzODg1X2dwaW9fY2xlYXIoZGV2LCBsaW5lKTsKK30KKworc3RhdGljIHU4IGYzMDBfZ2V0X2xpbmUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBsaW5lKQoreworCWN4MjM4ODVfZ3Bpb19lbmFibGUoZGV2LCBsaW5lLCAwKTsKKworCXJldHVybiBjeDIzODg1X2dwaW9fZ2V0KGRldiwgbGluZSk7Cit9CisKK3N0YXRpYyB2b2lkIGYzMDBfc2VuZF9ieXRlKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1OCBkdGEpCit7CisJdTggaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJZjMwMF9zZXRfbGluZShkZXYsIEYzMDBfQ0xLLCAwKTsKKwkJdWRlbGF5KDMwKTsKKwkJZjMwMF9zZXRfbGluZShkZXYsIEYzMDBfREFUQSwgKGR0YSAmIDB4ODApID4+IDcpOy8qIG1zYiBmaXJzdCAqLworCQl1ZGVsYXkoMzApOworCQlkdGEgPDw9IDE7CisJCWYzMDBfc2V0X2xpbmUoZGV2LCBGMzAwX0NMSywgMSk7CisJCXVkZWxheSgzMCk7CisJfQorfQorCitzdGF0aWMgdTggZjMwMF9nZXRfYnl0ZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKK3sKKwl1OCBpLCBkdGEgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlmMzAwX3NldF9saW5lKGRldiwgRjMwMF9DTEssIDApOworCQl1ZGVsYXkoMzApOworCQlkdGEgPDw9IDE7CisJCWYzMDBfc2V0X2xpbmUoZGV2LCBGMzAwX0NMSywgMSk7CisJCXVkZWxheSgzMCk7CisJCWR0YSB8PSBmMzAwX2dldF9saW5lKGRldiwgRjMwMF9EQVRBKTsvKiBtc2IgZmlyc3QgKi8KKworCX0KKworCXJldHVybiBkdGE7Cit9CisKK3N0YXRpYyB1OCBmMzAwX3hmZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4ICpidWYpCit7CisJc3RydWN0IGN4MjM4ODVfdHNwb3J0ICpwb3J0ID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiA9IHBvcnQtPmRldjsKKwl1OCBpLCB0ZW1wLCByZXQgPSAwOworCisJdGVtcCA9IGJ1ZlswXTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmWzBdOyBpKyspCisJCXRlbXAgKz0gYnVmW2kgKyAxXTsKKwl0ZW1wID0gKH50ZW1wICsgMSk7LyogZ2V0IGNoZWNrIHN1bSAqLworCWJ1ZlsxICsgYnVmWzBdXSA9IHRlbXA7CisKKwlmMzAwX3NldF9saW5lKGRldiwgRjMwMF9SRVNFVCwgMSk7CisJZjMwMF9zZXRfbGluZShkZXYsIEYzMDBfQ0xLLCAxKTsKKwl1ZGVsYXkoMzApOworCWYzMDBfc2V0X2xpbmUoZGV2LCBGMzAwX0RBVEEsIDEpOworCW1zbGVlcCgxKTsKKworCS8qIHF1ZXN0aW9uOiAqLworCWYzMDBfc2V0X2xpbmUoZGV2LCBGMzAwX1JFU0VULCAwKTsvKiBiZWdpbiB0byBzZW5kIGRhdGEgKi8KKwltc2xlZXAoMSk7CisKKwlmMzAwX3NlbmRfYnl0ZShkZXYsIDB4ZTApOy8qIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIDB4ZTAsIHdyaXRlICovCisJbXNsZWVwKDEpOworCisJdGVtcCA9IGJ1ZlswXTsKKwl0ZW1wICs9IDI7CisJZm9yIChpID0gMDsgaSA8IHRlbXA7IGkrKykKKwkJZjMwMF9zZW5kX2J5dGUoZGV2LCBidWZbaV0pOworCisJZjMwMF9zZXRfbGluZShkZXYsIEYzMDBfUkVTRVQsIDEpOy8qIHNlbnQgZGF0YSBvdmVyICovCisJZjMwMF9zZXRfbGluZShkZXYsIEYzMDBfREFUQSwgMSk7CisKKwkvKiBhbnN3ZXI6ICovCisJdGVtcCA9IDA7CisJZm9yIChpID0gMDsgKChpIDwgOCkgJiAodGVtcCA9PSAwKSk7IGkrKykgeworCQltc2xlZXAoMSk7CisJCWlmIChmMzAwX2dldF9saW5lKGRldiwgRjMwMF9CVVNZKSA9PSAwKQorCQkJdGVtcCA9IDE7CisJfQorCisJaWYgKGkgPiA3KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVvdXQsIHRoZSBzbGF2ZSBubyByZXNwb25zZVxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQlyZXQgPSAxOyAvKiB0aW1lb3V0LCB0aGUgc2xhdmUgbm8gcmVzcG9uc2UgKi8KKwl9IGVsc2UgeyAvKiB0aGUgc2xhdmUgbm90IGJ1c3ksIHByZXBhcmUgZm9yIGdldHRpbmcgZGF0YSAqLworCQlmMzAwX3NldF9saW5lKGRldiwgRjMwMF9SRVNFVCwgMCk7LypyZWFkeS4uLiovCisJCW1zbGVlcCgxKTsKKwkJZjMwMF9zZW5kX2J5dGUoZGV2LCAweGUxKTsvKiAweGUxIGlzIFJlYWQgKi8KKwkJbXNsZWVwKDEpOworCQl0ZW1wID0gZjMwMF9nZXRfYnl0ZShkZXYpOy8qZ2V0IHRoZSBkYXRhIGxlbmd0aCAqLworCQlpZiAodGVtcCA+IDE0KQorCQkJdGVtcCA9IDE0OworCisJCWZvciAoaSA9IDA7IGkgPCAodGVtcCArIDEpOyBpKyspCisJCQlmMzAwX2dldF9ieXRlKGRldik7LyogZ2V0IGRhdGEgdG8gZW1wdHkgYnVmZmVyICovCisKKwkJZjMwMF9zZXRfbGluZShkZXYsIEYzMDBfUkVTRVQsIDEpOy8qIHJlY2VpdmVkIGRhdGEgb3ZlciAqLworCQlmMzAwX3NldF9saW5lKGRldiwgRjMwMF9EQVRBLCAxKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZjMwMF9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXU4IGJ1ZlsxNl07CisKKwlidWZbMF0gPSAweDA1OworCWJ1ZlsxXSA9IDB4Mzg7Lyogd3JpdGUgcG9ydCAqLworCWJ1ZlsyXSA9IDB4MDE7LyogQSBwb3J0LCBsbmIgcG93ZXIgKi8KKworCXN3aXRjaCAodm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCWJ1ZlszXSA9IDB4MDE7LyogcG93ZXIgb24gKi8KKwkJYnVmWzRdID0gMHgwMjsvKiBCIHBvcnQsIEgvViAqLworCQlidWZbNV0gPSAweDAwOy8qMTNWIHYqLworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzE4OgorCQlidWZbM10gPSAweDAxOworCQlidWZbNF0gPSAweDAyOworCQlidWZbNV0gPSAweDAxOy8qIDE4ViBoKi8KKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisJCWJ1ZlszXSA9IDB4MDA7LyogcG93ZXIgb2ZmICovCisJCWJ1Zls0XSA9IDB4MDA7CisJCWJ1Zls1XSA9IDB4MDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBmMzAwX3hmZXIoZmUsIGJ1Zik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1mMzAwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1mMzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczMzQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWYzMDAuaApAQCAtMCwwICsxLDIgQEAKK2V4dGVybiBpbnQgZjMwMF9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQlmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZTA4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qCisgKiAgRHJpdmVyIGZvciB0aGUgQ29uZXhhbnQgQ1gyMzg4NS83LzggUENJZSBicmlkZ2UKKyAqCisgKiAgSW5mcmFyZWQgcmVtb3RlIGNvbnRyb2wgaW5wdXQgZGV2aWNlCisgKgorICogIE1vc3Qgb2YgdGhpcyBmaWxlIGlzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KKyAqCisgKiAgSG93ZXZlciwgdGhlIGN4MjM4ODVfaW5wdXRfe2luaXQsZmluaX0gZnVuY3Rpb25zIGNvbnRhaW5lZCBoZXJlaW4gYXJlCisgKiAgZGVyaXZlZCBmcm9tIExpbnV4IGtlcm5lbCBmaWxlcyBsaW51eC9tZWRpYS92aWRlby8uLi4vLi4uLWlucHV0LmMgbWFya2VkIGFzOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggPHNyaW5pdmFzYS5kZWV2aSBhdCBjb25leGFudCBkb3QgY29tPgorICogIENvcHlyaWdodCAoQykgMjAwNSBMdWRvdmljbyBDYXZlZG9uIDxjYXZlZG9uQHNzc3VwLml0PgorICoJCSAgICAgICBNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPgorICoJCSAgICAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqCQkgICAgICAgU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IENocmlzIFBhc2NvZQorICogIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBHZXJkIEtub3JyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFBhdmVsIE1hY2hlaworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjaW5jbHVkZSAiY3gyMzg4NS5oIgorCisjZGVmaW5lIFJDNV9CSVRTCQkxNAorI2RlZmluZSBSQzVfSEFMRl9CSVRTCQkoMipSQzVfQklUUykKKyNkZWZpbmUgUkM1X0hBTEZfQklUU19NQVNLCSgoMSA8PCBSQzVfSEFMRl9CSVRTKSAtIDEpCisKKyNkZWZpbmUgUkM1X1NUQVJUX0JJVFNfTk9STUFMCTB4MyAvKiBDb21tYW5kIHJhbmdlICAwIC0gIDYzICovCisjZGVmaW5lIFJDNV9TVEFSVF9CSVRTX0VYVEVOREVECTB4MiAvKiBDb21tYW5kIHJhbmdlIDY0IC0gMTI3ICovCisKKyNkZWZpbmUgUkM1X0VYVEVOREVEX0NPTU1BTkRfT0ZGU0VUCTY0CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJjNV9jb21tYW5kKHUzMiByYzVfYmFzZWJhbmQpCit7CisJcmV0dXJuIFJDNV9JTlNUUihyYzVfYmFzZWJhbmQpICsKKwkJKChSQzVfU1RBUlQocmM1X2Jhc2ViYW5kKSA9PSBSQzVfU1RBUlRfQklUU19FWFRFTkRFRCkKKwkJCT8gUkM1X0VYVEVOREVEX0NPTU1BTkRfT0ZGU0VUIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIGN4MjM4ODVfaW5wdXRfcHJvY2Vzc19yYXdfcmM1KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQoreworCXN0cnVjdCBjYXJkX2lyICppcl9pbnB1dCA9IGRldi0+aXJfaW5wdXQ7CisJdW5zaWduZWQgaW50IGNvZGUsIGNvbW1hbmQ7CisJdTMyIHJjNTsKKworCS8qIElnbm9yZSBjb2RlcyB0aGF0IGFyZSB0b28gc2hvcnQgdG8gYmUgdmFsaWQgUkMtNSAqLworCWlmIChpcl9pbnB1dC0+bGFzdF9iaXQgPCAoUkM1X0hBTEZfQklUUyAtIDEpKQorCQlyZXR1cm47CisKKwkvKiBUaGUgbGlicmFyeSBoYXMgdGhlIG1hbmNoZXN0ZXIgY29kaW5nIGJhY2t3YXJkczsgWE9SIHRvIGFkYXB0LiAqLworCWNvZGUgPSAoaXJfaW5wdXQtPmNvZGUgJiBSQzVfSEFMRl9CSVRTX01BU0spIF4gUkM1X0hBTEZfQklUU19NQVNLOworCXJjNSA9IGlyX3JjNV9kZWNvZGUoY29kZSk7CisKKwlzd2l0Y2ggKFJDNV9TVEFSVChyYzUpKSB7CisJY2FzZSBSQzVfU1RBUlRfQklUU19OT1JNQUw6CisJCWJyZWFrOworCWNhc2UgUkM1X1NUQVJUX0JJVFNfRVhURU5ERUQ6CisJCS8qIERvbid0IGFsbG93IGlmIHRoZSByZW1vdGUgb25seSBlbWl0cyBzdGFuZGFyZCBjb21tYW5kcyAqLworCQlpZiAoaXJfaW5wdXQtPnN0YXJ0ID09IFJDNV9TVEFSVF9CSVRTX05PUk1BTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWlmIChpcl9pbnB1dC0+YWRkciAhPSBSQzVfQUREUihyYzUpKQorCQlyZXR1cm47CisKKwkvKiBEb24ndCBnZW5lcmF0ZSBhIGtleXByZXNzIGZvciBSQy01IGF1dG8tcmVwZWF0ZWQga2V5cHJlc3NlcyAqLworCWNvbW1hbmQgPSByYzVfY29tbWFuZChyYzUpOworCWlmIChSQzVfVE9HR0xFKHJjNSkgIT0gUkM1X1RPR0dMRShpcl9pbnB1dC0+bGFzdF9yYzUpIHx8CisJICAgIGNvbW1hbmQgIT0gcmM1X2NvbW1hbmQoaXJfaW5wdXQtPmxhc3RfcmM1KSB8fAorCSAgICAvKiBDYXRjaCBUID09IDAsIENNRCA9PSAwIChlLmcuICcwJykgYXMgZmlyc3Qga2V5cHJlc3MgYWZ0ZXIgaW5pdCAqLworCSAgICBSQzVfU1RBUlQoaXJfaW5wdXQtPmxhc3RfcmM1KSA9PSAwKSB7CisJCS8qIFRoaXMga2V5cHJlc3MgaXMgZGlmZmVybmV0OiBub3QgYW4gYXV0byByZXBlYXQgKi8KKwkJaXJfaW5wdXRfbm9rZXkoaXJfaW5wdXQtPmRldiwgJmlyX2lucHV0LT5pcik7CisJCWlyX2lucHV0X2tleWRvd24oaXJfaW5wdXQtPmRldiwgJmlyX2lucHV0LT5pciwgY29tbWFuZCk7CisJfQorCWlyX2lucHV0LT5sYXN0X3JjNSA9IHJjNTsKKworCS8qIFNjaGVkdWxlIHdoZW4gd2Ugc2hvdWxkIGRvIHRoZSBrZXkgdXAgZXZlbnQ6IGlyX2lucHV0X25va2V5KCkgKi8KKwltb2RfdGltZXIoJmlyX2lucHV0LT50aW1lcl9rZXl1cCwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhpcl9pbnB1dC0+cmM1X2tleV90aW1lb3V0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGN4MjM4ODVfaW5wdXRfbmV4dF9wdWxzZV93aWR0aF9yYzUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJCSAgICAgICB1MzIgbnNfcHVsc2UpCit7CisJY29uc3QgaW50IHJjNV9xdWFydGVyYml0X25zID0gNDQ0NDQ0OyAvKiAzMiBjeWNsZXMvMzYga0h6LzIgPSA0NDQgdXMgKi8KKwlzdHJ1Y3QgY2FyZF9pciAqaXJfaW5wdXQgPSBkZXYtPmlyX2lucHV0OworCWludCBpLCBsZXZlbCwgcXVhcnRlcmJpdHMsIGhhbGZiaXRzOworCisJaWYgKCFpcl9pbnB1dC0+YWN0aXZlKSB7CisJCWlyX2lucHV0LT5hY3RpdmUgPSAxOworCQkvKiBhc3N1bWUgYW4gaW5pdGlhbCBzcGFjZSB0aGF0IHdlIG1heSBub3QgZGV0ZWN0IG9yIG1lYXN1cmUgKi8KKwkJaXJfaW5wdXQtPmNvZGUgPSAwOworCQlpcl9pbnB1dC0+bGFzdF9iaXQgPSAwOworCX0KKworCWlmIChuc19wdWxzZSA9PSBWNEwyX1NVQkRFVl9JUl9QVUxTRV9SWF9TRVFfRU5EKSB7CisJCWlyX2lucHV0LT5sYXN0X2JpdCsrOyAvKiBBY2NvdW50IGZvciB0aGUgZmluYWwgc3BhY2UgKi8KKwkJaXJfaW5wdXQtPmFjdGl2ZSA9IDA7CisJCWN4MjM4ODVfaW5wdXRfcHJvY2Vzc19yYXdfcmM1KGRldik7CisJCXJldHVybjsKKwl9CisKKwlsZXZlbCA9IChuc19wdWxzZSAmIFY0TDJfU1VCREVWX0lSX1BVTFNFX0xFVkVMX01BU0spID8gMSA6IDA7CisKKwkvKiBTa2lwIGFueSBsZWFkaW5nIHNwYWNlIHRvIHN5bmMgdG8gdGhlIHN0YXJ0IGJpdCAqLworCWlmIChpcl9pbnB1dC0+bGFzdF9iaXQgPT0gMCAmJiBsZXZlbCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdpdGggdmFsaWQgUkMtNSB3ZSBjYW4gZ2V0IHVwIHRvIHR3byBjb25zZWN1dGl2ZSBoYWxmLWJpdHMgaW4gYQorCSAqIHNpbmdsZSBwdWxzZSBtZWFzdXJtZW50LiAgRXhwZXJpbWVudHMgaGF2ZSBzaG93biB0aGF0IHRoZSBkdXJhdGlvbgorCSAqIG9mIGEgaGFsZi1iaXQgY2FuIHZhcnkuICBNYWtlIHN1cmUgd2UgYWx3YXlzIGVuZCB1cCB3aXRoIGFuIGV2ZW4KKwkgKiBudW1iZXIgb2YgcXVhcnRlciBiaXRzIGF0IHRoZSBzYW1lIGxldmVsIChtYXJrIG9yIHNwYWNlKS4KKwkgKi8KKwluc19wdWxzZSAmPSBWNEwyX1NVQkRFVl9JUl9QVUxTRV9NQVhfV0lEVEhfTlM7CisJcXVhcnRlcmJpdHMgPSBuc19wdWxzZSAvIHJjNV9xdWFydGVyYml0X25zOworCWlmIChxdWFydGVyYml0cyAmIDEpCisJCXF1YXJ0ZXJiaXRzKys7CisJaGFsZmJpdHMgPSBxdWFydGVyYml0cyAvIDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGFsZmJpdHM7IGkrKykgeworCQlpcl9pbnB1dC0+bGFzdF9iaXQrKzsKKwkJaXJfaW5wdXQtPmNvZGUgfD0gKGxldmVsIDw8IGlyX2lucHV0LT5sYXN0X2JpdCk7CisKKwkJaWYgKGlyX2lucHV0LT5sYXN0X2JpdCA+PSBSQzVfSEFMRl9CSVRTLTEpIHsKKwkJCWlyX2lucHV0LT5hY3RpdmUgPSAwOworCQkJY3gyMzg4NV9pbnB1dF9wcm9jZXNzX3Jhd19yYzUoZGV2KTsKKwkJCS8qCisJCQkgKiBJZiBsZXZlbCBpcyAxLCBhIGxlYWRpbmcgbWFyayBpcyBpbnZhbGlkIGZvciBSQzUuCisJCQkgKiBJZiBsZXZlbCBpcyAwLCB3ZSBzY2FuIHBhc3QgZXh0cmEgaW50aWFsIHNwYWNlLgorCQkJICogRWl0aGVyIHdheSB3ZSBkb24ndCB3YW50IHRvIHJlYWN0aXZhdGUgY29sbGVjdGluZworCQkJICogbWFya3Mgb3Igc3BhY2VzIGhlcmUgd2l0aCBhbnkgbGVmdCBvdmVyIGhhbGYtYml0cy4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGN4MjM4ODVfaW5wdXRfcHJvY2Vzc19wdWxzZV93aWR0aHNfcmM1KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAorCQkJCQkJICAgYm9vbCBhZGRfZW9tKQoreworCXN0cnVjdCBjYXJkX2lyICppcl9pbnB1dCA9IGRldi0+aXJfaW5wdXQ7CisJc3RydWN0IGlyX2lucHV0X3N0YXRlICppcl9pbnB1dF9zdGF0ZSA9ICZpcl9pbnB1dC0+aXI7CisKKwl1MzIgbnNfcHVsc2VbUkM1X0hBTEZfQklUUysxXTsKKwlzc2l6ZV90IG51bSA9IDA7CisJaW50IGNvdW50LCBpOworCisJZG8geworCQl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9yZWFkLCAodTggKikgbnNfcHVsc2UsCisJCQkJIHNpemVvZihuc19wdWxzZSksICZudW0pOworCisJCWNvdW50ID0gbnVtIC8gc2l6ZW9mKHUzMik7CisKKwkJLyogQXBwZW5kIGFuIGVuZCBvZiBSeCBzZXEsIGlmIHRoZSBjYWxsZXIgcmVxdWVzdGVkICovCisJCWlmIChhZGRfZW9tICYmIGNvdW50IDwgQVJSQVlfU0laRShuc19wdWxzZSkpIHsKKwkJCW5zX3B1bHNlW2NvdW50XSA9IFY0TDJfU1VCREVWX0lSX1BVTFNFX1JYX1NFUV9FTkQ7CisJCQljb3VudCsrOworCQl9CisKKwkJLyogSnVzdCBkcmFpbiB0aGUgUnggRklGTywgaWYgd2UncmUgY2FsbGVkLCBidXQgbm90IFJDLTUgKi8KKwkJaWYgKGlyX2lucHV0X3N0YXRlLT5pcl90eXBlICE9IElSX1RZUEVfUkM1KQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQljeDIzODg1X2lucHV0X25leHRfcHVsc2Vfd2lkdGhfcmM1KGRldiwgbnNfcHVsc2VbaV0pOworCX0gd2hpbGUgKG51bSAhPSAwKTsKK30KKwordm9pZCBjeDIzODg1X2lucHV0X3J4X3dvcmtfaGFuZGxlcihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIGV2ZW50cykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyBwYXJhbXM7CisJaW50IG92ZXJydW4sIGRhdGFfYXZhaWxhYmxlOworCisJaWYgKGRldi0+c2RfaXIgPT0gTlVMTCB8fCBldmVudHMgPT0gMCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKKwkJLyoKKwkJICogVGhlIG9ubHkgYm9hcmQgd2UgaGFuZGxlIHJpZ2h0IG5vdy4gIEhvd2V2ZXIgb3RoZXIgYm9hcmRzCisJCSAqIHVzaW5nIHRoZSBDWDIzODh4IGludGVncmF0ZWQgSVIgY29udHJvbGxlciBzaG91bGQgYmUgc2ltaWxhcgorCQkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCW92ZXJydW4gPSBldmVudHMgJiAoVjRMMl9TVUJERVZfSVJfUlhfU1dfRklGT19PVkVSUlVOIHwKKwkJCSAgICBWNEwyX1NVQkRFVl9JUl9SWF9IV19GSUZPX09WRVJSVU4pOworCisJZGF0YV9hdmFpbGFibGUgPSBldmVudHMgJiAoVjRMMl9TVUJERVZfSVJfUlhfRU5EX09GX1JYX0RFVEVDVEVEIHwKKwkJCQkgICBWNEwyX1NVQkRFVl9JUl9SWF9GSUZPX1NFUlZJQ0VfUkVRKTsKKworCWlmIChvdmVycnVuKSB7CisJCS8qIElmIHRoZXJlIHdhcyBhIEZJRk8gb3ZlcnJ1biwgc3RvcCB0aGUgZGV2aWNlICovCisJCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9pciwgaXIsIHJ4X2dfcGFyYW1ldGVycywgJnBhcmFtcyk7CisJCXBhcmFtcy5lbmFibGUgPSBmYWxzZTsKKwkJLyogTWl0aWdhdGUgcmFjZSB3aXRoIGN4MjM4ODVfaW5wdXRfaXJfc3RvcCgpICovCisJCXBhcmFtcy5zaHV0ZG93biA9IGF0b21pY19yZWFkKCZkZXYtPmlyX2lucHV0X3N0b3BwaW5nKTsKKwkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfc19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKKwl9CisKKwlpZiAoZGF0YV9hdmFpbGFibGUpCisJCWN4MjM4ODVfaW5wdXRfcHJvY2Vzc19wdWxzZV93aWR0aHNfcmM1KGRldiwgb3ZlcnJ1bik7CisKKwlpZiAob3ZlcnJ1bikgeworCQkvKiBJZiB0aGVyZSB3YXMgYSBGSUZPIG92ZXJydW4sIGNsZWFyICYgcmVzdGFydCB0aGUgZGV2aWNlICovCisJCXBhcmFtcy5lbmFibGUgPSB0cnVlOworCQkvKiBNaXRpZ2F0ZSByYWNlIHdpdGggY3gyMzg4NV9pbnB1dF9pcl9zdG9wKCkgKi8KKwkJcGFyYW1zLnNodXRkb3duID0gYXRvbWljX3JlYWQoJmRldi0+aXJfaW5wdXRfc3RvcHBpbmcpOworCQl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9zX3BhcmFtZXRlcnMsICZwYXJhbXMpOworCX0KK30KKworc3RhdGljIHZvaWQgY3gyMzg4NV9pbnB1dF9pcl9zdGFydChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgY2FyZF9pciAqaXJfaW5wdXQgPSBkZXYtPmlyX2lucHV0OworCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAqaXJfaW5wdXRfc3RhdGUgPSAmaXJfaW5wdXQtPmlyOworCXN0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzIHBhcmFtczsKKworCWlmIChkZXYtPnNkX2lyID09IE5VTEwpCisJCXJldHVybjsKKworCWF0b21pY19zZXQoJmRldi0+aXJfaW5wdXRfc3RvcHBpbmcsIDApOworCisJLyoga2V5dXAgdGltZXIgc2V0IHVwLCBpZiBuZWVkZWQgKi8KKwlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgorCQlzZXR1cF90aW1lcigmaXJfaW5wdXQtPnRpbWVyX2tleXVwLAorCQkJICAgIGlyX3JjNV90aW1lcl9rZXl1cCwJLyogTm90IGFjdHVhbGx5IFJDLTUgc3BlY2lmaWMgKi8KKwkJCSAgICAodW5zaWduZWQgbG9uZykgaXJfaW5wdXQpOworCQlpZiAoaXJfaW5wdXRfc3RhdGUtPmlyX3R5cGUgPT0gSVJfVFlQRV9SQzUpIHsKKwkJCS8qCisJCQkgKiBSQy01IHJlcGVhdHMgYSBoZWxkIGtleSBldmVyeQorCQkJICogNjQgYml0cyAqICgyICogMzIvMzYwMDApIHNlYy9iaXQgPSAxMTMuNzc4IG1zCisJCQkgKi8KKwkJCWlyX2lucHV0LT5yYzVfa2V5X3RpbWVvdXQgPSAxMTU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfZ19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKKwlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgorCQkvKgorCQkgKiBUaGUgSVIgY29udHJvbGxlciBvbiB0aGlzIGJvYXJkIG9ubHkgcmV0dXJucyBwdWxzZSB3aWR0aHMuCisJCSAqIEFueSBvdGhlciBtb2RlIHNldHRpbmcgd2lsbCBmYWlsIHRvIHNldCB1cCB0aGUgZGV2aWNlLgorCQkqLworCQlwYXJhbXMubW9kZSA9IFY0TDJfU1VCREVWX0lSX01PREVfUFVMU0VfV0lEVEg7CisJCXBhcmFtcy5lbmFibGUgPSB0cnVlOworCQlwYXJhbXMuaW50ZXJydXB0X2VuYWJsZSA9IHRydWU7CisJCXBhcmFtcy5zaHV0ZG93biA9IGZhbHNlOworCisJCS8qIFNldHVwIGZvciBiYXNlYmFuZCBjb21wYXRpYmxlIHdpdGggYm90aCBSQy01IGFuZCBSQy02QSAqLworCQlwYXJhbXMubW9kdWxhdGlvbiA9IGZhbHNlOworCQkvKiBSQy01OiAgMiwyMjIsMjIyIG5zID0gMS8zNiBrSHogKiAzMiBjeWNsZXMgKiAyIG1hcmtzICogMS4yNSovCisJCS8qIFJDLTZBOiAzLDMzMywzMzMgbnMgPSAxLzM2IGtIeiAqIDE2IGN5Y2xlcyAqIDYgbWFya3MgKiAxLjI1Ki8KKwkJcGFyYW1zLm1heF9wdWxzZV93aWR0aCA9IDMzMzMzMzM7IC8qIG5zICovCisJCS8qIFJDLTU6ICAgIDY2Niw2NjcgbnMgPSAxLzM2IGtIeiAqIDMyIGN5Y2xlcyAqIDEgbWFyayAqIDAuNzUgKi8KKwkJLyogUkMtNkE6ICAgMzMzLDMzMyBucyA9IDEvMzYga0h6ICogMTYgY3ljbGVzICogMSBtYXJrICogMC43NSAqLworCQlwYXJhbXMubm9pc2VfZmlsdGVyX21pbl93aWR0aCA9IDMzMzMzMzsgLyogbnMgKi8KKwkJLyoKKwkJICogVGhpcyBib2FyZCBoYXMgaW52ZXJ0ZWQgcmVjZWl2ZSBzZW5zZToKKwkJICogbWFyayBpcyByZWNlaXZlZCBhcyBsb3cgbG9naWMgbGV2ZWw7CisJCSAqIGZhbGxpbmcgZWRnZXMgYXJlIGRldGVjdGVkIGFzIHJpc2luZyBlZGdlczsgZXRjLgorCQkgKi8KKwkJcGFyYW1zLmludmVydCA9IHRydWU7CisJCWJyZWFrOworCX0KKwl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9zX3BhcmFtZXRlcnMsICZwYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBjeDIzODg1X2lucHV0X2lyX3N0b3Aoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCit7CisJc3RydWN0IGNhcmRfaXIgKmlyX2lucHV0ID0gZGV2LT5pcl9pbnB1dDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyBwYXJhbXM7CisKKwlpZiAoZGV2LT5zZF9pciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFN0b3AgdGhlIHNkX2lyIHN1YmRldmljZSBmcm9tIGdlbmVyYXRpbmcgbm90aWZpY2F0aW9ucyBhbmQKKwkgKiBzY2hlZHVsaW5nIHdvcmsuCisJICogSXQgaXMgc2h1dGRvd24gdGhpcyB3YXkgaW4gb3JkZXIgdG8gbWl0aWdhdGUgYSByYWNlIHdpdGgKKwkgKiBjeDIzODg1X2lucHV0X3J4X3dvcmtfaGFuZGxlcigpIGluIHRoZSBvdmVycnVuIGNhc2UsIHdoaWNoIGNvdWxkCisJICogcmUtZW5hYmxlIHRoZSBzdWJkZXZpY2UuCisJICovCisJYXRvbWljX3NldCgmZGV2LT5pcl9pbnB1dF9zdG9wcGluZywgMSk7CisJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfZ19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKKwl3aGlsZSAocGFyYW1zLnNodXRkb3duID09IGZhbHNlKSB7CisJCXBhcmFtcy5lbmFibGUgPSBmYWxzZTsKKwkJcGFyYW1zLmludGVycnVwdF9lbmFibGUgPSBmYWxzZTsKKwkJcGFyYW1zLnNodXRkb3duID0gdHJ1ZTsKKwkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfc19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKKwkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfZ19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKKwl9CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKKwkJZGVsX3RpbWVyX3N5bmMoJmlyX2lucHV0LT50aW1lcl9rZXl1cCk7CisJCWJyZWFrOworCX0KK30KKworaW50IGN4MjM4ODVfaW5wdXRfaW5pdChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgY2FyZF9pciAqaXI7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSAqaXJfY29kZXMgPSBOVUxMOworCWludCBpcl90eXBlLCBpcl9hZGRyLCBpcl9zdGFydDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBJZiB0aGUgSVIgZGV2aWNlIChoYXJkd2FyZSByZWdpc3RlcnMsIGNoaXAsIEdQSU8gbGluZXMsIGV0Yy4pIGlzbid0CisJICogZW5jYXBzdWxhdGVkIGluIGEgdjRsMl9zdWJkZXYsIHRoZW4gSSdtIG5vdCBnb2luZyB0byBkZWFsIHdpdGggaXQuCisJICovCisJaWYgKGRldi0+c2RfaXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgorCQkvKiBQYXJhbWV0ZXJzIGZvciB0aGUgZ3JleSBIYXVwcGF1Z2UgcmVtb3RlIGZvciB0aGUgSFZSLTE4NTAgKi8KKwkJaXJfY29kZXMgPSAmaXJfY29kZXNfaGF1cHBhdWdlX25ld190YWJsZTsKKwkJaXJfdHlwZSA9IElSX1RZUEVfUkM1OworCQlpcl9hZGRyID0gMHgxZTsgLyogUkMtNSBzeXN0ZW0gYml0cyBlbWl0dGVkIGJ5IHRoZSByZW1vdGUgKi8KKwkJaXJfc3RhcnQgPSBSQzVfU1RBUlRfQklUU19OT1JNQUw7IC8qIEEgYmFzaWMgUkMtNSByZW1vdGUgKi8KKwkJYnJlYWs7CisJfQorCWlmIChpcl9jb2RlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlyID0ga3phbGxvYyhzaXplb2YoKmlyKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpciB8fCAhaW5wdXRfZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCWlyLT5kZXYgPSBpbnB1dF9kZXY7CisJaXItPmFkZHIgPSBpcl9hZGRyOworCWlyLT5zdGFydCA9IGlyX3N0YXJ0OworCisJLyogaW5pdCBpbnB1dCBkZXZpY2UgKi8KKwlzbnByaW50Zihpci0+bmFtZSwgc2l6ZW9mKGlyLT5uYW1lKSwgImN4MjM4ODUgSVIgKCVzKSIsCisJCSBjeDIzODg1X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKKwlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLCBwY2lfbmFtZShkZXYtPnBjaSkpOworCisJcmV0ID0gaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZpci0+aXIsIGlyX3R5cGUsIGlyX2NvZGVzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSBpci0+bmFtZTsKKwlpbnB1dF9kZXYtPnBoeXMgPSBpci0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDE7CisJaWYgKGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yKSB7CisJCWlucHV0X2Rldi0+aWQudmVuZG9yICA9IGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZTsKKwl9IGVsc2UgeworCQlpbnB1dF9kZXYtPmlkLnZlbmRvciAgPSBkZXYtPnBjaS0+dmVuZG9yOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBkZXYtPnBjaS0+ZGV2aWNlOworCX0KKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmZGV2LT5wY2ktPmRldjsKKworCWRldi0+aXJfaW5wdXQgPSBpcjsKKwljeDIzODg1X2lucHV0X2lyX3N0YXJ0KGRldik7CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaXItPmRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0X3N0b3A7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9zdG9wOgorCWN4MjM4ODVfaW5wdXRfaXJfc3RvcChkZXYpOworCWRldi0+aXJfaW5wdXQgPSBOVUxMOworZXJyX291dF9mcmVlOgorCWlyX2lucHV0X2ZyZWUoaW5wdXRfZGV2KTsKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGlyKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGN4MjM4ODVfaW5wdXRfZmluaShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKK3sKKwkvKiBBbHdheXMgc3RvcCB0aGUgSVIgaGFyZHdhcmUgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKwljeDIzODg1X2lucHV0X2lyX3N0b3AoZGV2KTsKKworCWlmIChkZXYtPmlyX2lucHV0ID09IE5VTEwpCisJCXJldHVybjsKKwlpcl9pbnB1dF9mcmVlKGRldi0+aXJfaW5wdXQtPmRldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pcl9pbnB1dC0+ZGV2KTsKKwlrZnJlZShkZXYtPmlyX2lucHV0KTsKKwlkZXYtPmlyX2lucHV0ID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzJjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAgRHJpdmVyIGZvciB0aGUgQ29uZXhhbnQgQ1gyMzg4NS83LzggUENJZSBicmlkZ2UKKyAqCisgKiAgSW5mcmFyZWQgcmVtb3RlIGNvbnRyb2wgaW5wdXQgZGV2aWNlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1gyMzg4NV9JTlBVVF9IXworI2RlZmluZSBfQ1gyMzg4NV9JTlBVVF9IXworaW50IGN4MjM4ODVfaW5wdXRfcnhfd29ya19oYW5kbGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgZXZlbnRzKTsKKworaW50IGN4MjM4ODVfaW5wdXRfaW5pdChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7Cit2b2lkIGN4MjM4ODVfaW5wdXRfZmluaShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjQ2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pb2N0bC5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjM4ODUvNy84IFBDSWUgYnJpZGdlCisgKgorICogIFZhcmlvdXMgY29tbW9uIGlvY3RsKCkgc3VwcG9ydCBmdW5jdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IEFuZHkgV2FsbHMgPGF3YWxsc0ByYWRpeC5uZXQ+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImN4MjM4ODUuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKworaW50IGN4MjM4ODVfZ19jaGlwX2lkZW50KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCSBzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjM4ODVfZmggKilmaCktPmRldjsKKwlpbnQgZXJyID0gMDsKKwl1OCByZXY7CisKKwljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKKwljaGlwLT5yZXZpc2lvbiA9IDA7CisJc3dpdGNoIChjaGlwLT5tYXRjaC50eXBlKSB7CisJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSE9TVDoKKwkJc3dpdGNoIChjaGlwLT5tYXRjaC5hZGRyKSB7CisJCWNhc2UgMDoKKwkJCXJldiA9IGN4X3JlYWQoUkRSX0NGRzIpICYgMHhmZjsKKwkJCXN3aXRjaCAoZGV2LT5wY2ktPmRldmljZSkgeworCQkJY2FzZSAweDg4NTI6CisJCQkJLyogcmV2IDB4MDQgY291bGQgYmUgJzg4NSBvciAnODg4LiBQaWNrICc4ODguICovCisJCQkJaWYgKHJldiA9PSAweDA0KQorCQkJCQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfQ1gyMzg4ODsKKwkJCQllbHNlCisJCQkJCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9DWDIzODg1OworCQkJCWJyZWFrOworCQkJY2FzZSAweDg4ODA6CisJCQkJaWYgKHJldiA9PSAweDBlIHx8IHJldiA9PSAweDBmKQorCQkJCQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfQ1gyMzg4NzsKKwkJCQllbHNlCisJCQkJCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9DWDIzODg4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfVU5LTk9XTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNoaXAtPnJldmlzaW9uID0gKGRldi0+cGNpLT5kZXZpY2UgPDwgMTYpIHwgKHJldiA8PCA4KSB8CisJCQkJCSAoZGV2LT5od3JldmlzaW9uICYgMHhmZik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKGRldi0+djRsX2RldmljZSAhPSBOVUxMKSB7CisJCQkJY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX0NYMjM0MTc7CisJCQkJY2hpcC0+cmV2aXNpb24gPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8qCisJCQkgKiBUaGUgaW50ZWdyYXRlZCBJUiBjb250cm9sbGVyIG9uIHRoZSBDWDIzODg4IGlzCisJCQkgKiBob3N0IGNoaXAgMi4gIEl0IG1heSBub3QgYmUgdXNlZC9pbml0aWFsaXplZCBvciBzZF9pcgorCQkJICogbWF5IGJlIHBvaW50aW5nIGF0IHRoZSBjeDI1ODQwIHN1YmRldmljZSBmb3IgdGhlCisJCQkgKiBJUiBjb250cm9sbGVyIG9uIHRoZSBDWDIzODg1LiAgVGh1cyB3ZSBmaW5kIGl0CisJCQkgKiB3aXRob3V0IHVzaW5nIHRoZSBkZXYtPnNkX2lyIHBvaW50ZXIuCisJCQkgKi8KKwkJCWNhbGxfaHcoZGV2LCBDWDIzODg1X0hXXzg4OF9JUiwgY29yZSwgZ19jaGlwX2lkZW50LAorCQkJCWNoaXApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOyAvKiBwZXIgVjRMMiBzcGVjICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0hJUF9NQVRDSF9JMkNfRFJJVkVSOgorCQkvKiBJZiBuZWVkZWQsIHJldHVybnMgVjRMMl9JREVOVF9BTUJJR1VPVVMgd2l0aG91dCBleHRyYSB3b3JrICovCisJCWNhbGxfYWxsKGRldiwgY29yZSwgZ19jaGlwX2lkZW50LCBjaGlwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFI6CisJCS8qCisJCSAqIFdlIGNvdWxkIHJldHVybiBWNEwyX0lERU5UX1VOS05PV04sIGJ1dCB3ZSBkb24ndCBkbyB0aGUgd29yaworCQkgKiB0byBsb29rIGlmIGEgY2hpcCBpcyBhdCB0aGUgYWRkcmVzcyB3aXRoIG5vIGRyaXZlci4gIFRoYXQncyBhCisJCSAqIGRhbmdlcm91cyB0aGluZyB0byBkbyB3aXRoIEVFUFJPTXMgYW55d2F5LgorCQkgKi8KKwkJY2FsbF9hbGwoZGV2LCBjb3JlLCBnX2NoaXBfaWRlbnQsIGNoaXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgY3gyMzg4NV9nX2hvc3RfcmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJaWYgKChyZWctPnJlZyAmIDB4MykgIT0gMCB8fCByZWctPnJlZyA+PSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGNpLCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWctPnNpemUgPSA0OworCXJlZy0+dmFsID0gY3hfcmVhZChyZWctPnJlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyMzQxN19nX3JlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAorCQkJICAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJdTMyIHZhbHVlOworCisJaWYgKGRldi0+djRsX2RldmljZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocmVnLT5yZWcgJiAweDMpICE9IDAgfHwgcmVnLT5yZWcgPj0gMHgxMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobWM0MTdfcmVnaXN0ZXJfcmVhZChkZXYsICh1MTYpIHJlZy0+cmVnLCAmdmFsdWUpKQorCQlyZXR1cm4gLUVJTlZBTDsgLyogVjRMMiBzcGVjLCBidXQgLUVSRU1PVEVJTyByZWFsbHkgKi8KKworCXJlZy0+c2l6ZSA9IDQ7CisJcmVnLT52YWwgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjM4ODVfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCSAgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjM4ODVfZmggKilmaCktPmRldjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChyZWctPm1hdGNoLnR5cGUgPT0gVjRMMl9DSElQX01BVENIX0hPU1QpIHsKKwkJc3dpdGNoIChyZWctPm1hdGNoLmFkZHIpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIGN4MjM4ODVfZ19ob3N0X3JlZ2lzdGVyKGRldiwgcmVnKTsKKwkJY2FzZSAxOgorCQkJcmV0dXJuIGN4MjM0MTdfZ19yZWdpc3RlcihkZXYsIHJlZyk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEZJWE1FIC0gYW55IGVycm9yIHJldHVybnMgc2hvdWxkIG5vdCBiZSBpZ25vcmVkICovCisJY2FsbF9hbGwoZGV2LCBjb3JlLCBnX3JlZ2lzdGVyLCByZWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjM4ODVfc19ob3N0X3JlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAorCQkJCSAgIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCWlmICgocmVnLT5yZWcgJiAweDMpICE9IDAgfHwgcmVnLT5yZWcgPj0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBjaSwgMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnLT5zaXplID0gNDsKKwljeF93cml0ZShyZWctPnJlZywgcmVnLT52YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjM0MTdfc19yZWdpc3RlcihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCWlmIChkZXYtPnY0bF9kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHJlZy0+cmVnICYgMHgzKSAhPSAwIHx8IHJlZy0+cmVnID49IDB4MTAwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1jNDE3X3JlZ2lzdGVyX3dyaXRlKGRldiwgKHUxNikgcmVnLT5yZWcsICh1MzIpIHJlZy0+dmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIFY0TDIgc3BlYywgYnV0IC1FUkVNT1RFSU8gcmVhbGx5ICovCisKKwlyZWctPnNpemUgPSA0OworCXJldHVybiAwOworfQorCitpbnQgY3gyMzg4NV9zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJICAgICAgIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyMzg4NV9maCAqKWZoKS0+ZGV2OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHJlZy0+bWF0Y2gudHlwZSA9PSBWNEwyX0NISVBfTUFUQ0hfSE9TVCkgeworCQlzd2l0Y2ggKHJlZy0+bWF0Y2guYWRkcikgeworCQljYXNlIDA6CisJCQlyZXR1cm4gY3gyMzg4NV9zX2hvc3RfcmVnaXN0ZXIoZGV2LCByZWcpOworCQljYXNlIDE6CisJCQlyZXR1cm4gY3gyMzQxN19zX3JlZ2lzdGVyKGRldiwgcmVnKTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogRklYTUUgLSBhbnkgZXJyb3IgcmV0dXJucyBzaG91bGQgbm90IGJlIGlnbm9yZWQgKi8KKwljYWxsX2FsbChkZXYsIGNvcmUsIHNfcmVnaXN0ZXIsIHJlZyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlvY3RsLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjBmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pb2N0bC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiAgRHJpdmVyIGZvciB0aGUgQ29uZXhhbnQgQ1gyMzg4NS83LzggUENJZSBicmlkZ2UKKyAqCisgKiAgVmFyaW91cyBjb21tb24gaW9jdGwoKSBzdXBwb3J0IGZ1bmN0aW9ucworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9DWDIzODg1X0lPQ1RMX0hfCisjZGVmaW5lIF9DWDIzODg1X0lPQ1RMX0hfCisKK2ludCBjeDIzODg1X2dfY2hpcF9pZGVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmNoaXApOworCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworaW50IGN4MjM4ODVfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCSAgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZyk7CisKKworaW50IGN4MjM4ODVfc19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCSAgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZyk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU5ODJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaXIuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDIzODg1LzcvOCBQQ0llIGJyaWRnZQorICoKKyAqICBJbmZyYXJlZCBkZXZpY2Ugc3VwcG9ydCByb3V0aW5lcyAtIG5vbi1pbnB1dCwgbm9uLXZsNDJfc3ViZGV2IHJvdXRpbmVzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisKKyNpbmNsdWRlICJjeDIzODg1LmgiCisjaW5jbHVkZSAiY3gyMzg4NS1pbnB1dC5oIgorCisjZGVmaW5lIENYMjM4ODVfSVJfUlhfRklGT19TRVJWSUNFX1JFUQkJMAorI2RlZmluZSBDWDIzODg1X0lSX1JYX0VORF9PRl9SWF9ERVRFQ1RFRAkxCisjZGVmaW5lIENYMjM4ODVfSVJfUlhfSFdfRklGT19PVkVSUlVOCQkyCisjZGVmaW5lIENYMjM4ODVfSVJfUlhfU1dfRklGT19PVkVSUlVOCQkzCisKKyNkZWZpbmUgQ1gyMzg4NV9JUl9UWF9GSUZPX1NFUlZJQ0VfUkVRCQkwCisKKwordm9pZCBjeDIzODg1X2lyX3J4X3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPQorCQkJICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGN4MjM4ODVfZGV2LCBpcl9yeF93b3JrKTsKKwl1MzIgZXZlbnRzID0gMDsKKwl1bnNpZ25lZCBsb25nICpub3RpZmljYXRpb25zID0gJmRldi0+aXJfcnhfbm90aWZpY2F0aW9uczsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ1gyMzg4NV9JUl9SWF9TV19GSUZPX09WRVJSVU4sIG5vdGlmaWNhdGlvbnMpKQorCQlldmVudHMgfD0gVjRMMl9TVUJERVZfSVJfUlhfU1dfRklGT19PVkVSUlVOOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ1gyMzg4NV9JUl9SWF9IV19GSUZPX09WRVJSVU4sIG5vdGlmaWNhdGlvbnMpKQorCQlldmVudHMgfD0gVjRMMl9TVUJERVZfSVJfUlhfSFdfRklGT19PVkVSUlVOOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ1gyMzg4NV9JUl9SWF9FTkRfT0ZfUlhfREVURUNURUQsIG5vdGlmaWNhdGlvbnMpKQorCQlldmVudHMgfD0gVjRMMl9TVUJERVZfSVJfUlhfRU5EX09GX1JYX0RFVEVDVEVEOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ1gyMzg4NV9JUl9SWF9GSUZPX1NFUlZJQ0VfUkVRLCBub3RpZmljYXRpb25zKSkKKwkJZXZlbnRzIHw9IFY0TDJfU1VCREVWX0lSX1JYX0ZJRk9fU0VSVklDRV9SRVE7CisKKwlpZiAoZXZlbnRzID09IDApCisJCXJldHVybjsKKworCWlmIChkZXYtPmlyX2lucHV0KQorCQljeDIzODg1X2lucHV0X3J4X3dvcmtfaGFuZGxlcihkZXYsIGV2ZW50cyk7Cit9CisKK3ZvaWQgY3gyMzg4NV9pcl90eF93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0KKwkJCSAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjeDIzODg1X2RldiwgaXJfdHhfd29yayk7CisJdTMyIGV2ZW50cyA9IDA7CisJdW5zaWduZWQgbG9uZyAqbm90aWZpY2F0aW9ucyA9ICZkZXYtPmlyX3R4X25vdGlmaWNhdGlvbnM7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENYMjM4ODVfSVJfVFhfRklGT19TRVJWSUNFX1JFUSwgbm90aWZpY2F0aW9ucykpCisJCWV2ZW50cyB8PSBWNEwyX1NVQkRFVl9JUl9UWF9GSUZPX1NFUlZJQ0VfUkVROworCisJaWYgKGV2ZW50cyA9PSAwKQorCQlyZXR1cm47CisKK30KKworLyogQ2FsbGVkIGluIGFuIElSUSBjb250ZXh0ICovCit2b2lkIGN4MjM4ODVfaXJfcnhfdjRsMl9kZXZfbm90aWZ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBldmVudHMpCit7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSB0b19jeDIzODg1KHNkLT52NGwyX2Rldik7CisJdW5zaWduZWQgbG9uZyAqbm90aWZpY2F0aW9ucyA9ICZkZXYtPmlyX3J4X25vdGlmaWNhdGlvbnM7CisKKwlpZiAoZXZlbnRzICYgVjRMMl9TVUJERVZfSVJfUlhfRklGT19TRVJWSUNFX1JFUSkKKwkJc2V0X2JpdChDWDIzODg1X0lSX1JYX0ZJRk9fU0VSVklDRV9SRVEsIG5vdGlmaWNhdGlvbnMpOworCWlmIChldmVudHMgJiBWNEwyX1NVQkRFVl9JUl9SWF9FTkRfT0ZfUlhfREVURUNURUQpCisJCXNldF9iaXQoQ1gyMzg4NV9JUl9SWF9FTkRfT0ZfUlhfREVURUNURUQsIG5vdGlmaWNhdGlvbnMpOworCWlmIChldmVudHMgJiBWNEwyX1NVQkRFVl9JUl9SWF9IV19GSUZPX09WRVJSVU4pCisJCXNldF9iaXQoQ1gyMzg4NV9JUl9SWF9IV19GSUZPX09WRVJSVU4sIG5vdGlmaWNhdGlvbnMpOworCWlmIChldmVudHMgJiBWNEwyX1NVQkRFVl9JUl9SWF9TV19GSUZPX09WRVJSVU4pCisJCXNldF9iaXQoQ1gyMzg4NV9JUl9SWF9TV19GSUZPX09WRVJSVU4sIG5vdGlmaWNhdGlvbnMpOworCXNjaGVkdWxlX3dvcmsoJmRldi0+aXJfcnhfd29yayk7Cit9CisKKy8qIENhbGxlZCBpbiBhbiBJUlEgY29udGV4dCAqLwordm9pZCBjeDIzODg1X2lyX3R4X3Y0bDJfZGV2X25vdGlmeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgZXZlbnRzKQoreworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gdG9fY3gyMzg4NShzZC0+djRsMl9kZXYpOworCXVuc2lnbmVkIGxvbmcgKm5vdGlmaWNhdGlvbnMgPSAmZGV2LT5pcl90eF9ub3RpZmljYXRpb25zOworCisJaWYgKGV2ZW50cyAmIFY0TDJfU1VCREVWX0lSX1RYX0ZJRk9fU0VSVklDRV9SRVEpCisJCXNldF9iaXQoQ1gyMzg4NV9JUl9UWF9GSUZPX1NFUlZJQ0VfUkVRLCBub3RpZmljYXRpb25zKTsKKwlzY2hlZHVsZV93b3JrKCZkZXYtPmlyX3R4X3dvcmspOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4YTZkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlyLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDIzODg1LzcvOCBQQ0llIGJyaWRnZQorICoKKyAqICBJbmZyYXJlZCBkZXZpY2Ugc3VwcG9ydCByb3V0aW5lcyAtIG5vbi1pbnB1dCwgbm9uLXZsNDJfc3ViZGV2IHJvdXRpbmVzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ1gyMzg4NV9JUl9IXworI2RlZmluZSBfQ1gyMzg4NV9JUl9IXwordm9pZCBjeDIzODg1X2lyX3J4X3Y0bDJfZGV2X25vdGlmeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgZXZlbnRzKTsKK3ZvaWQgY3gyMzg4NV9pcl90eF92NGwyX2Rldl9ub3RpZnkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGV2ZW50cyk7CisKK3ZvaWQgY3gyMzg4NV9pcl9yeF93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgY3gyMzg4NV9pcl90eF93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1yZWcuaAppbmRleCBlYWZiZTUyLi5jMGJjOWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1yZWcuaApAQCAtMjEyLDggKzIxMiw5IEBACiAKICNkZWZpbmUgREVWX0NOVFJMMgkweDAwMDQwMDAwCiAKLSNkZWZpbmUgUENJX01TS19HUElPMSAgICgxIDw8IDI0KQotI2RlZmluZSBQQ0lfTVNLX0dQSU8wICAgKDEgPDwgMjMpCisjZGVmaW5lIFBDSV9NU0tfSVIgICAgICAgICgxIDw8IDI4KQorI2RlZmluZSBQQ0lfTVNLX0dQSU8xICAgICAoMSA8PCAyNCkKKyNkZWZpbmUgUENJX01TS19HUElPMCAgICAgKDEgPDwgMjMpCiAjZGVmaW5lIFBDSV9NU0tfQVBCX0RNQSAgICgxIDw8IDEyKQogI2RlZmluZSBQQ0lfTVNLX0FMX1dSICAgICAoMSA8PCAxMSkKICNkZWZpbmUgUENJX01TS19BTF9SRCAgICAgKDEgPDwgMTApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYwppbmRleCA2NTRjYzI1Li44YjM3MmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJjeDIzODg1LmgiCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSAiY3gyMzg4NS1pb2N0bC5oIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oInY0bDIgZHJpdmVyIG1vZHVsZSBmb3IgY3gyMzg4NSBiYXNlZCBUViBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiIpOwpAQCAtNDAxLDYgKzQwMiwxMyBAQAogCQlJTlBVVChpbnB1dCktPmdwaW8yLCBJTlBVVChpbnB1dCktPmdwaW8zKTsKIAlkZXYtPmlucHV0ID0gaW5wdXQ7CiAKKwlpZiAoZGV2LT5ib2FyZCA9PSBDWDIzODg1X0JPQVJEX01ZR0lDQV9YODUwNiB8fAorCQlkZXYtPmJvYXJkID09IENYMjM4ODVfQk9BUkRfTUFHSUNQUk9fUFJPSERUVkUyKSB7CisJCS8qIFNlbGVjdCBBbmFsb2cgVFYgKi8KKwkJaWYgKElOUFVUKGlucHV0KS0+dHlwZSA9PSBDWDIzODg1X1ZNVVhfVEVMRVZJU0lPTikKKwkJCWN4MjM4ODVfZ3Bpb19jbGVhcihkZXYsIEdQSU9fMCk7CisJfQorCiAJLyogVGVsbCB0aGUgaW50ZXJuYWwgQS9WIGRlY29kZXIgKi8KIAl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfY3gyNTg0MCwgdmlkZW8sIHNfcm91dGluZywKIAkJCUlOUFVUKGlucHV0KS0+dm11eCwgMCwgMCk7CkBAIC0xMTQ0LDYgKzExNTIsNyBAQAogCQlbQ1gyMzg4NV9WTVVYX0NPTVBPU0lURTNdID0gIkNvbXBvc2l0ZTMiLAogCQlbQ1gyMzg4NV9WTVVYX0NPTVBPU0lURTRdID0gIkNvbXBvc2l0ZTQiLAogCQlbQ1gyMzg4NV9WTVVYX1NWSURFT10gICAgID0gIlMtVmlkZW8iLAorCQlbQ1gyMzg4NV9WTVVYX0NPTVBPTkVOVF0gID0gIkNvbXBvbmVudCIsCiAJCVtDWDIzODg1X1ZNVVhfVEVMRVZJU0lPTl0gPSAiVGVsZXZpc2lvbiIsCiAJCVtDWDIzODg1X1ZNVVhfQ0FCTEVdICAgICAgPSAiQ2FibGUgVFYiLAogCQlbQ1gyMzg4NV9WTVVYX0RWQl0gICAgICAgID0gIkRWQiIsCkBAIC0xMzEyLDM0ICsxMzIxLDYgQEAKIAkJY3gyMzg4NV9zZXRfZnJlcShkZXYsIGYpOwogfQogCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotc3RhdGljIGludCB2aWRpb2NfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCQkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCi17Ci0Jc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDIzODg1X2ZoICopZmgpLT5kZXY7Ci0KLQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYWxsX2FsbChkZXYsIGNvcmUsIGdfcmVnaXN0ZXIsIHJlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCQkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCi17Ci0Jc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDIzODg1X2ZoICopZmgpLT5kZXY7Ci0KLQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYWxsX2FsbChkZXYsIGNvcmUsIHNfcmVnaXN0ZXIsIHJlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgdm9pZCBjeDIzODg1X3ZpZF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTE0NDksOSArMTQzMCwxMCBAQAogCS52aWRpb2Nfc190dW5lciAgICAgICA9IHZpZGlvY19zX3R1bmVyLAogCS52aWRpb2NfZ19mcmVxdWVuY3kgICA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKIAkudmlkaW9jX3NfZnJlcXVlbmN5ICAgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19nX2NoaXBfaWRlbnQgID0gY3gyMzg4NV9nX2NoaXBfaWRlbnQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS52aWRpb2NfZ19yZWdpc3RlciAgICA9IHZpZGlvY19nX3JlZ2lzdGVyLAotCS52aWRpb2Nfc19yZWdpc3RlciAgICA9IHZpZGlvY19zX3JlZ2lzdGVyLAorCS52aWRpb2NfZ19yZWdpc3RlciAgICA9IGN4MjM4ODVfZ19yZWdpc3RlciwKKwkudmlkaW9jX3NfcmVnaXN0ZXIgICAgPSBjeDIzODg1X3NfcmVnaXN0ZXIsCiAjZW5kaWYKIH07CiAKQEAgLTE1MjksOSArMTUxMSwxMSBAQAogCQlpZiAoc2QpIHsKIAkJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CiAKKwkJCW1lbXNldCgmdHVuX3NldHVwLCAwLCBzaXplb2YodHVuX3NldHVwKSk7CiAJCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9BTkFMT0dfVFY7CiAJCQl0dW5fc2V0dXAudHlwZSA9IGRldi0+dHVuZXJfdHlwZTsKIAkJCXR1bl9zZXR1cC5hZGRyID0gdjRsMl9pMmNfc3ViZGV2X2FkZHIoc2QpOworCQkJdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gY3gyMzg4NV90dW5lcl9jYWxsYmFjazsKIAogCQkJdjRsMl9zdWJkZXZfY2FsbChzZCwgdHVuZXIsIHNfdHlwZV9hZGRyLCAmdHVuX3NldHVwKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKaW5kZXggY2M3YTE2NS4uZmE3NDQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCkBAIC03OSw2ICs3OSw4IEBACiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTUFHSUNQUk9fUFJPSERUVkUyICAgICAgIDIzCiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTAgICAgICAgIDI0CiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FODAwICAgIDI1CisjZGVmaW5lIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTAgICAgICAgIDI2CisjZGVmaW5lIENYMjM4ODVfQk9BUkRfTVlHSUNBX1g4NTU4UFJPICAgICAgICAgIDI3CiAKICNkZWZpbmUgR1BJT18wIDB4MDAwMDAwMDEKICNkZWZpbmUgR1BJT18xIDB4MDAwMDAwMDIKQEAgLTE1Nyw2ICsxNTksNyBAQAogCUNYMjM4ODVfVk1VWF9DT01QT1NJVEUzLAogCUNYMjM4ODVfVk1VWF9DT01QT1NJVEU0LAogCUNYMjM4ODVfVk1VWF9TVklERU8sCisJQ1gyMzg4NV9WTVVYX0NPTVBPTkVOVCwKIAlDWDIzODg1X1ZNVVhfVEVMRVZJU0lPTiwKIAlDWDIzODg1X1ZNVVhfQ0FCTEUsCiAJQ1gyMzg4NV9WTVVYX0RWQiwKQEAgLTI5NywxMCArMzAwLDYgQEAKIAkvKiBBbGxvdyBhIHNpbmdsZSB0c3BvcnQgdG8gaGF2ZSBtdWx0aXBsZSBmcm9udGVuZHMgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBudW1fZnJvbnRlbmRzOwogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwb3J0X3ByaXY7Ci0KLQkvKiBGSVhNRTogdGVtcG9yYXJ5IGhhY2sgKi8KLQlpbnQgKCpzZXRfZnJvbnRlbmRfc2F2ZSkgKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwKLQkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqKTsKIH07CiAKIHN0cnVjdCBjeDIzODg1X2RldiB7CkBAIC0zNTYsNiArMzU1LDE2IEBACiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaGFzX3JhZGlvOwogCXN0cnVjdCB2NGwyX3N1YmRldiAJICAgKnNkX2N4MjU4NDA7CiAKKwkvKiBJbmZyYXJlZCAqLworCXN0cnVjdCB2NGwyX3N1YmRldiAgICAgICAgICpzZF9pcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJICAgaXJfcnhfd29yazsKKwl1bnNpZ25lZCBsb25nCQkgICBpcl9yeF9ub3RpZmljYXRpb25zOworCXN0cnVjdCB3b3JrX3N0cnVjdAkgICBpcl90eF93b3JrOworCXVuc2lnbmVkIGxvbmcJCSAgIGlyX3R4X25vdGlmaWNhdGlvbnM7CisKKwlzdHJ1Y3QgY2FyZF9pcgkJICAgKmlyX2lucHV0OworCWF0b21pY190CQkgICBpcl9pbnB1dF9zdG9wcGluZzsKKwogCS8qIFY0bCAqLwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGZyZXE7CiAJc3RydWN0IHZpZGVvX2RldmljZSAgICAgICAgKnZpZGVvX2RldjsKQEAgLTM4Myw2ICszOTIsMTMgQEAKICNkZWZpbmUgY2FsbF9hbGwoZGV2LCBvLCBmLCBhcmdzLi4uKSBcCiAJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIG8sIGYsICMjYXJncykKIAorI2RlZmluZSBDWDIzODg1X0hXXzg4OF9JUiAoMSA8PCAwKQorCisjZGVmaW5lIGNhbGxfaHcoZGV2LCBncnBpZCwgbywgZiwgYXJncy4uLikgXAorCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCBncnBpZCwgbywgZiwgIyNhcmdzKQorCitleHRlcm4gc3RydWN0IHY0bDJfc3ViZGV2ICpjeDIzODg1X2ZpbmRfaHcoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBodyk7CisKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGN4MjM4ODVfZGV2bGlzdDsKIAogI2RlZmluZSBTUkFNX0NIMDEgIDAgLyogVmlkZW8gQSAqLwpAQCAtNDU1LDYgKzQ3MSw3IEBACiAKIGV4dGVybiB2b2lkIGN4MjM4ODVfZ3Bpb19zZXQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBtYXNrKTsKIGV4dGVybiB2b2lkIGN4MjM4ODVfZ3Bpb19jbGVhcihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIG1hc2spOworZXh0ZXJuIHUzMiBjeDIzODg1X2dwaW9fZ2V0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgbWFzayk7CiBleHRlcm4gdm9pZCBjeDIzODg1X2dwaW9fZW5hYmxlKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgbWFzaywKIAlpbnQgYXNvdXRwdXQpOwogCkBAIC00NzEsNiArNDg4LDggQEAKIAlpbnQgY29tbWFuZCwgaW50IGFyZyk7CiBleHRlcm4gdm9pZCBjeDIzODg1X2NhcmRfbGlzdChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7CiBleHRlcm4gaW50ICBjeDIzODg1X2lyX2luaXQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgY3gyMzg4NV9pcl9wY2lfaW50X2VuYWJsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBjeDIzODg1X2lyX2Zpbmkoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgY3gyMzg4NV9ncGlvX3NldHVwKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIGN4MjM4ODVfY2FyZF9zZXR1cChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBjeDIzODg1X2NhcmRfc2V0dXBfcHJlX2kyYyhzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7CkBAIC01MTUsNiArNTM0LDEwIEBACiBleHRlcm4gdm9pZCBjeDIzODg1X21jNDE3X2luaXQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOwogZXh0ZXJuIGludCBtYzQxN19tZW1vcnlfcmVhZChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIGFkZHJlc3MsIHUzMiAqdmFsdWUpOwogZXh0ZXJuIGludCBtYzQxN19tZW1vcnlfd3JpdGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBhZGRyZXNzLCB1MzIgdmFsdWUpOworZXh0ZXJuIGludCBtYzQxN19yZWdpc3Rlcl9yZWFkKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAorCQkJCXUxNiBhZGRyZXNzLCB1MzIgKnZhbHVlKTsKK2V4dGVybiBpbnQgbWM0MTdfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJdTE2IGFkZHJlc3MsIHUzMiB2YWx1ZSk7CiBleHRlcm4gdm9pZCBtYzQxN19ncGlvX3NldChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIG1hc2spOwogZXh0ZXJuIHZvaWQgbWM0MTdfZ3Bpb19jbGVhcihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIG1hc2spOwogZXh0ZXJuIHZvaWQgbWM0MTdfZ3Bpb19lbmFibGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBtYXNrLCBpbnQgYXNvdXRwdXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODgtaXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg4LWlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjYzhhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg4LWlyLmMKQEAgLTAsMCArMSwxMjM5IEBACisvKgorICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjM4ODUvNy84IFBDSWUgYnJpZGdlCisgKgorICogIENYMjM4ODggSW50ZWdyYXRlZCBDb25zdW1lciBJbmZyYXJlZCBDb250cm9sbGVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorCisjaW5jbHVkZSAiY3gyMzg4NS5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGlyXzg4OF9kZWJ1ZzsKK21vZHVsZV9wYXJhbShpcl84ODhfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyXzg4OF9kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbQ1gyMzg4OCBJUiBjb250cm9sbGVyXSIpOworCisjZGVmaW5lIENYMjM4ODhfSVJfUkVHX0JBU0UgCTB4MTcwMDAwCisvKgorICogVGhlc2UgQ1gyMzg4OCByZWdpc3RlciBvZmZzZXRzIGhhdmUgYSBzdHJhaWdodGZvcndhcmQgb25lIHRvIG9uZSBtYXBwaW5nCisgKiB0byB0aGUgQ1gyMzg4NSByZWdpc3RlciBvZmZzZXRzIG9mIDB4MjAwIHRocm91Z2ggMHgyMTgKKyAqLworI2RlZmluZSBDWDIzODg4X0lSX0NOVFJMX1JFRwkweDE3MDAwMAorI2RlZmluZSBDTlRSTF9XSU5fM18zCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ05UUkxfV0lOXzRfMwkweDAwMDAwMDAxCisjZGVmaW5lIENOVFJMX1dJTl8zXzQJMHgwMDAwMDAwMgorI2RlZmluZSBDTlRSTF9XSU5fNF80CTB4MDAwMDAwMDMKKyNkZWZpbmUgQ05UUkxfV0lOCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ05UUkxfRURHX05PTkUJMHgwMDAwMDAwMAorI2RlZmluZSBDTlRSTF9FREdfRkFMTAkweDAwMDAwMDA0CisjZGVmaW5lIENOVFJMX0VER19SSVNFCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ05UUkxfRURHX0JPVEgJMHgwMDAwMDAwQworI2RlZmluZSBDTlRSTF9FREcJMHgwMDAwMDAwQworI2RlZmluZSBDTlRSTF9ETUQJMHgwMDAwMDAxMAorI2RlZmluZSBDTlRSTF9NT0QJMHgwMDAwMDAyMAorI2RlZmluZSBDTlRSTF9SRkUJMHgwMDAwMDA0MAorI2RlZmluZSBDTlRSTF9URkUJMHgwMDAwMDA4MAorI2RlZmluZSBDTlRSTF9SWEUJMHgwMDAwMDEwMAorI2RlZmluZSBDTlRSTF9UWEUJMHgwMDAwMDIwMAorI2RlZmluZSBDTlRSTF9SSUMJMHgwMDAwMDQwMAorI2RlZmluZSBDTlRSTF9USUMJMHgwMDAwMDgwMAorI2RlZmluZSBDTlRSTF9DUEwJMHgwMDAwMTAwMAorI2RlZmluZSBDTlRSTF9MQk0JMHgwMDAwMjAwMAorI2RlZmluZSBDTlRSTF9SCQkweDAwMDA0MDAwCisKKyNkZWZpbmUgQ1gyMzg4OF9JUl9UWENMS19SRUcJMHgxNzAwMDQKKyNkZWZpbmUgVFhDTEtfVENECTB4MDAwMEZGRkYKKworI2RlZmluZSBDWDIzODg4X0lSX1JYQ0xLX1JFRwkweDE3MDAwOAorI2RlZmluZSBSWENMS19SQ0QJMHgwMDAwRkZGRgorCisjZGVmaW5lIENYMjM4ODhfSVJfQ0RVVFlfUkVHCTB4MTcwMDBDCisjZGVmaW5lIENEVVRZX0NEQwkweDAwMDAwMDBGCisKKyNkZWZpbmUgQ1gyMzg4OF9JUl9TVEFUU19SRUcJMHgxNzAwMTAKKyNkZWZpbmUgU1RBVFNfUlRPCTB4MDAwMDAwMDEKKyNkZWZpbmUgU1RBVFNfUk9SCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1RBVFNfUkJZCTB4MDAwMDAwMDQKKyNkZWZpbmUgU1RBVFNfVEJZCTB4MDAwMDAwMDgKKyNkZWZpbmUgU1RBVFNfUlNSCTB4MDAwMDAwMTAKKyNkZWZpbmUgU1RBVFNfVFNSCTB4MDAwMDAwMjAKKworI2RlZmluZSBDWDIzODg4X0lSX0lSUUVOX1JFRwkweDE3MDAxNAorI2RlZmluZSBJUlFFTl9SVEUJMHgwMDAwMDAwMQorI2RlZmluZSBJUlFFTl9ST0UJMHgwMDAwMDAwMgorI2RlZmluZSBJUlFFTl9SU0UJMHgwMDAwMDAxMAorI2RlZmluZSBJUlFFTl9UU0UJMHgwMDAwMDAyMAorCisjZGVmaW5lIENYMjM4ODhfSVJfRklMVFJfUkVHCTB4MTcwMDE4CisjZGVmaW5lIEZJTFRSX0xQRgkweDAwMDBGRkZGCisKKy8qIFRoaXMgcmVnaXN0ZXIgZG9lc24ndCBmb2xsb3cgdGhlIHBhdHRlcm47IGl0J3MgMHgyM0Mgb24gYSBDWDIzODg1ICovCisjZGVmaW5lIENYMjM4ODhfSVJfRklGT19SRUcJMHgxNzAwNDAKKyNkZWZpbmUgRklGT19SWFRYCTB4MDAwMEZGRkYKKyNkZWZpbmUgRklGT19SWFRYX0xWTAkweDAwMDEwMDAwCisjZGVmaW5lIEZJRk9fUlhUWF9SVE8JMHgwMDAxRkZGRgorI2RlZmluZSBGSUZPX1JYX05EVgkweDAwMDIwMDAwCisjZGVmaW5lIEZJRk9fUlhfREVQVEgJOAorI2RlZmluZSBGSUZPX1RYX0RFUFRICTgKKworLyogQ1gyMzg4OCB1bmlxdWUgcmVnaXN0ZXJzICovCisjZGVmaW5lIENYMjM4ODhfSVJfU0VFRFBfUkVHCTB4MTcwMDFDCisjZGVmaW5lIENYMjM4ODhfSVJfVElNT0xfUkVHCTB4MTcwMDIwCisjZGVmaW5lIENYMjM4ODhfSVJfV0FLRTBfUkVHCTB4MTcwMDI0CisjZGVmaW5lIENYMjM4ODhfSVJfV0FLRTFfUkVHCTB4MTcwMDI4CisjZGVmaW5lIENYMjM4ODhfSVJfV0FLRTJfUkVHCTB4MTcwMDJDCisjZGVmaW5lIENYMjM4ODhfSVJfTUFTSzBfUkVHCTB4MTcwMDMwCisjZGVmaW5lIENYMjM4ODhfSVJfTUFTSzFfUkVHCTB4MTcwMDM0CisjZGVmaW5lIENYMjM4ODhfSVJfTUFLUzJfUkVHCTB4MTcwMDM4CisjZGVmaW5lIENYMjM4ODhfSVJfRFBJUEdfUkVHCTB4MTcwMDNDCisjZGVmaW5lIENYMjM4ODhfSVJfTEVBUk5fUkVHCTB4MTcwMDQ0CisKKyNkZWZpbmUgQ1gyMzg4OF9WSURDTEtfRlJFUQkxMDgwMDAwMDAgLyogMTA4IE1IeiwgQlQuNjU2ICovCisjZGVmaW5lIENYMjM4ODhfSVJfUkVGQ0xLX0ZSRVEJKENYMjM4ODhfVklEQ0xLX0ZSRVEgLyAyKQorCisjZGVmaW5lIENYMjM4ODhfSVJfUlhfS0ZJRk9fU0laRQkoNTEyICogc2l6ZW9mKHUzMikpCisjZGVmaW5lIENYMjM4ODhfSVJfVFhfS0ZJRk9fU0laRQkoNTEyICogc2l6ZW9mKHUzMikpCisKK3N0cnVjdCBjeDIzODg4X2lyX3N0YXRlIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXY7CisJdTMyIGlkOworCXUzMiByZXY7CisKKwlzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyByeF9wYXJhbXM7CisJc3RydWN0IG11dGV4IHJ4X3BhcmFtc19sb2NrOworCWF0b21pY190IHJ4Y2xrX2RpdmlkZXI7CisJYXRvbWljX3QgcnhfaW52ZXJ0OworCisJc3RydWN0IGtmaWZvICpyeF9rZmlmbzsKKwlzcGlubG9ja190IHJ4X2tmaWZvX2xvY2s7CisKKwlzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyB0eF9wYXJhbXM7CisJc3RydWN0IG11dGV4IHR4X3BhcmFtc19sb2NrOworCWF0b21pY190IHR4Y2xrX2RpdmlkZXI7CisKKwlzdHJ1Y3Qga2ZpZm8gKnR4X2tmaWZvOworCXNwaW5sb2NrX3QgdHhfa2ZpZm9fbG9jazsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGN4MjM4ODhfaXJfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworfQorCisvKgorICogSVIgcmVnaXN0ZXIgYmxvY2sgcmVhZCBhbmQgd3JpdGUgZnVuY3Rpb25zCisgKi8KK3N0YXRpYworaW5saW5lIGludCBjeDIzODg4X2lyX3dyaXRlNChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIGFkZHIsIHUzMiB2YWx1ZSkKK3sKKwljeF93cml0ZShhZGRyLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN4MjM4ODhfaXJfcmVhZDQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBhZGRyKQoreworCXJldHVybiBjeF9yZWFkKGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeDIzODg4X2lyX2FuZF9vcjQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBhZGRyLAorCQkJCSAgICAgdTMyIGFuZF9tYXNrLCB1MzIgb3JfdmFsdWUpCit7CisJY3hfYW5kb3IoYWRkciwgfmFuZF9tYXNrLCBvcl92YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSeCBhbmQgVHggQ2xvY2sgRGl2aWRlciByZWdpc3RlciBjb21wdXRhdGlvbnMKKyAqCisgKiBOb3RlIHRoZSBsYXJnZXN0IGNsb2NrIGRpdmlkZXIgdmFsdWUgb2YgMHhmZmZmIGNvcnJlc3BvbmRzIHRvOgorICogCSgweGZmZmYgKyAxKSAqIDEwMDAgLyAxMDgvMiBNSHogPSAxLDIxMyw2MjkuNjI5Li4uIG5zCisgKiB3aGljaCBmaXRzIGluIDIxIGJpdHMsIHNvIHdlJ2xsIHVzZSB1bnNpZ25lZCBpbnQgZm9yIHRpbWUgYXJndW1lbnRzLgorICovCitzdGF0aWMgaW5saW5lIHUxNiBjb3VudF90b19jbG9ja19kaXZpZGVyKHVuc2lnbmVkIGludCBkKQoreworCWlmIChkID4gUlhDTEtfUkNEICsgMSkKKwkJZCA9IFJYQ0xLX1JDRDsKKwllbHNlIGlmIChkIDwgMikKKwkJZCA9IDE7CisJZWxzZQorCQlkLS07CisJcmV0dXJuICh1MTYpIGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG5zX3RvX2Nsb2NrX2RpdmlkZXIodW5zaWduZWQgaW50IG5zKQoreworCXJldHVybiBjb3VudF90b19jbG9ja19kaXZpZGVyKAorCQlESVZfUk9VTkRfQ0xPU0VTVChDWDIzODg4X0lSX1JFRkNMS19GUkVRIC8gMTAwMDAwMCAqIG5zLCAxMDAwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNsb2NrX2RpdmlkZXJfdG9fbnModW5zaWduZWQgaW50IGRpdmlkZXIpCit7CisJLyogUGVyaW9kIG9mIHRoZSBSeCBvciBUeCBjbG9jayBpbiBucyAqLworCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVCgoZGl2aWRlciArIDEpICogMTAwMCwKKwkJCQkgQ1gyMzg4OF9JUl9SRUZDTEtfRlJFUSAvIDEwMDAwMDApOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBjYXJyaWVyX2ZyZXFfdG9fY2xvY2tfZGl2aWRlcih1bnNpZ25lZCBpbnQgZnJlcSkKK3sKKwlyZXR1cm4gY291bnRfdG9fY2xvY2tfZGl2aWRlcigKKwkJCSAgRElWX1JPVU5EX0NMT1NFU1QoQ1gyMzg4OF9JUl9SRUZDTEtfRlJFUSwgZnJlcSAqIDE2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNsb2NrX2RpdmlkZXJfdG9fY2Fycmllcl9mcmVxKHVuc2lnbmVkIGludCBkaXZpZGVyKQoreworCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVChDWDIzODg4X0lSX1JFRkNMS19GUkVRLCAoZGl2aWRlciArIDEpICogMTYpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBmcmVxX3RvX2Nsb2NrX2RpdmlkZXIodW5zaWduZWQgaW50IGZyZXEsCisJCQkJCXVuc2lnbmVkIGludCByb2xsb3ZlcnMpCit7CisJcmV0dXJuIGNvdW50X3RvX2Nsb2NrX2RpdmlkZXIoCisJCSAgIERJVl9ST1VORF9DTE9TRVNUKENYMjM4ODhfSVJfUkVGQ0xLX0ZSRVEsIGZyZXEgKiByb2xsb3ZlcnMpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2xvY2tfZGl2aWRlcl90b19mcmVxKHVuc2lnbmVkIGludCBkaXZpZGVyLAorCQkJCQkJIHVuc2lnbmVkIGludCByb2xsb3ZlcnMpCit7CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKENYMjM4ODhfSVJfUkVGQ0xLX0ZSRVEsCisJCQkJIChkaXZpZGVyICsgMSkgKiByb2xsb3ZlcnMpOworfQorCisvKgorICogTG93IFBhc3MgRmlsdGVyIHJlZ2lzdGVyIGNhbGN1bGF0aW9ucworICoKKyAqIE5vdGUgdGhlIGxhcmdlc3QgY291bnQgdmFsdWUgb2YgMHhmZmZmIGNvcnJlc3BvbmRzIHRvOgorICogCTB4ZmZmZiAqIDEwMDAgLyAxMDgvMiBNSHogPSAxLDIxMyw2MTEuMTEuLi4gbnMKKyAqIHdoaWNoIGZpdHMgaW4gMjEgYml0cywgc28gd2UnbGwgdXNlIHVuc2lnbmVkIGludCBmb3IgdGltZSBhcmd1bWVudHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IGNvdW50X3RvX2xwZl9jb3VudCh1bnNpZ25lZCBpbnQgZCkKK3sKKwlpZiAoZCA+IEZJTFRSX0xQRikKKwkJZCA9IEZJTFRSX0xQRjsKKwllbHNlIGlmIChkIDwgNCkKKwkJZCA9IDA7CisJcmV0dXJuICh1MTYpIGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG5zX3RvX2xwZl9jb3VudCh1bnNpZ25lZCBpbnQgbnMpCit7CisJcmV0dXJuIGNvdW50X3RvX2xwZl9jb3VudCgKKwkJRElWX1JPVU5EX0NMT1NFU1QoQ1gyMzg4OF9JUl9SRUZDTEtfRlJFUSAvIDEwMDAwMDAgKiBucywgMTAwMCkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBscGZfY291bnRfdG9fbnModW5zaWduZWQgaW50IGNvdW50KQoreworCS8qIER1cmF0aW9uIG9mIHRoZSBMb3cgUGFzcyBGaWx0ZXIgcmVqZWN0aW9uIHdpbmRvdyBpbiBucyAqLworCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVChjb3VudCAqIDEwMDAsCisJCQkJIENYMjM4ODhfSVJfUkVGQ0xLX0ZSRVEgLyAxMDAwMDAwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbHBmX2NvdW50X3RvX3VzKHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwkvKiBEdXJhdGlvbiBvZiB0aGUgTG93IFBhc3MgRmlsdGVyIHJlamVjdGlvbiB3aW5kb3cgaW4gdXMgKi8KKwlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QoY291bnQsIENYMjM4ODhfSVJfUkVGQ0xLX0ZSRVEgLyAxMDAwMDAwKTsKK30KKworLyoKKyAqIEZJRk8gcmVnaXN0ZXIgcHVsc2Ugd2lkdGggY291bnQgY29tcHVhdGlvbnMKKyAqLworc3RhdGljIHUzMiBjbG9ja19kaXZpZGVyX3RvX3Jlc29sdXRpb24odTE2IGRpdmlkZXIpCit7CisJLyoKKwkgKiBSZXNvbHV0aW9uIGlzIHRoZSBkdXJhdGlvbiBvZiAxIHRpY2sgb2YgdGhlIHJlYWRhYmxlIHBvcnRpb24gb2YKKwkgKiBvZiB0aGUgcHVsc2Ugd2lkdGggY291bnRlciBhcyByZWFkIGZyb20gdGhlIEZJRk8uICBUaGUgdHdvIGxzYidzIGFyZQorCSAqIG5vdCByZWFkYWJsZSwgaGVuY2UgdGhlIDw8IDIuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbnMuCisJICovCisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKCgxIDw8IDIpICAqICgodTMyKSBkaXZpZGVyICsgMSkgKiAxMDAwLAorCQkJCSBDWDIzODg4X0lSX1JFRkNMS19GUkVRIC8gMTAwMDAwMCk7Cit9CisKK3N0YXRpYyB1NjQgcHVsc2Vfd2lkdGhfY291bnRfdG9fbnModTE2IGNvdW50LCB1MTYgZGl2aWRlcikKK3sKKwl1NjQgbjsKKwl1MzIgcmVtOworCisJLyoKKwkgKiBUaGUgMiBsc2IncyBvZiB0aGUgcHVsc2Ugd2lkdGggdGltZXIgY291bnQgYXJlIG5vdCByZWFkYWJsZSwgaGVuY2UKKwkgKiB0aGUgKGNvdW50IDw8IDIpIHwgMHgzCisJICovCisJbiA9ICgoKHU2NCkgY291bnQgPDwgMikgfCAweDMpICogKGRpdmlkZXIgKyAxKSAqIDEwMDA7IC8qIG1pbGxpY3ljbGVzICovCisJcmVtID0gZG9fZGl2KG4sIENYMjM4ODhfSVJfUkVGQ0xLX0ZSRVEgLyAxMDAwMDAwKTsgICAgIC8qIC8gTUh6ID0+IG5zICovCisJaWYgKHJlbSA+PSBDWDIzODg4X0lSX1JFRkNMS19GUkVRIC8gMTAwMDAwMCAvIDIpCisJCW4rKzsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwdWxzZV93aWR0aF9jb3VudF90b191cyh1MTYgY291bnQsIHUxNiBkaXZpZGVyKQoreworCXU2NCBuOworCXUzMiByZW07CisKKwkvKgorCSAqIFRoZSAyIGxzYidzIG9mIHRoZSBwdWxzZSB3aWR0aCB0aW1lciBjb3VudCBhcmUgbm90IHJlYWRhYmxlLCBoZW5jZQorCSAqIHRoZSAoY291bnQgPDwgMikgfCAweDMKKwkgKi8KKwluID0gKCgodTY0KSBjb3VudCA8PCAyKSB8IDB4MykgKiAoZGl2aWRlciArIDEpOyAgICAvKiBjeWNsZXMgICAgICAqLworCXJlbSA9IGRvX2RpdihuLCBDWDIzODg4X0lSX1JFRkNMS19GUkVRIC8gMTAwMDAwMCk7IC8qIC8gTUh6ID0+IHVzICovCisJaWYgKHJlbSA+PSBDWDIzODg4X0lSX1JFRkNMS19GUkVRIC8gMTAwMDAwMCAvIDIpCisJCW4rKzsKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgbjsKK30KKworLyoKKyAqIFB1bHNlIENsb2NrcyBjb21wdXRhdGlvbnM6IENvbWJpbmVkIFB1bHNlIFdpZHRoIENvdW50ICYgUnggQ2xvY2sgQ291bnRzCisgKgorICogVGhlIHRvdGFsIHB1bHNlIGNsb2NrIGNvdW50IGlzIGFuIDE4IGJpdCBwdWxzZSB3aWR0aCB0aW1lciBjb3VudCBhcyB0aGUgbW9zdAorICogc2lnbmlmaWNhbnQgcGFydCBhbmQgKHVwIHRvKSAxNiBiaXQgY2xvY2sgZGl2aWRlciBjb3VudCBhcyBhIG1vZHVsdXMuCisgKiBXaGVuIHRoZSBSeCBjbG9jayBkaXZpZGVyIHRpY2tzIGRvd24gdG8gMCwgaXQgaW5jcmVtZW50cyB0aGUgMTggYml0IHB1bHNlCisgKiB3aWR0aCB0aW1lciBjb3VudCdzIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KKyAqLworc3RhdGljIHU2NCBuc190b19wdWxzZV9jbG9ja3ModTMyIG5zKQoreworCXU2NCBjbG9ja3M7CisJdTMyIHJlbTsKKwljbG9ja3MgPSBDWDIzODg4X0lSX1JFRkNMS19GUkVRIC8gMTAwMDAwMCAqICh1NjQpIG5zOyAvKiBtaWxsaWN5Y2xlcyAgKi8KKwlyZW0gPSBkb19kaXYoY2xvY2tzLCAxMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogLzEwMDAgPSBjeWNsZXMgKi8KKwlpZiAocmVtID49IDEwMDAgLyAyKQorCQljbG9ja3MrKzsKKwlyZXR1cm4gY2xvY2tzOworfQorCitzdGF0aWMgdTE2IHB1bHNlX2Nsb2Nrc190b19jbG9ja19kaXZpZGVyKHU2NCBjb3VudCkKK3sKKwl1MzIgcmVtOworCisJcmVtID0gZG9fZGl2KGNvdW50LCAoRklGT19SWFRYIDw8IDIpIHwgMHgzKTsKKworCS8qIG5ldCByZXN1bHQgbmVlZHMgdG8gYmUgcm91bmRlZCBkb3duIGFuZCBkZWNyZW1lbnRlZCBieSAxICovCisJaWYgKGNvdW50ID4gUlhDTEtfUkNEICsgMSkKKwkJY291bnQgPSBSWENMS19SQ0Q7CisJZWxzZSBpZiAoY291bnQgPCAyKQorCQljb3VudCA9IDE7CisJZWxzZQorCQljb3VudC0tOworCXJldHVybiAodTE2KSBjb3VudDsKK30KKworLyoKKyAqIElSIENvbnRyb2wgUmVnaXN0ZXIgaGVscGVycworICovCitlbnVtIHR4X2ZpZm9fd2F0ZXJtYXJrIHsKKwlUWF9GSUZPX0hBTEZfRU1QVFkgPSAwLAorCVRYX0ZJRk9fRU1QVFkgICAgICA9IENOVFJMX1RJQywKK307CisKK2VudW0gcnhfZmlmb193YXRlcm1hcmsgeworCVJYX0ZJRk9fSEFMRl9GVUxMID0gMCwKKwlSWF9GSUZPX05PVF9FTVBUWSA9IENOVFJMX1JJQywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250cm9sX3R4X2lycV93YXRlcm1hcmsoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJCSAgICBlbnVtIHR4X2ZpZm9fd2F0ZXJtYXJrIGxldmVsKQoreworCWN4MjM4ODhfaXJfYW5kX29yNChkZXYsIENYMjM4ODhfSVJfQ05UUkxfUkVHLCB+Q05UUkxfVElDLCBsZXZlbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250cm9sX3J4X2lycV93YXRlcm1hcmsoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJCSAgICBlbnVtIHJ4X2ZpZm9fd2F0ZXJtYXJrIGxldmVsKQoreworCWN4MjM4ODhfaXJfYW5kX29yNChkZXYsIENYMjM4ODhfSVJfQ05UUkxfUkVHLCB+Q05UUkxfUklDLCBsZXZlbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250cm9sX3R4X2VuYWJsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgYm9vbCBlbmFibGUpCit7CisJY3gyMzg4OF9pcl9hbmRfb3I0KGRldiwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcsIH4oQ05UUkxfVFhFIHwgQ05UUkxfVEZFKSwKKwkJCSAgIGVuYWJsZSA/IChDTlRSTF9UWEUgfCBDTlRSTF9URkUpIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250cm9sX3J4X2VuYWJsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgYm9vbCBlbmFibGUpCit7CisJY3gyMzg4OF9pcl9hbmRfb3I0KGRldiwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcsIH4oQ05UUkxfUlhFIHwgQ05UUkxfUkZFKSwKKwkJCSAgIGVuYWJsZSA/IChDTlRSTF9SWEUgfCBDTlRSTF9SRkUpIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250cm9sX3R4X21vZHVsYXRpb25fZW5hYmxlKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAorCQkJCQkJYm9vbCBlbmFibGUpCit7CisJY3gyMzg4OF9pcl9hbmRfb3I0KGRldiwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcsIH5DTlRSTF9NT0QsCisJCQkgICBlbmFibGUgPyBDTlRSTF9NT0QgOiAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnRyb2xfcnhfZGVtb2R1bGF0aW9uX2VuYWJsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKKwkJCQkJCSAgYm9vbCBlbmFibGUpCit7CisJY3gyMzg4OF9pcl9hbmRfb3I0KGRldiwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcsIH5DTlRSTF9ETUQsCisJCQkgICBlbmFibGUgPyBDTlRSTF9ETUQgOiAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnRyb2xfcnhfc19lZGdlX2RldGVjdGlvbihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKKwkJCQkJICAgICAgIHUzMiBlZGdlX3R5cGVzKQoreworCWN4MjM4ODhfaXJfYW5kX29yNChkZXYsIENYMjM4ODhfSVJfQ05UUkxfUkVHLCB+Q05UUkxfRURHX0JPVEgsCisJCQkgICBlZGdlX3R5cGVzICYgQ05UUkxfRURHX0JPVEgpOworfQorCitzdGF0aWMgdm9pZCBjb250cm9sX3J4X3NfY2Fycmllcl93aW5kb3coc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJCXVuc2lnbmVkIGludCBjYXJyaWVyLAorCQkJCQl1bnNpZ25lZCBpbnQgKmNhcnJpZXJfcmFuZ2VfbG93LAorCQkJCQl1bnNpZ25lZCBpbnQgKmNhcnJpZXJfcmFuZ2VfaGlnaCkKK3sKKwl1MzIgdjsKKwl1bnNpZ25lZCBpbnQgYzE2ID0gY2FycmllciAqIDE2OworCisJaWYgKCpjYXJyaWVyX3JhbmdlX2xvdyA8IERJVl9ST1VORF9DTE9TRVNUKGMxNiwgMTYgKyAzKSkgeworCQl2ID0gQ05UUkxfV0lOXzNfNDsKKwkJKmNhcnJpZXJfcmFuZ2VfbG93ID0gRElWX1JPVU5EX0NMT1NFU1QoYzE2LCAxNiArIDQpOworCX0gZWxzZSB7CisJCXYgPSBDTlRSTF9XSU5fM18zOworCQkqY2Fycmllcl9yYW5nZV9sb3cgPSBESVZfUk9VTkRfQ0xPU0VTVChjMTYsIDE2ICsgMyk7CisJfQorCisJaWYgKCpjYXJyaWVyX3JhbmdlX2hpZ2ggPiBESVZfUk9VTkRfQ0xPU0VTVChjMTYsIDE2IC0gMykpIHsKKwkJdiB8PSBDTlRSTF9XSU5fNF8zOworCQkqY2Fycmllcl9yYW5nZV9oaWdoID0gRElWX1JPVU5EX0NMT1NFU1QoYzE2LCAxNiAtIDQpOworCX0gZWxzZSB7CisJCXYgfD0gQ05UUkxfV0lOXzNfMzsKKwkJKmNhcnJpZXJfcmFuZ2VfaGlnaCA9IERJVl9ST1VORF9DTE9TRVNUKGMxNiwgMTYgLSAzKTsKKwl9CisJY3gyMzg4OF9pcl9hbmRfb3I0KGRldiwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcsIH5DTlRSTF9XSU4sIHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29udHJvbF90eF9wb2xhcml0eV9pbnZlcnQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJCSAgICAgIGJvb2wgaW52ZXJ0KQoreworCWN4MjM4ODhfaXJfYW5kX29yNChkZXYsIENYMjM4ODhfSVJfQ05UUkxfUkVHLCB+Q05UUkxfQ1BMLAorCQkJICAgaW52ZXJ0ID8gQ05UUkxfQ1BMIDogMCk7Cit9CisKKy8qCisgKiBJUiBSeCAmIFR4IENsb2NrIFJlZ2lzdGVyIGhlbHBlcnMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB0eGNsa190eF9zX2NhcnJpZXIoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBmcmVxLAorCQkJCSAgICAgICB1MTYgKmRpdmlkZXIpCit7CisJKmRpdmlkZXIgPSBjYXJyaWVyX2ZyZXFfdG9fY2xvY2tfZGl2aWRlcihmcmVxKTsKKwljeDIzODg4X2lyX3dyaXRlNChkZXYsIENYMjM4ODhfSVJfVFhDTEtfUkVHLCAqZGl2aWRlcik7CisJcmV0dXJuIGNsb2NrX2RpdmlkZXJfdG9fY2Fycmllcl9mcmVxKCpkaXZpZGVyKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCByeGNsa19yeF9zX2NhcnJpZXIoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBmcmVxLAorCQkJCSAgICAgICB1MTYgKmRpdmlkZXIpCit7CisJKmRpdmlkZXIgPSBjYXJyaWVyX2ZyZXFfdG9fY2xvY2tfZGl2aWRlcihmcmVxKTsKKwljeDIzODg4X2lyX3dyaXRlNChkZXYsIENYMjM4ODhfSVJfUlhDTEtfUkVHLCAqZGl2aWRlcik7CisJcmV0dXJuIGNsb2NrX2RpdmlkZXJfdG9fY2Fycmllcl9mcmVxKCpkaXZpZGVyKTsKK30KKworc3RhdGljIHUzMiB0eGNsa190eF9zX21heF9wdWxzZV93aWR0aChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIG5zLAorCQkJCSAgICAgIHUxNiAqZGl2aWRlcikKK3sKKwl1NjQgcHVsc2VfY2xvY2tzOworCisJaWYgKG5zID4gVjRMMl9TVUJERVZfSVJfUFVMU0VfTUFYX1dJRFRIX05TKQorCQlucyA9IFY0TDJfU1VCREVWX0lSX1BVTFNFX01BWF9XSURUSF9OUzsKKwlwdWxzZV9jbG9ja3MgPSBuc190b19wdWxzZV9jbG9ja3MobnMpOworCSpkaXZpZGVyID0gcHVsc2VfY2xvY2tzX3RvX2Nsb2NrX2RpdmlkZXIocHVsc2VfY2xvY2tzKTsKKwljeDIzODg4X2lyX3dyaXRlNChkZXYsIENYMjM4ODhfSVJfVFhDTEtfUkVHLCAqZGl2aWRlcik7CisJcmV0dXJuICh1MzIpIHB1bHNlX3dpZHRoX2NvdW50X3RvX25zKEZJRk9fUlhUWCwgKmRpdmlkZXIpOworfQorCitzdGF0aWMgdTMyIHJ4Y2xrX3J4X3NfbWF4X3B1bHNlX3dpZHRoKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgbnMsCisJCQkJICAgICAgdTE2ICpkaXZpZGVyKQoreworCXU2NCBwdWxzZV9jbG9ja3M7CisKKwlpZiAobnMgPiBWNEwyX1NVQkRFVl9JUl9QVUxTRV9NQVhfV0lEVEhfTlMpCisJCW5zID0gVjRMMl9TVUJERVZfSVJfUFVMU0VfTUFYX1dJRFRIX05TOworCXB1bHNlX2Nsb2NrcyA9IG5zX3RvX3B1bHNlX2Nsb2Nrcyhucyk7CisJKmRpdmlkZXIgPSBwdWxzZV9jbG9ja3NfdG9fY2xvY2tfZGl2aWRlcihwdWxzZV9jbG9ja3MpOworCWN4MjM4ODhfaXJfd3JpdGU0KGRldiwgQ1gyMzg4OF9JUl9SWENMS19SRUcsICpkaXZpZGVyKTsKKwlyZXR1cm4gKHUzMikgcHVsc2Vfd2lkdGhfY291bnRfdG9fbnMoRklGT19SWFRYLCAqZGl2aWRlcik7Cit9CisKKy8qCisgKiBJUiBUeCBDYXJyaWVyIER1dHkgQ3ljbGUgcmVnaXN0ZXIgaGVscGVycworICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNkdXR5X3R4X3NfZHV0eV9jeWNsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgZHV0eV9jeWNsZSkKK3sKKwl1MzIgbjsKKwluID0gRElWX1JPVU5EX0NMT1NFU1QoZHV0eV9jeWNsZSAqIDEwMCwgNjI1KTsgLyogMTZ0aHMgb2YgMTAwJSAqLworCWlmIChuICE9IDApCisJCW4tLTsKKwlpZiAobiA+IDE1KQorCQluID0gMTU7CisJY3gyMzg4OF9pcl93cml0ZTQoZGV2LCBDWDIzODg4X0lSX0NEVVRZX1JFRywgbik7CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKChuICsgMSkgKiAxMDAsIDE2KTsKK30KKworLyoKKyAqIElSIEZpbHRlciBSZWdpc3RlciBoZWxwZXJzCisgKi8KK3N0YXRpYyB1MzIgZmlsdGVyX3J4X3NfbWluX3dpZHRoKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgbWluX3dpZHRoX25zKQoreworCXUzMiBjb3VudCA9IG5zX3RvX2xwZl9jb3VudChtaW5fd2lkdGhfbnMpOworCWN4MjM4ODhfaXJfd3JpdGU0KGRldiwgQ1gyMzg4OF9JUl9GSUxUUl9SRUcsIGNvdW50KTsKKwlyZXR1cm4gbHBmX2NvdW50X3RvX25zKGNvdW50KTsKK30KKworLyoKKyAqIElSIElSUSBFbmFibGUgUmVnaXN0ZXIgaGVscGVycworICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxZW5hYmxlX3J4KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgbWFzaykKK3sKKwltYXNrICY9IChJUlFFTl9SVEUgfCBJUlFFTl9ST0UgfCBJUlFFTl9SU0UpOworCWN4MjM4ODhfaXJfYW5kX29yNChkZXYsIENYMjM4ODhfSVJfSVJRRU5fUkVHLAorCQkJICAgfihJUlFFTl9SVEUgfCBJUlFFTl9ST0UgfCBJUlFFTl9SU0UpLCBtYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlycWVuYWJsZV90eChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIG1hc2spCit7CisJbWFzayAmPSBJUlFFTl9UU0U7CisJY3gyMzg4OF9pcl9hbmRfb3I0KGRldiwgQ1gyMzg4OF9JUl9JUlFFTl9SRUcsIH5JUlFFTl9UU0UsIG1hc2spOworfQorCisvKgorICogVjRMMiBTdWJkZXZpY2UgSVIgT3BzCisgKi8KK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl9pcnFfaGFuZGxlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgc3RhdHVzLAorCQkJCSAgYm9vbCAqaGFuZGxlZCkKK3sKKwlzdHJ1Y3QgY3gyMzg4OF9pcl9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBzdGF0ZS0+ZGV2OworCisJdTMyIGNudHJsID0gY3gyMzg4OF9pcl9yZWFkNChkZXYsIENYMjM4ODhfSVJfQ05UUkxfUkVHKTsKKwl1MzIgaXJxZW4gPSBjeDIzODg4X2lyX3JlYWQ0KGRldiwgQ1gyMzg4OF9JUl9JUlFFTl9SRUcpOworCXUzMiBzdGF0cyA9IGN4MjM4ODhfaXJfcmVhZDQoZGV2LCBDWDIzODg4X0lSX1NUQVRTX1JFRyk7CisKKwl1MzIgcnhfZGF0YVtGSUZPX1JYX0RFUFRIXTsKKwlpbnQgaSwgaiwgazsKKwl1MzIgZXZlbnRzLCB2OworCWludCB0c3IsIHJzciwgcnRvLCByb3IsIHRzZSwgcnNlLCBydGUsIHJvZSwga3JvcjsKKworCXRzciA9IHN0YXRzICYgU1RBVFNfVFNSOyAvKiBUeCBGSUZPIFNlcnZpY2UgUmVxdWVzdCAqLworCXJzciA9IHN0YXRzICYgU1RBVFNfUlNSOyAvKiBSeCBGSUZPIFNlcnZpY2UgUmVxdWVzdCAqLworCXJ0byA9IHN0YXRzICYgU1RBVFNfUlRPOyAvKiBSeCBQdWxzZSBXaWR0aCBUaW1lciBUaW1lIE91dCAqLworCXJvciA9IHN0YXRzICYgU1RBVFNfUk9SOyAvKiBSeCBGSUZPIE92ZXIgUnVuICovCisKKwl0c2UgPSBpcnFlbiAmIElSUUVOX1RTRTsgLyogVHggRklGTyBTZXJ2aWNlIFJlcXVlc3QgSVJRIEVuYWJsZSAqLworCXJzZSA9IGlycWVuICYgSVJRRU5fUlNFOyAvKiBSeCBGSUZPIFNlcnZpY2UgUmV1cWVzdCBJUlEgRW5hYmxlICovCisJcnRlID0gaXJxZW4gJiBJUlFFTl9SVEU7IC8qIFJ4IFB1bHNlIFdpZHRoIFRpbWVyIFRpbWUgT3V0IElSUSBFbmFibGUgKi8KKwlyb2UgPSBpcnFlbiAmIElSUUVOX1JPRTsgLyogUnggRklGTyBPdmVyIFJ1biBJUlEgRW5hYmxlICovCisKKwkqaGFuZGxlZCA9IGZhbHNlOworCXY0bDJfZGJnKDIsIGlyXzg4OF9kZWJ1Zywgc2QsICJJUlEgU3RhdHVzOiAgJXMgJXMgJXMgJXMgJXMgJXNcbiIsCisJCSB0c3IgPyAidHNyIiA6ICIgICAiLCByc3IgPyAicnNyIiA6ICIgICAiLAorCQkgcnRvID8gInJ0byIgOiAiICAgIiwgcm9yID8gInJvciIgOiAiICAgIiwKKwkJIHN0YXRzICYgU1RBVFNfVEJZID8gInRieSIgOiAiICAgIiwKKwkJIHN0YXRzICYgU1RBVFNfUkJZID8gInJieSIgOiAiICAgIik7CisKKwl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAiSVJRIEVuYWJsZXM6ICVzICVzICVzICVzXG4iLAorCQkgdHNlID8gInRzZSIgOiAiICAgIiwgcnNlID8gInJzZSIgOiAiICAgIiwKKwkJIHJ0ZSA/ICJydGUiIDogIiAgICIsIHJvZSA/ICJyb2UiIDogIiAgICIpOworCisJLyoKKwkgKiBUcmFuc21pdHRlciBpbnRlcnJ1cHQgc2VydmljZQorCSAqLworCWlmICh0c2UgJiYgdHNyKSB7CisJCS8qCisJCSAqIFRPRE86CisJCSAqIENoZWNrIHRoZSB3YXRlcm1hcmsgdGhyZXNob2xkIHNldHRpbmcKKwkJICogUHVsbCBGSUZPX1RYX0RFUFRIIG9yIEZJRk9fVFhfREVQVEgvMiBlbnRyaWVzIGZyb20gdHhfa2ZpZm8KKwkJICogUHVzaCB0aGUgZGF0YSB0byB0aGUgaGFyZHdhcmUgRklGTy4KKwkJICogSWYgdGhlcmUgd2FzIG5vdGhpbmcgbW9yZSB0byBzZW5kIGluIHRoZSB0eF9rZmlmbywgZGlzYWJsZQorCQkgKgl0aGUgVFNSIElSUSBhbmQgbm90aWZ5IHRoZSB2NGwyX2RldmljZS4KKwkJICogSWYgdGhlcmUgd2FzIHNvbWV0aGluZyBpbiB0aGUgdHhfa2ZpZm8sIGNoZWNrIHRoZSB0eF9rZmlmbworCQkgKiAgICAgIGxldmVsIGFuZCBub3RpZnkgdGhlIHY0bDJfZGV2aWNlLCBpZiBpdCBpcyBsb3cuCisJCSAqLworCQkvKiBGb3Igbm93LCBpbmhpYml0IFRTUiBpbnRlcnJ1cHQgdW50aWwgVHggaXMgaW1wbGVtZW50ZWQgKi8KKwkJaXJxZW5hYmxlX3R4KGRldiwgMCk7CisJCWV2ZW50cyA9IFY0TDJfU1VCREVWX0lSX1RYX0ZJRk9fU0VSVklDRV9SRVE7CisJCXY0bDJfc3ViZGV2X25vdGlmeShzZCwgVjRMMl9TVUJERVZfSVJfVFhfTk9USUZZLCAmZXZlbnRzKTsKKwkJKmhhbmRsZWQgPSB0cnVlOworCX0KKworCS8qCisJICogUmVjZWl2ZXIgaW50ZXJydXB0IHNlcnZpY2UKKwkgKi8KKwlrcm9yID0gMDsKKwlpZiAoKHJzZSAmJiByc3IpIHx8IChydGUgJiYgcnRvKSkgeworCQkvKgorCQkgKiBSZWNlaXZlIGRhdGEgb24gUlNSIHRvIGNsZWFyIHRoZSBTVEFUU19SU1IuCisJCSAqIFJlY2VpdmUgZGF0YSBvbiBSVE8sIHNpbmNlIHdlIG1heSBub3QgaGF2ZSB5ZXQgaGl0IHRoZSBSU1IKKwkJICogd2F0ZXJtYXJrIHdoZW4gd2UgcmVjZWl2ZSB0aGUgUlRPLgorCQkgKi8KKwkJZm9yIChpID0gMCwgdiA9IEZJRk9fUlhfTkRWOworCQkgICAgICh2ICYgRklGT19SWF9ORFYpICYmICFrcm9yOyBpID0gMCkgeworCQkJZm9yIChqID0gMDsKKwkJCSAgICAgKHYgJiBGSUZPX1JYX05EVikgJiYgaiA8IEZJRk9fUlhfREVQVEg7IGorKykgeworCQkJCXYgPSBjeDIzODg4X2lyX3JlYWQ0KGRldiwgQ1gyMzg4OF9JUl9GSUZPX1JFRyk7CisJCQkJcnhfZGF0YVtpKytdID0gdiAmIH5GSUZPX1JYX05EVjsKKwkJCX0KKwkJCWlmIChpID09IDApCisJCQkJYnJlYWs7CisJCQlqID0gaSAqIHNpemVvZih1MzIpOworCQkJayA9IGtmaWZvX3B1dChzdGF0ZS0+cnhfa2ZpZm8sCisJCQkJICAgICAgKHVuc2lnbmVkIGNoYXIgKikgcnhfZGF0YSwgaik7CisJCQlpZiAoayAhPSBqKQorCQkJCWtyb3IrKzsgLyogcnhfa2ZpZm8gb3ZlciBydW4gKi8KKwkJfQorCQkqaGFuZGxlZCA9IHRydWU7CisJfQorCisJZXZlbnRzID0gMDsKKwl2ID0gMDsKKwlpZiAoa3JvcikgeworCQlldmVudHMgfD0gVjRMMl9TVUJERVZfSVJfUlhfU1dfRklGT19PVkVSUlVOOworCQl2NGwyX2VycihzZCwgIklSIHJlY2VpdmVyIHNvZnR3YXJlIEZJRk8gb3ZlcnJ1blxuIik7CisJfQorCWlmIChyb2UgJiYgcm9yKSB7CisJCS8qCisJCSAqIFRoZSBSWCBGSUZPIEVuYWJsZSAoQ05UUkxfUkZFKSBtdXN0IGJlIHRvZ2dsZWQgdG8gY2xlYXIKKwkJICogdGhlIFJ4IEZJRk8gT3ZlciBSdW4gc3RhdHVzIChTVEFUU19ST1IpCisJCSAqLworCQl2IHw9IENOVFJMX1JGRTsKKwkJZXZlbnRzIHw9IFY0TDJfU1VCREVWX0lSX1JYX0hXX0ZJRk9fT1ZFUlJVTjsKKwkJdjRsMl9lcnIoc2QsICJJUiByZWNlaXZlciBoYXJkd2FyZSBGSUZPIG92ZXJydW5cbiIpOworCX0KKwlpZiAocnRlICYmIHJ0bykgeworCQkvKgorCQkgKiBUaGUgSVIgUmVjZWl2ZXIgRW5hYmxlIChDTlRSTF9SWEUpIG11c3QgYmUgdG9nZ2xlZCB0byBjbGVhcgorCQkgKiB0aGUgUnggUHVsc2UgV2lkdGggVGltZXIgVGltZSBPdXQgKFNUQVRTX1JUTykKKwkJICovCisJCXYgfD0gQ05UUkxfUlhFOworCQlldmVudHMgfD0gVjRMMl9TVUJERVZfSVJfUlhfRU5EX09GX1JYX0RFVEVDVEVEOworCX0KKwlpZiAodikgeworCQkvKiBDbGVhciBTVEFUU19ST1IgJiBTVEFUU19SVE8gYXMgbmVlZGVkIGJ5IHJlc2V0aW5nIGhhcmR3YXJlICovCisJCWN4MjM4ODhfaXJfd3JpdGU0KGRldiwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcsIGNudHJsICYgfnYpOworCQljeDIzODg4X2lyX3dyaXRlNChkZXYsIENYMjM4ODhfSVJfQ05UUkxfUkVHLCBjbnRybCk7CisJCSpoYW5kbGVkID0gdHJ1ZTsKKwl9CisJaWYgKGtmaWZvX2xlbihzdGF0ZS0+cnhfa2ZpZm8pID49IENYMjM4ODhfSVJfUlhfS0ZJRk9fU0laRSAvIDIpCisJCWV2ZW50cyB8PSBWNEwyX1NVQkRFVl9JUl9SWF9GSUZPX1NFUlZJQ0VfUkVROworCisJaWYgKGV2ZW50cykKKwkJdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBWNEwyX1NVQkRFVl9JUl9SWF9OT1RJRlksICZldmVudHMpOworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlciAqLworc3RhdGljIGludCBjeDIzODg4X2lyX3J4X3JlYWQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgICAgc3NpemVfdCAqbnVtKQoreworCXN0cnVjdCBjeDIzODg4X2lyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlib29sIGludmVydCA9IChib29sKSBhdG9taWNfcmVhZCgmc3RhdGUtPnJ4X2ludmVydCk7CisJdTE2IGRpdmlkZXIgPSAodTE2KSBhdG9taWNfcmVhZCgmc3RhdGUtPnJ4Y2xrX2RpdmlkZXIpOworCisJdW5zaWduZWQgaW50IGksIG47CisJdTMyICpwOworCXUzMiB1LCB2OworCisJbiA9IGNvdW50IC8gc2l6ZW9mKHUzMikgKiBzaXplb2YodTMyKTsKKwlpZiAobiA9PSAwKSB7CisJCSpudW0gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwluID0ga2ZpZm9fZ2V0KHN0YXRlLT5yeF9rZmlmbywgYnVmLCBuKTsKKworCW4gLz0gc2l6ZW9mKHUzMik7CisJKm51bSA9IG4gKiBzaXplb2YodTMyKTsKKworCWZvciAocCA9ICh1MzIgKikgYnVmLCBpID0gMDsgaSA8IG47IHArKywgaSsrKSB7CisJCWlmICgoKnAgJiBGSUZPX1JYVFhfUlRPKSA9PSBGSUZPX1JYVFhfUlRPKSB7CisJCQkqcCA9IFY0TDJfU1VCREVWX0lSX1BVTFNFX1JYX1NFUV9FTkQ7CisJCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdSA9ICgqcCAmIEZJRk9fUlhUWF9MVkwpID8gVjRMMl9TVUJERVZfSVJfUFVMU0VfTEVWRUxfTUFTSyA6IDA7CisJCWlmIChpbnZlcnQpCisJCQl1ID0gdSA/IDAgOiBWNEwyX1NVQkRFVl9JUl9QVUxTRV9MRVZFTF9NQVNLOworCisJCXYgPSAodTMyKSBwdWxzZV93aWR0aF9jb3VudF90b19ucygodTE2KSAoKnAgJiBGSUZPX1JYVFgpLAorCQkJCQkJICBkaXZpZGVyKTsKKwkJaWYgKHYgPj0gVjRMMl9TVUJERVZfSVJfUFVMU0VfTUFYX1dJRFRIX05TKQorCQkJdiA9IFY0TDJfU1VCREVWX0lSX1BVTFNFX01BWF9XSURUSF9OUyAtIDE7CisKKwkJKnAgPSB1IHwgdjsKKworCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogJTEwdSBucyAgJXNcbiIsCisJCQkgdiwgdSA/ICJtYXJrIiA6ICJzcGFjZSIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDIzODg4X2lyX3J4X2dfcGFyYW1ldGVycyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBjeDIzODg4X2lyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+cnhfcGFyYW1zX2xvY2spOworCW1lbWNweShwLCAmc3RhdGUtPnJ4X3BhcmFtcywgc2l6ZW9mKHN0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzKSk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+cnhfcGFyYW1zX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjM4ODhfaXJfcnhfc2h1dGRvd24oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgY3gyMzg4OF9pcl9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBzdGF0ZS0+ZGV2OworCisJbXV0ZXhfbG9jaygmc3RhdGUtPnJ4X3BhcmFtc19sb2NrKTsKKworCS8qIERpc2FibGUgb3Igc2xvdyBkb3duIGFsbCBJUiBSeCBjaXJjdWl0cyBhbmQgY291bnRlcnMgKi8KKwlpcnFlbmFibGVfcngoZGV2LCAwKTsKKwljb250cm9sX3J4X2VuYWJsZShkZXYsIGZhbHNlKTsKKwljb250cm9sX3J4X2RlbW9kdWxhdGlvbl9lbmFibGUoZGV2LCBmYWxzZSk7CisJY29udHJvbF9yeF9zX2VkZ2VfZGV0ZWN0aW9uKGRldiwgQ05UUkxfRURHX05PTkUpOworCWZpbHRlcl9yeF9zX21pbl93aWR0aChkZXYsIDApOworCWN4MjM4ODhfaXJfd3JpdGU0KGRldiwgQ1gyMzg4OF9JUl9SWENMS19SRUcsIFJYQ0xLX1JDRCk7CisKKwlzdGF0ZS0+cnhfcGFyYW1zLnNodXRkb3duID0gdHJ1ZTsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPnJ4X3BhcmFtc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDIzODg4X2lyX3J4X3NfcGFyYW1ldGVycyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBjeDIzODg4X2lyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiA9IHN0YXRlLT5kZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2X2lyX3BhcmFtZXRlcnMgKm8gPSAmc3RhdGUtPnJ4X3BhcmFtczsKKwl1MTYgcnhjbGtfZGl2aWRlcjsKKworCWlmIChwLT5zaHV0ZG93bikKKwkJcmV0dXJuIGN4MjM4ODhfaXJfcnhfc2h1dGRvd24oc2QpOworCisJaWYgKHAtPm1vZGUgIT0gVjRMMl9TVUJERVZfSVJfTU9ERV9QVUxTRV9XSURUSCkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+cnhfcGFyYW1zX2xvY2spOworCisJby0+c2h1dGRvd24gPSBwLT5zaHV0ZG93bjsKKworCW8tPm1vZGUgPSBwLT5tb2RlID0gVjRMMl9TVUJERVZfSVJfTU9ERV9QVUxTRV9XSURUSDsKKworCW8tPmJ5dGVzX3Blcl9kYXRhX2VsZW1lbnQgPSBwLT5ieXRlc19wZXJfZGF0YV9lbGVtZW50ID0gc2l6ZW9mKHUzMik7CisKKwkvKiBCZWZvcmUgd2UgdHdlYWsgdGhlIGhhcmR3YXJlLCB3ZSBoYXZlIHRvIGRpc2FibGUgdGhlIHJlY2VpdmVyICovCisJaXJxZW5hYmxlX3J4KGRldiwgMCk7CisJY29udHJvbF9yeF9lbmFibGUoZGV2LCBmYWxzZSk7CisKKwljb250cm9sX3J4X2RlbW9kdWxhdGlvbl9lbmFibGUoZGV2LCBwLT5tb2R1bGF0aW9uKTsKKwlvLT5tb2R1bGF0aW9uID0gcC0+bW9kdWxhdGlvbjsKKworCWlmIChwLT5tb2R1bGF0aW9uKSB7CisJCXAtPmNhcnJpZXJfZnJlcSA9IHJ4Y2xrX3J4X3NfY2FycmllcihkZXYsIHAtPmNhcnJpZXJfZnJlcSwKKwkJCQkJCSAgICAgJnJ4Y2xrX2RpdmlkZXIpOworCisJCW8tPmNhcnJpZXJfZnJlcSA9IHAtPmNhcnJpZXJfZnJlcTsKKworCQlvLT5kdXR5X2N5Y2xlID0gcC0+ZHV0eV9jeWNsZSA9IDUwOworCisJCWNvbnRyb2xfcnhfc19jYXJyaWVyX3dpbmRvdyhkZXYsIHAtPmNhcnJpZXJfZnJlcSwKKwkJCQkJICAgICZwLT5jYXJyaWVyX3JhbmdlX2xvd2VyLAorCQkJCQkgICAgJnAtPmNhcnJpZXJfcmFuZ2VfdXBwZXIpOworCQlvLT5jYXJyaWVyX3JhbmdlX2xvd2VyID0gcC0+Y2Fycmllcl9yYW5nZV9sb3dlcjsKKwkJby0+Y2Fycmllcl9yYW5nZV91cHBlciA9IHAtPmNhcnJpZXJfcmFuZ2VfdXBwZXI7CisJfSBlbHNlIHsKKwkJcC0+bWF4X3B1bHNlX3dpZHRoID0KKwkJCSAgICByeGNsa19yeF9zX21heF9wdWxzZV93aWR0aChkZXYsIHAtPm1heF9wdWxzZV93aWR0aCwKKwkJCQkJCSAgICAgICAmcnhjbGtfZGl2aWRlcik7CisJCW8tPm1heF9wdWxzZV93aWR0aCA9IHAtPm1heF9wdWxzZV93aWR0aDsKKwl9CisJYXRvbWljX3NldCgmc3RhdGUtPnJ4Y2xrX2RpdmlkZXIsIHJ4Y2xrX2RpdmlkZXIpOworCisJcC0+bm9pc2VfZmlsdGVyX21pbl93aWR0aCA9CisJCQkgIGZpbHRlcl9yeF9zX21pbl93aWR0aChkZXYsIHAtPm5vaXNlX2ZpbHRlcl9taW5fd2lkdGgpOworCW8tPm5vaXNlX2ZpbHRlcl9taW5fd2lkdGggPSBwLT5ub2lzZV9maWx0ZXJfbWluX3dpZHRoOworCisJcC0+cmVzb2x1dGlvbiA9IGNsb2NrX2RpdmlkZXJfdG9fcmVzb2x1dGlvbihyeGNsa19kaXZpZGVyKTsKKwlvLT5yZXNvbHV0aW9uID0gcC0+cmVzb2x1dGlvbjsKKworCS8qIEZJWE1FIC0gbWFrZSB0aGlzIGRlcGVuZGVudCBvbiByZXNvbHV0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgKi8KKwljb250cm9sX3J4X2lycV93YXRlcm1hcmsoZGV2LCBSWF9GSUZPX0hBTEZfRlVMTCk7CisKKwljb250cm9sX3J4X3NfZWRnZV9kZXRlY3Rpb24oZGV2LCBDTlRSTF9FREdfQk9USCk7CisKKwlvLT5pbnZlcnQgPSBwLT5pbnZlcnQ7CisJYXRvbWljX3NldCgmc3RhdGUtPnJ4X2ludmVydCwgcC0+aW52ZXJ0KTsKKworCW8tPmludGVycnVwdF9lbmFibGUgPSBwLT5pbnRlcnJ1cHRfZW5hYmxlOworCW8tPmVuYWJsZSA9IHAtPmVuYWJsZTsKKwlpZiAocC0+ZW5hYmxlKSB7CisJCWtmaWZvX3Jlc2V0KHN0YXRlLT5yeF9rZmlmbyk7CisJCWlmIChwLT5pbnRlcnJ1cHRfZW5hYmxlKQorCQkJaXJxZW5hYmxlX3J4KGRldiwgSVJRRU5fUlNFIHwgSVJRRU5fUlRFIHwgSVJRRU5fUk9FKTsKKwkJY29udHJvbF9yeF9lbmFibGUoZGV2LCBwLT5lbmFibGUpOworCX0KKworCW11dGV4X3VubG9jaygmc3RhdGUtPnJ4X3BhcmFtc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogVHJhbnNtaXR0ZXIgKi8KK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl90eF93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgICAgc3NpemVfdCAqbnVtKQoreworCXN0cnVjdCBjeDIzODg4X2lyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiA9IHN0YXRlLT5kZXY7CisJLyogRm9yIG5vdyBlbmFibGUgdGhlIFR4IEZJRk8gU2VydmljZSBpbnRlcnJ1cHQgJiBwcmV0ZW5kIHdlIGRpZCB3b3JrICovCisJaXJxZW5hYmxlX3R4KGRldiwgSVJRRU5fVFNFKTsKKwkqbnVtID0gY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl90eF9nX3BhcmFtZXRlcnMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyMzg4OF9pcl9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJbXV0ZXhfbG9jaygmc3RhdGUtPnR4X3BhcmFtc19sb2NrKTsKKwltZW1jcHkocCwgJnN0YXRlLT50eF9wYXJhbXMsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycykpOworCW11dGV4X3VubG9jaygmc3RhdGUtPnR4X3BhcmFtc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDIzODg4X2lyX3R4X3NodXRkb3duKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IGN4MjM4ODhfaXJfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gc3RhdGUtPmRldjsKKworCW11dGV4X2xvY2soJnN0YXRlLT50eF9wYXJhbXNfbG9jayk7CisKKwkvKiBEaXNhYmxlIG9yIHNsb3cgZG93biBhbGwgSVIgVHggY2lyY3VpdHMgYW5kIGNvdW50ZXJzICovCisJaXJxZW5hYmxlX3R4KGRldiwgMCk7CisJY29udHJvbF90eF9lbmFibGUoZGV2LCBmYWxzZSk7CisJY29udHJvbF90eF9tb2R1bGF0aW9uX2VuYWJsZShkZXYsIGZhbHNlKTsKKwljeDIzODg4X2lyX3dyaXRlNChkZXYsIENYMjM4ODhfSVJfVFhDTEtfUkVHLCBUWENMS19UQ0QpOworCisJc3RhdGUtPnR4X3BhcmFtcy5zaHV0ZG93biA9IHRydWU7CisKKwltdXRleF91bmxvY2soJnN0YXRlLT50eF9wYXJhbXNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl90eF9zX3BhcmFtZXRlcnMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyMzg4OF9pcl9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBzdGF0ZS0+ZGV2OworCXN0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzICpvID0gJnN0YXRlLT50eF9wYXJhbXM7CisJdTE2IHR4Y2xrX2RpdmlkZXI7CisKKwlpZiAocC0+c2h1dGRvd24pCisJCXJldHVybiBjeDIzODg4X2lyX3R4X3NodXRkb3duKHNkKTsKKworCWlmIChwLT5tb2RlICE9IFY0TDJfU1VCREVWX0lSX01PREVfUFVMU0VfV0lEVEgpCisJCXJldHVybiAtRU5PU1lTOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPnR4X3BhcmFtc19sb2NrKTsKKworCW8tPnNodXRkb3duID0gcC0+c2h1dGRvd247CisKKwlvLT5tb2RlID0gcC0+bW9kZSA9IFY0TDJfU1VCREVWX0lSX01PREVfUFVMU0VfV0lEVEg7CisKKwlvLT5ieXRlc19wZXJfZGF0YV9lbGVtZW50ID0gcC0+Ynl0ZXNfcGVyX2RhdGFfZWxlbWVudCA9IHNpemVvZih1MzIpOworCisJLyogQmVmb3JlIHdlIHR3ZWFrIHRoZSBoYXJkd2FyZSwgd2UgaGF2ZSB0byBkaXNhYmxlIHRoZSB0cmFuc21pdHRlciAqLworCWlycWVuYWJsZV90eChkZXYsIDApOworCWNvbnRyb2xfdHhfZW5hYmxlKGRldiwgZmFsc2UpOworCisJY29udHJvbF90eF9tb2R1bGF0aW9uX2VuYWJsZShkZXYsIHAtPm1vZHVsYXRpb24pOworCW8tPm1vZHVsYXRpb24gPSBwLT5tb2R1bGF0aW9uOworCisJaWYgKHAtPm1vZHVsYXRpb24pIHsKKwkJcC0+Y2Fycmllcl9mcmVxID0gdHhjbGtfdHhfc19jYXJyaWVyKGRldiwgcC0+Y2Fycmllcl9mcmVxLAorCQkJCQkJICAgICAmdHhjbGtfZGl2aWRlcik7CisJCW8tPmNhcnJpZXJfZnJlcSA9IHAtPmNhcnJpZXJfZnJlcTsKKworCQlwLT5kdXR5X2N5Y2xlID0gY2R1dHlfdHhfc19kdXR5X2N5Y2xlKGRldiwgcC0+ZHV0eV9jeWNsZSk7CisJCW8tPmR1dHlfY3ljbGUgPSBwLT5kdXR5X2N5Y2xlOworCX0gZWxzZSB7CisJCXAtPm1heF9wdWxzZV93aWR0aCA9CisJCQkgICAgdHhjbGtfdHhfc19tYXhfcHVsc2Vfd2lkdGgoZGV2LCBwLT5tYXhfcHVsc2Vfd2lkdGgsCisJCQkJCQkgICAgICAgJnR4Y2xrX2RpdmlkZXIpOworCQlvLT5tYXhfcHVsc2Vfd2lkdGggPSBwLT5tYXhfcHVsc2Vfd2lkdGg7CisJfQorCWF0b21pY19zZXQoJnN0YXRlLT50eGNsa19kaXZpZGVyLCB0eGNsa19kaXZpZGVyKTsKKworCXAtPnJlc29sdXRpb24gPSBjbG9ja19kaXZpZGVyX3RvX3Jlc29sdXRpb24odHhjbGtfZGl2aWRlcik7CisJby0+cmVzb2x1dGlvbiA9IHAtPnJlc29sdXRpb247CisKKwkvKiBGSVhNRSAtIG1ha2UgdGhpcyBkZXBlbmRlbnQgb24gcmVzb2x1dGlvbiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCisJY29udHJvbF90eF9pcnFfd2F0ZXJtYXJrKGRldiwgVFhfRklGT19IQUxGX0VNUFRZKTsKKworCWNvbnRyb2xfdHhfcG9sYXJpdHlfaW52ZXJ0KGRldiwgcC0+aW52ZXJ0KTsKKwlvLT5pbnZlcnQgPSBwLT5pbnZlcnQ7CisKKwlvLT5pbnRlcnJ1cHRfZW5hYmxlID0gcC0+aW50ZXJydXB0X2VuYWJsZTsKKwlvLT5lbmFibGUgPSBwLT5lbmFibGU7CisJaWYgKHAtPmVuYWJsZSkgeworCQlrZmlmb19yZXNldChzdGF0ZS0+dHhfa2ZpZm8pOworCQlpZiAocC0+aW50ZXJydXB0X2VuYWJsZSkKKwkJCWlycWVuYWJsZV90eChkZXYsIElSUUVOX1RTRSk7CisJCWNvbnRyb2xfdHhfZW5hYmxlKGRldiwgcC0+ZW5hYmxlKTsKKwl9CisKKwltdXRleF91bmxvY2soJnN0YXRlLT50eF9wYXJhbXNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFY0TDIgU3ViZGV2aWNlIENvcmUgT3BzCisgKi8KK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl9sb2dfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IGN4MjM4ODhfaXJfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gc3RhdGUtPmRldjsKKwljaGFyICpzOworCWludCBpLCBqOworCisJdTMyIGNudHJsID0gY3gyMzg4OF9pcl9yZWFkNChkZXYsIENYMjM4ODhfSVJfQ05UUkxfUkVHKTsKKwl1MzIgdHhjbGsgPSBjeDIzODg4X2lyX3JlYWQ0KGRldiwgQ1gyMzg4OF9JUl9UWENMS19SRUcpICYgVFhDTEtfVENEOworCXUzMiByeGNsayA9IGN4MjM4ODhfaXJfcmVhZDQoZGV2LCBDWDIzODg4X0lSX1JYQ0xLX1JFRykgJiBSWENMS19SQ0Q7CisJdTMyIGNkdXR5ID0gY3gyMzg4OF9pcl9yZWFkNChkZXYsIENYMjM4ODhfSVJfQ0RVVFlfUkVHKSAmIENEVVRZX0NEQzsKKwl1MzIgc3RhdHMgPSBjeDIzODg4X2lyX3JlYWQ0KGRldiwgQ1gyMzg4OF9JUl9TVEFUU19SRUcpOworCXUzMiBpcnFlbiA9IGN4MjM4ODhfaXJfcmVhZDQoZGV2LCBDWDIzODg4X0lSX0lSUUVOX1JFRyk7CisJdTMyIGZpbHRyID0gY3gyMzg4OF9pcl9yZWFkNChkZXYsIENYMjM4ODhfSVJfRklMVFJfUkVHKSAmIEZJTFRSX0xQRjsKKworCXY0bDJfaW5mbyhzZCwgIklSIFJlY2VpdmVyOlxuIik7CisJdjRsMl9pbmZvKHNkLCAiXHRFbmFibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkgIGNudHJsICYgQ05UUkxfUlhFID8gInllcyIgOiAibm8iKTsKKwl2NGwyX2luZm8oc2QsICJcdERlbW9kdWxhdGlvbiBmcm9tIGEgY2FycmllcjogICAgICAgJXNcbiIsCisJCSAgY250cmwgJiBDTlRSTF9ETUQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwl2NGwyX2luZm8oc2QsICJcdEZJRk86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIsCisJCSAgY250cmwgJiBDTlRSTF9SRkUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlzd2l0Y2ggKGNudHJsICYgQ05UUkxfRURHKSB7CisJY2FzZSBDTlRSTF9FREdfTk9ORToKKwkJcyA9ICJkaXNhYmxlZCI7CisJCWJyZWFrOworCWNhc2UgQ05UUkxfRURHX0ZBTEw6CisJCXMgPSAiZmFsbGluZyBlZGdlIjsKKwkJYnJlYWs7CisJY2FzZSBDTlRSTF9FREdfUklTRToKKwkJcyA9ICJyaXNpbmcgZWRnZSI7CisJCWJyZWFrOworCWNhc2UgQ05UUkxfRURHX0JPVEg6CisJCXMgPSAicmlzaW5nICYgZmFsbGluZyBlZGdlcyI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXMgPSAiPz8/IGVkZ2UiOworCQlicmVhazsKKwl9CisJdjRsMl9pbmZvKHNkLCAiXHRQdWxzZSB0aW1lcnMnIHN0YXJ0L3N0b3AgdHJpZ2dlcjogICVzXG4iLCBzKTsKKwl2NGwyX2luZm8oc2QsICJcdEZJRk8gZGF0YSBvbiBwdWxzZSB0aW1lciBvdmVyZmxvdzogJXNcbiIsCisJCSAgY250cmwgJiBDTlRSTF9SID8gIm5vdCBsb2FkZWQiIDogIm92ZXJmbG93IG1hcmtlciIpOworCXY0bDJfaW5mbyhzZCwgIlx0RklGTyBpbnRlcnJ1cHQgd2F0ZXJtYXJrOiAgICAgICAgICAlc1xuIiwKKwkJICBjbnRybCAmIENOVFJMX1JJQyA/ICJub3QgZW1wdHkiIDogImhhbGYgZnVsbCBvciBncmVhdGVyIik7CisJdjRsMl9pbmZvKHNkLCAiXHRMb29wYmFjayBtb2RlOiAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkgIGNudHJsICYgQ05UUkxfTEJNID8gImxvb3BiYWNrIGFjdGl2ZSIgOiAibm9ybWFsIHJlY2VpdmUiKTsKKwlpZiAoY250cmwgJiBDTlRSTF9ETUQpIHsKKwkJdjRsMl9pbmZvKHNkLCAiXHRFeHBlY3RlZCBjYXJyaWVyICgxNiBjbG9ja3MpOiAgICAgICV1IEh6XG4iLAorCQkJICBjbG9ja19kaXZpZGVyX3RvX2NhcnJpZXJfZnJlcShyeGNsaykpOworCQlzd2l0Y2ggKGNudHJsICYgQ05UUkxfV0lOKSB7CisJCWNhc2UgQ05UUkxfV0lOXzNfMzoKKwkJCWkgPSAzOworCQkJaiA9IDM7CisJCQlicmVhazsKKwkJY2FzZSBDTlRSTF9XSU5fNF8zOgorCQkJaSA9IDQ7CisJCQlqID0gMzsKKwkJCWJyZWFrOworCQljYXNlIENOVFJMX1dJTl8zXzQ6CisJCQlpID0gMzsKKwkJCWogPSA0OworCQkJYnJlYWs7CisJCWNhc2UgQ05UUkxfV0lOXzRfNDoKKwkJCWkgPSA0OworCQkJaiA9IDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWkgPSAwOworCQkJaiA9IDA7CisJCQlicmVhazsKKwkJfQorCQl2NGwyX2luZm8oc2QsICJcdE5leHQgY2FycmllciBlZGdlIHdpbmRvdzogICAgICAgICAgMTYgY2xvY2tzICIKKwkJCSAgIi0lMWQvKyUxZCwgJXUgdG8gJXUgSHpcbiIsIGksIGosCisJCQkgIGNsb2NrX2RpdmlkZXJfdG9fZnJlcShyeGNsaywgMTYgKyBqKSwKKwkJCSAgY2xvY2tfZGl2aWRlcl90b19mcmVxKHJ4Y2xrLCAxNiAtIGkpKTsKKwl9IGVsc2UgeworCQl2NGwyX2luZm8oc2QsICJcdE1heCBtZWFzdXJhYmxlIHB1bHNlIHdpZHRoOiAgICAgICAgJXUgdXMsICIKKwkJCSAgIiVsbHUgbnNcbiIsCisJCQkgIHB1bHNlX3dpZHRoX2NvdW50X3RvX3VzKEZJRk9fUlhUWCwgcnhjbGspLAorCQkJICBwdWxzZV93aWR0aF9jb3VudF90b19ucyhGSUZPX1JYVFgsIHJ4Y2xrKSk7CisJfQorCXY0bDJfaW5mbyhzZCwgIlx0TG93IHBhc3MgZmlsdGVyOiAgICAgICAgICAgICAgICAgICAlc1xuIiwKKwkJICBmaWx0ciA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCWlmIChmaWx0cikKKwkJdjRsMl9pbmZvKHNkLCAiXHRNaW4gYWNjZXB0YWJsZSBwdWxzZSB3aWR0aCAoTFBGKTogICV1IHVzLCAiCisJCQkgICIldSBuc1xuIiwKKwkJCSAgbHBmX2NvdW50X3RvX3VzKGZpbHRyKSwKKwkJCSAgbHBmX2NvdW50X3RvX25zKGZpbHRyKSk7CisJdjRsMl9pbmZvKHNkLCAiXHRQdWxzZSB3aWR0aCB0aW1lciB0aW1lZC1vdXQ6ICAgICAgICVzXG4iLAorCQkgIHN0YXRzICYgU1RBVFNfUlRPID8gInllcyIgOiAibm8iKTsKKwl2NGwyX2luZm8oc2QsICJcdFB1bHNlIHdpZHRoIHRpbWVyIHRpbWUtb3V0IGludHI6ICAgJXNcbiIsCisJCSAgaXJxZW4gJiBJUlFFTl9SVEUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwl2NGwyX2luZm8oc2QsICJcdEZJRk8gb3ZlcnJ1bjogICAgICAgICAgICAgICAgICAgICAgJXNcbiIsCisJCSAgc3RhdHMgJiBTVEFUU19ST1IgPyAieWVzIiA6ICJubyIpOworCXY0bDJfaW5mbyhzZCwgIlx0RklGTyBvdmVycnVuIGludGVycnVwdDogICAgICAgICAgICAlc1xuIiwKKwkJICBpcnFlbiAmIElSUUVOX1JPRSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCXY0bDJfaW5mbyhzZCwgIlx0QnVzeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiwKKwkJICBzdGF0cyAmIFNUQVRTX1JCWSA/ICJ5ZXMiIDogIm5vIik7CisJdjRsMl9pbmZvKHNkLCAiXHRGSUZPIHNlcnZpY2UgcmVxdWVzdGVkOiAgICAgICAgICAgICVzXG4iLAorCQkgIHN0YXRzICYgU1RBVFNfUlNSID8gInllcyIgOiAibm8iKTsKKwl2NGwyX2luZm8oc2QsICJcdEZJRk8gc2VydmljZSByZXF1ZXN0IGludGVycnVwdDogICAgJXNcbiIsCisJCSAgaXJxZW4gJiBJUlFFTl9SU0UgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCXY0bDJfaW5mbyhzZCwgIklSIFRyYW5zbWl0dGVyOlxuIik7CisJdjRsMl9pbmZvKHNkLCAiXHRFbmFibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkgIGNudHJsICYgQ05UUkxfVFhFID8gInllcyIgOiAibm8iKTsKKwl2NGwyX2luZm8oc2QsICJcdE1vZHVsYXRpb24gb250byBhIGNhcnJpZXI6ICAgICAgICAgJXNcbiIsCisJCSAgY250cmwgJiBDTlRSTF9NT0QgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwl2NGwyX2luZm8oc2QsICJcdEZJRk86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIsCisJCSAgY250cmwgJiBDTlRSTF9URkUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwl2NGwyX2luZm8oc2QsICJcdEZJRk8gaW50ZXJydXB0IHdhdGVybWFyazogICAgICAgICAgJXNcbiIsCisJCSAgY250cmwgJiBDTlRSTF9USUMgPyAibm90IGVtcHR5IiA6ICJoYWxmIGZ1bGwgb3IgbGVzcyIpOworCXY0bDJfaW5mbyhzZCwgIlx0U2lnbmFsIHBvbGFyaXR5OiAgICAgICAgICAgICAgICAgICAlc1xuIiwKKwkJICBjbnRybCAmIENOVFJMX0NQTCA/ICIwOm1hcmsgMTpzcGFjZSIgOiAiMDpzcGFjZSAxOm1hcmsiKTsKKwlpZiAoY250cmwgJiBDTlRSTF9NT0QpIHsKKwkJdjRsMl9pbmZvKHNkLCAiXHRDYXJyaWVyICgxNiBjbG9ja3MpOiAgICAgICAgICAgICAgICV1IEh6XG4iLAorCQkJICBjbG9ja19kaXZpZGVyX3RvX2NhcnJpZXJfZnJlcSh0eGNsaykpOworCQl2NGwyX2luZm8oc2QsICJcdENhcnJpZXIgZHV0eSBjeWNsZTogICAgICAgICAgICAgICAgJTJ1LzE2XG4iLAorCQkJICBjZHV0eSArIDEpOworCX0gZWxzZSB7CisJCXY0bDJfaW5mbyhzZCwgIlx0TWF4IHB1bHNlIHdpZHRoOiAgICAgICAgICAgICAgICAgICAldSB1cywgIgorCQkJICAiJWxsdSBuc1xuIiwKKwkJCSAgcHVsc2Vfd2lkdGhfY291bnRfdG9fdXMoRklGT19SWFRYLCB0eGNsayksCisJCQkgIHB1bHNlX3dpZHRoX2NvdW50X3RvX25zKEZJRk9fUlhUWCwgdHhjbGspKTsKKwl9CisJdjRsMl9pbmZvKHNkLCAiXHRCdXN5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iLAorCQkgIHN0YXRzICYgU1RBVFNfVEJZID8gInllcyIgOiAibm8iKTsKKwl2NGwyX2luZm8oc2QsICJcdEZJRk8gc2VydmljZSByZXF1ZXN0ZWQ6ICAgICAgICAgICAgJXNcbiIsCisJCSAgc3RhdHMgJiBTVEFUU19UU1IgPyAieWVzIiA6ICJubyIpOworCXY0bDJfaW5mbyhzZCwgIlx0RklGTyBzZXJ2aWNlIHJlcXVlc3QgaW50ZXJydXB0OiAgICAlc1xuIiwKKwkJICBpcnFlbiAmIElSUUVOX1RTRSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4MjM4ODhfaXJfZGJnX21hdGNoKGNvbnN0IHN0cnVjdCB2NGwyX2RiZ19tYXRjaCAqbWF0Y2gpCit7CisJcmV0dXJuIG1hdGNoLT50eXBlID09IFY0TDJfQ0hJUF9NQVRDSF9IT1NUICYmIG1hdGNoLT5hZGRyID09IDI7Cit9CisKK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3QgY3gyMzg4OF9pcl9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlpZiAoY3gyMzg4OF9pcl9kYmdfbWF0Y2goJmNoaXAtPm1hdGNoKSkgeworCQljaGlwLT5pZGVudCA9IHN0YXRlLT5pZDsKKwkJY2hpcC0+cmV2aXNpb24gPSBzdGF0ZS0+cmV2OworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl9nX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBjeDIzODg4X2lyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwl1MzIgYWRkciA9IENYMjM4ODhfSVJfUkVHX0JBU0UgKyAodTMyKSByZWctPnJlZzsKKworCWlmICghY3gyMzg4OF9pcl9kYmdfbWF0Y2goJnJlZy0+bWF0Y2gpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGFkZHIgJiAweDMpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhZGRyIDwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcgfHwgYWRkciA+IENYMjM4ODhfSVJfTEVBUk5fUkVHKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmVnLT5zaXplID0gNDsKKwlyZWctPnZhbCA9IGN4MjM4ODhfaXJfcmVhZDQoc3RhdGUtPmRldiwgYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyMzg4OF9pcl9zX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBjeDIzODg4X2lyX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwl1MzIgYWRkciA9IENYMjM4ODhfSVJfUkVHX0JBU0UgKyAodTMyKSByZWctPnJlZzsKKworCWlmICghY3gyMzg4OF9pcl9kYmdfbWF0Y2goJnJlZy0+bWF0Y2gpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGFkZHIgJiAweDMpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhZGRyIDwgQ1gyMzg4OF9JUl9DTlRSTF9SRUcgfHwgYWRkciA+IENYMjM4ODhfSVJfTEVBUk5fUkVHKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJY3gyMzg4OF9pcl93cml0ZTQoc3RhdGUtPmRldiwgYWRkciwgcmVnLT52YWwpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgY3gyMzg4OF9pcl9jb3JlX29wcyA9IHsKKwkuZ19jaGlwX2lkZW50ID0gY3gyMzg4OF9pcl9nX2NoaXBfaWRlbnQsCisJLmxvZ19zdGF0dXMgPSBjeDIzODg4X2lyX2xvZ19zdGF0dXMsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyID0gY3gyMzg4OF9pcl9nX3JlZ2lzdGVyLAorCS5zX3JlZ2lzdGVyID0gY3gyMzg4OF9pcl9zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2lyX29wcyBjeDIzODg4X2lyX2lyX29wcyA9IHsKKwkuaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSA9IGN4MjM4ODhfaXJfaXJxX2hhbmRsZXIsCisKKwkucnhfcmVhZCA9IGN4MjM4ODhfaXJfcnhfcmVhZCwKKwkucnhfZ19wYXJhbWV0ZXJzID0gY3gyMzg4OF9pcl9yeF9nX3BhcmFtZXRlcnMsCisJLnJ4X3NfcGFyYW1ldGVycyA9IGN4MjM4ODhfaXJfcnhfc19wYXJhbWV0ZXJzLAorCisJLnR4X3dyaXRlID0gY3gyMzg4OF9pcl90eF93cml0ZSwKKwkudHhfZ19wYXJhbWV0ZXJzID0gY3gyMzg4OF9pcl90eF9nX3BhcmFtZXRlcnMsCisJLnR4X3NfcGFyYW1ldGVycyA9IGN4MjM4ODhfaXJfdHhfc19wYXJhbWV0ZXJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgY3gyMzg4OF9pcl9jb250cm9sbGVyX29wcyA9IHsKKwkuY29yZSA9ICZjeDIzODg4X2lyX2NvcmVfb3BzLAorCS5pciA9ICZjeDIzODg4X2lyX2lyX29wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyBkZWZhdWx0X3J4X3BhcmFtcyA9IHsKKwkuYnl0ZXNfcGVyX2RhdGFfZWxlbWVudCA9IHNpemVvZih1MzIpLAorCS5tb2RlID0gVjRMMl9TVUJERVZfSVJfTU9ERV9QVUxTRV9XSURUSCwKKworCS5lbmFibGUgPSBmYWxzZSwKKwkuaW50ZXJydXB0X2VuYWJsZSA9IGZhbHNlLAorCS5zaHV0ZG93biA9IHRydWUsCisKKwkubW9kdWxhdGlvbiA9IHRydWUsCisJLmNhcnJpZXJfZnJlcSA9IDM2MDAwLCAvKiAzNiBrSHogLSBSQy01LCBSQy02LCBhbmQgUkMtNkEgY2FycmllciAqLworCisJLyogUkMtNTogICAgNjY2LDY2NyBucyA9IDEvMzYga0h6ICogMzIgY3ljbGVzICogMSBtYXJrICogMC43NSAqLworCS8qIFJDLTZBOiAgIDMzMywzMzMgbnMgPSAxLzM2IGtIeiAqIDE2IGN5Y2xlcyAqIDEgbWFyayAqIDAuNzUgKi8KKwkubm9pc2VfZmlsdGVyX21pbl93aWR0aCA9IDMzMzMzMywgLyogbnMgKi8KKwkuY2Fycmllcl9yYW5nZV9sb3dlciA9IDM1MDAwLAorCS5jYXJyaWVyX3JhbmdlX3VwcGVyID0gMzcwMDAsCisJLmludmVydCA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzIGRlZmF1bHRfdHhfcGFyYW1zID0geworCS5ieXRlc19wZXJfZGF0YV9lbGVtZW50ID0gc2l6ZW9mKHUzMiksCisJLm1vZGUgPSBWNEwyX1NVQkRFVl9JUl9NT0RFX1BVTFNFX1dJRFRILAorCisJLmVuYWJsZSA9IGZhbHNlLAorCS5pbnRlcnJ1cHRfZW5hYmxlID0gZmFsc2UsCisJLnNodXRkb3duID0gdHJ1ZSwKKworCS5tb2R1bGF0aW9uID0gdHJ1ZSwKKwkuY2Fycmllcl9mcmVxID0gMzYwMDAsIC8qIDM2IGtIeiAtIFJDLTUgY2FycmllciAqLworCS5kdXR5X2N5Y2xlID0gMjUsICAgICAgLyogMjUgJSAgIC0gUkMtNSBjYXJyaWVyICovCisJLmludmVydCA9IGZhbHNlLAorfTsKKworaW50IGN4MjM4ODhfaXJfcHJvYmUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCit7CisJc3RydWN0IGN4MjM4ODhfaXJfc3RhdGUgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJc3RydWN0IHY0bDJfc3ViZGV2X2lyX3BhcmFtZXRlcnMgZGVmYXVsdF9wYXJhbXM7CisJaW50IHJldDsKKworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGN4MjM4ODhfaXJfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmc3RhdGUtPnJ4X2tmaWZvX2xvY2spOworCXN0YXRlLT5yeF9rZmlmbyA9IGtmaWZvX2FsbG9jKENYMjM4ODhfSVJfUlhfS0ZJRk9fU0laRSwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICAmc3RhdGUtPnJ4X2tmaWZvX2xvY2spOworCWlmIChzdGF0ZS0+cnhfa2ZpZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmc3RhdGUtPnR4X2tmaWZvX2xvY2spOworCXN0YXRlLT50eF9rZmlmbyA9IGtmaWZvX2FsbG9jKENYMjM4ODhfSVJfVFhfS0ZJRk9fU0laRSwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICAmc3RhdGUtPnR4X2tmaWZvX2xvY2spOworCWlmIChzdGF0ZS0+dHhfa2ZpZm8gPT0gTlVMTCkgeworCQlrZmlmb19mcmVlKHN0YXRlLT5yeF9rZmlmbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXN0YXRlLT5kZXYgPSBkZXY7CisJc3RhdGUtPmlkID0gVjRMMl9JREVOVF9DWDIzODg4X0lSOworCXN0YXRlLT5yZXYgPSAwOworCXNkID0gJnN0YXRlLT5zZDsKKworCXY0bDJfc3ViZGV2X2luaXQoc2QsICZjeDIzODg4X2lyX2NvbnRyb2xsZXJfb3BzKTsKKwl2NGwyX3NldF9zdWJkZXZkYXRhKHNkLCBzdGF0ZSk7CisJLyogRklYTUUgLSBmaXggdGhlIGZvcm1hdHRpbmcgb2YgZGV2LT52NGwyX2Rldi5uYW1lIGFuZCB1c2UgaXQgKi8KKwlzbnByaW50ZihzZC0+bmFtZSwgc2l6ZW9mKHNkLT5uYW1lKSwgIiVzLzg4OC1pciIsIGRldi0+bmFtZSk7CisJc2QtPmdycF9pZCA9IENYMjM4ODVfSFdfODg4X0lSOworCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LCBzZCk7CisJaWYgKHJldCA9PSAwKSB7CisJCS8qCisJCSAqIEVuc3VyZSBubyBpbnRlcnJ1cHRzIGFycml2ZSBmcm9tICc4ODggc3BlY2lmaWMgY29uZGl0aW9ucywKKwkJICogc2luY2Ugd2UgaWdub3JlIHRoZW0gaW4gdGhpcyBkcml2ZXIgdG8gaGF2ZSBjb21tb25hbGl0eSB3aXRoCisJCSAqIHNpbWlsYXIgSVIgY29udHJvbGxlciBjb3Jlcy4KKwkJICovCisJCWN4MjM4ODhfaXJfd3JpdGU0KGRldiwgQ1gyMzg4OF9JUl9JUlFFTl9SRUcsIDApOworCisJCW11dGV4X2luaXQoJnN0YXRlLT5yeF9wYXJhbXNfbG9jayk7CisJCW1lbWNweSgmZGVmYXVsdF9wYXJhbXMsICZkZWZhdWx0X3J4X3BhcmFtcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycykpOworCQl2NGwyX3N1YmRldl9jYWxsKHNkLCBpciwgcnhfc19wYXJhbWV0ZXJzLCAmZGVmYXVsdF9wYXJhbXMpOworCisJCW11dGV4X2luaXQoJnN0YXRlLT50eF9wYXJhbXNfbG9jayk7CisJCW1lbWNweSgmZGVmYXVsdF9wYXJhbXMsICZkZWZhdWx0X3R4X3BhcmFtcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycykpOworCQl2NGwyX3N1YmRldl9jYWxsKHNkLCBpciwgdHhfc19wYXJhbWV0ZXJzLCAmZGVmYXVsdF9wYXJhbXMpOworCX0gZWxzZSB7CisJCWtmaWZvX2ZyZWUoc3RhdGUtPnJ4X2tmaWZvKTsKKwkJa2ZpZm9fZnJlZShzdGF0ZS0+dHhfa2ZpZm8pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgY3gyMzg4OF9pcl9yZW1vdmUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlzdHJ1Y3QgY3gyMzg4OF9pcl9zdGF0ZSAqc3RhdGU7CisKKwlzZCA9IGN4MjM4ODVfZmluZF9odyhkZXYsIENYMjM4ODVfSFdfODg4X0lSKTsKKwlpZiAoc2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljeDIzODg4X2lyX3J4X3NodXRkb3duKHNkKTsKKwljeDIzODg4X2lyX3R4X3NodXRkb3duKHNkKTsKKworCXN0YXRlID0gdG9fc3RhdGUoc2QpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZmlmb19mcmVlKHN0YXRlLT5yeF9rZmlmbyk7CisJa2ZpZm9fZnJlZShzdGF0ZS0+dHhfa2ZpZm8pOworCWtmcmVlKHN0YXRlKTsKKwkvKiBOb3RoaW5nIG1vcmUgdG8gZnJlZSgpIGFzIHN0YXRlIGhlbGQgdGhlIGFjdHVhbCB2NGwyX3N1YmRldiBvYmplY3QgKi8KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg4LWlyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4OC1pci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDQ2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4OC1pci5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgRHJpdmVyIGZvciB0aGUgQ29uZXhhbnQgQ1gyMzg4NS83LzggUENJZSBicmlkZ2UKKyAqCisgKiAgQ1gyMzg4OCBJbnRlZ3JhdGVkIENvbnN1bWVyIEluZnJhcmVkIENvbnRyb2xsZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9DWDIzODg4X0lSX0hfCisjZGVmaW5lIF9DWDIzODg4X0lSX0hfCitpbnQgY3gyMzg4OF9pcl9wcm9iZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7CitpbnQgY3gyMzg4OF9pcl9yZW1vdmUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYwppbmRleCAyZjg0NmY1ZS4uNDU2MDhkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jCkBAIC0yMyw4NyArMjMsMTM3IEBACiAKICNpbmNsdWRlICJjeDI1ODQwLWNvcmUuaCIKIAotc3RhdGljIGludCBzZXRfYXVkY2xrX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGZyZXEpCisvKgorICogTm90ZTogVGhlIFBMTCBhbmQgU1JDIHBhcmFtZXRlcnMgYXJlIGJhc2VkIG9uIGEgcmVmZXJlbmNlIGZyZXF1ZW5jeSB0aGF0CisgKiB3b3VsZCBpZGVhbGx5IGJlOgorICoKKyAqIE5UU0MgQ29sb3Igc3ViY2FycmllciBmcmVxICogOCA9IDQuNSBNSHovMjg2ICogNDU1LzIgKiA4ID0gMjguNjM2MzYzNjMuLi4gTUh6CisgKgorICogSG93ZXZlciwgaXQncyBub3QgdGhlIGV4YWN0IHJlZmVyZW5jZSBmcmVxdWVuY3kgdGhhdCBtYXR0ZXJzLCBvbmx5IHRoYXQgdGhlCisgKiBmaXJtd2FyZSBhbmQgbW9kdWxlcyB0aGF0IGNvbXByaXNlIHRoZSBkcml2ZXIgZm9yIGEgcGFydGljdWxhciBib2FyZCBhbGwKKyAqIHVzZSB0aGUgc2FtZSB2YWx1ZSAoY2xvc2UgdG8gdGhlIGlkZWFsIHZhbHVlKS4KKyAqCisgKiBDb21tZW50cyBiZWxvdyB3aWxsIG5vdGUgd2hpY2ggcmVmZXJlbmNlIGZyZXF1ZW5jeSBpcyBhc3N1bWVkIGZvciB2YXJpb3VzCisgKiBwYXJhbWV0ZXJzLiAgVGhleSB3aWxsIHVzdWFsbHkgYmUgb25lIG9mCisgKgorICoJcmVmX2ZyZXEgPSAyOC42MzYzNjAgTUh6CisgKgkJb3IKKyAqCXJlZl9mcmVxID0gMjguNjM2MzYzIE1IegorICovCisKK3N0YXRpYyBpbnQgY3gyNTg0MF9zZXRfYXVkY2xrX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGZyZXEpCiB7CiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCi0JaWYgKGZyZXEgIT0gMzIwMDAgJiYgZnJlcSAhPSA0NDEwMCAmJiBmcmVxICE9IDQ4MDAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIGNvbW1vbiBmb3IgYWxsIGlucHV0cyBhbmQgcmF0ZXMgKi8KLQkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDEwICovCi0JaWYgKCFzdGF0ZS0+aXNfY3gyMzg4NSAmJiAhc3RhdGUtPmlzX2N4MjMxeHgpCi0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEyNywgMHg1MCk7Ci0KIAlpZiAoc3RhdGUtPmF1ZF9pbnB1dCAhPSBDWDI1ODQwX0FVRElPX1NFUklBTCkgewogCQlzd2l0Y2ggKGZyZXEpIHsKIAkJY2FzZSAzMjAwMDoKLQkJCWlmIChzdGF0ZS0+aXNfY3gyMzg4NSkgewotCQkJCS8qIFdlIGRvbid0IGhhdmUgcmVnaXN0ZXIgdmFsdWVzCi0JCQkJICogc28gYXZvaWQgZGVzdHJveWluZyByZWdpc3RlcnMuICovCi0JCQkJYnJlYWs7Ci0JCQl9CisJCQkvKgorCQkJICogVklEX1BMTCBJbnRlZ2VyID0gMHgwZiwgVklEX1BMTCBQb3N0IERpdmlkZXIgPSAweDA0CisJCQkgKiBBVVhfUExMIEludGVnZXIgPSAweDA2LCBBVVggUExMIFBvc3QgRGl2aWRlciA9IDB4MTAKKwkJCSAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgxMDA2MDQwZik7CiAKLQkJCWlmICghc3RhdGUtPmlzX2N4MjMxeHgpIHsKLQkJCQkvKiBWSURfUExMIGFuZCBBVVhfUExMICovCi0JCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgxMDA2MDQwZik7CisJCQkvKgorCQkJICogVklEX1BMTCBGcmFjdGlvbiAocmVnaXN0ZXIgMHgxMGMpID0gMHgyYmUyZmUKKwkJCSAqIDI4NjM2MzYwICogMHhmLjE1ZjE3ZjAvNCA9IDEwOCBNSHoKKwkJCSAqIDQzMiBNSHogcHJlLXBvc3RkaXZpZGUKKwkJCSAqLwogCi0JCQkJLyogQVVYX1BMTF9GUkFDICovCi0JCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHgwMWJiMzllZSk7Ci0JCQl9CisJCQkvKgorCQkJICogQVVYX1BMTCBGcmFjdGlvbiA9IDB4MWJiMzllZQorCQkJICogMjg2MzYzNjMgKiAweDYuZGQ5Y2Y3MC8weDEwID0gMzIwMDAgKiAzODQKKwkJCSAqIDE5Ni42IE1IeiBwcmUtcG9zdGRpdmlkZQorCQkJICogRklYTUUgPCAyMDAgTUh6IGlzIG91dCBvZiBzcGVjaWZpZWQgdmFsaWQgcmFuZ2UKKwkJCSAqIEZJWE1FIDI4NjM2MzYzIHJlZl9mcmVxIGRvZXNuJ3QgbWF0Y2ggVklEIFBMTCByZWYKKwkJCSAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHgwMWJiMzllZSk7CiAKLQkJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCS8qCisJCQkgKiBTQV9NQ0xLX1NFTCA9IDEKKwkJCSAqIFNBX01DTEtfRElWID0gMHgxMCA9IDM4NC8zODQgKiBBVVhfUExMIHBvc3QgZHZpdmlkZXIKKwkJCSAqLworCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTI3LCAweDUwKTsKKworCQkJaWYgKGlzX2N4MjU4M3goc3RhdGUpKQogCQkJCWJyZWFrOwogCi0JCQkvKiBzcmMzLzQvNl9jdGwgPSAweDA4MDFmNzdmICovCisJCQkvKiBzcmMzLzQvNl9jdGwgKi8KKwkJCS8qIDB4MS5mNzdmID0gKDQgKiAyODYzNjM2MC84ICogMi80NTUpIC8gMzIwMDAgKi8KIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDAsIDB4MDgwMWY3N2YpOwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwNCwgMHgwODAxZjc3Zik7CiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTBjLCAweDA4MDFmNzdmKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgNDQxMDA6Ci0JCQlpZiAoc3RhdGUtPmlzX2N4MjM4ODUpIHsKLQkJCQkvKiBXZSBkb24ndCBoYXZlIHJlZ2lzdGVyIHZhbHVlcwotCQkJCSAqIHNvIGF2b2lkIGRlc3Ryb3lpbmcgcmVnaXN0ZXJzLiAqLwotCQkJCWJyZWFrOwotCQkJfQorCQkJLyoKKwkJCSAqIFZJRF9QTEwgSW50ZWdlciA9IDB4MGYsIFZJRF9QTEwgUG9zdCBEaXZpZGVyID0gMHgwNAorCQkJICogQVVYX1BMTCBJbnRlZ2VyID0gMHgwOSwgQVVYIFBMTCBQb3N0IERpdmlkZXIgPSAweDEwCisJCQkgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMDgsIDB4MTAwOTA0MGYpOwogCi0JCQlpZiAoIXN0YXRlLT5pc19jeDIzMXh4KSB7Ci0JCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMDgsIDB4MTAwOTA0MGYpOworCQkJLyoKKwkJCSAqIFZJRF9QTEwgRnJhY3Rpb24gKHJlZ2lzdGVyIDB4MTBjKSA9IDB4MmJlMmZlCisJCQkgKiAyODYzNjM2MCAqIDB4Zi4xNWYxN2YwLzQgPSAxMDggTUh6CisJCQkgKiA0MzIgTUh6IHByZS1wb3N0ZGl2aWRlCisJCQkgKi8KIAotCQkJCS8qIEFVWF9QTExfRlJBQyAqLwotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTAsIDB4MDBlYzZiZDYpOwotCQkJfQorCQkJLyoKKwkJCSAqIEFVWF9QTEwgRnJhY3Rpb24gPSAweDBlYzZiZDYKKwkJCSAqIDI4NjM2MzYzICogMHg5Ljc2MzVlYjAvMHgxMCA9IDQ0MTAwICogMzg0CisJCQkgKiAyNzEgTUh6IHByZS1wb3N0ZGl2aWRlCisJCQkgKiBGSVhNRSAyODYzNjM2MyByZWZfZnJlcSBkb2Vzbid0IG1hdGNoIFZJRCBQTEwgcmVmCisJCQkgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTAsIDB4MDBlYzZiZDYpOwogCi0JCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQkvKgorCQkJICogU0FfTUNMS19TRUwgPSAxCisJCQkgKiBTQV9NQ0xLX0RJViA9IDB4MTAgPSAzODQvMzg0ICogQVVYX1BMTCBwb3N0IGR2aXZpZGVyCisJCQkgKi8KKwkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEyNywgMHg1MCk7CisKKwkJCWlmIChpc19jeDI1ODN4KHN0YXRlKSkKIAkJCQlicmVhazsKIAotCQkJLyogc3JjMy80LzZfY3RsID0gMHgwODAxNmQ1OSAqLworCQkJLyogc3JjMy80LzZfY3RsICovCisJCQkvKiAweDEuNmQ1OSA9ICg0ICogMjg2MzYzNjAvOCAqIDIvNDU1KSAvIDQ0MTAwICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTAwLCAweDA4MDE2ZDU5KTsKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDQsIDB4MDgwMTZkNTkpOwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwYywgMHgwODAxNmQ1OSk7CiAJCQlicmVhazsKIAogCQljYXNlIDQ4MDAwOgotCQkJaWYgKHN0YXRlLT5pc19jeDIzODg1KSB7Ci0JCQkJLyogV2UgZG9uJ3QgaGF2ZSByZWdpc3RlciB2YWx1ZXMKLQkJCQkgKiBzbyBhdm9pZCBkZXN0cm95aW5nIHJlZ2lzdGVycy4gKi8KLQkJCQlicmVhazsKLQkJCX0KKwkJCS8qCisJCQkgKiBWSURfUExMIEludGVnZXIgPSAweDBmLCBWSURfUExMIFBvc3QgRGl2aWRlciA9IDB4MDQKKwkJCSAqIEFVWF9QTEwgSW50ZWdlciA9IDB4MGEsIEFVWCBQTEwgUG9zdCBEaXZpZGVyID0gMHgxMAorCQkJICovCisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTA4LCAweDEwMGEwNDBmKTsKIAotCQkJaWYgKCFzdGF0ZS0+aXNfY3gyMzF4eCkgewotCQkJCS8qIFZJRF9QTEwgYW5kIEFVWF9QTEwgKi8KLQkJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTA4LCAweDEwMGEwNDBmKTsKKwkJCS8qCisJCQkgKiBWSURfUExMIEZyYWN0aW9uIChyZWdpc3RlciAweDEwYykgPSAweDJiZTJmZQorCQkJICogMjg2MzYzNjAgKiAweGYuMTVmMTdmMC80ID0gMTA4IE1IegorCQkJICogNDMyIE1IeiBwcmUtcG9zdGRpdmlkZQorCQkJICovCiAKLQkJCQkvKiBBVVhfUExMX0ZSQUMgKi8KLQkJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDAwOThkNmU1KTsKLQkJCX0KKwkJCS8qCisJCQkgKiBBVVhfUExMIEZyYWN0aW9uID0gMHgwOThkNmU1CisJCQkgKiAyODYzNjM2MyAqIDB4YS40YzZiNzI4LzB4MTAgPSA0ODAwMCAqIDM4NAorCQkJICogMjk1IE1IeiBwcmUtcG9zdGRpdmlkZQorCQkJICogRklYTUUgMjg2MzYzNjMgcmVmX2ZyZXEgZG9lc24ndCBtYXRjaCBWSUQgUExMIHJlZgorCQkJICovCisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDAwOThkNmU1KTsKIAotCQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJLyoKKwkJCSAqIFNBX01DTEtfU0VMID0gMQorCQkJICogU0FfTUNMS19ESVYgPSAweDEwID0gMzg0LzM4NCAqIEFVWF9QTEwgcG9zdCBkdml2aWRlcgorCQkJICovCisJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMjcsIDB4NTApOworCisJCQlpZiAoaXNfY3gyNTgzeChzdGF0ZSkpCiAJCQkJYnJlYWs7CiAKLQkJCS8qIHNyYzMvNC82X2N0bCA9IDB4MDgwMTRmYWEgKi8KKwkJCS8qIHNyYzMvNC82X2N0bCAqLworCQkJLyogMHgxLjRmYWEgPSAoNCAqIDI4NjM2MzYwLzggKiAyLzQ1NSkgLyA0ODAwMCAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHgwODAxNGZhYSk7CiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTA0LCAweDA4MDE0ZmFhKTsKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4MDgwMTRmYWEpOwpAQCAtMTEyLDkxICsxNjIsMTI2IEBACiAJfSBlbHNlIHsKIAkJc3dpdGNoIChmcmVxKSB7CiAJCWNhc2UgMzIwMDA6Ci0JCQlpZiAoc3RhdGUtPmlzX2N4MjM4ODUpIHsKLQkJCQkvKiBXZSBkb24ndCBoYXZlIHJlZ2lzdGVyIHZhbHVlcwotCQkJCSAqIHNvIGF2b2lkIGRlc3Ryb3lpbmcgcmVnaXN0ZXJzLiAqLwotCQkJCWJyZWFrOwotCQkJfQorCQkJLyoKKwkJCSAqIFZJRF9QTEwgSW50ZWdlciA9IDB4MGYsIFZJRF9QTEwgUG9zdCBEaXZpZGVyID0gMHgwNAorCQkJICogQVVYX1BMTCBJbnRlZ2VyID0gMHgwOCwgQVVYIFBMTCBQb3N0IERpdmlkZXIgPSAweDFlCisJCQkgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMDgsIDB4MWUwODA0MGYpOwogCi0JCQlpZiAoIXN0YXRlLT5pc19jeDIzMXh4KSB7Ci0JCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMDgsIDB4MWUwODA0MGYpOworCQkJLyoKKwkJCSAqIFZJRF9QTEwgRnJhY3Rpb24gKHJlZ2lzdGVyIDB4MTBjKSA9IDB4MmJlMmZlCisJCQkgKiAyODYzNjM2MCAqIDB4Zi4xNWYxN2YwLzQgPSAxMDggTUh6CisJCQkgKiA0MzIgTUh6IHByZS1wb3N0ZGl2aWRlCisJCQkgKi8KIAotCQkJCS8qIEFVWF9QTExfRlJBQyAqLwotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTAsIDB4MDEyYTA4NjkpOwotCQkJfQorCQkJLyoKKwkJCSAqIEFVWF9QTEwgRnJhY3Rpb24gPSAweDEyYTA4NjkKKwkJCSAqIDI4NjM2MzYzICogMHg4Ljk1MDQzNDgvMHgxZSA9IDMyMDAwICogMjU2CisJCQkgKiAyNDYgTUh6IHByZS1wb3N0ZGl2aWRlCisJCQkgKiBGSVhNRSAyODYzNjM2MyByZWZfZnJlcSBkb2Vzbid0IG1hdGNoIFZJRCBQTEwgcmVmCisJCQkgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTAsIDB4MDEyYTA4NjkpOwogCi0JCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQkvKgorCQkJICogU0FfTUNMS19TRUwgPSAxCisJCQkgKiBTQV9NQ0xLX0RJViA9IDB4MTQgPSAyNTYvMzg0ICogQVVYX1BMTCBwb3N0IGR2aXZpZGVyCisJCQkgKi8KKwkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEyNywgMHg1NCk7CisKKwkJCWlmIChpc19jeDI1ODN4KHN0YXRlKSkKIAkJCQlicmVhazsKIAotCQkJLyogc3JjMV9jdGwgPSAweDA4MDEwMDAwICovCisJCQkvKiBzcmMxX2N0bCAqLworCQkJLyogMHgxLjAwMDAgPSAzMjAwMC8zMjAwMCAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhmOCwgMHgwODAxMDAwMCk7CiAKLQkJCS8qIHNyYzMvNC82X2N0bCA9IDB4MDgwMjAwMDAgKi8KKwkJCS8qIHNyYzMvNC82X2N0bCAqLworCQkJLyogMHgyLjAwMDAgPSAyICogKDMyMDAwLzMyMDAwKSAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHgwODAyMDAwMCk7CiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTA0LCAweDA4MDIwMDAwKTsKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4MDgwMjAwMDApOwotCi0JCQkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDE0ICovCi0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMjcsIDB4NTQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSA0NDEwMDoKLQkJCWlmIChzdGF0ZS0+aXNfY3gyMzg4NSkgewotCQkJCS8qIFdlIGRvbid0IGhhdmUgcmVnaXN0ZXIgdmFsdWVzCi0JCQkJICogc28gYXZvaWQgZGVzdHJveWluZyByZWdpc3RlcnMuICovCi0JCQkJYnJlYWs7Ci0JCQl9CisJCQkvKgorCQkJICogVklEX1BMTCBJbnRlZ2VyID0gMHgwZiwgVklEX1BMTCBQb3N0IERpdmlkZXIgPSAweDA0CisJCQkgKiBBVVhfUExMIEludGVnZXIgPSAweDA5LCBBVVggUExMIFBvc3QgRGl2aWRlciA9IDB4MTgKKwkJCSAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgxODA5MDQwZik7CiAKKwkJCS8qCisJCQkgKiBWSURfUExMIEZyYWN0aW9uIChyZWdpc3RlciAweDEwYykgPSAweDJiZTJmZQorCQkJICogMjg2MzYzNjAgKiAweGYuMTVmMTdmMC80ID0gMTA4IE1IegorCQkJICogNDMyIE1IeiBwcmUtcG9zdGRpdmlkZQorCQkJICovCiAKLQkJCWlmICghc3RhdGUtPmlzX2N4MjMxeHgpIHsKLQkJCQkvKiBWSURfUExMIGFuZCBBVVhfUExMICovCi0JCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgxODA5MDQwZik7CisJCQkvKgorCQkJICogQVVYX1BMTCBGcmFjdGlvbiA9IDB4MGVjNmJkNgorCQkJICogMjg2MzYzNjMgKiAweDkuNzYzNWViMC8weDE4ID0gNDQxMDAgKiAyNTYKKwkJCSAqIDI3MSBNSHogcHJlLXBvc3RkaXZpZGUKKwkJCSAqIEZJWE1FIDI4NjM2MzYzIHJlZl9mcmVxIGRvZXNuJ3QgbWF0Y2ggVklEIFBMTCByZWYKKwkJCSAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHgwMGVjNmJkNik7CiAKLQkJCQkvKiBBVVhfUExMX0ZSQUMgKi8KLQkJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDAwZWM2YmQ2KTsKLQkJCX0KKwkJCS8qCisJCQkgKiBTQV9NQ0xLX1NFTCA9IDEKKwkJCSAqIFNBX01DTEtfRElWID0gMHgxMCA9IDI1Ni8zODQgKiBBVVhfUExMIHBvc3QgZHZpdmlkZXIKKwkJCSAqLworCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTI3LCAweDUwKTsKIAotCQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJaWYgKGlzX2N4MjU4M3goc3RhdGUpKQogCQkJCWJyZWFrOwogCi0JCQkvKiBzcmMxX2N0bCA9IDB4MDgwMTAwMDAgKi8KKwkJCS8qIHNyYzFfY3RsICovCisJCQkvKiAweDEuNjBjZCA9IDQ0MTAwLzMyMDAwICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGY4LCAweDA4MDE2MGNkKTsKIAotCQkJLyogc3JjMy80LzZfY3RsID0gMHgwODAyMDAwMCAqLworCQkJLyogc3JjMy80LzZfY3RsICovCisJCQkvKiAweDEuNzM4NSA9IDIgKiAoMzIwMDAvNDQxMDApICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTAwLCAweDA4MDE3Mzg1KTsKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDQsIDB4MDgwMTczODUpOwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwYywgMHgwODAxNzM4NSk7CiAJCQlicmVhazsKIAogCQljYXNlIDQ4MDAwOgotCQkJaWYgKCFzdGF0ZS0+aXNfY3gyMzg4NSAmJiAhc3RhdGUtPmlzX2N4MjMxeHgpIHsKLQkJCQkvKiBWSURfUExMIGFuZCBBVVhfUExMICovCi0JCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgxODBhMDQwZik7CisJCQkvKgorCQkJICogVklEX1BMTCBJbnRlZ2VyID0gMHgwZiwgVklEX1BMTCBQb3N0IERpdmlkZXIgPSAweDA0CisJCQkgKiBBVVhfUExMIEludGVnZXIgPSAweDBhLCBBVVggUExMIFBvc3QgRGl2aWRlciA9IDB4MTgKKwkJCSAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgxODBhMDQwZik7CiAKLQkJCQkvKiBBVVhfUExMX0ZSQUMgKi8KLQkJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDAwOThkNmU1KTsKLQkJCX0KKwkJCS8qCisJCQkgKiBWSURfUExMIEZyYWN0aW9uIChyZWdpc3RlciAweDEwYykgPSAweDJiZTJmZQorCQkJICogMjg2MzYzNjAgKiAweGYuMTVmMTdmMC80ID0gMTA4IE1IegorCQkJICogNDMyIE1IeiBwcmUtcG9zdGRpdmlkZQorCQkJICovCiAKLQkJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCS8qCisJCQkgKiBBVVhfUExMIEZyYWN0aW9uID0gMHgwOThkNmU1CisJCQkgKiAyODYzNjM2MyAqIDB4YS40YzZiNzI4LzB4MTggPSA0ODAwMCAqIDI1NgorCQkJICogMjk1IE1IeiBwcmUtcG9zdGRpdmlkZQorCQkJICogRklYTUUgMjg2MzYzNjMgcmVmX2ZyZXEgZG9lc24ndCBtYXRjaCBWSUQgUExMIHJlZgorCQkJICovCisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDAwOThkNmU1KTsKKworCQkJLyoKKwkJCSAqIFNBX01DTEtfU0VMID0gMQorCQkJICogU0FfTUNMS19ESVYgPSAweDEwID0gMjU2LzM4NCAqIEFVWF9QTEwgcG9zdCBkdml2aWRlcgorCQkJICovCisJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMjcsIDB4NTApOworCisJCQlpZiAoaXNfY3gyNTgzeChzdGF0ZSkpCiAJCQkJYnJlYWs7CiAKLQkJCWlmICghc3RhdGUtPmlzX2N4MjM4ODUgJiYgIXN0YXRlLT5pc19jeDIzMXh4KSB7Ci0JCQkJLyogc3JjMV9jdGwgKi8KLQkJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGY4LCAweDA4MDE4MDAwKTsKKwkJCS8qIHNyYzFfY3RsICovCisJCQkvKiAweDEuODAwMCA9IDQ4MDAwLzMyMDAwICovCisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGY4LCAweDA4MDE4MDAwKTsKIAotCQkJCS8qIHNyYzMvNC82X2N0bCAqLwotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDAsIDB4MDgwMTU1NTUpOwotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDQsIDB4MDgwMTU1NTUpOwotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4MDgwMTU1NTUpOwotCQkJfSBlbHNlIHsKLQotCQkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg4ZjgsIDB4MDgwMTg2N2MpOwotCi0JCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHgwODAxNGZhYSk7Ci0JCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwNCwgMHgwODAxNGZhYSk7Ci0JCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwYywgMHgwODAxNGZhYSk7Ci0JCQl9CisJCQkvKiBzcmMzLzQvNl9jdGwgKi8KKwkJCS8qIDB4MS41NTU1ID0gMiAqICgzMjAwMC80ODAwMCkgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDAsIDB4MDgwMTU1NTUpOworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwNCwgMHgwODAxNTU1NSk7CisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTBjLCAweDA4MDE1NTU1KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjA2LDYgKzI5MSwxNDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgY3gyNTgzNl9zZXRfYXVkY2xrX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGZyZXEpCit7CisJcmV0dXJuIGN4MjU4NDBfc2V0X2F1ZGNsa19mcmVxKGNsaWVudCwgZnJlcSk7Cit9CisKK3N0YXRpYyBpbnQgY3gyMzg4NV9zZXRfYXVkY2xrX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGZyZXEpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJaWYgKHN0YXRlLT5hdWRfaW5wdXQgIT0gQ1gyNTg0MF9BVURJT19TRVJJQUwpIHsKKwkJc3dpdGNoIChmcmVxKSB7CisJCWNhc2UgMzIwMDA6CisJCWNhc2UgNDQxMDA6CisJCWNhc2UgNDgwMDA6CisJCQkvKiBXZSBkb24ndCBoYXZlIHJlZ2lzdGVyIHZhbHVlcworCQkJICogc28gYXZvaWQgZGVzdHJveWluZyByZWdpc3RlcnMuICovCisJCQkvKiBGSVhNRSByZXR1cm4gLUVJTlZBTDsgKi8KKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmcmVxKSB7CisJCWNhc2UgMzIwMDA6CisJCWNhc2UgNDQxMDA6CisJCQkvKiBXZSBkb24ndCBoYXZlIHJlZ2lzdGVyIHZhbHVlcworCQkJICogc28gYXZvaWQgZGVzdHJveWluZyByZWdpc3RlcnMuICovCisJCQkvKiBGSVhNRSByZXR1cm4gLUVJTlZBTDsgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgNDgwMDA6CisJCQkvKiBzcmMxX2N0bCAqLworCQkJLyogMHgxLjg2N2MgPSA0ODAwMCAvICgyICogMjg2MzYzNjAvOCAqIDIvNDU1KSAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhmOCwgMHgwODAxODY3Yyk7CisKKwkJCS8qIHNyYzMvNC82X2N0bCAqLworCQkJLyogMHgxLjRmYWEgPSAoNCAqIDI4NjM2MzYwLzggKiAyLzQ1NSkgLyA0ODAwMCAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHgwODAxNGZhYSk7CisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTA0LCAweDA4MDE0ZmFhKTsKKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4MDgwMTRmYWEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzdGF0ZS0+YXVkY2xrX2ZyZXEgPSBmcmVxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyMzF4eF9zZXRfYXVkY2xrX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGZyZXEpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJaWYgKHN0YXRlLT5hdWRfaW5wdXQgIT0gQ1gyNTg0MF9BVURJT19TRVJJQUwpIHsKKwkJc3dpdGNoIChmcmVxKSB7CisJCWNhc2UgMzIwMDA6CisJCQkvKiBzcmMzLzQvNl9jdGwgKi8KKwkJCS8qIDB4MS5mNzdmID0gKDQgKiAyODYzNjM2MC84ICogMi80NTUpIC8gMzIwMDAgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDAsIDB4MDgwMWY3N2YpOworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwNCwgMHgwODAxZjc3Zik7CisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTBjLCAweDA4MDFmNzdmKTsKKwkJCWJyZWFrOworCisJCWNhc2UgNDQxMDA6CisJCQkvKiBzcmMzLzQvNl9jdGwgKi8KKwkJCS8qIDB4MS42ZDU5ID0gKDQgKiAyODYzNjM2MC84ICogMi80NTUpIC8gNDQxMDAgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDAsIDB4MDgwMTZkNTkpOworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwNCwgMHgwODAxNmQ1OSk7CisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTBjLCAweDA4MDE2ZDU5KTsKKwkJCWJyZWFrOworCisJCWNhc2UgNDgwMDA6CisJCQkvKiBzcmMzLzQvNl9jdGwgKi8KKwkJCS8qIDB4MS40ZmFhID0gKDQgKiAyODYzNjM2MC84ICogMi80NTUpIC8gNDgwMDAgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDAsIDB4MDgwMTRmYWEpOworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwNCwgMHgwODAxNGZhYSk7CisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTBjLCAweDA4MDE0ZmFhKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmcmVxKSB7CisJCS8qIEZJWE1FIFRoZXNlIGNhc2VzIG1ha2UgZGlmZmVyZW50IGFzc3VtcHRpb25zIGFib3V0IGF1ZGNsayAqLworCQljYXNlIDMyMDAwOgorCQkJLyogc3JjMV9jdGwgKi8KKwkJCS8qIDB4MS4wMDAwID0gMzIwMDAvMzIwMDAgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg4ZjgsIDB4MDgwMTAwMDApOworCisJCQkvKiBzcmMzLzQvNl9jdGwgKi8KKwkJCS8qIDB4Mi4wMDAwID0gMiAqICgzMjAwMC8zMjAwMCkgKi8KKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDAsIDB4MDgwMjAwMDApOworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwNCwgMHgwODAyMDAwMCk7CisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTBjLCAweDA4MDIwMDAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgNDQxMDA6CisJCQkvKiBzcmMxX2N0bCAqLworCQkJLyogMHgxLjYwY2QgPSA0NDEwMC8zMjAwMCAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhmOCwgMHgwODAxNjBjZCk7CisKKwkJCS8qIHNyYzMvNC82X2N0bCAqLworCQkJLyogMHgxLjczODUgPSAyICogKDMyMDAwLzQ0MTAwKSAqLworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwMCwgMHgwODAxNzM4NSk7CisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTA0LCAweDA4MDE3Mzg1KTsKKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4MDgwMTczODUpOworCQkJYnJlYWs7CisKKwkJY2FzZSA0ODAwMDoKKwkJCS8qIHNyYzFfY3RsICovCisJCQkvKiAweDEuODY3YyA9IDQ4MDAwIC8gKDIgKiAyODYzNjM2MC84ICogMi80NTUpICovCisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGY4LCAweDA4MDE4NjdjKTsKKworCQkJLyogc3JjMy80LzZfY3RsICovCisJCQkvKiAweDEuNGZhYSA9ICg0ICogMjg2MzYzNjAvOCAqIDIvNDU1KSAvIDQ4MDAwICovCisJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTAwLCAweDA4MDE0ZmFhKTsKKwkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDQsIDB4MDgwMTRmYWEpOworCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwYywgMHgwODAxNGZhYSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXN0YXRlLT5hdWRjbGtfZnJlcSA9IGZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfYXVkY2xrX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGZyZXEpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJaWYgKGZyZXEgIT0gMzIwMDAgJiYgZnJlcSAhPSA0NDEwMCAmJiBmcmVxICE9IDQ4MDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpc19jeDIzMXh4KHN0YXRlKSkKKwkJcmV0dXJuIGN4MjMxeHhfc2V0X2F1ZGNsa19mcmVxKGNsaWVudCwgZnJlcSk7CisKKwlpZiAoaXNfY3gyMzg4eChzdGF0ZSkpCisJCXJldHVybiBjeDIzODg1X3NldF9hdWRjbGtfZnJlcShjbGllbnQsIGZyZXEpOworCisJaWYgKGlzX2N4MjU4M3goc3RhdGUpKQorCQlyZXR1cm4gY3gyNTgzNl9zZXRfYXVkY2xrX2ZyZXEoY2xpZW50LCBmcmVxKTsKKworCXJldHVybiBjeDI1ODQwX3NldF9hdWRjbGtfZnJlcShjbGllbnQsIGZyZXEpOworfQorCiB2b2lkIGN4MjU4NDBfYXVkaW9fc2V0X3BhdGgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CkBAIC0yNDMsNyArNDcwLDcgQEAKIAljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAweDAwKTsKIAogCS8qIEVuc3VyZSB0aGUgY29udHJvbGxlciBpcyBydW5uaW5nIHdoZW4gd2UgZXhpdCAqLwotCWlmIChzdGF0ZS0+aXNfY3gyMzg4NSB8fCBzdGF0ZS0+aXNfY3gyMzF4eCkKKwlpZiAoaXNfY3gyMzg4eChzdGF0ZSkgfHwgaXNfY3gyMzF4eChzdGF0ZSkpCiAJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAweDEwKTsKIH0KIApAQCAtMzgzLDcgKzYxMCw3IEBACiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWludCByZXR2YWw7CiAKLQlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KQorCWlmICghaXNfY3gyNTgzeChzdGF0ZSkpCiAJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MTAsIH4weDEsIDEpOwogCWlmIChzdGF0ZS0+YXVkX2lucHV0ICE9IENYMjU4NDBfQVVESU9fU0VSSUFMKSB7CiAJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAwKTsKQEAgLTM5Miw3ICs2MTksNyBAQAogCXJldHZhbCA9IHNldF9hdWRjbGtfZnJlcShjbGllbnQsIGZyZXEpOwogCWlmIChzdGF0ZS0+YXVkX2lucHV0ICE9IENYMjU4NDBfQVVESU9fU0VSSUFMKQogCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODAzLCB+MHgxMCwgMHgxMCk7Ci0JaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikKKwlpZiAoIWlzX2N4MjU4M3goc3RhdGUpKQogCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAwKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCmluZGV4IDFhZWFmMTguLjM4NWVjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKQEAgLTI1OSw2ICsyNTksMTMgQEAKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnE7CiAKKwkvKgorCSAqIENvbWUgb3V0IG9mIGRpZ2l0YWwgcG93ZXIgZG93bgorCSAqIFRoZSBDWDIzODg4LCBhdCBsZWFzdCwgbmVlZHMgdGhpcywgb3RoZXJ3aXNlIHJlZ2lzdGVycyBhc2lkZSBmcm9tCisJICogMHgwLTB4MiBjYW4ndCBiZSByZWFkIG9yIHdyaXR0ZW4uCisJICovCisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MDAwLCAwKTsKKwogCS8qIEludGVybmFsIFJlc2V0ICovCiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDEwMiwgfjB4MDEsIDB4MDEpOwogCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxMDIsIH4weDAxLCAweDAwKTsKQEAgLTI2OSwxOCArMjc2LDQ1IEBACiAJLyogRElGIGluIHJlc2V0PyAqLwogCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDM5OCwgMCk7CiAKLQkvKiBUcnVzdCB0aGUgZGVmYXVsdCB4dGFsLCBubyBkaXZpc2lvbiAqLwotCS8qIFRoaXMgY2hhbmdlcyBmb3IgdGhlIGN4MjM4ODggcHJvZHVjdHMgKi8KKwkvKgorCSAqIFRydXN0IHRoZSBkZWZhdWx0IHh0YWwsIG5vIGRpdmlzaW9uCisJICogJzg4NTogMjguNjM2MzYzLi4uIE1IegorCSAqICc4ODc6IDI1LjAwMDAwMCBNSHoKKwkgKiAnODg4OiA1MC4wMDAwMDAgTUh6CisJICovCiAJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MiwgMHg3Nik7CiAKLQkvKiBCcmluZyBkb3duIHRoZSByZWd1bGF0b3IgZm9yIEFVWCBjbGsgKi8KKwkvKiBQb3dlciB1cCBhbGwgdGhlIFBMTCdzIGFuZCBETEwgKi8KIAljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxLCAweDQwKTsKIAotCS8qIFN5cyBQTEwgZnJhYyAqLwotCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMWMsIDB4MDFkMTc0NGMpOwotCi0JLyogU3lzIFBMTCBpbnQgKi8KLQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTE4LCAweDAwMDAwNDE2KTsKKwkvKiBTeXMgUExMICovCisJc3dpdGNoIChzdGF0ZS0+aWQpIHsKKwljYXNlIFY0TDJfSURFTlRfQ1gyMzg4OF9BVjoKKwkJLyoKKwkJICogNTAuMCBNSHogKiAoMHhiICsgMHhlOGJhMjYvMHgyMDAwMDAwKS80ID0gNSAqIDI4LjYzNjM2MyBNSHoKKwkJICogNTcyLjczIE1IeiBiZWZvcmUgcG9zdCBkaXZpZGUKKwkJICovCisJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMWMsIDB4MDBlOGJhMjYpOworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTE4LCAweDAwMDAwNDBiKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0lERU5UX0NYMjM4ODdfQVY6CisJCS8qCisJCSAqIDI1LjAgTUh6ICogKDB4MTYgKyAweDFkMTc0NGMvMHgyMDAwMDAwKS80ID0gNSAqIDI4LjYzNjM2MyBNSHoKKwkJICogNTcyLjczIE1IeiBiZWZvcmUgcG9zdCBkaXZpZGUKKwkJICovCisJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMWMsIDB4MDFkMTc0NGMpOworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTE4LCAweDAwMDAwNDE2KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0lERU5UX0NYMjM4ODVfQVY6CisJZGVmYXVsdDoKKwkJLyoKKwkJICogMjguNjM2MzYzIE1IeiAqICgweDE0ICsgMHgwLzB4MjAwMDAwMCkvNCA9IDUgKiAyOC42MzYzNjMgTUh6CisJCSAqIDU3Mi43MyBNSHogYmVmb3JlIHBvc3QgZGl2aWRlCisJCSAqLworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTFjLCAweDAwMDAwMDAwKTsKKwkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExOCwgMHgwMDAwMDQxNCk7CisJCWJyZWFrOworCX0KIAogCS8qIERpc2FibGUgRElGIGJ5cGFzcyAqLwogCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgzM2MsIDB4MDAwMDAwMDEpOwpAQCAtMjg4LDExICszMjIsMTUgQEAKIAkvKiBESUYgU3JjIHBoYXNlIGluYyAqLwogCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgzNDAsIDB4MGRmN2RmODMpOwogCi0JLyogVmlkIFBMTCBmcmFjICovCi0JY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwYywgMHgwMWI2ZGI3Yik7Ci0KLQkvKiBWaWQgUExMIGludCAqLwotCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMDgsIDB4MDAwMDA1MTIpOworCS8qCisJICogVmlkIFBMTAorCSAqIFNldHVwIGZvciBhIEJULjY1NiBwaXhlbCBjbG9jayBvZiAxMy41IE1waXhlbHMvc2Vjb25kCisJICoKKwkgKiAyOC42MzYzNjMgTUh6ICogKDB4ZiArIDB4MDJiZTJjOS8weDIwMDAwMDApLzQgPSA4ICogMTMuNSBNSHoKKwkgKiA0MzIuMCBNSHogYmVmb3JlIHBvc3QgZGl2aWRlCisJICovCisJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwYywgMHgwMDJiZTJjOSk7CisJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgwMDAwMDQwZik7CiAKIAkvKiBMdW1hICovCiAJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDQxNCwgMHgwMDEwN2QxMik7CkBAIC0zMDAsMTEgKzMzOCw0MyBAQAogCS8qIENocm9tYSAqLwogCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg0MjAsIDB4M2QwMDgyODIpOwogCi0JLyogQXV4IFBMTCBmcmFjICovCi0JY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExNCwgMHgwMTdkYmY0OCk7Ci0KLQkvKiBBdXggUExMIGludCAqLwotCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTAsIDB4MDAwYTAzMGUpOworCS8qCisJICogQXV4IFBMTAorCSAqIEluaXRpYWwgc2V0dXAgZm9yIGF1ZGlvIHNhbXBsZSBjbG9jazoKKwkgKiA0OCBrc3BzLCAxNiBiaXRzL3NhbXBsZSwgeDE2MCBtdWx0aXBsaWVyID0gMTIyLjg4IE1IegorCSAqIEludGlhbCBJMlMgb3V0cHV0L21hc3RlciBjbG9jayg/KToKKwkgKiA0OCBrc3BzLCAxNiBiaXRzL3NhbXBsZSwgeDE2IG11bHRpcGxpZXIgPSAxMi4yODggTUh6CisJICovCisJc3dpdGNoIChzdGF0ZS0+aWQpIHsKKwljYXNlIFY0TDJfSURFTlRfQ1gyMzg4OF9BVjoKKwkJLyoKKwkJICogNTAuMCBNSHogKiAoMHg3ICsgMHgwYmVkZmE0LzB4MjAwMDAwMCkvMyA9IDEyMi44OCBNSHoKKwkJICogMzY4LjY0IE1IeiBiZWZvcmUgcG9zdCBkaXZpZGUKKwkJICogMTIyLjg4IE1IeiAvIDB4YSA9IDEyLjI4OCBNSHoKKwkJICovCisJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTQsIDB4MDBiZWRmYTQpOworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDAwMGEwMzA3KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0lERU5UX0NYMjM4ODdfQVY6CisJCS8qCisJCSAqIDI1LjAgTUh6ICogKDB4ZSArIDB4MTdkYmY0OC8weDIwMDAwMDApLzMgPSAxMjIuODggTUh6CisJCSAqIDM2OC42NCBNSHogYmVmb3JlIHBvc3QgZGl2aWRlCisJCSAqIDEyMi44OCBNSHogLyAweGEgPSAxMi4yODggTUh6CisJCSAqLworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTE0LCAweDAxN2RiZjQ4KTsKKwkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHgwMDBhMDMwZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9JREVOVF9DWDIzODg1X0FWOgorCWRlZmF1bHQ6CisJCS8qCisJCSAqIDI4LjYzNjM2MyBNSHogKiAoMHhjICsgMHgxYmYwYzllLzB4MjAwMDAwMCkvMyA9IDEyMi44OCBNSHoKKwkJICogMzY4LjY0IE1IeiBiZWZvcmUgcG9zdCBkaXZpZGUKKwkJICogMTIyLjg4IE1IeiAvIDB4YSA9IDEyLjI4OCBNSHoKKwkJICovCisJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTQsIDB4MDFiZjBjOWUpOworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDAwMGEwMzBjKTsKKwkJYnJlYWs7CisJfTsKIAogCS8qIEFEQzIgaW5wdXQgc2VsZWN0ICovCiAJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTAyLCAweDEwKTsKQEAgLTQ5NCw3ICs1NjQsNyBAQAogCX0KIAogCS8qIERFQlVHOiBEaXNwbGF5cyBjb25maWd1cmVkIFBMTCBmcmVxdWVuY3kgKi8KLQlpZiAoIXN0YXRlLT5pc19jeDIzMXh4KSB7CisJaWYgKCFpc19jeDIzMXh4KHN0YXRlKSkgewogCQlwbGxfaW50ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHgxMDgpOwogCQlwbGxfZnJhYyA9IGN4MjU4NDBfcmVhZDQoY2xpZW50LCAweDEwYykgJiAweDFmZmZmZmY7CiAJCXBsbF9wb3N0ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHgxMDkpOwpAQCAtNjE1LDEzICs2ODUsMzAgQEAKIAkJfQogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MDApOwogCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfUEFMKSB7Ci0JCS8qIEZvbGxvdyB0dW5lciBjaGFuZ2UgcHJvY2VkdXJlIGZvciBQQUwgKi8KKwkJLyogQXV0b2RldGVjdCBhdWRpbyBzdGFuZGFyZCBhbmQgYXVkaW8gc3lzdGVtICovCiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwOCwgMHhmZik7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwYiwgMHgxMCk7CisJCS8qIFNpbmNlIHN5c3RlbSBQQUwtTCBpcyBwcmV0dHkgbXVjaCBub24tZXhpc3RhbnQgYW5kCisJCSAgIG5vdCB1c2VkIGJ5IGFueSBwdWJsaWMgYnJvYWRjYXN0IG5ldHdvcmssIGZvcmNlCisJCSAgIDYuNSBNSHogY2FycmllciB0byBiZSBpbnRlcnByZXRlZCBhcyBTeXN0ZW0gREssCisJCSAgIHRoaXMgYXZvaWRzIERLIGF1ZGlvIGRldGVjdGlvbiBpbnN0YWJpbGl0eSAqLworCSAgICAgICBjeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MDApOwogCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKLQkJLyogU2VsZWN0IGF1dG9kZXRlY3QgZm9yIFNFQ0FNICovCisJCS8qIEF1dG9kZXRlY3QgYXVkaW8gc3RhbmRhcmQgYW5kIGF1ZGlvIHN5c3RlbSAqLwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MDgsIDB4ZmYpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MTApOworCQkvKiBJZiBvbmx5IG9uZSBvZiBTRUNBTS1ESyAvIFNFQ0FNLUwgaXMgcmVxdWlyZWQsIHRoZW4gZm9yY2UKKwkJICA2LjVNSHogY2FycmllciwgZWxzZSBhdXRvZGV0ZWN0IGl0ICovCisJCWlmICgoc3RkICYgVjRMMl9TVERfU0VDQU1fREspICYmCisJCSAgICAhKHN0ZCAmIChWNEwyX1NURF9TRUNBTV9MIHwgVjRMMl9TVERfU0VDQU1fTEMpKSkgeworCQkJLyogNi41IE1IeiBjYXJyaWVyIHRvIGJlIGludGVycHJldGVkIGFzIFN5c3RlbSBESyAqLworCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODBiLCAweDAwKTsKKwkgICAgICAgfSBlbHNlIGlmICghKHN0ZCAmIFY0TDJfU1REX1NFQ0FNX0RLKSAmJgorCQkJICAoc3RkICYgKFY0TDJfU1REX1NFQ0FNX0wgfCBWNEwyX1NURF9TRUNBTV9MQykpKSB7CisJCQkvKiA2LjUgTUh6IGNhcnJpZXIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgU3lzdGVtIEwgKi8KKwkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwYiwgMHgwOCk7CisJICAgICAgIH0gZWxzZSB7CisJCQkvKiA2LjUgTUh6IGNhcnJpZXIgdG8gYmUgYXV0b2RldGVjdGVkICovCisJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MTApOworCSAgICAgICB9CiAJfQogCiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgxMCwgfjB4MDEsIDApOwpAQCAtNjMzLDYgKzcyMCwxMCBAQAogCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAl1OCBpc19jb21wb3NpdGUgPSAodmlkX2lucHV0ID49IENYMjU4NDBfQ09NUE9TSVRFMSAmJgogCQkJICAgdmlkX2lucHV0IDw9IENYMjU4NDBfQ09NUE9TSVRFOCk7CisJdTggaXNfY29tcG9uZW50ID0gKHZpZF9pbnB1dCAmIENYMjU4NDBfQ09NUE9ORU5UX09OKSA9PQorCQkJQ1gyNTg0MF9DT01QT05FTlRfT047CisJaW50IGx1bWEgPSB2aWRfaW5wdXQgJiAweGYwOworCWludCBjaHJvbWEgPSB2aWRfaW5wdXQgJiAweGYwMDsKIAl1OCByZWc7CiAKIAl2NGxfZGJnKDEsIGN4MjU4NDBfZGVidWcsIGNsaWVudCwKQEAgLTY0NSwxOCArNzM2LDE0IEBACiAJCXJlZyA9IHZpZF9pbnB1dCAmIDB4ZmY7CiAJCWlmICgodmlkX2lucHV0ICYgQ1gyNTg0MF9TVklERU9fT04pID09IENYMjU4NDBfU1ZJREVPX09OKQogCQkJaXNfY29tcG9zaXRlID0gMDsKLQkJZWxzZQorCQllbHNlIGlmICgodmlkX2lucHV0ICYgQ1gyNTg0MF9DT01QT05FTlRfT04pID09IDApCiAJCQlpc19jb21wb3NpdGUgPSAxOwogCiAJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAibXV4IGNmZyAweCV4IGNvbXA9JWRcbiIsCiAJCQlyZWcsIGlzX2NvbXBvc2l0ZSk7Ci0JfSBlbHNlCi0JaWYgKGlzX2NvbXBvc2l0ZSkgeworCX0gZWxzZSBpZiAoaXNfY29tcG9zaXRlKSB7CiAJCXJlZyA9IDB4ZjAgKyAodmlkX2lucHV0IC0gQ1gyNTg0MF9DT01QT1NJVEUxKTsKIAl9IGVsc2UgewotCQlpbnQgbHVtYSA9IHZpZF9pbnB1dCAmIDB4ZjA7Ci0JCWludCBjaHJvbWEgPSB2aWRfaW5wdXQgJiAweGYwMDsKLQogCQlpZiAoKHZpZF9pbnB1dCAmIH4weGZmMCkgfHwKIAkJICAgIGx1bWEgPCBDWDI1ODQwX1NWSURFT19MVU1BMSB8fCBsdW1hID4gQ1gyNTg0MF9TVklERU9fTFVNQTggfHwKIAkJICAgIGNocm9tYSA8IENYMjU4NDBfU1ZJREVPX0NIUk9NQTQgfHwgY2hyb21hID4gQ1gyNTg0MF9TVklERU9fQ0hST01BOCkgewpAQCAtNjc4LDcgKzc2NSw3IEBACiAJICogY29uZmlndXJhdGlvbiBpbiByZWcgKGZvciB0aGUgY3gyMzg4NSkgc28gd2UgaGF2ZSBubwogCSAqIG5lZWQgdG8gYXR0ZW1wdCB0byBmbGlwIGJpdHMgZm9yIGVhcmxpZXIgYXYgZGVjb2RlcnMuCiAJICovCi0JaWYgKCFzdGF0ZS0+aXNfY3gyMzg4NSAmJiAhc3RhdGUtPmlzX2N4MjMxeHgpIHsKKwlpZiAoIWlzX2N4MjM4OHgoc3RhdGUpICYmICFpc19jeDIzMXh4KHN0YXRlKSkgewogCQlzd2l0Y2ggKGF1ZF9pbnB1dCkgewogCQljYXNlIENYMjU4NDBfQVVESU9fU0VSSUFMOgogCQkJLyogZG8gbm90aGluZywgdXNlIHNlcmlhbCBhdWRpbyBpbnB1dCAqLwpAQCAtNjk4LDEwICs3ODUsMTMgQEAKIAogCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEwMywgcmVnKTsKIAotCS8qIFNldCBJTlBVVF9NT0RFIHRvIENvbXBvc2l0ZSAoMCkgb3IgUy1WaWRlbyAoMSkgKi8KLQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4NDAxLCB+MHg2LCBpc19jb21wb3NpdGUgPyAwIDogMHgwMik7CisJLyogU2V0IElOUFVUX01PREUgdG8gQ29tcG9zaXRlLCBTLVZpZGVvIG9yIENvbXBvbmVudCAqLworCWlmIChpc19jb21wb25lbnQpCisJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg0MDEsIH4weDYsIDB4Nik7CisJZWxzZQorCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4NDAxLCB+MHg2LCBpc19jb21wb3NpdGUgPyAwIDogMHgwMik7CiAKLQlpZiAoIXN0YXRlLT5pc19jeDIzODg1ICYmICFzdGF0ZS0+aXNfY3gyMzF4eCkgeworCWlmICghaXNfY3gyMzg4eChzdGF0ZSkgJiYgIWlzX2N4MjMxeHgoc3RhdGUpKSB7CiAJCS8qIFNldCBDSF9TRUxfQURDMiB0byAxIGlmIGlucHV0IGNvbWVzIGZyb20gQ0gzICovCiAJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxMDIsIH4weDIsIChyZWcgJiAweDgwKSA9PSAwID8gMiA6IDApOwogCQkvKiBTZXQgRFVBTF9NT0RFX0FEQzIgdG8gMSBpZiBpbnB1dCBjb21lcyBmcm9tIGJvdGggQ0gyJkNIMyAqLwpAQCAtNzEwLDIyICs4MDAsMzEgQEAKIAkJZWxzZQogCQkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDEwMiwgfjB4NCwgMCk7CiAJfSBlbHNlIHsKLQkJaWYgKGlzX2NvbXBvc2l0ZSkKKwkJLyogU2V0IERVQUxfTU9ERV9BREMyIHRvIDEgaWYgY29tcG9uZW50Ki8KKwkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDEwMiwgfjB4NCwgaXNfY29tcG9uZW50ID8gMHg0IDogMHgwKTsKKwkJaWYgKGlzX2NvbXBvc2l0ZSkgewogCQkJLyogQURDMiBpbnB1dCBzZWxlY3QgY2hhbm5lbCAyICovCiAJCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTAyLCB+MHgyLCAwKTsKLQkJZWxzZQotCQkJLyogQURDMiBpbnB1dCBzZWxlY3QgY2hhbm5lbCAzICovCi0JCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTAyLCB+MHgyLCAyKTsKKwkJfSBlbHNlIGlmICghaXNfY29tcG9uZW50KSB7CisJCQkvKiBTLVZpZGVvICovCisJCQlpZiAoY2hyb21hID49IENYMjU4NDBfU1ZJREVPX0NIUk9NQTcpIHsKKwkJCQkvKiBBREMyIGlucHV0IHNlbGVjdCBjaGFubmVsIDMgKi8KKwkJCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTAyLCB+MHgyLCAyKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQURDMiBpbnB1dCBzZWxlY3QgY2hhbm5lbCAyICovCisJCQkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDEwMiwgfjB4MiwgMCk7CisJCQl9CisJCX0KIAl9CiAKIAlzdGF0ZS0+dmlkX2lucHV0ID0gdmlkX2lucHV0OwogCXN0YXRlLT5hdWRfaW5wdXQgPSBhdWRfaW5wdXQ7Ci0JaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikgeworCWlmICghaXNfY3gyNTgzeChzdGF0ZSkpIHsKIAkJY3gyNTg0MF9hdWRpb19zZXRfcGF0aChjbGllbnQpOwogCQlpbnB1dF9jaGFuZ2UoY2xpZW50KTsKIAl9CiAKLQlpZiAoc3RhdGUtPmlzX2N4MjM4ODUpIHsKKwlpZiAoaXNfY3gyMzg4eChzdGF0ZSkpIHsKIAkJLyogQXVkaW8gY2hhbm5lbCAxIHNyYyA6IFBhcmFsbGVsIDEgKi8KIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTI0LCAweDAzKTsKIApAQCAtNzQxLDcgKzg0MCw3IEBACiAJCSAqLwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg5MTgsIDB4YTApOwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg5MTksIDB4MDEpOwotCX0gZWxzZSBpZiAoc3RhdGUtPmlzX2N4MjMxeHgpIHsKKwl9IGVsc2UgaWYgKGlzX2N4MjMxeHgoc3RhdGUpKSB7CiAJCS8qIEF1ZGlvIGNoYW5uZWwgMSBzcmMgOiBQYXJhbGxlbCAxICovCiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEyNCwgMHgwMyk7CiAKQEAgLTgwNSw3ICs5MDQsNyBAQAogCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg0MDAsIH4weGYsIGZtdCk7CiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDQwMywgfjB4MywgcGFsX20pOwogCWN4MjU4NDBfc3RkX3NldHVwKGNsaWVudCk7Ci0JaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikKKwlpZiAoIWlzX2N4MjU4M3goc3RhdGUpKQogCQlpbnB1dF9jaGFuZ2UoY2xpZW50KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg2OCw3ICs5NjcsNyBAQAogCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJaWYgKGlzX2N4MjU4M3goc3RhdGUpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBjeDI1ODQwX2F1ZGlvX3NfY3RybChzZCwgY3RybCk7CiAKQEAgLTkwNSw3ICsxMDA0LDcgQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKIAljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCWlmIChpc19jeDI1ODN4KHN0YXRlKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR1cm4gY3gyNTg0MF9hdWRpb19nX2N0cmwoc2QsIGN0cmwpOwogCWRlZmF1bHQ6CkBAIC0xMjA5LDExICsxMzA4LDExIEBACiAJaWYgKCFzdGF0ZS0+aXNfaW5pdGlhbGl6ZWQpIHsKIAkJLyogaW5pdGlhbGl6ZSBhbmQgbG9hZCBmaXJtd2FyZSAqLwogCQlzdGF0ZS0+aXNfaW5pdGlhbGl6ZWQgPSAxOwotCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCWlmIChpc19jeDI1ODN4KHN0YXRlKSkKIAkJCWN4MjU4MzZfaW5pdGlhbGl6ZShjbGllbnQpOwotCQllbHNlIGlmIChzdGF0ZS0+aXNfY3gyMzg4NSkKKwkJZWxzZSBpZiAoaXNfY3gyMzg4eChzdGF0ZSkpCiAJCQljeDIzODg1X2luaXRpYWxpemUoY2xpZW50KTsKLQkJZWxzZSBpZiAoc3RhdGUtPmlzX2N4MjMxeHgpCisJCWVsc2UgaWYgKGlzX2N4MjMxeHgoc3RhdGUpKQogCQkJY3gyMzF4eF9pbml0aWFsaXplKGNsaWVudCk7CiAJCWVsc2UKIAkJCWN4MjU4NDBfaW5pdGlhbGl6ZShjbGllbnQpOwpAQCAtMTI1NiwxNyArMTM1NSwxNyBAQAogCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiJXMgb3V0cHV0XG4iLAogCQkJZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwogCWlmIChlbmFibGUpIHsKLQkJaWYgKHN0YXRlLT5pc19jeDIzODg1IHx8IHN0YXRlLT5pc19jeDIzMXh4KSB7CisJCWlmIChpc19jeDIzODh4KHN0YXRlKSB8fCBpc19jeDIzMXh4KHN0YXRlKSkgewogCQkJdTggdiA9IChjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQyMSkgfCAweDBiKTsKIAkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQyMSwgdik7CiAJCX0gZWxzZSB7CiAJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMTUsCi0JCQkJCXN0YXRlLT5pc19jeDI1ODM2ID8gMHgwYyA6IDB4OGMpOworCQkJCQlpc19jeDI1ODN4KHN0YXRlKSA/IDB4MGMgOiAweDhjKTsKIAkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNiwKLQkJCQkJc3RhdGUtPmlzX2N4MjU4MzYgPyAweDA0IDogMHgwNyk7CisJCQkJCWlzX2N4MjU4M3goc3RhdGUpID8gMHgwNCA6IDB4MDcpOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKHN0YXRlLT5pc19jeDIzODg1IHx8IHN0YXRlLT5pc19jeDIzMXh4KSB7CisJCWlmIChpc19jeDIzODh4KHN0YXRlKSB8fCBpc19jeDIzMXh4KHN0YXRlKSkgewogCQkJdTggdiA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDIxKSAmIH4oMHgwYik7CiAJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MjEsIHYpOwogCQl9IGVsc2UgewpAQCAtMTI5Miw3ICsxMzkxLDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCWlmIChpc19jeDI1ODN4KHN0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzd2l0Y2ggKHFjLT5pZCkgewpAQCAtMTM0Niw3ICsxNDQ1LDcgQEAKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCWlmIChpc19jeDI1ODN4KHN0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIHNldF9pbnB1dChjbGllbnQsIHN0YXRlLT52aWRfaW5wdXQsIGlucHV0KTsKIH0KQEAgLTEzNTYsNyArMTQ1NSw3IEBACiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWlmICghc3RhdGUtPmlzX2N4MjU4MzYpCisJaWYgKCFpc19jeDI1ODN4KHN0YXRlKSkKIAkJaW5wdXRfY2hhbmdlKGNsaWVudCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzczLDcgKzE0NzIsNyBAQAogCQlyZXR1cm4gMDsKIAogCXZ0LT5zaWduYWwgPSB2cHJlcyA/IDB4ZmZmZiA6IDB4MDsKLQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJaWYgKGlzX2N4MjU4M3goc3RhdGUpKQogCQlyZXR1cm4gMDsKIAogCXZ0LT5jYXBhYmlsaXR5IHw9CkBAIC0xNDA0LDcgKzE1MDMsNyBAQAogCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQlpZiAoc3RhdGUtPnJhZGlvIHx8IHN0YXRlLT5pc19jeDI1ODM2KQorCWlmIChzdGF0ZS0+cmFkaW8gfHwgaXNfY3gyNTgzeChzdGF0ZSkpCiAJCXJldHVybiAwOwogCiAJc3dpdGNoICh2dC0+YXVkbW9kZSkgewpAQCAtMTQ0NSwxMSArMTU0NCwxMSBAQAogCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJaWYgKGlzX2N4MjU4M3goc3RhdGUpKQogCQljeDI1ODM2X2luaXRpYWxpemUoY2xpZW50KTsKLQllbHNlIGlmIChzdGF0ZS0+aXNfY3gyMzg4NSkKKwllbHNlIGlmIChpc19jeDIzODh4KHN0YXRlKSkKIAkJY3gyMzg4NV9pbml0aWFsaXplKGNsaWVudCk7Ci0JZWxzZSBpZiAoc3RhdGUtPmlzX2N4MjMxeHgpCisJZWxzZSBpZiAoaXNfY3gyMzF4eChzdGF0ZSkpCiAJCWN4MjMxeHhfaW5pdGlhbGl6ZShjbGllbnQpOwogCWVsc2UKIAkJY3gyNTg0MF9pbml0aWFsaXplKGNsaWVudCk7CkBAIC0xNDcwLDcgKzE1NjksNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAogCWxvZ192aWRlb19zdGF0dXMoY2xpZW50KTsKLQlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KQorCWlmICghaXNfY3gyNTgzeChzdGF0ZSkpCiAJCWxvZ19hdWRpb19zdGF0dXMoY2xpZW50KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MjEsMTIgKzE2MjAsNTAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIHUzMiBnZXRfY3gyMzg4eF9pZGVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXUzMiByZXQ7CisKKwkvKiBDb21lIG91dCBvZiBkaWdpdGFsIHBvd2VyIGRvd24gKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgwMDAsIDApOworCisJLyogRGV0ZWN0aW5nIHdoZXRoZXIgdGhlIHBhcnQgaXMgY3gyMzg4NS83LzggaXMgbW9yZQorCSAqIGRpZmZpY3VsdCB0aGFuIGl0IG5lZWRzIHRvIGJlLiBObyBJRCByZWdpc3Rlci4gSW5zdGVhZCB3ZQorCSAqIHByb2JlIGNlcnRhaW4gcmVnaXN0ZXJzIGluZGljYXRlZCBpbiB0aGUgZGF0YXNoZWV0cyB0byBsb29rCisJICogZm9yIHNwZWNpZmljIGRlZmF1bHRzIHRoYXQgZGlmZmVyIGJldHdlZW4gdGhlIHNpbGljb24gZGVzaWducy4gKi8KKworCS8qIEl0J3MgZWl0aGVyIDg4NS83IGlmIHRoZSBJUiBUeCBDbGsgRGl2aWRlciByZWdpc3RlciBleGlzdHMgKi8KKwlpZiAoY3gyNTg0MF9yZWFkNChjbGllbnQsIDB4MjA0KSAmIDB4ZmZmZikgeworCQkvKiBDWDIzODg1IHJldHVybnMgYm9ndXMgcmVwZXRpdGl2ZSBieXRlIHZhbHVlcyBmb3IgdGhlIERJRiwKKwkJICogd2hpY2ggZG9lc24ndCBleGlzdCBmb3IgaXQuIChFeC4gOGE4YThhOGEgb3IgMzEzMTMxMzEpICovCisJCXJldCA9IGN4MjU4NDBfcmVhZDQoY2xpZW50LCAweDMwMCk7CisJCWlmICgoKHJldCAmIDB4ZmZmZjAwMDApID4+IDE2KSA9PSAocmV0ICYgMHhmZmZmKSkgeworCQkJLyogTm8gRElGICovCisJCQlyZXQgPSBWNEwyX0lERU5UX0NYMjM4ODVfQVY7CisJCX0gZWxzZSB7CisJCQkvKiBDWDIzODg3IGhhcyBhIGJyb2tlbiBESUYsIGJ1dCB0aGUgcmVnaXN0ZXJzCisJCQkgKiBhcHBlYXIgdmFsaWQgKGJ1dCB1bnNlZCksIGdvb2QgZW5vdWdoIHRvIGRldGVjdC4gKi8KKwkJCXJldCA9IFY0TDJfSURFTlRfQ1gyMzg4N19BVjsKKwkJfQorCX0gZWxzZSBpZiAoY3gyNTg0MF9yZWFkNChjbGllbnQsIDB4MzAwKSAmIDB4MGZmZmZmZmYpIHsKKwkJLyogRElGIFBMTCBGcmVxIFdvcmQgcmVnIGV4aXN0czsgY2hpcCBtdXN0IGJlIGEgQ1gyMzg4OCAqLworCQlyZXQgPSBWNEwyX0lERU5UX0NYMjM4ODhfQVY7CisJfSBlbHNlIHsKKwkJdjRsX2VycihjbGllbnQsICJVbmFibGUgdG8gZGV0ZWN0IGgvdywgYXNzdW1pbmcgY3gyMzg4N1xuIik7CisJCXJldCA9IFY0TDJfSURFTlRfQ1gyMzg4N19BVjsKKwl9CisKKwkvKiBCYWNrIGludG8gZGlnaXRhbCBwb3dlciBkb3duICovCisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MDAwLCAyKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGN4MjU4NDBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewogCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZTsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwotCXUzMiBpZDsKKwl1MzIgaWQgPSBWNEwyX0lERU5UX05PTkU7CiAJdTE2IGRldmljZV9pZDsKIAogCS8qIENoZWNrIGlmIHRoZSBhZGFwdGVyIHN1cHBvcnRzIHRoZSBuZWVkZWQgZmVhdHVyZXMgKi8KQEAgLTE1NDMsMTcgKzE2ODAsMjIgQEAKIAkgKiAweDgzIGZvciB0aGUgY3gyNTgzeCBhbmQgMHg4NCBmb3IgdGhlIGN4MjU4NHggKi8KIAlpZiAoKGRldmljZV9pZCAmIDB4ZmYwMCkgPT0gMHg4MzAwKSB7CiAJCWlkID0gVjRMMl9JREVOVF9DWDI1ODM2ICsgKChkZXZpY2VfaWQgPj4gNCkgJiAweGYpIC0gNjsKLQl9Ci0JZWxzZSBpZiAoKGRldmljZV9pZCAmIDB4ZmYwMCkgPT0gMHg4NDAwKSB7CisJfSBlbHNlIGlmICgoZGV2aWNlX2lkICYgMHhmZjAwKSA9PSAweDg0MDApIHsKIAkJaWQgPSBWNEwyX0lERU5UX0NYMjU4NDAgKyAoKGRldmljZV9pZCA+PiA0KSAmIDB4Zik7CiAJfSBlbHNlIGlmIChkZXZpY2VfaWQgPT0gMHgwMDAwKSB7Ci0JCWlkID0gVjRMMl9JREVOVF9DWDI1ODM2ICsgKChkZXZpY2VfaWQgPj4gNCkgJiAweGYpIC0gNjsKLQl9IGVsc2UgaWYgKGRldmljZV9pZCA9PSAweDEzMTMpIHsKLQkJaWQgPSBWNEwyX0lERU5UX0NYMjU4MzYgKyAoKGRldmljZV9pZCA+PiA0KSAmIDB4ZikgLSA2OworCQlpZCA9IGdldF9jeDIzODh4X2lkZW50KGNsaWVudCk7CiAJfSBlbHNlIGlmICgoZGV2aWNlX2lkICYgMHhmZmYwKSA9PSAweDVBMzApIHsKLQkJaWQgPSBWNEwyX0lERU5UX0NYMjU4NDAgKyAoKGRldmljZV9pZCA+PiA0KSAmIDB4Zik7Ci0JfQotCWVsc2UgeworCQkvKiBUaGUgQ1gyMzEwMCAoMHg1QTNDID0gMjMxMDApIGRvZXNuJ3QgaGF2ZSBhbiBBL1YgZGVjb2RlciAqLworCQlpZCA9IFY0TDJfSURFTlRfQ1gyMzEwWF9BVjsKKwl9IGVsc2UgaWYgKChkZXZpY2VfaWQgJiAweGZmKSA9PSAoZGV2aWNlX2lkID4+IDgpKSB7CisJCXY0bF9lcnIoY2xpZW50LAorCQkJImxpa2VseSBhIGNvbmZ1c2VkL3VucmVzcG9uc2l2ZSBjeDIzODhbNTc4XSBBL1YgZGVjb2RlciIKKwkJCSIgZm91bmQgQCAweCV4ICglcylcbiIsCisJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKwkJdjRsX2VycihjbGllbnQsICJBIG1ldGhvZCB0byByZXNldCBpdCBmcm9tIHRoZSBjeDI1ODQwIGRyaXZlciIKKwkJCSIgc29mdHdhcmUgaXMgbm90IGtub3duIGF0IHRoaXMgdGltZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSB7CiAJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiY3gyNTg0MCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xNTY0LDE3ICsxNzA2LDQ1IEBACiAKIAlzZCA9ICZzdGF0ZS0+c2Q7CiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGNsaWVudCwgJmN4MjU4NDBfb3BzKTsKLQkvKiBOb3RlOiByZXZpc2lvbiAnKGRldmljZV9pZCAmIDB4MGYpID09IDInIHdhcyBuZXZlciBidWlsdC4gVGhlCi0JICAgbWFya2luZyBza2lwcyBmcm9tIDB4MSA9PSAyMiB0byAweDMgPT0gMjMuICovCi0JdjRsX2luZm8oY2xpZW50LCAiY3gyNSUzeC0yJXggZm91bmQgQCAweCV4ICglcylcbiIsCi0JCSAgICAoZGV2aWNlX2lkICYgMHhmZmYwKSA+PiA0LAotCQkgICAgKGRldmljZV9pZCAmIDB4MGYpIDwgMyA/IChkZXZpY2VfaWQgJiAweDBmKSArIDEgOiAoZGV2aWNlX2lkICYgMHgwZiksCi0JCSAgICBjbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBWNEwyX0lERU5UX0NYMjM4ODVfQVY6CisJCXY0bF9pbmZvKGNsaWVudCwgImN4MjM4ODUgQS9WIGRlY29kZXIgZm91bmQgQCAweCV4ICglcylcbiIsCisJCQkgY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9JREVOVF9DWDIzODg3X0FWOgorCQl2NGxfaW5mbyhjbGllbnQsICJjeDIzODg3IEEvViBkZWNvZGVyIGZvdW5kIEAgMHgleCAoJXMpXG4iLAorCQkJIGNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfSURFTlRfQ1gyMzg4OF9BVjoKKwkJdjRsX2luZm8oY2xpZW50LCAiY3gyMzg4OCBBL1YgZGVjb2RlciBmb3VuZCBAIDB4JXggKCVzKVxuIiwKKwkJCSBjbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0lERU5UX0NYMjMxMFhfQVY6CisJCXY0bF9pbmZvKGNsaWVudCwgImN4JWQgQS9WIGRlY29kZXIgZm91bmQgQCAweCV4ICglcylcbiIsCisJCQkgZGV2aWNlX2lkLCBjbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0lERU5UX0NYMjU4NDA6CisJY2FzZSBWNEwyX0lERU5UX0NYMjU4NDE6CisJY2FzZSBWNEwyX0lERU5UX0NYMjU4NDI6CisJY2FzZSBWNEwyX0lERU5UX0NYMjU4NDM6CisJCS8qIE5vdGU6IHJldmlzaW9uICcoZGV2aWNlX2lkICYgMHgwZikgPT0gMicgd2FzIG5ldmVyIGJ1aWx0LiBUaGUKKwkJICAgbWFya2luZyBza2lwcyBmcm9tIDB4MSA9PSAyMiB0byAweDMgPT0gMjMuICovCisJCXY0bF9pbmZvKGNsaWVudCwgImN4MjUlM3gtMiV4IGZvdW5kIEAgMHgleCAoJXMpXG4iLAorCQkJIChkZXZpY2VfaWQgJiAweGZmZjApID4+IDQsCisJCQkgKGRldmljZV9pZCAmIDB4MGYpIDwgMyA/IChkZXZpY2VfaWQgJiAweDBmKSArIDEKKwkJCQkJCTogKGRldmljZV9pZCAmIDB4MGYpLAorCQkJIGNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfSURFTlRfQ1gyNTgzNjoKKwljYXNlIFY0TDJfSURFTlRfQ1gyNTgzNzoKKwlkZWZhdWx0OgorCQl2NGxfaW5mbyhjbGllbnQsICJjeDI1JTN4LSV4IGZvdW5kIEAgMHgleCAoJXMpXG4iLAorCQkJIChkZXZpY2VfaWQgJiAweGZmZjApID4+IDQsIGRldmljZV9pZCAmIDB4MGYsCisJCQkgY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisJCWJyZWFrOworCX0KIAogCXN0YXRlLT5jID0gY2xpZW50OwotCXN0YXRlLT5pc19jeDI1ODM2ID0gKChkZXZpY2VfaWQgJiAweGZmMDApID09IDB4ODMwMCk7Ci0Jc3RhdGUtPmlzX2N4MjM4ODUgPSAoZGV2aWNlX2lkID09IDB4MDAwMCkgfHwgKGRldmljZV9pZCA9PSAweDEzMTMpOwotCXN0YXRlLT5pc19jeDIzMXh4ID0gKGRldmljZV9pZCA9PSAweDVhM2UpOwogCXN0YXRlLT52aWRfaW5wdXQgPSBDWDI1ODQwX0NPTVBPU0lURTc7CiAJc3RhdGUtPmF1ZF9pbnB1dCA9IENYMjU4NDBfQVVESU84OwogCXN0YXRlLT5hdWRjbGtfZnJlcSA9IDQ4MDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oCmluZGV4IDgxNGI1NjUuLjU1MzQ1NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAKIC8qIEVOQUJMRV9QVlIxNTBfV09SS0FST1VORCBhY3RpdmF0ZXMgYSB3b3JrYXJvdW5kIGZvciBhIGhhcmR3YXJlIGJ1ZyB0aGF0IGlzCkBAIC00OCw5ICs0OSw2IEBACiAJaW50IHZiaV9saW5lX29mZnNldDsKIAl1MzIgaWQ7CiAJdTMyIHJldjsKLQlpbnQgaXNfY3gyNTgzNjsKLQlpbnQgaXNfY3gyMzg4NTsKLQlpbnQgaXNfY3gyMzF4eDsKIAlpbnQgaXNfaW5pdGlhbGl6ZWQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgZndfd2FpdDsgICAgLyogd2FrZSB1cCB3aGVuIHRoZSBmdyBsb2FkIGlzIGZpbmlzaGVkICovCiAJc3RydWN0IHdvcmtfc3RydWN0IGZ3X3dvcms7ICAgLyogd29yayBlbnRyeSBmb3IgZncgbG9hZCAqLwpAQCAtNjEsNiArNTksMjQgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSwgc2QpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3gyNTgzeChzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5pZCA9PSBWNEwyX0lERU5UX0NYMjU4MzYgfHwKKwkgICAgICAgc3RhdGUtPmlkID09IFY0TDJfSURFTlRfQ1gyNTgzNzsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2N4MjMxeHgoc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBzdGF0ZS0+aWQgPT0gVjRMMl9JREVOVF9DWDIzMTBYX0FWOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3gyMzg4eChzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5pZCA9PSBWNEwyX0lERU5UX0NYMjM4ODVfQVYgfHwKKwkgICAgICAgc3RhdGUtPmlkID09IFY0TDJfSURFTlRfQ1gyMzg4N19BViB8fAorCSAgICAgICBzdGF0ZS0+aWQgPT0gVjRMMl9JREVOVF9DWDIzODg4X0FWOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogY3gyNTg1MC1jb3JlLmMgCQkJCQkJCSAgICovCiBpbnQgY3gyNTg0MF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdTggdmFsdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtZmlybXdhcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWZpcm13YXJlLmMKaW5kZXggMWY0ODNjMS4uODE1MDIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtZmlybXdhcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1maXJtd2FyZS5jCkBAIC02Nyw5ICs2Nyw5IEBACiAKIAlpZiAoZmlybXdhcmVbMF0pCiAJCXJldHVybiBmaXJtd2FyZTsKLQlpZiAoc3RhdGUtPmlzX2N4MjM4ODUpCisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpKQogCQlyZXR1cm4gInY0bC1jeDIzODg1LWF2Y29yZS0wMS5mdyI7Ci0JaWYgKHN0YXRlLT5pc19jeDIzMXh4KQorCWlmIChpc19jeDIzMXh4KHN0YXRlKSkKIAkJcmV0dXJuICJ2NGwtY3gyMzF4eC1hdmNvcmUtMDEuZnciOwogCXJldHVybiAidjRsLWN4MjU4NDAuZnciOwogfQpAQCAtMTEyLDEzICsxMTIsMTMgQEAKIAlpbnQgTUFYX0JVRl9TSVpFID0gRldTRU5EOwogCXUzMiBncGlvX29lID0gMCwgZ3Bpb19kYSA9IDA7CiAKLQlpZiAoc3RhdGUtPmlzX2N4MjM4ODUpIHsKKwlpZiAoaXNfY3gyMzg4eChzdGF0ZSkpIHsKIAkJLyogUHJlc2VydmUgdGhlIEdQSU8gT0UgYW5kIG91dHB1dCBiaXRzICovCiAJCWdwaW9fb2UgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDE2MCk7CiAJCWdwaW9fZGEgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDE2NCk7CiAJfQogCi0JaWYgKChzdGF0ZS0+aXNfY3gyMzF4eCkgJiYgTUFYX0JVRl9TSVpFID4gMTYpIHsKKwlpZiAoaXNfY3gyMzF4eChzdGF0ZSkgJiYgTUFYX0JVRl9TSVpFID4gMTYpIHsKIAkJdjRsX2VycihjbGllbnQsICIgRmlybXdhcmUgZG93bmxvYWQgc2l6ZSBjaGFuZ2VkIHRvIDE2IGJ5dGVzIG1heCBsZW5ndGhcbiIpOwogCQlNQVhfQlVGX1NJWkUgPSAxNjsgIC8qIGN4MjMxeHggY2Fubm90IGFjY2VwdCBtb3JlIHRoYW4gMTYgYnl0ZXMgYXQgYSB0aW1lICovCiAJfQpAQCAtMTU2LDcgKzE1Niw3IEBACiAJc2l6ZSA9IGZ3LT5zaXplOwogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCi0JaWYgKHN0YXRlLT5pc19jeDIzODg1KSB7CisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpKSB7CiAJCS8qIFJlc3RvcmUgR1BJTyBjb25maWd1cmF0aW9uIGFmdGVyIGYvdyBsb2FkICovCiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDE2MCwgZ3Bpb19vZSk7CiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDE2NCwgZ3Bpb19kYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCmluZGV4IDQ5OTUyOTguLmM3ZTU4NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCkBAIC02MSw2ICs2MSw4IEBACiAJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFYwMjg4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVEI2MDAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVFYwOTAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVEI2MTAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1NJTVBMRSBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQi9BVFNDIGNhcmRzIGJhc2VkIG9uIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKaW5kZXggMzNiZTYzNi4uZDg0NGYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCkBAIC0yMDc1LDYgKzIwNzUsMTggQEAKIAkJfSwKIAkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKIAl9LAorCVtDWDg4X0JPQVJEX1BST0ZfNzMwMV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJQcm9mIDczMDEgRFZCLVMvUzIiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkJLnR5cGUgICA9IENYODhfVk1VWF9EVkIsCisJCQkudm11eCAgID0gMCwKKwkJfSB9LAorCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAorCX0sCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI1MzUsNiArMjU0NywxMCBAQAogCQkuc3VidmVuZG9yID0gMHgxMDdkLAogCQkuc3ViZGV2aWNlID0gMHg2NjE4LAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9XSU5GQVNUX1RWMjAwMF9YUF9HTE9CQUwsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHhiMDM0LAorCQkuc3ViZGV2aWNlID0gMHgzMDM0LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9QUk9GXzczMDEsCiAJfSwKIH07CiAKQEAgLTMyMTEsNiArMzIyNyw3IEBACiAJY2FzZSAgQ1g4OF9CT0FSRF9UQlNfODkyMDoKIAljYXNlICBDWDg4X0JPQVJEX1BST0ZfNjIwMDoKIAljYXNlICBDWDg4X0JPQVJEX1BST0ZfNzMwMDoKKwljYXNlICBDWDg4X0JPQVJEX1BST0ZfNzMwMToKIAljYXNlICBDWDg4X0JPQVJEX1NBVFRSQURFX1NUNDIwMDoKIAkJY3hfd3JpdGUoTU9fR1AwX0lPLCAweDgwMDApOwogCQltc2xlZXAoMTAwKTsKQEAgLTMyNjcsNyArMzI4NCw3IEBACiAJCQkgICAgY3RsLmZuYW1lKTsKIAkJY2FsbF9hbGwoY29yZSwgdHVuZXIsIHNfY29uZmlnLCAmeGMyMDI4X2NmZyk7CiAJfQotCWNhbGxfYWxsKGNvcmUsIHR1bmVyLCBzX3N0YW5kYnkpOworCWNhbGxfYWxsKGNvcmUsIGNvcmUsIHNfcG93ZXIsIDApOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwppbmRleCBjZjYzNDYwLi5iMzU0MTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCkBAIC02MjQsNyArNjI0LDcgQEAKIAkvKiBzZXR1cCBpbWFnZSBmb3JtYXQgKi8KIAljeF9hbmRvcihNT19DT0xPUl9DVFJMLCAweDQwMDAsIDB4NDAwMCk7CiAKLQkvKiBzZXR1cCBGSUZPIFRocmVzaGhvbGRzICovCisJLyogc2V0dXAgRklGTyBUaHJlc2hvbGRzICovCiAJY3hfd3JpdGUoTU9fUERNQV9TVEhSU0gsICAgMHgwODA3KTsKIAljeF93cml0ZShNT19QRE1BX0RUSFJTSCwgICAweDA4MDcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IDUxOGJjZmUuLmIxNDI5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC01Myw2ICs1Myw5IEBACiAjaW5jbHVkZSAic3R2MDI4OC5oIgogI2luY2x1ZGUgInN0YjYwMDAuaCIKICNpbmNsdWRlICJjeDI0MTE2LmgiCisjaW5jbHVkZSAic3R2MDkwMC5oIgorI2luY2x1ZGUgInN0YjYxMDAuaCIKKyNpbmNsdWRlICJzdGI2MTAwX3Byb2MuaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgRFZCIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiIpOwpAQCAtNTczLDYgKzU3NiwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN0djA5MDBfc2V0X3RzX3BhcmFtKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCWludCBpc19wdW5jdHVyZWQpCit7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJZGV2LT50c19nZW5fY250cmwgPSAwOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY3gyNDExNl9yZXNldF9kZXZpY2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CkBAIC02MDEsNiArNjEzLDIzIEBACiAJLnJlc2V0X2RldmljZSAgPSBjeDI0MTE2X3Jlc2V0X2RldmljZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDkwMF9jb25maWcgcHJvZl83MzAxX3N0djA5MDBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2YSwKKy8qCWRlbW9kX21vZGUgPSAwLCovCisJLnh0YWwgPSAyNzAwMDAwMCwKKwkuY2xrbW9kZSA9IDMsLyogMC1DTEtJLCAyLVhUQUxJLCBlbHNlIEFVVE8gKi8KKwkuZGlzZXFjX21vZGUgPSAyLC8qIDIvMyBQV00gKi8KKwkudHVuMV9tYWRkcmVzcyA9IDAsLyogMHg2MCAqLworCS50dW4xX2FkYyA9IDAsLyogMiBWcHAgKi8KKwkucGF0aDFfbW9kZSA9IDMsCisJLnNldF90c19wYXJhbXMgPSBzdHYwOTAwX3NldF90c19wYXJhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RiNjEwMF9jb25maWcgcHJvZl83MzAxX3N0YjYxMDBfY29uZmlnID0geworCS50dW5lcl9hZGRyZXNzID0gMHg2MCwKKwkucmVmY2xvY2sgPSAyNzAwMDAwMCwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcgdGV2aWlfdHVuZXJfc2hhcnBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKIAkuaW5pdHRhYiA9IHNoYXJwX3owMTk0YV9pbml0dGFiLApAQCAtMTE0OSw2ICsxMTc4LDMxIEBACiAJCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX1BST0ZfNzMwMTp7CisJCXN0cnVjdCBkdmJfdHVuZXJfb3BzICp0dW5lcl9vcHMgPSBOVUxMOworCisJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChzdHYwOTAwX2F0dGFjaCwKKwkJCQkJCSZwcm9mXzczMDFfc3R2MDkwMF9jb25maWcsCisJCQkJCQkmY29yZS0+aTJjX2FkYXAsIDApOworCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJaWYgKCFkdmJfYXR0YWNoKHN0YjYxMDBfYXR0YWNoLCBmZTAtPmR2Yi5mcm9udGVuZCwKKwkJCQkJJnByb2ZfNzMwMV9zdGI2MTAwX2NvbmZpZywKKwkJCQkJJmNvcmUtPmkyY19hZGFwKSkKKwkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKKworCQkJdHVuZXJfb3BzID0gJmZlMC0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzOworCQkJdHVuZXJfb3BzLT5zZXRfZnJlcXVlbmN5ID0gc3RiNjEwMF9zZXRfZnJlcTsKKwkJCXR1bmVyX29wcy0+Z2V0X2ZyZXF1ZW5jeSA9IHN0YjYxMDBfZ2V0X2ZyZXE7CisJCQl0dW5lcl9vcHMtPnNldF9iYW5kd2lkdGggPSBzdGI2MTAwX3NldF9iYW5kdzsKKwkJCXR1bmVyX29wcy0+Z2V0X2JhbmR3aWR0aCA9IHN0YjYxMDBfZ2V0X2JhbmR3OworCisJCQljb3JlLT5wcmV2X3NldF92b2x0YWdlID0KKwkJCQkJZmUwLT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfdm9sdGFnZTsKKwkJCWZlMC0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPQorCQkJCQl0ZXZpaV9kdmJzX3NldF92b2x0YWdlOworCQl9CisJCWJyZWFrOworCQl9CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSICIlcy8yOiBUaGUgZnJvbnRlbmQgb2YgeW91ciBEVkIvQVRTQyBjYXJkIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIsCiAJCSAgICAgICBjb3JlLT5uYW1lKTsKQEAgLTExNzAsMTEgKzEyMjQsMTEgQEAKIAkJZmUxLT5kdmIuZnJvbnRlbmQtPm9wcy50c19idXNfY3RybCA9IGN4ODhfZHZiX2J1c19jdHJsOwogCiAJLyogUHV0IHRoZSBhbmFsb2cgZGVjb2RlciBpbiBzdGFuZGJ5IHRvIGtlZXAgaXQgcXVpZXQgKi8KLQljYWxsX2FsbChjb3JlLCB0dW5lciwgc19zdGFuZGJ5KTsKKwljYWxsX2FsbChjb3JlLCBjb3JlLCBzX3Bvd2VyLCAwKTsKIAogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KIAlyZXR1cm4gdmlkZW9idWZfZHZiX3JlZ2lzdGVyX2J1cygmZGV2LT5mcm9udGVuZHMsIFRISVNfTU9EVUxFLCBkZXYsCi0JCSZkZXYtPnBjaS0+ZGV2LCBhZGFwdGVyX25yLCBtZmVfc2hhcmVkKTsKKwkJCQkJICZkZXYtPnBjaS0+ZGV2LCBhZGFwdGVyX25yLCBtZmVfc2hhcmVkLCBOVUxMKTsKIAogZnJvbnRlbmRfZGV0YWNoOgogCWNvcmUtPmdhdGVfY3RybCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwppbmRleCA3OGIzNjM1Li45MmI4Y2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKQEAgLTExOCwxMyArMTE4LDEzIEBACiAKIAkJZGF0YSA9IChkYXRhIDw8IDQpIHwgKChncGlvX2tleSAmIDB4ZjApID4+IDQpOwogCi0JCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGRhdGEpOwogCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOwogCiAJfSBlbHNlIGlmIChpci0+bWFza19rZXlkb3duKSB7CiAJCS8qIGJpdCBzZXQgb24ga2V5ZG93biAqLwogCQlpZiAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pIHsKLQkJCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBkYXRhKTsKIAkJfSBlbHNlIHsKIAkJCWlyX2lucHV0X25va2V5KGlyLT5pbnB1dCwgJmlyLT5pcik7CiAJCX0KQEAgLTEzMiwxNCArMTMyLDE0IEBACiAJfSBlbHNlIGlmIChpci0+bWFza19rZXl1cCkgewogCQkvKiBiaXQgY2xlYXJlZCBvbiBrZXlkb3duICovCiAJCWlmICgwID09IChncGlvICYgaXItPm1hc2tfa2V5dXApKSB7Ci0JCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSwgZGF0YSk7CisJCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOwogCQl9CiAKIAl9IGVsc2UgewogCQkvKiBjYW4ndCBkaXN0aW5ndWlzaCBrZXlkb3duL3VwIDotLyAqLwotCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSwgZGF0YSk7CisJCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBkYXRhKTsKIAkJaXJfaW5wdXRfbm9rZXkoaXItPmlucHV0LCAmaXItPmlyKTsKIAl9CiB9CkBAIC0zMDMsNiArMzAzLDIzIEBACiAJCWlyLT5tYXNrX2tleWRvd24gPSAweDAyOwogCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8qIG1zICovCiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9PTUlDT01fU1M0X1BDSToKKwljYXNlIENYODhfQk9BUkRfU0FUVFJBREVfU1Q0MjAwOgorCWNhc2UgQ1g4OF9CT0FSRF9UQlNfODkyMDoKKwljYXNlIENYODhfQk9BUkRfVEJTXzg5MTA6CisJY2FzZSBDWDg4X0JPQVJEX1BST0ZfNzMwMDoKKwljYXNlIENYODhfQk9BUkRfUFJPRl83MzAxOgorCWNhc2UgQ1g4OF9CT0FSRF9QUk9GXzYyMDA6CisJCWlyX2NvZGVzID0gJmlyX2NvZGVzX3Ric19uZWNfdGFibGU7CisJCWlyX3R5cGUgPSBJUl9UWVBFX1BEOworCQlpci0+c2FtcGxpbmcgPSAweGZmMDA7IC8qIGFkZHJlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX1RFVklJX1M0NjA6CisJY2FzZSBDWDg4X0JPQVJEX1RFVklJX1M0MjA6CisJCWlyX2NvZGVzID0gJmlyX2NvZGVzX3RldmlpX25lY190YWJsZTsKKwkJaXJfdHlwZSA9IElSX1RZUEVfUEQ7CisJCWlyLT5zYW1wbGluZyA9IDB4ZmYwMDsgLyogYWRkcmVzcyAqLworCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UX1BSTzoKIAkJaXJfY29kZXMgICAgICAgICA9ICZpcl9jb2Rlc19kbnR2X2xpdmVfZHZidF9wcm9fdGFibGU7CiAJCWlyX3R5cGUgICAgICAgICAgPSBJUl9UWVBFX1BEOwpAQCAtMzQzLDcgKzM2MCwxMCBAQAogCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAiY3g4OCBJUiAoJXMpIiwgY29yZS0+Ym9hcmQubmFtZSk7CiAJc25wcmludGYoaXItPnBoeXMsIHNpemVvZihpci0+cGh5cyksICJwY2ktJXMvaXIwIiwgcGNpX25hbWUocGNpKSk7CiAKLQlpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgaXJfdHlwZSwgaXJfY29kZXMpOworCWVyciA9IGlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBpcl90eXBlLCBpcl9jb2Rlcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX291dF9mcmVlOworCiAJaW5wdXRfZGV2LT5uYW1lID0gaXItPm5hbWU7CiAJaW5wdXRfZGV2LT5waHlzID0gaXItPnBoeXM7CiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BDSTsKQEAgLTM3Myw2ICszOTMsNyBAQAogCWN4ODhfaXJfc3RvcChjb3JlLCBpcik7CiAJY29yZS0+aXIgPSBOVUxMOwogIGVycl9vdXRfZnJlZToKKwlpcl9pbnB1dF9mcmVlKGlucHV0X2Rldik7CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShpcik7CiAJcmV0dXJuIGVycjsKQEAgLTM4Nyw2ICs0MDgsNyBAQAogCQlyZXR1cm4gMDsKIAogCWN4ODhfaXJfc3RvcChjb3JlLCBpcik7CisJaXJfaW5wdXRfZnJlZShpci0+aW5wdXQpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlyLT5pbnB1dCk7CiAJa2ZyZWUoaXIpOwogCkBAIC00MzIsOCArNDU0LDE3IEBACiAKIAkvKiBkZWNvZGUgaXQgKi8KIAlzd2l0Y2ggKGNvcmUtPmJvYXJkbnIpIHsKKwljYXNlIENYODhfQk9BUkRfVEVWSUlfUzQ2MDoKKwljYXNlIENYODhfQk9BUkRfVEVWSUlfUzQyMDoKIAljYXNlIENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMToKIAljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UX1BSTzoKKwljYXNlIENYODhfQk9BUkRfT01JQ09NX1NTNF9QQ0k6CisJY2FzZSBDWDg4X0JPQVJEX1NBVFRSQURFX1NUNDIwMDoKKwljYXNlIENYODhfQk9BUkRfVEJTXzg5MjA6CisJY2FzZSBDWDg4X0JPQVJEX1RCU184OTEwOgorCWNhc2UgQ1g4OF9CT0FSRF9QUk9GXzczMDA6CisJY2FzZSBDWDg4X0JPQVJEX1BST0ZfNzMwMToKKwljYXNlIENYODhfQk9BUkRfUFJPRl82MjAwOgogCQlpcmNvZGUgPSBpcl9kZWNvZGVfcHVsc2VkaXN0YW5jZShpci0+c2FtcGxlcywgaXItPnNjb3VudCwgMSwgNCk7CiAKIAkJaWYgKGlyY29kZSA9PSAweGZmZmZmZmZmKSB7IC8qIGRlY29kaW5nIGVycm9yICovCkBAIC00NjEsNyArNDkyLDcgQEAKIAogCQlpcl9kcHJpbnRrKCJLZXkgQ29kZTogJXhcbiIsIChpcmNvZGUgPj4gMTYpICYgMHg3Zik7CiAKLQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIChpcmNvZGUgPj4gMTYpICYgMHg3ZiwgKGlyY29kZSA+PiAxNikgJiAweGZmKTsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIChpcmNvZGUgPj4gMTYpICYgMHg3Zik7CiAJCWlyLT5yZWxlYXNlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTIwKTsKIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRToKQEAgLTQ5OCw3ICs1MjksNyBAQAogCQlpZiAoIGRldiAhPSAweDFlICYmIGRldiAhPSAweDFmICkKIAkJCS8qIG5vdCBhIGhhdXBwYXVnZSByZW1vdGUgKi8KIAkJCWJyZWFrOwotCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgY29kZSwgaXJjb2RlKTsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGNvZGUpOwogCQlpci0+cmVsZWFzZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMCk7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9QSU5OQUNMRV9QQ1RWX0hEXzgwMGk6CkBAIC01MDYsNyArNTM3LDcgQEAKIAkJaXJfZHByaW50aygiYmlwaGFzZSBkZWNvZGVkOiAleFxuIiwgaXJjb2RlKTsKIAkJaWYgKChpcmNvZGUgJiAweGZmZmZmMDAwKSAhPSAweDMwMDApCiAJCQlicmVhazsKLQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGlyY29kZSAmIDB4M2YsIGlyY29kZSk7CisJCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBpcmNvZGUgJiAweDNmKTsKIAkJaXItPnJlbGVhc2UgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMjApOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCA1N2U2YjEyLi5kN2U4ZmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTkzNSw3ICs5MzUsNyBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5jb3JlLT5sb2NrKTsKIAlpZihhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPmNvcmUtPnVzZXJzKSkKLQkJY2FsbF9hbGwoZGV2LT5jb3JlLCB0dW5lciwgc19zdGFuZGJ5KTsKKwkJY2FsbF9hbGwoZGV2LT5jb3JlLCBjb3JlLCBzX3Bvd2VyLCAwKTsKIAltdXRleF91bmxvY2soJmRldi0+Y29yZS0+bG9jayk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGQ1Y2VhNDEuLmUxYzUyMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtMjM4LDYgKzIzOCw3IEBACiAjZGVmaW5lIENYODhfQk9BUkRfSEFVUFBBVUdFX0lST05MWSAgICAgICAgODAKICNkZWZpbmUgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIICAgICAgICA4MQogI2RlZmluZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfSiAgICAgIDgyCisjZGVmaW5lIENYODhfQk9BUkRfUFJPRl83MzAxICAgICAgICAgICAgICAgODMKIAogZW51bSBjeDg4X2l0eXBlIHsKIAlDWDg4X1ZNVVhfQ09NUE9TSVRFMSA9IDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvZG0zNTVfY2NkYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtMzU1X2NjZGMuYwppbmRleCA0NjI5Y2FiLi4zMTQzOTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvZG0zNTVfY2NkYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTM1NV9jY2RjLmMKQEAgLTI4NSw3ICsyODUsNyBAQAogCiAJaWYgKChjY2RjcGFyYW0tPm1lZF9maWx0X3RocmVzIDwgMCkgfHwKIAkgICAoY2NkY3BhcmFtLT5tZWRfZmlsdF90aHJlcyA+IENDRENfTUVEX0ZJTFRfVEhSRVNIKSkgewotCQlkZXZfZGJnKGRldiwgIkludmFsaWQgdmFsdWUgb2YgbWVkaWFuIGZpbHRlciB0aHJlc29sZFxuIik7CisJCWRldl9kYmcoZGV2LCAiSW52YWxpZCB2YWx1ZSBvZiBtZWRpYW4gZmlsdGVyIHRocmVzaG9sZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTU5LDcgKzk1OSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgZG0zNTVfY2NkY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkbTM1NV9jY2RjX2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9OT1RJQ0UgImRtMzU1X2NjZGNfaW5pdFxuIik7CiAJaWYgKHZwZmVfcmVnaXN0ZXJfY2NkY19kZXZpY2UoJmNjZGNfaHdfZGV2KSA8IDApCkBAIC05NjksNyArOTY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZG0zNTVfY2NkY19leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZG0zNTVfY2NkY19leGl0KHZvaWQpCiB7CiAJdnBmZV91bnJlZ2lzdGVyX2NjZGNfZGV2aWNlKCZjY2RjX2h3X2Rldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvZG02NDR4X2NjZGMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTY0NHhfY2NkYy5jCmluZGV4IDJmMTlhOTEuLmQ1ZmExOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTY0NHhfY2NkYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTY0NHhfY2NkYy5jCkBAIC04NTksNyArODU5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBkbTY0NHhfY2NkY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkbTY0NHhfY2NkY19pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJkbTY0NHhfY2NkY19pbml0XG4iKTsKIAlpZiAodnBmZV9yZWdpc3Rlcl9jY2RjX2RldmljZSgmY2NkY19od19kZXYpIDwgMCkKQEAgLTg2OSw3ICs4NjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkbTY0NHhfY2NkY19leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZG02NDR4X2NjZGNfZXhpdCh2b2lkKQogewogCXZwZmVfdW5yZWdpc3Rlcl9jY2RjX2RldmljZSgmY2NkY19od19kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwZmVfY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwZmVfY2FwdHVyZS5jCmluZGV4IDQwMmNlNDMuLjEyYTFiM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGZlX2NhcHR1cmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBmZV9jYXB0dXJlLmMKQEAgLTY2MCw3ICs2NjAsNyBAQAogCiAJZnJhbWVfZm9ybWF0ID0gY2NkY19kZXYtPmh3X29wcy5nZXRfZnJhbWVfZm9ybWF0KCk7CiAJaWYgKGZyYW1lX2Zvcm1hdCA9PSBDQ0RDX0ZSTUZNVF9QUk9HUkVTU0lWRSkKLQkJZnJlZV9pcnEoSVJRX1ZESU5UMSwgdnBmZV9kZXYpOworCQlmcmVlX2lycSh2cGZlX2Rldi0+Y2NkY19pcnExLCB2cGZlX2Rldik7CiB9CiAKIHN0YXRpYyBpbnQgdnBmZV9hdHRhY2hfaXJxKHN0cnVjdCB2cGZlX2RldmljZSAqdnBmZV9kZXYpCkBAIC0xMzM4LDcgKzEzMzgsNyBAQAogCXZwZmVfZGV2LT5tZW1vcnkgPSByZXFfYnVmLT5tZW1vcnk7CiAJdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KCZ2cGZlX2Rldi0+YnVmZmVyX3F1ZXVlLAogCQkJCSZ2cGZlX3ZpZGVvYnVmX3FvcHMsCi0JCQkJTlVMTCwKKwkJCQl2cGZlX2Rldi0+cGRldiwKIAkJCQkmdnBmZV9kZXYtPmlycWxvY2ssCiAJCQkJcmVxX2J1Zi0+dHlwZSwKIAkJCQl2cGZlX2Rldi0+Zm10LmZtdC5waXguZmllbGQsCkBAIC0xNDEzLDYgKzE0MTMsNDEgQEAKIAkJCQkgICAgICBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIH0KIAorc3RhdGljIGludCB2cGZlX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKK3sKKwlzdHJ1Y3QgdnBmZV9kZXZpY2UgKnZwZmVfZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdnBmZV9zdWJkZXZfaW5mbyAqc2RpbmZvOworCisJc2RpbmZvID0gdnBmZV9kZXYtPmN1cnJlbnRfc3ViZGV2OworCisJcmV0dXJuIHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKCZ2cGZlX2Rldi0+djRsMl9kZXYsIHNkaW5mby0+Z3JwX2lkLAorCQkJCQkgY29yZSwgcXVlcnljdHJsLCBxY3RybCk7CisKK30KKworc3RhdGljIGludCB2cGZlX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdnBmZV9kZXZpY2UgKnZwZmVfZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdnBmZV9zdWJkZXZfaW5mbyAqc2RpbmZvOworCisJc2RpbmZvID0gdnBmZV9kZXYtPmN1cnJlbnRfc3ViZGV2OworCisJcmV0dXJuIHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKCZ2cGZlX2Rldi0+djRsMl9kZXYsIHNkaW5mby0+Z3JwX2lkLAorCQkJCQkgY29yZSwgZ19jdHJsLCBjdHJsKTsKK30KKworc3RhdGljIGludCB2cGZlX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdnBmZV9kZXZpY2UgKnZwZmVfZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdnBmZV9zdWJkZXZfaW5mbyAqc2RpbmZvOworCisJc2RpbmZvID0gdnBmZV9kZXYtPmN1cnJlbnRfc3ViZGV2OworCisJcmV0dXJuIHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKCZ2cGZlX2Rldi0+djRsMl9kZXYsIHNkaW5mby0+Z3JwX2lkLAorCQkJCQkgY29yZSwgc19jdHJsLCBjdHJsKTsKK30KKwogLyoKICAqIHZwZmVfY2FsY3VsYXRlX29mZnNldHMgOiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYnVmZmVycyBvZmZzZXQKICAqIGZvciB0b3AgYW5kIGJvdHRvbSBmaWVsZApAQCAtMTU3Nyw3ICsxNjEyLDcgQEAKIAogCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBmZV9kZXYtPnY0bDJfZGV2LCAidnBmZV9jcm9wY2FwXG4iKTsKIAotCWlmICh2cGZlX2Rldi0+c3RkX2luZGV4ID4gQVJSQVlfU0laRSh2cGZlX3N0YW5kYXJkcykpCisJaWYgKHZwZmVfZGV2LT5zdGRfaW5kZXggPj0gQVJSQVlfU0laRSh2cGZlX3N0YW5kYXJkcykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWVtc2V0KGNyb3AsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9jcm9wY2FwKSk7CkBAIC0xNzEwLDYgKzE3NDUsOSBAQAogCS52aWRpb2NfcXVlcnlzdGQJID0gdnBmZV9xdWVyeXN0ZCwKIAkudmlkaW9jX3Nfc3RkCQkgPSB2cGZlX3Nfc3RkLAogCS52aWRpb2NfZ19zdGQJCSA9IHZwZmVfZ19zdGQsCisJLnZpZGlvY19xdWVyeWN0cmwJID0gdnBmZV9xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwJCSA9IHZwZmVfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsCQkgPSB2cGZlX3NfY3RybCwKIAkudmlkaW9jX3JlcWJ1ZnMJCSA9IHZwZmVfcmVxYnVmcywKIAkudmlkaW9jX3F1ZXJ5YnVmCSA9IHZwZmVfcXVlcnlidWYsCiAJLnZpZGlvY19xYnVmCQkgPSB2cGZlX3FidWYsCkBAIC0xOTc4LDggKzIwMTYsNyBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHZwZmVfZGV2KTsKIAkvKiBzZXQgZHJpdmVyIHByaXZhdGUgZGF0YSAqLwogCXZpZGVvX3NldF9kcnZkYXRhKHZwZmVfZGV2LT52aWRlb19kZXYsIHZwZmVfZGV2KTsKLQlpMmNfYWRhcCA9IGkyY19nZXRfYWRhcHRlcigxKTsKLQl2cGZlX2NmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWkyY19hZGFwID0gaTJjX2dldF9hZGFwdGVyKHZwZmVfY2ZnLT5pMmNfYWRhcHRlcl9pZCk7CiAJbnVtX3N1YmRldnMgPSB2cGZlX2NmZy0+bnVtX3N1YmRldnM7CiAJdnBmZV9kZXYtPnNkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfc3ViZGV2ICopICogbnVtX3N1YmRldnMsCiAJCQkJR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBzcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3Zwc3MuYwppbmRleCA2ZDcwOWNhLi40NTMyMzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBzcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cHNzLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAlpbnQgKCplbmFibGVfY2xvY2spKGVudW0gdnBzc19jbG9ja19zZWwgY2xvY2tfc2VsLCBpbnQgZW4pOwogCS8qIHNlbGVjdCBpbnB1dCB0byBjY2RjICovCiAJdm9pZCAoKnNlbGVjdF9jY2RjX3NvdXJjZSkoZW51bSB2cHNzX2NjZGNfc291cmNlX3NlbCBzcmNfc2VsKTsKLQkvKiBjbGVhciB3Ymwgb3ZlcmxmbG93IGJpdCAqLworCS8qIGNsZWFyIHdibCBvdmVyZmxvdyBiaXQgKi8KIAlpbnQgKCpjbGVhcl93Ymxfb3ZlcmZsb3cpKGVudW0gdnBzc193Ymxfc2VsIHdibF9zZWwpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwppbmRleCBhYzk0N2FlLi5iZDc4MzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJZHByaW50aygib3BlbmluZyBkZXZpY2UgYW5kIHRyeWluZyB0byBhY3F1aXJlIGV4Y2x1c2l2ZSBsb2NrXG4iKTsKIAogCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQlVHOiBlbTI4eHggY2FuJ3QgZmluZCBkZXZpY2Ugc3RydWN0LiIKKwkJZW0yOHh4X2VycigiQlVHOiBlbTI4eHggY2FuJ3QgZmluZCBkZXZpY2Ugc3RydWN0LiIKIAkJCQkiIENhbid0IHByb2NlZWQgd2l0aCBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMzI1LDcgKzMyNSw3IEBACiAKIAlyZXR1cm4gMDsKIGVycjoKLQlwcmludGsoS0VSTl9FUlIgIkVycm9yIHdoaWxlIGNvbmZpZ3VyaW5nIGVtMjh4eCBtaXhlclxuIik7CisJZW0yOHh4X2VycigiRXJyb3Igd2hpbGUgY29uZmlndXJpbmcgZW0yOHh4IG1peGVyXG4iKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCmluZGV4IGMwZmQ1YzYuLjgyZGEyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCkBAIC0yMjUsNiArMjI1LDE0IEBACiAJewktMSwJCS0xLAktMSwJCS0xfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgdmMyMTFhX2VuYWJsZVtdID0geworCXtFTTI4WFhfUjA4X0dQSU8sCTB4ZmYsCTB4MDcsCQkxMH0sCisJe0VNMjhYWF9SMDhfR1BJTywJMHhmZiwJMHgwZiwJCTEwfSwKKwl7RU0yOFhYX1IwOF9HUElPLAkweGZmLAkweDBiLAkJMTB9LAorCXsJLTEsCQktMSwJLTEsCQktMX0sCit9OworCisKIC8qCiAgKiAgQm9hcmQgZGVmaW5pdGlvbnMKICAqLwpAQCAtODI5LDcgKzgzNyw3IEBACiAJCS5tdHNfZmlybXdhcmUgICA9IDEsCiAJCS5oYXNfZHZiICAgICAgICA9IDEsCiAJCS5kdmJfZ3BpbyAgICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2RpZ2l0YWwsCi0JCS5pcl9jb2RlcyAgICAgICA9ICZpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3X3RhYmxlLAorCQkuaXJfY29kZXMgICAgICAgPSAmaXJfY29kZXNfcmM1X2hhdXBwYXVnZV9uZXdfdGFibGUsCiAJCS5kZWNvZGVyICAgICAgICA9IEVNMjhYWF9UVlA1MTUwLAogCQkuaW5wdXQgICAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCkBAIC0xMDA5LDYgKzEwMTcsMjMgQEAKIAkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0gfSwKIAl9LAorCVtFTTI4MDBfQk9BUkRfVkMyMTFBXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJBY3Rpb25tYXN0ZXIvTGluWGNlbC9EaWdpdHVzIFZDMjExQSIsCisJCS5pc19lbTI4MDAgICAgPSAxLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULAkvKiBDYXB0dXJlLW9ubHkgYm9hcmQgKi8KKwkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTFYLAorCQkuaW5wdXQgICAgICAgID0geyB7CisJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IHZjMjExYV9lbmFibGUsCisJCX0sIHsKKwkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSB2YzIxMWFfZW5hYmxlLAorCQl9IH0sCisJfSwKIAlbRU0yODAwX0JPQVJEX0xFQURURUtfV0lORkFTVF9VU0JJSV0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiTGVhZHRlayBXaW5mYXN0IFVTQiBJSSIsCiAJCS5pc19lbTI4MDAgICAgPSAxLApAQCAtMTM4MSwxMCArMTQwNiwxNCBAQAogCX0sCiAJW0VNMjg4Ml9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFNdID0gewogCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIEh5YnJpZCBYUyAoZW0yODgyKSIsCi0JCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKIAkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKKwkJLm10c19maXJtd2FyZSA9IDEsCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKKwkJLmhhc19kdmIgICAgICA9IDEsCisJCS5kdmJfZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9kaWdpdGFsLAorCQkuaXJfY29kZXMgICAgID0gJmlyX2NvZGVzX3RlcnJhdGVjX2NpbmVyZ3lfeHNfdGFibGUsCisJCS54Y2xrICAgICAgICAgPSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfMTJNSFosCiAJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCkBAIC0xNjA4LDYgKzE2MzcsOCBAQAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODIwX0JPQVJEX1VOS05PV04gfSwKIAl7IFVTQl9ERVZJQ0UoMHhlYjFhLCAweDI4NjEpLAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODIwX0JPQVJEX1VOS05PV04gfSwKKwl7IFVTQl9ERVZJQ0UoMHhlYjFhLCAweDI4NjIpLAorCQkJLmRyaXZlcl9pbmZvID0gRU0yODIwX0JPQVJEX1VOS05PV04gfSwKIAl7IFVTQl9ERVZJQ0UoMHhlYjFhLCAweDI4NzApLAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODIwX0JPQVJEX1VOS05PV04gfSwKIAl7IFVTQl9ERVZJQ0UoMHhlYjFhLCAweDI4ODEpLApAQCAtMjA1MCw2ICsyMDgxLDcgQEAKIAlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKIAljYXNlIEVNMjg4MF9CT0FSRF9FTVBJUkVfRFVBTF9UVjoKIAljYXNlIEVNMjg4MF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzkwMDoKKwljYXNlIEVNMjg4Ml9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFM6CiAJCWN0bC0+ZGVtb2QgPSBYQzMwMjhfRkVfWkFSTElOSzQ1NjsKIAkJYnJlYWs7CiAJY2FzZSBFTTI4ODBfQk9BUkRfVEVSUkFURUNfSFlCUklEX1hTOgpAQCAtMjIyNyw2ICsyMjU5LDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiB2b2lkIGVtMjh4eF9yZWdpc3Rlcl9pMmNfaXIoc3RydWN0IGVtMjh4eCAqZGV2KQogeworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOwogCWNvbnN0IHVuc2lnbmVkIHNob3J0IGFkZHJfbGlzdFtdID0gewogCQkgMHgzMCwgMHg0NywgSTJDX0NMSUVOVF9FTkQKIAl9OwpAQCAtMjIzNCw5ICsyMjY3LDkgQEAKIAlpZiAoZGlzYWJsZV9pcikKIAkJcmV0dXJuOwogCi0JbWVtc2V0KCZkZXYtPmluZm8sIDAsIHNpemVvZigmZGV2LT5pbmZvKSk7CisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CiAJbWVtc2V0KCZkZXYtPmluaXRfZGF0YSwgMCwgc2l6ZW9mKGRldi0+aW5pdF9kYXRhKSk7Ci0Jc3RybGNweShkZXYtPmluZm8udHlwZSwgImlyX3ZpZGVvIiwgSTJDX05BTUVfU0laRSk7CisJc3RybGNweShpbmZvLnR5cGUsICJpcl92aWRlbyIsIEkyQ19OQU1FX1NJWkUpOwogCiAJLyogZGV0ZWN0ICYgY29uZmlndXJlICovCiAJc3dpdGNoIChkZXYtPm1vZGVsKSB7CkBAIC0yMjU5LDggKzIyOTIsOCBAQAogCX0KIAogCWlmIChkZXYtPmluaXRfZGF0YS5uYW1lKQotCQlkZXYtPmluZm8ucGxhdGZvcm1fZGF0YSA9ICZkZXYtPmluaXRfZGF0YTsKLQlpMmNfbmV3X3Byb2JlZF9kZXZpY2UoJmRldi0+aTJjX2FkYXAsICZkZXYtPmluZm8sIGFkZHJfbGlzdCk7CisJCWluZm8ucGxhdGZvcm1fZGF0YSA9ICZkZXYtPmluaXRfZGF0YTsKKwlpMmNfbmV3X3Byb2JlZF9kZXZpY2UoJmRldi0+aTJjX2FkYXAsICZpbmZvLCBhZGRyX2xpc3QpOwogfQogCiB2b2lkIGVtMjh4eF9jYXJkX3NldHVwKHN0cnVjdCBlbTI4eHggKmRldikKQEAgLTI1MjQsNiArMjU1Nyw5IEBACiAJCWRldi0+Y2hpcF9pZCA9IHJldHZhbDsKIAogCQlzd2l0Y2ggKGRldi0+Y2hpcF9pZCkgeworCQljYXNlIENISVBfSURfRU0yODAwOgorCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODAwXG4iKTsKKwkJCWJyZWFrOwogCQljYXNlIENISVBfSURfRU0yNzEwOgogCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yNzEwXG4iKTsKIAkJCWJyZWFrOwpAQCAtMjY1MCw3ICsyNjg2LDcgQEAKIAllbTI4eHhfaW5pdF9leHRlbnNpb24oZGV2KTsKIAogCS8qIFNhdmUgc29tZSBwb3dlciBieSBwdXR0aW5nIHR1bmVyIHRvIHNsZWVwICovCi0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3N0YW5kYnkpOworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3Bvd2VyLCAwKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCBhODgyNTdhLi4zZjg2ZDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXMgOiJmbXQsIFwKIAkJCSBkZXYtPm5hbWUsIF9fZnVuY19fICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW50IGFsdCA9IEVNMjhYWF9QSU5PVVQ7CitzdGF0aWMgaW50IGFsdDsKIG1vZHVsZV9wYXJhbShhbHQsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFsdCwgImFsdGVybmF0ZSBzZXR0aW5nIHRvIHVzZSBmb3IgdmlkZW8gZW5kcG9pbnQiKTsKIApAQCAtNTMzLDggKzUzMywxNSBAQAogCiAJdmlkMSA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBBQzk3X1ZFTkRPUl9JRDEpOwogCWlmICh2aWQxIDwgMCkgewotCQkvKiBEZXZpY2UgbGlrZWx5IGRvZXNuJ3Qgc3VwcG9ydCBBQzk3ICovCisJCS8qCisJCSAqIERldmljZSBsaWtlbHkgZG9lc24ndCBzdXBwb3J0IEFDOTcKKwkJICogTm90ZTogKHNvbWUpIGVtMjgwMCBkZXZpY2VzIHdpdGhvdXQgZWVwcm9tIHJlcG9ydHMgMHg5MSBvbgorCQkgKgkgQ0hJUENGRyByZWdpc3RlciwgZXZlbiBub3QgaGF2aW5nIGFuIEFDOTcgY2hpcAorCQkgKi8KIAkJZW0yOHh4X3dhcm4oIkFDOTcgY2hpcCB0eXBlIGNvdWxkbid0IGJlIGRldGVybWluZWRcbiIpOworCQlkZXYtPmF1ZGlvX21vZGUuYWM5NyA9IEVNMjhYWF9OT19BQzk3OworCQlkZXYtPmhhc19hbHNhX2F1ZGlvID0gMDsKKwkJZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IDA7CiAJCWdvdG8gaW5pdF9hdWRpbzsKIAl9CiAKQEAgLTc3OCw2ICs3ODUsMTYgQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgbWluX3BrdF9zaXplID0gZGV2LT53aWR0aCAqIDIgKyA0OwogCisJLyoKKwkgKiBhbHQgPSAwIGlzIHVzZWQgb25seSBmb3IgY29udHJvbCBtZXNzYWdlcywgc28sIG9ubHkgdmFsdWVzCisJICogZ3JlYXRlciB0aGFuIDAgY2FuIGJlIHVzZWQgZm9yIHN0cmVhbWluZy4KKwkgKi8KKwlpZiAoYWx0ICYmIGFsdCA8IGRldi0+bnVtX2FsdCkgeworCQllbTI4eHhfY29yZWRiZygiYWx0ZXJuYXRlIGZvcmNlZCB0byAlZFxuIiwgZGV2LT5hbHQpOworCQlkZXYtPmFsdCA9IGFsdDsKKwkJZ290byBzZXRfYWx0OworCX0KKwogCS8qIFdoZW4gaW1hZ2Ugc2l6ZSBpcyBiaWdnZXIgdGhhbiBhIGNlcnRhaW4gdmFsdWUsCiAJICAgdGhlIGZyYW1lIHNpemUgc2hvdWxkIGJlIGluY3JlYXNlZCwgb3RoZXJ3aXNlLCBvbmx5CiAJICAgZ3JlZW4gc2NyZWVuIHdpbGwgYmUgcmVjZWl2ZWQuCkBAIC03OTgsNiArODE1LDcgQEAKIAkJCWRldi0+YWx0ID0gaTsKIAl9CiAKK3NldF9hbHQ6CiAJaWYgKGRldi0+YWx0ICE9IHByZXZfYWx0KSB7CiAJCWVtMjh4eF9jb3JlZGJnKCJtaW5pbXVtIGlzb2MgcGFja2V0IHNpemU6ICV1IChhbHQ9JWQpXG4iLAogCQkJCW1pbl9wa3Rfc2l6ZSwgZGV2LT5hbHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCmluZGV4IGRiNzQ5NDYuLmNjMDUwNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKQEAgLTMxMywyMiArMzEzLDIwIEBACiAJY2ZnLmkyY19hZGRyICA9IGFkZHI7CiAKIAlpZiAoIWRldi0+ZHZiLT5mcm9udGVuZCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzLzI6IGR2YiBmcm9udGVuZCBub3QgYXR0YWNoZWQuICIKLQkJCQkiQ2FuJ3QgYXR0YWNoIHhjMzAyOFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCWVtMjh4eF9lcnJkZXYoIi8yOiBkdmIgZnJvbnRlbmQgbm90IGF0dGFjaGVkLiAiCisJCQkJIkNhbid0IGF0dGFjaCB4YzMwMjhcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlmZSA9IGR2Yl9hdHRhY2goeGMyMDI4X2F0dGFjaCwgZGV2LT5kdmItPmZyb250ZW5kLCAmY2ZnKTsKIAlpZiAoIWZlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMvMjogeGMzMDI4IGF0dGFjaCBmYWlsZWRcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOworCQllbTI4eHhfZXJyZGV2KCIvMjogeGMzMDI4IGF0dGFjaCBmYWlsZWRcbiIpOwogCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGRldi0+ZHZiLT5mcm9udGVuZCk7CiAJCWRldi0+ZHZiLT5mcm9udGVuZCA9IE5VTEw7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6IHhjMzAyOCBhdHRhY2hlZFxuIiwgZGV2LT5uYW1lKTsKKwllbTI4eHhfaW5mbygiJXMvMjogeGMzMDI4IGF0dGFjaGVkXG4iLCBkZXYtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NjMsNyArNDYxLDcgQEAKIAlkdmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZW0yOHh4X2R2YiksIEdGUF9LRVJORUwpOwogCiAJaWYgKGR2YiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImVtMjh4eF9kdmI6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWVtMjh4eF9pbmZvKCJlbTI4eHhfZHZiOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZGV2LT5kdmIgPSBkdmI7CkBAIC00OTMsNiArNDkxLDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIEVNMjg4MF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzkwMDoKKwljYXNlIEVNMjg4Ml9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFM6CiAJY2FzZSBFTTI4ODBfQk9BUkRfRU1QSVJFX0RVQUxfVFY6CiAJCWR2Yi0+ZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAogCQkJCQkgICAmZW0yOHh4X3psMTAzNTNfeGMzMDI4X25vX2kyY19nYXRlLApAQCAtNTY5LDE1ICs1NjgsMTIgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzLzI6IFRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQiCi0JCQkJIiBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZW0yOHh4X2VycmRldigiLzI6IFRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQiCisJCQkJIiBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iKTsKIAkJYnJlYWs7CiAJfQogCWlmIChOVUxMID09IGR2Yi0+ZnJvbnRlbmQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXMvMjogZnJvbnRlbmQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZW0yOHh4X2VycmRldigiLzI6IGZyb250ZW5kIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQpAQCAtNTkxLDcgKzU4Nyw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfU1VTUEVORCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU3VjY2Vzc2Z1bGx5IGxvYWRlZCBlbTI4eHgtZHZiXG4iKTsKKwllbTI4eHhfaW5mbygiU3VjY2Vzc2Z1bGx5IGxvYWRlZCBlbTI4eHgtZHZiXG4iKTsKIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IDdhMGZlMzguLmQ5NmVjN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC03MCw2ICs3MCw3IEBACiAJaW50IHBvbGxpbmc7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXVuc2lnbmVkIGludCBsYXN0X3RvZ2dsZToxOworCXVuc2lnbmVkIGludCBmdWxsX2NvZGU6MTsKIAl1bnNpZ25lZCBpbnQgbGFzdF9yZWFkY291bnQ7CiAJdW5zaWduZWQgaW50IHJlcGVhdF9pbnRlcnZhbDsKIApAQCAtMjQ2LDkgKzI0NywxMCBAQAogCQlyZXR1cm47CiAJfQogCi0JZHByaW50aygiaXItPmdldF9rZXkgcmVzdWx0IHRiPSUwMnggcmM9JTAyeCBscj0lMDJ4IGRhdGE9JTAyeFxuIiwKKwlkcHJpbnRrKCJpci0+Z2V0X2tleSByZXN1bHQgdGI9JTAyeCByYz0lMDJ4IGxyPSUwMnggZGF0YT0lMDJ4JTAyeFxuIiwKIAkJcG9sbF9yZXN1bHQudG9nZ2xlX2JpdCwgcG9sbF9yZXN1bHQucmVhZF9jb3VudCwKLQkJaXItPmxhc3RfcmVhZGNvdW50LCBwb2xsX3Jlc3VsdC5yY19kYXRhWzBdKTsKKwkJaXItPmxhc3RfcmVhZGNvdW50LCBwb2xsX3Jlc3VsdC5yY19hZGRyZXNzLAorCQlwb2xsX3Jlc3VsdC5yY19kYXRhWzBdKTsKIAogCWlmIChpci0+ZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0KSB7CiAJCS8qIFRoZSBlbTI4NzQgY2xlYXJzIHRoZSByZWFkY291bnQgZmllbGQgZXZlcnkgdGltZSB0aGUKQEAgLTI4Miw4ICsyODQsMTUgQEAKIAogCWlmIChkb19zZW5ka2V5KSB7CiAJCWRwcmludGsoInNlbmRpbmcga2V5cHJlc3NcbiIpOwotCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgcG9sbF9yZXN1bHQucmNfZGF0YVswXSwKLQkJCQkgcG9sbF9yZXN1bHQucmNfZGF0YVswXSk7CisKKwkJaWYgKGlyLT5mdWxsX2NvZGUpCisJCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwKKwkJCQkJIHBvbGxfcmVzdWx0LnJjX2FkZHJlc3MgPDwgOCB8CisJCQkJCSBwb2xsX3Jlc3VsdC5yY19kYXRhWzBdKTsKKwkJZWxzZQorCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsCisJCQkJCSBwb2xsX3Jlc3VsdC5yY19kYXRhWzBdKTsKKwogCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOwogCX0KIApAQCAtMzMzLDYgKzM0Miw4IEBACiAJc3dpdGNoIChkZXYtPmNoaXBfaWQpIHsKIAljYXNlIENISVBfSURfRU0yODYwOgogCWNhc2UgQ0hJUF9JRF9FTTI4ODM6CisJCWlmIChkZXYtPm1vZGVsID09IEVNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzk1MCkKKwkJCWlyLT5mdWxsX2NvZGUgPSAxOwogCQlpci0+Z2V0X2tleSA9IGRlZmF1bHRfcG9sbGluZ19nZXRrZXk7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9JRF9FTTI4NzQ6CkBAIC0zNTYsNyArMzY3LDExIEBACiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpKTsKIAlzdHJsY2F0KGlyLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihpci0+cGh5cykpOwogCi0JaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZpci0+aXIsIElSX1RZUEVfT1RIRVIsIGRldi0+Ym9hcmQuaXJfY29kZXMpOworCWVyciA9IGlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBJUl9UWVBFX09USEVSLAorCQkJICAgICBkZXYtPmJvYXJkLmlyX2NvZGVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKIAlpbnB1dF9kZXYtPm5hbWUgPSBpci0+bmFtZTsKIAlpbnB1dF9kZXYtPnBoeXMgPSBpci0+cGh5czsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwpAQCAtMzgxLDYgKzM5Niw3IEBACiAJZW0yOHh4X2lyX3N0b3AoaXIpOwogCWRldi0+aXIgPSBOVUxMOwogIGVycl9vdXRfZnJlZToKKwlpcl9pbnB1dF9mcmVlKGlucHV0X2Rldik7CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShpcik7CiAJcmV0dXJuIGVycjsKQEAgLTM5NSw2ICs0MTEsNyBAQAogCQlyZXR1cm4gMDsKIAogCWVtMjh4eF9pcl9zdG9wKGlyKTsKKwlpcl9pbnB1dF9mcmVlKGlyLT5pbnB1dCk7CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPmlucHV0KTsKIAlrZnJlZShpcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1yZWcuaAppbmRleCBlZDEyZTdmLi4wNThhYzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXJlZy5oCkBAIC0xOTIsNiArMTkyLDcgQEAKIAogLyogRklYTUU6IE5lZWQgdG8gYmUgcG9wdWxhdGVkIHdpdGggdGhlIG90aGVyIGNoaXAgSUQncyAqLwogZW51bSBlbTI4eHhfY2hpcF9pZCB7CisJQ0hJUF9JRF9FTTI4MDAgPSA3LAogCUNISVBfSURfRU0yNzEwID0gMTcsCiAJQ0hJUF9JRF9FTTI4MjAgPSAxOCwJLyogQWxzbyB1c2VkIGJ5IHNvbWUgZW0yNzEwICovCiAJQ0hJUF9JRF9FTTI4NDAgPSAyMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKaW5kZXggM2ExZGZiNy4uN2FkNjUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKQEAgLTEwNjAsMTIgKzEwNjAsNiBAQAogCQkvKiB0aGUgZW0yODAwIGNhbiBvbmx5IHNjYWxlIGRvd24gdG8gNTAlICovCiAJCWhlaWdodCA9IGhlaWdodCA+ICgzICogbWF4aCAvIDQpID8gbWF4aCA6IG1heGggLyAyOwogCQl3aWR0aCA9IHdpZHRoID4gKDMgKiBtYXh3IC8gNCkgPyBtYXh3IDogbWF4dyAvIDI7Ci0JCS8qIEFjY29yZGluZyB0byBlbXBpYXRlY2ggc3VwcG9ydCB0aGUgTWF4UGFja2V0U2l6ZSBpcyB0b28gc21hbGwKLQkJICogdG8gc3VwcG9ydCBmcmFtZXNpemVzIGxhcmdlciB0aGFuIDY0MHg0ODAgQCAzMCBmcHMgb3IgNjQweDU3NgotCQkgKiBAIDI1IGZwcy4gIEFzIHRoaXMgd291bGQgY3V0IG9mIGEgcGFydCBvZiB0aGUgaW1hZ2Ugd2UgcHJlZmVyCi0JCSAqIDM2MHg1NzYgb3IgMzYweDQ4MCBmb3Igbm93ICovCi0JCWlmICh3aWR0aCA9PSBtYXh3ICYmIGhlaWdodCA9PSBtYXhoKQotCQkJd2lkdGggLz0gMjsKIAl9IGVsc2UgewogCQkvKiB3aWR0aCBtdXN0IGV2ZW4gYmVjYXVzZSBvZiB0aGUgWVVZViBmb3JtYXQKIAkJICAgaGVpZ2h0IG11c3QgYmUgZXZlbiBiZWNhdXNlIG9mIGludGVybGFjaW5nICovCkBAIC0yMjI1LDcgKzIyMTksNyBAQAogCQl9CiAKIAkJLyogU2F2ZSBzb21lIHBvd2VyIGJ5IHB1dHRpbmcgdHVuZXIgdG8gc2xlZXAgKi8KLQkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3N0YW5kYnkpOworCQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgY29yZSwgc19wb3dlciwgMCk7CiAKIAkJLyogZG8gdGhpcyBiZWZvcmUgc2V0dGluZyBhbHRlcm5hdGUhICovCiAJCWVtMjh4eF91bmluaXRfaXNvYyhkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAppbmRleCAwYTczZThiLi40NDFkZjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaApAQCAtMTEwLDYgKzExMCw3IEBACiAjZGVmaW5lIEVNMjgyMF9CT0FSRF9TSUxWRVJDUkVTVF9XRUJDQU0gICAgICAgICAgIDcxCiAjZGVmaW5lIEVNMjg2MV9CT0FSRF9HQURNRUlfVVRWMzMwUExVUyAgICAgICAgICAgNzIKICNkZWZpbmUgRU0yODcwX0JPQVJEX1JFRERPX0RWQl9DX1VTQl9CT1ggICAgICAgICAgNzMKKyNkZWZpbmUgRU0yODAwX0JPQVJEX1ZDMjExQQkJCSAgNzQKIAogLyogTGltaXRzIG1pbmltdW0gYW5kIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KICNkZWZpbmUgRU0yOFhYX01JTl9CVUYgNApAQCAtMTQzLDkgKzE0NCw2IEBACiAgKi8KICNkZWZpbmUgRU0yOFhYX05VTV9QQUNLRVRTIDQwCiAKLS8qIGRlZmF1bHQgYWx0ZXJuYXRlOyAwIG1lYW5zIGNob29zZSB0aGUgYmVzdCAqLwotI2RlZmluZSBFTTI4WFhfUElOT1VUIDAKLQogI2RlZmluZSBFTTI4WFhfSU5URVJMQUNFRF9ERUZBVUxUIDEKIAogLyoKQEAgLTYxNSw3ICs2MTMsNiBAQAogCXN0cnVjdCBlbTI4eHhfZHZiICpkdmI7CiAKIAkvKiBJMkMga2V5Ym9hcmQgZGF0YSAqLwotCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOwogCXN0cnVjdCBJUl9pMmNfaW5pdF9kYXRhIGluaXRfZGF0YTsKIH07CiAKQEAgLTgwMCw3ICs3OTcsNyBAQAogCWlmIChkZXYtPmJvYXJkLmlzX3dlYmNhbSkKIAkJcmV0dXJuIGRldi0+c2Vuc29yX3hyZXM7CiAKLQlpZiAoZGV2LT5ib2FyZC5tYXhfcmFuZ2VfNjQwXzQ4MCkKKwlpZiAoZGV2LT5ib2FyZC5tYXhfcmFuZ2VfNjQwXzQ4MCB8fCBkZXYtPmJvYXJkLmlzX2VtMjgwMCkKIAkJcmV0dXJuIDY0MDsKIAogCXJldHVybiA3MjA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKaW5kZXggZmUyZTQ5MC4uNjA5ZDY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwpAQCAtNzYsMTAgKzc2LDExIEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2FfbXI5NzMxMGEuCiAKIGNvbmZpZyBVU0JfR1NQQ0FfT1Y1MTkKLQl0cmlzdGF0ZSAiT1Y1MTkgVVNCIENhbWVyYSBEcml2ZXIiCisJdHJpc3RhdGUgIk9WNTF4IC8gT1ZGWDIgLyBXOTk2eENGIFVTQiBDYW1lcmEgRHJpdmVyIgogCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKIAloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIE9WNTE5IGNoaXAuCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gb25lIG9mIHRoZXNlOgorCSAgT1Y1MTEoKyksIE9WNTE4KCspLCBPVjUxOSwgT1ZGWDIsIFc5OTY3Q0YsIFc5OTY4Q0YKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffb3Y1MTkuCkBAIC0xMDMsNiArMTA0LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9wYWMyMDcuCiAKK2NvbmZpZyBVU0JfR1NQQ0FfUEFDNzMwMgorCXRyaXN0YXRlICJQaXhhcnQgUEFDNzMwMiBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBQQUM3MzAyIGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3BhYzczMDIuCisKIGNvbmZpZyBVU0JfR1NQQ0FfUEFDNzMxMQogCXRyaXN0YXRlICJQaXhhcnQgUEFDNzMxMSBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCkBAIC0yMjksNiArMjM5LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9zdGswMTQuCiAKK2NvbmZpZyBVU0JfR1NQQ0FfU1RWMDY4MAorCXRyaXN0YXRlICJTVFYwNjgwIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFNUVjA2ODAgY2hpcC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc3R2MDY4MC4KKwogY29uZmlnIFVTQl9HU1BDQV9TVU5QTFVTCiAJdHJpc3RhdGUgIlNVTlBMVVMgVVNCIENhbWVyYSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKaW5kZXggYjc0MjA4MS4uZmYyYzcyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9PVjUxOSkgICAgKz0gZ3NwY2Ffb3Y1MTkubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9PVjUzNCkgICAgKz0gZ3NwY2Ffb3Y1MzQubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUMyMDcpICAgKz0gZ3NwY2FfcGFjMjA3Lm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfUEFDNzMwMikgICs9IGdzcGNhX3BhYzczMDIubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUM3MzExKSAgKz0gZ3NwY2FfcGFjNzMxMS5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NOOUMyMFgpICArPSBnc3BjYV9zbjljMjB4Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU09OSVhCKSAgICs9IGdzcGNhX3Nvbml4Yi5vCkBAIC0yMiw2ICsyMyw3IEBACiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NROTA1QykgICArPSBnc3BjYV9zcTkwNWMubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TVU5QTFVTKSAgKz0gZ3NwY2Ffc3VucGx1cy5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NUSzAxNCkgICArPSBnc3BjYV9zdGswMTQubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TVFYwNjgwKSAgKz0gZ3NwY2Ffc3R2MDY4MC5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1Q2MTMpICAgICArPSBnc3BjYV90NjEzLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfVFY4NTMyKSAgICs9IGdzcGNhX3R2ODUzMi5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1ZDMDMyWCkgICArPSBnc3BjYV92YzAzMngubwpAQCAtMzcsNiArMzksNyBAQAogZ3NwY2Ffb3Y1MTktb2JqcyAgICA6PSBvdjUxOS5vCiBnc3BjYV9vdjUzNC1vYmpzICAgIDo9IG92NTM0Lm8KIGdzcGNhX3BhYzIwNy1vYmpzICAgOj0gcGFjMjA3Lm8KK2dzcGNhX3BhYzczMDItb2JqcyAgOj0gcGFjNzMwMi5vCiBnc3BjYV9wYWM3MzExLW9ianMgIDo9IHBhYzczMTEubwogZ3NwY2Ffc245YzIweC1vYmpzICA6PSBzbjljMjB4Lm8KIGdzcGNhX3Nvbml4Yi1vYmpzICAgOj0gc29uaXhiLm8KQEAgLTUwLDYgKzUzLDcgQEAKIGdzcGNhX3NxOTA1LW9ianMgICAgOj0gc3E5MDUubwogZ3NwY2Ffc3E5MDVjLW9ianMgICA6PSBzcTkwNWMubwogZ3NwY2Ffc3RrMDE0LW9ianMgICA6PSBzdGswMTQubworZ3NwY2Ffc3R2MDY4MC1vYmpzICA6PSBzdHYwNjgwLm8KIGdzcGNhX3N1bnBsdXMtb2JqcyAgOj0gc3VucGx1cy5vCiBnc3BjYV90NjEzLW9ianMgICAgIDo9IHQ2MTMubwogZ3NwY2FfdHY4NTMyLW9ianMgICA6PSB0djg1MzIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb25leC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb25leC5jCmluZGV4IGVjYTAwMzUuLjJmMGI4ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NvbmV4LmMKQEAgLTg4OCw4ICs4ODgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KLQkJCV9fdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwpAQCAtODk3LDE2ICs4OTYsMTUgQEAKIAlpZiAoZGF0YVswXSA9PSAweGZmICYmIGRhdGFbMV0gPT0gMHhkOCkgewogCiAJCS8qIHN0YXJ0IG9mIGZyYW1lICovCi0JCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLAotCQkJCQlkYXRhLCAwKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIE5VTEwsIDApOwogCiAJCS8qIHB1dCB0aGUgSlBFRyBoZWFkZXIgaW4gdGhlIG5ldyBmcmFtZSAqLwotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLAotCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKKwkJCQlzZC0+anBlZ19oZHIsIEpQRUdfSERSX1NaKTsKIAkJZGF0YSArPSAyOwogCQlsZW4gLT0gMjsKIAl9Ci0JZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBmcmFtZSwgZGF0YSwgbGVuKTsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIGxlbik7CiB9CiAKIHN0YXRpYyB2b2lkIHNldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2Rldipnc3BjYV9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2V0b21zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2V0b21zLmMKaW5kZXggYzE0NjFlNi4uOWRlODY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9ldG9tcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZXRvbXMuYwpAQCAtNzUyLDggKzc1Miw3IEBACiAjdW5kZWYgTElNSVQKIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCWludCBzZXFmcmFtZTsKQEAgLTc2NywxNCArNzY2LDEzIEBACiAJCSAgICAgICBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdLCBkYXRhWzVdKTsKIAkJZGF0YSArPSAzMDsKIAkJLyogZG9uJ3QgY2hhbmdlIGRhdGFsZW5ndGggYXMgdGhlIGNoaXBzIHByb3ZpZGVkIGl0ICovCi0JCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLAotCQkJCQlkYXRhLCAwKTsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwgZGF0YSwgbGVuKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIE5VTEwsIDApOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGxlbikgewogCQlkYXRhICs9IDg7Ci0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIAl9IGVsc2UgewkJCS8qIERyb3AgUGFja2V0ICovCiAJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZmluZXBpeC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMKaW5kZXggNDgwZWM1Yy4uNWQ5MGU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMKQEAgLTgyLDcgKzgyLDYgQEAKIAlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSAmZGV2LT5nc3BjYV9kZXY7CiAJc3RydWN0IHVyYiAqdXJiID0gZ3NwY2FfZGV2LT51cmJbMF07CiAJdTggKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwogCWludCByZXQgPSAwOwogCWludCBsZW47CiAKQEAgLTExOCwxMCArMTE3LDYgQEAKIAkJCX0KIAkJCWlmICghZ3NwY2FfZGV2LT5wcmVzZW50IHx8ICFnc3BjYV9kZXYtPnN0cmVhbWluZykKIAkJCQlnb3RvIG91dDsKLQkJCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoJmRldi0+Z3NwY2FfZGV2KTsKLQkJCWlmIChmcmFtZSA9PSBOVUxMKQotCQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwotCiAJCQlpZiAobGVuIDwgRlBJWF9NQVhfVFJBTlNGRVIgfHwKIAkJCQkoZGF0YVtsZW4gLSAyXSA9PSAweGZmICYmCiAJCQkJCWRhdGFbbGVuIC0gMV0gPT0gMHhkOSkpIHsKQEAgLTEzMiwyMSArMTI3LDE3IEBACiAJCQkJICogYnV0IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8uIFdlIGFsc28gZW5kCiAJCQkJICogaGVyZSBpZiB0aGUgdGhlIGpwZWcgZW5kcyByaWdodCBhdCB0aGUgZW5kCiAJCQkJICogb2YgdGhlIGZyYW1lLiAqLwotCQkJCWlmIChmcmFtZSkKLQkJCQkJZnJhbWUgPSBnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LAotCQkJCQkJCUxBU1RfUEFDS0VULAotCQkJCQkJCWZyYW1lLAotCQkJCQkJCWRhdGEsIGxlbik7CisJCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCQlkYXRhLCBsZW4pOwogCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBnb3QgYSBwYXJ0aWFsIGltYWdlICovCi0JCQlpZiAoZnJhbWUpCi0JCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwKLQkJCQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZQotCQkJCQkJCT09IExBU1RfUEFDS0VUCi0JCQkJCQk/IEZJUlNUX1BBQ0tFVCA6IElOVEVSX1BBQ0tFVCwKLQkJCQkJCWZyYW1lLCBkYXRhLCBsZW4pOworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwKKwkJCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlCisJCQkJCQk9PSBMQVNUX1BBQ0tFVAorCQkJCQk/IEZJUlNUX1BBQ0tFVCA6IElOVEVSX1BBQ0tFVCwKKwkJCQkJZGF0YSwgbGVuKTsKIAkJfQogCiAJCS8qIFdlIG11c3Qgd2FpdCBiZWZvcmUgdHJ5aW5nIHJlYWRpbmcgdGhlIG5leHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtbWkxMzIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW1pMTMyMC5jCmluZGV4IDM5ZjYyNjEuLjEzNTVlNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtbWkxMzIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC1taTEzMjAuYwpAQCAtMSw2ICsxLDUgQEAKLS8qIEBmaWxlIGdsODYwLW1pMTMyMC5jCi0gKiBAYXV0aG9yIE9saXZpZXIgTE9SSU4gZnJvbSBteSBsb2dzCi0gKiBAZGF0ZSAyMDA5LTA4LTI3CisvKiBTdWJkcml2ZXIgZm9yIHRoZSBHTDg2MCBjaGlwIHdpdGggdGhlIE1JMTMyMCBzZW5zb3IKKyAqIEF1dGhvciBPbGl2aWVyIExPUklOIGZyb20gb3duIGxvZ3MKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEyNyw0OSArMTI2LDQ5IEBACiAKIHN0YXRpYyB1OCBkYXRfaHZmbGlwMVtdID0gezB4ZjAsIDB4MDAsIDB4ZjEsIDB4MDB9OwogCi1zdGF0aWMgdTggczAwMFtdID0KK3N0YXRpYyB1OCBkYXRfY29tbW9uMDBbXSA9CiAJIlx4MDBceDAxXHgwN1x4NmFceDA2XHg2M1x4MGRceDZhIiAiXHhjMFx4MDBceDEwXHgxMFx4YzFceDAzXHhjMlx4NDIiCiAJIlx4ZDhceDA0XHg1OFx4MDBceDA0XHgwMiI7Ci1zdGF0aWMgdTggczAwMVtdID0KK3N0YXRpYyB1OCBkYXRfY29tbW9uMDFbXSA9CiAJIlx4MGRceDAwXHhmMVx4MGJceDBkXHgwMFx4ZjFceDA4IiAiXHgzNVx4MDBceGYxXHgyMlx4NjhceDAwXHhmMVx4NWQiCiAJIlx4ZjBceDAwXHhmMVx4MDFceDA2XHg3MFx4ZjFceDBlIiAiXHhmMFx4MDBceGYxXHgwMlx4ZGRceDE4XHhmMVx4ZTAiOwotc3RhdGljIHU4IHMwMDJbXSA9CitzdGF0aWMgdTggZGF0X2NvbW1vbjAyW10gPQogCSJceDA1XHgwMVx4ZjFceDg0XHgwNlx4MDBceGYxXHg0NCIgIlx4MDdceDAwXHhmMVx4YmVceDA4XHgwMFx4ZjFceDFlIgogCSJceDIwXHgwMVx4ZjFceDAzXHgyMVx4ODRceGYxXHgwMCIgIlx4MjJceDBkXHhmMVx4MGZceDI0XHg4MFx4ZjFceDAwIgogCSJceDM0XHgxOFx4ZjFceDJkXHgzNVx4MDBceGYxXHgyMiIgIlx4NDNceDgzXHhmMVx4ODNceDU5XHgwMFx4ZjFceGZmIjsKLXN0YXRpYyB1OCBzMDAzW10gPQorc3RhdGljIHU4IGRhdF9jb21tb24wM1tdID0KIAkiXHhmMFx4MDBceGYxXHgwMlx4MzlceDA2XHhmMVx4OGMiICJceDNhXHgwNlx4ZjFceDhjXHgzYlx4MDNceGYxXHhkYSIKIAkiXHgzY1x4MDVceGYxXHgzMFx4NTdceDAxXHhmMVx4MGMiICJceDU4XHgwMVx4ZjFceDQyXHg1OVx4MDFceGYxXHgwYyIKIAkiXHg1YVx4MDFceGYxXHg0Mlx4NWNceDEzXHhmMVx4MGUiICJceDVkXHgxN1x4ZjFceDEyXHg2NFx4MWVceGYxXHgxYyI7Ci1zdGF0aWMgdTggczAwNFtdID0KK3N0YXRpYyB1OCBkYXRfY29tbW9uMDRbXSA9CiAJIlx4ZjBceDAwXHhmMVx4MDJceDI0XHg1Zlx4ZjFceDIwIiAiXHgyOFx4ZWFceGYxXHgwMlx4NWZceDQxXHhmMVx4NDMiOwotc3RhdGljIHU4IHMwMDVbXSA9CitzdGF0aWMgdTggZGF0X2NvbW1vbjA1W10gPQogCSJceDAyXHgwMFx4ZjFceGVlXHgwM1x4MjlceGYxXHgxYSIgIlx4MDRceDAyXHhmMVx4YTRceDA5XHgwMFx4ZjFceDY4IgogCSJceDBhXHgwMFx4ZjFceDJhXHgwYlx4MDBceGYxXHgwNCIgIlx4MGNceDAwXHhmMVx4OTNceDBkXHgwMFx4ZjFceDgyIgogCSJceDBlXHgwMFx4ZjFceDQwXHgwZlx4MDBceGYxXHg1ZiIgIlx4MTBceDAwXHhmMVx4NGVceDExXHgwMFx4ZjFceDViIjsKLXN0YXRpYyB1OCBzMDA2W10gPQorc3RhdGljIHU4IGRhdF9jb21tb24wNltdID0KIAkiXHgxNVx4MDBceGYxXHhjOVx4MTZceDAwXHhmMVx4NWUiICJceDE3XHgwMFx4ZjFceDlkXHgxOFx4MDBceGYxXHgwNiIKIAkiXHgxOVx4MDBceGYxXHg4OVx4MWFceDAwXHhmMVx4MTIiICJceDFiXHgwMFx4ZjFceGExXHgxY1x4MDBceGYxXHhlNCIKIAkiXHgxZFx4MDBceGYxXHg3YVx4MWVceDAwXHhmMVx4NjQiICJceGY2XHgwMFx4ZjFceDVmIjsKLXN0YXRpYyB1OCBzMDA3W10gPQorc3RhdGljIHU4IGRhdF9jb21tb24wN1tdID0KIAkiXHhmMFx4MDBceGYxXHgwMVx4NTNceDA5XHhmMVx4MDMiICJceDU0XHgzZFx4ZjFceDFjXHg1NVx4OTlceGYxXHg3MiIKIAkiXHg1Nlx4YzFceGYxXHhiMVx4NTdceGQ4XHhmMVx4Y2UiICJceDU4XHhlMFx4ZjFceDAwXHhkY1x4MGFceGYxXHgwMyIKIAkiXHhkZFx4NDVceGYxXHgyMFx4ZGVceGFlXHhmMVx4ODIiICJceGRmXHhkY1x4ZjFceGM5XHhlMFx4ZjZceGYxXHhlYSIKIAkiXHhlMVx4ZmZceGYxXHgwMCI7Ci1zdGF0aWMgdTggczAwOFtdID0KK3N0YXRpYyB1OCBkYXRfY29tbW9uMDhbXSA9CiAJIlx4ZjBceDAwXHhmMVx4MDFceDgwXHgwMFx4ZjFceDA2IiAiXHg4MVx4ZjZceGYxXHgwOFx4ODJceGZiXHhmMVx4ZjciCiAJIlx4ODNceDAwXHhmMVx4ZmVceGI2XHgwN1x4ZjFceDAzIiAiXHhiN1x4MThceGYxXHgwY1x4ODRceGZiXHhmMVx4MDYiCiAJIlx4ODVceGZiXHhmMVx4ZjlceDg2XHgwMFx4ZjFceGZmIiAiXHhiOFx4MDdceGYxXHgwNFx4YjlceDE2XHhmMVx4MGEiOwotc3RhdGljIHU4IHMwMDlbXSA9CitzdGF0aWMgdTggZGF0X2NvbW1vbjA5W10gPQogCSJceDg3XHhmYVx4ZjFceDA1XHg4OFx4ZmNceGYxXHhmOSIgIlx4ODlceDAwXHhmMVx4ZmZceGJhXHgwNlx4ZjFceDAzIgogCSJceGJiXHgxN1x4ZjFceDA5XHg4YVx4ZThceGYxXHgxNCIgIlx4OGJceGY3XHhmMVx4ZjBceDhjXHhmZFx4ZjFceGZhIgogCSJceDhkXHgwMFx4ZjFceDAwXHhiY1x4MDVceGYxXHgwMSIgIlx4YmRceDBjXHhmMVx4MDhceGJlXHgwMFx4ZjFceDE0IjsKLXN0YXRpYyB1OCBzMDEwW10gPQorc3RhdGljIHU4IGRhdF9jb21tb24xMFtdID0KIAkiXHg4ZVx4ZWFceGYxXHgxM1x4OGZceGY3XHhmMVx4ZjIiICJceDkwXHhmZFx4ZjFceGZhXHg5MVx4MDBceGYxXHgwMCIKIAkiXHhiZlx4MDVceGYxXHgwMVx4YzBceDBhXHhmMVx4MDgiICJceGMxXHgwMFx4ZjFceDBjXHg5Mlx4ZWRceGYxXHgwZiIKIAkiXHg5M1x4ZjlceGYxXHhmNFx4OTRceGZlXHhmMVx4ZmIiICJceDk1XHgwMFx4ZjFceDAwXHhjMlx4MDRceGYxXHgwMSIKIAkiXHhjM1x4MGFceGYxXHgwN1x4YzRceDAwXHhmMVx4MTAiOwotc3RhdGljIHU4IHMwMTFbXSA9CitzdGF0aWMgdTggZGF0X2NvbW1vbjExW10gPQogCSJceGYwXHgwMFx4ZjFceDAxXHgwNVx4MDBceGYxXHgwNiIgIlx4MjVceDAwXHhmMVx4NTVceDM0XHgxMFx4ZjFceDEwIgogCSJceDM1XHhmMFx4ZjFceDEwXHgzYVx4MDJceGYxXHgwMyIgIlx4M2JceDA0XHhmMVx4MmFceDliXHg0M1x4ZjFceDAwIgogCSJceGE0XHgwM1x4ZjFceGMwXHhhN1x4MDJceGYxXHg4MSI7CkBAIC0yMjIsMjYgKzIyMSwyNiBAQAogCiBzdGF0aWMgdm9pZCBjb21tb24oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewotCXMzMiBuOyAvKiByZXNlcnZlZCBmb3IgRkVUQ0ggbWFjcm9zICovCisJczMyIG47IC8qIHJlc2VydmVkIGZvciBGRVRDSCBmdW5jdGlvbnMgKi8KIAotCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHgwMDAwLCAweDAyMDAsIDIyLCBzMDAwKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4MDAwMCwgMHgwMjAwLCAyMiwgZGF0X2NvbW1vbjAwKTsKIAljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA0MSwgMHgwMDAwLCAwLCBOVUxMKTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4YmEwMCwgMHgwMjAwLCAzMiwgczAwMSk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgMzIsIGRhdF9jb21tb24wMSk7CiAJbiA9IGZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9jb21tb24sIEFSUkFZX1NJWkUodGJsX2NvbW1vbikpOwotCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHhiYTAwLCAweDAyMDAsIDQ4LCBzMDAyKTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4YmEwMCwgMHgwMjAwLCA0OCwgczAwMyk7Ci0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgMTYsIHMwMDQpOwotCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHhiYTAwLCAweDAyMDAsIDQ4LCBzMDA1KTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4YmEwMCwgMHgwMjAwLCA0NCwgczAwNik7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDgsIGRhdF9jb21tb24wMik7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDgsIGRhdF9jb21tb24wMyk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgMTYsIGRhdF9jb21tb24wNCk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDgsIGRhdF9jb21tb24wNSk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDQsIGRhdF9jb21tb24wNik7CiAJa2VlcF9vbl9mZXRjaGluZ192YWxpZHgoZ3NwY2FfZGV2LCB0YmxfY29tbW9uLAogCQkJCQlBUlJBWV9TSVpFKHRibF9jb21tb24pLCBuKTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4YmEwMCwgMHgwMjAwLCA1MiwgczAwNyk7Ci0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDgsIHMwMDgpOwotCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHhiYTAwLCAweDAyMDAsIDQ4LCBzMDA5KTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4YmEwMCwgMHgwMjAwLCA1NiwgczAxMCk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNTIsIGRhdF9jb21tb24wNyk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDgsIGRhdF9jb21tb24wOCk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDgsIGRhdF9jb21tb24wOSk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNTYsIGRhdF9jb21tb24xMCk7CiAJa2VlcF9vbl9mZXRjaGluZ192YWxpZHgoZ3NwY2FfZGV2LCB0YmxfY29tbW9uLAogCQkJCQlBUlJBWV9TSVpFKHRibF9jb21tb24pLCBuKTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4YmEwMCwgMHgwMjAwLCA0MCwgczAxMSk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweGJhMDAsIDB4MDIwMCwgNDAsIGRhdF9jb21tb24xMSk7CiAJa2VlcF9vbl9mZXRjaGluZ192YWxpZHgoZ3NwY2FfZGV2LCB0YmxfY29tbW9uLAogCQkJCQlBUlJBWV9TSVpFKHRibF9jb21tb24pLCBuKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtbWkyMDIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW1pMjAyMC5jCmluZGV4IGZmYjA5ZmUuLjgwY2IzZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtbWkyMDIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC1taTIwMjAuYwpAQCAtMSw3ICsxLDYgQEAKLS8qIEBmaWxlIGdsODYwLW1pMjAyMC5jCi0gKiBAYXV0aG9yIE9saXZpZXIgTE9SSU4sIGZyb20gSWNlL1Nvcm8yMDA1J3MgbG9ncyhBKSwgRnJldF9zYXcvSHVsa2llJ3MKKy8qIFN1YmRyaXZlciBmb3IgdGhlIEdMODYwIGNoaXAgd2l0aCB0aGUgTUkyMDIwIHNlbnNvcgorICogQXV0aG9yIE9saXZpZXIgTE9SSU4sIGZyb20gSWNlL1Nvcm8yMDA1J3MgbG9ncyhBKSwgRnJldF9zYXcvSHVsa2llJ3MKICAqIGxvZ3MoQikgYW5kIFRyaWNpZCJzIGxvZ3MoQykuIFdpdGggdGhlIGhlbHAgb2YgS3l0cml4L0JVR2FidW5kby9CbGF6ZXJjaXN0LgotICogQGRhdGUgMjAwOS0wOC0yNwogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDEsNyArNDAsNyBAQAogc3RhdGljIHU4IGRhdF9tdWx0aTVbXSA9IHsgMHg4YywgMHhhMSwgMHgwMyB9Owogc3RhdGljIHU4IGRhdF9tdWx0aTZbXSA9IHsgMHg5MCwgMHgwMCwgMHgwNSB9OwogCi1zdGF0aWMgc3RydWN0IHZhbGlkeCB0YmxfY29tbW9uX2FbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdmFsaWR4IHRibF9jb21tb24xW10gPSB7CiAJezB4MDAwMCwgMHgwMDAwfSwKIAl7MSwgMHhmZmZmfSwgLyogbXNsZWVwKDM1KTsgKi8KIAl7MHgwMDZhLCAweDAwMDd9LCB7MHgwMDYzLCAweDAwMDZ9LCB7MHgwMDZhLCAweDAwMGR9LCB7MHgwMDAwLCAweDAwYzB9LApAQCAtNDksNyArNDgsNyBAQAogCXsweDAwMDAsIDB4MDA1OH0sIHsweDAwMDIsIDB4MDAwNH0sIHsweDAwNDEsIDB4MDAwMH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHZhbGlkeCB0YmxfY29tbW9uX2JbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdmFsaWR4IHRibF9jb21tb24yW10gPSB7CiAJezB4MDA2YSwgMHgwMDA3fSwKIAl7MzUsIDB4ZmZmZn0sCiAJezB4MDBlZiwgMHgwMDA2fSwKQEAgLTYwLDcgKzU5LDcgQEAKIAl7MHgwMDA0LCAweDAwZDh9LCB7MHgwMDAwLCAweDAwNTh9LCB7MHgwMDQxLCAweDAwMDB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9jb21tb25fY1tdID0geworc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9jb21tb24zW10gPSB7CiAJezB4MzIsICJceDAyXHgwMFx4MDgifSwgezB4MzMsICJceGY0XHgwM1x4MWQifSwKIAl7NiwgIlx4ZmZceGZmXHhmZiJ9LCAvKiAxMiAqLwogCXsweDM0LCAiXHgxZVx4OGZceDA5In0sIHsweDM0LCAiXHgxY1x4MDFceDI4In0sIHsweDM0LCAiXHgxZVx4OGZceDA5In0sCkBAIC0xMDksNyArMTA4LDcgQEAKIAl7MHgzMywgIlx4OGNceGEyXHgwMyJ9LCB7MHgzMywgIlx4OTBceDAwXHhiYiJ9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9jb21tb25fZFtdID0geworc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9jb21tb240W10gPSB7CiAJezB4MzMsICJceDhjXHgyMlx4MmUifSwgezB4MzMsICJceDkwXHgwMFx4YTAifSwgezB4MzMsICJceDhjXHhhNFx4MDgifSwKIAl7MHgzMywgIlx4OTBceDAwXHgxZiJ9LCB7MHgzMywgIlx4OGNceGE0XHgwOSJ9LCB7MHgzMywgIlx4OTBceDAwXHgyMSJ9LAogCXsweDMzLCAiXHg4Y1x4YTRceDBhIn0sIHsweDMzLCAiXHg5MFx4MDBceDI1In0sIHsweDMzLCAiXHg4Y1x4YTRceDBiIn0sCkBAIC0xMTgsNyArMTE3LDcgQEAKIAl7MHgzMywgIlx4OTBceDAwXHhhMCJ9LCB7MHgzMywgIlx4OGNceDI0XHgxNyJ9LCB7MHgzMywgIlx4OTBceDAwXHhjMCJ9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9jb21tb25fZVtdID0geworc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9jb21tb241W10gPSB7CiAJezB4MzMsICJceDhjXHhhNFx4MDQifSwgezB4MzMsICJceDkwXHgwMFx4ODAifSwgezB4MzMsICJceDhjXHhhN1x4OWQifSwKIAl7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceGE3XHg5ZSJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LAogCXsweDMzLCAiXHg4Y1x4YTJceDBjIn0sIHsweDMzLCAiXHg5MFx4MDBceDE3In0sIHsweDMzLCAiXHg4Y1x4YTJceDE1In0sCkBAIC0xODAsNyArMTc5LDcgQEAKIAl7NTMsIDB4ZmZmZn0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2luaXRfcG9zdF9hbHRfbG93X2FbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF9sb3cxW10gPSB7CiAJezB4MzMsICJceDhjXHgyN1x4MTUifSwgezB4MzMsICJceDkwXHgwMFx4MjUifSwgezB4MzMsICJceDhjXHgyMlx4MmUifSwKIAl7MHgzMywgIlx4OTBceDAwXHg4MSJ9LCB7MHgzMywgIlx4OGNceGE0XHgwOCJ9LCB7MHgzMywgIlx4OTBceDAwXHgxNyJ9LAogCXsweDMzLCAiXHg4Y1x4YTRceDA5In0sIHsweDMzLCAiXHg5MFx4MDBceDFhIn0sIHsweDMzLCAiXHg4Y1x4YTRceDBhIn0sCkBAIC0xODksNyArMTg4LDcgQEAKIAl7MHgzMywgIlx4OTBceDAwXHg5YiJ9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9pbml0X3Bvc3RfYWx0X2xvd19iW10gPSB7CitzdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2luaXRfcG9zdF9hbHRfbG93MltdID0gewogCXsweDMzLCAiXHg4Y1x4MjdceDAzIn0sIHsweDMzLCAiXHg5MFx4MDNceDI0In0sIHsweDMzLCAiXHg4Y1x4MjdceDA1In0sCiAJezB4MzMsICJceDkwXHgwMlx4NTgifSwgezB4MzMsICJceDhjXHhhMVx4MDMifSwgezB4MzMsICJceDkwXHgwMFx4MDUifSwKIAl7MiwgIlx4ZmZceGZmXHhmZiJ9LApAQCAtMTk3LDcgKzE5Niw3IEBACiAJezIsICJceGZmXHhmZlx4ZmYifSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF9sb3dfY1tdID0geworc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9pbml0X3Bvc3RfYWx0X2xvdzNbXSA9IHsKIAl7MHgzNCwgIlx4MWVceDhmXHgwOSJ9LCB7MHgzNCwgIlx4MWNceDAxXHgyOCJ9LCB7MHgzNCwgIlx4MWVceDhmXHgwOSJ9LAogCXsyLCAiXHhmZlx4ZmZceGZmIn0sCiAJezB4MzQsICJceDFlXHg4Zlx4MDkifSwgezB4MzIsICJceDE0XHgwNlx4ZTYifSwgezB4MzMsICJceDhjXHhhMVx4MjAifSwKQEAgLTIyMSw3ICsyMjAsNyBAQAogCXsxLCAiXHhmZlx4ZmZceGZmIn0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2luaXRfcG9zdF9hbHRfbG93X2RbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF9sb3c0W10gPSB7CiAJezB4MzIsICJceDEwXHgwMVx4ZjgifSwgezB4MzQsICJceGNlXHgwMVx4YTgifSwgezB4MzQsICJceGQwXHg2Nlx4MzMifSwKIAl7MHgzNCwgIlx4ZDJceDMxXHg5YSJ9LCB7MHgzNCwgIlx4ZDRceDk0XHg2MyJ9LCB7MHgzNCwgIlx4ZDZceDRiXHgyNSJ9LAogCXsweDM0LCAiXHhkOFx4MjZceDcwIn0sIHsweDM0LCAiXHhkYVx4NzJceDRjIn0sIHsweDM0LCAiXHhkY1x4ZmZceDA0In0sCkBAIC0yNjcsNyArMjY2LDcgQEAKIAl7MHgzMiwgIlx4NmNceDE0XHgwOCJ9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9pbml0X3Bvc3RfYWx0X2JpZ19hW10gPSB7CitzdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2luaXRfcG9zdF9hbHRfYmlnMVtdID0gewogCXsweDMzLCAiXHg4Y1x4YTFceDAzIn0sIHsweDMzLCAiXHg5MFx4MDBceDA1In0sCiAJezIsICJceGZmXHhmZlx4ZmYifSwKIAl7MHgzMywgIlx4OGNceGExXHgwMyJ9LCB7MHgzMywgIlx4OTBceDAwXHgwNiJ9LApAQCAtMjg4LDcgKzI4Nyw3IEBACiAJezB4MzQsICJceDA0XHgwMFx4MmEifSwgezB4MzMsICJceDhjXHhhN1x4MDIifSwgezB4MzMsICJceDkwXHgwMFx4MDEifSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF9iaWdfYltdID0geworc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9pbml0X3Bvc3RfYWx0X2JpZzJbXSA9IHsKIAl7MHgzMiwgIlx4MTBceDAxXHhmOCJ9LCB7MHgzNCwgIlx4Y2VceDAxXHhhOCJ9LCB7MHgzNCwgIlx4ZDBceDY2XHgzMyJ9LAogCXsweDM0LCAiXHhkMlx4MzFceDlhIn0sIHsweDM0LCAiXHhkNFx4OTRceDYzIn0sIHsweDM0LCAiXHhkNlx4NGJceDI1In0sCiAJezB4MzQsICJceGQ4XHgyNlx4NzAifSwgezB4MzQsICJceGRhXHg3Mlx4NGMifSwgezB4MzQsICJceGRjXHhmZlx4MDQifSwKQEAgLTMxNyw3ICszMTYsNyBAQAogCXsweDMyLCAiXHgxMFx4MDFceGZjIn0sIHsweDMzLCAiXHg4Y1x4YTFceDE4In0sIHsweDMzLCAiXHg5MFx4MDBceDNjIn0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2luaXRfcG9zdF9hbHRfYmlnX2NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF9iaWczW10gPSB7CiAJezB4MzMsICJceDhjXHhhMVx4MDIifSwKIAl7MHgzMywgIlx4OTBceDAwXHgxZiJ9LAogCXsweDMzLCAiXHg4Y1x4YTFceDAyIn0sCkBAIC0zODgsMTQgKzM4NywxNCBAQAogCXMzMiByZXNvID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbKHMzMikgZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXY7CiAKIAlpZiAoX01JMjAyMGJfKSB7Ci0JCWZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9jb21tb25fYSwgQVJSQVlfU0laRSh0YmxfY29tbW9uX2EpKTsKKwkJZmV0Y2hfdmFsaWR4KGdzcGNhX2RldiwgdGJsX2NvbW1vbjEsIEFSUkFZX1NJWkUodGJsX2NvbW1vbjEpKTsKIAl9IGVsc2UgewogCQlpZiAoX01JMjAyMF8pCiAJCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsICAxLCAweDAwMDgsIDB4MDAwNCwgIDAsIE5VTEwpOwogCQllbHNlCiAJCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsICAxLCAweDAwMDIsIDB4MDAwNCwgIDAsIE5VTEwpOwogCQltc2xlZXAoMzUpOwotCQlmZXRjaF92YWxpZHgoZ3NwY2FfZGV2LCB0YmxfY29tbW9uX2IsIEFSUkFZX1NJWkUodGJsX2NvbW1vbl9iKSk7CisJCWZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9jb21tb24yLCBBUlJBWV9TSVpFKHRibF9jb21tb24yKSk7CiAJfQogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgIDMsIDB4N2EwMCwgMHgwMDMzLCAgMywgIlx4ODZceDI1XHgwMSIpOwogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgIDMsIDB4N2EwMCwgMHgwMDMzLCAgMywgIlx4ODZceDI1XHgwMCIpOwpAQCAtNDAzLDEzICs0MDIsMTMgQEAKIAljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsICAzLCAweDdhMDAsIDB4MDAzMCwgIDMsICJceDFhXHgwYVx4Y2MiKTsKIAlpZiAocmVzbyA9PSBJTUFHRV8xNjAwKQogCQltc2xlZXAoMik7IC8qIDE2MDAgKi8KLQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2NvbW1vbl9jLCBBUlJBWV9TSVpFKHRibF9jb21tb25fYykpOworCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfY29tbW9uMywgQVJSQVlfU0laRSh0YmxfY29tbW9uMykpOwogCiAJaWYgKF9NSTIwMjBiXyB8fCBfTUkyMDIwXykKLQkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9jb21tb25fZCwKLQkJCQlBUlJBWV9TSVpFKHRibF9jb21tb25fZCkpOworCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2NvbW1vbjQsCisJCQkJQVJSQVlfU0laRSh0YmxfY29tbW9uNCkpOwogCi0JZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9jb21tb25fZSwgQVJSQVlfU0laRSh0YmxfY29tbW9uX2UpKTsKKwlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2NvbW1vbjUsIEFSUkFZX1NJWkUodGJsX2NvbW1vbjUpKTsKIAlpZiAoX01JMjAyMGJfIHx8IF9NSTIwMjBfKSB7CiAJCS8qIERpZmZlcmVudCBmcm9tIGZyZXQgKi8KIAkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAwXHg3OCIpOwpAQCAtNTI1LDE1ICs1MjQsMTUgQEAKIAkJCQkxMiwgZGF0XzgwMCk7CiAKIAkJaWYgKF9NSTIwMjBjXykKLQkJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9sb3dfYSwKLQkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9sb3dfYSkpOworCQkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0X2xvdzEsCisJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHRfbG93MSkpOwogCiAJCWlmIChyZXNvID09IElNQUdFXzgwMCkKLQkJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9sb3dfYiwKLQkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9sb3dfYikpOworCQkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0X2xvdzIsCisJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHRfbG93MikpOwogCi0JCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9sb3dfYywKLQkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0X2xvd19jKSk7CisJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9sb3czLAorCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHRfbG93MykpOwogCiAJCWlmIChfTUkyMDIwYl8pIHsKIAkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDAxLCAweDAwMTAsIDAsIE5VTEwpOwpAQCAtNTc0LDggKzU3Myw4IEBACiAJCW1zbGVlcCg1KTsvKiAiICovCiAKIAkJaWYgKF9NSTIwMjBjXykgewotCQkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0X2xvd19kLAotCQkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0X2xvd19kKSk7CisJCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHRfbG93NCwKKwkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9sb3c0KSk7CiAJCX0gZWxzZSB7CiAJCQljdHJsX2luKGdzcGNhX2RldiwgMHhjMCwgMiwgMHgwMDAwLCAweDAwMDAsIDEsICZjKTsKIAkJCW1zbGVlcCgxNCk7IC8qIDB4ZDggKi8KQEAgLTY0NCw4ICs2NDMsOCBAQAogCQkJCQkzLCAiXHg5MFx4MDRceGIwIik7CiAJCX0KIAotCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHRfYmlnX2EsCi0JCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9iaWdfYSkpOworCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHRfYmlnMSwKKwkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0X2JpZzEpKTsKIAogCQlpZiAocmVzbyA9PSBJTUFHRV8xNjAwKQogCQkJbXNsZWVwKDEzKTsgLyogMTYwMCAqLwpAQCAtNzA4LDggKzcwNyw4IEBACiAJCW1zbGVlcCgxNCk7CiAKIAkJaWYgKF9NSTIwMjBjXykKLQkJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9iaWdfYiwKLQkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9iaWdfYikpOworCQkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0X2JpZzIsCisJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHRfYmlnMikpOwogCiAJCS8qIGZsaXAvbWlycm9yICovCiAJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9odmZsaXAxKTsKQEAgLTczOCw4ICs3MzcsOCBAQAogCQlzZC0+bmJJbSA9IDA7CiAKIAkJaWYgKF9NSTIwMjBjXykKLQkJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9iaWdfYywKLQkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9iaWdfYykpOworCQkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0X2JpZzMsCisJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHRfYmlnMykpOwogCX0KIAogCXNkLT52b2xkLm1pcnJvciAgICA9IG1pcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtb3YyNjQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW92MjY0MC5jCmluZGV4IDE0YjljMzcuLjc2OGNhYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtb3YyNjQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC1vdjI2NDAuYwpAQCAtMSw2ICsxLDUgQEAKLS8qIEBmaWxlIGdsODYwLW92MjY0MC5jCi0gKiBAYXV0aG9yIE9saXZpZXIgTE9SSU4sIGZyb20gTWFsbW9zdG9zbydzIGxvZ3MKLSAqIEBkYXRlIDIwMDktMDgtMjcKKy8qIFN1YmRyaXZlciBmb3IgdGhlIEdMODYwIGNoaXAgd2l0aCB0aGUgT1YyNjQwIHNlbnNvcgorICogQXV0aG9yIE9saXZpZXIgTE9SSU4sIGZyb20gTWFsbW9zdG9zbydzIGxvZ3MKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIxLDggKzIwLDEyIEBACiAjaW5jbHVkZSAiZ2w4NjAuaCIKIAogc3RhdGljIHU4IGRhdF9pbml0MVtdID0gIlx4MDBceDQxXHgwN1x4NmFceDA2XHg2MVx4MGRceDZhIiAiXHgxMFx4MTBceGMxXHgwMSI7Ci1zdGF0aWMgdTggZGF0X2luaXQyW10gPSB7MHg2MX07IC8qIGV4cGVjdGVkICovCi1zdGF0aWMgdTggZGF0X2luaXQzW10gPSB7MHg1MX07IC8qIGV4cGVjdGVkICovCisKK3N0YXRpYyB1OCBjNjFbXSA9IHsweDYxfTsgLyogZXhwZWN0ZWQgKi8KK3N0YXRpYyB1OCBjNTFbXSA9IHsweDUxfTsgLyogZXhwZWN0ZWQgKi8KK3N0YXRpYyB1OCBjNTBbXSA9IHsweDUwfTsgLyogZXhwZWN0ZWQgKi8KK3N0YXRpYyB1OCBjMjhbXSA9IHsweDI4fTsgLyogZXhwZWN0ZWQgKi8KK3N0YXRpYyB1OCBjYThbXSA9IHsweGE4fTsgLyogZXhwZWN0ZWQgKi8KIAogc3RhdGljIHU4IGRhdF9wb3N0W10gPQogCSJceDAwXHg0MVx4MDdceDZhXHgwNlx4ZWZceDBkXHg2YSIgIlx4MTBceDEwXHhjMVx4MDEiOwpAQCAtMzIsMTAgKzM1LDYgQEAKIHN0YXRpYyB1OCBkYXRfMTI4MFtdID0gIlx4ZDBceDAxXHhkMVx4MThceGQyXHhjMFx4ZDNceDAyXHhkNFx4MjhceGQ1XHgwMSI7CiBzdGF0aWMgdTggZGF0XzE2MDBbXSA9ICJceGQwXHgwMVx4ZDFceDIwXHhkMlx4YjBceGQzXHgwMlx4ZDRceDMwXHhkNVx4NDEiOwogCi1zdGF0aWMgdTggYzUwW10gPSB7MHg1MH07IC8qIGV4cGVjdGVkICovCi1zdGF0aWMgdTggYzI4W10gPSB7MHgyOH07IC8qIGV4cGVjdGVkICovCi1zdGF0aWMgdTggY2E4W10gPSB7MHhhOH07IC8qIGV4cGVjdGVkICovCi0KIHN0YXRpYyBzdHJ1Y3QgdmFsaWR4IHRibF9pbml0X2F0X3N0YXJ0dXBbXSA9IHsKIAl7MHgwMDAwLCAweDAwMDB9LCB7MHgwMDEwLCAweDAwMTB9LCB7MHgwMDA4LCAweDAwYzB9LCB7MHgwMDAxLCAweDAwYzF9LAogCXsweDAwMDEsIDB4MDBjMn0sIHsweDAwMjAsIDB4MDAwNn0sIHsweDAwNmEsIDB4MDAwZH0sCkBAIC05Miw3ICs5MSw3IEBACiAJezB4NjAwMCwgMHgwMDEwfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdmFsaWR4IHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uX2FbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdmFsaWR4IHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uMVtdID0gewogCXsweDAwNDEsIDB4MDAwMH0sIHsweDAwNmEsIDB4MDAwN30sIHsweDAwZWYsIDB4MDAwNn0sIHsweDAwNmEsIDB4MDAwZH0sCiAJezB4MDAwMCwgMHgwMGMwfSwgezB4MDAxMCwgMHgwMDEwfSwgezB4MDAwMSwgMHgwMGMxfSwgezB4MDA0MSwgMHgwMGMyfSwKIAl7MHgwMDA0LCAweDAwZDh9LCB7MHgwMDEyLCAweDAwMDR9LCB7MHgwMDAwLCAweDAwNTh9LCB7MHgwMDQxLCAweDAwMDB9LApAQCAtMTA0LDQwICsxMDMsMTAgQEAKIAl7MHgwMDQwLCAweDAwMDB9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb25fYltdID0geworc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb24yW10gPSB7CiAJezB4NjAwMSwgMHgwMGZmfSwgezB4NjAzOCwgMHgwMDBjfSwKIAl7MTAsIDB4ZmZmZn0sCiAJezB4NjAwMCwgMHgwMDExfSwKLQkvKiBiYWNrbGlnaHQ9MzEvNjQgKi8KLQl7MHg2MDAxLCAweDAwZmZ9LCB7MHg2MDNlLCAweDAwMjR9LCB7MHg2MDM0LCAweDAwMjV9LAotCS8qIGJyaWdodD0wLzI1NiAqLwotCXsweDYwMDAsIDB4MDBmZn0sIHsweDYwMDksIDB4MDA3Y30sIHsweDYwMDAsIDB4MDA3ZH0sCi0JLyogd2JhbD02NC8xMjggKi8KLQl7MHg2MDAwLCAweDAwZmZ9LCB7MHg2MDAzLCAweDAwN2N9LCB7MHg2MDQwLCAweDAwN2R9LAotCS8qIGNudHI9MC8yNTYgKi8KLQl7MHg2MDAwLCAweDAwZmZ9LCB7MHg2MDA3LCAweDAwN2N9LCB7MHg2MDAwLCAweDAwN2R9LAotCS8qIHNhdD0xMjgvMjU2ICovCi0JezB4NjAwMCwgMHgwMGZmfSwgezB4NjAwMSwgMHgwMDdjfSwgezB4NjA4MCwgMHgwMDdkfSwKLQkvKiBzaGFycG5lc3M9MC8zMiAqLwotCXsweDYwMDAsIDB4MDBmZn0sIHsweDYwMDEsIDB4MDA5Mn0sIHsweDYwYzAsIDB4MDA5M30sCi0JLyogaHVlPTAvMjU2ICovCi0JezB4NjAwMCwgMHgwMGZmfSwgezB4NjAwMiwgMHgwMDdjfSwgezB4NjAwMCwgMHgwMDdkfSwKLQkvKiBnYW09MzIvNjQgKi8KLQl7MHg2MDAwLCAweDAwZmZ9LCB7MHg2MDA4LCAweDAwN2N9LCB7MHg2MDIwLCAweDAwN2R9LAotCS8qIGltYWdlIHJpZ2h0IHVwICovCi0JezB4ZmZmZiwgMHhmZmZmfSwKLQl7MTUsIDB4ZmZmZn0sCi0JezB4NjAwMSwgMHgwMGZmfSwgezB4NjAwMCwgMHg4MDA0fSwKLQl7MHhmZmZmLCAweGZmZmZ9LAotCXsweDYwYTgsIDB4MDAwNH0sCi0JezE1LCAweGZmZmZ9LAotCXsweDYwMDEsIDB4MDBmZn0sIHsweDYwMDAsIDB4ODAwNH0sCi0JezB4ZmZmZiwgMHhmZmZmfSwKLQl7MHg2MGY4LCAweDAwMDR9LAotCS8qIGltYWdlIHJpZ2h0IHVwICovCi0JezB4ZmZmZiwgMHhmZmZmfSwKLQkvKiBiYWNrbGlnaHQ9MzEvNjQgKi8KLQl7MHg2MDAxLCAweDAwZmZ9LCB7MHg2MDNlLCAweDAwMjR9LCB7MHg2MDM0LCAweDAwMjV9LAogfTsKIAogc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsXzY0MFtdID0gewpAQCAtMTY2LDcgKzEzNSw3IEBACiAJezB4NjBmZiwgMHgwMGRkfSwgezB4NjAyMCwgMHgwMDhjfSwgezB4NjAwMSwgMHgwMGZmfSwgezB4NjA0NCwgMHgwMDE4fSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdmFsaWR4IHRibF9iaWdfYVtdID0geworc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2JpZzFbXSA9IHsKIAl7MHgwMDAyLCAweDAwYzF9LCB7MHg2MDAwLCAweDAwZmZ9LCB7MHg2MGYxLCAweDAwZGR9LCB7MHg2MDA0LCAweDAwZTB9LAogCXsweDYwMDEsIDB4MDBmZn0sIHsweDYwMDAsIDB4MDAxMn0sIHsweDYwMDAsIDB4MDAwMH0sIHsweDYwMDAsIDB4MDA0NX0sCiAJezB4NjAwMCwgMHgwMDEwfSwgezB4NjAwMCwgMHgwMDExfSwgezB4NjAxMSwgMHgwMDE3fSwgezB4NjA3NSwgMHgwMDE4fSwKQEAgLTE3NiwxNCArMTQ1LDE0IEBACiAJezB4NjBjOCwgMHgwMGMwfSwgezB4NjA5NiwgMHgwMGMxfSwgezB4NjAwMCwgMHgwMDhjfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdmFsaWR4IHRibF9iaWdfYltdID0geworc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2JpZzJbXSA9IHsKIAl7MHg2MDNkLCAweDAwODZ9LCB7MHg2MDAwLCAweDAwNTB9LCB7MHg2MDkwLCAweDAwNTF9LCB7MHg2MDJjLCAweDAwNTJ9LAogCXsweDYwMDAsIDB4MDA1M30sIHsweDYwMDAsIDB4MDA1NH0sIHsweDYwODgsIDB4MDA1NX0sIHsweDYwMDAsIDB4MDA1N30sCiAJezB4NjA0MCwgMHgwMDVhfSwgezB4NjBmMCwgMHgwMDVifSwgezB4NjAwMSwgMHgwMDVjfSwgezB4NjA4MiwgMHgwMGQzfSwKIAl7MHg2MDAwLCAweDAwOGV9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2JpZ19jW10gPSB7CitzdGF0aWMgc3RydWN0IHZhbGlkeCB0YmxfYmlnM1tdID0gewogCXsweDYwMDQsIDB4MDBkYX0sIHsweDYwMDAsIDB4MDBlMH0sIHsweDYwNjcsIDB4MDBlMX0sIHsweDYwZmYsIDB4MDBkZH0sCiAJezB4NjAwMSwgMHgwMGZmfSwgezB4NjAwMCwgMHgwMGZmfSwgezB4NjBmMSwgMHgwMGRkfSwgezB4NjAwNCwgMHgwMGUwfSwKIAl7MHg2MDAxLCAweDAwZmZ9LCB7MHg2MDAwLCAweDAwMTF9LCB7MHg2MDAwLCAweDAwZmZ9LCB7MHg2MDEwLCAweDAwYzd9LApAQCAtMjIzLDE3ICsxOTIsMTkgQEAKIAlzZC0+dmN1ci5odWUgICAgICAgID0gICAwOwogCXNkLT52Y3VyLnNhdHVyYXRpb24gPSAxMjg7CiAJc2QtPnZjdXIud2hpdGViYWwgICA9ICA2NDsKKwlzZC0+dmN1ci5taXJyb3IgICAgID0gICAwOworCXNkLT52Y3VyLmZsaXAgICAgICAgPSAgIDA7CiAKIAlzZC0+dm1heC5iYWNrbGlnaHQgID0gIDY0OwogCXNkLT52bWF4LmJyaWdodG5lc3MgPSAyNTU7CiAJc2QtPnZtYXguc2hhcnBuZXNzICA9ICAzMTsKIAlzZC0+dm1heC5jb250cmFzdCAgID0gMjU1OwogCXNkLT52bWF4LmdhbW1hICAgICAgPSAgNjQ7Ci0Jc2QtPnZtYXguaHVlICAgICAgICA9IDI1NSArIDE7CisJc2QtPnZtYXguaHVlICAgICAgICA9IDI1NCArIDI7CiAJc2QtPnZtYXguc2F0dXJhdGlvbiA9IDI1NTsKIAlzZC0+dm1heC53aGl0ZWJhbCAgID0gMTI4OwotCXNkLT52bWF4Lm1pcnJvciAgICAgPSAwOwotCXNkLT52bWF4LmZsaXAgICAgICAgPSAwOworCXNkLT52bWF4Lm1pcnJvciAgICAgPSAxOworCXNkLT52bWF4LmZsaXAgICAgICAgPSAxOwogCXNkLT52bWF4LkFDNTBIeiAgICAgPSAwOwogCiAJc2QtPmRldl9jYW1lcmFfc2V0dGluZ3MgPSBvdjI2NDBfY2FtZXJhX3NldHRpbmdzOwpAQCAtMjU5LDExICsyMzAsMTEgQEAKIAogCWNvbW1vbihnc3BjYV9kZXYpOwogCi0JY3RybF9pbihnc3BjYV9kZXYsIDB4YzAsIDIsIDB4MDAwMCwgMHgwMDA2LCAxLCBkYXRfaW5pdDIpOworCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDAwMDAsIDB4MDAwNiwgMSwgYzYxKTsKIAogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMGVmLCAweDAwMDYsIDAsIE5VTEwpOwogCi0JY3RybF9pbihnc3BjYV9kZXYsIDB4YzAsIDIsIDB4MDAwMCwgMHgwMDAwLCAxLCBkYXRfaW5pdDMpOworCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDAwMDAsIDB4MDAwMCwgMSwgYzUxKTsKIAogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDUxLCAweDAwMDAsIDAsIE5VTEwpOwogLyoJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxMSwgMHgwMDAwLCAweDAwMDAsIDAsIE5VTEwpOyAqLwpAQCAtMjc1LDYgKzI0Niw4IEBACiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCisJc2QtPm1pcnJvck1hc2sgPSAwOworCiAJc2QtPnZvbGQuYmFja2xpZ2h0ICA9IC0xOwogCXNkLT52b2xkLmJyaWdodG5lc3MgPSAtMTsKIAlzZC0+dm9sZC5zaGFycG5lc3MgID0gLTE7CkBAIC0yODMsNiArMjU2LDggQEAKIAlzZC0+dm9sZC5nYW1tYSAgICA9IC0xOwogCXNkLT52b2xkLmh1ZSAgICAgID0gLTE7CiAJc2QtPnZvbGQud2hpdGViYWwgPSAtMTsKKwlzZC0+dm9sZC5taXJyb3IgPSAtMTsKKwlzZC0+dm9sZC5mbGlwICAgPSAtMTsKIAogCW92MjY0MF9pbml0X3Bvc3RfYWx0KGdzcGNhX2Rldik7CiAKQEAgLTI5MiwxNiArMjY3LDE2IEBACiBzdGF0aWMgaW50IG92MjY0MF9pbml0X3Bvc3RfYWx0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzMzIgcmVzbyA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhzMzIpIGdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwotCXMzMiBuOyAvKiByZXNlcnZlZCBmb3IgRkVUQ0ggbWFjcm9zICovCisJczMyIG47IC8qIHJlc2VydmVkIGZvciBGRVRDSCBmdW5jdGlvbnMgKi8KIAogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgNSwgMHgwMDAxLCAweDAwMDAsIDAsIE5VTEwpOwogCi0JbiA9IGZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uX2EsCi0JCQlBUlJBWV9TSVpFKHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uX2EpKTsKKwluID0gZmV0Y2hfdmFsaWR4KGdzcGNhX2RldiwgdGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb24xLAorCQkJQVJSQVlfU0laRSh0Ymxfc2Vuc29yX3NldHRpbmdzX2NvbW1vbjEpKTsKIAljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4MDAwMCwgMHgwMjAwLCAxMiwgZGF0X3Bvc3QpOwogCWNvbW1vbihnc3BjYV9kZXYpOwotCWtlZXBfb25fZmV0Y2hpbmdfdmFsaWR4KGdzcGNhX2RldiwgdGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb25fYSwKLQkJCQlBUlJBWV9TSVpFKHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uX2EpLCBuKTsKKwlrZWVwX29uX2ZldGNoaW5nX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uMSwKKwkJCQlBUlJBWV9TSVpFKHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uMSksIG4pOwogCiAJc3dpdGNoIChyZXNvKSB7CiAJY2FzZSBJTUFHRV82NDA6CkBAIC0zMTYsMTggKzI5MSwxOCBAQAogCiAJY2FzZSBJTUFHRV8xNjAwOgogCWNhc2UgSU1BR0VfMTI4MDoKLQkJbiA9IGZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9iaWdfYSwgQVJSQVlfU0laRSh0YmxfYmlnX2EpKTsKKwkJbiA9IGZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9iaWcxLCBBUlJBWV9TSVpFKHRibF9iaWcxKSk7CiAKIAkJaWYgKHJlc28gPT0gSU1BR0VfMTI4MCkgewotCQkJbiA9IGZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9iaWdfYiwKLQkJCQkJQVJSQVlfU0laRSh0YmxfYmlnX2IpKTsKKwkJCW4gPSBmZXRjaF92YWxpZHgoZ3NwY2FfZGV2LCB0YmxfYmlnMiwKKwkJCQkJQVJSQVlfU0laRSh0YmxfYmlnMikpOwogCQl9IGVsc2UgewogCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMWQsIDB4MDA4NiwgMCwgTlVMTCk7CiAJCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAwMSwgMHgwMGQ3LCAwLCBOVUxMKTsKIAkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHg2MDgyLCAweDAwZDMsIDAsIE5VTEwpOwogCQl9CiAKLQkJbiA9IGZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9iaWdfYywgQVJSQVlfU0laRSh0YmxfYmlnX2MpKTsKKwkJbiA9IGZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9iaWczLCBBUlJBWV9TSVpFKHRibF9iaWczKSk7CiAKIAkJaWYgKHJlc28gPT0gSU1BR0VfMTI4MCkgewogCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMDEsIDB4MDBmZiwgMCwgTlVMTCk7CkBAIC0zNDMsMjAgKzMxOCw4IEBACiAJCWJyZWFrOwogCX0KIAotCW4gPSBmZXRjaF92YWxpZHgoZ3NwY2FfZGV2LCB0Ymxfc2Vuc29yX3NldHRpbmdzX2NvbW1vbl9iLAotCQkJQVJSQVlfU0laRSh0Ymxfc2Vuc29yX3NldHRpbmdzX2NvbW1vbl9iKSk7Ci0JY3RybF9pbihnc3BjYV9kZXYsIDB4YzAsIDIsIDB4MDAwMCwgMHgwMDAwLCAxLCBjNTApOwotCWtlZXBfb25fZmV0Y2hpbmdfdmFsaWR4KGdzcGNhX2RldiwgdGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb25fYiwKLQkJCQlBUlJBWV9TSVpFKHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uX2IpLCBuKTsKLQljdHJsX2luKGdzcGNhX2RldiwgMHhjMCwgMiwgMHg2MDAwLCAweDgwMDQsIDEsIGMyOCk7Ci0Ja2VlcF9vbl9mZXRjaGluZ192YWxpZHgoZ3NwY2FfZGV2LCB0Ymxfc2Vuc29yX3NldHRpbmdzX2NvbW1vbl9iLAotCQkJCUFSUkFZX1NJWkUodGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb25fYiksIG4pOwotCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDYwMDAsIDB4ODAwNCwgMSwgY2E4KTsKLQlrZWVwX29uX2ZldGNoaW5nX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uX2IsCi0JCQkJQVJSQVlfU0laRSh0Ymxfc2Vuc29yX3NldHRpbmdzX2NvbW1vbl9iKSwgbik7Ci0JY3RybF9pbihnc3BjYV9kZXYsIDB4YzAsIDIsIDB4MDAwMCwgMHgwMDAwLCAxLCBjNTApOwotCWtlZXBfb25fZmV0Y2hpbmdfdmFsaWR4KGdzcGNhX2RldiwgdGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb25fYiwKLQkJCQlBUlJBWV9TSVpFKHRibF9zZW5zb3Jfc2V0dGluZ3NfY29tbW9uX2IpLCBuKTsKKwluID0gZmV0Y2hfdmFsaWR4KGdzcGNhX2RldiwgdGJsX3NlbnNvcl9zZXR0aW5nc19jb21tb24yLAorCQkJQVJSQVlfU0laRSh0Ymxfc2Vuc29yX3NldHRpbmdzX2NvbW1vbjIpKTsKIAogCW92MjY0MF9jYW1lcmFfc2V0dGluZ3MoZ3NwY2FfZGV2KTsKIApAQCAtMzkzLDE4ICszNTYsMjAgQEAKIAlzMzIgc2F0ICAgID0gc2QtPnZjdXIuc2F0dXJhdGlvbjsKIAlzMzIgaHVlICAgID0gc2QtPnZjdXIuaHVlOwogCXMzMiB3YmFsICAgPSBzZC0+dmN1ci53aGl0ZWJhbDsKKwlzMzIgbWlycm9yID0gKCgoc2QtPnZjdXIubWlycm9yID4gMCkgXiBzZC0+bWlycm9yTWFzaykgPT0gMCk7CisJczMyIGZsaXAgICA9ICgoKHNkLT52Y3VyLmZsaXAgICA+IDApIF4gc2QtPm1pcnJvck1hc2spID09IDApOwogCiAJaWYgKGJhY2tsaWdodCAhPSBzZC0+dm9sZC5iYWNrbGlnaHQpIHsKKwkJLyogTm8gc2QtPnZvbGQuYmFja2xpZ2h0PWJhY2tsaWdodDsgKHRvIGJlIGRvbmUgYWdhaW4gbGF0ZXIpICovCiAJCWlmIChiYWNrbGlnaHQgPCAwIHx8IGJhY2tsaWdodCA+IHNkLT52bWF4LmJhY2tsaWdodCkKIAkJCWJhY2tsaWdodCA9IDA7CiAKIAkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMDEgICAgICAgICAgICAgICAgICwgMHgwMGZmLAogCQkJCTAsIE5VTEwpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAxZiArIGJhY2tsaWdodCAgICAgLCAweDAwMjQsCisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHg2MDFlICsgYmFja2xpZ2h0ICAgICAsIDB4MDAyNCwKIAkJCQkwLCBOVUxMKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMWYgKyBiYWNrbGlnaHQgLSAxMCwgMHgwMDI1LAorCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAxZSArIGJhY2tsaWdodCAtIDEwLCAweDAwMjUsCiAJCQkJMCwgTlVMTCk7Ci0JCS8qIE5vIHNkLT52b2xkLmJhY2tsaWdodD1iYWNrbGlnaHQ7ICh0byBiZSBkb25lIGFnYWluIGxhdGVyKSAqLwogCX0KIAogCWlmIChicmlnaHQgIT0gc2QtPnZvbGQuYnJpZ2h0bmVzcykgewpAQCAtNDY2LDcgKzQzMSw3IEBACiAJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHg2MDAyICAgICAsIDB4MDA3YywgMCwgTlVMTCk7CiAJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHg2MDAwICsgaHVlICogKGh1ZSA8IDI1NSksIDB4MDA3ZCwKIAkJCQkwLCBOVUxMKTsKLQkJaWYgKGh1ZSA+PSBzZC0+dm1heC5odWUpCisJCWlmIChodWUgPj0gMjU1KQogCQkJc2QtPnN3YXBSQiA9IDE7CiAJCWVsc2UKIAkJCXNkLT5zd2FwUkIgPSAwOwpAQCAtNDgyLDE0ICs0NDcsMzMgQEAKIAkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMDAgKyBnYW0sIDB4MDA3ZCwgMCwgTlVMTCk7CiAJfQogCisJaWYgKG1pcnJvciAhPSBzZC0+dm9sZC5taXJyb3IgfHwgZmxpcCAhPSBzZC0+dm9sZC5mbGlwKSB7CisJCXNkLT52b2xkLm1pcnJvciA9IG1pcnJvcjsKKwkJc2QtPnZvbGQuZmxpcCAgID0gZmxpcDsKKworCQltaXJyb3IgPSAweDgwICogbWlycm9yOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAwMSwgMHgwMGZmLCAwLCBOVUxMKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMDAsIDB4ODAwNCwgMCwgTlVMTCk7CisJCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDYwMDAsIDB4ODAwNCwgMSwgYzI4KTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMjggKyBtaXJyb3IsIDB4MDAwNCwgMCwgTlVMTCk7CisKKwkJZmxpcCA9IDB4NTAgKiBmbGlwICsgbWlycm9yOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAwMSwgMHgwMGZmLCAwLCBOVUxMKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMDAsIDB4ODAwNCwgMCwgTlVMTCk7CisJCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDYwMDAsIDB4ODAwNCwgMSwgY2E4KTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMjggKyBmbGlwLCAweDAwMDQsIDAsIE5VTEwpOworCisJCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDAwMDAsIDB4MDAwMCwgMSwgYzUwKTsKKwl9CisKIAlpZiAoYmFja2xpZ2h0ICE9IHNkLT52b2xkLmJhY2tsaWdodCkgewogCQlzZC0+dm9sZC5iYWNrbGlnaHQgPSBiYWNrbGlnaHQ7CiAKIAkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMDEgICAgICAgICAgICAgICAgICwgMHgwMGZmLAogCQkJCTAsIE5VTEwpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAxZiArIGJhY2tsaWdodCAgICAgLCAweDAwMjQsCisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHg2MDFlICsgYmFja2xpZ2h0ICAgICAsIDB4MDAyNCwKIAkJCQkwLCBOVUxMKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDYwMWYgKyBiYWNrbGlnaHQgLSAxMCwgMHgwMDI1LAorCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAxZSArIGJhY2tsaWdodCAtIDEwLCAweDAwMjUsCiAJCQkJMCwgTlVMTCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW92OTY1NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC1vdjk2NTUuYwppbmRleCBlZGEzMzQ2Li5kNDEyNjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW92OTY1NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtb3Y5NjU1LmMKQEAgLTEsNyArMSw2IEBACi0vKiBAZmlsZSBnbDg2MC1vdjk2NTUuYwotICogQGF1dGhvciBPbGl2aWVyIExPUklOLCBmcm9tIGxvZ3MgZG9uZSBieSBTaW1vbiAoU3VyMykgYW5kIEFsbWlnaHVydAorLyogU3ViZHJpdmVyIGZvciB0aGUgR0w4NjAgY2hpcCB3aXRoIHRoZSBPVjk2NTUgc2Vuc29yCisgKiBBdXRob3IgT2xpdmllciBMT1JJTiwgZnJvbSBsb2dzIGRvbmUgYnkgU2ltb24gKFN1cjMpIGFuZCBBbG1pZ2h1cnQKICAqIG9uIGRzZCdzIHdlYmxvZwotICogQGRhdGUgMjAwOS0wOC0yNwogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTA0LDE0ICsxMDMsMTQgQEAKIH07CiAKIHN0YXRpYyB1OCBjMDRbXSA9IHsweDA0fTsKLXN0YXRpYyB1OCBkYXRfcG9zdF8xW10gPSAiXHgwNFx4MDBceDEwXHgyMFx4YTFceDAwXHgwMFx4MDIiOwotc3RhdGljIHU4IGRhdF9wb3N0XzJbXSA9ICJceDEwXHgxMFx4YzFceDAyIjsKLXN0YXRpYyB1OCBkYXRfcG9zdF8zW10gPSAiXHgwNFx4MDBceDEwXHg3Y1x4YTFceDAwXHgwMFx4MDQiOwotc3RhdGljIHU4IGRhdF9wb3N0XzRbXSA9ICJceDEwXHgwMlx4YzFceDA2IjsKLXN0YXRpYyB1OCBkYXRfcG9zdF81W10gPSAiXHgwNFx4MDBceDEwXHg3Ylx4YTFceDAwXHgwMFx4MDgiOwotc3RhdGljIHU4IGRhdF9wb3N0XzZbXSA9ICJceDEwXHgxMFx4YzFceDA1IjsKLXN0YXRpYyB1OCBkYXRfcG9zdF83W10gPSAiXHgwNFx4MDBceDEwXHg3Y1x4YTFceDAwXHgwMFx4MDgiOwotc3RhdGljIHU4IGRhdF9wb3N0XzhbXSA9ICJceDA0XHgwMFx4MTBceDdjXHhhMVx4MDBceDAwXHgwOSI7CitzdGF0aWMgdTggZGF0X3Bvc3QxW10gPSAiXHgwNFx4MDBceDEwXHgyMFx4YTFceDAwXHgwMFx4MDIiOworc3RhdGljIHU4IGRhdF9wb3N0MltdID0gIlx4MTBceDEwXHhjMVx4MDIiOworc3RhdGljIHU4IGRhdF9wb3N0M1tdID0gIlx4MDRceDAwXHgxMFx4N2NceGExXHgwMFx4MDBceDA0IjsKK3N0YXRpYyB1OCBkYXRfcG9zdDRbXSA9ICJceDEwXHgwMlx4YzFceDA2IjsKK3N0YXRpYyB1OCBkYXRfcG9zdDVbXSA9ICJceDA0XHgwMFx4MTBceDdiXHhhMVx4MDBceDAwXHgwOCI7CitzdGF0aWMgdTggZGF0X3Bvc3Q2W10gPSAiXHgxMFx4MTBceGMxXHgwNSI7CitzdGF0aWMgdTggZGF0X3Bvc3Q3W10gPSAiXHgwNFx4MDBceDEwXHg3Y1x4YTFceDAwXHgwMFx4MDgiOworc3RhdGljIHU4IGRhdF9wb3N0OFtdID0gIlx4MDRceDAwXHgxMFx4N2NceGExXHgwMFx4MDBceDA5IjsKIAogc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2luaXRfcG9zdF9hbHRbXSA9IHsKIAl7MHg2MDMyLCAweDAwZmZ9LCB7MHg2MDMyLCAweDAwZmZ9LCB7MHg2MDMyLCAweDAwZmZ9LCB7MHg2MDNjLCAweDAwZmZ9LApAQCAtMjEyLDcgKzIxMSw3IEBACiBzdGF0aWMgaW50IG92OTY1NV9pbml0X3Bvc3RfYWx0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzMzIgcmVzbyA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhzMzIpIGdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwotCXMzMiBuOyAvKiByZXNlcnZlZCBmb3IgRkVUQ0ggbWFjcm9zICovCisJczMyIG47IC8qIHJlc2VydmVkIGZvciBGRVRDSCBmdW5jdGlvbnMgKi8KIAlzMzIgaTsKIAl1OCAqKnRibDsKIApAQCAtMjQzLDcgKzI0Miw3IEBACiAJY3RybF9pbihnc3BjYV9kZXYsIDB4YzAsIDIsIDB4NjAwMCwgMHg4MDFlLCAxLCBjMDQpOwogCWtlZXBfb25fZmV0Y2hpbmdfdmFsaWR4KGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHQsCiAJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHQpLCBuKTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdF8xKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdDEpOwogCWtlZXBfb25fZmV0Y2hpbmdfdmFsaWR4KGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHQsCiAJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHQpLCBuKTsKIApAQCAtMjU5LDcgKzI1OCw3IEBACiAJY3RybF9pbihnc3BjYV9kZXYsIDB4YzAsIDIsIDB4NjAwMCwgMHg4MDFlLCAxLCBjMDQpOwogCWtlZXBfb25fZmV0Y2hpbmdfdmFsaWR4KGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHQsCiAJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHQpLCBuKTsKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdF8xKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdDEpOwogCWtlZXBfb25fZmV0Y2hpbmdfdmFsaWR4KGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHQsCiAJCQkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHQpLCBuKTsKIApAQCAtMjcwLDE4ICsyNjksMTggQEAKIAlrZWVwX29uX2ZldGNoaW5nX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0LAogCQkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0KSwgbik7CiAKLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdF8xKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdDEpOwogCi0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDAwMDAsIDB4MDIwMCwgNCwgZGF0X3Bvc3RfMik7Ci0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDYwMDAsIDB4MDIwMCwgOCwgZGF0X3Bvc3RfMyk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDAwMDAsIDB4MDIwMCwgNCwgZGF0X3Bvc3QyKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdDMpOwogCi0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDAwMDAsIDB4MDIwMCwgNCwgZGF0X3Bvc3RfNCk7Ci0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDYwMDAsIDB4MDIwMCwgOCwgZGF0X3Bvc3RfNSk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDAwMDAsIDB4MDIwMCwgNCwgZGF0X3Bvc3Q0KTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdDUpOwogCi0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDAwMDAsIDB4MDIwMCwgNCwgZGF0X3Bvc3RfNik7Ci0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDYwMDAsIDB4MDIwMCwgOCwgZGF0X3Bvc3RfNyk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDAwMDAsIDB4MDIwMCwgNCwgZGF0X3Bvc3Q2KTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4NjAwMCwgMHgwMjAwLCA4LCBkYXRfcG9zdDcpOwogCi0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDYwMDAsIDB4MDIwMCwgOCwgZGF0X3Bvc3RfOCk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDYwMDAsIDB4MDIwMCwgOCwgZGF0X3Bvc3Q4KTsKIAogCW92OTY1NV9jYW1lcmFfc2V0dGluZ3MoZ3NwY2FfZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5jCmluZGV4IDZlZjU5YWMuLmE2OTVlMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmMKQEAgLTEsOSArMSw3IEBACi0vKiBAZmlsZSBnbDg2MC5jCi0gKiBAZGF0ZSAyMDA5LTA4LTI3CisvKiBHU1BDQSBzdWJkcml2ZXJzIGZvciBHZW5lc3lzIExvZ2ljIHdlYmNhbXMgd2l0aCB0aGUgR0w4NjAgY2hpcAorICogU3ViZHJpdmVyIGNvcmUKICAqCi0gKiBHZW5lc3lzIExvZ2ljIHdlYmNhbSB3aXRoIGdsODYwIHN1YmRyaXZlcnMKLSAqCi0gKiBEcml2ZXIgYnkgT2xpdmllciBMb3JpbiA8by5sb3JpbkBsYXBvc3RlLm5ldD4KKyAqIDIwMDkvMDkvMjQgT2xpdmllciBMb3JpbiA8by5sb3JpbkBsYXBvc3RlLm5ldD4KICAqIEdTUENBIGJ5IEplYW4tRnJhbmNvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+CiAgKiBUaGFua3MgQlVHYWJ1bmRvIGFuZCBNYWxtb3N0b3NvIGZvciB5b3VyIGFtYXppbmcgaGVscCEKICAqCkBAIC0yMyw4ICsyMSw4IEBACiAjaW5jbHVkZSAiZ3NwY2EuaCIKICNpbmNsdWRlICJnbDg2MC5oIgogCi1NT0RVTEVfQVVUSE9SKCJPbGl2aWVyIExvcmluIDxsb3JpbkBsYXBvc3RlLm5ldD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR1NQQ0EvR2VuZXN5cyBMb2dpYyBHTDg2MCBVU0IgQ2FtZXJhIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiT2xpdmllciBMb3JpbiA8by5sb3JpbkBsYXBvc3RlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR2VuZXN5cyBMb2dpYyBVU0IgUEMgQ2FtZXJhIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PSBzdGF0aWMgZnVuY3Rpb24gZGVjbGFyYXRpb25zID09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTM4LDcgKzM2LDcgQEAKIHN0YXRpYyBpbnQgIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CiBzdGF0aWMgdm9pZCBzZF9zdG9wMChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOwogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwgdTggKmRhdGEsIHMzMiBsZW4pOworCQkJdTggKmRhdGEsIGludCBsZW4pOwogc3RhdGljIHZvaWQgc2RfY2FsbGJhY2soc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKIAogc3RhdGljIGludCBnbDg2MF9ndWVzc19zZW5zb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LApAQCAtNTMsNyArNTEsNyBAQAogc3RhdGljIGNoYXIgc2Vuc29yWzddOwogbW9kdWxlX3BhcmFtX3N0cmluZyhzZW5zb3IsIHNlbnNvciwgc2l6ZW9mKHNlbnNvciksIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzZW5zb3IsCi0JCSIgRHJpdmVyIHNlbnNvciAoJ01JMTMyMCcvJ01JMjAyMCcvJ09WOTY1NScvJ09WMjY0MCcvJycpIik7CisJCSIgRHJpdmVyIHNlbnNvciAoJ01JMTMyMCcvJ01JMjAyMCcvJ09WOTY1NScvJ09WMjY0MCcpIik7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PSB3ZWJjYW0gY29udHJvbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCkBAIC0xNTYsNyArMTU0LDcgQEAKIAlTRVRfTVlfQ1RSTChWNEwyX0NJRF9WRkxJUCwKIAkJVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwgIkZsaXAiLCBmbGlwKQogCVNFVF9NWV9DVFJMKFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLAotCQlWNEwyX0NUUkxfVFlQRV9CT09MRUFOLCAiNTBIeiIsIEFDNTBIeikKKwkJVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwgIkFDIHBvd2VyIDUwSHoiLCBBQzUwSHopCiAKIAlyZXR1cm4gbkN0cmxzOwogfQpAQCAtNDM1LDcgKzQzMyw3IEBACiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gaW1hZ2UgaXMgYmVpbmcgcmVjZWl2ZWQgKi8KIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsIHU4ICpkYXRhLCBzMzIgbGVuKQorCQkJdTggKmRhdGEsIGludCBsZW4pCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXN0YXRpYyBzMzIgblNraXBwZWQ7CkBAIC00NDcsMTEgKzQ0NSwxMSBAQAogCS8qIFRlc3Qgb25seSBhZ2FpbnN0IDAyMDJoLCBzbyBlbmRpYW5lc3MgZG9lcyBub3QgbWF0dGVyICovCiAJc3dpdGNoICgqKHMxNiAqKSBkYXRhKSB7CiAJY2FzZSAweDAyMDI6CQkvKiBFbmQgb2YgZnJhbWUsIHN0YXJ0IGEgbmV3IG9uZSAqLwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwgZGF0YSwgMCk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKIAkJblNraXBwZWQgPSAwOwogCQlpZiAoc2QtPm5iSW0gPj0gMCAmJiBzZC0+bmJJbSA8IDEwKQogCQkJc2QtPm5iSW0rKzsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwgZGF0YSwgMCk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgTlVMTCwgMCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTQ2Niw3ICs0NjQsNyBAQAogCQkJCW5Ta2lwcGVkID0gblRvU2tpcCArIDE7CiAJCQl9CiAJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LAotCQkJCUlOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJCQkJSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTcwMiw2ICs3MDAsNyBAQAogCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA2YSwgMHgwMDBkLCAwLCBOVUxMKTsKIAkJbXNsZWVwKDU2KTsKIAorCQlQREVCVUcoRF9QUk9CRSwgInByb2JpbmcgZm9yIHNlbnNvciBNSTIwMjAgb3IgT1ZYWFhYIik7CiAJCW5PViA9IDA7CiAJCWZvciAobnRyeSA9IDA7IG50cnkgPCA0OyBudHJ5KyspIHsKIAkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDQwLCAweDAwMDAsIDAsIE5VTEwpOwpAQCAtNzExLDE0ICs3MTAsMTQgQEAKIAkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHg3YTAwLCAweDgwMzAsIDAsIE5VTEwpOwogCQkJbXNsZWVwKDEwKTsKIAkJCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDdhMDAsIDB4ODAzMCwgMSwgJnByb2JlKTsKLQkJCVBERUJVRyhEX1BST0JFLCAiMXN0IHByb2JlPSUwMngiLCBwcm9iZSk7CisJCQlQREVCVUcoRF9QUk9CRSwgInByb2JlPTB4JTAyeCIsIHByb2JlKTsKIAkJCWlmIChwcm9iZSA9PSAweGZmKQogCQkJCW5PVisrOwogCQl9CiAKIAkJaWYgKG5PVikgewotCQkJUERFQlVHKERfUFJPQkUsICIweGZmIC0+IHNlbnNvciBPVlhYWFgiKTsKLQkJCVBERUJVRyhEX1BST0JFLCAiUHJvYmluZyBmb3Igc2Vuc29yIE9WMjY0MCBvciBPVjk2NTUiKTsKKwkJCVBERUJVRyhEX1BST0JFLCAiMHhmZiAtPiBPVlhYWFgiKTsKKwkJCVBERUJVRyhEX1BST0JFLCAicHJvYmluZyBmb3Igc2Vuc29yIE9WMjY0MCBvciBPVjk2NTUiKTsKIAogCQkJbmIyNiA9IG5iOTYgPSAwOwogCQkJZm9yIChudHJ5ID0gMDsgbnRyeSA8IDQ7IG50cnkrKykgewpAQCAtNzI4LDQwICs3MjcsMzggQEAKIAkJCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4NjAwMCwgMHg4MDBhLAogCQkJCQkJMCwgTlVMTCk7CiAJCQkJbXNsZWVwKDEwKTsKKwogCQkJCS8qIFdhaXQgZm9yIDI2KE9WMjY0MCkgb3IgOTYoT1Y5NjU1KSAqLwogCQkJCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDYwMDAsIDB4ODAwYSwKIAkJCQkJCTEsICZwcm9iZSk7CiAKLQkJCQlQREVCVUcoRF9QUk9CRSwgIjJuZCBwcm9iZT0lMDJ4IiwgcHJvYmUpOwotCQkJCWlmIChwcm9iZSA9PSAweDAwKQotCQkJCQluYjI2Kys7CiAJCQkJaWYgKHByb2JlID09IDB4MjYgfHwgcHJvYmUgPT0gMHg0MCkgeworCQkJCQlQREVCVUcoRF9QUk9CRSwKKwkJCQkJCSJwcm9iZT0weCUwMnggLT4gT1YyNjQwIiwKKwkJCQkJCXByb2JlKTsKIAkJCQkJc2QtPnNlbnNvciA9IElEX09WMjY0MDsKIAkJCQkJbmIyNiArPSA0OwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJaWYgKHByb2JlID09IDB4OTYgfHwgcHJvYmUgPT0gMHg1NSkgeworCQkJCQlQREVCVUcoRF9QUk9CRSwKKwkJCQkJCSJwcm9iZT0weCUwMnggLT4gT1Y5NjU1IiwKKwkJCQkJCXByb2JlKTsKIAkJCQkJc2QtPnNlbnNvciA9IElEX09WOTY1NTsKIAkJCQkJbmI5NiArPSA0OwogCQkJCQlicmVhazsKIAkJCQl9CisJCQkJUERFQlVHKERfUFJPQkUsICJwcm9iZT0weCUwMngiLCBwcm9iZSk7CisJCQkJaWYgKHByb2JlID09IDB4MDApCisJCQkJCW5iMjYrKzsKIAkJCQlpZiAocHJvYmUgPT0gMHhmZikKIAkJCQkJbmI5NisrOwogCQkJCW1zbGVlcCgzKTsKIAkJCX0KLQkJCWlmIChuYjI2IDwgNCAmJiBuYjk2IDwgNCkgewotCQkJCVBERUJVRyhEX1BST0JFLCAiTm8gcmVsZXZhbnQgYW5zd2VyICIpOwotCQkJCVBERUJVRyhEX1BST0JFLCAiKiAxLjNNcGl4ZWxzIC0+IHVzZSBPVjk2NTUiKTsKLQkJCQlQREVCVUcoRF9QUk9CRSwgIiogMi4wTXBpeGVscyAtPiB1c2UgT1YyNjQwIik7Ci0JCQkJUERFQlVHKERfUFJPQkUsCi0JCQkJCSJUbyBmb3JjZSBhIHNlbnNvciwgYWRkIHRoYXQgbGluZSB0byAiCi0JCQkJCSIvZXRjL21vZHByb2JlLmQvb3B0aW9ucy5jb25mOiIpOwotCQkJCVBERUJVRyhEX1BST0JFLCAib3B0aW9ucyBnc3BjYV9nbDg2MCAiCi0JCQkJCSJzZW5zb3I9XCJPVjI2NDBcIiBvciBcIk9WOTY1NVwiIik7CisJCQlpZiAobmIyNiA8IDQgJiYgbmI5NiA8IDQpCiAJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgeyAvKiBwcm9iZSA9IDAgKi8KLQkJCVBERUJVRyhEX1BST0JFLCAiTm8gMHhmZiAtPiBzZW5zb3IgTUkyMDIwIik7CisJCX0gZWxzZSB7CisJCQlQREVCVUcoRF9QUk9CRSwgIk5vdCBhbnkgMHhmZiAtPiBNSTIwMjAiKTsKIAkJCXNkLT5zZW5zb3IgPSBJRF9NSTIwMjA7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmgKaW5kZXggY2VmNGUyNC4uMzA1MDYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuaApAQCAtMSw2ICsxLDcgQEAKLS8qIEBmaWxlIGdsODYwLmgKLSAqIEBhdXRob3IgT2xpdmllciBMT1JJTiwgdGlyw6kgZHUgcGlsb3RlIFN5bnRlayBwYXIgTmljb2xhcyBWSVZJRU4KLSAqIEBkYXRlIDIwMDktMDgtMjcKKy8qIEdTUENBIHN1YmRyaXZlcnMgZm9yIEdlbmVzeXMgTG9naWMgd2ViY2FtcyB3aXRoIHRoZSBHTDg2MCBjaGlwCisgKiBTdWJkcml2ZXIgZGVjbGFyYXRpb25zCisgKgorICogMjAwOS8xMC8xNCBPbGl2aWVyIExPUklOIDxvLmxvcmluQGxhcG9zdGUubmV0PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCmluZGV4IDIzZDNmYjcuLjQwNzZmOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiR1NQQ0EgVVNCIENhbWVyYSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTl9OVU1CRVIJS0VSTkVMX1ZFUlNJT04oMiwgNywgMCkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT05fTlVNQkVSCUtFUk5FTF9WRVJTSU9OKDIsIDgsIDApCiAKICNpZmRlZiBHU1BDQV9ERUJVRwogaW50IGdzcGNhX2RlYnVnID0gRF9FUlIgfCBEX1BST0JFOwpAQCAtNzQsNyArNzQsNyBAQAogI2RlZmluZSBQREVCVUdfTU9ERSh0eHQsIHBpeGZtdCwgdywgaCkKICNlbmRpZgogCi0vKiBzcGVjaWZpYyBtZW1vcnkgdHlwZXMgLSAhISBzaG91bGQgZGlmZmVyZW50IGZyb20gVjRMMl9NRU1PUllfeHh4ICovCisvKiBzcGVjaWZpYyBtZW1vcnkgdHlwZXMgLSAhISBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gVjRMMl9NRU1PUllfeHh4ICovCiAjZGVmaW5lIEdTUENBX01FTU9SWV9OTyAwCS8qIFY0TDJfTUVNT1JZX3h4eCBzdGFydHMgZnJvbSAxICovCiAjZGVmaW5lIEdTUENBX01FTU9SWV9SRUFEIDcKIApAQCAtMTI2LDcgKzEyNiw2IEBACiBzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwogCXU4ICpkYXRhOwkJLyogYWRkcmVzcyBvZiBkYXRhIGluIHRoZSBpc28gbWVzc2FnZSAqLwogCWludCBpLCBsZW4sIHN0OwogCWNhbV9wa3Rfb3AgcGt0X3NjYW47CkBAIC0xMzUsMjEgKzEzNCwxNiBAQAogCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikKIAkJCXJldHVybjsJCS8qIGRpc2Nvbm5lY3Rpb24gKi8KICNpZmRlZiBDT05GSUdfUE0KLQkJaWYgKCFnc3BjYV9kZXYtPmZyb3plbikKKwkJaWYgKGdzcGNhX2Rldi0+ZnJvemVuKQorCQkJcmV0dXJuOwogI2VuZGlmCi0JCQlQREVCVUcoRF9FUlJ8RF9QQUNLLCAidXJiIHN0YXR1czogJWQiLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybjsKKwkJUERFQlVHKERfRVJSfERfUEFDSywgInVyYiBzdGF0dXM6ICVkIiwgdXJiLT5zdGF0dXMpOworCQl1cmItPnN0YXR1cyA9IDA7CisJCWdvdG8gcmVzdWJtaXQ7CiAJfQogCXBrdF9zY2FuID0gZ3NwY2FfZGV2LT5zZF9kZXNjLT5wa3Rfc2NhbjsKIAlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CiAKLQkJLyogY2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZnJhbWUgYnVmZmVyICovCi0JCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKLQkJaWYgKCFmcmFtZSkgewotCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7Ci0JCQlicmVhazsKLQkJfQotCiAJCS8qIGNoZWNrIHRoZSBwYWNrZXQgc3RhdHVzIGFuZCBsZW5ndGggKi8KIAkJbGVuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOwogCQlpZiAobGVuID09IDApIHsKQEAgLTE3MSw5ICsxNjUsMTAgQEAKIAkJCWksIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0LCBsZW4pOwogCQlkYXRhID0gKHU4ICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyCiAJCQkJCSsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7Ci0JCXBrdF9zY2FuKGdzcGNhX2RldiwgZnJhbWUsIGRhdGEsIGxlbik7CisJCXBrdF9zY2FuKGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKIAl9CiAKK3Jlc3VibWl0OgogCS8qIHJlc3VibWl0IHRoZSBVUkIgKi8KIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0IDwgMCkKQEAgLTIwMSw3ICsxOTYsNiBAQAogc3RhdGljIHZvaWQgYnVsa19pcnEoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9IChzdHJ1Y3QgZ3NwY2FfZGV2ICopIHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwogCWludCBzdDsKIAogCVBERUJVRyhEX1BBQ0ssICJidWxrIGlycSIpOwpAQCAtMjEyLDI5ICsyMDYsMjIgQEAKIAkJYnJlYWs7CiAJY2FzZSAtRVNIVVRET1dOOgogCQlyZXR1cm47CQkvKiBkaXNjb25uZWN0aW9uICovCi0JY2FzZSAtRUNPTk5SRVNFVDoKLQkJdXJiLT5zdGF0dXMgPSAwOwotCQlicmVhazsKIAlkZWZhdWx0OgogI2lmZGVmIENPTkZJR19QTQotCQlpZiAoIWdzcGNhX2Rldi0+ZnJvemVuKQorCQlpZiAoZ3NwY2FfZGV2LT5mcm96ZW4pCisJCQlyZXR1cm47CiAjZW5kaWYKLQkJCVBERUJVRyhEX0VSUnxEX1BBQ0ssICJ1cmIgc3RhdHVzOiAlZCIsIHVyYi0+c3RhdHVzKTsKLQkJcmV0dXJuOworCQlQREVCVUcoRF9FUlJ8RF9QQUNLLCAidXJiIHN0YXR1czogJWQiLCB1cmItPnN0YXR1cyk7CisJCXVyYi0+c3RhdHVzID0gMDsKKwkJZ290byByZXN1Ym1pdDsKIAl9CiAKLQkvKiBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBmcmFtZSBidWZmZXIgKi8KLQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7Ci0JaWYgKCFmcmFtZSkgewotCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQl9IGVsc2UgewotCQlQREVCVUcoRF9QQUNLLCAicGFja2V0IGw6JWQiLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCQlnc3BjYV9kZXYtPnNkX2Rlc2MtPnBrdF9zY2FuKGdzcGNhX2RldiwKLQkJCQkJZnJhbWUsCi0JCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLAotCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOwotCX0KKwlQREVCVUcoRF9QQUNLLCAicGFja2V0IGw6JWQiLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWdzcGNhX2Rldi0+c2RfZGVzYy0+cGt0X3NjYW4oZ3NwY2FfZGV2LAorCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKK3Jlc3VibWl0OgogCS8qIHJlc3VibWl0IHRoZSBVUkIgKi8KIAlpZiAoZ3NwY2FfZGV2LT5jYW0uYnVsa19udXJicyAhPSAwKSB7CiAJCXN0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKQEAgLTI1NSwyNCArMjQyLDI3IEBACiAgKiBESVNDQVJEX1BBQ0tFVCBpbnZhbGlkYXRlcyB0aGUgd2hvbGUgZnJhbWUuCiAgKiBPbiBMQVNUX1BBQ0tFVCwgYSBuZXcgZnJhbWUgaXMgcmV0dXJuZWQuCiAgKi8KLXN0cnVjdCBnc3BjYV9mcmFtZSAqZ3NwY2FfZnJhbWVfYWRkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCQkgICAgZW51bSBnc3BjYV9wYWNrZXRfdHlwZSBwYWNrZXRfdHlwZSwKLQkJCQkgICAgc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwKLQkJCQkgICAgY29uc3QgX191OCAqZGF0YSwKLQkJCQkgICAgaW50IGxlbikKK3ZvaWQgZ3NwY2FfZnJhbWVfYWRkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWVudW0gZ3NwY2FfcGFja2V0X3R5cGUgcGFja2V0X3R5cGUsCisJCQljb25zdCB1OCAqZGF0YSwKKwkJCWludCBsZW4pCiB7CisJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZTsKIAlpbnQgaSwgajsKIAogCVBERUJVRyhEX1BBQ0ssICJhZGQgdDolZCBsOiVkIiwJcGFja2V0X3R5cGUsIGxlbik7CiAKKwkvKiBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBmcmFtZSBidWZmZXIgKi8KKwlmcmFtZSA9IGdzcGNhX2Rldi0+Y3VyX2ZyYW1lOworCWlmICgoZnJhbWUtPnY0bDJfYnVmLmZsYWdzICYgQlVGX0FMTF9GTEFHUykKKwkJCQkJIT0gVjRMMl9CVUZfRkxBR19RVUVVRUQpIHsKKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCXJldHVybjsKKwl9CisKIAkvKiB3aGVuIHN0YXJ0IG9mIGEgbmV3IGZyYW1lLCBpZiB0aGUgY3VycmVudCBmcmFtZSBidWZmZXIKIAkgKiBpcyBub3QgcXVldWVkLCBkaXNjYXJkIHRoZSB3aG9sZSBmcmFtZSAqLwogCWlmIChwYWNrZXRfdHlwZSA9PSBGSVJTVF9QQUNLRVQpIHsKLQkJaWYgKChmcmFtZS0+djRsMl9idWYuZmxhZ3MgJiBCVUZfQUxMX0ZMQUdTKQotCQkJCQkJIT0gVjRMMl9CVUZfRkxBR19RVUVVRUQpIHsKLQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwotCQkJcmV0dXJuIGZyYW1lOwotCQl9CiAJCWZyYW1lLT5kYXRhX2VuZCA9IGZyYW1lLT5kYXRhOwogCQlqaWZmaWVzX3RvX3RpbWV2YWwoZ2V0X2ppZmZpZXNfNjQoKSwKIAkJCQkgICAmZnJhbWUtPnY0bDJfYnVmLnRpbWVzdGFtcCk7CkBAIC0yODAsNyArMjcwLDcgQEAKIAl9IGVsc2UgaWYgKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9PSBESVNDQVJEX1BBQ0tFVCkgewogCQlpZiAocGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQpCiAJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBwYWNrZXRfdHlwZTsKLQkJcmV0dXJuIGZyYW1lOworCQlyZXR1cm47CiAJfQogCiAJLyogYXBwZW5kIHRoZSBwYWNrZXQgdG8gdGhlIGZyYW1lIGJ1ZmZlciAqLwpAQCAtMzEyLDkgKzMwMiw5IEBACiAJCQlpLAogCQkJZ3NwY2FfZGV2LT5mcl9vKTsKIAkJaiA9IGdzcGNhX2Rldi0+ZnJfcXVldWVbaV07Ci0JCWZyYW1lID0gJmdzcGNhX2Rldi0+ZnJhbWVbal07CisJCWdzcGNhX2Rldi0+Y3VyX2ZyYW1lID0gJmdzcGNhX2Rldi0+ZnJhbWVbal07CiAJfQotCXJldHVybiBmcmFtZTsKKwlyZXR1cm47CiB9CiBFWFBPUlRfU1lNQk9MKGdzcGNhX2ZyYW1lX2FkZCk7CiAKQEAgLTM5NSw2ICszODUsNyBAQAogCQlmcmFtZS0+djRsMl9idWYubS5vZmZzZXQgPSBpICogZnJzejsKIAl9CiAJZ3NwY2FfZGV2LT5mcl9pID0gZ3NwY2FfZGV2LT5mcl9vID0gZ3NwY2FfZGV2LT5mcl9xID0gMDsKKwlnc3BjYV9kZXYtPmN1cl9mcmFtZSA9ICZnc3BjYV9kZXYtPmZyYW1lWzBdOwogCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCWdzcGNhX2Rldi0+c2VxdWVuY2UgPSAwOwogCXJldHVybiAwOwpAQCAtNDc1LDEwICs0NjYsMTggQEAKIAl4ZmVyID0gZ3NwY2FfZGV2LT5jYW0uYnVsayA/IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKIAkJCQkgICA6IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M7CiAJaSA9IGdzcGNhX2Rldi0+YWx0OwkJCS8qIHByZXZpb3VzIGFsdCBzZXR0aW5nICovCi0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCWVwID0gYWx0X3hmZXIoJmludGYtPmFsdHNldHRpbmdbaV0sIHhmZXIpOwotCQlpZiAoZXApCi0JCQlicmVhazsKKwlpZiAoZ3NwY2FfZGV2LT5jYW0ucmV2ZXJzZV9hbHRzKSB7CisJCXdoaWxlICgrK2kgPCBnc3BjYV9kZXYtPm5iYWx0KSB7CisJCQllcCA9IGFsdF94ZmVyKCZpbnRmLT5hbHRzZXR0aW5nW2ldLCB4ZmVyKTsKKwkJCWlmIChlcCkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgtLWkgPj0gMCkgeworCQkJZXAgPSBhbHRfeGZlcigmaW50Zi0+YWx0c2V0dGluZ1tpXSwgeGZlcik7CisJCQlpZiAoZXApCisJCQkJYnJlYWs7CisJCX0KIAl9CiAJaWYgKGVwID09IE5VTEwpIHsKIAkJZXJyKCJubyB0cmFuc2ZlciBlbmRwb2ludCBmb3VuZCIpOwpAQCAtNTk5LDcgKzU5OCwxMSBAQAogCiAJLyogc2V0IHRoZSBoaWdoZXIgYWx0ZXJuYXRlIHNldHRpbmcgYW5kCiAJICogbG9vcCB1bnRpbCB1cmIgc3VibWl0IHN1Y2NlZWRzICovCi0JZ3NwY2FfZGV2LT5hbHQgPSBnc3BjYV9kZXYtPm5iYWx0OworCWlmIChnc3BjYV9kZXYtPmNhbS5yZXZlcnNlX2FsdHMpCisJCWdzcGNhX2Rldi0+YWx0ID0gMDsKKwllbHNlCisJCWdzcGNhX2Rldi0+YWx0ID0gZ3NwY2FfZGV2LT5uYmFsdDsKKwogCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdCkgewogCQlyZXQgPSBnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdChnc3BjYV9kZXYpOwogCQlpZiAocmV0IDwgMCkKQEAgLTY0MSwxNSArNjQ0LDE5IEBACiAJCX0KIAkJaWYgKHJldCA+PSAwKQogCQkJYnJlYWs7Ci0JCVBERUJVRyhEX0VSUnxEX1NUUkVBTSwKLQkJCSJ1c2Jfc3VibWl0X3VyYiBhbHQgJWQgZXJyICVkIiwgZ3NwY2FfZGV2LT5hbHQsIHJldCk7CiAJCWdzcGNhX2Rldi0+c3RyZWFtaW5nID0gMDsKIAkJZGVzdHJveV91cmJzKGdzcGNhX2Rldik7Ci0JCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJaWYgKHJldCAhPSAtRU5PU1BDKSB7CisJCQlQREVCVUcoRF9FUlJ8RF9TVFJFQU0sCisJCQkJInVzYl9zdWJtaXRfdXJiIGFsdCAlZCBlcnIgJWQiLAorCQkJCWdzcGNhX2Rldi0+YWx0LCByZXQpOwogCQkJZ290byBvdXQ7CisJCX0KIAogCQkvKiB0aGUgYmFuZHdpZHRoIGlzIG5vdCB3aWRlIGVub3VnaAogCQkgKiBuZWdvY2lhdGUgb3IgdHJ5IGEgbG93ZXIgYWx0ZXJuYXRlIHNldHRpbmcgKi8KKwkJUERFQlVHKERfRVJSfERfU1RSRUFNLAorCQkJImJhbmR3aWR0aCBub3Qgd2lkZSBlbm91Z2ggLSB0cnlpbmcgYWdhaW4iKTsKIAkJbXNsZWVwKDIwKTsJLyogd2FpdCBmb3Iga2lsbCBjb21wbGV0ZSAqLwogCQlpZiAoZ3NwY2FfZGV2LT5zZF9kZXNjLT5pc29jX25lZ28pIHsKIAkJCXJldCA9IGdzcGNhX2Rldi0+c2RfZGVzYy0+aXNvY19uZWdvKGdzcGNhX2Rldik7CkBAIC05ODAsNyArOTg3LDcgQEAKIHsKIAlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSBjb250YWluZXJfb2YodmZkLCBzdHJ1Y3QgZ3NwY2FfZGV2LCB2ZGV2KTsKIAotCVBERUJVRyhEX1NUUkVBTSwgImRldmljZSByZWxlYXNlZCIpOworCVBERUJVRyhEX1BST0JFLCAiL2Rldi92aWRlbyVkIHJlbGVhc2VkIiwgZ3NwY2FfZGV2LT52ZGV2Lm51bSk7CiAKIAlrZnJlZShnc3BjYV9kZXYtPnVzYl9idWYpOwogCWtmcmVlKGdzcGNhX2Rldik7CkBAIC05OTEsNyArOTk4LDcgQEAKIAlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXY7CiAJaW50IHJldDsKIAotCVBERUJVRyhEX1NUUkVBTSwgIiVzIG9wZW4iLCBjdXJyZW50LT5jb21tKTsKKwlQREVCVUcoRF9TVFJFQU0sICJbJXNdIG9wZW4iLCBjdXJyZW50LT5jb21tKTsKIAlnc3BjYV9kZXYgPSAoc3RydWN0IGdzcGNhX2RldiAqKSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdzcGNhX2Rldi0+cXVldWVfbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0xMDM3LDcgKzEwNDQsNyBAQAogewogCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCVBERUJVRyhEX1NUUkVBTSwgIiVzIGNsb3NlIiwgY3VycmVudC0+Y29tbSk7CisJUERFQlVHKERfU1RSRUFNLCAiWyVzXSBjbG9zZSIsIGN1cnJlbnQtPmNvbW0pOwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdzcGNhX2Rldi0+cXVldWVfbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJZ3NwY2FfZGV2LT51c2Vycy0tOwpAQCAtMTEzOCwxMCArMTE0NSwxMyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJY3RybHMgPSBnZXRfY3RybChnc3BjYV9kZXYsIGlkKTsKKwkJaSA9IGN0cmxzIC0gZ3NwY2FfZGV2LT5zZF9kZXNjLT5jdHJsczsKIAl9CiAJaWYgKGN0cmxzID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCW1lbWNweShxX2N0cmwsIGN0cmxzLCBzaXplb2YgKnFfY3RybCk7CisJaWYgKGdzcGNhX2Rldi0+Y3RybF9pbmFjICYgKDEgPDwgaSkpCisJCXFfY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MDMsNyArMTYxMyw3IEBACiAJCXNpemUgLT0gUEFHRV9TSVpFOwogCX0KIAotCXZtYS0+dm1fb3BzID0gJmdzcGNhX3ZtX29wczsKKwl2bWEtPnZtX29wcyA9IChzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKikgJmdzcGNhX3ZtX29wczsKIAl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IGZyYW1lOwogCWdzcGNhX3ZtX29wZW4odm1hKTsKIAlyZXQgPSAwOwpAQCAtMjAwMSwxMSArMjAxMSwxNSBAQAogCVBERUJVRyhEX1BST0JFLCAicHJvYmluZyAlMDR4OiUwNHgiLCBpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOwogCiAJLyogd2UgZG9uJ3QgaGFuZGxlIG11bHRpLWNvbmZpZyBjYW1lcmFzICovCi0JaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKKwlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKSB7CisJCVBERUJVRyhEX0VSUiwgIlRvbyBtYW55IGNvbmZpZyIpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJaW50ZXJmYWNlID0gJmludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjOwotCWlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXIgPiAwKQorCWlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXIgPiAwKSB7CisJCVBERUJVRyhEX0VSUiwgImludGYgIT0gMCIpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAkvKiBjcmVhdGUgdGhlIGRldmljZSAqLwogCWlmIChkZXZfc2l6ZSA8IHNpemVvZiAqZ3NwY2FfZGV2KQpAQCAtMjA1OSw3ICsyMDczLDcgQEAKIAl9CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGdzcGNhX2Rldik7Ci0JUERFQlVHKERfUFJPQkUsICJwcm9iZSBvayIpOworCVBERUJVRyhEX1BST0JFLCAiL2Rldi92aWRlbyVkIGNyZWF0ZWQiLCBnc3BjYV9kZXYtPnZkZXYubnVtKTsKIAlyZXR1cm4gMDsKIG91dDoKIAlrZnJlZShnc3BjYV9kZXYtPnVzYl9idWYpOwpAQCAtMjA3OCw2ICsyMDkyLDcgQEAKIHsKIAlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCisJUERFQlVHKERfUFJPQkUsICIvZGV2L3ZpZGVvJWQgZGlzY29ubmVjdCIsIGdzcGNhX2Rldi0+dmRldi5udW0pOwogCW11dGV4X2xvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOwogCWdzcGNhX2Rldi0+cHJlc2VudCA9IDA7CiAKQEAgLTIwOTYsNyArMjExMSw3IEBACiAJLyogKHRoaXMgd2lsbCBjYWxsIGdzcGNhX3JlbGVhc2UoKSBpbW1lZGlhdGx5IG9yIG9uIGxhc3QgY2xvc2UpICovCiAJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmdzcGNhX2Rldi0+dmRldik7CiAKLQlQREVCVUcoRF9QUk9CRSwgImRpc2Nvbm5lY3QgY29tcGxldGUiKTsKKy8qCVBERUJVRyhEX1BST0JFLCAiZGlzY29ubmVjdCBjb21wbGV0ZSIpOyAqLwogfQogRVhQT1JUX1NZTUJPTChnc3BjYV9kaXNjb25uZWN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oCmluZGV4IDcwYjFmZDguLjE4MTYxNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmgKQEAgLTU4LDYgKzU4LDcgQEAKIAl1OCBucGt0OwkJLyogbnVtYmVyIG9mIHBhY2tldHMgaW4gYW4gSVNPQyBtZXNzYWdlCiAJCQkJICogMCBpcyB0aGUgZGVmYXVsdCB2YWx1ZTogMzIgcGFja2V0cyAqLwogCXUzMiBpbnB1dF9mbGFnczsJLyogdmFsdWUgZm9yIEVOVU1fSU5QVVQgc3RhdHVzIGZsYWdzICovCisJY2hhciByZXZlcnNlX2FsdHM7CS8qIEFsdCBzZXR0aW5ncyBhcmUgaW4gaGlnaCB0byBsb3cgb3JkZXIgKi8KIH07CiAKIHN0cnVjdCBnc3BjYV9kZXY7CkBAIC03OCw4ICs3OSw3IEBACiB0eXBlZGVmIGludCAoKmNhbV9xbW51X29wKSAoc3RydWN0IGdzcGNhX2RldiAqLAogCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICopOwogdHlwZWRlZiB2b2lkICgqY2FtX3BrdF9vcCkgKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAotCQkJCV9fdTggKmRhdGEsCisJCQkJdTggKmRhdGEsCiAJCQkJaW50IGxlbik7CiAKIHN0cnVjdCBjdHJsIHsKQEAgLTE0Miw2ICsxNDIsNyBAQAogCXN0cnVjdCBjYW0gY2FtOwkJCQkvKiBkZXZpY2UgaW5mb3JtYXRpb24gKi8KIAljb25zdCBzdHJ1Y3Qgc2RfZGVzYyAqc2RfZGVzYzsJCS8qIHN1YmRyaXZlciBkZXNjcmlwdGlvbiAqLwogCXVuc2lnbmVkIGN0cmxfZGlzOwkJLyogZGlzYWJsZWQgY29udHJvbHMgKGJpdCBtYXApICovCisJdW5zaWduZWQgY3RybF9pbmFjOwkJLyogaW5hY3RpdmUgY29udHJvbHMgKGJpdCBtYXApICovCiAKICNkZWZpbmUgVVNCX0JVRl9TWiA2NAogCV9fdTggKnVzYl9idWY7CQkJCS8qIGJ1ZmZlciBmb3IgVVNCIGV4Y2hhbmdlcyAqLwpAQCAtMTQ5LDYgKzE1MCw3IEBACiAKIAlfX3U4ICpmcmJ1ZjsJCQkJLyogYnVmZmVyIGZvciBuZnJhbWVzICovCiAJc3RydWN0IGdzcGNhX2ZyYW1lIGZyYW1lW0dTUENBX01BWF9GUkFNRVNdOworCXN0cnVjdCBnc3BjYV9mcmFtZSAqY3VyX2ZyYW1lOwkJLyogZnJhbWUgYmVlaW5nIGZpbGxlZCAqLwogCV9fdTMyIGZyc3o7CQkJCS8qIGZyYW1lIHNpemUgKi8KIAljaGFyIG5mcmFtZXM7CQkJCS8qIG51bWJlciBvZiBmcmFtZXMgKi8KIAljaGFyIGZyX2k7CQkJCS8qIGZyYW1lIGJlaW5nIGZpbGxlZCAqLwpAQCAtMTg5LDExICsxOTEsMTAgQEAKIAkJaW50IGRldl9zaXplLAogCQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOwogdm9pZCBnc3BjYV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLXN0cnVjdCBnc3BjYV9mcmFtZSAqZ3NwY2FfZnJhbWVfYWRkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCQkgICAgZW51bSBnc3BjYV9wYWNrZXRfdHlwZSBwYWNrZXRfdHlwZSwKLQkJCQkgICAgc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwKLQkJCQkgICAgY29uc3QgX191OCAqZGF0YSwKLQkJCQkgICAgaW50IGxlbik7Cit2b2lkIGdzcGNhX2ZyYW1lX2FkZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQllbnVtIGdzcGNhX3BhY2tldF90eXBlIHBhY2tldF90eXBlLAorCQkJY29uc3QgdTggKmRhdGEsCisJCQlpbnQgbGVuKTsKIHN0cnVjdCBnc3BjYV9mcmFtZSAqZ3NwY2FfZ2V0X2lfZnJhbWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKICNpZmRlZiBDT05GSUdfUE0KIGludCBnc3BjYV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2plaWxpbmouYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvamVpbGluai5jCmluZGV4IGExMWM5N2UuLjIwMTliMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvamVpbGluai5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvamVpbGluai5jCkBAIC0xODEsMTEgKzE4MSw5IEBACiB7CiAJc3RydWN0IHNkICpkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNkLCB3b3JrX3N0cnVjdCk7CiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gJmRldi0+Z3NwY2FfZGV2OwotCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7CiAJaW50IGJsb2Nrc19sZWZ0OyAvKiAweDIwMC1zaXplZCBibG9ja3MgcmVtYWluaW5nIGluIGN1cnJlbnQgZnJhbWUuICovCiAJaW50IHNpemVfaW5fYmxvY2tzOwogCWludCBhY3RfbGVuOwotCWludCBkaXNjYXJkaW5nID0gMDsgLyogdHJ1ZSBpZiB3ZSBmYWlsZWQgdG8gZ2V0IHNwYWNlIGZvciBmcmFtZS4gKi8KIAlpbnQgcGFja2V0X3R5cGU7CiAJaW50IHJldDsKIAl1OCAqYnVmZmVyOwpAQCAtMTk2LDE1ICsxOTQsNiBAQAogCQlnb3RvIHF1aXRfc3RyZWFtOwogCX0KIAl3aGlsZSAoZ3NwY2FfZGV2LT5wcmVzZW50ICYmIGdzcGNhX2Rldi0+c3RyZWFtaW5nKSB7Ci0JCWlmICghZ3NwY2FfZGV2LT5wcmVzZW50KQotCQkJZ290byBxdWl0X3N0cmVhbTsKLQkJLyogU3RhcnQgYSBuZXcgZnJhbWUsIGFuZCBhZGQgdGhlIEpQRUcgaGVhZGVyLCBmaXJzdCB0aGluZyAqLwotCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7Ci0JCWlmIChmcmFtZSAmJiAhZGlzY2FyZGluZykKLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsCi0JCQkJCWRldi0+anBlZ19oZHIsIEpQRUdfSERSX1NaKTsKLQkJIGVsc2UKLQkJCWRpc2NhcmRpbmcgPSAxOwogCQkvKgogCQkgKiBOb3cgcmVxdWVzdCBkYXRhIGJsb2NrIDAuIExpbmUgMCByZXBvcnRzIHRoZSBzaXplCiAJCSAqIHRvIGRvd25sb2FkLCBpbiBibG9ja3Mgb2Ygc2l6ZSAweDIwMCwgYW5kIGFsc28gdGVsbHMgdGhlCkBAIC0yMjIsMTQgKzIxMSwxNSBAQAogCQlzaXplX2luX2Jsb2NrcyA9IGJ1ZmZlclsweDBhXTsKIAkJYmxvY2tzX2xlZnQgPSBidWZmZXJbMHgwYV0gLSAxOwogCQlQREVCVUcoRF9TVFJFQU0sICJibG9ja3NfbGVmdCA9IDB4JXgiLCBibG9ja3NfbGVmdCk7Ci0JCXBhY2tldF90eXBlID0gSU5URVJfUEFDS0VUOwotCQlpZiAoZnJhbWUgJiYgIWRpc2NhcmRpbmcpCi0JCQkvKiBUb3NzIGxpbmUgMCBvZiBkYXRhIGJsb2NrIDAsIGtlZXAgdGhlIHJlc3QuICovCi0JCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBwYWNrZXRfdHlwZSwKLQkJCQlmcmFtZSwgYnVmZmVyICsgRlJBTUVfSEVBREVSX0xFTiwKKworCQkvKiBTdGFydCBhIG5ldyBmcmFtZSwgYW5kIGFkZCB0aGUgSlBFRyBoZWFkZXIsIGZpcnN0IHRoaW5nICovCisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKKwkJCQlkZXYtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CisJCS8qIFRvc3MgbGluZSAwIG9mIGRhdGEgYmxvY2sgMCwga2VlcCB0aGUgcmVzdC4gKi8KKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQkJCWJ1ZmZlciArIEZSQU1FX0hFQURFUl9MRU4sCiAJCQkJSkVJTElOSl9NQVhfVFJBTlNGRVIgLSBGUkFNRV9IRUFERVJfTEVOKTsKLQkJCWVsc2UKLQkJCQlkaXNjYXJkaW5nID0gMTsKKwogCQl3aGlsZSAoYmxvY2tzX2xlZnQgPiAwKSB7CiAJCQlpZiAoIWdzcGNhX2Rldi0+cHJlc2VudCkKIAkJCQlnb3RvIHF1aXRfc3RyZWFtOwpAQCAtMjQ2LDEyICsyMzYsOCBAQAogCQkJCXBhY2tldF90eXBlID0gTEFTVF9QQUNLRVQ7CiAJCQllbHNlCiAJCQkJcGFja2V0X3R5cGUgPSBJTlRFUl9QQUNLRVQ7Ci0JCQlpZiAoZnJhbWUgJiYgIWRpc2NhcmRpbmcpCi0JCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUsCi0JCQkJCQlmcmFtZSwgYnVmZmVyLAotCQkJCQkJSkVJTElOSl9NQVhfVFJBTlNGRVIpOwotCQkJZWxzZQotCQkJCWRpc2NhcmRpbmcgPSAxOworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUsCisJCQkJCWJ1ZmZlciwgSkVJTElOSl9NQVhfVFJBTlNGRVIpOwogCQl9CiAJfQogcXVpdF9zdHJlYW06CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCmluZGV4IDdmMWU1NDEuLjg0NGZjMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCkBAIC0yNzQsOCArMjc0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgbTU2MDJfdXJiX2NvbXBsZXRlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCi0JCQlfX3U4ICpkYXRhLCBpbnQgbGVuKQorCQkJCXU4ICpkYXRhLCBpbnQgbGVuKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIApAQCAtMjk1LDE5ICsyOTQsMjcgQEAKIAkJbGVuIC09IDY7CiAKIAkJLyogQ29tcGxldGUgdGhlIGxhc3QgZnJhbWUgKGlmIGFueSkgKi8KLQkJZnJhbWUgPSBnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKLQkJCQkJZnJhbWUsIGRhdGEsIDApOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKKwkJCQlOVUxMLCAwKTsKIAkJc2QtPmZyYW1lX2NvdW50Kys7CiAKIAkJLyogQ3JlYXRlIGEgbmV3IGZyYW1lICovCi0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIAogCQlQREVCVUcoRF9GUkFNLCAiU3RhcnRpbmcgbmV3IGZyYW1lICVkIiwKIAkJICAgICAgIHNkLT5mcmFtZV9jb3VudCk7CiAKIAl9IGVsc2UgewotCQlpbnQgY3VyX2ZyYW1lX2xlbiA9IGZyYW1lLT5kYXRhX2VuZCAtIGZyYW1lLT5kYXRhOworCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOworCQlpbnQgY3VyX2ZyYW1lX2xlbjsKIAorCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7CisJCWlmIChmcmFtZSA9PSBOVUxMKSB7CisJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKKwkJCXJldHVybjsKKwkJfQorCisJCWN1cl9mcmFtZV9sZW4gPSBmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YTsKIAkJLyogUmVtb3ZlIHVyYiBoZWFkZXIgKi8KIAkJZGF0YSArPSA0OwogCQlsZW4gLT0gNDsKQEAgLTMxNiwxMiArMzIzLDEyIEBACiAJCQlQREVCVUcoRF9GUkFNLCAiQ29udGludWluZyBmcmFtZSAlZCBjb3B5aW5nICVkIGJ5dGVzIiwKIAkJCSAgICAgICBzZC0+ZnJhbWVfY291bnQsIGxlbik7CiAKLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCiAJCQkJCWRhdGEsIGxlbik7CiAJCX0gZWxzZSBpZiAoZnJhbWUtPnY0bDJfYnVmLmxlbmd0aCAtIGN1cl9mcmFtZV9sZW4gPiAwKSB7CiAJCQkvKiBBZGQgdGhlIHJlbWFpbmluZyBkYXRhIHVwIHRvIGZyYW1lIHNpemUgKi8KLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsCi0JCQkJCWZyYW1lLT52NGwyX2J1Zi5sZW5ndGggLSBjdXJfZnJhbWVfbGVuKTsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwKKwkJCQkgICAgZnJhbWUtPnY0bDJfYnVmLmxlbmd0aCAtIGN1cl9mcmFtZV9sZW4pOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tYXJzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYwppbmRleCBkZTc2OWNhLi45Y2Y4ZDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYwpAQCAtMzI1LDggKzMyNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwotCQkJX191OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLworCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CkBAIC0zNDgsMTEgKzM0NywxMSBAQAogCQkJICAgIHx8IGRhdGFbNSArIHBdID09IDB4NjcpIHsKIAkJCQlQREVCVUcoRF9QQUNLLCAic29mIG9mZnNldDogJWQgbGVuOiAlZCIsCiAJCQkJCXAsIGxlbik7Ci0JCQkJZnJhbWUgPSBnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKLQkJCQkJCQlmcmFtZSwgZGF0YSwgcCk7CisJCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCQlkYXRhLCBwKTsKIAogCQkJCS8qIHB1dCB0aGUgSlBFRyBoZWFkZXIgKi8KLQkJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLAorCQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKIAkJCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CiAJCQkJZGF0YSArPSBwICsgMTY7CiAJCQkJbGVuIC09IHAgKyAxNjsKQEAgLTM2MCw3ICszNTksNyBAQAogCQkJfQogCQl9CiAJfQotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogfQogCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21yOTczMTBhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21yOTczMTBhLmMKaW5kZXggZjgzMjhiOS4uMTI2ZDk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tcjk3MzEwYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbXI5NzMxMGEuYwpAQCAtMSwyMyArMSwzMCBAQAogLyoKICAqIE1hcnMgTVI5NzMxMEEgbGlicmFyeQogICoKKyAqIFRoZSBvcmlnaW5hbCBtcjk3MzEwYSBkcml2ZXIsIHdoaWNoIHN1cHBvcnRlZCB0aGUgQWlwdGVrIFBlbmNhbSBWR0ErLCBpcwogICogQ29weXJpZ2h0IChDKSAyMDA5IEt5bGUgR3Vpbm4gPGVseWswM0BnbWFpbC5jb20+CiAgKgogICogU3VwcG9ydCBmb3IgdGhlIE1SOTczMTBBIGNhbWVyYXMgaW4gYWRkaXRpb24gdG8gdGhlIEFpcHRlayBQZW5jYW0gVkdBKwogICogYW5kIGZvciB0aGUgcm91dGluZXMgZm9yIGRldGVjdGluZyBhbmQgY2xhc3NpZnlpbmcgdGhlc2UgdmFyaW91cyBjYW1lcmFzLAorICogaXMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZW9kb3JlIEtpbGdvcmUgPGtpbGdvdGFAYXVidXJuLmVkdT4KICAqCisgKiBTdXBwb3J0IGZvciB0aGUgY29udHJvbCBzZXR0aW5ncyBmb3IgdGhlIENJRiBjYW1lcmFzIGlzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSGFucyBkZSBHb2VkZSA8aGRnb2VkZUByZWRoYXQuY29tPiBhbmQKKyAqIFRob21hcyBLYWlzZXIgPHRob21hc0BrYWlzZXItbGludXgubGk+CisgKgorICogU3VwcG9ydCBmb3IgdGhlIGNvbnRyb2wgc2V0dGluZ3MgZm9yIHRoZSBWR0EgY2FtZXJhcyBpcwogICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZW9kb3JlIEtpbGdvcmUgPGtpbGdvdGFAYXVidXJuLmVkdT4KICAqCi0gKiBBY2tub3dsZWRnZW1lbnRzOgorICogU2V2ZXJhbCBwcmV2aW91c2x5IHVuc3VwcG9ydGVkIGNhbWVyYXMgYXJlIG93bmVkIGFuZCBoYXZlIGJlZW4gdGVzdGVkIGJ5CisgKiBIYW5zIGRlIEdvZWRlIDxoZGdvZWRlQHJlZGhhdC5jb20+IGFuZAorICogVGhvbWFzIEthaXNlciA8dGhvbWFzQGthaXNlci1saW51eC5saT4gYW5kCisgKiBUaGVvZG9yZSBLaWxnb3JlIDxraWxnb3RhQGF1YnVybi5lZHU+IGFuZAorICogRWRtb25kIFJvZHJpZ3VleiA8ZXJvZHJpZ185N0B5YWhvby5jb20+IGFuZAorICogQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgogICoKICAqIFRoZSBNUjk3MzExQSBzdXBwb3J0IGluIGdzcGNhL21hcnMuYyBoYXMgYmVlbiBoZWxwZnVsIGluIHVuZGVyc3RhbmRpbmcgc29tZQogICogb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGVzZSBjYW1lcmFzLgogICoKLSAqIEhhbnMgZGUgR29lZGUgPGhkZ29lZGVAcmVkaGF0LmNvbT4gYW5kCi0gKiBUaG9tYXMgS2Fpc2VyIDx0aG9tYXNAa2Fpc2VyLWxpbnV4LmxpPgotICogaGF2ZSBhc3Npc3RlZCB3aXRoIHRoZWlyIGV4cGVyaWVuY2UuIEVhY2ggb2YgdGhlbSBoYXMgYWxzbyBoZWxwZWQgYnkKLSAqIHRlc3RpbmcgYSBwcmV2aW91c2x5IHVuc3VwcG9ydGVkIGNhbWVyYS4KLSAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC00MCwxMSArNDcsOSBAQAogI2RlZmluZSBDQU1fVFlQRV9DSUYJCQkwCiAjZGVmaW5lIENBTV9UWVBFX1ZHQQkJCTEKIAotI2RlZmluZSBNUjk3MzEwQV9CUklHSFRORVNTX01JTgkJLTI1NAotI2RlZmluZSBNUjk3MzEwQV9CUklHSFRORVNTX01BWAkJMjU1CiAjZGVmaW5lIE1SOTczMTBBX0JSSUdIVE5FU1NfREVGQVVMVAkwCiAKLSNkZWZpbmUgTVI5NzMxMEFfRVhQT1NVUkVfTUlOCQkzMDAKKyNkZWZpbmUgTVI5NzMxMEFfRVhQT1NVUkVfTUlOCQkwCiAjZGVmaW5lIE1SOTczMTBBX0VYUE9TVVJFX01BWAkJNDA5NQogI2RlZmluZSBNUjk3MzEwQV9FWFBPU1VSRV9ERUZBVUxUCTEwMDAKIApAQCAtNTIsNiArNTcsMTAgQEAKICNkZWZpbmUgTVI5NzMxMEFfR0FJTl9NQVgJCTMxCiAjZGVmaW5lIE1SOTczMTBBX0dBSU5fREVGQVVMVAkJMjUKIAorI2RlZmluZSBNUjk3MzEwQV9NSU5fQ0xPQ0tESVZfTUlOCTMKKyNkZWZpbmUgTVI5NzMxMEFfTUlOX0NMT0NLRElWX01BWAk4CisjZGVmaW5lIE1SOTczMTBBX01JTl9DTE9DS0RJVl9ERUZBVUxUCTMKKwogTU9EVUxFX0FVVEhPUigiS3lsZSBHdWlubiA8ZWx5azAzQGdtYWlsLmNvbT4sIgogCSAgICAgICJUaGVvZG9yZSBLaWxnb3JlIDxraWxnb3RhQGF1YnVybi5lZHU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkdTUENBL01hcnMtU2VtaSBNUjk3MzEwQSBVU0IgQ2FtZXJhIERyaXZlciIpOwpAQCAtNjksMTAgKzc4LDEyIEBACiAJdTggY2FtX3R5cGU7CS8qIDAgaXMgQ0lGIGFuZCAxIGlzIFZHQSAqLwogCXU4IHNlbnNvcl90eXBlOwkvKiBXZSB1c2UgMCBhbmQgMSBoZXJlLCB0b28uICovCiAJdTggZG9fbGNkX3N0b3A7CisJdTggYWRqX2NvbG9yczsKIAogCWludCBicmlnaHRuZXNzOwogCXUxNiBleHBvc3VyZTsKIAl1OCBnYWluOworCXU4IG1pbl9jbG9ja2RpdjsKIH07CiAKIHN0cnVjdCBzZW5zb3Jfd19kYXRhIHsKQEAgLTgyLDI2ICs5MywzMSBAQAogCWludCBsZW47CiB9OwogCitzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOwogc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIHN0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogc3RhdGljIGludCBzZF9zZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CiBzdGF0aWMgaW50IHNkX2dldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiBzdGF0aWMgaW50IHNkX3NldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwogc3RhdGljIGludCBzZF9nZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldG1pbl9jbG9ja2RpdihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldG1pbl9jbG9ja2RpdihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOwogc3RhdGljIHZvaWQgc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKIHN0YXRpYyB2b2lkIHNldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKIAogLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwogc3RhdGljIHN0cnVjdCBjdHJsIHNkX2N0cmxzW10gPSB7CisvKiBTZXBhcmF0ZSBicmlnaHRuZXNzIGNvbnRyb2wgZGVzY3JpcHRpb24gZm9yIEFyZ3VzIFF1aWNrQ2xpeCBhcyBpdCBoYXMKKyAgIGRpZmZlcmVudCBsaW1pdHMgZnJvbSB0aGUgb3RoZXIgbXI5NzMxMGEgY2FtZXJhcyAqLwogCXsKLSNkZWZpbmUgQlJJR0hUTkVTU19JRFggMAorI2RlZmluZSBOT1JNX0JSSUdIVE5FU1NfSURYIDAKIAkJewogCQkJLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKIAkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAkJCS5uYW1lID0gIkJyaWdodG5lc3MiLAotCQkJLm1pbmltdW0gPSBNUjk3MzEwQV9CUklHSFRORVNTX01JTiwKLQkJCS5tYXhpbXVtID0gTVI5NzMxMEFfQlJJR0hUTkVTU19NQVgsCisJCQkubWluaW11bSA9IC0yNTQsCisJCQkubWF4aW11bSA9IDI1NSwKIAkJCS5zdGVwID0gMSwKIAkJCS5kZWZhdWx0X3ZhbHVlID0gTVI5NzMxMEFfQlJJR0hUTkVTU19ERUZBVUxULAogCQkJLmZsYWdzID0gMCwKQEAgLTExMCw3ICsxMjYsMjIgQEAKIAkJLmdldCA9IHNkX2dldGJyaWdodG5lc3MsCiAJfSwKIAl7Ci0jZGVmaW5lIEVYUE9TVVJFX0lEWCAxCisjZGVmaW5lIEFSR1VTX1FDX0JSSUdIVE5FU1NfSURYIDEKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIkJyaWdodG5lc3MiLAorCQkJLm1pbmltdW0gPSAwLAorCQkJLm1heGltdW0gPSAxNSwKKwkJCS5zdGVwID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gTVI5NzMxMEFfQlJJR0hUTkVTU19ERUZBVUxULAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJLnNldCA9IHNkX3NldGJyaWdodG5lc3MsCisJCS5nZXQgPSBzZF9nZXRicmlnaHRuZXNzLAorCX0sCisJeworI2RlZmluZSBFWFBPU1VSRV9JRFggMgogCQl7CiAJCQkuaWQgPSBWNEwyX0NJRF9FWFBPU1VSRSwKIAkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKQEAgLTEyNSw3ICsxNTYsNyBAQAogCQkuZ2V0ID0gc2RfZ2V0ZXhwb3N1cmUsCiAJfSwKIAl7Ci0jZGVmaW5lIEdBSU5fSURYIDIKKyNkZWZpbmUgR0FJTl9JRFggMwogCQl7CiAJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAogCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApAQCAtMTM5LDYgKzE3MCwyMSBAQAogCQkuc2V0ID0gc2Rfc2V0Z2FpbiwKIAkJLmdldCA9IHNkX2dldGdhaW4sCiAJfSwKKwl7CisjZGVmaW5lIE1JTl9DTE9DS0RJVl9JRFggNAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9QUklWQVRFX0JBU0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJNaW5pbXVtIENsb2NrIERpdmlkZXIiLAorCQkJLm1pbmltdW0gPSBNUjk3MzEwQV9NSU5fQ0xPQ0tESVZfTUlOLAorCQkJLm1heGltdW0gPSBNUjk3MzEwQV9NSU5fQ0xPQ0tESVZfTUFYLAorCQkJLnN0ZXAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSBNUjk3MzEwQV9NSU5fQ0xPQ0tESVZfREVGQVVMVCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCS5zZXQgPSBzZF9zZXRtaW5fY2xvY2tkaXYsCisJCS5nZXQgPSBzZF9nZXRtaW5fY2xvY2tkaXYsCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CkBAIC0yMzAsMTIgKzI3NiwxNyBAQAogCWludCByYzsKIAogCWJ1ZiA9IGRhdGE7Ci0JcmMgPSBzZW5zb3Jfd3JpdGVfcmVnKGdzcGNhX2RldiwgcmVnLCAweDAxLCAmYnVmLCAxKTsKKwlpZiAoc2QtPmNhbV90eXBlID09IENBTV9UWVBFX0NJRikgeworCQlyYyA9IHNlbnNvcl93cml0ZV9yZWcoZ3NwY2FfZGV2LCByZWcsIDB4MDEsICZidWYsIDEpOworCQljb25maXJtX3JlZyA9IHNkLT5zZW5zb3JfdHlwZSA/IDB4MTMgOiAweDExOworCX0gZWxzZSB7CisJCXJjID0gc2Vuc29yX3dyaXRlX3JlZyhnc3BjYV9kZXYsIHJlZywgMHgwMCwgJmJ1ZiwgMSk7CisJCWNvbmZpcm1fcmVnID0gMHgxMTsKKwl9CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCiAJYnVmID0gMHgwMTsKLQljb25maXJtX3JlZyA9IHNkLT5zZW5zb3JfdHlwZSA/IDB4MTMgOiAweDExOwogCXJjID0gc2Vuc29yX3dyaXRlX3JlZyhnc3BjYV9kZXYsIGNvbmZpcm1fcmVnLCAweDAwLCAmYnVmLCAxKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CkBAIC0yNDMsMTggKzI5NCwyNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNhbV9nZXRfcmVzcG9uc2UxNihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IGNhbV9nZXRfcmVzcG9uc2UxNihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4IHJlZywgaW50IHZlcmJvc2UpCiB7Ci0JX191OCAqZGF0YSA9IGdzcGNhX2Rldi0+dXNiX2J1ZjsKIAlpbnQgZXJyX2NvZGU7CiAKLQlkYXRhWzBdID0gMHgyMTsKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSByZWc7CiAJZXJyX2NvZGUgPSBtcl93cml0ZShnc3BjYV9kZXYsIDEpOwogCWlmIChlcnJfY29kZSA8IDApCiAJCXJldHVybiBlcnJfY29kZTsKIAogCWVycl9jb2RlID0gbXJfcmVhZChnc3BjYV9kZXYsIDE2KTsKLQlyZXR1cm4gZXJyX2NvZGU7CisJaWYgKGVycl9jb2RlIDwgMCkKKwkJcmV0dXJuIGVycl9jb2RlOworCisJaWYgKHZlcmJvc2UpCisJCVBERUJVRyhEX1BST0JFLCAiUmVnaXN0ZXI6ICUwMnggcmVhZHMgJTAyeCUwMnglMDJ4IiwgcmVnLAorCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzBdLAorCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzFdLAorCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzJdKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHplcm9fdGhlX3BvaW50ZXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtMjY0LDcgKzMyMyw3IEBACiAJdTggc3RhdHVzID0gMDsKIAlpbnQgdHJpZXMgPSAwOwogCi0JZXJyX2NvZGUgPSBjYW1fZ2V0X3Jlc3BvbnNlMTYoZ3NwY2FfZGV2KTsKKwllcnJfY29kZSA9IGNhbV9nZXRfcmVzcG9uc2UxNihnc3BjYV9kZXYsIDB4MjEsIDApOwogCWlmIChlcnJfY29kZSA8IDApCiAJCXJldHVybiBlcnJfY29kZTsKIApAQCAtMjc1LDcgKzMzNCw3IEBACiAJaWYgKGVycl9jb2RlIDwgMCkKIAkJcmV0dXJuIGVycl9jb2RlOwogCi0JZXJyX2NvZGUgPSBjYW1fZ2V0X3Jlc3BvbnNlMTYoZ3NwY2FfZGV2KTsKKwllcnJfY29kZSA9IGNhbV9nZXRfcmVzcG9uc2UxNihnc3BjYV9kZXYsIDB4MjEsIDApOwogCWlmIChlcnJfY29kZSA8IDApCiAJCXJldHVybiBlcnJfY29kZTsKIApAQCAtMjg1LDcgKzM0NCw3IEBACiAJaWYgKGVycl9jb2RlIDwgMCkKIAkJcmV0dXJuIGVycl9jb2RlOwogCi0JZXJyX2NvZGUgPSBjYW1fZ2V0X3Jlc3BvbnNlMTYoZ3NwY2FfZGV2KTsKKwllcnJfY29kZSA9IGNhbV9nZXRfcmVzcG9uc2UxNihnc3BjYV9kZXYsIDB4MjEsIDApOwogCWlmIChlcnJfY29kZSA8IDApCiAJCXJldHVybiBlcnJfY29kZTsKIApAQCAtMjk1LDcgKzM1NCw3IEBACiAJaWYgKGVycl9jb2RlIDwgMCkKIAkJcmV0dXJuIGVycl9jb2RlOwogCi0JZXJyX2NvZGUgPSBjYW1fZ2V0X3Jlc3BvbnNlMTYoZ3NwY2FfZGV2KTsKKwllcnJfY29kZSA9IGNhbV9nZXRfcmVzcG9uc2UxNihnc3BjYV9kZXYsIDB4MjEsIDApOwogCWlmIChlcnJfY29kZSA8IDApCiAJCXJldHVybiBlcnJfY29kZTsKIApAQCAtMzA2LDcgKzM2NSw3IEBACiAJCXJldHVybiBlcnJfY29kZTsKIAogCXdoaWxlIChzdGF0dXMgIT0gMHgwYSAmJiB0cmllcyA8IDI1NikgewotCQllcnJfY29kZSA9IGNhbV9nZXRfcmVzcG9uc2UxNihnc3BjYV9kZXYpOworCQllcnJfY29kZSA9IGNhbV9nZXRfcmVzcG9uc2UxNihnc3BjYV9kZXYsIDB4MjEsIDApOwogCQlzdGF0dXMgPSBkYXRhWzBdOwogCQl0cmllcysrOwogCQlpZiAoZXJyX2NvZGUgPCAwKQpAQCAtMzIzLDcgKzM4Miw3IEBACiAJCWlmIChlcnJfY29kZSA8IDApCiAJCQlyZXR1cm4gZXJyX2NvZGU7CiAKLQkJZXJyX2NvZGUgPSBjYW1fZ2V0X3Jlc3BvbnNlMTYoZ3NwY2FfZGV2KTsKKwkJZXJyX2NvZGUgPSBjYW1fZ2V0X3Jlc3BvbnNlMTYoZ3NwY2FfZGV2LCAweDIxLCAwKTsKIAkJc3RhdHVzID0gZGF0YVswXTsKIAkJdHJpZXMrKzsKIAkJaWYgKGVycl9jb2RlIDwgMCkKQEAgLTM0Miw4OSArNDAxLDIwMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTggZ2V0X3NlbnNvcl9pZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHN0cmVhbV9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0JaW50IGVycl9jb2RlOwotCi0JZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gMHgxZTsKLQllcnJfY29kZSA9IG1yX3dyaXRlKGdzcGNhX2RldiwgMSk7Ci0JaWYgKGVycl9jb2RlIDwgMCkKLQkJcmV0dXJuIGVycl9jb2RlOwotCi0JZXJyX2NvZGUgPSBtcl9yZWFkKGdzcGNhX2RldiwgMTYpOwotCWlmIChlcnJfY29kZSA8IDApCi0JCXJldHVybiBlcnJfY29kZTsKLQotCVBERUJVRyhEX1BST0JFLCAiQnl0ZSB6ZXJvIHJlcG9ydGVkIGlzICUwMXgiLCBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOwotCi0JcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAweDAxOworCWdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA9IDB4MDE7CisJcmV0dXJuIG1yX3dyaXRlKGdzcGNhX2RldiwgMik7CiB9CiAKLS8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KK3N0YXRpYyB2b2lkIHN0cmVhbV9zdG9wKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAweDAxOworCWdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA9IDB4MDA7CisJaWYgKG1yX3dyaXRlKGdzcGNhX2RldiwgMikgPCAwKQorCQlQREVCVUcoRF9FUlIsICJTdHJlYW0gU3RvcCBmYWlsZWQiKTsKK30KKworc3RhdGljIHZvaWQgbGNkX3N0b3Aoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IDB4MTk7CisJZ3NwY2FfZGV2LT51c2JfYnVmWzFdID0gMHg1NDsKKwlpZiAobXJfd3JpdGUoZ3NwY2FfZGV2LCAyKSA8IDApCisJCVBERUJVRyhEX0VSUiwgIkxDRCBTdG9wIGZhaWxlZCIpOworfQorCitzdGF0aWMgaW50IGlzb2NfZW5hYmxlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAweDAwOworCWdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA9IDB4NGQ7ICAvKiBJU09DIHRyYW5zZmVyaW5nIGVuYWJsZS4uLiAqLworCXJldHVybiBtcl93cml0ZShnc3BjYV9kZXYsIDIpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSB0aW1lICovCiBzdGF0aWMgaW50IHNkX2NvbmZpZyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCiAJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlzdHJ1Y3QgY2FtICpjYW07Ci0JX191OCAqZGF0YSA9IGdzcGNhX2Rldi0+dXNiX2J1ZjsKIAlpbnQgZXJyX2NvZGU7CiAKIAljYW0gPSAmZ3NwY2FfZGV2LT5jYW07CiAJY2FtLT5jYW1fbW9kZSA9IHZnYV9tb2RlOwogCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRSh2Z2FfbW9kZSk7CisJc2QtPmRvX2xjZF9zdG9wID0gMDsKIAotCWlmIChpZC0+aWRQcm9kdWN0ID09IDB4MDEwZSkgeworCS8qIFNldmVyYWwgb2YgdGhlIHN1cHBvcnRlZCBDSUYgY2FtZXJhcyBzaGFyZSB0aGUgc2FtZSBVU0IgSUQgYnV0CisJICogcmVxdWlyZSBkaWZmZXJlbnQgaW5pdGlhbGl6YXRpb25zIGFuZCBkaWZmZXJlbnQgY29udHJvbCBzZXR0aW5ncy4KKwkgKiBUaGUgc2FtZSBpcyB0cnVlIG9mIHRoZSBWR0EgY2FtZXJhcy4gVGhlcmVmb3JlLCB3ZSBhcmUgZm9yY2VkCisJICogdG8gc3RhcnQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoCisJICogY2FtZXJhIGlzIHByZXNlbnQuIFNvbWUgb2YgdGhlIHN1cHBvcnRlZCBjYW1lcmFzIHJlcXVpcmUgdGhlCisJICogbWVtb3J5IHBvaW50ZXIgdG8gYmUgc2V0IHRvIDAgYXMgdGhlIHZlcnkgZmlyc3QgaXRlbSBvZiBidXNpbmVzcworCSAqIG9yIGVsc2UgdGhleSB3aWxsIG5vdCBzdHJlYW0uIFNvIHdlIGRvIHRoYXQgaW1tZWRpYXRlbHkuCisJICovCisJZXJyX2NvZGUgPSB6ZXJvX3RoZV9wb2ludGVyKGdzcGNhX2Rldik7CisJaWYgKGVycl9jb2RlIDwgMCkKKwkJcmV0dXJuIGVycl9jb2RlOworCisJZXJyX2NvZGUgPSBzdHJlYW1fc3RhcnQoZ3NwY2FfZGV2KTsKKwlpZiAoZXJyX2NvZGUgPCAwKQorCQlyZXR1cm4gZXJyX2NvZGU7CisKKwlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDAxMTAgfHwgaWQtPmlkUHJvZHVjdCA9PSAweDAxMGUpIHsKIAkJc2QtPmNhbV90eXBlID0gQ0FNX1RZUEVfQ0lGOwogCQljYW0tPm5tb2Rlcy0tOworCQllcnJfY29kZSA9IGNhbV9nZXRfcmVzcG9uc2UxNihnc3BjYV9kZXYsIDB4MDYsIDEpOworCQlpZiAoZXJyX2NvZGUgPCAwKQorCQkJcmV0dXJuIGVycl9jb2RlOworCQkvKgorCQkgKiBBbGwgYnV0IG9uZSBvZiB0aGUga25vd24gQ0lGIGNhbWVyYXMgc2hhcmUgdGhlIHNhbWUgVVNCIElELAorCQkgKiBidXQgdHdvIGRpZmZlcmVudCBpbml0IHJvdXRpbmVzIGFyZSBpbiB1c2UsIGFuZCB0aGUgY29udHJvbAorCQkgKiBzZXR0aW5ncyBhcmUgZGlmZmVyZW50LCB0b28uIFdlIG5lZWQgdG8gZGV0ZWN0IHdoaWNoIGNhbWVyYQorCQkgKiBvZiB0aGUgdHdvIGtub3duIHZhcmlldGllcyBpcyBjb25uZWN0ZWQhCisJCSAqCisJCSAqIEEgbGlzdCBvZiBrbm93biBDSUYgY2FtZXJhcyBmb2xsb3dzLiBUaGV5IGFsbCByZXBvcnQgZWl0aGVyCisJCSAqIDAwMDIgZm9yIHR5cGUgMCBvciAwMDAzIGZvciB0eXBlIDEuCisJCSAqIElmIHlvdSBoYXZlIGFub3RoZXIgdG8gcmVwb3J0LCBwbGVhc2UgZG8KKwkJICoKKwkJICogTmFtZQkJc2QtPnNlbnNvcl90eXBlCQlyZXBvcnRlZCBieQorCQkgKgorCQkgKiBTYWthciBTcHktc2hvdAkwCQlULiBLaWxnb3JlCisJCSAqIElubm92YWdlCQkwCQlULiBLaWxnb3JlCisJCSAqIFZpdml0YXIgTWluaQkJMAkJSC4gRGUgR29lZGUKKwkJICogVml2aXRhciBNaW5pCQkwCQlFLiBSb2RyaWd1ZXoKKwkJICogVml2aXRhciBNaW5pCQkxCQlULiBLaWxnb3JlCisJCSAqIEVsdGEtTWVkaWEgODIxMmRjCTEJCVQuIEthaXNlcgorCQkgKiBQaGlsaXBzIGRpZy4ga2V5Y2guCTEJCVQuIEtpbGdvcmUKKwkJICogVHJ1c3QgU3B5Y0BtIDEwMAkxCQlBLiBKYWNvYnMKKwkJICovCisJCXN3aXRjaCAoZ3NwY2FfZGV2LT51c2JfYnVmWzFdKSB7CisJCWNhc2UgMjoKKwkJCXNkLT5zZW5zb3JfdHlwZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJc2QtPnNlbnNvcl90eXBlID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUERFQlVHKERfRVJSLCAiVW5rbm93biBDSUYgU2Vuc29yIGlkIDogJTAyeCIsCisJCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzFdKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCVBERUJVRyhEX1BST0JFLCAiTVI5NzMxMEEgQ0lGIGNhbWVyYSBkZXRlY3RlZCwgc2Vuc29yOiAlZCIsCisJCSAgICAgICBzZC0+c2Vuc29yX3R5cGUpOworCX0gZWxzZSB7CisJCXNkLT5jYW1fdHlwZSA9IENBTV9UWVBFX1ZHQTsKIAotCQlkYXRhWzBdID0gMHgwMTsKLQkJZGF0YVsxXSA9IDB4MDE7Ci0JCWVycl9jb2RlID0gbXJfd3JpdGUoZ3NwY2FfZGV2LCAyKTsKKwkJZXJyX2NvZGUgPSBjYW1fZ2V0X3Jlc3BvbnNlMTYoZ3NwY2FfZGV2LCAweDA3LCAxKTsKIAkJaWYgKGVycl9jb2RlIDwgMCkKIAkJCXJldHVybiBlcnJfY29kZTsKIAotCQltc2xlZXAoMjAwKTsKLQkJZGF0YVswXSA9IGdldF9zZW5zb3JfaWQoZ3NwY2FfZGV2KTsKIAkJLyoKLQkJICogS25vd24gQ0lGIGNhbWVyYXMuIElmIHlvdSBoYXZlIGFub3RoZXIgdG8gcmVwb3J0LCBwbGVhc2UgZG8KKwkJICogSGVyZSBpcyBhIHRhYmxlIG9mIHRoZSByZXNwb25zZXMgdG8gdGhlIHByZXZpb3VzIGNvbW1hbmQKKwkJICogZnJvbSB0aGUga25vd24gTVI5NzMxMEEgVkdBIGNhbWVyYXMuCiAJCSAqCi0JCSAqIE5hbWUJCQlieXRlIGp1c3QgcmVhZAkJc2QtPnNlbnNvcl90eXBlCi0JCSAqCQkJCQlyZXBvcnRlZCBieQotCQkgKiBTYWthciBTcHktc2hvdAkweDI4CQlULiBLaWxnb3JlCTAKLQkJICogSW5ub3ZhZ2UJCTB4ZjUgKHVuc3RhYmxlKQlULiBLaWxnb3JlCTAKLQkJICogVml2aXRhciBNaW5pCQkweDUzCQlILiBEZSBHb2VkZQkwCi0JCSAqIFZpdml0YXIgTWluaQkJMHgwNCAvIDB4MjQJRS4gUm9kcmlndWV6CTAKLQkJICogVml2aXRhciBNaW5pCQkweDA4CQlULiBLaWxnb3JlCTEKLQkJICogRWx0YS1NZWRpYSA4MjEyZGMJMHgyMwkJVC4gS2Fpc2VyCTEKLQkJICogUGhpbGlwcyBkaWcuIGtleWNoLgkweDM3CQlULiBLaWxnb3JlCTEKKwkJICogTmFtZQkJCWdzcGNhX2Rldi0+dXNiX2J1ZltdCXNkLT5zZW5zb3JfdHlwZQorCQkgKgkJCQlzZC0+ZG9fbGNkX3N0b3AKKwkJICogQWlwdGVrIFBlbmNhbSBWR0ErCTAzMDAJCTAJCTEKKwkJICogSU9OIGRpZ2l0YWwJCTAzNTAJCTAJCTEKKwkJICogQXJndXMgREMtMTYyMAkwNDUwCQkxCQkwCisJCSAqIEFyZ3VzIFF1aWNrQ2xpeAkwNDIwCQkxCQkxCisJCSAqCisJCSAqIEJhc2VkIHVwb24gdGhlc2UgcmVzdWx0cywgd2UgYXNzdW1lIGRlZmF1bHQgc2V0dGluZ3MKKwkJICogYW5kIHRoZW4gY29ycmVjdCBhcyBuZWNlc3NhcnksIGFzIGZvbGxvd3MuCisJCSAqCiAJCSAqLwotCQlpZiAoKGRhdGFbMF0gJiAweDc4KSA9PSA4IHx8Ci0JCSAgICAoKGRhdGFbMF0gJiAweDIpID09IDB4MiAmJiBkYXRhWzBdICE9IDB4NTMpKQotCQkJc2QtPnNlbnNvcl90eXBlID0gMTsKLQkJZWxzZQotCQkJc2QtPnNlbnNvcl90eXBlID0gMDsKIAotCQlQREVCVUcoRF9QUk9CRSwgIk1SOTczMTBBIENJRiBjYW1lcmEgZGV0ZWN0ZWQsIHNlbnNvcjogJWQiLAotCQkgICAgICAgc2QtPnNlbnNvcl90eXBlKTsKLQotCQlpZiAoZm9yY2Vfc2Vuc29yX3R5cGUgIT0gLTEpIHsKLQkJCXNkLT5zZW5zb3JfdHlwZSA9ICEhIGZvcmNlX3NlbnNvcl90eXBlOwotCQkJUERFQlVHKERfUFJPQkUsICJGb3JjaW5nIHNlbnNvciB0eXBlIHRvOiAlZCIsCi0JCQkgICAgICAgc2QtPnNlbnNvcl90eXBlKTsKKwkJc2QtPnNlbnNvcl90eXBlID0gMTsKKwkJc2QtPmRvX2xjZF9zdG9wID0gMDsKKwkJc2QtPmFkal9jb2xvcnMgPSAwOworCQlpZiAoKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSAhPSAweDAzKSAmJgorCQkJCQkoZ3NwY2FfZGV2LT51c2JfYnVmWzBdICE9IDB4MDQpKSB7CisJCQlQREVCVUcoRF9FUlIsICJVbmtub3duIFZHQSBTZW5zb3IgaWQgQnl0ZSAwOiAlMDJ4IiwKKwkJCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzFdKTsKKwkJCVBERUJVRyhEX0VSUiwgIkRlZmF1bHRzIGFzc3VtZWQsIG1heSBub3Qgd29yayIpOworCQkJUERFQlVHKERfRVJSLCAiUGxlYXNlIHJlcG9ydCB0aGlzIik7CiAJCX0KKwkJLyogU2FrYXIgRGlnaXRhbCBjb2xvciBuZWVkcyB0byBiZSBhZGp1c3RlZC4gKi8KKwkJaWYgKChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPT0gMHgwMykgJiYKKwkJCQkJKGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA9PSAweDUwKSkKKwkJCXNkLT5hZGpfY29sb3JzID0gMTsKKwkJaWYgKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9PSAweDA0KSB7CisJCQlzZC0+ZG9fbGNkX3N0b3AgPSAxOworCQkJc3dpdGNoIChnc3BjYV9kZXYtPnVzYl9idWZbMV0pIHsKKwkJCWNhc2UgMHg1MDoKKwkJCQlzZC0+c2Vuc29yX3R5cGUgPSAwOworCQkJCVBERUJVRyhEX1BST0JFLCAic2Vuc29yX3R5cGUgY29ycmVjdGVkIHRvIDAiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyMDoKKwkJCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUuICovCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVBERUJVRyhEX0VSUiwKKwkJCQkJIlVua25vd24gVkdBIFNlbnNvciBpZCBCeXRlIDE6ICUwMngiLAorCQkJCQlnc3BjYV9kZXYtPnVzYl9idWZbMV0pOworCQkJCVBERUJVRyhEX0VSUiwKKwkJCQkJIkRlZmF1bHRzIGFzc3VtZWQsIG1heSBub3Qgd29yayIpOworCQkJCVBERUJVRyhEX0VSUiwgIlBsZWFzZSByZXBvcnQgdGhpcyIpOworCQkJfQorCQl9CisJCVBERUJVRyhEX1BST0JFLCAiTVI5NzMxMEEgVkdBIGNhbWVyYSBkZXRlY3RlZCwgc2Vuc29yOiAlZCIsCisJCSAgICAgICBzZC0+c2Vuc29yX3R5cGUpOworCX0KKwkvKiBTdG9wIHN0cmVhbWluZyBhcyB3ZSd2ZSBzdGFydGVkIGl0IHRvIHByb2JlIHRoZSBzZW5zb3IgdHlwZS4gKi8KKwlzZF9zdG9wTihnc3BjYV9kZXYpOwogCisJaWYgKGZvcmNlX3NlbnNvcl90eXBlICE9IC0xKSB7CisJCXNkLT5zZW5zb3JfdHlwZSA9ICEhZm9yY2Vfc2Vuc29yX3R5cGU7CisJCVBERUJVRyhEX1BST0JFLCAiRm9yY2luZyBzZW5zb3IgdHlwZSB0bzogJWQiLAorCQkgICAgICAgc2QtPnNlbnNvcl90eXBlKTsKKwl9CisKKwkvKiBTZXR1cCBjb250cm9scyBkZXBlbmRpbmcgb24gY2FtZXJhIHR5cGUgKi8KKwlpZiAoc2QtPmNhbV90eXBlID09IENBTV9UWVBFX0NJRikgeworCQkvKiBObyBicmlnaHRuZXNzIGZvciBzZW5zb3JfdHlwZSAwICovCiAJCWlmIChzZC0+c2Vuc29yX3R5cGUgPT0gMCkKLQkJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBCUklHSFRORVNTX0lEWCk7CisJCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgTk9STV9CUklHSFRORVNTX0lEWCkgfAorCQkJCQkgICAgICAoMSA8PCBBUkdVU19RQ19CUklHSFRORVNTX0lEWCk7CisJCWVsc2UKKwkJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBBUkdVU19RQ19CUklHSFRORVNTX0lEWCkgfAorCQkJCQkgICAgICAoMSA8PCBNSU5fQ0xPQ0tESVZfSURYKTsKIAl9IGVsc2UgewotCQlzZC0+Y2FtX3R5cGUgPSBDQU1fVFlQRV9WR0E7Ci0JCVBERUJVRyhEX1BST0JFLCAiTVI5NzMxMEEgVkdBIGNhbWVyYSBkZXRlY3RlZCIpOwotCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgQlJJR0hUTkVTU19JRFgpIHwKLQkJCQkgICAgICAoMSA8PCBFWFBPU1VSRV9JRFgpIHwgKDEgPDwgR0FJTl9JRFgpOworCQkvKiBBbGwgY29udHJvbHMgbmVlZCB0byBiZSBkaXNhYmxlZCBpZiBWR0Egc2Vuc29yX3R5cGUgaXMgMCAqLworCQlpZiAoc2QtPnNlbnNvcl90eXBlID09IDApCisJCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgTk9STV9CUklHSFRORVNTX0lEWCkgfAorCQkJCQkgICAgICAoMSA8PCBBUkdVU19RQ19CUklHSFRORVNTX0lEWCkgfAorCQkJCQkgICAgICAoMSA8PCBFWFBPU1VSRV9JRFgpIHwKKwkJCQkJICAgICAgKDEgPDwgR0FJTl9JRFgpIHwKKwkJCQkJICAgICAgKDEgPDwgTUlOX0NMT0NLRElWX0lEWCk7CisJCWVsc2UgaWYgKHNkLT5kb19sY2Rfc3RvcCkKKwkJCS8qIEFyZ3VzIFF1aWNrQ2xpeCBoYXMgZGlmZmVyZW50IGJyaWdodG5lc3MgbGltaXRzICovCisJCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgTk9STV9CUklHSFRORVNTX0lEWCk7CisJCWVsc2UKKwkJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBBUkdVU19RQ19CUklHSFRORVNTX0lEWCk7CiAJfQogCiAJc2QtPmJyaWdodG5lc3MgPSBNUjk3MzEwQV9CUklHSFRORVNTX0RFRkFVTFQ7CiAJc2QtPmV4cG9zdXJlID0gTVI5NzMxMEFfRVhQT1NVUkVfREVGQVVMVDsKIAlzZC0+Z2FpbiA9IE1SOTczMTBBX0dBSU5fREVGQVVMVDsKKwlzZC0+bWluX2Nsb2NrZGl2ID0gTVI5NzMxMEFfTUlOX0NMT0NLRElWX0RFRkFVTFQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1NSwxMSArNjI3LDYgQEAKIAl9OwogCiAJLyogTm90ZTogU29tZSBvZiB0aGUgYWJvdmUgZGVzY3JpcHRpb25zIGd1ZXNzZWQgZnJvbSBNUjk3MTEzQSBkcml2ZXIgKi8KLQlkYXRhWzBdID0gMHgwMTsKLQlkYXRhWzFdID0gMHgwMTsKLQllcnJfY29kZSA9IG1yX3dyaXRlKGdzcGNhX2RldiwgMik7Ci0JaWYgKGVycl9jb2RlIDwgMCkKLQkJcmV0dXJuIGVycl9jb2RlOwogCiAJbWVtY3B5KGRhdGEsIHN0YXJ0dXBfc3RyaW5nLCAxMSk7CiAJaWYgKHNkLT5zZW5zb3JfdHlwZSkKQEAgLTUzMywyMiArNzAwLDcgQEAKIAkJZXJyX2NvZGUgPSBzZW5zb3Jfd3JpdGVfcmVncyhnc3BjYV9kZXYsIGNpZl9zZW5zb3IxX2luaXRfZGF0YSwKIAkJCQkJIEFSUkFZX1NJWkUoY2lmX3NlbnNvcjFfaW5pdF9kYXRhKSk7CiAJfQotCWlmIChlcnJfY29kZSA8IDApCi0JCXJldHVybiBlcnJfY29kZTsKLQotCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKLQlzZXRleHBvc3VyZShnc3BjYV9kZXYpOwotCXNldGdhaW4oZ3NwY2FfZGV2KTsKLQotCW1zbGVlcCgyMDApOwotCi0JZGF0YVswXSA9IDB4MDA7Ci0JZGF0YVsxXSA9IDB4NGQ7ICAvKiBJU09DIHRyYW5zZmVyaW5nIGVuYWJsZS4uLiAqLwotCWVycl9jb2RlID0gbXJfd3JpdGUoZ3NwY2FfZGV2LCAyKTsKLQlpZiAoZXJyX2NvZGUgPCAwKQotCQlyZXR1cm4gZXJyX2NvZGU7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyX2NvZGU7CiB9CiAKIHN0YXRpYyBpbnQgc3RhcnRfdmdhX2NhbShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC01NTgsODQgKzcxMCw4IEBACiAJaW50IGVycl9jb2RlOwogCWNvbnN0IF9fdTggc3RhcnR1cF9zdHJpbmdbXSA9IHsweDAwLCAweDBkLCAweDAxLCAweDAwLCAweDAwLCAweDJiLAogCQkJCSAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDUwLCAweGMwfTsKLQogCS8qIFdoYXQgc29tZSBvZiB0aGVzZSBtZWFuIGlzIGV4cGxhaW5lZCBpbiBzdGFydF9jaWZfY2FtKCksIGFib3ZlICovCi0Jc2QtPnNvZl9yZWFkID0gMDsKIAotCS8qCi0JICogV2UgaGF2ZSB0byBrbm93IHdoaWNoIGNhbWVyYSB3ZSBoYXZlLCBiZWNhdXNlIHRoZSByZWdpc3RlciB3cml0ZXMKLQkgKiBkZXBlbmQgdXBvbiB0aGUgY2FtZXJhLiBUaGlzIHRlc3QsIHJ1biBiZWZvcmUgd2UgYWN0dWFsbHkgZW50ZXIKLQkgKiB0aGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgZGlzdGluZ3Vpc2hlcyBtb3N0IG9mIHRoZSBjYW1lcmFzLCBJZgotCSAqIG5lZWRlZCwgYW5vdGhlciByb3V0aW5lIGlzIGRvbmUgbGF0ZXIsIHRvby4KLQkgKi8KLQltZW1zZXQoZGF0YSwgMCwgMTYpOwotCWRhdGFbMF0gPSAweDIwOwotCWVycl9jb2RlID0gbXJfd3JpdGUoZ3NwY2FfZGV2LCAxKTsKLQlpZiAoZXJyX2NvZGUgPCAwKQotCQlyZXR1cm4gZXJyX2NvZGU7Ci0KLQllcnJfY29kZSA9IG1yX3JlYWQoZ3NwY2FfZGV2LCAxNik7Ci0JaWYgKGVycl9jb2RlIDwgMCkKLQkJcmV0dXJuIGVycl9jb2RlOwotCi0JUERFQlVHKERfUFJPQkUsICJCeXRlIHJlcG9ydGVkIGlzICUwMngiLCBkYXRhWzBdKTsKLQotCW1zbGVlcCgyMDApOwotCS8qCi0JICogS25vd24gVkdBIGNhbWVyYXMuIElmIHlvdSBoYXZlIGFub3RoZXIgdG8gcmVwb3J0LCBwbGVhc2UgZG8KLQkgKgotCSAqIE5hbWUJCQlieXRlIGp1c3QgcmVhZAkJc2QtPnNlbnNvcl90eXBlCi0JICoJCQkJc2QtPmRvX2xjZF9zdG9wCi0JICogQWlwdGVrIFBlbmNhbSBWR0ErCTB4MzEJCTAJMQotCSAqIElPTiBkaWdpdGFsCQkweDMxCQkwCTEKLQkgKiBBcmd1cyBEQy0xNjIwCTB4MzAJCTEJMAotCSAqIEFyZ3VzIFF1aWNrQ2xpeAkweDMwCQkxCTEgKG5vdCBjYXVnaHQgaGVyZSkKLQkgKi8KLQlzZC0+c2Vuc29yX3R5cGUgPSBkYXRhWzBdICYgMTsKLQlzZC0+ZG9fbGNkX3N0b3AgPSAofmRhdGFbMF0pICYgMTsKLQotCi0KLQkvKiBTdHJlYW1pbmcgc2V0dXAgYmVnaW5zIGhlcmUuICovCi0KLQotCWRhdGFbMF0gPSAweDAxOwotCWRhdGFbMV0gPSAweDAxOwotCWVycl9jb2RlID0gbXJfd3JpdGUoZ3NwY2FfZGV2LCAyKTsKLQlpZiAoZXJyX2NvZGUgPCAwKQotCQlyZXR1cm4gZXJyX2NvZGU7Ci0KLQkvKgotCSAqIEEgc2Vjb25kIHRlc3QgY2FuIG5vdyByZXNvbHZlIGFueSByZW1haW5pbmcgYW1iaWd1aXR5IGluIHRoZQotCSAqIGlkZW50aWZpY2F0aW9uIG9mIHRoZSBjYW1lcmEgdHlwZSwKLQkgKi8KLQlpZiAoIXNkLT5zZW5zb3JfdHlwZSkgewotCQlkYXRhWzBdID0gZ2V0X3NlbnNvcl9pZChnc3BjYV9kZXYpOwotCQlpZiAoZGF0YVswXSA9PSAweDdmKSB7Ci0JCQlzZC0+c2Vuc29yX3R5cGUgPSAxOwotCQkJUERFQlVHKERfUFJPQkUsICJzZW5zb3JfdHlwZSBjb3JyZWN0ZWQgdG8gMSIpOwotCQl9Ci0JCW1zbGVlcCgyMDApOwotCX0KLQotCWlmIChmb3JjZV9zZW5zb3JfdHlwZSAhPSAtMSkgewotCQlzZC0+c2Vuc29yX3R5cGUgPSAhISBmb3JjZV9zZW5zb3JfdHlwZTsKLQkJUERFQlVHKERfUFJPQkUsICJGb3JjaW5nIHNlbnNvciB0eXBlIHRvOiAlZCIsCi0JCSAgICAgICBzZC0+c2Vuc29yX3R5cGUpOwotCX0KLQotCS8qCi0JICogS25vd24gVkdBIGNhbWVyYXMuCi0JICogVGhpcyB0ZXN0IGlzIG9ubHkgcnVuIGlmIHRoZSBwcmV2aW91cyB0ZXN0IHJldHVybmVkIDB4MzAsIGJ1dAotCSAqIGhlcmUgaXMgdGhlIGluZm9ybWF0aW9uIGZvciBhbGwgb3RoZXJzLCB0b28sIGp1c3QgZm9yIHJlZmVyZW5jZS4KLQkgKgotCSAqIE5hbWUJCQlieXRlIGp1c3QgcmVhZAkJc2QtPnNlbnNvcl90eXBlCi0JICoKLQkgKiBBaXB0ZWsgUGVuY2FtIFZHQSsJMHhmYgkodGhpcyB0ZXN0IG5vdCBydW4pCTEKLQkgKiBJT04gZGlnaXRhbAkJMHhiZAkodGhpcyB0ZXN0IG5vdCBydW4pCTEKLQkgKiBBcmd1cyBEQy0xNjIwCTB4ZTUJKG5vIGNoYW5nZSkJCTAKLQkgKiBBcmd1cyBRdWlja0NsaXgJMHg3ZgkocmVjbGFzc2lmaWVkKQkJMQotCSAqLwogCW1lbWNweShkYXRhLCBzdGFydHVwX3N0cmluZywgMTEpOwogCWlmICghc2QtPnNlbnNvcl90eXBlKSB7CiAJCWRhdGFbNV0gID0gMHgwMDsKQEAgLTY4OSwyOSArNzY1LDQ0IEBACiAJCWVycl9jb2RlID0gc2Vuc29yX3dyaXRlX3JlZ3MoZ3NwY2FfZGV2LCB2Z2Ffc2Vuc29yMF9pbml0X2RhdGEsCiAJCQkJCSBBUlJBWV9TSVpFKHZnYV9zZW5zb3IwX2luaXRfZGF0YSkpOwogCX0gZWxzZSB7CS8qIHNkLT5zZW5zb3JfdHlwZSA9IDEgKi8KLQkJY29uc3Qgc3RydWN0IHNlbnNvcl93X2RhdGEgdmdhX3NlbnNvcjFfaW5pdF9kYXRhW10gPSB7CisJCWNvbnN0IHN0cnVjdCBzZW5zb3Jfd19kYXRhIGNvbG9yX2FkaltdID0gewogCQkJezB4MDIsIDB4MDAsIHsweDA2LCAweDU5LCAweDBjLCAweDE2LCAweDAwLAotCQkJCTB4MDcsIDB4MDAsIDB4MDF9LCA4fSwKKwkJCQkvKiBhZGp1c3RlZCBibHVlLCBncmVlbiwgcmVkIGdhaW4gY29ycmVjdAorCQkJCSAgIHRvbyBtdWNoIGJsdWUgZnJvbSB0aGUgU2FrYXIgRGlnaXRhbCAqLworCQkJCTB4MDUsIDB4MDEsIDB4MDR9LCA4fQorCQl9OworCisJCWNvbnN0IHN0cnVjdCBzZW5zb3Jfd19kYXRhIGNvbG9yX25vX2FkaltdID0geworCQkJezB4MDIsIDB4MDAsIHsweDA2LCAweDU5LCAweDBjLCAweDE2LCAweDAwLAorCQkJCS8qIGRlZmF1bHQgYmx1ZSwgZ3JlZW4sIHJlZCBnYWluIHNldHRpbmdzICovCisJCQkJMHgwNywgMHgwMCwgMHgwMX0sIDh9CisJCX07CisKKwkJY29uc3Qgc3RydWN0IHNlbnNvcl93X2RhdGEgdmdhX3NlbnNvcjFfaW5pdF9kYXRhW10gPSB7CiAJCQl7MHgxMSwgMHgwNCwgezB4MDF9LCAxfSwKLQkJCS8qezB4MGEsIDB4MDAsIHsweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAqLwotCQkJezB4MGEsIDB4MDAsIHsweDAxLCAweDA2LCAweDAwLCAweDAwLCAweDAxLAorCQkJezB4MGEsIDB4MDAsIHsweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLAorCQkJLyogVGhlc2Ugc2V0dGluZ3MgbWF5IGJlIGJldHRlciBmb3Igc29tZSBjYW1lcmFzICovCisJCQkvKiB7MHgwYSwgMHgwMCwgezB4MDEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDEsICovCiAJCQkJMHgwMCwgMHgwYX0sIDd9LAogCQkJezB4MTEsIDB4MDQsIHsweDAxfSwgMX0sCiAJCQl7MHgxMiwgMHgwMCwgezB4MDAsIDB4NjMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDB9LCA2fSwKIAkJCXsweDExLCAweDA0LCB7MHgwMX0sIDF9LAogCQkJezAsIDAsIHswfSwgMH0KIAkJfTsKKworCQlpZiAoc2QtPmFkal9jb2xvcnMpCisJCQllcnJfY29kZSA9IHNlbnNvcl93cml0ZV9yZWdzKGdzcGNhX2RldiwgY29sb3JfYWRqLAorCQkJCQkgQVJSQVlfU0laRShjb2xvcl9hZGopKTsKKwkJZWxzZQorCQkJZXJyX2NvZGUgPSBzZW5zb3Jfd3JpdGVfcmVncyhnc3BjYV9kZXYsIGNvbG9yX25vX2FkaiwKKwkJCQkJIEFSUkFZX1NJWkUoY29sb3Jfbm9fYWRqKSk7CisKKwkJaWYgKGVycl9jb2RlIDwgMCkKKwkJCXJldHVybiBlcnJfY29kZTsKKwogCQllcnJfY29kZSA9IHNlbnNvcl93cml0ZV9yZWdzKGdzcGNhX2RldiwgdmdhX3NlbnNvcjFfaW5pdF9kYXRhLAogCQkJCQkgQVJSQVlfU0laRSh2Z2Ffc2Vuc29yMV9pbml0X2RhdGEpKTsKIAl9Ci0JaWYgKGVycl9jb2RlIDwgMCkKLQkJcmV0dXJuIGVycl9jb2RlOwotCi0JbXNsZWVwKDIwMCk7Ci0JZGF0YVswXSA9IDB4MDA7Ci0JZGF0YVsxXSA9IDB4NGQ7ICAvKiBJU09DIHRyYW5zZmVyaW5nIGVuYWJsZS4uLiAqLwotCWVycl9jb2RlID0gbXJfd3JpdGUoZ3NwY2FfZGV2LCAyKTsKLQogCXJldHVybiBlcnJfY29kZTsKIH0KIApAQCAtNzE5LDk3ICs4MTAsMTIwIEBACiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCWludCBlcnJfY29kZTsKLQlzdHJ1Y3QgY2FtICpjYW07CiAKLQljYW0gPSAmZ3NwY2FfZGV2LT5jYW07CiAJc2QtPnNvZl9yZWFkID0gMDsKLQkvKgotCSAqIFNvbWUgb2YgdGhlIHN1cHBvcnRlZCBjYW1lcmFzIHJlcXVpcmUgdGhlIG1lbW9yeSBwb2ludGVyIHRvIGJlCi0JICogc2V0IHRvIDAsIG9yIGVsc2UgdGhleSB3aWxsIG5vdCBzdHJlYW0uCi0JICovCi0JemVyb190aGVfcG9pbnRlcihnc3BjYV9kZXYpOwotCW1zbGVlcCgyMDApOworCisJLyogU29tZSBvZiB0aGUgVkdBIGNhbWVyYXMgcmVxdWlyZSB0aGUgbWVtb3J5IHBvaW50ZXIKKwkgKiB0byBiZSBzZXQgdG8gMCBhZ2Fpbi4gV2UgaGF2ZSBiZWVuIGZvcmNlZCB0byBzdGFydCB0aGUKKwkgKiBzdHJlYW0gaW4gc2RfY29uZmlnKCkgdG8gZGV0ZWN0IHRoZSBoYXJkd2FyZSwgYW5kIGNsb3NlZCBpdC4KKwkgKiBUaHVzLCB3ZSBuZWVkIGhlcmUgdG8gZG8gYSBjb21wbGV0ZWx5IGZyZXNoIGFuZCBjbGVhbiBzdGFydC4gKi8KKwllcnJfY29kZSA9IHplcm9fdGhlX3BvaW50ZXIoZ3NwY2FfZGV2KTsKKwlpZiAoZXJyX2NvZGUgPCAwKQorCQlyZXR1cm4gZXJyX2NvZGU7CisKKwllcnJfY29kZSA9IHN0cmVhbV9zdGFydChnc3BjYV9kZXYpOworCWlmIChlcnJfY29kZSA8IDApCisJCXJldHVybiBlcnJfY29kZTsKKwogCWlmIChzZC0+Y2FtX3R5cGUgPT0gQ0FNX1RZUEVfQ0lGKSB7CiAJCWVycl9jb2RlID0gc3RhcnRfY2lmX2NhbShnc3BjYV9kZXYpOwogCX0gZWxzZSB7CiAJCWVycl9jb2RlID0gc3RhcnRfdmdhX2NhbShnc3BjYV9kZXYpOwogCX0KLQlyZXR1cm4gZXJyX2NvZGU7CisJaWYgKGVycl9jb2RlIDwgMCkKKwkJcmV0dXJuIGVycl9jb2RlOworCisJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOworCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJc2V0Z2Fpbihnc3BjYV9kZXYpOworCisJcmV0dXJuIGlzb2NfZW5hYmxlKGdzcGNhX2Rldik7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0JaW50IHJlc3VsdDsKIAotCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IDE7Ci0JZ3NwY2FfZGV2LT51c2JfYnVmWzFdID0gMDsKLQlyZXN1bHQgPSBtcl93cml0ZShnc3BjYV9kZXYsIDIpOwotCWlmIChyZXN1bHQgPCAwKQotCQlQREVCVUcoRF9FUlIsICJDYW1lcmEgU3RvcCBmYWlsZWQiKTsKLQorCXN0cmVhbV9zdG9wKGdzcGNhX2Rldik7CiAJLyogTm90IGFsbCB0aGUgY2FtcyBuZWVkIHRoaXMsIGJ1dCBldmVuIGlmIG5vdCwgcHJvYmFibHkgYSBnb29kIGlkZWEgKi8KIAl6ZXJvX3RoZV9wb2ludGVyKGdzcGNhX2Rldik7Ci0JaWYgKHNkLT5kb19sY2Rfc3RvcCkgewotCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAweDE5OwotCQlnc3BjYV9kZXYtPnVzYl9idWZbMV0gPSAweDU0OwotCQlyZXN1bHQgPSBtcl93cml0ZShnc3BjYV9kZXYsIDIpOwotCQlpZiAocmVzdWx0IDwgMCkKLQkJCVBERUJVRyhEX0VSUiwgIkNhbWVyYSBTdG9wIGZhaWxlZCIpOwotCX0KKwlpZiAoc2QtPmRvX2xjZF9zdG9wKQorCQlsY2Rfc3RvcChnc3BjYV9kZXYpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJdTggdmFsOwotCi0JaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBCUklHSFRORVNTX0lEWCkpCisJdTggc2lnbl9yZWcgPSA3OyAgLyogVGhpcyByZWcgYW5kIHRoZSBuZXh0IG9uZSB1c2VkIG9uIENJRiBjYW1zLiAqLworCXU4IHZhbHVlX3JlZyA9IDg7IC8qIFZHQSBjYW1zIHNlZW0gdG8gdXNlIHJlZ3MgMHgwYiBhbmQgMHgwYyAqLworCWNvbnN0IHU4IHF1aWNrX2NsaXhfdGFibGVbXSA9CisJLyoJICAwICAxICAyICAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNSAqLworCQl7IDAsIDQsIDgsIDEyLCAxLCAyLCAzLCA1LCA2LCA5LCAgNywgMTAsIDEzLCAxMSwgMTQsIDE1fTsKKwkvKgorCSAqIFRoaXMgY29udHJvbCBpcyBkaXNhYmxlZCBmb3IgQ0lGIHR5cGUgMSBhbmQgVkdBIHR5cGUgMCBjYW1lcmFzLgorCSAqIEl0IGRvZXMgbm90IHF1aXRlIGFjdCBsaW5lYXJseSBmb3IgdGhlIEFyZ3VzIFF1aWNrQ2xpeCBjYW1lcmEsCisJICogYnV0IGl0IGRvZXMgY29udHJvbCBicmlnaHRuZXNzLiBUaGUgdmFsdWVzIGFyZSAwIC0gMTUgb25seSwgYW5kCisJICogdGhlIHRhYmxlIGFib3ZlIG1ha2VzIHRoZW0gYWN0IGNvbnNlY3V0aXZlbHkuCisJICovCisJaWYgKChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgTk9STV9CUklHSFRORVNTX0lEWCkpICYmCisJICAgIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgQVJHVVNfUUNfQlJJR0hUTkVTU19JRFgpKSkKIAkJcmV0dXJuOwogCi0JLyogTm90ZSByZWdpc3RlciA3IGlzIGFsc28gc2VlbiBhcyAweDh4IG9yIDB4Q3ggaW4gZHVtcHMgKi8KKwlpZiAoc2QtPmNhbV90eXBlID09IENBTV9UWVBFX1ZHQSkgeworCQlzaWduX3JlZyArPSA0OworCQl2YWx1ZV9yZWcgKz0gNDsKKwl9CisKKwkvKiBOb3RlIHJlZ2lzdGVyIDcgaXMgYWxzbyBzZWVuIGFzIDB4OHggb3IgMHhDeCBpbiBzb21lIGR1bXBzICovCiAJaWYgKHNkLT5icmlnaHRuZXNzID4gMCkgewotCQlzZW5zb3Jfd3JpdGUxKGdzcGNhX2RldiwgNywgMHgwMCk7CisJCXNlbnNvcl93cml0ZTEoZ3NwY2FfZGV2LCBzaWduX3JlZywgMHgwMCk7CiAJCXZhbCA9IHNkLT5icmlnaHRuZXNzOwogCX0gZWxzZSB7Ci0JCXNlbnNvcl93cml0ZTEoZ3NwY2FfZGV2LCA3LCAweDAxKTsKLQkJdmFsID0gMjU3IC0gc2QtPmJyaWdodG5lc3M7CisJCXNlbnNvcl93cml0ZTEoZ3NwY2FfZGV2LCBzaWduX3JlZywgMHgwMSk7CisJCXZhbCA9ICgyNTcgLSBzZC0+YnJpZ2h0bmVzcyk7CiAJfQotCXNlbnNvcl93cml0ZTEoZ3NwY2FfZGV2LCA4LCB2YWwpOworCS8qIFVzZSBsb29rdXAgdGFibGUgZm9yIGZ1bmt5IEFyZ3VzIFF1aWNrQ2xpeCBicmlnaHRuZXNzICovCisJaWYgKHNkLT5kb19sY2Rfc3RvcCkKKwkJdmFsID0gcXVpY2tfY2xpeF90YWJsZVt2YWxdOworCisJc2Vuc29yX3dyaXRlMShnc3BjYV9kZXYsIHZhbHVlX3JlZywgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQl1OCB2YWw7CisJaW50IGV4cG9zdXJlOworCXU4IGJ1ZlsyXTsKIAogCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgRVhQT1NVUkVfSURYKSkKIAkJcmV0dXJuOwogCi0JaWYgKHNkLT5zZW5zb3JfdHlwZSkgewotCQl2YWwgPSBzZC0+ZXhwb3N1cmUgPj4gNDsKLQkJc2Vuc29yX3dyaXRlMShnc3BjYV9kZXYsIDMsIHZhbCk7Ci0JCXZhbCA9IHNkLT5leHBvc3VyZSAmIDB4ZjsKLQkJc2Vuc29yX3dyaXRlMShnc3BjYV9kZXYsIDQsIHZhbCk7CisJaWYgKHNkLT5jYW1fdHlwZSA9PSBDQU1fVFlQRV9DSUYgJiYgc2QtPnNlbnNvcl90eXBlID09IDEpIHsKKwkJLyogVGhpcyBjYW0gZG9lcyBub3QgbGlrZSBleHBvc3VyZSBzZXR0aW5ncyA8IDMwMCwKKwkJICAgc28gc2NhbGUgMCAtIDQwOTUgdG8gMzAwIC0gNDA5NSAqLworCQlleHBvc3VyZSA9IChzZC0+ZXhwb3N1cmUgKiA5MjY3KSAvIDEwMDAwICsgMzAwOworCQlzZW5zb3Jfd3JpdGUxKGdzcGNhX2RldiwgMywgZXhwb3N1cmUgPj4gNCk7CisJCXNlbnNvcl93cml0ZTEoZ3NwY2FfZGV2LCA0LCBleHBvc3VyZSAmIDB4MGYpOwogCX0gZWxzZSB7Ci0JCXU4IGNsb2NrZGl2OwotCQlpbnQgZXhwb3N1cmU7Ci0KIAkJLyogV2UgaGF2ZSBib3RoIGEgY2xvY2sgZGl2aWRlciBhbmQgYW4gZXhwb3N1cmUgcmVnaXN0ZXIuCiAJCSAgIFdlIGZpcnN0IGNhbGN1bGF0ZSB0aGUgY2xvY2sgZGl2aWRlciwgYXMgdGhhdCBkZXRlcm1pbmVzCi0JCSAgIHRoZSBtYXhpbXVtIGV4cG9zdXJlIGFuZCB0aGVuIHdlIGNhbGN1bGF5dGUgdGhlIGV4cG9zdXJlCisJCSAgIHRoZSBtYXhpbXVtIGV4cG9zdXJlIGFuZCB0aGVuIHdlIGNhbGN1bGF0ZSB0aGUgZXhwb3N1cmUKIAkJICAgcmVnaXN0ZXIgc2V0dGluZyAod2hpY2ggZ29lcyBmcm9tIDAgLSA1MTEpLgogCiAJCSAgIE5vdGUgb3VyIDAgLSA0MDk1IGV4cG9zdXJlIGlzIG1hcHBlZCB0byAwIC0gNTExCiAJCSAgIG1pbGxpc2Vjb25kcyBleHBvc3VyZSB0aW1lICovCi0JCWNsb2NrZGl2ID0gKDYwICogc2QtPmV4cG9zdXJlICsgNzk5OSkgLyA4MDAwOworCQl1OCBjbG9ja2RpdiA9ICg2MCAqIHNkLT5leHBvc3VyZSArIDc5OTkpIC8gODAwMDsKIAogCQkvKiBMaW1pdCBmcmFtZXJhdGUgdG8gbm90IGV4Y2VlZCB1c2IgYmFuZHdpZHRoICovCi0JCWlmIChjbG9ja2RpdiA8IDMgJiYgZ3NwY2FfZGV2LT53aWR0aCA+PSAzMjApCi0JCQljbG9ja2RpdiA9IDM7CisJCWlmIChjbG9ja2RpdiA8IHNkLT5taW5fY2xvY2tkaXYgJiYgZ3NwY2FfZGV2LT53aWR0aCA+PSAzMjApCisJCQljbG9ja2RpdiA9IHNkLT5taW5fY2xvY2tkaXY7CiAJCWVsc2UgaWYgKGNsb2NrZGl2IDwgMikKIAkJCWNsb2NrZGl2ID0gMjsKIAorCQlpZiAoc2QtPmNhbV90eXBlID09IENBTV9UWVBFX1ZHQSAmJiBjbG9ja2RpdiA8IDQpCisJCQljbG9ja2RpdiA9IDQ7CisKIAkJLyogRnJhbWUgZXhwb3N1cmUgdGltZSBpbiBtcyA9IDEwMDAgKiBjbG9ja2RpdiAvIDYwIC0+CiAJCWV4cG9zdXJlID0gKHNkLT5leHBvc3VyZSAvIDgpICogNTExIC8gKDEwMDAgKiBjbG9ja2RpdiAvIDYwKSAqLwogCQlleHBvc3VyZSA9ICg2MCAqIDUxMSAqIHNkLT5leHBvc3VyZSkgLyAoODAwMCAqIGNsb2NrZGl2KTsKQEAgLTgxOSw5ICs5MzMsMTAgQEAKIAkJLyogZXhwb3N1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgcmV2ZXJzZWQhICovCiAJCWV4cG9zdXJlID0gNTExIC0gZXhwb3N1cmU7CiAKKwkJYnVmWzBdID0gZXhwb3N1cmUgJiAweGZmOworCQlidWZbMV0gPSBleHBvc3VyZSA+PiA4OworCQlzZW5zb3Jfd3JpdGVfcmVnKGdzcGNhX2RldiwgMHgwZSwgMCwgYnVmLCAyKTsKIAkJc2Vuc29yX3dyaXRlMShnc3BjYV9kZXYsIDB4MDIsIGNsb2NrZGl2KTsKLQkJc2Vuc29yX3dyaXRlMShnc3BjYV9kZXYsIDB4MGUsIGV4cG9zdXJlICYgMHhmZik7Ci0JCXNlbnNvcl93cml0ZTEoZ3NwY2FfZGV2LCAweDBmLCBleHBvc3VyZSA+PiA4KTsKIAl9CiB9CiAKQEAgLTgzMiw3ICs5NDcsNyBAQAogCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgR0FJTl9JRFgpKQogCQlyZXR1cm47CiAKLQlpZiAoc2QtPnNlbnNvcl90eXBlKSB7CisJaWYgKHNkLT5jYW1fdHlwZSA9PSBDQU1fVFlQRV9DSUYgJiYgc2QtPnNlbnNvcl90eXBlID09IDEpIHsKIAkJc2Vuc29yX3dyaXRlMShnc3BjYV9kZXYsIDB4MGUsIHNkLT5nYWluKTsKIAl9IGVsc2UgewogCQlzZW5zb3Jfd3JpdGUxKGdzcGNhX2RldiwgMHgxMCwgc2QtPmdhaW4pOwpAQCAtODkzLDE3ICsxMDA4LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2Rfc2V0bWluX2Nsb2NrZGl2KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5taW5fY2xvY2tkaXYgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRleHBvc3VyZShnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldG1pbl9jbG9ja2RpdihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5taW5fY2xvY2tkaXY7CisJcmV0dXJuIDA7Cit9CisKIC8qIEluY2x1ZGUgcGFjIGNvbW1vbiBzb2YgZGV0ZWN0aW9uIGZ1bmN0aW9ucyAqLwogI2luY2x1ZGUgInBhY19jb21tb24uaCIKIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwgICAgLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLCAgICAgICAgICAgICAgICAgICAvKiBpc29jIHBhY2tldCAqLwotCQkJaW50IGxlbikgICAgICAgICAgICAgICAgICAgICAgLyogaXNvIHBhY2tldCBsZW5ndGggKi8KKwkJCXU4ICpkYXRhLAkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCWludCBsZW4pCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogeworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAl1bnNpZ25lZCBjaGFyICpzb2Y7CiAKLQlzb2YgPSBwYWNfZmluZF9zb2YoZ3NwY2FfZGV2LCBkYXRhLCBsZW4pOworCXNvZiA9IHBhY19maW5kX3NvZigmc2QtPnNvZl9yZWFkLCBkYXRhLCBsZW4pOwogCWlmIChzb2YpIHsKIAkJaW50IG47CiAKQEAgLTkxMywxNSArMTA0NiwxNSBAQAogCQkJbiAtPSBzaXplb2YgcGFjX3NvZl9tYXJrZXI7CiAJCWVsc2UKIAkJCW4gPSAwOwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCiAJCQkJCWRhdGEsIG4pOwogCQkvKiBTdGFydCBuZXh0IGZyYW1lLiAqLwotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLAorCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCiAJCQlwYWNfc29mX21hcmtlciwgc2l6ZW9mIHBhY19zb2ZfbWFya2VyKTsKIAkJbGVuIC09IHNvZiAtIGRhdGE7CiAJCWRhdGEgPSBzb2Y7CiAJfQotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogfQogCiAvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCkBAIC05MzgsNiArMTA3MSw3IEBACiAKIC8qIC0tIG1vZHVsZSBpbml0aWFsaXNhdGlvbiAtLSAqLwogc3RhdGljIGNvbnN0IF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwOGNhLCAweDAxMTApfSwJLyogVHJ1c3QgU3B5Y0BtIDEwMCAqLwogCXtVU0JfREVWSUNFKDB4MDhjYSwgMHgwMTExKX0sCS8qIEFpcHRlayBQZW5jYW0gVkdBKyAqLwogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgwMTBmKX0sCS8qIEFsbCBvdGhlciBrbm93biBNUjk3MzEwQSBWR0EgY2FtcyAqLwogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgwMTBlKX0sCS8qIEFsbCBrbm93biBNUjk3MzEwQSBDSUYgY2FtcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCmluZGV4IGE1YzE5MGUuLmFkOWVjMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKQEAgLTIsMTQgKzIsMTkgQEAKICAqIE9WNTE5IGRyaXZlcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwOCBKZWFuLUZyYW5jb2lzIE1vaW5lIChodHRwOi8vbW9pbmVqZi5mcmVlLmZyKQorICogQ29weXJpZ2h0IChDKSAyMDA5IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CiAgKgogICogVGhpcyBtb2R1bGUgaXMgYWRhcHRlZCBmcm9tIHRoZSBvdjUxeC1qcGVnIHBhY2thZ2UsIHdoaWNoIGl0c2VsZgogICogd2FzIGFkYXB0ZWQgZnJvbSB0aGUgb3Y1MTEgZHJpdmVyLgogICoKICAqIE9yaWdpbmFsIGNvcHlyaWdodCBmb3IgdGhlIG92NTExIGRyaXZlciBpczoKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBNYXJrIFcuIE1jQ2xlbGxhbmQKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IE1hcmsgVy4gTWNDbGVsbGFuZAogICogU3VwcG9ydCBmb3IgT1Y1MTksIE9WODYxMCBDb3B5cmlnaHQgKGMpIDIwMDMgSm9lcmcgSGVja2VuYmFjaAorICogTWFueSBpbXByb3ZlbWVudHMgYnkgQnJldCBXYWxsYWNoIDxid2FsbGFjMUBzYW4ucnIuY29tPgorICogQ29sb3IgZml4ZXMgYnkgYnkgT3Jpb24gU2t5IExhd2xvciA8b2xhd2xvckBhY20ub3JnPiAoMi8yNi8yMDAwKQorICogT1Y3NjIwIGZpeGVzIGJ5IENoYXJsIFAuIEJvdGhhIDxjcGJvdGhhQGllZWUub3JnPgorICogQ2hhbmdlcyBieSBDbGF1ZGlvIE1hdHN1b2thIDxjbGF1ZGlvQGNvbmVjdGl2YS5jb20+CiAgKgogICogb3Y1MXgtanBlZyBvcmlnaW5hbCBjb3B5cmlnaHQgaXM6CiAgKgpAQCAtNTgsNiArNjMsOCBAQAogI2RlZmluZSBCUklER0VfT1Y1MTgJCTIKICNkZWZpbmUgQlJJREdFX09WNTE4UExVUwkzCiAjZGVmaW5lIEJSSURHRV9PVjUxOQkJNAorI2RlZmluZSBCUklER0VfT1ZGWDIJCTUKKyNkZWZpbmUgQlJJREdFX1c5OTY4Q0YJCTYKICNkZWZpbmUgQlJJREdFX01BU0sJCTcKIAogCWNoYXIgaW52ZXJ0X2xlZDsKQEAgLTczLDYgKzgwLDEwIEBACiAJX191OCB2ZmxpcDsKIAlfX3U4IGF1dG9icmlnaHRuZXNzOwogCV9fdTggZnJlcTsKKwlfX3U4IHF1YWxpdHk7CisjZGVmaW5lIFFVQUxJVFlfTUlOIDUwCisjZGVmaW5lIFFVQUxJVFlfTUFYIDcwCisjZGVmaW5lIFFVQUxJVFlfREVGIDUwCiAKIAlfX3U4IHN0b3BwZWQ7CQkvKiBTdHJlYW1pbmcgaXMgdGVtcG9yYXJpbHkgcGF1c2VkICovCiAKQEAgLTgxLDE3ICs5MiwzMSBAQAogCiAJY2hhciBzZW5zb3I7CQkvKiBUeXBlIG9mIGltYWdlIHNlbnNvciBjaGlwIChTRU5fKikgKi8KICNkZWZpbmUgU0VOX1VOS05PV04gMAotI2RlZmluZSBTRU5fT1Y2NjIwIDEKLSNkZWZpbmUgU0VOX09WNjYzMCAyCi0jZGVmaW5lIFNFTl9PVjY2MzA4QUYgMwotI2RlZmluZSBTRU5fT1Y3NjEwIDQKLSNkZWZpbmUgU0VOX09WNzYyMCA1Ci0jZGVmaW5lIFNFTl9PVjc2NDAgNgotI2RlZmluZSBTRU5fT1Y3NjcwIDcKLSNkZWZpbmUgU0VOX09WNzZCRSA4Ci0jZGVmaW5lIFNFTl9PVjg2MTAgOQorI2RlZmluZSBTRU5fT1YyNjEwIDEKKyNkZWZpbmUgU0VOX09WMzYxMCAyCisjZGVmaW5lIFNFTl9PVjY2MjAgMworI2RlZmluZSBTRU5fT1Y2NjMwIDQKKyNkZWZpbmUgU0VOX09WNjYzMDhBRiA1CisjZGVmaW5lIFNFTl9PVjc2MTAgNgorI2RlZmluZSBTRU5fT1Y3NjIwIDcKKyNkZWZpbmUgU0VOX09WNzY0MCA4CisjZGVmaW5lIFNFTl9PVjc2NzAgOQorI2RlZmluZSBTRU5fT1Y3NkJFIDEwCisjZGVmaW5lIFNFTl9PVjg2MTAgMTEKKworCXU4IHNlbnNvcl9hZGRyOworCWludCBzZW5zb3Jfd2lkdGg7CisJaW50IHNlbnNvcl9oZWlnaHQ7CisJaW50IHNlbnNvcl9yZWdfY2FjaGVbMjU2XTsKKworCXU4ICpqcGVnX2hkcjsKIH07CiAKKy8qIE5vdGUgdGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCB0aGUgdzk5NjhjZiBkcml2ZXIgbmVlZHMgdGhlIGNvZGUgZm9yIGFsbAorICAgdGhlIG92IHNlbnNvcnMgd2hpY2ggaXMgYWxyZWFkeSBwcmVzZW50IGhlcmUuIFdoZW4gd2UgaGF2ZSB0aGUgdGltZSB3ZQorICAgcmVhbGx5IHNob3VsZCBtb3ZlIHRoZSBzZW5zb3IgZHJpdmVycyB0byB2NGwyIHN1YiBkcml2ZXJzLiAqLworI2luY2x1ZGUgInc5OTZYY2YuYyIKKwogLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwogc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIHN0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwpAQCAtMzQ1LDYgKzM3MCw3NSBAQAogCQkucHJpdiA9IDB9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgb3ZmeDJfdmdhX21vZGVbXSA9IHsKKwl7MzIwLCAyNDAsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDMyMCwKKwkJLnNpemVpbWFnZSA9IDMyMCAqIDI0MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxfSwKKwl7NjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDY0MCwKKwkJLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAwfSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBvdmZ4Ml9jaWZfbW9kZVtdID0geworCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMTYwLAorCQkuc2l6ZWltYWdlID0gMTYwICogMTIwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDN9LAorCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMTc2LAorCQkuc2l6ZWltYWdlID0gMTc2ICogMTQ0LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDF9LAorCXszMjAsIDI0MCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMzIwLAorCQkuc2l6ZWltYWdlID0gMzIwICogMjQwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDJ9LAorCXszNTIsIDI4OCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMzUyLAorCQkuc2l6ZWltYWdlID0gMzUyICogMjg4LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDB9LAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IG92ZngyX292MjYxMF9tb2RlW10gPSB7CisJezE2MDAsIDEyMDAsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDE2MDAsCisJCS5zaXplaW1hZ2UgPSAxNjAwICogMTIwMCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgb3ZmeDJfb3YzNjEwX21vZGVbXSA9IHsKKwl7NjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDY0MCwKKwkJLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxfSwKKwl7ODAwLCA2MDAsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDgwMCwKKwkJLnNpemVpbWFnZSA9IDgwMCAqIDYwMCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxfSwKKwl7MTAyNCwgNzY4LCBWNEwyX1BJWF9GTVRfU0JHR1I4LCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSAxMDI0LAorCQkuc2l6ZWltYWdlID0gMTAyNCAqIDc2OCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxfSwKKwl7MTYwMCwgMTIwMCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMTYwMCwKKwkJLnNpemVpbWFnZSA9IDE2MDAgKiAxMjAwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDB9LAorCXsyMDQ4LCAxNTM2LCBWNEwyX1BJWF9GTVRfU0JHR1I4LCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSAyMDQ4LAorCQkuc2l6ZWltYWdlID0gMjA0OCAqIDE1MzYsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gMH0sCit9OworCisKIC8qIFJlZ2lzdGVycyBjb21tb24gdG8gT1Y1MTEgLyBPVjUxOCAqLwogI2RlZmluZSBSNTF4X0ZJRk9fUFNJWkUJCQkweDMwCS8qIDIgYnl0ZXMgd2lkZSB3LyBPVjUxOCgrKSAqLwogI2RlZmluZSBSNTF4X1NZU19SRVNFVCAgICAgICAgICAJMHg1MApAQCAtNDA2LDYgKzUwMCwzMCBAQAogCiAjZGVmaW5lIE9WNTExX0VORFBPSU5UX0FERFJFU1MgIDEJLyogSXNvYyBlbmRwb2ludCBudW1iZXIgKi8KIAorLyoKKyAqIFRoZSBGWDIgY2hpcCBkb2VzIG5vdCBnaXZlIHVzIGEgemVybyBsZW5ndGggcmVhZCBhdCBlbmQgb2YgZnJhbWUuCisgKiBJdCBkb2VzLCBob3dldmVyLCBnaXZlIGEgc2hvcnQgcmVhZCBhdCB0aGUgZW5kIG9mIGEgZnJhbWUsIGlmCisgKiBuZWNjZXNzYXJ5LCByYXRoZXIgdGhhbiBydW4gdHdvIGZyYW1lcyB0b2dldGhlci4KKyAqCisgKiBCeSBjaG9vc2luZyB0aGUgcmlnaHQgYnVsayB0cmFuc2ZlciBzaXplLCB3ZSBhcmUgZ3VhcmFudGVlZCB0byBhbHdheXMKKyAqIGdldCBhIHNob3J0IHJlYWQgZm9yIHRoZSBsYXN0IHJlYWQgb2YgZWFjaCBmcmFtZS4gIEZyYW1lIHNpemVzIGFyZQorICogYWx3YXlzIGEgY29tcG9zaXRlIG51bWJlciAod2lkdGggKiBoZWlnaHQsIG9yIGEgbXVsdGlwbGUpIHNvIGlmIHdlCisgKiBjaG9vc2UgYSBwcmltZSBudW1iZXIsIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhlIGxhc3QgcmVhZCBvZiBhCisgKiBmcmFtZSB3aWxsIGJlIHNob3J0LgorICoKKyAqIEJ1dCBpdCBpc24ndCB0aGF0IGVhc3k6IHRoZSAyLjYga2VybmVsIHJlcXVpcmVzIGEgbXVsdGlwbGUgb2YgNEtCLAorICogb3RoZXJ3aXNlIEVPVkVSRkxPVyAiYmFiYmxpbmciIGVycm9ycyBvY2N1ci4gIEkgaGF2ZSBub3QgYmVlbiBhYmxlCisgKiB0byBmaWd1cmUgb3V0IHdoeS4gIFtQTWlsbGVyXQorICoKKyAqIFRoZSBjb25zdGFudCAoMTMgKiA0MDk2KSBpcyB0aGUgbGFyZ2VzdCAicHJpbWUgZW5vdWdoIiBudW1iZXIgbGVzcyB0aGFuIDY0S0IuCisgKgorICogSXQgaXNuJ3QgZW5vdWdoIHRvIGtub3cgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgZnJhbWUsIGluIGNhc2Ugd2UKKyAqIGhhdmUgZGF0YSBkcm9wb3V0cyBvciBidWZmZXIgb3ZlcnJ1bnMgKGV2ZW4gdGhvdWdoIHRoZSBGWDIgZG91YmxlCisgKiBidWZmZXJzLCB0aGVyZSBhcmUgc29tZSBwcmV0dHkgc3RyaWN0IHJlYWwgdGltZSBjb25zdHJhaW50cyBmb3IKKyAqIGlzb2Nocm9ub3VzIHRyYW5zZmVyIGZvciBsYXJnZXIgZnJhbWUgc2l6ZXMpLgorICovCisjZGVmaW5lIE9WRlgyX0JVTEtfU0laRSAoMTMgKiA0MDk2KQorCiAvKiBJMkMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFI1MXhfSTJDX1dfU0lECQkweDQxCiAjZGVmaW5lIFI1MXhfSTJDX1NBRERSXzMJMHg0MgpAQCAtNDEzLDkgKzUzMSwxMSBAQAogI2RlZmluZSBSNTF4X0kyQ19SX1NJRAkJMHg0NAogI2RlZmluZSBSNTF4X0kyQ19EQVRBCQkweDQ1CiAjZGVmaW5lIFI1MThfSTJDX0NUTAkJMHg0NwkvKiBPVjUxOCgrKSBvbmx5ICovCisjZGVmaW5lIE9WRlgyX0kyQ19BRERSCQkweDAwCiAKIC8qIEkyQyBBRERSRVNTRVMgKi8KICNkZWZpbmUgT1Y3eHgwX1NJRCAgIDB4NDIKKyNkZWZpbmUgT1ZfSElSRVNfU0lEIDB4NjAJCS8qIE9WOXh4eCAvIE9WMnh4eCAvIE9WM3h4eCAqLwogI2RlZmluZSBPVjh4eDBfU0lEICAgMHhhMAogI2RlZmluZSBPVjZ4eDBfU0lEICAgMHhjMAogCkBAIC01MDgsNiArNjI4LDY5NiBAQAogCV9fdTggdmFsOwogfTsKIAorLyogU2V0dGluZ3MgZm9yIE9WMjYxMCBjYW1lcmEgY2hpcCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyBub3JtXzI2MTBbXSA9Cit7CisJeyAweDEyLCAweDgwIH0sCS8qIHJlc2V0ICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzIG5vcm1fMzYyMGJbXSA9Cit7CisJLyoKKwkgKiBGcm9tIHRoZSBkYXRhc2hlZXQ6ICJOb3RlIHRoYXQgYWZ0ZXIgd3JpdGluZyB0byByZWdpc3RlciBDT01ICisJICogKDB4MTIpIHRvIGNoYW5nZSB0aGUgc2Vuc29yIG1vZGUsIHJlZ2lzdGVycyByZWxhdGVkIHRvIHRoZQorCSAqIHNlbnNvcuKAmXMgY3JvcHBpbmcgd2luZG93IHdpbGwgYmUgcmVzZXQgYmFjayB0byB0aGVpciBkZWZhdWx0CisJICogdmFsdWVzLiIKKwkgKgorCSAqICJ3YWl0IDQwOTYgZXh0ZXJuYWwgY2xvY2sgLi4uIHRvIG1ha2Ugc3VyZSB0aGUgc2Vuc29yIGlzCisJICogc3RhYmxlIGFuZCByZWFkeSB0byBhY2Nlc3MgcmVnaXN0ZXJzIiBpLmUuIDE2MHVzIGF0IDI0TUh6CisJICovCisKKwl7IDB4MTIsIDB4ODAgfSwgLyogQ09NSCByZXNldCAqLworCXsgMHgxMiwgMHgwMCB9LCAvKiBRWEdBLCBtYXN0ZXIgKi8KKworCS8qCisJICogMTEgQ0xLUkMgIkNsb2NrIFJhdGUgQ29udHJvbCIKKwkgKiBbN10gaW50ZXJuYWwgZnJlcXVlbmN5IGRvdWJsZXJzOiBvbgorCSAqIFs2XSB2aWRlbyBwb3J0IG1vZGU6IG1hc3RlcgorCSAqIFs1OjBdIGNsb2NrIGRpdmlkZXI6IDEKKwkgKi8KKwl7IDB4MTEsIDB4ODAgfSwKKworCS8qCisJICogMTMgQ09NSSAiQ29tbW9uIENvbnRyb2wgSSIKKwkgKiAgICAgICAgICAgICAgICAgID0gMTkyICgweEMwKSAxMTAwMDAwMAorCSAqICAgIENPTUlbN10gIkFFQyBzcGVlZCBzZWxlY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgMS4uLi4uLi4gIkZhc3RlciBBRUMgY29ycmVjdGlvbiIKKwkgKiAgICBDT01JWzZdICJBRUMgc3BlZWQgc3RlcCBzZWxlY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgLjEuLi4uLi4gIkJpZyBzdGVwcywgZmFzdCIKKwkgKiAgICBDT01JWzVdICJCYW5kaW5nIGZpbHRlciBvbiBvZmYiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4wLi4uLi4gIk9mZiIKKwkgKiAgICBDT01JWzRdICJCYW5kaW5nIGZpbHRlciBvcHRpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uMC4uLi4gIk1haW4gY2xvY2sgaXMgNDggTUh6IGFuZAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUExMIGlzIE9OIgorCSAqICAgIENPTUlbM10gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4wLi4uCisJICogICAgQ09NSVsyXSAiQUdDIGF1dG8gbWFudWFsIGNvbnRyb2wgc2VsZWN0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uMC4uICJNYW51YWwiCisJICogICAgQ09NSVsxXSAiQVdCIGF1dG8gbWFudWFsIGNvbnRyb2wgc2VsZWN0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLjAuICJNYW51YWwiCisJICogICAgQ09NSVswXSAiRXhwb3N1cmUgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4uMCAiTWFudWFsIgorCSAqLworCXsgMHgxMywgMHhDMCB9LAorCisJLyoKKwkgKiAwOSBDT01DICJDb21tb24gQ29udHJvbCBDIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDggKDB4MDgpIDAwMDAxMDAwCisJICogICAgQ09NQ1s3OjVdICJSZXNlcnZlZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMDAuLi4uLgorCSAqICAgIENPTUNbNF0gIlNsZWVwIE1vZGUgRW5hYmxlIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLjAuLi4uICJOb3JtYWwgbW9kZSIKKwkgKiAgICBDT01DWzM6Ml0gIlNlbnNvciBzYW1wbGluZyByZXNldCB0aW1pbmcgc2VsZWN0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDIgKDB4MDIpIC4uLi4xMC4uICJMb25nZXIgcmVzZXQgdGltZSIKKwkgKiAgICBDT01DWzE6MF0gIk91dHB1dCBkcml2ZSBjdXJyZW50IHNlbGVjdCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4wMCAiV2Vha2VzdCIKKwkgKi8KKwl7IDB4MDksIDB4MDggfSwKKworCS8qCisJICogMEMgQ09NRCAiQ29tbW9uIENvbnRyb2wgRCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICA4ICgweDA4KSAwMDAwMTAwMAorCSAqICAgIENPTURbN10gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAuLi4uLi4uCisJICogICAgQ09NRFs2XSAiU3dhcCBNU0IgYW5kIExTQiBhdCB0aGUgb3V0cHV0IHBvcnQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLjAuLi4uLi4gIkZhbHNlIgorCSAqICAgIENPTURbNTozXSAiUmVzZXJ2ZWQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgLi4wMDEuLi4KKwkgKiAgICBDT01EWzJdICJPdXRwdXQgQXZlcmFnZSBPbiBPZmYiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4wLi4gIk91dHB1dCBOb3JtYWwiCisJICogICAgQ09NRFsxXSAiU2Vuc29yIHByZWNoYXJnZSB2b2x0YWdlIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4wLiAiU2VsZWN0cyBpbnRlcm5hbAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgcHJlY2hhcmdlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHRhZ2UiCisJICogICAgQ09NRFswXSAiU25hcHNob3Qgb3B0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLi4wICJFbmFibGUgbGl2ZSB2aWRlbyBvdXRwdXQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgc25hcHNob3Qgc2VxdWVuY2UiCisJICovCisJeyAweDBjLCAweDA4IH0sCisKKwkvKgorCSAqIDBEIENPTUUgIkNvbW1vbiBDb250cm9sIEUiCisJICogICAgICAgICAgICAgICAgICA9IDE2MSAoMHhBMSkgMTAxMDAwMDEKKwkgKiAgICBDT01FWzddICJPdXRwdXQgYXZlcmFnZSBvcHRpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgMS4uLi4uLi4gIk91dHB1dCBhdmVyYWdlIG9mIDQgcGl4ZWxzIgorCSAqICAgIENPTUVbNl0gIkFudGktYmxvb21pbmcgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuMC4uLi4uLiAiT2ZmIgorCSAqICAgIENPTUVbNTozXSAiUmVzZXJ2ZWQiCisJICogICAgICAgICAgICAgICAgICA9ICAgNCAoMHgwNCkgLi4xMDAuLi4KKwkgKiAgICBDT01FWzJdICJDbG9jayBvdXRwdXQgcG93ZXIgZG93biBwaW4gc3RhdHVzIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uMC4uICJUcmktc3RhdGUgZGF0YSBvdXRwdXQgcGluCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHBvd2VyIGRvd24iCisJICogICAgQ09NRVsxXSAiRGF0YSBvdXRwdXQgcGluIHN0YXR1cyBzZWxlY3Rpb24gYXQgcG93ZXIgZG93biIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4wLiAiVHJpLXN0YXRlIFZTWU5DLCBQQ0xLLAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGLCBhbmQgQ0hTWU5DIHBpbnMgb24KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXIgZG93biIKKwkgKiAgICBDT01FWzBdICJBdXRvIHplcm8gY2lyY3VpdCBzZWxlY3QiCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgLi4uLi4uLjEgIk9uIgorCSAqLworCXsgMHgwZCwgMHhBMSB9LAorCisJLyoKKwkgKiAwRSBDT01GICJDb21tb24gQ29udHJvbCBGIgorCSAqICAgICAgICAgICAgICAgICAgPSAxMTIgKDB4NzApIDAxMTEwMDAwCisJICogICAgQ09NRls3XSAiU3lzdGVtIGNsb2NrIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwLi4uLi4uLiAiVXNlIDI0IE1IeiBzeXN0ZW0gY2xvY2siCisJICogICAgQ09NRls2OjRdICJSZXNlcnZlZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICA3ICgweDA3KSAuMTExLi4uLgorCSAqICAgIENPTUZbM10gIk1hbnVhbCBhdXRvIG5lZ2F0aXZlIG9mZnNldCBjYW5jZWxpbmcgc2VsZWN0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4wLi4uICJBdXRvIGRldGVjdCBuZWdhdGl2ZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgYW5kIGNhbmNlbCBpdCIKKwkgKiAgICBDT01GWzI6MF0gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uMDAwCisJICovCisJeyAweDBlLCAweDcwIH0sCisKKwkvKgorCSAqIDBGIENPTUcgIkNvbW1vbiBDb250cm9sIEciCisJICogICAgICAgICAgICAgICAgICA9ICA2NiAoMHg0MikgMDEwMDAwMTAKKwkgKiAgICBDT01HWzddICJPcHRpY2FsIGJsYWNrIG91dHB1dCBzZWxlY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMC4uLi4uLi4gIkRpc2FibGUiCisJICogICAgQ09NR1s2XSAiQmxhY2sgbGV2ZWwgY2FsaWJyYXRlIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAxICgweDAxKSAuMS4uLi4uLiAiVXNlIG9wdGljYWwgYmxhY2sgcGl4ZWxzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNhbGlicmF0ZSIKKwkgKiAgICBDT01HWzU6NF0gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uMDAuLi4uCisJICogICAgQ09NR1szXSAiQ2hhbm5lbCBvZmZzZXQgYWRqdXN0bWVudCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uMC4uLiAiRGlzYWJsZSBvZmZzZXQgYWRqdXN0bWVudCIKKwkgKiAgICBDT01HWzJdICJBREMgYmxhY2sgbGV2ZWwgY2FsaWJyYXRpb24gb3B0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uMC4uICJVc2UgQi9HIGxpbmUgYW5kIEcvUgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lIHRvIGNhbGlicmF0ZSBlYWNoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwncyBibGFjayBsZXZlbCIKKwkgKiAgICBDT01HWzFdICJSZXNlcnZlZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAxICgweDAxKSAuLi4uLi4xLgorCSAqICAgIENPTUdbMF0gIkFEQyBibGFjayBsZXZlbCBjYWxpYnJhdGlvbiBlbmFibGUiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4uLjAgIkRpc2FibGUiCisJICovCisJeyAweDBmLCAweDQyIH0sCisKKwkvKgorCSAqIDE0IENPTUogIkNvbW1vbiBDb250cm9sIEoiCisJICogICAgICAgICAgICAgICAgICA9IDE5OCAoMHhDNikgMTEwMDAxMTAKKwkgKiAgICBDT01KWzc6Nl0gIkFHQyBnYWluIGNlaWxpbmciCisJICogICAgICAgICAgICAgICAgICA9ICAgMyAoMHgwMykgMTEuLi4uLi4gIjh4IgorCSAqICAgIENPTUpbNTo0XSAiUmVzZXJ2ZWQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4wMC4uLi4KKwkgKiAgICBDT01KWzNdICJBdXRvIGJhbmRpbmcgZmlsdGVyIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4wLi4uICJCYW5kaW5nIGZpbHRlciBpcyBhbHdheXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gb2ZmIGRlcGVuZGluZyBvbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01JWzVdIHNldHRpbmciCisJICogICAgQ09NSlsyXSAiVlNZTkMgZHJvcCBvcHRpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgLi4uLi4xLi4gIlNZTkMgaXMgZHJvcHBlZCBpZiBmcmFtZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGRyb3BwZWQiCisJICogICAgQ09NSlsxXSAiRnJhbWUgZGF0YSBkcm9wIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDEgKDB4MDEpIC4uLi4uLjEuICJEcm9wIGZyYW1lIGRhdGEgaWYKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3N1cmUgaXMgbm90IHdpdGhpbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2xlcmFuY2UuICBJbiBBRUMgbW9kZSwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBub3JtYWxseSBkcm9wcGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gZGF0YSBpcyBvdXQgb2YKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuIgorCSAqICAgIENPTUpbMF0gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLi4wCisJICovCisJeyAweDE0LCAweEM2IH0sCisKKwkvKgorCSAqIDE1IENPTUsgIkNvbW1vbiBDb250cm9sIEsiCisJICogICAgICAgICAgICAgICAgICA9ICAgMiAoMHgwMikgMDAwMDAwMTAKKwkgKiAgICBDT01LWzddICJDSFNZTkMgcGluIG91dHB1dCBzd2FwIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAuLi4uLi4uICJDSFNZTkMiCisJICogICAgQ09NS1s2XSAiSFJFRiBwaW4gb3V0cHV0IHN3YXAiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLjAuLi4uLi4gIkhSRUYiCisJICogICAgQ09NS1s1XSAiUENMSyBvdXRwdXQgc2VsZWN0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uMC4uLi4uICJQQ0xLIGFsd2F5cyBvdXRwdXQiCisJICogICAgQ09NS1s0XSAiUENMSyBlZGdlIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4wLi4uLiAiRGF0YSB2YWxpZCBvbiBmYWxsaW5nIGVkZ2UiCisJICogICAgQ09NS1szXSAiSFJFRiBvdXRwdXQgcG9sYXJpdHkiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLjAuLi4gInBvc2l0aXZlIgorCSAqICAgIENPTUtbMl0gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uMC4uCisJICogICAgQ09NS1sxXSAiVlNZTkMgcG9sYXJpdHkiCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgLi4uLi4uMS4gIm5lZ2F0aXZlIgorCSAqICAgIENPTUtbMF0gIkhTWU5DIHBvbGFyaXR5IgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLi4wICJwb3NpdGl2ZSIKKwkgKi8KKwl7IDB4MTUsIDB4MDIgfSwKKworCS8qCisJICogMzMgQ0hMRiAiQ3VycmVudCBDb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDkgKDB4MDkpIDAwMDAxMDAxCisJICogICAgQ0hMRls3OjZdICJTZW5zb3IgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAwLi4uLi4uCisJICogICAgQ0hMRls1XSAiU2Vuc29yIGN1cnJlbnQgcmFuZ2UgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLjAuLi4uLiAibm9ybWFsIHJhbmdlIgorCSAqICAgIENITEZbNF0gIlNlbnNvciBjdXJyZW50IgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLjAuLi4uICJub3JtYWwgY3VycmVudCIKKwkgKiAgICBDSExGWzNdICJTZW5zb3IgYnVmZmVyIGN1cnJlbnQgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAxICgweDAxKSAuLi4uMS4uLiAiaGFsZiBjdXJyZW50IgorCSAqICAgIENITEZbMl0gIkNvbHVtbiBidWZmZXIgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uMC4uICJub3JtYWwgY3VycmVudCIKKwkgKiAgICBDSExGWzFdICJBbmFsb2cgRFNQIGN1cnJlbnQgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4wLiAibm9ybWFsIGN1cnJlbnQiCisJICogICAgQ0hMRlsxXSAiQURDIGN1cnJlbnQgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4wLiAibm9ybWFsIGN1cnJlbnQiCisJICovCisJeyAweDMzLCAweDA5IH0sCisKKwkvKgorCSAqIDM0IFZCTE0gIkJsb29taW5nIENvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICA4MCAoMHg1MCkgMDEwMTAwMDAKKwkgKiAgICBWQkxNWzddICJIYXJkIHNvZnQgcmVzZXQgc3dpdGNoIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAuLi4uLi4uICJIYXJkIHJlc2V0IgorCSAqICAgIFZCTE1bNjo0XSAiQmxvb21pbmcgdm9sdGFnZSBzZWxlY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgNSAoMHgwNSkgLjEwMS4uLi4KKwkgKiAgICBWQkxNWzM6MF0gIlNlbnNvciBjdXJyZW50IGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLjAwMDAKKwkgKi8KKwl7IDB4MzQsIDB4NTAgfSwKKworCS8qCisJICogMzYgVkNIRyAiU2Vuc29yIFByZWNoYXJnZSBWb2x0YWdlIENvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKiAgICBWQ0hHWzddICJSZXNlcnZlZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwLi4uLi4uLgorCSAqICAgIFZDSEdbNjo0XSAiU2Vuc29yIHByZWNoYXJnZSB2b2x0YWdlIGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLjAwMC4uLi4KKwkgKiAgICBWQ0hHWzM6MF0gIlNlbnNvciBhcnJheSBjb21tb24gcmVmZXJlbmNlIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4wMDAwCisJICovCisJeyAweDM2LCAweDAwIH0sCisKKwkvKgorCSAqIDM3IEFEQyAiQURDIFJlZmVyZW5jZSBDb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDQgKDB4MDQpIDAwMDAwMTAwCisJICogICAgQURDWzc6NF0gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAwMDAuLi4uCisJICogICAgQURDWzNdICJBREMgaW5wdXQgc2lnbmFsIHJhbmdlIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4wLi4uICJJbnB1dCBzaWduYWwgMS4weCIKKwkgKiAgICBBRENbMjowXSAiQURDIHJhbmdlIGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgNCAoMHgwNCkgLi4uLi4xMDAKKwkgKi8KKwl7IDB4MzcsIDB4MDQgfSwKKworCS8qCisJICogMzggQUNPTSAiQW5hbG9nIENvbW1vbiBHcm91bmQiCisJICogICAgICAgICAgICAgICAgICA9ICA4MiAoMHg1MikgMDEwMTAwMTAKKwkgKiAgICBBQ09NWzddICJBbmFsb2cgZ2FpbiBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAuLi4uLi4uICJHYWluIDF4IgorCSAqICAgIEFDT01bNl0gIkFuYWxvZyBibGFjayBsZXZlbCBjYWxpYnJhdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAxICgweDAxKSAuMS4uLi4uLiAiT24iCisJICogICAgQUNPTVs1OjBdICJSZXNlcnZlZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDE4ICgweDEyKSAuLjAxMDAxMAorCSAqLworCXsgMHgzOCwgMHg1MiB9LAorCisJLyoKKwkgKiAzQSBGUkVGQSAiSW50ZXJuYWwgUmVmZXJlbmNlIEFkanVzdG1lbnQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKiAgICBGUkVGQVs3OjBdICJSYW5nZSIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqLworCXsgMHgzYSwgMHgwMCB9LAorCisJLyoKKwkgKiAzQyBGVk9QVCAiSW50ZXJuYWwgUmVmZXJlbmNlIEFkanVzdG1lbnQiCisJICogICAgICAgICAgICAgICAgICA9ICAzMSAoMHgxRikgMDAwMTExMTEKKwkgKiAgICBGVk9QVFs3OjBdICJSYW5nZSIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDMxICgweDFGKSAwMDAxMTExMQorCSAqLworCXsgMHgzYywgMHgxRiB9LAorCisJLyoKKwkgKiA0NCBVbmRvY3VtZW50ZWQgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqICAgIDQ0Wzc6MF0gIkl0J3MgYSBzZWNyZXQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKi8KKwl7IDB4NDQsIDB4MDAgfSwKKworCS8qCisJICogNDAgVW5kb2N1bWVudGVkICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKiAgICA0MFs3OjBdICJJdCdzIGEgc2VjcmV0IgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAwMDAwMDAwCisJICovCisJeyAweDQwLCAweDAwIH0sCisKKwkvKgorCSAqIDQxIFVuZG9jdW1lbnRlZCAgPSAgIDAgKDB4MDApIDAwMDAwMDAwCisJICogICAgNDFbNzowXSAiSXQncyBhIHNlY3JldCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqLworCXsgMHg0MSwgMHgwMCB9LAorCisJLyoKKwkgKiA0MiBVbmRvY3VtZW50ZWQgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqICAgIDQyWzc6MF0gIkl0J3MgYSBzZWNyZXQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKi8KKwl7IDB4NDIsIDB4MDAgfSwKKworCS8qCisJICogNDMgVW5kb2N1bWVudGVkICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKiAgICA0M1s3OjBdICJJdCdzIGEgc2VjcmV0IgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAwMDAwMDAwCisJICovCisJeyAweDQzLCAweDAwIH0sCisKKwkvKgorCSAqIDQ1IFVuZG9jdW1lbnRlZCAgPSAxMjggKDB4ODApIDEwMDAwMDAwCisJICogICAgNDVbNzowXSAiSXQncyBhIHNlY3JldCIKKwkgKiAgICAgICAgICAgICAgICAgID0gMTI4ICgweDgwKSAxMDAwMDAwMAorCSAqLworCXsgMHg0NSwgMHg4MCB9LAorCisJLyoKKwkgKiA0OCBVbmRvY3VtZW50ZWQgID0gMTkyICgweEMwKSAxMTAwMDAwMAorCSAqICAgIDQ4Wzc6MF0gIkl0J3MgYSBzZWNyZXQiCisJICogICAgICAgICAgICAgICAgICA9IDE5MiAoMHhDMCkgMTEwMDAwMDAKKwkgKi8KKwl7IDB4NDgsIDB4QzAgfSwKKworCS8qCisJICogNDkgVW5kb2N1bWVudGVkICA9ICAyNSAoMHgxOSkgMDAwMTEwMDEKKwkgKiAgICA0OVs3OjBdICJJdCdzIGEgc2VjcmV0IgorCSAqICAgICAgICAgICAgICAgICAgPSAgMjUgKDB4MTkpIDAwMDExMDAxCisJICovCisJeyAweDQ5LCAweDE5IH0sCisKKwkvKgorCSAqIDRCIFVuZG9jdW1lbnRlZCAgPSAxMjggKDB4ODApIDEwMDAwMDAwCisJICogICAgNEJbNzowXSAiSXQncyBhIHNlY3JldCIKKwkgKiAgICAgICAgICAgICAgICAgID0gMTI4ICgweDgwKSAxMDAwMDAwMAorCSAqLworCXsgMHg0QiwgMHg4MCB9LAorCisJLyoKKwkgKiA0RCBVbmRvY3VtZW50ZWQgID0gMTk2ICgweEM0KSAxMTAwMDEwMAorCSAqICAgIDREWzc6MF0gIkl0J3MgYSBzZWNyZXQiCisJICogICAgICAgICAgICAgICAgICA9IDE5NiAoMHhDNCkgMTEwMDAxMDAKKwkgKi8KKwl7IDB4NEQsIDB4QzQgfSwKKworCS8qCisJICogMzUgVlJFRiAiUmVmZXJlbmNlIFZvbHRhZ2UgQ29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDc2ICgweDRDKSAwMTAwMTEwMAorCSAqICAgIFZSRUZbNzo1XSAiQ29sdW1uIGhpZ2ggcmVmZXJlbmNlIGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMiAoMHgwMikgMDEwLi4uLi4gImhpZ2hlciB2b2x0YWdlIgorCSAqICAgIFZSRUZbNDoyXSAiQ29sdW1uIGxvdyByZWZlcmVuY2UgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAzICgweDAzKSAuLi4wMTEuLiAiSGlnaGVzdCB2b2x0YWdlIgorCSAqICAgIFZSRUZbMTowXSAiUmVzZXJ2ZWQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4uMDAKKwkgKi8KKwl7IDB4MzUsIDB4NEMgfSwKKworCS8qCisJICogM0QgVW5kb2N1bWVudGVkICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKiAgICAzRFs3OjBdICJJdCdzIGEgc2VjcmV0IgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAwMDAwMDAwCisJICovCisJeyAweDNELCAweDAwIH0sCisKKwkvKgorCSAqIDNFIFVuZG9jdW1lbnRlZCAgPSAgIDAgKDB4MDApIDAwMDAwMDAwCisJICogICAgM0VbNzowXSAiSXQncyBhIHNlY3JldCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqLworCXsgMHgzRSwgMHgwMCB9LAorCisJLyoKKwkgKiAzQiBGUkVGQiAiSW50ZXJuYWwgUmVmZXJlbmNlIEFkanVzdG1lbnQiCisJICogICAgICAgICAgICAgICAgICA9ICAyNCAoMHgxOCkgMDAwMTEwMDAKKwkgKiAgICBGUkVGQls3OjBdICJSYW5nZSIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDI0ICgweDE4KSAwMDAxMTAwMAorCSAqLworCXsgMHgzYiwgMHgxOCB9LAorCisJLyoKKwkgKiAzMyBDSExGICJDdXJyZW50IENvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAyNSAoMHgxOSkgMDAwMTEwMDEKKwkgKiAgICBDSExGWzc6Nl0gIlNlbnNvciBjdXJyZW50IGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAuLi4uLi4KKwkgKiAgICBDSExGWzVdICJTZW5zb3IgY3VycmVudCByYW5nZSBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uMC4uLi4uICJub3JtYWwgcmFuZ2UiCisJICogICAgQ0hMRls0XSAiU2Vuc29yIGN1cnJlbnQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgLi4uMS4uLi4gImRvdWJsZSBjdXJyZW50IgorCSAqICAgIENITEZbM10gIlNlbnNvciBidWZmZXIgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDEgKDB4MDEpIC4uLi4xLi4uICJoYWxmIGN1cnJlbnQiCisJICogICAgQ0hMRlsyXSAiQ29sdW1uIGJ1ZmZlciBjdXJyZW50IGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4wLi4gIm5vcm1hbCBjdXJyZW50IgorCSAqICAgIENITEZbMV0gIkFuYWxvZyBEU1AgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLjAuICJub3JtYWwgY3VycmVudCIKKwkgKiAgICBDSExGWzFdICJBREMgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLjAuICJub3JtYWwgY3VycmVudCIKKwkgKi8KKwl7IDB4MzMsIDB4MTkgfSwKKworCS8qCisJICogMzQgVkJMTSAiQmxvb21pbmcgQ29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDkwICgweDVBKSAwMTAxMTAxMAorCSAqICAgIFZCTE1bN10gIkhhcmQgc29mdCByZXNldCBzd2l0Y2giCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMC4uLi4uLi4gIkhhcmQgcmVzZXQiCisJICogICAgVkJMTVs2OjRdICJCbG9vbWluZyB2b2x0YWdlIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICA1ICgweDA1KSAuMTAxLi4uLgorCSAqICAgIFZCTE1bMzowXSAiU2Vuc29yIGN1cnJlbnQgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDEwICgweDBBKSAuLi4uMTAxMAorCSAqLworCXsgMHgzNCwgMHg1QSB9LAorCisJLyoKKwkgKiAzQiBGUkVGQiAiSW50ZXJuYWwgUmVmZXJlbmNlIEFkanVzdG1lbnQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKiAgICBGUkVGQls3OjBdICJSYW5nZSIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqLworCXsgMHgzYiwgMHgwMCB9LAorCisJLyoKKwkgKiAzMyBDSExGICJDdXJyZW50IENvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgOSAoMHgwOSkgMDAwMDEwMDEKKwkgKiAgICBDSExGWzc6Nl0gIlNlbnNvciBjdXJyZW50IGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAuLi4uLi4KKwkgKiAgICBDSExGWzVdICJTZW5zb3IgY3VycmVudCByYW5nZSBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uMC4uLi4uICJub3JtYWwgcmFuZ2UiCisJICogICAgQ0hMRls0XSAiU2Vuc29yIGN1cnJlbnQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uMC4uLi4gIm5vcm1hbCBjdXJyZW50IgorCSAqICAgIENITEZbM10gIlNlbnNvciBidWZmZXIgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDEgKDB4MDEpIC4uLi4xLi4uICJoYWxmIGN1cnJlbnQiCisJICogICAgQ0hMRlsyXSAiQ29sdW1uIGJ1ZmZlciBjdXJyZW50IGNvbnRyb2wiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4wLi4gIm5vcm1hbCBjdXJyZW50IgorCSAqICAgIENITEZbMV0gIkFuYWxvZyBEU1AgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLjAuICJub3JtYWwgY3VycmVudCIKKwkgKiAgICBDSExGWzFdICJBREMgY3VycmVudCBjb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLjAuICJub3JtYWwgY3VycmVudCIKKwkgKi8KKwl7IDB4MzMsIDB4MDkgfSwKKworCS8qCisJICogMzQgVkJMTSAiQmxvb21pbmcgQ29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDgwICgweDUwKSAwMTAxMDAwMAorCSAqICAgIFZCTE1bN10gIkhhcmQgc29mdCByZXNldCBzd2l0Y2giCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMC4uLi4uLi4gIkhhcmQgcmVzZXQiCisJICogICAgVkJMTVs2OjRdICJCbG9vbWluZyB2b2x0YWdlIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICA1ICgweDA1KSAuMTAxLi4uLgorCSAqICAgIFZCTE1bMzowXSAiU2Vuc29yIGN1cnJlbnQgY29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uMDAwMAorCSAqLworCXsgMHgzNCwgMHg1MCB9LAorCisJLyoKKwkgKiAxMiBDT01IICJDb21tb24gQ29udHJvbCBIIgorCSAqICAgICAgICAgICAgICAgICAgPSAgNjQgKDB4NDApIDAxMDAwMDAwCisJICogICAgQ09NSFs3XSAiU1JTVCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwLi4uLi4uLiAiTm8tb3AiCisJICogICAgQ09NSFs2OjRdICJSZXNvbHV0aW9uIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICA0ICgweDA0KSAuMTAwLi4uLiAiWEdBIgorCSAqICAgIENPTUhbM10gIk1hc3RlciBzbGF2ZSBzZWxlY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLjAuLi4gIk1hc3RlciBtb2RlIgorCSAqICAgIENPTUhbMl0gIkludGVybmFsIEIvUiBjaGFubmVsIG9wdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLjAuLiAiQi9SIHVzZSBzYW1lIGNoYW5uZWwiCisJICogICAgQ09NSFsxXSAiQ29sb3IgYmFyIHRlc3QgcGF0dGVybiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4wLiAiT2ZmIgorCSAqICAgIENPTUhbMF0gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLi4wCisJICovCisJeyAweDEyLCAweDQwIH0sCisKKwkvKgorCSAqIDE3IEhSRUZTVCAiSG9yaXpvbnRhbCB3aW5kb3cgc3RhcnQiCisJICogICAgICAgICAgICAgICAgICA9ICAzMSAoMHgxRikgMDAwMTExMTEKKwkgKiAgICBIUkVGU1RbNzowXSAiSG9yaXpvbnRhbCB3aW5kb3cgc3RhcnQsIDggTVNCcyIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDMxICgweDFGKSAwMDAxMTExMQorCSAqLworCXsgMHgxNywgMHgxRiB9LAorCisJLyoKKwkgKiAxOCBIUkVGRU5EICJIb3Jpem9udGFsIHdpbmRvdyBlbmQiCisJICogICAgICAgICAgICAgICAgICA9ICA5NSAoMHg1RikgMDEwMTExMTEKKwkgKiAgICBIUkVGRU5EWzc6MF0gIkhvcml6b250YWwgV2luZG93IEVuZCwgOCBNU0JzIgorCSAqICAgICAgICAgICAgICAgICAgPSAgOTUgKDB4NUYpIDAxMDExMTExCisJICovCisJeyAweDE4LCAweDVGIH0sCisKKwkvKgorCSAqIDE5IFZTVFJUICJWZXJ0aWNhbCB3aW5kb3cgc3RhcnQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKiAgICBWU1RSVFs3OjBdICJWZXJ0aWNhbCBXaW5kb3cgU3RhcnQsIDggTVNCcyIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqLworCXsgMHgxOSwgMHgwMCB9LAorCisJLyoKKwkgKiAxQSBWRU5EICJWZXJ0aWNhbCB3aW5kb3cgZW5kIgorCSAqICAgICAgICAgICAgICAgICAgPSAgOTYgKDB4NjApIDAxMTAwMDAwCisJICogICAgVkVORFs3OjBdICJWZXJ0aWNhbCBXaW5kb3cgRW5kLCA4IE1TQnMiCisJICogICAgICAgICAgICAgICAgICA9ICA5NiAoMHg2MCkgMDExMDAwMDAKKwkgKi8KKwl7IDB4MWEsIDB4NjAgfSwKKworCS8qCisJICogMzIgQ09NTSAiQ29tbW9uIENvbnRyb2wgTSIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDE4ICgweDEyKSAwMDAxMDAxMAorCSAqICAgIENPTU1bNzo2XSAiUGl4ZWwgY2xvY2sgZGl2aWRlIG9wdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMC4uLi4uLiAiLzEiCisJICogICAgQ09NTVs1OjNdICJIb3Jpem9udGFsIHdpbmRvdyBlbmQgcG9zaXRpb24sIDMgTFNCcyIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAyICgweDAyKSAuLjAxMC4uLgorCSAqICAgIENPTU1bMjowXSAiSG9yaXpvbnRhbCB3aW5kb3cgc3RhcnQgcG9zaXRpb24sIDMgTFNCcyIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAyICgweDAyKSAuLi4uLjAxMAorCSAqLworCXsgMHgzMiwgMHgxMiB9LAorCisJLyoKKwkgKiAwMyBDT01BICJDb21tb24gQ29udHJvbCBBIgorCSAqICAgICAgICAgICAgICAgICAgPSAgNzQgKDB4NEEpIDAxMDAxMDEwCisJICogICAgQ09NQVs3OjRdICJBV0IgVXBkYXRlIFRocmVzaG9sZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICA0ICgweDA0KSAwMTAwLi4uLgorCSAqICAgIENPTUFbMzoyXSAiVmVydGljYWwgd2luZG93IGVuZCBsaW5lIGNvbnRyb2wgMiBMU0JzIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDIgKDB4MDIpIC4uLi4xMC4uCisJICogICAgQ09NQVsxOjBdICJWZXJ0aWNhbCB3aW5kb3cgc3RhcnQgbGluZSBjb250cm9sIDIgTFNCcyIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAyICgweDAyKSAuLi4uLi4xMAorCSAqLworCXsgMHgwMywgMHg0QSB9LAorCisJLyoKKwkgKiAxMSBDTEtSQyAiQ2xvY2sgUmF0ZSBDb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAxMjggKDB4ODApIDEwMDAwMDAwCisJICogICAgQ0xLUkNbN10gIkludGVybmFsIGZyZXF1ZW5jeSBkb3VibGVycyBvbiBvZmYgc2VjbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAxICgweDAxKSAxLi4uLi4uLiAiT24iCisJICogICAgQ0xLUkNbNl0gIkRpZ2l0YWwgdmlkZW8gbWFzdGVyIHNsYXZlIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuMC4uLi4uLiAiTWFzdGVyIG1vZGUsIHNlbnNvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBQQ0xLIgorCSAqICAgIENMS1JDWzU6MF0gIkNsb2NrIGRpdmlkZXIgeyBDTEsgPSBQQ0xLLygxK0NMS1JDWzU6MF0pIH0iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4wMDAwMDAKKwkgKi8KKwl7IDB4MTEsIDB4ODAgfSwKKworCS8qCisJICogMTIgQ09NSCAiQ29tbW9uIENvbnRyb2wgSCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAwMDAwMDAwMAorCSAqICAgIENPTUhbN10gIlNSU1QiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMC4uLi4uLi4gIk5vLW9wIgorCSAqICAgIENPTUhbNjo0XSAiUmVzb2x1dGlvbiBzZWxlY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLjAwMC4uLi4gIlFYR0EiCisJICogICAgQ09NSFszXSAiTWFzdGVyIHNsYXZlIHNlbGVjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uMC4uLiAiTWFzdGVyIG1vZGUiCisJICogICAgQ09NSFsyXSAiSW50ZXJuYWwgQi9SIGNoYW5uZWwgb3B0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uMC4uICJCL1IgdXNlIHNhbWUgY2hhbm5lbCIKKwkgKiAgICBDT01IWzFdICJDb2xvciBiYXIgdGVzdCBwYXR0ZXJuIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4uLjAuICJPZmYiCisJICogICAgQ09NSFswXSAiUmVzZXJ2ZWQiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4uLjAKKwkgKi8KKwl7IDB4MTIsIDB4MDAgfSwKKworCS8qCisJICogMTIgQ09NSCAiQ29tbW9uIENvbnRyb2wgSCIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDY0ICgweDQwKSAwMTAwMDAwMAorCSAqICAgIENPTUhbN10gIlNSU1QiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMC4uLi4uLi4gIk5vLW9wIgorCSAqICAgIENPTUhbNjo0XSAiUmVzb2x1dGlvbiBzZWxlY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgNCAoMHgwNCkgLjEwMC4uLi4gIlhHQSIKKwkgKiAgICBDT01IWzNdICJNYXN0ZXIgc2xhdmUgc2VsZWN0aW9uIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uLi4wLi4uICJNYXN0ZXIgbW9kZSIKKwkgKiAgICBDT01IWzJdICJJbnRlcm5hbCBCL1IgY2hhbm5lbCBvcHRpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4wLi4gIkIvUiB1c2Ugc2FtZSBjaGFubmVsIgorCSAqICAgIENPTUhbMV0gIkNvbG9yIGJhciB0ZXN0IHBhdHRlcm4iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgLi4uLi4uMC4gIk9mZiIKKwkgKiAgICBDT01IWzBdICJSZXNlcnZlZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAwICgweDAwKSAuLi4uLi4uMAorCSAqLworCXsgMHgxMiwgMHg0MCB9LAorCisJLyoKKwkgKiAxNyBIUkVGU1QgIkhvcml6b250YWwgd2luZG93IHN0YXJ0IgorCSAqICAgICAgICAgICAgICAgICAgPSAgMzEgKDB4MUYpIDAwMDExMTExCisJICogICAgSFJFRlNUWzc6MF0gIkhvcml6b250YWwgd2luZG93IHN0YXJ0LCA4IE1TQnMiCisJICogICAgICAgICAgICAgICAgICA9ICAzMSAoMHgxRikgMDAwMTExMTEKKwkgKi8KKwl7IDB4MTcsIDB4MUYgfSwKKworCS8qCisJICogMTggSFJFRkVORCAiSG9yaXpvbnRhbCB3aW5kb3cgZW5kIgorCSAqICAgICAgICAgICAgICAgICAgPSAgOTUgKDB4NUYpIDAxMDExMTExCisJICogICAgSFJFRkVORFs3OjBdICJIb3Jpem9udGFsIFdpbmRvdyBFbmQsIDggTVNCcyIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDk1ICgweDVGKSAwMTAxMTExMQorCSAqLworCXsgMHgxOCwgMHg1RiB9LAorCisJLyoKKwkgKiAxOSBWU1RSVCAiVmVydGljYWwgd2luZG93IHN0YXJ0IgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAwMDAwMDAwCisJICogICAgVlNUUlRbNzowXSAiVmVydGljYWwgV2luZG93IFN0YXJ0LCA4IE1TQnMiCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAwMDAwMDAKKwkgKi8KKwl7IDB4MTksIDB4MDAgfSwKKworCS8qCisJICogMUEgVkVORCAiVmVydGljYWwgd2luZG93IGVuZCIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDk2ICgweDYwKSAwMTEwMDAwMAorCSAqICAgIFZFTkRbNzowXSAiVmVydGljYWwgV2luZG93IEVuZCwgOCBNU0JzIgorCSAqICAgICAgICAgICAgICAgICAgPSAgOTYgKDB4NjApIDAxMTAwMDAwCisJICovCisJeyAweDFhLCAweDYwIH0sCisKKwkvKgorCSAqIDMyIENPTU0gIkNvbW1vbiBDb250cm9sIE0iCisJICogICAgICAgICAgICAgICAgICA9ICAxOCAoMHgxMikgMDAwMTAwMTAKKwkgKiAgICBDT01NWzc6Nl0gIlBpeGVsIGNsb2NrIGRpdmlkZSBvcHRpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMCAoMHgwMCkgMDAuLi4uLi4gIi8xIgorCSAqICAgIENPTU1bNTozXSAiSG9yaXpvbnRhbCB3aW5kb3cgZW5kIHBvc2l0aW9uLCAzIExTQnMiCisJICogICAgICAgICAgICAgICAgICA9ICAgMiAoMHgwMikgLi4wMTAuLi4KKwkgKiAgICBDT01NWzI6MF0gIkhvcml6b250YWwgd2luZG93IHN0YXJ0IHBvc2l0aW9uLCAzIExTQnMiCisJICogICAgICAgICAgICAgICAgICA9ICAgMiAoMHgwMikgLi4uLi4wMTAKKwkgKi8KKwl7IDB4MzIsIDB4MTIgfSwKKworCS8qCisJICogMDMgQ09NQSAiQ29tbW9uIENvbnRyb2wgQSIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDc0ICgweDRBKSAwMTAwMTAxMAorCSAqICAgIENPTUFbNzo0XSAiQVdCIFVwZGF0ZSBUaHJlc2hvbGQiCisJICogICAgICAgICAgICAgICAgICA9ICAgNCAoMHgwNCkgMDEwMC4uLi4KKwkgKiAgICBDT01BWzM6Ml0gIlZlcnRpY2FsIHdpbmRvdyBlbmQgbGluZSBjb250cm9sIDIgTFNCcyIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAyICgweDAyKSAuLi4uMTAuLgorCSAqICAgIENPTUFbMTowXSAiVmVydGljYWwgd2luZG93IHN0YXJ0IGxpbmUgY29udHJvbCAyIExTQnMiCisJICogICAgICAgICAgICAgICAgICA9ICAgMiAoMHgwMikgLi4uLi4uMTAKKwkgKi8KKwl7IDB4MDMsIDB4NEEgfSwKKworCS8qCisJICogMDIgUkVEICJSZWQgR2FpbiBDb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAxNzUgKDB4QUYpIDEwMTAxMTExCisJICogICAgUkVEWzddICJBY3Rpb24iCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgMS4uLi4uLi4gImdhaW4gPSAxLygxK2JpdHJldihbNjowXSkpIgorCSAqICAgIFJFRFs2OjBdICJWYWx1ZSIKKwkgKiAgICAgICAgICAgICAgICAgID0gIDQ3ICgweDJGKSAuMDEwMTExMQorCSAqLworCXsgMHgwMiwgMHhBRiB9LAorCisJLyoKKwkgKiAyRCBBRERWU0wgIlZTWU5DIFB1bHNlIFdpZHRoIgorCSAqICAgICAgICAgICAgICAgICAgPSAyMTAgKDB4RDIpIDExMDEwMDEwCisJICogICAgQUREVlNMWzc6MF0gIlZTWU5DIHB1bHNlIHdpZHRoLCBMU0IiCisJICogICAgICAgICAgICAgICAgICA9IDIxMCAoMHhEMikgMTEwMTAwMTAKKwkgKi8KKwl7IDB4MmQsIDB4RDIgfSwKKworCS8qCisJICogMDAgR0FJTiAgICAgICAgICA9ICAyNCAoMHgxOCkgMDAwMTEwMDAKKwkgKiAgICBHQUlOWzc6Nl0gIlJlc2VydmVkIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIDAwLi4uLi4uCisJICogICAgR0FJTls1XSAiRG91YmxlIgorCSAqICAgICAgICAgICAgICAgICAgPSAgIDAgKDB4MDApIC4uMC4uLi4uICJGYWxzZSIKKwkgKiAgICBHQUlOWzRdICJEb3VibGUiCisJICogICAgICAgICAgICAgICAgICA9ICAgMSAoMHgwMSkgLi4uMS4uLi4gIlRydWUiCisJICogICAgR0FJTlszOjBdICJSYW5nZSIKKwkgKiAgICAgICAgICAgICAgICAgID0gICA4ICgweDA4KSAuLi4uMTAwMAorCSAqLworCXsgMHgwMCwgMHgxOCB9LAorCisJLyoKKwkgKiAwMSBCTFVFICJCbHVlIEdhaW4gQ29udHJvbCIKKwkgKiAgICAgICAgICAgICAgICAgID0gMjQwICgweEYwKSAxMTExMDAwMAorCSAqICAgIEJMVUVbN10gIkFjdGlvbiIKKwkgKiAgICAgICAgICAgICAgICAgID0gICAxICgweDAxKSAxLi4uLi4uLiAiZ2FpbiA9IDEvKDErYml0cmV2KFs2OjBdKSkiCisJICogICAgQkxVRVs2OjBdICJWYWx1ZSIKKwkgKiAgICAgICAgICAgICAgICAgID0gMTEyICgweDcwKSAuMTExMDAwMAorCSAqLworCXsgMHgwMSwgMHhGMCB9LAorCisJLyoKKwkgKiAxMCBBRUMgIkF1dG9tYXRpYyBFeHBvc3VyZSBDb250cm9sIgorCSAqICAgICAgICAgICAgICAgICAgPSAgMTAgKDB4MEEpIDAwMDAxMDEwCisJICogICAgQUVDWzc6MF0gIkF1dG9tYXRpYyBFeHBvc3VyZSBDb250cm9sLCA4IE1TQnMiCisJICogICAgICAgICAgICAgICAgICA9ICAxMCAoMHgwQSkgMDAwMDEwMTAKKwkgKi8KKwl7IDB4MTAsIDB4MEEgfSwKKworCXsgMHhFMSwgMHg2NyB9LAorCXsgMHhFMywgMHgwMyB9LAorCXsgMHhFNCwgMHgyNiB9LAorCXsgMHhFNSwgMHgzRSB9LAorCXsgMHhGOCwgMHgwMSB9LAorCXsgMHhGRiwgMHgwMSB9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyBub3JtXzZ4MjBbXSA9IHsKIAl7IDB4MTIsIDB4ODAgfSwgLyogcmVzZXQgKi8KIAl7IDB4MTEsIDB4MDEgfSwKQEAgLTY3OCw2ICsxNDg4LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3ZfaTJjX3JlZ3ZhbHMgbm9ybV83NjIwW10gPSB7CisJeyAweDEyLCAweDgwIH0sCQkvKiByZXNldCAqLwogCXsgMHgwMCwgMHgwMCB9LAkJLyogZ2FpbiAqLwogCXsgMHgwMSwgMHg4MCB9LAkJLyogYmx1ZSBnYWluICovCiAJeyAweDAyLCAweDgwIH0sCQkvKiByZWQgZ2FpbiAqLwpAQCAtMTA0MiwxMCArMTg1MywyOCBAQAogfQogCiAvKiBXcml0ZSBhIE9WNTE5IHJlZ2lzdGVyICovCi1zdGF0aWMgaW50IHJlZ193KHN0cnVjdCBzZCAqc2QsIF9fdTE2IGluZGV4LCBfX3U4IHZhbHVlKQorc3RhdGljIGludCByZWdfdyhzdHJ1Y3Qgc2QgKnNkLCBfX3UxNiBpbmRleCwgX191MTYgdmFsdWUpCiB7Ci0JaW50IHJldDsKLQlpbnQgcmVxID0gKHNkLT5icmlkZ2UgPD0gQlJJREdFX09WNTExUExVUykgPyAyIDogMTsKKwlpbnQgcmV0LCByZXEgPSAwOworCisJc3dpdGNoIChzZC0+YnJpZGdlKSB7CisJY2FzZSBCUklER0VfT1Y1MTE6CisJY2FzZSBCUklER0VfT1Y1MTFQTFVTOgorCQlyZXEgPSAyOworCQlicmVhazsKKwljYXNlIEJSSURHRV9PVkZYMjoKKwkJcmVxID0gMHgwYTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBCUklER0VfVzk5NjhDRjoKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHNkLT5nc3BjYV9kZXYuZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHNkLT5nc3BjYV9kZXYuZGV2LCAwKSwKKwkJCXJlcSwKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCXZhbHVlLCBpbmRleCwgTlVMTCwgMCwgNTAwKTsKKwkJZ290byBsZWF2ZTsKKwlkZWZhdWx0OgorCQlyZXEgPSAxOworCX0KIAogCXNkLT5nc3BjYV9kZXYudXNiX2J1ZlswXSA9IHZhbHVlOwogCXJldCA9IHVzYl9jb250cm9sX21zZyhzZC0+Z3NwY2FfZGV2LmRldiwKQEAgLTEwNTQsMTcgKzE4ODMsMzUgQEAKIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCTAsIGluZGV4LAogCQkJc2QtPmdzcGNhX2Rldi51c2JfYnVmLCAxLCA1MDApOwotCWlmIChyZXQgPCAwKQotCQlQREVCVUcoRF9FUlIsICJXcml0ZSByZWcgWyUwMnhdICUwMnggZmFpbGVkIiwgaW5kZXgsIHZhbHVlKTsKLQlyZXR1cm4gcmV0OworbGVhdmU6CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAiV3JpdGUgcmVnIDB4JTA0eCAtPiBbMHglMDJ4XSBmYWlsZWQiLAorCQkgICAgICAgdmFsdWUsIGluZGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlQREVCVUcoRF9VU0JPLCAiV3JpdGUgcmVnIDB4JTA0eCAtPiBbMHglMDJ4XSIsIHZhbHVlLCBpbmRleCk7CisJcmV0dXJuIDA7CiB9CiAKLS8qIFJlYWQgZnJvbSBhIE9WNTE5IHJlZ2lzdGVyICovCisvKiBSZWFkIGZyb20gYSBPVjUxOSByZWdpc3Rlciwgbm90ZSBub3QgdmFsaWQgZm9yIHRoZSB3OTk2OGNmISEgKi8KIC8qIHJldHVybnM6IG5lZ2F0aXZlIGlzIGVycm9yLCBwb3Mgb3IgemVybyBpcyBkYXRhICovCiBzdGF0aWMgaW50IHJlZ19yKHN0cnVjdCBzZCAqc2QsIF9fdTE2IGluZGV4KQogewogCWludCByZXQ7Ci0JaW50IHJlcSA9IChzZC0+YnJpZGdlIDw9IEJSSURHRV9PVjUxMVBMVVMpID8gMyA6IDE7CisJaW50IHJlcTsKKworCXN3aXRjaCAoc2QtPmJyaWRnZSkgeworCWNhc2UgQlJJREdFX09WNTExOgorCWNhc2UgQlJJREdFX09WNTExUExVUzoKKwkJcmVxID0gMzsKKwkJYnJlYWs7CisJY2FzZSBCUklER0VfT1ZGWDI6CisJCXJlcSA9IDB4MGI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcSA9IDE7CisJfQogCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHNkLT5nc3BjYV9kZXYuZGV2LAogCQkJdXNiX3JjdmN0cmxwaXBlKHNkLT5nc3BjYV9kZXYuZGV2LCAwKSwKQEAgLTEwNzIsMTAgKzE5MTksMTIgQEAKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJMCwgaW5kZXgsIHNkLT5nc3BjYV9kZXYudXNiX2J1ZiwgMSwgNTAwKTsKIAotCWlmIChyZXQgPj0gMCkKKwlpZiAocmV0ID49IDApIHsKIAkJcmV0ID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmWzBdOwotCWVsc2UKKwkJUERFQlVHKERfVVNCSSwgIlJlYWQgcmVnIFsweCUwMlhdIC0+IDB4JTA0WCIsIGluZGV4LCByZXQpOworCX0gZWxzZQogCQlQREVCVUcoRF9FUlIsICJSZWFkIHJlZyBbMHglMDJ4XSBmYWlsZWQiLCBpbmRleCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDk1LDYgKzE5NDQsNyBAQAogCQlyZXQgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWZbMF07CiAJZWxzZQogCQlQREVCVUcoRF9FUlIsICJSZWFkIHJlZyA4IFsweCUwMnhdIGZhaWxlZCIsIGluZGV4KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExNDAsOSArMTk5MCwxMiBAQAogCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJMCwgaW5kZXgsCiAJCQlzZC0+Z3NwY2FfZGV2LnVzYl9idWYsIG4sIDUwMCk7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCA8IDApIHsKIAkJUERFQlVHKERfRVJSLCAiV3JpdGUgcmVnMzIgWyUwMnhdICUwOHggZmFpbGVkIiwgaW5kZXgsIHZhbHVlKTsKLQlyZXR1cm4gcmV0OworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG92NTExX2kyY193KHN0cnVjdCBzZCAqc2QsIF9fdTggcmVnLCBfX3U4IHZhbHVlKQpAQCAtMTMyNCwzMiArMjE3NywxMTAgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBpbnQgb3ZmeDJfaTJjX3coc3RydWN0IHNkICpzZCwgX191OCByZWcsIF9fdTggdmFsdWUpCit7CisJaW50IHJldDsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyhzZC0+Z3NwY2FfZGV2LmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShzZC0+Z3NwY2FfZGV2LmRldiwgMCksCisJCQkweDAyLAorCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJKF9fdTE2KXZhbHVlLCAoX191MTYpcmVnLCBOVUxMLCAwLCA1MDApOworCisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAiaTJjIDB4JTAyeCAtPiBbMHglMDJ4XSBmYWlsZWQiLCB2YWx1ZSwgcmVnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlQREVCVUcoRF9VU0JPLCAiaTJjIDB4JTAyeCAtPiBbMHglMDJ4XSIsIHZhbHVlLCByZWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92ZngyX2kyY19yKHN0cnVjdCBzZCAqc2QsIF9fdTggcmVnKQoreworCWludCByZXQ7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coc2QtPmdzcGNhX2Rldi5kZXYsCisJCQl1c2JfcmN2Y3RybHBpcGUoc2QtPmdzcGNhX2Rldi5kZXYsIDApLAorCQkJMHgwMywKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJMCwgKF9fdTE2KXJlZywgc2QtPmdzcGNhX2Rldi51c2JfYnVmLCAxLCA1MDApOworCisJaWYgKHJldCA+PSAwKSB7CisJCXJldCA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZlswXTsKKwkJUERFQlVHKERfVVNCSSwgImkyYyBbMHglMDJYXSAtPiAweCUwMlgiLCByZWcsIHJldCk7CisJfSBlbHNlCisJCVBERUJVRyhEX0VSUiwgImkyYyByZWFkIFsweCUwMnhdIGZhaWxlZCIsIHJlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGkyY193KHN0cnVjdCBzZCAqc2QsIF9fdTggcmVnLCBfX3U4IHZhbHVlKQogeworCWludCByZXQgPSAtMTsKKworCWlmIChzZC0+c2Vuc29yX3JlZ19jYWNoZVtyZWddID09IHZhbHVlKQorCQlyZXR1cm4gMDsKKwogCXN3aXRjaCAoc2QtPmJyaWRnZSkgewogCWNhc2UgQlJJREdFX09WNTExOgogCWNhc2UgQlJJREdFX09WNTExUExVUzoKLQkJcmV0dXJuIG92NTExX2kyY193KHNkLCByZWcsIHZhbHVlKTsKKwkJcmV0ID0gb3Y1MTFfaTJjX3coc2QsIHJlZywgdmFsdWUpOworCQlicmVhazsKIAljYXNlIEJSSURHRV9PVjUxODoKIAljYXNlIEJSSURHRV9PVjUxOFBMVVM6CiAJY2FzZSBCUklER0VfT1Y1MTk6Ci0JCXJldHVybiBvdjUxOF9pMmNfdyhzZCwgcmVnLCB2YWx1ZSk7CisJCXJldCA9IG92NTE4X2kyY193KHNkLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBCUklER0VfT1ZGWDI6CisJCXJldCA9IG92ZngyX2kyY193KHNkLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBCUklER0VfVzk5NjhDRjoKKwkJcmV0ID0gdzk5NjhjZl9pMmNfdyhzZCwgcmVnLCB2YWx1ZSk7CisJCWJyZWFrOwogCX0KLQlyZXR1cm4gLTE7IC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKworCWlmIChyZXQgPj0gMCkgeworCQkvKiBVcCBvbiBzZW5zb3IgcmVzZXQgZW1wdHkgdGhlIHJlZ2lzdGVyIGNhY2hlICovCisJCWlmIChyZWcgPT0gMHgxMiAmJiAodmFsdWUgJiAweDgwKSkKKwkJCW1lbXNldChzZC0+c2Vuc29yX3JlZ19jYWNoZSwgLTEsCisJCQkgICAgICAgc2l6ZW9mKHNkLT5zZW5zb3JfcmVnX2NhY2hlKSk7CisJCWVsc2UKKwkJCXNkLT5zZW5zb3JfcmVnX2NhY2hlW3JlZ10gPSB2YWx1ZTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGkyY19yKHN0cnVjdCBzZCAqc2QsIF9fdTggcmVnKQogeworCWludCByZXQgPSAtMTsKKworCWlmIChzZC0+c2Vuc29yX3JlZ19jYWNoZVtyZWddICE9IC0xKQorCQlyZXR1cm4gc2QtPnNlbnNvcl9yZWdfY2FjaGVbcmVnXTsKKwogCXN3aXRjaCAoc2QtPmJyaWRnZSkgewogCWNhc2UgQlJJREdFX09WNTExOgogCWNhc2UgQlJJREdFX09WNTExUExVUzoKLQkJcmV0dXJuIG92NTExX2kyY19yKHNkLCByZWcpOworCQlyZXQgPSBvdjUxMV9pMmNfcihzZCwgcmVnKTsKKwkJYnJlYWs7CiAJY2FzZSBCUklER0VfT1Y1MTg6CiAJY2FzZSBCUklER0VfT1Y1MThQTFVTOgogCWNhc2UgQlJJREdFX09WNTE5OgotCQlyZXR1cm4gb3Y1MThfaTJjX3Ioc2QsIHJlZyk7CisJCXJldCA9IG92NTE4X2kyY19yKHNkLCByZWcpOworCQlicmVhazsKKwljYXNlIEJSSURHRV9PVkZYMjoKKwkJcmV0ID0gb3ZmeDJfaTJjX3Ioc2QsIHJlZyk7CisJCWJyZWFrOworCWNhc2UgQlJJREdFX1c5OTY4Q0Y6CisJCXJldCA9IHc5OTY4Y2ZfaTJjX3Ioc2QsIHJlZyk7CisJCWJyZWFrOwogCX0KLQlyZXR1cm4gLTE7IC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKworCWlmIChyZXQgPj0gMCkKKwkJc2QtPnNlbnNvcl9yZWdfY2FjaGVbcmVnXSA9IHJldDsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qIFdyaXRlcyBiaXRzIGF0IHBvc2l0aW9ucyBzcGVjaWZpZWQgYnkgbWFzayB0byBhbiBJMkMgcmVnLiBCaXRzIHRoYXQgYXJlIGluCkBAIC0xMzg5LDYgKzIzMjAsMTAgQEAKIAkJcmV0dXJuIHJlZ193X21hc2soc2QsIFI1MXhfU1lTX1JFU0VULCAweDNhLCAweDNhKTsKIAljYXNlIEJSSURHRV9PVjUxOToKIAkJcmV0dXJuIHJlZ193KHNkLCBPVjUxOV9TWVNfUkVTRVQxLCAweDBmKTsKKwljYXNlIEJSSURHRV9PVkZYMjoKKwkJcmV0dXJuIHJlZ193X21hc2soc2QsIDB4MGYsIDB4MDAsIDB4MDIpOworCWNhc2UgQlJJREdFX1c5OTY4Q0Y6CisJCXJldHVybiByZWdfdyhzZCwgMHgzYywgMHgwYTA1KTsgLyogc3RvcCBVU0IgdHJhbnNmZXIgKi8KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE0MTgsMTggKzIzNTMsMjcgQEAKIAkJcmV0dXJuIHJlZ193KHNkLCBSNTF4X1NZU19SRVNFVCwgMHgwMCk7CiAJY2FzZSBCUklER0VfT1Y1MTk6CiAJCXJldHVybiByZWdfdyhzZCwgT1Y1MTlfU1lTX1JFU0VUMSwgMHgwMCk7CisJY2FzZSBCUklER0VfT1ZGWDI6CisJCXJldHVybiByZWdfd19tYXNrKHNkLCAweDBmLCAweDAyLCAweDAyKTsKKwljYXNlIEJSSURHRV9XOTk2OENGOgorCQlyZXR1cm4gcmVnX3coc2QsIDB4M2MsIDB4OGEwNSk7IC8qIFVTQiBGSUZPIGVuYWJsZSAqLwogCX0KIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG92NTF4X3NldF9zbGF2ZV9pZHMoc3RydWN0IHNkICpzZCwgX191OCBzbGF2ZSk7CisKIC8qIFRoaXMgZG9lcyBhbiBpbml0aWFsIHJlc2V0IG9mIGFuIE9tbmlWaXNpb24gc2Vuc29yIGFuZCBlbnN1cmVzIHRoYXQgSTJDCiAgKiBpcyBzeW5jaHJvbml6ZWQuIFJldHVybnMgPDAgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBpbml0X292X3NlbnNvcihzdHJ1Y3Qgc2QgKnNkKQorc3RhdGljIGludCBpbml0X292X3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBfX3U4IHNsYXZlKQogewogCWludCBpOwogCisJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMoc2QsIHNsYXZlKSA8IDApCisJCXJldHVybiAtRUlPOworCiAJLyogUmVzZXQgdGhlIHNlbnNvciAqLwogCWlmIChpMmNfdyhzZCwgMHgxMiwgMHg4MCkgPCAwKQogCQlyZXR1cm4gLUVJTzsKQEAgLTE0NjYsNiArMjQxMCwxNCBAQAogewogCWludCByYzsKIAorCXN3aXRjaCAoc2QtPmJyaWRnZSkgeworCWNhc2UgQlJJREdFX09WRlgyOgorCQlyZXR1cm4gcmVnX3coc2QsIE9WRlgyX0kyQ19BRERSLCBzbGF2ZSk7CisJY2FzZSBCUklER0VfVzk5NjhDRjoKKwkJc2QtPnNlbnNvcl9hZGRyID0gc2xhdmU7CisJCXJldHVybiAwOworCX0KKwogCXJjID0gcmVnX3coc2QsIFI1MXhfSTJDX1dfU0lELCBzbGF2ZSk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwpAQCAtMTUwOCw2ICsyNDYwLDM5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1YyeDEwIC8gT1YzNjEwIC8gT1YzNjIwICovCitzdGF0aWMgaW50IG92X2hpcmVzX2NvbmZpZ3VyZShzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBoaWdoLCBsb3c7CisKKwlpZiAoc2QtPmJyaWRnZSAhPSBCUklER0VfT1ZGWDIpIHsKKwkJUERFQlVHKERfRVJSLCAiZXJyb3IgaGlyZXMgc2Vuc29ycyBvbmx5IHN1cHBvcnRlZCB3aXRoIG92ZngyIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlQREVCVUcoRF9QUk9CRSwgInN0YXJ0aW5nIG92IGhpcmVzIGNvbmZpZ3VyYXRpb24iKTsKKworCS8qIERldGVjdCBzZW5zb3IgKHN1Yil0eXBlICovCisJaGlnaCA9IGkyY19yKHNkLCAweDBhKTsKKwlsb3cgPSBpMmNfcihzZCwgMHgwYik7CisJLyogaW5mbygiJXgsICV4IiwgaGlnaCwgbG93KTsgKi8KKwlpZiAoaGlnaCA9PSAweDk2ICYmIGxvdyA9PSAweDQwKSB7CisJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIGlzIGFuIE9WMjYxMCIpOworCQlzZC0+c2Vuc29yID0gU0VOX09WMjYxMDsKKwl9IGVsc2UgaWYgKGhpZ2ggPT0gMHgzNiAmJiAobG93ICYgMHgwZikgPT0gMHgwMCkgeworCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhbiBPVjM2MTAiKTsKKwkJc2QtPnNlbnNvciA9IFNFTl9PVjM2MTA7CisJfSBlbHNlIHsKKwkJUERFQlVHKERfRVJSLCAiRXJyb3IgdW5rbm93biBzZW5zb3IgdHlwZTogMHglMDJ4JTAyeCIsCisJCSAgICAgICBoaWdoLCBsb3cpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2V0IHNlbnNvci1zcGVjaWZpYyB2YXJzICovCisJcmV0dXJuIDA7Cit9CisKKwogLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1Y4MTEwLCBPVjg2MTAgc2Vuc29yLiBUaGUgT1Y4MTEwIHVzZXMKICAqIHRoZSBzYW1lIHJlZ2lzdGVyIHNldHRpbmdzIGFzIHRoZSBPVjg2MTAsIHNpbmNlIHRoZXkgYXJlIHZlcnkgc2ltaWxhci4KICAqLwpAQCAtMTk2NiwxMiArMjk1MSwyOSBAQAogCXJldHVybiB3cml0ZV9yZWd2YWxzKHNkLCBpbml0XzUxOSwgQVJSQVlfU0laRShpbml0XzUxOSkpOwogfQogCitzdGF0aWMgaW50IG92ZngyX2NvbmZpZ3VyZShzdHJ1Y3Qgc2QgKnNkKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3ZfcmVndmFscyBpbml0X2Z4MltdID0geworCQl7IDB4MDAsIDB4NjAgfSwKKwkJeyAweDAyLCAweDAxIH0sCisJCXsgMHgwZiwgMHgxZCB9LAorCQl7IDB4ZTksIDB4ODIgfSwKKwkJeyAweGVhLCAweGM3IH0sCisJCXsgMHhlYiwgMHgxMCB9LAorCQl7IDB4ZWMsIDB4ZjYgfSwKKwl9OworCisJc2QtPnN0b3BwZWQgPSAxOworCisJcmV0dXJuIHdyaXRlX3JlZ3ZhbHMoc2QsIGluaXRfZngyLCBBUlJBWV9TSVpFKGluaXRfZngyKSk7Cit9CisKIC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KIHN0YXRpYyBpbnQgc2RfY29uZmlnKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0Jc3RydWN0IGNhbSAqY2FtOworCXN0cnVjdCBjYW0gKmNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKIAlpbnQgcmV0ID0gMDsKIAogCXNkLT5icmlkZ2UgPSBpZC0+ZHJpdmVyX2luZm8gJiBCUklER0VfTUFTSzsKQEAgLTE5ODksNiArMjk5MSwxNiBAQAogCWNhc2UgQlJJREdFX09WNTE5OgogCQlyZXQgPSBvdjUxOV9jb25maWd1cmUoc2QpOwogCQlicmVhazsKKwljYXNlIEJSSURHRV9PVkZYMjoKKwkJcmV0ID0gb3ZmeDJfY29uZmlndXJlKHNkKTsKKwkJY2FtLT5idWxrX3NpemUgPSBPVkZYMl9CVUxLX1NJWkU7CisJCWNhbS0+YnVsa19udXJicyA9IE1BWF9OVVJCUzsKKwkJY2FtLT5idWxrID0gMTsKKwkJYnJlYWs7CisJY2FzZSBCUklER0VfVzk5NjhDRjoKKwkJcmV0ID0gdzk5NjhjZl9jb25maWd1cmUoc2QpOworCQljYW0tPnJldmVyc2VfYWx0cyA9IDE7CisJCWJyZWFrOwogCX0KIAogCWlmIChyZXQpCkBAIC0xOTk2LDQ5ICszMDA4LDM5IEBACiAKIAlvdjUxeF9sZWRfY29udHJvbChzZCwgMCk7CS8qIHR1cm4gTEVEIG9mZiAqLwogCi0JLyogVGVzdCBmb3IgNzZ4eCAqLwotCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKHNkLCBPVjd4eDBfU0lEKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KIAkvKiBUaGUgT1Y1MTkgbXVzdCBiZSBtb3JlIGFnZ3Jlc3NpdmUgYWJvdXQgc2Vuc29yIGRldGVjdGlvbiBzaW5jZQogCSAqIEkyQyB3cml0ZSB3aWxsIG5ldmVyIGZhaWwgaWYgdGhlIHNlbnNvciBpcyBub3QgcHJlc2VudC4gV2UgaGF2ZQogCSAqIHRvIHRyeSB0byBpbml0aWFsaXplIHRoZSBzZW5zb3IgdG8gZGV0ZWN0IGl0cyBwcmVzZW5jZSAqLwotCWlmIChpbml0X292X3NlbnNvcihzZCkgPj0gMCkgeworCisJLyogVGVzdCBmb3IgNzZ4eCAqLworCWlmIChpbml0X292X3NlbnNvcihzZCwgT1Y3eHgwX1NJRCkgPj0gMCkgewogCQlpZiAob3Y3eHgwX2NvbmZpZ3VyZShzZCkgPCAwKSB7CiAJCQlQREVCVUcoRF9FUlIsICJGYWlsZWQgdG8gY29uZmlndXJlIE9WN3h4MCIpOwogCQkJZ290byBlcnJvcjsKIAkJfQotCX0gZWxzZSB7Ci0KLQkJLyogVGVzdCBmb3IgNnh4MCAqLwotCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhzZCwgT1Y2eHgwX1NJRCkgPCAwKQorCS8qIFRlc3QgZm9yIDZ4eDAgKi8KKwl9IGVsc2UgaWYgKGluaXRfb3Zfc2Vuc29yKHNkLCBPVjZ4eDBfU0lEKSA+PSAwKSB7CisJCWlmIChvdjZ4eDBfY29uZmlndXJlKHNkKSA8IDApIHsKKwkJCVBERUJVRyhEX0VSUiwgIkZhaWxlZCB0byBjb25maWd1cmUgT1Y2eHgwIik7CiAJCQlnb3RvIGVycm9yOwotCi0JCWlmIChpbml0X292X3NlbnNvcihzZCkgPj0gMCkgewotCQkJaWYgKG92Nnh4MF9jb25maWd1cmUoc2QpIDwgMCkgewotCQkJCVBERUJVRyhEX0VSUiwgIkZhaWxlZCB0byBjb25maWd1cmUgT1Y2eHgwIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJfSBlbHNlIHsKLQotCQkJLyogVGVzdCBmb3IgOHh4MCAqLwotCQkJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMoc2QsIE9WOHh4MF9TSUQpIDwgMCkKLQkJCQlnb3RvIGVycm9yOwotCi0JCQlpZiAoaW5pdF9vdl9zZW5zb3Ioc2QpIDwgMCkgewotCQkJCVBERUJVRyhEX0VSUiwKLQkJCQkJIkNhbid0IGRldGVybWluZSBzZW5zb3Igc2xhdmUgSURzIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmIChvdjh4eDBfY29uZmlndXJlKHNkKSA8IDApIHsKLQkJCQlQREVCVUcoRF9FUlIsCi0JCQkJCSJGYWlsZWQgdG8gY29uZmlndXJlIE9WOHh4MCBzZW5zb3IiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQogCQl9CisJLyogVGVzdCBmb3IgOHh4MCAqLworCX0gZWxzZSBpZiAoaW5pdF9vdl9zZW5zb3Ioc2QsIE9WOHh4MF9TSUQpID49IDApIHsKKwkJaWYgKG92OHh4MF9jb25maWd1cmUoc2QpIDwgMCkgeworCQkJUERFQlVHKERfRVJSLCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBPVjh4eDAiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkvKiBUZXN0IGZvciAzeHh4IC8gMnh4eCAqLworCX0gZWxzZSBpZiAoaW5pdF9vdl9zZW5zb3Ioc2QsIE9WX0hJUkVTX1NJRCkgPj0gMCkgeworCQlpZiAob3ZfaGlyZXNfY29uZmlndXJlKHNkKSA8IDApIHsKKwkJCVBERUJVRyhEX0VSUiwgIkZhaWxlZCB0byBjb25maWd1cmUgaGlnaCByZXMgT1YiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UgeworCQlQREVCVUcoRF9FUlIsICJDYW4ndCBkZXRlcm1pbmUgc2Vuc29yIHNsYXZlIElEcyIpOworCQlnb3RvIGVycm9yOwogCX0KIAotCWNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKIAlzd2l0Y2ggKHNkLT5icmlkZ2UpIHsKIAljYXNlIEJSSURHRV9PVjUxMToKIAljYXNlIEJSSURHRV9PVjUxMVBMVVM6CkBAIC0yMDY5LDYgKzMwNzEsMzEgQEAKIAkJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShvdjUxOV9zaWZfbW9kZSk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBCUklER0VfT1ZGWDI6CisJCWlmIChzZC0+c2Vuc29yID09IFNFTl9PVjI2MTApIHsKKwkJCWNhbS0+Y2FtX21vZGUgPSBvdmZ4Ml9vdjI2MTBfbW9kZTsKKwkJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShvdmZ4Ml9vdjI2MTBfbW9kZSk7CisJCX0gZWxzZSBpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1YzNjEwKSB7CisJCQljYW0tPmNhbV9tb2RlID0gb3ZmeDJfb3YzNjEwX21vZGU7CisJCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUob3ZmeDJfb3YzNjEwX21vZGUpOworCQl9IGVsc2UgaWYgKCFzZC0+c2lmKSB7CisJCQljYW0tPmNhbV9tb2RlID0gb3Y1MTlfdmdhX21vZGU7CisJCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUob3Y1MTlfdmdhX21vZGUpOworCQl9IGVsc2UgeworCQkJY2FtLT5jYW1fbW9kZSA9IG92NTE5X3NpZl9tb2RlOworCQkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKG92NTE5X3NpZl9tb2RlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJSSURHRV9XOTk2OENGOgorCQljYW0tPmNhbV9tb2RlID0gdzk5NjhjZl92Z2FfbW9kZTsKKwkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKHc5OTY4Y2ZfdmdhX21vZGUpOworCQlpZiAoc2QtPnNpZikKKwkJCWNhbS0+bm1vZGVzLS07CisKKwkJLyogdzk5NjhjZiBuZWVkcyBpbml0aWFsaXNhdGlvbiBvbmNlIHRoZSBzZW5zb3IgaXMga25vd24gKi8KKwkJaWYgKHc5OTY4Y2ZfaW5pdChzZCkgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CiAJfQogCXNkLT5icmlnaHRuZXNzID0gQlJJR0hUTkVTU19ERUY7CiAJaWYgKHNkLT5zZW5zb3IgPT0gU0VOX09WNjYzMCB8fCBzZC0+c2Vuc29yID09IFNFTl9PVjY2MzA4QUYpCkBAIC0yMDg3LDExICszMTE0LDE1IEBACiAJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBIRkxJUF9JRFgpIHwgKDEgPDwgVkZMSVBfSURYKSB8CiAJCQkJICAgICAgKDEgPDwgT1Y3NjcwX0ZSRVFfSURYKTsKIAl9CisJc2QtPnF1YWxpdHkgPSBRVUFMSVRZX0RFRjsKIAlpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjQwIHx8IHNkLT5zZW5zb3IgPT0gU0VOX09WNzY3MCkKIAkJZ3NwY2FfZGV2LT5jdHJsX2RpcyB8PSAxIDw8IEFVVE9CUklHSFRfSURYOwogCS8qIE9WODYxMCBGcmVxdWVuY3kgZmlsdGVyIGNvbnRyb2wgc2hvdWxkIHdvcmsgYnV0IG5lZWRzIHRlc3RpbmcgKi8KIAlpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1Y4NjEwKQogCQlnc3BjYV9kZXYtPmN0cmxfZGlzIHw9IDEgPDwgRlJFUV9JRFg7CisJLyogTm8gY29udHJvbHMgZm9yIHRoZSBPVjI2MTAvT1YzNjEwICovCisJaWYgKHNkLT5zZW5zb3IgPT0gU0VOX09WMjYxMCB8fCBzZC0+c2Vuc29yID09IFNFTl9PVjM2MTApCisJCWdzcGNhX2Rldi0+Y3RybF9kaXMgfD0gMHhGRjsKIAogCXJldHVybiAwOwogZXJyb3I6CkBAIC0yMTA2LDYgKzMxMzcsMjAgQEAKIAogCS8qIGluaXRpYWxpemUgdGhlIHNlbnNvciAqLwogCXN3aXRjaCAoc2QtPnNlbnNvcikgeworCWNhc2UgU0VOX09WMjYxMDoKKwkJaWYgKHdyaXRlX2kyY19yZWd2YWxzKHNkLCBub3JtXzI2MTAsIEFSUkFZX1NJWkUobm9ybV8yNjEwKSkpCisJCQlyZXR1cm4gLUVJTzsKKwkJLyogRW5hYmxlIGF1dG9nYWluLCBhdXRvZXhwbywgYXdiLCBiYW5kZmlsdGVyICovCisJCWlmIChpMmNfd19tYXNrKHNkLCAweDEzLCAweDI3LCAweDI3KSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1YzNjEwOgorCQlpZiAod3JpdGVfaTJjX3JlZ3ZhbHMoc2QsIG5vcm1fMzYyMGIsIEFSUkFZX1NJWkUobm9ybV8zNjIwYikpKQorCQkJcmV0dXJuIC1FSU87CisJCS8qIEVuYWJsZSBhdXRvZ2FpbiwgYXV0b2V4cG8sIGF3YiwgYmFuZGZpbHRlciAqLworCQlpZiAoaTJjX3dfbWFzayhzZCwgMHgxMywgMHgyNywgMHgyNykgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOwogCWNhc2UgU0VOX09WNjYyMDoKIAkJaWYgKHdyaXRlX2kyY19yZWd2YWxzKHNkLCBub3JtXzZ4MjAsIEFSUkFZX1NJWkUobm9ybV82eDIwKSkpCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTI1NDgsMTkgKzM1OTMsNjAgQEAKIHN0YXRpYyBpbnQgbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKHN0cnVjdCBzZCAqc2QpCiB7CiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2OwotCWludCBxdmdhOworCWludCBxdmdhLCB4c3RhcnQsIHhlbmQsIHlzdGFydCwgeWVuZDsKKwlfX3U4IHY7CiAKIAlnc3BjYV9kZXYgPSAmc2QtPmdzcGNhX2RldjsKIAlxdmdhID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbKGludCkgZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXYgJiAxOwogCiAJLyoqKioqKioqIE1vZGUgKFZHQS9RVkdBKSBhbmQgc2Vuc29yIHNwZWNpZmljIHJlZ3MgKioqKioqKiovCiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1YyNjEwOgorCQlpMmNfd19tYXNrKHNkLCAweDE0LCBxdmdhID8gMHgyMCA6IDB4MDAsIDB4MjApOworCQlpMmNfd19tYXNrKHNkLCAweDI4LCBxdmdhID8gMHgwMCA6IDB4MjAsIDB4MjApOworCQlpMmNfdyhzZCwgMHgyNCwgcXZnYSA/IDB4MjAgOiAweDNhKTsKKwkJaTJjX3coc2QsIDB4MjUsIHF2Z2EgPyAweDMwIDogMHg2MCk7CisJCWkyY193X21hc2soc2QsIDB4MmQsIHF2Z2EgPyAweDQwIDogMHgwMCwgMHg0MCk7CisJCWkyY193X21hc2soc2QsIDB4NjcsIHF2Z2EgPyAweGYwIDogMHg5MCwgMHhmMCk7CisJCWkyY193X21hc2soc2QsIDB4NzQsIHF2Z2EgPyAweDIwIDogMHgwMCwgMHgyMCk7CisJCXJldHVybiAwOworCWNhc2UgU0VOX09WMzYxMDoKKwkJaWYgKHF2Z2EpIHsKKwkJCXhzdGFydCA9ICgxMDQwIC0gZ3NwY2FfZGV2LT53aWR0aCkgLyAyICsgKDB4MWYgPDwgNCk7CisJCQl5c3RhcnQgPSAoNzc2IC0gZ3NwY2FfZGV2LT5oZWlnaHQpIC8gMjsKKwkJfSBlbHNlIHsKKwkJCXhzdGFydCA9ICgyMDc2IC0gZ3NwY2FfZGV2LT53aWR0aCkgLyAyICsgKDB4MTAgPDwgNCk7CisJCQl5c3RhcnQgPSAoMTU0NCAtIGdzcGNhX2Rldi0+aGVpZ2h0KSAvIDI7CisJCX0KKwkJeGVuZCA9IHhzdGFydCArIGdzcGNhX2Rldi0+d2lkdGg7CisJCXllbmQgPSB5c3RhcnQgKyBnc3BjYV9kZXYtPmhlaWdodDsKKwkJLyogV3JpdGluZyB0byB0aGUgQ09NSCByZWdpc3RlciByZXNldHMgdGhlIG90aGVyIHdpbmRvd2luZyByZWdzCisJCSAgIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLCBzbyB3ZSBtdXN0IGRvIHRoaXMgZmlyc3QuICovCisJCWkyY193X21hc2soc2QsIDB4MTIsIHF2Z2EgPyAweDQwIDogMHgwMCwgMHhmMCk7CisJCWkyY193X21hc2soc2QsIDB4MzIsCisJCQkgICAoKCh4ZW5kID4+IDEpICYgNykgPDwgMykgfCAoKHhzdGFydCA+PiAxKSAmIDcpLAorCQkJICAgMHgzZik7CisJCWkyY193X21hc2soc2QsIDB4MDMsCisJCQkgICAoKCh5ZW5kID4+IDEpICYgMykgPDwgMikgfCAoKHlzdGFydCA+PiAxKSAmIDMpLAorCQkJICAgMHgwZik7CisJCWkyY193KHNkLCAweDE3LCB4c3RhcnQgPj4gNCk7CisJCWkyY193KHNkLCAweDE4LCB4ZW5kID4+IDQpOworCQlpMmNfdyhzZCwgMHgxOSwgeXN0YXJ0ID4+IDMpOworCQlpMmNfdyhzZCwgMHgxYSwgeWVuZCA+PiAzKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBTRU5fT1Y4NjEwOgogCQkvKiBGb3IgT1Y4NjEwIHF2Z2EgbWVhbnMgcXN2Z2EgKi8KIAkJaTJjX3dfbWFzayhzZCwgT1Y3NjEwX1JFR19DT01fQywgcXZnYSA/ICgxIDw8IDUpIDogMCwgMSA8PCA1KTsKKwkJaTJjX3dfbWFzayhzZCwgMHgxMywgMHgwMCwgMHgyMCk7IC8qIFNlbGVjdCAxNiBiaXQgZGF0YSBidXMgKi8KKwkJaTJjX3dfbWFzayhzZCwgMHgxMiwgMHgwNCwgMHgwNik7IC8qIEFXQjogMSBUZXN0IHBhdHRlcm46IDAgKi8KKwkJaTJjX3dfbWFzayhzZCwgMHgyZCwgMHgwMCwgMHg0MCk7IC8qIGZyb20gd2luZHJ2IDA5MDQwMyAqLworCQlpMmNfd19tYXNrKHNkLCAweDI4LCAweDIwLCAweDIwKTsgLyogcHJvZ3Jlc3NpdmUgbW9kZSBvbiAqLwogCQlicmVhazsKIAljYXNlIFNFTl9PVjc2MTA6CiAJCWkyY193X21hc2soc2QsIDB4MTQsIHF2Z2EgPyAweDIwIDogMHgwMCwgMHgyMCk7CisJCWkyY193KHNkLCAweDM1LCBxdmdhPzB4MWU6MHg5ZSk7CisJCWkyY193X21hc2soc2QsIDB4MTMsIDB4MDAsIDB4MjApOyAvKiBTZWxlY3QgMTYgYml0IGRhdGEgYnVzICovCisJCWkyY193X21hc2soc2QsIDB4MTIsIDB4MDQsIDB4MDYpOyAvKiBBV0I6IDEgVGVzdCBwYXR0ZXJuOiAwICovCiAJCWJyZWFrOwogCWNhc2UgU0VOX09WNzYyMDoKIAljYXNlIFNFTl9PVjc2QkU6CkBAIC0yNTcxLDYgKzM2NTcsMTAgQEAKIAkJaTJjX3dfbWFzayhzZCwgMHgyZCwgcXZnYSA/IDB4NDAgOiAweDAwLCAweDQwKTsKIAkJaTJjX3dfbWFzayhzZCwgMHg2NywgcXZnYSA/IDB4YjAgOiAweDkwLCAweGYwKTsKIAkJaTJjX3dfbWFzayhzZCwgMHg3NCwgcXZnYSA/IDB4MjAgOiAweDAwLCAweDIwKTsKKwkJaTJjX3dfbWFzayhzZCwgMHgxMywgMHgwMCwgMHgyMCk7IC8qIFNlbGVjdCAxNiBiaXQgZGF0YSBidXMgKi8KKwkJaTJjX3dfbWFzayhzZCwgMHgxMiwgMHgwNCwgMHgwNik7IC8qIEFXQjogMSBUZXN0IHBhdHRlcm46IDAgKi8KKwkJaWYgKHNkLT5zZW5zb3IgPT0gU0VOX09WNzZCRSkKKwkJCWkyY193KHNkLCAweDM1LCBxdmdhID8gMHgxZSA6IDB4OWUpOwogCQlicmVhazsKIAljYXNlIFNFTl9PVjc2NDA6CiAJCWkyY193X21hc2soc2QsIDB4MTQsIHF2Z2EgPyAweDIwIDogMHgwMCwgMHgyMCk7CkBAIC0yNTgwLDYgKzM2NzAsNyBAQAogLyoJCWkyY193X21hc2soc2QsIDB4MmQsIHF2Z2EgPyAweDQwIDogMHgwMCwgMHg0MCk7ICovCiAvKgkJaTJjX3dfbWFzayhzZCwgMHg2NywgcXZnYSA/IDB4ZjAgOiAweDkwLCAweGYwKTsgKi8KIC8qCQlpMmNfd19tYXNrKHNkLCAweDc0LCBxdmdhID8gMHgyMCA6IDB4MDAsIDB4MjApOyAqLworCQlpMmNfd19tYXNrKHNkLCAweDEyLCAweDA0LCAweDA0KTsgLyogQVdCOiAxICovCiAJCWJyZWFrOwogCWNhc2UgU0VOX09WNzY3MDoKIAkJLyogc2V0IENPTTdfRk1UX1ZHQSBvciBDT003X0ZNVF9RVkdBCkBAIC0yNTg4LDU1ICszNjc5LDU2IEBACiAJCWkyY193X21hc2soc2QsIE9WNzY3MF9SRUdfQ09NNywKIAkJCSBxdmdhID8gT1Y3NjcwX0NPTTdfRk1UX1FWR0EgOiBPVjc2NzBfQ09NN19GTVRfVkdBLAogCQkJIE9WNzY3MF9DT003X0ZNVF9NQVNLKTsKKwkJaTJjX3dfbWFzayhzZCwgMHgxMywgMHgwMCwgMHgyMCk7IC8qIFNlbGVjdCAxNiBiaXQgZGF0YSBidXMgKi8KKwkJaTJjX3dfbWFzayhzZCwgT1Y3NjcwX1JFR19DT004LCBPVjc2NzBfQ09NOF9BV0IsCisJCQkJT1Y3NjcwX0NPTThfQVdCKTsKKwkJaWYgKHF2Z2EpIHsJCS8qIFFWR0EgZnJvbSBvdjc2NzAuYyBieQorCQkJCQkgKiBKb25hdGhhbiBDb3JiZXQgKi8KKwkJCXhzdGFydCA9IDE2NDsKKwkJCXhlbmQgPSAyODsKKwkJCXlzdGFydCA9IDE0OworCQkJeWVuZCA9IDQ5NDsKKwkJfSBlbHNlIHsJCS8qIFZHQSAqLworCQkJeHN0YXJ0ID0gMTU4OworCQkJeGVuZCA9IDE0OworCQkJeXN0YXJ0ID0gMTA7CisJCQl5ZW5kID0gNDkwOworCQl9CisJCS8qIE9WNzY3MCBoYXJkd2FyZSB3aW5kb3cgcmVnaXN0ZXJzIGFyZSBzcGxpdCBhY3Jvc3MKKwkJICogbXVsdGlwbGUgbG9jYXRpb25zICovCisJCWkyY193KHNkLCBPVjc2NzBfUkVHX0hTVEFSVCwgeHN0YXJ0ID4+IDMpOworCQlpMmNfdyhzZCwgT1Y3NjcwX1JFR19IU1RPUCwgeGVuZCA+PiAzKTsKKwkJdiA9IGkyY19yKHNkLCBPVjc2NzBfUkVHX0hSRUYpOworCQl2ID0gKHYgJiAweGMwKSB8ICgoeGVuZCAmIDB4NykgPDwgMykgfCAoeHN0YXJ0ICYgMHgwNyk7CisJCW1zbGVlcCgxMCk7CS8qIG5lZWQgdG8gc2xlZXAgYmV0d2VlbiByZWFkIGFuZCB3cml0ZSB0bworCQkJCSAqIHNhbWUgcmVnISAqLworCQlpMmNfdyhzZCwgT1Y3NjcwX1JFR19IUkVGLCB2KTsKKworCQlpMmNfdyhzZCwgT1Y3NjcwX1JFR19WU1RBUlQsIHlzdGFydCA+PiAyKTsKKwkJaTJjX3coc2QsIE9WNzY3MF9SRUdfVlNUT1AsIHllbmQgPj4gMik7CisJCXYgPSBpMmNfcihzZCwgT1Y3NjcwX1JFR19WUkVGKTsKKwkJdiA9ICh2ICYgMHhjMCkgfCAoKHllbmQgJiAweDMpIDw8IDIpIHwgKHlzdGFydCAmIDB4MDMpOworCQltc2xlZXAoMTApOwkvKiBuZWVkIHRvIHNsZWVwIGJldHdlZW4gcmVhZCBhbmQgd3JpdGUgdG8KKwkJCQkgKiBzYW1lIHJlZyEgKi8KKwkJaTJjX3coc2QsIE9WNzY3MF9SRUdfVlJFRiwgdik7CiAJCWJyZWFrOwogCWNhc2UgU0VOX09WNjYyMDoKKwkJaTJjX3dfbWFzayhzZCwgMHgxNCwgcXZnYSA/IDB4MjAgOiAweDAwLCAweDIwKTsKKwkJaTJjX3dfbWFzayhzZCwgMHgxMywgMHgwMCwgMHgyMCk7IC8qIFNlbGVjdCAxNiBiaXQgZGF0YSBidXMgKi8KKwkJaTJjX3dfbWFzayhzZCwgMHgxMiwgMHgwNCwgMHgwNik7IC8qIEFXQjogMSBUZXN0IHBhdHRlcm46IDAgKi8KKwkJYnJlYWs7CiAJY2FzZSBTRU5fT1Y2NjMwOgogCWNhc2UgU0VOX09WNjYzMDhBRjoKIAkJaTJjX3dfbWFzayhzZCwgMHgxNCwgcXZnYSA/IDB4MjAgOiAweDAwLCAweDIwKTsKKwkJaTJjX3dfbWFzayhzZCwgMHgxMiwgMHgwNCwgMHgwNik7IC8qIEFXQjogMSBUZXN0IHBhdHRlcm46IDAgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyoqKioqKioqIFBhbGV0dGUtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KLQotCS8qIFRoZSBPVjUxOCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudC4gQWx0aG91Z2ggYm90aCB0aGUgT1Y1MTgKLQkgKiBhbmQgdGhlIE9WNjYzMCBzdXBwb3J0IGEgMTYtYml0IHZpZGVvIGJ1cywgb25seSB0aGUgOCBiaXQgWQotCSAqIGJ1cyBpcyBhY3R1YWxseSB1c2VkLiBUaGUgVVYgYnVzIGlzIHRpZWQgdG8gZ3JvdW5kLgotCSAqIFRoZXJlZm9yZSwgdGhlIE9WNjYzMCBuZWVkcyB0byBiZSBpbiA4LWJpdCBtdWx0aXBsZXhlZAotCSAqIG91dHB1dCBtb2RlICovCi0KLQkvKiBPVjc2NDAgaXMgOC1iaXQgb25seSAqLwotCi0JaWYgKHNkLT5zZW5zb3IgIT0gU0VOX09WNjYzMCAmJiBzZC0+c2Vuc29yICE9IFNFTl9PVjY2MzA4QUYgJiYKLQkJCQkJc2QtPnNlbnNvciAhPSBTRU5fT1Y3NjQwKQotCQlpMmNfd19tYXNrKHNkLCAweDEzLCAweDAwLCAweDIwKTsKLQogCS8qKioqKioqKiBDbG9jayBwcm9ncmFtbWluZyAqKioqKioqKi8KIAlpMmNfdyhzZCwgMHgxMSwgc2QtPmNsb2NrZGl2KTsKIAotCS8qKioqKioqKiBTcGVjaWFsIEZlYXR1cmVzICoqKioqKioqLwotLyogbm8gZXZpZGVuY2UgdGhpcyBpcyBwb3NzaWJsZSB3aXRoIE9WNzY3MCwgZWl0aGVyICovCi0JLyogVGVzdCBQYXR0ZXJuICovCi0JaWYgKHNkLT5zZW5zb3IgIT0gU0VOX09WNzY0MCAmJiBzZC0+c2Vuc29yICE9IFNFTl9PVjc2NzApCi0JCWkyY193X21hc2soc2QsIDB4MTIsIDB4MDAsIDB4MDIpOwotCi0JLyogRW5hYmxlIGF1dG8gd2hpdGUgYmFsYW5jZSAqLwotCWlmIChzZC0+c2Vuc29yID09IFNFTl9PVjc2NzApCi0JCWkyY193X21hc2soc2QsIE9WNzY3MF9SRUdfQ09NOCwgT1Y3NjcwX0NPTThfQVdCLAotCQkJCU9WNzY3MF9DT004X0FXQik7Ci0JZWxzZQotCQlpMmNfd19tYXNrKHNkLCAweDEyLCAweDA0LCAweDA0KTsKLQotCS8qIFRoaXMgd2lsbCBnbyBhd2F5IGFzIHNvb24gYXMgb3Y1MXhfbW9kZV9pbml0X3NlbnNvcl9yZWdzKCkgKi8KLQkvKiBpcyBmdWxseSB0ZXN0ZWQuICovCi0JLyogNzYyMC82NjIwLzY2MzA/IGRvbid0IGhhdmUgcmVnaXN0ZXIgMHgzNSwgc28gcGxheSBpdCBzYWZlICovCi0JaWYgKHNkLT5zZW5zb3IgPT0gU0VOX09WNzYxMCB8fCBzZC0+c2Vuc29yID09IFNFTl9PVjc2QkUpIHsKLQkJaWYgKCFxdmdhKQotCQkJaTJjX3coc2QsIDB4MzUsIDB4OWUpOwotCQllbHNlCi0JCQlpMmNfdyhzZCwgMHgzNSwgMHgxZSk7Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC0yNjU5LDggKzM3NTEsMTIgQEAKIAlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXY7CiAJaW50IHF2Z2EsIGNyb3A7CiAJaW50IGh3c2Jhc2UsIGh3ZWJhc2UsIHZ3c2Jhc2UsIHZ3ZWJhc2UsIGh3c2NhbGUsIHZ3c2NhbGU7Ci0JaW50IHJldCwgaHN0YXJ0LCBoc3RvcCwgdnN0b3AsIHZzdGFydDsKLQlfX3U4IHY7CisJaW50IHJldDsKKworCS8qIG1vZGUgc2V0dXAgaXMgZnVsbHkgaGFuZGxlZCBpbiBtb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3MgZm9yIHRoZXNlICovCisJaWYgKHNkLT5zZW5zb3IgPT0gU0VOX09WMjYxMCB8fCBzZC0+c2Vuc29yID09IFNFTl9PVjM2MTAgfHwKKwkgICAgc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjcwKQorCQlyZXR1cm4gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKHNkKTsKIAogCWdzcGNhX2RldiA9ICZzZC0+Z3NwY2FfZGV2OwogCXF2Z2EgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVsoaW50KSBnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdiAmIDE7CkBAIC0yNzA4LDExICszODA0LDYgQEAKIAkJaHdlYmFzZSA9IDB4MWE7CiAJCXZ3c2Jhc2UgPSB2d2ViYXNlID0gMHgwMzsKIAkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y3NjcwOgotCQkvKmhhbmRsaW5nIG9mIE9WNzY3MCBoYXJkd2FyZSBzZW5zb3Igc3RhcnQgYW5kIHN0b3AgdmFsdWVzCi0JCSAqIGlzIHZlcnkgb2RkLCBjb21wYXJlZCB0byB0aGUgb3RoZXIgT1Ygc2Vuc29ycyAqLwotCQl2d3NiYXNlID0gdndlYmFzZSA9IGh3ZWJhc2UgPSBod3NiYXNlID0gMHgwMDsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjc1Myw1OCArMzg0NCwxMSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHNkLT5zZW5zb3IgPT0gU0VOX09WODYxMCkgewotCQlpMmNfd19tYXNrKHNkLCAweDJkLCAweDA1LCAweDQwKTsKLQkJCQkvKiBvbGQgMHg5NSwgbmV3IDB4MDUgZnJvbSB3aW5kcnYgMDkwNDAzICovCi0JCQkJCQkvKiBiaXRzIDUtNzogcmVzZXJ2ZWQgKi8KLQkJaTJjX3dfbWFzayhzZCwgMHgyOCwgMHgyMCwgMHgyMCk7Ci0JCQkJCS8qIGJpdCA1OiBwcm9ncmVzc2l2ZSBtb2RlIG9uICovCi0JfQorCWkyY193KHNkLCAweDE3LCBod3NiYXNlKTsKKwlpMmNfdyhzZCwgMHgxOCwgaHdlYmFzZSArIChzZC0+c2Vuc29yX3dpZHRoID4+IGh3c2NhbGUpKTsKKwlpMmNfdyhzZCwgMHgxOSwgdndzYmFzZSk7CisJaTJjX3coc2QsIDB4MWEsIHZ3ZWJhc2UgKyAoc2QtPnNlbnNvcl9oZWlnaHQgPj4gdndzY2FsZSkpOwogCi0JLyogVGhlIGJlbG93IGlzIHdyb25nIGZvciBPVjc2NzBzIGJlY2F1c2UgdGhlaXIgd2luZG93IHJlZ2lzdGVycwotCSAqIG9ubHkgc3RvcmUgdGhlIGhpZ2ggYml0cyBpbiAweDE3IHRvIDB4MWEgKi8KLQotCS8qIFNSSCBVc2Ugc2QtPm1heCB2YWx1ZXMgaW5zdGVhZCBvZiByZXF1ZXN0ZWQgd2luIHZhbHVlcyAqLwotCS8qIFNDUyBTaW5jZSB3ZSdyZSBzdGlja2luZyB3aXRoIG9ubHkgdGhlIG1heCBoYXJkd2FyZSB3aWR0aHMKLQkgKiBmb3IgYSBnaXZlbiBtb2RlICovCi0JLyogSSBjYW4gaGFyZCBjb2RlIHRoaXMgZm9yIE9WNzY3MHMgKi8KLQkvKiBZZXMsIHRoZXNlIG51bWJlcnMgZG8gbG9vayBvZGQsIGJ1dCB0aGV5J3JlIHRlc3RlZCBhbmQgd29yayEgKi8KLQlpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjcwKSB7Ci0JCWlmIChxdmdhKSB7CQkvKiBRVkdBIGZyb20gb3Y3NjcwLmMgYnkKLQkJCQkJICogSm9uYXRoYW4gQ29yYmV0ICovCi0JCQloc3RhcnQgPSAxNjQ7Ci0JCQloc3RvcCA9IDI4OwotCQkJdnN0YXJ0ID0gMTQ7Ci0JCQl2c3RvcCA9IDQ5NDsKLQkJfSBlbHNlIHsJCS8qIFZHQSAqLwotCQkJaHN0YXJ0ID0gMTU4OwotCQkJaHN0b3AgPSAxNDsKLQkJCXZzdGFydCA9IDEwOwotCQkJdnN0b3AgPSA0OTA7Ci0JCX0KLQkJLyogT1Y3NjcwIGhhcmR3YXJlIHdpbmRvdyByZWdpc3RlcnMgYXJlIHNwbGl0IGFjcm9zcwotCQkgKiBtdWx0aXBsZSBsb2NhdGlvbnMgKi8KLQkJaTJjX3coc2QsIE9WNzY3MF9SRUdfSFNUQVJULCBoc3RhcnQgPj4gMyk7Ci0JCWkyY193KHNkLCBPVjc2NzBfUkVHX0hTVE9QLCBoc3RvcCA+PiAzKTsKLQkJdiA9IGkyY19yKHNkLCBPVjc2NzBfUkVHX0hSRUYpOwotCQl2ID0gKHYgJiAweGMwKSB8ICgoaHN0b3AgJiAweDcpIDw8IDMpIHwgKGhzdGFydCAmIDB4MDcpOwotCQltc2xlZXAoMTApOwkvKiBuZWVkIHRvIHNsZWVwIGJldHdlZW4gcmVhZCBhbmQgd3JpdGUgdG8KLQkJCQkgKiBzYW1lIHJlZyEgKi8KLQkJaTJjX3coc2QsIE9WNzY3MF9SRUdfSFJFRiwgdik7Ci0KLQkJaTJjX3coc2QsIE9WNzY3MF9SRUdfVlNUQVJULCB2c3RhcnQgPj4gMik7Ci0JCWkyY193KHNkLCBPVjc2NzBfUkVHX1ZTVE9QLCB2c3RvcCA+PiAyKTsKLQkJdiA9IGkyY19yKHNkLCBPVjc2NzBfUkVHX1ZSRUYpOwotCQl2ID0gKHYgJiAweGMwKSB8ICgodnN0b3AgJiAweDMpIDw8IDIpIHwgKHZzdGFydCAmIDB4MDMpOwotCQltc2xlZXAoMTApOwkvKiBuZWVkIHRvIHNsZWVwIGJldHdlZW4gcmVhZCBhbmQgd3JpdGUgdG8KLQkJCQkgKiBzYW1lIHJlZyEgKi8KLQkJaTJjX3coc2QsIE9WNzY3MF9SRUdfVlJFRiwgdik7Ci0JfSBlbHNlIHsKLQkJaTJjX3coc2QsIDB4MTcsIGh3c2Jhc2UpOwotCQlpMmNfdyhzZCwgMHgxOCwgaHdlYmFzZSArIChzZC0+Z3NwY2FfZGV2LndpZHRoID4+IGh3c2NhbGUpKTsKLQkJaTJjX3coc2QsIDB4MTksIHZ3c2Jhc2UpOwotCQlpMmNfdyhzZCwgMHgxYSwgdndlYmFzZSArIChzZC0+Z3NwY2FfZGV2LmhlaWdodCA+PiB2d3NjYWxlKSk7Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC0yODE0LDYgKzM4NTgsMTAgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJaW50IHJldCA9IDA7CiAKKwkvKiBEZWZhdWx0IGZvciBtb3N0IGJyaWRnZXMsIGFsbG93IGJyaWRnZV9tb2RlX2luaXRfcmVncyB0byBvdmVycmlkZSAqLworCXNkLT5zZW5zb3Jfd2lkdGggPSBzZC0+Z3NwY2FfZGV2LndpZHRoOworCXNkLT5zZW5zb3JfaGVpZ2h0ID0gc2QtPmdzcGNhX2Rldi5oZWlnaHQ7CisKIAlzd2l0Y2ggKHNkLT5icmlkZ2UpIHsKIAljYXNlIEJSSURHRV9PVjUxMToKIAljYXNlIEJSSURHRV9PVjUxMVBMVVM6CkBAIC0yODI2LDYgKzM4NzQsMTAgQEAKIAljYXNlIEJSSURHRV9PVjUxOToKIAkJcmV0ID0gb3Y1MTlfbW9kZV9pbml0X3JlZ3Moc2QpOwogCQlicmVhazsKKwkvKiBjYXNlIEJSSURHRV9PVkZYMjogbm90aGluZyB0byBkbyAqLworCWNhc2UgQlJJREdFX1c5OTY4Q0Y6CisJCXJldCA9IHc5OTY4Y2ZfbW9kZV9pbml0X3JlZ3Moc2QpOworCQlicmVhazsKIAl9CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMjg1OSwxMCArMzkxMSwxNyBAQAogCW92NTF4X2xlZF9jb250cm9sKHNkLCAwKTsKIH0KIAorc3RhdGljIHZvaWQgc2Rfc3RvcDAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9XOTk2OENGKQorCQl3OTk2OGNmX3N0b3AwKHNkKTsKK30KKwogc3RhdGljIHZvaWQgb3Y1MTFfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCi0JCQlfX3U4ICppbiwJCQkvKiBpc29jIHBhY2tldCAqLwotCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLworCQkJdTggKmluLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQlpbnQgbGVuKQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKQEAgLTI4OTMsMTEgKzM5NTIsMTEgQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQkvKiBBZGQgMTEgYnl0ZSBmb290ZXIgdG8gZnJhbWUsIG1pZ2h0IGJlIHVzZWZ1bGwgKi8KLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwgaW4sIDExKTsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBpbiwgMTEpOwogCQkJcmV0dXJuOwogCQl9IGVsc2UgewogCQkJLyogRnJhbWUgc3RhcnQgKi8KLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsIGluLCAwKTsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgaW4sIDApOwogCQkJc2QtPnBhY2tldF9uciA9IDA7CiAJCX0KIAl9CkBAIC0yOTA2LDEyICszOTY1LDExIEBACiAJbGVuLS07CiAKIAkvKiBpbnRlcm1lZGlhdGUgcGFja2V0ICovCi0JZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBmcmFtZSwgaW4sIGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBpbiwgbGVuKTsKIH0KIAogc3RhdGljIHZvaWQgb3Y1MThfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKQEAgLTI5MTksOCArMzk3Nyw4IEBACiAJLyogQSBmYWxzZSBwb3NpdGl2ZSBoZXJlIGlzIGxpa2VseSwgdW50aWwgT1ZUIGdpdmVzIG1lCiAJICogdGhlIGRlZmluaXRpdmUgU09GL0VPRiBmb3JtYXQgKi8KIAlpZiAoKCEoZGF0YVswXSB8IGRhdGFbMV0gfCBkYXRhWzJdIHwgZGF0YVszXSB8IGRhdGFbNV0pKSAmJiBkYXRhWzZdKSB7Ci0JCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLCBkYXRhLCAwKTsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwgZGF0YSwgMCk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBOVUxMLCAwKTsKIAkJc2QtPnBhY2tldF9uciA9IDA7CiAJfQogCkBAIC0yOTQ0LDEyICs0MDAyLDExIEBACiAJfQogCiAJLyogaW50ZXJtZWRpYXRlIHBhY2tldCAqLwotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogfQogCiBzdGF0aWMgdm9pZCBvdjUxOV9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KLQkJCV9fdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7CiAJLyogSGVhZGVyIG9mIG92NTE5IGlzIDE2IGJ5dGVzOgpAQCAtMjk3Miw3ICs0MDI5LDcgQEAKIAkJCWxlbiAtPSBIRFJTWjsKICN1bmRlZiBIRFJTWgogCQkJaWYgKGRhdGFbMF0gPT0gMHhmZiB8fCBkYXRhWzFdID09IDB4ZDgpCi0JCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKKwkJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCiAJCQkJCQlkYXRhLCBsZW4pOwogCQkJZWxzZQogCQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwpAQCAtMjk4MCwyMCArNDAzNywzMSBAQAogCQljYXNlIDB4NTE6CQkvKiBlbmQgb2YgZnJhbWUgKi8KIAkJCWlmIChkYXRhWzldICE9IDApCiAJCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7Ci0JCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgZnJhbWUsCi0JCQkJCWRhdGEsIDApOworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCU5VTEwsIDApOwogCQkJcmV0dXJuOwogCQl9CiAJfQogCiAJLyogaW50ZXJtZWRpYXRlIHBhY2tldCAqLwotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCi0JCQlkYXRhLCBsZW4pOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgb3ZmeDJfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KK3sKKwkvKiBBIHNob3J0IHJlYWQgc2lnbmFscyBFT0YgKi8KKwlpZiAobGVuIDwgT1ZGWDJfQlVMS19TSVpFKSB7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBkYXRhLCBsZW4pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIE5VTEwsIDApOworCQlyZXR1cm47CisJfQorCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKQEAgLTMwMDEsMTQgKzQwNjksMjAgQEAKIAlzd2l0Y2ggKHNkLT5icmlkZ2UpIHsKIAljYXNlIEJSSURHRV9PVjUxMToKIAljYXNlIEJSSURHRV9PVjUxMVBMVVM6Ci0JCW92NTExX3BrdF9zY2FuKGdzcGNhX2RldiwgZnJhbWUsIGRhdGEsIGxlbik7CisJCW92NTExX3BrdF9zY2FuKGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBCUklER0VfT1Y1MTg6CiAJY2FzZSBCUklER0VfT1Y1MThQTFVTOgotCQlvdjUxOF9wa3Rfc2Nhbihnc3BjYV9kZXYsIGZyYW1lLCBkYXRhLCBsZW4pOworCQlvdjUxOF9wa3Rfc2Nhbihnc3BjYV9kZXYsIGRhdGEsIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgQlJJREdFX09WNTE5OgotCQlvdjUxOV9wa3Rfc2Nhbihnc3BjYV9kZXYsIGZyYW1lLCBkYXRhLCBsZW4pOworCQlvdjUxOV9wa3Rfc2Nhbihnc3BjYV9kZXYsIGRhdGEsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQlJJREdFX09WRlgyOgorCQlvdmZ4Ml9wa3Rfc2Nhbihnc3BjYV9kZXYsIGRhdGEsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQlJJREdFX1c5OTY4Q0Y6CisJCXc5OTY4Y2ZfcGt0X3NjYW4oZ3NwY2FfZGV2LCBkYXRhLCBsZW4pOwogCQlicmVhazsKIAl9CiB9CkBAIC0zMTI0LDcgKzQxOTgsOCBAQAogCiBzdGF0aWMgdm9pZCBzZXRhdXRvYnJpZ2h0bmVzcyhzdHJ1Y3Qgc2QgKnNkKQogewotCWlmIChzZC0+c2Vuc29yID09IFNFTl9PVjc2NDAgfHwgc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjcwKQorCWlmIChzZC0+c2Vuc29yID09IFNFTl9PVjc2NDAgfHwgc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjcwIHx8CisJICAgIHNkLT5zZW5zb3IgPT0gU0VOX09WMjYxMCB8fCBzZC0+c2Vuc29yID09IFNFTl9PVjM2MTApCiAJCXJldHVybjsKIAogCWkyY193X21hc2soc2QsIDB4MmQsIHNkLT5hdXRvYnJpZ2h0bmVzcyA/IDB4MTAgOiAweDAwLCAweDEwKTsKQEAgLTMxMzIsNiArNDIwNyw5IEBACiAKIHN0YXRpYyB2b2lkIHNldGZyZXEoc3RydWN0IHNkICpzZCkKIHsKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1YyNjEwIHx8IHNkLT5zZW5zb3IgPT0gU0VOX09WMzYxMCkKKwkJcmV0dXJuOworCiAJaWYgKHNkLT5zZW5zb3IgPT0gU0VOX09WNzY3MCkgewogCQlzd2l0Y2ggKHNkLT5mcmVxKSB7CiAJCWNhc2UgMDogLyogQmFuZGluZyBmaWx0ZXIgZGlzYWJsZWQgKi8KQEAgLTMzMDEsOCArNDM3OSwxMiBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCXNkLT5mcmVxID0gdmFsOwotCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpIHsKIAkJc2V0ZnJlcShzZCk7CisJCS8qIFVnbHkgYnV0IG5lY2Vzc2FyeSAqLworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVzk5NjhDRikKKwkJCXc5OTY4Y2Zfc2V0X2Nyb3Bfd2luZG93KHNkKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzNDMsNiArNDQyNSw0NSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW50IHNkX2dldF9qY29tcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKmpjb21wKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+YnJpZGdlICE9IEJSSURHRV9XOTk2OENGKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChqY29tcCwgMCwgc2l6ZW9mICpqY29tcCk7CisJamNvbXAtPnF1YWxpdHkgPSBzZC0+cXVhbGl0eTsKKwlqY29tcC0+anBlZ19tYXJrZXJzID0gVjRMMl9KUEVHX01BUktFUl9ESFQgfCBWNEwyX0pQRUdfTUFSS0VSX0RRVCB8CisJCQkgICAgICBWNEwyX0pQRUdfTUFSS0VSX0RSSTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRfamNvbXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpqY29tcCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAoc2QtPmJyaWRnZSAhPSBCUklER0VfVzk5NjhDRikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoamNvbXAtPnF1YWxpdHkgPCBRVUFMSVRZX01JTikKKwkJc2QtPnF1YWxpdHkgPSBRVUFMSVRZX01JTjsKKwllbHNlIGlmIChqY29tcC0+cXVhbGl0eSA+IFFVQUxJVFlfTUFYKQorCQlzZC0+cXVhbGl0eSA9IFFVQUxJVFlfTUFYOworCWVsc2UKKwkJc2QtPnF1YWxpdHkgPSBqY29tcC0+cXVhbGl0eTsKKworCS8qIFJldHVybiByZXN1bHRpbmcgamNvbXAgcGFyYW1zIHRvIGFwcCAqLworCXNkX2dldF9qY29tcChnc3BjYV9kZXYsIGpjb21wKTsKKworCXJldHVybiAwOworfQorCiAvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzYyA9IHsKIAkubmFtZSA9IE1PRFVMRV9OQU1FLApAQCAtMzM1MiwxOCArNDQ3MywyMyBAQAogCS5pbml0ID0gc2RfaW5pdCwKIAkuc3RhcnQgPSBzZF9zdGFydCwKIAkuc3RvcE4gPSBzZF9zdG9wTiwKKwkuc3RvcDAgPSBzZF9zdG9wMCwKIAkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKIAkucXVlcnltZW51ID0gc2RfcXVlcnltZW51LAorCS5nZXRfamNvbXAgPSBzZF9nZXRfamNvbXAsCisJLnNldF9qY29tcCA9IHNkX3NldF9qY29tcCwKIH07CiAKIC8qIC0tIG1vZHVsZSBpbml0aWFsaXNhdGlvbiAtLSAqLwogc3RhdGljIGNvbnN0IF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMDMpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfVzk5NjhDRiB9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDUyKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNWYpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTkgfSwKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA2MCksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDYxKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNjQpLAogCSAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTkgfCBCUklER0VfSU5WRVJUX0xFRCB9LAorCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDY3KSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNjgpLAogCSAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTkgfCBCUklER0VfSU5WRVJUX0xFRCB9LAogCXtVU0JfREVWSUNFKDB4MDQ1ZSwgMHgwMjhjKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCkBAIC0zMzczLDExICs0NDk5LDE2IEBACiAJe1VTQl9ERVZJQ0UoMHgwNWE5LCAweDA1MTgpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTggfSwKIAl7VVNCX0RFVklDRSgweDA1YTksIDB4MDUxOSksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAogCXtVU0JfREVWSUNFKDB4MDVhOSwgMHgwNTMwKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCisJe1VTQl9ERVZJQ0UoMHgwNWE5LCAweDI4MDApLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1ZGWDIgfSwKIAl7VVNCX0RFVklDRSgweDA1YTksIDB4NDUxOSksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAogCXtVU0JfREVWSUNFKDB4MDVhOSwgMHg4NTE5KSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCiAJe1VTQl9ERVZJQ0UoMHgwNWE5LCAweGE1MTEpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTFQTFVTIH0sCiAJe1VTQl9ERVZJQ0UoMHgwNWE5LCAweGE1MTgpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MThQTFVTIH0sCiAJe1VTQl9ERVZJQ0UoMHgwODEzLCAweDAwMDIpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTFQTFVTIH0sCisJe1VTQl9ERVZJQ0UoMHgwYjYyLCAweDAwNTkpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1ZGWDIgfSwKKwl7VVNCX0RFVklDRSgweDBlOTYsIDB4YzAwMSksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVkZYMiB9LAorCXtVU0JfREVWSUNFKDB4MTA0NiwgMHg5OTY3KSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX1c5OTY4Q0YgfSwKKwl7VVNCX0RFVklDRSgweDgwMjAsIDB4RUYwNCksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVkZYMiB9LAogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0LmMKaW5kZXggNGI1MjhiMy4uNGRiYjg4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzQuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBvdjUzNCBnc3BjYSBkcml2ZXIKKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW50b25pbyBPc3BpdGUgPG9zcGl0ZUBzdHVkZW50aS51bmluYS5pdD4KICAqIENvcHlyaWdodCAoQykgMjAwOCBKaW0gUGFyaXMgPGppbUBqdGFuLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAwOSBKZWFuLUZyYW5jb2lzIE1vaW5lIGh0dHA6Ly9tb2luZWpmLmZyZWUuZnIKQEAgLTgsNiArOSwxMCBAQAogICogVVNCIHByb3RvY29sIHJldmVyc2UgZW5naW5lZXJlZCBieSBKaW0gUGFyaXMgPGppbUBqdGFuLmNvbT4KICAqIGh0dHBzOi8vamltLnNoL3N2bi9qaW0vZGV2bC9wbGF5c3RhdGlvbi9wczMvZXllL3Rlc3QvCiAgKgorICogUFMzIEV5ZSBjYW1lcmEgZW5oYW5jZWQgYnkgUmljaGFyZCBLYXN3eSBodHRwOi8va2Fzd3kuZnJlZS5mcgorICogUFMzIEV5ZSBjYW1lcmEsIGJyaWdodG5lc3MsIGNvbnRyYXN0LCBodWUsIEFXQiBjb250cm9sIGFkZGVkCisgKglieSBNYXggVGhydW4gPGJlYXIyNHJ3QGdtYWlsLmNvbT4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC01MSwxNiArNTYsMzM1IEBACiAJdTE2IGxhc3RfZmlkOwogCXU4IGZyYW1lX3JhdGU7CiAKKwl1OCBicmlnaHRuZXNzOworCXU4IGNvbnRyYXN0OworCXU4IGdhaW47CisJdTggZXhwb3N1cmU7CisJdTggcmVkYmxjOworCXU4IGJsdWVibGM7CisJdTggaHVlOworCXU4IGF1dG9nYWluOworCXU4IGF3YjsKKwlzOCBzaGFycG5lc3M7CisJdTggaGZsaXA7CisJdTggdmZsaXA7CisJdTggc2F0dXI7CisJdTggbGlnaHRmcmVxOworCiAJdTggc2Vuc29yOwogI2RlZmluZSBTRU5TT1JfT1Y3NzJYIDAKICNkZWZpbmUgU0VOU09SX09WOTY1WCAxCiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCi1zdGF0aWMgc3RydWN0IGN0cmwgc2RfY3RybHNbXSA9IHsKK3N0YXRpYyBpbnQgc2Rfc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRyZWRibGMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRyZWRibGMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0Ymx1ZWJsYyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGJsdWVibGMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXR2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGh1ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGh1ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRhd2Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRhd2Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRzYXR1cihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldHNhdHVyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CisKK3N0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc19vdjc3MnhbXSA9IHsKKyAgICB7CQkJCQkJCS8qIDAgKi8KKwl7CisJCS5pZCAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJCcmlnaHRuZXNzIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDI1NSwKKwkJLnN0ZXAgICAgPSAxLAorI2RlZmluZSBCUklHSFRORVNTXzc3X0RFRiAyMAorCQkuZGVmYXVsdF92YWx1ZSA9IEJSSUdIVE5FU1NfNzdfREVGLAorCX0sCisJLnNldCA9IHNkX3NldGJyaWdodG5lc3MsCisJLmdldCA9IHNkX2dldGJyaWdodG5lc3MsCisgICAgfSwKKyAgICB7CQkJCQkJCS8qIDEgKi8KKwl7CisJCS5pZCAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgPSAiQ29udHJhc3QiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMjU1LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIENPTlRSQVNUXzc3X0RFRiAzNworCQkuZGVmYXVsdF92YWx1ZSA9IENPTlRSQVNUXzc3X0RFRiwKKwl9LAorCS5zZXQgPSBzZF9zZXRjb250cmFzdCwKKwkuZ2V0ID0gc2RfZ2V0Y29udHJhc3QsCisgICAgfSwKKyAgICB7CQkJCQkJCS8qIDIgKi8KKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfR0FJTiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgICAubmFtZSAgICA9ICJNYWluIEdhaW4iLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gNjMsCisJICAgIC5zdGVwICAgID0gMSwKKyNkZWZpbmUgR0FJTl9ERUYgMjAKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSBHQUlOX0RFRiwKKwl9LAorCS5zZXQgPSBzZF9zZXRnYWluLAorCS5nZXQgPSBzZF9nZXRnYWluLAorICAgIH0sCisgICAgewkJCQkJCQkvKiAzICovCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIkV4cG9zdXJlIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDI1NSwKKwkgICAgLnN0ZXAgICAgPSAxLAorI2RlZmluZSBFWFBPXzc3X0RFRiAxMjAKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSBFWFBPXzc3X0RFRiwKKwl9LAorCS5zZXQgPSBzZF9zZXRleHBvc3VyZSwKKwkuZ2V0ID0gc2RfZ2V0ZXhwb3N1cmUsCisgICAgfSwKKyAgICB7CQkJCQkJCS8qIDQgKi8KKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiUmVkIEJhbGFuY2UiLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gMjU1LAorCSAgICAuc3RlcCAgICA9IDEsCisjZGVmaW5lIFJFRF9CQUxBTkNFX0RFRiAxMjgKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSBSRURfQkFMQU5DRV9ERUYsCisJfSwKKwkuc2V0ID0gc2Rfc2V0cmVkYmxjLAorCS5nZXQgPSBzZF9nZXRyZWRibGMsCisgICAgfSwKKyAgICB7CQkJCQkJCS8qIDUgKi8KKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIkJsdWUgQmFsYW5jZSIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAyNTUsCisJICAgIC5zdGVwICAgID0gMSwKKyNkZWZpbmUgQkxVRV9CQUxBTkNFX0RFRiAxMjgKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSBCTFVFX0JBTEFOQ0VfREVGLAorCX0sCisJLnNldCA9IHNkX3NldGJsdWVibGMsCisJLmdldCA9IHNkX2dldGJsdWVibGMsCisgICAgfSwKKyAgICB7CQkJCQkJCS8qIDYgKi8KKwl7CisJCS5pZCAgICAgID0gVjRMMl9DSURfSFVFLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIkh1ZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAyNTUsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgSFVFX0RFRiAxNDMKKwkJLmRlZmF1bHRfdmFsdWUgPSBIVUVfREVGLAorCX0sCisJLnNldCA9IHNkX3NldGh1ZSwKKwkuZ2V0ID0gc2RfZ2V0aHVlLAorICAgIH0sCisgICAgewkJCQkJCQkvKiA3ICovCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0FVVE9HQUlOLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJICAgIC5uYW1lICAgID0gIkF1dG9nYWluIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKyNkZWZpbmUgQVVUT0dBSU5fNzdfREVGIDAKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSBBVVRPR0FJTl83N19ERUYsCisJfSwKKwkuc2V0ID0gc2Rfc2V0YXV0b2dhaW4sCisJLmdldCA9IHNkX2dldGF1dG9nYWluLAorICAgIH0sCisjZGVmaW5lIEFXQl83N19JRFggOAorICAgIHsJCQkJCQkJLyogOCAqLworCXsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgICAgPSAiQXV0byBXaGl0ZSBCYWxhbmNlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgQVdCX0RFRiAwCisJCS5kZWZhdWx0X3ZhbHVlID0gQVdCX0RFRiwKKwl9LAorCS5zZXQgPSBzZF9zZXRhd2IsCisJLmdldCA9IHNkX2dldGF3YiwKKyAgICB9LAorICAgIHsJCQkJCQkJLyogOSAqLworCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9TSEFSUE5FU1MsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiU2hhcnBuZXNzIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDYzLAorCSAgICAuc3RlcCAgICA9IDEsCisjZGVmaW5lIFNIQVJQTkVTU183N19ERUYgMAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IFNIQVJQTkVTU183N19ERUYsCisJfSwKKwkuc2V0ID0gc2Rfc2V0c2hhcnBuZXNzLAorCS5nZXQgPSBzZF9nZXRzaGFycG5lc3MsCisgICAgfSwKKyAgICB7CQkJCQkJCS8qIDEwICovCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0hGTElQLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJICAgIC5uYW1lICAgID0gIkhGbGlwIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKyNkZWZpbmUgSEZMSVBfREVGIDAKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSBIRkxJUF9ERUYsCisJfSwKKwkuc2V0ID0gc2Rfc2V0aGZsaXAsCisJLmdldCA9IHNkX2dldGhmbGlwLAorICAgIH0sCisgICAgewkJCQkJCQkvKiAxMSAqLworCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9WRkxJUCwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJWRmxpcCIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAxLAorCSAgICAuc3RlcCAgICA9IDEsCisjZGVmaW5lIFZGTElQX0RFRiAwCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gVkZMSVBfREVGLAorCX0sCisJLnNldCA9IHNkX3NldHZmbGlwLAorCS5nZXQgPSBzZF9nZXR2ZmxpcCwKKyAgICB9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc19vdjk2NXhbXSA9IHsKKyAgICB7CQkJCQkJCS8qIDAgKi8KKwl7CisJCS5pZCAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJCcmlnaHRuZXNzIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDE1LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIEJSSUdIVE5FU1NfOTZfREVGIDcKKwkJLmRlZmF1bHRfdmFsdWUgPSBCUklHSFRORVNTXzk2X0RFRiwKKwl9LAorCS5zZXQgPSBzZF9zZXRicmlnaHRuZXNzLAorCS5nZXQgPSBzZF9nZXRicmlnaHRuZXNzLAorICAgIH0sCisgICAgewkJCQkJCQkvKiAxICovCisJeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIkNvbnRyYXN0IiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDE1LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIENPTlRSQVNUXzk2X0RFRiAzCisJCS5kZWZhdWx0X3ZhbHVlID0gQ09OVFJBU1RfOTZfREVGLAorCX0sCisJLnNldCA9IHNkX3NldGNvbnRyYXN0LAorCS5nZXQgPSBzZF9nZXRjb250cmFzdCwKKyAgICB9LAorICAgIHsJCQkJCQkJLyogMiAqLworCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJBdXRvZ2FpbiIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAxLAorCSAgICAuc3RlcCAgICA9IDEsCisjZGVmaW5lIEFVVE9HQUlOXzk2X0RFRiAxCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gQVVUT0dBSU5fOTZfREVGLAorCX0sCisJLnNldCA9IHNkX3NldGF1dG9nYWluLAorCS5nZXQgPSBzZF9nZXRhdXRvZ2FpbiwKKyAgICB9LAorI2RlZmluZSBFWFBPXzk2X0lEWCAzCisgICAgewkJCQkJCQkvKiAzICovCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIkV4cG9zdXJlIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDMsCisJICAgIC5zdGVwICAgID0gMSwKKyNkZWZpbmUgRVhQT185Nl9ERUYgMAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IEVYUE9fOTZfREVGLAorCX0sCisJLnNldCA9IHNkX3NldGV4cG9zdXJlLAorCS5nZXQgPSBzZF9nZXRleHBvc3VyZSwKKyAgICB9LAorICAgIHsJCQkJCQkJLyogNCAqLworCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9TSEFSUE5FU1MsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiU2hhcnBuZXNzIiwKKwkgICAgLm1pbmltdW0gPSAtMSwJCS8qIC0xID0gYXV0byAqLworCSAgICAubWF4aW11bSA9IDQsCisJICAgIC5zdGVwICAgID0gMSwKKyNkZWZpbmUgU0hBUlBORVNTXzk2X0RFRiAtMQorCSAgICAuZGVmYXVsdF92YWx1ZSA9IFNIQVJQTkVTU185Nl9ERUYsCisJfSwKKwkuc2V0ID0gc2Rfc2V0c2hhcnBuZXNzLAorCS5nZXQgPSBzZF9nZXRzaGFycG5lc3MsCisgICAgfSwKKyAgICB7CQkJCQkJCS8qIDUgKi8KKwl7CisJCS5pZCAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJTYXR1cmF0aW9uIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDQsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgU0FUVVJfREVGIDIKKwkJLmRlZmF1bHRfdmFsdWUgPSBTQVRVUl9ERUYsCisJfSwKKwkuc2V0ID0gc2Rfc2V0c2F0dXIsCisJLmdldCA9IHNkX2dldHNhdHVyLAorICAgIH0sCisgICAgeworCXsKKwkJLmlkCSA9IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5uYW1lICAgID0gIkxpZ2h0IGZyZXF1ZW5jeSBmaWx0ZXIiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMiwJLyogMDogMCwgMTogNTBIeiwgMjo2MEh6ICovCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgRlJFUV9ERUYgMAorCQkuZGVmYXVsdF92YWx1ZSA9IEZSRVFfREVGLAorCX0sCisJLnNldCA9IHNkX3NldGZyZXEsCisJLmdldCA9IHNkX2dldGZyZXEsCisgICAgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV95dXl2X21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IG92NzcyeF9tb2RlW10gPSB7CisJezMyMCwgMjQwLCBWNEwyX1BJWF9GTVRfWVVZViwgVjRMMl9GSUVMRF9OT05FLAorCSAuYnl0ZXNwZXJsaW5lID0gMzIwICogMiwKKwkgLnNpemVpbWFnZSA9IDMyMCAqIDI0MCAqIDIsCisJIC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJIC5wcml2ID0gMX0sCiAJezY0MCwgNDgwLCBWNEwyX1BJWF9GTVRfWVVZViwgVjRMMl9GSUVMRF9OT05FLAogCSAuYnl0ZXNwZXJsaW5lID0gNjQwICogMiwKIAkgLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCAqIDIsCkBAIC02OCwyMCArMzkyLDM1IEBACiAJIC5wcml2ID0gMH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfanBlZ19tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBvdjk2NXhfbW9kZVtdID0gewogCXszMjAsIDI0MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkgLmJ5dGVzcGVybGluZSA9IDMyMCwKIAkgLnNpemVpbWFnZSA9IDMyMCAqIDI0MCAqIDMgLyA4ICsgNTkwLAogCSAuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCSAucHJpdiA9IDF9LAorCSAucHJpdiA9IDR9LAogCXs2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkgLmJ5dGVzcGVybGluZSA9IDY0MCwKIAkgLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCAqIDMgLyA4ICsgNTkwLAogCSAuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCSAucHJpdiA9IDN9LAorCXs4MDAsIDYwMCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkgLmJ5dGVzcGVybGluZSA9IDgwMCwKKwkgLnNpemVpbWFnZSA9IDgwMCAqIDYwMCAqIDMgLyA4ICsgNTkwLAorCSAuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCSAucHJpdiA9IDJ9LAorCXsxMDI0LCA3NjgsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCisJIC5ieXRlc3BlcmxpbmUgPSAxMDI0LAorCSAuc2l6ZWltYWdlID0gMTAyNCAqIDc2OCAqIDMgLyA4ICsgNTkwLAorCSAuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCSAucHJpdiA9IDF9LAorCXsxMjgwLCAxMDI0LCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAorCSAuYnl0ZXNwZXJsaW5lID0gMTI4MCwKKwkgLnNpemVpbWFnZSA9IDEyODAgKiAxMDI0ICogMyAvIDggKyA1OTAsCisJIC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCiAJIC5wcml2ID0gMH0sCiB9OwogCi1zdGF0aWMgY29uc3QgdTggYnJpZGdlX2luaXRfb3Y3MjJ4W11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggYnJpZGdlX2luaXRfb3Y3NzJ4W11bMl0gPSB7CiAJeyAweGMyLCAweDBjIH0sCiAJeyAweDg4LCAweGY4IH0sCiAJeyAweGMzLCAweDY5IH0sCkBAIC0xMjIsNiArNDYxLDcgQEAKIAl7IDB4MWQsIDB4NDAgfSwKIAl7IDB4MWQsIDB4MDIgfSwgLyogcGF5bG9hZCBzaXplIDB4MDIwMCAqIDQgPSAyMDQ4IGJ5dGVzICovCiAJeyAweDFkLCAweDAwIH0sIC8qIHBheWxvYWQgc2l6ZSAqLworCiAJeyAweDFkLCAweDAyIH0sIC8qIGZyYW1lIHNpemUgMHgwMjU4MDAgKiA0ID0gNjE0NDAwICovCiAJeyAweDFkLCAweDU4IH0sIC8qIGZyYW1lIHNpemUgKi8KIAl7IDB4MWQsIDB4MDAgfSwgLyogZnJhbWUgc2l6ZSAqLwpAQCAtMTM4LDEwICs0NzgsMjAgQEAKIAl7IDB4YzEsIDB4M2MgfSwKIAl7IDB4YzIsIDB4MGMgfSwKIH07Ci0KLXN0YXRpYyBjb25zdCB1OCBzZW5zb3JfaW5pdF9vdjcyMnhbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBzZW5zb3JfaW5pdF9vdjc3MnhbXVsyXSA9IHsKIAl7IDB4MTIsIDB4ODAgfSwKIAl7IDB4MTEsIDB4MDEgfSwKKy8qZml4bWU6IGJldHRlciBoYXZlIGEgZGVsYXk/Ki8KKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4MTEsIDB4MDEgfSwKIAogCXsgMHgzZCwgMHgwMyB9LAogCXsgMHgxNywgMHgyNiB9LApAQCAtMTU0LDEwICs1MDQsMTAgQEAKIAl7IDB4NjUsIDB4MjAgfSwKIAl7IDB4MTEsIDB4MDEgfSwKIAl7IDB4NDIsIDB4N2YgfSwKLQl7IDB4NjMsIDB4ZTAgfSwKKwl7IDB4NjMsIDB4YWEgfSwJCS8qIEFXQiAtIHdhcyBlMCAqLwogCXsgMHg2NCwgMHhmZiB9LAogCXsgMHg2NiwgMHgwMCB9LAotCXsgMHgxMywgMHhmMCB9LAorCXsgMHgxMywgMHhmMCB9LAkJLyogY29tOCAqLwogCXsgMHgwZCwgMHg0MSB9LAogCXsgMHgwZiwgMHhjNSB9LAogCXsgMHgxNCwgMHgxMSB9LApAQCAtMTcwLDcgKzUyMCw3IEBACiAJeyAweDJhLCAweDAwIH0sCiAJeyAweDJiLCAweDAwIH0sCiAJeyAweDZiLCAweGFhIH0sCi0JeyAweDEzLCAweGZmIH0sCisJeyAweDEzLCAweGZmIH0sCQkvKiBBV0IgKi8KIAogCXsgMHg5MCwgMHgwNSB9LAogCXsgMHg5MSwgMHgwMSB9LApAQCAtMjE4LDkgKzU2OCw1MSBAQAogCXsgMHgxNCwgMHg0MSB9LAogCXsgMHgwZSwgMHhjZCB9LAogCXsgMHhhYywgMHhiZiB9LAotCXsgMHg4ZSwgMHgwMCB9LAorCXsgMHg4ZSwgMHgwMCB9LAkJLyogRGUtbm9pc2UgdGhyZXNob2xkICovCiAJeyAweDBjLCAweGQwIH0KIH07CitzdGF0aWMgY29uc3QgdTggYnJpZGdlX3N0YXJ0X292NzcyeF92Z2FbXVsyXSA9IHsKKwl7MHgxYywgMHgwMH0sCisJezB4MWQsIDB4NDB9LAorCXsweDFkLCAweDAyfSwKKwl7MHgxZCwgMHgwMH0sCisJezB4MWQsIDB4MDJ9LAorCXsweDFkLCAweDU4fSwKKwl7MHgxZCwgMHgwMH0sCisJezB4YzAsIDB4NTB9LAorCXsweGMxLCAweDNjfSwKK307CitzdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0X292NzcyeF92Z2FbXVsyXSA9IHsKKwl7MHgxMiwgMHgwMH0sCisJezB4MTcsIDB4MjZ9LAorCXsweDE4LCAweGEwfSwKKwl7MHgxOSwgMHgwN30sCisJezB4MWEsIDB4ZjB9LAorCXsweDI5LCAweGEwfSwKKwl7MHgyYywgMHhmMH0sCisJezB4NjUsIDB4MjB9LAorfTsKK3N0YXRpYyBjb25zdCB1OCBicmlkZ2Vfc3RhcnRfb3Y3NzJ4X3F2Z2FbXVsyXSA9IHsKKwl7MHgxYywgMHgwMH0sCisJezB4MWQsIDB4NDB9LAorCXsweDFkLCAweDAyfSwKKwl7MHgxZCwgMHgwMH0sCisJezB4MWQsIDB4MDF9LAorCXsweDFkLCAweDRifSwKKwl7MHgxZCwgMHgwMH0sCisJezB4YzAsIDB4Mjh9LAorCXsweGMxLCAweDFlfSwKK307CitzdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0X292NzcyeF9xdmdhW11bMl0gPSB7CisJezB4MTIsIDB4NDB9LAorCXsweDE3LCAweDNmfSwKKwl7MHgxOCwgMHg1MH0sCisJezB4MTksIDB4MDN9LAorCXsweDFhLCAweDc4fSwKKwl7MHgyOSwgMHg1MH0sCisJezB4MmMsIDB4Nzh9LAorCXsweDY1LCAweDJmfSwKK307CiAKIHN0YXRpYyBjb25zdCB1OCBicmlkZ2VfaW5pdF9vdjk2NXhbXVsyXSA9IHsKIAl7MHg4OCwgMHhmOH0sCkBAIC00MDMsNyArNzk1LDcgQEAKIAl7MHhjYiwgMHhmMH0sCiAJezB4Y2MsIDB4ZDh9LAogCXsweGNkLCAweGYxfSwKLQl7MHg0ZiwgMHg5OH0sCisJezB4NGYsIDB4OTh9LAkvKiBtYXRyaXggKi8KIAl7MHg1MCwgMHg5OH0sCiAJezB4NTEsIDB4MDB9LAogCXsweDUyLCAweDI4fSwKQEAgLTQxMiw2ICs4MDQsNyBAQAogCXsweDU4LCAweDFhfSwKIAl7MHhmZiwgMHg0MX0sCS8qIHJlYWQgNDEsIHdyaXRlIGZmIDAwICovCiAJezB4NDEsIDB4NDB9LAkvKiBjb20xNiAqLworCiAJezB4YzUsIDB4MDN9LAkvKiA2MCBIeiBiYW5kaW5nIGZpbHRlciAqLwogCXsweDZhLCAweDAyfSwJLyogNTAgSHogYmFuZGluZyBmaWx0ZXIgKi8KIApAQCAtNDU1LDggKzg0OCw4IEBACiAJezB4NTIsIDB4M2N9LAogCXsweDUzLCAweDAwfSwKIAl7MHg1NCwgMHgwMH0sCi0JezB4NTUsIDB4MDB9LAkvKiBicmlnaHRuZXNzICovCi0JezB4NTcsIDB4MDB9LAkvKiBjb250cmFzdCAyICovCisJezB4NTUsIDB4MDB9LAorCXsweDU3LCAweDAwfSwKIAl7MHg1YywgMHgwMH0sCiAJezB4NWEsIDB4YTB9LAogCXsweDViLCAweDc4fSwKQEAgLTQ3OSwxNCArODcyLDE2IEBACiAJezB4YTMsIDB4M2V9LAogCXsweDJkLCAweDAwfSwKIAl7MHhmZiwgMHg0Mn0sCS8qIHJlYWQgNDIsIHdyaXRlIGZmIDAwICovCi0JezB4NDIsIDB4YzB9LAorCXsweDQyLCAweGMwfSwJLyogY29tMTcgKi8KIAl7MHgyZCwgMHgwMH0sCiAJezB4ZmYsIDB4NDJ9LAkvKiByZWFkIDQyLCB3cml0ZSBmZiAwMCAqLwotCXsweDQyLCAweGMxfSwKKwl7MHg0MiwgMHhjMX0sCS8qIGNvbTE3ICovCisvKiBzaGFycG5lc3MgKi8KIAl7MHgzZiwgMHgwMX0sCiAJezB4ZmYsIDB4NDJ9LAkvKiByZWFkIDQyLCB3cml0ZSBmZiAwMCAqLwotCXsweDQyLCAweGMxfSwKLQl7MHg0ZiwgMHg5OH0sCisJezB4NDIsIDB4YzF9LAkvKiBjb20xNyAqLworLyogc2F0dXJhdGlvbiAqLworCXsweDRmLCAweDk4fSwJLyogbWF0cml4ICovCiAJezB4NTAsIDB4OTh9LAogCXsweDUxLCAweDAwfSwKIAl7MHg1MiwgMHgyOH0sCkBAIC00OTUsMTQgKzg5MCwxNyBAQAogCXsweDU4LCAweDFhfSwKIAl7MHhmZiwgMHg0MX0sCS8qIHJlYWQgNDEsIHdyaXRlIGZmIDAwICovCiAJezB4NDEsIDB4NDB9LAkvKiBjb20xNiAqLworLyogY29udHJhc3QgKi8KIAl7MHg1NiwgMHg0MH0sCisvKiBicmlnaHRuZXNzICovCiAJezB4NTUsIDB4OGZ9LAorLyogZXhwbyAqLwogCXsweDEwLCAweDI1fSwJLyogYWVjaCAtIGV4cG9zdXJlIGhpZ2ggYml0cyAqLwogCXsweGZmLCAweDEzfSwJLyogcmVhZCAxMywgd3JpdGUgZmYgMDAgKi8KIAl7MHgxMywgMHhlN30sCS8qIGNvbTggLSBldmVyeXRoaW5nIChBR0MsIEFXQiBhbmQgQUVDKSAqLwogfTsKIAotc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9zdGFydF9vdjk2NXhbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzFfdmdhW11bMl0gPSB7CS8qIHNhbWUgZm9yIHF2Z2EgKi8KIAl7MHgxMiwgMHg2Mn0sCS8qIGNvbTcgLSAzMGZwcyBWR0EgWVVWICovCiAJezB4MzYsIDB4ZmF9LAkvKiBhcmVmMyAqLwogCXsweDY5LCAweDBhfSwJLyogaHYgKi8KQEAgLTUyMywxMCArOTIxLDc3IEBACiAJezB4MWEsIDB4M2R9LAkvKiB2c3RvcCAqLwogCXsweDMyLCAweGZmfSwJLyogaHJlZiAqLwogCXsweGMwLCAweGFhfSwKLQl7fQogfTsKIAotc3RhdGljIGNvbnN0IHU4IGJyaWRnZV9zdGFydF9vdjk2NXhbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzFfc3ZnYVtdWzJdID0geworCXsweDEyLCAweDAyfSwJLyogY29tNyAtIFlVWVYgLSBWR0EgMTUgZnVsbCByZXNvbHV0aW9uICovCisJezB4MzYsIDB4Zjh9LAkvKiBhcmVmMyAqLworCXsweDY5LCAweDAyfSwJLyogaHYgKi8KKwl7MHg4YywgMHgwZH0sCS8qIGNvbTIyICovCisJezB4M2UsIDB4MGN9LAkvKiBjb20xNCAqLworCXsweDQxLCAweDQwfSwJLyogY29tMTYgKi8KKwl7MHg3MiwgMHgwMH0sCisJezB4NzMsIDB4MDF9LAorCXsweDc0LCAweDNhfSwKKwl7MHg3NSwgMHgzNX0sCisJezB4NzYsIDB4MDF9LAorCXsweGM3LCAweDgwfSwJLyogY29tMjQgKi8KKwl7MHgwMywgMHgxYn0sCS8qIHZyZWYgKi8KKwl7MHgxNywgMHgxZH0sCS8qIGhzdGFydCAqLworCXsweDE4LCAweGJkfSwJLyogaHN0b3AgKi8KKwl7MHgxOSwgMHgwMX0sCS8qIHZzdHJ0ICovCisJezB4MWEsIDB4ODF9LAkvKiB2c3RvcCAqLworCXsweDMyLCAweGZmfSwJLyogaHJlZiAqLworCXsweGMwLCAweGUyfSwKK307CisKK3N0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzFfeGdhW11bMl0gPSB7CisJezB4MTIsIDB4MDJ9LAkvKiBjb203ICovCisJezB4MzYsIDB4Zjh9LAkvKiBhcmVmMyAqLworCXsweDY5LCAweDAyfSwJLyogaHYgKi8KKwl7MHg4YywgMHg4OX0sCS8qIGNvbTIyICovCisJezB4MTQsIDB4Mjh9LAkvKiBjb205ICovCisJezB4M2UsIDB4MGN9LAkvKiBjb20xNCAqLworCXsweDQxLCAweDQwfSwJLyogY29tMTYgKi8KKwl7MHg3MiwgMHgwMH0sCisJezB4NzMsIDB4MDF9LAorCXsweDc0LCAweDNhfSwKKwl7MHg3NSwgMHgzNX0sCisJezB4NzYsIDB4MDF9LAorCXsweGM3LCAweDgwfSwJLyogY29tMjQgKi8KKwl7MHgwMywgMHgxYn0sCS8qIHZyZWYgKi8KKwl7MHgxNywgMHgxZH0sCS8qIGhzdGFydCAqLworCXsweDE4LCAweGJkfSwJLyogaHN0b3AgKi8KKwl7MHgxOSwgMHgwMX0sCS8qIHZzdHJ0ICovCisJezB4MWEsIDB4ODF9LAkvKiB2c3RvcCAqLworCXsweDMyLCAweGZmfSwJLyogaHJlZiAqLworCXsweGMwLCAweGUyfSwKK307CisKK3N0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzFfc3hnYVtdWzJdID0geworCXsweDEyLCAweDAyfSwJLyogY29tNyAqLworCXsweDM2LCAweGY4fSwJLyogYXJlZjMgKi8KKwl7MHg2OSwgMHgwMn0sCS8qIGh2ICovCisJezB4OGMsIDB4ODl9LAkvKiBjb20yMiAqLworCXsweDE0LCAweDI4fSwJLyogY29tOSAqLworCXsweDNlLCAweDBjfSwJLyogY29tMTQgKi8KKwl7MHg0MSwgMHg0MH0sCS8qIGNvbTE2ICovCisJezB4NzIsIDB4MDB9LAorCXsweDczLCAweDAxfSwKKwl7MHg3NCwgMHgzYX0sCisJezB4NzUsIDB4MzV9LAorCXsweDc2LCAweDAxfSwKKwl7MHhjNywgMHg4MH0sCS8qIGNvbTI0ICovCisJezB4MDMsIDB4MWJ9LAkvKiB2cmVmICovCisJezB4MTcsIDB4MWR9LAkvKiBoc3RhcnQgKi8KKwl7MHgxOCwgMHgwMn0sCS8qIGhzdG9wICovCisJezB4MTksIDB4MDF9LAkvKiB2c3RydCAqLworCXsweDFhLCAweDgxfSwJLyogdnN0b3AgKi8KKwl7MHgzMiwgMHhmZn0sCS8qIGhyZWYgKi8KKwl7MHhjMCwgMHhlMn0sCit9OworCitzdGF0aWMgY29uc3QgdTggYnJpZGdlX3N0YXJ0X292OTY1eF9xdmdhW11bMl0gPSB7CiAJezB4OTQsIDB4YWF9LAogCXsweGYxLCAweDYwfSwKIAl7MHhlNSwgMHgwNH0sCkBAIC01MzUsMzAgKzEwMDAsNyBAQAogCXsweDhjLCAweDAwfSwKIAl7MHg4ZCwgMHgxY30sCiAJezB4MzQsIDB4MDV9LAotCXt9Ci19OwogCi1zdGF0aWMgY29uc3QgdTggYnJpZGdlX3N0YXJ0X292OTY1eF92Z2FbXVsyXSA9IHsKLQl7MHhjMiwgMHgwY30sCi0JezB4YzMsIDB4Zjl9LAotCXsweGRhLCAweDAxfSwKLQl7MHg1MCwgMHgwMH0sCi0JezB4NTEsIDB4YTB9LAotCXsweDUyLCAweDNjfSwKLQl7MHg1MywgMHgwMH0sCi0JezB4NTQsIDB4MDB9LAotCXsweDU1LCAweDAwfSwKLQl7MHg1NywgMHgwMH0sCi0JezB4NWMsIDB4MDB9LAotCXsweDVhLCAweGEwfSwKLQl7MHg1YiwgMHg3OH0sCi0JezB4MzUsIDB4MDJ9LAotCXsweGQ5LCAweDEwfSwKLQl7MHg5NCwgMHgxMX0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBicmlkZ2Vfc3RhcnRfb3Y5NjV4X2NpZltdWzJdID0gewogCXsweGMyLCAweDRjfSwKIAl7MHhjMywgMHhmOX0sCiAJezB4ZGEsIDB4MDB9LApAQCAtNTc1LDI3ICsxMDE3LDEwNyBAQAogCXsweDM1LCAweDAyfSwKIAl7MHhkOSwgMHgxMH0sCiAJezB4OTQsIDB4MTF9LAotCXt9CiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0X292OTY1eF92Z2FbXVsyXSA9IHsKLQl7MHgzYiwgMHhjNH0sCS8qIGNvbTExIC0gbmlnaHQgbW9kZSAxLzQgZnJhbWUgcmF0ZSAqLwotCXsweDFlLCAweDA0fSwJLyogbXZmcCAqLwotCXsweDEzLCAweGUwfSwJLyogY29tOCAqLwotCXsweDAwLCAweDAwfSwKLQl7MHgxMywgMHhlN30sCS8qIGNvbTggLSBldmVyeXRoaW5nIChBR0MsIEFXQiBhbmQgQUVDKSAqLwotCXsweDExLCAweDAzfSwJLyogY2xrcmMgKi8KLQl7MHg2YiwgMHg1YX0sCS8qIGRibHYgKi8KLQl7MHg2YSwgMHgwNX0sCS8qIDUwIEh6IGJhbmRpbmcgZmlsdGVyICovCi0JezB4YzUsIDB4MDd9LAkvKiA2MCBIeiBiYW5kaW5nIGZpbHRlciAqLwotCXsweGEyLCAweDRifSwJLyogYmQ1MCAqLwotCXsweGEzLCAweDNlfSwJLyogYmQ2MCAqLwotCi0JezB4MmQsIDB4MDB9LAkvKiBhZHZmbCAqLwotCXt9CitzdGF0aWMgY29uc3QgdTggYnJpZGdlX3N0YXJ0X292OTY1eF92Z2FbXVsyXSA9IHsKKwl7MHg5NCwgMHhhYX0sCisJezB4ZjEsIDB4NjB9LAorCXsweGU1LCAweDA0fSwKKwl7MHhjMCwgMHg1MH0sCisJezB4YzEsIDB4M2N9LAorCXsweDhjLCAweDAwfSwKKwl7MHg4ZCwgMHgxY30sCisJezB4MzQsIDB4MDV9LAorCXsweGMyLCAweDBjfSwKKwl7MHhjMywgMHhmOX0sCisJezB4ZGEsIDB4MDF9LAorCXsweDUwLCAweDAwfSwKKwl7MHg1MSwgMHhhMH0sCisJezB4NTIsIDB4M2N9LAorCXsweDUzLCAweDAwfSwKKwl7MHg1NCwgMHgwMH0sCisJezB4NTUsIDB4MDB9LAorCXsweDU3LCAweDAwfSwKKwl7MHg1YywgMHgwMH0sCisJezB4NWEsIDB4YTB9LAorCXsweDViLCAweDc4fSwKKwl7MHgzNSwgMHgwMn0sCisJezB4ZDksIDB4MTB9LAorCXsweDk0LCAweDExfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4X2NpZltdWzJdID0geworc3RhdGljIGNvbnN0IHU4IGJyaWRnZV9zdGFydF9vdjk2NXhfc3ZnYVtdWzJdID0geworCXsweDk0LCAweGFhfSwKKwl7MHhmMSwgMHg2MH0sCisJezB4ZTUsIDB4MDR9LAorCXsweGMwLCAweGEwfSwKKwl7MHhjMSwgMHg4MH0sCisJezB4OGMsIDB4MDB9LAorCXsweDhkLCAweDFjfSwKKwl7MHgzNCwgMHgwNX0sCisJezB4YzIsIDB4NGN9LAorCXsweGMzLCAweGY5fSwKKwl7MHg1MCwgMHgwMH0sCisJezB4NTEsIDB4NDB9LAorCXsweDUyLCAweDAwfSwKKwl7MHg1MywgMHgwMH0sCisJezB4NTQsIDB4MDB9LAorCXsweDU1LCAweDg4fSwKKwl7MHg1NywgMHgwMH0sCisJezB4NWMsIDB4MDB9LAorCXsweDVhLCAweGM4fSwKKwl7MHg1YiwgMHg5Nn0sCisJezB4MzUsIDB4MDJ9LAorCXsweGQ5LCAweDEwfSwKKwl7MHhkYSwgMHgwMH0sCisJezB4OTQsIDB4MTF9LAorfTsKKworc3RhdGljIGNvbnN0IHU4IGJyaWRnZV9zdGFydF9vdjk2NXhfeGdhW11bMl0gPSB7CisJezB4OTQsIDB4YWF9LAorCXsweGYxLCAweDYwfSwKKwl7MHhlNSwgMHgwNH0sCisJezB4YzAsIDB4YTB9LAorCXsweGMxLCAweDgwfSwKKwl7MHg4YywgMHgwMH0sCisJezB4OGQsIDB4MWN9LAorCXsweDM0LCAweDA1fSwKKwl7MHhjMiwgMHg0Y30sCisJezB4YzMsIDB4Zjl9LAorCXsweDUwLCAweDAwfSwKKwl7MHg1MSwgMHg0MH0sCisJezB4NTIsIDB4MDB9LAorCXsweDUzLCAweDAwfSwKKwl7MHg1NCwgMHgwMH0sCisJezB4NTUsIDB4ODh9LAorCXsweDU3LCAweDAwfSwKKwl7MHg1YywgMHgwMX0sCisJezB4NWEsIDB4MDB9LAorCXsweDViLCAweGMwfSwKKwl7MHgzNSwgMHgwMn0sCisJezB4ZDksIDB4MTB9LAorCXsweGRhLCAweDAxfSwKKwl7MHg5NCwgMHgxMX0sCit9OworCitzdGF0aWMgY29uc3QgdTggYnJpZGdlX3N0YXJ0X292OTY1eF9zeGdhW11bMl0gPSB7CisJezB4OTQsIDB4YWF9LAorCXsweGYxLCAweDYwfSwKKwl7MHhlNSwgMHgwNH0sCisJezB4YzAsIDB4YTB9LAorCXsweGMxLCAweDgwfSwKKwl7MHg4YywgMHgwMH0sCisJezB4OGQsIDB4MWN9LAorCXsweDM0LCAweDA1fSwKKwl7MHhjMiwgMHgwY30sCisJezB4YzMsIDB4Zjl9LAorCXsweGRhLCAweDAwfSwKKwl7MHgzNSwgMHgwMn0sCisJezB4ZDksIDB4MTB9LAorCXsweDk0LCAweDExfSwKK307CisKK3N0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzJfcXZnYVtdWzJdID0gewogCXsweDNiLCAweGU0fSwJLyogY29tMTEgLSBuaWdodCBtb2RlIDEvNCBmcmFtZSByYXRlICovCiAJezB4MWUsIDB4MDR9LAkvKiBtdmZwICovCiAJezB4MTMsIDB4ZTB9LAkvKiBjb204ICovCkBAIC02MTEsMTUgKzExMzMsNTEgQEAKIAl7MHhmZiwgMHgxM30sCS8qIHJlYWQgMTMsIHdyaXRlIGZmIDAwICovCiAJezB4MTMsIDB4ZTd9LAogCXsweDNhLCAweDgwfSwJLyogdHNsYiAtIHl1eXYgKi8KLQl7fQogfTsKIAotc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9zdGFydF9vdjk2NXhfMltdWzJdID0gewotCXsweGZmLCAweDQyfSwJLyogcmVhZCA0Miwgd3JpdGUgZmYgMDAgKi8KLQl7MHg0MiwgMHhjMX0sCS8qIGNvbTE3IC0gNTAgSHogZmlsdGVyICovCi0Je30KK3N0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzJfdmdhW11bMl0gPSB7CisJezB4M2IsIDB4YzR9LAkvKiBjb20xMSAtIG5pZ2h0IG1vZGUgMS80IGZyYW1lIHJhdGUgKi8KKwl7MHgxZSwgMHgwNH0sCS8qIG12ZnAgKi8KKwl7MHgxMywgMHhlMH0sCS8qIGNvbTggKi8KKwl7MHgwMCwgMHgwMH0sCisJezB4MTMsIDB4ZTd9LAkvKiBjb204IC0gZXZlcnl0aGluZyAoQUdDLCBBV0IgYW5kIEFFQykgKi8KKwl7MHgxMSwgMHgwM30sCS8qIGNsa3JjICovCisJezB4NmIsIDB4NWF9LAkvKiBkYmx2ICovCisJezB4NmEsIDB4MDV9LAkvKiA1MCBIeiBiYW5kaW5nIGZpbHRlciAqLworCXsweGM1LCAweDA3fSwJLyogNjAgSHogYmFuZGluZyBmaWx0ZXIgKi8KKwl7MHhhMiwgMHg0Yn0sCS8qIGJkNTAgKi8KKwl7MHhhMywgMHgzZX0sCS8qIGJkNjAgKi8KKworCXsweDJkLCAweDAwfSwJLyogYWR2ZmwgKi8KIH07CiAKK3N0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzJfc3ZnYVtdWzJdID0gewkvKiBzYW1lIGZvciB4Z2EgKi8KKwl7MHgzYiwgMHhjNH0sCS8qIGNvbTExIC0gbmlnaHQgbW9kZSAxLzQgZnJhbWUgcmF0ZSAqLworCXsweDFlLCAweDA0fSwJLyogbXZmcCAqLworCXsweDEzLCAweGUwfSwJLyogY29tOCAqLworCXsweDAwLCAweDAwfSwKKwl7MHgxMywgMHhlN30sCS8qIGNvbTggLSBldmVyeXRoaW5nIChBR0MsIEFXQiBhbmQgQUVDKSAqLworCXsweDExLCAweDAxfSwJLyogY2xrcmMgKi8KKwl7MHg2YiwgMHg1YX0sCS8qIGRibHYgKi8KKwl7MHg2YSwgMHgwY30sCS8qIDUwIEh6IGJhbmRpbmcgZmlsdGVyICovCisJezB4YzUsIDB4MGZ9LAkvKiA2MCBIeiBiYW5kaW5nIGZpbHRlciAqLworCXsweGEyLCAweDRlfSwJLyogYmQ1MCAqLworCXsweGEzLCAweDQxfSwJLyogYmQ2MCAqLworfTsKKworc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9zdGFydF9vdjk2NXhfMl9zeGdhW11bMl0gPSB7CisJezB4MTMsIDB4ZTB9LAkvKiBjb204ICovCisJezB4MDAsIDB4MDB9LAorCXsweDEzLCAweGU3fSwJLyogY29tOCAtIGV2ZXJ5dGhpbmcgKEFHQywgQVdCIGFuZCBBRUMpICovCisJezB4M2IsIDB4YzR9LAkvKiBjb20xMSAtIG5pZ2h0IG1vZGUgMS80IGZyYW1lIHJhdGUgKi8KKwl7MHgxZSwgMHgwNH0sCS8qIG12ZnAgKi8KKwl7MHgxMSwgMHgwMX0sCS8qIGNsa3JjICovCisJezB4NmIsIDB4NWF9LAkvKiBkYmx2ICovCisJezB4NmEsIDB4MGN9LAkvKiA1MCBIeiBiYW5kaW5nIGZpbHRlciAqLworCXsweGM1LCAweDBmfSwJLyogNjAgSHogYmFuZGluZyBmaWx0ZXIgKi8KKwl7MHhhMiwgMHg0ZX0sCS8qIGJkNTAgKi8KKwl7MHhhMywgMHg0MX0sCS8qIGJkNjAgKi8KK307CiAKIHN0YXRpYyB2b2lkIG92NTM0X3JlZ193cml0ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHUxNiByZWcsIHU4IHZhbCkKIHsKQEAgLTc1MywzOSArMTMxMSwzMTAgQEAKIAl9CiB9CiAKLS8qIHNldCBmcmFtZXJhdGUgKi8KLXN0YXRpYyB2b2lkIG92NTM0X3NldF9mcmFtZV9yYXRlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKKy8qIG92NzcyeCBzcGVjaWZpYyBjb250cm9scyAqLworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX3JhdGUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlpbnQgZnIgPSBzZC0+ZnJhbWVfcmF0ZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgcmF0ZV9zIHsKKwkJdTggZnBzOworCQl1OCByMTE7CisJCXU4IHIwZDsKKwkJdTggcmU1OworCX07CisJY29uc3Qgc3RydWN0IHJhdGVfcyAqcjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfcyByYXRlXzBbXSA9IHsJLyogNjQweDQ4MCAqLworCQl7NjAsIDB4MDEsIDB4YzEsIDB4MDR9LAorCQl7NTAsIDB4MDEsIDB4NDEsIDB4MDJ9LAorCQl7NDAsIDB4MDIsIDB4YzEsIDB4MDR9LAorCQl7MzAsIDB4MDQsIDB4ODEsIDB4MDJ9LAorCQl7MTUsIDB4MDMsIDB4NDEsIDB4MDR9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCByYXRlX3MgcmF0ZV8xW10gPSB7CS8qIDMyMHgyNDAgKi8KKwkJezEyNSwgMHgwMiwgMHg4MSwgMHgwMn0sCisJCXsxMDAsIDB4MDIsIDB4YzEsIDB4MDR9LAorCQl7NzUsIDB4MDMsIDB4YzEsIDB4MDR9LAorCQl7NjAsIDB4MDQsIDB4YzEsIDB4MDR9LAorCQl7NTAsIDB4MDIsIDB4NDEsIDB4MDR9LAorCQl7NDAsIDB4MDMsIDB4NDEsIDB4MDR9LAorCQl7MzAsIDB4MDQsIDB4NDEsIDB4MDR9LAorCX07CiAKLQlzd2l0Y2ggKGZyKSB7Ci0JY2FzZSA1MDoKLQkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKLQkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDBkLCAweDQxKTsKLQkJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlNSwgMHgwMik7Ci0JCWJyZWFrOwotCWNhc2UgNDA6Ci0JCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgxMSwgMHgwMik7Ci0JCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgwZCwgMHhjMSk7Ci0JCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTUsIDB4MDQpOwotCQlicmVhazsKLS8qCWNhc2UgMzA6ICovCi0JZGVmYXVsdDoKLQkJZnIgPSAzMDsKLQkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDExLCAweDA0KTsKLQkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDBkLCAweDgxKTsKLQkJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlNSwgMHgwMik7Ci0JCWJyZWFrOwotCWNhc2UgMTU6Ci0JCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgxMSwgMHgwMyk7Ci0JCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgwZCwgMHg0MSk7Ci0JCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTUsIDB4MDQpOwotCQlicmVhazsKKwlpZiAoZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXYgPT0gMCkgeworCQlyID0gcmF0ZV8wOworCQlpID0gQVJSQVlfU0laRShyYXRlXzApOworCX0gZWxzZSB7CisJCXIgPSByYXRlXzE7CisJCWkgPSBBUlJBWV9TSVpFKHJhdGVfMSk7CisJfQorCXdoaWxlICgtLWkgPiAwKSB7CisJCWlmIChzZC0+ZnJhbWVfcmF0ZSA+PSByLT5mcHMpCisJCQlicmVhazsKKwkJcisrOwogCX0KIAotCXNkLT5mcmFtZV9yYXRlID0gZnI7Ci0JUERFQlVHKERfUFJPQkUsICJmcmFtZV9yYXRlOiAlZCIsIGZyKTsKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MTEsIHItPnIxMSk7CisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDBkLCByLT5yMGQpOworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTUsIHItPnJlNSk7CisKKwlQREVCVUcoRF9QUk9CRSwgImZyYW1lX3JhdGU6ICVkIiwgci0+ZnBzKTsKK30KKworc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzc183NyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDlCLCBzZC0+YnJpZ2h0bmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGNvbnRyYXN0Xzc3KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4OUMsIHNkLT5jb250cmFzdCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCB2YWw7CisKKwl2YWwgPSBzZC0+Z2FpbjsKKwlzd2l0Y2ggKHZhbCAmIDB4MzApIHsKKwljYXNlIDB4MDA6CisJCXZhbCAmPSAweDBmOworCQlicmVhazsKKwljYXNlIDB4MTA6CisJCXZhbCAmPSAweDBmOworCQl2YWwgfD0gMHgzMDsKKwkJYnJlYWs7CisJY2FzZSAweDIwOgorCQl2YWwgJj0gMHgwZjsKKwkJdmFsIHw9IDB4NzA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisvKgljYXNlIDB4MzA6ICovCisJCXZhbCAmPSAweDBmOworCQl2YWwgfD0gMHhmMDsKKwkJYnJlYWs7CisJfQorCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgwMCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgc2V0ZXhwb3N1cmVfNzcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCB2YWw7CisKKwl2YWwgPSBzZC0+ZXhwb3N1cmU7CisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDA4LCB2YWwgPj4gNyk7CisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDEwLCB2YWwgPDwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHJlZGJsYyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDQzLCBzZC0+cmVkYmxjKTsKK30KKworc3RhdGljIHZvaWQgc2V0Ymx1ZWJsYyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDQyLCBzZC0+Ymx1ZWJsYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGh1ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDAxLCBzZC0+aHVlKTsKK30KKworc3RhdGljIHZvaWQgc2V0YXV0b2dhaW5fNzcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+YXV0b2dhaW4pIHsKKwkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDEzLCAweGY3KTsgLyogQUdDLEFFQyxBV0IgT04gKi8KKwkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDY0LAorCQkJCXNjY2JfcmVnX3JlYWQoZ3NwY2FfZGV2LCAweDY0KSB8IDB4MDMpOworCX0gZWxzZSB7CisJCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgxMywgMHhmMCk7IC8qIEFHQyxBRUMsQVdCIE9GRiAqLworCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4NjQsCisJCQkJc2NjYl9yZWdfcmVhZChnc3BjYV9kZXYsIDB4NjQpICYgMHhmYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRhd2Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+YXdiKQorCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4NjMsIDB4ZTApOwkvKiBBV0Igb24gKi8KKwllbHNlCisJCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHg2MywgMHhhYSk7CS8qIEFXQiBvZmYgKi8KK30KKworc3RhdGljIHZvaWQgc2V0c2hhcnBuZXNzXzc3KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggdmFsOworCisJdmFsID0gc2QtPnNoYXJwbmVzczsKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4OTEsIHZhbCk7CS8qIHZnYSBub2lzZSAqLworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHg4ZSwgdmFsKTsJLyogcXZnYSBub2lzZSAqLworfQorCitzdGF0aWMgdm9pZCBzZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKHNkLT5oZmxpcCA9PSAwKQorCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MGMsCisJCQkJc2NjYl9yZWdfcmVhZChnc3BjYV9kZXYsIDB4MGMpIHwgMHg0MCk7CisJZWxzZQorCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MGMsCisJCQkJc2NjYl9yZWdfcmVhZChnc3BjYV9kZXYsIDB4MGMpICYgMHhiZik7Cit9CisKK3N0YXRpYyB2b2lkIHNldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAoc2QtPnZmbGlwID09IDApCisJCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgwYywKKwkJCQlzY2NiX3JlZ19yZWFkKGdzcGNhX2RldiwgMHgwYykgfCAweDgwKTsKKwllbHNlCisJCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgwYywKKwkJCQlzY2NiX3JlZ19yZWFkKGdzcGNhX2RldiwgMHgwYykgJiAweDdmKTsKK30KKworLyogb3Y5NjV4IHNwZWNpZmljIGNvbnRyb2xzICovCitzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzXzk2KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggdmFsOworCisJdmFsID0gc2QtPmJyaWdodG5lc3M7CisJaWYgKHZhbCA8IDgpCisJCXZhbCA9IDE1IC0gdmFsOwkJLyogZiAuLiA4ICovCisJZWxzZQorCQl2YWwgPSB2YWwgLSA4OwkJLyogMCAuLiA3ICovCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDU1LAkvKiBicnRuIC0gYnJpZ2h0bmVzcyBhZGp1c3RtZW50ICovCisJCQkweDBmIHwgKHZhbCA8PCA0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGNvbnRyYXN0Xzk2KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4NTYsCS8qIGNuc3QxIC0gY29udHJhc3QgMSBjdHJsIGNvZWZmICovCisJCQlzZC0+Y29udHJhc3QgPDwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGV4cG9zdXJlXzk2KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggdmFsOworCXN0YXRpYyBjb25zdCB1OCBleHBvWzRdID0gezB4MDAsIDB4MjUsIDB4MzgsIDB4NWV9OworCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDEwLAkJCS8qIGFlY1s5OjJdICovCisJCQlleHBvW3NkLT5leHBvc3VyZV0pOworCXZhbCA9IHNjY2JfcmVnX3JlYWQoZ3NwY2FfZGV2LCAweDEzKTsJCS8qIGNvbTggKi8KKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgxMywgdmFsKTsKKwl2YWwgPSBzY2NiX3JlZ19yZWFkKGdzcGNhX2RldiwgMHhhMSk7CQkvKiBhZWNoICovCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4YTEsIHZhbCAmIDB4ZTApOwkvKiBhZWNbMTU6MTBdID0gMCAqLworfQorCitzdGF0aWMgdm9pZCBzZXRzaGFycG5lc3NfOTYoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCB2YWw7CisKKwl2YWwgPSBzZC0+c2hhcnBuZXNzOworCWlmICh2YWwgPCAwKSB7CQkJCS8qIGF1dG8gKi8KKwkJdmFsID0gc2NjYl9yZWdfcmVhZChnc3BjYV9kZXYsIDB4NDIpOwkvKiBjb20xNyAqLworCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOworCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4NDIsIHZhbCB8IDB4NDApOworCQkJCS8qIEVkZ2UgZW5oYW5jZW1lbnQgc3RyZW5ndGggYXV0byBhZGp1c3QgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAodmFsICE9IDApCisJCXZhbCA9IDEgPDwgKHZhbCAtIDEpOworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgzZiwJLyogZWRnZSAtIGVkZ2UgZW5oYW5jZS4gZmFjdG9yICovCisJCQl2YWwpOworCXZhbCA9IHNjY2JfcmVnX3JlYWQoZ3NwY2FfZGV2LCAweDQyKTsJCS8qIGNvbTE3ICovCisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4NDIsIHZhbCAmIDB4YmYpOworfQorCitzdGF0aWMgdm9pZCBzZXRhdXRvZ2Fpbl85NihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IHZhbDsKKworLypmaXhtZTogc2hvdWxkIGFkanVzdCBhZ2MvYXdiL2FlYyBieSBkaWZmZXJlbnQgY29udHJvbHMgKi8KKwl2YWwgPSBzZC0+YXV0b2dhaW47CisJdmFsID0gc2NjYl9yZWdfcmVhZChnc3BjYV9kZXYsIDB4MTMpOwkJLyogY29tOCAqLworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CisJaWYgKHNkLT5hdXRvZ2FpbikKKwkJdmFsIHw9IDB4MDU7CQkvKiBhZ2MgJiBhZWMgKi8KKwllbHNlCisJCXZhbCAmPSAweGZhOworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHgxMywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgc2V0c2F0dXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCB2YWwxLCB2YWwyLCB2YWwzOworCXN0YXRpYyBjb25zdCB1OCBtYXRyaXhbNV1bMl0gPSB7CisJCXsweDE0LCAweDM4fSwKKwkJezB4MWUsIDB4NTR9LAorCQl7MHgyOCwgMHg3MH0sCisJCXsweDMyLCAweDhjfSwKKwkJezB4NDgsIDB4OTB9CisJfTsKKworCXZhbDEgPSBtYXRyaXhbc2QtPnNhdHVyXVswXTsKKwl2YWwyID0gbWF0cml4W3NkLT5zYXR1cl1bMV07CisJdmFsMyA9IHZhbDEgKyB2YWwyOworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHg0ZiwgdmFsMyk7CS8qIG1hdHJpeCBjb2VmZiAqLworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHg1MCwgdmFsMyk7CisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDUxLCAweDAwKTsKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4NTIsIHZhbDEpOworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHg1MywgdmFsMik7CisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDU0LCB2YWwzKTsKKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4NTgsIDB4MWEpOwkvKiBtdHhzIC0gY29lZmYgc2lnbnMgKi8KKwl2YWwxID0gc2NjYl9yZWdfcmVhZChnc3BjYV9kZXYsIDB4NDEpOwkvKiBjb20xNiAqLworCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDQxLCB2YWwxKTsKK30KKworc3RhdGljIHZvaWQgc2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IHZhbDsKKworCXZhbCA9IHNjY2JfcmVnX3JlYWQoZ3NwY2FfZGV2LCAweDEzKTsJCS8qIGNvbTggKi8KKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOworCWlmIChzZC0+bGlnaHRmcmVxID09IDApIHsKKwkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDEzLCB2YWwgJiAweGRmKTsKKwkJcmV0dXJuOworCX0KKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MTMsIHZhbCB8IDB4MjApOworCisJdmFsID0gc2NjYl9yZWdfcmVhZChnc3BjYV9kZXYsIDB4NDIpOwkJLyogY29tMTcgKi8KKwlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOworCWlmIChzZC0+bGlnaHRmcmVxID09IDEpCisJCXZhbCB8PSAweDAxOworCWVsc2UKKwkJdmFsICY9IDB4ZmU7CisJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDQyLCB2YWwpOwogfQogCiAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSB0aW1lICovCkBAIC04MDAsMTcgKzE2MjksNjAgQEAKIAljYW0gPSAmZ3NwY2FfZGV2LT5jYW07CiAKIAlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfT1Y3NzJYKSB7Ci0JCWNhbS0+Y2FtX21vZGUgPSB2Z2FfeXV5dl9tb2RlOwotCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUodmdhX3l1eXZfbW9kZSk7CisJCWNhbS0+Y2FtX21vZGUgPSBvdjc3MnhfbW9kZTsKKwkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKG92NzcyeF9tb2RlKTsKIAogCQljYW0tPmJ1bGsgPSAxOwogCQljYW0tPmJ1bGtfc2l6ZSA9IDE2Mzg0OwogCQljYW0tPmJ1bGtfbnVyYnMgPSAyOwogCX0gZWxzZSB7CQkvKiBvdjk2NXggKi8KLQkJY2FtLT5jYW1fbW9kZSA9IHZnYV9qcGVnX21vZGU7Ci0JCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRSh2Z2FfanBlZ19tb2RlKTsKKwkJY2FtLT5jYW1fbW9kZSA9IG92OTY1eF9tb2RlOworCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUob3Y5NjV4X21vZGUpOwogCX0KIAorCXNkLT5mcmFtZV9yYXRlID0gMzA7CisKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfT1Y3NzJYKSB7CisJCXNkLT5icmlnaHRuZXNzID0gQlJJR0hUTkVTU183N19ERUY7CisJCXNkLT5jb250cmFzdCA9IENPTlRSQVNUXzc3X0RFRjsKKwkJc2QtPmdhaW4gPSBHQUlOX0RFRjsKKwkJc2QtPmV4cG9zdXJlID0gRVhQT183N19ERUY7CisJCXNkLT5yZWRibGMgPSBSRURfQkFMQU5DRV9ERUY7CisJCXNkLT5ibHVlYmxjID0gQkxVRV9CQUxBTkNFX0RFRjsKKwkJc2QtPmh1ZSA9IEhVRV9ERUY7CisjaWYgQVVUT0dBSU5fNzdfREVGICE9IDAKKwkJc2QtPmF1dG9nYWluID0gQVVUT0dBSU5fNzdfREVGOworI2Vsc2UKKwkJZ3NwY2FfZGV2LT5jdHJsX2luYWMgfD0gKDEgPDwgQVdCXzc3X0lEWCk7CisjZW5kaWYKKyNpZiBBV0JfREVGICE9IDAKKwkJc2QtPmF3YiA9IEFXQl9ERUYKKyNlbmRpZgorI2lmIFNIQVJQTkVTU183N19ERUYgIT0gMAorCQlzZC0+c2hhcnBuZXNzID0gU0hBUlBORVNTXzc3X0RFRjsKKyNlbmRpZgorI2lmIEhGTElQX0RFRiAhPSAwCisJCXNkLT5oZmxpcCA9IEhGTElQX0RFRjsKKyNlbmRpZgorI2lmIFZGTElQX0RFRiAhPSAwCisJCXNkLT52ZmxpcCA9IFZGTElQX0RFRjsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXNkLT5icmlnaHRuZXNzID0gQlJJR0hUTkVTU185Nl9ERUY7CisJCXNkLT5jb250cmFzdCA9IENPTlRSQVNUXzk2X0RFRjsKKyNpZiBBVVRPR0FJTl85Nl9ERUYgIT0gMAorCQlzZC0+YXV0b2dhaW4gPSBBVVRPR0FJTl85Nl9ERUY7CisJCWdzcGNhX2Rldi0+Y3RybF9pbmFjIHw9ICgxIDw8IEVYUE9fOTZfSURYKTsKKyNlbmRpZgorI2lmIEVYUE9fOTZfREVGICE9IDAKKwkJc2QtPmV4cG9zdXJlID0gRVhQT185Nl9ERUY7CisjZW5kaWYKKyNpZiBTSEFSUE5FU1NfOTZfREVGICE9IDAKKwkJc2QtPnNoYXJwbmVzcyA9IFNIQVJQTkVTU185Nl9ERUY7CisjZW5kaWYKKwkJc2QtPnNhdHVyID0gU0FUVVJfREVGOworCQlzZC0+bGlnaHRmcmVxID0gRlJFUV9ERUY7CisJfQogCXJldHVybiAwOwogfQogCkBAIC04NDcsMTQgKzE3MTksMTQgQEAKIAkvKiBpbml0aWFsaXplICovCiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5TT1JfT1Y3NzJYOgotCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9pbml0X292NzIyeCwKLQkJCQlBUlJBWV9TSVpFKGJyaWRnZV9pbml0X292NzIyeCkpOworCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9pbml0X292NzcyeCwKKwkJCQlBUlJBWV9TSVpFKGJyaWRnZV9pbml0X292NzcyeCkpOwogCQlvdjUzNF9zZXRfbGVkKGdzcGNhX2RldiwgMSk7Ci0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9pbml0X292NzIyeCwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9pbml0X292NzIyeCkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdF9vdjc3MngsCisJCQkJQVJSQVlfU0laRShzZW5zb3JfaW5pdF9vdjc3MngpKTsKIAkJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlMCwgMHgwOSk7CiAJCW92NTM0X3NldF9sZWQoZ3NwY2FfZGV2LCAwKTsKLQkJb3Y1MzRfc2V0X2ZyYW1lX3JhdGUoZ3NwY2FfZGV2KTsKKwkJc2V0X2ZyYW1lX3JhdGUoZ3NwY2FfZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIC8qCWNhc2UgU0VOU09SX09WOTY1WDogKi8KQEAgLTg3NSw2MCArMTc0NywxMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNkX3N0YXJ0X292NzcyeChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCWludCBtb2RlOwogCi0Jc3dpdGNoIChzZC0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5TT1JfT1Y3NzJYOgotCQlvdjUzNF9zZXRfbGVkKGdzcGNhX2RldiwgMSk7Ci0JCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTAsIDB4MDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotLyoJY2FzZSBTRU5TT1JfT1Y5NjVYOiAqLwotCi0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXgsCi0JCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfb3Y5NjV4KSk7Ci0JCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X292OTY1eCwKLQkJCQlBUlJBWV9TSVpFKGJyaWRnZV9zdGFydF9vdjk2NXgpKTsKLQkJbW9kZSA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwotCQlpZiAobW9kZSAhPSAwKSB7CS8qIDMyMHgyNDAgKi8KLQkJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X292OTY1eF9jaWYsCi0JCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X292OTY1eF9jaWYpKTsKLQkJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfY2lmLAotCQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF9vdjk2NXhfY2lmKSk7Ci0JCX0gZWxzZSB7CQkvKiA2NDB4NDgwICovCi0JCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9zdGFydF9vdjk2NXhfdmdhLAotCQkJCQlBUlJBWV9TSVpFKGJyaWRnZV9zdGFydF9vdjk2NXhfdmdhKSk7Ci0JCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfb3Y5NjV4X3ZnYSwKLQkJCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfb3Y5NjV4X3ZnYSkpOwotCQl9Ci0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfMiwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF9vdjk2NXhfMikpOwotCQlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGUwLCAweDAwKTsKLQkJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlMCwgMHgwMCk7Ci0JCW92NTM0X3NldF9sZWQoZ3NwY2FfZGV2LCAxKTsKKwltb2RlID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXY7CisJaWYgKG1vZGUgIT0gMCkgewkvKiAzMjB4MjQwICovCisJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X292NzcyeF9xdmdhLAorCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X292NzcyeF9xdmdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjc3MnhfcXZnYSwKKwkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF9vdjc3MnhfcXZnYSkpOworCX0gZWxzZSB7CQkvKiA2NDB4NDgwICovCisJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X292NzcyeF92Z2EsCisJCQkJQVJSQVlfU0laRShicmlkZ2Vfc3RhcnRfb3Y3NzJ4X3ZnYSkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfb3Y3NzJ4X3ZnYSwKKwkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF9vdjc3MnhfdmdhKSk7CiAJfQorCXNldF9mcmFtZV9yYXRlKGdzcGNhX2Rldik7CisKKwlzZXRhdXRvZ2Fpbl83Nyhnc3BjYV9kZXYpOworCXNldGF3Yihnc3BjYV9kZXYpOworCXNldGdhaW4oZ3NwY2FfZGV2KTsKKwlzZXRyZWRibGMoZ3NwY2FfZGV2KTsKKwlzZXRibHVlYmxjKGdzcGNhX2Rldik7CisJc2V0aHVlKGdzcGNhX2Rldik7CisJc2V0ZXhwb3N1cmVfNzcoZ3NwY2FfZGV2KTsKKwlzZXRicmlnaHRuZXNzXzc3KGdzcGNhX2Rldik7CisJc2V0Y29udHJhc3RfNzcoZ3NwY2FfZGV2KTsKKwlzZXRzaGFycG5lc3NfNzcoZ3NwY2FfZGV2KTsKKwlzZXR2ZmxpcChnc3BjYV9kZXYpOworCXNldGhmbGlwKGdzcGNhX2Rldik7CisKKwlvdjUzNF9zZXRfbGVkKGdzcGNhX2RldiwgMSk7CisJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlMCwgMHgwMCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnRfb3Y5NjV4KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IG1vZGU7CiAKLQlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKLQljYXNlIFNFTlNPUl9PVjc3Mlg6Ci0JCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTAsIDB4MDkpOwotCQlvdjUzNF9zZXRfbGVkKGdzcGNhX2RldiwgMCk7Ci0JCWJyZWFrOworCW1vZGUgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVtnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdjsKKwlzd2l0Y2ggKG1vZGUpIHsKIAlkZWZhdWx0OgotLyoJY2FzZSBTRU5TT1JfT1Y5NjVYOiAqLwotCQlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGUwLCAweDAxKTsKLQkJb3Y1MzRfc2V0X2xlZChnc3BjYV9kZXYsIDApOwotCQlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGUwLCAweDAwKTsKKy8qCWNhc2UgNDoJCQkgKiAzMjB4MjQwICovCisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfMV92Z2EsCisJCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfb3Y5NjV4XzFfdmdhKSk7CisJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X292OTY1eF9xdmdhLAorCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X292OTY1eF9xdmdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfMl9xdmdhLAorCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0X292OTY1eF8yX3F2Z2EpKTsKKwkJYnJlYWs7CisJY2FzZSAzOgkJCS8qIDY0MHg0ODAgKi8KKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0X292OTY1eF8xX3ZnYSwKKwkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF9vdjk2NXhfMV92Z2EpKTsKKwkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2Vfc3RhcnRfb3Y5NjV4X3ZnYSwKKwkJCQlBUlJBWV9TSVpFKGJyaWRnZV9zdGFydF9vdjk2NXhfdmdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfMl92Z2EsCisJCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfb3Y5NjV4XzJfdmdhKSk7CisJCWJyZWFrOworCWNhc2UgMjoJCQkvKiA4MDB4NjAwICovCisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfMV9zdmdhLAorCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0X292OTY1eF8xX3N2Z2EpKTsKKwkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2Vfc3RhcnRfb3Y5NjV4X3N2Z2EsCisJCQkJQVJSQVlfU0laRShicmlkZ2Vfc3RhcnRfb3Y5NjV4X3N2Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0X292OTY1eF8yX3N2Z2EsCisJCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfb3Y5NjV4XzJfc3ZnYSkpOworCQlicmVhazsKKwljYXNlIDE6CQkJLyogMTAyNHg3NjggKi8KKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0X292OTY1eF8xX3hnYSwKKwkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF9vdjk2NXhfMV94Z2EpKTsKKwkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2Vfc3RhcnRfb3Y5NjV4X3hnYSwKKwkJCQlBUlJBWV9TSVpFKGJyaWRnZV9zdGFydF9vdjk2NXhfeGdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfMl9zdmdhLAorCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0X292OTY1eF8yX3N2Z2EpKTsKKwkJYnJlYWs7CisJY2FzZSAwOgkJCS8qIDEyODB4MTAyNCAqLworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfb3Y5NjV4XzFfc3hnYSwKKwkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF9vdjk2NXhfMV9zeGdhKSk7CisJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X292OTY1eF9zeGdhLAorCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X292OTY1eF9zeGdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF9vdjk2NXhfMl9zeGdhLAorCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0X292OTY1eF8yX3N4Z2EpKTsKIAkJYnJlYWs7CiAJfQorCXNldGZyZXEoZ3NwY2FfZGV2KTsKKwlzZXRhdXRvZ2Fpbl85Nihnc3BjYV9kZXYpOworCXNldGJyaWdodG5lc3NfOTYoZ3NwY2FfZGV2KTsKKwlzZXRjb250cmFzdF85Nihnc3BjYV9kZXYpOworCXNldGV4cG9zdXJlXzk2KGdzcGNhX2Rldik7CisJc2V0c2hhcnBuZXNzXzk2KGdzcGNhX2Rldik7CisJc2V0c2F0dXIoZ3NwY2FfZGV2KTsKKworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTAsIDB4MDApOworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTAsIDB4MDApOworCW92NTM0X3NldF9sZWQoZ3NwY2FfZGV2LCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2Rfc3RvcE5fb3Y3NzJ4KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGUwLCAweDA5KTsKKwlvdjUzNF9zZXRfbGVkKGdzcGNhX2RldiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3N0b3BOX292OTY1eChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlMCwgMHgwMSk7CisJb3Y1MzRfc2V0X2xlZChnc3BjYV9kZXYsIDApOworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTAsIDB4MDApOwogfQogCiAvKiBWYWx1ZXMgZm9yIGJtSGVhZGVySW5mbyAoVmlkZW8gYW5kIFN0aWxsIEltYWdlIFBheWxvYWQgSGVhZGVycywgMi40LjMuMykgKi8KQEAgLTk0MSw4ICsxODY4LDggQEAKICNkZWZpbmUgVVZDX1NUUkVBTV9FT0YJKDEgPDwgMSkKICNkZWZpbmUgVVZDX1NUUkVBTV9GSUQJKDEgPDwgMCkKIAotc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAotCQkJX191OCAqZGF0YSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXU4ICpkYXRhLCBpbnQgbGVuKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlfX3UzMiB0aGlzX3B0czsKQEAgLTk4MywzMiArMTkxMCwzMCBAQAogCQkvKiBJZiBQVFMgb3IgRklEIGhhcyBjaGFuZ2VkLCBzdGFydCBhIG5ldyBmcmFtZS4gKi8KIAkJaWYgKHRoaXNfcHRzICE9IHNkLT5sYXN0X3B0cyB8fCB0aGlzX2ZpZCAhPSBzZC0+bGFzdF9maWQpIHsKIAkJCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPT0gSU5URVJfUEFDS0VUKQotCQkJCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwKLQkJCQkJCQlMQVNUX1BBQ0tFVCwgZnJhbWUsCi0JCQkJCQkJTlVMTCwgMCk7CisJCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCQlOVUxMLCAwKTsKIAkJCXNkLT5sYXN0X3B0cyA9IHRoaXNfcHRzOwogCQkJc2QtPmxhc3RfZmlkID0gdGhpc19maWQ7Ci0JCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLAorCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAogCQkJCQlkYXRhICsgMTIsIGxlbiAtIDEyKTsKIAkJLyogSWYgdGhpcyBwYWNrZXQgaXMgbWFya2VkIGFzIEVPRiwgZW5kIHRoZSBmcmFtZSAqLwogCQl9IGVsc2UgaWYgKGRhdGFbMV0gJiBVVkNfU1RSRUFNX0VPRikgewogCQkJc2QtPmxhc3RfcHRzID0gMDsKLQkJCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLAotCQkJCQkJZGF0YSArIDEyLCBsZW4gLSAxMik7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKKwkJCQkJZGF0YSArIDEyLCBsZW4gLSAxMik7CiAJCX0gZWxzZSB7CiAKIAkJCS8qIEFkZCB0aGUgZGF0YSBmcm9tIHRoaXMgcGF5bG9hZCAqLwotCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBmcmFtZSwKLQkJCQkJCWRhdGEgKyAxMiwgbGVuIC0gMTIpOworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQkJCQlkYXRhICsgMTIsIGxlbiAtIDEyKTsKIAkJfQogCi0KIAkJLyogRG9uZSB0aGlzIHBheWxvYWQgKi8KIAkJZ290byBzY2FuX25leHQ7CiAKIGRpc2NhcmQ6CiAJCS8qIERpc2NhcmQgZGF0YSB1bnRpbCBhIG5ldyBmcmFtZSBzdGFydHMuICovCi0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIERJU0NBUkRfUEFDS0VULCBmcmFtZSwgTlVMTCwgMCk7CisJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCiBzY2FuX25leHQ6CiAJCXJlbWFpbmluZ19sZW4gLT0gbGVuOwpAQCAtMTAxNiw2ICsxOTQxLDI5MSBAQAogCX0gd2hpbGUgKHJlbWFpbmluZ19sZW4gPiAwKTsKIH0KIAorLyogY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgc2Rfc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+Z2FpbiA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGdhaW4oZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPmdhaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmV4cG9zdXJlID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykgeworCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfT1Y3NzJYKQorCQkJc2V0ZXhwb3N1cmVfNzcoZ3NwY2FfZGV2KTsKKwkJZWxzZQorCQkJc2V0ZXhwb3N1cmVfOTYoZ3NwY2FfZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+ZXhwb3N1cmU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+YnJpZ2h0bmVzcyA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpIHsKKwkJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX09WNzcyWCkKKwkJCXNldGJyaWdodG5lc3NfNzcoZ3NwY2FfZGV2KTsKKwkJZWxzZQorCQkJc2V0YnJpZ2h0bmVzc185Nihnc3BjYV9kZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPmJyaWdodG5lc3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmNvbnRyYXN0ID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykgeworCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfT1Y3NzJYKQorCQkJc2V0Y29udHJhc3RfNzcoZ3NwY2FfZGV2KTsKKwkJZWxzZQorCQkJc2V0Y29udHJhc3RfOTYoZ3NwY2FfZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Y29udHJhc3Q7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0c2F0dXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPnNhdHVyID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0c2F0dXIoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRzYXR1cihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5zYXR1cjsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgc2Rfc2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+bGlnaHRmcmVxID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0ZnJlcShnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+bGlnaHRmcmVxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldHJlZGJsYyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+cmVkYmxjID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0cmVkYmxjKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0cmVkYmxjKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPnJlZGJsYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRibHVlYmxjKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5ibHVlYmxjID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0Ymx1ZWJsYyhnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldGJsdWVibGMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Ymx1ZWJsYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRodWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmh1ZSA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGh1ZShnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldGh1ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5odWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmF1dG9nYWluID0gdmFsOworCisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKSB7CisJCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9PVjc3MlgpIHsKKworCQkJLyogdGhlIGF1dG8gd2hpdGUgYmFsYW5jZSBjb250cm9sIHdvcmtzIG9ubHkKKwkJCSAqIHdoZW4gYXV0byBnYWluIGlzIHNldCAqLworCQkJaWYgKHZhbCkKKwkJCQlnc3BjYV9kZXYtPmN0cmxfaW5hYyAmPSB+KDEgPDwgQVdCXzc3X0lEWCk7CisJCQllbHNlCisJCQkJZ3NwY2FfZGV2LT5jdHJsX2luYWMgfD0gKDEgPDwgQVdCXzc3X0lEWCk7CisJCQlzZXRhdXRvZ2Fpbl83Nyhnc3BjYV9kZXYpOworCQl9IGVsc2UgeworCQkJaWYgKHZhbCkKKwkJCQlnc3BjYV9kZXYtPmN0cmxfaW5hYyB8PSAoMSA8PCBFWFBPXzk2X0lEWCk7CisJCQllbHNlCisJCQkJZ3NwY2FfZGV2LT5jdHJsX2luYWMgJj0gfigxIDw8IEVYUE9fOTZfSURYKTsKKwkJCXNldGF1dG9nYWluXzk2KGdzcGNhX2Rldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+YXV0b2dhaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0YXdiKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5hd2IgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRhd2IoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRhd2Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+YXdiOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+c2hhcnBuZXNzID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykgeworCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfT1Y3NzJYKQorCQkJc2V0c2hhcnBuZXNzXzc3KGdzcGNhX2Rldik7CisJCWVsc2UKKwkJCXNldHNoYXJwbmVzc185Nihnc3BjYV9kZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+c2hhcnBuZXNzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldGhmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5oZmxpcCA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGhmbGlwKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+aGZsaXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPnZmbGlwID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0dmZsaXAoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXR2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT52ZmxpcDsKKwlyZXR1cm4gMDsKK30KKwogLyogZ2V0IHN0cmVhbSBwYXJhbWV0ZXJzIChmcmFtZXJhdGUpICovCiBzdGF0aWMgaW50IHNkX2dldF9zdHJlYW1wYXJtKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCSAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKQEAgLTEwNDcsNyArMjI1Nyw4IEBACiAKIAkvKiBTZXQgcmVxdWVzdGVkIGZyYW1lcmF0ZSAqLwogCXNkLT5mcmFtZV9yYXRlID0gdHBmLT5kZW5vbWluYXRvciAvIHRwZi0+bnVtZXJhdG9yOwotCW92NTM0X3NldF9mcmFtZV9yYXRlKGdzcGNhX2Rldik7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nICYmIHNkLT5zZW5zb3IgPT0gU0VOU09SX09WNzcyWCkKKwkJc2V0X2ZyYW1lX3JhdGUoZ3NwY2FfZGV2KTsKIAogCS8qIFJldHVybiB0aGUgYWN0dWFsIGZyYW1lcmF0ZSAqLwogCXRwZi0+bnVtZXJhdG9yID0gMTsKQEAgLTEwNTYsMjAgKzIyNjcsNTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzZF9xdWVyeW1lbnUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICptZW51KQoreworCXN3aXRjaCAobWVudS0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZOgorCQlzd2l0Y2ggKG1lbnUtPmluZGV4KSB7CisJCWNhc2UgMDoJCS8qIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0RJU0FCTEVEICovCisJCQlzdHJjcHkoKGNoYXIgKikgbWVudS0+bmFtZSwgIk5vRmxpa2VyIik7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAxOgkJLyogVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNTBIWiAqLworCQkJc3RyY3B5KChjaGFyICopIG1lbnUtPm5hbWUsICI1MCBIeiIpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgMjoJCS8qIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFogKi8KKwkJCXN0cmNweSgoY2hhciAqKSBtZW51LT5uYW1lLCAiNjAgSHoiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2MgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzY19vdjc3MnggPSB7CiAJLm5hbWUgICAgID0gTU9EVUxFX05BTUUsCi0JLmN0cmxzICAgID0gc2RfY3RybHMsCi0JLm5jdHJscyAgID0gQVJSQVlfU0laRShzZF9jdHJscyksCisJLmN0cmxzICAgID0gc2RfY3RybHNfb3Y3NzJ4LAorCS5uY3RybHMgICA9IEFSUkFZX1NJWkUoc2RfY3RybHNfb3Y3NzJ4KSwKIAkuY29uZmlnICAgPSBzZF9jb25maWcsCiAJLmluaXQgICAgID0gc2RfaW5pdCwKLQkuc3RhcnQgICAgPSBzZF9zdGFydCwKLQkuc3RvcE4gICAgPSBzZF9zdG9wTiwKKwkuc3RhcnQgICAgPSBzZF9zdGFydF9vdjc3MngsCisJLnN0b3BOICAgID0gc2Rfc3RvcE5fb3Y3NzJ4LAogCS5wa3Rfc2NhbiA9IHNkX3BrdF9zY2FuLAogCS5nZXRfc3RyZWFtcGFybSA9IHNkX2dldF9zdHJlYW1wYXJtLAogCS5zZXRfc3RyZWFtcGFybSA9IHNkX3NldF9zdHJlYW1wYXJtLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2Nfb3Y5NjV4ID0geworCS5uYW1lICAgICA9IE1PRFVMRV9OQU1FLAorCS5jdHJscyAgICA9IHNkX2N0cmxzX292OTY1eCwKKwkubmN0cmxzICAgPSBBUlJBWV9TSVpFKHNkX2N0cmxzX292OTY1eCksCisJLmNvbmZpZyAgID0gc2RfY29uZmlnLAorCS5pbml0ICAgICA9IHNkX2luaXQsCisJLnN0YXJ0ICAgID0gc2Rfc3RhcnRfb3Y5NjV4LAorCS5zdG9wTiAgICA9IHNkX3N0b3BOX292OTY1eCwKKwkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKKwkucXVlcnltZW51ID0gc2RfcXVlcnltZW51LAorfTsKKwogLyogLS0gbW9kdWxlIGluaXRpYWxpc2F0aW9uIC0tICovCiBzdGF0aWMgY29uc3QgX19kZXZpbml0ZGF0YSBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKIAl7VVNCX0RFVklDRSgweDA2ZjgsIDB4MzAwMyksIC5kcml2ZXJfaW5mbyA9IFNFTlNPUl9PVjk2NVh9LApAQCAtMTA4Miw4ICsyMzI2LDEyIEBACiAvKiAtLSBkZXZpY2UgY29ubmVjdCAtLSAqLwogc3RhdGljIGludCBzZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBnc3BjYV9kZXZfcHJvYmUoaW50ZiwgaWQsICZzZF9kZXNjLCBzaXplb2Yoc3RydWN0IHNkKSwKLQkJCSAgICAgICBUSElTX01PRFVMRSk7CisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZShpbnRmLCBpZCwKKwkJCQlpZC0+ZHJpdmVyX2luZm8gPT0gU0VOU09SX09WNzcyWAorCQkJCQk/ICZzZF9kZXNjX292NzcyeAorCQkJCQk6ICZzZF9kZXNjX292OTY1eCwKKwkJCQlzaXplb2Yoc3RydWN0IHNkKSwKKwkJCQlUSElTX01PRFVMRSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CkBAIC0xMTAxLDYgKzIzNDksNyBAQAogc3RhdGljIGludCBfX2luaXQgc2RfbW9kX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OworCiAJcmV0ID0gdXNiX3JlZ2lzdGVyKCZzZF9kcml2ZXIpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjMjA3LmMKaW5kZXggOTY2NTk0My4uNDcwNmE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzIwNy5jCkBAIC0zMzcsMTQgKzMzNywxMyBAQAogfQogCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAotCQkJX191OCAqZGF0YSwKKwkJCXU4ICpkYXRhLAogCQkJaW50IGxlbikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJdW5zaWduZWQgY2hhciAqc29mOwogCi0Jc29mID0gcGFjX2ZpbmRfc29mKGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKKwlzb2YgPSBwYWNfZmluZF9zb2YoJnNkLT5zb2ZfcmVhZCwgZGF0YSwgbGVuKTsKIAlpZiAoc29mKSB7CiAJCWludCBuOwogCkBAIC0zNTQsMTAgKzM1MywxMCBAQAogCQkJbiAtPSBzaXplb2YgcGFjX3NvZl9tYXJrZXI7CiAJCWVsc2UKIAkJCW4gPSAwOwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKLQkJCQkJZGF0YSwgbik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAorCQkJCWRhdGEsIG4pOwogCQlzZC0+aGVhZGVyX3JlYWQgPSAwOwotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLCBOVUxMLCAwKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBOVUxMLCAwKTsKIAkJbGVuIC09IHNvZiAtIGRhdGE7CiAJCWRhdGEgPSBzb2Y7CiAJfQpAQCAtMzgxLDcgKzM4MCw3IEBACiAJCXNkLT5oZWFkZXJfcmVhZCA9IDExOwogCX0KIAotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogfQogCiBzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMwMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhY2NlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMwMi5jCkBAIC0wLDAgKzEsMTI3MiBAQAorLyoKKyAqCQlQaXhhcnQgUEFDNzMwMiBsaWJyYXJ5CisgKgkJQ29weXJpZ2h0IChDKSAyMDA1IFRob21hcyBLYWlzZXIgdGhvbWFzQGthaXNlci1saW51eC5saQorICoKKyAqIFY0TDIgYnkgSmVhbi1GcmFuY29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4KKyAqCisgKiBTZXBhcmF0ZWQgZnJvbSBQaXhhcnQgUEFDNzMxMSBsaWJyYXJ5IGJ5IE3hcnRvbiBO6W1ldGggPG5tMTI3QGZyZWVtYWlsLmh1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogU29tZSBkb2N1bWVudGF0aW9uIGFib3V0IHZhcmlvdXMgcmVnaXN0ZXJzIGFzIGRldGVybWluZWQgYnkgdHJpYWwgYW5kIGVycm9yLgorICAgV2hlbiB0aGUgcmVnaXN0ZXIgYWRkcmVzc2VzIGRpZmZlciBiZXR3ZWVuIHRoZSA3MjAyIGFuZCB0aGUgNzMxMSB0aGUgMgorICAgZGlmZmVyZW50IGFkZHJlc3NlcyBhcmUgd3JpdHRlbiBhcyA3MzAyYWRkci83MzExYWRkciwgd2hlbiBvbmUgb2YgdGhlIDIKKyAgIGFkZHJlc3NlcyBpcyBhIC0gc2lnbiB0aGF0IHJlZ2lzdGVyIGRlc2NyaXB0aW9uIGlzIG5vdCB2YWxpZCBmb3IgdGhlCisgICBtYXRjaGluZyBJQy4KKworICAgUmVnaXN0ZXIgcGFnZSAxOgorCisgICBBZGRyZXNzCURlc2NyaXB0aW9uCisgICAtLzB4MDgJVW5rbm93biBjb21wcmVzc29yIHJlbGF0ZWQsIG11c3QgYWx3YXlzIGJlIDggZXhjZXB0IHdoZW4gbm90CisJCWluIDY0MHg0ODAgcmVzb2x1dGlvbiBhbmQgcGFnZSA0IHJlZyAyIDw9IDMgdGhlbiBzZXQgaXQgdG8gOSAhCisgICAtLzB4MWIJQXV0byB3aGl0ZSBiYWxhbmNlIHJlbGF0ZWQsIGJpdCAwIGlzIEFXQiBlbmFibGUgKGludmVydGVkKQorCQliaXRzIDM0NSBzZWVtIHRvIHRvZ2dsZSBwZXIgY29sb3IgZ2FpbnMgb24vb2ZmIChpbnZlcnRlZCkKKyAgIDB4NzgJCUdsb2JhbCBjb250cm9sLCBiaXQgNiBjb250cm9scyB0aGUgTEVEIChpbnZlcnRlZCkKKyAgIC0vMHg4MAlKUEVHIGNvbXByZXNzaW9uIHJhdGlvID8gQmVzdCBub3QgdG91Y2hlZAorCisgICBSZWdpc3RlciBwYWdlIDMvNDoKKworICAgQWRkcmVzcwlEZXNjcmlwdGlvbgorICAgMHgwMgkJQ2xvY2sgZGl2aWRlciAyLTYzLCBmcHMgPX4gNjAgLyB2YWwuIE11c3QgYmUgYSBtdWx0aXBsZSBvZiAzIG9uCisJCXRoZSA3MzAyLCBzbyBvbmUgb2YgMywgNiwgOSwgLi4uLCBleGNlcHQgd2hlbiBiZXR3ZWVuIDYgYW5kIDEyPworICAgLS8weDBmCU1hc3RlciBnYWluIDEtMjQ1LCBsb3cgdmFsdWUgPSBoaWdoIGdhaW4KKyAgIDB4MTAvLQlNYXN0ZXIgZ2FpbiAwLTMxCisgICAtLzB4MTAJQW5vdGhlciBnYWluIDAtMTUsIGxpbWl0ZWQgaW5mbHVlbmNlICgxLTJ4IGdhaW4gSSBndWVzcykKKyAgIDB4MjEJCUJpdGZpZWxkOiAwLTEgdW51c2VkLCAyLTMgdmZsaXAvaGZsaXAsIDQtNSB1bmtub3duLCA2LTcgdW51c2VkCisgICAtLzB4MjcJU2VlbXMgdG8gdG9nZ2xlIHZhcmlvdXMgZ2FpbnMgb24gLyBvZmYsIFNldHRpbmcgYml0IDcgc2VlbXMgdG8KKwkJY29tcGxldGVseSBkaXNhYmxlIHRoZSBhbmFsb2cgYW1wbGlmaWNhdGlvbiBibG9jay4gU2V0IHRvIDB4NjgKKwkJZm9yIG1heCBnYWluLCAweDE0IGZvciBtaW5pbWFsIGdhaW4uCisKKyAgIFRoZSByZWdpc3RlcnMgYXJlIGFjY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorCisgICBQYWdlIHwgUmVnaXN0ZXIgICB8IEZ1bmN0aW9uCisgICAtLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMCAgIHwgMHgwZi4uMHgyMCB8IHNldGNvbG9ycygpCisgICAgMCAgIHwgMHhhMi4uMHhhYiB8IHNldGJyaWdodGNvbnQoKQorICAgIDAgICB8IDB4YzUgICAgICAgfCBzZXRyZWRiYWxhbmNlKCkKKyAgICAwICAgfCAweGM2ICAgICAgIHwgc2V0d2hpdGViYWxhbmNlKCkKKyAgICAwICAgfCAweGM3ICAgICAgIHwgc2V0Ymx1ZWJhbGFuY2UoKQorICAgIDAgICB8IDB4ZGMgICAgICAgfCBzZXRicmlnaHRjb250KCksIHNldGNvbG9ycygpCisgICAgMyAgIHwgMHgwMiAgICAgICB8IHNldGV4cG9zdXJlKCkKKyAgICAzICAgfCAweDEwICAgICAgIHwgc2V0Z2FpbigpCisgICAgMyAgIHwgMHgxMSAgICAgICB8IHNldGNvbG9ycygpLCBzZXRnYWluKCksIHNldGV4cG9zdXJlKCksIHNldGh2ZmxpcCgpCisgICAgMyAgIHwgMHgyMSAgICAgICB8IHNldGh2ZmxpcCgpCisqLworCisjZGVmaW5lIE1PRFVMRV9OQU1FICJwYWM3MzAyIgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSAiZ3NwY2EuaCIKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIEthaXNlciB0aG9tYXNAa2Fpc2VyLWxpbnV4LmxpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBpeGFydCBQQUM3MzAyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIHNwZWNpZmljIHdlYmNhbSBkZXNjcmlwdG9yIGZvciBwYWM3MzAyICovCitzdHJ1Y3Qgc2QgeworCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OwkJLyogISEgbXVzdCBiZSB0aGUgZmlyc3QgaXRlbSAqLworCisJdW5zaWduZWQgY2hhciBicmlnaHRuZXNzOworCXVuc2lnbmVkIGNoYXIgY29udHJhc3Q7CisJdW5zaWduZWQgY2hhciBjb2xvcnM7CisJdW5zaWduZWQgY2hhciB3aGl0ZV9iYWxhbmNlOworCXVuc2lnbmVkIGNoYXIgcmVkX2JhbGFuY2U7CisJdW5zaWduZWQgY2hhciBibHVlX2JhbGFuY2U7CisJdW5zaWduZWQgY2hhciBnYWluOworCXVuc2lnbmVkIGNoYXIgZXhwb3N1cmU7CisJdW5zaWduZWQgY2hhciBhdXRvZ2FpbjsKKwlfX3U4IGhmbGlwOworCV9fdTggdmZsaXA7CisKKwl1OCBzb2ZfcmVhZDsKKwl1OCBhdXRvZ2Fpbl9pZ25vcmVfZnJhbWVzOworCisJYXRvbWljX3QgYXZnX2x1bTsKK307CisKKy8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRjb2xvcnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRjb2xvcnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0d2hpdGViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0d2hpdGViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldHJlZGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRyZWRiYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGJsdWViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0Ymx1ZWJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGhmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworCitzdGF0aWMgc3RydWN0IGN0cmwgc2RfY3RybHNbXSA9IHsKKy8qIFRoaXMgY29udHJvbCBpcyBwYWM3MzAyIG9ubHkgKi8KKwl7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIkJyaWdodG5lc3MiLAorCQkubWluaW11bSA9IDAsCisjZGVmaW5lIEJSSUdIVE5FU1NfTUFYIDB4MjAKKwkJLm1heGltdW0gPSBCUklHSFRORVNTX01BWCwKKwkJLnN0ZXAgICAgPSAxLAorI2RlZmluZSBCUklHSFRORVNTX0RFRiAweDEwCisJCS5kZWZhdWx0X3ZhbHVlID0gQlJJR0hUTkVTU19ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRicmlnaHRuZXNzLAorCSAgICAuZ2V0ID0gc2RfZ2V0YnJpZ2h0bmVzcywKKwl9LAorLyogVGhpcyBjb250cm9sIGlzIGZvciBib3RoIHRoZSA3MzAyIGFuZCB0aGUgNzMxMSAqLworCXsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIkNvbnRyYXN0IiwKKwkJLm1pbmltdW0gPSAwLAorI2RlZmluZSBDT05UUkFTVF9NQVggMjU1CisJCS5tYXhpbXVtID0gQ09OVFJBU1RfTUFYLAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIENPTlRSQVNUX0RFRiAxMjcKKwkJLmRlZmF1bHRfdmFsdWUgPSBDT05UUkFTVF9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRjb250cmFzdCwKKwkgICAgLmdldCA9IHNkX2dldGNvbnRyYXN0LAorCX0sCisvKiBUaGlzIGNvbnRyb2wgaXMgcGFjNzMwMiBvbmx5ICovCisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJTYXR1cmF0aW9uIiwKKwkJLm1pbmltdW0gPSAwLAorI2RlZmluZSBDT0xPUl9NQVggMjU1CisJCS5tYXhpbXVtID0gQ09MT1JfTUFYLAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIENPTE9SX0RFRiAxMjcKKwkJLmRlZmF1bHRfdmFsdWUgPSBDT0xPUl9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRjb2xvcnMsCisJICAgIC5nZXQgPSBzZF9nZXRjb2xvcnMsCisJfSwKKwl7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIldoaXRlIEJhbGFuY2UiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMjU1LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIFdISVRFQkFMQU5DRV9ERUYgNAorCQkuZGVmYXVsdF92YWx1ZSA9IFdISVRFQkFMQU5DRV9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXR3aGl0ZWJhbGFuY2UsCisJICAgIC5nZXQgPSBzZF9nZXR3aGl0ZWJhbGFuY2UsCisJfSwKKwl7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJSZWQiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMywKKwkJLnN0ZXAgICAgPSAxLAorI2RlZmluZSBSRURCQUxBTkNFX0RFRiAxCisJCS5kZWZhdWx0X3ZhbHVlID0gUkVEQkFMQU5DRV9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRyZWRiYWxhbmNlLAorCSAgICAuZ2V0ID0gc2RfZ2V0cmVkYmFsYW5jZSwKKwl9LAorCXsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJCbHVlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDMsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgQkxVRUJBTEFOQ0VfREVGIDEKKwkJLmRlZmF1bHRfdmFsdWUgPSBCTFVFQkFMQU5DRV9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRibHVlYmFsYW5jZSwKKwkgICAgLmdldCA9IHNkX2dldGJsdWViYWxhbmNlLAorCX0sCisvKiBBbGwgY29udHJvbHMgYmVsb3cgYXJlIGZvciBib3RoIHRoZSA3MzAyIGFuZCB0aGUgNzMxMSAqLworCXsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0dBSU4sCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgPSAiR2FpbiIsCisJCS5taW5pbXVtID0gMCwKKyNkZWZpbmUgR0FJTl9NQVggMjU1CisJCS5tYXhpbXVtID0gR0FJTl9NQVgsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgR0FJTl9ERUYgMTI3CisjZGVmaW5lIEdBSU5fS05FRSAyNTUgLyogR2FpbiBzZWVtcyB0byBjYXVzZSBsaXR0bGUgbm9pc2Ugb24gdGhlIHBhYzczeHggKi8KKwkJLmRlZmF1bHRfdmFsdWUgPSBHQUlOX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldGdhaW4sCisJICAgIC5nZXQgPSBzZF9nZXRnYWluLAorCX0sCisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgPSAiRXhwb3N1cmUiLAorCQkubWluaW11bSA9IDAsCisjZGVmaW5lIEVYUE9TVVJFX01BWCAyNTUKKwkJLm1heGltdW0gPSBFWFBPU1VSRV9NQVgsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgRVhQT1NVUkVfREVGICAxNiAvKiAgMzIgbXMgLyAzMCBmcHMgKi8KKyNkZWZpbmUgRVhQT1NVUkVfS05FRSA1MCAvKiAxMDAgbXMgLyAxMCBmcHMgKi8KKwkJLmRlZmF1bHRfdmFsdWUgPSBFWFBPU1VSRV9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRleHBvc3VyZSwKKwkgICAgLmdldCA9IHNkX2dldGV4cG9zdXJlLAorCX0sCisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfQVVUT0dBSU4sCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgICAgPSAiQXV0byBHYWluIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgQVVUT0dBSU5fREVGIDEKKwkJLmRlZmF1bHRfdmFsdWUgPSBBVVRPR0FJTl9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRhdXRvZ2FpbiwKKwkgICAgLmdldCA9IHNkX2dldGF1dG9nYWluLAorCX0sCisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfSEZMSVAsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgICAgPSAiTWlycm9yIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgSEZMSVBfREVGIDAKKwkJLmRlZmF1bHRfdmFsdWUgPSBIRkxJUF9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRoZmxpcCwKKwkgICAgLmdldCA9IHNkX2dldGhmbGlwLAorCX0sCisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfVkZMSVAsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgICAgPSAiVmZsaXAiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgICAgPSAxLAorI2RlZmluZSBWRkxJUF9ERUYgMAorCQkuZGVmYXVsdF92YWx1ZSA9IFZGTElQX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldHZmbGlwLAorCSAgICAuZ2V0ID0gc2RfZ2V0dmZsaXAsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CisJezY0MCwgNDgwLCBWNEwyX1BJWF9GTVRfUEpQRywgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gNjQwLAorCQkuc2l6ZWltYWdlID0gNjQwICogNDgwICogMyAvIDggKyA1OTAsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCisJCS5wcml2ID0gMH0sCit9OworCisjZGVmaW5lIExPQURfUEFHRTMJCTI1NQorI2RlZmluZSBMT0FEX1BBR0U0CQkyNTQKKyNkZWZpbmUgRU5EX09GX1NFUVVFTkNFCQkwCisKKy8qIHBhYyA3MzAyICovCitzdGF0aWMgY29uc3QgX191OCBpbml0XzczMDJbXSA9IHsKKy8qCWluZGV4LHZhbHVlICovCisJMHhmZiwgMHgwMSwJCS8qIHBhZ2UgMSAqLworCTB4NzgsIDB4MDAsCQkvKiBkZWFjdGl2YXRlICovCisJMHhmZiwgMHgwMSwKKwkweDc4LCAweDQwLAkJLyogbGVkIG9mZiAqLworfTsKK3N0YXRpYyBjb25zdCBfX3U4IHN0YXJ0XzczMDJbXSA9IHsKKy8qCWluZGV4LCBsZW4sIFt2YWx1ZV0qICovCisJMHhmZiwgMSwJMHgwMCwJCS8qIHBhZ2UgMCAqLworCTB4MDAsIDEyLAkweDAxLCAweDQwLCAweDQwLCAweDQwLCAweDAxLCAweGUwLCAweDAyLCAweDgwLAorCQkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBkLCAyNCwJMHgwMywgMHgwMSwgMHgwMCwgMHhiNSwgMHgwNywgMHhjYiwgMHgwMCwgMHgwMCwKKwkJCTB4MDcsIDB4YzgsIDB4MDAsIDB4ZWEsIDB4MDcsIDB4Y2YsIDB4MDcsIDB4ZjcsCisJCQkweDA3LCAweDdlLCAweDAxLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDExLAorCTB4MjYsIDIsCTB4YWEsIDB4YWEsCisJMHgyZSwgMSwJMHgzMSwKKwkweDM4LCAxLAkweDAxLAorCTB4M2EsIDMsCTB4MTQsIDB4ZmYsIDB4NWEsCisJMHg0MywgMTEsCTB4MDAsIDB4MGEsIDB4MTgsIDB4MTEsIDB4MDEsIDB4MmMsIDB4ODgsIDB4MTEsCisJCQkweDAwLCAweDU0LCAweDExLAorCTB4NTUsIDEsCTB4MDAsCisJMHg2MiwgNCwgCTB4MTAsIDB4MWUsIDB4MWUsIDB4MTgsCisJMHg2YiwgMSwJMHgwMCwKKwkweDZlLCAzLAkweDA4LCAweDA2LCAweDAwLAorCTB4NzIsIDMsCTB4MDAsIDB4ZmYsIDB4MDAsCisJMHg3ZCwgMjMsCTB4MDEsIDB4MDEsIDB4NTgsIDB4NDYsIDB4NTAsIDB4M2MsIDB4NTAsIDB4M2MsCisJCQkweDU0LCAweDQ2LCAweDU0LCAweDU2LCAweDUyLCAweDUwLCAweDUyLCAweDUwLAorCQkJMHg1NiwgMHg2NCwgMHhhNCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwKKwkweGEyLCAxMCwJMHgyMiwgMHgyYywgMHgzYywgMHg1NCwgMHg2OSwgMHg3YywgMHg5YywgMHhiOSwKKwkJCTB4ZDIsIDB4ZWIsCisJMHhhZiwgMSwJMHgwMiwKKwkweGI1LCAyLAkweDA4LCAweDA4LAorCTB4YjgsIDIsCTB4MDgsIDB4ODgsCisJMHhjNCwgNCwJMHhhZSwgMHgwMSwgMHgwNCwgMHgwMSwKKwkweGNjLCAxLAkweDAwLAorCTB4ZDEsIDExLAkweDAxLCAweDMwLCAweDQ5LCAweDVlLCAweDZmLCAweDdmLCAweDhlLCAweGE5LAorCQkJMHhjMSwgMHhkNywgMHhlYywKKwkweGRjLCAxLAkweDAxLAorCTB4ZmYsIDEsCTB4MDEsCQkvKiBwYWdlIDEgKi8KKwkweDEyLCAzLAkweDAyLCAweDAwLCAweDAxLAorCTB4M2UsIDIsCTB4MDAsIDB4MDAsCisJMHg3NiwgNSwJMHgwMSwgMHgyMCwgMHg0MCwgMHgwMCwgMHhmMiwKKwkweDdjLCAxLAkweDAwLAorCTB4N2YsIDEwLAkweDRiLCAweDBmLCAweDAxLCAweDJjLCAweDAyLCAweDU4LCAweDAzLCAweDIwLAorCQkJMHgwMiwgMHgwMCwKKwkweDk2LCA1LAkweDAxLCAweDEwLCAweDA0LCAweDAxLCAweDA0LAorCTB4YzgsIDE0LAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAorCQkJMHgwNywgMHgwMCwgMHgwMSwgMHgwNywgMHgwNCwgMHgwMSwKKwkweGQ4LCAxLAkweDAxLAorCTB4ZGIsIDIsCTB4MDAsIDB4MDEsCisJMHhkZSwgNywJMHgwMCwgMHgwMSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweGU2LCA0LAkweDAwLCAweDAwLCAweDAwLCAweDAxLAorCTB4ZWIsIDEsCTB4MDAsCisJMHhmZiwgMSwJMHgwMiwJCS8qIHBhZ2UgMiAqLworCTB4MjIsIDEsCTB4MDAsCisJMHhmZiwgMSwJMHgwMywJCS8qIHBhZ2UgMyAqLworCTAsIExPQURfUEFHRTMsCQkJLyogbG9hZCB0aGUgcGFnZSAzICovCisJMHgxMSwgMSwJMHgwMSwKKwkweGZmLCAxLAkweDAyLAkJLyogcGFnZSAyICovCisJMHgxMywgMSwJMHgwMCwKKwkweDIyLCA0LAkweDFmLCAweGE0LCAweGYwLCAweDk2LAorCTB4MjcsIDIsCTB4MTQsIDB4MGMsCisJMHgyYSwgNSwJMHhjOCwgMHgwMCwgMHgxOCwgMHgxMiwgMHgyMiwKKwkweDY0LCA4LAkweDAwLCAweDAwLCAweGYwLCAweDAxLCAweDE0LCAweDQ0LCAweDQ0LCAweDQ0LAorCTB4NmUsIDEsCTB4MDgsCisJMHhmZiwgMSwJMHgwMSwJCS8qIHBhZ2UgMSAqLworCTB4NzgsIDEsCTB4MDAsCisJMCwgRU5EX09GX1NFUVVFTkNFCQkvKiBlbmQgb2Ygc2VxdWVuY2UgKi8KK307CisKKyNkZWZpbmUgU0tJUAkJMHhhYQorLyogcGFnZSAzIC0gdGhlIHZhbHVlIFNLSVAgc2F5cyBza2lwIHRoZSBpbmRleCAtIHNlZSByZWdfd19wYWdlKCkgKi8KK3N0YXRpYyBjb25zdCBfX3U4IHBhZ2UzXzczMDJbXSA9IHsKKwkweDkwLCAweDQwLCAweDAzLCAweDUwLCAweGMyLCAweDAxLCAweDE0LCAweDE2LAorCTB4MTQsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MzMsIDB4MDAsCisJMHgwZiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDAxLCAweGIzLCAweDAxLCAweDAwLAorCTB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MjEsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg1NCwgMHhmNCwgMHgwMiwgMHg1MiwgMHg1NCwKKwkweGE0LCAweGI4LCAweGUwLCAweDJhLCAweGY2LCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmYywgMHgwMCwgMHhmMiwgMHgxZiwgMHgwNCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDEwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHg0MCwgMHhmZiwgMHgwMywgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4YzgsIDB4YzgsCisJMHhjOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MCwKKwkweDA4LCAweDEwLCAweDI0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDEsIDB4MDAsIDB4MDIsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAyLCAweGZhLCAweDAwLCAweDY0LCAweDVhLCAweDI4LCAweDAwLAorCTB4MDAKK307CisKK3N0YXRpYyBpbnQgcmVnX3dfYnVmKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJICBfX3U4IGluZGV4LAorCQkgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCisJbWVtY3B5KGdzcGNhX2Rldi0+dXNiX2J1ZiwgYnVmZmVyLCBsZW4pOworCXJldCA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCisJCQkxLAkJLyogcmVxdWVzdCAqLworCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJMCwJCS8qIHZhbHVlICovCisJCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sCisJCQk1MDApOworCWlmIChyZXQgPCAwKQorCQlQREVCVUcoRF9FUlIsICJyZWdfd19idWYoKTogIgorCQkiRmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVycyB0byBpbmRleCAweCV4LCBlcnJvciAlaSIsCisJCWluZGV4LCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByZWdfdyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCSAgX191OCBpbmRleCwKKwkJICBfX3U4IHZhbHVlKQoreworCWludCByZXQ7CisKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSB2YWx1ZTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJMCwJCQkvKiByZXF1ZXN0ICovCisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkwLCBpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAorCQkJNTAwKTsKKwlpZiAocmV0IDwgMCkKKwkJUERFQlVHKERfRVJSLCAicmVnX3coKTogIgorCQkiRmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVyIHRvIGluZGV4IDB4JXgsIHZhbHVlIDB4JXgsIGVycm9yICVpIiwKKwkJaW5kZXgsIHZhbHVlLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVnX3dfc2VxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJY29uc3QgX191OCAqc2VxLCBpbnQgbGVuKQoreworCWludCByZXQgPSAwOworCXdoaWxlICgtLWxlbiA+PSAwKSB7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2Rldiwgc2VxWzBdLCBzZXFbMV0pOworCQlzZXEgKz0gMjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogbG9hZCB0aGUgYmVnaW5uaW5nIG9mIGEgcGFnZSAqLworc3RhdGljIGludCByZWdfd19wYWdlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IF9fdTggKnBhZ2UsIGludCBsZW4pCit7CisJaW50IGluZGV4OworCWludCByZXQgPSAwOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7CisJCWlmIChwYWdlW2luZGV4XSA9PSBTS0lQKQkJLyogc2tpcCB0aGlzIGluZGV4ICovCisJCQljb250aW51ZTsKKwkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gcGFnZVtpbmRleF07CisJCXJldCA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJCTAsCQkJLyogcmVxdWVzdCAqLworCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJCTAsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCisJCQkJNTAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCVBERUJVRyhEX0VSUiwgInJlZ193X3BhZ2UoKTogIgorCQkJIkZhaWxlZCB0byB3cml0ZSByZWdpc3RlciB0byBpbmRleCAweCV4LCAiCisJCQkidmFsdWUgMHgleCwgZXJyb3IgJWkiLAorCQkJaW5kZXgsIHBhZ2VbaW5kZXhdLCByZXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogb3V0cHV0IGEgdmFyaWFibGUgc2VxdWVuY2UgKi8KK3N0YXRpYyBpbnQgcmVnX3dfdmFyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IF9fdTggKnNlcSwKKwkJCWNvbnN0IF9fdTggKnBhZ2UzLCB1bnNpZ25lZCBpbnQgcGFnZTNfbGVuLAorCQkJY29uc3QgX191OCAqcGFnZTQsIHVuc2lnbmVkIGludCBwYWdlNF9sZW4pCit7CisJaW50IGluZGV4LCBsZW47CisJaW50IHJldCA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWluZGV4ID0gKnNlcSsrOworCQlsZW4gPSAqc2VxKys7CisJCXN3aXRjaCAobGVuKSB7CisJCWNhc2UgRU5EX09GX1NFUVVFTkNFOgorCQkJcmV0dXJuIHJldDsKKwkJY2FzZSBMT0FEX1BBR0U0OgorCQkJcmV0ID0gcmVnX3dfcGFnZShnc3BjYV9kZXYsIHBhZ2U0LCBwYWdlNF9sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgTE9BRF9QQUdFMzoKKwkJCXJldCA9IHJlZ193X3BhZ2UoZ3NwY2FfZGV2LCBwYWdlMywgcGFnZTNfbGVuKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKKwkJCQlQREVCVUcoRF9FUlJ8RF9TVFJFQU0sCisJCQkJCSJJbmNvcnJlY3QgdmFyaWFibGUgc2VxdWVuY2UiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXdoaWxlIChsZW4gPiAwKSB7CisJCQkJaWYgKGxlbiA8IDgpIHsKKwkJCQkJcmV0ID0gcmVnX3dfYnVmKGdzcGNhX2RldiwKKwkJCQkJCWluZGV4LCBzZXEsIGxlbik7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJc2VxICs9IGxlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldCA9IHJlZ193X2J1Zihnc3BjYV9kZXYsIGluZGV4LCBzZXEsIDgpOworCQkJCXNlcSArPSA4OworCQkJCWluZGV4ICs9IDg7CisJCQkJbGVuIC09IDg7CisJCQl9CisJCX0KKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwkvKiBub3QgcmVhY2hlZCAqLworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSB0aW1lIGZvciBwYWM3MzAyICovCitzdGF0aWMgaW50IHNkX2NvbmZpZyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXN0cnVjdCBjYW0gKmNhbTsKKworCWNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKKworCVBERUJVRyhEX0NPTkYsICJGaW5kIFNlbnNvciBQQUM3MzAyIik7CisJY2FtLT5jYW1fbW9kZSA9IHZnYV9tb2RlOwkvKiBvbmx5IDY0MHg0ODAgKi8KKwljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUodmdhX21vZGUpOworCisJc2QtPmJyaWdodG5lc3MgPSBCUklHSFRORVNTX0RFRjsKKwlzZC0+Y29udHJhc3QgPSBDT05UUkFTVF9ERUY7CisJc2QtPmNvbG9ycyA9IENPTE9SX0RFRjsKKwlzZC0+d2hpdGVfYmFsYW5jZSA9IFdISVRFQkFMQU5DRV9ERUY7CisJc2QtPnJlZF9iYWxhbmNlID0gUkVEQkFMQU5DRV9ERUY7CisJc2QtPmJsdWVfYmFsYW5jZSA9IEJMVUVCQUxBTkNFX0RFRjsKKwlzZC0+Z2FpbiA9IEdBSU5fREVGOworCXNkLT5leHBvc3VyZSA9IEVYUE9TVVJFX0RFRjsKKwlzZC0+YXV0b2dhaW4gPSBBVVRPR0FJTl9ERUY7CisJc2QtPmhmbGlwID0gSEZMSVBfREVGOworCXNkLT52ZmxpcCA9IFZGTElQX0RFRjsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHBhYzczMDIgb25seSAqLworc3RhdGljIGludCBzZXRicmlnaHRjb250KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IGksIHY7CisJaW50IHJldDsKKwlzdGF0aWMgY29uc3QgX191OCBtYXhbMTBdID0KKwkJezB4MjksIDB4MzMsIDB4NDIsIDB4NWEsIDB4NmUsIDB4ODAsIDB4OWYsIDB4YmIsCisJCSAweGQ0LCAweGVjfTsKKwlzdGF0aWMgY29uc3QgX191OCBkZWx0YVsxMF0gPQorCQl7MHgzNSwgMHgzMywgMHgzMywgMHgyZiwgMHgyYSwgMHgyNSwgMHgxZSwgMHgxNywKKwkJIDB4MTEsIDB4MGJ9OworCisJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsJLyogcGFnZSAwICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJdiA9IG1heFtpXTsKKwkJdiArPSAoc2QtPmJyaWdodG5lc3MgLSBCUklHSFRORVNTX01BWCkKKwkJCSogMTUwIC8gQlJJR0hUTkVTU19NQVg7CQkvKiAyMDAgPyAqLworCQl2IC09IGRlbHRhW2ldICogc2QtPmNvbnRyYXN0IC8gQ09OVFJBU1RfTUFYOworCQlpZiAodiA8IDApCisJCQl2ID0gMDsKKwkJZWxzZSBpZiAodiA+IDB4ZmYpCisJCQl2ID0gMHhmZjsKKwkJaWYgKDAgPD0gcmV0KQorCQkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGEyICsgaSwgdik7CisJfQorCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGRjLCAweDAxKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgcGFjNzMwMiBvbmx5ICovCitzdGF0aWMgaW50IHNldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBpLCB2OworCWludCByZXQ7CisJc3RhdGljIGNvbnN0IGludCBhWzldID0KKwkJezIxNywgLTIxMiwgMCwgLTEwMSwgMTcwLCAtNjcsIC0zOCwgLTMxNSwgMzU1fTsKKwlzdGF0aWMgY29uc3QgaW50IGJbOV0gPQorCQl7MTksIDEwNiwgMCwgMTksIDEwNiwgMSwgMTksIDEwNiwgMX07CisKKwlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDMpOwkvKiBwYWdlIDMgKi8KKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxMSwgMHgwMSk7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOwkvKiBwYWdlIDAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCXYgPSBhW2ldICogc2QtPmNvbG9ycyAvIENPTE9SX01BWCArIGJbaV07CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgwZiArIDIgKiBpLCAodiA+PiA4KSAmIDB4MDcpOworCQlpZiAoMCA8PSByZXQpCisJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MGYgKyAyICogaSArIDEsIHYpOworCX0KKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhkYywgMHgwMSk7CisJUERFQlVHKERfQ09ORnxEX1NUUkVBTSwgImNvbG9yOiAlaSIsIHNkLT5jb2xvcnMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0d2hpdGViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJldDsKKworCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CS8qIHBhZ2UgMCAqLworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGM2LCBzZC0+d2hpdGVfYmFsYW5jZSk7CisKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhkYywgMHgwMSk7CisJUERFQlVHKERfQ09ORnxEX1NUUkVBTSwgIndoaXRlX2JhbGFuY2U6ICVpIiwgc2QtPndoaXRlX2JhbGFuY2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0cmVkYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZXQ7CisKKwlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOwkvKiBwYWdlIDAgKi8KKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhjNSwgc2QtPnJlZF9iYWxhbmNlKTsKKworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGRjLCAweDAxKTsKKwlQREVCVUcoRF9DT05GfERfU1RSRUFNLCAicmVkX2JhbGFuY2U6ICVpIiwgc2QtPnJlZF9iYWxhbmNlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNldGJsdWViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJldDsKKworCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CS8qIHBhZ2UgMCAqLworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGM3LCBzZC0+Ymx1ZV9iYWxhbmNlKTsKKworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGRjLCAweDAxKTsKKwlQREVCVUcoRF9DT05GfERfU1RSRUFNLCAiYmx1ZV9iYWxhbmNlOiAlaSIsIHNkLT5ibHVlX2JhbGFuY2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZXQ7CisKKwlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDMpOwkJLyogcGFnZSAzICovCisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MTAsIHNkLT5nYWluID4+IDMpOworCisJLyogbG9hZCByZWdpc3RlcnMgdG8gc2Vuc29yIChCaXQgMCwgYXV0byBjbGVhcikgKi8KKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxMSwgMHgwMSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZXQ7CisJX191OCByZWc7CisKKwkvKiByZWdpc3RlciAyIG9mIGZyYW1lIDMvNCBjb250YWlucyB0aGUgY2xvY2sgZGl2aWRlciBjb25maWd1cmluZyB0aGUKKwkgICBubyBmcHMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOiA2MCAvIHJlZy4gc2QtPmV4cG9zdXJlIGlzIHRoZQorCSAgIGRlc2lyZWQgZXhwb3N1cmUgdGltZSBpbiBtcy4gKi8KKwlyZWcgPSAxMjAgKiBzZC0+ZXhwb3N1cmUgLyAxMDAwOworCWlmIChyZWcgPCAyKQorCQlyZWcgPSAyOworCWVsc2UgaWYgKHJlZyA+IDYzKQorCQlyZWcgPSA2MzsKKworCS8qIE9uIHRoZSBwYWM3MzAyIHJlZzIgTVVTVCBiZSBhIG11bHRpcGxlIG9mIDMsIHNvIHJvdW5kIGl0IHRvCisJICAgdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMywgZXhjZXB0IHdoZW4gYmV0d2VlbiA2IGFuZCAxMj8gKi8KKwlpZiAocmVnIDwgNiB8fCByZWcgPiAxMikKKwkJcmVnID0gKChyZWcgKyAxKSAvIDMpICogMzsKKwlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDMpOwkJLyogcGFnZSAzICovCisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MDIsIHJlZyk7CisKKwkvKiBsb2FkIHJlZ2lzdGVycyB0byBzZW5zb3IgKEJpdCAwLCBhdXRvIGNsZWFyKSAqLworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNldGh2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZXQ7CisJX191OCBkYXRhOworCisJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAzKTsJCS8qIHBhZ2UgMyAqLworCWRhdGEgPSAoc2QtPmhmbGlwID8gMHgwOCA6IDB4MDApIHwgKHNkLT52ZmxpcCA/IDB4MDQgOiAweDAwKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgyMSwgZGF0YSk7CisJLyogbG9hZCByZWdpc3RlcnMgdG8gc2Vuc29yIChCaXQgMCwgYXV0byBjbGVhcikgKi8KKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxMSwgMHgwMSk7CisJcmV0dXJuIHJldDsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lIGZvciBwYWM3MzAyICovCitzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXJldHVybiByZWdfd19zZXEoZ3NwY2FfZGV2LCBpbml0XzczMDIsIHNpemVvZihpbml0XzczMDIpLzIpOworfQorCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJldCA9IDA7CisKKwlzZC0+c29mX3JlYWQgPSAwOworCisJcmV0ID0gcmVnX3dfdmFyKGdzcGNhX2Rldiwgc3RhcnRfNzMwMiwKKwkJcGFnZTNfNzMwMiwgc2l6ZW9mKHBhZ2UzXzczMDIpLAorCQlOVUxMLCAwKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHNldGJyaWdodGNvbnQoZ3NwY2FfZGV2KTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHNldGNvbG9ycyhnc3BjYV9kZXYpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gc2V0d2hpdGViYWxhbmNlKGdzcGNhX2Rldik7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSBzZXRyZWRiYWxhbmNlKGdzcGNhX2Rldik7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSBzZXRibHVlYmFsYW5jZShnc3BjYV9kZXYpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gc2V0Z2Fpbihnc3BjYV9kZXYpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHNldGh2ZmxpcChnc3BjYV9kZXYpOworCisJLyogb25seSByZXNvbHV0aW9uIDY0MHg0ODAgaXMgc3VwcG9ydGVkIGZvciBwYWM3MzAyICovCisKKwlzZC0+c29mX3JlYWQgPSAwOworCXNkLT5hdXRvZ2Fpbl9pZ25vcmVfZnJhbWVzID0gMDsKKwlhdG9taWNfc2V0KCZzZC0+YXZnX2x1bSwgLTEpOworCisJLyogc3RhcnQgc3RyZWFtICovCisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDEpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlpbnQgcmV0OworCisJLyogc3RvcCBzdHJlYW0gKi8KKwlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDEpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDAwKTsKK30KKworLyogY2FsbGVkIG9uIHN0cmVhbW9mZiB3aXRoIGFsdCAwIGFuZCBvbiBkaXNjb25uZWN0IGZvciBwYWM3MzAyICovCitzdGF0aWMgdm9pZCBzZF9zdG9wMChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJaW50IHJldDsKKworCWlmICghZ3NwY2FfZGV2LT5wcmVzZW50KQorCQlyZXR1cm47CisJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAxKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHg3OCwgMHg0MCk7Cit9CisKKy8qIEluY2x1ZGUgcGFjIGNvbW1vbiBzb2YgZGV0ZWN0aW9uIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgInBhY19jb21tb24uaCIKKworc3RhdGljIHZvaWQgZG9fYXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgYXZnX2x1bSA9IGF0b21pY19yZWFkKCZzZC0+YXZnX2x1bSk7CisJaW50IGRlc2lyZWRfbHVtLCBkZWFkem9uZTsKKworCWlmIChhdmdfbHVtID09IC0xKQorCQlyZXR1cm47CisKKwlkZXNpcmVkX2x1bSA9IDI3MCArIHNkLT5icmlnaHRuZXNzICogNDsKKwkvKiBIYWNrIGhhY2ssIHdpdGggdGhlIDcyMDIgdGhlIGZpcnN0IGV4cG9zdXJlIHN0ZXAgaXMKKwkgICBwcmV0dHkgbGFyZ2UsIHNvIGlmIHdlJ3JlIGFib3V0IHRvIG1ha2UgdGhlIGZpcnN0CisJICAgZXhwb3N1cmUgaW5jcmVhc2UgbWFrZSB0aGUgZGVhZHpvbmUgbGFyZ2UgdG8gYXZvaWQKKwkgICBvc2NpbGF0aW5nICovCisJaWYgKGRlc2lyZWRfbHVtID4gYXZnX2x1bSAmJiBzZC0+Z2FpbiA9PSBHQUlOX0RFRiAmJgorCQkJc2QtPmV4cG9zdXJlID4gRVhQT1NVUkVfREVGICYmCisJCQlzZC0+ZXhwb3N1cmUgPCA0MikKKwkJZGVhZHpvbmUgPSA5MDsKKwllbHNlCisJCWRlYWR6b25lID0gMzA7CisKKwlpZiAoc2QtPmF1dG9nYWluX2lnbm9yZV9mcmFtZXMgPiAwKQorCQlzZC0+YXV0b2dhaW5faWdub3JlX2ZyYW1lcy0tOworCWVsc2UgaWYgKGdzcGNhX2F1dG9fZ2Fpbl9uX2V4cG9zdXJlKGdzcGNhX2RldiwgYXZnX2x1bSwgZGVzaXJlZF9sdW0sCisJCQlkZWFkem9uZSwgR0FJTl9LTkVFLCBFWFBPU1VSRV9LTkVFKSkKKwkJc2QtPmF1dG9nYWluX2lnbm9yZV9mcmFtZXMgPSBQQUNfQVVUT0dBSU5fSUdOT1JFX0ZSQU1FUzsKK30KKworLyogSlBFRyBoZWFkZXIsIHBhcnQgMSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGFjX2pwZWdfaGVhZGVyMVtdID0geworICAweGZmLCAweGQ4LAkJLyogU09JOiBTdGFydCBvZiBJbWFnZSAqLworCisgIDB4ZmYsIDB4YzAsCQkvKiBTT0YwOiBTdGFydCBvZiBGcmFtZSAoQmFzZWxpbmUgRENUKSAqLworICAweDAwLCAweDExLAkJLyogbGVuZ3RoID0gMTcgYnl0ZXMgKGluY2x1ZGluZyB0aGlzIGxlbmd0aCBmaWVsZCkgKi8KKyAgMHgwOAkJCS8qIFByZWNpc2lvbjogOCAqLworICAvKiAyIGJ5dGVzIGlzIHBsYWNlZCBoZXJlOiBudW1iZXIgb2YgaW1hZ2UgbGluZXMgKi8KKyAgLyogMiBieXRlcyBpcyBwbGFjZWQgaGVyZTogc2FtcGxlcyBwZXIgbGluZSAqLworfTsKKworLyogSlBFRyBoZWFkZXIsIGNvbnRpbnVlZCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGFjX2pwZWdfaGVhZGVyMltdID0geworICAweDAzLAkJCS8qIE51bWJlciBvZiBpbWFnZSBjb21wb25lbnRzOiAzICovCisgIDB4MDEsIDB4MjEsIDB4MDAsCS8qIElEPTEsIFN1YnNhbXBsaW5nIDF4MSwgUXVhbnRpemF0aW9uIHRhYmxlOiAwICovCisgIDB4MDIsIDB4MTEsIDB4MDEsCS8qIElEPTIsIFN1YnNhbXBsaW5nIDJ4MSwgUXVhbnRpemF0aW9uIHRhYmxlOiAxICovCisgIDB4MDMsIDB4MTEsIDB4MDEsCS8qIElEPTMsIFN1YnNhbXBsaW5nIDJ4MSwgUXVhbnRpemF0aW9uIHRhYmxlOiAxICovCisKKyAgMHhmZiwgMHhkYSwJCS8qIFNPUzogU3RhcnQgT2YgU2NhbiAqLworICAweDAwLCAweDBjLAkJLyogbGVuZ3RoID0gMTIgYnl0ZXMgKGluY2x1ZGluZyB0aGlzIGxlbmd0aCBmaWVsZCkgKi8KKyAgMHgwMywJCQkvKiBudW1iZXIgb2YgY29tcG9uZW50czogMyAqLworICAweDAxLCAweDAwLAkJLyogc2VsZWN0b3IgMSwgdGFibGUgMHgwMCAqLworICAweDAyLCAweDExLAkJLyogc2VsZWN0b3IgMiwgdGFibGUgMHgxMSAqLworICAweDAzLCAweDExLAkJLyogc2VsZWN0b3IgMywgdGFibGUgMHgxMSAqLworICAweDAwLCAweDNmLAkJLyogU3BlY3RyYWwgc2VsZWN0aW9uOiAwIC4uIDYzICovCisgIDB4MDAJCQkvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb246IDAgKi8KK307CisKK3N0YXRpYyB2b2lkIHBhY19zdGFydF9mcmFtZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCisJCV9fdTE2IGxpbmVzLCBfX3UxNiBzYW1wbGVzX3Blcl9saW5lKQoreworCXVuc2lnbmVkIGNoYXIgdG1wYnVmWzRdOworCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAorCQlwYWNfanBlZ19oZWFkZXIxLCBzaXplb2YocGFjX2pwZWdfaGVhZGVyMSkpOworCisJdG1wYnVmWzBdID0gbGluZXMgPj4gODsKKwl0bXBidWZbMV0gPSBsaW5lcyAmIDB4ZmY7CisJdG1wYnVmWzJdID0gc2FtcGxlc19wZXJfbGluZSA+PiA4OworCXRtcGJ1ZlszXSA9IHNhbXBsZXNfcGVyX2xpbmUgJiAweGZmOworCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQl0bXBidWYsIHNpemVvZih0bXBidWYpKTsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCisJCXBhY19qcGVnX2hlYWRlcjIsIHNpemVvZihwYWNfanBlZ19oZWFkZXIyKSk7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgcnVuIGF0IGludGVycnVwdCBsZXZlbCAqLworc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBjaGFyICpzb2Y7CisKKwlzb2YgPSBwYWNfZmluZF9zb2YoJnNkLT5zb2ZfcmVhZCwgZGF0YSwgbGVuKTsKKwlpZiAoc29mKSB7CisJCWludCBuLCBsdW1fb2Zmc2V0LCBmb290ZXJfbGVuZ3RoOworCisJCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKKwkJaWYgKGZyYW1lID09IE5VTEwpIHsKKwkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogNiBieXRlcyBhZnRlciB0aGUgRkYgRDkgRU9GIG1hcmtlciBhIG51bWJlciBvZiBsdW1pbmF0aW9uCisJCSAgIGJ5dGVzIGFyZSBzZW5kIGNvcnJlc3BvbmRpbmcgdG8gZGlmZmVyZW50IHBhcnRzIG9mIHRoZQorCQkgICBpbWFnZSwgdGhlIDE0dGggYW5kIDE1dGggYnl0ZSBhZnRlciB0aGUgRU9GIHNlZW0gdG8KKwkJICAgY29ycmVzcG9uZCB0byB0aGUgY2VudGVyIG9mIHRoZSBpbWFnZSAqLworCQlsdW1fb2Zmc2V0ID0gNjEgKyBzaXplb2YgcGFjX3NvZl9tYXJrZXI7CisJCWZvb3Rlcl9sZW5ndGggPSA3NDsKKworCQkvKiBGaW5pc2ggZGVjb2RpbmcgY3VycmVudCBmcmFtZSAqLworCQluID0gKHNvZiAtIGRhdGEpIC0gKGZvb3Rlcl9sZW5ndGggKyBzaXplb2YgcGFjX3NvZl9tYXJrZXIpOworCQlpZiAobiA8IDApIHsKKwkJCWZyYW1lLT5kYXRhX2VuZCArPSBuOworCQkJbiA9IDA7CisJCX0KKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQkJCQlkYXRhLCBuKTsKKwkJaWYgKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSAhPSBESVNDQVJEX1BBQ0tFVCAmJgorCQkJCWZyYW1lLT5kYXRhX2VuZFstMl0gPT0gMHhmZiAmJgorCQkJCWZyYW1lLT5kYXRhX2VuZFstMV0gPT0gMHhkOSkKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAorCQkJCQkJTlVMTCwgMCk7CisKKwkJbiA9IHNvZiAtIGRhdGE7CisJCWxlbiAtPSBuOworCQlkYXRhID0gc29mOworCisJCS8qIEdldCBhdmVyYWdlIGx1bWluYXRpb24gKi8KKwkJaWYgKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9PSBMQVNUX1BBQ0tFVCAmJgorCQkJCW4gPj0gbHVtX29mZnNldCkKKwkJCWF0b21pY19zZXQoJnNkLT5hdmdfbHVtLCBkYXRhWy1sdW1fb2Zmc2V0XSArCisJCQkJCQlkYXRhWy1sdW1fb2Zmc2V0ICsgMV0pOworCQllbHNlCisJCQlhdG9taWNfc2V0KCZzZC0+YXZnX2x1bSwgLTEpOworCisJCS8qIFN0YXJ0IHRoZSBuZXcgZnJhbWUgd2l0aCB0aGUganBlZyBoZWFkZXIgKi8KKwkJLyogVGhlIFBBQzczMDIgaGFzIHRoZSBpbWFnZSByb3RhdGVkIDkwIGRlZ3JlZXMgKi8KKwkJcGFjX3N0YXJ0X2ZyYW1lKGdzcGNhX2RldiwgZnJhbWUsCisJCQlnc3BjYV9kZXYtPndpZHRoLCBnc3BjYV9kZXYtPmhlaWdodCk7CisJfQorCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5icmlnaHRuZXNzID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0YnJpZ2h0Y29udChnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+YnJpZ2h0bmVzczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+Y29udHJhc3QgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKSB7CisJCXNldGJyaWdodGNvbnQoZ3NwY2FfZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Y29udHJhc3Q7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5jb2xvcnMgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRjb2xvcnMoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRjb2xvcnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Y29sb3JzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJldCA9IDA7CisKKwlzZC0+d2hpdGVfYmFsYW5jZSA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXJldCA9IHNldHdoaXRlYmFsYW5jZShnc3BjYV9kZXYpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNkX2dldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT53aGl0ZV9iYWxhbmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldHJlZGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZXQgPSAwOworCisJc2QtPnJlZF9iYWxhbmNlID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJcmV0ID0gc2V0cmVkYmFsYW5jZShnc3BjYV9kZXYpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNkX2dldHJlZGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+cmVkX2JhbGFuY2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0Ymx1ZWJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZXQgPSAwOworCisJc2QtPmJsdWVfYmFsYW5jZSA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXJldCA9IHNldGJsdWViYWxhbmNlKGdzcGNhX2Rldik7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0Ymx1ZWJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Ymx1ZV9iYWxhbmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmdhaW4gPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRnYWluKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5nYWluOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5leHBvc3VyZSA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+ZXhwb3N1cmU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmF1dG9nYWluID0gdmFsOworCS8qIHdoZW4gc3dpdGNoaW5nIHRvIGF1dG9nYWluIHNldCBkZWZhdWx0cyB0byBtYWtlIHN1cmUKKwkgICB3ZSBhcmUgb24gYSB2YWxpZCBwb2ludCBvZiB0aGUgYXV0b2dhaW4gZ2FpbiAvCisJICAgZXhwb3N1cmUga25lZSBncmFwaCwgYW5kIGdpdmUgdGhpcyBjaGFuZ2UgdGltZSB0bworCSAgIHRha2UgZWZmZWN0IGJlZm9yZSBkb2luZyBhdXRvZ2Fpbi4gKi8KKwlpZiAoc2QtPmF1dG9nYWluKSB7CisJCXNkLT5leHBvc3VyZSA9IEVYUE9TVVJFX0RFRjsKKwkJc2QtPmdhaW4gPSBHQUlOX0RFRjsKKwkJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKSB7CisJCQlzZC0+YXV0b2dhaW5faWdub3JlX2ZyYW1lcyA9CisJCQkJUEFDX0FVVE9HQUlOX0lHTk9SRV9GUkFNRVM7CisJCQlzZXRleHBvc3VyZShnc3BjYV9kZXYpOworCQkJc2V0Z2Fpbihnc3BjYV9kZXYpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+YXV0b2dhaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmhmbGlwID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0aHZmbGlwKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+aGZsaXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPnZmbGlwID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0aHZmbGlwKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+dmZsaXA7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IHNkX2RiZ19zX3JlZ2lzdGVyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCWludCByZXQgPSAtRUlOVkFMOworCV9fdTggaW5kZXg7CisJX191OCB2YWx1ZTsKKworCS8qIHJlZy0+cmVnOiBiaXQwLi4xNTogcmVzZXJ2ZWQgZm9yIHJlZ2lzdGVyIGluZGV4ICh3SW5kZXggaXMgMTZiaXQKKwkJCSAgICAgICBsb25nIG9uIHRoZSBVU0IgYnVzKQorCSovCisJaWYgKHJlZy0+bWF0Y2gudHlwZSA9PSBWNEwyX0NISVBfTUFUQ0hfSE9TVCAmJgorCSAgICByZWctPm1hdGNoLmFkZHIgPT0gMCAmJgorCSAgICAocmVnLT5yZWcgPCAweDAwMDAwMGZmKSAmJgorCSAgICAocmVnLT52YWwgPD0gMHgwMDAwMDBmZikKKwkpIHsKKwkJLyogQ3VycmVudGx5IHdyaXRpbmcgdG8gcGFnZSAwIGlzIG9ubHkgc3VwcG9ydGVkLiAqLworCQkvKiByZWdfdygpIG9ubHkgc3VwcG9ydHMgOGJpdCBpbmRleCAqLworCQlpbmRleCA9IHJlZy0+cmVnICYgMHgwMDAwMDBmZjsKKwkJdmFsdWUgPSByZWctPnZhbCAmIDB4MDAwMDAwZmY7CisKKwkJLyogTm90ZSB0aGF0IHRoZXJlIHNoYWxsIGJlIG5vIGFjY2VzcyB0byBvdGhlciBwYWdlCisJCSAgIGJ5IGFueSBvdGhlciBmdW5jdGlvbiBiZXR3ZWVuIHRoZSBwYWdlIHN3aXRoIGFuZAorCQkgICB0aGUgYWN0dWFsIHJlZ2lzdGVyIHdyaXRlICovCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CS8qIHBhZ2UgMCAqLworCQlpZiAoMCA8PSByZXQpCisJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIGluZGV4LCB2YWx1ZSk7CisKKwkJaWYgKDAgPD0gcmV0KQorCQkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGRjLCAweDAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZF9jaGlwX2lkZW50KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICpjaGlwKQoreworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKGNoaXAtPm1hdGNoLnR5cGUgPT0gVjRMMl9DSElQX01BVENIX0hPU1QgJiYKKwkgICAgY2hpcC0+bWF0Y2guYWRkciA9PSAwKSB7CisJCWNoaXAtPnJldmlzaW9uID0gMDsKKwkJY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX1VOS05PV047CisJCXJldCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiBmb3IgcGFjNzMwMiAqLworc3RhdGljIHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2MgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuY3RybHMgPSBzZF9jdHJscywKKwkubmN0cmxzID0gQVJSQVlfU0laRShzZF9jdHJscyksCisJLmNvbmZpZyA9IHNkX2NvbmZpZywKKwkuaW5pdCA9IHNkX2luaXQsCisJLnN0YXJ0ID0gc2Rfc3RhcnQsCisJLnN0b3BOID0gc2Rfc3RvcE4sCisJLnN0b3AwID0gc2Rfc3RvcDAsCisJLnBrdF9zY2FuID0gc2RfcGt0X3NjYW4sCisJLmRxX2NhbGxiYWNrID0gZG9fYXV0b2dhaW4sCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5zZXRfcmVnaXN0ZXIgPSBzZF9kYmdfc19yZWdpc3RlciwKKwkuZ2V0X2NoaXBfaWRlbnQgPSBzZF9jaGlwX2lkZW50LAorI2VuZGlmCit9OworCisvKiAtLSBtb2R1bGUgaW5pdGlhbGlzYXRpb24gLS0gKi8KK3N0YXRpYyBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDZmOCwgMHgzMDA5KX0sCisJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MjApfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyMSl9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIyKX0sCisJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MjQpfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyNil9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI4KX0sCisJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MjkpfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyYSl9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjJjKX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZShpbnRmLCBpZCwgJnNkX2Rlc2MsIHNpemVvZihzdHJ1Y3Qgc2QpLAorCQkJCVRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNkX2RyaXZlciA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5pZF90YWJsZSA9IGRldmljZV90YWJsZSwKKwkucHJvYmUgPSBzZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGdzcGNhX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnc3BjYV9zdXNwZW5kLAorCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB1c2JfcmVnaXN0ZXIoJnNkX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJUERFQlVHKERfUFJPQkUsICJyZWdpc3RlcmVkIik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgc2RfbW9kX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2RfZHJpdmVyKTsKKwlQREVCVUcoRF9QUk9CRSwgImRlcmVnaXN0ZXJlZCIpOworfQorCittb2R1bGVfaW5pdChzZF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzZF9tb2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jCmluZGV4IDA1MjcxNDQuLmU1Njk3YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jCkBAIC01NywyMyArNTcsMTcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiUGl4YXJ0IFBBQzczMTEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotLyogc3BlY2lmaWMgd2ViY2FtIGRlc2NyaXB0b3IgKi8KKy8qIHNwZWNpZmljIHdlYmNhbSBkZXNjcmlwdG9yIGZvciBwYWM3MzExICovCiBzdHJ1Y3Qgc2QgewogCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OwkJLyogISEgbXVzdCBiZSB0aGUgZmlyc3QgaXRlbSAqLwogCi0JdW5zaWduZWQgY2hhciBicmlnaHRuZXNzOwogCXVuc2lnbmVkIGNoYXIgY29udHJhc3Q7Ci0JdW5zaWduZWQgY2hhciBjb2xvcnM7CiAJdW5zaWduZWQgY2hhciBnYWluOwogCXVuc2lnbmVkIGNoYXIgZXhwb3N1cmU7CiAJdW5zaWduZWQgY2hhciBhdXRvZ2FpbjsKIAlfX3U4IGhmbGlwOwogCV9fdTggdmZsaXA7CiAKLQlfX3U4IHNlbnNvcjsKLSNkZWZpbmUgU0VOU09SX1BBQzczMDIgMAotI2RlZmluZSBTRU5TT1JfUEFDNzMxMSAxCi0KIAl1OCBzb2ZfcmVhZDsKIAl1OCBhdXRvZ2Fpbl9pZ25vcmVfZnJhbWVzOwogCkBAIC04MSwxMiArNzUsOCBAQAogfTsKIAogLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwotc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKLXN0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogc3RhdGljIGludCBzZF9zZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CiBzdGF0aWMgaW50IHNkX2dldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7Ci1zdGF0aWMgaW50IHNkX3NldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogc3RhdGljIGludCBzZF9zZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CiBzdGF0aWMgaW50IHNkX2dldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiBzdGF0aWMgaW50IHNkX3NldGhmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKQEAgLTk5LDIzICs4OSw2IEBACiBzdGF0aWMgaW50IHNkX2dldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiAKIHN0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tdID0gewotLyogVGhpcyBjb250cm9sIGlzIHBhYzczMDIgb25seSAqLwotI2RlZmluZSBCUklHSFRORVNTX0lEWCAwCi0JewotCSAgICB7Ci0JCS5pZCAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKLQkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICA9ICJCcmlnaHRuZXNzIiwKLQkJLm1pbmltdW0gPSAwLAotI2RlZmluZSBCUklHSFRORVNTX01BWCAweDIwCi0JCS5tYXhpbXVtID0gQlJJR0hUTkVTU19NQVgsCi0JCS5zdGVwICAgID0gMSwKLSNkZWZpbmUgQlJJR0hUTkVTU19ERUYgMHgxMAotCQkuZGVmYXVsdF92YWx1ZSA9IEJSSUdIVE5FU1NfREVGLAotCSAgICB9LAotCSAgICAuc2V0ID0gc2Rfc2V0YnJpZ2h0bmVzcywKLQkgICAgLmdldCA9IHNkX2dldGJyaWdodG5lc3MsCi0JfSwKIC8qIFRoaXMgY29udHJvbCBpcyBmb3IgYm90aCB0aGUgNzMwMiBhbmQgdGhlIDczMTEgKi8KIAl7CiAJICAgIHsKQEAgLTEzMiwyMyArMTA1LDYgQEAKIAkgICAgLnNldCA9IHNkX3NldGNvbnRyYXN0LAogCSAgICAuZ2V0ID0gc2RfZ2V0Y29udHJhc3QsCiAJfSwKLS8qIFRoaXMgY29udHJvbCBpcyBwYWM3MzAyIG9ubHkgKi8KLSNkZWZpbmUgU0FUVVJBVElPTl9JRFggMgotCXsKLQkgICAgewotCQkuaWQgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgPSAiU2F0dXJhdGlvbiIsCi0JCS5taW5pbXVtID0gMCwKLSNkZWZpbmUgQ09MT1JfTUFYIDI1NQotCQkubWF4aW11bSA9IENPTE9SX01BWCwKLQkJLnN0ZXAgICAgPSAxLAotI2RlZmluZSBDT0xPUl9ERUYgMTI3Ci0JCS5kZWZhdWx0X3ZhbHVlID0gQ09MT1JfREVGLAotCSAgICB9LAotCSAgICAuc2V0ID0gc2Rfc2V0Y29sb3JzLAotCSAgICAuZ2V0ID0gc2RfZ2V0Y29sb3JzLAotCX0sCiAvKiBBbGwgY29udHJvbHMgYmVsb3cgYXJlIGZvciBib3RoIHRoZSA3MzAyIGFuZCB0aGUgNzMxMSAqLwogCXsKIAkgICAgewpAQCAtMjQ0LDEwMSArMjAwLDkgQEAKIAkJLnByaXYgPSAwfSwKIH07CiAKLS8qIHBhYyA3MzAyICovCi1zdGF0aWMgY29uc3QgX191OCBpbml0XzczMDJbXSA9IHsKLS8qCWluZGV4LHZhbHVlICovCi0JMHhmZiwgMHgwMSwJCS8qIHBhZ2UgMSAqLwotCTB4NzgsIDB4MDAsCQkvKiBkZWFjdGl2YXRlICovCi0JMHhmZiwgMHgwMSwKLQkweDc4LCAweDQwLAkJLyogbGVkIG9mZiAqLwotfTsKLXN0YXRpYyBjb25zdCBfX3U4IHN0YXJ0XzczMDJbXSA9IHsKLS8qCWluZGV4LCBsZW4sIFt2YWx1ZV0qICovCi0JMHhmZiwgMSwJMHgwMCwJCS8qIHBhZ2UgMCAqLwotCTB4MDAsIDEyLAkweDAxLCAweDQwLCAweDQwLCAweDQwLCAweDAxLCAweGUwLCAweDAyLCAweDgwLAotCQkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBkLCAyNCwJMHgwMywgMHgwMSwgMHgwMCwgMHhiNSwgMHgwNywgMHhjYiwgMHgwMCwgMHgwMCwKLQkJCTB4MDcsIDB4YzgsIDB4MDAsIDB4ZWEsIDB4MDcsIDB4Y2YsIDB4MDcsIDB4ZjcsCi0JCQkweDA3LCAweDdlLCAweDAxLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDExLAotCTB4MjYsIDIsCTB4YWEsIDB4YWEsCi0JMHgyZSwgMSwJMHgzMSwKLQkweDM4LCAxLAkweDAxLAotCTB4M2EsIDMsCTB4MTQsIDB4ZmYsIDB4NWEsCi0JMHg0MywgMTEsCTB4MDAsIDB4MGEsIDB4MTgsIDB4MTEsIDB4MDEsIDB4MmMsIDB4ODgsIDB4MTEsCi0JCQkweDAwLCAweDU0LCAweDExLAotCTB4NTUsIDEsCTB4MDAsCi0JMHg2MiwgNCwgCTB4MTAsIDB4MWUsIDB4MWUsIDB4MTgsCi0JMHg2YiwgMSwJMHgwMCwKLQkweDZlLCAzLAkweDA4LCAweDA2LCAweDAwLAotCTB4NzIsIDMsCTB4MDAsIDB4ZmYsIDB4MDAsCi0JMHg3ZCwgMjMsCTB4MDEsIDB4MDEsIDB4NTgsIDB4NDYsIDB4NTAsIDB4M2MsIDB4NTAsIDB4M2MsCi0JCQkweDU0LCAweDQ2LCAweDU0LCAweDU2LCAweDUyLCAweDUwLCAweDUyLCAweDUwLAotCQkJMHg1NiwgMHg2NCwgMHhhNCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwKLQkweGEyLCAxMCwJMHgyMiwgMHgyYywgMHgzYywgMHg1NCwgMHg2OSwgMHg3YywgMHg5YywgMHhiOSwKLQkJCTB4ZDIsIDB4ZWIsCi0JMHhhZiwgMSwJMHgwMiwKLQkweGI1LCAyLAkweDA4LCAweDA4LAotCTB4YjgsIDIsCTB4MDgsIDB4ODgsCi0JMHhjNCwgNCwJMHhhZSwgMHgwMSwgMHgwNCwgMHgwMSwKLQkweGNjLCAxLAkweDAwLAotCTB4ZDEsIDExLAkweDAxLCAweDMwLCAweDQ5LCAweDVlLCAweDZmLCAweDdmLCAweDhlLCAweGE5LAotCQkJMHhjMSwgMHhkNywgMHhlYywKLQkweGRjLCAxLAkweDAxLAotCTB4ZmYsIDEsCTB4MDEsCQkvKiBwYWdlIDEgKi8KLQkweDEyLCAzLAkweDAyLCAweDAwLCAweDAxLAotCTB4M2UsIDIsCTB4MDAsIDB4MDAsCi0JMHg3NiwgNSwJMHgwMSwgMHgyMCwgMHg0MCwgMHgwMCwgMHhmMiwKLQkweDdjLCAxLAkweDAwLAotCTB4N2YsIDEwLAkweDRiLCAweDBmLCAweDAxLCAweDJjLCAweDAyLCAweDU4LCAweDAzLCAweDIwLAotCQkJMHgwMiwgMHgwMCwKLQkweDk2LCA1LAkweDAxLCAweDEwLCAweDA0LCAweDAxLCAweDA0LAotCTB4YzgsIDE0LAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotCQkJMHgwNywgMHgwMCwgMHgwMSwgMHgwNywgMHgwNCwgMHgwMSwKLQkweGQ4LCAxLAkweDAxLAotCTB4ZGIsIDIsCTB4MDAsIDB4MDEsCi0JMHhkZSwgNywJMHgwMCwgMHgwMSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweGU2LCA0LAkweDAwLCAweDAwLCAweDAwLCAweDAxLAotCTB4ZWIsIDEsCTB4MDAsCi0JMHhmZiwgMSwJMHgwMiwJCS8qIHBhZ2UgMiAqLwotCTB4MjIsIDEsCTB4MDAsCi0JMHhmZiwgMSwJMHgwMywJCS8qIHBhZ2UgMyAqLwotCTB4MDAsIDI1NSwJCQkvKiBsb2FkIHRoZSBwYWdlIDMgKi8KLQkweDExLCAxLAkweDAxLAotCTB4ZmYsIDEsCTB4MDIsCQkvKiBwYWdlIDIgKi8KLQkweDEzLCAxLAkweDAwLAotCTB4MjIsIDQsCTB4MWYsIDB4YTQsIDB4ZjAsIDB4OTYsCi0JMHgyNywgMiwJMHgxNCwgMHgwYywKLQkweDJhLCA1LAkweGM4LCAweDAwLCAweDE4LCAweDEyLCAweDIyLAotCTB4NjQsIDgsCTB4MDAsIDB4MDAsIDB4ZjAsIDB4MDEsIDB4MTQsIDB4NDQsIDB4NDQsIDB4NDQsCi0JMHg2ZSwgMSwJMHgwOCwKLQkweGZmLCAxLAkweDAxLAkJLyogcGFnZSAxICovCi0JMHg3OCwgMSwJMHgwMCwKLQkwLCAwCQkJCS8qIGVuZCBvZiBzZXF1ZW5jZSAqLwotfTsKLQotLyogcGFnZSAzIC0gdGhlIHZhbHVlIDB4YWEgc2F5cyBza2lwIHRoZSBpbmRleCAtIHNlZSByZWdfd19wYWdlKCkgKi8KLXN0YXRpYyBjb25zdCBfX3U4IHBhZ2UzXzczMDJbXSA9IHsKLQkweDkwLCAweDQwLCAweDAzLCAweDUwLCAweGMyLCAweDAxLCAweDE0LCAweDE2LAotCTB4MTQsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MzMsIDB4MDAsCi0JMHgwZiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDAxLCAweGIzLCAweDAxLCAweDAwLAotCTB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MjEsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHg1NCwgMHhmNCwgMHgwMiwgMHg1MiwgMHg1NCwKLQkweGE0LCAweGI4LCAweGUwLCAweDJhLCAweGY2LCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhmYywgMHgwMCwgMHhmMiwgMHgxZiwgMHgwNCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDEwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHg0MCwgMHhmZiwgMHgwMywgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4YzgsIDB4YzgsCi0JMHhjOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MCwKLQkweDA4LCAweDEwLCAweDI0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDEsIDB4MDAsIDB4MDIsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAyLCAweGZhLCAweDAwLCAweDY0LCAweDVhLCAweDI4LCAweDAwLAotCTB4MDAKLX07CisjZGVmaW5lIExPQURfUEFHRTMJCTI1NQorI2RlZmluZSBMT0FEX1BBR0U0CQkyNTQKKyNkZWZpbmUgRU5EX09GX1NFUVVFTkNFCQkwCiAKIC8qIHBhYyA3MzExICovCiBzdGF0aWMgY29uc3QgX191OCBpbml0XzczMTFbXSA9IHsKQEAgLTM3OCwxMTkgKzI0MiwxNTQgQEAKIAkweGYwLCAxMywJMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgyMCwgMHgwMCwKIAkJCTB4M2YsIDB4MDAsIDB4MGEsIDB4MDEsIDB4MDAsCiAJMHhmZiwgMSwJMHgwNCwJCS8qIHBhZ2UgNCAqLwotCTB4MDAsIDI1NCwJCQkvKiBsb2FkIHRoZSBwYWdlIDQgKi8KKwkwLCBMT0FEX1BBR0U0LAkJCS8qIGxvYWQgdGhlIHBhZ2UgNCAqLwogCTB4MTEsIDEsCTB4MDEsCi0JMCwgMAkJCQkvKiBlbmQgb2Ygc2VxdWVuY2UgKi8KKwkwLCBFTkRfT0ZfU0VRVUVOQ0UJCS8qIGVuZCBvZiBzZXF1ZW5jZSAqLwogfTsKIAotLyogcGFnZSA0IC0gdGhlIHZhbHVlIDB4YWEgc2F5cyBza2lwIHRoZSBpbmRleCAtIHNlZSByZWdfd19wYWdlKCkgKi8KKyNkZWZpbmUgU0tJUAkJMHhhYQorLyogcGFnZSA0IC0gdGhlIHZhbHVlIFNLSVAgc2F5cyBza2lwIHRoZSBpbmRleCAtIHNlZSByZWdfd19wYWdlKCkgKi8KIHN0YXRpYyBjb25zdCBfX3U4IHBhZ2U0XzczMTFbXSA9IHsKLQkweGFhLCAweGFhLCAweDA0LCAweDU0LCAweDA3LCAweDJiLCAweDA5LCAweDBmLAotCTB4MDksIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjIsCi0JMHgwOCwgMHhhYSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAzLCAweGEwLCAweDAxLCAweGY0LCAweGFhLAotCTB4YWEsIDB4MDAsIDB4MDgsIDB4YWEsIDB4MDMsIDB4YWEsIDB4MDAsIDB4NjgsCisJU0tJUCwgU0tJUCwgMHgwNCwgMHg1NCwgMHgwNywgMHgyYiwgMHgwOSwgMHgwZiwKKwkweDA5LCAweDAwLCBTS0lQLCBTS0lQLCAweDA3LCAweDAwLCAweDAwLCAweDYyLAorCTB4MDgsIFNLSVAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHhhMCwgMHgwMSwgMHhmNCwgU0tJUCwKKwlTS0lQLCAweDAwLCAweDA4LCBTS0lQLCAweDAzLCBTS0lQLCAweDAwLCAweDY4LAogCTB4Y2EsIDB4MTAsIDB4MDYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAJMHgyMywgMHgyOCwgMHgwNCwgMHgxMSwgMHgwMCwgMHgwMAogfTsKIAotc3RhdGljIHZvaWQgcmVnX3dfYnVmKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKK3N0YXRpYyBpbnQgcmVnX3dfYnVmKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJICBfX3U4IGluZGV4LAogCQkgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKIHsKKwlpbnQgcmV0OworCiAJbWVtY3B5KGdzcGNhX2Rldi0+dXNiX2J1ZiwgYnVmZmVyLCBsZW4pOwotCXVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCiAJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAogCQkJMSwJCS8qIHJlcXVlc3QgKi8KIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCTAsCQkvKiB2YWx1ZSAqLwogCQkJaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuLAogCQkJNTAwKTsKKwlpZiAocmV0IDwgMCkKKwkJUERFQlVHKERfRVJSLCAicmVnX3dfYnVmKCk6ICIKKwkJIkZhaWxlZCB0byB3cml0ZSByZWdpc3RlcnMgdG8gaW5kZXggMHgleCwgZXJyb3IgJWkiLAorCQlpbmRleCwgcmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiAKLXN0YXRpYyB2b2lkIHJlZ193KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKK3N0YXRpYyBpbnQgcmVnX3coc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAogCQkgIF9fdTggaW5kZXgsCiAJCSAgX191OCB2YWx1ZSkKIHsKKwlpbnQgcmV0OworCiAJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gdmFsdWU7Ci0JdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCXJldCA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKIAkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCiAJCQkwLAkJCS8qIHJlcXVlc3QgKi8KIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCTAsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCiAJCQk1MDApOworCWlmIChyZXQgPCAwKQorCQlQREVCVUcoRF9FUlIsICJyZWdfdygpOiAiCisJCSJGYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXIgdG8gaW5kZXggMHgleCwgdmFsdWUgMHgleCwgZXJyb3IgJWkiLAorCQlpbmRleCwgdmFsdWUsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcmVnX3dfc2VxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKK3N0YXRpYyBpbnQgcmVnX3dfc2VxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJY29uc3QgX191OCAqc2VxLCBpbnQgbGVuKQogeworCWludCByZXQgPSAwOwogCXdoaWxlICgtLWxlbiA+PSAwKSB7Ci0JCXJlZ193KGdzcGNhX2Rldiwgc2VxWzBdLCBzZXFbMV0pOworCQlpZiAoMCA8PSByZXQpCisJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIHNlcVswXSwgc2VxWzFdKTsKIAkJc2VxICs9IDI7CiAJfQorCXJldHVybiByZXQ7CiB9CiAKIC8qIGxvYWQgdGhlIGJlZ2lubmluZyBvZiBhIHBhZ2UgKi8KLXN0YXRpYyB2b2lkIHJlZ193X3BhZ2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorc3RhdGljIGludCByZWdfd19wYWdlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCWNvbnN0IF9fdTggKnBhZ2UsIGludCBsZW4pCiB7CiAJaW50IGluZGV4OworCWludCByZXQgPSAwOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7Ci0JCWlmIChwYWdlW2luZGV4XSA9PSAweGFhKQkJLyogc2tpcCB0aGlzIGluZGV4ICovCisJCWlmIChwYWdlW2luZGV4XSA9PSBTS0lQKQkJLyogc2tpcCB0aGlzIGluZGV4ICovCiAJCQljb250aW51ZTsKIAkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gcGFnZVtpbmRleF07Ci0JCXVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAogCQkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCiAJCQkJMCwJCQkvKiByZXF1ZXN0ICovCiAJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkJMCwgaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCQk1MDApOworCQlpZiAocmV0IDwgMCkgeworCQkJUERFQlVHKERfRVJSLCAicmVnX3dfcGFnZSgpOiAiCisJCQkiRmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVyIHRvIGluZGV4IDB4JXgsICIKKwkJCSJ2YWx1ZSAweCV4LCBlcnJvciAlaSIsCisJCQlpbmRleCwgcGFnZVtpbmRleF0sIHJldCk7CisJCQlicmVhazsKKwkJfQogCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKiBvdXRwdXQgYSB2YXJpYWJsZSBzZXF1ZW5jZSAqLwotc3RhdGljIHZvaWQgcmVnX3dfdmFyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCWNvbnN0IF9fdTggKnNlcSkKK3N0YXRpYyBpbnQgcmVnX3dfdmFyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IF9fdTggKnNlcSwKKwkJCWNvbnN0IF9fdTggKnBhZ2UzLCB1bnNpZ25lZCBpbnQgcGFnZTNfbGVuLAorCQkJY29uc3QgX191OCAqcGFnZTQsIHVuc2lnbmVkIGludCBwYWdlNF9sZW4pCiB7CiAJaW50IGluZGV4LCBsZW47CisJaW50IHJldCA9IDA7CiAKIAlmb3IgKDs7KSB7CiAJCWluZGV4ID0gKnNlcSsrOwogCQlsZW4gPSAqc2VxKys7CiAJCXN3aXRjaCAobGVuKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybjsKLQkJY2FzZSAyNTQ6Ci0JCQlyZWdfd19wYWdlKGdzcGNhX2RldiwgcGFnZTRfNzMxMSwgc2l6ZW9mIHBhZ2U0XzczMTEpOworCQljYXNlIEVORF9PRl9TRVFVRU5DRToKKwkJCXJldHVybiByZXQ7CisJCWNhc2UgTE9BRF9QQUdFNDoKKwkJCXJldCA9IHJlZ193X3BhZ2UoZ3NwY2FfZGV2LCBwYWdlNCwgcGFnZTRfbGVuKTsKIAkJCWJyZWFrOwotCQljYXNlIDI1NToKLQkJCXJlZ193X3BhZ2UoZ3NwY2FfZGV2LCBwYWdlM183MzAyLCBzaXplb2YgcGFnZTNfNzMwMik7CisJCWNhc2UgTE9BRF9QQUdFMzoKKwkJCXJldCA9IHJlZ193X3BhZ2UoZ3NwY2FfZGV2LCBwYWdlMywgcGFnZTNfbGVuKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJaWYgKGxlbiA+IDY0KSB7CisJCQlpZiAobGVuID4gVVNCX0JVRl9TWikgewogCQkJCVBERUJVRyhEX0VSUnxEX1NUUkVBTSwKIAkJCQkJIkluY29ycmVjdCB2YXJpYWJsZSBzZXF1ZW5jZSIpOwotCQkJCXJldHVybjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCXdoaWxlIChsZW4gPiAwKSB7CiAJCQkJaWYgKGxlbiA8IDgpIHsKLQkJCQkJcmVnX3dfYnVmKGdzcGNhX2RldiwgaW5kZXgsIHNlcSwgbGVuKTsKKwkJCQkJcmV0ID0gcmVnX3dfYnVmKGdzcGNhX2RldiwKKwkJCQkJCWluZGV4LCBzZXEsIGxlbik7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIHJldDsKIAkJCQkJc2VxICs9IGxlbjsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCXJlZ193X2J1Zihnc3BjYV9kZXYsIGluZGV4LCBzZXEsIDgpOworCQkJCXJldCA9IHJlZ193X2J1Zihnc3BjYV9kZXYsIGluZGV4LCBzZXEsIDgpOwogCQkJCXNlcSArPSA4OwogCQkJCWluZGV4ICs9IDg7CiAJCQkJbGVuIC09IDg7CiAJCQl9CiAJCX0KKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCX0KIAkvKiBub3QgcmVhY2hlZCAqLwogfQogCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSB0aW1lICovCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSB0aW1lIGZvciBwYWM3MzExICovCiBzdGF0aWMgaW50IHNkX2NvbmZpZyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCiAJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CkBAIC00OTksMjIgKzM5OCwxMSBAQAogCiAJY2FtID0gJmdzcGNhX2Rldi0+Y2FtOwogCi0Jc2QtPnNlbnNvciA9IGlkLT5kcml2ZXJfaW5mbzsKLQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfUEFDNzMwMikgewotCQlQREVCVUcoRF9DT05GLCAiRmluZCBTZW5zb3IgUEFDNzMwMiIpOwotCQljYW0tPmNhbV9tb2RlID0gJnZnYV9tb2RlWzJdOwkvKiBvbmx5IDY0MHg0ODAgKi8KLQkJY2FtLT5ubW9kZXMgPSAxOwotCX0gZWxzZSB7Ci0JCVBERUJVRyhEX0NPTkYsICJGaW5kIFNlbnNvciBQQUM3MzExIik7Ci0JCWNhbS0+Y2FtX21vZGUgPSB2Z2FfbW9kZTsKLQkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKHZnYV9tb2RlKTsKLQkJZ3NwY2FfZGV2LT5jdHJsX2RpcyA9ICgxIDw8IEJSSUdIVE5FU1NfSURYKQotCQkJCXwgKDEgPDwgU0FUVVJBVElPTl9JRFgpOwotCX0KKwlQREVCVUcoRF9DT05GLCAiRmluZCBTZW5zb3IgUEFDNzMxMSIpOworCWNhbS0+Y2FtX21vZGUgPSB2Z2FfbW9kZTsKKwljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUodmdhX21vZGUpOwogCi0Jc2QtPmJyaWdodG5lc3MgPSBCUklHSFRORVNTX0RFRjsKIAlzZC0+Y29udHJhc3QgPSBDT05UUkFTVF9ERUY7Ci0Jc2QtPmNvbG9ycyA9IENPTE9SX0RFRjsKIAlzZC0+Z2FpbiA9IEdBSU5fREVGOwogCXNkLT5leHBvc3VyZSA9IEVYUE9TVVJFX0RFRjsKIAlzZC0+YXV0b2dhaW4gPSBBVVRPR0FJTl9ERUY7CkBAIC01MjMsOTEgKzQxMSw0NyBAQAogCXJldHVybiAwOwogfQogCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgcGFjNzMwMiBvbmx5ICovCi1zdGF0aWMgdm9pZCBzZXRicmlnaHRjb250KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0JaW50IGksIHY7Ci0Jc3RhdGljIGNvbnN0IF9fdTggbWF4WzEwXSA9Ci0JCXsweDI5LCAweDMzLCAweDQyLCAweDVhLCAweDZlLCAweDgwLCAweDlmLCAweGJiLAotCQkgMHhkNCwgMHhlY307Ci0Jc3RhdGljIGNvbnN0IF9fdTggZGVsdGFbMTBdID0KLQkJezB4MzUsIDB4MzMsIDB4MzMsIDB4MmYsIDB4MmEsIDB4MjUsIDB4MWUsIDB4MTcsCi0JCSAweDExLCAweDBifTsKLQotCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CS8qIHBhZ2UgMCAqLwotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCXYgPSBtYXhbaV07Ci0JCXYgKz0gKHNkLT5icmlnaHRuZXNzIC0gQlJJR0hUTkVTU19NQVgpCi0JCQkqIDE1MCAvIEJSSUdIVE5FU1NfTUFYOwkJLyogMjAwID8gKi8KLQkJdiAtPSBkZWx0YVtpXSAqIHNkLT5jb250cmFzdCAvIENPTlRSQVNUX01BWDsKLQkJaWYgKHYgPCAwKQotCQkJdiA9IDA7Ci0JCWVsc2UgaWYgKHYgPiAweGZmKQotCQkJdiA9IDB4ZmY7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHhhMiArIGksIHYpOwotCX0KLQlyZWdfdyhnc3BjYV9kZXYsIDB4ZGMsIDB4MDEpOwotfQotCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgcGFjNzMxMSBvbmx5ICovCi1zdGF0aWMgdm9pZCBzZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJldDsKIAotCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwNCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDEwLCBzZC0+Y29udHJhc3QgPj4gNCk7CisJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDA0KTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxMCwgc2QtPmNvbnRyYXN0ID4+IDQpOwogCS8qIGxvYWQgcmVnaXN0ZXJzIHRvIHNlbnNvciAoQml0IDAsIGF1dG8gY2xlYXIpICovCi0JcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxMSwgMHgwMSk7CisJcmV0dXJuIHJldDsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHBhYzczMDIgb25seSAqLwotc3RhdGljIHZvaWQgc2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCWludCBpLCB2OwotCXN0YXRpYyBjb25zdCBpbnQgYVs5XSA9Ci0JCXsyMTcsIC0yMTIsIDAsIC0xMDEsIDE3MCwgLTY3LCAtMzgsIC0zMTUsIDM1NX07Ci0Jc3RhdGljIGNvbnN0IGludCBiWzldID0KLQkJezE5LCAxMDYsIDAsIDE5LCAxMDYsIDEsIDE5LCAxMDYsIDF9OworCWludCBnYWluID0gR0FJTl9NQVggLSBzZC0+Z2FpbjsKKwlpbnQgcmV0OwogCi0JcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAzKTsJLyogcGFnZSAzICovCi0JcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOwkvKiBwYWdlIDAgKi8KLQlyZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOwkvKiBwYWdlIDAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7Ci0JCXYgPSBhW2ldICogc2QtPmNvbG9ycyAvIENPTE9SX01BWCArIGJbaV07Ci0JCXJlZ193KGdzcGNhX2RldiwgMHgwZiArIDIgKiBpLCAodiA+PiA4KSAmIDB4MDcpOwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4MGYgKyAyICogaSArIDEsIHYpOwotCX0KLQlyZWdfdyhnc3BjYV9kZXYsIDB4ZGMsIDB4MDEpOwotCVBERUJVRyhEX0NPTkZ8RF9TVFJFQU0sICJjb2xvcjogJWkiLCBzZC0+Y29sb3JzKTsKLX0KKwlpZiAoZ2FpbiA8IDEpCisJCWdhaW4gPSAxOworCWVsc2UgaWYgKGdhaW4gPiAyNDUpCisJCWdhaW4gPSAyNDU7CisJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDA0KTsJCS8qIHBhZ2UgNCAqLworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDBlLCAweDAwKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgwZiwgZ2Fpbik7CiAKLXN0YXRpYyB2b2lkIHNldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQUM3MzAyKSB7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMyk7CQkvKiBwYWdlIDMgKi8KLQkJcmVnX3coZ3NwY2FfZGV2LCAweDEwLCBzZC0+Z2FpbiA+PiAzKTsKLQl9IGVsc2UgewotCQlpbnQgZ2FpbiA9IEdBSU5fTUFYIC0gc2QtPmdhaW47Ci0JCWlmIChnYWluIDwgMSkKLQkJCWdhaW4gPSAxOwotCQllbHNlIGlmIChnYWluID4gMjQ1KQotCQkJZ2FpbiA9IDI0NTsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDA0KTsJCS8qIHBhZ2UgNCAqLwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4MGUsIDB4MDApOwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4MGYsIGdhaW4pOwotCX0KIAkvKiBsb2FkIHJlZ2lzdGVycyB0byBzZW5zb3IgKEJpdCAwLCBhdXRvIGNsZWFyKSAqLwotCXJlZ193KGdzcGNhX2RldiwgMHgxMSwgMHgwMSk7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MTEsIDB4MDEpOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgcmV0OwogCV9fdTggcmVnOwogCiAJLyogcmVnaXN0ZXIgMiBvZiBmcmFtZSAzLzQgY29udGFpbnMgdGhlIGNsb2NrIGRpdmlkZXIgY29uZmlndXJpbmcgdGhlCkBAIC02MTksOTcgKzQ2Myw5NCBAQAogCWVsc2UgaWYgKHJlZyA+IDYzKQogCQlyZWcgPSA2MzsKIAotCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQUM3MzAyKSB7Ci0JCS8qIE9uIHRoZSBwYWM3MzAyIHJlZzIgTVVTVCBiZSBhIG11bHRpcGxlIG9mIDMsIHNvIHJvdW5kIGl0IHRvCi0JCSAgIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDMsIGV4Y2VwdCB3aGVuIGJldHdlZW4gNiBhbmQgMTI/ICovCi0JCWlmIChyZWcgPCA2IHx8IHJlZyA+IDEyKQotCQkJcmVnID0gKChyZWcgKyAxKSAvIDMpICogMzsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAzKTsJCS8qIHBhZ2UgMyAqLwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDIsIHJlZyk7CisJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDA0KTsJCS8qIHBhZ2UgNCAqLworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDAyLCByZWcpOworCS8qIFBhZ2UgMSByZWdpc3RlciA4IG11c3QgYWx3YXlzIGJlIDB4MDggZXhjZXB0IHdoZW4gbm90IGluCisJICAgNjQweDQ4MCBtb2RlIGFuZCBQYWdlMy80IHJlZyAyIDw9IDMgdGhlbiBpdCBtdXN0IGJlIDkgKi8KKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7CisJaWYgKGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhpbnQpZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXYgJiYKKwkJCXJlZyA8PSAzKSB7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgwOCwgMHgwOSk7CiAJfSBlbHNlIHsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDA0KTsJCS8qIHBhZ2UgNCAqLwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDIsIHJlZyk7Ci0JCS8qIFBhZ2UgMSByZWdpc3RlciA4IG11c3QgYWx3YXlzIGJlIDB4MDggZXhjZXB0IHdoZW4gbm90IGluCi0JCSAgIDY0MHg0ODAgbW9kZSBhbmQgUGFnZTMvNCByZWcgMiA8PSAzIHRoZW4gaXQgbXVzdCBiZSA5ICovCi0JCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7Ci0JCWlmIChnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVsoaW50KWdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2ICYmCi0JCQkJcmVnIDw9IDMpCi0JCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDgsIDB4MDkpOwotCQllbHNlCi0JCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDgsIDB4MDgpOworCQlpZiAoMCA8PSByZXQpCisJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MDgsIDB4MDgpOwogCX0KKwogCS8qIGxvYWQgcmVnaXN0ZXJzIHRvIHNlbnNvciAoQml0IDAsIGF1dG8gY2xlYXIpICovCi0JcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxMSwgMHgwMSk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgc2V0aHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2V0aHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJldDsKIAlfX3U4IGRhdGE7CiAKLQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfUEFDNzMwMikgewotCQlyZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDMpOwkJLyogcGFnZSAzICovCi0JCWRhdGEgPSAoc2QtPmhmbGlwID8gMHgwOCA6IDB4MDApCi0JCQl8IChzZC0+dmZsaXAgPyAweDA0IDogMHgwMCk7Ci0JfSBlbHNlIHsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDA0KTsJCS8qIHBhZ2UgNCAqLwotCQlkYXRhID0gKHNkLT5oZmxpcCA/IDB4MDQgOiAweDAwKQotCQkJfCAoc2QtPnZmbGlwID8gMHgwOCA6IDB4MDApOwotCX0KLQlyZWdfdyhnc3BjYV9kZXYsIDB4MjEsIGRhdGEpOworCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwNCk7CQkvKiBwYWdlIDQgKi8KKwlkYXRhID0gKHNkLT5oZmxpcCA/IDB4MDQgOiAweDAwKSB8IChzZC0+dmZsaXAgPyAweDA4IDogMHgwMCk7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MjEsIGRhdGEpOwogCS8qIGxvYWQgcmVnaXN0ZXJzIHRvIHNlbnNvciAoQml0IDAsIGF1dG8gY2xlYXIpICovCi0JcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxMSwgMHgwMSk7CisJcmV0dXJuIHJldDsKIH0KIAotLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSBhbmQgcmVzdW1lIHRpbWUgZm9yIHBhYzczMTEgKi8KIHN0YXRpYyBpbnQgc2RfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0JaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX1BBQzczMDIpCi0JCXJlZ193X3NlcShnc3BjYV9kZXYsIGluaXRfNzMwMiwgc2l6ZW9mIGluaXRfNzMwMik7Ci0JZWxzZQotCQlyZWdfd19zZXEoZ3NwY2FfZGV2LCBpbml0XzczMTEsIHNpemVvZiBpbml0XzczMTEpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJlZ193X3NlcShnc3BjYV9kZXYsIGluaXRfNzMxMSwgc2l6ZW9mKGluaXRfNzMxMSkvMik7CiB9CiAKIHN0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgcmV0OwogCiAJc2QtPnNvZl9yZWFkID0gMDsKIAotCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQUM3MzAyKSB7Ci0JCXJlZ193X3Zhcihnc3BjYV9kZXYsIHN0YXJ0XzczMDIpOwotCQlzZXRicmlnaHRjb250KGdzcGNhX2Rldik7Ci0JCXNldGNvbG9ycyhnc3BjYV9kZXYpOwotCX0gZWxzZSB7Ci0JCXJlZ193X3Zhcihnc3BjYV9kZXYsIHN0YXJ0XzczMTEpOwotCQlzZXRjb250cmFzdChnc3BjYV9kZXYpOwotCX0KLQlzZXRnYWluKGdzcGNhX2Rldik7Ci0Jc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKLQlzZXRodmZsaXAoZ3NwY2FfZGV2KTsKKwlyZXQgPSByZWdfd192YXIoZ3NwY2FfZGV2LCBzdGFydF83MzExLAorCQlOVUxMLCAwLAorCQlwYWdlNF83MzExLCBzaXplb2YocGFnZTRfNzMxMSkpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gc2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHNldGdhaW4oZ3NwY2FfZGV2KTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSBzZXRodmZsaXAoZ3NwY2FfZGV2KTsKIAogCS8qIHNldCBjb3JyZWN0IHJlc29sdXRpb24gKi8KIAlzd2l0Y2ggKGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhpbnQpIGdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2KSB7CiAJY2FzZSAyOgkJCQkJLyogMTYweDEyMCBwYWM3MzExICovCi0JCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHgxNywgMHgyMCk7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHg4NywgMHgxMCk7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxNywgMHgyMCk7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHg4NywgMHgxMCk7CiAJCWJyZWFrOwogCWNhc2UgMToJCQkJCS8qIDMyMHgyNDAgcGFjNzMxMSAqLwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDEpOwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4MTcsIDB4MzApOwotCQlyZWdfdyhnc3BjYV9kZXYsIDB4ODcsIDB4MTEpOworCQlpZiAoMCA8PSByZXQpCisJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDEpOworCQlpZiAoMCA8PSByZXQpCisJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MTcsIDB4MzApOworCQlpZiAoMCA8PSByZXQpCisJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ODcsIDB4MTEpOwogCQlicmVhazsKIAljYXNlIDA6CQkJCQkvKiA2NDB4NDgwICovCi0JCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQUM3MzAyKQotCQkJYnJlYWs7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHgxNywgMHgwMCk7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHg4NywgMHgxMik7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgxNywgMHgwMCk7CisJCWlmICgwIDw9IHJldCkKKwkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHg4NywgMHgxMik7CiAJCWJyZWFrOwogCX0KIApAQCAtNzE4LDQ3ICs1NTksNDIgQEAKIAlhdG9taWNfc2V0KCZzZC0+YXZnX2x1bSwgLTEpOwogCiAJLyogc3RhcnQgc3RyZWFtICovCi0JcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAxKTsKLQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfUEFDNzMwMikKLQkJcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDAxKTsKLQllbHNlCi0JCXJlZ193KGdzcGNhX2RldiwgMHg3OCwgMHgwNSk7Ci0JcmV0dXJuIDA7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDEpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDA1KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJldDsKIAotCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQUM3MzAyKSB7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHg3OCwgMHgwMCk7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHg3OCwgMHgwMCk7Ci0JCXJldHVybjsKLQl9Ci0JcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDA0KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MjcsIDB4ODApOwotCXJlZ193KGdzcGNhX2RldiwgMHgyOCwgMHhjYSk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDI5LCAweDUzKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MmEsIDB4MGUpOwotCXJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDNlLCAweDIwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4NzgsIDB4NDQpOyAvKiBCaXRfMD1zdGFydCBzdHJlYW0sIEJpdF82PUxFRCAqLwotCXJlZ193KGdzcGNhX2RldiwgMHg3OCwgMHg0NCk7IC8qIEJpdF8wPXN0YXJ0IHN0cmVhbSwgQml0XzY9TEVEICovCi0JcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDQ0KTsgLyogQml0XzA9c3RhcnQgc3RyZWFtLCBCaXRfNj1MRUQgKi8KKwlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDQpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDI3LCAweDgwKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHgyOCwgMHhjYSk7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MjksIDB4NTMpOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDJhLCAweDBlKTsKKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7CisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4M2UsIDB4MjApOworCWlmICgwIDw9IHJldCkKKwkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDQ0KTsgLyogQml0XzA9c3RhcnQgc3RyZWFtLCBCaXRfNj1MRUQgKi8KKwlpZiAoMCA8PSByZXQpCisJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHg3OCwgMHg0NCk7IC8qIEJpdF8wPXN0YXJ0IHN0cmVhbSwgQml0XzY9TEVEICovCisJaWYgKDAgPD0gcmV0KQorCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4NzgsIDB4NDQpOyAvKiBCaXRfMD1zdGFydCBzdHJlYW0sIEJpdF82PUxFRCAqLwogfQogCi0vKiBjYWxsZWQgb24gc3RyZWFtb2ZmIHdpdGggYWx0IDAgYW5kIG9uIGRpc2Nvbm5lY3QgKi8KKy8qIGNhbGxlZCBvbiBzdHJlYW1vZmYgd2l0aCBhbHQgMCBhbmQgb24gZGlzY29ubmVjdCBmb3IgNzMxMSAqLwogc3RhdGljIHZvaWQgc2Rfc3RvcDAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCWlmICghZ3NwY2FfZGV2LT5wcmVzZW50KQotCQlyZXR1cm47Ci0JaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX1BBQzczMDIpIHsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAxKTsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDQwKTsKLQl9CiB9CiAKIC8qIEluY2x1ZGUgcGFjIGNvbW1vbiBzb2YgZGV0ZWN0aW9uIGZ1bmN0aW9ucyAqLwpAQCAtNzczLDIyICs2MDksOCBAQAogCWlmIChhdmdfbHVtID09IC0xKQogCQlyZXR1cm47CiAKLQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfUEFDNzMwMikgewotCQlkZXNpcmVkX2x1bSA9IDI3MCArIHNkLT5icmlnaHRuZXNzICogNDsKLQkJLyogSGFjayBoYWNrLCB3aXRoIHRoZSA3MjAyIHRoZSBmaXJzdCBleHBvc3VyZSBzdGVwIGlzCi0JCSAgIHByZXR0eSBsYXJnZSwgc28gaWYgd2UncmUgYWJvdXQgdG8gbWFrZSB0aGUgZmlyc3QKLQkJICAgZXhwb3N1cmUgaW5jcmVhc2UgbWFrZSB0aGUgZGVhZHpvbmUgbGFyZ2UgdG8gYXZvaWQKLQkJICAgb3NjaWxhdGluZyAqLwotCQlpZiAoZGVzaXJlZF9sdW0gPiBhdmdfbHVtICYmIHNkLT5nYWluID09IEdBSU5fREVGICYmCi0JCQkJc2QtPmV4cG9zdXJlID4gRVhQT1NVUkVfREVGICYmCi0JCQkJc2QtPmV4cG9zdXJlIDwgNDIpCi0JCQlkZWFkem9uZSA9IDkwOwotCQllbHNlCi0JCQlkZWFkem9uZSA9IDMwOwotCX0gZWxzZSB7Ci0JCWRlc2lyZWRfbHVtID0gMjAwOwotCQlkZWFkem9uZSA9IDIwOwotCX0KKwlkZXNpcmVkX2x1bSA9IDIwMDsKKwlkZWFkem9uZSA9IDIwOwogCiAJaWYgKHNkLT5hdXRvZ2Fpbl9pZ25vcmVfZnJhbWVzID4gMCkKIAkJc2QtPmF1dG9nYWluX2lnbm9yZV9mcmFtZXMtLTsKQEAgLTc5Nyw1MyArNjE5LDkyIEBACiAJCXNkLT5hdXRvZ2Fpbl9pZ25vcmVfZnJhbWVzID0gUEFDX0FVVE9HQUlOX0lHTk9SRV9GUkFNRVM7CiB9CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBhYzczMTFfanBlZ19oZWFkZXIxW10gPSB7Ci0gIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4YzAsIDB4MDAsIDB4MTEsIDB4MDgKKy8qIEpQRUcgaGVhZGVyLCBwYXJ0IDEgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBhY19qcGVnX2hlYWRlcjFbXSA9IHsKKyAgMHhmZiwgMHhkOCwJCS8qIFNPSTogU3RhcnQgb2YgSW1hZ2UgKi8KKworICAweGZmLCAweGMwLAkJLyogU09GMDogU3RhcnQgb2YgRnJhbWUgKEJhc2VsaW5lIERDVCkgKi8KKyAgMHgwMCwgMHgxMSwJCS8qIGxlbmd0aCA9IDE3IGJ5dGVzIChpbmNsdWRpbmcgdGhpcyBsZW5ndGggZmllbGQpICovCisgIDB4MDgJCQkvKiBQcmVjaXNpb246IDggKi8KKyAgLyogMiBieXRlcyBpcyBwbGFjZWQgaGVyZTogbnVtYmVyIG9mIGltYWdlIGxpbmVzICovCisgIC8qIDIgYnl0ZXMgaXMgcGxhY2VkIGhlcmU6IHNhbXBsZXMgcGVyIGxpbmUgKi8KIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBhYzczMTFfanBlZ19oZWFkZXIyW10gPSB7Ci0gIDB4MDMsIDB4MDEsIDB4MjEsIDB4MDAsIDB4MDIsIDB4MTEsIDB4MDEsIDB4MDMsIDB4MTEsIDB4MDEsIDB4ZmYsIDB4ZGEsCi0gIDB4MDAsIDB4MGMsIDB4MDMsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MTEsIDB4MDMsIDB4MTEsIDB4MDAsIDB4M2YsIDB4MDAKKy8qIEpQRUcgaGVhZGVyLCBjb250aW51ZWQgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBhY19qcGVnX2hlYWRlcjJbXSA9IHsKKyAgMHgwMywJCQkvKiBOdW1iZXIgb2YgaW1hZ2UgY29tcG9uZW50czogMyAqLworICAweDAxLCAweDIxLCAweDAwLAkvKiBJRD0xLCBTdWJzYW1wbGluZyAxeDEsIFF1YW50aXphdGlvbiB0YWJsZTogMCAqLworICAweDAyLCAweDExLCAweDAxLAkvKiBJRD0yLCBTdWJzYW1wbGluZyAyeDEsIFF1YW50aXphdGlvbiB0YWJsZTogMSAqLworICAweDAzLCAweDExLCAweDAxLAkvKiBJRD0zLCBTdWJzYW1wbGluZyAyeDEsIFF1YW50aXphdGlvbiB0YWJsZTogMSAqLworCisgIDB4ZmYsIDB4ZGEsCQkvKiBTT1M6IFN0YXJ0IE9mIFNjYW4gKi8KKyAgMHgwMCwgMHgwYywJCS8qIGxlbmd0aCA9IDEyIGJ5dGVzIChpbmNsdWRpbmcgdGhpcyBsZW5ndGggZmllbGQpICovCisgIDB4MDMsCQkJLyogbnVtYmVyIG9mIGNvbXBvbmVudHM6IDMgKi8KKyAgMHgwMSwgMHgwMCwJCS8qIHNlbGVjdG9yIDEsIHRhYmxlIDB4MDAgKi8KKyAgMHgwMiwgMHgxMSwJCS8qIHNlbGVjdG9yIDIsIHRhYmxlIDB4MTEgKi8KKyAgMHgwMywgMHgxMSwJCS8qIHNlbGVjdG9yIDMsIHRhYmxlIDB4MTEgKi8KKyAgMHgwMCwgMHgzZiwJCS8qIFNwZWN0cmFsIHNlbGVjdGlvbjogMCAuLiA2MyAqLworICAweDAwCQkJLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uOiAwICovCiB9OwogCitzdGF0aWMgdm9pZCBwYWNfc3RhcnRfZnJhbWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAorCQlfX3UxNiBsaW5lcywgX191MTYgc2FtcGxlc19wZXJfbGluZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcGJ1Zls0XTsKKworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKKwkJcGFjX2pwZWdfaGVhZGVyMSwgc2l6ZW9mKHBhY19qcGVnX2hlYWRlcjEpKTsKKworCXRtcGJ1ZlswXSA9IGxpbmVzID4+IDg7CisJdG1wYnVmWzFdID0gbGluZXMgJiAweGZmOworCXRtcGJ1ZlsyXSA9IHNhbXBsZXNfcGVyX2xpbmUgPj4gODsKKwl0bXBidWZbM10gPSBzYW1wbGVzX3Blcl9saW5lICYgMHhmZjsKKworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKKwkJdG1wYnVmLCBzaXplb2YodG1wYnVmKSk7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQlwYWNfanBlZ19oZWFkZXIyLCBzaXplb2YocGFjX2pwZWdfaGVhZGVyMikpOworfQorCiAvKiB0aGlzIGZ1bmN0aW9uIGlzIHJ1biBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwotCQkJX191OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLworCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJdW5zaWduZWQgY2hhciAqc29mOworCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7CiAKLQlzb2YgPSBwYWNfZmluZF9zb2YoZ3NwY2FfZGV2LCBkYXRhLCBsZW4pOworCXNvZiA9IHBhY19maW5kX3NvZigmc2QtPnNvZl9yZWFkLCBkYXRhLCBsZW4pOwogCWlmIChzb2YpIHsKLQkJdW5zaWduZWQgY2hhciB0bXBidWZbNF07CiAJCWludCBuLCBsdW1fb2Zmc2V0LCBmb290ZXJfbGVuZ3RoOwogCi0JCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQUM3MzAyKSB7Ci0JCSAgLyogNiBieXRlcyBhZnRlciB0aGUgRkYgRDkgRU9GIG1hcmtlciBhIG51bWJlciBvZiBsdW1pbmF0aW9uCi0JCSAgICAgYnl0ZXMgYXJlIHNlbmQgY29ycmVzcG9uZGluZyB0byBkaWZmZXJlbnQgcGFydHMgb2YgdGhlCi0JCSAgICAgaW1hZ2UsIHRoZSAxNHRoIGFuZCAxNXRoIGJ5dGUgYWZ0ZXIgdGhlIEVPRiBzZWVtIHRvCi0JCSAgICAgY29ycmVzcG9uZCB0byB0aGUgY2VudGVyIG9mIHRoZSBpbWFnZSAqLwotCQkgIGx1bV9vZmZzZXQgPSA2MSArIHNpemVvZiBwYWNfc29mX21hcmtlcjsKLQkJICBmb290ZXJfbGVuZ3RoID0gNzQ7Ci0JCX0gZWxzZSB7Ci0JCSAgbHVtX29mZnNldCA9IDI0ICsgc2l6ZW9mIHBhY19zb2ZfbWFya2VyOwotCQkgIGZvb3Rlcl9sZW5ndGggPSAyNjsKKwkJZnJhbWUgPSBnc3BjYV9nZXRfaV9mcmFtZShnc3BjYV9kZXYpOworCQlpZiAoZnJhbWUgPT0gTlVMTCkgeworCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCQlyZXR1cm47CiAJCX0KIAorCQkvKiA2IGJ5dGVzIGFmdGVyIHRoZSBGRiBEOSBFT0YgbWFya2VyIGEgbnVtYmVyIG9mIGx1bWluYXRpb24KKwkJICAgYnl0ZXMgYXJlIHNlbmQgY29ycmVzcG9uZGluZyB0byBkaWZmZXJlbnQgcGFydHMgb2YgdGhlCisJCSAgIGltYWdlLCB0aGUgMTR0aCBhbmQgMTV0aCBieXRlIGFmdGVyIHRoZSBFT0Ygc2VlbSB0bworCQkgICBjb3JyZXNwb25kIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGltYWdlICovCisJCWx1bV9vZmZzZXQgPSAyNCArIHNpemVvZiBwYWNfc29mX21hcmtlcjsKKwkJZm9vdGVyX2xlbmd0aCA9IDI2OworCiAJCS8qIEZpbmlzaCBkZWNvZGluZyBjdXJyZW50IGZyYW1lICovCiAJCW4gPSAoc29mIC0gZGF0YSkgLSAoZm9vdGVyX2xlbmd0aCArIHNpemVvZiBwYWNfc29mX21hcmtlcik7CiAJCWlmIChuIDwgMCkgewogCQkJZnJhbWUtPmRhdGFfZW5kICs9IG47CiAJCQluID0gMDsKIAkJfQotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKIAkJCQkJZGF0YSwgbik7CiAJCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgIT0gRElTQ0FSRF9QQUNLRVQgJiYKIAkJCQlmcmFtZS0+ZGF0YV9lbmRbLTJdID09IDB4ZmYgJiYKIAkJCQlmcmFtZS0+ZGF0YV9lbmRbLTFdID09IDB4ZDkpCi0JCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAogCQkJCQkJTlVMTCwgMCk7CiAKIAkJbiA9IHNvZiAtIGRhdGE7CkBAIC04NTksNDMgKzcyMCwxMCBAQAogCQkJYXRvbWljX3NldCgmc2QtPmF2Z19sdW0sIC0xKTsKIAogCQkvKiBTdGFydCB0aGUgbmV3IGZyYW1lIHdpdGggdGhlIGpwZWcgaGVhZGVyICovCi0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsCi0JCQlwYWM3MzExX2pwZWdfaGVhZGVyMSwgc2l6ZW9mKHBhYzczMTFfanBlZ19oZWFkZXIxKSk7Ci0JCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQUM3MzAyKSB7Ci0JCQkvKiBUaGUgUEFDNzMwMiBoYXMgdGhlIGltYWdlIHJvdGF0ZWQgOTAgZGVncmVlcyAqLwotCQkJdG1wYnVmWzBdID0gZ3NwY2FfZGV2LT53aWR0aCA+PiA4OwotCQkJdG1wYnVmWzFdID0gZ3NwY2FfZGV2LT53aWR0aCAmIDB4ZmY7Ci0JCQl0bXBidWZbMl0gPSBnc3BjYV9kZXYtPmhlaWdodCA+PiA4OwotCQkJdG1wYnVmWzNdID0gZ3NwY2FfZGV2LT5oZWlnaHQgJiAweGZmOwotCQl9IGVsc2UgewotCQkJdG1wYnVmWzBdID0gZ3NwY2FfZGV2LT5oZWlnaHQgPj4gODsKLQkJCXRtcGJ1ZlsxXSA9IGdzcGNhX2Rldi0+aGVpZ2h0ICYgMHhmZjsKLQkJCXRtcGJ1ZlsyXSA9IGdzcGNhX2Rldi0+d2lkdGggPj4gODsKLQkJCXRtcGJ1ZlszXSA9IGdzcGNhX2Rldi0+d2lkdGggJiAweGZmOwotCQl9Ci0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIHRtcGJ1ZiwgNCk7Ci0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCi0JCQlwYWM3MzExX2pwZWdfaGVhZGVyMiwgc2l6ZW9mKHBhYzczMTFfanBlZ19oZWFkZXIyKSk7CisJCXBhY19zdGFydF9mcmFtZShnc3BjYV9kZXYsIGZyYW1lLAorCQkJZ3NwY2FfZGV2LT5oZWlnaHQsIGdzcGNhX2Rldi0+d2lkdGgpOwogCX0KLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOwotfQotCi1zdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Jc2QtPmJyaWdodG5lc3MgPSB2YWw7Ci0JaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotCQlzZXRicmlnaHRjb250KGdzcGNhX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0JKnZhbCA9IHNkLT5icmlnaHRuZXNzOwotCXJldHVybiAwOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIGludCBzZF9zZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTkwNCwxMCArNzMyLDcgQEAKIAogCXNkLT5jb250cmFzdCA9IHZhbDsKIAlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpIHsKLQkJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX1BBQzczMDIpCi0JCQlzZXRicmlnaHRjb250KGdzcGNhX2Rldik7Ci0JCWVsc2UKLQkJCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7CisJCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtOTIwLDI0ICs3NDUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX3NldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQlzZC0+Y29sb3JzID0gdmFsOwotCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0Y29sb3JzKGdzcGNhX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RfZ2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQkqdmFsID0gc2QtPmNvbG9yczsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzZF9zZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKQEAgLTEwNDEsNyArODQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiAqLworLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiBmb3IgcGFjNzMxMSAqLwogc3RhdGljIHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2MgPSB7CiAJLm5hbWUgPSBNT0RVTEVfTkFNRSwKIAkuY3RybHMgPSBzZF9jdHJscywKQEAgLTEwNTcsMjEgKzg2NCwxMiBAQAogCiAvKiAtLSBtb2R1bGUgaW5pdGlhbGlzYXRpb24gLS0gKi8KIHN0YXRpYyBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0gewotCXtVU0JfREVWSUNFKDB4MDZmOCwgMHgzMDA5KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjAwKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjAxKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjAzKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjA4KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjBlKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjBmKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIwKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIxKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIyKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI0KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI2KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI5KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjJhKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAotCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjJjKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjAwKX0sCisJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MDEpfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYwMyl9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjA4KX0sCisJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MGUpfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYwZil9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhY19jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjX2NvbW1vbi5oCmluZGV4IDM0ZDRiMTQuLjIwZjY3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjX2NvbW1vbi5oCkBAIC0zMywyNiArMzMsMTAxIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwYWNfc29mX21hcmtlcls1XSA9CiAJCXsgMHhmZiwgMHhmZiwgMHgwMCwgMHhmZiwgMHg5NiB9OwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqcGFjX2ZpbmRfc29mKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKy8qCisgICBUaGUgZm9sbG93aW5nIHN0YXRlIG1hY2hpbmUgZmluZHMgdGhlIFNPRiBtYXJrZXIgc2VxdWVuY2UKKyAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4OTYgaW4gYSBieXRlIHN0cmVhbS4KKworCSAgICstLS0tLS0tLS0tKworCSAgIHwgMDogU1RBUlQgfDwtLS0tLS0tLS0tLS0tLS1cCisJICAgKy0tLS0tLS0tLS0rPC1cICAgICAgICAgICAgIHwKKwkgICAgIHwgICAgICAgXC0tLS9vdGhlcndpc2UgICAgfAorCSAgICAgdiAweGZmICAgICAgICAgICAgICAgICAgICB8CisJICAgKy0tLS0tLS0tLS0rIG90aGVyd2lzZSAgICAgIHwKKwkgICB8ICAgICAxICAgIHwtLS0tLS0tLS0tLS0tLS0+KgorCSAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICBeCisJICAgKy0tLS0tLS0tLS0rICAgICAgICAgICAgICAgIHwKKwkgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAgICAgdiAweGZmICAgICAgICAgICAgICAgICAgICB8CisJICAgKy0tLS0tLS0tLS0rPC1cMHhmZiAgICAgICAgIHwKKwkvLT58ICAgICAgICAgIHwtLS8gICAgICAgICAgICAgfAorCXwgIHwgICAgIDIgICAgfC0tLS0tLS0tLS0tLS0tLT4qCisJfCAgfCAgICAgICAgICB8IG90aGVyd2lzZSAgICAgIF4KKwl8ICArLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgfAorCXwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisJfCAgICB2IDB4MDAgICAgICAgICAgICAgICAgICAgIHwKKwl8ICArLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgfAorCXwgIHwgICAgIDMgICAgfCAgICAgICAgICAgICAgICB8CisJfCAgfCAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tPioKKwl8ICArLS0tLS0tLS0tLSsgb3RoZXJ3aXNlICAgICAgXgorCXwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAweGZmIHwgICAgdiAweGZmICAgICAgICAgICAgICAgICAgICB8CisJfCAgKy0tLS0tLS0tLS0rICAgICAgICAgICAgICAgIHwKKwlcLS18ICAgICA0ICAgIHwgICAgICAgICAgICAgICAgfAorCSAgIHwgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0vCisJICAgKy0tLS0tLS0tLS0rIG90aGVyd2lzZQorCSAgICAgfAorCSAgICAgdiAweDk2CisJICAgKy0tLS0tLS0tLS0rCisJICAgfCAgRk9VTkQgICB8CisJICAgKy0tLS0tLS0tLS0rCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFjX2ZpbmRfc29mKHU4ICpzb2ZfcmVhZCwKIAkJCQkJdW5zaWduZWQgY2hhciAqbSwgaW50IGxlbikKIHsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJaW50IGk7CiAKIAkvKiBTZWFyY2ggZm9yIHRoZSBTT0YgbWFya2VyIChmaXhlZCBwYXJ0KSBpbiB0aGUgaGVhZGVyICovCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChtW2ldID09IHBhY19zb2ZfbWFya2VyW3NkLT5zb2ZfcmVhZF0pIHsKLQkJCXNkLT5zb2ZfcmVhZCsrOwotCQkJaWYgKHNkLT5zb2ZfcmVhZCA9PSBzaXplb2YocGFjX3NvZl9tYXJrZXIpKSB7CisJCXN3aXRjaCAoKnNvZl9yZWFkKSB7CisJCWNhc2UgMDoKKwkJCWlmIChtW2ldID09IDB4ZmYpCisJCQkJKnNvZl9yZWFkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAobVtpXSA9PSAweGZmKQorCQkJCSpzb2ZfcmVhZCA9IDI7CisJCQllbHNlCisJCQkJKnNvZl9yZWFkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzd2l0Y2ggKG1baV0pIHsKKwkJCWNhc2UgMHgwMDoKKwkJCQkqc29mX3JlYWQgPSAzOworCQkJCWJyZWFrOworCQkJY2FzZSAweGZmOgorCQkJCS8qIHN0YXkgaW4gdGhpcyBzdGF0ZSAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkqc29mX3JlYWQgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWlmIChtW2ldID09IDB4ZmYpCisJCQkJKnNvZl9yZWFkID0gNDsKKwkJCWVsc2UKKwkJCQkqc29mX3JlYWQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXN3aXRjaCAobVtpXSkgeworCQkJY2FzZSAweDk2OgorCQkJCS8qIFBhdHRlcm4gZm91bmQgKi8KIAkJCQlQREVCVUcoRF9GUkFNLAogCQkJCQkiU09GIGZvdW5kLCBieXRlcyB0byBhbmFseXplOiAldS4iCiAJCQkJCSIgRnJhbWUgc3RhcnRzIGF0IGJ5dGUgIyV1IiwKIAkJCQkJbGVuLCBpICsgMSk7Ci0JCQkJc2QtPnNvZl9yZWFkID0gMDsKKwkJCQkqc29mX3JlYWQgPSAwOwogCQkJCXJldHVybiBtICsgaSArIDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4ZmY6CisJCQkJKnNvZl9yZWFkID0gMjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJKnNvZl9yZWFkID0gMDsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCXNkLT5zb2ZfcmVhZCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSpzb2ZfcmVhZCA9IDA7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc245YzIweC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKaW5kZXggY2RhZDNkYi4uYjE5NDRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKQEAgLTIzNDIsNyArMjM0Miw2IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwogCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KIHsKQEAgLTIzNzgsMjIgKzIzNzcsMjIgQEAKIAkJYXZnX2x1bSA+Pj0gOTsKIAkJYXRvbWljX3NldCgmc2QtPmF2Z19sdW0sIGF2Z19sdW0pOwogCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKLQkJCQlmcmFtZSwgZGF0YSwgbGVuKTsKKwkJCQlkYXRhLCBsZW4pOwogCQlyZXR1cm47CiAJfQogCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQpIHsKIAkJaWYgKGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhpbnQpIGdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2CiAJCQkJJiBNT0RFX0pQRUcpIHsKLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsCisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCiAJCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7Ci0JCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLAorCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAogCQkJCWRhdGEsIGxlbik7CiAJCX0gZWxzZSB7Ci0JCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLAorCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAogCQkJCWRhdGEsIGxlbik7CiAJCX0KIAl9IGVsc2UgewotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIGxlbik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGIuYwppbmRleCBjZjNhZjhkLi41YmU5NWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhiLmMKQEAgLTMwNCw3ICszMDQsNyBAQAogfTsKIHN0YXRpYyBjb25zdCBfX3U4IG92NjY1MF9zZW5zb3JfaW5pdFtdWzhdID0KIHsKLQkvKiBCcmlnaHQsIGNvbnRyYXN0LCBldGMgYXJlIHNldCB0aHJvdWd0aCBTQ0JCIGludGVyZmFjZS4KKwkvKiBCcmlnaHQsIGNvbnRyYXN0LCBldGMgYXJlIHNldCB0aHJvdWdoIFNDQkIgaW50ZXJmYWNlLgogCSAqIEFWQ0FQIG9uIHdpbjIgZG8gbm90IHNlbmQgYW55IGRhdGEgb24gdGhpcyAJY29udHJvbHMuICovCiAJLyogQW55d2F5LCBzb21lIHJlZ2lzdGVycyBhcHBlYXJzIHRvIGFsdGVyIGJyaWdodCBhbmQgY29uc3RyYXQgKi8KIApAQCAtOTk1LDggKzk5NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwotCQkJdW5zaWduZWQgY2hhciAqZGF0YSwJCS8qIGlzb2MgcGFja2V0ICovCisJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCWludCBpOwpAQCAtMTA1NCwxMiArMTA1MywxMiBAQAogCQkJCQlwa3RfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCQkJCX0KIAotCQkJCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGt0X3R5cGUsCi0JCQkJCQkJZnJhbWUsIGRhdGEsIDApOworCQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIHBrdF90eXBlLAorCQkJCQkJTlVMTCwgMCk7CiAJCQkJZGF0YSArPSBpICsgZnJfaF9zejsKIAkJCQlsZW4gLT0gaSArIGZyX2hfc3o7CiAJCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAotCQkJCQkJZnJhbWUsIGRhdGEsIGxlbik7CisJCQkJCQlkYXRhLCBsZW4pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtMTA2OCwxNSArMTA2NywyMSBAQAogCWlmIChjYW0tPmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2ICYgTU9ERV9SQVcpIHsKIAkJLyogSW4gcmF3IG1vZGUgd2Ugc29tZXRpbWVzIGdldCBzb21lIGdhcmJhZ2UgYWZ0ZXIgdGhlIGZyYW1lCiAJCSAgIGlnbm9yZSB0aGlzICovCi0JCWludCB1c2VkID0gZnJhbWUtPmRhdGFfZW5kIC0gZnJhbWUtPmRhdGE7CisJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7CisJCWludCB1c2VkOwogCQlpbnQgc2l6ZSA9IGNhbS0+Y2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnNpemVpbWFnZTsKIAorCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7CisJCWlmIChmcmFtZSA9PSBOVUxMKSB7CisJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKKwkJCXJldHVybjsKKwkJfQorCQl1c2VkID0gZnJhbWUtPmRhdGFfZW5kIC0gZnJhbWUtPmRhdGE7CiAJCWlmICh1c2VkICsgbGVuID4gc2l6ZSkKIAkJCWxlbiA9IHNpemUgLSB1c2VkOwogCX0KIAotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKLQkJCWZyYW1lLCBkYXRhLCBsZW4pOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKaW5kZXggMzNmNGQwYS4uMGJkMzZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCkBAIC0xLDggKzEsOCBAQAogLyoKLSAqCQlTb25peCBzbjljMTAycCBzbjljMTA1IHNuOWMxMjAgKGpwZWcpIGxpYnJhcnkKLSAqCQlDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGVsIFhoYWFyZCBteGhhYXJkQG1hZ2ljLmZyCisgKiBTb25peCBzbjljMTAycCBzbjljMTA1IHNuOWMxMjAgKGpwZWcpIHN1YmRyaXZlcgogICoKLSAqIFY0TDIgYnkgSmVhbi1GcmFuY29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBKZWFuLUZyYW5jb2lzIE1vaW5lIDxodHRwOi8vbW9pbmVqZi5mcmVlLmZyPgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1pY2hlbCBYaGFhcmQgbXhoYWFyZEBtYWdpYy5mcgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNzIsOCArNzIsOSBAQAogI2RlZmluZSBTRU5TT1JfT1Y3NjMwIDUKICNkZWZpbmUgU0VOU09SX09WNzY0OCA2CiAjZGVmaW5lIFNFTlNPUl9PVjc2NjAgNwotI2RlZmluZSBTRU5TT1JfU1A4MDcwOCA4Ci0JdTggaTJjX2Jhc2U7CisjZGVmaW5lIFNFTlNPUl9QTzEwMzAgOAorI2RlZmluZSBTRU5TT1JfU1A4MDcwOCA5CisJdTggaTJjX2FkZHI7CiAKIAl1OCAqanBlZ19oZHI7CiB9OwpAQCAtMjUwLDcgKzI1MSw3IEBACiAJCS5taW5pbXVtID0gMCwKIAkJLm1heGltdW0gPSAyLAkvKiAwOiAwLCAxOiA1MEh6LCAyOjYwSHogKi8KIAkJLnN0ZXAgICAgPSAxLAotI2RlZmluZSBGUkVRX0RFRiAyCisjZGVmaW5lIEZSRVFfREVGIDEKIAkJLmRlZmF1bHRfdmFsdWUgPSBGUkVRX0RFRiwKIAkgICAgfSwKIAkgICAgLnNldCA9IHNkX3NldGZyZXEsCkBAIC0yNzcsNyArMjc4LDkgQEAKIAkoMSA8PCBBVVRPR0FJTl9JRFgpIHwgKDEgPDwgSU5GUkFSRURfSURYKSB8ICgxIDw8IFZGTElQX0lEWCksCiAJCQkJCQkvKiBTRU5TT1JfT1Y3NjYwIDcgKi8KIAkoMSA8PCBBVVRPR0FJTl9JRFgpIHwgKDEgPDwgSU5GUkFSRURfSURYKSB8ICgxIDw8IFZGTElQX0lEWCkgfAotCQkJICAgICAgKDEgPDwgRlJFUV9JRFgpLAkvKiBTRU5TT1JfU1A4MDcwOCA4ICovCisJCQkgICAgICAoMSA8PCBGUkVRX0lEWCksCS8qIFNFTlNPUl9QTzEwMzAgOCAqLworCSgxIDw8IEFVVE9HQUlOX0lEWCkgfCAoMSA8PCBJTkZSQVJFRF9JRFgpIHwgKDEgPDwgVkZMSVBfSURYKSB8CisJCQkgICAgICAoMSA8PCBGUkVRX0lEWCksCS8qIFNFTlNPUl9TUDgwNzA4IDkgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CkBAIC0zMDQsNyArMzA3LDcgQEAKIC8qCXJlZzAJcmVnMQlyZWcyCXJlZzMJcmVnNAlyZWc1CXJlZzYJcmVnNyAqLwogCTB4MDAsCTB4MDMsCTB4NjQsCTB4MDAsCTB4MWEsCTB4MjAsCTB4MjAsCTB4MjAsCiAvKglyZWc4CXJlZzkJcmVnYQlyZWdiCXJlZ2MJcmVnZAlyZWdlCXJlZ2YgKi8KLQkweGExLAkweDExLAkweDAyLAkweDA5LAkweDAwLAkweDAwLAkweDAwLAkweDEwLAorCTB4ODEsCTB4MTEsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCiAvKglyZWcxMAlyZWcxMQlyZWcxMglyZWcxMwlyZWcxNAlyZWcxNQlyZWcxNglyZWcxNyAqLwogCTB4MDMsCTB4MDAsCTB4MDAsCTB4MDEsCTB4MDMsCTB4MjgsCTB4MWUsCTB4NDEsCiAvKglyZWcxOAlyZWcxOQlyZWcxYQlyZWcxYiAqLwpAQCAtMzE1LDcgKzMxOCw3IEBACiAvKglyZWcwCXJlZzEJcmVnMglyZWczCXJlZzQJcmVnNQlyZWc2CXJlZzcgKi8KIAkweDAwLAkweDYxLAkweDQ0LAkweDAwLAkweDFhLAkweDIwLAkweDIwLAkweDIwLAogLyoJcmVnOAlyZWc5CXJlZ2EJcmVnYglyZWdjCXJlZ2QJcmVnZQlyZWdmICovCi0JMHhiMSwJMHg1ZCwJMHgwNywJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgxMCwKKwkweDgxLAkweDVkLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAogLyoJcmVnMTAJcmVnMTEJcmVnMTIJcmVnMTMJcmVnMTQJcmVnMTUJcmVnMTYJcmVnMTcgKi8KIAkweDAzLAkweDAwLAkweDAwLAkweDAyLAkweDBhLAkweDI4LAkweDFlLAkweDYxLAogLyoJcmVnMTgJcmVnMTkJcmVnMWEJcmVnMWIgKi8KQEAgLTMzNyw3ICszNDAsNyBAQAogLyoJcmVnMAlyZWcxCXJlZzIJcmVnMwlyZWc0CXJlZzUJcmVnNglyZWc3ICovCiAJMHgwMCwJMHg2MSwJMHg0MCwJMHgwMCwJMHgxYSwJMHgyMCwJMHgyMCwJMHgyMCwKIC8qCXJlZzgJcmVnOQlyZWdhCXJlZ2IJcmVnYwlyZWdkCXJlZ2UJcmVnZiAqLwotCTB4ODEsCTB4NWMsCTB4MDcsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCisJMHg4MSwJMHg1YywJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwKIC8qCXJlZzEwCXJlZzExCXJlZzEyCXJlZzEzCXJlZzE0CXJlZzE1CXJlZzE2CXJlZzE3ICovCiAJMHgwMywJMHgwMCwJMHgwMCwJMHgwMiwJMHgxYywJMHgyOCwJMHgxZSwJMHg0MCwKIC8qCXJlZzE4CXJlZzE5CXJlZzFhCXJlZzFiICovCkBAIC0zNDYsNyArMzQ5LDcgQEAKIAogc3RhdGljIGNvbnN0IHU4IHNuX29tNjgwMlsweDFjXSA9IHsKIC8qCXJlZzAJcmVnMQlyZWcyCXJlZzMJcmVnNAlyZWc1CXJlZzYJcmVnNyAqLwotCTB4MDAsCTB4MjMsCTB4NzIsCTB4MDAsCTB4MWEsCTB4MzQsCTB4MjcsCTB4MjAsCisJMHgwMCwJMHgyMywJMHg3MiwJMHgwMCwJMHgxYSwJMHgyMCwJMHgyMCwJMHgxOSwKIC8qCXJlZzgJcmVnOQlyZWdhCXJlZ2IJcmVnYwlyZWdkCXJlZ2UJcmVnZiAqLwogCTB4ODAsCTB4MzQsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCiAvKglyZWcxMAlyZWcxMQlyZWcxMglyZWcxMwlyZWcxNAlyZWcxNQlyZWcxNglyZWcxNyAqLwpAQCAtMzU5LDcgKzM2Miw3IEBACiAvKglyZWcwCXJlZzEJcmVnMglyZWczCXJlZzQJcmVnNQlyZWc2CXJlZzcgKi8KIAkweDAwLAkweDIxLAkweDQwLAkweDAwLAkweDFhLAkweDIwLAkweDFmLAkweDIwLAogLyoJcmVnOAlyZWc5CXJlZ2EJcmVnYglyZWdjCXJlZ2QJcmVnZQlyZWdmICovCi0JMHhhMSwJMHgyMSwJMHg3NiwJMHgyMSwJMHgwMCwJMHgwMCwJMHgwMCwJMHgxMCwKKwkweDgxLAkweDIxLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAogLyoJcmVnMTAJcmVnMTEJcmVnMTIJcmVnMTMJcmVnMTQJcmVnMTUJcmVnMTYJcmVnMTcgKi8KIAkweDAzLAkweDAwLAkweDA0LAkweDAxLAkweDBhLAkweDI4LAkweDFlLAkweGMyLAogLyoJcmVnMTgJcmVnMTkJcmVnMWEJcmVnMWIgKi8KQEAgLTM3MCw3ICszNzMsNyBAQAogLyoJcmVnMAlyZWcxCXJlZzIJcmVnMwlyZWc0CXJlZzUJcmVnNglyZWc3ICovCiAJMHgwMCwJMHg2MywJMHg0MCwJMHgwMCwJMHgxYSwJMHgyMCwJMHgyMCwJMHgyMCwKIC8qCXJlZzgJcmVnOQlyZWdhCXJlZ2IJcmVnYwlyZWdkCXJlZ2UJcmVnZiAqLwotCTB4ODEsCTB4MjEsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MTAsCisJMHg4MSwJMHgyMSwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwKIC8qCXJlZzEwCXJlZzExCXJlZzEyCXJlZzEzCXJlZzE0CXJlZzE1CXJlZzE2CXJlZzE3ICovCiAJMHgwMywJMHgwMCwJMHgwMCwJMHgwMSwJMHgwMCwJMHgyOCwJMHgxZSwJMHgwMCwKIC8qCXJlZzE4CXJlZzE5CXJlZzFhCXJlZzFiICovCkBAIC0zODgsMTEgKzM5MSwyMiBAQAogCTB4MDcsCTB4MDAsCTB4MDAsCTB4MDAKIH07CiAKK3N0YXRpYyBjb25zdCB1OCBzbl9wbzEwMzBbMHgxY10gPSB7CisvKglyZWcwCXJlZzEJcmVnMglyZWczCXJlZzQJcmVnNQlyZWc2CXJlZzcgKi8KKwkweDAwLAkweDIxLAkweDYyLAkweDAwLAkweDFhLAkweDIwLAkweDIwLAkweDIwLAorLyoJcmVnOAlyZWc5CXJlZ2EJcmVnYglyZWdjCXJlZ2QJcmVnZQlyZWdmICovCisJMHg4MSwJMHg2ZSwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwKKy8qCXJlZzEwCXJlZzExCXJlZzEyCXJlZzEzCXJlZzE0CXJlZzE1CXJlZzE2CXJlZzE3ICovCisJMHgwMywJMHgwMCwJMHgwMCwJMHgwNiwJMHgwNiwJMHgyOCwJMHgxZSwJMHgwMCwKKy8qCXJlZzE4CXJlZzE5CXJlZzFhCXJlZzFiICovCisJMHgwNywJMHgwMCwJMHgwMCwJMHgwMAorfTsKKwogc3RhdGljIGNvbnN0IHU4IHNuX3NwODA3MDhbMHgxY10gPSB7CiAvKglyZWcwCXJlZzEJcmVnMglyZWczCXJlZzQJcmVnNQlyZWc2CXJlZzcgKi8KIAkweDAwLAkweDYzLAkweDYwLAkweDAwLAkweDFhLAkweDIwLAkweDIwLAkweDIwLAogLyoJcmVnOAlyZWc5CXJlZ2EJcmVnYglyZWdjCXJlZ2QJcmVnZQlyZWdmICovCi0JMHg4MSwJMHgxOCwJMHgwNywJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwKKwkweDgxLAkweDE4LAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAogLyoJcmVnMTAJcmVnMTEJcmVnMTIJcmVnMTMJcmVnMTQJcmVnMTUJcmVnMTYJcmVnMTcgKi8KIAkweDAzLAkweDAwLAkweDAwLAkweDAzLAkweDA0LAkweDI4LAkweDFlLAkweDAwLAogLyoJcmVnMTgJcmVnMTkJcmVnMWEJcmVnMWIgKi8KQEAgLTQwOSw2ICs0MjMsNyBAQAogCXNuX292NzYzMCwKIAlzbl9vdjc2NDgsCiAJc25fb3Y3NjYwLAorCXNuX3BvMTAzMCwKIAlzbl9zcDgwNzA4CiB9OwogCkBAIC00NTUsNyArNDcwLDcgQEAKIAogCXsweGExLCAweDExLCAweDAxLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhhMSwgMHgxMSwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4YTEsIDB4MTEsIDB4MjEsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGExLCAweDExLCAweDIxLCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhhMSwgMHgxMSwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YTEsIDB4MTEsIDB4MjMsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCkBAIC00NjQsNiArNDc5LDggQEAKIAl7MHhhMSwgMHgxMSwgMHgyMSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YTEsIDB4MTEsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGExLCAweDExLCAweDIzLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhhMSwgMHgxMSwgMHgwMSwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJCQkJCQkJLyogc2V0IHNlbnNvciBjbG9jayAqLwogCXt9CiB9Owogc3RhdGljIGNvbnN0IHU4IG1pMDM2MF9zZW5zb3JfaW5pdFtdWzhdID0gewpAQCAtNTQ1LDcgKzU2Miw3IEBACiB9Owogc3RhdGljIGNvbnN0IHU4IG10OXYxMTFfc2Vuc29yX2luaXRbXVs4XSA9IHsKIAl7MHhiMSwgMHg1YywgMHgwZCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIHJlc2V0PyAqLwotCS8qIGRlbGF5IDIwIG1zICovCisJezB4ZGQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiBkZWxheSAyMG1zICovCiAJezB4YjEsIDB4NWMsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGIxLCAweDVjLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDEwfSwgLyogSUZQIHNlbGVjdCAqLwogCXsweGIxLCAweDVjLCAweDA4LCAweDA0LCAweDgwLCAweDAwLCAweDAwLCAweDEwfSwgLyogb3V0cHV0IGZtdCBjdHJsICovCkBAIC01NzIsNyArNTg5LDkgQEAKIAl7MHhiMSwgMHg1YywgMHgxZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIGRpZ2l0YWwgem9vbSAqLwogCXsweGIxLCAweDVjLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgLyogcmVhZCBtb2RlICovCiAJezB4YjEsIDB4NWMsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCS8qKioqKioqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IHU4IG10OXYxMTFfc2Vuc29yX3BhcmFtMVtdWzhdID0gewogCXsweGIxLCAweDVjLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhiMSwgMHg1YywgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YjEsIDB4NWMsIDB4MDksIDB4MDEsIDB4MmMsIDB4MDAsIDB4MDAsIDB4MTB9LApAQCAtNTg1LDE0ICs2MDQsMjAgQEAKIAl7MHhiMSwgMHg1YywgMHgzNSwgMHgwMSwgMHhjMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIGdsb2JhbCBnYWluICovCiAJe30KIH07CitzdGF0aWMgY29uc3QgdTggb202ODAyX2luaXQwWzJdWzhdID0geworLypmaXhtZTogdmFyaWFibGUqLworCXsweGEwLCAweDM0LCAweDI5LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhhMCwgMHgzNCwgMHgyMywgMHhiMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCit9Owogc3RhdGljIGNvbnN0IHU4IG9tNjgwMl9zZW5zb3JfaW5pdFtdWzhdID0gewotCXsweGEwLCAweDM0LCAweDkwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhhMCwgMHgzNCwgMHg0OSwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4YTAsIDB4MzQsIDB4NWEsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGEwLCAweDM0LCAweGRmLCAweDZkLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwkJCQkJCS8qIGZhY3RvcnkgbW9kZSAqLwogCXsweGEwLCAweDM0LCAweGRkLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwkJCQkJCS8qIG91dHB1dCByYXcgUkdCICovCisJezB4YTAsIDB4MzQsIDB4NWEsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogLyoJezB4YTAsIDB4MzQsIDB4ZmIsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAqLwogCXsweGEwLCAweDM0LCAweGYwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQkJCQkJLyogd2hpdGUgYmFsYW5jZSAmIGF1dG8tZXhwb3N1cmUgKi8KKwkJLyogYXV0by1leHBvc3VyZSBzcGVlZCAoMCkgLyB3aGl0ZSBiYWxhbmNlIG1vZGUgKGF1dG8gUkdCKSAqLwogLyoJezB4YTAsIDB4MzQsIDB4ZjEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCQkJCQkJCSAqIHNldCBjb2xvciBtb2RlICovCiAvKgl7MHhhMCwgMHgzNCwgMHhmZSwgMHg1YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCkBAIC02MDYsMjYgKzYzMSwyOSBAQAogLyoJezB4YTAsIDB4MzQsIDB4ZTgsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCQkJCQkJCSAqIHByZXNldCBnYW1tYSAqLwogCXsweGEwLCAweDM0LCAweGU5LCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQkJCQkJLyogbHVtaW5hbmNlIG1vZGUgKDB4NGYgPSBBRSkgKi8KKwkJCQkvKiBsdW1pbmFuY2UgbW9kZSAoMHg0ZiAtPiBBdXRvRXhwbyBvbikgKi8KIAl7MHhhMCwgMHgzNCwgMHhlNCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJCQkJCQkJLyogcHJlc2V0IHNodXR0ZXIgKi8KIC8qCXsweGEwLCAweDM0LCAweGVmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAkJCQkJCQkgKiBhdXRvIGZyYW1lIHJhdGUgKi8KIC8qCXsweGEwLCAweDM0LCAweGZiLCAweGVlLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgKi8KLQotLyoJezB4YTAsIDB4MzQsIDB4NzEsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAqLwotLyoJezB4YTAsIDB4MzQsIDB4NzIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAqLwotLyoJezB4YTAsIDB4MzQsIDB4NjgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAqLwotLyoJezB4YTAsIDB4MzQsIDB4NjksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAqLworCXsweGEwLCAweDM0LCAweDVkLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7fQorfTsKK3N0YXRpYyBjb25zdCB1OCBvbTY4MDJfc2Vuc29yX3BhcmFtMVtdWzhdID0geworCXsweGEwLCAweDM0LCAweDcxLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhhMCwgMHgzNCwgMHg3MiwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4YTAsIDB4MzQsIDB4NjgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGEwLCAweDM0LCAweDY5LCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7fQogfTsKIHN0YXRpYyBjb25zdCB1OCBvdjc2MzBfc2Vuc29yX2luaXRbXVs4XSA9IHsKIAl7MHhhMSwgMHgyMSwgMHg3NiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YTEsIDB4MjEsIDB4MTIsIDB4YzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotLyogd2luOiBkZWxheSAyMG1zICovCisJezB4ZGQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiBkZWxheSAyMG1zICovCiAJezB4YTEsIDB4MjEsIDB4MTIsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGExLCAweDIxLCAweDEyLCAweGM4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLS8qIHdpbjogZGVsYXkgMjBtcyAqLworCXsweGRkLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogZGVsYXkgMjBtcyAqLwogCXsweGExLCAweDIxLCAweDEyLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIC8qIHdpbjogaTJjX3IgZnJvbSAwMCB0byA4MCAqLwogCXsweGQxLCAweDIxLCAweDAzLCAweDgwLCAweDEwLCAweDIwLCAweDgwLCAweDEwfSwKQEAgLTY3Nyw2ICs3MDUsNyBAQAogc3RhdGljIGNvbnN0IHU4IG92NzY0OF9zZW5zb3JfaW5pdFtdWzhdID0gewogCXsweGExLCAweDIxLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhhMSwgMHgyMSwgMHgxMiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCS8qIHJlc2V0ICovCisJezB4ZGQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiBkZWxheSAyMG1zICovCiAJezB4YTEsIDB4MjEsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGQxLCAweDIxLCAweDAzLCAweGE0LCAweDMwLCAweDg4LCAweDAwLCAweDEwfSwKIAl7MHhiMSwgMHgyMSwgMHgxMSwgMHg4MCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMH0sCkBAIC03MDEsNyArNzMwLDkgQEAKIC8qCXsweGQxLCAweDIxLCAweDI1LCAweDgwLCAweDMyLCAweGZlLCAweGEwLCAweDEwfSwgamZtIGRvbmUgKi8KIC8qCXsweGQxLCAweDIxLCAweDI5LCAweDAwLCAweDkxLCAweDAwLCAweDg4LCAweDEwfSwgamZtIGRvbmUgKi8KIC8qCXsweGIxLCAweDIxLCAweDJkLCAweDg1LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgc2V0IGJ5IHNldGZyZXEgKi8KLS8qLi4uKi8KKwl7fQorfTsKK3N0YXRpYyBjb25zdCB1OCBvdjc2NDhfc2Vuc29yX3BhcmFtMVtdWzhdID0gewogLyoJezB4YTEsIDB4MjEsIDB4MTIsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCBqZm0gZG9uZSAqLwogLyoJezB4YTEsIDB4MjEsIDB4NzUsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAgICogQ09NTgogCQkJCQkJCSAqIHNldCBieSBzZXR2ZmxpcCAqLwpAQCAtNzIzLDcgKzc1NCw3IEBACiAKIHN0YXRpYyBjb25zdCB1OCBvdjc2NjBfc2Vuc29yX2luaXRbXVs4XSA9IHsKIAl7MHhhMSwgMHgyMSwgMHgxMiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIHJlc2V0IFNDQ0IgKi8KLS8qCQkoZGVsYXkgMjBtcykgKi8KKwl7MHhkZCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIGRlbGF5IDIwbXMgKi8KIAl7MHhhMSwgMHgyMSwgMHgxMiwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJCQkJCQkvKiBPdXRmb3JtYXQgPSByYXdSR0IgKi8KIAl7MHhhMSwgMHgyMSwgMHgxMywgMHhiOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIGluaXQgQ09NOCAqLwpAQCAtNzgzLDggKzgxNCwxMSBAQAogCXsweGMxLCAweDIxLCAweDg4LCAweGFmLCAweGM3LCAweGRmLCAweDAwLCAweDEwfSwgLyogZ2FtbWEgY3VydmUgKi8KIAl7MHhjMSwgMHgyMSwgMHg4YiwgMHg5OSwgMHg5OSwgMHhjZiwgMHgwMCwgMHgxMH0sIC8qIHJlc2VydmVkICovCiAJezB4YjEsIDB4MjEsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAvKiBETV9MTkwvSCAqLworLyogbm90IGluIGFsbCBtcy13aW4gdHJhY2VzKi8KIAl7MHhhMSwgMHgyMSwgMHhhMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0vKioqKioqIChzb21lIGV4Y2hhbmdlcyBpbiB0aGUgd2luIHRyYWNlKSAqKioqKiovCisJe30KK307CitzdGF0aWMgY29uc3QgdTggb3Y3NjYwX3NlbnNvcl9wYXJhbTFbXVs4XSA9IHsKIAl7MHhhMSwgMHgyMSwgMHgxZSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIE1WRlAgKi8KIAkJCQkJCS8qIGJpdHNbMy4uMF1yZXNlcnZlZCAqLwogCXsweGExLCAweDIxLCAweDFlLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKQEAgLTc5Nyw2ICs4MzEsNyBAQAogCXsweGExLCAweDIxLCAweDAwLCAweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgLyogR0FJTiAqLwogLyoJezB4YjEsIDB4MjEsIDB4MDEsIDB4NzgsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MTB9LCAqIEJMVUUgKi8KIC8qKioqKiogKHNvbWUgZXhjaGFuZ2VzIGluIHRoZSB3aW4gdHJhY2UpICoqKioqKi8KKy8qZml4bWU6cGFyYW0yKi8KIAl7MHhhMSwgMHgyMSwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sLyogZHVtbXkgbGluZSBoaWdodCAqLwogCXsweGExLCAweDIxLCAweDkyLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgLyogZHVtbXkgbGluZSBsb3cgKi8KIAl7MHhhMSwgMHgyMSwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIEVYSENIICovCkBAIC04MDQsNiArODM5LDcgQEAKIC8qCXsweGExLCAweDIxLCAweDAyLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgICogUkVEICovCiAvKioqKioqIChzb21lIGV4Y2hhbmdlcyBpbiB0aGUgd2luIHRyYWNlKSAqKioqKiovCiAvKioqKioqISEgc3RhcnRzZW5zb3IgS08gaWYgY2hhbmdlZCAhISoqKiovCisvKmZpeG1lOiBwYXJhbTMqLwogCXsweGExLCAweDIxLCAweDkzLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhhMSwgMHgyMSwgMHg5MiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YTEsIDB4MjEsIDB4MmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LApAQCAtODExLDYgKzg0Nyw2MCBAQAogCXt9CiB9OwogCitzdGF0aWMgY29uc3QgdTggcG8xMDMwX3NlbnNvcl9pbml0W11bOF0gPSB7CisvKiB0aGUgc2Vuc29yIHJlZ2lzdGVycyBhcmUgZGVzY3JpYmVkIGluIG01NjAyL201NjAyX3BvMTAzMC5oICovCisJezB4YTEsIDB4NmUsIDB4M2YsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAvKiBzZW5zb3IgcmVzZXQgKi8KKwl7MHhkZCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qIGRlbGF5IDIwbXMgKi8KKwl7MHhhMSwgMHg2ZSwgMHgzZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4YTEsIDB4NmUsIDB4M2UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGQxLCAweDZlLCAweDA0LCAweDAyLCAweGIxLCAweDAyLCAweDM5LCAweDEwfSwKKwl7MHhkMSwgMHg2ZSwgMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4ZDEsIDB4NmUsIDB4MGMsIDB4MDIsIDB4N2YsIDB4MDEsIDB4ZTAsIDB4MTB9LAorCXsweGQxLCAweDZlLCAweDEyLCAweDAzLCAweDAyLCAweDAwLCAweDAzLCAweDEwfSwKKwl7MHhkMSwgMHg2ZSwgMHgxNiwgMHg4NSwgMHg0MCwgMHg0YSwgMHg0MCwgMHgxMH0sIC8qIHIvZzEvYi9nMiBnYWlucyAqLworCXsweGMxLCAweDZlLCAweDFhLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhkMSwgMHg2ZSwgMHgxZCwgMHgwOCwgMHgwMywgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4ZDEsIDB4NmUsIDB4MjMsIDB4MDAsIDB4YjAsIDB4MDAsIDB4OTQsIDB4MTB9LAorCXsweGQxLCAweDZlLCAweDI3LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhiMSwgMHg2ZSwgMHgyYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4ZDEsIDB4NmUsIDB4MmQsIDB4MTQsIDB4MzUsIDB4NjEsIDB4ODQsIDB4MTB9LCAvKiBnYW1tYSBjb3JyICovCisJezB4ZDEsIDB4NmUsIDB4MzEsIDB4YTIsIDB4YmQsIDB4ZDgsIDB4ZmYsIDB4MTB9LAorCXsweGQxLCAweDZlLCAweDM1LCAweDA2LCAweDFlLCAweDEyLCAweDAyLCAweDEwfSwgLyogY29sb3IgbWF0cml4ICovCisJezB4ZDEsIDB4NmUsIDB4MzksIDB4YWEsIDB4NTMsIDB4MzcsIDB4ZDUsIDB4MTB9LAorCXsweGExLCAweDZlLCAweDNkLCAweGYyLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhkMSwgMHg2ZSwgMHgzZSwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMywgMHgxMH0sCisJezB4ZDEsIDB4NmUsIDB4NDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGMxLCAweDZlLCAweDQ2LCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDEwfSwKKwl7MHhkMSwgMHg2ZSwgMHg0YiwgMHgwMiwgMHhlZiwgMHgwOCwgMHhjZCwgMHgxMH0sCisJezB4ZDEsIDB4NmUsIDB4NGYsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4YTAsIDB4MTB9LAorCXsweGQxLCAweDZlLCAweDUzLCAweDAxLCAweGFhLCAweDAxLCAweDQwLCAweDEwfSwKKwl7MHhkMSwgMHg2ZSwgMHg1YSwgMHg1MCwgMHgwNCwgMHgzMCwgMHgwMywgMHgxMH0sIC8qIHJhdyByZ2IgYmF5ZXIgKi8KKwl7MHhhMSwgMHg2ZSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4ZDEsIDB4NmUsIDB4NWYsIDB4MTAsIDB4NDAsIDB4ZmYsIDB4MDAsIDB4MTB9LAorCisJezB4ZDEsIDB4NmUsIDB4NjMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGQxLCAweDZlLCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhkMSwgMHg2ZSwgMHg2YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4ZDEsIDB4NmUsIDB4NmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGMxLCAweDZlLCAweDczLCAweDEwLCAweDgwLCAweGViLCAweDAwLCAweDEwfSwKKwl7fQorfTsKK3N0YXRpYyBjb25zdCB1OCBwbzEwMzBfc2Vuc29yX3BhcmFtMVtdWzhdID0geworLyogZnJvbSBtcy13aW4gdHJhY2VzIC0gdGhlc2UgdmFsdWVzIGNoYW5nZSB3aXRoIGF1dG8gZ2Fpbi9leHBvL3diLi4gKi8KKwl7MHhhMSwgMHg2ZSwgMHgxZSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4YTEsIDB4NmUsIDB4MWUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorLyogbWVhbiB2YWx1ZXMgKi8KKwl7MHhjMSwgMHg2ZSwgMHgxYSwgMHgwMiwgMHhkNCwgMHhhNCwgMHgwMCwgMHgxMH0sIC8qIGludGVnbGluZXMgKi8KKwl7MHhhMSwgMHg2ZSwgMHgxNSwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIGdsb2JhbCBnYWluICovCisJezB4YzEsIDB4NmUsIDB4MTYsIDB4NDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MTB9LCAvKiByL2cxL2IgZ2FpbnMgKi8KKworCXsweGExLCAweDZlLCAweDFkLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgLyogY29udHJvbDEgKi8KKwl7MHhhMSwgMHg2ZSwgMHgwNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qIGZyYW1laGVpZ2h0ICovCisJezB4YTEsIDB4NmUsIDB4MDcsIDB4ZDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorLyoJezB4YzEsIDB4NmUsIDB4MTYsIDB4NDksIDB4NDAsIDB4NDUsIDB4MDAsIDB4MTB9LCAqLworCXt9Cit9OworCiBzdGF0aWMgY29uc3QgdTggc3A4MDcwOF9zZW5zb3JfaW5pdFtdWzhdID0gewogCXsweGExLCAweDE4LCAweDA2LCAweGY5LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhhMSwgMHgxOCwgMHgwOSwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCkBAIC04ODMsNyArOTczLDkgQEAKIAl7MHhhMSwgMHgxOCwgMHg2NywgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YTEsIDB4MTgsIDB4NjgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGExLCAweDE4LCAweDJmLCAweGM5LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQkvKioqKioqKiovCisJe30KK307CitzdGF0aWMgY29uc3QgdTggc3A4MDcwOF9zZW5zb3JfcGFyYW0xW11bOF0gPSB7CiAJezB4YTEsIDB4MTgsIDB4MGMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGExLCAweDE4LCAweDBjLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhhMSwgMHgxOCwgMHgwMywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCkBAIC04OTQsNiArOTg2LDE5IEBACiAJe30KIH07CiAKK3N0YXRpYyBjb25zdCB1OCAoKnNlbnNvcl9pbml0WzEwXSlbOF0gPSB7CisJaHY3MTMxcl9zZW5zb3JfaW5pdCwJLyogSFY3MTMxUiAwICovCisJbWkwMzYwX3NlbnNvcl9pbml0LAkvKiBNSTAzNjAgMSAqLworCW1vNDAwMF9zZW5zb3JfaW5pdCwJLyogTU80MDAwIDIgKi8KKwltdDl2MTExX3NlbnNvcl9pbml0LAkvKiBNVDlWMTExIDMgKi8KKwlvbTY4MDJfc2Vuc29yX2luaXQsCS8qIE9NNjgwMiA0ICovCisJb3Y3NjMwX3NlbnNvcl9pbml0LAkvKiBPVjc2MzAgNSAqLworCW92NzY0OF9zZW5zb3JfaW5pdCwJLyogT1Y3NjQ4IDYgKi8KKwlvdjc2NjBfc2Vuc29yX2luaXQsCS8qIE9WNzY2MCA3ICovCisJcG8xMDMwX3NlbnNvcl9pbml0LAkvKiBQTzEwMzAgOCAqLworCXNwODA3MDhfc2Vuc29yX2luaXQsCS8qIFNQODA3MDggOSAqLworfTsKKwogLyogcmVhZCA8bGVuPiBieXRlcyB0byBnc3BjYV9kZXYtPnVzYl9idWYgKi8KIHN0YXRpYyB2b2lkIHJlZ19yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJICB1MTYgdmFsdWUsIGludCBsZW4pCkBAIC05NTgsOCArMTA2MywxNSBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCVBERUJVRyhEX1VTQk8sICJpMmNfdzIgWyUwMnhdID0gJTAyeCIsIHJlZywgdmFsKTsKLQlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAweDgxIHwgKDIgPDwgNCk7CS8qID0gYTEgKi8KLQlnc3BjYV9kZXYtPnVzYl9idWZbMV0gPSBzZC0+aTJjX2Jhc2U7CisJc3dpdGNoIChzZC0+c2Vuc29yKSB7CisJY2FzZSBTRU5TT1JfT002ODAyOgkJLyogaTJjIGNvbW1hbmQgPSBhMCAoMTAwIGtIeikgKi8KKwkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gMHg4MCB8ICgyIDw8IDQpOworCQlicmVhazsKKwlkZWZhdWx0OgkJCS8qIGkyYyBjb21tYW5kID0gYTEgKDQwMCBrSHopICovCisJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IDB4ODEgfCAoMiA8PCA0KTsKKwkJYnJlYWs7CisJfQorCWdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA9IHNkLT5pMmNfYWRkcjsKIAlnc3BjYV9kZXYtPnVzYl9idWZbMl0gPSByZWc7CiAJZ3NwY2FfZGV2LT51c2JfYnVmWzNdID0gdmFsOwogCWdzcGNhX2Rldi0+dXNiX2J1Zls0XSA9IDA7CkBAIC05OTEsMTQgKzExMDMsMjEgQEAKIAltc2xlZXAoMik7CiB9CiAKLS8qIHJlYWQgNSBieXRlcyBpbiBnc3BjYV9kZXYtPnVzYl9idWYgKi8KLXN0YXRpYyB2b2lkIGkyY19yNShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4IHJlZykKKy8qIHNlbnNvciByZWFkICdsZW4nICgxLi41KSBieXRlcyBpbiBnc3BjYV9kZXYtPnVzYl9idWYgKi8KK3N0YXRpYyB2b2lkIGkyY19yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggcmVnLCBpbnQgbGVuKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAl1OCBtb2RlWzhdOwogCi0JbW9kZVswXSA9IDB4ODEgfCAweDEwOwotCW1vZGVbMV0gPSBzZC0+aTJjX2Jhc2U7CisJc3dpdGNoIChzZC0+c2Vuc29yKSB7CisJY2FzZSBTRU5TT1JfT002ODAyOgkJLyogaTJjIGNvbW1hbmQgPSA5MCAoMTAwIGtIeikgKi8KKwkJbW9kZVswXSA9IDB4ODAgfCAweDEwOworCQlicmVhazsKKwlkZWZhdWx0OgkJCS8qIGkyYyBjb21tYW5kID0gOTEgKDQwMCBrSHopICovCisJCW1vZGVbMF0gPSAweDgxIHwgMHgxMDsKKwkJYnJlYWs7CisJfQorCW1vZGVbMV0gPSBzZC0+aTJjX2FkZHI7CiAJbW9kZVsyXSA9IHJlZzsKIAltb2RlWzNdID0gMDsKIAltb2RlWzRdID0gMDsKQEAgLTEwMDcsMzMgKzExMjYsNDMgQEAKIAltb2RlWzddID0gMHgxMDsKIAlpMmNfdzgoZ3NwY2FfZGV2LCBtb2RlKTsKIAltc2xlZXAoMik7Ci0JbW9kZVswXSA9IDB4ODEgfCAoNSA8PCA0KSB8IDB4MDI7CisJbW9kZVswXSA9IChtb2RlWzBdICYgMHg4MSkgfCAobGVuIDw8IDQpIHwgMHgwMjsKIAltb2RlWzJdID0gMDsKIAlpMmNfdzgoZ3NwY2FfZGV2LCBtb2RlKTsKIAltc2xlZXAoMik7CiAJcmVnX3IoZ3NwY2FfZGV2LCAweDBhLCA1KTsKIH0KIAotc3RhdGljIGludCBodjcxMzFyX3Byb2JlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyB2b2lkIGkyY193X3NlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQljb25zdCB1OCAoKmRhdGEpWzhdKQoreworCXdoaWxlICgoKmRhdGEpWzBdICE9IDApIHsKKwkJaWYgKCgqZGF0YSlbMF0gIT0gMHhkZCkKKwkJCWkyY193OChnc3BjYV9kZXYsICpkYXRhKTsKKwkJZWxzZQorCQkJbXNsZWVwKCgqZGF0YSlbMV0pOworCQlkYXRhKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBodjcxMzFyX3Byb2JlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlpMmNfdzEoZ3NwY2FfZGV2LCAweDAyLCAwKTsJCQkvKiBzZW5zb3Igd2FrZXVwICovCiAJbXNsZWVwKDEwKTsKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDAyLCAweDY2KTsJCQkvKiBHcGlvIG9uICovCiAJbXNsZWVwKDEwKTsKLQlpMmNfcjUoZ3NwY2FfZGV2LCAwKTsJCQkJLyogcmVhZCBzZW5zb3IgaWQgKi8KKwlpMmNfcihnc3BjYV9kZXYsIDAsIDUpOwkJCQkvKiByZWFkIHNlbnNvciBpZCAqLwogCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPT0gMHgwMgogCSAgICAmJiBnc3BjYV9kZXYtPnVzYl9idWZbMV0gPT0gMHgwOQogCSAgICAmJiBnc3BjYV9kZXYtPnVzYl9idWZbMl0gPT0gMHgwMQogCSAgICAmJiBnc3BjYV9kZXYtPnVzYl9idWZbM10gPT0gMHgwMAogCSAgICAmJiBnc3BjYV9kZXYtPnVzYl9idWZbNF0gPT0gMHgwMCkgewotCQlQREVCVUcoRF9QUk9CRSwgIkZpbmQgU2Vuc29yIHNuOWMxMDJQIEhWNzEzMVIiKTsKLQkJcmV0dXJuIDA7CisJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIHNuOWMxMDJQIEhWNzEzMVIgZm91bmQiKTsKKwkJcmV0dXJuOwogCX0KLQlQREVCVUcoRF9QUk9CRSwgIkZpbmQgU2Vuc29yIDB4JTAyeCAweCUwMnggMHglMDJ4IiwKKwlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciAweCUwMnggMHglMDJ4IDB4JTAyeCAtIHNuOWMxMDJQIG5vdCBmb3VuZCIsCiAJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSwgZ3NwY2FfZGV2LT51c2JfYnVmWzFdLAogCQlnc3BjYV9kZXYtPnVzYl9idWZbMl0pOwotCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIHNuOWMxMDJQIE5vdCBmb3VuZCIpOwotCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgdm9pZCBtaTAzNjBfcHJvYmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtMTA3NSw3ICsxMjA0LDYgQEAKIAljYXNlIDB4ODIzYToKIAkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgbXQ5djExMSIpOwogCQlzZC0+c2Vuc29yID0gU0VOU09SX01UOVYxMTE7Ci0JCXNkLT5pMmNfYmFzZSA9IDB4NWM7CiAJCWJyZWFrOwogCWNhc2UgMHg4MjQzOgogCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBtaTAzNjAiKTsKQEAgLTEwODYsNyArMTIxNCw0MiBAQAogCX0KIH0KIAotc3RhdGljIGludCBjb25maWd1cmVfZ3BpbyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCitzdGF0aWMgdm9pZCBvdjc2NDhfcHJvYmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCS8qIGNoZWNrIG92NzZ4eCAqLworCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4NjIpOworCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIDB4MDgpOworCXNkLT5pMmNfYWRkciA9IDB4MjE7CisJaTJjX3IoZ3NwY2FfZGV2LCAweDBhLCAyKTsKKwlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzNdID09IDB4NzYpIHsJLyogb3Y3Nnh4ICovCisJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIG92JTAyeCUwMngiLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzNdLCBnc3BjYV9kZXYtPnVzYl9idWZbNF0pOworCQlyZXR1cm47CisJfQorCisJLyogcmVzZXQgKi8KKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDI5KTsKKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDE3LCAweDQyKTsKKworCS8qIGNoZWNrIHBvMTAzMCAqLworCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4NjIpOworCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIDB4MDgpOworCXNkLT5pMmNfYWRkciA9IDB4NmU7CisJaTJjX3IoZ3NwY2FfZGV2LCAweDAwLCAyKTsKKwlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzNdID09IDB4MTAJLyogcG8xMDMwICovCisJICAgICYmIGdzcGNhX2Rldi0+dXNiX2J1Zls0XSA9PSAweDMwKSB7CisJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIHBvMTAzMCIpOworCQlzZC0+c2Vuc29yID0gU0VOU09SX1BPMTAzMDsKKwkJcmV0dXJuOworCX0KKworCVBERUJVRyhEX1BST0JFLCAiVW5rbm93biBzZW5zb3IgJTAyeCUwMngiLAorCQlnc3BjYV9kZXYtPnVzYl9idWZbM10sIGdzcGNhX2Rldi0+dXNiX2J1Zls0XSk7Cit9CisKK3N0YXRpYyB2b2lkIGJyaWRnZV9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCSAgY29uc3QgdTggKnNuOWMxeHgpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwpAQCAtMTEwMyw5ICsxMjY2LDEwIEBACiAJLyogY29uZmlndXJlIGdwaW8gKi8KIAlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsICZzbjljMXh4WzFdLCAyKTsKIAlyZWdfdyhnc3BjYV9kZXYsIDB4MDgsICZzbjljMXh4WzhdLCAyKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MTcsICZzbjljMXh4WzB4MTddLCA1KTsJLyogamZtIGxlbiB3YXMgMyAqLworCXJlZ193KGdzcGNhX2RldiwgMHgxNywgJnNuOWMxeHhbMHgxN10sIDUpOwogCXN3aXRjaCAoc2QtPnNlbnNvcikgewogCWNhc2UgU0VOU09SX09WNzY2MDoKKwljYXNlIFNFTlNPUl9QTzEwMzA6CiAJY2FzZSBTRU5TT1JfU1A4MDcwODoKIAkJcmVnOWEgPSByZWc5YV9zcGVjOwogCQlicmVhazsKQEAgLTExMTUsNyArMTI3OSw3IEBACiAJfQogCXJlZ193KGdzcGNhX2RldiwgMHg5YSwgcmVnOWEsIDYpOwogCi0JcmVnX3coZ3NwY2FfZGV2LCAweGQ0LCByZWdkNCwgc2l6ZW9mIHJlZ2Q0KTsgLypmaXhtZTpqZm0gd2FzIDYwIG9ubHkqLworCXJlZ193KGdzcGNhX2RldiwgMHhkNCwgcmVnZDQsIHNpemVvZiByZWdkNCk7CiAKIAlyZWdfdyhnc3BjYV9kZXYsIDB4MDMsICZzbjljMXh4WzNdLCAweDBmKTsKIApAQCAtMTEyNywxMCArMTI5MSwyMiBAQAogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDQwKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT002ODAyOgotCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAyLCAweDcxKTsKLQkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg0Mik7CisJCW1zbGVlcCgxMCk7CisJCXJlZ193MShnc3BjYV9kZXYsIDB4MDIsIDB4NzMpOworCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDE3LCAweDYwKTsKKwkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHgyMik7CisJCW1zbGVlcCgxMDApOworCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDYyKTsKKwkJcmVnX3cxKGdzcGNhX2RldiwgMHgxNywgMHg2NCk7CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4NjQpOwogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDQyKTsKKwkJbXNsZWVwKDEwKTsKKwkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg0Mik7CisJCWkyY193OChnc3BjYV9kZXYsIG9tNjgwMl9pbml0MFswXSk7CisJCWkyY193OChnc3BjYV9kZXYsIG9tNjgwMl9pbml0MFsxXSk7CisJCW1zbGVlcCgxNSk7CisJCXJlZ193MShnc3BjYV9kZXYsIDB4MDIsIDB4NzEpOworCQltc2xlZXAoMTUwKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y3NjMwOgogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDYxKTsKQEAgLTExNDQsNyArMTMyMCwxNCBAQAogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDYyKTsKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg0Mik7CiAJCWJyZWFrOworCWNhc2UgU0VOU09SX1BPMTAzMDoKKwkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg2MSk7CisJCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4MjApOworCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDYwKTsKKwkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg0MCk7CisJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzY2MDoKKwkJLyogZmFsbCB0aHJ1ICovCiAJY2FzZSBTRU5TT1JfU1A4MDcwODoKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg2Myk7CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4MjApOwpAQCAtMTE1MywxNDMgKzEzMzYsMTggQEAKIAkJbXNsZWVwKDEwMCk7CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MDIsIDB4NjIpOwogCQlicmVhazsKKwlkZWZhdWx0OgogLyoJY2FzZSBTRU5TT1JfSFY3MTMxUjogKi8KIC8qCWNhc2UgU0VOU09SX01JMDM2MDogKi8KIC8qCWNhc2UgU0VOU09SX01PNDAwMDogKi8KLQlkZWZhdWx0OgogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDQzKTsKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgxNywgMHg2MSk7CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIDB4NDIpOwotCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfSFY3MTMxUikgewotCQkJaWYgKGh2NzEzMXJfcHJvYmUoZ3NwY2FfZGV2KSA8IDApCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwkJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX0hWNzEzMVIKKwkJICAgICYmIHNkLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDJQKQorCQkJaHY3MTMxcl9wcm9iZShnc3BjYV9kZXYpOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGh2NzEzMVJfSW5pdFNlbnNvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCi17Ci0JaW50IGkgPSAwOwotCXN0YXRpYyBjb25zdCB1OCBTZXRTZW5zb3JDbGtbXSA9CS8qIDB4MDggTWNsayAqLwotCQl7IDB4YTEsIDB4MTEsIDB4MDEsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAgfTsKLQotCXdoaWxlIChodjcxMzFyX3NlbnNvcl9pbml0W2ldWzBdKSB7Ci0JCWkyY193OChnc3BjYV9kZXYsIGh2NzEzMXJfc2Vuc29yX2luaXRbaV0pOwotCQlpKys7Ci0JfQotCWkyY193OChnc3BjYV9kZXYsIFNldFNlbnNvckNsayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pMDM2MF9Jbml0U2Vuc29yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAobWkwMzYwX3NlbnNvcl9pbml0W2ldWzBdKSB7Ci0JCWkyY193OChnc3BjYV9kZXYsIG1pMDM2MF9zZW5zb3JfaW5pdFtpXSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1vNDAwMF9Jbml0U2Vuc29yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAobW80MDAwX3NlbnNvcl9pbml0W2ldWzBdKSB7Ci0JCWkyY193OChnc3BjYV9kZXYsIG1vNDAwMF9zZW5zb3JfaW5pdFtpXSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG10OXYxMTFfSW5pdFNlbnNvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCi17Ci0JaW50IGkgPSAwOwotCi0JaTJjX3c4KGdzcGNhX2RldiwgbXQ5djExMV9zZW5zb3JfaW5pdFtpXSk7Ci0JaSsrOwotCW1zbGVlcCgyMCk7Ci0Jd2hpbGUgKG10OXYxMTFfc2Vuc29yX2luaXRbaV1bMF0pIHsKLQkJaTJjX3c4KGdzcGNhX2RldiwgbXQ5djExMV9zZW5zb3JfaW5pdFtpXSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG9tNjgwMl9Jbml0U2Vuc29yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAob202ODAyX3NlbnNvcl9pbml0W2ldWzBdKSB7Ci0JCWkyY193OChnc3BjYV9kZXYsIG9tNjgwMl9zZW5zb3JfaW5pdFtpXSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG92NzYzMF9Jbml0U2Vuc29yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbnQgaSA9IDA7Ci0KLQlpMmNfdzgoZ3NwY2FfZGV2LCBvdjc2MzBfc2Vuc29yX2luaXRbaV0pOwkvKiA3NiAwMSAqLwotCWkrKzsKLQlpMmNfdzgoZ3NwY2FfZGV2LCBvdjc2MzBfc2Vuc29yX2luaXRbaV0pOwkvKiAxMiBjOCAoUkdCK1NSU1QpICovCi0JaSsrOwotCW1zbGVlcCgyMCk7Ci0JaTJjX3c4KGdzcGNhX2Rldiwgb3Y3NjMwX3NlbnNvcl9pbml0W2ldKTsJLyogMTIgNDggKi8KLQlpKys7Ci0JaTJjX3c4KGdzcGNhX2Rldiwgb3Y3NjMwX3NlbnNvcl9pbml0W2ldKTsJLyogMTIgYzggKi8KLQlpKys7Ci0JbXNsZWVwKDIwKTsKLQlpMmNfdzgoZ3NwY2FfZGV2LCBvdjc2MzBfc2Vuc29yX2luaXRbaV0pOwkvKiAxMiA0OCAqLwotCWkrKzsKLS8qamZtOndpbiBpMmNfciBmcm9tIDAwIHRvIDgwKi8KLQotCXdoaWxlIChvdjc2MzBfc2Vuc29yX2luaXRbaV1bMF0pIHsKLQkJaTJjX3c4KGdzcGNhX2Rldiwgb3Y3NjMwX3NlbnNvcl9pbml0W2ldKTsKLQkJaSsrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgb3Y3NjQ4X0luaXRTZW5zb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCWludCBpID0gMDsKLQotCWkyY193OChnc3BjYV9kZXYsIG92NzY0OF9zZW5zb3JfaW5pdFtpXSk7Ci0JaSsrOwotLyogd2luOiBkYmxlIHJlc2V0ICovCi0JaTJjX3c4KGdzcGNhX2Rldiwgb3Y3NjQ4X3NlbnNvcl9pbml0W2ldKTsJLyogcmVzZXQgKi8KLQlpKys7Ci0JbXNsZWVwKDIwKTsKLS8qIHdpbjogaTJjIHJlZyByZWFkIDAwLi43ZiAqLwotCXdoaWxlIChvdjc2NDhfc2Vuc29yX2luaXRbaV1bMF0pIHsKLQkJaTJjX3c4KGdzcGNhX2Rldiwgb3Y3NjQ4X3NlbnNvcl9pbml0W2ldKTsKLQkJaSsrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgb3Y3NjYwX0luaXRTZW5zb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCWludCBpID0gMDsKLQotCWkyY193OChnc3BjYV9kZXYsIG92NzY2MF9zZW5zb3JfaW5pdFtpXSk7CS8qIHJlc2V0IFNDQ0IgKi8KLQlpKys7Ci0JbXNsZWVwKDIwKTsKLQl3aGlsZSAob3Y3NjYwX3NlbnNvcl9pbml0W2ldWzBdKSB7Ci0JCWkyY193OChnc3BjYV9kZXYsIG92NzY2MF9zZW5zb3JfaW5pdFtpXSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNwODA3MDhfSW5pdFNlbnNvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCi17Ci0JaW50IGkgPSAwOwotCi0JaTJjX3c4KGdzcGNhX2Rldiwgc3A4MDcwOF9zZW5zb3JfaW5pdFtpXSk7CS8qIHJlc2V0IFNDQ0IgKi8KLQlpKys7Ci0JbXNsZWVwKDIwKTsKLQl3aGlsZSAoc3A4MDcwOF9zZW5zb3JfaW5pdFtpXVswXSkgewotCQlpMmNfdzgoZ3NwY2FfZGV2LCBzcDgwNzA4X3NlbnNvcl9pbml0W2ldKTsKLQkJaSsrOwotCX0KIH0KIAogLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgdGltZSAqLwpAQCAtMTMwNSw4ICsxMzYzLDcgQEAKIAljYW0tPm5wa3QgPSAyNDsJCQkvKiAyNCBwYWNrZXRzIHBlciBJU09DIG1lc3NhZ2UgKi8KIAogCXNkLT5icmlkZ2UgPSBpZC0+ZHJpdmVyX2luZm8gPj4gMTY7Ci0Jc2QtPnNlbnNvciA9IGlkLT5kcml2ZXJfaW5mbyA+PiA4OwotCXNkLT5pMmNfYmFzZSA9IGlkLT5kcml2ZXJfaW5mbzsKKwlzZC0+c2Vuc29yID0gaWQtPmRyaXZlcl9pbmZvOwogCiAJc2QtPmJyaWdodG5lc3MgPSBCUklHSFRORVNTX0RFRjsKIAlzZC0+Y29udHJhc3QgPSBDT05UUkFTVF9ERUY7CkBAIC0xMzIyLDcgKzEzNzksNiBAQAogCXNkLT5xdWFsaXR5ID0gUVVBTElUWV9ERUY7CiAJc2QtPmpwZWdxdWFsID0gODA7CiAKLQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gY3RybF9kaXNbc2QtPnNlbnNvcl07CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMzAsNiArMTM4Niw3IEBACiBzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwljb25zdCB1OCAqc245YzF4eDsKIAl1OCByZWdHcGlvW10gPSB7IDB4MjksIDB4NzQgfTsKIAl1OCByZWdGMTsKIApAQCAtMTM1Niw4ICsxNDEzLDE0IEBACiAJY2FzZSBCUklER0VfU045QzEyMDoKIAkJaWYgKHJlZ0YxICE9IDB4MTIpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX01JMDM2MCkKKwkJc3dpdGNoIChzZC0+c2Vuc29yKSB7CisJCWNhc2UgU0VOU09SX01JMDM2MDoKIAkJCW1pMDM2MF9wcm9iZShnc3BjYV9kZXYpOworCQkJYnJlYWs7CisJCWNhc2UgU0VOU09SX09WNzY0ODoKKwkJCW92NzY0OF9wcm9iZShnc3BjYV9kZXYpOworCQkJYnJlYWs7CisJCX0KIAkJcmVnR3Bpb1sxXSA9IDB4NzA7CiAJCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgcmVnR3BpbywgMik7CiAJCWJyZWFrOwpAQCAtMTM3Miw2ICsxNDM1LDEyIEBACiAKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweGYxLCAweDAxKTsKIAorCS8qIHNldCB0aGUgaTJjIGFkZHJlc3MgKi8KKwlzbjljMXh4ID0gc25fdGJbc2QtPnNlbnNvcl07CisJc2QtPmkyY19hZGRyID0gc245YzF4eFs5XTsKKworCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSBjdHJsX2Rpc1tzZC0+c2Vuc29yXTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMzgzLDcgKzE0NTIsNyBAQAogCXN3aXRjaCAoc2QtPnNlbnNvcikgewogCWNhc2UgU0VOU09SX0hWNzEzMVI6IHsKIAkJdTggRXhwb2RvaXRbXSA9Ci0JCQl7IDB4YzEsIDB4MTEsIDB4MjUsIDB4MDcsIDB4MjcsIDB4YzAsIDB4MDAsIDB4MTYgfTsKKwkJCXsgMHhjMSwgMHgxMSwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNiB9OwogCiAJCUV4cG9kb2l0WzNdID0gZXhwbyA+PiAxNjsKIAkJRXhwb2RvaXRbNF0gPSBleHBvID4+IDg7CkBAIC0xMzkzLDcgKzE0NjIsNyBAQAogCSAgICB9CiAJY2FzZSBTRU5TT1JfTUkwMzYwOiB7CiAJCXU4IGV4cG9NaVtdID0JCS8qIGV4cG9zdXJlIDB4MDYzNSAtPiA0IGZwL3MgMHgxMCAqLwotCQkJeyAweGIxLCAweDVkLCAweDA5LCAweDA2LCAweDM1LCAweDAwLCAweDAwLCAweDE2IH07CisJCQl7IDB4YjEsIDB4NWQsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTYgfTsKIAkJc3RhdGljIGNvbnN0IHU4IGRvaXRbXSA9CQkvKiB1cGRhdGUgc2Vuc29yICovCiAJCQl7IDB4YjEsIDB4NWQsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MTAgfTsKIAkJc3RhdGljIGNvbnN0IHU4IHNlbnNvcmdvW10gPQkJLyogc2Vuc29yIG9uICovCkBAIC0xNDEyLDkgKzE0ODEsOSBAQAogCSAgICB9CiAJY2FzZSBTRU5TT1JfTU80MDAwOiB7CiAJCXU4IGV4cG9Nb2ZbXSA9Ci0JCQl7IDB4YTEsIDB4MjEsIDB4MGYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAgfTsKKwkJCXsgMHhhMSwgMHgyMSwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCB9OwogCQl1OCBleHBvTW8xMFtdID0KLQkJCXsgMHhhMSwgMHgyMSwgMHgxMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCB9OworCQkJeyAweGExLCAweDIxLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwIH07CiAJCXN0YXRpYyBjb25zdCB1OCBnYWluTW9bXSA9CiAJCQl7IDB4YTEsIDB4MjEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWQgfTsKIApAQCAtMTQ1MCw2ICsxNTE5LDcgQEAKIAljYXNlIFNFTlNPUl9PTTY4MDI6IHsKIAkJdTggZ2Fpbk9tW10gPQogCQkJeyAweGEwLCAweDM0LCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwIH07CisJCQkJLyogcHJlc2V0IEFHQyAtIHdvcmtzIHdoZW4gQXV0b0V4cG8gPSBvZmYgKi8KIAogCQlpZiAoZXhwbyA+IDB4MDNmZikKIAkJCWV4cG8gPSAweDAzZmY7CkBAIC0xNDU3LDcgKzE1MjcsNyBAQAogCQkJZXhwbyA9IDB4MDAwMTsKIAkJZ2Fpbk9tWzNdID0gZXhwbyA+PiAyOwogCQlpMmNfdzgoZ3NwY2FfZGV2LCBnYWluT20pOwotCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDk2LCAoZXhwbyA+PiA1KSAmIDB4MWYpOworCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDk2LCBleHBvID4+IDUpOwogCQlQREVCVUcoRF9GUkFNLCAic2V0IGV4cG9zdXJlICVkIiwgZ2Fpbk9tWzNdKTsKIAkJYnJlYWs7CiAJICAgIH0KQEAgLTE0ODksNyArMTU1OSw3IEBACiAJY2FzZSBTRU5TT1JfTVQ5VjExMToKIAkJZXhwbyA9IHNkLT5icmlnaHRuZXNzID4+IDg7CiAJCXNkLT5leHBvc3VyZSA9IHNldGV4cG9zdXJlKGdzcGNhX2RldiwgZXhwbyk7Ci0JCWJyZWFrOworCQlyZXR1cm47CQkJLyogZG9uJ3Qgc2V0IHRoZSBZIG9mZnNldCAqLwogCWNhc2UgU0VOU09SX09NNjgwMjoKIAkJZXhwbyA9IHNkLT5icmlnaHRuZXNzID4+IDY7CiAJCXNkLT5leHBvc3VyZSA9IHNldGV4cG9zdXJlKGdzcGNhX2RldiwgZXhwbyk7CkBAIC0xNDk3LDggKzE1NjcsNyBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAoc2QtPnNlbnNvciAhPSBTRU5TT1JfTVQ5VjExMSkKLQkJcmVnX3cxKGdzcGNhX2RldiwgMHg5NiwgazIpOwkvKiBjb2xvciBtYXRyaXggWSBvZmZzZXQgKi8KKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDk2LCBrMik7CS8qIGNvbG9yIG1hdHJpeCBZIG9mZnNldCAqLwogfQogCiBzdGF0aWMgdm9pZCBzZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC0xNTI2LDYgKzE1OTUsNyBAQAogCQktMjQsIC0zOCwgNjQsCQkvKiBVUiBVRyBVQiAqLwogCQkgNjIsIC01MSwgLTkJCS8qIFZSIFZHIFZCICovCiAJfTsKKwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJdiA9IHV2W2ldICogc2QtPmNvbG9ycyAvIENPTE9SX0RFRjsKIAkJcmVnOGFbaSAqIDJdID0gdjsKQEAgLTE2MDUsNiArMTY3NSw4IEBACiB7CiAJdTggY29tbjsKIAorCWlmIChzZC0+Z3NwY2FfZGV2LmN0cmxfZGlzICYgKDEgPDwgVkZMSVBfSURYKSkKKwkJcmV0dXJuOwogCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9PVjc2MzApIHsKIAkJY29tbiA9IDB4MDI7CiAJCWlmICghc2QtPnZmbGlwKQpAQCAtMTcyNiw4ICsxNzk4LDkgQEAKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJaW50IGk7Ci0JdTggcmVnMSwgcmVnMTc7CisJdTggcmVnMSwgcmVnMiwgcmVnMTc7CiAJY29uc3QgdTggKnNuOWMxeHg7CisJY29uc3QgdTggKCppbml0KVs4XTsKIAlpbnQgbW9kZTsKIAlzdGF0aWMgY29uc3QgdTggQzBbXSA9IHsgMHgyZCwgMHgyZCwgMHgzYSwgMHgwNSwgMHgwNCwgMHgzZiB9OwogCXN0YXRpYyBjb25zdCB1OCBDQVtdID0geyAweDI4LCAweGQ4LCAweDE0LCAweGVjIH07CkBAIC0xNzQzLDggKzE4MTYsMjYgQEAKIAkJCTB4MjEpOwkJLyogSlBFRyA0MjIgKi8KIAlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgc2QtPnF1YWxpdHkpOwogCi0Jc245YzF4eCA9IHNuX3RiWyhpbnQpIHNkLT5zZW5zb3JdOwotCWNvbmZpZ3VyZV9ncGlvKGdzcGNhX2Rldiwgc245YzF4eCk7CisJLyogaW5pdGlhbGl6ZSB0aGUgYnJpZGdlICovCisJc245YzF4eCA9IHNuX3RiW3NkLT5zZW5zb3JdOworCWJyaWRnZV9pbml0KGdzcGNhX2Rldiwgc245YzF4eCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBzZW5zb3IgKi8KKwlpMmNfd19zZXEoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdFtzZC0+c2Vuc29yXSk7CisKKwlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKKwljYXNlIFNFTlNPUl9PTTY4MDI6CisJCXJlZzIgPSAweDcxOworCQlicmVhazsKKwljYXNlIFNFTlNPUl9TUDgwNzA4OgorCQlyZWcyID0gMHg2MjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVnMiA9IDB4NDA7CisJCWJyZWFrOworCX0KKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDAyLCByZWcyKTsKKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDAyLCByZWcyKTsKIAogCXJlZ193MShnc3BjYV9kZXYsIDB4MTUsIHNuOWMxeHhbMHgxNV0pOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MTYsIHNuOWMxeHhbMHgxNl0pOwpAQCAtMTc3MSw2ICsxODYyLDkgQEAKIAljYXNlIFNFTlNPUl9PVjc2NjA6CiAJCXJlZzE3ID0gMHhhMDsKIAkJYnJlYWs7CisJY2FzZSBTRU5TT1JfUE8xMDMwOgorCQlyZWcxNyA9IDB4YTA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJlZzE3ID0gMHg2MDsKIAkJYnJlYWs7CkBAIC0xNzkxLDYgKzE4ODUsMTAgQEAKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHg5YSwgMHgwNyk7CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4OTksIDB4NTkpOwogCQlicmVhazsKKwljYXNlIFNFTlNPUl9PTTY4MDI6CisJCXJlZ193MShnc3BjYV9kZXYsIDB4OWEsIDB4MDgpOworCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDk5LCAweDEwKTsKKwkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y3NjQ4OgogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDlhLCAweDBhKTsKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHg5OSwgMHg2MCk7CkBAIC0xODA2LDIxICsxOTA0LDIwIEBACiAJCWJyZWFrOwogCX0KIAotCW1vZGUgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVsoaW50KSBnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdjsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4ODQsIHJlZzg0LCBzaXplb2YgcmVnODQpOworCXJlZ193MShnc3BjYV9kZXYsIDB4MDUsIHNuOWMxeHhbNV0pOwkvKiByZWQgKi8KKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDA3LCBzbjljMXh4WzddKTsJLyogZ3JlZW4gKi8KKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDA2LCBzbjljMXh4WzZdKTsJLyogYmx1ZSAqLworCisJaW5pdCA9IE5VTEw7CisJbW9kZSA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwogCWlmIChtb2RlKQogCQlyZWcxID0gMHg0NjsJLyogMzIweDI0MDogY2xrIDQ4TWh6LCB2aWRlbyB0cmYgZW5hYmxlICovCiAJZWxzZQogCQlyZWcxID0gMHgwNjsJLyogNjQweDQ4MDogY2xrIDI0TWh6LCB2aWRlbyB0cmYgZW5hYmxlICovCiAJcmVnMTcgPSAweDYxOwkJLyogMHg6MjA6IGVuYWJsZSBzZW5zb3IgY2xvY2sgKi8KIAlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKLQljYXNlIFNFTlNPUl9IVjcxMzFSOgotCQlodjcxMzFSX0luaXRTZW5zb3IoZ3NwY2FfZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfTUkwMzYwOgotCQltaTAzNjBfSW5pdFNlbnNvcihnc3BjYV9kZXYpOwotCQlicmVhazsKIAljYXNlIFNFTlNPUl9NTzQwMDA6Ci0JCW1vNDAwMF9Jbml0U2Vuc29yKGdzcGNhX2Rldik7CiAJCWlmIChtb2RlKSB7CiAvKgkJCXJlZzEgPSAweDQ2OwkgKiAzMjAgY2xrIDQ4TWh6IDYwZnAvcyAqLwogCQkJcmVnMSA9IDB4MDY7CS8qIGNsayAyNE16ICovCkBAIC0xODMwLDcgKzE5MjcsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX01UOVYxMTE6Ci0JCW10OXYxMTFfSW5pdFNlbnNvcihnc3BjYV9kZXYpOworCQlpbml0ID0gbXQ5djExMV9zZW5zb3JfcGFyYW0xOwogCQlpZiAobW9kZSkgewogCQkJcmVnMSA9IDB4MDQ7CS8qIDMyMCBjbGsgNDhNaHogKi8KIAkJfSBlbHNlIHsKQEAgLTE4MzksMjIgKzE5MzYsMjEgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNFTlNPUl9PTTY4MDI6Ci0JCW9tNjgwMl9Jbml0U2Vuc29yKGdzcGNhX2Rldik7CisJCWluaXQgPSBvbTY4MDJfc2Vuc29yX3BhcmFtMTsKIAkJcmVnMTcgPSAweDY0OwkJLyogNjQwIE1DS1NJWkUgKi8KIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y3NjMwOgotCQlvdjc2MzBfSW5pdFNlbnNvcihnc3BjYV9kZXYpOwogCQlzZXR2ZmxpcChzZCk7CiAJCXJlZzE3ID0gMHhlMjsKIAkJcmVnMSA9IDB4NDQ7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzY0ODoKLQkJb3Y3NjQ4X0luaXRTZW5zb3IoZ3NwY2FfZGV2KTsKKwkJaW5pdCA9IG92NzY0OF9zZW5zb3JfcGFyYW0xOwogCQlyZWcxNyA9IDB4MjE7CiAvKgkJcmVnMSA9IDB4NDI7CQkgKiA0MiAtIDQ2PyAqLwogCQlicmVhazsKIAljYXNlIFNFTlNPUl9PVjc2NjA6Ci0JCW92NzY2MF9Jbml0U2Vuc29yKGdzcGNhX2Rldik7CisJCWluaXQgPSBvdjc2NjBfc2Vuc29yX3BhcmFtMTsKIAkJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMjApIHsKIAkJCWlmIChtb2RlKSB7CQkvKiAzMjB4MjQwIC0gMTYweDEyMCAqLwogCQkJCXJlZzE3ID0gMHhhMjsKQEAgLTE4NjYsOSArMTk2MiwxNCBAQAogCQkJCQkgKiBpbnZlcnNlIHBvd2VyIGRvd24gKi8KIAkJfQogCQlicmVhazsKKwljYXNlIFNFTlNPUl9QTzEwMzA6CisJCWluaXQgPSBwbzEwMzBfc2Vuc29yX3BhcmFtMTsKKwkJcmVnMTcgPSAweGEyOworCQlyZWcxID0gMHg0NDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIC8qCWNhc2UgU0VOU09SX1NQODA3MDg6ICovCi0JCXNwODA3MDhfSW5pdFNlbnNvcihnc3BjYV9kZXYpOworCQlpbml0ID0gc3A4MDcwOF9zZW5zb3JfcGFyYW0xOwogCQlpZiAobW9kZSkgewogLyo/PwkJCXJlZzEgPSAweDA0OwkgKiAzMjAgY2xrIDQ4TWh6ICovCiAJCX0gZWxzZSB7CkBAIC0xODc3LDYgKzE5NzgsMTMgQEAKIAkJfQogCQlicmVhazsKIAl9CisKKwkvKiBtb3JlIHNlbnNvciBpbml0aWFsaXphdGlvbiAtIHBhcmFtMSAqLworCWlmIChpbml0ICE9IE5VTEwpIHsKKwkJaTJjX3dfc2VxKGdzcGNhX2RldiwgaW5pdCk7CisvKgkJaW5pdCA9IE5VTEw7ICovCisJfQorCiAJcmVnX3coZ3NwY2FfZGV2LCAweGMwLCBDMCwgNik7CiAJcmVnX3coZ3NwY2FfZGV2LCAweGNhLCBDQSwgNCk7CiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CkBAIC0xODkxLDYgKzE5OTksNyBAQAogCQlicmVhazsKIAl9CiAKKwogCS8qIGhlcmUgY2hhbmdlIHNpemUgbW9kZSAwIC0+IFZHQTsgMSAtPiBDSUYgKi8KIAlzZC0+cmVnMTggPSBzbjljMXh4WzB4MThdIHwgKG1vZGUgPDwgNCkgfCAweDQwOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MTgsIHNkLT5yZWcxOCk7CkBAIC0xODk4LDYgKzIwMDcsNyBAQAogCiAJcmVnX3cxKGdzcGNhX2RldiwgMHgxNywgcmVnMTcpOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIHJlZzEpOworCiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5TT1JfT1Y3NjMwOgogCQlzZXR2ZmxpcChzZCk7CkBAIC0xOTM3LDE0ICsyMDQ3LDExIEBACiAJCS8qIGZhbGwgdGhydSAqLwogCWNhc2UgU0VOU09SX01UOVYxMTE6CiAJY2FzZSBTRU5TT1JfT1Y3NjMwOgorCWNhc2UgU0VOU09SX1BPMTAzMDoKIAkJZGF0YSA9IDB4Mjk7CiAJCWJyZWFrOwotCWRlZmF1bHQ6Ci0vKgljYXNlIFNFTlNPUl9NTzQwMDA6ICovCi0vKgljYXNlIFNFTlNPUl9PVjc2NjA6ICovCi0JCWJyZWFrOwogCX0KLQlzbjljMXh4ID0gc25fdGJbKGludCkgc2QtPnNlbnNvcl07CisJc245YzF4eCA9IHNuX3RiW3NkLT5zZW5zb3JdOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIHNuOWMxeHhbMV0pOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIHNuOWMxeHhbMHgxN10pOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIHNuOWMxeHhbMV0pOwpAQCAtMTk4NywxMSArMjA5NCwxOSBAQAogCQkJc2QtPmV4cG9zdXJlID0gc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2LAogCQkJCQkodW5zaWduZWQgaW50KSAoZXhwb3RpbWVzIDw8IDgpKTsKIAkJCWJyZWFrOworCQljYXNlIFNFTlNPUl9PTTY4MDI6CisJCQlleHBvdGltZXMgPSBzZC0+ZXhwb3N1cmU7CisJCQlleHBvdGltZXMgKz0gKGx1bWFfbWVhbiAtIGRlbHRhKSA+PiAyOworCQkJaWYgKGV4cG90aW1lcyA8IDApCisJCQkJZXhwb3RpbWVzID0gMDsKKwkJCXNkLT5leHBvc3VyZSA9IHNldGV4cG9zdXJlKGdzcGNhX2RldiwKKwkJCQkJCSAgICh1bnNpZ25lZCBpbnQpIGV4cG90aW1lcyk7CisJCQlzZXRyZWRibHVlKGdzcGNhX2Rldik7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIC8qCQljYXNlIFNFTlNPUl9NTzQwMDA6ICovCiAvKgkJY2FzZSBTRU5TT1JfTUkwMzYwOiAqLwogLyoJCWNhc2UgU0VOU09SX01UOVYxMTE6ICovCi0vKgkJY2FzZSBTRU5TT1JfT002ODAyOiAqLwogCQkJZXhwb3RpbWVzID0gc2QtPmV4cG9zdXJlOwogCQkJZXhwb3RpbWVzICs9IChsdW1hX21lYW4gLSBkZWx0YSkgPj4gNjsKIAkJCWlmIChleHBvdGltZXMgPCAwKQpAQCAtMjAwNyw3ICsyMTIyLDYgQEAKIC8qIHNjYW4gdGhlIFVSQiBwYWNrZXRzICovCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biBhdCBpbnRlcnJ1cHQgbGV2ZWwuICovCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KIAkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7CkBAIC0yMDE5LDcgKzIxMzMsNyBAQAogCiAJCS8qIGVuZCBvZiBmcmFtZSAqLwogCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKLQkJCQlmcmFtZSwgZGF0YSwgc29mICsgMik7CisJCQkJZGF0YSwgc29mICsgMik7CiAJCWlmIChzZC0+YWdfY250IDwgMCkKIAkJCXJldHVybjsKIC8qIHcxIHcyIHczICovCkBAIC0yMDQyLDEwICsyMTU2LDEwIEBACiAJaWYgKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9PSBMQVNUX1BBQ0tFVCkgewogCiAJCS8qIHB1dCB0aGUgSlBFRyA0MjIgaGVhZGVyICovCi0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsCisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKIAkJCXNkLT5qcGVnX2hkciwgSlBFR19IRFJfU1opOwogCX0KLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMjI5NSw2OSArMjQwOSw2OSBAQAogfTsKIAogLyogLS0gbW9kdWxlIGluaXRpYWxpc2F0aW9uIC0tICovCi0jZGVmaW5lIEJTSShicmlkZ2UsIHNlbnNvciwgaTJjX2FkZHIpIFwKKyNkZWZpbmUgQlMoYnJpZGdlLCBzZW5zb3IpIFwKIAkuZHJpdmVyX2luZm8gPSAoQlJJREdFXyAjIyBicmlkZ2UgPDwgMTYpIFwKLQkJCXwgKFNFTlNPUl8gIyMgc2Vuc29yIDw8IDgpIFwKLQkJCXwgKGkyY19hZGRyKQorCQkJfCBTRU5TT1JfICMjIHNlbnNvcgogc3RhdGljIGNvbnN0IF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CiAjaWYgIWRlZmluZWQgQ09ORklHX1VTQl9TTjlDMTAyICYmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMl9NT0RVTEUKLQl7VVNCX0RFVklDRSgweDA0NTgsIDB4NzAyNSksIEJTSShTTjlDMTIwLCBNSTAzNjAsIDB4NWQpfSwKLQl7VVNCX0RFVklDRSgweDA0NTgsIDB4NzAyZSksIEJTSShTTjlDMTIwLCBPVjc2NjAsIDB4MjEpfSwKKwl7VVNCX0RFVklDRSgweDA0NTgsIDB4NzAyNSksIEJTKFNOOUMxMjAsIE1JMDM2MCl9LAorCXtVU0JfREVWSUNFKDB4MDQ1OCwgMHg3MDJlKSwgQlMoU045QzEyMCwgT1Y3NjYwKX0sCiAjZW5kaWYKLQl7VVNCX0RFVklDRSgweDA0NWUsIDB4MDBmNSksIEJTSShTTjlDMTA1LCBPVjc2NjAsIDB4MjEpfSwKLQl7VVNCX0RFVklDRSgweDA0NWUsIDB4MDBmNyksIEJTSShTTjlDMTA1LCBPVjc2NjAsIDB4MjEpfSwKLQl7VVNCX0RFVklDRSgweDA0NzEsIDB4MDMyNyksIEJTSShTTjlDMTA1LCBNSTAzNjAsIDB4NWQpfSwKLQl7VVNCX0RFVklDRSgweDA0NzEsIDB4MDMyOCksIEJTSShTTjlDMTA1LCBNSTAzNjAsIDB4NWQpfSwKLQl7VVNCX0RFVklDRSgweDA0NzEsIDB4MDMzMCksIEJTSShTTjlDMTA1LCBNSTAzNjAsIDB4NWQpfSwKLQl7VVNCX0RFVklDRSgweDA2ZjgsIDB4MzAwNCksIEJTSShTTjlDMTA1LCBPVjc2NjAsIDB4MjEpfSwKLQl7VVNCX0RFVklDRSgweDA2ZjgsIDB4MzAwOCksIEJTSShTTjlDMTA1LCBPVjc2NjAsIDB4MjEpfSwKLQl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjA0MCksIEJTSShTTjlDMTAyUCwgSFY3MTMxUiwgMHgxMSl9LAotLyogYnc2MDAuaW5mOgotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDQwKSwgQlNJKFNOOUMxMDJQLCBNSTAzNjAsIDB4NWQpfSwgKi8KLS8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDNhKSwgQlNJKFNOOUMxMDJQLCBPVjc2NDgsIDB4Pz8pfSwgKi8KLS8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDdhKSwgQlNJKFNOOUMxMDJQLCBPVjc2NDgsIDB4Pz8pfSwgKi8KLQl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjA3YyksIEJTSShTTjlDMTAyUCwgSFY3MTMxUiwgMHgxMSl9LAotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwN2UpLCBCU0koU045QzEwMlAsIE9WNzYzMCwgMHg/Pyl9LCAqLwotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGMwKSwgQlNJKFNOOUMxMDUsIE1JMDM2MCwgMHg1ZCl9LAotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYzgpLCBCU0koU045QzEwNSwgT002ODAyLCAweD8/KX0sICovCi0vKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjBjYyksIEJTSShTTjlDMTA1LCBIVjcxMzFHUCwgMHg/Pyl9LCAqLwotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGVjKSwgQlNJKFNOOUMxMDUsIE1PNDAwMCwgMHgyMSl9LAotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZWYpLCBCU0koU045QzEwNSwgSUNNMTA1QywgMHg/Pyl9LCAqLwotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmEpLCBCU0koU045QzEwNSwgT1Y3NjQ4LCAweD8/KX0sICovCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmIpLCBCU0koU045QzEwNSwgT1Y3NjYwLCAweDIxKX0sCisJe1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwZjUpLCBCUyhTTjlDMTA1LCBPVjc2NjApfSwKKwl7VVNCX0RFVklDRSgweDA0NWUsIDB4MDBmNyksIEJTKFNOOUMxMDUsIE9WNzY2MCl9LAorCXtVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzI3KSwgQlMoU045QzEwNSwgTUkwMzYwKX0sCisJe1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjgpLCBCUyhTTjlDMTA1LCBNSTAzNjApfSwKKwl7VVNCX0RFVklDRSgweDA0NzEsIDB4MDMzMCksIEJTKFNOOUMxMDUsIE1JMDM2MCl9LAorCXtVU0JfREVWSUNFKDB4MDZmOCwgMHgzMDA0KSwgQlMoU045QzEwNSwgT1Y3NjYwKX0sCisJe1VTQl9ERVZJQ0UoMHgwNmY4LCAweDMwMDgpLCBCUyhTTjlDMTA1LCBPVjc2NjApfSwKKy8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDNhKSwgQlMoU045QzEwMlAsIE9WNzY0OCl9LCAqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDQwKSwgQlMoU045QzEwMlAsIEhWNzEzMVIpfSwKKy8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDdhKSwgQlMoU045QzEwMlAsIE9WNzY0OCl9LCAqLworLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwN2IpLCBCUyhTTjlDMTAyUCwgT1Y3NjYwKX0sICovCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwN2MpLCBCUyhTTjlDMTAyUCwgSFY3MTMxUil9LAorLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwN2UpLCBCUyhTTjlDMTAyUCwgT1Y3NjMwKX0sICovCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYzApLCBCUyhTTjlDMTA1LCBNSTAzNjApfSwKKy8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGMyKSwgQlMoU045QzEwNSwgUDEwMzB4Qyl9LCAqLworLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYzgpLCBCUyhTTjlDMTA1LCBPTTY4MDIpfSwgKi8KKy8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGNjKSwgQlMoU045QzEwNSwgSFY3MTMxR1ApfSwgKi8KKwl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjBlYyksIEJTKFNOOUMxMDUsIE1PNDAwMCl9LAorLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZWYpLCBCUyhTTjlDMTA1LCBJQ00xMDVDKX0sICovCisvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjBmYSksIEJTKFNOOUMxMDUsIE9WNzY0OCl9LCAqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGZiKSwgQlMoU045QzEwNSwgT1Y3NjYwKX0sCiAjaWYgIWRlZmluZWQgQ09ORklHX1VTQl9TTjlDMTAyICYmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMl9NT0RVTEUKLQl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjBmYyksIEJTSShTTjlDMTA1LCBIVjcxMzFSLCAweDExKX0sCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmUpLCBCU0koU045QzEwNSwgT1Y3NjMwLCAweDIxKX0sCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmMpLCBCUyhTTjlDMTA1LCBIVjcxMzFSKX0sCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmUpLCBCUyhTTjlDMTA1LCBPVjc2MzApfSwKICNlbmRpZgotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTAwKSwgQlNJKFNOOUMxMjAsIE1JMDM2MCwgMHg1ZCl9LCAvKnNuOWMxMjgqLwotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMDIpLCBCU0koU045QzEyMCwgUE8yMDMwTiwgPz8pfSwgKi8KLS8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTA4KSwgQlNJKFNOOUMxMjAsIE9NNjgwMiwgMHgyMSl9LCAqLwotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTBhKSwgQlNJKFNOOUMxMjAsIE9WNzY0OCwgMHgyMSl9LCAvKnNuOWMxMjgqLwotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTBiKSwgQlNJKFNOOUMxMjAsIE9WNzY2MCwgMHgyMSl9LCAvKnNuOWMxMjgqLwotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTBjKSwgQlNJKFNOOUMxMjAsIEhWNzEzMVIsIDB4MTEpfSwgLypzbjljMTI4Ki8KLQl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEwZSksIEJTSShTTjlDMTIwLCBPVjc2MzAsIDB4MjEpfSwgLypzbjljMTI4Ki8KLS8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTIyKSwgQlNJKFNOOUMxMTAsIElDTTEwNUMsIDB4Pz8pfSwgKi8KLS8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTIzKSwgQlNJKFNOOUMxMTAsIFNhbnlvQ0NELCAweD8/KX0sICovCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMjgpLCBCU0koU045QzExMCwgT002ODAyLCAweDIxKX0sIC8qc245YzMyNT8qLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTAwKSwgQlMoU045QzEyMCwgTUkwMzYwKX0sCS8qc245YzEyOCovCisvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEwMiksIEJTKFNOOUMxMjAsIFAxMDMweEMpfSwgKi8KKy8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTA4KSwgQlMoU045QzEyMCwgT002ODAyKX0sICovCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMGEpLCBCUyhTTjlDMTIwLCBPVjc2NDgpfSwJLypzbjljMTI4Ki8KKwl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEwYiksIEJTKFNOOUMxMjAsIE9WNzY2MCl9LAkvKnNuOWMxMjgqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTBjKSwgQlMoU045QzEyMCwgSFY3MTMxUil9LAkvKnNuOWMxMjgqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTBlKSwgQlMoU045QzEyMCwgT1Y3NjMwKX0sCS8qc245YzEyOCovCisvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEwZiksIEJTKFNOOUMxMjAsIFM1SzUzQkVCKX0sICovCisvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEyMiksIEJTKFNOOUMxMTAsIElDTTEwNUMpfSwgKi8KKy8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTIzKSwgQlMoU045QzExMCwgU2FueW9DQ0QpfSwgKi8KKwl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEyOCksIEJTKFNOOUMxMjAsIE9NNjgwMil9LAkvKnNuOWMzMjU/Ki8KIC8qYnc2MDAuaW5mOiovCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMmEpLCBCU0koU045QzEyMCwgT1Y3NjQ4LCAweDIxKX0sIC8qc245YzExMD8qLwotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTJjKSwgQlNJKFNOOUMxMTAsIE1PNDAwMCwgMHgyMSl9LAotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTJlKSwgQlNJKFNOOUMxMTAsIE9WNzYzMCwgMHgyMSl9LAotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMmYpLCBCU0koU045QzExMCwgSUNNMTA1QywgMHg/Pyl9LCAqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTJhKSwgQlMoU045QzEyMCwgT1Y3NjQ4KX0sCS8qc245YzMyNT8qLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTJjKSwgQlMoU045QzExMCwgTU80MDAwKX0sCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMmUpLCBCUyhTTjlDMTEwLCBPVjc2MzApfSwKKy8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTJmKSwgQlMoU045QzExMCwgSUNNMTA1Qyl9LCAqLwogI2lmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMiAmJiAhZGVmaW5lZCBDT05GSUdfVVNCX1NOOUMxMDJfTU9EVUxFCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMzApLCBCU0koU045QzEyMCwgTUkwMzYwLCAweDVkKX0sCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMzApLCBCUyhTTjlDMTIwLCBNSTAzNjApfSwKICNlbmRpZgotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMzIpLCBCU0koU045QzEyMCwgT1Y3NjcwLCAweDIxKX0sICovCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMzgpLCBCU0koU045QzEyMCwgTU80MDAwLCAweDIxKX0sCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2EpLCBCU0koU045QzEyMCwgT1Y3NjQ4LCAweDIxKX0sCisvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEzMiksIEJTKFNOOUMxMjAsIE9WNzY3MCl9LCAqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTM4KSwgQlMoU045QzEyMCwgTU80MDAwKX0sCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2EpLCBCUyhTTjlDMTIwLCBPVjc2NDgpfSwKICNpZiAhZGVmaW5lZCBDT05GSUdfVVNCX1NOOUMxMDIgJiYgIWRlZmluZWQgQ09ORklHX1VTQl9TTjlDMTAyX01PRFVMRQotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTNiKSwgQlNJKFNOOUMxMjAsIE9WNzY2MCwgMHgyMSl9LAorCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTNiKSwgQlMoU045QzEyMCwgT1Y3NjYwKX0sCiAjZW5kaWYKLQl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEzYyksIEJTSShTTjlDMTIwLCBIVjcxMzFSLCAweDExKX0sCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2UpLCBCU0koU045QzEyMCwgT1Y3NjMwLCAweDIxKX0sCi0vKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjE0MiksIEJTSShTTjlDMTIwLCBQTzIwMzBOLCA/Pyl9LCAqc245YzEyMGIqLwotCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTQzKSwgQlNJKFNOOUMxMjAsIFNQODA3MDgsIDB4MTgpfSwgLypzbjljMTIwYiovCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxNDgpLCBCU0koU045QzEyMCwgT002ODAyLCAweDIxKX0sIC8qc245YzEyMGIqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTNjKSwgQlMoU045QzEyMCwgSFY3MTMxUil9LAorCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTNlKSwgQlMoU045QzEyMCwgT1Y3NjMwKX0sCisvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjE0MiksIEJTKFNOOUMxMjAsIFBPMjAzME4pfSwJICpzbjljMTIwYiovCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxNDMpLCBCUyhTTjlDMTIwLCBTUDgwNzA4KX0sCS8qc245YzEyMGIqLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTQ4KSwgQlMoU045QzEyMCwgT002ODAyKX0sCS8qc245YzEyMGIqLwogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCmluZGV4IGZhYjdlZjguLmZlNDY4NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCkBAIC01ODksNyArNTg5LDcgQEAKIAlpbnQgZXJyOwogCV9fdTggRGF0YTsKIAotCS8qIHNvbWUgdW5rbm93IGNvbW1hbmQgZnJvbSBBaXB0ZWsgcG9ja2V0IGR2IGFuZCBmYW1pbHkzMDAgKi8KKwkvKiBzb21lIHVua25vd24gY29tbWFuZCBmcm9tIEFpcHRlayBwb2NrZXQgZHYgYW5kIGZhbWlseTMwMCAqLwogCiAJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDBkMDEsIDB4MDEpOwogCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgwZDAzLCAweDAwKTsKQEAgLTg5OSw4ICs4OTksNyBAQAogfQogCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KLQkJCV9fdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwpAQCAtOTEzLDExICs5MTIsMTEgQEAKIC8qCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7ICovCiAJCQlyZXR1cm47CiAJCX0KLQkJZnJhbWUgPSBnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgZnJhbWUsCisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAogCQkJCQlmZmQ5LCAyKTsKIAogCQkvKiBwdXQgdGhlIEpQRUcgaGVhZGVyIGluIHRoZSBuZXcgZnJhbWUgKi8KLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAogCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CiAKIAkJZGF0YSArPSBTUENBNTAwX09GRlNFVF9EQVRBOwpAQCAtOTMxLDcgKzkzMCw3IEBACiAJaSA9IDA7CiAJZG8gewogCQlpZiAoZGF0YVtpXSA9PSAweGZmKSB7Ci0JCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLAorCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAogCQkJCQlkYXRhLCBpICsgMSk7CiAJCQlsZW4gLT0gaTsKIAkJCWRhdGEgKz0gaTsKQEAgLTk0MCw3ICs5MzksNyBAQAogCQl9CiAJCWkrKzsKIAl9IHdoaWxlIChpIDwgbGVuKTsKLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMS5jCmluZGV4IGI3NGEzNDIuLjY3NjFhMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMS5jCkBAIC0xNjM2LDcgKzE2MzYsNyBAQAogCXt9CiB9OwogCi0vKiBVbmtub3cgY2FtZXJhIGZyb20gT3JpIFVzYmlkIDB4MDAwMDoweDAwMDAgKi8KKy8qIFVua25vd24gY2FtZXJhIGZyb20gT3JpIFVzYmlkIDB4MDAwMDoweDAwMDAgKi8KIC8qIEJhc2VkIG9uIHNub29wcyBmcm9tIE9yaSBDb2hlbiAqLwogc3RhdGljIGNvbnN0IF9fdTE2IHNwY2E1MDFjX215c3RlcmlvdXNfb3Blbl9kYXRhW11bM10gPSB7CiAJezB4MDIsIDB4MDAwZiwgMHgwMDA1fSwKQEAgLTE5NDUsNyArMTk0NSw3IEBACiAJCQlnb3RvIGVycm9yOwogCQlicmVhazsKIAljYXNlIE15c3RGcm9tT3JpVW5rbm93bkNhbWVyYToKLQkJLyogVW5Lbm93IE9yaSBDTU9TIENhbWVyYSBkYXRhICovCisJCS8qIFVua25vd24gT3JpIENNT1MgQ2FtZXJhIGRhdGEgKi8KIAkJaWYgKHdyaXRlX3ZlY3Rvcihnc3BjYV9kZXYsIHNwY2E1MDFjX215c3RlcmlvdXNfb3Blbl9kYXRhKSkKIAkJCWdvdG8gZXJyb3I7CiAJCWJyZWFrOwpAQCAtMTk3OCw3ICsxOTc4LDcgQEAKIAkJd3JpdGVfdmVjdG9yKGdzcGNhX2Rldiwgc3BjYTUwMWNfYXJvd2FuYV9vcGVuX2RhdGEpOwogCQlicmVhazsKIAljYXNlIE15c3RGcm9tT3JpVW5rbm93bkNhbWVyYToKLQkJLyogVW5Lbm93ICBDTU9TIENhbWVyYSBkYXRhICovCisJCS8qIFVua25vd24gQ01PUyBDYW1lcmEgZGF0YSAqLwogCQl3cml0ZV92ZWN0b3IoZ3NwY2FfZGV2LCBzcGNhNTAxY19teXN0ZXJpb3VzX2luaXRfZGF0YSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMDMyLDIwICsyMDMyLDE1IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwotCQkJX191OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLworCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KIHsKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIDA6CQkJCS8qIHN0YXJ0IG9mIGZyYW1lICovCi0JCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwKLQkJCQkJTEFTVF9QQUNLRVQsCi0JCQkJCWZyYW1lLAotCQkJCQlkYXRhLCAwKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIE5VTEwsIDApOwogCQlkYXRhICs9IFNQQ0E1MDFfT0ZGU0VUX0RBVEE7CiAJCWxlbiAtPSBTUENBNTAxX09GRlNFVF9EQVRBOwotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLAotCQkJCWRhdGEsIGxlbik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIAkJcmV0dXJuOwogCWNhc2UgMHhmZjoJCQkvKiBkcm9wICovCiAvKgkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7ICovCkBAIC0yMDUzLDggKzIwNDgsNyBAQAogCX0KIAlkYXRhKys7CiAJbGVuLS07Ci0JZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBmcmFtZSwKLQkJCWRhdGEsIGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogfQogCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCmluZGV4IGVhOGM5ZmUuLjBmOTIzMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCkBAIC03MzksMjYgKzczOSwyMiBAQAogfQogCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KIAkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7CiAJc3dpdGNoIChkYXRhWzBdKSB7CiAJY2FzZSAwOgkJCQkvKiBzdGFydCBvZiBmcmFtZSAqLwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKLQkJCQkJZGF0YSwgMCk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKIAkJZGF0YSArPSBTUENBNTBYX09GRlNFVF9EQVRBOwogCQlsZW4gLT0gU1BDQTUwWF9PRkZTRVRfREFUQTsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKLQkJCQlkYXRhLCBsZW4pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgMHhmZjoJCQkvKiBkcm9wICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRhdGEgKz0gMTsKIAkJbGVuIC09IDE7Ci0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCi0JCQkJZGF0YSwgbGVuKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNi5jCmluZGV4IGExOTkyOTguLmFiMjhjYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNi5jCkBAIC01NDMsMTggKzU0MywxNSBAQAogfQogCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KLQkJCV9fdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7CiAJc3dpdGNoIChkYXRhWzBdKSB7CiAJY2FzZSAwOgkJCQkvKiBzdGFydCBvZiBmcmFtZSAqLwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKLQkJCQkJZGF0YSwgMCk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKIAkJZGF0YSArPSBTUENBNTBYX09GRlNFVF9EQVRBOwogCQlsZW4gLT0gU1BDQTUwWF9PRkZTRVRfREFUQTsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKLQkJCQlkYXRhLCBsZW4pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgMHhmZjoJCQkvKiBkcm9wICovCiAvKgkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7ICovCkBAIC01NjIsOCArNTU5LDcgQEAKIAlkZWZhdWx0OgogCQlkYXRhICs9IDE7CiAJCWxlbiAtPSAxOwotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLAotCQkJCWRhdGEsIGxlbik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYwppbmRleCA5Njk2YzRjLi40ZDhlNmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYwpAQCAtMTQ0NywyNiArMTQ0NywyMiBAQAogfQogCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KIAkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7CiAJc3dpdGNoIChkYXRhWzBdKSB7CiAJY2FzZSAwOgkJCQkvKiBzdGFydCBvZiBmcmFtZSAqLwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKLQkJCQkJZGF0YSwgMCk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKIAkJZGF0YSArPSBTUENBNTA4X09GRlNFVF9EQVRBOwogCQlsZW4gLT0gU1BDQTUwOF9PRkZTRVRfREFUQTsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKLQkJCQlkYXRhLCBsZW4pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgMHhmZjoJCQkvKiBkcm9wICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRhdGEgKz0gMTsKIAkJbGVuIC09IDE7Ci0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCi0JCQkJZGF0YSwgbGVuKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1NjEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jCmluZGV4IDI3ZTgyYjMuLjU4YzJmMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jCkBAIC03NzksOCArNzc5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwgLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLAkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCXU4ICpkYXRhLAkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKQEAgLTc4OCwxMiArNzg3LDEwIEBACiAJbGVuLS07CiAJc3dpdGNoICgqZGF0YSsrKSB7CQkJLyogc2VxdWVuY2UgbnVtYmVyICovCiAJY2FzZSAwOgkJCQkJLyogc3RhcnQgb2YgZnJhbWUgKi8KLQkJZnJhbWUgPSBnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgZnJhbWUsCi0JCQkJCWRhdGEsIDApOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgTlVMTCwgMCk7CiAJCWlmIChkYXRhWzFdICYgMHgxMCkgewogCQkJLyogY29tcHJlc3NlZCBiYXllciAqLwotCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAotCQkJCQlmcmFtZSwgZGF0YSwgbGVuKTsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHJhdyBiYXllciAod2l0aCBhIGhlYWRlciwgd2hpY2ggd2Ugc2tpcCkgKi8KIAkJCWlmIChzZC0+Y2hpcF9yZXZpc2lvbiA9PSBSZXYwMTJBKSB7CkBAIC04MDMsMTQgKzgwMCwxMyBAQAogCQkJCWRhdGEgKz0gMTY7CiAJCQkJbGVuIC09IDE2OwogCQkJfQotCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAotCQkJCQkJZnJhbWUsIGRhdGEsIGxlbik7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CiAJCX0KIAkJcmV0dXJuOwogCWNhc2UgMHhmZjoJCQkvKiBkcm9wIChlbXB0eSBtcGFja2V0cykgKi8KIAkJcmV0dXJuOwogCX0KLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogLyogcmV2IDcyYSBvbmx5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1LmMKaW5kZXggNzE1YTY4Zi4uMWZjYWNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDUuYwpAQCAtMTY4LDE4ICsxNjgsMjIgQEAKICAqICByZXF1ZXN0IGFuZCByZWFkIGEgYmxvY2sgb2YgZGF0YSAtIHNlZSB3YXJuaW5nIG9uIHNxOTA1X2NvbW1hbmQuCiAgKi8KIHN0YXRpYyBpbnQKLXNxOTA1X3JlYWRfZGF0YShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgc2l6ZSkKK3NxOTA1X3JlYWRfZGF0YShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgc2l6ZSwgaW50IG5lZWRfbG9jaykKIHsKIAlpbnQgcmV0OwogCWludCBhY3RfbGVuOwogCiAJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gJ1wwJzsKKwlpZiAobmVlZF9sb2NrKQorCQltdXRleF9sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCiAJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAogCQkJICAgICAgVVNCX1JFUV9TWU5DSF9GUkFNRSwgICAgICAgICAgICAgICAgLyogcmVxdWVzdCAqLwogCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJICAgICAgU1E5MDVfQlVMS19SRUFELCBzaXplLCBnc3BjYV9kZXYtPnVzYl9idWYsCiAJCQkgICAgICAxLCBTUTkwNV9DTURfVElNRU9VVCk7CisJaWYgKG5lZWRfbG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKIAlpZiAocmV0IDwgMCkgewogCQlQREVCVUcoRF9FUlIsICIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC0yMTAsMTEgKzIxNCw5IEBACiB7CiAJc3RydWN0IHNkICpkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNkLCB3b3JrX3N0cnVjdCk7CiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gJmRldi0+Z3NwY2FfZGV2OwotCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7CiAJaW50IGJ5dGVzX2xlZnQ7IC8qIGJ5dGVzIHJlbWFpbmluZyBpbiBjdXJyZW50IGZyYW1lLiAqLwogCWludCBkYXRhX2xlbjsgICAvKiBzaXplIHRvIHVzZSBmb3IgdGhlIG5leHQgcmVhZC4gKi8KIAlpbnQgaGVhZGVyX3JlYWQ7IC8qIHRydWUgaWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlIGZyYW1lIGhlYWRlci4gKi8KLQlpbnQgZGlzY2FyZGluZzsgLyogdHJ1ZSBpZiB3ZSBmYWlsZWQgdG8gZ2V0IHNwYWNlIGZvciBmcmFtZS4gKi8KIAlpbnQgcGFja2V0X3R5cGU7CiAJaW50IGZyYW1lX3N6OwogCWludCByZXQ7CkBAIC0yMjIsNyArMjI0LDYgQEAKIAl1OCAqYnVmZmVyOwogCiAJYnVmZmVyID0ga21hbGxvYyhTUTkwNV9NQVhfVFJBTlNGRVIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQltdXRleF9sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlQREVCVUcoRF9FUlIsICJDb3VsZG4ndCBhbGxvY2F0ZSBVU0IgYnVmZmVyIik7CiAJCWdvdG8gcXVpdF9zdHJlYW07CkBAIC0yMzIsMjggKzIzMywyMiBAQAogCQkJKyBGUkFNRV9IRUFERVJfTEVOOwogCiAJd2hpbGUgKGdzcGNhX2Rldi0+cHJlc2VudCAmJiBnc3BjYV9kZXYtPnN0cmVhbWluZykgewotCQkvKiBOZWVkIGEgc2hvcnQgZGVsYXkgdG8gZW5zdXJlIHN0cmVhbWluZyBmbGFnIHdhcyBzZXQgYnkKLQkJICogZ3NwY2EgYW5kIHRvIG1ha2Ugc3VyZSBnc3BjYSBjYW4gZ3JhYiB0aGUgbXV0ZXguICovCi0JCW11dGV4X3VubG9jaygmZ3NwY2FfZGV2LT51c2JfbG9jayk7Ci0JCW1zbGVlcCgxKTsKLQogCQkvKiByZXF1ZXN0IHNvbWUgZGF0YSBhbmQgdGhlbiByZWFkIGl0IHVudGlsIHdlIGhhdmUKIAkJICogYSBjb21wbGV0ZSBmcmFtZS4gKi8KIAkJYnl0ZXNfbGVmdCA9IGZyYW1lX3N6OwogCQloZWFkZXJfcmVhZCA9IDA7Ci0JCWRpc2NhcmRpbmcgPSAwOwogCi0JCXdoaWxlIChieXRlc19sZWZ0ID4gMCkgeworCQkvKiBOb3RlIHdlIGRvIG5vdCBjaGVjayBmb3IgZ3NwY2FfZGV2LT5zdHJlYW1pbmcgaGVyZSwgYXMKKwkJICAgd2UgbXVzdCBmaW5pc2ggcmVhZGluZyBhbiBlbnRpcmUgZnJhbWUsIG90aGVyd2lzZSB0aGUKKwkJICAgbmV4dCB0aW1lIHdlIHN0cmVhbSB3ZSBzdGFydCByZWFkaW5nIGluIHRoZSBtaWRkbGUgb2YgYQorCQkgICBmcmFtZS4gKi8KKwkJd2hpbGUgKGJ5dGVzX2xlZnQgPiAwICYmIGdzcGNhX2Rldi0+cHJlc2VudCkgewogCQkJZGF0YV9sZW4gPSBieXRlc19sZWZ0ID4gU1E5MDVfTUFYX1RSQU5TRkVSID8KIAkJCQlTUTkwNV9NQVhfVFJBTlNGRVIgOiBieXRlc19sZWZ0OwotCQkJbXV0ZXhfbG9jaygmZ3NwY2FfZGV2LT51c2JfbG9jayk7Ci0JCQlpZiAoIWdzcGNhX2Rldi0+cHJlc2VudCkKLQkJCQlnb3RvIHF1aXRfc3RyZWFtOwotCQkJcmV0ID0gc3E5MDVfcmVhZF9kYXRhKGdzcGNhX2RldiwgYnVmZmVyLCBkYXRhX2xlbik7CisJCQlyZXQgPSBzcTkwNV9yZWFkX2RhdGEoZ3NwY2FfZGV2LCBidWZmZXIsIGRhdGFfbGVuLCAxKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gcXVpdF9zdHJlYW07Ci0JCQltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOwotCQkJUERFQlVHKERfU1RSRUFNLAorCQkJUERFQlVHKERfUEFDSywKIAkJCQkiR290ICVkIGJ5dGVzIG91dCBvZiAlZCBmb3IgZnJhbWUiLAogCQkJCWRhdGFfbGVuLCBieXRlc19sZWZ0KTsKIAkJCWJ5dGVzX2xlZnQgLT0gZGF0YV9sZW47CkBAIC0yNzAsMzQgKzI2NSwzMCBAQAogCQkJfSBlbHNlIHsKIAkJCQlwYWNrZXRfdHlwZSA9IElOVEVSX1BBQ0tFVDsKIAkJCX0KLQkJCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKLQkJCWlmIChmcmFtZSAmJiAhZGlzY2FyZGluZykgewotCQkJCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUsCi0JCQkJCQlmcmFtZSwgZGF0YSwgZGF0YV9sZW4pOwotCQkJCS8qIElmIGVudGlyZSBmcmFtZSBmaXRzIGluIG9uZSBwYWNrZXQgd2Ugc3RpbGwKLQkJCQkgICBuZWVkIHRvIGFkZCBhIExBU1RfUEFDS0VUICovCi0JCQkJaWYgKHBhY2tldF90eXBlID09IEZJUlNUX1BBQ0tFVCAmJgotCQkJCSAgICBieXRlc19sZWZ0ID09IDApCi0JCQkJCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwKLQkJCQkJCQlMQVNUX1BBQ0tFVCwKLQkJCQkJCQlmcmFtZSwgZGF0YSwgMCk7Ci0JCQl9IGVsc2UgewotCQkJCWRpc2NhcmRpbmcgPSAxOwotCQkJfQorCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUsCisJCQkJCWRhdGEsIGRhdGFfbGVuKTsKKwkJCS8qIElmIGVudGlyZSBmcmFtZSBmaXRzIGluIG9uZSBwYWNrZXQgd2Ugc3RpbGwKKwkJCSAgIG5lZWQgdG8gYWRkIGEgTEFTVF9QQUNLRVQgKi8KKwkJCWlmIChwYWNrZXRfdHlwZSA9PSBGSVJTVF9QQUNLRVQgJiYKKwkJCSAgICBieXRlc19sZWZ0ID09IDApCisJCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCQlOVUxMLCAwKTsKIAkJfQotCQkvKiBhY2tub3dsZWRnZSB0aGUgZnJhbWUgKi8KLQkJbXV0ZXhfbG9jaygmZ3NwY2FfZGV2LT51c2JfbG9jayk7Ci0JCWlmICghZ3NwY2FfZGV2LT5wcmVzZW50KQotCQkJZ290byBxdWl0X3N0cmVhbTsKLQkJcmV0ID0gc3E5MDVfYWNrX2ZyYW1lKGdzcGNhX2Rldik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBxdWl0X3N0cmVhbTsKKwkJaWYgKGdzcGNhX2Rldi0+cHJlc2VudCkgeworCQkJLyogYWNrbm93bGVkZ2UgdGhlIGZyYW1lICovCisJCQltdXRleF9sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKKwkJCXJldCA9IHNxOTA1X2Fja19mcmFtZShnc3BjYV9kZXYpOworCQkJbXV0ZXhfdW5sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gcXVpdF9zdHJlYW07CisJCX0KIAl9CiBxdWl0X3N0cmVhbToKLQkvKiB0aGUgdXNiX2xvY2sgaXMgYWxyZWFkeSBhY3F1aXJlZCAqLwotCWlmIChnc3BjYV9kZXYtPnByZXNlbnQpCisJaWYgKGdzcGNhX2Rldi0+cHJlc2VudCkgeworCQltdXRleF9sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKIAkJc3E5MDVfY29tbWFuZChnc3BjYV9kZXYsIFNROTA1X0NMRUFSKTsKLQltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOworCQltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOworCX0KIAlrZnJlZShidWZmZXIpOwogfQogCkBAIC0zNDYsNyArMzM3LDcgQEAKIAlyZXQgPSBzcTkwNV9jb21tYW5kKGdzcGNhX2RldiwgU1E5MDVfSUQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldCA9IHNxOTA1X3JlYWRfZGF0YShnc3BjYV9kZXYsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgNCk7CisJcmV0ID0gc3E5MDVfcmVhZF9kYXRhKGdzcGNhX2RldiwgZ3NwY2FfZGV2LT51c2JfYnVmLCA0LCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAkvKiB1c2JfYnVmIGlzIGFsbG9jYXRlZCB3aXRoIGttYWxsb2Mgc28gaXMgYWxpZ25lZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1Yy5jCmluZGV4IDkxNjg5MjUuLmQ3MGIxNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkwNWMuYwpAQCAtMTE1LDExICsxMTUsOSBAQAogewogCXN0cnVjdCBzZCAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzZCwgd29ya19zdHJ1Y3QpOwogCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9ICZkZXYtPmdzcGNhX2RldjsKLQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwogCWludCBieXRlc19sZWZ0OyAvKiBieXRlcyByZW1haW5pbmcgaW4gY3VycmVudCBmcmFtZS4gKi8KIAlpbnQgZGF0YV9sZW47ICAgLyogc2l6ZSB0byB1c2UgZm9yIHRoZSBuZXh0IHJlYWQuICovCiAJaW50IGFjdF9sZW47Ci0JaW50IGRpc2NhcmRpbmcgPSAwOyAvKiB0cnVlIGlmIHdlIGZhaWxlZCB0byBnZXQgc3BhY2UgZm9yIGZyYW1lLiAqLwogCWludCBwYWNrZXRfdHlwZTsKIAlpbnQgcmV0OwogCXU4ICpidWZmZXI7CkBAIC0xMzEsOCArMTI5LDYgQEAKIAl9CiAKIAl3aGlsZSAoZ3NwY2FfZGV2LT5wcmVzZW50ICYmIGdzcGNhX2Rldi0+c3RyZWFtaW5nKSB7Ci0JCWlmICghZ3NwY2FfZGV2LT5wcmVzZW50KQotCQkJZ290byBxdWl0X3N0cmVhbTsKIAkJLyogUmVxdWVzdCB0aGUgaGVhZGVyLCB3aGljaCB0ZWxscyB0aGUgc2l6ZSB0byBkb3dubG9hZCAqLwogCQlyZXQgPSB1c2JfYnVsa19tc2coZ3NwY2FfZGV2LT5kZXYsCiAJCQkJdXNiX3JjdmJ1bGtwaXBlKGdzcGNhX2Rldi0+ZGV2LCAweDgxKSwKQEAgLTE0OSwxNyArMTQ1LDExIEBACiAJCVBERUJVRyhEX1NUUkVBTSwgImJ5dGVzX2xlZnQgPSAweCV4IiwgYnl0ZXNfbGVmdCk7CiAJCS8qIFdlIGtlZXAgdGhlIGhlYWRlci4gSXQgaGFzIG90aGVyIGluZm9ybWF0aW9uLCB0b28uICovCiAJCXBhY2tldF90eXBlID0gRklSU1RfUEFDS0VUOwotCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7Ci0JCWlmIChmcmFtZSAmJiAhZGlzY2FyZGluZykgewotCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUsCi0JCQkJZnJhbWUsIGJ1ZmZlciwgRlJBTUVfSEVBREVSX0xFTik7Ci0JCQl9IGVsc2UKLQkJCQlkaXNjYXJkaW5nID0gMTsKLQkJd2hpbGUgKGJ5dGVzX2xlZnQgPiAwKSB7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIHBhY2tldF90eXBlLAorCQkJCWJ1ZmZlciwgRlJBTUVfSEVBREVSX0xFTik7CisJCXdoaWxlIChieXRlc19sZWZ0ID4gMCAmJiBnc3BjYV9kZXYtPnByZXNlbnQpIHsKIAkJCWRhdGFfbGVuID0gYnl0ZXNfbGVmdCA+IFNROTA1Q19NQVhfVFJBTlNGRVIgPwogCQkJCVNROTA1Q19NQVhfVFJBTlNGRVIgOiBieXRlc19sZWZ0OwotCQkJaWYgKCFnc3BjYV9kZXYtPnByZXNlbnQpCi0JCQkJZ290byBxdWl0X3N0cmVhbTsKIAkJCXJldCA9IHVzYl9idWxrX21zZyhnc3BjYV9kZXYtPmRldiwKIAkJCQl1c2JfcmN2YnVsa3BpcGUoZ3NwY2FfZGV2LT5kZXYsIDB4ODEpLAogCQkJCWJ1ZmZlciwgZGF0YV9sZW4sICZhY3RfbGVuLApAQCAtMTc0LDE5ICsxNjQsMTYgQEAKIAkJCQlwYWNrZXRfdHlwZSA9IExBU1RfUEFDS0VUOwogCQkJZWxzZQogCQkJCXBhY2tldF90eXBlID0gSU5URVJfUEFDS0VUOwotCQkJZnJhbWUgPSBnc3BjYV9nZXRfaV9mcmFtZShnc3BjYV9kZXYpOwotCQkJaWYgKGZyYW1lICYmICFkaXNjYXJkaW5nKQotCQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIHBhY2tldF90eXBlLAotCQkJCQkJZnJhbWUsIGJ1ZmZlciwgZGF0YV9sZW4pOwotCQkJZWxzZQotCQkJCWRpc2NhcmRpbmcgPSAxOworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUsCisJCQkJCWJ1ZmZlciwgZGF0YV9sZW4pOwogCQl9CiAJfQogcXVpdF9zdHJlYW06Ci0JbXV0ZXhfbG9jaygmZ3NwY2FfZGV2LT51c2JfbG9jayk7Ci0JaWYgKGdzcGNhX2Rldi0+cHJlc2VudCkKKwlpZiAoZ3NwY2FfZGV2LT5wcmVzZW50KSB7CisJCW11dGV4X2xvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOwogCQlzcTkwNWNfY29tbWFuZChnc3BjYV9kZXYsIFNROTA1Q19DTEVBUiwgMCk7Ci0JbXV0ZXhfdW5sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKKwl9CiAJa2ZyZWUoYnVmZmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMKaW5kZXggNDc2Mjg5Ni4uOGUyMzMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0azAxNC5jCkBAIC00MTgsOCArNDE4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKQEAgLTQzNSwxMSArNDM0LDExIEBACiAJICoJCSh3aXRob3V0IGVuZGluZyAtIGZmIGQ5KQogCSAqLwogCWlmIChkYXRhWzBdID09IDB4ZmYgJiYgZGF0YVsxXSA9PSAweGZlKSB7Ci0JCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLAotCQkJCQlmZmQ5LCAyKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJZmZkOSwgMik7CiAKIAkJLyogcHV0IHRoZSBKUEVHIDQxMSBoZWFkZXIgKi8KLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAogCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CiAKIAkJLyogYmVnaW5uaW5nIG9mIHRoZSBmcmFtZSAqLwpAQCAtNDQ3LDcgKzQ0Niw3IEBACiAJCWRhdGEgKz0gU1RLSERSU1o7CiAJCWxlbiAtPSBTVEtIRFJTWjsKIAl9Ci0JZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBmcmFtZSwgZGF0YSwgbGVuKTsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIGxlbik7CiB9CiAKIHN0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDY4MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNjgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2OWQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDY4MC5jCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogU1RWMDY4MCBVU0IgQ2FtZXJhIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBIYW5zIGRlIEdvZWRlIDxoZGdvZWRlQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBtb2R1bGUgaXMgYWRhcHRlZCBmcm9tIHRoZSBpbiBrZXJuZWwgdjRsMSBzdHY2ODAgZHJpdmVyOgorICoKKyAqICBTVFYwNjgwIFVTQiBDYW1lcmEgRHJpdmVyLCBieSBLZXZpbiBTaXNzb24gKGtqc2lzc29uQGJlbGxzb3V0aC5uZXQpCisgKgorICogVGhhbmtzIHRvIFNUTWljcm9lbGVjdHJvbmljcyBmb3IgaW5mb3JtYXRpb24gb24gdGhlIHVzYiBjb21tYW5kcywgYW5kCisgKiB0byBTdGV2ZSBNaWxsZXIgYXQgU1RNIGZvciBoaXMgaGVscCBhbmQgZW5jb3VyYWdlbWVudCB3aGlsZSBJIHdhcworICogd3JpdGluZyB0aGlzIGRyaXZlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgInN0djA2ODAiCisKKyNpbmNsdWRlICJnc3BjYS5oIgorCitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxoZGdvZWRlQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUVjA2ODAgVVNCIENhbWVyYSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogc3BlY2lmaWMgd2ViY2FtIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBzZCB7CisJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CQkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBtb2RlOworCXU4IG9yaWdfbW9kZTsKKwl1OCB2aWRlb19tb2RlOworCXU4IGN1cnJlbnRfbW9kZTsKK307CisKKy8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tdID0geworfTsKKworc3RhdGljIGludCBzdHZfc25kY3RybChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIGludCBzZXQsIHU4IHJlcSwgdTE2IHZhbCwKKwkJICAgICAgIGludCBzaXplKQoreworCWludCByZXQgPSAtMTsKKwl1OCByZXFfdHlwZSA9IDA7CisKKwlzd2l0Y2ggKHNldCkgeworCWNhc2UgMDogLyogIDB4YzEgICovCisJCXJlcV90eXBlID0gVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9FTkRQT0lOVDsKKwkJYnJlYWs7CisJY2FzZSAxOiAvKiAgMHg0MSAgKi8KKwkJcmVxX3R5cGUgPSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9FTkRQT0lOVDsKKwkJYnJlYWs7CisJY2FzZSAyOgkvKiAgMHg4MCAgKi8KKwkJcmVxX3R5cGUgPSBVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0RFVklDRTsKKwkJYnJlYWs7CisJY2FzZSAzOgkvKiAgMHg0MCAgKi8KKwkJcmVxX3R5cGUgPSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0U7CisJCWJyZWFrOworCX0KKworCXJldCA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCSAgICAgIHVzYl9yY3ZjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCisJCQkgICAgICByZXEsIHJlcV90eXBlLAorCQkJICAgICAgdmFsLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsIHNpemUsIDUwMCk7CisKKwlpZiAoKHJldCA8IDApICYmIChyZXEgIT0gMHgwYSkpCisJCVBERUJVRyhEX0VSUiwKKwkJICAgICAgICJ1c2JfY29udHJvbF9tc2cgZXJyb3IgJWksIHJlcXVlc3QgPSAweCV4LCBlcnJvciA9ICVpIiwKKwkJICAgICAgIHNldCwgcmVxLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdHYwNjgwX2hhbmRsZV9lcnJvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIGludCByZXQpCit7CisJc3R2X3NuZGN0cmwoZ3NwY2FfZGV2LCAwLCAweDgwLCAwLCAweDAyKTsgLyogR2V0IExhc3QgRXJyb3IgKi8KKwlQREVCVUcoRF9FUlIsICJsYXN0IGVycm9yOiAlaSwgIGNvbW1hbmQgPSAweCV4IiwKKwkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCBnc3BjYV9kZXYtPnVzYl9idWZbMV0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDY4MF9nZXRfdmlkZW9fbW9kZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJLyogTm90ZSBub3Qgc3VyZSBpZiB0aGlzIGluaXQgb2YgdXNiX2J1ZiBpcyByZWFsbHkgbmVjZXNzYXJ5ICovCisJbWVtc2V0KGdzcGNhX2Rldi0+dXNiX2J1ZiwgMCwgOCk7CisJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gMHgwZjsKKworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDAsIDB4ODcsIDAsIDB4MDgpICE9IDB4MDgpIHsKKwkJUERFQlVHKERfRVJSLCAiR2V0X0NhbWVyYV9Nb2RlIGZhaWxlZCIpOworCQlyZXR1cm4gc3R2MDY4MF9oYW5kbGVfZXJyb3IoZ3NwY2FfZGV2LCAtRUlPKTsKKwl9CisKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOyAvKiAwMSA9IFZHQSwgMDMgPSBRVkdBLCAwMCA9IENJRiAqLworfQorCitzdGF0aWMgaW50IHN0djA2ODBfc2V0X3ZpZGVvX21vZGUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCBtb2RlKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+Y3VycmVudF9tb2RlID09IG1vZGUpCisJCXJldHVybiAwOworCisJbWVtc2V0KGdzcGNhX2Rldi0+dXNiX2J1ZiwgMCwgOCk7CisJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gbW9kZTsKKworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDMsIDB4MDcsIDB4MDEwMCwgMHgwOCkgIT0gMHgwOCkgeworCQlQREVCVUcoRF9FUlIsICJTZXRfQ2FtZXJhX01vZGUgZmFpbGVkIik7CisJCXJldHVybiBzdHYwNjgwX2hhbmRsZV9lcnJvcihnc3BjYV9kZXYsIC1FSU8pOworCX0KKworCS8qIFZlcmlmeSB3ZSBnb3Qgd2hhdCB3ZSd2ZSBhc2tlZCBmb3IgKi8KKwlpZiAoc3R2MDY4MF9nZXRfdmlkZW9fbW9kZShnc3BjYV9kZXYpICE9IG1vZGUpIHsKKwkJUERFQlVHKERfRVJSLCAiRXJyb3Igc2V0dGluZyBjYW1lcmEgdmlkZW8gbW9kZSEiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2QtPmN1cnJlbnRfbW9kZSA9IG1vZGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgdGltZSAqLworc3RhdGljIGludCBzZF9jb25maWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXN0cnVjdCBjYW0gKmNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKKworCS8qIHBpbmcgY2FtZXJhIHRvIGJlIHN1cmUgU1RWMDY4MCBpcyBwcmVzZW50ICovCisJaWYgKHN0dl9zbmRjdHJsKGdzcGNhX2RldiwgMCwgMHg4OCwgMHg1Njc4LCAweDAyKSAhPSAweDAyIHx8CisJICAgIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSAhPSAweDU2IHx8IGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSAhPSAweDc4KSB7CisJCVBERUJVRyhEX0VSUiwgIlNUVihlKTogY2FtZXJhIHBpbmcgZmFpbGVkISEiKTsKKwkJcmV0dXJuIHN0djA2ODBfaGFuZGxlX2Vycm9yKGdzcGNhX2RldiwgLUVOT0RFVik7CisJfQorCisJLyogZ2V0IGNhbWVyYSBkZXNjcmlwdG9yICovCisJaWYgKHN0dl9zbmRjdHJsKGdzcGNhX2RldiwgMiwgMHgwNiwgMHgwMjAwLCAweDA5KSAhPSAweDA5KQorCQlyZXR1cm4gc3R2MDY4MF9oYW5kbGVfZXJyb3IoZ3NwY2FfZGV2LCAtRU5PREVWKTsKKworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDIsIDB4MDYsIDB4MDIwMCwgMHgyMikgIT0gMHgyMiB8fAorCSAgICBnc3BjYV9kZXYtPnVzYl9idWZbN10gIT0gMHhhMCB8fCBnc3BjYV9kZXYtPnVzYl9idWZbOF0gIT0gMHgyMykgeworCQlQREVCVUcoRF9FUlIsICJDb3VsZCBub3QgZ2V0IGRlc2NyaXB0b3IgMDIwMC4iKTsKKwkJcmV0dXJuIHN0djA2ODBfaGFuZGxlX2Vycm9yKGdzcGNhX2RldiwgLUVOT0RFVik7CisJfQorCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDAsIDB4OGEsIDAsIDB4MDIpICE9IDB4MDIpCisJCXJldHVybiBzdHYwNjgwX2hhbmRsZV9lcnJvcihnc3BjYV9kZXYsIC1FTk9ERVYpOworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDAsIDB4OGIsIDAsIDB4MjQpICE9IDB4MjQpCisJCXJldHVybiBzdHYwNjgwX2hhbmRsZV9lcnJvcihnc3BjYV9kZXYsIC1FTk9ERVYpOworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDAsIDB4ODUsIDAsIDB4MTApICE9IDB4MTApCisJCXJldHVybiBzdHYwNjgwX2hhbmRsZV9lcnJvcihnc3BjYV9kZXYsIC1FTk9ERVYpOworCisJaWYgKCEoZ3NwY2FfZGV2LT51c2JfYnVmWzddICYgMHgwOSkpIHsKKwkJUERFQlVHKERfRVJSLCAiQ2FtZXJhIHN1cHBvcnRzIG5laXRoZXIgQ0lGIG5vciBRVkdBIG1vZGUiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbN10gJiAweDAxKQorCQlQREVCVUcoRF9QUk9CRSwgIkNhbWVyYSBzdXBwb3J0cyBDSUYgbW9kZSIpOworCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbN10gJiAweDAyKQorCQlQREVCVUcoRF9QUk9CRSwgIkNhbWVyYSBzdXBwb3J0cyBWR0EgbW9kZSIpOworCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbN10gJiAweDA4KQorCQlQREVCVUcoRF9QUk9CRSwgIkNhbWVyYSBzdXBwb3J0cyBRVkdBIG1vZGUiKTsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbN10gJiAweDAxKQorCQlzZC0+dmlkZW9fbW9kZSA9IDB4MDA7IC8qIENJRiAqLworCWVsc2UKKwkJc2QtPnZpZGVvX21vZGUgPSAweDAzOyAvKiBRVkdBICovCisKKwkvKiBGVyByZXYsIEFTSUMgcmV2LCBzZW5zb3IgSUQgICovCisJUERFQlVHKERfUFJPQkUsICJGaXJtd2FyZSByZXYgaXMgJWkuJWkiLAorCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMF0sIGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSk7CisJUERFQlVHKERfUFJPQkUsICJBU0lDIHJldiBpcyAlaS4laSIsCisJICAgICAgIGdzcGNhX2Rldi0+dXNiX2J1ZlsyXSwgZ3NwY2FfZGV2LT51c2JfYnVmWzNdKTsKKwlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBJRCBpcyAlaSIsCisJICAgICAgIChnc3BjYV9kZXYtPnVzYl9idWZbNF0qMTYpICsgKGdzcGNhX2Rldi0+dXNiX2J1Zls1XT4+NCkpOworCisKKwlyZXQgPSBzdHYwNjgwX2dldF92aWRlb19tb2RlKGdzcGNhX2Rldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2QtPmN1cnJlbnRfbW9kZSA9IHNkLT5vcmlnX21vZGUgPSByZXQ7CisKKwlyZXQgPSBzdHYwNjgwX3NldF92aWRlb19tb2RlKGdzcGNhX2Rldiwgc2QtPnZpZGVvX21vZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogR2V0IG1vZGUgZGV0YWlscyAqLworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDAsIDB4OGYsIDAsIDB4MTApICE9IDB4MTApCisJCXJldHVybiBzdHYwNjgwX2hhbmRsZV9lcnJvcihnc3BjYV9kZXYsIC1FSU8pOworCisJY2FtLT5idWxrID0gMTsKKwljYW0tPmJ1bGtfbnVyYnMgPSAxOyAvKiBUaGUgY2FtIGNhbm5vdCBoYW5kbGUgbW9yZSAqLworCWNhbS0+YnVsa19zaXplID0gKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSA8PCAyNCkgfAorCQkJIChnc3BjYV9kZXYtPnVzYl9idWZbMV0gPDwgMTYpIHwKKwkJCSAoZ3NwY2FfZGV2LT51c2JfYnVmWzJdIDw8IDgpIHwKKwkJCSAoZ3NwY2FfZGV2LT51c2JfYnVmWzNdKTsKKwlzZC0+bW9kZS53aWR0aCA9IChnc3BjYV9kZXYtPnVzYl9idWZbNF0gPDwgOCkgfAorCQkJIChnc3BjYV9kZXYtPnVzYl9idWZbNV0pOyAgLyogMzIyLCAzNTYsIDY0NCAqLworCXNkLT5tb2RlLmhlaWdodCA9IChnc3BjYV9kZXYtPnVzYl9idWZbNl0gPDwgOCkgfAorCQkJICAoZ3NwY2FfZGV2LT51c2JfYnVmWzddKTsgLyogMjQyLCAyOTIsIDQ4NCAqLworCXNkLT5tb2RlLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NUVjA2ODA7CisJc2QtPm1vZGUuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJc2QtPm1vZGUuYnl0ZXNwZXJsaW5lID0gc2QtPm1vZGUud2lkdGg7CisJc2QtPm1vZGUuc2l6ZWltYWdlID0gY2FtLT5idWxrX3NpemU7CisJc2QtPm1vZGUuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworCisJLyogb3JpZ0dhaW4gPSBnc3BjYV9kZXYtPnVzYl9idWZbMTJdOyAqLworCisJY2FtLT5jYW1fbW9kZSA9ICZzZC0+bW9kZTsKKwljYW0tPm5tb2RlcyA9IDE7CisKKworCXJldCA9IHN0djA2ODBfc2V0X3ZpZGVvX21vZGUoZ3NwY2FfZGV2LCBzZC0+b3JpZ19tb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDIsIDB4MDYsIDB4MDEwMCwgMHgxMikgIT0gMHgxMiB8fAorCSAgICBnc3BjYV9kZXYtPnVzYl9idWZbOF0gIT0gMHg1MyB8fCBnc3BjYV9kZXYtPnVzYl9idWZbOV0gIT0gMHgwNSkgeworCQlQREVCVUcoRF9FUlIsICJDb3VsZCBub3QgZ2V0IGRlc2NyaXB0b3IgMDEwMC4iKTsKKwkJcmV0dXJuIHN0djA2ODBfaGFuZGxlX2Vycm9yKGdzcGNhX2RldiwgLUVJTyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIGFuZCByZXN1bWUgdGltZSAqLworc3RhdGljIGludCBzZF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLworc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlyZXQgPSBzdHYwNjgwX3NldF92aWRlb19tb2RlKGdzcGNhX2Rldiwgc2QtPnZpZGVvX21vZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHN0dl9zbmRjdHJsKGdzcGNhX2RldiwgMCwgMHg4NSwgMCwgMHgxMCkgIT0gMHgxMCkKKwkJcmV0dXJuIHN0djA2ODBfaGFuZGxlX2Vycm9yKGdzcGNhX2RldiwgLUVJTyk7CisKKwkvKiBTdGFydCBzdHJlYW0gYXQ6CisJICAgMHgwMDAwID0gQ0lGICgzNTJ4Mjg4KQorCSAgIDB4MDEwMCA9IFZHQSAoNjQweDQ4MCkKKwkgICAweDAzMDAgPSBRVkdBICgzMjB4MjQwKSAqLworCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDEsIDB4MDksIHNkLT52aWRlb19tb2RlIDw8IDgsIDB4MCkgIT0gMHgwKQorCQlyZXR1cm4gc3R2MDY4MF9oYW5kbGVfZXJyb3IoZ3NwY2FfZGV2LCAtRUlPKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJLyogVGhpcyBpcyBhIGhpZ2ggcHJpb3JpdHkgY29tbWFuZDsgaXQgc3RvcHMgYWxsIGxvd2VyIG9yZGVyIGNtZHMgKi8KKwlpZiAoc3R2X3NuZGN0cmwoZ3NwY2FfZGV2LCAxLCAweDA0LCAweDAwMDAsIDB4MCkgIT0gMHgwKQorCQlzdHYwNjgwX2hhbmRsZV9lcnJvcihnc3BjYV9kZXYsIC1FSU8pOworfQorCitzdGF0aWMgdm9pZCBzZF9zdG9wMChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKCFzZC0+Z3NwY2FfZGV2LnByZXNlbnQpCisJCXJldHVybjsKKworCXN0djA2ODBfc2V0X3ZpZGVvX21vZGUoZ3NwY2FfZGV2LCBzZC0+b3JpZ19tb2RlKTsKK30KKworc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJdTggKmRhdGEsCisJCQlpbnQgbGVuKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCS8qIEV2ZXJ5IG5vdyBhbmQgdGhlbiB0aGUgY2FtZXJhIHNlbmRzIGEgMTYgYnl0ZSBwYWNrZXQsIG5vIGlkZWEKKwkgICB3aGF0IGl0IGNvbnRhaW5zLCBidXQgaXQgaXMgbm90IGltYWdlIGRhdGEsIHdoZW4gdGhpcworCSAgIGhhcHBlbnMgdGhlIGZyYW1lIHJlY2VpdmVkIGJlZm9yZSB0aGlzIHBhY2tldCBpcyBjb3JydXB0LAorCSAgIHNvIGRpc2NhcmQgaXQuICovCisJaWYgKGxlbiAhPSBzZC0+bW9kZS5zaXplaW1hZ2UpIHsKKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaW5pc2ggdGhlIHByZXZpb3VzIGZyYW1lLCB3ZSBkbyB0aGlzIHVwb24gcmVjZXB0aW9uIG9mIHRoZSBuZXh0CisJICAgcGFja2V0LCBldmVuIHRob3VnaCBpdCBpcyBhbHJlYWR5IGNvbXBsZXRlIHNvIHRoYXQgdGhlIHN0cmFuZ2UgMTYKKwkgICBieXRlIHBhY2tldHMgc2VuZCBhZnRlciBhIGNvcnJ1cHQgZnJhbWUgY2FuIGRpc2NhcmQgaXQuICovCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIE5VTEwsIDApOworCisJLyogU3RvcmUgdGhlIGp1c3QgcmVjZWl2ZWQgZnJhbWUgKi8KKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7Cit9CisKKy8qIHN1Yi1kcml2ZXIgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0geworCS5uYW1lID0gTU9EVUxFX05BTUUsCisJLmN0cmxzID0gc2RfY3RybHMsCisJLm5jdHJscyA9IEFSUkFZX1NJWkUoc2RfY3RybHMpLAorCS5jb25maWcgPSBzZF9jb25maWcsCisJLmluaXQgPSBzZF9pbml0LAorCS5zdGFydCA9IHNkX3N0YXJ0LAorCS5zdG9wTiA9IHNkX3N0b3BOLAorCS5zdG9wMCA9IHNkX3N0b3AwLAorCS5wa3Rfc2NhbiA9IHNkX3BrdF9zY2FuLAorfTsKKworLyogLS0gbW9kdWxlIGluaXRpYWxpc2F0aW9uIC0tICovCitzdGF0aWMgY29uc3QgX19kZXZpbml0ZGF0YSBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDA1NTMsIDB4MDIwMil9LAorCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDA3KX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZShpbnRmLCBpZCwgJnNkX2Rlc2MsIHNpemVvZihzdHJ1Y3Qgc2QpLAorCQkJCVRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNkX2RyaXZlciA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5pZF90YWJsZSA9IGRldmljZV90YWJsZSwKKwkucHJvYmUgPSBzZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGdzcGNhX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnc3BjYV9zdXNwZW5kLAorCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB1c2JfcmVnaXN0ZXIoJnNkX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJUERFQlVHKERfUFJPQkUsICJyZWdpc3RlcmVkIik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgc2RfbW9kX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2RfZHJpdmVyKTsKKwlQREVCVUcoRF9QUk9CRSwgImRlcmVnaXN0ZXJlZCIpOworfQorCittb2R1bGVfaW5pdChzZF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzZF9tb2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguYwppbmRleCBiZmFlNjNmLi41ZDAyNDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmMKQEAgLTMxMiw4ICszMTIsNyBAQAogICogVGhlIDAwMDUgYW5kIDAxMDAgY2h1bmtzIHNlZW0gdG8gYXBwZWFyIG9ubHkgaW4gY29tcHJlc3NlZCBzdHJlYW0uCiAgKi8KIHN0YXRpYyB2b2lkIHN0djA2eHhfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKQEAgLTM2Niw3ICszNjUsNyBAQAogCQkJCXNkLT50b19za2lwIC09IHNraXA7CiAJCQl9CiAKLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCiAJCQkJCWRhdGEsIGNodW5rX2xlbik7CiAJCQlicmVhazsKIApAQCAtMzc4LDcgKzM3Nyw3IEBACiAKIAkJCS8qIENyZWF0ZSBhIG5ldyBmcmFtZSwgY2h1bmsgbGVuZ3RoIHNob3VsZCBiZSB6ZXJvICovCiAJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCi0JCQkJCWZyYW1lLCBkYXRhLCAwKTsKKwkJCQkJTlVMTCwgMCk7CiAKIAkJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9TVDY0MjIpCiAJCQkJc2QtPnRvX3NraXAgPSBnc3BjYV9kZXYtPndpZHRoICogNDsKQEAgLTM5NCw4ICszOTMsOCBAQAogCQkJUERFQlVHKERfUEFDSywgIkVuZCBvZiBmcmFtZSBkZXRlY3RlZCIpOwogCiAJCQkvKiBDb21wbGV0ZSB0aGUgbGFzdCBmcmFtZSAoaWYgYW55KSAqLwotCQkJZnJhbWUgPSBnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKLQkJCQkJCWZyYW1lLCBkYXRhLCAwKTsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAorCQkJCQlOVUxMLCAwKTsKIAogCQkJaWYgKGNodW5rX2xlbikKIAkJCQlQREVCVUcoRF9FUlIsICJDaHVuayBsZW5ndGggaXMgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYwppbmRleCBhYThmOTk1Li43MmJmM2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYwpAQCAtNjMxLDcgKzYzMSw3IEBACiAJY291bnQgPSAyMDA7CiAJd2hpbGUgKC0tY291bnQgPiAwKSB7CiAJCW1zbGVlcCgxMCk7Ci0JCS8qIGdzbWFydCBtaW5pMiB3cml0ZSBhIGVhY2ggd2FpdCBzZXR0aW5nIDEgbXMgaXMgZW5vdWdodCAqLworCQkvKiBnc21hcnQgbWluaTIgd3JpdGUgYSBlYWNoIHdhaXQgc2V0dGluZyAxIG1zIGlzIGVub3VnaCAqLwogLyoJCXJlZ193X3JpdihkZXYsIHJlcSwgaWR4LCB2YWwpOyAqLwogCQlzdGF0dXMgPSByZWdfcl8xMihnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMSwgMSk7CiAJCWlmIChzdGF0dXMgPT0gZW5kY29kZSkgewpAQCAtMTExNiw3ICsxMTE2LDYgQEAKIH0KIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCiAJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewpAQCAtMTE4NiwxMSArMTE4NSwxMSBAQAogCQlicmVhazsKIAl9CiAJaWYgKHNvZikgewkJLyogc3RhcnQgb2YgZnJhbWUgKi8KLQkJZnJhbWUgPSBnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgZnJhbWUsCi0JCQkJCWZmZDksIDIpOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKKwkJCQlmZmQ5LCAyKTsKIAogCQkvKiBwdXQgdGhlIEpQRUcgaGVhZGVyIGluIHRoZSBuZXcgZnJhbWUgKi8KLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAogCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CiAJfQogCkBAIC0xMTk4LDcgKzExOTcsNyBAQAogCWkgPSAwOwogCWRvIHsKIAkJaWYgKGRhdGFbaV0gPT0gMHhmZikgewotCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBmcmFtZSwKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKIAkJCQkJZGF0YSwgaSArIDEpOwogCQkJbGVuIC09IGk7CiAJCQlkYXRhICs9IGk7CkBAIC0xMjA3LDcgKzEyMDYsNyBAQAogCQl9CiAJCWkrKzsKIAl9IHdoaWxlIChpIDwgbGVuKTsKLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwppbmRleCAxZDMyMWMzLi41NWVmNmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwpAQCAtOTM4LDcgKzkzOCw2IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwogCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KIHsKQEAgLTk1Niw5ICs5NTUsOSBAQAogCQkvKiBleHRyYSBieXRlcy4uLi4uLCBjb3VsZCBiZSBwcm9jZXNzZWQgdG9vIGJ1dCB3b3VsZCBiZQogCQkgKiBhIHdhc3RlIG9mIHRpbWUsIHJpZ2h0IG5vdyBsZWF2ZSB0aGUgYXBwbGljYXRpb24gYW5kCiAJCSAqIGxpYmpwZWcgZG8gaXQgZm9yIG91cnNlcmx2ZXMuLiAqLwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCiAJCQkJCWZmZDksIDIpOwotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk2Nyw3ICs5NjYsNyBAQAogCQkgKiBvdGhlcidzIGRvIG5vdCBpbmNsdWRlIGl0Li4uICovCiAJCWxlbiAtPSAyOwogCX0KLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90djg1MzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdHY4NTMyLmMKaW5kZXggNGI0NGRkZS4uYjc0YTNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90djg1MzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3R2ODUzMi5jCkBAIC0zOTgsOCArMzk4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCi0JCQlfX3U4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKQEAgLTQyNCw5ICs0MjMsOSBAQAogCSAqIC0gNCBieXRlcwogCSAqLwogCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIHBhY2tldF90eXBlMCwKLQkJCWZyYW1lLCBkYXRhICsgMiwgZ3NwY2FfZGV2LT53aWR0aCk7CisJCQlkYXRhICsgMiwgZ3NwY2FfZGV2LT53aWR0aCk7CiAJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUxLAotCQkJZnJhbWUsIGRhdGEgKyBnc3BjYV9kZXYtPndpZHRoICsgNSwgZ3NwY2FfZGV2LT53aWR0aCk7CisJCQlkYXRhICsgZ3NwY2FfZGV2LT53aWR0aCArIDUsIGdzcGNhX2Rldi0+d2lkdGgpOwogfQogCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZjMDMyeC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYwppbmRleCA1ODkwNDJmLi5jMDkwZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZjMDMyeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMKQEAgLTI5ODcsNyArMjk4Nyw2IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwogCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkJLyogaXNvIHBrdCBsZW5ndGggKi8KIHsKQEAgLTI5OTYsMjEgKzI5OTUsMjUgQEAKIAlpZiAoZGF0YVswXSA9PSAweGZmICYmIGRhdGFbMV0gPT0gMHhkOCkgewogCQlQREVCVUcoRF9QQUNLLAogCQkJInZjMDMyeCBoZWFkZXIgcGFja2V0IGZvdW5kIGxlbiAlZCIsIGxlbik7Ci0JCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLAotCQkJCQkJZGF0YSwgMCk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKIAkJZGF0YSArPSBzZC0+aW1hZ2Vfb2Zmc2V0OwogCQlsZW4gLT0gc2QtPmltYWdlX29mZnNldDsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKLQkJCQlkYXRhLCBsZW4pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBUaGUgdmMwMzIxIHNlbmRzIHNvbWUgYWRkaXRpb25hbCBkYXRhIGFmdGVyIHNlbmRpbmcgdGhlIGNvbXBsZXRlCiAJICogZnJhbWUsIHdlIGlnbm9yZSB0aGlzLiAqLwotCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9WQzAzMjEKLQkgICAgJiYgbGVuID4gZnJhbWUtPnY0bDJfYnVmLmxlbmd0aCAtIChmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YSkpCi0JCWxlbiA9IGZyYW1lLT52NGwyX2J1Zi5sZW5ndGggLSAoZnJhbWUtPmRhdGFfZW5kIC0gZnJhbWUtPmRhdGEpOwotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1ZDMDMyMSkgeworCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOworCQlpbnQgbDsKKworCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7CisJCWwgPSBmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YTsKKwkJaWYgKGxlbiA+IGZyYW1lLT52NGwyX2J1Zi5sZW5ndGggLSBsKQorCQkJbGVuID0gZnJhbWUtPnY0bDJfYnVmLmxlbmd0aCAtIGw7CisJfQorCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAogc3RhdGljIGludCBzZF9zZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTMwOTIsNiArMzA5NSw4IEBACiAKIAlzd2l0Y2ggKG1lbnUtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWToKKwkJaWYgKG1lbnUtPmluZGV4ID49IEFSUkFZX1NJWkUoZnJlcV9ubSkpCisJCQlicmVhazsKIAkJc3RyY3B5KChjaGFyICopIG1lbnUtPm5hbWUsIGZyZXFfbm1bbWVudS0+aW5kZXhdKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS93OTk2WGNmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3c5OTZYY2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmZmZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS93OTk2WGNmLmMKQEAgLTAsMCArMSw2MDkgQEAKKy8qKgorICoKKyAqIEdTUENBIHN1YiBkcml2ZXIgZm9yIFc5OTZbNzhdQ0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGFkYXB0ZWQgZnJvbSB0aGUgaW4ga2VybmVsIHY0bDEgdzk5NjhjZiBkcml2ZXI6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qIE5vdGUgdGhpcyBpcyBub3QgYSBzdGFuZCBhbG9uZSBkcml2ZXIsIGl0IGdldHMgaW5jbHVkZWQgaW4gb3Y1MTkuYywgdGhpcworICAgaXMgYSBiaXQgb2YgYSBoYWNrLCBidXQgaXQgbmVlZHMgdGhlIGRyaXZlciBjb2RlIGZvciBhIGxvdCBvZiBkaWZmZXJlbnQKKyAgIG92IHNlbnNvcnMgd2hpY2ggaXMgYWxyZWFkeSBwcmVzZW50IGluIG92NTE5LmMgKHRoZSBvbGQgdjRsMSBkcml2ZXIgdXNlZAorICAgdGhlIG92Y2hpcGNhbSBmcmFtZXdvcmspLiBXaGVuIHdlIGhhdmUgdGhlIHRpbWUgd2UgcmVhbGx5IHNob3VsZCBtb3ZlCisgICB0aGUgc2Vuc29yIGRyaXZlcnMgdG8gdjRsMiBzdWIgZHJpdmVycywgYW5kIHByb3Blcmx5IHNwbGl0IG9mIHRoaXMKKyAgIGRyaXZlciBmcm9tIG92NTE5LmMgKi8KKworLyogVGhlIENPTkVYX0NBTSBkZWZpbmUgZm9yIGpwZWcuaCBuZWVkcyByZW5hbWluZywgbm93IGl0cyB1c2VkIGhlcmUgdG9vICovCisjZGVmaW5lIENPTkVYX0NBTQorI2luY2x1ZGUgImpwZWcuaCIKKworI2RlZmluZSBXOTk2OENGX0kyQ19CVVNfREVMQVkgICAgNCAvKiBkZWxheSBpbiB1cyBmb3IgSTJDIGJpdCByL3cgb3BlcmF0aW9ucyAqLworCisjZGVmaW5lIFlfUVVBTlRBQkxFIChzZC0+anBlZ19oZHIgKyBKUEVHX1FUMF9PRkZTRVQpCisjZGVmaW5lIFVWX1FVQU5UQUJMRSAoc2QtPmpwZWdfaGRyICsgSlBFR19RVDFfT0ZGU0VUKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB3OTk2OGNmX3ZnYV9tb2RlW10gPSB7CisJezE2MCwgMTIwLCBWNEwyX1BJWF9GTVRfVVlWWSwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMTYwICogMiwKKwkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCAqIDIsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAorCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX1VZVlksIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDE3NiAqIDIsCisJCS5zaXplaW1hZ2UgPSAxNzYgKiAxNDQgKiAyLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKKwl7MzIwLCAyNDAsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSAzMjAgKiAyLAorCQkuc2l6ZWltYWdlID0gMzIwICogMjQwICogMiwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFR30sCisJezM1MiwgMjg4LCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMzUyICogMiwKKwkJLnNpemVpbWFnZSA9IDM1MiAqIDI4OCAqIDIsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAorCXs2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDY0MCAqIDIsCisJCS5zaXplaW1hZ2UgPSA2NDAgKiA0ODAgKiAyLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKK307CisKK3N0YXRpYyBpbnQgcmVnX3coc3RydWN0IHNkICpzZCwgX191MTYgaW5kZXgsIF9fdTE2IHZhbHVlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXcml0ZSA2NC1iaXQgZGF0YSB0byB0aGUgZmFzdCBzZXJpYWwgYnVzIHJlZ2lzdGVycy4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfZnNiKHN0cnVjdCBzZCAqc2QsIHUxNiogZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OworCXUxNiB2YWx1ZTsKKwlpbnQgcmV0OworCisJdmFsdWUgPSAqZGF0YSsrOworCW1lbWNweShzZC0+Z3NwY2FfZGV2LnVzYl9idWYsIGRhdGEsIDYpOworCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwgMCwKKwkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgIHZhbHVlLCAweDA2LCBzZC0+Z3NwY2FfZGV2LnVzYl9idWYsIDYsIDUwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAiV3JpdGUgRlNCIHJlZ2lzdGVycyBmYWlsZWQgKCVkKSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV3JpdGUgZGF0YSB0byB0aGUgc2VyaWFsIGJ1cyBjb250cm9sIHJlZ2lzdGVyLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl93cml0ZV9zYihzdHJ1Y3Qgc2QgKnNkLCB1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKworCS8qIFdlIGRvbid0IHVzZSByZWdfdyBoZXJlLCBhcyB0aGF0IHdvdWxkIGNhdXNlIGFsbCB3cml0ZXMgd2hlbgorCSAgIGJpdGJhbmdpbmcgaTJjIHRvIGJlIGxvZ2dlZCwgbWFraW5nIHRoZSBsb2dzIGltcG9zc2libGUgdG8gcmVhZCAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhzZC0+Z3NwY2FfZGV2LmRldiwKKwkJdXNiX3NuZGN0cmxwaXBlKHNkLT5nc3BjYV9kZXYuZGV2LCAwKSwKKwkJMCwKKwkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQl2YWx1ZSwgMHgwMSwgTlVMTCwgMCwgNTAwKTsKKworCXVkZWxheShXOTk2OENGX0kyQ19CVVNfREVMQVkpOworCisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAiV3JpdGUgU0IgcmVnIFswMV0gJTA0eCBmYWlsZWQiLCB2YWx1ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmVhZCBkYXRhIGZyb20gdGhlIHNlcmlhbCBidXMgY29udHJvbCByZWdpc3Rlci4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2ZfcmVhZF9zYihzdHJ1Y3Qgc2QgKnNkKQoreworCWludCByZXQ7CisKKwkvKiBXZSBkb24ndCB1c2UgcmVnX3IgaGVyZSwgYXMgdGhlIHc5OTY4Y2YgaXMgc3BlY2lhbCBhbmQgaGFzIDE2CisJICAgYml0IHJlZ2lzdGVycyBpbnN0ZWFkIG9mIDggYml0ICovCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHNkLT5nc3BjYV9kZXYuZGV2LAorCQkJdXNiX3JjdmN0cmxwaXBlKHNkLT5nc3BjYV9kZXYuZGV2LCAwKSwKKwkJCTEsCisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCTAsIDB4MDEsIHNkLT5nc3BjYV9kZXYudXNiX2J1ZiwgMiwgNTAwKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZlswXSB8CisJCSAgICAgIChzZC0+Z3NwY2FfZGV2LnVzYl9idWZbMV0gPDwgOCk7CisJZWxzZQorCQlQREVCVUcoRF9FUlIsICJSZWFkIFNCIHJlZyBbMDFdIGZhaWxlZCIpOworCisJdWRlbGF5KFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFVwbG9hZCBxdWFudGl6YXRpb24gdGFibGVzIGZvciB0aGUgSlBFRyBjb21wcmVzc2lvbi4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdzk5NjhjZl9zdGFydF90cmFuc2ZlcigpLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl91cGxvYWRfcXVhbnRpemF0aW9udGFibGVzKHN0cnVjdCBzZCAqc2QpCit7CisJdTE2IGEsIGI7CisJaW50IHJldCA9IDAsIGksIGo7CisKKwlyZXQgKz0gcmVnX3coc2QsIDB4MzksIDB4MDAxMCk7IC8qIEpQRUcgY2xvY2sgZW5hYmxlICovCisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDMyOyBpKyssIGogKz0gMikgeworCQlhID0gWV9RVUFOVEFCTEVbal0gfCAoKHVuc2lnbmVkKShZX1FVQU5UQUJMRVtqKzFdKSA8PCA4KTsKKwkJYiA9IFVWX1FVQU5UQUJMRVtqXSB8ICgodW5zaWduZWQpKFVWX1FVQU5UQUJMRVtqKzFdKSA8PCA4KTsKKwkJcmV0ICs9IHJlZ193KHNkLCAweDQwK2ksIGEpOworCQlyZXQgKz0gcmVnX3coc2QsIDB4NjAraSwgYik7CisJfQorCXJldCArPSByZWdfdyhzZCwgMHgzOSwgMHgwMDEyKTsgLyogSlBFRyBlbmNvZGVyIGVuYWJsZSAqLworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdy1sZXZlbCBJMkMgSS9PIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEkyQyB0cmFuc2ZlciBmdW5jdGlvbnM6ICAgICAgICAgICAgICAgKgorICogaTJjX2FkYXBfZmFzdHdyaXRlX2J5dGVfZGF0YSgpIChhdCA0MDAga0h6IGJpdCBmcmVxdWVuY3kgb25seSkgICAgICAgICAgICoKKyAqIGkyY19hZGFwX3JlYWRfYnl0ZV9kYXRhKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBpMmNfYWRhcF9yZWFkX2J5dGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19zdGFydChzdHJ1Y3Qgc2QgKnNkKQoreworCWludCByZXQgPSAwOworCisJcmV0ICs9IHc5OTY4Y2Zfd3JpdGVfc2Ioc2QsIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KKwlyZXQgKz0gdzk5NjhjZl93cml0ZV9zYihzZCwgMHgwMDEwKTsgLyogU0RFPTEsIFNEQT0wLCBTQ0w9MCAqLworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3N0b3Aoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCArPSB3OTk2OGNmX3dyaXRlX3NiKHNkLCAweDAwMTApOyAvKiBTREU9MSwgU0RBPTAsIFNDTD0wICovCisJcmV0ICs9IHc5OTY4Y2Zfd3JpdGVfc2Ioc2QsIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KKwlyZXQgKz0gdzk5NjhjZl93cml0ZV9zYihzZCwgMHgwMDEzKTsgLyogU0RFPTEsIFNEQT0xLCBTQ0w9MSAqLworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IHNkICpzZCwgdTggdikKK3sKKwl1OCBiaXQ7CisJaW50IHJldCA9IDAsIHNkYTsKKworCWZvciAoYml0ID0gMCA7IGJpdCA8IDggOyBiaXQrKykgeworCQlzZGEgPSAodiAmIDB4ODApID8gMiA6IDA7CisJCXYgPDw9IDE7CisJCS8qIFNERT0xLCBTREE9c2RhLCBTQ0w9MCAqLworCQlyZXQgKz0gdzk5NjhjZl93cml0ZV9zYihzZCwgMHgxMCB8IHNkYSk7CisJCS8qIFNERT0xLCBTREE9c2RhLCBTQ0w9MSAqLworCQlyZXQgKz0gdzk5NjhjZl93cml0ZV9zYihzZCwgMHgxMSB8IHNkYSk7CisJCS8qIFNERT0xLCBTREE9c2RhLCBTQ0w9MCAqLworCQlyZXQgKz0gdzk5NjhjZl93cml0ZV9zYihzZCwgMHgxMCB8IHNkYSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlYWRfYnl0ZShzdHJ1Y3Qgc2QgKnNkLCB1OCogdikKK3sKKwl1OCBiaXQ7CisJaW50IHJldCA9IDA7CisKKwkvKiBObyBuZWVkIHRvIGVuc3VyZSBTREEgaXMgaGlnaCBhcyB3ZSBhcmUgYWx3YXlzIGNhbGxlZCBhZnRlcgorCSAgIHJlYWRfYWNrIHdoaWNoIGVuZHMgd2l0aCBTREEgaGlnaCAqLworCSp2ID0gMDsKKwlmb3IgKGJpdCA9IDAgOyBiaXQgPCA4IDsgYml0KyspIHsKKwkJKnYgPDw9IDE7CisJCS8qIFNERT0xLCBTREE9MSwgU0NMPTEgKi8KKwkJcmV0ICs9IHc5OTY4Y2Zfd3JpdGVfc2Ioc2QsIDB4MDAxMyk7CisJCSp2IHw9ICh3OTk2OGNmX3JlYWRfc2Ioc2QpICYgMHgwMDA4KSA/IDEgOiAwOworCQkvKiBTREU9MSwgU0RBPTEsIFNDTD0wICovCisJCXJldCArPSB3OTk2OGNmX3dyaXRlX3NiKHNkLCAweDAwMTIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c193cml0ZV9uYWNrKHN0cnVjdCBzZCAqc2QpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBObyBuZWVkIHRvIGVuc3VyZSBTREEgaXMgaGlnaCBhcyB3ZSBhcmUgYWx3YXlzIGNhbGxlZCBhZnRlcgorCSAgIHJlYWRfYnl0ZSB3aGljaCBlbmRzIHdpdGggU0RBIGhpZ2ggKi8KKwlyZXQgKz0gdzk5NjhjZl93cml0ZV9zYihzZCwgMHgwMDEzKTsgLyogU0RFPTEsIFNEQT0xLCBTQ0w9MSAqLworCXJldCArPSB3OTk2OGNmX3dyaXRlX3NiKHNkLCAweDAwMTIpOyAvKiBTREU9MSwgU0RBPTEsIFNDTD0wICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgcmV0ID0gMCwgc2RhOworCisJLyogRW5zdXJlIFNEQSBpcyBoaWdoIGJlZm9yZSByYWlzaW5nIGNsb2NrIHRvIGF2b2lkIGEgc3B1cmlvdXMgc3RvcCAqLworCXJldCArPSB3OTk2OGNmX3dyaXRlX3NiKHNkLCAweDAwMTIpOyAvKiBTREU9MSwgU0RBPTEsIFNDTD0wICovCisJcmV0ICs9IHc5OTY4Y2Zfd3JpdGVfc2Ioc2QsIDB4MDAxMyk7IC8qIFNERT0xLCBTREE9MSwgU0NMPTEgKi8KKwlzZGEgPSB3OTk2OGNmX3JlYWRfc2Ioc2QpOworCXJldCArPSB3OTk2OGNmX3dyaXRlX3NiKHNkLCAweDAwMTIpOyAvKiBTREU9MSwgU0RBPTEsIFNDTD0wICovCisJaWYgKHNkYSA8IDApCisJCXJldCArPSBzZGE7CisJZWxzZSBpZiAoc2RhICYgMHgwOCkgeworCQlQREVCVUcoRF9VU0JJLCAiRGlkIG5vdCByZWNlaXZlIGkyYyBBQ0siKTsKKwkJcmV0ICs9IC0xOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFNNQnVzIHByb3RvY29sOiBTIEFkZHIgV3IgW0FdIFN1YmFkZHIgW0FdIFZhbHVlIFtBXSBQICovCitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX3coc3RydWN0IHNkICpzZCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwl1MTYqIGRhdGEgPSAodTE2ICopc2QtPmdzcGNhX2Rldi51c2JfYnVmOworCWludCByZXQgPSAwOworCisJZGF0YVswXSA9IDB4MDgyZiB8ICgoc2QtPnNlbnNvcl9hZGRyICYgMHg4MCkgPyAweDE1MDAgOiAweDApOworCWRhdGFbMF0gfD0gKHNkLT5zZW5zb3JfYWRkciAmIDB4NDApID8gMHg0MDAwIDogMHgwOworCWRhdGFbMV0gPSAweDIwODIgfCAoKHNkLT5zZW5zb3JfYWRkciAmIDB4NDApID8gMHgwMDA1IDogMHgwKTsKKwlkYXRhWzFdIHw9IChzZC0+c2Vuc29yX2FkZHIgJiAweDIwKSA/IDB4MDE1MCA6IDB4MDsKKwlkYXRhWzFdIHw9IChzZC0+c2Vuc29yX2FkZHIgJiAweDEwKSA/IDB4NTQwMCA6IDB4MDsKKwlkYXRhWzJdID0gMHg4MjA4IHwgKChzZC0+c2Vuc29yX2FkZHIgJiAweDA4KSA/IDB4MDAxNSA6IDB4MCk7CisJZGF0YVsyXSB8PSAoc2QtPnNlbnNvcl9hZGRyICYgMHgwNCkgPyAweDA1NDAgOiAweDA7CisJZGF0YVsyXSB8PSAoc2QtPnNlbnNvcl9hZGRyICYgMHgwMikgPyAweDUwMDAgOiAweDA7CisJZGF0YVszXSA9IDB4MWQyMCB8ICgoc2QtPnNlbnNvcl9hZGRyICYgMHgwMikgPyAweDAwMDEgOiAweDApOworCWRhdGFbM10gfD0gKHNkLT5zZW5zb3JfYWRkciAmIDB4MDEpID8gMHgwMDU0IDogMHgwOworCisJcmV0ICs9IHc5OTY4Y2Zfd3JpdGVfZnNiKHNkLCBkYXRhKTsKKworCWRhdGFbMF0gPSAweDgyMDggfCAoKHJlZyAmIDB4ODApID8gMHgwMDE1IDogMHgwKTsKKwlkYXRhWzBdIHw9IChyZWcgJiAweDQwKSA/IDB4MDU0MCA6IDB4MDsKKwlkYXRhWzBdIHw9IChyZWcgJiAweDIwKSA/IDB4NTAwMCA6IDB4MDsKKwlkYXRhWzFdID0gMHgwODIwIHwgKChyZWcgJiAweDIwKSA/IDB4MDAwMSA6IDB4MCk7CisJZGF0YVsxXSB8PSAocmVnICYgMHgxMCkgPyAweDAwNTQgOiAweDA7CisJZGF0YVsxXSB8PSAocmVnICYgMHgwOCkgPyAweDE1MDAgOiAweDA7CisJZGF0YVsxXSB8PSAocmVnICYgMHgwNCkgPyAweDQwMDAgOiAweDA7CisJZGF0YVsyXSA9IDB4MjA4MiB8ICgocmVnICYgMHgwNCkgPyAweDAwMDUgOiAweDApOworCWRhdGFbMl0gfD0gKHJlZyAmIDB4MDIpID8gMHgwMTUwIDogMHgwOworCWRhdGFbMl0gfD0gKHJlZyAmIDB4MDEpID8gMHg1NDAwIDogMHgwOworCWRhdGFbM10gPSAweDAwMWQ7CisKKwlyZXQgKz0gdzk5NjhjZl93cml0ZV9mc2Ioc2QsIGRhdGEpOworCisJZGF0YVswXSA9IDB4ODIwOCB8ICgodmFsdWUgJiAweDgwKSA/IDB4MDAxNSA6IDB4MCk7CisJZGF0YVswXSB8PSAodmFsdWUgJiAweDQwKSA/IDB4MDU0MCA6IDB4MDsKKwlkYXRhWzBdIHw9ICh2YWx1ZSAmIDB4MjApID8gMHg1MDAwIDogMHgwOworCWRhdGFbMV0gPSAweDA4MjAgfCAoKHZhbHVlICYgMHgyMCkgPyAweDAwMDEgOiAweDApOworCWRhdGFbMV0gfD0gKHZhbHVlICYgMHgxMCkgPyAweDAwNTQgOiAweDA7CisJZGF0YVsxXSB8PSAodmFsdWUgJiAweDA4KSA/IDB4MTUwMCA6IDB4MDsKKwlkYXRhWzFdIHw9ICh2YWx1ZSAmIDB4MDQpID8gMHg0MDAwIDogMHgwOworCWRhdGFbMl0gPSAweDIwODIgfCAoKHZhbHVlICYgMHgwNCkgPyAweDAwMDUgOiAweDApOworCWRhdGFbMl0gfD0gKHZhbHVlICYgMHgwMikgPyAweDAxNTAgOiAweDA7CisJZGF0YVsyXSB8PSAodmFsdWUgJiAweDAxKSA/IDB4NTQwMCA6IDB4MDsKKwlkYXRhWzNdID0gMHhmZTFkOworCisJcmV0ICs9IHc5OTY4Y2Zfd3JpdGVfZnNiKHNkLCBkYXRhKTsKKworCWlmICghcmV0KQorCQlQREVCVUcoRF9VU0JPLCAiaTJjIDB4JTAyeCAtPiBbMHglMDJ4XSIsIHZhbHVlLCByZWcpOworCWVsc2UKKwkJUERFQlVHKERfRVJSLCAiaTJjIDB4JTAyeCAtPiBbMHglMDJ4XSBmYWlsZWQiLCB2YWx1ZSwgcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFNNQnVzIHByb3RvY29sOiBTIEFkZHIgV3IgW0FdIFN1YmFkZHIgW0FdIFAgUyBBZGRyKzEgUmQgW0FdIFtWYWx1ZV0gTkEgUCAqLworc3RhdGljIGludCB3OTk2OGNmX2kyY19yKHN0cnVjdCBzZCAqc2QsIHU4IHJlZykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCB2YWx1ZTsKKworCS8qIEZhc3Qgc2VyaWFsIGJ1cyBkYXRhIGNvbnRyb2wgZGlzYWJsZSAqLworCXJldCArPSB3OTk2OGNmX3dyaXRlX3NiKHNkLCAweDAwMTMpOyAvKiBkb24ndCBjaGFuZ2UgISAqLworCisJcmV0ICs9IHc5OTY4Y2Zfc21idXNfc3RhcnQoc2QpOworCXJldCArPSB3OTk2OGNmX3NtYnVzX3dyaXRlX2J5dGUoc2QsIHNkLT5zZW5zb3JfYWRkcik7CisJcmV0ICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soc2QpOworCXJldCArPSB3OTk2OGNmX3NtYnVzX3dyaXRlX2J5dGUoc2QsIHJlZyk7CisJcmV0ICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soc2QpOworCXJldCArPSB3OTk2OGNmX3NtYnVzX3N0b3Aoc2QpOworCXJldCArPSB3OTk2OGNmX3NtYnVzX3N0YXJ0KHNkKTsKKwlyZXQgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKHNkLCBzZC0+c2Vuc29yX2FkZHIgKyAxKTsKKwlyZXQgKz0gdzk5NjhjZl9zbWJ1c19yZWFkX2FjayhzZCk7CisJcmV0ICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9ieXRlKHNkLCAmdmFsdWUpOworCS8qIHNpZ25hbCB3ZSBkb24ndCB3YW50IHRvIHJlYWQgYW55bW9yZSwgdGhlIHY0bDEgZHJpdmVyIHVzZWQgdG8KKwkgICBzZW5kIGFuIGFjayBoZXJlIHdoaWNoIGlzIHZlcnkgd3JvbmchIChhbmQgdGhlbiBmaXhlZAorCSAgIHRoZSBpc3N1ZXMgdGhpcyBnYXZlIGJ5IHJldHJ5aW5nIHJlYWRzKSAqLworCXJldCArPSB3OTk2OGNmX3NtYnVzX3dyaXRlX25hY2soc2QpOworCXJldCArPSB3OTk2OGNmX3NtYnVzX3N0b3Aoc2QpOworCisJLyogRmFzdCBzZXJpYWwgYnVzIGRhdGEgY29udHJvbCByZS1lbmFibGUgKi8KKwlyZXQgKz0gdzk5NjhjZl93cml0ZV9zYihzZCwgMHgwMDMwKTsKKworCWlmICghcmV0KSB7CisJCXJldCA9IHZhbHVlOworCQlQREVCVUcoRF9VU0JJLCAiaTJjIFsweCUwMlhdIC0+IDB4JTAyWCIsIHJlZywgdmFsdWUpOworCX0gZWxzZQorCQlQREVCVUcoRF9FUlIsICJpMmMgcmVhZCBbMHglMDJ4XSBmYWlsZWQiLCByZWcpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFR1cm4gb24gdGhlIExFRCBvbiBzb21lIHdlYmNhbXMuIEEgYmVlcCBzaG91bGQgYmUgaGVhcmQgdG9vLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9jb25maWd1cmUoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCArPSByZWdfdyhzZCwgMHgwMCwgMHhmZjAwKTsgLyogcG93ZXItZG93biAqLworCXJldCArPSByZWdfdyhzZCwgMHgwMCwgMHhiZjE3KTsgLyogcmVzZXQgZXZlcnl0aGluZyAqLworCXJldCArPSByZWdfdyhzZCwgMHgwMCwgMHhiZjEwKTsgLyogbm9ybWFsIG9wZXJhdGlvbiAqLworCXJldCArPSByZWdfdyhzZCwgMHgwMSwgMHgwMDEwKTsgLyogc2VyaWFsIGJ1cywgU0RTIGhpZ2ggKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MDEsIDB4MDAwMCk7IC8qIHNlcmlhbCBidXMsIFNEUyBsb3cgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MDEsIDB4MDAxMCk7IC8qIC4uaGlnaCAnYmVlcC1iZWVwJyAqLworCXJldCArPSByZWdfdyhzZCwgMHgwMSwgMHgwMDMwKTsgLyogU2V0IHNkYSBzY2wgdG8gRlNCIG1vZGUgKi8KKworCWlmIChyZXQpCisJCVBERUJVRyhEX0VSUiwgIkNvdWxkbid0IHR1cm4gb24gdGhlIExFRCIpOworCisJc2QtPnN0b3BwZWQgPSAxOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3OTk2OGNmX2luaXQoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGh3X2J1ZnNpemUgPSBzZC0+c2lmID8gKDM1MiAqIDI4OCAqIDIpIDogKDY0MCAqIDQ4MCAqIDIpLAorCQkgICAgICB5MCA9IDB4MDAwMCwKKwkJICAgICAgdTAgPSB5MCArIGh3X2J1ZnNpemUvMiwKKwkJICAgICAgdjAgPSB1MCArIGh3X2J1ZnNpemUvNCwKKwkJICAgICAgeTEgPSB2MCArIGh3X2J1ZnNpemUvNCwKKwkJICAgICAgdTEgPSB5MSArIGh3X2J1ZnNpemUvMiwKKwkJICAgICAgdjEgPSB1MSArIGh3X2J1ZnNpemUvNDsKKworCXJldCArPSByZWdfdyhzZCwgMHgwMCwgMHhmZjAwKTsgLyogcG93ZXIgb2ZmICovCisJcmV0ICs9IHJlZ193KHNkLCAweDAwLCAweGJmMTApOyAvKiBwb3dlciBvbiAqLworCisJcmV0ICs9IHJlZ193KHNkLCAweDAzLCAweDQwNWQpOyAvKiBEUkFNIHRpbWluZ3MgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MDQsIDB4MDAzMCk7IC8qIFNEUkFNIHRpbWluZ3MgKi8KKworCXJldCArPSByZWdfdyhzZCwgMHgyMCwgeTAgJiAweGZmZmYpOyAvKiBZIGJ1Zi4wLCBsb3cgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MjEsIHkwID4+IDE2KTsgICAgLyogWSBidWYuMCwgaGlnaCAqLworCXJldCArPSByZWdfdyhzZCwgMHgyNCwgdTAgJiAweGZmZmYpOyAvKiBVIGJ1Zi4wLCBsb3cgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MjUsIHUwID4+IDE2KTsgICAgLyogVSBidWYuMCwgaGlnaCAqLworCXJldCArPSByZWdfdyhzZCwgMHgyOCwgdjAgJiAweGZmZmYpOyAvKiBWIGJ1Zi4wLCBsb3cgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MjksIHYwID4+IDE2KTsgICAgLyogViBidWYuMCwgaGlnaCAqLworCisJcmV0ICs9IHJlZ193KHNkLCAweDIyLCB5MSAmIDB4ZmZmZik7IC8qIFkgYnVmLjEsIGxvdyAqLworCXJldCArPSByZWdfdyhzZCwgMHgyMywgeTEgPj4gMTYpOyAgICAvKiBZIGJ1Zi4xLCBoaWdoICovCisJcmV0ICs9IHJlZ193KHNkLCAweDI2LCB1MSAmIDB4ZmZmZik7IC8qIFUgYnVmLjEsIGxvdyAqLworCXJldCArPSByZWdfdyhzZCwgMHgyNywgdTEgPj4gMTYpOyAgICAvKiBVIGJ1Zi4xLCBoaWdoICovCisJcmV0ICs9IHJlZ193KHNkLCAweDJhLCB2MSAmIDB4ZmZmZik7IC8qIFYgYnVmLjEsIGxvdyAqLworCXJldCArPSByZWdfdyhzZCwgMHgyYiwgdjEgPj4gMTYpOyAgICAvKiBWIGJ1Zi4xLCBoaWdoICovCisKKwlyZXQgKz0gcmVnX3coc2QsIDB4MzIsIHkxICYgMHhmZmZmKTsgLyogSlBFRyBidWYgMCBsb3cgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MzMsIHkxID4+IDE2KTsgICAgLyogSlBFRyBidWYgMCBoaWdoICovCisKKwlyZXQgKz0gcmVnX3coc2QsIDB4MzQsIHkxICYgMHhmZmZmKTsgLyogSlBFRyBidWYgMSBsb3cgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4MzUsIHkxID4+IDE2KTsgICAgLyogSlBFRyBidWcgMSBoaWdoICovCisKKwlyZXQgKz0gcmVnX3coc2QsIDB4MzYsIDB4MDAwMCk7LyogSlBFRyByZXN0YXJ0IGludGVydmFsICovCisJcmV0ICs9IHJlZ193KHNkLCAweDM3LCAweDA4MDQpOy8qSlBFRyBWTEUgRklGTyB0aHJlc2hvbGQqLworCXJldCArPSByZWdfdyhzZCwgMHgzOCwgMHgwMDAwKTsvKiBkaXNhYmxlIGh3IHVwLXNjYWxpbmcgKi8KKwlyZXQgKz0gcmVnX3coc2QsIDB4M2YsIDB4MDAwMCk7IC8qIEpQRUcvTUNUTCB0ZXN0IGRhdGEgKi8KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zZXRfY3JvcF93aW5kb3coc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgcmV0ID0gMCwgc3RhcnRfY3JvcHgsIHN0YXJ0X2Nyb3B5LCAgeCwgeSwgZncsIGZoLCBjdywgY2gsCisJICAgIG1heF93aWR0aCwgbWF4X2hlaWdodDsKKworCWlmIChzZC0+c2lmKSB7CisJCW1heF93aWR0aCAgPSAzNTI7CisJCW1heF9oZWlnaHQgPSAyODg7CisJfSBlbHNlIHsKKwkJbWF4X3dpZHRoICA9IDY0MDsKKwkJbWF4X2hlaWdodCA9IDQ4MDsKKwl9CisKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjIwKSB7CisJCS8qIFNpZ2gsIHRoaXMgaXMgZGVwZW5kZW5kIG9uIHRoZSBjbG9jayAvIGZyYW1lcmF0ZSBjaGFuZ2VzCisJCSAgIG1hZGUgYnkgdGhlIGZyZXF1ZW5jeSBjb250cm9sLCBzaWNrLiAqLworCQlpZiAoc2QtPmZyZXEgPT0gMSkgeworCQkJc3RhcnRfY3JvcHggPSAyNzc7CisJCQlzdGFydF9jcm9weSA9IDM3OworCQl9IGVsc2UgeworCQkJc3RhcnRfY3JvcHggPSAxMDU7CisJCQlzdGFydF9jcm9weSA9IDM3OworCQl9CisJfSBlbHNlIHsKKwkJc3RhcnRfY3JvcHggPSAzMjA7CisJCXN0YXJ0X2Nyb3B5ID0gMzU7CisJfQorCisJLyogV29yayBhcm91bmQgdG8gYXZvaWQgRlAgYXJpdGhtZXRpY3MgKi8KKwkjZGVmaW5lIFNDKHgpICgoeCkgPDwgMTApCisKKwkvKiBTY2FsaW5nIGZhY3RvcnMgKi8KKwlmdyA9IFNDKHNkLT5nc3BjYV9kZXYud2lkdGgpIC8gbWF4X3dpZHRoOworCWZoID0gU0Moc2QtPmdzcGNhX2Rldi5oZWlnaHQpIC8gbWF4X2hlaWdodDsKKworCWN3ID0gKGZ3ID49IGZoKSA/IG1heF93aWR0aCA6IFNDKHNkLT5nc3BjYV9kZXYud2lkdGgpL2ZoOworCWNoID0gKGZ3ID49IGZoKSA/IFNDKHNkLT5nc3BjYV9kZXYuaGVpZ2h0KS9mdyA6IG1heF9oZWlnaHQ7CisKKwlzZC0+c2Vuc29yX3dpZHRoID0gbWF4X3dpZHRoOworCXNkLT5zZW5zb3JfaGVpZ2h0ID0gbWF4X2hlaWdodDsKKworCXggPSAobWF4X3dpZHRoIC0gY3cpIC8gMjsKKwl5ID0gKG1heF9oZWlnaHQgLSBjaCkgLyAyOworCisJcmV0ICs9IHJlZ193KHNkLCAweDEwLCBzdGFydF9jcm9weCArIHgpOworCXJldCArPSByZWdfdyhzZCwgMHgxMSwgc3RhcnRfY3JvcHkgKyB5KTsKKwlyZXQgKz0gcmVnX3coc2QsIDB4MTIsIHN0YXJ0X2Nyb3B4ICsgeCArIGN3KTsKKwlyZXQgKz0gcmVnX3coc2QsIDB4MTMsIHN0YXJ0X2Nyb3B5ICsgeSArIGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdzk5NjhjZl9tb2RlX2luaXRfcmVncyhzdHJ1Y3Qgc2QgKnNkKQoreworCWludCByZXQgPSAwLCB2YWwsIHZzX3BvbGFyaXR5LCBoc19wb2xhcml0eTsKKworCXJldCArPSB3OTk2OGNmX3NldF9jcm9wX3dpbmRvdyhzZCk7CisKKwlyZXQgKz0gcmVnX3coc2QsIDB4MTQsIHNkLT5nc3BjYV9kZXYud2lkdGgpOworCXJldCArPSByZWdfdyhzZCwgMHgxNSwgc2QtPmdzcGNhX2Rldi5oZWlnaHQpOworCisJLyogSlBFRyB3aWR0aCAmIGhlaWdodCAqLworCXJldCArPSByZWdfdyhzZCwgMHgzMCwgc2QtPmdzcGNhX2Rldi53aWR0aCk7CisJcmV0ICs9IHJlZ193KHNkLCAweDMxLCBzZC0+Z3NwY2FfZGV2LmhlaWdodCk7CisKKwkvKiBZICYgVVYgZnJhbWUgYnVmZmVyIHN0cmlkZXMgKGluIFdPUkQpICovCisJaWYgKHc5OTY4Y2ZfdmdhX21vZGVbc2QtPmdzcGNhX2Rldi5jdXJyX21vZGVdLnBpeGVsZm9ybWF0ID09CisJICAgIFY0TDJfUElYX0ZNVF9KUEVHKSB7CisJCXJldCArPSByZWdfdyhzZCwgMHgyYywgc2QtPmdzcGNhX2Rldi53aWR0aC8yKTsKKwkJcmV0ICs9IHJlZ193KHNkLCAweDJkLCBzZC0+Z3NwY2FfZGV2LndpZHRoLzQpOworCX0gZWxzZQorCQlyZXQgKz0gcmVnX3coc2QsIDB4MmMsIHNkLT5nc3BjYV9kZXYud2lkdGgpOworCisJcmV0ICs9IHJlZ193KHNkLCAweDAwLCAweGJmMTcpOyAvKiByZXNldCBldmVyeXRoaW5nICovCisJcmV0ICs9IHJlZ193KHNkLCAweDAwLCAweGJmMTApOyAvKiBub3JtYWwgb3BlcmF0aW9uICovCisKKwkvKiBUcmFuc2ZlciBzaXplIGluIFdPUkRTIChmb3IgVVlWWSBmb3JtYXQgb25seSkgKi8KKwl2YWwgPSBzZC0+Z3NwY2FfZGV2LndpZHRoICogc2QtPmdzcGNhX2Rldi5oZWlnaHQ7CisJcmV0ICs9IHJlZ193KHNkLCAweDNkLCB2YWwgJiAweGZmZmYpOyAvKiBsb3cgYml0cyAqLworCXJldCArPSByZWdfdyhzZCwgMHgzZSwgdmFsID4+IDE2KTsgICAgLyogaGlnaCBiaXRzICovCisKKwlpZiAodzk5NjhjZl92Z2FfbW9kZVtzZC0+Z3NwY2FfZGV2LmN1cnJfbW9kZV0ucGl4ZWxmb3JtYXQgPT0KKwkgICAgVjRMMl9QSVhfRk1UX0pQRUcpIHsKKwkJLyogV2UgbWF5IGdldCBjYWxsZWQgbXVsdGlwbGUgdGltZXMgKHVzYiBpc29jIGJ3IG5lZ290aWF0LikgKi8KKwkJaWYgKCFzZC0+anBlZ19oZHIpCisJCQlzZC0+anBlZ19oZHIgPSBrbWFsbG9jKEpQRUdfSERSX1NaLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZC0+anBlZ19oZHIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIHNkLT5nc3BjYV9kZXYuaGVpZ2h0LAorCQkJICAgIHNkLT5nc3BjYV9kZXYud2lkdGgsIDB4MjIpOyAvKiBKUEVHIDQyMCAqLworCQlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgc2QtPnF1YWxpdHkpOworCQlyZXQgKz0gdzk5NjhjZl91cGxvYWRfcXVhbnRpemF0aW9udGFibGVzKHNkKTsKKwl9CisKKwkvKiBWaWRlbyBDYXB0dXJlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjIwKSB7CisJCS8qIFNlZW1zIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIHRoZSBpbWFnZSBzZW5zb3IgKi8KKwkJdnNfcG9sYXJpdHkgPSAxOworCQloc19wb2xhcml0eSA9IDE7CisJfSBlbHNlIHsKKwkJdnNfcG9sYXJpdHkgPSAxOworCQloc19wb2xhcml0eSA9IDA7CisJfQorCisJdmFsID0gKHZzX3BvbGFyaXR5IDw8IDEyKSB8IChoc19wb2xhcml0eSA8PCAxMSk7CisKKwkvKiBOT1RFOiBXZSBtYXkgbm90IGhhdmUgZW5vdWdoIG1lbW9yeSB0byBkbyBkb3VibGUgYnVmZmVyaW5nIHdoaWxlCisJICAgZG9pbmcgY29tcHJlc3Npb24gKGFtb3VudCBvZiBtZW1vcnkgZGlmZmVycyBwZXIgbW9kZWwgY2FtKS4KKwkgICBTbyB3ZSB1c2UgdGhlIHNlY29uZCBpbWFnZSBidWZmZXIgYWxzbyBhcyBqcGVnIHN0cmVhbSBidWZmZXIKKwkgICAoc2VlIHc5OTY4Y2ZfaW5pdCksIGFuZCBkaXNhYmxlIGRvdWJsZSBidWZmZXJpbmcuICovCisJaWYgKHc5OTY4Y2ZfdmdhX21vZGVbc2QtPmdzcGNhX2Rldi5jdXJyX21vZGVdLnBpeGVsZm9ybWF0ID09CisJICAgIFY0TDJfUElYX0ZNVF9KUEVHKSB7CisJCS8qIHZhbCB8PSAweDAwMDI7IFlVVjQyMlAgKi8KKwkJdmFsIHw9IDB4MDAwMzsgLyogWVVWNDIwUCAqLworCX0gZWxzZQorCQl2YWwgfD0gMHgwMDgwOyAvKiBFbmFibGUgSFcgZG91YmxlIGJ1ZmZlcmluZyAqLworCisJLyogdmFsIHw9IDB4MDAyMDsgZW5hYmxlIGNsYW1waW5nICovCisJLyogdmFsIHw9IDB4MDAwODsgZW5hYmxlICgxLTItMSkgZmlsdGVyICovCisJLyogdmFsIHw9IDB4MDAwYzsgZW5hYmxlICgyLTMtNi0zLTIpIGZpbHRlciAqLworCisJdmFsIHw9IDB4ODAwMDsgLyogY2FwdC4gZW5hYmxlICovCisKKwlyZXQgKz0gcmVnX3coc2QsIDB4MTYsIHZhbCk7CisKKwlzZC0+Z3NwY2FfZGV2LmVtcHR5X3BhY2tldCA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3OTk2OGNmX3N0b3AwKHN0cnVjdCBzZCAqc2QpCit7CisJaWYgKHNkLT5nc3BjYV9kZXYucHJlc2VudCkgeworCQlyZWdfdyhzZCwgMHgzOSwgMHgwMDAwKTsgLyogZGlzYWJsZSBKUEVHIGVuY29kZXIgKi8KKwkJcmVnX3coc2QsIDB4MTYsIDB4MDAwMCk7IC8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLworCX0KKworCWtmcmVlKHNkLT5qcGVnX2hkcik7CisJc2QtPmpwZWdfaGRyID0gTlVMTDsKK30KKworLyogVGhlIHc5OTY4Y2YgZG9jcyBzYXkgdGhhdCBhIDAgc2l6ZWQgcGFja2V0IG1lYW5zIEVPRiAoYW5kIGFsc28gU09GCisgICBmb3IgdGhlIG5leHQgZnJhbWUpLiBUaGlzIHNlZW1zIHRvIHNpbXBseSBub3QgYmUgdHJ1ZSB3aGVuIG9wZXJhdGluZworICAgaW4gSlBFRyBtb2RlLCBpbiB0aGlzIGNhc2UgdGhlcmUgbWF5IGJlIGVtcHR5IHBhY2tldHMgd2l0aGluIHRoZQorICAgZnJhbWUuIFNvIGluIEpQRUcgbW9kZSB1c2UgdGhlIEpQRUcgU09JIG1hcmtlciB0byBkZXRlY3QgU09GLgorCisgICBOb3RlIHRvIG1ha2UgdGhpbmdzIGV2ZW4gbW9yZSBpbnRlcmVzdGluZyB0aGUgdzk5NjhjZiBzZW5kcyAqUExBTkFSKiBqcGVnLAorICAgdG8gYmUgcHJlY2lzZSBpdCBzZW5kczogU09JLCBTT0YsIERSSSwgU09TLCBZLWRhdGEsIFNPUywgVS1kYXRhLCBTT1MsCisgICBWLWRhdGEsIEVPSS4gKi8KK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KKwkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAodzk5NjhjZl92Z2FfbW9kZVtnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucGl4ZWxmb3JtYXQgPT0KKwkgICAgVjRMMl9QSVhfRk1UX0pQRUcpIHsKKwkJaWYgKGxlbiA+PSAyICYmCisJCSAgICBkYXRhWzBdID09IDB4ZmYgJiYKKwkJICAgIGRhdGFbMV0gPT0gMHhkOCkgeworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCU5VTEwsIDApOworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAorCQkJCQlzZC0+anBlZ19oZHIsIEpQRUdfSERSX1NaKTsKKwkJCS8qIFN0cmlwIHRoZSBmZiBkOCwgb3VyIG93biBoZWFkZXIgKHdoaWNoIGFkZHMKKwkJCSAgIGh1ZmZtYW4gYW5kIHF1YW50aXphdGlvbiB0YWJsZXMpIGFscmVhZHkgaGFzIHRoaXMgKi8KKwkJCWxlbiAtPSAyOworCQkJZGF0YSArPSAyOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW4gVVlWWSBtb2RlIGFuIGVtcHR5IHBhY2tldCBzaWduYWxzIEVPRiAqLworCQlpZiAoZ3NwY2FfZGV2LT5lbXB0eV9wYWNrZXQpIHsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAorCQkJCQkJTlVMTCwgMCk7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCisJCQkJCU5VTEwsIDApOworCQkJZ3NwY2FfZGV2LT5lbXB0eV9wYWNrZXQgPSAwOworCQl9CisJfQorCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYwppbmRleCBjZGYzMzU3Li42OWU1ZGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jCkBAIC02MSwxNyArNjEsMTggQEAKICNkZWZpbmUgU0VOU09SX0hWNzEzMUMgNgogI2RlZmluZSBTRU5TT1JfSUNNMTA1QSA3CiAjZGVmaW5lIFNFTlNPUl9NQzUwMUNCIDgKLSNkZWZpbmUgU0VOU09SX09WNzYyMCA5Ci0vKiNkZWZpbmUgU0VOU09SX09WNzY0OCA5IC0gc2FtZSB2YWx1ZXMgKi8KLSNkZWZpbmUgU0VOU09SX09WNzYzMEMgMTAKLSNkZWZpbmUgU0VOU09SX1BBUzEwNiAxMQotI2RlZmluZSBTRU5TT1JfUEFTMjAyQiAxMgotI2RlZmluZSBTRU5TT1JfUEIwMzMwIDEzCi0jZGVmaW5lIFNFTlNPUl9QTzIwMzAgMTQKLSNkZWZpbmUgU0VOU09SX1RBUzUxMzBDSyAxNQotI2RlZmluZSBTRU5TT1JfVEFTNTEzMENYWCAxNgotI2RlZmluZSBTRU5TT1JfVEFTNTEzMENfVkYwMjUwIDE3Ci0jZGVmaW5lIFNFTlNPUl9NQVggMTgKKyNkZWZpbmUgU0VOU09SX01JMDM2MFNPQyA5CisjZGVmaW5lIFNFTlNPUl9PVjc2MjAgMTAKKy8qI2RlZmluZSBTRU5TT1JfT1Y3NjQ4IDEwIC0gc2FtZSB2YWx1ZXMgKi8KKyNkZWZpbmUgU0VOU09SX09WNzYzMEMgMTEKKyNkZWZpbmUgU0VOU09SX1BBUzEwNiAxMgorI2RlZmluZSBTRU5TT1JfUEFTMjAyQiAxMworI2RlZmluZSBTRU5TT1JfUEIwMzMwIDE0CS8qIChNSTAzNjApICovCisjZGVmaW5lIFNFTlNPUl9QTzIwMzAgMTUKKyNkZWZpbmUgU0VOU09SX1RBUzUxMzBDSyAxNgorI2RlZmluZSBTRU5TT1JfVEFTNTEzMENYWCAxNworI2RlZmluZSBTRU5TT1JfVEFTNTEzMENfVkYwMjUwIDE4CisjZGVmaW5lIFNFTlNPUl9NQVggMTkKIAl1bnNpZ25lZCBzaG9ydCBjaGlwX3JldmlzaW9uOwogCiAJdTggKmpwZWdfaGRyOwpAQCAtNDIwLDkgKzQyMSw3IEBACiAJezB4YWEsIDB4ZmUsIDB4MDAxMH0sCQkJCS8qIDAwLGZlLDEwLGFhICovCiAJe30KIH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gY3MyMTAyX0luaXRpYWxbXSA9IHsKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBjczIxMDJfSW5pdGlhbFtdID0gewkvKiAzMjB4MjQwICovCiAJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDBfU1lTVEVNQ09OVFJPTH0sCiAJezB4YTAsIDB4MTAsIFpDM1hYX1IwMDJfQ0xPQ0tTRUxFQ1R9LAogCXsweGEwLCAweDAwLCBaQzNYWF9SMDEwX0NNT1NTRU5TT1JTRUxFQ1R9LApAQCAtNDcxLDg4ICs0NzAsMTAgQEAKIAl7MHhhMCwgMHgwOCwgWkMzWFhfUjMwMV9FRVBST01BQ0NFU1N9LAogCXsweGEwLCAweDY4LCBaQzNYWF9SMThEX1lUQVJHRVR9LAogCXsweGEwLCAweDAwLCAweDAxYWR9LAotCXsweGExLCAweDAxLCAweDAwMDJ9LAotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCS8qIDAwICovCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IxQzZfU0hBUlBORVNTMDB9LAkvKiBzaGFycG5lc3MrICovCi0JezB4YTEsIDB4MDEsIDB4MDFjOH0sCi0JezB4YTEsIDB4MDEsIDB4MDFjOX0sCi0JezB4YTEsIDB4MDEsIDB4MDFjYX0sCi0JezB4YTAsIDB4MGYsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAkvKiBzaGFycG5lc3MtICovCi0JezB4YTAsIDB4MjQsIFpDM1hYX1IxMjBfR0FNTUEwMH0sCS8qIGdhbW1hIDUgKi8KLQl7MHhhMCwgMHg0NCwgWkMzWFhfUjEyMV9HQU1NQTAxfSwKLQl7MHhhMCwgMHg2NCwgWkMzWFhfUjEyMl9HQU1NQTAyfSwKLQl7MHhhMCwgMHg4NCwgWkMzWFhfUjEyM19HQU1NQTAzfSwKLQl7MHhhMCwgMHg5ZCwgWkMzWFhfUjEyNF9HQU1NQTA0fSwKLQl7MHhhMCwgMHhiMiwgWkMzWFhfUjEyNV9HQU1NQTA1fSwKLQl7MHhhMCwgMHhjNCwgWkMzWFhfUjEyNl9HQU1NQTA2fSwKLQl7MHhhMCwgMHhkMywgWkMzWFhfUjEyN19HQU1NQTA3fSwKLQl7MHhhMCwgMHhlMCwgWkMzWFhfUjEyOF9HQU1NQTA4fSwKLQl7MHhhMCwgMHhlYiwgWkMzWFhfUjEyOV9HQU1NQTA5fSwKLQl7MHhhMCwgMHhmNCwgWkMzWFhfUjEyQV9HQU1NQTBBfSwKLQl7MHhhMCwgMHhmYiwgWkMzWFhfUjEyQl9HQU1NQTBCfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjEyQ19HQU1NQTBDfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjEyRF9HQU1NQTBEfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjEyRV9HQU1NQTBFfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjEyRl9HQU1NQTBGfSwKLQl7MHhhMCwgMHgxOCwgWkMzWFhfUjEzMF9HQU1NQTEwfSwKLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjEzMV9HQU1NQTExfSwKLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjEzMl9HQU1NQTEyfSwKLQl7MHhhMCwgMHgxYywgWkMzWFhfUjEzM19HQU1NQTEzfSwKLQl7MHhhMCwgMHgxNiwgWkMzWFhfUjEzNF9HQU1NQTE0fSwKLQl7MHhhMCwgMHgxMywgWkMzWFhfUjEzNV9HQU1NQTE1fSwKLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjEzNl9HQU1NQTE2fSwKLQl7MHhhMCwgMHgwZSwgWkMzWFhfUjEzN19HQU1NQTE3fSwKLQl7MHhhMCwgMHgwYiwgWkMzWFhfUjEzOF9HQU1NQTE4fSwKLQl7MHhhMCwgMHgwOSwgWkMzWFhfUjEzOV9HQU1NQTE5fSwKLQl7MHhhMCwgMHgwNywgWkMzWFhfUjEzQV9HQU1NQTFBfSwKLQl7MHhhMCwgMHgwNiwgWkMzWFhfUjEzQl9HQU1NQTFCfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjEzQ19HQU1NQTFDfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjEzRF9HQU1NQTFEfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjEzRV9HQU1NQTFFfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjEzRl9HQU1NQTFGfSwKLQl7MHhhMCwgMHg1OCwgWkMzWFhfUjEwQV9SR0IwMH0sCS8qIG1hdHJpeCAqLwotCXsweGEwLCAweGY0LCBaQzNYWF9SMTBCX1JHQjAxfSwKLQl7MHhhMCwgMHhmNCwgWkMzWFhfUjEwQ19SR0IwMn0sCi0JezB4YTAsIDB4ZjQsIFpDM1hYX1IxMERfUkdCMTB9LAotCXsweGEwLCAweDU4LCBaQzNYWF9SMTBFX1JHQjExfSwKLQl7MHhhMCwgMHhmNCwgWkMzWFhfUjEwRl9SR0IxMn0sCi0JezB4YTAsIDB4ZjQsIFpDM1hYX1IxMTBfUkdCMjB9LAotCXsweGEwLCAweGY0LCBaQzNYWF9SMTExX1JHQjIxfSwKLQl7MHhhMCwgMHg1OCwgWkMzWFhfUjExMl9SR0IyMn0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAotCXsweGFhLCAweDIzLCAweDAwMDF9LAotCXsweGFhLCAweDI0LCAweDAwNTV9LAotCXsweGFhLCAweDI1LCAweDAwY2N9LAotCXsweGFhLCAweDIxLCAweDAwM2Z9LAotCXsweGEwLCAweDAyLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKLQl7MHhhMCwgMHhhYiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKLQl7MHhhMCwgMHg5OCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAotCXsweGEwLCAweDMwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKLQl7MHhhMCwgMHhkNCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAotCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAotCXsweGEwLCAweDEwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAotCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCi0JezB4YTAsIDB4MzksIFpDM1hYX1IwMURfSFNZTkNfMH0sCi0JezB4YTAsIDB4NzAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCi0JezB4YTAsIDB4YjAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGExLCAweDAxLCAweDAxODB9LAotCXsweGEwLCAweDQyLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjExNl9SR0FJTn0sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxMTdfR0dBSU59LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTE4X0JHQUlOfSwKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGNzMjEwMl9Jbml0aWFsU2NhbGVbXSA9IHsKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBjczIxMDJfSW5pdGlhbFNjYWxlW10gPSB7CS8qIDY0MHg0ODAgKi8KIAl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMF9TWVNURU1DT05UUk9MfSwKIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjAwMl9DTE9DS1NFTEVDVH0sCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTBfQ01PU1NFTlNPUlNFTEVDVH0sCkBAIC02MDEsNTcgKzUyMiw3NSBAQAogCXsweGEwLCAweDA4LCBaQzNYWF9SMzAxX0VFUFJPTUFDQ0VTU30sCiAJezB4YTAsIDB4NjgsIFpDM1hYX1IxOERfWVRBUkdFVH0sCiAJezB4YTAsIDB4MDAsIDB4MDFhZH0sCi0JezB4YTEsIDB4MDEsIDB4MDAwMn0sCi0JezB4YTEsIDB4MDEsIDB4MDAwOH0sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwJLyogMDAgKi8KLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjFDNl9TSEFSUE5FU1MwMH0sCS8qIHNoYXJwbmVzcysgKi8KLQl7MHhhMSwgMHgwMSwgMHgwMWM4fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWM5fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWNhfSwKLQl7MHhhMCwgMHgwZiwgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCS8qIHNoYXJwbmVzcy0gKi8KLQl7MHhhMCwgMHgyNCwgWkMzWFhfUjEyMF9HQU1NQTAwfSwJLyogZ2FtbWEgNSAqLwotCXsweGEwLCAweDQ0LCBaQzNYWF9SMTIxX0dBTU1BMDF9LAotCXsweGEwLCAweDY0LCBaQzNYWF9SMTIyX0dBTU1BMDJ9LAotCXsweGEwLCAweDg0LCBaQzNYWF9SMTIzX0dBTU1BMDN9LAotCXsweGEwLCAweDlkLCBaQzNYWF9SMTI0X0dBTU1BMDR9LAotCXsweGEwLCAweGIyLCBaQzNYWF9SMTI1X0dBTU1BMDV9LAotCXsweGEwLCAweGM0LCBaQzNYWF9SMTI2X0dBTU1BMDZ9LAotCXsweGEwLCAweGQzLCBaQzNYWF9SMTI3X0dBTU1BMDd9LAotCXsweGEwLCAweGUwLCBaQzNYWF9SMTI4X0dBTU1BMDh9LAotCXsweGEwLCAweGViLCBaQzNYWF9SMTI5X0dBTU1BMDl9LAotCXsweGEwLCAweGY0LCBaQzNYWF9SMTJBX0dBTU1BMEF9LAotCXsweGEwLCAweGZiLCBaQzNYWF9SMTJCX0dBTU1BMEJ9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMTJDX0dBTU1BMEN9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMTJEX0dBTU1BMER9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMTJFX0dBTU1BMEV9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMTJGX0dBTU1BMEZ9LAotCXsweGEwLCAweDE4LCBaQzNYWF9SMTMwX0dBTU1BMTB9LAotCXsweGEwLCAweDIwLCBaQzNYWF9SMTMxX0dBTU1BMTF9LAotCXsweGEwLCAweDIwLCBaQzNYWF9SMTMyX0dBTU1BMTJ9LAotCXsweGEwLCAweDFjLCBaQzNYWF9SMTMzX0dBTU1BMTN9LAotCXsweGEwLCAweDE2LCBaQzNYWF9SMTM0X0dBTU1BMTR9LAotCXsweGEwLCAweDEzLCBaQzNYWF9SMTM1X0dBTU1BMTV9LAotCXsweGEwLCAweDEwLCBaQzNYWF9SMTM2X0dBTU1BMTZ9LAotCXsweGEwLCAweDBlLCBaQzNYWF9SMTM3X0dBTU1BMTd9LAotCXsweGEwLCAweDBiLCBaQzNYWF9SMTM4X0dBTU1BMTh9LAotCXsweGEwLCAweDA5LCBaQzNYWF9SMTM5X0dBTU1BMTl9LAotCXsweGEwLCAweDA3LCBaQzNYWF9SMTNBX0dBTU1BMUF9LAotCXsweGEwLCAweDA2LCBaQzNYWF9SMTNCX0dBTU1BMUJ9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTNDX0dBTU1BMUN9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTNEX0dBTU1BMUR9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTNFX0dBTU1BMUV9LAotCXsweGEwLCAweDAxLCBaQzNYWF9SMTNGX0dBTU1BMUZ9LAotCXsweGEwLCAweDU4LCBaQzNYWF9SMTBBX1JHQjAwfSwJLyogbWF0cml4ICovCi0JezB4YTAsIDB4ZjQsIFpDM1hYX1IxMEJfUkdCMDF9LAotCXsweGEwLCAweGY0LCBaQzNYWF9SMTBDX1JHQjAyfSwKLQl7MHhhMCwgMHhmNCwgWkMzWFhfUjEwRF9SR0IxMH0sCi0JezB4YTAsIDB4NTgsIFpDM1hYX1IxMEVfUkdCMTF9LAotCXsweGEwLCAweGY0LCBaQzNYWF9SMTBGX1JHQjEyfSwKLQl7MHhhMCwgMHhmNCwgWkMzWFhfUjExMF9SR0IyMH0sCi0JezB4YTAsIDB4ZjQsIFpDM1hYX1IxMTFfUkdCMjF9LAotCXsweGEwLCAweDU4LCBaQzNYWF9SMTEyX1JHQjIyfSwKLQl7MHhhMSwgMHgwMSwgMHgwMTgwfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gY3MyMTAyXzUwSFpbXSA9IHsKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKKwl7MHhhYSwgMHgyMywgMHgwMDAxfSwKKwl7MHhhYSwgMHgyNCwgMHgwMDVmfSwKKwl7MHhhYSwgMHgyNSwgMHgwMDkwfSwKKwl7MHhhYSwgMHgyMSwgMHgwMGRkfSwKKwl7MHhhMCwgMHgwMiwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCisJezB4YTAsIDB4YmYsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4MjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKKwl7MHhhMCwgMHgzYSwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCisJezB4YTAsIDB4OTgsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgxMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAorCXsweGEwLCAweGRkLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAorCXsweGEwLCAweGU0LCBaQzNYWF9SMDFFX0hTWU5DXzF9LAorCXsweGEwLCAweGYwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAorCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAorCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGNzMjEwMl81MEhaU2NhbGVbXSA9IHsKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKKwl7MHhhYSwgMHgyMywgMHgwMDAwfSwKKwl7MHhhYSwgMHgyNCwgMHgwMGFmfSwKKwl7MHhhYSwgMHgyNSwgMHgwMGM4fSwKKwl7MHhhYSwgMHgyMSwgMHgwMDY4fSwKKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCisJezB4YTAsIDB4NWYsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4OTAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKKwl7MHhhMCwgMHgxZCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCisJezB4YTAsIDB4NGMsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgxMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAorCXsweGEwLCAweDY4LCBaQzNYWF9SMDFEX0hTWU5DXzB9LAorCXsweGEwLCAweGUzLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAorCXsweGEwLCAweGYwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAorCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAorCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGNzMjEwMl82MEhaW10gPSB7CisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCisJezB4YWEsIDB4MjMsIDB4MDAwMX0sCisJezB4YWEsIDB4MjQsIDB4MDA1NX0sCisJezB4YWEsIDB4MjUsIDB4MDBjY30sCisJezB4YWEsIDB4MjEsIDB4MDAzZn0sCisJezB4YTAsIDB4MDIsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAorCXsweGEwLCAweGFiLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAorCXsweGEwLCAweDk4LCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCisJezB4YTAsIDB4MzAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAorCXsweGEwLCAweGQ0LCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKKwl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCisJezB4YTAsIDB4MTAsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCisJezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKKwl7MHhhMCwgMHgzOSwgWkMzWFhfUjAxRF9IU1lOQ18wfSwKKwl7MHhhMCwgMHg3MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKKwl7MHhhMCwgMHhiMCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKKwl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKKwl7fQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBjczIxMDJfNjBIWlNjYWxlW10gPSB7CiAJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCiAJezB4YWEsIDB4MjMsIDB4MDAwMH0sCiAJezB4YWEsIDB4MjQsIDB4MDBhYX0sCkBAIC02NzEsMTYyICs2MTAsNTAgQEAKIAl7MHhhMCwgMHhhNSwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKIAl7MHhhMCwgMHhmMCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKIAl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4NDIsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTE2X1JHQUlOfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjExN19HR0FJTn0sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxMThfQkdBSU59LAotCXt9Ci19Owotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGNzMjEwMl81MEhaW10gPSB7Ci0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sIC8qIDAwLDE5LDAwLGNjICovCi0JezB4YWEsIDB4MGYsIDB4MDA4Y30sIC8qIDAwLDBmLDhjLGFhICovCi0JezB4YWEsIDB4MDMsIDB4MDAwNX0sIC8qIDAwLDAzLDA1LGFhICovCi0JezB4YWEsIDB4MDQsIDB4MDBhY30sIC8qIDAwLDA0LGFjLGFhICovCi0JezB4YWEsIDB4MTAsIDB4MDAwNX0sIC8qIDAwLDEwLDA1LGFhICovCi0JezB4YWEsIDB4MTEsIDB4MDBhY30sIC8qIDAwLDExLGFjLGFhICovCi0JezB4YWEsIDB4MWIsIDB4MDAwMH0sIC8qIDAwLDFiLDAwLGFhICovCi0JezB4YWEsIDB4MWMsIDB4MDAwNX0sIC8qIDAwLDFjLDA1LGFhICovCi0JezB4YWEsIDB4MWQsIDB4MDBhY30sIC8qIDAwLDFkLGFjLGFhICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDNmLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwzZixjYyAqLwotCXsweGEwLCAweGYwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixmMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwotCXsweGEwLCAweDQyLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsNDIsY2MgKi8KLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDEwLGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDEwLGNjICovCi0JezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMjQsY2MgKi8KLQl7MHhhMCwgMHg4YywgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsOGMsY2MgKi8KLQl7MHhhMCwgMHhiMCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwgLyogMDAsMWUsYjAsY2MgKi8KLQl7MHhhMCwgMHhkMCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsZDAsY2MgKi8KLQl7fQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBjczIxMDJfNTBIWlNjYWxlW10gPSB7Ci0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sIC8qIDAwLDE5LDAwLGNjICovCi0JezB4YWEsIDB4MGYsIDB4MDA5M30sIC8qIDAwLDBmLDkzLGFhICovCi0JezB4YWEsIDB4MDMsIDB4MDAwNX0sIC8qIDAwLDAzLDA1LGFhICovCi0JezB4YWEsIDB4MDQsIDB4MDBhMX0sIC8qIDAwLDA0LGExLGFhICovCi0JezB4YWEsIDB4MTAsIDB4MDAwNX0sIC8qIDAwLDEwLDA1LGFhICovCi0JezB4YWEsIDB4MTEsIDB4MDBhMX0sIC8qIDAwLDExLGExLGFhICovCi0JezB4YWEsIDB4MWIsIDB4MDAwMH0sIC8qIDAwLDFiLDAwLGFhICovCi0JezB4YWEsIDB4MWMsIDB4MDAwNX0sIC8qIDAwLDFjLDA1LGFhICovCi0JezB4YWEsIDB4MWQsIDB4MDBhMX0sIC8qIDAwLDFkLGExLGFhICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDNmLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwzZixjYyAqLwotCXsweGEwLCAweGY3LCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixmNyxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwotCXsweGEwLCAweDgzLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsODMsY2MgKi8KLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDEwLGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDEwLGNjICovCi0JezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMjQsY2MgKi8KLQl7MHhhMCwgMHg5MywgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsOTMsY2MgKi8KLQl7MHhhMCwgMHhiMCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwgLyogMDAsMWUsYjAsY2MgKi8KLQl7MHhhMCwgMHhkMCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsZDAsY2MgKi8KLQl7fQotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBjczIxMDJfNjBIWltdID0gewotCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LCAvKiAwMCwxOSwwMCxjYyAqLwotCXsweGFhLCAweDBmLCAweDAwNWR9LCAvKiAwMCwwZiw1ZCxhYSAqLwotCXsweGFhLCAweDAzLCAweDAwMDV9LCAvKiAwMCwwMywwNSxhYSAqLwotCXsweGFhLCAweDA0LCAweDAwYWF9LCAvKiAwMCwwNCxhYSxhYSAqLwotCXsweGFhLCAweDEwLCAweDAwMDV9LCAvKiAwMCwxMCwwNSxhYSAqLwotCXsweGFhLCAweDExLCAweDAwYWF9LCAvKiAwMCwxMSxhYSxhYSAqLwotCXsweGFhLCAweDFiLCAweDAwMDB9LCAvKiAwMCwxYiwwMCxhYSAqLwotCXsweGFhLCAweDFjLCAweDAwMDV9LCAvKiAwMCwxYywwNSxhYSAqLwotCXsweGFhLCAweDFkLCAweDAwYWF9LCAvKiAwMCwxZCxhYSxhYSAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwgLyogMDEsOTAsMDAsY2MgKi8KLQl7MHhhMCwgMHgzZiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwgLyogMDEsOTEsM2YsY2MgKi8KLQl7MHhhMCwgMHhlNCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwgLyogMDEsOTIsZTQsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LCAvKiAwMSw5NSwwMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwgLyogMDEsOTYsMDAsY2MgKi8KLQl7MHhhMCwgMHgzYSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sIC8qIDAxLDk3LDNhLGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LCAvKiAwMSw4YywxMCxjYyAqLwotCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LCAvKiAwMSw4ZiwyMCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LCAvKiAwMSxhOSwxMCxjYyAqLwotCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sIC8qIDAxLGFhLDI0LGNjICovCi0JezB4YTAsIDB4NWQsIFpDM1hYX1IwMURfSFNZTkNfMH0sIC8qIDAwLDFkLDVkLGNjICovCi0JezB4YTAsIDB4OTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sIC8qIDAwLDFlLDkwLGNjICovCi0JezB4YTAsIDB4ZDAsIDB4MDBjOH0sIC8qIDAwLGM4LGQwLGNjICovCi0Je30KLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gY3MyMTAyXzYwSFpTY2FsZVtdID0gewotCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LCAvKiAwMCwxOSwwMCxjYyAqLwotCXsweGFhLCAweDBmLCAweDAwYjd9LCAvKiAwMCwwZixiNyxhYSAqLwotCXsweGFhLCAweDAzLCAweDAwMDV9LCAvKiAwMCwwMywwNSxhYSAqLwotCXsweGFhLCAweDA0LCAweDAwYmV9LCAvKiAwMCwwNCxiZSxhYSAqLwotCXsweGFhLCAweDEwLCAweDAwMDV9LCAvKiAwMCwxMCwwNSxhYSAqLwotCXsweGFhLCAweDExLCAweDAwYmV9LCAvKiAwMCwxMSxiZSxhYSAqLwotCXsweGFhLCAweDFiLCAweDAwMDB9LCAvKiAwMCwxYiwwMCxhYSAqLwotCXsweGFhLCAweDFjLCAweDAwMDV9LCAvKiAwMCwxYywwNSxhYSAqLwotCXsweGFhLCAweDFkLCAweDAwYmV9LCAvKiAwMCwxZCxiZSxhYSAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwgLyogMDEsOTAsMDAsY2MgKi8KLQl7MHhhMCwgMHgzZiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwgLyogMDEsOTEsM2YsY2MgKi8KLQl7MHhhMCwgMHhmYywgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwgLyogMDEsOTIsZmMsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LCAvKiAwMSw5NSwwMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwgLyogMDEsOTYsMDAsY2MgKi8KLQl7MHhhMCwgMHg2OSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sIC8qIDAxLDk3LDY5LGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LCAvKiAwMSw4YywxMCxjYyAqLwotCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LCAvKiAwMSw4ZiwyMCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LCAvKiAwMSxhOSwxMCxjYyAqLwotCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sIC8qIDAxLGFhLDI0LGNjICovCi0JezB4YTAsIDB4YjcsIFpDM1hYX1IwMURfSFNZTkNfMH0sIC8qIDAwLDFkLGI3LGNjICovCi0JezB4YTAsIDB4ZDAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sIC8qIDAwLDFlLGQwLGNjICovCi0JezB4YTAsIDB4ZTgsIFpDM1hYX1IwMUZfSFNZTkNfMn0sIC8qIDAwLDFmLGU4LGNjICovCiAJe30KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gY3MyMTAyX05vRmxpa2VyW10gPSB7Ci0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sIC8qIDAwLDE5LDAwLGNjICovCi0JezB4YWEsIDB4MGYsIDB4MDA1OX0sIC8qIDAwLDBmLDU5LGFhICovCi0JezB4YWEsIDB4MDMsIDB4MDAwNX0sIC8qIDAwLDAzLDA1LGFhICovCi0JezB4YWEsIDB4MDQsIDB4MDA4MH0sIC8qIDAwLDA0LDgwLGFhICovCi0JezB4YWEsIDB4MTAsIDB4MDAwNX0sIC8qIDAwLDEwLDA1LGFhICovCi0JezB4YWEsIDB4MTEsIDB4MDA4MH0sIC8qIDAwLDExLDgwLGFhICovCi0JezB4YWEsIDB4MWIsIDB4MDAwMH0sIC8qIDAwLDFiLDAwLGFhICovCi0JezB4YWEsIDB4MWMsIDB4MDAwNX0sIC8qIDAwLDFjLDA1LGFhICovCi0JezB4YWEsIDB4MWQsIDB4MDA4MH0sIC8qIDAwLDFkLDgwLGFhICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDNmLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwzZixjYyAqLwotCXsweGEwLCAweGYwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixmMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsMTAsY2MgKi8KLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDEwLGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMDAsY2MgKi8KLQl7MHhhMCwgMHg1OSwgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsNTksY2MgKi8KLQl7MHhhMCwgMHg5MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwgLyogMDAsMWUsOTAsY2MgKi8KLQl7MHhhMCwgMHhjOCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsYzgsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKKwl7MHhhYSwgMHgyMywgMHgwMDAxfSwKKwl7MHhhYSwgMHgyNCwgMHgwMDVmfSwKKwl7MHhhYSwgMHgyNSwgMHgwMDAwfSwKKwl7MHhhYSwgMHgyMSwgMHgwMDAxfSwKKwl7MHhhMCwgMHgwMiwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCisJezB4YTAsIDB4YmYsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCisJezB4YTAsIDB4ODAsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAorCXsweGEwLCAweDAxLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAorCXsweGEwLCAweDQwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAorCXsweGEwLCAweGEwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAorCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAogCXt9CiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGNzMjEwMl9Ob0ZsaWtlclNjYWxlW10gPSB7Ci0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sIC8qIDAwLDE5LDAwLGNjICovCi0JezB4YWEsIDB4MGYsIDB4MDA1OX0sIC8qIDAwLDBmLDU5LGFhICovCi0JezB4YWEsIDB4MDMsIDB4MDAwNX0sIC8qIDAwLDAzLDA1LGFhICovCi0JezB4YWEsIDB4MDQsIDB4MDA4MH0sIC8qIDAwLDA0LDgwLGFhICovCi0JezB4YWEsIDB4MTAsIDB4MDAwNX0sIC8qIDAwLDEwLDA1LGFhICovCi0JezB4YWEsIDB4MTEsIDB4MDA4MH0sIC8qIDAwLDExLDgwLGFhICovCi0JezB4YWEsIDB4MWIsIDB4MDAwMH0sIC8qIDAwLDFiLDAwLGFhICovCi0JezB4YWEsIDB4MWMsIDB4MDAwNX0sIC8qIDAwLDFjLDA1LGFhICovCi0JezB4YWEsIDB4MWQsIDB4MDA4MH0sIC8qIDAwLDFkLDgwLGFhICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDNmLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwzZixjYyAqLwotCXsweGEwLCAweGYwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixmMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsMTAsY2MgKi8KLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDEwLGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMDAsY2MgKi8KLQl7MHhhMCwgMHg1OSwgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsNTksY2MgKi8KLQl7MHhhMCwgMHg5MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwgLyogMDAsMWUsOTAsY2MgKi8KLQl7MHhhMCwgMHhjOCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsYzgsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKKwl7MHhhYSwgMHgyMywgMHgwMDAwfSwKKwl7MHhhYSwgMHgyNCwgMHgwMGFmfSwKKwl7MHhhYSwgMHgyNSwgMHgwMDgwfSwKKwl7MHhhYSwgMHgyMSwgMHgwMDAxfSwKKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCisJezB4YTAsIDB4NWYsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4ODAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCisJezB4YTAsIDB4ODAsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAorCXsweGEwLCAweDAxLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAorCXsweGEwLCAweDQwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAorCXsweGEwLCAweGEwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAorCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAogCXt9CiB9OwogCkBAIC00NDA5LDE1MyArNDIzNiw4IEBACiAJe30KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBwYjAzMzAzeF9Jbml0aWFsW10gPSB7Ci0JezB4YTAsIDB4MDEsIFpDM1hYX1IwMDBfU1lTVEVNQ09OVFJPTH0sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwKLQl7MHhhMCwgMHgwYSwgWkMzWFhfUjAxMF9DTU9TU0VOU09SU0VMRUNUfSwKLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjAwMl9DTE9DS1NFTEVDVH0sCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IwMDNfRlJBTUVXSURUSEhJR0h9LAotCXsweGEwLCAweDgwLCBaQzNYWF9SMDA0X0ZSQU1FV0lEVEhMT1d9LAotCXsweGEwLCAweDAxLCBaQzNYWF9SMDA1X0ZSQU1FSEVJR0hUSElHSH0sCi0JezB4YTAsIDB4ZTAsIFpDM1hYX1IwMDZfRlJBTUVIRUlHSFRMT1d9LAotCXsweGEwLCAweGRjLCBaQzNYWF9SMDhCX0kyQ0RFVklDRUFERFJ9LAkvKiA4YiAtPiBkYyAqLwotCXsweGEwLCAweDAxLCBaQzNYWF9SMDAxX1NZU1RFTU9QRVJBVElOR30sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCi0JezB4YTAsIDB4MDEsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwOThfV0lOWVNUQVJUTE9XfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjA5QV9XSU5YU1RBUlRMT1d9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTFBX0ZJUlNUWUxPV30sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxMUNfRklSU1RYTE9XfSwKLQl7MHhhMCwgMHhkYywgWkMzWFhfUjA4Ql9JMkNERVZJQ0VBRERSfSwKLQl7MHhhYSwgMHgwMSwgMHgwMDAxfSwKLQl7MHhhYSwgMHgwNiwgMHgwMDAwfSwKLQl7MHhhYSwgMHgwOCwgMHgwNDgzfSwKLQl7MHhhYSwgMHgwMSwgMHgwMDA0fSwKLQl7MHhhYSwgMHgwOCwgMHgwMDA2fSwKLQl7MHhhYSwgMHgwMiwgMHgwMDExfSwKLQl7MHhhYSwgMHgwMywgMHgwMWU3fSwKLQl7MHhhYSwgMHgwNCwgMHgwMjg3fSwKLQl7MHhhYSwgMHgwNywgMHgzMDAyfSwKLQl7MHhhYSwgMHgyMCwgMHgxMTAwfSwKLQl7MHhhYSwgMHgzNSwgMHgwMDUwfSwKLQl7MHhhYSwgMHgzMCwgMHgwMDA1fSwKLQl7MHhhYSwgMHgzMSwgMHgwMDAwfSwKLQl7MHhhYSwgMHg1OCwgMHgwMDc4fSwKLQl7MHhhYSwgMHg2MiwgMHgwNDExfSwKLQl7MHhhYSwgMHgyYiwgMHgwMDI4fSwKLQl7MHhhYSwgMHgyYywgMHgwMDMwfSwKLQl7MHhhYSwgMHgyZCwgMHgwMDMwfSwKLQl7MHhhYSwgMHgyZSwgMHgwMDI4fSwKLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwKLQl7MHhhMCwgMHgzNywgWkMzWFhfUjEwMV9TRU5TT1JDT1JSRUNUSU9OfSwKLQl7MHhhMCwgMHgwNSwgWkMzWFhfUjAxMl9WSURFT0NPTlRST0xGVU5DfSwKLQl7MHhhMCwgMHgwZCwgWkMzWFhfUjEwMF9PUEVSQVRJT05NT0RFfSwKLQl7MHhhMCwgMHgwNiwgWkMzWFhfUjE4OV9BV0JTVEFUVVN9LAotCXsweGEwLCAweDAwLCAweDAxYWR9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMUM1X1NIQVJQTkVTU01PREV9LAotCXsweGEwLCAweDEzLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwKLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjI1MF9ERUFEUElYRUxTTU9ERX0sCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IzMDFfRUVQUk9NQUNDRVNTfSwKLQl7MHhhMCwgMHg2MCwgWkMzWFhfUjFBOF9ESUdJVEFMR0FJTn0sCi0JezB4YTAsIDB4NzgsIFpDM1hYX1IxOERfWVRBUkdFVH0sCi0JezB4YTAsIDB4NjEsIFpDM1hYX1IxMTZfUkdBSU59LAotCXsweGEwLCAweDY1LCBaQzNYWF9SMTE4X0JHQUlOfSwKLQotCXsweGExLCAweDAxLCAweDAwMDJ9LAotCXsweGEwLCAweDA5LCAweDAxYWR9LAotCXsweGEwLCAweDE1LCAweDAxYWV9LAotCXsweGEwLCAweDBkLCAweDAwM2F9LAotCXsweGEwLCAweDAyLCAweDAwM2J9LAotCXsweGEwLCAweDAwLCAweDAwMzh9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTBBX1JHQjAwfSwJLyogbWF0cml4ICovCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMEJfUkdCMDF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBDX1JHQjAyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwRF9SR0IxMH0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMEVfUkdCMTF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBGX1JHQjEyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjExMF9SR0IyMH0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMTFfUkdCMjF9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTEyX1JHQjIyfSwKLQotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IxQzZfU0hBUlBORVNTMDB9LAotCXsweGExLCAweDAxLCAweDAxYzh9LAotCXsweGExLCAweDAxLCAweDAxYzl9LAotCXsweGExLCAweDAxLCAweDAxY2F9LAotCXsweGEwLCAweDBmLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwJLyogc2hhcnBuZXNzLSAqLwotCXsweGEwLCAweDEzLCBaQzNYWF9SMTIwX0dBTU1BMDB9LAkvKiBnYW1tYSA0ICovCi0JezB4YTAsIDB4MzgsIFpDM1hYX1IxMjFfR0FNTUEwMX0sCi0JezB4YTAsIDB4NTksIFpDM1hYX1IxMjJfR0FNTUEwMn0sCi0JezB4YTAsIDB4NzksIFpDM1hYX1IxMjNfR0FNTUEwM30sCi0JezB4YTAsIDB4OTIsIFpDM1hYX1IxMjRfR0FNTUEwNH0sCi0JezB4YTAsIDB4YTcsIFpDM1hYX1IxMjVfR0FNTUEwNX0sCi0JezB4YTAsIDB4YjksIFpDM1hYX1IxMjZfR0FNTUEwNn0sCi0JezB4YTAsIDB4YzgsIFpDM1hYX1IxMjdfR0FNTUEwN30sCi0JezB4YTAsIDB4ZDQsIFpDM1hYX1IxMjhfR0FNTUEwOH0sCi0JezB4YTAsIDB4ZGYsIFpDM1hYX1IxMjlfR0FNTUEwOX0sCi0JezB4YTAsIDB4ZTcsIFpDM1hYX1IxMkFfR0FNTUEwQX0sCi0JezB4YTAsIDB4ZWUsIFpDM1hYX1IxMkJfR0FNTUEwQn0sCi0JezB4YTAsIDB4ZjQsIFpDM1hYX1IxMkNfR0FNTUEwQ30sCi0JezB4YTAsIDB4ZjksIFpDM1hYX1IxMkRfR0FNTUEwRH0sCi0JezB4YTAsIDB4ZmMsIFpDM1hYX1IxMkVfR0FNTUEwRX0sCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IxMkZfR0FNTUEwRn0sCi0JezB4YTAsIDB4MjYsIFpDM1hYX1IxMzBfR0FNTUExMH0sCi0JezB4YTAsIDB4MjIsIFpDM1hYX1IxMzFfR0FNTUExMX0sCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxMzJfR0FNTUExMn0sCi0JezB4YTAsIDB4MWMsIFpDM1hYX1IxMzNfR0FNTUExM30sCi0JezB4YTAsIDB4MTYsIFpDM1hYX1IxMzRfR0FNTUExNH0sCi0JezB4YTAsIDB4MTMsIFpDM1hYX1IxMzVfR0FNTUExNX0sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxMzZfR0FNTUExNn0sCi0JezB4YTAsIDB4MGQsIFpDM1hYX1IxMzdfR0FNTUExN30sCi0JezB4YTAsIDB4MGIsIFpDM1hYX1IxMzhfR0FNTUExOH0sCi0JezB4YTAsIDB4MDksIFpDM1hYX1IxMzlfR0FNTUExOX0sCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxM0FfR0FNTUExQX0sCi0JezB4YTAsIDB4MDYsIFpDM1hYX1IxM0JfR0FNTUExQn0sCi0JezB4YTAsIDB4MDUsIFpDM1hYX1IxM0NfR0FNTUExQ30sCi0JezB4YTAsIDB4MDQsIFpDM1hYX1IxM0RfR0FNTUExRH0sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IxM0VfR0FNTUExRX0sCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IxM0ZfR0FNTUExRn0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMEFfUkdCMDB9LAkvKiBtYXRyaXggKi8KLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwQl9SR0IwMX0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMENfUkdCMDJ9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBEX1JHQjEwfSwKLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjEwRV9SR0IxMX0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMEZfUkdCMTJ9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTEwX1JHQjIwfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjExMV9SR0IyMX0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMTJfUkdCMjJ9LAotCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKLQl7MHhhYSwgMHgwNSwgMHgwMDA5fSwKLQl7MHhhYSwgMHgwOSwgMHgwMTM0fSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCi0JezB4YTAsIDB4ZWMsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCi0JezB4YTAsIDB4OWMsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAotCXsweGEwLCAweDBlLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKLQl7MHhhMCwgMHgxYywgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKLQl7MHhhMCwgMHgxNCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKLQl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAotCXsweGEwLCAweGQ3LCBaQzNYWF9SMDFEX0hTWU5DXzB9LAotCXsweGEwLCAweGY0LCBaQzNYWF9SMDFFX0hTWU5DXzF9LAotCXsweGEwLCAweGY5LCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAotCXsweGEwLCAweDQyLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMCwgMHgwOSwgMHgwMWFkfSwKLQl7MHhhMCwgMHgxNSwgMHgwMWFlfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4NDIsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGIwMzMwM3hfSW5pdGlhbFNjYWxlW10gPSB7CisvKiBtaTAzNjBzb2MgYW5kIHBiMDMzMCBmcm9tIHZtMzB4LmluZiBmb3IgMGFjODozMDFiIGFuZCAwYWM4OjMwM2IgMDcvMDIvMTMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBtaTAzNjBzb2NfSW5pdGlhbFtdID0gewkvKiA2NDB4NDgwICovCiAJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDBfU1lTVEVNQ09OVFJPTH0sCiAJezB4YTAsIDB4MDMsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwKIAl7MHhhMCwgMHgwYSwgWkMzWFhfUjAxMF9DTU9TU0VOU09SU0VMRUNUfSwKQEAgLTQ1NjQsMTUgKzQyNDYsNzAgQEAKIAl7MHhhMCwgMHg4MCwgWkMzWFhfUjAwNF9GUkFNRVdJRFRITE9XfSwKIAl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwNV9GUkFNRUhFSUdIVEhJR0h9LAogCXsweGEwLCAweGUwLCBaQzNYWF9SMDA2X0ZSQU1FSEVJR0hUTE9XfSwKLQl7MHhhMCwgMHhkYywgWkMzWFhfUjA4Ql9JMkNERVZJQ0VBRERSfSwJLyogOGIgLT4gZGMgKi8KKwl7MHhhMCwgMHhkYywgWkMzWFhfUjA4Ql9JMkNERVZJQ0VBRERSfSwKIAl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMV9TWVNURU1PUEVSQVRJTkd9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAotCXsweGEwLCAweDAxLCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAorCXsweGEwLCAweDA3LCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAkvKmpmbTogd2FzIDAzKi8KKy8qCXsweGEwLCAweDAxLCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LCAqLwogCXsweGEwLCAweDAwLCBaQzNYWF9SMDk4X1dJTllTVEFSVExPV30sCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IwOUFfV0lOWFNUQVJUTE9XfSwKIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjExQV9GSVJTVFlMT1d9LAogCXsweGEwLCAweDAwLCBaQzNYWF9SMTFDX0ZJUlNUWExPV30sCiAJezB4YTAsIDB4ZGMsIFpDM1hYX1IwOEJfSTJDREVWSUNFQUREUn0sCisJezB4ZGQsIDB4MDAsIDB4MDIwMH0sCisJezB4YWEsIDB4MDEsIDB4MDAwMX0sCisJezB4YWEsIDB4MDYsIDB4MDAwMH0sCisJezB4YWEsIDB4MDgsIDB4MDQ4M30sCisJezB4YWEsIDB4MDEsIDB4MDAwNH0sCisJezB4YWEsIDB4MDgsIDB4MDAwNn0sCisJezB4YWEsIDB4MDIsIDB4MDAxMX0sCisJezB4YWEsIDB4MDMsIDB4MDFlNX0sCQkJLypqZm06IHdhcyAwMWU3Ki8KKwl7MHhhYSwgMHgwNCwgMHgwMjg1fSwJCQkvKmpmbTogd2FzIDAyODcqLworCXsweGFhLCAweDA3LCAweDMwMDJ9LAorCXsweGFhLCAweDIwLCAweDUxMDB9LAkJCS8qamZtOiB3YXMgMTEwMCovCisJezB4YWEsIDB4MzUsIDB4NTA3Zn0sCQkJLypqZm06IHdhcyAwMDUwKi8KKwl7MHhhYSwgMHgzMCwgMHgwMDA1fSwKKwl7MHhhYSwgMHgzMSwgMHgwMDAwfSwKKwl7MHhhYSwgMHg1OCwgMHgwMDc4fSwKKwl7MHhhYSwgMHg2MiwgMHgwNDExfSwKKwl7MHhhYSwgMHgyYiwgMHgwMDI4fSwKKwl7MHhhYSwgMHgyYywgMHgwMDdmfSwJCQkvKmpmbTogd2FzIDAwMzAqLworCXsweGFhLCAweDJkLCAweDAwN2Z9LAkJCS8qamZtOiB3YXMgMDAzMCovCisJezB4YWEsIDB4MmUsIDB4MDA3Zn0sCQkJLypqZm06IHdhcyAwMDMwKi8KKwl7MHhhMCwgMHgxMCwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwKKwl7MHhhMCwgMHhiNywgWkMzWFhfUjEwMV9TRU5TT1JDT1JSRUNUSU9OfSwgLypqZm06IHdhcyAzNyovCisJezB4YTAsIDB4MDUsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCisJezB4YTAsIDB4MGQsIFpDM1hYX1IxMDBfT1BFUkFUSU9OTU9ERX0sCisJezB4YTAsIDB4MDYsIFpDM1hYX1IxODlfQVdCU1RBVFVTfSwKKwl7MHhhMCwgMHgwOSwgMHgwMWFkfSwJCQkvKmpmbTogd2FzIDAwKi8KKwl7MHhhMCwgMHgwMywgWkMzWFhfUjFDNV9TSEFSUE5FU1NNT0RFfSwKKwl7MHhhMCwgMHgxMywgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCisJezB4YTAsIDB4MDgsIFpDM1hYX1IyNTBfREVBRFBJWEVMU01PREV9LAorCXsweGEwLCAweDA4LCBaQzNYWF9SMzAxX0VFUFJPTUFDQ0VTU30sCisJezB4YTAsIDB4NjAsIFpDM1hYX1IxQThfRElHSVRBTEdBSU59LAorCXsweGEwLCAweDZjLCBaQzNYWF9SMThEX1lUQVJHRVR9LAkvKiBqZm06IHdhcyA3OCAqLworCXsweGEwLCAweDYxLCBaQzNYWF9SMTE2X1JHQUlOfSwKKwl7MHhhMCwgMHg2NSwgWkMzWFhfUjExOF9CR0FJTn0sCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gbWkwMzYwc29jX0luaXRpYWxTY2FsZVtdID0gewkvKiAzMjB4MjQwICovCisJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDBfU1lTVEVNQ09OVFJPTH0sCisJezB4YTAsIDB4MDMsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwKKwl7MHhhMCwgMHgwYSwgWkMzWFhfUjAxMF9DTU9TU0VOU09SU0VMRUNUfSwKKwl7MHhhMCwgMHgxMCwgWkMzWFhfUjAwMl9DTE9DS1NFTEVDVH0sCisJezB4YTAsIDB4MDIsIFpDM1hYX1IwMDNfRlJBTUVXSURUSEhJR0h9LAorCXsweGEwLCAweDgwLCBaQzNYWF9SMDA0X0ZSQU1FV0lEVEhMT1d9LAorCXsweGEwLCAweDAxLCBaQzNYWF9SMDA1X0ZSQU1FSEVJR0hUSElHSH0sCisJezB4YTAsIDB4ZTAsIFpDM1hYX1IwMDZfRlJBTUVIRUlHSFRMT1d9LAorCXsweGEwLCAweGRjLCBaQzNYWF9SMDhCX0kyQ0RFVklDRUFERFJ9LAorCXsweGEwLCAweDAxLCBaQzNYWF9SMDAxX1NZU1RFTU9QRVJBVElOR30sCisJezB4YTAsIDB4MDcsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCS8qamZtOiB3YXMgMDMqLworLyoJezB4YTAsIDB4MDEsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwOThfV0lOWVNUQVJUTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjA5QV9XSU5YU1RBUlRMT1d9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTFBX0ZJUlNUWUxPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxMUNfRklSU1RYTE9XfSwKKwl7MHhhMCwgMHhkYywgWkMzWFhfUjA4Ql9JMkNERVZJQ0VBRERSfSwKKwl7MHhkZCwgMHgwMCwgMHgwMjAwfSwKIAl7MHhhYSwgMHgwMSwgMHgwMDAxfSwKIAl7MHhhYSwgMHgwNiwgMHgwMDAwfSwKIAl7MHhhYSwgMHgwOCwgMHgwNDgzfSwKQEAgLTQ1ODIsMTExICs0MzE5LDExMSBAQAogCXsweGFhLCAweDAzLCAweDAxZTd9LAogCXsweGFhLCAweDA0LCAweDAyODd9LAogCXsweGFhLCAweDA3LCAweDMwMDJ9LAotCXsweGFhLCAweDIwLCAweDExMDB9LAotCXsweGFhLCAweDM1LCAweDAwNTB9LAorCXsweGFhLCAweDIwLCAweDUxMDB9LAkJCS8qamZtOiB3YXMgMTEwMCovCisJezB4YWEsIDB4MzUsIDB4MDA3Zn0sCQkJLypqZm06IHdhcyAwMDUwKi8KIAl7MHhhYSwgMHgzMCwgMHgwMDA1fSwKIAl7MHhhYSwgMHgzMSwgMHgwMDAwfSwKIAl7MHhhYSwgMHg1OCwgMHgwMDc4fSwKIAl7MHhhYSwgMHg2MiwgMHgwNDExfSwKLQl7MHhhYSwgMHgyYiwgMHgwMDI4fSwKLQl7MHhhYSwgMHgyYywgMHgwMDMwfSwKLQl7MHhhYSwgMHgyZCwgMHgwMDMwfSwKLQl7MHhhYSwgMHgyZSwgMHgwMDI4fSwKKwl7MHhhYSwgMHgyYiwgMHgwMDdmfSwJCQkvKmpmbTogd2FzIDI4Ki8KKwl7MHhhYSwgMHgyYywgMHgwMDdmfSwJCQkvKmpmbTogd2FzIDMwKi8KKwl7MHhhYSwgMHgyZCwgMHgwMDdmfSwJCQkvKmpmbTogd2FzIDMwKi8KKwl7MHhhYSwgMHgyZSwgMHgwMDdmfSwJCQkvKmpmbTogd2FzIDI4Ki8KIAl7MHhhMCwgMHgxMCwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwKLQl7MHhhMCwgMHgzNywgWkMzWFhfUjEwMV9TRU5TT1JDT1JSRUNUSU9OfSwKKwl7MHhhMCwgMHhiNywgWkMzWFhfUjEwMV9TRU5TT1JDT1JSRUNUSU9OfSwJLypqZm06IHdhcyAzNyovCiAJezB4YTAsIDB4MDUsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCiAJezB4YTAsIDB4MGQsIFpDM1hYX1IxMDBfT1BFUkFUSU9OTU9ERX0sCiAJezB4YTAsIDB4MDYsIFpDM1hYX1IxODlfQVdCU1RBVFVTfSwKLQl7MHhhMCwgMHgwMCwgMHgwMWFkfSwKKwl7MHhhMCwgMHgwOSwgMHgwMWFkfSwJCQkvKmpmbTogd2FzIDAwKi8KIAl7MHhhMCwgMHgwMywgWkMzWFhfUjFDNV9TSEFSUE5FU1NNT0RFfSwKIAl7MHhhMCwgMHgxMywgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCiAJezB4YTAsIDB4MDgsIFpDM1hYX1IyNTBfREVBRFBJWEVMU01PREV9LAogCXsweGEwLCAweDA4LCBaQzNYWF9SMzAxX0VFUFJPTUFDQ0VTU30sCiAJezB4YTAsIDB4NjAsIFpDM1hYX1IxQThfRElHSVRBTEdBSU59LAotCXsweGEwLCAweDc4LCBaQzNYWF9SMThEX1lUQVJHRVR9LAorCXsweGEwLCAweDZjLCBaQzNYWF9SMThEX1lUQVJHRVR9LAkvKmpmbTogd2FzIDc4Ki8KIAl7MHhhMCwgMHg2MSwgWkMzWFhfUjExNl9SR0FJTn0sCiAJezB4YTAsIDB4NjUsIFpDM1hYX1IxMThfQkdBSU59LAotCi0JezB4YTEsIDB4MDEsIDB4MDAwMn0sCi0KLQl7MHhhMCwgMHgwOSwgMHgwMWFkfSwKLQl7MHhhMCwgMHgxNSwgMHgwMWFlfSwKLQotCXsweGEwLCAweDBkLCAweDAwM2F9LAotCXsweGEwLCAweDAyLCAweDAwM2J9LAotCXsweGEwLCAweDAwLCAweDAwMzh9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTBBX1JHQjAwfSwJLyogbWF0cml4ICovCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMEJfUkdCMDF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBDX1JHQjAyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwRF9SR0IxMH0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMEVfUkdCMTF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBGX1JHQjEyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjExMF9SR0IyMH0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMTFfUkdCMjF9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTEyX1JHQjIyfSwKLQotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCS8qIGNsb2NrID8gKi8KLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjFDNl9TSEFSUE5FU1MwMH0sCS8qIHNoYXJwbmVzcysgKi8KLQl7MHhhMSwgMHgwMSwgMHgwMWM4fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWM5fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWNhfSwKLQl7MHhhMCwgMHgwZiwgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCS8qIHNoYXJwbmVzcy0gKi8KLQotCXsweGEwLCAweDEzLCBaQzNYWF9SMTIwX0dBTU1BMDB9LAkvKiBnYW1tYSA0ICovCi0JezB4YTAsIDB4MzgsIFpDM1hYX1IxMjFfR0FNTUEwMX0sCi0JezB4YTAsIDB4NTksIFpDM1hYX1IxMjJfR0FNTUEwMn0sCi0JezB4YTAsIDB4NzksIFpDM1hYX1IxMjNfR0FNTUEwM30sCi0JezB4YTAsIDB4OTIsIFpDM1hYX1IxMjRfR0FNTUEwNH0sCi0JezB4YTAsIDB4YTcsIFpDM1hYX1IxMjVfR0FNTUEwNX0sCi0JezB4YTAsIDB4YjksIFpDM1hYX1IxMjZfR0FNTUEwNn0sCi0JezB4YTAsIDB4YzgsIFpDM1hYX1IxMjdfR0FNTUEwN30sCi0JezB4YTAsIDB4ZDQsIFpDM1hYX1IxMjhfR0FNTUEwOH0sCi0JezB4YTAsIDB4ZGYsIFpDM1hYX1IxMjlfR0FNTUEwOX0sCi0JezB4YTAsIDB4ZTcsIFpDM1hYX1IxMkFfR0FNTUEwQX0sCi0JezB4YTAsIDB4ZWUsIFpDM1hYX1IxMkJfR0FNTUEwQn0sCi0JezB4YTAsIDB4ZjQsIFpDM1hYX1IxMkNfR0FNTUEwQ30sCi0JezB4YTAsIDB4ZjksIFpDM1hYX1IxMkRfR0FNTUEwRH0sCi0JezB4YTAsIDB4ZmMsIFpDM1hYX1IxMkVfR0FNTUEwRX0sCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IxMkZfR0FNTUEwRn0sCi0JezB4YTAsIDB4MjYsIFpDM1hYX1IxMzBfR0FNTUExMH0sCi0JezB4YTAsIDB4MjIsIFpDM1hYX1IxMzFfR0FNTUExMX0sCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxMzJfR0FNTUExMn0sCi0JezB4YTAsIDB4MWMsIFpDM1hYX1IxMzNfR0FNTUExM30sCi0JezB4YTAsIDB4MTYsIFpDM1hYX1IxMzRfR0FNTUExNH0sCi0JezB4YTAsIDB4MTMsIFpDM1hYX1IxMzVfR0FNTUExNX0sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxMzZfR0FNTUExNn0sCi0JezB4YTAsIDB4MGQsIFpDM1hYX1IxMzdfR0FNTUExN30sCi0JezB4YTAsIDB4MGIsIFpDM1hYX1IxMzhfR0FNTUExOH0sCi0JezB4YTAsIDB4MDksIFpDM1hYX1IxMzlfR0FNTUExOX0sCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxM0FfR0FNTUExQX0sCi0JezB4YTAsIDB4MDYsIFpDM1hYX1IxM0JfR0FNTUExQn0sCi0JezB4YTAsIDB4MDUsIFpDM1hYX1IxM0NfR0FNTUExQ30sCi0JezB4YTAsIDB4MDQsIFpDM1hYX1IxM0RfR0FNTUExRH0sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IxM0VfR0FNTUExRX0sCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IxM0ZfR0FNTUExRn0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMEFfUkdCMDB9LAkvKiBtYXRyaXggKi8KLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwQl9SR0IwMX0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMENfUkdCMDJ9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBEX1JHQjEwfSwKLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjEwRV9SR0IxMX0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMEZfUkdCMTJ9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTEwX1JHQjIwfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjExMV9SR0IyMX0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMTJfUkdCMjJ9LAotCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAorCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIG1pMzYwc29jX0FFNTBIWltdID0gewogCXsweGEwLCAweDAwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKLQl7MHhhYSwgMHgwNSwgMHgwMDA5fSwKLQl7MHhhYSwgMHgwOSwgMHgwMTM0fSwKKwl7MHhiYiwgMHgwMCwgMHgwNTYyfSwKKwl7MHhiYiwgMHgwMSwgMHgwOWFhfSwKIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCi0JezB4YTAsIDB4ZWMsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDMsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4OWIsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCi0JezB4YTAsIDB4OWMsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDQ3LCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MWMsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCisJezB4YTAsIDB4MTQsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCisJezB4YTAsIDB4NjYsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKKwl7MHhhMCwgMHg2MiwgWkMzWFhfUjAxRF9IU1lOQ18wfSwKKwl7MHhhMCwgMHg5MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKKwl7MHhhMCwgMHhjOCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKKwl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKKwl7MHhhMCwgMHg2MCwgWkMzWFhfUjExRF9HTE9CQUxHQUlOfSwKKwl7MHhhMCwgMHg0MiwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gbWkzNjBzb2NfQUU1MEhaU2NhbGVbXSA9IHsKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCisJezB4YmIsIDB4MDAsIDB4MDUwOX0sCisJezB4YmIsIDB4MDEsIDB4MDkzNH0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAorCXsweGEwLCAweDA3LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAorCXsweGEwLCAweGQyLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAorCXsweGEwLCAweDlhLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MWMsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCisJezB4YTAsIDB4MTQsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCisJezB4YTAsIDB4NjYsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKKwl7MHhhMCwgMHhkNywgWkMzWFhfUjAxRF9IU1lOQ18wfSwKKwl7MHhhMCwgMHhmNCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKKwl7MHhhMCwgMHhmOSwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKKwl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKKwl7MHhhMCwgMHg0MiwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gbWkzNjBzb2NfQUU2MEhaW10gPSB7CisJezB4YTAsIDB4MDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAorCXsweGJiLCAweDAwLCAweDA1M2R9LAorCXsweGJiLCAweDAxLCAweDA5NmV9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKKwl7MHhhMCwgMHhkZCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKKwl7MHhhMCwgMHgzZCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCisJezB4YTAsIDB4MGUsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAorCXsweGEwLCAweDFjLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAorCXsweGEwLCAweDE0LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAorCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCisJezB4YTAsIDB4NjIsIFpDM1hYX1IwMURfSFNZTkNfMH0sCisJezB4YTAsIDB4OTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCisJezB4YTAsIDB4YzgsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCisJezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sCisJezB4YTAsIDB4NjAsIFpDM1hYX1IxMURfR0xPQkFMR0FJTn0sCisJezB4YTAsIDB4NDIsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAorCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIG1pMzYwc29jX0FFNjBIWlNjYWxlW10gPSB7CisJezB4YTAsIDB4MDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAorCXsweGJiLCAweDAwLCAweDA1MDl9LAorCXsweGJiLCAweDAxLCAweDA5ODN9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKKwl7MHhhMCwgMHg4ZiwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKKwl7MHhhMCwgMHg4MSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCiAJezB4YTAsIDB4MGUsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAogCXsweGEwLCAweDFjLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAogCXsweGEwLCAweDE0LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LApAQCAtNDY5NiwxNiArNDQzMywxMDUgQEAKIAl7MHhhMCwgMHhmOSwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKIAl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKIAl7MHhhMCwgMHg0MiwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTAsIDB4MDksIDB4MDFhZH0sCi0JezB4YTAsIDB4MTUsIDB4MDFhZX0sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGExLCAweDAxLCAweDAxODB9LAorCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIG1pMzYwc29jX0FFTm9GbGlrZXJbXSA9IHsKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCisJezB4YmIsIDB4MDAsIDB4MDUwOX0sCisJezB4YmIsIDB4MDEsIDB4MDk2MH0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAorCXsweGEwLCAweDA3LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAorCXsweGEwLCAweGYwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAorCXsweGEwLCAweDA0LCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MWMsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKKwl7MHhhMCwgMHgwOSwgWkMzWFhfUjAxRF9IU1lOQ18wfSwKKwl7MHhhMCwgMHg0MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKKwl7MHhhMCwgMHg5MCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKKwl7MHhhMCwgMHhlMCwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKKwl7MHhhMCwgMHg2MCwgWkMzWFhfUjExRF9HTE9CQUxHQUlOfSwKIAl7MHhhMCwgMHg0MiwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCiAJe30KIH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGIwMzMweHhfSW5pdGlhbFtdID0gewotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGExLCAweDAxLCAweDAwMDh9LAorc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIG1pMzYwc29jX0FFTm9GbGlrZXJTY2FsZVtdID0geworCXsweGEwLCAweDAwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKKwl7MHhiYiwgMHgwMCwgMHgwNTM0fSwKKwl7MHhiYiwgMHgwMiwgMHgwOTYwfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCisJezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4ZjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCisJezB4YTAsIDB4MDQsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDBlLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgxYywgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAorCXsweGEwLCAweDM0LCBaQzNYWF9SMDFEX0hTWU5DXzB9LAorCXsweGEwLCAweDYwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAorCXsweGEwLCAweDkwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAorCXsweGEwLCAweGUwLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAorCXsweGEwLCAweDYwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAorCXsweGEwLCAweDQyLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBiMDMzMF9Jbml0aWFsW10gPSB7CS8qIDY0MHg0ODAgKi8KKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMF9TWVNURU1DT05UUk9MfSwKKwl7MHhhMCwgMHgwMywgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAkvKiAwMCAqLworCXsweGEwLCAweDBhLCBaQzNYWF9SMDEwX0NNT1NTRU5TT1JTRUxFQ1R9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMDAyX0NMT0NLU0VMRUNUfSwKKwl7MHhhMCwgMHgwMiwgWkMzWFhfUjAwM19GUkFNRVdJRFRISElHSH0sCisJezB4YTAsIDB4ODAsIFpDM1hYX1IwMDRfRlJBTUVXSURUSExPV30sCisJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDVfRlJBTUVIRUlHSFRISUdIfSwKKwl7MHhhMCwgMHhlMCwgWkMzWFhfUjAwNl9GUkFNRUhFSUdIVExPV30sCisJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDFfU1lTVEVNT1BFUkFUSU5HfSwKKwl7MHhhMCwgMHgwNSwgWkMzWFhfUjAxMl9WSURFT0NPTlRST0xGVU5DfSwKKwl7MHhhMCwgMHgwNywgWkMzWFhfUjAxMl9WSURFT0NPTlRST0xGVU5DfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjA5OF9XSU5ZU1RBUlRMT1d9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMDlBX1dJTlhTVEFSVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxMUFfRklSU1RZTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjExQ19GSVJTVFhMT1d9LAorCXsweGRkLCAweDAwLCAweDAyMDB9LAorCXsweGEwLCAweDA1LCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAorCXsweGFhLCAweDAxLCAweDAwMDZ9LAorCXsweGFhLCAweDAyLCAweDAwMTF9LAorCXsweGFhLCAweDAzLCAweDAxZTV9LAkJCS8qamZtOiB3YXMgMWU3Ki8KKwl7MHhhYSwgMHgwNCwgMHgwMjg1fSwJCQkvKmpmbTogd2FzIDAyODcqLworCXsweGFhLCAweDA2LCAweDAwMDN9LAorCXsweGFhLCAweDA3LCAweDMwMDJ9LAorCXsweGFhLCAweDIwLCAweDExMDB9LAorCXsweGFhLCAweDJmLCAweGY3YjB9LAorCXsweGFhLCAweDMwLCAweDAwMDV9LAorCXsweGFhLCAweDMxLCAweDAwMDB9LAorCXsweGFhLCAweDM0LCAweDAxMDB9LAorCXsweGFhLCAweDM1LCAweDAwNjB9LAorCXsweGFhLCAweDNkLCAweDA2OGZ9LAorCXsweGFhLCAweDQwLCAweDAxZTB9LAorCXsweGFhLCAweDU4LCAweDAwNzh9LAorCXsweGFhLCAweDYyLCAweDA0MTF9LAorCXsweGEwLCAweDEwLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAorCXsweGEwLCAweDM3LCBaQzNYWF9SMTAxX1NFTlNPUkNPUlJFQ1RJT059LAorCXsweGEwLCAweDA1LCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAorCXsweGEwLCAweDBkLCBaQzNYWF9SMTAwX09QRVJBVElPTk1PREV9LAorCXsweGEwLCAweDA2LCBaQzNYWF9SMTg5X0FXQlNUQVRVU30sCisJezB4YTAsIDB4MDksIDB4MDFhZH0sCQkJLypqZm06IHdhcyAwMCAqLworCXsweGEwLCAweDE1LCAweDAxYWV9LAorCXsweGEwLCAweDAzLCBaQzNYWF9SMUM1X1NIQVJQTkVTU01PREV9LAorCXsweGEwLCAweDEzLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwKKwl7MHhhMCwgMHgwOCwgWkMzWFhfUjI1MF9ERUFEUElYRUxTTU9ERX0sCisJezB4YTAsIDB4MDgsIFpDM1hYX1IzMDFfRUVQUk9NQUNDRVNTfSwKKwl7MHhhMCwgMHg2MCwgWkMzWFhfUjFBOF9ESUdJVEFMR0FJTn0sCisJezB4YTAsIDB4NzgsIFpDM1hYX1IxOERfWVRBUkdFVH0sCS8qamZtOiB3YXMgNmMqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBiMDMzMF9Jbml0aWFsU2NhbGVbXSA9IHsJLyogMzIweDI0MCAqLwogCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAogCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCS8qIDAwICovCiAJezB4YTAsIDB4MGEsIFpDM1hYX1IwMTBfQ01PU1NFTlNPUlNFTEVDVH0sCkBAIC00NzIxLDYgKzQ1NDcsNyBAQAogCXsweGEwLCAweDAwLCBaQzNYWF9SMDlBX1dJTlhTVEFSVExPV30sCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxMUFfRklSU1RZTE9XfSwKIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjExQ19GSVJTVFhMT1d9LAorCXsweGRkLCAweDAwLCAweDAyMDB9LAogCXsweGEwLCAweDA1LCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAogCXsweGFhLCAweDAxLCAweDAwMDZ9LAogCXsweGFhLCAweDAyLCAweDAwMTF9LApAQCAtNDc0MywyOTMgKzQ1NzAsMTQ2IEBACiAJezB4YTAsIDB4MDUsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCiAJezB4YTAsIDB4MGQsIFpDM1hYX1IxMDBfT1BFUkFUSU9OTU9ERX0sCiAJezB4YTAsIDB4MDYsIFpDM1hYX1IxODlfQVdCU1RBVFVTfSwKLQl7MHhhMCwgMHgwMCwgMHgwMWFkfSwKKwl7MHhhMCwgMHgwOSwgMHgwMWFkfSwKKwl7MHhhMCwgMHgxNSwgMHgwMWFlfSwKIAl7MHhhMCwgMHgwMywgWkMzWFhfUjFDNV9TSEFSUE5FU1NNT0RFfSwKIAl7MHhhMCwgMHgxMywgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCiAJezB4YTAsIDB4MDgsIFpDM1hYX1IyNTBfREVBRFBJWEVMU01PREV9LAogCXsweGEwLCAweDA4LCBaQzNYWF9SMzAxX0VFUFJPTUFDQ0VTU30sCiAJezB4YTAsIDB4NjAsIFpDM1hYX1IxQThfRElHSVRBTEdBSU59LAotCXsweGEwLCAweDZjLCBaQzNYWF9SMThEX1lUQVJHRVR9LAotCXsweGExLCAweDAxLCAweDAwMDJ9LAotCXsweGEwLCAweDA5LCAweDAxYWR9LAotCXsweGEwLCAweDE1LCAweDAxYWV9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDkyX0kyQ0FERFJFU1NTRUxFQ1R9LAotCXsweGEwLCAweDAyLCBaQzNYWF9SMDkwX0kyQ0NPTU1BTkR9LAotCXsweGExLCAweDAxLCAweDAwOTF9LAotCXsweGExLCAweDAxLCAweDAwOTV9LAotCXsweGExLCAweDAxLCAweDAwOTZ9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTBBX1JHQjAwfSwJLyogbWF0cml4ICovCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMEJfUkdCMDF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBDX1JHQjAyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwRF9SR0IxMH0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMEVfUkdCMTF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBGX1JHQjEyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjExMF9SR0IyMH0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMTFfUkdCMjF9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTEyX1JHQjIyfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAkvKiBjbG9jayA/ICovCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IxQzZfU0hBUlBORVNTMDB9LAkvKiBzaGFycG5lc3MrICovCi0JezB4YTEsIDB4MDEsIDB4MDFjOH0sCi0JezB4YTEsIDB4MDEsIDB4MDFjOX0sCi0JezB4YTEsIDB4MDEsIDB4MDFjYX0sCi0JezB4YTAsIDB4MGYsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAkvKiBzaGFycG5lc3MtICovCi0KLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjEwQV9SR0IwMH0sCS8qIG1hdHJpeCAqLwotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBCX1JHQjAxfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwQ19SR0IwMn0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMERfUkdCMTB9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTBFX1JHQjExfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwRl9SR0IxMn0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMTBfUkdCMjB9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTExX1JHQjIxfSwKLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjExMl9SR0IyMn0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAotCXsweGFhLCAweDA1LCAweDAwNjZ9LAotCXsweGFhLCAweDA5LCAweDAyYjJ9LAotCXsweGFhLCAweDEwLCAweDAwMDJ9LAotCi0JezB4YTAsIDB4NjAsIFpDM1hYX1IxMURfR0xPQkFMR0FJTn0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAotCXsweGEwLCAweDA3LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAotCXsweGEwLCAweDhjLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAotCXsweGEwLCAweDhhLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCi0JezB4YTAsIDB4MTQsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCi0JezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKLQl7MHhhMCwgMHhkNywgWkMzWFhfUjAxRF9IU1lOQ18wfSwKLQl7MHhhMCwgMHhmMCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKLQl7MHhhMCwgMHgwOSwgMHgwMWFkfSwKLQl7MHhhMCwgMHgxNSwgMHgwMWFlfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4NDIsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGExLCAweDAxLCAweDAwMDd9LAotLyoJezB4YTAsIDB4MzAsIDB4MDAwN30sICovCi0vKgl7MHhhMCwgMHgwMCwgMHgwMDA3fSwgKi8KLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBiMDMzMHh4X0luaXRpYWxTY2FsZVtdID0gewotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCS8qIDAwICovCi0JezB4YTAsIDB4MGEsIFpDM1hYX1IwMTBfQ01PU1NFTlNPUlNFTEVDVH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMDJfQ0xPQ0tTRUxFQ1R9LAkvKiAxMCAqLwotCXsweGEwLCAweDAyLCBaQzNYWF9SMDAzX0ZSQU1FV0lEVEhISUdIfSwKLQl7MHhhMCwgMHg4MCwgWkMzWFhfUjAwNF9GUkFNRVdJRFRITE9XfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwNV9GUkFNRUhFSUdIVEhJR0h9LAotCXsweGEwLCAweGUwLCBaQzNYWF9SMDA2X0ZSQU1FSEVJR0hUTE9XfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMV9TWVNURU1PUEVSQVRJTkd9LAotCXsweGEwLCAweDA1LCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAotCXsweGEwLCAweDA3LCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDk4X1dJTllTVEFSVExPV30sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwOUFfV0lOWFNUQVJUTE9XfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjExQV9GSVJTVFlMT1d9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTFDX0ZJUlNUWExPV30sCi0JezB4YTAsIDB4MDUsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCi0JezB4YWEsIDB4MDEsIDB4MDAwNn0sCi0JezB4YWEsIDB4MDIsIDB4MDAxMX0sCi0JezB4YWEsIDB4MDMsIDB4MDFlN30sCi0JezB4YWEsIDB4MDQsIDB4MDI4N30sCi0JezB4YWEsIDB4MDYsIDB4MDAwM30sCi0JezB4YWEsIDB4MDcsIDB4MzAwMn0sCi0JezB4YWEsIDB4MjAsIDB4MTEwMH0sCi0JezB4YWEsIDB4MmYsIDB4ZjdiMH0sCi0JezB4YWEsIDB4MzAsIDB4MDAwNX0sCi0JezB4YWEsIDB4MzEsIDB4MDAwMH0sCi0JezB4YWEsIDB4MzQsIDB4MDEwMH0sCi0JezB4YWEsIDB4MzUsIDB4MDA2MH0sCi0JezB4YWEsIDB4M2QsIDB4MDY4Zn0sCi0JezB4YWEsIDB4NDAsIDB4MDFlMH0sCi0JezB4YWEsIDB4NTgsIDB4MDA3OH0sCi0JezB4YWEsIDB4NjIsIDB4MDQxMX0sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IwODdfRVhQVElNRU1JRH0sCi0JezB4YTAsIDB4MzcsIFpDM1hYX1IxMDFfU0VOU09SQ09SUkVDVElPTn0sCi0JezB4YTAsIDB4MDUsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCi0JezB4YTAsIDB4MGQsIFpDM1hYX1IxMDBfT1BFUkFUSU9OTU9ERX0sCi0JezB4YTAsIDB4MDYsIFpDM1hYX1IxODlfQVdCU1RBVFVTfSwKLQl7MHhhMCwgMHgwMCwgMHgwMWFkfSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjFDNV9TSEFSUE5FU1NNT0RFfSwKLQl7MHhhMCwgMHgxMywgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IyNTBfREVBRFBJWEVMU01PREV9LAotCXsweGEwLCAweDA4LCBaQzNYWF9SMzAxX0VFUFJPTUFDQ0VTU30sCi0JezB4YTAsIDB4NjAsIFpDM1hYX1IxQThfRElHSVRBTEdBSU59LAotCXsweGEwLCAweDZjLCBaQzNYWF9SMThEX1lUQVJHRVR9LAotCXsweGExLCAweDAxLCAweDAwMDJ9LAotCXsweGEwLCAweDA5LCAweDAxYWR9LAotCXsweGEwLCAweDE1LCAweDAxYWV9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDkyX0kyQ0FERFJFU1NTRUxFQ1R9LAotCXsweGEwLCAweDAyLCBaQzNYWF9SMDkwX0kyQ0NPTU1BTkR9LAotCXsweGExLCAweDAxLCAweDAwOTF9LAotCXsweGExLCAweDAxLCAweDAwOTV9LAotCXsweGExLCAweDAxLCAweDAwOTZ9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTBBX1JHQjAwfSwJLyogbWF0cml4ICovCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMEJfUkdCMDF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBDX1JHQjAyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwRF9SR0IxMH0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMEVfUkdCMTF9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBGX1JHQjEyfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjExMF9SR0IyMH0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMTFfUkdCMjF9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTEyX1JHQjIyfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAkvKiBjbG9jayA/ICovCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IxQzZfU0hBUlBORVNTMDB9LAkvKiBzaGFycG5lc3MrICovCi0JezB4YTEsIDB4MDEsIDB4MDFjOH0sCi0JezB4YTEsIDB4MDEsIDB4MDFjOX0sCi0JezB4YTEsIDB4MDEsIDB4MDFjYX0sCi0JezB4YTAsIDB4MGYsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAkvKiBzaGFycG5lc3MtICovCi0KLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjEwQV9SR0IwMH0sCS8qIG1hdHJpeCAqLwotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBCX1JHQjAxfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwQ19SR0IwMn0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMERfUkdCMTB9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTBFX1JHQjExfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwRl9SR0IxMn0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMTBfUkdCMjB9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTExX1JHQjIxfSwKLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjExMl9SR0IyMn0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAotCXsweGFhLCAweDA1LCAweDAwNjZ9LAotCXsweGFhLCAweDA5LCAweDAyYjJ9LAotCXsweGFhLCAweDEwLCAweDAwMDJ9LAotCXsweGEwLCAweDYwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKLQl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKLQl7MHhhMCwgMHg4YywgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKLQl7MHhhMCwgMHg4YSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAotCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAotCXsweGEwLCAweDE0LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAotCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCi0JezB4YTAsIDB4ZDcsIFpDM1hYX1IwMURfSFNZTkNfMH0sCi0JezB4YTAsIDB4ZjAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sCi0JezB4YTAsIDB4MDksIDB4MDFhZH0sCi0JezB4YTAsIDB4MTUsIDB4MDFhZX0sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGExLCAweDAxLCAweDAxODB9LAotCXsweGEwLCAweDQyLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA3fSwKLS8qCXsweGEwLCAweDMwLCAweDAwMDd9LCAqLwotLyoJezB4YTAsIDB4MDAsIDB4MDAwN30sICovCisJezB4YTAsIDB4NzgsIFpDM1hYX1IxOERfWVRBUkdFVH0sCS8qamZtOiB3YXMgNmMqLwogCXt9CiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBiMDMzMF81MEhaW10gPSB7Ci0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDA3LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwwNyxjYyAqLwotCXsweGEwLCAweGVlLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixlZSxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwotCXsweGEwLCAweDQ2LCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsNDYsY2MgKi8KLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDEwLGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCi0JezB4YTAsIDB4MGMsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDBjLGNjICovCi0JezB4YTAsIDB4MjYsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMjYsY2MgKi8KLQl7MHhhMCwgMHg2OCwgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsNjgsY2MgKi8KLQl7MHhhMCwgMHg5MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwgLyogMDAsMWUsOTAsY2MgKi8KLQl7MHhhMCwgMHhjOCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsYzgsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKKwl7MHhiYiwgMHgwMCwgMHgwNTVjfSwKKwl7MHhiYiwgMHgwMSwgMHgwOWFhfSwKKwl7MHhiYiwgMHgwMCwgMHgxMDAxfSwKKwl7MHhhMCwgMHg2MCwgWkMzWFhfUjExRF9HTE9CQUxHQUlOfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCisJezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4YzQsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCisJezB4YTAsIDB4NDcsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDBlLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgxYSwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgxNCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHg2NiwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAorCXsweGEwLCAweDVjLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAorCXsweGEwLCAweDkwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAorCXsweGEwLCAweGM4LCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAorCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAogCXt9CiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBiMDMzMF81MEhaU2NhbGVbXSA9IHsKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwgLyogMDAsMTksMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sIC8qIDAxLDkwLDAwLGNjICovCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sIC8qIDAxLDkxLDA3LGNjICovCi0JezB4YTAsIDB4YTAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sIC8qIDAxLDkyLGEwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwgLyogMDEsOTUsMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sIC8qIDAxLDk2LDAwLGNjICovCi0JezB4YTAsIDB4N2EsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LCAvKiAwMSw5Nyw3YSxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwgLyogMDEsOGMsMTAsY2MgKi8KLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwgLyogMDEsOGYsMjAsY2MgKi8KLQl7MHhhMCwgMHgwYywgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwgLyogMDEsYTksMGMsY2MgKi8KLQl7MHhhMCwgMHgyNiwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LCAvKiAwMSxhYSwyNixjYyAqLwotCXsweGEwLCAweGU1LCBaQzNYWF9SMDFEX0hTWU5DXzB9LCAvKiAwMCwxZCxlNSxjYyAqLwotCXsweGEwLCAweGYwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LCAvKiAwMCwxZSxmMCxjYyAqLwotCXsweGEwLCAweGY4LCBaQzNYWF9SMDFGX0hTWU5DXzJ9LCAvKiAwMCwxZixmOCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAorCXsweGJiLCAweDAwLCAweDA1NjZ9LAorCXsweGJiLCAweDAyLCAweDA5YjJ9LAorCXsweGJiLCAweDAwLCAweDEwMDJ9LAorCXsweGEwLCAweDYwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKKwl7MHhhMCwgMHg4YywgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKKwl7MHhhMCwgMHg4YSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCisJezB4YTAsIDB4MGUsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAorCXsweGEwLCAweDFhLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAorCXsweGEwLCAweDE0LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAorCXsweGEwLCAweDY2LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCisJezB4YTAsIDB4ZDcsIFpDM1hYX1IwMURfSFNZTkNfMH0sCisJezB4YTAsIDB4ZjAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCisJezB4YTAsIDB4ZjgsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCisJezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sCiAJe30KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGIwMzMwXzYwSFpbXSA9IHsKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwgLyogMDAsMTksMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sIC8qIDAxLDkwLDAwLGNjICovCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sIC8qIDAxLDkxLDA3LGNjICovCi0JezB4YTAsIDB4ZGQsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sIC8qIDAxLDkyLGRkLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwgLyogMDEsOTUsMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sIC8qIDAxLDk2LDAwLGNjICovCi0JezB4YTAsIDB4M2QsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LCAvKiAwMSw5NywzZCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwgLyogMDEsOGMsMTAsY2MgKi8KLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwgLyogMDEsOGYsMjAsY2MgKi8KLQl7MHhhMCwgMHgwYywgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwgLyogMDEsYTksMGMsY2MgKi8KLQl7MHhhMCwgMHgyNiwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LCAvKiAwMSxhYSwyNixjYyAqLwotCXsweGEwLCAweDQzLCBaQzNYWF9SMDFEX0hTWU5DXzB9LCAvKiAwMCwxZCw0MyxjYyAqLwotCXsweGEwLCAweDUwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LCAvKiAwMCwxZSw1MCxjYyAqLwotCXsweGEwLCAweDkwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LCAvKiAwMCwxZiw5MCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAorCXsweGJiLCAweDAwLCAweDA1MzV9LAorCXsweGJiLCAweDAxLCAweDA5NzR9LAorCXsweGJiLCAweDAwLCAweDEwMDF9LAorCXsweGEwLCAweDYwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKKwl7MHhhMCwgMHhmZSwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKKwl7MHhhMCwgMHgzZSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCisJezB4YTAsIDB4MGUsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAorCXsweGEwLCAweDFhLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAorCXsweGEwLCAweDE0LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAorCXsweGEwLCAweDY2LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCisJezB4YTAsIDB4MzUsIFpDM1hYX1IwMURfSFNZTkNfMH0sCisJezB4YTAsIDB4NTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCisJezB4YTAsIDB4OTAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCisJezB4YTAsIDB4ZDAsIFpDM1hYX1IwMjBfSFNZTkNfM30sCiAJe30KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGIwMzMwXzYwSFpTY2FsZVtdID0gewotCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LCAvKiAwMCwxOSwwMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwgLyogMDEsOTAsMDAsY2MgKi8KLQl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwgLyogMDEsOTEsMDcsY2MgKi8KLQl7MHhhMCwgMHhhMCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwgLyogMDEsOTIsYTAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LCAvKiAwMSw5NSwwMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwgLyogMDEsOTYsMDAsY2MgKi8KLQl7MHhhMCwgMHg3YSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sIC8qIDAxLDk3LDdhLGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LCAvKiAwMSw4YywxMCxjYyAqLwotCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LCAvKiAwMSw4ZiwyMCxjYyAqLwotCXsweGEwLCAweDBjLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LCAvKiAwMSxhOSwwYyxjYyAqLwotCXsweGEwLCAweDI2LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sIC8qIDAxLGFhLDI2LGNjICovCi0JezB4YTAsIDB4NDEsIFpDM1hYX1IwMURfSFNZTkNfMH0sIC8qIDAwLDFkLDQxLGNjICovCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sIC8qIDAwLDFlLDUwLGNjICovCi0JezB4YTAsIDB4OTAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sIC8qIDAwLDFmLDkwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCisJezB4YmIsIDB4MDAsIDB4MDUzNX0sCisJezB4YmIsIDB4MDIsIDB4MDk2Y30sCisJezB4YmIsIDB4MDAsIDB4MTAwMn0sCisJezB4YTAsIDB4NjAsIFpDM1hYX1IxMURfR0xPQkFMR0FJTn0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAorCXsweGEwLCAweDA3LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAorCXsweGEwLCAweGMwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAorCXsweGEwLCAweDdjLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MWEsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCisJezB4YTAsIDB4MTQsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCisJezB4YTAsIDB4NjYsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKKwl7MHhhMCwgMHgzNSwgWkMzWFhfUjAxRF9IU1lOQ18wfSwKKwl7MHhhMCwgMHg1MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKKwl7MHhhMCwgMHg5MCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKKwl7MHhhMCwgMHhkMCwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKIAl7fQogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBwYjAzMzBfTm9GbGlrZXJbXSA9IHsKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwgLyogMDAsMTksMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sIC8qIDAxLDkwLDAwLGNjICovCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sIC8qIDAxLDkxLDA3LGNjICovCi0JezB4YTAsIDB4ZjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sIC8qIDAxLDkyLGYwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwgLyogMDEsOTUsMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sIC8qIDAxLDk2LDAwLGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LCAvKiAwMSw5NywxMCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwgLyogMDEsOGMsMTAsY2MgKi8KLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwgLyogMDEsOGYsMjAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwgLyogMDEsYTksMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LCAvKiAwMSxhYSwwMCxjYyAqLwotCXsweGEwLCAweDA5LCBaQzNYWF9SMDFEX0hTWU5DXzB9LCAvKiAwMCwxZCwwOSxjYyAqLwotCXsweGEwLCAweDQwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LCAvKiAwMCwxZSw0MCxjYyAqLwotCXsweGEwLCAweDkwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LCAvKiAwMCwxZiw5MCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAorCXsweGJiLCAweDAwLCAweDA1MDl9LAorCXsweGJiLCAweDAyLCAweDA5NDB9LAorCXsweGJiLCAweDAwLCAweDEwMDJ9LAorCXsweGEwLCAweDYwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKKwl7MHhhMCwgMHhmMCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCisJezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAorCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCisJezB4YTAsIDB4MDksIFpDM1hYX1IwMURfSFNZTkNfMH0sCisJezB4YTAsIDB4NDAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCisJezB4YTAsIDB4OTAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCisJezB4YTAsIDB4ZTAsIFpDM1hYX1IwMjBfSFNZTkNfM30sCiAJe30KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGIwMzMwX05vRmxpa2VyU2NhbGVbXSA9IHsKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwgLyogMDAsMTksMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sIC8qIDAxLDkwLDAwLGNjICovCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sIC8qIDAxLDkxLDA3LGNjICovCi0JezB4YTAsIDB4ZjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sIC8qIDAxLDkyLGYwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwgLyogMDEsOTUsMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sIC8qIDAxLDk2LDAwLGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LCAvKiAwMSw5NywxMCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwJLyogMDEsOGMsMTAsY2MgKi8KLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwJLyogMDEsOGYsMjAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwgLyogMDEsYTksMDAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LCAvKiAwMSxhYSwwMCxjYyAqLwotCXsweGEwLCAweDA5LCBaQzNYWF9SMDFEX0hTWU5DXzB9LAkvKiAwMCwxZCwwOSxjYyAqLwotCXsweGEwLCAweDQwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAkvKiAwMCwxZSw0MCxjYyAqLwotCXsweGEwLCAweDkwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAkvKiAwMCwxZiw5MCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAorCXsweGJiLCAweDAwLCAweDA1MzV9LAorCXsweGJiLCAweDAxLCAweDA5ODB9LAorCXsweGJiLCAweDAwLCAweDEwMDF9LAorCXsweGEwLCAweDYwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKKwl7MHhhMCwgMHhmMCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCisJezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAorCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCisJezB4YTAsIDB4MzUsIFpDM1hYX1IwMURfSFNZTkNfMH0sCisJezB4YTAsIDB4NjAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCisJezB4YTAsIDB4OTAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCisJezB4YTAsIDB4ZTAsIFpDM1hYX1IwMjBfSFNZTkNfM30sCiAJe30KIH07CiAKQEAgLTU2NTUsNyArNTMzNSw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiB0YXM1MTMwY3h4X0luaXRpYWxbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiB0YXM1MTMwY3h4X0luaXRpYWxTY2FsZVtdID0gewkvKiAzMjB4MjQwICovCiAJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDBfU1lTVEVNQ09OVFJPTH0sCiAJezB4YTAsIDB4NTAsIFpDM1hYX1IwMDJfQ0xPQ0tTRUxFQ1R9LAogCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCkBAIC01Njg0LDc0ICs1MzY0LDE5IEBACiAJezB4YTAsIDB4ZjcsIFpDM1hYX1IxMDFfU0VOU09SQ09SUkVDVElPTn0sCiAJezB4YTAsIDB4MGQsIFpDM1hYX1IxMDBfT1BFUkFUSU9OTU9ERX0sCiAJezB4YTAsIDB4MDYsIFpDM1hYX1IxODlfQVdCU1RBVFVTfSwKLQl7MHhhMCwgMHg2OCwgWkMzWFhfUjE4RF9ZVEFSR0VUfSwKLQl7MHhhMCwgMHg2MCwgWkMzWFhfUjFBOF9ESUdJVEFMR0FJTn0sCisJezB4YTAsIDB4OTUsIFpDM1hYX1IxOERfWVRBUkdFVH0sCisJezB4YTAsIDB4NTAsIFpDM1hYX1IxQThfRElHSVRBTEdBSU59LAogCXsweGEwLCAweDAwLCAweDAxYWR9LAogCXsweGEwLCAweDAzLCBaQzNYWF9SMUM1X1NIQVJQTkVTU01PREV9LAogCXsweGEwLCAweDEzLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwKIAl7MHhhMCwgMHgwOCwgWkMzWFhfUjI1MF9ERUFEUElYRUxTTU9ERX0sCiAJezB4YTAsIDB4MDgsIFpDM1hYX1IzMDFfRUVQUk9NQUNDRVNTfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDAyfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAkvKiBjbG9jayA/ICovCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IxQzZfU0hBUlBORVNTMDB9LAkvKiBzaGFycG5lc3MrICovCi0JezB4YTEsIDB4MDEsIDB4MDFjOH0sCi0JezB4YTEsIDB4MDEsIDB4MDFjOX0sCi0JezB4YTEsIDB4MDEsIDB4MDFjYX0sCi0JezB4YTAsIDB4MGYsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAkvKiBzaGFycG5lc3MtICovCi0KLQl7MHhhMCwgMHg2OCwgWkMzWFhfUjEwQV9SR0IwMH0sCS8qIG1hdHJpeCAqLwotCXsweGEwLCAweGVjLCBaQzNYWF9SMTBCX1JHQjAxfSwKLQl7MHhhMCwgMHhlYywgWkMzWFhfUjEwQ19SR0IwMn0sCi0JezB4YTAsIDB4ZWMsIFpDM1hYX1IxMERfUkdCMTB9LAotCXsweGEwLCAweDY4LCBaQzNYWF9SMTBFX1JHQjExfSwKLQl7MHhhMCwgMHhlYywgWkMzWFhfUjEwRl9SR0IxMn0sCi0JezB4YTAsIDB4ZWMsIFpDM1hYX1IxMTBfUkdCMjB9LAotCXsweGEwLCAweGVjLCBaQzNYWF9SMTExX1JHQjIxfSwKLQl7MHhhMCwgMHg2OCwgWkMzWFhfUjExMl9SR0IyMn0sCi0KLQl7MHhhMSwgMHgwMSwgMHgwMThkfSwKLQl7MHhhMCwgMHg5MCwgWkMzWFhfUjE4RF9ZVEFSR0VUfSwJLyogOTAgKi8KLQl7MHhhMSwgMHgwMSwgMHgwMTgwfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCi0KLQl7MHhhYSwgMHhhMywgMHgwMDAxfSwKLQl7MHhhYSwgMHhhNCwgMHgwMDc3fSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjBBM19FWFBPU1VSRVRJTUVISUdIfSwKLQl7MHhhMCwgMHg3NywgWkMzWFhfUjBBNF9FWFBPU1VSRVRJTUVMT1d9LAotCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAkvKiAwMCAqLwotCXsweGEwLCAweDAzLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAkvKiAwMyAqLwotCXsweGEwLCAweGU4LCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAkvKiBlOCAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCS8qIDAgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCS8qIDAgKi8KLQl7MHhhMCwgMHg3ZCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCS8qIDdkICovCi0KLQl7MHhhMCwgMHgwYywgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCi0JezB4YTAsIDB4MTgsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCS8qIDA4ICovCi0JezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwJLyogMjQgKi8KLQl7MHhhMCwgMHhmMCwgWkMzWFhfUjAxRF9IU1lOQ18wfSwKLQl7MHhhMCwgMHhmNCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjA5Rl9NQVhYSElHSH0sCi0JezB4YTAsIDB4YzAsIFpDM1hYX1IwQTBfTUFYWExPV30sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMURfR0xPQkFMR0FJTn0sCS8qIDUwICovCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGExLCAweDAxLCAweDAxODB9LAotCXsweGEwLCAweDQyLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKIAl7fQogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiB0YXM1MTMwY3h4X0luaXRpYWxTY2FsZVtdID0gewotLyo/Pwl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMF9TWVNURU1DT05UUk9MfSwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiB0YXM1MTMwY3h4X0luaXRpYWxbXSA9IHsJLyogNjQweDQ4MCAqLwogCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAogCXsweGEwLCAweDQwLCBaQzNYWF9SMDAyX0NMT0NLU0VMRUNUfSwKLQogCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCi0JezB4YTEsIDB4MDEsIDB4MDAwOH0sCi0KIAl7MHhhMCwgMHgwMiwgWkMzWFhfUjAxMF9DTU9TU0VOU09SU0VMRUNUfSwKIAl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMV9TWVNURU1PUEVSQVRJTkd9LAogCXsweGEwLCAweDAwLCBaQzNYWF9SMDAxX1NZU1RFTU9QRVJBVElOR30sCkBAIC01Nzc1LDYzICs1NDAwLDEzIEBACiAJezB4YTAsIDB4MzcsIFpDM1hYX1IxMDFfU0VOU09SQ09SUkVDVElPTn0sCiAJezB4YTAsIDB4MGQsIFpDM1hYX1IxMDBfT1BFUkFUSU9OTU9ERX0sCiAJezB4YTAsIDB4MDYsIFpDM1hYX1IxODlfQVdCU1RBVFVTfSwKLQl7MHhhMCwgMHg2OCwgWkMzWFhfUjE4RF9ZVEFSR0VUfSwKLQl7MHhhMCwgMHg2MCwgWkMzWFhfUjFBOF9ESUdJVEFMR0FJTn0sCisJezB4YTAsIDB4OTUsIFpDM1hYX1IxOERfWVRBUkdFVH0sCisJezB4YTAsIDB4NTAsIFpDM1hYX1IxQThfRElHSVRBTEdBSU59LAogCXsweGEwLCAweDAwLCAweDAxYWR9LAogCXsweGEwLCAweDAzLCBaQzNYWF9SMUM1X1NIQVJQTkVTU01PREV9LAogCXsweGEwLCAweDEzLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwKIAl7MHhhMCwgMHgwOCwgWkMzWFhfUjI1MF9ERUFEUElYRUxTTU9ERX0sCiAJezB4YTAsIDB4MDgsIFpDM1hYX1IzMDFfRUVQUk9NQUNDRVNTfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDAyfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQotCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCi0JezB4YTEsIDB4MDEsIDB4MDAwOH0sCS8qIGNsb2NrID8gKi8KLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjFDNl9TSEFSUE5FU1MwMH0sCS8qIHNoYXJwbmVzcysgKi8KLQl7MHhhMSwgMHgwMSwgMHgwMWM4fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWM5fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWNhfSwKLQl7MHhhMCwgMHgwZiwgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCS8qIHNoYXJwbmVzcy0gKi8KLQotCXsweGEwLCAweDY4LCBaQzNYWF9SMTBBX1JHQjAwfSwJLyogbWF0cml4ICovCi0JezB4YTAsIDB4ZWMsIFpDM1hYX1IxMEJfUkdCMDF9LAotCXsweGEwLCAweGVjLCBaQzNYWF9SMTBDX1JHQjAyfSwKLQl7MHhhMCwgMHhlYywgWkMzWFhfUjEwRF9SR0IxMH0sCi0JezB4YTAsIDB4NjgsIFpDM1hYX1IxMEVfUkdCMTF9LAotCXsweGEwLCAweGVjLCBaQzNYWF9SMTBGX1JHQjEyfSwKLQl7MHhhMCwgMHhlYywgWkMzWFhfUjExMF9SR0IyMH0sCi0JezB4YTAsIDB4ZWMsIFpDM1hYX1IxMTFfUkdCMjF9LAotCXsweGEwLCAweDY4LCBaQzNYWF9SMTEyX1JHQjIyfSwKLQotCXsweGExLCAweDAxLCAweDAxOGR9LAotCXsweGEwLCAweDkwLCBaQzNYWF9SMThEX1lUQVJHRVR9LAotCXsweGExLCAweDAxLCAweDAxODB9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKLQl7MHhhYSwgMHhhMywgMHgwMDAxfSwKLQl7MHhhYSwgMHhhNCwgMHgwMDYzfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjBBM19FWFBPU1VSRVRJTUVISUdIfSwKLQl7MHhhMCwgMHg2MywgWkMzWFhfUjBBNF9FWFBPU1VSRVRJTUVMT1d9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKLQl7MHhhMCwgMHgwMiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKLQl7MHhhMCwgMHgzOCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKLQl7MHhhMCwgMHg0NywgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCi0JezB4YTAsIDB4MGMsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAotCXsweGEwLCAweDE4LCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAotCXsweGEwLCAweDA4LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAotCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCi0JezB4YTAsIDB4ZDMsIFpDM1hYX1IwMURfSFNZTkNfMH0sCi0JezB4YTAsIDB4ZGEsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCi0JezB4YTAsIDB4ZWEsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IwOUZfTUFYWEhJR0h9LAotCXsweGEwLCAweDRjLCBaQzNYWF9SMEEwX01BWFhMT1d9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMSwgMHgwMSwgMHgwMTgwfSwKLQl7MHhhMCwgMHg0MiwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCiAJe30KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gdGFzNTEzMGN4eF81MEhaW10gPSB7CkBAIC01ODQxLDIwICs1NDE2LDIyIEBACiAJezB4YTAsIDB4MDEsIFpDM1hYX1IwQTNfRVhQT1NVUkVUSU1FSElHSH0sIC8qIDAwLGEzLDAxLGNjICovCiAJezB4YTAsIDB4NjMsIFpDM1hYX1IwQTRfRVhQT1NVUkVUSU1FTE9XfSwgLyogMDAsYTQsNjMsY2MgKi8KIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sIC8qIDAxLDkwLDAwLGNjICovCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sIC8qIDAxLDkxLDAyLGNjICovCi0JezB4YTAsIDB4MzgsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sIC8qIDAxLDkyLDM4LGNjICovCisJezB4YTAsIDB4MDQsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4ZmUsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwgLyogMDEsOTUsMDAsY2MgKi8KIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sIC8qIDAxLDk2LDAwLGNjICovCiAJezB4YTAsIDB4NDcsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LCAvKiAwMSw5Nyw0NyxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwgLyogMDEsOGMsMTAsY2MgKi8KLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwgLyogMDEsOGYsMjAsY2MgKi8KLQl7MHhhMCwgMHgwYywgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwgLyogMDEsYTksMGMsY2MgKi8KLQl7MHhhMCwgMHgyNiwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LCAvKiAwMSxhYSwyNixjYyAqLworCXsweGEwLCAweDBjLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgxOCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgwOCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAogCXsweGEwLCAweGQzLCBaQzNYWF9SMDFEX0hTWU5DXzB9LCAvKiAwMCwxZCxkMyxjYyAqLwogCXsweGEwLCAweGRhLCBaQzNYWF9SMDFFX0hTWU5DXzF9LCAvKiAwMCwxZSxkYSxjYyAqLwogCXsweGEwLCAweGVhLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LCAvKiAwMCwxZixlYSxjYyAqLwogCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LCAvKiAwMCwyMCxmZixjYyAqLwogCXsweGEwLCAweDAzLCBaQzNYWF9SMDlGX01BWFhISUdIfSwgLyogMDAsOWYsMDMsY2MgKi8KKwl7MHhhMCwgMHg0YywgWkMzWFhfUjBBMF9NQVhYTE9XfSwKKwl7MHhhMCwgMHg1MCwgWkMzWFhfUjExRF9HTE9CQUxHQUlOfSwKIAl7fQogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiB0YXM1MTMwY3h4XzUwSFpTY2FsZVtdID0gewpAQCAtNTg2NCwyMCArNTQ0MSwyMiBAQAogCXsweGEwLCAweDAxLCBaQzNYWF9SMEEzX0VYUE9TVVJFVElNRUhJR0h9LCAvKiAwMCxhMywwMSxjYyAqLwogCXsweGEwLCAweDc3LCBaQzNYWF9SMEE0X0VYUE9TVVJFVElNRUxPV30sIC8qIDAwLGE0LDc3LGNjICovCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDAzLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwwMyxjYyAqLwotCXsweGEwLCAweGU4LCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixlOCxjYyAqLworCXsweGEwLCAweDA3LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAorCXsweGEwLCAweGQwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAogCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwogCXsweGEwLCAweDdkLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsN2QsY2MgKi8KLQl7MHhhMCwgMHgxNCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDE0LGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCi0JezB4YTAsIDB4MGMsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDBjLGNjICovCi0JezB4YTAsIDB4MjYsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMjYsY2MgKi8KKwl7MHhhMCwgMHgwYywgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MTgsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCisJezB4YTAsIDB4MDgsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCisJezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKIAl7MHhhMCwgMHhmMCwgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsZjAsY2MgKi8KIAl7MHhhMCwgMHhmNCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwgLyogMDAsMWUsZjQsY2MgKi8KIAl7MHhhMCwgMHhmOCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsZjgsY2MgKi8KIAl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwgLyogMDAsMjAsZmYsY2MgKi8KIAl7MHhhMCwgMHgwMywgWkMzWFhfUjA5Rl9NQVhYSElHSH0sIC8qIDAwLDlmLDAzLGNjICovCisJezB4YTAsIDB4YzAsIFpDM1hYX1IwQTBfTUFYWExPV30sCisJezB4YTAsIDB4NTAsIFpDM1hYX1IxMURfR0xPQkFMR0FJTn0sCiAJe30KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gdGFzNTEzMGN4eF82MEhaW10gPSB7CkBAIC01ODg3LDIwICs1NDY2LDIyIEBACiAJezB4YTAsIDB4MDEsIFpDM1hYX1IwQTNfRVhQT1NVUkVUSU1FSElHSH0sIC8qIDAwLGEzLDAxLGNjICovCiAJezB4YTAsIDB4MzYsIFpDM1hYX1IwQTRfRVhQT1NVUkVUSU1FTE9XfSwgLyogMDAsYTQsMzYsY2MgKi8KIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sIC8qIDAxLDkwLDAwLGNjICovCi0JezB4YTAsIDB4MDEsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sIC8qIDAxLDkxLDAxLGNjICovCi0JezB4YTAsIDB4ZjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sIC8qIDAxLDkyLGYwLGNjICovCisJezB4YTAsIDB4MDUsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4NTQsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwgLyogMDEsOTUsMDAsY2MgKi8KIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sIC8qIDAxLDk2LDAwLGNjICovCiAJezB4YTAsIDB4M2UsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LCAvKiAwMSw5NywzZSxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwgLyogMDEsOGMsMTAsY2MgKi8KLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwgLyogMDEsOGYsMjAsY2MgKi8KLQl7MHhhMCwgMHgwYywgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwgLyogMDEsYTksMGMsY2MgKi8KLQl7MHhhMCwgMHgyNiwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LCAvKiAwMSxhYSwyNixjYyAqLworCXsweGEwLCAweDBjLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgxOCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKKwl7MHhhMCwgMHgwOCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKKwl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAogCXsweGEwLCAweGNhLCBaQzNYWF9SMDFEX0hTWU5DXzB9LCAvKiAwMCwxZCxjYSxjYyAqLwogCXsweGEwLCAweGQwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LCAvKiAwMCwxZSxkMCxjYyAqLwogCXsweGEwLCAweGUwLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LCAvKiAwMCwxZixlMCxjYyAqLwogCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LCAvKiAwMCwyMCxmZixjYyAqLwogCXsweGEwLCAweDAzLCBaQzNYWF9SMDlGX01BWFhISUdIfSwgLyogMDAsOWYsMDMsY2MgKi8KKwl7MHhhMCwgMHgyOCwgWkMzWFhfUjBBMF9NQVhYTE9XfSwKKwl7MHhhMCwgMHg1MCwgWkMzWFhfUjExRF9HTE9CQUxHQUlOfSwKIAl7fQogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiB0YXM1MTMwY3h4XzYwSFpTY2FsZVtdID0gewpAQCAtNTkxMCwyMCArNTQ5MSwyMiBAQAogCXsweGEwLCAweDAxLCBaQzNYWF9SMEEzX0VYUE9TVVJFVElNRUhJR0h9LCAvKiAwMCxhMywwMSxjYyAqLwogCXsweGEwLCAweDc3LCBaQzNYWF9SMEE0X0VYUE9TVVJFVElNRUxPV30sIC8qIDAwLGE0LDc3LGNjICovCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDAzLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwwMyxjYyAqLwotCXsweGEwLCAweGU4LCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixlOCxjYyAqLworCXsweGEwLCAweDA5LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAorCXsweGEwLCAweDQ3LCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAogCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwogCXsweGEwLCAweDdkLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsN2QsY2MgKi8KLQl7MHhhMCwgMHgxNCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDE0LGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCi0JezB4YTAsIDB4MGMsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDBjLGNjICovCi0JezB4YTAsIDB4MjYsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMjYsY2MgKi8KKwl7MHhhMCwgMHgwYywgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MTgsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCisJezB4YTAsIDB4MDgsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCisJezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKIAl7MHhhMCwgMHhjOCwgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsYzgsY2MgKi8KIAl7MHhhMCwgMHhkMCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwgLyogMDAsMWUsZDAsY2MgKi8KIAl7MHhhMCwgMHhlMCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsZTAsY2MgKi8KIAl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwgLyogMDAsMjAsZmYsY2MgKi8KIAl7MHhhMCwgMHgwMywgWkMzWFhfUjA5Rl9NQVhYSElHSH0sIC8qIDAwLDlmLDAzLGNjICovCisJezB4YTAsIDB4MjAsIFpDM1hYX1IwQTBfTUFYWExPV30sCisJezB4YTAsIDB4NTAsIFpDM1hYX1IxMURfR0xPQkFMR0FJTn0sCiAJe30KIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gdGFzNTEzMGN4eF9Ob0ZsaWtlcltdID0gewpAQCAtNTkzMywxMyArNTUxNiwxMyBAQAogCXsweGEwLCAweDAxLCBaQzNYWF9SMEEzX0VYUE9TVVJFVElNRUhJR0h9LCAvKiAwMCxhMywwMSxjYyAqLwogCXsweGEwLCAweDQwLCBaQzNYWF9SMEE0X0VYUE9TVVJFVElNRUxPV30sIC8qIDAwLGE0LDQwLGNjICovCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LCAvKiAwMSw5MCwwMCxjYyAqLwotCXsweGEwLCAweDAxLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LCAvKiAwMSw5MSwwMSxjYyAqLwotCXsweGEwLCAweGYwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LCAvKiAwMSw5MixmMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sIC8qIDAxLDk1LDAwLGNjICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LCAvKiAwMSw5NiwwMCxjYyAqLwotCXsweGEwLCAweDEwLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwgLyogMDEsOTcsMTAsY2MgKi8KLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sIC8qIDAxLDhjLDEwLGNjICovCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sIC8qIDAxLDhmLDIwLGNjICovCisJezB4YTAsIDB4MDUsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCisJezB4YTAsIDB4YTAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCisJezB4YTAsIDB4MDQsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAorCXsweGEwLCAweDBjLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKKwl7MHhhMCwgMHgxOCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwgLyogMDEsYTksMDAsY2MgKi8KIAl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LCAvKiAwMSxhYSwwMCxjYyAqLwogCXsweGEwLCAweGJjLCBaQzNYWF9SMDFEX0hTWU5DXzB9LCAvKiAwMCwxZCxiYyxjYyAqLwpAQCAtNTk0Nyw2ICs1NTMwLDggQEAKIAl7MHhhMCwgMHhlMCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwgLyogMDAsMWYsZTAsY2MgKi8KIAl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwgLyogMDAsMjAsZmYsY2MgKi8KIAl7MHhhMCwgMHgwMiwgWkMzWFhfUjA5Rl9NQVhYSElHSH0sIC8qIDAwLDlmLDAyLGNjICovCisJezB4YTAsIDB4ZjAsIFpDM1hYX1IwQTBfTUFYWExPV30sCisJezB4YTAsIDB4NTAsIFpDM1hYX1IxMURfR0xPQkFMR0FJTn0sCiAJe30KIH07CiAKQEAgLTU5NTcsMTMgKzU1NDIsMTMgQEAKIAl7MHhhMCwgMHgwMSwgWkMzWFhfUjBBM19FWFBPU1VSRVRJTUVISUdIfSwgLyogMDAsYTMsMDEsY2MgKi8KIAl7MHhhMCwgMHg5MCwgWkMzWFhfUjBBNF9FWFBPU1VSRVRJTUVMT1d9LCAvKiAwMCxhNCw5MCxjYyAqLwogCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwgLyogMDEsOTAsMDAsY2MgKi8KLQl7MHhhMCwgMHgwMywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwgLyogMDEsOTEsMDMsY2MgKi8KLQl7MHhhMCwgMHhmMCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwgLyogMDEsOTIsZjAsY2MgKi8KLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LCAvKiAwMSw5NSwwMCxjYyAqLwotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwgLyogMDEsOTYsMDAsY2MgKi8KLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sIC8qIDAxLDk3LDEwLGNjICovCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LCAvKiAwMSw4YywxMCxjYyAqLwotCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LCAvKiAwMSw4ZiwyMCxjYyAqLworCXsweGEwLCAweDBhLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAorCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAorCXsweGEwLCAweDA0LCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKKwl7MHhhMCwgMHgwYywgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCisJezB4YTAsIDB4MTgsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sIC8qIDAxLGE5LDAwLGNjICovCiAJezB4YTAsIDB4MDAsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwgLyogMDEsYWEsMDAsY2MgKi8KIAl7MHhhMCwgMHhiYywgWkMzWFhfUjAxRF9IU1lOQ18wfSwgLyogMDAsMWQsYmMsY2MgKi8KQEAgLTU5NzEsNiArNTU1Niw4IEBACiAJezB4YTAsIDB4ZTAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sIC8qIDAwLDFmLGUwLGNjICovCiAJezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sIC8qIDAwLDIwLGZmLGNjICovCiAJezB4YTAsIDB4MDIsIFpDM1hYX1IwOUZfTUFYWEhJR0h9LCAvKiAwMCw5ZiwwMixjYyAqLworCXsweGEwLCAweGYwLCBaQzNYWF9SMEEwX01BWFhMT1d9LAorCXsweGEwLCAweDUwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAogCXt9CiB9OwogCkBAIC02MzAzLDggKzU4OTAsMTAgQEAKIAogCXJlZ193X2koZ3NwY2FfZGV2LT5kZXYsIHJlZywgMHgwMDkyKTsKIAlyZWdfd19pKGdzcGNhX2Rldi0+ZGV2LCAweDAyLCAweDAwOTApOwkJLyogPC0gcmVhZCBjb21tYW5kICovCi0JbXNsZWVwKDI1KTsKKwltc2xlZXAoMjApOwogCXJldGJ5dGUgPSByZWdfcl9pKGdzcGNhX2RldiwgMHgwMDkxKTsJCS8qIHJlYWQgc3RhdHVzICovCisJaWYgKHJldGJ5dGUgIT0gMHgwMCkKKwkJZXJyKCJpMmNfciBzdGF0dXMgZXJyb3IgJTAyeCIsIHJldGJ5dGUpOwogCXJldHZhbCA9IHJlZ19yX2koZ3NwY2FfZGV2LCAweDAwOTUpOwkJLyogcmVhZCBMb3dieXRlICovCiAJcmV0dmFsIHw9IHJlZ19yX2koZ3NwY2FfZGV2LCAweDAwOTYpIDw8IDg7CS8qIHJlYWQgSGlnaHRieXRlICovCiAJUERFQlVHKERfVVNCSSwgImkyYyByIFslMDJ4XSAtPiAlMDR4ICglMDJ4KSIsCkBAIC02MzIzLDggKzU5MTIsMTAgQEAKIAlyZWdfd19pKGdzcGNhX2Rldi0+ZGV2LCB2YWxMLCAweDkzKTsKIAlyZWdfd19pKGdzcGNhX2Rldi0+ZGV2LCB2YWxILCAweDk0KTsKIAlyZWdfd19pKGdzcGNhX2Rldi0+ZGV2LCAweDAxLCAweDkwKTsJCS8qIDwtIHdyaXRlIGNvbW1hbmQgKi8KLQltc2xlZXAoMTUpOworCW1zbGVlcCgxKTsKIAlyZXRieXRlID0gcmVnX3JfaShnc3BjYV9kZXYsIDB4MDA5MSk7CQkvKiByZWFkIHN0YXR1cyAqLworCWlmIChyZXRieXRlICE9IDB4MDApCisJCWVycigiaTJjX3cgc3RhdHVzIGVycm9yICUwMngiLCByZXRieXRlKTsKIAlQREVCVUcoRF9VU0JPLCAiaTJjIHcgWyUwMnhdID0gJTAyeCUwMnggKCUwMngpIiwKIAkJCXJlZywgdmFsSCwgdmFsTCwgcmV0Ynl0ZSk7CiAJcmV0dXJuIHJldGJ5dGU7CkBAIC02MzU5LDcgKzU5NTAsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAkJYWN0aW9uKys7Ci0vKgkJbXNsZWVwKDEpOyAqLworCQltc2xlZXAoMSk7CiAJfQogfQogCkBAIC02MzgwLDExICs1OTcxLDEzIEBACiAJCXsweDRjLCAweGY1LCAweGZmLCAweGY5LCAweDUxLCAweGY1LCAweGZiLCAweGVkLCAweDVmfTsKIAlzdGF0aWMgY29uc3QgX191OCBwbzIwMzBfbWF0cml4WzldID0KIAkJezB4NjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4NjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4NjB9OworCXN0YXRpYyBjb25zdCB1OCB0YXM1MTMwY19tYXRyaXhbOV0gPQorCQl7MHg2OCwgMHhlYywgMHhlYywgMHhlYywgMHg2OCwgMHhlYywgMHhlYywgMHhlYywgMHg2OH07CiAJc3RhdGljIGNvbnN0IF9fdTggdmYwMjUwX21hdHJpeFs5XSA9CiAJCXsweDdiLCAweGVhLCAweGVhLCAweGVhLCAweDdiLCAweGVhLCAweGVhLCAweGVhLCAweDdifTsKIAlzdGF0aWMgY29uc3QgX191OCAqbWF0cml4X3RiW1NFTlNPUl9NQVhdID0gewogCQlhZGNtMjcwMF9tYXRyaXgsIC8qIFNFTlNPUl9BRENNMjcwMCAwICovCi0JCU5VTEwsCQkvKiBTRU5TT1JfQ1MyMTAyIDEgKi8KKwkJb3Y3NjIwX21hdHJpeCwJLyogU0VOU09SX0NTMjEwMiAxICovCiAJCU5VTEwsCQkvKiBTRU5TT1JfQ1MyMTAySyAyICovCiAJCWdjMDMwNV9tYXRyaXgsCS8qIFNFTlNPUl9HQzAzMDUgMyAqLwogCQlOVUxMLAkJLyogU0VOU09SX0hEQ1MyMDIwYiA0ICovCkBAIC02MzkyLDE1ICs1OTg1LDE2IEBACiAJCU5VTEwsCQkvKiBTRU5TT1JfSFY3MTMxQyA2ICovCiAJCU5VTEwsCQkvKiBTRU5TT1JfSUNNMTA1QSA3ICovCiAJCU5VTEwsCQkvKiBTRU5TT1JfTUM1MDFDQiA4ICovCi0JCW92NzYyMF9tYXRyaXgsCS8qIFNFTlNPUl9PVjc2MjAgOSAqLwotCQlOVUxMLAkJLyogU0VOU09SX09WNzYzMEMgMTAgKi8KLQkJTlVMTCwJCS8qIFNFTlNPUl9QQVMxMDYgMTEgKi8KLQkJcGFzMjAyYl9tYXRyaXgsCS8qIFNFTlNPUl9QQVMyMDJCIDEyICovCi0JCU5VTEwsCQkvKiBTRU5TT1JfUEIwMzMwIDEzICovCi0JCXBvMjAzMF9tYXRyaXgsCS8qIFNFTlNPUl9QTzIwMzAgMTQgKi8KLQkJTlVMTCwJCS8qIFNFTlNPUl9UQVM1MTMwQ0sgMTUgKi8KLQkJTlVMTCwJCS8qIFNFTlNPUl9UQVM1MTMwQ1hYIDE2ICovCi0JCXZmMDI1MF9tYXRyaXgsCS8qIFNFTlNPUl9UQVM1MTMwQ19WRjAyNTAgMTcgKi8KKwkJZ2MwMzA1X21hdHJpeCwJLyogU0VOU09SX01JMDM2MFNPQyA5ICovCisJCW92NzYyMF9tYXRyaXgsCS8qIFNFTlNPUl9PVjc2MjAgMTAgKi8KKwkJTlVMTCwJCS8qIFNFTlNPUl9PVjc2MzBDIDExICovCisJCU5VTEwsCQkvKiBTRU5TT1JfUEFTMTA2IDEyICovCisJCXBhczIwMmJfbWF0cml4LAkvKiBTRU5TT1JfUEFTMjAyQiAxMyAqLworCQlnYzAzMDVfbWF0cml4LAkvKiBTRU5TT1JfUEIwMzMwIDE0ICovCisJCXBvMjAzMF9tYXRyaXgsCS8qIFNFTlNPUl9QTzIwMzAgMTUgKi8KKwkJTlVMTCwJCS8qIFNFTlNPUl9UQVM1MTMwQ0sgMTYgKi8KKwkJdGFzNTEzMGNfbWF0cml4LCAvKiBTRU5TT1JfVEFTNTEzMENYWCAxNyAqLworCQl2ZjAyNTBfbWF0cml4LAkvKiBTRU5TT1JfVEFTNTEzMENfVkYwMjUwIDE4ICovCiAJfTsKIAogCW1hdHJpeCA9IG1hdHJpeF90YltzZC0+c2Vuc29yXTsKQEAgLTY2NDAsMzkgKzYyMzQsNDMgQEAKIAkJe01DNTAxQ0JfTm9GbGlrZXIsIE1DNTAxQ0JfTm9GbGlrZXJTY2FsZSwKIAkJIE1DNTAxQ0JfNTBIWiwgTUM1MDFDQl81MEhaU2NhbGUsCiAJCSBNQzUwMUNCXzYwSFosIE1DNTAxQ0JfNjBIWlNjYWxlfSwKLS8qIFNFTlNPUl9PVjc2MjAgOSAqLworLyogU0VOU09SX01JMDM2MFNPQyA5ICovCisJCXttaTM2MHNvY19BRU5vRmxpa2VyU2NhbGUsIG1pMzYwc29jX0FFTm9GbGlrZXIsCisJCSBtaTM2MHNvY19BRTUwSFpTY2FsZSwgbWkzNjBzb2NfQUU1MEhaLAorCQkgbWkzNjBzb2NfQUU2MEhaU2NhbGUsIG1pMzYwc29jX0FFNjBIWn0sCisvKiBTRU5TT1JfT1Y3NjIwIDEwICovCiAJCXtPVjc2MjBfTm9GbGlrZXIsIE9WNzYyMF9Ob0ZsaWtlciwKIAkJIE9WNzYyMF81MEhaLCBPVjc2MjBfNTBIWiwKIAkJIE9WNzYyMF82MEhaLCBPVjc2MjBfNjBIWn0sCi0vKiBTRU5TT1JfT1Y3NjMwQyAxMCAqLworLyogU0VOU09SX09WNzYzMEMgMTEgKi8KIAkJe05VTEwsIE5VTEwsCiAJCSBOVUxMLCBOVUxMLAogCQkgTlVMTCwgTlVMTH0sCi0vKiBTRU5TT1JfUEFTMTA2IDExICovCisvKiBTRU5TT1JfUEFTMTA2IDEyICovCiAJCXtwYXMxMDZiX05vRmxpa2VyLCBwYXMxMDZiX05vRmxpa2VyLAogCQkgcGFzMTA2Yl81MEhaLCBwYXMxMDZiXzUwSFosCiAJCSBwYXMxMDZiXzYwSFosIHBhczEwNmJfNjBIWn0sCi0vKiBTRU5TT1JfUEFTMjAyQiAxMiAqLworLyogU0VOU09SX1BBUzIwMkIgMTMgKi8KIAkJe3BhczIwMmJfTm9GbGlrZXJTY2FsZSwgcGFzMjAyYl9Ob0ZsaWtlciwKIAkJIHBhczIwMmJfNTBIWlNjYWxlLCBwYXMyMDJiXzUwSFosCiAJCSBwYXMyMDJiXzYwSFpTY2FsZSwgcGFzMjAyYl82MEhafSwKLS8qIFNFTlNPUl9QQjAzMzAgMTMgKi8KLQkJe3BiMDMzMF9Ob0ZsaWtlciwgcGIwMzMwX05vRmxpa2VyU2NhbGUsCi0JCSBwYjAzMzBfNTBIWiwgcGIwMzMwXzUwSFpTY2FsZSwKLQkJIHBiMDMzMF82MEhaLCBwYjAzMzBfNjBIWlNjYWxlfSwKLS8qIFNFTlNPUl9QTzIwMzAgMTQgKi8KKy8qIFNFTlNPUl9QQjAzMzAgMTQgKi8KKwkJe3BiMDMzMF9Ob0ZsaWtlclNjYWxlLCBwYjAzMzBfTm9GbGlrZXIsCisJCSBwYjAzMzBfNTBIWlNjYWxlLCBwYjAzMzBfNTBIWiwKKwkJIHBiMDMzMF82MEhaU2NhbGUsIHBiMDMzMF82MEhafSwKKy8qIFNFTlNPUl9QTzIwMzAgMTUgKi8KIAkJe1BPMjAzMF9Ob0ZsaWtlciwgUE8yMDMwX05vRmxpa2VyLAogCQkgUE8yMDMwXzUwSFosIFBPMjAzMF81MEhaLAogCQkgUE8yMDMwXzYwSFosIFBPMjAzMF82MEhafSwKLS8qIFNFTlNPUl9UQVM1MTMwQ0sgMTUgKi8KLQkJe3RhczUxMzBjeHhfTm9GbGlrZXIsIHRhczUxMzBjeHhfTm9GbGlrZXJTY2FsZSwKLQkJIHRhczUxMzBjeHhfNTBIWiwgdGFzNTEzMGN4eF81MEhaU2NhbGUsCi0JCSB0YXM1MTMwY3h4XzYwSFosIHRhczUxMzBjeHhfNjBIWlNjYWxlfSwKLS8qIFNFTlNPUl9UQVM1MTMwQ1hYIDE2ICovCi0JCXt0YXM1MTMwY3h4X05vRmxpa2VyLCB0YXM1MTMwY3h4X05vRmxpa2VyU2NhbGUsCi0JCSB0YXM1MTMwY3h4XzUwSFosIHRhczUxMzBjeHhfNTBIWlNjYWxlLAotCQkgdGFzNTEzMGN4eF82MEhaLCB0YXM1MTMwY3h4XzYwSFpTY2FsZX0sCi0vKiBTRU5TT1JfVEFTNTEzMENfVkYwMjUwIDE3ICovCisvKiBTRU5TT1JfVEFTNTEzMENLIDE2ICovCisJCXt0YXM1MTMwY3h4X05vRmxpa2VyU2NhbGUsIHRhczUxMzBjeHhfTm9GbGlrZXIsCisJCSB0YXM1MTMwY3h4XzUwSFpTY2FsZSwgdGFzNTEzMGN4eF81MEhaLAorCQkgdGFzNTEzMGN4eF82MEhaU2NhbGUsIHRhczUxMzBjeHhfNjBIWn0sCisvKiBTRU5TT1JfVEFTNTEzMENYWCAxNyAqLworCQl7dGFzNTEzMGN4eF9Ob0ZsaWtlclNjYWxlLCB0YXM1MTMwY3h4X05vRmxpa2VyLAorCQkgdGFzNTEzMGN4eF81MEhaU2NhbGUsIHRhczUxMzBjeHhfNTBIWiwKKwkJIHRhczUxMzBjeHhfNjBIWlNjYWxlLCB0YXM1MTMwY3h4XzYwSFp9LAorLyogU0VOU09SX1RBUzUxMzBDX1ZGMDI1MCAxOCAqLwogCQl7dGFzNTEzMGNfdmYwMjUwX05vRmxpa2VyLCB0YXM1MTMwY192ZjAyNTBfTm9GbGlrZXJTY2FsZSwKIAkJIHRhczUxMzBjX3ZmMDI1MF81MEhaLCB0YXM1MTMwY192ZjAyNTBfNTBIWlNjYWxlLAogCQkgdGFzNTEzMGNfdmYwMjUwXzYwSFosIHRhczUxMzBjX3ZmMDI1MF82MEhaU2NhbGV9LApAQCAtNjcyOSw2ICs2MzI3LDcgQEAKIAljYXNlIFNFTlNPUl9BRENNMjcwMDoKIAljYXNlIFNFTlNPUl9HQzAzMDU6CiAJY2FzZSBTRU5TT1JfT1Y3NjIwOgorCWNhc2UgU0VOU09SX01JMDM2MFNPQzoKIAljYXNlIFNFTlNPUl9QQjAzMzA6CiAJY2FzZSBTRU5TT1JfUE8yMDMwOgogCQlyZWdfdyhkZXYsIDB4MGQsIDB4MDAzYSk7CkBAIC02ODIwLDcgKzY0MTksNyBAQAogCXN0YXJ0XzJ3cl9wcm9iZShkZXYsIDB4MGUpOwkJLyogUEFTMjAyQkNCICovCiAJcmVnX3coZGV2LCAweDA4LCAweDAwOGQpOwogCWkyY193cml0ZShnc3BjYV9kZXYsIDB4MDMsIDB4YWEsIDB4MDApOwotCW1zbGVlcCg1MDApOworCW1zbGVlcCg1MCk7CiAJcmV0d29yZCA9IGkyY19yZWFkKGdzcGNhX2RldiwgMHgwMyk7CiAJaWYgKHJldHdvcmQgIT0gMCkKIAkJcmV0dXJuIDB4MGU7CQkJLyogUEFTMjAyQkNCICovCkBAIC02ODYzLDcgKzY0NjIsOCBAQAogCV9fdTggaW50ZXJuYWxfc2Vuc29yX2lkOwogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Vuc29yX2J5X2NoaXBzZXRfcmV2aXNpb24gY2hpcHNldF9yZXZpc2lvbl9zZW5zb3JbXSA9IHsKLQl7MHhjMDAxLCAweDEzfSwJCS8qIE1JMDM2MCAqLworCXsweGMwMDAsIDB4MTJ9LAkJLyogVEFTNTEzMEMgKi8KKwl7MHhjMDAxLCAweDEzfSwJCS8qIE1JMDM2MFNPQyAqLwogCXsweGUwMDEsIDB4MTN9LAogCXsweDgwMDEsIDB4MTN9LAogCXsweDgwMDAsIDB4MTR9LAkJLyogQ1MyMTAySyAqLwpAQCAtNjk2Myw3ICs2NTYzLDYgQEAKIAlyZWdfdyhkZXYsIDB4MDEsIDB4MDAwMSk7CiAJcmVnX3coZGV2LCAweGVlLCAweDAwOGIpOwogCXJlZ193KGRldiwgMHgwMywgMHgwMDEyKTsKLS8qCW1zbGVlcCgxNTApOyAqLwogCXJlZ193KGRldiwgMHgwMSwgMHgwMDEyKTsKIAlyZWdfdyhkZXYsIDB4MDUsIDB4MDAxMik7CiAJcmV0d29yZCA9IGkyY19yZWFkKGdzcGNhX2RldiwgMHgwMCkgPDwgODsJLyogSUQgMCAqLwpAQCAtNzAyNSw3ICs2NjI0LDcgQEAKIAlpbnQgdmdhID0gMTsJCS8qIDE6IHZnYSwgMDogc2lmICovCiAJc3RhdGljIGNvbnN0IF9fdTggZ2FtbWFbU0VOU09SX01BWF0gPSB7CiAJCTQsCS8qIFNFTlNPUl9BRENNMjcwMCAwICovCi0JCTUsCS8qIFNFTlNPUl9DUzIxMDIgMSAqLworCQk0LAkvKiBTRU5TT1JfQ1MyMTAyIDEgKi8KIAkJNSwJLyogU0VOU09SX0NTMjEwMksgMiAqLwogCQk0LAkvKiBTRU5TT1JfR0MwMzA1IDMgKi8KIAkJNCwJLyogU0VOU09SX0hEQ1MyMDIwYiA0ICovCkBAIC03MDMzLDE1ICs2NjMyLDE2IEBACiAJCTQsCS8qIFNFTlNPUl9IVjcxMzFDIDYgKi8KIAkJNCwJLyogU0VOU09SX0lDTTEwNUEgNyAqLwogCQk0LAkvKiBTRU5TT1JfTUM1MDFDQiA4ICovCi0JCTMsCS8qIFNFTlNPUl9PVjc2MjAgOSAqLwotCQk0LAkvKiBTRU5TT1JfT1Y3NjMwQyAxMCAqLwotCQk0LAkvKiBTRU5TT1JfUEFTMTA2IDExICovCi0JCTQsCS8qIFNFTlNPUl9QQVMyMDJCIDEyICovCi0JCTQsCS8qIFNFTlNPUl9QQjAzMzAgMTMgKi8KLQkJNCwJLyogU0VOU09SX1BPMjAzMCAxNCAqLwotCQk0LAkvKiBTRU5TT1JfVEFTNTEzMENLIDE1ICovCi0JCTQsCS8qIFNFTlNPUl9UQVM1MTMwQ1hYIDE2ICovCi0JCTMsCS8qIFNFTlNPUl9UQVM1MTMwQ19WRjAyNTAgMTcgKi8KKwkJNCwJLyogU0VOU09SX01JMDM2MFNPQyA5ICovCisJCTMsCS8qIFNFTlNPUl9PVjc2MjAgMTAgKi8KKwkJNCwJLyogU0VOU09SX09WNzYzMEMgMTEgKi8KKwkJNCwJLyogU0VOU09SX1BBUzEwNiAxMiAqLworCQk0LAkvKiBTRU5TT1JfUEFTMjAyQiAxMyAqLworCQk0LAkvKiBTRU5TT1JfUEIwMzMwIDE0ICovCisJCTQsCS8qIFNFTlNPUl9QTzIwMzAgMTUgKi8KKwkJNCwJLyogU0VOU09SX1RBUzUxMzBDSyAxNiAqLworCQkzLAkvKiBTRU5TT1JfVEFTNTEzMENYWCAxNyAqLworCQkzLAkvKiBTRU5TT1JfVEFTNTEzMENfVkYwMjUwIDE4ICovCiAJfTsKIAogCS8qIGRlZmluZSBzb21lIHNlbnNvcnMgZnJvbSB0aGUgdmVuZG9yL3Byb2R1Y3QgKi8KQEAgLTcwNjUsNyArNjY2NSw3IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVBERUJVRyhEX1BST0JFLAotCQkJCQkiU2Vuc29yIFVOS05PV18wIGZvcmNlIFRhczUxMzAiKTsKKwkJCQkJIlNlbnNvciBVTktOT1dOXzAgZm9yY2UgVGFzNTEzMCIpOwogCQkJCXNkLT5zZW5zb3IgPSBTRU5TT1JfVEFTNTEzMENYWDsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNzEwMyw3ICs2NzAzLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIDB4MTA6CiAJCWNhc2UgMHgxMjoKLQkJCVBERUJVRyhEX1BST0JFLCAiRmluZCBTZW5zb3IgVEFTNTEzMCIpOworCQkJUERFQlVHKERfUFJPQkUsICJGaW5kIFNlbnNvciBUQVM1MTMwQyIpOwogCQkJc2QtPnNlbnNvciA9IFNFTlNPUl9UQVM1MTMwQ1hYOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgxMToKQEAgLTcxMTIsOSArNjcxMiw5IEBACiAJCQlicmVhazsKIAkJY2FzZSAweDEzOgogCQkJUERFQlVHKERfUFJPQkUsCi0JCQkJIkZpbmQgU2Vuc29yIE1JMDM2MC4gQ2hpcCByZXZpc2lvbiAleCIsCisJCQkJIkZpbmQgU2Vuc29yIE1JMDM2MFNPQy4gQ2hpcCByZXZpc2lvbiAleCIsCiAJCQkJc2QtPmNoaXBfcmV2aXNpb24pOwotCQkJc2QtPnNlbnNvciA9IFNFTlNPUl9QQjAzMzA7CisJCQlzZC0+c2Vuc29yID0gU0VOU09SX01JMDM2MFNPQzsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTQ6CiAJCQlQREVCVUcoRF9QUk9CRSwKQEAgLTcyMjgsMTcgKzY4MjgsMTcgQEAKIAkJe2h2NzEzMWN4eF9Jbml0aWFsU2NhbGUsIGh2NzEzMWN4eF9Jbml0aWFsfSwJLyogNiAqLwogCQl7aWNtMTA1YXh4X0luaXRpYWxTY2FsZSwgaWNtMTA1YXh4X0luaXRpYWx9LAkvKiA3ICovCiAJCXtNQzUwMUNCX0luaXRpYWxTY2FsZSwgTUM1MDFDQl9Jbml0aWFsfSwJLyogOCAqLwotCQl7T1Y3NjIwX21vZGUwLCBPVjc2MjBfbW9kZTF9LAkJCS8qIDkgKi8KLQkJe292NzYzMGNfSW5pdGlhbFNjYWxlLCBvdjc2MzBjX0luaXRpYWx9LAkvKiAxMCAqLwotCQl7cGFzMTA2Yl9Jbml0aWFsU2NhbGUsIHBhczEwNmJfSW5pdGlhbH0sCS8qIDExICovCi0JCXtwYXMyMDJiX0luaXRpYWwsIHBhczIwMmJfSW5pdGlhbFNjYWxlfSwJLyogMTIgKi8KLQkJe3BiMDMzMHh4X0luaXRpYWxTY2FsZSwgcGIwMzMweHhfSW5pdGlhbH0sCS8qIDEzICovCi0vKiBvcgkJe3BiMDMzMDN4X0luaXRpYWxTY2FsZSwgcGIwMzMwM3hfSW5pdGlhbH0sICovCi0JCXtQTzIwMzBfbW9kZTAsIFBPMjAzMF9tb2RlMX0sCQkJLyogMTQgKi8KLQkJe3RhczUxMzBDS19Jbml0aWFsU2NhbGUsIHRhczUxMzBDS19Jbml0aWFsfSwJLyogMTUgKi8KLQkJe3RhczUxMzBjeHhfSW5pdGlhbFNjYWxlLCB0YXM1MTMwY3h4X0luaXRpYWx9LAkvKiAxNiAqLworCQl7bWkwMzYwc29jX0luaXRpYWwsIG1pMDM2MHNvY19Jbml0aWFsU2NhbGV9LAkvKiA5ICovCisJCXtPVjc2MjBfbW9kZTAsIE9WNzYyMF9tb2RlMX0sCQkJLyogMTAgKi8KKwkJe292NzYzMGNfSW5pdGlhbFNjYWxlLCBvdjc2MzBjX0luaXRpYWx9LAkvKiAxMSAqLworCQl7cGFzMTA2Yl9Jbml0aWFsU2NhbGUsIHBhczEwNmJfSW5pdGlhbH0sCS8qIDEyICovCisJCXtwYXMyMDJiX0luaXRpYWwsIHBhczIwMmJfSW5pdGlhbFNjYWxlfSwJLyogMTMgKi8KKwkJe3BiMDMzMF9Jbml0aWFsLCBwYjAzMzBfSW5pdGlhbFNjYWxlfSwJCS8qIDE0ICovCisJCXtQTzIwMzBfbW9kZTAsIFBPMjAzMF9tb2RlMX0sCQkJLyogMTUgKi8KKwkJe3RhczUxMzBDS19Jbml0aWFsU2NhbGUsIHRhczUxMzBDS19Jbml0aWFsfSwJLyogMTYgKi8KKwkJe3RhczUxMzBjeHhfSW5pdGlhbCwgdGFzNTEzMGN4eF9Jbml0aWFsU2NhbGV9LAkvKiAxNyAqLwogCQl7dGFzNTEzMGNfdmYwMjUwX0luaXRpYWxTY2FsZSwgdGFzNTEzMGNfdmYwMjUwX0luaXRpYWx9LAotCQkJCQkJCQkvKiAxNyAqLworCQkJCQkJCQkvKiAxOCAqLwogCX07CiAKIAkvKiBjcmVhdGUgdGhlIEpQRUcgaGVhZGVyICovCkBAIC03MjU4LDE5ICs2ODU4LDYgQEAKIAljYXNlIFNFTlNPUl9QQVMxMDY6CiAJCXVzYl9leGNoYW5nZShnc3BjYV9kZXYsIHBhczEwNmJfSW5pdGlhbF9jb20pOwogCQlicmVhazsKLQljYXNlIFNFTlNPUl9QQjAzMzA6Ci0JCWlmIChtb2RlKSB7Ci0JCQlpZiAoc2QtPmNoaXBfcmV2aXNpb24gPT0gMHhjMDAxCi0JCQkgICAgfHwgc2QtPmNoaXBfcmV2aXNpb24gPT0gMHhlMDAxCi0JCQkgICAgfHwgc2QtPmNoaXBfcmV2aXNpb24gPT0gMHg4MDAxKQotCQkJCXpjM19pbml0ID0gcGIwMzMwM3hfSW5pdGlhbDsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZC0+Y2hpcF9yZXZpc2lvbiA9PSAweGMwMDEKLQkJCSAgICB8fCBzZC0+Y2hpcF9yZXZpc2lvbiA9PSAweGUwMDEKLQkJCSAgICB8fCBzZC0+Y2hpcF9yZXZpc2lvbiA9PSAweDgwMDEpCi0JCQkJemMzX2luaXQgPSBwYjAzMzAzeF9Jbml0aWFsU2NhbGU7Ci0JCX0KLQkJYnJlYWs7CiAJfQogCXVzYl9leGNoYW5nZShnc3BjYV9kZXYsIHpjM19pbml0KTsKIApAQCAtNzMxMCwxMCArNjg5Nyw4IEBACiAKIAkvKiBzZXQgdGhlIGdhbW1hIHRhYmxlcyB3aGVuIG5vdCBzZXQgKi8KIAlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKLQljYXNlIFNFTlNPUl9DUzIxMDI6CQkvKiBnYW1tYSBzZXQgaW4geHh4X0luaXRpYWwgKi8KLQljYXNlIFNFTlNPUl9DUzIxMDJLOgorCWNhc2UgU0VOU09SX0NTMjEwMks6CQkvKiBnYW1tYSBzZXQgaW4geHh4X0luaXRpYWwgKi8KIAljYXNlIFNFTlNPUl9IRENTMjAyMGI6Ci0JY2FzZSBTRU5TT1JfUEIwMzMwOgkJLyogcGIgd2l0aCBjaGlwX3JldmlzaW9uIC0gc2VlIGFib3ZlICovCiAJY2FzZSBTRU5TT1JfT1Y3NjMwQzoKIAljYXNlIFNFTlNPUl9UQVM1MTMwQ0s6CiAJCWJyZWFrOwpAQCAtNzM2NSw3ICs2OTUwLDcgQEAKIAlzZXRhdXRvZ2Fpbihnc3BjYV9kZXYpOwogCXN3aXRjaCAoc2QtPnNlbnNvcikgewogCWNhc2UgU0VOU09SX1BPMjAzMDoKLQkJbXNsZWVwKDUwMCk7CisJCW1zbGVlcCg1MCk7CiAJCXJlZ19yKGdzcGNhX2RldiwgMHgwMDA4KTsKIAkJcmVnX3IoZ3NwY2FfZGV2LCAweDAwMDcpOwogCQkvKmZhbGwgdGhydSovCkBAIC03Mzg5LDE3ICs2OTc0LDE2IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCi0JCQlfX3U4ICpkYXRhLAorCQkJdTggKmRhdGEsCiAJCQlpbnQgbGVuKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCWlmIChkYXRhWzBdID09IDB4ZmYgJiYgZGF0YVsxXSA9PSAweGQ4KSB7CS8qIHN0YXJ0IG9mIGZyYW1lICovCi0JCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLAotCQkJCQlkYXRhLCAwKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCU5VTEwsIDApOwogCQkvKiBwdXQgdGhlIEpQRUcgaGVhZGVyIGluIHRoZSBuZXcgZnJhbWUgKi8KLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBmcmFtZSwKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAogCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CiAKIAkJLyogcmVtb3ZlIHRoZSB3ZWJjYW0ncyBoZWFkZXI6CkBAIC03NDExLDcgKzY5OTUsNyBAQAogCQlkYXRhICs9IDE4OwogCQlsZW4gLT0gMTg7CiAJfQotCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogfQogCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLXZpZGVvLmMKaW5kZXggMmViOWRjMi4uYjU0MzljYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItdmlkZW8uYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7CiAJCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgImNhbm5vdCBhbGxvY2F0ZSB1cmJcbiIpOwotCQkJZ290byBleGl0OworCQkJZ290byBleGl0X3VyYjsKIAkJfQogCQlidWYtPnVyYiA9IHVyYjsKIApAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCWlmICghbWVtKSB7CiAJCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwKIAkJCQkgImNhbm5vdCBhbGxvY2F0ZSB1c2IgdHJhbnNmZXIgYnVmZmVyXG4iKTsKLQkJCWdvdG8gZXhpdDsKKwkJCWdvdG8gZXhpdF91cmJfYnVmZmVyOwogCQl9CiAKIAkJdXNiX2ZpbGxfYnVsa191cmIoYnVmLT51cmIsIGRldi0+dWRldiwKQEAgLTE2MSw2ICsxNjEsMTAgQEAKIAkJbGlzdF9hZGRfdGFpbCgmYnVmLT5idWZmX2xpc3QsICZkZXYtPmZyZWVfYnVmZl9saXN0KTsKIAl9CiAJcmV0dXJuIDA7CitleGl0X3VyYl9idWZmZXI6CisJdXNiX2ZyZWVfdXJiKHVyYik7CitleGl0X3VyYjoKKwlrZnJlZShidWYpOwogZXhpdDoKIAloZHB2cl9mcmVlX2J1ZmZlcnMoZGV2KTsKIAlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9nZW1pbmkuYwppbmRleCA3MWMyMTE0Li42MGQ5OTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9nZW1pbmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9nZW1pbmkuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiAKIAlERUJfRUUoKCJWSURJT0NfU19JTlBVVCAlZC5cbiIsIGlucHV0KSk7CiAKLQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID49IEhFWElVTV9JTlBVVFMpCisJaWYgKGlucHV0ID49IEhFWElVTV9JTlBVVFMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaGV4aXVtLT5jdXJfaW5wdXQgPSBpbnB1dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX29yaW9uLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9vcmlvbi5jCmluZGV4IDM5ZDY1Y2EuLjkzOGExZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX29yaW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fb3Jpb24uYwpAQCAtMzUwLDcgKzM1MCw3IEBACiAJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSAoKHN0cnVjdCBzYWE3MTQ2X2ZoICopZmgpLT5kZXY7CiAJc3RydWN0IGhleGl1bSAqaGV4aXVtID0gKHN0cnVjdCBoZXhpdW0gKikgZGV2LT5leHRfcHJpdjsKIAotCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPj0gSEVYSVVNX0lOUFVUUykKKwlpZiAoaW5wdXQgPj0gSEVYSVVNX0lOUFVUUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAloZXhpdW0tPmN1cl9pbnB1dCA9IGlucHV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCAyNDdkMzExLi42NDM2MGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJaWYgKDAgPT0gcmMpIHsKIAkJaXJfaW5wdXRfbm9rZXkoaXItPmlucHV0LCAmaXItPmlyKTsKIAl9IGVsc2UgewotCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgaXJfa2V5LCBpcl9yYXcpOworCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgaXJfa2V5KTsKIAl9CiB9CiAKQEAgLTI5OSw3ICsyOTksNyBAQAogewogCXN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSAqaXJfY29kZXMgPSBOVUxMOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotCWludCBpcl90eXBlOworCWludCBpcl90eXBlID0gMDsKIAlzdHJ1Y3QgSVJfaTJjICppcjsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwpAQCAtMzUzLDEwICszNTMsOCBAQAogCQlpcl90eXBlICAgICA9IElSX1RZUEVfUkM1OwogCQlpcl9jb2RlcyAgICA9ICZpcl9jb2Rlc19mdXNpb25oZHR2X21jZV90YWJsZTsKIAkJYnJlYWs7Ci0JY2FzZSAweDdhOgogCWNhc2UgMHg0NzoKIAljYXNlIDB4NzE6Ci0JY2FzZSAweDJkOgogCQlpZiAoYWRhcC0+aWQgPT0gSTJDX0hXX0JfQ1gyMzg4eCB8fAogCQkgICAgYWRhcC0+aWQgPT0gSTJDX0hXX0JfQ1gyMzQxWCkgewogCQkJLyogSGFuZGxlZCBieSBjeDg4LWlucHV0ICovCkBAIC0zODEsMTAgKzM3OSw2IEBACiAJCWlyX3R5cGUgICAgID0gSVJfVFlQRV9PVEhFUjsKIAkJaXJfY29kZXMgICAgPSAmaXJfY29kZXNfYXZlcm1lZGlhX2NhcmRidXNfdGFibGU7CiAJCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRwcmludGsoMSwgREVWTkFNRSAiOiBVbnN1cHBvcnRlZCBpMmMgYWRkcmVzcyAweCUwMnhcbiIsIGFkZHIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9vdXRfZnJlZTsKIAl9CiAKIAkvKiBMZXQgdGhlIGNhbGxlciBvdmVycmlkZSBzZXR0aW5ncyAqLwpAQCAtNDI3LDcgKzQyMSw3IEBACiAJfQogCiAJLyogTWFrZSBzdXJlIHdlIGFyZSBhbGwgc2V0dXAgYmVmb3JlIGdvaW5nIG9uICovCi0JaWYgKCFuYW1lIHx8ICFpci0+Z2V0X2tleSB8fCAhaXJfY29kZXMpIHsKKwlpZiAoIW5hbWUgfHwgIWlyLT5nZXRfa2V5IHx8ICFpcl90eXBlIHx8ICFpcl9jb2RlcykgewogCQlkcHJpbnRrKDEsIERFVk5BTUUgIjogVW5zdXBwb3J0ZWQgZGV2aWNlIGF0IGFkZHJlc3MgMHglMDJ4XG4iLAogCQkJYWRkcik7CiAJCWVyciA9IC1FTk9ERVY7CkBAIC00NDMsNyArNDM3LDEwIEBACiAJCSBkZXZfbmFtZSgmY2xpZW50LT5kZXYpKTsKIAogCS8qIGluaXQgKyByZWdpc3RlciBpbnB1dCBkZXZpY2UgKi8KLQlpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgaXJfdHlwZSwgaXItPmlyX2NvZGVzKTsKKwllcnIgPSBpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgaXJfdHlwZSwgaXItPmlyX2NvZGVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOwogCWlucHV0X2Rldi0+bmFtZSAgICAgICA9IGlyLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyAgICAgICA9IGlyLT5waHlzOwpAQCAtNDYyLDYgKzQ1OSw3IEBACiAJcmV0dXJuIDA7CiAKICBlcnJfb3V0X2ZyZWU6CisJaXJfaW5wdXRfZnJlZShpbnB1dF9kZXYpOwogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CiAJa2ZyZWUoaXIpOwogCXJldHVybiBlcnI7CkBAIC00NzUsNiArNDczLDcgQEAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmlyLT53b3JrKTsKIAogCS8qIHVucmVnaXN0ZXIgZGV2aWNlICovCisJaXJfaW5wdXRfZnJlZShpci0+aW5wdXQpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlyLT5pbnB1dCk7CiAKIAkvKiBmcmVlIG1lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNhcmRzLmMKaW5kZXggNDg3M2I2Yy4uNzlkMGZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jYXJkcy5jCkBAIC0xMzYsNyArMTM2LDggQEAKIAkuaHdfYXVkaW8gPSBJVlRWX0hXX01TUDM0WFgsCiAJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX01TUDM0WFgsCiAJLmh3X2FsbCA9IElWVFZfSFdfTVNQMzRYWCB8IElWVFZfSFdfU0FBNzExNSB8Ci0JCSAgSVZUVl9IV19TQUE3MTI3IHwgSVZUVl9IV19UVkVFUFJPTSB8IElWVFZfSFdfVFVORVIsCisJCSAgSVZUVl9IV19TQUE3MTI3IHwgSVZUVl9IV19UVkVFUFJPTSB8IElWVFZfSFdfVFVORVIgfAorCQkgIElWVFZfSFdfSTJDX0lSX1JYX0hBVVBfRVhUIHwgSVZUVl9IV19JMkNfSVJfUlhfSEFVUF9JTlQsCiAJLnZpZGVvX2lucHV0cyA9IHsKIAkJeyBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSLCAgMCwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTQgfSwKIAkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwgSVZUVl9TQUE3MVhYX1NWSURFTzAgICAgfSwKQEAgLTE5OSw3ICsyMDAsOSBAQAogCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19DWDI1ODQwLAogCS5od19tdXhlciA9IElWVFZfSFdfV004Nzc1LAogCS5od19hbGwgPSBJVlRWX0hXX1dNODc3NSB8IElWVFZfSFdfQ1gyNTg0MCB8Ci0JCSAgSVZUVl9IV19UVkVFUFJPTSB8IElWVFZfSFdfVFVORVIsCisJCSAgSVZUVl9IV19UVkVFUFJPTSB8IElWVFZfSFdfVFVORVIgfAorCQkgIElWVFZfSFdfSTJDX0lSX1JYX0hBVVBfRVhUIHwgSVZUVl9IV19JMkNfSVJfUlhfSEFVUF9JTlQgfAorCQkgIElWVFZfSFdfWjhGMDgxMV9JUl9IQVVQLAogCS52aWRlb19pbnB1dHMgPSB7CiAJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIENYMjU4NDBfQ09NUE9TSVRFNyB9LAogCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8xLCAgICAxLCBDWDI1ODQwX1NWSURFTzEgICAgfSwKQEAgLTk1NSw3ICs5NTgsOCBAQAogCS5od192aWRlbyA9IElWVFZfSFdfQ1gyNTg0MCwKIAkuaHdfYXVkaW8gPSBJVlRWX0hXX0NYMjU4NDAsCiAJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX0NYMjU4NDAsCi0JLmh3X2FsbCA9IElWVFZfSFdfQ1gyNTg0MCB8IElWVFZfSFdfVFVORVIgfCBJVlRWX0hXX1dNODczOSwKKwkuaHdfYWxsID0gSVZUVl9IV19DWDI1ODQwIHwgSVZUVl9IV19UVU5FUiB8IElWVFZfSFdfV004NzM5IHwKKwkJICBJVlRWX0hXX0kyQ19JUl9SWF9BVkVSLAogCS52aWRlb19pbnB1dHMgPSB7CiAJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIENYMjU4NDBfQ09NUE9TSVRFMiB9LAogCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8xLCAgICAxLCBDWDI1ODQwX1NWSURFTzMgICAgfSwKQEAgLTk2NSw2ICs5NjksNyBAQAogCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBDWDI1ODQwX0FVRElPNSAgICAgICB9LAogCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBDWDI1ODQwX0FVRElPX1NFUklBTCwgMSB9LAogCX0sCisJLnJhZGlvX2lucHV0ID0geyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCAgQ1gyNTg0MF9BVURJTzUgfSwKIAkvKiBlbmFibGUgbGluZS1pbiAqLwogCS5ncGlvX2luaXQgPSB7IC5kaXJlY3Rpb24gPSAweGUwMDAsIC5pbml0aWFsX3ZhbHVlID0gMHg0MDAwIH0sCiAJLnhjZWl2ZV9waW4gPSAxMCwKQEAgLTEwMjUsMTMgKzEwMzAsMTUgQEAKIC8qIEFWZXJNZWRpYSBVbHRyYVRWIDE1MDAgTUNFIChuZXdlciBub24tY3g4OCB2ZXJzaW9uLCBNMTEzIHZhcmlhbnQpIGNhcmQgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gaXZ0dl9wY2lfYXZlcl91bHRyYTE1MDBtY2VbXSA9IHsKLQl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9BVkVSTUVESUEsIDB4YzAxOSB9LAorCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX0FWRVJNRURJQSwgMHhjMDE5IH0sIC8qIE5UU0MgKi8KKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9BVkVSTUVESUEsIDB4YzAxYiB9LCAvKiBQQUwvU0VDQU0gKi8KIAl7IDAsIDAsIDAgfQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmQgaXZ0dl9jYXJkX2F2ZXJfdWx0cmExNTAwbWNlID0gewogCS50eXBlID0gSVZUVl9DQVJEX0FWRVJfVUxUUkExNTAwTUNFLAogCS5uYW1lID0gIkFWZXJNZWRpYSBVbHRyYVRWIDE1MDAgTUNFIC8gQVZlclRWIE0xMTMgUGhpbGlwcyBUdW5lciIsCisJLmNvbW1lbnQgPSAiRm9yIG5vbi1OVFNDIHR1bmVycywgdXNlIHRoZSBwYWw9IG9yIHNlY2FtPSBtb2R1bGUgb3B0aW9ucyIsCiAJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKIAkuaHdfdmlkZW8gPSBJVlRWX0hXX0NYMjU4NDAsCiAJLmh3X2F1ZGlvID0gSVZUVl9IV19DWDI1ODQwLApAQCAtMTA1OCw2ICsxMDY1LDcgQEAKIAkudHVuZXJzID0gewogCQkvKiBUaGUgVWx0cmFUViAxNTAwIE1DRSBoYXMgYSBQaGlsaXBzIEZNMTIzNiBNSzUgVFYvRk0gdHVuZXIgKi8KIAkJeyAuc3RkID0gVjRMMl9TVERfTU4sIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMyB9LAorCQl7IC5zdGQgPSBWNEwyX1NURF9QQUxfU0VDQU0sIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUs1IH0sCiAJfSwKIAkucGNpX2xpc3QgPSBpdnR2X3BjaV9hdmVyX3VsdHJhMTUwMG1jZSwKIAkuaTJjID0gJml2dHZfaTJjX3N0ZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNhcmRzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jYXJkcy5oCmluZGV4IGU5OWEwYTIuLjYxNDg4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNhcmRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuaApAQCAtODcsMjYgKzg3LDQzIEBACiAjZGVmaW5lIElWVFZfUENJX0lEX0dPVFZJRVcxCQkweGZmYWMKICNkZWZpbmUgSVZUVl9QQ0lfSURfR09UVklFVzIgCQkweGZmYWQKIAotLyogaGFyZHdhcmUgZmxhZ3MsIG5vIGdhcHMgYWxsb3dlZCwgSVZUVl9IV19HUElPIG11c3QgYWx3YXlzIGJlIGxhc3QgKi8KLSNkZWZpbmUgSVZUVl9IV19DWDI1ODQwICAgKDEgPDwgMCkKLSNkZWZpbmUgSVZUVl9IV19TQUE3MTE1ICAgKDEgPDwgMSkKLSNkZWZpbmUgSVZUVl9IV19TQUE3MTI3ICAgKDEgPDwgMikKLSNkZWZpbmUgSVZUVl9IV19NU1AzNFhYICAgKDEgPDwgMykKLSNkZWZpbmUgSVZUVl9IV19UVU5FUiAgICAgKDEgPDwgNCkKLSNkZWZpbmUgSVZUVl9IV19XTTg3NzUgICAgKDEgPDwgNSkKLSNkZWZpbmUgSVZUVl9IV19DUzUzTDMyQSAgKDEgPDwgNikKLSNkZWZpbmUgSVZUVl9IV19UVkVFUFJPTSAgKDEgPDwgNykKLSNkZWZpbmUgSVZUVl9IV19TQUE3MTE0ICAgKDEgPDwgOCkKLSNkZWZpbmUgSVZUVl9IV19VUEQ2NDAzMUEgKDEgPDwgOSkKLSNkZWZpbmUgSVZUVl9IV19VUEQ2NDA4WCAgKDEgPDwgMTApCi0jZGVmaW5lIElWVFZfSFdfU0FBNzE3WCAgICgxIDw8IDExKQotI2RlZmluZSBJVlRWX0hXX1dNODczOSAgICAoMSA8PCAxMikKLSNkZWZpbmUgSVZUVl9IV19WUDI3U01QWCAgKDEgPDwgMTMpCi0jZGVmaW5lIElWVFZfSFdfTTUyNzkwICAgICgxIDw8IDE0KQotI2RlZmluZSBJVlRWX0hXX0dQSU8gICAgICAoMSA8PCAxNSkKKy8qIGhhcmR3YXJlIGZsYWdzLCBubyBnYXBzIGFsbG93ZWQgKi8KKyNkZWZpbmUgSVZUVl9IV19DWDI1ODQwCQkJKDEgPDwgMCkKKyNkZWZpbmUgSVZUVl9IV19TQUE3MTE1CQkJKDEgPDwgMSkKKyNkZWZpbmUgSVZUVl9IV19TQUE3MTI3CQkJKDEgPDwgMikKKyNkZWZpbmUgSVZUVl9IV19NU1AzNFhYCQkJKDEgPDwgMykKKyNkZWZpbmUgSVZUVl9IV19UVU5FUgkJCSgxIDw8IDQpCisjZGVmaW5lIElWVFZfSFdfV004Nzc1CQkJKDEgPDwgNSkKKyNkZWZpbmUgSVZUVl9IV19DUzUzTDMyQQkJKDEgPDwgNikKKyNkZWZpbmUgSVZUVl9IV19UVkVFUFJPTQkJKDEgPDwgNykKKyNkZWZpbmUgSVZUVl9IV19TQUE3MTE0CQkJKDEgPDwgOCkKKyNkZWZpbmUgSVZUVl9IV19VUEQ2NDAzMUEJCSgxIDw8IDkpCisjZGVmaW5lIElWVFZfSFdfVVBENjQwOFgJCSgxIDw8IDEwKQorI2RlZmluZSBJVlRWX0hXX1NBQTcxN1gJCQkoMSA8PCAxMSkKKyNkZWZpbmUgSVZUVl9IV19XTTg3MzkJCQkoMSA8PCAxMikKKyNkZWZpbmUgSVZUVl9IV19WUDI3U01QWAkJKDEgPDwgMTMpCisjZGVmaW5lIElWVFZfSFdfTTUyNzkwCQkJKDEgPDwgMTQpCisjZGVmaW5lIElWVFZfSFdfR1BJTwkJCSgxIDw8IDE1KQorI2RlZmluZSBJVlRWX0hXX0kyQ19JUl9SWF9BVkVSCQkoMSA8PCAxNikKKyNkZWZpbmUgSVZUVl9IV19JMkNfSVJfUlhfSEFVUF9FWFQJKDEgPDwgMTcpIC8qIEV4dGVybmFsIGJlZm9yZSBpbnRlcm5hbCAqLworI2RlZmluZSBJVlRWX0hXX0kyQ19JUl9SWF9IQVVQX0lOVAkoMSA8PCAxOCkKKyNkZWZpbmUgSVZUVl9IV19aOEYwODExX0lSX1RYX0hBVVAJKDEgPDwgMTkpCisjZGVmaW5lIElWVFZfSFdfWjhGMDgxMV9JUl9SWF9IQVVQCSgxIDw8IDIwKQorCisjZGVmaW5lIElWVFZfSFdfWjhGMDgxMV9JUl9IQVVQCShJVlRWX0hXX1o4RjA4MTFfSVJfUlhfSEFVUCB8IFwKKwkJCQkgSVZUVl9IV19aOEYwODExX0lSX1RYX0hBVVApCiAKICNkZWZpbmUgSVZUVl9IV19TQUE3MTFYICAgKElWVFZfSFdfU0FBNzExNSB8IElWVFZfSFdfU0FBNzExNCkKIAorI2RlZmluZSBJVlRWX0hXX0lSX1JYX0FOWSAoSVZUVl9IV19JMkNfSVJfUlhfQVZFUiB8IFwKKwkJCSAgIElWVFZfSFdfSTJDX0lSX1JYX0hBVVBfRVhUIHwgXAorCQkJICAgSVZUVl9IV19JMkNfSVJfUlhfSEFVUF9JTlQgfCBcCisJCQkgICBJVlRWX0hXX1o4RjA4MTFfSVJfUlhfSEFVUCkKKworI2RlZmluZSBJVlRWX0hXX0lSX1RYX0FOWSAoSVZUVl9IV19aOEYwODExX0lSX1RYX0hBVVApCisKKyNkZWZpbmUgSVZUVl9IV19JUl9BTlkJICAoSVZUVl9IV19JUl9SWF9BTlkgfCBJVlRWX0hXX0lSX1RYX0FOWSkKKwogLyogdmlkZW8gaW5wdXRzICovCiAjZGVmaW5lCUlWVFZfQ0FSRF9JTlBVVF9WSURfVFVORVIJMQogI2RlZmluZQlJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSAJMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwppbmRleCA0NjNlYzM0Li4zNDdjMzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwpAQCAtOTEsMTAgKzkxLDE1IEBACiAJCQkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCiAJCQkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCiAJCQkJICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK3N0YXRpYyBpbnQgaTJjX2Nsb2NrX3BlcmlvZFtJVlRWX01BWF9DQVJEU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNhcmR0eXBlX2MgPSAxOwogc3RhdGljIHVuc2lnbmVkIGludCB0dW5lcl9jID0gMTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9fYyA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGkyY19jbG9ja19wZXJpb2RfYyA9IDE7CiBzdGF0aWMgY2hhciBwYWxbXSA9ICItLS0iOwogc3RhdGljIGNoYXIgc2VjYW1bXSA9ICItLSI7CiBzdGF0aWMgY2hhciBudHNjW10gPSAiLSI7CkBAIC0xNTEsNiArMTU2LDcgQEAKIAogbW9kdWxlX3BhcmFtKHR1bmVydHlwZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShuZXdpMmMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaTJjX2Nsb2NrX3BlcmlvZCwgaW50LCAmaTJjX2Nsb2NrX3BlcmlvZF9jLCAwNjQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyh0dW5lciwgIlR1bmVyIHR5cGUgc2VsZWN0aW9uLFxuIgogCQkJIlx0XHRcdHNlZSB0dW5lci5oIGZvciB2YWx1ZXMiKTsKQEAgLTI0NSw2ICsyNTEsMTAgQEAKIAkJICJVc2UgbmV3IEkyQyBpbXBsZW1lbnRhdGlvblxuIgogCQkgIlx0XHRcdC0xIGlzIGF1dG9kZXRlY3QsIDAgaXMgb2ZmLCAxIGlzIG9uXG4iCiAJCSAiXHRcdFx0RGVmYXVsdCBpcyBhdXRvZGV0ZWN0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGkyY19jbG9ja19wZXJpb2QsCisJCSAiUGVyaW9kIG9mIFNDTCBmb3IgdGhlIEkyQyBidXMgY29udHJvbGxlZCBieSB0aGUgQ1gyMzQxNS82XG4iCisJCSAiXHRcdFx0TWluOiAxMCB1c2VjICgxMDAga0h6KSwgTWF4OiA0NTAwIHVzZWMgKDIyMiBIeilcbiIKKwkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KElWVFZfREVGQVVMVF9JMkNfQ0xPQ0tfUEVSSU9EKSk7CiAKIE1PRFVMRV9QQVJNX0RFU0MoaXZ0dl9maXJzdF9taW5vciwgIlNldCBkZXZpY2Ugbm9kZSBudW1iZXIgYXNzaWduZWQgdG8gZmlyc3QgY2FyZCIpOwogCkBAIC02MDAsNiArNjEwLDE1IEBACiAJaXR2LT5vcHRpb25zLmNhcmR0eXBlID0gY2FyZHR5cGVbaXR2LT5pbnN0YW5jZV07CiAJaXR2LT5vcHRpb25zLnR1bmVyID0gdHVuZXJbaXR2LT5pbnN0YW5jZV07CiAJaXR2LT5vcHRpb25zLnJhZGlvID0gcmFkaW9baXR2LT5pbnN0YW5jZV07CisKKwlpdHYtPm9wdGlvbnMuaTJjX2Nsb2NrX3BlcmlvZCA9IGkyY19jbG9ja19wZXJpb2RbaXR2LT5pbnN0YW5jZV07CisJaWYgKGl0di0+b3B0aW9ucy5pMmNfY2xvY2tfcGVyaW9kID09IC0xKQorCQlpdHYtPm9wdGlvbnMuaTJjX2Nsb2NrX3BlcmlvZCA9IElWVFZfREVGQVVMVF9JMkNfQ0xPQ0tfUEVSSU9EOworCWVsc2UgaWYgKGl0di0+b3B0aW9ucy5pMmNfY2xvY2tfcGVyaW9kIDwgMTApCisJCWl0di0+b3B0aW9ucy5pMmNfY2xvY2tfcGVyaW9kID0gMTA7CisJZWxzZSBpZiAoaXR2LT5vcHRpb25zLmkyY19jbG9ja19wZXJpb2QgPiA0NTAwKQorCQlpdHYtPm9wdGlvbnMuaTJjX2Nsb2NrX3BlcmlvZCA9IDQ1MDA7CisKIAlpdHYtPm9wdGlvbnMubmV3aTJjID0gbmV3aTJjOwogCWlmICh0dW5lcnR5cGUgPCAtMSB8fCB0dW5lcnR5cGUgPiAxKSB7CiAJCUlWVFZfV0FSTigiSW52YWxpZCB0dW5lcnR5cGUgYXJndW1lbnQsIHdpbGwgYXV0b2RldGVjdCBpbnN0ZWFkXG4iKTsKQEAgLTg2NSw2ICs4ODQsMTAgQEAKIAkJCWl0di0+aHdfZmxhZ3MgfD0gZGV2aWNlOwogCX0KIAorCS8qIHByb2JlIGZvciBsZWdhY3kgSVIgY29udHJvbGxlcnMgdGhhdCBhcmVuJ3QgaW4gY2FyZCBkZWZpbml0aW9ucyAqLworCWlmICgoaXR2LT5od19mbGFncyAmIElWVFZfSFdfSVJfQU5ZKSA9PSAwKQorCQlpdnR2X2kyY19uZXdfaXJfbGVnYWN5KGl0dik7CisKIAlpZiAoaXR2LT5jYXJkLT5od19hbGwgJiBJVlRWX0hXX0NYMjU4NDApCiAJCWl0di0+c2RfdmlkZW8gPSBpdnR2X2ZpbmRfaHcoaXR2LCBJVlRWX0hXX0NYMjU4NDApOwogCWVsc2UgaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19TQUE3MTdYKQpAQCAtMTM2MSw3ICsxMzg0LDcgQEAKICAgICAgIC5yZW1vdmUgPSAgIGl2dHZfcmVtb3ZlLAogfTsKIAotc3RhdGljIGludCBtb2R1bGVfc3RhcnQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG1vZHVsZV9zdGFydCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIml2dHY6IFN0YXJ0IGluaXRpYWxpemF0aW9uLCB2ZXJzaW9uICVzXG4iLCBJVlRWX1ZFUlNJT04pOwogCkBAIC0xMzg1LDcgKzE0MDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtb2R1bGVfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IG1vZHVsZV9jbGVhbnVwKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpdnR2X3BjaV9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaAppbmRleCA0NDBmNzMyLi5lNDgxNmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaApAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9jeDIzNDF4Lmg+CisjaW5jbHVkZSA8bWVkaWEvaXIta2JkLWkyYy5oPgogCiAjaW5jbHVkZSA8bGludXgvaXZ0di5oPgogCkBAIC0xNzYsMTIgKzE3NywxNiBAQAogCiAjZGVmaW5lIElWVFZfTUFYX1BHTV9JTkRFWCAoNDAwKQogCisvKiBEZWZhdWx0IEkyQyBTQ0wgcGVyaW9kIGluIG1pY3Jvc2Vjb25kcyAqLworI2RlZmluZSBJVlRWX0RFRkFVTFRfSTJDX0NMT0NLX1BFUklPRAkyMAorCiBzdHJ1Y3QgaXZ0dl9vcHRpb25zIHsKIAlpbnQga2lsb2J5dGVzW0lWVFZfTUFYX1NUUkVBTVNdOyAgICAgICAgLyogc2l6ZSBpbiBraWxvYnl0ZXMgb2YgZWFjaCBzdHJlYW0gKi8KIAlpbnQgY2FyZHR5cGU7CQkJCS8qIGZvcmNlIGNhcmQgdHlwZSBvbiBsb2FkICovCiAJaW50IHR1bmVyOwkJCQkvKiBzZXQgdHVuZXIgb24gbG9hZCAqLwogCWludCByYWRpbzsJCQkJLyogZW5hYmxlL2Rpc2FibGUgcmFkaW8gKi8KIAlpbnQgbmV3aTJjOwkJCQkvKiBuZXcgSTJDIGFsZ29yaXRobSAqLworCWludCBpMmNfY2xvY2tfcGVyaW9kOwkJCS8qIHBlcmlvZCBvZiBTQ0wgZm9yIEkyQyBidXMgKi8KIH07CiAKIC8qIGl2dHYtc3BlY2lmaWMgbWFpbGJveCB0ZW1wbGF0ZSAqLwpAQCAtNjc3LDYgKzY4Miw3IEBACiAJaW50IGkyY19zdGF0ZTsgICAgICAgICAgICAgICAgICAvKiBpMmMgYml0IHN0YXRlICovCiAJc3RydWN0IG11dGV4IGkyY19idXNfbG9jazsgICAgICAvKiBsb2NrIGkyYyBidXMgKi8KIAorCXN0cnVjdCBJUl9pMmNfaW5pdF9kYXRhIGlyX2kyY19pbml0X2RhdGE7CiAKIAkvKiBQcm9ncmFtIEluZGV4IGluZm9ybWF0aW9uICovCiAJdTMyIHBnbV9pbmZvX29mZnNldDsgICAgICAgICAgICAvKiBzdGFydCBvZiBwZ20gaW5mbyBpbiBlbmNvZGVyIG1lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuYwppbmRleCBiOWM3MWU2Li4yZWUwM2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuYwpAQCAtODgsNiArODgsMTEgQEAKICNkZWZpbmUgSVZUVl9VUEQ2NDA4M19JMkNfQUREUiAJCTB4NWMKICNkZWZpbmUgSVZUVl9WUDI3U01QWF9JMkNfQUREUiAgICAgIAkweDViCiAjZGVmaW5lIElWVFZfTTUyNzkwX0kyQ19BRERSICAgICAgCTB4NDgKKyNkZWZpbmUgSVZUVl9BVkVSTUVESUFfSVJfUlhfSTJDX0FERFIJMHg0MAorI2RlZmluZSBJVlRWX0hBVVBfRVhUX0lSX1JYX0kyQ19BRERSIAkweDFhCisjZGVmaW5lIElWVFZfSEFVUF9JTlRfSVJfUlhfSTJDX0FERFIgCTB4MTgKKyNkZWZpbmUgSVZUVl9aOEYwODExX0lSX1RYX0kyQ19BRERSCTB4NzAKKyNkZWZpbmUgSVZUVl9aOEYwODExX0lSX1JYX0kyQ19BRERSCTB4NzEKIAogLyogVGhpcyBhcnJheSBzaG91bGQgbWF0Y2ggdGhlIElWVFZfSFdfIGRlZmluZXMgKi8KIHN0YXRpYyBjb25zdCB1OCBod19hZGRyc1tdID0gewpAQCAtMTA2LDcgKzExMSwxMiBAQAogCUlWVFZfV004NzM5X0kyQ19BRERSLAogCUlWVFZfVlAyN1NNUFhfSTJDX0FERFIsCiAJSVZUVl9NNTI3OTBfSTJDX0FERFIsCi0JMCAJCS8qIElWVFZfSFdfR1BJTyBkdW1teSBkcml2ZXIgSUQgKi8KKwkwLAkJCQkvKiBJVlRWX0hXX0dQSU8gZHVtbXkgZHJpdmVyIElEICovCisJSVZUVl9BVkVSTUVESUFfSVJfUlhfSTJDX0FERFIsCS8qIElWVFZfSFdfSTJDX0lSX1JYX0FWRVIgKi8KKwlJVlRWX0hBVVBfRVhUX0lSX1JYX0kyQ19BRERSLAkvKiBJVlRWX0hXX0kyQ19JUl9SWF9IQVVQX0VYVCAqLworCUlWVFZfSEFVUF9JTlRfSVJfUlhfSTJDX0FERFIsCS8qIElWVFZfSFdfSTJDX0lSX1JYX0hBVVBfSU5UICovCisJSVZUVl9aOEYwODExX0lSX1RYX0kyQ19BRERSLAkvKiBJVlRWX0hXX1o4RjA4MTFfSVJfVFhfSEFVUCAqLworCUlWVFZfWjhGMDgxMV9JUl9SWF9JMkNfQUREUiwJLyogSVZUVl9IV19aOEYwODExX0lSX1JYX0hBVVAgKi8KIH07CiAKIC8qIFRoaXMgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZSBJVlRWX0hXXyBkZWZpbmVzICovCkBAIC0xMjYsNyArMTM2LDEyIEBACiAJIndtODczOSIsCiAJInZwMjdzbXB4IiwKIAkibTUyNzkwIiwKLQlOVUxMCisJTlVMTCwKKwlOVUxMLAkJLyogSVZUVl9IV19JMkNfSVJfUlhfQVZFUiAqLworCU5VTEwsCQkvKiBJVlRWX0hXX0kyQ19JUl9SWF9IQVVQX0VYVCAqLworCU5VTEwsCQkvKiBJVlRWX0hXX0kyQ19JUl9SWF9IQVVQX0lOVCAqLworCU5VTEwsCQkvKiBJVlRWX0hXX1o4RjA4MTFfSVJfVFhfSEFVUCAqLworCU5VTEwsCQkvKiBJVlRWX0hXX1o4RjA4MTFfSVJfUlhfSEFVUCAqLwogfTsKIAogLyogVGhpcyBhcnJheSBzaG91bGQgbWF0Y2ggdGhlIElWVFZfSFdfIGRlZmluZXMgKi8KQEAgLTE0Nyw4ICsxNjIsOTUgQEAKIAkidnAyN3NtcHgiLAogCSJtNTI3OTAiLAogCSJncGlvIiwKKwkiaXJfdmlkZW8iLAkJLyogSVZUVl9IV19JMkNfSVJfUlhfQVZFUiAqLworCSJpcl92aWRlbyIsCQkvKiBJVlRWX0hXX0kyQ19JUl9SWF9IQVVQX0VYVCAqLworCSJpcl92aWRlbyIsCQkvKiBJVlRWX0hXX0kyQ19JUl9SWF9IQVVQX0lOVCAqLworCSJpcl90eF96OGYwODExX2hhdXAiLAkvKiBJVlRWX0hXX1o4RjA4MTFfSVJfVFhfSEFVUCAqLworCSJpcl9yeF96OGYwODExX2hhdXAiLAkvKiBJVlRWX0hXX1o4RjA4MTFfSVJfUlhfSEFVUCAqLwogfTsKIAorc3RhdGljIGludCBpdnR2X2kyY19uZXdfaXIoc3RydWN0IGl2dHYgKml0diwgdTMyIGh3LCBjb25zdCBjaGFyICp0eXBlLCB1OCBhZGRyKQoreworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9ICZpdHYtPmkyY19hZGFwOworCXN0cnVjdCBJUl9pMmNfaW5pdF9kYXRhICppbml0X2RhdGEgPSAmaXR2LT5pcl9pMmNfaW5pdF9kYXRhOworCXVuc2lnbmVkIHNob3J0IGFkZHJfbGlzdFsyXSA9IHsgYWRkciwgSTJDX0NMSUVOVF9FTkQgfTsKKworCS8qIE9ubHkgYWxsb3cgb25lIElSIHRyYW5zbWl0dGVyIHRvIGJlIHJlZ2lzdGVyZWQgcGVyIGJvYXJkICovCisJaWYgKGh3ICYgSVZUVl9IV19JUl9UWF9BTlkpIHsKKwkJaWYgKGl0di0+aHdfZmxhZ3MgJiBJVlRWX0hXX0lSX1RYX0FOWSkKKwkJCXJldHVybiAtMTsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CisJCXN0cmxjcHkoaW5mby50eXBlLCB0eXBlLCBJMkNfTkFNRV9TSVpFKTsKKwkJcmV0dXJuIGkyY19uZXdfcHJvYmVkX2RldmljZShhZGFwLCAmaW5mbywgYWRkcl9saXN0KSA9PSBOVUxMCisJCQkJCQkJCSAgICAgPyAtMSA6IDA7CisJfQorCisJLyogT25seSBhbGxvdyBvbmUgSVIgcmVjZWl2ZXIgdG8gYmUgcmVnaXN0ZXJlZCBwZXIgYm9hcmQgKi8KKwlpZiAoaXR2LT5od19mbGFncyAmIElWVFZfSFdfSVJfUlhfQU5ZKQorCQlyZXR1cm4gLTE7CisKKwkvKiBPdXIgZGVmYXVsdCBpbmZvcm1hdGlvbiBmb3IgaXIta2JkLWkyYy5jIHRvIHVzZSAqLworCXN3aXRjaCAoaHcpIHsKKwljYXNlIElWVFZfSFdfSTJDX0lSX1JYX0FWRVI6CisJCWluaXRfZGF0YS0+aXJfY29kZXMgPSAmaXJfY29kZXNfYXZlcm1lZGlhX2NhcmRidXNfdGFibGU7CisJCWluaXRfZGF0YS0+aW50ZXJuYWxfZ2V0X2tleV9mdW5jID0KKwkJCQkJSVJfS0JEX0dFVF9LRVlfQVZFUk1FRElBX0NBUkRCVVM7CisJCWluaXRfZGF0YS0+dHlwZSA9IElSX1RZUEVfT1RIRVI7CisJCWluaXRfZGF0YS0+bmFtZSA9ICJBVmVyTWVkaWEgQVZlclRWIGNhcmQiOworCQlicmVhazsKKwljYXNlIElWVFZfSFdfSTJDX0lSX1JYX0hBVVBfRVhUOgorCWNhc2UgSVZUVl9IV19JMkNfSVJfUlhfSEFVUF9JTlQ6CisJCS8qIERlZmF1bHQgdG8gb2xkIGJsYWNrIHJlbW90ZSAqLworCQlpbml0X2RhdGEtPmlyX2NvZGVzID0gJmlyX2NvZGVzX3JjNV90dl90YWJsZTsKKwkJaW5pdF9kYXRhLT5pbnRlcm5hbF9nZXRfa2V5X2Z1bmMgPSBJUl9LQkRfR0VUX0tFWV9IQVVQOworCQlpbml0X2RhdGEtPnR5cGUgPSBJUl9UWVBFX1JDNTsKKwkJaW5pdF9kYXRhLT5uYW1lID0gaXR2LT5jYXJkX25hbWU7CisJCWJyZWFrOworCWNhc2UgSVZUVl9IV19aOEYwODExX0lSX1JYX0hBVVA6CisJCS8qIERlZmF1bHQgdG8gZ3JleSByZW1vdGUgKi8KKwkJaW5pdF9kYXRhLT5pcl9jb2RlcyA9ICZpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3X3RhYmxlOworCQlpbml0X2RhdGEtPmludGVybmFsX2dldF9rZXlfZnVuYyA9IElSX0tCRF9HRVRfS0VZX0hBVVBfWFZSOworCQlpbml0X2RhdGEtPnR5cGUgPSBJUl9UWVBFX1JDNTsKKwkJaW5pdF9kYXRhLT5uYW1lID0gaXR2LT5jYXJkX25hbWU7CisJCWJyZWFrOworCX0KKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCWluZm8ucGxhdGZvcm1fZGF0YSA9IGluaXRfZGF0YTsKKwlzdHJsY3B5KGluZm8udHlwZSwgdHlwZSwgSTJDX05BTUVfU0laRSk7CisKKwlyZXR1cm4gaTJjX25ld19wcm9iZWRfZGV2aWNlKGFkYXAsICZpbmZvLCBhZGRyX2xpc3QpID09IE5VTEwgPyAtMSA6IDA7Cit9CisKKy8qIEluc3RhbnRpYXRlIHRoZSBJUiByZWNlaXZlciBkZXZpY2UgdXNpbmcgcHJvYmluZyAtLSB1bmRlc2lyYWJsZSAqLworc3RydWN0IGkyY19jbGllbnQgKml2dHZfaTJjX25ld19pcl9sZWdhY3koc3RydWN0IGl2dHYgKml0dikKK3sKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKwkvKgorCSAqIFRoZSBleHRlcm5hbCBJUiByZWNlaXZlciBpcyBhdCBpMmMgYWRkcmVzcyAweDM0LgorCSAqIFRoZSBpbnRlcm5hbCBJUiByZWNlaXZlciBpcyBhdCBpMmMgYWRkcmVzcyAweDMwLgorCSAqCisJICogSW4gdGhlb3J5LCBib3RoIGNhbiBiZSBmaXR0ZWQsIGFuZCBIYXVwcGF1Z2Ugc3VnZ2VzdHMgYW4gZXh0ZXJuYWwKKwkgKiBvdmVycmlkZXMgYW4gaW50ZXJuYWwuICBUaGF0J3Mgd2h5IHdlIHByb2JlIDB4MWEgKH4weDM0KSBmaXJzdC4gQ0IKKwkgKgorCSAqIFNvbWUgb2YgdGhlc2UgYWRkcmVzc2VzIHdlIHByb2JlIG1heSBjb2xsaWRlIHdpdGggb3RoZXIgaTJjIGFkZHJlc3MKKwkgKiBhbGxvY2F0aW9ucywgc28gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgb3RoZXIgaTJjCisJICogZGV2aWNlcyB3ZSBjYXJlIGFib3V0IGFyZSByZWdpc3RlcmVkLgorCSAqLworCWNvbnN0IHVuc2lnbmVkIHNob3J0IGFkZHJfbGlzdFtdID0geworCQkweDFhLAkvKiBIYXVwcGF1Z2UgSVIgZXh0ZXJuYWwgLSBjb2xsaWRlcyB3aXRoIFdNODczOSAqLworCQkweDE4LAkvKiBIYXVwcGF1Z2UgSVIgaW50ZXJuYWwgKi8KKwkJMHg3MSwJLyogSGF1cHBhdWdlIElSIChQVlIxNTApICovCisJCTB4NmIsCS8qIEFkYXB0ZWMgSVIgKi8KKwkJSTJDX0NMSUVOVF9FTkQKKwl9OworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CisJc3RybGNweShpbmZvLnR5cGUsICJpcl92aWRlbyIsIEkyQ19OQU1FX1NJWkUpOworCXJldHVybiBpMmNfbmV3X3Byb2JlZF9kZXZpY2UoJml0di0+aTJjX2FkYXAsICZpbmZvLCBhZGRyX2xpc3QpOworfQorCiBpbnQgaXZ0dl9pMmNfcmVnaXN0ZXIoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaWR4KQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CkBAIC0xNzgsOCArMjgwLDE1IEBACiAJCQlzZC0+Z3JwX2lkID0gMSA8PCBpZHg7CiAJCXJldHVybiBzZCA/IDAgOiAtMTsKIAl9CisKKwlpZiAoaHcgJiBJVlRWX0hXX0lSX0FOWSkKKwkJcmV0dXJuIGl2dHZfaTJjX25ld19pcihpdHYsIGh3LCB0eXBlLCBod19hZGRyc1tpZHhdKTsKKworCS8qIElzIGl0IG5vdCBhbiBJMkMgZGV2aWNlIG9yIG9uZSB3ZSBkbyBub3Qgd2lzaCB0byByZWdpc3Rlcj8gKi8KIAlpZiAoIWh3X2FkZHJzW2lkeF0pCiAJCXJldHVybiAtMTsKKworCS8qIEl0J3MgYW4gSTJDIGRldmljZSBvdGhlciB0aGFuIGFuIGFuYWxvZyB0dW5lciBvciBJUiBjaGlwICovCiAJaWYgKGh3ID09IElWVFZfSFdfVVBENjQwMzFBIHx8IGh3ID09IElWVFZfSFdfVVBENjQwOFgpIHsKIAkJc2QgPSB2NGwyX2kyY19uZXdfc3ViZGV2KCZpdHYtPnY0bDJfZGV2LAogCQkJCWFkYXAsIG1vZCwgdHlwZSwgMCwgSTJDX0FERFJTKGh3X2FkZHJzW2lkeF0pKTsKQEAgLTU2NCwyMCArNjczLDIyIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCisjZGVmaW5lIElWVFZfQUxHT19CSVRfVElNRU9VVAkoMikJLyogc2Vjb25kcyAqLworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGl2dHZfaTJjX2FsZ29fdGVtcGxhdGUgPSB7CiAJLnNldHNkYQkJPSBpdnR2X3NldHNkYV9vbGQsCiAJLnNldHNjbAkJPSBpdnR2X3NldHNjbF9vbGQsCiAJLmdldHNkYQkJPSBpdnR2X2dldHNkYV9vbGQsCiAJLmdldHNjbAkJPSBpdnR2X2dldHNjbF9vbGQsCi0JLnVkZWxheQkJPSAxMCwKLQkudGltZW91dAk9IDIwMCwKKwkudWRlbGF5CQk9IElWVFZfREVGQVVMVF9JMkNfQ0xPQ0tfUEVSSU9EIC8gMiwgIC8qIG1pY3Jvc2Vjb25kcyAqLworCS50aW1lb3V0CT0gSVZUVl9BTEdPX0JJVF9USU1FT1VUICogSFosICAgICAgICAgLyogamlmZmllcyAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGl2dHZfaTJjX2NsaWVudF90ZW1wbGF0ZSA9IHsKIAkubmFtZSA9ICJpdnR2IGludGVybmFsIiwKIH07CiAKLS8qIGluaXQgKyByZWdpc3RlciBpMmMgYWRhcHRlciArIGluc3RhbnRpYXRlIElSIHJlY2VpdmVyICovCisvKiBpbml0ICsgcmVnaXN0ZXIgaTJjIGFkYXB0ZXIgKi8KIGludCBpbml0X2l2dHZfaTJjKHN0cnVjdCBpdnR2ICppdHYpCiB7CiAJaW50IHJldHZhbDsKQEAgLTU4NSwxMSArNjk2LDEwIEBACiAJSVZUVl9ERUJVR19JMkMoImkyYyBpbml0XG4iKTsKIAogCS8qIFNhbml0eSBjaGVja3MgZm9yIHRoZSBJMkMgaGFyZHdhcmUgYXJyYXlzLiBUaGV5IG11c3QgYmUgdGhlCi0JICogc2FtZSBzaXplIGFuZCBHUElPIG11c3QgYmUgdGhlIGxhc3QgZW50cnkuCisJICogc2FtZSBzaXplLgogCSAqLwogCWlmIChBUlJBWV9TSVpFKGh3X2RldmljZW5hbWVzKSAhPSBBUlJBWV9TSVpFKGh3X2FkZHJzKSB8fAotCSAgICBBUlJBWV9TSVpFKGh3X2RldmljZW5hbWVzKSAhPSBBUlJBWV9TSVpFKGh3X21vZHVsZXMpIHx8Ci0JICAgIElWVFZfSFdfR1BJTyAhPSAoMSA8PCAoQVJSQVlfU0laRShod19hZGRycykgLSAxKSkpIHsKKwkgICAgQVJSQVlfU0laRShod19kZXZpY2VuYW1lcykgIT0gQVJSQVlfU0laRShod19tb2R1bGVzKSkgewogCQlJVlRWX0VSUigiTWlzbWF0Y2hlZCBJMkMgaGFyZHdhcmUgYXJyYXlzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNjAyLDYgKzcxMiw3IEBACiAJCW1lbWNweSgmaXR2LT5pMmNfYWxnbywgJml2dHZfaTJjX2FsZ29fdGVtcGxhdGUsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhKSk7CiAJfQorCWl0di0+aTJjX2FsZ28udWRlbGF5ID0gaXR2LT5vcHRpb25zLmkyY19jbG9ja19wZXJpb2QgLyAyOwogCWl0di0+aTJjX2FsZ28uZGF0YSA9IGl0djsKIAlpdHYtPmkyY19hZGFwLmFsZ29fZGF0YSA9ICZpdHYtPmkyY19hbGdvOwogCkBAIC02MjMsMzIgKzczNCw2IEBACiAJZWxzZQogCQlyZXR2YWwgPSBpMmNfYml0X2FkZF9idXMoJml0di0+aTJjX2FkYXApOwogCi0JLyogSW5zdGFudGlhdGUgdGhlIElSIHJlY2VpdmVyIGRldmljZSwgaWYgcHJlc2VudCAqLwotCWlmIChyZXR2YWwgPT0gMCkgewotCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKLQkJLyogVGhlIGV4dGVybmFsIElSIHJlY2VpdmVyIGlzIGF0IGkyYyBhZGRyZXNzIDB4MzQgKDB4MzUgZm9yCi0JCSAgIHJlYWRzKS4gIEZ1dHVyZSBIYXVwcGF1Z2UgY2FyZHMgd2lsbCBoYXZlIGFuIGludGVybmFsCi0JCSAgIHJlY2VpdmVyIGF0IDB4MzAgKDB4MzEgZm9yIHJlYWRzKS4gIEluIHRoZW9yeSwgYm90aCBjYW4gYmUKLQkJICAgZml0dGVkLCBhbmQgSGF1cHBhdWdlIHN1Z2dlc3QgYW4gZXh0ZXJuYWwgb3ZlcnJpZGVzIGFuCi0JCSAgIGludGVybmFsLgotCi0JCSAgIFRoYXQncyB3aHkgd2UgcHJvYmUgMHgxYSAofjB4MzQpIGZpcnN0LiBDQgotCQkqLwotCQljb25zdCB1bnNpZ25lZCBzaG9ydCBhZGRyX2xpc3RbXSA9IHsKLQkJCTB4MWEsCS8qIEhhdXBwYXVnZSBJUiBleHRlcm5hbCAqLwotCQkJMHgxOCwJLyogSGF1cHBhdWdlIElSIGludGVybmFsICovCi0JCQkweDcxLAkvKiBIYXVwcGF1Z2UgSVIgKFBWUjE1MCkgKi8KLQkJCTB4NjQsCS8qIFBpeGVsdmlldyBJUiAqLwotCQkJMHgzMCwJLyogS05DIE9ORSBJUiAqLwotCQkJMHg2YiwJLyogQWRhcHRlYyBJUiAqLwotCQkJSTJDX0NMSUVOVF9FTkQKLQkJfTsKLQotCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTsKLQkJc3RybGNweShpbmZvLnR5cGUsICJpcl92aWRlbyIsIEkyQ19OQU1FX1NJWkUpOwotCQlpMmNfbmV3X3Byb2JlZF9kZXZpY2UoJml0di0+aTJjX2FkYXAsICZpbmZvLCBhZGRyX2xpc3QpOwotCX0KLQogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWkyYy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmgKaW5kZXggMzk2OTI4YS4uOTMzMjkyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpZm5kZWYgSVZUVl9JMkNfSAogI2RlZmluZSBJVlRWX0kyQ19ICiAKK3N0cnVjdCBpMmNfY2xpZW50ICppdnR2X2kyY19uZXdfaXJfbGVnYWN5KHN0cnVjdCBpdnR2ICppdHYpOwogaW50IGl2dHZfaTJjX3JlZ2lzdGVyKHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGlkeCk7CiBzdHJ1Y3QgdjRsMl9zdWJkZXYgKml2dHZfZmluZF9odyhzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaHcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwppbmRleCAzNDU0MDcwLi5jMWZjNmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKQEAgLTQ3OCw3ICs0NzgsNyBAQAogCiAJREVCX0VFKCgiVklESU9DX1NfSU5QVVQgJWQuXG4iLCBpbnB1dCkpOwogCi0JaWYgKGlucHV0IDwgMCB8fCBpbnB1dCA+PSBNWEJfSU5QVVRTKQorCWlmIChpbnB1dCA+PSBNWEJfSU5QVVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW14Yi0+Y3VyX2lucHV0ID0gaW5wdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYwppbmRleCBlY2NiNDBhLi4yMDUyMjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCiAvKiBDT001ICovCiAjZGVmaW5lIEFGUl9PTl9PRkYgICAgICAweDgwCS8qIEF1dG8gZnJhbWUgcmF0ZSBjb250cm9sIE9OL09GRiBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgQUZSX1NQUEVEICAgICAgIDB4NDAJLyogQXV0byBmcmFtZSByYXRlIGNvbnRyb2wgc3BlZWQgc2xlY3Rpb24gKi8KKyNkZWZpbmUgQUZSX1NQUEVEICAgICAgIDB4NDAJLyogQXV0byBmcmFtZSByYXRlIGNvbnRyb2wgc3BlZWQgc2VsZWN0aW9uICovCiAJCQkJLyogQXV0byBmcmFtZSByYXRlIG1heCByYXRlIGNvbnRyb2wgKi8KICNkZWZpbmUgQUZSX05PX1JBVEUgICAgIDB4MDAJLyogICAgIE5vICByZWR1Y3Rpb24gb2YgZnJhbWUgcmF0ZSAqLwogI2RlZmluZSBBRlJfMXAyICAgICAgICAgMHgxMAkvKiAgICAgTWF4IHJlZHVjdGlvbiB0byAxLzIgZnJhbWUgcmF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxYWUyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jCkBAIC0wLDAgKzEsODAxIEBACisvKgorICogT21uaVZpc2lvbiBPVjk2eHggQ2FtZXJhIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIEJhc2VkIG9uIG92NzcyeCBjYW1lcmEgZHJpdmVyOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgorICoKKyAqIEJhc2VkIG9uIG92NzY3MCBhbmQgc29jX2NhbWVyYV9wbGF0Zm9ybSBkcml2ZXIsCisgKgorICogQ29weXJpZ2h0IDIwMDYtNyBKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hZ251cyBEYW1tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKworI2luY2x1ZGUgIm92OTY0MC5oIgorCisvKiBkZWZhdWx0IHJlZ2lzdGVyIHNldHVwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG92OTY0MF9yZWcgb3Y5NjQwX3JlZ3NfZGZsdFtdID0geworCXsgT1Y5NjQwX0NPTTUsCU9WOTY0MF9DT001X1NZU0NMSyB8IE9WOTY0MF9DT001X0xPTkdFWFAgfSwKKwl7IE9WOTY0MF9DT002LAlPVjk2NDBfQ09NNl9PUFRfQkxDIHwgT1Y5NjQwX0NPTTZfQURCTENfQklBUyB8CisJCQlPVjk2NDBfQ09NNl9GTVRfUlNUIHwgT1Y5NjQwX0NPTTZfQURCTENfT1BURU4gfSwKKwl7IE9WOTY0MF9QU0hGVCwJT1Y5NjQwX1BTSEZUX1ZBTCgweDAxKSB9LAorCXsgT1Y5NjQwX0FDT00sCU9WOTY0MF9BQ09NXzJYX0FOQUxPRyB8IE9WOTY0MF9BQ09NX1JTVkQgfSwKKwl7IE9WOTY0MF9UU0xCLAlPVjk2NDBfVFNMQl9ZVVlWX1VZVlkgfSwKKwl7IE9WOTY0MF9DT00xNiwJT1Y5NjQwX0NPTTE2X1JCX0FWRyB9LAorCisJLyogR2FtbWEgY3VydmUgUCAqLworCXsgMHg2YywgMHg0MCB9LAl7IDB4NmQsIDB4MzAgfSwJeyAweDZlLCAweDRiIH0sCXsgMHg2ZiwgMHg2MCB9LAorCXsgMHg3MCwgMHg3MCB9LAl7IDB4NzEsIDB4NzAgfSwJeyAweDcyLCAweDcwIH0sCXsgMHg3MywgMHg3MCB9LAorCXsgMHg3NCwgMHg2MCB9LAl7IDB4NzUsIDB4NjAgfSwJeyAweDc2LCAweDUwIH0sCXsgMHg3NywgMHg0OCB9LAorCXsgMHg3OCwgMHgzYSB9LAl7IDB4NzksIDB4MmUgfSwJeyAweDdhLCAweDI4IH0sCXsgMHg3YiwgMHgyMiB9LAorCisJLyogR2FtbWEgY3VydmUgVCAqLworCXsgMHg3YywgMHgwNCB9LAl7IDB4N2QsIDB4MDcgfSwJeyAweDdlLCAweDEwIH0sCXsgMHg3ZiwgMHgyOCB9LAorCXsgMHg4MCwgMHgzNiB9LAl7IDB4ODEsIDB4NDQgfSwJeyAweDgyLCAweDUyIH0sCXsgMHg4MywgMHg2MCB9LAorCXsgMHg4NCwgMHg2YyB9LAl7IDB4ODUsIDB4NzggfSwJeyAweDg2LCAweDhjIH0sCXsgMHg4NywgMHg5ZSB9LAorCXsgMHg4OCwgMHhiYiB9LAl7IDB4ODksIDB4ZDIgfSwJeyAweDhhLCAweGU2IH0sCit9OworCisvKiBDb25maWd1cmF0aW9ucworICogTk9URTogZm9yIFlVViwgYWx0ZXIgdGhlIGZvbGxvd2luZyByZWdpc3RlcnM6CisgKiAJCUNPTTEyIHw9IE9WOTY0MF9DT00xMl9ZVVZfQVZHCisgKgorICoJIGZvciBSR0IsIGFsdGVyIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzOgorICoJIAlDT003ICB8PSBPVjk2NDBfQ09NN19SR0IKKyAqCSAJQ09NMTMgfD0gT1Y5NjQwX0NPTTEzX1JHQl9BVkcKKyAqCSAJQ09NMTUgfD0gcHJvcGVyIFJHQiBjb2xvciBlbmNvZGluZyBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y5NjQwX3JlZyBvdjk2NDBfcmVnc19xcWNpZltdID0geworCXsgT1Y5NjQwX0NMS1JDLAlPVjk2NDBfQ0xLUkNfRFBMTF9FTiB8IE9WOTY0MF9DTEtSQ19ESVYoMHgwZikgfSwKKwl7IE9WOTY0MF9DT00xLAlPVjk2NDBfQ09NMV9RUUZNVCB8IE9WOTY0MF9DT00xX0hSRUZfMlNLSVAgfSwKKwl7IE9WOTY0MF9DT000LAlPVjk2NDBfQ09NNF9RUV9WUCB8IE9WOTY0MF9DT000X1JTVkQgfSwKKwl7IE9WOTY0MF9DT003LAlPVjk2NDBfQ09NN19RQ0lGIH0sCisJeyBPVjk2NDBfQ09NMTIsCU9WOTY0MF9DT00xMl9SU1ZEIH0sCisJeyBPVjk2NDBfQ09NMTMsCU9WOTY0MF9DT00xM19HQU1NQV9SQVcgfCBPVjk2NDBfQ09NMTNfTUFUUklYX0VOIH0sCisJeyBPVjk2NDBfQ09NMTUsCU9WOTY0MF9DT00xNV9PUl8xMEYwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG92OTY0MF9yZWcgb3Y5NjQwX3JlZ3NfcXF2Z2FbXSA9IHsKKwl7IE9WOTY0MF9DTEtSQywJT1Y5NjQwX0NMS1JDX0RQTExfRU4gfCBPVjk2NDBfQ0xLUkNfRElWKDB4MDcpIH0sCisJeyBPVjk2NDBfQ09NMSwJT1Y5NjQwX0NPTTFfUVFGTVQgfCBPVjk2NDBfQ09NMV9IUkVGXzJTS0lQIH0sCisJeyBPVjk2NDBfQ09NNCwJT1Y5NjQwX0NPTTRfUVFfVlAgfCBPVjk2NDBfQ09NNF9SU1ZEIH0sCisJeyBPVjk2NDBfQ09NNywJT1Y5NjQwX0NPTTdfUVZHQSB9LAorCXsgT1Y5NjQwX0NPTTEyLAlPVjk2NDBfQ09NMTJfUlNWRCB9LAorCXsgT1Y5NjQwX0NPTTEzLAlPVjk2NDBfQ09NMTNfR0FNTUFfUkFXIHwgT1Y5NjQwX0NPTTEzX01BVFJJWF9FTiB9LAorCXsgT1Y5NjQwX0NPTTE1LAlPVjk2NDBfQ09NMTVfT1JfMTBGMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk2NDBfcmVnIG92OTY0MF9yZWdzX3FjaWZbXSA9IHsKKwl7IE9WOTY0MF9DTEtSQywJT1Y5NjQwX0NMS1JDX0RQTExfRU4gfCBPVjk2NDBfQ0xLUkNfRElWKDB4MDcpIH0sCisJeyBPVjk2NDBfQ09NNCwJT1Y5NjQwX0NPTTRfUVFfVlAgfCBPVjk2NDBfQ09NNF9SU1ZEIH0sCisJeyBPVjk2NDBfQ09NNywJT1Y5NjQwX0NPTTdfUUNJRiB9LAorCXsgT1Y5NjQwX0NPTTEyLAlPVjk2NDBfQ09NMTJfUlNWRCB9LAorCXsgT1Y5NjQwX0NPTTEzLAlPVjk2NDBfQ09NMTNfR0FNTUFfUkFXIHwgT1Y5NjQwX0NPTTEzX01BVFJJWF9FTiB9LAorCXsgT1Y5NjQwX0NPTTE1LAlPVjk2NDBfQ09NMTVfT1JfMTBGMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk2NDBfcmVnIG92OTY0MF9yZWdzX3F2Z2FbXSA9IHsKKwl7IE9WOTY0MF9DTEtSQywJT1Y5NjQwX0NMS1JDX0RQTExfRU4gfCBPVjk2NDBfQ0xLUkNfRElWKDB4MDMpIH0sCisJeyBPVjk2NDBfQ09NNCwJT1Y5NjQwX0NPTTRfUVFfVlAgfCBPVjk2NDBfQ09NNF9SU1ZEIH0sCisJeyBPVjk2NDBfQ09NNywJT1Y5NjQwX0NPTTdfUVZHQSB9LAorCXsgT1Y5NjQwX0NPTTEyLAlPVjk2NDBfQ09NMTJfUlNWRCB9LAorCXsgT1Y5NjQwX0NPTTEzLAlPVjk2NDBfQ09NMTNfR0FNTUFfUkFXIHwgT1Y5NjQwX0NPTTEzX01BVFJJWF9FTiB9LAorCXsgT1Y5NjQwX0NPTTE1LAlPVjk2NDBfQ09NMTVfT1JfMTBGMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk2NDBfcmVnIG92OTY0MF9yZWdzX2NpZltdID0geworCXsgT1Y5NjQwX0NMS1JDLAlPVjk2NDBfQ0xLUkNfRFBMTF9FTiB8IE9WOTY0MF9DTEtSQ19ESVYoMHgwMykgfSwKKwl7IE9WOTY0MF9DT00zLAlPVjk2NDBfQ09NM19WUCB9LAorCXsgT1Y5NjQwX0NPTTcsCU9WOTY0MF9DT003X0NJRiB9LAorCXsgT1Y5NjQwX0NPTTEyLAlPVjk2NDBfQ09NMTJfUlNWRCB9LAorCXsgT1Y5NjQwX0NPTTEzLAlPVjk2NDBfQ09NMTNfR0FNTUFfUkFXIHwgT1Y5NjQwX0NPTTEzX01BVFJJWF9FTiB9LAorCXsgT1Y5NjQwX0NPTTE1LAlPVjk2NDBfQ09NMTVfT1JfMTBGMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk2NDBfcmVnIG92OTY0MF9yZWdzX3ZnYVtdID0geworCXsgT1Y5NjQwX0NMS1JDLAlPVjk2NDBfQ0xLUkNfRFBMTF9FTiB8IE9WOTY0MF9DTEtSQ19ESVYoMHgwMSkgfSwKKwl7IE9WOTY0MF9DT00zLAlPVjk2NDBfQ09NM19WUCB9LAorCXsgT1Y5NjQwX0NPTTcsCU9WOTY0MF9DT003X1ZHQSB9LAorCXsgT1Y5NjQwX0NPTTEyLAlPVjk2NDBfQ09NMTJfUlNWRCB9LAorCXsgT1Y5NjQwX0NPTTEzLAlPVjk2NDBfQ09NMTNfR0FNTUFfUkFXIHwgT1Y5NjQwX0NPTTEzX01BVFJJWF9FTiB9LAorCXsgT1Y5NjQwX0NPTTE1LAlPVjk2NDBfQ09NMTVfT1JfMTBGMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk2NDBfcmVnIG92OTY0MF9yZWdzX3N4Z2FbXSA9IHsKKwl7IE9WOTY0MF9DTEtSQywJT1Y5NjQwX0NMS1JDX0RQTExfRU4gfCBPVjk2NDBfQ0xLUkNfRElWKDB4MDEpIH0sCisJeyBPVjk2NDBfQ09NMywJT1Y5NjQwX0NPTTNfVlAgfSwKKwl7IE9WOTY0MF9DT003LAkwIH0sCisJeyBPVjk2NDBfQ09NMTIsCU9WOTY0MF9DT00xMl9SU1ZEIH0sCisJeyBPVjk2NDBfQ09NMTMsCU9WOTY0MF9DT00xM19HQU1NQV9SQVcgfCBPVjk2NDBfQ09NMTNfTUFUUklYX0VOIH0sCisJeyBPVjk2NDBfQ09NMTUsCU9WOTY0MF9DT00xNV9PUl8xMEYwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG92OTY0MF9yZWcgb3Y5NjQwX3JlZ3NfeXV2W10gPSB7CisJeyBPVjk2NDBfTVRYMSwJMHg1OCB9LAorCXsgT1Y5NjQwX01UWDIsCTB4NDggfSwKKwl7IE9WOTY0MF9NVFgzLAkweDEwIH0sCisJeyBPVjk2NDBfTVRYNCwJMHgyOCB9LAorCXsgT1Y5NjQwX01UWDUsCTB4NDggfSwKKwl7IE9WOTY0MF9NVFg2LAkweDcwIH0sCisJeyBPVjk2NDBfTVRYNywJMHg0MCB9LAorCXsgT1Y5NjQwX01UWDgsCTB4NDAgfSwKKwl7IE9WOTY0MF9NVFg5LAkweDQwIH0sCisJeyBPVjk2NDBfTVRYUywJMHgwZiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk2NDBfcmVnIG92OTY0MF9yZWdzX3JnYltdID0geworCXsgT1Y5NjQwX01UWDEsCTB4NzEgfSwKKwl7IE9WOTY0MF9NVFgyLAkweDNlIH0sCisJeyBPVjk2NDBfTVRYMywJMHgwYyB9LAorCXsgT1Y5NjQwX01UWDQsCTB4MzMgfSwKKwl7IE9WOTY0MF9NVFg1LAkweDcyIH0sCisJeyBPVjk2NDBfTVRYNiwJMHgwMCB9LAorCXsgT1Y5NjQwX01UWDcsCTB4MmIgfSwKKwl7IE9WOTY0MF9NVFg4LAkweDY2IH0sCisJeyBPVjk2NDBfTVRYOSwJMHhkMiB9LAorCXsgT1Y5NjQwX01UWFMsCTB4NjUgfSwKK307CisKKy8qCisgKiBUT0RPOiB0aGlzIHNlbnNvciBhbHNvIHN1cHBvcnRzIFJHQjU1NSBhbmQgUkdCNTY1IGZvcm1hdHMsIGJ1dCBzdXBwb3J0IGZvcgorICogdGhlbSBoYXMgbm90IHlldCBiZWVuIHN1ZmZpY2llbnRseSB0ZXN0ZWQgYW5kIHNvIGl0IGlzIG5vdCBpbmNsdWRlZCB3aXRoCisgKiB0aGlzIHZlcnNpb24gb2YgdGhlIGRyaXZlci4gVG8gdGVzdCBhbmQgZGVidWcgdGhlc2UgZm9ybWF0cyBhZGQgdHdvIGVudHJpZXMKKyAqIHRvIHRoZSBiZWxvdyBhcnJheSwgc2VlIG92NzIyeC5jIGZvciBhbiBleGFtcGxlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgb3Y5NjQwX2ZtdF9saXN0c1tdID0geworCXsKKwkJLm5hbWUJCT0gIlVZVlkiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9VWVZZLAorCQkuZGVwdGgJCT0gMTYsCisJCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgb3Y5NjQwX2NvbnRyb2xzW10gPSB7CisJeworCQkuaWQJCT0gVjRMMl9DSURfVkZMSVAsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lCQk9ICJGbGlwIFZlcnRpY2FsbHkiLAorCQkubWluaW11bQk9IDAsCisJCS5tYXhpbXVtCT0gMSwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZmF1bHRfdmFsdWUJPSAwLAorCX0sCisJeworCQkuaWQJCT0gVjRMMl9DSURfSEZMSVAsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lCQk9ICJGbGlwIEhvcml6b250YWxseSIsCisJCS5taW5pbXVtCT0gMCwKKwkJLm1heGltdW0JPSAxLAorCQkuc3RlcAkJPSAxLAorCQkuZGVmYXVsdF92YWx1ZQk9IDAsCisJfSwKK307CisKKy8qIHJlYWQgYSByZWdpc3RlciAqLworc3RhdGljIGludCBvdjk2NDBfcmVnX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCAqdmFsKQoreworCWludCByZXQ7CisJdTggZGF0YSA9IHJlZzsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkuZmxhZ3MJPSAwLAorCQkubGVuCT0gMSwKKwkJLmJ1Zgk9ICZkYXRhLAorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwltc2cuZmxhZ3MgPSBJMkNfTV9SRDsKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwkqdmFsID0gZGF0YTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHJlYWRpbmcgcmVnaXN0ZXIgMHglMDJ4IVxuIiwgcmVnKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiB3cml0ZSBhIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IG92OTY0MF9yZWdfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWwpCit7CisJaW50IHJldDsKKwl1OCBfdmFsOworCXVuc2lnbmVkIGNoYXIgZGF0YVsyXSA9IHsgcmVnLCB2YWwgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkuZmxhZ3MJPSAwLAorCQkubGVuCT0gMiwKKwkJLmJ1Zgk9IGRhdGEsCisJfTsKKworCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZtc2csIDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHdyaXRpbmcgcmVnaXN0ZXIgMHglMDJ4IVxuIiwgcmVnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiB3ZSBoYXZlIHRvIHJlYWQgdGhlIHJlZ2lzdGVyIGJhY2sgLi4uIG5vIGlkZWEgd2h5LCBtYXliZSBIVyBidWcgKi8KKwlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCByZWcsICZfdmFsKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJGYWlsZWQgcmVhZGluZyBiYWNrIHJlZ2lzdGVyIDB4JTAyeCFcbiIsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBSZWFkIGEgcmVnaXN0ZXIsIGFsdGVyIGl0cyBiaXRzLCB3cml0ZSBpdCBiYWNrICovCitzdGF0aWMgaW50IG92OTY0MF9yZWdfcm13KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggc2V0LCB1OCB1bnNldCkKK3sKKwl1OCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIHJlZywgJnZhbCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJbUmVhZF0tTW9kaWZ5LVdyaXRlIG9mIHJlZ2lzdGVyICUwMnggZmFpbGVkIVxuIiwgcmVnKTsKKwkJcmV0dXJuIHZhbDsKKwl9CisKKwl2YWwgfD0gc2V0OworCXZhbCAmPSB+dW5zZXQ7CisKKwlyZXQgPSBvdjk2NDBfcmVnX3dyaXRlKGNsaWVudCwgcmVnLCB2YWwpOworCWlmIChyZXQpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIlJlYWQtTW9kaWZ5LVtXcml0ZV0gb2YgcmVnaXN0ZXIgJTAyeCBmYWlsZWQhXG4iLCByZWcpOworCisJcmV0dXJuIHJldDsKK30KKworLyogU29mdCByZXNldCB0aGUgY2FtZXJhLiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdGhlIFJFU0VUIHBpbiEgKi8KK3N0YXRpYyBpbnQgb3Y5NjQwX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldDsKKworCXJldCA9IG92OTY0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk2NDBfQ09NNywgT1Y5NjQwX0NPTTdfU0NDQl9SRVNFVCk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBlbnRlcmluZyBzb2Z0IHJlc2V0IVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBTdGFydC9TdG9wIHN0cmVhbWluZyBmcm9tIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgb3Y5NjQwX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFsdGVyIGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLworc3RhdGljIGludCBvdjk2NDBfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiAwOworfQorCisvKiBSZXF1ZXN0IGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Y5NjQwX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKworCS8qCisJICogUkVWSVNJVDogdGhlIGNhbWVyYSBwcm9iYWJseSBjYW4gZG8gMTAgYml0IHRyYW5zZmVycywgYnV0IEkgZG9uJ3QKKwkgKiAgICAgICAgICBoYXZlIHRob3NlIHBpbnMgY29ubmVjdGVkIG9uIG15IGhhcmR3YXJlLgorCSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9NQVNURVIgfAorCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKKwkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFXSURUSF84OworCisJcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOworfQorCisvKiBHZXQgc3RhdHVzIG9mIGFkZGl0aW9uYWwgY2FtZXJhIGNhcGFiaWxpdGllcyAqLworc3RhdGljIGludCBvdjk2NDBfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwKKwkJCQkJc3RydWN0IG92OTY0MF9wcml2LCBzdWJkZXYpOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWN0cmwtPnZhbHVlID0gcHJpdi0+ZmxhZ192ZmxpcDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX2hmbGlwOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBzdGF0dXMgb2YgYWRkaXRpb25hbCBjYW1lcmEgY2FwYWJpbGl0aWVzICovCitzdGF0aWMgaW50IG92OTY0MF9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gc2QtPnByaXY7CisJc3RydWN0IG92OTY0MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLAorCQkJCQlzdHJ1Y3Qgb3Y5NjQwX3ByaXYsIHN1YmRldik7CisKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQlwcml2LT5mbGFnX3ZmbGlwID0gY3RybC0+dmFsdWU7CisJCWlmIChjdHJsLT52YWx1ZSkKKwkJCXJldCA9IG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCisJCQkJCQkJT1Y5NjQwX01WRlBfViwgMCk7CisJCWVsc2UKKwkJCXJldCA9IG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCisJCQkJCQkJMCwgT1Y5NjQwX01WRlBfVik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSEZMSVA6CisJCXByaXYtPmZsYWdfaGZsaXAgPSBjdHJsLT52YWx1ZTsKKwkJaWYgKGN0cmwtPnZhbHVlKQorCQkJcmV0ID0gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwKKwkJCQkJCQlPVjk2NDBfTVZGUF9ILCAwKTsKKwkJZWxzZQorCQkJcmV0ID0gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwKKwkJCQkJCQkwLCBPVjk2NDBfTVZGUF9IKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogR2V0IGNoaXAgaWRlbnRpZmljYXRpb24gKi8KK3N0YXRpYyBpbnQgb3Y5NjQwX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICppZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gc2QtPnByaXY7CisJc3RydWN0IG92OTY0MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLAorCQkJCQlzdHJ1Y3Qgb3Y5NjQwX3ByaXYsIHN1YmRldik7CisKKwlpZC0+aWRlbnQJPSBwcml2LT5tb2RlbDsKKwlpZC0+cmV2aXNpb24JPSBwcml2LT5yZXZpc2lvbjsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCBvdjk2NDBfZ2V0X3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCWludCByZXQ7CisJdTggdmFsOworCisJaWYgKHJlZy0+cmVnICYgfjB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnLT5zaXplID0gMTsKKworCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIHJlZy0+cmVnLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmVnLT52YWwgPSAoX191NjQpdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y5NjQwX3NldF9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBzZC0+cHJpdjsKKworCWlmIChyZWctPnJlZyAmIH4weGZmIHx8IHJlZy0+dmFsICYgfjB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG92OTY0MF9yZWdfd3JpdGUoY2xpZW50LCByZWctPnJlZywgcmVnLT52YWwpOworfQorI2VuZGlmCisKKy8qIHNlbGVjdCBuZWFyZXN0IGhpZ2hlciByZXNvbHV0aW9uIGZvciBjYXB0dXJlICovCitzdGF0aWMgdm9pZCBvdjk2NDBfcmVzX3JvdW5kdXAodTMyICp3aWR0aCwgdTMyICpoZWlnaHQpCit7CisJaW50IGk7CisJZW51bSB7IFFRQ0lGLCBRUVZHQSwgUUNJRiwgUVZHQSwgQ0lGLCBWR0EsIFNYR0EgfTsKKwlpbnQgcmVzX3hbXSA9IHsgODgsIDE2MCwgMTc2LCAzMjAsIDM1MiwgNjQwLCAxMjgwIH07CisJaW50IHJlc195W10gPSB7IDcyLCAxMjAsIDE0NCwgMjQwLCAyODgsIDQ4MCwgOTYwIH07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXNfeCk7IGkrKykgeworCQlpZiAocmVzX3hbaV0gPj0gKndpZHRoICYmIHJlc195W2ldID49ICpoZWlnaHQpIHsKKwkJCSp3aWR0aCA9IHJlc194W2ldOworCQkJKmhlaWdodCA9IHJlc195W2ldOworCQkJcmV0dXJuOworCQl9CisJfQorCisJKndpZHRoID0gcmVzX3hbU1hHQV07CisJKmhlaWdodCA9IHJlc195W1NYR0FdOworfQorCisvKiBQcmVwYXJlIG5lY2Vzc2FyeSByZWdpc3RlciBjaGFuZ2VzIGRlcGVuZGluZyBvbiBjb2xvciBlbmNvZGluZyAqLworc3RhdGljIHZvaWQgb3Y5NjQwX2FsdGVyX3JlZ3ModTMyIHBpeGZtdCwgc3RydWN0IG92OTY0MF9yZWdfYWx0ICphbHQpCit7CisJc3dpdGNoIChwaXhmbXQpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorCQlhbHQtPmNvbTEyCT0gT1Y5NjQwX0NPTTEyX1lVVl9BVkc7CisJCWFsdC0+Y29tMTMJPSBPVjk2NDBfQ09NMTNfWV9ERUxBWV9FTiB8CisJCQkJCU9WOTY0MF9DT00xM19ZVVZfRExZKDB4MDEpOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTU6CisJCWFsdC0+Y29tNwk9IE9WOTY0MF9DT003X1JHQjsKKwkJYWx0LT5jb20xMwk9IE9WOTY0MF9DT00xM19SR0JfQVZHOworCQlhbHQtPmNvbTE1CT0gT1Y5NjQwX0NPTTE1X1JHQl81NTU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkJYWx0LT5jb203CT0gT1Y5NjQwX0NPTTdfUkdCOworCQlhbHQtPmNvbTEzCT0gT1Y5NjQwX0NPTTEzX1JHQl9BVkc7CisJCWFsdC0+Y29tMTUJPSBPVjk2NDBfQ09NMTVfUkdCXzU2NTsKKwkJYnJlYWs7CisJfTsKK30KKworLyogU2V0dXAgcmVnaXN0ZXJzIGFjY29yZGluZyB0byByZXNvbHV0aW9uIGFuZCBjb2xvciBlbmNvZGluZyAqLworc3RhdGljIGludCBvdjk2NDBfd3JpdGVfcmVncyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQl1MzIgd2lkdGgsIHUzMiBwaXhmbXQsIHN0cnVjdCBvdjk2NDBfcmVnX2FsdCAqYWx0cykKK3sKKwljb25zdCBzdHJ1Y3Qgb3Y5NjQwX3JlZwkqb3Y5NjQwX3JlZ3MsICptYXRyaXhfcmVnczsKKwlpbnQJCQlvdjk2NDBfcmVnc19sZW4sIG1hdHJpeF9yZWdzX2xlbjsKKwlpbnQJCQlpLCByZXQ7CisJdTgJCQl2YWw7CisKKwkvKiBzZWxlY3QgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBmb3IgZ2l2ZW4gcmVzb2x1dGlvbiAqLworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIFdfUVFDSUY6CisJCW92OTY0MF9yZWdzCT0gb3Y5NjQwX3JlZ3NfcXFjaWY7CisJCW92OTY0MF9yZWdzX2xlbgk9IEFSUkFZX1NJWkUob3Y5NjQwX3JlZ3NfcXFjaWYpOworCQlicmVhazsKKwljYXNlIFdfUVFWR0E6CisJCW92OTY0MF9yZWdzCT0gb3Y5NjQwX3JlZ3NfcXF2Z2E7CisJCW92OTY0MF9yZWdzX2xlbgk9IEFSUkFZX1NJWkUob3Y5NjQwX3JlZ3NfcXF2Z2EpOworCQlicmVhazsKKwljYXNlIFdfUUNJRjoKKwkJb3Y5NjQwX3JlZ3MJPSBvdjk2NDBfcmVnc19xY2lmOworCQlvdjk2NDBfcmVnc19sZW4JPSBBUlJBWV9TSVpFKG92OTY0MF9yZWdzX3FjaWYpOworCQlicmVhazsKKwljYXNlIFdfUVZHQToKKwkJb3Y5NjQwX3JlZ3MJPSBvdjk2NDBfcmVnc19xdmdhOworCQlvdjk2NDBfcmVnc19sZW4JPSBBUlJBWV9TSVpFKG92OTY0MF9yZWdzX3F2Z2EpOworCQlicmVhazsKKwljYXNlIFdfQ0lGOgorCQlvdjk2NDBfcmVncwk9IG92OTY0MF9yZWdzX2NpZjsKKwkJb3Y5NjQwX3JlZ3NfbGVuCT0gQVJSQVlfU0laRShvdjk2NDBfcmVnc19jaWYpOworCQlicmVhazsKKwljYXNlIFdfVkdBOgorCQlvdjk2NDBfcmVncwk9IG92OTY0MF9yZWdzX3ZnYTsKKwkJb3Y5NjQwX3JlZ3NfbGVuCT0gQVJSQVlfU0laRShvdjk2NDBfcmVnc192Z2EpOworCQlicmVhazsKKwljYXNlIFdfU1hHQToKKwkJb3Y5NjQwX3JlZ3MJPSBvdjk2NDBfcmVnc19zeGdhOworCQlvdjk2NDBfcmVnc19sZW4JPSBBUlJBWV9TSVpFKG92OTY0MF9yZWdzX3N4Z2EpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBzZWxlY3QgcmVzb2x1dGlvbiFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzZWxlY3QgY29sb3IgbWF0cml4IGNvbmZpZ3VyYXRpb24gZm9yIGdpdmVuIGNvbG9yIGVuY29kaW5nICovCisJaWYgKHBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfVVlWWSkgeworCQltYXRyaXhfcmVncwk9IG92OTY0MF9yZWdzX3l1djsKKwkJbWF0cml4X3JlZ3NfbGVuCT0gQVJSQVlfU0laRShvdjk2NDBfcmVnc195dXYpOworCX0gZWxzZSB7CisJCW1hdHJpeF9yZWdzCT0gb3Y5NjQwX3JlZ3NfcmdiOworCQltYXRyaXhfcmVnc19sZW4JPSBBUlJBWV9TSVpFKG92OTY0MF9yZWdzX3JnYik7CisJfQorCisJLyogd3JpdGUgcmVnaXN0ZXIgc2V0dGluZ3MgaW50byB0aGUgbW9kdWxlICovCisJZm9yIChpID0gMDsgaSA8IG92OTY0MF9yZWdzX2xlbjsgaSsrKSB7CisJCXZhbCA9IG92OTY0MF9yZWdzW2ldLnZhbDsKKworCQlzd2l0Y2ggKG92OTY0MF9yZWdzW2ldLnJlZykgeworCQljYXNlIE9WOTY0MF9DT003OgorCQkJdmFsIHw9IGFsdHMtPmNvbTc7CisJCQlicmVhazsKKwkJY2FzZSBPVjk2NDBfQ09NMTI6CisJCQl2YWwgfD0gYWx0cy0+Y29tMTI7CisJCQlicmVhazsKKwkJY2FzZSBPVjk2NDBfQ09NMTM6CisJCQl2YWwgfD0gYWx0cy0+Y29tMTM7CisJCQlicmVhazsKKwkJY2FzZSBPVjk2NDBfQ09NMTU6CisJCQl2YWwgfD0gYWx0cy0+Y29tMTU7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IG92OTY0MF9yZWdfd3JpdGUoY2xpZW50LCBvdjk2NDBfcmVnc1tpXS5yZWcsIHZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHdyaXRlIGNvbG9yIG1hdHJpeCBjb25maWd1cmF0aW9uIGludG8gdGhlIG1vZHVsZSAqLworCWZvciAoaSA9IDA7IGkgPCBtYXRyaXhfcmVnc19sZW47IGkrKykgeworCQlyZXQgPSBvdjk2NDBfcmVnX3dyaXRlKGNsaWVudCwgbWF0cml4X3JlZ3NbaV0ucmVnLAorCQkJCQkJbWF0cml4X3JlZ3NbaV0udmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHByb2dyYW0gZGVmYXVsdCByZWdpc3RlciB2YWx1ZXMgKi8KK3N0YXRpYyBpbnQgb3Y5NjQwX3Byb2dfZGZsdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBpLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvdjk2NDBfcmVnc19kZmx0KTsgaSsrKSB7CisJCXJldCA9IG92OTY0MF9yZWdfd3JpdGUoY2xpZW50LCBvdjk2NDBfcmVnc19kZmx0W2ldLnJlZywKKwkJCQkJCW92OTY0MF9yZWdzX2RmbHRbaV0udmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCBmb3IgdGhlIGNoYW5nZXMgdG8gYWN0dWFsbHkgaGFwcGVuLCAxNDBtcyBhcmUgbm90IGVub3VnaCB5ZXQgKi8KKwltZGVsYXkoMTUwKTsKKworCXJldHVybiAwOworfQorCisvKiBzZXQgdGhlIGZvcm1hdCB3ZSB3aWxsIGNhcHR1cmUgaW4gKi8KK3N0YXRpYyBpbnQgb3Y5NjQwX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gc2QtPnByaXY7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJc3RydWN0IG92OTY0MF9yZWdfYWx0IGFsdHMgPSB7MH07CisJaW50IHJldDsKKworCW92OTY0MF9yZXNfcm91bmR1cCgmcGl4LT53aWR0aCwgJnBpeC0+aGVpZ2h0KTsKKwlvdjk2NDBfYWx0ZXJfcmVncyhwaXgtPnBpeGVsZm9ybWF0LCAmYWx0cyk7CisKKwlvdjk2NDBfcmVzZXQoY2xpZW50KTsKKworCXJldCA9IG92OTY0MF9wcm9nX2RmbHQoY2xpZW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG92OTY0MF93cml0ZV9yZWdzKGNsaWVudCwgcGl4LT53aWR0aCwgcGl4LT5waXhlbGZvcm1hdCwgJmFsdHMpOworfQorCitzdGF0aWMgaW50IG92OTY0MF90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKworCW92OTY0MF9yZXNfcm91bmR1cCgmcGl4LT53aWR0aCwgJnBpeC0+aGVpZ2h0KTsKKwlwaXgtPmZpZWxkICA9IFY0TDJfRklFTERfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92OTY0MF9nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKK3sKKwlhLT5jLmxlZnQJPSAwOworCWEtPmMudG9wCT0gMDsKKwlhLT5jLndpZHRoCT0gV19TWEdBOworCWEtPmMuaGVpZ2h0CT0gSF9TWEdBOworCWEtPnR5cGUJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y5NjQwX2Nyb3BjYXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqYSkKK3sKKwlhLT5ib3VuZHMubGVmdAkJCT0gMDsKKwlhLT5ib3VuZHMudG9wCQkJPSAwOworCWEtPmJvdW5kcy53aWR0aAkJCT0gV19TWEdBOworCWEtPmJvdW5kcy5oZWlnaHQJCT0gSF9TWEdBOworCWEtPmRlZnJlY3QJCQk9IGEtPmJvdW5kczsKKwlhLT50eXBlCQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvcgk9IDE7CisJYS0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IJPSAxOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IG92OTY0MF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4CQlwaWQsIHZlciwgbWlkaCwgbWlkbDsKKwljb25zdCBjaGFyCSpkZXZuYW1lOworCWludAkJcmV0ID0gMDsKKworCS8qCisJICogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KKwkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgorCSAqLworCWlmICghaWNkLT5kZXYucGFyZW50IHx8CisJICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGFyZW50IG1pc3Npbmcgb3IgaW52YWxpZCFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlpY2QtPmZvcm1hdHMJCT0gb3Y5NjQwX2ZtdF9saXN0czsKKwlpY2QtPm51bV9mb3JtYXRzCT0gQVJSQVlfU0laRShvdjk2NDBfZm10X2xpc3RzKTsKKworCS8qCisJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECisJICovCisKKwlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCBPVjk2NDBfUElELCAmcGlkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIE9WOTY0MF9WRVIsICZ2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gb3Y5NjQwX3JlZ19yZWFkKGNsaWVudCwgT1Y5NjQwX01JREgsICZtaWRoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIE9WOTY0MF9NSURMLCAmbWlkbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlzd2l0Y2ggKFZFUlNJT04ocGlkLCB2ZXIpKSB7CisJY2FzZSBPVjk2NDBfVjI6CisJCWRldm5hbWUJCT0gIm92OTY0MCI7CisJCXByaXYtPm1vZGVsCT0gVjRMMl9JREVOVF9PVjk2NDA7CisJCXByaXYtPnJldmlzaW9uCT0gMjsKKwljYXNlIE9WOTY0MF9WMzoKKwkJZGV2bmFtZQkJPSAib3Y5NjQwIjsKKwkJcHJpdi0+bW9kZWwJPSBWNEwyX0lERU5UX09WOTY0MDsKKwkJcHJpdi0+cmV2aXNpb24JPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlByb2R1Y3QgSUQgZXJyb3IgJXg6JXhcbiIsIHBpZCwgdmVyKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgUHJvZHVjdCBJRCAlMHg6JTB4IE1hbnVmYWN0dXJlciBJRCAleDoleFxuIiwKKwkJIGRldm5hbWUsIHBpZCwgdmVyLCBtaWRoLCBtaWRsKTsKKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgb3Y5NjQwX29wcyA9IHsKKwkuc2V0X2J1c19wYXJhbQkJPSBvdjk2NDBfc2V0X2J1c19wYXJhbSwKKwkucXVlcnlfYnVzX3BhcmFtCT0gb3Y5NjQwX3F1ZXJ5X2J1c19wYXJhbSwKKwkuY29udHJvbHMJCT0gb3Y5NjQwX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShvdjk2NDBfY29udHJvbHMpLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjk2NDBfY29yZV9vcHMgPSB7CisJLmdfY3RybAkJCT0gb3Y5NjQwX2dfY3RybCwKKwkuc19jdHJsCQkJPSBvdjk2NDBfc19jdHJsLAorCS5nX2NoaXBfaWRlbnQJCT0gb3Y5NjQwX2dfY2hpcF9pZGVudCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdfcmVnaXN0ZXIJCT0gb3Y5NjQwX2dldF9yZWdpc3RlciwKKwkuc19yZWdpc3RlcgkJPSBvdjk2NDBfc2V0X3JlZ2lzdGVyLAorI2VuZGlmCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92OTY0MF92aWRlb19vcHMgPSB7CisJLnNfc3RyZWFtCQk9IG92OTY0MF9zX3N0cmVhbSwKKwkuc19mbXQJCQk9IG92OTY0MF9zX2ZtdCwKKwkudHJ5X2ZtdAkJPSBvdjk2NDBfdHJ5X2ZtdCwKKwkuY3JvcGNhcAkJPSBvdjk2NDBfY3JvcGNhcCwKKwkuZ19jcm9wCQkJPSBvdjk2NDBfZ19jcm9wLAorCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBvdjk2NDBfc3ViZGV2X29wcyA9IHsKKwkuY29yZQk9ICZvdjk2NDBfY29yZV9vcHMsCisJLnZpZGVvCT0gJm92OTY0MF92aWRlb19vcHMsCit9OworCisvKgorICogaTJjX2RyaXZlciBmdW5jdGlvbgorICovCitzdGF0aWMgaW50IG92OTY0MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKK3sKKwlzdHJ1Y3Qgb3Y5NjQwX3ByaXYgKnByaXY7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QJPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlpbnQgcmV0OworCisJaWYgKCFpY2QpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKwlpZiAoIWljbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1pc3NpbmcgcGxhdGZvcm1fZGF0YSBmb3IgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvdjk2NDBfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwcml2YXRlIGRhdGEhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmb3Y5NjQwX3N1YmRldl9vcHMpOworCisJaWNkLT5vcHMJPSAmb3Y5NjQwX29wczsKKworCXJldCA9IG92OTY0MF92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisKKwlpZiAocmV0KSB7CisJCWljZC0+b3BzID0gTlVMTDsKKwkJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJCWtmcmVlKHByaXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y5NjQwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjk2NDBfaWRbXSA9IHsKKwl7ICJvdjk2NDAiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG92OTY0MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBvdjk2NDBfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJvdjk2NDAiLAorCX0sCisJLnByb2JlICAgID0gb3Y5NjQwX3Byb2JlLAorCS5yZW1vdmUgICA9IG92OTY0MF9yZW1vdmUsCisJLmlkX3RhYmxlID0gb3Y5NjQwX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb3Y5NjQwX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZvdjk2NDBfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvdjk2NDBfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmb3Y5NjQwX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvdjk2NDBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQob3Y5NjQwX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb0MgQ2FtZXJhIGRyaXZlciBmb3IgT21uaVZpc2lvbiBPVjk2eHgiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE1MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIE9tbmlWaXNpb24gT1Y5Nnh4IENhbWVyYSBIZWFkZXIgRmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZglfX0RSSVZFUlNfTUVESUFfVklERU9fT1Y5NjQwX0hfXworI2RlZmluZQlfX0RSSVZFUlNfTUVESUFfVklERU9fT1Y5NjQwX0hfXworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZQlPVjk2NDBfR0FJTgkweDAwCisjZGVmaW5lCU9WOTY0MF9CTFVFCTB4MDEKKyNkZWZpbmUJT1Y5NjQwX1JFRAkweDAyCisjZGVmaW5lCU9WOTY0MF9WRkVSCTB4MDMKKyNkZWZpbmUJT1Y5NjQwX0NPTTEJMHgwNAorI2RlZmluZQlPVjk2NDBfQkFWRQkweDA1CisjZGVmaW5lCU9WOTY0MF9HRUFWRQkweDA2CisjZGVmaW5lCU9WOTY0MF9SU0lECTB4MDcKKyNkZWZpbmUJT1Y5NjQwX1JBVkUJMHgwOAorI2RlZmluZQlPVjk2NDBfQ09NMgkweDA5CisjZGVmaW5lCU9WOTY0MF9QSUQJMHgwYQorI2RlZmluZQlPVjk2NDBfVkVSCTB4MGIKKyNkZWZpbmUJT1Y5NjQwX0NPTTMJMHgwYworI2RlZmluZQlPVjk2NDBfQ09NNAkweDBkCisjZGVmaW5lCU9WOTY0MF9DT001CTB4MGUKKyNkZWZpbmUJT1Y5NjQwX0NPTTYJMHgwZgorI2RlZmluZQlPVjk2NDBfQUVDSAkweDEwCisjZGVmaW5lCU9WOTY0MF9DTEtSQwkweDExCisjZGVmaW5lCU9WOTY0MF9DT003CTB4MTIKKyNkZWZpbmUJT1Y5NjQwX0NPTTgJMHgxMworI2RlZmluZQlPVjk2NDBfQ09NOQkweDE0CisjZGVmaW5lCU9WOTY0MF9DT00xMAkweDE1CisvKiAweDE2IC0gUkVTRVJWRUQgKi8KKyNkZWZpbmUJT1Y5NjQwX0hTVEFSVAkweDE3CisjZGVmaW5lCU9WOTY0MF9IU1RPUAkweDE4CisjZGVmaW5lCU9WOTY0MF9WU1RBUlQJMHgxOQorI2RlZmluZQlPVjk2NDBfVlNUT1AJMHgxYQorI2RlZmluZQlPVjk2NDBfUFNIRlQJMHgxYgorI2RlZmluZQlPVjk2NDBfTUlESAkweDFjCisjZGVmaW5lCU9WOTY0MF9NSURMCTB4MWQKKyNkZWZpbmUJT1Y5NjQwX01WRlAJMHgxZQorI2RlZmluZQlPVjk2NDBfTEFFQwkweDFmCisjZGVmaW5lCU9WOTY0MF9CT1MJMHgyMAorI2RlZmluZQlPVjk2NDBfR0JPUwkweDIxCisjZGVmaW5lCU9WOTY0MF9HUk9TCTB4MjIKKyNkZWZpbmUJT1Y5NjQwX1JPUwkweDIzCisjZGVmaW5lCU9WOTY0MF9BRVcJMHgyNAorI2RlZmluZQlPVjk2NDBfQUVCCTB4MjUKKyNkZWZpbmUJT1Y5NjQwX1ZQVAkweDI2CisjZGVmaW5lCU9WOTY0MF9CQklBUwkweDI3CisjZGVmaW5lCU9WOTY0MF9HQkJJQVMJMHgyOAorLyogMHgyOSAtIFJFU0VSVkVEICovCisjZGVmaW5lCU9WOTY0MF9FWEhDSAkweDJhCisjZGVmaW5lCU9WOTY0MF9FWEhDTAkweDJiCisjZGVmaW5lCU9WOTY0MF9SQklBUwkweDJjCisjZGVmaW5lCU9WOTY0MF9BRFZGTAkweDJkCisjZGVmaW5lCU9WOTY0MF9BRFZGSAkweDJlCisjZGVmaW5lCU9WOTY0MF9ZQVZFCTB4MmYKKyNkZWZpbmUJT1Y5NjQwX0hTWVNUCTB4MzAKKyNkZWZpbmUJT1Y5NjQwX0hTWUVOCTB4MzEKKyNkZWZpbmUJT1Y5NjQwX0hSRUYJMHgzMgorI2RlZmluZQlPVjk2NDBfQ0hMRgkweDMzCisjZGVmaW5lCU9WOTY0MF9BUkJMTQkweDM0CisvKiAweDM1Li4weDM2IC0gUkVTRVJWRUQgKi8KKyNkZWZpbmUJT1Y5NjQwX0FEQwkweDM3CisjZGVmaW5lCU9WOTY0MF9BQ09NCTB4MzgKKyNkZWZpbmUJT1Y5NjQwX09GT04JMHgzOQorI2RlZmluZQlPVjk2NDBfVFNMQgkweDNhCisjZGVmaW5lCU9WOTY0MF9DT00xMQkweDNiCisjZGVmaW5lCU9WOTY0MF9DT00xMgkweDNjCisjZGVmaW5lCU9WOTY0MF9DT00xMwkweDNkCisjZGVmaW5lCU9WOTY0MF9DT00xNAkweDNlCisjZGVmaW5lCU9WOTY0MF9FREdFCTB4M2YKKyNkZWZpbmUJT1Y5NjQwX0NPTTE1CTB4NDAKKyNkZWZpbmUJT1Y5NjQwX0NPTTE2CTB4NDEKKyNkZWZpbmUJT1Y5NjQwX0NPTTE3CTB4NDIKKy8qIDB4NDMuLjB4NGUgLSBSRVNFUlZFRCAqLworI2RlZmluZQlPVjk2NDBfTVRYMQkweDRmCisjZGVmaW5lCU9WOTY0MF9NVFgyCTB4NTAKKyNkZWZpbmUJT1Y5NjQwX01UWDMJMHg1MQorI2RlZmluZQlPVjk2NDBfTVRYNAkweDUyCisjZGVmaW5lCU9WOTY0MF9NVFg1CTB4NTMKKyNkZWZpbmUJT1Y5NjQwX01UWDYJMHg1NAorI2RlZmluZQlPVjk2NDBfTVRYNwkweDU1CisjZGVmaW5lCU9WOTY0MF9NVFg4CTB4NTYKKyNkZWZpbmUJT1Y5NjQwX01UWDkJMHg1NworI2RlZmluZQlPVjk2NDBfTVRYUwkweDU4CisvKiAweDU5Li4weDYxIC0gUkVTRVJWRUQgKi8KKyNkZWZpbmUJT1Y5NjQwX0xDQzEJMHg2MgorI2RlZmluZQlPVjk2NDBfTENDMgkweDYzCisjZGVmaW5lCU9WOTY0MF9MQ0MzCTB4NjQKKyNkZWZpbmUJT1Y5NjQwX0xDQzQJMHg2NQorI2RlZmluZQlPVjk2NDBfTENDNQkweDY2CisjZGVmaW5lCU9WOTY0MF9NQU5VCTB4NjcKKyNkZWZpbmUJT1Y5NjQwX01BTlYJMHg2OAorI2RlZmluZQlPVjk2NDBfSFYJMHg2OQorI2RlZmluZQlPVjk2NDBfTUJECTB4NmEKKyNkZWZpbmUJT1Y5NjQwX0RCTFYJMHg2YgorI2RlZmluZQlPVjk2NDBfR1NQCTB4NmMJLyogLi4uIHRpbGwgMHg3YiAqLworI2RlZmluZQlPVjk2NDBfR1NUCTB4N2MJLyogLi4uIHRpbGwgMHg4YSAqLworCisjZGVmaW5lCU9WOTY0MF9DTEtSQ19EUExMX0VOCTB4ODAKKyNkZWZpbmUJT1Y5NjQwX0NMS1JDX0RJUkVDVAkweDQwCisjZGVmaW5lCU9WOTY0MF9DTEtSQ19ESVYoeCkJKCh4KSAmIDB4M2YpCisKKyNkZWZpbmUJT1Y5NjQwX1BTSEZUX1ZBTCh4KQkoKHgpICYgMHhmZikKKworI2RlZmluZQlPVjk2NDBfQUNPTV8yWF9BTkFMT0cJMHg4MAorI2RlZmluZQlPVjk2NDBfQUNPTV9SU1ZECTB4MTIKKworI2RlZmluZQlPVjk2NDBfTVZGUF9WCQkweDEwCisjZGVmaW5lCU9WOTY0MF9NVkZQX0gJCTB4MjAKKworI2RlZmluZQlPVjk2NDBfQ09NMV9IUkVGX05PU0tJUAkweDAwCisjZGVmaW5lCU9WOTY0MF9DT00xX0hSRUZfMlNLSVAJMHgwNAorI2RlZmluZQlPVjk2NDBfQ09NMV9IUkVGXzNTS0lQCTB4MDgKKyNkZWZpbmUJT1Y5NjQwX0NPTTFfUVFGTVQJMHgyMAorCisjZGVmaW5lCU9WOTY0MF9DT00yX1NTTQkJMHgxMAorCisjZGVmaW5lCU9WOTY0MF9DT00zX1ZQCQkweDA0CisKKyNkZWZpbmUJT1Y5NjQwX0NPTTRfUVFfVlAJMHg4MAorI2RlZmluZQlPVjk2NDBfQ09NNF9SU1ZECTB4NDAKKworI2RlZmluZQlPVjk2NDBfQ09NNV9TWVNDTEsJMHg4MAorI2RlZmluZQlPVjk2NDBfQ09NNV9MT05HRVhQCTB4MDEKKworI2RlZmluZQlPVjk2NDBfQ09NNl9PUFRfQkxDCTB4NDAKKyNkZWZpbmUJT1Y5NjQwX0NPTTZfQURCTENfQklBUwkweDA4CisjZGVmaW5lCU9WOTY0MF9DT002X0ZNVF9SU1QJMHg4MgorI2RlZmluZQlPVjk2NDBfQ09NNl9BREJMQ19PUFRFTgkweDAxCisKKyNkZWZpbmUJT1Y5NjQwX0NPTTdfUkFXX1JHQgkweDAxCisjZGVmaW5lCU9WOTY0MF9DT003X1JHQgkJMHgwNAorI2RlZmluZQlPVjk2NDBfQ09NN19RQ0lGCTB4MDgKKyNkZWZpbmUJT1Y5NjQwX0NPTTdfUVZHQQkweDEwCisjZGVmaW5lCU9WOTY0MF9DT003X0NJRgkJMHgyMAorI2RlZmluZQlPVjk2NDBfQ09NN19WR0EJCTB4NDAKKyNkZWZpbmUJT1Y5NjQwX0NPTTdfU0NDQl9SRVNFVAkweDgwCisKKyNkZWZpbmUJT1Y5NjQwX1RTTEJfWVZZVV9ZVVlWCTB4MDQKKyNkZWZpbmUJT1Y5NjQwX1RTTEJfWVVZVl9VWVZZCTB4MDgKKworI2RlZmluZQlPVjk2NDBfQ09NMTJfWVVWX0FWRwkweDA0CisjZGVmaW5lCU9WOTY0MF9DT00xMl9SU1ZECTB4NDAKKworI2RlZmluZQlPVjk2NDBfQ09NMTNfR0FNTUFfTk9ORQkweDAwCisjZGVmaW5lCU9WOTY0MF9DT00xM19HQU1NQV9ZCTB4NDAKKyNkZWZpbmUJT1Y5NjQwX0NPTTEzX0dBTU1BX1JBVwkweDgwCisjZGVmaW5lCU9WOTY0MF9DT00xM19SR0JfQVZHCTB4MjAKKyNkZWZpbmUJT1Y5NjQwX0NPTTEzX01BVFJJWF9FTgkweDEwCisjZGVmaW5lCU9WOTY0MF9DT00xM19ZX0RFTEFZX0VOCTB4MDgKKyNkZWZpbmUJT1Y5NjQwX0NPTTEzX1lVVl9ETFkoeCkJKCh4KSAmIDB4MDcpCisKKyNkZWZpbmUJT1Y5NjQwX0NPTTE1X09SXzAwRkYJMHgwMAorI2RlZmluZQlPVjk2NDBfQ09NMTVfT1JfMDFGRQkweDQwCisjZGVmaW5lCU9WOTY0MF9DT00xNV9PUl8xMEYwCTB4YzAKKyNkZWZpbmUJT1Y5NjQwX0NPTTE1X1JHQl9OT1JNCTB4MDAKKyNkZWZpbmUJT1Y5NjQwX0NPTTE1X1JHQl81NjUJMHgxMAorI2RlZmluZQlPVjk2NDBfQ09NMTVfUkdCXzU1NQkweDMwCisKKyNkZWZpbmUJT1Y5NjQwX0NPTTE2X1JCX0FWRwkweDAxCisKKy8qIElEcyAqLworI2RlZmluZQlPVjk2NDBfVjIJCTB4OTY0OAorI2RlZmluZQlPVjk2NDBfVjMJCTB4OTY0OQorI2RlZmluZQlWRVJTSU9OKHBpZCwgdmVyKQkoKChwaWQpIDw8IDgpIHwgKCh2ZXIpICYgMHhGRikpCisKKy8qIHN1cHBvcnRlZCByZXNvbHV0aW9ucyAqLworZW51bSB7CisJV19RUUNJRgk9IDg4LAorCVdfUVFWR0EJPSAxNjAsCisJV19RQ0lGCT0gMTc2LAorCVdfUVZHQQk9IDMyMCwKKwlXX0NJRgk9IDM1MiwKKwlXX1ZHQQk9IDY0MCwKKwlXX1NYR0EJPSAxMjgwCit9OworI2RlZmluZQlIX1NYR0EJOTYwCisKKy8qIE1pc2MuIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBvdjk2NDBfcmVnX2FsdCB7CisJdTgJY29tNzsKKwl1OAljb20xMjsKKwl1OAljb20xMzsKKwl1OAljb20xNTsKK307CisKK3N0cnVjdCBvdjk2NDBfcmVnIHsKKwl1OAlyZWc7CisJdTgJdmFsOworfTsKKworc3RydWN0IG92OTY0MF9wcml2IHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKKworCWludAkJCQltb2RlbDsKKwlpbnQJCQkJcmV2aXNpb247CisKKwlib29sCQkJCWZsYWdfdmZsaXA7CisJYm9vbAkJCQlmbGFnX2hmbGlwOworfTsKKworI2VuZGlmCS8qIF9fRFJJVkVSU19NRURJQV9WSURFT19PVjk2NDBfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwppbmRleCBhMWFkMzhmLi43M2VjOTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKQEAgLTE0LDggKzE0LDEwIEBACiAgKgl1bmxlc3MgdGhlIHVzZXJzcGFjZSBkcml2ZXIgYWxzbyBkb2Vzbid0IHdvcmsgZm9yIHlvdS4uLgogICoKICAqICAgICAgQ2hhbmdlczoKLSAqICAgICAgMDgvMDcvMjAwMyAgICAgICAgRGFuaWVsZSBCZWxsdWNjaSA8YmVsbHVjZGFAdGlzY2FsaS5pdD4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgLSBwbXNfY2FwdHVyZTogcmVwb3J0IGJhY2sgLUVGQVVMVAorICoJMjUtMTEtMjAwOSAJSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAJCQktIGNvbnZlcnRlZCB0byB2ZXJzaW9uIDIgb2YgdGhlIFY0TCBBUEkuCisgKiAgICAgIDA4LzA3LzIwMDMgICAgICBEYW5pZWxlIEJlbGx1Y2NpIDxiZWxsdWNkYUB0aXNjYWxpLml0PgorICogICAgICAgICAgICAgICAgICAgICAgLSBwbXNfY2FwdHVyZTogcmVwb3J0IGJhY2sgLUVGQVVMVAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI3LDE3NSArMjksMTgzIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogCiAjZGVmaW5lIE1PVE9ST0xBCTEKLSNkZWZpbmUgUEhJTElQUzIJMgorI2RlZmluZSBQSElMSVBTMgkyICAgICAgICAgICAgICAgLyogU0FBNzE5MSAqLwogI2RlZmluZSBQSElMSVBTMQkzCiAjZGVmaW5lIE1WVk1FTU9SWVdJRFRICTB4NDAJCS8qIDUxMiBieXRlcyAqLwogCi1zdHJ1Y3QgcG1zX2RldmljZQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgdjsKLQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0dXJlOwotCWludCBoZWlnaHQ7Ci0JaW50IHdpZHRoOwotCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwotCXN0cnVjdCBtdXRleCBsb2NrOwotfTsKLQotc3RydWN0IGkyY19pbmZvCi17CitzdHJ1Y3QgaTJjX2luZm8gewogCXU4IHNsYXZlOwogCXU4IHN1YjsKIAl1OCBkYXRhOwogCXU4IGhpdHM7CiB9OwogCi1zdGF0aWMgaW50IGkyY19jb3VudDsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2luZm8gaTJjaW5mb1s2NF07CitzdHJ1Y3QgcG1zIHsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OworCWludCBoZWlnaHQ7CisJaW50IHdpZHRoOworCWludCBkZXB0aDsKKwlpbnQgaW5wdXQ7CisJczMyIGJyaWdodG5lc3MsIHNhdHVyYXRpb24sIGh1ZSwgY29udHJhc3Q7CisJdW5zaWduZWQgbG9uZyBpbl91c2U7CisJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IGkyY19jb3VudDsKKwlzdHJ1Y3QgaTJjX2luZm8gaTJjaW5mb1s2NF07CiAKLXN0YXRpYyBpbnQgZGVjb2RlciAJCT0gUEhJTElQUzI7Ci1zdGF0aWMgaW50IHN0YW5kYXJkOwkvKiAwIC0gYXV0byAxIC0gbnRzYyAyIC0gcGFsIDMgLSBzZWNhbSAqLworCWludCBkZWNvZGVyOworCWludCBzdGFuZGFyZDsJLyogMCAtIGF1dG8gMSAtIG50c2MgMiAtIHBhbCAzIC0gc2VjYW0gKi8KKwl2NGwyX3N0ZF9pZCBzdGQ7CisJaW50IGlvOworCWludCBkYXRhOworCXZvaWQgX19pb21lbSAqbWVtOworfTsKKworc3RhdGljIHN0cnVjdCBwbXMgcG1zX2NhcmQ7CiAKIC8qCiAgKglJL08gcG9ydHMgYW5kIFNoYXJlZCBNZW1vcnkKICAqLwogCi1zdGF0aWMgaW50IGlvX3BvcnQJCT0JMHgyNTA7Ci1zdGF0aWMgaW50IGRhdGFfcG9ydAkJPQkweDI1MTsKLXN0YXRpYyBpbnQgbWVtX2Jhc2UJCT0JMHhDODAwMDsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKm1lbTsKLXN0YXRpYyBpbnQgdmlkZW9fbnIgICAgICAgICAgICAgPSAgICAgICAtMTsKK3N0YXRpYyBpbnQgaW9fcG9ydCA9IDB4MjUwOworbW9kdWxlX3BhcmFtKGlvX3BvcnQsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgbWVtX2Jhc2UgPSAweGM4MDAwOworbW9kdWxlX3BhcmFtKG1lbV9iYXNlLCBpbnQsIDApOworCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CiAKIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXZ2X3dyaXRlKHU4IGluZGV4LCB1OCB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdnZfd3JpdGUoc3RydWN0IHBtcyAqZGV2LCB1OCBpbmRleCwgdTggdmFsdWUpCiB7Ci0Jb3V0dyhpbmRleHwodmFsdWU8PDgpLCBpb19wb3J0KTsKKwlvdXR3KGluZGV4IHwgKHZhbHVlIDw8IDgpLCBkZXYtPmlvKTsKIH0KIAotc3RhdGljIGlubGluZSB1OCBtdnZfcmVhZCh1OCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgdTggbXZ2X3JlYWQoc3RydWN0IHBtcyAqZGV2LCB1OCBpbmRleCkKIHsKLQlvdXRiKGluZGV4LCBpb19wb3J0KTsKLQlyZXR1cm4gaW5iKGRhdGFfcG9ydCk7CisJb3V0YihpbmRleCwgZGV2LT5pbyk7CisJcmV0dXJuIGluYihkZXYtPmRhdGEpOwogfQogCi1zdGF0aWMgaW50IHBtc19pMmNfc3RhdCh1OCBzbGF2ZSkKK3N0YXRpYyBpbnQgcG1zX2kyY19zdGF0KHN0cnVjdCBwbXMgKmRldiwgdTggc2xhdmUpCiB7Ci0JaW50IGNvdW50ZXI7CisJaW50IGNvdW50ZXIgPSAwOwogCWludCBpOwogCi0Jb3V0YigweDI4LCBpb19wb3J0KTsKKwlvdXRiKDB4MjgsIGRldi0+aW8pOwogCi0JY291bnRlcj0wOwotCXdoaWxlKChpbmIoZGF0YV9wb3J0KSYweDAxKT09MCkKLQkJaWYoY291bnRlcisrPT0yNTYpCisJd2hpbGUgKChpbmIoZGV2LT5kYXRhKSAmIDB4MDEpID09IDApCisJCWlmIChjb3VudGVyKysgPT0gMjU2KQogCQkJYnJlYWs7CiAKLQl3aGlsZSgoaW5iKGRhdGFfcG9ydCkmMHgwMSkhPTApCi0JCWlmKGNvdW50ZXIrKz09MjU2KQorCXdoaWxlICgoaW5iKGRldi0+ZGF0YSkgJiAweDAxKSAhPSAwKQorCQlpZiAoY291bnRlcisrID09IDI1NikKIAkJCWJyZWFrOwogCi0Jb3V0YihzbGF2ZSwgaW9fcG9ydCk7CisJb3V0YihzbGF2ZSwgZGV2LT5pbyk7CiAKLQljb3VudGVyPTA7Ci0Jd2hpbGUoKGluYihkYXRhX3BvcnQpJjB4MDEpPT0wKQotCQlpZihjb3VudGVyKys9PTI1NikKKwljb3VudGVyID0gMDsKKwl3aGlsZSAoKGluYihkZXYtPmRhdGEpICYgMHgwMSkgPT0gMCkKKwkJaWYgKGNvdW50ZXIrKyA9PSAyNTYpCiAJCQlicmVhazsKIAotCXdoaWxlKChpbmIoZGF0YV9wb3J0KSYweDAxKSE9MCkKLQkJaWYoY291bnRlcisrPT0yNTYpCisJd2hpbGUgKChpbmIoZGV2LT5kYXRhKSAmIDB4MDEpICE9IDApCisJCWlmIChjb3VudGVyKysgPT0gMjU2KQogCQkJYnJlYWs7CiAKLQlmb3IoaT0wO2k8MTI7aSsrKQotCXsKLQkJY2hhciBzdD1pbmIoZGF0YV9wb3J0KTsKLQkJaWYoKHN0JjIpIT0wKQorCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCWNoYXIgc3QgPSBpbmIoZGV2LT5kYXRhKTsKKworCQlpZiAoKHN0ICYgMikgIT0gMCkKIAkJCXJldHVybiAtMTsKLQkJaWYoKHN0JjEpPT0wKQorCQlpZiAoKHN0ICYgMSkgPT0gMCkKIAkJCWJyZWFrOwogCX0KLQlvdXRiKDB4MjksIGlvX3BvcnQpOwotCXJldHVybiBpbmIoZGF0YV9wb3J0KTsKKwlvdXRiKDB4MjksIGRldi0+aW8pOworCXJldHVybiBpbmIoZGV2LT5kYXRhKTsKIH0KIAotc3RhdGljIGludCBwbXNfaTJjX3dyaXRlKHUxNiBzbGF2ZSwgdTE2IHN1YiwgdTE2IGRhdGEpCitzdGF0aWMgaW50IHBtc19pMmNfd3JpdGUoc3RydWN0IHBtcyAqZGV2LCB1MTYgc2xhdmUsIHUxNiBzdWIsIHUxNiBkYXRhKQogewotCWludCBza2lwPTA7CisJaW50IHNraXAgPSAwOwogCWludCBjb3VudDsKIAlpbnQgaTsKIAotCWZvcihpPTA7aTxpMmNfY291bnQ7aSsrKQotCXsKLQkJaWYoKGkyY2luZm9baV0uc2xhdmU9PXNsYXZlKSAmJgotCQkgICAoaTJjaW5mb1tpXS5zdWIgPT0gc3ViKSkKLQkJewotCQkJaWYoaTJjaW5mb1tpXS5kYXRhPT1kYXRhKQotCQkJCXNraXA9MTsKLQkJCWkyY2luZm9baV0uZGF0YT1kYXRhOwotCQkJaT1pMmNfY291bnQrMTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pMmNfY291bnQ7IGkrKykgeworCQlpZiAoKGRldi0+aTJjaW5mb1tpXS5zbGF2ZSA9PSBzbGF2ZSkgJiYKKwkJICAgIChkZXYtPmkyY2luZm9baV0uc3ViID09IHN1YikpIHsKKwkJCWlmIChkZXYtPmkyY2luZm9baV0uZGF0YSA9PSBkYXRhKQorCQkJCXNraXAgPSAxOworCQkJZGV2LT5pMmNpbmZvW2ldLmRhdGEgPSBkYXRhOworCQkJaSA9IGRldi0+aTJjX2NvdW50ICsgMTsKIAkJfQogCX0KIAotCWlmKGk9PWkyY19jb3VudCAmJiBpMmNfY291bnQ8NjQpCi0JewotCQlpMmNpbmZvW2kyY19jb3VudF0uc2xhdmU9c2xhdmU7Ci0JCWkyY2luZm9baTJjX2NvdW50XS5zdWI9c3ViOwotCQlpMmNpbmZvW2kyY19jb3VudF0uZGF0YT1kYXRhOwotCQlpMmNfY291bnQrKzsKKwlpZiAoaSA9PSBkZXYtPmkyY19jb3VudCAmJiBkZXYtPmkyY19jb3VudCA8IDY0KSB7CisJCWRldi0+aTJjaW5mb1tkZXYtPmkyY19jb3VudF0uc2xhdmUgPSBzbGF2ZTsKKwkJZGV2LT5pMmNpbmZvW2Rldi0+aTJjX2NvdW50XS5zdWIgPSBzdWI7CisJCWRldi0+aTJjaW5mb1tkZXYtPmkyY19jb3VudF0uZGF0YSA9IGRhdGE7CisJCWRldi0+aTJjX2NvdW50Kys7CiAJfQogCi0JaWYoc2tpcCkKKwlpZiAoc2tpcCkKIAkJcmV0dXJuIDA7CiAKLQltdnZfd3JpdGUoMHgyOSwgc3ViKTsKLQltdnZfd3JpdGUoMHgyQSwgZGF0YSk7Ci0JbXZ2X3dyaXRlKDB4MjgsIHNsYXZlKTsKKwltdnZfd3JpdGUoZGV2LCAweDI5LCBzdWIpOworCW12dl93cml0ZShkZXYsIDB4MkEsIGRhdGEpOworCW12dl93cml0ZShkZXYsIDB4MjgsIHNsYXZlKTsKIAotCW91dGIoMHgyOCwgaW9fcG9ydCk7CisJb3V0YigweDI4LCBkZXYtPmlvKTsKIAotCWNvdW50PTA7Ci0Jd2hpbGUoKGluYihkYXRhX3BvcnQpJjEpPT0wKQotCQlpZihjb3VudD4yNTUpCisJY291bnQgPSAwOworCXdoaWxlICgoaW5iKGRldi0+ZGF0YSkgJiAxKSA9PSAwKQorCQlpZiAoY291bnQgPiAyNTUpCiAJCQlicmVhazsKLQl3aGlsZSgoaW5iKGRhdGFfcG9ydCkmMSkhPTApCi0JCWlmKGNvdW50PjI1NSkKKwl3aGlsZSAoKGluYihkZXYtPmRhdGEpICYgMSkgIT0gMCkKKwkJaWYgKGNvdW50ID4gMjU1KQogCQkJYnJlYWs7CiAKLQljb3VudD1pbmIoZGF0YV9wb3J0KTsKKwljb3VudCA9IGluYihkZXYtPmRhdGEpOwogCi0JaWYoY291bnQmMikKKwlpZiAoY291bnQgJiAyKQogCQlyZXR1cm4gLTE7CiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgaW50IHBtc19pMmNfcmVhZChpbnQgc2xhdmUsIGludCBzdWIpCitzdGF0aWMgaW50IHBtc19pMmNfcmVhZChzdHJ1Y3QgcG1zICpkZXYsIGludCBzbGF2ZSwgaW50IHN1YikKIHsKLQlpbnQgaT0wOwotCWZvcihpPTA7aTxpMmNfY291bnQ7aSsrKQotCXsKLQkJaWYoaTJjaW5mb1tpXS5zbGF2ZT09c2xhdmUgJiYgaTJjaW5mb1tpXS5zdWI9PXN1YikKLQkJCXJldHVybiBpMmNpbmZvW2ldLmRhdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pMmNfY291bnQ7IGkrKykgeworCQlpZiAoZGV2LT5pMmNpbmZvW2ldLnNsYXZlID09IHNsYXZlICYmIGRldi0+aTJjaW5mb1tpXS5zdWIgPT0gc3ViKQorCQkJcmV0dXJuIGRldi0+aTJjaW5mb1tpXS5kYXRhOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgdm9pZCBwbXNfaTJjX2FuZG9yKGludCBzbGF2ZSwgaW50IHN1YiwgaW50IGFuZCwgaW50IG9yKQorc3RhdGljIHZvaWQgcG1zX2kyY19hbmRvcihzdHJ1Y3QgcG1zICpkZXYsIGludCBzbGF2ZSwgaW50IHN1YiwgaW50IGFuZCwgaW50IG9yKQogewogCXU4IHRtcDsKIAotCXRtcD1wbXNfaTJjX3JlYWQoc2xhdmUsIHN1Yik7Ci0JdG1wID0gKHRtcCZhbmQpfG9yOwotCXBtc19pMmNfd3JpdGUoc2xhdmUsIHN1YiwgdG1wKTsKKwl0bXAgPSBwbXNfaTJjX3JlYWQoZGV2LCBzbGF2ZSwgc3ViKTsKKwl0bXAgPSAodG1wICYgYW5kKSB8IG9yOworCXBtc19pMmNfd3JpdGUoZGV2LCBzbGF2ZSwgc3ViLCB0bXApOwogfQogCiAvKgpAQCAtMjAzLDEwMCArMjEzLDEwOCBAQAogICovCiAKIAotc3RhdGljIHZvaWQgcG1zX3ZpZGVvc291cmNlKHNob3J0IHNvdXJjZSkKK3N0YXRpYyB2b2lkIHBtc192aWRlb3NvdXJjZShzdHJ1Y3QgcG1zICpkZXYsIHNob3J0IHNvdXJjZSkKIHsKLQltdnZfd3JpdGUoMHgyRSwgc291cmNlPzB4MzE6MHgzMCk7CisJc3dpdGNoIChkZXYtPmRlY29kZXIpIHsKKwljYXNlIE1PVE9ST0xBOgorCQlicmVhazsKKwljYXNlIFBISUxJUFMyOgorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg4YSwgMHgwNiwgMHg3Ziwgc291cmNlID8gMHg4MCA6IDApOworCQlicmVhazsKKwljYXNlIFBISUxJUFMxOgorCQlicmVhazsKKwl9CisJbXZ2X3dyaXRlKGRldiwgMHgyRSwgMHgzMSk7CisJLyogV2FzOiBtdnZfd3JpdGUoZGV2LCAweDJFLCBzb3VyY2UgPyAweDMxIDogMHgzMCk7CisJICAgQnV0IGNvdWxkIG5vdCBtYWtlIHRoaXMgd29yayBjb3JyZWN0bHkuIE9ubHkgQ29tcG9zaXRlIGlucHV0CisJICAgd29ya2VkIGZvciBtZS4gKi8KIH0KIAotc3RhdGljIHZvaWQgcG1zX2h1ZShzaG9ydCBodWUpCitzdGF0aWMgdm9pZCBwbXNfaHVlKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgaHVlKQogewotCXN3aXRjaChkZWNvZGVyKQotCXsKLQkJY2FzZSBNT1RPUk9MQToKLQkJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwMCwgaHVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFBISUxJUFMyOgotCQkJcG1zX2kyY193cml0ZSgweDhBLCAweDA3LCBodWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhJTElQUzE6Ci0JCQlwbXNfaTJjX3dyaXRlKDB4NDIsIDB4MDcsIGh1ZSk7Ci0JCQlicmVhazsKKwlzd2l0Y2ggKGRldi0+ZGVjb2RlcikgeworCWNhc2UgTU9UT1JPTEE6CisJCXBtc19pMmNfd3JpdGUoZGV2LCAweDhhLCAweDAwLCBodWUpOworCQlicmVhazsKKwljYXNlIFBISUxJUFMyOgorCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg4YSwgMHgwNywgaHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQSElMSVBTMToKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4NDIsIDB4MDcsIGh1ZSk7CisJCWJyZWFrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgcG1zX2NvbG91cihzaG9ydCBjb2xvdXIpCitzdGF0aWMgdm9pZCBwbXNfc2F0dXJhdGlvbihzdHJ1Y3QgcG1zICpkZXYsIHNob3J0IHNhdCkKIHsKLQlzd2l0Y2goZGVjb2RlcikKLQl7Ci0JCWNhc2UgTU9UT1JPTEE6Ci0JCQlwbXNfaTJjX3dyaXRlKDB4OEEsIDB4MDAsIGNvbG91cik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSElMSVBTMToKLQkJCXBtc19pMmNfd3JpdGUoMHg0MiwgMHgxMiwgY29sb3VyKTsKLQkJCWJyZWFrOworCXN3aXRjaCAoZGV2LT5kZWNvZGVyKSB7CisJY2FzZSBNT1RPUk9MQToKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4OGEsIDB4MDAsIHNhdCk7CisJCWJyZWFrOworCWNhc2UgUEhJTElQUzE6CisJCXBtc19pMmNfd3JpdGUoZGV2LCAweDQyLCAweDEyLCBzYXQpOworCQlicmVhazsKIAl9CiB9CiAKIAotc3RhdGljIHZvaWQgcG1zX2NvbnRyYXN0KHNob3J0IGNvbnRyYXN0KQorc3RhdGljIHZvaWQgcG1zX2NvbnRyYXN0KHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgY29udHJhc3QpCiB7Ci0Jc3dpdGNoKGRlY29kZXIpCi0JewotCQljYXNlIE1PVE9ST0xBOgotCQkJcG1zX2kyY193cml0ZSgweDhBLCAweDAwLCBjb250cmFzdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQSElMSVBTMToKLQkJCXBtc19pMmNfd3JpdGUoMHg0MiwgMHgxMywgY29udHJhc3QpOwotCQkJYnJlYWs7CisJc3dpdGNoIChkZXYtPmRlY29kZXIpIHsKKwljYXNlIE1PVE9ST0xBOgorCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg4YSwgMHgwMCwgY29udHJhc3QpOworCQlicmVhazsKKwljYXNlIFBISUxJUFMxOgorCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg0MiwgMHgxMywgY29udHJhc3QpOworCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHBtc19icmlnaHRuZXNzKHNob3J0IGJyaWdodG5lc3MpCitzdGF0aWMgdm9pZCBwbXNfYnJpZ2h0bmVzcyhzdHJ1Y3QgcG1zICpkZXYsIHNob3J0IGJyaWdodG5lc3MpCiB7Ci0Jc3dpdGNoKGRlY29kZXIpCi0JewotCQljYXNlIE1PVE9ST0xBOgotCQkJcG1zX2kyY193cml0ZSgweDhBLCAweDAwLCBicmlnaHRuZXNzKTsKLQkJCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwMCwgYnJpZ2h0bmVzcyk7Ci0JCQlwbXNfaTJjX3dyaXRlKDB4OEEsIDB4MDAsIGJyaWdodG5lc3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhJTElQUzE6Ci0JCQlwbXNfaTJjX3dyaXRlKDB4NDIsIDB4MTksIGJyaWdodG5lc3MpOwotCQkJYnJlYWs7CisJc3dpdGNoIChkZXYtPmRlY29kZXIpIHsKKwljYXNlIE1PVE9ST0xBOgorCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg4YSwgMHgwMCwgYnJpZ2h0bmVzcyk7CisJCXBtc19pMmNfd3JpdGUoZGV2LCAweDhhLCAweDAwLCBicmlnaHRuZXNzKTsKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4OGEsIDB4MDAsIGJyaWdodG5lc3MpOworCQlicmVhazsKKwljYXNlIFBISUxJUFMxOgorCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg0MiwgMHgxOSwgYnJpZ2h0bmVzcyk7CisJCWJyZWFrOwogCX0KIH0KIAogCi1zdGF0aWMgdm9pZCBwbXNfZm9ybWF0KHNob3J0IGZvcm1hdCkKK3N0YXRpYyB2b2lkIHBtc19mb3JtYXQoc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBmb3JtYXQpCiB7CiAJaW50IHRhcmdldDsKLQlzdGFuZGFyZCA9IGZvcm1hdDsKIAotCWlmKGRlY29kZXI9PVBISUxJUFMxKQotCQl0YXJnZXQ9MHg0MjsKLQllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMyKQotCQl0YXJnZXQ9MHg4QTsKKwlkZXYtPnN0YW5kYXJkID0gZm9ybWF0OworCisJaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMSkKKwkJdGFyZ2V0ID0gMHg0MjsKKwllbHNlIGlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzIpCisJCXRhcmdldCA9IDB4OGE7CiAJZWxzZQogCQlyZXR1cm47CiAKLQlzd2l0Y2goZm9ybWF0KQotCXsKLQkJY2FzZSAwOgkvKiBBdXRvICovCi0JCQlwbXNfaTJjX2FuZG9yKHRhcmdldCwgMHgwRCwgMHhGRSwweDAwKTsKLQkJCXBtc19pMmNfYW5kb3IodGFyZ2V0LCAweDBGLCAweDNGLDB4ODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTogLyogTlRTQyAqLwotCQkJcG1zX2kyY19hbmRvcih0YXJnZXQsIDB4MEQsIDB4RkUsIDB4MDApOwotCQkJcG1zX2kyY19hbmRvcih0YXJnZXQsIDB4MEYsIDB4M0YsIDB4NDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjogLyogUEFMICovCi0JCQlwbXNfaTJjX2FuZG9yKHRhcmdldCwgMHgwRCwgMHhGRSwgMHgwMCk7Ci0JCQlwbXNfaTJjX2FuZG9yKHRhcmdldCwgMHgwRiwgMHgzRiwgMHgwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgkvKiBTRUNBTSAqLwotCQkJcG1zX2kyY19hbmRvcih0YXJnZXQsIDB4MEQsIDB4RkUsIDB4MDEpOwotCQkJcG1zX2kyY19hbmRvcih0YXJnZXQsIDB4MEYsIDB4M0YsIDB4MDApOwotCQkJYnJlYWs7CisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIDA6CS8qIEF1dG8gKi8KKwkJcG1zX2kyY19hbmRvcihkZXYsIHRhcmdldCwgMHgwZCwgMHhmZSwgMHgwMCk7CisJCXBtc19pMmNfYW5kb3IoZGV2LCB0YXJnZXQsIDB4MGYsIDB4M2YsIDB4ODApOworCQlicmVhazsKKwljYXNlIDE6IC8qIE5UU0MgKi8KKwkJcG1zX2kyY19hbmRvcihkZXYsIHRhcmdldCwgMHgwZCwgMHhmZSwgMHgwMCk7CisJCXBtc19pMmNfYW5kb3IoZGV2LCB0YXJnZXQsIDB4MGYsIDB4M2YsIDB4NDApOworCQlicmVhazsKKwljYXNlIDI6IC8qIFBBTCAqLworCQlwbXNfaTJjX2FuZG9yKGRldiwgdGFyZ2V0LCAweDBkLCAweGZlLCAweDAwKTsKKwkJcG1zX2kyY19hbmRvcihkZXYsIHRhcmdldCwgMHgwZiwgMHgzZiwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgMzoJLyogU0VDQU0gKi8KKwkJcG1zX2kyY19hbmRvcihkZXYsIHRhcmdldCwgMHgwZCwgMHhmZSwgMHgwMSk7CisJCXBtc19pMmNfYW5kb3IoZGV2LCB0YXJnZXQsIDB4MGYsIDB4M2YsIDB4MDApOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTMwOCwxOCArMzI2LDE3IEBACiAgKglwZW9wbGUgbmVlZCBpdC4gV2UgYWxzbyBkb24ndCB5ZXQgdXNlIHRoZSBQTVMgaW50ZXJydXB0LgogICovCiAKLXN0YXRpYyB2b2lkIHBtc19oc3RhcnQoc2hvcnQgc3RhcnQpCitzdGF0aWMgdm9pZCBwbXNfaHN0YXJ0KHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgc3RhcnQpCiB7Ci0Jc3dpdGNoKGRlY29kZXIpCi0JewotCQljYXNlIFBISUxJUFMxOgotCQkJcG1zX2kyY193cml0ZSgweDhBLCAweDA1LCBzdGFydCk7Ci0JCQlwbXNfaTJjX3dyaXRlKDB4OEEsIDB4MTgsIHN0YXJ0KTsKLQkJCWJyZWFrOwotCQljYXNlIFBISUxJUFMyOgotCQkJcG1zX2kyY193cml0ZSgweDQyLCAweDA1LCBzdGFydCk7Ci0JCQlwbXNfaTJjX3dyaXRlKDB4NDIsIDB4MTgsIHN0YXJ0KTsKLQkJCWJyZWFrOworCXN3aXRjaCAoZGV2LT5kZWNvZGVyKSB7CisJY2FzZSBQSElMSVBTMToKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4OGEsIDB4MDUsIHN0YXJ0KTsKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4OGEsIDB4MTgsIHN0YXJ0KTsKKwkJYnJlYWs7CisJY2FzZSBQSElMSVBTMjoKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4NDIsIDB4MDUsIHN0YXJ0KTsKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4NDIsIDB4MTgsIHN0YXJ0KTsKKwkJYnJlYWs7CiAJfQogfQogCkBAIC0zMjcsMjkzICszNDQsMjcxIEBACiAgKglCYW5kcGFzcyBmaWx0ZXJzCiAgKi8KIAotc3RhdGljIHZvaWQgcG1zX2JhbmRwYXNzKHNob3J0IHBhc3MpCitzdGF0aWMgdm9pZCBwbXNfYmFuZHBhc3Moc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBwYXNzKQogewotCWlmKGRlY29kZXI9PVBISUxJUFMyKQotCQlwbXNfaTJjX2FuZG9yKDB4OEEsIDB4MDYsIDB4Q0YsIChwYXNzJjB4MDMpPDw0KTsKLQllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQotCQlwbXNfaTJjX2FuZG9yKDB4NDIsIDB4MDYsIDB4Q0YsIChwYXNzJjB4MDMpPDw0KTsKKwlpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg4YSwgMHgwNiwgMHhjZiwgKHBhc3MgJiAweDAzKSA8PCA0KTsKKwllbHNlIGlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDA2LCAweGNmLCAocGFzcyAmIDB4MDMpIDw8IDQpOwogfQogCi1zdGF0aWMgdm9pZCBwbXNfYW50aXNub3coc2hvcnQgc25vdykKK3N0YXRpYyB2b2lkIHBtc19hbnRpc25vdyhzdHJ1Y3QgcG1zICpkZXYsIHNob3J0IHNub3cpCiB7Ci0JaWYoZGVjb2Rlcj09UEhJTElQUzIpCi0JCXBtc19pMmNfYW5kb3IoMHg4QSwgMHgwNiwgMHhGMywgKHNub3cmMHgwMyk8PDIpOwotCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCi0JCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwNiwgMHhGMywgKHNub3cmMHgwMyk8PDIpOworCWlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzIpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDhhLCAweDA2LCAweGYzLCAoc25vdyAmIDB4MDMpIDw8IDIpOworCWVsc2UgaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcihkZXYsIDB4NDIsIDB4MDYsIDB4ZjMsIChzbm93ICYgMHgwMykgPDwgMik7CiB9CiAKLXN0YXRpYyB2b2lkIHBtc19zaGFycG5lc3Moc2hvcnQgc2hhcnApCitzdGF0aWMgdm9pZCBwbXNfc2hhcnBuZXNzKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgc2hhcnApCiB7Ci0JaWYoZGVjb2Rlcj09UEhJTElQUzIpCi0JCXBtc19pMmNfYW5kb3IoMHg4QSwgMHgwNiwgMHhGQywgc2hhcnAmMHgwMyk7Ci0JZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKLQkJcG1zX2kyY19hbmRvcigweDQyLCAweDA2LCAweEZDLCBzaGFycCYweDAzKTsKKwlpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg4YSwgMHgwNiwgMHhmYywgc2hhcnAgJiAweDAzKTsKKwllbHNlIGlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDA2LCAweGZjLCBzaGFycCAmIDB4MDMpOwogfQogCi1zdGF0aWMgdm9pZCBwbXNfY2hyb21hYWdjKHNob3J0IGFnYykKK3N0YXRpYyB2b2lkIHBtc19jaHJvbWFhZ2Moc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBhZ2MpCiB7Ci0JaWYoZGVjb2Rlcj09UEhJTElQUzIpCi0JCXBtc19pMmNfYW5kb3IoMHg4QSwgMHgwQywgMHg5RiwgKGFnYyYweDAzKTw8NSk7Ci0JZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKLQkJcG1zX2kyY19hbmRvcigweDQyLCAweDBDLCAweDlGLCAoYWdjJjB4MDMpPDw1KTsKKwlpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg4YSwgMHgwYywgMHg5ZiwgKGFnYyAmIDB4MDMpIDw8IDUpOworCWVsc2UgaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcihkZXYsIDB4NDIsIDB4MGMsIDB4OWYsIChhZ2MgJiAweDAzKSA8PCA1KTsKIH0KIAotc3RhdGljIHZvaWQgcG1zX3ZlcnRub2lzZShzaG9ydCBub2lzZSkKK3N0YXRpYyB2b2lkIHBtc192ZXJ0bm9pc2Uoc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBub2lzZSkKIHsKLQlpZihkZWNvZGVyPT1QSElMSVBTMikKLQkJcG1zX2kyY19hbmRvcigweDhBLCAweDEwLCAweEZDLCBub2lzZSYzKTsKLQllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQotCQlwbXNfaTJjX2FuZG9yKDB4NDIsIDB4MTAsIDB4RkMsIG5vaXNlJjMpOworCWlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzIpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDhhLCAweDEwLCAweGZjLCBub2lzZSAmIDMpOworCWVsc2UgaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMSkKKwkJcG1zX2kyY19hbmRvcihkZXYsIDB4NDIsIDB4MTAsIDB4ZmMsIG5vaXNlICYgMyk7CiB9CiAKLXN0YXRpYyB2b2lkIHBtc19mb3JjZWNvbG91cihzaG9ydCBjb2xvdXIpCitzdGF0aWMgdm9pZCBwbXNfZm9yY2Vjb2xvdXIoc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBjb2xvdXIpCiB7Ci0JaWYoZGVjb2Rlcj09UEhJTElQUzIpCi0JCXBtc19pMmNfYW5kb3IoMHg4QSwgMHgwQywgMHg3RiwgKGNvbG91ciYxKTw8Nyk7Ci0JZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKLQkJcG1zX2kyY19hbmRvcigweDQyLCAweDBDLCAweDcsIChjb2xvdXImMSk8PDcpOworCWlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzIpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDhhLCAweDBjLCAweDdmLCAoY29sb3VyICYgMSkgPDwgNyk7CisJZWxzZSBpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg0MiwgMHgwYywgMHg3LCAoY29sb3VyICYgMSkgPDwgNyk7CiB9CiAKLXN0YXRpYyB2b2lkIHBtc19hbnRpZ2FtbWEoc2hvcnQgZ2FtbWEpCitzdGF0aWMgdm9pZCBwbXNfYW50aWdhbW1hKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgZ2FtbWEpCiB7Ci0JaWYoZGVjb2Rlcj09UEhJTElQUzIpCi0JCXBtc19pMmNfYW5kb3IoMHhCOCwgMHgwMCwgMHg3RiwgKGdhbW1hJjEpPDw3KTsKLQllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQotCQlwbXNfaTJjX2FuZG9yKDB4NDIsIDB4MjAsIDB4NywgKGdhbW1hJjEpPDw3KTsKKwlpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHhiOCwgMHgwMCwgMHg3ZiwgKGdhbW1hICYgMSkgPDwgNyk7CisJZWxzZSBpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg0MiwgMHgyMCwgMHg3LCAoZ2FtbWEgJiAxKSA8PCA3KTsKIH0KIAotc3RhdGljIHZvaWQgcG1zX3ByZWZpbHRlcihzaG9ydCBmaWx0ZXIpCitzdGF0aWMgdm9pZCBwbXNfcHJlZmlsdGVyKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgZmlsdGVyKQogewotCWlmKGRlY29kZXI9PVBISUxJUFMyKQotCQlwbXNfaTJjX2FuZG9yKDB4OEEsIDB4MDYsIDB4QkYsIChmaWx0ZXImMSk8PDYpOwotCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCi0JCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwNiwgMHhCRiwgKGZpbHRlciYxKTw8Nik7CisJaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMikKKwkJcG1zX2kyY19hbmRvcihkZXYsIDB4OGEsIDB4MDYsIDB4YmYsIChmaWx0ZXIgJiAxKSA8PCA2KTsKKwllbHNlIGlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDA2LCAweGJmLCAoZmlsdGVyICYgMSkgPDwgNik7CiB9CiAKLXN0YXRpYyB2b2lkIHBtc19oZmlsdGVyKHNob3J0IGZpbHRlcikKK3N0YXRpYyB2b2lkIHBtc19oZmlsdGVyKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgZmlsdGVyKQogewotCWlmKGRlY29kZXI9PVBISUxJUFMyKQotCQlwbXNfaTJjX2FuZG9yKDB4QjgsIDB4MDQsIDB4MUYsIChmaWx0ZXImNyk8PDUpOwotCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCi0JCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgyNCwgMHgxRiwgKGZpbHRlciY3KTw8NSk7CisJaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMikKKwkJcG1zX2kyY19hbmRvcihkZXYsIDB4YjgsIDB4MDQsIDB4MWYsIChmaWx0ZXIgJiA3KSA8PCA1KTsKKwllbHNlIGlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDI0LCAweDFmLCAoZmlsdGVyICYgNykgPDwgNSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBtc192ZmlsdGVyKHNob3J0IGZpbHRlcikKK3N0YXRpYyB2b2lkIHBtc192ZmlsdGVyKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgZmlsdGVyKQogewotCWlmKGRlY29kZXI9PVBISUxJUFMyKQotCQlwbXNfaTJjX2FuZG9yKDB4QjgsIDB4MDgsIDB4OUYsIChmaWx0ZXImMyk8PDUpOwotCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCi0JCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgyOCwgMHg5RiwgKGZpbHRlciYzKTw8NSk7CisJaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMikKKwkJcG1zX2kyY19hbmRvcihkZXYsIDB4YjgsIDB4MDgsIDB4OWYsIChmaWx0ZXIgJiAzKSA8PCA1KTsKKwllbHNlIGlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDI4LCAweDlmLCAoZmlsdGVyICYgMykgPDwgNSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBtc19raWxsY29sb3VyKHNob3J0IGNvbG91cikKK3N0YXRpYyB2b2lkIHBtc19raWxsY29sb3VyKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgY29sb3VyKQogewotCWlmKGRlY29kZXI9PVBISUxJUFMyKQotCXsKLQkJcG1zX2kyY19hbmRvcigweDhBLCAweDA4LCAweDA3LCAoY29sb3VyJjB4MUYpPDwzKTsKLQkJcG1zX2kyY19hbmRvcigweDhBLCAweDA5LCAweDA3LCAoY29sb3VyJjB4MUYpPDwzKTsKLQl9Ci0JZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKLQl7Ci0JCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwOCwgMHgwNywgKGNvbG91ciYweDFGKTw8Myk7Ci0JCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwOSwgMHgwNywgKGNvbG91ciYweDFGKTw8Myk7CisJaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMikgeworCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg4YSwgMHgwOCwgMHgwNywgKGNvbG91ciAmIDB4MWYpIDw8IDMpOworCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg4YSwgMHgwOSwgMHgwNywgKGNvbG91ciAmIDB4MWYpIDw8IDMpOworCX0gZWxzZSBpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMxKSB7CisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDA4LCAweDA3LCAoY29sb3VyICYgMHgxZikgPDwgMyk7CisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDA5LCAweDA3LCAoY29sb3VyICYgMHgxZikgPDwgMyk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBwbXNfY2hyb21hZ2FpbihzaG9ydCBjaHJvbWEpCitzdGF0aWMgdm9pZCBwbXNfY2hyb21hZ2FpbihzdHJ1Y3QgcG1zICpkZXYsIHNob3J0IGNocm9tYSkKIHsKLQlpZihkZWNvZGVyPT1QSElMSVBTMikKLQl7Ci0JCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgxMSwgY2hyb21hKTsKLQl9Ci0JZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKLQl7Ci0JCXBtc19pMmNfd3JpdGUoMHg0MiwgMHgxMSwgY2hyb21hKTsKLQl9CisJaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMikKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4OGEsIDB4MTEsIGNocm9tYSk7CisJZWxzZSBpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMxKQorCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg0MiwgMHgxMSwgY2hyb21hKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBwbXNfc3BhY2lhbGNvbXBsKHNob3J0IGRhdGEpCitzdGF0aWMgdm9pZCBwbXNfc3BhY2lhbGNvbXBsKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgZGF0YSkKIHsKLQltdnZfd3JpdGUoMHgzQiwgZGF0YSk7CisJbXZ2X3dyaXRlKGRldiwgMHgzYiwgZGF0YSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBtc19zcGFjaWFsY29tcGgoc2hvcnQgZGF0YSkKK3N0YXRpYyB2b2lkIHBtc19zcGFjaWFsY29tcGgoc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBkYXRhKQogewotCW12dl93cml0ZSgweDNBLCBkYXRhKTsKKwltdnZfd3JpdGUoZGV2LCAweDNhLCBkYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgcG1zX3ZzdGFydChzaG9ydCBzdGFydCkKK3N0YXRpYyB2b2lkIHBtc192c3RhcnQoc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBzdGFydCkKIHsKLQltdnZfd3JpdGUoMHgxNiwgc3RhcnQpOwotCW12dl93cml0ZSgweDE3LCAoc3RhcnQ+PjgpJjB4MDEpOworCW12dl93cml0ZShkZXYsIDB4MTYsIHN0YXJ0KTsKKwltdnZfd3JpdGUoZGV2LCAweDE3LCAoc3RhcnQgPj4gOCkgJiAweDAxKTsKIH0KIAogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHBtc19zZWNhbWNyb3NzKHNob3J0IGNyb3NzKQorc3RhdGljIHZvaWQgcG1zX3NlY2FtY3Jvc3Moc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBjcm9zcykKIHsKLQlpZihkZWNvZGVyPT1QSElMSVBTMikKLQkJcG1zX2kyY19hbmRvcigweDhBLCAweDBGLCAweERGLCAoY3Jvc3MmMSk8PDUpOwotCWVsc2UgaWYoZGVjb2Rlcj09UEhJTElQUzEpCi0JCXBtc19pMmNfYW5kb3IoMHg0MiwgMHgwRiwgMHhERiwgKGNyb3NzJjEpPDw1KTsKKwlpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMyKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg4YSwgMHgwZiwgMHhkZiwgKGNyb3NzICYgMSkgPDwgNSk7CisJZWxzZSBpZiAoZGV2LT5kZWNvZGVyID09IFBISUxJUFMxKQorCQlwbXNfaTJjX2FuZG9yKGRldiwgMHg0MiwgMHgwZiwgMHhkZiwgKGNyb3NzICYgMSkgPDwgNSk7CiB9CiAKIAotc3RhdGljIHZvaWQgcG1zX3N3c2Vuc2Uoc2hvcnQgc2Vuc2UpCitzdGF0aWMgdm9pZCBwbXNfc3dzZW5zZShzdHJ1Y3QgcG1zICpkZXYsIHNob3J0IHNlbnNlKQogewotCWlmKGRlY29kZXI9PVBISUxJUFMyKQotCXsKLQkJcG1zX2kyY193cml0ZSgweDhBLCAweDBBLCBzZW5zZSk7Ci0JCXBtc19pMmNfd3JpdGUoMHg4QSwgMHgwQiwgc2Vuc2UpOwotCX0KLQllbHNlIGlmKGRlY29kZXI9PVBISUxJUFMxKQotCXsKLQkJcG1zX2kyY193cml0ZSgweDQyLCAweDBBLCBzZW5zZSk7Ci0JCXBtc19pMmNfd3JpdGUoMHg0MiwgMHgwQiwgc2Vuc2UpOworCWlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzIpIHsKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4OGEsIDB4MGEsIHNlbnNlKTsKKwkJcG1zX2kyY193cml0ZShkZXYsIDB4OGEsIDB4MGIsIHNlbnNlKTsKKwl9IGVsc2UgaWYgKGRldi0+ZGVjb2RlciA9PSBQSElMSVBTMSkgeworCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg0MiwgMHgwYSwgc2Vuc2UpOworCQlwbXNfaTJjX3dyaXRlKGRldiwgMHg0MiwgMHgwYiwgc2Vuc2UpOwogCX0KIH0KIAogCi1zdGF0aWMgdm9pZCBwbXNfZnJhbWVyYXRlKHNob3J0IGZycikKK3N0YXRpYyB2b2lkIHBtc19mcmFtZXJhdGUoc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBmcnIpCiB7Ci0JaW50IGZwcz0oc3RhbmRhcmQ9PTEpPzMwOjI1OwotCWlmKGZycj09MCkKKwlpbnQgZnBzID0gKGRldi0+c3RkICYgVjRMMl9TVERfNTI1XzYwKSA/IDMwIDogMjU7CisKKwlpZiAoZnJyID09IDApCiAJCXJldHVybjsKLQlmcHM9ZnBzL2ZycjsKLQltdnZfd3JpdGUoMHgxNCwweDgwfGZwcyk7Ci0JbXZ2X3dyaXRlKDB4MTUsMSk7CisJZnBzID0gZnBzL2ZycjsKKwltdnZfd3JpdGUoZGV2LCAweDE0LCAweDgwIHwgZnBzKTsKKwltdnZfd3JpdGUoZGV2LCAweDE1LCAxKTsKIH0KIAotc3RhdGljIHZvaWQgcG1zX3ZlcnQodTggZGVjaWRlbiwgdTggZGVjaW51bSkKK3N0YXRpYyB2b2lkIHBtc192ZXJ0KHN0cnVjdCBwbXMgKmRldiwgdTggZGVjaWRlbiwgdTggZGVjaW51bSkKIHsKLQltdnZfd3JpdGUoMHgxQywgZGVjaWRlbik7CS8qIERlbm9taW5hdG9yICovCi0JbXZ2X3dyaXRlKDB4MUQsIGRlY2ludW0pOwkvKiBOdW1lcmF0b3IgKi8KKwltdnZfd3JpdGUoZGV2LCAweDFjLCBkZWNpZGVuKTsJLyogRGVub21pbmF0b3IgKi8KKwltdnZfd3JpdGUoZGV2LCAweDFkLCBkZWNpbnVtKTsJLyogTnVtZXJhdG9yICovCiB9CiAKIC8qCiAgKglUdXJuIDE2Yml0IHJhdGlvcyBpbnRvIGJlc3Qgc21hbGwgcmF0aW8gdGhlIGNoaXBzZXQgY2FuIGdyb2sKICAqLwogCi1zdGF0aWMgdm9pZCBwbXNfdmVydGRlY2kodW5zaWduZWQgc2hvcnQgZGVjaW51bSwgdW5zaWduZWQgc2hvcnQgZGVjaWRlbikKK3N0YXRpYyB2b2lkIHBtc192ZXJ0ZGVjaShzdHJ1Y3QgcG1zICpkZXYsIHVuc2lnbmVkIHNob3J0IGRlY2ludW0sIHVuc2lnbmVkIHNob3J0IGRlY2lkZW4pCiB7Ci0JLyogS25vY2sgaXQgZG93biBieSAvNSBvbmNlICovCi0JaWYoZGVjaW51bSU1PT0wKQotCXsKLQkJZGVjaWRlbi89NTsKLQkJZGVjaW51bS89NTsKKwkvKiBLbm9jayBpdCBkb3duIGJ5IC8gNSBvbmNlICovCisJaWYgKGRlY2ludW0gJSA1ID09IDApIHsKKwkJZGVjaWRlbiAvPSA1OworCQlkZWNpbnVtIC89IDU7CiAJfQogCS8qCiAJICoJMydzCiAJICovCi0Jd2hpbGUoZGVjaW51bSUzPT0wICYmIGRlY2lkZW4lMz09MCkKLQl7Ci0JCWRlY2lkZW4vPTM7Ci0JCWRlY2ludW0vPTM7CisJd2hpbGUgKGRlY2ludW0gJSAzID09IDAgJiYgZGVjaWRlbiAlIDMgPT0gMCkgeworCQlkZWNpZGVuIC89IDM7CisJCWRlY2ludW0gLz0gMzsKIAl9CiAJLyoKIAkgKgkyJ3MKIAkgKi8KLQl3aGlsZShkZWNpbnVtJTI9PTAgJiYgZGVjaWRlbiUyPT0wKQotCXsKLQkJZGVjaW51bS89MjsKLQkJZGVjaWRlbi89MjsKKwl3aGlsZSAoZGVjaW51bSAlIDIgPT0gMCAmJiBkZWNpZGVuICUgMiA9PSAwKSB7CisJCWRlY2ludW0gLz0gMjsKKwkJZGVjaWRlbiAvPSAyOwogCX0KIAkvKgogCSAqCUZ1ZGd5aWZ5CiAJICovCi0Jd2hpbGUoZGVjaWRlbj4zMikKLQl7Ci0JCWRlY2lkZW4vPTI7Ci0JCWRlY2ludW09KGRlY2ludW0rMSkvMjsKKwl3aGlsZSAoZGVjaWRlbiA+IDMyKSB7CisJCWRlY2lkZW4gLz0gMjsKKwkJZGVjaW51bSA9IChkZWNpbnVtICsgMSkgLyAyOwogCX0KLQlpZihkZWNpZGVuPT0zMikKKwlpZiAoZGVjaWRlbiA9PSAzMikKIAkJZGVjaWRlbi0tOwotCXBtc192ZXJ0KGRlY2lkZW4sZGVjaW51bSk7CisJcG1zX3ZlcnQoZGV2LCBkZWNpZGVuLCBkZWNpbnVtKTsKIH0KIAotc3RhdGljIHZvaWQgcG1zX2hvcnpkZWNpKHNob3J0IGRlY2ludW0sIHNob3J0IGRlY2lkZW4pCitzdGF0aWMgdm9pZCBwbXNfaG9yemRlY2koc3RydWN0IHBtcyAqZGV2LCBzaG9ydCBkZWNpbnVtLCBzaG9ydCBkZWNpZGVuKQogewotCWlmKGRlY2ludW08PTUxMikKLQl7Ci0JCWlmKGRlY2ludW0lNT09MCkKLQkJewotCQkJZGVjaW51bS89NTsKLQkJCWRlY2lkZW4vPTU7CisJaWYgKGRlY2ludW0gPD0gNTEyKSB7CisJCWlmIChkZWNpbnVtICUgNSA9PSAwKSB7CisJCQlkZWNpbnVtIC89IDU7CisJCQlkZWNpZGVuIC89IDU7CiAJCX0KLQl9Ci0JZWxzZQotCXsKLQkJZGVjaW51bT01MTI7Ci0JCWRlY2lkZW49NjQwOwkvKiA3Njggd291bGQgYmUgaWRlYWwgKi8KKwl9IGVsc2UgeworCQlkZWNpbnVtID0gNTEyOworCQlkZWNpZGVuID0gNjQwOwkvKiA3Njggd291bGQgYmUgaWRlYWwgKi8KIAl9CiAKLQl3aGlsZSgoKGRlY2ludW18ZGVjaWRlbikmMSk9PTApCi0JewotCQlkZWNpbnVtPj49MTsKLQkJZGVjaWRlbj4+PTE7CisJd2hpbGUgKCgoZGVjaW51bSB8IGRlY2lkZW4pICYgMSkgPT0gMCkgeworCQlkZWNpbnVtID4+PSAxOworCQlkZWNpZGVuID4+PSAxOwogCX0KLQl3aGlsZShkZWNpZGVuPjMyKQotCXsKLQkJZGVjaWRlbj4+PTE7Ci0JCWRlY2ludW09KGRlY2ludW0rMSk+PjE7CisJd2hpbGUgKGRlY2lkZW4gPiAzMikgeworCQlkZWNpZGVuID4+PSAxOworCQlkZWNpbnVtID0gKGRlY2ludW0gKyAxKSA+PiAxOwogCX0KLQlpZihkZWNpZGVuPT0zMikKKwlpZiAoZGVjaWRlbiA9PSAzMikKIAkJZGVjaWRlbi0tOwogCi0JbXZ2X3dyaXRlKDB4MjQsIDB4ODB8ZGVjaWRlbik7Ci0JbXZ2X3dyaXRlKDB4MjUsIGRlY2ludW0pOworCW12dl93cml0ZShkZXYsIDB4MjQsIDB4ODAgfCBkZWNpZGVuKTsKKwltdnZfd3JpdGUoZGV2LCAweDI1LCBkZWNpbnVtKTsKIH0KIAotc3RhdGljIHZvaWQgcG1zX3Jlc29sdXRpb24oc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCkKK3N0YXRpYyB2b2lkIHBtc19yZXNvbHV0aW9uKHN0cnVjdCBwbXMgKmRldiwgc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCkKIHsKIAlpbnQgZmdfaGVpZ2h0OwogCi0JZmdfaGVpZ2h0PWhlaWdodDsKLQlpZihmZ19oZWlnaHQ+MjgwKQotCQlmZ19oZWlnaHQ9MjgwOworCWZnX2hlaWdodCA9IGhlaWdodDsKKwlpZiAoZmdfaGVpZ2h0ID4gMjgwKQorCQlmZ19oZWlnaHQgPSAyODA7CiAKLQltdnZfd3JpdGUoMHgxOCwgZmdfaGVpZ2h0KTsKLQltdnZfd3JpdGUoMHgxOSwgZmdfaGVpZ2h0Pj44KTsKKwltdnZfd3JpdGUoZGV2LCAweDE4LCBmZ19oZWlnaHQpOworCW12dl93cml0ZShkZXYsIDB4MTksIGZnX2hlaWdodCA+PiA4KTsKIAotCWlmKHN0YW5kYXJkPT0xKQotCXsKLQkJbXZ2X3dyaXRlKDB4MUEsIDB4RkMpOwotCQltdnZfd3JpdGUoMHgxQiwgMHgwMCk7Ci0JCWlmKGhlaWdodD5mZ19oZWlnaHQpCi0JCQlwbXNfdmVydGRlY2koMjQwLDI0MCk7CisJaWYgKGRldi0+c3RkICYgVjRMMl9TVERfNTI1XzYwKSB7CisJCW12dl93cml0ZShkZXYsIDB4MWEsIDB4ZmMpOworCQltdnZfd3JpdGUoZGV2LCAweDFiLCAweDAwKTsKKwkJaWYgKGhlaWdodCA+IGZnX2hlaWdodCkKKwkJCXBtc192ZXJ0ZGVjaShkZXYsIDI0MCwgMjQwKTsKIAkJZWxzZQotCQkJcG1zX3ZlcnRkZWNpKGZnX2hlaWdodCwyNDApOwotCX0KLQllbHNlCi0JewotCQltdnZfd3JpdGUoMHgxQSwgMHgxQSk7Ci0JCW12dl93cml0ZSgweDFCLCAweDAxKTsKLQkJaWYoZmdfaGVpZ2h0PjI1NikKLQkJCXBtc192ZXJ0ZGVjaSgyNzAsMjcwKTsKKwkJCXBtc192ZXJ0ZGVjaShkZXYsIGZnX2hlaWdodCwgMjQwKTsKKwl9IGVsc2UgeworCQltdnZfd3JpdGUoZGV2LCAweDFhLCAweDFhKTsKKwkJbXZ2X3dyaXRlKGRldiwgMHgxYiwgMHgwMSk7CisJCWlmIChmZ19oZWlnaHQgPiAyNTYpCisJCQlwbXNfdmVydGRlY2koZGV2LCAyNzAsIDI3MCk7CiAJCWVsc2UKLQkJCXBtc192ZXJ0ZGVjaShmZ19oZWlnaHQsIDI3MCk7CisJCQlwbXNfdmVydGRlY2koZGV2LCBmZ19oZWlnaHQsIDI3MCk7CiAJfQotCW12dl93cml0ZSgweDEyLDApOwotCW12dl93cml0ZSgweDEzLCBNVlZNRU1PUllXSURUSCk7Ci0JbXZ2X3dyaXRlKDB4NDIsIDB4MDApOwotCW12dl93cml0ZSgweDQzLCAweDAwKTsKLQltdnZfd3JpdGUoMHg0NCwgTVZWTUVNT1JZV0lEVEgpOworCW12dl93cml0ZShkZXYsIDB4MTIsIDApOworCW12dl93cml0ZShkZXYsIDB4MTMsIE1WVk1FTU9SWVdJRFRIKTsKKwltdnZfd3JpdGUoZGV2LCAweDQyLCAweDAwKTsKKwltdnZfd3JpdGUoZGV2LCAweDQzLCAweDAwKTsKKwltdnZfd3JpdGUoZGV2LCAweDQ0LCBNVlZNRU1PUllXSURUSCk7CiAKLQltdnZfd3JpdGUoMHgyMiwgd2lkdGgrOCk7Ci0JbXZ2X3dyaXRlKDB4MjMsICh3aWR0aCs4KT4+IDgpOworCW12dl93cml0ZShkZXYsIDB4MjIsIHdpZHRoICsgOCk7CisJbXZ2X3dyaXRlKGRldiwgMHgyMywgKHdpZHRoICsgOCkgPj4gOCk7CiAKLQlpZihzdGFuZGFyZD09MSkKLQkJcG1zX2hvcnpkZWNpKHdpZHRoLDY0MCk7CisJaWYgKGRldi0+c3RkICYgVjRMMl9TVERfNTI1XzYwKQorCQlwbXNfaG9yemRlY2koZGV2LCB3aWR0aCwgNjQwKTsKIAllbHNlCi0JCXBtc19ob3J6ZGVjaSh3aWR0aCs4LCA3NjgpOworCQlwbXNfaG9yemRlY2koZGV2LCB3aWR0aCArIDgsIDc2OCk7CiAKLQltdnZfd3JpdGUoMHgzMCwgbXZ2X3JlYWQoMHgzMCkmMHhGRSk7Ci0JbXZ2X3dyaXRlKDB4MDgsIG12dl9yZWFkKDB4MDgpfDB4MDEpOwotCW12dl93cml0ZSgweDAxLCBtdnZfcmVhZCgweDAxKSYweEZEKTsKLQltdnZfd3JpdGUoMHgzMiwgMHgwMCk7Ci0JbXZ2X3dyaXRlKDB4MzMsIE1WVk1FTU9SWVdJRFRIKTsKKwltdnZfd3JpdGUoZGV2LCAweDMwLCBtdnZfcmVhZChkZXYsIDB4MzApICYgMHhmZSk7CisJbXZ2X3dyaXRlKGRldiwgMHgwOCwgbXZ2X3JlYWQoZGV2LCAweDA4KSB8IDB4MDEpOworCW12dl93cml0ZShkZXYsIDB4MDEsIG12dl9yZWFkKGRldiwgMHgwMSkgJiAweGZkKTsKKwltdnZfd3JpdGUoZGV2LCAweDMyLCAweDAwKTsKKwltdnZfd3JpdGUoZGV2LCAweDMzLCBNVlZNRU1PUllXSURUSCk7CiB9CiAKIApAQCAtNjIxLDUyICs2MTYsNDkgQEAKICAqCVNldCBJbnB1dAogICovCiAKLXN0YXRpYyB2b2lkIHBtc192Y3JpbnB1dChzaG9ydCBpbnB1dCkKK3N0YXRpYyB2b2lkIHBtc192Y3JpbnB1dChzdHJ1Y3QgcG1zICpkZXYsIHNob3J0IGlucHV0KQogewotCWlmKGRlY29kZXI9PVBISUxJUFMyKQotCQlwbXNfaTJjX2FuZG9yKDB4OEEsMHgwRCwweDdGLChpbnB1dCYxKTw8Nyk7Ci0JZWxzZSBpZihkZWNvZGVyPT1QSElMSVBTMSkKLQkJcG1zX2kyY19hbmRvcigweDQyLDB4MEQsMHg3RiwoaW5wdXQmMSk8PDcpOworCWlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzIpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDhhLCAweDBkLCAweDdmLCAoaW5wdXQgJiAxKSA8PCA3KTsKKwllbHNlIGlmIChkZXYtPmRlY29kZXIgPT0gUEhJTElQUzEpCisJCXBtc19pMmNfYW5kb3IoZGV2LCAweDQyLCAweDBkLCAweDdmLCAoaW5wdXQgJiAxKSA8PCA3KTsKIH0KIAogCi1zdGF0aWMgaW50IHBtc19jYXB0dXJlKHN0cnVjdCBwbXNfZGV2aWNlICpkZXYsIGNoYXIgX191c2VyICpidWYsIGludCByZ2I1NTUsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgcG1zX2NhcHR1cmUoc3RydWN0IHBtcyAqZGV2LCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgcmdiNTU1LCBpbnQgY291bnQpCiB7CiAJaW50IHk7Ci0JaW50IGR3ID0gMipkZXYtPndpZHRoOwotCi0JY2hhciB0bXBbZHcrMzJdOyAvKiB1c2luZyBhIHRlbXAgYnVmZmVyIGlzIGZhc3RlciB0aGFuIGRpcmVjdCAgKi8KKwlpbnQgZHcgPSAyICogZGV2LT53aWR0aDsKKwljaGFyIHRtcFtkdyArIDMyXTsgLyogdXNpbmcgYSB0ZW1wIGJ1ZmZlciBpcyBmYXN0ZXIgdGhhbiBkaXJlY3QgICovCiAJaW50IGNudCA9IDA7Ci0JaW50IGxlbj0wOworCWludCBsZW4gPSAwOwogCXVuc2lnbmVkIGNoYXIgcjggPSAweDU7ICAvKiB2YWx1ZSBmb3IgcmVnOCAgKi8KIAogCWlmIChyZ2I1NTUpCiAJCXI4IHw9IDB4MjA7IC8qIGVsc2UgdXNlIHVudHJhbnNsYXRlZCByZ2IgPSA1NjUgKi8KLQltdnZfd3JpdGUoMHgwOCxyOCk7IC8qIGNhcHR1cmUgcmdiNTU1LzU2NSwgaW5pdCBEUkFNLCBQQyBlbmFibGUgKi8KKwltdnZfd3JpdGUoZGV2LCAweDA4LCByOCk7IC8qIGNhcHR1cmUgcmdiNTU1LzU2NSwgaW5pdCBEUkFNLCBQQyBlbmFibGUgKi8KIAogLyoJcHJpbnRmKCIlZCAlZCAlZCAlZCAlZCAleCAleFxuIix3aWR0aCxoZWlnaHQsdm9mZixub20sZGVuLG12dl9idWYpOyAqLwogCi0JZm9yICh5ID0gMDsgeSA8IGRldi0+aGVpZ2h0OyB5KysgKQotCXsKLQkJd3JpdGViKDAsIG1lbSk7ICAvKiBzeW5jaHJvbmlzaWVydCBuZXVlIFplaWxlICovCisJZm9yICh5ID0gMDsgeSA8IGRldi0+aGVpZ2h0OyB5KyspIHsKKwkJd3JpdGViKDAsIGRldi0+bWVtKTsgIC8qIHN5bmNocm9uaXNpZXJ0IG5ldWUgWmVpbGUgKi8KIAogCQkvKgogCQkgKglUaGlzIGlzIGluIHRydXRoIGEgZmlmbywgYmUgdmVyeSBjYXJlZnVsIGFzIGlmIHlvdQogCQkgKglmb3Jnb3QgdGhpcyBvZGQgdGhpbmdzIHdpbGwgb2NjdXIgOCkKIAkJICovCiAKLQkJbWVtY3B5X2Zyb21pbyh0bXAsIG1lbSwgZHcrMzIpOyAvKiBkaXNjYXJkIDE2IHdvcmQgICAqLworCQltZW1jcHlfZnJvbWlvKHRtcCwgZGV2LT5tZW0sIGR3ICsgMzIpOyAvKiBkaXNjYXJkIDE2IHdvcmQgICAqLwogCQljbnQgLT0gZGV2LT5oZWlnaHQ7Ci0JCXdoaWxlIChjbnQgPD0gMCkKLQkJeworCQl3aGlsZSAoY250IDw9IDApIHsKIAkJCS8qCiAJCQkgKglEb24ndCBjb3B5IHRvbyBmYXIKIAkJCSAqLwotCQkJaW50IGR0PWR3OwotCQkJaWYoZHQrbGVuPmNvdW50KQotCQkJCWR0PWNvdW50LWxlbjsKKwkJCWludCBkdCA9IGR3OworCQkJaWYgKGR0ICsgbGVuID4gY291bnQpCisJCQkJZHQgPSBjb3VudCAtIGxlbjsKIAkJCWNudCArPSBkZXYtPmhlaWdodDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB0bXArMzIsIGR0KSkKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB0bXAgKyAzMiwgZHQpKQogCQkJCXJldHVybiBsZW4gPyBsZW4gOiAtRUZBVUxUOwogCQkJYnVmICs9IGR0OwogCQkJbGVuICs9IGR0OwpAQCAtNjgwLDIyMSArNjcyLDI3OCBAQAogICoJVmlkZW80bGludXggaW50ZXJmYWNpbmcKICAqLwogCi1zdGF0aWMgbG9uZyBwbXNfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgcG1zX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdmNhcCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBwbXNfZGV2aWNlICpwZD0oc3RydWN0IHBtc19kZXZpY2UgKilkZXY7CisJc3RydWN0IHBtcyAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCXN3aXRjaChjbWQpCi0JewotCQljYXNlIFZJRElPQ0dDQVA6Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpiID0gYXJnOwotCQkJc3RyY3B5KGItPm5hbWUsICJNZWRpYXZpc2lvbiBQTVMiKTsKLQkJCWItPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFfFZJRF9UWVBFX1NDQUxFUzsKLQkJCWItPmNoYW5uZWxzID0gNDsKLQkJCWItPmF1ZGlvcyA9IDA7Ci0JCQliLT5tYXh3aWR0aCA9IDY0MDsKLQkJCWItPm1heGhlaWdodCA9IDQ4MDsKLQkJCWItPm1pbndpZHRoID0gMTY7Ci0JCQliLT5taW5oZWlnaHQgPSAxNjsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DR0NIQU46Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOwotCQkJaWYodi0+Y2hhbm5lbDwwIHx8IHYtPmNoYW5uZWw+MykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXYtPmZsYWdzPTA7Ci0JCQl2LT50dW5lcnM9MTsKLQkJCS8qIEdvb2QgcXVlc3Rpb24uLiBpdHMgY29tcG9zaXRlIG9yIFNWSFMgc28uLiAqLwotCQkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOwotCQkJc3dpdGNoKHYtPmNoYW5uZWwpCi0JCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlzdHJjcHkodi0+bmFtZSwgIkNvbXBvc2l0ZSIpO2JyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJc3RyY3B5KHYtPm5hbWUsICJTVmlkZW8iKTticmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCXN0cmNweSh2LT5uYW1lLCAiQ29tcG9zaXRlKFZDUikiKTticmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCXN0cmNweSh2LT5uYW1lLCAiU1ZpZGVvKFZDUikiKTticmVhazsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DU0NIQU46Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOwotCQkJaWYodi0+Y2hhbm5lbDwwIHx8IHYtPmNoYW5uZWw+MykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCW11dGV4X2xvY2soJnBkLT5sb2NrKTsKLQkJCXBtc192aWRlb3NvdXJjZSh2LT5jaGFubmVsJjEpOwotCQkJcG1zX3ZjcmlucHV0KHYtPmNoYW5uZWw+PjEpOwotCQkJbXV0ZXhfdW5sb2NrKCZwZC0+bG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ0dUVU5FUjoKLQkJewotCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJaWYodi0+dHVuZXIpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIkZvcm1hdCIpOwotCQkJdi0+cmFuZ2Vsb3c9MDsKLQkJCXYtPnJhbmdlaGlnaD0wOwotCQkJdi0+ZmxhZ3M9IFZJREVPX1RVTkVSX1BBTHxWSURFT19UVU5FUl9OVFNDfFZJREVPX1RVTkVSX1NFQ0FNOwotCQkJc3dpdGNoKHN0YW5kYXJkKQotCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJdi0+bW9kZSA9IFZJREVPX01PREVfQVVUTzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQl2LT5tb2RlID0gVklERU9fTU9ERV9OVFNDOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCXYtPm1vZGUgPSBWSURFT19NT0RFX1BBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQl2LT5tb2RlID0gVklERU9fTU9ERV9TRUNBTTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ1NUVU5FUjoKLQkJewotCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJaWYodi0+dHVuZXIpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQltdXRleF9sb2NrKCZwZC0+bG9jayk7Ci0JCQlzd2l0Y2godi0+bW9kZSkKLQkJCXsKLQkJCQljYXNlIFZJREVPX01PREVfQVVUTzoKLQkJCQkJcG1zX2ZyYW1lcmF0ZSgyNSk7Ci0JCQkJCXBtc19zZWNhbWNyb3NzKDApOwotCQkJCQlwbXNfZm9ybWF0KDApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFZJREVPX01PREVfTlRTQzoKLQkJCQkJcG1zX2ZyYW1lcmF0ZSgzMCk7Ci0JCQkJCXBtc19zZWNhbWNyb3NzKDApOwotCQkJCQlwbXNfZm9ybWF0KDEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFZJREVPX01PREVfUEFMOgotCQkJCQlwbXNfZnJhbWVyYXRlKDI1KTsKLQkJCQkJcG1zX3NlY2FtY3Jvc3MoMCk7Ci0JCQkJCXBtc19mb3JtYXQoMik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKLQkJCQkJcG1zX2ZyYW1lcmF0ZSgyNSk7Ci0JCQkJCXBtc19zZWNhbWNyb3NzKDEpOwotCQkJCQlwbXNfZm9ybWF0KDIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQltdXRleF91bmxvY2soJnBkLT5sb2NrKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQltdXRleF91bmxvY2soJnBkLT5sb2NrKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DR1BJQ1Q6Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOwotCQkJKnAgPSBwZC0+cGljdHVyZTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DU1BJQ1Q6Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOwotCQkJaWYoISgocC0+cGFsZXR0ZT09VklERU9fUEFMRVRURV9SR0I1NjUgJiYgcC0+ZGVwdGg9PTE2KQotCQkJICAgIHx8KHAtPnBhbGV0dGU9PVZJREVPX1BBTEVUVEVfUkdCNTU1ICYmIHAtPmRlcHRoPT0xNSkpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJcGQtPnBpY3R1cmU9ICpwOwotCi0JCQkvKgotCQkJICoJTm93IGxvYWQgdGhlIGNhcmQuCi0JCQkgKi8KLQotCQkJbXV0ZXhfbG9jaygmcGQtPmxvY2spOwotCQkJcG1zX2JyaWdodG5lc3MocC0+YnJpZ2h0bmVzcz4+OCk7Ci0JCQlwbXNfaHVlKHAtPmh1ZT4+OCk7Ci0JCQlwbXNfY29sb3VyKHAtPmNvbG91cj4+OCk7Ci0JCQlwbXNfY29udHJhc3QocC0+Y29udHJhc3Q+PjgpOwotCQkJbXV0ZXhfdW5sb2NrKCZwZC0+bG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ1NXSU46Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOwotCQkJaWYodnctPmZsYWdzKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYodnctPmNsaXBjb3VudCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmKHZ3LT5oZWlnaHQ8MTZ8fHZ3LT5oZWlnaHQ+NDgwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYodnctPndpZHRoPDE2fHx2dy0+d2lkdGg+NjQwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJcGQtPndpZHRoPXZ3LT53aWR0aDsKLQkJCXBkLT5oZWlnaHQ9dnctPmhlaWdodDsKLQkJCW11dGV4X2xvY2soJnBkLT5sb2NrKTsKLQkJCXBtc19yZXNvbHV0aW9uKHBkLT53aWR0aCwgcGQtPmhlaWdodCk7Ci0JCQltdXRleF91bmxvY2soJnBkLT5sb2NrKTsJCQkvKiBPayB3ZSBmaWd1cmVkIG91dCB3aGF0IHRvIHVzZSBmcm9tIG91ciB3aWRlIGNob2ljZSAqLwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NHV0lOOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKLQkJCW1lbXNldCh2dywwLHNpemVvZigqdncpKTsKLQkJCXZ3LT53aWR0aD1wZC0+d2lkdGg7Ci0JCQl2dy0+aGVpZ2h0PXBkLT5oZWlnaHQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ0tFWToKLQkJCXJldHVybiAwOwotCQljYXNlIFZJRElPQ0NBUFRVUkU6Ci0JCWNhc2UgVklESU9DR0ZCVUY6Ci0JCWNhc2UgVklESU9DU0ZCVUY6Ci0JCWNhc2UgVklESU9DR0ZSRVE6Ci0JCWNhc2UgVklESU9DU0ZSRVE6Ci0JCWNhc2UgVklESU9DR0FVRElPOgotCQljYXNlIFZJRElPQ1NBVURJTzoKLQkJCXJldHVybiAtRUlOVkFMOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9CisJc3RybGNweSh2Y2FwLT5kcml2ZXIsIGRldi0+djRsMl9kZXYubmFtZSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOworCXN0cmxjcHkodmNhcC0+Y2FyZCwgIk1lZGlhdmlzaW9uIFBNUyIsIHNpemVvZih2Y2FwLT5jYXJkKSk7CisJc3RybGNweSh2Y2FwLT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2Y2FwLT5idXNfaW5mbykpOworCXZjYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAwLCAzKTsKKwl2Y2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfUkVBRFdSSVRFOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgbG9uZyBwbXNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHBtc19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfaW5wdXQgKnZpbikKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIHBtc19kb19pb2N0bCk7CisJc3RhdGljIGNvbnN0IGNoYXIgKmlucHV0c1s0XSA9IHsKKwkJIkNvbXBvc2l0ZSIsCisJCSJTLVZpZGVvIiwKKwkJIkNvbXBvc2l0ZSAoVkNSKSIsCisJCSJTLVZpZGVvIChWQ1IpIgorCX07CisKKwlpZiAodmluLT5pbmRleCA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCXN0cmxjcHkodmluLT5uYW1lLCBpbnB1dHNbdmluLT5pbmRleF0sIHNpemVvZih2aW4tPm5hbWUpKTsKKwl2aW4tPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCXZpbi0+YXVkaW9zZXQgPSAwOworCXZpbi0+dHVuZXIgPSAwOworCXZpbi0+c3RkID0gVjRMMl9TVERfQUxMOworCXZpbi0+c3RhdHVzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXNfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCAqaW5wKQoreworCXN0cnVjdCBwbXMgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwkqaW5wID0gZGV2LT5pbnB1dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXNfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCBpbnApCit7CisJc3RydWN0IHBtcyAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCWlmIChpbnAgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJZGV2LT5pbnB1dCA9IGlucDsKKwlwbXNfdmlkZW9zb3VyY2UoZGV2LCBpbnAgJiAxKTsKKwlwbXNfdmNyaW5wdXQoZGV2LCBpbnAgPj4gMSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtc19nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJc3RydWN0IHBtcyAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCSpzdGQgPSBkZXYtPnN0ZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXNfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqc3RkKQoreworCXN0cnVjdCBwbXMgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJaW50IHJldCA9IDA7CisKKwlkZXYtPnN0ZCA9ICpzdGQ7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlpZiAoZGV2LT5zdGQgJiBWNEwyX1NURF9OVFNDKSB7CisJCXBtc19mcmFtZXJhdGUoZGV2LCAzMCk7CisJCXBtc19zZWNhbWNyb3NzKGRldiwgMCk7CisJCXBtc19mb3JtYXQoZGV2LCAxKTsKKwl9IGVsc2UgaWYgKGRldi0+c3RkICYgVjRMMl9TVERfUEFMKSB7CisJCXBtc19mcmFtZXJhdGUoZGV2LCAyNSk7CisJCXBtc19zZWNhbWNyb3NzKGRldiwgMCk7CisJCXBtc19mb3JtYXQoZGV2LCAyKTsKKwl9IGVsc2UgaWYgKGRldi0+c3RkICYgVjRMMl9TVERfU0VDQU0pIHsKKwkJcG1zX2ZyYW1lcmF0ZShkZXYsIDI1KTsKKwkJcG1zX3NlY2FtY3Jvc3MoZGV2LCAxKTsKKwkJcG1zX2Zvcm1hdChkZXYsIDIpOworCX0gZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCS8qCisJc3dpdGNoICh2LT5tb2RlKSB7CisJY2FzZSBWSURFT19NT0RFX0FVVE86CisJCXBtc19mcmFtZXJhdGUoZGV2LCAyNSk7CisJCXBtc19zZWNhbWNyb3NzKGRldiwgMCk7CisJCXBtc19mb3JtYXQoZGV2LCAwKTsKKwkJYnJlYWs7CisJfSovCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtc19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJc3dpdGNoIChxYy0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgMCwgMjU1LCAxLCAxMzkpOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgMCwgMjU1LCAxLCA3MCk7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDI1NSwgMSwgNjQpOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDI1NSwgMSwgMCk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBtc19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHBtcyAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWN0cmwtPnZhbHVlID0gZGV2LT5icmlnaHRuZXNzOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQljdHJsLT52YWx1ZSA9IGRldi0+Y29udHJhc3Q7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJY3RybC0+dmFsdWUgPSBkZXYtPnNhdHVyYXRpb247CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQljdHJsLT52YWx1ZSA9IGRldi0+aHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbXNfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBwbXMgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWRldi0+YnJpZ2h0bmVzcyA9IGN0cmwtPnZhbHVlOworCQlwbXNfYnJpZ2h0bmVzcyhkZXYsIGRldi0+YnJpZ2h0bmVzcyk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWRldi0+Y29udHJhc3QgPSBjdHJsLT52YWx1ZTsKKwkJcG1zX2NvbnRyYXN0KGRldiwgZGV2LT5jb250cmFzdCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJZGV2LT5zYXR1cmF0aW9uID0gY3RybC0+dmFsdWU7CisJCXBtc19zYXR1cmF0aW9uKGRldiwgZGV2LT5zYXR1cmF0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWRldi0+aHVlID0gY3RybC0+dmFsdWU7CisJCXBtc19odWUoZGV2LCBkZXYtPmh1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbXNfZ19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBwbXMgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmZtdC0+Zm10LnBpeDsKKworCXBpeC0+d2lkdGggPSBkZXYtPndpZHRoOworCXBpeC0+aGVpZ2h0ID0gZGV2LT5oZWlnaHQ7CisJcGl4LT5waXhlbGZvcm1hdCA9IGRldi0+d2lkdGggPT0gMTUgPworCQkJICAgIFY0TDJfUElYX0ZNVF9SR0I1NTUgOiBWNEwyX1BJWF9GTVRfUkdCNTY1OworCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJcGl4LT5ieXRlc3BlcmxpbmUgPSAyICogZGV2LT53aWR0aDsKKwlwaXgtPnNpemVpbWFnZSA9IDIgKiBkZXYtPndpZHRoICogZGV2LT5oZWlnaHQ7CisJLyogSnVzdCBhIGd1ZXNzICovCisJcGl4LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1zX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmbXQtPmZtdC5waXg7CisKKwlpZiAocGl4LT5oZWlnaHQgPCAxNiB8fCBwaXgtPmhlaWdodCA+IDQ4MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBpeC0+d2lkdGggPCAxNiB8fCBwaXgtPndpZHRoID4gNjQwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGl4LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfUkdCNTU1ICYmCisJICAgIHBpeC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1JHQjU2NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlwaXgtPmJ5dGVzcGVybGluZSA9IDIgKiBwaXgtPndpZHRoOworCXBpeC0+c2l6ZWltYWdlID0gMiAqIHBpeC0+d2lkdGggKiBwaXgtPmhlaWdodDsKKwkvKiBKdXN0IGEgZ3Vlc3MgKi8KKwlwaXgtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXNfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBwbXMgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmZtdC0+Zm10LnBpeDsKKwlpbnQgcmV0ID0gcG1zX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZm10KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlkZXYtPndpZHRoID0gcGl4LT53aWR0aDsKKwlkZXYtPmhlaWdodCA9IHBpeC0+aGVpZ2h0OworCWRldi0+ZGVwdGggPSAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfUkdCNTU1KSA/IDE1IDogMTY7CisJcG1zX3Jlc29sdXRpb24oZGV2LCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCk7CisJLyogT2sgd2UgZmlndXJlZCBvdXQgd2hhdCB0byB1c2UgZnJvbSBvdXIgd2lkZSBjaG9pY2UgKi8KKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1zX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCit7CisJc3RhdGljIHN0cnVjdCB2NGwyX2ZtdGRlc2MgZm9ybWF0c1tdID0geworCQl7IDAsIDAsIDAsCisJCSAgIlJHQiA1OjU6NSIsIFY0TDJfUElYX0ZNVF9SR0I1NTUsCisJCSAgeyAwLCAwLCAwLCAwIH0KKwkJfSwKKwkJeyAwLCAwLCAwLAorCQkgICJSR0IgNTo2OjUiLCBWNEwyX1BJWF9GTVRfUkdCNTY1LAorCQkgIHsgMCwgMCwgMCwgMCB9CisJCX0sCisJfTsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IGZtdC0+dHlwZTsKKworCWlmIChmbXQtPmluZGV4ID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqZm10ID0gZm9ybWF0c1tmbXQtPmluZGV4XTsKKwlmbXQtPnR5cGUgPSB0eXBlOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBwbXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBwbXNfZGV2aWNlICpwZD0oc3RydWN0IHBtc19kZXZpY2UgKil2OworCXN0cnVjdCBwbXMgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IGxlbjsKIAotCW11dGV4X2xvY2soJnBkLT5sb2NrKTsKLQlsZW49cG1zX2NhcHR1cmUocGQsIGJ1ZiwgKHBkLT5waWN0dXJlLmRlcHRoPT0xNik/MDoxLGNvdW50KTsKLQltdXRleF91bmxvY2soJnBkLT5sb2NrKTsKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCWxlbiA9IHBtc19jYXB0dXJlKGRldiwgYnVmLCAoZGV2LT5kZXB0aCA9PSAxNSksIGNvdW50KTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIGludCBwbXNfZXhjbHVzaXZlX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHBtc19kZXZpY2UgKnBkID0gKHN0cnVjdCBwbXNfZGV2aWNlICopdjsKKwlzdHJ1Y3QgcG1zICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnBkLT5pbl91c2UpID8gLUVCVVNZIDogMDsKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5pbl91c2UpID8gLUVCVVNZIDogMDsKIH0KIAogc3RhdGljIGludCBwbXNfZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHBtc19kZXZpY2UgKnBkID0gKHN0cnVjdCBwbXNfZGV2aWNlICopdjsKKwlzdHJ1Y3QgcG1zICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JY2xlYXJfYml0KDAsICZwZC0+aW5fdXNlKTsKKwljbGVhcl9iaXQoMCwgJmRldi0+aW5fdXNlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTAyLDc4ICs5NTEsODEgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gcG1zX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHBtc19leGNsdXNpdmVfcmVsZWFzZSwKLQkuaW9jdGwgICAgICAgICAgPSBwbXNfaW9jdGwsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkucmVhZCAgICAgICAgICAgPSBwbXNfcmVhZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHBtc190ZW1wbGF0ZT0KLXsKLQkubmFtZQkJPSAiTWVkaWF2aXNpb24gUE1TIiwKLQkuZm9wcyAgICAgICAgICAgPSAmcG1zX2ZvcHMsCi0JLnJlbGVhc2UgCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHBtc19pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcCAgICAJCSAgICA9IHBtc19xdWVyeWNhcCwKKwkudmlkaW9jX2dfaW5wdXQgICAgICAJCSAgICA9IHBtc19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgIAkJICAgID0gcG1zX3NfaW5wdXQsCisJLnZpZGlvY19lbnVtX2lucHV0ICAgCQkgICAgPSBwbXNfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfc3RkIAkJCSAgICA9IHBtc19nX3N0ZCwKKwkudmlkaW9jX3Nfc3RkIAkJCSAgICA9IHBtc19zX3N0ZCwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAJCSAgICA9IHBtc19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgIAkJICAgID0gcG1zX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybCAJCQkgICAgPSBwbXNfc19jdHJsLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCAJICAgID0gcG1zX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwIAkJICAgID0gcG1zX2dfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwICAJCSAgICA9IHBtc19zX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICAJICAgID0gcG1zX3RyeV9mbXRfdmlkX2NhcCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG1zX2RldmljZSBwbXNfZGV2aWNlOwotCi0KIC8qCiAgKglQcm9iZSBmb3IgYW5kIGluaXRpYWxpc2UgdGhlIE1lZGlhdmlzaW9uIFBNUwogICovCiAKLXN0YXRpYyBpbnQgaW5pdF9tZWRpYXZpc2lvbih2b2lkKQorc3RhdGljIGludCBpbml0X21lZGlhdmlzaW9uKHN0cnVjdCBwbXMgKmRldikKIHsKIAlpbnQgaWQ7CiAJaW50IGlkZWMsIGRlY3N0OwogCWludCBpOwotCi0JdW5zaWduZWQgY2hhciBpMmNfZGVmc1tdPXsKLQkJMHg0QywweDMwLDB4MDAsMHhFOCwKLQkJMHhCNiwweEUyLDB4MDAsMHgwMCwKLQkJMHhGRiwweEZGLDB4MDAsMHgwMCwKLQkJMHgwMCwweDAwLDB4NzgsMHg5OCwKLQkJMHgwMCwweDAwLDB4MDAsMHgwMCwKLQkJMHgzNCwweDBBLDB4RjQsMHhDRSwKLQkJMHhFNAorCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGkyY19kZWZzW10gPSB7CisJCTB4NGMsIDB4MzAsIDB4MDAsIDB4ZTgsCisJCTB4YjYsIDB4ZTIsIDB4MDAsIDB4MDAsCisJCTB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4NzgsIDB4OTgsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MzQsIDB4MGEsIDB4ZjQsIDB4Y2UsCisJCTB4ZTQKIAl9OwogCi0JbWVtID0gaW9yZW1hcChtZW1fYmFzZSwgMHg4MDApOwotCWlmICghbWVtKQorCWRldi0+bWVtID0gaW9yZW1hcChtZW1fYmFzZSwgMHg4MDApOworCWlmICghZGV2LT5tZW0pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbigweDlBMDEsIDEsICJNZWRpYXZpc2lvbiBQTVMgY29uZmlnIikpCi0JewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWRpYXZpc2lvbjogdW5hYmxlIHRvIGRldGVjdDogMHg5QTAxIGluIHVzZS5cbiIpOwotCQlpb3VubWFwKG1lbSk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbigweDlhMDEsIDEsICJNZWRpYXZpc2lvbiBQTVMgY29uZmlnIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVkaWF2aXNpb246IHVuYWJsZSB0byBkZXRlY3Q6IDB4OWEwMSBpbiB1c2UuXG4iKTsKKwkJaW91bm1hcChkZXYtPm1lbSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgMywgIk1lZGlhdmlzaW9uIFBNUyIpKQotCXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVkaWF2aXNpb246IEkvTyBwb3J0ICVkIGluIHVzZS5cbiIsIGlvX3BvcnQpOwotCQlyZWxlYXNlX3JlZ2lvbigweDlBMDEsIDEpOwotCQlpb3VubWFwKG1lbSk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmlvLCAzLCAiTWVkaWF2aXNpb24gUE1TIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVkaWF2aXNpb246IEkvTyBwb3J0ICVkIGluIHVzZS5cbiIsIGRldi0+aW8pOworCQlyZWxlYXNlX3JlZ2lvbigweDlhMDEsIDEpOworCQlpb3VubWFwKGRldi0+bWVtKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0Jb3V0YigweEI4LCAweDlBMDEpOwkJLyogVW5sb2NrICovCi0Jb3V0Yihpb19wb3J0Pj40LCAweDlBMDEpOwkvKiBTZXQgSU8gcG9ydCAqLworCW91dGIoMHhiOCwgMHg5YTAxKTsJCS8qIFVubG9jayAqLworCW91dGIoZGV2LT5pbyA+PiA0LCAweDlhMDEpOwkvKiBTZXQgSU8gcG9ydCAqLwogCiAKLQlpZD1tdnZfcmVhZCgzKTsKLQlkZWNzdD1wbXNfaTJjX3N0YXQoMHg0Myk7CisJaWQgPSBtdnZfcmVhZChkZXYsIDMpOworCWRlY3N0ID0gcG1zX2kyY19zdGF0KGRldiwgMHg0Myk7CiAKLQlpZihkZWNzdCE9LTEpCi0JCWlkZWM9MjsKLQllbHNlIGlmKHBtc19pMmNfc3RhdCgweGI5KSE9LTEpCi0JCWlkZWM9MzsKLQllbHNlIGlmKHBtc19pMmNfc3RhdCgweDhiKSE9LTEpCi0JCWlkZWM9MTsKKwlpZiAoZGVjc3QgIT0gLTEpCisJCWlkZWMgPSAyOworCWVsc2UgaWYgKHBtc19pMmNfc3RhdChkZXYsIDB4YjkpICE9IC0xKQorCQlpZGVjID0gMzsKKwllbHNlIGlmIChwbXNfaTJjX3N0YXQoZGV2LCAweDhiKSAhPSAtMSkKKwkJaWRlYyA9IDE7CiAJZWxzZQotCQlpZGVjPTA7CisJCWlkZWMgPSAwOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiUE1TIHR5cGUgaXMgJWRcbiIsIGlkZWMpOwotCWlmKGlkZWMgPT0gMCkgewotCQlyZWxlYXNlX3JlZ2lvbihpb19wb3J0LCAzKTsKLQkJcmVsZWFzZV9yZWdpb24oMHg5QTAxLCAxKTsKLQkJaW91bm1hcChtZW0pOworCWlmIChpZGVjID09IDApIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5pbywgMyk7CisJCXJlbGVhc2VfcmVnaW9uKDB4OWEwMSwgMSk7CisJCWlvdW5tYXAoZGV2LT5tZW0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTk4MSw1MSArMTAzMyw1MCBAQAogCSAqCU9rIHdlIGhhdmUgYSBQTVMgb2Ygc29tZSBzb3J0CiAJICovCiAKLQltdnZfd3JpdGUoMHgwNCwgbWVtX2Jhc2U+PjEyKTsJLyogU2V0IHRoZSBtZW1vcnkgYXJlYSAqLworCW12dl93cml0ZShkZXYsIDB4MDQsIG1lbV9iYXNlID4+IDEyKTsJLyogU2V0IHRoZSBtZW1vcnkgYXJlYSAqLwogCiAJLyogT2sgbm93IGxvYWQgdGhlIGRlZmF1bHRzICovCiAKLQlmb3IoaT0wO2k8MHgxOTtpKyspCi0JewotCQlpZihpMmNfZGVmc1tpXT09MHhGRikKLQkJCXBtc19pMmNfYW5kb3IoMHg4QSwgaSwgMHgwNywweDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgxOTsgaSsrKSB7CisJCWlmIChpMmNfZGVmc1tpXSA9PSAweGZmKQorCQkJcG1zX2kyY19hbmRvcihkZXYsIDB4OGEsIGksIDB4MDcsIDB4MDApOwogCQllbHNlCi0JCQlwbXNfaTJjX3dyaXRlKDB4OEEsIGksIGkyY19kZWZzW2ldKTsKKwkJCXBtc19pMmNfd3JpdGUoZGV2LCAweDhhLCBpLCBpMmNfZGVmc1tpXSk7CiAJfQogCi0JcG1zX2kyY193cml0ZSgweEI4LDB4MDAsMHgxMik7Ci0JcG1zX2kyY193cml0ZSgweEI4LDB4MDQsMHgwMCk7Ci0JcG1zX2kyY193cml0ZSgweEI4LDB4MDcsMHgwMCk7Ci0JcG1zX2kyY193cml0ZSgweEI4LDB4MDgsMHgwMCk7Ci0JcG1zX2kyY193cml0ZSgweEI4LDB4MDksMHhGRik7Ci0JcG1zX2kyY193cml0ZSgweEI4LDB4MEEsMHgwMCk7Ci0JcG1zX2kyY193cml0ZSgweEI4LDB4MEIsMHgxMCk7Ci0JcG1zX2kyY193cml0ZSgweEI4LDB4MTAsMHgwMyk7CisJcG1zX2kyY193cml0ZShkZXYsIDB4YjgsIDB4MDAsIDB4MTIpOworCXBtc19pMmNfd3JpdGUoZGV2LCAweGI4LCAweDA0LCAweDAwKTsKKwlwbXNfaTJjX3dyaXRlKGRldiwgMHhiOCwgMHgwNywgMHgwMCk7CisJcG1zX2kyY193cml0ZShkZXYsIDB4YjgsIDB4MDgsIDB4MDApOworCXBtc19pMmNfd3JpdGUoZGV2LCAweGI4LCAweDA5LCAweGZmKTsKKwlwbXNfaTJjX3dyaXRlKGRldiwgMHhiOCwgMHgwYSwgMHgwMCk7CisJcG1zX2kyY193cml0ZShkZXYsIDB4YjgsIDB4MGIsIDB4MTApOworCXBtc19pMmNfd3JpdGUoZGV2LCAweGI4LCAweDEwLCAweDAzKTsKIAotCW12dl93cml0ZSgweDAxLCAweDAwKTsKLQltdnZfd3JpdGUoMHgwNSwgMHhBMCk7Ci0JbXZ2X3dyaXRlKDB4MDgsIDB4MjUpOwotCW12dl93cml0ZSgweDA5LCAweDAwKTsKLQltdnZfd3JpdGUoMHgwQSwgMHgyMHxNVlZNRU1PUllXSURUSCk7CisJbXZ2X3dyaXRlKGRldiwgMHgwMSwgMHgwMCk7CisJbXZ2X3dyaXRlKGRldiwgMHgwNSwgMHhhMCk7CisJbXZ2X3dyaXRlKGRldiwgMHgwOCwgMHgyNSk7CisJbXZ2X3dyaXRlKGRldiwgMHgwOSwgMHgwMCk7CisJbXZ2X3dyaXRlKGRldiwgMHgwYSwgMHgyMCB8IE1WVk1FTU9SWVdJRFRIKTsKIAotCW12dl93cml0ZSgweDEwLCAweDAyKTsKLQltdnZfd3JpdGUoMHgxRSwgMHgwQyk7Ci0JbXZ2X3dyaXRlKDB4MUYsIDB4MDMpOwotCW12dl93cml0ZSgweDI2LCAweDA2KTsKKwltdnZfd3JpdGUoZGV2LCAweDEwLCAweDAyKTsKKwltdnZfd3JpdGUoZGV2LCAweDFlLCAweDBjKTsKKwltdnZfd3JpdGUoZGV2LCAweDFmLCAweDAzKTsKKwltdnZfd3JpdGUoZGV2LCAweDI2LCAweDA2KTsKIAotCW12dl93cml0ZSgweDJCLCAweDAwKTsKLQltdnZfd3JpdGUoMHgyQywgMHgyMCk7Ci0JbXZ2X3dyaXRlKDB4MkQsIDB4MDApOwotCW12dl93cml0ZSgweDJGLCAweDcwKTsKLQltdnZfd3JpdGUoMHgzMiwgMHgwMCk7Ci0JbXZ2X3dyaXRlKDB4MzMsIE1WVk1FTU9SWVdJRFRIKTsKLQltdnZfd3JpdGUoMHgzNCwgMHgwMCk7Ci0JbXZ2X3dyaXRlKDB4MzUsIDB4MDApOwotCW12dl93cml0ZSgweDNBLCAweDgwKTsKLQltdnZfd3JpdGUoMHgzQiwgMHgxMCk7Ci0JbXZ2X3dyaXRlKDB4MjAsIDB4MDApOwotCW12dl93cml0ZSgweDIxLCAweDAwKTsKLQltdnZfd3JpdGUoMHgzMCwgMHgyMik7CisJbXZ2X3dyaXRlKGRldiwgMHgyYiwgMHgwMCk7CisJbXZ2X3dyaXRlKGRldiwgMHgyYywgMHgyMCk7CisJbXZ2X3dyaXRlKGRldiwgMHgyZCwgMHgwMCk7CisJbXZ2X3dyaXRlKGRldiwgMHgyZiwgMHg3MCk7CisJbXZ2X3dyaXRlKGRldiwgMHgzMiwgMHgwMCk7CisJbXZ2X3dyaXRlKGRldiwgMHgzMywgTVZWTUVNT1JZV0lEVEgpOworCW12dl93cml0ZShkZXYsIDB4MzQsIDB4MDApOworCW12dl93cml0ZShkZXYsIDB4MzUsIDB4MDApOworCW12dl93cml0ZShkZXYsIDB4M2EsIDB4ODApOworCW12dl93cml0ZShkZXYsIDB4M2IsIDB4MTApOworCW12dl93cml0ZShkZXYsIDB4MjAsIDB4MDApOworCW12dl93cml0ZShkZXYsIDB4MjEsIDB4MDApOworCW12dl93cml0ZShkZXYsIDB4MzAsIDB4MjIpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDM4LDUzICsxMDg5LDc3IEBACiBtb2R1bGVfcGFyYW0oZW5hYmxlLCBpbnQsIDApOwogI2VuZGlmCiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfcG1zX2NhcmRzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwbXNfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gIk1lZGlhdmlzaW9uIFBybyBNb3ZpZSBTdHVkaW8gZHJpdmVyIDAuMDJcbiIpOworCXN0cnVjdCBwbXMgKmRldiA9ICZwbXNfY2FyZDsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gJmRldi0+djRsMl9kZXY7CisJaW50IHJlczsKKworCXN0cmxjcHkodjRsMl9kZXYtPm5hbWUsICJwbXMiLCBzaXplb2YodjRsMl9kZXYtPm5hbWUpKTsKKworCXY0bDJfaW5mbyh2NGwyX2RldiwgIk1lZGlhdmlzaW9uIFBybyBNb3ZpZSBTdHVkaW8gZHJpdmVyIDAuMDNcbiIpOwogCiAjaWZuZGVmIE1PRFVMRQogCWlmICghZW5hYmxlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBNUzogbm90IGVuYWJsZWQsIHVzZSBwbXMuZW5hYmxlPTEgdG8gIgotCQkJCSAicHJvYmVcbiIpOworCQl2NGwyX2Vycih2NGwyX2RldiwKKwkJCSJQTVM6IG5vdCBlbmFibGVkLCB1c2UgcG1zLmVuYWJsZT0xIHRvIHByb2JlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogI2VuZGlmCiAKLQlkYXRhX3BvcnQgPSBpb19wb3J0ICsxOworCWRldi0+ZGVjb2RlciA9IFBISUxJUFMyOworCWRldi0+aW8gPSBpb19wb3J0OworCWRldi0+ZGF0YSA9IGlvX3BvcnQgKyAxOwogCi0JaWYoaW5pdF9tZWRpYXZpc2lvbigpKQotCXsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQm9hcmQgbm90IGZvdW5kLlxuIik7CisJaWYgKGluaXRfbWVkaWF2aXNpb24oZGV2KSkgeworCQl2NGwyX2Vycih2NGwyX2RldiwgIkJvYXJkIG5vdCBmb3VuZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JbWVtY3B5KCZwbXNfZGV2aWNlLCAmcG1zX3RlbXBsYXRlLCBzaXplb2YocG1zX3RlbXBsYXRlKSk7Ci0JbXV0ZXhfaW5pdCgmcG1zX2RldmljZS5sb2NrKTsKLQlwbXNfZGV2aWNlLmhlaWdodD0yNDA7Ci0JcG1zX2RldmljZS53aWR0aD0zMjA7Ci0JcG1zX3N3c2Vuc2UoNzUpOwotCXBtc19yZXNvbHV0aW9uKDMyMCwyNDApOwotCXJldHVybiB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoKHN0cnVjdCB2aWRlb19kZXZpY2UgKikmcG1zX2RldmljZSwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOworCisJcmVzID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoTlVMTCwgdjRsMl9kZXYpOworCWlmIChyZXMgPCAwKSB7CisJCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlzdHJsY3B5KGRldi0+dmRldi5uYW1lLCB2NGwyX2Rldi0+bmFtZSwgc2l6ZW9mKGRldi0+dmRldi5uYW1lKSk7CisJZGV2LT52ZGV2LnY0bDJfZGV2ID0gdjRsMl9kZXY7CisJZGV2LT52ZGV2LmZvcHMgPSAmcG1zX2ZvcHM7CisJZGV2LT52ZGV2LmlvY3RsX29wcyA9ICZwbXNfaW9jdGxfb3BzOworCWRldi0+dmRldi5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7CisJdmlkZW9fc2V0X2RydmRhdGEoJmRldi0+dmRldiwgZGV2KTsKKwltdXRleF9pbml0KCZkZXYtPmxvY2spOworCWRldi0+c3RkID0gVjRMMl9TVERfTlRTQ19NOworCWRldi0+aGVpZ2h0ID0gMjQwOworCWRldi0+d2lkdGggPSAzMjA7CisJZGV2LT5kZXB0aCA9IDE1OworCWRldi0+YnJpZ2h0bmVzcyA9IDEzOTsKKwlkZXYtPmNvbnRyYXN0ID0gNzA7CisJZGV2LT5odWUgPSAwOworCWRldi0+c2F0dXJhdGlvbiA9IDY0OworCXBtc19zd3NlbnNlKGRldiwgNzUpOworCXBtc19yZXNvbHV0aW9uKGRldiwgMzIwLCAyNDApOworCXBtc192aWRlb3NvdXJjZShkZXYsIDApOworCXBtc192Y3JpbnB1dChkZXYsIDApOworCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpIDwgMCkgeworCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5pbywgMyk7CisJCXJlbGVhc2VfcmVnaW9uKDB4OWEwMSwgMSk7CisJCWlvdW5tYXAoZGV2LT5tZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLW1vZHVsZV9wYXJhbShpb19wb3J0LCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKG1lbV9iYXNlLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDApOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzaHV0ZG93bl9tZWRpYXZpc2lvbih2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHBtc19leGl0KHZvaWQpCiB7Ci0JcmVsZWFzZV9yZWdpb24oaW9fcG9ydCwzKTsKLQlyZWxlYXNlX3JlZ2lvbigweDlBMDEsIDEpOworCXN0cnVjdCBwbXMgKmRldiA9ICZwbXNfY2FyZDsKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZkZXYtPnZkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+aW8sIDMpOworCXJlbGVhc2VfcmVnaW9uKDB4OWEwMSwgMSk7CisJaW91bm1hcChkZXYtPm1lbSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3Btc19tb2R1bGUodm9pZCkKLXsKLQlzaHV0ZG93bl9tZWRpYXZpc2lvbigpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopJnBtc19kZXZpY2UpOwotCWlvdW5tYXAobWVtKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9wbXNfY2FyZHMpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9wbXNfbW9kdWxlKTsKLQorbW9kdWxlX2luaXQocG1zX2luaXQpOworbW9kdWxlX2V4aXQocG1zX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGVidWdpZmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRlYnVnaWZjLmMKaW5kZXggZmJlMzg1Ni4uYWU5Nzc2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGVidWdpZmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1kZWJ1Z2lmYy5jCkBAIC0xNDIsNiArMTQyLDkgQEAKIHsKIAlpbnQgYmNudCA9IDA7CiAJaW50IGNjbnQ7CisJY2NudCA9IHNjbnByaW50ZihidWYsIGFjbnQsICJEcml2ZXIgaGFyZHdhcmUgZGVzY3JpcHRpb246ICVzXG4iLAorCQkJIHB2cjJfaGR3X2dldF9kZXNjKGhkdykpOworCWJjbnQgKz0gY2NudDsgYWNudCAtPSBjY250OyBidWYgKz0gY2NudDsKIAljY250ID0gc2NucHJpbnRmKGJ1ZixhY250LCJEcml2ZXIgc3RhdGUgaW5mbzpcbiIpOwogCWJjbnQgKz0gY2NudDsgYWNudCAtPSBjY250OyBidWYgKz0gY2NudDsKIAljY250ID0gcHZyMl9oZHdfc3RhdGVfcmVwb3J0KGhkdyxidWYsYWNudCk7CkBAIC0yNDksMTEgKzI1MiwxNSBAQAogCQkJc2NudCA9IGRlYnVnaWZjX2lzb2xhdGVfd29yZChidWYsY291bnQsJndwdHIsJndsZW4pOwogCQkJaWYgKHNjbnQgJiYgd3B0cikgewogCQkJCWNvdW50IC09IHNjbnQ7IGJ1ZiArPSBzY250OwotCQkJCWlmIChkZWJ1Z2lmY19tYXRjaF9rZXl3b3JkKHdwdHIsd2xlbiwicHJvbSIpKSB7Ci0JCQkJCXB2cjJfaGR3X2NwdWZ3X3NldF9lbmFibGVkKGhkdywhMCwhMCk7Ci0JCQkJfSBlbHNlIGlmIChkZWJ1Z2lmY19tYXRjaF9rZXl3b3JkKHdwdHIsd2xlbiwKLQkJCQkJCQkJICAicmFtIikpIHsKLQkJCQkJcHZyMl9oZHdfY3B1Zndfc2V0X2VuYWJsZWQoaGR3LDAsITApOworCQkJCWlmIChkZWJ1Z2lmY19tYXRjaF9rZXl3b3JkKHdwdHIsIHdsZW4sCisJCQkJCQkJICAgInByb20iKSkgeworCQkJCQlwdnIyX2hkd19jcHVmd19zZXRfZW5hYmxlZChoZHcsIDIsICEwKTsKKwkJCQl9IGVsc2UgaWYgKGRlYnVnaWZjX21hdGNoX2tleXdvcmQod3B0ciwgd2xlbiwKKwkJCQkJCQkJICAicmFtOGsiKSkgeworCQkJCQlwdnIyX2hkd19jcHVmd19zZXRfZW5hYmxlZChoZHcsIDAsICEwKTsKKwkJCQl9IGVsc2UgaWYgKGRlYnVnaWZjX21hdGNoX2tleXdvcmQod3B0ciwgd2xlbiwKKwkJCQkJCQkJICAicmFtMTZrIikpIHsKKwkJCQkJcHZyMl9oZHdfY3B1Zndfc2V0X2VuYWJsZWQoaGR3LCAxLCAhMCk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGV2YXR0ci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGV2YXR0ci5jCmluZGV4IGU0ZDdjMTMuLjZiYzE2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRldmF0dHIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1kZXZhdHRyLmMKQEAgLTU4LDcgKzU4LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZyMl9kZXZpY2VfZGVzYyBwdnIyX2RldmljZV8yOXh4eCA9IHsKLQkJLmRlc2NyaXB0aW9uID0gIldpblRWIFBWUiBVU0IyIE1vZGVsIENhdGVnb3J5IDI5eHh4IiwKKwkJLmRlc2NyaXB0aW9uID0gIldpblRWIFBWUiBVU0IyIE1vZGVsIDI5eHh4IiwKIAkJLnNob3J0bmFtZSA9ICIyOXh4eCIsCiAJCS5jbGllbnRfdGFibGUubHN0ID0gcHZyMl9jbGlfMjl4eHgsCiAJCS5jbGllbnRfdGFibGUuY250ID0gQVJSQVlfU0laRShwdnIyX2NsaV8yOXh4eCksCkBAIC05MSw3ICs5MSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHB2cjJfZGV2aWNlX2Rlc2MgcHZyMl9kZXZpY2VfMjR4eHggPSB7Ci0JCS5kZXNjcmlwdGlvbiA9ICJXaW5UViBQVlIgVVNCMiBNb2RlbCBDYXRlZ29yeSAyNHh4eCIsCisJCS5kZXNjcmlwdGlvbiA9ICJXaW5UViBQVlIgVVNCMiBNb2RlbCAyNHh4eCIsCiAJCS5zaG9ydG5hbWUgPSAiMjR4eHgiLAogCQkuY2xpZW50X3RhYmxlLmxzdCA9IHB2cjJfY2xpXzI0eHh4LAogCQkuY2xpZW50X3RhYmxlLmNudCA9IEFSUkFZX1NJWkUocHZyMl9jbGlfMjR4eHgpLApAQCAtMzQwLDcgKzM0MCw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHB2cjJfZGV2aWNlX2Rlc2MgcHZyMl9kZXZpY2VfNzN4eHggPSB7Ci0JCS5kZXNjcmlwdGlvbiA9ICJXaW5UViBIVlItMTkwMCBNb2RlbCBDYXRlZ29yeSA3M3h4eCIsCisJCS5kZXNjcmlwdGlvbiA9ICJXaW5UViBIVlItMTkwMCBNb2RlbCA3M3h4eCIsCiAJCS5zaG9ydG5hbWUgPSAiNzN4eHgiLAogCQkuY2xpZW50X3RhYmxlLmxzdCA9IHB2cjJfY2xpXzczeHh4LAogCQkuY2xpZW50X3RhYmxlLmNudCA9IEFSUkFZX1NJWkUocHZyMl9jbGlfNzN4eHgpLApAQCAtMzUxLDYgKzM1MSw3IEBACiAJCS5mbGFnX2hhc19hbmFsb2d0dW5lciA9ICEwLAogCQkuZmxhZ19oYXNfY29tcG9zaXRlID0gITAsCiAJCS5mbGFnX2hhc19zdmlkZW8gPSAhMCwKKwkJLmZsYWdfZngyXzE2a2IgPSAhMCwKIAkJLnNpZ25hbF9yb3V0aW5nX3NjaGVtZSA9IFBWUjJfUk9VVElOR19TQ0hFTUVfSEFVUFBBVUdFLAogCQkuZGlnaXRhbF9jb250cm9sX3NjaGVtZSA9IFBWUjJfRElHSVRBTF9TQ0hFTUVfSEFVUFBBVUdFLAogCQkubGVkX3NjaGVtZSA9IFBWUjJfTEVEX1NDSEVNRV9IQVVQUEFVR0UsCkBAIC00NDUsNyArNDQ2LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZyMl9kZXZpY2VfZGVzYyBwdnIyX2RldmljZV83NTB4eCA9IHsKLQkJLmRlc2NyaXB0aW9uID0gIldpblRWIEhWUi0xOTUwIE1vZGVsIENhdGVnb3J5IDc1MHh4IiwKKwkJLmRlc2NyaXB0aW9uID0gIldpblRWIEhWUi0xOTUwIE1vZGVsIDc1MHh4IiwKIAkJLnNob3J0bmFtZSA9ICI3NTB4eCIsCiAJCS5jbGllbnRfdGFibGUubHN0ID0gcHZyMl9jbGlfNzN4eHgsCiAJCS5jbGllbnRfdGFibGUuY250ID0gQVJSQVlfU0laRShwdnIyX2NsaV83M3h4eCksCkBAIC00NTYsNiArNDU3LDcgQEAKIAkJLmZsYWdfaGFzX2FuYWxvZ3R1bmVyID0gITAsCiAJCS5mbGFnX2hhc19jb21wb3NpdGUgPSAhMCwKIAkJLmZsYWdfaGFzX3N2aWRlbyA9ICEwLAorCQkuZmxhZ19meDJfMTZrYiA9ICEwLAogCQkuc2lnbmFsX3JvdXRpbmdfc2NoZW1lID0gUFZSMl9ST1VUSU5HX1NDSEVNRV9IQVVQUEFVR0UsCiAJCS5kaWdpdGFsX2NvbnRyb2xfc2NoZW1lID0gUFZSMl9ESUdJVEFMX1NDSEVNRV9IQVVQUEFVR0UsCiAJCS5kZWZhdWx0X3N0ZF9tYXNrID0gVjRMMl9TVERfTlRTQ19NLApAQCAtNDY3LDcgKzQ2OSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHB2cjJfZGV2aWNlX2Rlc2MgcHZyMl9kZXZpY2VfNzUxeHggPSB7Ci0JCS5kZXNjcmlwdGlvbiA9ICJXaW5UViBIVlItMTk1MCBNb2RlbCBDYXRlZ29yeSA3NTF4eCIsCisJCS5kZXNjcmlwdGlvbiA9ICJXaW5UViBIVlItMTk1MCBNb2RlbCA3NTF4eCIsCiAJCS5zaG9ydG5hbWUgPSAiNzUxeHgiLAogCQkuY2xpZW50X3RhYmxlLmxzdCA9IHB2cjJfY2xpXzczeHh4LAogCQkuY2xpZW50X3RhYmxlLmNudCA9IEFSUkFZX1NJWkUocHZyMl9jbGlfNzN4eHgpLApAQCAtNDc4LDYgKzQ4MCw3IEBACiAJCS5mbGFnX2hhc19hbmFsb2d0dW5lciA9ICEwLAogCQkuZmxhZ19oYXNfY29tcG9zaXRlID0gITAsCiAJCS5mbGFnX2hhc19zdmlkZW8gPSAhMCwKKwkJLmZsYWdfZngyXzE2a2IgPSAhMCwKIAkJLnNpZ25hbF9yb3V0aW5nX3NjaGVtZSA9IFBWUjJfUk9VVElOR19TQ0hFTUVfSEFVUFBBVUdFLAogCQkuZGlnaXRhbF9jb250cm9sX3NjaGVtZSA9IFBWUjJfRElHSVRBTF9TQ0hFTUVfSEFVUFBBVUdFLAogCQkuZGVmYXVsdF9zdGRfbWFzayA9IFY0TDJfU1REX05UU0NfTSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRldmF0dHIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRldmF0dHIuaAppbmRleCBlYTA0ZWNmLi5lNWI5NTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1kZXZhdHRyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGV2YXR0ci5oCkBAIC0xNzYsNiArMTc2LDcgQEAKIAl1bnNpZ25lZCBpbnQgZmxhZ19oYXNfYW5hbG9ndHVuZXI6MTsgICAvKiBIYXMgYW5hbG9nIHR1bmVyICovCiAJdW5zaWduZWQgaW50IGZsYWdfaGFzX2NvbXBvc2l0ZToxOyAgICAgLyogSGFzIGNvbXBvc2l0ZSBpbnB1dCAqLwogCXVuc2lnbmVkIGludCBmbGFnX2hhc19zdmlkZW86MTsgICAgICAgIC8qIEhhcyBzLXZpZGVvIGlucHV0ICovCisJdW5zaWduZWQgaW50IGZsYWdfZngyXzE2a2I6MTsgICAgICAgICAgLyogMTZLQiBGWDIgZmlybXdhcmUgT0sgaGVyZSAqLwogfTsKIAogZXh0ZXJuIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHB2cjJfZGV2aWNlX3RhYmxlW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1lbmNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1lbmNvZGVyLmMKaW5kZXggNTRhYzUzNC4uZTA0NmZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZW5jb2Rlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWVuY29kZXIuYwpAQCAtMjk0LDcgKzI5NCwxMCBAQAogCQkJcHZyMl90cmFjZSgKIAkJCQlQVlIyX1RSQUNFX0VSUk9SX0xFR1MsCiAJCQkJIkdpdmluZyB1cCBvbiBjb21tYW5kLiIKLQkJCQkiICBUaGlzIGlzIG5vcm1hbGx5IHJlY292ZXJlZCBieSB0aGUgZHJpdmVyLiIpOworCQkJCSIgIFRoaXMgaXMgbm9ybWFsbHkgcmVjb3ZlcmVkIHZpYSBhIGZpcm13YXJlIgorCQkJCSIgcmVsb2FkIGFuZCByZS1pbml0aWFsaXphdGlvbjsgY29uY2VybiIKKwkJCQkiIGlzIG9ubHkgd2FycmFudGVkIGlmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5IgorCQkJCSIgYW5kIHJhcGlkbHkuIik7CiAJCQlicmVhazsKIAkJfQogCQl3ckRhdGFbMF0gPSAweDc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHctaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy1pbnRlcm5hbC5oCmluZGV4IDViMTUyZmYuLmRlNTQ4NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy1pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy1pbnRlcm5hbC5oCkBAIC0yNzAsNiArMjcwLDcgQEAKIAogCWludCBmb3JjZV9kaXJ0eTsgICAgICAgIC8qIGNvbnNpZGVyIGFsbCBjb250cm9scyBkaXJ0eSBpZiB0cnVlICovCiAJaW50IGZsYWdfb2s7ICAgICAgICAgICAgLyogZGV2aWNlIGluIGtub3duIGdvb2Qgc3RhdGUgKi8KKwlpbnQgZmxhZ19tb2R1bGVmYWlsOyAgICAvKiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBtb2R1bGUgZmFpbGVkIHRvIGxvYWQgKi8KIAlpbnQgZmxhZ19kaXNjb25uZWN0ZWQ7ICAvKiBmbGFnX29rID09IDAgZHVlIHRvIGRpc2Nvbm5lY3QgKi8KIAlpbnQgZmxhZ19pbml0X29rOyAgICAgICAvKiB0cnVlIGlmIHN0cnVjdHVyZSBpcyBmdWxseSBpbml0aWFsaXplZCAqLwogCWludCBmdzFfc3RhdGU7ICAgICAgICAgIC8qIGN1cnJlbnQgc2l0dWF0aW9uIHdpdGggZncxICovCkBAIC0zMzIsNyArMzMzLDcgQEAKIAogCS8qIEJpdCBtYXNrIG9mIFBWUjJfQ1ZBTF9JTlBVVCBjaG9pY2VzIHdoaWNoIGFyZSB2YWxpZCBmb3IgdGhlIGhhcmR3YXJlICovCiAJdW5zaWduZWQgaW50IGlucHV0X2F2YWlsX21hc2s7Ci0JLyogQml0IG1hc2sgb2YgUFZSMl9DVkFMX0lOUFVUIGNob2ljZXMgd2hpY2ggYXJlIGN1cnJlbmx5IGFsbG93ZWQgKi8KKwkvKiBCaXQgbWFzayBvZiBQVlIyX0NWQUxfSU5QVVQgY2hvaWNlcyB3aGljaCBhcmUgY3VycmVudGx5IGFsbG93ZWQgKi8KIAl1bnNpZ25lZCBpbnQgaW5wdXRfYWxsb3dlZF9tYXNrOwogCiAJLyogTG9jYXRpb24gb2YgZWVwcm9tIG9yIGEgbmVnYXRpdmUgbnVtYmVyIGlmIG5vbmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKaW5kZXggMTM2MzliMy4uMWJiZGFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKQEAgLTE0NDcsNiArMTQ0Nyw3IEBACiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CiAJdm9pZCAgKmZ3X3B0cjsKIAl1bnNpZ25lZCBpbnQgcGlwZTsKKwl1bnNpZ25lZCBpbnQgZndzaXplOwogCWludCByZXQ7CiAJdTE2IGFkZHJlc3M7CiAKQEAgLTE0NzMsOSArMTQ3NCwyMSBAQAogCXVzYl9jbGVhcl9oYWx0KGhkdy0+dXNiX2RldiwgdXNiX3NuZGJ1bGtwaXBlKGhkdy0+dXNiX2RldiwgMCAmIDB4N2YpKTsKIAogCXBpcGUgPSB1c2Jfc25kY3RybHBpcGUoaGR3LT51c2JfZGV2LCAwKTsKKwlmd3NpemUgPSBmd19lbnRyeS0+c2l6ZTsKIAotCWlmIChmd19lbnRyeS0+c2l6ZSAhPSAweDIwMDApewotCQlwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfRVJST1JfTEVHUywid3JvbmcgZngyIGZpcm13YXJlIHNpemUiKTsKKwlpZiAoKGZ3c2l6ZSAhPSAweDIwMDApICYmCisJICAgICghKGhkdy0+aGR3X2Rlc2MtPmZsYWdfZngyXzE2a2IgJiYgKGZ3c2l6ZSA9PSAweDQwMDApKSkpIHsKKwkJaWYgKGhkdy0+aGR3X2Rlc2MtPmZsYWdfZngyXzE2a2IpIHsKKwkJCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9FUlJPUl9MRUdTLAorCQkJCSAgICJXcm9uZyBmeDIgZmlybXdhcmUgc2l6ZSIKKwkJCQkgICAiIChleHBlY3RlZCA4MTkyIG9yIDE2Mzg0LCBnb3QgJXUpIiwKKwkJCQkgICBmd3NpemUpOworCQl9IGVsc2UgeworCQkJcHZyMl90cmFjZShQVlIyX1RSQUNFX0VSUk9SX0xFR1MsCisJCQkJICAgIldyb25nIGZ4MiBmaXJtd2FyZSBzaXplIgorCQkJCSAgICIgKGV4cGVjdGVkIDgxOTIsIGdvdCAldSkiLAorCQkJCSAgIGZ3c2l6ZSk7CisJCX0KIAkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTE0OTMsNyArMTUwNiw3IEBACiAJICAgY2h1bmsuICovCiAKIAlyZXQgPSAwOwotCWZvcihhZGRyZXNzID0gMDsgYWRkcmVzcyA8IGZ3X2VudHJ5LT5zaXplOyBhZGRyZXNzICs9IDB4ODAwKSB7CisJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8IGZ3c2l6ZTsgYWRkcmVzcyArPSAweDgwMCkgewogCQltZW1jcHkoZndfcHRyLCBmd19lbnRyeS0+ZGF0YSArIGFkZHJlc3MsIDB4ODAwKTsKIAkJcmV0ICs9IHVzYl9jb250cm9sX21zZyhoZHctPnVzYl9kZXYsIHBpcGUsIDB4YTAsIDB4NDAsIGFkZHJlc3MsCiAJCQkJICAgICAgIDAsIGZ3X3B0ciwgMHg4MDAsIEhaKTsKQEAgLTE1MDksOCArMTUyMiw4IEBACiAKIAl0cmFjZV9maXJtd2FyZSgiVXBsb2FkIGRvbmUgKCVkIGJ5dGVzIHNlbnQpIixyZXQpOwogCi0JLyogV2Ugc2hvdWxkIGhhdmUgd3JpdHRlbiA4MTkyIGJ5dGVzICovCi0JaWYgKHJldCA9PSA4MTkyKSB7CisJLyogV2Ugc2hvdWxkIGhhdmUgd3JpdHRlbiBmd3NpemUgYnl0ZXMgKi8KKwlpZiAocmV0ID09IGZ3c2l6ZSkgewogCQloZHctPmZ3MV9zdGF0ZSA9IEZXMV9TVEFURV9SRUxPQUQ7CiAJCXJldHVybiAwOwogCX0KQEAgLTIwMzAsNyArMjA0Myw4IEBACiAJZm5hbWUgPSAobWlkIDwgQVJSQVlfU0laRShtb2R1bGVfbmFtZXMpKSA/IG1vZHVsZV9uYW1lc1ttaWRdIDogTlVMTDsKIAlpZiAoIWZuYW1lKSB7CiAJCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9FUlJPUl9MRUdTLAotCQkJICAgIk1vZHVsZSBJRCAldSBmb3IgZGV2aWNlICVzIGhhcyBubyBuYW1lIiwKKwkJCSAgICJNb2R1bGUgSUQgJXUgZm9yIGRldmljZSAlcyBoYXMgbm8gbmFtZT8iCisJCQkgICAiICBUaGUgZHJpdmVyIG1pZ2h0IGhhdmUgYSBjb25maWd1cmF0aW9uIHByb2JsZW0uIiwKIAkJCSAgIG1pZCwKIAkJCSAgIGhkdy0+aGR3X2Rlc2MtPmRlc2NyaXB0aW9uKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDU4LDcgKzIwNzIsOCBAQAogCWlmICghaTJjY250KSB7CiAJCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9FUlJPUl9MRUdTLAogCQkJICAgIk1vZHVsZSBJRCAldSAoJXMpIGZvciBkZXZpY2UgJXM6IgotCQkJICAgIiBObyBpMmMgYWRkcmVzc2VzIiwKKwkJCSAgICIgTm8gaTJjIGFkZHJlc3Nlcy4iCisJCQkgICAiICBUaGUgZHJpdmVyIG1pZ2h0IGhhdmUgYSBjb25maWd1cmF0aW9uIHByb2JsZW0uIiwKIAkJCSAgIG1pZCwgZm5hbWUsIGhkdy0+aGR3X2Rlc2MtPmRlc2NyaXB0aW9uKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjA5MCw3ICsyMTA1LDkgQEAKIAogCWlmICghc2QpIHsKIAkJcHZyMl90cmFjZShQVlIyX1RSQUNFX0VSUk9SX0xFR1MsCi0JCQkgICAiTW9kdWxlIElEICV1ICglcykgZm9yIGRldmljZSAlcyBmYWlsZWQgdG8gbG9hZCIsCisJCQkgICAiTW9kdWxlIElEICV1ICglcykgZm9yIGRldmljZSAlcyBmYWlsZWQgdG8gbG9hZC4iCisJCQkgICAiICBQb3NzaWJsZSBtaXNzaW5nIHN1Yi1kZXZpY2Uga2VybmVsIG1vZHVsZSBvciIKKwkJCSAgICIgaW5pdGlhbGl6YXRpb24gZmFpbHVyZSB3aXRoaW4gbW9kdWxlLiIsCiAJCQkgICBtaWQsIGZuYW1lLCBoZHctPmhkd19kZXNjLT5kZXNjcmlwdGlvbik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTIxMzIsNyArMjE0OSwxMCBAQAogCWZvciAoaWR4ID0gMDsgaWR4IDwgY3QtPmNudDsgaWR4KyspIHsKIAkJaWYgKHB2cjJfaGR3X2xvYWRfc3ViZGV2KGhkdywgJmN0LT5sc3RbaWR4XSkgPCAwKSBva0ZsID0gMDsKIAl9Ci0JaWYgKCFva0ZsKSBwdnIyX2hkd19yZW5kZXJfdXNlbGVzcyhoZHcpOworCWlmICghb2tGbCkgeworCQloZHctPmZsYWdfbW9kdWxlZmFpbCA9ICEwOworCQlwdnIyX2hkd19yZW5kZXJfdXNlbGVzcyhoZHcpOworCX0KIH0KIAogCkBAIC0yMzM0LDYgKzIzNTQsMjAgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQorCQlpZiAoaGR3LT5mbGFnX21vZHVsZWZhaWwpIHsKKwkJCXB2cjJfdHJhY2UoCisJCQkJUFZSMl9UUkFDRV9FUlJPUl9MRUdTLAorCQkJCSIqKipXQVJOSU5HKioqIHB2cnVzYjIgZHJpdmVyIGluaXRpYWxpemF0aW9uIgorCQkJCSIgZmFpbGVkIGR1ZSB0byB0aGUgZmFpbHVyZSBvZiBvbmUgb3IgbW9yZSIKKwkJCQkiIHN1Yi1kZXZpY2Uga2VybmVsIG1vZHVsZXMuIik7CisJCQlwdnIyX3RyYWNlKAorCQkJCVBWUjJfVFJBQ0VfRVJST1JfTEVHUywKKwkJCQkiWW91IG5lZWQgdG8gcmVzb2x2ZSB0aGUgZmFpbGluZyBjb25kaXRpb24iCisJCQkJIiBiZWZvcmUgdGhpcyBkcml2ZXIgY2FuIGZ1bmN0aW9uLiAgVGhlcmUiCisJCQkJIiBzaG91bGQgYmUgc29tZSBlYXJsaWVyIG1lc3NhZ2VzIGdpdmluZyBtb3JlIgorCQkJCSIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2JsZW0uIik7CisJCQlicmVhazsKKwkJfQogCQlpZiAocHJvY3JlbG9hZCkgewogCQkJcHZyMl90cmFjZSgKIAkJCQlQVlIyX1RSQUNFX0VSUk9SX0xFR1MsCkBAIC0yNDE5LDYgKzI0NTMsOCBAQAogCWhkdyA9IGt6YWxsb2Moc2l6ZW9mKCpoZHcpLEdGUF9LRVJORUwpOwogCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9JTklULCJwdnIyX2hkd19jcmVhdGU6IGhkdz0lcCwgdHlwZSBcIiVzXCIiLAogCQkgICBoZHcsaGR3X2Rlc2MtPmRlc2NyaXB0aW9uKTsKKwlwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfSU5GTywgIkhhcmR3YXJlIGRlc2NyaXB0aW9uOiAlcyIsCisJCWhkd19kZXNjLT5kZXNjcmlwdGlvbik7CiAJaWYgKCFoZHcpIGdvdG8gZmFpbDsKIAogCWluaXRfdGltZXIoJmhkdy0+cXVpZXNjZW50X3RpbWVyKTsKQEAgLTM0ODAsNyArMzUxNiw3IEBACiAKIAogdm9pZCBwdnIyX2hkd19jcHVmd19zZXRfZW5hYmxlZChzdHJ1Y3QgcHZyMl9oZHcgKmhkdywKLQkJCQlpbnQgcHJvbV9mbGFnLAorCQkJCWludCBtb2RlLAogCQkJCWludCBlbmFibGVfZmxhZykKIHsKIAlpbnQgcmV0OwpAQCAtMzUwMywxMSArMzUzOSwxMiBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQloZHctPmZ3X2NwdV9mbGFnID0gKHByb21fZmxhZyA9PSAwKTsKKwkJaGR3LT5md19jcHVfZmxhZyA9IChtb2RlICE9IDIpOwogCQlpZiAoaGR3LT5md19jcHVfZmxhZykgeworCQkJaGR3LT5md19zaXplID0gKG1vZGUgPT0gMSkgPyAweDQwMDAgOiAweDIwMDA7CiAJCQlwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfRklSTVdBUkUsCi0JCQkJICAgIlByZXBhcmluZyB0byBzdWNrIG91dCBDUFUgZmlybXdhcmUiKTsKLQkJCWhkdy0+Zndfc2l6ZSA9IDB4MjAwMDsKKwkJCQkgICAiUHJlcGFyaW5nIHRvIHN1Y2sgb3V0IENQVSBmaXJtd2FyZSIKKwkJCQkgICAiIChzaXplPSV1KSIsIGhkdy0+Zndfc2l6ZSk7CiAJCQloZHctPmZ3X2J1ZmZlciA9IGt6YWxsb2MoaGR3LT5md19zaXplLEdGUF9LRVJORUwpOwogCQkJaWYgKCFoZHctPmZ3X2J1ZmZlcikgewogCQkJCWhkdy0+Zndfc2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCmluZGV4IDdiNjk0MDUuLjU2ZTcwZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCkBAIC0yMTksNyArMjE5LDcgQEAKICAgIHRoaXMgbWF5IHByZXZlbnQgdGhlIGRldmljZSBmcm9tIHJ1bm5pbmcgKGFuZCBsZWF2aW5nIHRoaXMgbW9kZSBtYXkKICAgIGltcGx5IGEgZGV2aWNlIHJlc2V0KS4gKi8KIHZvaWQgcHZyMl9oZHdfY3B1Zndfc2V0X2VuYWJsZWQoc3RydWN0IHB2cjJfaGR3ICosCi0JCQkJaW50IHByb21fZmxhZywKKwkJCQlpbnQgbW9kZSwgLyogMD04S0IgRlgyLCAxPTE2S0IgRlgyLCAyPVBST00gKi8KIAkJCQlpbnQgZW5hYmxlX2ZsYWcpOwogCiAvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSdyZSBpbiBhIG1vZGUgZm9yIHJldHJpZXZhbCBDUFUgZmlybXdhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY29yZS5jCmluZGV4IGEzMzRiMWEuLjdjYmUxOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYwpAQCAtNTAsNiArNTAsNyBAQAogCiAvKiBNYXBwaW5nIG9mIElSIHNjaGVtZXMgdG8ga25vd24gSTJDIGFkZHJlc3NlcyAtIGlmIGFueSAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaXJfdmlkZW9fYWRkcmVzc2VzW10gPSB7CisJW1BWUjJfSVJfU0NIRU1FX1pJTE9HXSA9IDB4NzEsCiAJW1BWUjJfSVJfU0NIRU1FXzI5WFhYXSA9IDB4MTgsCiAJW1BWUjJfSVJfU0NIRU1FXzI0WFhYXSA9IDB4MTgsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCmluZGV4IDJkODgyNWUuLjZhYTQ4ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKQEAgLTkxMyw2ICs5MTMsMTUgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBwdnIyX3Y0bDJfZGV2X2Rpc2Fzc29jaWF0ZV9wYXJlbnQoc3RydWN0IHB2cjJfdjRsMl9kZXYgKmRpcCkKK3sKKwlpZiAoIWRpcCkgcmV0dXJuOworCWlmICghZGlwLT5kZXZiYXNlLnBhcmVudCkgcmV0dXJuOworCWRpcC0+ZGV2YmFzZS5wYXJlbnQgPSBOVUxMOworCWRldmljZV9tb3ZlKCZkaXAtPmRldmJhc2UuZGV2LCBOVUxMLCBEUE1fT1JERVJfTk9ORSk7Cit9CisKKwogc3RhdGljIHZvaWQgcHZyMl92NGwyX2Rlc3Ryb3lfbm9fbG9jayhzdHJ1Y3QgcHZyMl92NGwyICp2cCkKIHsKIAlpZiAodnAtPmRldl92aWRlbykgewpAQCAtOTQzLDYgKzk1Miw4IEBACiAJc3RydWN0IHB2cjJfdjRsMiAqdnA7CiAJdnAgPSBjb250YWluZXJfb2YoY2hwLHN0cnVjdCBwdnIyX3Y0bDIsY2hhbm5lbCk7CiAJaWYgKCF2cC0+Y2hhbm5lbC5tY19oZWFkLT5kaXNjb25uZWN0X2ZsYWcpIHJldHVybjsKKwlwdnIyX3Y0bDJfZGV2X2Rpc2Fzc29jaWF0ZV9wYXJlbnQodnAtPmRldl92aWRlbyk7CisJcHZyMl92NGwyX2Rldl9kaXNhc3NvY2lhdGVfcGFyZW50KHZwLT5kZXZfcmFkaW8pOwogCWlmICh2cC0+dmZpcnN0KSByZXR1cm47CiAJcHZyMl92NGwyX2Rlc3Ryb3lfbm9fbG9jayh2cCk7CiB9CkBAIC0xMjUwLDEyICsxMjYxLDEzIEBACiAJCQkgICAgICAgc3RydWN0IHB2cjJfdjRsMiAqdnAsCiAJCQkgICAgICAgaW50IHY0bF90eXBlKQogeworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CiAJaW50IG1pbmRldm51bTsKIAlpbnQgdW5pdF9udW1iZXI7CiAJaW50ICpucl9wdHIgPSBOVUxMOwogCWRpcC0+djRscCA9IHZwOwogCi0KKwl1c2JkZXYgPSBwdnIyX2hkd19nZXRfZGV2KHZwLT5jaGFubmVsLm1jX2hlYWQtPmhkdyk7CiAJZGlwLT52NGxfdHlwZSA9IHY0bF90eXBlOwogCXN3aXRjaCAodjRsX3R5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6CkBAIC0xMjk2LDYgKzEzMDgsNyBAQAogCWlmIChucl9wdHIgJiYgKHVuaXRfbnVtYmVyID49IDApICYmICh1bml0X251bWJlciA8IFBWUl9OVU0pKSB7CiAJCW1pbmRldm51bSA9IG5yX3B0clt1bml0X251bWJlcl07CiAJfQorCWRpcC0+ZGV2YmFzZS5wYXJlbnQgPSAmdXNiZGV2LT5kZXY7CiAJaWYgKCh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmRpcC0+ZGV2YmFzZSwKIAkJCQkgICBkaXAtPnY0bF90eXBlLCBtaW5kZXZudW0pIDwgMCkgJiYKIAkgICAgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmZGlwLT5kZXZiYXNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCBmOTc2ZGY0Li44OWI2MjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtNjgsNiArNjgsNyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkJLyogc2ltcGxlX3N0cnRvbCgpICovCiAKICNpbmNsdWRlICJwd2MuaCIKICNpbmNsdWRlICJwd2Mta2lhcmEuaCIKQEAgLTE5MTYsMTkgKzE5MTcsNiBAQAogCXVubG9ja19rZXJuZWwoKTsKIH0KIAotLyogKmdydW50KiBXZSBoYXZlIHRvIGRvIGF0b2kgb3Vyc2VsdmVzIDotKCAqLwotc3RhdGljIGludCBwd2NfYXRvaShjb25zdCBjaGFyICpzKQotewotCWludCBrID0gMDsKLQotCWsgPSAwOwotCXdoaWxlICgqcyAhPSAnXDAnICYmICpzID49ICcwJyAmJiAqcyA8PSAnOScpIHsKLQkJayA9IDEwICogayArICgqcyAtICcwJyk7Ci0JCXMrKzsKLQl9Ci0JcmV0dXJuIGs7Ci19Ci0KIAogLyoKICAqIEluaXRpYWxpemF0aW9uIGNvZGUgJiBtb2R1bGUgc3R1ZmYKQEAgLTIwNzgsMTMgKzIwNjYsMTYgQEAKIAkJCQl9CiAJCQkJZWxzZSB7CiAJCQkJCS8qIE5vIHR5cGUgb3Igc2VyaWFsIG51bWJlciBzcGVjaWZpZWQsIGp1c3QgYSBudW1iZXIuICovCi0JCQkJCWRldmljZV9oaW50W2ldLmRldmljZV9ub2RlID0gcHdjX2F0b2kocyk7CisJCQkJCWRldmljZV9oaW50W2ldLmRldmljZV9ub2RlID0KKwkJCQkJCXNpbXBsZV9zdHJ0b2wocywgTlVMTCwgMTApOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UgewogCQkJCS8qIFRoZXJlJ3MgYSBjb2xvbiwgc28gd2UgaGF2ZSBhdCBsZWFzdCBhIHR5cGUgYW5kIGEgZGV2aWNlIG5vZGUgKi8KLQkJCQlkZXZpY2VfaGludFtpXS50eXBlID0gcHdjX2F0b2kocyk7Ci0JCQkJZGV2aWNlX2hpbnRbaV0uZGV2aWNlX25vZGUgPSBwd2NfYXRvaShjb2xvbiArIDEpOworCQkJCWRldmljZV9oaW50W2ldLnR5cGUgPQorCQkJCQlzaW1wbGVfc3RydG9sKHMsIE5VTEwsIDEwKTsKKwkJCQlkZXZpY2VfaGludFtpXS5kZXZpY2Vfbm9kZSA9CisJCQkJCXNpbXBsZV9zdHJ0b2woY29sb24gKyAxLCBOVUxMLCAxMCk7CiAJCQkJaWYgKCpkb3QgIT0gJ1wwJykgewogCQkJCQkvKiBUaGVyZSdzIGEgc2VyaWFsIG51bWJlciBhcyB3ZWxsICovCiAJCQkJCWludCBrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3JqNTRuMWNiMGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzNmMmEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMKQEAgLTAsMCArMSwxMjE5IEBACisvKgorICogRHJpdmVyIGZvciBSSjU0TjFDQjBDIENNT1MgSW1hZ2UgU2Vuc29yIGZyb20gTWljcm9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBHdWVubmFkaSBMaWFraG92ZXRza2kgPGcubGlha2hvdmV0c2tpQGdteC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorCisjZGVmaW5lIFJKNTROMV9ERVZfQ09ERQkJCTB4MDQwMAorI2RlZmluZSBSSjU0TjFfREVWX0NPREUyCQkweDA0MDEKKyNkZWZpbmUgUko1NE4xX09VVF9TRUwJCQkweDA0MDMKKyNkZWZpbmUgUko1NE4xX1hZX09VVFBVVF9TSVpFX1NfSAkweDA0MDQKKyNkZWZpbmUgUko1NE4xX1hfT1VUUFVUX1NJWkVfU19MCTB4MDQwNQorI2RlZmluZSBSSjU0TjFfWV9PVVRQVVRfU0laRV9TX0wJMHgwNDA2CisjZGVmaW5lIFJKNTROMV9YWV9PVVRQVVRfU0laRV9QX0gJMHgwNDA3CisjZGVmaW5lIFJKNTROMV9YX09VVFBVVF9TSVpFX1BfTAkweDA0MDgKKyNkZWZpbmUgUko1NE4xX1lfT1VUUFVUX1NJWkVfUF9MCTB4MDQwOQorI2RlZmluZSBSSjU0TjFfTElORV9MRU5HVEhfUENLX1NfSAkweDA0MGEKKyNkZWZpbmUgUko1NE4xX0xJTkVfTEVOR1RIX1BDS19TX0wJMHgwNDBiCisjZGVmaW5lIFJKNTROMV9MSU5FX0xFTkdUSF9QQ0tfUF9ICTB4MDQwYworI2RlZmluZSBSSjU0TjFfTElORV9MRU5HVEhfUENLX1BfTAkweDA0MGQKKyNkZWZpbmUgUko1NE4xX1JFU0laRV9OCQkJMHgwNDBlCisjZGVmaW5lIFJKNTROMV9SRVNJWkVfTl9TVEVQCQkweDA0MGYKKyNkZWZpbmUgUko1NE4xX1JFU0laRV9TVEVQCQkweDA0MTAKKyNkZWZpbmUgUko1NE4xX1JFU0laRV9IT0xEX0gJCTB4MDQxMQorI2RlZmluZSBSSjU0TjFfUkVTSVpFX0hPTERfTAkJMHgwNDEyCisjZGVmaW5lIFJKNTROMV9IX09CRU5fT0ZTCQkweDA0MTMKKyNkZWZpbmUgUko1NE4xX1ZfT0JFTl9PRlMJCTB4MDQxNAorI2RlZmluZSBSSjU0TjFfUkVTSVpFX0NPTlRST0wJCTB4MDQxNQorI2RlZmluZSBSSjU0TjFfSU5DX1VTRV9TRUxfSAkJMHgwNDI1CisjZGVmaW5lIFJKNTROMV9JTkNfVVNFX1NFTF9MCQkweDA0MjYKKyNkZWZpbmUgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFCTB4MDQyNworI2RlZmluZSBSSjU0TjFfSU5JVF9TVEFSVAkJMHgwNDI4CisjZGVmaW5lIFJKNTROMV9TQ0FMRV8xXzJfTEVWCQkweDA0MjkKKyNkZWZpbmUgUko1NE4xX1NDQUxFXzRfTEVWCQkweDA0MmEKKyNkZWZpbmUgUko1NE4xX1lfR0FJTgkJCTB4MDRkOAorI2RlZmluZSBSSjU0TjFfQVBUX0dBSU5fVVAJCTB4MDRmYQorI2RlZmluZSBSSjU0TjFfUkFfU0VMX1VMCQkweDA1MzAKKyNkZWZpbmUgUko1NE4xX0JZVEVfU1dBUAkJMHgwNTMxCisjZGVmaW5lIFJKNTROMV9PVVRfU0lHUE8JCTB4MDUzYgorI2RlZmluZSBSSjU0TjFfRlJBTUVfTEVOR1RIX1NfSAkJMHgwNTk1CisjZGVmaW5lIFJKNTROMV9GUkFNRV9MRU5HVEhfU19MCQkweDA1OTYKKyNkZWZpbmUgUko1NE4xX0ZSQU1FX0xFTkdUSF9QX0gJCTB4MDU5NworI2RlZmluZSBSSjU0TjFfRlJBTUVfTEVOR1RIX1BfTAkJMHgwNTk4CisjZGVmaW5lIFJKNTROMV9JT0MJCQkweDA1ZWYKKyNkZWZpbmUgUko1NE4xX1RHX0JZUEFTUwkJMHgwNzAwCisjZGVmaW5lIFJKNTROMV9QTExfTAkJCTB4MDcwMQorI2RlZmluZSBSSjU0TjFfUExMX04JCQkweDA3MDIKKyNkZWZpbmUgUko1NE4xX1BMTF9FTgkJCTB4MDcwNAorI2RlZmluZSBSSjU0TjFfUkFUSU9fVEcJCQkweDA3MDYKKyNkZWZpbmUgUko1NE4xX1JBVElPX1QJCQkweDA3MDcKKyNkZWZpbmUgUko1NE4xX1JBVElPX1IJCQkweDA3MDgKKyNkZWZpbmUgUko1NE4xX1JBTVBfVEdDTEtfRU4JCTB4MDcwOQorI2RlZmluZSBSSjU0TjFfT0NMS19EU1AJCQkweDA3MTAKKyNkZWZpbmUgUko1NE4xX1JBVElPX09QCQkJMHgwNzExCisjZGVmaW5lIFJKNTROMV9SQVRJT19PCQkJMHgwNzEyCisjZGVmaW5lIFJKNTROMV9PQ0xLX1NFTF9FTgkJMHgwNzEzCisjZGVmaW5lIFJKNTROMV9DTEtfUlNUCQkJMHgwNzE3CisjZGVmaW5lIFJKNTROMV9SRVNFVF9TVEFOREJZCQkweDA3MTgKKworI2RlZmluZSBFX0VYQ0xLCQkJCSgxIDw8IDcpCisjZGVmaW5lIFNPRlRfU1REQlkJCQkoMSA8PCA0KQorI2RlZmluZSBTRU5fUlNUWAkJCSgxIDw8IDIpCisjZGVmaW5lIFRHX1JTVFgJCQkJKDEgPDwgMSkKKyNkZWZpbmUgRFNQX1JTVFgJCQkoMSA8PCAwKQorCisjZGVmaW5lIFJFU0laRV9IT0xEX1NFTAkJCSgxIDw8IDIpCisjZGVmaW5lIFJFU0laRV9HTwkJCSgxIDw8IDEpCisKKyNkZWZpbmUgUko1NE4xX0NPTFVNTl9TS0lQCQkwCisjZGVmaW5lIFJKNTROMV9ST1dfU0tJUAkJCTAKKyNkZWZpbmUgUko1NE4xX01BWF9XSURUSAkJMTYwMAorI2RlZmluZSBSSjU0TjFfTUFYX0hFSUdIVAkJMTIwMAorCisvKiBJMkMgYWRkcmVzc2VzOiAweDUwLCAweDUxLCAweDYwLCAweDYxICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCByajU0bjFfY29sb3VyX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJZVVlWIiwKKwkJLmRlcHRoCQk9IDE2LAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCX0sIHsKKwkJLm5hbWUJCT0gIlJHQjU2NSIsCisJCS5kZXB0aAkJPSAxNiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCX0KK307CisKK3N0cnVjdCByajU0bjFfY2xvY2tfZGl2IHsKKwl1OCByYXRpb190ZzsKKwl1OCByYXRpb190OworCXU4IHJhdGlvX3I7CisJdTggcmF0aW9fb3A7CisJdTggcmF0aW9fbzsKK307CisKK3N0cnVjdCByajU0bjEgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IHY0bDJfcmVjdCByZWN0OwkvKiBTZW5zb3Igd2luZG93ICovCisJdW5zaWduZWQgc2hvcnQgd2lkdGg7CS8qIE91dHB1dCB3aW5kb3cgKi8KKwl1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7CisJdW5zaWduZWQgc2hvcnQgcmVzaXplOwkvKiBTZW5zb3IgKiAxMDI0IC8gcmVzaXplID0gT3V0cHV0ICovCisJc3RydWN0IHJqNTRuMV9jbG9ja19kaXYgY2xrX2RpdjsKKwl1MzIgZm91cmNjOworCXVuc2lnbmVkIHNob3J0IHNjYWxlOworCXU4IGJhbms7Cit9OworCitzdHJ1Y3Qgcmo1NG4xX3JlZ192YWwgeworCXUxNiByZWc7CisJdTggdmFsOworfTsKKworY29uc3Qgc3RhdGljIHN0cnVjdCByajU0bjFfcmVnX3ZhbCBiYW5rXzRbXSA9IHsKKwl7MHg0MTcsIDB9LAorCXsweDQyYywgMH0sCisJezB4NDJkLCAweGYwfSwKKwl7MHg0MmUsIDB9LAorCXsweDQyZiwgMHg1MH0sCisJezB4NDMwLCAweGY1fSwKKwl7MHg0MzEsIDB4MTZ9LAorCXsweDQzMiwgMHgyMH0sCisJezB4NDMzLCAwfSwKKwl7MHg0MzQsIDB4Yzh9LAorCXsweDQzYywgOH0sCisJezB4NDNlLCAweDkwfSwKKwl7MHg0NDUsIDB4ODN9LAorCXsweDRiYSwgMHg1OH0sCisJezB4NGJiLCA0fSwKKwl7MHg0YmMsIDB4MjB9LAorCXsweDRkYiwgNH0sCisJezB4NGZlLCAyfSwKK307CisKK2NvbnN0IHN0YXRpYyBzdHJ1Y3Qgcmo1NG4xX3JlZ192YWwgYmFua181W10gPSB7CisJezB4NTE0LCAwfSwKKwl7MHg1MTYsIDB9LAorCXsweDUxOCwgMH0sCisJezB4NTFhLCAwfSwKKwl7MHg1MWQsIDB4ZmZ9LAorCXsweDU2ZiwgMHgyOH0sCisJezB4NTc1LCAweDQwfSwKKwl7MHg1YmMsIDB4NDh9LAorCXsweDVjMSwgNn0sCisJezB4NWU1LCAweDExfSwKKwl7MHg1ZTYsIDB4NDN9LAorCXsweDVlNywgMHgzM30sCisJezB4NWU4LCAweDIxfSwKKwl7MHg1ZTksIDB4MzB9LAorCXsweDVlYSwgMHgwfSwKKwl7MHg1ZWIsIDB4YTV9LAorCXsweDVlYywgMHhmZn0sCisJezB4NWZlLCAyfSwKK307CisKK2NvbnN0IHN0YXRpYyBzdHJ1Y3Qgcmo1NG4xX3JlZ192YWwgYmFua183W10gPSB7CisJezB4NzBhLCAwfSwKKwl7MHg3MTQsIDB4ZmZ9LAorCXsweDcxNSwgMHhmZn0sCisJezB4NzE2LCAweDFmfSwKKwl7MHg3RkUsIDB4MDJ9LAorfTsKKworY29uc3Qgc3RhdGljIHN0cnVjdCByajU0bjFfcmVnX3ZhbCBiYW5rXzhbXSA9IHsKKwl7MHg4MDAsIDB4MDB9LAorCXsweDgwMSwgMHgwMX0sCisJezB4ODAyLCAweDYxfSwKKwl7MHg4MDUsIDB4MDB9LAorCXsweDgwNiwgMHgwMH0sCisJezB4ODA3LCAweDAwfSwKKwl7MHg4MDgsIDB4MDB9LAorCXsweDgwOSwgMHgwMX0sCisJezB4ODBBLCAweDYxfSwKKwl7MHg4MEIsIDB4MDB9LAorCXsweDgwQywgMHgwMX0sCisJezB4ODBELCAweDAwfSwKKwl7MHg4MEUsIDB4MDB9LAorCXsweDgwRiwgMHgwMH0sCisJezB4ODEwLCAweDAwfSwKKwl7MHg4MTEsIDB4MDF9LAorCXsweDgxMiwgMHg2MX0sCisJezB4ODEzLCAweDAwfSwKKwl7MHg4MTQsIDB4MTF9LAorCXsweDgxNSwgMHgwMH0sCisJezB4ODE2LCAweDQxfSwKKwl7MHg4MTcsIDB4MDB9LAorCXsweDgxOCwgMHg1MX0sCisJezB4ODE5LCAweDAxfSwKKwl7MHg4MUEsIDB4MUZ9LAorCXsweDgxQiwgMHgwMH0sCisJezB4ODFDLCAweDAxfSwKKwl7MHg4MUQsIDB4MDB9LAorCXsweDgxRSwgMHgxMX0sCisJezB4ODFGLCAweDAwfSwKKwl7MHg4MjAsIDB4NDF9LAorCXsweDgyMSwgMHgwMH0sCisJezB4ODIyLCAweDUxfSwKKwl7MHg4MjMsIDB4MDB9LAorCXsweDgyNCwgMHgwMH0sCisJezB4ODI1LCAweDAwfSwKKwl7MHg4MjYsIDB4NDd9LAorCXsweDgyNywgMHgwMX0sCisJezB4ODI4LCAweDRGfSwKKwl7MHg4MjksIDB4MDB9LAorCXsweDgyQSwgMHgwMH0sCisJezB4ODJCLCAweDAwfSwKKwl7MHg4MkMsIDB4MzB9LAorCXsweDgyRCwgMHgwMH0sCisJezB4ODJFLCAweDQwfSwKKwl7MHg4MkYsIDB4MDB9LAorCXsweDgzMCwgMHhCM30sCisJezB4ODMxLCAweDAwfSwKKwl7MHg4MzIsIDB4RTN9LAorCXsweDgzMywgMHgwMH0sCisJezB4ODM0LCAweDAwfSwKKwl7MHg4MzUsIDB4MDB9LAorCXsweDgzNiwgMHgwMH0sCisJezB4ODM3LCAweDAwfSwKKwl7MHg4MzgsIDB4MDB9LAorCXsweDgzOSwgMHgwMX0sCisJezB4ODNBLCAweDYxfSwKKwl7MHg4M0IsIDB4MDB9LAorCXsweDgzQywgMHgwMX0sCisJezB4ODNELCAweDAwfSwKKwl7MHg4M0UsIDB4MDB9LAorCXsweDgzRiwgMHgwMH0sCisJezB4ODQwLCAweDAwfSwKKwl7MHg4NDEsIDB4MDF9LAorCXsweDg0MiwgMHg2MX0sCisJezB4ODQzLCAweDAwfSwKKwl7MHg4NDQsIDB4MUR9LAorCXsweDg0NSwgMHgwMH0sCisJezB4ODQ2LCAweDAwfSwKKwl7MHg4NDcsIDB4MDB9LAorCXsweDg0OCwgMHgwMH0sCisJezB4ODQ5LCAweDAxfSwKKwl7MHg4NEEsIDB4MUZ9LAorCXsweDg0QiwgMHgwMH0sCisJezB4ODRDLCAweDA1fSwKKwl7MHg4NEQsIDB4MDB9LAorCXsweDg0RSwgMHgxOX0sCisJezB4ODRGLCAweDAxfSwKKwl7MHg4NTAsIDB4MjF9LAorCXsweDg1MSwgMHgwMX0sCisJezB4ODUyLCAweDVEfSwKKwl7MHg4NTMsIDB4MDB9LAorCXsweDg1NCwgMHgwMH0sCisJezB4ODU1LCAweDAwfSwKKwl7MHg4NTYsIDB4MTl9LAorCXsweDg1NywgMHgwMX0sCisJezB4ODU4LCAweDIxfSwKKwl7MHg4NTksIDB4MDB9LAorCXsweDg1QSwgMHgwMH0sCisJezB4ODVCLCAweDAwfSwKKwl7MHg4NUMsIDB4MDB9LAorCXsweDg1RCwgMHgwMH0sCisJezB4ODVFLCAweDAwfSwKKwl7MHg4NUYsIDB4MDB9LAorCXsweDg2MCwgMHhCM30sCisJezB4ODYxLCAweDAwfSwKKwl7MHg4NjIsIDB4RTN9LAorCXsweDg2MywgMHgwMH0sCisJezB4ODY0LCAweDAwfSwKKwl7MHg4NjUsIDB4MDB9LAorCXsweDg2NiwgMHgwMH0sCisJezB4ODY3LCAweDAwfSwKKwl7MHg4NjgsIDB4MDB9LAorCXsweDg2OSwgMHhFMn0sCisJezB4ODZBLCAweDAwfSwKKwl7MHg4NkIsIDB4MDF9LAorCXsweDg2QywgMHgwNn0sCisJezB4ODZELCAweDAwfSwKKwl7MHg4NkUsIDB4MDB9LAorCXsweDg2RiwgMHgwMH0sCisJezB4ODcwLCAweDYwfSwKKwl7MHg4NzEsIDB4OEN9LAorCXsweDg3MiwgMHgxMH0sCisJezB4ODczLCAweDAwfSwKKwl7MHg4NzQsIDB4RTB9LAorCXsweDg3NSwgMHgwMH0sCisJezB4ODc2LCAweDI3fSwKKwl7MHg4NzcsIDB4MDF9LAorCXsweDg3OCwgMHgwMH0sCisJezB4ODc5LCAweDAwfSwKKwl7MHg4N0EsIDB4MDB9LAorCXsweDg3QiwgMHgwM30sCisJezB4ODdDLCAweDAwfSwKKwl7MHg4N0QsIDB4MDB9LAorCXsweDg3RSwgMHgwMH0sCisJezB4ODdGLCAweDAwfSwKKwl7MHg4ODAsIDB4MDB9LAorCXsweDg4MSwgMHgwMH0sCisJezB4ODgyLCAweDAwfSwKKwl7MHg4ODMsIDB4MDB9LAorCXsweDg4NCwgMHgwMH0sCisJezB4ODg1LCAweDAwfSwKKwl7MHg4ODYsIDB4Rjh9LAorCXsweDg4NywgMHgwMH0sCisJezB4ODg4LCAweDAzfSwKKwl7MHg4ODksIDB4MDB9LAorCXsweDg4QSwgMHg2NH0sCisJezB4ODhCLCAweDAwfSwKKwl7MHg4OEMsIDB4MDN9LAorCXsweDg4RCwgMHgwMH0sCisJezB4ODhFLCAweEIxfSwKKwl7MHg4OEYsIDB4MDB9LAorCXsweDg5MCwgMHgwM30sCisJezB4ODkxLCAweDAxfSwKKwl7MHg4OTIsIDB4MUR9LAorCXsweDg5MywgMHgwMH0sCisJezB4ODk0LCAweDAzfSwKKwl7MHg4OTUsIDB4MDF9LAorCXsweDg5NiwgMHg0Qn0sCisJezB4ODk3LCAweDAwfSwKKwl7MHg4OTgsIDB4RTV9LAorCXsweDg5OSwgMHgwMH0sCisJezB4ODlBLCAweDAxfSwKKwl7MHg4OUIsIDB4MDB9LAorCXsweDg5QywgMHgwMX0sCisJezB4ODlELCAweDA0fSwKKwl7MHg4OUUsIDB4Qzh9LAorCXsweDg5RiwgMHgwMH0sCisJezB4OEEwLCAweDAxfSwKKwl7MHg4QTEsIDB4MDF9LAorCXsweDhBMiwgMHg2MX0sCisJezB4OEEzLCAweDAwfSwKKwl7MHg4QTQsIDB4MDF9LAorCXsweDhBNSwgMHgwMH0sCisJezB4OEE2LCAweDAwfSwKKwl7MHg4QTcsIDB4MDB9LAorCXsweDhBOCwgMHgwMH0sCisJezB4OEE5LCAweDAwfSwKKwl7MHg4QUEsIDB4N0Z9LAorCXsweDhBQiwgMHgwM30sCisJezB4OEFDLCAweDAwfSwKKwl7MHg4QUQsIDB4MDB9LAorCXsweDhBRSwgMHgwMH0sCisJezB4OEFGLCAweDAwfSwKKwl7MHg4QjAsIDB4MDB9LAorCXsweDhCMSwgMHgwMH0sCisJezB4OEI2LCAweDAwfSwKKwl7MHg4QjcsIDB4MDF9LAorCXsweDhCOCwgMHgwMH0sCisJezB4OEI5LCAweDAwfSwKKwl7MHg4QkEsIDB4MDJ9LAorCXsweDhCQiwgMHgwMH0sCisJezB4OEJDLCAweEZGfSwKKwl7MHg4QkQsIDB4MDB9LAorCXsweDhGRSwgMHgwMn0sCit9OworCitjb25zdCBzdGF0aWMgc3RydWN0IHJqNTRuMV9yZWdfdmFsIGJhbmtfMTBbXSA9IHsKKwl7MHgxMGJmLCAweDY5fQorfTsKKworLyogQ2xvY2sgZGl2aWRlcnMgLSB0aGVzZSBhcmUgZGVmYXVsdCByZWdpc3RlciB2YWx1ZXMsIGRpdmlkZXIgPSByZWdpc3RlciArIDEgKi8KK2NvbnN0IHN0YXRpYyBzdHJ1Y3Qgcmo1NG4xX2Nsb2NrX2RpdiBjbGtfZGl2ID0geworCS5yYXRpb190Zwk9IDMgLyogZGVmYXVsdDogNSAqLywKKwkucmF0aW9fdAk9IDQgLyogZGVmYXVsdDogMSAqLywKKwkucmF0aW9fcgk9IDQgLyogZGVmYXVsdDogMCAqLywKKwkucmF0aW9fb3AJPSAxIC8qIGRlZmF1bHQ6IDUgKi8sCisJLnJhdGlvX28JPSA5IC8qIGRlZmF1bHQ6IDAgKi8sCit9OworCitzdGF0aWMgc3RydWN0IHJqNTRuMSAqdG9fcmo1NG4xKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgc3RydWN0IHJqNTRuMSwgc3ViZGV2KTsKK30KKworc3RhdGljIGludCByZWdfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCB1MTYgcmVnKQoreworCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOworCWludCByZXQ7CisKKwkvKiBzZXQgYmFuayAqLworCWlmIChyajU0bjEtPmJhbmsgIT0gcmVnID4+IDgpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJbMHgleF0gPSAweCV4XG4iLCAweGZmLCByZWcgPj4gOCk7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCAweGZmLCByZWcgPj4gOCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmo1NG4xLT5iYW5rID0gcmVnID4+IDg7CisJfQorCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcgJiAweGZmKTsKK30KKworc3RhdGljIGludCByZWdfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgdTE2IHJlZywKKwkJICAgICBjb25zdCB1OCBkYXRhKQoreworCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOworCWludCByZXQ7CisKKwkvKiBzZXQgYmFuayAqLworCWlmIChyajU0bjEtPmJhbmsgIT0gcmVnID4+IDgpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJbMHgleF0gPSAweCV4XG4iLCAweGZmLCByZWcgPj4gOCk7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCAweGZmLCByZWcgPj4gOCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmo1NG4xLT5iYW5rID0gcmVnID4+IDg7CisJfQorCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiWzB4JXhdID0gMHgleFxuIiwgcmVnICYgMHhmZiwgZGF0YSk7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcgJiAweGZmLCBkYXRhKTsKK30KKworc3RhdGljIGludCByZWdfc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHUxNiByZWcsCisJCSAgIGNvbnN0IHU4IGRhdGEsIGNvbnN0IHU4IG1hc2spCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ19yZWFkKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVnX3dyaXRlKGNsaWVudCwgcmVnLCAocmV0ICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVnX3dyaXRlX211bHRpcGxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgcmo1NG4xX3JlZ192YWwgKnJ2LCBjb25zdCBpbnQgbikKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBydi0+cmVnLCBydi0+dmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlydisrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJqNTRuMV9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQoreworCS8qIFRPRE86IHN0YXJ0IC8gc3RvcCBzdHJlYW1pbmcgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByajU0bjFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBzZC0+cHJpdjsKKwkvKiBGaWd1cmVzIDIuNS0xIHRvIDIuNS0zIC0gZGVmYXVsdCBmYWxsaW5nIHBpeGNsayBlZGdlICovCisKKwlpZiAoZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpCisJCXJldHVybiByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT1VUX1NJR1BPLCAxIDw8IDQpOworCWVsc2UKKwkJcmV0dXJuIHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9PVVRfU0lHUE8sIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByajU0bjFfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgZmxhZ3MgPQorCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKKwkJU09DQU1fTUFTVEVSIHwgU09DQU1fREFUQVdJRFRIXzggfAorCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJU09DQU1fREFUQV9BQ1RJVkVfSElHSDsKKworCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKK30KKworc3RhdGljIGludCByajU0bjFfc2V0X3JlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgIHUxNiByZWdfeCwgdTE2IHJlZ195LCB1MTYgcmVnX3h5LAorCQkJICAgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCByZWdfeHksCisJCQkoKHdpZHRoID4+IDQpICYgMHg3MCkgfAorCQkJKChoZWlnaHQgPj4gOCkgJiA3KSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgcmVnX3gsIHdpZHRoICYgMHhmZik7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIHJlZ195LCBoZWlnaHQgJiAweGZmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTb21lIGNvbW1hbmRzLCBzcGVjaWZpY2FsbHkgY2VydGFpbiBpbml0aWFsaXNhdGlvbiBzZXF1ZW5jZXMsIHJlcXVpcmUKKyAqIGEgY29tbWl0IG9wZXJhdGlvbi4KKyAqLworc3RhdGljIGludCByajU0bjFfY29tbWl0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9JTklUX1NUQVJULCAxKTsKKwltc2xlZXAoMTApOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfSU5JVF9TVEFSVCwgMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByajU0bjFfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOworCisJYS0+Ywk9IHJqNTRuMS0+cmVjdDsKKwlhLT50eXBlCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmo1NG4xX2Nyb3BjYXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqYSkKK3sKKwlhLT5ib3VuZHMubGVmdAkJCT0gUko1NE4xX0NPTFVNTl9TS0lQOworCWEtPmJvdW5kcy50b3AJCQk9IFJKNTROMV9ST1dfU0tJUDsKKwlhLT5ib3VuZHMud2lkdGgJCQk9IFJKNTROMV9NQVhfV0lEVEg7CisJYS0+Ym91bmRzLmhlaWdodAkJPSBSSjU0TjFfTUFYX0hFSUdIVDsKKwlhLT5kZWZyZWN0CQkJPSBhLT5ib3VuZHM7CisJYS0+dHlwZQkJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IJPSAxOworCWEtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yCT0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJqNTRuMV9nX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCisJcGl4LT5waXhlbGZvcm1hdAk9IHJqNTRuMS0+Zm91cmNjOworCXBpeC0+ZmllbGQJCT0gVjRMMl9GSUVMRF9OT05FOworCXBpeC0+d2lkdGgJCT0gcmo1NG4xLT53aWR0aDsKKwlwaXgtPmhlaWdodAkJPSByajU0bjEtPmhlaWdodDsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGFjdHVhbCBnZW9tZXRyeSBjb25maWd1cmF0aW9uIHJvdXRpbmUuIEl0IHNjYWxlcyB0aGUgaW5wdXQgd2luZG93IGludG8KKyAqIHRoZSBvdXRwdXQgb25lLCB1cGRhdGVzIHRoZSB3aW5kb3cgc2l6ZXMgYW5kIHJldHVybnMgYW4gZXJyb3Igb3IgdGhlIHJlc2l6ZQorICogY29lZmZpY2llbnQgb24gc3VjY2Vzcy4gTm90ZTogd2Ugb25seSB1c2UgdGhlICJGaXhlZCBTY2FsaW5nIiBvbiB0aGlzIGNhbWVyYS4KKyAqLworc3RhdGljIGludCByajU0bjFfc2Vuc29yX3NjYWxlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqaW5fdywgdTMyICppbl9oLAorCQkJICAgICAgIHUzMiAqb3V0X3csIHUzMiAqb3V0X2gpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCXVuc2lnbmVkIGludCBza2lwLCByZXNpemUsIGlucHV0X3cgPSAqaW5fdywgaW5wdXRfaCA9ICppbl9oLAorCQlvdXRwdXRfdyA9ICpvdXRfdywgb3V0cHV0X2ggPSAqb3V0X2g7CisJdTE2IGluY19zZWw7CisJaW50IHJldDsKKworCXJldCA9IHJqNTRuMV9zZXRfcmVjdChjbGllbnQsIFJKNTROMV9YX09VVFBVVF9TSVpFX1NfTCwKKwkJCSAgICAgIFJKNTROMV9ZX09VVFBVVF9TSVpFX1NfTCwKKwkJCSAgICAgIFJKNTROMV9YWV9PVVRQVVRfU0laRV9TX0gsIG91dHB1dF93LCBvdXRwdXRfaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJqNTRuMV9zZXRfcmVjdChjbGllbnQsIFJKNTROMV9YX09VVFBVVF9TSVpFX1BfTCwKKwkJCSAgICAgIFJKNTROMV9ZX09VVFBVVF9TSVpFX1BfTCwKKwkJCSAgICAgIFJKNTROMV9YWV9PVVRQVVRfU0laRV9QX0gsIG91dHB1dF93LCBvdXRwdXRfaCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvdXRwdXRfdyA+IGlucHV0X3cgfHwgb3V0cHV0X2ggPiBpbnB1dF9oKSB7CisJCWlucHV0X3cgPSBvdXRwdXRfdzsKKwkJaW5wdXRfaCA9IG91dHB1dF9oOworCisJCXJlc2l6ZSA9IDEwMjQ7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHJlc2l6ZV94LCByZXNpemVfeTsKKwkJcmVzaXplX3ggPSBpbnB1dF93ICogMTAyNCAvIG91dHB1dF93OworCQlyZXNpemVfeSA9IGlucHV0X2ggKiAxMDI0IC8gb3V0cHV0X2g7CisKKwkJcmVzaXplID0gbWluKHJlc2l6ZV94LCByZXNpemVfeSk7CisKKwkJLyogUHJvaGliaXRlZCB2YWx1ZSByYW5nZXMgKi8KKwkJc3dpdGNoIChyZXNpemUpIHsKKwkJY2FzZSAyMDQwIC4uLiAyMDQ3OgorCQkJcmVzaXplID0gMjAzOTsKKwkJCWJyZWFrOworCQljYXNlIDQwODAgLi4uIDQwOTU6CisJCQlyZXNpemUgPSA0MDc5OworCQkJYnJlYWs7CisJCWNhc2UgODE2MCAuLi4gODE5MToKKwkJCXJlc2l6ZSA9IDgxNTk7CisJCQlicmVhazsKKwkJY2FzZSAxNjMyMCAuLi4gMTYzODM6CisJCQlyZXNpemUgPSAxNjMxOTsKKwkJfQorCisJCWlucHV0X3cgPSBvdXRwdXRfdyAqIHJlc2l6ZSAvIDEwMjQ7CisJCWlucHV0X2ggPSBvdXRwdXRfaCAqIHJlc2l6ZSAvIDEwMjQ7CisJfQorCisJLyogU2V0IHNjYWxpbmcgKi8KKwlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUkVTSVpFX0hPTERfTCwgcmVzaXplICYgMHhmZik7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9SRVNJWkVfSE9MRF9ILCByZXNpemUgPj4gOCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQ29uZmlndXJlIGEgc2tpcHBpbmcgYml0bWFzay4gVGhlIHNlbnNvciB3aWxsIHNlbGVjdCBhIHNraXBwaW5nIHZhbHVlCisJICogYW1vbmcgc2V0IGJpdHMgYXV0b21hdGljYWxseS4KKwkgKi8KKwlza2lwID0gbWluKHJlc2l6ZSAvIDEwMjQsICh1bnNpZ25lZCkxNSk7CisJaW5jX3NlbCA9IDEgPDwgc2tpcDsKKworCWlmIChpbmNfc2VsIDw9IDIpCisJCWluY19zZWwgPSAweGM7CisJZWxzZSBpZiAocmVzaXplICYgMTAyMyAmJiBza2lwIDwgMTUpCisJCWluY19zZWwgfD0gMSA8PCAoc2tpcCArIDEpOworCisJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX0lOQ19VU0VfU0VMX0wsIGluY19zZWwgJiAweGZjKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX0lOQ19VU0VfU0VMX0gsIGluY19zZWwgPj4gOCk7CisKKwkvKiBTdGFydCByZXNpemluZyAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUkVTSVpFX0NPTlRST0wsCisJCQkJUkVTSVpFX0hPTERfU0VMIHwgUkVTSVpFX0dPIHwgMSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAicmVzaXplICV1LCBza2lwICV1XG4iLCByZXNpemUsIHNraXApOworCisJLyogQ29uc3RhbnQgdGFrZW4gZnJvbSBtYW51ZmFjdHVyZXIncyBleGFtcGxlICovCisJbXNsZWVwKDIzMCk7CisKKwlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUkVTSVpFX0NPTlRST0wsIFJFU0laRV9IT0xEX1NFTCB8IDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKmluX3cgPSBpbnB1dF93OworCSppbl9oID0gaW5wdXRfaDsKKwkqb3V0X3cgPSBvdXRwdXRfdzsKKwkqb3V0X2ggPSBvdXRwdXRfaDsKKworCXJldHVybiByZXNpemU7Cit9CisKK3N0YXRpYyBpbnQgcmo1NG4xX3NldF9jbG9jayhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOworCWludCByZXQ7CisKKwkvKiBFbmFibGUgZXh0ZXJuYWwgY2xvY2sgKi8KKwlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUkVTRVRfU1RBTkRCWSwgRV9FWENMSyB8IFNPRlRfU1REQlkpOworCS8qIExlYXZlIHN0YW5kLWJ5ICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9SRVNFVF9TVEFOREJZLCBFX0VYQ0xLKTsKKworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUExMX0wsIDIpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUExMX04sIDB4MzEpOworCisJLyogVEdDTEsgZGl2aWRlcnMgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX1JBVElPX1RHLAorCQkJCXJqNTRuMS0+Y2xrX2Rpdi5yYXRpb190Zyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9SQVRJT19ULAorCQkJCXJqNTRuMS0+Y2xrX2Rpdi5yYXRpb190KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX1JBVElPX1IsCisJCQkJcmo1NG4xLT5jbGtfZGl2LnJhdGlvX3IpOworCisJLyogRW5hYmxlIFRHQ0xLICYgUkFNUCAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUkFNUF9UR0NMS19FTiwgMyk7CisKKwkvKiBEaXNhYmxlIGNsb2NrIG91dHB1dCAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT0NMS19EU1AsIDApOworCisJLyogU2V0IGRpdmlzb3JzICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9SQVRJT19PUCwKKwkJCQlyajU0bjEtPmNsa19kaXYucmF0aW9fb3ApOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUkFUSU9fTywKKwkJCQlyajU0bjEtPmNsa19kaXYucmF0aW9fbyk7CisKKwkvKiBFbmFibGUgT0NMSyAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT0NMS19TRUxfRU4sIDEpOworCisJLyogVXNlIFBMTCBmb3IgVGltaW5nIEdlbmVyYXRvciwgd3JpdGUgMiB0byByZXNlcnZlZCBiaXRzICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9UR19CWVBBU1MsIDIpOworCisJLyogVGFrZSBzZW5zb3Igb3V0IG9mIHJlc2V0ICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9SRVNFVF9TVEFOREJZLAorCQkJCUVfRVhDTEsgfCBTRU5fUlNUWCk7CisJLyogRW5hYmxlIFBMTCAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfUExMX0VOLCAxKTsKKworCS8qIFdhaXQgZm9yIFBMTCB0byBzdGFiaWxpc2UgKi8KKwltc2xlZXAoMTApOworCisJLyogRW5hYmxlIGNsb2NrIHRvIGZyZXF1ZW5jeSBkaXZpZGVyICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9DTEtfUlNULCAxKTsKKworCWlmICghcmV0KQorCQlyZXQgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9DTEtfUlNUKTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiUmVzZXR0aW5nIFJKNTROMUNCMEMgY2xvY2sgZmFpbGVkOiAlZCFcbiIsIHJldCk7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiBTdGFydCB0aGUgUExMICovCisJcmV0ID0gcmVnX3NldChjbGllbnQsIFJKNTROMV9PQ0xLX0RTUCwgMSwgMSk7CisKKwkvKiBFbmFibGUgT0NMSyAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT0NMS19TRUxfRU4sIDEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByajU0bjFfcmVnX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0ID0gcmo1NG4xX3NldF9jbG9jayhjbGllbnQpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZV9tdWx0aXBsZShjbGllbnQsIGJhbmtfNywgQVJSQVlfU0laRShiYW5rXzcpKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlX211bHRpcGxlKGNsaWVudCwgYmFua18xMCwgQVJSQVlfU0laRShiYW5rXzEwKSk7CisKKwkvKiBTZXQgYmlubmluZyBkaXZpc29ycyAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfU0NBTEVfMV8yX0xFViwgMyB8ICg3IDw8IDQpKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX1NDQUxFXzRfTEVWLCAweGYpOworCisJLyogU3dpdGNoIHRvIGZpeGVkIHJlc2l6ZSBtb2RlICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9SRVNJWkVfQ09OVFJPTCwKKwkJCQlSRVNJWkVfSE9MRF9TRUwgfCAxKTsKKworCS8qIFNldCBnYWluICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9ZX0dBSU4sIDB4ODQpOworCisJLyogTWlycm9yIHRoZSBpbWFnZSBiYWNrOiBkZWZhdWx0IGlzIHVwc2lkZSBkb3duIGFuZCBsZWZ0LXRvLXJpZ2h0Li4uICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ19zZXQoY2xpZW50LCBSSjU0TjFfTUlSUk9SX1NUSUxMX01PREUsIDMsIDMpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZV9tdWx0aXBsZShjbGllbnQsIGJhbmtfNCwgQVJSQVlfU0laRShiYW5rXzQpKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlX211bHRpcGxlKGNsaWVudCwgYmFua181LCBBUlJBWV9TSVpFKGJhbmtfNSkpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGVfbXVsdGlwbGUoY2xpZW50LCBiYW5rXzgsIEFSUkFZX1NJWkUoYmFua184KSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX1JFU0VUX1NUQU5EQlksCisJCQkJRV9FWENMSyB8IERTUF9SU1RYIHwgU0VOX1JTVFgpOworCisJLyogQ29tbWl0IGluaXQgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gcmo1NG4xX2NvbW1pdChjbGllbnQpOworCisJLyogVGFrZSBEU1AsIFRHLCBzZW5zb3Igb3V0IG9mIHJlc2V0ICovCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9SRVNFVF9TVEFOREJZLAorCQkJCUVfRVhDTEsgfCBEU1BfUlNUWCB8IFRHX1JTVFggfCBTRU5fUlNUWCk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgMHg3ZmUsIDIpOworCisJLyogQ29uc3RhbnQgdGFrZW4gZnJvbSBtYW51ZmFjdHVyZXIncyBleGFtcGxlICovCisJbXNsZWVwKDcwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBGSVhNRTogc3RyZWFtaW5nIG91dHB1dCBvbmx5IHVwIHRvIDgwMHg2MDAgaXMgZnVuY3Rpb25hbCAqLworc3RhdGljIGludCByajU0bjFfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisKKwlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJaWYgKHBpeC0+d2lkdGggPiA4MDApCisJCXBpeC0+d2lkdGggPSA4MDA7CisJaWYgKHBpeC0+aGVpZ2h0ID4gNjAwKQorCQlwaXgtPmhlaWdodCA9IDYwMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJqNTRuMV9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCXVuc2lnbmVkIGludCBvdXRwdXRfdywgb3V0cHV0X2gsCisJCWlucHV0X3cgPSByajU0bjEtPnJlY3Qud2lkdGgsIGlucHV0X2ggPSByajU0bjEtPnJlY3QuaGVpZ2h0OworCWludCByZXQ7CisKKwkvKgorCSAqIFRoZSBob3N0IGRyaXZlciBjYW4gY2FsbCB1cyB3aXRob3V0IC50cnlfZm10KCksIHNvLCB3ZSBoYXZlIHRvIHRha2UKKwkgKiBjYXJlIG91cnNlbGV2ZXMKKwkgKi8KKwlyZXQgPSByajU0bjFfdHJ5X2ZtdChzZCwgZik7CisKKwkvKgorCSAqIFZlcmlmeSBpZiB0aGUgc2Vuc29yIGhhcyBqdXN0IGJlZW4gcG93ZXJlZCBvbi4gVE9ETzogcmVwbGFjZSB0aGlzCisJICogd2l0aCBwcm9wZXIgUE0sIHdoZW4gYSBzdWl0YWJsZSBBUEkgaXMgYXZhaWxhYmxlLgorCSAqLworCWlmICghcmV0KQorCQlyZXQgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9SRVNFVF9TVEFOREJZKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghKHJldCAmIEVfRVhDTEspKSB7CisJCXJldCA9IHJqNTRuMV9yZWdfaW5pdChjbGllbnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogUkFfU0VMX1VMIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHJhdyBtb2RlcywgaWdub3JlZCBvdGhlcndpc2UuICovCisJc3dpdGNoIChwaXgtPnBpeGVsZm9ybWF0KSB7CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX09VVF9TRUwsIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHJlZ19zZXQoY2xpZW50LCBSSjU0TjFfQllURV9TV0FQLCA4LCA4KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT1VUX1NFTCwgMHgxMSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmVnX3NldChjbGllbnQsIFJKNTROMV9CWVRFX1NXQVAsIDgsIDgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU3VwcG9ydGVkIHNjYWxlcyAxOjEgLSAxOjE2ICovCisJaWYgKHBpeC0+d2lkdGggPCBpbnB1dF93IC8gMTYpCisJCXBpeC0+d2lkdGggPSBpbnB1dF93IC8gMTY7CisJaWYgKHBpeC0+aGVpZ2h0IDwgaW5wdXRfaCAvIDE2KQorCQlwaXgtPmhlaWdodCA9IGlucHV0X2ggLyAxNjsKKworCW91dHB1dF93ID0gcGl4LT53aWR0aDsKKwlvdXRwdXRfaCA9IHBpeC0+aGVpZ2h0OworCisJcmV0ID0gcmo1NG4xX3NlbnNvcl9zY2FsZShzZCwgJmlucHV0X3csICZpbnB1dF9oLCAmb3V0cHV0X3csICZvdXRwdXRfaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyajU0bjEtPmZvdXJjYwkJPSBwaXgtPnBpeGVsZm9ybWF0OworCXJqNTRuMS0+cmVzaXplCQk9IHJldDsKKwlyajU0bjEtPnJlY3Qud2lkdGgJPSBpbnB1dF93OworCXJqNTRuMS0+cmVjdC5oZWlnaHQJPSBpbnB1dF9oOworCXJqNTRuMS0+d2lkdGgJCT0gb3V0cHV0X3c7CisJcmo1NG4xLT5oZWlnaHQJCT0gb3V0cHV0X2g7CisKKwlwaXgtPndpZHRoCQk9IG91dHB1dF93OworCXBpeC0+aGVpZ2h0CQk9IG91dHB1dF9oOworCXBpeC0+ZmllbGQJCT0gVjRMMl9GSUVMRF9OT05FOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByajU0bjFfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmlkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBzZC0+cHJpdjsKKworCWlmIChpZC0+bWF0Y2gudHlwZSAhPSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGlkLT5tYXRjaC5hZGRyICE9IGNsaWVudC0+YWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZC0+aWRlbnQJPSBWNEwyX0lERU5UX1JKNTROMUNCMEM7CisJaWQtPnJldmlzaW9uCT0gMDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCByajU0bjFfZ19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gc2QtPnByaXY7CisKKwlpZiAocmVnLT5tYXRjaC50eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiB8fAorCSAgICByZWctPnJlZyA8IDB4NDAwIHx8IHJlZy0+cmVnID4gMHgxZmZmKQorCQkvKiBSZWdpc3RlcnMgPiAweDA4MDAgYXJlIG9ubHkgYXZhaWxhYmxlIGZyb20gU2hhcnAgc3VwcG9ydCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZWctPm1hdGNoLmFkZHIgIT0gY2xpZW50LT5hZGRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJlZy0+c2l6ZSA9IDE7CisJcmVnLT52YWwgPSByZWdfcmVhZChjbGllbnQsIHJlZy0+cmVnKTsKKworCWlmIChyZWctPnZhbCA+IDB4ZmYpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmo1NG4xX3NfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCisJaWYgKHJlZy0+bWF0Y2gudHlwZSAhPSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFIgfHwKKwkgICAgcmVnLT5yZWcgPCAweDQwMCB8fCByZWctPnJlZyA+IDB4MWZmZikKKwkJLyogUmVnaXN0ZXJzID49IDB4MDgwMCBhcmUgb25seSBhdmFpbGFibGUgZnJvbSBTaGFycCBzdXBwb3J0ICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlZy0+bWF0Y2guYWRkciAhPSBjbGllbnQtPmFkZHIpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHJlZ193cml0ZShjbGllbnQsIHJlZy0+cmVnLCByZWctPnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcmo1NG4xX2NvbnRyb2xzW10gPSB7CisJeworCQkuaWQJCT0gVjRMMl9DSURfVkZMSVAsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lCQk9ICJGbGlwIFZlcnRpY2FsbHkiLAorCQkubWluaW11bQk9IDAsCisJCS5tYXhpbXVtCT0gMSwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZmF1bHRfdmFsdWUJPSAwLAorCX0sIHsKKwkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFsbHkiLAorCQkubWluaW11bQk9IDAsCisJCS5tYXhpbXVtCT0gMSwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZmF1bHRfdmFsdWUJPSAwLAorCX0sIHsKKwkJLmlkCQk9IFY0TDJfQ0lEX0dBSU4sCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCQk9ICJHYWluIiwKKwkJLm1pbmltdW0JPSAwLAorCQkubWF4aW11bQk9IDEyNywKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZmF1bHRfdmFsdWUJPSA2NiwKKwkJLmZsYWdzCQk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyByajU0bjFfb3BzID0geworCS5zZXRfYnVzX3BhcmFtCQk9IHJqNTRuMV9zZXRfYnVzX3BhcmFtLAorCS5xdWVyeV9idXNfcGFyYW0JPSByajU0bjFfcXVlcnlfYnVzX3BhcmFtLAorCS5jb250cm9scwkJPSByajU0bjFfY29udHJvbHMsCisJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJqNTRuMV9jb250cm9scyksCit9OworCitzdGF0aWMgaW50IHJqNTRuMV9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gc2QtPnByaXY7CisJaW50IGRhdGE7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9WRkxJUDoKKwkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFKTsKKwkJaWYgKGRhdGEgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gIShkYXRhICYgMSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSEZMSVA6CisJCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9NSVJST1JfU1RJTExfTU9ERSk7CisJCWlmIChkYXRhIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9ICEoZGF0YSAmIDIpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9ZX0dBSU4pOworCQlpZiAoZGF0YSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKworCQljdHJsLT52YWx1ZSA9IGRhdGEgLyAyOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByajU0bjFfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJaW50IGRhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHNkLT5wcml2OworCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmw7CisKKwlxY3RybCA9IHNvY19jYW1lcmFfZmluZF9xY3RybCgmcmo1NG4xX29wcywgY3RybC0+aWQpOworCWlmICghcWN0cmwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWlmIChjdHJsLT52YWx1ZSkKKwkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFLCAwLCAxKTsKKwkJZWxzZQorCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBSSjU0TjFfTUlSUk9SX1NUSUxMX01PREUsIDEsIDEpOworCQlpZiAoZGF0YSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJaWYgKGN0cmwtPnZhbHVlKQorCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBSSjU0TjFfTUlSUk9SX1NUSUxMX01PREUsIDAsIDIpOworCQllbHNlCisJCQlkYXRhID0gcmVnX3NldChjbGllbnQsIFJKNTROMV9NSVJST1JfU1RJTExfTU9ERSwgMiwgMik7CisJCWlmIChkYXRhIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWlmIChjdHJsLT52YWx1ZSA+IHFjdHJsLT5tYXhpbXVtIHx8CisJCSAgICBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVsc2UgaWYgKHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9ZX0dBSU4sIGN0cmwtPnZhbHVlICogMikgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHJqNTRuMV9zdWJkZXZfY29yZV9vcHMgPSB7CisJLmdfY3RybAkJPSByajU0bjFfZ19jdHJsLAorCS5zX2N0cmwJCT0gcmo1NG4xX3NfY3RybCwKKwkuZ19jaGlwX2lkZW50CT0gcmo1NG4xX2dfY2hpcF9pZGVudCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdfcmVnaXN0ZXIJPSByajU0bjFfZ19yZWdpc3RlciwKKwkuc19yZWdpc3Rlcgk9IHJqNTRuMV9zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyByajU0bjFfc3ViZGV2X3ZpZGVvX29wcyA9IHsKKwkuc19zdHJlYW0JPSByajU0bjFfc19zdHJlYW0sCisJLnNfZm10CQk9IHJqNTRuMV9zX2ZtdCwKKwkuZ19mbXQJCT0gcmo1NG4xX2dfZm10LAorCS50cnlfZm10CT0gcmo1NG4xX3RyeV9mbXQsCisJLmdfY3JvcAkJPSByajU0bjFfZ19jcm9wLAorCS5jcm9wY2FwCT0gcmo1NG4xX2Nyb3BjYXAsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyByajU0bjFfc3ViZGV2X29wcyA9IHsKKwkuY29yZQk9ICZyajU0bjFfc3ViZGV2X2NvcmVfb3BzLAorCS52aWRlbwk9ICZyajU0bjFfc3ViZGV2X3ZpZGVvX29wcywKK307CisKK3N0YXRpYyBpbnQgcmo1NG4xX3Bpbl9jb25maWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwkvKgorCSAqIEV4cGVyaW1lbnRhbGx5IGZvdW5kIG91dCBJT0NUUkwgd2lyZWQgdG8gMC4gVE9ETzogYWRkIHRvIHBsYXRmb3JtCisJICogZGF0YTogMCBvciAxIDw8IDcuCisJICovCisJcmV0dXJuIHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9JT0MsIDApOworfQorCisvKgorICogSW50ZXJmYWNlIGFjdGl2ZSwgY2FuIHVzZSBpMmMuIElmIGl0IGZhaWxzLCBpdCBjYW4gaW5kZWVkIG1lYW4sIHRoYXQKKyAqIHRoaXMgd2Fzbid0IG91ciBjYXB0dXJlIGludGVyZmFjZSwgc28sIHdlIHdhaXQgZm9yIHRoZSByaWdodCBvbmUKKyAqLworc3RhdGljIGludCByajU0bjFfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBkYXRhMSwgZGF0YTI7CisJaW50IHJldDsKKworCS8qIFRoaXMgY291bGQgYmUgYSBCVUdfT04oKSBvciBhIFdBUk5fT04oKSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgKi8KKwlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAorCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBSZWFkIG91dCB0aGUgY2hpcCB2ZXJzaW9uIHJlZ2lzdGVyICovCisJZGF0YTEgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9ERVZfQ09ERSk7CisJZGF0YTIgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9ERVZfQ09ERTIpOworCisJaWYgKGRhdGExICE9IDB4NTEgfHwgZGF0YTIgIT0gMHgxMCkgeworCQlyZXQgPSAtRU5PREVWOworCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJObyBSSjU0TjFDQjBDIGZvdW5kLCByZWFkIDB4JXg6MHgleFxuIiwKKwkJCSBkYXRhMSwgZGF0YTIpOworCQlnb3RvIGVpMmM7CisJfQorCisJcmV0ID0gcmo1NG4xX3Bpbl9jb25maWcoY2xpZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlaTJjOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRGV0ZWN0ZWQgYSBSSjU0TjFDQjBDIGNoaXAgSUQgMHgleDoweCV4XG4iLAorCQkgZGF0YTEsIGRhdGEyKTsKKworZWkyYzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJqNTRuMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKK3sKKwlzdHJ1Y3Qgcmo1NG4xICpyajU0bjE7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsOworCWludCByZXQ7CisKKwlpZiAoIWljZCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlJKNTROMUNCMEM6IG1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOworCWlmICghaWNsKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUko1NE4xQ0IwQzogbWlzc2luZyBwbGF0Zm9ybSBkYXRhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LAorCQkJICJJMkMtQWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgSTJDX0ZVTkNfU01CVVNfQllURVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJqNTRuMSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByajU0bjEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJqNTRuMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcmo1NG4xLT5zdWJkZXYsIGNsaWVudCwgJnJqNTRuMV9zdWJkZXZfb3BzKTsKKworCWljZC0+b3BzCQk9ICZyajU0bjFfb3BzOworCisJcmo1NG4xLT5jbGtfZGl2CQk9IGNsa19kaXY7CisJcmo1NG4xLT5yZWN0LmxlZnQJPSBSSjU0TjFfQ09MVU1OX1NLSVA7CisJcmo1NG4xLT5yZWN0LnRvcAk9IFJKNTROMV9ST1dfU0tJUDsKKwlyajU0bjEtPnJlY3Qud2lkdGgJPSBSSjU0TjFfTUFYX1dJRFRIOworCXJqNTRuMS0+cmVjdC5oZWlnaHQJPSBSSjU0TjFfTUFYX0hFSUdIVDsKKwlyajU0bjEtPndpZHRoCQk9IFJKNTROMV9NQVhfV0lEVEg7CisJcmo1NG4xLT5oZWlnaHQJCT0gUko1NE4xX01BWF9IRUlHSFQ7CisJcmo1NG4xLT5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX1lVWVY7CisJcmo1NG4xLT5yZXNpemUJCT0gMTAyNDsKKworCXJldCA9IHJqNTRuMV92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWNkLT5vcHMgPSBOVUxMOworCQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwkJa2ZyZWUocmo1NG4xKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpY2QtPmZvcm1hdHMJCT0gcmo1NG4xX2NvbG91cl9mb3JtYXRzOworCWljZC0+bnVtX2Zvcm1hdHMJPSBBUlJBWV9TSVpFKHJqNTRuMV9jb2xvdXJfZm9ybWF0cyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJqNTRuMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgcmo1NG4xICpyajU0bjEgPSB0b19yajU0bjEoY2xpZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CisKKwlpY2QtPm9wcyA9IE5VTEw7CisJaWYgKGljbC0+ZnJlZV9idXMpCisJCWljbC0+ZnJlZV9idXMoaWNsKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwljbGllbnQtPmRyaXZlciA9IE5VTEw7CisJa2ZyZWUocmo1NG4xKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcmo1NG4xX2lkW10gPSB7CisJeyAicmo1NG4xY2IwYyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcmo1NG4xX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJqNTRuMV9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInJqNTRuMWNiMGMiLAorCX0sCisJLnByb2JlCQk9IHJqNTRuMV9wcm9iZSwKKwkucmVtb3ZlCQk9IHJqNTRuMV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gcmo1NG4xX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmo1NG4xX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZyajU0bjFfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByajU0bjFfbW9kX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcmo1NG4xX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChyajU0bjFfbW9kX2luaXQpOworbW9kdWxlX2V4aXQocmo1NG4xX21vZF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaGFycCBSSjU0TjFDQjBDIENhbWVyYSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zMjI1NWRydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zMjI1NWRydi5jCmluZGV4IDJjMGJiMDYuLjQxNzY1ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczIyNTVkcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3MyMjU1ZHJ2LmMKQEAgLTE5NTgsNyArMTk1OCw3IEBACiAJCQkJaWYgKHBkd29yZFsxXSA+PSBNQVhfQ0hBTk5FTFMpCiAJCQkJCWJyZWFrOwogCQkJCWNjID0gR19jaG5tYXBbcGR3b3JkWzFdXTsKLQkJCQlpZiAoIShjYyA+PSAwICYmIGNjIDwgTUFYX0NIQU5ORUxTKSkKKwkJCQlpZiAoY2MgPj0gTUFYX0NIQU5ORUxTKQogCQkJCQlicmVhazsKIAkJCQlzd2l0Y2ggKHBkd29yZFsyXSkgewogCQkJCWNhc2UgUzIyNTVfUkVTUE9OU0VfU0VUTU9ERToKQEAgLTE5ODAsNyArMTk4MCw3IEBACiAJCQkJCXdha2VfdXAoJmRldi0+ZndfZGF0YS0+d2FpdF9mdyk7CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gInMyMjU1IHVua253biByZXNwXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTUgdW5rbm93biByZXNwXG4iKTsKIAkJCQl9CiAJCQlkZWZhdWx0OgogCQkJCXBkYXRhKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCmluZGV4IDVjMjRjOTkuLjNiY2E3NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIHsKIAlzdHJ1Y3Qgc2FhNzExMCAqZGVjb2RlciA9IHRvX3NhYTcxMTAoc2QpOwogCi0JaWYgKGlucHV0IDwgMCB8fCBpbnB1dCA+PSBTQUE3MTEwX01BWF9JTlBVVCkgeworCWlmIChpbnB1dCA+PSBTQUE3MTEwX01BWF9JTlBVVCkgewogCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJpbnB1dD0lZCBub3QgYXZhaWxhYmxlXG4iLCBpbnB1dCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IDA5MDEzMjIuLjdlNDBkNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtNTIzOSw2ICs1MjM5LDcgQEAKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCiAJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCiAJCS5pbnB1dHMgICAgICAgICA9IHsgewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAyLApAQCAtNTI3OSw2ICs1MjgwLDQ2IEBACiAJCQkuYW11eCA9IFRWLAogCQl9LAogCX0sCisJW1NBQTcxMzRfQk9BUkRfQVNVU19FVVJPUEFfSFlCUklEXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkFzdXMgRXVyb3BhIEh5YnJpZCBPRU0iLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REMTMxNiwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gMHg2MSwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X1BPUlQxX0FDVElWRSwKKwkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKKwkJLmlucHV0cyA9IHsgeworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMywKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSA0LAorCQkJLmFtdXggICA9IExJTkUyLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSB9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfTEVBRFRFS19XSU5GQVNUX0RUVjEwMDBTXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkxlYWR0ZWsgV2luZmFzdCBEVFYxMDAwUyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5pbnB1dHMgICAgICAgICA9IHsgeworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQl9LCB7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQl9IH0sCisJfSwKIAogfTsKIApAQCAtNjQxOCw2ICs2NDU5LDE4IEBACiAJCS5zdWJkZXZpY2UgICAgPSAweDIwMDQsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1pPTElEX0hZQlJJRF9QQ0ksCiAJfSwgeworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEwNDMsCisJCS5zdWJkZXZpY2UgICAgPSAweDQ4NDcsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNfRVVST1BBX0hZQlJJRCwKKwl9LCB7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTA3ZCwKKwkJLnN1YmRldmljZSAgICA9IDB4NjY1NSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfTEVBRFRFS19XSU5GQVNUX0RUVjEwMDBTLAorCX0sIHsKIAkJLyogLS0tIGJvYXJkcyB3aXRob3V0IGVlcHJvbSArIHN1YnN5c3RlbSBJRCAtLS0gKi8KIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LApAQCAtNjc0OCw2ICs2ODAxLDcgQEAKIAljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1BMVVNfVFZfQU5BTE9HOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfR09fMDA3X0ZNX1BMVVM6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1JPVkVSTUVESUFfTElOS19QUk9fRk06CisJY2FzZSBTQUE3MTM0X0JPQVJEX0xFQURURUtfV0lORkFTVF9EVFYxMDAwUzoKIAkJZGV2LT5oYXNfcmVtb3RlID0gU0FBNzEzNF9SRU1PVEVfR1BJTzsKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlNfTFIzMDA6CkBAIC03MDc5LDYgKzcxMzMsNyBAQAogCQkvKiBicmVhayBpbnRlbnRpb25hbGx5IG9taXR0ZWQgKi8KIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0RWQlRfMzAwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTX0VVUk9QQTJfSFlCUklEOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTX0VVUk9QQV9IWUJSSUQ6CiAJewogCiAJCS8qIFRoZSBQaGlsaXBzIEVVUk9QQSBiYXNlZCBoeWJyaWQgYm9hcmRzIGhhdmUgdGhlIHR1bmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKaW5kZXggZjg3NzU3Zi4uMGJhN2Y1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMTAzMiw3ICsxMDMyLDcgQEAKIAlzYWE3MTM0X2lycV92aWRlb19zaWduYWxjaGFuZ2UoZGV2KTsKIAogCWlmIChUVU5FUl9BQlNFTlQgIT0gZGV2LT50dW5lcl90eXBlKQotCQlzYWFfY2FsbF9hbGwoZGV2LCB0dW5lciwgc19zdGFuZGJ5KTsKKwkJc2FhX2NhbGxfYWxsKGRldiwgY29yZSwgc19wb3dlciwgMCk7CiAKIAkvKiByZWdpc3RlciB2NGwgZGV2aWNlcyAqLwogCWlmIChzYWE3MTM0X25vX292ZXJsYXkgPiAwKQpAQCAtMTMxOSw3ICsxMzE5LDcgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGludCBzYWE3MTM0X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHNhYTcxMzRfaW5pdCh2b2lkKQogewogCUlOSVRfTElTVF9IRUFEKCZzYWE3MTM0X2Rldmxpc3QpOwogCXByaW50ayhLRVJOX0lORk8gInNhYTcxMzAvMzQ6IHY0bDIgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLApAQCAtMTMzMyw3ICsxMzMzLDcgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2FhNzEzNF9wY2lfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgc2FhNzEzNF9maW5pKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgc2FhNzEzNF9maW5pKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzYWE3MTM0X3BjaV9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwppbmRleCBhMjZlOTk3Li43MzczOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgInRkYTEwMDR4LmgiCiAjaW5jbHVkZSAibnh0MjAweC5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgorI2luY2x1ZGUgInhjNTAwMC5oIgogCiAjaW5jbHVkZSAidGRhMTAwODYuaCIKICNpbmNsdWRlICJ0ZGE4MjZ4LmgiCkBAIC04NzEsNiArODcyLDIwIEBACiAJLmRpc2FibGVfaTJjX2dhdGVfY3RybCA9IDEsCiB9OwogCitzdGF0aWMgc3RydWN0IHhjNTAwMF9jb25maWcgYmVob2xkX3g3X3R1bmVyY29uZmlnID0geworCS5pMmNfYWRkcmVzcyAgICAgID0gMHhjMj4+MSwKKwkuaWZfa2h6ICAgICAgICAgICA9IDQ1NjAsCisJLnJhZGlvX2lucHV0ICAgICAgPSBYQzUwMDBfUkFESU9fRk0xLAorfTsKKworc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBiZWhvbGRfeDdfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgxZT4+MSwKKwkuaWYyICAgICAgICAgICA9IDQ1NjAwLAorCS5ub190dW5lciAgICAgID0gMSwKKwkucGFyYWxsZWxfdHMgICA9IDEsCisJLmRpc2FibGVfaTJjX2dhdGVfY3RybCA9IDEsCit9OworCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIHRkYTEwMDg2IGJhc2VkIERWQi1TIGNhcmRzLCBoZWxwZXIgZnVuY3Rpb25zCiAgKi8KQEAgLTEwMzAsNiArMTA0NSwzMiBAQAogCS5nYXRlICAgID0gVERBMTgyNzFfR0FURV9BTkFMT0csCiB9OwogCitzdGF0aWMgc3RydWN0IHRkYTEwMDQ4X2NvbmZpZyBkdHYxMDAwc190ZGExMDA0OF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgICAgPSAweDEwID4+IDEsCisJLm91dHB1dF9tb2RlICAgICAgPSBUREExMDA0OF9QQVJBTExFTF9PVVRQVVQsCisJLmZ3YnVsa3dyaXRlbGVuICAgPSBUREExMDA0OF9CVUxLV1JJVEVfMjAwLAorCS5pbnZlcnNpb24gICAgICAgID0gVERBMTAwNDhfSU5WRVJTSU9OX09OLAorCS5kdHY2X2lmX2ZyZXFfa2h6ID0gVERBMTAwNDhfSUZfMzMwMCwKKwkuZHR2N19pZl9mcmVxX2toeiA9IFREQTEwMDQ4X0lGXzM4MDAsCisJLmR0djhfaWZfZnJlcV9raHogPSBUREExMDA0OF9JRl80MzAwLAorCS5jbGtfZnJlcV9raHogICAgID0gVERBMTAwNDhfQ0xLXzE2MDAwLAorCS5kaXNhYmxlX2dhdGVfYWNjZXNzID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGRhMTgyNzFfc3RkX21hcCBkdHYxMDAwc190ZGExODI3MV9zdGRfbWFwID0geworCS5kdmJ0XzYgICA9IHsgLmlmX2ZyZXEgPSAzMzAwLCAuYWdjX21vZGUgPSAzLCAuc3RkID0gNCwKKwkJICAgICAgLmlmX2x2bCA9IDEsIC5yZmFnY190b3AgPSAweDM3LCB9LAorCS5kdmJ0XzcgICA9IHsgLmlmX2ZyZXEgPSAzODAwLCAuYWdjX21vZGUgPSAzLCAuc3RkID0gNSwKKwkJICAgICAgLmlmX2x2bCA9IDEsIC5yZmFnY190b3AgPSAweDM3LCB9LAorCS5kdmJ0XzggICA9IHsgLmlmX2ZyZXEgPSA0MzAwLCAuYWdjX21vZGUgPSAzLCAuc3RkID0gNiwKKwkJICAgICAgLmlmX2x2bCA9IDEsIC5yZmFnY190b3AgPSAweDM3LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0ZGExODI3MV9jb25maWcgZHR2MTAwMHNfdGRhMTgyNzFfY29uZmlnID0geworCS5zdGRfbWFwID0gJmR0djEwMDBzX3RkYTE4MjcxX3N0ZF9tYXAsCisJLmdhdGUgICAgPSBUREExODI3MV9HQVRFX0FOQUxPRywKK307CisKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29yZSBjb2RlCiAgKi8KQEAgLTExMTYsNiArMTE1Nyw3IEBACiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSElMSVBTX0VVUk9QQToKIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0RWQlRfMzAwOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTX0VVUk9QQV9IWUJSSUQ6CiAJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCiAJCQkJCSAgICAgICAmcGhpbGlwc19ldXJvcGFfY29uZmlnLAogCQkJCQkgICAgICAgJmRldi0+aTJjX2FkYXApOwpAQCAtMTQ4Miw2ICsxNTI0LDE1IEBACiAJCQkJICAgVFVORVJfUEhJTElQU19GTUQxMjE2TUVYX01LMyk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0JFSE9MRF9YNzoKKwkJZmUwLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAorCQkJCQkJJmJlaG9sZF94N19jb25maWcsCisJCQkJCQkmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCkgeworCQkJZHZiX2F0dGFjaCh4YzUwMDBfYXR0YWNoLCBmZTAtPmR2Yi5mcm9udGVuZCwKKwkJCQkgICAmZGV2LT5pMmNfYWRhcCwgJmJlaG9sZF94N190dW5lcmNvbmZpZyk7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9BNzAwX1BSTzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0E3MDBfSFlCUklEOgogCQkvKiBaYXJsaW5rIFpMMTAzMTMgKi8KQEAgLTE1MTgsNiArMTU2OSwxOSBAQAogCQkJCSAgICZ6b2xpZF90ZGExODI3MV9jb25maWcpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfRFRWMTAwMFM6CisJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0OF9hdHRhY2gsCisJCQkJCSAgICAgICAmZHR2MTAwMHNfdGRhMTAwNDhfY29uZmlnLAorCQkJCQkgICAgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZHZiX2F0dGFjaCh0ZGE4Mjl4X2F0dGFjaCwgZmUwLT5kdmIuZnJvbnRlbmQsCisJCQkJICAgJmRldi0+aTJjX2FkYXAsIDB4NGIsCisJCQkJICAgJnRkYTgyOXhfbm9fcHJvYmUpOworCQkJZHZiX2F0dGFjaCh0ZGExODI3MV9hdHRhY2gsIGZlMC0+ZHZiLmZyb250ZW5kLAorCQkJCSAgIDB4NjAsICZkZXYtPmkyY19hZGFwLAorCQkJCSAgICZkdHYxMDAwc190ZGExODI3MV9jb25maWcpOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXdwcmludGsoIkh1aD8gdW5rbm93biBEVkIgY2FyZD9cbiIpOwogCQlicmVhazsKQEAgLTE1NTAsNyArMTYxNCw3IEBACiAKIAkvKiByZWdpc3RlciBldmVyeXRoaW5nIGVsc2UgKi8KIAlyZXQgPSB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXJfYnVzKCZkZXYtPmZyb250ZW5kcywgVEhJU19NT0RVTEUsIGRldiwKLQkJJmRldi0+cGNpLT5kZXYsIGFkYXB0ZXJfbnIsIDApOworCQkJCQkmZGV2LT5wY2ktPmRldiwgYWRhcHRlcl9uciwgMCwgTlVMTCk7CiAKIAkvKiB0aGlzIHNlcXVlbmNlIGlzIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSB0ZGExMDA0eCBsb2FkIGl0cyBmaXJtd2FyZQogCSAqIGFuZCB0byBlbnRlciBhbmFsb2cgbW9kZSBvZiBoeWJyaWQgYm9hcmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwppbmRleCBhMGU4YzYyLi43NDQ5MThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKQEAgLTEwMiwxNCArMTAyLDE0IEBACiAJCWlmIChkYXRhID09IGlyLT5tYXNrX2tleWNvZGUpCiAJCQlpcl9pbnB1dF9ub2tleShpci0+ZGV2LCAmaXItPmlyKTsKIAkJZWxzZQotCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJCWlyX2lucHV0X2tleWRvd24oaXItPmRldiwgJmlyLT5pciwgZGF0YSk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChpci0+cG9sbGluZykgewogCQlpZiAoKGlyLT5tYXNrX2tleWRvd24gICYmICAoMCAhPSAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pKSkgfHwKIAkJICAgIChpci0+bWFza19rZXl1cCAgICAmJiAgKDAgPT0gKGdwaW8gJiBpci0+bWFza19rZXl1cCkpKSkgewotCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJCWlyX2lucHV0X2tleWRvd24oaXItPmRldiwgJmlyLT5pciwgZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlpcl9pbnB1dF9ub2tleShpci0+ZGV2LCAmaXItPmlyKTsKIAkJfQpAQCAtMTE3LDcgKzExNyw3IEBACiAJZWxzZSB7CS8qIElSUSBkcml2ZW4gbW9kZSAtIGhhbmRsZSBrZXkgcHJlc3MgYW5kIHJlbGVhc2UgaW4gb25lIGdvICovCiAJCWlmICgoaXItPm1hc2tfa2V5ZG93biAgJiYgICgwICE9IChncGlvICYgaXItPm1hc2tfa2V5ZG93bikpKSB8fAogCQkgICAgKGlyLT5tYXNrX2tleXVwICAgICYmICAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkpKSB7Ci0JCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGRhdGEsIGRhdGEpOworCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhKTsKIAkJCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+aXIpOwogCQl9CiAJfQpAQCAtNjE2LDYgKzYxNiwxMiBAQAogCQltYXNrX2tleWNvZGUgPSAweDAwM2YwMDsKIAkJbWFza19rZXlkb3duID0gMHgwNDAwMDA7CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfRFRWMTAwMFM6CisJCWlyX2NvZGVzICAgICA9ICZpcl9jb2Rlc193aW5mYXN0X3RhYmxlOworCQltYXNrX2tleWNvZGUgPSAweDVmMDA7CisJCW1hc2tfa2V5dXAgICA9IDB4MDIwMDAwOworCQlwb2xsaW5nICAgICAgPSA1MDsgLyogbXMgKi8KKwkJYnJlYWs7CiAJfQogCWlmIChOVUxMID09IGlyX2NvZGVzKSB7CiAJCXByaW50aygiJXM6IE9vcHM6IElSIGNvbmZpZyBlcnJvciBbY2FyZD0lZF1cbiIsCkBAIC02NDYsNyArNjUyLDEwIEBACiAJc25wcmludGYoaXItPnBoeXMsIHNpemVvZihpci0+cGh5cyksICJwY2ktJXMvaXIwIiwKIAkJIHBjaV9uYW1lKGRldi0+cGNpKSk7CiAKLQlpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgaXJfdHlwZSwgaXJfY29kZXMpOworCWVyciA9IGlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBpcl90eXBlLCBpcl9jb2Rlcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX291dF9mcmVlOworCiAJaW5wdXRfZGV2LT5uYW1lID0gaXItPm5hbWU7CiAJaW5wdXRfZGV2LT5waHlzID0gaXItPnBoeXM7CiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BDSTsKQEAgLTY3Nyw2ICs2ODYsNyBAQAogCXNhYTcxMzRfaXJfc3RvcChkZXYpOwogCWRldi0+cmVtb3RlID0gTlVMTDsKICBlcnJfb3V0X2ZyZWU6CisJaXJfaW5wdXRfZnJlZShpbnB1dF9kZXYpOwogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CiAJa2ZyZWUoaXIpOwogCXJldHVybiBlcnI7CkBAIC02ODgsNiArNjk4LDcgQEAKIAkJcmV0dXJuOwogCiAJc2FhNzEzNF9pcl9zdG9wKGRldik7CisJaXJfaW5wdXRfZnJlZShkZXYtPnJlbW90ZS0+ZGV2KTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkZXYtPnJlbW90ZS0+ZGV2KTsKIAlrZnJlZShkZXYtPnJlbW90ZSk7CiAJZGV2LT5yZW1vdGUgPSBOVUxMOwpAQCAtNjk1LDEwICs3MDYsNyBAQAogCiB2b2lkIHNhYTcxMzRfcHJvYmVfaTJjX2lyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewotCWNvbnN0IHVuc2lnbmVkIHNob3J0IGFkZHJfbGlzdFtdID0gewotCQkweDdhLCAweDQ3LCAweDcxLCAweDJkLAotCQlJMkNfQ0xJRU5UX0VORAotCX07CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CiAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dfbXNpID0gewogCQkuYWRkciA9IDB4NTAsCkBAIC03MTQsOSArNzIyLDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCW1lbXNldCgmZGV2LT5pbmZvLCAwLCBzaXplb2YoZGV2LT5pbmZvKSk7CisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CiAJbWVtc2V0KCZkZXYtPmluaXRfZGF0YSwgMCwgc2l6ZW9mKGRldi0+aW5pdF9kYXRhKSk7Ci0Jc3RybGNweShkZXYtPmluZm8udHlwZSwgImlyX3ZpZGVvIiwgSTJDX05BTUVfU0laRSk7CisJc3RybGNweShpbmZvLnR5cGUsICJpcl92aWRlbyIsIEkyQ19OQU1FX1NJWkUpOwogCiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfMTEwaToKQEAgLTcyNSwyMyArNzMzLDI0IEBACiAJCWlmIChwaW5uYWNsZV9yZW1vdGUgPT0gMCkgewogCQkJZGV2LT5pbml0X2RhdGEuZ2V0X2tleSA9IGdldF9rZXlfcGlubmFjbGVfY29sb3I7CiAJCQlkZXYtPmluaXRfZGF0YS5pcl9jb2RlcyA9ICZpcl9jb2Rlc19waW5uYWNsZV9jb2xvcl90YWJsZTsKLQkJCWRldi0+aW5mby5hZGRyID0gMHg0NzsKKwkJCWluZm8uYWRkciA9IDB4NDc7CiAJCX0gZWxzZSB7CiAJCQlkZXYtPmluaXRfZGF0YS5nZXRfa2V5ID0gZ2V0X2tleV9waW5uYWNsZV9ncmV5OwogCQkJZGV2LT5pbml0X2RhdGEuaXJfY29kZXMgPSAmaXJfY29kZXNfcGlubmFjbGVfZ3JleV90YWJsZTsKLQkJCWRldi0+aW5mby5hZGRyID0gMHg0NzsKKwkJCWluZm8uYWRkciA9IDB4NDc7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1VQTU9TVF9QVVJQTEVfVFY6CiAJCWRldi0+aW5pdF9kYXRhLm5hbWUgPSAiUHVycGxlIFRWIjsKIAkJZGV2LT5pbml0X2RhdGEuZ2V0X2tleSA9IGdldF9rZXlfcHVycGxldHY7CiAJCWRldi0+aW5pdF9kYXRhLmlyX2NvZGVzID0gJmlyX2NvZGVzX3B1cnBsZXR2X3RhYmxlOworCQlpbmZvLmFkZHIgPSAweDdhOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfTVNJX1RWQVRBTllXSEVSRV9QTFVTOgogCQlkZXYtPmluaXRfZGF0YS5uYW1lID0gIk1TSSBUVkBueXdoZXJlIFBsdXMiOwogCQlkZXYtPmluaXRfZGF0YS5nZXRfa2V5ID0gZ2V0X2tleV9tc2lfdHZhbnl3aGVyZV9wbHVzOwogCQlkZXYtPmluaXRfZGF0YS5pcl9jb2RlcyA9ICZpcl9jb2Rlc19tc2lfdHZhbnl3aGVyZV9wbHVzX3RhYmxlOwotCQlkZXYtPmluZm8uYWRkciA9IDB4MzA7CisJCWluZm8uYWRkciA9IDB4MzA7CiAJCS8qIE1TSSBUVkBueXdoZXJlIFBsdXMgY29udHJvbGxlciBkb2Vzbid0IHNlZW0gdG8KIAkJICAgcmVzcG9uZCB0byBwcm9iZXMgdW5sZXNzIHdlIHJlYWQgc29tZXRoaW5nIGZyb20KIAkJICAgYW4gZXhpc3RpbmcgZGV2aWNlLiBXZWlyZC4uLgpAQCAtNzU1LDYgKzc2NCw3IEBACiAJCWRldi0+aW5pdF9kYXRhLm5hbWUgPSAiSFZSIDExMTAiOwogCQlkZXYtPmluaXRfZGF0YS5nZXRfa2V5ID0gZ2V0X2tleV9odnIxMTEwOwogCQlkZXYtPmluaXRfZGF0YS5pcl9jb2RlcyA9ICZpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3X3RhYmxlOworCQlpbmZvLmFkZHIgPSAweDcxOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQkVIT0xEXzYwN0ZNX01LMzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQkVIT0xEXzYwN0ZNX01LNToKQEAgLTc3MiwyMyArNzgyLDIwIEBACiAJCWRldi0+aW5pdF9kYXRhLm5hbWUgPSAiQmVob2xkVFYiOwogCQlkZXYtPmluaXRfZGF0YS5nZXRfa2V5ID0gZ2V0X2tleV9iZWhvbGRtNnh4OwogCQlkZXYtPmluaXRfZGF0YS5pcl9jb2RlcyA9ICZpcl9jb2Rlc19iZWhvbGRfdGFibGU7CisJCWluZm8uYWRkciA9IDB4MmQ7CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVU181MDE6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTXzUwNjoKLQkJZGV2LT5pbmZvLmFkZHIgPSAweDQwOworCQlpbmZvLmFkZHIgPSAweDQwOwogCQlicmVhazsKLQl9Ci0KLQlpZiAoZGV2LT5pbml0X2RhdGEubmFtZSkKLQkJZGV2LT5pbmZvLnBsYXRmb3JtX2RhdGEgPSAmZGV2LT5pbml0X2RhdGE7Ci0JLyogTm8gbmVlZCB0byBwcm9iZSBpZiBhZGRyZXNzIGlzIGtub3duICovCi0JaWYgKGRldi0+aW5mby5hZGRyKSB7Ci0JCWkyY19uZXdfZGV2aWNlKCZkZXYtPmkyY19hZGFwLCAmZGV2LT5pbmZvKTsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCJObyBJMkMgSVIgc3VwcG9ydCBmb3IgYm9hcmQgJXhcbiIsIGRldi0+Ym9hcmQpOwogCQlyZXR1cm47CiAJfQogCi0JLyogQWRkcmVzcyBub3Qga25vd24sIGZhbGxiYWNrIHRvIHByb2JpbmcgKi8KLQlpMmNfbmV3X3Byb2JlZF9kZXZpY2UoJmRldi0+aTJjX2FkYXAsICZkZXYtPmluZm8sIGFkZHJfbGlzdCk7CisJaWYgKGRldi0+aW5pdF9kYXRhLm5hbWUpCisJCWluZm8ucGxhdGZvcm1fZGF0YSA9ICZkZXYtPmluaXRfZGF0YTsKKwlpMmNfbmV3X2RldmljZSgmZGV2LT5pMmNfYWRhcCwgJmluZm8pOwogfQogCiBzdGF0aWMgaW50IHNhYTcxMzRfcmM1X2lycShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKQEAgLTkzNiw3ICs5NDMsNyBAQAogCQlkcHJpbnRrKCJzY2FuY29kZSA9IDB4JTAyeCAoY29kZSA9IDB4JTAyeCwgbm90Y29kZT0gMHglMDJ4KVxuIiwKIAkJCSBpci0+Y29kZSwgaXJjb2RlLCBub3RfY29kZSk7CiAKLQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBpci0+Y29kZSwgaXItPmNvZGUpOworCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGlyLT5jb2RlKTsKIAl9IGVsc2UKIAkJZHByaW50aygiUmVwZWF0IGxhc3Qga2V5XG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKaW5kZXggZGEyNmY0Ny4uMzVmOGRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCkBAIC0xNDk5LDcgKzE0OTksNyBAQAogCXNhYV9hbmRvcmIoU0FBNzEzNF9PRk1UX0RBVEFfQSwgMHgxZiwgMCk7CiAJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfREFUQV9CLCAweDFmLCAwKTsKIAotCXNhYV9jYWxsX2FsbChkZXYsIHR1bmVyLCBzX3N0YW5kYnkpOworCXNhYV9jYWxsX2FsbChkZXYsIGNvcmUsIHNfcG93ZXIsIDApOwogCWlmIChmaC0+cmFkaW8pCiAJCXNhYV9jYWxsX2FsbChkZXYsIGNvcmUsIGlvY3RsLCBSRFNfQ01EX0NMT1NFLCAmY21kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggZjg2OTdkNC4uNTNiN2UwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0yOTcsNiArMjk3LDggQEAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9CRUhPTERfWDcgICAgICAgICAgICAgMTcxCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUk9WRVJNRURJQV9MSU5LX1BST19GTSAxNzIKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9aT0xJRF9IWUJSSURfUENJCQkxNzMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BU1VTX0VVUk9QQV9IWUJSSUQJMTc0CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfTEVBRFRFS19XSU5GQVNUX0RUVjEwMDBTIDE3NQogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDMyCiAjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKQEAgLTU5Miw3ICs1OTQsNiBAQAogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGluc3VzcGVuZDsKIAogCS8qIEkyQyBrZXlib2FyZCBkYXRhICovCi0Jc3RydWN0IGkyY19ib2FyZF9pbmZvICAgICAgaW5mbzsKIAlzdHJ1Y3QgSVJfaTJjX2luaXRfZGF0YSAgICBpbml0X2RhdGE7CiAKIAkvKiBTQUE3MTM0X01QRUdfKiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY29yZS5jCmluZGV4IDcwOWFmZmMuLmU2YWEwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jb3JlLmMKQEAgLTcyNCwxMyArNzI0LDEzIEBACiAJLnJlc3VtZSAgID0gTlVMTCwKIH07CiAKLXN0YXRpYyBpbnQgc2FhNzE2NF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzYWE3MTY0X2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJzYWE3MTY0IGRyaXZlciBsb2FkZWRcbiIpOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzYWE3MTY0X3BjaV9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBzYWE3MTY0X2Zpbmkodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYWE3MTY0X2Zpbmkodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNhYTcxNjRfcGNpX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWR2Yi5jCmluZGV4IDZhMmQ4NDcuLmNmMDk5YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWR2Yi5jCkBAIC02OCw2ICs2OCw3IEBACiAJLnN0ZF9tYXAJPSAmaGF1cHBhdWdlX3RkYTE4MjcxX3N0ZF9tYXAsCiAJLmdhdGUJCT0gVERBMTgyNzFfR0FURV9BTkFMT0csCiAJLnJvbGUJCT0gVERBMTgyNzFfU0xBVkUsCisJLm91dHB1dF9vcHQgICAgID0gVERBMTgyNzFfT1VUUFVUX0xUX09GRiwKIAkucmZfY2FsX29uX3N0YXJ0dXAgPSAxCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxN3guYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE3eC5jCmluZGV4IGIxNWM0MDkuLjY4MThkZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE3eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE3eC5jCkBAIC0xMTE1LDcgKzExMTUsNyBAQAogCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImRlY29kZXIgc2V0IGlucHV0ICglZClcbiIsIGlucHV0KTsKIAkvKiBpbnB1dHMgZnJvbSAwLTkgYXJlIGF2YWlsYWJsZSovCiAJLyogc2FhNzE3eCBoYXZlIG1vZGUwLW1vZGU5IGJ1dCBtb2RlNSBpcyByZXNlcnZlZC4gKi8KLQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID4gOSB8fCBpbnB1dCA9PSA1KQorCWlmIChpbnB1dCA+IDkgfHwgaW5wdXQgPT0gNSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZGVjb2Rlci0+aW5wdXQgIT0gaW5wdXQpIHsKQEAgLTEzMTIsNyArMTMxMiw3IEBACiAJCSJNT05PIiwgIlNURVJFTyIsICJMQU5HMSIsICJMQU5HMi9TQVAiCiAJfTsKIAotCWF1ZGlvX21vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCWF1ZGlvX21vZGUgPSBUVU5FUl9BVURJT19TVEVSRU87CiAKIAlzd2l0Y2ggKHZ0LT5hdWRtb2RlKSB7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKaW5kZXggOWM4YjdjNy4uYTRmMzQ3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwpAQCAtMTUzLDYgKzE1Myw0MCBAQAogCXJldHVybiBpb3JlYWQzMihwcml2LT5iYXNlICsgcmVnX29mZnMpOwogfQogCitzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfc29mdF9yZXNldChzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2KQoreworCWludCBpLCBzdWNjZXNzID0gMDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHBjZGV2LT5pY2Q7CisKKwljZXVfd3JpdGUocGNkZXYsIENBUFNSLCAxIDw8IDE2KTsgLyogcmVzZXQgKi8KKworCS8qIHdhaXQgQ1NUU1IuQ1BUT04gYml0ICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlpZiAoIShjZXVfcmVhZChwY2RldiwgQ1NUU1IpICYgMSkpIHsKKwkJCXN1Y2Nlc3MrKzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiB3YWl0IENBUFNSLkNQS0lMIGJpdCAqLworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJaWYgKCEoY2V1X3JlYWQocGNkZXYsIENBUFNSKSAmICgxIDw8IDE2KSkpIHsKKwkJCXN1Y2Nlc3MrKzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKworCWlmICgyICE9IHN1Y2Nlc3MpIHsKKwkJZGV2X3dhcm4oJmljZC0+ZGV2LCAic29mdCByZXNldCB0aW1lIG91dFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogIFZpZGVvYnVmIG9wZXJhdGlvbnMKICAqLwpAQCAtMjAyLDI2ICsyMzYsNDUgQEAKICNkZWZpbmUgQ0VVX0NFVENSX01BR0lDIDB4MDMxN2YzMTMgLyogYWNrbm93bGVkZ2UgbWFnaWNhbCBpbnRlcnJ1cHQgc291cmNlcyAqLwogI2RlZmluZSBDRVVfQ0VUQ1JfSUdSVyAoMSA8PCA0KSAvKiBwcm9oaWJpdGVkIHJlZ2lzdGVyIGFjY2VzcyBpbnRlcnJ1cHQgYml0ICovCiAjZGVmaW5lIENFVV9DRUlFUl9DUEVJRSAoMSA8PCAwKSAvKiBvbmUtZnJhbWUgY2FwdHVyZSBlbmQgaW50ZXJydXB0ICovCisjZGVmaW5lIENFVV9DRUlFUl9WQlAgICAoMSA8PCAyMCkgLyogdmJwIGVycm9yICovCiAjZGVmaW5lIENFVV9DQVBDUl9DVE5DUCAoMSA8PCAxNikgLyogY29udGludW91cyBjYXB0dXJlIG1vZGUgKGlmIHNldCkgKi8KKyNkZWZpbmUgQ0VVX0NFSUVSX01BU0sgKENFVV9DRUlFUl9DUEVJRSB8IENFVV9DRUlFUl9WQlApCiAKIAotc3RhdGljIHZvaWQgc2hfbW9iaWxlX2NldV9jYXB0dXJlKHN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYpCisvKgorICogcmV0dXJuIHZhbHVlIGRvZXNuJ3QgcmVmbGV4IHRoZSBzdWNjZXNzL2ZhaWx1cmUgdG8gcXVldWUgdGhlIG5ldyBidWZmZXIsCisgKiBidXQgcmF0aGVyIHRoZSBzdGF0dXMgb2YgdGhlIHByZXZpb3VzIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X2NhcHR1cmUoc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHBjZGV2LT5pY2Q7CiAJZG1hX2FkZHJfdCBwaHlzX2FkZHJfdG9wLCBwaHlzX2FkZHJfYm90dG9tOworCXUzMiBzdGF0dXM7CisJaW50IHJldCA9IDA7CiAKIAkvKiBUaGUgaGFyZHdhcmUgaXMgX3ZlcnlfIHBpY2t5IGFib3V0IHRoaXMgc2VxdWVuY2UuIEVzcGVjaWFsbHkKIAkgKiB0aGUgQ0VVX0NFVENSX01BR0lDIHZhbHVlLiBJdCBzZWVtcyBsaWtlIHdlIG5lZWQgdG8gYWNrbm93bGVkZ2UKIAkgKiBzZXZlcmFsIG5vdC1zby13ZWxsIGRvY3VtZW50ZWQgaW50ZXJydXB0IHNvdXJjZXMgaW4gQ0VUQ1IuCiAJICovCi0JY2V1X3dyaXRlKHBjZGV2LCBDRUlFUiwgY2V1X3JlYWQocGNkZXYsIENFSUVSKSAmIH5DRVVfQ0VJRVJfQ1BFSUUpOwotCWNldV93cml0ZShwY2RldiwgQ0VUQ1IsIH5jZXVfcmVhZChwY2RldiwgQ0VUQ1IpICYgQ0VVX0NFVENSX01BR0lDKTsKLQljZXVfd3JpdGUocGNkZXYsIENFSUVSLCBjZXVfcmVhZChwY2RldiwgQ0VJRVIpIHwgQ0VVX0NFSUVSX0NQRUlFKTsKKwljZXVfd3JpdGUocGNkZXYsIENFSUVSLCBjZXVfcmVhZChwY2RldiwgQ0VJRVIpICYgfkNFVV9DRUlFUl9NQVNLKTsKKwlzdGF0dXMgPSBjZXVfcmVhZChwY2RldiwgQ0VUQ1IpOworCWNldV93cml0ZShwY2RldiwgQ0VUQ1IsIH5zdGF0dXMgJiBDRVVfQ0VUQ1JfTUFHSUMpOworCWNldV93cml0ZShwY2RldiwgQ0VJRVIsIGNldV9yZWFkKHBjZGV2LCBDRUlFUikgfCBDRVVfQ0VJRVJfTUFTSyk7CiAJY2V1X3dyaXRlKHBjZGV2LCBDQVBDUiwgY2V1X3JlYWQocGNkZXYsIENBUENSKSAmIH5DRVVfQ0FQQ1JfQ1ROQ1ApOwogCWNldV93cml0ZShwY2RldiwgQ0VUQ1IsIENFVV9DRVRDUl9NQUdJQyBeIENFVV9DRVRDUl9JR1JXKTsKIAorCS8qCisJICogV2hlbiBhIFZCUCBpbnRlcnJ1cHQgb2NjdXJzLCBhIGNhcHR1cmUgZW5kIGludGVycnVwdCBkb2VzIG5vdCBvY2N1cgorCSAqIGFuZCB0aGUgaW1hZ2Ugb2YgdGhhdCBmcmFtZSBpcyBub3QgY2FwdHVyZWQgY29ycmVjdGx5LiBTbywgc29mdCByZXNldAorCSAqIGlzIG5lZWRlZCBoZXJlLgorCSAqLworCWlmIChzdGF0dXMgJiBDRVVfQ0VJRVJfVkJQKSB7CisJCXNoX21vYmlsZV9jZXVfc29mdF9yZXNldChwY2Rldik7CisJCXJldCA9IC1FSU87CisJfQorCiAJaWYgKCFwY2Rldi0+YWN0aXZlKQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAlwaHlzX2FkZHJfdG9wID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyhwY2Rldi0+YWN0aXZlKTsKIAljZXVfd3JpdGUocGNkZXYsIENEQVlSLCBwaHlzX2FkZHJfdG9wKTsKQEAgLTI0Nyw2ICszMDAsOCBAQAogCiAJcGNkZXYtPmFjdGl2ZS0+c3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7CiAJY2V1X3dyaXRlKHBjZGV2LCBDQVBTUiwgMHgxKTsgLyogc3RhcnQgY2FwdHVyZSAqLworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3ZpZGVvYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKQEAgLTMxOSw2ICszNzQsMTEgQEAKIAlsaXN0X2FkZF90YWlsKCZ2Yi0+cXVldWUsICZwY2Rldi0+Y2FwdHVyZSk7CiAKIAlpZiAoIXBjZGV2LT5hY3RpdmUpIHsKKwkJLyoKKwkJICogQmVjYXVzZSB0aGVyZSB3ZXJlIG5vIGFjdGl2ZSBidWZmZXIgYXQgdGhpcyBtb21lbnQsCisJCSAqIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIG9mCisJCSAqIHNoX21vYmlsZV9jZXVfY2FwdHVyZSBoZXJlLgorCQkgKi8KIAkJcGNkZXYtPmFjdGl2ZSA9IHZiOwogCQlzaF9tb2JpbGVfY2V1X2NhcHR1cmUocGNkZXYpOwogCX0KQEAgLTM3OSw5ICs0MzksOCBAQAogCWVsc2UKIAkJcGNkZXYtPmFjdGl2ZSA9IE5VTEw7CiAKLQlzaF9tb2JpbGVfY2V1X2NhcHR1cmUocGNkZXYpOwotCi0JdmItPnN0YXRlID0gVklERU9CVUZfRE9ORTsKKwl2Yi0+c3RhdGUgPSAoc2hfbW9iaWxlX2NldV9jYXB0dXJlKHBjZGV2KSA8IDApID8KKwkJVklERU9CVUZfRVJST1IgOiBWSURFT0JVRl9ET05FOwogCWRvX2dldHRpbWVvZmRheSgmdmItPnRzKTsKIAl2Yi0+ZmllbGRfY291bnQrKzsKIAl3YWtlX3VwKCZ2Yi0+ZG9uZSk7CkBAIC00MDcsMTMgKzQ2Niw5IEBACiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKIAotCWNldV93cml0ZShwY2RldiwgQ0FQU1IsIDEgPDwgMTYpOyAvKiByZXNldCAqLwotCXdoaWxlIChjZXVfcmVhZChwY2RldiwgQ1NUU1IpICYgMSkKLQkJbXNsZWVwKDEpOwotCiAJcGNkZXYtPmljZCA9IGljZDsKIAotCXJldHVybiAwOworCXJldHVybiBzaF9tb2JpbGVfY2V1X3NvZnRfcmVzZXQocGNkZXYpOwogfQogCiAvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCkBAIC00MjcsNyArNDgyLDcgQEAKIAogCS8qIGRpc2FibGUgY2FwdHVyZSwgZGlzYWJsZSBpbnRlcnJ1cHRzICovCiAJY2V1X3dyaXRlKHBjZGV2LCBDRUlFUiwgMCk7Ci0JY2V1X3dyaXRlKHBjZGV2LCBDQVBTUiwgMSA8PCAxNik7IC8qIHJlc2V0ICovCisJc2hfbW9iaWxlX2NldV9zb2Z0X3Jlc2V0KHBjZGV2KTsKIAogCS8qIG1ha2Ugc3VyZSBhY3RpdmUgYnVmZmVyIGlzIGNhbmNlbGVkICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjZGV2LT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IGFiYTkyZTIuLjViM2VhYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0zMjAsNiArMzIwLDcgQEAKIAlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqZmVfdHVuZXJfb3BzID0gJnQtPmZlLm9wcy50dW5lcl9vcHM7CiAJc3RydWN0IGFuYWxvZ19kZW1vZF9vcHMgKmFuYWxvZ19vcHMgPSAmdC0+ZmUub3BzLmFuYWxvZ19vcHM7CiAJdW5zaWduZWQgY2hhciBidWZmZXJbNF07CisJaW50IHR1bmVfbm93ID0gMTsKIAogCWlmICh0eXBlID09IFVOU0VUIHx8IHR5cGUgPT0gVFVORVJfQUJTRU5UKSB7CiAJCXR1bmVyX2RiZyAoInR1bmVyIDB4JTAyeDogVHVuZXIgdHlwZSBhYnNlbnRcbiIsYy0+YWRkcik7CkBAIC0zMjgsNyArMzI5LDcgQEAKIAogCXQtPnR5cGUgPSB0eXBlOwogCS8qIHByZXZlbnQgaW52YWxpZCBjb25maWcgdmFsdWVzICovCi0JdC0+Y29uZmlnID0gKChuZXdfY29uZmlnID49IDApICYmIChuZXdfY29uZmlnIDwgMjU2KSkgPyBuZXdfY29uZmlnIDogMDsKKwl0LT5jb25maWcgPSBuZXdfY29uZmlnIDwgMjU2ID8gbmV3X2NvbmZpZyA6IDA7CiAJaWYgKHR1bmVyX2NhbGxiYWNrICE9IE5VTEwpIHsKIAkJdHVuZXJfZGJnKCJkZWZpbmluZyBHUElPIGNhbGxiYWNrXG4iKTsKIAkJdC0+ZmUuY2FsbGJhY2sgPSB0dW5lcl9jYWxsYmFjazsKQEAgLTQwNCw2ICs0MDUsNyBAQAogCQl9OwogCQlpZiAoIWR2Yl9hdHRhY2goeGMyMDI4X2F0dGFjaCwgJnQtPmZlLCAmY2ZnKSkKIAkJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKwkJdHVuZV9ub3cgPSAwOwogCQlicmVhazsKIAl9CiAJY2FzZSBUVU5FUl9UREE5ODg3OgpAQCAtNDE5LDYgKzQyMSw3IEBACiAJCWlmICghZHZiX2F0dGFjaCh4YzUwMDBfYXR0YWNoLAogCQkJCSZ0LT5mZSwgdC0+aTJjLT5hZGFwdGVyLCAmeGM1MDAwX2NmZykpCiAJCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJCXR1bmVfbm93ID0gMDsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVFVORVJfTlhQX1REQTE4MjcxOgpAQCAtNDMwLDYgKzQzMyw3IEBACiAJCWlmICghZHZiX2F0dGFjaCh0ZGExODI3MV9hdHRhY2gsICZ0LT5mZSwgdC0+aTJjLT5hZGRyLAogCQkJCXQtPmkyYy0+YWRhcHRlciwgJmNmZykpCiAJCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJCXR1bmVfbm93ID0gMDsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CkBAIC00NTgsMTIgKzQ2MiwxMyBAQAogCWlmICh0LT5tb2RlX21hc2sgPT0gVF9VTklOSVRJQUxJWkVEKQogCQl0LT5tb2RlX21hc2sgPSBuZXdfbW9kZV9tYXNrOwogCi0JLyogeGMyMDI4LzMwMjggYW5kIHhjNTAwMCByZXF1aXJlcyBhIGZpcm13YXJlIHRvIGJlIHNldC11cCBsYXRlcgorCS8qIFNvbWUgdHVuZXJzIHJlcXVpcmUgbW9yZSBpbml0aWFsaXphdGlvbiBzZXR1cCBiZWZvcmUgdXNlLAorCSAgIHN1Y2ggYXMgZmlybXdhcmUgZG93bmxvYWQgb3IgZGV2aWNlIGNhbGlicmF0aW9uLgogCSAgIHRyeWluZyB0byBzZXQgYSBmcmVxdWVuY3kgaGVyZSB3aWxsIGp1c3QgZmFpbAogCSAgIEZJWE1FOiBiZXR0ZXIgdG8gbW92ZSBzZXRfZnJlcSB0byB0aGUgdHVuZXIgY29kZS4gVGhpcyBpcyBuZWVkZWQKIAkgICBvbiBhbmFsb2cgdHVuZXJzIGZvciBQTEwgdG8gcHJvcGVybHkgd29yawogCSAqLwotCWlmICh0LT50eXBlICE9IFRVTkVSX1hDMjAyOCAmJiB0LT50eXBlICE9IFRVTkVSX1hDNTAwMCkKKwlpZiAodHVuZV9ub3cpCiAJCXNldF9mcmVxKGMsIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpID8KIAkJCSAgICB0LT5yYWRpb19mcmVxIDogdC0+dHZfZnJlcSk7CiAKQEAgLTc1MiwxNCArNzU3LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHVuZXJfc19zdGFuZGJ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCitzdGF0aWMgaW50IHR1bmVyX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQogewogCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKIAlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyAqYW5hbG9nX29wcyA9ICZ0LT5mZS5vcHMuYW5hbG9nX29wczsKIAorCWlmIChvbikKKwkJcmV0dXJuIDA7CisKIAl0dW5lcl9kYmcoIlB1dHRpbmcgdHVuZXIgdG8gc2xlZXBcbiIpOwogCi0JaWYgKGNoZWNrX21vZGUodCwgInNfc3RhbmRieSIpID09IC1FSU5WQUwpCisJaWYgKGNoZWNrX21vZGUodCwgInNfcG93ZXIiKSA9PSAtRUlOVkFMKQogCQlyZXR1cm4gMDsKIAl0LT5tb2RlID0gVF9TVEFOREJZOwogCWlmIChhbmFsb2dfb3BzLT5zdGFuZGJ5KQpAQCAtOTYxLDYgKzk2OSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHR1bmVyX2NvcmVfb3BzID0gewogCS5sb2dfc3RhdHVzID0gdHVuZXJfbG9nX3N0YXR1cywKIAkuc19zdGQgPSB0dW5lcl9zX3N0ZCwKKwkuc19wb3dlciA9IHR1bmVyX3NfcG93ZXIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB0dW5lcl90dW5lcl9vcHMgPSB7CkBAIC05NzEsNyArOTgwLDYgQEAKIAkuZ19mcmVxdWVuY3kgPSB0dW5lcl9nX2ZyZXF1ZW5jeSwKIAkuc190eXBlX2FkZHIgPSB0dW5lcl9zX3R5cGVfYWRkciwKIAkuc19jb25maWcgPSB0dW5lcl9zX2NvbmZpZywKLQkuc19zdGFuZGJ5ID0gdHVuZXJfc19zdGFuZGJ5LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdHVuZXJfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwppbmRleCAwODY5YmFmLi44MDBmYzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwpAQCAtMTkxOSw3ICsxOTE5LDcgQEAKIAkuc19yYWRpbyA9IHR2YXVkaW9fc19yYWRpbywKIAkuc19mcmVxdWVuY3kgPSB0dmF1ZGlvX3NfZnJlcXVlbmN5LAogCS5zX3R1bmVyID0gdHZhdWRpb19zX3R1bmVyLAotCS5zX3R1bmVyID0gdHZhdWRpb19nX3R1bmVyLAorCS5nX3R1bmVyID0gdHZhdWRpb19nX3R1bmVyLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9hdWRpb19vcHMgdHZhdWRpb19hdWRpb19vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eC5jCmluZGV4IDI0NDM3MjYuLjI2YjRlNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eC5jCkBAIC0yNzIsNyArMjcyLDcgQEAKIHJlYWRfYWdhaW46CiAKIAllcnIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwotCWlmIChlcnIgPT0gLTEpIHsKKwlpZiAoZXJyIDwgMCkgewogCQlpZiAocmV0cnkgPD0gSTJDX1JFVFJZX0NPVU5UKSB7CiAJCQl2NGwyX3dhcm4oc2QsICJSZWFkOiByZXRyeSAuLi4gJWRcbiIsIHJldHJ5KTsKIAkJCXJldHJ5Kys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMKaW5kZXggMzFkNTdmMi4uYTBhZGRjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9rb25pY2F3Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJaW50IGVycm9yOwogCiAJdXNiX21ha2VfcGF0aChkZXYsIGNhbS0+aW5wdXRfcGh5c25hbWUsIHNpemVvZihjYW0tPmlucHV0X3BoeXNuYW1lKSk7Ci0Jc3RybmNhdChjYW0tPmlucHV0X3BoeXNuYW1lLCAiL2lucHV0MCIsIHNpemVvZihjYW0tPmlucHV0X3BoeXNuYW1lKSk7CisJc3RybGNhdChjYW0tPmlucHV0X3BoeXNuYW1lLCAiL2lucHV0MCIsIHNpemVvZihjYW0tPmlucHV0X3BoeXNuYW1lKSk7CiAKIAljYW0tPmlucHV0ID0gaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpbnB1dF9kZXYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCmluZGV4IDgwM2QzZTQuLmM0ZDFiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYwpAQCAtODksNyArODksNyBAQAogCWludCBlcnJvcjsKIAogCXVzYl9tYWtlX3BhdGgoZGV2LCBjYW0tPmlucHV0X3BoeXNuYW1lLCBzaXplb2YoY2FtLT5pbnB1dF9waHlzbmFtZSkpOwotCXN0cm5jYXQoY2FtLT5pbnB1dF9waHlzbmFtZSwgIi9pbnB1dDAiLCBzaXplb2YoY2FtLT5pbnB1dF9waHlzbmFtZSkpOworCXN0cmxjYXQoY2FtLT5pbnB1dF9waHlzbmFtZSwgIi9pbnB1dDAiLCBzaXplb2YoY2FtLT5pbnB1dF9waHlzbmFtZSkpOwogCiAJY2FtLT5pbnB1dCA9IGlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghaW5wdXRfZGV2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCmluZGV4IGEyYTUwZDYuLmMwN2IwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCkBAIC02MDEsNyArNjAxLDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCWlmICgoaW5wdXQgPj0gdXNidmlzaW9uLT52aWRlb19pbnB1dHMpIHx8IChpbnB1dCA8IDApICkKKwlpZiAoaW5wdXQgPj0gdXNidmlzaW9uLT52aWRlb19pbnB1dHMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmdXNidmlzaW9uLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCmluZGV4IDFiODk3MzUuLjA0NjlkN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYwpAQCAtNzQyLDE3ICs3NDIsNyBAQAogCXY0bDJfaWQgJj0gVjRMMl9DVFJMX0lEX01BU0s7CiAKIAkvKiBGaW5kIHRoZSBjb250cm9sLiAqLwotCV9fdXZjX2ZpbmRfY29udHJvbChjaGFpbi0+cHJvY2Vzc2luZywgdjRsMl9pZCwgbWFwcGluZywgJmN0cmwsIG5leHQpOwotCWlmIChjdHJsICYmICFuZXh0KQotCQlyZXR1cm4gY3RybDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmY2hhaW4tPml0ZXJtcywgY2hhaW4pIHsKLQkJX191dmNfZmluZF9jb250cm9sKGVudGl0eSwgdjRsMl9pZCwgbWFwcGluZywgJmN0cmwsIG5leHQpOwotCQlpZiAoY3RybCAmJiAhbmV4dCkKLQkJCXJldHVybiBjdHJsOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmY2hhaW4tPmV4dGVuc2lvbnMsIGNoYWluKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRpdHksICZjaGFpbi0+ZW50aXRpZXMsIGNoYWluKSB7CiAJCV9fdXZjX2ZpbmRfY29udHJvbChlbnRpdHksIHY0bDJfaWQsIG1hcHBpbmcsICZjdHJsLCBuZXh0KTsKIAkJaWYgKGN0cmwgJiYgIW5leHQpCiAJCQlyZXR1cm4gY3RybDsKQEAgLTgyNiw2ICs4MTYsMTMgQEAKIAkJcmV0ID0gMDsKIAkJZ290byBvdXQ7CiAKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JVVFRPTjoKKwkJdjRsMl9jdHJsLT5taW5pbXVtID0gMDsKKwkJdjRsMl9jdHJsLT5tYXhpbXVtID0gMDsKKwkJdjRsMl9jdHJsLT5zdGVwID0gMDsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC05NDQsMTcgKzk0MSw3IEBACiAJaW50IHJldCA9IDA7CiAKIAkvKiBGaW5kIHRoZSBjb250cm9sLiAqLwotCXJldCA9IHV2Y19jdHJsX2NvbW1pdF9lbnRpdHkoY2hhaW4tPmRldiwgY2hhaW4tPnByb2Nlc3NpbmcsIHJvbGxiYWNrKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBkb25lOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRpdHksICZjaGFpbi0+aXRlcm1zLCBjaGFpbikgewotCQlyZXQgPSB1dmNfY3RybF9jb21taXRfZW50aXR5KGNoYWluLT5kZXYsIGVudGl0eSwgcm9sbGJhY2spOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudGl0eSwgJmNoYWluLT5leHRlbnNpb25zLCBjaGFpbikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmY2hhaW4tPmVudGl0aWVzLCBjaGFpbikgewogCQlyZXQgPSB1dmNfY3RybF9jb21taXRfZW50aXR5KGNoYWluLT5kZXYsIGVudGl0eSwgcm9sbGJhY2spOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZG9uZTsKQEAgLTEwNjgsOCArMTA1NSw5IEBACiAJaW50IHJldDsKIAogCS8qIEZpbmQgdGhlIGV4dGVuc2lvbiB1bml0LiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmY2hhaW4tPmV4dGVuc2lvbnMsIGNoYWluKSB7Ci0JCWlmIChlbnRpdHktPmlkID09IHhjdHJsLT51bml0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmY2hhaW4tPmVudGl0aWVzLCBjaGFpbikgeworCQlpZiAoVVZDX0VOVElUWV9UWVBFKGVudGl0eSkgPT0gVVZDX1ZDX0VYVEVOU0lPTl9VTklUICYmCisJCSAgICBlbnRpdHktPmlkID09IHhjdHJsLT51bml0KQogCQkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKaW5kZXggODc1NmJlNS4uYzMxYmM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYwpAQCAtNDYsNiArNDYsNyBAQAogdW5zaWduZWQgaW50IHV2Y19ub19kcm9wX3BhcmFtOwogc3RhdGljIHVuc2lnbmVkIGludCB1dmNfcXVpcmtzX3BhcmFtOwogdW5zaWduZWQgaW50IHV2Y190cmFjZV9wYXJhbTsKK3Vuc2lnbmVkIGludCB1dmNfdGltZW91dF9wYXJhbSA9IFVWQ19DVFJMX1NUUkVBTUlOR19USU1FT1VUOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFZpZGVvIGZvcm1hdHMKQEAgLTI0OCwyOSArMjQ5LDkgQEAKIAkJZW50aXR5ID0gbGlzdF9lbnRyeSgmZGV2LT5lbnRpdGllcywgc3RydWN0IHV2Y19lbnRpdHksIGxpc3QpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShlbnRpdHksICZkZXYtPmVudGl0aWVzLCBsaXN0KSB7Ci0JCXN3aXRjaCAoVVZDX0VOVElUWV9UWVBFKGVudGl0eSkpIHsKLQkJY2FzZSBVVkNfVFRfU1RSRUFNSU5HOgotCQkJaWYgKGVudGl0eS0+b3V0cHV0LmJTb3VyY2VJRCA9PSBpZCkKKwkJZm9yIChpID0gMDsgaSA8IGVudGl0eS0+Yk5ySW5QaW5zOyArK2kpCisJCQlpZiAoZW50aXR5LT5iYVNvdXJjZUlEW2ldID09IGlkKQogCQkJCXJldHVybiBlbnRpdHk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVWQ19WQ19QUk9DRVNTSU5HX1VOSVQ6Ci0JCQlpZiAoZW50aXR5LT5wcm9jZXNzaW5nLmJTb3VyY2VJRCA9PSBpZCkKLQkJCQlyZXR1cm4gZW50aXR5OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVVkNfVkNfU0VMRUNUT1JfVU5JVDoKLQkJCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPnNlbGVjdG9yLmJOckluUGluczsgKytpKQotCQkJCWlmIChlbnRpdHktPnNlbGVjdG9yLmJhU291cmNlSURbaV0gPT0gaWQpCi0JCQkJCXJldHVybiBlbnRpdHk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVWQ19WQ19FWFRFTlNJT05fVU5JVDoKLQkJCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPmV4dGVuc2lvbi5iTnJJblBpbnM7ICsraSkKLQkJCQlpZiAoZW50aXR5LT5leHRlbnNpb24uYmFTb3VyY2VJRFtpXSA9PSBpZCkKLQkJCQkJcmV0dXJuIGVudGl0eTsKLQkJCWJyZWFrOwotCQl9CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC00MjYsNyArNDA3LDggQEAKIAkvKiBQYXJzZSB0aGUgZnJhbWUgZGVzY3JpcHRvcnMuIE9ubHkgdW5jb21wcmVzc2VkLCBNSlBFRyBhbmQgZnJhbWUKIAkgKiBiYXNlZCBmb3JtYXRzIGhhdmUgZnJhbWUgZGVzY3JpcHRvcnMuCiAJICovCi0Jd2hpbGUgKGJ1ZmxlbiA+IDIgJiYgYnVmZmVyWzJdID09IGZ0eXBlKSB7CisJd2hpbGUgKGJ1ZmxlbiA+IDIgJiYgYnVmZmVyWzFdID09IFVTQl9EVF9DU19JTlRFUkZBQ0UgJiYKKwkgICAgICAgYnVmZmVyWzJdID09IGZ0eXBlKSB7CiAJCWZyYW1lID0gJmZvcm1hdC0+ZnJhbWVbZm9ybWF0LT5uZnJhbWVzXTsKIAkJaWYgKGZ0eXBlICE9IFVWQ19WU19GUkFNRV9GUkFNRV9CQVNFRCkKIAkJCW4gPSBidWZsZW4gPiAyNSA/IGJ1ZmZlclsyNV0gOiAwOwpAQCAtNTAzLDEyICs0ODUsMTQgQEAKIAkJYnVmZmVyICs9IGJ1ZmZlclswXTsKIAl9CiAKLQlpZiAoYnVmbGVuID4gMiAmJiBidWZmZXJbMl0gPT0gVVZDX1ZTX1NUSUxMX0lNQUdFX0ZSQU1FKSB7CisJaWYgKGJ1ZmxlbiA+IDIgJiYgYnVmZmVyWzFdID09IFVTQl9EVF9DU19JTlRFUkZBQ0UgJiYKKwkgICAgYnVmZmVyWzJdID09IFVWQ19WU19TVElMTF9JTUFHRV9GUkFNRSkgewogCQlidWZsZW4gLT0gYnVmZmVyWzBdOwogCQlidWZmZXIgKz0gYnVmZmVyWzBdOwogCX0KIAotCWlmIChidWZsZW4gPiAyICYmIGJ1ZmZlclsyXSA9PSBVVkNfVlNfQ09MT1JGT1JNQVQpIHsKKwlpZiAoYnVmbGVuID4gMiAmJiBidWZmZXJbMV0gPT0gVVNCX0RUX0NTX0lOVEVSRkFDRSAmJgorCSAgICBidWZmZXJbMl0gPT0gVVZDX1ZTX0NPTE9SRk9STUFUKSB7CiAJCWlmIChidWZsZW4gPCA2KSB7CiAJCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0RFU0NSLCAiZGV2aWNlICVkIHZpZGVvc3RyZWFtaW5nICIKIAkJCSAgICAgICAiaW50ZXJmYWNlICVkIENPTE9SRk9STUFUIGVycm9yXG4iLApAQCAtNzQ5LDYgKzczMywxMSBAQAogCQlidWZmZXIgKz0gYnVmZmVyWzBdOwogCX0KIAorCWlmIChidWZsZW4pCisJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJkZXZpY2UgJWQgdmlkZW9zdHJlYW1pbmcgaW50ZXJmYWNlICIKKwkJCSIlZCBoYXMgJXUgYnl0ZXMgb2YgdHJhaWxpbmcgZGVzY3JpcHRvciBnYXJiYWdlLlxuIiwKKwkJCWRldi0+dWRldi0+ZGV2bnVtLCBhbHRzLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIGJ1Zmxlbik7CisKIAkvKiBQYXJzZSB0aGUgYWx0ZXJuYXRlIHNldHRpbmdzIHRvIGZpbmQgdGhlIG1heGltdW0gYmFuZHdpZHRoLiAqLwogCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5udW1fYWx0c2V0dGluZzsgKytpKSB7CiAJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXA7CkBAIC03NzYsNiArNzY1LDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHN0cnVjdCB1dmNfZW50aXR5ICp1dmNfYWxsb2NfZW50aXR5KHUxNiB0eXBlLCB1OCBpZCwKKwkJdW5zaWduZWQgaW50IG51bV9wYWRzLCB1bnNpZ25lZCBpbnQgZXh0cmFfc2l6ZSkKK3sKKwlzdHJ1Y3QgdXZjX2VudGl0eSAqZW50aXR5OworCXVuc2lnbmVkIGludCBudW1faW5wdXRzOworCXVuc2lnbmVkIGludCBzaXplOworCisJbnVtX2lucHV0cyA9ICh0eXBlICYgVVZDX1RFUk1fT1VUUFVUKSA/IG51bV9wYWRzIDogbnVtX3BhZHMgLSAxOworCXNpemUgPSBzaXplb2YoKmVudGl0eSkgKyBleHRyYV9zaXplICsgbnVtX2lucHV0czsKKwllbnRpdHkgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChlbnRpdHkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwllbnRpdHktPmlkID0gaWQ7CisJZW50aXR5LT50eXBlID0gdHlwZTsKKworCWVudGl0eS0+Yk5ySW5QaW5zID0gbnVtX2lucHV0czsKKwllbnRpdHktPmJhU291cmNlSUQgPSAoKF9fdTggKillbnRpdHkpICsgc2l6ZW9mKCplbnRpdHkpICsgZXh0cmFfc2l6ZTsKKworCXJldHVybiBlbnRpdHk7Cit9CisKIC8qIFBhcnNlIHZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zLiAqLwogc3RhdGljIGludCB1dmNfcGFyc2VfdmVuZG9yX2NvbnRyb2woc3RydWN0IHV2Y19kZXZpY2UgKmRldiwKIAljb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pCkBAIC04MjcsMjEgKzgzOCwxOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQl1bml0ID0ga3phbGxvYyhzaXplb2YgKnVuaXQgKyBwICsgMipuLCBHRlBfS0VSTkVMKTsKKwkJdW5pdCA9IHV2Y19hbGxvY19lbnRpdHkoVVZDX1ZDX0VYVEVOU0lPTl9VTklULCBidWZmZXJbM10sCisJCQkJCXAgKyAxLCAyKm4pOwogCQlpZiAodW5pdCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJdW5pdC0+aWQgPSBidWZmZXJbM107Ci0JCXVuaXQtPnR5cGUgPSBVVkNfVkNfRVhURU5TSU9OX1VOSVQ7CiAJCW1lbWNweSh1bml0LT5leHRlbnNpb24uZ3VpZEV4dGVuc2lvbkNvZGUsICZidWZmZXJbNF0sIDE2KTsKIAkJdW5pdC0+ZXh0ZW5zaW9uLmJOdW1Db250cm9scyA9IGJ1ZmZlclsyMF07Ci0JCXVuaXQtPmV4dGVuc2lvbi5iTnJJblBpbnMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmJ1ZmZlclsyMV0pOwotCQl1bml0LT5leHRlbnNpb24uYmFTb3VyY2VJRCA9IChfX3U4ICopdW5pdCArIHNpemVvZiAqdW5pdDsKLQkJbWVtY3B5KHVuaXQtPmV4dGVuc2lvbi5iYVNvdXJjZUlELCAmYnVmZmVyWzIyXSwgcCk7CisJCW1lbWNweSh1bml0LT5iYVNvdXJjZUlELCAmYnVmZmVyWzIyXSwgcCk7CiAJCXVuaXQtPmV4dGVuc2lvbi5iQ29udHJvbFNpemUgPSBidWZmZXJbMjIrcF07Ci0JCXVuaXQtPmV4dGVuc2lvbi5ibUNvbnRyb2xzID0gKF9fdTggKil1bml0ICsgc2l6ZW9mICp1bml0ICsgcDsKLQkJdW5pdC0+ZXh0ZW5zaW9uLmJtQ29udHJvbHNUeXBlID0gKF9fdTggKil1bml0ICsgc2l6ZW9mICp1bml0Ci0JCQkJCSAgICAgICArIHAgKyBuOworCQl1bml0LT5leHRlbnNpb24uYm1Db250cm9scyA9IChfX3U4ICopdW5pdCArIHNpemVvZigqdW5pdCk7CisJCXVuaXQtPmV4dGVuc2lvbi5ibUNvbnRyb2xzVHlwZSA9IChfX3U4ICopdW5pdCArIHNpemVvZigqdW5pdCkKKwkJCQkJICAgICAgICsgbjsKIAkJbWVtY3B5KHVuaXQtPmV4dGVuc2lvbi5ibUNvbnRyb2xzLCAmYnVmZmVyWzIzK3BdLCAyKm4pOwogCiAJCWlmIChidWZmZXJbMjQrcCsyKm5dICE9IDApCkBAIC05MzgsMTMgKzk0NiwxMSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQl0ZXJtID0ga3phbGxvYyhzaXplb2YgKnRlcm0gKyBuICsgcCwgR0ZQX0tFUk5FTCk7CisJCXRlcm0gPSB1dmNfYWxsb2NfZW50aXR5KHR5cGUgfCBVVkNfVEVSTV9JTlBVVCwgYnVmZmVyWzNdLAorCQkJCQkxLCBuICsgcCk7CiAJCWlmICh0ZXJtID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQl0ZXJtLT5pZCA9IGJ1ZmZlclszXTsKLQkJdGVybS0+dHlwZSA9IHR5cGUgfCBVVkNfVEVSTV9JTlBVVDsKLQogCQlpZiAoVVZDX0VOVElUWV9UWVBFKHRlcm0pID09IFVWQ19JVFRfQ0FNRVJBKSB7CiAJCQl0ZXJtLT5jYW1lcmEuYkNvbnRyb2xTaXplID0gbjsKIAkJCXRlcm0tPmNhbWVyYS5ibUNvbnRyb2xzID0gKF9fdTggKil0ZXJtICsgc2l6ZW9mICp0ZXJtOwpAQCAtOTk5LDEzICsxMDA1LDEyIEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCXRlcm0gPSBremFsbG9jKHNpemVvZiAqdGVybSwgR0ZQX0tFUk5FTCk7CisJCXRlcm0gPSB1dmNfYWxsb2NfZW50aXR5KHR5cGUgfCBVVkNfVEVSTV9PVVRQVVQsIGJ1ZmZlclszXSwKKwkJCQkJMSwgMCk7CiAJCWlmICh0ZXJtID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQl0ZXJtLT5pZCA9IGJ1ZmZlclszXTsKLQkJdGVybS0+dHlwZSA9IHR5cGUgfCBVVkNfVEVSTV9PVVRQVVQ7Ci0JCXRlcm0tPm91dHB1dC5iU291cmNlSUQgPSBidWZmZXJbN107CisJCW1lbWNweSh0ZXJtLT5iYVNvdXJjZUlELCAmYnVmZmVyWzddLCAxKTsKIAogCQlpZiAoYnVmZmVyWzhdICE9IDApCiAJCQl1c2Jfc3RyaW5nKHVkZXYsIGJ1ZmZlcls4XSwgdGVybS0+bmFtZSwKQEAgLTEwMjYsMTUgKzEwMzEsMTEgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJdW5pdCA9IGt6YWxsb2Moc2l6ZW9mICp1bml0ICsgcCwgR0ZQX0tFUk5FTCk7CisJCXVuaXQgPSB1dmNfYWxsb2NfZW50aXR5KGJ1ZmZlclsyXSwgYnVmZmVyWzNdLCBwICsgMSwgMCk7CiAJCWlmICh1bml0ID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQl1bml0LT5pZCA9IGJ1ZmZlclszXTsKLQkJdW5pdC0+dHlwZSA9IGJ1ZmZlclsyXTsKLQkJdW5pdC0+c2VsZWN0b3IuYk5ySW5QaW5zID0gYnVmZmVyWzRdOwotCQl1bml0LT5zZWxlY3Rvci5iYVNvdXJjZUlEID0gKF9fdTggKil1bml0ICsgc2l6ZW9mICp1bml0OwotCQltZW1jcHkodW5pdC0+c2VsZWN0b3IuYmFTb3VyY2VJRCwgJmJ1ZmZlcls1XSwgcCk7CisJCW1lbWNweSh1bml0LT5iYVNvdXJjZUlELCAmYnVmZmVyWzVdLCBwKTsKIAogCQlpZiAoYnVmZmVyWzUrcF0gIT0gMCkKIAkJCXVzYl9zdHJpbmcodWRldiwgYnVmZmVyWzUrcF0sIHVuaXQtPm5hbWUsCkBAIC0xMDU2LDEzICsxMDU3LDExIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCXVuaXQgPSBremFsbG9jKHNpemVvZiAqdW5pdCArIG4sIEdGUF9LRVJORUwpOworCQl1bml0ID0gdXZjX2FsbG9jX2VudGl0eShidWZmZXJbMl0sIGJ1ZmZlclszXSwgMiwgbik7CiAJCWlmICh1bml0ID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQl1bml0LT5pZCA9IGJ1ZmZlclszXTsKLQkJdW5pdC0+dHlwZSA9IGJ1ZmZlclsyXTsKLQkJdW5pdC0+cHJvY2Vzc2luZy5iU291cmNlSUQgPSBidWZmZXJbNF07CisJCW1lbWNweSh1bml0LT5iYVNvdXJjZUlELCAmYnVmZmVyWzRdLCAxKTsKIAkJdW5pdC0+cHJvY2Vzc2luZy53TWF4TXVsdGlwbGllciA9CiAJCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmJ1ZmZlcls1XSk7CiAJCXVuaXQtPnByb2Nlc3NpbmcuYkNvbnRyb2xTaXplID0gYnVmZmVyWzddOwpAQCAtMTA5MSwxOSArMTA5MCwxNSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQl1bml0ID0ga3phbGxvYyhzaXplb2YgKnVuaXQgKyBwICsgbiwgR0ZQX0tFUk5FTCk7CisJCXVuaXQgPSB1dmNfYWxsb2NfZW50aXR5KGJ1ZmZlclsyXSwgYnVmZmVyWzNdLCBwICsgMSwgbik7CiAJCWlmICh1bml0ID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQl1bml0LT5pZCA9IGJ1ZmZlclszXTsKLQkJdW5pdC0+dHlwZSA9IGJ1ZmZlclsyXTsKIAkJbWVtY3B5KHVuaXQtPmV4dGVuc2lvbi5ndWlkRXh0ZW5zaW9uQ29kZSwgJmJ1ZmZlcls0XSwgMTYpOwogCQl1bml0LT5leHRlbnNpb24uYk51bUNvbnRyb2xzID0gYnVmZmVyWzIwXTsKLQkJdW5pdC0+ZXh0ZW5zaW9uLmJOckluUGlucyA9IGdldF91bmFsaWduZWRfbGUxNigmYnVmZmVyWzIxXSk7Ci0JCXVuaXQtPmV4dGVuc2lvbi5iYVNvdXJjZUlEID0gKF9fdTggKil1bml0ICsgc2l6ZW9mICp1bml0OwotCQltZW1jcHkodW5pdC0+ZXh0ZW5zaW9uLmJhU291cmNlSUQsICZidWZmZXJbMjJdLCBwKTsKKwkJbWVtY3B5KHVuaXQtPmJhU291cmNlSUQsICZidWZmZXJbMjJdLCBwKTsKIAkJdW5pdC0+ZXh0ZW5zaW9uLmJDb250cm9sU2l6ZSA9IGJ1ZmZlclsyMitwXTsKLQkJdW5pdC0+ZXh0ZW5zaW9uLmJtQ29udHJvbHMgPSAoX191OCAqKXVuaXQgKyBzaXplb2YgKnVuaXQgKyBwOworCQl1bml0LT5leHRlbnNpb24uYm1Db250cm9scyA9IChfX3U4ICopdW5pdCArIHNpemVvZiAqdW5pdDsKIAkJbWVtY3B5KHVuaXQtPmV4dGVuc2lvbi5ibUNvbnRyb2xzLCAmYnVmZmVyWzIzK3BdLCBuKTsKIAogCQlpZiAoYnVmZmVyWzIzK3Arbl0gIT0gMCkKQEAgLTEyMDksMTMgKzEyMDQsMTIgQEAKIAkJaWYgKHV2Y190cmFjZV9wYXJhbSAmIFVWQ19UUkFDRV9QUk9CRSkKIAkJCXByaW50aygiIDwtIFhVICVkIiwgZW50aXR5LT5pZCk7CiAKLQkJaWYgKGVudGl0eS0+ZXh0ZW5zaW9uLmJOckluUGlucyAhPSAxKSB7CisJCWlmIChlbnRpdHktPmJOckluUGlucyAhPSAxKSB7CiAJCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0RFU0NSLCAiRXh0ZW5zaW9uIHVuaXQgJWQgaGFzIG1vcmUgIgogCQkJCSJ0aGFuIDEgaW5wdXQgcGluLlxuIiwgZW50aXR5LT5pZCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAotCQlsaXN0X2FkZF90YWlsKCZlbnRpdHktPmNoYWluLCAmY2hhaW4tPmV4dGVuc2lvbnMpOwogCQlicmVhazsKIAogCWNhc2UgVVZDX1ZDX1BST0NFU1NJTkdfVU5JVDoKQEAgLTEyMzYsNyArMTIzMCw3IEBACiAJCQlwcmludGsoIiA8LSBTVSAlZCIsIGVudGl0eS0+aWQpOwogCiAJCS8qIFNpbmdsZS1pbnB1dCBzZWxlY3RvciB1bml0cyBhcmUgaWdub3JlZC4gKi8KLQkJaWYgKGVudGl0eS0+c2VsZWN0b3IuYk5ySW5QaW5zID09IDEpCisJCWlmIChlbnRpdHktPmJOckluUGlucyA9PSAxKQogCQkJYnJlYWs7CiAKIAkJaWYgKGNoYWluLT5zZWxlY3RvciAhPSBOVUxMKSB7CkBAIC0xMjU0LDIwICsxMjQ4LDE3IEBACiAJCWlmICh1dmNfdHJhY2VfcGFyYW0gJiBVVkNfVFJBQ0VfUFJPQkUpCiAJCQlwcmludGsoIiA8LSBJVCAlZFxuIiwgZW50aXR5LT5pZCk7CiAKLQkJbGlzdF9hZGRfdGFpbCgmZW50aXR5LT5jaGFpbiwgJmNoYWluLT5pdGVybXMpOwogCQlicmVhazsKIAogCWNhc2UgVVZDX1RUX1NUUkVBTUlORzoKLQkJaWYgKHV2Y190cmFjZV9wYXJhbSAmIFVWQ19UUkFDRV9QUk9CRSkKLQkJCXByaW50aygiIDwtIElUICVkXG4iLCBlbnRpdHktPmlkKTsKLQotCQlpZiAoIVVWQ19FTlRJVFlfSVNfSVRFUk0oZW50aXR5KSkgewotCQkJdXZjX3RyYWNlKFVWQ19UUkFDRV9ERVNDUiwgIlVuc3VwcG9ydGVkIGlucHV0ICIKLQkJCQkidGVybWluYWwgJXUuXG4iLCBlbnRpdHktPmlkKTsKLQkJCXJldHVybiAtMTsKKwkJaWYgKFVWQ19FTlRJVFlfSVNfSVRFUk0oZW50aXR5KSkgeworCQkJaWYgKHV2Y190cmFjZV9wYXJhbSAmIFVWQ19UUkFDRV9QUk9CRSkKKwkJCQlwcmludGsoIiA8LSBJVCAlZFxuIiwgZW50aXR5LT5pZCk7CisJCX0gZWxzZSB7CisJCQlpZiAodXZjX3RyYWNlX3BhcmFtICYgVVZDX1RSQUNFX1BST0JFKQorCQkJCXByaW50aygiIE9UICVkIiwgZW50aXR5LT5pZCk7CiAJCX0KIAotCQlsaXN0X2FkZF90YWlsKCZlbnRpdHktPmNoYWluLCAmY2hhaW4tPml0ZXJtcyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEyNzYsNiArMTI2Nyw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwlsaXN0X2FkZF90YWlsKCZlbnRpdHktPmNoYWluLCAmY2hhaW4tPmVudGl0aWVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI5OSwxNCArMTI5MSwxNCBAQAogCiAJCXN3aXRjaCAoVVZDX0VOVElUWV9UWVBFKGZvcndhcmQpKSB7CiAJCWNhc2UgVVZDX1ZDX0VYVEVOU0lPTl9VTklUOgotCQkJaWYgKGZvcndhcmQtPmV4dGVuc2lvbi5iTnJJblBpbnMgIT0gMSkgeworCQkJaWYgKGZvcndhcmQtPmJOckluUGlucyAhPSAxKSB7CiAJCQkJdXZjX3RyYWNlKFVWQ19UUkFDRV9ERVNDUiwgIkV4dGVuc2lvbiB1bml0ICVkICIKIAkJCQkJICAiaGFzIG1vcmUgdGhhbiAxIGlucHV0IHBpbi5cbiIsCiAJCQkJCSAgZW50aXR5LT5pZCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKLQkJCWxpc3RfYWRkX3RhaWwoJmZvcndhcmQtPmNoYWluLCAmY2hhaW4tPmV4dGVuc2lvbnMpOworCQkJbGlzdF9hZGRfdGFpbCgmZm9yd2FyZC0+Y2hhaW4sICZjaGFpbi0+ZW50aXRpZXMpOwogCQkJaWYgKHV2Y190cmFjZV9wYXJhbSAmIFVWQ19UUkFDRV9QUk9CRSkgewogCQkJCWlmICghZm91bmQpCiAJCQkJCXByaW50aygiICgtPiIpOwpAQCAtMTMyNiw3ICsxMzE4LDcgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAotCQkJbGlzdF9hZGRfdGFpbCgmZm9yd2FyZC0+Y2hhaW4sICZjaGFpbi0+b3Rlcm1zKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmZvcndhcmQtPmNoYWluLCAmY2hhaW4tPmVudGl0aWVzKTsKIAkJCWlmICh1dmNfdHJhY2VfcGFyYW0gJiBVVkNfVFJBQ0VfUFJPQkUpIHsKIAkJCQlpZiAoIWZvdW5kKQogCQkJCQlwcmludGsoIiAoLT4iKTsKQEAgLTEzNDQsMjQgKzEzMzYsMjIgQEAKIH0KIAogc3RhdGljIGludCB1dmNfc2Nhbl9jaGFpbl9iYWNrd2FyZChzdHJ1Y3QgdXZjX3ZpZGVvX2NoYWluICpjaGFpbiwKLQlzdHJ1Y3QgdXZjX2VudGl0eSAqZW50aXR5KQorCXN0cnVjdCB1dmNfZW50aXR5ICoqX2VudGl0eSkKIHsKKwlzdHJ1Y3QgdXZjX2VudGl0eSAqZW50aXR5ID0gKl9lbnRpdHk7CiAJc3RydWN0IHV2Y19lbnRpdHkgKnRlcm07Ci0JaW50IGlkID0gLTEsIGk7CisJaW50IGlkID0gLUVJTlZBTCwgaTsKIAogCXN3aXRjaCAoVVZDX0VOVElUWV9UWVBFKGVudGl0eSkpIHsKIAljYXNlIFVWQ19WQ19FWFRFTlNJT05fVU5JVDoKLQkJaWQgPSBlbnRpdHktPmV4dGVuc2lvbi5iYVNvdXJjZUlEWzBdOwotCQlicmVhazsKLQogCWNhc2UgVVZDX1ZDX1BST0NFU1NJTkdfVU5JVDoKLQkJaWQgPSBlbnRpdHktPnByb2Nlc3NpbmcuYlNvdXJjZUlEOworCQlpZCA9IGVudGl0eS0+YmFTb3VyY2VJRFswXTsKIAkJYnJlYWs7CiAKIAljYXNlIFVWQ19WQ19TRUxFQ1RPUl9VTklUOgogCQkvKiBTaW5nbGUtaW5wdXQgc2VsZWN0b3IgdW5pdHMgYXJlIGlnbm9yZWQuICovCi0JCWlmIChlbnRpdHktPnNlbGVjdG9yLmJOckluUGlucyA9PSAxKSB7Ci0JCQlpZCA9IGVudGl0eS0+c2VsZWN0b3IuYmFTb3VyY2VJRFswXTsKKwkJaWYgKGVudGl0eS0+Yk5ySW5QaW5zID09IDEpIHsKKwkJCWlkID0gZW50aXR5LT5iYVNvdXJjZUlEWzBdOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTM2OSw4ICsxMzU5LDggQEAKIAkJCXByaW50aygiIDwtIElUIik7CiAKIAkJY2hhaW4tPnNlbGVjdG9yID0gZW50aXR5OwotCQlmb3IgKGkgPSAwOyBpIDwgZW50aXR5LT5zZWxlY3Rvci5iTnJJblBpbnM7ICsraSkgewotCQkJaWQgPSBlbnRpdHktPnNlbGVjdG9yLmJhU291cmNlSURbaV07CisJCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPmJOckluUGluczsgKytpKSB7CisJCQlpZCA9IGVudGl0eS0+YmFTb3VyY2VJRFtpXTsKIAkJCXRlcm0gPSB1dmNfZW50aXR5X2J5X2lkKGNoYWluLT5kZXYsIGlkKTsKIAkJCWlmICh0ZXJtID09IE5VTEwgfHwgIVVWQ19FTlRJVFlfSVNfSVRFUk0odGVybSkpIHsKIAkJCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0RFU0NSLCAiU2VsZWN0b3IgdW5pdCAlZCAiCkBAIC0xMzgyLDcgKzEzNzIsNyBAQAogCQkJaWYgKHV2Y190cmFjZV9wYXJhbSAmIFVWQ19UUkFDRV9QUk9CRSkKIAkJCQlwcmludGsoIiAlZCIsIHRlcm0tPmlkKTsKIAotCQkJbGlzdF9hZGRfdGFpbCgmdGVybS0+Y2hhaW4sICZjaGFpbi0+aXRlcm1zKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnRlcm0tPmNoYWluLCAmY2hhaW4tPmVudGl0aWVzKTsKIAkJCXV2Y19zY2FuX2NoYWluX2ZvcndhcmQoY2hhaW4sIHRlcm0sIGVudGl0eSk7CiAJCX0KIApAQCAtMTM5MSwzNCArMTM4MSw0OSBAQAogCiAJCWlkID0gMDsKIAkJYnJlYWs7CisKKwljYXNlIFVWQ19JVFRfVkVORE9SX1NQRUNJRklDOgorCWNhc2UgVVZDX0lUVF9DQU1FUkE6CisJY2FzZSBVVkNfSVRUX01FRElBX1RSQU5TUE9SVF9JTlBVVDoKKwljYXNlIFVWQ19PVFRfVkVORE9SX1NQRUNJRklDOgorCWNhc2UgVVZDX09UVF9ESVNQTEFZOgorCWNhc2UgVVZDX09UVF9NRURJQV9UUkFOU1BPUlRfT1VUUFVUOgorCWNhc2UgVVZDX1RUX1NUUkVBTUlORzoKKwkJaWQgPSBVVkNfRU5USVRZX0lTX09URVJNKGVudGl0eSkgPyBlbnRpdHktPmJhU291cmNlSURbMF0gOiAwOworCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gaWQ7CisJaWYgKGlkIDw9IDApIHsKKwkJKl9lbnRpdHkgPSBOVUxMOworCQlyZXR1cm4gaWQ7CisJfQorCisJZW50aXR5ID0gdXZjX2VudGl0eV9ieV9pZChjaGFpbi0+ZGV2LCBpZCk7CisJaWYgKGVudGl0eSA9PSBOVUxMKSB7CisJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJGb3VuZCByZWZlcmVuY2UgdG8gIgorCQkJInVua25vd24gZW50aXR5ICVkLlxuIiwgaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqX2VudGl0eSA9IGVudGl0eTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1dmNfc2Nhbl9jaGFpbihzdHJ1Y3QgdXZjX3ZpZGVvX2NoYWluICpjaGFpbiwKLQkJCSAgc3RydWN0IHV2Y19lbnRpdHkgKm90ZXJtKQorCQkJICBzdHJ1Y3QgdXZjX2VudGl0eSAqdGVybSkKIHsKIAlzdHJ1Y3QgdXZjX2VudGl0eSAqZW50aXR5LCAqcHJldjsKLQlpbnQgaWQ7CiAKLQllbnRpdHkgPSBvdGVybTsKLQlsaXN0X2FkZF90YWlsKCZlbnRpdHktPmNoYWluLCAmY2hhaW4tPm90ZXJtcyk7Ci0JdXZjX3RyYWNlKFVWQ19UUkFDRV9QUk9CRSwgIlNjYW5uaW5nIFVWQyBjaGFpbjogT1QgJWQiLCBlbnRpdHktPmlkKTsKKwl1dmNfdHJhY2UoVVZDX1RSQUNFX1BST0JFLCAiU2Nhbm5pbmcgVVZDIGNoYWluOiIpOwogCi0JaWQgPSBlbnRpdHktPm91dHB1dC5iU291cmNlSUQ7Ci0Jd2hpbGUgKGlkICE9IDApIHsKLQkJcHJldiA9IGVudGl0eTsKLQkJZW50aXR5ID0gdXZjX2VudGl0eV9ieV9pZChjaGFpbi0+ZGV2LCBpZCk7Ci0JCWlmIChlbnRpdHkgPT0gTlVMTCkgewotCQkJdXZjX3RyYWNlKFVWQ19UUkFDRV9ERVNDUiwgIkZvdW5kIHJlZmVyZW5jZSB0byAiCi0JCQkJInVua25vd24gZW50aXR5ICVkLlxuIiwgaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwllbnRpdHkgPSB0ZXJtOworCXByZXYgPSBOVUxMOwogCisJd2hpbGUgKGVudGl0eSAhPSBOVUxMKSB7CisJCS8qIEVudGl0eSBtdXN0IG5vdCBiZSBwYXJ0IG9mIGFuIGV4aXN0aW5nIGNoYWluICovCiAJCWlmIChlbnRpdHktPmNoYWluLm5leHQgfHwgZW50aXR5LT5jaGFpbi5wcmV2KSB7CiAJCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0RFU0NSLCAiRm91bmQgcmVmZXJlbmNlIHRvICIKLQkJCQkiZW50aXR5ICVkIGFscmVhZHkgaW4gY2hhaW4uXG4iLCBpZCk7CisJCQkJImVudGl0eSAlZCBhbHJlYWR5IGluIGNoYWluLlxuIiwgZW50aXR5LT5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xNDMwLDM0ICsxNDM1LDM0IEBACiAJCWlmICh1dmNfc2Nhbl9jaGFpbl9mb3J3YXJkKGNoYWluLCBlbnRpdHksIHByZXYpIDwgMCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCS8qIFN0b3Agd2hlbiBhIHRlcm1pbmFsIGlzIGZvdW5kLiAqLwotCQlpZiAoVVZDX0VOVElUWV9JU19URVJNKGVudGl0eSkpCi0JCQlicmVhazsKLQogCQkvKiBCYWNrd2FyZCBzY2FuICovCi0JCWlkID0gdXZjX3NjYW5fY2hhaW5fYmFja3dhcmQoY2hhaW4sIGVudGl0eSk7Ci0JCWlmIChpZCA8IDApCi0JCQlyZXR1cm4gaWQ7CisJCXByZXYgPSBlbnRpdHk7CisJCWlmICh1dmNfc2Nhbl9jaGFpbl9iYWNrd2FyZChjaGFpbiwgJmVudGl0eSkgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdXZjX3ByaW50X3Rlcm1zKHN0cnVjdCBsaXN0X2hlYWQgKnRlcm1zLCBjaGFyICpidWZmZXIpCitzdGF0aWMgdW5zaWduZWQgaW50IHV2Y19wcmludF90ZXJtcyhzdHJ1Y3QgbGlzdF9oZWFkICp0ZXJtcywgdTE2IGRpciwKKwkJY2hhciAqYnVmZmVyKQogewogCXN0cnVjdCB1dmNfZW50aXR5ICp0ZXJtOwogCXVuc2lnbmVkIGludCBudGVybXMgPSAwOwogCWNoYXIgKnAgPSBidWZmZXI7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlcm0sIHRlcm1zLCBjaGFpbikgewotCQlwICs9IHNwcmludGYocCwgIiV1IiwgdGVybS0+aWQpOwotCQlpZiAodGVybS0+Y2hhaW4ubmV4dCAhPSB0ZXJtcykgeworCQlpZiAoIVVWQ19FTlRJVFlfSVNfVEVSTSh0ZXJtKSB8fAorCQkgICAgVVZDX1RFUk1fRElSRUNUSU9OKHRlcm0pICE9IGRpcikKKwkJCWNvbnRpbnVlOworCisJCWlmIChudGVybXMpCiAJCQlwICs9IHNwcmludGYocCwgIiwiKTsKLQkJCWlmICgrK250ZXJtcyA+PSA0KSB7Ci0JCQkJcCArPSBzcHJpbnRmKHAsICIuLi4iKTsKLQkJCQlicmVhazsKLQkJCX0KKwkJaWYgKCsrbnRlcm1zID49IDQpIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiLi4uIik7CisJCQlicmVhazsKIAkJfQorCQlwICs9IHNwcmludGYocCwgIiV1IiwgdGVybS0+aWQpOwogCX0KIAogCXJldHVybiBwIC0gYnVmZmVyOwpAQCAtMTQ2OCw5ICsxNDczLDkgQEAKIAlzdGF0aWMgY2hhciBidWZmZXJbNDNdOwogCWNoYXIgKnAgPSBidWZmZXI7CiAKLQlwICs9IHV2Y19wcmludF90ZXJtcygmY2hhaW4tPml0ZXJtcywgcCk7CisJcCArPSB1dmNfcHJpbnRfdGVybXMoJmNoYWluLT5lbnRpdGllcywgVVZDX1RFUk1fSU5QVVQsIHApOwogCXAgKz0gc3ByaW50ZihwLCAiIC0+ICIpOwotCXV2Y19wcmludF90ZXJtcygmY2hhaW4tPm90ZXJtcywgcCk7CisJdXZjX3ByaW50X3Rlcm1zKCZjaGFpbi0+ZW50aXRpZXMsIFVWQ19URVJNX09VVFBVVCwgcCk7CiAKIAlyZXR1cm4gYnVmZmVyOwogfQpAQCAtMTUwMSw5ICsxNTA2LDcgQEAKIAkJaWYgKGNoYWluID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlJTklUX0xJU1RfSEVBRCgmY2hhaW4tPml0ZXJtcyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZjaGFpbi0+b3Rlcm1zKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmNoYWluLT5leHRlbnNpb25zKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNoYWluLT5lbnRpdGllcyk7CiAJCW11dGV4X2luaXQoJmNoYWluLT5jdHJsX211dGV4KTsKIAkJY2hhaW4tPmRldiA9IGRldjsKIApAQCAtMTUzMSwyMiArMTUzNCw5MiBAQAogICovCiAKIC8qCisgKiBEZWxldGUgdGhlIFVWQyBkZXZpY2UuCisgKgorICogQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIHV2Y19kZXZpY2Ugc3RydWN0dXJlCisgKiBpcyByZWxlYXNlZC4KKyAqCisgKiBBcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBvciBkdXJpbmcgZGlzY29ubmVjdCgpLCBhbGwgVVJCcyBoYXZlCisgKiBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgYnkgdGhlIFVTQiBjb3JlLiBUaGVyZSBpcyBubyBuZWVkIHRvIGtpbGwgdGhlCisgKiBpbnRlcnJ1cHQgVVJCIG1hbnVhbGx5LgorICovCitzdGF0aWMgdm9pZCB1dmNfZGVsZXRlKHN0cnVjdCB1dmNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwl1c2JfcHV0X2ludGYoZGV2LT5pbnRmKTsKKwl1c2JfcHV0X2RldihkZXYtPnVkZXYpOworCisJdXZjX3N0YXR1c19jbGVhbnVwKGRldik7CisJdXZjX2N0cmxfY2xlYW51cF9kZXZpY2UoZGV2KTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmZGV2LT5jaGFpbnMpIHsKKwkJc3RydWN0IHV2Y192aWRlb19jaGFpbiAqY2hhaW47CisJCWNoYWluID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdXZjX3ZpZGVvX2NoYWluLCBsaXN0KTsKKwkJa2ZyZWUoY2hhaW4pOworCX0KKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmZGV2LT5lbnRpdGllcykgeworCQlzdHJ1Y3QgdXZjX2VudGl0eSAqZW50aXR5OworCQllbnRpdHkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB1dmNfZW50aXR5LCBsaXN0KTsKKwkJa2ZyZWUoZW50aXR5KTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmRldi0+c3RyZWFtcykgeworCQlzdHJ1Y3QgdXZjX3N0cmVhbWluZyAqc3RyZWFtaW5nOworCQlzdHJlYW1pbmcgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB1dmNfc3RyZWFtaW5nLCBsaXN0KTsKKwkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmdXZjX2RyaXZlci5kcml2ZXIsCisJCQlzdHJlYW1pbmctPmludGYpOworCQl1c2JfcHV0X2ludGYoc3RyZWFtaW5nLT5pbnRmKTsKKwkJa2ZyZWUoc3RyZWFtaW5nLT5mb3JtYXQpOworCQlrZnJlZShzdHJlYW1pbmctPmhlYWRlci5ibWFDb250cm9scyk7CisJCWtmcmVlKHN0cmVhbWluZyk7CisJfQorCisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgdXZjX3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgdXZjX3N0cmVhbWluZyAqc3RyZWFtID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJc3RydWN0IHV2Y19kZXZpY2UgKmRldiA9IHN0cmVhbS0+ZGV2OworCisJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmRldik7CisKKwkvKiBEZWNyZW1lbnQgdGhlIHJlZ2lzdGVyZWQgc3RyZWFtcyBjb3VudCBhbmQgZGVsZXRlIHRoZSBkZXZpY2Ugd2hlbiBpdAorCSAqIHJlYWNoZXMgemVyby4KKwkgKi8KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2LT5uc3RyZWFtcykpCisJCXV2Y19kZWxldGUoZGV2KTsKK30KKworLyoKICAqIFVucmVnaXN0ZXIgdGhlIHZpZGVvIGRldmljZXMuCiAgKi8KIHN0YXRpYyB2b2lkIHV2Y191bnJlZ2lzdGVyX3ZpZGVvKHN0cnVjdCB1dmNfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHV2Y19zdHJlYW1pbmcgKnN0cmVhbTsKIAorCS8qIFVucmVnaXN0ZXJpbmcgYWxsIHZpZGVvIGRldmljZXMgbWlnaHQgcmVzdWx0IGluIHV2Y19kZWxldGUoKSBiZWluZworCSAqIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUgbG9vcCBpZiB0aGVyZSdzIG5vIG9wZW4gZmlsZSBoYW5kbGUuIFRvIGF2b2lkCisJICogdGhhdCwgaW5jcmVtZW50IHRoZSBzdHJlYW0gY291bnQgYmVmb3JlIGl0ZXJhdGluZyBvdmVyIHRoZSBzdHJlYW1zCisJICogYW5kIGRlY3JlbWVudCBpdCB3aGVuIGRvbmUuCisJICovCisJYXRvbWljX2luYygmZGV2LT5uc3RyZWFtcyk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cmVhbSwgJmRldi0+c3RyZWFtcywgbGlzdCkgewogCQlpZiAoc3RyZWFtLT52ZGV2ID09IE5VTEwpCiAJCQljb250aW51ZTsKIAotCQlpZiAoc3RyZWFtLT52ZGV2LT5taW5vciA9PSAtMSkKLQkJCXZpZGVvX2RldmljZV9yZWxlYXNlKHN0cmVhbS0+dmRldik7Ci0JCWVsc2UKLQkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHN0cmVhbS0+dmRldik7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHN0cmVhbS0+dmRldik7CiAJCXN0cmVhbS0+dmRldiA9IE5VTEw7CiAJfQorCisJLyogRGVjcmVtZW50IHRoZSBzdHJlYW0gY291bnQgYW5kIGNhbGwgdXZjX2RlbGV0ZSBleHBsaWNpdGx5IGlmIHRoZXJlCisJICogYXJlIG5vIHN0cmVhbSBsZWZ0LgorCSAqLworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPm5zdHJlYW1zKSkKKwkJdXZjX2RlbGV0ZShkZXYpOwogfQogCiBzdGF0aWMgaW50IHV2Y19yZWdpc3Rlcl92aWRlbyhzdHJ1Y3QgdXZjX2RldmljZSAqZGV2LApAQCAtMTU4MCw3ICsxNjUzLDcgQEAKIAl2ZGV2LT5wYXJlbnQgPSAmZGV2LT5pbnRmLT5kZXY7CiAJdmRldi0+bWlub3IgPSAtMTsKIAl2ZGV2LT5mb3BzID0gJnV2Y19mb3BzOwotCXZkZXYtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKwl2ZGV2LT5yZWxlYXNlID0gdXZjX3JlbGVhc2U7CiAJc3RybGNweSh2ZGV2LT5uYW1lLCBkZXYtPm5hbWUsIHNpemVvZiB2ZGV2LT5uYW1lKTsKIAogCS8qIFNldCB0aGUgZHJpdmVyIGRhdGEgYmVmb3JlIGNhbGxpbmcgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlLCBvdGhlcndpc2UKQEAgLTE1OTgsNiArMTY3MSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJYXRvbWljX2luYygmZGV2LT5uc3RyZWFtcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MDUsMTMgKzE2NzksMTMgQEAKICAqIFJlZ2lzdGVyIGFsbCB2aWRlbyBkZXZpY2VzIGluIGFsbCBjaGFpbnMuCiAgKi8KIHN0YXRpYyBpbnQgdXZjX3JlZ2lzdGVyX3Rlcm1zKHN0cnVjdCB1dmNfZGV2aWNlICpkZXYsCi0Jc3RydWN0IHV2Y192aWRlb19jaGFpbiAqY2hhaW4sIHN0cnVjdCBsaXN0X2hlYWQgKnRlcm1zKQorCXN0cnVjdCB1dmNfdmlkZW9fY2hhaW4gKmNoYWluKQogewogCXN0cnVjdCB1dmNfc3RyZWFtaW5nICpzdHJlYW07CiAJc3RydWN0IHV2Y19lbnRpdHkgKnRlcm07CiAJaW50IHJldDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodGVybSwgdGVybXMsIGNoYWluKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZXJtLCAmY2hhaW4tPmVudGl0aWVzLCBjaGFpbikgewogCQlpZiAoVVZDX0VOVElUWV9UWVBFKHRlcm0pICE9IFVWQ19UVF9TVFJFQU1JTkcpCiAJCQljb250aW51ZTsKIApAQCAtMTYzNywxMSArMTcxMSw3IEBACiAJaW50IHJldDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhaW4sICZkZXYtPmNoYWlucywgbGlzdCkgewotCQlyZXQgPSB1dmNfcmVnaXN0ZXJfdGVybXMoZGV2LCBjaGFpbiwgJmNoYWluLT5pdGVybXMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gdXZjX3JlZ2lzdGVyX3Rlcm1zKGRldiwgY2hhaW4sICZjaGFpbi0+b3Rlcm1zKTsKKwkJcmV0ID0gdXZjX3JlZ2lzdGVyX3Rlcm1zKGRldiwgY2hhaW4pOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMTY1Myw2MSArMTcyMyw2IEBACiAgKiBVU0IgcHJvYmUsIGRpc2Nvbm5lY3QsIHN1c3BlbmQgYW5kIHJlc3VtZQogICovCiAKLS8qCi0gKiBEZWxldGUgdGhlIFVWQyBkZXZpY2UuCi0gKgotICogQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIHV2Y19kZXZpY2Ugc3RydWN0dXJlCi0gKiBpcyByZWxlYXNlZC4KLSAqCi0gKiBVbnJlZ2lzdGVyaW5nIHRoZSB2aWRlbyBkZXZpY2VzIGlzIGRvbmUgaGVyZSBiZWNhdXNlIGV2ZXJ5IG9wZW5lZCBpbnN0YW5jZQotICogbXVzdCBiZSBjbG9zZWQgYmVmb3JlIHRoZSBkZXZpY2UgY2FuIGJlIHVucmVnaXN0ZXJlZC4gQW4gYWx0ZXJuYXRpdmUgd291bGQKLSAqIGhhdmUgYmVlbiB0byB1c2UgYW5vdGhlciByZWZlcmVuY2UgY291bnQgZm9yIHV2Y192NGwyX29wZW4vdXZjX3JlbGVhc2UsIGFuZAotICogdW5yZWdpc3RlciB0aGUgdmlkZW8gZGV2aWNlcyBvbiBkaXNjb25uZWN0IHdoZW4gdGhhdCByZWZlcmVuY2UgY291bnQgZHJvcHMKLSAqIHRvIHplcm8uCi0gKgotICogQXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgb3IgZHVyaW5nIGRpc2Nvbm5lY3QoKSwgYWxsIFVSQnMgaGF2ZQotICogYWxyZWFkeSBiZWVuIGNhbmNlbGVkIGJ5IHRoZSBVU0IgY29yZS4gVGhlcmUgaXMgbm8gbmVlZCB0byBraWxsIHRoZQotICogaW50ZXJydXB0IFVSQiBtYW51YWxseS4KLSAqLwotdm9pZCB1dmNfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCB1dmNfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHV2Y19kZXZpY2UsIGtyZWYpOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCi0JLyogVW5yZWdpc3RlciB0aGUgdmlkZW8gZGV2aWNlcy4gKi8KLQl1dmNfdW5yZWdpc3Rlcl92aWRlbyhkZXYpOwotCXVzYl9wdXRfaW50ZihkZXYtPmludGYpOwotCXVzYl9wdXRfZGV2KGRldi0+dWRldik7Ci0KLQl1dmNfc3RhdHVzX2NsZWFudXAoZGV2KTsKLQl1dmNfY3RybF9jbGVhbnVwX2RldmljZShkZXYpOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZkZXYtPmNoYWlucykgewotCQlzdHJ1Y3QgdXZjX3ZpZGVvX2NoYWluICpjaGFpbjsKLQkJY2hhaW4gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB1dmNfdmlkZW9fY2hhaW4sIGxpc3QpOwotCQlrZnJlZShjaGFpbik7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZkZXYtPmVudGl0aWVzKSB7Ci0JCXN0cnVjdCB1dmNfZW50aXR5ICplbnRpdHk7Ci0JCWVudGl0eSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHV2Y19lbnRpdHksIGxpc3QpOwotCQlrZnJlZShlbnRpdHkpOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmZGV2LT5zdHJlYW1zKSB7Ci0JCXN0cnVjdCB1dmNfc3RyZWFtaW5nICpzdHJlYW1pbmc7Ci0JCXN0cmVhbWluZyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHV2Y19zdHJlYW1pbmcsIGxpc3QpOwotCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKCZ1dmNfZHJpdmVyLmRyaXZlciwKLQkJCXN0cmVhbWluZy0+aW50Zik7Ci0JCXVzYl9wdXRfaW50ZihzdHJlYW1pbmctPmludGYpOwotCQlrZnJlZShzdHJlYW1pbmctPmZvcm1hdCk7Ci0JCWtmcmVlKHN0cmVhbWluZy0+aGVhZGVyLmJtYUNvbnRyb2xzKTsKLQkJa2ZyZWUoc3RyZWFtaW5nKTsKLQl9Ci0KLQlrZnJlZShkZXYpOwotfQotCiBzdGF0aWMgaW50IHV2Y19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xNzMwLDcgKzE3NDUsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmVudGl0aWVzKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5jaGFpbnMpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnN0cmVhbXMpOwotCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKKwlhdG9taWNfc2V0KCZkZXYtPm5zdHJlYW1zLCAwKTsKIAlhdG9taWNfc2V0KCZkZXYtPnVzZXJzLCAwKTsKIAogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwpAQCAtMTc5Miw3ICsxODA3LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3I6Ci0Ja3JlZl9wdXQoJmRldi0+a3JlZiwgdXZjX2RlbGV0ZSk7CisJdXZjX3VucmVnaXN0ZXJfdmlkZW8oZGV2KTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtMTgwOSwyMSArMTgyNCw5IEBACiAJICAgIFVWQ19TQ19WSURFT1NUUkVBTUlORykKIAkJcmV0dXJuOwogCi0JLyogdXZjX3Y0bDJfb3BlbigpIG1pZ2h0IHJhY2UgdXZjX2Rpc2Nvbm5lY3QoKS4gQSBzdGF0aWMgZHJpdmVyLXdpZGUKLQkgKiBsb2NrIGlzIG5lZWRlZCB0byBwcmV2ZW50IHV2Y19kaXNjb25uZWN0IGZyb20gcmVsZWFzaW5nIGl0cwotCSAqIHJlZmVyZW5jZSB0byB0aGUgdXZjX2RldmljZSBpbnN0YW5jZSBhZnRlciB1dmNfdjRsMl9vcGVuKCkgcmVjZWl2ZWQKLQkgKiB0aGUgcG9pbnRlciB0byB0aGUgZGV2aWNlICh2aWRlb19kZXZkYXRhKSBidXQgYmVmb3JlIGl0IGdvdCB0aGUKLQkgKiBjaGFuY2UgdG8gaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCAoa3JlZl9nZXQpLgotCSAqCi0JICogTm90ZSB0aGF0IHRoZSByZWZlcmVuY2UgY2FuJ3QgYmUgcmVsZWFzZWQgd2l0aCB0aGUgbG9jayBoZWxkLAotCSAqIG90aGVyd2lzZSBhIEFCLUJBIGRlYWRsb2NrIGNhbiBvY2N1ciB3aXRoIHZpZGVvZGV2X2xvY2sgdGhhdAotCSAqIHZpZGVvZGV2IGFjcXVpcmVzIGluIHZpZGVvZGV2X29wZW4oKSBhbmQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoKS4KLQkgKi8KLQltdXRleF9sb2NrKCZ1dmNfZHJpdmVyLm9wZW5fbXV0ZXgpOwogCWRldi0+c3RhdGUgfD0gVVZDX0RFVl9ESVNDT05ORUNURUQ7Ci0JbXV0ZXhfdW5sb2NrKCZ1dmNfZHJpdmVyLm9wZW5fbXV0ZXgpOwogCi0Ja3JlZl9wdXQoJmRldi0+a3JlZiwgdXZjX2RlbGV0ZSk7CisJdXZjX3VucmVnaXN0ZXJfdmlkZW8oZGV2KTsKIH0KIAogc3RhdGljIGludCB1dmNfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCkBAIC0xODk5LDYgKzE5MDIsMTUgQEAKICAqIHRob3VnaCB0aGV5IGFyZSBjb21wbGlhbnQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1dmNfaWRzW10gPSB7CisJLyogR2VuaXVzIGVGYWNlIDIwMjUgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDA0NTgsCisJICAuaWRQcm9kdWN0CQk9IDB4NzA2ZSwKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKIAkvKiBNaWNyb3NvZnQgTGlmZWNhbSBOWC02MDAwICovCiAJeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKIAkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCkBAIC0yMTIzLDYgKzIxMzUsMTUgQEAKIAkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAogCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCiAJICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1NUQVRVU19JTlRFUlZBTCB9LAorCS8qIE1TSSBTdGFyQ2FtIDM3MGkgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDFiM2IsCisJICAuaWRQcm9kdWN0CQk9IDB4Mjk1MSwKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKIAkvKiBTaUdtYSBNaWNybyBVU0IgV2ViIENhbWVyYSAqLwogCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCiAJCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLApAQCAtMjE1OSw3ICsyMTgwLDYgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZ1dmNfZHJpdmVyLmRldmljZXMpOwogCUlOSVRfTElTVF9IRUFEKCZ1dmNfZHJpdmVyLmNvbnRyb2xzKTsKLQltdXRleF9pbml0KCZ1dmNfZHJpdmVyLm9wZW5fbXV0ZXgpOwogCW11dGV4X2luaXQoJnV2Y19kcml2ZXIuY3RybF9tdXRleCk7CiAKIAl1dmNfY3RybF9pbml0KCk7CkBAIC0yMTg0LDYgKzIyMDQsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhxdWlya3MsICJGb3JjZWQgZGV2aWNlIHF1aXJrcyIpOwogbW9kdWxlX3BhcmFtX25hbWVkKHRyYWNlLCB1dmNfdHJhY2VfcGFyYW0sIHVpbnQsIFNfSVJVR098U19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKHRyYWNlLCAiVHJhY2UgbGV2ZWwgYml0bWFzayIpOworbW9kdWxlX3BhcmFtX25hbWVkKHRpbWVvdXQsIHV2Y190aW1lb3V0X3BhcmFtLCB1aW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAiU3RyZWFtaW5nIGNvbnRyb2wgcmVxdWVzdHMgdGltZW91dCIpOwogCiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCmluZGV4IGEyYmRkODAuLjIzMjM5YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYwpAQCAtMzY0LDM3ICszNjQsMzAgQEAKICAqIHVucHJpdmlsZWdlZCBzdGF0ZS4gT25seSBhIHNpbmdsZSBpbnN0YW5jZSBjYW4gYmUgaW4gYSBwcml2aWxlZ2VkIHN0YXRlIGF0CiAgKiBhIGdpdmVuIHRpbWUuIFRyeWluZyB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHByaXZpbGVnZXMgd2lsbAogICogYXV0b21hdGljYWxseSBhY3F1aXJlIHRoZSByZXF1aXJlZCBwcml2aWxlZ2VzIGlmIHBvc3NpYmxlLCBvciByZXR1cm4gLUVCVVNZCi0gKiBvdGhlcndpc2UuIFByaXZpbGVnZXMgYXJlIGRpc21pc3NlZCB3aGVuIGNsb3NpbmcgdGhlIGluc3RhbmNlLgorICogb3RoZXJ3aXNlLiBQcml2aWxlZ2VzIGFyZSBkaXNtaXNzZWQgd2hlbiBjbG9zaW5nIHRoZSBpbnN0YW5jZSBvciB3aGVuCisgKiBmcmVlaW5nIHRoZSB2aWRlbyBidWZmZXJzIHVzaW5nIFZJRElPQ19SRVFCVUZTLgogICoKICAqIE9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIHByaXZpbGVnZXMgYXJlOgogICoKICAqIC0gVklESU9DX1NfSU5QVVQKICAqIC0gVklESU9DX1NfUEFSTQogICogLSBWSURJT0NfU19GTVQKLSAqIC0gVklESU9DX1RSWV9GTVQKICAqIC0gVklESU9DX1JFUUJVRlMKICAqLwogc3RhdGljIGludCB1dmNfYWNxdWlyZV9wcml2aWxlZ2VzKHN0cnVjdCB1dmNfZmggKmhhbmRsZSkKIHsKLQlpbnQgcmV0ID0gMDsKLQogCS8qIEFsd2F5cyBzdWNjZWVkIGlmIHRoZSBoYW5kbGUgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLiAqLwogCWlmIChoYW5kbGUtPnN0YXRlID09IFVWQ19IQU5ETEVfQUNUSVZFKQogCQlyZXR1cm4gMDsKIAogCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgYWxyZWFkeSBoYXMgYSBwcml2aWxlZ2VkIGhhbmRsZS4gKi8KLQltdXRleF9sb2NrKCZ1dmNfZHJpdmVyLm9wZW5fbXV0ZXgpOwogCWlmIChhdG9taWNfaW5jX3JldHVybigmaGFuZGxlLT5zdHJlYW0tPmFjdGl2ZSkgIT0gMSkgewogCQlhdG9taWNfZGVjKCZoYW5kbGUtPnN0cmVhbS0+YWN0aXZlKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaGFuZGxlLT5zdGF0ZSA9IFVWQ19IQU5ETEVfQUNUSVZFOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmdXZjX2RyaXZlci5vcGVuX211dGV4KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB1dmNfZGlzbWlzc19wcml2aWxlZ2VzKHN0cnVjdCB1dmNfZmggKmhhbmRsZSkKQEAgLTQyMSwyNCArNDE0LDIwIEBACiAJaW50IHJldCA9IDA7CiAKIAl1dmNfdHJhY2UoVVZDX1RSQUNFX0NBTExTLCAidXZjX3Y0bDJfb3BlblxuIik7Ci0JbXV0ZXhfbG9jaygmdXZjX2RyaXZlci5vcGVuX211dGV4KTsKIAlzdHJlYW0gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JaWYgKHN0cmVhbS0+ZGV2LT5zdGF0ZSAmIFVWQ19ERVZfRElTQ09OTkVDVEVEKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9CisJaWYgKHN0cmVhbS0+ZGV2LT5zdGF0ZSAmIFVWQ19ERVZfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJlYW0tPmRldi0+aW50Zik7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZG9uZTsKKwkJcmV0dXJuIHJldDsKIAogCS8qIENyZWF0ZSB0aGUgZGV2aWNlIGhhbmRsZS4gKi8KIAloYW5kbGUgPSBremFsbG9jKHNpemVvZiAqaGFuZGxlLCBHRlBfS0VSTkVMKTsKIAlpZiAoaGFuZGxlID09IE5VTEwpIHsKIAkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cmVhbS0+ZGV2LT5pbnRmKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAoYXRvbWljX2luY19yZXR1cm4oJnN0cmVhbS0+ZGV2LT51c2VycykgPT0gMSkgewpAQCAtNDQ3LDcgKzQzNiw3IEBACiAJCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RyZWFtLT5kZXYtPmludGYpOwogCQkJYXRvbWljX2RlYygmc3RyZWFtLT5kZXYtPnVzZXJzKTsKIAkJCWtmcmVlKGhhbmRsZSk7Ci0JCQlnb3RvIGRvbmU7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCkBAIC00NTYsMTEgKzQ0NSw3IEBACiAJaGFuZGxlLT5zdGF0ZSA9IFVWQ19IQU5ETEVfUEFTU0lWRTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBoYW5kbGU7CiAKLQlrcmVmX2dldCgmc3RyZWFtLT5kZXYtPmtyZWYpOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmdXZjX2RyaXZlci5vcGVuX211dGV4KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHV2Y192NGwyX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCkBAIC00OTAsNyArNDc1LDYgQEAKIAkJdXZjX3N0YXR1c19zdG9wKHN0cmVhbS0+ZGV2KTsKIAogCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJlYW0tPmRldi0+aW50Zik7Ci0Ja3JlZl9wdXQoJnN0cmVhbS0+ZGV2LT5rcmVmLCB1dmNfZGVsZXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjM2LDEyICs2MjAsMTYgQEAKIAkJICAgIChjaGFpbi0+ZGV2LT5xdWlya3MgJiBVVkNfUVVJUktfSUdOT1JFX1NFTEVDVE9SX1VOSVQpKSB7CiAJCQlpZiAoaW5kZXggIT0gMCkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWl0ZXJtID0gbGlzdF9maXJzdF9lbnRyeSgmY2hhaW4tPml0ZXJtcywKLQkJCQkJc3RydWN0IHV2Y19lbnRpdHksIGNoYWluKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlcm0sICZjaGFpbi0+ZW50aXRpZXMsIGNoYWluKSB7CisJCQkJaWYgKFVWQ19FTlRJVFlfSVNfSVRFUk0oaXRlcm0pKQorCQkJCQlicmVhazsKKwkJCX0KIAkJCXBpbiA9IGl0ZXJtLT5pZDsKLQkJfSBlbHNlIGlmIChwaW4gPCBzZWxlY3Rvci0+c2VsZWN0b3IuYk5ySW5QaW5zKSB7Ci0JCQlwaW4gPSBzZWxlY3Rvci0+c2VsZWN0b3IuYmFTb3VyY2VJRFtpbmRleF07Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXJtLCBjaGFpbi0+aXRlcm1zLm5leHQsIGNoYWluKSB7CisJCX0gZWxzZSBpZiAocGluIDwgc2VsZWN0b3ItPmJOckluUGlucykgeworCQkJcGluID0gc2VsZWN0b3ItPmJhU291cmNlSURbaW5kZXhdOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVybSwgJmNoYWluLT5lbnRpdGllcywgY2hhaW4pIHsKKwkJCQlpZiAoIVVWQ19FTlRJVFlfSVNfSVRFUk0oaXRlcm0pKQorCQkJCQljb250aW51ZTsKIAkJCQlpZiAoaXRlcm0tPmlkID09IHBpbikKIAkJCQkJYnJlYWs7CiAJCQl9CkBAIC02OTIsNyArNjgwLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGlucHV0ID09IDAgfHwgaW5wdXQgPiBjaGFpbi0+c2VsZWN0b3ItPnNlbGVjdG9yLmJOckluUGlucykKKwkJaWYgKGlucHV0ID09IDAgfHwgaW5wdXQgPiBjaGFpbi0+c2VsZWN0b3ItPmJOckluUGlucykKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXJldHVybiB1dmNfcXVlcnlfY3RybChjaGFpbi0+ZGV2LCBVVkNfU0VUX0NVUiwKQEAgLTczMSw5ICs3MTksNiBAQAogCXsKIAkJc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCBwcm9iZTsKIAotCQlpZiAoKHJldCA9IHV2Y19hY3F1aXJlX3ByaXZpbGVnZXMoaGFuZGxlKSkgPCAwKQotCQkJcmV0dXJuIHJldDsKLQogCQlyZXR1cm4gdXZjX3Y0bDJfdHJ5X2Zvcm1hdChzdHJlYW0sIGFyZywgJnByb2JlLCBOVUxMLCBOVUxMKTsKIAl9CiAKQEAgLTg4OCw2ICs4NzMsOSBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKKwkJaWYgKHJldCA9PSAwKQorCQkJdXZjX2Rpc21pc3NfcHJpdmlsZWdlcyhoYW5kbGUpOworCiAJCXJiLT5jb3VudCA9IHJldDsKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CkBAIC0xMDUxLDcgKzEwMzksNyBAQAogCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJdXZjX3RyYWNlKFVWQ19UUkFDRV9DQUxMUywgInV2Y192NGwyX3JlYWQ6IG5vdCBpbXBsZW1lbnRlZC5cbiIpOwotCXJldHVybiAtRU5PREVWOworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwppbmRleCBhNmU0MWQxLi4wNTEzOWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAKIAlyZXQgPSBfX3V2Y19xdWVyeV9jdHJsKHN0cmVhbS0+ZGV2LCBxdWVyeSwgMCwgc3RyZWFtLT5pbnRmbnVtLAogCQlwcm9iZSA/IFVWQ19WU19QUk9CRV9DT05UUk9MIDogVVZDX1ZTX0NPTU1JVF9DT05UUk9MLCBkYXRhLAotCQlzaXplLCBVVkNfQ1RSTF9TVFJFQU1JTkdfVElNRU9VVCk7CisJCXNpemUsIHV2Y190aW1lb3V0X3BhcmFtKTsKIAogCWlmICgocXVlcnkgPT0gVVZDX0dFVF9NSU4gfHwgcXVlcnkgPT0gVVZDX0dFVF9NQVgpICYmIHJldCA9PSAyKSB7CiAJCS8qIFNvbWUgY2FtZXJhcywgbW9zdGx5IGJhc2VkIG9uIEJpc29uIEVsZWN0cm9uaWNzIGNoaXBzZXRzLApAQCAtMjM5LDcgKzIzOSw3IEBACiAKIAlyZXQgPSBfX3V2Y19xdWVyeV9jdHJsKHN0cmVhbS0+ZGV2LCBVVkNfU0VUX0NVUiwgMCwgc3RyZWFtLT5pbnRmbnVtLAogCQlwcm9iZSA/IFVWQ19WU19QUk9CRV9DT05UUk9MIDogVVZDX1ZTX0NPTU1JVF9DT05UUk9MLCBkYXRhLAotCQlzaXplLCBVVkNfQ1RSTF9TVFJFQU1JTkdfVElNRU9VVCk7CisJCXNpemUsIHV2Y190aW1lb3V0X3BhcmFtKTsKIAlpZiAocmV0ICE9IHNpemUpIHsKIAkJdXZjX3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byBzZXQgVVZDICVzIGNvbnRyb2wgOiAiCiAJCQkiJWQgKGV4cC4gJXUpLlxuIiwgcHJvYmUgPyAicHJvYmUiIDogImNvbW1pdCIsCkBAIC03NzAsOCArNzcwLDkgQEAKIAkvKiBSZXRyeSBhbGxvY2F0aW9ucyB1bnRpbCBvbmUgc3VjY2VlZC4gKi8KIAlmb3IgKDsgbnBhY2tldHMgPiAxOyBucGFja2V0cyAvPSAyKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBVVkNfVVJCUzsgKytpKSB7CisJCQlzdHJlYW0tPnVyYl9zaXplID0gcHNpemUgKiBucGFja2V0czsKIAkJCXN0cmVhbS0+dXJiX2J1ZmZlcltpXSA9IHVzYl9idWZmZXJfYWxsb2MoCi0JCQkJc3RyZWFtLT5kZXYtPnVkZXYsIHBzaXplICogbnBhY2tldHMsCisJCQkJc3RyZWFtLT5kZXYtPnVkZXYsIHN0cmVhbS0+dXJiX3NpemUsCiAJCQkJZ2ZwX2ZsYWdzIHwgX19HRlBfTk9XQVJOLCAmc3RyZWFtLT51cmJfZG1hW2ldKTsKIAkJCWlmICghc3RyZWFtLT51cmJfYnVmZmVyW2ldKSB7CiAJCQkJdXZjX2ZyZWVfdXJiX2J1ZmZlcnMoc3RyZWFtKTsKQEAgLTc4MCwxMSArNzgxLDE1IEBACiAJCX0KIAogCQlpZiAoaSA9PSBVVkNfVVJCUykgewotCQkJc3RyZWFtLT51cmJfc2l6ZSA9IHBzaXplICogbnBhY2tldHM7CisJCQl1dmNfdHJhY2UoVVZDX1RSQUNFX1ZJREVPLCAiQWxsb2NhdGVkICV1IFVSQiBidWZmZXJzICIKKwkJCQkib2YgJXV4JXUgYnl0ZXMgZWFjaC5cbiIsIFVWQ19VUkJTLCBucGFja2V0cywKKwkJCQlwc2l6ZSk7CiAJCQlyZXR1cm4gbnBhY2tldHM7CiAJCX0KIAl9CiAKKwl1dmNfdHJhY2UoVVZDX1RSQUNFX1ZJREVPLCAiRmFpbGVkIHRvIGFsbG9jYXRlIFVSQiBidWZmZXJzICgldSBieXRlcyAiCisJCSJwZXIgcGFja2V0KS5cbiIsIHBzaXplKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTM1LDEwICs5NDAsMTIgQEAKIAkJYmFuZHdpZHRoID0gc3RyZWFtLT5jdHJsLmR3TWF4UGF5bG9hZFRyYW5zZmVyU2l6ZTsKIAogCQlpZiAoYmFuZHdpZHRoID09IDApIHsKLQkJCXV2Y19wcmludGsoS0VSTl9XQVJOSU5HLCAiZGV2aWNlICVzIHJlcXVlc3RlZCBudWxsICIKLQkJCQkiYmFuZHdpZHRoLCBkZWZhdWx0aW5nIHRvIGxvd2VzdC5cbiIsCi0JCQkJc3RyZWFtLT5kZXYtPm5hbWUpOworCQkJdXZjX3RyYWNlKFVWQ19UUkFDRV9WSURFTywgIkRldmljZSByZXF1ZXN0ZWQgbnVsbCAiCisJCQkJImJhbmR3aWR0aCwgZGVmYXVsdGluZyB0byBsb3dlc3QuXG4iKTsKIAkJCWJhbmR3aWR0aCA9IDE7CisJCX0gZWxzZSB7CisJCQl1dmNfdHJhY2UoVVZDX1RSQUNFX1ZJREVPLCAiRGV2aWNlIHJlcXVlc3RlZCAldSAiCisJCQkJIkIvZnJhbWUgYmFuZHdpZHRoLlxuIiwgYmFuZHdpZHRoKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5udW1fYWx0c2V0dGluZzsgKytpKSB7CkBAIC05NTUsOCArOTYyLDExIEBACiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoaSA+PSBpbnRmLT5udW1fYWx0c2V0dGluZykKKwkJaWYgKGkgPj0gaW50Zi0+bnVtX2FsdHNldHRpbmcpIHsKKwkJCXV2Y190cmFjZShVVkNfVFJBQ0VfVklERU8sICJObyBmYXN0IGVub3VnaCBhbHQgc2V0dGluZyAiCisJCQkJImZvciByZXF1ZXN0ZWQgYmFuZHdpZHRoLlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKKwkJfQogCiAJCXJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKHN0cmVhbS0+ZGV2LT51ZGV2LCBpbnRmbnVtLCBpKTsKIAkJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaAppbmRleCBlNzk1OGFhLi43ZWM5YTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKQEAgLTc1LDYgKzc1LDcgQEAKIAogI2RlZmluZSBVVkNfVEVSTV9JTlBVVAkJCTB4MDAwMAogI2RlZmluZSBVVkNfVEVSTV9PVVRQVVQJCQkweDgwMDAKKyNkZWZpbmUgVVZDX1RFUk1fRElSRUNUSU9OKHRlcm0pCSgodGVybSktPnR5cGUgJiAweDgwMDApCiAKICNkZWZpbmUgVVZDX0VOVElUWV9UWVBFKGVudGl0eSkJCSgoZW50aXR5KS0+dHlwZSAmIDB4N2ZmZikKICNkZWZpbmUgVVZDX0VOVElUWV9JU19VTklUKGVudGl0eSkJKCgoZW50aXR5KS0+dHlwZSAmIDB4ZmYwMCkgPT0gMCkKQEAgLTE0OCw3ICsxNDksNyBAQAogI2RlZmluZSBVVkNfTUFYX1NUQVRVU19TSVpFCTE2CiAKICNkZWZpbmUgVVZDX0NUUkxfQ09OVFJPTF9USU1FT1VUCTMwMAotI2RlZmluZSBVVkNfQ1RSTF9TVFJFQU1JTkdfVElNRU9VVAkxMDAwCisjZGVmaW5lIFVWQ19DVFJMX1NUUkVBTUlOR19USU1FT1VUCTMwMDAKIAogLyogRGV2aWNlcyBxdWlya3MgKi8KICNkZWZpbmUgVVZDX1FVSVJLX1NUQVRVU19JTlRFUlZBTAkweDAwMDAwMDAxCkBAIC0yOTIsMTEgKzI5Myw5IEBACiAJCX0gbWVkaWE7CiAKIAkJc3RydWN0IHsKLQkJCV9fdTggIGJTb3VyY2VJRDsKIAkJfSBvdXRwdXQ7CiAKIAkJc3RydWN0IHsKLQkJCV9fdTggIGJTb3VyY2VJRDsKIAkJCV9fdTE2IHdNYXhNdWx0aXBsaWVyOwogCQkJX191OCAgYkNvbnRyb2xTaXplOwogCQkJX191OCAgKmJtQ29udHJvbHM7CkBAIC0zMDQsMjEgKzMwMywyMCBAQAogCQl9IHByb2Nlc3Npbmc7CiAKIAkJc3RydWN0IHsKLQkJCV9fdTggIGJOckluUGluczsKLQkJCV9fdTggICpiYVNvdXJjZUlEOwogCQl9IHNlbGVjdG9yOwogCiAJCXN0cnVjdCB7CiAJCQlfX3U4ICBndWlkRXh0ZW5zaW9uQ29kZVsxNl07CiAJCQlfX3U4ICBiTnVtQ29udHJvbHM7Ci0JCQlfX3U4ICBiTnJJblBpbnM7Ci0JCQlfX3U4ICAqYmFTb3VyY2VJRDsKIAkJCV9fdTggIGJDb250cm9sU2l6ZTsKIAkJCV9fdTggICpibUNvbnRyb2xzOwogCQkJX191OCAgKmJtQ29udHJvbHNUeXBlOwogCQl9IGV4dGVuc2lvbjsKIAl9OwogCisJX191OCBiTnJJblBpbnM7CisJX191OCAqYmFTb3VyY2VJRDsKKwogCXVuc2lnbmVkIGludCBuY29udHJvbHM7CiAJc3RydWN0IHV2Y19jb250cm9sICpjb250cm9sczsKIH07CkBAIC00MDgsMTEgKzQwNiw5IEBACiAJc3RydWN0IHV2Y19kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKLQlzdHJ1Y3QgbGlzdF9oZWFkIGl0ZXJtczsJCS8qIElucHV0IHRlcm1pbmFscyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgb3Rlcm1zOwkJLyogT3V0cHV0IHRlcm1pbmFscyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZW50aXRpZXM7CQkvKiBBbGwgZW50aXRpZXMgKi8KIAlzdHJ1Y3QgdXZjX2VudGl0eSAqcHJvY2Vzc2luZzsJCS8qIFByb2Nlc3NpbmcgdW5pdCAqLwogCXN0cnVjdCB1dmNfZW50aXR5ICpzZWxlY3RvcjsJCS8qIFNlbGVjdG9yIHVuaXQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGV4dGVuc2lvbnM7CQkvKiBFeHRlbnNpb24gdW5pdHMgKi8KIAogCXN0cnVjdCBtdXRleCBjdHJsX211dGV4OwogfTsKQEAgLTQ3NSw3ICs0NzEsNiBAQAogCWNoYXIgbmFtZVszMl07CiAKIAllbnVtIHV2Y19kZXZpY2Vfc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IGtyZWYga3JlZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJYXRvbWljX3QgdXNlcnM7CiAKQEAgLTQ4OCw2ICs0ODMsNyBAQAogCiAJLyogVmlkZW8gU3RyZWFtaW5nIGludGVyZmFjZXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHN0cmVhbXM7CisJYXRvbWljX3QgbnN0cmVhbXM7CiAKIAkvKiBTdGF0dXMgSW50ZXJydXB0IEVuZHBvaW50ICovCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICppbnRfZXA7CkBAIC01MTEsOCArNTA3LDYgQEAKIHN0cnVjdCB1dmNfZHJpdmVyIHsKIAlzdHJ1Y3QgdXNiX2RyaXZlciBkcml2ZXI7CiAKLQlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsJLyogcHJvdGVjdHMgZnJvbSBvcGVuL2Rpc2Nvbm5lY3QgcmFjZSAqLwotCiAJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOwkvKiBzdHJ1Y3QgdXZjX2RldmljZSBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBjb250cm9sczsJLyogc3RydWN0IHV2Y19jb250cm9sX2luZm8gbGlzdCAqLwogCXN0cnVjdCBtdXRleCBjdHJsX211dGV4OwkvKiBwcm90ZWN0cyBjb250cm9scyBhbmQgZGV2aWNlcwpAQCAtNTMzLDEyICs1MjcsMTQgQEAKICNkZWZpbmUgVVZDX1RSQUNFX0ZSQU1FCQkoMSA8PCA3KQogI2RlZmluZSBVVkNfVFJBQ0VfU1VTUEVORAkoMSA8PCA4KQogI2RlZmluZSBVVkNfVFJBQ0VfU1RBVFVTCSgxIDw8IDkpCisjZGVmaW5lIFVWQ19UUkFDRV9WSURFTwkJKDEgPDwgMTApCiAKICNkZWZpbmUgVVZDX1dBUk5fTUlOTUFYCQkwCiAjZGVmaW5lIFVWQ19XQVJOX1BST0JFX0RFRgkxCiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgdXZjX25vX2Ryb3BfcGFyYW07CiBleHRlcm4gdW5zaWduZWQgaW50IHV2Y190cmFjZV9wYXJhbTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdXZjX3RpbWVvdXRfcGFyYW07CiAKICNkZWZpbmUgdXZjX3RyYWNlKGZsYWcsIG1zZy4uLikgXAogCWRvIHsgXApAQCAtNTcxLDcgKzU2Nyw2IEBACiAKIC8qIENvcmUgZHJpdmVyICovCiBleHRlcm4gc3RydWN0IHV2Y19kcml2ZXIgdXZjX2RyaXZlcjsKLWV4dGVybiB2b2lkIHV2Y19kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpOwogCiAvKiBWaWRlbyBidWZmZXJzIHF1ZXVlIG1hbmFnZW1lbnQuICovCiBleHRlcm4gdm9pZCB1dmNfcXVldWVfaW5pdChzdHJ1Y3QgdXZjX3ZpZGVvX3F1ZXVlICpxdWV1ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwppbmRleCBmNWE5M2FlLi5lOGU1YWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCkBAIC00MzEsNiArNDMxLDggQEAKIAljYXNlIFY0TDJfQ0lEX0NIUk9NQV9BR0M6CQlyZXR1cm4gIkNocm9tYSBBR0MiOwogCWNhc2UgVjRMMl9DSURfQ09MT1JfS0lMTEVSOgkJcmV0dXJuICJDb2xvciBLaWxsZXIiOwogCWNhc2UgVjRMMl9DSURfQ09MT1JGWDoJCQlyZXR1cm4gIkNvbG9yIEVmZmVjdHMiOworCWNhc2UgVjRMMl9DSURfUk9UQVRFOgkJCXJldHVybiAiUm90YXRlIjsKKwljYXNlIFY0TDJfQ0lEX0JHX0NPTE9SOgkJCXJldHVybiAiQmFja2dyb3VuZCBjb2xvciI7CiAKIAkvKiBNUEVHIGNvbnRyb2xzICovCiAJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOiAJCXJldHVybiAiTVBFRyBFbmNvZGVyIENvbnRyb2xzIjsKQEAgLTU4Nyw2ICs1ODksMTMgQEAKIAkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWTsKIAkJbWluID0gbWF4ID0gc3RlcCA9IGRlZiA9IDA7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkdfQ09MT1I6CisJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKKwkJc3RlcCA9IDE7CisJCW1pbiA9IDA7CisJCS8qIE1heCBpcyBjYWxjdWxhdGVkIGFzIFJHQjg4OCB0aGF0IGlzIDJeMjQgKi8KKwkJbWF4ID0gMHhGRkZGRkY7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtY29yZS5jCmluZGV4IDhlOTNjNmYuLmJiMGExYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtY29yZS5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogCiB2b2lkIHZpZGVvYnVmX3F1ZXVlX2NvcmVfaW5pdChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCi0JCQkgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyAqb3BzLAorCQkJIGNvbnN0IHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgKm9wcywKIAkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgc3BpbmxvY2tfdCAqaXJxbG9jaywKIAkJCSBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSwKQEAgLTM2MCw3ICszNjAsNyBAQAogCQlxLT5idWZzW2ldLT5ic2l6ZSAgPSBic2l6ZTsKIAkJc3dpdGNoIChtZW1vcnkpIHsKIAkJY2FzZSBWNEwyX01FTU9SWV9NTUFQOgotCQkJcS0+YnVmc1tpXS0+Ym9mZiAgPSBic2l6ZSAqIGk7CisJCQlxLT5idWZzW2ldLT5ib2ZmID0gUEFHRV9BTElHTihic2l6ZSkgKiBpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKIAkJY2FzZSBWNEwyX01FTU9SWV9PVkVSTEFZOgpAQCAtNDMwLDkgKzQzMCw5IEBACiAJCWNvdW50ID0gVklERU9fTUFYX0ZSQU1FOwogCXNpemUgPSAwOwogCXEtPm9wcy0+YnVmX3NldHVwKHEsICZjb3VudCwgJnNpemUpOwotCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwotCWRwcmludGsoMSwgInJlcWJ1ZnM6IGJ1ZnM9JWQsIHNpemU9MHgleCBbJWQgcGFnZXMgdG90YWxdXG4iLAotCQljb3VudCwgc2l6ZSwgKGNvdW50KnNpemUpPj5QQUdFX1NISUZUKTsKKwlkcHJpbnRrKDEsICJyZXFidWZzOiBidWZzPSVkLCBzaXplPTB4JXggWyV1IHBhZ2VzIHRvdGFsXVxuIiwKKwkJY291bnQsIHNpemUsCisJCSh1bnNpZ25lZCBpbnQpKChjb3VudCpQQUdFX0FMSUdOKHNpemUpKT4+UEFHRV9TSElGVCkgKTsKIAogCXJldHZhbCA9IF9fdmlkZW9idWZfbW1hcF9zZXR1cChxLCBjb3VudCwgc2l6ZSwgcmVxLT5tZW1vcnkpOwogCWlmIChyZXR2YWwgPCAwKSB7CkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCW1idWYtPnNpemUgICA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG1idWYtPmZyYW1lczsgaSsrKSB7CiAJCW1idWYtPm9mZnNldHNbaV0gID0gcS0+YnVmc1tpXS0+Ym9mZjsKLQkJbWJ1Zi0+c2l6ZSAgICAgICArPSBxLT5idWZzW2ldLT5ic2l6ZTsKKwkJbWJ1Zi0+c2l6ZSAgICAgICArPSBQQUdFX0FMSUdOKHEtPmJ1ZnNbaV0tPmJzaXplKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLWNvbnRpZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtY29udGlnLmMKaW5kZXggYzMwNjVjNC4uZDI1ZjI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtY29udGlnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtY29udGlnLmMKQEAgLTQyOSw3ICs0MjksNyBAQAogfTsKIAogdm9pZCB2aWRlb2J1Zl9xdWV1ZV9kbWFfY29udGlnX2luaXQoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAotCQkJCSAgICBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzICpvcHMsCisJCQkJICAgIGNvbnN0IHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgKm9wcywKIAkJCQkgICAgc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzcGlubG9ja190ICppcnFsb2NrLAogCQkJCSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCmluZGV4IDAzMmViYWUuLmZhNzg1NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYwpAQCAtNTg4LDcgKzU4OCw3IEBACiAJCQlyZXR2YWwgPSAtRUJVU1k7CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQkJc2l6ZSArPSBxLT5idWZzW2xhc3RdLT5ic2l6ZTsKKwkJc2l6ZSArPSBQQUdFX0FMSUdOKHEtPmJ1ZnNbbGFzdF0tPmJzaXplKTsKIAkJaWYgKHNpemUgPT0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCiAJCQlicmVhazsKIAl9CkBAIC02MTAsNyArNjEwLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlxLT5idWZzW2ldLT5tYXAgICA9IG1hcDsKIAkJcS0+YnVmc1tpXS0+YmFkZHIgPSB2bWEtPnZtX3N0YXJ0ICsgc2l6ZTsKLQkJc2l6ZSArPSBxLT5idWZzW2ldLT5ic2l6ZTsKKwkJc2l6ZSArPSBQQUdFX0FMSUdOKHEtPmJ1ZnNbaV0tPmJzaXplKTsKIAl9CiAKIAltYXAtPmNvdW50ICAgID0gMTsKQEAgLTcwMiw3ICs3MDIsNyBAQAogfQogCiB2b2lkIHZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoc3RydWN0IHZpZGVvYnVmX3F1ZXVlKiBxLAotCQkJIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgKm9wcywKKwkJCSBjb25zdCBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzICpvcHMsCiAJCQkgc3RydWN0IGRldmljZSAqZGV2LAogCQkJIHNwaW5sb2NrX3QgKmlycWxvY2ssCiAJCQkgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kdmIuYwppbmRleCAwZTdkY2JhLi5hNTZjZjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZHZiLmMKQEAgLTEzOSw3ICsxMzksOSBAQAogCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCiAJCQkgIGNoYXIgKmFkYXB0ZXJfbmFtZSwKIAkJCSAgc2hvcnQgKmFkYXB0ZXJfbnIsCi0JCQkgIGludCBtZmVfc2hhcmVkKQorCQkJICBpbnQgbWZlX3NoYXJlZCwKKwkJCSAgaW50ICgqZmVfaW9jdGxfb3ZlcnJpZGUpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwKKwkJCQkJdW5zaWduZWQgaW50LCB2b2lkICosIHVuc2lnbmVkIGludCkpCiB7CiAJaW50IHJlc3VsdDsKIApAQCAtMTU0LDYgKzE1Niw3IEBACiAJfQogCWZlLT5hZGFwdGVyLnByaXYgPSBhZGFwdGVyX3ByaXY7CiAJZmUtPmFkYXB0ZXIubWZlX3NoYXJlZCA9IG1mZV9zaGFyZWQ7CisJZmUtPmFkYXB0ZXIuZmVfaW9jdGxfb3ZlcnJpZGUgPSBmZV9pb2N0bF9vdmVycmlkZTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0yNTMsNyArMjU2LDkgQEAKIAkJCSAgdm9pZCAqYWRhcHRlcl9wcml2LAogCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCiAJCQkgIHNob3J0ICphZGFwdGVyX25yLAotCQkJICBpbnQgbWZlX3NoYXJlZCkKKwkJCSAgaW50IG1mZV9zaGFyZWQsCisJCQkgIGludCAoKmZlX2lvY3RsX292ZXJyaWRlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICosCisJCQkJCXVuc2lnbmVkIGludCwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICpxOwogCXN0cnVjdCB2aWRlb2J1Zl9kdmJfZnJvbnRlbmQgKmZlOwpAQCAtMjY3LDcgKzI3Miw3IEBACiAKIAkvKiBCcmluZyB1cCB0aGUgYWRhcHRlciAqLwogCXJlcyA9IHZpZGVvYnVmX2R2Yl9yZWdpc3Rlcl9hZGFwdGVyKGYsIG1vZHVsZSwgYWRhcHRlcl9wcml2LCBkZXZpY2UsCi0JCWZlLT5kdmIubmFtZSwgYWRhcHRlcl9uciwgbWZlX3NoYXJlZCk7CisJCWZlLT5kdmIubmFtZSwgYWRhcHRlcl9uciwgbWZlX3NoYXJlZCwgZmVfaW9jdGxfb3ZlcnJpZGUpOwogCWlmIChyZXMgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvYnVmX2R2Yl9yZWdpc3Rlcl9hZGFwdGVyIGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJlcyk7CiAJCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLXZtYWxsb2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtdm1hbGxvYy5jCmluZGV4IDM1ZjM5MDAuLmQ2ZTZhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtdm1hbGxvYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtdm1hbGxvYy5jCkBAIC0zOTEsOCArMzkxLDggQEAKIH07CiAKIHZvaWQgdmlkZW9idWZfcXVldWVfdm1hbGxvY19pbml0KHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSogcSwKLQkJCSBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzICpvcHMsCi0JCQkgdm9pZCAqZGV2LAorCQkJIGNvbnN0IHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgKm9wcywKKwkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgc3BpbmxvY2tfdCAqaXJxbG9jaywKIAkJCSBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSwKIAkJCSBlbnVtIHY0bDJfZmllbGQgZmllbGQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jCmluZGV4IDk3ZTBjZTIuLjMzMjA1ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jCkBAIC0zOTEsNyArMzkxLDcgQEAKIAkJezB4MGUsIDF9CiAJfTsKIAotCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPiAyKQorCWlmIChpbnB1dCA+IDIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiaW5wdXQgc3dpdGNoZWQgdG8gJXNcbiIsIGlucHV0c1tpbnB1dF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbi5oCmluZGV4IGQ0MzljNzYuLmNiMWRlN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW4uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXVuc2lnbmVkIGxvbmcganBlZ19tYXJrZXJzOwkvKiBXaGljaCBtYXJrZXJzIHNob3VsZCBnbyBpbnRvIHRoZSBKUEVHIG91dHB1dC4KIAkJCQkJICogVW5sZXNzIHlvdSBleGFjdGx5IGtub3cgd2hhdCB5b3UgZG8sIGxlYXZlIHRoZW0gdW50b3VjaGVkLgogCQkJCQkgKiBJbmx1ZGluZyBsZXNzIG1hcmtlcnMgd2lsbCBtYWtlIHRoZSByZXN1bHRpbmcgY29kZQotCQkJCQkgKiBzbWFsbGVyLCBidXQgdGhlcmUgd2lsbCBiZSBmZXdlciBhcGxpY2F0aW9ucworCQkJCQkgKiBzbWFsbGVyLCBidXQgdGhlcmUgd2lsbCBiZSBmZXdlciBhcHBsaWNhdGlvbnMKIAkJCQkJICogd2hpY2ggY2FuIHJlYWQgaXQuCiAJCQkJCSAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgQVBQIGFuZCBDT00gbWFya2VyIGlzCiAJCQkJCSAqIGluZmx1ZW5jZWQgYnkgQVBQMF9sZW4gYW5kIENPTV9sZW4gT05MWSEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jCmluZGV4IDQ3MTM3ZGUuLmU5ZjcyY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kcml2ZXIuYwpAQCAtMjc2NCw3ICsyNzY0LDcgQEAKIAlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gX19maDsKIAlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwogCi0JaWYgKGlucC0+aW5kZXggPCAwIHx8IGlucC0+aW5kZXggPj0genItPmNhcmQuaW5wdXRzKQorCWlmIChpbnAtPmluZGV4ID49IHpyLT5jYXJkLmlucHV0cykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZWxzZSB7CiAJCWludCBpZCA9IGlucC0+aW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzY0eHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCmluZGV4IDlhYWUwMTEuLjJlZjExMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCkBAIC0xMTUsNiArMTE1LDcgQEAKIAl7VVNCX0RFVklDRSgweDBhMTcsIDB4MDA0ZSksIC5kcml2ZXJfaW5mbyA9IE1FVEhPRDIgfSwKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA1ZCksIC5kcml2ZXJfaW5mbyA9IE1FVEhPRDIgfSwKIAl7VVNCX0RFVklDRSgweDA4Y2EsIDB4MjEwMiksIC5kcml2ZXJfaW5mbyA9IE1FVEhPRDIgfSwKKwl7VVNCX0RFVklDRSgweDA2ZDYsIDB4MDAzZCksIC5kcml2ZXJfaW5mbyA9IE1FVEhPRDAgfSwKIAl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCmluZGV4IDhkZDRkMjEuLmI0OTQ4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCkBAIC03Niw4ICs3Niw4IEBACiAjZGVmaW5lIENPUFlSSUdIVAkiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDggIiBNT0RVTEVBVVRIT1IKICNlbmRpZgogCi0jZGVmaW5lIE1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgkiMy4wNC4xMiIKLSNkZWZpbmUgTVBUX0xJTlVYX1BBQ0tBR0VfTkFNRQkJIkAoIyltcHRsaW51eC0zLjA0LjEyIgorI2RlZmluZSBNUFRfTElOVVhfVkVSU0lPTl9DT01NT04JIjMuMDQuMTMiCisjZGVmaW5lIE1QVF9MSU5VWF9QQUNLQUdFX05BTUUJCSJAKCMpbXB0bGludXgtMy4wNC4xMyIKICNkZWZpbmUgV0hBVF9NQUdJQ19TVFJJTkcJCSJAIiAiKCIgIiMiICIpIgogCiAjZGVmaW5lIHNob3dfbXB0bW9kX3ZlcihzLHZlcikgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCmluZGV4IDliMmUyMTkuLjM1MmFjZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYwpAQCAtNjIxLDExICs2MjEsOCBAQAogCSAqLwogCWlvY251bVggPSBraGRyLmlvY251bSAmIDB4RkY7CiAJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGlvY251bVgsICZpb2NwKSkgPCAwKSB8fAotCSAgICAoaW9jcCA9PSBOVUxMKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyBNWU5BTSAiJXM6Om1wdGN0bF9pb2N0bCgpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW1YKTsKKwkgICAgKGlvY3AgPT0gTlVMTCkpCiAJCXJldHVybiAtRU5PREVWOwotCX0KIAogCWlmICghaW9jcC0+YWN0aXZlKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHIE1ZTkFNICIlczo6bXB0Y3RsX2lvY3RsKCkgQCVkIC0gQ29udHJvbGxlciBkaXNhYmxlZC5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggYzI5NTc4Ni4uNTc3NTI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtNzkyLDExICs3OTIsMzYgQEAKIAkJCSAqICBwcmVjZWRlbmNlIQogCQkJICovCiAJCQlzYy0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzY3NpX3N0YXR1czsKLQkJCWlmIChzY3NpX3N0YXRlICYgTVBJX1NDU0lfU1RBVEVfQVVUT1NFTlNFX1ZBTElEKSB7Ci0JCQkJLyogSGF2ZSBhbHJlYWR5IHNhdmVkIHRoZSBzdGF0dXMgYW5kIHNlbnNlIGRhdGEKKwkJCWlmICghKHNjc2lfc3RhdGUgJiBNUElfU0NTSV9TVEFURV9BVVRPU0VOU0VfVkFMSUQpKSB7CisKKwkJCQkvKgorCQkJCSAqIEZvciBhbiBFcnJhdGEgb24gTFNJNTNDMTAzMAorCQkJCSAqIFdoZW4gdGhlIGxlbmd0aCBvZiByZXF1ZXN0IGRhdGEKKwkJCQkgKiBhbmQgdHJhbnNmZXIgZGF0YSBhcmUgZGlmZmVyZW50CisJCQkJICogd2l0aCByZXN1bHQgb2YgY29tbWFuZCAoUkVBRCBvciBWRVJJRlkpLAorCQkJCSAqIERJRF9TT0ZUX0VSUk9SIGlzIHNldC4KIAkJCQkgKi8KLQkJCQk7Ci0JCQl9IGVsc2UgeworCQkJCWlmIChpb2MtPmJ1c190eXBlID09IFNQSSkgeworCQkJCQlpZiAocFNjc2lSZXEtPkNEQlswXSA9PSBSRUFEXzYgIHx8CisJCQkJCSAgICBwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfMTAgfHwKKwkJCQkJICAgIHBTY3NpUmVxLT5DREJbMF0gPT0gUkVBRF8xMiB8fAorCQkJCQkgICAgcFNjc2lSZXEtPkNEQlswXSA9PSBSRUFEXzE2IHx8CisJCQkJCSAgICBwU2NzaVJlcS0+Q0RCWzBdID09IFZFUklGWSAgfHwKKwkJCQkJICAgIHBTY3NpUmVxLT5DREJbMF0gPT0gVkVSSUZZXzE2KSB7CisJCQkJCQlpZiAoc2NzaV9idWZmbGVuKHNjKSAhPQorCQkJCQkJCXhmZXJfY250KSB7CisJCQkJCQkJc2MtPnJlc3VsdCA9CisJCQkJCQkJRElEX1NPRlRfRVJST1IgPDwgMTY7CisJCQkJCQkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyYXRhIgorCQkJCQkJICAgICJvbiBMU0k1M0MxMDMwIG9jY3VycmVkLiIKKwkJCQkJCSAgICAic2MtPnJlcV9idWZmbGVuPTB4JTAyeCwiCisJCQkJCQkgICAgInhmZXJfY250PTB4JTAyeFxuIiwKKwkJCQkJCSAgICBzY3NpX2J1ZmZsZW4oc2MpLAorCQkJCQkJICAgIHhmZXJfY250KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwogCQkJCWlmICh4ZmVyX2NudCA8IHNjLT51bmRlcmZsb3cpIHsKIAkJCQkJaWYgKHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX0JVU1kpCiAJCQkJCQlzYy0+cmVzdWx0ID0gU0FNX1NUQVRfQlVTWTsKQEAgLTgzNSw3ICs4NjAsNTggQEAKIAkJCXNjLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IHNjc2lfc3RhdHVzOwogCQkJaWYgKHNjc2lfc3RhdGUgPT0gMCkgewogCQkJCTsKLQkJCX0gZWxzZSBpZiAoc2NzaV9zdGF0ZSAmIE1QSV9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9WQUxJRCkgeworCQkJfSBlbHNlIGlmIChzY3NpX3N0YXRlICYKKwkJCSAgICBNUElfU0NTSV9TVEFURV9BVVRPU0VOU0VfVkFMSUQpIHsKKworCQkJCS8qCisJCQkJICogRm9yIHBvdGVudGlhbCB0cm91YmxlIG9uIExTSTUzQzEwMzAuCisJCQkJICogKGRhdGU6MjAwNy54eC4pCisJCQkJICogSXQgaXMgY2hlY2tlZCB3aGV0aGVyIHRoZSBsZW5ndGggb2YKKwkJCQkgKiByZXF1ZXN0IGRhdGEgaXMgZXF1YWwgdG8KKwkJCQkgKiB0aGUgbGVuZ3RoIG9mIHRyYW5zZmVyIGFuZCByZXNpZHVhbC4KKwkJCQkgKiBNRURJVU1fRVJST1IgaXMgc2V0IGJ5IGluY29ycmVjdCBkYXRhLgorCQkJCSAqLworCQkJCWlmICgoaW9jLT5idXNfdHlwZSA9PSBTUEkpICYmCisJCQkJCShzYy0+c2Vuc2VfYnVmZmVyWzJdICYgMHgyMCkpIHsKKwkJCQkJdTMyCSBkaWZmdHJhbnNmZXI7CisJCQkJCWRpZmZ0cmFuc2ZlciA9CisJCQkJCXNjLT5zZW5zZV9idWZmZXJbM10gPDwgMjQgfAorCQkJCQlzYy0+c2Vuc2VfYnVmZmVyWzRdIDw8IDE2IHwKKwkJCQkJc2MtPnNlbnNlX2J1ZmZlcls1XSA8PCA4IHwKKwkJCQkJc2MtPnNlbnNlX2J1ZmZlcls2XTsKKwkJCQkJaWYgKCgoc2MtPnNlbnNlX2J1ZmZlclszXSAmIDB4ODApID09CisJCQkJCQkweDgwKSAmJiAoc2NzaV9idWZmbGVuKHNjKQorCQkJCQkJIT0geGZlcl9jbnQpKSB7CisJCQkJCQlzYy0+c2Vuc2VfYnVmZmVyWzJdID0KKwkJCQkJCSAgICBNRURJVU1fRVJST1I7CisJCQkJCQlzYy0+c2Vuc2VfYnVmZmVyWzEyXSA9IDB4ZmY7CisJCQkJCQlzYy0+c2Vuc2VfYnVmZmVyWzEzXSA9IDB4ZmY7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIkVycmF0YSIKKwkJCQkJCSJvbiBMU0k1M0MxMDMwIG9jY3VycmVkLiIKKwkJCQkJCSJzYy0+cmVxX2J1ZmZsZW49MHglMDJ4LCIKKwkJCQkJCSJ4ZmVyX2NudD0weCUwMnhcbiIgLAorCQkJCQkJc2NzaV9idWZmbGVuKHNjKSwKKwkJCQkJCXhmZXJfY250KTsKKwkJCQkJfQorCQkJCQlpZiAoKChzYy0+c2Vuc2VfYnVmZmVyWzNdICYgMHg4MCkKKwkJCQkJCSE9IDB4ODApICYmCisJCQkJCQkoc2NzaV9idWZmbGVuKHNjKSAhPQorCQkJCQkJeGZlcl9jbnQgKyBkaWZmdHJhbnNmZXIpKSB7CisJCQkJCQlzYy0+c2Vuc2VfYnVmZmVyWzJdID0KKwkJCQkJCQlNRURJVU1fRVJST1I7CisJCQkJCQlzYy0+c2Vuc2VfYnVmZmVyWzEyXSA9IDB4ZmY7CisJCQkJCQlzYy0+c2Vuc2VfYnVmZmVyWzEzXSA9IDB4ZmY7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCQkiRXJyYXRhIG9uIExTSTUzQzEwMzAgb2NjdXJyZWQiCisJCQkJCQkic2MtPnJlcV9idWZmbGVuPTB4JTAyeCwiCisJCQkJCQkiIHhmZXJfY250PTB4JTAyeCwiCisJCQkJCQkiZGlmZnRyYW5zZmVyPTB4JTAyeFxuIiwKKwkJCQkJCXNjc2lfYnVmZmxlbihzYyksCisJCQkJCQl4ZmVyX2NudCwKKwkJCQkJCWRpZmZ0cmFuc2Zlcik7CisJCQkJCX0KKwkJCQl9CisKIAkJCQkvKgogCQkJCSAqIElmIHJ1bm5pbmcgYWdhaW5zdCBjaXJjYSAyMDAwMDNkZCA5MDkgTVBUIGYvdywKIAkJCQkgKiBtYXkgZ2V0IHRoaXMgKEFVVE9TRU5TRV9WQUxJRCkgZm9yIGFjdHVhbCBUQVNLX1NFVF9GVUxMCkBAIC0yMjc1LDExICsyMzUxLDEyIEBACiAgKgltcHRzY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGggLSBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IGEgZGV2aWNlcyBxdWV1ZSBkZXB0aAogICoJQHNkZXY6IHBlciBzY3NpX2RldmljZSBwb2ludGVyCiAgKglAcWRlcHRoOiByZXF1ZXN0ZWQgcXVldWUgZGVwdGgKKyAqCUByZWFzb246IGNhbGxpbmcgY29udGV4dAogICoKICAqCUFkZGluZyBzdXBwb3J0IGZvciBuZXcgJ2NoYW5nZV9xdWV1ZV9kZXB0aCcgYXBpLgogKi8KIGludAotbXB0c2NzaWhfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKK21wdHNjc2loX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgsIGludCByZWFzb24pCiB7CiAJTVBUX1NDU0lfSE9TVAkJKmhkID0gc2hvc3RfcHJpdihzZGV2LT5ob3N0KTsKIAlWaXJ0VGFyZ2V0IAkJKnZ0YXJnZXQ7CkBAIC0yMjkxLDYgKzIzNjgsOSBAQAogCXN0YXJnZXQgPSBzY3NpX3RhcmdldChzZGV2KTsKIAl2dGFyZ2V0ID0gc3RhcmdldC0+aG9zdGRhdGE7CiAKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChpb2MtPmJ1c190eXBlID09IFNQSSkgewogCQlpZiAoISh2dGFyZ2V0LT50ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1FfWUVTKSkKIAkJCW1heF9kZXB0aCA9IDE7CkBAIC0yMzU3LDcgKzI0MzcsOCBAQAogCQkgICAgaW9jLT5uYW1lLCB2dGFyZ2V0LT5uZWdvRmxhZ3MsIHZ0YXJnZXQtPm1heE9mZnNldCwKIAkJICAgIHZ0YXJnZXQtPm1pblN5bmNGYWN0b3IpKTsKIAotCW1wdHNjc2loX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LCBNUFRfU0NTSV9DTURfUEVSX0RFVl9ISUdIKTsKKwltcHRzY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwgTVBUX1NDU0lfQ01EX1BFUl9ERVZfSElHSCwKKwkJCQkgICAgU0NTSV9RREVQVEhfREVGQVVMVCk7CiAJZHNwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJInRhZ2dlZCAlZCwgc2ltcGxlICVkLCBvcmRlcmVkICVkXG4iLAogCQlpb2MtPm5hbWUsc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCwgc2Rldi0+c2ltcGxlX3RhZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmgKaW5kZXggZTBiMzNlMC4uNDVhNWZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaApAQCAtMTI4LDcgKzEyOCw4IEBACiBleHRlcm4gaW50IG1wdHNjc2loX3NjYW5kdl9jb21wbGV0ZShNUFRfQURBUFRFUiAqaW9jLCBNUFRfRlJBTUVfSERSICptZiwgTVBUX0ZSQU1FX0hEUiAqcik7CiBleHRlcm4gaW50IG1wdHNjc2loX2V2ZW50X3Byb2Nlc3MoTVBUX0FEQVBURVIgKmlvYywgRXZlbnROb3RpZmljYXRpb25SZXBseV90ICpwRXZSZXBseSk7CiBleHRlcm4gaW50IG1wdHNjc2loX2lvY19yZXNldChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9zdF9yZXNldCk7Ci1leHRlcm4gaW50IG1wdHNjc2loX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgpOworZXh0ZXJuIGludCBtcHRzY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcWRlcHRoLAorCQkJCSAgICAgICBpbnQgcmVhc29uKTsKIGV4dGVybiB1OCBtcHRzY3NpaF9yYWlkX2lkX3RvX251bShNUFRfQURBUFRFUiAqaW9jLCB1OCBjaGFubmVsLCB1OCBpZCk7CiBleHRlcm4gaW50IG1wdHNjc2loX2lzX3BoeXNfZGlzayhNUFRfQURBUFRFUiAqaW9jLCB1OCBjaGFubmVsLCB1OCBpZCk7CiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1wdHNjc2loX2hvc3RfYXR0cnNbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCmluZGV4IGQ1MDViNjguLmUzOTk4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwpAQCAtOTQwLDcgKzk0MCw3IEBACiAgKglBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpMm9fYmxvY2tfZGV2aWNlIHN0cnVjdCwgZ2VuZGlzayBhbmQgcmVxdWVzdAogICoJcXVldWUgYW5kIGluaXRpYWxpemUgdGhlbSBhcyBmYXIgYXMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQuCiAgKgotICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBJMk8gQmxvY2sgZGV2aWNlIG9uIHN1Y2NlcyBvciBhCisgKglSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIEkyTyBCbG9jayBkZXZpY2Ugb24gc3VjY2VzcyBvciBhCiAgKgluZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsb2NrX2RldmljZV9hbGxvYyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKaW5kZXggMjdjZjRhZi4uZTVhYjYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCkBAIC0xMzIsNyArMTMyLDcgQEAKICAqCVJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIHBvaW50ZXIgZnJvbSB0aGUgY29udGV4dCBsaXN0IGFuZCByZXR1cm5zCiAgKgl0aGUgbWF0Y2hpbmcgY29udGV4dCBpZC4KICAqCi0gKglSZXR1cm5zIGNvbnRleHQgaWQgb24gc3VjY2VzIG9yIDAgb24gZmFpbHVyZS4KKyAqCVJldHVybnMgY29udGV4dCBpZCBvbiBzdWNjZXNzIG9yIDAgb24gZmFpbHVyZS4KICAqLwogdTMyIGkyb19jbnR4dF9saXN0X3JlbW92ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKiBjLCB2b2lkICpwdHIpCiB7CkBAIC0xOTgsNyArMTk4LDcgQEAKICAqCUBjOiBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBjb250ZXh0IGxpc3QgYmVsb25nCiAgKglAcHRyOiBwb2ludGVyIHRvIHdoaWNoIHRoZSBjb250ZXh0IGlkIHNob3VsZCBiZSBmZXRjaGVkCiAgKgotICoJUmV0dXJucyBjb250ZXh0IGlkIHdoaWNoIG1hdGNoZXMgdG8gdGhlIHBvaW50ZXIgb24gc3VjY2VzIG9yIDAgb24KKyAqCVJldHVybnMgY29udGV4dCBpZCB3aGljaCBtYXRjaGVzIHRvIHRoZSBwb2ludGVyIG9uIHN1Y2Nlc3Mgb3IgMCBvbgogICoJZmFpbHVyZS4KICAqLwogdTMyIGkyb19jbnR4dF9saXN0X2dldF9wdHIoc3RydWN0IGkyb19jb250cm9sbGVyICogYywgdm9pZCAqcHRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKaW5kZXggMDhmMmQwNy4uYTI5NmU3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21mZC9LY29uZmlnCkBAIC0zNSw2ICszNSwxNCBAQAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEFTSUMzIG11bHRpZnVuY3Rpb24gY2hpcCBmb3VuZCBvbiBtYW55CiAJICBQREFzIChtYWlubHkgaVBBUSBhbmQgSFRDIGJhc2VkIG9uZXMpCiAKK2NvbmZpZyBNRkRfU0hfTU9CSUxFX1NESEkKKwlib29sICJTdXBwb3J0IGZvciBTdXBlckggTW9iaWxlIFNESEkiCisJZGVwZW5kcyBvbiBTVVBFUkgKKwlzZWxlY3QgTUZEX0NPUkUKKwkgLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFNESEkgaGFyZHdhcmUgYmxvY2sgZm91bmQgaW4gbWFueQorCSAgU3VwZXJIIE1vYmlsZSBTb0NzLgorCiBjb25maWcgTUZEX0RNMzU1RVZNX01TUAogCWJvb2wgIkRhVmluY2kgRE0zNTUgRVZNIG1pY3JvY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBNQUNIX0RBVklOQ0lfRE0zNTVfRVZNCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IGFmMGZjOTAuLjExMzUwYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfTUZEX1NNNTAxKQkJKz0gc201MDEubwogb2JqLSQoQ09ORklHX01GRF9BU0lDMykJCSs9IGFzaWMzLm8KK29iai0kKENPTkZJR19NRkRfU0hfTU9CSUxFX1NESEkpCQkrPSBzaF9tb2JpbGVfc2RoaS5vCiAKIG9iai0kKENPTkZJR19IVENfRUdQSU8pCQkrPSBodGMtZWdwaW8ubwogb2JqLSQoQ09ORklHX0hUQ19QQVNJQzMpCSs9IGh0Yy1wYXNpYzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc2hfbW9iaWxlX3NkaGkuYyBiL2RyaXZlcnMvbWZkL3NoX21vYmlsZV9zZGhpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlZmFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3NoX21vYmlsZV9zZGhpLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBTdXBlckggTW9iaWxlIFNESEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFnbnVzIERhbW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEJhc2VkIG9uICJDb21wYXEgQVNJQzMgc3VwcG9ydCI6CisgKgorICogQ29weXJpZ2h0IDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBQaGlsIEJsdW5kZWxsCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IE9wZW5lZEhhbmQgTHRkLgorICoKKyAqIEF1dGhvcnM6IFBoaWwgQmx1bmRlbGwgPHBiQGhhbmRoZWxkcy5vcmc+LAorICoJICAgIFNhbXVlbCBPcnRpeiA8c2FtZW9Ab3BlbmVkaGFuZC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RtaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2hfbW9iaWxlX3NkaGkuaD4KKworc3RydWN0IHNoX21vYmlsZV9zZGhpIHsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IHRtaW9fbW1jX2RhdGEgbW1jX2RhdGE7CisJc3RydWN0IG1mZF9jZWxsIGNlbGxfbW1jOworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaF9tb2JpbGVfc2RoaV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4MDAwLAorCQkuZW5kICAgPSAweDFmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IDAsCisJCS5lbmQgICA9IDAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHNoX21vYmlsZV9zZGhpX2NlbGwgPSB7CisJLm5hbWUgICAgICAgICAgPSAidG1pby1tbWMiLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShzaF9tb2JpbGVfc2RoaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZXMgICAgID0gc2hfbW9iaWxlX3NkaGlfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHZvaWQgc2hfbW9iaWxlX3NkaGlfc2V0X3B3cihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0bWlvLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZSh0bWlvLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyAqcCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKHAgJiYgcC0+c2V0X3B3cikKKwkJcC0+c2V0X3B3cihwZGV2LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNoX21vYmlsZV9zZGhpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNoX21vYmlsZV9zZGhpICpwcml2OworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCWNoYXIgY2xrX25hbWVbOF07CisJaW50IHJldCwgaXJxOworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyBNRU0gcmVzb3VyY2VcbiIpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyBJUlEgcmVzb3VyY2VcbiIpOworCisJaWYgKCFtZW0gfHwgKGlycSA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImt6YWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICJzZGhpJWQiLCBwZGV2LT5pZCk7CisJcHJpdi0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBjbGtfbmFtZSk7CisJaWYgKElTX0VSUihwcml2LT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgY2xvY2sgXCIlc1wiXG4iLCBjbGtfbmFtZSk7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+Y2xrKTsKKwkJa2ZyZWUocHJpdik7CisJCXJldHVybiByZXQ7CisJfQorCisJY2xrX2VuYWJsZShwcml2LT5jbGspOworCisJLyogRklYTUU6IHNpbGx5IGNvbnN0IHVuc2lnbmVkIGludCBoY2xrICovCisJKih1bnNpZ25lZCBpbnQgKikmcHJpdi0+bW1jX2RhdGEuaGNsayA9IGNsa19nZXRfcmF0ZShwcml2LT5jbGspOworCXByaXYtPm1tY19kYXRhLnNldF9wd3IgPSBzaF9tb2JpbGVfc2RoaV9zZXRfcHdyOworCisJbWVtY3B5KCZwcml2LT5jZWxsX21tYywgJnNoX21vYmlsZV9zZGhpX2NlbGwsIHNpemVvZihwcml2LT5jZWxsX21tYykpOworCXByaXYtPmNlbGxfbW1jLmRyaXZlcl9kYXRhID0gJnByaXYtPm1tY19kYXRhOworCXByaXYtPmNlbGxfbW1jLnBsYXRmb3JtX2RhdGEgPSAmcHJpdi0+Y2VsbF9tbWM7CisJcHJpdi0+Y2VsbF9tbWMuZGF0YV9zaXplID0gc2l6ZW9mKHByaXYtPmNlbGxfbW1jKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKCZwZGV2LT5kZXYsIHBkZXYtPmlkLAorCQkJICAgICAgJnByaXYtPmNlbGxfbW1jLCAxLCBtZW0sIGlycSk7CisJaWYgKHJldCkgeworCQljbGtfZGlzYWJsZShwcml2LT5jbGspOworCQljbGtfcHV0KHByaXYtPmNsayk7CisJCWtmcmVlKHByaXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX3NkaGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNoX21vYmlsZV9zZGhpICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwltZmRfcmVtb3ZlX2RldmljZXMoJnBkZXYtPmRldik7CisJY2xrX2Rpc2FibGUocHJpdi0+Y2xrKTsKKwljbGtfcHV0KHByaXYtPmNsayk7CisJa2ZyZWUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2hfbW9iaWxlX3NkaGlfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzaF9tb2JpbGVfc2RoaSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNoX21vYmlsZV9zZGhpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2hfbW9iaWxlX3NkaGlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoX21vYmlsZV9zZGhpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF9tb2JpbGVfc2RoaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2hfbW9iaWxlX3NkaGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF9tb2JpbGVfc2RoaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzaF9tb2JpbGVfc2RoaV9pbml0KTsKK21vZHVsZV9leGl0KHNoX21vYmlsZV9zZGhpX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVySCBNb2JpbGUgU0RISSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxNDAwX2NvcmUuYyBiL2RyaXZlcnMvbWZkL3VjYjE0MDBfY29yZS5jCmluZGV4IGZhMjk0YjYuLjg1ZmQ5NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3VjYjE0MDBfY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3VjYjE0MDBfY29yZS5jCkBAIC01MSw2ICs1MSw3IEBACiAJc3RydWN0IHVjYjE0MDBfdHMgdWNiX3RzOwogCXN0cnVjdCB1Y2IxNDAwX2dwaW8gdWNiX2dwaW87CiAJc3RydWN0IHNuZF9hYzk3ICphYzk3OworCXN0cnVjdCB1Y2IxNDAwX3BkYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAogCW1lbXNldCgmdWNiX3RzLCAwLCBzaXplb2YodWNiX3RzKSk7CiAJbWVtc2V0KCZ1Y2JfZ3BpbywgMCwgc2l6ZW9mKHVjYl9ncGlvKSk7CkBAIC04OCw2ICs4OSwxMiBAQAogCiAJLyogVE9VQ0hTQ1JFRU4gKi8KIAl1Y2JfdHMuYWM5NyA9IGFjOTc7CisKKwlpZiAocGRhdGEgIT0gTlVMTCAmJiBwZGF0YS0+aXJxID49IDApCisJCXVjYl90cy5pcnEgPSBwZGF0YS0+aXJxOworCWVsc2UKKwkJdWNiX3RzLmlycSA9IC0xOworCiAJdWNiLT51Y2IxNDAwX3RzID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ1Y2IxNDAwX3RzIiwgLTEpOwogCWlmICghdWNiLT51Y2IxNDAwX3RzKSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVmaWxlLmMgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVmaWxlLmMKaW5kZXggNDFjOGZlMi4uY2U1ZWRhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmlsZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZpbGUuYwpAQCAtOTIsNyArOTIsNyBAQAogLyoKICAqIGdydV9maWxlX21tYXAKICAqCi0gKiBDYWxsZWQgd2hlbiBtbWFwaW5nIHRoZSBkZXZpY2UuICBJbml0aWFsaXplcyB0aGUgdm1hIHdpdGggYSBmYXVsdCBoYW5kbGVyCisgKiBDYWxsZWQgd2hlbiBtbWFwcGluZyB0aGUgZGV2aWNlLiAgSW5pdGlhbGl6ZXMgdGhlIHZtYSB3aXRoIGEgZmF1bHQgaGFuZGxlcgogICogYW5kIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFsbG9jYXRlLCB0cmFjaywgYW5kIGZyZWUgdGhlCiAgKiB1bmRlcmx5aW5nIHBhZ2VzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL3NkaW9fdWFydC5jIGIvZHJpdmVycy9tbWMvY2FyZC9zZGlvX3VhcnQuYwppbmRleCAzNmE4ZDUzLi5iOGU3YzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3NkaW9fdWFydC5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvc2Rpb191YXJ0LmMKQEAgLTIzMSw3ICsyMzEsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNkaW9fdWFydF93cml0ZV9tY3RybChzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKK3N0YXRpYyB2b2lkIHNkaW9fdWFydF93cml0ZV9tY3RybChzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQsCisJCQkJICB1bnNpZ25lZCBpbnQgbWN0cmwpCiB7CiAJdW5zaWduZWQgY2hhciBtY3IgPSAwOwogCkBAIC0zODcsNyArMzg4LDggQEAKIAlzZGlvX291dChwb3J0LCBVQVJUX0lFUiwgcG9ydC0+aWVyKTsKIH0KIAotc3RhdGljIHZvaWQgc2Rpb191YXJ0X3JlY2VpdmVfY2hhcnMoc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgKnN0YXR1cykKK3N0YXRpYyB2b2lkIHNkaW9fdWFydF9yZWNlaXZlX2NoYXJzKHN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpzdGF0dXMpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKIAl1bnNpZ25lZCBpbnQgY2gsIGZsYWc7CkBAIC0zOTksNyArNDAxLDcgQEAKIAkJcG9ydC0+aWNvdW50LnJ4Kys7CiAKIAkJaWYgKHVubGlrZWx5KCpzdGF0dXMgJiAoVUFSVF9MU1JfQkkgfCBVQVJUX0xTUl9QRSB8Ci0JCQkJICAgICAgICBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX09FKSkpIHsKKwkJCQkJVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9PRSkpKSB7CiAJCQkvKgogCQkJICogRm9yIHN0YXRpc3RpY3Mgb25seQogCQkJICovCkBAIC00MTcsOSArNDE5LDkgQEAKIAkJCSAqIE1hc2sgb2ZmIGNvbmRpdGlvbnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQuCiAJCQkgKi8KIAkJCSpzdGF0dXMgJj0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKLQkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfQkkpIHsKKwkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfQkkpCiAJCQkJZmxhZyA9IFRUWV9CUkVBSzsKLQkJCX0gZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX1BFKQorCQkJZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX1BFKQogCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwogCQkJZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX0ZFKQogCQkJCWZsYWcgPSBUVFlfRlJBTUU7CkBAIC01NzQsNyArNTc2LDcgQEAKIAkgKi8KIAlzZGlvX291dChwb3J0LCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pOwogCXNkaW9fb3V0KHBvcnQsIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8Ci0JCQlVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCk7CisJCSAgICAgICBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCk7CiAJc2Rpb19vdXQocG9ydCwgVUFSVF9GQ1IsIDApOwogCiAJLyoKQEAgLTYzNSw3ICs2MzcsNyBAQAogCWlmIChwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkKIAkJc2Rpb191YXJ0X2NsZWFyX21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7CiAKLQkgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gdGhpcyBwb3J0ICovCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gdGhpcyBwb3J0ICovCiAJc2Rpb19yZWxlYXNlX2lycShwb3J0LT5mdW5jKTsKIAlwb3J0LT5pZXIgPSAwOwogCXNkaW9fb3V0KHBvcnQsIFVBUlRfSUVSLCAwKTsKQEAgLTY1OSw3ICs2NjEsNyBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwb3J0LT54bWl0LmJ1Zik7CiB9CiAKLXN0YXRpYyBpbnQgc2Rpb191YXJ0X29wZW4gKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgc2Rpb191YXJ0X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0OwogCWludCByZXQ7CkBAIC04NDYsNyArODQ4LDcgQEAKIAlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGludCBjZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgICAoKGlmbGFnKSAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQorI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKChpZmxhZykgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKIAogCWlmICgoY2ZsYWcgXiBvbGRfdGVybWlvcy0+Y19jZmxhZykgPT0gMCAmJgogCSAgICBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcgXiBvbGRfdGVybWlvcy0+Y19pZmxhZykgPT0gMCkKQEAgLTkyNSw3ICs5MjcsNyBAQAogCXN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9c2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCk7CisJcmVzdWx0ID0gc2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCk7CiAJaWYoIXJlc3VsdCkgewogCQlzZGlvX3VhcnRfdXBkYXRlX21jdHJsKHBvcnQsIHNldCwgY2xlYXIpOwogCQlzZGlvX3VhcnRfcmVsZWFzZV9mdW5jKHBvcnQpOwpAQCAtOTQ2LDMxICs5NDgsMzEgQEAKIAkJCXNlcV9wcmludGYobSwgIiVkOiB1YXJ0OlNESU8iLCBpKTsKIAkJCWlmKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKIAkJCQlzZXFfcHJpbnRmKG0sICIgdHg6JWQgcng6JWQiLAotCQkJCQkgICAgICAgcG9ydC0+aWNvdW50LnR4LCBwb3J0LT5pY291bnQucngpOworCQkJCQkgICAgICBwb3J0LT5pY291bnQudHgsIHBvcnQtPmljb3VudC5yeCk7CiAJCQkJaWYgKHBvcnQtPmljb3VudC5mcmFtZSkKIAkJCQkJc2VxX3ByaW50ZihtLCAiIGZlOiVkIiwKLQkJCQkJCSAgICAgICBwb3J0LT5pY291bnQuZnJhbWUpOworCQkJCQkJICAgICAgcG9ydC0+aWNvdW50LmZyYW1lKTsKIAkJCQlpZiAocG9ydC0+aWNvdW50LnBhcml0eSkKIAkJCQkJc2VxX3ByaW50ZihtLCAiIHBlOiVkIiwKLQkJCQkJCSAgICAgICBwb3J0LT5pY291bnQucGFyaXR5KTsKKwkJCQkJCSAgICAgIHBvcnQtPmljb3VudC5wYXJpdHkpOwogCQkJCWlmIChwb3J0LT5pY291bnQuYnJrKQogCQkJCQlzZXFfcHJpbnRmKG0sICIgYnJrOiVkIiwKLQkJCQkJCSAgICAgICBwb3J0LT5pY291bnQuYnJrKTsKKwkJCQkJCSAgICAgIHBvcnQtPmljb3VudC5icmspOwogCQkJCWlmIChwb3J0LT5pY291bnQub3ZlcnJ1bikKIAkJCQkJc2VxX3ByaW50ZihtLCAiIG9lOiVkIiwKLQkJCQkJCSAgICAgICBwb3J0LT5pY291bnQub3ZlcnJ1bik7CisJCQkJCQkgICAgICBwb3J0LT5pY291bnQub3ZlcnJ1bik7CiAJCQkJaWYgKHBvcnQtPmljb3VudC5jdHMpCiAJCQkJCXNlcV9wcmludGYobSwgIiBjdHM6JWQiLAotCQkJCQkJICAgICAgIHBvcnQtPmljb3VudC5jdHMpOworCQkJCQkJICAgICAgcG9ydC0+aWNvdW50LmN0cyk7CiAJCQkJaWYgKHBvcnQtPmljb3VudC5kc3IpCiAJCQkJCXNlcV9wcmludGYobSwgIiBkc3I6JWQiLAotCQkJCQkJICAgICAgIHBvcnQtPmljb3VudC5kc3IpOworCQkJCQkJICAgICAgcG9ydC0+aWNvdW50LmRzcik7CiAJCQkJaWYgKHBvcnQtPmljb3VudC5ybmcpCiAJCQkJCXNlcV9wcmludGYobSwgIiBybmc6JWQiLAotCQkJCQkJICAgICAgIHBvcnQtPmljb3VudC5ybmcpOworCQkJCQkJICAgICAgcG9ydC0+aWNvdW50LnJuZyk7CiAJCQkJaWYgKHBvcnQtPmljb3VudC5kY2QpCiAJCQkJCXNlcV9wcmludGYobSwgIiBkY2Q6JWQiLAotCQkJCQkJICAgICAgIHBvcnQtPmljb3VudC5kY2QpOworCQkJCQkJICAgICAgcG9ydC0+aWNvdW50LmRjZCk7CiAJCQl9CiAJCQlzZGlvX3VhcnRfcG9ydF9wdXQocG9ydCk7CiAJCQlzZXFfcHV0YyhtLCAnXG4nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwppbmRleCA0MzJhZTgzLi5lMDRiNzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCkBAIC0zMjksNyArMzI5LDcgQEAKIAogY29uZmlnIE1NQ19UTUlPCiAJdHJpc3RhdGUgIlRvc2hpYmEgTW9iaWxlIElPIENvbnRyb2xsZXIgKFRNSU8pIE1NQy9TRCBmdW5jdGlvbiBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUZEX1RNSU8gfHwgTUZEX0FTSUMzCisJZGVwZW5kcyBvbiBNRkRfVE1JTyB8fCBNRkRfQVNJQzMgfHwgU1VQRVJICiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgU0QvTU1DIGNlbGwgZm91bmQgaW4gVEM2MzkzWEIsCiAJICBUN0w2NlhCIGFuZCBhbHNvIEhUQyBBU0lDMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvczNjbWNpLmMKaW5kZXggOTliNzRhMy4uOTQxYTRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5jCkBAIC0xMzYwLDcgKzEzNjAsNyBAQAogCiBzdGF0aWMgc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhIHMzY21jaV9kZWZfcGRhdGEgPSB7CiAJLyogVGhpcyBpcyBjdXJyZW50bHkgaGVyZSB0byBhdm9pZCBhIG51bWJlciBvZiBpZiAoaG9zdC0+cGRhdGEpCi0JICogY2hlY2tzLiBBbnkgemVybyBmaWVsZHMgdG8gZW5zdXJlIHJlYW9uYWJsZSBkZWZhdWx0cyBhcmUgcGlja2VkLiAqLworCSAqIGNoZWNrcy4gQW55IHplcm8gZmllbGRzIHRvIGVuc3VyZSByZWFzb25hYmxlIGRlZmF1bHRzIGFyZSBwaWNrZWQuICovCiB9OwogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZwppbmRleCA5NDA4MDk5Li4zNWM2YTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGRyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKLQogbWVudSAiUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBNVEQhPW4KIApAQCAtMjQyLDQgKzI0MCwzIEBACiAJICB0aGVuIHNheSBOLgogCiBlbmRtZW51Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZwppbmRleCBjMjIyNTE0Li4zNTA4MWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBkcml2ZXJzL210ZC9tYXBzL0tjb25maWcKLQogbWVudSAiU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzIgogCWRlcGVuZHMgb24gTVREIT1uCiAKQEAgLTMwOCw0ICszMDYsMyBAQAogCSAgeW91IGhhdmUgbWFuYWdlZCB0byB3aXBlIHRoZSBmaXJzdCBibG9jay4KIAogZW5kbWVudQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL3NscmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3NscmFtLmMKaW5kZXggM2FhMDVjZC4uNTkyMDE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9zbHJhbS5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvc2xyYW0uYwpAQCAtMTgsNyArMTgsNyBAQAogICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgdGhlIG9mZnNldCBpbnN0ZWFkIG9mIHRoZSBhYnNvbHV0ZSBhZGRyZXNzCiAKICAgTk9URToKLSAgV2l0aCBzbHJhbSBpdCdzIG9ubHkgcG9zc2libGUgdG8gbWFwIGEgY29udGlnb3VzIG1lbW9yeSByZWdpb24uIFRoZXJmb3JlCisgIFdpdGggc2xyYW0gaXQncyBvbmx5IHBvc3NpYmxlIHRvIG1hcCBhIGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbi4gVGhlcmVmb3JlCiAgIGlmIHRoZXJlJ3MgYSBkZXZpY2UgbWFwcGVkIHNvbWV3aGVyZSBpbiB0aGUgcmVnaW9uIHNwZWNpZmllZCBzbHJhbSB3aWxsCiAgIGZhaWwgdG8gbG9hZCAoc2VlIGtlcm5lbCBsb2cgaWYgbW9kcHJvYmUgZmFpbHMpLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9scGRkci9LY29uZmlnIGIvZHJpdmVycy9tdGQvbHBkZHIvS2NvbmZpZwppbmRleCA1YTQwMWQ4Li4yNjVmOTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9scGRkci9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL2xwZGRyL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGRyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKLQogbWVudSAiTFBERFIgZmxhc2ggbWVtb3J5IGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBNVEQhPW4KIApAQCAtMjAsNCArMTgsMyBAQAogCSAgICBmYW1pbGllcyBvZiBkZXZpY2VzLiBUaGlzIHNlcnZlcyBzaW1pbGFyIHB1cnBvc2Ugb2YgQ0ZJIG9uIGxlZ2FjeQogCSAgICBGbGFzaCBwcm9kdWN0cwogZW5kbWVudQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKaW5kZXggMTRiZTA3NS4uODQ3ZTIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLSMgZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCi0KIG1lbnUgIk1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MiCiAJZGVwZW5kcyBvbiBNVEQhPW4KIApAQCAtMzg5LDkgKzM4Nyw5IEBACiAJZGVwZW5kcyBvbiBNVERfQ0ZJICYmIE1URF9DT01QTEVYX01BUFBJTkdTICYmIEFSQ0hfSVhQMjAwMAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBNVEQgYWNjZXNzIHRvIGZsYXNoIGRldmljZXMgb24gcGxhdGZvcm1zIGJhc2VkCi0JICBvbiBJbnRlbCdzIElYUDIwMDAgZmFtaWx5IG9mIG5ldHdvcmsgcHJvY2Vzc29ycyBzdWNoIGFzIHRoZQotCSAgSVhEUDQyNSBhbmQgQ295b3RlLiBJZiB5b3UgaGF2ZSBhbiBJWFAyMDAwIGJhc2VkIGJvYXJkIGFuZAotCSAgd291bGQgbGlrZSB0byB1c2UgdGhlIGZsYXNoIGNoaXBzIG9uIGl0LCBzYXkgJ1knLgorCSAgb24gSW50ZWwncyBJWFAyMDAwIGZhbWlseSBvZiBuZXR3b3JrIHByb2Nlc3NvcnMuIElmIHlvdSBoYXZlIGFuCisJICBJWFAyMDAwIGJhc2VkIGJvYXJkIGFuZCB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgZmxhc2ggY2hpcHMgb24gaXQsCisJICBzYXkgJ1knLgogCiBjb25maWcgTVREX0ZPUlRVTkVUCiAJdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIHRoZSBGb3J0dU5ldCBib2FyZCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwppbmRleCA4ZjhlODdiLi4wZTM1ZTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotIyBkcml2ZXJzL210ZC9uYW5kL0tjb25maWcKLQogbWVudWNvbmZpZyBNVERfTkFORAogCXRyaXN0YXRlICJOQU5EIERldmljZSBTdXBwb3J0IgogCWRlcGVuZHMgb24gTVRECmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYyBiL2RyaXZlcnMvbXRkL25hbmQvZGlza29uY2hpcC5jCmluZGV4IGU1MWMxZWQ3Li5iMTI2Y2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIH07CiAKIC8qIEZpbmQgdGhlIChJKU5GVEwgTWVkaWEgSGVhZGVyLCBhbmQgb3B0aW9uYWxseSBhbHNvIHRoZSBtaXJyb3IgbWVkaWEgaGVhZGVyLgotICAgT24gc3VjZXNzZnVsIHJldHVybiwgYnVmIHdpbGwgY29udGFpbiBhIGNvcHkgb2YgdGhlIG1lZGlhIGhlYWRlciBmb3IKKyAgIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBidWYgd2lsbCBjb250YWluIGEgY29weSBvZiB0aGUgbWVkaWEgaGVhZGVyIGZvcgogICAgZnVydGhlciBwcm9jZXNzaW5nLiAgaWQgaXMgdGhlIHN0cmluZyB0byBzY2FuIGZvciwgYW5kIHdpbGwgcHJlc3VtYWJseSBiZQogICAgZWl0aGVyICJBTkFORCIgb3IgIkJOQU5EIi4gIElmIGZpbmRtaXJyb3I9MSwgYWxzbyBsb29rIGZvciB0aGUgbWlycm9yIG1lZGlhCiAgICBoZWFkZXIuICBUaGUgcGFnZSAjcyBvZiB0aGUgZm91bmQgbWVkaWEgaGVhZGVycyBhcmUgcGxhY2VkIGluIG1oMF9wYWdlIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2VjYy5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2VjYy5jCmluZGV4IGRiN2FlOWQuLjkyMzIwYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9lY2MuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfZWNjLmMKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCQkgKgogCQkgKiBUaGUgYjIgc2hpZnQgaXMgdGhlcmUgdG8gZ2V0IHJpZCBvZiB0aGUgbG93ZXN0IHR3byBiaXRzLgogCQkgKiBXZSBjb3VsZCBhbHNvIGRvIGFkZHJlc3NiaXRzW2IyXSA+PiAxIGJ1dCBmb3IgdGhlCi0JCSAqIHBlcmZvcm1hY2UgaXQgZG9lcyBub3QgbWFrZSBhbnkgZGlmZmVyZW5jZQorCQkgKiBwZXJmb3JtYW5jZSBpdCBkb2VzIG5vdCBtYWtlIGFueSBkaWZmZXJlbmNlCiAJCSAqLwogCQlpZiAoZWNjc2l6ZV9tdWx0ID09IDEpCiAJCQlieXRlX2FkZHIgPSAoYWRkcmVzc2JpdHNbYjFdIDw8IDQpICsgYWRkcmVzc2JpdHNbYjBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwppbmRleCAxMWRjN2U2Li42OGI1YjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwpAQCAtODc1LDcgKzg3NSw3IEBACiAgKiBAaW5mbzogVGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UuCiAgKiBAbm10ZDogVGhlIGRyaXZlciB2ZXJzaW9uIG9mIHRoZSBNVEQgaW5zdGFuY2UuCiAgKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciB0aGUgY2hpcCBwcm9iZSBoYXMgc3VjY2VzZnVsbHkgY29tcGxldGVkCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIHRoZSBjaGlwIHByb2JlIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkCiAgKiBhbmQgdGhlIHJlbGV2YW50IHBlci1jaGlwIGluZm9ybWF0aW9uIHVwZGF0ZWQuIFRoaXMgY2FsbCBlbnN1cmUgdGhhdAogICogd2UgdXBkYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBhY2NvcmRpbmdseS4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL0tjb25maWcgYi9kcml2ZXJzL210ZC9vbmVuYW5kL0tjb25maWcKaW5kZXggYTM4ZjU4MC4uM2E5ZjE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvS2NvbmZpZwpAQCAtMSw3ICsxLDMgQEAKLSMKLSMgbGludXgvZHJpdmVycy9tdGQvb25lbmFuZC9LY29uZmlnCi0jCi0KIG1lbnVjb25maWcgTVREX09ORU5BTkQKIAl0cmlzdGF0ZSAiT25lTkFORCBEZXZpY2UgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1URApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL0tjb25maWcgYi9kcml2ZXJzL210ZC91YmkvS2NvbmZpZwppbmRleCBiMWNkN2ExLi4wYThjN2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC91YmkvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLSMgZHJpdmVycy9tdGQvdWJpL0tjb25maWcKLQogbWVudSAiVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzIgogCWRlcGVuZHMgb24gTVRECiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCmluZGV4IDg4YTcyZTkuLjI3Nzc4NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2thcGkuYwpAQCAtMjIsNiArMjIsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgInViaS5oIgogCkBAIC0yODAsNiArMjgyLDQ0IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1Ymlfb3Blbl92b2x1bWVfbm0pOwogCiAvKioKKyAqIHViaV9vcGVuX3ZvbHVtZV9wYXRoIC0gb3BlbiBVQkkgdm9sdW1lIGJ5IGl0cyBjaGFyYWN0ZXIgZGV2aWNlIG5vZGUgcGF0aC4KKyAqIEBwYXRobmFtZTogdm9sdW1lIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSBwYXRoCisgKiBAbW9kZTogb3BlbiBtb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvICd1Ymlfb3Blbl92b2x1bWUoKScsIGJ1dCBvcGVucyBhIHZvbHVtZSB0aGUgcGF0aAorICogdG8gaXRzIGNoYXJhY3RlciBkZXZpY2Ugbm9kZS4KKyAqLworc3RydWN0IHViaV92b2x1bWVfZGVzYyAqdWJpX29wZW5fdm9sdW1lX3BhdGgoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBtb2RlKQoreworCWludCBlcnJvciwgdWJpX251bSwgdm9sX2lkOworCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnJldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwYXRoIHBhdGg7CisKKwlkYmdfZ2VuKCJvcGVuIHZvbHVtZSAlcywgbW9kZSAlZCIsIHBhdGhuYW1lLCBtb2RlKTsKKworCWlmICghcGF0aG5hbWUgfHwgISpwYXRobmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwllcnJvciA9IGtlcm5fcGF0aChwYXRobmFtZSwgTE9PS1VQX0ZPTExPVywgJnBhdGgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCisJaW5vZGUgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwl1YmlfbnVtID0gdWJpX21ham9yMm51bShpbWFqb3IoaW5vZGUpKTsKKwl2b2xfaWQgPSBpbWlub3IoaW5vZGUpIC0gMTsKKworCWlmICh2b2xfaWQgPj0gMCAmJiB1YmlfbnVtID49IDApCisJCXJldCA9IHViaV9vcGVuX3ZvbHVtZSh1YmlfbnVtLCB2b2xfaWQsIG1vZGUpOworCWVsc2UKKwkJcmV0ID0gRVJSX1BUUigtRU5PREVWKTsKKworCXBhdGhfcHV0KCZwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodWJpX29wZW5fdm9sdW1lX3BhdGgpOworCisvKioKICAqIHViaV9jbG9zZV92b2x1bWUgLSBjbG9zZSBVQkkgdm9sdW1lLgogICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS91cGQuYyBiL2RyaXZlcnMvbXRkL3ViaS91cGQuYwppbmRleCA3NGZkYzQwLi5jMWQ3Yjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvdXBkLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3VwZC5jCkBAIC0xNDcsMTIgKzE0NywxNCBAQAogCX0KIAogCWlmIChieXRlcyA9PSAwKSB7CisJCWVyciA9IHViaV93bF9mbHVzaCh1YmkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwogCQllcnIgPSBjbGVhcl91cGRhdGVfbWFya2VyKHViaSwgdm9sLCAwKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCWVyciA9IHViaV93bF9mbHVzaCh1YmkpOwotCQlpZiAoIWVycikKLQkJCXZvbC0+dXBkYXRpbmcgPSAwOworCQl2b2wtPnVwZGF0aW5nID0gMDsKIAl9CiAKIAl2b2wtPnVwZF9idWYgPSB2bWFsbG9jKHViaS0+bGViX3NpemUpOwpAQCAtMzYyLDE2ICszNjQsMTYgQEAKIAogCXViaV9hc3NlcnQodm9sLT51cGRfcmVjZWl2ZWQgPD0gdm9sLT51cGRfYnl0ZXMpOwogCWlmICh2b2wtPnVwZF9yZWNlaXZlZCA9PSB2b2wtPnVwZF9ieXRlcykgeworCQllcnIgPSB1Ymlfd2xfZmx1c2godWJpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJCS8qIFRoZSB1cGRhdGUgaXMgZmluaXNoZWQsIGNsZWFyIHRoZSB1cGRhdGUgbWFya2VyICovCiAJCWVyciA9IGNsZWFyX3VwZGF0ZV9tYXJrZXIodWJpLCB2b2wsIHZvbC0+dXBkX2J5dGVzKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCWVyciA9IHViaV93bF9mbHVzaCh1YmkpOwotCQlpZiAoZXJyID09IDApIHsKLQkJCXZvbC0+dXBkYXRpbmcgPSAwOwotCQkJZXJyID0gdG9fd3JpdGU7Ci0JCQl2ZnJlZSh2b2wtPnVwZF9idWYpOwotCQl9CisJCXZvbC0+dXBkYXRpbmcgPSAwOworCQllcnIgPSB0b193cml0ZTsKKwkJdmZyZWUodm9sLT51cGRfYnVmKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODI1OTYuYyBiL2RyaXZlcnMvbmV0LzgyNTk2LmMKaW5kZXggZWE2YjEzOS4uMTY2M2JjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODI1OTYuYworKysgYi9kcml2ZXJzL25ldC84MjU5Ni5jCkBAIC0xOSw3ICsxOSw3IEBACiAgICBUQkQ6CiAgICAqIGxvb2sgYXQgZGVmZXJyaW5nIHJ4IGZyYW1lcyByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIChhcyBwZXIgdHVsaXApCiAgICAqIGhhbmRsZSB0eCByaW5nIGZ1bGwgYXMgcGVyIHR1bGlwCi0gICAqIHBlcmZvcm1hY2UgdGVzdCB0byB0dW5lIHJ4X2NvcHlicmVhaworICAgKiBwZXJmb3JtYW5jZSB0ZXN0IHRvIHR1bmUgcnhfY29weWJyZWFrCiAKICAgIE1vc3Qgb2YgbXkgbW9kaWZpY2F0aW9ucyByZWxhdGUgdG8gdGhlIGJyYWluZGVhZCBiaWctZW5kaWFuCiAgICBpbXBsZW1lbnRhdGlvbiBieSBJbnRlbC4gIFdoZW4gdGhlIGk1OTYgaXMgb3BlcmF0aW5nIGluCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwppbmRleCA0ZTYzNTlmLi43NjZhYWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKQEAgLTE2MzMsOCArMTYzMywxMyBAQAogCXJlYWRsKGxwLT5tbWlvICsgQ01ENyk7CiAJcmV0dXJuIDA7CiB9Ci0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcGFja2V0IHRyYW5zbWlzc2lvbiBmYWlscyB0byBjb21wbGV0ZSB3aXRoaW4gYSAgcmVzb25hYmxlIHBlcmlvZCwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbiBpbnRlcnJ1cHRzIGhhdmUgYmVlbiBmYWlsZWQgb3IgdGhlICBpbnRlcmZhY2UgaXMgbG9ja2VkIHVwLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVpbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLwogCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHBhY2tldCB0cmFuc21pc3Npb24gZmFpbHMgdG8gY29tcGxldGUKKyAqIHdpdGhpbiBhIHJlYXNvbmFibGUgcGVyaW9kLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFuIGludGVycnVwdCBoYXZlCisgKiBmYWlsZWQgb3IgdGhlIGludGVyZmFjZSBpcyBsb2NrZWQgdXAuIFRoaXMgZnVuY3Rpb24gd2lsbCByZWluaXRpYWxpemUKKyAqIHRoZSBoYXJkd2FyZS4KKyAqLwogc3RhdGljIHZvaWQgYW1kODExMWVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCA9IG5ldGRldl9wcml2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYwppbmRleCA1MGNlY2Y0Li43M2IzOGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogICogICAgICBEQVlOQSBkcml2ZXIgbW9kZToKICAqICAgICAgICAgICAgICBEYXluYSBETDIwMDAvRGF5bmFUYWxrIFBDIChIYWxmIExlbmd0aCksIENPUFMgTFQtOTUsIAogICoJCUZhcmFsbG9uIFBob25lTkVUIFBDIElJSSwgRmFyYWxsb24gUGhvbmVORVQgUEMgSUkKLSAqCU90aGVyIGNhcmRzIHBvc3NpYmx5IHN1cHBvcnRlZCBtb2RlIHVua293biB0aG91Z2g6CisgKglPdGhlciBjYXJkcyBwb3NzaWJseSBzdXBwb3J0ZWQgbW9kZSB1bmtub3duIHRob3VnaDoKICAqCQlEYXluYSBETDIwMDAgKEZ1bGwgbGVuZ3RoKSwgQ09QUyBMVC9NIChNaWNyby1DaGFubmVsKQogICoKICAqCUNhcmRzIE5PVCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgYnV0IHN1cHBvcnRlZCBieSB0aGUgbHRwYy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmlhZG5lLmggYi9kcml2ZXJzL25ldC9hcmlhZG5lLmgKaW5kZXggYmI2MTNmMi4uNzI3YmU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJpYWRuZS5oCisrKyBiL2RyaXZlcnMvbmV0L2FyaWFkbmUuaApAQCAtMjQ0LDcgKzI0NCw3IEBACiAjZGVmaW5lIERMTktUU1QJCTB4MDAxMAkvKiBEaXNhYmxlIExpbmsgU3RhdHVzICovCiAjZGVmaW5lIERBUEMJCTB4MDAwOAkvKiBEaXNhYmxlIEF1dG9tYXRpYyBQb2xhcml0eSBDb3JyZWN0aW9uICovCiAjZGVmaW5lIE1FTkRFQ0wJCTB4MDAwNAkvKiBNRU5ERUMgTG9vcGJhY2sgTW9kZSAqLwotI2RlZmluZSBMUlRUU0VMCQkweDAwMDIJLyogTG93IFJlY2VpdmUgVHJlc2hvbGQvVHJhbnNtaXQgTW9kZSBTZWxlY3QgKi8KKyNkZWZpbmUgTFJUVFNFTAkJMHgwMDAyCS8qIExvdyBSZWNlaXZlIFRocmVzaG9sZC9UcmFuc21pdCBNb2RlIFNlbGVjdCAqLwogI2RlZmluZSBQT1JUU0VMMQkweDAwMDEJLyogUG9ydCBTZWxlY3QgQml0cyAqLwogI2RlZmluZSBQT1JUU0VMMgkweDgwMDAJLyogUG9ydCBTZWxlY3QgQml0cyAqLwogI2RlZmluZSBJTlRMCQkweDQwMDAJLyogSW50ZXJuYWwgTG9vcGJhY2sgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX21haW4uYwppbmRleCAxZTJmNTdkLi42ZWI5MjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfbWFpbi5jCkBAIC0xNTQwLDcgKzE1NDAsNyBAQAogCQlpZiAoc3RhdHVzICYgSVNSX09WRVIpCiAJCQlpZiAobmV0aWZfbXNnX2ludHIoYWRhcHRlcikpCiAJCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKLQkJCQkJIlRYL1JYIG92ZXIgZmxvdyAoc3RhdHVzID0gMHgleClcbiIsCisJCQkJCSJUWC9SWCBvdmVyZmxvdyAoc3RhdHVzID0gMHgleClcbiIsCiAJCQkJCXN0YXR1cyAmIElTUl9PVkVSKTsKIAogCQkvKiBsaW5rIGV2ZW50ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmggYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmgKaW5kZXggZTczMjNiZS4uOTJiODdlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5oCisrKyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuaApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgKiBmaWx0ZXJpbmcgY2FwYWJpbGl0aWVzLiAqLwogc3RydWN0IGJlX2NtZF9yZXFfaWZfY3JlYXRlIHsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOwotCXUzMiB2ZXJzaW9uOwkJLyogaWdub3JlIGN1cnJudGx5ICovCisJdTMyIHZlcnNpb247CQkvKiBpZ25vcmUgY3VycmVudGx5ICovCiAJdTMyIGNhcGFiaWxpdHlfZmxhZ3M7CiAJdTMyIGVuYWJsZV9mbGFnczsKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9tYWluLmMgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9tYWluLmMKaW5kZXggOTU3YTBmNy4uMjRjN2Q5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX21haW4uYwpAQCAtMTk4Miw3ICsxOTgyLDcgQEAKIAkJZ290byBmd19leGl0OwogCX0KIAotCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJGaXJtd2FyZSBmbGFzaGVkIHN1Y2Nlc2Z1bGx5XG4iKTsKKwlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiRmlybXdhcmUgZmxhc2hlZCBzdWNjZXNzZnVsbHlcbiIpOwogCiBmd19leGl0OgogCXJlbGVhc2VfZmlybXdhcmUoZncpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MnhfcmVnLmggYi9kcml2ZXJzL25ldC9ibngyeF9yZWcuaAppbmRleCBiNjY4MTczLi45NDQ5NjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeF9yZWcuaAorKysgYi9kcml2ZXJzL25ldC9ibngyeF9yZWcuaApAQCAtMjUzNiw3ICsyNTM2LDcgQEAKIC8qIFtSQyAxXSBBIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBvdmVyZmxvdyBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgdGhlCiAgICBxdWV1ZXMuICovCiAjZGVmaW5lIFFNX1JFR19PVkZFUlJPUiAJCQkJCSAweDE2ODA1YwotLyogW1JDIDddIHRoZSBRIHdlcmUgdGhlIHF2ZXJmbG93IG9jY3VycyAqLworLyogW1JDIDddIHRoZSBRIHdoZXJlIHRoZSBvdmVyZmxvdyBvY2N1cnMgKi8KICNkZWZpbmUgUU1fUkVHX09WRlFOVU0JCQkJCQkgMHgxNjgwNTgKIC8qIFtSIDE2XSBQYXVzZSBzdGF0ZSBmb3IgcGh5c2ljYWwgcXVldWVzIDE1LTAgKi8KICNkZWZpbmUgUU1fUkVHX1BBVVNFU1RBVEUwCQkJCQkgMHgxNjg0MTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwppbmRleCAwZDMwZDFlLi4wMGFiNTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCkBAIC01NTYsNyArNTU2LDcgQEAKIAkJfQogCX0KIAotCS8qIGRvIG5vdCB1cGRhdGUgdGhlIGVudHJpZXMgYWdhaW4gdW50aWxsIHRoaXMgY291bnRlciBpcyB6ZXJvIHNvIHRoYXQKKwkvKiBkbyBub3QgdXBkYXRlIHRoZSBlbnRyaWVzIGFnYWluIHVudGlsIHRoaXMgY291bnRlciBpcyB6ZXJvIHNvIHRoYXQKIAkgKiBub3QgdG8gY29uZnVzZSB0aGUgY2xpZW50cy4KIAkgKi8KIAlib25kX2luZm8tPnJsYl91cGRhdGVfZGVsYXlfY291bnRlciA9IFJMQl9VUERBVEVfREVMQVk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCmluZGV4IDQ5ZjNkZTcuLmJkYmQxNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCkBAIC0xMjg1LDcgKzEyODUsNyBAQAogCiAJLyoKIAkgKiBXZSBkbyBub3QgdXNlIFR4IGNvbXBsZXRpb24gaW50ZXJydXB0cyB0byBmcmVlIERNQWQgVHggcGFja2V0cy4KLQkgKiBUaGlzIGlzIGdvb2QgZm9yIHBlcmZvcm1hbWNlIGJ1dCBtZWFucyB0aGF0IHdlIHJlbHkgb24gbmV3IFR4CisJICogVGhpcyBpcyBnb29kIGZvciBwZXJmb3JtYW5jZSBidXQgbWVhbnMgdGhhdCB3ZSByZWx5IG9uIG5ldyBUeAogCSAqIHBhY2tldHMgYXJyaXZpbmcgdG8gcnVuIHRoZSBkZXN0cnVjdG9ycyBvZiBjb21wbGV0ZWQgcGFja2V0cywKIAkgKiB3aGljaCBvcGVuIHVwIHNwYWNlIGluIHRoZWlyIHNvY2tldHMnIHNlbmQgcXVldWVzLiAgU29tZXRpbWVzCiAJICogd2UgZG8gbm90IGdldCBzdWNoIG5ldyBwYWNrZXRzIGNhdXNpbmcgVHggdG8gc3RhbGwuICBBIHNpbmdsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9ldGh0b29sLmMKaW5kZXggZDc2ODg1Mi4uNzViMDk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfZXRodG9vbC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlyZXQgPSBlaGVhX3NldF9wb3J0c3BlZWQocG9ydCwgc3ApOwogCiAJaWYgKCFyZXQpCi0JCWVoZWFfaW5mbygiJXM6IFBvcnQgc3BlZWQgc3VjY2VzZnVsbHkgc2V0OiAlZE1icHMgIgorCQllaGVhX2luZm8oIiVzOiBQb3J0IHNwZWVkIHN1Y2Nlc3NmdWxseSBzZXQ6ICVkTWJwcyAiCiAJCQkgICIlcyBEdXBsZXgiLAogCQkJICBwb3J0LT5uZXRkZXYtPm5hbWUsIHBvcnQtPnBvcnRfc3BlZWQsCiAJCQkgIHBvcnQtPmZ1bGxfZHVwbGV4ID09IDEgPyAiRnVsbCIgOiAiSGFsZiIpOwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJcmV0ID0gZWhlYV9zZXRfcG9ydHNwZWVkKHBvcnQsIEVIRUFfU1BFRURfQVVUT05FRyk7CiAKIAlpZiAoIXJldCkKLQkJZWhlYV9pbmZvKCIlczogUG9ydCBzcGVlZCBzdWNjZXNmdWxseSBzZXQ6ICVkTWJwcyAiCisJCWVoZWFfaW5mbygiJXM6IFBvcnQgc3BlZWQgc3VjY2Vzc2Z1bGx5IHNldDogJWRNYnBzICIKIAkJCSAgIiVzIER1cGxleCIsCiAJCQkgIHBvcnQtPm5ldGRldi0+bmFtZSwgcG9ydC0+cG9ydF9zcGVlZCwKIAkJCSAgcG9ydC0+ZnVsbF9kdXBsZXggPT0gMSA/ICJGdWxsIiA6ICJIYWxmIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYwppbmRleCBlZDYwZmQ2Li4wY2FiOTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfZmR4LmMKQEAgLTM1LDcgKzM1LDcgQEAKICAqICAgICAgICAgIGRyaXZlciBvbmx5IHN1cHBvcnRzIHN0YW5kYXJkIHNlcmlhbCBoYXJkd2FyZSAoODI1MCwgMTY0NTAsIDE2NTUwQSkKICAqCiAgKiAgICAgICAgICBUaGlzIG1vZGVtIHVzdWFsbHkgZHJhd3MgaXRzIHN1cHBseSBjdXJyZW50IG91dCBvZiB0aGUgb3RoZXJ3aXNlIHVudXNlZAotICogICAgICAgICAgVFhEIHBpbiBvZiB0aGUgc2VyaWFsIHBvcnQuIFRodXMgYSBjb250aWdudW91cyBzdHJlYW0gb2YgMHgwMC1ieXRlcworICogICAgICAgICAgVFhEIHBpbiBvZiB0aGUgc2VyaWFsIHBvcnQuIFRodXMgYSBjb250aWd1b3VzIHN0cmVhbSBvZiAweDAwLWJ5dGVzCiAgKiAgICAgICAgICBpcyB0cmFuc21pdHRlZCB0byBhY2hpZXZlIGEgcG9zaXRpdmUgc3VwcGx5IHZvbHRhZ2UuCiAgKgogICogIGhzazogICAgVGhpcyBpcyBhIDQ4MDAgYmF1ZCBGU0sgbW9kZW0sIGRlc2lnbmVkIGZvciBUTkMgdXNlLiBJdCB3b3JrcyBmaW5lCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCmluZGV4IDFlOGRkOGMuLjhmN2QwZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7IC8qIFBDSSB2ZW5kb3IgSUQgKi8KIAl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7IC8qIFBDSSB2ZW5kb3IgSUQgKi8KIAl1bnNpZ25lZCBzaG9ydCBzdWJ2ZW5kb3I7IC8qIFBDSSBzdWJzeXN0ZW0gdmVuZG9yIElEICovCi0JdW5zaWduZWQgc2hvcnQgc3ViZGV2aWNlOyAvKiBQQ0kgc3lic3lzdGVtIGRldmljZSBJRCAqLworCXVuc2lnbmVkIHNob3J0IHN1YmRldmljZTsgLyogUENJIHN1YnN5c3RlbSBkZXZpY2UgSUQgKi8KIAl1bnNpZ25lZCBzaG9ydCBzaXJfaW87IC8qIEkvTyBwb3J0IGZvciBTSVIgKi8KIAl1bnNpZ25lZCBzaG9ydCBmaXJfaW87IC8qIEkvTyBwb3J0IGZvciBGSVIgKi8KIAl1bnNpZ25lZCBjaGFyICBmaXJfaXJxOyAvKiBGSVIgSVJRICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCmluZGV4IDQ5OTk3MTkuLjE2YzkxOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCkBAIC0xMzg0LDcgKzEzODQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZG9uZTsKIAlpbnQgaSA9IDE7CiAKLQkvKiBGSVhNRTogc2ticyBhcmUgY29udGluZ3VvdXMgaW4gcmVhbCBhZGRyZXNzZXMuICBEbyB3ZQorCS8qIEZJWE1FOiBza2JzIGFyZSBjb250aWd1b3VzIGluIHJlYWwgYWRkcmVzc2VzLiAgRG8gd2UKIAkgKiByZWFsbHkgbmVlZCB0byBicmVhayBpdCBpbnRvIFBBR0VfU0laRSBjaHVua3MsIG9yIGNhbiB3ZSBkbwogCSAqIGl0IGp1c3QgYXQgdGhlIGdyYW51bGFyaXR5IG9mIGlTZXJpZXMgcmVhbC0+YWJzb2x1dGUKIAkgKiBtYXBwaW5nPyAgSW5kZWVkLCBnaXZlbiB0aGUgd2F5IHRoZSBhbGxvY2F0b3Igd29ya3MsIGNhbiB3ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jIGIvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCmluZGV4IGEwYzU3ODUuLmI3NzIzOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYworKysgYi9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgIFRCRDoKICAgICogbG9vayBhdCBkZWZlcnJpbmcgcnggZnJhbWVzIHJhdGhlciB0aGFuIGRpc2NhcmRpbmcgKGFzIHBlciB0dWxpcCkKICAgICogaGFuZGxlIHR4IHJpbmcgZnVsbCBhcyBwZXIgdHVsaXAKLSAgICogcGVyZm9ybWFjZSB0ZXN0IHRvIHR1bmUgcnhfY29weWJyZWFrCisgICAqIHBlcmZvcm1hbmNlIHRlc3QgdG8gdHVuZSByeF9jb3B5YnJlYWsKIAogICAgTW9zdCBvZiBteSBtb2RpZmljYXRpb25zIHJlbGF0ZSB0byB0aGUgYnJhaW5kZWFkIGJpZy1lbmRpYW4KICAgIGltcGxlbWVudGF0aW9uIGJ5IEludGVsLiAgV2hlbiB0aGUgaTU5NiBpcyBvcGVyYXRpbmcgaW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgyNTk2LmMgYi9kcml2ZXJzL25ldC9saWI4MjU5Ni5jCmluZGV4IDdhMDc0MzAuLmIxMTdmN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xpYjgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvbGliODI1OTYuYwpAQCAtNDcsNyArNDcsNyBAQAogICAgVEJEOgogICAgKiBsb29rIGF0IGRlZmVycmluZyByeCBmcmFtZXMgcmF0aGVyIHRoYW4gZGlzY2FyZGluZyAoYXMgcGVyIHR1bGlwKQogICAgKiBoYW5kbGUgdHggcmluZyBmdWxsIGFzIHBlciB0dWxpcAotICAgKiBwZXJmb3JtYWNlIHRlc3QgdG8gdHVuZSByeF9jb3B5YnJlYWsKKyAgICogcGVyZm9ybWFuY2UgdGVzdCB0byB0dW5lIHJ4X2NvcHlicmVhawogCiAgICBNb3N0IG9mIG15IG1vZGlmaWNhdGlvbnMgcmVsYXRlIHRvIHRoZSBicmFpbmRlYWQgYmlnLWVuZGlhbgogICAgaW1wbGVtZW50YXRpb24gYnkgSW50ZWwuICBXaGVuIHRoZSBpNTk2IGlzIG9wZXJhdGluZyBpbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9lbl9yeC5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9yeC5jCmluZGV4IDAzYjc4MWEuLjgyOWI5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fcnguYworKysgYi9kcml2ZXJzL25ldC9tbHg0L2VuX3J4LmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQllbl9kYmcoRFJWLCBwcml2LCAiRnJlZWluZyBmcmFnbWVudDolZFxuIiwgbnIpOwogCQlkbWEgPSBiZTY0X3RvX2NwdShyeF9kZXNjLT5kYXRhW25yXS5hZGRyKTsKIAotCQllbl9kYmcoRFJWLCBwcml2LCAiVW5tYXBpbmcgYnVmZmVyIGF0IGRtYToweCVsbHhcbiIsICh1NjQpIGRtYSk7CisJCWVuX2RiZyhEUlYsIHByaXYsICJVbm1hcHBpbmcgYnVmZmVyIGF0IGRtYToweCVsbHhcbiIsICh1NjQpIGRtYSk7CiAJCXBjaV91bm1hcF9zaW5nbGUobWRldi0+cGRldiwgZG1hLCBza2JfZnJhZ3NbbnJdLnNpemUsCiAJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCXB1dF9wYWdlKHNrYl9mcmFnc1tucl0ucGFnZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX3R4LmMgYi9kcml2ZXJzL25ldC9tbHg0L2VuX3R4LmMKaW5kZXggOGM3Mjc5OS4uM2QxMzk2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9lbl90eC5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fdHguYwpAQCAtNDcsNyArNDcsNyBAQAogc3RhdGljIGludCBpbmxpbmVfdGhvbGQgX19yZWFkX21vc3RseSA9IE1BWF9JTkxJTkU7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChpbmxpbmVfdGhvbGQsIGlubGluZV90aG9sZCwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaW5saW5lX3Rob2xkLCAidHJlc2hvbGQgZm9yIHVzaW5nIGlubGluZSBkYXRhIik7CitNT0RVTEVfUEFSTV9ERVNDKGlubGluZV90aG9sZCwgInRocmVzaG9sZCBmb3IgdXNpbmcgaW5saW5lIGRhdGEiKTsKIAogaW50IG1seDRfZW5fY3JlYXRlX3R4X3Jpbmcoc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiwKIAkJCSAgIHN0cnVjdCBtbHg0X2VuX3R4X3JpbmcgKnJpbmcsIHUzMiBzaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmggYi9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaAppbmRleCA0Mzc2MTQ3Li44MmMzZWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaAorKysgYi9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaApAQCAtMTYyLDcgKzE2Miw3IEBACiAjZGVmaW5lIE1MWDRfRU5fREVGX1JYX1BBVVNFCTEKICNkZWZpbmUgTUxYNF9FTl9ERUZfVFhfUEFVU0UJMQogCi0vKiBJbnRlcnZhbCBiZXR3ZWVuIHN1Y2Vzc2l2ZSBwb2xscyBpbiB0aGUgVHggcm91dGluZSB3aGVuIHBvbGxpbmcgaXMgdXNlZAorLyogSW50ZXJ2YWwgYmV0d2VlbiBzdWNjZXNzaXZlIHBvbGxzIGluIHRoZSBUeCByb3V0aW5lIHdoZW4gcG9sbGluZyBpcyB1c2VkCiAgICBpbnN0ZWFkIG9mIGludGVycnVwdHMgKGluIHBlci1jb3JlIFR4IHJpbmdzKSAtIHNob3VsZCBiZSBwb3dlciBvZiAyICovCiAjZGVmaW5lIE1MWDRfRU5fVFhfUE9MTF9NT0RFUgkxNgogI2RlZmluZSBNTFg0X0VOX1RYX1BPTExfVElNRU9VVAkoSFogLyA0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHMzX2dlbGljX25ldC5jIGIvZHJpdmVycy9uZXQvcHMzX2dlbGljX25ldC5jCmluZGV4IDg5YzQ5NDguLjBjNzY4NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BzM19nZWxpY19uZXQuYworKysgYi9kcml2ZXJzL25ldC9wczNfZ2VsaWNfbmV0LmMKQEAgLTMxNCw3ICszMTQsNyBAQAogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCiAgKiBAZGVzY3I6IGRlc2NyaXB0b3IgdG8gcmUtaW5pdAogICoKLSAqIHJldHVybiAwIG9uIHN1Y2NlcywgPDAgb24gZmFpbHVyZQorICogcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQogICoKICAqIGFsbG9jYXRlcyBhIG5ldyByeCBza2IsIGlvbW11LW1hcHMgaXQgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBkZXNjcmlwdG9yLgogICogQWN0aXZhdGUgdGhlIGRlc2NyaXB0b3Igc3RhdGUtd2lzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHMzX2dlbGljX3dpcmVsZXNzLmggYi9kcml2ZXJzL25ldC9wczNfZ2VsaWNfd2lyZWxlc3MuaAppbmRleCA1YjYzMWM2Li4wYTg4YjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wczNfZ2VsaWNfd2lyZWxlc3MuaAorKysgYi9kcml2ZXJzL25ldC9wczNfZ2VsaWNfd2lyZWxlc3MuaApAQCAtMTk5LDcgKzE5OSw3IEBACiAvKiBmb3IgJ3N0YXQnIG1lbWJlciBvZiBnZWxpY193bF9pbmZvICovCiBlbnVtIGdlbGljX3dsX2luZm9fc3RhdHVzX2JpdCB7CiAJR0VMSUNfV0xfU1RBVF9DT05GSUdVUkVELAotCUdFTElDX1dMX1NUQVRfQ0hfSU5GTywgICAvKiBjaCBpbmZvIGFxdWlyZWQgKi8KKwlHRUxJQ19XTF9TVEFUX0NIX0lORk8sICAgLyogY2ggaW5mbyBhY3F1aXJlZCAqLwogCUdFTElDX1dMX1NUQVRfRVNTSURfU0VULCAvKiBFU1NJRCBzcGVjaWZpZWQgYnkgdXNlcnNwYWNlICovCiAJR0VMSUNfV0xfU1RBVF9CU1NJRF9TRVQsIC8qIEJTU0lEIHNwZWNpZmllZCBieSB1c2Vyc3BhY2UgKi8KIAlHRUxJQ19XTF9TVEFUX1dQQV9QU0tfU0VULCAvKiBQTUsgc3BlY2lmaWVkIGJ5IHVzZXJzcGFjZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxhM3h4eC5jIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5jCmluZGV4IGUzZTZiYzkuLmRkMzUwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsYTN4eHguYworKysgYi9kcml2ZXJzL25ldC9xbGEzeHh4LmMKQEAgLTM2NTEsNyArMzY1MSw3IEBACiAJCXFsX3NlbV91bmxvY2socWRldiwgUUxfRFJWUl9TRU1fTUFTSyk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYXF1aXJlIGRyaXZlciBsb2NrLlxuIiwKKwkJICAgICAgICIlczogQ291bGQgbm90IGFjcXVpcmUgZHJpdmVyIGxvY2suXG4iLAogCQkgICAgICAgbmRldi0+bmFtZSk7CiAJCWdvdG8gZXJyX2xvY2s7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5jIGIvZHJpdmVycy9uZXQvczJpby5jCmluZGV4IDBkZDc4MzkuLmNjNDIxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTMyMzgsNyArMzIzOCw3IEBACiAKIC8qKgogICogIHMyaW9fY2hrX3hwYWtfY291bnRlciAtIEZ1bmN0aW9uIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHhwYWsgY291bnRlcnMKLSAqICBAY291bnRlciAgICAgIDogY291dGVyIHZhbHVlIHRvIGJlIHVwZGF0ZWQKKyAqICBAY291bnRlciAgICAgIDogY291bnRlciB2YWx1ZSB0byBiZSB1cGRhdGVkCiAgKiAgQGZsYWcgICAgICAgICA6IGZsYWcgdG8gaW5kaWNhdGUgdGhlIHN0YXR1cwogICogIEB0eXBlICAgICAgICAgOiBjb3VudGVyIHR5cGUKICAqICBEZXNjcmlwdGlvbjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczkwMC5jIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKaW5kZXggOWExMmQ4OC4uNzM2MGQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2lzOTAwLmMKKysrIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKQEAgLTE3NjAsNyArMTc2MCw3IEBACiAJCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciwgUlhfQlVGX1NJWkUsCiAJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQkJLyogcmVmaWxsIHRoZSBSeCBidWZmZXIsIHdoYXQgaWYgdGhlcmUgaXMgbm90IGVub3VnaHQKKwkJCS8qIHJlZmlsbCB0aGUgUnggYnVmZmVyLCB3aGF0IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2gKIAkJCSAqIG1lbW9yeSBmb3IgbmV3IHNvY2tldCBidWZmZXIgPz8gKi8KIAkJCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZfU0laRSkpID09IE5VTEwpIHsKIAkJCQkvKgpAQCAtMTc3NSw3ICsxNzc1LDcgQEAKIAkJCX0KIAogCQkJLyogVGhpcyBzaXR1YXRpb24gc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGR1ZSB0bwotCQkJICAgc29tZSB1bmtub3cgYnVncywgaXQgaXMgcG9zc2libGUgdGhhdAorCQkJICAgc29tZSB1bmtub3duIGJ1Z3MsIGl0IGlzIHBvc3NpYmxlIHRoYXQKIAkJCSAgIHdlIGFyZSB3b3JraW5nIG9uIE5VTEwgc2tfYnVmZiA6LSggKi8KIAkJCWlmIChzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CiAJCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoc2lzX3ByaXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL3NtYy5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NtYy5oCmluZGV4IDE3NThkOTUuLjAyNmE4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvaC9zbWMuaAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc21jLmgKQEAgLTM5MywxMCArMzkzLDEwIEBACiAJCQkJCSAqLwogCXVfbG9uZwltYWNfZF9tYXggOwkJLyogTUFDIDogRF9NYXggdGltZXIgdmFsdWUgKi8KIAotCXVfbG9uZyBsY3Rfc2hvcnQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLwotCXVfbG9uZyBsY3RfbWVkaXVtIDsJCS8qIExDVCA6IGVycm9yIHRocmVzaGhvbGQgKi8KLQl1X2xvbmcgbGN0X2xvbmcgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLwotCXVfbG9uZyBsY3RfZXh0ZW5kZWQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLworCXVfbG9uZyBsY3Rfc2hvcnQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNob2xkICovCisJdV9sb25nIGxjdF9tZWRpdW0gOwkJLyogTENUIDogZXJyb3IgdGhyZXNob2xkICovCisJdV9sb25nIGxjdF9sb25nIDsJCS8qIExDVCA6IGVycm9yIHRocmVzaG9sZCAqLworCXVfbG9uZyBsY3RfZXh0ZW5kZWQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNob2xkICovCiB9IDsKIAogI2lmZGVmCURFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwppbmRleCBiMjcxNTZlYWYuLmRiMjE2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwpAQCAtMTAwMiw3ICsxMDAyLDcgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoImlvY3RsIGZvciAlczogdW5rbm93IGNtZDogJTA0eFxuIiwgZGV2LT5uYW1lLCBpb2MuY21kKTsKKwkJcHJpbnRrKCJpb2N0bCBmb3IgJXM6IHVua25vd24gY21kOiAlMDR4XG4iLCBkZXYtPm5hbWUsIGlvYy5jbWQpOwogCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKIAogCX0JCQkvLyBzd2l0Y2gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuYyBiL2RyaXZlcnMvbmV0L3NreTIuYwppbmRleCAzOTQzZDg5Li4wNDRlNjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC0yMDE3LDcgKzIwMTcsNyBAQAogCiAJbmV0aWZfY2Fycmllcl9vZmYoc2t5Mi0+bmV0ZGV2KTsKIAotCS8qIFR1cm4gb24gbGluayBMRUQgKi8KKwkvKiBUdXJuIG9mZiBsaW5rIExFRCAqLwogCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX09GRik7CiAKIAlpZiAobmV0aWZfbXNnX2xpbmsoc2t5MikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbXNjOTExeC5jIGIvZHJpdmVycy9uZXQvc21zYzkxMXguYwppbmRleCA0ZDBkNWM1Li4yMGQ2MDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbXNjOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmMKQEAgLTgxNiw3ICs4MTYsNyBAQAogCVNNU0NfVFJBQ0UoSFcsICJQYXNzZWQgTG9vcCBCYWNrIFRlc3QiKTsKICNlbmRpZgkJCQkvKiBVU0VfUEhZX1dPUktfQVJPVU5EICovCiAKLQlTTVNDX1RSQUNFKEhXLCAicGh5IGluaXRpYWxpc2VkIHN1Y2Nlc2Z1bGx5Iik7CisJU01TQ19UUkFDRShIVywgInBoeSBpbml0aWFsaXNlZCBzdWNjZXNzZnVsbHkiKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21zYzkxMXguaCBiL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmgKaW5kZXggYjU3MTZiZC4uMDE2MzYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21zYzkxMXguaAorKysgYi9kcml2ZXJzL25ldC9zbXNjOTExeC5oCkBAIC0zMCw3ICszMCw3IEBACiAjZGVmaW5lIFNNU0NfTkFQSV9XRUlHSFQJMTYKIAogLyogaW1wbGVtZW50cyBhIFBIWSBsb29wYmFjayB0ZXN0IGF0IGluaXRpYWxpc2F0aW9uIHRpbWUsIHRvIGVuc3VyZSBhIHBhY2tldAotICogY2FuIGJlIHN1Y2Nlc2Z1bGx5IGxvb3BlZCBiYWNrICovCisgKiBjYW4gYmUgc3VjY2Vzc2Z1bGx5IGxvb3BlZCBiYWNrICovCiAjZGVmaW5lIFVTRV9QSFlfV09SS19BUk9VTkQKIAogI2RlZmluZSBEUFJJTlRLKG5sZXZlbCwga2xldmVsLCBmbXQsIGFyZ3MuLi4pIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwppbmRleCA3ODI5MTBjLi4yMTg1MjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCkBAIC00MTAsNyArNDEwLDcgQEAKICAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQogICogQGRlc2NyOiBkZXNjcmlwdG9yIHRvIHJlLWluaXQKICAqCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXMsIDwwIG9uIGZhaWx1cmUuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgogICoKICAqIEFsbG9jYXRlcyBhIG5ldyByeCBza2IsIGlvbW11LW1hcHMgaXQgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZQogICogZGVzY3JpcHRvci4gTWFyayB0aGUgZGVzY3JpcHRvciBhcyBhY3RpdmF0ZWQsIHJlYWR5LXRvLXVzZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9nbWFjLmMgYi9kcml2ZXJzL25ldC9zdG1tYWMvZ21hYy5jCmluZGV4IGI2MjRiYjUuLjUyNTg2ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bW1hYy9nbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2dtYWMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJCQkgICAgICAiICh0aHJlc2hvbGQgPSAlZClcbiIsIHR4bW9kZSk7CiAJCWNzcjYgJj0gfkRNQV9DT05UUk9MX1RTRjsKIAkJY3NyNiAmPSBETUFfQ09OVFJPTF9UQ19UWF9NQVNLOwotCQkvKiBTZXQgdGhlIHRyYW5zbWl0IHRocmVhc2hvbGQgKi8KKwkJLyogU2V0IHRoZSB0cmFuc21pdCB0aHJlc2hvbGQgKi8KIAkJaWYgKHR4bW9kZSA8PSAzMikKIAkJCWNzcjYgfD0gRE1BX0NPTlRST0xfVFRDXzMyOwogCQllbHNlIGlmICh0eG1vZGUgPD0gNjQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvZ21hYy5oIGIvZHJpdmVycy9uZXQvc3RtbWFjL2dtYWMuaAppbmRleCA2ODRhMzYzLi4yZTgyZDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdG1tYWMvZ21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9nbWFjLmgKQEAgLTE1NCwxNCArMTU0LDE0IEBACiAjZGVmaW5lIERNQV9DT05UUk9MX0RUCQkweDA0MDAwMDAwIC8qIERpc2FibGUgRHJvcCBUQ1AvSVAgY3N1bSBlcnJvciAqLwogI2RlZmluZSBETUFfQ09OVFJPTF9SU0YJCTB4MDIwMDAwMDAgLyogUmVjZWl2ZSBTdG9yZSBhbmQgRm9yd2FyZCAqLwogI2RlZmluZSBETUFfQ09OVFJPTF9ERkYJCTB4MDEwMDAwMDAgLyogRGlzYWFibGUgZmx1c2hpbmcgKi8KLS8qIFRoZXNob2xkIGZvciBBY3RpdmF0aW5nIHRoZSBGQyAqLworLyogVGhyZXNob2xkIGZvciBBY3RpdmF0aW5nIHRoZSBGQyAqLwogZW51bSByZmEgewogCWFjdF9mdWxsX21pbnVzXzEgPSAweDAwODAwMDAwLAogCWFjdF9mdWxsX21pbnVzXzIgPSAweDAwODAwMjAwLAogCWFjdF9mdWxsX21pbnVzXzMgPSAweDAwODAwNDAwLAogCWFjdF9mdWxsX21pbnVzXzQgPSAweDAwODAwNjAwLAogfTsKLS8qIFRoZXNob2xkIGZvciBEZWFjdGl2YXRpbmcgdGhlIEZDICovCisvKiBUaHJlc2hvbGQgZm9yIERlYWN0aXZhdGluZyB0aGUgRkMgKi8KIGVudW0gcmZkIHsKIAlkZWFjX2Z1bGxfbWludXNfMSA9IDB4MDA0MDAwMDAsCiAJZGVhY19mdWxsX21pbnVzXzIgPSAweDAwNDAwODAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwppbmRleCA1ZGIwMjcwLi42NjI3MmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwpAQCAtOTYsNyArOTYsNyBAQAogICoKICAqICAgICAgQ2hhbmdlIGJ5IE1pa2UgU3VsbGl2YW4gZXQgYWwuOgogICogICAgICArIGFkZGVkIHR1cmJvIGNhcmQgc3VwcG9ydC4gTm8gbmVlZCB0byB1c2UgbGFuYWlkIHRvIGNvbmZpZ3VyZQotICogICAgICB0aGUgYWRhcHRlciBpbnRvIGlzYSBjb21wYXRpYmxpdHkgbW9kZS4KKyAqICAgICAgdGhlIGFkYXB0ZXIgaW50byBpc2EgY29tcGF0aWJpbGl0eSBtb2RlLgogICoKICAqICAgICAgQ2hhbmdlcyBieSBCdXJ0IFNpbHZlcm1hbiB0byBhbGxvdyB0aGUgY29tcHV0ZXIgdG8gYmVoYXZlIG5pY2VseSB3aGVuCiAgKglhIGNhYmxlIGlzIHB1bGxlZCBvciBub3QgaW4gcGxhY2UsIG9yIGEgUENNQ0lBIGNhcmQgaXMgcmVtb3ZlZCBob3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jCmluZGV4IDQyN2E4OTcuLjU0MDFkODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jCkBAIC00MjYsNyArNDI2LDcgQEAKICAgICAgICAgc21jdHJfbWFsbG9jKGRldiwgMUwpOwogCiAgICAgICAgIC8qIEFsbG9jYXRlIE5vbi1NQUMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuCi0gICAgICAgICAqIFRvIGd1YXJhbnRlZSBhIG1pbmltdW0gb2YgMjU2IGNvbnRpZ291cyBtZW1vcnkgdG8KKyAgICAgICAgICogVG8gZ3VhcmFudGVlIGEgbWluaW11bSBvZiAyNTYgY29udGlndW91cyBtZW1vcnkgdG8KICAgICAgICAgICogVU1fUmVjZWl2ZV9QYWNrZXQncyBsb29rYWhlYWQgcG9pbnRlciwgYmVmb3JlIGEgcGFnZQogICAgICAgICAgKiBjaGFuZ2Ugb3IgcmluZyBlbmQgaXMgZW5jb3VudGVyZWQsIHBsYWNlIGVhY2ggcnggYnVmZmVyIG9uCiAgICAgICAgICAqIGEgMjU2IGJ5dGUgYm91bmRhcnkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwppbmRleCA5ZjQ0Yzk5Li5hZmFmMDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKQEAgLTM3OTgsNyArMzc5OCw3IEBACiAJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJ0eC1jbG9jayIsIE5VTEwpOwogCQlpZiAoIXByb3ApIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJ1Y2NfZ2V0aDogbWlzaW5nIHR4LWNsb2NrLW5hbWUgcHJvcGVydHlcbiIpOworCQkJCSJ1Y2NfZ2V0aDogbWlzc2luZyB0eC1jbG9jay1uYW1lIHByb3BlcnR5XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICgoKnByb3AgPCBRRV9DTEtfTk9ORSkgfHwgKCpwcm9wID4gUUVfQ0xLMjQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oIGIvZHJpdmVycy9uZXQvdWNjX2dldGguaAppbmRleCAwM2E2Y2EwLi5hMDA3ZTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmgKQEAgLTgwLDE2ICs4MCwxNiBAQAogCQkJCSAgIGZyYW1lcykgcmVjZWl2ZWQgdGhhdCB3ZXJlIGJldHdlZW4gMTI4CiAJCQkJICAgKEluY2x1ZGluZyBGQ1MgbGVuZ3RoPT00KSBhbmQgMjU1IG9jdGV0cyAqLwogCXUzMiB0eG9rOwkJLyogVG90YWwgbnVtYmVyIG9mIG9jdGV0cyByZXNpZGluZyBpbiBmcmFtZXMKLQkJCQkgICB0aGF0IHdoZXJlIGludm9sdmVkIGluIHN1Y2Nlc2Z1bGwKKwkJCQkgICB0aGF0IHdoZXJlIGludm9sdmVkIGluIHN1Y2Nlc3NmdWxsCiAJCQkJICAgdHJhbnNtaXNzaW9uICovCiAJdTE2IHR4Y2Y7CQkvKiBUb3RhbCBudW1iZXIgb2YgUEFVU0UgY29udHJvbCBmcmFtZXMKIAkJCQkgICB0cmFuc21pdHRlZCBieSB0aGlzIE1BQyAqLwogCXU4IHJlczRbMHgyXTsKIAl1MzIgdG1jYTsJCS8qIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZXJlIHRyYW5zbWl0dGVkCi0JCQkJICAgc3VjY2VzZnVsbHkgd2l0aCB0aGUgZ3JvdXAgYWRkcmVzcyBiaXQgc2V0CisJCQkJICAgc3VjY2Vzc2Z1bGx5IHdpdGggdGhlIGdyb3VwIGFkZHJlc3MgYml0IHNldAogCQkJCSAgIHRoYXQgYXJlIG5vdCBicm9hZGNhc3QgZnJhbWVzICovCiAJdTMyIHRiY2E7CQkvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkCi0JCQkJICAgc3VjY2VzZnVsbHkgdGhhdCBoYWQgZGVzdGluYXRpb24gYWRkcmVzcworCQkJCSAgIHN1Y2Nlc3NmdWxseSB0aGF0IGhhZCBkZXN0aW5hdGlvbiBhZGRyZXNzCiAJCQkJICAgZmllbGQgZXF1YWwgdG8gdGhlIGJyb2FkY2FzdCBhZGRyZXNzICovCiAJdTMyIHJ4Zm9rOwkJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBPSyAqLwogCXUzMiByeGJvazsJCS8qIFRvdGFsIG51bWJlciBvZiBvY3RldHMgcmVjZWl2ZWQgT0sgKi8KQEAgLTk4LDkgKzk4LDkgQEAKIAkJCQkgICBIVyBiZWNhdXNlIGl0IGluY2x1ZGVzIG9jdGV0cyBpbiBmcmFtZXMgdGhhdAogCQkJCSAgIG5ldmVyIGV2ZW4gcmVhY2ggdGhlIFVDQyAqLwogCXUzMiBybWNhOwkJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IHdlcmUgcmVjZWl2ZWQKLQkJCQkgICBzdWNjZXNmdWxseSB3aXRoIHRoZSBncm91cCBhZGRyZXNzIGJpdCBzZXQKKwkJCQkgICBzdWNjZXNzZnVsbHkgd2l0aCB0aGUgZ3JvdXAgYWRkcmVzcyBiaXQgc2V0CiAJCQkJICAgdGhhdCBhcmUgbm90IGJyb2FkY2FzdCBmcmFtZXMgKi8KLQl1MzIgcmJjYTsJCS8qIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgc3VjY2VzZnVsbHkKKwl1MzIgcmJjYTsJCS8qIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5CiAJCQkJICAgdGhhdCBoYWQgZGVzdGluYXRpb24gYWRkcmVzcyBlcXVhbCB0byB0aGUKIAkJCQkgICBicm9hZGNhc3QgYWRkcmVzcyAqLwogCXUzMiBzY2FyOwkJLyogU3RhdGlzdGljcyBjYXJyeSByZWdpc3RlciAqLwpAQCAtNzU5LDE1ICs3NTksMTUgQEAKIAkJCQkgICBmcmFtZXMpIHJlY2VpdmVkIHRoYXQgd2VyZSBiZXR3ZWVuIDEyOAogCQkJCSAgIChJbmNsdWRpbmcgRkNTIGxlbmd0aD09NCkgYW5kIDI1NSBvY3RldHMgKi8KIAl1MzIgdHhvazsJCS8qIFRvdGFsIG51bWJlciBvZiBvY3RldHMgcmVzaWRpbmcgaW4gZnJhbWVzCi0JCQkJICAgdGhhdCB3aGVyZSBpbnZvbHZlZCBpbiBzdWNjZXNmdWxsCisJCQkJICAgdGhhdCB3aGVyZSBpbnZvbHZlZCBpbiBzdWNjZXNzZnVsbAogCQkJCSAgIHRyYW5zbWlzc2lvbiAqLwogCXUxNiB0eGNmOwkJLyogVG90YWwgbnVtYmVyIG9mIFBBVVNFIGNvbnRyb2wgZnJhbWVzCiAJCQkJICAgdHJhbnNtaXR0ZWQgYnkgdGhpcyBNQUMgKi8KIAl1MzIgdG1jYTsJCS8qIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZXJlIHRyYW5zbWl0dGVkCi0JCQkJICAgc3VjY2VzZnVsbHkgd2l0aCB0aGUgZ3JvdXAgYWRkcmVzcyBiaXQgc2V0CisJCQkJICAgc3VjY2Vzc2Z1bGx5IHdpdGggdGhlIGdyb3VwIGFkZHJlc3MgYml0IHNldAogCQkJCSAgIHRoYXQgYXJlIG5vdCBicm9hZGNhc3QgZnJhbWVzICovCiAJdTMyIHRiY2E7CQkvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkCi0JCQkJICAgc3VjY2VzZnVsbHkgdGhhdCBoYWQgZGVzdGluYXRpb24gYWRkcmVzcworCQkJCSAgIHN1Y2Nlc3NmdWxseSB0aGF0IGhhZCBkZXN0aW5hdGlvbiBhZGRyZXNzCiAJCQkJICAgZmllbGQgZXF1YWwgdG8gdGhlIGJyb2FkY2FzdCBhZGRyZXNzICovCiAJdTMyIHJ4Zm9rOwkJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBPSyAqLwogCXUzMiByeGJvazsJCS8qIFRvdGFsIG51bWJlciBvZiBvY3RldHMgcmVjZWl2ZWQgT0sgKi8KQEAgLTc3Niw5ICs3NzYsOSBAQAogCQkJCSAgIEhXIGJlY2F1c2UgaXQgaW5jbHVkZXMgb2N0ZXRzIGluIGZyYW1lcyB0aGF0CiAJCQkJICAgbmV2ZXIgZXZlbiByZWFjaCB0aGUgVUNDICovCiAJdTMyIHJtY2E7CQkvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzIHRoYXQgd2VyZSByZWNlaXZlZAotCQkJCSAgIHN1Y2Nlc2Z1bGx5IHdpdGggdGhlIGdyb3VwIGFkZHJlc3MgYml0IHNldAorCQkJCSAgIHN1Y2Nlc3NmdWxseSB3aXRoIHRoZSBncm91cCBhZGRyZXNzIGJpdCBzZXQKIAkJCQkgICB0aGF0IGFyZSBub3QgYnJvYWRjYXN0IGZyYW1lcyAqLwotCXUzMiByYmNhOwkJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBzdWNjZXNmdWxseQorCXUzMiByYmNhOwkJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkKIAkJCQkgICB0aGF0IGhhZCBkZXN0aW5hdGlvbiBhZGRyZXNzIGVxdWFsIHRvIHRoZQogCQkJCSAgIGJyb2FkY2FzdCBhZGRyZXNzICovCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKaW5kZXggYzZjOTIyMi4uMGMzYzczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKQEAgLTc0OCw3ICs3NDgsNyBAQAogCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKIAogCWlmIChuZXRpZl9tc2dfaWZ1cChkZXYpKQotCQlkZXZkYmcoZGV2LCAicGh5IGluaXRpYWxpc2VkIHN1Y2Nlc2Z1bGx5Iik7CisJCWRldmRiZyhkZXYsICJwaHkgaW5pdGlhbGlzZWQgc3VjY2Vzc2Z1bGx5Iik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jCmluZGV4IGE3ZDRmYzEuLjBlNTI5OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCWlmIChwdmMtPmRsY2kgPT0gZGxjaSkKIAkJCXJldHVybiBwdmM7CiAJCWlmIChwdmMtPmRsY2kgPiBkbGNpKQotCQkJcmV0dXJuIE5VTEw7IC8qIHRoZSBsaXN0ZWQgaXMgc29ydGVkICovCisJCQlyZXR1cm4gTlVMTDsgLyogdGhlIGxpc3QgaXMgc29ydGVkICovCiAJCXB2YyA9IHB2Yy0+bmV4dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYwppbmRleCAyZWJlOTM1Li40YjZmMjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCkBAIC05MjcsNyArOTI3LDcgQEAKICAgICAgICAgc2MtPmxtY19tZWRpYSA9ICZsbWNfdDFfbWVkaWE7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExNQyBVTktPV04gQ0FSRCFcbiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExNQyBVTktOT1dOIENBUkQhXG4iLCBkZXYtPm5hbWUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMKaW5kZXggZTNkMmE5ZC4uN2RkYjE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMKQEAgLTExOTQsNyArMTE5NCw3IEBACiAgKiBkZXZpY2UuIFNlZSB0aGUgZmlsZSBoZWFkZXIgZm9yIHRoZSBmb3JtYXQuIFJ1biBhbGwgY2hlY2tzIG9uIHRoZQogICogYnVmZmVyIGhlYWRlciwgdGhlbiBydW4gb3ZlciBlYWNoIHBheWxvYWQncyBkZXNjcmlwdG9ycywgdmVyaWZ5CiAgKiB0aGVpciBjb25zaXN0ZW5jeSBhbmQgYWN0IG9uIGVhY2ggcGF5bG9hZCdzIGNvbnRlbnRzLiAgSWYKLSAqIGV2ZXJ5dGhpbmcgaXMgc3VjY2VzZnVsLCB1cGRhdGUgdGhlIGRldmljZSdzIHN0YXRpc3RpY3MuCisgKiBldmVyeXRoaW5nIGlzIHN1Y2Nlc3NmdWwsIHVwZGF0ZSB0aGUgZGV2aWNlJ3Mgc3RhdGlzdGljcy4KICAqCiAgKiBOb3RlOiBZb3UgbmVlZCB0byBzZXQgdGhlIHNrYiB0byBjb250YWluIG9ubHkgdGhlIGxlbmd0aCBvZiB0aGUKICAqIHJlY2VpdmVkIGJ1ZmZlcjsgZm9yIHRoYXQsIHVzZSBza2JfdHJpbShza2IsIFJFQ0VJVkVEX1NJWkUpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmgKaW5kZXggYjcyMzM4Yy4uOTUyYjNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5oCkBAIC0zNiw3ICszNiw3IEBACiAgKi8KIAogLyoKLSAqIERlZmludGlvbnMgZm9yIHRoZSBBdGhlcm9zIFdpcmVsZXNzIExBTiBjb250cm9sbGVyIGRyaXZlci4KKyAqIERlZmluaXRpb25zIGZvciB0aGUgQXRoZXJvcyBXaXJlbGVzcyBMQU4gY29udHJvbGxlciBkcml2ZXIuCiAgKi8KICNpZm5kZWYgX0RFVl9BVEhfQVRIVkFSX0gKICNkZWZpbmUgX0RFVl9BVEhfQVRIVkFSX0gKQEAgLTE5MCw3ICsxOTAsNyBAQAogCXN0cnVjdCBhdGg1a190eHEJKmNhYnE7CQkvKiBjb250ZW50IGFmdGVyIGJlYWNvbiAqLwogCiAJaW50IAkJCXBvd2VyX2xldmVsOwkvKiBSZXF1ZXN0ZWQgdHggcG93ZXIgaW4gZGJtICovCi0JYm9vbAkJCWFzc29jOwkJLyogYXNzb2NhdGUgc3RhdGUgKi8KKwlib29sCQkJYXNzb2M7CQkvKiBhc3NvY2lhdGUgc3RhdGUgKi8KIAlib29sCQkJZW5hYmxlX2JlYWNvbjsJLyogdHJ1ZSBpZiBiZWFjb25zIGFyZSBvbiAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jCmluZGV4IDY0NDk2MmEuLjgxZWE1MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMKQEAgLTE0OTIsNyArMTQ5Miw3IEBACiAgKiBUaGlzIGluZm8gaXMgdXNlZCB0byBjYWxpYnJhdGUgdGhlIGJhc2ViYW5kIHBvd2VyIHRhYmxlLiBJbWFnaW5lCiAgKiB0aGF0IGZvciBlYWNoIGNoYW5uZWwgdGhlcmUgaXMgYSBwb3dlciBjdXJ2ZSB0aGF0J3MgaHcgc3BlY2lmaWMKICAqIChkZXBlbmRzIG9uIGFtcGxpZmllciBldGMpIGFuZCB3ZSB0cnkgdG8gImNvcnJlY3QiIHRoaXMgY3VydmUgdXNpbmcKLSAqIG9mZmVzdHMgd2UgcGFzcyBvbiB0byBwaHkgY2hpcCAoYmFzZWJhbmQgLT4gYmVmb3JlIGFtcGxpZmllcikgc28gdGhhdAorICogb2Zmc2V0cyB3ZSBwYXNzIG9uIHRvIHBoeSBjaGlwIChiYXNlYmFuZCAtPiBiZWZvcmUgYW1wbGlmaWVyKSBzbyB0aGF0CiAgKiBpdCBjYW4gdXNlIGFjY3VyYXRlIHBvd2VyIHZhbHVlcyB3aGVuIHNldHRpbmcgdHggcG93ZXIgKHRha2VzIGFtcGxpZmllcidzCiAgKiBwZXJmb3JtYW5jZSBvbiBlYWNoIGNoYW5uZWwgaW50byBhY2NvdW50KS4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMKaW5kZXggYmJmZGNkNS4uNzI0NzRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAKIC8qCiAgKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBvcHRpbWl6ZSByZiBnYWluIG9uIGRpZmZlcmVudCBlbnZpcm9ubWVudHMKLSAqICh0ZW1wcmF0dXJlIG1vc3RseSkgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSBhIHBvd2VyIGRldGVjdG9yLgorICogKHRlbXBlcmF0dXJlIG1vc3RseSkgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSBhIHBvd2VyIGRldGVjdG9yLgogICoKICAqIEl0J3Mgb25seSB1c2VkIG9uIFJGNTExMSBhbmQgUkY1MTEyLCBsYXRlciBSRiBjaGlwcyBzZWVtIHRvIGhhdmUKICAqIGF1dG8gYWRqdXN0bWVudCBvbiBodyAtbm90aWNlIHRoZXkgaGF2ZSBhIG11Y2ggc21hbGxlciBCQU5LIDcgYW5kCkBAIC0yNzQ2LDcgKzI3NDYsNyBAQAogCQkvKiBGaWxsIGN1cnZlcyBpbiByZXZlcnNlIG9yZGVyCiAJCSAqIGZyb20gbG93ZXIgcG93ZXIgKG1heCBnYWluKQogCQkgKiB0byBoaWdoZXIgcG93ZXIuIFVzZSBjdXJ2ZSAtPiBpZHgKLQkJICogYmFja21hcGluZyB3ZSBkaWQgb24gZWVwcm9tIGluaXQgKi8KKwkJICogYmFja21hcHBpbmcgd2UgZGlkIG9uIGVlcHJvbSBpbml0ICovCiAJCXU4IGlkeCA9IHBkZ19jdXJ2ZV90b19pZHhbcGRnXTsKIAogCQkvKiBHcmFiIHRoZSBuZWVkZWQgY3VydmVzIGJ5IGluZGV4ICovCkBAIC0yODQ4LDcgKzI4NDgsNyBAQAogCS8qIE5vdyB3ZSBoYXZlIGEgc2V0IG9mIGN1cnZlcyBmb3IgdGhpcwogCSAqIGNoYW5uZWwgb24gdG1wTCAoeCByYW5nZSBpcyB0YWJsZV9tYXggLSB0YWJsZV9taW4KIAkgKiBhbmQgeSB2YWx1ZXMgYXJlIHRtcExbcGRnXVtdKSBzb3J0ZWQgaW4gdGhlIHNhbWUKLQkgKiBvcmRlciBhcyBFRVBST00gKGJlY2F1c2Ugd2UndmUgdXNlZCB0aGUgYmFja21hcGluZykuCisJICogb3JkZXIgYXMgRUVQUk9NIChiZWNhdXNlIHdlJ3ZlIHVzZWQgdGhlIGJhY2ttYXBwaW5nKS4KIAkgKiBTbyBmb3IgUkY1MTEyIGl0J3MgZnJvbSBoaWdoZXIgcG93ZXIgdG8gbG93ZXIgcG93ZXIKIAkgKiBhbmQgZm9yIFJGMjQxMyBpdCdzIGZyb20gbG93ZXIgcG93ZXIgdG8gaGlnaGVyIHBvd2VyLgogCSAqIEZvciBSRjUxMTEgd2Ugb25seSBoYXZlIG9uZSBjdXJ2ZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKaW5kZXggYzkxNTk1NC4uNzBmZGI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKQEAgLTg4MCw3ICs4ODAsNyBAQAogCQkJCSAqIFNpbmNlIHRoaXMgcHJvYmUgc3VjY2VlZGVkLCB3ZSBhbGxvdyB0aGUgbmV4dAogCQkJCSAqIHByb2JlIHR3aWNlIGFzIHNvb24uICBUaGlzIGFsbG93cyB0aGUgbWF4UmF0ZQogCQkJCSAqIHRvIG1vdmUgdXAgZmFzdGVyIGlmIHRoZSBwcm9iZXMgYXJlCi0JCQkJICogc3VjY2VzZnVsLgorCQkJCSAqIHN1Y2Nlc3NmdWwuCiAJCQkJICovCiAJCQkJYXRoX3JjX3ByaXYtPnByb2JlX3RpbWUgPQogCQkJCQlub3dfbXNlYyAtIHJhdGVfdGFibGUtPnByb2JlX2ludGVydmFsIC8gMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCmluZGV4IDA3NzQ4MGMuLjcxZTVjOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwpAQCAtMjk1NSw3ICsyOTU1LDcgQEAKIC8qIFBlcmlvZGljIHdvcmsgbG9ja2luZyBwb2xpY3k6CiAgKiAJVGhlIHdob2xlIHBlcmlvZGljIHdvcmsgaGFuZGxlciBpcyBwcm90ZWN0ZWQgYnkKICAqIAl3bC0+bXV0ZXguIElmIGFub3RoZXIgbG9jayBpcyBuZWVkZWQgc29tZXdoZXJlIGluIHRoZQotICogCXB3b3JrIGNhbGxjaGFpbiwgaXQncyBhcXVpcmVkIGluLXBsYWNlLCB3aGVyZSBpdCdzIG5lZWRlZC4KKyAqIAlwd29yayBjYWxsY2hhaW4sIGl0J3MgYWNxdWlyZWQgaW4tcGxhY2UsIHdoZXJlIGl0J3MgbmVlZGVkLgogICovCiBzdGF0aWMgdm9pZCBiNDNfcGVyaW9kaWNfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCmluZGV4IGFiNmExOGMuLjRhOTA1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYwpAQCAtMjI3Nyw3ICsyMjc3LDcgQEAKIC8qIFBlcmlvZGljIHdvcmsgbG9ja2luZyBwb2xpY3k6CiAgKiAJVGhlIHdob2xlIHBlcmlvZGljIHdvcmsgaGFuZGxlciBpcyBwcm90ZWN0ZWQgYnkKICAqIAl3bC0+bXV0ZXguIElmIGFub3RoZXIgbG9jayBpcyBuZWVkZWQgc29tZXdoZXJlIGluIHRoZQotICogCXB3b3JrIGNhbGxjaGFpbiwgaXQncyBhcXVpcmVkIGluLXBsYWNlLCB3aGVyZSBpdCdzIG5lZWRlZC4KKyAqIAlwd29yayBjYWxsY2hhaW4sIGl0J3MgYWNxdWlyZWQgaW4tcGxhY2UsIHdoZXJlIGl0J3MgbmVlZGVkLgogICovCiBzdGF0aWMgdm9pZCBiNDNsZWdhY3lfcGVyaW9kaWNfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMKaW5kZXggMTdhOWNiMy4uNTZhZmNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMKQEAgLTU3OCw3ICs1NzgsNyBAQAogCQkvKiBnZXQgbnVtYmVyIG9mIGVudHJpZXMgKi8KIAkJZmllbGRfY291bnQgPSAqKCgodTE2ICopICYgZmllbGRfaW5mbykgKyAxKTsKIAotCQkvKiBhYm9ydCBpZiBubyBlbm91Z2h0IG1lbW9yeSAqLworCQkvKiBhYm9ydCBpZiBubyBlbm91Z2ggbWVtb3J5ICovCiAJCXRvdGFsX2xlbmd0aCA9IGZpZWxkX2xlbiAqIGZpZWxkX2NvdW50OwogCQlpZiAodG90YWxfbGVuZ3RoID4gKmxlbikgewogCQkJKmxlbiA9IHRvdGFsX2xlbmd0aDsKQEAgLTMxMjcsNyArMzEyNyw3IEBACiAJCQkgICAgIElQV19NQVhfQkRTKSkgewogCQkJLyogVE9ETzogU3VwcG9ydCBtZXJnaW5nIGJ1ZmZlcnMgaWYgbW9yZSB0aGFuCiAJCQkgKiBJUFdfTUFYX0JEUyBhcmUgdXNlZCAqLwotCQkJSVBXX0RFQlVHX0lORk8oIiVzOiBNYXhpbXVtIEJEIHRoZXNob2xkIGV4Y2VlZGVkLiAgIgorCQkJSVBXX0RFQlVHX0lORk8oIiVzOiBNYXhpbXVtIEJEIHRocmVzaG9sZCBleGNlZWRlZC4gICIKIAkJCQkgICAgICAgIkluY3JlYXNlIGZyYWdtZW50YXRpb24gbGV2ZWwuXG4iLAogCQkJCSAgICAgICBwcml2LT5uZXRfZGV2LT5uYW1lKTsKIAkJfQpAQCAtNjg5Nyw3ICs2ODk3LDcgQEAKIAlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDc7CS8qIFVwZGF0ZWQgYWxsIHRocmVlICovCiAKIAlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDcwOwkvKiA+IDglIG1pc3NlZCBiZWFjb25zIGlzICdiYWQnICovCi0JLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2xkIHZhbHVlIGZvciBSU1NJICovCiAJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMjAgKyBJUFcyMTAwX1JTU0lfVE9fREJNOwogCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CiAJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OwkvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYwppbmRleCBjMjg5ODRhLi4wOWRkZDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYwpAQCAtNzkyLDcgKzc5Miw3IEBACiAJCS8qIGdldCBudW1iZXIgb2YgZW50cmllcyAqLwogCQlmaWVsZF9jb3VudCA9ICooKCh1MTYgKikgJiBmaWVsZF9pbmZvKSArIDEpOwogCi0JCS8qIGFib3J0IGlmIG5vdCBlbm91Z2h0IG1lbW9yeSAqLworCQkvKiBhYm9ydCBpZiBub3QgZW5vdWdoIG1lbW9yeSAqLwogCQl0b3RhbF9sZW4gPSBmaWVsZF9sZW4gKiBmaWVsZF9jb3VudDsKIAkJaWYgKHRvdGFsX2xlbiA+ICpsZW4pIHsKIAkJCSpsZW4gPSB0b3RhbF9sZW47CkBAIC03NzYwLDcgKzc3NjAsNyBAQAogCWNhc2UgU0VDX0xFVkVMXzA6CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5rbm93IHNlY3VyaXR5IGxldmVsICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gc2VjdXJpdHkgbGV2ZWwgJWRcbiIsCiAJCSAgICAgICBwcml2LT5pZWVlLT5zZWMubGV2ZWwpOwogCQlicmVhazsKIAl9CkBAIC04OTI2LDcgKzg5MjYsNyBAQAogCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsJLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNzA7Ci0JLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2xkIHZhbHVlIGZvciBSU1NJICovCiAJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMDsJLyogRklYTUUgdG8gcmVhbCBhdmVyYWdlIGxldmVsICovCiAJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKIAlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IDc7CS8qIFVwZGF0ZWQgYWxsIHRocmVlICovCkBAIC0xMDI5OSw3ICsxMDI5OSw3IEBACiAJCWNhc2UgU0VDX0xFVkVMXzA6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93IHNlY3VyaXR5IGxldmVsICVkXG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIHNlY3VyaXR5IGxldmVsICVkXG4iLAogCQkJICAgICAgIHByaXYtPmllZWUtPnNlYy5sZXZlbCk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfbW9kdWxlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19tb2R1bGUuYwppbmRleCBiZjIxZWIzLi4xYWUwYjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19tb2R1bGUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19tb2R1bGUuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJaWVlZS0+aG9zdF9kZWNyeXB0ID0gMTsKIAlpZWVlLT5ob3N0X21jX2RlY3J5cHQgPSAxOwogCi0JLyogSG9zdCBmcmFnZW1lbnRhdGlvbiBpbiBPcGVuIG1vZGUuIERlZmF1bHQgaXMgZW5hYmxlZC4KKwkvKiBIb3N0IGZyYWdtZW50YXRpb24gaW4gT3BlbiBtb2RlLiBEZWZhdWx0IGlzIGVuYWJsZWQuCiAJICogTm90ZTogaG9zdCBmcmFnbWVudGF0aW9uIGlzIGFsd2F5cyBlbmFibGVkIGlmIGhvc3QgZW5jcnlwdGlvbgogCSAqIGlzIGVuYWJsZWQuIEZvciBjYXJkcyBjYW4gZG8gaGFyZHdhcmUgZW5jcnlwdGlvbiwgdGhleSBtdXN0IGRvCiAJICogaGFyZHdhcmUgZnJhZ21lbnRhdGlvbiBhcyB3ZWxsLiBTbyB3ZSBkb24ndCBuZWVkIGEgdmFyaWFibGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9oYWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9oYWwuYwppbmRleCBjNDMwNDE4Li5kMTNjODg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvaGFsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2hhbC5jCkBAIC00MTEsNyArNDExLDcgQEAKIC8qCiAgKiBpd21faGFsX3NlbmRfaG9zdF9jbWQoKTogc2VuZHMgY29tbWFuZHMgdG8gdGhlIFVNQUMgb3IgdGhlIExNQUMuCiAgKiBTZW5kaW5nIGNvbW1hbmQgdG8gdGhlIExNQUMgaXMgZXF1aXZhbGVudCB0byBzZW5kaW5nIGEKLSAqIHJlZ3VsYXIgVU1BQyBjb21tYW5kIHdpdGggdGhlIExNQUMgcGFzc3Ryb3VnaCBvciB0aGUgTE1BQworICogcmVndWxhciBVTUFDIGNvbW1hbmQgd2l0aCB0aGUgTE1BQyBwYXNzdGhyb3VnaCBvciB0aGUgTE1BQwogICogd3JhcHBlciBVTUFDIGNvbW1hbmQgSURzLgogICovCiBpbnQgaXdtX2hhbF9zZW5kX2hvc3RfY21kKHN0cnVjdCBpd21fcHJpdiAqaXdtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvcnguYwppbmRleCA3MmMyN2EzZS4uMWM1N2MxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKQEAgLTE1NzgsNyArMTU3OCw3IEBACiAJCWtmcmVlX3NrYihwYWNrZXQtPnNrYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUlXTV9FUlIoaXdtLCAiVW5rbm93IHRpY2tldCBhY3Rpb246ICVkXG4iLAorCQlJV01fRVJSKGl3bSwgIlVua25vd24gdGlja2V0IGFjdGlvbjogJWRcbiIsCiAJCQlsZTE2X3RvX2NwdSh0aWNrZXRfbm9kZS0+dGlja2V0LT5hY3Rpb24pKTsKIAkJa2ZyZWVfc2tiKHBhY2tldC0+c2tiKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMKaW5kZXggMDlmY2ZhZC4uN2E3M2Y2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYwpAQCAtOTkzLDcgKzk5Myw3IEBACiAJfQogCiAJaWYgKGkgPT0gQVJSQVlfU0laRShpZl9zZGlvX21vZGVscykpIHsKLQkJbGJzX3ByX2VycigidW5rb3duIGNhcmQgbW9kZWwgMHgleFxuIiwgY2FyZC0+bW9kZWwpOworCQlsYnNfcHJfZXJyKCJ1bmtub3duIGNhcmQgbW9kZWwgMHgleFxuIiwgY2FyZC0+bW9kZWwpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lc19kbGQuYwppbmRleCBhM2VlZmUxLi44NDIwMGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lc19kbGQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lc19kbGQuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAKICNkZWZpbmUgREVGQVVMVF9QRFIocGlkKSBkZWZhdWx0X3Bkcl9kYXRhXyMjcGlkCiAKLS8qICBIV0lGIENvbXBhdGlibGl0eSAqLworLyogIEhXSUYgQ29tcGF0aWJpbGl0eSAqLwogREVGSU5FX0RFRkFVTFRfUERSKDB4MDAwNSwgMTAsICJceDAwXHgwMFx4MDZceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwIik7CiAKIC8qIFBQUFBTaWduICovCkBAIC02NTYsNyArNjU2LDcgQEAKIAkJCQkJIHJlY29yZF9pZCArIDEsIHBkaSk7CiAJCQl9CiAJCQlicmVhazsKLQkJY2FzZSAweDU6IC8qICBIV0lGIENvbXBhdGlibGl0eSAqLworCQljYXNlIDB4NTogLyogIEhXSUYgQ29tcGF0aWJpbGl0eSAqLwogCQkJZGVmYXVsdF9wZGkgPSAoc3RydWN0IHBkaSAqKSAmREVGQVVMVF9QRFIoMHgwMDA1KTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTA4OiAvKiBQUFBQU2lnbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKaW5kZXggYmMwODQ2NC4uZjdmNWM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCkBAIC0xODk3LDcgKzE4OTcsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiBTZXR0aW5nIHBvbGljeSBhbHNvIGNsZWFycyB0aGUgTUFDIGFjbCwgZXZlbiBpZiB3ZSBkb24ndCBjaGFuZ2UgdGhlIGRlZmF1dAorLyogU2V0dGluZyBwb2xpY3kgYWxzbyBjbGVhcnMgdGhlIE1BQyBhY2wsIGV2ZW4gaWYgd2UgZG9uJ3QgY2hhbmdlIHRoZSBkZWZhdWx0CiAgKiBwb2xpY3kKICAqLwogCkBAIC0yMzIzLDcgKzIzMjMsNyBAQAogCiAJY2FzZSBET1QxMV9PSURfQkVBQ09OOgogCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LAotCQkJCSAgICAgIlJlY2VpdmVkIGEgYmVhY29uIGZyb20gYW4gdW5rb3duIEFQIiwKKwkJCQkgICAgICJSZWNlaXZlZCBhIGJlYWNvbiBmcm9tIGFuIHVua25vd24gQVAiLAogCQkJCSAgICAgbWxtZSwgMCk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmgKaW5kZXggNmMyMWVmNi4uYzNkZWE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjQwMHBjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI0MDBwY2kuaApAQCAtMzUsNyArMzUsNyBAQAogCiAvKgogICogU2lnbmFsIGluZm9ybWF0aW9uLgotICogRGVmYXVsIG9mZnNldCBpcyByZXF1aXJlZCBmb3IgUlNTSSA8LT4gZEJtIGNvbnZlcnNpb24uCisgKiBEZWZhdWx0IG9mZnNldCBpcyByZXF1aXJlZCBmb3IgUlNTSSA8LT4gZEJtIGNvbnZlcnNpb24uCiAgKi8KICNkZWZpbmUgREVGQVVMVF9SU1NJX09GRlNFVAkJMTAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuaAppbmRleCBiMDA3NTY3Li5jNmJkMWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwcGNpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHBjaS5oCkBAIC00Niw3ICs0Niw3IEBACiAKIC8qCiAgKiBTaWduYWwgaW5mb3JtYXRpb24uCi0gKiBEZWZhdWwgb2Zmc2V0IGlzIHJlcXVpcmVkIGZvciBSU1NJIDwtPiBkQm0gY29udmVyc2lvbi4KKyAqIERlZmF1bHQgb2Zmc2V0IGlzIHJlcXVpcmVkIGZvciBSU1NJIDwtPiBkQm0gY29udmVyc2lvbi4KICAqLwogI2RlZmluZSBERUZBVUxUX1JTU0lfT0ZGU0VUCQkxMjEKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5oCmluZGV4IDM0MWE3MDQuLmI0OTMzMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogLyoKICAqIFNpZ25hbCBpbmZvcm1hdGlvbi4KLSAqIERlZmF1bCBvZmZzZXQgaXMgcmVxdWlyZWQgZm9yIFJTU0kgPC0+IGRCbSBjb252ZXJzaW9uLgorICogRGVmYXVsdCBvZmZzZXQgaXMgcmVxdWlyZWQgZm9yIFJTU0kgPC0+IGRCbSBjb252ZXJzaW9uLgogICovCiAjZGVmaW5lIERFRkFVTFRfUlNTSV9PRkZTRVQJCTEyMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuaAppbmRleCA2ZjMzZjdmLi44ZjEzODEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmgKQEAgLTM3LDcgKzM3LDcgQEAKIAogLyoKICAqIFNpZ25hbCBpbmZvcm1hdGlvbi4KLSAqIERlZmF1bCBvZmZzZXQgaXMgcmVxdWlyZWQgZm9yIFJTU0kgPC0+IGRCbSBjb252ZXJzaW9uLgorICogRGVmYXVsdCBvZmZzZXQgaXMgcmVxdWlyZWQgZm9yIFJTU0kgPC0+IGRCbSBjb252ZXJzaW9uLgogICovCiAjZGVmaW5lIERFRkFVTFRfUlNTSV9PRkZTRVQJCTEyMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuaAppbmRleCBlNzgzYTA5Li43OTQyZjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmgKQEAgLTM3LDcgKzM3LDcgQEAKIAogLyoKICAqIFNpZ25hbCBpbmZvcm1hdGlvbi4KLSAqIERlZmF1bCBvZmZzZXQgaXMgcmVxdWlyZWQgZm9yIFJTU0kgPC0+IGRCbSBjb252ZXJzaW9uLgorICogRGVmYXVsdCBvZmZzZXQgaXMgcmVxdWlyZWQgZm9yIFJTU0kgPC0+IGRCbSBjb252ZXJzaW9uLgogICovCiAjZGVmaW5lIERFRkFVTFRfUlNTSV9PRkZTRVQJCTEyMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCmluZGV4IDhhMjQzNzMuLmNmNTFlOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCkBAIC0zNzQsNyArMzc0LDcgQEAKICAqIHpkX21hY190eF9mYWlsZWQgLSBjYWxsYmFjayBmb3IgZmFpbGVkIGZyYW1lcwogICogQGRldjogdGhlIG1hYzgwMjExIHdpcmVsZXNzIGRldmljZQogICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIGEgZnJhbWUgY291bGRuJ3QgYmUgc3VjY2VzZnVsbHkgYmUKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIGEgZnJhbWUgY291bGRuJ3QgYmUgc3VjY2Vzc2Z1bGx5IGJlCiAgKiB0cmFuc2ZlcnJlZC4gVGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHR4IHF1ZXVlLCB3aWxsIGJlIHNlbGVjdGVkIGFuZAogICogcmVwb3J0ZWQgYXMgZXJyb3IgdG8gdGhlIHVwcGVyIGxheWVycy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYyBiL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKaW5kZXggYTZiNGE1YS4uZjUxMWU3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYworKysgYi9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCkBAIC02NTAsNyArNjUwLDcgQEAKICAqIE1hcmsgdGhlIEkvTyBQZGlyIGVudHJpZXMgaW52YWxpZCBhbmQgYmxvdyBhd2F5IHRoZSBjb3JyZXNwb25kaW5nIEkvTwogICogVExCIGVudHJpZXMuCiAgKgotICogRklYTUU6IGF0IHNvbWUgdGhyZXNoaG9sZCBpdCBtaWdodCBiZSAiY2hlYXBlciIgdG8ganVzdCBibG93CisgKiBGSVhNRTogYXQgc29tZSB0aHJlc2hvbGQgaXQgbWlnaHQgYmUgImNoZWFwZXIiIHRvIGp1c3QgYmxvdwogICogICAgICAgIGF3YXkgdGhlIGVudGlyZSBJL08gVExCIGluc3RlYWQgb2YgaW5kaXZpZHVhbCBlbnRyaWVzLgogICoKICAqIEZJWE1FOiBVdHVybiBoYXMgMjU2IFRMQiBlbnRyaWVzLiBXZSBkb24ndCBuZWVkIHRvIHB1cmdlIGV2ZXJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9laXNhX2VlcHJvbS5jIGIvZHJpdmVycy9wYXJpc2MvZWlzYV9lZXByb20uYwppbmRleCA4YzBiMjZlOS4uY2NlMDBlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvZWlzYV9lZXByb20uYworKysgYi9kcml2ZXJzL3BhcmlzYy9laXNhX2VlcHJvbS5jCkBAIC03NSwxNyArNzUsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZWlzYV9lZXByb21faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAotCQkJICAgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXJldHVybiAtRU5PVFRZOwotfQotCiBzdGF0aWMgaW50IGVpc2FfZWVwcm9tX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JY3ljbGVfa2VybmVsX2xvY2soKTsKLQogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAgICAKQEAgLTEwNCw3ICs5NSw2IEBACiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLmxsc2VlayA9CWVpc2FfZWVwcm9tX2xsc2VlaywKIAkucmVhZCA9CQllaXNhX2VlcHJvbV9yZWFkLAotCS5pb2N0bCA9CWVpc2FfZWVwcm9tX2lvY3RsLAogCS5vcGVuID0JCWVpc2FfZWVwcm9tX29wZW4sCiAJLnJlbGVhc2UgPQllaXNhX2VlcHJvbV9yZWxlYXNlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKaW5kZXggYTczMDI4ZS4uMGYzMjU3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCQlyZXR1cm4gZm91bmQ7CiAKIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgMSwKLQkJCSAgICBjaGVja19ob3RwbHVnLCAodm9pZCAqKSZmb3VuZCwgTlVMTCk7CisJCQkgICAgY2hlY2tfaG90cGx1ZywgTlVMTCwgKHZvaWQgKikmZm91bmQsIE5VTEwpOwogCXJldHVybiBmb3VuZDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfcGNpX2RldGVjdF9lamVjdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggNThkMjVhMS4uZGYxYjBlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCkBAIC0yNjYsNyArMjY2LDcgQEAKIAlpbnQgZm91bmQgPSBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKGhhbmRsZSk7CiAJaWYgKCFmb3VuZCkgewogCQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgKHUzMikxLAotCQkJCSAgICBpc19wY2lfZG9ja19kZXZpY2UsICh2b2lkICopJmZvdW5kLCBOVUxMKTsKKwkJCQkgICAgaXNfcGNpX2RvY2tfZGV2aWNlLCBOVUxMLCAodm9pZCAqKSZmb3VuZCwgTlVMTCk7CiAJfQogCXJldHVybiBmb3VuZDsKIH0KQEAgLTI4MSw3ICsyODEsNyBAQAogCiAJLyogcmVnaXN0ZXIgYWxsIHNsb3Qgb2JqZWN0cyB1bmRlciB0aGlzIGJyaWRnZSAqLwogCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgYnJpZGdlLT5oYW5kbGUsICh1MzIpMSwKLQkJCQkgICAgIHJlZ2lzdGVyX3Nsb3QsIGJyaWRnZSwgTlVMTCk7CisJCQkJICAgICByZWdpc3Rlcl9zbG90LCBOVUxMLCBicmlkZ2UsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlsaXN0X2RlbCgmYnJpZGdlLT5saXN0KTsKIAkJcmV0dXJuOwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAKIAkvKiBzZWFyY2ggUDJQIGJyaWRnZXMgdW5kZXIgdGhpcyBwMnAgYnJpZGdlICovCiAJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsICh1MzIpMSwKLQkJCQkgICAgIGZpbmRfcDJwX2JyaWRnZSwgTlVMTCwgTlVMTCk7CisJCQkJICAgICBmaW5kX3AycF9icmlkZ2UsIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJd2FybigiZmluZF9wMnBfYnJpZGdlIGZhaWxlZCAoZXJyb3IgY29kZSA9IDB4JXgpXG4iLCBzdGF0dXMpOwogCkBAIC00ODUsNyArNDg1LDcgQEAKIAogCS8qIHNlYXJjaCBQMlAgYnJpZGdlcyB1bmRlciB0aGlzIGhvc3QgYnJpZGdlICovCiAJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsICh1MzIpMSwKLQkJCQkgICAgIGZpbmRfcDJwX2JyaWRnZSwgTlVMTCwgTlVMTCk7CisJCQkJICAgICBmaW5kX3AycF9icmlkZ2UsIE5VTEwsIE5VTEwsIE5VTEwpOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQl3YXJuKCJmaW5kX3AycF9icmlkZ2UgZmFpbGVkIChlcnJvciBjb2RlID0gMHgleClcbiIsIHN0YXR1cyk7CkBAIC01NzMsNyArNTczLDcgQEAKIAkvKiBjbGVhbnVwIHAycCBicmlkZ2VzIHVuZGVyIHRoaXMgUDJQIGJyaWRnZQogCSAgIGluIGEgZGVwdGgtZmlyc3QgbWFubmVyICovCiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsICh1MzIpMSwKLQkJCQljbGVhbnVwX3AycF9icmlkZ2UsIE5VTEwsIE5VTEwpOworCQkJCWNsZWFudXBfcDJwX2JyaWRnZSwgTlVMTCwgTlVMTCwgTlVMTCk7CiAKIAlicmlkZ2UgPSBhY3BpcGhwX2hhbmRsZV90b19icmlkZ2UoaGFuZGxlKTsKIAlpZiAoYnJpZGdlKQpAQCAtNTg5LDcgKzU4OSw3IEBACiAJLyogY2xlYW51cCBwMnAgYnJpZGdlcyB1bmRlciB0aGlzIGhvc3QgYnJpZGdlCiAJICAgaW4gYSBkZXB0aC1maXJzdCBtYW5uZXIgKi8KIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwKLQkJCQkodTMyKTEsIGNsZWFudXBfcDJwX2JyaWRnZSwgTlVMTCwgTlVMTCk7CisJCQkJKHUzMikxLCBjbGVhbnVwX3AycF9icmlkZ2UsIE5VTEwsIE5VTEwsIE5VTEwpOwogCiAJLyoKIAkgKiBPbiByb290IGJyaWRnZXMgd2l0aCBob3RwbHVnIHNsb3RzIGRpcmVjdGx5IHVuZGVybmVhdGggKGllLApAQCAtNzc4LDcgKzc3OCw3IEBACiB7CiAJaW9hcGljX2FkZChoYW5kbGUsIDAsIE5VTEwsIE5VTEwpOwogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgaGFuZGxlLAotCQkJICAgIEFDUElfVUlOVDMyX01BWCwgaW9hcGljX2FkZCwgTlVMTCwgTlVMTCk7CisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBpb2FwaWNfYWRkLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzg2LDcgKzc4Niw3IEBACiB7CiAJaW9hcGljX3JlbW92ZShoYW5kbGUsIDAsIE5VTEwsIE5VTEwpOwogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgaGFuZGxlLAotCQkJICAgIEFDUElfVUlOVDMyX01BWCwgaW9hcGljX3JlbW92ZSwgTlVMTCwgTlVMTCk7CisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBpb2FwaWNfcmVtb3ZlLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM2Nyw3ICsxMzY3LDcgQEAKIAlicmlkZ2UgPSBhY3BpcGhwX2hhbmRsZV90b19icmlkZ2UoaGFuZGxlKTsKIAlpZiAodHlwZSA9PSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0spIHsKIAkJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsIEFDUElfVUlOVDMyX01BWCwKLQkJCWNvdW50X3N1Yl9icmlkZ2VzLCAmbnVtX3N1Yl9icmlkZ2VzLCBOVUxMKTsKKwkJCWNvdW50X3N1Yl9icmlkZ2VzLCBOVUxMLCAmbnVtX3N1Yl9icmlkZ2VzLCBOVUxMKTsKIAl9CiAKIAlpZiAoIWJyaWRnZSAmJiAhbnVtX3N1Yl9icmlkZ2VzKSB7CkBAIC0xMzg4LDcgKzEzODgsNyBAQAogCQl9CiAJCWlmIChudW1fc3ViX2JyaWRnZXMpCiAJCQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwKLQkJCQlBQ1BJX1VJTlQzMl9NQVgsIGNoZWNrX3N1Yl9icmlkZ2VzLCBOVUxMLCBOVUxMKTsKKwkJCQlBQ1BJX1VJTlQzMl9NQVgsIGNoZWNrX3N1Yl9icmlkZ2VzLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKQEAgLTE1MTIsNyArMTUxMiw3IEBACiAJaW50IG51bSA9IDA7CiAKIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQlBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfcm9vdF9icmlkZ2VzLCAmbnVtLCBOVUxMKTsKKwkJCUFDUElfVUlOVDMyX01BWCwgZmluZF9yb290X2JyaWRnZXMsIE5VTEwsICZudW0sIE5VTEwpOwogCiAJaWYgKG51bSA8PSAwKQogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKaW5kZXggZTdiZTY2ZC4uYWE1ZGY0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYwpAQCAtNDM0LDcgKzQzNCw3IEBACiAJZGJnKCIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCUFDUElfVUlOVDMyX01BWCwgaWJtX2ZpbmRfYWNwaV9kZXZpY2UsCisJCQlBQ1BJX1VJTlQzMl9NQVgsIGlibV9maW5kX2FjcGlfZGV2aWNlLCBOVUxMLAogCQkJJmlibV9hY3BpX2hhbmRsZSwgTlVMTCkgIT0gRk9VTkRfQVBDSSkgewogCQllcnIoIiVzOiBhY3BpX3dhbGtfbmFtZXNwYWNlIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlyZXR2YWwgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9LY29uZmlnIGIvZHJpdmVycy9wbGF0Zm9ybS9LY29uZmlnCmluZGV4IDk2NTJjM2YuLjgzOTBkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL3BsYXRmb3JtL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGRyaXZlcnMvcGxhdGZvcm0vS2NvbmZpZwotCiBpZiBYODYKIHNvdXJjZSAiZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZyIKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9tZW5sb3cuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX21lbmxvdy5jCmluZGV4IDI5NDMyYTUuLmYwYTkwYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX21lbmxvdy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX21lbmxvdy5jCkBAIC01MTAsNyArNTEwLDcgQEAKIAkvKiBMb29raW5nIGZvciBzZW5zb3JzIGluIGVhY2ggQUNQSSB0aGVybWFsIHpvbmUgKi8KIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9USEVSTUFMLCBBQ1BJX1JPT1RfT0JKRUNULAogCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAotCQkJCSAgICAgaW50ZWxfbWVubG93X3JlZ2lzdGVyX3NlbnNvciwgTlVMTCwgTlVMTCk7CisJCQkJICAgICBpbnRlbF9tZW5sb3dfcmVnaXN0ZXJfc2Vuc29yLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYwppbmRleCBhMmE3NDJjLi43YTJjYzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAKIAlpZiAoZGVidWcpIHsKIAkJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfTUVUSE9ELCBzb255X25jX2FjcGlfaGFuZGxlLAotCQkJCQkgICAgIDEsIHNvbnlfd2Fsa19jYWxsYmFjaywgTlVMTCwgTlVMTCk7CisJCQkJCSAgICAgMSwgc29ueV93YWxrX2NhbGxiYWNrLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byB3YWxrIGFjcGkgcmVzb3VyY2VzXG4iKTsKIAkJCXJlc3VsdCA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKaW5kZXggYTg0OGM3ZS4uMGVkODQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwpAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKIAkgKi8KIAogCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgdmlkX2hhbmRsZSwgMywKLQkJCQkgICAgIHRwYWNwaV9hY3BpX3dhbGtfZmluZF9iY2wsIE5VTEwsCisJCQkJICAgICB0cGFjcGlfYWNwaV93YWxrX2ZpbmRfYmNsLCBOVUxMLCBOVUxMLAogCQkJCSAgICAgJmJjbF9wdHIpOwogCiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIGJjbF9sZXZlbHMgPiAyKSB7CkBAIC02NTQ1LDcgKzY1NDUsNyBAQAogICogCVRoZSBzcGVlZHMgYXJlIHN0b3JlZCBvbiBoYW5kbGVzCiAgKiAJKEZBTkE6RkFOOSksIChGQU5DOkZBTkIpLCAoRkFORTpGQU5EKS4KICAqCi0gKiAJVGhlcmUgYXJlIHRocmVlIGRlZmF1bHQgc3BlZWQgc2V0cywgYWNlc3NpYmxlIGFzIGhhbmRsZXM6CisgKiAJVGhlcmUgYXJlIHRocmVlIGRlZmF1bHQgc3BlZWQgc2V0cywgYWNjZXNzaWJsZSBhcyBoYW5kbGVzOgogICogCUZTMUwsRlMxTSxGUzFIOyBGUzJMLEZTMk0sRlMySDsgRlMzTCxGUzNNLEZTM0gKICAqCiAgKiAJQUNQSSBEU0RUIHN3aXRjaGVzIHdoaWNoIHNldCBpcyBpbiB1c2UgZGVwZW5kaW5nIG9uIHZhcmlvdXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYwppbmRleCA4N2I0ZjQ5Li5hNTEzNWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAkJCXJldHVybiAodW5zaWduZWQgY2hhciAqKXA7CiAJCQlicmVhazsKIAotCQlkZWZhdWx0OgkvKiBhbiB1bmtvd24gdGFnICovCisJCWRlZmF1bHQ6CS8qIGFuIHVua25vd24gdGFnICovCiBsZW5fZXJyOgogCQkJZGV2X2VycigmZGV2LT5kZXYsICJ1bmtub3duIHRhZyAlI3ggbGVuZ3RoICVkXG4iLAogCQkJCXRhZywgbGVuKTsKQEAgLTQwNSw3ICs0MDUsNyBAQAogCQljYXNlIFNNQUxMX1RBR19FTkQ6CiAJCQlyZXR1cm4gcCArIDI7CiAKLQkJZGVmYXVsdDoJLyogYW4gdW5rb3duIHRhZyAqLworCQlkZWZhdWx0OgkvKiBhbiB1bmtub3duIHRhZyAqLwogbGVuX2VycjoKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5rbm93biB0YWcgJSN4IGxlbmd0aCAlZFxuIiwKIAkJCQl0YWcsIGxlbik7CkBAIC00NzUsNyArNDc1LDcgQEAKIAkJCXJldHVybiAodW5zaWduZWQgY2hhciAqKXA7CiAJCQlicmVhazsKIAotCQlkZWZhdWx0OgkvKiBhbiB1bmtvd24gdGFnICovCisJCWRlZmF1bHQ6CS8qIGFuIHVua25vd24gdGFnICovCiBsZW5fZXJyOgogCQkJZGV2X2VycigmZGV2LT5kZXYsICJ1bmtub3duIHRhZyAlI3ggbGVuZ3RoICVkXG4iLAogCQkJCXRhZywgbGVuKTsKQEAgLTc0NCw3ICs3NDQsNyBAQAogCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyICopcDsKIAkJCWJyZWFrOwogCi0JCWRlZmF1bHQ6CS8qIGFuIHVua293biB0YWcgKi8KKwkJZGVmYXVsdDoJLyogYW4gdW5rbm93biB0YWcgKi8KIGxlbl9lcnI6CiAJCQlkZXZfZXJyKCZkZXYtPmRldiwgInVua25vd24gdGFnICUjeCBsZW5ndGggJWRcbiIsCiAJCQkJdGFnLCBsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvcHMzLXN5cy1tYW5hZ2VyLmMgYi9kcml2ZXJzL3BzMy9wczMtc3lzLW1hbmFnZXIuYwppbmRleCA4OGNiNzQwLi4zY2JhZjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczMtc3lzLW1hbmFnZXIuYworKysgYi9kcml2ZXJzL3BzMy9wczMtc3lzLW1hbmFnZXIuYwpAQCAtNDYsNyArNDYsNyBAQAogLyoqCiAgKiBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciAtIFN5c3RlbSBtYW5hZ2VyIG1lc3NhZ2UgaGVhZGVyLgogICogQHZlcnNpb246IEhlYWRlciB2ZXJzaW9uLCBjdXJyZW50bHkgMS4KLSAqIEBzaXplOiBIZWFkZXIgc2l6ZSBpbiBieXRlcywgY3VyZW50bHkgMTYuCisgKiBAc2l6ZTogSGVhZGVyIHNpemUgaW4gYnl0ZXMsIGN1cnJlbnRseSAxNi4KICAqIEBwYXlsb2FkX3NpemU6IE1lc3NhZ2UgcGF5bG9hZCBzaXplIGluIGJ5dGVzLgogICogQHNlcnZpY2VfaWQ6IE1lc3NhZ2UgdHlwZSwgb25lIG9mIGVudW0gcHMzX3N5c19tYW5hZ2VyX3NlcnZpY2VfaWQuCiAgKiBAcmVxdWVzdF90YWc6IFVuaXF1ZSBudW1iZXIgdG8gaWRlbnRpZnkgcmVwbHkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzAyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzAyLmMKaW5kZXggZDQ5MDYyOC4uMWU3M2M4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwMi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDIuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCS5uYW1lCT0gRFJWX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCi0JLnJlbW92ZQkJPSBfX2V4aXRfcChkczEzMDJfcnRjX3JlbW92ZSksCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczEzMDJfcnRjX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBkczEzMDJfcnRjX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwppbmRleCAwYjZiNzczLi41Mzk2NzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCkBAIC0yLDcgKzIsNyBAQAogICogQW4gcnRjIGRyaXZlciBmb3IgdGhlIERhbGxhcyBEUzE1MTEKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFNoYXJwIDxhbmR5LnNoYXJwQG9uc3Rvci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFNoYXJwIDxhbmR5LnNoYXJwQGxzaS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC02MzYsNyArNjM2LDcgQEAKIG1vZHVsZV9pbml0KGRzMTUxMV9ydGNfaW5pdCk7CiBtb2R1bGVfZXhpdChkczE1MTFfcnRjX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJBbmRyZXcgU2hhcnAgPGFuZHkuc2hhcnBAb25zdG9yLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJldyBTaGFycCA8YW5keS5zaGFycEBsc2kuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEYWxsYXMgRFMxNTExIFJUQyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jIGIvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMKaW5kZXggN2QxNTQ3Yi4uZDQ5MWViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCS53cml0ZSA9IHN0azE3dGE4X252cmFtX3dyaXRlLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc3RrMTd0YThfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdGsxN3RhOF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXYzMDIwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYwppbmRleCA0MjNjZDVhLi5hZDc0MWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJCWdvdG8gZXJyX2lvOwogCX0KIAotCS8qIE1ha2Ugc3VyZSBmcmVxdWVuY3kgbWVhc3VybWVudCBtb2RlLCB0ZXN0IG1vZGVzLCBhbmQgbG9jaworCS8qIE1ha2Ugc3VyZSBmcmVxdWVuY3kgbWVhc3VyZW1lbnQgbW9kZSwgdGVzdCBtb2RlcywgYW5kIGxvY2sKIAkgKiBhcmUgYWxsIGRpc2FibGVkICovCiAJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9TVEFUVVNfMCwgMHgwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggYWFjY2M4ZS4uZmRiMmU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vaWRhbHMuaD4KLSNpbmNsdWRlIDxhc20vdG9kY2xrLmg+CiAjaW5jbHVkZSA8YXNtL2l0Y3cuaD4KIAogLyogVGhpcyBpcyB1Z2x5Li4uICovCkBAIC02NCw2ICs2Myw3IEBACiBzdGF0aWMgdm9pZCBkYXNkX3JldHVybl9jcXJfY2Ioc3RydWN0IGRhc2RfY2N3X3JlcSAqLCB2b2lkICopOwogc3RhdGljIHZvaWQgZGFzZF9kZXZpY2VfdGltZW91dCh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyB2b2lkIGRhc2RfYmxvY2tfdGltZW91dCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIF9fZGFzZF9wcm9jZXNzX2VycChzdHJ1Y3QgZGFzZF9kZXZpY2UgKiwgc3RydWN0IGRhc2RfY2N3X3JlcSAqKTsKIAogLyoKICAqIFNFQ1RJT046IE9wZXJhdGlvbnMgb24gdGhlIGRldmljZSBzdHJ1Y3R1cmUuCkBAIC05NjAsNyArOTYwLDcgQEAKIAlkZXZpY2UgPSAoc3RydWN0IGRhc2RfZGV2aWNlICopIHB0cjsKIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwgZmxhZ3MpOwogCS8qIHJlLWFjdGl2YXRlIHJlcXVlc3QgcXVldWUgKi8KLSAgICAgICAgZGV2aWNlLT5zdG9wcGVkICY9IH5EQVNEX1NUT1BQRURfUEVORElORzsKKwlkYXNkX2RldmljZV9yZW1vdmVfc3RvcF9iaXRzKGRldmljZSwgREFTRF9TVE9QUEVEX1BFTkRJTkcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGRldmljZS0+Y2RldiksIGZsYWdzKTsKIAlkYXNkX3NjaGVkdWxlX2RldmljZV9iaChkZXZpY2UpOwogfQpAQCAtOTk0LDEwICs5OTQsOSBAQAogCQlyZXR1cm47CiAJY3FyID0gKHN0cnVjdCBkYXNkX2Njd19yZXEgKikgaW50cGFybTsKIAlpZiAoY3FyLT5zdGF0dXMgIT0gREFTRF9DUVJfSU5fSU8pIHsKLQkJREJGX0VWRU5UKERCRl9ERUJVRywKLQkJCSJpbnZhbGlkIHN0YXR1cyBpbiBoYW5kbGVfa2lsbGVkX3JlcXVlc3Q6ICIKLQkJCSJidXNfaWQgJXMsIHN0YXR1cyAlMDJ4IiwKLQkJCWRldl9uYW1lKCZjZGV2LT5kZXYpLCBjcXItPnN0YXR1cyk7CisJCURCRl9FVkVOVF9ERVZJRChEQkZfREVCVUcsIGNkZXYsCisJCQkJImludmFsaWQgc3RhdHVzIGluIGhhbmRsZV9raWxsZWRfcmVxdWVzdDogIgorCQkJCSIlMDJ4IiwgY3FyLT5zdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDIzLDcgKzEwMjIsNyBAQAogCS8qIEZpcnN0IG9mIGFsbCBzdGFydCBzZW5zZSBzdWJzeXN0ZW0gc3RhdHVzIHJlcXVlc3QuICovCiAJZGFzZF9lZXJfc25zcyhkZXZpY2UpOwogCi0JZGV2aWNlLT5zdG9wcGVkICY9IH5EQVNEX1NUT1BQRURfUEVORElORzsKKwlkYXNkX2RldmljZV9yZW1vdmVfc3RvcF9iaXRzKGRldmljZSwgREFTRF9TVE9QUEVEX1BFTkRJTkcpOwogCWRhc2Rfc2NoZWR1bGVfZGV2aWNlX2JoKGRldmljZSk7CiAJaWYgKGRldmljZS0+YmxvY2spCiAJCWRhc2Rfc2NoZWR1bGVfYmxvY2tfYmgoZGV2aWNlLT5ibG9jayk7CkBAIC0xMDQ1LDEyICsxMDQ0LDEzIEBACiAJCWNhc2UgLUVJTzoKIAkJCWJyZWFrOwogCQljYXNlIC1FVElNRURPVVQ6Ci0JCQlEQkZfRVZFTlQoREJGX1dBUk5JTkcsICIlcyglcyk6IHJlcXVlc3QgdGltZWQgb3V0XG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CisJCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGNkZXYsICIlczogIgorCQkJCQkicmVxdWVzdCB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJREJGX0VWRU5UKERCRl9XQVJOSU5HLCAiJXMoJXMpOiB1bmtub3duIGVycm9yICVsZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgZGV2X25hbWUoJmNkZXYtPmRldiksIFBUUl9FUlIoaXJiKSk7CisJCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGNkZXYsICIlczogIgorCQkJCQkidW5rbm93biBlcnJvciAlbGRcbiIsIF9fZnVuY19fLAorCQkJCQlQVFJfRVJSKGlyYikpOwogCQl9CiAJCWRhc2RfaGFuZGxlX2tpbGxlZF9yZXF1ZXN0KGNkZXYsIGludHBhcm0pOwogCQlyZXR1cm47CkBAIC0xNDA1LDYgKzE0MDUsMjAgQEAKIAl0YXNrbGV0X2hpX3NjaGVkdWxlKCZkZXZpY2UtPnRhc2tsZXQpOwogfQogCit2b2lkIGRhc2RfZGV2aWNlX3NldF9zdG9wX2JpdHMoc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UsIGludCBiaXRzKQoreworCWRldmljZS0+c3RvcHBlZCB8PSBiaXRzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGFzZF9kZXZpY2Vfc2V0X3N0b3BfYml0cyk7CisKK3ZvaWQgZGFzZF9kZXZpY2VfcmVtb3ZlX3N0b3BfYml0cyhzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSwgaW50IGJpdHMpCit7CisJZGV2aWNlLT5zdG9wcGVkICY9IH5iaXRzOworCWlmICghZGV2aWNlLT5zdG9wcGVkKQorCQl3YWtlX3VwKCZnZW5lcmljX3dhaXRxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRhc2RfZGV2aWNlX3JlbW92ZV9zdG9wX2JpdHMpOworCiAvKgogICogUXVldWUgYSByZXF1ZXN0IHRvIHRoZSBoZWFkIG9mIHRoZSBkZXZpY2UgY2N3X3F1ZXVlLgogICogU3RhcnQgdGhlIEkvTyBpZiBwb3NzaWJsZS4KQEAgLTE0NjUsMjggKzE0NzksMTI2IEBACiB9CiAKIC8qCisgKiBjaGVja3MgaWYgZXJyb3IgcmVjb3ZlcnkgaXMgbmVjZXNzYXJ5LCByZXR1cm5zIDEgaWYgeWVzLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBfX2Rhc2Rfc2xlZXBfb25fZXJwKHN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcikKK3sKKwlzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZTsKKwlkYXNkX2VycF9mbl90IGVycF9mbjsKKworCWlmIChjcXItPnN0YXR1cyA9PSBEQVNEX0NRUl9GSUxMRUQpCisJCXJldHVybiAwOworCWRldmljZSA9IGNxci0+c3RhcnRkZXY7CisJaWYgKHRlc3RfYml0KERBU0RfQ1FSX0ZMQUdTX1VTRV9FUlAsICZjcXItPmZsYWdzKSkgeworCQlpZiAoY3FyLT5zdGF0dXMgPT0gREFTRF9DUVJfVEVSTUlOQVRFRCkgeworCQkJZGV2aWNlLT5kaXNjaXBsaW5lLT5oYW5kbGVfdGVybWluYXRlZF9yZXF1ZXN0KGNxcik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoY3FyLT5zdGF0dXMgPT0gREFTRF9DUVJfTkVFRF9FUlApIHsKKwkJCWVycF9mbiA9IGRldmljZS0+ZGlzY2lwbGluZS0+ZXJwX2FjdGlvbihjcXIpOworCQkJZXJwX2ZuKGNxcik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoY3FyLT5zdGF0dXMgPT0gREFTRF9DUVJfRkFJTEVEKQorCQkJZGFzZF9sb2dfc2Vuc2UoY3FyLCAmY3FyLT5pcmIpOworCQlpZiAoY3FyLT5yZWZlcnMpIHsKKwkJCV9fZGFzZF9wcm9jZXNzX2VycChkZXZpY2UsIGNxcik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2Rhc2Rfc2xlZXBfb25fbG9vcF9jb25kaXRpb24oc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyKQoreworCWlmICh0ZXN0X2JpdChEQVNEX0NRUl9GTEFHU19VU0VfRVJQLCAmY3FyLT5mbGFncykpIHsKKwkJaWYgKGNxci0+cmVmZXJzKSAvKiBlcnAgaXMgbm90IGRvbmUgeWV0ICovCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuICgoY3FyLT5zdGF0dXMgIT0gREFTRF9DUVJfRE9ORSkgJiYKKwkJCShjcXItPnN0YXR1cyAhPSBEQVNEX0NRUl9GQUlMRUQpKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChjcXItPnN0YXR1cyA9PSBEQVNEX0NRUl9GSUxMRUQpOworfQorCitzdGF0aWMgaW50IF9kYXNkX3NsZWVwX29uKHN0cnVjdCBkYXNkX2Njd19yZXEgKm1haW5jcXIsIGludCBpbnRlcnJ1cHRpYmxlKQoreworCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOworCWludCByYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNjd19xdWV1ZTsKKwlzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXI7CisKKwlJTklUX0xJU1RfSEVBRCgmY2N3X3F1ZXVlKTsKKwltYWluY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7CisJZGV2aWNlID0gbWFpbmNxci0+c3RhcnRkZXY7CisJbGlzdF9hZGQoJm1haW5jcXItPmJsb2NrbGlzdCwgJmNjd19xdWV1ZSk7CisJZm9yIChjcXIgPSBtYWluY3FyOyAgX19kYXNkX3NsZWVwX29uX2xvb3BfY29uZGl0aW9uKGNxcik7CisJICAgICBjcXIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjY3dfcXVldWUsCisJCQkJICAgIHN0cnVjdCBkYXNkX2Njd19yZXEsIGJsb2NrbGlzdCkpIHsKKworCQlpZiAoX19kYXNkX3NsZWVwX29uX2VycChjcXIpKQorCQkJY29udGludWU7CisJCWlmIChjcXItPnN0YXR1cyAhPSBEQVNEX0NRUl9GSUxMRUQpIC8qIGNvdWxkIGJlIGZhaWxlZCAqLworCQkJY29udGludWU7CisKKwkJLyogTm9uLXRlbXBvcmFyeSBzdG9wIGNvbmRpdGlvbiB3aWxsIHRyaWdnZXIgZmFpbCBmYXN0ICovCisJCWlmIChkZXZpY2UtPnN0b3BwZWQgJiB+REFTRF9TVE9QUEVEX1BFTkRJTkcgJiYKKwkJICAgIHRlc3RfYml0KERBU0RfQ1FSX0ZMQUdTX0ZBSUxGQVNULCAmY3FyLT5mbGFncykgJiYKKwkJICAgICghZGFzZF9lZXJfZW5hYmxlZChkZXZpY2UpKSkgeworCQkJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GQUlMRUQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIERvbid0IHRyeSB0byBzdGFydCByZXF1ZXN0cyBpZiBkZXZpY2UgaXMgc3RvcHBlZCAqLworCQlpZiAoaW50ZXJydXB0aWJsZSkgeworCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCQkJZ2VuZXJpY193YWl0cSwgIShkZXZpY2UtPnN0b3BwZWQpKTsKKwkJCWlmIChyYyA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0ZBSUxFRDsKKwkJCQltYWluY3FyLT5pbnRyYyA9IHJjOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UKKwkJCXdhaXRfZXZlbnQoZ2VuZXJpY193YWl0cSwgIShkZXZpY2UtPnN0b3BwZWQpKTsKKworCQljcXItPmNhbGxiYWNrID0gZGFzZF93YWtldXBfY2I7CisJCWNxci0+Y2FsbGJhY2tfZGF0YSA9ICh2b2lkICopICZnZW5lcmljX3dhaXRxOworCQlkYXNkX2FkZF9yZXF1ZXN0X3RhaWwoY3FyKTsKKwkJaWYgKGludGVycnVwdGlibGUpIHsKKwkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJCWdlbmVyaWNfd2FpdHEsIF93YWl0X2Zvcl93YWtldXAoY3FyKSk7CisJCQlpZiAocmMgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQkJZGFzZF9jYW5jZWxfcmVxKGNxcik7CisJCQkJLyogd2FpdCAobm9uLWludGVycnVwdGlibGUpIGZvciBmaW5hbCBzdGF0dXMgKi8KKwkJCQl3YWl0X2V2ZW50KGdlbmVyaWNfd2FpdHEsCisJCQkJCSAgIF93YWl0X2Zvcl93YWtldXAoY3FyKSk7CisJCQkJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GQUlMRUQ7CisJCQkJbWFpbmNxci0+aW50cmMgPSByYzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlCisJCQl3YWl0X2V2ZW50KGdlbmVyaWNfd2FpdHEsIF93YWl0X2Zvcl93YWtldXAoY3FyKSk7CisJfQorCisJbWFpbmNxci0+ZW5kY2xrID0gZ2V0X2Nsb2NrKCk7CisJaWYgKChtYWluY3FyLT5zdGF0dXMgIT0gREFTRF9DUVJfRE9ORSkgJiYKKwkgICAgKG1haW5jcXItPmludHJjICE9IC1FUkVTVEFSVFNZUykpCisJCWRhc2RfbG9nX3NlbnNlKG1haW5jcXIsICZtYWluY3FyLT5pcmIpOworCWlmIChtYWluY3FyLT5zdGF0dXMgPT0gREFTRF9DUVJfRE9ORSkKKwkJcmMgPSAwOworCWVsc2UgaWYgKG1haW5jcXItPmludHJjKQorCQlyYyA9IG1haW5jcXItPmludHJjOworCWVsc2UKKwkJcmMgPSAtRUlPOworCXJldHVybiByYzsKK30KKworLyoKICAqIFF1ZXVlIGEgcmVxdWVzdCB0byB0aGUgdGFpbCBvZiB0aGUgZGV2aWNlIGNjd19xdWV1ZSBhbmQgd2FpdCBmb3IKICAqIGl0J3MgY29tcGxldGlvbi4KICAqLwogaW50IGRhc2Rfc2xlZXBfb24oc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyKQogewotCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwotCWludCByYzsKLQotCWRldmljZSA9IGNxci0+c3RhcnRkZXY7Ci0KLQljcXItPmNhbGxiYWNrID0gZGFzZF93YWtldXBfY2I7Ci0JY3FyLT5jYWxsYmFja19kYXRhID0gKHZvaWQgKikgJmdlbmVyaWNfd2FpdHE7Ci0JZGFzZF9hZGRfcmVxdWVzdF90YWlsKGNxcik7Ci0Jd2FpdF9ldmVudChnZW5lcmljX3dhaXRxLCBfd2FpdF9mb3Jfd2FrZXVwKGNxcikpOwotCi0JaWYgKGNxci0+c3RhdHVzID09IERBU0RfQ1FSX0RPTkUpCi0JCXJjID0gMDsKLQllbHNlIGlmIChjcXItPmludHJjKQotCQlyYyA9IGNxci0+aW50cmM7Ci0JZWxzZQotCQlyYyA9IC1FSU87Ci0JcmV0dXJuIHJjOworCXJldHVybiBfZGFzZF9zbGVlcF9vbihjcXIsIDApOwogfQogCiAvKgpAQCAtMTQ5NSwyOCArMTYwNyw3IEBACiAgKi8KIGludCBkYXNkX3NsZWVwX29uX2ludGVycnVwdGlibGUoc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyKQogewotCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwotCWludCByYzsKLQotCWRldmljZSA9IGNxci0+c3RhcnRkZXY7Ci0JY3FyLT5jYWxsYmFjayA9IGRhc2Rfd2FrZXVwX2NiOwotCWNxci0+Y2FsbGJhY2tfZGF0YSA9ICh2b2lkICopICZnZW5lcmljX3dhaXRxOwotCWRhc2RfYWRkX3JlcXVlc3RfdGFpbChjcXIpOwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGdlbmVyaWNfd2FpdHEsIF93YWl0X2Zvcl93YWtldXAoY3FyKSk7Ci0JaWYgKHJjID09IC1FUkVTVEFSVFNZUykgewotCQlkYXNkX2NhbmNlbF9yZXEoY3FyKTsKLQkJLyogd2FpdCAobm9uLWludGVycnVwdGlibGUpIGZvciBmaW5hbCBzdGF0dXMgKi8KLQkJd2FpdF9ldmVudChnZW5lcmljX3dhaXRxLCBfd2FpdF9mb3Jfd2FrZXVwKGNxcikpOwotCQljcXItPmludHJjID0gcmM7Ci0JfQotCi0JaWYgKGNxci0+c3RhdHVzID09IERBU0RfQ1FSX0RPTkUpCi0JCXJjID0gMDsKLQllbHNlIGlmIChjcXItPmludHJjKQotCQlyYyA9IGNxci0+aW50cmM7Ci0JZWxzZQotCQlyYyA9IC1FSU87Ci0JcmV0dXJuIHJjOworCXJldHVybiBfZGFzZF9zbGVlcF9vbihjcXIsIDEpOwogfQogCiAvKgpAQCAtMTYzMCw3ICsxNzIxLDcgQEAKIAlibG9jayA9IChzdHJ1Y3QgZGFzZF9ibG9jayAqKSBwdHI7CiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGJsb2NrLT5iYXNlLT5jZGV2KSwgZmxhZ3MpOwogCS8qIHJlLWFjdGl2YXRlIHJlcXVlc3QgcXVldWUgKi8KLQlibG9jay0+YmFzZS0+c3RvcHBlZCAmPSB+REFTRF9TVE9QUEVEX1BFTkRJTkc7CisJZGFzZF9kZXZpY2VfcmVtb3ZlX3N0b3BfYml0cyhibG9jay0+YmFzZSwgREFTRF9TVE9QUEVEX1BFTkRJTkcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGJsb2NrLT5iYXNlLT5jZGV2KSwgZmxhZ3MpOwogCWRhc2Rfc2NoZWR1bGVfYmxvY2tfYmgoYmxvY2spOwogfQpAQCAtMTY1NywxMSArMTc0OCwxMCBAQAogLyoKICAqIFByb2Nlc3MgZmluaXNoZWQgZXJyb3IgcmVjb3ZlcnkgY2N3LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kYXNkX2Jsb2NrX3Byb2Nlc3NfZXJwKHN0cnVjdCBkYXNkX2Jsb2NrICpibG9jaywKLQkJCQkJICAgIHN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcikKK3N0YXRpYyB2b2lkIF9fZGFzZF9wcm9jZXNzX2VycChzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXIpCiB7CiAJZGFzZF9lcnBfZm5fdCBlcnBfZm47Ci0Jc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UgPSBibG9jay0+YmFzZTsKIAogCWlmIChjcXItPnN0YXR1cyA9PSBEQVNEX0NRUl9ET05FKQogCQlEQkZfREVWX0VWRU5UKERCRl9OT1RJQ0UsIGRldmljZSwgIiVzIiwgIkVSUCBzdWNjZXNzZnVsIik7CkBAIC0xNzI1LDkgKzE4MTUsMTIgQEAKIAkJCQkgKi8KIAkJCQlpZiAoIWxpc3RfZW1wdHkoJmJsb2NrLT5jY3dfcXVldWUpKQogCQkJCQlicmVhazsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soYmFzZWRldi0+Y2RldiksIGZsYWdzKTsKLQkJCQliYXNlZGV2LT5zdG9wcGVkIHw9IERBU0RfU1RPUFBFRF9QRU5ESU5HOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGJhc2VkZXYtPmNkZXYpLCBmbGFncyk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoCisJCQkJCWdldF9jY3dkZXZfbG9jayhiYXNlZGV2LT5jZGV2KSwgZmxhZ3MpOworCQkJCWRhc2RfZGV2aWNlX3NldF9zdG9wX2JpdHMoYmFzZWRldiwKKwkJCQkJCQkgIERBU0RfU1RPUFBFRF9QRU5ESU5HKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQlnZXRfY2N3ZGV2X2xvY2soYmFzZWRldi0+Y2RldiksIGZsYWdzKTsKIAkJCQlkYXNkX2Jsb2NrX3NldF90aW1lcihibG9jaywgSFovMik7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xODEzLDcgKzE5MDYsNyBAQAogCQkJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7CiAJCQljcXItPnJldHJpZXMgPSAyNTU7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soYmFzZS0+Y2RldiksIGZsYWdzKTsKLQkJCWJhc2UtPnN0b3BwZWQgfD0gREFTRF9TVE9QUEVEX1FVSUVTQ0U7CisJCQlkYXNkX2RldmljZV9zZXRfc3RvcF9iaXRzKGJhc2UsIERBU0RfU1RPUFBFRF9RVUlFU0NFKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGJhc2UtPmNkZXYpLAogCQkJCQkgICAgICAgZmxhZ3MpOwogCQkJZ290byByZXN0YXJ0OwpAQCAtMTgyMSw3ICsxOTE0LDcgQEAKIAogCQkvKiBQcm9jZXNzIGZpbmlzaGVkIEVSUCByZXF1ZXN0LiAqLwogCQlpZiAoY3FyLT5yZWZlcnMpIHsKLQkJCV9fZGFzZF9ibG9ja19wcm9jZXNzX2VycChibG9jaywgY3FyKTsKKwkJCV9fZGFzZF9wcm9jZXNzX2VycChiYXNlLCBjcXIpOwogCQkJZ290byByZXN0YXJ0OwogCQl9CiAKQEAgLTE5NTIsNyArMjA0NSw3IEBACiAJCS8qIFByb2Nlc3MgZmluaXNoZWQgRVJQIHJlcXVlc3QuICovCiAJCWlmIChjcXItPnJlZmVycykgewogCQkJc3Bpbl9sb2NrX2JoKCZibG9jay0+cXVldWVfbG9jayk7Ci0JCQlfX2Rhc2RfYmxvY2tfcHJvY2Vzc19lcnAoYmxvY2ssIGNxcik7CisJCQlfX2Rhc2RfcHJvY2Vzc19lcnAoYmxvY2stPmJhc2UsIGNxcik7CiAJCQlzcGluX3VubG9ja19iaCgmYmxvY2stPnF1ZXVlX2xvY2spOwogCQkJLyogcmVzdGFydCBsaXN0X2Zvcl94eCBsb29wIHNpbmNlIGRhc2RfcHJvY2Vzc19lcnAKIAkJCSAqIG1pZ2h0IHJlbW92ZSBtdWx0aXBsZSBlbGVtZW50cyAqLwpAQCAtMjIwOCwxOCArMjMwMSwxMSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBjY3dfZGV2aWNlX3NldF9vcHRpb25zKGNkZXYsIENDV0RFVl9ET19QQVRIR1JPVVApOwotCWlmIChyZXQpIHsKLQkJREJGX0VWRU5UKERCRl9XQVJOSU5HLAotCQkgICAgICAgImRhc2RfZ2VuZXJpY19wcm9iZTogY291bGQgbm90IHNldCBjY3ctZGV2aWNlIG9wdGlvbnMgIgotCQkgICAgICAgImZvciAlc1xuIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwotCQlyZXR1cm4gcmV0OwotCX0KIAlyZXQgPSBkYXNkX2FkZF9zeXNmc19maWxlcyhjZGV2KTsKIAlpZiAocmV0KSB7Ci0JCURCRl9FVkVOVChEQkZfV0FSTklORywKLQkJICAgICAgICJkYXNkX2dlbmVyaWNfcHJvYmU6IGNvdWxkIG5vdCBhZGQgc3lzZnMgZW50cmllcyAiCi0JCSAgICAgICAiZm9yICVzXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CisJCURCRl9FVkVOVF9ERVZJRChEQkZfV0FSTklORywgY2RldiwgIiVzIiwKKwkJCQkiZGFzZF9nZW5lcmljX3Byb2JlOiBjb3VsZCBub3QgYWRkICIKKwkJCQkic3lzZnMgZW50cmllcyIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAljZGV2LT5oYW5kbGVyID0gJmRhc2RfaW50X2hhbmRsZXI7CkBAIC0yNDE4LDE2ICsyNTA0LDE2IEBACiAJCQkJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9RVUVVRUQ7CiAJCQkJY3FyLT5yZXRyaWVzKys7CiAJCQl9Ci0JCWRldmljZS0+c3RvcHBlZCB8PSBEQVNEX1NUT1BQRURfRENfV0FJVDsKKwkJZGFzZF9kZXZpY2Vfc2V0X3N0b3BfYml0cyhkZXZpY2UsIERBU0RfU1RPUFBFRF9EQ19XQUlUKTsKIAkJZGFzZF9kZXZpY2VfY2xlYXJfdGltZXIoZGV2aWNlKTsKIAkJZGFzZF9zY2hlZHVsZV9kZXZpY2VfYmgoZGV2aWNlKTsKIAkJcmV0ID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBDSU9fT1BFUjoKIAkJLyogRklYTUU6IGFkZCBhIHNhbml0eSBjaGVjay4gKi8KLQkJZGV2aWNlLT5zdG9wcGVkICY9IH5EQVNEX1NUT1BQRURfRENfV0FJVDsKKwkJZGFzZF9kZXZpY2VfcmVtb3ZlX3N0b3BfYml0cyhkZXZpY2UsIERBU0RfU1RPUFBFRF9EQ19XQUlUKTsKIAkJaWYgKGRldmljZS0+c3RvcHBlZCAmIERBU0RfVU5SRVNVTUVEX1BNKSB7Ci0JCQlkZXZpY2UtPnN0b3BwZWQgJj0gfkRBU0RfVU5SRVNVTUVEX1BNOworCQkJZGFzZF9kZXZpY2VfcmVtb3ZlX3N0b3BfYml0cyhkZXZpY2UsIERBU0RfVU5SRVNVTUVEX1BNKTsKIAkJCWRhc2RfcmVzdG9yZV9kZXZpY2UoZGV2aWNlKTsKIAkJCXJldCA9IDE7CiAJCQlicmVhazsKQEAgLTI0NTIsNyArMjUzOCw3IEBACiAJaWYgKElTX0VSUihkZXZpY2UpKQogCQlyZXR1cm4gUFRSX0VSUihkZXZpY2UpOwogCS8qIGRpc2FsbG93IG5ldyBJL08gICovCi0JZGV2aWNlLT5zdG9wcGVkIHw9IERBU0RfU1RPUFBFRF9QTTsKKwlkYXNkX2RldmljZV9zZXRfc3RvcF9iaXRzKGRldmljZSwgREFTRF9TVE9QUEVEX1BNKTsKIAkvKiBjbGVhciBhY3RpdmUgcmVxdWVzdHMgKi8KIAlJTklUX0xJU1RfSEVBRCgmZnJlZXplX3F1ZXVlKTsKIAlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjZGV2KSk7CkBAIC0yNTA0LDE0ICsyNTkwLDE4IEBACiAJCXJldHVybiBQVFJfRVJSKGRldmljZSk7CiAKIAkvKiBhbGxvdyBuZXcgSU8gYWdhaW4gKi8KLQlkZXZpY2UtPnN0b3BwZWQgJj0gfkRBU0RfU1RPUFBFRF9QTTsKLQlkZXZpY2UtPnN0b3BwZWQgJj0gfkRBU0RfVU5SRVNVTUVEX1BNOworCWRhc2RfZGV2aWNlX3JlbW92ZV9zdG9wX2JpdHMoZGV2aWNlLAorCQkJCSAgICAgKERBU0RfU1RPUFBFRF9QTSB8IERBU0RfVU5SRVNVTUVEX1BNKSk7CiAKIAlkYXNkX3NjaGVkdWxlX2RldmljZV9iaChkZXZpY2UpOwogCi0JaWYgKGRldmljZS0+ZGlzY2lwbGluZS0+cmVzdG9yZSkKKwkvKgorCSAqIGNhbGwgZGlzY2lwbGluZSByZXN0b3JlIGZ1bmN0aW9uCisJICogaWYgZGV2aWNlIGlzIHN0b3BwZWQgZG8gbm90aGluZyBlLmcuIGZvciBkaXNjb25uZWN0ZWQgZGV2aWNlcworCSAqLworCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPnJlc3RvcmUgJiYgIShkZXZpY2UtPnN0b3BwZWQpKQogCQlyYyA9IGRldmljZS0+ZGlzY2lwbGluZS0+cmVzdG9yZShkZXZpY2UpOwotCWlmIChyYykKKwlpZiAocmMgfHwgZGV2aWNlLT5zdG9wcGVkKQogCQkvKgogCQkgKiBpZiB0aGUgcmVzdW1lIGZhaWxlZCBmb3IgdGhlIERBU0Qgd2UgcHV0IGl0IGluCiAJCSAqIGFuIFVOUkVTVU1FRCBzdG9wIHN0YXRlCkBAIC0yNTYxLDggKzI2NTEsNyBAQAogCWNxci0+c3RhcnRkZXYgPSBkZXZpY2U7CiAJY3FyLT5tZW1kZXYgPSBkZXZpY2U7CiAJY3FyLT5leHBpcmVzID0gMTAqSFo7Ci0JY2xlYXJfYml0KERBU0RfQ1FSX0ZMQUdTX1VTRV9FUlAsICZjcXItPmZsYWdzKTsKLQljcXItPnJldHJpZXMgPSAyOworCWNxci0+cmV0cmllcyA9IDI1NjsKIAljcXItPmJ1aWxkY2xrID0gZ2V0X2Nsb2NrKCk7CiAJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7CiAJcmV0dXJuIGNxcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkXzM5OTBfZXJwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jCmluZGV4IGU4ZmY3YjAuLjQ0Nzk2YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkXzM5OTBfZXJwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfMzk5MF9lcnAuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9pZGFscy5oPgotI2luY2x1ZGUgPGFzbS90b2RjbGsuaD4KIAogI2RlZmluZSBQUklOVEtfSEVBREVSICJkYXNkX2VycCgzOTkwKTogIgogCkBAIC03MCw4ICs2OSw3IEBACiAgKiAgIHByb2Nlc3NpbmcgdW50aWwgdGhlIHN0YXJ0ZWQgdGltZXIgaGFzIGV4cGlyZWQgb3IgYW4gcmVsYXRlZAogICogICBpbnRlcnJ1cHQgd2FzIHJlY2VpdmVkLgogICovCi1zdGF0aWMgdm9pZAotZGFzZF8zOTkwX2VycF9ibG9ja19xdWV1ZShzdHJ1Y3QgZGFzZF9jY3dfcmVxICogZXJwLCBpbnQgZXhwaXJlcykKK3N0YXRpYyB2b2lkIGRhc2RfMzk5MF9lcnBfYmxvY2tfcXVldWUoc3RydWN0IGRhc2RfY2N3X3JlcSAqZXJwLCBpbnQgZXhwaXJlcykKIHsKIAogCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlID0gZXJwLT5zdGFydGRldjsKQEAgLTgxLDEwICs3OSwxMyBAQAogCQkgICAgImJsb2NraW5nIHJlcXVlc3QgcXVldWUgZm9yICVpcyIsIGV4cGlyZXMvSFopOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGRldmljZS0+Y2RldiksIGZsYWdzKTsKLQlkZXZpY2UtPnN0b3BwZWQgfD0gREFTRF9TVE9QUEVEX1BFTkRJTkc7CisJZGFzZF9kZXZpY2Vfc2V0X3N0b3BfYml0cyhkZXZpY2UsIERBU0RfU1RPUFBFRF9QRU5ESU5HKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpLCBmbGFncyk7CiAJZXJwLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7Ci0JZGFzZF9ibG9ja19zZXRfdGltZXIoZGV2aWNlLT5ibG9jaywgZXhwaXJlcyk7CisJaWYgKGVycC0+YmxvY2spCisJCWRhc2RfYmxvY2tfc2V0X3RpbWVyKGVycC0+YmxvY2ssIGV4cGlyZXMpOworCWVsc2UKKwkJZGFzZF9kZXZpY2Vfc2V0X3RpbWVyKGRldmljZSwgZXhwaXJlcyk7CiB9CiAKIC8qCkBAIC0yNDMsOSArMjQ0LDEzIEBACiAgKiBERVNDUklQVElPTgogICogICBTZXR1cCBFUlAgdG8gZG8gdGhlIEVSUCBhY3Rpb24gMSAoc2VlIFJlZmVyZW5jZSBtYW51YWwpLgogICogICBSZXBlYXQgdGhlIG9wZXJhdGlvbiBvbiBhIGRpZmZlcmVudCBjaGFubmVsIHBhdGguCi0gKiAgIElmIGFsbCBhbHRlcm5hdGUgcGF0aHMgaGF2ZSBiZWVuIHRyaWVkLCB0aGUgcmVxdWVzdCBpcyBwb3N0ZWQgd2l0aCBhCi0gKiAgIHBlcm1hbmVudCBlcnJvci4KLSAqICAgTm90ZTogZHVwbGV4IGhhbmRsaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCAoeWV0KS4KKyAqICAgQXMgZGV2aWF0aW9uIGZyb20gdGhlIHJlY29tbWVuZGVkIHJlY292ZXJ5IGFjdGlvbiwgd2UgcmVzZXQgdGhlIHBhdGggbWFzaworICogICBhZnRlciB3ZSBoYXZlIHRyaWVkIGVhY2ggcGF0aCBhbmQgZ28gdGhyb3VnaCBhbGwgcGF0aHMgYSBzZWNvbmQgdGltZS4KKyAqICAgVGhpcyB3aWxsIGNvdmVyIHNpdHVhdGlvbnMgd2hlcmUgb25seSBvbmUgcGF0aCBhdCBhIHRpbWUgaXMgYWN0dWFsbHkgZG93biwKKyAqICAgYnV0IGFsbCBwYXRocyBmYWlsIGFuZCByZWNvdmVyIGp1c3Qgd2l0aCB0aGUgc2FtZSBzZXF1ZW5jZSBhbmQgdGltaW5nIGFzCisgKiAgIHdlIHRyeSB0byB1c2UgdGhlbSAoZmxhcHBpbmcgbGlua3MpLgorICogICBJZiBhbGwgYWx0ZXJuYXRlIHBhdGhzIGhhdmUgYmVlbiB0cmllZCB0d2ljZSwgdGhlIHJlcXVlc3QgaXMgcG9zdGVkIHdpdGgKKyAqICAgYSBwZXJtYW5lbnQgZXJyb3IuCiAgKgogICogIFBBUkFNRVRFUgogICogICBlcnAJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgRVJQCkBAIC0yNTQsMTcgKzI1OSwyNSBAQAogICogICBlcnAJCXBvaW50ZXIgdG8gdGhlIEVSUAogICoKICAqLwotc3RhdGljIHN0cnVjdCBkYXNkX2Njd19yZXEgKgotZGFzZF8zOTkwX2VycF9hY3Rpb25fMShzdHJ1Y3QgZGFzZF9jY3dfcmVxICogZXJwKQorc3RhdGljIHN0cnVjdCBkYXNkX2Njd19yZXEgKmRhc2RfMzk5MF9lcnBfYWN0aW9uXzFfc2VjKHN0cnVjdCBkYXNkX2Njd19yZXEgKmVycCkKIHsKLQotCWVycC0+ZnVuY3Rpb24gPSBkYXNkXzM5OTBfZXJwX2FjdGlvbl8xOwotCisJZXJwLT5mdW5jdGlvbiA9IGRhc2RfMzk5MF9lcnBfYWN0aW9uXzFfc2VjOwogCWRhc2RfMzk5MF9lcnBfYWx0ZXJuYXRlX3BhdGgoZXJwKTsKLQogCXJldHVybiBlcnA7Cit9CiAKLX0JCQkJLyogZW5kIGRhc2RfMzk5MF9lcnBfYWN0aW9uXzEgKi8KK3N0YXRpYyBzdHJ1Y3QgZGFzZF9jY3dfcmVxICpkYXNkXzM5OTBfZXJwX2FjdGlvbl8xKHN0cnVjdCBkYXNkX2Njd19yZXEgKmVycCkKK3sKKwllcnAtPmZ1bmN0aW9uID0gZGFzZF8zOTkwX2VycF9hY3Rpb25fMTsKKwlkYXNkXzM5OTBfZXJwX2FsdGVybmF0ZV9wYXRoKGVycCk7CisJaWYgKGVycC0+c3RhdHVzID09IERBU0RfQ1FSX0ZBSUxFRCkgeworCQllcnAtPnN0YXR1cyA9IERBU0RfQ1FSX0ZJTExFRDsKKwkJZXJwLT5yZXRyaWVzID0gMTA7CisJCWVycC0+bHBtID0gTFBNX0FOWVBBVEg7CisJCWVycC0+ZnVuY3Rpb24gPSBkYXNkXzM5OTBfZXJwX2FjdGlvbl8xX3NlYzsKKwl9CisJcmV0dXJuIGVycDsKK30JCQkJLyogZW5kIGRhc2RfMzk5MF9lcnBfYWN0aW9uXzEoYikgKi8KIAogLyoKICAqIERBU0RfMzk5MF9FUlBfQUNUSU9OXzQKQEAgLTIyOTUsNiArMjMwOCw3IEBACiAJCXJldHVybiBjcXI7CiAJfQogCisJY2N3ID0gY3FyLT5jcGFkZHI7CiAJaWYgKGNxci0+Y3Btb2RlID09IDEpIHsKIAkJLyogbWFrZSBhIHNoYWxsb3cgY29weSBvZiB0aGUgb3JpZ2luYWwgdGN3IGJ1dCBzZXQgbmV3IHRzYiAqLwogCQllcnAtPmNwbW9kZSA9IDE7CkBAIC0yMzAzLDYgKzIzMTcsOSBAQAogCQl0c2IgPSAoc3RydWN0IHRzYiAqKSAmdGN3WzFdOwogCQkqdGN3ID0gKigoc3RydWN0IHRjdyAqKWNxci0+Y3BhZGRyKTsKIAkJdGN3LT50c2IgPSAobG9uZyl0c2I7CisJfSBlbHNlIGlmIChjY3ctPmNtZF9jb2RlID09IERBU0RfRUNLRF9DQ1dfUFNGKSB7CisJCS8qIFBTRiBjYW5ub3QgYmUgY2hhaW5lZCBmcm9tIE5PT1AvVElDICovCisJCWVycC0+Y3BhZGRyID0gY3FyLT5jcGFkZHI7CiAJfSBlbHNlIHsKIAkJLyogaW5pdGlhbGl6ZSByZXF1ZXN0IHdpdGggZGVmYXVsdCBUSUMgdG8gY3VycmVudCBFUlAvQ1FSICovCiAJCWNjdyA9IGVycC0+Y3BhZGRyOwpAQCAtMjQ4Nyw2ICsyNTA0LDggQEAKIAogCQllcnAgPSBkYXNkXzM5OTBfZXJwX2FjdGlvbl8xKGVycCk7CiAKKwl9IGVsc2UgaWYgKGVycC0+ZnVuY3Rpb24gPT0gZGFzZF8zOTkwX2VycF9hY3Rpb25fMV9zZWMpIHsKKwkJZXJwID0gZGFzZF8zOTkwX2VycF9hY3Rpb25fMV9zZWMoZXJwKTsKIAl9IGVsc2UgaWYgKGVycC0+ZnVuY3Rpb24gPT0gZGFzZF8zOTkwX2VycF9hY3Rpb25fNSkgewogCiAJCS8qIHJldHJpZXMgaGF2ZSBub3QgYmVlbiBzdWNjZXNzZnVsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9hbGlhcy5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfYWxpYXMuYwppbmRleCA3MGEwMDhjLi5mZDEyMzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9hbGlhcy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2FsaWFzLmMKQEAgLTE1Miw2ICsxNTIsNyBAQAogCUlOSVRfV09SSygmbGN1LT5zdWNfZGF0YS53b3JrZXIsIHN1bW1hcnlfdW5pdF9jaGVja19oYW5kbGluZ193b3JrKTsKIAlJTklUX0RFTEFZRURfV09SSygmbGN1LT5ydWFjX2RhdGEuZHdvcmssIGxjdV91cGRhdGVfd29yayk7CiAJc3Bpbl9sb2NrX2luaXQoJmxjdS0+bG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZsY3UtPmxjdV9zZXR1cCk7CiAJcmV0dXJuIGxjdTsKIAogb3V0X2VycjQ6CkBAIC0yNDAsNiArMjQxLDY3IEBACiB9CiAKIC8qCisgKiBUaGUgZmlyc3QgZGV2aWNlIHRvIGJlIHJlZ2lzdGVyZWQgb24gYW4gTENVIHdpbGwgaGF2ZSB0byBkbworICogc29tZSBhZGRpdGlvbmFsIHNldHVwIHN0ZXBzIHRvIGNvbmZpZ3VyZSB0aGF0IExDVSBvbiB0aGUKKyAqIHN0b3JhZ2Ugc2VydmVyLiBBbGwgZnVydGhlciBkZXZpY2VzIHNob3VsZCB3YWl0IHdpdGggdGhlaXIKKyAqIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSBmaXJzdCBkZXZpY2UgaXMgZG9uZS4KKyAqIFRvIHN5bmNocm9uaXplIHRoaXMgd29yaywgdGhlIGZpcnN0IGRldmljZSB3aWxsIGNhbGwKKyAqIGRhc2RfYWxpYXNfbGN1X3NldHVwX2NvbXBsZXRlIHdoZW4gaXQgaXMgZG9uZSwgYW5kIGFsbAorICogb3RoZXIgZGV2aWNlcyB3aWxsIHdhaXQgZm9yIGl0IHdpdGggZGFzZF9hbGlhc193YWl0X2Zvcl9sY3Vfc2V0dXAuCisgKi8KK3ZvaWQgZGFzZF9hbGlhc19sY3Vfc2V0dXBfY29tcGxldGUoc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGRhc2RfZWNrZF9wcml2YXRlICpwcml2YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFsaWFzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBhbGlhc19sY3UgKmxjdTsKKwlzdHJ1Y3QgZGFzZF91aWQgKnVpZDsKKworCXByaXZhdGUgPSAoc3RydWN0IGRhc2RfZWNrZF9wcml2YXRlICopIGRldmljZS0+cHJpdmF0ZTsKKwl1aWQgPSAmcHJpdmF0ZS0+dWlkOworCWxjdSA9IE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFsaWFzdHJlZS5sb2NrLCBmbGFncyk7CisJc2VydmVyID0gX2ZpbmRfc2VydmVyKHVpZCk7CisJaWYgKHNlcnZlcikKKwkJbGN1ID0gX2ZpbmRfbGN1KHNlcnZlciwgdWlkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbGlhc3RyZWUubG9jaywgZmxhZ3MpOworCWlmICghbGN1KSB7CisJCURCRl9FVkVOVF9ERVZJRChEQkZfRVJSLCBkZXZpY2UtPmNkZXYsCisJCQkJImNvdWxkIG5vdCBmaW5kIGxjdSBmb3IgJTA0eCAlMDJ4IiwKKwkJCQl1aWQtPnNzaWQsIHVpZC0+cmVhbF91bml0X2FkZHIpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCWNvbXBsZXRlX2FsbCgmbGN1LT5sY3Vfc2V0dXApOworfQorCit2b2lkIGRhc2RfYWxpYXNfd2FpdF9mb3JfbGN1X3NldHVwKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbGlhc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgYWxpYXNfbGN1ICpsY3U7CisJc3RydWN0IGRhc2RfdWlkICp1aWQ7CisKKwlwcml2YXRlID0gKHN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqKSBkZXZpY2UtPnByaXZhdGU7CisJdWlkID0gJnByaXZhdGUtPnVpZDsKKwlsY3UgPSBOVUxMOworCXNwaW5fbG9ja19pcnFzYXZlKCZhbGlhc3RyZWUubG9jaywgZmxhZ3MpOworCXNlcnZlciA9IF9maW5kX3NlcnZlcih1aWQpOworCWlmIChzZXJ2ZXIpCisJCWxjdSA9IF9maW5kX2xjdShzZXJ2ZXIsIHVpZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWxpYXN0cmVlLmxvY2ssIGZsYWdzKTsKKwlpZiAoIWxjdSkgeworCQlEQkZfRVZFTlRfREVWSUQoREJGX0VSUiwgZGV2aWNlLT5jZGV2LAorCQkJCSJjb3VsZCBub3QgZmluZCBsY3UgZm9yICUwNHggJTAyeCIsCisJCQkJdWlkLT5zc2lkLCB1aWQtPnJlYWxfdW5pdF9hZGRyKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZsY3UtPmxjdV9zZXR1cCk7Cit9CisKKy8qCiAgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBkZXZpY2UgZnJvbSB0aGUgc2NvcGUgb2YgYWxpYXMgbWFuYWdlbWVudC4KICAqIFRoZSBjb21wbGljYXRlZCBwYXJ0IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCBpbiB1c2UgYnkKICAqIGFueSBvZiB0aGUgd29ya2Vycy4gSWYgbmVjZXNzYXJ5IGNhbmNlbCB0aGUgd29yay4KQEAgLTc1NSwxMSArODE3LDExIEBACiB7CiAJLyogSWYgcG9zID09IGRldmljZSB0aGVuIGRldmljZSBpcyBhbHJlYWR5IGxvY2tlZCEgKi8KIAlpZiAocG9zID09IGRldmljZSkgewotCQlwb3MtPnN0b3BwZWQgfD0gREFTRF9TVE9QUEVEX1NVOworCQlkYXNkX2RldmljZV9zZXRfc3RvcF9iaXRzKHBvcywgREFTRF9TVE9QUEVEX1NVKTsKIAkJcmV0dXJuOwogCX0KIAlzcGluX2xvY2soZ2V0X2Njd2Rldl9sb2NrKHBvcy0+Y2RldikpOwotCXBvcy0+c3RvcHBlZCB8PSBEQVNEX1NUT1BQRURfU1U7CisJZGFzZF9kZXZpY2Vfc2V0X3N0b3BfYml0cyhwb3MsIERBU0RfU1RPUFBFRF9TVSk7CiAJc3Bpbl91bmxvY2soZ2V0X2Njd2Rldl9sb2NrKHBvcy0+Y2RldikpOwogfQogCkBAIC03OTMsMjYgKzg1NSwyNiBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZsY3UtPmFjdGl2ZV9kZXZpY2VzLCBhbGlhc19saXN0KSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpLCBmbGFncyk7Ci0JCWRldmljZS0+c3RvcHBlZCAmPSB+REFTRF9TVE9QUEVEX1NVOworCQlkYXNkX2RldmljZV9yZW1vdmVfc3RvcF9iaXRzKGRldmljZSwgREFTRF9TVE9QUEVEX1NVKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwgZmxhZ3MpOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmbGN1LT5pbmFjdGl2ZV9kZXZpY2VzLCBhbGlhc19saXN0KSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpLCBmbGFncyk7Ci0JCWRldmljZS0+c3RvcHBlZCAmPSB+REFTRF9TVE9QUEVEX1NVOworCQlkYXNkX2RldmljZV9yZW1vdmVfc3RvcF9iaXRzKGRldmljZSwgREFTRF9TVE9QUEVEX1NVKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwgZmxhZ3MpOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGF2Z3JvdXAsICZsY3UtPmdyb3VwbGlzdCwgZ3JvdXApIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZwYXZncm91cC0+YmFzZWxpc3QsIGFsaWFzX2xpc3QpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpLCBmbGFncyk7Ci0JCQlkZXZpY2UtPnN0b3BwZWQgJj0gfkRBU0RfU1RPUFBFRF9TVTsKKwkJCWRhc2RfZGV2aWNlX3JlbW92ZV9zdG9wX2JpdHMoZGV2aWNlLCBEQVNEX1NUT1BQRURfU1UpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwKIAkJCQkJICAgICAgIGZsYWdzKTsKIAkJfQogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJnBhdmdyb3VwLT5hbGlhc2xpc3QsIGFsaWFzX2xpc3QpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpLCBmbGFncyk7Ci0JCQlkZXZpY2UtPnN0b3BwZWQgJj0gfkRBU0RfU1RPUFBFRF9TVTsKKwkJCWRhc2RfZGV2aWNlX3JlbW92ZV9zdG9wX2JpdHMoZGV2aWNlLCBEQVNEX1NUT1BQRURfU1UpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwKIAkJCQkJICAgICAgIGZsYWdzKTsKIAkJfQpAQCAtODM2LDcgKzg5OCw4IEBACiAKIAkvKiAyLiByZXNldCBzdW1tYXJ5IHVuaXQgY2hlY2sgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwgZmxhZ3MpOwotCWRldmljZS0+c3RvcHBlZCAmPSB+KERBU0RfU1RPUFBFRF9TVSB8IERBU0RfU1RPUFBFRF9QRU5ESU5HKTsKKwlkYXNkX2RldmljZV9yZW1vdmVfc3RvcF9iaXRzKGRldmljZSwKKwkJCQkgICAgIChEQVNEX1NUT1BQRURfU1UgfCBEQVNEX1NUT1BQRURfUEVORElORykpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGRldmljZS0+Y2RldiksIGZsYWdzKTsKIAlyZXNldF9zdW1tYXJ5X3VuaXRfY2hlY2sobGN1LCBkZXZpY2UsIHN1Y19kYXRhLT5yZWFzb24pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmMKaW5kZXggNGU0OWI0YS4uZjY0ZDBkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KLSNpbmNsdWRlIDxhc20vdG9kY2xrLmg+CiAjaW5jbHVkZSA8YXNtL3Z0b2MuaD4KICNpbmNsdWRlIDxhc20vZGlhZy5oPgogCkBAIC0xNDUsNiArMTQ0LDE1IEBACiAKIAltZHNrX3Rlcm1faW8oZGV2aWNlKTsKIAlyYyA9IG1kc2tfaW5pdF9pbyhkZXZpY2UsIGRldmljZS0+YmxvY2stPmJwX2Jsb2NrLCAwLCBOVUxMKTsKKwlpZiAocmMgPT0gNCkgeworCQlpZiAoIShkZXZpY2UtPmZlYXR1cmVzICYgREFTRF9GRUFUVVJFX1JFQURPTkxZKSkgeworCQkJZGV2X3dhcm4oJmRldmljZS0+Y2Rldi0+ZGV2LAorCQkJCSAiVGhlIGFjY2VzcyBtb2RlIG9mIGEgRElBRyBkZXZpY2UgY2hhbmdlZCIKKwkJCQkgIiB0byByZWFkLW9ubHkiKTsKKwkJCWRldmljZS0+ZmVhdHVyZXMgfD0gREFTRF9GRUFUVVJFX1JFQURPTkxZOworCQl9CisJCXJjID0gMDsKKwl9CiAJaWYgKHJjKQogCQlkZXZfd2FybigmZGV2aWNlLT5jZGV2LT5kZXYsICJESUFHIEVSUCBmYWlsZWQgd2l0aCAiCiAJCQkgICAgInJjPSVkXG4iLCByYyk7CkBAIC00MzMsMTYgKzQ0MSwyMCBAQAogCWZvciAoc2IgPSA1MTI7IHNiIDwgYnNpemU7IHNiID0gc2IgPDwgMSkKIAkJYmxvY2stPnMyYl9zaGlmdCsrOwogCXJjID0gbWRza19pbml0X2lvKGRldmljZSwgYmxvY2stPmJwX2Jsb2NrLCAwLCBOVUxMKTsKLQlpZiAocmMpIHsKKwlpZiAocmMgJiYgKHJjICE9IDQpKSB7CiAJCWRldl93YXJuKCZkZXZpY2UtPmNkZXYtPmRldiwgIkRJQUcgaW5pdGlhbGl6YXRpb24gIgogCQkJImZhaWxlZCB3aXRoIHJjPSVkXG4iLCByYyk7CiAJCXJjID0gLUVJTzsKIAl9IGVsc2UgeworCQlpZiAocmMgPT0gNCkKKwkJCWRldmljZS0+ZmVhdHVyZXMgfD0gREFTRF9GRUFUVVJFX1JFQURPTkxZOwogCQlkZXZfaW5mbygmZGV2aWNlLT5jZGV2LT5kZXYsCi0JCQkgIk5ldyBEQVNEIHdpdGggJWxkIGJ5dGUvYmxvY2ssIHRvdGFsIHNpemUgJWxkIEtCXG4iLAorCQkJICJOZXcgREFTRCB3aXRoICVsZCBieXRlL2Jsb2NrLCB0b3RhbCBzaXplICVsZCBLQiVzXG4iLAogCQkJICh1bnNpZ25lZCBsb25nKSBibG9jay0+YnBfYmxvY2ssCiAJCQkgKHVuc2lnbmVkIGxvbmcpIChibG9jay0+YmxvY2tzIDw8Ci0JCQkJCSAgYmxvY2stPnMyYl9zaGlmdCkgPj4gMSk7CisJCQkJCSAgYmxvY2stPnMyYl9zaGlmdCkgPj4gMSwKKwkJCSAocmMgPT0gNCkgPyAiLCByZWFkLW9ubHkgZGV2aWNlIiA6ICIiKTsKKwkJcmMgPSAwOwogCX0KIG91dF9sYWJlbDoKIAlmcmVlX3BhZ2UoKGxvbmcpIGxhYmVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCA0MTdiOTdjLi41ODE5ZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8YXNtL2lkYWxzLmg+CiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS90b2RjbGsuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9jaW8uaD4KICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CkBAIC03OCw2ICs3NywxMSBAQAogCiBzdGF0aWMgc3RydWN0IGNjd19kcml2ZXIgZGFzZF9lY2tkX2RyaXZlcjsgLyogc2VlIGJlbG93ICovCiAKKyNkZWZpbmUgSU5JVF9DUVJfT0sgMAorI2RlZmluZSBJTklUX0NRUl9VTkZPUk1BVFRFRCAxCisjZGVmaW5lIElOSVRfQ1FSX0VSUk9SIDIKKworCiAvKiBpbml0aWFsIGF0dGVtcHQgYXQgYSBwcm9iZSBmdW5jdGlvbi4gdGhpcyBjYW4gYmUgc2ltcGxpZmllZCBvbmNlCiAgKiB0aGUgb3RoZXIgZGV0ZWN0aW9uIGNvZGUgaXMgZ29uZSAqLwogc3RhdGljIGludApAQCAtODYsMTEgKzkwLDEyIEBACiAJaW50IHJldDsKIAogCS8qIHNldCBFQ0tEIHNwZWNpZmljIGNjdy1kZXZpY2Ugb3B0aW9ucyAqLwotCXJldCA9IGNjd19kZXZpY2Vfc2V0X29wdGlvbnMoY2RldiwgQ0NXREVWX0FMTE9XX0ZPUkNFKTsKKwlyZXQgPSBjY3dfZGV2aWNlX3NldF9vcHRpb25zKGNkZXYsIENDV0RFVl9BTExPV19GT1JDRSB8CisJCQkJICAgICBDQ1dERVZfRE9fUEFUSEdST1VQIHwgQ0NXREVWX0RPX01VTFRJUEFUSCk7CiAJaWYgKHJldCkgewotCQlEQkZfRVZFTlQoREJGX1dBUk5JTkcsCi0JCSAgICAgICAiZGFzZF9lY2tkX3Byb2JlOiBjb3VsZCBub3Qgc2V0IGNjdy1kZXZpY2Ugb3B0aW9ucyAiCi0JCSAgICAgICAiZm9yICVzXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CisJCURCRl9FVkVOVF9ERVZJRChEQkZfV0FSTklORywgY2RldiwgIiVzIiwKKwkJCQkiZGFzZF9lY2tkX3Byb2JlOiBjb3VsZCBub3Qgc2V0ICIKKwkJCQkiY2N3LWRldmljZSBvcHRpb25zIik7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IGRhc2RfZ2VuZXJpY19wcm9iZShjZGV2LCAmZGFzZF9lY2tkX2Rpc2NpcGxpbmUpOwpAQCAtNzQ5LDggKzc1NCw3IEBACiAJY3FyLT5ibG9jayA9IE5VTEw7CiAJY3FyLT5leHBpcmVzID0gMTAqSFo7CiAJY3FyLT5scG0gPSBscG07Ci0JY2xlYXJfYml0KERBU0RfQ1FSX0ZMQUdTX1VTRV9FUlAsICZjcXItPmZsYWdzKTsKLQljcXItPnJldHJpZXMgPSAyOworCWNxci0+cmV0cmllcyA9IDI1NjsKIAljcXItPmJ1aWxkY2xrID0gZ2V0X2Nsb2NrKCk7CiAJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7CiAJcmV0dXJuIGNxcjsKQEAgLTg4NSwxNiArODg5LDE1IEBACiAJCQlyYyA9IGRhc2RfZWNrZF9yZWFkX2NvbmZfbHBtKGRldmljZSwgJmNvbmZfZGF0YSwKIAkJCQkJCSAgICAgJmNvbmZfbGVuLCBscG0pOwogCQkJaWYgKHJjICYmIHJjICE9IC1FT1BOT1RTVVBQKSB7CS8qIC1FT1BOT1RTVVBQIGlzIG9rICovCi0JCQkJREJGX0VWRU5UKERCRl9XQVJOSU5HLAorCQkJCURCRl9FVkVOVF9ERVZJRChEQkZfV0FSTklORywgZGV2aWNlLT5jZGV2LAogCQkJCQkgICJSZWFkIGNvbmZpZ3VyYXRpb24gZGF0YSByZXR1cm5lZCAiCi0JCQkJCSAgImVycm9yICVkIGZvciBkZXZpY2U6ICVzIiwgcmMsCi0JCQkJCSAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CisJCQkJCSAgImVycm9yICVkIiwgcmMpOwogCQkJCXJldHVybiByYzsKIAkJCX0KIAkJCWlmIChjb25mX2RhdGEgPT0gTlVMTCkgewotCQkJCURCRl9FVkVOVChEQkZfV0FSTklORywgIk5vIGNvbmZpZ3VyYXRpb24gIgotCQkJCQkgICJkYXRhIHJldHJpZXZlZCBmb3IgZGV2aWNlOiAlcyIsCi0JCQkJCSAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CisJCQkJREJGX0VWRU5UX0RFVklEKERCRl9XQVJOSU5HLCBkZXZpY2UtPmNkZXYsICIlcyIsCisJCQkJCQkiTm8gY29uZmlndXJhdGlvbiBkYXRhICIKKwkJCQkJCSJyZXRyaWV2ZWQiKTsKIAkJCQljb250aW51ZTsJLyogbm8gZXJyb3IgKi8KIAkJCX0KIAkJCS8qIHNhdmUgZmlyc3QgdmFsaWQgY29uZmlndXJhdGlvbiBkYXRhICovCkBAIC05NDEsMTYgKzk0NCwxNCBAQAogCQkJCSAgICBzaXplb2Yoc3RydWN0IGRhc2RfcnNzZF9mZWF0dXJlcykpLAogCQkJCSAgIGRldmljZSk7CiAJaWYgKElTX0VSUihjcXIpKSB7Ci0JCURCRl9FVkVOVChEQkZfV0FSTklORywgIkNvdWxkIG5vdCBhbGxvY2F0ZSBpbml0aWFsaXphdGlvbiAiCi0JCQkgICJyZXF1ZXN0IGZvciBkZXZpY2U6ICVzIiwKLQkJCSAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CisJCURCRl9FVkVOVF9ERVZJRChEQkZfV0FSTklORywgZGV2aWNlLT5jZGV2LCAiJXMiLCAiQ291bGQgbm90ICIKKwkJCQkiYWxsb2NhdGUgaW5pdGlhbGl6YXRpb24gcmVxdWVzdCIpOwogCQlyZXR1cm4gUFRSX0VSUihjcXIpOwogCX0KIAljcXItPnN0YXJ0ZGV2ID0gZGV2aWNlOwogCWNxci0+bWVtZGV2ID0gZGV2aWNlOwogCWNxci0+YmxvY2sgPSBOVUxMOwotCWNsZWFyX2JpdChEQVNEX0NRUl9GTEFHU19VU0VfRVJQLCAmY3FyLT5mbGFncyk7Ci0JY3FyLT5yZXRyaWVzID0gNTsKKwljcXItPnJldHJpZXMgPSAyNTY7CiAJY3FyLT5leHBpcmVzID0gMTAgKiBIWjsKIAogCS8qIFByZXBhcmUgZm9yIFJlYWQgU3Vic3lzdGVtIERhdGEgKi8KQEAgLTEwMTIsOSArMTAxMyw5IEBACiAJfQogCXBzZl9zc2NfZGF0YSA9IChzdHJ1Y3QgZGFzZF9wc2Zfc3NjX2RhdGEgKiljcXItPmRhdGE7CiAJcHNmX3NzY19kYXRhLT5vcmRlciA9IFBTRl9PUkRFUl9TU0M7Ci0JcHNmX3NzY19kYXRhLT5zdWJvcmRlciA9IDB4NDA7CisJcHNmX3NzY19kYXRhLT5zdWJvcmRlciA9IDB4YzA7CiAJaWYgKGVuYWJsZV9wYXYpIHsKLQkJcHNmX3NzY19kYXRhLT5zdWJvcmRlciB8PSAweDg4OworCQlwc2Zfc3NjX2RhdGEtPnN1Ym9yZGVyIHw9IDB4MDg7CiAJCXBzZl9zc2NfZGF0YS0+cmVzZXJ2ZWRbMF0gPSAweDg4OwogCX0KIAljY3cgPSBjcXItPmNwYWRkcjsKQEAgLTEwMjUsNiArMTAyNiw3IEBACiAJY3FyLT5zdGFydGRldiA9IGRldmljZTsKIAljcXItPm1lbWRldiA9IGRldmljZTsKIAljcXItPmJsb2NrID0gTlVMTDsKKwljcXItPnJldHJpZXMgPSAyNTY7CiAJY3FyLT5leHBpcmVzID0gMTAqSFo7CiAJY3FyLT5idWlsZGNsayA9IGdldF9jbG9jaygpOwogCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRklMTEVEOwpAQCAtMTA1Nyw3ICsxMDU5LDcgQEAKIC8qCiAgKiBWYWxpZGUgc3RvcmFnZSBzZXJ2ZXIgb2YgY3VycmVudCBkZXZpY2UuCiAgKi8KLXN0YXRpYyBpbnQgZGFzZF9lY2tkX3ZhbGlkYXRlX3NlcnZlcihzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyB2b2lkIGRhc2RfZWNrZF92YWxpZGF0ZV9zZXJ2ZXIoc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJjOwogCXN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqcHJpdmF0ZTsKQEAgLTEwNjgsMTUgKzEwNzAsMTIgQEAKIAllbHNlCiAJCWVuYWJsZV9wYXYgPSAxOwogCXJjID0gZGFzZF9lY2tkX3BzZl9zc2MoZGV2aWNlLCBlbmFibGVfcGF2KTsKKwogCS8qIG1heSBiZSByZXF1ZXN0ZWQgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIG9uIHNlcnZlciwKIAkgKiB0aGVyZWZvcmUganVzdCByZXBvcnQgZXJyb3IgYW5kIGdvIGFoZWFkICovCiAJcHJpdmF0ZSA9IChzdHJ1Y3QgZGFzZF9lY2tkX3ByaXZhdGUgKikgZGV2aWNlLT5wcml2YXRlOwotCURCRl9FVkVOVChEQkZfV0FSTklORywgIlBTRi1TU0Mgb24gc3RvcmFnZSBzdWJzeXN0ZW0gJXMuJXMuJTA0eCAiCi0JCSAgInJldHVybmVkIHJjPSVkIGZvciBkZXZpY2U6ICVzIiwKLQkJICBwcml2YXRlLT51aWQudmVuZG9yLCBwcml2YXRlLT51aWQuc2VyaWFsLAotCQkgIHByaXZhdGUtPnVpZC5zc2lkLCByYywgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7Ci0JLyogUkUtUmVhZCBDb25maWd1cmF0aW9uIERhdGEgKi8KLQlyZXR1cm4gZGFzZF9lY2tkX3JlYWRfY29uZihkZXZpY2UpOworCURCRl9FVkVOVF9ERVZJRChEQkZfV0FSTklORywgZGV2aWNlLT5jZGV2LCAiUFNGLVNTQyBmb3IgU1NJRCAlMDR4ICIKKwkJCSJyZXR1cm5lZCByYz0lZCIsIHByaXZhdGUtPnVpZC5zc2lkLCByYyk7CiB9CiAKIC8qCkBAIC0xMDkwLDYgKzEwODksMTUgQEAKIAlzdHJ1Y3QgZGFzZF9ibG9jayAqYmxvY2s7CiAJaW50IGlzX2tub3duLCByYzsKIAorCWlmICghY2N3X2RldmljZV9pc19wYXRoZ3JvdXAoZGV2aWNlLT5jZGV2KSkgeworCQlkZXZfd2FybigmZGV2aWNlLT5jZGV2LT5kZXYsCisJCQkgIkEgY2hhbm5lbCBwYXRoIGdyb3VwIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoIWNjd19kZXZpY2VfaXNfbXVsdGlwYXRoKGRldmljZS0+Y2RldikpIHsKKwkJZGV2X2luZm8oJmRldmljZS0+Y2Rldi0+ZGV2LAorCQkJICJUaGUgREFTRCBpcyBub3Qgb3BlcmF0aW5nIGluIG11bHRpcGF0aCBtb2RlXG4iKTsKKwl9CiAJcHJpdmF0ZSA9IChzdHJ1Y3QgZGFzZF9lY2tkX3ByaXZhdGUgKikgZGV2aWNlLT5wcml2YXRlOwogCWlmICghcHJpdmF0ZSkgewogCQlwcml2YXRlID0ga3phbGxvYyhzaXplb2YoKnByaXZhdGUpLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CkBAIC0xMTIzLDkgKzExMzEsOSBAQAogCWlmIChwcml2YXRlLT51aWQudHlwZSA9PSBVQV9CQVNFX0RFVklDRSkgewogCQlibG9jayA9IGRhc2RfYWxsb2NfYmxvY2soKTsKIAkJaWYgKElTX0VSUihibG9jaykpIHsKLQkJCURCRl9FVkVOVChEQkZfV0FSTklORywgImNvdWxkIG5vdCBhbGxvY2F0ZSBkYXNkICIKLQkJCQkgICJibG9jayBzdHJ1Y3R1cmUgZm9yIGRldmljZTogJXMiLAotCQkJCSAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CisJCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGRldmljZS0+Y2RldiwgIiVzIiwKKwkJCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBkYXNkICIKKwkJCQkJImJsb2NrIHN0cnVjdHVyZSIpOwogCQkJcmMgPSBQVFJfRVJSKGJsb2NrKTsKIAkJCWdvdG8gb3V0X2VycjE7CiAJCX0KQEAgLTExMzksMTIgKzExNDcsMjEgQEAKIAkJcmMgPSBpc19rbm93bjsKIAkJZ290byBvdXRfZXJyMjsKIAl9CisJLyoKKwkgKiBkYXNkX2Vja2RfdmFpbGRhdGVfc2VydmVyIGlzIGRvbmUgb24gdGhlIGZpcnN0IGRldmljZSB0aGF0CisJICogaXMgZm91bmQgZm9yIGFuIExDVS4gQWxsIGxhdGVyIG90aGVyIGRldmljZXMgaGF2ZSB0byB3YWl0CisJICogZm9yIGl0LCBzbyB0aGV5IHdpbGwgcmVhZCB0aGUgY29ycmVjdCBmZWF0dXJlIGNvZGVzLgorCSAqLwogCWlmICghaXNfa25vd24pIHsKLQkJLyogbmV3IGxjdSBmb3VuZCAqLwotCQlyYyA9IGRhc2RfZWNrZF92YWxpZGF0ZV9zZXJ2ZXIoZGV2aWNlKTsgLyogd2lsbCBzd2l0Y2ggcGF2IG9uICovCi0JCWlmIChyYykKLQkJCWdvdG8gb3V0X2VycjM7Ci0JfQorCQlkYXNkX2Vja2RfdmFsaWRhdGVfc2VydmVyKGRldmljZSk7CisJCWRhc2RfYWxpYXNfbGN1X3NldHVwX2NvbXBsZXRlKGRldmljZSk7CisJfSBlbHNlCisJCWRhc2RfYWxpYXNfd2FpdF9mb3JfbGN1X3NldHVwKGRldmljZSk7CisKKwkvKiBkZXZpY2UgbWF5IHJlcG9ydCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBkYXRhIGFmdGVyIExDVSBzZXR1cCAqLworCXJjID0gZGFzZF9lY2tkX3JlYWRfY29uZihkZXZpY2UpOworCWlmIChyYykKKwkJZ290byBvdXRfZXJyMzsKIAogCS8qIFJlYWQgRmVhdHVyZSBDb2RlcyAqLwogCWRhc2RfZWNrZF9yZWFkX2ZlYXR1cmVzKGRldmljZSk7CkBAIC0xMTUzLDkgKzExNzAsOCBAQAogCXJjID0gZGFzZF9nZW5lcmljX3JlYWRfZGV2X2NoYXJzKGRldmljZSwgREFTRF9FQ0tEX01BR0lDLAogCQkJCQkgJnByaXZhdGUtPnJkY19kYXRhLCA2NCk7CiAJaWYgKHJjKSB7Ci0JCURCRl9FVkVOVChEQkZfV0FSTklORywKLQkJCSAgIlJlYWQgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyBmYWlsZWQsIHJjPSVkIGZvciAiCi0JCQkgICJkZXZpY2U6ICVzIiwgcmMsIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOworCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGRldmljZS0+Y2RldiwKKwkJCQkiUmVhZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWMgZmFpbGVkLCByYz0lZCIsIHJjKTsKIAkJZ290byBvdXRfZXJyMzsKIAl9CiAJLyogZmluZCB0aGUgdmFpbGQgY3lsaW5kZXIgc2l6ZSAqLwpAQCAtMTI1NiwxMiArMTI3MiwyOSBAQAogCWNxci0+YmxvY2sgPSBOVUxMOwogCWNxci0+c3RhcnRkZXYgPSBkZXZpY2U7CiAJY3FyLT5tZW1kZXYgPSBkZXZpY2U7Ci0JY3FyLT5yZXRyaWVzID0gMDsKKwljcXItPnJldHJpZXMgPSAyNTU7CiAJY3FyLT5idWlsZGNsayA9IGdldF9jbG9jaygpOwogCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRklMTEVEOwogCXJldHVybiBjcXI7CiB9CiAKKy8qIGRpZmZlcmVudGlhdGUgYmV0d2VlbiAnbm8gcmVjb3JkIGZvdW5kJyBhbmQgYW55IG90aGVyIGVycm9yICovCitzdGF0aWMgaW50IGRhc2RfZWNrZF9hbmFseXNpc19ldmFsdWF0aW9uKHN0cnVjdCBkYXNkX2Njd19yZXEgKmluaXRfY3FyKQoreworCWNoYXIgKnNlbnNlOworCWlmIChpbml0X2Nxci0+c3RhdHVzID09IERBU0RfQ1FSX0RPTkUpCisJCXJldHVybiBJTklUX0NRUl9PSzsKKwllbHNlIGlmIChpbml0X2Nxci0+c3RhdHVzID09IERBU0RfQ1FSX05FRURfRVJQIHx8CisJCSBpbml0X2Nxci0+c3RhdHVzID09IERBU0RfQ1FSX0ZBSUxFRCkgeworCQlzZW5zZSA9IGRhc2RfZ2V0X3NlbnNlKCZpbml0X2Nxci0+aXJiKTsKKwkJaWYgKHNlbnNlICYmIChzZW5zZVsxXSAmIFNOUzFfTk9fUkVDX0ZPVU5EKSkKKwkJCXJldHVybiBJTklUX0NRUl9VTkZPUk1BVFRFRDsKKwkJZWxzZQorCQkJcmV0dXJuIElOSVRfQ1FSX0VSUk9SOworCX0gZWxzZQorCQlyZXR1cm4gSU5JVF9DUVJfRVJST1I7Cit9CisKIC8qCiAgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIGluaXRfYW5hbHlzaXMgY3FyLiBJdCBzYXZlcwogICogdGhlIHN0YXR1cyBvZiB0aGUgaW5pdGlhbCBhbmFseXNpcyBjY3cgYmVmb3JlIGl0IGZyZWVzIGl0IGFuZCBraWNrcwpAQCAtMTI2OSwyMSArMTMwMiwyMCBAQAogICogZGFzZF9lY2tkX2RvX2FuYWx5c2lzIGFnYWluIChpZiB0aGUgZGV2aWNlcyBoYXMgbm90IGJlZW4gbWFya2VkCiAgKiBmb3IgZGVsZXRpb24gaW4gdGhlIG1lYW50aW1lKS4KICAqLwotc3RhdGljIHZvaWQKLWRhc2RfZWNrZF9hbmFseXNpc19jYWxsYmFjayhzdHJ1Y3QgZGFzZF9jY3dfcmVxICppbml0X2Nxciwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGRhc2RfZWNrZF9hbmFseXNpc19jYWxsYmFjayhzdHJ1Y3QgZGFzZF9jY3dfcmVxICppbml0X2NxciwKKwkJCQkJdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZGFzZF9lY2tkX3ByaXZhdGUgKnByaXZhdGU7CiAJc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2U7CiAKIAlkZXZpY2UgPSBpbml0X2Nxci0+c3RhcnRkZXY7CiAJcHJpdmF0ZSA9IChzdHJ1Y3QgZGFzZF9lY2tkX3ByaXZhdGUgKikgZGV2aWNlLT5wcml2YXRlOwotCXByaXZhdGUtPmluaXRfY3FyX3N0YXR1cyA9IGluaXRfY3FyLT5zdGF0dXM7CisJcHJpdmF0ZS0+aW5pdF9jcXJfc3RhdHVzID0gZGFzZF9lY2tkX2FuYWx5c2lzX2V2YWx1YXRpb24oaW5pdF9jcXIpOwogCWRhc2Rfc2ZyZWVfcmVxdWVzdChpbml0X2NxciwgZGV2aWNlKTsKIAlkYXNkX2tpY2tfZGV2aWNlKGRldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQKLWRhc2RfZWNrZF9zdGFydF9hbmFseXNpcyhzdHJ1Y3QgZGFzZF9ibG9jayAqYmxvY2spCitzdGF0aWMgaW50IGRhc2RfZWNrZF9zdGFydF9hbmFseXNpcyhzdHJ1Y3QgZGFzZF9ibG9jayAqYmxvY2spCiB7CiAJc3RydWN0IGRhc2RfZWNrZF9wcml2YXRlICpwcml2YXRlOwogCXN0cnVjdCBkYXNkX2Njd19yZXEgKmluaXRfY3FyOwpAQCAtMTI5NSwyNyArMTMyNyw0NCBAQAogCWluaXRfY3FyLT5jYWxsYmFjayA9IGRhc2RfZWNrZF9hbmFseXNpc19jYWxsYmFjazsKIAlpbml0X2Nxci0+Y2FsbGJhY2tfZGF0YSA9IE5VTEw7CiAJaW5pdF9jcXItPmV4cGlyZXMgPSA1KkhaOworCS8qIGZpcnN0IHRyeSB3aXRob3V0IEVSUCwgc28gd2UgY2FuIGxhdGVyIGhhbmRsZSB1bmZvcm1hdHRlZAorCSAqIGRldmljZXMgYXMgc3BlY2lhbCBjYXNlCisJICovCisJY2xlYXJfYml0KERBU0RfQ1FSX0ZMQUdTX1VTRV9FUlAsICZpbml0X2Nxci0+ZmxhZ3MpOworCWluaXRfY3FyLT5yZXRyaWVzID0gMDsKIAlkYXNkX2FkZF9yZXF1ZXN0X2hlYWQoaW5pdF9jcXIpOwogCXJldHVybiAtRUFHQUlOOwogfQogCi1zdGF0aWMgaW50Ci1kYXNkX2Vja2RfZW5kX2FuYWx5c2lzKHN0cnVjdCBkYXNkX2Jsb2NrICpibG9jaykKK3N0YXRpYyBpbnQgZGFzZF9lY2tkX2VuZF9hbmFseXNpcyhzdHJ1Y3QgZGFzZF9ibG9jayAqYmxvY2spCiB7CiAJc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGRhc2RfZWNrZF9wcml2YXRlICpwcml2YXRlOwogCXN0cnVjdCBlY2tkX2NvdW50ICpjb3VudF9hcmVhOwogCXVuc2lnbmVkIGludCBzYiwgYmxrX3Blcl90cms7CiAJaW50IHN0YXR1cywgaTsKKwlzdHJ1Y3QgZGFzZF9jY3dfcmVxICppbml0X2NxcjsKIAogCWRldmljZSA9IGJsb2NrLT5iYXNlOwogCXByaXZhdGUgPSAoc3RydWN0IGRhc2RfZWNrZF9wcml2YXRlICopIGRldmljZS0+cHJpdmF0ZTsKIAlzdGF0dXMgPSBwcml2YXRlLT5pbml0X2Nxcl9zdGF0dXM7CiAJcHJpdmF0ZS0+aW5pdF9jcXJfc3RhdHVzID0gLTE7Ci0JaWYgKHN0YXR1cyAhPSBEQVNEX0NRUl9ET05FKSB7Ci0JCWRldl93YXJuKCZkZXZpY2UtPmNkZXYtPmRldiwKLQkJCSAgICAiVGhlIERBU0QgaXMgbm90IGZvcm1hdHRlZFxuIik7CisJaWYgKHN0YXR1cyA9PSBJTklUX0NRUl9FUlJPUikgeworCQkvKiB0cnkgYWdhaW4sIHRoaXMgdGltZSB3aXRoIGZ1bGwgRVJQICovCisJCWluaXRfY3FyID0gZGFzZF9lY2tkX2FuYWx5c2lzX2NjdyhkZXZpY2UpOworCQlkYXNkX3NsZWVwX29uKGluaXRfY3FyKTsKKwkJc3RhdHVzID0gZGFzZF9lY2tkX2FuYWx5c2lzX2V2YWx1YXRpb24oaW5pdF9jcXIpOworCQlkYXNkX3NmcmVlX3JlcXVlc3QoaW5pdF9jcXIsIGRldmljZSk7CisJfQorCisJaWYgKHN0YXR1cyA9PSBJTklUX0NRUl9VTkZPUk1BVFRFRCkgeworCQlkZXZfd2FybigmZGV2aWNlLT5jZGV2LT5kZXYsICJUaGUgREFTRCBpcyBub3QgZm9ybWF0dGVkXG4iKTsKIAkJcmV0dXJuIC1FTUVESVVNVFlQRTsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSBJTklUX0NRUl9FUlJPUikgeworCQlkZXZfZXJyKCZkZXZpY2UtPmNkZXYtPmRldiwKKwkJCSJEZXRlY3RpbmcgdGhlIERBU0QgZGlzayBsYXlvdXQgZmFpbGVkIGJlY2F1c2UgIgorCQkJIm9mIGFuIEkvTyBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXByaXZhdGUtPnVzZXNfY2RsID0gMTsKQEAgLTE2MDcsOCArMTY1Niw3IEBACiAJfQogCWZjcC0+c3RhcnRkZXYgPSBkZXZpY2U7CiAJZmNwLT5tZW1kZXYgPSBkZXZpY2U7Ci0JY2xlYXJfYml0KERBU0RfQ1FSX0ZMQUdTX1VTRV9FUlAsICZmY3AtPmZsYWdzKTsKLQlmY3AtPnJldHJpZXMgPSA1OwkvKiBzZXQgcmV0cnkgY291bnRlciB0byBlbmFibGUgZGVmYXVsdCBFUlAgKi8KKwlmY3AtPnJldHJpZXMgPSAyNTY7CiAJZmNwLT5idWlsZGNsayA9IGdldF9jbG9jaygpOwogCWZjcC0+c3RhdHVzID0gREFTRF9DUVJfRklMTEVEOwogCXJldHVybiBmY3A7CkBAIC0yNjkwLDYgKzI3MzgsNyBAQAogCWNxci0+c3RhcnRkZXYgPSBkZXZpY2U7CiAJY3FyLT5tZW1kZXYgPSBkZXZpY2U7CiAJY3FyLT5yZXRyaWVzID0gMDsKKwljbGVhcl9iaXQoREFTRF9DUVJfRkxBR1NfVVNFX0VSUCwgJmNxci0+ZmxhZ3MpOwogCWNxci0+ZXhwaXJlcyA9IDEwICogSFo7CiAKIAkvKiBQcmVwYXJlIGZvciBSZWFkIFN1YnN5c3RlbSBEYXRhICovCkBAIC0zMjQwLDExICszMjg5LDE1IEBACiAJaWYgKGlzX2tub3duIDwgMCkKIAkJcmV0dXJuIGlzX2tub3duOwogCWlmICghaXNfa25vd24pIHsKLQkJLyogbmV3IGxjdSBmb3VuZCAqLwotCQlyYyA9IGRhc2RfZWNrZF92YWxpZGF0ZV9zZXJ2ZXIoZGV2aWNlKTsgLyogd2lsbCBzd2l0Y2ggcGF2IG9uICovCi0JCWlmIChyYykKLQkJCWdvdG8gb3V0X2VycjsKLQl9CisJCWRhc2RfZWNrZF92YWxpZGF0ZV9zZXJ2ZXIoZGV2aWNlKTsKKwkJZGFzZF9hbGlhc19sY3Vfc2V0dXBfY29tcGxldGUoZGV2aWNlKTsKKwl9IGVsc2UKKwkJZGFzZF9hbGlhc193YWl0X2Zvcl9sY3Vfc2V0dXAoZGV2aWNlKTsKKworCS8qIFJFLVJlYWQgQ29uZmlndXJhdGlvbiBEYXRhICovCisJcmMgPSBkYXNkX2Vja2RfcmVhZF9jb25mKGRldmljZSk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9lcnI7CiAKIAkvKiBSZWFkIEZlYXR1cmUgQ29kZXMgKi8KIAlkYXNkX2Vja2RfcmVhZF9mZWF0dXJlcyhkZXZpY2UpOwpAQCAtMzI1Myw5ICszMzA2LDggQEAKIAlyYyA9IGRhc2RfZ2VuZXJpY19yZWFkX2Rldl9jaGFycyhkZXZpY2UsIERBU0RfRUNLRF9NQUdJQywKIAkJCQkJICZ0ZW1wX3JkY19kYXRhLCA2NCk7CiAJaWYgKHJjKSB7Ci0JCURCRl9FVkVOVChEQkZfV0FSTklORywKLQkJCSAgIlJlYWQgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyBmYWlsZWQsIHJjPSVkIGZvciAiCi0JCQkgICJkZXZpY2U6ICVzIiwgcmMsIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOworCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGRldmljZS0+Y2RldiwKKwkJCQkiUmVhZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWMgZmFpbGVkLCByYz0lZCIsIHJjKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5oCmluZGV4IGFkNDViY2EuLjg2NGQ1M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuaAorKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmgKQEAgLTQxNCw2ICs0MTQsNyBAQAogCXN0cnVjdCBzdW1tYXJ5X3VuaXRfY2hlY2tfd29ya19kYXRhIHN1Y19kYXRhOwogCXN0cnVjdCByZWFkX3VhY193b3JrX2RhdGEgcnVhY19kYXRhOwogCXN0cnVjdCBkYXNkX2Njd19yZXEgKnJzdV9jcXI7CisJc3RydWN0IGNvbXBsZXRpb24gbGN1X3NldHVwOwogfTsKIAogc3RydWN0IGFsaWFzX3Bhdl9ncm91cCB7CkBAIC00NjAsNSArNDYxLDYgQEAKIHN0cnVjdCBkYXNkX2RldmljZSAqZGFzZF9hbGlhc19nZXRfc3RhcnRfZGV2KHN0cnVjdCBkYXNkX2RldmljZSAqKTsKIHZvaWQgZGFzZF9hbGlhc19oYW5kbGVfc3VtbWFyeV91bml0X2NoZWNrKHN0cnVjdCBkYXNkX2RldmljZSAqLCBzdHJ1Y3QgaXJiICopOwogdm9pZCBkYXNkX2Vja2RfcmVzZXRfY2N3X3RvX2Jhc2VfaW8oc3RydWN0IGRhc2RfY2N3X3JlcSAqKTsKLQordm9pZCBkYXNkX2FsaWFzX2xjdV9zZXR1cF9jb21wbGV0ZShzdHJ1Y3QgZGFzZF9kZXZpY2UgKik7Cit2b2lkIGRhc2RfYWxpYXNfd2FpdF9mb3JfbGN1X3NldHVwKHN0cnVjdCBkYXNkX2RldmljZSAqKTsKICNlbmRpZgkJCQkvKiBEQVNEX0VDS0RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWVyLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYwppbmRleCBkOTYwMzllLi4xZjNlOTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYwpAQCAtNTM2LDcgKzUzNiw2IEBACiAJZWVyYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZXJidWZmZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVlcmIpCiAJCXJldHVybiAtRU5PTUVNOwotCWxvY2tfa2VybmVsKCk7CiAJZWVyYi0+YnVmZmVyX3BhZ2VfY291bnQgPSBlZXJfcGFnZXM7CiAJaWYgKGVlcmItPmJ1ZmZlcl9wYWdlX2NvdW50IDwgMSB8fAogCSAgICBlZXJiLT5idWZmZXJfcGFnZV9jb3VudCA+IElOVF9NQVggLyBQQUdFX1NJWkUpIHsKQEAgLTU0NCw3ICs1NDMsNiBAQAogCQlEQkZfRVZFTlQoREJGX1dBUk5JTkcsICJjYW4ndCBvcGVuIGRldmljZSBzaW5jZSBtb2R1bGUgIgogCQkJInBhcmFtZXRlciBlZXJfcGFnZXMgaXMgc21hbGxlciB0aGFuIDEgb3IiCiAJCQkiIGJpZ2dlciB0aGFuICVkIiwgKGludCkoSU5UX01BWCAvIFBBR0VfU0laRSkpOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAllZXJiLT5idWZmZXJzaXplID0gZWVyYi0+YnVmZmVyX3BhZ2VfY291bnQgKiBQQUdFX1NJWkU7CkBAIC01NTIsMTQgKzU1MCwxMiBAQAogCQkJICAgICAgIEdGUF9LRVJORUwpOwogICAgICAgICBpZiAoIWVlcmItPmJ1ZmZlcikgewogCQlrZnJlZShlZXJiKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogCX0KIAlpZiAoZGFzZF9lZXJfYWxsb2NhdGVfYnVmZmVyX3BhZ2VzKGVlcmItPmJ1ZmZlciwKIAkJCQkJICAgZWVyYi0+YnVmZmVyX3BhZ2VfY291bnQpKSB7CiAJCWtmcmVlKGVlcmItPmJ1ZmZlcik7CiAJCWtmcmVlKGVlcmIpOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBlZXJiOwpAQCAtNTY3LDcgKzU2Myw2IEBACiAJbGlzdF9hZGQoJmVlcmItPmxpc3QsICZidWZmZXJsaXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidWZmZXJsb2NrLCBmbGFncyk7CiAKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5wLGZpbHApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCmluZGV4IGYyNDUzNzcuLjBmMTUyNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8YXNtL2lkYWxzLmg+CiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS90b2RjbGsuaD4KICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAKICNpbmNsdWRlICJkYXNkX2ludC5oIgpAQCAtMTQxLDkgKzE0MCw4IEBACiAJfQogCWJsb2NrID0gZGFzZF9hbGxvY19ibG9jaygpOwogCWlmIChJU19FUlIoYmxvY2spKSB7Ci0JCURCRl9FVkVOVChEQkZfV0FSTklORywgImNvdWxkIG5vdCBhbGxvY2F0ZSBkYXNkIGJsb2NrICIKLQkJCSAgInN0cnVjdHVyZSBmb3IgZGV2aWNlOiAlcyIsCi0JCQkgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOworCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGNkZXYsICIlcyIsICJjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkJCSJkYXNkIGJsb2NrIHN0cnVjdHVyZSIpOwogCQlkZXZpY2UtPnByaXZhdGUgPSBOVUxMOwogCQlrZnJlZShwcml2YXRlKTsKIAkJcmV0dXJuIFBUUl9FUlIoYmxvY2spOwpAQCAtMTU1LDkgKzE1Myw4IEBACiAJcmMgPSBkYXNkX2dlbmVyaWNfcmVhZF9kZXZfY2hhcnMoZGV2aWNlLCBEQVNEX0ZCQV9NQUdJQywKIAkJCQkJICZwcml2YXRlLT5yZGNfZGF0YSwgMzIpOwogCWlmIChyYykgewotCQlEQkZfRVZFTlQoREJGX1dBUk5JTkcsICJSZWFkIGRldmljZSBjaGFyYWN0ZXJpc3RpY3MgcmV0dXJuZWQgIgotCQkJICAiZXJyb3IgJWQgZm9yIGRldmljZTogJXMiLAotCQkJICByYywgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CisJCURCRl9FVkVOVF9ERVZJRChEQkZfV0FSTklORywgY2RldiwgIlJlYWQgZGV2aWNlICIKKwkJCQkiY2hhcmFjdGVyaXN0aWNzIHJldHVybmVkIGVycm9yICVkIiwgcmMpOwogCQlkZXZpY2UtPmJsb2NrID0gTlVMTDsKIAkJZGFzZF9mcmVlX2Jsb2NrKGJsb2NrKTsKIAkJZGV2aWNlLT5wcml2YXRlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggOGFmZDlmYS4uZTRjMjE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTEwOCw2ICsxMDgsMTYgQEAKIAkJCSAgICBkX2RhdGEpOyBcCiB9IHdoaWxlKDApCiAKKyNkZWZpbmUgREJGX0VWRU5UX0RFVklEKGRfbGV2ZWwsIGRfY2RldiwgZF9zdHIsIGRfZGF0YS4uLikJXAorZG8geyBcCisJc3RydWN0IGNjd19kZXZfaWQgX19kZXZfaWQ7CQkJXAorCWNjd19kZXZpY2VfZ2V0X2lkKGRfY2RldiwgJl9fZGV2X2lkKTsJCVwKKwlkZWJ1Z19zcHJpbnRmX2V2ZW50KGRhc2RfZGVidWdfYXJlYSwJCVwKKwkJCSAgICBkX2xldmVsLAkJCQkJXAorCQkJICAgICIwLiV4LiUwNHggIiBkX3N0ciAiXG4iLAkJCVwKKwkJCSAgICBfX2Rldl9pZC5zc2lkLCBfX2Rldl9pZC5kZXZubywgZF9kYXRhKTsJXAorfSB3aGlsZSAoMCkKKwogI2RlZmluZSBEQkZfRVhDKGRfbGV2ZWwsIGRfc3RyLCBkX2RhdGEuLi4pXAogZG8geyBcCiAJZGVidWdfc3ByaW50Zl9leGNlcHRpb24oZGFzZF9kZWJ1Z19hcmVhLCBcCkBAIC01OTUsNiArNjA1LDkgQEAKIGludCBkYXNkX2dlbmVyaWNfcmVhZF9kZXZfY2hhcnMoc3RydWN0IGRhc2RfZGV2aWNlICosIGludCwgdm9pZCAqLCBpbnQpOwogY2hhciAqZGFzZF9nZXRfc2Vuc2Uoc3RydWN0IGlyYiAqKTsKIAordm9pZCBkYXNkX2RldmljZV9zZXRfc3RvcF9iaXRzKHN0cnVjdCBkYXNkX2RldmljZSAqLCBpbnQpOwordm9pZCBkYXNkX2RldmljZV9yZW1vdmVfc3RvcF9iaXRzKHN0cnVjdCBkYXNkX2RldmljZSAqLCBpbnQpOworCiAvKiBleHRlcm5hbHMgaW4gZGFzZF9kZXZtYXAuYyAqLwogZXh0ZXJuIGludCBkYXNkX21heF9kZXZpbmRleDsKIGV4dGVybiBpbnQgZGFzZF9wcm9iZW9ubHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pb2N0bC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW9jdGwuYwppbmRleCBmNzU2YTFiLi40NzhiY2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2lvY3RsLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCXByX2luZm8oIiVzOiBUaGUgREFTRCBoYXMgYmVlbiBwdXQgaW4gdGhlIHF1aWVzY2UgIgogCQkic3RhdGVcbiIsIGRldl9uYW1lKCZiYXNlLT5jZGV2LT5kZXYpKTsKIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soYmFzZS0+Y2RldiksIGZsYWdzKTsKLQliYXNlLT5zdG9wcGVkIHw9IERBU0RfU1RPUFBFRF9RVUlFU0NFOworCWRhc2RfZGV2aWNlX3NldF9zdG9wX2JpdHMoYmFzZSwgREFTRF9TVE9QUEVEX1FVSUVTQ0UpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGJhc2UtPmNkZXYpLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjIsNyArMTIyLDcgQEAKIAlwcl9pbmZvKCIlczogSS9PIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHJlc3VtZWQgIgogCQkib24gdGhlIERBU0RcbiIsIGRldl9uYW1lKCZiYXNlLT5jZGV2LT5kZXYpKTsKIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soYmFzZS0+Y2RldiksIGZsYWdzKTsKLQliYXNlLT5zdG9wcGVkICY9IH5EQVNEX1NUT1BQRURfUVVJRVNDRTsKKwlkYXNkX2RldmljZV9yZW1vdmVfc3RvcF9iaXRzKGJhc2UsIERBU0RfU1RPUFBFRF9RVUlFU0NFKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhiYXNlLT5jZGV2KSwgZmxhZ3MpOwogCiAJZGFzZF9zY2hlZHVsZV9ibG9ja19iaChibG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKaW5kZXggNjU0ZGFhMy4uNWYyM2VjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJfQogCiAJcHJvZiA9ICZkYXNkX2dsb2JhbF9wcm9maWxlOwotCS8qIHByZXZlbnQgY291dGVyICdvdmVyZmxvdycgb24gb3V0cHV0ICovCisJLyogcHJldmVudCBjb3VudGVyICdvdmVyZmxvdycgb24gb3V0cHV0ICovCiAJZm9yIChmYWN0b3IgPSAxOyAocHJvZi0+ZGFzZF9pb19yZXFzIC8gZmFjdG9yKSA+IDk5OTk5OTk7CiAJICAgICBmYWN0b3IgKj0gMTApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKaW5kZXggMjE2MzlkNi4uOWQ2MTY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYwpAQCAtODU3LDcgKzg1Nyw2IEBACiAKIC8qCiAgKiAzMjE1IGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgZnJvbSBjb25zb2xlX2luaXQoKS4KLSAqIE5PVEU6IFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBrbWFsbG9jIGlzIGF2YWlsYWJsZS4KICAqLwogc3RhdGljIGludCBfX2luaXQgY29uMzIxNV9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKaW5kZXggYmI4MzhiZC4uNmJjYTgxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYwpAQCAtNTcyLDcgKzU3Miw2IEBACiAKIC8qCiAgKiAzMjcwIGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgZnJvbSBjb25zb2xlX2luaXQoKS4KLSAqIE5PVEU6IFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBrbWFsbG9jIGlzIGF2YWlsYWJsZS4KICAqLwogc3RhdGljIGludCBfX2luaXQKIGNvbjMyNzBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9mczMyNzAuYwppbmRleCAwOTdkMzg0Li4yOGU0NjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9mczMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9mczMyNzAuYwpAQCAtMzgsNiArMzgsOCBAQAogCXNpemVfdCByZGJ1Zl9zaXplOwkJLyogc2l6ZSBvZiBkYXRhIHJldHVybmVkIGJ5IFJEQlVGICovCiB9OwogCitzdGF0aWMgREVGSU5FX01VVEVYKGZzMzI3MF9tdXRleCk7CisKIHN0YXRpYyB2b2lkCiBmczMyNzBfd2FrZV91cChzdHJ1Y3QgcmF3MzI3MF9yZXF1ZXN0ICpycSwgdm9pZCAqZGF0YSkKIHsKQEAgLTc0LDcgKzc2LDcgQEAKIAkJfQogCQlyYyA9IHJhdzMyNzBfc3RhcnQodmlldywgcnEpOwogCQlpZiAocmMgPT0gMCkgewotCQkJLyogU3RhcnRlZCBzdWNlc3NmdWxseS4gTm93IHdhaXQgZm9yIGNvbXBsZXRpb24uICovCisJCQkvKiBTdGFydGVkIHN1Y2Nlc3NmdWxseS4gTm93IHdhaXQgZm9yIGNvbXBsZXRpb24uICovCiAJCQl3YWl0X2V2ZW50KGZwLT53YWl0LCByYXczMjcwX3JlcXVlc3RfZmluYWwocnEpKTsKIAkJfQogCX0gd2hpbGUgKHJjID09IC1FQUNDRVMpOwpAQCAtMzI4LDcgKzMzMCw3IEBACiAJaWYgKCFmcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmMgPSAwOwotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmZnMzMjcwX211dGV4KTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVFVCSUNNRDoKIAkJZnAtPnJlYWRfY29tbWFuZCA9IGFyZzsKQEAgLTM1NCw3ICszNTYsNyBAQAogCQkJcmMgPSAtRUZBVUxUOwogCQlicmVhazsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmZnMzMjcwX211dGV4KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQzNyw3ICs0MzksNyBAQAogCQltaW5vciA9IHR0eS0+aW5kZXggKyBSQVczMjcwX0ZJUlNUTUlOT1I7CiAJCXR0eV9rcmVmX3B1dCh0dHkpOwogCX0KLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJmZzMzI3MF9tdXRleCk7CiAJLyogQ2hlY2sgaWYgc29tZSBvdGhlciBwcm9ncmFtIGlzIGFscmVhZHkgdXNpbmcgZnVsbHNjcmVlbiBtb2RlLiAqLwogCWZwID0gKHN0cnVjdCBmczMyNzAgKikgcmF3MzI3MF9maW5kX3ZpZXcoJmZzMzI3MF9mbiwgbWlub3IpOwogCWlmICghSVNfRVJSKGZwKSkgewpAQCAtNDc4LDcgKzQ4MCw3IEBACiAJfQogCWZpbHAtPnByaXZhdGVfZGF0YSA9IGZwOwogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmZzMzI3MF9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9tb25yZWFkZXIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL21vbnJlYWRlci5jCmluZGV4IDY2ZTIxZGQuLjYwNDczZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL21vbnJlYWRlci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL21vbnJlYWRlci5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yODMsNyArMjgyLDYgQEAKIAkvKgogCSAqIG9ubHkgb25lIHVzZXIgYWxsb3dlZAogCSAqLwotCWxvY2tfa2VybmVsKCk7CiAJcmMgPSAtRUJVU1k7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoTU9OX0lOX1VTRSwgJm1vbl9pbl91c2UpKQogCQlnb3RvIG91dDsKQEAgLTMyMSw3ICszMTksNiBAQAogCX0KIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBtb25wcml2OwogCWRldl9zZXRfZHJ2ZGF0YShtb25yZWFkZXJfZGV2aWNlLCBtb25wcml2KTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOwogCiBvdXRfcGF0aDoKQEAgLTMzMSw3ICszMjgsNiBAQAogb3V0X3VzZToKIAljbGVhcl9iaXQoTU9OX0lOX1VTRSwgJm1vbl9pbl91c2UpOwogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTYwNyw2ICs2MDMsMTAgQEAKIAl9CiAJZGNzc19ta25hbWUobW9uX2Rjc3NfbmFtZSwgJnVzZXJfZGF0YV9jb25uZWN0WzhdKTsKIAorCS8qCisJICogbWlzY19yZWdpc3RlcigpIGhhcyB0byBiZSB0aGUgbGFzdCBhY3Rpb24gaW4gbW9kdWxlX2luaXQoKSwgYmVjYXVzZQorCSAqIGZpbGUgb3BlcmF0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSByaWdodCBhZnRlciB0aGlzLgorCSAqLwogCXJjID0gbWlzY19yZWdpc3RlcigmbW9uX2Rldik7CiAJaWYgKHJjIDwgMCApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvbW9ud3JpdGVyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9tb253cml0ZXIuYwppbmRleCA2NmZiOGViLi42NTMyZWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9tb253cml0ZXIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9tb253cml0ZXIuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KQEAgLTE4NSwxMyArMTg0LDExIEBACiAJbW9ucHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtb25fcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghbW9ucHJpdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbG9ja19rZXJuZWwoKTsKIAlJTklUX0xJU1RfSEVBRCgmbW9ucHJpdi0+bGlzdCk7CiAJbW9ucHJpdi0+aGRyX3RvX3JlYWQgPSBzaXplb2YobW9ucHJpdi0+aGRyKTsKIAltdXRleF9pbml0KCZtb25wcml2LT50aHJlYWRfbXV0ZXgpOwogCWZpbHAtPnByaXZhdGVfZGF0YSA9IG1vbnByaXY7CiAJbGlzdF9hZGRfdGFpbCgmbW9ucHJpdi0+cHJpdl9saXN0LCAmbW9uX3ByaXZfbGlzdCk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKIH0KIApAQCAtMzY0LDYgKzM2MSwxMCBAQAogCQlnb3RvIG91dF9kcml2ZXI7CiAJfQogCisJLyoKKwkgKiBtaXNjX3JlZ2lzdGVyKCkgaGFzIHRvIGJlIHRoZSBsYXN0IGFjdGlvbiBpbiBtb2R1bGVfaW5pdCgpLCBiZWNhdXNlCisJICogZmlsZSBvcGVyYXRpb25zIHdpbGwgYmUgYXZhaWxhYmxlIHJpZ2h0IGFmdGVyIHRoaXMuCisJICovCiAJcmMgPSBtaXNjX3JlZ2lzdGVyKCZtb25fZGV2KTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY21kLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NtZC5jCmluZGV4IDVjYzExYzYuLjI4YjVhZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY21kLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jbWQuYwpAQCAtODQsNiArODQsNyBAQAogCQlkbyB7CiAJCQltZW1zZXQoc2NjYiwgMCwgc2l6ZW9mKCpzY2NiKSk7CiAJCQlzY2NiLT5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKCpzY2NiKTsKKwkJCXNjY2ItPmhlYWRlci5mdW5jdGlvbl9jb2RlID0gMHg4MDsKIAkJCXNjY2ItPmhlYWRlci5jb250cm9sX21hc2tbMl0gPSAweDgwOwogCQkJcmMgPSBzY2xwX2NtZF9zeW5jX2Vhcmx5KGNvbW1hbmRzW2ldLCBzY2NiKTsKIAkJfSB3aGlsZSAocmMgPT0gLUVCVVNZKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGUuaCBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGUuaAppbmRleCBhMjYzMzM3Li43YTI0MmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlLmgKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZS5oCkBAIC0yMTIsNiArMjEyLDkgQEAKIAlzdHJ1Y3QgdGFwZV9jbGFzc19kZXZpY2UgKgludDsKIAlzdHJ1Y3QgdGFwZV9jbGFzc19kZXZpY2UgKglydDsKIAorCS8qIERldmljZSBtdXRleCB0byBzZXJpYWxpemUgdGFwZSBjb21tYW5kcy4gKi8KKwlzdHJ1Y3QgbXV0ZXgJCQltdXRleDsKKwogCS8qIERldmljZSBkaXNjaXBsaW5lIGluZm9ybWF0aW9uLiAqLwogCXN0cnVjdCB0YXBlX2Rpc2NpcGxpbmUgKglkaXNjaXBsaW5lOwogCXZvaWQgKgkJCQlkaXNjZGF0YTsKQEAgLTI5Miw5ICsyOTUsOSBAQAogZXh0ZXJuIGludCB0YXBlX2dlbmVyaWNfcHJvYmUoc3RydWN0IGNjd19kZXZpY2UgKik7CiBleHRlcm4gdm9pZCB0YXBlX2dlbmVyaWNfcmVtb3ZlKHN0cnVjdCBjY3dfZGV2aWNlICopOwogCi1leHRlcm4gc3RydWN0IHRhcGVfZGV2aWNlICp0YXBlX2dldF9kZXZpY2UoaW50IGRldmluZGV4KTsKLWV4dGVybiBzdHJ1Y3QgdGFwZV9kZXZpY2UgKnRhcGVfZ2V0X2RldmljZV9yZWZlcmVuY2Uoc3RydWN0IHRhcGVfZGV2aWNlICopOwotZXh0ZXJuIHN0cnVjdCB0YXBlX2RldmljZSAqdGFwZV9wdXRfZGV2aWNlKHN0cnVjdCB0YXBlX2RldmljZSAqKTsKK2V4dGVybiBzdHJ1Y3QgdGFwZV9kZXZpY2UgKnRhcGVfZmluZF9kZXZpY2UoaW50IGRldmluZGV4KTsKK2V4dGVybiBzdHJ1Y3QgdGFwZV9kZXZpY2UgKnRhcGVfZ2V0X2RldmljZShzdHJ1Y3QgdGFwZV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCB0YXBlX3B1dF9kZXZpY2Uoc3RydWN0IHRhcGVfZGV2aWNlICopOwogCiAvKiBFeHRlcm5hbHMgZnJvbSB0YXBlX2NoYXIuYyAqLwogZXh0ZXJuIGludCB0YXBlY2hhcl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYwppbmRleCAyZmU0NWZmLi4zNjU3ZmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYwpAQCAtMTEzLDE2ICsxMTMsMTYgQEAKIHsKIAlzdHJ1Y3QgdGFwZV8zNHh4X3dvcmsgKnAgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhcGVfMzR4eF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSA9IHAtPmRldmljZTsKIAogCXN3aXRjaChwLT5vcCkgewogCQljYXNlIFRPX01TRU46Ci0JCQl0YXBlXzM0eHhfbWVkaXVtX3NlbnNlKHAtPmRldmljZSk7CisJCQl0YXBlXzM0eHhfbWVkaXVtX3NlbnNlKGRldmljZSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURCRl9FVkVOVCgzLCAiVDM0WFg6IGludGVybmFsIGVycm9yOiB1bmtub3duIHdvcmtcbiIpOwogCX0KLQotCXAtPmRldmljZSA9IHRhcGVfcHV0X2RldmljZShwLT5kZXZpY2UpOworCXRhcGVfcHV0X2RldmljZShkZXZpY2UpOwogCWtmcmVlKHApOwogfQogCkBAIC0xMzYsNyArMTM2LDcgQEAKIAogCUlOSVRfV09SSygmcC0+d29yaywgdGFwZV8zNHh4X3dvcmtfaGFuZGxlcik7CiAKLQlwLT5kZXZpY2UgPSB0YXBlX2dldF9kZXZpY2VfcmVmZXJlbmNlKGRldmljZSk7CisJcC0+ZGV2aWNlID0gdGFwZV9nZXRfZGV2aWNlKGRldmljZSk7CiAJcC0+b3AgICAgID0gb3A7CiAKIAlzY2hlZHVsZV93b3JrKCZwLT53b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggZTRjYzNhYS4uMGM3MmFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTYwOCw3ICs2MDgsNyBAQAogCiAJSU5JVF9XT1JLKCZwLT53b3JrLCB0YXBlXzM1OTBfd29ya19oYW5kbGVyKTsKIAotCXAtPmRldmljZSA9IHRhcGVfZ2V0X2RldmljZV9yZWZlcmVuY2UoZGV2aWNlKTsKKwlwLT5kZXZpY2UgPSB0YXBlX2dldF9kZXZpY2UoZGV2aWNlKTsKIAlwLT5vcCA9IG9wOwogCiAJc2NoZWR1bGVfd29yaygmcC0+d29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMKaW5kZXggMGMwNzA1Yi4uNDc5OWNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9ibG9jay5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfYmxvY2suYwpAQCAtNTQsNyArNTQsNyBAQAogCS5vd25lcgkJID0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCSA9IHRhcGVibG9ja19vcGVuLAogCS5yZWxlYXNlCSA9IHRhcGVibG9ja19yZWxlYXNlLAotCS5sb2NrZWRfaW9jdGwgICAgICAgICAgID0gdGFwZWJsb2NrX2lvY3RsLAorCS5pb2N0bAkJID0gdGFwZWJsb2NrX2lvY3RsLAogCS5tZWRpYV9jaGFuZ2VkICAgPSB0YXBlYmxvY2tfbWVkaXVtX2NoYW5nZWQsCiAJLnJldmFsaWRhdGVfZGlzayA9IHRhcGVibG9ja19yZXZhbGlkYXRlX2Rpc2ssCiB9OwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJZGlzay0+bWFqb3IgPSB0YXBlYmxvY2tfbWFqb3I7CiAJZGlzay0+Zmlyc3RfbWlub3IgPSBkZXZpY2UtPmZpcnN0X21pbm9yOwogCWRpc2stPmZvcHMgPSAmdGFwZWJsb2NrX2ZvcHM7Ci0JZGlzay0+cHJpdmF0ZV9kYXRhID0gdGFwZV9nZXRfZGV2aWNlX3JlZmVyZW5jZShkZXZpY2UpOworCWRpc2stPnByaXZhdGVfZGF0YSA9IHRhcGVfZ2V0X2RldmljZShkZXZpY2UpOwogCWRpc2stPnF1ZXVlID0gYmxrZGF0LT5yZXF1ZXN0X3F1ZXVlOwogCXNldF9jYXBhY2l0eShkaXNrLCAwKTsKIAlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgImJ0aWJtJWQiLApAQCAtMjQ3LDExICsyNDcsMTEgQEAKIAogCWJsa2RhdC0+ZGlzayA9IGRpc2s7CiAJYmxrZGF0LT5tZWRpdW1fY2hhbmdlZCA9IDE7Ci0JYmxrZGF0LT5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZWRhdGEgPSB0YXBlX2dldF9kZXZpY2VfcmVmZXJlbmNlKGRldmljZSk7CisJYmxrZGF0LT5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZWRhdGEgPSB0YXBlX2dldF9kZXZpY2UoZGV2aWNlKTsKIAogCWFkZF9kaXNrKGRpc2spOwogCi0JdGFwZV9nZXRfZGV2aWNlX3JlZmVyZW5jZShkZXZpY2UpOworCXRhcGVfZ2V0X2RldmljZShkZXZpY2UpOwogCUlOSVRfV09SSygmYmxrZGF0LT5yZXF1ZXVlX3Rhc2ssIHRhcGVibG9ja19yZXF1ZXVlKTsKIAogCXJldHVybiAwOwpAQCAtMjc0LDEzICsyNzQsMTQgQEAKIAl9CiAKIAlkZWxfZ2VuZGlzayhkZXZpY2UtPmJsa19kYXRhLmRpc2spOwotCWRldmljZS0+YmxrX2RhdGEuZGlzay0+cHJpdmF0ZV9kYXRhID0KLQkJdGFwZV9wdXRfZGV2aWNlKGRldmljZS0+YmxrX2RhdGEuZGlzay0+cHJpdmF0ZV9kYXRhKTsKKwlkZXZpY2UtPmJsa19kYXRhLmRpc2stPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7CiAJcHV0X2Rpc2soZGV2aWNlLT5ibGtfZGF0YS5kaXNrKTsKIAogCWRldmljZS0+YmxrX2RhdGEuZGlzayA9IE5VTEw7CiBjbGVhbnVwX3F1ZXVlOgotCWRldmljZS0+YmxrX2RhdGEucmVxdWVzdF9xdWV1ZS0+cXVldWVkYXRhID0gdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7CisJZGV2aWNlLT5ibGtfZGF0YS5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZWRhdGEgPSBOVUxMOworCXRhcGVfcHV0X2RldmljZShkZXZpY2UpOwogCiAJYmxrX2NsZWFudXBfcXVldWUoZGV2aWNlLT5ibGtfZGF0YS5yZXF1ZXN0X3F1ZXVlKTsKIAlkZXZpY2UtPmJsa19kYXRhLnJlcXVlc3RfcXVldWUgPSBOVUxMOwpAQCAtMzYzLDcgKzM2NCw3IEBACiAJc3RydWN0IHRhcGVfZGV2aWNlICoJZGV2aWNlOwogCWludAkJCXJjOwogCi0JZGV2aWNlID0gdGFwZV9nZXRfZGV2aWNlX3JlZmVyZW5jZShkaXNrLT5wcml2YXRlX2RhdGEpOworCWRldmljZSA9IHRhcGVfZ2V0X2RldmljZShkaXNrLT5wcml2YXRlX2RhdGEpOwogCiAJaWYgKGRldmljZS0+cmVxdWlyZWRfdGFwZW1hcmtzKSB7CiAJCURCRl9FVkVOVCgyLCAiVEJMT0NLOiBtaXNzaW5nIHRhcGVtYXJrc1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NoYXIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2hhci5jCmluZGV4IDMxNTY2YzUuLjIzZDc3M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2hhci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2hhci5jCkBAIC0zMyw4ICszMyw3IEBACiBzdGF0aWMgc3NpemVfdCB0YXBlY2hhcl93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIHN0YXRpYyBpbnQgdGFwZWNoYXJfb3BlbihzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZmlsZSAqKTsKIHN0YXRpYyBpbnQgdGFwZWNoYXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyBpbnQgdGFwZWNoYXJfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJCSAgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgbG9uZyB0YXBlY2hhcl9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIGxvbmcgdGFwZWNoYXJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKIAkJCSAgdW5zaWduZWQgbG9uZyk7CiAKQEAgLTQzLDcgKzQyLDcgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkucmVhZCA9IHRhcGVjaGFyX3JlYWQsCiAJLndyaXRlID0gdGFwZWNoYXJfd3JpdGUsCi0JLmlvY3RsID0gdGFwZWNoYXJfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsID0gdGFwZWNoYXJfaW9jdGwsCiAJLmNvbXBhdF9pb2N0bCA9IHRhcGVjaGFyX2NvbXBhdF9pb2N0bCwKIAkub3BlbiA9IHRhcGVjaGFyX29wZW4sCiAJLnJlbGVhc2UgPSB0YXBlY2hhcl9yZWxlYXNlLApAQCAtMTcwLDcgKzE2OSw2IEBACiAJaWYgKHJjID09IDApIHsKIAkJcmMgPSBibG9ja19zaXplIC0gcmVxdWVzdC0+cmVzY250OwogCQlEQkZfRVZFTlQoNiwgIlRDSEFSOnJieXRlczogICV4XG4iLCByYyk7Ci0JCWZpbHAtPmZfcG9zICs9IHJjOwogCQkvKiBDb3B5IGRhdGEgZnJvbSBpZGFsIGJ1ZmZlciB0byB1c2VyIHNwYWNlLiAqLwogCQlpZiAoaWRhbF9idWZmZXJfdG9fdXNlcihkZXZpY2UtPmNoYXJfZGF0YS5pZGFsX2J1ZiwKIAkJCQkJZGF0YSwgcmMpICE9IDApCkBAIC0yMzgsNyArMjM2LDYgQEAKIAkJCWJyZWFrOwogCQlEQkZfRVZFTlQoNiwgIlRDSEFSOndieXRlczogJWx4XG4iLAogCQkJICBibG9ja19zaXplIC0gcmVxdWVzdC0+cmVzY250KTsKLQkJZmlscC0+Zl9wb3MgKz0gYmxvY2tfc2l6ZSAtIHJlcXVlc3QtPnJlc2NudDsKIAkJd3JpdHRlbiArPSBibG9ja19zaXplIC0gcmVxdWVzdC0+cmVzY250OwogCQlpZiAocmVxdWVzdC0+cmVzY250ICE9IDApCiAJCQlicmVhazsKQEAgLTI4NiwyNiArMjgzLDIwIEBACiAJaWYgKGltYWpvcihmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSAhPSB0YXBlY2hhcl9tYWpvcikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlsb2NrX2tlcm5lbCgpOwogCW1pbm9yID0gaW1pbm9yKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwotCWRldmljZSA9IHRhcGVfZ2V0X2RldmljZShtaW5vciAvIFRBUEVfTUlOT1JTX1BFUl9ERVYpOworCWRldmljZSA9IHRhcGVfZmluZF9kZXZpY2UobWlub3IgLyBUQVBFX01JTk9SU19QRVJfREVWKTsKIAlpZiAoSVNfRVJSKGRldmljZSkpIHsKLQkJREJGX0VWRU5UKDMsICJUQ0hBUjpvcGVuOiB0YXBlX2dldF9kZXZpY2UoKSBmYWlsZWRcbiIpOwotCQlyYyA9IFBUUl9FUlIoZGV2aWNlKTsKLQkJZ290byBvdXQ7CisJCURCRl9FVkVOVCgzLCAiVENIQVI6b3BlbjogdGFwZV9maW5kX2RldmljZSgpIGZhaWxlZFxuIik7CisJCXJldHVybiBQVFJfRVJSKGRldmljZSk7CiAJfQogCi0KIAlyYyA9IHRhcGVfb3BlbihkZXZpY2UpOwogCWlmIChyYyA9PSAwKSB7CiAJCWZpbHAtPnByaXZhdGVfZGF0YSA9IGRldmljZTsKLQkJcmMgPSBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKLQl9Ci0JZWxzZQorCQlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKKwl9IGVsc2UKIAkJdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7CiAKLW91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zNDIsNyArMzMzLDggQEAKIAkJZGV2aWNlLT5jaGFyX2RhdGEuaWRhbF9idWYgPSBOVUxMOwogCX0KIAl0YXBlX3JlbGVhc2UoZGV2aWNlKTsKLQlmaWxwLT5wcml2YXRlX2RhdGEgPSB0YXBlX3B1dF9kZXZpY2UoZGV2aWNlKTsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXRhcGVfcHV0X2RldmljZShkZXZpY2UpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNTEsMTYgKzM0MywxMSBAQAogICogVGFwZSBkZXZpY2UgaW8gY29udHJvbHMuCiAgKi8KIHN0YXRpYyBpbnQKLXRhcGVjaGFyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5wLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkgICAgICAgdW5zaWduZWQgaW50IG5vLCB1bnNpZ25lZCBsb25nIGRhdGEpCitfX3RhcGVjaGFyX2lvY3RsKHN0cnVjdCB0YXBlX2RldmljZSAqZGV2aWNlLAorCQkgdW5zaWduZWQgaW50IG5vLCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHRhcGVfZGV2aWNlICpkZXZpY2U7CiAJaW50IHJjOwogCi0JREJGX0VWRU5UKDYsICJUQ0hBUjppb2N0XG4iKTsKLQotCWRldmljZSA9IChzdHJ1Y3QgdGFwZV9kZXZpY2UgKikgZmlscC0+cHJpdmF0ZV9kYXRhOwotCiAJaWYgKG5vID09IE1USU9DVE9QKSB7CiAJCXN0cnVjdCBtdG9wIG9wOwogCkBAIC00NTMsMTUgKzQ0MCwzMCBAQAogfQogCiBzdGF0aWMgbG9uZwordGFwZWNoYXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBubywgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0YXBlX2RldmljZSAqZGV2aWNlOworCWxvbmcgcmM7CisKKwlEQkZfRVZFTlQoNiwgIlRDSEFSOmlvY3RcbiIpOworCisJZGV2aWNlID0gKHN0cnVjdCB0YXBlX2RldmljZSAqKSBmaWxwLT5wcml2YXRlX2RhdGE7CisJbXV0ZXhfbG9jaygmZGV2aWNlLT5tdXRleCk7CisJcmMgPSBfX3RhcGVjaGFyX2lvY3RsKGRldmljZSwgbm8sIGRhdGEpOworCW11dGV4X3VubG9jaygmZGV2aWNlLT5tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZwogdGFwZWNoYXJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgbm8sIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlpbnQgcnZhbCA9IC1FTk9JT0NUTENNRDsKIAogCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPmlvY3RsX2ZuKSB7Ci0JCWxvY2tfa2VybmVsKCk7CisJCW11dGV4X2xvY2soJmRldmljZS0+bXV0ZXgpOwogCQlydmFsID0gZGV2aWNlLT5kaXNjaXBsaW5lLT5pb2N0bF9mbihkZXZpY2UsIG5vLCBkYXRhKTsKLQkJdW5sb2NrX2tlcm5lbCgpOworCQltdXRleF91bmxvY2soJmRldmljZS0+bXV0ZXgpOwogCQlpZiAocnZhbCA9PSAtRUlOVkFMKQogCQkJcnZhbCA9IC1FTk9JT0NUTENNRDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCmluZGV4IDVjZDMxZTAuLmY1ZDY4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCkBAIC00OTIsNiArNDkyLDcgQEAKIAkJa2ZyZWUoZGV2aWNlKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQorCW11dGV4X2luaXQoJmRldmljZS0+bXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnJlcV9xdWV1ZSk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+bm9kZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2aWNlLT5zdGF0ZV9jaGFuZ2Vfd3EpOwpAQCAtNTExLDExICs1MTIsMTIgQEAKICAqIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LgogICovCiBzdHJ1Y3QgdGFwZV9kZXZpY2UgKgotdGFwZV9nZXRfZGV2aWNlX3JlZmVyZW5jZShzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSkKK3RhcGVfZ2V0X2RldmljZShzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSkKIHsKLQlEQkZfRVZFTlQoNCwgInRhcGVfZ2V0X2RldmljZV9yZWZlcmVuY2UoJXApID0gJWlcbiIsIGRldmljZSwKLQkJYXRvbWljX2luY19yZXR1cm4oJmRldmljZS0+cmVmX2NvdW50KSk7CisJaW50IGNvdW50OwogCisJY291bnQgPSBhdG9taWNfaW5jX3JldHVybigmZGV2aWNlLT5yZWZfY291bnQpOworCURCRl9FVkVOVCg0LCAidGFwZV9nZXRfZGV2aWNlKCVwKSA9ICVpXG4iLCBkZXZpY2UsIGNvdW50KTsKIAlyZXR1cm4gZGV2aWNlOwogfQogCkBAIC01MjUsMzIgKzUyNywyNSBAQAogICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMIHBvaW50ZXIgdG8gYmUgdXNlZCBieSB0aGUgY2FsbGVyCiAgKiBmb3IgY2xlYXJpbmcgcmVmZXJlbmNlIHBvaW50ZXJzLgogICovCi1zdHJ1Y3QgdGFwZV9kZXZpY2UgKgordm9pZAogdGFwZV9wdXRfZGV2aWNlKHN0cnVjdCB0YXBlX2RldmljZSAqZGV2aWNlKQogewotCWludCByZW1haW47CisJaW50IGNvdW50OwogCi0JcmVtYWluID0gYXRvbWljX2RlY19yZXR1cm4oJmRldmljZS0+cmVmX2NvdW50KTsKLQlpZiAocmVtYWluID4gMCkgewotCQlEQkZfRVZFTlQoNCwgInRhcGVfcHV0X2RldmljZSglcCkgLT4gJWlcbiIsIGRldmljZSwgcmVtYWluKTsKLQl9IGVsc2UgewotCQlpZiAocmVtYWluIDwgMCkgewotCQkJREJGX0VWRU5UKDQsICJwdXQgZGV2aWNlIHdpdGhvdXQgcmVmZXJlbmNlXG4iKTsKLQkJfSBlbHNlIHsKLQkJCURCRl9FVkVOVCg0LCAidGFwZV9mcmVlX2RldmljZSglcClcbiIsIGRldmljZSk7Ci0JCQlrZnJlZShkZXZpY2UtPm1vZGVzZXRfYnl0ZSk7Ci0JCQlrZnJlZShkZXZpY2UpOwotCQl9CisJY291bnQgPSBhdG9taWNfZGVjX3JldHVybigmZGV2aWNlLT5yZWZfY291bnQpOworCURCRl9FVkVOVCg0LCAidGFwZV9wdXRfZGV2aWNlKCVwKSAtPiAlaVxuIiwgZGV2aWNlLCBjb3VudCk7CisJQlVHX09OKGNvdW50IDwgMCk7CisJaWYgKGNvdW50ID09IDApIHsKKwkJa2ZyZWUoZGV2aWNlLT5tb2Rlc2V0X2J5dGUpOworCQlrZnJlZShkZXZpY2UpOwogCX0KLQotCXJldHVybiBOVUxMOwkJCQogfQogCiAvKgogICogRmluZCB0YXBlIGRldmljZSBieSBhIGRldmljZSBpbmRleC4KICAqLwogc3RydWN0IHRhcGVfZGV2aWNlICoKLXRhcGVfZ2V0X2RldmljZShpbnQgZGV2aW5kZXgpCit0YXBlX2ZpbmRfZGV2aWNlKGludCBkZXZpbmRleCkKIHsKIAlzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSwgKnRtcDsKIApAQCAtNTU4LDcgKzU1Myw3IEBACiAJcmVhZF9sb2NrKCZ0YXBlX2RldmljZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJnRhcGVfZGV2aWNlX2xpc3QsIG5vZGUpIHsKIAkJaWYgKHRtcC0+Zmlyc3RfbWlub3IgLyBUQVBFX01JTk9SU19QRVJfREVWID09IGRldmluZGV4KSB7Ci0JCQlkZXZpY2UgPSB0YXBlX2dldF9kZXZpY2VfcmVmZXJlbmNlKHRtcCk7CisJCQlkZXZpY2UgPSB0YXBlX2dldF9kZXZpY2UodG1wKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTc5LDcgKzU3NCw4IEBACiAJZGV2aWNlID0gdGFwZV9hbGxvY19kZXZpY2UoKTsKIAlpZiAoSVNfRVJSKGRldmljZSkpCiAJCXJldHVybiAtRU5PREVWOwotCWNjd19kZXZpY2Vfc2V0X29wdGlvbnMoY2RldiwgQ0NXREVWX0RPX1BBVEhHUk9VUCk7CisJY2N3X2RldmljZV9zZXRfb3B0aW9ucyhjZGV2LCBDQ1dERVZfRE9fUEFUSEdST1VQIHwKKwkJCQkgICAgIENDV0RFVl9ET19NVUxUSVBBVEgpOwogCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2Rldi0+ZGV2LmtvYmosICZ0YXBlX2F0dHJfZ3JvdXApOwogCWlmIChyZXQpIHsKIAkJdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7CkBAIC02MDYsNyArNjAyLDggQEAKIAkJbGlzdF9kZWwoJnJlcXVlc3QtPmxpc3QpOwogCiAJCS8qIERlY3JlYXNlIHJlZl9jb3VudCBmb3IgcmVtb3ZlZCByZXF1ZXN0LiAqLwotCQlyZXF1ZXN0LT5kZXZpY2UgPSB0YXBlX3B1dF9kZXZpY2UoZGV2aWNlKTsKKwkJcmVxdWVzdC0+ZGV2aWNlID0gTlVMTDsKKwkJdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7CiAJCXJlcXVlc3QtPnJjID0gLUVJTzsKIAkJaWYgKHJlcXVlc3QtPmNhbGxiYWNrICE9IE5VTEwpCiAJCQlyZXF1ZXN0LT5jYWxsYmFjayhyZXF1ZXN0LCByZXF1ZXN0LT5jYWxsYmFja19kYXRhKTsKQEAgLTY2NCw5ICs2NjEsMTEgQEAKIAkJCXRhcGVfY2xlYW51cF9kZXZpY2UoZGV2aWNlKTsKIAl9CiAKLQlpZiAoIWRldl9nZXRfZHJ2ZGF0YSgmY2Rldi0+ZGV2KSkgeworCWRldmljZSA9IGRldl9nZXRfZHJ2ZGF0YSgmY2Rldi0+ZGV2KTsKKwlpZiAoZGV2aWNlKSB7CiAJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2Rldi0+ZGV2LmtvYmosICZ0YXBlX2F0dHJfZ3JvdXApOwotCQlkZXZfc2V0X2RydmRhdGEoJmNkZXYtPmRldiwgdGFwZV9wdXRfZGV2aWNlKGRldl9nZXRfZHJ2ZGF0YSgmY2Rldi0+ZGV2KSkpOworCQlkZXZfc2V0X2RydmRhdGEoJmNkZXYtPmRldiwgTlVMTCk7CisJCXRhcGVfcHV0X2RldmljZShkZXZpY2UpOwogCX0KIH0KIApAQCAtNzIxLDkgKzcyMCw4IEBACiB7CiAJREJGX0xIKDYsICJGcmVlIHJlcXVlc3QgJXBcbiIsIHJlcXVlc3QpOwogCi0JaWYgKHJlcXVlc3QtPmRldmljZSAhPSBOVUxMKSB7Ci0JCXJlcXVlc3QtPmRldmljZSA9IHRhcGVfcHV0X2RldmljZShyZXF1ZXN0LT5kZXZpY2UpOwotCX0KKwlpZiAocmVxdWVzdC0+ZGV2aWNlKQorCQl0YXBlX3B1dF9kZXZpY2UocmVxdWVzdC0+ZGV2aWNlKTsKIAlrZnJlZShyZXF1ZXN0LT5jcGRhdGEpOwogCWtmcmVlKHJlcXVlc3QtPmNwYWRkcik7CiAJa2ZyZWUocmVxdWVzdCk7CkBAIC04MzgsNyArODM2LDggQEAKIAlCVUdfT04ocmVxdWVzdC0+c3RhdHVzICE9IFRBUEVfUkVRVUVTVF9MT05HX0JVU1kpOwogCURCRl9MSCg2LCAiJTA4eDogTG9uZyBidXN5IHRpbWVvdXQuXG4iLCBkZXZpY2UtPmNkZXZfaWQpOwogCV9fdGFwZV9zdGFydF9uZXh0X3JlcXVlc3QoZGV2aWNlKTsKLQlkZXZpY2UtPmxiX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0YXBlX3B1dF9kZXZpY2UoZGV2aWNlKTsKKwlkZXZpY2UtPmxiX3RpbWVvdXQuZGF0YSA9IDBVTDsKKwl0YXBlX3B1dF9kZXZpY2UoZGV2aWNlKTsKIAlzcGluX3VubG9ja19pcnEoZ2V0X2Njd2Rldl9sb2NrKGRldmljZS0+Y2RldikpOwogfQogCkBAIC05MTgsNyArOTE3LDcgQEAKIAl9CiAKIAkvKiBJbmNyZWFzZSB1c2UgY291bnQgb2YgZGV2aWNlIGZvciB0aGUgYWRkZWQgcmVxdWVzdC4gKi8KLQlyZXF1ZXN0LT5kZXZpY2UgPSB0YXBlX2dldF9kZXZpY2VfcmVmZXJlbmNlKGRldmljZSk7CisJcmVxdWVzdC0+ZGV2aWNlID0gdGFwZV9nZXRfZGV2aWNlKGRldmljZSk7CiAKIAlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5yZXFfcXVldWUpKSB7CiAJCS8qIE5vIG90aGVyIHJlcXVlc3RzIGFyZSBvbiB0aGUgcXVldWUuIFN0YXJ0IHRoaXMgb25lLiAqLwpAQCAtMTExNyw4ICsxMTE2LDggQEAKIAkJaWYgKHJlcS0+c3RhdHVzID09IFRBUEVfUkVRVUVTVF9MT05HX0JVU1kpIHsKIAkJCURCRl9FVkVOVCgzLCAiKCUwOHgpOiBkZWwgdGltZXJcbiIsIGRldmljZS0+Y2Rldl9pZCk7CiAJCQlpZiAoZGVsX3RpbWVyKCZkZXZpY2UtPmxiX3RpbWVvdXQpKSB7Ci0JCQkJZGV2aWNlLT5sYl90aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZykKLQkJCQkJdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7CisJCQkJZGV2aWNlLT5sYl90aW1lb3V0LmRhdGEgPSAwVUw7CisJCQkJdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7CiAJCQkJX190YXBlX3N0YXJ0X25leHRfcmVxdWVzdChkZXZpY2UpOwogCQkJfQogCQkJcmV0dXJuOwpAQCAtMTE3Myw3ICsxMTcyLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFRBUEVfSU9fTE9OR19CVVNZOgogCQkJZGV2aWNlLT5sYl90aW1lb3V0LmRhdGEgPQotCQkJCSh1bnNpZ25lZCBsb25nKXRhcGVfZ2V0X2RldmljZV9yZWZlcmVuY2UoZGV2aWNlKTsKKwkJCQkodW5zaWduZWQgbG9uZykgdGFwZV9nZXRfZGV2aWNlKGRldmljZSk7CiAJCQlkZXZpY2UtPmxiX3RpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKwogCQkJCUxPTkdfQlVTWV9USU1FT1VUICogSFo7CiAJCQlEQkZfRVZFTlQoMywgIiglMDh4KTogYWRkIHRpbWVyXG4iLCBkZXZpY2UtPmNkZXZfaWQpOwpAQCAtMTMyNiw3ICsxMzI1LDcgQEAKIEVYUE9SVF9TWU1CT0wodGFwZV9nZW5lcmljX29mZmxpbmUpOwogRVhQT1JUX1NZTUJPTCh0YXBlX2dlbmVyaWNfcG1fc3VzcGVuZCk7CiBFWFBPUlRfU1lNQk9MKHRhcGVfcHV0X2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHRhcGVfZ2V0X2RldmljZV9yZWZlcmVuY2UpOworRVhQT1JUX1NZTUJPTCh0YXBlX2dldF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTCh0YXBlX3N0YXRlX3ZlcmJvc2UpOwogRVhQT1JUX1NZTUJPTCh0YXBlX29wX3ZlcmJvc2UpOwogRVhQT1JUX1NZTUJPTCh0YXBlX3N0YXRlX3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX3Byb2MuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfcHJvYy5jCmluZGV4IDIwMmY0MjEuLmViZDgyMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfcHJvYy5jCkBAIC00NSw3ICs0NSw3IEBACiAJCXNlcV9wcmludGYobSwgIlRhcGVOb1x0QnVzSUQgICAgICBDdVR5cGUvTW9kZWxcdCIKIAkJCSJEZXZUeXBlL01vZGVsXHRCbGtTaXplXHRTdGF0ZVx0T3BcdE1lZFN0YXRlXG4iKTsKIAl9Ci0JZGV2aWNlID0gdGFwZV9nZXRfZGV2aWNlKG4pOworCWRldmljZSA9IHRhcGVfZmluZF9kZXZpY2Uobik7CiAJaWYgKElTX0VSUihkZXZpY2UpKQogCQlyZXR1cm4gMDsKIAlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3R0eTMyNzAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3R0eTMyNzAuYwppbmRleCAzODM4NTY3Li45MTE4MjJkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdHR5MzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3R0eTMyNzAuYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KIAogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KICNpbmNsdWRlIDxhc20vY2lvLmg+CkBAIC0xNzMxLDYgKzE3MzIsMjIgQEAKIAlyZXR1cm4ga2JkX2lvY3RsKHRwLT5rYmQsIGZpbGUsIGNtZCwgYXJnKTsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nCit0dHkzMjcwX2NvbXBhdF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdHR5MzI3MCAqdHA7CisKKwl0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF0cCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4ga2JkX2lvY3RsKHRwLT5rYmQsIGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIHR0eTMyNzBfb3BzID0gewogCS5vcGVuID0gdHR5MzI3MF9vcGVuLAogCS5jbG9zZSA9IHR0eTMyNzBfY2xvc2UsCkBAIC0xNzQ1LDYgKzE3NjIsOSBAQAogCS5oYW5ndXAgPSB0dHkzMjcwX2hhbmd1cCwKIAkud2FpdF91bnRpbF9zZW50ID0gdHR5MzI3MF93YWl0X3VudGlsX3NlbnQsCiAJLmlvY3RsID0gdHR5MzI3MF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IHR0eTMyNzBfY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJLnNldF90ZXJtaW9zID0gdHR5MzI3MF9zZXRfdGVybWlvcwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKaW5kZXggZDFhMTQyZmEuLjg5OWFhNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwpAQCAtMzEyLDExICszMTIsOSBAQAogCQlyZXR1cm4gLUVOT1NZUzsKIAogCS8qIEJlc3VyZSB0aGlzIGRldmljZSBoYXNuJ3QgYWxyZWFkeSBiZWVuIG9wZW5lZCAqLwotCWxvY2tfa2VybmVsKCk7CiAJc3Bpbl9sb2NrX2JoKCZsb2dwdHItPnByaXZfbG9jayk7CiAJaWYgKGxvZ3B0ci0+ZGV2X2luX3VzZSkJewogCQlzcGluX3VubG9ja19iaCgmbG9ncHRyLT5wcml2X2xvY2spOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWxvZ3B0ci0+ZGV2X2luX3VzZSA9IDE7CkBAIC0zNjAsOSArMzU4LDggQEAKIAkJICAgfHwgKGxvZ3B0ci0+aXVjdl9wYXRoX3NldmVyZWQpKTsKIAlpZiAobG9ncHRyLT5pdWN2X3BhdGhfc2V2ZXJlZCkKIAkJZ290byBvdXRfcmVjb3JkOwotIAlyZXQgPSBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJldDsKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKKwlyZXR1cm4gMDsKIAogb3V0X3JlY29yZDoKIAlpZiAobG9ncHRyLT5hdXRvcmVjb3JkaW5nKQpAQCAtMzcyLDcgKzM2OSw2IEBACiAJbG9ncHRyLT5wYXRoID0gTlVMTDsKIG91dF9kZXY6CiAJbG9ncHRyLT5kZXZfaW5fdXNlID0gMDsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIC1FSU87CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYwppbmRleCA3NzU3MWI2Li5jYzU2ZmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jCkBAIC02OTUsNyArNjk1LDYgQEAKIAogCWlmIChhY2Ntb2RlID09IE9fUkRXUikKIAkJcmV0dXJuIC1FQUNDRVM7Ci0JbG9ja19rZXJuZWwoKTsKIAkvKgogCSAqIFdlIHRyZWF0IHRoZSBtaW5vciBudW1iZXIgYXMgdGhlIGRldm5vIG9mIHRoZSB1ciBkZXZpY2UKIAkgKiB0byBmaW5kIGluIHRoZSBkcml2ZXIgdHJlZS4KQEAgLTc0OSw3ICs3NDgsNiBAQAogCQlnb3RvIGZhaWxfdXJmaWxlX2ZyZWU7CiAJdXJmLT5maWxlX3JlY2xlbiA9IHJjOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHVyZjsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiAKIGZhaWxfdXJmaWxlX2ZyZWU6CkBAIC03NjEsNyArNzU5LDYgQEAKIGZhaWxfcHV0OgogCXVyZGV2X3B1dCh1cmQpOwogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3Ztd2F0Y2hkb2cuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3Ztd2F0Y2hkb2cuYwppbmRleCBmMmJjMjg3Li5jOTc0MDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci92bXdhdGNoZG9nLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm13YXRjaGRvZy5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDksNiArNDgsOCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdm13ZHRfaXNfb3BlbjsKIHN0YXRpYyBpbnQgdm13ZHRfZXhwZWN0X2Nsb3NlOwogCitzdGF0aWMgREVGSU5FX01VVEVYKHZtd2R0X211dGV4KTsKKwogI2RlZmluZSBWTVdEVF9PUEVOCTAJLyogZGV2bm9kZSBpcyBvcGVuIG9yIHN1c3BlbmQgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgVk1XRFRfUlVOTklORwkxCS8qIFRoZSB3YXRjaGRvZyBpcyBhcm1lZCAqLwogCkBAIC0xMzMsMTUgKzEzNCwxMSBAQAogc3RhdGljIGludCB2bXdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpCiB7CiAJaW50IHJldDsKLQlsb2NrX2tlcm5lbCgpOwotCWlmICh0ZXN0X2FuZF9zZXRfYml0KFZNV0RUX09QRU4sICZ2bXdkdF9pc19vcGVuKSkgewotCQl1bmxvY2tfa2VybmVsKCk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoVk1XRFRfT1BFTiwgJnZtd2R0X2lzX29wZW4pKQogCQlyZXR1cm4gLUVCVVNZOwotCX0KIAlyZXQgPSB2bXdkdF9rZWVwYWxpdmUoKTsKIAlpZiAocmV0KQogCQljbGVhcl9iaXQoVk1XRFRfT1BFTiwgJnZtd2R0X2lzX29wZW4pOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmV0ID8gcmV0IDogbm9uc2Vla2FibGVfb3BlbihpLCBmKTsKIH0KIApAQCAtMTYwLDggKzE1Nyw3IEBACiAJLmlkZW50aXR5ID0gInovVk0gV2F0Y2hkb2cgVGltZXIiLAogfTsKIAotc3RhdGljIGludCB2bXdkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBmaWxlICpmLAotCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgX192bXdkdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKQEAgLTIwNSwxMCArMjAxLDE5IEBACiAJY2FzZSBXRElPQ19LRUVQQUxJVkU6CiAJCXJldHVybiB2bXdkdF9rZWVwYWxpdmUoKTsKIAl9Ci0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGxvbmcgdm13ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYzsKKworCW11dGV4X2xvY2soJnZtd2R0X211dGV4KTsKKwlyYyA9IF9fdm13ZHRfaW9jdGwoY21kLCBhcmcpOworCW11dGV4X3VubG9jaygmdm13ZHRfbXV0ZXgpOworCXJldHVybiAobG9uZykgcmM7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHZtd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtMjg4LDcgKzI5Myw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2bXdkdF9mb3BzID0gewogCS5vcGVuICAgID0gJnZtd2R0X29wZW4sCiAJLnJlbGVhc2UgPSAmdm13ZHRfY2xvc2UsCi0JLmlvY3RsICAgPSAmdm13ZHRfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsID0gJnZtd2R0X2lvY3RsLAogCS53cml0ZSAgID0gJnZtd2R0X3dyaXRlLAogCS5vd25lciAgID0gVEhJU19NT0RVTEUsCiB9OwpAQCAtMzA5LDYgKzMxNCwxMCBAQAogCXJldCA9IHJlZ2lzdGVyX3BtX25vdGlmaWVyKCZ2bXdkdF9wb3dlcl9ub3RpZmllcik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwkvKgorCSAqIG1pc2NfcmVnaXN0ZXIoKSBoYXMgdG8gYmUgdGhlIGxhc3QgYWN0aW9uIGluIG1vZHVsZV9pbml0KCksIGJlY2F1c2UKKwkgKiBmaWxlIG9wZXJhdGlvbnMgd2lsbCBiZSBhdmFpbGFibGUgcmlnaHQgYWZ0ZXIgdGhpcy4KKwkgKi8KIAlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ2bXdkdF9kZXYpOwogCWlmIChyZXQpIHsKIAkJdW5yZWdpc3Rlcl9wbV9ub3RpZmllcigmdm13ZHRfcG93ZXJfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9NYWtlZmlsZSBiL2RyaXZlcnMvczM5MC9jaW8vTWFrZWZpbGUKaW5kZXggZmE0Yzk2Ni4uZDAzMzQxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3MzOTAvY2lvL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiBvYmoteSArPSBhaXJxLm8gYmxhY2tsaXN0Lm8gY2hzYy5vIGNpby5vIGNzcy5vIGNocC5vIGlkc2V0Lm8gaXNjLm8gXAotCWZjeC5vIGl0Y3cubyBjcncubworCWZjeC5vIGl0Y3cubyBjcncubyBjY3dyZXEubwogY2N3X2RldmljZS1vYmpzICs9IGRldmljZS5vIGRldmljZV9mc20ubyBkZXZpY2Vfb3BzLm8KIGNjd19kZXZpY2Utb2JqcyArPSBkZXZpY2VfaWQubyBkZXZpY2VfcGdpZC5vIGRldmljZV9zdGF0dXMubwogb2JqLXkgKz0gY2N3X2RldmljZS5vIGNtZi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Njd3JlcS5jIGIvZHJpdmVycy9zMzkwL2Npby9jY3dyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA5ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jY3dyZXEuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqICBIYW5kbGluZyBvZiBpbnRlcm5hbCBDQ1cgZGV2aWNlIHJlcXVlc3RzLgorICoKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOQorICogICAgQXV0aG9yKHMpOiBQZXRlciBPYmVycGFybGVpdGVyIDxwZXRlci5vYmVycGFybGVpdGVyQGRlLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgorI2luY2x1ZGUgPGFzbS9jaW8uaD4KKworI2luY2x1ZGUgImlvX3NjaC5oIgorI2luY2x1ZGUgImNpby5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgorCisvKioKKyAqIGxwbV9hZGp1c3QgLSBhZGp1c3QgcGF0aCBtYXNrCisgKiBAbHBtOiBwYXRoIG1hc2sgdG8gYWRqdXN0CisgKiBAbWFzazogbWFzayBvZiBhdmFpbGFibGUgcGF0aHMKKyAqCisgKiBTaGlmdCBAbHBtIHJpZ2h0IHVudGlsIEBscG0gYW5kIEBtYXNrIGhhdmUgYXQgbGVhc3Qgb25lIGJpdCBpbiBjb21tb24gb3IKKyAqIHVudGlsIEBscG0gaXMgemVyby4gUmV0dXJuIHRoZSByZXN1bHRpbmcgbHBtLgorICovCitpbnQgbHBtX2FkanVzdChpbnQgbHBtLCBpbnQgbWFzaykKK3sKKwl3aGlsZSAobHBtICYmICgobHBtICYgbWFzaykgPT0gMCkpCisJCWxwbSA+Pj0gMTsKKwlyZXR1cm4gbHBtOworfQorCisvKgorICogQWRqdXN0IHBhdGggbWFzayB0byB1c2UgbmV4dCBwYXRoIGFuZCByZXNldCByZXRyeSBjb3VudC4gUmV0dXJuIHJlc3VsdGluZworICogcGF0aCBtYXNrLgorICovCitzdGF0aWMgdTE2IGNjd3JlcV9uZXh0X3BhdGgoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCisJcmVxLT5yZXRyaWVzCT0gcmVxLT5tYXhyZXRyaWVzOworCXJlcS0+bWFzawk9IGxwbV9hZGp1c3QocmVxLT5tYXNrID4+PSAxLCByZXEtPmxwbSk7CisKKwlyZXR1cm4gcmVxLT5tYXNrOworfQorCisvKgorICogQ2xlYW4gdXAgZGV2aWNlIHN0YXRlIGFuZCByZXBvcnQgdG8gY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIGNjd3JlcV9zdG9wKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBpbnQgcmMpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCisJaWYgKHJlcS0+ZG9uZSkKKwkJcmV0dXJuOworCXJlcS0+ZG9uZSA9IDE7CisJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAwKTsKKwltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKKwlzY2gtPmxwbSA9IHNjaC0+c2NoaWIucG1jdy5wYW07CisJaWYgKHJjICYmIHJjICE9IC1FTk9ERVYgJiYgcmVxLT5kcmMpCisJCXJjID0gcmVxLT5kcmM7CisJcmVxLT5jYWxsYmFjayhjZGV2LCByZXEtPmRhdGEsIHJjKTsKK30KKworLyoKKyAqIChSZS0pU3RhcnQgdGhlIG9wZXJhdGlvbiB1bnRpbCByZXRyaWVzIGFuZCBwYXRocyBhcmUgZXhoYXVzdGVkLgorICovCitzdGF0aWMgdm9pZCBjY3dyZXFfZG8oc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBjY3cxICpjcCA9IHJlcS0+Y3A7CisJaW50IHJjID0gLUVBQ0NFUzsKKworCXdoaWxlIChyZXEtPm1hc2spIHsKKwkJaWYgKHJlcS0+cmV0cmllcy0tID09IDApIHsKKwkJCS8qIFJldHJpZXMgZXhoYXVzdGVkLCB0cnkgbmV4dCBwYXRoLiAqLworCQkJY2N3cmVxX25leHRfcGF0aChjZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFBlcmZvcm0gc3RhcnQgZnVuY3Rpb24uICovCisJCXNjaC0+bHBtID0gMHhmZjsKKwkJbWVtc2V0KCZjZGV2LT5wcml2YXRlLT5pcmIsIDAsIHNpemVvZihzdHJ1Y3QgaXJiKSk7CisJCXJjID0gY2lvX3N0YXJ0KHNjaCwgY3AsICh1OCkgcmVxLT5tYXNrKTsKKwkJaWYgKHJjID09IDApIHsKKwkJCS8qIEkvTyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4gKi8KKwkJCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgcmVxLT50aW1lb3V0KTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocmMgPT0gLUVOT0RFVikgeworCQkJLyogUGVybWFuZW50IGRldmljZSBlcnJvci4gKi8KKwkJCWJyZWFrOworCQl9CisJCWlmIChyYyA9PSAtRUFDQ0VTKSB7CisJCQkvKiBQZXJtYW50IHBhdGggZXJyb3IuICovCisJCQljY3dyZXFfbmV4dF9wYXRoKGNkZXYpOworCQkJY29udGludWU7CisJCX0KKwkJLyogVGVtcG9yYXJ5IGltcHJvcGVyIHN0YXR1cy4gKi8KKwkJcmMgPSBjaW9fY2xlYXIoc2NoKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisJCXJldHVybjsKKwl9CisJY2N3cmVxX3N0b3AoY2RldiwgcmMpOworfQorCisvKioKKyAqIGNjd19yZXF1ZXN0X3N0YXJ0IC0gcGVyZm9ybSBJL08gcmVxdWVzdAorICogQGNkZXY6IGNjdyBkZXZpY2UKKyAqCisgKiBQZXJmb3JtIHRoZSBJL08gcmVxdWVzdCBzcGVjaWZpZWQgYnkgY2Rldi0+cmVxLgorICovCit2b2lkIGNjd19yZXF1ZXN0X3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKKworCS8qIFRyeSBhbGwgcGF0aHMgdHdpY2UgdG8gY291bnRlciBsaW5rIGZsYXBwaW5nLiAqLworCXJlcS0+bWFzawk9IDB4ODA4MDsKKwlyZXEtPnJldHJpZXMJPSByZXEtPm1heHJldHJpZXM7CisJcmVxLT5tYXNrCT0gbHBtX2FkanVzdChyZXEtPm1hc2ssIHJlcS0+bHBtKTsKKwlyZXEtPmRyYwk9IDA7CisJcmVxLT5kb25lCT0gMDsKKwlyZXEtPmNhbmNlbAk9IDA7CisJaWYgKCFyZXEtPm1hc2spCisJCWdvdG8gb3V0X25vcGF0aDsKKwljY3dyZXFfZG8oY2Rldik7CisJcmV0dXJuOworCitvdXRfbm9wYXRoOgorCWNjd3JlcV9zdG9wKGNkZXYsIC1FQUNDRVMpOworfQorCisvKioKKyAqIGNjd19yZXF1ZXN0X2NhbmNlbCAtIGNhbmNlbCBydW5uaW5nIEkvTyByZXF1ZXN0CisgKiBAY2RldjogY2N3IGRldmljZQorICoKKyAqIENhbmNlbCB0aGUgSS9PIHJlcXVlc3Qgc3BlY2lmaWVkIGJ5IGNkZXYtPnJlcS4gUmV0dXJuIG5vbi16ZXJvIGlmIHJlcXVlc3QKKyAqIGhhcyBhbHJlYWR5IGZpbmlzaGVkLCB6ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IGNjd19yZXF1ZXN0X2NhbmNlbChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgY2N3X3JlcXVlc3QgKnJlcSA9ICZjZGV2LT5wcml2YXRlLT5yZXE7CisJaW50IHJjOworCisJaWYgKHJlcS0+ZG9uZSkKKwkJcmV0dXJuIDE7CisJcmVxLT5jYW5jZWwgPSAxOworCXJjID0gY2lvX2NsZWFyKHNjaCk7CisJaWYgKHJjKQorCQljY3dyZXFfc3RvcChjZGV2LCByYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgaW50ZXJuYWwgSS9PIHN0YXJ0ZWQgb24gdGhlIHNwZWNpZmllZCBjY3cgZGV2aWNlLgorICogUGVyZm9ybSBCQVNJQyBTRU5TRSBpZiByZXF1aXJlZC4KKyAqLworc3RhdGljIGVudW0gaW9fc3RhdHVzIGNjd3JlcV9zdGF0dXMoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHN0cnVjdCBpcmIgKmxjaXJiKQoreworCXN0cnVjdCBpcmIgKmlyYiA9ICZjZGV2LT5wcml2YXRlLT5pcmI7CisJc3RydWN0IGNtZF9zY3N3ICpzY3N3ID0gJmlyYi0+c2Nzdy5jbWQ7CisKKwkvKiBQZXJmb3JtIEJBU0lDIFNFTlNFIGlmIG5lZWRlZC4gKi8KKwlpZiAoY2N3X2RldmljZV9hY2N1bXVsYXRlX2FuZF9zZW5zZShjZGV2LCBsY2lyYikpCisJCXJldHVybiBJT19SVU5OSU5HOworCS8qIENoZWNrIGZvciBoYWx0L2NsZWFyIGludGVycnVwdC4gKi8KKwlpZiAoc2Nzdy0+ZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKQorCQlyZXR1cm4gSU9fS0lMTEVEOworCS8qIENoZWNrIGZvciBwYXRoIGVycm9yLiAqLworCWlmIChzY3N3LT5jYyA9PSAzIHx8IHNjc3ctPnBubykKKwkJcmV0dXJuIElPX1BBVEhfRVJST1I7CisJLyogSGFuZGxlIEJBU0lDIFNFTlNFIGRhdGEuICovCisJaWYgKGlyYi0+ZXN3LmVzdzAuZXJ3LmNvbnMpIHsKKwkJQ0lPX1RSQUNFX0VWRU5UKDIsICJzZW5zZWRhdGEiKTsKKwkJQ0lPX0hFWF9FVkVOVCgyLCAmY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjY3dfZGV2X2lkKSk7CisJCUNJT19IRVhfRVZFTlQoMiwgJmNkZXYtPnByaXZhdGUtPmlyYi5lY3csIFNFTlNFX01BWF9DT1VOVCk7CisJCS8qIENoZWNrIGZvciBjb21tYW5kIHJlamVjdC4gKi8KKwkJaWYgKGlyYi0+ZWN3WzBdICYgU05TMF9DTURfUkVKRUNUKQorCQkJcmV0dXJuIElPX1JFSkVDVEVEOworCQkvKiBBc3N1bWUgdGhhdCB1bmV4cGVjdGVkIFNFTlNFIGRhdGEgaW1wbGllcyBhbiBlcnJvci4gKi8KKwkJcmV0dXJuIElPX1NUQVRVU19FUlJPUjsKKwl9CisJLyogQ2hlY2sgZm9yIGNoYW5uZWwgZXJyb3JzLiAqLworCWlmIChzY3N3LT5jc3RhdCAhPSAwKQorCQlyZXR1cm4gSU9fU1RBVFVTX0VSUk9SOworCS8qIENoZWNrIGZvciBkZXZpY2UgZXJyb3JzLiAqLworCWlmIChzY3N3LT5kc3RhdCAmIH4oREVWX1NUQVRfQ0hOX0VORCB8IERFVl9TVEFUX0RFVl9FTkQpKQorCQlyZXR1cm4gSU9fU1RBVFVTX0VSUk9SOworCS8qIENoZWNrIGZvciBmaW5hbCBzdGF0ZS4gKi8KKwlpZiAoIShzY3N3LT5kc3RhdCAmIERFVl9TVEFUX0RFVl9FTkQpKQorCQlyZXR1cm4gSU9fUlVOTklORzsKKwkvKiBDaGVjayBmb3Igb3RoZXIgaW1wcm9wZXIgc3RhdHVzLiAqLworCWlmIChzY3N3LT5jYyA9PSAxICYmIChzY3N3LT5zdGN0bCAmIFNDU1dfU1RDVExfQUxFUlRfU1RBVFVTKSkKKwkJcmV0dXJuIElPX1NUQVRVU19FUlJPUjsKKwlyZXR1cm4gSU9fRE9ORTsKK30KKworLyoKKyAqIExvZyBjY3cgcmVxdWVzdCBzdGF0dXMuCisgKi8KK3N0YXRpYyB2b2lkIGNjd3JlcV9sb2dfc3RhdHVzKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBlbnVtIGlvX3N0YXR1cyBzdGF0dXMpCit7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCXN0cnVjdCB7CisJCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsKKwkJdTE2IHJldHJpZXM7CisJCXU4IGxwbTsKKwkJdTggc3RhdHVzOworCX0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkYXRhOworCWRhdGEuZGV2X2lkCT0gY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkOworCWRhdGEucmV0cmllcwk9IHJlcS0+cmV0cmllczsKKwlkYXRhLmxwbQk9ICh1OCkgcmVxLT5tYXNrOworCWRhdGEuc3RhdHVzCT0gKHU4KSBzdGF0dXM7CisJQ0lPX1RSQUNFX0VWRU5UKDIsICJyZXFzdGF0Iik7CisJQ0lPX0hFWF9FVkVOVCgyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK30KKworLyoqCisgKiBjY3dfcmVxdWVzdF9oYW5kbGVyIC0gaW50ZXJydXB0IGhhbmRsZXIgZm9yIEkvTyByZXF1ZXN0IHByb2NlZHVyZS4KKyAqIEBjZGV2OiBjY3cgZGV2aWNlCisgKgorICogSGFuZGxlIGludGVycnVwdCBkdXJpbmcgSS9PIHJlcXVlc3QgcHJvY2VkdXJlLgorICovCit2b2lkIGNjd19yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCXN0cnVjdCBpcmIgKmlyYiA9IChzdHJ1Y3QgaXJiICopIF9fTENfSVJCOworCWVudW0gaW9fc3RhdHVzIHN0YXR1czsKKwlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKKworCS8qIENoZWNrIHN0YXR1cyBvZiBJL08gcmVxdWVzdC4gKi8KKwlzdGF0dXMgPSBjY3dyZXFfc3RhdHVzKGNkZXYsIGlyYik7CisJaWYgKHJlcS0+ZmlsdGVyKQorCQlzdGF0dXMgPSByZXEtPmZpbHRlcihjZGV2LCByZXEtPmRhdGEsIGlyYiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzICE9IElPX1JVTk5JTkcpCisJCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgMCk7CisJaWYgKHN0YXR1cyAhPSBJT19ET05FICYmIHN0YXR1cyAhPSBJT19SVU5OSU5HKQorCQljY3dyZXFfbG9nX3N0YXR1cyhjZGV2LCBzdGF0dXMpOworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBJT19ET05FOgorCQlicmVhazsKKwljYXNlIElPX1JVTk5JTkc6CisJCXJldHVybjsKKwljYXNlIElPX1JFSkVDVEVEOgorCQlnb3RvIGVycjsKKwljYXNlIElPX1BBVEhfRVJST1I6CisJCWdvdG8gb3V0X25leHRfcGF0aDsKKwljYXNlIElPX1NUQVRVU19FUlJPUjoKKwkJZ290byBvdXRfcmVzdGFydDsKKwljYXNlIElPX0tJTExFRDoKKwkJLyogQ2hlY2sgaWYgcmVxdWVzdCB3YXMgY2FuY2VsbGVkIG9uIHB1cnBvc2UuICovCisJCWlmIChyZXEtPmNhbmNlbCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnI7CisJCX0KKwkJZ290byBvdXRfcmVzdGFydDsKKwl9CisJLyogQ2hlY2sgYmFjayB3aXRoIHJlcXVlc3QgaW5pdGlhdG9yLiAqLworCWlmICghcmVxLT5jaGVjaykKKwkJZ290byBvdXQ7CisJc3dpdGNoIChyZXEtPmNoZWNrKGNkZXYsIHJlcS0+ZGF0YSkpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgLUVBR0FJTjoKKwkJZ290byBvdXRfcmVzdGFydDsKKwljYXNlIC1FQUNDRVM6CisJCWdvdG8gb3V0X25leHRfcGF0aDsKKwlkZWZhdWx0OgorCQlnb3RvIGVycjsKKwl9CitvdXQ6CisJY2N3cmVxX3N0b3AoY2RldiwgMCk7CisJcmV0dXJuOworCitvdXRfbmV4dF9wYXRoOgorCS8qIFRyeSBuZXh0IHBhdGggYW5kIHJlc3RhcnQgSS9PLiAqLworCWlmICghY2N3cmVxX25leHRfcGF0aChjZGV2KSkgeworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZXJyOworCX0KK291dF9yZXN0YXJ0OgorCS8qIFJlc3RhcnQuICovCisJY2N3cmVxX2RvKGNkZXYpOworCXJldHVybjsKK2VycjoKKwljY3dyZXFfc3RvcChjZGV2LCByYyk7Cit9CisKKworLyoqCisgKiBjY3dfcmVxdWVzdF90aW1lb3V0IC0gdGltZW91dCBoYW5kbGVyIGZvciBJL08gcmVxdWVzdCBwcm9jZWR1cmUKKyAqIEBjZGV2OiBjY3cgZGV2aWNlCisgKgorICogSGFuZGxlIHRpbWVvdXQgZHVyaW5nIEkvTyByZXF1ZXN0IHByb2NlZHVyZS4KKyAqLwordm9pZCBjY3dfcmVxdWVzdF90aW1lb3V0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKKwlpbnQgcmM7CisKKwlpZiAoIWNjd3JlcV9uZXh0X3BhdGgoY2RldikpIHsKKwkJLyogc2V0IHRoZSBmaW5hbCByZXR1cm4gY29kZSBmb3IgdGhpcyByZXF1ZXN0ICovCisJCXJlcS0+ZHJjID0gLUVUSU1FOworCX0KKwlyYyA9IGNpb19jbGVhcihzY2gpOworCWlmIChyYykKKwkJZ290byBlcnI7CisJcmV0dXJuOworCitlcnI6CisJY2N3cmVxX3N0b3AoY2RldiwgcmMpOworfQorCisvKioKKyAqIGNjd19yZXF1ZXN0X25vdG9wZXIgLSBub3RvcGVyIGhhbmRsZXIgZm9yIEkvTyByZXF1ZXN0IHByb2NlZHVyZQorICogQGNkZXY6IGNjdyBkZXZpY2UKKyAqCisgKiBIYW5kbGUgdGltZW91dCBkdXJpbmcgSS9PIHJlcXVlc3QgcHJvY2VkdXJlLgorICovCit2b2lkIGNjd19yZXF1ZXN0X25vdG9wZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJY2N3cmVxX3N0b3AoY2RldiwgLUVOT0RFVik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuYwppbmRleCA4YWI1MTYwLi5jMjY4YTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAljaHBpZF90b19jaHAoY2hwaWQpLT5zdGF0ZSA9IG9ub2ZmOwogfQogCi0vKiBPbiBzdWNjZXMgcmV0dXJuIDAgaWYgY2hhbm5lbC1wYXRoIGlzIHZhcmllZCBvZmZsaW5lLCAxIGlmIGl0IGlzIHZhcmllZAorLyogT24gc3VjY2VzcyByZXR1cm4gMCBpZiBjaGFubmVsLXBhdGggaXMgdmFyaWVkIG9mZmxpbmUsIDEgaWYgaXQgaXMgdmFyaWVkCiAgKiBvbmxpbmUuIFJldHVybiAtRU5PREVWIGlmIGNoYW5uZWwtcGF0aCBpcyBub3QgcmVnaXN0ZXJlZC4gKi8KIGludCBjaHBfZ2V0X3N0YXR1cyhzdHJ1Y3QgY2hwX2lkIGNocGlkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKaW5kZXggMmU0MzU1OC4uYmY3ZjgwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCkBAIC02OCw2ICs2OCwxMSBAQAogCV9fdTggbWRhWzRdOwkJIC8qIG1vZGVsIGRlcGVuZGVudCBhcmVhICovCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg0KSkpOwogCitlbnVtIHNjaF90b2RvIHsKKwlTQ0hfVE9ET19OT1RISU5HLAorCVNDSF9UT0RPX1VOUkVHLAorfTsKKwogLyogc3ViY2hhbm5lbCBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IEkvTyBzdWJyb3V0aW5lcyAqLwogc3RydWN0IHN1YmNoYW5uZWwgewogCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOwpAQCAtOTUsNyArMTAwLDggQEAKIAlzdHJ1Y3QgZGV2aWNlIGRldjsJLyogZW50cnkgaW4gZGV2aWNlIHRyZWUgKi8KIAlzdHJ1Y3QgY3NzX2RyaXZlciAqZHJpdmVyOwogCXZvaWQgKnByaXZhdGU7IC8qIHByaXZhdGUgcGVyIHN1YmNoYW5uZWwgdHlwZSBkYXRhICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJZW51bSBzY2hfdG9kbyB0b2RvOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0b2RvX3dvcms7CiAJc3RydWN0IHNjaGliX2NvbmZpZyBjb25maWc7CiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY21mLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2NtZi5jCmluZGV4IDMwZjUxNjEuLjI5ODVlYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY21mLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jbWYuYwpAQCAtNDYyLDcgKzQ2Miw3IEBACiAgKiBibG9jayBvZiBtZW1vcnksIHdoaWNoIGNhbiBub3QgYmUgbW92ZWQgYXMgbG9uZyBhcyBhbnkgY2hhbm5lbAogICogaXMgYWN0aXZlLiBUaGVyZWZvcmUsIGEgbWF4aW11bSBudW1iZXIgb2Ygc3ViY2hhbm5lbHMgbmVlZHMgdG8KICAqIGJlIGRlZmluZWQgc29tZXdoZXJlLiBUaGlzIGlzIGEgbW9kdWxlIHBhcmFtZXRlciwgZGVmYXVsdGluZyB0bwotICogYSByZXNvbmFibGUgdmFsdWUgb2YgMTAyNCwgb3IgMzIga2Igb2YgbWVtb3J5LgorICogYSByZWFzb25hYmxlIHZhbHVlIG9mIDEwMjQsIG9yIDMyIGtiIG9mIG1lbW9yeS4KICAqIEN1cnJlbnQga2VybmVscyBkb24ndCBhbGxvdyBrbWFsbG9jIHdpdGggbW9yZSB0aGFuIDEyOGtiLCBzbyB0aGUKICAqIG1heGltdW0gaXMgNDA5Ni4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKaW5kZXggOTFjMjU3MC4uOTJmZjg4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCkBAIC0xMzMsNiArMTMzLDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyB2b2lkIGNzc19zY2hfdG9kbyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCiBzdGF0aWMgc3RydWN0IHN1YmNoYW5uZWwgKgogY3NzX2FsbG9jX3N1YmNoYW5uZWwoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQpCiB7CkBAIC0xNDcsNiArMTQ5LDcgQEAKIAkJa2ZyZWUoc2NoKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CisJSU5JVF9XT1JLKCZzY2gtPnRvZG9fd29yaywgY3NzX3NjaF90b2RvKTsKIAlyZXR1cm4gc2NoOwogfQogCkBAIC0xOTAsNiArMTkzLDUxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKTsKIAorc3RhdGljIHZvaWQgY3NzX3NjaF90b2RvKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOworCWVudW0gc2NoX3RvZG8gdG9kbzsKKworCXNjaCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3ViY2hhbm5lbCwgdG9kb193b3JrKTsKKwkvKiBGaW5kIG91dCB0b2RvLiAqLworCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKKwl0b2RvID0gc2NoLT50b2RvOworCUNJT19NU0dfRVZFTlQoNCwgInNjaF90b2RvOiBzY2g9MC4leC4lMDR4LCB0b2RvPSVkXG4iLCBzY2gtPnNjaGlkLnNzaWQsCisJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vLCB0b2RvKTsKKwlzY2gtPnRvZG8gPSBTQ0hfVE9ET19OT1RISU5HOworCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOworCS8qIFBlcmZvcm0gdG9kby4gKi8KKwlpZiAodG9kbyA9PSBTQ0hfVE9ET19VTlJFRykKKwkJY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzY2gpOworCS8qIFJlbGVhc2Ugd29ya3F1ZXVlIHJlZi4gKi8KKwlwdXRfZGV2aWNlKCZzY2gtPmRldik7Cit9CisKKy8qKgorICogY3NzX3NjaGVkX3NjaF90b2RvIC0gc2NoZWR1bGUgYSBzdWJjaGFubmVsIG9wZXJhdGlvbgorICogQHNjaDogc3ViY2hhbm5lbAorICogQHRvZG86IHRvZG8KKyAqCisgKiBTY2hlZHVsZSB0aGUgb3BlcmF0aW9uIGlkZW50aWZpZWQgYnkgQHRvZG8gdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBzbG93IHBhdGgKKyAqIHdvcmtxdWV1ZS4gRG8gbm90aGluZyBpZiBhbm90aGVyIG9wZXJhdGlvbiB3aXRoIGhpZ2hlciBwcmlvcml0eSBpcyBhbHJlYWR5CisgKiBzY2hlZHVsZWQuIE5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIHN1YmNoYW5uZWwgbG9jayBoZWxkLgorICovCit2b2lkIGNzc19zY2hlZF9zY2hfdG9kbyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLCBlbnVtIHNjaF90b2RvIHRvZG8pCit7CisJQ0lPX01TR19FVkVOVCg0LCAic2NoX3RvZG86IHNjaGVkIHNjaD0wLiV4LiUwNHggdG9kbz0lZFxuIiwKKwkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubywgdG9kbyk7CisJaWYgKHNjaC0+dG9kbyA+PSB0b2RvKQorCQlyZXR1cm47CisJLyogR2V0IHdvcmtxdWV1ZSByZWYuICovCisJaWYgKCFnZXRfZGV2aWNlKCZzY2gtPmRldikpCisJCXJldHVybjsKKwlzY2gtPnRvZG8gPSB0b2RvOworCWlmICghcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZzY2gtPnRvZG9fd29yaykpIHsKKwkJLyogQWxyZWFkeSBxdWV1ZWQsIHJlbGVhc2Ugd29ya3F1ZXVlIHJlZi4gKi8KKwkJcHV0X2RldmljZSgmc2NoLT5kZXYpOworCX0KK30KKwogc3RhdGljIHZvaWQgc3NkX2Zyb21fcG1jdyhzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkLCBzdHJ1Y3QgcG1jdyAqcG1jdykKIHsKIAlpbnQgaTsKQEAgLTM3Niw4ICs0MjQsOCBAQAogCQkvKiBVbnVzYWJsZSAtIGlnbm9yZS4gKi8KIAkJcmV0dXJuIDA7CiAJfQotCUNJT19NU0dfRVZFTlQoNCwgIkV2YWx1YXRpbmcgc2NoaWQgMC4leC4lMDR4LCBldmVudCAlZCwgdW5rbm93biwgIgotCQkJICJzbG93IHBhdGguXG4iLCBzY2hpZC5zc2lkLCBzY2hpZC5zY2hfbm8sIENJT19PUEVSKTsKKwlDSU9fTVNHX0VWRU5UKDQsICJldmVudDogc2NoIDAuJXguJTA0eCwgbmV3XG4iLCBzY2hpZC5zc2lkLAorCQkgICAgICBzY2hpZC5zY2hfbm8pOwogCiAJcmV0dXJuIGNzc19wcm9iZV9kZXZpY2Uoc2NoaWQpOwogfQpAQCAtMzk0LDYgKzQ0MiwxMCBAQAogCQkJCSJHb3Qgc3ViY2hhbm5lbCBtYWNoaW5lIGNoZWNrIGJ1dCAiCiAJCQkJIm5vIHNjaF9ldmVudCBoYW5kbGVyIHByb3ZpZGVkLlxuIik7CiAJfQorCWlmIChyZXQgIT0gMCAmJiByZXQgIT0gLUVBR0FJTikgeworCQlDSU9fTVNHX0VWRU5UKDIsICJldmFsOiBzY2ggMC4leC4lMDR4LCByYz0lZFxuIiwKKwkJCSAgICAgIHNjaC0+c2NoaWQuc3NpZCwgc2NoLT5zY2hpZC5zY2hfbm8sIHJldCk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY4NCw2ICs3MzYsNyBAQAogCWNzcy0+cHNldWRvX3N1YmNoYW5uZWwtPmRldi5wYXJlbnQgPSAmY3NzLT5kZXZpY2U7CiAJY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2LnJlbGVhc2UgPSBjc3Nfc3ViY2hhbm5lbF9yZWxlYXNlOwogCWRldl9zZXRfbmFtZSgmY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2LCAiZGVmdW5jdCIpOworCW11dGV4X2luaXQoJmNzcy0+cHNldWRvX3N1YmNoYW5uZWwtPnJlZ19tdXRleCk7CiAJcmV0ID0gY2lvX2NyZWF0ZV9zY2hfbG9jayhjc3MtPnBzZXVkb19zdWJjaGFubmVsKTsKIAlpZiAocmV0KSB7CiAJCWtmcmVlKGNzcy0+cHNldWRvX3N1YmNoYW5uZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuaCBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKaW5kZXggNjhkNmIwYi4uZmU4NGI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAjaW5jbHVkZSA8YXNtL3NjaGlkLmg+CiAKKyNpbmNsdWRlICJjaW8uaCIKKwogLyoKICAqIHBhdGggZ3JvdXBpbmcgc3R1ZmYKICAqLwpAQCAtMTUxLDQgKzE1Myw1IEBACiAKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc2xvd19wYXRoX3dxOwogdm9pZCBjc3Nfd2FpdF9mb3Jfc2xvd19wYXRoKHZvaWQpOwordm9pZCBjc3Nfc2NoZWRfc2NoX3RvZG8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwgZW51bSBzY2hfdG9kbyB0b2RvKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggMjQ5MGI3NC4uOWZlY2ZiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC03LDYgKzcsMTAgQEAKICAqCQkgQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCiAgKi8KKworI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiY2lvIgorI2RlZmluZSBwcl9mbXQoZm10KSBLTVNHX0NPTVBPTkVOVCAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0yOTksNTMgKzMwMywxOCBAQAogCiBzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCkpIHsKKwlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmNkZXYtPmRldikpIHsKKwkJLyogVW5kbyBkZXZpY2VfYWRkKCkuICovCiAJCWRldmljZV9kZWwoJmNkZXYtPmRldik7CisJfQorCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbml0aWFsaXplZCkgeworCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbml0aWFsaXplZCA9IDA7CiAJCS8qIFJlbGVhc2UgcmVmZXJlbmNlIGZyb20gZGV2aWNlX2luaXRpYWxpemUoKS4gKi8KIAkJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGNjd19kZXZpY2VfcmVtb3ZlX29ycGhhbl9jYihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKLQotCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKLQljZGV2ID0gcHJpdi0+Y2RldjsKLQljY3dfZGV2aWNlX3VucmVnaXN0ZXIoY2Rldik7Ci0JLyogUmVsZWFzZSBjZGV2IHJlZmVyZW5jZSBmb3Igd29ya3F1ZXVlIHByb2Nlc3NpbmcuICovCi0JcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKLX0KLQotc3RhdGljIHZvaWQKLWNjd19kZXZpY2VfcmVtb3ZlX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyoKLQkgKiBGb3JjZWQgb2ZmbGluZSBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgbWVhbnMKLQkgKiAndGhyb3cgYXdheSBkZXZpY2UnLgotCSAqLwotCWlmIChjY3dfZGV2aWNlX2lzX29ycGhhbihjZGV2KSkgewotCQkvKgotCQkgKiBEZXJlZ2lzdGVyIGNjdyBkZXZpY2UuCi0JCSAqIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCBkbyB0aGlzIGRpcmVjdGx5IGZyb20gdGhlCi0JCSAqIGF0dHJpYnV0ZSBtZXRob2QuCi0JCSAqLwotCQkvKiBHZXQgY2RldiByZWZlcmVuY2UgZm9yIHdvcmtxdWV1ZSBwcm9jZXNzaW5nLiAqLwotCQlpZiAoIWdldF9kZXZpY2UoJmNkZXYtPmRldikpCi0JCQlyZXR1cm47Ci0JCXNwaW5fbG9ja19pcnFzYXZlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKLQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwotCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCQljY3dfZGV2aWNlX3JlbW92ZV9vcnBoYW5fY2IpOwotCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7Ci0JfSBlbHNlCi0JCS8qIERlcmVnaXN0ZXIgc3ViY2hhbm5lbCwgd2hpY2ggd2lsbCBraWxsIHRoZSBjY3cgZGV2aWNlLiAqLwotCQljY3dfZGV2aWNlX3NjaGVkdWxlX3NjaF91bnJlZ2lzdGVyKGNkZXYpOwotfQorc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9xdWllc2NlKHN0cnVjdCBzdWJjaGFubmVsICopOwogCiAvKioKICAqIGNjd19kZXZpY2Vfc2V0X29mZmxpbmUoKSAtIGRpc2FibGUgYSBjY3cgZGV2aWNlIGZvciBJL08KQEAgLTM2MCw3ICszMjksOCBAQAogICovCiBpbnQgY2N3X2RldmljZV9zZXRfb2ZmbGluZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisJaW50IHJldCwgc3RhdGU7CiAKIAlpZiAoIWNkZXYpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMzc0LDYgKzM0NCw3IEBACiAJfQogCWNkZXYtPm9ubGluZSA9IDA7CiAJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKKwlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCS8qIFdhaXQgdW50aWwgYSBmaW5hbCBzdGF0ZSBvciBESVNDT05ORUNURUQgaXMgcmVhY2hlZCAqLwogCXdoaWxlICghZGV2X2ZzbV9maW5hbF9zdGF0ZShjZGV2KSAmJgogCSAgICAgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfRElTQ09OTkVDVEVEKSB7CkBAIC0zODIsMjAgKzM1MywzNyBAQAogCQkJICAgY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0RJU0NPTk5FQ1RFRCkpOwogCQlzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwogCX0KLQlyZXQgPSBjY3dfZGV2aWNlX29mZmxpbmUoY2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKKwlkbyB7CisJCXJldCA9IGNjd19kZXZpY2Vfb2ZmbGluZShjZGV2KTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKwkJQ0lPX01TR19FVkVOVCgwLCAiY2N3X2RldmljZV9vZmZsaW5lIHJldHVybmVkICVkLCBkZXZpY2UgIgorCQkJICAgICAgIjAuJXguJTA0eFxuIiwgcmV0LCBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CisJCWlmIChyZXQgIT0gLUVCVVNZKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdGUgPSBjZGV2LT5wcml2YXRlLT5zdGF0ZTsKKwkJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOworCQlpb19zdWJjaGFubmVsX3F1aWVzY2Uoc2NoKTsKKwkJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKKwkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBzdGF0ZTsKKwl9IHdoaWxlIChyZXQgPT0gLUVCVVNZKTsKIAlzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CiAJd2FpdF9ldmVudChjZGV2LT5wcml2YXRlLT53YWl0X3EsIChkZXZfZnNtX2ZpbmFsX3N0YXRlKGNkZXYpIHx8CiAJCSAgIGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9ESVNDT05ORUNURUQpKTsKKwkvKiBJbmZvcm0gdGhlIHVzZXIgaWYgc2V0IG9mZmxpbmUgZmFpbGVkLiAqLworCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfQk9YRUQpIHsKKwkJcHJfd2FybmluZygiJXM6IFRoZSBkZXZpY2UgZW50ZXJlZCBib3hlZCBzdGF0ZSB3aGlsZSAiCisJCQkgICAiYmVpbmcgc2V0IG9mZmxpbmVcbiIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKKwl9IGVsc2UgaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9OT1RfT1BFUikgeworCQlwcl93YXJuaW5nKCIlczogVGhlIGRldmljZSBzdG9wcGVkIG9wZXJhdGluZyB3aGlsZSAiCisJCQkgICAiYmVpbmcgc2V0IG9mZmxpbmVcbiIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKKwl9CiAJLyogR2l2ZSB1cCByZWZlcmVuY2UgZnJvbSBjY3dfZGV2aWNlX3NldF9vbmxpbmUoKS4gKi8KIAlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOwogCXJldHVybiAwOwogCiBlcnJvcjoKLQlDSU9fTVNHX0VWRU5UKDAsICJjY3dfZGV2aWNlX29mZmxpbmUgcmV0dXJuZWQgJWQsIGRldmljZSAwLiV4LiUwNHhcbiIsCi0JCSAgICAgIHJldCwgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCi0JCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfT0ZGTElORTsKIAlkZXZfZnNtX2V2ZW50KGNkZXYsIERFVl9FVkVOVF9OT1RPUEVSKTsKIAlzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CkBAIC00NDgsNiArNDM2LDE2IEBACiAJaWYgKChjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfT05MSU5FKSAmJgogCSAgICAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgIT0gREVWX1NUQVRFX1c0U0VOU0UpKSB7CiAJCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKKwkJLyogSW5mb3JtIHRoZSB1c2VyIHRoYXQgc2V0IG9ubGluZSBmYWlsZWQuICovCisJCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfQk9YRUQpIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBTZXR0aW5nIHRoZSBkZXZpY2Ugb25saW5lIGZhaWxlZCAiCisJCQkJICAgImJlY2F1c2UgaXQgaXMgYm94ZWRcbiIsCisJCQkJICAgZGV2X25hbWUoJmNkZXYtPmRldikpOworCQl9IGVsc2UgaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9OT1RfT1BFUikgeworCQkJcHJfd2FybmluZygiJXM6IFNldHRpbmcgdGhlIGRldmljZSBvbmxpbmUgZmFpbGVkICIKKwkJCQkgICAiYmVjYXVzZSBpdCBpcyBub3Qgb3BlcmF0aW9uYWxcbiIsCisJCQkJICAgZGV2X25hbWUoJmNkZXYtPmRldikpOworCQl9CiAJCS8qIEdpdmUgdXAgb25saW5lIHJlZmVyZW5jZSBzaW5jZSBvbmxpbmluZyBmYWlsZWQuICovCiAJCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDk0LDI3ICs0OTIsMjIgQEAKIAogc3RhdGljIGludCBvbmxpbmVfc3RvcmVfaGFuZGxlX29mZmxpbmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7Ci0JaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9ESVNDT05ORUNURUQpCi0JCWNjd19kZXZpY2VfcmVtb3ZlX2Rpc2Nvbm5lY3RlZChjZGV2KTsKLQllbHNlIGlmIChjZGV2LT5vbmxpbmUgJiYgY2Rldi0+ZHJ2ICYmIGNkZXYtPmRydi0+c2V0X29mZmxpbmUpCisJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9ESVNDT05ORUNURUQpIHsKKwkJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKKwkJY2N3X2RldmljZV9zY2hlZF90b2RvKGNkZXYsIENERVZfVE9ET19VTlJFR19FVkFMKTsKKwkJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOworCX0gZWxzZSBpZiAoY2Rldi0+b25saW5lICYmIGNkZXYtPmRydiAmJiBjZGV2LT5kcnYtPnNldF9vZmZsaW5lKQogCQlyZXR1cm4gY2N3X2RldmljZV9zZXRfb2ZmbGluZShjZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBvbmxpbmVfc3RvcmVfcmVjb2dfYW5kX29ubGluZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKLQlpbnQgcmV0OwotCiAJLyogRG8gZGV2aWNlIHJlY29nbml0aW9uLCBpZiBuZWVkZWQuICovCiAJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9CT1hFRCkgewotCQlyZXQgPSBjY3dfZGV2aWNlX3JlY29nbml0aW9uKGNkZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlDSU9fTVNHX0VWRU5UKDAsICJDb3VsZG4ndCBzdGFydCByZWNvZ25pdGlvbiAiCi0JCQkJICAgICAgImZvciBkZXZpY2UgMC4leC4lMDR4IChyZXQ9JWQpXG4iLAotCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAotCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwkJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKKwkJY2N3X2RldmljZV9yZWNvZ25pdGlvbihjZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwogCQl3YWl0X2V2ZW50KGNkZXYtPnByaXZhdGUtPndhaXRfcSwKIAkJCSAgIGNkZXYtPnByaXZhdGUtPmZsYWdzLnJlY29nX2RvbmUpOwogCQlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgIT0gREVWX1NUQVRFX09GRkxJTkUpCkBAIC01NTMsMTEgKzU0NiwxMCBAQAogCWludCBmb3JjZSwgcmV0OwogCXVuc2lnbmVkIGxvbmcgaTsKIAotCWlmICgoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgIT0gREVWX1NUQVRFX09GRkxJTkUgJiYKLQkgICAgIGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9PTkxJTkUgJiYKLQkgICAgIGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9CT1hFRCAmJgotCSAgICAgY2Rldi0+cHJpdmF0ZS0+c3RhdGUgIT0gREVWX1NUQVRFX0RJU0NPTk5FQ1RFRCkgfHwKLQkgICAgYXRvbWljX2NtcHhjaGcoJmNkZXYtPnByaXZhdGUtPm9ub2ZmLCAwLCAxKSAhPSAwKQorCWlmICghZGV2X2ZzbV9maW5hbF9zdGF0ZShjZGV2KSAmJgorCSAgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAoYXRvbWljX2NtcHhjaGcoJmNkZXYtPnByaXZhdGUtPm9ub2ZmLCAwLCAxKSAhPSAwKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCWlmIChjZGV2LT5kcnYgJiYgIXRyeV9tb2R1bGVfZ2V0KGNkZXYtPmRydi0+b3duZXIpKSB7CkBAIC02NjUsODEgKzY1NywzMSBAQAogCQkJICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGRldmljZV9hZGQoZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jc2V0X2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZGV2aWNlX2FkZChkZXYpOwogfQogCi1zdHJ1Y3QgbWF0Y2hfZGF0YSB7Ci0Jc3RydWN0IGNjd19kZXZfaWQgZGV2X2lkOwotCXN0cnVjdCBjY3dfZGV2aWNlICogc2libGluZzsKLX07Ci0KLXN0YXRpYyBpbnQKLW1hdGNoX2Rldm5vKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHZvaWQgKiBkYXRhKQorc3RhdGljIGludCBtYXRjaF9kZXZfaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBtYXRjaF9kYXRhICogZCA9IGRhdGE7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKiBjZGV2OworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7CisJc3RydWN0IGNjd19kZXZfaWQgKmRldl9pZCA9IGRhdGE7CiAKLQljZGV2ID0gdG9fY2N3ZGV2KGRldik7Ci0JaWYgKChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfRElTQ09OTkVDVEVEKSAmJgotCSAgICAhY2N3X2RldmljZV9pc19vcnBoYW4oY2RldikgJiYKLQkgICAgY2N3X2Rldl9pZF9pc19lcXVhbCgmY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLCAmZC0+ZGV2X2lkKSAmJgotCSAgICAoY2RldiAhPSBkLT5zaWJsaW5nKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2N3X2RldmljZSAqIGdldF9kaXNjX2Njd2Rldl9ieV9kZXZfaWQoc3RydWN0IGNjd19kZXZfaWQgKmRldl9pZCwKLQkJCQkJCSAgICAgc3RydWN0IGNjd19kZXZpY2UgKnNpYmxpbmcpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBtYXRjaF9kYXRhIGRhdGE7Ci0KLQlkYXRhLmRldl9pZCA9ICpkZXZfaWQ7Ci0JZGF0YS5zaWJsaW5nID0gc2libGluZzsKLQlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmNjd19idXNfdHlwZSwgTlVMTCwgJmRhdGEsIG1hdGNoX2Rldm5vKTsKLQotCXJldHVybiBkZXYgPyB0b19jY3dkZXYoZGV2KSA6IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgbWF0Y2hfb3JwaGFuKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgY2N3X2Rldl9pZCAqZGV2X2lkOwotCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwotCi0JZGV2X2lkID0gZGF0YTsKLQljZGV2ID0gdG9fY2N3ZGV2KGRldik7CiAJcmV0dXJuIGNjd19kZXZfaWRfaXNfZXF1YWwoJmNkZXYtPnByaXZhdGUtPmRldl9pZCwgZGV2X2lkKTsKIH0KIAotc3RhdGljIHN0cnVjdCBjY3dfZGV2aWNlICoKLWdldF9vcnBoYW5lZF9jY3dkZXZfYnlfZGV2X2lkKHN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSAqY3NzLAotCQkJICAgICAgc3RydWN0IGNjd19kZXZfaWQgKmRldl9pZCkKK3N0YXRpYyBzdHJ1Y3QgY2N3X2RldmljZSAqZ2V0X2Njd2Rldl9ieV9kZXZfaWQoc3RydWN0IGNjd19kZXZfaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlkZXYgPSBkZXZpY2VfZmluZF9jaGlsZCgmY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2LCBkZXZfaWQsCi0JCQkJbWF0Y2hfb3JwaGFuKTsKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmNjd19idXNfdHlwZSwgTlVMTCwgZGV2X2lkLCBtYXRjaF9kZXZfaWQpOwogCiAJcmV0dXJuIGRldiA/IHRvX2Njd2RldihkZXYpIDogTlVMTDsKIH0KIAotdm9pZCBjY3dfZGV2aWNlX2RvX3VuYmluZF9iaW5kKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGNjd19kZXZpY2VfZG9fdW5iaW5kX2JpbmQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7Ci0Jc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCWludCByZXQ7CiAKLQlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7Ci0JY2RldiA9IHByaXYtPmNkZXY7Ci0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQotCWlmICh0ZXN0X2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCkpIHsKKwlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmNkZXYtPmRldikpIHsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZjZGV2LT5kZXYpOwogCQlyZXQgPSBkZXZpY2VfYXR0YWNoKCZjZGV2LT5kZXYpOwogCQlXQVJOX09OKHJldCA9PSAtRU5PREVWKTsKQEAgLTc3Myw2ICs3MTUsOCBAQAogCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQogCitzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX3RvZG8oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogc3RhdGljIGludCBpb19zdWJjaGFubmVsX2luaXRpYWxpemVfZGV2KHN0cnVjdCBzdWJjaGFubmVsICpzY2gsCiAJCQkJCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewpAQCAtNzgwLDcgKzcyNCw3IEBACiAJYXRvbWljX3NldCgmY2Rldi0+cHJpdmF0ZS0+b25vZmYsIDApOwogCWNkZXYtPmRldi5wYXJlbnQgPSAmc2NoLT5kZXY7CiAJY2Rldi0+ZGV2LnJlbGVhc2UgPSBjY3dfZGV2aWNlX3JlbGVhc2U7Ci0JSU5JVF9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssIE5VTEwpOworCUlOSVRfV09SSygmY2Rldi0+cHJpdmF0ZS0+dG9kb193b3JrLCBjY3dfZGV2aWNlX3RvZG8pOwogCWNkZXYtPmRldi5ncm91cHMgPSBjY3dkZXZfYXR0cl9ncm91cHM7CiAJLyogRG8gZmlyc3QgaGFsZiBvZiBkZXZpY2VfcmVnaXN0ZXIuICovCiAJZGV2aWNlX2luaXRpYWxpemUoJmNkZXYtPmRldik7CkBAIC03ODksNiArNzMzLDcgQEAKIAkJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCWNkZXYtPnByaXZhdGUtPmZsYWdzLmluaXRpYWxpemVkID0gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODA2LDc2ICs3NTEsNyBAQAogCXJldHVybiBjZGV2OwogfQogCi1zdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfcmVjb2coc3RydWN0IGNjd19kZXZpY2UgKiwgc3RydWN0IHN1YmNoYW5uZWwgKik7Ci0KLXN0YXRpYyB2b2lkIHNjaF9hdHRhY2hfZGV2aWNlKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsCi0JCQkgICAgICBzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKLXsKLQljc3NfdXBkYXRlX3NzZF9pbmZvKHNjaCk7Ci0Jc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwotCXNjaF9zZXRfY2RldihzY2gsIGNkZXYpOwotCWNkZXYtPnByaXZhdGUtPnNjaGlkID0gc2NoLT5zY2hpZDsKLQljZGV2LT5jY3dsb2NrID0gc2NoLT5sb2NrOwotCWNjd19kZXZpY2VfdHJpZ2dlcl9yZXByb2JlKGNkZXYpOwotCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBzY2hfYXR0YWNoX2Rpc2Nvbm5lY3RlZF9kZXZpY2Uoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwKLQkJCQkJICAgc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCi17Ci0Jc3RydWN0IHN1YmNoYW5uZWwgKm90aGVyX3NjaDsKLQlpbnQgcmV0OwotCi0JLyogR2V0IHJlZmVyZW5jZSBmb3IgbmV3IHBhcmVudC4gKi8KLQlpZiAoIWdldF9kZXZpY2UoJnNjaC0+ZGV2KSkKLQkJcmV0dXJuOwotCW90aGVyX3NjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0JLyogTm90ZTogZGV2aWNlX21vdmUoKSBjaGFuZ2VzIGNkZXYtPmRldi5wYXJlbnQgKi8KLQlyZXQgPSBkZXZpY2VfbW92ZSgmY2Rldi0+ZGV2LCAmc2NoLT5kZXYsIERQTV9PUkRFUl9QQVJFTlRfQkVGT1JFX0RFVik7Ci0JaWYgKHJldCkgewotCQlDSU9fTVNHX0VWRU5UKDAsICJNb3ZpbmcgZGlzY29ubmVjdGVkIGRldmljZSAwLiV4LiUwNHggZmFpbGVkICIKLQkJCSAgICAgICIocmV0PSVkKSFcbiIsIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCByZXQpOwotCQkvKiBQdXQgcmVmZXJlbmNlIGZvciBuZXcgcGFyZW50LiAqLwotCQlwdXRfZGV2aWNlKCZzY2gtPmRldik7Ci0JCXJldHVybjsKLQl9Ci0Jc2NoX3NldF9jZGV2KG90aGVyX3NjaCwgTlVMTCk7Ci0JLyogTm8gbmVlZCB0byBrZWVwIGEgc3ViY2hhbm5lbCB3aXRob3V0IGNjdyBkZXZpY2UgYXJvdW5kLiAqLwotCWNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIob3RoZXJfc2NoKTsKLQlzY2hfYXR0YWNoX2RldmljZShzY2gsIGNkZXYpOwotCS8qIFB1dCByZWZlcmVuY2UgZm9yIG9sZCBwYXJlbnQuICovCi0JcHV0X2RldmljZSgmb3RoZXJfc2NoLT5kZXYpOwotfQotCi1zdGF0aWMgdm9pZCBzY2hfYXR0YWNoX29ycGhhbmVkX2RldmljZShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLAotCQkJCSAgICAgICBzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzdWJjaGFubmVsICpwc2V1ZG9fc2NoOwotCi0JLyogR2V0IHJlZmVyZW5jZSBmb3IgbmV3IHBhcmVudC4gKi8KLQlpZiAoIWdldF9kZXZpY2UoJnNjaC0+ZGV2KSkKLQkJcmV0dXJuOwotCXBzZXVkb19zY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCS8qCi0JICogVHJ5IHRvIG1vdmUgdGhlIGNjdyBkZXZpY2UgdG8gaXRzIG5ldyBzdWJjaGFubmVsLgotCSAqIE5vdGU6IGRldmljZV9tb3ZlKCkgY2hhbmdlcyBjZGV2LT5kZXYucGFyZW50Ci0JICovCi0JcmV0ID0gZGV2aWNlX21vdmUoJmNkZXYtPmRldiwgJnNjaC0+ZGV2LCBEUE1fT1JERVJfUEFSRU5UX0JFRk9SRV9ERVYpOwotCWlmIChyZXQpIHsKLQkJQ0lPX01TR19FVkVOVCgwLCAiTW92aW5nIGRldmljZSAwLiV4LiUwNHggZnJvbSBvcnBoYW5hZ2UgIgotCQkJICAgICAgImZhaWxlZCAocmV0PSVkKSFcbiIsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgcmV0KTsKLQkJLyogUHV0IHJlZmVyZW5jZSBmb3IgbmV3IHBhcmVudC4gKi8KLQkJcHV0X2RldmljZSgmc2NoLT5kZXYpOwotCQlyZXR1cm47Ci0JfQotCXNjaF9hdHRhY2hfZGV2aWNlKHNjaCwgY2Rldik7Ci0JLyogUHV0IHJlZmVyZW5jZSBvbiBwc2V1ZG8gc3ViY2hhbm5lbC4gKi8KLQlwdXRfZGV2aWNlKCZwc2V1ZG9fc2NoLT5kZXYpOwotfQorc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9yZWNvZyhzdHJ1Y3QgY2N3X2RldmljZSAqLCBzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIAogc3RhdGljIHZvaWQgc2NoX2NyZWF0ZV9hbmRfcmVjb2dfbmV3X2RldmljZShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewpAQCAtODg4LDEwMCArNzY0LDE5IEBACiAJCWNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIoc2NoKTsKIAkJcmV0dXJuOwogCX0KLQlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7Ci0Jc2NoX3NldF9jZGV2KHNjaCwgY2Rldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CiAJLyogU3RhcnQgcmVjb2duaXRpb24gZm9yIHRoZSBuZXcgY2N3IGRldmljZS4gKi8KLQlpZiAoaW9fc3ViY2hhbm5lbF9yZWNvZyhjZGV2LCBzY2gpKSB7Ci0JCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQkJc2NoX3NldF9jZGV2KHNjaCwgTlVMTCk7Ci0JCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwotCQljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKHNjaCk7Ci0JCS8qIFB1dCByZWZlcmVuY2UgZnJvbSBpb19zdWJjaGFubmVsX2NyZWF0ZV9jY3dkZXYoKS4gKi8KLQkJcHV0X2RldmljZSgmc2NoLT5kZXYpOwotCQkvKiBHaXZlIHVwIGluaXRpYWwgcmVmZXJlbmNlLiAqLwotCQlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOwotCX0KLX0KLQotCi12b2lkIGNjd19kZXZpY2VfbW92ZV90b19vcnBoYW5hZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKnJlcGxhY2luZ19jZGV2OwotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKmNzczsKLQlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZfaWQ7Ci0KLQlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7Ci0JY2RldiA9IHByaXYtPmNkZXY7Ci0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQljc3MgPSB0b19jc3Moc2NoLT5kZXYucGFyZW50KTsKLQlkZXZfaWQuZGV2bm8gPSBzY2gtPnNjaGliLnBtY3cuZGV2OwotCWRldl9pZC5zc2lkID0gc2NoLT5zY2hpZC5zc2lkOwotCi0JLyogSW5jcmVhc2UgcmVmY291bnQgZm9yIHBzZXVkbyBzdWJjaGFubmVsLiAqLwotCWdldF9kZXZpY2UoJmNzcy0+cHNldWRvX3N1YmNoYW5uZWwtPmRldik7Ci0JLyoKLQkgKiBNb3ZlIHRoZSBvcnBoYW5lZCBjY3cgZGV2aWNlIHRvIHRoZSBvcnBoYW5hZ2Ugc28gdGhlIHJlcGxhY2luZwotCSAqIGNjdyBkZXZpY2UgY2FuIHRha2UgaXRzIHBsYWNlIG9uIHRoZSBzdWJjaGFubmVsLgotCSAqIE5vdGU6IGRldmljZV9tb3ZlKCkgY2hhbmdlcyBjZGV2LT5kZXYucGFyZW50Ci0JICovCi0JcmV0ID0gZGV2aWNlX21vdmUoJmNkZXYtPmRldiwgJmNzcy0+cHNldWRvX3N1YmNoYW5uZWwtPmRldiwKLQkJRFBNX09SREVSX05PTkUpOwotCWlmIChyZXQpIHsKLQkJQ0lPX01TR19FVkVOVCgwLCAiTW92aW5nIGRldmljZSAwLiV4LiUwNHggdG8gb3JwaGFuYWdlIGZhaWxlZCAiCi0JCQkgICAgICAiKHJldD0lZCkhXG4iLCBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgcmV0KTsKLQkJLyogRGVjcmVhc2UgcmVmY291bnQgZm9yIHBzZXVkbyBzdWJjaGFubmVsIGFnYWluLiAqLwotCQlwdXRfZGV2aWNlKCZjc3MtPnBzZXVkb19zdWJjaGFubmVsLT5kZXYpOwotCQlyZXR1cm47Ci0JfQotCWNkZXYtPmNjd2xvY2sgPSBjc3MtPnBzZXVkb19zdWJjaGFubmVsLT5sb2NrOwotCS8qCi0JICogU2VhcmNoIGZvciB0aGUgcmVwbGFjaW5nIGNjdyBkZXZpY2UKLQkgKiAtIGFtb25nIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlcwotCSAqIC0gaW4gdGhlIG9ycGhhbmFnZQotCSAqLwotCXJlcGxhY2luZ19jZGV2ID0gZ2V0X2Rpc2NfY2N3ZGV2X2J5X2Rldl9pZCgmZGV2X2lkLCBjZGV2KTsKLQlpZiAocmVwbGFjaW5nX2NkZXYpIHsKLQkJc2NoX2F0dGFjaF9kaXNjb25uZWN0ZWRfZGV2aWNlKHNjaCwgcmVwbGFjaW5nX2NkZXYpOwotCQkvKiBSZWxlYXNlIHJlZmVyZW5jZSBmcm9tIGdldF9kaXNjX2Njd2Rldl9ieV9kZXZfaWQoKSAqLwotCQlwdXRfZGV2aWNlKCZyZXBsYWNpbmdfY2Rldi0+ZGV2KTsKLQkJLyogUmVsZWFzZSByZWZlcmVuY2Ugb2Ygc3ViY2hhbm5lbCBmcm9tIG9sZCBjZGV2LiAqLwotCQlwdXRfZGV2aWNlKCZzY2gtPmRldik7Ci0JCXJldHVybjsKLQl9Ci0JcmVwbGFjaW5nX2NkZXYgPSBnZXRfb3JwaGFuZWRfY2N3ZGV2X2J5X2Rldl9pZChjc3MsICZkZXZfaWQpOwotCWlmIChyZXBsYWNpbmdfY2RldikgewotCQlzY2hfYXR0YWNoX29ycGhhbmVkX2RldmljZShzY2gsIHJlcGxhY2luZ19jZGV2KTsKLQkJLyogUmVsZWFzZSByZWZlcmVuY2UgZnJvbSBnZXRfb3JwaGFuZWRfY2N3ZGV2X2J5X2Rldl9pZCgpICovCi0JCXB1dF9kZXZpY2UoJnJlcGxhY2luZ19jZGV2LT5kZXYpOwotCQkvKiBSZWxlYXNlIHJlZmVyZW5jZSBvZiBzdWJjaGFubmVsIGZyb20gb2xkIGNkZXYuICovCi0JCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKLQkJcmV0dXJuOwotCX0KLQlzY2hfY3JlYXRlX2FuZF9yZWNvZ19uZXdfZGV2aWNlKHNjaCk7Ci0JLyogUmVsZWFzZSByZWZlcmVuY2Ugb2Ygc3ViY2hhbm5lbCBmcm9tIG9sZCBjZGV2LiAqLwotCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKKwlpb19zdWJjaGFubmVsX3JlY29nKGNkZXYsIHNjaCk7CiB9CiAKIC8qCiAgKiBSZWdpc3RlciByZWNvZ25pemVkIGRldmljZS4KICAqLwotc3RhdGljIHZvaWQKLWlvX3N1YmNoYW5uZWxfcmVnaXN0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9yZWdpc3RlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKLQlzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlICpwcml2OwotCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlLCBraWNrX3dvcmspOwotCWNkZXYgPSBwcml2LT5jZGV2OwogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAJLyoKIAkgKiBDaGVjayBpZiBzdWJjaGFubmVsIGlzIHN0aWxsIHJlZ2lzdGVyZWQuIEl0IG1heSBoYXZlIGJlY29tZQpAQCAtMTAzMyw0MSArODI4LDIzIEBACiAJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucmVjb2dfZG9uZSA9IDE7CiAJd2FrZV91cCgmY2Rldi0+cHJpdmF0ZS0+d2FpdF9xKTsKIG91dF9lcnI6Ci0JLyogUmVsZWFzZSByZWZlcmVuY2UgZm9yIHdvcmtxdWV1ZSBwcm9jZXNzaW5nLiAqLwotCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNjd19kZXZpY2VfaW5pdF9jb3VudCkpCiAJCXdha2VfdXAoJmNjd19kZXZpY2VfaW5pdF93cSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3RlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7Ci0Jc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCi0JcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlLCBraWNrX3dvcmspOwotCWNkZXYgPSBwcml2LT5jZGV2OwogCS8qIEdldCBzdWJjaGFubmVsIHJlZmVyZW5jZSBmb3IgbG9jYWwgcHJvY2Vzc2luZy4gKi8KIAlpZiAoIWdldF9kZXZpY2UoY2Rldi0+ZGV2LnBhcmVudCkpCiAJCXJldHVybjsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCWNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIoc2NoKTsKLQkvKiBSZWxlYXNlIGNkZXYgcmVmZXJlbmNlIGZvciB3b3JrcXVldWUgcHJvY2Vzc2luZy4qLwotCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CiAJLyogUmVsZWFzZSBzdWJjaGFubmVsIHJlZmVyZW5jZSBmb3IgbG9jYWwgcHJvY2Vzc2luZy4gKi8KIAlwdXRfZGV2aWNlKCZzY2gtPmRldik7CiB9CiAKLXZvaWQgY2N3X2RldmljZV9zY2hlZHVsZV9zY2hfdW5yZWdpc3RlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKLXsKLQkvKiBHZXQgY2RldiByZWZlcmVuY2UgZm9yIHdvcmtxdWV1ZSBwcm9jZXNzaW5nLiAqLwotCWlmICghZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkKLQkJcmV0dXJuOwotCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkgICAgIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3Rlcik7Ci0JcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwotfQotCiAvKgogICogc3ViY2hhbm5lbCByZWNvZ25pdGlvbiBkb25lLiBDYWxsZWQgZnJvbSB0aGUgc3RhdGUgbWFjaGluZS4KICAqLwpAQCAtMTA4Myw3ICs4NjAsOCBAQAogCQkvKiBEZXZpY2UgZGlkIG5vdCByZXNwb25kIGluIHRpbWUuICovCiAJY2FzZSBERVZfU1RBVEVfTk9UX09QRVI6CiAJCWNkZXYtPnByaXZhdGUtPmZsYWdzLnJlY29nX2RvbmUgPSAxOwotCQljY3dfZGV2aWNlX3NjaGVkdWxlX3NjaF91bnJlZ2lzdGVyKGNkZXYpOworCQkvKiBSZW1vdmUgZGV2aWNlIGZvdW5kIG5vdCBvcGVyYXRpb25hbC4gKi8KKwkJY2N3X2RldmljZV9zY2hlZF90b2RvKGNkZXYsIENERVZfVE9ET19VTlJFRyk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjY3dfZGV2aWNlX2luaXRfY291bnQpKQogCQkJd2FrZV91cCgmY2N3X2RldmljZV9pbml0X3dxKTsKIAkJYnJlYWs7CkBAIC0xMDkyLDIyICs4NzAsMTUgQEAKIAkJICogV2UgY2FuJ3QgcmVnaXN0ZXIgdGhlIGRldmljZSBpbiBpbnRlcnJ1cHQgY29udGV4dCBzbwogCQkgKiB3ZSBzY2hlZHVsZSBhIHdvcmsgaXRlbS4KIAkJICovCi0JCWlmICghZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkKLQkJCWJyZWFrOwotCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCSAgICAgaW9fc3ViY2hhbm5lbF9yZWdpc3Rlcik7Ci0JCXF1ZXVlX3dvcmsoc2xvd19wYXRoX3dxLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKKwkJY2N3X2RldmljZV9zY2hlZF90b2RvKGNkZXYsIENERVZfVE9ET19SRUdJU1RFUik7CiAJCWJyZWFrOwogCX0KIH0KIAotc3RhdGljIGludAotaW9fc3ViY2hhbm5lbF9yZWNvZyhzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3N0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfcmVjb2coc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7Ci0JaW50IHJjOwogCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7CiAKLQlzY2hfc2V0X2NkZXYoc2NoLCBjZGV2KTsKIAljZGV2LT5jY3dsb2NrID0gc2NoLT5sb2NrOwogCiAJLyogSW5pdCBwcml2YXRlIGRhdGEuICovCkBAIC0xMTI1LDYyICs4OTYsODEgQEAKIAogCS8qIFN0YXJ0IGFzeW5jLiBkZXZpY2Ugc2Vuc2luZy4gKi8KIAlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7Ci0JcmMgPSBjY3dfZGV2aWNlX3JlY29nbml0aW9uKGNkZXYpOworCXNjaF9zZXRfY2RldihzY2gsIGNkZXYpOworCWNjd19kZXZpY2VfcmVjb2duaXRpb24oY2Rldik7CiAJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7Ci0JaWYgKHJjKSB7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjY3dfZGV2aWNlX2luaXRfY291bnQpKQotCQkJd2FrZV91cCgmY2N3X2RldmljZV9pbml0X3dxKTsKLQl9Ci0JcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBjY3dfZGV2aWNlX21vdmVfdG9fc2NoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbnQgY2N3X2RldmljZV9tb3ZlX3RvX3NjaChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKKwkJCQkgIHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7Ci0Jc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgcmM7Ci0Jc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqZm9ybWVyX3BhcmVudDsKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqb2xkX3NjaDsKKwlpbnQgcmMsIG9sZF9lbmFibGVkID0gMDsKIAotCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKLQlzY2ggPSBwcml2LT5zY2g7Ci0JY2RldiA9IHByaXYtPmNkZXY7Ci0JZm9ybWVyX3BhcmVudCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0JLyogR2V0IHJlZmVyZW5jZSBmb3IgbmV3IHBhcmVudC4gKi8KKwlvbGRfc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKKwkvKiBPYnRhaW4gY2hpbGQgcmVmZXJlbmNlIGZvciBuZXcgcGFyZW50LiAqLwogCWlmICghZ2V0X2RldmljZSgmc2NoLT5kZXYpKQotCQlyZXR1cm47CisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFzY2hfaXNfcHNldWRvX3NjaChvbGRfc2NoKSkgeworCQlzcGluX2xvY2tfaXJxKG9sZF9zY2gtPmxvY2spOworCQlvbGRfZW5hYmxlZCA9IG9sZF9zY2gtPnNjaGliLnBtY3cuZW5hOworCQlyYyA9IDA7CisJCWlmIChvbGRfZW5hYmxlZCkKKwkJCXJjID0gY2lvX2Rpc2FibGVfc3ViY2hhbm5lbChvbGRfc2NoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKG9sZF9zY2gtPmxvY2spOworCQlpZiAocmMgPT0gLUVCVVNZKSB7CisJCQkvKiBSZWxlYXNlIGNoaWxkIHJlZmVyZW5jZSBmb3IgbmV3IHBhcmVudC4gKi8KKwkJCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKwogCW11dGV4X2xvY2soJnNjaC0+cmVnX211dGV4KTsKLQkvKgotCSAqIFRyeSB0byBtb3ZlIHRoZSBjY3cgZGV2aWNlIHRvIGl0cyBuZXcgc3ViY2hhbm5lbC4KLQkgKiBOb3RlOiBkZXZpY2VfbW92ZSgpIGNoYW5nZXMgY2Rldi0+ZGV2LnBhcmVudAotCSAqLwogCXJjID0gZGV2aWNlX21vdmUoJmNkZXYtPmRldiwgJnNjaC0+ZGV2LCBEUE1fT1JERVJfUEFSRU5UX0JFRk9SRV9ERVYpOwogCW11dGV4X3VubG9jaygmc2NoLT5yZWdfbXV0ZXgpOwogCWlmIChyYykgewotCQlDSU9fTVNHX0VWRU5UKDAsICJNb3ZpbmcgZGV2aWNlIDAuJXguJTA0eCB0byBzdWJjaGFubmVsICIKLQkJCSAgICAgICIwLiV4LiUwNHggZmFpbGVkIChyZXQ9JWQpIVxuIiwKKwkJQ0lPX01TR19FVkVOVCgwLCAiZGV2aWNlX21vdmUoMC4leC4lMDR4LDAuJXguJTA0eCk9JWRcbiIsCiAJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKIAkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAotCQkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIHJjKTsKLQkJY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzY2gpOwotCQkvKiBQdXQgcmVmZXJlbmNlIGZvciBuZXcgcGFyZW50IGFnYWluLiAqLworCQkJICAgICAgc2NoLT5zY2hpYi5wbWN3LmRldiwgcmMpOworCQlpZiAob2xkX2VuYWJsZWQpIHsKKwkJCS8qIFRyeSB0byByZWVuYWJsZSB0aGUgb2xkIHN1YmNoYW5uZWwuICovCisJCQlzcGluX2xvY2tfaXJxKG9sZF9zY2gtPmxvY2spOworCQkJY2lvX2VuYWJsZV9zdWJjaGFubmVsKG9sZF9zY2gsICh1MzIpKGFkZHJfdClvbGRfc2NoKTsKKwkJCXNwaW5fdW5sb2NrX2lycShvbGRfc2NoLT5sb2NrKTsKKwkJfQorCQkvKiBSZWxlYXNlIGNoaWxkIHJlZmVyZW5jZSBmb3IgbmV3IHBhcmVudC4gKi8KIAkJcHV0X2RldmljZSgmc2NoLT5kZXYpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJjOwogCX0KLQlpZiAoIXNjaF9pc19wc2V1ZG9fc2NoKGZvcm1lcl9wYXJlbnQpKSB7Ci0JCXNwaW5fbG9ja19pcnEoZm9ybWVyX3BhcmVudC0+bG9jayk7Ci0JCXNjaF9zZXRfY2Rldihmb3JtZXJfcGFyZW50LCBOVUxMKTsKLQkJc3Bpbl91bmxvY2tfaXJxKGZvcm1lcl9wYXJlbnQtPmxvY2spOwotCQljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKGZvcm1lcl9wYXJlbnQpOwotCQkvKiBSZXNldCBpbnRwYXJtIHRvIHplcm9lcy4gKi8KLQkJZm9ybWVyX3BhcmVudC0+Y29uZmlnLmludHBhcm0gPSAwOwotCQljaW9fY29tbWl0X2NvbmZpZyhmb3JtZXJfcGFyZW50KTsKKwkvKiBDbGVhbiB1cCBvbGQgc3ViY2hhbm5lbC4gKi8KKwlpZiAoIXNjaF9pc19wc2V1ZG9fc2NoKG9sZF9zY2gpKSB7CisJCXNwaW5fbG9ja19pcnEob2xkX3NjaC0+bG9jayk7CisJCXNjaF9zZXRfY2RldihvbGRfc2NoLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2tfaXJxKG9sZF9zY2gtPmxvY2spOworCQljc3Nfc2NoZWR1bGVfZXZhbChvbGRfc2NoLT5zY2hpZCk7CiAJfQotCXNjaF9hdHRhY2hfZGV2aWNlKHNjaCwgY2Rldik7Ci1vdXQ6Ci0JLyogUHV0IHJlZmVyZW5jZSBmb3Igb2xkIHBhcmVudC4gKi8KLQlwdXRfZGV2aWNlKCZmb3JtZXJfcGFyZW50LT5kZXYpOwotCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CisJLyogUmVsZWFzZSBjaGlsZCByZWZlcmVuY2UgZm9yIG9sZCBwYXJlbnQuICovCisJcHV0X2RldmljZSgmb2xkX3NjaC0+ZGV2KTsKKwkvKiBJbml0aWFsaXplIG5ldyBzdWJjaGFubmVsLiAqLworCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKKwljZGV2LT5wcml2YXRlLT5zY2hpZCA9IHNjaC0+c2NoaWQ7CisJY2Rldi0+Y2N3bG9jayA9IHNjaC0+bG9jazsKKwlpZiAoIXNjaF9pc19wc2V1ZG9fc2NoKHNjaCkpCisJCXNjaF9zZXRfY2RldihzY2gsIGNkZXYpOworCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOworCWlmICghc2NoX2lzX3BzZXVkb19zY2goc2NoKSkKKwkJY3NzX3VwZGF0ZV9zc2RfaW5mbyhzY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNjd19kZXZpY2VfbW92ZV90b19vcnBoKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSAqY3NzID0gdG9fY3NzKHNjaC0+ZGV2LnBhcmVudCk7CisKKwlyZXR1cm4gY2N3X2RldmljZV9tb3ZlX3RvX3NjaChjZGV2LCBjc3MtPnBzZXVkb19zdWJjaGFubmVsKTsKIH0KIAogc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9pcnEoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKQEAgLTExOTksOSArOTg5LDYgQEAKIHsKIAltZW1zZXQoJnNjaC0+Y29uZmlnLCAwLCBzaXplb2Yoc2NoLT5jb25maWcpKTsKIAlzY2gtPmNvbmZpZy5jc2Vuc2UgPSAxOwotCS8qIFVzZSBzdWJjaGFubmVsIG1wIG1vZGUgd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBpbnN0YWxsZWQgQ0hQSUQuICovCi0JaWYgKChzY2gtPnNjaGliLnBtY3cucGltICYgKHNjaC0+c2NoaWIucG1jdy5waW0gLSAxKSkgIT0gMCkKLQkJc2NoLT5jb25maWcubXAgPSAxOwogfQogCiBzdGF0aWMgdm9pZCBpb19zdWJjaGFubmVsX2luaXRfZmllbGRzKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCkBAIC0xMjIyLDIzICsxMDA5LDYgQEAKIAlpb19zdWJjaGFubmVsX2luaXRfY29uZmlnKHNjaCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfZG9fdW5yZWcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0KLQlzY2ggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHN1YmNoYW5uZWwsIHdvcmspOwotCWNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIoc2NoKTsKLQlwdXRfZGV2aWNlKCZzY2gtPmRldik7Ci19Ci0KLS8qIFNjaGVkdWxlIHVucmVnaXN0ZXIgaWYgd2UgaGF2ZSBubyBjZGV2LiAqLwotc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9zY2hlZHVsZV9yZW1vdmFsKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCi17Ci0JZ2V0X2RldmljZSgmc2NoLT5kZXYpOwotCUlOSVRfV09SSygmc2NoLT53b3JrLCBpb19zdWJjaGFubmVsX2RvX3VucmVnKTsKLQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNjaC0+d29yayk7Ci19Ci0KIC8qCiAgKiBOb3RlOiBXZSBhbHdheXMgcmV0dXJuIDAgc28gdGhhdCB3ZSBiaW5kIHRvIHRoZSBkZXZpY2UgZXZlbiBvbiBlcnJvci4KICAqIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgb3VyIHJlbW92ZSBmdW5jdGlvbiBpcyBjYWxsZWQgb24gdW5yZWdpc3Rlci4KQEAgLTEyNDcsOCArMTAxNyw2IEBACiB7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJaW50IHJjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGNjd19kZXZfaWQgZGV2X2lkOwogCiAJaWYgKGNpb19pc19jb25zb2xlKHNjaC0+c2NoaWQpKSB7CiAJCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzY2gtPmRldi5rb2JqLApAQCAtMTI2OCw2ICsxMDM2LDcgQEAKIAkJY2RldiA9IHNjaF9nZXRfY2RldihzY2gpOwogCQljZGV2LT5kZXYuZ3JvdXBzID0gY2N3ZGV2X2F0dHJfZ3JvdXBzOwogCQlkZXZpY2VfaW5pdGlhbGl6ZSgmY2Rldi0+ZGV2KTsKKwkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW5pdGlhbGl6ZWQgPSAxOwogCQljY3dfZGV2aWNlX3JlZ2lzdGVyKGNkZXYpOwogCQkvKgogCQkgKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIGFscmVhZHkgb25saW5lLiBJZiBpdCBpcwpAQCAtMTI5Miw0NCArMTA2MSwxNCBAQAogCXNjaC0+cHJpdmF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb19zdWJjaGFubmVsX3ByaXZhdGUpLAogCQkJICAgICAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIXNjaC0+cHJpdmF0ZSkKLQkJZ290byBvdXRfZXJyOwotCS8qCi0JICogRmlyc3QgY2hlY2sgaWYgYSBmaXR0aW5nIGRldmljZSBtYXkgYmUgZm91bmQgYW1vbmdzdCB0aGUKLQkgKiBkaXNjb25uZWN0ZWQgZGV2aWNlcyBvciBpbiB0aGUgb3JwaGFuYWdlLgotCSAqLwotCWRldl9pZC5kZXZubyA9IHNjaC0+c2NoaWIucG1jdy5kZXY7Ci0JZGV2X2lkLnNzaWQgPSBzY2gtPnNjaGlkLnNzaWQ7Ci0JY2RldiA9IGdldF9kaXNjX2Njd2Rldl9ieV9kZXZfaWQoJmRldl9pZCwgTlVMTCk7Ci0JaWYgKCFjZGV2KQotCQljZGV2ID0gZ2V0X29ycGhhbmVkX2Njd2Rldl9ieV9kZXZfaWQodG9fY3NzKHNjaC0+ZGV2LnBhcmVudCksCi0JCQkJCQkgICAgICZkZXZfaWQpOwotCWlmIChjZGV2KSB7Ci0JCS8qCi0JCSAqIFNjaGVkdWxlIG1vdmluZyB0aGUgZGV2aWNlIHVudGlsIHdoZW4gd2UgaGF2ZSBhIHJlZ2lzdGVyZWQKLQkJICogc3ViY2hhbm5lbCB0byBtb3ZlIHRvIGFuZCBzdWNjZWVkIHRoZSBwcm9iZS4gV2UgY2FuCi0JCSAqIHVucmVnaXN0ZXIgbGF0ZXIgYWdhaW4sIHdoZW4gdGhlIHByb2JlIGlzIHRocm91Z2guCi0JCSAqLwotCQljZGV2LT5wcml2YXRlLT5zY2ggPSBzY2g7Ci0JCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJICAgICBjY3dfZGV2aWNlX21vdmVfdG9fc2NoKTsKLQkJcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2RldiA9IGlvX3N1YmNoYW5uZWxfY3JlYXRlX2Njd2RldihzY2gpOwotCWlmIChJU19FUlIoY2RldikpCi0JCWdvdG8gb3V0X2VycjsKLQlyYyA9IGlvX3N1YmNoYW5uZWxfcmVjb2coY2Rldiwgc2NoKTsKLQlpZiAocmMpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoc2NoLT5sb2NrLCBmbGFncyk7Ci0JCWlvX3N1YmNoYW5uZWxfcmVjb2dfZG9uZShjZGV2KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY2gtPmxvY2ssIGZsYWdzKTsKLQl9CisJCWdvdG8gb3V0X3NjaGVkdWxlOworCWNzc19zY2hlZHVsZV9ldmFsKHNjaC0+c2NoaWQpOwogCXJldHVybiAwOwotb3V0X2VycjoKLQlrZnJlZShzY2gtPnByaXZhdGUpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2NoLT5kZXYua29iaiwgJmlvX3N1YmNoYW5uZWxfYXR0cl9ncm91cCk7CisKIG91dF9zY2hlZHVsZToKLQlpb19zdWJjaGFubmVsX3NjaGVkdWxlX3JlbW92YWwoc2NoKTsKKwlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7CisJY3NzX3NjaGVkX3NjaF90b2RvKHNjaCwgU0NIX1RPRE9fVU5SRUcpOworCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xMzM3LDMyICsxMDc2LDIzIEBACiBpb19zdWJjaGFubmVsX3JlbW92ZSAoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKIHsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJY2RldiA9IHNjaF9nZXRfY2RldihzY2gpOwogCWlmICghY2RldikKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0X2ZyZWU7CisJaW9fc3ViY2hhbm5lbF9xdWllc2NlKHNjaCk7CiAJLyogU2V0IGNjdyBkZXZpY2UgdG8gbm90IG9wZXJhdGlvbmFsIGFuZCBkcm9wIHJlZmVyZW5jZS4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKIAlzY2hfc2V0X2NkZXYoc2NoLCBOVUxMKTsKIAljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CiAJY2N3X2RldmljZV91bnJlZ2lzdGVyKGNkZXYpOworb3V0X2ZyZWU6CiAJa2ZyZWUoc2NoLT5wcml2YXRlKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnNjaC0+ZGV2LmtvYmosICZpb19zdWJjaGFubmVsX2F0dHJfZ3JvdXApOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfbm90aWZ5KHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKLQotCWNkZXYgPSBzY2hfZ2V0X2NkZXYoc2NoKTsKLQlpZiAoIWNkZXYpCi0JCXJldHVybiAwOwotCXJldHVybiBjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBldmVudCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfdmVyaWZ5KHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CkBAIC0xMzcyLDM2ICsxMTAyLDYgQEAKIAkJZGV2X2ZzbV9ldmVudChjZGV2LCBERVZfRVZFTlRfVkVSSUZZKTsKIH0KIAotc3RhdGljIGludCBjaGVja19mb3JfaW9fb25fcGF0aChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLCBpbnQgbWFzaykKLXsKLQlpZiAoY2lvX3VwZGF0ZV9zY2hpYihzY2gpKQotCQlyZXR1cm4gMDsKLQlpZiAoc2Nzd19hY3RsKCZzY2gtPnNjaGliLnNjc3cpICYmIHNjaC0+c2NoaWIucG1jdy5scHVtID09IG1hc2spCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0ZXJtaW5hdGVfaW50ZXJuYWxfaW8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwKLQkJCQkgIHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQotewotCWlmIChjaW9fY2xlYXIoc2NoKSkgewotCQkvKiBSZWNoZWNrIGRldmljZSBpbiBjYXNlIGNsZWFyIGZhaWxlZC4gKi8KLQkJc2NoLT5scG0gPSAwOwotCQlpZiAoY2Rldi0+b25saW5lKQotCQkJZGV2X2ZzbV9ldmVudChjZGV2LCBERVZfRVZFTlRfVkVSSUZZKTsKLQkJZWxzZQotCQkJY3NzX3NjaGVkdWxlX2V2YWwoc2NoLT5zY2hpZCk7Ci0JCXJldHVybjsKLQl9Ci0JY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfQ0xFQVJfVkVSSUZZOwotCS8qIFJlcXVlc3QgcmV0cnkgb2YgaW50ZXJuYWwgb3BlcmF0aW9uLiAqLwotCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMTsKLQkvKiBDYWxsIGhhbmRsZXIuICovCi0JaWYgKGNkZXYtPmhhbmRsZXIpCi0JCWNkZXYtPmhhbmRsZXIoY2RldiwgY2Rldi0+cHJpdmF0ZS0+aW50cGFybSwKLQkJCSAgICAgIEVSUl9QVFIoLUVJTykpOwotfQotCiBzdGF0aWMgdm9pZCBpb19zdWJjaGFubmVsX3Rlcm1pbmF0ZV9wYXRoKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIHU4IG1hc2spCiB7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CkBAIC0xNDA5LDE4ICsxMTA5LDI0IEBACiAJY2RldiA9IHNjaF9nZXRfY2RldihzY2gpOwogCWlmICghY2RldikKIAkJcmV0dXJuOwotCWlmIChjaGVja19mb3JfaW9fb25fcGF0aChzY2gsIG1hc2spKSB7Ci0JCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfT05MSU5FKQotCQkJY2N3X2RldmljZV9raWxsX2lvKGNkZXYpOwotCQllbHNlIHsKLQkJCXRlcm1pbmF0ZV9pbnRlcm5hbF9pbyhzY2gsIGNkZXYpOwotCQkJLyogUmUtc3RhcnQgcGF0aCB2ZXJpZmljYXRpb24uICovCi0JCQlkZXZfZnNtX2V2ZW50KGNkZXYsIERFVl9FVkVOVF9WRVJJRlkpOwotCQl9Ci0JfSBlbHNlCi0JCS8qIHRyaWdnZXIgcGF0aCB2ZXJpZmljYXRpb24uICovCi0JCWRldl9mc21fZXZlbnQoY2RldiwgREVWX0VWRU5UX1ZFUklGWSk7CisJaWYgKGNpb191cGRhdGVfc2NoaWIoc2NoKSkKKwkJZ290byBlcnI7CisJLyogQ2hlY2sgZm9yIEkvTyBvbiBwYXRoLiAqLworCWlmIChzY3N3X2FjdGwoJnNjaC0+c2NoaWIuc2NzdykgPT0gMCB8fCBzY2gtPnNjaGliLnBtY3cubHB1bSAhPSBtYXNrKQorCQlnb3RvIG91dDsKKwlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX09OTElORSkgeworCQljY3dfZGV2aWNlX2tpbGxfaW8oY2Rldik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoY2lvX2NsZWFyKHNjaCkpCisJCWdvdG8gZXJyOworb3V0OgorCS8qIFRyaWdnZXIgcGF0aCB2ZXJpZmljYXRpb24uICovCisJZGV2X2ZzbV9ldmVudChjZGV2LCBERVZfRVZFTlRfVkVSSUZZKTsKKwlyZXR1cm47CiAKK2VycjoKKwlkZXZfZnNtX2V2ZW50KGNkZXYsIERFVl9FVkVOVF9OT1RPUEVSKTsKIH0KIAogc3RhdGljIGludCBpb19zdWJjaGFubmVsX2NocF9ldmVudChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLApAQCAtMTQ1Nyw0NiArMTE2Myw0MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZAotaW9fc3ViY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQorc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9xdWllc2NlKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJaW50IHJldDsKIAorCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKIAljZGV2ID0gc2NoX2dldF9jZGV2KHNjaCk7Ci0KIAlpZiAoY2lvX2lzX2NvbnNvbGUoc2NoLT5zY2hpZCkpCi0JCXJldHVybjsKKwkJZ290byBvdXRfdW5sb2NrOwogCWlmICghc2NoLT5zY2hpYi5wbWN3LmVuYSkKLQkJLyogTm90aGluZyB0byBkby4gKi8KLQkJcmV0dXJuOworCQlnb3RvIG91dF91bmxvY2s7CiAJcmV0ID0gY2lvX2Rpc2FibGVfc3ViY2hhbm5lbChzY2gpOwogCWlmIChyZXQgIT0gLUVCVVNZKQotCQkvKiBTdWJjaGFubmVsIGlzIGRpc2FibGVkLCB3ZSdyZSBkb25lLiAqLwotCQlyZXR1cm47Ci0JY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfUVVJRVNDRTsKKwkJZ290byBvdXRfdW5sb2NrOwogCWlmIChjZGV2LT5oYW5kbGVyKQotCQljZGV2LT5oYW5kbGVyKGNkZXYsIGNkZXYtPnByaXZhdGUtPmludHBhcm0sCi0JCQkgICAgICBFUlJfUFRSKC1FSU8pKTsKLQlyZXQgPSBjY3dfZGV2aWNlX2NhbmNlbF9oYWx0X2NsZWFyKGNkZXYpOwotCWlmIChyZXQgPT0gLUVCVVNZKSB7Ci0JCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgSFovMTApOwotCQl3YWl0X2V2ZW50KGNkZXYtPnByaXZhdGUtPndhaXRfcSwgZGV2X2ZzbV9maW5hbF9zdGF0ZShjZGV2KSk7CisJCWNkZXYtPmhhbmRsZXIoY2RldiwgY2Rldi0+cHJpdmF0ZS0+aW50cGFybSwgRVJSX1BUUigtRUlPKSk7CisJd2hpbGUgKHJldCA9PSAtRUJVU1kpIHsKKwkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfUVVJRVNDRTsKKwkJcmV0ID0gY2N3X2RldmljZV9jYW5jZWxfaGFsdF9jbGVhcihjZGV2KTsKKwkJaWYgKHJldCA9PSAtRUJVU1kpIHsKKwkJCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgSFovMTApOworCQkJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CisJCQl3YWl0X2V2ZW50KGNkZXYtPnByaXZhdGUtPndhaXRfcSwKKwkJCQkgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfUVVJRVNDRSk7CisJCQlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7CisJCX0KKwkJcmV0ID0gY2lvX2Rpc2FibGVfc3ViY2hhbm5lbChzY2gpOwogCX0KLQljaW9fZGlzYWJsZV9zdWJjaGFubmVsKHNjaCk7CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfZ2V0X3N0YXR1cyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQorc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewotCXN0cnVjdCBzY2hpYiBzY2hpYjsKLQotCWlmIChzdHNjaChzY2gtPnNjaGlkLCAmc2NoaWIpIHx8ICFzY2hpYi5wbWN3LmRudikKLQkJcmV0dXJuIENJT19HT05FOwotCWlmIChzY2gtPnNjaGliLnBtY3cuZG52ICYmIChzY2hpYi5wbWN3LmRldiAhPSBzY2gtPnNjaGliLnBtY3cuZGV2KSkKLQkJcmV0dXJuIENJT19SRVZBTElEQVRFOwotCWlmICghc2NoLT5scG0pCi0JCXJldHVybiBDSU9fTk9fUEFUSDsKLQlyZXR1cm4gQ0lPX09QRVI7CisJaW9fc3ViY2hhbm5lbF9xdWllc2NlKHNjaCk7CiB9CiAKIHN0YXRpYyBpbnQgZGV2aWNlX2lzX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKQEAgLTE1NzUsMjAgKzEyNzYsMTYgQEAKIHN0YXRpYyBpbnQgcHVyZ2VfZm4oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7Ci0Jc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdiA9IGNkZXYtPnByaXZhdGU7Ci0JaW50IHVucmVnOworCXN0cnVjdCBjY3dfZGV2X2lkICppZCA9ICZjZGV2LT5wcml2YXRlLT5kZXZfaWQ7CiAKIAlzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOwotCXVucmVnID0gaXNfYmxhY2tsaXN0ZWQocHJpdi0+ZGV2X2lkLnNzaWQsIHByaXYtPmRldl9pZC5kZXZubykgJiYKLQkJKHByaXYtPnN0YXRlID09IERFVl9TVEFURV9PRkZMSU5FKTsKKwlpZiAoaXNfYmxhY2tsaXN0ZWQoaWQtPnNzaWQsIGlkLT5kZXZubykgJiYKKwkgICAgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9PRkZMSU5FKSkgeworCQlDSU9fTVNHX0VWRU5UKDMsICJjY3c6IHB1cmdpbmcgMC4leC4lMDR4XG4iLCBpZC0+c3NpZCwKKwkJCSAgICAgIGlkLT5kZXZubyk7CisJCWNjd19kZXZpY2Vfc2NoZWRfdG9kbyhjZGV2LCBDREVWX1RPRE9fVU5SRUcpOworCX0KIAlzcGluX3VubG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7Ci0JaWYgKCF1bnJlZykKLQkJZ290byBvdXQ7Ci0JQ0lPX01TR19FVkVOVCgzLCAiY2N3OiBwdXJnaW5nIDAuJXguJTA0eFxuIiwgcHJpdi0+ZGV2X2lkLnNzaWQsCi0JCSAgICAgIHByaXYtPmRldl9pZC5kZXZubyk7Ci0JY2N3X2RldmljZV9zY2hlZHVsZV9zY2hfdW5yZWdpc3RlcihjZGV2KTsKLQotb3V0OgogCS8qIEFib3J0IGxvb3AgaW4gY2FzZSBvZiBwZW5kaW5nIHNpZ25hbC4gKi8KIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRUlOVFI7CkBAIC0xNjMwLDkxICsxMzI3LDE2OSBAQAogCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogfQogCi1zdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfc2NoX2V2ZW50KHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBzbG93KQorZW51bSBpb19zY2hfYWN0aW9uIHsKKwlJT19TQ0hfVU5SRUcsCisJSU9fU0NIX09SUEhfVU5SRUcsCisJSU9fU0NIX0FUVEFDSCwKKwlJT19TQ0hfVU5SRUdfQVRUQUNILAorCUlPX1NDSF9PUlBIX0FUVEFDSCwKKwlJT19TQ0hfUkVQUk9CRSwKKwlJT19TQ0hfVkVSSUZZLAorCUlPX1NDSF9ESVNDLAorCUlPX1NDSF9OT1AsCit9OworCitzdGF0aWMgZW51bSBpb19zY2hfYWN0aW9uIHNjaF9nZXRfYWN0aW9uKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7Ci0JaW50IGV2ZW50LCByZXQsIGRpc2M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQllbnVtIHsgTk9ORSwgVU5SRUdJU1RFUiwgVU5SRUdJU1RFUl9QUk9CRSwgUkVQUk9CRSwgRElTQyB9IGFjdGlvbjsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKHNjaC0+bG9jaywgZmxhZ3MpOwogCWNkZXYgPSBzY2hfZ2V0X2NkZXYoc2NoKTsKLQlkaXNjID0gZGV2aWNlX2lzX2Rpc2Nvbm5lY3RlZChjZGV2KTsKLQlpZiAoZGlzYyAmJiBzbG93KSB7Ci0JCS8qIERpc2Nvbm5lY3RlZCBkZXZpY2VzIGFyZSBldmFsdWF0ZWQgZGlyZWN0bHkgb25seS4qLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKKwlpZiAoY2lvX3VwZGF0ZV9zY2hpYihzY2gpKSB7CisJCS8qIE5vdCBvcGVyYXRpb25hbC4gKi8KKwkJaWYgKCFjZGV2KQorCQkJcmV0dXJuIElPX1NDSF9VTlJFRzsKKwkJaWYgKCFjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBDSU9fR09ORSkpCisJCQlyZXR1cm4gSU9fU0NIX1VOUkVHOworCQlyZXR1cm4gSU9fU0NIX09SUEhfVU5SRUc7CiAJfQotCS8qIE5vIGludGVycnVwdCBhZnRlciBtYWNoaW5lIGNoZWNrIC0ga2lsbCBwZW5kaW5nIHRpbWVycy4gKi8KLQlpZiAoY2RldikKLQkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAwKTsKLQlpZiAoIWRpc2MgJiYgIXNsb3cpIHsKLQkJLyogTm9uLWRpc2Nvbm5lY3RlZCBkZXZpY2VzIGFyZSBldmFsdWF0ZWQgb24gdGhlIHNsb3cgcGF0aC4gKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY2gtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJLyogT3BlcmF0aW9uYWwuICovCisJaWYgKCFjZGV2KQorCQlyZXR1cm4gSU9fU0NIX0FUVEFDSDsKKwlpZiAoc2NoLT5zY2hpYi5wbWN3LmRldiAhPSBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8pIHsKKwkJaWYgKCFjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBDSU9fR09ORSkpCisJCQlyZXR1cm4gSU9fU0NIX1VOUkVHX0FUVEFDSDsKKwkJcmV0dXJuIElPX1NDSF9PUlBIX0FUVEFDSDsKIAl9Ci0JZXZlbnQgPSBpb19zdWJjaGFubmVsX2dldF9zdGF0dXMoc2NoKTsKLQlDSU9fTVNHX0VWRU5UKDQsICJFdmFsdWF0aW5nIHNjaGlkIDAuJXguJTA0eCwgZXZlbnQgJWQsICVzLCAlcyBwYXRoLlxuIiwKLQkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubywgZXZlbnQsCi0JCSAgICAgIGRpc2MgPyAiZGlzY29ubmVjdGVkIiA6ICJub3JtYWwiLAotCQkgICAgICBzbG93ID8gInNsb3ciIDogImZhc3QiKTsKLQkvKiBBbmFseXplIHN1YmNoYW5uZWwgc3RhdHVzLiAqLwotCWFjdGlvbiA9IE5PTkU7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQ0lPX05PX1BBVEg6Ci0JCWlmIChkaXNjKSB7Ci0JCQkvKiBDaGVjayBpZiBwYXRocyBoYXZlIGJlY29tZSBhdmFpbGFibGUuICovCi0JCQlhY3Rpb24gPSBSRVBST0JFOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBDSU9fR09ORToKLQkJLyogQXNrIGRyaXZlciB3aGF0IHRvIGRvIHdpdGggZGV2aWNlLiAqLwotCQlpZiAoaW9fc3ViY2hhbm5lbF9ub3RpZnkoc2NoLCBldmVudCkpCi0JCQlhY3Rpb24gPSBESVNDOwotCQllbHNlCi0JCQlhY3Rpb24gPSBVTlJFR0lTVEVSOwotCQlicmVhazsKLQljYXNlIENJT19SRVZBTElEQVRFOgotCQkvKiBEZXZpY2Ugd2lsbCBiZSByZW1vdmVkLCBzbyBubyBub3RpZnkgbmVjZXNzYXJ5LiAqLwotCQlpZiAoZGlzYykKLQkJCS8qIFJlcHJvYmUgYmVjYXVzZSBpbW1lZGlhdGUgdW5yZWdpc3RlciBtaWdodCBibG9jay4gKi8KLQkJCWFjdGlvbiA9IFJFUFJPQkU7Ci0JCWVsc2UKLQkJCWFjdGlvbiA9IFVOUkVHSVNURVJfUFJPQkU7Ci0JCWJyZWFrOwotCWNhc2UgQ0lPX09QRVI6Ci0JCWlmIChkaXNjKQotCQkJLyogR2V0IGRldmljZSBvcGVyYXRpb25hbCBhZ2Fpbi4gKi8KLQkJCWFjdGlvbiA9IFJFUFJPQkU7Ci0JCWJyZWFrOworCWlmICgoc2NoLT5zY2hpYi5wbWN3LnBhbSAmIHNjaC0+b3BtKSA9PSAwKSB7CisJCWlmICghY2N3X2RldmljZV9ub3RpZnkoY2RldiwgQ0lPX05PX1BBVEgpKQorCQkJcmV0dXJuIElPX1NDSF9VTlJFRzsKKwkJcmV0dXJuIElPX1NDSF9ESVNDOwogCX0KLQkvKiBQZXJmb3JtIGFjdGlvbi4gKi8KLQlyZXQgPSAwOworCWlmIChkZXZpY2VfaXNfZGlzY29ubmVjdGVkKGNkZXYpKQorCQlyZXR1cm4gSU9fU0NIX1JFUFJPQkU7CisJaWYgKGNkZXYtPm9ubGluZSkKKwkJcmV0dXJuIElPX1NDSF9WRVJJRlk7CisJcmV0dXJuIElPX1NDSF9OT1A7Cit9CisKKy8qKgorICogaW9fc3ViY2hhbm5lbF9zY2hfZXZlbnQgLSBwcm9jZXNzIHN1YmNoYW5uZWwgZXZlbnQKKyAqIEBzY2g6IHN1YmNoYW5uZWwKKyAqIEBwcm9jZXNzOiBub24temVybyBpZiBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0CisgKgorICogQW4gdW5zcGVjaWZpZWQgZXZlbnQgb2NjdXJyZWQgZm9yIHRoaXMgc3ViY2hhbm5lbC4gQWRqdXN0IGRhdGEgYWNjb3JkaW5nCisgKiB0byB0aGUgY3VycmVudCBvcGVyYXRpb25hbCBzdGF0ZSBvZiB0aGUgc3ViY2hhbm5lbCBhbmQgZGV2aWNlLiBSZXR1cm4KKyAqIHplcm8gd2hlbiB0aGUgZXZlbnQgaGFzIGJlZW4gaGFuZGxlZCBzdWZmaWNpZW50bHkgb3IgLUVBR0FJTiB3aGVuIHRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gaW4gcHJvY2VzcyBjb250ZXh0LgorICovCitzdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfc2NoX2V2ZW50KHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBwcm9jZXNzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CisJc3RydWN0IGNjd19kZXZfaWQgZGV2X2lkOworCWVudW0gaW9fc2NoX2FjdGlvbiBhY3Rpb247CisJaW50IHJjID0gLUVBR0FJTjsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNjaC0+bG9jaywgZmxhZ3MpOworCWlmICghZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJnNjaC0+ZGV2KSkKKwkJZ290byBvdXRfdW5sb2NrOworCWlmICh3b3JrX3BlbmRpbmcoJnNjaC0+dG9kb193b3JrKSkKKwkJZ290byBvdXRfdW5sb2NrOworCWNkZXYgPSBzY2hfZ2V0X2NkZXYoc2NoKTsKKwlpZiAoY2RldiAmJiB3b3JrX3BlbmRpbmcoJmNkZXYtPnByaXZhdGUtPnRvZG9fd29yaykpCisJCWdvdG8gb3V0X3VubG9jazsKKwlhY3Rpb24gPSBzY2hfZ2V0X2FjdGlvbihzY2gpOworCUNJT19NU0dfRVZFTlQoMiwgImV2ZW50OiBzY2ggMC4leC4lMDR4LCBwcm9jZXNzPSVkLCBhY3Rpb249JWRcbiIsCisJCSAgICAgIHNjaC0+c2NoaWQuc3NpZCwgc2NoLT5zY2hpZC5zY2hfbm8sIHByb2Nlc3MsCisJCSAgICAgIGFjdGlvbik7CisJLyogUGVyZm9ybSBpbW1lZGlhdGUgYWN0aW9ucyB3aGlsZSBob2xkaW5nIHRoZSBsb2NrLiAqLwogCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBVTlJFR0lTVEVSOgotCWNhc2UgVU5SRUdJU1RFUl9QUk9CRToKLQkJY2N3X2RldmljZV9zZXRfbm90b3BlcihjZGV2KTsKLQkJLyogVW5yZWdpc3RlciBkZXZpY2UgKHdpbGwgdXNlIHN1YmNoYW5uZWwgbG9jaykuICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NoLT5sb2NrLCBmbGFncyk7Ci0JCWNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIoc2NoKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoc2NoLT5sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgUkVQUk9CRToKKwljYXNlIElPX1NDSF9SRVBST0JFOgorCQkvKiBUcmlnZ2VyIGRldmljZSByZWNvZ25pdGlvbi4gKi8KIAkJY2N3X2RldmljZV90cmlnZ2VyX3JlcHJvYmUoY2Rldik7Ci0JCWJyZWFrOwotCWNhc2UgRElTQzoKKwkJcmMgPSAwOworCQlnb3RvIG91dF91bmxvY2s7CisJY2FzZSBJT19TQ0hfVkVSSUZZOgorCQkvKiBUcmlnZ2VyIHBhdGggdmVyaWZpY2F0aW9uLiAqLworCQlpb19zdWJjaGFubmVsX3ZlcmlmeShzY2gpOworCQlyYyA9IDA7CisJCWdvdG8gb3V0X3VubG9jazsKKwljYXNlIElPX1NDSF9ESVNDOgorCQljY3dfZGV2aWNlX3NldF9kaXNjb25uZWN0ZWQoY2Rldik7CisJCXJjID0gMDsKKwkJZ290byBvdXRfdW5sb2NrOworCWNhc2UgSU9fU0NIX09SUEhfVU5SRUc6CisJY2FzZSBJT19TQ0hfT1JQSF9BVFRBQ0g6CiAJCWNjd19kZXZpY2Vfc2V0X2Rpc2Nvbm5lY3RlZChjZGV2KTsKIAkJYnJlYWs7CisJY2FzZSBJT19TQ0hfVU5SRUdfQVRUQUNIOgorCWNhc2UgSU9fU0NIX1VOUkVHOgorCQlpZiAoY2RldikKKwkJCWNjd19kZXZpY2Vfc2V0X25vdG9wZXIoY2Rldik7CisJCWJyZWFrOworCWNhc2UgSU9fU0NIX05PUDoKKwkJcmMgPSAwOworCQlnb3RvIG91dF91bmxvY2s7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NoLT5sb2NrLCBmbGFncyk7Ci0JLyogUHJvYmUgaWYgbmVjZXNzYXJ5LiAqLwotCWlmIChhY3Rpb24gPT0gVU5SRUdJU1RFUl9QUk9CRSkKLQkJcmV0ID0gY3NzX3Byb2JlX2RldmljZShzY2gtPnNjaGlkKTsKKwkvKiBBbGwgb3RoZXIgYWN0aW9ucyByZXF1aXJlIHByb2Nlc3MgY29udGV4dC4gKi8KKwlpZiAoIXByb2Nlc3MpCisJCWdvdG8gb3V0OworCS8qIEhhbmRsZSBhdHRhY2hlZCBjY3cgZGV2aWNlLiAqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBJT19TQ0hfT1JQSF9VTlJFRzoKKwljYXNlIElPX1NDSF9PUlBIX0FUVEFDSDoKKwkJLyogTW92ZSBjY3cgZGV2aWNlIHRvIG9ycGhhbmFnZS4gKi8KKwkJcmMgPSBjY3dfZGV2aWNlX21vdmVfdG9fb3JwaChjZGV2KTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgSU9fU0NIX1VOUkVHX0FUVEFDSDoKKwkJLyogVW5yZWdpc3RlciBjY3cgZGV2aWNlLiAqLworCQljY3dfZGV2aWNlX3VucmVnaXN0ZXIoY2Rldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkvKiBIYW5kbGUgc3ViY2hhbm5lbC4gKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgSU9fU0NIX09SUEhfVU5SRUc6CisJY2FzZSBJT19TQ0hfVU5SRUc6CisJCWNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIoc2NoKTsKKwkJYnJlYWs7CisJY2FzZSBJT19TQ0hfT1JQSF9BVFRBQ0g6CisJY2FzZSBJT19TQ0hfVU5SRUdfQVRUQUNIOgorCWNhc2UgSU9fU0NIX0FUVEFDSDoKKwkJZGV2X2lkLnNzaWQgPSBzY2gtPnNjaGlkLnNzaWQ7CisJCWRldl9pZC5kZXZubyA9IHNjaC0+c2NoaWIucG1jdy5kZXY7CisJCWNkZXYgPSBnZXRfY2N3ZGV2X2J5X2Rldl9pZCgmZGV2X2lkKTsKKwkJaWYgKCFjZGV2KSB7CisJCQlzY2hfY3JlYXRlX2FuZF9yZWNvZ19uZXdfZGV2aWNlKHNjaCk7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGNjd19kZXZpY2VfbW92ZV90b19zY2goY2Rldiwgc2NoKTsKKwkJaWYgKHJjKSB7CisJCQkvKiBSZWxlYXNlIHJlZmVyZW5jZSBmcm9tIGdldF9jY3dkZXZfYnlfZGV2X2lkKCkgKi8KKwkJCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZShzY2gtPmxvY2ssIGZsYWdzKTsKKwkJY2N3X2RldmljZV90cmlnZ2VyX3JlcHJvYmUoY2Rldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NoLT5sb2NrLCBmbGFncyk7CisJCS8qIFJlbGVhc2UgcmVmZXJlbmNlIGZyb20gZ2V0X2Njd2Rldl9ieV9kZXZfaWQoKSAqLworCQlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcmV0Oworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOworb3V0OgorCXJldHVybiByYzsKIH0KIAogI2lmZGVmIENPTkZJR19DQ1dfQ09OU09MRQpAQCAtMTc0NCwxMCArMTUxOSw3IEBACiAJc2NoLT5kcml2ZXIgPSAmaW9fc3ViY2hhbm5lbF9kcml2ZXI7CiAJLyogSW5pdGlhbGl6ZSB0aGUgY2N3X2RldmljZSBzdHJ1Y3R1cmUuICovCiAJY2Rldi0+ZGV2LnBhcmVudD0gJnNjaC0+ZGV2OwotCXJjID0gaW9fc3ViY2hhbm5lbF9yZWNvZyhjZGV2LCBzY2gpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCisJaW9fc3ViY2hhbm5lbF9yZWNvZyhjZGV2LCBzY2gpOwogCS8qIE5vdyB3YWl0IGZvciB0aGUgYXN5bmMuIHJlY29nbml0aW9uIHRvIGNvbWUgdG8gYW4gZW5kLiAqLwogCXNwaW5fbG9ja19pcnEoY2Rldi0+Y2N3bG9jayk7CiAJd2hpbGUgKCFkZXZfZnNtX2ZpbmFsX3N0YXRlKGNkZXYpKQpAQCAtMTc2Myw3ICsxNTM1LDcgQEAKIAlyYyA9IDA7CiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0cnVjdCBjY3dfZGV2aWNlICoKQEAgLTE5MTksNyArMTY5MSw3IEBACiB7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXYgPSB0b19jY3dkZXYoZGV2KTsKIAotCWlmICh3b3JrX3BlbmRpbmcoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaykpCisJaWYgKHdvcmtfcGVuZGluZygmY2Rldi0+cHJpdmF0ZS0+dG9kb193b3JrKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAJLyogRmFpbCB3aGlsZSBkZXZpY2UgaXMgYmVpbmcgc2V0IG9ubGluZS9vZmZsaW5lLiAqLwogCWlmIChhdG9taWNfcmVhZCgmY2Rldi0+cHJpdmF0ZS0+b25vZmYpKQpAQCAtMjAwNSw3ICsxNzc3LDYgQEAKIHN0YXRpYyB2b2lkIF9fY2N3X2RldmljZV9wbV9yZXN0b3JlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCWludCByZXQ7CiAKIAlpZiAoY2lvX2lzX2NvbnNvbGUoc2NoLT5zY2hpZCkpCiAJCWdvdG8gb3V0OwpAQCAtMjAxNSwyMiArMTc4NiwxMCBAQAogCSAqLwogCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKIAljZGV2LT5wcml2YXRlLT5mbGFncy5yZXN1bWluZyA9IDE7Ci0JcmV0ID0gY2N3X2RldmljZV9yZWNvZ25pdGlvbihjZGV2KTsKKwljY3dfZGV2aWNlX3JlY29nbml0aW9uKGNkZXYpOwogCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwotCWlmIChyZXQpIHsKLQkJQ0lPX01TR19FVkVOVCgwLCAiQ291bGRuJ3Qgc3RhcnQgcmVjb2duaXRpb24gZm9yIGRldmljZSAiCi0JCQkgICAgICAiMC4leC4lMDR4IChyZXQ9JWQpXG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHJldCk7Ci0JCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfRElTQ09OTkVDVEVEOwotCQlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKLQkJLyogbm90aWZ5IGRyaXZlciBhZnRlciB0aGUgcmVzdW1lIGNiICovCi0JCWdvdG8gb3V0OwotCX0KIAl3YWl0X2V2ZW50KGNkZXYtPnByaXZhdGUtPndhaXRfcSwgZGV2X2ZzbV9maW5hbF9zdGF0ZShjZGV2KSB8fAogCQkgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfRElTQ09OTkVDVEVEKTsKLQogb3V0OgogCWNkZXYtPnByaXZhdGUtPmZsYWdzLnJlc3VtaW5nID0gMDsKIH0KQEAgLTIwNDAsNyArMTc5OSw3IEBACiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfQk9YRUQ7CiAJaWYgKGNjd19kZXZpY2Vfbm90aWZ5KGNkZXYsIENJT19CT1hFRCkpCiAJCXJldHVybiAwOwotCWNjd19kZXZpY2Vfc2NoZWR1bGVfc2NoX3VucmVnaXN0ZXIoY2Rldik7CisJY2N3X2RldmljZV9zY2hlZF90b2RvKGNkZXYsIENERVZfVE9ET19VTlJFRyk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTIwNDksNyArMTgwOCw3IEBACiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfRElTQ09OTkVDVEVEOwogCWlmIChjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBDSU9fR09ORSkpCiAJCXJldHVybiAwOwotCWNjd19kZXZpY2Vfc2NoZWR1bGVfc2NoX3VucmVnaXN0ZXIoY2Rldik7CisJY2N3X2RldmljZV9zY2hlZF90b2RvKGNkZXYsIENERVZfVE9ET19VTlJFRyk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTIwOTQsOSArMTg1Myw3IEBACiAJLyogY2hlY2sgaWYgdGhlIGRldmljZSB0eXBlIGhhcyBjaGFuZ2VkICovCiAJaWYgKCFjY3dfZGV2aWNlX3Rlc3Rfc2Vuc2VfZGF0YShjZGV2KSkgewogCQljY3dfZGV2aWNlX3VwZGF0ZV9zZW5zZV9kYXRhKGNkZXYpOwotCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCSAgICAgY2N3X2RldmljZV9kb191bmJpbmRfYmluZCk7Ci0JCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKKwkJY2N3X2RldmljZV9zY2hlZF90b2RvKGNkZXYsIENERVZfVE9ET19SRUJJTkQpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQpAQCAtMjE0MCw3ICsxODk3LDcgQEAKIAlnb3RvIG91dF9yZXN0b3JlOwogCiBvdXRfdW5yZWdfdW5sb2NrOgotCWNjd19kZXZpY2Vfc2NoZWR1bGVfc2NoX3VucmVnaXN0ZXIoY2Rldik7CisJY2N3X2RldmljZV9zY2hlZF90b2RvKGNkZXYsIENERVZfVE9ET19VTlJFR19FVkFMKTsKIAlyZXQgPSAtRU5PREVWOwogb3V0X3VubG9jazoKIAlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKQEAgLTIyMDUsNiArMTk2Miw3NyBAQAogCXJldHVybiBzY2gtPnNjaGlkOwogfQogCitzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX3RvZG8oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKKwllbnVtIGNkZXZfdG9kbyB0b2RvOworCisJcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlLCB0b2RvX3dvcmspOworCWNkZXYgPSBwcml2LT5jZGV2OworCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJLyogRmluZCBvdXQgdG9kby4gKi8KKwlzcGluX2xvY2tfaXJxKGNkZXYtPmNjd2xvY2spOworCXRvZG8gPSBwcml2LT50b2RvOworCXByaXYtPnRvZG8gPSBDREVWX1RPRE9fTk9USElORzsKKwlDSU9fTVNHX0VWRU5UKDQsICJjZGV2X3RvZG86IGNkZXY9MC4leC4lMDR4IHRvZG89JWRcbiIsCisJCSAgICAgIHByaXYtPmRldl9pZC5zc2lkLCBwcml2LT5kZXZfaWQuZGV2bm8sIHRvZG8pOworCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKKwkvKiBQZXJmb3JtIHRvZG8uICovCisJc3dpdGNoICh0b2RvKSB7CisJY2FzZSBDREVWX1RPRE9fRU5BQkxFX0NNRjoKKwkJY21mX3JlZW5hYmxlKGNkZXYpOworCQlicmVhazsKKwljYXNlIENERVZfVE9ET19SRUJJTkQ6CisJCWNjd19kZXZpY2VfZG9fdW5iaW5kX2JpbmQoY2Rldik7CisJCWJyZWFrOworCWNhc2UgQ0RFVl9UT0RPX1JFR0lTVEVSOgorCQlpb19zdWJjaGFubmVsX3JlZ2lzdGVyKGNkZXYpOworCQlicmVhazsKKwljYXNlIENERVZfVE9ET19VTlJFR19FVkFMOgorCQlpZiAoIXNjaF9pc19wc2V1ZG9fc2NoKHNjaCkpCisJCQljc3Nfc2NoZWR1bGVfZXZhbChzY2gtPnNjaGlkKTsKKwkJLyogZmFsbC10aHJvdWdoICovCisJY2FzZSBDREVWX1RPRE9fVU5SRUc6CisJCWlmIChzY2hfaXNfcHNldWRvX3NjaChzY2gpKQorCQkJY2N3X2RldmljZV91bnJlZ2lzdGVyKGNkZXYpOworCQllbHNlCisJCQljY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIoY2Rldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkvKiBSZWxlYXNlIHdvcmtxdWV1ZSByZWYuICovCisJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKK30KKworLyoqCisgKiBjY3dfZGV2aWNlX3NjaGVkX3RvZG8gLSBzY2hlZHVsZSBjY3cgZGV2aWNlIG9wZXJhdGlvbgorICogQGNkZXY6IGNjdyBkZXZpY2UKKyAqIEB0b2RvOiB0b2RvCisgKgorICogU2NoZWR1bGUgdGhlIG9wZXJhdGlvbiBpZGVudGlmaWVkIGJ5IEB0b2RvIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2xvdyBwYXRoCisgKiB3b3JrcXVldWUuIERvIG5vdGhpbmcgaWYgYW5vdGhlciBvcGVyYXRpb24gd2l0aCBoaWdoZXIgcHJpb3JpdHkgaXMgYWxyZWFkeQorICogc2NoZWR1bGVkLiBOZWVkcyB0byBiZSBjYWxsZWQgd2l0aCBjY3dkZXYgbG9jayBoZWxkLgorICovCit2b2lkIGNjd19kZXZpY2Vfc2NoZWRfdG9kbyhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBjZGV2X3RvZG8gdG9kbykKK3sKKwlDSU9fTVNHX0VWRU5UKDQsICJjZGV2X3RvZG86IHNjaGVkIGNkZXY9MC4leC4lMDR4IHRvZG89JWRcbiIsCisJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLCBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCisJCSAgICAgIHRvZG8pOworCWlmIChjZGV2LT5wcml2YXRlLT50b2RvID49IHRvZG8pCisJCXJldHVybjsKKwljZGV2LT5wcml2YXRlLT50b2RvID0gdG9kbzsKKwkvKiBHZXQgd29ya3F1ZXVlIHJlZi4gKi8KKwlpZiAoIWdldF9kZXZpY2UoJmNkZXYtPmRldikpCisJCXJldHVybjsKKwlpZiAoIXF1ZXVlX3dvcmsoc2xvd19wYXRoX3dxLCAmY2Rldi0+cHJpdmF0ZS0+dG9kb193b3JrKSkgeworCQkvKiBBbHJlYWR5IHF1ZXVlZCwgcmVsZWFzZSB3b3JrcXVldWUgcmVmLiAqLworCQlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOworCX0KK30KKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogRVhQT1JUX1NZTUJPTChjY3dfZGV2aWNlX3NldF9vbmxpbmUpOwogRVhQT1JUX1NZTUJPTChjY3dfZGV2aWNlX3NldF9vZmZsaW5lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmggYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oCmluZGV4IDI0NmM2NDguLmJjZmUxM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaApAQCAtMjEsNyArMjEsNiBAQAogCURFVl9TVEFURV9ESVNCQU5EX1BHSUQsCiAJREVWX1NUQVRFX0JPWEVELAogCS8qIHN0YXRlcyB0byB3YWl0IGZvciBpL28gY29tcGxldGlvbiBiZWZvcmUgZG9pbmcgc29tZXRoaW5nICovCi0JREVWX1NUQVRFX0NMRUFSX1ZFUklGWSwKIAlERVZfU1RBVEVfVElNRU9VVF9LSUxMLAogCURFVl9TVEFURV9RVUlFU0NFLAogCS8qIHNwZWNpYWwgc3RhdGVzIGZvciBkZXZpY2VzIGdvbmUgbm90IG9wZXJhdGlvbmFsICovCkBAIC0yOSw2ICsyOCw3IEBACiAJREVWX1NUQVRFX0RJU0NPTk5FQ1RFRF9TRU5TRV9JRCwKIAlERVZfU1RBVEVfQ01GQ0hBTkdFLAogCURFVl9TVEFURV9DTUZVUERBVEUsCisJREVWX1NUQVRFX1NURUFMX0xPQ0ssCiAJLyogbGFzdCBlbGVtZW50ISAqLwogCU5SX0RFVl9TVEFURVMKIH07CkBAIC04MSwxNyArODEsMTYgQEAKIAogaW50IGNjd19kZXZpY2VfY2FuY2VsX2hhbHRfY2xlYXIoc3RydWN0IGNjd19kZXZpY2UgKik7CiAKLXZvaWQgY2N3X2RldmljZV9kb191bmJpbmRfYmluZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7Ci12b2lkIGNjd19kZXZpY2VfbW92ZV90b19vcnBoYW5hZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICopOwogaW50IGNjd19kZXZpY2VfaXNfb3JwaGFuKHN0cnVjdCBjY3dfZGV2aWNlICopOwogCi1pbnQgY2N3X2RldmljZV9yZWNvZ25pdGlvbihzdHJ1Y3QgY2N3X2RldmljZSAqKTsKK3ZvaWQgY2N3X2RldmljZV9yZWNvZ25pdGlvbihzdHJ1Y3QgY2N3X2RldmljZSAqKTsKIGludCBjY3dfZGV2aWNlX29ubGluZShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKIGludCBjY3dfZGV2aWNlX29mZmxpbmUoc3RydWN0IGNjd19kZXZpY2UgKik7CiB2b2lkIGNjd19kZXZpY2VfdXBkYXRlX3NlbnNlX2RhdGEoc3RydWN0IGNjd19kZXZpY2UgKik7CiBpbnQgY2N3X2RldmljZV90ZXN0X3NlbnNlX2RhdGEoc3RydWN0IGNjd19kZXZpY2UgKik7CiB2b2lkIGNjd19kZXZpY2Vfc2NoZWR1bGVfc2NoX3VucmVnaXN0ZXIoc3RydWN0IGNjd19kZXZpY2UgKik7CiBpbnQgY2N3X3B1cmdlX2JsYWNrbGlzdGVkKHZvaWQpOwordm9pZCBjY3dfZGV2aWNlX3NjaGVkX3RvZG8oc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gY2Rldl90b2RvIHRvZG8pOwogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBkZXZpY2Ugc3RhdHVzIGFuZCBiYXNpYyBzZW5zZSBzdHVmZi4gKi8KIHZvaWQgY2N3X2RldmljZV9hY2N1bXVsYXRlX2lyYihzdHJ1Y3QgY2N3X2RldmljZSAqLCBzdHJ1Y3QgaXJiICopOwpAQCAtOTksMjQgKzk4LDI4IEBACiBpbnQgY2N3X2RldmljZV9hY2N1bXVsYXRlX2FuZF9zZW5zZShzdHJ1Y3QgY2N3X2RldmljZSAqLCBzdHJ1Y3QgaXJiICopOwogaW50IGNjd19kZXZpY2VfZG9fc2Vuc2Uoc3RydWN0IGNjd19kZXZpY2UgKiwgc3RydWN0IGlyYiAqKTsKIAorLyogRnVuY3Rpb24gcHJvdG90eXBlIGZvciBpbnRlcm5hbCByZXF1ZXN0IGhhbmRsaW5nLiAqLworaW50IGxwbV9hZGp1c3QoaW50IGxwbSwgaW50IG1hc2spOwordm9pZCBjY3dfcmVxdWVzdF9zdGFydChzdHJ1Y3QgY2N3X2RldmljZSAqKTsKK2ludCBjY3dfcmVxdWVzdF9jYW5jZWwoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOwordm9pZCBjY3dfcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KTsKK3ZvaWQgY2N3X3JlcXVlc3RfdGltZW91dChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldik7Cit2b2lkIGNjd19yZXF1ZXN0X25vdG9wZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOworCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBzZW5zZSBpZCBzdHVmZi4gKi8KIHZvaWQgY2N3X2RldmljZV9zZW5zZV9pZF9zdGFydChzdHJ1Y3QgY2N3X2RldmljZSAqKTsKLXZvaWQgY2N3X2RldmljZV9zZW5zZV9pZF9pcnEoc3RydWN0IGNjd19kZXZpY2UgKiwgZW51bSBkZXZfZXZlbnQpOwogdm9pZCBjY3dfZGV2aWNlX3NlbnNlX2lkX2RvbmUoc3RydWN0IGNjd19kZXZpY2UgKiwgaW50KTsKIAogLyogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgcGF0aCBncm91cGluZyBzdHVmZi4gKi8KLXZvaWQgY2N3X2RldmljZV9zZW5zZV9wZ2lkX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICopOwotdm9pZCBjY3dfZGV2aWNlX3NlbnNlX3BnaWRfaXJxKHN0cnVjdCBjY3dfZGV2aWNlICosIGVudW0gZGV2X2V2ZW50KTsKLXZvaWQgY2N3X2RldmljZV9zZW5zZV9wZ2lkX2RvbmUoc3RydWN0IGNjd19kZXZpY2UgKiwgaW50KTsKLQogdm9pZCBjY3dfZGV2aWNlX3ZlcmlmeV9zdGFydChzdHJ1Y3QgY2N3X2RldmljZSAqKTsKLXZvaWQgY2N3X2RldmljZV92ZXJpZnlfaXJxKHN0cnVjdCBjY3dfZGV2aWNlICosIGVudW0gZGV2X2V2ZW50KTsKIHZvaWQgY2N3X2RldmljZV92ZXJpZnlfZG9uZShzdHJ1Y3QgY2N3X2RldmljZSAqLCBpbnQpOwogCiB2b2lkIGNjd19kZXZpY2VfZGlzYmFuZF9zdGFydChzdHJ1Y3QgY2N3X2RldmljZSAqKTsKLXZvaWQgY2N3X2RldmljZV9kaXNiYW5kX2lycShzdHJ1Y3QgY2N3X2RldmljZSAqLCBlbnVtIGRldl9ldmVudCk7CiB2b2lkIGNjd19kZXZpY2VfZGlzYmFuZF9kb25lKHN0cnVjdCBjY3dfZGV2aWNlICosIGludCk7CiAKK3ZvaWQgY2N3X2RldmljZV9zdGxja19zdGFydChzdHJ1Y3QgY2N3X2RldmljZSAqLCB2b2lkICosIHZvaWQgKiwgdm9pZCAqKTsKK3ZvaWQgY2N3X2RldmljZV9zdGxja19kb25lKHN0cnVjdCBjY3dfZGV2aWNlICosIHZvaWQgKiwgaW50KTsKKwogaW50IGNjd19kZXZpY2VfY2FsbF9oYW5kbGVyKHN0cnVjdCBjY3dfZGV2aWNlICopOwogCiBpbnQgY2N3X2RldmljZV9zdGxjayhzdHJ1Y3QgY2N3X2RldmljZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKaW5kZXggYjk2MTNkNy4uYWU3NjA2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKQEAgLTIyOSw4ICsyMjksOCBAQAogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAotCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgMCk7Ci0JY2lvX2Rpc2FibGVfc3ViY2hhbm5lbChzY2gpOworCWlmIChjaW9fZGlzYWJsZV9zdWJjaGFubmVsKHNjaCkpCisJCXN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogCS8qCiAJICogTm93IHRoYXQgd2UgdHJpZWQgcmVjb2duaXRpb24sIHdlIGhhdmUgcGVyZm9ybWVkIGRldmljZSBzZWxlY3Rpb24KIAkgKiB0aHJvdWdoIHNzY2goKSBhbmQgdGhlIHBhdGggaW5mb3JtYXRpb24gaXMgdXAgdG8gZGF0ZS4KQEAgLTI2MywyMiArMjYzLDEwIEBACiAJfQogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIERFVl9TVEFURV9OT1RfT1BFUjoKLQkJQ0lPX01TR19FVkVOVCgyLCAiU2Vuc2VJRCA6IHVua25vd24gZGV2aWNlICUwNHggb24gIgotCQkJICAgICAgInN1YmNoYW5uZWwgMC4leC4lMDR4XG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAotCQkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCWJyZWFrOwogCWNhc2UgREVWX1NUQVRFX09GRkxJTkU6CiAJCWlmICghY2Rldi0+b25saW5lKSB7CiAJCQljY3dfZGV2aWNlX3VwZGF0ZV9zZW5zZV9kYXRhKGNkZXYpOwotCQkJLyogSXNzdWUgZGV2aWNlIGluZm8gbWVzc2FnZS4gKi8KLQkJCUNJT19NU0dfRVZFTlQoNCwgIlNlbnNlSUQgOiBkZXZpY2UgMC4leC4lMDR4IHJlcG9ydHM6ICIKLQkJCQkgICAgICAiQ1UgIFR5cGUvTW9kID0gJTA0WC8lMDJYLCBEZXYgVHlwZS9Nb2QgIgotCQkJCSAgICAgICI9ICUwNFgvJTAyWFxuIiwKLQkJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKLQkJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCi0JCQkJICAgICAgY2Rldi0+aWQuY3VfdHlwZSwgY2Rldi0+aWQuY3VfbW9kZWwsCi0JCQkJICAgICAgY2Rldi0+aWQuZGV2X3R5cGUsIGNkZXYtPmlkLmRldl9tb2RlbCk7CiAJCQlicmVhazsKIAkJfQogCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9PRkZMSU5FOwpAQCAtMjg5LDE2ICsyNzcsMTAgQEAKIAkJCXdha2VfdXAoJmNkZXYtPnByaXZhdGUtPndhaXRfcSk7CiAJCX0gZWxzZSB7CiAJCQljY3dfZGV2aWNlX3VwZGF0ZV9zZW5zZV9kYXRhKGNkZXYpOwotCQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkJICAgICBjY3dfZGV2aWNlX2RvX3VuYmluZF9iaW5kKTsKLQkJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKKwkJCWNjd19kZXZpY2Vfc2NoZWRfdG9kbyhjZGV2LCBDREVWX1RPRE9fUkVCSU5EKTsKIAkJfQogCQlyZXR1cm47CiAJY2FzZSBERVZfU1RBVEVfQk9YRUQ6Ci0JCUNJT19NU0dfRVZFTlQoMCwgIlNlbnNlSUQgOiBib3hlZCBkZXZpY2UgJTA0eCBvbiAiCi0JCQkgICAgICAiIHN1YmNoYW5uZWwgMC4leC4lMDR4XG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAotCQkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCWlmIChjZGV2LT5pZC5jdV90eXBlICE9IDApIHsgLyogZGV2aWNlIHdhcyByZWNvZ25pemVkIGJlZm9yZSAqLwogCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucmVjb2dfZG9uZSA9IDE7CiAJCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9CT1hFRDsKQEAgLTM0MywyOCArMzI1LDE2IEBACiAJcmV0dXJuIGNkZXYtPmRydi0+bm90aWZ5ID8gY2Rldi0+ZHJ2LT5ub3RpZnkoY2RldiwgZXZlbnQpIDogMDsKIH0KIAotc3RhdGljIHZvaWQgY21mX3JlZW5hYmxlX2RlbGF5ZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7Ci0KLQlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7Ci0JY2RldiA9IHByaXYtPmNkZXY7Ci0JY21mX3JlZW5hYmxlKGNkZXYpOwotfQotCiBzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX29wZXJfbm90aWZ5KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewogCWlmIChjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBDSU9fT1BFUikpIHsKIAkJLyogUmVlbmFibGUgY2hhbm5lbCBtZWFzdXJlbWVudHMsIGlmIG5lZWRlZC4gKi8KLQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssIGNtZl9yZWVuYWJsZV9kZWxheWVkKTsKLQkJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOworCQljY3dfZGV2aWNlX3NjaGVkX3RvZG8oY2RldiwgQ0RFVl9UT0RPX0VOQUJMRV9DTUYpOwogCQlyZXR1cm47CiAJfQogCS8qIERyaXZlciBkb2Vzbid0IHdhbnQgZGV2aWNlIGJhY2suICovCiAJY2N3X2RldmljZV9zZXRfbm90b3BlcihjZGV2KTsKLQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywgY2N3X2RldmljZV9kb191bmJpbmRfYmluZCk7Ci0JcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOworCWNjd19kZXZpY2Vfc2NoZWRfdG9kbyhjZGV2LCBDREVWX1RPRE9fUkVCSU5EKTsKIH0KIAogLyoKQEAgLTM5MiwxNCArMzYyLDE0IEBACiAJCUNJT19NU0dfRVZFTlQoMCwgIkJveGVkIGRldmljZSAlMDR4IG9uIHN1YmNoYW5uZWwgJTA0eFxuIiwKIAkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgc2NoLT5zY2hpZC5zY2hfbm8pOwogCQlpZiAoY2Rldi0+b25saW5lICYmICFjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBDSU9fQk9YRUQpKQotCQkJY2N3X2RldmljZV9zY2hlZHVsZV9zY2hfdW5yZWdpc3RlcihjZGV2KTsKKwkJCWNjd19kZXZpY2Vfc2NoZWRfdG9kbyhjZGV2LCBDREVWX1RPRE9fVU5SRUcpOwogCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7CiAJCWJyZWFrOwogCWNhc2UgREVWX1NUQVRFX05PVF9PUEVSOgogCQlDSU9fTVNHX0VWRU5UKDAsICJEZXZpY2UgJTA0eCBnb25lIG9uIHN1YmNoYW5uZWwgJTA0eFxuIiwKIAkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgc2NoLT5zY2hpZC5zY2hfbm8pOwogCQlpZiAoIWNjd19kZXZpY2Vfbm90aWZ5KGNkZXYsIENJT19HT05FKSkKLQkJCWNjd19kZXZpY2Vfc2NoZWR1bGVfc2NoX3VucmVnaXN0ZXIoY2Rldik7CisJCQljY3dfZGV2aWNlX3NjaGVkX3RvZG8oY2RldiwgQ0RFVl9UT0RPX1VOUkVHKTsKIAkJZWxzZQogCQkJY2N3X2RldmljZV9zZXRfZGlzY29ubmVjdGVkKGNkZXYpOwogCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7CkBAIC00MDksNyArMzc5LDcgQEAKIAkJCSAgICAgICIlMDR4XG4iLCBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCiAJCQkgICAgICBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCWlmICghY2N3X2RldmljZV9ub3RpZnkoY2RldiwgQ0lPX05PX1BBVEgpKQotCQkJY2N3X2RldmljZV9zY2hlZHVsZV9zY2hfdW5yZWdpc3RlcihjZGV2KTsKKwkJCWNjd19kZXZpY2Vfc2NoZWRfdG9kbyhjZGV2LCBDREVWX1RPRE9fVU5SRUcpOwogCQllbHNlCiAJCQljY3dfZGV2aWNlX3NldF9kaXNjb25uZWN0ZWQoY2Rldik7CiAJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvbm90aWZ5ID0gMDsKQEAgLTQyNSwxMDcgKzM5NSwxMiBAQAogCXdha2VfdXAoJmNkZXYtPnByaXZhdGUtPndhaXRfcSk7CiB9CiAKLXN0YXRpYyBpbnQgY21wX3BnaWQoc3RydWN0IHBnaWQgKnAxLCBzdHJ1Y3QgcGdpZCAqcDIpCi17Ci0JY2hhciAqYzE7Ci0JY2hhciAqYzI7Ci0KLQljMSA9IChjaGFyICopcDE7Ci0JYzIgPSAoY2hhciAqKXAyOwotCi0JcmV0dXJuIG1lbWNtcChjMSArIDEsIGMyICsgMSwgc2l6ZW9mKHN0cnVjdCBwZ2lkKSAtIDEpOwotfQotCi1zdGF0aWMgdm9pZCBfX2Njd19kZXZpY2VfZ2V0X2NvbW1vbl9wZ2lkKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQotewotCWludCBpOwotCWludCBsYXN0OwotCi0JbGFzdCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+cGdpZFtpXS5pbmYucHMuc3RhdGUxID09IFNOSURfU1RBVEUxX1JFU0VUKQotCQkJLyogTm8gUEdJRCB5ZXQgKi8KLQkJCWNvbnRpbnVlOwotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+cGdpZFtsYXN0XS5pbmYucHMuc3RhdGUxID09Ci0JCSAgICBTTklEX1NUQVRFMV9SRVNFVCkgewotCQkJLyogRmlyc3Qgbm9uLXplcm8gUEdJRCAqLwotCQkJbGFzdCA9IGk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoY21wX3BnaWQoJmNkZXYtPnByaXZhdGUtPnBnaWRbaV0sCi0JCQkgICAgICZjZGV2LT5wcml2YXRlLT5wZ2lkW2xhc3RdKSA9PSAwKQotCQkJLyogTm9uLWNvbmZsaWN0aW5nIFBHSURzICovCi0JCQljb250aW51ZTsKLQotCQkvKiBQR0lEIG1pc21hdGNoLCBjYW4ndCBwYXRoZ3JvdXAuICovCi0JCUNJT19NU0dfRVZFTlQoMCwgIlNOSUQgLSBwZ2lkIG1pc21hdGNoIGZvciBkZXZpY2UgIgotCQkJICAgICAgIjAuJXguJTA0eCwgY2FuJ3QgcGF0aGdyb3VwXG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8pOwotCQljZGV2LT5wcml2YXRlLT5vcHRpb25zLnBncm91cCA9IDA7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGNkZXYtPnByaXZhdGUtPnBnaWRbbGFzdF0uaW5mLnBzLnN0YXRlMSA9PQotCSAgICBTTklEX1NUQVRFMV9SRVNFVCkKLQkJLyogTm8gcHJldmlvdXMgcGdpZCBmb3VuZCAqLwotCQltZW1jcHkoJmNkZXYtPnByaXZhdGUtPnBnaWRbMF0sCi0JCSAgICAgICAmY2hhbm5lbF9zdWJzeXN0ZW1zWzBdLT5nbG9iYWxfcGdpZCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcGdpZCkpOwotCWVsc2UKLQkJLyogVXNlIGV4aXN0aW5nIHBnaWQgKi8KLQkJbWVtY3B5KCZjZGV2LT5wcml2YXRlLT5wZ2lkWzBdLCAmY2Rldi0+cHJpdmF0ZS0+cGdpZFtsYXN0XSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcGdpZCkpOwotfQotCi0vKgotICogRnVuY3Rpb24gY2FsbGVkIGZyb20gZGV2aWNlX3BnaWQuYyBhZnRlciBzZW5zZSBwYXRoIGdyb3VuZCBoYXMgY29tcGxldGVkLgotICovCi12b2lkCi1jY3dfZGV2aWNlX3NlbnNlX3BnaWRfZG9uZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGVycikKLXsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQlzd2l0Y2ggKGVycikgewotCWNhc2UgLUVPUE5PVFNVUFA6IC8qIHBhdGggZ3JvdXBpbmcgbm90IHN1cHBvcnRlZCwgdXNlIG5vcCBpbnN0ZWFkLiAqLwotCQljZGV2LT5wcml2YXRlLT5vcHRpb25zLnBncm91cCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMDogLyogc3VjY2VzcyAqLwotCWNhc2UgLUVBQ0NFUzogLyogcGFydGlhbCBzdWNjZXNzLCBzb21lIHBhdGhzIG5vdCBvcGVyYXRpb25hbCAqLwotCQkvKiBDaGVjayBpZiBhbGwgcGdpZHMgYXJlIGVxdWFsIG9yIDAuICovCi0JCV9fY2N3X2RldmljZV9nZXRfY29tbW9uX3BnaWQoY2Rldik7Ci0JCWJyZWFrOwotCWNhc2UgLUVUSU1FOgkJLyogU2Vuc2UgcGF0aCBncm91cCBpZCBzdG9wcGVkIGJ5IHRpbWVvdXQuICovCi0JY2FzZSAtRVVTRVJTOgkJLyogZGV2aWNlIGlzIHJlc2VydmVkIGZvciBzb21lb25lIGVsc2UuICovCi0JCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfQk9YRUQpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJY2N3X2RldmljZV9kb25lKGNkZXYsIERFVl9TVEFURV9OT1RfT1BFUik7Ci0JCXJldHVybjsKLQl9Ci0JLyogU3RhcnQgUGF0aCBHcm91cCB2ZXJpZmljYXRpb24uICovCi0JY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfVkVSSUZZOwotCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvdmVyaWZ5ID0gMDsKLQljY3dfZGV2aWNlX3ZlcmlmeV9zdGFydChjZGV2KTsKLX0KLQogLyoKICAqIFN0YXJ0IGRldmljZSByZWNvZ25pdGlvbi4KICAqLwotaW50Ci1jY3dfZGV2aWNlX3JlY29nbml0aW9uKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQordm9pZCBjY3dfZGV2aWNlX3JlY29nbml0aW9uKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JaW50IHJldDsKLQotCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0JcmV0ID0gY2lvX2VuYWJsZV9zdWJjaGFubmVsKHNjaCwgKHUzMikoYWRkcl90KXNjaCk7Ci0JaWYgKHJldCAhPSAwKQotCQkvKiBDb3VsZG4ndCBlbmFibGUgdGhlIHN1YmNoYW5uZWwgZm9yIGkvby4gU2ljayBkZXZpY2UuICovCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBBZnRlciA2MHMgdGhlIGRldmljZSByZWNvZ25pdGlvbiBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkLiAqLwotCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgNjAqSFopOworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCiAJLyoKIAkgKiBXZSB1c2VkIHRvIHN0YXJ0IGhlcmUgd2l0aCBhIHNlbnNlIHBnaWQgdG8gZmluZCBvdXQgd2hldGhlciBhIGRldmljZQpAQCAtNTM3LDMyICs0MTIsMzMgQEAKIAkgKi8KIAljZGV2LT5wcml2YXRlLT5mbGFncy5yZWNvZ19kb25lID0gMDsKIAljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9TRU5TRV9JRDsKKwlpZiAoY2lvX2VuYWJsZV9zdWJjaGFubmVsKHNjaCwgKHUzMikgKGFkZHJfdCkgc2NoKSkgeworCQljY3dfZGV2aWNlX3JlY29nX2RvbmUoY2RldiwgREVWX1NUQVRFX05PVF9PUEVSKTsKKwkJcmV0dXJuOworCX0KIAljY3dfZGV2aWNlX3NlbnNlX2lkX3N0YXJ0KGNkZXYpOwotCXJldHVybiAwOwogfQogCiAvKgotICogSGFuZGxlIHRpbWVvdXQgaW4gZGV2aWNlIHJlY29nbml0aW9uLgorICogSGFuZGxlIGV2ZW50cyBmb3Igc3RhdGVzIHRoYXQgdXNlIHRoZSBjY3cgcmVxdWVzdCBpbmZyYXN0cnVjdHVyZS4KICAqLwotc3RhdGljIHZvaWQKLWNjd19kZXZpY2VfcmVjb2dfdGltZW91dChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQorc3RhdGljIHZvaWQgY2N3X2RldmljZV9yZXF1ZXN0X2V2ZW50KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBlbnVtIGRldl9ldmVudCBlKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBjY3dfZGV2aWNlX2NhbmNlbF9oYWx0X2NsZWFyKGNkZXYpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgotCQljY3dfZGV2aWNlX3JlY29nX2RvbmUoY2RldiwgREVWX1NUQVRFX0JPWEVEKTsKKwlzd2l0Y2ggKGUpIHsKKwljYXNlIERFVl9FVkVOVF9OT1RPUEVSOgorCQljY3dfcmVxdWVzdF9ub3RvcGVyKGNkZXYpOwogCQlicmVhazsKLQljYXNlIC1FTk9ERVY6Ci0JCWNjd19kZXZpY2VfcmVjb2dfZG9uZShjZGV2LCBERVZfU1RBVEVfTk9UX09QRVIpOworCWNhc2UgREVWX0VWRU5UX0lOVEVSUlVQVDoKKwkJY2N3X3JlcXVlc3RfaGFuZGxlcihjZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBERVZfRVZFTlRfVElNRU9VVDoKKwkJY2N3X3JlcXVlc3RfdGltZW91dChjZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAzKkhaKTsKKwkJYnJlYWs7CiAJfQogfQogCi0KIHZvaWQKIGNjd19kZXZpY2VfdmVyaWZ5X2RvbmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBlcnIpCiB7CkBAIC01NzEsMjEgKzQ0NywxOCBAQAogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAJLyogVXBkYXRlIHNjaGliIC0gcG9tIG1heSBoYXZlIGNoYW5nZWQuICovCiAJaWYgKGNpb191cGRhdGVfc2NoaWIoc2NoKSkgewotCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7Ci0JCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfTk9UX09QRVIpOwotCQlyZXR1cm47CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gY2FsbGJhY2s7CiAJfQogCS8qIFVwZGF0ZSBscG0gd2l0aCB2ZXJpZmllZCBwYXRoIG1hc2suICovCiAJc2NoLT5scG0gPSBzY2gtPnZwbTsKIAkvKiBSZXBlYXQgcGF0aCB2ZXJpZmljYXRpb24/ICovCiAJaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLmRvdmVyaWZ5KSB7Ci0JCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvdmVyaWZ5ID0gMDsKIAkJY2N3X2RldmljZV92ZXJpZnlfc3RhcnQoY2Rldik7CiAJCXJldHVybjsKIAl9CitjYWxsYmFjazoKIAlzd2l0Y2ggKGVycikgewotCWNhc2UgLUVPUE5PVFNVUFA6IC8qIHBhdGggZ3JvdXBpbmcgbm90IHN1cHBvcnRlZCwganVzdCBzZXQgb25saW5lLiAqLwotCQljZGV2LT5wcml2YXRlLT5vcHRpb25zLnBncm91cCA9IDA7CiAJY2FzZSAwOgogCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX09OTElORSk7CiAJCS8qIERlbGl2ZXIgZmFrZSBpcmIgdG8gZGV2aWNlIGRyaXZlciwgaWYgbmVlZGVkLiAqLwpAQCAtNjA0LDE4ICs0NzcsMjAgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIC1FVElNRToKKwljYXNlIC1FVVNFUlM6CiAJCS8qIFJlc2V0IG9wZXIgbm90aWZ5IGluZGljYXRpb24gYWZ0ZXIgdmVyaWZ5IGVycm9yLiAqLwogCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7CiAJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfQk9YRUQpOwogCQlicmVhazsKKwljYXNlIC1FQUNDRVM6CisJCS8qIFJlc2V0IG9wZXIgbm90aWZ5IGluZGljYXRpb24gYWZ0ZXIgdmVyaWZ5IGVycm9yLiAqLworCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7CisJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfRElTQ09OTkVDVEVEKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogUmVzZXQgb3BlciBub3RpZnkgaW5kaWNhdGlvbiBhZnRlciB2ZXJpZnkgZXJyb3IuICovCiAJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvbm90aWZ5ID0gMDsKLQkJaWYgKGNkZXYtPm9ubGluZSkgewotCQkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAwKTsKLQkJCWRldl9mc21fZXZlbnQoY2RldiwgREVWX0VWRU5UX05PVE9QRVIpOwotCQl9IGVsc2UKLQkJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfTk9UX09QRVIpOworCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX05PVF9PUEVSKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNjQwLDE3ICs1MTUsOSBAQAogCQkJZGV2X2ZzbV9ldmVudChjZGV2LCBERVZfRVZFTlRfTk9UT1BFUik7CiAJCXJldHVybiByZXQ7CiAJfQotCS8qIERvIHdlIHdhbnQgdG8gZG8gcGF0aCBncm91cGluZz8gKi8KLQlpZiAoIWNkZXYtPnByaXZhdGUtPm9wdGlvbnMucGdyb3VwKSB7Ci0JCS8qIFN0YXJ0IGluaXRpYWwgcGF0aCB2ZXJpZmljYXRpb24uICovCi0JCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX1ZFUklGWTsKLQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG92ZXJpZnkgPSAwOwotCQljY3dfZGV2aWNlX3ZlcmlmeV9zdGFydChjZGV2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIERvIGEgU2Vuc2VQR0lEIGZpcnN0LiAqLwotCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX1NFTlNFX1BHSUQ7Ci0JY2N3X2RldmljZV9zZW5zZV9wZ2lkX3N0YXJ0KGNkZXYpOworCS8qIFN0YXJ0IGluaXRpYWwgcGF0aCB2ZXJpZmljYXRpb24uICovCisJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfVkVSSUZZOworCWNjd19kZXZpY2VfdmVyaWZ5X3N0YXJ0KGNkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC02NjYsNyArNTMzLDYgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9ub3RpZnkgPSAwOwotCQlkZXZfZnNtX2V2ZW50KGNkZXYsIERFVl9FVkVOVF9OT1RPUEVSKTsKIAkJY2N3X2RldmljZV9kb25lKGNkZXYsIERFVl9TVEFURV9OT1RfT1BFUik7CiAJCWJyZWFrOwogCX0KQEAgLTcwMyw3ICs1NjksNyBAQAogCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfT05MSU5FKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBBcmUgd2UgZG9pbmcgcGF0aCBncm91cGluZz8gKi8KLQlpZiAoIWNkZXYtPnByaXZhdGUtPm9wdGlvbnMucGdyb3VwKSB7CisJaWYgKCFjZGV2LT5wcml2YXRlLT5mbGFncy5wZ3JvdXApIHsKIAkJLyogTm8sIHNldCBzdGF0ZSBvZmZsaW5lIGltbWVkaWF0ZWx5LiAqLwogCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX09GRkxJTkUpOwogCQlyZXR1cm4gMDsKQEAgLTcxNSw0MyArNTgxLDEzIEBACiB9CiAKIC8qCi0gKiBIYW5kbGUgdGltZW91dCBpbiBkZXZpY2Ugb25saW5lL29mZmxpbmUgcHJvY2Vzcy4KLSAqLwotc3RhdGljIHZvaWQKLWNjd19kZXZpY2Vfb25vZmZfdGltZW91dChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBjY3dfZGV2aWNlX2NhbmNlbF9oYWx0X2NsZWFyKGNkZXYpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgotCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX0JPWEVEKTsKLQkJYnJlYWs7Ci0JY2FzZSAtRU5PREVWOgotCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX05PVF9PUEVSKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAzKkhaKTsKLQl9Ci19Ci0KLS8qCi0gKiBIYW5kbGUgbm90IG9wZXIgZXZlbnQgaW4gZGV2aWNlIHJlY29nbml0aW9uLgotICovCi1zdGF0aWMgdm9pZAotY2N3X2RldmljZV9yZWNvZ19ub3RvcGVyKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBlbnVtIGRldl9ldmVudCBkZXZfZXZlbnQpCi17Ci0JY2N3X2RldmljZV9yZWNvZ19kb25lKGNkZXYsIERFVl9TVEFURV9OT1RfT1BFUik7Ci19Ci0KLS8qCiAgKiBIYW5kbGUgbm90IG9wZXJhdGlvbmFsIGV2ZW50IGluIG5vbi1zcGVjaWFsIHN0YXRlLgogICovCiBzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX2dlbmVyaWNfbm90b3BlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKIAkJCQkgICAgICAgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQogewogCWlmICghY2N3X2RldmljZV9ub3RpZnkoY2RldiwgQ0lPX0dPTkUpKQotCQljY3dfZGV2aWNlX3NjaGVkdWxlX3NjaF91bnJlZ2lzdGVyKGNkZXYpOworCQljY3dfZGV2aWNlX3NjaGVkX3RvZG8oY2RldiwgQ0RFVl9UT0RPX1VOUkVHKTsKIAllbHNlCiAJCWNjd19kZXZpY2Vfc2V0X2Rpc2Nvbm5lY3RlZChjZGV2KTsKIH0KQEAgLTgwMiwxMSArNjM4LDI3IEBACiAJfQogCS8qIERldmljZSBpcyBpZGxlLCB3ZSBjYW4gZG8gdGhlIHBhdGggdmVyaWZpY2F0aW9uLiAqLwogCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX1ZFUklGWTsKLQljZGV2LT5wcml2YXRlLT5mbGFncy5kb3ZlcmlmeSA9IDA7CiAJY2N3X2RldmljZV92ZXJpZnlfc3RhcnQoY2Rldik7CiB9CiAKIC8qCisgKiBIYW5kbGUgcGF0aCB2ZXJpZmljYXRpb24gZXZlbnQgaW4gYm94ZWQgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGNjd19kZXZpY2VfYm94ZWRfdmVyaWZ5KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LAorCQkJCSAgICBlbnVtIGRldl9ldmVudCBkZXZfZXZlbnQpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisKKwlpZiAoY2Rldi0+b25saW5lKSB7CisJCWlmIChjaW9fZW5hYmxlX3N1YmNoYW5uZWwoc2NoLCAodTMyKSAoYWRkcl90KSBzY2gpKQorCQkJY2N3X2RldmljZV9kb25lKGNkZXYsIERFVl9TVEFURV9OT1RfT1BFUik7CisJCWVsc2UKKwkJCWNjd19kZXZpY2Vfb25saW5lX3ZlcmlmeShjZGV2LCBkZXZfZXZlbnQpOworCX0gZWxzZQorCQljc3Nfc2NoZWR1bGVfZXZhbChzY2gtPnNjaGlkKTsKK30KKworLyoKICAqIEdvdCBhbiBpbnRlcnJ1cHQgZm9yIGEgbm9ybWFsIGlvIChzdGF0ZSBvbmxpbmUpLgogICovCiBzdGF0aWMgdm9pZApAQCAtOTA0LDEyICs3NTYsNiBAQAogCSAqLwogCWlmIChzY3N3X2ZjdGwoJmlyYi0+c2NzdykgJgogCSAgICAoU0NTV19GQ1RMX0NMRUFSX0ZVTkMgfCBTQ1NXX0ZDVExfSEFMVF9GVU5DKSkgewotCQkvKiBSZXRyeSBCYXNpYyBTZW5zZSBpZiByZXF1ZXN0ZWQuICovCi0JCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkgewotCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOwotCQkJY2N3X2RldmljZV9kb19zZW5zZShjZGV2LCBpcmIpOwotCQkJcmV0dXJuOwotCQl9CiAJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvc2Vuc2UgPSAwOwogCQltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKIAkJY2N3X2RldmljZV9hY2N1bXVsYXRlX2lyYihjZGV2LCBpcmIpOwpAQCAtOTMzLDIxICs3NzksNiBAQAogfQogCiBzdGF0aWMgdm9pZAotY2N3X2RldmljZV9jbGVhcl92ZXJpZnkoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gZGV2X2V2ZW50IGRldl9ldmVudCkKLXsKLQlzdHJ1Y3QgaXJiICppcmI7Ci0KLQlpcmIgPSAoc3RydWN0IGlyYiAqKSBfX0xDX0lSQjsKLQkvKiBBY2N1bXVsYXRlIHN0YXR1cy4gV2UgZG9uJ3QgZG8gYmFzaWMgc2Vuc2UuICovCi0JY2N3X2RldmljZV9hY2N1bXVsYXRlX2lyYihjZGV2LCBpcmIpOwotCS8qIFJlbWVtYmVyIHRvIGNsZWFyIGlyYiB0byBhdm9pZCByZXNpZHVhbHMuICovCi0JbWVtc2V0KCZjZGV2LT5wcml2YXRlLT5pcmIsIDAsIHNpemVvZihzdHJ1Y3QgaXJiKSk7Ci0JLyogVHJ5IHRvIHN0YXJ0IGRlbGF5ZWQgZGV2aWNlIHZlcmlmaWNhdGlvbi4gKi8KLQljY3dfZGV2aWNlX29ubGluZV92ZXJpZnkoY2RldiwgMCk7Ci0JLyogTm90ZTogRG9uJ3QgY2FsbCBoYW5kbGVyIGZvciBjaW8gaW5pdGlhdGVkIGNsZWFyISAqLwotfQotCi1zdGF0aWMgdm9pZAogY2N3X2RldmljZV9raWxsaW5nX2lycShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CkBAIC0xMDA0LDMyICs4MzUsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotY2N3X2RldmljZV9zdGxja19kb25lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBlbnVtIGRldl9ldmVudCBkZXZfZXZlbnQpCi17Ci0Jc3RydWN0IGlyYiAqaXJiOwotCi0Jc3dpdGNoIChkZXZfZXZlbnQpIHsKLQljYXNlIERFVl9FVkVOVF9JTlRFUlJVUFQ6Ci0JCWlyYiA9IChzdHJ1Y3QgaXJiICopIF9fTENfSVJCOwotCQkvKiBDaGVjayBmb3IgdW5zb2xpY2l0ZWQgaW50ZXJydXB0LiAqLwotCQlpZiAoKHNjc3dfc3RjdGwoJmlyYi0+c2NzdykgPT0KLQkJICAgICAoU0NTV19TVENUTF9TVEFUVVNfUEVORCB8IFNDU1dfU1RDVExfQUxFUlRfU1RBVFVTKSkgJiYKLQkJICAgICghc2Nzd19jYygmaXJiLT5zY3N3KSkpCi0JCQkvKiBGSVhNRTogd2Ugc2hvdWxkIHJlc3RhcnQgc3RsY2sgaGVyZSwgYnV0IHRoaXMKLQkJCSAqIGlzIGV4dHJlbWVseSB1bmxpa2VseSAuLi4gKi8KLQkJCWdvdG8gb3V0X3dha2V1cDsKLQotCQljY3dfZGV2aWNlX2FjY3VtdWxhdGVfaXJiKGNkZXYsIGlyYik7Ci0JCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgYmFzaWMgc2Vuc2UgZXRjLiAqLwotCQlicmVhazsKLQlkZWZhdWx0OiAvKiB0aW1lb3V0ICovCi0JCWJyZWFrOwotCX0KLW91dF93YWtldXA6Ci0Jd2FrZV91cCgmY2Rldi0+cHJpdmF0ZS0+d2FpdF9xKTsKLX0KLQotc3RhdGljIHZvaWQKIGNjd19kZXZpY2Vfc3RhcnRfaWQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gZGV2X2V2ZW50IGRldl9ldmVudCkKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwpAQCAtMTAzOCwxMCArODQzLDYgQEAKIAlpZiAoY2lvX2VuYWJsZV9zdWJjaGFubmVsKHNjaCwgKHUzMikoYWRkcl90KXNjaCkgIT0gMCkKIAkJLyogQ291bGRuJ3QgZW5hYmxlIHRoZSBzdWJjaGFubmVsIGZvciBpL28uIFNpY2sgZGV2aWNlLiAqLwogCQlyZXR1cm47Ci0KLQkvKiBBZnRlciA2MHMgdGhlIGRldmljZSByZWNvZ25pdGlvbiBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkLiAqLwotCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgNjAqSFopOwotCiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfRElTQ09OTkVDVEVEX1NFTlNFX0lEOwogCWNjd19kZXZpY2Vfc2Vuc2VfaWRfc3RhcnQoY2Rldik7CiB9CkBAIC0xMDcyLDIyICs4NzMsMjAgQEAKIAogCS8qIFdlIHNob3VsZCBhbHNvIHVkYXRlIHNzZCBpbmZvLCBidXQgdGhpcyBoYXMgdG8gd2FpdC4gKi8KIAkvKiBDaGVjayBpZiB0aGlzIGlzIGFub3RoZXIgZGV2aWNlIHdoaWNoIGFwcGVhcmVkIG9uIHRoZSBzYW1lIHNjaC4gKi8KLQlpZiAoc2NoLT5zY2hpYi5wbWN3LmRldiAhPSBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8pIHsKLQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfbW92ZV90b19vcnBoYW5hZ2UpOwotCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7Ci0JfSBlbHNlCisJaWYgKHNjaC0+c2NoaWIucG1jdy5kZXYgIT0gY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vKQorCQljc3Nfc2NoZWR1bGVfZXZhbChzY2gtPnNjaGlkKTsKKwllbHNlCiAJCWNjd19kZXZpY2Vfc3RhcnRfaWQoY2RldiwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1jY3dfZGV2aWNlX29mZmxpbmVfaXJxKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBlbnVtIGRldl9ldmVudCBkZXZfZXZlbnQpCitzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX2Rpc2FibGVkX2lycShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKKwkJCQkgICAgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCS8qCi0JICogQW4gaW50ZXJydXB0IGluIHN0YXRlIG9mZmxpbmUgbWVhbnMgYSBwcmV2aW91cyBkaXNhYmxlIHdhcyBub3QKKwkgKiBBbiBpbnRlcnJ1cHQgaW4gYSBkaXNhYmxlZCBzdGF0ZSBtZWFucyBhIHByZXZpb3VzIGRpc2FibGUgd2FzIG5vdAogCSAqIHN1Y2Nlc3NmdWwgLSBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIHRyeSB0byBkaXNhYmxlIGFnYWluLgogCSAqLwogCWNpb19kaXNhYmxlX3N1YmNoYW5uZWwoc2NoKTsKQEAgLTExMTMsMTAgKzkxMiw3IEBACiBjY3dfZGV2aWNlX3F1aWVzY2VfZG9uZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQogewogCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgMCk7Ci0JaWYgKGRldl9ldmVudCA9PSBERVZfRVZFTlRfTk9UT1BFUikKLQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7Ci0JZWxzZQotCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9PRkZMSU5FOworCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogCXdha2VfdXAoJmNkZXYtPnByaXZhdGUtPndhaXRfcSk7CiB9CiAKQEAgLTExMjYsMTcgKzkyMiwxMSBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBjY3dfZGV2aWNlX2NhbmNlbF9oYWx0X2NsZWFyKGNkZXYpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgotCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9PRkZMSU5FOwotCQl3YWtlX3VwKCZjZGV2LT5wcml2YXRlLT53YWl0X3EpOwotCQlicmVhazsKLQljYXNlIC1FTk9ERVY6CisJaWYgKHJldCA9PSAtRUJVU1kpIHsKKwkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCBIWi8xMCk7CisJfSBlbHNlIHsKIAkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CiAJCXdha2VfdXAoJmNkZXYtPnByaXZhdGUtPndhaXRfcSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgSFovMTApOwogCX0KIH0KIApAQCAtMTE1MCw1MCArOTQwLDM3IEBACiB9CiAKIC8qCi0gKiBCdWcgb3BlcmF0aW9uIGFjdGlvbi4gCi0gKi8KLXN0YXRpYyB2b2lkCi1jY3dfZGV2aWNlX2J1ZyhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQotewotCUNJT19NU0dfRVZFTlQoMCwgIkludGVybmFsIHN0YXRlIFslaV1bJWldIG5vdCBoYW5kbGVkIGZvciBkZXZpY2UgIgotCQkgICAgICAiMC4leC4lMDR4XG4iLCBjZGV2LT5wcml2YXRlLT5zdGF0ZSwgZGV2X2V2ZW50LAotCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKLQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vKTsKLQlCVUcoKTsKLX0KLQotLyoKICAqIGRldmljZSBzdGF0ZW1hY2hpbmUKICAqLwogZnNtX2Z1bmNfdCAqZGV2X2p1bXB0YWJsZVtOUl9ERVZfU1RBVEVTXVtOUl9ERVZfRVZFTlRTXSA9IHsKIAlbREVWX1NUQVRFX05PVF9PUEVSXSA9IHsKIAkJW0RFVl9FVkVOVF9OT1RPUEVSXQk9IGNjd19kZXZpY2Vfbm9wLAotCQlbREVWX0VWRU5UX0lOVEVSUlVQVF0JPSBjY3dfZGV2aWNlX2J1ZywKKwkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV9kaXNhYmxlZF9pcnEsCiAJCVtERVZfRVZFTlRfVElNRU9VVF0JPSBjY3dfZGV2aWNlX25vcCwKIAkJW0RFVl9FVkVOVF9WRVJJRlldCT0gY2N3X2RldmljZV9ub3AsCiAJfSwKIAlbREVWX1NUQVRFX1NFTlNFX1BHSURdID0gewotCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9nZW5lcmljX25vdG9wZXIsCi0JCVtERVZfRVZFTlRfSU5URVJSVVBUXQk9IGNjd19kZXZpY2Vfc2Vuc2VfcGdpZF9pcnEsCi0JCVtERVZfRVZFTlRfVElNRU9VVF0JPSBjY3dfZGV2aWNlX29ub2ZmX3RpbWVvdXQsCisJCVtERVZfRVZFTlRfTk9UT1BFUl0JPSBjY3dfZGV2aWNlX3JlcXVlc3RfZXZlbnQsCisJCVtERVZfRVZFTlRfSU5URVJSVVBUXQk9IGNjd19kZXZpY2VfcmVxdWVzdF9ldmVudCwKKwkJW0RFVl9FVkVOVF9USU1FT1VUXQk9IGNjd19kZXZpY2VfcmVxdWVzdF9ldmVudCwKIAkJW0RFVl9FVkVOVF9WRVJJRlldCT0gY2N3X2RldmljZV9ub3AsCiAJfSwKIAlbREVWX1NUQVRFX1NFTlNFX0lEXSA9IHsKLQkJW0RFVl9FVkVOVF9OT1RPUEVSXQk9IGNjd19kZXZpY2VfcmVjb2dfbm90b3BlciwKLQkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV9zZW5zZV9pZF9pcnEsCi0JCVtERVZfRVZFTlRfVElNRU9VVF0JPSBjY3dfZGV2aWNlX3JlY29nX3RpbWVvdXQsCisJCVtERVZfRVZFTlRfTk9UT1BFUl0JPSBjY3dfZGV2aWNlX3JlcXVlc3RfZXZlbnQsCisJCVtERVZfRVZFTlRfSU5URVJSVVBUXQk9IGNjd19kZXZpY2VfcmVxdWVzdF9ldmVudCwKKwkJW0RFVl9FVkVOVF9USU1FT1VUXQk9IGNjd19kZXZpY2VfcmVxdWVzdF9ldmVudCwKIAkJW0RFVl9FVkVOVF9WRVJJRlldCT0gY2N3X2RldmljZV9ub3AsCiAJfSwKIAlbREVWX1NUQVRFX09GRkxJTkVdID0gewogCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9nZW5lcmljX25vdG9wZXIsCi0JCVtERVZfRVZFTlRfSU5URVJSVVBUXQk9IGNjd19kZXZpY2Vfb2ZmbGluZV9pcnEsCisJCVtERVZfRVZFTlRfSU5URVJSVVBUXQk9IGNjd19kZXZpY2VfZGlzYWJsZWRfaXJxLAogCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9ub3AsCiAJCVtERVZfRVZFTlRfVkVSSUZZXQk9IGNjd19kZXZpY2Vfb2ZmbGluZV92ZXJpZnksCiAJfSwKIAlbREVWX1NUQVRFX1ZFUklGWV0gPSB7Ci0JCVtERVZfRVZFTlRfTk9UT1BFUl0JPSBjY3dfZGV2aWNlX2dlbmVyaWNfbm90b3BlciwKLQkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV92ZXJpZnlfaXJxLAotCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9vbm9mZl90aW1lb3V0LAorCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9yZXF1ZXN0X2V2ZW50LAorCQlbREVWX0VWRU5UX0lOVEVSUlVQVF0JPSBjY3dfZGV2aWNlX3JlcXVlc3RfZXZlbnQsCisJCVtERVZfRVZFTlRfVElNRU9VVF0JPSBjY3dfZGV2aWNlX3JlcXVlc3RfZXZlbnQsCiAJCVtERVZfRVZFTlRfVkVSSUZZXQk9IGNjd19kZXZpY2VfZGVsYXlfdmVyaWZ5LAogCX0sCiAJW0RFVl9TVEFURV9PTkxJTkVdID0gewpAQCAtMTIwOSwyNCArOTg2LDE4IEBACiAJCVtERVZfRVZFTlRfVkVSSUZZXQk9IGNjd19kZXZpY2Vfb25saW5lX3ZlcmlmeSwKIAl9LAogCVtERVZfU1RBVEVfRElTQkFORF9QR0lEXSA9IHsKLQkJW0RFVl9FVkVOVF9OT1RPUEVSXQk9IGNjd19kZXZpY2VfZ2VuZXJpY19ub3RvcGVyLAotCQlbREVWX0VWRU5UX0lOVEVSUlVQVF0JPSBjY3dfZGV2aWNlX2Rpc2JhbmRfaXJxLAotCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9vbm9mZl90aW1lb3V0LAorCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9yZXF1ZXN0X2V2ZW50LAorCQlbREVWX0VWRU5UX0lOVEVSUlVQVF0JPSBjY3dfZGV2aWNlX3JlcXVlc3RfZXZlbnQsCisJCVtERVZfRVZFTlRfVElNRU9VVF0JPSBjY3dfZGV2aWNlX3JlcXVlc3RfZXZlbnQsCiAJCVtERVZfRVZFTlRfVkVSSUZZXQk9IGNjd19kZXZpY2Vfbm9wLAogCX0sCiAJW0RFVl9TVEFURV9CT1hFRF0gPSB7CiAJCVtERVZfRVZFTlRfTk9UT1BFUl0JPSBjY3dfZGV2aWNlX2dlbmVyaWNfbm90b3BlciwKLQkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV9zdGxja19kb25lLAotCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9zdGxja19kb25lLAotCQlbREVWX0VWRU5UX1ZFUklGWV0JPSBjY3dfZGV2aWNlX25vcCwKKwkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV9ub3AsCisJCVtERVZfRVZFTlRfVElNRU9VVF0JPSBjY3dfZGV2aWNlX25vcCwKKwkJW0RFVl9FVkVOVF9WRVJJRlldCT0gY2N3X2RldmljZV9ib3hlZF92ZXJpZnksCiAJfSwKIAkvKiBzdGF0ZXMgdG8gd2FpdCBmb3IgaS9vIGNvbXBsZXRpb24gYmVmb3JlIGRvaW5nIHNvbWV0aGluZyAqLwotCVtERVZfU1RBVEVfQ0xFQVJfVkVSSUZZXSA9IHsKLQkJW0RFVl9FVkVOVF9OT1RPUEVSXQk9IGNjd19kZXZpY2VfZ2VuZXJpY19ub3RvcGVyLAotCQlbREVWX0VWRU5UX0lOVEVSUlVQVF0gICA9IGNjd19kZXZpY2VfY2xlYXJfdmVyaWZ5LAotCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9ub3AsCi0JCVtERVZfRVZFTlRfVkVSSUZZXQk9IGNjd19kZXZpY2Vfbm9wLAotCX0sCiAJW0RFVl9TVEFURV9USU1FT1VUX0tJTExdID0gewogCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9nZW5lcmljX25vdG9wZXIsCiAJCVtERVZfRVZFTlRfSU5URVJSVVBUXQk9IGNjd19kZXZpY2Vfa2lsbGluZ19pcnEsCkBAIC0xMjQzLDEzICsxMDE0LDEzIEBACiAJW0RFVl9TVEFURV9ESVNDT05ORUNURURdID0gewogCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9ub3AsCiAJCVtERVZfRVZFTlRfSU5URVJSVVBUXQk9IGNjd19kZXZpY2Vfc3RhcnRfaWQsCi0JCVtERVZfRVZFTlRfVElNRU9VVF0JPSBjY3dfZGV2aWNlX2J1ZywKKwkJW0RFVl9FVkVOVF9USU1FT1VUXQk9IGNjd19kZXZpY2Vfbm9wLAogCQlbREVWX0VWRU5UX1ZFUklGWV0JPSBjY3dfZGV2aWNlX3N0YXJ0X2lkLAogCX0sCiAJW0RFVl9TVEFURV9ESVNDT05ORUNURURfU0VOU0VfSURdID0gewotCQlbREVWX0VWRU5UX05PVE9QRVJdCT0gY2N3X2RldmljZV9yZWNvZ19ub3RvcGVyLAotCQlbREVWX0VWRU5UX0lOVEVSUlVQVF0JPSBjY3dfZGV2aWNlX3NlbnNlX2lkX2lycSwKLQkJW0RFVl9FVkVOVF9USU1FT1VUXQk9IGNjd19kZXZpY2VfcmVjb2dfdGltZW91dCwKKwkJW0RFVl9FVkVOVF9OT1RPUEVSXQk9IGNjd19kZXZpY2VfcmVxdWVzdF9ldmVudCwKKwkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV9yZXF1ZXN0X2V2ZW50LAorCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9yZXF1ZXN0X2V2ZW50LAogCQlbREVWX0VWRU5UX1ZFUklGWV0JPSBjY3dfZGV2aWNlX25vcCwKIAl9LAogCVtERVZfU1RBVEVfQ01GQ0hBTkdFXSA9IHsKQEAgLTEyNjQsNiArMTAzNSwxMiBAQAogCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV91cGRhdGVfY21mYmxvY2ssCiAJCVtERVZfRVZFTlRfVkVSSUZZXQk9IGNjd19kZXZpY2VfdXBkYXRlX2NtZmJsb2NrLAogCX0sCisJW0RFVl9TVEFURV9TVEVBTF9MT0NLXSA9IHsKKwkJW0RFVl9FVkVOVF9OT1RPUEVSXQk9IGNjd19kZXZpY2VfcmVxdWVzdF9ldmVudCwKKwkJW0RFVl9FVkVOVF9JTlRFUlJVUFRdCT0gY2N3X2RldmljZV9yZXF1ZXN0X2V2ZW50LAorCQlbREVWX0VWRU5UX1RJTUVPVVRdCT0gY2N3X2RldmljZV9yZXF1ZXN0X2V2ZW50LAorCQlbREVWX0VWRU5UX1ZFUklGWV0JPSBjY3dfZGV2aWNlX25vcCwKKwl9LAogfTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoY2N3X2RldmljZV9zZXRfdGltZW91dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfaWQuYwppbmRleCAxYmRhYTYxLi43OGEwYjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2lkLmMKQEAgLTEsNDAgKzEsMzkgQEAKIC8qCi0gKiBkcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jCisgKiAgQ0NXIGRldmljZSBTRU5TRSBJRCBJL08gaGFuZGxpbmcuCiAgKgotICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAotICoJCQkgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKLSAqCQkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQotICoKLSAqIFNlbnNlIElEIGZ1bmN0aW9ucy4KKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwyMDA5CisgKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgPGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbT4KKyAqCQkgTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPgorICoJCSBQZXRlciBPYmVycGFybGVpdGVyIDxwZXRlci5vYmVycGFybGVpdGVyQGRlLmlibS5jb20+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgotI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CiAjaW5jbHVkZSA8YXNtL2RpYWcuaD4KIAogI2luY2x1ZGUgImNpby5oIgogI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgotI2luY2x1ZGUgImNzcy5oIgogI2luY2x1ZGUgImRldmljZS5oIgotI2luY2x1ZGUgImlvYXNtLmgiCiAjaW5jbHVkZSAiaW9fc2NoLmgiCiAKKyNkZWZpbmUgU0VOU0VfSURfUkVUUklFUwkyNTYKKyNkZWZpbmUgU0VOU0VfSURfVElNRU9VVAkoMTAgKiBIWikKKyNkZWZpbmUgU0VOU0VfSURfTUlOX0xFTgk0CisjZGVmaW5lIFNFTlNFX0lEX0JBU0lDX0xFTgk3CisKIC8qKgotICogdm1fdmRldl90b19jdV90eXBlIC0gQ29udmVydCB2bSB2aXJ0dWFsIGRldmljZSBpbnRvIGNvbnRyb2wgdW5pdCB0eXBlCi0gKgkJCWZvciBjZXJ0YWluIGRldmljZXMuCi0gKiBAY2xhc3M6IHZpcnR1YWwgZGV2aWNlIGNsYXNzCi0gKiBAdHlwZTogdmlydHVhbCBkZXZpY2UgdHlwZQorICogZGlhZzIxMF90b19zZW5zZWlkIC0gY29udmVydCBkaWFnIDB4MjEwIGRhdGEgdG8gc2Vuc2UgaWQgaW5mb3JtYXRpb24KKyAqIEBzZW5zZWlkOiBzZW5zZSBpZAorICogQGRpYWc6IGRpYWcgMHgyMTAgZGF0YQogICoKLSAqIFJldHVybnMgY29udHJvbCB1bml0IHR5cGUgaWYgYSBtYXRjaCB3YXMgbWFkZSBvciAlMHhmZmZmIG90aGVyd2lzZS4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KICAqLwotc3RhdGljIGludCB2bV92ZGV2X3RvX2N1X3R5cGUoaW50IGNsYXNzLCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgZGlhZzIxMF90b19zZW5zZWlkKHN0cnVjdCBzZW5zZWlkICpzZW5zZWlkLCBzdHJ1Y3QgZGlhZzIxMCAqZGlhZykKIHsKIAlzdGF0aWMgc3RydWN0IHsKIAkJaW50IGNsYXNzLCB0eXBlLCBjdV90eXBlOwpAQCAtNzEsMjUzICs3MCwxNTMgQEAKIAl9OwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm1fZGV2aWNlcyk7IGkrKykKLQkJaWYgKGNsYXNzID09IHZtX2RldmljZXNbaV0uY2xhc3MgJiYgdHlwZSA9PSB2bV9kZXZpY2VzW2ldLnR5cGUpCi0JCQlyZXR1cm4gdm1fZGV2aWNlc1tpXS5jdV90eXBlOwotCi0JcmV0dXJuIDB4ZmZmZjsKLX0KLQotLyoqCi0gKiBkaWFnX2dldF9kZXZfaW5mbyAtIHJldHJpZXZlIGRldmljZSBpbmZvcm1hdGlvbiB2aWEgRElBRyBYJzIxMCcKLSAqIEBkZXZubzogZGV2aWNlIG51bWJlcgotICogQHBzOiBwb2ludGVyIHRvIHNlbnNlIElEIGRhdGEgYXJlYQotICoKLSAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQgZGlhZ19nZXRfZGV2X2luZm8odTE2IGRldm5vLCBzdHJ1Y3Qgc2Vuc2VpZCAqcHMpCi17Ci0Jc3RydWN0IGRpYWcyMTAgZGlhZ19kYXRhOwotCWludCBjY29kZTsKLQotCUNJT19UUkFDRV9FVkVOVCAoNCwgIlZNdmRpbmYiKTsKLQotCWRpYWdfZGF0YSA9IChzdHJ1Y3QgZGlhZzIxMCkgewotCQkudnJkY2R2bm8gPSBkZXZubywKLQkJLnZyZGNsZW4gPSBzaXplb2YgKGRpYWdfZGF0YSksCi0JfTsKLQotCWNjb2RlID0gZGlhZzIxMCAoJmRpYWdfZGF0YSk7Ci0JaWYgKChjY29kZSA9PSAwKSB8fCAoY2NvZGUgPT0gMikpIHsKLQkJcHMtPnJlc2VydmVkID0gMHhmZjsKLQotCQkvKiBTcGVjaWFsIGNhc2UgZm9yIG9zYSBkZXZpY2VzLiAqLwotCQlpZiAoZGlhZ19kYXRhLnZyZGN2Y2xhID09IDB4MDIgJiYgZGlhZ19kYXRhLnZyZGN2dHlwID09IDB4MjApIHsKLQkJCXBzLT5jdV90eXBlID0gMHgzMDg4OwotCQkJcHMtPmN1X21vZGVsID0gMHg2MDsKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIG9zYSBkZXZpY2VzLiAqLworCWlmIChkaWFnLT52cmRjdmNsYSA9PSAweDAyICYmIGRpYWctPnZyZGN2dHlwID09IDB4MjApIHsKKwkJc2Vuc2VpZC0+Y3VfdHlwZSA9IDB4MzA4ODsKKwkJc2Vuc2VpZC0+Y3VfbW9kZWwgPSAweDYwOworCQlzZW5zZWlkLT5yZXNlcnZlZCA9IDB4ZmY7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bV9kZXZpY2VzKTsgaSsrKSB7CisJCWlmIChkaWFnLT52cmRjdmNsYSA9PSB2bV9kZXZpY2VzW2ldLmNsYXNzICYmCisJCSAgICBkaWFnLT52cmRjdnR5cCA9PSB2bV9kZXZpY2VzW2ldLnR5cGUpIHsKKwkJCXNlbnNlaWQtPmN1X3R5cGUgPSB2bV9kZXZpY2VzW2ldLmN1X3R5cGU7CisJCQlzZW5zZWlkLT5yZXNlcnZlZCA9IDB4ZmY7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlwcy0+Y3VfdHlwZSA9IHZtX3ZkZXZfdG9fY3VfdHlwZShkaWFnX2RhdGEudnJkY3ZjbGEsCi0JCQkJCQlkaWFnX2RhdGEudnJkY3Z0eXApOwotCQlpZiAocHMtPmN1X3R5cGUgIT0gMHhmZmZmKQotCQkJcmV0dXJuIDA7CiAJfQogCi0JQ0lPX01TR19FVkVOVCgwLCAiRElBRyBYJzIxMCcgZm9yIGRldmljZSAlMDRYIHJldHVybmVkIChjYyA9ICVkKToiCi0JCSAgICAgICJ2ZGV2IGNsYXNzIDogJTAyWCwgdmRldiB0eXBlIDogJTA0WCBcbiAuLi4gICIKLQkJICAgICAgInJkZXYgY2xhc3MgOiAlMDJYLCByZGV2IHR5cGUgOiAlMDRYLCAiCi0JCSAgICAgICJyZGV2IG1vZGVsOiAlMDJYXG4iLAotCQkgICAgICBkZXZubywgY2NvZGUsCi0JCSAgICAgIGRpYWdfZGF0YS52cmRjdmNsYSwgZGlhZ19kYXRhLnZyZGN2dHlwLAotCQkgICAgICBkaWFnX2RhdGEudnJkY3JjY2wsIGRpYWdfZGF0YS52cmRjY3J0eSwKLQkJICAgICAgZGlhZ19kYXRhLnZyZGNjcm1kKTsKLQogCXJldHVybiAtRU5PREVWOwogfQogCi0vKgotICogU3RhcnQgU2Vuc2UgSUQgaGVscGVyIGZ1bmN0aW9uLgotICogVHJ5IHRvIG9idGFpbiB0aGUgJ2NvbnRyb2wgdW5pdCcvJ2RldmljZSB0eXBlJyBpbmZvcm1hdGlvbgotICogIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ViY2hhbm5lbC4KKy8qKgorICogZGlhZ19nZXRfZGV2X2luZm8gLSByZXRyaWV2ZSBkZXZpY2UgaW5mb3JtYXRpb24gdmlhIGRpYWcgMHgyMTAKKyAqIEBjZGV2OiBjY3cgZGV2aWNlCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KICAqLwotc3RhdGljIGludAotX19jY3dfZGV2aWNlX3NlbnNlX2lkX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQorc3RhdGljIGludCBkaWFnMjEwX2dldF9kZXZfaW5mbyhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCXN0cnVjdCBjY3cxICpjY3c7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgY2N3X2Rldl9pZCAqZGV2X2lkID0gJmNkZXYtPnByaXZhdGUtPmRldl9pZDsKKwlzdHJ1Y3Qgc2Vuc2VpZCAqc2Vuc2VpZCA9ICZjZGV2LT5wcml2YXRlLT5zZW5zZWlkOworCXN0cnVjdCBkaWFnMjEwIGRpYWdfZGF0YTsKKwlpbnQgcmM7CiAKLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCS8qIFNldHVwIHNlbnNlIGNoYW5uZWwgcHJvZ3JhbS4gKi8KLQljY3cgPSBjZGV2LT5wcml2YXRlLT5pY2N3czsKLQljY3ctPmNtZF9jb2RlID0gQ0NXX0NNRF9TRU5TRV9JRDsKLQljY3ctPmNkYSA9IChfX3UzMikgX19wYSAoJmNkZXYtPnByaXZhdGUtPnNlbnNlaWQpOwotCWNjdy0+Y291bnQgPSBzaXplb2YgKHN0cnVjdCBzZW5zZWlkKTsKLQljY3ctPmZsYWdzID0gQ0NXX0ZMQUdfU0xJOworCWlmIChkZXZfaWQtPnNzaWQgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbWVtc2V0KCZkaWFnX2RhdGEsIDAsIHNpemVvZihkaWFnX2RhdGEpKTsKKwlkaWFnX2RhdGEudnJkY2R2bm8JPSBkZXZfaWQtPmRldm5vOworCWRpYWdfZGF0YS52cmRjbGVuCT0gc2l6ZW9mKGRpYWdfZGF0YSk7CisJcmMgPSBkaWFnMjEwKCZkaWFnX2RhdGEpOworCUNJT19UUkFDRV9FVkVOVCg0LCAiZGlhZzIxMCIpOworCUNJT19IRVhfRVZFTlQoNCwgJnJjLCBzaXplb2YocmMpKTsKKwlDSU9fSEVYX0VWRU5UKDQsICZkaWFnX2RhdGEsIHNpemVvZihkaWFnX2RhdGEpKTsKKwlpZiAocmMgIT0gMCAmJiByYyAhPSAyKQorCQlnb3RvIGVycl9mYWlsZWQ7CisJaWYgKGRpYWcyMTBfdG9fc2Vuc2VpZChzZW5zZWlkLCAmZGlhZ19kYXRhKSkKKwkJZ290byBlcnJfdW5rbm93bjsKKwlyZXR1cm4gMDsKIAotCS8qIFJlc2V0IGRldmljZSBzdGF0dXMuICovCi0JbWVtc2V0KCZjZGV2LT5wcml2YXRlLT5pcmIsIDAsIHNpemVvZihzdHJ1Y3QgaXJiKSk7Ci0KLQkvKiBUcnkgb24gZXZlcnkgcGF0aC4gKi8KLQlyZXQgPSAtRU5PREVWOwotCXdoaWxlIChjZGV2LT5wcml2YXRlLT5pbWFzayAhPSAwKSB7Ci0JCWNkZXYtPnByaXZhdGUtPnNlbnNlaWQuY3VfdHlwZSA9IDB4RkZGRjsKLQkJaWYgKChzY2gtPm9wbSAmIGNkZXYtPnByaXZhdGUtPmltYXNrKSAhPSAwICYmCi0JCSAgICBjZGV2LT5wcml2YXRlLT5pcmV0cnkgPiAwKSB7Ci0JCQljZGV2LT5wcml2YXRlLT5pcmV0cnktLTsKLQkJCS8qIFJlc2V0IGludGVybmFsIHJldHJ5IGluZGljYXRpb24uICovCi0JCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7Ci0JCQlyZXQgPSBjaW9fc3RhcnQgKHNjaCwgY2Rldi0+cHJpdmF0ZS0+aWNjd3MsCi0JCQkJCSBjZGV2LT5wcml2YXRlLT5pbWFzayk7Ci0JCQkvKiByZXQgaXMgMCwgLUVCVVNZLCAtRUFDQ0VTIG9yIC1FTk9ERVYgKi8KLQkJCWlmIChyZXQgIT0gLUVBQ0NFUykKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWNkZXYtPnByaXZhdGUtPmltYXNrID4+PSAxOwotCQljZGV2LT5wcml2YXRlLT5pcmV0cnkgPSA1OwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1jY3dfZGV2aWNlX3NlbnNlX2lkX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQotewotCWludCByZXQ7Ci0KLQltZW1zZXQgKCZjZGV2LT5wcml2YXRlLT5zZW5zZWlkLCAwLCBzaXplb2YgKHN0cnVjdCBzZW5zZWlkKSk7Ci0JY2Rldi0+cHJpdmF0ZS0+aW1hc2sgPSAweDgwOwotCWNkZXYtPnByaXZhdGUtPmlyZXRyeSA9IDU7Ci0JcmV0ID0gX19jY3dfZGV2aWNlX3NlbnNlX2lkX3N0YXJ0KGNkZXYpOwotCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKLQkJY2N3X2RldmljZV9zZW5zZV9pZF9kb25lKGNkZXYsIHJldCk7CitlcnJfdW5rbm93bjoKKwlDSU9fTVNHX0VWRU5UKDAsICJzbnNpZDogZGV2aWNlIDAuJXguJTA0eDogdW5rbm93biBkaWFnMjEwIGRhdGFcbiIsCisJCSAgICAgIGRldl9pZC0+c3NpZCwgZGV2X2lkLT5kZXZubyk7CisJcmV0dXJuIC1FTk9ERVY7CitlcnJfZmFpbGVkOgorCUNJT19NU0dfRVZFTlQoMCwgInNuc2lkOiBkZXZpY2UgMC4leC4lMDR4OiBkaWFnMjEwIGZhaWxlZCAocmM9JWQpXG4iLAorCQkgICAgICBkZXZfaWQtPnNzaWQsIGRldl9pZC0+ZGV2bm8sIHJjKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogLyoKLSAqIENhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IHRvIGNoZWNrIGlmIGEgdmFsaWQgYW5zd2VyCi0gKiB0byBTZW5zZSBJRCB3YXMgcmVjZWl2ZWQuCisgKiBJbml0aWFsaXplIFNFTlNFIElEIGRhdGEuCiAgKi8KLXN0YXRpYyBpbnQKLWNjd19kZXZpY2VfY2hlY2tfc2Vuc2VfaWQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCitzdGF0aWMgdm9pZCBzbnNpZF9pbml0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGlyYiAqaXJiOworCWNkZXYtPnByaXZhdGUtPmZsYWdzLmVzaWQgPSAwOworCW1lbXNldCgmY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZCwgMCwgc2l6ZW9mKGNkZXYtPnByaXZhdGUtPnNlbnNlaWQpKTsKKwljZGV2LT5wcml2YXRlLT5zZW5zZWlkLmN1X3R5cGUgPSAweGZmZmY7Cit9CiAKLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCWlyYiA9ICZjZGV2LT5wcml2YXRlLT5pcmI7CisvKgorICogQ2hlY2sgZm9yIGNvbXBsZXRlIFNFTlNFIElEIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgc25zaWRfY2hlY2soc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNtZF9zY3N3ICpzY3N3ID0gJmNkZXYtPnByaXZhdGUtPmlyYi5zY3N3LmNtZDsKKwlpbnQgbGVuID0gc2l6ZW9mKHN0cnVjdCBzZW5zZWlkKSAtIHNjc3ctPmNvdW50OwogCi0JLyogQ2hlY2sgdGhlIGVycm9yIGNhc2VzLiAqLwotCWlmIChpcmItPnNjc3cuY21kLmZjdGwgJiAoU0NTV19GQ1RMX0hBTFRfRlVOQyB8IFNDU1dfRkNUTF9DTEVBUl9GVU5DKSkgewotCQkvKiBSZXRyeSBTZW5zZSBJRCBpZiByZXF1ZXN0ZWQuICovCi0JCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkgewotCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQkJcmV0dXJuIC1FVElNRTsKLQl9Ci0JaWYgKGlyYi0+ZXN3LmVzdzAuZXJ3LmNvbnMgJiYgKGlyYi0+ZWN3WzBdICYgU05TMF9DTURfUkVKRUNUKSkgewotCQkvKgotCQkgKiBpZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgU2Vuc2VJRAotCQkgKiAgY29tbWFuZCBmdXJ0aGVyIHJldHJpZXMgd291bGRuJ3QgaGVscCAuLi4KLQkJICogTkI6IFdlIGRvbid0IGNoZWNrIGhlcmUgZm9yIGludGVydmVudGlvbiByZXF1aXJlZCBsaWtlIHdlCi0JCSAqICAgICBkaWQgYmVmb3JlLCBiZWNhdXNlIHRhcGUgZGV2aWNlcyB3aXRoIG5vIHRhcGUgaW5zZXJ0ZWQKLQkJICogICAgIG1heSBwcmVzZW50IHRoaXMgc3RhdHVzICppbiBjb25qdW5jdGlvbiB3aXRoKiB0aGUKLQkJICogICAgIHNlbnNlIGlkIGluZm9ybWF0aW9uLiBTbywgZm9yIGludGVydmVudGlvbiByZXF1aXJlZCwKLQkJICogICAgIHdlIHVzZSB0aGUgIndoYWNrIGl0IHVudGlsIGl0IHRhbGtzIiBzdHJhdGVneS4uLgotCQkgKi8KLQkJQ0lPX01TR19FVkVOVCgwLCAiU2Vuc2VJRCA6IGRldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgIgotCQkJICAgICAgIjAuJXguJTA0eCByZXBvcnRzIGNtZCByZWplY3RcbiIsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKLQkJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vKTsKKwkvKiBDaGVjayBmb3IgaW5jb21wbGV0ZSBTRU5TRSBJRCBkYXRhLiAqLworCWlmIChsZW4gPCBTRU5TRV9JRF9NSU5fTEVOKQorCQlnb3RvIG91dF9yZXN0YXJ0OworCWlmIChjZGV2LT5wcml2YXRlLT5zZW5zZWlkLmN1X3R5cGUgPT0gMHhmZmZmKQorCQlnb3RvIG91dF9yZXN0YXJ0OworCS8qIENoZWNrIGZvciBpbmNvbXBhdGlibGUgU0VOU0UgSUQgZGF0YS4gKi8KKwlpZiAoY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZC5yZXNlcnZlZCAhPSAweGZmKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCWlmIChpcmItPmVzdy5lc3cwLmVydy5jb25zKSB7Ci0JCUNJT19NU0dfRVZFTlQoMiwgIlNlbnNlSUQgOiBVQyBvbiBkZXYgMC4leC4lMDR4LCAiCi0JCQkgICAgICAibHB1bSAlMDJYLCBjbnQgJTAyZCwgc25zIDoiCi0JCQkgICAgICAiICUwMlglMDJYJTAyWCUwMlggJTAyWCUwMlglMDJYJTAyWCAuLi5cbiIsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywKLQkJCSAgICAgIGlyYi0+ZXN3LmVzdzAuc3VibG9nLmxwdW0sCi0JCQkgICAgICBpcmItPmVzdy5lc3cwLmVydy5zY250LAotCQkJICAgICAgaXJiLT5lY3dbMF0sIGlyYi0+ZWN3WzFdLAotCQkJICAgICAgaXJiLT5lY3dbMl0sIGlyYi0+ZWN3WzNdLAotCQkJICAgICAgaXJiLT5lY3dbNF0sIGlyYi0+ZWN3WzVdLAotCQkJICAgICAgaXJiLT5lY3dbNl0sIGlyYi0+ZWN3WzddKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWlmIChpcmItPnNjc3cuY21kLmNjID09IDMpIHsKLQkJdTggbHBtOworCS8qIENoZWNrIGZvciBleHRlbmRlZC1pZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbi4gKi8KKwlpZiAobGVuID4gU0VOU0VfSURfQkFTSUNfTEVOKQorCQljZGV2LT5wcml2YXRlLT5mbGFncy5lc2lkID0gMTsKKwlyZXR1cm4gMDsKIAotCQlscG0gPSB0b19pb19wcml2YXRlKHNjaCktPm9yYi5jbWQubHBtOwotCQlpZiAoKGxwbSAmIHNjaC0+c2NoaWIucG1jdy5waW0gJiBzY2gtPnNjaGliLnBtY3cucGFtKSAhPSAwKQotCQkJQ0lPX01TR19FVkVOVCg0LCAiU2Vuc2VJRCA6IHBhdGggJTAyWCBmb3IgZGV2aWNlICUwNHggIgotCQkJCSAgICAgICJvbiBzdWJjaGFubmVsIDAuJXguJTA0eCBpcyAiCi0JCQkJICAgICAgIidub3Qgb3BlcmF0aW9uYWwnXG4iLCBscG0sCi0JCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAotCQkJCSAgICAgIHNjaC0+c2NoaWQuc3NpZCwgc2NoLT5zY2hpZC5zY2hfbm8pOwotCQlyZXR1cm4gLUVBQ0NFUzsKLQl9Ci0KLQkvKiBEaWQgd2UgZ2V0IGEgcHJvcGVyIGFuc3dlciA/ICovCi0JaWYgKGlyYi0+c2Nzdy5jbWQuY2MgPT0gMCAmJiBjZGV2LT5wcml2YXRlLT5zZW5zZWlkLmN1X3R5cGUgIT0gMHhGRkZGICYmCi0JICAgIGNkZXYtPnByaXZhdGUtPnNlbnNlaWQucmVzZXJ2ZWQgPT0gMHhGRikgewotCQlpZiAoaXJiLT5zY3N3LmNtZC5jb3VudCA8IHNpemVvZihzdHJ1Y3Qgc2Vuc2VpZCkgLSA4KQotCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZXNpZCA9IDE7Ci0JCXJldHVybiAwOyAvKiBTdWNjZXNzICovCi0JfQotCi0JLyogSG1tLCB3aGF0ZXZlciBoYXBwZW5lZCwgdHJ5IGFnYWluLiAqLwotCUNJT19NU0dfRVZFTlQoMiwgIlNlbnNlSUQgOiBzdGFydF9JTygpIGZvciBkZXZpY2UgJTA0eCBvbiAiCi0JCSAgICAgICJzdWJjaGFubmVsIDAuJXguJTA0eCByZXR1cm5zIHN0YXR1cyAlMDJYJTAyWFxuIiwKLQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCi0JCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vLAotCQkgICAgICBpcmItPnNjc3cuY21kLmRzdGF0LCBpcmItPnNjc3cuY21kLmNzdGF0KTsKK291dF9yZXN0YXJ0OgorCXNuc2lkX2luaXQoY2Rldik7CiAJcmV0dXJuIC1FQUdBSU47CiB9CiAKIC8qCi0gKiBHb3QgaW50ZXJydXB0IGZvciBTZW5zZSBJRC4KKyAqIFByb2Nlc3MgU0VOU0UgSUQgcmVxdWVzdCByZXN1bHQuCiAgKi8KLXZvaWQKLWNjd19kZXZpY2Vfc2Vuc2VfaWRfaXJxKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBlbnVtIGRldl9ldmVudCBkZXZfZXZlbnQpCitzdGF0aWMgdm9pZCBzbnNpZF9jYWxsYmFjayhzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgdm9pZCAqZGF0YSwgaW50IHJjKQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGlyYiAqaXJiOwotCWludCByZXQ7CisJc3RydWN0IGNjd19kZXZfaWQgKmlkID0gJmNkZXYtPnByaXZhdGUtPmRldl9pZDsKKwlzdHJ1Y3Qgc2Vuc2VpZCAqc2Vuc2VpZCA9ICZjZGV2LT5wcml2YXRlLT5zZW5zZWlkOworCWludCB2bSA9IDA7CiAKLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCWlyYiA9IChzdHJ1Y3QgaXJiICopIF9fTENfSVJCOwotCS8qIFJldHJ5IHNlbnNlIGlkLCBpZiBuZWVkZWQuICovCi0JaWYgKGlyYi0+c2Nzdy5jbWQuc3RjdGwgPT0KLQkgICAgKFNDU1dfU1RDVExfU1RBVFVTX1BFTkQgfCBTQ1NXX1NUQ1RMX0FMRVJUX1NUQVRVUykpIHsKLQkJaWYgKChpcmItPnNjc3cuY21kLmNjID09IDEpIHx8ICFpcmItPnNjc3cuY21kLmFjdGwpIHsKLQkJCXJldCA9IF9fY2N3X2RldmljZV9zZW5zZV9pZF9zdGFydChjZGV2KTsKLQkJCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKLQkJCQljY3dfZGV2aWNlX3NlbnNlX2lkX2RvbmUoY2RldiwgcmV0KTsKKwlpZiAocmMgJiYgTUFDSElORV9JU19WTSkgeworCQkvKiBUcnkgZGlhZyAweDIxMCBmYWxsYmFjayBvbiB6L1ZNLiAqLworCQlzbnNpZF9pbml0KGNkZXYpOworCQlpZiAoZGlhZzIxMF9nZXRfZGV2X2luZm8oY2RldikgPT0gMCkgeworCQkJcmMgPSAwOworCQkJdm0gPSAxOwogCQl9Ci0JCXJldHVybjsKIAl9Ci0JaWYgKGNjd19kZXZpY2VfYWNjdW11bGF0ZV9hbmRfc2Vuc2UoY2RldiwgaXJiKSAhPSAwKQotCQlyZXR1cm47Ci0JcmV0ID0gY2N3X2RldmljZV9jaGVja19zZW5zZV9pZChjZGV2KTsKLQltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKLQlzd2l0Y2ggKHJldCkgewotCS8qIDAsIC1FVElNRSwgLUVPUE5PVFNVUFAsIC1FQUdBSU4gb3IgLUVBQ0NFUyAqLwotCWNhc2UgMDoJCQkvKiBTZW5zZSBpZCBzdWNjZWVkZWQuICovCi0JY2FzZSAtRVRJTUU6CQkvKiBTZW5zZSBpZCBzdG9wcGVkIGJ5IHRpbWVvdXQuICovCi0JCWNjd19kZXZpY2Vfc2Vuc2VfaWRfZG9uZShjZGV2LCByZXQpOwotCQlicmVhazsKLQljYXNlIC1FQUNDRVM6CQkvKiBjaGFubmVsIGlzIG5vdCBvcGVyYXRpb25hbC4gKi8KLQkJc2NoLT5scG0gJj0gfmNkZXYtPnByaXZhdGUtPmltYXNrOwotCQljZGV2LT5wcml2YXRlLT5pbWFzayA+Pj0gMTsKLQkJY2Rldi0+cHJpdmF0ZS0+aXJldHJ5ID0gNTsKLQkJLyogZmFsbCB0aHJvdWdoLiAqLwotCWNhc2UgLUVBR0FJTjoJCS8qIHRyeSBhZ2Fpbi4gKi8KLQkJcmV0ID0gX19jY3dfZGV2aWNlX3NlbnNlX2lkX3N0YXJ0KGNkZXYpOwotCQlpZiAocmV0ID09IDAgfHwgcmV0ID09IC1FQlVTWSkKLQkJCWJyZWFrOwotCQkvKiBmYWxsIHRocm91Z2guICovCi0JZGVmYXVsdDoJCS8qIFNlbnNlIElEIGZhaWxlZC4gVHJ5IGFza2luZyBWTS4gKi8KLQkJaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCQlyZXQgPSBkaWFnX2dldF9kZXZfaW5mbyhjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCi0JCQkJCQkmY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZCk7Ci0JCWVsc2UKLQkJCS8qCi0JCQkgKiBJZiB3ZSBjYW4ndCBjb3VsZG4ndCBpZGVudGlmeSB0aGUgZGV2aWNlIHR5cGUgd2UKLQkJCSAqICBjb25zaWRlciB0aGUgZGV2aWNlICJub3Qgb3BlcmF0aW9uYWwiLgotCQkJICovCi0JCQlyZXQgPSAtRU5PREVWOworCUNJT19NU0dfRVZFTlQoMiwgInNuc2lkOiBkZXZpY2UgMC4leC4lMDR4OiByYz0lZCAlMDR4LyUwMnggIgorCQkgICAgICAiJTA0eC8lMDJ4JXNcbiIsIGlkLT5zc2lkLCBpZC0+ZGV2bm8sIHJjLAorCQkgICAgICBzZW5zZWlkLT5jdV90eXBlLCBzZW5zZWlkLT5jdV9tb2RlbCwgc2Vuc2VpZC0+ZGV2X3R5cGUsCisJCSAgICAgIHNlbnNlaWQtPmRldl9tb2RlbCwgdm0gPyAiIChkaWFnMjEwKSIgOiAiIik7CisJY2N3X2RldmljZV9zZW5zZV9pZF9kb25lKGNkZXYsIHJjKTsKK30KIAotCQljY3dfZGV2aWNlX3NlbnNlX2lkX2RvbmUoY2RldiwgcmV0KTsKLQkJYnJlYWs7Ci0JfQorLyoqCisgKiBjY3dfZGV2aWNlX3NlbnNlX2lkX3N0YXJ0IC0gcGVyZm9ybSBTRU5TRSBJRAorICogQGNkZXY6IGNjdyBkZXZpY2UKKyAqCisgKiBFeGVjdXRlIGEgU0VOU0UgSUQgY2hhbm5lbCBwcm9ncmFtIG9uIEBjZGV2IHRvIHVwZGF0ZSBpdHMgc2Vuc2UgaWQKKyAqIGluZm9ybWF0aW9uLiBXaGVuIGZpbmlzaGVkLCBjYWxsIGNjd19kZXZpY2Vfc2Vuc2VfaWRfZG9uZSB3aXRoIGEKKyAqIHJldHVybiBjb2RlIHNwZWNpZnlpbmcgdGhlIHJlc3VsdC4KKyAqLwordm9pZCBjY3dfZGV2aWNlX3NlbnNlX2lkX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKKwlzdHJ1Y3QgY2N3MSAqY3AgPSBjZGV2LT5wcml2YXRlLT5pY2N3czsKKworCUNJT19UUkFDRV9FVkVOVCg0LCAic25zaWQiKTsKKwlDSU9fSEVYX0VWRU5UKDQsICZjZGV2LT5wcml2YXRlLT5kZXZfaWQsIHNpemVvZihjZGV2LT5wcml2YXRlLT5kZXZfaWQpKTsKKwkvKiBEYXRhIHNldHVwLiAqLworCXNuc2lkX2luaXQoY2Rldik7CisJLyogQ2hhbm5lbCBwcm9ncmFtIHNldHVwLiAqLworCWNwLT5jbWRfY29kZQk9IENDV19DTURfU0VOU0VfSUQ7CisJY3AtPmNkYQkJPSAodTMyKSAoYWRkcl90KSAmY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZDsKKwljcC0+Y291bnQJPSBzaXplb2Yoc3RydWN0IHNlbnNlaWQpOworCWNwLT5mbGFncwk9IENDV19GTEFHX1NMSTsKKwkvKiBSZXF1ZXN0IHNldHVwLiAqLworCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CisJcmVxLT5jcAkJPSBjcDsKKwlyZXEtPnRpbWVvdXQJPSBTRU5TRV9JRF9USU1FT1VUOworCXJlcS0+bWF4cmV0cmllcwk9IFNFTlNFX0lEX1JFVFJJRVM7CisJcmVxLT5scG0JPSBzY2gtPnNjaGliLnBtY3cucGFtICYgc2NoLT5vcG07CisJcmVxLT5jaGVjawk9IHNuc2lkX2NoZWNrOworCXJlcS0+Y2FsbGJhY2sJPSBzbnNpZF9jYWxsYmFjazsKKwljY3dfcmVxdWVzdF9zdGFydChjZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggMmQwZWZlZS4uNmRhODQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2lkYWxzLmg+CkBAIC00Niw2ICs0Nyw3IEBACiAJY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5yZXBhbGwgPSAoZmxhZ3MgJiBDQ1dERVZfUkVQT1JUX0FMTCkgIT0gMDsKIAljZGV2LT5wcml2YXRlLT5vcHRpb25zLnBncm91cCA9IChmbGFncyAmIENDV0RFVl9ET19QQVRIR1JPVVApICE9IDA7CiAJY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5mb3JjZSA9IChmbGFncyAmIENDV0RFVl9BTExPV19GT1JDRSkgIT0gMDsKKwljZGV2LT5wcml2YXRlLT5vcHRpb25zLm1wYXRoID0gKGZsYWdzICYgQ0NXREVWX0RPX01VTFRJUEFUSCkgIT0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQsNiArNzYsNyBAQAogCWNkZXYtPnByaXZhdGUtPm9wdGlvbnMucmVwYWxsIHw9IChmbGFncyAmIENDV0RFVl9SRVBPUlRfQUxMKSAhPSAwOwogCWNkZXYtPnByaXZhdGUtPm9wdGlvbnMucGdyb3VwIHw9IChmbGFncyAmIENDV0RFVl9ET19QQVRIR1JPVVApICE9IDA7CiAJY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5mb3JjZSB8PSAoZmxhZ3MgJiBDQ1dERVZfQUxMT1dfRk9SQ0UpICE9IDA7CisJY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5tcGF0aCB8PSAoZmxhZ3MgJiBDQ1dERVZfRE9fTVVMVElQQVRIKSAhPSAwOwogCXJldHVybiAwOwogfQogCkBAIC05MCw5ICs5MywzNCBAQAogCWNkZXYtPnByaXZhdGUtPm9wdGlvbnMucmVwYWxsICY9IChmbGFncyAmIENDV0RFVl9SRVBPUlRfQUxMKSA9PSAwOwogCWNkZXYtPnByaXZhdGUtPm9wdGlvbnMucGdyb3VwICY9IChmbGFncyAmIENDV0RFVl9ET19QQVRIR1JPVVApID09IDA7CiAJY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5mb3JjZSAmPSAoZmxhZ3MgJiBDQ1dERVZfQUxMT1dfRk9SQ0UpID09IDA7CisJY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5tcGF0aCAmPSAoZmxhZ3MgJiBDQ1dERVZfRE9fTVVMVElQQVRIKSA9PSAwOwogfQogCiAvKioKKyAqIGNjd19kZXZpY2VfaXNfcGF0aGdyb3VwIC0gZGV0ZXJtaW5lIGlmIHBhdGhzIHRvIHRoaXMgZGV2aWNlIGFyZSBncm91cGVkCisgKiBAY2RldjogY2N3IGRldmljZQorICoKKyAqIFJldHVybiBub24temVybyBpZiB0aGVyZSBpcyBhIHBhdGggZ3JvdXAsIHplcm8gb3RoZXJ3aXNlLgorICovCitpbnQgY2N3X2RldmljZV9pc19wYXRoZ3JvdXAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJcmV0dXJuIGNkZXYtPnByaXZhdGUtPmZsYWdzLnBncm91cDsKK30KK0VYUE9SVF9TWU1CT0woY2N3X2RldmljZV9pc19wYXRoZ3JvdXApOworCisvKioKKyAqIGNjd19kZXZpY2VfaXNfbXVsdGlwYXRoIC0gZGV0ZXJtaW5lIGlmIGRldmljZSBpcyBvcGVyYXRpbmcgaW4gbXVsdGlwYXRoIG1vZGUKKyAqIEBjZGV2OiBjY3cgZGV2aWNlCisgKgorICogUmV0dXJuIG5vbi16ZXJvIGlmIGRldmljZSBpcyBvcGVyYXRpbmcgaW4gbXVsdGlwYXRoIG1vZGUsIHplcm8gb3RoZXJ3aXNlLgorICovCitpbnQgY2N3X2RldmljZV9pc19tdWx0aXBhdGgoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJcmV0dXJuIGNkZXYtPnByaXZhdGUtPmZsYWdzLm1wYXRoOworfQorRVhQT1JUX1NZTUJPTChjY3dfZGV2aWNlX2lzX211bHRpcGF0aCk7CisKKy8qKgogICogY2N3X2RldmljZV9jbGVhcigpIC0gdGVybWluYXRlIEkvTyByZXF1ZXN0IHByb2Nlc3NpbmcKICAqIEBjZGV2OiB0YXJnZXQgY2N3IGRldmljZQogICogQGludHBhcm06IGludGVycnVwdGlvbiBwYXJhbWV0ZXI7IHZhbHVlIGlzIG9ubHkgdXNlZCBpZiBubyBJL08gaXMKQEAgLTE2Nyw4ICsxOTUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX05PVF9PUEVSKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX1ZFUklGWSB8fAotCSAgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfQ0xFQVJfVkVSSUZZKSB7CisJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9WRVJJRlkpIHsKIAkJLyogUmVtZW1iZXIgdG8gZmFrZSBpcmIgd2hlbiBmaW5pc2hlZC4gKi8KIAkJaWYgKCFjZGV2LT5wcml2YXRlLT5mbGFncy5mYWtlX2lyYikgewogCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZmFrZV9pcmIgPSAxOwpAQCAtNDc4LDc0ICs1MDUsNjUgQEAKIAlyZXR1cm4gc2NoLT5scG07CiB9CiAKLS8qCi0gKiBUcnkgdG8gYnJlYWsgdGhlIGxvY2sgb24gYSBib3hlZCBkZXZpY2UuCi0gKi8KLWludAotY2N3X2RldmljZV9zdGxjayhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3N0cnVjdCBzdGxja19kYXRhIHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCWludCByYzsKK307CisKK3ZvaWQgY2N3X2RldmljZV9zdGxja19kb25lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICpkYXRhLCBpbnQgcmMpCiB7Ci0Jdm9pZCAqYnVmLCAqYnVmMjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgc3RsY2tfZGF0YSAqc2RhdGEgPSBkYXRhOwogCi0JaWYgKCFjZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKKwlzZGF0YS0+cmMgPSByYzsKKwljb21wbGV0ZSgmc2RhdGEtPmRvbmUpOworfQogCi0JaWYgKGNkZXYtPmRydiAmJiAhY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5mb3JjZSkKLQkJcmV0dXJuIC1FSU5WQUw7CisvKgorICogUGVyZm9ybSB1bmNvbmRpdGlvbmFsIHJlc2VydmUgKyByZWxlYXNlLgorICovCitpbnQgY2N3X2RldmljZV9zdGxjayhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc3RsY2tfZGF0YSBkYXRhOworCXU4ICpidWZmZXI7CisJaW50IHJjOwogCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQkKLQlDSU9fVFJBQ0VfRVZFTlQoMiwgInN0bCBsb2NrIik7Ci0JQ0lPX1RSQUNFX0VWRU5UKDIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKLQotCWJ1ZiA9IGttYWxsb2MoMzIqc2l6ZW9mKGNoYXIpLCBHRlBfRE1BfEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlidWYyID0ga21hbGxvYygzMipzaXplb2YoY2hhciksIEdGUF9ETUF8R0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYyKSB7Ci0JCWtmcmVlKGJ1Zik7Ci0JCXJldHVybiAtRU5PTUVNOworCS8qIENoZWNrIGlmIHN0ZWFsIGxvY2sgb3BlcmF0aW9uIGlzIHZhbGlkIGZvciB0aGlzIGRldmljZS4gKi8KKwlpZiAoY2Rldi0+ZHJ2KSB7CisJCWlmICghY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5mb3JjZSkKKwkJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzcGluX2xvY2tfaXJxc2F2ZShzY2gtPmxvY2ssIGZsYWdzKTsKLQlyZXQgPSBjaW9fZW5hYmxlX3N1YmNoYW5uZWwoc2NoLCAodTMyKShhZGRyX3Qpc2NoKTsKLQlpZiAocmV0KQorCWJ1ZmZlciA9IGt6YWxsb2MoNjQsIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5pdF9jb21wbGV0aW9uKCZkYXRhLmRvbmUpOworCWRhdGEucmMgPSAtRUlPOworCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKKwlyYyA9IGNpb19lbmFibGVfc3ViY2hhbm5lbChzY2gsICh1MzIpIChhZGRyX3QpIHNjaCk7CisJaWYgKHJjKQogCQlnb3RvIG91dF91bmxvY2s7Ci0JLyoKLQkgKiBTZXR1cCBjY3cuIFdlIGNoYWluIGFuIHVuY29uZGl0aW9uYWwgcmVzZXJ2ZSBhbmQgYSByZWxlYXNlIHNvIHdlCi0JICogb25seSBicmVhayB0aGUgbG9jay4KLQkgKi8KLQljZGV2LT5wcml2YXRlLT5pY2N3c1swXS5jbWRfY29kZSA9IENDV19DTURfU1RMQ0s7Ci0JY2Rldi0+cHJpdmF0ZS0+aWNjd3NbMF0uY2RhID0gKF9fdTMyKSBfX3BhKGJ1Zik7Ci0JY2Rldi0+cHJpdmF0ZS0+aWNjd3NbMF0uY291bnQgPSAzMjsKLQljZGV2LT5wcml2YXRlLT5pY2N3c1swXS5mbGFncyA9IENDV19GTEFHX0NDOwotCWNkZXYtPnByaXZhdGUtPmljY3dzWzFdLmNtZF9jb2RlID0gQ0NXX0NNRF9SRUxFQVNFOwotCWNkZXYtPnByaXZhdGUtPmljY3dzWzFdLmNkYSA9IChfX3UzMikgX19wYShidWYyKTsKLQljZGV2LT5wcml2YXRlLT5pY2N3c1sxXS5jb3VudCA9IDMyOwotCWNkZXYtPnByaXZhdGUtPmljY3dzWzFdLmZsYWdzID0gMDsKLQlyZXQgPSBjaW9fc3RhcnQoc2NoLCBjZGV2LT5wcml2YXRlLT5pY2N3cywgMCk7Ci0JaWYgKHJldCkgewotCQljaW9fZGlzYWJsZV9zdWJjaGFubmVsKHNjaCk7IC8vRklYTUU6IHJldHVybiBjb2RlPwotCQlnb3RvIG91dF91bmxvY2s7CisJLyogUGVyZm9ybSBvcGVyYXRpb24uICovCisJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfU1RFQUxfTE9DSywKKwljY3dfZGV2aWNlX3N0bGNrX3N0YXJ0KGNkZXYsICZkYXRhLCAmYnVmZmVyWzBdLCAmYnVmZmVyWzMyXSk7CisJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CisJLyogV2FpdCBmb3Igb3BlcmF0aW9uIHRvIGZpbmlzaC4gKi8KKwlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZkYXRhLmRvbmUpKSB7CisJCS8qIEdvdCBhIHNpZ25hbC4gKi8KKwkJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOworCQljY3dfcmVxdWVzdF9jYW5jZWwoY2Rldik7CisJCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkYXRhLmRvbmUpOwogCX0KLQljZGV2LT5wcml2YXRlLT5pcmIuc2Nzdy5jbWQuYWN0bCB8PSBTQ1NXX0FDVExfU1RBUlRfUEVORDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOwotCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLAotCQkgICBjZGV2LT5wcml2YXRlLT5pcmIuc2Nzdy5jbWQuYWN0bCA9PSAwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZShzY2gtPmxvY2ssIGZsYWdzKTsKLQljaW9fZGlzYWJsZV9zdWJjaGFubmVsKHNjaCk7IC8vRklYTUU6IHJldHVybiBjb2RlPwotCWlmICgoY2Rldi0+cHJpdmF0ZS0+aXJiLnNjc3cuY21kLmRzdGF0ICE9Ci0JICAgICAoREVWX1NUQVRfQ0hOX0VORHxERVZfU1RBVF9ERVZfRU5EKSkgfHwKLQkgICAgKGNkZXYtPnByaXZhdGUtPmlyYi5zY3N3LmNtZC5jc3RhdCAhPSAwKSkKLQkJcmV0ID0gLUVJTzsKLQkvKiBDbGVhciBpcmIuICovCi0JbWVtc2V0KCZjZGV2LT5wcml2YXRlLT5pcmIsIDAsIHNpemVvZihzdHJ1Y3QgaXJiKSk7CisJcmMgPSBkYXRhLnJjOworCS8qIENoZWNrIHJlc3VsdHMuICovCisJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOworCWNpb19kaXNhYmxlX3N1YmNoYW5uZWwoc2NoKTsKKwljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9CT1hFRDsKIG91dF91bmxvY2s6Ci0Ja2ZyZWUoYnVmKTsKLQlrZnJlZShidWYyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7CisJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CisJa2ZyZWUoYnVmZmVyKTsKKworCXJldHVybiByYzsKIH0KIAogdm9pZCAqY2N3X2RldmljZV9nZXRfY2hwX2Rlc2Moc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBjaHBfbm8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMKaW5kZXggZmM1Y2ExZC4uYWFkMTg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3BnaWQuYwpAQCAtMSw1OTQgKzEsNTYxIEBACiAvKgotICogZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jCisgKiAgQ0NXIGRldmljZSBQR0lEIGFuZCBwYXRoIHZlcmlmaWNhdGlvbiBJL08gaGFuZGxpbmcuCiAgKgotICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAotICoJCQkgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKLSAqCQkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQotICoKLSAqIFBhdGggR3JvdXAgSUQgZnVuY3Rpb25zLgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLDIwMDkKKyAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayA8Y29ybmVsaWEuaHVja0BkZS5pYm0uY29tPgorICoJCSBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CisgKgkJIFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KICNpbmNsdWRlIDxhc20vY2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KIAogI2luY2x1ZGUgImNpby5oIgogI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgotI2luY2x1ZGUgImNzcy5oIgogI2luY2x1ZGUgImRldmljZS5oIgotI2luY2x1ZGUgImlvYXNtLmgiCiAjaW5jbHVkZSAiaW9fc2NoLmgiCiAKLS8qCi0gKiBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgdG8gZGVjaWRlIHdoZXRoZXIgYW4KLSAqIG9wZXJhdGlvbiBzaG91bGQgYmUgdHJpZWQgYWdhaW4uCi0gKi8KLXN0YXRpYyBpbnQgX19jY3dfZGV2aWNlX3Nob3VsZF9yZXRyeSh1bmlvbiBzY3N3ICpzY3N3KQotewotCS8qIENDIGlzIG9ubHkgdmFsaWQgaWYgc3RhcnQgZnVuY3Rpb24gYml0IGlzIHNldC4gKi8KLQlpZiAoKHNjc3ctPmNtZC5mY3RsICYgU0NTV19GQ1RMX1NUQVJUX0ZVTkMpICYmIHNjc3ctPmNtZC5jYyA9PSAxKQotCQlyZXR1cm4gMTsKLQkvKiBObyBtb3JlIGFjdGl2aXR5LiBGb3Igc2Vuc2UgYW5kIHNldCBQR0lEIHdlIHN0dWJib3JubHkgdHJ5IGFnYWluLiAqLwotCWlmICghc2Nzdy0+Y21kLmFjdGwpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQorI2RlZmluZSBQR0lEX1JFVFJJRVMJMjU2CisjZGVmaW5lIFBHSURfVElNRU9VVAkoMTAgKiBIWikKIAogLyoKLSAqIFN0YXJ0IFNlbnNlIFBhdGggR3JvdXAgSUQgaGVscGVyIGZ1bmN0aW9uLiBVc2VkIGluIGNjd19kZXZpY2VfcmVjb2cKLSAqIGFuZCBjY3dfZGV2aWNlX3NlbnNlX3BnaWQuCisgKiBQcm9jZXNzIHBhdGggdmVyaWZpY2F0aW9uIGRhdGEgYW5kIHJlcG9ydCByZXN1bHQuCiAgKi8KLXN0YXRpYyBpbnQKLV9fY2N3X2RldmljZV9zZW5zZV9wZ2lkX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGNjdzEgKmNjdzsKLQlpbnQgcmV0OwotCWludCBpOwotCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQkvKiBSZXR1cm4gaWYgd2UgYWxyZWFkeSBjaGVja2VkIG9uIGFsbCBwYXRocy4gKi8KLQlpZiAoY2Rldi0+cHJpdmF0ZS0+aW1hc2sgPT0gMCkKLQkJcmV0dXJuIChzY2gtPmxwbSA9PSAwKSA/IC1FTk9ERVYgOiAtRUFDQ0VTOwotCWkgPSA4IC0gZmZzKGNkZXYtPnByaXZhdGUtPmltYXNrKTsKLQotCS8qIFNldHVwIHNlbnNlIHBhdGggZ3JvdXAgaWQgY2hhbm5lbCBwcm9ncmFtLiAqLwotCWNjdyA9IGNkZXYtPnByaXZhdGUtPmljY3dzOwotCWNjdy0+Y21kX2NvZGUgPSBDQ1dfQ01EX1NFTlNFX1BHSUQ7Ci0JY2N3LT5jb3VudCA9IHNpemVvZiAoc3RydWN0IHBnaWQpOwotCWNjdy0+ZmxhZ3MgPSBDQ1dfRkxBR19TTEk7Ci0KLQkvKiBSZXNldCBkZXZpY2Ugc3RhdHVzLiAqLwotCW1lbXNldCgmY2Rldi0+cHJpdmF0ZS0+aXJiLCAwLCBzaXplb2Yoc3RydWN0IGlyYikpOwotCS8qIFRyeSBvbiBldmVyeSBwYXRoLiAqLwotCXJldCA9IC1FTk9ERVY7Ci0Jd2hpbGUgKGNkZXYtPnByaXZhdGUtPmltYXNrICE9IDApIHsKLQkJLyogVHJ5IGV2ZXJ5IHBhdGggbXVsdGlwbGUgdGltZXMuICovCi0JCWNjdy0+Y2RhID0gKF9fdTMyKSBfX3BhICgmY2Rldi0+cHJpdmF0ZS0+cGdpZFtpXSk7Ci0JCWlmIChjZGV2LT5wcml2YXRlLT5pcmV0cnkgPiAwKSB7Ci0JCQljZGV2LT5wcml2YXRlLT5pcmV0cnktLTsKLQkJCS8qIFJlc2V0IGludGVybmFsIHJldHJ5IGluZGljYXRpb24uICovCi0JCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7Ci0JCQlyZXQgPSBjaW9fc3RhcnQgKHNjaCwgY2Rldi0+cHJpdmF0ZS0+aWNjd3MsIAotCQkJCQkgY2Rldi0+cHJpdmF0ZS0+aW1hc2spOwotCQkJLyogcmV0IGlzIDAsIC1FQlVTWSwgLUVBQ0NFUyBvciAtRU5PREVWICovCi0JCQlpZiAocmV0ICE9IC1FQUNDRVMpCi0JCQkJcmV0dXJuIHJldDsKLQkJCUNJT19NU0dfRVZFTlQoMywgIlNOSUQgLSBEZXZpY2UgJTA0eCBvbiBTdWJjaGFubmVsICIKLQkJCQkgICAgICAiMC4leC4lMDR4LCBscG0gJTAyWCwgYmVjYW1lICdub3QgIgotCQkJCSAgICAgICJvcGVyYXRpb25hbCdcbiIsCi0JCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAotCQkJCSAgICAgIHNjaC0+c2NoaWQuc3NpZCwKLQkJCQkgICAgICBzY2gtPnNjaGlkLnNjaF9ubywgY2Rldi0+cHJpdmF0ZS0+aW1hc2spOwotCi0JCX0KLQkJY2Rldi0+cHJpdmF0ZS0+aW1hc2sgPj49IDE7Ci0JCWNkZXYtPnByaXZhdGUtPmlyZXRyeSA9IDU7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1jY3dfZGV2aWNlX3NlbnNlX3BnaWRfc3RhcnQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCi17Ci0JaW50IHJldDsKLQotCS8qIFNldCBhIHRpbWVvdXQgb2YgNjBzICovCi0JY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCA2MCpIWik7Ci0KLQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9TRU5TRV9QR0lEOwotCWNkZXYtPnByaXZhdGUtPmltYXNrID0gMHg4MDsKLQljZGV2LT5wcml2YXRlLT5pcmV0cnkgPSA1OwotCW1lbXNldCAoJmNkZXYtPnByaXZhdGUtPnBnaWQsIDAsIHNpemVvZiAoY2Rldi0+cHJpdmF0ZS0+cGdpZCkpOwotCXJldCA9IF9fY2N3X2RldmljZV9zZW5zZV9wZ2lkX3N0YXJ0KGNkZXYpOwotCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKLQkJY2N3X2RldmljZV9zZW5zZV9wZ2lkX2RvbmUoY2RldiwgcmV0KTsKLX0KLQotLyoKLSAqIENhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IHRvIGNoZWNrIGlmIGEgdmFsaWQgYW5zd2VyCi0gKiB0byBTZW5zZSBQYXRoIEdyb3VwIElEIHdhcyByZWNlaXZlZC4KLSAqLwotc3RhdGljIGludAotX19jY3dfZGV2aWNlX2NoZWNrX3NlbnNlX3BnaWQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCi17Ci0Jc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKLQlzdHJ1Y3QgaXJiICppcmI7Ci0JaW50IGk7Ci0KLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCWlyYiA9ICZjZGV2LT5wcml2YXRlLT5pcmI7Ci0JaWYgKGlyYi0+c2Nzdy5jbWQuZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKSB7Ci0JCS8qIFJldHJ5IFNlbnNlIFBHSUQgaWYgcmVxdWVzdGVkLiAqLwotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkpIHsKLQkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCXJldHVybiAtRVRJTUU7Ci0JfQotCWlmIChpcmItPmVzdy5lc3cwLmVydy5jb25zICYmCi0JICAgIChpcmItPmVjd1swXSYoU05TMF9DTURfUkVKRUNUfFNOUzBfSU5URVJWRU5USU9OX1JFUSkpKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHRoZSBTZW5zZSBQYXRoIEdyb3VwIElECi0JCSAqICBjb21tYW5kIGZ1cnRoZXIgcmV0cmllcyB3b3VsZG4ndCBoZWxwIC4uLgotCQkgKi8KLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLQlpZiAoaXJiLT5lc3cuZXN3MC5lcncuY29ucykgewotCQlDSU9fTVNHX0VWRU5UKDIsICJTTklEIC0gZGV2aWNlIDAuJXguJTA0eCwgdW5pdCBjaGVjaywgIgotCQkJICAgICAgImxwdW0gJTAyWCwgY250ICUwMmQsIHNucyA6ICIKLQkJCSAgICAgICIlMDJYJTAyWCUwMlglMDJYICUwMlglMDJYJTAyWCUwMlggLi4uXG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sCi0JCQkgICAgICBpcmItPmVzdy5lc3cwLnN1YmxvZy5scHVtLAotCQkJICAgICAgaXJiLT5lc3cuZXN3MC5lcncuc2NudCwKLQkJCSAgICAgIGlyYi0+ZWN3WzBdLCBpcmItPmVjd1sxXSwKLQkJCSAgICAgIGlyYi0+ZWN3WzJdLCBpcmItPmVjd1szXSwKLQkJCSAgICAgIGlyYi0+ZWN3WzRdLCBpcmItPmVjd1s1XSwKLQkJCSAgICAgIGlyYi0+ZWN3WzZdLCBpcmItPmVjd1s3XSk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQlpZiAoaXJiLT5zY3N3LmNtZC5jYyA9PSAzKSB7Ci0JCXU4IGxwbTsKLQotCQlscG0gPSB0b19pb19wcml2YXRlKHNjaCktPm9yYi5jbWQubHBtOwotCQlDSU9fTVNHX0VWRU5UKDMsICJTTklEIC0gRGV2aWNlICUwNHggb24gU3ViY2hhbm5lbCAwLiV4LiUwNHgsIgotCQkJICAgICAgIiBscG0gJTAyWCwgYmVjYW1lICdub3Qgb3BlcmF0aW9uYWwnXG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCi0JCQkgICAgICBzY2gtPnNjaGlkLnNjaF9ubywgbHBtKTsKLQkJcmV0dXJuIC1FQUNDRVM7Ci0JfQotCWkgPSA4IC0gZmZzKGNkZXYtPnByaXZhdGUtPmltYXNrKTsKLQlpZiAoY2Rldi0+cHJpdmF0ZS0+cGdpZFtpXS5pbmYucHMuc3RhdGUyID09IFNOSURfU1RBVEUyX1JFU1ZEX0VMU0UpIHsKLQkJQ0lPX01TR19FVkVOVCgyLCAiU05JRCAtIERldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgMC4leC4lMDR4ICIKLQkJCSAgICAgICJpcyByZXNlcnZlZCBieSBzb21lb25lIGVsc2VcbiIsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKLQkJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vKTsKLQkJcmV0dXJuIC1FVVNFUlM7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogR290IGludGVycnVwdCBmb3IgU2Vuc2UgUGF0aCBHcm91cCBJRC4KLSAqLwotdm9pZAotY2N3X2RldmljZV9zZW5zZV9wZ2lkX2lycShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGlyYiAqaXJiOwotCWludCByZXQ7Ci0KLQlpcmIgPSAoc3RydWN0IGlyYiAqKSBfX0xDX0lSQjsKLQotCWlmIChpcmItPnNjc3cuY21kLnN0Y3RsID09Ci0JICAgIChTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EIHwgU0NTV19TVENUTF9BTEVSVF9TVEFUVVMpKSB7Ci0JCWlmIChfX2Njd19kZXZpY2Vfc2hvdWxkX3JldHJ5KCZpcmItPnNjc3cpKSB7Ci0JCQlyZXQgPSBfX2Njd19kZXZpY2Vfc2Vuc2VfcGdpZF9zdGFydChjZGV2KTsKLQkJCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKLQkJCQljY3dfZGV2aWNlX3NlbnNlX3BnaWRfZG9uZShjZGV2LCByZXQpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGNjd19kZXZpY2VfYWNjdW11bGF0ZV9hbmRfc2Vuc2UoY2RldiwgaXJiKSAhPSAwKQotCQlyZXR1cm47Ci0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQlyZXQgPSBfX2Njd19kZXZpY2VfY2hlY2tfc2Vuc2VfcGdpZChjZGV2KTsKLQltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKLQlzd2l0Y2ggKHJldCkgewotCS8qIDAsIC1FVElNRSwgLUVPUE5PVFNVUFAsIC1FQUdBSU4sIC1FQUNDRVMgb3IgLUVVU0VSUyAqLwotCWNhc2UgLUVPUE5PVFNVUFA6CS8qIFNlbnNlIFBhdGggR3JvdXAgSUQgbm90IHN1cHBvcnRlZCAqLwotCQljY3dfZGV2aWNlX3NlbnNlX3BnaWRfZG9uZShjZGV2LCAtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCWNhc2UgLUVUSU1FOgkJLyogU2Vuc2UgcGF0aCBncm91cCBpZCBzdG9wcGVkIGJ5IHRpbWVvdXQuICovCi0JCWNjd19kZXZpY2Vfc2Vuc2VfcGdpZF9kb25lKGNkZXYsIC1FVElNRSk7Ci0JCWJyZWFrOwotCWNhc2UgLUVBQ0NFUzoJCS8qIGNoYW5uZWwgaXMgbm90IG9wZXJhdGlvbmFsLiAqLwotCQlzY2gtPmxwbSAmPSB+Y2Rldi0+cHJpdmF0ZS0+aW1hc2s7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gKi8KLQljYXNlIDA6CQkJLyogU2Vuc2UgUGF0aCBHcm91cCBJRCBzdWNjZXNzZnVsLiAqLwotCQljZGV2LT5wcml2YXRlLT5pbWFzayA+Pj0gMTsKLQkJY2Rldi0+cHJpdmF0ZS0+aXJldHJ5ID0gNTsKLQkJLyogRmFsbCB0aHJvdWdoLiAqLwotCWNhc2UgLUVBR0FJTjoJCS8qIFRyeSBhZ2Fpbi4gKi8KLQkJcmV0ID0gX19jY3dfZGV2aWNlX3NlbnNlX3BnaWRfc3RhcnQoY2Rldik7Ci0JCWlmIChyZXQgIT0gMCAmJiByZXQgIT0gLUVCVVNZKQotCQkJY2N3X2RldmljZV9zZW5zZV9wZ2lkX2RvbmUoY2RldiwgcmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSAtRVVTRVJTOgkJLyogZGV2aWNlIGlzIHJlc2VydmVkIGZvciBzb21lb25lIGVsc2UuICovCi0JCWNjd19kZXZpY2Vfc2Vuc2VfcGdpZF9kb25lKGNkZXYsIC1FVVNFUlMpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiBQYXRoIEdyb3VwIElEIGhlbHBlciBmdW5jdGlvbi4KLSAqLwotc3RhdGljIGludAotX19jY3dfZGV2aWNlX2RvX3BnaWQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIF9fdTggZnVuYykKLXsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCXN0cnVjdCBjY3cxICpjY3c7Ci0JaW50IHJldDsKLQotCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0KLQkvKiBTZXR1cCBzZW5zZSBwYXRoIGdyb3VwIGlkIGNoYW5uZWwgcHJvZ3JhbS4gKi8KLQljZGV2LT5wcml2YXRlLT5wZ2lkWzBdLmluZi5mYyA9IGZ1bmM7Ci0JY2N3ID0gY2Rldi0+cHJpdmF0ZS0+aWNjd3M7Ci0JaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLnBnaWRfc2luZ2xlKQotCQljZGV2LT5wcml2YXRlLT5wZ2lkWzBdLmluZi5mYyB8PSBTUElEX0ZVTkNfU0lOR0xFX1BBVEg7Ci0JZWxzZQotCQljZGV2LT5wcml2YXRlLT5wZ2lkWzBdLmluZi5mYyB8PSBTUElEX0ZVTkNfTVVMVElfUEFUSDsKLQljY3ctPmNtZF9jb2RlID0gQ0NXX0NNRF9TRVRfUEdJRDsKLQljY3ctPmNkYSA9IChfX3UzMikgX19wYSAoJmNkZXYtPnByaXZhdGUtPnBnaWRbMF0pOwotCWNjdy0+Y291bnQgPSBzaXplb2YgKHN0cnVjdCBwZ2lkKTsKLQljY3ctPmZsYWdzID0gQ0NXX0ZMQUdfU0xJOwotCi0JLyogUmVzZXQgZGV2aWNlIHN0YXR1cy4gKi8KLQltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKLQotCS8qIFRyeSBtdWx0aXBsZSB0aW1lcy4gKi8KLQlyZXQgPSAtRUFDQ0VTOwotCWlmIChjZGV2LT5wcml2YXRlLT5pcmV0cnkgPiAwKSB7Ci0JCWNkZXYtPnByaXZhdGUtPmlyZXRyeS0tOwotCQkvKiBSZXNldCBpbnRlcm5hbCByZXRyeSBpbmRpY2F0aW9uLiAqLwotCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7Ci0JCXJldCA9IGNpb19zdGFydCAoc2NoLCBjZGV2LT5wcml2YXRlLT5pY2N3cywKLQkJCQkgY2Rldi0+cHJpdmF0ZS0+aW1hc2spOwotCQkvKiBXZSBleHBlY3QgYW4gaW50ZXJydXB0IGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBidXN5Ci0JCSAqIGluZGljYXRpb24uICovCi0JCWlmICgocmV0ID09IDApIHx8IChyZXQgPT0gLUVCVVNZKSkKLQkJCXJldHVybiByZXQ7Ci0JfQotCS8qIFBHSUQgY29tbWFuZCBmYWlsZWQgb24gdGhpcyBwYXRoLiAqLwotCUNJT19NU0dfRVZFTlQoMywgIlNQSUQgLSBEZXZpY2UgJTA0eCBvbiBTdWJjaGFubmVsICIKLQkJICAgICAgIjAuJXguJTA0eCwgbHBtICUwMlgsIGJlY2FtZSAnbm90IG9wZXJhdGlvbmFsJ1xuIiwKLQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCi0JCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vLCBjZGV2LT5wcml2YXRlLT5pbWFzayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEhlbHBlciBmdW5jdGlvbiB0byBzZW5kIGEgbm9wIGNjdyBkb3duIGEgcGF0aC4KLSAqLwotc3RhdGljIGludCBfX2Njd19kZXZpY2VfZG9fbm9wKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGNjdzEgKmNjdzsKLQlpbnQgcmV0OwotCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQotCS8qIFNldHVwIG5vcCBjaGFubmVsIHByb2dyYW0uICovCi0JY2N3ID0gY2Rldi0+cHJpdmF0ZS0+aWNjd3M7Ci0JY2N3LT5jbWRfY29kZSA9IENDV19DTURfTk9PUDsKLQljY3ctPmNkYSA9IDA7Ci0JY2N3LT5jb3VudCA9IDA7Ci0JY2N3LT5mbGFncyA9IENDV19GTEFHX1NMSTsKLQotCS8qIFJlc2V0IGRldmljZSBzdGF0dXMuICovCi0JbWVtc2V0KCZjZGV2LT5wcml2YXRlLT5pcmIsIDAsIHNpemVvZihzdHJ1Y3QgaXJiKSk7Ci0KLQkvKiBUcnkgbXVsdGlwbGUgdGltZXMuICovCi0JcmV0ID0gLUVBQ0NFUzsKLQlpZiAoY2Rldi0+cHJpdmF0ZS0+aXJldHJ5ID4gMCkgewotCQljZGV2LT5wcml2YXRlLT5pcmV0cnktLTsKLQkJLyogUmVzZXQgaW50ZXJuYWwgcmV0cnkgaW5kaWNhdGlvbi4gKi8KLQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOwotCQlyZXQgPSBjaW9fc3RhcnQgKHNjaCwgY2Rldi0+cHJpdmF0ZS0+aWNjd3MsCi0JCQkJIGNkZXYtPnByaXZhdGUtPmltYXNrKTsKLQkJLyogV2UgZXhwZWN0IGFuIGludGVycnVwdCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgYnVzeQotCQkgKiBpbmRpY2F0aW9uLiAqLwotCQlpZiAoKHJldCA9PSAwKSB8fCAocmV0ID09IC1FQlVTWSkpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQkvKiBub3AgY29tbWFuZCBmYWlsZWQgb24gdGhpcyBwYXRoLiAqLwotCUNJT19NU0dfRVZFTlQoMywgIk5PUCAtIERldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgIgotCQkgICAgICAiMC4leC4lMDR4LCBscG0gJTAyWCwgYmVjYW1lICdub3Qgb3BlcmF0aW9uYWwnXG4iLAotCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKLQkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIGNkZXYtPnByaXZhdGUtPmltYXNrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gKiBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCB0byBjaGVjayBpZiBhIHZhbGlkIGFuc3dlcgotICogdG8gU2V0IFBhdGggR3JvdXAgSUQgd2FzIHJlY2VpdmVkLgotICovCi1zdGF0aWMgaW50Ci1fX2Njd19kZXZpY2VfY2hlY2tfcGdpZChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKLXsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCXN0cnVjdCBpcmIgKmlyYjsKLQotCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0JaXJiID0gJmNkZXYtPnByaXZhdGUtPmlyYjsKLQlpZiAoaXJiLT5zY3N3LmNtZC5mY3RsICYgKFNDU1dfRkNUTF9IQUxUX0ZVTkMgfCBTQ1NXX0ZDVExfQ0xFQVJfRlVOQykpIHsKLQkJLyogUmV0cnkgU2V0IFBHSUQgaWYgcmVxdWVzdGVkLiAqLwotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkpIHsKLQkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCXJldHVybiAtRVRJTUU7Ci0JfQotCWlmIChpcmItPmVzdy5lc3cwLmVydy5jb25zKSB7Ci0JCWlmIChpcmItPmVjd1swXSAmIFNOUzBfQ01EX1JFSkVDVCkKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJLyogSG1tLCB3aGF0ZXZlciBoYXBwZW5lZCwgdHJ5IGFnYWluLiAqLwotCQlDSU9fTVNHX0VWRU5UKDIsICJTUElEIC0gZGV2aWNlIDAuJXguJTA0eCwgdW5pdCBjaGVjaywgIgotCQkJICAgICAgImNudCAlMDJkLCAiCi0JCQkgICAgICAic25zIDogJTAyWCUwMlglMDJYJTAyWCAlMDJYJTAyWCUwMlglMDJYIC4uLlxuIiwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAotCQkJICAgICAgaXJiLT5lc3cuZXN3MC5lcncuc2NudCwKLQkJCSAgICAgIGlyYi0+ZWN3WzBdLCBpcmItPmVjd1sxXSwKLQkJCSAgICAgIGlyYi0+ZWN3WzJdLCBpcmItPmVjd1szXSwKLQkJCSAgICAgIGlyYi0+ZWN3WzRdLCBpcmItPmVjd1s1XSwKLQkJCSAgICAgIGlyYi0+ZWN3WzZdLCBpcmItPmVjd1s3XSk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQlpZiAoaXJiLT5zY3N3LmNtZC5jYyA9PSAzKSB7Ci0JCUNJT19NU0dfRVZFTlQoMywgIlNQSUQgLSBEZXZpY2UgJTA0eCBvbiBTdWJjaGFubmVsIDAuJXguJTA0eCwiCi0JCQkgICAgICAiIGxwbSAlMDJYLCBiZWNhbWUgJ25vdCBvcGVyYXRpb25hbCdcbiIsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKLQkJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vLCBjZGV2LT5wcml2YXRlLT5pbWFzayk7Ci0JCXJldHVybiAtRUFDQ0VTOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IHRvIGNoZWNrIHRoZSBwYXRoIHN0YXR1cyBhZnRlciBhIG5vcCBoYXMKLSAqIGJlZW4gc2VuZC4KLSAqLwotc3RhdGljIGludCBfX2Njd19kZXZpY2VfY2hlY2tfbm9wKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGlyYiAqaXJiOwotCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQlpcmIgPSAmY2Rldi0+cHJpdmF0ZS0+aXJiOwotCWlmIChpcmItPnNjc3cuY21kLmZjdGwgJiAoU0NTV19GQ1RMX0hBTFRfRlVOQyB8IFNDU1dfRkNUTF9DTEVBUl9GVU5DKSkgewotCQkvKiBSZXRyeSBOT1AgaWYgcmVxdWVzdGVkLiAqLwotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkpIHsKLQkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCXJldHVybiAtRVRJTUU7Ci0JfQotCWlmIChpcmItPnNjc3cuY21kLmNjID09IDMpIHsKLQkJQ0lPX01TR19FVkVOVCgzLCAiTk9QIC0gRGV2aWNlICUwNHggb24gU3ViY2hhbm5lbCAwLiV4LiUwNHgsIgotCQkJICAgICAgIiBscG0gJTAyWCwgYmVjYW1lICdub3Qgb3BlcmF0aW9uYWwnXG4iLAotCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNzaWQsCi0JCQkgICAgICBzY2gtPnNjaGlkLnNjaF9ubywgY2Rldi0+cHJpdmF0ZS0+aW1hc2spOwotCQlyZXR1cm4gLUVBQ0NFUzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1fX2Njd19kZXZpY2VfdmVyaWZ5X3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JX191OCBmdW5jOwotCWludCByZXQ7Ci0KLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCS8qIFJlcGVhdCBmb3IgYWxsIHBhdGhzLiAqLwotCWZvciAoOyBjZGV2LT5wcml2YXRlLT5pbWFzazsgY2Rldi0+cHJpdmF0ZS0+aW1hc2sgPj49IDEsCi0JCQkJICAgICBjZGV2LT5wcml2YXRlLT5pcmV0cnkgPSA1KSB7Ci0JCWlmICgoY2Rldi0+cHJpdmF0ZS0+aW1hc2sgJiBzY2gtPnNjaGliLnBtY3cucGFtKSA9PSAwKQotCQkJLyogUGF0aCBub3QgYXZhaWxhYmxlLCB0cnkgbmV4dC4gKi8KLQkJCWNvbnRpbnVlOwotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5wZ3JvdXApIHsKLQkJCWlmIChzY2gtPm9wbSAmIGNkZXYtPnByaXZhdGUtPmltYXNrKQotCQkJCWZ1bmMgPSBTUElEX0ZVTkNfRVNUQUJMSVNIOwotCQkJZWxzZQotCQkJCWZ1bmMgPSBTUElEX0ZVTkNfUkVTSUdOOwotCQkJcmV0ID0gX19jY3dfZGV2aWNlX2RvX3BnaWQoY2RldiwgZnVuYyk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gX19jY3dfZGV2aWNlX2RvX25vcChjZGV2KTsKLQkJLyogV2UgZXhwZWN0IGFuIGludGVycnVwdCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgYnVzeQotCQkgKiBpbmRpY2F0aW9uLiAqLwotCQlpZiAocmV0ID09IDAgfHwgcmV0ID09IC1FQlVTWSkKLQkJCXJldHVybjsKLQkJLyogUGVybWFuZW50IHBhdGggZmFpbHVyZSwgdHJ5IG5leHQuICovCi0JfQotCS8qIERvbmUgd2l0aCBhbGwgcGF0aHMuICovCi0JY2N3X2RldmljZV92ZXJpZnlfZG9uZShjZGV2LCAoc2NoLT52cG0gIT0gMCkgPyAwIDogLUVOT0RFVik7Ci19Ci0JCQotLyoKLSAqIEdvdCBpbnRlcnJ1cHQgZm9yIFNldCBQYXRoIEdyb3VwIElELgotICovCi12b2lkCi1jY3dfZGV2aWNlX3ZlcmlmeV9pcnEoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gZGV2X2V2ZW50IGRldl9ldmVudCkKLXsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCXN0cnVjdCBpcmIgKmlyYjsKLQlpbnQgcmV0OwotCi0JaXJiID0gKHN0cnVjdCBpcmIgKikgX19MQ19JUkI7Ci0KLQlpZiAoaXJiLT5zY3N3LmNtZC5zdGN0bCA9PQotCSAgICAoU0NTV19TVENUTF9TVEFUVVNfUEVORCB8IFNDU1dfU1RDVExfQUxFUlRfU1RBVFVTKSkgewotCQlpZiAoX19jY3dfZGV2aWNlX3Nob3VsZF9yZXRyeSgmaXJiLT5zY3N3KSkKLQkJCV9fY2N3X2RldmljZV92ZXJpZnlfc3RhcnQoY2Rldik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGNjd19kZXZpY2VfYWNjdW11bGF0ZV9hbmRfc2Vuc2UoY2RldiwgaXJiKSAhPSAwKQotCQlyZXR1cm47Ci0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQlpZiAoY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5wZ3JvdXApCi0JCXJldCA9IF9fY2N3X2RldmljZV9jaGVja19wZ2lkKGNkZXYpOwotCWVsc2UKLQkJcmV0ID0gX19jY3dfZGV2aWNlX2NoZWNrX25vcChjZGV2KTsKLQltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKLQotCXN3aXRjaCAocmV0KSB7Ci0JLyogMCwgLUVUSU1FLCAtRUFHQUlOLCAtRU9QTk9UU1VQUCBvciAtRUFDQ0VTICovCi0JY2FzZSAwOgotCQkvKiBQYXRoIHZlcmlmaWNhdGlvbiBjY3cgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LCB1cGRhdGUgbHBtLiAqLwotCQlzY2gtPnZwbSB8PSBzY2gtPm9wbSAmIGNkZXYtPnByaXZhdGUtPmltYXNrOwotCQkvKiBHbyBvbiB3aXRoIG5leHQgcGF0aC4gKi8KLQkJY2Rldi0+cHJpdmF0ZS0+aW1hc2sgPj49IDE7Ci0JCWNkZXYtPnByaXZhdGUtPmlyZXRyeSA9IDU7Ci0JCV9fY2N3X2RldmljZV92ZXJpZnlfc3RhcnQoY2Rldik7Ci0JCWJyZWFrOwotCWNhc2UgLUVPUE5PVFNVUFA6Ci0JCS8qCi0JCSAqIE9uZSBvZiB0aG9zZSBzdHJhbmdlIGRldmljZXMgd2hpY2ggY2xhaW0gdG8gYmUgYWJsZQotCQkgKiB0byBkbyBtdWx0aXBhdGhpbmcgYnV0IG5vdCBmb3IgU2V0IFBhdGggR3JvdXAgSUQuCi0JCSAqLwotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucGdpZF9zaW5nbGUpCi0JCQljZGV2LT5wcml2YXRlLT5vcHRpb25zLnBncm91cCA9IDA7Ci0JCWVsc2UKLQkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLnBnaWRfc2luZ2xlID0gMTsKLQkJLyogUmV0cnkgKi8KLQkJc2NoLT52cG0gPSAwOwotCQljZGV2LT5wcml2YXRlLT5pbWFzayA9IDB4ODA7Ci0JCWNkZXYtPnByaXZhdGUtPmlyZXRyeSA9IDU7Ci0JCS8qIGZhbGwgdGhyb3VnaC4gKi8KLQljYXNlIC1FQUdBSU46CQkvKiBUcnkgYWdhaW4uICovCi0JCV9fY2N3X2RldmljZV92ZXJpZnlfc3RhcnQoY2Rldik7Ci0JCWJyZWFrOwotCWNhc2UgLUVUSU1FOgkJLyogU2V0IHBhdGggZ3JvdXAgaWQgc3RvcHBlZCBieSB0aW1lb3V0LiAqLwotCQljY3dfZGV2aWNlX3ZlcmlmeV9kb25lKGNkZXYsIC1FVElNRSk7Ci0JCWJyZWFrOwotCWNhc2UgLUVBQ0NFUzoJCS8qIGNoYW5uZWwgaXMgbm90IG9wZXJhdGlvbmFsLiAqLwotCQljZGV2LT5wcml2YXRlLT5pbWFzayA+Pj0gMTsKLQkJY2Rldi0+cHJpdmF0ZS0+aXJldHJ5ID0gNTsKLQkJX19jY3dfZGV2aWNlX3ZlcmlmeV9zdGFydChjZGV2KTsKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkCi1jY3dfZGV2aWNlX3ZlcmlmeV9zdGFydChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3N0YXRpYyB2b2lkIHZlcmlmeV9kb25lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBpbnQgcmMpCiB7CiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGNjd19kZXZfaWQgKmlkID0gJmNkZXYtPnByaXZhdGUtPmRldl9pZDsKKwlpbnQgbXBhdGggPSBjZGV2LT5wcml2YXRlLT5mbGFncy5tcGF0aDsKKwlpbnQgcGdyb3VwID0gY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucGdyb3VwOwogCi0JY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucGdpZF9zaW5nbGUgPSAwOwotCWNkZXYtPnByaXZhdGUtPmltYXNrID0gMHg4MDsKLQljZGV2LT5wcml2YXRlLT5pcmV0cnkgPSA1OwotCi0JLyogU3RhcnQgd2l0aCBlbXB0eSB2cG0uICovCi0Jc2NoLT52cG0gPSAwOwotCi0JLyogR2V0IGN1cnJlbnQgcGFtLiAqLwotCWlmIChjaW9fdXBkYXRlX3NjaGliKHNjaCkpIHsKLQkJY2N3X2RldmljZV92ZXJpZnlfZG9uZShjZGV2LCAtRU5PREVWKTsKLQkJcmV0dXJuOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJLyogRW5zdXJlIGNvbnNpc3RlbnQgbXVsdGlwYXRoaW5nIHN0YXRlIGF0IGRldmljZSBhbmQgY2hhbm5lbC4gKi8KKwlpZiAoc2NoLT5jb25maWcubXAgIT0gbXBhdGgpIHsKKwkJc2NoLT5jb25maWcubXAgPSBtcGF0aDsKKwkJcmMgPSBjaW9fY29tbWl0X2NvbmZpZyhzY2gpOwogCX0KLQkvKiBBZnRlciA2MHMgcGF0aCB2ZXJpZmljYXRpb24gaXMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZC4gKi8KLQljY3dfZGV2aWNlX3NldF90aW1lb3V0KGNkZXYsIDYwKkhaKTsKLQlfX2Njd19kZXZpY2VfdmVyaWZ5X3N0YXJ0KGNkZXYpOwotfQotCi1zdGF0aWMgdm9pZAotX19jY3dfZGV2aWNlX2Rpc2JhbmRfc3RhcnQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCi17Ci0Jc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKLQlpbnQgcmV0OwotCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQl3aGlsZSAoY2Rldi0+cHJpdmF0ZS0+aW1hc2sgIT0gMCkgewotCQlpZiAoc2NoLT5scG0gJiBjZGV2LT5wcml2YXRlLT5pbWFzaykgewotCQkJcmV0ID0gX19jY3dfZGV2aWNlX2RvX3BnaWQoY2RldiwgU1BJRF9GVU5DX0RJU0JBTkQpOwotCQkJaWYgKHJldCA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCQljZGV2LT5wcml2YXRlLT5pcmV0cnkgPSA1OwotCQljZGV2LT5wcml2YXRlLT5pbWFzayA+Pj0gMTsKLQl9Ci0JY2N3X2RldmljZV9kaXNiYW5kX2RvbmUoY2RldiwgKHNjaC0+bHBtICE9IDApID8gMCA6IC1FTk9ERVYpOworb3V0OgorCUNJT19NU0dfRVZFTlQoMiwgInZyZnk6IGRldmljZSAwLiV4LiUwNHg6IHJjPSVkIHBncm91cD0lZCBtcGF0aD0lZCAiCisJCQkgInZwbT0lMDJ4XG4iLCBpZC0+c3NpZCwgaWQtPmRldm5vLCByYywgcGdyb3VwLCBtcGF0aCwKKwkJCSBzY2gtPnZwbSk7CisJY2N3X2RldmljZV92ZXJpZnlfZG9uZShjZGV2LCByYyk7CiB9CiAKIC8qCi0gKiBHb3QgaW50ZXJydXB0IGZvciBVbnNldCBQYXRoIEdyb3VwIElELgorICogQ3JlYXRlIGNoYW5uZWwgcHJvZ3JhbSB0byBwZXJmb3JtIGEgTk9PUC4KICAqLwotdm9pZAotY2N3X2RldmljZV9kaXNiYW5kX2lycShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQorc3RhdGljIHZvaWQgbm9wX2J1aWxkX2NwKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGlyYiAqaXJiOwotCWludCByZXQ7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCXN0cnVjdCBjY3cxICpjcCA9IGNkZXYtPnByaXZhdGUtPmljY3dzOwogCi0JaXJiID0gKHN0cnVjdCBpcmIgKikgX19MQ19JUkI7CisJY3AtPmNtZF9jb2RlCT0gQ0NXX0NNRF9OT09QOworCWNwLT5jZGEJCT0gMDsKKwljcC0+Y291bnQJPSAwOworCWNwLT5mbGFncwk9IENDV19GTEFHX1NMSTsKKwlyZXEtPmNwCQk9IGNwOworfQogCi0JaWYgKGlyYi0+c2Nzdy5jbWQuc3RjdGwgPT0KLQkgICAgKFNDU1dfU1RDVExfU1RBVFVTX1BFTkQgfCBTQ1NXX1NUQ1RMX0FMRVJUX1NUQVRVUykpIHsKLQkJaWYgKF9fY2N3X2RldmljZV9zaG91bGRfcmV0cnkoJmlyYi0+c2NzdykpCi0JCQlfX2Njd19kZXZpY2VfZGlzYmFuZF9zdGFydChjZGV2KTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoY2N3X2RldmljZV9hY2N1bXVsYXRlX2FuZF9zZW5zZShjZGV2LCBpcmIpICE9IDApCi0JCXJldHVybjsKLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCXJldCA9IF9fY2N3X2RldmljZV9jaGVja19wZ2lkKGNkZXYpOwotCW1lbXNldCgmY2Rldi0+cHJpdmF0ZS0+aXJiLCAwLCBzaXplb2Yoc3RydWN0IGlyYikpOwotCXN3aXRjaCAocmV0KSB7Ci0JLyogMCwgLUVUSU1FLCAtRUFHQUlOLCAtRU9QTk9UU1VQUCBvciAtRUFDQ0VTICovCi0JY2FzZSAwOgkJCS8qIGRpc2JhbmQgc3VjY2Vzc2Z1bC4gKi8KLQkJY2N3X2RldmljZV9kaXNiYW5kX2RvbmUoY2RldiwgcmV0KTsKKy8qCisgKiBQZXJmb3JtIE5PT1Agb24gYSBzaW5nbGUgcGF0aC4KKyAqLworc3RhdGljIHZvaWQgbm9wX2RvKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKKworCS8qIEFkanVzdCBscG0uICovCisJcmVxLT5scG0gPSBscG1fYWRqdXN0KHJlcS0+bHBtLCBzY2gtPnNjaGliLnBtY3cucGFtICYgc2NoLT5vcG0pOworCWlmICghcmVxLT5scG0pCisJCWdvdG8gb3V0X25vcGF0aDsKKwlub3BfYnVpbGRfY3AoY2Rldik7CisJY2N3X3JlcXVlc3Rfc3RhcnQoY2Rldik7CisJcmV0dXJuOworCitvdXRfbm9wYXRoOgorCXZlcmlmeV9kb25lKGNkZXYsIHNjaC0+dnBtID8gMCA6IC1FQUNDRVMpOworfQorCisvKgorICogQWRqdXN0IE5PT1AgSS9PIHN0YXR1cy4KKyAqLworc3RhdGljIGVudW0gaW9fc3RhdHVzIG5vcF9maWx0ZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKmRhdGEsCisJCQkJIHN0cnVjdCBpcmIgKmlyYiwgZW51bSBpb19zdGF0dXMgc3RhdHVzKQoreworCS8qIE9ubHkgc3ViY2hhbm5lbCBzdGF0dXMgbWlnaHQgaW5kaWNhdGUgYSBwYXRoIGVycm9yLiAqLworCWlmIChzdGF0dXMgPT0gSU9fU1RBVFVTX0VSUk9SICYmIGlyYi0+c2Nzdy5jbWQuY3N0YXQgPT0gMCkKKwkJcmV0dXJuIElPX0RPTkU7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFByb2Nlc3MgTk9PUCByZXF1ZXN0IHJlc3VsdCBmb3IgYSBzaW5nbGUgcGF0aC4KKyAqLworc3RhdGljIHZvaWQgbm9wX2NhbGxiYWNrKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICpkYXRhLCBpbnQgcmMpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCisJaWYgKHJjID09IDApCisJCXNjaC0+dnBtIHw9IHJlcS0+bHBtOworCWVsc2UgaWYgKHJjICE9IC1FQUNDRVMpCisJCWdvdG8gZXJyOworCXJlcS0+bHBtID4+PSAxOworCW5vcF9kbyhjZGV2KTsKKwlyZXR1cm47CisKK2VycjoKKwl2ZXJpZnlfZG9uZShjZGV2LCByYyk7Cit9CisKKy8qCisgKiBDcmVhdGUgY2hhbm5lbCBwcm9ncmFtIHRvIHBlcmZvcm0gU0VUIFBHSUQgb24gYSBzaW5nbGUgcGF0aC4KKyAqLworc3RhdGljIHZvaWQgc3BpZF9idWlsZF9jcChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgdTggZm4pCit7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCXN0cnVjdCBjY3cxICpjcCA9IGNkZXYtPnByaXZhdGUtPmljY3dzOworCWludCBpID0gOCAtIGZmcyhyZXEtPmxwbSk7CisJc3RydWN0IHBnaWQgKnBnaWQgPSAmY2Rldi0+cHJpdmF0ZS0+cGdpZFtpXTsKKworCXBnaWQtPmluZi5mYwk9IGZuOworCWNwLT5jbWRfY29kZQk9IENDV19DTURfU0VUX1BHSUQ7CisJY3AtPmNkYQkJPSAodTMyKSAoYWRkcl90KSBwZ2lkOworCWNwLT5jb3VudAk9IHNpemVvZigqcGdpZCk7CisJY3AtPmZsYWdzCT0gQ0NXX0ZMQUdfU0xJOworCXJlcS0+Y3AJCT0gY3A7Cit9CisKKy8qCisgKiBQZXJmb3JtIGVzdGFibGlzaC9yZXNpZ24gU0VUIFBHSUQgb24gYSBzaW5nbGUgcGF0aC4KKyAqLworc3RhdGljIHZvaWQgc3BpZF9kbyhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgY2N3X3JlcXVlc3QgKnJlcSA9ICZjZGV2LT5wcml2YXRlLT5yZXE7CisJdTggZm47CisKKwkvKiBVc2UgbmV4dCBhdmFpbGFibGUgcGF0aCB0aGF0IGlzIG5vdCBhbHJlYWR5IGluIGNvcnJlY3Qgc3RhdGUuICovCisJcmVxLT5scG0gPSBscG1fYWRqdXN0KHJlcS0+bHBtLCBzY2gtPnNjaGliLnBtY3cucGFtICYgfnNjaC0+dnBtKTsKKwlpZiAoIXJlcS0+bHBtKQorCQlnb3RvIG91dF9ub3BhdGg7CisJLyogQ2hhbm5lbCBwcm9ncmFtIHNldHVwLiAqLworCWlmIChyZXEtPmxwbSAmIHNjaC0+b3BtKQorCQlmbiA9IFNQSURfRlVOQ19FU1RBQkxJU0g7CisJZWxzZQorCQlmbiA9IFNQSURfRlVOQ19SRVNJR047CisJaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLm1wYXRoKQorCQlmbiB8PSBTUElEX0ZVTkNfTVVMVElfUEFUSDsKKwlzcGlkX2J1aWxkX2NwKGNkZXYsIGZuKTsKKwljY3dfcmVxdWVzdF9zdGFydChjZGV2KTsKKwlyZXR1cm47CisKK291dF9ub3BhdGg6CisJdmVyaWZ5X2RvbmUoY2Rldiwgc2NoLT52cG0gPyAwIDogLUVBQ0NFUyk7Cit9CisKK3N0YXRpYyB2b2lkIHZlcmlmeV9zdGFydChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldik7CisKKy8qCisgKiBQcm9jZXNzIFNFVCBQR0lEIHJlcXVlc3QgcmVzdWx0IGZvciBhIHNpbmdsZSBwYXRoLgorICovCitzdGF0aWMgdm9pZCBzcGlkX2NhbGxiYWNrKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICpkYXRhLCBpbnQgcmMpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCisJc3dpdGNoIChyYykgeworCWNhc2UgMDoKKwkJc2NoLT52cG0gfD0gcmVxLT5scG0gJiBzY2gtPm9wbTsKKwkJYnJlYWs7CisJY2FzZSAtRUFDQ0VTOgogCQlicmVhazsKIAljYXNlIC1FT1BOT1RTVVBQOgotCQkvKgotCQkgKiBPbmUgb2YgdGhvc2Ugc3RyYW5nZSBkZXZpY2VzIHdoaWNoIGNsYWltIHRvIGJlIGFibGUKLQkJICogdG8gZG8gbXVsdGlwYXRoaW5nIGJ1dCBub3QgZm9yIFVuc2V0IFBhdGggR3JvdXAgSUQuCi0JCSAqLwotCQljZGV2LT5wcml2YXRlLT5mbGFncy5wZ2lkX3NpbmdsZSA9IDE7Ci0JCS8qIGZhbGwgdGhyb3VnaC4gKi8KLQljYXNlIC1FQUdBSU46CQkvKiBUcnkgYWdhaW4uICovCi0JCV9fY2N3X2RldmljZV9kaXNiYW5kX3N0YXJ0KGNkZXYpOworCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MubXBhdGgpIHsKKwkJCS8qIFRyeSB3aXRob3V0IG11bHRpcGF0aGluZy4gKi8KKwkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLm1wYXRoID0gMDsKKwkJCWdvdG8gb3V0X3Jlc3RhcnQ7CisJCX0KKwkJLyogVHJ5IHdpdGhvdXQgcGF0aGdyb3VwaW5nLiAqLworCQljZGV2LT5wcml2YXRlLT5mbGFncy5wZ3JvdXAgPSAwOworCQlnb3RvIG91dF9yZXN0YXJ0OworCWRlZmF1bHQ6CisJCWdvdG8gZXJyOworCX0KKwlyZXEtPmxwbSA+Pj0gMTsKKwlzcGlkX2RvKGNkZXYpOworCXJldHVybjsKKworb3V0X3Jlc3RhcnQ6CisJdmVyaWZ5X3N0YXJ0KGNkZXYpOworCXJldHVybjsKK2VycjoKKwl2ZXJpZnlfZG9uZShjZGV2LCByYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNwaWRfc3RhcnQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCisJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IGRhdGEuICovCisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPnRpbWVvdXQJPSBQR0lEX1RJTUVPVVQ7CisJcmVxLT5tYXhyZXRyaWVzCT0gUEdJRF9SRVRSSUVTOworCXJlcS0+bHBtCT0gMHg4MDsKKwlyZXEtPmNhbGxiYWNrCT0gc3BpZF9jYWxsYmFjazsKKwlzcGlkX2RvKGNkZXYpOworfQorCitzdGF0aWMgaW50IHBnaWRfY21wKHN0cnVjdCBwZ2lkICpwMSwgc3RydWN0IHBnaWQgKnAyKQoreworCXJldHVybiBtZW1jbXAoKGNoYXIgKikgcDEgKyAxLCAoY2hhciAqKSBwMiArIDEsCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgcGdpZCkgLSAxKTsKK30KKworLyoKKyAqIERldGVybWluZSBwYXRoZ3JvdXAgc3RhdGUgZnJvbSBQR0lEIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHBnaWRfYW5hbHl6ZShzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgc3RydWN0IHBnaWQgKipwLAorCQkJIGludCAqbWlzbWF0Y2gsIGludCAqcmVzZXJ2ZWQsIGludCAqcmVzZXQpCit7CisJc3RydWN0IHBnaWQgKnBnaWQgPSAmY2Rldi0+cHJpdmF0ZS0+cGdpZFswXTsKKwlzdHJ1Y3QgcGdpZCAqZmlyc3QgPSBOVUxMOworCWludCBscG07CisJaW50IGk7CisKKwkqbWlzbWF0Y2ggPSAwOworCSpyZXNlcnZlZCA9IDA7CisJKnJlc2V0ID0gMDsKKwlmb3IgKGkgPSAwLCBscG0gPSAweDgwOyBpIDwgODsgaSsrLCBwZ2lkKyssIGxwbSA+Pj0gMSkgeworCQlpZiAoKGNkZXYtPnByaXZhdGUtPnBnaWRfdmFsaWRfbWFzayAmIGxwbSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGdpZC0+aW5mLnBzLnN0YXRlMiA9PSBTTklEX1NUQVRFMl9SRVNWRF9FTFNFKQorCQkJKnJlc2VydmVkID0gMTsKKwkJaWYgKHBnaWQtPmluZi5wcy5zdGF0ZTEgPT0gU05JRF9TVEFURTFfUkVTRVQpIHsKKwkJCS8qIEEgUEdJRCB3YXMgcmVzZXQuICovCisJCQkqcmVzZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFmaXJzdCkgeworCQkJZmlyc3QgPSBwZ2lkOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBnaWRfY21wKHBnaWQsIGZpcnN0KSAhPSAwKQorCQkJKm1pc21hdGNoID0gMTsKKwl9CisJaWYgKCFmaXJzdCkKKwkJZmlyc3QgPSAmY2hhbm5lbF9zdWJzeXN0ZW1zWzBdLT5nbG9iYWxfcGdpZDsKKwkqcCA9IGZpcnN0OworfQorCitzdGF0aWMgdTggcGdpZF90b192cG0oc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHBnaWQgKnBnaWQ7CisJaW50IGk7CisJaW50IGxwbTsKKwl1OCB2cG0gPSAwOworCisJLyogU2V0IFZQTSBiaXRzIGZvciBwYXRocyB3aGljaCBhcmUgYWxyZWFkeSBpbiB0aGUgdGFyZ2V0IHN0YXRlLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbHBtID0gMHg4MCA+PiBpOworCQlpZiAoKGNkZXYtPnByaXZhdGUtPnBnaWRfdmFsaWRfbWFzayAmIGxwbSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlwZ2lkID0gJmNkZXYtPnByaXZhdGUtPnBnaWRbaV07CisJCWlmIChzY2gtPm9wbSAmIGxwbSkgeworCQkJaWYgKHBnaWQtPmluZi5wcy5zdGF0ZTEgIT0gU05JRF9TVEFURTFfR1JPVVBFRCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwZ2lkLT5pbmYucHMuc3RhdGUxICE9IFNOSURfU1RBVEUxX1VOR1JPVVBFRCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MubXBhdGgpIHsKKwkJCWlmIChwZ2lkLT5pbmYucHMuc3RhdGUzICE9IFNOSURfU1RBVEUzX01VTFRJX1BBVEgpCisJCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlpZiAocGdpZC0+aW5mLnBzLnN0YXRlMyAhPSBTTklEX1NUQVRFM19TSU5HTEVfUEFUSCkKKwkJCQljb250aW51ZTsKKwkJfQorCQl2cG0gfD0gbHBtOworCX0KKworCXJldHVybiB2cG07Cit9CisKK3N0YXRpYyB2b2lkIHBnaWRfZmlsbChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgc3RydWN0IHBnaWQgKnBnaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQltZW1jcHkoJmNkZXYtPnByaXZhdGUtPnBnaWRbaV0sIHBnaWQsIHNpemVvZihzdHJ1Y3QgcGdpZCkpOworfQorCisvKgorICogUHJvY2VzcyBTRU5TRSBQR0lEIGRhdGEgYW5kIHJlcG9ydCByZXN1bHQuCisgKi8KK3N0YXRpYyB2b2lkIHNuaWRfZG9uZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IHJjKQoreworCXN0cnVjdCBjY3dfZGV2X2lkICppZCA9ICZjZGV2LT5wcml2YXRlLT5kZXZfaWQ7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHBnaWQgKnBnaWQ7CisJaW50IG1pc21hdGNoID0gMDsKKwlpbnQgcmVzZXJ2ZWQgPSAwOworCWludCByZXNldCA9IDA7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXBnaWRfYW5hbHl6ZShjZGV2LCAmcGdpZCwgJm1pc21hdGNoLCAmcmVzZXJ2ZWQsICZyZXNldCk7CisJaWYgKHJlc2VydmVkKQorCQlyYyA9IC1FVVNFUlM7CisJZWxzZSBpZiAobWlzbWF0Y2gpCisJCXJjID0gLUVPUE5PVFNVUFA7CisJZWxzZSB7CisJCXNjaC0+dnBtID0gcGdpZF90b192cG0oY2Rldik7CisJCXBnaWRfZmlsbChjZGV2LCBwZ2lkKTsKKwl9CitvdXQ6CisJQ0lPX01TR19FVkVOVCgyLCAic25pZDogZGV2aWNlIDAuJXguJTA0eDogcmM9JWQgcHZtPSUwMnggdnBtPSUwMnggIgorCQkgICAgICAibWlzbT0lZCByc3ZkPSVkIHJlc2V0PSVkXG4iLCBpZC0+c3NpZCwgaWQtPmRldm5vLCByYywKKwkJICAgICAgY2Rldi0+cHJpdmF0ZS0+cGdpZF92YWxpZF9tYXNrLCBzY2gtPnZwbSwgbWlzbWF0Y2gsCisJCSAgICAgIHJlc2VydmVkLCByZXNldCk7CisJc3dpdGNoIChyYykgeworCWNhc2UgMDoKKwkJLyogQW55dGhpbmcgbGVmdCB0byBkbz8gKi8KKwkJaWYgKHNjaC0+dnBtID09IHNjaC0+c2NoaWIucG1jdy5wYW0pIHsKKwkJCXZlcmlmeV9kb25lKGNkZXYsIHNjaC0+dnBtID09IDAgPyAtRUFDQ0VTIDogMCk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogUGVyZm9ybSBwYXRoLWdyb3VwaW5nLiAqLworCQlzcGlkX3N0YXJ0KGNkZXYpOwogCQlicmVhazsKLQljYXNlIC1FVElNRToJCS8qIFNldCBwYXRoIGdyb3VwIGlkIHN0b3BwZWQgYnkgdGltZW91dC4gKi8KLQkJY2N3X2RldmljZV9kaXNiYW5kX2RvbmUoY2RldiwgLUVUSU1FKTsKKwljYXNlIC1FT1BOT1RTVVBQOgorCQkvKiBQYXRoLWdyb3VwaW5nIG5vdCBzdXBwb3J0ZWQuICovCisJCWNkZXYtPnByaXZhdGUtPmZsYWdzLnBncm91cCA9IDA7CisJCWNkZXYtPnByaXZhdGUtPmZsYWdzLm1wYXRoID0gMDsKKwkJdmVyaWZ5X3N0YXJ0KGNkZXYpOwogCQlicmVhazsKLQljYXNlIC1FQUNDRVM6CQkvKiBjaGFubmVsIGlzIG5vdCBvcGVyYXRpb25hbC4gKi8KLQkJY2Rldi0+cHJpdmF0ZS0+aW1hc2sgPj49IDE7Ci0JCWNkZXYtPnByaXZhdGUtPmlyZXRyeSA9IDU7Ci0JCV9fY2N3X2RldmljZV9kaXNiYW5kX3N0YXJ0KGNkZXYpOwotCQlicmVhazsKKwlkZWZhdWx0OgorCQl2ZXJpZnlfZG9uZShjZGV2LCByYyk7CiAJfQogfQogCi12b2lkCi1jY3dfZGV2aWNlX2Rpc2JhbmRfc3RhcnQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCisvKgorICogQ3JlYXRlIGNoYW5uZWwgcHJvZ3JhbSB0byBwZXJmb3JtIGEgU0VOU0UgUEdJRCBvbiBhIHNpbmdsZSBwYXRoLgorICovCitzdGF0aWMgdm9pZCBzbmlkX2J1aWxkX2NwKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCS8qIEFmdGVyIDYwcyBkaXNiYW5kaW5nIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBmYWlsZWQuICovCi0JY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCA2MCpIWik7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCXN0cnVjdCBjY3cxICpjcCA9IGNkZXYtPnByaXZhdGUtPmljY3dzOworCWludCBpID0gOCAtIGZmcyhyZXEtPmxwbSk7CiAKLQljZGV2LT5wcml2YXRlLT5mbGFncy5wZ2lkX3NpbmdsZSA9IDA7Ci0JY2Rldi0+cHJpdmF0ZS0+aXJldHJ5ID0gNTsKLQljZGV2LT5wcml2YXRlLT5pbWFzayA9IDB4ODA7Ci0JX19jY3dfZGV2aWNlX2Rpc2JhbmRfc3RhcnQoY2Rldik7CisJLyogQ2hhbm5lbCBwcm9ncmFtIHNldHVwLiAqLworCWNwLT5jbWRfY29kZQk9IENDV19DTURfU0VOU0VfUEdJRDsKKwljcC0+Y2RhCQk9ICh1MzIpIChhZGRyX3QpICZjZGV2LT5wcml2YXRlLT5wZ2lkW2ldOworCWNwLT5jb3VudAk9IHNpemVvZihzdHJ1Y3QgcGdpZCk7CisJY3AtPmZsYWdzCT0gQ0NXX0ZMQUdfU0xJOworCXJlcS0+Y3AJCT0gY3A7CiB9CisKKy8qCisgKiBQZXJmb3JtIFNFTlNFIFBHSUQgb24gYSBzaW5nbGUgcGF0aC4KKyAqLworc3RhdGljIHZvaWQgc25pZF9kbyhzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgY2N3X3JlcXVlc3QgKnJlcSA9ICZjZGV2LT5wcml2YXRlLT5yZXE7CisKKwkvKiBBZGp1c3QgbHBtIGlmIHBhdGhzIGFyZSBub3Qgc2V0IGluIHBhbS4gKi8KKwlyZXEtPmxwbSA9IGxwbV9hZGp1c3QocmVxLT5scG0sIHNjaC0+c2NoaWIucG1jdy5wYW0pOworCWlmICghcmVxLT5scG0pCisJCWdvdG8gb3V0X25vcGF0aDsKKwlzbmlkX2J1aWxkX2NwKGNkZXYpOworCWNjd19yZXF1ZXN0X3N0YXJ0KGNkZXYpOworCXJldHVybjsKKworb3V0X25vcGF0aDoKKwlzbmlkX2RvbmUoY2RldiwgY2Rldi0+cHJpdmF0ZS0+cGdpZF92YWxpZF9tYXNrID8gMCA6IC1FQUNDRVMpOworfQorCisvKgorICogUHJvY2VzcyBTRU5TRSBQR0lEIHJlcXVlc3QgcmVzdWx0IGZvciBzaW5nbGUgcGF0aC4KKyAqLworc3RhdGljIHZvaWQgc25pZF9jYWxsYmFjayhzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgdm9pZCAqZGF0YSwgaW50IHJjKQoreworCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKKworCWlmIChyYyA9PSAwKQorCQljZGV2LT5wcml2YXRlLT5wZ2lkX3ZhbGlkX21hc2sgfD0gcmVxLT5scG07CisJZWxzZSBpZiAocmMgIT0gLUVBQ0NFUykKKwkJZ290byBlcnI7CisJcmVxLT5scG0gPj49IDE7CisJc25pZF9kbyhjZGV2KTsKKwlyZXR1cm47CisKK2VycjoKKwlzbmlkX2RvbmUoY2RldiwgcmMpOworfQorCisvKgorICogUGVyZm9ybSBwYXRoIHZlcmlmaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdmVyaWZ5X3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKKwlzdHJ1Y3QgY2N3X2Rldl9pZCAqZGV2aWQgPSAmY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkOworCisJc2NoLT52cG0gPSAwOworCS8qIEluaXRpYWxpemUgcmVxdWVzdCBkYXRhLiAqLworCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CisJcmVxLT50aW1lb3V0CT0gUEdJRF9USU1FT1VUOworCXJlcS0+bWF4cmV0cmllcwk9IFBHSURfUkVUUklFUzsKKwlyZXEtPmxwbQk9IDB4ODA7CisJaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLnBncm91cCkgeworCQlDSU9fVFJBQ0VfRVZFTlQoNCwgInNuaWQiKTsKKwkJQ0lPX0hFWF9FVkVOVCg0LCBkZXZpZCwgc2l6ZW9mKCpkZXZpZCkpOworCQlyZXEtPmNhbGxiYWNrCT0gc25pZF9jYWxsYmFjazsKKwkJc25pZF9kbyhjZGV2KTsKKwl9IGVsc2UgeworCQlDSU9fVFJBQ0VfRVZFTlQoNCwgIm5vcCIpOworCQlDSU9fSEVYX0VWRU5UKDQsIGRldmlkLCBzaXplb2YoKmRldmlkKSk7CisJCXJlcS0+ZmlsdGVyCT0gbm9wX2ZpbHRlcjsKKwkJcmVxLT5jYWxsYmFjawk9IG5vcF9jYWxsYmFjazsKKwkJbm9wX2RvKGNkZXYpOworCX0KK30KKworLyoqCisgKiBjY3dfZGV2aWNlX3ZlcmlmeV9zdGFydCAtIHBlcmZvcm0gcGF0aCB2ZXJpZmljYXRpb24KKyAqIEBjZGV2OiBjY3cgZGV2aWNlCisgKgorICogUGVyZm9ybSBhbiBJL08gb24gZWFjaCBhdmFpbGFibGUgY2hhbm5lbCBwYXRoIHRvIEBjZGV2IHRvIGRldGVybWluZSB3aGljaAorICogcGF0aHMgYXJlIG9wZXJhdGlvbmFsLiBUaGUgcmVzdWx0aW5nIHBhdGggbWFzayBpcyBzdG9yZWQgaW4gc2NoLT52cG0uCisgKiBJZiBkZXZpY2Ugb3B0aW9ucyBzcGVjaWZ5IHBhdGhncm91cGluZywgZXN0YWJsaXNoIGEgcGF0aGdyb3VwIGZvciB0aGUKKyAqIG9wZXJhdGlvbmFsIHBhdGhzLiBXaGVuIGZpbmlzaGVkLCBjYWxsIGNjd19kZXZpY2VfdmVyaWZ5X2RvbmUgd2l0aCBhCisgKiByZXR1cm4gY29kZSBzcGVjaWZ5aW5nIHRoZSByZXN1bHQuCisgKi8KK3ZvaWQgY2N3X2RldmljZV92ZXJpZnlfc3RhcnQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJQ0lPX1RSQUNFX0VWRU5UKDQsICJ2cmZ5Iik7CisJQ0lPX0hFWF9FVkVOVCg0LCAmY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLCBzaXplb2YoY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkKSk7CisJLyogSW5pdGlhbGl6ZSBQR0lEIGRhdGEuICovCisJbWVtc2V0KGNkZXYtPnByaXZhdGUtPnBnaWQsIDAsIHNpemVvZihjZGV2LT5wcml2YXRlLT5wZ2lkKSk7CisJY2Rldi0+cHJpdmF0ZS0+cGdpZF92YWxpZF9tYXNrID0gMDsKKwkvKgorCSAqIEluaXRpYWxpemUgcGF0aGdyb3VwIGFuZCBtdWx0aXBhdGggc3RhdGUgd2l0aCB0YXJnZXQgdmFsdWVzLgorCSAqIFRoZXkgbWF5IGNoYW5nZSBpbiB0aGUgY291cnNlIG9mIHBhdGggdmVyaWZpY2F0aW9uLgorCSAqLworCWNkZXYtPnByaXZhdGUtPmZsYWdzLnBncm91cCA9IGNkZXYtPnByaXZhdGUtPm9wdGlvbnMucGdyb3VwOworCWNkZXYtPnByaXZhdGUtPmZsYWdzLm1wYXRoID0gY2Rldi0+cHJpdmF0ZS0+b3B0aW9ucy5tcGF0aDsKKwljZGV2LT5wcml2YXRlLT5mbGFncy5kb3ZlcmlmeSA9IDA7CisJdmVyaWZ5X3N0YXJ0KGNkZXYpOworfQorCisvKgorICogUHJvY2VzcyBkaXNiYW5kIFNFVCBQR0lEIHJlcXVlc3QgcmVzdWx0LgorICovCitzdGF0aWMgdm9pZCBkaXNiYW5kX2NhbGxiYWNrKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICpkYXRhLCBpbnQgcmMpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGNjd19kZXZfaWQgKmlkID0gJmNkZXYtPnByaXZhdGUtPmRldl9pZDsKKworCWlmIChyYykKKwkJZ290byBvdXQ7CisJLyogRW5zdXJlIGNvbnNpc3RlbnQgbXVsdGlwYXRoaW5nIHN0YXRlIGF0IGRldmljZSBhbmQgY2hhbm5lbC4gKi8KKwljZGV2LT5wcml2YXRlLT5mbGFncy5tcGF0aCA9IDA7CisJaWYgKHNjaC0+Y29uZmlnLm1wKSB7CisJCXNjaC0+Y29uZmlnLm1wID0gMDsKKwkJcmMgPSBjaW9fY29tbWl0X2NvbmZpZyhzY2gpOworCX0KK291dDoKKwlDSU9fTVNHX0VWRU5UKDAsICJkaXNiOiBkZXZpY2UgMC4leC4lMDR4OiByYz0lZFxuIiwgaWQtPnNzaWQsIGlkLT5kZXZubywKKwkJICAgICAgcmMpOworCWNjd19kZXZpY2VfZGlzYmFuZF9kb25lKGNkZXYsIHJjKTsKK30KKworLyoqCisgKiBjY3dfZGV2aWNlX2Rpc2JhbmRfc3RhcnQgLSBkaXNiYW5kIHBhdGhncm91cAorICogQGNkZXY6IGNjdyBkZXZpY2UKKyAqCisgKiBFeGVjdXRlIGEgU0VUIFBHSUQgY2hhbm5lbCBwcm9ncmFtIG9uIEBjZGV2IHRvIGRpc2JhbmQgYSBwcmV2aW91c2x5CisgKiBlc3RhYmxpc2hlZCBwYXRoZ3JvdXAuIFdoZW4gZmluaXNoZWQsIGNhbGwgY2N3X2RldmljZV9kaXNiYW5kX2RvbmUgd2l0aAorICogYSByZXR1cm4gY29kZSBzcGVjaWZ5aW5nIHRoZSByZXN1bHQuCisgKi8KK3ZvaWQgY2N3X2RldmljZV9kaXNiYW5kX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKKwl1OCBmbjsKKworCUNJT19UUkFDRV9FVkVOVCg0LCAiZGlzYiIpOworCUNJT19IRVhfRVZFTlQoNCwgJmNkZXYtPnByaXZhdGUtPmRldl9pZCwgc2l6ZW9mKGNkZXYtPnByaXZhdGUtPmRldl9pZCkpOworCS8qIFJlcXVlc3Qgc2V0dXAuICovCisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPnRpbWVvdXQJPSBQR0lEX1RJTUVPVVQ7CisJcmVxLT5tYXhyZXRyaWVzCT0gUEdJRF9SRVRSSUVTOworCXJlcS0+bHBtCT0gc2NoLT5zY2hpYi5wbWN3LnBhbSAmIHNjaC0+b3BtOworCXJlcS0+Y2FsbGJhY2sJPSBkaXNiYW5kX2NhbGxiYWNrOworCWZuID0gU1BJRF9GVU5DX0RJU0JBTkQ7CisJaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLm1wYXRoKQorCQlmbiB8PSBTUElEX0ZVTkNfTVVMVElfUEFUSDsKKwlzcGlkX2J1aWxkX2NwKGNkZXYsIGZuKTsKKwljY3dfcmVxdWVzdF9zdGFydChjZGV2KTsKK30KKworc3RhdGljIHZvaWQgc3RsY2tfYnVpbGRfY3Aoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKmJ1ZjEsIHZvaWQgKmJ1ZjIpCit7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCXN0cnVjdCBjY3cxICpjcCA9IGNkZXYtPnByaXZhdGUtPmljY3dzOworCisJY3BbMF0uY21kX2NvZGUgPSBDQ1dfQ01EX1NUTENLOworCWNwWzBdLmNkYSA9ICh1MzIpIChhZGRyX3QpIGJ1ZjE7CisJY3BbMF0uY291bnQgPSAzMjsKKwljcFswXS5mbGFncyA9IENDV19GTEFHX0NDOworCWNwWzFdLmNtZF9jb2RlID0gQ0NXX0NNRF9SRUxFQVNFOworCWNwWzFdLmNkYSA9ICh1MzIpIChhZGRyX3QpIGJ1ZjI7CisJY3BbMV0uY291bnQgPSAzMjsKKwljcFsxXS5mbGFncyA9IDA7CisJcmVxLT5jcCA9IGNwOworfQorCitzdGF0aWMgdm9pZCBzdGxja19jYWxsYmFjayhzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgdm9pZCAqZGF0YSwgaW50IHJjKQoreworCWNjd19kZXZpY2Vfc3RsY2tfZG9uZShjZGV2LCBkYXRhLCByYyk7Cit9CisKKy8qKgorICogY2N3X2RldmljZV9zdGxja19zdGFydCAtIHBlcmZvcm0gdW5jb25kaXRpb25hbCByZWxlYXNlCisgKiBAY2RldjogY2N3IGRldmljZQorICogQGRhdGE6IGRhdGEgcG9pbnRlciB0byBiZSBwYXNzZWQgdG8gY2N3X2RldmljZV9zdGxja19kb25lCisgKiBAYnVmMTogZGF0YSBwb2ludGVyIHVzZWQgaW4gY2hhbm5lbCBwcm9ncmFtCisgKiBAYnVmMjogZGF0YSBwb2ludGVyIHVzZWQgaW4gY2hhbm5lbCBwcm9ncmFtCisgKgorICogRXhlY3V0ZSBhIGNoYW5uZWwgcHJvZ3JhbSBvbiBAY2RldiB0byByZWxlYXNlIGFuIGV4aXN0aW5nIFBHSUQgcmVzZXJ2YXRpb24uCisgKiBXaGVuIGZpbmlzaGVkLCBjYWxsIGNjd19kZXZpY2Vfc3RsY2tfZG9uZSB3aXRoIGEgcmV0dXJuIGNvZGUgc3BlY2lmeWluZyB0aGUKKyAqIHJlc3VsdC4KKyAqLwordm9pZCBjY3dfZGV2aWNlX3N0bGNrX3N0YXJ0KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICpkYXRhLCB2b2lkICpidWYxLAorCQkJICAgIHZvaWQgKmJ1ZjIpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGNjd19yZXF1ZXN0ICpyZXEgPSAmY2Rldi0+cHJpdmF0ZS0+cmVxOworCisJQ0lPX1RSQUNFX0VWRU5UKDQsICJzdGxjayIpOworCUNJT19IRVhfRVZFTlQoNCwgJmNkZXYtPnByaXZhdGUtPmRldl9pZCwgc2l6ZW9mKGNkZXYtPnByaXZhdGUtPmRldl9pZCkpOworCS8qIFJlcXVlc3Qgc2V0dXAuICovCisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPnRpbWVvdXQJPSBQR0lEX1RJTUVPVVQ7CisJcmVxLT5tYXhyZXRyaWVzCT0gUEdJRF9SRVRSSUVTOworCXJlcS0+bHBtCT0gc2NoLT5zY2hpYi5wbWN3LnBhbSAmIHNjaC0+b3BtOworCXJlcS0+ZGF0YQk9IGRhdGE7CisJcmVxLT5jYWxsYmFjawk9IHN0bGNrX2NhbGxiYWNrOworCXN0bGNrX2J1aWxkX2NwKGNkZXYsIGJ1ZjEsIGJ1ZjIpOworCWNjd19yZXF1ZXN0X3N0YXJ0KGNkZXYpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCmluZGV4IDU4MTRkYmUuLjY2ZDgwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jCkBAIC0zMzYsOSArMzM2LDYgQEAKIAlzZW5zZV9jY3ctPmNvdW50ID0gU0VOU0VfTUFYX0NPVU5UOwogCXNlbnNlX2Njdy0+ZmxhZ3MgPSBDQ1dfRkxBR19TTEk7CiAKLQkvKiBSZXNldCBpbnRlcm5hbCByZXRyeSBpbmRpY2F0aW9uLiAqLwotCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKLQogCXJjID0gY2lvX3N0YXJ0KHNjaCwgc2Vuc2VfY2N3LCAweGZmKTsKIAlpZiAocmMgPT0gLUVOT0RFViB8fCByYyA9PSAtRUFDQ0VTKQogCQlkZXZfZnNtX2V2ZW50KGNkZXYsIERFVl9FVkVOVF9WRVJJRlkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaCBiL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmgKaW5kZXggMGI4ZjM4MS4uZDcyYWU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oCkBAIC0xLDcgKzEsMTAgQEAKICNpZm5kZWYgUzM5MF9JT19TQ0hfSAogI2RlZmluZSBTMzkwX0lPX1NDSF9ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zY2hpZC5oPgorI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KKyNpbmNsdWRlICJjc3MuaCIKIAogLyoKICAqIGNvbW1hbmQtbW9kZSBvcGVyYXRpb24gcmVxdWVzdCBibG9jawpAQCAtNjgsNiArNzEsNTIgQEAKICNkZWZpbmUgTUFYX0NJV1MgOAogCiAvKgorICogUG9zc2libGUgc3RhdHVzIHZhbHVlcyBmb3IgYSBDQ1cgcmVxdWVzdCdzIEkvTy4KKyAqLworZW51bSBpb19zdGF0dXMgeworCUlPX0RPTkUsCisJSU9fUlVOTklORywKKwlJT19TVEFUVVNfRVJST1IsCisJSU9fUEFUSF9FUlJPUiwKKwlJT19SRUpFQ1RFRCwKKwlJT19LSUxMRUQKK307CisKKy8qKgorICogY2N3X3JlcXVlc3QgLSBJbnRlcm5hbCBDQ1cgcmVxdWVzdC4KKyAqIEBjcDogY2hhbm5lbCBwcm9ncmFtIHRvIHN0YXJ0CisgKiBAdGltZW91dDogbWF4aW11bSBhbGxvd2FibGUgdGltZSBpbiBqaWZmaWVzIGJldHdlZW4gc3RhcnQgSS9PIGFuZCBpbnRlcnJ1cHQKKyAqIEBtYXhyZXRyaWVzOiBudW1iZXIgb2YgcmV0cmllcyBwZXIgSS9PIG9wZXJhdGlvbiBhbmQgcGF0aAorICogQGxwbTogbWFzayBvZiBwYXRocyB0byB1c2UKKyAqIEBjaGVjazogb3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBkZXRlcm1pbmVzIGlmIHJlc3VsdHMgYXJlIGZpbmFsCisgKiBAZmlsdGVyOiBvcHRpb25hbCBjYWxsYmFjayB0byBhZGp1c3QgcmVxdWVzdCBzdGF0dXMgYmFzZWQgb24gSVJCIGRhdGEKKyAqIEBjYWxsYmFjazogZmluYWwgY2FsbGJhY2sKKyAqIEBkYXRhOiB1c2VyLWRlZmluZWQgcG9pbnRlciBwYXNzZWQgdG8gYWxsIGNhbGxiYWNrcworICogQG1hc2s6IGN1cnJlbnQgcGF0aCBtYXNrCisgKiBAcmV0cmllczogY3VycmVudCBudW1iZXIgb2YgcmV0cmllcworICogQGRyYzogZGVsYXllZCByZXR1cm4gY29kZQorICogQGNhbmNlbDogbm9uLXplcm8gaWYgcmVxdWVzdCB3YXMgY2FuY2VsbGVkCisgKiBAZG9uZTogbm9uLXplcm8gaWYgcmVxdWVzdCB3YXMgZmluaXNoZWQKKyAqLworc3RydWN0IGNjd19yZXF1ZXN0IHsKKwlzdHJ1Y3QgY2N3MSAqY3A7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXUxNiBtYXhyZXRyaWVzOworCXU4IGxwbTsKKwlpbnQgKCpjaGVjaykoc3RydWN0IGNjd19kZXZpY2UgKiwgdm9pZCAqKTsKKwllbnVtIGlvX3N0YXR1cyAoKmZpbHRlcikoc3RydWN0IGNjd19kZXZpY2UgKiwgdm9pZCAqLCBzdHJ1Y3QgaXJiICosCisJCQkJIGVudW0gaW9fc3RhdHVzKTsKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBjY3dfZGV2aWNlICosIHZvaWQgKiwgaW50KTsKKwl2b2lkICpkYXRhOworCS8qIFRoZXNlIGZpZWxkcyBhcmUgdXNlZCBpbnRlcm5hbGx5LiAqLworCXUxNiBtYXNrOworCXUxNiByZXRyaWVzOworCWludCBkcmM7CisJaW50IGNhbmNlbDoxOworCWludCBkb25lOjE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgogICogc2Vuc2UtaWQgcmVzcG9uc2UgYnVmZmVyIGxheW91dAogICovCiBzdHJ1Y3Qgc2Vuc2VpZCB7CkBAIC04MiwzMiArMTMxLDQzIEBACiAJc3RydWN0IGNpdyBjaXdbTUFYX0NJV1NdOwkvKiB2YXJpYWJsZSAjIG9mIENJV3MgKi8KIH0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKIAorZW51bSBjZGV2X3RvZG8geworCUNERVZfVE9ET19OT1RISU5HLAorCUNERVZfVE9ET19FTkFCTEVfQ01GLAorCUNERVZfVE9ET19SRUJJTkQsCisJQ0RFVl9UT0RPX1JFR0lTVEVSLAorCUNERVZfVE9ET19VTlJFRywKKwlDREVWX1RPRE9fVU5SRUdfRVZBTCwKK307CisKIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJaW50IHN0YXRlOwkJLyogZGV2aWNlIHN0YXRlICovCiAJYXRvbWljX3Qgb25vZmY7Ci0JdW5zaWduZWQgbG9uZyByZWdpc3RlcmVkOwogCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsJLyogZGV2aWNlIGlkICovCiAJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CS8qIHN1YmNoYW5uZWwgbnVtYmVyICovCi0JdTggaW1hc2s7CQkvKiBscG0gbWFzayBmb3IgU05JRC9TSUQvU1BHSUQgKi8KLQlpbnQgaXJldHJ5OwkJLyogcmV0cnkgY291bnRlciBTTklEL1NJRC9TUEdJRCAqLworCXN0cnVjdCBjY3dfcmVxdWVzdCByZXE7CQkvKiBpbnRlcm5hbCBJL08gcmVxdWVzdCAqLworCWludCBpcmV0cnk7CisJdTggcGdpZF92YWxpZF9tYXNrOwkJLyogbWFzayBvZiB2YWxpZCBQR0lEcyAqLwogCXN0cnVjdCB7CiAJCXVuc2lnbmVkIGludCBmYXN0OjE7CS8qIHBvc3Qgd2l0aCAiY2hhbm5lbCBlbmQiICovCiAJCXVuc2lnbmVkIGludCByZXBhbGw6MTsJLyogcmVwb3J0IGV2ZXJ5IGludGVycnVwdCBzdGF0dXMgKi8KIAkJdW5zaWduZWQgaW50IHBncm91cDoxOwkvKiBkbyBwYXRoIGdyb3VwaW5nICovCiAJCXVuc2lnbmVkIGludCBmb3JjZToxOwkvKiBhbGxvdyBmb3JjZWQgb25saW5lICovCisJCXVuc2lnbmVkIGludCBtcGF0aDoxOwkvKiBkbyBtdWx0aXBhdGhpbmcgKi8KIAl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBvcHRpb25zOwogCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGludCBwZ2lkX3NpbmdsZToxOyAvKiB1c2Ugc2luZ2xlIHBhdGggZm9yIFNldCBQR0lEICovCiAJCXVuc2lnbmVkIGludCBlc2lkOjE7CSAgICAvKiBFeHQuIFNlbnNlSUQgc3VwcG9ydGVkIGJ5IEhXICovCiAJCXVuc2lnbmVkIGludCBkb3NlbnNlOjE7CSAgICAvKiBkZWxheWVkIFNFTlNFIHJlcXVpcmVkICovCiAJCXVuc2lnbmVkIGludCBkb3ZlcmlmeToxOyAgICAvKiBkZWxheWVkIHBhdGggdmVyaWZpY2F0aW9uICovCiAJCXVuc2lnbmVkIGludCBkb25vdGlmeToxOyAgICAvKiBjYWxsIG5vdGlmeSBmdW5jdGlvbiAqLwogCQl1bnNpZ25lZCBpbnQgcmVjb2dfZG9uZToxOyAgLyogZGV2LiByZWNvZy4gY29tcGxldGUgKi8KIAkJdW5zaWduZWQgaW50IGZha2VfaXJiOjE7ICAgIC8qIGRlbGl2ZXIgZmFrZWQgaXJiICovCi0JCXVuc2lnbmVkIGludCBpbnRyZXRyeToxOyAgICAvKiByZXRyeSBpbnRlcm5hbCBvcGVyYXRpb24gKi8KIAkJdW5zaWduZWQgaW50IHJlc3VtaW5nOjE7ICAgIC8qIHJlY29nbml0aW9uIHdoaWxlIHJlc3VtZSAqLworCQl1bnNpZ25lZCBpbnQgcGdyb3VwOjE7CSAgICAvKiBwYXRoZ3JvdXAgaXMgc2V0IHVwICovCisJCXVuc2lnbmVkIGludCBtcGF0aDoxOwkgICAgLyogbXVsdGlwYXRoaW5nIGlzIHNldCB1cCAqLworCQl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQ6MTsgLyogc2V0IGlmIGluaXRpYWwgcmVmZXJlbmNlIGhlbGQgKi8KIAl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgaW50cGFybTsJLyogdXNlciBpbnRlcnJ1cHRpb24gcGFyYW1ldGVyICovCiAJc3RydWN0IHFkaW9faXJxICpxZGlvX2RhdGE7CkBAIC0xMTUsNyArMTc1LDggQEAKIAlzdHJ1Y3Qgc2Vuc2VpZCBzZW5zZWlkOwkvKiBTZW5zZUlEIGluZm8gKi8KIAlzdHJ1Y3QgcGdpZCBwZ2lkWzhdOwkvKiBwYXRoIGdyb3VwIElEcyBwZXIgY2hwaWQqLwogCXN0cnVjdCBjY3cxIGljY3dzWzJdOwkvKiBjY3dzIGZvciBTTklEL1NJRC9TUEdJRCBjb21tYW5kcyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBraWNrX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHRvZG9fd29yazsKKwllbnVtIGNkZXZfdG9kbyB0b2RvOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAl2b2lkICpjbWI7CQkJLyogbWVhc3VyZW1lbnQgaW5mb3JtYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCmluZGV4IDEyOTQ4NzYuLjIwODM2ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYwpAQCAtMTAyLDYgKzEwMiw3IEBACiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXBfcG9sbF93YWl0KTsKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmFwX3BvbGxfa3RocmVhZCA9IE5VTEw7CiBzdGF0aWMgREVGSU5FX01VVEVYKGFwX3BvbGxfdGhyZWFkX211dGV4KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXBfcG9sbF90aW1lcl9sb2NrKTsKIHN0YXRpYyB2b2lkICphcF9pbnRlcnJ1cHRfaW5kaWNhdG9yOwogc3RhdGljIHN0cnVjdCBocnRpbWVyIGFwX3BvbGxfdGltZXI7CiAvKiBJbiBMUEFSIHBvbGwgd2l0aCA0a0h6IGZyZXF1ZW5jeS4gUG9sbCBldmVyeSAyNTAwMDAgbmFub3NlY29uZHMuCkBAIC0yODIsNiArMjgzLDcgQEAKICAqIEBwc21pZDogVGhlIHByb2dyYW0gc3VwcGxpZWQgbWVzc2FnZSBpZGVudGlmaWVyCiAgKiBAbXNnOiBUaGUgbWVzc2FnZSB0ZXh0CiAgKiBAbGVuZ3RoOiBUaGUgbWVzc2FnZSBsZW5ndGgKKyAqIEBzcGVjaWFsOiBTcGVjaWFsIEJpdAogICoKICAqIFJldHVybnMgQVAgcXVldWUgc3RhdHVzIHN0cnVjdHVyZS4KICAqIENvbmRpdGlvbiBjb2RlIDEgb24gTlFBUCBjYW4ndCBoYXBwZW4gYmVjYXVzZSB0aGUgTCBiaXQgaXMgMS4KQEAgLTI4OSw3ICsyOTEsOCBAQAogICogYmVjYXVzZSBhIHNlZ21lbnQgYm91bmRhcnkgd2FzIHJlYWNoZWQuIFRoZSBOUUFQIGlzIHJlcGVhdGVkLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhcF9xdWV1ZV9zdGF0dXMKLV9fYXBfc2VuZChhcF9xaWRfdCBxaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyBwc21pZCwgdm9pZCAqbXNnLCBzaXplX3QgbGVuZ3RoKQorX19hcF9zZW5kKGFwX3FpZF90IHFpZCwgdW5zaWduZWQgbG9uZyBsb25nIHBzbWlkLCB2b2lkICptc2csIHNpemVfdCBsZW5ndGgsCisJICB1bnNpZ25lZCBpbnQgc3BlY2lhbCkKIHsKIAl0eXBlZGVmIHN0cnVjdCB7IGNoYXIgX1tsZW5ndGhdOyB9IG1zZ2Jsb2NrOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20gKCIwIikgPSBxaWQgfCAweDQwMDAwMDAwVUw7CkBAIC0yOTksNiArMzAyLDkgQEAKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzQgYXNtICgiNCIpID0gKHVuc2lnbmVkIGludCkgKHBzbWlkID4+IDMyKTsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzUgYXNtICgiNSIpID0gKHVuc2lnbmVkIGludCkgcHNtaWQ7CiAKKwlpZiAoc3BlY2lhbCA9PSAxKQorCQlyZWcwIHw9IDB4NDAwMDAwVUw7CisKIAlhc20gdm9sYXRpbGUgKAogCQkiMDogLmxvbmcgMHhiMmFkMDA0MlxuIgkJLyogRFFBUCAqLwogCQkiICAgYnJjICAgMiwwYiIKQEAgLTMxMiwxMyArMzE4LDE1IEBACiB7CiAJc3RydWN0IGFwX3F1ZXVlX3N0YXR1cyBzdGF0dXM7CiAKLQlzdGF0dXMgPSBfX2FwX3NlbmQocWlkLCBwc21pZCwgbXNnLCBsZW5ndGgpOworCXN0YXR1cyA9IF9fYXBfc2VuZChxaWQsIHBzbWlkLCBtc2csIGxlbmd0aCwgMCk7CiAJc3dpdGNoIChzdGF0dXMucmVzcG9uc2VfY29kZSkgewogCWNhc2UgQVBfUkVTUE9OU0VfTk9STUFMOgogCQlyZXR1cm4gMDsKIAljYXNlIEFQX1JFU1BPTlNFX1FfRlVMTDoKIAljYXNlIEFQX1JFU1BPTlNFX1JFU0VUX0lOX1BST0dSRVNTOgogCQlyZXR1cm4gLUVCVVNZOworCWNhc2UgQVBfUkVTUE9OU0VfUkVRX0ZBQ19OT1RfSU5TVDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJZGVmYXVsdDoJLyogRGV2aWNlIGlzIGdvbmUuICovCiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTEwMDgsNyArMTAxNiw3IEBACiAJfQogCiAJc3RhdHVzID0gX19hcF9zZW5kKGFwX2Rldi0+cWlkLCAweDAxMDIwMzA0MDUwNjA3MDhVTEwsCi0JCQkgICBtc2csIHNpemVvZihtc2cpKTsKKwkJCSAgIG1zZywgc2l6ZW9mKG1zZyksIDApOwogCWlmIChzdGF0dXMucmVzcG9uc2VfY29kZSAhPSBBUF9SRVNQT05TRV9OT1JNQUwpIHsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9mcmVlOwpAQCAtMTE2MywxNiArMTE3MSwxOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGFwX3NjaGVkdWxlX3BvbGxfdGltZXIodm9pZCkKIHsKIAlrdGltZV90IGhyX3RpbWU7CisKKwlzcGluX2xvY2tfYmgoJmFwX3BvbGxfdGltZXJfbG9jayk7CiAJaWYgKGFwX3VzaW5nX2ludGVycnVwdHMoKSB8fCBhcF9zdXNwZW5kX2ZsYWcpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJaWYgKGhydGltZXJfaXNfcXVldWVkKCZhcF9wb2xsX3RpbWVyKSkKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAlpZiAoa3RpbWVfdG9fbnMoaHJ0aW1lcl9leHBpcmVzX3JlbWFpbmluZygmYXBfcG9sbF90aW1lcikpIDw9IDApIHsKIAkJaHJfdGltZSA9IGt0aW1lX3NldCgwLCBwb2xsX3RpbWVvdXQpOwogCQlocnRpbWVyX2ZvcndhcmRfbm93KCZhcF9wb2xsX3RpbWVyLCBocl90aW1lKTsKIAkJaHJ0aW1lcl9yZXN0YXJ0KCZhcF9wb2xsX3RpbWVyKTsKIAl9Ci0JcmV0dXJuOworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZhcF9wb2xsX3RpbWVyX2xvY2spOwogfQogCiAvKioKQEAgLTEyNDMsNyArMTI1NCw3IEBACiAJLyogU3RhcnQgdGhlIG5leHQgcmVxdWVzdCBvbiB0aGUgcXVldWUuICovCiAJYXBfbXNnID0gbGlzdF9lbnRyeShhcF9kZXYtPnJlcXVlc3RxLm5leHQsIHN0cnVjdCBhcF9tZXNzYWdlLCBsaXN0KTsKIAlzdGF0dXMgPSBfX2FwX3NlbmQoYXBfZGV2LT5xaWQsIGFwX21zZy0+cHNtaWQsCi0JCQkgICBhcF9tc2ctPm1lc3NhZ2UsIGFwX21zZy0+bGVuZ3RoKTsKKwkJCSAgIGFwX21zZy0+bWVzc2FnZSwgYXBfbXNnLT5sZW5ndGgsIGFwX21zZy0+c3BlY2lhbCk7CiAJc3dpdGNoIChzdGF0dXMucmVzcG9uc2VfY29kZSkgewogCWNhc2UgQVBfUkVTUE9OU0VfTk9STUFMOgogCQlhdG9taWNfaW5jKCZhcF9wb2xsX3JlcXVlc3RzKTsKQEAgLTEyNjEsNiArMTI3Miw3IEBACiAJCSpmbGFncyB8PSAyOwogCQlicmVhazsKIAljYXNlIEFQX1JFU1BPTlNFX01FU1NBR0VfVE9PX0JJRzoKKwljYXNlIEFQX1JFU1BPTlNFX1JFUV9GQUNfTk9UX0lOU1Q6CiAJCXJldHVybiAtRUlOVkFMOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTMwMiw3ICsxMzE0LDggQEAKIAlpZiAobGlzdF9lbXB0eSgmYXBfZGV2LT5yZXF1ZXN0cSkgJiYKIAkgICAgYXBfZGV2LT5xdWV1ZV9jb3VudCA8IGFwX2Rldi0+cXVldWVfZGVwdGgpIHsKIAkJc3RhdHVzID0gX19hcF9zZW5kKGFwX2Rldi0+cWlkLCBhcF9tc2ctPnBzbWlkLAotCQkJCSAgIGFwX21zZy0+bWVzc2FnZSwgYXBfbXNnLT5sZW5ndGgpOworCQkJCSAgIGFwX21zZy0+bWVzc2FnZSwgYXBfbXNnLT5sZW5ndGgsCisJCQkJICAgYXBfbXNnLT5zcGVjaWFsKTsKIAkJc3dpdGNoIChzdGF0dXMucmVzcG9uc2VfY29kZSkgewogCQljYXNlIEFQX1JFU1BPTlNFX05PUk1BTDoKIAkJCWxpc3RfYWRkX3RhaWwoJmFwX21zZy0+bGlzdCwgJmFwX2Rldi0+cGVuZGluZ3EpOwpAQCAtMTMxNyw2ICsxMzMwLDcgQEAKIAkJCWFwX2Rldi0+cmVxdWVzdHFfY291bnQrKzsKIAkJCWFwX2Rldi0+dG90YWxfcmVxdWVzdF9jb3VudCsrOwogCQkJcmV0dXJuIC1FQlVTWTsKKwkJY2FzZSBBUF9SRVNQT05TRV9SRVFfRkFDX05PVF9JTlNUOgogCQljYXNlIEFQX1JFU1BPTlNFX01FU1NBR0VfVE9PX0JJRzoKIAkJCWFwX2Rldi0+ZHJ2LT5yZWNlaXZlKGFwX2RldiwgYXBfbXNnLCBFUlJfUFRSKC1FSU5WQUwpKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTY1OCw2ICsxNjcyLDcgQEAKIAkgKi8KIAlpZiAoTUFDSElORV9JU19WTSkKIAkJcG9sbF90aW1lb3V0ID0gMTUwMDAwMDsKKwlzcGluX2xvY2tfaW5pdCgmYXBfcG9sbF90aW1lcl9sb2NrKTsKIAlocnRpbWVyX2luaXQoJmFwX3BvbGxfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CiAJYXBfcG9sbF90aW1lci5mdW5jdGlvbiA9IGFwX3BvbGxfdGltZW91dDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuaCBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmgKaW5kZXggYTM1MzYyMi4uNDc4NWQwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuaAorKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5oCkBAIC04Nyw2ICs4Nyw3IEBACiAjZGVmaW5lIEFQX1JFU1BPTlNFX0lOREVYX1RPT19CSUcJMHgxMQogI2RlZmluZSBBUF9SRVNQT05TRV9OT19GSVJTVF9QQVJUCTB4MTMKICNkZWZpbmUgQVBfUkVTUE9OU0VfTUVTU0FHRV9UT09fQklHCTB4MTUKKyNkZWZpbmUgQVBfUkVTUE9OU0VfUkVRX0ZBQ19OT1RfSU5TVAkweDE2CiAKIC8qCiAgKiBLbm93biBkZXZpY2UgdHlwZXMKQEAgLTk2LDggKzk3LDggQEAKICNkZWZpbmUgQVBfREVWSUNFX1RZUEVfUENJWENDCTUKICNkZWZpbmUgQVBfREVWSUNFX1RZUEVfQ0VYMkEJNgogI2RlZmluZSBBUF9ERVZJQ0VfVFlQRV9DRVgyQwk3Ci0jZGVmaW5lIEFQX0RFVklDRV9UWVBFX0NFWDJBMgk4Ci0jZGVmaW5lIEFQX0RFVklDRV9UWVBFX0NFWDJDMgk5CisjZGVmaW5lIEFQX0RFVklDRV9UWVBFX0NFWDNBCTgKKyNkZWZpbmUgQVBfREVWSUNFX1RZUEVfQ0VYM0MJOQogCiAvKgogICogQVAgcmVzZXQgZmxhZyBzdGF0ZXMKQEAgLTE2MSwxMiArMTYyLDI1IEBACiAJc2l6ZV90IGxlbmd0aDsJCQkvKiBNZXNzYWdlIGxlbmd0aC4gKi8KIAogCXZvaWQgKnByaXZhdGU7CQkJLyogYXAgZHJpdmVyIHByaXZhdGUgcG9pbnRlci4gKi8KKwl1bnNpZ25lZCBpbnQgc3BlY2lhbDoxOwkJLyogVXNlZCBmb3Igc3BlY2lhbCBjb21tYW5kcy4gKi8KIH07CiAKICNkZWZpbmUgQVBfREVWSUNFKGR0KQkJCQkJXAogCS5kZXZfdHlwZT0oZHQpLAkJCQkJXAogCS5tYXRjaF9mbGFncz1BUF9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFX1RZUEUsCiAKKy8qKgorICogYXBfaW5pdF9tZXNzYWdlKCkgLSBJbml0aWFsaXplIGFwX21lc3NhZ2UuCisgKiBJbml0aWFsaXplIGEgbWVzc2FnZSBiZWZvcmUgdXNpbmcuIE90aGVyd2lzZSB0aGlzIG1pZ2h0IHJlc3VsdCBpbgorICogdW5leHBlY3RlZCBiZWhhdmlvdXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcF9pbml0X21lc3NhZ2Uoc3RydWN0IGFwX21lc3NhZ2UgKmFwX21zZykKK3sKKwlhcF9tc2ctPnBzbWlkID0gMDsKKwlhcF9tc2ctPmxlbmd0aCA9IDA7CisJYXBfbXNnLT5zcGVjaWFsID0gMDsKK30KKwogLyoKICAqIE5vdGU6IGRvbid0IHVzZSBhcF9zZW5kL2FwX3JlY3YgYWZ0ZXIgdXNpbmcgYXBfcXVldWVfbWVzc2FnZQogICogZm9yIHRoZSBmaXJzdCB0aW1lLiBPdGhlcndpc2UgdGhlIGFwIG1lc3NhZ2UgcXVldWUgd2lsbCBnZXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X2FwaS5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfYXBpLmMKaW5kZXggNjViNmE5Ni4uMGQ0ZDE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfYXBpLmMKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfYXBpLmMKQEAgLTI5OSw5ICsyOTksNyBAQAogICovCiBzdGF0aWMgaW50IHpjcnlwdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWxvY2tfa2VybmVsKCk7CiAJYXRvbWljX2luYygmemNyeXB0X29wZW5fY291bnQpOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAwOSw2ICsxMDA3LDEwIEBACiAJCSAgICAgICB6Y3J5cHRfY291bnRfdHlwZShaQ1JZUFRfQ0VYMkMpKTsKIAlsZW4gKz0gc3ByaW50ZihyZXNwX2J1ZmYgKyBsZW4sICJDRVgyQSBjb3VudDogJWRcbiIsCiAJCSAgICAgICB6Y3J5cHRfY291bnRfdHlwZShaQ1JZUFRfQ0VYMkEpKTsKKwlsZW4gKz0gc3ByaW50ZihyZXNwX2J1ZmYgKyBsZW4sICJDRVgzQyBjb3VudDogJWRcbiIsCisJCSAgICAgICB6Y3J5cHRfY291bnRfdHlwZShaQ1JZUFRfQ0VYM0MpKTsKKwlsZW4gKz0gc3ByaW50ZihyZXNwX2J1ZmYgKyBsZW4sICJDRVgzQSBjb3VudDogJWRcbiIsCisJCSAgICAgICB6Y3J5cHRfY291bnRfdHlwZShaQ1JZUFRfQ0VYM0EpKTsKIAlsZW4gKz0gc3ByaW50ZihyZXNwX2J1ZmYgKyBsZW4sICJyZXF1ZXN0cSBjb3VudDogJWRcbiIsCiAJCSAgICAgICB6Y3J5cHRfcmVxdWVzdHFfY291bnQoKSk7CiAJbGVuICs9IHNwcmludGYocmVzcF9idWZmICsgbGVuLCAicGVuZGluZ3EgY291bnQ6ICVkXG4iLApAQCAtMTAxNyw3ICsxMDE5LDcgQEAKIAkJICAgICAgIGF0b21pY19yZWFkKCZ6Y3J5cHRfb3Blbl9jb3VudCkpOwogCXpjcnlwdF9zdGF0dXNfbWFzayh3b3JrYXJlYSk7CiAJbGVuICs9IHNwcmludGh4KCJPbmxpbmUgZGV2aWNlczogMT1QQ0lDQSAyPVBDSUNDIDM9UENJWENDKE1DTDIpICIKLQkJCSI0PVBDSVhDQyhNQ0wzKSA1PUNFWDJDIDY9Q0VYMkEiLAorCQkJIjQ9UENJWENDKE1DTDMpIDU9Q0VYMkMgNj1DRVgyQSA3PUNFWDNDIDg9Q0VYM0EiLAogCQkJcmVzcF9idWZmK2xlbiwgd29ya2FyZWEsIEFQX0RFVklDRVMpOwogCXpjcnlwdF9xZGVwdGhfbWFzayh3b3JrYXJlYSk7CiAJbGVuICs9IHNwcmludGh4KCJXYWl0aW5nIHdvcmsgZWxlbWVudCBjb3VudHMiLApAQCAtMTA5NSw4ICsxMDk3LDkgQEAKIAkJICogJzAnIGZvciBubyBkZXZpY2UsICcxJyBmb3IgUENJQ0EsICcyJyBmb3IgUENJQ0MsCiAJCSAqICczJyBmb3IgUENJWENDX01DTDIsICc0JyBmb3IgUENJWENDX01DTDMsCiAJCSAqICc1JyBmb3IgQ0VYMkMgYW5kICc2JyBmb3IgQ0VYMkEnCisJCSAqICc3JyBmb3IgQ0VYM0MgYW5kICc4JyBmb3IgQ0VYM0EKIAkJICovCi0JCWlmICgqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc2JykKKwkJaWYgKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzgnKQogCQkJaisrOwogCQllbHNlIGlmICgqcHRyID09ICdkJyB8fCAqcHRyID09ICdEJykKIAkJCXpjcnlwdF9kaXNhYmxlX2NhcmQoaisrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X2FwaS5oIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfYXBpLmgKaW5kZXggMWQxZWM3NC4uOGU3ZmZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfYXBpLmgKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfYXBpLmgKQEAgLTcxLDYgKzcxLDggQEAKICNkZWZpbmUgWkNSWVBUX1BDSVhDQ19NQ0wzCTQKICNkZWZpbmUgWkNSWVBUX0NFWDJDCQk1CiAjZGVmaW5lIFpDUllQVF9DRVgyQQkJNgorI2RlZmluZSBaQ1JZUFRfQ0VYM0MJCTcKKyNkZWZpbmUgWkNSWVBUX0NFWDNBCQk4CiAKIC8qKgogICogTGFyZ2UgcmFuZG9tIG51bWJlcnMgYXJlIHB1bGxlZCBpbiA0MDk2IGJ5dGUgY2h1bmtzIGZyb20gdGhlIGNyeXB0byBjYXJkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfY2V4MmEuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X2NleDJhLmMKaW5kZXggMzI2ZWEwOC4uYzZmYjBhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfY2V4MmEuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9jZXgyYS5jCkBAIC0zOSwxNyArMzksMjQgQEAKIAogI2RlZmluZSBDRVgyQV9NSU5fTU9EX1NJWkUJICAxCS8qICAgIDggYml0cwkqLwogI2RlZmluZSBDRVgyQV9NQVhfTU9EX1NJWkUJMjU2CS8qIDIwNDggYml0cwkqLworI2RlZmluZSBDRVgzQV9NSU5fTU9EX1NJWkUJQ0VYMkFfTUlOX01PRF9TSVpFCisjZGVmaW5lIENFWDNBX01BWF9NT0RfU0laRQlDRVgyQV9NQVhfTU9EX1NJWkUKIAogI2RlZmluZSBDRVgyQV9TUEVFRF9SQVRJTkcJOTcwCisjZGVmaW5lIENFWDNBX1NQRUVEX1JBVElORwk5MDAgLyogRml4bWU6IE5lZWRzIGZpbmV0dW5pbmcgKi8KIAogI2RlZmluZSBDRVgyQV9NQVhfTUVTU0FHRV9TSVpFCTB4MzkwCS8qIHNpemVvZihzdHJ1Y3QgdHlwZTUwX2NyYjJfbXNnKSAgICAqLwogI2RlZmluZSBDRVgyQV9NQVhfUkVTUE9OU0VfU0laRSAweDExMAkvKiBtYXggb3V0cHV0ZGF0YWxlbmd0aCArIHR5cGU4MF9oZHIgKi8KIAorI2RlZmluZSBDRVgzQV9NQVhfTUVTU0FHRV9TSVpFCUNFWDJBX01BWF9NRVNTQUdFX1NJWkUKKyNkZWZpbmUgQ0VYM0FfTUFYX1JFU1BPTlNFX1NJWkUJQ0VYMkFfTUFYX1JFU1BPTlNFX1NJWkUKKwogI2RlZmluZSBDRVgyQV9DTEVBTlVQX1RJTUUJKDE1KkhaKQorI2RlZmluZSBDRVgzQV9DTEVBTlVQX1RJTUUJQ0VYMkFfQ0xFQU5VUF9USU1FCiAKIHN0YXRpYyBzdHJ1Y3QgYXBfZGV2aWNlX2lkIHpjcnlwdF9jZXgyYV9pZHNbXSA9IHsKIAl7IEFQX0RFVklDRShBUF9ERVZJQ0VfVFlQRV9DRVgyQSkgfSwKLQl7IEFQX0RFVklDRShBUF9ERVZJQ0VfVFlQRV9DRVgyQTIpIH0sCisJeyBBUF9ERVZJQ0UoQVBfREVWSUNFX1RZUEVfQ0VYM0EpIH0sCiAJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAogfTsKIApAQCAtMjk4LDYgKzMwNSw3IEBACiAJc3RydWN0IGNvbXBsZXRpb24gd29yazsKIAlpbnQgcmM7CiAKKwlhcF9pbml0X21lc3NhZ2UoJmFwX21zZyk7CiAJYXBfbXNnLm1lc3NhZ2UgPSBrbWFsbG9jKENFWDJBX01BWF9NRVNTQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYXBfbXNnLm1lc3NhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMzM1LDYgKzM0Myw3IEBACiAJc3RydWN0IGNvbXBsZXRpb24gd29yazsKIAlpbnQgcmM7CiAKKwlhcF9pbml0X21lc3NhZ2UoJmFwX21zZyk7CiAJYXBfbXNnLm1lc3NhZ2UgPSBrbWFsbG9jKENFWDJBX01BWF9NRVNTQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYXBfbXNnLm1lc3NhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMzczLDMxICszODIsNDUgQEAKICAqLwogc3RhdGljIGludCB6Y3J5cHRfY2V4MmFfcHJvYmUoc3RydWN0IGFwX2RldmljZSAqYXBfZGV2KQogewotCXN0cnVjdCB6Y3J5cHRfZGV2aWNlICp6ZGV2OwotCWludCByYzsKKwlzdHJ1Y3QgemNyeXB0X2RldmljZSAqemRldiA9IE5VTEw7CisJaW50IHJjID0gMDsKIAotCXpkZXYgPSB6Y3J5cHRfZGV2aWNlX2FsbG9jKENFWDJBX01BWF9SRVNQT05TRV9TSVpFKTsKLQlpZiAoIXpkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCXpkZXYtPmFwX2RldiA9IGFwX2RldjsKLQl6ZGV2LT5vcHMgPSAmemNyeXB0X2NleDJhX29wczsKLQl6ZGV2LT5vbmxpbmUgPSAxOwotCXpkZXYtPnVzZXJfc3BhY2VfdHlwZSA9IFpDUllQVF9DRVgyQTsKLQl6ZGV2LT50eXBlX3N0cmluZyA9ICJDRVgyQSI7Ci0JemRldi0+bWluX21vZF9zaXplID0gQ0VYMkFfTUlOX01PRF9TSVpFOwotCXpkZXYtPm1heF9tb2Rfc2l6ZSA9IENFWDJBX01BWF9NT0RfU0laRTsKLQl6ZGV2LT5zaG9ydF9jcnQgPSAxOwotCXpkZXYtPnNwZWVkX3JhdGluZyA9IENFWDJBX1NQRUVEX1JBVElORzsKLQlhcF9kZXYtPnJlcGx5ID0gJnpkZXYtPnJlcGx5OwotCWFwX2Rldi0+cHJpdmF0ZSA9IHpkZXY7Ci0JcmMgPSB6Y3J5cHRfZGV2aWNlX3JlZ2lzdGVyKHpkZXYpOwotCWlmIChyYykKLQkJZ290byBvdXRfZnJlZTsKLQlyZXR1cm4gMDsKLQotb3V0X2ZyZWU6Ci0JYXBfZGV2LT5wcml2YXRlID0gTlVMTDsKLQl6Y3J5cHRfZGV2aWNlX2ZyZWUoemRldik7CisJc3dpdGNoIChhcF9kZXYtPmRldmljZV90eXBlKSB7CisJY2FzZSBBUF9ERVZJQ0VfVFlQRV9DRVgyQToKKwkJemRldiA9IHpjcnlwdF9kZXZpY2VfYWxsb2MoQ0VYMkFfTUFYX1JFU1BPTlNFX1NJWkUpOworCQlpZiAoIXpkZXYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJemRldi0+dXNlcl9zcGFjZV90eXBlID0gWkNSWVBUX0NFWDJBOworCQl6ZGV2LT50eXBlX3N0cmluZyA9ICJDRVgyQSI7CisJCXpkZXYtPm1pbl9tb2Rfc2l6ZSA9IENFWDJBX01JTl9NT0RfU0laRTsKKwkJemRldi0+bWF4X21vZF9zaXplID0gQ0VYMkFfTUFYX01PRF9TSVpFOworCQl6ZGV2LT5zaG9ydF9jcnQgPSAxOworCQl6ZGV2LT5zcGVlZF9yYXRpbmcgPSBDRVgyQV9TUEVFRF9SQVRJTkc7CisJCWJyZWFrOworCWNhc2UgQVBfREVWSUNFX1RZUEVfQ0VYM0E6CisJCXpkZXYgPSB6Y3J5cHRfZGV2aWNlX2FsbG9jKENFWDNBX01BWF9SRVNQT05TRV9TSVpFKTsKKwkJaWYgKCF6ZGV2KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXpkZXYtPnVzZXJfc3BhY2VfdHlwZSA9IFpDUllQVF9DRVgzQTsKKwkJemRldi0+dHlwZV9zdHJpbmcgPSAiQ0VYM0EiOworCQl6ZGV2LT5taW5fbW9kX3NpemUgPSBDRVgzQV9NSU5fTU9EX1NJWkU7CisJCXpkZXYtPm1heF9tb2Rfc2l6ZSA9IENFWDNBX01BWF9NT0RfU0laRTsKKwkJemRldi0+c2hvcnRfY3J0ID0gMTsKKwkJemRldi0+c3BlZWRfcmF0aW5nID0gQ0VYM0FfU1BFRURfUkFUSU5HOworCQlicmVhazsKKwl9CisJaWYgKHpkZXYgIT0gTlVMTCkgeworCQl6ZGV2LT5hcF9kZXYgPSBhcF9kZXY7CisJCXpkZXYtPm9wcyA9ICZ6Y3J5cHRfY2V4MmFfb3BzOworCQl6ZGV2LT5vbmxpbmUgPSAxOworCQlhcF9kZXYtPnJlcGx5ID0gJnpkZXYtPnJlcGx5OworCQlhcF9kZXYtPnByaXZhdGUgPSB6ZGV2OworCQlyYyA9IHpjcnlwdF9kZXZpY2VfcmVnaXN0ZXIoemRldik7CisJfQorCWlmIChyYykgeworCQlhcF9kZXYtPnByaXZhdGUgPSBOVUxMOworCQl6Y3J5cHRfZGV2aWNlX2ZyZWUoemRldik7CisJfQogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfcGNpY2EuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaWNhLmMKaW5kZXggMTdiYTgxYi4uZTc4ZGYzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfcGNpY2EuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9wY2ljYS5jCkBAIC0yODEsNiArMjgxLDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiB3b3JrOwogCWludCByYzsKIAorCWFwX2luaXRfbWVzc2FnZSgmYXBfbXNnKTsKIAlhcF9tc2cubWVzc2FnZSA9IGttYWxsb2MoUENJQ0FfTUFYX01FU1NBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcF9tc2cubWVzc2FnZSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zMTgsNiArMzE5LDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiB3b3JrOwogCWludCByYzsKIAorCWFwX2luaXRfbWVzc2FnZSgmYXBfbXNnKTsKIAlhcF9tc2cubWVzc2FnZSA9IGttYWxsb2MoUENJQ0FfTUFYX01FU1NBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcF9tc2cubWVzc2FnZSkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9wY2ljYy5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfcGNpY2MuYwppbmRleCBmNGIwYzQ3Li5hMjM3MjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9wY2ljYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaWNjLmMKQEAgLTQ4Myw2ICs0ODMsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHdvcms7CiAJaW50IHJjOwogCisJYXBfaW5pdF9tZXNzYWdlKCZhcF9tc2cpOwogCWFwX21zZy5tZXNzYWdlID0gKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghYXBfbXNnLm1lc3NhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTIxLDYgKzUyMiw3IEBACiAJc3RydWN0IGNvbXBsZXRpb24gd29yazsKIAlpbnQgcmM7CiAKKwlhcF9pbml0X21lc3NhZ2UoJmFwX21zZyk7CiAJYXBfbXNnLm1lc3NhZ2UgPSAodm9pZCAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcF9tc2cubWVzc2FnZSkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9wY2l4Y2MuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaXhjYy5jCmluZGV4IDU2NzdiNDAuLjc5YzEyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaXhjYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaXhjYy5jCkBAIC00MywxMCArNDMsMTMgQEAKICNkZWZpbmUgUENJWENDX01JTl9NT0RfU0laRQkgMTYJLyogIDEyOCBiaXRzCSovCiAjZGVmaW5lIFBDSVhDQ19NSU5fTU9EX1NJWkVfT0xECSA2NAkvKiAgNTEyIGJpdHMJKi8KICNkZWZpbmUgUENJWENDX01BWF9NT0RfU0laRQkyNTYJLyogMjA0OCBiaXRzCSovCisjZGVmaW5lIENFWDNDX01JTl9NT0RfU0laRQlQQ0lYQ0NfTUlOX01PRF9TSVpFCisjZGVmaW5lIENFWDNDX01BWF9NT0RfU0laRQlQQ0lYQ0NfTUFYX01PRF9TSVpFCiAKLSNkZWZpbmUgUENJWENDX01DTDJfU1BFRURfUkFUSU5HCTc4NzAJLyogRklYTUU6IG5lZWRzIGZpbmV0dW5pbmcgKi8KKyNkZWZpbmUgUENJWENDX01DTDJfU1BFRURfUkFUSU5HCTc4NzAKICNkZWZpbmUgUENJWENDX01DTDNfU1BFRURfUkFUSU5HCTc4NzAKLSNkZWZpbmUgQ0VYMkNfU1BFRURfUkFUSU5HCQk4NTQwCisjZGVmaW5lIENFWDJDX1NQRUVEX1JBVElORwkJNzAwMAorI2RlZmluZSBDRVgzQ19TUEVFRF9SQVRJTkcJCTY1MDAJLyogRklYTUU6IG5lZWRzIGZpbmV0dW5pbmcgKi8KIAogI2RlZmluZSBQQ0lYQ0NfTUFYX0lDQV9NRVNTQUdFX1NJWkUgMHg3N2MgIC8qIG1heCBzaXplIHR5cGU2IHYyIGNydCBtZXNzYWdlICovCiAjZGVmaW5lIFBDSVhDQ19NQVhfSUNBX1JFU1BPTlNFX1NJWkUgMHg3N2MgLyogbWF4IHNpemUgdHlwZTg2IHYyIHJlcGx5CSAgICAqLwpAQCAtNzIsNyArNzUsNyBAQAogc3RhdGljIHN0cnVjdCBhcF9kZXZpY2VfaWQgemNyeXB0X3BjaXhjY19pZHNbXSA9IHsKIAl7IEFQX0RFVklDRShBUF9ERVZJQ0VfVFlQRV9QQ0lYQ0MpIH0sCiAJeyBBUF9ERVZJQ0UoQVBfREVWSUNFX1RZUEVfQ0VYMkMpIH0sCi0JeyBBUF9ERVZJQ0UoQVBfREVWSUNFX1RZUEVfQ0VYMkMyKSB9LAorCXsgQVBfREVWSUNFKEFQX0RFVklDRV9UWVBFX0NFWDNDKSB9LAogCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIH07CiAKQEAgLTMyNiw2ICszMjksMTEgQEAKIAlmdW5jdGlvbl9jb2RlID0gKCh1bnNpZ25lZCBjaGFyICopJm1zZy0+Y3ByYngpICsgbXNnLT5jcHJieC5jcHJiX2xlbjsKIAltZW1jcHkobXNnLT5oZHIuZnVuY3Rpb25fY29kZSwgZnVuY3Rpb25fY29kZSwgc2l6ZW9mKG1zZy0+aGRyLmZ1bmN0aW9uX2NvZGUpKTsKIAorCWlmIChtZW1jbXAoZnVuY3Rpb25fY29kZSwgIlVTIiwgMikgPT0gMCkKKwkJYXBfbXNnLT5zcGVjaWFsID0gMTsKKwllbHNlCisJCWFwX21zZy0+c3BlY2lhbCA9IDA7CisKIAkvKiBjb3B5IGRhdGEgYmxvY2sgKi8KIAlpZiAoeGNSQi0+cmVxdWVzdF9kYXRhX2xlbmd0aCAmJgogCSAgICBjb3B5X2Zyb21fdXNlcihyZXFfZGF0YSwgeGNSQi0+cmVxdWVzdF9kYXRhX2FkZHJlc3MsCkBAIC02ODgsNiArNjk2LDcgQEAKIAl9OwogCWludCByYzsKIAorCWFwX2luaXRfbWVzc2FnZSgmYXBfbXNnKTsKIAlhcF9tc2cubWVzc2FnZSA9ICh2b2lkICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWFwX21zZy5tZXNzYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTcyNyw2ICs3MzYsNyBAQAogCX07CiAJaW50IHJjOwogCisJYXBfaW5pdF9tZXNzYWdlKCZhcF9tc2cpOwogCWFwX21zZy5tZXNzYWdlID0gKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghYXBfbXNnLm1lc3NhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNzY2LDYgKzc3Niw3IEBACiAJfTsKIAlpbnQgcmM7CiAKKwlhcF9pbml0X21lc3NhZ2UoJmFwX21zZyk7CiAJYXBfbXNnLm1lc3NhZ2UgPSBrbWFsbG9jKFBDSVhDQ19NQVhfWENSQl9NRVNTQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYXBfbXNnLm1lc3NhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtODA1LDYgKzgxNiw3IEBACiAJfTsKIAlpbnQgcmM7CiAKKwlhcF9pbml0X21lc3NhZ2UoJmFwX21zZyk7CiAJYXBfbXNnLm1lc3NhZ2UgPSBrbWFsbG9jKFBDSVhDQ19NQVhfWENSQl9NRVNTQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYXBfbXNnLm1lc3NhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTcyLDYgKzk4NCw3IEBACiAJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqcmVwbHk7CiAJaW50IHJjLCBpOwogCisJYXBfaW5pdF9tZXNzYWdlKCZhcF9tc2cpOwogCWFwX21zZy5tZXNzYWdlID0gKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghYXBfbXNnLm1lc3NhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTAxNiwxNCArMTAyOSwxNSBAQAogc3RhdGljIGludCB6Y3J5cHRfcGNpeGNjX3Byb2JlKHN0cnVjdCBhcF9kZXZpY2UgKmFwX2RldikKIHsKIAlzdHJ1Y3QgemNyeXB0X2RldmljZSAqemRldjsKLQlpbnQgcmM7CisJaW50IHJjID0gMDsKIAogCXpkZXYgPSB6Y3J5cHRfZGV2aWNlX2FsbG9jKFBDSVhDQ19NQVhfUkVTUE9OU0VfU0laRSk7CiAJaWYgKCF6ZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAl6ZGV2LT5hcF9kZXYgPSBhcF9kZXY7CiAJemRldi0+b25saW5lID0gMTsKLQlpZiAoYXBfZGV2LT5kZXZpY2VfdHlwZSA9PSBBUF9ERVZJQ0VfVFlQRV9QQ0lYQ0MpIHsKKwlzd2l0Y2ggKGFwX2Rldi0+ZGV2aWNlX3R5cGUpIHsKKwljYXNlIEFQX0RFVklDRV9UWVBFX1BDSVhDQzoKIAkJcmMgPSB6Y3J5cHRfcGNpeGNjX21jbChhcF9kZXYpOwogCQlpZiAocmMgPCAwKSB7CiAJCQl6Y3J5cHRfZGV2aWNlX2ZyZWUoemRldik7CkBAIC0xMDQxLDEzICsxMDU1LDI1IEBACiAJCQl6ZGV2LT5taW5fbW9kX3NpemUgPSBQQ0lYQ0NfTUlOX01PRF9TSVpFOwogCQkJemRldi0+bWF4X21vZF9zaXplID0gUENJWENDX01BWF9NT0RfU0laRTsKIAkJfQotCX0gZWxzZSB7CisJCWJyZWFrOworCWNhc2UgQVBfREVWSUNFX1RZUEVfQ0VYMkM6CiAJCXpkZXYtPnVzZXJfc3BhY2VfdHlwZSA9IFpDUllQVF9DRVgyQzsKIAkJemRldi0+dHlwZV9zdHJpbmcgPSAiQ0VYMkMiOwogCQl6ZGV2LT5zcGVlZF9yYXRpbmcgPSBDRVgyQ19TUEVFRF9SQVRJTkc7CiAJCXpkZXYtPm1pbl9tb2Rfc2l6ZSA9IFBDSVhDQ19NSU5fTU9EX1NJWkU7CiAJCXpkZXYtPm1heF9tb2Rfc2l6ZSA9IFBDSVhDQ19NQVhfTU9EX1NJWkU7CisJCWJyZWFrOworCWNhc2UgQVBfREVWSUNFX1RZUEVfQ0VYM0M6CisJCXpkZXYtPnVzZXJfc3BhY2VfdHlwZSA9IFpDUllQVF9DRVgzQzsKKwkJemRldi0+dHlwZV9zdHJpbmcgPSAiQ0VYM0MiOworCQl6ZGV2LT5zcGVlZF9yYXRpbmcgPSBDRVgzQ19TUEVFRF9SQVRJTkc7CisJCXpkZXYtPm1pbl9tb2Rfc2l6ZSA9IENFWDNDX01JTl9NT0RfU0laRTsKKwkJemRldi0+bWF4X21vZF9zaXplID0gQ0VYM0NfTUFYX01PRF9TSVpFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9mcmVlOwogCX0KKwogCXJjID0gemNyeXB0X3BjaXhjY19ybmdfc3VwcG9ydGVkKGFwX2Rldik7CiAJaWYgKHJjIDwgMCkgewogCQl6Y3J5cHRfZGV2aWNlX2ZyZWUoemRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tcGMuaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21wYy5oCmluZGV4IDUyYzAzNDMuLjFiYTUxMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21wYy5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21wYy5oCkBAIC01MjgsNyArNTI4LDcgQEAKIAkJKFBEVV9FTkNBUFNVTEFUSU9OKGJ1ZmZlcikgKyAweDE3KQogI2RlZmluZSBRRVRIX1VMUF9FTkFCTEVfUkVTUF9MSU5LX1RZUEUoYnVmZmVyKSBcCiAJCShQRFVfRU5DQVBTVUxBVElPTihidWZmZXIpICsgMHgyYikKLS8qIExheWVyIDIgZGVmaW50aW9ucyAqLworLyogTGF5ZXIgMiBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBRRVRIX1BST1RfTEFZRVIyIDB4MDgKICNkZWZpbmUgUUVUSF9QUk9UX1RDUElQICAweDAzCiAjZGVmaW5lIFFFVEhfUFJPVF9PU04yICAgMHgwYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKaW5kZXggMjg4OWU1Zi4uOWQwYzk0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSAiemZjcF9leHQuaCIKKyNpbmNsdWRlICJ6ZmNwX2ZjLmgiCiAKICNkZWZpbmUgWkZDUF9CVVNfSURfU0laRQkyMAogCkBAIC04MCw0OCArODEsNDAgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHpmY3BfaW5pdF9kZXZpY2VfY29uZmlndXJlKGNoYXIgKmJ1c2lkLCB1NjQgd3dwbiwgdTY0IGx1bikKIHsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2N3ZGV2OworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0OwogCi0JY2N3ZGV2ID0gZ2V0X2Njd2Rldl9ieV9idXNpZCgmemZjcF9jY3dfZHJpdmVyLCBidXNpZCk7Ci0JaWYgKCFjY3dkZXYpCisJY2RldiA9IGdldF9jY3dkZXZfYnlfYnVzaWQoJnpmY3BfY2N3X2RyaXZlciwgYnVzaWQpOworCWlmICghY2RldikKIAkJcmV0dXJuOwogCi0JaWYgKGNjd19kZXZpY2Vfc2V0X29ubGluZShjY3dkZXYpKQotCQlnb3RvIG91dF9jY3dkZXY7CisJaWYgKGNjd19kZXZpY2Vfc2V0X29ubGluZShjZGV2KSkKKwkJZ290byBvdXRfY2N3X2RldmljZTsKIAotCW11dGV4X2xvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwotCWFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJmNjd2Rldi0+ZGV2KTsKKwlhZGFwdGVyID0gemZjcF9jY3dfYWRhcHRlcl9ieV9jZGV2KGNkZXYpOwogCWlmICghYWRhcHRlcikKLQkJZ290byBvdXRfdW5sb2NrOwotCXpmY3BfYWRhcHRlcl9nZXQoYWRhcHRlcik7CisJCWdvdG8gb3V0X2Njd19kZXZpY2U7CiAKIAlwb3J0ID0gemZjcF9nZXRfcG9ydF9ieV93d3BuKGFkYXB0ZXIsIHd3cG4pOwogCWlmICghcG9ydCkKIAkJZ290byBvdXRfcG9ydDsKIAotCXpmY3BfcG9ydF9nZXQocG9ydCk7CiAJdW5pdCA9IHpmY3BfdW5pdF9lbnF1ZXVlKHBvcnQsIGx1bik7CiAJaWYgKElTX0VSUih1bml0KSkKIAkJZ290byBvdXRfdW5pdDsKLQltdXRleF91bmxvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwogCiAJemZjcF9lcnBfdW5pdF9yZW9wZW4odW5pdCwgMCwgImF1aWRjXzEiLCBOVUxMKTsKIAl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOwogCWZsdXNoX3dvcmsoJnVuaXQtPnNjc2lfd29yayk7CiAKLQltdXRleF9sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLQl6ZmNwX3VuaXRfcHV0KHVuaXQpOwogb3V0X3VuaXQ6Ci0JemZjcF9wb3J0X3B1dChwb3J0KTsKKwlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogb3V0X3BvcnQ6Ci0JemZjcF9hZGFwdGVyX3B1dChhZGFwdGVyKTsKLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLW91dF9jY3dkZXY6Ci0JcHV0X2RldmljZSgmY2N3ZGV2LT5kZXYpOworCXpmY3BfY2N3X2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOworb3V0X2Njd19kZXZpY2U6CisJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKIAlyZXR1cm47CiB9CiAKQEAgLTE2Nyw3ICsxNjAsNyBAQAogCWludCByZXR2YWwgPSAtRU5PTUVNOwogCiAJemZjcF9kYXRhLmdwbl9mdF9jYWNoZSA9IHpmY3BfY2FjaGVfaHdfYWxpZ24oInpmY3BfZ3BuIiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBjdF9pdV9ncG5fZnRfcmVxKSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgemZjcF9mY19ncG5fZnRfcmVxKSk7CiAJaWYgKCF6ZmNwX2RhdGEuZ3BuX2Z0X2NhY2hlKQogCQlnb3RvIG91dDsKIApAQCAtMTgyLDEyICsxNzUsMTQgQEAKIAkJZ290byBvdXRfc3JfY2FjaGU7CiAKIAl6ZmNwX2RhdGEuZ2lkX3BuX2NhY2hlID0gemZjcF9jYWNoZV9od19hbGlnbigiemZjcF9naWQiLAotCQkJCQlzaXplb2Yoc3RydWN0IHpmY3BfZ2lkX3BuX2RhdGEpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB6ZmNwX2ZjX2dpZF9wbikpOwogCWlmICghemZjcF9kYXRhLmdpZF9wbl9jYWNoZSkKIAkJZ290byBvdXRfZ2lkX2NhY2hlOwogCi0JbXV0ZXhfaW5pdCgmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7Ci0Jcndsb2NrX2luaXQoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7CisJemZjcF9kYXRhLmFkaXNjX2NhY2hlID0gemZjcF9jYWNoZV9od19hbGlnbigiemZjcF9hZGlzYyIsCisJCQkJCXNpemVvZihzdHJ1Y3QgemZjcF9mY19lbHNfYWRpc2MpKTsKKwlpZiAoIXpmY3BfZGF0YS5hZGlzY19jYWNoZSkKKwkJZ290byBvdXRfYWRpc2NfY2FjaGU7CiAKIAl6ZmNwX2RhdGEuc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgPQogCQlmY19hdHRhY2hfdHJhbnNwb3J0KCZ6ZmNwX3RyYW5zcG9ydF9mdW5jdGlvbnMpOwpAQCAtMjAwLDcgKzE5NSw3IEBACiAJCWdvdG8gb3V0X21pc2M7CiAJfQogCi0JcmV0dmFsID0gemZjcF9jY3dfcmVnaXN0ZXIoKTsKKwlyZXR2YWwgPSBjY3dfZHJpdmVyX3JlZ2lzdGVyKCZ6ZmNwX2Njd19kcml2ZXIpOwogCWlmIChyZXR2YWwpIHsKIAkJcHJfZXJyKCJUaGUgemZjcCBkZXZpY2UgZHJpdmVyIGNvdWxkIG5vdCByZWdpc3RlciB3aXRoICIKIAkJICAgICAgICJ0aGUgY29tbW9uIEkvTyBsYXllclxuIik7CkBAIC0yMTYsNiArMjExLDggQEAKIG91dF9taXNjOgogCWZjX3JlbGVhc2VfdHJhbnNwb3J0KHpmY3BfZGF0YS5zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSk7CiBvdXRfdHJhbnNwb3J0OgorCWttZW1fY2FjaGVfZGVzdHJveSh6ZmNwX2RhdGEuYWRpc2NfY2FjaGUpOworb3V0X2FkaXNjX2NhY2hlOgogCWttZW1fY2FjaGVfZGVzdHJveSh6ZmNwX2RhdGEuZ2lkX3BuX2NhY2hlKTsKIG91dF9naWRfY2FjaGU6CiAJa21lbV9jYWNoZV9kZXN0cm95KHpmY3BfZGF0YS5zcl9idWZmZXJfY2FjaGUpOwpAQCAtMjI5LDYgKzIyNiwyMCBAQAogCiBtb2R1bGVfaW5pdCh6ZmNwX21vZHVsZV9pbml0KTsKIAorc3RhdGljIHZvaWQgX19leGl0IHpmY3BfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwljY3dfZHJpdmVyX3VucmVnaXN0ZXIoJnpmY3BfY2N3X2RyaXZlcik7CisJbWlzY19kZXJlZ2lzdGVyKCZ6ZmNwX2NmZGNfbWlzYyk7CisJZmNfcmVsZWFzZV90cmFuc3BvcnQoemZjcF9kYXRhLnNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koemZjcF9kYXRhLmFkaXNjX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koemZjcF9kYXRhLmdpZF9wbl9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHpmY3BfZGF0YS5zcl9idWZmZXJfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveSh6ZmNwX2RhdGEucXRjYl9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHpmY3BfZGF0YS5ncG5fZnRfY2FjaGUpOworfQorCittb2R1bGVfZXhpdCh6ZmNwX21vZHVsZV9leGl0KTsKKwogLyoqCiAgKiB6ZmNwX2dldF91bml0X2J5X2x1biAtIGZpbmQgdW5pdCBpbiB1bml0IGxpc3Qgb2YgcG9ydCBieSBGQ1AgTFVOCiAgKiBAcG9ydDogcG9pbnRlciB0byBwb3J0IHRvIHNlYXJjaCBmb3IgdW5pdApAQCAtMjM4LDEyICsyNDksMTggQEAKICAqLwogc3RydWN0IHpmY3BfdW5pdCAqemZjcF9nZXRfdW5pdF9ieV9sdW4oc3RydWN0IHpmY3BfcG9ydCAqcG9ydCwgdTY0IGZjcF9sdW4pCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0X2hlYWQsIGxpc3QpCi0JCWlmICgodW5pdC0+ZmNwX2x1biA9PSBmY3BfbHVuKSAmJgotCQkgICAgIShhdG9taWNfcmVhZCgmdW5pdC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUpKQotCQkgICAgcmV0dXJuIHVuaXQ7CisJcmVhZF9sb2NrX2lycXNhdmUoJnBvcnQtPnVuaXRfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0LCBsaXN0KQorCQlpZiAodW5pdC0+ZmNwX2x1biA9PSBmY3BfbHVuKSB7CisJCQlpZiAoIWdldF9kZXZpY2UoJnVuaXQtPnN5c2ZzX2RldmljZSkpCisJCQkJdW5pdCA9IE5VTEw7CisJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT51bml0X2xpc3RfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIHVuaXQ7CisJCX0KKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT51bml0X2xpc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0yNTcsMTggKzI3NCwzNSBAQAogc3RydWN0IHpmY3BfcG9ydCAqemZjcF9nZXRfcG9ydF9ieV93d3BuKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJCXU2NCB3d3BuKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KQotCQlpZiAoKHBvcnQtPnd3cG4gPT0gd3dwbikgJiYKLQkJICAgICEoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFKSkKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3QsIGxpc3QpCisJCWlmIChwb3J0LT53d3BuID09IHd3cG4pIHsKKwkJCWlmICghZ2V0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKSkKKwkJCQlwb3J0ID0gTlVMTDsKKwkJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gcG9ydDsKKwkJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3Bfc3lzZnNfdW5pdF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKKy8qKgorICogemZjcF91bml0X3JlbGVhc2UgLSBkZXF1ZXVlIHVuaXQKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlCisgKgorICogd2FpdHMgdW50aWwgYWxsIHdvcmsgaXMgZG9uZSBvbiB1bml0IGFuZCByZW1vdmVzIGl0IHRoZW4gZnJvbSB0aGUgdW5pdC0+bGlzdAorICogb2YgdGhlIGFzc29jaWF0ZWQgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgemZjcF91bml0X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCWtmcmVlKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB6ZmNwX3VuaXQsIHN5c2ZzX2RldmljZSkpOworCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgemZjcF91bml0LAorCQkJCQkgICAgICBzeXNmc19kZXZpY2UpOworCisJcHV0X2RldmljZSgmdW5pdC0+cG9ydC0+c3lzZnNfZGV2aWNlKTsKKwlrZnJlZSh1bml0KTsKIH0KIAogLyoqCkBAIC0yNzYsNDMgKzMxMCw0MCBAQAogICogQHBvcnQ6IHBvaW50ZXIgdG8gcG9ydCB3aGVyZSB1bml0IGlzIGFkZGVkCiAgKiBAZmNwX2x1bjogRkNQIExVTiBvZiB1bml0IHRvIGJlIGVucXVldWVkCiAgKiBSZXR1cm5zOiBwb2ludGVyIHRvIGVucXVldWVkIHVuaXQgb24gc3VjY2VzcywgRVJSX1BUUiBvbiBlcnJvcgotICogTG9ja3M6IGNvbmZpZ19tdXRleCBtdXN0IGJlIGhlbGQgdG8gc2VyaWFsaXplIGNoYW5nZXMgdG8gdGhlIHVuaXQgbGlzdAogICoKICAqIFNldHMgdXAgc29tZSB1bml0IGludGVybmFsIHN0cnVjdHVyZXMgYW5kIGNyZWF0ZXMgc3lzZnMgZW50cnkuCiAgKi8KIHN0cnVjdCB6ZmNwX3VuaXQgKnpmY3BfdW5pdF9lbnF1ZXVlKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIHU2NCBmY3BfbHVuKQogewogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CiAKLQlyZWFkX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCWlmICh6ZmNwX2dldF91bml0X2J5X2x1bihwb3J0LCBmY3BfbHVuKSkgewotCQlyZWFkX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWdldF9kZXZpY2UoJnBvcnQtPnN5c2ZzX2RldmljZSk7CisKKwl1bml0ID0gemZjcF9nZXRfdW5pdF9ieV9sdW4ocG9ydCwgZmNwX2x1bik7CisJaWYgKHVuaXQpIHsKKwkJcHV0X2RldmljZSgmdW5pdC0+c3lzZnNfZGV2aWNlKTsKKwkJcmV0dmFsID0gLUVFWElTVDsKKwkJZ290byBlcnJfb3V0OwogCX0KLQlyZWFkX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7CiAKIAl1bml0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpmY3BfdW5pdCksIEdGUF9LRVJORUwpOwogCWlmICghdW5pdCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlhdG9taWNfc2V0KCZ1bml0LT5yZWZjb3VudCwgMCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdW5pdC0+cmVtb3ZlX3dxKTsKLQlJTklUX1dPUksoJnVuaXQtPnNjc2lfd29yaywgemZjcF9zY3NpX3NjYW4pOworCQlnb3RvIGVycl9vdXQ7CiAKIAl1bml0LT5wb3J0ID0gcG9ydDsKIAl1bml0LT5mY3BfbHVuID0gZmNwX2x1bjsKKwl1bml0LT5zeXNmc19kZXZpY2UucGFyZW50ID0gJnBvcnQtPnN5c2ZzX2RldmljZTsKKwl1bml0LT5zeXNmc19kZXZpY2UucmVsZWFzZSA9IHpmY3BfdW5pdF9yZWxlYXNlOwogCiAJaWYgKGRldl9zZXRfbmFtZSgmdW5pdC0+c3lzZnNfZGV2aWNlLCAiMHglMDE2bGx4IiwKIAkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBmY3BfbHVuKSkgewogCQlrZnJlZSh1bml0KTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gZXJyX291dDsKIAl9Ci0JdW5pdC0+c3lzZnNfZGV2aWNlLnBhcmVudCA9ICZwb3J0LT5zeXNmc19kZXZpY2U7Ci0JdW5pdC0+c3lzZnNfZGV2aWNlLnJlbGVhc2UgPSB6ZmNwX3N5c2ZzX3VuaXRfcmVsZWFzZTsKLQlkZXZfc2V0X2RydmRhdGEoJnVuaXQtPnN5c2ZzX2RldmljZSwgdW5pdCk7CisJcmV0dmFsID0gLUVJTlZBTDsKIAotCS8qIG1hcmsgdW5pdCB1bnVzYWJsZSBhcyBsb25nIGFzIHN5c2ZzIHJlZ2lzdHJhdGlvbiBpcyBub3QgY29tcGxldGUgKi8KLQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX1JFTU9WRSwgJnVuaXQtPnN0YXR1cyk7CisJSU5JVF9XT1JLKCZ1bml0LT5zY3NpX3dvcmssIHpmY3Bfc2NzaV9zY2FuKTsKIAogCXNwaW5fbG9ja19pbml0KCZ1bml0LT5sYXRlbmNpZXMubG9jayk7CiAJdW5pdC0+bGF0ZW5jaWVzLndyaXRlLmNoYW5uZWwubWluID0gMHhGRkZGRkZGRjsKQEAgLTMyNCw1MCArMzU1LDMwIEBACiAKIAlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZ1bml0LT5zeXNmc19kZXZpY2UpKSB7CiAJCXB1dF9kZXZpY2UoJnVuaXQtPnN5c2ZzX2RldmljZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmdW5pdC0+c3lzZnNfZGV2aWNlLmtvYmosCi0JCQkgICAgICAgJnpmY3Bfc3lzZnNfdW5pdF9hdHRycykpIHsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoJnVuaXQtPnN5c2ZzX2RldmljZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KKwkJCSAgICAgICAmemZjcF9zeXNmc191bml0X2F0dHJzKSkKKwkJZ290byBlcnJfb3V0X3B1dDsKIAotCXpmY3BfdW5pdF9nZXQodW5pdCk7CisJd3JpdGVfbG9ja19pcnEoJnBvcnQtPnVuaXRfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ1bml0LT5saXN0LCAmcG9ydC0+dW5pdF9saXN0KTsKKwl3cml0ZV91bmxvY2tfaXJxKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CiAKLQl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZ1bml0LT5saXN0LCAmcG9ydC0+dW5pdF9saXN0X2hlYWQpOwotCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZ1bml0LT5zdGF0dXMpOwogCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUlVOTklORywgJnVuaXQtPnN0YXR1cyk7CiAKLQl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCi0JemZjcF9wb3J0X2dldChwb3J0KTsKLQogCXJldHVybiB1bml0OwotfQogCi0vKioKLSAqIHpmY3BfdW5pdF9kZXF1ZXVlIC0gZGVxdWV1ZSB1bml0Ci0gKiBAdW5pdDogcG9pbnRlciB0byB6ZmNwX3VuaXQKLSAqCi0gKiB3YWl0cyB1bnRpbCBhbGwgd29yayBpcyBkb25lIG9uIHVuaXQgYW5kIHJlbW92ZXMgaXQgdGhlbiBmcm9tIHRoZSB1bml0LT5saXN0Ci0gKiBvZiB0aGUgYXNzb2NpYXRlZCBwb3J0LgotICovCi12b2lkIHpmY3BfdW5pdF9kZXF1ZXVlKHN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQpCi17Ci0Jd2FpdF9ldmVudCh1bml0LT5yZW1vdmVfd3EsIGF0b21pY19yZWFkKCZ1bml0LT5yZWZjb3VudCkgPT0gMCk7Ci0Jd3JpdGVfbG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0JbGlzdF9kZWwoJnVuaXQtPmxpc3QpOwotCXdyaXRlX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0JemZjcF9wb3J0X3B1dCh1bml0LT5wb3J0KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnVuaXQtPnN5c2ZzX2RldmljZS5rb2JqLCAmemZjcF9zeXNmc191bml0X2F0dHJzKTsKK2Vycl9vdXRfcHV0OgogCWRldmljZV91bnJlZ2lzdGVyKCZ1bml0LT5zeXNmc19kZXZpY2UpOworZXJyX291dDoKKwlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOworCXJldHVybiBFUlJfUFRSKHJldHZhbCk7CiB9CiAKIHN0YXRpYyBpbnQgemZjcF9hbGxvY2F0ZV9sb3dfbWVtX2J1ZmZlcnMoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKIHsKLQkvKiBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggemZjcF9kYXRhLmNvbmZpZ19tdXRleCB0YWtlbiAqLwogCWFkYXB0ZXItPnBvb2wuZXJwX3JlcSA9CiAJCW1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbCgxLCBzaXplb2Yoc3RydWN0IHpmY3BfZnNmX3JlcSkpOwogCWlmICghYWRhcHRlci0+cG9vbC5lcnBfcmVxKQpAQCAtNDA1LDkgKzQxNiw5IEBACiAJaWYgKCFhZGFwdGVyLT5wb29sLnN0YXR1c19yZWFkX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYWRhcHRlci0+cG9vbC5naWRfcG5fZGF0YSA9CisJYWRhcHRlci0+cG9vbC5naWRfcG4gPQogCQltZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woMSwgemZjcF9kYXRhLmdpZF9wbl9jYWNoZSk7Ci0JaWYgKCFhZGFwdGVyLT5wb29sLmdpZF9wbl9kYXRhKQorCWlmICghYWRhcHRlci0+cG9vbC5naWRfcG4pCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0dXJuIDA7CkBAIC00MTUsNyArNDI2LDYgQEAKIAogc3RhdGljIHZvaWQgemZjcF9mcmVlX2xvd19tZW1fYnVmZmVycyhzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQogewotCS8qIHpmY3BfZGF0YS5jb25maWdfbXV0ZXggbXVzdCBiZSBoZWxkICovCiAJaWYgKGFkYXB0ZXItPnBvb2wuZXJwX3JlcSkKIAkJbWVtcG9vbF9kZXN0cm95KGFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAJaWYgKGFkYXB0ZXItPnBvb2wuc2NzaV9yZXEpCkBAIC00MjgsOCArNDM4LDggQEAKIAkJbWVtcG9vbF9kZXN0cm95KGFkYXB0ZXItPnBvb2wuc3RhdHVzX3JlYWRfcmVxKTsKIAlpZiAoYWRhcHRlci0+cG9vbC5zdGF0dXNfcmVhZF9kYXRhKQogCQltZW1wb29sX2Rlc3Ryb3koYWRhcHRlci0+cG9vbC5zdGF0dXNfcmVhZF9kYXRhKTsKLQlpZiAoYWRhcHRlci0+cG9vbC5naWRfcG5fZGF0YSkKLQkJbWVtcG9vbF9kZXN0cm95KGFkYXB0ZXItPnBvb2wuZ2lkX3BuX2RhdGEpOworCWlmIChhZGFwdGVyLT5wb29sLmdpZF9wbikKKwkJbWVtcG9vbF9kZXN0cm95KGFkYXB0ZXItPnBvb2wuZ2lkX3BuKTsKIH0KIAogLyoqCkBAIC00OTcsNTMgKzUwNyw1NiBAQAogICogemZjcF9hZGFwdGVyX2VucXVldWUgLSBlbnF1ZXVlIGEgbmV3IGFkYXB0ZXIgdG8gdGhlIGxpc3QKICAqIEBjY3dfZGV2aWNlOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgY2NfZGV2aWNlCiAgKgotICogUmV0dXJuczoJMCAgICAgICAgICAgICBpZiBhIG5ldyBhZGFwdGVyIHdhcyBzdWNjZXNzZnVsbHkgZW5xdWV1ZWQKLSAqCQktRU5PTUVNICAgICAgIGlmIGFsbG9jIGZhaWxlZAorICogUmV0dXJuczoJc3RydWN0IHpmY3BfYWRhcHRlcioKICAqIEVucXVldWVzIGFuIGFkYXB0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgYWRhcHRlciBsaXN0IGluIHRoZSBkcml2ZXIgZGF0YS4KICAqIEFsbCBhZGFwdGVyIGludGVybmFsIHN0cnVjdHVyZXMgYXJlIHNldCB1cC4KICAqIFByb2MtZnMgZW50cmllcyBhcmUgYWxzbyBjcmVhdGVkLgotICogbG9ja3M6IGNvbmZpZ19tdXRleCBtdXN0IGJlIGhlbGQgdG8gc2VyaWFsaXplIGNoYW5nZXMgdG8gdGhlIGFkYXB0ZXIgbGlzdAogICovCi1pbnQgemZjcF9hZGFwdGVyX2VucXVldWUoc3RydWN0IGNjd19kZXZpY2UgKmNjd19kZXZpY2UpCitzdHJ1Y3QgemZjcF9hZGFwdGVyICp6ZmNwX2FkYXB0ZXJfZW5xdWV1ZShzdHJ1Y3QgY2N3X2RldmljZSAqY2N3X2RldmljZSkKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyOwogCi0JLyoKLQkgKiBOb3RlOiBJdCBpcyBzYWZlIHRvIHJlbGVhc2UgdGhlIGxpc3RfbG9jaywgYXMgYW55IGxpc3QgY2hhbmdlcwotCSAqIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGNvbmZpZ19tdXRleCwgd2hpY2ggbXVzdCBiZSBoZWxkIHRvIGdldCBoZXJlCi0JICovCisJaWYgKCFnZXRfZGV2aWNlKCZjY3dfZGV2aWNlLT5kZXYpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAogCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgemZjcF9hZGFwdGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGFwdGVyKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcHV0X2RldmljZSgmY2N3X2RldmljZS0+ZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJa3JlZl9pbml0KCZhZGFwdGVyLT5yZWYpOwogCiAJY2N3X2RldmljZS0+aGFuZGxlciA9IE5VTEw7CiAJYWRhcHRlci0+Y2N3X2RldmljZSA9IGNjd19kZXZpY2U7Ci0JYXRvbWljX3NldCgmYWRhcHRlci0+cmVmY291bnQsIDApOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT5zdGF0X3dvcmssIF96ZmNwX3N0YXR1c19yZWFkX3NjaGVkdWxlcik7CisJSU5JVF9XT1JLKCZhZGFwdGVyLT5zY2FuX3dvcmssIHpmY3BfZmNfc2Nhbl9wb3J0cyk7CiAKIAlpZiAoemZjcF9xZGlvX3NldHVwKGFkYXB0ZXIpKQotCQlnb3RvIHFkaW9fZmFpbGVkOworCQlnb3RvIGZhaWxlZDsKIAogCWlmICh6ZmNwX2FsbG9jYXRlX2xvd19tZW1fYnVmZmVycyhhZGFwdGVyKSkKLQkJZ290byBsb3dfbWVtX2J1ZmZlcnNfZmFpbGVkOworCQlnb3RvIGZhaWxlZDsKIAogCWlmICh6ZmNwX3JlcWxpc3RfYWxsb2MoYWRhcHRlcikpCi0JCWdvdG8gbG93X21lbV9idWZmZXJzX2ZhaWxlZDsKKwkJZ290byBmYWlsZWQ7CiAKIAlpZiAoemZjcF9kYmZfYWRhcHRlcl9yZWdpc3RlcihhZGFwdGVyKSkKLQkJZ290byBkZWJ1Z19yZWdpc3Rlcl9mYWlsZWQ7CisJCWdvdG8gZmFpbGVkOwogCiAJaWYgKHpmY3Bfc2V0dXBfYWRhcHRlcl93b3JrX3F1ZXVlKGFkYXB0ZXIpKQotCQlnb3RvIHdvcmtfcXVldWVfZmFpbGVkOworCQlnb3RvIGZhaWxlZDsKIAogCWlmICh6ZmNwX2ZjX2dzX3NldHVwKGFkYXB0ZXIpKQotCQlnb3RvIGdlbmVyaWNfc2VydmljZXNfZmFpbGVkOworCQlnb3RvIGZhaWxlZDsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkYXB0ZXItPnJlbW92ZV93cSk7CisJcndsb2NrX2luaXQoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+cG9ydF9saXN0KTsKKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkYXB0ZXItPmVycF9yZWFkeV93cSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+ZXJwX2RvbmVfd3FoKTsKIAotCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCk7CiAJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmVycF9yZWFkeV9oZWFkKTsKIAlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+ZXJwX3J1bm5pbmdfaGVhZCk7CiAKQEAgLTU1Myw4MyArNTY2LDg1IEBACiAJcndsb2NrX2luaXQoJmFkYXB0ZXItPmFib3J0X2xvY2spOwogCiAJaWYgKHpmY3BfZXJwX3RocmVhZF9zZXR1cChhZGFwdGVyKSkKLQkJZ290byBlcnBfdGhyZWFkX2ZhaWxlZDsKLQotCUlOSVRfV09SSygmYWRhcHRlci0+c3RhdF93b3JrLCBfemZjcF9zdGF0dXNfcmVhZF9zY2hlZHVsZXIpOwotCUlOSVRfV09SSygmYWRhcHRlci0+c2Nhbl93b3JrLCBfemZjcF9mY19zY2FuX3BvcnRzX2xhdGVyKTsKKwkJZ290byBmYWlsZWQ7CiAKIAlhZGFwdGVyLT5zZXJ2aWNlX2xldmVsLnNlcV9wcmludCA9IHpmY3BfcHJpbnRfc2w7CiAKLQkvKiBtYXJrIGFkYXB0ZXIgdW51c2FibGUgYXMgbG9uZyBhcyBzeXNmcyByZWdpc3RyYXRpb24gaXMgbm90IGNvbXBsZXRlICovCi0JYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZhZGFwdGVyLT5zdGF0dXMpOwotCiAJZGV2X3NldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYsIGFkYXB0ZXIpOwogCiAJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2N3X2RldmljZS0+ZGV2LmtvYmosCiAJCQkgICAgICAgJnpmY3Bfc3lzZnNfYWRhcHRlcl9hdHRycykpCi0JCWdvdG8gc3lzZnNfZmFpbGVkOwotCi0JYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX1JFTU9WRSwgJmFkYXB0ZXItPnN0YXR1cyk7CisJCWdvdG8gZmFpbGVkOwogCiAJaWYgKCF6ZmNwX2FkYXB0ZXJfc2NzaV9yZWdpc3RlcihhZGFwdGVyKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBhZGFwdGVyOwogCi1zeXNmc19mYWlsZWQ6Ci0JemZjcF9lcnBfdGhyZWFkX2tpbGwoYWRhcHRlcik7Ci1lcnBfdGhyZWFkX2ZhaWxlZDoKLQl6ZmNwX2ZjX2dzX2Rlc3Ryb3koYWRhcHRlcik7Ci1nZW5lcmljX3NlcnZpY2VzX2ZhaWxlZDoKK2ZhaWxlZDoKKwl6ZmNwX2FkYXB0ZXJfdW5yZWdpc3RlcihhZGFwdGVyKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKwordm9pZCB6ZmNwX2FkYXB0ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gYWRhcHRlci0+Y2N3X2RldmljZTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnNjYW5fd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+c3RhdF93b3JrKTsKIAl6ZmNwX2Rlc3Ryb3lfYWRhcHRlcl93b3JrX3F1ZXVlKGFkYXB0ZXIpOwotd29ya19xdWV1ZV9mYWlsZWQ6CisKKwl6ZmNwX2ZjX3drYV9wb3J0c19mb3JjZV9vZmZsaW5lKGFkYXB0ZXItPmdzKTsKKwl6ZmNwX2FkYXB0ZXJfc2NzaV91bnJlZ2lzdGVyKGFkYXB0ZXIpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2Rldi0+ZGV2LmtvYmosICZ6ZmNwX3N5c2ZzX2FkYXB0ZXJfYXR0cnMpOworCisJemZjcF9lcnBfdGhyZWFkX2tpbGwoYWRhcHRlcik7CiAJemZjcF9kYmZfYWRhcHRlcl91bnJlZ2lzdGVyKGFkYXB0ZXItPmRiZik7Ci1kZWJ1Z19yZWdpc3Rlcl9mYWlsZWQ6Ci0JZGV2X3NldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYsIE5VTEwpOwotCWtmcmVlKGFkYXB0ZXItPnJlcV9saXN0KTsKLWxvd19tZW1fYnVmZmVyc19mYWlsZWQ6Ci0JemZjcF9mcmVlX2xvd19tZW1fYnVmZmVycyhhZGFwdGVyKTsKLXFkaW9fZmFpbGVkOgogCXpmY3BfcWRpb19kZXN0cm95KGFkYXB0ZXItPnFkaW8pOwotCWtmcmVlKGFkYXB0ZXIpOwotCXJldHVybiAtRU5PTUVNOworCisJemZjcF9jY3dfYWRhcHRlcl9wdXQoYWRhcHRlcik7IC8qIGZpbmFsIHB1dCB0byByZWxlYXNlICovCiB9CiAKIC8qKgotICogemZjcF9hZGFwdGVyX2RlcXVldWUgLSByZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbGlzdAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gc3RydWN0IHpmY3BfYWRhcHRlciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICogemZjcF9hZGFwdGVyX3JlbGVhc2UgLSByZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbGlzdAorICogQHJlZjogcG9pbnRlciB0byBzdHJ1Y3Qga3JlZgogICogbG9ja3M6CWFkYXB0ZXIgbGlzdCB3cml0ZSBsb2NrIGlzIGFzc3VtZWQgdG8gYmUgaGVsZCBieSBjYWxsZXIKICAqLwotdm9pZCB6ZmNwX2FkYXB0ZXJfZGVxdWV1ZShzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQordm9pZCB6ZmNwX2FkYXB0ZXJfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqcmVmKQogewotCWludCByZXR2YWwgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCB6ZmNwX2FkYXB0ZXIsCisJCQkJCQkgICAgcmVmKTsKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiA9IGFkYXB0ZXItPmNjd19kZXZpY2U7CiAKLQljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5zdGF0X3dvcmspOwotCXpmY3BfZmNfd2thX3BvcnRzX2ZvcmNlX29mZmxpbmUoYWRhcHRlci0+Z3MpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LmtvYmosCi0JCQkgICAmemZjcF9zeXNmc19hZGFwdGVyX2F0dHJzKTsKIAlkZXZfc2V0X2RydmRhdGEoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwgTlVMTCk7Ci0JLyogc2FuaXR5IGNoZWNrOiBubyBwZW5kaW5nIEZTRiByZXF1ZXN0cyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5yZXFfbGlzdF9sb2NrLCBmbGFncyk7Ci0JcmV0dmFsID0gemZjcF9yZXFsaXN0X2lzZW1wdHkoYWRhcHRlcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cmVxX2xpc3RfbG9jaywgZmxhZ3MpOwotCWlmICghcmV0dmFsKQotCQlyZXR1cm47Ci0KIAl6ZmNwX2ZjX2dzX2Rlc3Ryb3koYWRhcHRlcik7Ci0JemZjcF9lcnBfdGhyZWFkX2tpbGwoYWRhcHRlcik7Ci0JemZjcF9kZXN0cm95X2FkYXB0ZXJfd29ya19xdWV1ZShhZGFwdGVyKTsKLQl6ZmNwX2RiZl9hZGFwdGVyX3VucmVnaXN0ZXIoYWRhcHRlci0+ZGJmKTsKIAl6ZmNwX2ZyZWVfbG93X21lbV9idWZmZXJzKGFkYXB0ZXIpOwotCXpmY3BfcWRpb19kZXN0cm95KGFkYXB0ZXItPnFkaW8pOwogCWtmcmVlKGFkYXB0ZXItPnJlcV9saXN0KTsKIAlrZnJlZShhZGFwdGVyLT5mY19zdGF0cyk7CiAJa2ZyZWUoYWRhcHRlci0+c3RhdHNfcmVzZXRfZGF0YSk7CiAJa2ZyZWUoYWRhcHRlcik7CisJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgemZjcF9zeXNmc19wb3J0X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQorLyoqCisgKiB6ZmNwX2RldmljZV91bnJlZ2lzdGVyIC0gcmVtb3ZlIHBvcnQsIHVuaXQgZnJvbSBzeXN0ZW0KKyAqIEBkZXY6IHJlZmVyZW5jZSB0byBkZXZpY2Ugd2hpY2ggaXMgdG8gYmUgcmVtb3ZlZAorICogQGdycDogcmVsYXRlZCByZWZlcmVuY2UgdG8gYXR0cmlidXRlIGdyb3VwCisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgcG9ydCwgdW5pdCBmcm9tIHN5c3RlbQorICovCit2b2lkIHpmY3BfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmdycCkKIHsKLQlrZnJlZShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgemZjcF9wb3J0LCBzeXNmc19kZXZpY2UpKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgZ3JwKTsKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZmNwX3BvcnRfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHpmY3BfcG9ydCAqcG9ydCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB6ZmNwX3BvcnQsCisJCQkJCSAgICAgIHN5c2ZzX2RldmljZSk7CisKKwl6ZmNwX2Njd19hZGFwdGVyX3B1dChwb3J0LT5hZGFwdGVyKTsKKwlrZnJlZShwb3J0KTsKIH0KIAogLyoqCkBAIC02MzksNyArNjU0LDYgQEAKICAqIEBzdGF0dXM6IGluaXRpYWwgc3RhdHVzIGZvciB0aGUgcG9ydAogICogQGRfaWQ6IGRlc3RpbmF0aW9uIGlkIG9mIHRoZSByZW1vdGUgcG9ydCB0byBiZSBlbnF1ZXVlZAogICogUmV0dXJuczogcG9pbnRlciB0byBlbnF1ZXVlZCBwb3J0IG9uIHN1Y2Nlc3MsIEVSUl9QVFIgb24gZXJyb3IKLSAqIExvY2tzOiBjb25maWdfbXV0ZXggbXVzdCBiZSBoZWxkIHRvIHNlcmlhbGl6ZSBjaGFuZ2VzIHRvIHRoZSBwb3J0IGxpc3QKICAqCiAgKiBBbGwgcG9ydCBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGFyZSBzZXQgdXAgYW5kIHRoZSBzeXNmcyBlbnRyeSBpcyBnZW5lcmF0ZWQuCiAgKiBkX2lkIGlzIHVzZWQgdG8gZW5xdWV1ZSBwb3J0cyB3aXRoIGEgd2VsbCBrbm93biBhZGRyZXNzIGxpa2UgdGhlIERpcmVjdG9yeQpAQCAtNjQ5LDIwICs2NjMsMjQgQEAKIAkJCQkgICAgIHUzMiBzdGF0dXMsIHUzMiBkX2lkKQogewogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CiAKLQlyZWFkX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCWlmICh6ZmNwX2dldF9wb3J0X2J5X3d3cG4oYWRhcHRlciwgd3dwbikpIHsKLQkJcmVhZF91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlrcmVmX2dldCgmYWRhcHRlci0+cmVmKTsKKworCXBvcnQgPSB6ZmNwX2dldF9wb3J0X2J5X3d3cG4oYWRhcHRlciwgd3dwbik7CisJaWYgKHBvcnQpIHsKKwkJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKKwkJcmV0dmFsID0gLUVFWElTVDsKKwkJZ290byBlcnJfb3V0OwogCX0KLQlyZWFkX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7CiAKIAlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpmY3BfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gZXJyX291dDsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPnJlbW92ZV93cSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBvcnQtPnVuaXRfbGlzdF9oZWFkKTsKKwlyd2xvY2tfaW5pdCgmcG9ydC0+dW5pdF9saXN0X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZwb3J0LT51bml0X2xpc3QpOworCiAJSU5JVF9XT1JLKCZwb3J0LT5naWRfcG5fd29yaywgemZjcF9mY19wb3J0X2RpZF9sb29rdXApOwogCUlOSVRfV09SSygmcG9ydC0+dGVzdF9saW5rX3dvcmssIHpmY3BfZmNfbGlua190ZXN0X3dvcmspOwogCUlOSVRfV09SSygmcG9ydC0+cnBvcnRfd29yaywgemZjcF9zY3NpX3Jwb3J0X3dvcmspOwpAQCAtNjcxLDU4ICs2ODksMzggQEAKIAlwb3J0LT5kX2lkID0gZF9pZDsKIAlwb3J0LT53d3BuID0gd3dwbjsKIAlwb3J0LT5ycG9ydF90YXNrID0gUlBPUlRfTk9ORTsKLQotCS8qIG1hcmsgcG9ydCB1bnVzYWJsZSBhcyBsb25nIGFzIHN5c2ZzIHJlZ2lzdHJhdGlvbiBpcyBub3QgY29tcGxldGUgKi8KLQlhdG9taWNfc2V0X21hc2soc3RhdHVzIHwgWkZDUF9TVEFUVVNfQ09NTU9OX1JFTU9WRSwgJnBvcnQtPnN0YXR1cyk7Ci0JYXRvbWljX3NldCgmcG9ydC0+cmVmY291bnQsIDApOworCXBvcnQtPnN5c2ZzX2RldmljZS5wYXJlbnQgPSAmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2OworCXBvcnQtPnN5c2ZzX2RldmljZS5yZWxlYXNlID0gemZjcF9wb3J0X3JlbGVhc2U7CiAKIAlpZiAoZGV2X3NldF9uYW1lKCZwb3J0LT5zeXNmc19kZXZpY2UsICIweCUwMTZsbHgiLAogCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpd3dwbikpIHsKIAkJa2ZyZWUocG9ydCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGVycl9vdXQ7CiAJfQotCXBvcnQtPnN5c2ZzX2RldmljZS5wYXJlbnQgPSAmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2OwotCXBvcnQtPnN5c2ZzX2RldmljZS5yZWxlYXNlID0gemZjcF9zeXNmc19wb3J0X3JlbGVhc2U7Ci0JZGV2X3NldF9kcnZkYXRhKCZwb3J0LT5zeXNmc19kZXZpY2UsIHBvcnQpOworCXJldHZhbCA9IC1FSU5WQUw7CiAKIAlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZwb3J0LT5zeXNmc19kZXZpY2UpKSB7CiAJCXB1dF9kZXZpY2UoJnBvcnQtPnN5c2ZzX2RldmljZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9ydC0+c3lzZnNfZGV2aWNlLmtvYmosCi0JCQkgICAgICAgJnpmY3Bfc3lzZnNfcG9ydF9hdHRycykpIHsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoJnBvcnQtPnN5c2ZzX2RldmljZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KKwkJCSAgICAgICAmemZjcF9zeXNmc19wb3J0X2F0dHJzKSkKKwkJZ290byBlcnJfb3V0X3B1dDsKIAotCXpmY3BfcG9ydF9nZXQocG9ydCk7CisJd3JpdGVfbG9ja19pcnEoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZwb3J0LT5saXN0LCAmYWRhcHRlci0+cG9ydF9saXN0KTsKKwl3cml0ZV91bmxvY2tfaXJxKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jayk7CiAKLQl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZwb3J0LT5saXN0LCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQpOwotCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZwb3J0LT5zdGF0dXMpOwotCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUlVOTklORywgJnBvcnQtPnN0YXR1cyk7CisJYXRvbWljX3NldF9tYXNrKHN0YXR1cyB8IFpGQ1BfU1RBVFVTX0NPTU1PTl9SVU5OSU5HLCAmcG9ydC0+c3RhdHVzKTsKIAotCXdyaXRlX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0KLQl6ZmNwX2FkYXB0ZXJfZ2V0KGFkYXB0ZXIpOwogCXJldHVybiBwb3J0OwotfQogCi0vKioKLSAqIHpmY3BfcG9ydF9kZXF1ZXVlIC0gZGVxdWV1ZXMgYSBwb3J0IGZyb20gdGhlIHBvcnQgbGlzdCBvZiB0aGUgYWRhcHRlcgotICogQHBvcnQ6IHBvaW50ZXIgdG8gc3RydWN0IHpmY3BfcG9ydCB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAotICovCi12b2lkIHpmY3BfcG9ydF9kZXF1ZXVlKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQpCi17Ci0Jd3JpdGVfbG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0JbGlzdF9kZWwoJnBvcnQtPmxpc3QpOwotCXdyaXRlX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0Jd2FpdF9ldmVudChwb3J0LT5yZW1vdmVfd3EsIGF0b21pY19yZWFkKCZwb3J0LT5yZWZjb3VudCkgPT0gMCk7Ci0JY2FuY2VsX3dvcmtfc3luYygmcG9ydC0+cnBvcnRfd29yayk7IC8qIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSAqLwotCXpmY3BfYWRhcHRlcl9wdXQocG9ydC0+YWRhcHRlcik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb3J0LT5zeXNmc19kZXZpY2Uua29iaiwgJnpmY3Bfc3lzZnNfcG9ydF9hdHRycyk7CitlcnJfb3V0X3B1dDoKIAlkZXZpY2VfdW5yZWdpc3RlcigmcG9ydC0+c3lzZnNfZGV2aWNlKTsKK2Vycl9vdXQ6CisJemZjcF9jY3dfYWRhcHRlcl9wdXQoYWRhcHRlcik7CisJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYwppbmRleCBlMDgzMzk0Li5jMjJjYjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2N3LmMKQEAgLTEzLDI4ICsxMywzNCBAQAogCiAjZGVmaW5lIFpGQ1BfTU9ERUxfUFJJViAweDQKIAotc3RhdGljIGludCB6ZmNwX2Njd19zdXNwZW5kKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQorc3RhdGljIERFRklORV9TUElOTE9DSyh6ZmNwX2Njd19hZGFwdGVyX3JlZl9sb2NrKTsKIAorc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9jY3dfYWRhcHRlcl9ieV9jZGV2KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJmNkZXYtPmRldik7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFhZGFwdGVyKQotCQlyZXR1cm4gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmemZjcF9jY3dfYWRhcHRlcl9yZWZfbG9jaywgZmxhZ3MpOworCWFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJmNkZXYtPmRldik7CisJaWYgKGFkYXB0ZXIpCisJCWtyZWZfZ2V0KCZhZGFwdGVyLT5yZWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfY2N3X2FkYXB0ZXJfcmVmX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYWRhcHRlcjsKK30KIAotCW11dGV4X2xvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwordm9pZCB6ZmNwX2Njd19hZGFwdGVyX3B1dChzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDAsICJjY3N1c3AxIiwgTlVMTCk7Ci0JemZjcF9lcnBfd2FpdChhZGFwdGVyKTsKLQotCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7Ci0KLQlyZXR1cm4gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmemZjcF9jY3dfYWRhcHRlcl9yZWZfbG9jaywgZmxhZ3MpOworCWtyZWZfcHV0KCZhZGFwdGVyLT5yZWYsIHpmY3BfYWRhcHRlcl9yZWxlYXNlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ZmNwX2Njd19hZGFwdGVyX3JlZl9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgemZjcF9jY3dfYWN0aXZhdGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiAKIHsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjZGV2LT5kZXYpOworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSB6ZmNwX2Njd19hZGFwdGVyX2J5X2NkZXYoY2Rldik7CiAKIAlpZiAoIWFkYXB0ZXIpCiAJCXJldHVybiAwOwpAQCAtNDYsNiArNTIsOCBAQAogCXpmY3BfZXJwX3dhaXQoYWRhcHRlcik7CiAJZmx1c2hfd29yaygmYWRhcHRlci0+c2Nhbl93b3JrKTsKIAorCXpmY3BfY2N3X2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY3LDI4ICs3NSwyOCBAQAogCiAvKioKICAqIHpmY3BfY2N3X3Byb2JlIC0gcHJvYmUgZnVuY3Rpb24gb2YgemZjcCBkcml2ZXIKLSAqIEBjY3dfZGV2aWNlOiBwb2ludGVyIHRvIGJlbG9uZ2luZyBjY3cgZGV2aWNlCisgKiBAY2RldjogcG9pbnRlciB0byBiZWxvbmdpbmcgY2N3IGRldmljZQogICoKICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYnkgdGhlIGNvbW1vbiBpL28gbGF5ZXIgZm9yIGVhY2ggRkNQCiAgKiBkZXZpY2UgZm91bmQgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiBUaGlzIGlzIG9ubHkgYSBzdHViIHRvIG1ha2UgY2lvCiAgKiB3b3JrOiBUbyBvbmx5IGFsbG9jYXRlIGFkYXB0ZXIgcmVzb3VyY2VzIGZvciBkZXZpY2VzIGFjdHVhbGx5IHVzZWQsCiAgKiB0aGUgYWxsb2NhdGlvbiBpcyBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCB0byBjY3dfc2V0X29ubGluZS4KICAqLwotc3RhdGljIGludCB6ZmNwX2Njd19wcm9iZShzdHJ1Y3QgY2N3X2RldmljZSAqY2N3X2RldmljZSkKK3N0YXRpYyBpbnQgemZjcF9jY3dfcHJvYmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogemZjcF9jY3dfcmVtb3ZlIC0gcmVtb3ZlIGZ1bmN0aW9uIG9mIHpmY3AgZHJpdmVyCi0gKiBAY2N3X2RldmljZTogcG9pbnRlciB0byBiZWxvbmdpbmcgY2N3IGRldmljZQorICogQGNkZXY6IHBvaW50ZXIgdG8gYmVsb25naW5nIGNjdyBkZXZpY2UKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBjb21tb24gaS9vIGxheWVyIGFuZCByZW1vdmVzIGFuIGFkYXB0ZXIKICAqIGZyb20gdGhlIHN5c3RlbS4gVGFzayBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdldCByaWQgb2YgYWxsIHVuaXRzIGFuZAogICogcG9ydHMgdGhhdCBiZWxvbmcgdG8gdGhpcyBhZGFwdGVyLiBBbmQgaW4gYWRkaXRpb24gYWxsIHJlc291cmNlcyBvZiB0aGlzCiAgKiBhZGFwdGVyIHdpbGwgYmUgZnJlZWQgdG9vLgogICovCi1zdGF0aWMgdm9pZCB6ZmNwX2Njd19yZW1vdmUoc3RydWN0IGNjd19kZXZpY2UgKmNjd19kZXZpY2UpCitzdGF0aWMgdm9pZCB6ZmNwX2Njd19yZW1vdmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LCAqcDsKQEAgLTk2LDQ5ICsxMDQsMzcgQEAKIAlMSVNUX0hFQUQodW5pdF9yZW1vdmVfbGgpOwogCUxJU1RfSEVBRChwb3J0X3JlbW92ZV9saCk7CiAKLQljY3dfZGV2aWNlX3NldF9vZmZsaW5lKGNjd19kZXZpY2UpOworCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2Rldik7CiAKLQltdXRleF9sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLQlhZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYpOworCWFkYXB0ZXIgPSB6ZmNwX2Njd19hZGFwdGVyX2J5X2NkZXYoY2Rldik7CiAJaWYgKCFhZGFwdGVyKQotCQlnb3RvIG91dDsKLQltdXRleF91bmxvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOworCQlyZXR1cm47CiAKLQljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5zY2FuX3dvcmspOwotCi0JbXV0ZXhfbG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7Ci0KLQkvKiB0aGlzIGFsc28gcmVtb3ZlcyB0aGUgc2NzaSBkZXZpY2VzLCBzbyBjYWxsIGl0IGZpcnN0ICovCi0JemZjcF9hZGFwdGVyX3Njc2lfdW5yZWdpc3RlcihhZGFwdGVyKTsKLQotCXdyaXRlX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCBwLCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVuaXQsIHUsICZwb3J0LT51bml0X2xpc3RfaGVhZCwgbGlzdCkgeworCXdyaXRlX2xvY2tfaXJxKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcnQsIHAsICZhZGFwdGVyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJd3JpdGVfbG9jaygmcG9ydC0+dW5pdF9saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW5pdCwgdSwgJnBvcnQtPnVuaXRfbGlzdCwgbGlzdCkKIAkJCWxpc3RfbW92ZSgmdW5pdC0+bGlzdCwgJnVuaXRfcmVtb3ZlX2xoKTsKLQkJCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFLAotCQkJCQkmdW5pdC0+c3RhdHVzKTsKLQkJfQorCQl3cml0ZV91bmxvY2soJnBvcnQtPnVuaXRfbGlzdF9sb2NrKTsKIAkJbGlzdF9tb3ZlKCZwb3J0LT5saXN0LCAmcG9ydF9yZW1vdmVfbGgpOwotCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX1JFTU9WRSwgJnBvcnQtPnN0YXR1cyk7CiAJfQotCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFLCAmYWRhcHRlci0+c3RhdHVzKTsKLQl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOworCXdyaXRlX3VubG9ja19pcnEoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrKTsKKwl6ZmNwX2Njd19hZGFwdGVyX3B1dChhZGFwdGVyKTsgLyogcHV0IGZyb20gemZjcF9jY3dfYWRhcHRlcl9ieV9jZGV2ICovCiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgcCwgJnBvcnRfcmVtb3ZlX2xoLCBsaXN0KSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1bml0LCB1LCAmdW5pdF9yZW1vdmVfbGgsIGxpc3QpCi0JCQl6ZmNwX3VuaXRfZGVxdWV1ZSh1bml0KTsKLQkJemZjcF9wb3J0X2RlcXVldWUocG9ydCk7Ci0JfQotCXdhaXRfZXZlbnQoYWRhcHRlci0+cmVtb3ZlX3dxLCBhdG9taWNfcmVhZCgmYWRhcHRlci0+cmVmY291bnQpID09IDApOwotCXpmY3BfYWRhcHRlcl9kZXF1ZXVlKGFkYXB0ZXIpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1bml0LCB1LCAmdW5pdF9yZW1vdmVfbGgsIGxpc3QpCisJCXpmY3BfZGV2aWNlX3VucmVnaXN0ZXIoJnVuaXQtPnN5c2ZzX2RldmljZSwKKwkJCQkgICAgICAgJnpmY3Bfc3lzZnNfdW5pdF9hdHRycyk7CiAKLW91dDoKLQltdXRleF91bmxvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCBwLCAmcG9ydF9yZW1vdmVfbGgsIGxpc3QpCisJCXpmY3BfZGV2aWNlX3VucmVnaXN0ZXIoJnBvcnQtPnN5c2ZzX2RldmljZSwKKwkJCQkgICAgICAgJnpmY3Bfc3lzZnNfcG9ydF9hdHRycyk7CisKKwl6ZmNwX2FkYXB0ZXJfdW5yZWdpc3RlcihhZGFwdGVyKTsKIH0KIAogLyoqCiAgKiB6ZmNwX2Njd19zZXRfb25saW5lIC0gc2V0X29ubGluZSBmdW5jdGlvbiBvZiB6ZmNwIGRyaXZlcgotICogQGNjd19kZXZpY2U6IHBvaW50ZXIgdG8gYmVsb25naW5nIGNjdyBkZXZpY2UKKyAqIEBjZGV2OiBwb2ludGVyIHRvIGJlbG9uZ2luZyBjY3cgZGV2aWNlCiAgKgogICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBieSB0aGUgY29tbW9uIGkvbyBsYXllciBhbmQgc2V0cyBhbgogICogYWRhcHRlciBpbnRvIHN0YXRlIG9ubGluZS4gIFRoZSBmaXJzdCBjYWxsIHdpbGwgYWxsb2NhdGUgYWxsCkBAIC0xNDksMjMgKzE0NSwyMCBAQAogICogdGhlIFNDU0kgc3RhY2ssIHRoYXQgdGhlIFFESU8gcXVldWVzIHdpbGwgYmUgc2V0IHVwIGFuZCB0aGF0IHRoZQogICogYWRhcHRlciB3aWxsIGJlIG9wZW5lZC4KICAqLwotc3RhdGljIGludCB6ZmNwX2Njd19zZXRfb25saW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjY3dfZGV2aWNlKQorc3RhdGljIGludCB6ZmNwX2Njd19zZXRfb25saW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLQlhZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYpOworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSB6ZmNwX2Njd19hZGFwdGVyX2J5X2NkZXYoY2Rldik7CiAKIAlpZiAoIWFkYXB0ZXIpIHsKLQkJcmV0ID0gemZjcF9hZGFwdGVyX2VucXVldWUoY2N3X2RldmljZSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJmNjd19kZXZpY2UtPmRldiwKKwkJYWRhcHRlciA9IHpmY3BfYWRhcHRlcl9lbnF1ZXVlKGNkZXYpOworCisJCWlmIChJU19FUlIoYWRhcHRlcikpIHsKKwkJCWRldl9lcnIoJmNkZXYtPmRldiwKIAkJCQkiU2V0dGluZyB1cCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSAiCiAJCQkJIkZDUCBhZGFwdGVyIGZhaWxlZFxuIik7Ci0JCQlnb3RvIG91dDsKKwkJCXJldHVybiBQVFJfRVJSKGFkYXB0ZXIpOwogCQl9Ci0JCWFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJmNjd19kZXZpY2UtPmRldik7CisJCWtyZWZfZ2V0KCZhZGFwdGVyLT5yZWYpOwogCX0KIAogCS8qIGluaXRpYWxpemUgcmVxdWVzdCBjb3VudGVyICovCkBAIC0xNzcsNTggKzE3MCw2MSBAQAogCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKGFkYXB0ZXIsIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfRkFJTEVELAogCQkJCSJjY3NvbmwyIiwgTlVMTCk7CiAJemZjcF9lcnBfd2FpdChhZGFwdGVyKTsKLW91dDoKLQltdXRleF91bmxvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwotCWlmICghcmV0KQotCQlmbHVzaF93b3JrKCZhZGFwdGVyLT5zY2FuX3dvcmspOwotCXJldHVybiByZXQ7CisKKwlmbHVzaF93b3JrKCZhZGFwdGVyLT5zY2FuX3dvcmspOworCisJemZjcF9jY3dfYWRhcHRlcl9wdXQoYWRhcHRlcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogemZjcF9jY3dfc2V0X29mZmxpbmUgLSBzZXRfb2ZmbGluZSBmdW5jdGlvbiBvZiB6ZmNwIGRyaXZlcgotICogQGNjd19kZXZpY2U6IHBvaW50ZXIgdG8gYmVsb25naW5nIGNjdyBkZXZpY2UKKyAqIEBjZGV2OiBwb2ludGVyIHRvIGJlbG9uZ2luZyBjY3cgZGV2aWNlCiAgKgogICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBieSB0aGUgY29tbW9uIGkvbyBsYXllciBhbmQgc2V0cyBhbiBhZGFwdGVyCiAgKiBpbnRvIHN0YXRlIG9mZmxpbmUuCiAgKi8KLXN0YXRpYyBpbnQgemZjcF9jY3dfc2V0X29mZmxpbmUoc3RydWN0IGNjd19kZXZpY2UgKmNjd19kZXZpY2UpCitzdGF0aWMgaW50IHpmY3BfY2N3X3NldF9vZmZsaW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHpmY3BfY2N3X2FkYXB0ZXJfYnlfY2RldihjZGV2KTsKIAotCW11dGV4X2xvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwotCWFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJmNjd19kZXZpY2UtPmRldik7CisJaWYgKCFhZGFwdGVyKQorCQlyZXR1cm4gMDsKKwogCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgImNjc29mZjEiLCBOVUxMKTsKIAl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOwotCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CisKKwl6ZmNwX2Njd19hZGFwdGVyX3B1dChhZGFwdGVyKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiB6ZmNwX2Njd19ub3RpZnkgLSBjY3cgbm90aWZ5IGZ1bmN0aW9uCi0gKiBAY2N3X2RldmljZTogcG9pbnRlciB0byBiZWxvbmdpbmcgY2N3IGRldmljZQorICogQGNkZXY6IHBvaW50ZXIgdG8gYmVsb25naW5nIGNjdyBkZXZpY2UKICAqIEBldmVudDogaW5kaWNhdGVzIGlmIGFkYXB0ZXIgd2FzIGRldGFjaGVkIG9yIGF0dGFjaGVkCiAgKgogICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBieSB0aGUgY29tbW9uIGkvbyBsYXllciBpZiBhbiBhZGFwdGVyIGhhcyBnb25lCiAgKiBvciByZWFwcGVhcmVkLgogICovCi1zdGF0aWMgaW50IHpmY3BfY2N3X25vdGlmeShzdHJ1Y3QgY2N3X2RldmljZSAqY2N3X2RldmljZSwgaW50IGV2ZW50KQorc3RhdGljIGludCB6ZmNwX2Njd19ub3RpZnkoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBldmVudCkKIHsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYpOworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSB6ZmNwX2Njd19hZGFwdGVyX2J5X2NkZXYoY2Rldik7CisKKwlpZiAoIWFkYXB0ZXIpCisJCXJldHVybiAxOwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgQ0lPX0dPTkU6Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIlRoZSBGQ1AgZGV2aWNlIGhhcyBiZWVuIGRldGFjaGVkXG4iKTsKKwkJZGV2X3dhcm4oJmNkZXYtPmRldiwgIlRoZSBGQ1AgZGV2aWNlIGhhcyBiZWVuIGRldGFjaGVkXG4iKTsKIAkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCAiY2Nub3RpMSIsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIENJT19OT19QQVRIOgotCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAorCQlkZXZfd2FybigmY2Rldi0+ZGV2LAogCQkJICJUaGUgQ0hQSUQgZm9yIHRoZSBGQ1AgZGV2aWNlIGlzIG9mZmxpbmVcbiIpOwogCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDAsICJjY25vdGkyIiwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgQ0lPX09QRVI6Ci0JCWRldl9pbmZvKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIlRoZSBGQ1AgZGV2aWNlIGlzIG9wZXJhdGlvbmFsIGFnYWluXG4iKTsKKwkJZGV2X2luZm8oJmNkZXYtPmRldiwgIlRoZSBGQ1AgZGV2aWNlIGlzIG9wZXJhdGlvbmFsIGFnYWluXG4iKTsKIAkJemZjcF9lcnBfbW9kaWZ5X2FkYXB0ZXJfc3RhdHVzKGFkYXB0ZXIsICJjY25vdGkzIiwgTlVMTCwKIAkJCQkJICAgICAgIFpGQ1BfU1RBVFVTX0NPTU1PTl9SVU5OSU5HLAogCQkJCQkgICAgICAgWkZDUF9TRVQpOwpAQCAtMjM2LDExICsyMzIsMTMgQEAKIAkJCQkJImNjbm90aTQiLCBOVUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBDSU9fQk9YRUQ6Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsICJUaGUgRkNQIGRldmljZSAiCi0JCQkgImRpZCBub3QgcmVzcG9uZCB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lXG4iKTsKKwkJZGV2X3dhcm4oJmNkZXYtPmRldiwgIlRoZSBGQ1AgZGV2aWNlIGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gIgorCQkJCSAgICAgInRoZSBzcGVjaWZpZWQgdGltZVxuIik7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgImNjbm90aTUiLCBOVUxMKTsKIAkJYnJlYWs7CiAJfQorCisJemZjcF9jY3dfYWRhcHRlcl9wdXQoYWRhcHRlcik7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTI1MCwxOCArMjQ4LDE2IEBACiAgKi8KIHN0YXRpYyB2b2lkIHpmY3BfY2N3X3NodXRkb3duKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHpmY3BfY2N3X2FkYXB0ZXJfYnlfY2RldihjZGV2KTsKIAotCW11dGV4X2xvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwotCWFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJmNkZXYtPmRldik7CiAJaWYgKCFhZGFwdGVyKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCAiY2NzaHV0MSIsIE5VTEwpOwogCXpmY3BfZXJwX3dhaXQoYWRhcHRlcik7CiAJemZjcF9lcnBfdGhyZWFkX2tpbGwoYWRhcHRlcik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKKworCXpmY3BfY2N3X2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOwogfQogCiBzdHJ1Y3QgY2N3X2RyaXZlciB6ZmNwX2Njd19kcml2ZXIgPSB7CkBAIC0yNzQsMTggKzI3MCw3IEBACiAJLnNldF9vZmZsaW5lID0gemZjcF9jY3dfc2V0X29mZmxpbmUsCiAJLm5vdGlmeSAgICAgID0gemZjcF9jY3dfbm90aWZ5LAogCS5zaHV0ZG93biAgICA9IHpmY3BfY2N3X3NodXRkb3duLAotCS5mcmVlemUgICAgICA9IHpmY3BfY2N3X3N1c3BlbmQsCisJLmZyZWV6ZSAgICAgID0gemZjcF9jY3dfc2V0X29mZmxpbmUsCiAJLnRoYXcJICAgICA9IHpmY3BfY2N3X2FjdGl2YXRlLAogCS5yZXN0b3JlICAgICA9IHpmY3BfY2N3X2FjdGl2YXRlLAogfTsKLQotLyoqCi0gKiB6ZmNwX2Njd19yZWdpc3RlciAtIGNjdyByZWdpc3RlciBmdW5jdGlvbgotICoKLSAqIFJlZ2lzdGVycyB0aGUgZHJpdmVyIGF0IHRoZSBjb21tb24gaS9vIGxheWVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi0gKiBhdCBtb2R1bGUgbG9hZCB0aW1lL3N5c3RlbSBzdGFydC4KLSAqLwotaW50IF9faW5pdCB6ZmNwX2Njd19yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiBjY3dfZHJpdmVyX3JlZ2lzdGVyKCZ6ZmNwX2Njd19kcml2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jZmRjLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYwppbmRleCBlZjY4MWRmLi5mOTMyNDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYwpAQCAtODYsMjIgKzg2LDE3IEBACiBzdGF0aWMgc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9jZmRjX2dldF9hZGFwdGVyKHUzMiBkZXZubykKIHsKIAljaGFyIGJ1c2lkWzldOwotCXN0cnVjdCBjY3dfZGV2aWNlICpjY3dkZXY7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKIAogCXNucHJpbnRmKGJ1c2lkLCBzaXplb2YoYnVzaWQpLCAiMC4wLiUwNHgiLCBkZXZubyk7Ci0JY2N3ZGV2ID0gZ2V0X2Njd2Rldl9ieV9idXNpZCgmemZjcF9jY3dfZHJpdmVyLCBidXNpZCk7Ci0JaWYgKCFjY3dkZXYpCi0JCWdvdG8gb3V0OworCWNkZXYgPSBnZXRfY2N3ZGV2X2J5X2J1c2lkKCZ6ZmNwX2Njd19kcml2ZXIsIGJ1c2lkKTsKKwlpZiAoIWNkZXYpCisJCXJldHVybiBOVUxMOwogCi0JYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YSgmY2N3ZGV2LT5kZXYpOwotCWlmICghYWRhcHRlcikKLQkJZ290byBvdXRfcHV0OworCWFkYXB0ZXIgPSB6ZmNwX2Njd19hZGFwdGVyX2J5X2NkZXYoY2Rldik7CiAKLQl6ZmNwX2FkYXB0ZXJfZ2V0KGFkYXB0ZXIpOwotb3V0X3B1dDoKLQlwdXRfZGV2aWNlKCZjY3dkZXYtPmRldik7Ci1vdXQ6CisJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKIAlyZXR1cm4gYWRhcHRlcjsKIH0KIApAQCAtMjEyLDcgKzIwNyw2IEBACiAJCXJldHZhbCA9IC1FTlhJTzsKIAkJZ290byBmcmVlX2J1ZmZlcjsKIAl9Ci0JemZjcF9hZGFwdGVyX2dldChhZGFwdGVyKTsKIAogCXJldHZhbCA9IHpmY3BfY2ZkY19zZ19zZXR1cChkYXRhLT5jb21tYW5kLCBmc2ZfY2ZkYy0+c2csCiAJCQkJICAgIGRhdGFfdXNlci0+Y29udHJvbF9maWxlKTsKQEAgLTI0NSw3ICsyMzksNyBAQAogIGZyZWVfc2c6CiAJemZjcF9zZ19mcmVlX3RhYmxlKGZzZl9jZmRjLT5zZywgWkZDUF9DRkRDX1BBR0VTKTsKICBhZGFwdGVyX3B1dDoKLQl6ZmNwX2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOworCXpmY3BfY2N3X2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOwogIGZyZWVfYnVmZmVyOgogCWtmcmVlKGRhdGEpOwogIG5vX21lbV9zZW5zZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jCmluZGV4IDIxNWI3MDcuLjg0NDUwOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogI2luY2x1ZGUgInpmY3BfZGJmLmgiCiAjaW5jbHVkZSAiemZjcF9leHQuaCIKKyNpbmNsdWRlICJ6ZmNwX2ZjLmgiCiAKIHN0YXRpYyB1MzIgZGJmc2l6ZSA9IDQ7CiAKQEAgLTE3Nyw4ICsxNzgsNyBAQAogCiAJY2FzZSBGU0ZfUVRDQl9TRU5EX0VMUzoKIAkJc2VuZF9lbHMgPSAoc3RydWN0IHpmY3Bfc2VuZF9lbHMgKilmc2ZfcmVxLT5kYXRhOwotCQlyZXNwb25zZS0+dS5lbHMuZF9pZCA9IHF0Y2ItPmJvdHRvbS5zdXBwb3J0LmRfaWQ7Ci0JCXJlc3BvbnNlLT51LmVscy5sc19jb2RlID0gc2VuZF9lbHMtPmxzX2NvZGUgPj4gMjQ7CisJCXJlc3BvbnNlLT51LmVscy5kX2lkID0gbnRvaDI0KHF0Y2ItPmJvdHRvbS5zdXBwb3J0LmRfaWQpOwogCQlicmVhazsKIAogCWNhc2UgRlNGX1FUQ0JfQUJPUlRfRkNQX0NNTkQ6CkBAIC0zNDgsNyArMzQ4LDYgQEAKIAogCWNhc2UgRlNGX1FUQ0JfU0VORF9FTFM6CiAJCXpmY3BfZGJmX291dChwLCAiZF9pZCIsICIweCUwNngiLCByLT51LmVscy5kX2lkKTsKLQkJemZjcF9kYmZfb3V0KHAsICJsc19jb2RlIiwgIjB4JTAyeCIsIHItPnUuZWxzLmxzX2NvZGUpOwogCQlicmVhazsKIAogCWNhc2UgRlNGX1FUQ0JfQUJPUlRfRkNQX0NNTkQ6CkBAIC02NzcsMTQgKzY3NiwxNCBAQAogLyoqCiAgKiB6ZmNwX2RiZl9zYW5fY3RfcmVxdWVzdCAtIHRyYWNlIGV2ZW50IGZvciBpc3N1ZWQgQ1QgcmVxdWVzdAogICogQGZzZl9yZXE6IHJlcXVlc3QgY29udGFpbmluZyBpc3N1ZWQgQ1QgZGF0YQorICogQGRfaWQ6IGRlc3RpbmF0aW9uIGlkIHdoZXJlIGN0IHJlcXVlc3QgaXMgc2VudCB0bwogICovCi12b2lkIHpmY3BfZGJmX3Nhbl9jdF9yZXF1ZXN0KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXEpCit2b2lkIHpmY3BfZGJmX3Nhbl9jdF9yZXF1ZXN0KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXEsIHUzMiBkX2lkKQogewotCXN0cnVjdCB6ZmNwX3NlbmRfY3QgKmN0ID0gKHN0cnVjdCB6ZmNwX3NlbmRfY3QgKilmc2ZfcmVxLT5kYXRhOwotCXN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCA9IGN0LT53a2FfcG9ydDsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gd2thX3BvcnQtPmFkYXB0ZXI7CisJc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqY3QgPSAoc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqKWZzZl9yZXEtPmRhdGE7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGZzZl9yZXEtPmFkYXB0ZXI7CiAJc3RydWN0IHpmY3BfZGJmICpkYmYgPSBhZGFwdGVyLT5kYmY7Ci0Jc3RydWN0IGN0X2hkciAqaGRyID0gc2dfdmlydChjdC0+cmVxKTsKKwlzdHJ1Y3QgZmNfY3RfaGRyICpoZHIgPSBzZ192aXJ0KGN0LT5yZXEpOwogCXN0cnVjdCB6ZmNwX2RiZl9zYW5fcmVjb3JkICpyID0gJmRiZi0+c2FuX2J1ZjsKIAlzdHJ1Y3QgemZjcF9kYmZfc2FuX3JlY29yZF9jdF9yZXF1ZXN0ICpvY3QgPSAmci0+dS5jdF9yZXE7CiAJaW50IGxldmVsID0gMzsKQEAgLTY5NSwxOSArNjk0LDE4IEBACiAJc3RybmNweShyLT50YWcsICJvY3RjIiwgWkZDUF9EQkZfVEFHX1NJWkUpOwogCXItPmZzZl9yZXFpZCA9IGZzZl9yZXEtPnJlcV9pZDsKIAlyLT5mc2Zfc2Vxbm8gPSBmc2ZfcmVxLT5zZXFfbm87Ci0Jci0+c19pZCA9IGZjX2hvc3RfcG9ydF9pZChhZGFwdGVyLT5zY3NpX2hvc3QpOwotCXItPmRfaWQgPSB3a2FfcG9ydC0+ZF9pZDsKLQlvY3QtPmNtZF9yZXFfY29kZSA9IGhkci0+Y21kX3JzcF9jb2RlOwotCW9jdC0+cmV2aXNpb24gPSBoZHItPnJldmlzaW9uOwotCW9jdC0+Z3NfdHlwZSA9IGhkci0+Z3NfdHlwZTsKLQlvY3QtPmdzX3N1YnR5cGUgPSBoZHItPmdzX3N1YnR5cGU7Ci0Jb2N0LT5vcHRpb25zID0gaGRyLT5vcHRpb25zOwotCW9jdC0+bWF4X3Jlc19zaXplID0gaGRyLT5tYXhfcmVzX3NpemU7Ci0Jb2N0LT5sZW4gPSBtaW4oKGludCljdC0+cmVxLT5sZW5ndGggLSAoaW50KXNpemVvZihzdHJ1Y3QgY3RfaGRyKSwKKwlvY3QtPmRfaWQgPSBkX2lkOworCW9jdC0+Y21kX3JlcV9jb2RlID0gaGRyLT5jdF9jbWQ7CisJb2N0LT5yZXZpc2lvbiA9IGhkci0+Y3RfcmV2OworCW9jdC0+Z3NfdHlwZSA9IGhkci0+Y3RfZnNfdHlwZTsKKwlvY3QtPmdzX3N1YnR5cGUgPSBoZHItPmN0X2ZzX3N1YnR5cGU7CisJb2N0LT5vcHRpb25zID0gaGRyLT5jdF9vcHRpb25zOworCW9jdC0+bWF4X3Jlc19zaXplID0gaGRyLT5jdF9tcl9zaXplOworCW9jdC0+bGVuID0gbWluKChpbnQpY3QtPnJlcS0+bGVuZ3RoIC0gKGludClzaXplb2Yoc3RydWN0IGZjX2N0X2hkciksCiAJCSAgICAgICBaRkNQX0RCRl9TQU5fTUFYX1BBWUxPQUQpOwogCWRlYnVnX2V2ZW50KGRiZi0+c2FuLCBsZXZlbCwgciwgc2l6ZW9mKCpyKSk7CiAJemZjcF9kYmZfaGV4ZHVtcChkYmYtPnNhbiwgciwgc2l6ZW9mKCpyKSwgbGV2ZWwsCi0JCQkgKHZvaWQgKiloZHIgKyBzaXplb2Yoc3RydWN0IGN0X2hkciksIG9jdC0+bGVuKTsKKwkJCSAodm9pZCAqKWhkciArIHNpemVvZihzdHJ1Y3QgZmNfY3RfaGRyKSwgb2N0LT5sZW4pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiZi0+c2FuX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtNzE3LDEwICs3MTUsOSBAQAogICovCiB2b2lkIHpmY3BfZGJmX3Nhbl9jdF9yZXNwb25zZShzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxKQogewotCXN0cnVjdCB6ZmNwX3NlbmRfY3QgKmN0ID0gKHN0cnVjdCB6ZmNwX3NlbmRfY3QgKilmc2ZfcmVxLT5kYXRhOwotCXN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCA9IGN0LT53a2FfcG9ydDsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gd2thX3BvcnQtPmFkYXB0ZXI7Ci0Jc3RydWN0IGN0X2hkciAqaGRyID0gc2dfdmlydChjdC0+cmVzcCk7CisJc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqY3QgPSAoc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqKWZzZl9yZXEtPmRhdGE7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGZzZl9yZXEtPmFkYXB0ZXI7CisJc3RydWN0IGZjX2N0X2hkciAqaGRyID0gc2dfdmlydChjdC0+cmVzcCk7CiAJc3RydWN0IHpmY3BfZGJmICpkYmYgPSBhZGFwdGVyLT5kYmY7CiAJc3RydWN0IHpmY3BfZGJmX3Nhbl9yZWNvcmQgKnIgPSAmZGJmLT5zYW5fYnVmOwogCXN0cnVjdCB6ZmNwX2RiZl9zYW5fcmVjb3JkX2N0X3Jlc3BvbnNlICpyY3QgPSAmci0+dS5jdF9yZXNwOwpAQCAtNzMyLDI1ICs3MjksMjMgQEAKIAlzdHJuY3B5KHItPnRhZywgInJjdGMiLCBaRkNQX0RCRl9UQUdfU0laRSk7CiAJci0+ZnNmX3JlcWlkID0gZnNmX3JlcS0+cmVxX2lkOwogCXItPmZzZl9zZXFubyA9IGZzZl9yZXEtPnNlcV9ubzsKLQlyLT5zX2lkID0gd2thX3BvcnQtPmRfaWQ7Ci0Jci0+ZF9pZCA9IGZjX2hvc3RfcG9ydF9pZChhZGFwdGVyLT5zY3NpX2hvc3QpOwotCXJjdC0+Y21kX3JzcF9jb2RlID0gaGRyLT5jbWRfcnNwX2NvZGU7Ci0JcmN0LT5yZXZpc2lvbiA9IGhkci0+cmV2aXNpb247Ci0JcmN0LT5yZWFzb25fY29kZSA9IGhkci0+cmVhc29uX2NvZGU7Ci0JcmN0LT5leHBsID0gaGRyLT5yZWFzb25fY29kZV9leHBsOwotCXJjdC0+dmVuZG9yX3VuaXF1ZSA9IGhkci0+dmVuZG9yX3VuaXF1ZTsKLQlyY3QtPm1heF9yZXNfc2l6ZSA9IGhkci0+bWF4X3Jlc19zaXplOwotCXJjdC0+bGVuID0gbWluKChpbnQpY3QtPnJlc3AtPmxlbmd0aCAtIChpbnQpc2l6ZW9mKHN0cnVjdCBjdF9oZHIpLAorCXJjdC0+Y21kX3JzcF9jb2RlID0gaGRyLT5jdF9jbWQ7CisJcmN0LT5yZXZpc2lvbiA9IGhkci0+Y3RfcmV2OworCXJjdC0+cmVhc29uX2NvZGUgPSBoZHItPmN0X3JlYXNvbjsKKwlyY3QtPmV4cGwgPSBoZHItPmN0X2V4cGxhbjsKKwlyY3QtPnZlbmRvcl91bmlxdWUgPSBoZHItPmN0X3ZlbmRvcjsKKwlyY3QtPm1heF9yZXNfc2l6ZSA9IGhkci0+Y3RfbXJfc2l6ZTsKKwlyY3QtPmxlbiA9IG1pbigoaW50KWN0LT5yZXNwLT5sZW5ndGggLSAoaW50KXNpemVvZihzdHJ1Y3QgZmNfY3RfaGRyKSwKIAkJICAgICAgIFpGQ1BfREJGX1NBTl9NQVhfUEFZTE9BRCk7CiAJZGVidWdfZXZlbnQoZGJmLT5zYW4sIGxldmVsLCByLCBzaXplb2YoKnIpKTsKIAl6ZmNwX2RiZl9oZXhkdW1wKGRiZi0+c2FuLCByLCBzaXplb2YoKnIpLCBsZXZlbCwKLQkJCSAodm9pZCAqKWhkciArIHNpemVvZihzdHJ1Y3QgY3RfaGRyKSwgcmN0LT5sZW4pOworCQkJICh2b2lkICopaGRyICsgc2l6ZW9mKHN0cnVjdCBmY19jdF9oZHIpLCByY3QtPmxlbik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGJmLT5zYW5fbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB6ZmNwX2RiZl9zYW5fZWxzKGNvbnN0IGNoYXIgKnRhZywgaW50IGxldmVsLAotCQkJICAgICBzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxLCB1MzIgc19pZCwgdTMyIGRfaWQsCi0JCQkgICAgIHU4IGxzX2NvZGUsIHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZmxlbikKKwkJCSAgICAgc3RydWN0IHpmY3BfZnNmX3JlcSAqZnNmX3JlcSwgdTMyIGRfaWQsCisJCQkgICAgIHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZmxlbikKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZnNmX3JlcS0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9kYmYgKmRiZiA9IGFkYXB0ZXItPmRiZjsKQEAgLTc2Miw5ICs3NTcsNyBAQAogCXN0cm5jcHkocmVjLT50YWcsIHRhZywgWkZDUF9EQkZfVEFHX1NJWkUpOwogCXJlYy0+ZnNmX3JlcWlkID0gZnNmX3JlcS0+cmVxX2lkOwogCXJlYy0+ZnNmX3NlcW5vID0gZnNmX3JlcS0+c2VxX25vOwotCXJlYy0+c19pZCA9IHNfaWQ7Ci0JcmVjLT5kX2lkID0gZF9pZDsKLQlyZWMtPnUuZWxzLmxzX2NvZGUgPSBsc19jb2RlOworCXJlYy0+dS5lbHMuZF9pZCA9IGRfaWQ7CiAJZGVidWdfZXZlbnQoZGJmLT5zYW4sIGxldmVsLCByZWMsIHNpemVvZigqcmVjKSk7CiAJemZjcF9kYmZfaGV4ZHVtcChkYmYtPnNhbiwgcmVjLCBzaXplb2YoKnJlYyksIGxldmVsLAogCQkJIGJ1ZmZlciwgbWluKGJ1ZmxlbiwgWkZDUF9EQkZfU0FOX01BWF9QQVlMT0FEKSk7CkBAIC03NzcsMTIgKzc3MCwxMSBAQAogICovCiB2b2lkIHpmY3BfZGJmX3Nhbl9lbHNfcmVxdWVzdChzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxKQogewotCXN0cnVjdCB6ZmNwX3NlbmRfZWxzICplbHMgPSAoc3RydWN0IHpmY3Bfc2VuZF9lbHMgKilmc2ZfcmVxLT5kYXRhOworCXN0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgKmVscyA9IChzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICopZnNmX3JlcS0+ZGF0YTsKKwl1MzIgZF9pZCA9IG50b2gyNChmc2ZfcmVxLT5xdGNiLT5ib3R0b20uc3VwcG9ydC5kX2lkKTsKIAotCXpmY3BfZGJmX3Nhbl9lbHMoIm9lbHMiLCAyLCBmc2ZfcmVxLAotCQkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChlbHMtPmFkYXB0ZXItPnNjc2lfaG9zdCksCi0JCQkgICAgICAgZWxzLT5kX2lkLCAqKHU4ICopIHNnX3ZpcnQoZWxzLT5yZXEpLAotCQkJICAgICAgIHNnX3ZpcnQoZWxzLT5yZXEpLCBlbHMtPnJlcS0+bGVuZ3RoKTsKKwl6ZmNwX2RiZl9zYW5fZWxzKCJvZWxzIiwgMiwgZnNmX3JlcSwgZF9pZCwKKwkJCSBzZ192aXJ0KGVscy0+cmVxKSwgZWxzLT5yZXEtPmxlbmd0aCk7CiB9CiAKIC8qKgpAQCAtNzkxLDEyICs3ODMsMTEgQEAKICAqLwogdm9pZCB6ZmNwX2RiZl9zYW5fZWxzX3Jlc3BvbnNlKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXEpCiB7Ci0Jc3RydWN0IHpmY3Bfc2VuZF9lbHMgKmVscyA9IChzdHJ1Y3QgemZjcF9zZW5kX2VscyAqKWZzZl9yZXEtPmRhdGE7CisJc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqZWxzID0gKHN0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgKilmc2ZfcmVxLT5kYXRhOworCXUzMiBkX2lkID0gbnRvaDI0KGZzZl9yZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LmRfaWQpOwogCi0JemZjcF9kYmZfc2FuX2VscygicmVscyIsIDIsIGZzZl9yZXEsIGVscy0+ZF9pZCwKLQkJCSAgICAgICBmY19ob3N0X3BvcnRfaWQoZWxzLT5hZGFwdGVyLT5zY3NpX2hvc3QpLAotCQkJICAgICAgICoodTggKilzZ192aXJ0KGVscy0+cmVxKSwgc2dfdmlydChlbHMtPnJlc3ApLAotCQkJICAgICAgIGVscy0+cmVzcC0+bGVuZ3RoKTsKKwl6ZmNwX2RiZl9zYW5fZWxzKCJyZWxzIiwgMiwgZnNmX3JlcSwgZF9pZCwKKwkJCSAgICAgICBzZ192aXJ0KGVscy0+cmVzcCksIGVscy0+cmVzcC0+bGVuZ3RoKTsKIH0KIAogLyoqCkBAIC04MDUsMTYgKzc5NiwxMyBAQAogICovCiB2b2lkIHpmY3BfZGJmX3Nhbl9pbmNvbWluZ19lbHMoc3RydWN0IHpmY3BfZnNmX3JlcSAqZnNmX3JlcSkKIHsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZnNmX3JlcS0+YWRhcHRlcjsKIAlzdHJ1Y3QgZnNmX3N0YXR1c19yZWFkX2J1ZmZlciAqYnVmID0KIAkJCShzdHJ1Y3QgZnNmX3N0YXR1c19yZWFkX2J1ZmZlciAqKWZzZl9yZXEtPmRhdGE7CiAJaW50IGxlbmd0aCA9IChpbnQpYnVmLT5sZW5ndGggLQogCQkgICAgIChpbnQpKCh2b2lkICopJmJ1Zi0+cGF5bG9hZCAtICh2b2lkICopYnVmKTsKIAotCXpmY3BfZGJmX3Nhbl9lbHMoImllbHMiLCAxLCBmc2ZfcmVxLCBidWYtPmRfaWQsCi0JCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGFkYXB0ZXItPnNjc2lfaG9zdCksCi0JCQkgICAgICAgYnVmLT5wYXlsb2FkLmRhdGFbMF0sICh2b2lkICopYnVmLT5wYXlsb2FkLmRhdGEsCi0JCQkgICAgICAgbGVuZ3RoKTsKKwl6ZmNwX2RiZl9zYW5fZWxzKCJpZWxzIiwgMSwgZnNmX3JlcSwgbnRvaDI0KGJ1Zi0+ZF9pZCksCisJCQkgICAgICAgKHZvaWQgKilidWYtPnBheWxvYWQuZGF0YSwgbGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCB6ZmNwX2RiZl9zYW5fdmlld19mb3JtYXQoZGVidWdfaW5mb190ICppZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCkBAIC04MjksMTEgKzgxNywxMCBAQAogCXpmY3BfZGJmX3RhZygmcCwgInRhZyIsIHItPnRhZyk7CiAJemZjcF9kYmZfb3V0KCZwLCAiZnNmX3JlcWlkIiwgIjB4JTBMeCIsIHItPmZzZl9yZXFpZCk7CiAJemZjcF9kYmZfb3V0KCZwLCAiZnNmX3NlcW5vIiwgIjB4JTA4eCIsIHItPmZzZl9zZXFubyk7Ci0JemZjcF9kYmZfb3V0KCZwLCAic19pZCIsICIweCUwNngiLCByLT5zX2lkKTsKLQl6ZmNwX2RiZl9vdXQoJnAsICJkX2lkIiwgIjB4JTA2eCIsIHItPmRfaWQpOwogCiAJaWYgKHN0cm5jbXAoci0+dGFnLCAib2N0YyIsIFpGQ1BfREJGX1RBR19TSVpFKSA9PSAwKSB7CiAJCXN0cnVjdCB6ZmNwX2RiZl9zYW5fcmVjb3JkX2N0X3JlcXVlc3QgKmN0ID0gJnItPnUuY3RfcmVxOworCQl6ZmNwX2RiZl9vdXQoJnAsICJkX2lkIiwgIjB4JTA2eCIsIGN0LT5kX2lkKTsKIAkJemZjcF9kYmZfb3V0KCZwLCAiY21kX3JlcV9jb2RlIiwgIjB4JTA0eCIsIGN0LT5jbWRfcmVxX2NvZGUpOwogCQl6ZmNwX2RiZl9vdXQoJnAsICJyZXZpc2lvbiIsICIweCUwMngiLCBjdC0+cmV2aXNpb24pOwogCQl6ZmNwX2RiZl9vdXQoJnAsICJnc190eXBlIiwgIjB4JTAyeCIsIGN0LT5nc190eXBlKTsKQEAgLTg1Miw3ICs4MzksNyBAQAogCQkgICBzdHJuY21wKHItPnRhZywgInJlbHMiLCBaRkNQX0RCRl9UQUdfU0laRSkgPT0gMCB8fAogCQkgICBzdHJuY21wKHItPnRhZywgImllbHMiLCBaRkNQX0RCRl9UQUdfU0laRSkgPT0gMCkgewogCQlzdHJ1Y3QgemZjcF9kYmZfc2FuX3JlY29yZF9lbHMgKmVscyA9ICZyLT51LmVsczsKLQkJemZjcF9kYmZfb3V0KCZwLCAibHNfY29kZSIsICIweCUwMngiLCBlbHMtPmxzX2NvZGUpOworCQl6ZmNwX2RiZl9vdXQoJnAsICJkX2lkIiwgIjB4JTA2eCIsIGVscy0+ZF9pZCk7CiAJfQogCXJldHVybiBwIC0gb3V0X2J1ZjsKIH0KQEAgLTg3MCw4ICs4NTcsOSBAQAogCXN0cnVjdCB6ZmNwX2RiZl9zY3NpX3JlY29yZCAqcmVjID0gJmRiZi0+c2NzaV9idWY7CiAJc3RydWN0IHpmY3BfZGJmX2R1bXAgKmR1bXAgPSAoc3RydWN0IHpmY3BfZGJmX2R1bXAgKilyZWM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZmNwX3JzcF9pdSAqZmNwX3JzcDsKLQljaGFyICpmY3BfcnNwX2luZm8gPSBOVUxMLCAqZmNwX3Nuc19pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgZmNwX3Jlc3Bfd2l0aF9leHQgKmZjcF9yc3A7CisJc3RydWN0IGZjcF9yZXNwX3JzcF9pbmZvICpmY3BfcnNwX2luZm8gPSBOVUxMOworCWNoYXIgKmZjcF9zbnNfaW5mbyA9IE5VTEw7CiAJaW50IG9mZnNldCA9IDAsIGJ1ZmxlbiA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGJmLT5zY3NpX2xvY2ssIGZsYWdzKTsKQEAgLTg5NSwyMCArODgzLDIyIEBACiAJCQkJcmVjLT5zY3NpX2FsbG93ZWQgPSBzY3NpX2NtbmQtPmFsbG93ZWQ7CiAJCQl9CiAJCQlpZiAoZnNmX3JlcSAhPSBOVUxMKSB7Ci0JCQkJZmNwX3JzcCA9IChzdHJ1Y3QgZmNwX3JzcF9pdSAqKQotCQkJCSAgICAmKGZzZl9yZXEtPnF0Y2ItPmJvdHRvbS5pby5mY3BfcnNwKTsKLQkJCQlmY3BfcnNwX2luZm8gPSAodW5zaWduZWQgY2hhciAqKSAmZmNwX3JzcFsxXTsKLQkJCQlmY3Bfc25zX2luZm8gPQotCQkJCSAgICB6ZmNwX2dldF9mY3Bfc25zX2luZm9fcHRyKGZjcF9yc3ApOworCQkJCWZjcF9yc3AgPSAoc3RydWN0IGZjcF9yZXNwX3dpdGhfZXh0ICopCisJCQkJCSYoZnNmX3JlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9yc3ApOworCQkJCWZjcF9yc3BfaW5mbyA9IChzdHJ1Y3QgZmNwX3Jlc3BfcnNwX2luZm8gKikKKwkJCQkJJmZjcF9yc3BbMV07CisJCQkJZmNwX3Nuc19pbmZvID0gKGNoYXIgKikgJmZjcF9yc3BbMV07CisJCQkJaWYgKGZjcF9yc3AtPnJlc3AuZnJfZmxhZ3MgJiBGQ1BfUlNQX0xFTl9WQUwpCisJCQkJCWZjcF9zbnNfaW5mbyArPSBmY3BfcnNwLT5leHQuZnJfc25zX2xlbjsKIAotCQkJCXJlYy0+cnNwX3ZhbGlkaXR5ID0gZmNwX3JzcC0+dmFsaWRpdHkudmFsdWU7Ci0JCQkJcmVjLT5yc3Bfc2NzaV9zdGF0dXMgPSBmY3BfcnNwLT5zY3NpX3N0YXR1czsKLQkJCQlyZWMtPnJzcF9yZXNpZCA9IGZjcF9yc3AtPmZjcF9yZXNpZDsKLQkJCQlpZiAoZmNwX3JzcC0+dmFsaWRpdHkuYml0cy5mY3BfcnNwX2xlbl92YWxpZCkKLQkJCQkJcmVjLT5yc3BfY29kZSA9ICooZmNwX3JzcF9pbmZvICsgMyk7Ci0JCQkJaWYgKGZjcF9yc3AtPnZhbGlkaXR5LmJpdHMuZmNwX3Nuc19sZW5fdmFsaWQpIHsKLQkJCQkJYnVmbGVuID0gbWluKChpbnQpZmNwX3JzcC0+ZmNwX3Nuc19sZW4sCi0JCQkJCQkgICAgIFpGQ1BfREJGX1NDU0lfTUFYX0ZDUF9TTlNfSU5GTyk7CisJCQkJcmVjLT5yc3BfdmFsaWRpdHkgPSBmY3BfcnNwLT5yZXNwLmZyX2ZsYWdzOworCQkJCXJlYy0+cnNwX3Njc2lfc3RhdHVzID0gZmNwX3JzcC0+cmVzcC5mcl9zdGF0dXM7CisJCQkJcmVjLT5yc3BfcmVzaWQgPSBmY3BfcnNwLT5leHQuZnJfcmVzaWQ7CisJCQkJaWYgKGZjcF9yc3AtPnJlc3AuZnJfZmxhZ3MgJiBGQ1BfUlNQX0xFTl9WQUwpCisJCQkJCXJlYy0+cnNwX2NvZGUgPSBmY3BfcnNwX2luZm8tPnJzcF9jb2RlOworCQkJCWlmIChmY3BfcnNwLT5yZXNwLmZyX2ZsYWdzICYgRkNQX1NOU19MRU5fVkFMKSB7CisJCQkJCWJ1ZmxlbiA9IG1pbihmY3BfcnNwLT5leHQuZnJfc25zX2xlbiwKKwkJCQkJICAgKHUzMilaRkNQX0RCRl9TQ1NJX01BWF9GQ1BfU05TX0lORk8pOwogCQkJCQlyZWMtPnNuc19pbmZvX2xlbiA9IGJ1ZmxlbjsKIAkJCQkJbWVtY3B5KHJlYy0+c25zX2luZm8sIGZjcF9zbnNfaW5mbywKIAkJCQkJICAgICAgIG1pbihidWZsZW4sCkBAIC0xMDY3LDYgKzEwNTcsOCBAQAogICovCiB2b2lkIHpmY3BfZGJmX2FkYXB0ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgemZjcF9kYmYgKmRiZikKIHsKKwlpZiAoIWRiZikKKwkJcmV0dXJuOwogCWRlYnVnX3VucmVnaXN0ZXIoZGJmLT5zY3NpKTsKIAlkZWJ1Z191bnJlZ2lzdGVyKGRiZi0+c2FuKTsKIAlkZWJ1Z191bnJlZ2lzdGVyKGRiZi0+aGJhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5oCmluZGV4IDZiMTQ2MWUuLjhiN2ZkOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuaApAQCAtMjIsNiArMjIsNyBAQAogI2lmbmRlZiBaRkNQX0RCRl9ICiAjZGVmaW5lIFpGQ1BfREJGX0gKIAorI2luY2x1ZGUgPHNjc2kvZmMvZmNfZmNwLmg+CiAjaW5jbHVkZSAiemZjcF9leHQuaCIKICNpbmNsdWRlICJ6ZmNwX2ZzZi5oIgogI2luY2x1ZGUgInpmY3BfZGVmLmgiCkBAIC0xMjIsNyArMTIzLDYgQEAKIAkJfSB1bml0OwogCQlzdHJ1Y3QgewogCQkJdTMyIGRfaWQ7Ci0JCQl1OCBsc19jb2RlOwogCQl9IGVsczsKIAl9IHU7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKQEAgLTE2Niw2ICsxNjYsNyBAQAogCXU4IG9wdGlvbnM7CiAJdTE2IG1heF9yZXNfc2l6ZTsKIAl1MzIgbGVuOworCXUzMiBkX2lkOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCB6ZmNwX2RiZl9zYW5fcmVjb3JkX2N0X3Jlc3BvbnNlIHsKQEAgLTE3OSwxNiArMTgwLDEzIEBACiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IHpmY3BfZGJmX3Nhbl9yZWNvcmRfZWxzIHsKLQl1OCBsc19jb2RlOwotCXUzMiBsZW47CisJdTMyIGRfaWQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IHpmY3BfZGJmX3Nhbl9yZWNvcmQgewogCXU4IHRhZ1taRkNQX0RCRl9UQUdfU0laRV07CiAJdTY0IGZzZl9yZXFpZDsKIAl1MzIgZnNmX3NlcW5vOwotCXUzMiBzX2lkOwotCXUzMiBkX2lkOwogCXVuaW9uIHsKIAkJc3RydWN0IHpmY3BfZGJmX3Nhbl9yZWNvcmRfY3RfcmVxdWVzdCBjdF9yZXE7CiAJCXN0cnVjdCB6ZmNwX2RiZl9zYW5fcmVjb3JkX2N0X3Jlc3BvbnNlIGN0X3Jlc3A7CkBAIC0zNDMsNyArMzQxLDcgQEAKIHZvaWQgemZjcF9kYmZfc2NzaV9kZXZyZXNldChjb25zdCBjaGFyICp0YWcsIHU4IGZsYWcsIHN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQsCiAJCQkgICAgc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbW5kKQogewotCXpmY3BfZGJmX3Njc2koZmxhZyA9PSBGQ1BfVEFSR0VUX1JFU0VUID8gInRyc3QiIDogImxyc3QiLCB0YWcsIDEsCisJemZjcF9kYmZfc2NzaShmbGFnID09IEZDUF9UTUZfVEdUX1JFU0VUID8gInRyc3QiIDogImxyc3QiLCB0YWcsIDEsCiAJCQkgICAgdW5pdC0+cG9ydC0+YWRhcHRlci0+ZGJmLCBzY3NpX2NtbmQsIE5VTEwsIDApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaAppbmRleCA3ZGEyZmFkLi5lMWI1Yjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKQEAgLTcxLDEzMSArNzEsNiBAQAogLyogdGltZW91dCB2YWx1ZSBmb3IgImRlZmF1bHQgdGltZXIiIGZvciBmc2YgcmVxdWVzdHMgKi8KICNkZWZpbmUgWkZDUF9GU0ZfUkVRVUVTVF9USU1FT1VUICg2MCpIWikKIAotLyoqKioqKioqKioqKioqKiBGSUJSRSBDSEFOTkVMIFBST1RPQ09MIFNQRUNJRklDIERFRklORVMgKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHRhc2sgYXR0cmlidXRlIHZhbHVlcyBpbiBGQ1AtMiBGQ1BfQ01ORCBJVSAqLwotI2RlZmluZSBTSU1QTEVfUQkwCi0jZGVmaW5lIEhFQURfT0ZfUQkxCi0jZGVmaW5lIE9SREVSRURfUQkyCi0jZGVmaW5lIEFDQV9RCQk0Ci0jZGVmaW5lIFVOVEFHR0VECTUKLQotLyogdGFzayBtYW5hZ2VtZW50IGZsYWdzIGluIEZDUC0yIEZDUF9DTU5EIElVICovCi0jZGVmaW5lIEZDUF9DTEVBUl9BQ0EJCTB4NDAKLSNkZWZpbmUgRkNQX1RBUkdFVF9SRVNFVAkweDIwCi0jZGVmaW5lIEZDUF9MT0dJQ0FMX1VOSVRfUkVTRVQJMHgxMAotI2RlZmluZSBGQ1BfQ0xFQVJfVEFTS19TRVQJMHgwNAotI2RlZmluZSBGQ1BfQUJPUlRfVEFTS19TRVQJMHgwMgotCi0jZGVmaW5lIEZDUF9DREJfTEVOR1RICQkxNgotCi0jZGVmaW5lIFpGQ1BfRElEX01BU0sgICAgICAgICAgIDB4MDBGRkZGRkYKLQotLyogRkNQKC0yKSBGQ1BfQ01ORCBJVSAqLwotc3RydWN0IGZjcF9jbW5kX2l1IHsKLQl1NjQgZmNwX2x1bjsJICAgLyogRkNQIGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KLQl1OCAgY3JuOwkgICAgICAgICAgIC8qIGNvbW1hbmQgcmVmZXJlbmNlIG51bWJlciAqLwotCXU4ICByZXNlcnZlZDA6NTsJICAgLyogcmVzZXJ2ZWQgKi8KLQl1OCAgdGFza19hdHRyaWJ1dGU6MzsJICAgLyogdGFzayBhdHRyaWJ1dGUgKi8KLQl1OCAgdGFza19tYW5hZ2VtZW50X2ZsYWdzOyAvKiB0YXNrIG1hbmFnZW1lbnQgZmxhZ3MgKi8KLQl1OCAgYWRkX2ZjcF9jZGJfbGVuZ3RoOjY7ICAvKiBhZGRpdGlvbmFsIEZDUF9DREIgbGVuZ3RoICovCi0JdTggIHJkZGF0YToxOyAgICAgICAgICAgICAgLyogcmVhZCBkYXRhICovCi0JdTggIHdkZGF0YToxOyAgICAgICAgICAgICAgLyogd3JpdGUgZGF0YSAqLwotCXU4ICBmY3BfY2RiW0ZDUF9DREJfTEVOR1RIXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIEZDUCgtMikgRkNQX1JTUCBJVSAqLwotc3RydWN0IGZjcF9yc3BfaXUgewotCXU4ICByZXNlcnZlZDBbMTBdOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXU4IHJlc2VydmVkMTozOwotCQkJdTggZmNwX2NvbmZfcmVxOjE7Ci0JCQl1OCBmY3BfcmVzaWRfdW5kZXI6MTsKLQkJCXU4IGZjcF9yZXNpZF9vdmVyOjE7Ci0JCQl1OCBmY3Bfc25zX2xlbl92YWxpZDoxOwotCQkJdTggZmNwX3JzcF9sZW5fdmFsaWQ6MTsKLQkJfSBiaXRzOwotCQl1OCB2YWx1ZTsKLQl9IHZhbGlkaXR5OwotCXU4ICBzY3NpX3N0YXR1czsKLQl1MzIgZmNwX3Jlc2lkOwotCXUzMiBmY3Bfc25zX2xlbjsKLQl1MzIgZmNwX3JzcF9sZW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLSNkZWZpbmUgUlNQX0NPREVfR09PRAkJIDAKLSNkZWZpbmUgUlNQX0NPREVfTEVOR1RIX01JU01BVENIIDEKLSNkZWZpbmUgUlNQX0NPREVfRklFTERfSU5WQUxJRAkgMgotI2RlZmluZSBSU1BfQ09ERV9ST19NSVNNQVRDSAkgMwotI2RlZmluZSBSU1BfQ09ERV9UQVNLTUFOX1VOU1VQUAkgNAotI2RlZmluZSBSU1BfQ09ERV9UQVNLTUFOX0ZBSUxFRAkgNQotCi0vKiBzZWUgZmMtZnMgKi8KLSNkZWZpbmUgTFNfUlNDTiAgMHg2MQotI2RlZmluZSBMU19MT0dPICAweDA1Ci0jZGVmaW5lIExTX1BMT0dJIDB4MDMKLQotc3RydWN0IGZjcF9yc2NuX2hlYWQgewotICAgICAgICB1OCAgY29tbWFuZDsKLSAgICAgICAgdTggIHBhZ2VfbGVuZ3RoOyAvKiBhbHdheXMgMHgwNCAqLwotICAgICAgICB1MTYgcGF5bG9hZF9sZW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZmNwX3JzY25fZWxlbWVudCB7Ci0gICAgICAgIHU4ICByZXNlcnZlZDoyOwotICAgICAgICB1OCAgZXZlbnRfcXVhbDo0OwotICAgICAgICB1OCAgYWRkcl9mb3JtYXQ6MjsKLSAgICAgICAgdTMyIG5wb3J0X2RpZDoyNDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIHNlZSBmYy1waCAqLwotc3RydWN0IGZjcF9sb2dvIHsKLSAgICAgICAgdTMyIGNvbW1hbmQ7Ci0gICAgICAgIHUzMiBucG9ydF9kaWQ7Ci0JdTY0IG5wb3J0X3d3cG47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogRkMtRlMgc3R1ZmYKLSAqLwotI2RlZmluZSBSX0FfVE9WCQkJCTEwIC8qIHNlY29uZHMgKi8KLQotI2RlZmluZSBaRkNQX0xTX1JMUwkJCTB4MGYKLSNkZWZpbmUgWkZDUF9MU19BRElTQwkJCTB4NTIKLSNkZWZpbmUgWkZDUF9MU19SUFMJCQkweDU2Ci0jZGVmaW5lIFpGQ1BfTFNfUlNDTgkJCTB4NjEKLSNkZWZpbmUgWkZDUF9MU19STklECQkJMHg3OAotCi1zdHJ1Y3QgemZjcF9sc19hZGlzYyB7Ci0JdTgJCWNvZGU7Ci0JdTgJCWZpZWxkWzNdOwotCXUzMgkJaGFyZF9ucG9ydF9pZDsKLQl1NjQJCXd3cG47Ci0JdTY0CQl3d25uOwotCXUzMgkJbnBvcnRfaWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoKLSAqIEZDLUdTLTIgc3R1ZmYKLSAqLwotI2RlZmluZSBaRkNQX0NUX1JFVklTSU9OCQkweDAxCi0jZGVmaW5lIFpGQ1BfQ1RfRElSRUNUT1JZX1NFUlZJQ0UJMHhGQwotI2RlZmluZSBaRkNQX0NUX05BTUVfU0VSVkVSCQkweDAyCi0jZGVmaW5lIFpGQ1BfQ1RfU1lOQ0hST05PVVMJCTB4MDAKLSNkZWZpbmUgWkZDUF9DVF9TQ1NJX0ZDUAkJMHgwOAotI2RlZmluZSBaRkNQX0NUX1VOQUJMRV9UT19QRVJGT1JNX0NNRAkweDA5Ci0jZGVmaW5lIFpGQ1BfQ1RfR0lEX1BOCQkJMHgwMTIxCi0jZGVmaW5lIFpGQ1BfQ1RfR1BOX0ZUCQkJMHgwMTcyCi0jZGVmaW5lIFpGQ1BfQ1RfQUNDRVBUCQkJMHg4MDAyCi0jZGVmaW5lIFpGQ1BfQ1RfUkVKRUNUCQkJMHg4MDAxCi0KLS8qCi0gKiBGQy1HUy00IHN0dWZmCi0gKi8KLSNkZWZpbmUgWkZDUF9DVF9USU1FT1VUCQkJKDMgKiBSX0FfVE9WKQotCiAvKioqKioqKioqKioqKioqIEFEQVBURVIvUE9SVC9VTklUIEFORCBGU0ZfUkVRIFNUQVRVUyBGTEFHUyAqKioqKioqKioqKioqKioqKiovCiAKIC8qCkBAIC0yMDUsNyArODAsNiBAQAogI2RlZmluZSBaRkNQX0NPTU1PTl9GTEFHUwkJCTB4ZmZmMDAwMDAKIAogLyogY29tbW9uIHN0YXR1cyBiaXRzICovCi0jZGVmaW5lIFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUJCTB4ODAwMDAwMDAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQ09NTU9OX1JVTk5JTkcJCTB4NDAwMDAwMDAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQJCTB4MjAwMDAwMDAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQ09NTU9OX1VOQkxPQ0tFRAkJMHgxMDAwMDAwMApAQCAtMjIyLDIxICs5NiwxMCBAQAogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX0VSUF9QRU5ESU5HCQkweDAwMDAwMTAwCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0FEQVBURVJfTElOS19VTlBMVUdHRUQJMHgwMDAwMDIwMAogCi0vKiBGQy1QSC9GQy1HUyB3ZWxsLWtub3duIGFkZHJlc3MgaWRlbnRpZmllcnMgZm9yIGdlbmVyaWMgc2VydmljZXMgKi8KLSNkZWZpbmUgWkZDUF9ESURfV0tBCQkJCTB4RkZGRkYwCi0KIC8qIHJlbW90ZSBwb3J0IHN0YXR1cyAqLwogI2RlZmluZSBaRkNQX1NUQVRVU19QT1JUX1BIWVNfT1BFTgkJMHgwMDAwMDAwMQogI2RlZmluZSBaRkNQX1NUQVRVU19QT1JUX0xJTktfVEVTVAkJMHgwMDAwMDAwMgogCi0vKiB3ZWxsIGtub3duIGFkZHJlc3MgKFdLQSkgcG9ydCBzdGF0dXMqLwotZW51bSB6ZmNwX3drYV9zdGF0dXMgewotCVpGQ1BfV0tBX1BPUlRfT0ZGTElORSwKLQlaRkNQX1dLQV9QT1JUX0NMT1NJTkcsCi0JWkZDUF9XS0FfUE9SVF9PUEVOSU5HLAotCVpGQ1BfV0tBX1BPUlRfT05MSU5FLAotfTsKLQogLyogbG9naWNhbCB1bml0IHN0YXR1cyAqLwogI2RlZmluZSBaRkNQX1NUQVRVU19VTklUX1NIQVJFRAkJCTB4MDAwMDAwMDQKICNkZWZpbmUgWkZDUF9TVEFUVVNfVU5JVF9SRUFET05MWQkJMHgwMDAwMDAwOApAQCAtMjQ3LDEwICsxMTAsNyBAQAogI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfQ0xFQU5VUAkJMHgwMDAwMDAxMAogI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfQUJPUlRTVUNDRUVERUQJMHgwMDAwMDA0MAogI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfQUJPUlROT1RORUVERUQgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfQUJPUlRFRCAgICAgICAgICAgICAgMHgwMDAwMDEwMAogI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfVE1GVU5DRkFJTEVEICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfVE1GVU5DTk9UU1VQUCAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfUkVUUlkgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAogI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfRElTTUlTU0VEICAgICAgICAgICAgMHgwMDAwMTAwMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBTVFJVQ1RVUkUgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNjUsMTI1ICsxMjUsMTAgQEAKIAltZW1wb29sX3QgKnNjc2lfYWJvcnQ7CiAJbWVtcG9vbF90ICpzdGF0dXNfcmVhZF9yZXE7CiAJbWVtcG9vbF90ICpzdGF0dXNfcmVhZF9kYXRhOwotCW1lbXBvb2xfdCAqZ2lkX3BuX2RhdGE7CisJbWVtcG9vbF90ICpnaWRfcG47CiAJbWVtcG9vbF90ICpxdGNiX3Bvb2w7CiB9OwogCi0vKgotICogaGVhZGVyIGZvciBDVF9JVQotICovCi1zdHJ1Y3QgY3RfaGRyIHsKLQl1OCByZXZpc2lvbjsJCS8vIDB4MDEKLQl1OCBpbl9pZFszXTsJCS8vIDB4MDAKLQl1OCBnc190eXBlOwkJLy8gMHhGQwlEaXJlY3RvcnkgU2VydmljZQotCXU4IGdzX3N1YnR5cGU7CQkvLyAweDAyCU5hbWUgU2VydmVyCi0JdTggb3B0aW9uczsJCS8vIDB4MDAgc2luZ2xlIGJpZGlyZWN0aW9uYWwgZXhjaGFuZ2UKLQl1OCByZXNlcnZlZDA7Ci0JdTE2IGNtZF9yc3BfY29kZTsJLy8gMHgwMTIxIEdJRF9QTiwgb3IgMHgwMTAwIEdBX05YVAotCXUxNiBtYXhfcmVzX3NpemU7CS8vIDw9ICg0MDk2IC0gMTYpIC8gNAotCXU4IHJlc2VydmVkMTsKLQl1OCByZWFzb25fY29kZTsKLQl1OCByZWFzb25fY29kZV9leHBsOwotCXU4IHZlbmRvcl91bmlxdWU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogbmFtZXNlcnZlciByZXF1ZXN0IENUX0lVIC0tIGZvciByZXF1ZXN0cyB3aGVyZQotICogYSBwb3J0IG5hbWUgaXMgcmVxdWlyZWQgKi8KLXN0cnVjdCBjdF9pdV9naWRfcG5fcmVxIHsKLQlzdHJ1Y3QgY3RfaGRyIGhlYWRlcjsKLQl1NjQgd3dwbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBGU19BQ0MgSVUgYW5kIGRhdGEgdW5pdCBmb3IgR0lEX1BOIG5hbWVzZXJ2ZXIgcmVxdWVzdCAqLwotc3RydWN0IGN0X2l1X2dpZF9wbl9yZXNwIHsKLQlzdHJ1Y3QgY3RfaGRyIGhlYWRlcjsKLQl1MzIgZF9pZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgY3RfaXVfZ3BuX2Z0X3JlcSB7Ci0Jc3RydWN0IGN0X2hkciBoZWFkZXI7Ci0JdTggZmxhZ3M7Ci0JdTggZG9tYWluX2lkX3Njb3BlOwotCXU4IGFyZWFfaWRfc2NvcGU7Ci0JdTggZmM0X3R5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0vKioKLSAqIHN0cnVjdCB6ZmNwX3NlbmRfY3QgLSB1c2VkIHRvIHBhc3MgcGFyYW1ldGVycyB0byBmdW5jdGlvbiB6ZmNwX2ZzZl9zZW5kX2N0Ci0gKiBAd2thX3BvcnQ6IHBvcnQgd2hlcmUgdGhlIHJlcXVlc3QgaXMgc2VudCB0bwotICogQHJlcTogc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgcmVxdWVzdAotICogQHJlc3A6IHNjYXR0ZXItZ2F0aGVyIGxpc3QgZm9yIHJlc3BvbnNlCi0gKiBAaGFuZGxlcjogaGFuZGxlciBmdW5jdGlvbiAoY2FsbGVkIGZvciByZXNwb25zZSB0byB0aGUgcmVxdWVzdCkKLSAqIEBoYW5kbGVyX2RhdGE6IGRhdGEgcGFzc2VkIHRvIGhhbmRsZXIgZnVuY3Rpb24KLSAqIEBjb21wbGV0aW9uOiBjb21wbGV0aW9uIGZvciBzeW5jaHJvbml6YXRpb24gcHVycG9zZXMKLSAqIEBzdGF0dXM6IHVzZWQgdG8gcGFzcyBlcnJvciBzdGF0dXMgdG8gY2FsbGluZyBmdW5jdGlvbgotICovCi1zdHJ1Y3QgemZjcF9zZW5kX2N0IHsKLQlzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpyZXE7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpyZXNwOwotCXZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBsb25nKTsKLQl1bnNpZ25lZCBsb25nIGhhbmRsZXJfZGF0YTsKLQlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGlvbjsKLQlpbnQgc3RhdHVzOwotfTsKLQotLyogdXNlZCBmb3IgbmFtZSBzZXJ2ZXIgcmVxdWVzdHMgaW4gZXJyb3IgcmVjb3ZlcnkgKi8KLXN0cnVjdCB6ZmNwX2dpZF9wbl9kYXRhIHsKLQlzdHJ1Y3QgemZjcF9zZW5kX2N0IGN0OwotCXN0cnVjdCBzY2F0dGVybGlzdCByZXE7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHJlc3A7Ci0Jc3RydWN0IGN0X2l1X2dpZF9wbl9yZXEgY3RfaXVfcmVxOwotCXN0cnVjdCBjdF9pdV9naWRfcG5fcmVzcCBjdF9pdV9yZXNwOwotICAgICAgICBzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgemZjcF9zZW5kX2VscyAtIHVzZWQgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9uIHpmY3BfZnNmX3NlbmRfZWxzCi0gKiBAYWRhcHRlcjogYWRhcHRlciB3aGVyZSByZXF1ZXN0IGlzIHNlbnQgZnJvbQotICogQHBvcnQ6IHBvcnQgd2hlcmUgRUxTIGlzIGRlc3RpbmF0ZWQgKHBvcnQgcmVmZXJlbmNlIGNvdW50IGhhcyB0byBiZSBpbmNyZWFzZWQpCi0gKiBAZF9pZDogZGVzdGluaWF0aW9uIGlkIG9mIHBvcnQgd2hlcmUgcmVxdWVzdCBpcyBzZW50IHRvCi0gKiBAcmVxOiBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciByZXF1ZXN0Ci0gKiBAcmVzcDogc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgcmVzcG9uc2UKLSAqIEBoYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIChjYWxsZWQgZm9yIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0KQotICogQGhhbmRsZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbgotICogQGNvbXBsZXRpb246IGNvbXBsZXRpb24gZm9yIHN5bmNocm9uaXphdGlvbiBwdXJwb3NlcwotICogQGxzX2NvZGU6IGhleCBjb2RlIG9mIEVMUyBjb21tYW5kCi0gKiBAc3RhdHVzOiB1c2VkIHRvIHBhc3MgZXJyb3Igc3RhdHVzIHRvIGNhbGxpbmcgZnVuY3Rpb24KLSAqLwotc3RydWN0IHpmY3Bfc2VuZF9lbHMgewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0Jc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKLQl1MzIgZF9pZDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJlcTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJlc3A7Ci0Jdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcpOwotCXVuc2lnbmVkIGxvbmcgaGFuZGxlcl9kYXRhOwotCXN0cnVjdCBjb21wbGV0aW9uICpjb21wbGV0aW9uOwotCWludCBsc19jb2RlOwotCWludCBzdGF0dXM7Ci19OwotCi1zdHJ1Y3QgemZjcF93a2FfcG9ydCB7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlcgkqYWRhcHRlcjsKLQl3YWl0X3F1ZXVlX2hlYWRfdAljb21wbGV0aW9uX3dxOwotCWVudW0gemZjcF93a2Ffc3RhdHVzCXN0YXR1czsKLQlhdG9taWNfdAkJcmVmY291bnQ7Ci0JdTMyCQkJZF9pZDsKLQl1MzIJCQloYW5kbGU7Ci0Jc3RydWN0IG11dGV4CQltdXRleDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCXdvcms7Ci19OwotCi1zdHJ1Y3QgemZjcF93a2FfcG9ydHMgewotCXN0cnVjdCB6ZmNwX3drYV9wb3J0IG1zOyAJLyogbWFuYWdlbWVudCBzZXJ2aWNlICovCi0Jc3RydWN0IHpmY3Bfd2thX3BvcnQgdHM7IAkvKiB0aW1lIHNlcnZpY2UgKi8KLQlzdHJ1Y3QgemZjcF93a2FfcG9ydCBkczsgCS8qIGRpcmVjdG9yeSBzZXJ2aWNlICovCi0Jc3RydWN0IHpmY3Bfd2thX3BvcnQgYXM7IAkvKiBhbGlhcyBzZXJ2aWNlICovCi0Jc3RydWN0IHpmY3Bfd2thX3BvcnQga3M7IAkvKiBrZXkgZGlzdHJpYnV0aW9uIHNlcnZpY2UgKi8KLX07Ci0KIHN0cnVjdCB6ZmNwX3FkaW9fcXVldWUgewogCXN0cnVjdCBxZGlvX2J1ZmZlciAqc2JhbFtRRElPX01BWF9CVUZGRVJTX1BFUl9RXTsKIAl1OAkJICAgZmlyc3Q7CS8qIGluZGV4IG9mIG5leHQgZnJlZSBiZnIgaW4gcXVldWUgKi8KQEAgLTQ0Niw5ICsxOTEsNyBAQAogfTsKIAogc3RydWN0IHpmY3BfYWRhcHRlciB7Ci0JYXRvbWljX3QgICAgICAgICAgICAgICAgcmVmY291bnQ7ICAgICAgICAgIC8qIHJlZmVyZW5jZSBjb3VudCAqLwotCXdhaXRfcXVldWVfaGVhZF90CXJlbW92ZV93cTsgICAgICAgICAvKiBjYW4gYmUgdXNlZCB0byB3YWl0IGZvcgotCQkJCQkJICAgICAgcmVmY291bnQgZHJvcCB0byB6ZXJvICovCisJc3RydWN0IGtyZWYJCXJlZjsKIAl1NjQJCQlwZWVyX3d3bm47CSAgIC8qIFAyUCBwZWVyIFdXTk4gKi8KIAl1NjQJCQlwZWVyX3d3cG47CSAgIC8qIFAyUCBwZWVyIFdXUE4gKi8KIAl1MzIJCQlwZWVyX2RfaWQ7CSAgIC8qIFAyUCBwZWVyIERfSUQgKi8KQEAgLTQ2MSw3ICsyMDQsOCBAQAogICAgICAgICB1MzIJCQloYXJkd2FyZV92ZXJzaW9uOyAgLyogb2YgRkNQIGNoYW5uZWwgKi8KIAl1MTYJCQl0aW1lcl90aWNrczsgICAgICAgLyogdGltZSBpbnQgZm9yIGEgdGljayAqLwogCXN0cnVjdCBTY3NpX0hvc3QJKnNjc2lfaG9zdDsJICAgLyogUG9pbnRlciB0byBtaWQtbGF5ZXIgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXBvcnRfbGlzdF9oZWFkOwkgICAvKiByZW1vdGUgcG9ydCBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAlwb3J0X2xpc3Q7CSAgIC8qIHJlbW90ZSBwb3J0IGxpc3QgKi8KKwlyd2xvY2tfdAkJcG9ydF9saXN0X2xvY2s7ICAgIC8qIHBvcnQgbGlzdCBsb2NrICovCiAJdW5zaWduZWQgbG9uZwkJcmVxX25vOwkJICAgLyogdW5pcXVlIEZTRiByZXEgbnVtYmVyICovCiAJc3RydWN0IGxpc3RfaGVhZAkqcmVxX2xpc3Q7CSAgIC8qIGxpc3Qgb2YgcGVuZGluZyByZXFzICovCiAJc3BpbmxvY2tfdAkJcmVxX2xpc3RfbG9jazsJICAgLyogcmVxdWVzdCBsaXN0IGxvY2sgKi8KQEAgLTQ4NSw3ICsyMjksNyBAQAogCXUzMgkJCWVycF9sb3dfbWVtX2NvdW50OyAvKiBuciBvZiBlcnAgYWN0aW9ucyB3YWl0aW5nCiAJCQkJCQkgICAgICBmb3IgbWVtb3J5ICovCiAJc3RydWN0IHRhc2tfc3RydWN0CSplcnBfdGhyZWFkOwotCXN0cnVjdCB6ZmNwX3drYV9wb3J0cwkqZ3M7CQkgICAvKiBnZW5lcmljIHNlcnZpY2VzICovCisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnRzICpnczsJCSAgIC8qIGdlbmVyaWMgc2VydmljZXMgKi8KIAlzdHJ1Y3QgemZjcF9kYmYJCSpkYmY7CQkgICAvKiBkZWJ1ZyB0cmFjZXMgKi8KIAlzdHJ1Y3QgemZjcF9hZGFwdGVyX21lbXBvb2wJcG9vbDsgICAgICAvKiBBZGFwdGVyIG1lbW9yeSBwb29scyAqLwogCXN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgKmZjX3N0YXRzOwpAQCAtNTAwLDExICsyNDQsOSBAQAogCXN0cnVjdCBkZXZpY2UgICAgICAgICAgc3lzZnNfZGV2aWNlOyAgIC8qIHN5c2ZzIGRldmljZSAqLwogCXN0cnVjdCBmY19ycG9ydCAgICAgICAgKnJwb3J0OyAgICAgICAgIC8qIHJwb3J0IG9mIGZjIHRyYW5zcG9ydCBjbGFzcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgbGlzdDsJICAgICAgIC8qIGxpc3Qgb2YgcmVtb3RlIHBvcnRzICovCi0JYXRvbWljX3QgICAgICAgICAgICAgICByZWZjb3VudDsgICAgICAgLyogcmVmZXJlbmNlIGNvdW50ICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgICAgICByZW1vdmVfd3E7ICAgICAgLyogY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IKLQkJCQkJCSAgcmVmY291bnQgZHJvcCB0byB6ZXJvICovCiAJc3RydWN0IHpmY3BfYWRhcHRlciAgICAqYWRhcHRlcjsgICAgICAgLyogYWRhcHRlciB1c2VkIHRvIGFjY2VzcyBwb3J0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICB1bml0X2xpc3RfaGVhZDsgLyogaGVhZCBvZiBsb2dpY2FsIHVuaXQgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJdW5pdF9saXN0OwkvKiBoZWFkIG9mIGxvZ2ljYWwgdW5pdCBsaXN0ICovCisJcndsb2NrX3QJCXVuaXRfbGlzdF9sb2NrOyAvKiB1bml0IGxpc3QgbG9jayAqLwogCWF0b21pY190CSAgICAgICBzdGF0dXM7CSAgICAgICAvKiBzdGF0dXMgb2YgdGhpcyByZW1vdGUgcG9ydCAqLwogCXU2NAkJICAgICAgIHd3bm47CSAgICAgICAvKiBXV05OIGlmIGtub3duICovCiAJdTY0CQkgICAgICAgd3dwbjsJICAgICAgIC8qIFdXUE4gKi8KQEAgLTUyMyw5ICsyNjUsNiBAQAogc3RydWN0IHpmY3BfdW5pdCB7CiAJc3RydWN0IGRldmljZSAgICAgICAgICBzeXNmc19kZXZpY2U7ICAgLyogc3lzZnMgZGV2aWNlICovCiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICBsaXN0OwkgICAgICAgLyogbGlzdCBvZiBsb2dpY2FsIHVuaXRzICovCi0JYXRvbWljX3QgICAgICAgICAgICAgICByZWZjb3VudDsgICAgICAgLyogcmVmZXJlbmNlIGNvdW50ICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgICAgICByZW1vdmVfd3E7ICAgICAgLyogY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IKLQkJCQkJCSAgcmVmY291bnQgZHJvcCB0byB6ZXJvICovCiAJc3RydWN0IHpmY3BfcG9ydCAgICAgICAqcG9ydDsJICAgICAgIC8qIHJlbW90ZSBwb3J0IG9mIHVuaXQgKi8KIAlhdG9taWNfdAkgICAgICAgc3RhdHVzOwkgICAgICAgLyogc3RhdHVzIG9mIHRoaXMgbG9naWNhbCB1bml0ICovCiAJdTY0CQkgICAgICAgZmNwX2x1bjsJICAgICAgIC8qIG93biBGQ1BfTFVOICovCkBAIC02MDEsMTQgKzM0MCwxMSBAQAogc3RydWN0IHpmY3BfZGF0YSB7CiAJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzY3NpX2hvc3RfdGVtcGxhdGU7CiAJc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKLQlyd2xvY2tfdCAgICAgICAgICAgICAgICBjb25maWdfbG9jazsgICAgICAgIC8qIHNlcmlhbGlzZXMgY2hhbmdlcwotCQkJCQkJICAgICAgIHRvIGFkYXB0ZXIvcG9ydC91bml0Ci0JCQkJCQkgICAgICAgbGlzdHMgKi8KLQlzdHJ1Y3QgbXV0ZXgJCWNvbmZpZ19tdXRleDsKIAlzdHJ1Y3Qga21lbV9jYWNoZQkqZ3BuX2Z0X2NhY2hlOwogCXN0cnVjdCBrbWVtX2NhY2hlCSpxdGNiX2NhY2hlOwogCXN0cnVjdCBrbWVtX2NhY2hlCSpzcl9idWZmZXJfY2FjaGU7CiAJc3RydWN0IGttZW1fY2FjaGUJKmdpZF9wbl9jYWNoZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkqYWRpc2NfY2FjaGU7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKiBaRkNQIFNQRUNJRklDIERFRklORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NTcsNDcgKzM5Myw0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiAgZnVuY3Rpb25zIG5lZWRlZCBmb3IgcmVmZXJlbmNlL3VzYWdlIGNvdW50aW5nCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi16ZmNwX3VuaXRfZ2V0KHN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQpCi17Ci0JYXRvbWljX2luYygmdW5pdC0+cmVmY291bnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXpmY3BfdW5pdF9wdXQoc3RydWN0IHpmY3BfdW5pdCAqdW5pdCkKLXsKLQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJnVuaXQtPnJlZmNvdW50KSA9PSAwKQotCQl3YWtlX3VwKCZ1bml0LT5yZW1vdmVfd3EpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXpmY3BfcG9ydF9nZXQoc3RydWN0IHpmY3BfcG9ydCAqcG9ydCkKLXsKLQlhdG9taWNfaW5jKCZwb3J0LT5yZWZjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotemZjcF9wb3J0X3B1dChzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQotewotCWlmIChhdG9taWNfZGVjX3JldHVybigmcG9ydC0+cmVmY291bnQpID09IDApCi0JCXdha2VfdXAoJnBvcnQtPnJlbW92ZV93cSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotemZjcF9hZGFwdGVyX2dldChzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQotewotCWF0b21pY19pbmMoJmFkYXB0ZXItPnJlZmNvdW50KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi16ZmNwX2FkYXB0ZXJfcHV0KHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGF0b21pY19kZWNfcmV0dXJuKCZhZGFwdGVyLT5yZWZjb3VudCkgPT0gMCkKLQkJd2FrZV91cCgmYWRhcHRlci0+cmVtb3ZlX3dxKTsKLX0KLQogI2VuZGlmIC8qIFpGQ1BfREVGX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCmluZGV4IGY3M2UyMTguLmI1MWExMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYwpAQCAtOTksOSArOTksMTIgQEAKIAogCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfSU5VU0UpCiAJCXpmY3BfZXJwX2FjdGlvbl9kaXNtaXNzKCZwb3J0LT5lcnBfYWN0aW9uKTsKLQllbHNlCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodW5pdCwgJnBvcnQtPnVuaXRfbGlzdF9oZWFkLCBsaXN0KQotCQkgICAgemZjcF9lcnBfYWN0aW9uX2Rpc21pc3NfdW5pdCh1bml0KTsKKwllbHNlIHsKKwkJcmVhZF9sb2NrKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodW5pdCwgJnBvcnQtPnVuaXRfbGlzdCwgbGlzdCkKKwkJCXpmY3BfZXJwX2FjdGlvbl9kaXNtaXNzX3VuaXQodW5pdCk7CisJCXJlYWRfdW5sb2NrKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB6ZmNwX2VycF9hY3Rpb25fZGlzbWlzc19hZGFwdGVyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xMTAsOSArMTEzLDEyIEBACiAKIAlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fRVJQX0lOVVNFKQogCQl6ZmNwX2VycF9hY3Rpb25fZGlzbWlzcygmYWRhcHRlci0+ZXJwX2FjdGlvbik7Ci0JZWxzZQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkKKwllbHNlIHsKKwkJcmVhZF9sb2NrKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdCwgbGlzdCkKIAkJICAgIHpmY3BfZXJwX2FjdGlvbl9kaXNtaXNzX3BvcnQocG9ydCk7CisJCXJlYWRfdW5sb2NrKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jayk7CisJfQogfQogCiBzdGF0aWMgaW50IHpmY3BfZXJwX3JlcXVpcmVkX2FjdChpbnQgd2FudCwgc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciwKQEAgLTE2OCw3ICsxNzQsOCBAQAogCiAJc3dpdGNoIChuZWVkKSB7CiAJY2FzZSBaRkNQX0VSUF9BQ1RJT05fUkVPUEVOX1VOSVQ6Ci0JCXpmY3BfdW5pdF9nZXQodW5pdCk7CisJCWlmICghZ2V0X2RldmljZSgmdW5pdC0+c3lzZnNfZGV2aWNlKSkKKwkJCXJldHVybiBOVUxMOwogCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9JTlVTRSwgJnVuaXQtPnN0YXR1cyk7CiAJCWVycF9hY3Rpb24gPSAmdW5pdC0+ZXJwX2FjdGlvbjsKIAkJaWYgKCEoYXRvbWljX3JlYWQoJnVuaXQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fUlVOTklORykpCkBAIC0xNzcsNyArMTg0LDggQEAKIAogCWNhc2UgWkZDUF9FUlBfQUNUSU9OX1JFT1BFTl9QT1JUOgogCWNhc2UgWkZDUF9FUlBfQUNUSU9OX1JFT1BFTl9QT1JUX0ZPUkNFRDoKLQkJemZjcF9wb3J0X2dldChwb3J0KTsKKwkJaWYgKCFnZXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpKQorCQkJcmV0dXJuIE5VTEw7CiAJCXpmY3BfZXJwX2FjdGlvbl9kaXNtaXNzX3BvcnQocG9ydCk7CiAJCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fRVJQX0lOVVNFLCAmcG9ydC0+c3RhdHVzKTsKIAkJZXJwX2FjdGlvbiA9ICZwb3J0LT5lcnBfYWN0aW9uOwpAQCAtMTg2LDcgKzE5NCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBaRkNQX0VSUF9BQ1RJT05fUkVPUEVOX0FEQVBURVI6Ci0JCXpmY3BfYWRhcHRlcl9nZXQoYWRhcHRlcik7CisJCWtyZWZfZ2V0KCZhZGFwdGVyLT5yZWYpOwogCQl6ZmNwX2VycF9hY3Rpb25fZGlzbWlzc19hZGFwdGVyKGFkYXB0ZXIpOwogCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9JTlVTRSwgJmFkYXB0ZXItPnN0YXR1cyk7CiAJCWVycF9hY3Rpb24gPSAmYWRhcHRlci0+ZXJwX2FjdGlvbjsKQEAgLTI2NCwxMSArMjcyLDE2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQl3cml0ZV9sb2NrKCZhZGFwdGVyLT5lcnBfbG9jayk7Ci0JX3pmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKGFkYXB0ZXIsIGNsZWFyLCBpZCwgcmVmKTsKLQl3cml0ZV91bmxvY2soJmFkYXB0ZXItPmVycF9sb2NrKTsKLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKKwl6ZmNwX2VycF9hZGFwdGVyX2Jsb2NrKGFkYXB0ZXIsIGNsZWFyKTsKKwl6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRzX2Jsb2NrKGFkYXB0ZXIpOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5lcnBfbG9jaywgZmxhZ3MpOworCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfRkFJTEVEKQorCQl6ZmNwX2VycF9hZGFwdGVyX2ZhaWxlZChhZGFwdGVyLCAiZXJhcmVvMSIsIE5VTEwpOworCWVsc2UKKwkJemZjcF9lcnBfYWN0aW9uX2VucXVldWUoWkZDUF9FUlBfQUNUSU9OX1JFT1BFTl9BREFQVEVSLCBhZGFwdGVyLAorCQkJCQlOVUxMLCBOVUxMLCBpZCwgcmVmKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZXJwX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoqCkBAIC0zNDUsMTEgKzM1OCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQl3cml0ZV9sb2NrKCZhZGFwdGVyLT5lcnBfbG9jayk7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5lcnBfbG9jaywgZmxhZ3MpOwogCV96ZmNwX2VycF9wb3J0X2ZvcmNlZF9yZW9wZW4ocG9ydCwgY2xlYXIsIGlkLCByZWYpOwotCXdyaXRlX3VubG9jaygmYWRhcHRlci0+ZXJwX2xvY2spOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5lcnBfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IF96ZmNwX2VycF9wb3J0X3Jlb3BlbihzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LCBpbnQgY2xlYXIsIGNoYXIgKmlkLApAQCAtMzc3LDE1ICszODgsMTMgQEAKICAqLwogaW50IHpmY3BfZXJwX3BvcnRfcmVvcGVuKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIGludCBjbGVhciwgY2hhciAqaWQsIHZvaWQgKnJlZikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQl3cml0ZV9sb2NrKCZhZGFwdGVyLT5lcnBfbG9jayk7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5lcnBfbG9jaywgZmxhZ3MpOwogCXJldHZhbCA9IF96ZmNwX2VycF9wb3J0X3Jlb3Blbihwb3J0LCBjbGVhciwgaWQsIHJlZik7Ci0Jd3JpdGVfdW5sb2NrKCZhZGFwdGVyLT5lcnBfbG9jayk7Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmVycF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDI0LDExICs0MzMsOSBAQAogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSB1bml0LT5wb3J0OwogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOwogCi0JcmVhZF9sb2NrX2lycXNhdmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwotCXdyaXRlX2xvY2soJmFkYXB0ZXItPmVycF9sb2NrKTsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmVycF9sb2NrLCBmbGFncyk7CiAJX3pmY3BfZXJwX3VuaXRfcmVvcGVuKHVuaXQsIGNsZWFyLCBpZCwgcmVmKTsKLQl3cml0ZV91bmxvY2soJmFkYXB0ZXItPmVycF9sb2NrKTsKLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZXJwX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBzdGF0dXNfY2hhbmdlX3NldCh1bnNpZ25lZCBsb25nIG1hc2ssIGF0b21pY190ICpzdGF0dXMpCkBAIC01NDAsOCArNTQ3LDEwIEBACiB7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KQorCXJlYWRfbG9jaygmYWRhcHRlci0+cG9ydF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdCwgbGlzdCkKIAkJX3pmY3BfZXJwX3BvcnRfcmVvcGVuKHBvcnQsIGNsZWFyLCBpZCwgcmVmKTsKKwlyZWFkX3VubG9jaygmYWRhcHRlci0+cG9ydF9saXN0X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBfemZjcF9lcnBfdW5pdF9yZW9wZW5fYWxsKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIGludCBjbGVhciwKQEAgLTU0OSw4ICs1NTgsMTAgQEAKIHsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0X2hlYWQsIGxpc3QpCisJcmVhZF9sb2NrKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0LCBsaXN0KQogCQlfemZjcF9lcnBfdW5pdF9yZW9wZW4odW5pdCwgY2xlYXIsIGlkLCByZWYpOworCXJlYWRfdW5sb2NrKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIHpmY3BfZXJwX3N0cmF0ZWd5X2ZvbGxvd3VwX2ZhaWxlZChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICphY3QpCkBAIC01OTAsMTYgKzYwMSwxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlyZWFkX2xvY2tfaXJxc2F2ZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7Ci0JcmVhZF9sb2NrKCZhZGFwdGVyLT5lcnBfbG9jayk7CisJcmVhZF9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmVycF9sb2NrLCBmbGFncyk7CiAJaWYgKGxpc3RfZW1wdHkoJmFkYXB0ZXItPmVycF9yZWFkeV9oZWFkKSAmJgogCSAgICBsaXN0X2VtcHR5KCZhZGFwdGVyLT5lcnBfcnVubmluZ19oZWFkKSkgewogCQkJYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9FUlBfUEVORElORywKIAkJCQkJICAmYWRhcHRlci0+c3RhdHVzKTsKIAkJCXdha2VfdXAoJmFkYXB0ZXItPmVycF9kb25lX3dxaCk7CiAJfQotCXJlYWRfdW5sb2NrKCZhZGFwdGVyLT5lcnBfbG9jayk7Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZXJwX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCB6ZmNwX2VycF9hZGFwdGVyX3N0cmF0ZWd5X29wZW5fcWRpbyhzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICphY3QpCkBAIC0xMTcwLDI4ICsxMTc5LDI4IEBACiAJc3dpdGNoIChhY3QtPmFjdGlvbikgewogCWNhc2UgWkZDUF9FUlBfQUNUSU9OX1JFT1BFTl9VTklUOgogCQlpZiAoKHJlc3VsdCA9PSBaRkNQX0VSUF9TVUNDRUVERUQpICYmICF1bml0LT5kZXZpY2UpIHsKLQkJCXpmY3BfdW5pdF9nZXQodW5pdCk7CisJCQlnZXRfZGV2aWNlKCZ1bml0LT5zeXNmc19kZXZpY2UpOwogCQkJaWYgKHNjc2lfcXVldWVfd29yayh1bml0LT5wb3J0LT5hZGFwdGVyLT5zY3NpX2hvc3QsCiAJCQkJCSAgICAmdW5pdC0+c2NzaV93b3JrKSA8PSAwKQotCQkJCXpmY3BfdW5pdF9wdXQodW5pdCk7CisJCQkJcHV0X2RldmljZSgmdW5pdC0+c3lzZnNfZGV2aWNlKTsKIAkJfQotCQl6ZmNwX3VuaXRfcHV0KHVuaXQpOworCQlwdXRfZGV2aWNlKCZ1bml0LT5zeXNmc19kZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgWkZDUF9FUlBfQUNUSU9OX1JFT1BFTl9QT1JUX0ZPUkNFRDoKIAljYXNlIFpGQ1BfRVJQX0FDVElPTl9SRU9QRU5fUE9SVDoKIAkJaWYgKHJlc3VsdCA9PSBaRkNQX0VSUF9TVUNDRUVERUQpCiAJCQl6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRfcmVnaXN0ZXIocG9ydCk7Ci0JCXpmY3BfcG9ydF9wdXQocG9ydCk7CisJCXB1dF9kZXZpY2UoJnBvcnQtPnN5c2ZzX2RldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBaRkNQX0VSUF9BQ1RJT05fUkVPUEVOX0FEQVBURVI6CiAJCWlmIChyZXN1bHQgPT0gWkZDUF9FUlBfU1VDQ0VFREVEKSB7CiAJCQlyZWdpc3Rlcl9zZXJ2aWNlX2xldmVsKCZhZGFwdGVyLT5zZXJ2aWNlX2xldmVsKTsKLQkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnNjYW5fd29yayk7CisJCQlxdWV1ZV93b3JrKGFkYXB0ZXItPndvcmtfcXVldWUsICZhZGFwdGVyLT5zY2FuX3dvcmspOwogCQl9IGVsc2UKIAkJCXVucmVnaXN0ZXJfc2VydmljZV9sZXZlbCgmYWRhcHRlci0+c2VydmljZV9sZXZlbCk7Ci0JCXpmY3BfYWRhcHRlcl9wdXQoYWRhcHRlcik7CisJCWtyZWZfcHV0KCZhZGFwdGVyLT5yZWYsIHpmY3BfYWRhcHRlcl9yZWxlYXNlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTIxNCwxMiArMTIyMywxMiBAQAogc3RhdGljIGludCB6ZmNwX2VycF9zdHJhdGVneShzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICplcnBfYWN0aW9uKQogewogCWludCByZXR2YWw7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGVycF9hY3Rpb24tPmFkYXB0ZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZXJwX2FjdGlvbi0+YWRhcHRlcjsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQl3cml0ZV9sb2NrKCZhZGFwdGVyLT5lcnBfbG9jayk7CisJa3JlZl9nZXQoJmFkYXB0ZXItPnJlZik7CiAKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmVycF9sb2NrLCBmbGFncyk7CiAJemZjcF9lcnBfc3RyYXRlZ3lfY2hlY2tfZnNmcmVxKGVycF9hY3Rpb24pOwogCiAJaWYgKGVycF9hY3Rpb24tPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0VSUF9ESVNNSVNTRUQpIHsKQEAgLTEyMzEsMTEgKzEyNDAsOSBAQAogCXpmY3BfZXJwX2FjdGlvbl90b19ydW5uaW5nKGVycF9hY3Rpb24pOwogCiAJLyogbm8gbG9jayB0byBhbGxvdyBmb3IgYmxvY2tpbmcgb3BlcmF0aW9ucyAqLwotCXdyaXRlX3VubG9jaygmYWRhcHRlci0+ZXJwX2xvY2spOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5lcnBfbG9jaywgZmxhZ3MpOwogCXJldHZhbCA9IHpmY3BfZXJwX3N0cmF0ZWd5X2RvX2FjdGlvbihlcnBfYWN0aW9uKTsKLQlyZWFkX2xvY2tfaXJxc2F2ZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7Ci0Jd3JpdGVfbG9jaygmYWRhcHRlci0+ZXJwX2xvY2spOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZXJwX2xvY2ssIGZsYWdzKTsKIAogCWlmIChlcnBfYWN0aW9uLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19FUlBfRElTTUlTU0VEKQogCQlyZXR2YWwgPSBaRkNQX0VSUF9DT05USU5VRVM7CkBAIC0xMjczLDEyICsxMjgwLDEyIEBACiAJCXpmY3BfZXJwX3N0cmF0ZWd5X2ZvbGxvd3VwX2ZhaWxlZChlcnBfYWN0aW9uKTsKIAogIHVubG9jazoKLQl3cml0ZV91bmxvY2soJmFkYXB0ZXItPmVycF9sb2NrKTsKLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZXJwX2xvY2ssIGZsYWdzKTsKIAogCWlmIChyZXR2YWwgIT0gWkZDUF9FUlBfQ09OVElOVUVTKQogCQl6ZmNwX2VycF9hY3Rpb25fY2xlYW51cChlcnBfYWN0aW9uLCByZXR2YWwpOwogCisJa3JlZl9wdXQoJmFkYXB0ZXItPnJlZiwgemZjcF9hZGFwdGVyX3JlbGVhc2UpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE0MTUsNiArMTQyMiw3IEBACiAJCQkJICAgIHZvaWQgKnJlZiwgdTMyIG1hc2ssIGludCBzZXRfb3JfY2xlYXIpCiB7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBjb21tb25fbWFzayA9IG1hc2sgJiBaRkNQX0NPTU1PTl9GTEFHUzsKIAogCWlmIChzZXRfb3JfY2xlYXIgPT0gWkZDUF9TRVQpIHsKQEAgLTE0MjksMTAgKzE0MzcsMTMgQEAKIAkJCWF0b21pY19zZXQoJmFkYXB0ZXItPmVycF9jb3VudGVyLCAwKTsKIAl9CiAKLQlpZiAoY29tbW9uX21hc2spCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KQorCWlmIChjb21tb25fbWFzaykgeworCQlyZWFkX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0LCBsaXN0KQogCQkJemZjcF9lcnBfbW9kaWZ5X3BvcnRfc3RhdHVzKHBvcnQsIGlkLCByZWYsIGNvbW1vbl9tYXNrLAogCQkJCQkJICAgIHNldF9vcl9jbGVhcik7CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrLCBmbGFncyk7CisJfQogfQogCiAvKioKQEAgLTE0NDksNiArMTQ2MCw3IEBACiAJCQkJIHUzMiBtYXNrLCBpbnQgc2V0X29yX2NsZWFyKQogewogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgY29tbW9uX21hc2sgPSBtYXNrICYgWkZDUF9DT01NT05fRkxBR1M7CiAKIAlpZiAoc2V0X29yX2NsZWFyID09IFpGQ1BfU0VUKSB7CkBAIC0xNDYzLDEwICsxNDc1LDEzIEBACiAJCQlhdG9taWNfc2V0KCZwb3J0LT5lcnBfY291bnRlciwgMCk7CiAJfQogCi0JaWYgKGNvbW1vbl9tYXNrKQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVuaXQsICZwb3J0LT51bml0X2xpc3RfaGVhZCwgbGlzdCkKKwlpZiAoY29tbW9uX21hc2spIHsKKwkJcmVhZF9sb2NrX2lycXNhdmUoJnBvcnQtPnVuaXRfbGlzdF9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodW5pdCwgJnBvcnQtPnVuaXRfbGlzdCwgbGlzdCkKIAkJCXpmY3BfZXJwX21vZGlmeV91bml0X3N0YXR1cyh1bml0LCBpZCwgcmVmLCBjb21tb25fbWFzaywKIAkJCQkJCSAgICBzZXRfb3JfY2xlYXIpOworCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT51bml0X2xpc3RfbG9jaywgZmxhZ3MpOworCX0KIH0KIAogLyoqCkBAIC0xNTAyLDEyICsxNTE3LDggQEAKICAqLwogdm9pZCB6ZmNwX2VycF9wb3J0X2JveGVkKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIGNoYXIgKmlkLCB2b2lkICpyZWYpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKIAl6ZmNwX2VycF9tb2RpZnlfcG9ydF9zdGF0dXMocG9ydCwgaWQsIHJlZiwKIAkJCQkgICAgWkZDUF9TVEFUVVNfQ09NTU9OX0FDQ0VTU19CT1hFRCwgWkZDUF9TRVQpOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwogCXpmY3BfZXJwX3BvcnRfcmVvcGVuKHBvcnQsIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfRkFJTEVELCBpZCwgcmVmKTsKIH0KIApAQCAtMTUzNSwxMyArMTU0Niw5IEBACiAgKi8KIHZvaWQgemZjcF9lcnBfcG9ydF9hY2Nlc3NfZGVuaWVkKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIGNoYXIgKmlkLCB2b2lkICpyZWYpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKIAl6ZmNwX2VycF9tb2RpZnlfcG9ydF9zdGF0dXMocG9ydCwgaWQsIHJlZiwKIAkJCQkgICAgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQgfAogCQkJCSAgICBaRkNQX1NUQVRVU19DT01NT05fQUNDRVNTX0RFTklFRCwgWkZDUF9TRVQpOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwogfQogCiAvKioKQEAgLTE1NzQsMTIgKzE1ODEsMTUgQEAKIAkJCQkJIHZvaWQgKnJlZikKIHsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1cyA9IGF0b21pY19yZWFkKCZwb3J0LT5zdGF0dXMpOwogCiAJaWYgKCEoc3RhdHVzICYgKFpGQ1BfU1RBVFVTX0NPTU1PTl9BQ0NFU1NfREVOSUVEIHwKIAkJCVpGQ1BfU1RBVFVTX0NPTU1PTl9BQ0NFU1NfQk9YRUQpKSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVuaXQsICZwb3J0LT51bml0X2xpc3RfaGVhZCwgbGlzdCkKKwkJcmVhZF9sb2NrX2lycXNhdmUoJnBvcnQtPnVuaXRfbGlzdF9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodW5pdCwgJnBvcnQtPnVuaXRfbGlzdCwgbGlzdCkKIAkJCQkgICAgemZjcF9lcnBfdW5pdF9hY2Nlc3NfY2hhbmdlZCh1bml0LCBpZCwgcmVmKTsKKwkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dW5pdF9saXN0X2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTU5NSwxNCArMTYwNSwxNCBAQAogdm9pZCB6ZmNwX2VycF9hZGFwdGVyX2FjY2Vzc19jaGFuZ2VkKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsIGNoYXIgKmlkLAogCQkJCSAgICAgdm9pZCAqcmVmKQogewotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwogCiAJaWYgKGFkYXB0ZXItPmNvbm5lY3Rpb25fZmVhdHVyZXMgJiBGU0ZfRkVBVFVSRV9OUElWX01PREUpCiAJCXJldHVybjsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3QsIGxpc3QpCiAJCXpmY3BfZXJwX3BvcnRfYWNjZXNzX2NoYW5nZWQocG9ydCwgaWQsIHJlZik7Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCmluZGV4IGIzZjI4ZGUuLjAzZGVjODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaApAQCAtOSwyNiArOSwzMSBAQAogI2lmbmRlZiBaRkNQX0VYVF9ICiAjZGVmaW5lIFpGQ1BfRVhUX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c2NzaS9mYy9mY19lbHMuaD4KICNpbmNsdWRlICJ6ZmNwX2RlZi5oIgorI2luY2x1ZGUgInpmY3BfZmMuaCIKIAogLyogemZjcF9hdXguYyAqLwogZXh0ZXJuIHN0cnVjdCB6ZmNwX3VuaXQgKnpmY3BfZ2V0X3VuaXRfYnlfbHVuKHN0cnVjdCB6ZmNwX3BvcnQgKiwgdTY0KTsKIGV4dGVybiBzdHJ1Y3QgemZjcF9wb3J0ICp6ZmNwX2dldF9wb3J0X2J5X3d3cG4oc3RydWN0IHpmY3BfYWRhcHRlciAqLCB1NjQpOwotZXh0ZXJuIGludCB6ZmNwX2FkYXB0ZXJfZW5xdWV1ZShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKLWV4dGVybiB2b2lkIHpmY3BfYWRhcHRlcl9kZXF1ZXVlKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CitleHRlcm4gc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9hZGFwdGVyX2VucXVldWUoc3RydWN0IGNjd19kZXZpY2UgKik7CiBleHRlcm4gc3RydWN0IHpmY3BfcG9ydCAqemZjcF9wb3J0X2VucXVldWUoc3RydWN0IHpmY3BfYWRhcHRlciAqLCB1NjQsIHUzMiwKIAkJCQkJICAgdTMyKTsKLWV4dGVybiB2b2lkIHpmY3BfcG9ydF9kZXF1ZXVlKHN0cnVjdCB6ZmNwX3BvcnQgKik7CiBleHRlcm4gc3RydWN0IHpmY3BfdW5pdCAqemZjcF91bml0X2VucXVldWUoc3RydWN0IHpmY3BfcG9ydCAqLCB1NjQpOwotZXh0ZXJuIHZvaWQgemZjcF91bml0X2RlcXVldWUoc3RydWN0IHpmY3BfdW5pdCAqKTsKIGV4dGVybiBpbnQgemZjcF9yZXFsaXN0X2lzZW1wdHkoc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKIGV4dGVybiB2b2lkIHpmY3Bfc2dfZnJlZV90YWJsZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50KTsKIGV4dGVybiBpbnQgemZjcF9zZ19zZXR1cF90YWJsZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIHpmY3BfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKik7CitleHRlcm4gdm9pZCB6ZmNwX2FkYXB0ZXJfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqKTsKK2V4dGVybiB2b2lkIHpmY3BfYWRhcHRlcl91bnJlZ2lzdGVyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CiAKIC8qIHpmY3BfY2N3LmMgKi8KLWV4dGVybiBpbnQgemZjcF9jY3dfcmVnaXN0ZXIodm9pZCk7CiBleHRlcm4gaW50IHpmY3BfY2N3X3ByaXZfc2NoKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CiBleHRlcm4gc3RydWN0IGNjd19kcml2ZXIgemZjcF9jY3dfZHJpdmVyOworZXh0ZXJuIHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKnpmY3BfY2N3X2FkYXB0ZXJfYnlfY2RldihzdHJ1Y3QgY2N3X2RldmljZSAqKTsKK2V4dGVybiB2b2lkIHpmY3BfY2N3X2FkYXB0ZXJfcHV0KHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CiAKIC8qIHpmY3BfY2ZkYy5jICovCiBleHRlcm4gc3RydWN0IG1pc2NkZXZpY2UgemZjcF9jZmRjX21pc2M7CkBAIC01MSw3ICs1Niw3IEBACiAJCQkJCSAgc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9oYmFfcWRpbyhzdHJ1Y3QgemZjcF9kYmYgKiwgdW5zaWduZWQgaW50LCBpbnQsIGludCk7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9oYmFfYmVycihzdHJ1Y3QgemZjcF9kYmYgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKLWV4dGVybiB2b2lkIHpmY3BfZGJmX3Nhbl9jdF9yZXF1ZXN0KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CitleHRlcm4gdm9pZCB6ZmNwX2RiZl9zYW5fY3RfcmVxdWVzdChzdHJ1Y3QgemZjcF9mc2ZfcmVxICosIHUzMik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9zYW5fY3RfcmVzcG9uc2Uoc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZGJmX3Nhbl9lbHNfcmVxdWVzdChzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogZXh0ZXJuIHZvaWQgemZjcF9kYmZfc2FuX2Vsc19yZXNwb25zZShzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwpAQCAtOTIsMjQgKzk3LDIyIEBACiBleHRlcm4gdm9pZCB6ZmNwX2VycF90aW1lb3V0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7CiAKIC8qIHpmY3BfZmMuYyAqLwotZXh0ZXJuIGludCB6ZmNwX2ZjX3NjYW5fcG9ydHMoc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKLWV4dGVybiB2b2lkIF96ZmNwX2ZjX3NjYW5fcG9ydHNfbGF0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgemZjcF9mY19zY2FuX3BvcnRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZmNfaW5jb21pbmdfZWxzKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2ZjX3BvcnRfZGlkX2xvb2t1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2ZjX3RyaWdnZXJfZGlkX2xvb2t1cChzdHJ1Y3QgemZjcF9wb3J0ICopOwotZXh0ZXJuIHZvaWQgemZjcF9mY19wbG9naV9ldmFsdWF0ZShzdHJ1Y3QgemZjcF9wb3J0ICosIHN0cnVjdCBmc2ZfcGxvZ2kgKik7CitleHRlcm4gdm9pZCB6ZmNwX2ZjX3Bsb2dpX2V2YWx1YXRlKHN0cnVjdCB6ZmNwX3BvcnQgKiwgc3RydWN0IGZjX2Vsc19mbG9naSAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZmNfdGVzdF9saW5rKHN0cnVjdCB6ZmNwX3BvcnQgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2ZjX2xpbmtfdGVzdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKLWV4dGVybiB2b2lkIHpmY3BfZmNfd2thX3BvcnRzX2ZvcmNlX29mZmxpbmUoc3RydWN0IHpmY3Bfd2thX3BvcnRzICopOworZXh0ZXJuIHZvaWQgemZjcF9mY193a2FfcG9ydHNfZm9yY2Vfb2ZmbGluZShzdHJ1Y3QgemZjcF9mY193a2FfcG9ydHMgKik7CiBleHRlcm4gaW50IHpmY3BfZmNfZ3Nfc2V0dXAoc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZmNfZ3NfZGVzdHJveShzdHJ1Y3QgemZjcF9hZGFwdGVyICopOwotZXh0ZXJuIGludCB6ZmNwX2ZjX2V4ZWN1dGVfZWxzX2ZjX2pvYihzdHJ1Y3QgZmNfYnNnX2pvYiAqKTsKLWV4dGVybiBpbnQgemZjcF9mY19leGVjdXRlX2N0X2ZjX2pvYihzdHJ1Y3QgZmNfYnNnX2pvYiAqKTsKK2V4dGVybiBpbnQgemZjcF9mY19leGVjX2JzZ19qb2Ioc3RydWN0IGZjX2JzZ19qb2IgKik7CiAKIC8qIHpmY3BfZnNmLmMgKi8KIGV4dGVybiBpbnQgemZjcF9mc2Zfb3Blbl9wb3J0KHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKik7Ci1leHRlcm4gaW50IHpmY3BfZnNmX29wZW5fd2thX3BvcnQoc3RydWN0IHpmY3Bfd2thX3BvcnQgKik7Ci1leHRlcm4gaW50IHpmY3BfZnNmX2Nsb3NlX3drYV9wb3J0KHN0cnVjdCB6ZmNwX3drYV9wb3J0ICopOworZXh0ZXJuIGludCB6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0KHN0cnVjdCB6ZmNwX2ZjX3drYV9wb3J0ICopOworZXh0ZXJuIGludCB6ZmNwX2ZzZl9jbG9zZV93a2FfcG9ydChzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCAqKTsKIGV4dGVybiBpbnQgemZjcF9mc2ZfY2xvc2VfcG9ydChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICopOwogZXh0ZXJuIGludCB6ZmNwX2ZzZl9jbG9zZV9waHlzaWNhbF9wb3J0KHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKik7CiBleHRlcm4gaW50IHpmY3BfZnNmX29wZW5fdW5pdChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICopOwpAQCAtMTI1LDggKzEyOCwxMCBAQAogZXh0ZXJuIHZvaWQgemZjcF9mc2ZfcmVxX2Rpc21pc3NfYWxsKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CiBleHRlcm4gaW50IHpmY3BfZnNmX3N0YXR1c19yZWFkKHN0cnVjdCB6ZmNwX3FkaW8gKik7CiBleHRlcm4gaW50IHpmY3Bfc3RhdHVzX3JlYWRfcmVmaWxsKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpOwotZXh0ZXJuIGludCB6ZmNwX2ZzZl9zZW5kX2N0KHN0cnVjdCB6ZmNwX3NlbmRfY3QgKiwgbWVtcG9vbF90ICopOwotZXh0ZXJuIGludCB6ZmNwX2ZzZl9zZW5kX2VscyhzdHJ1Y3QgemZjcF9zZW5kX2VscyAqKTsKK2V4dGVybiBpbnQgemZjcF9mc2Zfc2VuZF9jdChzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCAqLCBzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICosCisJCQkgICAgbWVtcG9vbF90ICopOworZXh0ZXJuIGludCB6ZmNwX2ZzZl9zZW5kX2VscyhzdHJ1Y3QgemZjcF9hZGFwdGVyICosIHUzMiwKKwkJCSAgICAgc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqKTsKIGV4dGVybiBpbnQgemZjcF9mc2Zfc2VuZF9mY3BfY29tbWFuZF90YXNrKHN0cnVjdCB6ZmNwX3VuaXQgKiwKIAkJCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kICopOwogZXh0ZXJuIHZvaWQgemZjcF9mc2ZfcmVxX2ZyZWUoc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKQEAgLTE1Myw3ICsxNTgsNiBAQAogZXh0ZXJuIHN0cnVjdCB6ZmNwX2RhdGEgemZjcF9kYXRhOwogZXh0ZXJuIGludCB6ZmNwX2FkYXB0ZXJfc2NzaV9yZWdpc3RlcihzdHJ1Y3QgemZjcF9hZGFwdGVyICopOwogZXh0ZXJuIHZvaWQgemZjcF9hZGFwdGVyX3Njc2lfdW5yZWdpc3RlcihzdHJ1Y3QgemZjcF9hZGFwdGVyICopOwotZXh0ZXJuIGNoYXIgKnpmY3BfZ2V0X2ZjcF9zbnNfaW5mb19wdHIoc3RydWN0IGZjcF9yc3BfaXUgKik7CiBleHRlcm4gc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlIHpmY3BfdHJhbnNwb3J0X2Z1bmN0aW9uczsKIGV4dGVybiB2b2lkIHpmY3Bfc2NzaV9ycG9ydF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIHpmY3Bfc2NzaV9zY2hlZHVsZV9ycG9ydF9yZWdpc3RlcihzdHJ1Y3QgemZjcF9wb3J0ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jCmluZGV4IGRmMjNiY2UuLmFjNWUzYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmMKQEAgLTksNzMgKzksMzggQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQgInpmY3AiCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNjc2kvZmMvZmNfZWxzLmg+CisjaW5jbHVkZSA8c2NzaS9saWJmYy5oPgogI2luY2x1ZGUgInpmY3BfZXh0LmgiCisjaW5jbHVkZSAiemZjcF9mYy5oIgogCi1lbnVtIHJzY25fYWRkcmVzc19mb3JtYXQgewotCVJTQ05fUE9SVF9BRERSRVNTCT0gMHgwLAotCVJTQ05fQVJFQV9BRERSRVNTCT0gMHgxLAotCVJTQ05fRE9NQUlOX0FERFJFU1MJPSAweDIsCi0JUlNDTl9GQUJSSUNfQUREUkVTUwk9IDB4MywKK3N0YXRpYyB1MzIgemZjcF9mY19yc2NuX3JhbmdlX21hc2tbXSA9IHsKKwlbRUxTX0FERFJfRk1UX1BPUlRdCQk9IDB4RkZGRkZGLAorCVtFTFNfQUREUl9GTVRfQVJFQV0JCT0gMHhGRkZGMDAsCisJW0VMU19BRERSX0ZNVF9ET01dCQk9IDB4RkYwMDAwLAorCVtFTFNfQUREUl9GTVRfRkFCXQkJPSAweDAwMDAwMCwKIH07CiAKLXN0YXRpYyB1MzIgcnNjbl9yYW5nZV9tYXNrW10gPSB7Ci0JW1JTQ05fUE9SVF9BRERSRVNTXQkJPSAweEZGRkZGRiwKLQlbUlNDTl9BUkVBX0FERFJFU1NdCQk9IDB4RkZGRjAwLAotCVtSU0NOX0RPTUFJTl9BRERSRVNTXQkJPSAweEZGMDAwMCwKLQlbUlNDTl9GQUJSSUNfQUREUkVTU10JCT0gMHgwMDAwMDAsCi19OwotCi1zdHJ1Y3QgZ3BuX2Z0X3Jlc3BfYWNjIHsKLQl1OCBjb250cm9sOwotCXU4IHBvcnRfaWRbM107Ci0JdTggcmVzZXJ2ZWRbNF07Ci0JdTY0IHd3cG47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBaRkNQX0NUX1NJWkVfT05FX1BBR0UJKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgY3RfaGRyKSkKLSNkZWZpbmUgWkZDUF9HUE5fRlRfRU5UUklFUwkoWkZDUF9DVF9TSVpFX09ORV9QQUdFIFwKLQkJCQkJLyBzaXplb2Yoc3RydWN0IGdwbl9mdF9yZXNwX2FjYykpCi0jZGVmaW5lIFpGQ1BfR1BOX0ZUX0JVRkZFUlMgNAotI2RlZmluZSBaRkNQX0dQTl9GVF9NQVhfU0laRSAoWkZDUF9HUE5fRlRfQlVGRkVSUyAqIFBBR0VfU0laRSBcCi0JCQkJLSBzaXplb2Yoc3RydWN0IGN0X2hkcikpCi0jZGVmaW5lIFpGQ1BfR1BOX0ZUX01BWF9FTlRSSUVTIFpGQ1BfR1BOX0ZUX0JVRkZFUlMgKiAoWkZDUF9HUE5fRlRfRU5UUklFUyArIDEpCi0KLXN0cnVjdCBjdF9pdV9ncG5fZnRfcmVzcCB7Ci0Jc3RydWN0IGN0X2hkciBoZWFkZXI7Ci0Jc3RydWN0IGdwbl9mdF9yZXNwX2FjYyBhY2NlcHRbWkZDUF9HUE5fRlRfRU5UUklFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IHpmY3BfZ3BuX2Z0IHsKLQlzdHJ1Y3QgemZjcF9zZW5kX2N0IGN0OwotCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19yZXE7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnX3Jlc3BbWkZDUF9HUE5fRlRfQlVGRkVSU107Ci19OwotCi1zdHJ1Y3QgemZjcF9mY19uc19oYW5kbGVyX2RhdGEgewotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci0Jdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcpOwotCXVuc2lnbmVkIGxvbmcgaGFuZGxlcl9kYXRhOwotfTsKLQotc3RhdGljIGludCB6ZmNwX2ZjX3drYV9wb3J0X2dldChzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQpCitzdGF0aWMgaW50IHpmY3BfZmNfd2thX3BvcnRfZ2V0KHN0cnVjdCB6ZmNwX2ZjX3drYV9wb3J0ICp3a2FfcG9ydCkKIHsKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ3a2FfcG9ydC0+bXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JaWYgKHdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FIHx8Ci0JICAgIHdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9XS0FfUE9SVF9DTE9TSU5HKSB7Ci0JCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX1dLQV9QT1JUX09QRU5JTkc7CisJaWYgKHdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9GQ19XS0FfUE9SVF9PRkZMSU5FIHx8CisJICAgIHdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9GQ19XS0FfUE9SVF9DTE9TSU5HKSB7CisJCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX0ZDX1dLQV9QT1JUX09QRU5JTkc7CiAJCWlmICh6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0KHdrYV9wb3J0KSkKLQkJCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX1dLQV9QT1JUX09GRkxJTkU7CisJCQl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9GQ19XS0FfUE9SVF9PRkZMSU5FOwogCX0KIAogCW11dGV4X3VubG9jaygmd2thX3BvcnQtPm11dGV4KTsKIAogCXdhaXRfZXZlbnQod2thX3BvcnQtPmNvbXBsZXRpb25fd3EsCi0JCSAgIHdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9XS0FfUE9SVF9PTkxJTkUgfHwKLQkJICAgd2thX3BvcnQtPnN0YXR1cyA9PSBaRkNQX1dLQV9QT1JUX09GRkxJTkUpOworCQkgICB3a2FfcG9ydC0+c3RhdHVzID09IFpGQ1BfRkNfV0tBX1BPUlRfT05MSU5FIHx8CisJCSAgIHdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9GQ19XS0FfUE9SVF9PRkZMSU5FKTsKIAotCWlmICh3a2FfcG9ydC0+c3RhdHVzID09IFpGQ1BfV0tBX1BPUlRfT05MSU5FKSB7CisJaWYgKHdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9GQ19XS0FfUE9SVF9PTkxJTkUpIHsKIAkJYXRvbWljX2luYygmd2thX3BvcnQtPnJlZmNvdW50KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtODUsMjQgKzUwLDI0IEBACiBzdGF0aWMgdm9pZCB6ZmNwX2ZjX3drYV9wb3J0X29mZmxpbmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3ID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCXN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCA9Ci0JCQljb250YWluZXJfb2YoZHcsIHN0cnVjdCB6ZmNwX3drYV9wb3J0LCB3b3JrKTsKKwlzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCAqd2thX3BvcnQgPQorCQkJY29udGFpbmVyX29mKGR3LCBzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCwgd29yayk7CiAKIAltdXRleF9sb2NrKCZ3a2FfcG9ydC0+bXV0ZXgpOwogCWlmICgoYXRvbWljX3JlYWQoJndrYV9wb3J0LT5yZWZjb3VudCkgIT0gMCkgfHwKLQkgICAgKHdrYV9wb3J0LT5zdGF0dXMgIT0gWkZDUF9XS0FfUE9SVF9PTkxJTkUpKQorCSAgICAod2thX3BvcnQtPnN0YXR1cyAhPSBaRkNQX0ZDX1dLQV9QT1JUX09OTElORSkpCiAJCWdvdG8gb3V0OwogCi0Jd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfV0tBX1BPUlRfQ0xPU0lORzsKKwl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9GQ19XS0FfUE9SVF9DTE9TSU5HOwogCWlmICh6ZmNwX2ZzZl9jbG9zZV93a2FfcG9ydCh3a2FfcG9ydCkpIHsKLQkJd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfV0tBX1BPUlRfT0ZGTElORTsKKwkJd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfRkNfV0tBX1BPUlRfT0ZGTElORTsKIAkJd2FrZV91cCgmd2thX3BvcnQtPmNvbXBsZXRpb25fd3EpOwogCX0KIG91dDoKIAltdXRleF91bmxvY2soJndrYV9wb3J0LT5tdXRleCk7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfZmNfd2thX3BvcnRfcHV0KHN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCkKK3N0YXRpYyB2b2lkIHpmY3BfZmNfd2thX3BvcnRfcHV0KHN0cnVjdCB6ZmNwX2ZjX3drYV9wb3J0ICp3a2FfcG9ydCkKIHsKIAlpZiAoYXRvbWljX2RlY19yZXR1cm4oJndrYV9wb3J0LT5yZWZjb3VudCkgIT0gMCkKIAkJcmV0dXJuOwpAQCAtMTEwLDcgKzc1LDcgQEAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndrYV9wb3J0LT53b3JrLCBIWiAvIDEwMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfZmNfd2thX3BvcnRfaW5pdChzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQsIHUzMiBkX2lkLAorc3RhdGljIHZvaWQgemZjcF9mY193a2FfcG9ydF9pbml0KHN0cnVjdCB6ZmNwX2ZjX3drYV9wb3J0ICp3a2FfcG9ydCwgdTMyIGRfaWQsCiAJCQkJICBzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQogewogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndrYV9wb3J0LT5jb21wbGV0aW9uX3dxKTsKQEAgLTExOCwxMDcgKzgzLDEwNyBAQAogCXdrYV9wb3J0LT5hZGFwdGVyID0gYWRhcHRlcjsKIAl3a2FfcG9ydC0+ZF9pZCA9IGRfaWQ7CiAKLQl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FOworCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX0ZDX1dLQV9QT1JUX09GRkxJTkU7CiAJYXRvbWljX3NldCgmd2thX3BvcnQtPnJlZmNvdW50LCAwKTsKIAltdXRleF9pbml0KCZ3a2FfcG9ydC0+bXV0ZXgpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZ3a2FfcG9ydC0+d29yaywgemZjcF9mY193a2FfcG9ydF9vZmZsaW5lKTsKIH0KIAotc3RhdGljIHZvaWQgemZjcF9mY193a2FfcG9ydF9mb3JjZV9vZmZsaW5lKHN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2EpCitzdGF0aWMgdm9pZCB6ZmNwX2ZjX3drYV9wb3J0X2ZvcmNlX29mZmxpbmUoc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgKndrYSkKIHsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndrYS0+d29yayk7CiAJbXV0ZXhfbG9jaygmd2thLT5tdXRleCk7Ci0Jd2thLT5zdGF0dXMgPSBaRkNQX1dLQV9QT1JUX09GRkxJTkU7CisJd2thLT5zdGF0dXMgPSBaRkNQX0ZDX1dLQV9QT1JUX09GRkxJTkU7CiAJbXV0ZXhfdW5sb2NrKCZ3a2EtPm11dGV4KTsKIH0KIAotdm9pZCB6ZmNwX2ZjX3drYV9wb3J0c19mb3JjZV9vZmZsaW5lKHN0cnVjdCB6ZmNwX3drYV9wb3J0cyAqZ3MpCit2b2lkIHpmY3BfZmNfd2thX3BvcnRzX2ZvcmNlX29mZmxpbmUoc3RydWN0IHpmY3BfZmNfd2thX3BvcnRzICpncykKIHsKKwlpZiAoIWdzKQorCQlyZXR1cm47CiAJemZjcF9mY193a2FfcG9ydF9mb3JjZV9vZmZsaW5lKCZncy0+bXMpOwogCXpmY3BfZmNfd2thX3BvcnRfZm9yY2Vfb2ZmbGluZSgmZ3MtPnRzKTsKIAl6ZmNwX2ZjX3drYV9wb3J0X2ZvcmNlX29mZmxpbmUoJmdzLT5kcyk7CiAJemZjcF9mY193a2FfcG9ydF9mb3JjZV9vZmZsaW5lKCZncy0+YXMpOwotCXpmY3BfZmNfd2thX3BvcnRfZm9yY2Vfb2ZmbGluZSgmZ3MtPmtzKTsKIH0KIAogc3RhdGljIHZvaWQgX3pmY3BfZmNfaW5jb21pbmdfcnNjbihzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxLCB1MzIgcmFuZ2UsCi0JCQkJICAgc3RydWN0IGZjcF9yc2NuX2VsZW1lbnQgKmVsZW0pCisJCQkJICAgc3RydWN0IGZjX2Vsc19yc2NuX3BhZ2UgKnBhZ2UpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZnNmX3JlcS0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwogCi0JcmVhZF9sb2NrX2lycXNhdmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmZzZl9yZXEtPmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KSB7Ci0JCWlmICgocG9ydC0+ZF9pZCAmIHJhbmdlKSA9PSAoZWxlbS0+bnBvcnRfZGlkICYgcmFuZ2UpKQorCXJlYWRfbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoKHBvcnQtPmRfaWQgJiByYW5nZSkgPT0gKG50b2gyNChwYWdlLT5yc2NuX2ZpZCkgJiByYW5nZSkpCiAJCQl6ZmNwX2ZjX3Rlc3RfbGluayhwb3J0KTsKIAkJaWYgKCFwb3J0LT5kX2lkKQogCQkJemZjcF9lcnBfcG9ydF9yZW9wZW4ocG9ydCwKIAkJCQkJICAgICBaRkNQX1NUQVRVU19DT01NT05fRVJQX0ZBSUxFRCwKIAkJCQkJICAgICAiZmNyc2NuMSIsIE5VTEwpOwogCX0KLQotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHpmY3BfZmNfaW5jb21pbmdfcnNjbihzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxKQogewogCXN0cnVjdCBmc2Zfc3RhdHVzX3JlYWRfYnVmZmVyICpzdGF0dXNfYnVmZmVyID0gKHZvaWQgKilmc2ZfcmVxLT5kYXRhOwotCXN0cnVjdCBmY3BfcnNjbl9oZWFkICpmY3BfcnNjbl9oZWFkOwotCXN0cnVjdCBmY3BfcnNjbl9lbGVtZW50ICpmY3BfcnNjbl9lbGVtZW50OworCXN0cnVjdCBmY19lbHNfcnNjbiAqaGVhZDsKKwlzdHJ1Y3QgZmNfZWxzX3JzY25fcGFnZSAqcGFnZTsKIAl1MTYgaTsKIAl1MTYgbm9fZW50cmllczsKLQl1MzIgcmFuZ2VfbWFzazsKKwl1bnNpZ25lZCBpbnQgYWZtdDsKIAotCWZjcF9yc2NuX2hlYWQgPSAoc3RydWN0IGZjcF9yc2NuX2hlYWQgKikgc3RhdHVzX2J1ZmZlci0+cGF5bG9hZC5kYXRhOwotCWZjcF9yc2NuX2VsZW1lbnQgPSAoc3RydWN0IGZjcF9yc2NuX2VsZW1lbnQgKikgZmNwX3JzY25faGVhZDsKKwloZWFkID0gKHN0cnVjdCBmY19lbHNfcnNjbiAqKSBzdGF0dXNfYnVmZmVyLT5wYXlsb2FkLmRhdGE7CisJcGFnZSA9IChzdHJ1Y3QgZmNfZWxzX3JzY25fcGFnZSAqKSBoZWFkOwogCiAJLyogc2VlIEZDLUZTICovCi0Jbm9fZW50cmllcyA9IGZjcF9yc2NuX2hlYWQtPnBheWxvYWRfbGVuIC8KLQkJCXNpemVvZihzdHJ1Y3QgZmNwX3JzY25fZWxlbWVudCk7CisJbm9fZW50cmllcyA9IGhlYWQtPnJzY25fcGxlbiAvIHNpemVvZihzdHJ1Y3QgZmNfZWxzX3JzY25fcGFnZSk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgbm9fZW50cmllczsgaSsrKSB7CiAJCS8qIHNraXAgaGVhZCBhbmQgc3RhcnQgd2l0aCAxc3QgZWxlbWVudCAqLwotCQlmY3BfcnNjbl9lbGVtZW50Kys7Ci0JCXJhbmdlX21hc2sgPSByc2NuX3JhbmdlX21hc2tbZmNwX3JzY25fZWxlbWVudC0+YWRkcl9mb3JtYXRdOwotCQlfemZjcF9mY19pbmNvbWluZ19yc2NuKGZzZl9yZXEsIHJhbmdlX21hc2ssIGZjcF9yc2NuX2VsZW1lbnQpOworCQlwYWdlKys7CisJCWFmbXQgPSBwYWdlLT5yc2NuX3BhZ2VfZmxhZ3MgJiBFTFNfUlNDTl9BRERSX0ZNVF9NQVNLOworCQlfemZjcF9mY19pbmNvbWluZ19yc2NuKGZzZl9yZXEsIHpmY3BfZmNfcnNjbl9yYW5nZV9tYXNrW2FmbXRdLAorCQkJCSAgICAgICBwYWdlKTsKIAl9Ci0Jc2NoZWR1bGVfd29yaygmZnNmX3JlcS0+YWRhcHRlci0+c2Nhbl93b3JrKTsKKwlxdWV1ZV93b3JrKGZzZl9yZXEtPmFkYXB0ZXItPndvcmtfcXVldWUsICZmc2ZfcmVxLT5hZGFwdGVyLT5zY2FuX3dvcmspOwogfQogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZjX2luY29taW5nX3d3cG4oc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxLCB1NjQgd3dwbikKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSByZXEtPmFkYXB0ZXI7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcmVhZF9sb2NrX2lycXNhdmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KQotCQlpZiAocG9ydC0+d3dwbiA9PSB3d3BuKQorCXJlYWRfbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdCwgbGlzdCkKKwkJaWYgKHBvcnQtPnd3cG4gPT0gd3dwbikgeworCQkJemZjcF9lcnBfcG9ydF9mb3JjZWRfcmVvcGVuKHBvcnQsIDAsICJmY2l3d3AxIiwgcmVxKTsKIAkJCWJyZWFrOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHBvcnQgJiYgKHBvcnQtPnd3cG4gPT0gd3dwbikpCi0JCXpmY3BfZXJwX3BvcnRfZm9yY2VkX3Jlb3Blbihwb3J0LCAwLCAiZmNpd3dwMSIsIHJlcSk7CisJCX0KKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZjX2luY29taW5nX3Bsb2dpKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKIHsKLQlzdHJ1Y3QgZnNmX3N0YXR1c19yZWFkX2J1ZmZlciAqc3RhdHVzX2J1ZmZlciA9Ci0JCShzdHJ1Y3QgZnNmX3N0YXR1c19yZWFkX2J1ZmZlciAqKXJlcS0+ZGF0YTsKLQlzdHJ1Y3QgZnNmX3Bsb2dpICplbHNfcGxvZ2kgPQotCQkoc3RydWN0IGZzZl9wbG9naSAqKSBzdGF0dXNfYnVmZmVyLT5wYXlsb2FkLmRhdGE7CisJc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIgKnN0YXR1c19idWZmZXI7CisJc3RydWN0IGZjX2Vsc19mbG9naSAqcGxvZ2k7CiAKLQl6ZmNwX2ZjX2luY29taW5nX3d3cG4ocmVxLCBlbHNfcGxvZ2ktPnNlcnZfcGFyYW0ud3dwbik7CisJc3RhdHVzX2J1ZmZlciA9IChzdHJ1Y3QgZnNmX3N0YXR1c19yZWFkX2J1ZmZlciAqKSByZXEtPmRhdGE7CisJcGxvZ2kgPSAoc3RydWN0IGZjX2Vsc19mbG9naSAqKSBzdGF0dXNfYnVmZmVyLT5wYXlsb2FkLmRhdGE7CisJemZjcF9mY19pbmNvbWluZ193d3BuKHJlcSwgcGxvZ2ktPmZsX3d3cG4pOwogfQogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZjX2luY29taW5nX2xvZ28oc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewogCXN0cnVjdCBmc2Zfc3RhdHVzX3JlYWRfYnVmZmVyICpzdGF0dXNfYnVmZmVyID0KIAkJKHN0cnVjdCBmc2Zfc3RhdHVzX3JlYWRfYnVmZmVyICopcmVxLT5kYXRhOwotCXN0cnVjdCBmY3BfbG9nbyAqZWxzX2xvZ28gPQotCQkoc3RydWN0IGZjcF9sb2dvICopIHN0YXR1c19idWZmZXItPnBheWxvYWQuZGF0YTsKKwlzdHJ1Y3QgZmNfZWxzX2xvZ28gKmxvZ28gPQorCQkoc3RydWN0IGZjX2Vsc19sb2dvICopIHN0YXR1c19idWZmZXItPnBheWxvYWQuZGF0YTsKIAotCXpmY3BfZmNfaW5jb21pbmdfd3dwbihyZXEsIGVsc19sb2dvLT5ucG9ydF93d3BuKTsKKwl6ZmNwX2ZjX2luY29taW5nX3d3cG4ocmVxLCBsb2dvLT5mbF9uX3BvcnRfd3duKTsKIH0KIAogLyoqCkBAIC0yMzIsNzkgKzE5Nyw3MiBAQAogCXVuc2lnbmVkIGludCBlbHNfdHlwZSA9IHN0YXR1c19idWZmZXItPnBheWxvYWQuZGF0YVswXTsKIAogCXpmY3BfZGJmX3Nhbl9pbmNvbWluZ19lbHMoZnNmX3JlcSk7Ci0JaWYgKGVsc190eXBlID09IExTX1BMT0dJKQorCWlmIChlbHNfdHlwZSA9PSBFTFNfUExPR0kpCiAJCXpmY3BfZmNfaW5jb21pbmdfcGxvZ2koZnNmX3JlcSk7Ci0JZWxzZSBpZiAoZWxzX3R5cGUgPT0gTFNfTE9HTykKKwllbHNlIGlmIChlbHNfdHlwZSA9PSBFTFNfTE9HTykKIAkJemZjcF9mY19pbmNvbWluZ19sb2dvKGZzZl9yZXEpOwotCWVsc2UgaWYgKGVsc190eXBlID09IExTX1JTQ04pCisJZWxzZSBpZiAoZWxzX3R5cGUgPT0gRUxTX1JTQ04pCiAJCXpmY3BfZmNfaW5jb21pbmdfcnNjbihmc2ZfcmVxKTsKIH0KIAotc3RhdGljIHZvaWQgemZjcF9mY19uc19oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIHpmY3BfZmNfbnNfZ2lkX3BuX2V2YWwodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgemZjcF9mY19uc19oYW5kbGVyX2RhdGEgKmNvbXBsX3JlYyA9Ci0JCQkoc3RydWN0IHpmY3BfZmNfbnNfaGFuZGxlcl9kYXRhICopIGRhdGE7Ci0KLQlpZiAoY29tcGxfcmVjLT5oYW5kbGVyKQotCQljb21wbF9yZWMtPmhhbmRsZXIoY29tcGxfcmVjLT5oYW5kbGVyX2RhdGEpOwotCi0JY29tcGxldGUoJmNvbXBsX3JlYy0+ZG9uZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHpmY3BfZmNfbnNfZ2lkX3BuX2V2YWwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB6ZmNwX2dpZF9wbl9kYXRhICpnaWRfcG4gPSAoc3RydWN0IHpmY3BfZ2lkX3BuX2RhdGEgKikgZGF0YTsKLQlzdHJ1Y3QgemZjcF9zZW5kX2N0ICpjdCA9ICZnaWRfcG4tPmN0OwotCXN0cnVjdCBjdF9pdV9naWRfcG5fcmVxICpjdF9pdV9yZXEgPSBzZ192aXJ0KGN0LT5yZXEpOwotCXN0cnVjdCBjdF9pdV9naWRfcG5fcmVzcCAqY3RfaXVfcmVzcCA9IHNnX3ZpcnQoY3QtPnJlc3ApOworCXN0cnVjdCB6ZmNwX2ZjX2dpZF9wbiAqZ2lkX3BuID0gZGF0YTsKKwlzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICpjdCA9ICZnaWRfcG4tPmN0OworCXN0cnVjdCB6ZmNwX2ZjX2dpZF9wbl9yZXEgKmdpZF9wbl9yZXEgPSBzZ192aXJ0KGN0LT5yZXEpOworCXN0cnVjdCB6ZmNwX2ZjX2dpZF9wbl9yZXNwICpnaWRfcG5fcmVzcCA9IHNnX3ZpcnQoY3QtPnJlc3ApOwogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBnaWRfcG4tPnBvcnQ7CiAKIAlpZiAoY3QtPnN0YXR1cykKIAkJcmV0dXJuOwotCWlmIChjdF9pdV9yZXNwLT5oZWFkZXIuY21kX3JzcF9jb2RlICE9IFpGQ1BfQ1RfQUNDRVBUKQorCWlmIChnaWRfcG5fcmVzcC0+Y3RfaGRyLmN0X2NtZCAhPSBGQ19GU19BQ0MpCiAJCXJldHVybjsKIAogCS8qIHBhcmFub2lhICovCi0JaWYgKGN0X2l1X3JlcS0+d3dwbiAhPSBwb3J0LT53d3BuKQorCWlmIChnaWRfcG5fcmVxLT5naWRfcG4uZm5fd3dwbiAhPSBwb3J0LT53d3BuKQogCQlyZXR1cm47CiAJLyogbG9va3MgbGlrZSBhIHZhbGlkIGRfaWQgKi8KLQlwb3J0LT5kX2lkID0gY3RfaXVfcmVzcC0+ZF9pZCAmIFpGQ1BfRElEX01BU0s7CisJcG9ydC0+ZF9pZCA9IG50b2gyNChnaWRfcG5fcmVzcC0+Z2lkX3BuLmZwX2ZpZCk7Cit9CisKK3N0YXRpYyB2b2lkIHpmY3BfZmNfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwljb21wbGV0ZShkYXRhKTsKIH0KIAogc3RhdGljIGludCB6ZmNwX2ZjX25zX2dpZF9wbl9yZXF1ZXN0KHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsCi0JCQkJICAgICBzdHJ1Y3QgemZjcF9naWRfcG5fZGF0YSAqZ2lkX3BuKQorCQkJCSAgICAgc3RydWN0IHpmY3BfZmNfZ2lkX3BuICpnaWRfcG4pCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7Ci0Jc3RydWN0IHpmY3BfZmNfbnNfaGFuZGxlcl9kYXRhIGNvbXBsX3JlYzsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wbGV0aW9uKTsKIAlpbnQgcmV0OwogCiAJLyogc2V0dXAgcGFyYW1ldGVycyBmb3Igc2VuZCBnZW5lcmljIGNvbW1hbmQgKi8KIAlnaWRfcG4tPnBvcnQgPSBwb3J0OwotCWdpZF9wbi0+Y3Qud2thX3BvcnQgPSAmYWRhcHRlci0+Z3MtPmRzOwotCWdpZF9wbi0+Y3QuaGFuZGxlciA9IHpmY3BfZmNfbnNfaGFuZGxlcjsKLQlnaWRfcG4tPmN0LmhhbmRsZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmY29tcGxfcmVjOwotCWdpZF9wbi0+Y3QucmVxID0gJmdpZF9wbi0+cmVxOwotCWdpZF9wbi0+Y3QucmVzcCA9ICZnaWRfcG4tPnJlc3A7Ci0Jc2dfaW5pdF9vbmUoJmdpZF9wbi0+cmVxLCAmZ2lkX3BuLT5jdF9pdV9yZXEsCi0JCSAgICBzaXplb2Yoc3RydWN0IGN0X2l1X2dpZF9wbl9yZXEpKTsKLQlzZ19pbml0X29uZSgmZ2lkX3BuLT5yZXNwLCAmZ2lkX3BuLT5jdF9pdV9yZXNwLAotCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9pdV9naWRfcG5fcmVzcCkpOworCWdpZF9wbi0+Y3QuaGFuZGxlciA9IHpmY3BfZmNfY29tcGxldGU7CisJZ2lkX3BuLT5jdC5oYW5kbGVyX2RhdGEgPSAmY29tcGxldGlvbjsKKwlnaWRfcG4tPmN0LnJlcSA9ICZnaWRfcG4tPnNnX3JlcTsKKwlnaWRfcG4tPmN0LnJlc3AgPSAmZ2lkX3BuLT5zZ19yZXNwOworCXNnX2luaXRfb25lKCZnaWRfcG4tPnNnX3JlcSwgJmdpZF9wbi0+Z2lkX3BuX3JlcSwKKwkJICAgIHNpemVvZihzdHJ1Y3QgemZjcF9mY19naWRfcG5fcmVxKSk7CisJc2dfaW5pdF9vbmUoJmdpZF9wbi0+c2dfcmVzcCwgJmdpZF9wbi0+Z2lkX3BuX3Jlc3AsCisJCSAgICBzaXplb2Yoc3RydWN0IHpmY3BfZmNfZ2lkX3BuX3Jlc3ApKTsKIAogCS8qIHNldHVwIG5hbWVzZXJ2ZXIgcmVxdWVzdCAqLwotCWdpZF9wbi0+Y3RfaXVfcmVxLmhlYWRlci5yZXZpc2lvbiA9IFpGQ1BfQ1RfUkVWSVNJT047Ci0JZ2lkX3BuLT5jdF9pdV9yZXEuaGVhZGVyLmdzX3R5cGUgPSBaRkNQX0NUX0RJUkVDVE9SWV9TRVJWSUNFOwotCWdpZF9wbi0+Y3RfaXVfcmVxLmhlYWRlci5nc19zdWJ0eXBlID0gWkZDUF9DVF9OQU1FX1NFUlZFUjsKLQlnaWRfcG4tPmN0X2l1X3JlcS5oZWFkZXIub3B0aW9ucyA9IFpGQ1BfQ1RfU1lOQ0hST05PVVM7Ci0JZ2lkX3BuLT5jdF9pdV9yZXEuaGVhZGVyLmNtZF9yc3BfY29kZSA9IFpGQ1BfQ1RfR0lEX1BOOwotCWdpZF9wbi0+Y3RfaXVfcmVxLmhlYWRlci5tYXhfcmVzX3NpemUgPSBaRkNQX0NUX1NJWkVfT05FX1BBR0UgLyA0OwotCWdpZF9wbi0+Y3RfaXVfcmVxLnd3cG4gPSBwb3J0LT53d3BuOworCWdpZF9wbi0+Z2lkX3BuX3JlcS5jdF9oZHIuY3RfcmV2ID0gRkNfQ1RfUkVWOworCWdpZF9wbi0+Z2lkX3BuX3JlcS5jdF9oZHIuY3RfZnNfdHlwZSA9IEZDX0ZTVF9ESVI7CisJZ2lkX3BuLT5naWRfcG5fcmVxLmN0X2hkci5jdF9mc19zdWJ0eXBlID0gRkNfTlNfU1VCVFlQRTsKKwlnaWRfcG4tPmdpZF9wbl9yZXEuY3RfaGRyLmN0X29wdGlvbnMgPSAwOworCWdpZF9wbi0+Z2lkX3BuX3JlcS5jdF9oZHIuY3RfY21kID0gRkNfTlNfR0lEX1BOOworCWdpZF9wbi0+Z2lkX3BuX3JlcS5jdF9oZHIuY3RfbXJfc2l6ZSA9IFpGQ1BfRkNfQ1RfU0laRV9QQUdFIC8gNDsKKwlnaWRfcG4tPmdpZF9wbl9yZXEuZ2lkX3BuLmZuX3d3cG4gPSBwb3J0LT53d3BuOwogCi0JaW5pdF9jb21wbGV0aW9uKCZjb21wbF9yZWMuZG9uZSk7Ci0JY29tcGxfcmVjLmhhbmRsZXIgPSB6ZmNwX2ZjX25zX2dpZF9wbl9ldmFsOwotCWNvbXBsX3JlYy5oYW5kbGVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgZ2lkX3BuOwotCXJldCA9IHpmY3BfZnNmX3NlbmRfY3QoJmdpZF9wbi0+Y3QsIGFkYXB0ZXItPnBvb2wuZ2lkX3BuX3JlcSk7Ci0JaWYgKCFyZXQpCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsX3JlYy5kb25lKTsKKwlyZXQgPSB6ZmNwX2ZzZl9zZW5kX2N0KCZhZGFwdGVyLT5ncy0+ZHMsICZnaWRfcG4tPmN0LAorCQkJICAgICAgIGFkYXB0ZXItPnBvb2wuZ2lkX3BuX3JlcSk7CisJaWYgKCFyZXQpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGlvbik7CisJCXpmY3BfZmNfbnNfZ2lkX3BuX2V2YWwoZ2lkX3BuKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzE2LDEwICsyNzQsMTAgQEAKIHN0YXRpYyBpbnQgemZjcF9mY19uc19naWRfcG4oc3RydWN0IHpmY3BfcG9ydCAqcG9ydCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCB6ZmNwX2dpZF9wbl9kYXRhICpnaWRfcG47CisJc3RydWN0IHpmY3BfZmNfZ2lkX3BuICpnaWRfcG47CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CiAKLQlnaWRfcG4gPSBtZW1wb29sX2FsbG9jKGFkYXB0ZXItPnBvb2wuZ2lkX3BuX2RhdGEsIEdGUF9BVE9NSUMpOworCWdpZF9wbiA9IG1lbXBvb2xfYWxsb2MoYWRhcHRlci0+cG9vbC5naWRfcG4sIEdGUF9BVE9NSUMpOwogCWlmICghZ2lkX3BuKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzMzLDcgKzI5MSw3IEBACiAKIAl6ZmNwX2ZjX3drYV9wb3J0X3B1dCgmYWRhcHRlci0+Z3MtPmRzKTsKIG91dDoKLQltZW1wb29sX2ZyZWUoZ2lkX3BuLCBhZGFwdGVyLT5wb29sLmdpZF9wbl9kYXRhKTsKKwltZW1wb29sX2ZyZWUoZ2lkX3BuLCBhZGFwdGVyLT5wb29sLmdpZF9wbik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzU3LDcgKzMxNSw3IEBACiAKIAl6ZmNwX2VycF9wb3J0X3Jlb3Blbihwb3J0LCAwLCAiZmNncG5fMyIsIE5VTEwpOwogb3V0OgotCXpmY3BfcG9ydF9wdXQocG9ydCk7CisJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIH0KIAogLyoqCkBAIC0zNjYsOSArMzI0LDkgQEAKICAqLwogdm9pZCB6ZmNwX2ZjX3RyaWdnZXJfZGlkX2xvb2t1cChzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQogewotCXpmY3BfcG9ydF9nZXQocG9ydCk7CisJZ2V0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIAlpZiAoIXF1ZXVlX3dvcmsocG9ydC0+YWRhcHRlci0+d29ya19xdWV1ZSwgJnBvcnQtPmdpZF9wbl93b3JrKSkKLQkJemZjcF9wb3J0X3B1dChwb3J0KTsKKwkJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIH0KIAogLyoqCkBAIC0zNzgsMzMgKzMzNiwzNiBAQAogICoKICAqIEV2YWx1YXRlIFBMT0dJIHBsYXlsb2FkIGFuZCBjb3B5IGltcG9ydGFudCBmaWVsZHMgaW50byB6ZmNwX3BvcnQgc3RydWN0dXJlCiAgKi8KLXZvaWQgemZjcF9mY19wbG9naV9ldmFsdWF0ZShzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZnNmX3Bsb2dpICpwbG9naSkKK3ZvaWQgemZjcF9mY19wbG9naV9ldmFsdWF0ZShzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpwbG9naSkKIHsKLQlwb3J0LT5tYXhmcmFtZV9zaXplID0gcGxvZ2ktPnNlcnZfcGFyYW0uY29tbW9uX3NlcnZfcGFyYW1bN10gfAotCQkoKHBsb2dpLT5zZXJ2X3BhcmFtLmNvbW1vbl9zZXJ2X3BhcmFtWzZdICYgMHgwRikgPDwgOCk7Ci0JaWYgKHBsb2dpLT5zZXJ2X3BhcmFtLmNsYXNzMV9zZXJ2X3BhcmFtWzBdICYgMHg4MCkKKwlpZiAocGxvZ2ktPmZsX3d3cG4gIT0gcG9ydC0+d3dwbikgeworCQlwb3J0LT5kX2lkID0gMDsKKwkJZGV2X3dhcm4oJnBvcnQtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKKwkJCSAiQSBwb3J0IG9wZW5lZCB3aXRoIFdXUE4gMHglMDE2THggcmV0dXJuZWQgZGF0YSB0aGF0ICIKKwkJCSAiaWRlbnRpZmllcyBpdCBhcyBXV1BOIDB4JTAxNkx4XG4iLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvcnQtPnd3cG4sCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGxvZ2ktPmZsX3d3cG4pOworCQlyZXR1cm47CisJfQorCisJcG9ydC0+d3dubiA9IHBsb2dpLT5mbF93d25uOworCXBvcnQtPm1heGZyYW1lX3NpemUgPSBwbG9naS0+ZmxfY3NwLnNwX2JiX2RhdGE7CisKKwlpZiAocGxvZ2ktPmZsX2Nzc3BbMF0uY3BfY2xhc3MgJiBGQ19DUENfVkFMSUQpCiAJCXBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzIHw9IEZDX0NPU19DTEFTUzE7Ci0JaWYgKHBsb2dpLT5zZXJ2X3BhcmFtLmNsYXNzMl9zZXJ2X3BhcmFtWzBdICYgMHg4MCkKKwlpZiAocGxvZ2ktPmZsX2Nzc3BbMV0uY3BfY2xhc3MgJiBGQ19DUENfVkFMSUQpCiAJCXBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzIHw9IEZDX0NPU19DTEFTUzI7Ci0JaWYgKHBsb2dpLT5zZXJ2X3BhcmFtLmNsYXNzM19zZXJ2X3BhcmFtWzBdICYgMHg4MCkKKwlpZiAocGxvZ2ktPmZsX2Nzc3BbMl0uY3BfY2xhc3MgJiBGQ19DUENfVkFMSUQpCiAJCXBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzIHw9IEZDX0NPU19DTEFTUzM7Ci0JaWYgKHBsb2dpLT5zZXJ2X3BhcmFtLmNsYXNzNF9zZXJ2X3BhcmFtWzBdICYgMHg4MCkKKwlpZiAocGxvZ2ktPmZsX2Nzc3BbM10uY3BfY2xhc3MgJiBGQ19DUENfVkFMSUQpCiAJCXBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzIHw9IEZDX0NPU19DTEFTUzQ7CiB9CiAKLXN0cnVjdCB6ZmNwX2Vsc19hZGlzYyB7Ci0Jc3RydWN0IHpmY3Bfc2VuZF9lbHMgZWxzOwotCXN0cnVjdCBzY2F0dGVybGlzdCByZXE7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHJlc3A7Ci0Jc3RydWN0IHpmY3BfbHNfYWRpc2MgbHNfYWRpc2M7Ci0Jc3RydWN0IHpmY3BfbHNfYWRpc2MgbHNfYWRpc2NfYWNjOwotfTsKLQotc3RhdGljIHZvaWQgemZjcF9mY19hZGlzY19oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIHpmY3BfZmNfYWRpc2NfaGFuZGxlcih2b2lkICpkYXRhKQogewotCXN0cnVjdCB6ZmNwX2Vsc19hZGlzYyAqYWRpc2MgPSAoc3RydWN0IHpmY3BfZWxzX2FkaXNjICopIGRhdGE7CisJc3RydWN0IHpmY3BfZmNfZWxzX2FkaXNjICphZGlzYyA9IGRhdGE7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydCA9IGFkaXNjLT5lbHMucG9ydDsKLQlzdHJ1Y3QgemZjcF9sc19hZGlzYyAqbHNfYWRpc2MgPSAmYWRpc2MtPmxzX2FkaXNjX2FjYzsKKwlzdHJ1Y3QgZmNfZWxzX2FkaXNjICphZGlzY19yZXNwID0gJmFkaXNjLT5hZGlzY19yZXNwOwogCiAJaWYgKGFkaXNjLT5lbHMuc3RhdHVzKSB7CiAJCS8qIHJlcXVlc3QgcmVqZWN0ZWQgb3IgdGltZWQgb3V0ICovCkBAIC00MTQsOSArMzc1LDkgQEAKIAl9CiAKIAlpZiAoIXBvcnQtPnd3bm4pCi0JCXBvcnQtPnd3bm4gPSBsc19hZGlzYy0+d3dubjsKKwkJcG9ydC0+d3dubiA9IGFkaXNjX3Jlc3AtPmFkaXNjX3d3bm47CiAKLQlpZiAoKHBvcnQtPnd3cG4gIT0gbHNfYWRpc2MtPnd3cG4pIHx8CisJaWYgKChwb3J0LT53d3BuICE9IGFkaXNjX3Jlc3AtPmFkaXNjX3d3cG4pIHx8CiAJICAgICEoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fT1BFTikpIHsKIAkJemZjcF9lcnBfcG9ydF9yZW9wZW4ocG9ydCwgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsCiAJCQkJICAgICAiZmNhZGhfMiIsIE5VTEwpOwpAQCAtNDI3LDQwICszODgsNDQgQEAKIAl6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRfcmVnaXN0ZXIocG9ydCk7CiAgb3V0OgogCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX1BPUlRfTElOS19URVNULCAmcG9ydC0+c3RhdHVzKTsKLQl6ZmNwX3BvcnRfcHV0KHBvcnQpOwotCWtmcmVlKGFkaXNjKTsKKwlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOworCWttZW1fY2FjaGVfZnJlZSh6ZmNwX2RhdGEuYWRpc2NfY2FjaGUsIGFkaXNjKTsKIH0KIAogc3RhdGljIGludCB6ZmNwX2ZjX2FkaXNjKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHpmY3BfZWxzX2FkaXNjICphZGlzYzsKKwlzdHJ1Y3QgemZjcF9mY19lbHNfYWRpc2MgKmFkaXNjOwogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCByZXQ7CiAKLQlhZGlzYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB6ZmNwX2Vsc19hZGlzYyksIEdGUF9BVE9NSUMpOworCWFkaXNjID0ga21lbV9jYWNoZV9hbGxvYyh6ZmNwX2RhdGEuYWRpc2NfY2FjaGUsIEdGUF9BVE9NSUMpOwogCWlmICghYWRpc2MpCiAJCXJldHVybiAtRU5PTUVNOwogCisJYWRpc2MtPmVscy5wb3J0ID0gcG9ydDsKIAlhZGlzYy0+ZWxzLnJlcSA9ICZhZGlzYy0+cmVxOwogCWFkaXNjLT5lbHMucmVzcCA9ICZhZGlzYy0+cmVzcDsKLQlzZ19pbml0X29uZShhZGlzYy0+ZWxzLnJlcSwgJmFkaXNjLT5sc19hZGlzYywKLQkJICAgIHNpemVvZihzdHJ1Y3QgemZjcF9sc19hZGlzYykpOwotCXNnX2luaXRfb25lKGFkaXNjLT5lbHMucmVzcCwgJmFkaXNjLT5sc19hZGlzY19hY2MsCi0JCSAgICBzaXplb2Yoc3RydWN0IHpmY3BfbHNfYWRpc2MpKTsKKwlzZ19pbml0X29uZShhZGlzYy0+ZWxzLnJlcSwgJmFkaXNjLT5hZGlzY19yZXEsCisJCSAgICBzaXplb2Yoc3RydWN0IGZjX2Vsc19hZGlzYykpOworCXNnX2luaXRfb25lKGFkaXNjLT5lbHMucmVzcCwgJmFkaXNjLT5hZGlzY19yZXNwLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBmY19lbHNfYWRpc2MpKTsKIAotCWFkaXNjLT5lbHMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JYWRpc2MtPmVscy5wb3J0ID0gcG9ydDsKLQlhZGlzYy0+ZWxzLmRfaWQgPSBwb3J0LT5kX2lkOwogCWFkaXNjLT5lbHMuaGFuZGxlciA9IHpmY3BfZmNfYWRpc2NfaGFuZGxlcjsKLQlhZGlzYy0+ZWxzLmhhbmRsZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhZGlzYzsKLQlhZGlzYy0+ZWxzLmxzX2NvZGUgPSBhZGlzYy0+bHNfYWRpc2MuY29kZSA9IFpGQ1BfTFNfQURJU0M7CisJYWRpc2MtPmVscy5oYW5kbGVyX2RhdGEgPSBhZGlzYzsKIAogCS8qIGFjYy4gdG8gRkMtRlMsIGhhcmRfbnBvcnRfaWQgaW4gQURJU0Mgc2hvdWxkIG5vdCBiZSBzZXQgZm9yIHBvcnRzCiAJICAgd2l0aG91dCBGQy1BTC0yIGNhcGFiaWxpdHksIHNvIHdlIGRvbid0IHNldCBpdCAqLwotCWFkaXNjLT5sc19hZGlzYy53d3BuID0gZmNfaG9zdF9wb3J0X25hbWUoYWRhcHRlci0+c2NzaV9ob3N0KTsKLQlhZGlzYy0+bHNfYWRpc2Mud3dubiA9IGZjX2hvc3Rfbm9kZV9uYW1lKGFkYXB0ZXItPnNjc2lfaG9zdCk7Ci0JYWRpc2MtPmxzX2FkaXNjLm5wb3J0X2lkID0gZmNfaG9zdF9wb3J0X2lkKGFkYXB0ZXItPnNjc2lfaG9zdCk7CisJYWRpc2MtPmFkaXNjX3JlcS5hZGlzY193d3BuID0gZmNfaG9zdF9wb3J0X25hbWUoYWRhcHRlci0+c2NzaV9ob3N0KTsKKwlhZGlzYy0+YWRpc2NfcmVxLmFkaXNjX3d3bm4gPSBmY19ob3N0X25vZGVfbmFtZShhZGFwdGVyLT5zY3NpX2hvc3QpOworCWFkaXNjLT5hZGlzY19yZXEuYWRpc2NfY21kID0gRUxTX0FESVNDOworCWh0b24yNChhZGlzYy0+YWRpc2NfcmVxLmFkaXNjX3BvcnRfaWQsCisJICAgICAgIGZjX2hvc3RfcG9ydF9pZChhZGFwdGVyLT5zY3NpX2hvc3QpKTsKIAotCXJldHVybiB6ZmNwX2ZzZl9zZW5kX2VscygmYWRpc2MtPmVscyk7CisJcmV0ID0gemZjcF9mc2Zfc2VuZF9lbHMoYWRhcHRlciwgcG9ydC0+ZF9pZCwgJmFkaXNjLT5lbHMpOworCWlmIChyZXQpCisJCWttZW1fY2FjaGVfZnJlZSh6ZmNwX2RhdGEuYWRpc2NfY2FjaGUsIGFkaXNjKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgemZjcF9mY19saW5rX3Rlc3Rfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC00NjksNyArNDM0LDcgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB6ZmNwX3BvcnQsIHRlc3RfbGlua193b3JrKTsKIAlpbnQgcmV0dmFsOwogCi0JemZjcF9wb3J0X2dldChwb3J0KTsKKwlnZXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogCXBvcnQtPnJwb3J0X3Rhc2sgPSBSUE9SVF9ERUw7CiAJemZjcF9zY3NpX3Jwb3J0X3dvcmsoJnBvcnQtPnJwb3J0X3dvcmspOwogCkBAIC00ODgsNyArNDUzLDcgQEAKIAl6ZmNwX2VycF9wb3J0X2ZvcmNlZF9yZW9wZW4ocG9ydCwgMCwgImZjbHR3azEiLCBOVUxMKTsKIAogb3V0OgotCXpmY3BfcG9ydF9wdXQocG9ydCk7CisJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIH0KIAogLyoqCkBAIC01MDEsMTIgKzQ2NiwxMiBAQAogICovCiB2b2lkIHpmY3BfZmNfdGVzdF9saW5rKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQpCiB7Ci0JemZjcF9wb3J0X2dldChwb3J0KTsKKwlnZXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogCWlmICghcXVldWVfd29yayhwb3J0LT5hZGFwdGVyLT53b3JrX3F1ZXVlLCAmcG9ydC0+dGVzdF9saW5rX3dvcmspKQotCQl6ZmNwX3BvcnRfcHV0KHBvcnQpOworCQlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogfQogCi1zdGF0aWMgdm9pZCB6ZmNwX2ZyZWVfc2dfZW52KHN0cnVjdCB6ZmNwX2dwbl9mdCAqZ3BuX2Z0LCBpbnQgYnVmX251bSkKK3N0YXRpYyB2b2lkIHpmY3BfZnJlZV9zZ19lbnYoc3RydWN0IHpmY3BfZmNfZ3BuX2Z0ICpncG5fZnQsIGludCBidWZfbnVtKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmZ3BuX2Z0LT5zZ19yZXE7CiAKQEAgLTUxNiwxMCArNDgxLDEwIEBACiAJa2ZyZWUoZ3BuX2Z0KTsKIH0KIAotc3RhdGljIHN0cnVjdCB6ZmNwX2dwbl9mdCAqemZjcF9hbGxvY19zZ19lbnYoaW50IGJ1Zl9udW0pCitzdGF0aWMgc3RydWN0IHpmY3BfZmNfZ3BuX2Z0ICp6ZmNwX2FsbG9jX3NnX2VudihpbnQgYnVmX251bSkKIHsKLQlzdHJ1Y3QgemZjcF9ncG5fZnQgKmdwbl9mdDsKLQlzdHJ1Y3QgY3RfaXVfZ3BuX2Z0X3JlcSAqcmVxOworCXN0cnVjdCB6ZmNwX2ZjX2dwbl9mdCAqZ3BuX2Z0OworCXN0cnVjdCB6ZmNwX2ZjX2dwbl9mdF9yZXEgKnJlcTsKIAogCWdwbl9mdCA9IGt6YWxsb2Moc2l6ZW9mKCpncG5fZnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdwbl9mdCkKQEAgLTU0MiwxNTkgKzUwNywxNTIgQEAKIH0KIAogCi1zdGF0aWMgaW50IHpmY3BfZmNfc2VuZF9ncG5fZnQoc3RydWN0IHpmY3BfZ3BuX2Z0ICpncG5fZnQsCitzdGF0aWMgaW50IHpmY3BfZmNfc2VuZF9ncG5fZnQoc3RydWN0IHpmY3BfZmNfZ3BuX2Z0ICpncG5fZnQsCiAJCQkgICAgICAgc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciwgaW50IG1heF9ieXRlcykKIHsKLQlzdHJ1Y3QgemZjcF9zZW5kX2N0ICpjdCA9ICZncG5fZnQtPmN0OwotCXN0cnVjdCBjdF9pdV9ncG5fZnRfcmVxICpyZXEgPSBzZ192aXJ0KCZncG5fZnQtPnNnX3JlcSk7Ci0Jc3RydWN0IHpmY3BfZmNfbnNfaGFuZGxlcl9kYXRhIGNvbXBsX3JlYzsKKwlzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICpjdCA9ICZncG5fZnQtPmN0OworCXN0cnVjdCB6ZmNwX2ZjX2dwbl9mdF9yZXEgKnJlcSA9IHNnX3ZpcnQoJmdwbl9mdC0+c2dfcmVxKTsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wbGV0aW9uKTsKIAlpbnQgcmV0OwogCiAJLyogcHJlcGFyZSBDVCBJVSBmb3IgR1BOX0ZUICovCi0JcmVxLT5oZWFkZXIucmV2aXNpb24gPSBaRkNQX0NUX1JFVklTSU9OOwotCXJlcS0+aGVhZGVyLmdzX3R5cGUgPSBaRkNQX0NUX0RJUkVDVE9SWV9TRVJWSUNFOwotCXJlcS0+aGVhZGVyLmdzX3N1YnR5cGUgPSBaRkNQX0NUX05BTUVfU0VSVkVSOwotCXJlcS0+aGVhZGVyLm9wdGlvbnMgPSBaRkNQX0NUX1NZTkNIUk9OT1VTOwotCXJlcS0+aGVhZGVyLmNtZF9yc3BfY29kZSA9IFpGQ1BfQ1RfR1BOX0ZUOwotCXJlcS0+aGVhZGVyLm1heF9yZXNfc2l6ZSA9IG1heF9ieXRlcyAvIDQ7Ci0JcmVxLT5mbGFncyA9IDA7Ci0JcmVxLT5kb21haW5faWRfc2NvcGUgPSAwOwotCXJlcS0+YXJlYV9pZF9zY29wZSA9IDA7Ci0JcmVxLT5mYzRfdHlwZSA9IFpGQ1BfQ1RfU0NTSV9GQ1A7CisJcmVxLT5jdF9oZHIuY3RfcmV2ID0gRkNfQ1RfUkVWOworCXJlcS0+Y3RfaGRyLmN0X2ZzX3R5cGUgPSBGQ19GU1RfRElSOworCXJlcS0+Y3RfaGRyLmN0X2ZzX3N1YnR5cGUgPSBGQ19OU19TVUJUWVBFOworCXJlcS0+Y3RfaGRyLmN0X29wdGlvbnMgPSAwOworCXJlcS0+Y3RfaGRyLmN0X2NtZCA9IEZDX05TX0dQTl9GVDsKKwlyZXEtPmN0X2hkci5jdF9tcl9zaXplID0gbWF4X2J5dGVzIC8gNDsKKwlyZXEtPmdwbl9mdC5mbl9kb21haW5faWRfc2NvcGUgPSAwOworCXJlcS0+Z3BuX2Z0LmZuX2FyZWFfaWRfc2NvcGUgPSAwOworCXJlcS0+Z3BuX2Z0LmZuX2ZjNF90eXBlID0gRkNfVFlQRV9GQ1A7CiAKIAkvKiBwcmVwYXJlIHpmY3Bfc2VuZF9jdCAqLwotCWN0LT53a2FfcG9ydCA9ICZhZGFwdGVyLT5ncy0+ZHM7Ci0JY3QtPmhhbmRsZXIgPSB6ZmNwX2ZjX25zX2hhbmRsZXI7Ci0JY3QtPmhhbmRsZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZjb21wbF9yZWM7CisJY3QtPmhhbmRsZXIgPSB6ZmNwX2ZjX2NvbXBsZXRlOworCWN0LT5oYW5kbGVyX2RhdGEgPSAmY29tcGxldGlvbjsKIAljdC0+cmVxID0gJmdwbl9mdC0+c2dfcmVxOwogCWN0LT5yZXNwID0gZ3BuX2Z0LT5zZ19yZXNwOwogCi0JaW5pdF9jb21wbGV0aW9uKCZjb21wbF9yZWMuZG9uZSk7Ci0JY29tcGxfcmVjLmhhbmRsZXIgPSBOVUxMOwotCXJldCA9IHpmY3BfZnNmX3NlbmRfY3QoY3QsIE5VTEwpOworCXJldCA9IHpmY3BfZnNmX3NlbmRfY3QoJmFkYXB0ZXItPmdzLT5kcywgY3QsIE5VTEwpOwogCWlmICghcmV0KQotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbF9yZWMuZG9uZSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRpb24pOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfZmNfdmFsaWRhdGVfcG9ydChzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgemZjcF9mY192YWxpZGF0ZV9wb3J0KHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIHN0cnVjdCBsaXN0X2hlYWQgKmxoKQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOwotCiAJaWYgKCEoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fTk9FU0MpKQogCQlyZXR1cm47CiAKIAlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fTk9FU0MsICZwb3J0LT5zdGF0dXMpOwogCiAJaWYgKChwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyAhPSAwKSB8fAotCSAgICAhbGlzdF9lbXB0eSgmcG9ydC0+dW5pdF9saXN0X2hlYWQpKSB7Ci0JCXpmY3BfcG9ydF9wdXQocG9ydCk7CisJICAgICFsaXN0X2VtcHR5KCZwb3J0LT51bml0X2xpc3QpKQogCQlyZXR1cm47Ci0JfQotCXpmY3BfZXJwX3BvcnRfc2h1dGRvd24ocG9ydCwgMCwgImZjcHZhbDEiLCBOVUxMKTsKLQl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOwotCXpmY3BfcG9ydF9wdXQocG9ydCk7Ci0JemZjcF9wb3J0X2RlcXVldWUocG9ydCk7CisKKwlsaXN0X21vdmVfdGFpbCgmcG9ydC0+bGlzdCwgbGgpOwogfQogCi1zdGF0aWMgaW50IHpmY3BfZmNfZXZhbF9ncG5fZnQoc3RydWN0IHpmY3BfZ3BuX2Z0ICpncG5fZnQsIGludCBtYXhfZW50cmllcykKK3N0YXRpYyBpbnQgemZjcF9mY19ldmFsX2dwbl9mdChzdHJ1Y3QgemZjcF9mY19ncG5fZnQgKmdwbl9mdCwKKwkJCSAgICAgICBzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLCBpbnQgbWF4X2VudHJpZXMpCiB7Ci0Jc3RydWN0IHpmY3Bfc2VuZF9jdCAqY3QgPSAmZ3BuX2Z0LT5jdDsKKwlzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICpjdCA9ICZncG5fZnQtPmN0OwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBncG5fZnQtPnNnX3Jlc3A7Ci0Jc3RydWN0IGN0X2hkciAqaGRyID0gc2dfdmlydChzZyk7Ci0Jc3RydWN0IGdwbl9mdF9yZXNwX2FjYyAqYWNjID0gc2dfdmlydChzZyk7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGN0LT53a2FfcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgZmNfY3RfaGRyICpoZHIgPSBzZ192aXJ0KHNnKTsKKwlzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AgKmFjYyA9IHNnX3ZpcnQoc2cpOwogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQocmVtb3ZlX2xoKTsKIAl1MzIgZF9pZDsKIAlpbnQgcmV0ID0gMCwgeCwgbGFzdCA9IDA7CiAKIAlpZiAoY3QtPnN0YXR1cykKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoaGRyLT5jbWRfcnNwX2NvZGUgIT0gWkZDUF9DVF9BQ0NFUFQpIHsKLQkJaWYgKGhkci0+cmVhc29uX2NvZGUgPT0gWkZDUF9DVF9VTkFCTEVfVE9fUEVSRk9STV9DTUQpCisJaWYgKGhkci0+Y3RfY21kICE9IEZDX0ZTX0FDQykgeworCQlpZiAoaGRyLT5jdF9yZWFzb24gPT0gRkNfQkFfUkpUX1VOQUJMRSkKIAkJCXJldHVybiAtRUFHQUlOOyAvKiBtaWdodCBiZSBhIHRlbXBvcmFyeSBjb25kaXRpb24gKi8KIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKGhkci0+bWF4X3Jlc19zaXplKSB7CisJaWYgKGhkci0+Y3RfbXJfc2l6ZSkgewogCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAogCQkJICJUaGUgbmFtZSBzZXJ2ZXIgcmVwb3J0ZWQgJWQgd29yZHMgcmVzaWR1YWwgZGF0YVxuIiwKLQkJCSBoZHItPm1heF9yZXNfc2l6ZSk7CisJCQkgaGRyLT5jdF9tcl9zaXplKTsKIAkJcmV0dXJuIC1FMkJJRzsKIAl9CiAKLQltdXRleF9sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLQogCS8qIGZpcnN0IGVudHJ5IGlzIHRoZSBoZWFkZXIgKi8KIAlmb3IgKHggPSAxOyB4IDwgbWF4X2VudHJpZXMgJiYgIWxhc3Q7IHgrKykgewotCQlpZiAoeCAlIChaRkNQX0dQTl9GVF9FTlRSSUVTICsgMSkpCisJCWlmICh4ICUgKFpGQ1BfRkNfR1BOX0ZUX0VOVF9QQUdFICsgMSkpCiAJCQlhY2MrKzsKIAkJZWxzZQogCQkJYWNjID0gc2dfdmlydCgrK3NnKTsKIAotCQlsYXN0ID0gYWNjLT5jb250cm9sICYgMHg4MDsKLQkJZF9pZCA9IGFjYy0+cG9ydF9pZFswXSA8PCAxNiB8IGFjYy0+cG9ydF9pZFsxXSA8PCA4IHwKLQkJICAgICAgIGFjYy0+cG9ydF9pZFsyXTsKKwkJbGFzdCA9IGFjYy0+ZnBfZmxhZ3MgJiBGQ19OU19GSURfTEFTVDsKKwkJZF9pZCA9IG50b2gyNChhY2MtPmZwX2ZpZCk7CiAKIAkJLyogZG9uJ3QgYXR0YWNoIHBvcnRzIHdpdGggYSB3ZWxsIGtub3duIGFkZHJlc3MgKi8KLQkJaWYgKChkX2lkICYgWkZDUF9ESURfV0tBKSA9PSBaRkNQX0RJRF9XS0EpCisJCWlmIChkX2lkID49IEZDX0ZJRF9XRUxMX0tOT1dOX0JBU0UpCiAJCQljb250aW51ZTsKIAkJLyogc2tpcCB0aGUgYWRhcHRlcidzIHBvcnQgYW5kIGtub3duIHJlbW90ZSBwb3J0cyAqLwotCQlpZiAoYWNjLT53d3BuID09IGZjX2hvc3RfcG9ydF9uYW1lKGFkYXB0ZXItPnNjc2lfaG9zdCkpCi0JCQljb250aW51ZTsKLQkJcG9ydCA9IHpmY3BfZ2V0X3BvcnRfYnlfd3dwbihhZGFwdGVyLCBhY2MtPnd3cG4pOwotCQlpZiAocG9ydCkKKwkJaWYgKGFjYy0+ZnBfd3dwbiA9PSBmY19ob3N0X3BvcnRfbmFtZShhZGFwdGVyLT5zY3NpX2hvc3QpKQogCQkJY29udGludWU7CiAKLQkJcG9ydCA9IHpmY3BfcG9ydF9lbnF1ZXVlKGFkYXB0ZXIsIGFjYy0+d3dwbiwKKwkJcG9ydCA9IHpmY3BfcG9ydF9lbnF1ZXVlKGFkYXB0ZXIsIGFjYy0+ZnBfd3dwbiwKIAkJCQkJIFpGQ1BfU1RBVFVTX0NPTU1PTl9OT0VTQywgZF9pZCk7Ci0JCWlmIChJU19FUlIocG9ydCkpCi0JCQlyZXQgPSBQVFJfRVJSKHBvcnQpOwotCQllbHNlCisJCWlmICghSVNfRVJSKHBvcnQpKQogCQkJemZjcF9lcnBfcG9ydF9yZW9wZW4ocG9ydCwgMCwgImZjZWdwZjEiLCBOVUxMKTsKKwkJZWxzZSBpZiAoUFRSX0VSUihwb3J0KSAhPSAtRUVYSVNUKQorCQkJcmV0ID0gUFRSX0VSUihwb3J0KTsKIAl9CiAKIAl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCB0bXAsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkKLQkJemZjcF9mY192YWxpZGF0ZV9wb3J0KHBvcnQpOwotCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCB0bXAsICZhZGFwdGVyLT5wb3J0X2xpc3QsIGxpc3QpCisJCXpmY3BfZmNfdmFsaWRhdGVfcG9ydChwb3J0LCAmcmVtb3ZlX2xoKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCB0bXAsICZyZW1vdmVfbGgsIGxpc3QpIHsKKwkJemZjcF9lcnBfcG9ydF9zaHV0ZG93bihwb3J0LCAwLCAiZmNlZ3BmMiIsIE5VTEwpOworCQl6ZmNwX2RldmljZV91bnJlZ2lzdGVyKCZwb3J0LT5zeXNmc19kZXZpY2UsCisJCQkJICAgICAgICZ6ZmNwX3N5c2ZzX3BvcnRfYXR0cnMpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKIC8qKgogICogemZjcF9mY19zY2FuX3BvcnRzIC0gc2NhbiByZW1vdGUgcG9ydHMgYW5kIGF0dGFjaCBuZXcgcG9ydHMKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHN0cnVjdCB6ZmNwX2FkYXB0ZXIKKyAqIEB3b3JrOiByZWZlcmVuY2UgdG8gc2NoZWR1bGVkIHdvcmsKICAqLwotaW50IHpmY3BfZmNfc2Nhbl9wb3J0cyhzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQordm9pZCB6ZmNwX2ZjX3NjYW5fcG9ydHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHpmY3BfYWRhcHRlciwKKwkJCQkJCSAgICBzY2FuX3dvcmspOwogCWludCByZXQsIGk7Ci0Jc3RydWN0IHpmY3BfZ3BuX2Z0ICpncG5fZnQ7CisJc3RydWN0IHpmY3BfZmNfZ3BuX2Z0ICpncG5fZnQ7CiAJaW50IGNoYWluLCBtYXhfZW50cmllcywgYnVmX251bSwgbWF4X2J5dGVzOwogCiAJY2hhaW4gPSBhZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfRUxTX0NUX0NIQUlORURfU0JBTFM7Ci0JYnVmX251bSA9IGNoYWluID8gWkZDUF9HUE5fRlRfQlVGRkVSUyA6IDE7Ci0JbWF4X2VudHJpZXMgPSBjaGFpbiA/IFpGQ1BfR1BOX0ZUX01BWF9FTlRSSUVTIDogWkZDUF9HUE5fRlRfRU5UUklFUzsKLQltYXhfYnl0ZXMgPSBjaGFpbiA/IFpGQ1BfR1BOX0ZUX01BWF9TSVpFIDogWkZDUF9DVF9TSVpFX09ORV9QQUdFOworCWJ1Zl9udW0gPSBjaGFpbiA/IFpGQ1BfRkNfR1BOX0ZUX05VTV9CVUZTIDogMTsKKwltYXhfZW50cmllcyA9IGNoYWluID8gWkZDUF9GQ19HUE5fRlRfTUFYX0VOVCA6IFpGQ1BfRkNfR1BOX0ZUX0VOVF9QQUdFOworCW1heF9ieXRlcyA9IGNoYWluID8gWkZDUF9GQ19HUE5fRlRfTUFYX1NJWkUgOiBaRkNQX0ZDX0NUX1NJWkVfUEFHRTsKIAogCWlmIChmY19ob3N0X3BvcnRfdHlwZShhZGFwdGVyLT5zY3NpX2hvc3QpICE9IEZDX1BPUlRUWVBFX05QT1JUICYmCiAJICAgIGZjX2hvc3RfcG9ydF90eXBlKGFkYXB0ZXItPnNjc2lfaG9zdCkgIT0gRkNfUE9SVFRZUEVfTlBJVikKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAotCXJldCA9IHpmY3BfZmNfd2thX3BvcnRfZ2V0KCZhZGFwdGVyLT5ncy0+ZHMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJaWYgKHpmY3BfZmNfd2thX3BvcnRfZ2V0KCZhZGFwdGVyLT5ncy0+ZHMpKQorCQlyZXR1cm47CiAKIAlncG5fZnQgPSB6ZmNwX2FsbG9jX3NnX2VudihidWZfbnVtKTsKLQlpZiAoIWdwbl9mdCkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghZ3BuX2Z0KQogCQlnb3RvIG91dDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXJldCA9IHpmY3BfZmNfc2VuZF9ncG5fZnQoZ3BuX2Z0LCBhZGFwdGVyLCBtYXhfYnl0ZXMpOwogCQlpZiAoIXJldCkgewotCQkJcmV0ID0gemZjcF9mY19ldmFsX2dwbl9mdChncG5fZnQsIG1heF9lbnRyaWVzKTsKKwkJCXJldCA9IHpmY3BfZmNfZXZhbF9ncG5fZnQoZ3BuX2Z0LCBhZGFwdGVyLCBtYXhfZW50cmllcyk7CiAJCQlpZiAocmV0ID09IC1FQUdBSU4pCiAJCQkJc3NsZWVwKDEpOwogCQkJZWxzZQpAQCAtNzA0LDE3NCArNjYyLDExNiBAQAogCXpmY3BfZnJlZV9zZ19lbnYoZ3BuX2Z0LCBidWZfbnVtKTsKIG91dDoKIAl6ZmNwX2ZjX3drYV9wb3J0X3B1dCgmYWRhcHRlci0+Z3MtPmRzKTsKLQlyZXR1cm4gcmV0OwogfQogCi0KLXZvaWQgX3pmY3BfZmNfc2Nhbl9wb3J0c19sYXRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCB6ZmNwX2ZjX2N0X2Vsc19qb2JfaGFuZGxlcih2b2lkICpkYXRhKQogewotCXpmY3BfZmNfc2Nhbl9wb3J0cyhjb250YWluZXJfb2Yod29yaywgc3RydWN0IHpmY3BfYWRhcHRlciwgc2Nhbl93b3JrKSk7Ci19CisJc3RydWN0IGZjX2JzZ19qb2IgKmpvYiA9IGRhdGE7CisJc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqemZjcF9jdF9lbHMgPSBqb2ItPmRkX2RhdGE7CisJaW50IHN0YXR1cyA9IHpmY3BfY3RfZWxzLT5zdGF0dXM7CisJaW50IHJlcGx5X3N0YXR1czsKIAotc3RydWN0IHpmY3BfZWxzX2ZjX2pvYiB7Ci0Jc3RydWN0IHpmY3Bfc2VuZF9lbHMgZWxzOwotCXN0cnVjdCBmY19ic2dfam9iICpqb2I7Ci19OwotCi1zdGF0aWMgdm9pZCB6ZmNwX2ZjX2dlbmVyaWNfZWxzX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB6ZmNwX2Vsc19mY19qb2IgKmVsc19mY19qb2IgPSAoc3RydWN0IHpmY3BfZWxzX2ZjX2pvYiAqKSBkYXRhOwotCXN0cnVjdCBmY19ic2dfam9iICpqb2IgPSBlbHNfZmNfam9iLT5qb2I7Ci0Jc3RydWN0IGZjX2JzZ19yZXBseSAqcmVwbHkgPSBqb2ItPnJlcGx5OwotCi0JaWYgKGVsc19mY19qb2ItPmVscy5zdGF0dXMpIHsKLQkJLyogcmVxdWVzdCByZWplY3RlZCBvciB0aW1lZCBvdXQgKi8KLQkJcmVwbHktPnJlcGx5X2RhdGEuY3RlbHNfcmVwbHkuc3RhdHVzID0gRkNfQ1RFTFNfU1RBVFVTX1JFSkVDVDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmVwbHktPnJlcGx5X2RhdGEuY3RlbHNfcmVwbHkuc3RhdHVzID0gRkNfQ1RFTFNfU1RBVFVTX09LOwotCXJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSBqb2ItPnJlcGx5X3BheWxvYWQucGF5bG9hZF9sZW47Ci0KLW91dDoKLQlqb2ItPnN0YXRlX2ZsYWdzID0gRkNfUlFTVF9TVEFURV9ET05FOwotCWpvYi0+am9iX2RvbmUoam9iKTsKLQlrZnJlZShlbHNfZmNfam9iKTsKLX0KLQotaW50IHpmY3BfZmNfZXhlY3V0ZV9lbHNfZmNfam9iKHN0cnVjdCBmY19ic2dfam9iICpqb2IpCi17Ci0Jc3RydWN0IHpmY3BfZWxzX2ZjX2pvYiAqZWxzX2ZjX2pvYjsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gam9iLT5ycG9ydDsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyOwotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7Ci0JdTggKnBvcnRfZGlkOwotCi0Jc2hvc3QgPSBycG9ydCA/IHJwb3J0X3RvX3Nob3N0KHJwb3J0KSA6IGpvYi0+c2hvc3Q7Ci0JYWRhcHRlciA9IChzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOwotCi0JaWYgKCEoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fT1BFTikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZWxzX2ZjX2pvYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB6ZmNwX2Vsc19mY19qb2IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVsc19mY19qb2IpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZWxzX2ZjX2pvYi0+ZWxzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCWlmIChycG9ydCkgewotCQlyZWFkX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCQlwb3J0ID0gemZjcF9nZXRfcG9ydF9ieV93d3BuKGFkYXB0ZXIsIHJwb3J0LT5wb3J0X25hbWUpOwotCQlpZiAocG9ydCkKLQkJCWVsc19mY19qb2ItPmVscy5kX2lkID0gcG9ydC0+ZF9pZDsKLQkJcmVhZF91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCQlpZiAoIXBvcnQpIHsKLQkJCWtmcmVlKGVsc19mY19qb2IpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlwb3J0X2RpZCA9IGpvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfZWxzLnBvcnRfaWQ7Ci0JCWVsc19mY19qb2ItPmVscy5kX2lkID0gKHBvcnRfZGlkWzBdIDw8IDE2KSArCi0JCQkJCShwb3J0X2RpZFsxXSA8PCA4KSArIHBvcnRfZGlkWzJdOwotCX0KLQotCWVsc19mY19qb2ItPmVscy5yZXEgPSBqb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0OwotCWVsc19mY19qb2ItPmVscy5yZXNwID0gam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3Q7Ci0JZWxzX2ZjX2pvYi0+ZWxzLmhhbmRsZXIgPSB6ZmNwX2ZjX2dlbmVyaWNfZWxzX2hhbmRsZXI7Ci0JZWxzX2ZjX2pvYi0+ZWxzLmhhbmRsZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBlbHNfZmNfam9iOwotCWVsc19mY19qb2ItPmpvYiA9IGpvYjsKLQotCXJldHVybiB6ZmNwX2ZzZl9zZW5kX2VscygmZWxzX2ZjX2pvYi0+ZWxzKTsKLX0KLQotc3RydWN0IHpmY3BfY3RfZmNfam9iIHsKLQlzdHJ1Y3QgemZjcF9zZW5kX2N0IGN0OwotCXN0cnVjdCBmY19ic2dfam9iICpqb2I7Ci19OwotCi1zdGF0aWMgdm9pZCB6ZmNwX2ZjX2dlbmVyaWNfY3RfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHpmY3BfY3RfZmNfam9iICpjdF9mY19qb2IgPSAoc3RydWN0IHpmY3BfY3RfZmNfam9iICopIGRhdGE7Ci0Jc3RydWN0IGZjX2JzZ19qb2IgKmpvYiA9IGN0X2ZjX2pvYi0+am9iOwotCi0Jam9iLT5yZXBseS0+cmVwbHlfZGF0YS5jdGVsc19yZXBseS5zdGF0dXMgPSBjdF9mY19qb2ItPmN0LnN0YXR1cyA/Ci0JCQkJRkNfQ1RFTFNfU1RBVFVTX1JFSkVDVCA6IEZDX0NURUxTX1NUQVRVU19PSzsKKwlyZXBseV9zdGF0dXMgPSBzdGF0dXMgPyBGQ19DVEVMU19TVEFUVVNfUkVKRUNUIDogRkNfQ1RFTFNfU1RBVFVTX09LOworCWpvYi0+cmVwbHktPnJlcGx5X2RhdGEuY3RlbHNfcmVwbHkuc3RhdHVzID0gcmVwbHlfc3RhdHVzOwogCWpvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IGpvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKLQlqb2ItPnN0YXRlX2ZsYWdzID0gRkNfUlFTVF9TVEFURV9ET05FOwogCWpvYi0+am9iX2RvbmUoam9iKTsKLQotCXpmY3BfZmNfd2thX3BvcnRfcHV0KGN0X2ZjX2pvYi0+Y3Qud2thX3BvcnQpOwotCi0Ja2ZyZWUoY3RfZmNfam9iKTsKIH0KIAotaW50IHpmY3BfZmNfZXhlY3V0ZV9jdF9mY19qb2Ioc3RydWN0IGZjX2JzZ19qb2IgKmpvYikKK3N0YXRpYyBpbnQgemZjcF9mY19leGVjX2Vsc19qb2Ioc3RydWN0IGZjX2JzZ19qb2IgKmpvYiwKKwkJCQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgKmVscyA9IGpvYi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gam9iLT5ycG9ydDsKKwlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OworCXUzMiBkX2lkOworCisJaWYgKHJwb3J0KSB7CisJCXBvcnQgPSB6ZmNwX2dldF9wb3J0X2J5X3d3cG4oYWRhcHRlciwgcnBvcnQtPnBvcnRfbmFtZSk7CisJCWlmICghcG9ydCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRfaWQgPSBwb3J0LT5kX2lkOworCQlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOworCX0gZWxzZQorCQlkX2lkID0gbnRvaDI0KGpvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfZWxzLnBvcnRfaWQpOworCisJcmV0dXJuIHpmY3BfZnNmX3NlbmRfZWxzKGFkYXB0ZXIsIGRfaWQsIGVscyk7Cit9CisKK3N0YXRpYyBpbnQgemZjcF9mY19leGVjX2N0X2pvYihzdHJ1Y3QgZmNfYnNnX2pvYiAqam9iLAorCQkJICAgICAgIHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IHJldDsKIAl1OCBnc190eXBlOwotCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBqb2ItPnJwb3J0OwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0Jc3RydWN0IHpmY3BfY3RfZmNfam9iICpjdF9mY19qb2I7CisJc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqY3QgPSBqb2ItPmRkX2RhdGE7CisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgKndrYV9wb3J0OwogCXUzMiBwcmVhbWJsZV93b3JkMTsKIAotCXNob3N0ID0gcnBvcnQgPyBycG9ydF90b19zaG9zdChycG9ydCkgOiBqb2ItPnNob3N0OwotCi0JYWRhcHRlciA9IChzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOwotCWlmICghKGF0b21pY19yZWFkKCZhZGFwdGVyLT5zdGF0dXMpICYgWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWN0X2ZjX2pvYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB6ZmNwX2N0X2ZjX2pvYiksIEdGUF9LRVJORUwpOwotCWlmICghY3RfZmNfam9iKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXByZWFtYmxlX3dvcmQxID0gam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEucl9jdC5wcmVhbWJsZV93b3JkMTsKIAlnc190eXBlID0gKHByZWFtYmxlX3dvcmQxICYgMHhmZjAwMDAwMCkgPj4gMjQ7CiAKIAlzd2l0Y2ggKGdzX3R5cGUpIHsKIAljYXNlIEZDX0ZTVF9BTElBUzoKLQkJY3RfZmNfam9iLT5jdC53a2FfcG9ydCA9ICZhZGFwdGVyLT5ncy0+YXM7CisJCXdrYV9wb3J0ID0gJmFkYXB0ZXItPmdzLT5hczsKIAkJYnJlYWs7CiAJY2FzZSBGQ19GU1RfTUdNVDoKLQkJY3RfZmNfam9iLT5jdC53a2FfcG9ydCA9ICZhZGFwdGVyLT5ncy0+bXM7CisJCXdrYV9wb3J0ID0gJmFkYXB0ZXItPmdzLT5tczsKIAkJYnJlYWs7CiAJY2FzZSBGQ19GU1RfVElNRToKLQkJY3RfZmNfam9iLT5jdC53a2FfcG9ydCA9ICZhZGFwdGVyLT5ncy0+dHM7CisJCXdrYV9wb3J0ID0gJmFkYXB0ZXItPmdzLT50czsKIAkJYnJlYWs7CiAJY2FzZSBGQ19GU1RfRElSOgotCQljdF9mY19qb2ItPmN0LndrYV9wb3J0ID0gJmFkYXB0ZXItPmdzLT5kczsKKwkJd2thX3BvcnQgPSAmYWRhcHRlci0+Z3MtPmRzOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlrZnJlZShjdF9mY19qb2IpOwogCQlyZXR1cm4gLUVJTlZBTDsgLyogbm8gc3VjaCBzZXJ2aWNlICovCiAJfQogCi0JcmV0ID0gemZjcF9mY193a2FfcG9ydF9nZXQoY3RfZmNfam9iLT5jdC53a2FfcG9ydCk7Ci0JaWYgKHJldCkgewotCQlrZnJlZShjdF9mY19qb2IpOworCXJldCA9IHpmY3BfZmNfd2thX3BvcnRfZ2V0KHdrYV9wb3J0KTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCX0KIAotCWN0X2ZjX2pvYi0+Y3QucmVxID0gam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdDsKLQljdF9mY19qb2ItPmN0LnJlc3AgPSBqb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdDsKLQljdF9mY19qb2ItPmN0LmhhbmRsZXIgPSB6ZmNwX2ZjX2dlbmVyaWNfY3RfaGFuZGxlcjsKLQljdF9mY19qb2ItPmN0LmhhbmRsZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjdF9mY19qb2I7Ci0JY3RfZmNfam9iLT5jdC5jb21wbGV0aW9uID0gTlVMTDsKLQljdF9mY19qb2ItPmpvYiA9IGpvYjsKKwlyZXQgPSB6ZmNwX2ZzZl9zZW5kX2N0KHdrYV9wb3J0LCBjdCwgTlVMTCk7CisJaWYgKHJldCkKKwkJemZjcF9mY193a2FfcG9ydF9wdXQod2thX3BvcnQpOwogCi0JcmV0ID0gemZjcF9mc2Zfc2VuZF9jdCgmY3RfZmNfam9iLT5jdCwgTlVMTCk7Ci0JaWYgKHJldCkgewotCQlrZnJlZShjdF9mY19qb2IpOwotCQl6ZmNwX2ZjX3drYV9wb3J0X3B1dChjdF9mY19qb2ItPmN0LndrYV9wb3J0KTsKLQl9CiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHpmY3BfZmNfZXhlY19ic2dfam9iKHN0cnVjdCBmY19ic2dfam9iICpqb2IpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICpjdF9lbHMgPSBqb2ItPmRkX2RhdGE7CisKKwlzaG9zdCA9IGpvYi0+cnBvcnQgPyBycG9ydF90b19zaG9zdChqb2ItPnJwb3J0KSA6IGpvYi0+c2hvc3Q7CisJYWRhcHRlciA9IChzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOworCisJaWYgKCEoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fT1BFTikpCisJCXJldHVybiAtRUlOVkFMOworCisJY3RfZWxzLT5yZXEgPSBqb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0OworCWN0X2Vscy0+cmVzcCA9IGpvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0OworCWN0X2Vscy0+aGFuZGxlciA9IHpmY3BfZmNfY3RfZWxzX2pvYl9oYW5kbGVyOworCWN0X2Vscy0+aGFuZGxlcl9kYXRhID0gam9iOworCisJc3dpdGNoIChqb2ItPnJlcXVlc3QtPm1zZ2NvZGUpIHsKKwljYXNlIEZDX0JTR19SUFRfRUxTOgorCWNhc2UgRkNfQlNHX0hTVF9FTFNfTk9MT0dJTjoKKwkJcmV0dXJuIHpmY3BfZmNfZXhlY19lbHNfam9iKGpvYiwgYWRhcHRlcik7CisJY2FzZSBGQ19CU0dfUlBUX0NUOgorCWNhc2UgRkNfQlNHX0hTVF9DVDoKKwkJcmV0dXJuIHpmY3BfZmNfZXhlY19jdF9qb2Ioam9iLCBhZGFwdGVyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKIGludCB6ZmNwX2ZjX2dzX3NldHVwKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0Jc3RydWN0IHpmY3Bfd2thX3BvcnRzICp3a2FfcG9ydHM7CisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnRzICp3a2FfcG9ydHM7CiAKLQl3a2FfcG9ydHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgemZjcF93a2FfcG9ydHMpLCBHRlBfS0VSTkVMKTsKKwl3a2FfcG9ydHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgemZjcF9mY193a2FfcG9ydHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXdrYV9wb3J0cykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTg4MCw3ICs3ODAsNiBAQAogCXpmY3BfZmNfd2thX3BvcnRfaW5pdCgmd2thX3BvcnRzLT50cywgRkNfRklEX1RJTUVfU0VSViwgYWRhcHRlcik7CiAJemZjcF9mY193a2FfcG9ydF9pbml0KCZ3a2FfcG9ydHMtPmRzLCBGQ19GSURfRElSX1NFUlYsIGFkYXB0ZXIpOwogCXpmY3BfZmNfd2thX3BvcnRfaW5pdCgmd2thX3BvcnRzLT5hcywgRkNfRklEX0FMSUFTRVMsIGFkYXB0ZXIpOwotCXpmY3BfZmNfd2thX3BvcnRfaW5pdCgmd2thX3BvcnRzLT5rcywgRkNfRklEX1NFQ19LRVksIGFkYXB0ZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyYTM2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuaApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIHpmY3AgZGV2aWNlIGRyaXZlcgorICoKKyAqIEZpYnJlIENoYW5uZWwgcmVsYXRlZCBkZWZpbml0aW9ucyBhbmQgaW5saW5lIGZ1bmN0aW9ucyBmb3IgdGhlIHpmY3AKKyAqIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDkKKyAqLworCisjaWZuZGVmIFpGQ1BfRkNfSAorI2RlZmluZSBaRkNQX0ZDX0gKKworI2luY2x1ZGUgPHNjc2kvZmMvZmNfZWxzLmg+CisjaW5jbHVkZSA8c2NzaS9mYy9mY19mY3AuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX25zLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSAiemZjcF9mc2YuaCIKKworI2RlZmluZSBaRkNQX0ZDX0NUX1NJWkVfUEFHRQkgIChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGZjX2N0X2hkcikpCisjZGVmaW5lIFpGQ1BfRkNfR1BOX0ZUX0VOVF9QQUdFCSAgKFpGQ1BfRkNfQ1RfU0laRV9QQUdFIFwKKwkJCQkJLyBzaXplb2Yoc3RydWN0IGZjX2dwbl9mdF9yZXNwKSkKKyNkZWZpbmUgWkZDUF9GQ19HUE5fRlRfTlVNX0JVRlMJICA0IC8qIG1lbW9yeSBwYWdlcyAqLworCisjZGVmaW5lIFpGQ1BfRkNfR1BOX0ZUX01BWF9TSVpFCSAgKFpGQ1BfRkNfR1BOX0ZUX05VTV9CVUZTICogUEFHRV9TSVpFIFwKKwkJCQkJLSBzaXplb2Yoc3RydWN0IGZjX2N0X2hkcikpCisjZGVmaW5lIFpGQ1BfRkNfR1BOX0ZUX01BWF9FTlQJICAoWkZDUF9GQ19HUE5fRlRfTlVNX0JVRlMgKiBcCisJCQkJCShaRkNQX0ZDX0dQTl9GVF9FTlRfUEFHRSArIDEpKQorCisvKioKKyAqIHN0cnVjdCB6ZmNwX2ZjX2dpZF9wbl9yZXEgLSBjb250YWluZXIgZm9yIGN0IGhlYWRlciBwbHVzIGdpZF9wbiByZXF1ZXN0CisgKiBAY3RfaGRyOiBGQyBHUyBjb21tb24gdHJhbnNwb3J0IGhlYWRlcgorICogQGdpZF9wbjogR0lEX1BOIHJlcXVlc3QKKyAqLworc3RydWN0IHpmY3BfZmNfZ2lkX3BuX3JlcSB7CisJc3RydWN0IGZjX2N0X2hkcgljdF9oZHI7CisJc3RydWN0IGZjX25zX2dpZF9wbglnaWRfcG47Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCB6ZmNwX2ZjX2dpZF9wbl9yZXNwIC0gY29udGFpbmVyIGZvciBjdCBoZWFkZXIgcGx1cyBnaWRfcG4gcmVzcG9uc2UKKyAqIEBjdF9oZHI6IEZDIEdTIGNvbW1vbiB0cmFuc3BvcnQgaGVhZGVyCisgKiBAZ2lkX3BuOiBHSURfUE4gcmVzcG9uc2UKKyAqLworc3RydWN0IHpmY3BfZmNfZ2lkX3BuX3Jlc3AgeworCXN0cnVjdCBmY19jdF9oZHIJY3RfaGRyOworCXN0cnVjdCBmY19naWRfcG5fcmVzcAlnaWRfcG47Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCB6ZmNwX2ZjX2dpZF9wbiAtIGV2ZXJ5dGhpbmcgcmVxdWlyZWQgaW4gemZjcCBmb3IgZ2lkX3BuIHJlcXVlc3QKKyAqIEBjdDogZGF0YSBwYXNzZWQgdG8gemZjcF9mc2YgZm9yIGlzc3VpbmcgZnNmIHJlcXVlc3QKKyAqIEBzZ19yZXE6IHNjYXR0ZXJsaXN0IGVudHJ5IGZvciByZXF1ZXN0IGRhdGEKKyAqIEBzZ19yZXNwOiBzY2F0dGVybGlzdCBlbnRyeSBmb3IgcmVzcG9uc2UgZGF0YQorICogQGdpZF9wbl9yZXE6IEdJRF9QTiByZXF1ZXN0IGRhdGEKKyAqIEBnaWRfcG5fcmVzcDogR0lEX1BOIHJlc3BvbnNlIGRhdGEKKyAqLworc3RydWN0IHpmY3BfZmNfZ2lkX3BuIHsKKwlzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzIGN0OworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19yZXE7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnX3Jlc3A7CisJc3RydWN0IHpmY3BfZmNfZ2lkX3BuX3JlcSBnaWRfcG5fcmVxOworCXN0cnVjdCB6ZmNwX2ZjX2dpZF9wbl9yZXNwIGdpZF9wbl9yZXNwOworCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB6ZmNwX2ZjX2dwbl9mdCAtIGNvbnRhaW5lciBmb3IgY3QgaGVhZGVyIHBsdXMgZ3BuX2Z0IHJlcXVlc3QKKyAqIEBjdF9oZHI6IEZDIEdTIGNvbW1vbiB0cmFuc3BvcnQgaGVhZGVyCisgKiBAZ3BuX2Z0OiBHUE5fRlQgcmVxdWVzdAorICovCitzdHJ1Y3QgemZjcF9mY19ncG5fZnRfcmVxIHsKKwlzdHJ1Y3QgZmNfY3RfaGRyCWN0X2hkcjsKKwlzdHJ1Y3QgZmNfbnNfZ2lkX2Z0CWdwbl9mdDsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IHpmY3BfZmNfZ3BuX2Z0X3Jlc3AgLSBjb250YWluZXIgZm9yIGN0IGhlYWRlciBwbHVzIGdwbl9mdCByZXNwb25zZQorICogQGN0X2hkcjogRkMgR1MgY29tbW9uIHRyYW5zcG9ydCBoZWFkZXIKKyAqIEBncG5fZnQ6IEFycmF5IG9mIGdwbl9mdCByZXNwb25zZSBkYXRhIHRvIGZpbGwgb25lIG1lbW9yeSBwYWdlCisgKi8KK3N0cnVjdCB6ZmNwX2ZjX2dwbl9mdF9yZXNwIHsKKwlzdHJ1Y3QgZmNfY3RfaGRyCWN0X2hkcjsKKwlzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AJZ3BuX2Z0W1pGQ1BfRkNfR1BOX0ZUX0VOVF9QQUdFXTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IHpmY3BfZmNfZ3BuX2Z0IC0gemZjcCBkYXRhIGZvciBncG5fZnQgcmVxdWVzdAorICogQGN0OiBkYXRhIHBhc3NlZCB0byB6ZmNwX2ZzZiBmb3IgaXNzdWluZyBmc2YgcmVxdWVzdAorICogQHNnX3JlcTogc2NhdHRlciBsaXN0IGVudHJ5IGZvciBncG5fZnQgcmVxdWVzdAorICogQHNnX3Jlc3A6IHNjYXR0ZXIgbGlzdCBlbnRyaWVzIGZvciBncG5fZnQgcmVzcG9uc2VzIChwZXIgbWVtb3J5IHBhZ2UpCisgKi8KK3N0cnVjdCB6ZmNwX2ZjX2dwbl9mdCB7CisJc3RydWN0IHpmY3BfZnNmX2N0X2VscyBjdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfcmVxOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19yZXNwW1pGQ1BfRkNfR1BOX0ZUX05VTV9CVUZTXTsKK307CisKKy8qKgorICogc3RydWN0IHpmY3BfZmNfZWxzX2FkaXNjIC0gZXZlcnl0aGluZyByZXF1aXJlZCBpbiB6ZmNwIGZvciBpc3N1aW5nIEVMUyBBRElTQworICogQGVsczogZGF0YSByZXF1aXJlZCBmb3IgaXNzdWluZyBlbHMgZnNmIGNvbW1hbmQKKyAqIEByZXE6IHNjYXR0ZXJsaXN0IGVudHJ5IGZvciBFTFMgQURJU0MgcmVxdWVzdAorICogQHJlc3A6IHNjYXR0ZXJsaXN0IGVudHJ5IGZvciBFTFMgQURJU0MgcmVzcG9uc2UKKyAqIEBhZGlzY19yZXE6IEVMUyBBRElTQyByZXF1ZXN0IGRhdGEKKyAqIEBhZGlzY19yZXNwOiBFTFMgQURJU0MgcmVzcG9uc2UgZGF0YQorICovCitzdHJ1Y3QgemZjcF9mY19lbHNfYWRpc2MgeworCXN0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgZWxzOworCXN0cnVjdCBzY2F0dGVybGlzdCByZXE7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHJlc3A7CisJc3RydWN0IGZjX2Vsc19hZGlzYyBhZGlzY19yZXE7CisJc3RydWN0IGZjX2Vsc19hZGlzYyBhZGlzY19yZXNwOworfTsKKworLyoqCisgKiBlbnVtIHpmY3BfZmNfd2thX3N0YXR1cyAtIEZDIFdLQSBwb3J0IHN0YXR1cyBpbiB6ZmNwCisgKiBAWkZDUF9GQ19XS0FfUE9SVF9PRkZMSU5FOiBQb3J0IGlzIGNsb3NlZCBhbmQgbm90IGluIHVzZQorICogQFpGQ1BfRkNfV0tBX1BPUlRfQ0xPU0lORzogVGhlIEZTRiAiY2xvc2UgcG9ydCIgcmVxdWVzdCBpcyBwZW5kaW5nCisgKiBAWkZDUF9GQ19XS0FfUE9SVF9PUEVOSU5HOiBUaGUgRlNGICJvcGVuIHBvcnQiIHJlcXVlc3QgaXMgcGVuZGluZworICogQFpGQ1BfRkNfV0tBX1BPUlRfT05MSU5FOiBUaGUgcG9ydCBpcyBvcGVuIGFuZCB0aGUgcG9ydCBoYW5kbGUgaXMgdmFsaWQKKyAqLworZW51bSB6ZmNwX2ZjX3drYV9zdGF0dXMgeworCVpGQ1BfRkNfV0tBX1BPUlRfT0ZGTElORSwKKwlaRkNQX0ZDX1dLQV9QT1JUX0NMT1NJTkcsCisJWkZDUF9GQ19XS0FfUE9SVF9PUEVOSU5HLAorCVpGQ1BfRkNfV0tBX1BPUlRfT05MSU5FLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCAtIHJlcHJlc2VudGF0aW9uIG9mIHdlbGwta25vd24tYWRkcmVzcyAoV0tBKSBGQyBwb3J0CisgKiBAYWRhcHRlcjogUG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZSB0aGlzIFdLQSBwb3J0IGJlbG9uZ3MgdG8KKyAqIEBjb21wbGV0aW9uX3dxOiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIG9wZW4vY2xvc2UgY29tbWFuZAorICogQHN0YXR1czogQ3VycmVudCBzdGF0dXMgb2YgV0tBIHBvcnQKKyAqIEByZWZjb3VudDogUmVmZXJlbmNlIGNvdW50IHRvIGtlZXAgcG9ydCBvcGVuIGFzIGxvbmcgYXMgaXQgaXMgaW4gdXNlCisgKiBAZF9pZDogRkMgZGVzdGluYXRpb24gaWQgb3Igd2VsbC1rbm93bi1hZGRyZXNzCisgKiBAaGFuZGxlOiBGU0YgaGFuZGxlIGZvciB0aGUgb3BlbiBXS0EgcG9ydAorICogQG11dGV4OiBNdXRleCB1c2VkIGR1cmluZyBvcGVuaW5nL2Nsb3Npbmcgc3RhdGUgY2hhbmdlcworICogQHdvcms6IEZvciBkZWxheWluZyB0aGUgY2xvc2luZyBvZiB0aGUgV0tBIHBvcnQKKyAqLworc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgeworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIJKmFkYXB0ZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3QJY29tcGxldGlvbl93cTsKKwllbnVtIHpmY3BfZmNfd2thX3N0YXR1cwlzdGF0dXM7CisJYXRvbWljX3QJCXJlZmNvdW50OworCXUzMgkJCWRfaWQ7CisJdTMyCQkJaGFuZGxlOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CisJc3RydWN0IGRlbGF5ZWRfd29yawl3b3JrOworfTsKKworLyoqCisgKiBzdHJ1Y3QgemZjcF9mY193a2FfcG9ydHMgLSBEYXRhIHN0cnVjdHVyZXMgZm9yIEZDIGdlbmVyaWMgc2VydmljZXMKKyAqIEBtczogRkMgTWFuYWdlbWVudCBzZXJ2aWNlCisgKiBAdHM6IEZDIHRpbWUgc2VydmljZQorICogQGRzOiBGQyBkaXJlY3Rvcnkgc2VydmljZQorICogQGFzOiBGQyBhbGlhcyBzZXJ2aWNlCisgKi8KK3N0cnVjdCB6ZmNwX2ZjX3drYV9wb3J0cyB7CisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgbXM7CisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgdHM7CisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgZHM7CisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgYXM7Cit9OworCisvKioKKyAqIHpmY3BfZmNfc2NzaV90b19mY3AgLSBzZXR1cCBGQ1AgY29tbWFuZCB3aXRoIGRhdGEgZnJvbSBzY3NpX2NtbmQKKyAqIEBmY3A6IGZjcF9jbW5kIHRvIHNldHVwCisgKiBAc2NzaTogc2NzaV9jbW5kIHdoZXJlIHRvIGdldCBMVU4sIHRhc2sgYXR0cmlidXRlcy9mbGFncyBhbmQgQ0RCCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgemZjcF9mY19zY3NpX3RvX2ZjcChzdHJ1Y3QgZmNwX2NtbmQgKmZjcCwgc3RydWN0IHNjc2lfY21uZCAqc2NzaSkKK3sKKwljaGFyIHRhZ1syXTsKKworCWludF90b19zY3NpbHVuKHNjc2ktPmRldmljZS0+bHVuLCAoc3RydWN0IHNjc2lfbHVuICopICZmY3AtPmZjX2x1bik7CisKKwlpZiAoc2NzaV9wb3B1bGF0ZV90YWdfbXNnKHNjc2ksIHRhZykpIHsKKwkJc3dpdGNoICh0YWdbMF0pIHsKKwkJY2FzZSBNU0dfT1JERVJFRF9UQUc6CisJCQlmY3AtPmZjX3ByaV90YSB8PSBGQ1BfUFRBX09SREVSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBNU0dfU0lNUExFX1RBRzoKKwkJCWZjcC0+ZmNfcHJpX3RhIHw9IEZDUF9QVEFfU0lNUExFOworCQkJYnJlYWs7CisJCX07CisJfSBlbHNlCisJCWZjcC0+ZmNfcHJpX3RhID0gRkNQX1BUQV9TSU1QTEU7CisKKwlpZiAoc2NzaS0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQorCQlmY3AtPmZjX2ZsYWdzIHw9IEZDUF9DRkxfUkREQVRBOworCWlmIChzY3NpLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQlmY3AtPmZjX2ZsYWdzIHw9IEZDUF9DRkxfV1JEQVRBOworCisJbWVtY3B5KGZjcC0+ZmNfY2RiLCBzY3NpLT5jbW5kLCBzY3NpLT5jbWRfbGVuKTsKKworCWZjcC0+ZmNfZGwgPSBzY3NpX2J1ZmZsZW4oc2NzaSk7Cit9CisKKy8qKgorICogemZjcF9mY19mY3BfdG0gLSBzZXR1cCBGQ1AgY29tbWFuZCBhcyB0YXNrIG1hbmFnZW1lbnQgY29tbWFuZAorICogQGZjcDogZmNwX2NtbmQgdG8gc2V0dXAKKyAqIEBkZXY6IHNjc2lfZGV2aWNlIHdoZXJlIHRvIHNlbmQgdGhlIHRhc2sgbWFuYWdlbWVudCBjb21tYW5kCisgKiBAdG06IHRhc2sgbWFuYWdlbWVudCBmbGFncyB0byBzZXR1cCB0bSBjb21tYW5kCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgemZjcF9mY19mY3BfdG0oc3RydWN0IGZjcF9jbW5kICpmY3AsIHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCB1OCB0bV9mbGFncykKK3sKKwlpbnRfdG9fc2NzaWx1bihkZXYtPmx1biwgKHN0cnVjdCBzY3NpX2x1biAqKSAmZmNwLT5mY19sdW4pOworCWZjcC0+ZmNfdG1fZmxhZ3MgfD0gdG1fZmxhZ3M7Cit9CisKKy8qKgorICogemZjcF9mY19ldmFwX2ZjcF9yc3AgLSBldmFsdWF0ZSBGQ1AgUlNQIElVIGFuZCB1cGRhdGUgc2NzaV9jbW5kIGFjY29yZGluZ2x5CisgKiBAZmNwX3JzcDogRkNQIFJTUCBJVSB0byBldmFsdWF0ZQorICogQHNjc2k6IFNDU0kgY29tbWFuZCB3aGVyZSB0byB1cGRhdGUgc3RhdHVzIGFuZCBzZW5zZSBidWZmZXIKKyAqLworc3RhdGljIGlubGluZQordm9pZCB6ZmNwX2ZjX2V2YWxfZmNwX3JzcChzdHJ1Y3QgZmNwX3Jlc3Bfd2l0aF9leHQgKmZjcF9yc3AsCisJCQkgIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2kpCit7CisJc3RydWN0IGZjcF9yZXNwX3JzcF9pbmZvICpyc3BfaW5mbzsKKwljaGFyICpzZW5zZTsKKwl1MzIgc2Vuc2VfbGVuLCByZXNpZDsKKwl1OCByc3BfZmxhZ3M7CisKKwlzZXRfbXNnX2J5dGUoc2NzaSwgQ09NTUFORF9DT01QTEVURSk7CisJc2NzaS0+cmVzdWx0IHw9IGZjcF9yc3AtPnJlc3AuZnJfc3RhdHVzOworCisJcnNwX2ZsYWdzID0gZmNwX3JzcC0+cmVzcC5mcl9mbGFnczsKKworCWlmICh1bmxpa2VseShyc3BfZmxhZ3MgJiBGQ1BfUlNQX0xFTl9WQUwpKSB7CisJCXJzcF9pbmZvID0gKHN0cnVjdCBmY3BfcmVzcF9yc3BfaW5mbyAqKSAmZmNwX3JzcFsxXTsKKwkJaWYgKHJzcF9pbmZvLT5yc3BfY29kZSA9PSBGQ1BfVE1GX0NNUEwpCisJCQlzZXRfaG9zdF9ieXRlKHNjc2ksIERJRF9PSyk7CisJCWVsc2UgeworCQkJc2V0X2hvc3RfYnl0ZShzY3NpLCBESURfRVJST1IpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHVubGlrZWx5KHJzcF9mbGFncyAmIEZDUF9TTlNfTEVOX1ZBTCkpIHsKKwkJc2Vuc2UgPSAoY2hhciAqKSAmZmNwX3JzcFsxXTsKKwkJaWYgKHJzcF9mbGFncyAmIEZDUF9SU1BfTEVOX1ZBTCkKKwkJCXNlbnNlICs9IGZjcF9yc3AtPmV4dC5mcl9zbnNfbGVuOworCQlzZW5zZV9sZW4gPSBtaW4oZmNwX3JzcC0+ZXh0LmZyX3Nuc19sZW4sCisJCQkJKHUzMikgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwkJbWVtY3B5KHNjc2ktPnNlbnNlX2J1ZmZlciwgc2Vuc2UsIHNlbnNlX2xlbik7CisJfQorCisJaWYgKHVubGlrZWx5KHJzcF9mbGFncyAmIEZDUF9SRVNJRF9VTkRFUikpIHsKKwkJcmVzaWQgPSBmY3BfcnNwLT5leHQuZnJfcmVzaWQ7CisJCXNjc2lfc2V0X3Jlc2lkKHNjc2ksIHJlc2lkKTsKKwkJaWYgKHNjc2lfYnVmZmxlbihzY3NpKSAtIHJlc2lkIDwgc2NzaS0+dW5kZXJmbG93ICYmCisJCSAgICAgIShyc3BfZmxhZ3MgJiBGQ1BfU05TX0xFTl9WQUwpICYmCisJCSAgICAgZmNwX3JzcC0+cmVzcC5mcl9zdGF0dXMgPT0gU0FNX1NUQVRfR09PRCkKKwkJCXNldF9ob3N0X2J5dGUoc2NzaSwgRElEX0VSUk9SKTsKKwl9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKaW5kZXggNGU0MWJhYS4uNDgyZGNkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCkBAIC0xMCw3ICsxMCw5IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2Vscy5oPgogI2luY2x1ZGUgInpmY3BfZXh0LmgiCisjaW5jbHVkZSAiemZjcF9mYy5oIgogI2luY2x1ZGUgInpmY3BfZGJmLmgiCiAKIHN0YXRpYyB2b2lkIHpmY3BfZnNmX3JlcXVlc3RfdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTEyMiwzNiArMTI0LDMyIEBACiAKIHN0YXRpYyB2b2lkIHpmY3BfZnNmX3N0YXR1c19yZWFkX3BvcnRfY2xvc2VkKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBmc2Zfc3RhdHVzX3JlYWRfYnVmZmVyICpzcl9idWYgPSByZXEtPmRhdGE7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHJlcS0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwotCWludCBkX2lkID0gc3JfYnVmLT5kX2lkICYgWkZDUF9ESURfTUFTSzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkX2lkID0gbnRvaDI0KHNyX2J1Zi0+ZF9pZCk7CiAKLQlyZWFkX2xvY2tfaXJxc2F2ZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpCisJcmVhZF9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0LCBsaXN0KQogCQlpZiAocG9ydC0+ZF9pZCA9PSBkX2lkKSB7Ci0JCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKIAkJCXpmY3BfZXJwX3BvcnRfcmVvcGVuKHBvcnQsIDAsICJmc3NycGMxIiwgcmVxKTsKLQkJCXJldHVybjsKKwkJCWJyZWFrOwogCQl9Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgemZjcF9mc2ZfbGlua19kb3duX2luZm9fZXZhbChzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEsIGNoYXIgKmlkLAogCQkJCQkgc3RydWN0IGZzZl9saW5rX2Rvd25faW5mbyAqbGlua19kb3duKQogewogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSByZXEtPmFkYXB0ZXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0FEQVBURVJfTElOS19VTlBMVUdHRUQpCiAJCXJldHVybjsKIAogCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19BREFQVEVSX0xJTktfVU5QTFVHR0VELCAmYWRhcHRlci0+c3RhdHVzKTsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKIAl6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRzX2Jsb2NrKGFkYXB0ZXIpOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFsaW5rX2Rvd24pCiAJCWdvdG8gb3V0OwpAQCAtMjkxLDcgKzI4OSw3IEBACiAJCQl6ZmNwX2VycF9hZGFwdGVyX2FjY2Vzc19jaGFuZ2VkKGFkYXB0ZXIsICJmc3NyaF8zIiwKIAkJCQkJCQlyZXEpOwogCQlpZiAoc3JfYnVmLT5zdGF0dXNfc3VidHlwZSAmIEZTRl9TVEFUVVNfUkVBRF9TVUJfSU5DT01JTkdfRUxTKQotCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+c2Nhbl93b3JrKTsKKwkJCXF1ZXVlX3dvcmsoYWRhcHRlci0+d29ya19xdWV1ZSwgJmFkYXB0ZXItPnNjYW5fd29yayk7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1NUQVRVU19SRUFEX0NGRENfVVBEQVRFRDoKIAkJemZjcF9lcnBfYWRhcHRlcl9hY2Nlc3NfY2hhbmdlZChhZGFwdGVyLCAiZnNzcmhfNCIsIHJlcSk7CkBAIC0zMTcsNyArMzE1LDYgQEAKIAljYXNlIEZTRl9TUV9VTFBfREVQRU5ERU5UX0VSUF9SRVFVSVJFRDoKIAkJcmV0dXJuOwogCWNhc2UgRlNGX1NRX0NPTU1BTkRfQUJPUlRFRDoKLQkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0FCT1JURUQ7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1NRX05PX1JFQ09NOgogCQlkZXZfZXJyKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKQEAgLTM1OCw4ICszNTUsNyBAQAogCXpmY3BfZGJmX2hiYV9mc2ZfcmVzcG9uc2UocmVxKTsKIAogCWlmIChyZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9ESVNNSVNTRUQpIHsKLQkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SIHwKLQkJCVpGQ1BfU1RBVFVTX0ZTRlJFUV9SRVRSWTsgLyogb25seSBmb3IgU0NTSSBjbW5kcy4gKi8KKwkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNzcsNyArMzczLDcgQEAKIAljYXNlIEZTRl9QUk9UX0VSUk9SX1NUQVRFOgogCWNhc2UgRlNGX1BST1RfU0VRX05VTUJfRVJST1I6CiAJCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKGFkYXB0ZXIsIDAsICJmc3BzZV8yIiwgcmVxKTsKLQkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX1JFVFJZOworCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BST1RfVU5TVVBQX1FUQ0JfVFlQRToKIAkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LApAQCAtNDgwLDIwICs0NzYsMjcgQEAKIAogc3RhdGljIGludCB6ZmNwX2ZzZl9leGNoYW5nZV9jb25maWdfZXZhbHVhdGUoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewotCXN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fY29uZmlnICpib3R0b207CisJc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9jb25maWcgKmJvdHRvbSA9ICZyZXEtPnF0Y2ItPmJvdHRvbS5jb25maWc7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHJlcS0+YWRhcHRlcjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGFkYXB0ZXItPnNjc2lfaG9zdDsKKwlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpuc3AsICpwbG9naTsKIAotCWJvdHRvbSA9ICZyZXEtPnF0Y2ItPmJvdHRvbS5jb25maWc7CisJLyogYWRqdXN0IHBvaW50ZXJzIGZvciBtaXNzaW5nIGNvbW1hbmQgY29kZSAqLworCW5zcCA9IChzdHJ1Y3QgZmNfZWxzX2Zsb2dpICopICgodTggKikmYm90dG9tLT5ucG9ydF9zZXJ2X3BhcmFtCisJCQkJCS0gc2l6ZW9mKHUzMikpOworCXBsb2dpID0gKHN0cnVjdCBmY19lbHNfZmxvZ2kgKikgKCh1OCAqKSZib3R0b20tPnBsb2dpX3BheWxvYWQKKwkJCQkJLSBzaXplb2YodTMyKSk7CiAKIAlpZiAocmVxLT5kYXRhKQogCQltZW1jcHkocmVxLT5kYXRhLCBib3R0b20sIHNpemVvZigqYm90dG9tKSk7CiAKLQlmY19ob3N0X25vZGVfbmFtZShzaG9zdCkgPSBib3R0b20tPm5wb3J0X3NlcnZfcGFyYW0ud3dubjsKLQlmY19ob3N0X3BvcnRfbmFtZShzaG9zdCkgPSBib3R0b20tPm5wb3J0X3NlcnZfcGFyYW0ud3dwbjsKLQlmY19ob3N0X3BvcnRfaWQoc2hvc3QpID0gYm90dG9tLT5zX2lkICYgWkZDUF9ESURfTUFTSzsKKwlmY19ob3N0X3BvcnRfbmFtZShzaG9zdCkgPSBuc3AtPmZsX3d3cG47CisJZmNfaG9zdF9ub2RlX25hbWUoc2hvc3QpID0gbnNwLT5mbF93d25uOworCWZjX2hvc3RfcG9ydF9pZChzaG9zdCkgPSBudG9oMjQoYm90dG9tLT5zX2lkKTsKIAlmY19ob3N0X3NwZWVkKHNob3N0KSA9IGJvdHRvbS0+ZmNfbGlua19zcGVlZDsKIAlmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKHNob3N0KSA9IEZDX0NPU19DTEFTUzIgfCBGQ19DT1NfQ0xBU1MzOworCWZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMoc2hvc3QpWzJdID0gMTsgLyogRkNQICovCisJZmNfaG9zdF9hY3RpdmVfZmM0cyhzaG9zdClbMl0gPSAxOyAvKiBGQ1AgKi8KIAogCWFkYXB0ZXItPmh5ZHJhX3ZlcnNpb24gPSBib3R0b20tPmFkYXB0ZXJfdHlwZTsKIAlhZGFwdGVyLT50aW1lcl90aWNrcyA9IGJvdHRvbS0+dGltZXJfaW50ZXJ2YWw7CkBAIC01MDMsOSArNTA2LDkgQEAKIAogCXN3aXRjaCAoYm90dG9tLT5mY190b3BvbG9neSkgewogCWNhc2UgRlNGX1RPUE9fUDJQOgotCQlhZGFwdGVyLT5wZWVyX2RfaWQgPSBib3R0b20tPnBlZXJfZF9pZCAmIFpGQ1BfRElEX01BU0s7Ci0JCWFkYXB0ZXItPnBlZXJfd3dwbiA9IGJvdHRvbS0+cGxvZ2lfcGF5bG9hZC53d3BuOwotCQlhZGFwdGVyLT5wZWVyX3d3bm4gPSBib3R0b20tPnBsb2dpX3BheWxvYWQud3dubjsKKwkJYWRhcHRlci0+cGVlcl9kX2lkID0gbnRvaDI0KGJvdHRvbS0+cGVlcl9kX2lkKTsKKwkJYWRhcHRlci0+cGVlcl93d3BuID0gcGxvZ2ktPmZsX3d3cG47CisJCWFkYXB0ZXItPnBlZXJfd3dubiA9IHBsb2dpLT5mbF93d25uOwogCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9QVFA7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1RPUE9fRkFCUklDOgpAQCAtODgxLDEzICs4ODQsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUE9SVF9CT1hFRDoKIAkJemZjcF9lcnBfcG9ydF9ib3hlZCh1bml0LT5wb3J0LCAiZnNhZmNoMyIsIHJlcSk7Ci0JCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUiB8Ci0JCQkgICAgICAgWkZDUF9TVEFUVVNfRlNGUkVRX1JFVFJZOworCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCWJyZWFrOwogCWNhc2UgRlNGX0xVTl9CT1hFRDoKIAkJemZjcF9lcnBfdW5pdF9ib3hlZCh1bml0LCAiZnNhZmNoNCIsIHJlcSk7Ci0JCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUiB8Ci0JCQkgICAgICAgWkZDUF9TVEFUVVNfRlNGUkVRX1JFVFJZOworCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAJY2FzZSBGU0ZfQURBUFRFUl9TVEFUVVNfQVZBSUxBQkxFOgogCQlzd2l0Y2ggKGZzcS0+d29yZFswXSkgewpAQCAtOTU4LDEwICs5NTksMTAgQEAKIHN0YXRpYyB2b2lkIHpmY3BfZnNmX3NlbmRfY3RfaGFuZGxlcihzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEpCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHJlcS0+YWRhcHRlcjsKLQlzdHJ1Y3QgemZjcF9zZW5kX2N0ICpzZW5kX2N0ID0gcmVxLT5kYXRhOworCXN0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgKmN0ID0gcmVxLT5kYXRhOwogCXN0cnVjdCBmc2ZfcXRjYl9oZWFkZXIgKmhlYWRlciA9ICZyZXEtPnF0Y2ItPmhlYWRlcjsKIAotCXNlbmRfY3QtPnN0YXR1cyA9IC1FSU5WQUw7CisJY3QtPnN0YXR1cyA9IC1FSU5WQUw7CiAKIAlpZiAocmVxLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1IpCiAJCWdvdG8gc2tpcF9mc2ZzdGF0dXM7CkBAIC05NjksNyArOTcwLDcgQEAKIAlzd2l0Y2ggKGhlYWRlci0+ZnNmX3N0YXR1cykgewogICAgICAgICBjYXNlIEZTRl9HT09EOgogCQl6ZmNwX2RiZl9zYW5fY3RfcmVzcG9uc2UocmVxKTsKLQkJc2VuZF9jdC0+c3RhdHVzID0gMDsKKwkJY3QtPnN0YXR1cyA9IDA7CiAJCWJyZWFrOwogICAgICAgICBjYXNlIEZTRl9TRVJWSUNFX0NMQVNTX05PVF9TVVBQT1JURUQ6CiAJCXpmY3BfZnNmX2NsYXNzX25vdF9zdXBwKHJlcSk7CkBAIC05ODUsOCArOTg2LDcgQEAKIAljYXNlIEZTRl9BQ0NFU1NfREVOSUVEOgogCQlicmVhazsKICAgICAgICAgY2FzZSBGU0ZfUE9SVF9CT1hFRDoKLQkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SIHwKLQkJCSAgICAgICBaRkNQX1NUQVRVU19GU0ZSRVFfUkVUUlk7CisJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUE9SVF9IQU5ETEVfTk9UX1ZBTElEOgogCQl6ZmNwX2VycF9hZGFwdGVyX3Jlb3BlbihhZGFwdGVyLCAwLCAiZnNzY3RoMSIsIHJlcSk7CkBAIC0xMDAxLDggKzEwMDEsOCBAQAogCX0KIAogc2tpcF9mc2ZzdGF0dXM6Ci0JaWYgKHNlbmRfY3QtPmhhbmRsZXIpCi0JCXNlbmRfY3QtPmhhbmRsZXIoc2VuZF9jdC0+aGFuZGxlcl9kYXRhKTsKKwlpZiAoY3QtPmhhbmRsZXIpCisJCWN0LT5oYW5kbGVyKGN0LT5oYW5kbGVyX2RhdGEpOwogfQogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHNfdW5jaGFpbmVkKHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZSwKQEAgLTEwNzEsMTUgKzEwNzEsMTcgQEAKIAkJCQkgaW50IG1heF9zYmFscykKIHsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBmY3BfY2hhbl90aW1lb3V0OwogCiAJcmV0ID0gemZjcF9mc2Zfc2V0dXBfY3RfZWxzX3NiYWxzKHJlcSwgc2dfcmVxLCBzZ19yZXNwLCBtYXhfc2JhbHMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBjb21tb24gc2V0dGluZ3MgZm9yIGN0L2dzIGFuZCBlbHMgcmVxdWVzdHMgKi8KKwlmY3BfY2hhbl90aW1lb3V0ID0gMiAqIEZDX0RFRl9SX0FfVE9WIC8gMTAwMDsKIAlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnNlcnZpY2VfY2xhc3MgPSBGU0ZfQ0xBU1NfMzsKLQlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnRpbWVvdXQgPSAyICogUl9BX1RPVjsKLQl6ZmNwX2ZzZl9zdGFydF90aW1lcihyZXEsICgyICogUl9BX1RPViArIDEwKSAqIEhaKTsKKwlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnRpbWVvdXQgPSBmY3BfY2hhbl90aW1lb3V0OworCXpmY3BfZnNmX3N0YXJ0X3RpbWVyKHJlcSwgKGZjcF9jaGFuX3RpbWVvdXQgKyAxMCkgKiBIWik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwODksOSArMTA5MSw5IEBACiAgKiBAY3Q6IHBvaW50ZXIgdG8gc3RydWN0IHpmY3Bfc2VuZF9jdCB3aXRoIGRhdGEgZm9yIHJlcXVlc3QKICAqIEBwb29sOiBpZiBub24tbnVsbCB0aGlzIG1lbXBvb2wgaXMgdXNlZCB0byBhbGxvY2F0ZSBzdHJ1Y3QgemZjcF9mc2ZfcmVxCiAgKi8KLWludCB6ZmNwX2ZzZl9zZW5kX2N0KHN0cnVjdCB6ZmNwX3NlbmRfY3QgKmN0LCBtZW1wb29sX3QgKnBvb2wpCitpbnQgemZjcF9mc2Zfc2VuZF9jdChzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCAqd2thX3BvcnQsCisJCSAgICAgc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqY3QsIG1lbXBvb2xfdCAqcG9vbCkKIHsKLQlzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQgPSBjdC0+d2thX3BvcnQ7CiAJc3RydWN0IHpmY3BfcWRpbyAqcWRpbyA9IHdrYV9wb3J0LT5hZGFwdGVyLT5xZGlvOwogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcTsKIAlpbnQgcmV0ID0gLUVJTzsKQEAgLTExMTcsNyArMTExOSw3IEBACiAJcmVxLT5xdGNiLT5oZWFkZXIucG9ydF9oYW5kbGUgPSB3a2FfcG9ydC0+aGFuZGxlOwogCXJlcS0+ZGF0YSA9IGN0OwogCi0JemZjcF9kYmZfc2FuX2N0X3JlcXVlc3QocmVxKTsKKwl6ZmNwX2RiZl9zYW5fY3RfcmVxdWVzdChyZXEsIHdrYV9wb3J0LT5kX2lkKTsKIAogCXJldCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CiAJaWYgKHJldCkKQEAgLTExMzQsNyArMTEzNiw3IEBACiAKIHN0YXRpYyB2b2lkIHpmY3BfZnNmX3NlbmRfZWxzX2hhbmRsZXIoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewotCXN0cnVjdCB6ZmNwX3NlbmRfZWxzICpzZW5kX2VscyA9IHJlcS0+ZGF0YTsKKwlzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICpzZW5kX2VscyA9IHJlcS0+ZGF0YTsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gc2VuZF9lbHMtPnBvcnQ7CiAJc3RydWN0IGZzZl9xdGNiX2hlYWRlciAqaGVhZGVyID0gJnJlcS0+cXRjYi0+aGVhZGVyOwogCkBAIC0xMTU0LDkgKzExNTYsNiBAQAogCWNhc2UgRlNGX0FEQVBURVJfU1RBVFVTX0FWQUlMQUJMRToKIAkJc3dpdGNoIChoZWFkZXItPmZzZl9zdGF0dXNfcXVhbC53b3JkWzBdKXsKIAkJY2FzZSBGU0ZfU1FfSU5WT0tFX0xJTktfVEVTVF9QUk9DRURVUkU6Ci0JCQlpZiAocG9ydCAmJiAoc2VuZF9lbHMtPmxzX2NvZGUgIT0gWkZDUF9MU19BRElTQykpCi0JCQkJemZjcF9mY190ZXN0X2xpbmsocG9ydCk7Ci0JCQkvKmZhbGwgdGhyb3VnaCAqLwogCQljYXNlIEZTRl9TUV9VTFBfREVQRU5ERU5UX0VSUF9SRVFVSVJFRDoKIAkJY2FzZSBGU0ZfU1FfUkVUUllfSUZfUE9TU0lCTEU6CiAJCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CkBAIC0xMTg4LDEwICsxMTg3LDExIEBACiAgKiB6ZmNwX2ZzZl9zZW5kX2VscyAtIGluaXRpYXRlIGFuIEVMUyBjb21tYW5kIChGQy1GUykKICAqIEBlbHM6IHBvaW50ZXIgdG8gc3RydWN0IHpmY3Bfc2VuZF9lbHMgd2l0aCBkYXRhIGZvciB0aGUgY29tbWFuZAogICovCi1pbnQgemZjcF9mc2Zfc2VuZF9lbHMoc3RydWN0IHpmY3Bfc2VuZF9lbHMgKmVscykKK2ludCB6ZmNwX2ZzZl9zZW5kX2VscyhzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLCB1MzIgZF9pZCwKKwkJICAgICAgc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqZWxzKQogewogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcTsKLQlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gZWxzLT5hZGFwdGVyLT5xZGlvOworCXN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8gPSBhZGFwdGVyLT5xZGlvOwogCWludCByZXQgPSAtRUlPOwogCiAJc3Bpbl9sb2NrX2JoKCZxZGlvLT5yZXFfcV9sb2NrKTsKQEAgLTEyMTEsNyArMTIxMSw3IEBACiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWRfc2VuZDsKIAotCXJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZF9pZCA9IGVscy0+ZF9pZDsKKwlodG9uMjQocmVxLT5xdGNiLT5ib3R0b20uc3VwcG9ydC5kX2lkLCBkX2lkKTsKIAlyZXEtPmhhbmRsZXIgPSB6ZmNwX2ZzZl9zZW5kX2Vsc19oYW5kbGVyOwogCXJlcS0+ZGF0YSA9IGVsczsKIApAQCAtMTQyMiw3ICsxNDIyLDcgQEAKIHsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gcmVxLT5kYXRhOwogCXN0cnVjdCBmc2ZfcXRjYl9oZWFkZXIgKmhlYWRlciA9ICZyZXEtPnF0Y2ItPmhlYWRlcjsKLQlzdHJ1Y3QgZnNmX3Bsb2dpICpwbG9naTsKKwlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpwbG9naTsKIAogCWlmIChyZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUikKIAkJZ290byBvdXQ7CkBAIC0xNDcyLDIzICsxNDcyLDEwIEBACiAJCSAqIGFub3RoZXIgR0lEX1BOIHN0cmFpZ2h0IGFmdGVyIGEgcG9ydCBoYXMgYmVlbiBvcGVuZWQuCiAJCSAqIEFsdGVybmF0ZWx5LCBhbiBBRElTQy9QRElTQyBFTFMgc2hvdWxkIHN1ZmZpY2UsIGFzIHdlbGwuCiAJCSAqLwotCQlwbG9naSA9IChzdHJ1Y3QgZnNmX3Bsb2dpICopIHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZWxzOworCQlwbG9naSA9IChzdHJ1Y3QgZmNfZWxzX2Zsb2dpICopIHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZWxzOwogCQlpZiAocmVxLT5xdGNiLT5ib3R0b20uc3VwcG9ydC5lbHMxX2xlbmd0aCA+PQotCQkgICAgRlNGX1BMT0dJX01JTl9MRU4pIHsKLQkJCWlmIChwbG9naS0+c2Vydl9wYXJhbS53d3BuICE9IHBvcnQtPnd3cG4pIHsKLQkJCQlwb3J0LT5kX2lkID0gMDsKLQkJCQlkZXZfd2FybigmcG9ydC0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJCQkgIkEgcG9ydCBvcGVuZWQgd2l0aCBXV1BOIDB4JTAxNkx4ICIKLQkJCQkJICJyZXR1cm5lZCBkYXRhIHRoYXQgaWRlbnRpZmllcyBpdCBhcyAiCi0JCQkJCSAiV1dQTiAweCUwMTZMeFxuIiwKLQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvcnQtPnd3cG4sCi0JCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKQotCQkJCQkgIHBsb2dpLT5zZXJ2X3BhcmFtLnd3cG4pOwotCQkJfSBlbHNlIHsKLQkJCQlwb3J0LT53d25uID0gcGxvZ2ktPnNlcnZfcGFyYW0ud3dubjsKKwkJICAgIEZTRl9QTE9HSV9NSU5fTEVOKQogCQkJCXpmY3BfZmNfcGxvZ2lfZXZhbHVhdGUocG9ydCwgcGxvZ2kpOwotCQkJfQotCQl9CiAJCWJyZWFrOwogCWNhc2UgRlNGX1VOS05PV05fT1BfU1VCVFlQRToKIAkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SOwpAQCAtMTQ5Niw3ICsxNDgzLDcgQEAKIAl9CiAKIG91dDoKLQl6ZmNwX3BvcnRfcHV0KHBvcnQpOworCXB1dF9kZXZpY2UoJnBvcnQtPnN5c2ZzX2RldmljZSk7CiB9CiAKIC8qKgpAQCAtMTUzMCwxOCArMTUxNywxOCBAQAogICAgICAgICBzYmFsZVsxXS5mbGFncyB8PSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CiAKIAlyZXEtPmhhbmRsZXIgPSB6ZmNwX2ZzZl9vcGVuX3BvcnRfaGFuZGxlcjsKLQlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LmRfaWQgPSBwb3J0LT5kX2lkOworCWh0b24yNChyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LmRfaWQsIHBvcnQtPmRfaWQpOwogCXJlcS0+ZGF0YSA9IHBvcnQ7CiAJcmVxLT5lcnBfYWN0aW9uID0gZXJwX2FjdGlvbjsKIAllcnBfYWN0aW9uLT5mc2ZfcmVxID0gcmVxOwotCXpmY3BfcG9ydF9nZXQocG9ydCk7CisJZ2V0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIAogCXpmY3BfZnNmX3N0YXJ0X2VycF90aW1lcihyZXEpOwogCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CiAJaWYgKHJldHZhbCkgewogCQl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOwogCQllcnBfYWN0aW9uLT5mc2ZfcmVxID0gTlVMTDsKLQkJemZjcF9wb3J0X3B1dChwb3J0KTsKKwkJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIAl9CiBvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJnFkaW8tPnJlcV9xX2xvY2spOwpAQCAtMTYxOCwxMSArMTYwNSwxMSBAQAogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0X2hhbmRsZXIoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewotCXN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCA9IHJlcS0+ZGF0YTsKKwlzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCAqd2thX3BvcnQgPSByZXEtPmRhdGE7CiAJc3RydWN0IGZzZl9xdGNiX2hlYWRlciAqaGVhZGVyID0gJnJlcS0+cXRjYi0+aGVhZGVyOwogCiAJaWYgKHJlcS0+c3RhdHVzICYgWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SKSB7Ci0JCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX1dLQV9QT1JUX09GRkxJTkU7CisJCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX0ZDX1dLQV9QT1JUX09GRkxJTkU7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTYzNSwxMyArMTYyMiwxMyBAQAogCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRlNGX0FDQ0VTU19ERU5JRUQ6Ci0JCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX1dLQV9QT1JUX09GRkxJTkU7CisJCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX0ZDX1dLQV9QT1JUX09GRkxJTkU7CiAJCWJyZWFrOwogCWNhc2UgRlNGX0dPT0Q6CiAJCXdrYV9wb3J0LT5oYW5kbGUgPSBoZWFkZXItPnBvcnRfaGFuZGxlOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIEZTRl9QT1JUX0FMUkVBRFlfT1BFTjoKLQkJd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfV0tBX1BPUlRfT05MSU5FOworCQl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9GQ19XS0FfUE9SVF9PTkxJTkU7CiAJfQogb3V0OgogCXdha2VfdXAoJndrYV9wb3J0LT5jb21wbGV0aW9uX3dxKTsKQEAgLTE2NDksMTAgKzE2MzYsMTAgQEAKIAogLyoqCiAgKiB6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0IC0gY3JlYXRlIGFuZCBzZW5kIG9wZW4gd2thLXBvcnQgcmVxdWVzdAotICogQHdrYV9wb3J0OiBwb2ludGVyIHRvIHN0cnVjdCB6ZmNwX3drYV9wb3J0CisgKiBAd2thX3BvcnQ6IHBvaW50ZXIgdG8gc3RydWN0IHpmY3BfZmNfd2thX3BvcnQKICAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgZXJyb3Igb3RoZXJ3aXNlCiAgKi8KLWludCB6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0KHN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCkKK2ludCB6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0KHN0cnVjdCB6ZmNwX2ZjX3drYV9wb3J0ICp3a2FfcG9ydCkKIHsKIAlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJc3RydWN0IHpmY3BfcWRpbyAqcWRpbyA9IHdrYV9wb3J0LT5hZGFwdGVyLT5xZGlvOwpAQCAtMTY3Nyw3ICsxNjY0LDcgQEAKIAlzYmFsZVsxXS5mbGFncyB8PSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CiAKIAlyZXEtPmhhbmRsZXIgPSB6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0X2hhbmRsZXI7Ci0JcmVxLT5xdGNiLT5ib3R0b20uc3VwcG9ydC5kX2lkID0gd2thX3BvcnQtPmRfaWQ7CisJaHRvbjI0KHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZF9pZCwgd2thX3BvcnQtPmRfaWQpOwogCXJlcS0+ZGF0YSA9IHdrYV9wb3J0OwogCiAJemZjcF9mc2Zfc3RhcnRfdGltZXIocmVxLCBaRkNQX0ZTRl9SRVFVRVNUX1RJTUVPVVQpOwpAQCAtMTY5MSwyMyArMTY3OCwyMyBAQAogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZzZl9jbG9zZV93a2FfcG9ydF9oYW5kbGVyKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKIHsKLQlzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQgPSByZXEtPmRhdGE7CisJc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgKndrYV9wb3J0ID0gcmVxLT5kYXRhOwogCiAJaWYgKHJlcS0+cXRjYi0+aGVhZGVyLmZzZl9zdGF0dXMgPT0gRlNGX1BPUlRfSEFORExFX05PVF9WQUxJRCkgewogCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKHdrYV9wb3J0LT5hZGFwdGVyLCAwLCAiZnNjd3BoMSIsIHJlcSk7CiAJfQogCi0Jd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfV0tBX1BPUlRfT0ZGTElORTsKKwl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9GQ19XS0FfUE9SVF9PRkZMSU5FOwogCXdha2VfdXAoJndrYV9wb3J0LT5jb21wbGV0aW9uX3dxKTsKIH0KIAogLyoqCiAgKiB6ZmNwX2ZzZl9jbG9zZV93a2FfcG9ydCAtIGNyZWF0ZSBhbmQgc2VuZCBjbG9zZSB3a2EgcG9ydCByZXF1ZXN0Ci0gKiBAZXJwX2FjdGlvbjogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uCisgKiBAd2thX3BvcnQ6IFdLQSBwb3J0IHRvIG9wZW4KICAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgZXJyb3Igb3RoZXJ3aXNlCiAgKi8KLWludCB6ZmNwX2ZzZl9jbG9zZV93a2FfcG9ydChzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQpCitpbnQgemZjcF9mc2ZfY2xvc2Vfd2thX3BvcnQoc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgKndrYV9wb3J0KQogewogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gd2thX3BvcnQtPmFkYXB0ZXItPnFkaW87CkBAIC0xNzY1LDEzICsxNzUyLDEzIEBACiAJCS8qIGNhbid0IHVzZSBnZW5lcmljIHpmY3BfZXJwX21vZGlmeV9wb3J0X3N0YXR1cyBiZWNhdXNlCiAJCSAqIFpGQ1BfU1RBVFVTX0NPTU1PTl9PUEVOIG11c3Qgbm90IGJlIHJlc2V0IGZvciB0aGUgcG9ydCAqLwogCQlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19QT1JUX1BIWVNfT1BFTiwgJnBvcnQtPnN0YXR1cyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodW5pdCwgJnBvcnQtPnVuaXRfbGlzdF9oZWFkLCBsaXN0KQorCQlyZWFkX2xvY2soJnBvcnQtPnVuaXRfbGlzdF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0LCBsaXN0KQogCQkJYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4sCiAJCQkJCSAgJnVuaXQtPnN0YXR1cyk7CisJCXJlYWRfdW5sb2NrKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CiAJCXpmY3BfZXJwX3BvcnRfYm94ZWQocG9ydCwgImZzY3BwaDIiLCByZXEpOwotCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1IgfAotCQkJICAgICAgIFpGQ1BfU1RBVFVTX0ZTRlJFUV9SRVRSWTsKLQorCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCWJyZWFrOwogCWNhc2UgRlNGX0FEQVBURVJfU1RBVFVTX0FWQUlMQUJMRToKIAkJc3dpdGNoIChoZWFkZXItPmZzZl9zdGF0dXNfcXVhbC53b3JkWzBdKSB7CkBAIC0xNzg3LDkgKzE3NzQsMTEgQEAKIAkJICogWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4gbXVzdCBub3QgYmUgcmVzZXQgZm9yIHRoZSBwb3J0CiAJCSAqLwogCQlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19QT1JUX1BIWVNfT1BFTiwgJnBvcnQtPnN0YXR1cyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodW5pdCwgJnBvcnQtPnVuaXRfbGlzdF9oZWFkLCBsaXN0KQorCQlyZWFkX2xvY2soJnBvcnQtPnVuaXRfbGlzdF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0LCBsaXN0KQogCQkJYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4sCiAJCQkJCSAgJnVuaXQtPnN0YXR1cyk7CisJCXJlYWRfdW5sb2NrKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE4NzMsOCArMTg2Miw3IEBACiAJCWJyZWFrOwogCWNhc2UgRlNGX1BPUlRfQk9YRUQ6CiAJCXpmY3BfZXJwX3BvcnRfYm94ZWQodW5pdC0+cG9ydCwgImZzb3VoXzIiLCByZXEpOwotCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1IgfAotCQkJICAgICAgIFpGQ1BfU1RBVFVTX0ZTRlJFUV9SRVRSWTsKKwkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SOwogCQlicmVhazsKIAljYXNlIEZTRl9MVU5fU0hBUklOR19WSU9MQVRJT046CiAJCWlmIChoZWFkZXItPmZzZl9zdGF0dXNfcXVhbC53b3JkWzBdKQpAQCAtMjAzNiw4ICsyMDI0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUE9SVF9CT1hFRDoKIAkJemZjcF9lcnBfcG9ydF9ib3hlZCh1bml0LT5wb3J0LCAiZnNjdWhfMyIsIHJlcSk7Ci0JCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUiB8Ci0JCQkgICAgICAgWkZDUF9TVEFUVVNfRlNGUkVRX1JFVFJZOworCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCWJyZWFrOwogCWNhc2UgRlNGX0FEQVBURVJfU1RBVFVTX0FWQUlMQUJMRToKIAkJc3dpdGNoIChyZXEtPnF0Y2ItPmhlYWRlci5mc2Zfc3RhdHVzX3F1YWwud29yZFswXSkgewpAQCAtMjEwOSw3MiArMjA5Niw1NyBAQAogCWxhdF9yZWMtPm1heCA9IG1heChsYXRfcmVjLT5tYXgsIGxhdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfZnNmX3JlcV9sYXRlbmN5KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKK3N0YXRpYyB2b2lkIHpmY3BfZnNmX3JlcV90cmFjZShzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEsIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2kpCiB7Ci0Jc3RydWN0IGZzZl9xdWFsX2xhdGVuY3lfaW5mbyAqbGF0X2luZjsKLQlzdHJ1Y3QgbGF0ZW5jeV9jb250ICpsYXQ7CisJc3RydWN0IGZzZl9xdWFsX2xhdGVuY3lfaW5mbyAqbGF0X2luOworCXN0cnVjdCBsYXRlbmN5X2NvbnQgKmxhdCA9IE5VTEw7CiAJc3RydWN0IHpmY3BfdW5pdCAqdW5pdCA9IHJlcS0+dW5pdDsKKwlzdHJ1Y3QgemZjcF9ibGtfZHJ2X2RhdGEgYmxrdHJjOworCWludCB0aWNrcyA9IHJlcS0+YWRhcHRlci0+dGltZXJfdGlja3M7CiAKLQlsYXRfaW5mID0gJnJlcS0+cXRjYi0+cHJlZml4LnByb3Rfc3RhdHVzX3F1YWwubGF0ZW5jeV9pbmZvOworCWxhdF9pbiA9ICZyZXEtPnF0Y2ItPnByZWZpeC5wcm90X3N0YXR1c19xdWFsLmxhdGVuY3lfaW5mbzsKIAotCXN3aXRjaCAocmVxLT5xdGNiLT5ib3R0b20uaW8uZGF0YV9kaXJlY3Rpb24pIHsKLQljYXNlIEZTRl9EQVRBRElSX1JFQUQ6Ci0JCWxhdCA9ICZ1bml0LT5sYXRlbmNpZXMucmVhZDsKLQkJYnJlYWs7Ci0JY2FzZSBGU0ZfREFUQURJUl9XUklURToKLQkJbGF0ID0gJnVuaXQtPmxhdGVuY2llcy53cml0ZTsKLQkJYnJlYWs7Ci0JY2FzZSBGU0ZfREFUQURJUl9DTU5EOgotCQlsYXQgPSAmdW5pdC0+bGF0ZW5jaWVzLmNtZDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOworCWJsa3RyYy5mbGFncyA9IDA7CisJYmxrdHJjLm1hZ2ljID0gWkZDUF9CTEtfRFJWX0RBVEFfTUFHSUM7CisJaWYgKHJlcS0+c3RhdHVzICYgWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SKQorCQlibGt0cmMuZmxhZ3MgfD0gWkZDUF9CTEtfUkVRX0VSUk9SOworCWJsa3RyYy5pbmJfdXNhZ2UgPSByZXEtPnF1ZXVlX3JlcS5xZGlvX2luYl91c2FnZTsKKwlibGt0cmMub3V0Yl91c2FnZSA9IHJlcS0+cXVldWVfcmVxLnFkaW9fb3V0Yl91c2FnZTsKKworCWlmIChyZXEtPmFkYXB0ZXItPmFkYXB0ZXJfZmVhdHVyZXMgJiBGU0ZfRkVBVFVSRV9NRUFTVVJFTUVOVF9EQVRBKSB7CisJCWJsa3RyYy5mbGFncyB8PSBaRkNQX0JMS19MQVRfVkFMSUQ7CisJCWJsa3RyYy5jaGFubmVsX2xhdCA9IGxhdF9pbi0+Y2hhbm5lbF9sYXQgKiB0aWNrczsKKwkJYmxrdHJjLmZhYnJpY19sYXQgPSBsYXRfaW4tPmZhYnJpY19sYXQgKiB0aWNrczsKKworCQlzd2l0Y2ggKHJlcS0+cXRjYi0+Ym90dG9tLmlvLmRhdGFfZGlyZWN0aW9uKSB7CisJCWNhc2UgRlNGX0RBVEFESVJfUkVBRDoKKwkJCWxhdCA9ICZ1bml0LT5sYXRlbmNpZXMucmVhZDsKKwkJCWJyZWFrOworCQljYXNlIEZTRl9EQVRBRElSX1dSSVRFOgorCQkJbGF0ID0gJnVuaXQtPmxhdGVuY2llcy53cml0ZTsKKwkJCWJyZWFrOworCQljYXNlIEZTRl9EQVRBRElSX0NNTkQ6CisJCQlsYXQgPSAmdW5pdC0+bGF0ZW5jaWVzLmNtZDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxhdCkgeworCQkJc3Bpbl9sb2NrKCZ1bml0LT5sYXRlbmNpZXMubG9jayk7CisJCQl6ZmNwX2ZzZl91cGRhdGVfbGF0KCZsYXQtPmNoYW5uZWwsIGxhdF9pbi0+Y2hhbm5lbF9sYXQpOworCQkJemZjcF9mc2ZfdXBkYXRlX2xhdCgmbGF0LT5mYWJyaWMsIGxhdF9pbi0+ZmFicmljX2xhdCk7CisJCQlsYXQtPmNvdW50ZXIrKzsKKwkJCXNwaW5fdW5sb2NrKCZ1bml0LT5sYXRlbmNpZXMubG9jayk7CisJCX0KIAl9CiAKLQlzcGluX2xvY2soJnVuaXQtPmxhdGVuY2llcy5sb2NrKTsKLQl6ZmNwX2ZzZl91cGRhdGVfbGF0KCZsYXQtPmNoYW5uZWwsIGxhdF9pbmYtPmNoYW5uZWxfbGF0KTsKLQl6ZmNwX2ZzZl91cGRhdGVfbGF0KCZsYXQtPmZhYnJpYywgbGF0X2luZi0+ZmFicmljX2xhdCk7Ci0JbGF0LT5jb3VudGVyKys7Ci0Jc3Bpbl91bmxvY2soJnVuaXQtPmxhdGVuY2llcy5sb2NrKTsKKwlibGtfYWRkX2RyaXZlcl9kYXRhKHNjc2ktPnJlcXVlc3QtPnEsIHNjc2ktPnJlcXVlc3QsICZibGt0cmMsCisJCQkgICAgc2l6ZW9mKGJsa3RyYykpOwogfQogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UKLXN0YXRpYyB2b2lkIHpmY3BfZnNmX3RyYWNlX2xhdGVuY3koc3RydWN0IHpmY3BfZnNmX3JlcSAqZnNmX3JlcSkKLXsKLQlzdHJ1Y3QgZnNmX3F1YWxfbGF0ZW5jeV9pbmZvICpsYXRfaW5mOwotCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopZnNmX3JlcS0+ZGF0YTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gc2NzaV9jbW5kLT5yZXF1ZXN0OwotCXN0cnVjdCB6ZmNwX2Jsa19kcnZfZGF0YSB0cmFjZTsKLQlpbnQgdGlja3MgPSBmc2ZfcmVxLT5hZGFwdGVyLT50aW1lcl90aWNrczsKLQotCXRyYWNlLmZsYWdzID0gMDsKLQl0cmFjZS5tYWdpYyA9IFpGQ1BfQkxLX0RSVl9EQVRBX01BR0lDOwotCWlmIChmc2ZfcmVxLT5hZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfTUVBU1VSRU1FTlRfREFUQSkgewotCQl0cmFjZS5mbGFncyB8PSBaRkNQX0JMS19MQVRfVkFMSUQ7Ci0JCWxhdF9pbmYgPSAmZnNmX3JlcS0+cXRjYi0+cHJlZml4LnByb3Rfc3RhdHVzX3F1YWwubGF0ZW5jeV9pbmZvOwotCQl0cmFjZS5jaGFubmVsX2xhdCA9IGxhdF9pbmYtPmNoYW5uZWxfbGF0ICogdGlja3M7Ci0JCXRyYWNlLmZhYnJpY19sYXQgPSBsYXRfaW5mLT5mYWJyaWNfbGF0ICogdGlja3M7Ci0JfQotCWlmIChmc2ZfcmVxLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1IpCi0JCXRyYWNlLmZsYWdzIHw9IFpGQ1BfQkxLX1JFUV9FUlJPUjsKLQl0cmFjZS5pbmJfdXNhZ2UgPSBmc2ZfcmVxLT5xdWV1ZV9yZXEucWRpb19pbmJfdXNhZ2U7Ci0JdHJhY2Uub3V0Yl91c2FnZSA9IGZzZl9yZXEtPnF1ZXVlX3JlcS5xZGlvX291dGJfdXNhZ2U7Ci0KLQlibGtfYWRkX2RyaXZlcl9kYXRhKHJlcS0+cSwgcmVxLCAmdHJhY2UsIHNpemVvZih0cmFjZSkpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCB6ZmNwX2ZzZl90cmFjZV9sYXRlbmN5KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXEpCi17Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgemZjcF9mc2Zfc2VuZF9mY3BfY29tbWFuZF90YXNrX2hhbmRsZXIoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKnNjcG50OwotCXN0cnVjdCBmY3BfcnNwX2l1ICpmY3BfcnNwX2l1ID0gKHN0cnVjdCBmY3BfcnNwX2l1ICopCi0JICAgICYocmVxLT5xdGNiLT5ib3R0b20uaW8uZmNwX3JzcCk7Ci0JdTMyIHNuc19sZW47Ci0JY2hhciAqZmNwX3JzcF9pbmZvID0gKHVuc2lnbmVkIGNoYXIgKikgJmZjcF9yc3BfaXVbMV07CisJc3RydWN0IGZjcF9yZXNwX3dpdGhfZXh0ICpmY3BfcnNwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlyZWFkX2xvY2tfaXJxc2F2ZSgmcmVxLT5hZGFwdGVyLT5hYm9ydF9sb2NrLCBmbGFncyk7CkBAIC0yMTg1LDUwICsyMTU3LDE2IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAodW5saWtlbHkocmVxLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19GU0ZSRVFfQUJPUlRFRCkpIHsKLQkJc2V0X2hvc3RfYnl0ZShzY3BudCwgRElEX1NPRlRfRVJST1IpOwotCQlnb3RvIHNraXBfZnNmc3RhdHVzOwotCX0KLQogCWlmICh1bmxpa2VseShyZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUikpIHsKLQkJc2V0X2hvc3RfYnl0ZShzY3BudCwgRElEX0VSUk9SKTsKKwkJc2V0X2hvc3RfYnl0ZShzY3BudCwgRElEX1RSQU5TUE9SVF9ESVNSVVBURUQpOwogCQlnb3RvIHNraXBfZnNmc3RhdHVzOwogCX0KIAotCXNldF9tc2dfYnl0ZShzY3BudCwgQ09NTUFORF9DT01QTEVURSk7CisJZmNwX3JzcCA9IChzdHJ1Y3QgZmNwX3Jlc3Bfd2l0aF9leHQgKikgJnJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9yc3A7CisJemZjcF9mY19ldmFsX2ZjcF9yc3AoZmNwX3JzcCwgc2NwbnQpOwogCi0Jc2NwbnQtPnJlc3VsdCB8PSBmY3BfcnNwX2l1LT5zY3NpX3N0YXR1czsKKwl6ZmNwX2ZzZl9yZXFfdHJhY2UocmVxLCBzY3BudCk7CiAKLQlpZiAocmVxLT5hZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfTUVBU1VSRU1FTlRfREFUQSkKLQkJemZjcF9mc2ZfcmVxX2xhdGVuY3kocmVxKTsKLQotCXpmY3BfZnNmX3RyYWNlX2xhdGVuY3kocmVxKTsKLQotCWlmICh1bmxpa2VseShmY3BfcnNwX2l1LT52YWxpZGl0eS5iaXRzLmZjcF9yc3BfbGVuX3ZhbGlkKSkgewotCQlpZiAoZmNwX3JzcF9pbmZvWzNdID09IFJTUF9DT0RFX0dPT0QpCi0JCQlzZXRfaG9zdF9ieXRlKHNjcG50LCBESURfT0spOwotCQllbHNlIHsKLQkJCXNldF9ob3N0X2J5dGUoc2NwbnQsIERJRF9FUlJPUik7Ci0JCQlnb3RvIHNraXBfZnNmc3RhdHVzOwotCQl9Ci0JfQotCi0JaWYgKHVubGlrZWx5KGZjcF9yc3BfaXUtPnZhbGlkaXR5LmJpdHMuZmNwX3Nuc19sZW5fdmFsaWQpKSB7Ci0JCXNuc19sZW4gPSBGU0ZfRkNQX1JTUF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBmY3BfcnNwX2l1KSArCi0JCQkgIGZjcF9yc3BfaXUtPmZjcF9yc3BfbGVuOwotCQlzbnNfbGVuID0gbWluKHNuc19sZW4sICh1MzIpIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7Ci0JCXNuc19sZW4gPSBtaW4oc25zX2xlbiwgZmNwX3JzcF9pdS0+ZmNwX3Nuc19sZW4pOwotCi0JCW1lbWNweShzY3BudC0+c2Vuc2VfYnVmZmVyLAotCQkgICAgICAgemZjcF9nZXRfZmNwX3Nuc19pbmZvX3B0cihmY3BfcnNwX2l1KSwgc25zX2xlbik7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGZjcF9yc3BfaXUtPnZhbGlkaXR5LmJpdHMuZmNwX3Jlc2lkX3VuZGVyKSkgewotCQlzY3NpX3NldF9yZXNpZChzY3BudCwgZmNwX3JzcF9pdS0+ZmNwX3Jlc2lkKTsKLQkJaWYgKHNjc2lfYnVmZmxlbihzY3BudCkgLSBzY3NpX2dldF9yZXNpZChzY3BudCkgPAotCQkgICAgc2NwbnQtPnVuZGVyZmxvdykKLQkJCXNldF9ob3N0X2J5dGUoc2NwbnQsIERJRF9FUlJPUik7Ci0JfQogc2tpcF9mc2ZzdGF0dXM6CiAJaWYgKHNjcG50LT5yZXN1bHQgIT0gMCkKIAkJemZjcF9kYmZfc2NzaV9yZXN1bHQoImVycm8iLCAzLCByZXEtPmFkYXB0ZXItPmRiZiwgc2NwbnQsIHJlcSk7CkBAIC0yMjUwLDExICsyMTg4LDEzIEBACiAKIHN0YXRpYyB2b2lkIHpmY3BfZnNmX3NlbmRfZmNwX2N0bV9oYW5kbGVyKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKIHsKLQlzdHJ1Y3QgZmNwX3JzcF9pdSAqZmNwX3JzcF9pdSA9IChzdHJ1Y3QgZmNwX3JzcF9pdSAqKQotCSAgICAmKHJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9yc3ApOwotCWNoYXIgKmZjcF9yc3BfaW5mbyA9ICh1bnNpZ25lZCBjaGFyICopICZmY3BfcnNwX2l1WzFdOworCXN0cnVjdCBmY3BfcmVzcF93aXRoX2V4dCAqZmNwX3JzcDsKKwlzdHJ1Y3QgZmNwX3Jlc3BfcnNwX2luZm8gKnJzcF9pbmZvOwogCi0JaWYgKChmY3BfcnNwX2luZm9bM10gIT0gUlNQX0NPREVfR09PRCkgfHwKKwlmY3BfcnNwID0gKHN0cnVjdCBmY3BfcmVzcF93aXRoX2V4dCAqKSAmcmVxLT5xdGNiLT5ib3R0b20uaW8uZmNwX3JzcDsKKwlyc3BfaW5mbyA9IChzdHJ1Y3QgZmNwX3Jlc3BfcnNwX2luZm8gKikgJmZjcF9yc3BbMV07CisKKwlpZiAoKHJzcF9pbmZvLT5yc3BfY29kZSAhPSBGQ1BfVE1GX0NNUEwpIHx8CiAJICAgICAocmVxLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1IpKQogCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfVE1GVU5DRkFJTEVEOwogfQpAQCAtMjMxNCwxMyArMjI1NCwxMSBAQAogCQlicmVhazsKIAljYXNlIEZTRl9QT1JUX0JPWEVEOgogCQl6ZmNwX2VycF9wb3J0X2JveGVkKHVuaXQtPnBvcnQsICJmc3NmY2g1IiwgcmVxKTsKLQkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SIHwKLQkJCSAgICAgICBaRkNQX1NUQVRVU19GU0ZSRVFfUkVUUlk7CisJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfTFVOX0JPWEVEOgogCQl6ZmNwX2VycF91bml0X2JveGVkKHVuaXQsICJmc3NmY2g2IiwgcmVxKTsKLQkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SIHwKLQkJCSAgICAgICBaRkNQX1NUQVRVU19GU0ZSRVFfUkVUUlk7CisJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfQURBUFRFUl9TVEFUVVNfQVZBSUxBQkxFOgogCQlpZiAoaGVhZGVyLT5mc2Zfc3RhdHVzX3F1YWwud29yZFswXSA9PQpAQCAtMjMzNSwyNCArMjI3MywxMCBAQAogCWVsc2UgewogCQl6ZmNwX2ZzZl9zZW5kX2ZjcF9jb21tYW5kX3Rhc2tfaGFuZGxlcihyZXEpOwogCQlyZXEtPnVuaXQgPSBOVUxMOwotCQl6ZmNwX3VuaXRfcHV0KHVuaXQpOworCQlwdXRfZGV2aWNlKCZ1bml0LT5zeXNmc19kZXZpY2UpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgemZjcF9zZXRfZmNwX2RsKHN0cnVjdCBmY3BfY21uZF9pdSAqZmNwX2NtZCwgdTMyIGZjcF9kbCkKLXsKLQl1MzIgKmZjcF9kbF9wdHI7Ci0KLQkvKgotCSAqIGZjcF9kbF9hZGRyID0gc3RhcnQgYWRkcmVzcyBvZiBmY3BfY21uZCBzdHJ1Y3R1cmUgKwotCSAqIHNpemUgb2YgZml4ZWQgcGFydCArIHNpemUgb2YgZHluYW1pY2FsbHkgc2l6ZWQgYWRkX2RjcF9jZGIgZmllbGQKLQkgKiBTRUUgRkNQLTIgZG9jdW1lbnRhdGlvbgotCSAqLwotCWZjcF9kbF9wdHIgPSAodTMyICopICgodW5zaWduZWQgY2hhciAqKSAmZmNwX2NtZFsxXSArCi0JCQkoZmNwX2NtZC0+YWRkX2ZjcF9jZGJfbGVuZ3RoIDw8IDIpKTsKLQkqZmNwX2RsX3B0ciA9IGZjcF9kbDsKLX0KLQogLyoqCiAgKiB6ZmNwX2ZzZl9zZW5kX2ZjcF9jb21tYW5kX3Rhc2sgLSBpbml0aWF0ZSBhbiBGQ1AgY29tbWFuZCAoZm9yIGEgU0NTSSBjb21tYW5kKQogICogQHVuaXQ6IHVuaXQgd2hlcmUgY29tbWFuZCBpcyBzZW50IHRvCkBAIC0yMzYyLDcgKzIyODYsNyBAQAogCQkJCSAgIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21uZCkKIHsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7Ci0Jc3RydWN0IGZjcF9jbW5kX2l1ICpmY3BfY21uZF9pdTsKKwlzdHJ1Y3QgZmNwX2NtbmQgKmZjcF9jbW5kOwogCXVuc2lnbmVkIGludCBzYnR5cGUgPSBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQ7CiAJaW50IHJlYWxfYnl0ZXMsIHJldHZhbCA9IC1FSU87CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHVuaXQtPnBvcnQtPmFkYXB0ZXI7CkBAIC0yMzg3LDIzICsyMzExLDIxIEBACiAJfQogCiAJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0NMRUFOVVA7Ci0JemZjcF91bml0X2dldCh1bml0KTsKKwlnZXRfZGV2aWNlKCZ1bml0LT5zeXNmc19kZXZpY2UpOwogCXJlcS0+dW5pdCA9IHVuaXQ7CiAJcmVxLT5kYXRhID0gc2NzaV9jbW5kOwogCXJlcS0+aGFuZGxlciA9IHpmY3BfZnNmX3NlbmRfZmNwX2NvbW1hbmRfaGFuZGxlcjsKIAlyZXEtPnF0Y2ItPmhlYWRlci5sdW5faGFuZGxlID0gdW5pdC0+aGFuZGxlOwogCXJlcS0+cXRjYi0+aGVhZGVyLnBvcnRfaGFuZGxlID0gdW5pdC0+cG9ydC0+aGFuZGxlOwogCXJlcS0+cXRjYi0+Ym90dG9tLmlvLnNlcnZpY2VfY2xhc3MgPSBGU0ZfQ0xBU1NfMzsKKwlyZXEtPnF0Y2ItPmJvdHRvbS5pby5mY3BfY21uZF9sZW5ndGggPSBGQ1BfQ01ORF9MRU47CiAKIAlzY3NpX2NtbmQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSByZXEtPnJlcV9pZDsKIAotCWZjcF9jbW5kX2l1ID0gKHN0cnVjdCBmY3BfY21uZF9pdSAqKSAmKHJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9jbW5kKTsKLQlmY3BfY21uZF9pdS0+ZmNwX2x1biA9IHVuaXQtPmZjcF9sdW47CiAJLyoKIAkgKiBzZXQgZGVwZW5kaW5nIG9uIGRhdGEgZGlyZWN0aW9uOgogCSAqICAgICAgZGF0YSBkaXJlY3Rpb24gYml0cyBpbiBTQkFMRSAoU0IgVHlwZSkKIAkgKiAgICAgIGRhdGEgZGlyZWN0aW9uIGJpdHMgaW4gUVRDQgotCSAqICAgICAgZGF0YSBkaXJlY3Rpb24gYml0cyBpbiBGQ1BfQ01ORCBJVQogCSAqLwogCXN3aXRjaCAoc2NzaV9jbW5kLT5zY19kYXRhX2RpcmVjdGlvbikgewogCWNhc2UgRE1BX05PTkU6CkBAIC0yNDExLDMyICsyMzMzLDE3IEBACiAJCWJyZWFrOwogCWNhc2UgRE1BX0ZST01fREVWSUNFOgogCQlyZXEtPnF0Y2ItPmJvdHRvbS5pby5kYXRhX2RpcmVjdGlvbiA9IEZTRl9EQVRBRElSX1JFQUQ7Ci0JCWZjcF9jbW5kX2l1LT5yZGRhdGEgPSAxOwogCQlicmVhazsKIAljYXNlIERNQV9UT19ERVZJQ0U6CiAJCXJlcS0+cXRjYi0+Ym90dG9tLmlvLmRhdGFfZGlyZWN0aW9uID0gRlNGX0RBVEFESVJfV1JJVEU7CiAJCXNidHlwZSA9IFNCQUxfRkxBR1MwX1RZUEVfV1JJVEU7Ci0JCWZjcF9jbW5kX2l1LT53ZGRhdGEgPSAxOwogCQlicmVhazsKIAljYXNlIERNQV9CSURJUkVDVElPTkFMOgogCQlnb3RvIGZhaWxlZF9zY3NpX2NtbmQ7CiAJfQogCi0JaWYgKGxpa2VseSgoc2NzaV9jbW5kLT5kZXZpY2UtPnNpbXBsZV90YWdzKSB8fAotCQkgICAoKGF0b21pY19yZWFkKCZ1bml0LT5zdGF0dXMpICYgWkZDUF9TVEFUVVNfVU5JVF9SRUFET05MWSkgJiYKLQkJICAgIChhdG9taWNfcmVhZCgmdW5pdC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX1VOSVRfU0hBUkVEKSkpKQotCQlmY3BfY21uZF9pdS0+dGFza19hdHRyaWJ1dGUgPSBTSU1QTEVfUTsKLQllbHNlCi0JCWZjcF9jbW5kX2l1LT50YXNrX2F0dHJpYnV0ZSA9IFVOVEFHR0VEOwotCi0JaWYgKHVubGlrZWx5KHNjc2lfY21uZC0+Y21kX2xlbiA+IEZDUF9DREJfTEVOR1RIKSkKLQkJZmNwX2NtbmRfaXUtPmFkZF9mY3BfY2RiX2xlbmd0aCA9Ci0JCQkoc2NzaV9jbW5kLT5jbWRfbGVuIC0gRkNQX0NEQl9MRU5HVEgpID4+IDI7Ci0KLQltZW1jcHkoZmNwX2NtbmRfaXUtPmZjcF9jZGIsIHNjc2lfY21uZC0+Y21uZCwgc2NzaV9jbW5kLT5jbWRfbGVuKTsKLQotCXJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9jbW5kX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgZmNwX2NtbmRfaXUpICsKLQkJZmNwX2NtbmRfaXUtPmFkZF9mY3BfY2RiX2xlbmd0aCArIHNpemVvZih1MzIpOworCWZjcF9jbW5kID0gKHN0cnVjdCBmY3BfY21uZCAqKSAmcmVxLT5xdGNiLT5ib3R0b20uaW8uZmNwX2NtbmQ7CisJemZjcF9mY19zY3NpX3RvX2ZjcChmY3BfY21uZCwgc2NzaV9jbW5kKTsKIAogCXJlYWxfYnl0ZXMgPSB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhxZGlvLCAmcmVxLT5xdWV1ZV9yZXEsIHNidHlwZSwKIAkJCQkJICAgICBzY3NpX3NnbGlzdChzY3NpX2NtbmQpLApAQCAtMjQ1NCw4ICsyMzYxLDYgQEAKIAkJZ290byBmYWlsZWRfc2NzaV9jbW5kOwogCX0KIAotCXpmY3Bfc2V0X2ZjcF9kbChmY3BfY21uZF9pdSwgcmVhbF9ieXRlcyk7Ci0KIAlyZXR2YWwgPSB6ZmNwX2ZzZl9yZXFfc2VuZChyZXEpOwogCWlmICh1bmxpa2VseShyZXR2YWwpKQogCQlnb3RvIGZhaWxlZF9zY3NpX2NtbmQ7CkBAIC0yNDYzLDcgKzIzNjgsNyBAQAogCWdvdG8gb3V0OwogCiBmYWlsZWRfc2NzaV9jbW5kOgotCXpmY3BfdW5pdF9wdXQodW5pdCk7CisJcHV0X2RldmljZSgmdW5pdC0+c3lzZnNfZGV2aWNlKTsKIAl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOwogCXNjc2lfY21uZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CiBvdXQ6CkBAIC0yNDgxLDcgKzIzODYsNyBAQAogewogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEgPSBOVUxMOwotCXN0cnVjdCBmY3BfY21uZF9pdSAqZmNwX2NtbmRfaXU7CisJc3RydWN0IGZjcF9jbW5kICpmY3BfY21uZDsKIAlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gdW5pdC0+cG9ydC0+YWRhcHRlci0+cWRpbzsKIAogCWlmICh1bmxpa2VseSghKGF0b21pY19yZWFkKCZ1bml0LT5zdGF0dXMpICYKQEAgLTI1MDcsMTYgKzI0MTIsMTQgQEAKIAlyZXEtPnF0Y2ItPmhlYWRlci5wb3J0X2hhbmRsZSA9IHVuaXQtPnBvcnQtPmhhbmRsZTsKIAlyZXEtPnF0Y2ItPmJvdHRvbS5pby5kYXRhX2RpcmVjdGlvbiA9IEZTRl9EQVRBRElSX0NNTkQ7CiAJcmVxLT5xdGNiLT5ib3R0b20uaW8uc2VydmljZV9jbGFzcyA9IEZTRl9DTEFTU18zOwotCXJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9jbW5kX2xlbmd0aCA9IAlzaXplb2Yoc3RydWN0IGZjcF9jbW5kX2l1KSArCi0JCQkJCQlzaXplb2YodTMyKTsKKwlyZXEtPnF0Y2ItPmJvdHRvbS5pby5mY3BfY21uZF9sZW5ndGggPSBGQ1BfQ01ORF9MRU47CiAKIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9yZXEocWRpbywgJnJlcS0+cXVldWVfcmVxKTsKIAlzYmFsZVswXS5mbGFncyB8PSBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFOwogCXNiYWxlWzFdLmZsYWdzIHw9IFNCQUxfRkxBR1NfTEFTVF9FTlRSWTsKIAotCWZjcF9jbW5kX2l1ID0gKHN0cnVjdCBmY3BfY21uZF9pdSAqKSAmcmVxLT5xdGNiLT5ib3R0b20uaW8uZmNwX2NtbmQ7Ci0JZmNwX2NtbmRfaXUtPmZjcF9sdW4gPSB1bml0LT5mY3BfbHVuOwotCWZjcF9jbW5kX2l1LT50YXNrX21hbmFnZW1lbnRfZmxhZ3MgPSB0bV9mbGFnczsKKwlmY3BfY21uZCA9IChzdHJ1Y3QgZmNwX2NtbmQgKikgJnJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9jbW5kOworCXpmY3BfZmNfZmNwX3RtKGZjcF9jbW5kLCB1bml0LT5kZXZpY2UsIHRtX2ZsYWdzKTsKIAogCXpmY3BfZnNmX3N0YXJ0X3RpbWVyKHJlcSwgWkZDUF9TQ1NJX0VSX1RJTUVPVVQpOwogCWlmICghemZjcF9mc2ZfcmVxX3NlbmQocmVxKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oCmluZGV4IGRjYzdjMWQuLmIzZGU2ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAKICNkZWZpbmUgRlNGX1FUQ0JfQ1VSUkVOVF9WRVJTSU9OCQkweDAwMDAwMDAxCiAKQEAgLTIyOCw3ICsyMjksOCBAQAogCXUzMiBsZW5ndGg7CiAJdTMyIHJlczE7CiAJc3RydWN0IGZzZl9xdWV1ZV9kZXNpZ25hdG9yIHF1ZXVlX2Rlc2lnbmF0b3I7Ci0JdTMyIGRfaWQ7CisJdTggcmVzMjsKKwl1OCBkX2lkWzNdOwogCXUzMiBjbGFzczsKIAl1NjQgZmNwX2x1bjsKIAl1OCAgcmVzM1syNF07CkBAIC0zMDksMjIgKzMxMSw3IEBACiAJdTggIHJlczRbMTZdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBmc2ZfbnBvcnRfc2Vydl9wYXJhbSB7Ci0JdTggIGNvbW1vbl9zZXJ2X3BhcmFtWzE2XTsKLQl1NjQgd3dwbjsKLQl1NjQgd3dubjsKLQl1OCAgY2xhc3MxX3NlcnZfcGFyYW1bMTZdOwotCXU4ICBjbGFzczJfc2Vydl9wYXJhbVsxNl07Ci0JdTggIGNsYXNzM19zZXJ2X3BhcmFtWzE2XTsKLQl1OCAgY2xhc3M0X3NlcnZfcGFyYW1bMTZdOwotCXU4ICB2ZW5kb3JfdmVyc2lvbl9sZXZlbFsxNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQogI2RlZmluZSBGU0ZfUExPR0lfTUlOX0xFTgkxMTIKLXN0cnVjdCBmc2ZfcGxvZ2kgewotCXUzMiAgICBjb2RlOwotCXN0cnVjdCBmc2ZfbnBvcnRfc2Vydl9wYXJhbSBzZXJ2X3BhcmFtOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKICNkZWZpbmUgRlNGX0ZDUF9DTU5EX1NJWkUJMjg4CiAjZGVmaW5lIEZTRl9GQ1BfUlNQX1NJWkUJMTI4CkBAIC0zNDIsOCArMzI5LDggQEAKIAogc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9zdXBwb3J0IHsKIAl1MzIgb3BlcmF0aW9uX3N1YnR5cGU7Ci0JdTggIHJlczFbMTJdOwotCXUzMiBkX2lkOworCXU4ICByZXMxWzEzXTsKKwl1OCBkX2lkWzNdOwogCXUzMiBvcHRpb247CiAJdTY0IGZjcF9sdW47CiAJdTY0IHJlczI7CkBAIC0zNzIsMTggKzM1OSwxOCBAQAogCXUzMiBmY190b3BvbG9neTsKIAl1MzIgZmNfbGlua19zcGVlZDsKIAl1MzIgYWRhcHRlcl90eXBlOwotCXUzMiBwZWVyX2RfaWQ7CisJdTggcmVzMDsKKwl1OCBwZWVyX2RfaWRbM107CiAJdTggcmVzMVsyXTsKIAl1MTYgdGltZXJfaW50ZXJ2YWw7Ci0JdTggcmVzMls4XTsKLQl1MzIgc19pZDsKLQlzdHJ1Y3QgZnNmX25wb3J0X3NlcnZfcGFyYW0gbnBvcnRfc2Vydl9wYXJhbTsKLQl1OCByZXNlcnZlZF9ucG9ydF9zZXJ2X3BhcmFtWzE2XTsKKwl1OCByZXMyWzldOworCXU4IHNfaWRbM107CisJdTggbnBvcnRfc2Vydl9wYXJhbVsxMjhdOwogCXU4IHJlczNbOF07CiAJdTMyIGFkYXB0ZXJfcG9ydHM7CiAJdTMyIGhhcmR3YXJlX3ZlcnNpb247CiAJdTggc2VyaWFsX251bWJlclszMl07Ci0Jc3RydWN0IGZzZl9ucG9ydF9zZXJ2X3BhcmFtIHBsb2dpX3BheWxvYWQ7CisJdTggcGxvZ2lfcGF5bG9hZFsxMTJdOwogCXN0cnVjdCBmc2Zfc3RhdGlzdGljc19pbmZvIHN0YXRfaW5mbzsKIAl1OCByZXM0WzExMl07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKQEAgLTQ1MCw0ICs0MzcsMjIgQEAKIAl1NjQgZmFicmljX2xhdDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKioKKyAqIHN0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgLSB6ZmNwIGRhdGEgZm9yIGN0IG9yIGVscyByZXF1ZXN0CisgKiBAcmVxOiBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciByZXF1ZXN0CisgKiBAcmVzcDogc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgcmVzcG9uc2UKKyAqIEBoYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIChjYWxsZWQgZm9yIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0KQorICogQGhhbmRsZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gaGFuZGxlciBmdW5jdGlvbgorICogQHBvcnQ6IE9wdGlvbmFsIHBvaW50ZXIgdG8gcG9ydCBmb3IgemZjcCBpbnRlcm5hbCBFTFMgKG9ubHkgdGVzdCBsaW5rIEFESVNDKQorICogQHN0YXR1czogdXNlZCB0byBwYXNzIGVycm9yIHN0YXR1cyB0byBjYWxsaW5nIGZ1bmN0aW9uCisgKi8KK3N0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgeworCXN0cnVjdCBzY2F0dGVybGlzdCAqcmVxOworCXN0cnVjdCBzY2F0dGVybGlzdCAqcmVzcDsKKwl2b2lkICgqaGFuZGxlcikodm9pZCAqKTsKKwl2b2lkICpoYW5kbGVyX2RhdGE7CisJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKKwlpbnQgc3RhdHVzOworfTsKKwogI2VuZGlmCQkJCS8qIEZTRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCmluZGV4IDBlMWEzNDYuLjc3MWNjNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCkBAIC05LDI5ICs5LDMzIEBACiAjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJ6ZmNwIgogI2RlZmluZSBwcl9mbXQoZm10KSBLTVNHX0NPTVBPTkVOVCAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZjcC5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlICJ6ZmNwX2V4dC5oIgogI2luY2x1ZGUgInpmY3BfZGJmLmgiCisjaW5jbHVkZSAiemZjcF9mYy5oIgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfZGVwdGggPSAzMjsKIG1vZHVsZV9wYXJhbV9uYW1lZChxdWV1ZV9kZXB0aCwgZGVmYXVsdF9kZXB0aCwgdWludCwgMDYwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHF1ZXVlX2RlcHRoLCAiRGVmYXVsdCBxdWV1ZSBkZXB0aCBmb3IgbmV3IFNDU0kgZGV2aWNlcyIpOwogCi0vKiBGaW5kIHN0YXJ0IG9mIFNlbnNlIEluZm9ybWF0aW9uIGluIEZDUCByZXNwb25zZSB1bml0Ki8KLWNoYXIgKnpmY3BfZ2V0X2ZjcF9zbnNfaW5mb19wdHIoc3RydWN0IGZjcF9yc3BfaXUgKmZjcF9yc3BfaXUpCitzdGF0aWMgaW50IHpmY3Bfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgZGVwdGgsCisJCQkJCWludCByZWFzb24pCiB7Ci0JY2hhciAqZmNwX3Nuc19pbmZvX3B0cjsKLQotCWZjcF9zbnNfaW5mb19wdHIgPSAodW5zaWduZWQgY2hhciAqKSAmZmNwX3JzcF9pdVsxXTsKLQlpZiAoZmNwX3JzcF9pdS0+dmFsaWRpdHkuYml0cy5mY3BfcnNwX2xlbl92YWxpZCkKLQkJZmNwX3Nuc19pbmZvX3B0ciArPSBmY3BfcnNwX2l1LT5mY3BfcnNwX2xlbjsKLQotCXJldHVybiBmY3Bfc25zX2luZm9fcHRyOwotfQotCi1zdGF0aWMgaW50IHpmY3Bfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgZGVwdGgpCi17Ci0Jc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIGRlcHRoKTsKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgU0NTSV9RREVQVEhfREVGQVVMVDoKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIGRlcHRoKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX1FERVBUSF9RRlVMTDoKKwkJc2NzaV90cmFja19xdWV1ZV9mdWxsKHNkZXYsIGRlcHRoKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX1FERVBUSF9SQU1QX1VQOgorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgZGVwdGgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKIH0KIApAQCAtMzksNyArNDMsNyBAQAogewogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQgPSAoc3RydWN0IHpmY3BfdW5pdCAqKSBzZHBudC0+aG9zdGRhdGE7CiAJdW5pdC0+ZGV2aWNlID0gTlVMTDsKLQl6ZmNwX3VuaXRfcHV0KHVuaXQpOworCXB1dF9kZXZpY2UoJnVuaXQtPnN5c2ZzX2RldmljZSk7CiB9CiAKIHN0YXRpYyBpbnQgemZjcF9zY3NpX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCkKQEAgLTk5LDEyICsxMDMsMjYgQEAKIAl9CiAKIAlzdGF0dXMgPSBhdG9taWNfcmVhZCgmdW5pdC0+c3RhdHVzKTsKLQlpZiAodW5saWtlbHkoKHN0YXR1cyAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfRkFJTEVEKSB8fAotCQkgICAgICEoc3RhdHVzICYgWkZDUF9TVEFUVVNfQ09NTU9OX1JVTk5JTkcpKSkgeworCWlmICh1bmxpa2VseShzdGF0dXMgJiBaRkNQX1NUQVRVU19DT01NT05fRVJQX0ZBSUxFRCkgJiYKKwkJICAgICAhKGF0b21pY19yZWFkKCZ1bml0LT5wb3J0LT5zdGF0dXMpICYKKwkJICAgICAgIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfRkFJTEVEKSkgeworCQkvKiBvbmx5IHVuaXQgYWNjZXNzIGRlbmllZCwgYnV0IHBvcnQgaXMgZ29vZAorCQkgKiBub3QgY292ZXJlZCBieSBGQyB0cmFuc3BvcnQsIGhhdmUgdG8gZmFpbCBoZXJlICovCiAJCXpmY3Bfc2NzaV9jb21tYW5kX2ZhaWwoc2NwbnQsIERJRF9FUlJPUik7CiAJCXJldHVybiAwOwogCX0KIAorCWlmICh1bmxpa2VseSghKHN0YXR1cyAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9VTkJMT0NLRUQpKSkgeworCQkvKiBUaGlzIGNvdWxkIGJlIGVpdGhlcgorCQkgKiBvcGVuIHVuaXQgcGVuZGluZzogdGhpcyBpcyB0ZW1wb3JhcnksIHdpbGwgcmVzdWx0IGluCisJCSAqIAlvcGVuIHVuaXQgb3IgRVJQX0ZBSUxFRCwgc28gcmV0cnkgY29tbWFuZAorCQkgKiBjYWxsIHRvIHJwb3J0X2RlbGV0ZSBwZW5kaW5nOiBtaW1pYyByZXRyeSBmcm9tCisJCSAqIAlmY19yZW1vdGVfcG9ydF9jaGtyZWFkeSB1bnRpbCBycG9ydCBpcyBCTE9DS0VECisJCSAqLworCQl6ZmNwX3Njc2lfY29tbWFuZF9mYWlsKHNjcG50LCBESURfSU1NX1JFVFJZKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJcmV0ID0gemZjcF9mc2Zfc2VuZF9mY3BfY29tbWFuZF90YXNrKHVuaXQsIHNjcG50KTsKIAlpZiAodW5saWtlbHkocmV0ID09IC1FQlVTWSkpCiAJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CkBAIC0xMTUsNDkgKzEzMyw0NCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHpmY3BfdW5pdCAqemZjcF91bml0X2xvb2t1cChzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLAotCQkJCQkgIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgaWQsCi0JCQkJCSAgdW5zaWduZWQgaW50IGx1bikKKwkJCQkJICB1bnNpZ25lZCBpbnQgaWQsIHU2NCBsdW4pCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwotCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7Ci0JaW50IHNjc2lfbHVuOworCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQgPSBOVUxMOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpIHsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFwb3J0LT5ycG9ydCB8fCAoaWQgIT0gcG9ydC0+cnBvcnQtPnNjc2lfdGFyZ2V0X2lkKSkKIAkJCWNvbnRpbnVlOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVuaXQsICZwb3J0LT51bml0X2xpc3RfaGVhZCwgbGlzdCkgewotCQkJc2NzaV9sdW4gPSBzY3NpbHVuX3RvX2ludCgKLQkJCQkoc3RydWN0IHNjc2lfbHVuICopJnVuaXQtPmZjcF9sdW4pOwotCQkJaWYgKGx1biA9PSBzY3NpX2x1bikKLQkJCQlyZXR1cm4gdW5pdDsKLQkJfQorCQl1bml0ID0gemZjcF9nZXRfdW5pdF9ieV9sdW4ocG9ydCwgbHVuKTsKKwkJaWYgKHVuaXQpCisJCQlicmVhazsKIAl9CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKIAotCXJldHVybiBOVUxMOworCXJldHVybiB1bml0OwogfQogCiBzdGF0aWMgaW50IHpmY3Bfc2NzaV9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCkKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyOwogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0dmFsID0gLUVOWElPOworCXU2NCBsdW47CiAKIAlhZGFwdGVyID0gKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKikgc2RwLT5ob3N0LT5ob3N0ZGF0YVswXTsKIAlpZiAoIWFkYXB0ZXIpCiAJCWdvdG8gb3V0OwogCi0JcmVhZF9sb2NrX2lycXNhdmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwotCXVuaXQgPSB6ZmNwX3VuaXRfbG9va3VwKGFkYXB0ZXIsIHNkcC0+Y2hhbm5lbCwgc2RwLT5pZCwgc2RwLT5sdW4pOworCWludF90b19zY3NpbHVuKHNkcC0+bHVuLCAoc3RydWN0IHNjc2lfbHVuICopJmx1bik7CisJdW5pdCA9IHpmY3BfdW5pdF9sb29rdXAoYWRhcHRlciwgc2RwLT5pZCwgbHVuKTsKIAlpZiAodW5pdCkgewogCQlzZHAtPmhvc3RkYXRhID0gdW5pdDsKIAkJdW5pdC0+ZGV2aWNlID0gc2RwOwotCQl6ZmNwX3VuaXRfZ2V0KHVuaXQpOwotCQlyZXR2YWwgPSAwOworCQlyZXR1cm4gMDsKIAl9Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CiBvdXQ6Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gLUVOWElPOwogfQogCiBzdGF0aWMgaW50IHpmY3Bfc2NzaV9laF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjcG50KQpAQCAtMTk2LDYgKzIwOSw3IEBACiAJCQlicmVhazsKIAogCQl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOworCQlmY19ibG9ja19zY3NpX2VoKHNjcG50KTsKIAkJaWYgKCEoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJgogCQkgICAgICBaRkNQX1NUQVRVU19DT01NT05fUlVOTklORykpIHsKIAkJCXpmY3BfZGJmX3Njc2lfYWJvcnQoIm5yZXMiLCBhZGFwdGVyLT5kYmYsIHNjcG50LCBOVUxMLApAQCAtMjM1LDYgKzI0OSw3IEBACiAJCQlicmVhazsKIAogCQl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOworCQlmY19ibG9ja19zY3NpX2VoKHNjcG50KTsKIAkJaWYgKCEoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJgogCQkgICAgICBaRkNQX1NUQVRVU19DT01NT05fUlVOTklORykpIHsKIAkJCXpmY3BfZGJmX3Njc2lfZGV2cmVzZXQoIm5yZXMiLCB0bV9mbGFncywgdW5pdCwgc2NwbnQpOwpAQCAtMjQ5LDkgKzI2NCw2IEBACiAJaWYgKGZzZl9yZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9UTUZVTkNGQUlMRUQpIHsKIAkJemZjcF9kYmZfc2NzaV9kZXZyZXNldCgiZmFpbCIsIHRtX2ZsYWdzLCB1bml0LCBzY3BudCk7CiAJCXJldHZhbCA9IEZBSUxFRDsKLQl9IGVsc2UgaWYgKGZzZl9yZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9UTUZVTkNOT1RTVVBQKSB7Ci0JCXpmY3BfZGJmX3Njc2lfZGV2cmVzZXQoIm5zdXAiLCB0bV9mbGFncywgdW5pdCwgc2NwbnQpOwotCQlyZXR2YWwgPSBGQUlMRUQ7CiAJfSBlbHNlCiAJCXpmY3BfZGJmX3Njc2lfZGV2cmVzZXQoIm9rYXkiLCB0bV9mbGFncywgdW5pdCwgc2NwbnQpOwogCkBAIC0yNjEsMTIgKzI3MywxMiBAQAogCiBzdGF0aWMgaW50IHpmY3Bfc2NzaV9laF9kZXZpY2VfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3BudCkKIHsKLQlyZXR1cm4gemZjcF90YXNrX21nbXRfZnVuY3Rpb24oc2NwbnQsIEZDUF9MT0dJQ0FMX1VOSVRfUkVTRVQpOworCXJldHVybiB6ZmNwX3Rhc2tfbWdtdF9mdW5jdGlvbihzY3BudCwgRkNQX1RNRl9MVU5fUkVTRVQpOwogfQogCiBzdGF0aWMgaW50IHpmY3Bfc2NzaV9laF90YXJnZXRfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3BudCkKIHsKLQlyZXR1cm4gemZjcF90YXNrX21nbXRfZnVuY3Rpb24oc2NwbnQsIEZDUF9UQVJHRVRfUkVTRVQpOworCXJldHVybiB6ZmNwX3Rhc2tfbWdtdF9mdW5jdGlvbihzY3BudCwgRkNQX1RNRl9UR1RfUkVTRVQpOwogfQogCiBzdGF0aWMgaW50IHpmY3Bfc2NzaV9laF9ob3N0X3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NwbnQpCkBAIC0yNzYsNiArMjg4LDcgQEAKIAogCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKGFkYXB0ZXIsIDAsICJzY2hyaF8xIiwgc2NwbnQpOwogCXpmY3BfZXJwX3dhaXQoYWRhcHRlcik7CisJZmNfYmxvY2tfc2NzaV9laChzY3BudCk7CiAKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KQEAgLTMwMyw3ICszMTYsNyBAQAogCWFkYXB0ZXItPnNjc2lfaG9zdC0+bWF4X2x1biA9IDE7CiAJYWRhcHRlci0+c2NzaV9ob3N0LT5tYXhfY2hhbm5lbCA9IDA7CiAJYWRhcHRlci0+c2NzaV9ob3N0LT51bmlxdWVfaWQgPSBkZXZfaWQuZGV2bm87Ci0JYWRhcHRlci0+c2NzaV9ob3N0LT5tYXhfY21kX2xlbiA9IDI1NTsKKwlhZGFwdGVyLT5zY3NpX2hvc3QtPm1heF9jbWRfbGVuID0gMTY7IC8qIGluIHN0cnVjdCBmY3BfY21uZCAqLwogCWFkYXB0ZXItPnNjc2lfaG9zdC0+dHJhbnNwb3J0dCA9IHpmY3BfZGF0YS5zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIAogCWFkYXB0ZXItPnNjc2lfaG9zdC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKQEAgLTMyNSwxMiArMzM4LDExIEBACiAJaWYgKCFzaG9zdCkKIAkJcmV0dXJuOwogCi0JcmVhZF9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkKLQkJaWYgKHBvcnQtPnJwb3J0KQotCQkJcG9ydC0+cnBvcnQgPSBOVUxMOworCXJlYWRfbG9ja19pcnEoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3QsIGxpc3QpCisJCXBvcnQtPnJwb3J0ID0gTlVMTDsKKwlyZWFkX3VubG9ja19pcnEoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrKTsKIAotCXJlYWRfdW5sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIAlmY19yZW1vdmVfaG9zdChzaG9zdCk7CiAJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CiAJc2NzaV9ob3N0X3B1dChzaG9zdCk7CkBAIC0zNDgsNyArMzYwLDcgQEAKIAkJZmNfc3RhdHMgPSBrbWFsbG9jKHNpemVvZigqZmNfc3RhdHMpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFmY19zdGF0cykKIAkJCXJldHVybiBOVUxMOwotCQlhZGFwdGVyLT5mY19zdGF0cyA9IGZjX3N0YXRzOyAvKiBmcmVlZCBpbiBhZGF0ZXJfZGVxdWV1ZSAqLworCQlhZGFwdGVyLT5mY19zdGF0cyA9IGZjX3N0YXRzOyAvKiBmcmVlZCBpbiBhZGFwdGVyX3JlbGVhc2UgKi8KIAl9CiAJbWVtc2V0KGFkYXB0ZXItPmZjX3N0YXRzLCAwLCBzaXplb2YoKmFkYXB0ZXItPmZjX3N0YXRzKSk7CiAJcmV0dXJuIGFkYXB0ZXItPmZjX3N0YXRzOwpAQCAtNDY0LDcgKzQ3Niw3IEBACiAJCWFkYXB0ZXItPnN0YXRzX3Jlc2V0ID0gamlmZmllcy9IWjsKIAkJa2ZyZWUoYWRhcHRlci0+c3RhdHNfcmVzZXRfZGF0YSk7CiAJCWFkYXB0ZXItPnN0YXRzX3Jlc2V0X2RhdGEgPSBkYXRhOyAvKiBmaW5hbGx5IGZyZWVkIGluCi0JCQkJCQkgICAgIGFkYXB0ZXJfZGVxdWV1ZSAqLworCQkJCQkJICAgICBhZGFwdGVyX3JlbGVhc2UgKi8KIAl9CiB9CiAKQEAgLTQ5NSw3ICs1MDcsNyBAQAogICogQHJwb3J0OiBUaGUgRkMgcnBvcnQgd2hlcmUgdG8gdGVtaW5hdGUgSS9PCiAgKgogICogQWJvcnQgYWxsIHBlbmRpbmcgU0NTSSBjb21tYW5kcyBmb3IgYSBwb3J0IGJ5IGNsb3NpbmcgdGhlCi0gKiBwb3J0LiBVc2luZyBhIHJlb3BlbiBmb3IgYXZvaWRzIGEgY29uZmxpY3Qgd2l0aCBhIHNodXRkb3duCisgKiBwb3J0LiBVc2luZyBhIHJlb3BlbiBhdm9pZGluZyBhIGNvbmZsaWN0IHdpdGggYSBzaHV0ZG93bgogICogb3ZlcndyaXRpbmcgYSByZW9wZW4uCiAgKi8KIHN0YXRpYyB2b2lkIHpmY3Bfc2NzaV90ZXJtaW5hdGVfcnBvcnRfaW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKQEAgLTUwNSwxNSArNTE3LDExIEBACiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9CiAJCShzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOwogCi0Jd3JpdGVfbG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7CiAJcG9ydCA9IHpmY3BfZ2V0X3BvcnRfYnlfd3dwbihhZGFwdGVyLCBycG9ydC0+cG9ydF9uYW1lKTsKLQlpZiAocG9ydCkKLQkJemZjcF9wb3J0X2dldChwb3J0KTsKLQl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCiAJaWYgKHBvcnQpIHsKIAkJemZjcF9lcnBfcG9ydF9yZW9wZW4ocG9ydCwgMCwgInNjdHJwaTEiLCBOVUxMKTsKLQkJemZjcF9wb3J0X3B1dChwb3J0KTsKKwkJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIAl9CiB9CiAKQEAgLTU1NSwzMSArNTYzLDM0IEBACiAKIHZvaWQgemZjcF9zY3NpX3NjaGVkdWxlX3Jwb3J0X3JlZ2lzdGVyKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQpCiB7Ci0JemZjcF9wb3J0X2dldChwb3J0KTsKKwlnZXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogCXBvcnQtPnJwb3J0X3Rhc2sgPSBSUE9SVF9BREQ7CiAKIAlpZiAoIXF1ZXVlX3dvcmsocG9ydC0+YWRhcHRlci0+d29ya19xdWV1ZSwgJnBvcnQtPnJwb3J0X3dvcmspKQotCQl6ZmNwX3BvcnRfcHV0KHBvcnQpOworCQlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogfQogCiB2b2lkIHpmY3Bfc2NzaV9zY2hlZHVsZV9ycG9ydF9ibG9jayhzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQogewotCXpmY3BfcG9ydF9nZXQocG9ydCk7CisJZ2V0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIAlwb3J0LT5ycG9ydF90YXNrID0gUlBPUlRfREVMOwogCiAJaWYgKHBvcnQtPnJwb3J0ICYmIHF1ZXVlX3dvcmsocG9ydC0+YWRhcHRlci0+d29ya19xdWV1ZSwKIAkJCQkgICAgICAmcG9ydC0+cnBvcnRfd29yaykpCiAJCXJldHVybjsKIAotCXpmY3BfcG9ydF9wdXQocG9ydCk7CisJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIH0KIAogdm9pZCB6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRzX2Jsb2NrKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpCisJcmVhZF9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0LCBsaXN0KQogCQl6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRfYmxvY2socG9ydCk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKIH0KIAogdm9pZCB6ZmNwX3Njc2lfcnBvcnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC01OTcsNyArNjA4LDcgQEAKIAkJfQogCX0KIAotCXpmY3BfcG9ydF9wdXQocG9ydCk7CisJcHV0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKTsKIH0KIAogCkBAIC02MTUsMjEgKzYyNiw3IEBACiAJCQkJIHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikKIAkJCQkJCSZ1bml0LT5mY3BfbHVuKSwgMCk7CiAKLQl6ZmNwX3VuaXRfcHV0KHVuaXQpOwotfQotCi1zdGF0aWMgaW50IHpmY3BfZXhlY3V0ZV9mY19qb2Ioc3RydWN0IGZjX2JzZ19qb2IgKmpvYikKLXsKLQlzd2l0Y2ggKGpvYi0+cmVxdWVzdC0+bXNnY29kZSkgewotCWNhc2UgRkNfQlNHX1JQVF9FTFM6Ci0JY2FzZSBGQ19CU0dfSFNUX0VMU19OT0xPR0lOOgotCQlyZXR1cm4gemZjcF9mY19leGVjdXRlX2Vsc19mY19qb2Ioam9iKTsKLQljYXNlIEZDX0JTR19SUFRfQ1Q6Ci0JY2FzZSBGQ19CU0dfSFNUX0NUOgotCQlyZXR1cm4gemZjcF9mY19leGVjdXRlX2N0X2ZjX2pvYihqb2IpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlwdXRfZGV2aWNlKCZ1bml0LT5zeXNmc19kZXZpY2UpOwogfQogCiBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgemZjcF90cmFuc3BvcnRfZnVuY3Rpb25zID0gewpAQCAtNjQzLDYgKzY0MCw3IEBACiAJLnNob3dfaG9zdF9wb3J0X25hbWUgPSAxLAogCS5zaG93X2hvc3RfcGVybWFuZW50X3BvcnRfbmFtZSA9IDEsCiAJLnNob3dfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyA9IDEsCisJLnNob3dfaG9zdF9zdXBwb3J0ZWRfZmM0cyA9IDEsCiAJLnNob3dfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzID0gMSwKIAkuc2hvd19ob3N0X21heGZyYW1lX3NpemUgPSAxLAogCS5zaG93X2hvc3Rfc2VyaWFsX251bWJlciA9IDEsCkBAIC02NTIsMTMgKzY1MCwxNSBAQAogCS5nZXRfaG9zdF9wb3J0X3N0YXRlID0gemZjcF9nZXRfaG9zdF9wb3J0X3N0YXRlLAogCS50ZXJtaW5hdGVfcnBvcnRfaW8gPSB6ZmNwX3Njc2lfdGVybWluYXRlX3Jwb3J0X2lvLAogCS5zaG93X2hvc3RfcG9ydF9zdGF0ZSA9IDEsCi0JLmJzZ19yZXF1ZXN0ID0gemZjcF9leGVjdXRlX2ZjX2pvYiwKKwkuc2hvd19ob3N0X2FjdGl2ZV9mYzRzID0gMSwKKwkuYnNnX3JlcXVlc3QgPSB6ZmNwX2ZjX2V4ZWNfYnNnX2pvYiwKIAkvKiBubyBmdW5jdGlvbnMgcmVnaXN0ZXJlZCBmb3IgZm9sbG93aW5nIGR5bmFtaWMgYXR0cmlidXRlcyBidXQKIAkgICBkaXJlY3RseSBzZXQgYnkgTExERCAqLwogCS5zaG93X2hvc3RfcG9ydF90eXBlID0gMSwKIAkuc2hvd19ob3N0X3NwZWVkID0gMSwKIAkuc2hvd19ob3N0X3BvcnRfaWQgPSAxLAogCS5kaXNhYmxlX3RhcmdldF9zY2FuID0gMSwKKwkuZGRfYnNnX3NpemUgPSBzaXplb2Yoc3RydWN0IHpmY3BfZnNmX2N0X2VscyksCiB9OwogCiBzdHJ1Y3QgemZjcF9kYXRhIHpmY3BfZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYwppbmRleCBkMzEwMDA4Li5mNTM5ZTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmcy5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIHN5c2ZzIGF0dHJpYnV0ZXMuCiAgKgotICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA4CisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDgsIDIwMDkKICAqLwogCiAjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJ6ZmNwIgpAQCAtMTksMzAgKzE5LDQ0IEBACiAJCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXQsXAogCQkJCQkJICAgY2hhciAqYnVmKQkJICAgICAgIFwKIHsJCQkJCQkJCQkgICAgICAgXAotCXN0cnVjdCBfZmVhdF9kZWYgKl9mZWF0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJICAgICAgIFwKKwlzdHJ1Y3QgX2ZlYXRfZGVmICpfZmVhdCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBfZmVhdF9kZWYsCSAgICAgICBcCisJCQkJCSAgICAgICBzeXNmc19kZXZpY2UpOwkJICAgICAgIFwKIAkJCQkJCQkJCSAgICAgICBcCiAJcmV0dXJuIHNwcmludGYoYnVmLCBfZm9ybWF0LCBfdmFsdWUpOwkJCQkgICAgICAgXAogfQkJCQkJCQkJCSAgICAgICBcCiBzdGF0aWMgWkZDUF9ERVZfQVRUUihfZmVhdCwgX25hbWUsIFNfSVJVR08sCQkJCSAgICAgICBcCiAJCSAgICAgemZjcF9zeXNmc18jI19mZWF0IyNfIyNfbmFtZSMjX3Nob3csIE5VTEwpOwogCi1aRkNQX0RFRklORV9BVFRSKHpmY3BfYWRhcHRlciwgYWRhcHRlciwgc3RhdHVzLCAiMHglMDh4XG4iLAotCQkgYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykpOwotWkZDUF9ERUZJTkVfQVRUUih6ZmNwX2FkYXB0ZXIsIGFkYXB0ZXIsIHBlZXJfd3dubiwgIjB4JTAxNmxseFxuIiwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkYXB0ZXItPnBlZXJfd3dubik7Ci1aRkNQX0RFRklORV9BVFRSKHpmY3BfYWRhcHRlciwgYWRhcHRlciwgcGVlcl93d3BuLCAiMHglMDE2bGx4XG4iLAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRhcHRlci0+cGVlcl93d3BuKTsKLVpGQ1BfREVGSU5FX0FUVFIoemZjcF9hZGFwdGVyLCBhZGFwdGVyLCBwZWVyX2RfaWQsICIweCUwNnhcbiIsCi0JCSBhZGFwdGVyLT5wZWVyX2RfaWQpOwotWkZDUF9ERUZJTkVfQVRUUih6ZmNwX2FkYXB0ZXIsIGFkYXB0ZXIsIGNhcmRfdmVyc2lvbiwgIjB4JTA0eFxuIiwKLQkJIGFkYXB0ZXItPmh5ZHJhX3ZlcnNpb24pOwotWkZDUF9ERUZJTkVfQVRUUih6ZmNwX2FkYXB0ZXIsIGFkYXB0ZXIsIGxpY192ZXJzaW9uLCAiMHglMDh4XG4iLAotCQkgYWRhcHRlci0+ZnNmX2xpY192ZXJzaW9uKTsKLVpGQ1BfREVGSU5FX0FUVFIoemZjcF9hZGFwdGVyLCBhZGFwdGVyLCBoYXJkd2FyZV92ZXJzaW9uLCAiMHglMDh4XG4iLAotCQkgYWRhcHRlci0+aGFyZHdhcmVfdmVyc2lvbik7Ci1aRkNQX0RFRklORV9BVFRSKHpmY3BfYWRhcHRlciwgYWRhcHRlciwgaW5fcmVjb3ZlcnksICIlZFxuIiwKLQkJIChhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKSAmCi0JCSAgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9JTlVTRSkgIT0gMCk7CisjZGVmaW5lIFpGQ1BfREVGSU5FX0FfQVRUUihfbmFtZSwgX2Zvcm1hdCwgX3ZhbHVlKQkJCSAgICAgXAorc3RhdGljIHNzaXplX3QgemZjcF9zeXNmc19hZGFwdGVyXyMjX25hbWUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJICAgICBcCisJCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0LFwKKwkJCQkJCSBjaGFyICpidWYpCQkgICAgIFwKK3sJCQkJCQkJCQkgICAgIFwKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiA9IHRvX2Njd2RldihkZXYpOwkJCSAgICAgXAorCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSB6ZmNwX2Njd19hZGFwdGVyX2J5X2NkZXYoY2Rldik7CSAgICAgXAorCWludCBpOwkJCQkJCQkJICAgICBcCisJCQkJCQkJCQkgICAgIFwKKwlpZiAoIWFkYXB0ZXIpCQkJCQkJCSAgICAgXAorCQlyZXR1cm4gLUVOT0RFVjsJCQkJCQkgICAgIFwKKwkJCQkJCQkJCSAgICAgXAorCWkgPSBzcHJpbnRmKGJ1ZiwgX2Zvcm1hdCwgX3ZhbHVlKTsJCQkJICAgICBcCisJemZjcF9jY3dfYWRhcHRlcl9wdXQoYWRhcHRlcik7CQkJCQkgICAgIFwKKwlyZXR1cm4gaTsJCQkJCQkJICAgICBcCit9CQkJCQkJCQkJICAgICBcCitzdGF0aWMgWkZDUF9ERVZfQVRUUihhZGFwdGVyLCBfbmFtZSwgU19JUlVHTywJCQkJICAgICBcCisJCSAgICAgemZjcF9zeXNmc19hZGFwdGVyXyMjX25hbWUjI19zaG93LCBOVUxMKTsKKworWkZDUF9ERUZJTkVfQV9BVFRSKHN0YXR1cywgIjB4JTA4eFxuIiwgYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykpOworWkZDUF9ERUZJTkVfQV9BVFRSKHBlZXJfd3dubiwgIjB4JTAxNmxseFxuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRhcHRlci0+cGVlcl93d25uKTsKK1pGQ1BfREVGSU5FX0FfQVRUUihwZWVyX3d3cG4sICIweCUwMTZsbHhcbiIsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkYXB0ZXItPnBlZXJfd3dwbik7CitaRkNQX0RFRklORV9BX0FUVFIocGVlcl9kX2lkLCAiMHglMDZ4XG4iLCBhZGFwdGVyLT5wZWVyX2RfaWQpOworWkZDUF9ERUZJTkVfQV9BVFRSKGNhcmRfdmVyc2lvbiwgIjB4JTA0eFxuIiwgYWRhcHRlci0+aHlkcmFfdmVyc2lvbik7CitaRkNQX0RFRklORV9BX0FUVFIobGljX3ZlcnNpb24sICIweCUwOHhcbiIsIGFkYXB0ZXItPmZzZl9saWNfdmVyc2lvbik7CitaRkNQX0RFRklORV9BX0FUVFIoaGFyZHdhcmVfdmVyc2lvbiwgIjB4JTA4eFxuIiwgYWRhcHRlci0+aGFyZHdhcmVfdmVyc2lvbik7CitaRkNQX0RFRklORV9BX0FUVFIoaW5fcmVjb3ZlcnksICIlZFxuIiwgKGF0b21pY19yZWFkKCZhZGFwdGVyLT5zdGF0dXMpICYKKwkJCQkJIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfSU5VU0UpICE9IDApOwogCiBaRkNQX0RFRklORV9BVFRSKHpmY3BfcG9ydCwgcG9ydCwgc3RhdHVzLCAiMHglMDh4XG4iLAogCQkgYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykpOwpAQCAtNzMsNyArODcsOCBAQAogCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKIAkJCQkJCWNoYXIgKmJ1ZikJCSAgICAgICBcCiB7CQkJCQkJCQkJICAgICAgIFwKLQlzdHJ1Y3QgX2ZlYXRfZGVmICpfZmVhdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCSAgICAgICBcCisJc3RydWN0IF9mZWF0X2RlZiAqX2ZlYXQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgX2ZlYXRfZGVmLAkgICAgICAgXAorCQkJCQkgICAgICAgc3lzZnNfZGV2aWNlKTsJCSAgICAgICBcCiAJCQkJCQkJCQkgICAgICAgXAogCWlmIChhdG9taWNfcmVhZCgmX2ZlYXQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fRVJQX0ZBSUxFRCkgICAgICAgXAogCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsJCQkJICAgICAgIFwKQEAgLTg0LDE1ICs5OSwxMyBAQAogCQkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLFwKIAkJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcCiB7CQkJCQkJCQkJICAgICAgIFwKLQlzdHJ1Y3QgX2ZlYXRfZGVmICpfZmVhdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCSAgICAgICBcCisJc3RydWN0IF9mZWF0X2RlZiAqX2ZlYXQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgX2ZlYXRfZGVmLAkgICAgICAgXAorCQkJCQkgICAgICAgc3lzZnNfZGV2aWNlKTsJCSAgICAgICBcCiAJdW5zaWduZWQgbG9uZyB2YWw7CQkJCQkJICAgICAgIFwKIAlpbnQgcmV0dmFsID0gMDsJCQkJCQkJICAgICAgIFwKIAkJCQkJCQkJCSAgICAgICBcCi0JbXV0ZXhfbG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CQkJCSAgICAgICBcCi0JaWYgKGF0b21pY19yZWFkKCZfZmVhdC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUpIHsJICAgICAgIFwKLQkJcmV0dmFsID0gLUVCVVNZOwkJCQkJICAgICAgIFwKLQkJZ290byBvdXQ7CQkJCQkJICAgICAgIFwKLQl9CQkJCQkJCQkgICAgICAgXAorCWlmICghKF9mZWF0ICYmIGdldF9kZXZpY2UoJl9mZWF0LT5zeXNmc19kZXZpY2UpKSkJCSAgICAgICBcCisJCXJldHVybiAtRUJVU1k7CQkJCQkJICAgICAgIFwKIAkJCQkJCQkJCSAgICAgICBcCiAJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkgfHwgdmFsICE9IDApIHsJCQkgICAgICAgXAogCQlyZXR2YWwgPSAtRUlOVkFMOwkJCQkJICAgICAgIFwKQEAgLTEwNSwyOSArMTE4LDgyIEBACiAJCQkJICBfcmVvcGVuX2lkLCBOVUxMKTsJCQkgICAgICAgXAogCXpmY3BfZXJwX3dhaXQoX2FkYXB0ZXIpOwkJCQkJICAgICAgIFwKIG91dDoJCQkJCQkJCQkgICAgICAgXAotCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CQkJCSAgICAgICBcCisJcHV0X2RldmljZSgmX2ZlYXQtPnN5c2ZzX2RldmljZSk7CQkJCSAgICAgICBcCiAJcmV0dXJuIHJldHZhbCA/IHJldHZhbCA6IChzc2l6ZV90KSBjb3VudDsJCQkgICAgICAgXAogfQkJCQkJCQkJCSAgICAgICBcCiBzdGF0aWMgWkZDUF9ERVZfQVRUUihfZmVhdCwgZmFpbGVkLCBTX0lXVVNSIHwgU19JUlVHTywJCQkgICAgICAgXAogCQkgICAgIHpmY3Bfc3lzZnNfIyNfZmVhdCMjX2ZhaWxlZF9zaG93LAkJCSAgICAgICBcCiAJCSAgICAgemZjcF9zeXNmc18jI19mZWF0IyNfZmFpbGVkX3N0b3JlKTsKIAotWkZDUF9TWVNGU19GQUlMRUQoemZjcF9hZGFwdGVyLCBhZGFwdGVyLCBhZGFwdGVyLCAic3lhZmFpMSIsICJzeWFmYWkyIik7CiBaRkNQX1NZU0ZTX0ZBSUxFRCh6ZmNwX3BvcnQsIHBvcnQsIHBvcnQtPmFkYXB0ZXIsICJzeXBmYWkxIiwgInN5cGZhaTIiKTsKIFpGQ1BfU1lTRlNfRkFJTEVEKHpmY3BfdW5pdCwgdW5pdCwgdW5pdC0+cG9ydC0+YWRhcHRlciwgInN5dWZhaTEiLCAic3l1ZmFpMiIpOwogCitzdGF0aWMgc3NpemVfdCB6ZmNwX3N5c2ZzX2FkYXB0ZXJfZmFpbGVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHpmY3BfY2N3X2FkYXB0ZXJfYnlfY2RldihjZGV2KTsKKwlpbnQgaTsKKworCWlmICghYWRhcHRlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fRVJQX0ZBSUxFRCkKKwkJaSA9IHNwcmludGYoYnVmLCAiMVxuIik7CisJZWxzZQorCQlpID0gc3ByaW50ZihidWYsICIwXG4iKTsKKworCXpmY3BfY2N3X2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOworCXJldHVybiBpOworfQorCitzdGF0aWMgc3NpemVfdCB6ZmNwX3N5c2ZzX2FkYXB0ZXJfZmFpbGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXYgPSB0b19jY3dkZXYoZGV2KTsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gemZjcF9jY3dfYWRhcHRlcl9ieV9jZGV2KGNkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXR2YWwgPSAwOworCisJaWYgKCFhZGFwdGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpIHx8IHZhbCAhPSAwKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXpmY3BfZXJwX21vZGlmeV9hZGFwdGVyX3N0YXR1cyhhZGFwdGVyLCAic3lhZmFpMSIsIE5VTEwsCisJCQkJICAgICAgIFpGQ1BfU1RBVFVTX0NPTU1PTl9SVU5OSU5HLCBaRkNQX1NFVCk7CisJemZjcF9lcnBfYWRhcHRlcl9yZW9wZW4oYWRhcHRlciwgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsCisJCQkJInN5YWZhaTIiLCBOVUxMKTsKKwl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOworb3V0OgorCXpmY3BfY2N3X2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOworCXJldHVybiByZXR2YWwgPyByZXR2YWwgOiAoc3NpemVfdCkgY291bnQ7Cit9CitzdGF0aWMgWkZDUF9ERVZfQVRUUihhZGFwdGVyLCBmYWlsZWQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICAgIHpmY3Bfc3lzZnNfYWRhcHRlcl9mYWlsZWRfc2hvdywKKwkJICAgICB6ZmNwX3N5c2ZzX2FkYXB0ZXJfZmFpbGVkX3N0b3JlKTsKKwogc3RhdGljIHNzaXplX3QgemZjcF9zeXNmc19wb3J0X3Jlc2Nhbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmV0OworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHpmY3BfY2N3X2FkYXB0ZXJfYnlfY2RldihjZGV2KTsKIAotCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUpCi0JCXJldHVybiAtRUJVU1k7CisJaWYgKCFhZGFwdGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldCA9IHpmY3BfZmNfc2Nhbl9wb3J0cyhhZGFwdGVyKTsKLQlyZXR1cm4gcmV0ID8gcmV0IDogKHNzaXplX3QpIGNvdW50OworCS8qIHN5bmMgdGhlIHVzZXItc3BhY2UtIHdpdGggdGhlIGtlcm5lbC1pbnZvY2F0aW9uIG9mIHNjYW5fd29yayAqLworCXF1ZXVlX3dvcmsoYWRhcHRlci0+d29ya19xdWV1ZSwgJmFkYXB0ZXItPnNjYW5fd29yayk7CisJZmx1c2hfd29yaygmYWRhcHRlci0+c2Nhbl93b3JrKTsKKwl6ZmNwX2Njd19hZGFwdGVyX3B1dChhZGFwdGVyKTsKKworCXJldHVybiAoc3NpemVfdCkgY291bnQ7CiB9CiBzdGF0aWMgWkZDUF9ERVZfQVRUUihhZGFwdGVyLCBwb3J0X3Jlc2NhbiwgU19JV1VTUiwgTlVMTCwKIAkJICAgICB6ZmNwX3N5c2ZzX3BvcnRfcmVzY2FuX3N0b3JlKTsKQEAgLTEzNiw0NCArMjAyLDM0IEBACiAJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiA9IHRvX2Njd2RldihkZXYpOworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSB6ZmNwX2Njd19hZGFwdGVyX2J5X2NkZXYoY2Rldik7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKIAl1NjQgd3dwbjsKLQlpbnQgcmV0dmFsID0gMDsKLQlMSVNUX0hFQUQocG9ydF9yZW1vdmVfbGgpOworCWludCByZXR2YWwgPSAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7Ci0JaWYgKGF0b21pY19yZWFkKCZhZGFwdGVyLT5zdGF0dXMpICYgWkZDUF9TVEFUVVNfQ09NTU9OX1JFTU9WRSkgewotCQlyZXR2YWwgPSAtRUJVU1k7CisJaWYgKCFhZGFwdGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzdHJpY3Rfc3RydG91bGwoYnVmLCAwLCAodW5zaWduZWQgbG9uZyBsb25nICopICZ3d3BuKSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKHN0cmljdF9zdHJ0b3VsbChidWYsIDAsICh1bnNpZ25lZCBsb25nIGxvbmcgKikgJnd3cG4pKSB7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXdyaXRlX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCXBvcnQgPSB6ZmNwX2dldF9wb3J0X2J5X3d3cG4oYWRhcHRlciwgd3dwbik7Ci0JaWYgKHBvcnQgJiYgKGF0b21pY19yZWFkKCZwb3J0LT5yZWZjb3VudCkgPT0gMCkpIHsKLQkJemZjcF9wb3J0X2dldChwb3J0KTsKLQkJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZwb3J0LT5zdGF0dXMpOwotCQlsaXN0X21vdmUoJnBvcnQtPmxpc3QsICZwb3J0X3JlbW92ZV9saCk7Ci0JfSBlbHNlCi0JCXBvcnQgPSBOVUxMOwotCXdyaXRlX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0KLQlpZiAoIXBvcnQpIHsKLQkJcmV0dmFsID0gLUVOWElPOworCWlmICghcG9ydCkKIAkJZ290byBvdXQ7Ci0JfQorCWVsc2UKKwkJcmV0dmFsID0gMDsKKworCXdyaXRlX2xvY2tfaXJxKCZhZGFwdGVyLT5wb3J0X2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJnBvcnQtPmxpc3QpOworCXdyaXRlX3VubG9ja19pcnEoJmFkYXB0ZXItPnBvcnRfbGlzdF9sb2NrKTsKKworCXB1dF9kZXZpY2UoJnBvcnQtPnN5c2ZzX2RldmljZSk7CiAKIAl6ZmNwX2VycF9wb3J0X3NodXRkb3duKHBvcnQsIDAsICJzeXByc18xIiwgTlVMTCk7Ci0JemZjcF9lcnBfd2FpdChhZGFwdGVyKTsKLQl6ZmNwX3BvcnRfcHV0KHBvcnQpOwotCXpmY3BfcG9ydF9kZXF1ZXVlKHBvcnQpOworCXpmY3BfZGV2aWNlX3VucmVnaXN0ZXIoJnBvcnQtPnN5c2ZzX2RldmljZSwgJnpmY3Bfc3lzZnNfcG9ydF9hdHRycyk7CiAgb3V0OgotCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CisJemZjcF9jY3dfYWRhcHRlcl9wdXQoYWRhcHRlcik7CiAJcmV0dXJuIHJldHZhbCA/IHJldHZhbCA6IChzc2l6ZV90KSBjb3VudDsKIH0KIHN0YXRpYyBaRkNQX0RFVl9BVFRSKGFkYXB0ZXIsIHBvcnRfcmVtb3ZlLCBTX0lXVVNSLCBOVUxMLApAQCAtMjAyLDE2ICsyNTgsMTQgQEAKIAkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHpmY3BfcG9ydCAqcG9ydCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgemZjcF9wb3J0LAorCQkJCQkgICAgICBzeXNmc19kZXZpY2UpOwogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CiAJdTY0IGZjcF9sdW47CiAJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLQlpZiAoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFKSB7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghKHBvcnQgJiYgZ2V0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKSkpCisJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoc3RyaWN0X3N0cnRvdWxsKGJ1ZiwgMCwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSAmZmNwX2x1bikpCiAJCWdvdG8gb3V0OwpAQCAtMjE5LDE1ICsyNzMsMTQgQEAKIAl1bml0ID0gemZjcF91bml0X2VucXVldWUocG9ydCwgZmNwX2x1bik7CiAJaWYgKElTX0VSUih1bml0KSkKIAkJZ290byBvdXQ7Ci0KLQlyZXR2YWwgPSAwOworCWVsc2UKKwkJcmV0dmFsID0gMDsKIAogCXpmY3BfZXJwX3VuaXRfcmVvcGVuKHVuaXQsIDAsICJzeXVhc18xIiwgTlVMTCk7CiAJemZjcF9lcnBfd2FpdCh1bml0LT5wb3J0LT5hZGFwdGVyKTsKIAlmbHVzaF93b3JrKCZ1bml0LT5zY3NpX3dvcmspOwotCXpmY3BfdW5pdF9wdXQodW5pdCk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKKwlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogCXJldHVybiByZXR2YWwgPyByZXR2YWwgOiAoc3NpemVfdCkgY291bnQ7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIodW5pdF9hZGQsIFNfSVdVU1IsIE5VTEwsIHpmY3Bfc3lzZnNfdW5pdF9hZGRfc3RvcmUpOwpAQCAtMjM2LDU0ICsyODksMzcgQEAKIAkJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHpmY3BfcG9ydCAqcG9ydCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgemZjcF9wb3J0LAorCQkJCQkgICAgICBzeXNmc19kZXZpY2UpOwogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CiAJdTY0IGZjcF9sdW47Ci0JaW50IHJldHZhbCA9IDA7Ci0JTElTVF9IRUFEKHVuaXRfcmVtb3ZlX2xoKTsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwotCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUpIHsKLQkJcmV0dmFsID0gLUVCVVNZOworCWlmICghKHBvcnQgJiYgZ2V0X2RldmljZSgmcG9ydC0+c3lzZnNfZGV2aWNlKSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWxsKGJ1ZiwgMCwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSAmZmNwX2x1bikpCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmIChzdHJpY3Rfc3RydG91bGwoYnVmLCAwLCAodW5zaWduZWQgbG9uZyBsb25nICopICZmY3BfbHVuKSkgewotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIAl1bml0ID0gemZjcF9nZXRfdW5pdF9ieV9sdW4ocG9ydCwgZmNwX2x1bik7Ci0JaWYgKHVuaXQpIHsKLQkJd3JpdGVfdW5sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKLQkJLyogd2FpdCBmb3IgcG9zc2libGUgdGltZW91dCBkdXJpbmcgU0NTSSBwcm9iZSAqLwotCQlmbHVzaF93b3JrKCZ1bml0LT5zY3NpX3dvcmspOwotCQl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKLQotCQlpZiAoYXRvbWljX3JlYWQoJnVuaXQtPnJlZmNvdW50KSA9PSAwKSB7Ci0JCQl6ZmNwX3VuaXRfZ2V0KHVuaXQpOwotCQkJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsCi0JCQkJCSZ1bml0LT5zdGF0dXMpOwotCQkJbGlzdF9tb3ZlKCZ1bml0LT5saXN0LCAmdW5pdF9yZW1vdmVfbGgpOwotCQl9IGVsc2UgewotCQkJdW5pdCA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCi0JaWYgKCF1bml0KSB7Ci0JCXJldHZhbCA9IC1FTlhJTzsKKwlpZiAoIXVuaXQpCiAJCWdvdG8gb3V0OwotCX0KKwllbHNlCisJCXJldHZhbCA9IDA7CisKKwkvKiB3YWl0IGZvciBwb3NzaWJsZSB0aW1lb3V0IGR1cmluZyBTQ1NJIHByb2JlICovCisJZmx1c2hfd29yaygmdW5pdC0+c2NzaV93b3JrKTsKKworCXdyaXRlX2xvY2tfaXJxKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJnVuaXQtPmxpc3QpOworCXdyaXRlX3VubG9ja19pcnEoJnBvcnQtPnVuaXRfbGlzdF9sb2NrKTsKKworCXB1dF9kZXZpY2UoJnVuaXQtPnN5c2ZzX2RldmljZSk7CiAKIAl6ZmNwX2VycF91bml0X3NodXRkb3duKHVuaXQsIDAsICJzeXVyc18xIiwgTlVMTCk7Ci0JemZjcF9lcnBfd2FpdCh1bml0LT5wb3J0LT5hZGFwdGVyKTsKLQl6ZmNwX3VuaXRfcHV0KHVuaXQpOwotCXpmY3BfdW5pdF9kZXF1ZXVlKHVuaXQpOworCXpmY3BfZGV2aWNlX3VucmVnaXN0ZXIoJnVuaXQtPnN5c2ZzX2RldmljZSwgJnpmY3Bfc3lzZnNfdW5pdF9hdHRycyk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKKwlwdXRfZGV2aWNlKCZwb3J0LT5zeXNmc19kZXZpY2UpOwogCXJldHVybiByZXR2YWwgPyByZXR2YWwgOiAoc3NpemVfdCkgY291bnQ7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIodW5pdF9yZW1vdmUsIFNfSVdVU1IsIE5VTEwsIHpmY3Bfc3lzZnNfdW5pdF9yZW1vdmVfc3RvcmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IDU4ZTU4M2IuLmFhMmI2MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTkyLDExICs5MiwxMSBAQAogI2RlZmluZSBFTlZDVFJMX0NQVVRFTVBfTU9OCQkJMSAgICAvKiBjcHUgdGVtcGVyYXR1cmUgbW9uaXRvciAqLwogI2RlZmluZSBFTlZDVFJMX0NQVVZPTFRBR0VfTU9OCSAgCTIgICAgLyogdm9sdGFnZSBtb25pdG9yICAgICAgICAgKi8KICNkZWZpbmUgRU5WQ1RSTF9GQU5TVEFUX01PTiAgCQkzICAgIC8qIGZhbiBzdGF0dXMgbW9uaXRvciAgICAgICovCi0jZGVmaW5lIEVOVkNUUkxfRVRIRVJURU1QX01PTgkJNCAgICAvKiBldGhlcm5ldCB0ZW1wZXJhcnR1cmUgKi8KKyNkZWZpbmUgRU5WQ1RSTF9FVEhFUlRFTVBfTU9OCQk0ICAgIC8qIGV0aGVybmV0IHRlbXBlcmF0dXJlICovCiAJCQkJCSAgICAgLyogbW9uaXRvciAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEVOVkNUUkxfVk9MVEFHRVNUQVRfTU9OCSAgCTUgICAgLyogdm9sdGFnZSBzdGF0dXMgbW9uaXRvciAgKi8KICNkZWZpbmUgRU5WQ1RSTF9NVEhSQkRURU1QX01PTgkJNiAgICAvKiBtb3RoZXJib2FyZCB0ZW1wZXJhdHVyZSAqLwotI2RlZmluZSBFTlZDVFJMX1NDU0lURU1QX01PTgkJNyAgICAvKiBzY3NpIHRlbXBlcmFydHVyZSAqLworI2RlZmluZSBFTlZDVFJMX1NDU0lURU1QX01PTgkJNyAgICAvKiBzY3NpIHRlbXBlcmF0dXJlICovCiAjZGVmaW5lIEVOVkNUUkxfR0xPQkFMQUREUl9NT04JCTggICAgLyogZ2xvYmFsIGFkZHJlc3MgKi8KIAogLyogQ2hpbGQgZGV2aWNlIHR5cGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguYwppbmRleCAzNmMyMWIxLi4zYmY3NTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMKQEAgLTE4Niw4ICsxODYsMTIgQEAKIH0gLyogRW5kIHR3YV9zaG93X3N0YXRzKCkgKi8KIAogLyogVGhpcyBmdW5jdGlvbiB3aWxsIHNldCBhIGRldmljZXMgcXVldWUgZGVwdGggKi8KLXN0YXRpYyBpbnQgdHdhX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxdWV1ZV9kZXB0aCkKK3N0YXRpYyBpbnQgdHdhX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxdWV1ZV9kZXB0aCwKKwkJCQkgIGludCByZWFzb24pCiB7CisJaWYgKHJlYXNvbiAhPSBTQ1NJX1FERVBUSF9ERUZBVUxUKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAocXVldWVfZGVwdGggPiBUV19RX0xFTkdUSC0yKQogCQlxdWV1ZV9kZXB0aCA9IFRXX1FfTEVOR1RILTI7CiAJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX09SREVSRURfVEFHLCBxdWV1ZV9kZXB0aCk7CkBAIC03MzIsNyArNzM2LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBUV19JT0NUTF9HRVRfQ09NUEFUSUJJTElUWV9JTkZPOgogCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gMDsKLQkJLyogQ29weSBjb21wYXRpYmxpdHkgc3RydWN0IGludG8gaW9jdGwgZGF0YSBidWZmZXIgKi8KKwkJLyogQ29weSBjb21wYXRpYmlsaXR5IHN0cnVjdCBpbnRvIGlvY3RsIGRhdGEgYnVmZmVyICovCiAJCXR3X2NvbXBhdF9pbmZvID0gKFRXX0NvbXBhdGliaWxpdHlfSW5mbyAqKXR3X2lvY3RsLT5kYXRhX2J1ZmZlcjsKIAkJbWVtY3B5KHR3X2NvbXBhdF9pbmZvLCAmdHdfZGV2LT50d19jb21wYXRfaW5mbywgc2l6ZW9mKFRXX0NvbXBhdGliaWxpdHlfSW5mbykpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy1zYXMuYyBiL2RyaXZlcnMvc2NzaS8zdy1zYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDMxNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzN3LXNhcy5jCkBAIC0wLDAgKzEsMTkyNCBAQAorLyoKKyAgIDN3LXNhcy5jIC0tIExTSSAzd2FyZSBTQVMvU0FUQS1SQUlEIENvbnRyb2xsZXIgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisKKyAgIFdyaXR0ZW4gQnk6IEFkYW0gUmFkZm9yZCA8bGludXhyYWlkQGxzaS5jb20+CisKKyAgIENvcHlyaWdodCAoQykgMjAwOSBMU0kgQ29ycG9yYXRpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBOTyBXQVJSQU5UWQorICAgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgICBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgIENvbnRyb2xsZXJzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcjoKKworICAgTFNJIDN3YXJlIDk3NTAgNkdiL3MgU0FTL1NBVEEtUkFJRAorCisgICBCdWdzL0NvbW1lbnRzL1N1Z2dlc3Rpb25zIHNob3VsZCBiZSBtYWlsZWQgdG86CisgICBsaW51eHJhaWRAbHNpLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cubHNpLmNvbQorCisgICBIaXN0b3J5CisgICAtLS0tLS0tCisgICAzLjI2LjAyLjAwMCAtIEluaXRpYWwgZHJpdmVyIHJlbGVhc2UuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlICIzdy1zYXMuaCIKKworLyogR2xvYmFscyAqLworI2RlZmluZSBUV19EUklWRVJfVkVSU0lPTiAiMy4yNi4wMi4wMDAiCitzdGF0aWMgVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdsX2RldmljZV9leHRlbnNpb25fbGlzdFtUV19NQVhfU0xPVF07CitzdGF0aWMgdW5zaWduZWQgaW50IHR3bF9kZXZpY2VfZXh0ZW5zaW9uX2NvdW50Oworc3RhdGljIGludCB0d2xfbWFqb3IgPSAtMTsKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworTU9EVUxFX0FVVEhPUiAoIkxTSSIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiTFNJIDN3YXJlIFNBUy9TQVRBLVJBSUQgTGludXggRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihUV19EUklWRVJfVkVSU0lPTik7CisKK3N0YXRpYyBpbnQgdXNlX21zaTsKK21vZHVsZV9wYXJhbSh1c2VfbXNpLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbXNpLCAiVXNlIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0cy4gRGVmYXVsdDogMCIpOworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IHR3bF9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IGlvY3RsX3Jlc2V0KTsKKworLyogRnVuY3Rpb25zICovCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBBRU5zIHRocm91Z2ggc3lzZnMgKi8KK3N0YXRpYyBzc2l6ZV90IHR3bF9zeXNmc19hZW5fcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgIGNoYXIgKm91dGJ1ZiwgbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRUFDQ0VTOworCisJc3Bpbl9sb2NrX2lycXNhdmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihvdXRidWYsIGNvdW50LCAmb2Zmc2V0LCB0d19kZXYtPmV2ZW50X3F1ZXVlWzBdLCBzaXplb2YoVFdfRXZlbnQpICogVFdfUV9MRU5HVEgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9IC8qIEVuZCB0d2xfc3lzZnNfYWVuX3JlYWQoKSAqLworCisvKiBhZW5fcmVhZCBzeXNmcyBhdHRyaWJ1dGUgaW5pdGlhbGl6ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSB0d2xfc3lzZnNfYWVuX3JlYWRfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAiM3dhcmVfYWVuX3JlYWQiLAorCQkubW9kZSA9IFNfSVJVU1IsCisJfSwgCisJLnNpemUgPSAwLAorCS5yZWFkID0gdHdsX3N5c2ZzX2Flbl9yZWFkCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZHJpdmVyIGNvbXBhdGliaWxpdHkgaW5mbyB0aHJvdWdoIHN5c2ZzICovCitzdGF0aWMgc3NpemVfdCB0d2xfc3lzZnNfY29tcGF0X2luZm8oc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJICAgICBjaGFyICpvdXRidWYsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXNzaXplX3QgcmV0OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0ID0gbWVtb3J5X3JlYWRfZnJvbV9idWZmZXIob3V0YnVmLCBjb3VudCwgJm9mZnNldCwgJnR3X2Rldi0+dHdfY29tcGF0X2luZm8sIHNpemVvZihUV19Db21wYXRpYmlsaXR5X0luZm8pKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfSAvKiBFbmQgdHdsX3N5c2ZzX2NvbXBhdF9pbmZvKCkgKi8KKworLyogY29tcGF0X2luZm8gc3lzZnMgYXR0cmlidXRlIGluaXRpYWxpemVyICovCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgdHdsX3N5c2ZzX2NvbXBhdF9pbmZvX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIjN3YXJlX2NvbXBhdF9pbmZvIiwKKwkJLm1vZGUgPSBTX0lSVVNSLAorCX0sIAorCS5zaXplID0gMCwKKwkucmVhZCA9IHR3bF9zeXNmc19jb21wYXRfaW5mbworfTsKKworLyogU2hvdyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNhcmQgKi8KK3N0YXRpYyBzc2l6ZV90IHR3bF9zaG93X3N0YXRzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzc2l6ZV90IGxlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIzdy1zYXMgRHJpdmVyIHZlcnNpb246ICVzXG4iCisJCSAgICAgICAiQ3VycmVudCBjb21tYW5kcyBwb3N0ZWQ6ICAgJTRkXG4iCisJCSAgICAgICAiTWF4IGNvbW1hbmRzIHBvc3RlZDogICAgICAgJTRkXG4iCisJCSAgICAgICAiTGFzdCBzZ2wgbGVuZ3RoOiAgICAgICAgICAgJTRkXG4iCisJCSAgICAgICAiTWF4IHNnbCBsZW5ndGg6ICAgICAgICAgICAgJTRkXG4iCisJCSAgICAgICAiTGFzdCBzZWN0b3IgY291bnQ6ICAgICAgICAgJTRkXG4iCisJCSAgICAgICAiTWF4IHNlY3RvciBjb3VudDogICAgICAgICAgJTRkXG4iCisJCSAgICAgICAiU0NTSSBIb3N0IFJlc2V0czogICAgICAgICAgJTRkXG4iCisJCSAgICAgICAiQUVOJ3M6ICAgICAgICAgICAgICAgICAgICAgJTRkXG4iLCAKKwkJICAgICAgIFRXX0RSSVZFUl9WRVJTSU9OLAorCQkgICAgICAgdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+bWF4X3Bvc3RlZF9yZXF1ZXN0X2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5zZ2xfZW50cmllcywKKwkJICAgICAgIHR3X2Rldi0+bWF4X3NnbF9lbnRyaWVzLAorCQkgICAgICAgdHdfZGV2LT5zZWN0b3JfY291bnQsCisJCSAgICAgICB0d19kZXYtPm1heF9zZWN0b3JfY291bnQsCisJCSAgICAgICB0d19kZXYtPm51bV9yZXNldHMsCisJCSAgICAgICB0d19kZXYtPmFlbl9jb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBsZW47Cit9IC8qIEVuZCB0d2xfc2hvd19zdGF0cygpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgYSBkZXZpY2VzIHF1ZXVlIGRlcHRoICovCitzdGF0aWMgaW50IHR3bF9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcXVldWVfZGVwdGgsCisJCQkJICBpbnQgcmVhc29uKQoreworCWlmIChyZWFzb24gIT0gU0NTSV9RREVQVEhfREVGQVVMVCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHF1ZXVlX2RlcHRoID4gVFdfUV9MRU5HVEgtMikKKwkJcXVldWVfZGVwdGggPSBUV19RX0xFTkdUSC0yOworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIE1TR19PUkRFUkVEX1RBRywgcXVldWVfZGVwdGgpOworCXJldHVybiBxdWV1ZV9kZXB0aDsKK30gLyogRW5kIHR3bF9jaGFuZ2VfcXVldWVfZGVwdGgoKSAqLworCisvKiBzdGF0cyBzeXNmcyBhdHRyaWJ1dGUgaW5pdGlhbGl6ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB0d2xfaG9zdF9zdGF0c19hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9IAkiM3dhcmVfc3RhdHMiLAorCQkubW9kZSA9CQlTX0lSVUdPLAorCX0sCisJLnNob3cgPSB0d2xfc2hvd19zdGF0cworfTsKKworLyogSG9zdCBhdHRyaWJ1dGVzIGluaXRpYWxpemVyICovCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnR3bF9ob3N0X2F0dHJzW10gPSB7CisJJnR3bF9ob3N0X3N0YXRzX2F0dHIsCisJTlVMTCwKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBsb29rIHVwIGFuIEFFTiBzZXZlcml0eSBzdHJpbmcgKi8KK3N0YXRpYyBjaGFyICp0d2xfYWVuX3NldmVyaXR5X2xvb2t1cCh1bnNpZ25lZCBjaGFyIHNldmVyaXR5X2NvZGUpCit7CisJY2hhciAqcmV0dmFsID0gTlVMTDsKKworCWlmICgoc2V2ZXJpdHlfY29kZSA8ICh1bnNpZ25lZCBjaGFyKSBUV19BRU5fU0VWRVJJVFlfRVJST1IpIHx8CisJICAgIChzZXZlcml0eV9jb2RlID4gKHVuc2lnbmVkIGNoYXIpIFRXX0FFTl9TRVZFUklUWV9ERUJVRykpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gdHdsX2Flbl9zZXZlcml0eV90YWJsZVtzZXZlcml0eV9jb2RlXTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX2Flbl9zZXZlcml0eV9sb29rdXAoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcXVldWUgYW4gZXZlbnQgKi8KK3N0YXRpYyB2b2lkIHR3bF9hZW5fcXVldWVfZXZlbnQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBUV19Db21tYW5kX0FwYWNoZV9IZWFkZXIgKmhlYWRlcikKK3sKKwl1MzIgbG9jYWxfdGltZTsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOworCVRXX0V2ZW50ICpldmVudDsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJY2hhciBob3N0WzE2XTsKKwljaGFyICplcnJvcl9zdHI7CisKKwl0d19kZXYtPmFlbl9jb3VudCsrOworCisJLyogRmlsbCBvdXQgZXZlbnQgaW5mbyAqLworCWV2ZW50ID0gdHdfZGV2LT5ldmVudF9xdWV1ZVt0d19kZXYtPmVycm9yX2luZGV4XTsKKworCWhvc3RbMF0gPSAnXDAnOworCWlmICh0d19kZXYtPmhvc3QpCisJCXNwcmludGYoaG9zdCwgIiBzY3NpJWQ6IiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKworCWFlbiA9IGxlMTZfdG9fY3B1KGhlYWRlci0+c3RhdHVzX2Jsb2NrLmVycm9yKTsKKwltZW1zZXQoZXZlbnQsIDAsIHNpemVvZihUV19FdmVudCkpOworCisJZXZlbnQtPnNldmVyaXR5ID0gVFdfU0VWX09VVChoZWFkZXItPnN0YXR1c19ibG9jay5zZXZlcml0eV9fcmVzZXJ2ZWQpOworCWRvX2dldHRpbWVvZmRheSgmdGltZSk7CisJbG9jYWxfdGltZSA9ICh1MzIpKHRpbWUudHZfc2VjIC0gKHN5c190ei50el9taW51dGVzd2VzdCAqIDYwKSk7CisJZXZlbnQtPnRpbWVfc3RhbXBfc2VjID0gbG9jYWxfdGltZTsKKwlldmVudC0+YWVuX2NvZGUgPSBhZW47CisJZXZlbnQtPnJldHJpZXZlZCA9IFRXX0FFTl9OT1RfUkVUUklFVkVEOworCWV2ZW50LT5zZXF1ZW5jZV9pZCA9IHR3X2Rldi0+ZXJyb3Jfc2VxdWVuY2VfaWQ7CisJdHdfZGV2LT5lcnJvcl9zZXF1ZW5jZV9pZCsrOworCisJLyogQ2hlY2sgZm9yIGVtYmVkZGVkIGVycm9yIHN0cmluZyAqLworCWVycm9yX3N0ciA9ICYoaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzY1tzdHJsZW4oaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzYykrMV0pOworCisJaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzY1tzaXplb2YoaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzYykgLSAxXSA9ICdcMCc7CisJZXZlbnQtPnBhcmFtZXRlcl9sZW4gPSBzdHJsZW4oaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzYyk7CisJbWVtY3B5KGV2ZW50LT5wYXJhbWV0ZXJfZGF0YSwgaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzYywgZXZlbnQtPnBhcmFtZXRlcl9sZW4gKyAxICsgc3RybGVuKGVycm9yX3N0cikpOworCWlmIChldmVudC0+c2V2ZXJpdHkgIT0gVFdfQUVOX1NFVkVSSVRZX0RFQlVHKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy1zYXM6JXMgQUVOOiAlcyAoMHglMDJYOjB4JTA0WCk6ICVzOiVzLlxuIiwKKwkJICAgICAgIGhvc3QsCisJCSAgICAgICB0d2xfYWVuX3NldmVyaXR5X2xvb2t1cChUV19TRVZfT1VUKGhlYWRlci0+c3RhdHVzX2Jsb2NrLnNldmVyaXR5X19yZXNlcnZlZCkpLAorCQkgICAgICAgVFdfTUVTU0FHRV9TT1VSQ0VfQ09OVFJPTExFUl9FVkVOVCwgYWVuLCBlcnJvcl9zdHIsCisJCSAgICAgICBoZWFkZXItPmVycl9zcGVjaWZpY19kZXNjKTsKKwllbHNlCisJCXR3X2Rldi0+YWVuX2NvdW50LS07CisKKwl0d19kZXYtPmVycm9yX2luZGV4ID0gKHR3X2Rldi0+ZXJyb3JfaW5kZXggKyAxICkgJSBUV19RX0xFTkdUSDsKK30gLyogRW5kIHR3bF9hZW5fcXVldWVfZXZlbnQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBwb3N0IGEgY29tbWFuZCBwYWNrZXQgdG8gdGhlIGJvYXJkICovCitzdGF0aWMgaW50IHR3bF9wb3N0X2NvbW1hbmRfcGFja2V0KFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJZG1hX2FkZHJfdCBjb21tYW5kX3F1ZV92YWx1ZTsKKworCWNvbW1hbmRfcXVlX3ZhbHVlID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF9waHlzW3JlcXVlc3RfaWRdOworCWNvbW1hbmRfcXVlX3ZhbHVlICs9IFRXX0NPTU1BTkRfT0ZGU0VUOworCisJLyogRmlyc3Qgd3JpdGUgdXBwZXIgNCBieXRlcyAqLworCXdyaXRlbCgodTMyKSgodTY0KWNvbW1hbmRfcXVlX3ZhbHVlID4+IDMyKSwgVFdMX0hJQlFQSF9SRUdfQUREUih0d19kZXYpKTsKKwkvKiBUaGVuIHRoZSBsb3dlciA0IGJ5dGVzICovCisJd3JpdGVsKCh1MzIpKGNvbW1hbmRfcXVlX3ZhbHVlIHwgVFdMX1BVTExfTU9ERSksIFRXTF9ISUJRUExfUkVHX0FERFIodHdfZGV2KSk7CisKKwl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19QT1NURUQ7CisJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCsrOworCWlmICh0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50ID4gdHdfZGV2LT5tYXhfcG9zdGVkX3JlcXVlc3RfY291bnQpCisJCXR3X2Rldi0+bWF4X3Bvc3RlZF9yZXF1ZXN0X2NvdW50ID0gdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudDsKKworCXJldHVybiAwOworfSAvKiBFbmQgdHdsX3Bvc3RfY29tbWFuZF9wYWNrZXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSBhIHBjaS1kbWEgbWFwcGluZyBmb3IgYSBzY2F0dGVyIGdhdGhlciBsaXN0ICovCitzdGF0aWMgaW50IHR3bF9tYXBfc2NzaV9zZ19kYXRhKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJaW50IHVzZV9zZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXTsKKworCXVzZV9zZyA9IHNjc2lfZG1hX21hcChjbWQpOworCWlmICghdXNlX3NnKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICh1c2Vfc2cgPCAwKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxLCAiRmFpbGVkIHRvIG1hcCBzY2F0dGVyIGdhdGhlciBsaXN0Iik7CisJCXJldHVybiAwOworCX0KKworCWNtZC0+U0NwLnBoYXNlID0gVFdfUEhBU0VfU0dMSVNUOworCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiA9IHVzZV9zZzsKKworCXJldHVybiB1c2Vfc2c7Cit9IC8qIEVuZCB0d2xfbWFwX3Njc2lfc2dfZGF0YSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZHMgc2NzaSBjZGIncyB0byB0aGUgZmlybXdhcmUgKi8KK3N0YXRpYyBpbnQgdHdsX3Njc2lvcF9leGVjdXRlX3Njc2koVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgY2hhciAqY2RiLCBpbnQgdXNlX3NnLCBUV19TR19FbnRyeV9JU08gKnNnbGlzdGFyZykKK3sKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJVFdfQ29tbWFuZF9BcGFjaGUgKmNvbW1hbmRfcGFja2V0OworCWludCBpLCBzZ19jb3VudDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIgPSBOVUxMOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0ID0gTlVMTCwgKnNnOworCWludCByZXR2YWwgPSAxOworCisJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKSB7CisJCXNyYiA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdOworCQlpZiAoc2NzaV9zZ2xpc3Qoc3JiKSkKKwkJCXNnbGlzdCA9IHNjc2lfc2dsaXN0KHNyYik7CisJfQorCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbcmVxdWVzdF9pZF07CisJZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLmhlYWRlcl9kZXNjLnNpemVfaGVhZGVyID0gMTI4OworCWZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zdGF0dXNfYmxvY2suZXJyb3IgPSAwOworCWZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zdGF0dXNfYmxvY2suc2V2ZXJpdHlfX3Jlc2VydmVkID0gMDsKKworCWNvbW1hbmRfcGFja2V0ID0gJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZDsKKwljb21tYW5kX3BhY2tldC0+c3RhdHVzID0gMDsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19yZXNlcnZlZCA9IFRXX09QUkVTX0lOKDAsIFRXX09QX0VYRUNVVEVfU0NTSSk7CisKKwkvKiBXZSBmb3JjZWQgMTYgYnl0ZSBjZGIgdXNlIGVhcmxpZXIgKi8KKwlpZiAoIWNkYikKKwkJbWVtY3B5KGNvbW1hbmRfcGFja2V0LT5jZGIsIHNyYi0+Y21uZCwgVFdfTUFYX0NEQl9MRU4pOworCWVsc2UKKwkJbWVtY3B5KGNvbW1hbmRfcGFja2V0LT5jZGIsIGNkYiwgVFdfTUFYX0NEQl9MRU4pOworCisJaWYgKHNyYikgeworCQljb21tYW5kX3BhY2tldC0+dW5pdCA9IHNyYi0+ZGV2aWNlLT5pZDsKKwkJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWRfX2x1bmwgPQorCQkJY3B1X3RvX2xlMTYoVFdfUkVRX0xVTl9JTihzcmItPmRldmljZS0+bHVuLCByZXF1ZXN0X2lkKSk7CisJfSBlbHNlIHsKKwkJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWRfX2x1bmwgPQorCQkJY3B1X3RvX2xlMTYoVFdfUkVRX0xVTl9JTigwLCByZXF1ZXN0X2lkKSk7CisJCWNvbW1hbmRfcGFja2V0LT51bml0ID0gMDsKKwl9CisKKwljb21tYW5kX3BhY2tldC0+c2dsX29mZnNldCA9IDE2OworCisJaWYgKCFzZ2xpc3RhcmcpIHsKKwkJLyogTWFwIHNnbGlzdCBmcm9tIHNjc2kgbGF5ZXIgdG8gY21kIHBhY2tldCAqLworCQlpZiAoc2NzaV9zZ19jb3VudChzcmIpKSB7CisJCQlzZ19jb3VudCA9IHR3bF9tYXBfc2NzaV9zZ19kYXRhKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQlpZiAoc2dfY291bnQgPT0gMCkKKwkJCQlnb3RvIG91dDsKKworCQkJc2NzaV9mb3JfZWFjaF9zZyhzcmIsIHNnLCBzZ19jb3VudCwgaSkgeworCQkJCWNvbW1hbmRfcGFja2V0LT5zZ19saXN0W2ldLmFkZHJlc3MgPSBUV19DUFVfVE9fU0dMKHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbaV0ubGVuZ3RoID0gVFdfQ1BVX1RPX1NHTChzZ19kbWFfbGVuKHNnKSk7CisJCQl9CisJCQljb21tYW5kX3BhY2tldC0+c2dsX2VudHJpZXNfX2x1bmggPSBjcHVfdG9fbGUxNihUV19SRVFfTFVOX0lOKChzcmItPmRldmljZS0+bHVuID4+IDQpLCBzY3NpX3NnX2NvdW50KHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKSkpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW50ZXJuYWwgY2RiIHBvc3QgKi8KKwkJZm9yIChpID0gMDsgaSA8IHVzZV9zZzsgaSsrKSB7CisJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFtpXS5hZGRyZXNzID0gVFdfQ1BVX1RPX1NHTChzZ2xpc3RhcmdbaV0uYWRkcmVzcyk7CisJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFtpXS5sZW5ndGggPSBUV19DUFVfVE9fU0dMKHNnbGlzdGFyZ1tpXS5sZW5ndGgpOworCQl9CisJCWNvbW1hbmRfcGFja2V0LT5zZ2xfZW50cmllc19fbHVuaCA9IGNwdV90b19sZTE2KFRXX1JFUV9MVU5fSU4oMCwgdXNlX3NnKSk7CisJfQorCisJLyogVXBkYXRlIHNvbWUgc3RhdHMgKi8KKwlpZiAoc3JiKSB7CisJCXR3X2Rldi0+c2VjdG9yX2NvdW50ID0gc2NzaV9idWZmbGVuKHNyYikgLyA1MTI7CisJCWlmICh0d19kZXYtPnNlY3Rvcl9jb3VudCA+IHR3X2Rldi0+bWF4X3NlY3Rvcl9jb3VudCkKKwkJCXR3X2Rldi0+bWF4X3NlY3Rvcl9jb3VudCA9IHR3X2Rldi0+c2VjdG9yX2NvdW50OworCQl0d19kZXYtPnNnbF9lbnRyaWVzID0gc2NzaV9zZ19jb3VudChzcmIpOworCQlpZiAodHdfZGV2LT5zZ2xfZW50cmllcyA+IHR3X2Rldi0+bWF4X3NnbF9lbnRyaWVzKQorCQkJdHdfZGV2LT5tYXhfc2dsX2VudHJpZXMgPSB0d19kZXYtPnNnbF9lbnRyaWVzOworCX0KKworCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHRvIHRoZSBib2FyZCAqLworCXJldHZhbCA9IHR3bF9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCk7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX3Njc2lvcF9leGVjdXRlX3Njc2koKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgYWVuIHF1ZXVlIGZyb20gdGhlIGlzciAqLworc3RhdGljIGludCB0d2xfYWVuX3JlYWRfcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwljaGFyIGNkYltUV19NQVhfQ0RCX0xFTl07CisJVFdfU0dfRW50cnlfSVNPIHNnbGlzdFsxXTsKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJaW50IHJldHZhbCA9IDE7CisKKwlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChmdWxsX2NvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfQ29tbWFuZF9GdWxsKSk7CisKKwkvKiBJbml0aWFsaXplIGNkYiAqLworCW1lbXNldCgmY2RiLCAwLCBUV19NQVhfQ0RCX0xFTik7CisJY2RiWzBdID0gUkVRVUVTVF9TRU5TRTsgLyogb3Bjb2RlICovCisJY2RiWzRdID0gVFdfQUxMT0NBVElPTl9MRU5HVEg7IC8qIGFsbG9jYXRpb24gbGVuZ3RoICovCisKKwkvKiBJbml0aWFsaXplIHNnbGlzdCAqLworCW1lbXNldCgmc2dsaXN0LCAwLCBzaXplb2YoVFdfU0dfRW50cnlfSVNPKSk7CisJc2dsaXN0WzBdLmxlbmd0aCA9IFRXX1NFQ1RPUl9TSVpFOworCXNnbGlzdFswXS5hZGRyZXNzID0gdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzW3JlcXVlc3RfaWRdOworCisJLyogTWFyayBpbnRlcm5hbCBjb21tYW5kICovCisJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPSBOVUxMOworCisJLyogTm93IHBvc3QgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJaWYgKHR3bF9zY3Npb3BfZXhlY3V0ZV9zY3NpKHR3X2RldiwgcmVxdWVzdF9pZCwgY2RiLCAxLCBzZ2xpc3QpKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyLCAiUG9zdCBmYWlsZWQgd2hpbGUgcmVhZGluZyBBRU4gcXVldWUiKTsKKwkJZ290byBvdXQ7CisJfQorCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3bF9hZW5fcmVhZF9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzeW5jIGZpcm13YXJlIHRpbWUgd2l0aCB0aGUgaG9zdCB0aW1lICovCitzdGF0aWMgdm9pZCB0d2xfYWVuX3N5bmNfdGltZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCXUzMiBzY2hlZHVsZXJ0aW1lOworCXN0cnVjdCB0aW1ldmFsIHV0YzsKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJVFdfQ29tbWFuZCAqY29tbWFuZF9wYWNrZXQ7CisJVFdfUGFyYW1fQXBhY2hlICpwYXJhbTsKKwl1MzIgbG9jYWxfdGltZTsKKworCS8qIEZpbGwgb3V0IHRoZSBjb21tYW5kIHBhY2tldCAqLworCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbcmVxdWVzdF9pZF07CisJbWVtc2V0KGZ1bGxfY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKTsKKwljb21tYW5kX3BhY2tldCA9ICZmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm9sZGNvbW1hbmQ7CisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfU0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4X29mZnNldC5wYXJhbS5zZ2xbMF0uYWRkcmVzcyA9IFRXX0NQVV9UT19TR0wodHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzW3JlcXVlc3RfaWRdKTsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZThfb2Zmc2V0LnBhcmFtLnNnbFswXS5sZW5ndGggPSBUV19DUFVfVE9fU0dMKFRXX1NFQ1RPUl9TSVpFKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IFRXX0NPTU1BTkRfU0laRTsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTZfb2Zmc2V0LnBhcmFtZXRlcl9jb3VudCA9IGNwdV90b19sZTE2KDEpOworCisJLyogU2V0dXAgdGhlIHBhcmFtICovCisJcGFyYW0gPSAoVFdfUGFyYW1fQXBhY2hlICopdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgVFdfU0VDVE9SX1NJWkUpOworCXBhcmFtLT50YWJsZV9pZCA9IGNwdV90b19sZTE2KFRXX1RJTUVLRUVQX1RBQkxFIHwgMHg4MDAwKTsgLyogQ29udHJvbGxlciB0aW1lIGtlZXAgdGFibGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gY3B1X3RvX2xlMTYoMHgzKTsgLyogU2NoZWR1bGVyVGltZSAqLworCXBhcmFtLT5wYXJhbWV0ZXJfc2l6ZV9ieXRlcyA9IGNwdV90b19sZTE2KDQpOworCisJLyogQ29udmVydCBzeXN0ZW0gdGltZSBpbiBVVEMgdG8gbG9jYWwgdGltZSBzZWNvbmRzIHNpbmNlIGxhc3QgCisgICAgICAgICAgIFN1bmRheSAxMjowMEFNICovCisJZG9fZ2V0dGltZW9mZGF5KCZ1dGMpOworCWxvY2FsX3RpbWUgPSAodTMyKSh1dGMudHZfc2VjIC0gKHN5c190ei50el9taW51dGVzd2VzdCAqIDYwKSk7CisJc2NoZWR1bGVydGltZSA9IGxvY2FsX3RpbWUgLSAoMyAqIDg2NDAwKTsKKwlzY2hlZHVsZXJ0aW1lID0gY3B1X3RvX2xlMzIoc2NoZWR1bGVydGltZSAlIDYwNDgwMCk7CisKKwltZW1jcHkocGFyYW0tPmRhdGEsICZzY2hlZHVsZXJ0aW1lLCBzaXplb2YodTMyKSk7CisKKwkvKiBNYXJrIGludGVybmFsIGNvbW1hbmQgKi8KKwl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7CisKKwkvKiBOb3cgcG9zdCB0aGUgY29tbWFuZCAqLworCXR3bF9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCk7Cit9IC8qIEVuZCB0d2xfYWVuX3N5bmNfdGltZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhc3NpZ24gYW4gYXZhaWxhYmxlIHJlcXVlc3QgaWQgKi8KK3N0YXRpYyB2b2lkIHR3bF9nZXRfcmVxdWVzdF9pZChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCAqcmVxdWVzdF9pZCkKK3sKKwkqcmVxdWVzdF9pZCA9IHR3X2Rldi0+ZnJlZV9xdWV1ZVt0d19kZXYtPmZyZWVfaGVhZF07CisJdHdfZGV2LT5mcmVlX2hlYWQgPSAodHdfZGV2LT5mcmVlX2hlYWQgKyAxKSAlIFRXX1FfTEVOR1RIOworCXR3X2Rldi0+c3RhdGVbKnJlcXVlc3RfaWRdID0gVFdfU19TVEFSVEVEOworfSAvKiBFbmQgdHdsX2dldF9yZXF1ZXN0X2lkKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYSByZXF1ZXN0IGlkICovCitzdGF0aWMgdm9pZCB0d2xfZnJlZV9yZXF1ZXN0X2lkKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdHdfZGV2LT5mcmVlX3F1ZXVlW3R3X2Rldi0+ZnJlZV90YWlsXSA9IHJlcXVlc3RfaWQ7CisJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfRklOSVNIRUQ7CisJdHdfZGV2LT5mcmVlX3RhaWwgPSAodHdfZGV2LT5mcmVlX3RhaWwgKyAxKSAlIFRXX1FfTEVOR1RIOworfSAvKiBFbmQgdHdsX2ZyZWVfcmVxdWVzdF9pZCgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjb21wbGV0ZSBhbiBhZW4gcmVxdWVzdCBmcm9tIHRoZSBpc3IgKi8KK3N0YXRpYyBpbnQgdHdsX2Flbl9jb21wbGV0ZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kX0FwYWNoZV9IZWFkZXIgKmhlYWRlcjsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJaW50IHJldHZhbCA9IDE7CisKKwloZWFkZXIgPSAoVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyICopdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0W3JlcXVlc3RfaWRdOworCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKKwlhZW4gPSBsZTE2X3RvX2NwdShoZWFkZXItPnN0YXR1c19ibG9jay5lcnJvcik7CisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwljb21tYW5kX3BhY2tldCA9ICZmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm9sZGNvbW1hbmQ7CisKKwkvKiBGaXJzdCBjaGVjayBmb3IgaW50ZXJuYWwgY29tcGxldGlvbiBvZiBzZXQgcGFyYW0gZm9yIHRpbWUgc3luYyAqLworCWlmIChUV19PUF9PVVQoY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0KSA9PSBUV19PUF9TRVRfUEFSQU0pIHsKKwkJLyogS2VlcCByZWFkaW5nIHRoZSBxdWV1ZSBpbiBjYXNlIHRoZXJlIGFyZSBtb3JlIGFlbidzICovCisJCWlmICh0d2xfYWVuX3JlYWRfcXVldWUodHdfZGV2LCByZXF1ZXN0X2lkKSkKKwkJCWdvdG8gb3V0MjsKKwkgICAgICAgIGVsc2UgeworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc3dpdGNoIChhZW4pIHsKKwljYXNlIFRXX0FFTl9RVUVVRV9FTVBUWToKKwkJLyogUXVpdCByZWFkaW5nIHRoZSBxdWV1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IG9uZSAqLworCQlicmVhazsKKwljYXNlIFRXX0FFTl9TWU5DX1RJTUVfV0lUSF9IT1NUOgorCQl0d2xfYWVuX3N5bmNfdGltZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQl0d2xfYWVuX3F1ZXVlX2V2ZW50KHR3X2RldiwgaGVhZGVyKTsKKworCQkvKiBJZiB0aGVyZSBhcmUgbW9yZSBhZW4ncywga2VlcCByZWFkaW5nIHRoZSBxdWV1ZSAqLworCQlpZiAodHdsX2Flbl9yZWFkX3F1ZXVlKHR3X2RldiwgcmVxdWVzdF9pZCkpCisJCQlnb3RvIG91dDI7CisJCWVsc2UgeworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXJldHZhbCA9IDA7CitvdXQyOgorCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwl0d2xfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJY2xlYXJfYml0KFRXX0lOX0FUVEVOVElPTl9MT09QLCAmdHdfZGV2LT5mbGFncyk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3bF9hZW5fY29tcGxldGUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcG9sbCBmb3IgYSByZXNwb25zZSAqLworc3RhdGljIGludCB0d2xfcG9sbF9yZXNwb25zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBpbnQgc2Vjb25kcykKK3sKKwl1bnNpZ25lZCBsb25nIGJlZm9yZTsKKwlkbWFfYWRkcl90IG1mYTsKKwl1MzIgcmVnaCwgcmVnbDsKKwl1MzIgcmVzcG9uc2U7CisJaW50IHJldHZhbCA9IDE7CisJaW50IGZvdW5kID0gMDsKKworCWJlZm9yZSA9IGppZmZpZXM7CisKKwl3aGlsZSAoIWZvdW5kKSB7CisJCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSB7CisJCQlyZWdoID0gcmVhZGwoVFdMX0hPQlFQSF9SRUdfQUREUih0d19kZXYpKTsKKwkJCXJlZ2wgPSByZWFkbChUV0xfSE9CUVBMX1JFR19BRERSKHR3X2RldikpOworCQkJbWZhID0gKCh1NjQpcmVnaCA8PCAzMikgfCByZWdsOworCQl9IGVsc2UKKwkJCW1mYSA9IHJlYWRsKFRXTF9IT0JRUExfUkVHX0FERFIodHdfZGV2KSk7CisKKwkJcmVzcG9uc2UgPSAodTMyKW1mYTsKKworCQlpZiAoVFdfUkVTSURfT1VUKHJlc3BvbnNlKSA9PSByZXF1ZXN0X2lkKQorCQkJZm91bmQgPSAxOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNTApOworCX0KKwlyZXR2YWwgPSAwOworb3V0OiAKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX3BvbGxfcmVzcG9uc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHJhaW4gdGhlIGFlbiBxdWV1ZSAqLworc3RhdGljIGludCB0d2xfYWVuX2RyYWluX3F1ZXVlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IG5vX2NoZWNrX3Jlc2V0KQoreworCWludCByZXF1ZXN0X2lkID0gMDsKKwljaGFyIGNkYltUV19NQVhfQ0RCX0xFTl07CisJVFdfU0dfRW50cnlfSVNPIHNnbGlzdFsxXTsKKwlpbnQgZmluaXNoZWQgPSAwLCBjb3VudCA9IDA7CisJVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0OworCVRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciAqaGVhZGVyOworCXVuc2lnbmVkIHNob3J0IGFlbjsKKwlpbnQgZmlyc3RfcmVzZXQgPSAwLCBxdWV1ZSA9IDAsIHJldHZhbCA9IDE7CisKKwlpZiAobm9fY2hlY2tfcmVzZXQpCisJCWZpcnN0X3Jlc2V0ID0gMDsKKwllbHNlCisJCWZpcnN0X3Jlc2V0ID0gMTsKKworCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbcmVxdWVzdF9pZF07CisJbWVtc2V0KGZ1bGxfY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKTsKKworCS8qIEluaXRpYWxpemUgY2RiICovCisJbWVtc2V0KCZjZGIsIDAsIFRXX01BWF9DREJfTEVOKTsKKwljZGJbMF0gPSBSRVFVRVNUX1NFTlNFOyAvKiBvcGNvZGUgKi8KKwljZGJbNF0gPSBUV19BTExPQ0FUSU9OX0xFTkdUSDsgLyogYWxsb2NhdGlvbiBsZW5ndGggKi8KKworCS8qIEluaXRpYWxpemUgc2dsaXN0ICovCisJbWVtc2V0KCZzZ2xpc3QsIDAsIHNpemVvZihUV19TR19FbnRyeV9JU08pKTsKKwlzZ2xpc3RbMF0ubGVuZ3RoID0gVFdfU0VDVE9SX1NJWkU7CisJc2dsaXN0WzBdLmFkZHJlc3MgPSB0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3BoeXNbcmVxdWVzdF9pZF07CisKKwkvKiBNYXJrIGludGVybmFsIGNvbW1hbmQgKi8KKwl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7CisKKwlkbyB7CisJCS8qIFNlbmQgY29tbWFuZCB0byB0aGUgYm9hcmQgKi8KKwkJaWYgKHR3bF9zY3Npb3BfZXhlY3V0ZV9zY3NpKHR3X2RldiwgcmVxdWVzdF9pZCwgY2RiLCAxLCBzZ2xpc3QpKSB7CisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MywgIkVycm9yIHBvc3RpbmcgcmVxdWVzdCBzZW5zZSIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBOb3cgcG9sbCBmb3IgY29tcGxldGlvbiAqLworCQlpZiAodHdsX3BvbGxfcmVzcG9uc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAzMCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHg0LCAiTm8gdmFsaWQgcmVzcG9uc2Ugd2hpbGUgZHJhaW5pbmcgQUVOIHF1ZXVlIik7CisJCQl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKKwkJaGVhZGVyID0gKFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciAqKXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtyZXF1ZXN0X2lkXTsKKwkJYWVuID0gbGUxNl90b19jcHUoaGVhZGVyLT5zdGF0dXNfYmxvY2suZXJyb3IpOworCQlxdWV1ZSA9IDA7CisJCWNvdW50Kys7CisKKwkJc3dpdGNoIChhZW4pIHsKKwkJY2FzZSBUV19BRU5fUVVFVUVfRU1QVFk6CisJCQlpZiAoZmlyc3RfcmVzZXQgIT0gMSkKKwkJCQlnb3RvIG91dDsKKwkJCWVsc2UKKwkJCQlmaW5pc2hlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBUV19BRU5fU09GVF9SRVNFVDoKKwkJCWlmIChmaXJzdF9yZXNldCA9PSAwKQorCQkJCWZpcnN0X3Jlc2V0ID0gMTsKKwkJCWVsc2UKKwkJCQlxdWV1ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBUV19BRU5fU1lOQ19USU1FX1dJVEhfSE9TVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcXVldWUgPSAxOworCQl9CisKKwkJLyogTm93IHF1ZXVlIGFuIGV2ZW50IGluZm8gKi8KKwkJaWYgKHF1ZXVlKQorCQkJdHdsX2Flbl9xdWV1ZV9ldmVudCh0d19kZXYsIGhlYWRlcik7CisJfSB3aGlsZSAoKGZpbmlzaGVkID09IDApICYmIChjb3VudCA8IFRXX01BWF9BRU5fRFJBSU4pKTsKKworCWlmIChjb3VudCA9PSBUV19NQVhfQUVOX0RSQUlOKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IDA7CitvdXQ6CisJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfSU5JVElBTDsKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX2Flbl9kcmFpbl9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBtZW1vcnkgYW5kIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3RseSBhbGlnbmVkICovCitzdGF0aWMgaW50IHR3bF9hbGxvY2F0ZV9tZW1vcnkoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgc2l6ZSwgaW50IHdoaWNoKQoreworCWludCBpOworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwl1bnNpZ25lZCBsb25nICpjcHVfYWRkcjsKKwlpbnQgcmV0dmFsID0gMTsKKworCWNwdV9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHdfZGV2LT50d19wY2lfZGV2LCBzaXplKlRXX1FfTEVOR1RILCAmZG1hX2hhbmRsZSk7CisJaWYgKCFjcHVfYWRkcikgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4NSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoY3B1X2FkZHIsIDAsIHNpemUqVFdfUV9MRU5HVEgpOworCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJc3dpdGNoKHdoaWNoKSB7CisJCWNhc2UgMDoKKwkJCXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbaV0gPSAoVFdfQ29tbWFuZF9GdWxsICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzW2ldID0gZG1hX2hhbmRsZSsoaSpzaXplKTsKKwkJCXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtpXSA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdHdfZGV2LT5zZW5zZV9idWZmZXJfcGh5c1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPnNlbnNlX2J1ZmZlcl92aXJ0W2ldID0gKFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciAqKSgodW5zaWduZWQgY2hhciAqKWNwdV9hZGRyICsgKGkqc2l6ZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX2FsbG9jYXRlX21lbW9yeSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIHRoZSByZXF1ZXN0IGlkIGFuZCB2YXJpb3VzIHNnbHMgZm9yIGlvY3RscyAqLworc3RhdGljIHZvaWQgdHdsX2xvYWRfc2dsKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0LCBpbnQgcmVxdWVzdF9pZCwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBpbnQgbGVuZ3RoKQoreworCVRXX0NvbW1hbmQgKm9sZGNvbW1hbmQ7CisJVFdfQ29tbWFuZF9BcGFjaGUgKm5ld2NvbW1hbmQ7CisJVFdfU0dfRW50cnlfSVNPICpzZ2w7CisJdW5zaWduZWQgaW50IHBhZSA9IDA7CisKKwlpZiAoKHNpemVvZihsb25nKSA8IDgpICYmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSkKKwkJcGFlID0gMTsKKworCWlmIChUV19PUF9PVVQoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLm9wY29kZV9fcmVzZXJ2ZWQpID09IFRXX09QX0VYRUNVVEVfU0NTSSkgeworCQluZXdjb21tYW5kID0gJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZDsKKwkJbmV3Y29tbWFuZC0+cmVxdWVzdF9pZF9fbHVubCA9CisJCQljcHVfdG9fbGUxNihUV19SRVFfTFVOX0lOKFRXX0xVTl9PVVQobmV3Y29tbWFuZC0+cmVxdWVzdF9pZF9fbHVubCksIHJlcXVlc3RfaWQpKTsKKwkJaWYgKGxlbmd0aCkgeworCQkJbmV3Y29tbWFuZC0+c2dfbGlzdFswXS5hZGRyZXNzID0gVFdfQ1BVX1RPX1NHTChkbWFfaGFuZGxlICsgc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpIC0gMSk7CisJCQluZXdjb21tYW5kLT5zZ19saXN0WzBdLmxlbmd0aCA9IFRXX0NQVV9UT19TR0wobGVuZ3RoKTsKKwkJfQorCQluZXdjb21tYW5kLT5zZ2xfZW50cmllc19fbHVuaCA9CisJCQljcHVfdG9fbGUxNihUV19SRVFfTFVOX0lOKFRXX0xVTl9PVVQobmV3Y29tbWFuZC0+c2dsX2VudHJpZXNfX2x1bmgpLCBsZW5ndGggPyAxIDogMCkpOworCX0gZWxzZSB7CisJCW9sZGNvbW1hbmQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5vbGRjb21tYW5kOworCQlvbGRjb21tYW5kLT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKworCQlpZiAoVFdfU0dMX09VVChvbGRjb21tYW5kLT5vcGNvZGVfX3NnbG9mZnNldCkpIHsKKwkJCS8qIExvYWQgdGhlIHNnIGxpc3QgKi8KKwkJCXNnbCA9IChUV19TR19FbnRyeV9JU08gKikoKHUzMiAqKW9sZGNvbW1hbmQrb2xkY29tbWFuZC0+c2l6ZSAtIChzaXplb2YoVFdfU0dfRW50cnlfSVNPKS80KSArIHBhZSArIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gMSA6IDApKTsKKwkJCXNnbC0+YWRkcmVzcyA9IFRXX0NQVV9UT19TR0woZG1hX2hhbmRsZSArIHNpemVvZihUV19Jb2N0bF9CdWZfQXBhY2hlKSAtIDEpOworCQkJc2dsLT5sZW5ndGggPSBUV19DUFVfVE9fU0dMKGxlbmd0aCk7CisJCQlvbGRjb21tYW5kLT5zaXplICs9IHBhZTsKKwkJCW9sZGNvbW1hbmQtPnNpemUgKz0gc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCA/IDEgOiAwOworCQl9CisJfQorfSAvKiBFbmQgdHdsX2xvYWRfc2dsKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGlvY3RsIGZvciB0aGUgY2hhcmFjdGVyIGRldmljZQorICAgVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBzbWFydG1vbnRvb2xzIG9wZW4gc291cmNlIHNvZnR3YXJlICovCitzdGF0aWMgaW50IHR3bF9jaHJkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nICpjcHVfYWRkciwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkID0gMCwgZmxhZ3MgPSAwOworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwlpbnQgcmVxdWVzdF9pZCA9IDA7CisJVFdfSW9jdGxfRHJpdmVyX0NvbW1hbmQgZHJpdmVyX2NvbW1hbmQ7CisJVFdfSW9jdGxfQnVmX0FwYWNoZSAqdHdfaW9jdGw7CisJVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0OworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IHR3bF9kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbaW1pbm9yKGlub2RlKV07CisJaW50IHJldHZhbCA9IC1FRkFVTFQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwkvKiBPbmx5IGxldCBvbmUgb2YgdGhlc2UgdGhyb3VnaCBhdCBhIHRpbWUgKi8KKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0d19kZXYtPmlvY3RsX2xvY2spKSB7CisJCXJldHZhbCA9IC1FSU5UUjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmlyc3QgY29weSBkb3duIHRoZSBkcml2ZXIgY29tbWFuZCAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmZHJpdmVyX2NvbW1hbmQsIGFyZ3AsIHNpemVvZihUV19Jb2N0bF9Ecml2ZXJfQ29tbWFuZCkpKQorCQlnb3RvIG91dDI7CisKKwkvKiBDaGVjayBkYXRhIGJ1ZmZlciBzaXplICovCisJaWYgKGRyaXZlcl9jb21tYW5kLmJ1ZmZlcl9sZW5ndGggPiBUV19NQVhfU0VDVE9SUyAqIDIwNDgpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQyOworCX0KKworCS8qIEhhcmR3YXJlIGNhbiBvbmx5IGRvIG11bHRpcGxlIG9mIDUxMiBieXRlIHRyYW5zZmVycyAqLworCWRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCA9IChkcml2ZXJfY29tbWFuZC5idWZmZXJfbGVuZ3RoICsgNTExKSAmIH41MTE7CisKKwkvKiBOb3cgYWxsb2NhdGUgaW9jdGwgYnVmIG1lbW9yeSAqLworCWNwdV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZ0d19kZXYtPnR3X3BjaV9kZXYtPmRldiwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkK3NpemVvZihUV19Jb2N0bF9CdWZfQXBhY2hlKSAtIDEsICZkbWFfaGFuZGxlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNwdV9hZGRyKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0MjsKKwl9CisKKwl0d19pb2N0bCA9IChUV19Jb2N0bF9CdWZfQXBhY2hlICopY3B1X2FkZHI7CisKKwkvKiBOb3cgY29weSBkb3duIHRoZSBlbnRpcmUgaW9jdGwgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIodHdfaW9jdGwsIGFyZ3AsIGRyaXZlcl9jb21tYW5kLmJ1ZmZlcl9sZW5ndGggKyBzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxKSkKKwkJZ290byBvdXQzOworCisJLyogU2VlIHdoaWNoIGlvY3RsIHdlIGFyZSBkb2luZyAqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUV19JT0NUTF9GSVJNV0FSRV9QQVNTX1RIUk9VR0g6CisJCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXR3bF9nZXRfcmVxdWVzdF9pZCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCQkvKiBGbGFnIGludGVybmFsIGNvbW1hbmQgKi8KKwkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPSBOVUxMOworCisJCS8qIEZsYWcgY2hyZGV2IGlvY3RsICovCisJCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCisJCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSAoVFdfQ29tbWFuZF9GdWxsICopJnR3X2lvY3RsLT5maXJtd2FyZV9jb21tYW5kOworCisJCS8qIExvYWQgcmVxdWVzdCBpZCBhbmQgc2dsaXN0IGZvciBib3RoIGNvbW1hbmQgdHlwZXMgKi8KKwkJdHdsX2xvYWRfc2dsKHR3X2RldiwgZnVsbF9jb21tYW5kX3BhY2tldCwgcmVxdWVzdF9pZCwgZG1hX2hhbmRsZSwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkKTsKKworCQltZW1jcHkodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdLCAmKHR3X2lvY3RsLT5maXJtd2FyZV9jb21tYW5kKSwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCisJCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCB0byB0aGUgY29udHJvbGxlciAqLworCQl0d2xfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJdGltZW91dCA9IFRXX0lPQ1RMX0NIUkRFVl9USU1FT1VUKkhaOworCisJCS8qIE5vdyB3YWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJCXRpbWVvdXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHdfZGV2LT5pb2N0bF93cXVldWUsIHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPT0gVFdfSU9DVExfQ0hSREVWX0ZSRUUsIHRpbWVvdXQpOworCisJCS8qIFdlIHRpbWVkIG91dCwgYW5kIGRpZG4ndCBnZXQgYW4gaW50ZXJydXB0ICovCisJCWlmICh0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkICE9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFKSB7CisJCQkvKiBOb3cgd2UgbmVlZCB0byByZXNldCB0aGUgYm9hcmQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXNhczogc2NzaSVkOiBXQVJOSU5HOiAoMHglMDJYOjB4JTA0WCk6IENoYXJhY3RlciBpb2N0bCAoMHgleCkgdGltZWQgb3V0LCByZXNldHRpbmcgY2FyZC5cbiIsCisJCQkgICAgICAgdHdfZGV2LT5ob3N0LT5ob3N0X25vLCBUV19EUklWRVIsIDB4NiwKKwkJCSAgICAgICBjbWQpOworCQkJcmV0dmFsID0gLUVJTzsKKwkJCXR3bF9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldiwgMSk7CisJCQlnb3RvIG91dDM7CisJCX0KKworCQkvKiBOb3cgY29weSBpbiB0aGUgY29tbWFuZCBwYWNrZXQgcmVzcG9uc2UgKi8KKwkJbWVtY3B5KCYodHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQpLCB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbcmVxdWVzdF9pZF0sIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKTsKKwkJCisJCS8qIE5vdyBjb21wbGV0ZSB0aGUgaW8gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19DT01QTEVURUQ7CisJCXR3bF9mcmVlX3JlcXVlc3RfaWQodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAtRU5PVFRZOworCQlnb3RvIG91dDM7CisJfQorCisJLyogTm93IGNvcHkgdGhlIGVudGlyZSByZXNwb25zZSB0byB1c2Vyc3BhY2UgKi8KKwlpZiAoY29weV90b191c2VyKGFyZ3AsIHR3X2lvY3RsLCBzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgKyBkcml2ZXJfY29tbWFuZC5idWZmZXJfbGVuZ3RoIC0gMSkgPT0gMCkKKwkJcmV0dmFsID0gMDsKK291dDM6CisJLyogTm93IGZyZWUgaW9jdGwgYnVmIG1lbW9yeSAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZ0d19kZXYtPnR3X3BjaV9kZXYtPmRldiwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkK3NpemVvZihUV19Jb2N0bF9CdWZfQXBhY2hlKSAtIDEsIGNwdV9hZGRyLCBkbWFfaGFuZGxlKTsKK291dDI6CisJbXV0ZXhfdW5sb2NrKCZ0d19kZXYtPmlvY3RsX2xvY2spOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2xfY2hyZGV2X2lvY3RsKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIG9wZW4gZm9yIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCitzdGF0aWMgaW50IHR3bF9jaHJkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3JfbnVtYmVyOworCWludCByZXR2YWwgPSAtRU5PREVWOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCXJldHZhbCA9IC1FQUNDRVM7CisJCWdvdG8gb3V0OworCX0KKworCWN5Y2xlX2tlcm5lbF9sb2NrKCk7CisJbWlub3JfbnVtYmVyID0gaW1pbm9yKGlub2RlKTsKKwlpZiAobWlub3JfbnVtYmVyID49IHR3bF9kZXZpY2VfZXh0ZW5zaW9uX2NvdW50KQorCQlnb3RvIG91dDsKKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2xfY2hyZGV2X29wZW4oKSAqLworCisvKiBGaWxlIG9wZXJhdGlvbnMgc3RydWN0IGZvciBjaGFyYWN0ZXIgZGV2aWNlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0d2xfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHR3bF9jaHJkZXZfaW9jdGwsCisJLm9wZW4JCT0gdHdsX2NocmRldl9vcGVuLAorCS5yZWxlYXNlCT0gTlVMTAorfTsKKworLyogVGhpcyBmdW5jdGlvbiBwYXNzZXMgc2Vuc2UgZGF0YSBmcm9tIGZpcm13YXJlIHRvIHNjc2kgbGF5ZXIgKi8KK3N0YXRpYyBpbnQgdHdsX2ZpbGxfc2Vuc2UoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgaSwgaW50IHJlcXVlc3RfaWQsIGludCBjb3B5X3NlbnNlLCBpbnQgcHJpbnRfaG9zdCkKK3sKKwlUV19Db21tYW5kX0FwYWNoZV9IZWFkZXIgKmhlYWRlcjsKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJdW5zaWduZWQgc2hvcnQgZXJyb3I7CisJY2hhciAqZXJyb3Jfc3RyOworCWludCByZXR2YWwgPSAxOworCisJaGVhZGVyID0gdHdfZGV2LT5zZW5zZV9idWZmZXJfdmlydFtpXTsKKwlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCisJLyogR2V0IGVtYmVkZGVkIGZpcm13YXJlIGVycm9yIHN0cmluZyAqLworCWVycm9yX3N0ciA9ICYoaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzY1tzdHJsZW4oaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzYykgKyAxXSk7CisKKwkvKiBEb24ndCBwcmludCBlcnJvciBmb3IgTG9naWNhbCB1bml0IG5vdCBzdXBwb3J0ZWQgZHVyaW5nIHJvbGxjYWxsICovCisJZXJyb3IgPSBsZTE2X3RvX2NwdShoZWFkZXItPnN0YXR1c19ibG9jay5lcnJvcik7CisJaWYgKChlcnJvciAhPSBUV19FUlJPUl9MT0dJQ0FMX1VOSVRfTk9UX1NVUFBPUlRFRCkgJiYgKGVycm9yICE9IFRXX0VSUk9SX1VOSVRfT0ZGTElORSkgJiYgKGVycm9yICE9IFRXX0VSUk9SX0lOVkFMSURfRklFTERfSU5fQ0RCKSkgeworCQlpZiAocHJpbnRfaG9zdCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXNhczogc2NzaSVkOiBFUlJPUjogKDB4JTAyWDoweCUwNFgpOiAlczolcy5cbiIsCisJCQkgICAgICAgdHdfZGV2LT5ob3N0LT5ob3N0X25vLAorCQkJICAgICAgIFRXX01FU1NBR0VfU09VUkNFX0NPTlRST0xMRVJfRVJST1IsCisJCQkgICAgICAgaGVhZGVyLT5zdGF0dXNfYmxvY2suZXJyb3IsCisJCQkgICAgICAgZXJyb3Jfc3RyLCAKKwkJCSAgICAgICBoZWFkZXItPmVycl9zcGVjaWZpY19kZXNjKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctc2FzOiBFUlJPUjogKDB4JTAyWDoweCUwNFgpOiAlczolcy5cbiIsCisJCQkgICAgICAgVFdfTUVTU0FHRV9TT1VSQ0VfQ09OVFJPTExFUl9FUlJPUiwKKwkJCSAgICAgICBoZWFkZXItPnN0YXR1c19ibG9jay5lcnJvciwKKwkJCSAgICAgICBlcnJvcl9zdHIsCisJCQkgICAgICAgaGVhZGVyLT5lcnJfc3BlY2lmaWNfZGVzYyk7CisJfQorCisJaWYgKGNvcHlfc2Vuc2UpIHsKKwkJbWVtY3B5KHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zZW5zZV9idWZmZXIsIGhlYWRlci0+c2Vuc2VfZGF0YSwgVFdfU0VOU0VfREFUQV9MRU5HVEgpOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVzdWx0ID0gKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZC5zdGF0dXMgPDwgMSk7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX2ZpbGxfc2Vuc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSB1cCBkZXZpY2UgZXh0ZW5zaW9uIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgdHdsX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJaWYgKHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFswXSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0d19kZXYtPnR3X3BjaV9kZXYsCisJCQkJICAgIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKlRXX1FfTEVOR1RILAorCQkJCSAgICB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbMF0sCisJCQkJICAgIHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c1swXSk7CisKKwlpZiAodHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0WzBdKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2RldiwKKwkJCQkgICAgVFdfU0VDVE9SX1NJWkUqVFdfUV9MRU5HVEgsCisJCQkJICAgIHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFswXSwKKwkJCQkgICAgdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzWzBdKTsKKworCWlmICh0d19kZXYtPnNlbnNlX2J1ZmZlcl92aXJ0WzBdKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2RldiwKKwkJCQkgICAgc2l6ZW9mKFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlcikqCisJCQkJICAgIFRXX1FfTEVOR1RILAorCQkJCSAgICB0d19kZXYtPnNlbnNlX2J1ZmZlcl92aXJ0WzBdLAorCQkJCSAgICB0d19kZXYtPnNlbnNlX2J1ZmZlcl9waHlzWzBdKTsKKworCWtmcmVlKHR3X2Rldi0+ZXZlbnRfcXVldWVbMF0pOworfSAvKiBFbmQgdHdsX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbigpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgcGFyYW1ldGVyIHRhYmxlIGVudHJpZXMgZnJvbSB0aGUgZmlybXdhcmUgKi8KK3N0YXRpYyB2b2lkICp0d2xfZ2V0X3BhcmFtKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQsIGludCB0YWJsZV9pZCwgaW50IHBhcmFtZXRlcl9pZCwgaW50IHBhcmFtZXRlcl9zaXplX2J5dGVzKQoreworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwlUV19QYXJhbV9BcGFjaGUgKnBhcmFtOworCXZvaWQgKnJldHZhbCA9IE5VTEw7CisKKwkvKiBTZXR1cCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChmdWxsX2NvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfQ29tbWFuZF9GdWxsKSk7CisJY29tbWFuZF9wYWNrZXQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5vbGRjb21tYW5kOworCisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfR0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSAgICAgICAgICAgICAgPSBUV19DT01NQU5EX1NJWkU7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgICAgICAgID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTZfb2Zmc2V0LmJsb2NrX2NvdW50ID0gY3B1X3RvX2xlMTYoMSk7CisKKwkvKiBOb3cgc2V0dXAgdGhlIHBhcmFtICovCisJcGFyYW0gPSAoVFdfUGFyYW1fQXBhY2hlICopdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgVFdfU0VDVE9SX1NJWkUpOworCXBhcmFtLT50YWJsZV9pZCA9IGNwdV90b19sZTE2KHRhYmxlX2lkIHwgMHg4MDAwKTsKKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gY3B1X3RvX2xlMTYocGFyYW1ldGVyX2lkKTsKKwlwYXJhbS0+cGFyYW1ldGVyX3NpemVfYnl0ZXMgPSBjcHVfdG9fbGUxNihwYXJhbWV0ZXJfc2l6ZV9ieXRlcyk7CisKKwljb21tYW5kX3BhY2tldC0+Ynl0ZThfb2Zmc2V0LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gVFdfQ1BVX1RPX1NHTCh0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3BoeXNbcmVxdWVzdF9pZF0pOworCWNvbW1hbmRfcGFja2V0LT5ieXRlOF9vZmZzZXQucGFyYW0uc2dsWzBdLmxlbmd0aCA9IFRXX0NQVV9UT19TR0woVFdfU0VDVE9SX1NJWkUpOworCisJLyogUG9zdCB0aGUgY29tbWFuZCBwYWNrZXQgdG8gdGhlIGJvYXJkICovCisJdHdsX3Bvc3RfY29tbWFuZF9wYWNrZXQodHdfZGV2LCByZXF1ZXN0X2lkKTsKKworCS8qIFBvbGwgZm9yIGNvbXBsZXRpb24gKi8KKwlpZiAodHdsX3BvbGxfcmVzcG9uc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAzMCkpCisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHg3LCAiTm8gdmFsaWQgcmVzcG9uc2UgZHVyaW5nIGdldCBwYXJhbSIpCisJZWxzZQorCQlyZXR2YWwgPSAodm9pZCAqKSYocGFyYW0tPmRhdGFbMF0pOworCisJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0lOSVRJQUw7CisKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX2dldF9wYXJhbSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGFuIGluaXRjb25uZWN0aW9uIGNvbW1hbmQgdG8gY29udHJvbGxlciAqLworc3RhdGljIGludCB0d2xfaW5pdGNvbm5lY3Rpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgbWVzc2FnZV9jcmVkaXRzLAorIAkJCSAgICAgIHUzMiBzZXRfZmVhdHVyZXMsIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZndfc3JsLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZndfYXJjaF9pZCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2Z3X2JyYW5jaCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2Z3X2J1aWxkLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0ICpmd19vbl9jdGxyX3NybCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqZndfb25fY3Rscl9hcmNoX2lkLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0ICpmd19vbl9jdGxyX2JyYW5jaCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqZndfb25fY3Rscl9idWlsZCwgCisJCQkgICAgICB1MzIgKmluaXRfY29ubmVjdF9yZXN1bHQpCit7CisJVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0OworCVRXX0luaXRjb25uZWN0ICp0d19pbml0Y29ubmVjdDsKKwlpbnQgcmVxdWVzdF9pZCA9IDAsIHJldHZhbCA9IDE7CisKKwkvKiBJbml0aWFsaXplIEluaXRDb25uZWN0aW9uIGNvbW1hbmQgcGFja2V0ICovCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwltZW1zZXQoZnVsbF9jb21tYW5kX3BhY2tldCwgMCwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCWZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5oZWFkZXJfZGVzYy5zaXplX2hlYWRlciA9IDEyODsKKwkKKwl0d19pbml0Y29ubmVjdCA9IChUV19Jbml0Y29ubmVjdCAqKSZmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm9sZGNvbW1hbmQ7CisJdHdfaW5pdGNvbm5lY3QtPm9wY29kZV9fcmVzZXJ2ZWQgPSBUV19PUFJFU19JTigwLCBUV19PUF9JTklUX0NPTk5FQ1RJT04pOworCXR3X2luaXRjb25uZWN0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwl0d19pbml0Y29ubmVjdC0+bWVzc2FnZV9jcmVkaXRzID0gY3B1X3RvX2xlMTYobWVzc2FnZV9jcmVkaXRzKTsKKwl0d19pbml0Y29ubmVjdC0+ZmVhdHVyZXMgPSBzZXRfZmVhdHVyZXM7CisKKwkvKiBUdXJuIG9uIDY0LWJpdCBzZ2wgc3VwcG9ydCBpZiB3ZSBuZWVkIHRvICovCisJdHdfaW5pdGNvbm5lY3QtPmZlYXR1cmVzIHw9IHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyAxIDogMDsKKworCXR3X2luaXRjb25uZWN0LT5mZWF0dXJlcyA9IGNwdV90b19sZTMyKHR3X2luaXRjb25uZWN0LT5mZWF0dXJlcyk7CisKKwlpZiAoc2V0X2ZlYXR1cmVzICYgVFdfRVhURU5ERURfSU5JVF9DT05ORUNUKSB7CisJCXR3X2luaXRjb25uZWN0LT5zaXplID0gVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFX0VYVEVOREVEOworCQl0d19pbml0Y29ubmVjdC0+Zndfc3JsID0gY3B1X3RvX2xlMTYoY3VycmVudF9md19zcmwpOworCQl0d19pbml0Y29ubmVjdC0+ZndfYXJjaF9pZCA9IGNwdV90b19sZTE2KGN1cnJlbnRfZndfYXJjaF9pZCk7CisJCXR3X2luaXRjb25uZWN0LT5md19icmFuY2ggPSBjcHVfdG9fbGUxNihjdXJyZW50X2Z3X2JyYW5jaCk7CisJCXR3X2luaXRjb25uZWN0LT5md19idWlsZCA9IGNwdV90b19sZTE2KGN1cnJlbnRfZndfYnVpbGQpOworCX0gZWxzZSAKKwkJdHdfaW5pdGNvbm5lY3QtPnNpemUgPSBUV19JTklUX0NPTU1BTkRfUEFDS0VUX1NJWkU7CisKKwkvKiBTZW5kIGNvbW1hbmQgcGFja2V0IHRvIHRoZSBib2FyZCAqLworCXR3bF9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCk7CisKKwkvKiBQb2xsIGZvciBjb21wbGV0aW9uICovCisJaWYgKHR3bF9wb2xsX3Jlc3BvbnNlKHR3X2RldiwgcmVxdWVzdF9pZCwgMzApKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHg4LCAiTm8gdmFsaWQgcmVzcG9uc2UgZHVyaW5nIGluaXQgY29ubmVjdGlvbiIpOworCX0gZWxzZSB7CisJCWlmIChzZXRfZmVhdHVyZXMgJiBUV19FWFRFTkRFRF9JTklUX0NPTk5FQ1QpIHsKKwkJCSpmd19vbl9jdGxyX3NybCA9IGxlMTZfdG9fY3B1KHR3X2luaXRjb25uZWN0LT5md19zcmwpOworCQkJKmZ3X29uX2N0bHJfYXJjaF9pZCA9IGxlMTZfdG9fY3B1KHR3X2luaXRjb25uZWN0LT5md19hcmNoX2lkKTsKKwkJCSpmd19vbl9jdGxyX2JyYW5jaCA9IGxlMTZfdG9fY3B1KHR3X2luaXRjb25uZWN0LT5md19icmFuY2gpOworCQkJKmZ3X29uX2N0bHJfYnVpbGQgPSBsZTE2X3RvX2NwdSh0d19pbml0Y29ubmVjdC0+ZndfYnVpbGQpOworCQkJKmluaXRfY29ubmVjdF9yZXN1bHQgPSBsZTMyX3RvX2NwdSh0d19pbml0Y29ubmVjdC0+cmVzdWx0KTsKKwkJfQorCQlyZXR2YWwgPSAwOworCX0KKworCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKKwl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19JTklUSUFMOworCisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3bF9pbml0Y29ubmVjdGlvbigpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBmaWVsZHMgb2YgYSBkZXZpY2UgZXh0ZW5zaW9uICovCitzdGF0aWMgaW50IHR3bF9pbml0aWFsaXplX2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCWludCBpLCByZXR2YWwgPSAxOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCBidWZmZXJzICovCisJaWYgKHR3bF9hbGxvY2F0ZV9tZW1vcnkodHdfZGV2LCBzaXplb2YoVFdfQ29tbWFuZF9GdWxsKSwgMCkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDksICJDb21tYW5kIHBhY2tldCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSBnZW5lcmljIGJ1ZmZlciAqLworCWlmICh0d2xfYWxsb2NhdGVfbWVtb3J5KHR3X2RldiwgVFdfU0VDVE9SX1NJWkUsIDEpKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhhLCAiR2VuZXJpYyBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgc2Vuc2UgYnVmZmVycyAqLworCWlmICh0d2xfYWxsb2NhdGVfbWVtb3J5KHR3X2Rldiwgc2l6ZW9mKFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciksIDIpKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhiLCAiU2Vuc2UgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbG9jYXRlIGV2ZW50IGluZm8gc3BhY2UgKi8KKwl0d19kZXYtPmV2ZW50X3F1ZXVlWzBdID0ga2NhbGxvYyhUV19RX0xFTkdUSCwgc2l6ZW9mKFRXX0V2ZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0d19kZXYtPmV2ZW50X3F1ZXVlWzBdKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhjLCAiRXZlbnQgaW5mbyBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJdHdfZGV2LT5ldmVudF9xdWV1ZVtpXSA9IChUV19FdmVudCAqKSgodW5zaWduZWQgY2hhciAqKXR3X2Rldi0+ZXZlbnRfcXVldWVbMF0gKyAoaSAqIHNpemVvZihUV19FdmVudCkpKTsKKwkJdHdfZGV2LT5mcmVlX3F1ZXVlW2ldID0gaTsKKwkJdHdfZGV2LT5zdGF0ZVtpXSA9IFRXX1NfSU5JVElBTDsKKwl9CisKKwl0d19kZXYtPmZyZWVfaGVhZCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5mcmVlX3RhaWwgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+ZXJyb3Jfc2VxdWVuY2VfaWQgPSAxOworCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSBUV19JT0NUTF9DSFJERVZfRlJFRTsKKworCW11dGV4X2luaXQoJnR3X2Rldi0+aW9jdGxfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHdfZGV2LT5pb2N0bF93cXVldWUpOworCisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX2luaXRpYWxpemVfZGV2aWNlX2V4dGVuc2lvbigpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwZXJmb3JtIGEgcGNpLWRtYSB1bm1hcCAqLworc3RhdGljIHZvaWQgdHdsX3VubWFwX3Njc2lfZGF0YShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdOworCisJaWYgKGNtZC0+U0NwLnBoYXNlID09IFRXX1BIQVNFX1NHTElTVCkKKwkJc2NzaV9kbWFfdW5tYXAoY21kKTsKK30gLyogRW5kIHR3bF91bm1hcF9zY3NpX2RhdGEoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIGF0dGVudGlvbiBpbnRlcnJ1cHRzICovCitzdGF0aWMgaW50IHR3bF9oYW5kbGVfYXR0ZW50aW9uX2ludGVycnVwdChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJaW50IHJldHZhbCA9IDE7CisJdTMyIHJlcXVlc3RfaWQsIGRvb3JiZWxsOworCisJLyogUmVhZCBkb29yYmVsbCBzdGF0dXMgKi8KKwlkb29yYmVsbCA9IHJlYWRsKFRXTF9IT0JEQl9SRUdfQUREUih0d19kZXYpKTsKKworCS8qIENoZWNrIGZvciBjb250cm9sbGVyIGVycm9ycyAqLworCWlmIChkb29yYmVsbCAmIFRXTF9ET09SQkVMTF9DT05UUk9MTEVSX0VSUk9SKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhkLCAiTWljcm9jb250cm9sbGVyIEVycm9yOiBjbGVhcmluZyIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW4gQUVOIGRyYWluICovCisJaWYgKGRvb3JiZWxsICYgVFdMX0RPT1JCRUxMX0FUVEVOVElPTl9JTlRFUlJVUFQpIHsKKwkJaWYgKCEodGVzdF9hbmRfc2V0X2JpdChUV19JTl9BVFRFTlRJT05fTE9PUCwgJnR3X2Rldi0+ZmxhZ3MpKSkgeworCQkJdHdsX2dldF9yZXF1ZXN0X2lkKHR3X2RldiwgJnJlcXVlc3RfaWQpOworCQkJaWYgKHR3bF9hZW5fcmVhZF9xdWV1ZSh0d19kZXYsIHJlcXVlc3RfaWQpKSB7CisJCQkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQkJCXR3bF9mcmVlX3JlcXVlc3RfaWQodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQljbGVhcl9iaXQoVFdfSU5fQVRURU5USU9OX0xPT1AsICZ0d19kZXYtPmZsYWdzKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHZhbCA9IDA7CitvdXQ6CisJLyogQ2xlYXIgZG9vcmJlbGwgaW50ZXJydXB0ICovCisJVFdMX0NMRUFSX0RCX0lOVEVSUlVQVCh0d19kZXYpOworCisJLyogTWFrZSBzdXJlIHRoZSBjbGVhciB3YXMgZmx1c2hlZCBieSByZWFkaW5nIGl0IGJhY2sgKi8KKwlyZWFkbChUV0xfSE9CREJDX1JFR19BRERSKHR3X2RldikpOworCisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3bF9oYW5kbGVfYXR0ZW50aW9uX2ludGVycnVwdCgpICovCisKKy8qIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0d2xfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWRldl9pbnN0YW5jZTsKKwlpbnQgaSwgaGFuZGxlZCA9IDAsIGVycm9yID0gMDsKKwlkbWFfYWRkcl90IG1mYSA9IDA7CisJdTMyIHJlZywgcmVnbCwgcmVnaCwgcmVzcG9uc2UsIHJlcXVlc3RfaWQgPSAwOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisKKwlzcGluX2xvY2sodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2spOworCisJLyogUmVhZCBob3N0IGludGVycnVwdCBzdGF0dXMgKi8KKwlyZWcgPSByZWFkbChUV0xfSElTVEFUX1JFR19BRERSKHR3X2RldikpOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBvdXIgaW50ZXJydXB0LCBvdGhlcndpc2UgYmFpbCAqLworCWlmICghKHJlZyAmIFRXTF9ISVNUQVRVU19WQUxJRF9JTlRFUlJVUFQpKQorCQlnb3RvIHR3bF9pbnRlcnJ1cHRfYmFpbDsKKworCWhhbmRsZWQgPSAxOworCisJLyogSWYgd2UgYXJlIHJlc2V0dGluZywgYmFpbCAqLworCWlmICh0ZXN0X2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpKQorCQlnb3RvIHR3bF9pbnRlcnJ1cHRfYmFpbDsKKworCS8qIEF0dGVudGlvbiBpbnRlcnJ1cHQgKi8KKwlpZiAocmVnICYgVFdMX0hJU1RBVFVTX0FUVEVOVElPTl9JTlRFUlJVUFQpIHsKKwkJaWYgKHR3bF9oYW5kbGVfYXR0ZW50aW9uX2ludGVycnVwdCh0d19kZXYpKSB7CisJCQlUV0xfTUFTS19JTlRFUlJVUFRTKHR3X2Rldik7CisJCQlnb3RvIHR3bF9pbnRlcnJ1cHRfYmFpbDsKKwkJfQorCX0KKworCS8qIFJlc3BvbnNlIGludGVycnVwdCAqLworCXdoaWxlIChyZWcgJiBUV0xfSElTVEFUVVNfUkVTUE9OU0VfSU5URVJSVVBUKSB7CisJCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSB7CisJCQlyZWdoID0gcmVhZGwoVFdMX0hPQlFQSF9SRUdfQUREUih0d19kZXYpKTsKKwkJCXJlZ2wgPSByZWFkbChUV0xfSE9CUVBMX1JFR19BRERSKHR3X2RldikpOworCQkJbWZhID0gKCh1NjQpcmVnaCA8PCAzMikgfCByZWdsOworCQl9IGVsc2UKKwkJCW1mYSA9IHJlYWRsKFRXTF9IT0JRUExfUkVHX0FERFIodHdfZGV2KSk7CisKKwkJZXJyb3IgPSAwOworCQlyZXNwb25zZSA9ICh1MzIpbWZhOworCisJCS8qIENoZWNrIGZvciBjb21tYW5kIHBhY2tldCBlcnJvciAqLworCQlpZiAoIVRXX05PVE1GQV9PVVQocmVzcG9uc2UpKSB7CisJCQlmb3IgKGk9MDtpPFRXX1FfTEVOR1RIO2krKykgeworCQkJCWlmICh0d19kZXYtPnNlbnNlX2J1ZmZlcl9waHlzW2ldID09IG1mYSkgeworCQkJCQlyZXF1ZXN0X2lkID0gbGUxNl90b19jcHUodHdfZGV2LT5zZW5zZV9idWZmZXJfdmlydFtpXS0+aGVhZGVyX2Rlc2MucmVxdWVzdF9pZCk7CisJCQkJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSAhPSBOVUxMKQorCQkJCQkJZXJyb3IgPSB0d2xfZmlsbF9zZW5zZSh0d19kZXYsIGksIHJlcXVlc3RfaWQsIDEsIDEpOworCQkJCQllbHNlIHsKKwkJCQkJCS8qIFNraXAgaW9jdGwgZXJyb3IgcHJpbnRzICovCisJCQkJCQlpZiAocmVxdWVzdF9pZCAhPSB0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkKQorCQkJCQkJCWVycm9yID0gdHdsX2ZpbGxfc2Vuc2UodHdfZGV2LCBpLCByZXF1ZXN0X2lkLCAwLCAxKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQltZW1jcHkodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdLCB0d19kZXYtPnNlbnNlX2J1ZmZlcl92aXJ0W2ldLCBzaXplb2YoVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyKSk7CisJCQkJCX0KKworCQkJCQkvKiBOb3cgcmUtcG9zdCB0aGUgc2Vuc2UgYnVmZmVyICovCisJCQkJCXdyaXRlbCgodTMyKSgodTY0KXR3X2Rldi0+c2Vuc2VfYnVmZmVyX3BoeXNbaV0gPj4gMzIpLCBUV0xfSE9CUVBIX1JFR19BRERSKHR3X2RldikpOworCQkJCQl3cml0ZWwoKHUzMil0d19kZXYtPnNlbnNlX2J1ZmZlcl9waHlzW2ldLCBUV0xfSE9CUVBMX1JFR19BRERSKHR3X2RldikpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJcmVxdWVzdF9pZCA9IFRXX1JFU0lEX09VVChyZXNwb25zZSk7CisKKwkJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKworCQkvKiBDaGVjayBmb3IgY29ycmVjdCBzdGF0ZSAqLworCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BPU1RFRCkgeworCQkJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdICE9IE5VTEwpIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZSwgIlJlY2VpdmVkIGEgcmVxdWVzdCBpZCB0aGF0IHdhc24ndCBwb3N0ZWQiKTsKKwkJCQlUV0xfTUFTS19JTlRFUlJVUFRTKHR3X2Rldik7CisJCQkJZ290byB0d2xfaW50ZXJydXB0X2JhaWw7CisJCQl9CisJCX0KKworCQkvKiBDaGVjayBmb3IgaW50ZXJuYWwgY29tbWFuZCBjb21wbGV0aW9uICovCisJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCQlpZiAocmVxdWVzdF9pZCAhPSB0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkKSB7CisJCQkJaWYgKHR3bF9hZW5fY29tcGxldGUodHdfZGV2LCByZXF1ZXN0X2lkKSkKKwkJCQkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweGYsICJFcnJvciBjb21wbGV0aW5nIEFFTiBkdXJpbmcgYXR0ZW50aW9uIGludGVycnVwdCIpOworCQkJfSBlbHNlIHsKKwkJCQl0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID0gVFdfSU9DVExfQ0hSREVWX0ZSRUU7CisJCQkJd2FrZV91cCgmdHdfZGV2LT5pb2N0bF93cXVldWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJY21kID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF07CisKKwkJCWlmICghZXJyb3IpCisJCQkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCQorCQkJLyogUmVwb3J0IHJlc2lkdWFsIGJ5dGVzIGZvciBzaW5nbGUgc2dsICovCisJCQlpZiAoKHNjc2lfc2dfY291bnQoY21kKSA8PSAxKSAmJiAoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnN0YXR1cyA9PSAwKSkgeworCQkJCWlmIChmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQuc2dfbGlzdFswXS5sZW5ndGggPCBzY3NpX2J1ZmZsZW4odHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0pKQorCQkJCQlzY3NpX3NldF9yZXNpZChjbWQsIHNjc2lfYnVmZmxlbihjbWQpIC0gZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnNnX2xpc3RbMF0ubGVuZ3RoKTsKKwkJCX0KKworCQkJLyogTm93IGNvbXBsZXRlIHRoZSBpbyAqLworCQkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQkJdHdsX2ZyZWVfcmVxdWVzdF9pZCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnNjc2lfZG9uZSh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSk7CisJCQl0d2xfdW5tYXBfc2NzaV9kYXRhKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCX0KKworCQkvKiBDaGVjayBmb3IgYW5vdGhlciByZXNwb25zZSBpbnRlcnJ1cHQgKi8KKwkJcmVnID0gcmVhZGwoVFdMX0hJU1RBVF9SRUdfQUREUih0d19kZXYpKTsKKwl9CisKK3R3bF9pbnRlcnJ1cHRfYmFpbDoKKwlzcGluX3VubG9jayh0d19kZXYtPmhvc3QtPmhvc3RfbG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9IC8qIEVuZCB0d2xfaW50ZXJydXB0KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgZm9yIGEgcmVnaXN0ZXIgY2hhbmdlICovCitzdGF0aWMgaW50IHR3bF9wb2xsX3JlZ2lzdGVyKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2Rldiwgdm9pZCAqcmVnLCB1MzIgdmFsdWUsIHUzMiByZXN1bHQsIGludCBzZWNvbmRzKQoreworCXVuc2lnbmVkIGxvbmcgYmVmb3JlOworCWludCByZXR2YWwgPSAxOworCXUzMiByZWdfdmFsdWU7CisKKwlyZWdfdmFsdWUgPSByZWFkbChyZWcpOworCWJlZm9yZSA9IGppZmZpZXM7CisKKyAgICAgICAgd2hpbGUgKChyZWdfdmFsdWUgJiB2YWx1ZSkgIT0gcmVzdWx0KSB7CisJCXJlZ192YWx1ZSA9IHJlYWRsKHJlZyk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKwkJbXNsZWVwKDUwKTsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX3BvbGxfcmVnaXN0ZXIoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHR3bF9yZXNldF9zZXF1ZW5jZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBzb2Z0X3Jlc2V0KQoreworCWludCByZXR2YWwgPSAxOworCWludCBpID0gMDsKKwl1MzIgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBmd19vbl9jdGxyX3NybCA9IDAsIGZ3X29uX2N0bHJfYXJjaF9pZCA9IDA7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9icmFuY2ggPSAwLCBmd19vbl9jdGxyX2J1aWxkID0gMDsKKwl1MzIgaW5pdF9jb25uZWN0X3Jlc3VsdCA9IDA7CisJaW50IHRyaWVzID0gMDsKKwlpbnQgZG9fc29mdF9yZXNldCA9IHNvZnRfcmVzZXQ7CisKKwl3aGlsZSAodHJpZXMgPCBUV19NQVhfUkVTRVRfVFJJRVMpIHsKKwkJLyogRG8gYSBzb2Z0IHJlc2V0IGlmIG9uZSBpcyBuZWVkZWQgKi8KKwkJaWYgKGRvX3NvZnRfcmVzZXQpIHsKKwkJCVRXTF9TT0ZUX1JFU0VUKHR3X2Rldik7CisKKwkJCS8qIE1ha2Ugc3VyZSBjb250cm9sbGVyIGlzIGluIGEgZ29vZCBzdGF0ZSAqLworCQkJaWYgKHR3bF9wb2xsX3JlZ2lzdGVyKHR3X2RldiwgVFdMX1NDUlBEM19SRUdfQUREUih0d19kZXYpLCBUV0xfQ09OVFJPTExFUl9SRUFEWSwgMHgwLCAzMCkpIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTAsICJDb250cm9sbGVyIG5ldmVyIHdlbnQgbm9uLXJlYWR5IGR1cmluZyByZXNldCBzZXF1ZW5jZSIpOworCQkJCXRyaWVzKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAodHdsX3BvbGxfcmVnaXN0ZXIodHdfZGV2LCBUV0xfU0NSUEQzX1JFR19BRERSKHR3X2RldiksIFRXTF9DT05UUk9MTEVSX1JFQURZLCBUV0xfQ09OVFJPTExFUl9SRUFEWSwgNjApKSB7CisJCQkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDExLCAiQ29udHJvbGxlciBub3QgcmVhZHkgZHVyaW5nIHJlc2V0IHNlcXVlbmNlIik7CisJCQkJdHJpZXMrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIEluaXRjb25uZWN0ICovCisJCWlmICh0d2xfaW5pdGNvbm5lY3Rpb24odHdfZGV2LCBUV19JTklUX01FU1NBR0VfQ1JFRElUUywKKwkJCQkgICAgICAgVFdfRVhURU5ERURfSU5JVF9DT05ORUNULCBUV19DVVJSRU5UX0RSSVZFUl9TUkwsCisJCQkJICAgICAgIFRXXzk3NTBfQVJDSF9JRCwgVFdfQ1VSUkVOVF9EUklWRVJfQlJBTkNILAorCQkJCSAgICAgICBUV19DVVJSRU5UX0RSSVZFUl9CVUlMRCwgJmZ3X29uX2N0bHJfc3JsLAorCQkJCSAgICAgICAmZndfb25fY3Rscl9hcmNoX2lkLCAmZndfb25fY3Rscl9icmFuY2gsCisJCQkJICAgICAgICZmd19vbl9jdGxyX2J1aWxkLCAmaW5pdF9jb25uZWN0X3Jlc3VsdCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxMiwgIkluaXRjb25uZWN0aW9uIGZhaWxlZCB3aGlsZSBjaGVja2luZyBTUkwiKTsKKwkJCWRvX3NvZnRfcmVzZXQgPSAxOworCQkJdHJpZXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTG9hZCBzZW5zZSBidWZmZXJzICovCisJCXdoaWxlIChpIDwgVFdfUV9MRU5HVEgpIHsKKwkJCXdyaXRlbCgodTMyKSgodTY0KXR3X2Rldi0+c2Vuc2VfYnVmZmVyX3BoeXNbaV0gPj4gMzIpLCBUV0xfSE9CUVBIX1JFR19BRERSKHR3X2RldikpOworCQkJd3JpdGVsKCh1MzIpdHdfZGV2LT5zZW5zZV9idWZmZXJfcGh5c1tpXSwgVFdMX0hPQlFQTF9SRUdfQUREUih0d19kZXYpKTsKKworCQkJLyogQ2hlY2sgc3RhdHVzIGZvciBvdmVyLXJ1biBhZnRlciBlYWNoIHdyaXRlICovCisJCQlzdGF0dXMgPSByZWFkbChUV0xfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQkJaWYgKCEoc3RhdHVzICYgVFdMX1NUQVRVU19PVkVSUlVOX1NVQk1JVCkpCisJCQkgICAgaSsrOworCQl9CisKKwkJLyogTm93IGNoZWNrIHN0YXR1cyAqLworCQlzdGF0dXMgPSByZWFkbChUV0xfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQlpZiAoc3RhdHVzKSB7CisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTMsICJCYWQgY29udHJvbGxlciBzdGF0dXMgYWZ0ZXIgbG9hZGluZyBzZW5zZSBidWZmZXJzIik7CisJCQlkb19zb2Z0X3Jlc2V0ID0gMTsKKwkJCXRyaWVzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIERyYWluIHRoZSBBRU4gcXVldWUgKi8KKwkJaWYgKHR3bF9hZW5fZHJhaW5fcXVldWUodHdfZGV2LCBzb2Z0X3Jlc2V0KSkgeworCQkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDE0LCAiQUVOIGRyYWluIGZhaWxlZCBkdXJpbmcgcmVzZXQgc2VxdWVuY2UiKTsKKwkJCWRvX3NvZnRfcmVzZXQgPSAxOworCQkJdHJpZXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTG9hZCByZXN0IG9mIGNvbXBhdGliaWxpdHkgc3RydWN0ICovCisJCXN0cm5jcHkodHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfdmVyc2lvbiwgVFdfRFJJVkVSX1ZFUlNJT04sIHN0cmxlbihUV19EUklWRVJfVkVSU0lPTikpOworCQl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmRyaXZlcl9zcmxfaGlnaCA9IFRXX0NVUlJFTlRfRFJJVkVSX1NSTDsKKwkJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfYnJhbmNoX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CUkFOQ0g7CisJCXR3X2Rldi0+dHdfY29tcGF0X2luZm8uZHJpdmVyX2J1aWxkX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CVUlMRDsKKwkJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfc3JsX2xvdyA9IFRXX0JBU0VfRldfU1JMOworCQl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmRyaXZlcl9icmFuY2hfbG93ID0gVFdfQkFTRV9GV19CUkFOQ0g7CisJCXR3X2Rldi0+dHdfY29tcGF0X2luZm8uZHJpdmVyX2J1aWxkX2xvdyA9IFRXX0JBU0VfRldfQlVJTEQ7CisJCXR3X2Rldi0+dHdfY29tcGF0X2luZm8uZndfb25fY3Rscl9zcmwgPSBmd19vbl9jdGxyX3NybDsKKwkJdHdfZGV2LT50d19jb21wYXRfaW5mby5md19vbl9jdGxyX2JyYW5jaCA9IGZ3X29uX2N0bHJfYnJhbmNoOworCQl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmZ3X29uX2N0bHJfYnVpbGQgPSBmd19vbl9jdGxyX2J1aWxkOworCisJCS8qIElmIHdlIGdvdCBoZXJlLCBjb250cm9sbGVyIGlzIGluIGEgZ29vZCBzdGF0ZSAqLworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3bF9yZXNldF9zZXF1ZW5jZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCBhIGRldmljZSBleHRlbnNpb24gKi8KK3N0YXRpYyBpbnQgdHdsX3Jlc2V0X2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgaW9jdGxfcmVzZXQpCit7CisJaW50IGkgPSAwLCByZXR2YWwgPSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJLyogQmxvY2sgU0NTSSByZXF1ZXN0cyB3aGlsZSB3ZSBhcmUgcmVzZXR0aW5nICovCisJaWYgKGlvY3RsX3Jlc2V0KQorCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKHR3X2Rldi0+aG9zdCk7CisKKwlzZXRfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJVFdMX01BU0tfSU5URVJSVVBUUyh0d19kZXYpOworCVRXTF9DTEVBUl9EQl9JTlRFUlJVUFQodHdfZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBBYm9ydCBhbGwgcmVxdWVzdHMgdGhhdCBhcmUgaW4gcHJvZ3Jlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFdfUV9MRU5HVEg7IGkrKykgeworCQlpZiAoKHR3X2Rldi0+c3RhdGVbaV0gIT0gVFdfU19GSU5JU0hFRCkgJiYKKwkJICAgICh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfSU5JVElBTCkgJiYKKwkJICAgICh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfQ09NUExFVEVEKSkgeworCQkJaWYgKHR3X2Rldi0+c3JiW2ldKSB7CisJCQkJdHdfZGV2LT5zcmJbaV0tPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJCXR3X2Rldi0+c3JiW2ldLT5zY3NpX2RvbmUodHdfZGV2LT5zcmJbaV0pOworCQkJCXR3bF91bm1hcF9zY3NpX2RhdGEodHdfZGV2LCBpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlc2V0IHF1ZXVlcyBhbmQgY291bnRzICovCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJdHdfZGV2LT5mcmVlX3F1ZXVlW2ldID0gaTsKKwkJdHdfZGV2LT5zdGF0ZVtpXSA9IFRXX1NfSU5JVElBTDsKKwl9CisJdHdfZGV2LT5mcmVlX2hlYWQgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+ZnJlZV90YWlsID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50ID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmICh0d2xfcmVzZXRfc2VxdWVuY2UodHdfZGV2LCAxKSkKKwkJZ290byBvdXQ7CisKKwlUV0xfVU5NQVNLX0lOVEVSUlVQVFModHdfZGV2KTsKKworCWNsZWFyX2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOworCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSBUV19JT0NUTF9DSFJERVZfRlJFRTsKKworCXJldHZhbCA9IDA7CitvdXQ6CisJaWYgKGlvY3RsX3Jlc2V0KQorCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHModHdfZGV2LT5ob3N0KTsKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX3Jlc2V0X2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmNpdG9uIHJldHVybnMgdW5pdCBnZW9tZXRyeSBpbiBjeWxpbmRlcnMvaGVhZHMvc2VjdG9ycyAqLworc3RhdGljIGludCB0d2xfc2NzaV9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKK3sKKwlpbnQgaGVhZHMsIHNlY3RvcnM7CisJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2OworCisJdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmIChjYXBhY2l0eSA+PSAweDIwMDAwMCkgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCX0gZWxzZSB7CisJCWhlYWRzID0gNjQ7CisJCXNlY3RvcnMgPSAzMjsKKwl9CisKKwlnZW9tWzBdID0gaGVhZHM7CisJZ2VvbVsxXSA9IHNlY3RvcnM7CisJZ2VvbVsyXSA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzICogc2VjdG9ycyk7IC8qIGN5bGluZGVycyAqLworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d2xfc2NzaV9iaW9zcGFyYW0oKSAqLworCisvKiBUaGlzIGlzIHRoZSBuZXcgc2NzaSBlaCByZXNldCBmdW5jdGlvbiAqLworc3RhdGljIGludCB0d2xfc2NzaV9laF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSBOVUxMOworCWludCByZXR2YWwgPSBGQUlMRUQ7CisKKwl0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJdHdfZGV2LT5udW1fcmVzZXRzKys7CisKKwlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIFNDcG50LT5kZXZpY2UsCisJCSJXQVJOSU5HOiAoMHglMDJYOjB4JTA0WCk6IENvbW1hbmQgKDB4JXgpIHRpbWVkIG91dCwgcmVzZXR0aW5nIGNhcmQuXG4iLAorCQlUV19EUklWRVIsIDB4MmMsIFNDcG50LT5jbW5kWzBdKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGlzc3VpbmcgYW4gaW9jdGwgb3IgcmVzZXR0aW5nIGZyb20gaW9jdGwgKi8KKwltdXRleF9sb2NrKCZ0d19kZXYtPmlvY3RsX2xvY2spOworCisJLyogTm93IHJlc2V0IHRoZSBjYXJkIGFuZCBzb21lIG9mIHRoZSBkZXZpY2UgZXh0ZW5zaW9uIGRhdGEgKi8KKwlpZiAodHdsX3Jlc2V0X2RldmljZV9leHRlbnNpb24odHdfZGV2LCAwKSkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTUsICJDb250cm9sbGVyIHJlc2V0IGZhaWxlZCBkdXJpbmcgc2NzaSBob3N0IHJlc2V0Iik7CisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IFNVQ0NFU1M7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0d19kZXYtPmlvY3RsX2xvY2spOworCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2xfc2NzaV9laF9yZXNldCgpICovCisKKy8qIFRoaXMgaXMgdGhlIG1haW4gc2NzaSBxdWV1ZSBmdW5jdGlvbiB0byBoYW5kbGUgc2NzaSBvcGNvZGVzICovCitzdGF0aWMgaW50IHR3bF9zY3NpX3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlpbnQgcmVxdWVzdF9pZCwgcmV0dmFsOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBJZiB3ZSBhcmUgcmVzZXR0aW5nIGR1ZSB0byB0aW1lZCBvdXQgaW9jdGwsIHJlcG9ydCBhcyBidXN5ICovCisJaWYgKHRlc3RfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncykpIHsKKwkJcmV0dmFsID0gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2F2ZSBkb25lIGZ1bmN0aW9uIGludG8gc2NzaV9jbW5kIHN0cnVjdCAqLworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCQkKKwkvKiBHZXQgYSBmcmVlIHJlcXVlc3QgaWQgKi8KKwl0d2xfZ2V0X3JlcXVlc3RfaWQodHdfZGV2LCAmcmVxdWVzdF9pZCk7CisKKwkvKiBTYXZlIHRoZSBzY3NpIGNvbW1hbmQgZm9yIHVzZSBieSB0aGUgSVNSICovCisJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPSBTQ3BudDsKKworCS8qIEluaXRpYWxpemUgcGhhc2UgdG8gemVybyAqLworCVNDcG50LT5TQ3AucGhhc2UgPSBUV19QSEFTRV9JTklUSUFMOworCisJcmV0dmFsID0gdHdsX3Njc2lvcF9leGVjdXRlX3Njc2kodHdfZGV2LCByZXF1ZXN0X2lkLCBOVUxMLCAwLCBOVUxMKTsKKwlpZiAocmV0dmFsKSB7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdsX2ZyZWVfcmVxdWVzdF9pZCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlTQ3BudC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisJCWRvbmUoU0NwbnQpOworCQlyZXR2YWwgPSAwOworCX0KK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdsX3Njc2lfcXVldWUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHNodXQgZG93biAqLworc3RhdGljIHZvaWQgX190d2xfc2h1dGRvd24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCVRXTF9NQVNLX0lOVEVSUlVQVFModHdfZGV2KTsKKworCS8qIEZyZWUgdXAgdGhlIElSUSAqLworCWZyZWVfaXJxKHR3X2Rldi0+dHdfcGNpX2Rldi0+aXJxLCB0d19kZXYpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctc2FzOiBTaHV0dGluZyBkb3duIGhvc3QgJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCisJLyogVGVsbCB0aGUgY2FyZCB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLworCWlmICh0d2xfaW5pdGNvbm5lY3Rpb24odHdfZGV2LCAxLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTYsICJDb25uZWN0aW9uIHNodXRkb3duIGZhaWxlZCIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXNhczogU2h1dGRvd24gY29tcGxldGUuXG4iKTsKKwl9CisKKwkvKiBDbGVhciBkb29yYmVsbCBpbnRlcnJ1cHQganVzdCBiZWZvcmUgZXhpdCAqLworCVRXTF9DTEVBUl9EQl9JTlRFUlJVUFQodHdfZGV2KTsKK30gLyogRW5kIF9fdHdsX3NodXRkb3duKCkgKi8KKworLyogV3JhcHBlciBmb3IgX190d2xfc2h1dGRvd24gKi8KK3N0YXRpYyB2b2lkIHR3bF9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldjsKKworCWlmICghaG9zdCkKKwkJcmV0dXJuOworCisJdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilob3N0LT5ob3N0ZGF0YTsKKworCWlmICh0d19kZXYtPm9ubGluZSkgCisJCV9fdHdsX3NodXRkb3duKHR3X2Rldik7Cit9IC8qIEVuZCB0d2xfc2h1dGRvd24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdW5pdCBzZXR0aW5ncyB3aGVuIGEgdW5pdCBpcyBjb21pbmcgb24tbGluZSAqLworc3RhdGljIGludCB0d2xfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwkvKiBGb3JjZSA2MCBzZWNvbmQgdGltZW91dCAqLworCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkZXYtPnJlcXVlc3RfcXVldWUsIDYwICogSFopOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d2xfc2xhdmVfY29uZmlndXJlKCkgKi8KKworLyogc2NzaV9ob3N0X3RlbXBsYXRlIGluaXRpYWxpemVyICovCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICIzdy1zYXMiLAorCS5xdWV1ZWNvbW1hbmQJCT0gdHdsX3Njc2lfcXVldWUsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHR3bF9zY3NpX2VoX3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IHR3bF9zY3NpX2Jpb3NwYXJhbSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gdHdsX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2FuX3F1ZXVlCQk9IFRXX1FfTEVOR1RILTIsCisJLnNsYXZlX2NvbmZpZ3VyZQk9IHR3bF9zbGF2ZV9jb25maWd1cmUsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBUV19MSUJFUkFUT1JfTUFYX1NHTF9MRU5HVEgsCisJLm1heF9zZWN0b3JzCQk9IFRXX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBUV19NQVhfQ01EU19QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuc2hvc3RfYXR0cnMJCT0gdHdsX2hvc3RfYXR0cnMsCisJLmVtdWxhdGVkCQk9IDEKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9iZSBhbmQgaW5pdGlhbGl6ZSBhIGNhcmQgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHR3bF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXY7CisJaW50IHJldHZhbCA9IC1FTk9ERVY7CisJaW50ICpwdHJfcGh5Y291bnQsIHBoeWNvdW50PTA7CisKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCVRXX1BSSU5USyhob3N0LCBUV19EUklWRVIsIDB4MTcsICJGYWlsZWQgdG8gZW5hYmxlIHBjaSBkZXZpY2UiKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3RyeV9zZXRfbXdpKHBkZXYpOworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkKKwkgICAgfHwgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKQorCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKQorCQkgICAgfHwgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7CisJCQlUV19QUklOVEsoaG9zdCwgVFdfRFJJVkVSLCAweDE4LCAiRmFpbGVkIHRvIHNldCBkbWEgbWFzayIpOworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCQl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkcml2ZXJfdGVtcGxhdGUsIHNpemVvZihUV19EZXZpY2VfRXh0ZW5zaW9uKSk7CisJaWYgKCFob3N0KSB7CisJCVRXX1BSSU5USyhob3N0LCBUV19EUklWRVIsIDB4MTksICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgZXh0ZW5zaW9uIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKwl0d19kZXYgPSBzaG9zdF9wcml2KGhvc3QpOworCisJLyogU2F2ZSB2YWx1ZXMgdG8gZGV2aWNlIGV4dGVuc2lvbiAqLworCXR3X2Rldi0+aG9zdCA9IGhvc3Q7CisJdHdfZGV2LT50d19wY2lfZGV2ID0gcGRldjsKKworCWlmICh0d2xfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldikpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFhLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGV2aWNlIGV4dGVuc2lvbiIpOworCQlnb3RvIG91dF9mcmVlX2RldmljZV9leHRlbnNpb247CisJfQorCisJLyogUmVxdWVzdCBJTyByZWdpb25zICovCisJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiM3ctc2FzIik7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MWIsICJGYWlsZWQgdG8gZ2V0IG1lbSByZWdpb24iKTsKKwkJZ290byBvdXRfZnJlZV9kZXZpY2VfZXh0ZW5zaW9uOworCX0KKworCS8qIFNhdmUgYmFzZSBhZGRyZXNzLCB1c2UgcmVnaW9uIDEgKi8KKwl0d19kZXYtPmJhc2VfYWRkciA9IHBjaV9pb21hcChwZGV2LCAxLCAwKTsKKwlpZiAoIXR3X2Rldi0+YmFzZV9hZGRyKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxYywgIkZhaWxlZCB0byBpb3JlbWFwIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIGNhcmQgKi8KKwlUV0xfTUFTS19JTlRFUlJVUFRTKHR3X2Rldik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjYXJkICovCisJaWYgKHR3bF9yZXNldF9zZXF1ZW5jZSh0d19kZXYsIDApKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxZCwgIkNvbnRyb2xsZXIgcmVzZXQgZmFpbGVkIGR1cmluZyBwcm9iZSIpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCS8qIFNldCBob3N0IHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwlob3N0LT5tYXhfaWQgPSBUV19NQVhfVU5JVFM7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSBUV19NQVhfQ0RCX0xFTjsKKwlob3N0LT5tYXhfbHVuID0gVFdfTUFYX0xVTlM7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCisJLyogUmVnaXN0ZXIgdGhlIGNhcmQgd2l0aCB0aGUga2VybmVsIFNDU0kgbGF5ZXIgKi8KKwlyZXR2YWwgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZwZGV2LT5kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFlLCAic2NzaSBhZGQgaG9zdCBmYWlsZWQiKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy1zYXM6IHNjc2klZDogRm91bmQgYW4gTFNJIDN3YXJlICVzIENvbnRyb2xsZXIgYXQgMHglbGx4LCBJUlE6ICVkLlxuIiwKKwkgICAgICAgaG9zdC0+aG9zdF9ubywKKwkgICAgICAgKGNoYXIgKil0d2xfZ2V0X3BhcmFtKHR3X2RldiwgMSwgVFdfVkVSU0lPTl9UQUJMRSwKKwkJCQkgICAgIFRXX1BBUkFNX01PREVMLCBUV19QQVJBTV9NT0RFTF9MRU5HVEgpLAorCSAgICAgICAodTY0KXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwgcGRldi0+aXJxKTsKKworCXB0cl9waHljb3VudCA9IHR3bF9nZXRfcGFyYW0odHdfZGV2LCAyLCBUV19QQVJBTV9QSFlfU1VNTUFSWV9UQUJMRSwKKwkJCQkgICAgIFRXX1BBUkFNX1BIWUNPVU5ULCBUV19QQVJBTV9QSFlDT1VOVF9MRU5HVEgpOworCWlmIChwdHJfcGh5Y291bnQpCisJCXBoeWNvdW50ID0gbGUzMl90b19jcHUoKihpbnQgKilwdHJfcGh5Y291bnQpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctc2FzOiBzY3NpJWQ6IEZpcm13YXJlICVzLCBCSU9TICVzLCBQaHlzOiAlZC5cbiIsCisJICAgICAgIGhvc3QtPmhvc3Rfbm8sCisJICAgICAgIChjaGFyICopdHdsX2dldF9wYXJhbSh0d19kZXYsIDEsIFRXX1ZFUlNJT05fVEFCTEUsCisJCQkJICAgICBUV19QQVJBTV9GV1ZFUiwgVFdfUEFSQU1fRldWRVJfTEVOR1RIKSwKKwkgICAgICAgKGNoYXIgKil0d2xfZ2V0X3BhcmFtKHR3X2RldiwgMiwgVFdfVkVSU0lPTl9UQUJMRSwKKwkJCQkgICAgIFRXX1BBUkFNX0JJT1NWRVIsIFRXX1BBUkFNX0JJT1NWRVJfTEVOR1RIKSwKKwkgICAgICAgcGh5Y291bnQpOworCisJLyogVHJ5IHRvIGVuYWJsZSBNU0kgKi8KKwlpZiAodXNlX21zaSAmJiAhcGNpX2VuYWJsZV9tc2kocGRldikpCisJCXNldF9iaXQoVFdfVVNJTkdfTVNJLCAmdHdfZGV2LT5mbGFncyk7CisKKwkvKiBOb3cgc2V0dXAgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0d2xfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgIjN3LXNhcyIsIHR3X2Rldik7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MWYsICJFcnJvciByZXF1ZXN0aW5nIElSUSIpOworCQlnb3RvIG91dF9yZW1vdmVfaG9zdDsKKwl9CisKKwl0d2xfZGV2aWNlX2V4dGVuc2lvbl9saXN0W3R3bF9kZXZpY2VfZXh0ZW5zaW9uX2NvdW50XSA9IHR3X2RldjsKKwl0d2xfZGV2aWNlX2V4dGVuc2lvbl9jb3VudCsrOworCisJLyogUmUtZW5hYmxlIGludGVycnVwdHMgb24gdGhlIGNhcmQgKi8KKwlUV0xfVU5NQVNLX0lOVEVSUlVQVFModHdfZGV2KTsKKwkKKwkvKiBGaW5hbGx5LCBzY2FuIHRoZSBob3N0ICovCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwkvKiBBZGQgc3lzZnMgYmluYXJ5IGZpbGVzICovCisJaWYgKHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZGV2LmtvYmosICZ0d2xfc3lzZnNfYWVuX3JlYWRfYXR0cikpCisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMCwgIkZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYmluYXJ5IGZpbGU6IDN3YXJlX2Flbl9yZWFkIik7CisJaWYgKHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZGV2LmtvYmosICZ0d2xfc3lzZnNfY29tcGF0X2luZm9fYXR0cikpCisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMSwgIkZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYmluYXJ5IGZpbGU6IDN3YXJlX2NvbXBhdF9pbmZvIik7CisKKwlpZiAodHdsX21ham9yID09IC0xKSB7CisJCWlmICgodHdsX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2ICgwLCAidHdsIiwgJnR3bF9mb3BzKSkgPCAwKQorCQkJVFdfUFJJTlRLKGhvc3QsIFRXX0RSSVZFUiwgMHgyMiwgIkZhaWxlZCB0byByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIik7CisJfQorCXR3X2Rldi0+b25saW5lID0gMTsKKwlyZXR1cm4gMDsKKworb3V0X3JlbW92ZV9ob3N0OgorCWlmICh0ZXN0X2JpdChUV19VU0lOR19NU0ksICZ0d19kZXYtPmZsYWdzKSkKKwkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CitvdXRfaW91bm1hcDoKKwlpb3VubWFwKHR3X2Rldi0+YmFzZV9hZGRyKTsKK291dF9yZWxlYXNlX21lbV9yZWdpb246CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9mcmVlX2RldmljZV9leHRlbnNpb246CisJdHdsX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3bF9wcm9iZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhIGRldmljZSAqLworc3RhdGljIHZvaWQgdHdsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldjsKKworCWlmICghaG9zdCkKKwkJcmV0dXJuOworCisJdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilob3N0LT5ob3N0ZGF0YTsKKworCWlmICghdHdfZGV2LT5vbmxpbmUpCisJCXJldHVybjsKKworCS8qIFJlbW92ZSBzeXNmcyBiaW5hcnkgZmlsZXMgKi8KKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2Rldi5rb2JqLCAmdHdsX3N5c2ZzX2Flbl9yZWFkX2F0dHIpOworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZGV2LmtvYmosICZ0d2xfc3lzZnNfY29tcGF0X2luZm9fYXR0cik7CisKKwlzY3NpX3JlbW92ZV9ob3N0KHR3X2Rldi0+aG9zdCk7CisKKwkvKiBVbnJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgKi8KKwlpZiAodHdsX21ham9yID49IDApIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYodHdsX21ham9yLCAidHdsIik7CisJCXR3bF9tYWpvciA9IC0xOworCX0KKworCS8qIFNodXRkb3duIHRoZSBjYXJkICovCisJX190d2xfc2h1dGRvd24odHdfZGV2KTsKKworCS8qIERpc2FibGUgTVNJIGlmIGVuYWJsZWQgKi8KKwlpZiAodGVzdF9iaXQoVFdfVVNJTkdfTVNJLCAmdHdfZGV2LT5mbGFncykpCisJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKworCS8qIEZyZWUgSU8gcmVtYXBwaW5nICovCisJaW91bm1hcCh0d19kZXYtPmJhc2VfYWRkcik7CisKKwkvKiBGcmVlIHVwIHRoZSBtZW0gcmVnaW9uICovCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCS8qIEZyZWUgdXAgZGV2aWNlIGV4dGVuc2lvbiByZXNvdXJjZXMgKi8KKwl0d2xfZnJlZV9kZXZpY2VfZXh0ZW5zaW9uKHR3X2Rldik7CisKKwlzY3NpX2hvc3RfcHV0KHR3X2Rldi0+aG9zdCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXR3bF9kZXZpY2VfZXh0ZW5zaW9uX2NvdW50LS07Cit9IC8qIEVuZCB0d2xfcmVtb3ZlKCkgKi8KKworI2lmZGVmIENPTkZJR19QTQorLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gUENJIHN1c3BlbmQgKi8KK3N0YXRpYyBpbnQgdHdsX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy1zYXM6IFN1c3BlbmRpbmcgaG9zdCAlZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJVFdMX01BU0tfSU5URVJSVVBUUyh0d19kZXYpOworCisJZnJlZV9pcnEodHdfZGV2LT50d19wY2lfZGV2LT5pcnEsIHR3X2Rldik7CisKKwkvKiBUZWxsIHRoZSBjYXJkIHdlIGFyZSBzaHV0dGluZyBkb3duICovCisJaWYgKHR3bF9pbml0Y29ubmVjdGlvbih0d19kZXYsIDEsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMywgIkNvbm5lY3Rpb24gc2h1dGRvd24gZmFpbGVkIGR1cmluZyBzdXNwZW5kIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctc2FzOiBTdXNwZW5kIGNvbXBsZXRlLlxuIik7CisJfQorCisJLyogQ2xlYXIgZG9vcmJlbGwgaW50ZXJydXB0ICovCisJVFdMX0NMRUFSX0RCX0lOVEVSUlVQVCh0d19kZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d2xfc3VzcGVuZCgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIFBDSSByZXN1bWUgKi8KK3N0YXRpYyBpbnQgdHdsX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy1zYXM6IFJlc3VtaW5nIGhvc3QgJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDI0LCAiRW5hYmxlIGRldmljZSBmYWlsZWQgZHVyaW5nIHJlc3VtZSIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV90cnlfc2V0X213aShwZGV2KTsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpCisJICAgIHx8IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKSkKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkKKwkJICAgIHx8IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkgeworCQkJVFdfUFJJTlRLKGhvc3QsIFRXX0RSSVZFUiwgMHgyNSwgIkZhaWxlZCB0byBzZXQgZG1hIG1hc2sgZHVyaW5nIHJlc3VtZSIpOworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCQl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBjYXJkICovCisJaWYgKHR3bF9yZXNldF9zZXF1ZW5jZSh0d19kZXYsIDApKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qIE5vdyBzZXR1cCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlyZXR2YWwgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHR3bF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAiM3ctc2FzIiwgdHdfZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyNiwgIkVycm9yIHJlcXVlc3RpbmcgSVJRIGR1cmluZyByZXN1bWUiKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyogTm93IGVuYWJsZSBNU0kgaWYgZW5hYmxlZCAqLworCWlmICh0ZXN0X2JpdChUV19VU0lOR19NU0ksICZ0d19kZXYtPmZsYWdzKSkKKwkJcGNpX2VuYWJsZV9tc2kocGRldik7CisKKwkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgY2FyZCAqLworCVRXTF9VTk1BU0tfSU5URVJSVVBUUyh0d19kZXYpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctc2FzOiBSZXN1bWUgY29tcGxldGUuXG4iKTsKKwlyZXR1cm4gMDsKKworb3V0X2Rpc2FibGVfZGV2aWNlOgorCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3bF9yZXN1bWUoKSAqLworI2VuZGlmCisKKy8qIFBDSSBEZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHR3bF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WREVWSUNFKDNXQVJFLCBQQ0lfREVWSUNFX0lEXzNXQVJFXzk3NTApIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR3bF9wY2lfdGJsKTsKKworLyogcGNpX2RyaXZlciBpbml0aWFsaXplciAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHR3bF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIjN3LXNhcyIsCisJLmlkX3RhYmxlCT0gdHdsX3BjaV90YmwsCisJLnByb2JlCQk9IHR3bF9wcm9iZSwKKwkucmVtb3ZlCQk9IHR3bF9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSB0d2xfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHR3bF9yZXN1bWUsCisjZW5kaWYKKwkuc2h1dGRvd24JPSB0d2xfc2h1dGRvd24KK307CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGRyaXZlciBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIGludCBfX2luaXQgdHdsX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJMU0kgM3dhcmUgU0FTL1NBVEEtUkFJRCBDb250cm9sbGVyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IHYlcy5cbiIsIFRXX0RSSVZFUl9WRVJTSU9OKTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0d2xfZHJpdmVyKTsKK30gLyogRW5kIHR3bF9pbml0KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZHJpdmVyIGV4aXQgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB0d2xfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHdsX2RyaXZlcik7Cit9IC8qIEVuZCB0d2xfZXhpdCgpICovCisKK21vZHVsZV9pbml0KHR3bF9pbml0KTsKK21vZHVsZV9leGl0KHR3bF9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzN3LXNhcy5oIGIvZHJpdmVycy9zY3NpLzN3LXNhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzQ4OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvM3ctc2FzLmgKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgICAzdy1zYXMuaCAtLSBMU0kgM3dhcmUgU0FTL1NBVEEtUkFJRCBDb250cm9sbGVyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorCisgICBXcml0dGVuIEJ5OiBBZGFtIFJhZGZvcmQgPGxpbnV4cmFpZEBsc2kuY29tPgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDkgTFNJIENvcnBvcmF0aW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgTk8gV0FSUkFOVFkKKyAgIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorICAgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyAgIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyAgIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCisgICBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorICAgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyAgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyAgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICAgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisgICBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICBCdWdzL0NvbW1lbnRzL1N1Z2dlc3Rpb25zIHNob3VsZCBiZSBtYWlsZWQgdG86CisgICBsaW51eHJhaWRAbHNpLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cubHNpLmNvbQorKi8KKworI2lmbmRlZiBfM1dfU0FTX0gKKyNkZWZpbmUgXzNXX1NBU19ICisKKy8qIEFFTiBzZXZlcml0eSB0YWJsZSAqLworc3RhdGljIGNoYXIgKnR3bF9hZW5fc2V2ZXJpdHlfdGFibGVbXSA9Cit7CisJIk5vbmUiLCAiRVJST1IiLCAiV0FSTklORyIsICJJTkZPIiwgIkRFQlVHIiwgTlVMTAorfTsKKworLyogTGliZXJhdG9yIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgVFdMX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAgIC8qIFN0YXR1cyAqLworI2RlZmluZSBUV0xfSElCREIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgLyogSW5ib3VuZCBkb29yYmVsbCAqLworI2RlZmluZSBUV0xfSElTVEFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAgLyogSG9zdCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFRXTF9ISU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNCAvKiBIb3N0IGludGVycnVwdCBtYXNrICovCisjZGVmaW5lIFRXTF9IT0JEQgkJCSAgIDB4OUMgLyogT3V0Ym91bmQgZG9vcmJlbGwgKi8KKyNkZWZpbmUgVFdMX0hPQkRCQyAgICAgICAgICAgICAgICAgICAgICAgICAweEEwIC8qIE91dGJvdW5kIGRvb3JiZWxsIGNsZWFyICovCisjZGVmaW5lIFRXTF9TQ1JQRDMgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQyAvKiBTY3JhdGNocGFkICovCisjZGVmaW5lIFRXTF9ISUJRUEwgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMCAvKiBIb3N0IGluYm91bmQgUSBsb3cgKi8KKyNkZWZpbmUgVFdMX0hJQlFQSCAgICAgICAgICAgICAgICAgICAgICAgICAweEM0IC8qIEhvc3QgaW5ib3VuZCBRIGhpZ2ggKi8KKyNkZWZpbmUgVFdMX0hPQlFQTCAgICAgICAgICAgICAgICAgICAgICAgICAweEM4IC8qIEhvc3Qgb3V0Ym91bmQgUSBsb3cgKi8KKyNkZWZpbmUgVFdMX0hPQlFQSCAgICAgICAgICAgICAgICAgICAgICAgICAweENDIC8qIEhvc3Qgb3V0Ym91bmQgUSBoaWdoICovCisjZGVmaW5lIFRXTF9ISVNUQVRVU19WQUxJRF9JTlRFUlJVUFQJICAgMHhDCisjZGVmaW5lIFRXTF9ISVNUQVRVU19BVFRFTlRJT05fSU5URVJSVVBUICAgMHg0CisjZGVmaW5lIFRXTF9ISVNUQVRVU19SRVNQT05TRV9JTlRFUlJVUFQJICAgMHg4CisjZGVmaW5lIFRXTF9TVEFUVVNfT1ZFUlJVTl9TVUJNSVQJICAgMHgyMDAwCisjZGVmaW5lIFRXTF9JU1NVRV9TT0ZUX1JFU0VUCQkgICAweDEwMAorI2RlZmluZSBUV0xfQ09OVFJPTExFUl9SRUFEWQkJICAgMHgyMDAwCisjZGVmaW5lIFRXTF9ET09SQkVMTF9DT05UUk9MTEVSX0VSUk9SCSAgIDB4MjAwMDAwCisjZGVmaW5lIFRXTF9ET09SQkVMTF9BVFRFTlRJT05fSU5URVJSVVBUICAgMHg0MDAwMAorI2RlZmluZSBUV0xfUFVMTF9NT0RFCQkJICAgMHgxCisKKy8qIENvbW1hbmQgcGFja2V0IG9wY29kZXMgdXNlZCBieSB0aGUgZHJpdmVyICovCisjZGVmaW5lIFRXX09QX0lOSVRfQ09OTkVDVElPTiAweDEKKyNkZWZpbmUgVFdfT1BfR0VUX1BBUkFNCSAgICAgIDB4MTIKKyNkZWZpbmUgVFdfT1BfU0VUX1BBUkFNCSAgICAgIDB4MTMKKyNkZWZpbmUgVFdfT1BfRVhFQ1VURV9TQ1NJICAgIDB4MTAKKworLyogQXN5bmNocm9ub3VzIEV2ZW50IE5vdGlmaWNhdGlvbiAoQUVOKSBjb2RlcyB1c2VkIGJ5IHRoZSBkcml2ZXIgKi8KKyNkZWZpbmUgVFdfQUVOX1FVRVVFX0VNUFRZICAgICAgIDB4MDAwMAorI2RlZmluZSBUV19BRU5fU09GVF9SRVNFVCAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRXX0FFTl9TWU5DX1RJTUVfV0lUSF9IT1NUIDB4MDMxCisjZGVmaW5lIFRXX0FFTl9TRVZFUklUWV9FUlJPUiAgICAweDEKKyNkZWZpbmUgVFdfQUVOX1NFVkVSSVRZX0RFQlVHICAgIDB4NAorI2RlZmluZSBUV19BRU5fTk9UX1JFVFJJRVZFRCAweDEKKworLyogQ29tbWFuZCBzdGF0ZSBkZWZpbmVzICovCisjZGVmaW5lIFRXX1NfSU5JVElBTCAgIDB4MSAgLyogSW5pdGlhbCBzdGF0ZSAqLworI2RlZmluZSBUV19TX1NUQVJURUQgICAweDIgIC8qIElkIGluIHVzZSAqLworI2RlZmluZSBUV19TX1BPU1RFRCAgICAweDQgIC8qIFBvc3RlZCB0byB0aGUgY29udHJvbGxlciAqLworI2RlZmluZSBUV19TX0NPTVBMRVRFRCAweDggIC8qIENvbXBsZXRlZCBieSBpc3IgKi8KKyNkZWZpbmUgVFdfU19GSU5JU0hFRCAgMHgxMCAvKiBJL08gY29tcGxldGVseSBkb25lICovCisKKy8qIENvbXBhdGliaWxpdHkgZGVmaW5lcyAqLworI2RlZmluZSBUV185NzUwX0FSQ0hfSUQgMTAKKyNkZWZpbmUgVFdfQ1VSUkVOVF9EUklWRVJfU1JMIDQwCisjZGVmaW5lIFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEIDAKKyNkZWZpbmUgVFdfQ1VSUkVOVF9EUklWRVJfQlJBTkNIIDAKKworLyogUGhhc2UgZGVmaW5lcyAqLworI2RlZmluZSBUV19QSEFTRV9JTklUSUFMIDAKKyNkZWZpbmUgVFdfUEhBU0VfU0dMSVNUICAyCisKKy8qIE1pc2MgZGVmaW5lcyAqLworI2RlZmluZSBUV19TRUNUT1JfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBUV19NQVhfVU5JVFMJCQkgICAgICAzMgorI2RlZmluZSBUV19JTklUX01FU1NBR0VfQ1JFRElUUwkJICAgICAgMHgxMDAKKyNkZWZpbmUgVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFCSAgICAgIDB4MworI2RlZmluZSBUV19JTklUX0NPTU1BTkRfUEFDS0VUX1NJWkVfRVhURU5ERUQgIDB4NgorI2RlZmluZSBUV19FWFRFTkRFRF9JTklUX0NPTk5FQ1QJICAgICAgMHgyCisjZGVmaW5lIFRXX0JBU0VfRldfU1JMCQkJICAgICAgMjQKKyNkZWZpbmUgVFdfQkFTRV9GV19CUkFOQ0gJCSAgICAgIDAKKyNkZWZpbmUgVFdfQkFTRV9GV19CVUlMRAkJICAgICAgMQorI2RlZmluZSBUV19RX0xFTkdUSAkJCSAgICAgIDI1NgorI2RlZmluZSBUV19RX1NUQVJUCQkJICAgICAgMAorI2RlZmluZSBUV19NQVhfU0xPVAkJCSAgICAgIDMyCisjZGVmaW5lIFRXX01BWF9SRVNFVF9UUklFUwkJICAgICAgMgorI2RlZmluZSBUV19NQVhfQ01EU19QRVJfTFVOCQkgICAgICAyNTQKKyNkZWZpbmUgVFdfTUFYX0FFTl9EUkFJTgkJICAgICAgMjU1CisjZGVmaW5lIFRXX0lOX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBUV19VU0lOR19NU0kJCQkgICAgICAzCisjZGVmaW5lIFRXX0lOX0FUVEVOVElPTl9MT09QCQkgICAgICA0CisjZGVmaW5lIFRXX01BWF9TRUNUT1JTICAgICAgICAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIFRXX01BWF9DREJfTEVOICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFdfSU9DVExfQ0hSREVWX1RJTUVPVVQgICAgICAgICAgICAgICA2MCAvKiA2MCBzZWNvbmRzICovCisjZGVmaW5lIFRXX0lPQ1RMX0NIUkRFVl9GUkVFICAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgVFdfQ09NTUFORF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAxMjggLyogMTI4IGJ5dGVzICovCisjZGVmaW5lIFRXX1ZFUlNJT05fVEFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwNDAyCisjZGVmaW5lIFRXX1RJTUVLRUVQX1RBQkxFCQkgICAgICAweDA0MEEKKyNkZWZpbmUgVFdfSU5GT1JNQVRJT05fVEFCTEUJCSAgICAgIDB4MDQwMworI2RlZmluZSBUV19QQVJBTV9GV1ZFUgkJCSAgICAgIDMKKyNkZWZpbmUgVFdfUEFSQU1fRldWRVJfTEVOR1RICQkgICAgICAxNgorI2RlZmluZSBUV19QQVJBTV9CSU9TVkVSCQkgICAgICA0CisjZGVmaW5lIFRXX1BBUkFNX0JJT1NWRVJfTEVOR1RICQkgICAgICAxNgorI2RlZmluZSBUV19QQVJBTV9NT0RFTAkJCSAgICAgIDgKKyNkZWZpbmUgVFdfUEFSQU1fTU9ERUxfTEVOR1RICQkgICAgICAxNgorI2RlZmluZSBUV19QQVJBTV9QSFlfU1VNTUFSWV9UQUJMRQkgICAgICAxCisjZGVmaW5lIFRXX1BBUkFNX1BIWUNPVU5UCQkgICAgICAyCisjZGVmaW5lIFRXX1BBUkFNX1BIWUNPVU5UX0xFTkdUSAkgICAgICAxCisjZGVmaW5lIFRXX0lPQ1RMX0ZJUk1XQVJFX1BBU1NfVEhST1VHSCAgICAgICAgMHgxMDggIC8vIFVzZWQgYnkgc21hcnRtb250b29scworI2RlZmluZSBUV19BTExPQ0FUSU9OX0xFTkdUSAkJICAgICAgMTI4CisjZGVmaW5lIFRXX1NFTlNFX0RBVEFfTEVOR1RICQkgICAgICAxOAorI2RlZmluZSBUV19FUlJPUl9MT0dJQ0FMX1VOSVRfTk9UX1NVUFBPUlRFRCAgIDB4MTBhCisjZGVmaW5lIFRXX0VSUk9SX0lOVkFMSURfRklFTERfSU5fQ0RCCSAgICAgIDB4MTBkCisjZGVmaW5lIFRXX0VSUk9SX1VOSVRfT0ZGTElORSAgICAgICAgICAgICAgICAgMHgxMjgKKyNkZWZpbmUgVFdfTUVTU0FHRV9TT1VSQ0VfQ09OVFJPTExFUl9FUlJPUiAgICAzCisjZGVmaW5lIFRXX01FU1NBR0VfU09VUkNFX0NPTlRST0xMRVJfRVZFTlQgICAgNAorI2RlZmluZSBUV19EUklWRVIgCQkJICAgICAgNgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEXzNXQVJFXzk3NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zV0FSRV85NzUwIDB4MTAxMAorI2VuZGlmCisKKy8qIEJpdG1hc2sgbWFjcm9zIHRvIGVsaW1pbmF0ZSBiaXRmaWVsZHMgKi8KKworLyogb3Bjb2RlOiA1LCByZXNlcnZlZDogMyAqLworI2RlZmluZSBUV19PUFJFU19JTih4LHkpICgoeCA8PCA1KSB8ICh5ICYgMHgxZikpCisjZGVmaW5lIFRXX09QX09VVCh4KSAoeCAmIDB4MWYpCisKKy8qIG9wY29kZTogNSwgc2dsb2Zmc2V0OiAzICovCisjZGVmaW5lIFRXX09QU0dMX0lOKHgseSkgKCh4IDw8IDUpIHwgKHkgJiAweDFmKSkKKyNkZWZpbmUgVFdfU0dMX09VVCh4KSAoKHggPj4gNSkgJiAweDcpCisKKy8qIHNldmVyaXR5OiAzLCByZXNlcnZlZDogNSAqLworI2RlZmluZSBUV19TRVZfT1VUKHgpICh4ICYgMHg3KQorCisvKiBub3RfbWZhOiAxLCByZXNlcnZlZDogNywgc3RhdHVzOiA4LCByZXF1ZXN0X2lkOiAxNiAqLworI2RlZmluZSBUV19SRVNJRF9PVVQoeCkgKCh4ID4+IDE2KSAmIDB4ZmZmZikKKyNkZWZpbmUgVFdfTk9UTUZBX09VVCh4KSAoeCAmIDB4MSkKKworLyogcmVxdWVzdF9pZDogMTIsIGx1bjogNCAqLworI2RlZmluZSBUV19SRVFfTFVOX0lOKGx1biwgcmVxdWVzdF9pZCkgKCgobHVuIDw8IDEyKSAmIDB4ZjAwMCkgfCAocmVxdWVzdF9pZCAmIDB4ZmZmKSkKKyNkZWZpbmUgVFdfTFVOX09VVChsdW4pICgobHVuID4+IDEyKSAmIDB4ZikKKworLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSBUV0xfU1RBVFVTX1JFR19BRERSKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgVFdMX1NUQVRVUykKKyNkZWZpbmUgVFdMX0hPQlFQTF9SRUdfQUREUih4KSAoKHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKXgtPmJhc2VfYWRkciArIFRXTF9IT0JRUEwpCisjZGVmaW5lIFRXTF9IT0JRUEhfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyBUV0xfSE9CUVBIKQorI2RlZmluZSBUV0xfSE9CREJfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyBUV0xfSE9CREIpCisjZGVmaW5lIFRXTF9IT0JEQkNfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyBUV0xfSE9CREJDKQorI2RlZmluZSBUV0xfSElNQVNLX1JFR19BRERSKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgVFdMX0hJTUFTSykKKyNkZWZpbmUgVFdMX0hJU1RBVF9SRUdfQUREUih4KSAoKHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKXgtPmJhc2VfYWRkciArIFRXTF9ISVNUQVQpCisjZGVmaW5lIFRXTF9ISUJRUEhfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyBUV0xfSElCUVBIKQorI2RlZmluZSBUV0xfSElCUVBMX1JFR19BRERSKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgVFdMX0hJQlFQTCkKKyNkZWZpbmUgVFdMX0hJQkRCX1JFR19BRERSKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgVFdMX0hJQkRCKQorI2RlZmluZSBUV0xfU0NSUEQzX1JFR19BRERSKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgVFdMX1NDUlBEMykKKyNkZWZpbmUgVFdMX01BU0tfSU5URVJSVVBUUyh4KSAod3JpdGVsKH4wLCBUV0xfSElNQVNLX1JFR19BRERSKHR3X2RldikpKQorI2RlZmluZSBUV0xfVU5NQVNLX0lOVEVSUlVQVFMoeCkgKHdyaXRlbCh+VFdMX0hJU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCwgVFdMX0hJTUFTS19SRUdfQUREUih0d19kZXYpKSkKKyNkZWZpbmUgVFdMX0NMRUFSX0RCX0lOVEVSUlVQVCh4KSAod3JpdGVsKH4wLCBUV0xfSE9CREJDX1JFR19BRERSKHR3X2RldikpKQorI2RlZmluZSBUV0xfU09GVF9SRVNFVCh4KSAod3JpdGVsKFRXTF9JU1NVRV9TT0ZUX1JFU0VULCBUV0xfSElCREJfUkVHX0FERFIodHdfZGV2KSkpCisKKy8qIE1hY3JvcyAqLworI2RlZmluZSBUV19QUklOVEsoaCxhLGIsYykgeyBcCitpZiAoaCkgXAorcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctc2FzOiBzY3NpJWQ6IEVSUk9SOiAoMHglMDJYOjB4JTA0WCk6ICVzLlxuIixoLT5ob3N0X25vLGEsYixjKTsgXAorZWxzZSBcCitwcmludGsoS0VSTl9XQVJOSU5HICIzdy1zYXM6IEVSUk9SOiAoMHglMDJYOjB4JTA0WCk6ICVzLlxuIixhLGIsYyk7IFwKK30KKyNkZWZpbmUgVFdfTUFYX0xVTlMgMTYKKyNkZWZpbmUgVFdfQ09NTUFORF9TSVpFIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gNiA6IDQpCisjZGVmaW5lIFRXX0xJQkVSQVRPUl9NQVhfU0dMX0xFTkdUSCAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCA/IDQ2IDogOTIpCisjZGVmaW5lIFRXX0xJQkVSQVRPUl9NQVhfU0dMX0xFTkdUSF9PTEQgKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyA0NyA6IDk0KQorI2RlZmluZSBUV19QQURESU5HX0xFTkdUSF9MSUJFUkFUT1IgMTM2CisjZGVmaW5lIFRXX1BBRERJTkdfTEVOR1RIX0xJQkVSQVRPUl9PTEQgMTMyCisjZGVmaW5lIFRXX0NQVV9UT19TR0woeCkgKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyBjcHVfdG9fbGU2NCh4KSA6IGNwdV90b19sZTMyKHgpKQorCisjcHJhZ21hIHBhY2soMSkKKworLyogU0dMIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfU0dfRW50cnlfSVNPIHsKKwlkbWFfYWRkcl90IGFkZHJlc3M7CisJZG1hX2FkZHJfdCBsZW5ndGg7Cit9IFRXX1NHX0VudHJ5X0lTTzsKKworLyogT2xkIENvbW1hbmQgUGFja2V0IHdpdGggSVNPIFNHTCAqLwordHlwZWRlZiBzdHJ1Y3QgVFdfQ29tbWFuZCB7CisJdW5zaWduZWQgY2hhciBvcGNvZGVfX3NnbG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyIHNpemU7CisJdW5zaWduZWQgY2hhciByZXF1ZXN0X2lkOworCXVuc2lnbmVkIGNoYXIgdW5pdF9faG9zdGlkOworCS8qIFNlY29uZCBEV09SRCAqLworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJdW5pb24geworCQl1bnNpZ25lZCBzaG9ydCBibG9ja19jb3VudDsKKwkJdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVyX2NvdW50OworCX0gYnl0ZTZfb2Zmc2V0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsYmE7CisJCQlUV19TR19FbnRyeV9JU08gc2dsW1RXX0xJQkVSQVRPUl9NQVhfU0dMX0xFTkdUSF9PTERdOworCQkJdW5zaWduZWQgY2hhciBwYWRkaW5nW1RXX1BBRERJTkdfTEVOR1RIX0xJQkVSQVRPUl9PTERdOworCQl9IGlvOworCQlzdHJ1Y3QgeworCQkJVFdfU0dfRW50cnlfSVNPIHNnbFtUV19MSUJFUkFUT1JfTUFYX1NHTF9MRU5HVEhfT0xEXTsKKwkJCXUzMiBwYWRkaW5nOworCQkJdW5zaWduZWQgY2hhciBwYWRkaW5nMltUV19QQURESU5HX0xFTkdUSF9MSUJFUkFUT1JfT0xEXTsKKwkJfSBwYXJhbTsKKwl9IGJ5dGU4X29mZnNldDsKK30gVFdfQ29tbWFuZDsKKworLyogTmV3IENvbW1hbmQgUGFja2V0IHdpdGggSVNPIFNHTCAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0NvbW1hbmRfQXBhY2hlIHsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZV9fcmVzZXJ2ZWQ7CisJdW5zaWduZWQgY2hhciB1bml0OworCXVuc2lnbmVkIHNob3J0IHJlcXVlc3RfaWRfX2x1bmw7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBzZ2xfb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IHNnbF9lbnRyaWVzX19sdW5oOworCXVuc2lnbmVkIGNoYXIgY2RiWzE2XTsKKwlUV19TR19FbnRyeV9JU08gc2dfbGlzdFtUV19MSUJFUkFUT1JfTUFYX1NHTF9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgcGFkZGluZ1tUV19QQURESU5HX0xFTkdUSF9MSUJFUkFUT1JdOworfSBUV19Db21tYW5kX0FwYWNoZTsKKworLyogTmV3IGNvbW1hbmQgcGFja2V0IGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciB7CisJdW5zaWduZWQgY2hhciBzZW5zZV9kYXRhW1RXX1NFTlNFX0RBVEFfTEVOR1RIXTsKKwlzdHJ1Y3QgeworCQljaGFyIHJlc2VydmVkWzRdOworCQl1bnNpZ25lZCBzaG9ydCBlcnJvcjsKKwkJdW5zaWduZWQgY2hhciBwYWRkaW5nOworCQl1bnNpZ25lZCBjaGFyIHNldmVyaXR5X19yZXNlcnZlZDsKKwl9IHN0YXR1c19ibG9jazsKKwl1bnNpZ25lZCBjaGFyIGVycl9zcGVjaWZpY19kZXNjWzk4XTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHNpemVfaGVhZGVyOworCQl1bnNpZ25lZCBzaG9ydCByZXF1ZXN0X2lkOworCQl1bnNpZ25lZCBjaGFyIHNpemVfc2Vuc2U7CisJfSBoZWFkZXJfZGVzYzsKK30gVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyOworCisvKiBUaGlzIHN0cnVjdCBpcyBhIHVuaW9uIG9mIHRoZSAyIGNvbW1hbmQgcGFja2V0cyAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0NvbW1hbmRfRnVsbCB7CisJVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyIGhlYWRlcjsKKwl1bmlvbiB7CisJCVRXX0NvbW1hbmQgb2xkY29tbWFuZDsKKwkJVFdfQ29tbWFuZF9BcGFjaGUgbmV3Y29tbWFuZDsKKwl9IGNvbW1hbmQ7Cit9IFRXX0NvbW1hbmRfRnVsbDsKKworLyogSW5pdGNvbm5lY3Rpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfSW5pdGNvbm5lY3QgeworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlX19yZXNlcnZlZDsKKwl1bnNpZ25lZCBjaGFyIHNpemU7CisJdW5zaWduZWQgY2hhciByZXF1ZXN0X2lkOworCXVuc2lnbmVkIGNoYXIgcmVzMjsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IG1lc3NhZ2VfY3JlZGl0czsKKwl1MzIgZmVhdHVyZXM7CisJdW5zaWduZWQgc2hvcnQgZndfc3JsOworCXVuc2lnbmVkIHNob3J0IGZ3X2FyY2hfaWQ7CisJdW5zaWduZWQgc2hvcnQgZndfYnJhbmNoOworCXVuc2lnbmVkIHNob3J0IGZ3X2J1aWxkOworCXUzMiByZXN1bHQ7Cit9IFRXX0luaXRjb25uZWN0OworCisvKiBFdmVudCBpbmZvIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0V2ZW50Cit7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlX2lkOworCXVuc2lnbmVkIGludCB0aW1lX3N0YW1wX3NlYzsKKwl1bnNpZ25lZCBzaG9ydCBhZW5fY29kZTsKKwl1bnNpZ25lZCBjaGFyIHNldmVyaXR5OworCXVuc2lnbmVkIGNoYXIgcmV0cmlldmVkOworCXVuc2lnbmVkIGNoYXIgcmVwZWF0X2NvdW50OworCXVuc2lnbmVkIGNoYXIgcGFyYW1ldGVyX2xlbjsKKwl1bnNpZ25lZCBjaGFyIHBhcmFtZXRlcl9kYXRhWzk4XTsKK30gVFdfRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IFRBR19UV19Jb2N0bF9Ecml2ZXJfQ29tbWFuZCB7CisJdW5zaWduZWQgaW50IGNvbnRyb2xfY29kZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCB1bmlxdWVfaWQ7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlX2lkOworCXVuc2lnbmVkIGludCBvc19zcGVjaWZpYzsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsKK30gVFdfSW9jdGxfRHJpdmVyX0NvbW1hbmQ7CisKK3R5cGVkZWYgc3RydWN0IFRBR19UV19Jb2N0bF9BcGFjaGUgeworCVRXX0lvY3RsX0RyaXZlcl9Db21tYW5kIGRyaXZlcl9jb21tYW5kOworICAgICAgICBjaGFyIHBhZGRpbmdbNDg4XTsKKwlUV19Db21tYW5kX0Z1bGwgZmlybXdhcmVfY29tbWFuZDsKKwljaGFyIGRhdGFfYnVmZmVyWzFdOworfSBUV19Jb2N0bF9CdWZfQXBhY2hlOworCisvKiBHZXRQYXJhbSBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQJdGFibGVfaWQ7CisJdW5zaWduZWQgc2hvcnQJcGFyYW1ldGVyX2lkOworCXVuc2lnbmVkIHNob3J0CXBhcmFtZXRlcl9zaXplX2J5dGVzOworCXVuc2lnbmVkIHNob3J0ICBhY3R1YWxfcGFyYW1ldGVyX3NpemVfYnl0ZXM7CisJdW5zaWduZWQgY2hhcglkYXRhWzFdOworfSBUV19QYXJhbV9BcGFjaGU7CisKKy8qIENvbXBhdGliaWxpdHkgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfQ29tcGF0aWJpbGl0eV9JbmZvCit7CisJY2hhciBkcml2ZXJfdmVyc2lvblszMl07CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19zcmw7CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19icmFuY2g7CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19idWlsZDsKKwl1bnNpZ25lZCBzaG9ydCBkcml2ZXJfc3JsX2hpZ2g7CisJdW5zaWduZWQgc2hvcnQgZHJpdmVyX2JyYW5jaF9oaWdoOworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9oaWdoOworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9zcmxfbG93OworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9icmFuY2hfbG93OworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9sb3c7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9zcmw7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9icmFuY2g7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9idWlsZDsKK30gVFdfQ29tcGF0aWJpbGl0eV9JbmZvOworCisjcHJhZ21hIHBhY2soKQorCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfRGV2aWNlX0V4dGVuc2lvbiB7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgIF9faW9tZW0gKmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nCSAgICAgICAJKmdlbmVyaWNfYnVmZmVyX3ZpcnRbVFdfUV9MRU5HVEhdOworCWRtYV9hZGRyX3QJICAgICAgIAlnZW5lcmljX2J1ZmZlcl9waHlzW1RXX1FfTEVOR1RIXTsKKwlUV19Db21tYW5kX0Z1bGwJICAgICAgIAkqY29tbWFuZF9wYWNrZXRfdmlydFtUV19RX0xFTkdUSF07CisJZG1hX2FkZHJfdAkJY29tbWFuZF9wYWNrZXRfcGh5c1tUV19RX0xFTkdUSF07CisJVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyICpzZW5zZV9idWZmZXJfdmlydFtUV19RX0xFTkdUSF07CisJZG1hX2FkZHJfdAkJc2Vuc2VfYnVmZmVyX3BoeXNbVFdfUV9MRU5HVEhdOworCXN0cnVjdCBwY2lfZGV2CQkqdHdfcGNpX2RldjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpzcmJbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIJCWZyZWVfcXVldWVbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIJCWZyZWVfaGVhZDsKKwl1bnNpZ25lZCBjaGFyCQlmcmVlX3RhaWw7CisJaW50ICAgICAJCXN0YXRlW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBpbnQJCXBvc3RlZF9yZXF1ZXN0X2NvdW50OworCXVuc2lnbmVkIGludAkJbWF4X3Bvc3RlZF9yZXF1ZXN0X2NvdW50OworCXVuc2lnbmVkIGludAkJbWF4X3NnbF9lbnRyaWVzOworCXVuc2lnbmVkIGludAkJc2dsX2VudHJpZXM7CisJdW5zaWduZWQgaW50CQludW1fcmVzZXRzOworCXVuc2lnbmVkIGludAkJc2VjdG9yX2NvdW50OworCXVuc2lnbmVkIGludAkJbWF4X3NlY3Rvcl9jb3VudDsKKwl1bnNpZ25lZCBpbnQJCWFlbl9jb3VudDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCWxvbmcJCQlmbGFnczsKKwlUV19FdmVudCAgICAgICAgICAgICAgICAqZXZlbnRfcXVldWVbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGVycm9yX2luZGV4OworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGVycm9yX3NlcXVlbmNlX2lkOworCWludAkJCWNocmRldl9yZXF1ZXN0X2lkOworCXdhaXRfcXVldWVfaGVhZF90CWlvY3RsX3dxdWV1ZTsKKwlzdHJ1Y3QgbXV0ZXgJCWlvY3RsX2xvY2s7CisJVFdfQ29tcGF0aWJpbGl0eV9JbmZvCXR3X2NvbXBhdF9pbmZvOworCWNoYXIJCQlvbmxpbmU7Cit9IFRXX0RldmljZV9FeHRlbnNpb247CisKKyNlbmRpZiAvKiBfM1dfU0FTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzN3LXh4eHguYyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMKaW5kZXggZmFhMGZjZi4uZjY1YTFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpLzN3LXh4eHguYworKysgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCkBAIC04LDcgKzgsNyBAQAogCiAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwOSAzd2FyZSBJbmMuCiAKLSAgIEtlcm5lbCBjb21wYXRpYmxpdHkgQnk6IAlBbmRyZSBIZWRyaWNrIDxhbmRyZUBzdXNlLmNvbT4KKyAgIEtlcm5lbCBjb21wYXRpYmlsaXR5IEJ5OiAJQW5kcmUgSGVkcmljayA8YW5kcmVAc3VzZS5jb20+CiAgICBOb24tQ29weXJpZ2h0IChDKSAyMDAwCUFuZHJlIEhlZHJpY2sgPGFuZHJlQHN1c2UuY29tPgogICAgCiAgICBGdXJ0aGVyIHRpbnkgYnVpbGQgZml4ZXMgYW5kIHRyaXZpYWwgaG9vdmVyaW5nICAgIEFsYW4gQ294CkBAIC01MjEsOCArNTIxLDEyIEBACiB9IC8qIEVuZCB0d19zaG93X3N0YXRzKCkgKi8KIAogLyogVGhpcyBmdW5jdGlvbiB3aWxsIHNldCBhIGRldmljZXMgcXVldWUgZGVwdGggKi8KLXN0YXRpYyBpbnQgdHdfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHF1ZXVlX2RlcHRoKQorc3RhdGljIGludCB0d19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcXVldWVfZGVwdGgsCisJCQkJIGludCByZWFzb24pCiB7CisJaWYgKHJlYXNvbiAhPSBTQ1NJX1FERVBUSF9ERUZBVUxUKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAocXVldWVfZGVwdGggPiBUV19RX0xFTkdUSC0yKQogCQlxdWV1ZV9kZXB0aCA9IFRXX1FfTEVOR1RILTI7CiAJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX09SREVSRURfVEFHLCBxdWV1ZV9kZXB0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvNTNjNzAwLmMgYi9kcml2ZXJzL3Njc2kvNTNjNzAwLmMKaW5kZXggZjVhOWFkZC4uOWY0YTkxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpLzUzYzcwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3MDAuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiBTVEFUSUMgaW50IE5DUl83MDBfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpTRHBudCk7CiBTVEFUSUMgaW50IE5DUl83MDBfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQpOwogU1RBVElDIHZvaWQgTkNSXzcwMF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQpOwotc3RhdGljIGludCBOQ1JfNzAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcG50LCBpbnQgZGVwdGgpOworc3RhdGljIGludCBOQ1JfNzAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcG50LCBpbnQgZGVwdGgsIGludCByZWFzb24pOwogc3RhdGljIGludCBOQ1JfNzAwX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQsIGludCBkZXB0aCk7CiAKIFNUQVRJQyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqTkNSXzcwMF9kZXZfYXR0cnNbXTsKQEAgLTE0OTEsNyArMTQ5MSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaGFuZGxlZCA9IDA7CiAKLQkvKiBVc2UgdGhlIGhvc3QgbG9jayB0byBzZXJpYWxpc2UgYWNlc3MgdG8gdGhlIDUzYzcwMAorCS8qIFVzZSB0aGUgaG9zdCBsb2NrIHRvIHNlcmlhbGlzZSBhY2Nlc3MgdG8gdGhlIDUzYzcwMAogCSAqIGhhcmR3YXJlLiAgTm90ZTogSW4gZnV0dXJlLCB3ZSBtYXkgbmVlZCB0byB0YWtlIHRoZSBxdWV1ZQogCSAqIGxvY2sgdG8gZW50ZXIgdGhlIGRvbmUgcm91dGluZXMuICBXaGVuIHRoYXQgaGFwcGVucywgd2UKIAkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0IGZvciB0aGlzIGRyaXZlciwgdGhlIGhvc3QgbG9jayBhbmQgdGhlCkBAIC0yMDgyLDggKzIwODIsMTEgQEAKIH0KIAogc3RhdGljIGludAotTkNSXzcwMF9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIGludCBkZXB0aCkKK05DUl83MDBfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwLCBpbnQgZGVwdGgsIGludCByZWFzb24pCiB7CisJaWYgKHJlYXNvbiAhPSBTQ1NJX1FERVBUSF9ERUZBVUxUKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAoZGVwdGggPiBOQ1JfNzAwX01BWF9UQUdTKQogCQlkZXB0aCA9IE5DUl83MDBfTUFYX1RBR1M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKaW5kZXggZTExY2NhNC4uMzY5MDBjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL0tjb25maWcKQEAgLTM5OSw2ICszOTksMTcgQEAKIAkgIFBsZWFzZSByZWFkIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mCiAJICA8ZmlsZTpkcml2ZXJzL3Njc2kvM3ctOXh4eC5jPi4KIAorY29uZmlnIFNDU0lfM1dfU0FTCisJdHJpc3RhdGUgIjN3YXJlIDk3eHggU0FTL1NBVEEtUkFJRCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTFNJIDN3YXJlIDk3NTAgNkdiL3MgU0FTL1NBVEEtUkFJRCBjYXJkcy4KKworCSAgPGh0dHA6Ly93d3cubHNpLmNvbT4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YKKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS8zdy1zYXMuYz4uCisKIGNvbmZpZyBTQ1NJXzcwMDBGQVNTVAogCXRyaXN0YXRlICI3MDAwRkFTU1QgU0NTSSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNBICYmIFNDU0kgJiYgSVNBX0RNQV9BUEkKQEAgLTYyMSw2ICs2MzIsMTQgQEAKIAkgIHN1YnN0YW50aWFsLCBzbyB1c2VycyBvZiBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzIG1heSBub3QKIAkgIHdpc2ggdG8gaW5jbHVkZSBpdC4KIAorY29uZmlnIFZNV0FSRV9QVlNDU0kKKwl0cmlzdGF0ZSAiVk13YXJlIFBWU0NTSSBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmIFg4NgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFZNd2FyZSdzIHBhcmEgdmlydHVhbGl6ZWQgU0NTSSBIQkEuCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2bXdfcHZzY3NpLgorCiBjb25maWcgTElCRkMKIAl0cmlzdGF0ZSAiTGliRkMgbW9kdWxlIgogCXNlbGVjdCBTQ1NJX0ZDX0FUVFJTCkBAIC02NDQsNyArNjYzLDcgQEAKIGNvbmZpZyBGQ09FX0ZOSUMKIAl0cmlzdGF0ZSAiQ2lzY28gRk5JQyBEcml2ZXIiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2Ci0Jc2VsZWN0IExJQkZDCisJc2VsZWN0IExJQkZDT0UKIAloZWxwCiAJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBDaXNjbyBQQ0ktRXhwcmVzcyBGQ29FIEhCQS4KIApAQCAtMTgxOCw2ICsxODM3LDE0IEBACiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFBNQyBTSUVSUkEgTWF4UkFJRCBhZGFwdGVycy4KIAorY29uZmlnIFNDU0lfUE04MDAxCisJdHJpc3RhdGUgIlBNQy1TaWVycmEgU1BDIDgwMDEgU0FTL1NBVEEgQmFzZWQgSG9zdCBBZGFwdGVyIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJc2VsZWN0IFNDU0lfU0FTX0xJQlNBUworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFBNQy1TaWVycmEgUENJRSBTQVMvU0FUQSA4eDZHIFNQQyA4MDAxIGNoaXAKKwkgIGJhc2VkIGhvc3QgYWRhcHRlcnMuCisKIGNvbmZpZyBTQ1NJX1NSUAogCXRyaXN0YXRlICJTQ1NJIFJETUEgUHJvdG9jb2wgaGVscGVyIGxpYnJhcnkiCiAJZGVwZW5kcyBvbiBTQ1NJICYmIFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IDNhZDYxZGIuLjI4MGQzYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTcwLDYgKzcwLDcgQEAKIG9iai0kKENPTkZJR19TQ1NJX0FBQ1JBSUQpCSs9IGFhY3JhaWQvCiBvYmotJChDT05GSUdfU0NTSV9BSUM3WFhYX09MRCkJKz0gYWljN3h4eF9vbGQubwogb2JqLSQoQ09ORklHX1NDU0lfQUlDOTRYWCkJKz0gYWljOTR4eC8KK29iai0kKENPTkZJR19TQ1NJX1BNODAwMSkJKz0gcG04MDAxLwogb2JqLSQoQ09ORklHX1NDU0lfSVBTKQkJKz0gaXBzLm8KIG9iai0kKENPTkZJR19TQ1NJX0ZEX01DUykJKz0gZmRfbWNzLm8KIG9iai0kKENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4pKz0gZmRvbWFpbi5vCkBAIC0xMTMsNiArMTE0LDcgQEAKIG9iai0kKENPTkZJR19TQ1NJX01BQzUzQzk0KQkrPSBtYWM1M2M5NC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQpICs9IDN3LXh4eHgubwogb2JqLSQoQ09ORklHX1NDU0lfM1dfOVhYWCkJKz0gM3ctOXh4eC5vCitvYmotJChDT05GSUdfU0NTSV8zV19TQVMpCSs9IDN3LXNhcy5vCiBvYmotJChDT05GSUdfU0NTSV9QUEEpCQkrPSBwcGEubwogb2JqLSQoQ09ORklHX1NDU0lfSU1NKQkJKz0gaW1tLm8KIG9iai0kKENPTkZJR19KQVpaX0VTUCkJCSs9IGVzcF9zY3NpLm8JamF6el9lc3AubwpAQCAtMTMzLDYgKzEzNSw3IEBACiBvYmotJChDT05GSUdfU0NTSV9CTlgyX0lTQ1NJKQkrPSBsaWJpc2NzaS5vIGJueDJpLwogb2JqLSQoQ09ORklHX0JFMklTQ1NJKQkJKz0gbGliaXNjc2kubyBiZTJpc2NzaS8KIG9iai0kKENPTkZJR19TQ1NJX1BNQ1JBSUQpCSs9IHBtY3JhaWQubworb2JqLSQoQ09ORklHX1ZNV0FSRV9QVlNDU0kpCSs9IHZtd19wdnNjc2kubwogCiBvYmotJChDT05GSUdfQVJNKQkJKz0gYXJtLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKaW5kZXggY2RiZGVjOS4uODM5ODZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaApAQCAtNTI2LDEwICs1MjYsMTAgQEAKIAogLyoKICAqCVRoZSBhZGFwdGVyIGludGVyZmFjZSBzcGVjcyBhbGwgcXVldWVzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUKLSAqCXBoeXNpY2FsbHkgY29udGlnb3VzIGJsb2NrLiBUaGUgaG9zdCBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZQorICoJcGh5c2ljYWxseSBjb250aWd1b3VzIGJsb2NrLiBUaGUgaG9zdCBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZQogICoJY29tbXVpY2F0aW9uIHF1ZXVlcyB3aWxsIGFzc3VtZSB0aGV5IGFyZSBlYWNoIGEgc2VwYXJhdGUgcGh5c2ljYWxseQotICoJY29udGlnb3VzIG1lbW9yeSByZWdpb24gdGhhdCB3aWxsIHN1cHBvcnQgdGhlbSBhbGwgYmVpbmcgb25lIGJpZwotICoJY29udGlnb3VzIGJsb2NrLgorICoJY29udGlndW91cyBtZW1vcnkgcmVnaW9uIHRoYXQgd2lsbCBzdXBwb3J0IHRoZW0gYWxsIGJlaW5nIG9uZSBiaWcKKyAqCWNvbnRpZ3VvdXMgYmxvY2suCiAgKglUaGVyZSBpcyBhIGNvbW1hbmQgYW5kIHJlc3BvbnNlIHF1ZXVlIGZvciBlYWNoIGxldmVsIGFuZCBkaXJlY3Rpb24gb2YKICAqCWNvbW11aWNhdGlvbi4gVGhlc2UgcmVnaW9ucyBhcmUgYWNjZXNzZWQgYnkgYm90aCB0aGUgaG9zdCBhbmQgYWRhcHRlci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMKaW5kZXggZDU5OGViYS4uNjY2ZDUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5maWJfbG9jayk7CiAKIAkvKgotCSAqCUFsbG9jYXRlIHRoZSBwaHlzaWNhbGx5IGNvbnRpZ291cyBzcGFjZSBmb3IgdGhlIGNvbW11aWNhdGlvbgorCSAqCUFsbG9jYXRlIHRoZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgc3BhY2UgZm9yIHRoZSBjb21tdWljYXRpb24KIAkgKglxdWV1ZSBoZWFkZXJzLiAKIAkgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKaW5kZXggOWI5N2MzZS4uZTkzNzNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCkBAIC00NzIsOCArNDcyLDEyIEBACiAgKgl0b3RhbCBjYXBhY2l0eSBhbmQgdGhlIHF1ZXVlIGRlcHRoIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0IGRldmljZS4KICAqLwogCi1zdGF0aWMgaW50IGFhY19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgZGVwdGgpCitzdGF0aWMgaW50IGFhY19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgZGVwdGgsCisJCQkJICBpbnQgcmVhc29uKQogeworCWlmIChyZWFzb24gIT0gU0NTSV9RREVQVEhfREVGQVVMVCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgJiYgKHNkZXYtPnR5cGUgPT0gVFlQRV9ESVNLKSAmJgogCSAgICAoc2Rldl9jaGFubmVsKHNkZXYpID09IENPTlRBSU5FUl9DSEFOTkVMKSkgewogCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCmluZGV4IGI3NTYwNDEuLjIyNjI2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCkBAIC03OTY5LDcgKzc5NjksNyBAQAogCQlBU0NfREJHKDEsICJiZWZvcmUgQXNjSW5pdEFzYzEwMDBEcml2ZXIoKVxuIik7CiAJCXN0YXR1cyA9IEFzY0luaXRBc2MxMDAwRHJpdmVyKGFzY19kdmMpOwogCi0JCS8qIFJlZmVyIHRvIEFTQ19JRVJSXyogZGVmaW50aW9ucyBmb3IgbWVhbmluZyBvZiAnZXJyX2NvZGUnLiAqLworCQkvKiBSZWZlciB0byBBU0NfSUVSUl8qIGRlZmluaXRpb25zIGZvciBtZWFuaW5nIG9mICdlcnJfY29kZScuICovCiAJCWlmIChhc2NfZHZjLT5lcnJfY29kZSkgewogCQkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBzY3AsICJTQ1NJIGJ1cyByZXNldCBlcnJvcjogIgogCQkJCSAgICAiMHgleFxuIiwgYXNjX2R2Yy0+ZXJyX2NvZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5zZXEgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LnNlcQppbmRleCA1OGJjMTc1Li4yZmI3OGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LnNlcQorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LnNlcQpAQCAtMjE3LDcgKzIxNyw3IEBACiBzY2JkbWFfdG9ob3N0X2RvbmU6CiAJdGVzdAlDQ1NDQkNUTCwgQ0NBUlJFTiBqeiBmaWxsX3FvdXRmaWZvX2RtYWRvbmU7CiAJLyoKLQkgKiBBbiBTQ0IgaGFzIGJlZW4gc3VjY2VzZnVsbHkgdXBsb2FkZWQgdG8gdGhlIGhvc3QuCisJICogQW4gU0NCIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byB0aGUgaG9zdC4KIAkgKiBJZiB0aGUgU0NCIHdhcyB1cGxvYWRlZCBmb3Igc29tZSByZWFzb24gb3RoZXIgdGhhbgogCSAqIGJhZCBTQ1NJIHN0YXR1cyAoY3VycmVudGx5IG9ubHkgZm9yIHVuZGVycnVucyksIHdlCiAJICogcXVldWUgdGhlIFNDQiBmb3Igbm9ybWFsIGNvbXBsZXRpb24uICBPdGhlcndpc2UsIHdlCkBAIC0xMjgxLDcgKzEyODEsNyBAQAogICogSXMgaXQgYSBkaXNjb25uZWN0IG1lc3NhZ2U/ICBTZXQgYSBmbGFnIGluIHRoZSBTQ0IgdG8gcmVtaW5kIHVzCiAgKiBhbmQgYXdhaXQgdGhlIGJ1cyBnb2luZyBmcmVlLiAgSWYgdGhpcyBpcyBhbiB1bnRhZ2dlZCB0cmFuc2FjdGlvbgogICogc3RvcmUgdGhlIFNDQiBpZCBmb3IgaXQgaW4gb3VyIHVudGFnZ2VkIHRhcmdldCB0YWJsZSBmb3IgbG9va3VwIG9uCi0gKiBhIHJlc2VsY3Rpb24uCisgKiBhIHJlc2VsZWN0aW9uLgogICovCiBtZXNnaW5fZGlzY29ubmVjdDoKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwppbmRleCA2M2I1MjFkLi40ZDQxOWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwpAQCAtMjQ4Nyw3ICsyNDg3LDcgQEAKIAkJLyoKIAkJICogQWx0aG91Z2ggdGhlIGRyaXZlciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQogCQkgKiAnU2VsZWN0aW9uIGluIFByb2dyZXNzJyBzdGF0dXMgYml0LCB0aGUgYnVzeQotCQkgKiBMRUQgZG9lcy4gIFNFTElOR08gaXMgb25seSBjbGVhcmVkIGJ5IGEgc3VjZXNzZnVsbAorCQkgKiBMRUQgZG9lcy4gIFNFTElOR08gaXMgb25seSBjbGVhcmVkIGJ5IGEgc3VjY2Vzc2Z1bGwKIAkJICogc2VsZWN0aW9uLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGNsZWFyIGl0IHRvIGluc3VyZQogCQkgKiB0aGUgTEVEIHR1cm5zIG9mZiBqdXN0IGluY2FzZSBubyBmdXR1cmUgc3VjY2Vzc2Z1bAogCQkgKiBzZWxlY3Rpb25zIG9jY3VyIChlLmcuIG5vIGRldmljZXMgb24gdGhlIGJ1cykuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwppbmRleCA3NWIyMzMxLi4xMjIyYTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKQEAgLTIzMzUsNyArMjMzNSw3IEBACiAJCQkvKgogCQkJICogVGhlIHNlcXVlbmNlciB3aWxsIG5ldmVyIHJlLXJlZmVyZW5jZSB0aGUKIAkJCSAqIGluLWNvcmUgU0NCLiAgVG8gbWFrZSBzdXJlIHdlIGFyZSBub3RpZmllZAotCQkJICogZHVyaW5nIHJlc2xlY3Rpb24sIHNldCB0aGUgTUtfTUVTU0FHRSBmbGFnIGluCisJCQkgKiBkdXJpbmcgcmVzZWxlY3Rpb24sIHNldCB0aGUgTUtfTUVTU0FHRSBmbGFnIGluCiAJCQkgKiB0aGUgY2FyZCdzIGNvcHkgb2YgdGhlIFNDQi4KIAkJCSAqLwogCQkJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5zZXEKaW5kZXggMTUxOTYzOS4uNWE0Y2ZjOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguc2VxCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguc2VxCkBAIC0xNjkzLDcgKzE2OTMsNyBAQAogICogSXMgaXQgYSBkaXNjb25uZWN0IG1lc3NhZ2U/ICBTZXQgYSBmbGFnIGluIHRoZSBTQ0IgdG8gcmVtaW5kIHVzCiAgKiBhbmQgYXdhaXQgdGhlIGJ1cyBnb2luZyBmcmVlLiAgSWYgdGhpcyBpcyBhbiB1bnRhZ2dlZCB0cmFuc2FjdGlvbgogICogc3RvcmUgdGhlIFNDQiBpZCBmb3IgaXQgaW4gb3VyIHVudGFnZ2VkIHRhcmdldCB0YWJsZSBmb3IgbG9va3VwIG9uCi0gKiBhIHJlc2VsY3Rpb24uCisgKiBhIHJlc2VsZWN0aW9uLgogICovCiBtZXNnaW5fZGlzY29ubmVjdDoKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwppbmRleCA4ZGZiNTlkLi40NWFhNzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwpAQCAtMTczMyw3ICsxNzMzLDcgQEAKIAkJLyoKIAkJICogQWx0aG91Z2ggdGhlIGRyaXZlciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQogCQkgKiAnU2VsZWN0aW9uIGluIFByb2dyZXNzJyBzdGF0dXMgYml0LCB0aGUgYnVzeQotCQkgKiBMRUQgZG9lcy4gIFNFTElOR08gaXMgb25seSBjbGVhcmVkIGJ5IGEgc3VjZXNzZnVsbAorCQkgKiBMRUQgZG9lcy4gIFNFTElOR08gaXMgb25seSBjbGVhcmVkIGJ5IGEgc3VjY2Vzc2Z1bGwKIAkJICogc2VsZWN0aW9uLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGNsZWFyIGl0IHRvIGluc3VyZQogCQkgKiB0aGUgTEVEIHR1cm5zIG9mZiBqdXN0IGluY2FzZSBubyBmdXR1cmUgc3VjY2Vzc2Z1bAogCQkgKiBzZWxlY3Rpb25zIG9jY3VyIChlLmcuIG5vIGRldmljZXMgb24gdGhlIGJ1cykuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwppbmRleCBmZDJiOTc4Li44Y2IwNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKQEAgLTIyOTAsNyArMjI5MCw3IEBACiAJCSAqIEluIHRoZSBub24tcGFnaW5nIGNhc2UsIHRoZSBzZXF1ZW5jZXIgd2lsbAogCQkgKiBuZXZlciByZS1yZWZlcmVuY2UgdGhlIGluLWNvcmUgU0NCLgogCQkgKiBUbyBtYWtlIHN1cmUgd2UgYXJlIG5vdGlmaWVkIGR1cmluZwotCQkgKiByZXNsZWN0aW9uLCBzZXQgdGhlIE1LX01FU1NBR0UgZmxhZyBpbgorCQkgKiByZXNlbGVjdGlvbiwgc2V0IHRoZSBNS19NRVNTQUdFIGZsYWcgaW4KIAkJICogdGhlIGNhcmQncyBjb3B5IG9mIHRoZSBTQ0IuCiAJCSAqLwogCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfcmVnX2RlZi5oIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9yZWdfZGVmLmgKaW5kZXggYTQzZThjZC4uMjhhYWYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9yZWdfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9yZWdfZGVmLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQWljOTR4eCBTQVMvU0FUQSBkcml2ZXIgaGFyZHdhcmUgcmVnaXN0ZXJzIGRlZmludGlvbnMuCisgKiBBaWM5NHh4IFNBUy9TQVRBIGRyaXZlciBoYXJkd2FyZSByZWdpc3RlcnMgZGVmaW5pdGlvbnMuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFkYXB0ZWMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRGF2aWQgQ2hhdyA8ZGF2aWRfY2hhd0BhZGFwdGVjLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jIGIvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfaGJhLmMKaW5kZXggODBhYWMwMS4uNDdkNWQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfaGJhLmMKKysrIGIvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfaGJhLmMKQEAgLTk4LDggKzk4LDExIEBACiBzdGF0aWMgY29uc3QgY2hhciAqYXJjbXNyX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBhcmNtc3JfaW50ZXJydXB0KHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpOwogc3RhdGljIGludCBhcmNtc3JfYWRqdXN0X2Rpc2tfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAotCQkJCQkJCQlpbnQgcXVldWVfZGVwdGgpCisJCQkJCSAgaW50IHF1ZXVlX2RlcHRoLCBpbnQgcmVhc29uKQogeworCWlmIChyZWFzb24gIT0gU0NTSV9RREVQVEhfREVGQVVMVCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJaWYgKHF1ZXVlX2RlcHRoID4gQVJDTVNSX01BWF9DTURfUEVSTFVOKQogCQlxdWV1ZV9kZXB0aCA9IEFSQ01TUl9NQVhfQ01EX1BFUkxVTjsKIAlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfT1JERVJFRF9UQUcsIHF1ZXVlX2RlcHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmgKaW5kZXggYjM2MDIwZC4uYTkzYTUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmgKQEAgLTIwLDggKzIwLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+Ci0KLSNkZWZpbmUgRldfVkVSX0xFTiAzMgorI2luY2x1ZGUgPGxpbnV4L2Jsay1pb3BvbGwuaD4KKyNkZWZpbmUgRldfVkVSX0xFTgkzMgorI2RlZmluZSBNQ0NfUV9MRU4JMTI4CisjZGVmaW5lIE1DQ19DUV9MRU4JMjU2CiAKIHN0cnVjdCBiZV9kbWFfbWVtIHsKIAl2b2lkICp2YTsKQEAgLTc0LDE4ICs3NiwxNCBAQAogCiBzdHJ1Y3QgYmVfZXFfb2JqIHsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBxOwotCWNoYXIgZGVzY1szMl07Ci0KLQkvKiBBZGFwdGl2ZSBpbnRlcnJ1cHQgY29hbGVzY2luZyAoQUlDKSBpbmZvICovCi0JYm9vbCBlbmFibGVfYWljOwotCXUxNiBtaW5fZXFkOwkJLyogaW4gdXNlY3MgKi8KLQl1MTYgbWF4X2VxZDsJCS8qIGluIHVzZWNzICovCi0JdTE2IGN1cl9lcWQ7CQkvKiBpbiB1c2VjcyAqLworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CisJc3RydWN0IGJsa19pb3BvbGwJaW9wb2xsOwogfTsKIAogc3RydWN0IGJlX21jY19vYmogewotCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxOwotCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBxOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGNxOwogfTsKIAogc3RydWN0IGJlX2N0cmxfaW5mbyB7CkBAIC0xNzYsOCArMTc0LDQgQEAKIAl9IHdoaWxlIChsZW4pOwogI2VuZGlmIC8qIF9fQklHX0VORElBTiAqLwogfQotCi1leHRlcm4gdm9pZCBiZWlzY3NpX2NxX25vdGlmeShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCB1MTYgcWlkLCBib29sIGFybSwKLQkJCSAgICAgIHUxNiBudW1fcG9wcGVkKTsKLQogI2VuZGlmIC8qIEJFSVNDU0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKaW5kZXggMDgwMDdiNi4uNjk4YTUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCkBAIC0xOSw2ICsxOSwxNiBAQAogI2luY2x1ZGUgImJlX21nbXQuaCIKICNpbmNsdWRlICJiZV9tYWluLmgiCiAKK3N0YXRpYyB2b2lkIGJlX21jY19ub3RpZnkoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxID0gJnBoYmEtPmN0cmwubWNjX29iai5xOworCXUzMiB2YWwgPSAwOworCisJdmFsIHw9IG1jY3EtPmlkICYgREJfTUNDUV9SSU5HX0lEX01BU0s7CisJdmFsIHw9IDEgPDwgREJfTUNDUV9OVU1fUE9TVEVEX1NISUZUOworCWlvd3JpdGUzMih2YWwsIHBoYmEtPmRiX3ZhICsgREJfTUNDUV9PRkZTRVQpOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgYmVfbWNjX2NvbXBsX2lzX25ldyhzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCkKIHsKIAlpZiAoY29tcGwtPmZsYWdzICE9IDApIHsKQEAgLTU0LDEzICs2NCw1NiBAQAogCXJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19saW5rX3N0YXRlX2V2dCh1MzIgdHJhaWxlcikKIHsKIAlyZXR1cm4gKCgodHJhaWxlciA+PiBBU1lOQ19UUkFJTEVSX0VWRU5UX0NPREVfU0hJRlQpICYKLQkJQVNZTkNfVFJBSUxFUl9FVkVOVF9DT0RFX01BU0spID09IEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSk7CisJCSAgQVNZTkNfVFJBSUxFUl9FVkVOVF9DT0RFX01BU0spID09CisJCSAgQVNZTkNfRVZFTlRfQ09ERV9MSU5LX1NUQVRFKTsKIH0KIAotdm9pZCBiZWlzY3NpX2NxX25vdGlmeShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCB1MTYgcWlkLCBib29sIGFybSwKK3N0YXRpYyBzdHJ1Y3QgYmVfbWNjX2NvbXBsICpiZV9tY2NfY29tcGxfZ2V0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjX2NxID0gJnBoYmEtPmN0cmwubWNjX29iai5jcTsKKwlzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCA9IHF1ZXVlX3RhaWxfbm9kZShtY2NfY3EpOworCisJaWYgKGJlX21jY19jb21wbF9pc19uZXcoY29tcGwpKSB7CisJCXF1ZXVlX3RhaWxfaW5jKG1jY19jcSk7CisJCXJldHVybiBjb21wbDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQoreworCWlzY3NpX3Nlc3Npb25fZmFpbHVyZShjbHNfc2Vzc2lvbi0+ZGRfZGF0YSwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9hc3luY19saW5rX3N0YXRlX3Byb2Nlc3Moc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQlzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfbGlua19zdGF0ZSAqZXZ0KQoreworCXN3aXRjaCAoZXZ0LT5wb3J0X2xpbmtfc3RhdHVzKSB7CisJY2FzZSBBU1lOQ19FVkVOVF9MSU5LX0RPV046CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIkxpbmsgRG93biBvbiBQaHlzaWNhbCBQb3J0ICVkIFxuIiwKKwkJCQkJCWV2dC0+cGh5c2ljYWxfcG9ydCk7CisJCXBoYmEtPnN0YXRlIHw9IEJFX0FEQVBURVJfTElOS19ET1dOOworCQlicmVhazsKKwljYXNlIEFTWU5DX0VWRU5UX0xJTktfVVA6CisJCXBoYmEtPnN0YXRlID0gQkVfQURBUFRFUl9VUDsKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiTGluayBVUCBvbiBQaHlzaWNhbCBQb3J0ICVkIFxuIiwKKwkJCQkJCWV2dC0+cGh5c2ljYWxfcG9ydCk7CisJCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihwaGJhLT5zaG9zdCwKKwkJCQkJICAgIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIlVuZXhwZWN0ZWQgQXN5bmMgTm90aWZpY2F0aW9uICVkIG9uIgorCQkJCSAgICAiUGh5c2ljYWwgUG9ydCAlZCBcbiIsCisJCQkJICAgICBldnQtPnBvcnRfbGlua19zdGF0dXMsCisJCQkJICAgICBldnQtPnBoeXNpY2FsX3BvcnQpOworCX0KK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9jcV9ub3RpZnkoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1MTYgcWlkLCBib29sIGFybSwKIAkJICAgICAgIHUxNiBudW1fcG9wcGVkKQogewogCXUzMiB2YWwgPSAwOwpAQCAtNjgsNyArMTIxLDY2IEBACiAJaWYgKGFybSkKIAkJdmFsIHw9IDEgPDwgREJfQ1FfUkVBUk1fU0hJRlQ7CiAJdmFsIHw9IG51bV9wb3BwZWQgPDwgREJfQ1FfTlVNX1BPUFBFRF9TSElGVDsKLQlpb3dyaXRlMzIodmFsLCBjdHJsLT5kYiArIERCX0NRX09GRlNFVCk7CisJaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9DUV9PRkZTRVQpOworfQorCisKK2ludCBiZWlzY3NpX3Byb2Nlc3NfbWNjKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbDsKKwlpbnQgbnVtID0gMCwgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisKKwlzcGluX2xvY2tfYmgoJnBoYmEtPmN0cmwubWNjX2NxX2xvY2spOworCXdoaWxlICgoY29tcGwgPSBiZV9tY2NfY29tcGxfZ2V0KHBoYmEpKSkgeworCQlpZiAoY29tcGwtPmZsYWdzICYgQ1FFX0ZMQUdTX0FTWU5DX01BU0spIHsKKwkJCS8qIEludGVycHJldCBmbGFncyBhcyBhbiBhc3luYyB0cmFpbGVyICovCisJCQlCVUdfT04oIWlzX2xpbmtfc3RhdGVfZXZ0KGNvbXBsLT5mbGFncykpOworCisJCQkvKiBJbnRlcnByZXQgY29tcGwgYXMgYSBhc3luYyBsaW5rIGV2dCAqLworCQkJYmVpc2NzaV9hc3luY19saW5rX3N0YXRlX3Byb2Nlc3MocGhiYSwKKwkJCQkoc3RydWN0IGJlX2FzeW5jX2V2ZW50X2xpbmtfc3RhdGUgKikgY29tcGwpOworCQl9IGVsc2UgaWYgKGNvbXBsLT5mbGFncyAmIENRRV9GTEFHU19DT01QTEVURURfTUFTSykgeworCQkJCXN0YXR1cyA9IGJlX21jY19jb21wbF9wcm9jZXNzKGN0cmwsIGNvbXBsKTsKKwkJCQlhdG9taWNfZGVjKCZwaGJhLT5jdHJsLm1jY19vYmoucS51c2VkKTsKKwkJfQorCQliZV9tY2NfY29tcGxfdXNlKGNvbXBsKTsKKwkJbnVtKys7CisJfQorCisJaWYgKG51bSkKKwkJYmVpc2NzaV9jcV9ub3RpZnkocGhiYSwgcGhiYS0+Y3RybC5tY2Nfb2JqLmNxLmlkLCB0cnVlLCBudW0pOworCisJc3Bpbl91bmxvY2tfYmgoJnBoYmEtPmN0cmwubWNjX2NxX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFdhaXQgdGlsbCBubyBtb3JlIHBlbmRpbmcgbWNjIHJlcXVlc3RzIGFyZSBwcmVzZW50ICovCitzdGF0aWMgaW50IGJlX21jY193YWl0X2NvbXBsKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKyNkZWZpbmUgbWNjX3RpbWVvdXQJCTEyMDAwMCAvKiA1cyB0aW1lb3V0ICovCisJaW50IGksIHN0YXR1czsKKwlmb3IgKGkgPSAwOyBpIDwgbWNjX3RpbWVvdXQ7IGkrKykgeworCQlzdGF0dXMgPSBiZWlzY3NpX3Byb2Nlc3NfbWNjKHBoYmEpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpZiAoYXRvbWljX3JlYWQoJnBoYmEtPmN0cmwubWNjX29iai5xLnVzZWQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWlmIChpID09IG1jY190aW1lb3V0KSB7CisJCWRldl9lcnIoJnBoYmEtPnBjaWRldi0+ZGV2LCAibWNjcSBwb2xsIHRpbWVkIG91dFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIE5vdGlmeSBNQ0MgcmVxdWVzdHMgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KK2ludCBiZV9tY2Nfbm90aWZ5X3dhaXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCWJlX21jY19ub3RpZnkocGhiYSk7CisJcmV0dXJuIGJlX21jY193YWl0X2NvbXBsKHBoYmEpOwogfQogCiBzdGF0aWMgaW50IGJlX21ib3hfZGJfcmVhZHlfd2FpdChzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKQpAQCAtMTQyLDYgKzI1NCw1MiBAQAogCXJldHVybiAwOwogfQogCisvKgorICogSW5zZXJ0IHRoZSBtYWlsYm94IGFkZHJlc3MgaW50byB0aGUgZG9vcmJlbGwgaW4gdHdvIHN0ZXBzCisgKiBQb2xscyBvbiB0aGUgbWJveCBkb29yYmVsbCB0aWxsIGEgY29tbWFuZCBjb21wbGV0aW9uIChvciBhIHRpbWVvdXQpIG9jY3VycworICovCitzdGF0aWMgaW50IGJlX21ib3hfbm90aWZ5X3dhaXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCWludCBzdGF0dXM7CisJdTMyIHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICpkYiA9IHBoYmEtPmN0cmwuZGIgKyBNUFVfTUFJTEJPWF9EQl9PRkZTRVQ7CisJc3RydWN0IGJlX2RtYV9tZW0gKm1ib3hfbWVtID0gJnBoYmEtPmN0cmwubWJveF9tZW07CisJc3RydWN0IGJlX21jY19tYWlsYm94ICptYm94ID0gbWJveF9tZW0tPnZhOworCXN0cnVjdCBiZV9tY2NfY29tcGwgKmNvbXBsID0gJm1ib3gtPmNvbXBsOworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKworCXZhbCB8PSBNUFVfTUFJTEJPWF9EQl9ISV9NQVNLOworCS8qIGF0IGJpdHMgMiAtIDMxIHBsYWNlIG1ib3ggZG1hIGFkZHIgbXNiIGJpdHMgMzQgLSA2MyAqLworCXZhbCB8PSAodXBwZXJfMzJfYml0cyhtYm94X21lbS0+ZG1hKSA+PiAyKSA8PCAyOworCWlvd3JpdGUzMih2YWwsIGRiKTsKKworCS8qIHdhaXQgZm9yIHJlYWR5IHRvIGJlIHNldCAqLworCXN0YXR1cyA9IGJlX21ib3hfZGJfcmVhZHlfd2FpdChjdHJsKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisKKwl2YWwgPSAwOworCS8qIGF0IGJpdHMgMiAtIDMxIHBsYWNlIG1ib3ggZG1hIGFkZHIgbHNiIGJpdHMgNCAtIDMzICovCisJdmFsIHw9ICh1MzIpKG1ib3hfbWVtLT5kbWEgPj4gNCkgPDwgMjsKKwlpb3dyaXRlMzIodmFsLCBkYik7CisKKwlzdGF0dXMgPSBiZV9tYm94X2RiX3JlYWR5X3dhaXQoY3RybCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogQSBjcSBlbnRyeSBoYXMgYmVlbiBtYWRlIG5vdyAqLworCWlmIChiZV9tY2NfY29tcGxfaXNfbmV3KGNvbXBsKSkgeworCQlzdGF0dXMgPSBiZV9tY2NfY29tcGxfcHJvY2VzcyhjdHJsLCAmbWJveC0+Y29tcGwpOworCQliZV9tY2NfY29tcGxfdXNlKGNvbXBsKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmcGhiYS0+cGNpZGV2LT5kZXYsICJpbnZhbGlkIG1haWxib3ggY29tcGxldGlvblxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHZvaWQgYmVfd3JiX2hkcl9wcmVwYXJlKHN0cnVjdCBiZV9tY2Nfd3JiICp3cmIsIGludCBwYXlsb2FkX2xlbiwKIAkJCQlib29sIGVtYmVkZGVkLCB1OCBzZ2VfY250KQogewpAQCAtMjAzLDYgKzM2MSwyMCBAQAogCXJldHVybiAmKChzdHJ1Y3QgYmVfbWNjX21haWxib3ggKikobWJveF9tZW0tPnZhKSktPndyYjsKIH0KIAorc3RydWN0IGJlX21jY193cmIgKndyYl9mcm9tX21jY3Eoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxID0gJnBoYmEtPmN0cmwubWNjX29iai5xOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJm1jY3EtPnVzZWQpID49IG1jY3EtPmxlbik7CisJd3JiID0gcXVldWVfaGVhZF9ub2RlKG1jY3EpOworCXF1ZXVlX2hlYWRfaW5jKG1jY3EpOworCWF0b21pY19pbmMoJm1jY3EtPnVzZWQpOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisJcmV0dXJuIHdyYjsKK30KKworCiBpbnQgYmVpc2NzaV9jbWRfZXFfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCiAJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcSwgaW50IGVxX2RlbGF5KQogewpAQCAtMjEyLDYgKzM4NCw3IEBACiAJc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtID0gJmVxLT5kbWFfbWVtOwogCWludCBzdGF0dXM7CiAKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2NtZF9lcV9jcmVhdGVcbiIpOwogCXNwaW5fbG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOwogCkBAIC0yNDksNiArNDIyLDcgQEAKIAlpbnQgc3RhdHVzOwogCXU4ICplbmRpYW5fY2hlY2s7CiAKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZV9jbWRfZndfaW5pdGlhbGl6ZVxuIik7CiAJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOwogCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CiAKQEAgLTI4Miw2ICs0NTYsNyBAQAogCXZvaWQgKmN0eHQgPSAmcmVxLT5jb250ZXh0OwogCWludCBzdGF0dXM7CiAKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2NtZF9jcV9jcmVhdGUgXG4iKTsKIAlzcGluX2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CiAJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKIApAQCAtMjg5LDcgKzQ2NCw2IEBACiAKIAliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKIAkJCU9QQ09ERV9DT01NT05fQ1FfQ1JFQVRFLCBzaXplb2YoKnJlcSkpOwotCiAJaWYgKCFxX21lbS0+dmEpCiAJCVNFX0RFQlVHKERCR19MVkxfMSwgInVuaW5pdGlhbGl6ZWQgcV9tZW0tPnZhXG4iKTsKIApAQCAtMzI5LDYgKzUwMyw1MyBAQAogCQlsZW5fZW5jb2RlZCA9IDA7CiAJcmV0dXJuIGxlbl9lbmNvZGVkOwogfQorCitpbnQgYmVpc2NzaV9jbWRfbWNjcV9jcmVhdGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jY3EsCisJCQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3EpCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYjsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9tY2NfY3JlYXRlICpyZXE7CisJc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtID0gJm1jY3EtPmRtYV9tZW07CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybDsKKwl2b2lkICpjdHh0OworCWludCBzdGF0dXM7CisKKwlzcGluX2xvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKKwljdHJsID0gJnBoYmEtPmN0cmw7CisJd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwljdHh0ID0gJnJlcS0+Y29udGV4dDsKKworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CisKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCU9QQ09ERV9DT01NT05fTUNDX0NSRUFURSwgc2l6ZW9mKCpyZXEpKTsKKworCXJlcS0+bnVtX3BhZ2VzID0gUEFHRVNfNEtfU1BBTk5FRChxX21lbS0+dmEsIHFfbWVtLT5zaXplKTsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfbWNjX2NvbnRleHQsIGZpZCwgY3R4dCwKKwkJICAgICAgUENJX0ZVTkMocGhiYS0+cGNpZGV2LT5kZXZmbikpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfbWNjX2NvbnRleHQsIHZhbGlkLCBjdHh0LCAxKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX21jY19jb250ZXh0LCByaW5nX3NpemUsIGN0eHQsCisJCWJlX2VuY29kZWRfcV9sZW4obWNjcS0+bGVuKSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9tY2NfY29udGV4dCwgY3FfaWQsIGN0eHQsIGNxLT5pZCk7CisKKwliZV9kd3NfY3B1X3RvX2xlKGN0eHQsIHNpemVvZihyZXEtPmNvbnRleHQpKTsKKworCWJlX2NtZF9wYWdlX2FkZHJzX3ByZXBhcmUocmVxLT5wYWdlcywgQVJSQVlfU0laRShyZXEtPnBhZ2VzKSwgcV9tZW0pOworCisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnlfd2FpdChwaGJhKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdHJ1Y3QgYmVfY21kX3Jlc3BfbWNjX2NyZWF0ZSAqcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwkJbWNjcS0+aWQgPSBsZTE2X3RvX2NwdShyZXNwLT5pZCk7CisJCW1jY3EtPmNyZWF0ZWQgPSB0cnVlOworCX0KKwlzcGluX3VubG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKwogaW50IGJlaXNjc2lfY21kX3FfZGVzdHJveShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcSwKIAkJCSAgaW50IHF1ZXVlX3R5cGUpCiB7CkBAIC0zMzcsNiArNTU4LDcgQEAKIAl1OCBzdWJzeXMgPSAwLCBvcGNvZGUgPSAwOwogCWludCBzdGF0dXM7CiAKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2NtZF9xX2Rlc3Ryb3kgXG4iKTsKIAlzcGluX2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CiAJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKIAliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOwpAQCAtMzUwLDYgKzU3MiwxMCBAQAogCQlzdWJzeXMgPSBDTURfU1VCU1lTVEVNX0NPTU1PTjsKIAkJb3Bjb2RlID0gT1BDT0RFX0NPTU1PTl9DUV9ERVNUUk9ZOwogCQlicmVhazsKKwljYXNlIFFUWVBFX01DQ1E6CisJCXN1YnN5cyA9IENNRF9TVUJTWVNURU1fQ09NTU9OOworCQlvcGNvZGUgPSBPUENPREVfQ09NTU9OX01DQ19ERVNUUk9ZOworCQlicmVhazsKIAljYXNlIFFUWVBFX1dSQlE6CiAJCXN1YnN5cyA9IENNRF9TVUJTWVNURU1fSVNDU0k7CiAJCW9wY29kZSA9IE9QQ09ERV9DT01NT05fSVNDU0lfV1JCUV9ERVNUUk9ZOwpAQCAtMzc3LDMwICs2MDMsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludCBiZV9jbWRfZ2V0X21hY19hZGRyKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHU4ICptYWNfYWRkcikKLXsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOwotCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9tYWNfYWRkciAqcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwotCWludCBzdGF0dXM7Ci0KLQlzcGluX2xvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKLQliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOwotCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0ksCi0JCQkgICBPUENPREVfQ09NTU9OX0lTQ1NJX05UV0tfR0VUX05JQ19DT05GSUcsCi0JCQkgICBzaXplb2YoKnJlcSkpOwotCi0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7Ci0JaWYgKCFzdGF0dXMpIHsKLQkJc3RydWN0IGJlX2NtZF9yZXNwX2dldF9tYWNfYWRkciAqcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKLQotCQltZW1jcHkobWFjX2FkZHIsIHJlc3AtPm1hY19hZGRyZXNzLCBFVEhfQUxFTik7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQogaW50IGJlX2NtZF9jcmVhdGVfZGVmYXVsdF9wZHVfcXVldWUoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKIAkJCQkgICAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxLAogCQkJCSAgICBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZHEsIGludCBsZW5ndGgsCkBAIC00MTIsNiArNjE0LDcgQEAKIAl2b2lkICpjdHh0ID0gJnJlcS0+Y29udGV4dDsKIAlpbnQgc3RhdHVzOwogCisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVfY21kX2NyZWF0ZV9kZWZhdWx0X3BkdV9xdWV1ZVxuIik7CiAJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOwogCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CiAKQEAgLTQ2OCw4ICs2NzEsMTAgQEAKIAliZV9jbWRfcGFnZV9hZGRyc19wcmVwYXJlKHJlcS0+cGFnZXMsIEFSUkFZX1NJWkUocmVxLT5wYWdlcyksIHFfbWVtKTsKIAogCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOwotCWlmICghc3RhdHVzKQorCWlmICghc3RhdHVzKSB7CiAJCXdyYnEtPmlkID0gbGUxNl90b19jcHUocmVzcC0+Y2lkKTsKKwkJd3JicS0+Y3JlYXRlZCA9IHRydWU7CisJfQogCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaAppbmRleCBjMjBkNjg2Li41ZGU4YWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKQEAgLTQ3LDYgKzQ3LDggQEAKIAogI2RlZmluZSBDUUVfRkxBR1NfVkFMSURfTUFTSyAoMSA8PCAzMSkKICNkZWZpbmUgQ1FFX0ZMQUdTX0FTWU5DX01BU0sgKDEgPDwgMzApCisjZGVmaW5lIENRRV9GTEFHU19DT01QTEVURURfTUFTSyAJKDEgPDwgMjgpCisjZGVmaW5lIENRRV9GTEFHU19DT05TVU1FRF9NQVNLIAkoMSA8PCAyNykKIAogLyogQ29tcGxldGlvbiBTdGF0dXMgKi8KICNkZWZpbmUgTUNDX1NUQVRVU19TVUNDRVNTIDB4MApAQCAtMTczLDcgKzE3NSw3IEBACiAJdTggZG9tYWluOwkJLyogZHdvcmQgMCAqLwogCXUzMiB0aW1lb3V0OwkJLyogZHdvcmQgMSAqLwogCXUzMiByZXF1ZXN0X2xlbmd0aDsJLyogZHdvcmQgMiAqLwotCXUzMiByc3ZkOwkJLyogZHdvcmQgMyAqLworCXUzMiByc3ZkMDsJCS8qIGR3b3JkIDMgKi8KIH07CiAKIHN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgewpAQCAtMzgyLDcgKzM4NCw2IEBACiAKICNkZWZpbmUgRVRIX0FMRU4JNgogCi0KIHN0cnVjdCBiZV9jbWRfcmVxX2dldF9tYWNfYWRkciB7CiAJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKIAl1MzIgbmljX3BvcnRfY291bnQ7CkBAIC00MTcsMTQgKzQxOCwyMSBAQAogCiBpbnQgYmVpc2NzaV9jbWRfcV9kZXN0cm95KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxLAogCQkJICBpbnQgdHlwZSk7CitpbnQgYmVpc2NzaV9jbWRfbWNjcV9jcmVhdGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jY3EsCisJCQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3EpOworCiBpbnQgYmVfcG9sbF9tY2Moc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCk7Ci11bnNpZ25lZCBjaGFyIG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOwotaW50IGJlX2NtZF9nZXRfbWFjX2FkZHIoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwgdTggKm1hY19hZGRyKTsKK3Vuc2lnbmVkIGNoYXIgbWdtdF9jaGVja19zdXBwb3J0ZWRfZncoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKKwkJCQkgICAgICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOworaW50IGJlX2NtZF9nZXRfbWFjX2FkZHIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1OCAqbWFjX2FkZHIpOwogCiAvKklTQ1NJIEZ1bmN0dWlvbnMgKi8KIGludCBiZV9jbWRfZndfaW5pdGlhbGl6ZShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKTsKIAogc3RydWN0IGJlX21jY193cmIgKndyYl9mcm9tX21ib3goc3RydWN0IGJlX2RtYV9tZW0gKm1ib3hfbWVtKTsKK3N0cnVjdCBiZV9tY2Nfd3JiICp3cmJfZnJvbV9tY2NxKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CitpbnQgYmVfbWNjX25vdGlmeV93YWl0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CiAKIGludCBiZV9tYm94X25vdGlmeShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKTsKIApAQCAtNTMxLDYgKzUzOSwyMyBAQAogCXU4IHZhbGlkOwkJLyogZHdvcmQgMyAqLwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBTT0xfSUNEX0lOREVYX01BU0sJMHgwMDAzRkZDMAorc3RydWN0IGFtYXBfc29sX2NxZV9yaW5nIHsKKwl1OCBod19zdHNbOF07CQkvKiBkd29yZCAwICovCisJdTggaV9zdHNbOF07CQkvKiBkd29yZCAwICovCisJdTggaV9yZXNwWzhdOwkJLyogZHdvcmQgMCAqLworCXU4IGlfZmxhZ3NbN107CQkvKiBkd29yZCAwICovCisJdTggczsJCQkvKiBkd29yZCAwICovCisJdTggaV9leHBfY21kX3NuWzMyXTsJLyogZHdvcmQgMSAqLworCXU4IGNvZGVbNl07CQkvKiBkd29yZCAyICovCisJdTggaWNkX2luZGV4WzEyXTsJLyogZHdvcmQgMiAqLworCXU4IHJzdmRbNl07CQkvKiBkd29yZCAyICovCisJdTggaV9jbWRfd25kWzhdOwkvKiBkd29yZCAyICovCisJdTggaV9yZXNfY250WzMxXTsJLyogZHdvcmQgMyAqLworCXU4IHZhbGlkOwkJLyogZHdvcmQgMyAqLworfSBfX3BhY2tlZDsKKworCiAKIC8qKgogICogUG9zdCBXUkIgUXVldWUgRG9vcmJlbGwgUmVnaXN0ZXIgdXNlZCBieSB0aGUgaG9zdCBTdG9yYWdlCkBAIC02NjQsOCArNjg5LDggQEAKICNkZWZpbmUJT1BDT0RFX0NPTU1PTl9UQ1BfVVBMT0FECTU2CiAjZGVmaW5lIE9QQ09ERV9DT01NT05fSVNDU0lfRVJST1JfUkVDT1ZFUllfSU5WQUxJREFURV9DT01NQU5EUyAxCiAvKiAtLS0gQ01EX0lTQ1NJX0lOVkFMSURBVEVfQ09OTkVDVElPTl9UWVBFIC0tLSAqLwotI2RlZmluZSBDTURfSVNDU0lfQ09OTkVDVElPTl9JTlZBTElEQVRFIDEKLSNkZWZpbmUgQ01EX0lTQ1NJX0NPTk5FQ1RJT05fSVNTVUVfVENQX1JTVCAyCisjZGVmaW5lIENNRF9JU0NTSV9DT05ORUNUSU9OX0lOVkFMSURBVEUgMHg4MDAxCisjZGVmaW5lIENNRF9JU0NTSV9DT05ORUNUSU9OX0lTU1VFX1RDUF9SU1QgMHg4MDAyCiAjZGVmaW5lIE9QQ09ERV9JU0NTSV9JTklfRFJJVkVSX0lOVkFMSURBVEVfQ09OTkVDVElPTiA0MgogCiAjZGVmaW5lIElOSV9XUl9DTUQJCQkxCS8qIEluaXRpYXRvciB3cml0ZSBjb21tYW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jCmluZGV4IDJmZDI1NDQuLmQ1ODdiMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jCkBAIC02NywxMSArNjcsMTEgQEAKIAkJY21kc19tYXggPSBiZWlzY3NpX2VwLT5waGJhLT5wYXJhbXMud3Jic19wZXJfY3huOwogCX0KIAotCSBjbHNfc2Vzc2lvbiA9IGlzY3NpX3Nlc3Npb25fc2V0dXAoJmJlaXNjc2lfaXNjc2lfdHJhbnNwb3J0LAotCQkJCQkgICBzaG9zdCwgY21kc19tYXgsCi0JCQkJCSAgIHNpemVvZigqYmVpc2NzaV9zZXNzKSwKLQkJCQkJICAgc2l6ZW9mKCppb190YXNrKSwKLQkJCQkJICAgaW5pdGlhbF9jbWRzbiwgSVNDU0lfTUFYX1RBUkdFVCk7CisJY2xzX3Nlc3Npb24gPSBpc2NzaV9zZXNzaW9uX3NldHVwKCZiZWlzY3NpX2lzY3NpX3RyYW5zcG9ydCwKKwkJCQkJICBzaG9zdCwgY21kc19tYXgsCisJCQkJCSAgc2l6ZW9mKCpiZWlzY3NpX3Nlc3MpLAorCQkJCQkgIHNpemVvZigqaW9fdGFzayksCisJCQkJCSAgaW5pdGlhbF9jbWRzbiwgSVNDU0lfTUFYX1RBUkdFVCk7CiAJaWYgKCFjbHNfc2Vzc2lvbikKIAkJcmV0dXJuIE5VTEw7CiAJc2VzcyA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAKIAlzd2l0Y2ggKHBhcmFtKSB7CiAJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKLQkJYmVfY21kX2dldF9tYWNfYWRkcigmcGhiYS0+Y3RybCwgcGhiYS0+bWFjX2FkZHJlc3MpOworCQliZV9jbWRfZ2V0X21hY19hZGRyKHBoYmEsIHBoYmEtPm1hY19hZGRyZXNzKTsKIAkJbGVuID0gc3lzZnNfZm9ybWF0X21hYyhidWYsIHBoYmEtPm1hY19hZGRyZXNzLCBFVEhfQUxFTik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0zNzcsMTYgKzM3NywxMiBAQAogCXN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiA9IGNvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXA7CiAJc3RydWN0IGJlaXNjc2lfb2ZmbG9hZF9wYXJhbXMgcGFyYW1zOwotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbi0+Y2xzX3Nlc3Npb24pOwotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CiAKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBiZWlzY3NpX29mZmxvYWRfcGFyYW1zKSk7CiAJYmVpc2NzaV9lcCA9IGJlaXNjc2lfY29ubi0+ZXA7CiAJaWYgKCFiZWlzY3NpX2VwKQogCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJJbiBiZWlzY3NpX2Nvbm5fc3RhcnQgLCBubyBiZWlzY3NpX2VwXG4iKTsKIAotCWZyZWVfbWdtdF9zZ2xfaGFuZGxlKHBoYmEsIGJlaXNjc2lfY29ubi0+cGxvZ2luX3NnbF9oYW5kbGUpOwogCWJlaXNjc2lfY29ubi0+bG9naW5faW5fcHJvZ3Jlc3MgPSAwOwogCWJlaXNjc2lfc2V0X3BhcmFtc19mb3Jfb2ZmbGQoYmVpc2NzaV9jb25uLCAmcGFyYW1zKTsKIAliZWlzY3NpX29mZmxvYWRfY29ubmVjdGlvbihiZWlzY3NpX2Nvbm4sICZwYXJhbXMpOwpAQCAtNDk4LDYgKzQ5NCwxMyBAQAogCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJzaG9zdCBpcyBOVUxMIFxuIik7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQorCisJaWYgKHBoYmEtPnN0YXRlKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiVGhlIEFkYXBldCBzdGF0ZSBpcyBOb3QgVVAgXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKIAllcCA9IGlzY3NpX2NyZWF0ZV9lbmRwb2ludChzaXplb2Yoc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQpKTsKIAlpZiAoIWVwKSB7CiAJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwppbmRleCA0ZjFhY2EzLi4xYTU1N2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKQEAgLTM5LDcgKzM5LDggQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBiZV9pb3BvbGxfYnVkZ2V0ID0gMTA7CiBzdGF0aWMgdW5zaWduZWQgaW50IGJlX21heF9waHlzX3NpemUgPSA2NDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW5hYmxlX21zaXg7CitzdGF0aWMgdW5zaWduZWQgaW50IGVuYWJsZV9tc2l4ID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmluZ19tb2RlOwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmVpc2NzaV9wY2lfaWRfdGFibGUpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDICIgIiBCVUlMRF9TVFIpOwpAQCAtNTgsNiArNTksMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tIFBDSSBEcml2ZXIgb3BlcmF0aW9ucyBhbmQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJlaXNjc2lfcGNpX2lkX3RhYmxlKSA9IHsKKwl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBCRV9ERVZJQ0VfSUQxKSB9LAorCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIE9DX0RFVklDRV9JRDEpIH0sCisJeyBQQ0lfREVWSUNFKEJFX1ZFTkRPUl9JRCwgT0NfREVWSUNFX0lEMikgfSwKKwl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBPQ19ERVZJQ0VfSUQzKSB9LAorCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIE9DX0RFVklDRV9JRDQpIH0sCisJeyAwIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmVpc2NzaV9wY2lfaWRfdGFibGUpOworCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBiZWlzY3NpX3NodCA9IHsKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgPSAiU2VydmVyRW5naW5lcyAxMEdiZSBvcGVuLWlzY3NpIEluaXRpYXRvciBEcml2ZXIiLApAQCAtNzYsMTYgKzg4LDggQEAKIAkuY21kX3Blcl9sdW4gPSBCRUlTQ1NJX0NNRF9QRVJfTFVOLAogCS51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HLAogfTsKLXN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmJlaXNjc2lfc2NzaV90cmFuc3BvcnQ7CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLSBQQ0kgRHJpdmVyIG9wZXJhdGlvbnMgYW5kIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShiZWlzY3NpX3BjaV9pZF90YWJsZSkgPSB7Ci0JeyBQQ0lfREVWSUNFKEJFX1ZFTkRPUl9JRCwgQkVfREVWSUNFX0lEMSkgfSwKLQl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBPQ19ERVZJQ0VfSUQxKSB9LAotCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIE9DX0RFVklDRV9JRDIpIH0sCi0JeyAwIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmVpc2NzaV9wY2lfaWRfdGFibGUpOworc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqYmVpc2NzaV9zY3NpX3RyYW5zcG9ydDsKIAogc3RhdGljIHN0cnVjdCBiZWlzY3NpX2hiYSAqYmVpc2NzaV9oYmFfYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBjaWRldikKIHsKQEAgLTEwNCw3ICsxMDgsNiBAQAogCXNob3N0LT5tYXhfY21kX2xlbiA9IEJFSVNDU0lfTUFYX0NNRF9MRU47CiAJc2hvc3QtPm1heF9sdW4gPSBCRUlTQ1NJX05VTV9NQVhfTFVOOwogCXNob3N0LT50cmFuc3BvcnR0ID0gYmVpc2NzaV9zY3NpX3RyYW5zcG9ydDsKLQogCXBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwogCW1lbXNldChwaGJhLCAwLCBzaXplb2YoKnBoYmEpKTsKIAlwaGJhLT5zaG9zdCA9IHNob3N0OwpAQCAtMTgxLDYgKzE4NCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKIAlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKIAkJcmV0ID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyZXQpIHsKQEAgLTIwMyw3ICsyMDcsNiBAQAogCXN0YXR1cyA9IGJlaXNjc2lfbWFwX3BjaV9iYXJzKHBoYmEsIHBkZXYpOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7Ci0KIAltYm94X21lbV9hbGxvYy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfbWNjX21haWxib3gpICsgMTY7CiAJbWJveF9tZW1fYWxsb2MtPnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKIAkJCQkJCSAgbWJveF9tZW1fYWxsb2MtPnNpemUsCkBAIC0yMTksNiArMjIyLDkgQEAKIAltYm94X21lbV9hbGlnbi0+ZG1hID0gUFRSX0FMSUdOKG1ib3hfbWVtX2FsbG9jLT5kbWEsIDE2KTsKIAltZW1zZXQobWJveF9tZW1fYWxpZ24tPnZhLCAwLCBzaXplb2Yoc3RydWN0IGJlX21jY19tYWlsYm94KSk7CiAJc3Bpbl9sb2NrX2luaXQoJmN0cmwtPm1ib3hfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBoYmEtPmN0cmwubWNjX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwaGJhLT5jdHJsLm1jY19jcV9sb2NrKTsKKwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTI2OCw2ICsyNzQsMTEzIEBACiB9CiAKIC8qKgorICogYmVfaXNyX21jYyAtIFRoZSBpc3Igcm91dGluZSBvZiB0aGUgZHJpdmVyLgorICogQGlycTogTm90IHVzZWQKKyAqIEBkZXZfaWQ6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYmVfaXNyX21jYyhpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jYzsKKwl1bnNpZ25lZCBpbnQgbnVtX2VxX3Byb2Nlc3NlZDsKKwlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBiZV9lcSA9IGRldl9pZDsKKwllcSA9ICZwYmVfZXEtPnE7CisJcGhiYSA9ICBwYmVfZXEtPnBoYmE7CisJbWNjID0gJnBoYmEtPmN0cmwubWNjX29iai5jcTsKKwllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCWlmICghZXFlKQorCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJlcWUgaXMgTlVMTFxuIik7CisKKwludW1fZXFfcHJvY2Vzc2VkID0gMDsKKworCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KKwkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CisJCWlmICgoKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksCisJCSAgICAgcmVzb3VyY2VfaWQpIC8gMzJdICYKKwkJICAgICBFUUVfUkVTSURfTUFTSykgPj4gMTYpID09IG1jYy0+aWQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOworCQkJcGhiYS0+dG9kb19tY2NfY3EgPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKKwkJcXVldWVfdGFpbF9pbmMoZXEpOworCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCQludW1fZXFfcHJvY2Vzc2VkKys7CisJfQorCWlmIChwaGJhLT50b2RvX21jY19jcSkKKwkJcXVldWVfd29yayhwaGJhLT53cSwgJnBoYmEtPndvcmtfY3FzKTsKKwlpZiAobnVtX2VxX3Byb2Nlc3NlZCkKKwkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAxLAludW1fZXFfcHJvY2Vzc2VkLCAxLCAxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBiZV9pc3JfbXNpeCAtIFRoZSBpc3Igcm91dGluZSBvZiB0aGUgZHJpdmVyLgorICogQGlycTogTm90IHVzZWQKKyAqIEBkZXZfaWQ6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYmVfaXNyX21zaXgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwlzdHJ1Y3QgYmVfZXFfZW50cnkgKmVxZSA9IE5VTEw7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcTsKKwl1bnNpZ25lZCBpbnQgbnVtX2VxX3Byb2Nlc3NlZDsKKwlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBiZV9lcSA9IGRldl9pZDsKKwllcSA9ICZwYmVfZXEtPnE7CisJY3EgPSBwYmVfZXEtPmNxOworCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJaWYgKCFlcWUpCisJCVNFX0RFQlVHKERCR19MVkxfMSwgImVxZSBpcyBOVUxMXG4iKTsKKworCXBoYmEgPSBwYmVfZXEtPnBoYmE7CisJbnVtX2VxX3Byb2Nlc3NlZCA9IDA7CisJaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkgeworCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCisJCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKKwkJCWlmICghYmxrX2lvcG9sbF9zY2hlZF9wcmVwKCZwYmVfZXEtPmlvcG9sbCkpCisJCQkJYmxrX2lvcG9sbF9zY2hlZCgmcGJlX2VxLT5pb3BvbGwpOworCisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKKwkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKKwkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJCQludW1fZXFfcHJvY2Vzc2VkKys7CisJCX0KKwkJaWYgKG51bV9lcV9wcm9jZXNzZWQpCisJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDEsCW51bV9lcV9wcm9jZXNzZWQsIDAsIDEpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgeworCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCisJCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKKwkJCXBoYmEtPnRvZG9fY3EgPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKKwkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOworCQkJcXVldWVfdGFpbF9pbmMoZXEpOworCQkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKKwkJCW51bV9lcV9wcm9jZXNzZWQrKzsKKwkJfQorCQlpZiAocGhiYS0+dG9kb19jcSkKKwkJCXF1ZXVlX3dvcmsocGhiYS0+d3EsICZwaGJhLT53b3JrX2Nxcyk7CisKKwkJaWYgKG51bV9lcV9wcm9jZXNzZWQpCisJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDEsIG51bV9lcV9wcm9jZXNzZWQsIDEsIDEpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9Cit9CisKKy8qKgogICogYmVfaXNyIC0gVGhlIGlzciByb3V0aW5lIG9mIHRoZSBkcml2ZXIuCiAgKiBAaXJxOiBOb3QgdXNlZAogICogQGRldl9pZDogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCkBAIC0yODAsNDggKzM5Myw3MCBAQAogCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2M7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgaW5kZXg7Ci0JdW5zaWduZWQgaW50IG51bV9lcV9wcm9jZXNzZWQ7CisJdW5zaWduZWQgaW50IG51bV9tY2NlcV9wcm9jZXNzZWQsIG51bV9pb2VxX3Byb2Nlc3NlZDsKIAlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsOworCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKIAlpbnQgaXNyOwogCiAJcGhiYSA9IGRldl9pZDsKLQlpZiAoIWVuYWJsZV9tc2l4KSB7Ci0JCWN0cmwgPSAmcGhiYS0+Y3RybDs7Ci0JCWlzciA9IGlvcmVhZDMyKGN0cmwtPmNzciArIENFVl9JU1IwX09GRlNFVCArCi0JCQkgICAgICAgKFBDSV9GVU5DKGN0cmwtPnBkZXYtPmRldmZuKSAqIENFVl9JU1JfU0laRSkpOwotCQlpZiAoIWlzcikKLQkJCXJldHVybiBJUlFfTk9ORTsKLQl9CisJY3RybCA9ICZwaGJhLT5jdHJsOzsKKwlpc3IgPSBpb3JlYWQzMihjdHJsLT5jc3IgKyBDRVZfSVNSMF9PRkZTRVQgKworCQkgICAgICAgKFBDSV9GVU5DKGN0cmwtPnBkZXYtPmRldmZuKSAqIENFVl9JU1JfU0laRSkpOworCWlmICghaXNyKQorCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7Ci0JZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcS5xOwotCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3E7CisJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbMF07CisKKwllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxWzBdLnE7CisJbWNjID0gJnBoYmEtPmN0cmwubWNjX29iai5jcTsKIAlpbmRleCA9IDA7CiAJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKIAlpZiAoIWVxZSkKIAkJU0VfREVCVUcoREJHX0xWTF8xLCAiZXFlIGlzIE5VTExcbiIpOwogCi0JbnVtX2VxX3Byb2Nlc3NlZCA9IDA7CisJbnVtX2lvZXFfcHJvY2Vzc2VkID0gMDsKKwludW1fbWNjZXFfcHJvY2Vzc2VkID0gMDsKIAlpZiAoYmxrX2lvcG9sbF9lbmFibGVkKSB7CiAJCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KIAkJCQkJJiBFUUVfVkFMSURfTUFTSykgewotCQkJaWYgKCFibGtfaW9wb2xsX3NjaGVkX3ByZXAoJnBoYmEtPmlvcG9sbCkpCi0JCQkJYmxrX2lvcG9sbF9zY2hlZCgmcGhiYS0+aW9wb2xsKTsKLQorCQkJaWYgKCgoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwKKwkJCSAgICAgcmVzb3VyY2VfaWQpIC8gMzJdICYKKwkJCSAgICAgRVFFX1JFU0lEX01BU0spID4+IDE2KSA9PSBtY2MtPmlkKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCQkJcGhiYS0+dG9kb19tY2NfY3EgPSAxOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmcGJlX2VxLT5pb3BvbGwpKQorCQkJCQlibGtfaW9wb2xsX3NjaGVkKCZwYmVfZXEtPmlvcG9sbCk7CisJCQkJbnVtX2lvZXFfcHJvY2Vzc2VkKys7CisJCQl9CiAJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKIAkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKIAkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCQludW1fZXFfcHJvY2Vzc2VkKys7Ci0JCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJWYWxpZCBFUUVcbiIpOwogCQl9Ci0JCWlmIChudW1fZXFfcHJvY2Vzc2VkKSB7Ci0JCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDAsCW51bV9lcV9wcm9jZXNzZWQsIDAsIDEpOworCQlpZiAobnVtX2lvZXFfcHJvY2Vzc2VkIHx8IG51bV9tY2NlcV9wcm9jZXNzZWQpIHsKKwkJCWlmIChwaGJhLT50b2RvX21jY19jcSkKKwkJCQlxdWV1ZV93b3JrKHBoYmEtPndxLCAmcGhiYS0+d29ya19jcXMpOworCisJCWlmICgobnVtX21jY2VxX3Byb2Nlc3NlZCkgJiYgKCFudW1faW9lcV9wcm9jZXNzZWQpKQorCQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKKwkJCQkJICAgICAgKG51bV9pb2VxX3Byb2Nlc3NlZCArCisJCQkJCSAgICAgICBudW1fbWNjZXFfcHJvY2Vzc2VkKSAsIDEsIDEpOworCQkJZWxzZQorCQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKKwkJCQkJICAgICAgIChudW1faW9lcV9wcm9jZXNzZWQgKworCQkJCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCksIDAsIDEpOworCiAJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJCX0gZWxzZQogCQkJcmV0dXJuIElSUV9OT05FOwogCX0gZWxzZSB7CisJCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3FbMF07CiAJCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KIAkJCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKIApAQCAtMzM5LDEzICs0NzQsMTQgQEAKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOwogCQkJcXVldWVfdGFpbF9pbmMoZXEpOwogCQkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKLQkJCW51bV9lcV9wcm9jZXNzZWQrKzsKKwkJCW51bV9pb2VxX3Byb2Nlc3NlZCsrOwogCQl9CiAJCWlmIChwaGJhLT50b2RvX2NxIHx8IHBoYmEtPnRvZG9fbWNjX2NxKQogCQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBoYmEtPndvcmtfY3FzKTsKIAotCQlpZiAobnVtX2VxX3Byb2Nlc3NlZCkgewotCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLCBudW1fZXFfcHJvY2Vzc2VkLCAxLCAxKTsKKwkJaWYgKG51bV9pb2VxX3Byb2Nlc3NlZCkgeworCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLAorCQkJCSAgICAgICBudW1faW9lcV9wcm9jZXNzZWQsIDEsIDEpOwogCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQl9IGVsc2UKIAkJCXJldHVybiBJUlFfTk9ORTsKQEAgLTM1NSwxMyArNDkxLDMyIEBACiBzdGF0aWMgaW50IGJlaXNjc2lfaW5pdF9pcnFzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gcGhiYS0+cGNpZGV2OwotCWludCByZXQ7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOworCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKKwlpbnQgcmV0LCBtc2l4X3ZlYywgaSA9IDA7CisJY2hhciBkZXNjWzMyXTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBiZV9pc3IsIElSUUZfU0hBUkVELCAiYmVpc2NzaSIsIHBoYmEpOwotCWlmIChyZXQpIHsKLQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfaW5pdF9pcnFzLSIKLQkJCSAgICAgIkZhaWxlZCB0byByZWdpc3RlciBpcnFcXG4iKTsKLQkJcmV0dXJuIHJldDsKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CisKKwlpZiAocGhiYS0+bXNpeF9lbmFibGVkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7CisJCQlzcHJpbnRmKGRlc2MsICJiZWlzY3NpX21zaXhfJTA0eCIsIGkpOworCQkJbXNpeF92ZWMgPSBwaGJhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yOworCQkJcmV0ID0gcmVxdWVzdF9pcnEobXNpeF92ZWMsIGJlX2lzcl9tc2l4LCAwLCBkZXNjLAorCQkJCQkgICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldKTsKKwkJfQorCQltc2l4X3ZlYyA9IHBoYmEtPm1zaXhfZW50cmllc1tpXS52ZWN0b3I7CisJCXJldCA9IHJlcXVlc3RfaXJxKG1zaXhfdmVjLCBiZV9pc3JfbWNjLCAwLCAiYmVpc2NzaV9tc2l4X21jYyIsCisJCQkJICAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIGJlX2lzciwgSVJRRl9TSEFSRUQsCisJCQkJICAiYmVpc2NzaSIsIHBoYmEpOworCQlpZiAocmV0KSB7CisJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LCAiYmVpc2NzaV9pbml0X2lycXMtIgorCQkJCSAgICAgIkZhaWxlZCB0byByZWdpc3RlciBpcnFcXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNzgsMTUgKzUzMyw2IEBACiAJaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9DUV9PRkZTRVQpOwogfQogCi0vKgotICogYXN5bmMgcGR1cyBpbmNsdWRlCi0gKiBhLiB1bnNvbGljaXRlZCBOT1AtSW4gKHRhcmdldCBpbml0aWF0ZWQgTk9QLUluKQotICogYi4gQXN5bmMgTWVzc2FnZXMKLSAqIGMuIFJlamVjdCBQRFUKLSAqIGQuIExvZ2luIHJlc3BvbnNlCi0gKiBUaGVzZSBoZWFkZXJzIGFycml2ZSB1bnByb2Nlc3NlZCBieSB0aGUgRVAgZmlybXdhcmUgYW5kIGlTQ1NJIGxheWVyCi0gKiBwcm9jZXNzIHRoZW0KLSAqLwogc3RhdGljIHVuc2lnbmVkIGludAogYmVpc2NzaV9wcm9jZXNzX2FzeW5jX3BkdShzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCiAJCQkgIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKQEAgLTM5Nyw2ICs1NDMsOSBAQAogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOwogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKwlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKKwlzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICppb190YXNrOworCXN0cnVjdCBpc2NzaV9oZHIgKmxvZ2luX2hkcjsKIAogCXN3aXRjaCAocHBkdS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfcGR1X2Jhc2UsIG9wY29kZSkgLyAzMl0gJgogCQkJCQkJUERVQkFTRV9PUENPREVfTUFTSykgewpAQCAtNDEyLDYgKzU2MSwxMCBAQAogCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJJbiBJU0NTSV9PUF9SRUpFQ1RcbiIpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX09QX0xPR0lOX1JTUDoKKwkJdGFzayA9IGNvbm4tPmxvZ2luX3Rhc2s7CisJCWlvX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCQlsb2dpbl9oZHIgPSAoc3RydWN0IGlzY3NpX2hkciAqKXBwZHU7CisJCWxvZ2luX2hkci0+aXR0ID0gaW9fdGFzay0+bGliaXNjc2lfaXR0OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKQEAgLTQ0MCw3ICs1OTMsOCBAQAogCQkJCQkJaW9fc2dsX2FsbG9jX2luZGV4XTsKIAkJcGhiYS0+aW9fc2dsX2huZGxfYmFzZVtwaGJhLT5pb19zZ2xfYWxsb2NfaW5kZXhdID0gTlVMTDsKIAkJcGhiYS0+aW9fc2dsX2huZGxfYXZibC0tOwotCQlpZiAocGhiYS0+aW9fc2dsX2FsbG9jX2luZGV4ID09IChwaGJhLT5wYXJhbXMuaW9zX3Blcl9jdHJsIC0gMSkpCisJCWlmIChwaGJhLT5pb19zZ2xfYWxsb2NfaW5kZXggPT0gKHBoYmEtPnBhcmFtcy4KKwkJCQkJCSBpb3NfcGVyX2N0cmwgLSAxKSkKIAkJCXBoYmEtPmlvX3NnbF9hbGxvY19pbmRleCA9IDA7CiAJCWVsc2UKIAkJCXBoYmEtPmlvX3NnbF9hbGxvY19pbmRleCsrOwpAQCAtNDkwLDkgKzY0NCwxOCBAQAogCiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CiAJcHdyYl9jb250ZXh0ID0gJnBod2lfY3RybHItPndyYl9jb250ZXh0W2NpZF07Ci0JcHdyYl9oYW5kbGUgPSBwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2VbaW5kZXhdOwotCXB3cmJfaGFuZGxlLT53cmJfaW5kZXggPSBpbmRleDsKLQlwd3JiX2hhbmRsZS0+bnh0X3dyYl9pbmRleCA9IGluZGV4OworCWlmIChwd3JiX2NvbnRleHQtPndyYl9oYW5kbGVzX2F2YWlsYWJsZSkgeworCQlwd3JiX2hhbmRsZSA9IHB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZVsKKwkJCQkJICAgIHB3cmJfY29udGV4dC0+YWxsb2NfaW5kZXhdOworCQlwd3JiX2NvbnRleHQtPndyYl9oYW5kbGVzX2F2YWlsYWJsZS0tOworCQlwd3JiX2hhbmRsZS0+bnh0X3dyYl9pbmRleCA9IHB3cmJfaGFuZGxlLT53cmJfaW5kZXg7CisJCWlmIChwd3JiX2NvbnRleHQtPmFsbG9jX2luZGV4ID09CisJCQkJCQkocGhiYS0+cGFyYW1zLndyYnNfcGVyX2N4biAtIDEpKQorCQkJcHdyYl9jb250ZXh0LT5hbGxvY19pbmRleCA9IDA7CisJCWVsc2UKKwkJCXB3cmJfY29udGV4dC0+YWxsb2NfaW5kZXgrKzsKKwl9IGVsc2UKKwkJcHdyYl9oYW5kbGUgPSBOVUxMOwogCXJldHVybiBwd3JiX2hhbmRsZTsKIH0KIApAQCAtNTA4LDExICs2NzEsMjAgQEAKIGZyZWVfd3JiX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBod2lfd3JiX2NvbnRleHQgKnB3cmJfY29udGV4dCwKIAkJc3RydWN0IHdyYl9oYW5kbGUgKnB3cmJfaGFuZGxlKQogeworCWlmICghcmluZ19tb2RlKQorCQlwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2VbcHdyYl9jb250ZXh0LT5mcmVlX2luZGV4XSA9CisJCQkJCSAgICAgICBwd3JiX2hhbmRsZTsKKwlwd3JiX2NvbnRleHQtPndyYl9oYW5kbGVzX2F2YWlsYWJsZSsrOworCWlmIChwd3JiX2NvbnRleHQtPmZyZWVfaW5kZXggPT0gKHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4gLSAxKSkKKwkJcHdyYl9jb250ZXh0LT5mcmVlX2luZGV4ID0gMDsKKwllbHNlCisJCXB3cmJfY29udGV4dC0+ZnJlZV9pbmRleCsrOworCiAJU0VfREVCVUcoREJHX0xWTF84LAotCQkgIkZSRUUgV1JCOiBwd3JiX2hhbmRsZT0lcCBmcmVlX2luZGV4PSVkPTB4JXgiCisJCSAiRlJFRSBXUkI6IHB3cmJfaGFuZGxlPSVwIGZyZWVfaW5kZXg9MHgleCIKIAkJICJ3cmJfaGFuZGxlc19hdmFpbGFibGU9JWQgXG4iLAogCQkgcHdyYl9oYW5kbGUsIHB3cmJfY29udGV4dC0+ZnJlZV9pbmRleCwKLQkJIHB3cmJfY29udGV4dC0+ZnJlZV9pbmRleCwgcHdyYl9jb250ZXh0LT53cmJfaGFuZGxlc19hdmFpbGFibGUpOworCQkgcHdyYl9jb250ZXh0LT53cmJfaGFuZGxlc19hdmFpbGFibGUpOwogfQogCiBzdGF0aWMgc3RydWN0IHNnbF9oYW5kbGUgKmFsbG9jX21nbXRfc2dsX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCkBAIC01NDAsNiArNzEyLDggQEAKIGZyZWVfbWdtdF9zZ2xfaGFuZGxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgc3RydWN0IHNnbF9oYW5kbGUgKnBzZ2xfaGFuZGxlKQogewogCisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gIGZyZWVfbWdtdF9zZ2xfaGFuZGxlLGVoX3NnbF9mcmVlX2luZGV4PSVkIFxuIiwKKwkJCSAgICAgcGhiYS0+ZWhfc2dsX2ZyZWVfaW5kZXgpOwogCWlmIChwaGJhLT5laF9zZ2xfaG5kbF9iYXNlW3BoYmEtPmVoX3NnbF9mcmVlX2luZGV4XSkgewogCQkvKgogCQkgKiB0aGlzIGNhbiBoYXBwZW4gaWYgY2xlYW5fdGFzayBpcyBjYWxsZWQgb24gYSB0YXNrIHRoYXQKQEAgLTU3MiwxMCArNzQ2LDEwIEBACiAJdTMyIHJlc2lkID0gMCwgZXhwX2NtZHNuLCBtYXhfY21kc247CiAJdTggcnNwLCBzdGF0dXMsIGZsYWdzOwogCi0JZXhwX2NtZHNuID0gYmUzMl90b19jcHUocHNvbC0+CisJZXhwX2NtZHNuID0gKHBzb2wtPgogCQkJZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9leHBfY21kX3NuKSAvIDMyXQogCQkJJiBTT0xfRVhQX0NNRF9TTl9NQVNLKTsKLQltYXhfY21kc24gPSBiZTMyX3RvX2NwdSgocHNvbC0+CisJbWF4X2NtZHNuID0gKChwc29sLT4KIAkJCWR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfZXhwX2NtZF9zbikgLyAzMl0KIAkJCSYgU09MX0VYUF9DTURfU05fTUFTSykgKwogCQkJKChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2NtZF93bmQpCkBAIC02MTAsOSArNzg0LDkgQEAKIAl9CiAKIAlpZiAoc3RhdHVzID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgeworCQl1bnNpZ25lZCBzaG9ydCAqc2xlbiA9ICh1bnNpZ25lZCBzaG9ydCAqKXN0c19iaHMtPnNlbnNlX2luZm87CiAJCXNlbnNlID0gc3RzX2Jocy0+c2Vuc2VfaW5mbyArIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7Ci0JCXNlbnNlX2xlbiA9Ci0JCSAgICBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpKHN0c19iaHMtPnNlbnNlX2luZm9bMF0pKTsKKwkJc2Vuc2VfbGVuID0gIGNwdV90b19iZTE2KCpzbGVuKTsKIAkJbWVtY3B5KHRhc2stPnNjLT5zZW5zZV9idWZmZXIsIHNlbnNlLAogCQkgICAgICAgbWluX3QodTE2LCBzZW5zZV9sZW4sIFNDU0lfU0VOU0VfQlVGRkVSU0laRSkpOwogCX0KQEAgLTYyMCw4ICs3OTQsOCBAQAogCQlpZiAocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9yZXNfY250KSAvIDMyXQogCQkJCQkJCSYgU09MX1JFU19DTlRfTUFTSykKIAkJCSBjb25uLT5yeGRhdGFfb2N0ZXRzICs9IChwc29sLT4KLQkJCSAgICAgIGR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfcmVzX2NudCkgLyAzMl0KLQkJCQkJCQkmIFNPTF9SRVNfQ05UX01BU0spOworCQkJICAgICBkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX3Jlc19jbnQpIC8gMzJdCisJCQkgICAgICYgU09MX1JFU19DTlRfTUFTSyk7CiAJfQogdW5tYXA6CiAJc2NzaV9kbWFfdW5tYXAoaW9fdGFzay0+c2NzaV9jbW5kKTsKQEAgLTYzMyw2ICs4MDcsNyBAQAogCQkgICBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgc3RydWN0IHNvbF9jcWUgKnBzb2wpCiB7CiAJc3RydWN0IGlzY3NpX2xvZ291dF9yc3AgKmhkcjsKKwlzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICppb190YXNrID0gdGFzay0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGJlaXNjc2lfY29ubi0+Y29ubjsKIAogCWhkciA9IChzdHJ1Y3QgaXNjc2lfbG9nb3V0X3JzcCAqKXRhc2stPmhkcjsKQEAgLTY1MSw3ICs4MjYsNyBAQAogCQkJKChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2NtZF93bmQpCiAJCQkJCS8gMzJdICYgU09MX0NNRF9XTkRfTUFTSykgPj4gMjQpIC0gMSk7CiAJaGRyLT5obGVuZ3RoID0gMDsKLQorCWhkci0+aXR0ID0gaW9fdGFzay0+bGliaXNjc2lfaXR0OwogCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopaGRyLCBOVUxMLCAwKTsKIH0KIApAQCAtNjYxLDYgKzgzNiw3IEBACiB7CiAJc3RydWN0IGlzY3NpX3RtX3JzcCAqaGRyOwogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOworCXN0cnVjdCBiZWlzY3NpX2lvX3Rhc2sgKmlvX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOwogCiAJaGRyID0gKHN0cnVjdCBpc2NzaV90bV9yc3AgKil0YXNrLT5oZHI7CiAJaGRyLT5mbGFncyA9ICgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9mbGFncykgLyAzMl0KQEAgLTY2OCwxMSArODQ0LDEyIEBACiAJaGRyLT5yZXNwb25zZSA9IChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX3Jlc3ApIC8KIAkJCQkJMzJdICYgU09MX1JFU1BfTUFTSyk7CiAJaGRyLT5leHBfY21kc24gPSBjcHVfdG9fYmUzMihwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLAotCQkJCSAgICAgaV9leHBfY21kX3NuKSAvIDMyXSAmIFNPTF9FWFBfQ01EX1NOX01BU0spOworCQkJCSAgICBpX2V4cF9jbWRfc24pIC8gMzJdICYgU09MX0VYUF9DTURfU05fTUFTSyk7CiAJaGRyLT5tYXhfY21kc24gPSBiZTMyX3RvX2NwdSgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwKIAkJCWlfZXhwX2NtZF9zbikgLyAzMl0gJiBTT0xfRVhQX0NNRF9TTl9NQVNLKSArCiAJCQkoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfY21kX3duZCkKIAkJCS8gMzJdICYgU09MX0NNRF9XTkRfTUFTSykgPj4gMjQpIC0gMSk7CisJaGRyLT5pdHQgPSBpb190YXNrLT5saWJpc2NzaV9pdHQ7CiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKiloZHIsIE5VTEwsIDApOwogfQogCkBAIC02ODEsMTggKzg1OCwzNiBAQAogCQkgICAgICAgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3Qgc29sX2NxZSAqcHNvbCkKIHsKIAlzdHJ1Y3QgaHdpX3dyYl9jb250ZXh0ICpwd3JiX2NvbnRleHQ7Ci0Jc3RydWN0IHdyYl9oYW5kbGUgKnB3cmJfaGFuZGxlOworCXN0cnVjdCB3cmJfaGFuZGxlICpwd3JiX2hhbmRsZSA9IE5VTEw7CisJc3RydWN0IHNnbF9oYW5kbGUgKnBzZ2xfaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CisJc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzazsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGJlaXNjc2lfY29ubi0+Y29ubjsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKLQlwd3JiX2NvbnRleHQgPSAmcGh3aV9jdHJsci0+d3JiX2NvbnRleHRbKChwc29sLT4KKwlpZiAocmluZ19tb2RlKSB7CisJCXBzZ2xfaGFuZGxlID0gcGhiYS0+c2dsX2huZGxfYXJyYXlbKChwc29sLT4KKwkJCSAgICAgIGR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWVfcmluZywgaWNkX2luZGV4KSAvCisJCQkJMzJdICYgU09MX0lDRF9JTkRFWF9NQVNLKSA+PiA2KV07CisJCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT53cmJfY29udGV4dFtwc2dsX2hhbmRsZS0+Y2lkXTsKKwkJdGFzayA9IHBzZ2xfaGFuZGxlLT50YXNrOworCQlwd3JiX2hhbmRsZSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHdyYl9jb250ZXh0ID0gJnBod2lfY3RybHItPndyYl9jb250ZXh0WygocHNvbC0+CiAJCQkJZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY2lkKSAvIDMyXSAmCiAJCQkJU09MX0NJRF9NQVNLKSA+PiA2KV07Ci0JcHdyYl9oYW5kbGUgPSBwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2VzdGRbKChwc29sLT4KKwkJcHdyYl9oYW5kbGUgPSBwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2VzdGRbKChwc29sLT4KIAkJCQlkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCB3cmJfaW5kZXgpIC8KIAkJCQkzMl0gJiBTT0xfV1JCX0lOREVYX01BU0spID4+IDE2KV07CisJCXRhc2sgPSBwd3JiX2hhbmRsZS0+cGlvX2hhbmRsZTsKKwl9CisKKwlpb190YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzcGluX2xvY2soJnBoYmEtPm1nbXRfc2dsX2xvY2spOworCWZyZWVfbWdtdF9zZ2xfaGFuZGxlKHBoYmEsIGlvX3Rhc2stPnBzZ2xfaGFuZGxlKTsKKwlzcGluX3VubG9jaygmcGhiYS0+bWdtdF9zZ2xfbG9jayk7CiAJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAlmcmVlX3dyYl9oYW5kbGUocGhiYSwgcHdyYl9jb250ZXh0LCBwd3JiX2hhbmRsZSk7CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwpAQCAtNzA0LDYgKzg5OSw3IEBACiB7CiAJc3RydWN0IGlzY3NpX25vcGluICpoZHI7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBiZWlzY3NpX2Nvbm4tPmNvbm47CisJc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzayA9IHRhc2stPmRkX2RhdGE7CiAKIAloZHIgPSAoc3RydWN0IGlzY3NpX25vcGluICopdGFzay0+aGRyOwogCWhkci0+ZmxhZ3MgPSAoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfZmxhZ3MpIC8gMzJdCkBAIC03MTUsNiArOTExLDcgQEAKIAkJCSgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9jbWRfd25kKQogCQkJLyAzMl0gJiBTT0xfQ01EX1dORF9NQVNLKSA+PiAyNCkgLSAxKTsKIAloZHItPm9wY29kZSA9IElTQ1NJX09QX05PT1BfSU47CisJaGRyLT5pdHQgPSBpb190YXNrLT5saWJpc2NzaV9pdHQ7CiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKiloZHIsIE5VTEwsIDApOwogfQogCkBAIC03MjYsMjUgKzkyMywzMyBAQAogCXN0cnVjdCBpc2NzaV93cmIgKnB3cmIgPSBOVUxMOwogCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKIAlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKLQlzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICppb190YXNrOworCXN0cnVjdCBzZ2xfaGFuZGxlICpwc2dsX2hhbmRsZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IHR5cGU7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBiZWlzY3NpX2Nvbm4tPmNvbm47CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7Ci0KLQlwd3JiX2NvbnRleHQgPSAmcGh3aV9jdHJsci0+Ci0JCXdyYl9jb250ZXh0WygocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY2lkKSAvIDMyXQotCQkmIFNPTF9DSURfTUFTSykgPj4gNildOwotCXB3cmJfaGFuZGxlID0gcHdyYl9jb250ZXh0LT5wd3JiX2hhbmRsZV9iYXNlc3RkWygocHNvbC0+CisJaWYgKHJpbmdfbW9kZSkgeworCQlwc2dsX2hhbmRsZSA9IHBoYmEtPnNnbF9obmRsX2FycmF5WygocHNvbC0+CisJCQkgICAgICBkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlX3JpbmcsIGljZF9pbmRleCkgLworCQkJICAgICAgMzJdICYgU09MX0lDRF9JTkRFWF9NQVNLKSA+PiA2KV07CisJCXRhc2sgPSBwc2dsX2hhbmRsZS0+dGFzazsKKwkJdHlwZSA9IHBzZ2xfaGFuZGxlLT50eXBlOworCX0gZWxzZSB7CisJCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT4KKwkJCQl3cmJfY29udGV4dFsoKHBzb2wtPmR3W29mZnNldG9mCisJCQkJKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNpZCkgLyAzMl0KKwkJCQkmIFNPTF9DSURfTUFTSykgPj4gNildOworCQlwd3JiX2hhbmRsZSA9IHB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZXN0ZFsoKHBzb2wtPgogCQkJCWR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIHdyYl9pbmRleCkgLwogCQkJCTMyXSAmIFNPTF9XUkJfSU5ERVhfTUFTSykgPj4gMTYpXTsKLQotCXRhc2sgPSBwd3JiX2hhbmRsZS0+cGlvX2hhbmRsZTsKLQlpb190YXNrID0gdGFzay0+ZGRfZGF0YTsKKwkJdGFzayA9IHB3cmJfaGFuZGxlLT5waW9faGFuZGxlOworCQlwd3JiID0gcHdyYl9oYW5kbGUtPnB3cmI7CisJCXR5cGUgPSAocHdyYi0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlKSAvIDMyXSAmCisJCQkgV1JCX1RZUEVfTUFTSykgPj4gMjg7CisJfQogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0JcHdyYiA9IHB3cmJfaGFuZGxlLT5wd3JiOwotCXN3aXRjaCAoKHB3cmItPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgdHlwZSkgLyAzMl0gJgotCQkgV1JCX1RZUEVfTUFTSykgPj4gMjgpIHsKKwlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEhXSF9UWVBFX0lPOgogCWNhc2UgSFdIX1RZUEVfSU9fUkQ6CiAJCWlmICgodGFzay0+aGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgPT0KQEAgLTc3MywxMiArOTc4LDIxIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCi0JCQkgICAgIndyYl9pbmRleCAweCV4IENJRCAweCV4XG4iLAotCQkJICAgICgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlKSAvCi0JCQkJCTMyXSAmIFNPTF9XUkJfSU5ERVhfTUFTSykgPj4gMTYpLAotCQkJICAgICgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY2lkKSAvIDMyXQotCQkJCQkmIFNPTF9DSURfTUFTSykgPj4gNikpOworCQlpZiAocmluZ19tb2RlKQorCQkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkJIkluIGh3aV9jb21wbGV0ZV9jbWQsIHVua25vd24gdHlwZSA9ICVkIgorCQkJCSJpY2RfaW5kZXggMHgleCBDSUQgMHgleFxuIiwgdHlwZSwKKwkJCQkoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWVfcmluZywKKwkJCQlpY2RfaW5kZXgpIC8gMzJdICYgU09MX0lDRF9JTkRFWF9NQVNLKSA+PiA2KSwKKwkJCQlwc2dsX2hhbmRsZS0+Y2lkKTsKKwkJZWxzZQorCQkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkJIkluIGh3aV9jb21wbGV0ZV9jbWQsIHVua25vd24gdHlwZSA9ICVkIgorCQkJCSJ3cmJfaW5kZXggMHgleCBDSUQgMHgleFxuIiwgdHlwZSwKKwkJCQkoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwKKwkJCQl0eXBlKSAvIDMyXSAmIFNPTF9XUkJfSU5ERVhfTUFTSykgPj4gMTYpLAorCQkJCSgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwKKwkJCQljaWQpIC8gMzJdICYgU09MX0NJRF9NQVNLKSA+PiA2KSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTIwOCw0MCArMTQyMiw1NSBAQAogCWh3aV9wb3N0X2FzeW5jX2J1ZmZlcnMocGhiYSwgcGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBiZWlzY3NpX3Byb2Nlc3NfY3Eoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJlaXNjc2lfcHJvY2Vzc19jcShzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXEpCiB7Ci0Jc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwotCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CiAJc3RydWN0IHNvbF9jcWUgKnNvbDsKIAlzdHJ1Y3QgZG1zZ19jcWUgKmRtc2c7CiAJdW5zaWduZWQgaW50IG51bV9wcm9jZXNzZWQgPSAwOwogCXVuc2lnbmVkIGludCB0b3RfbnVtcCA9IDA7CiAJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uOworCXN0cnVjdCBzZ2xfaGFuZGxlICpwc2dsX2hhbmRsZSA9IE5VTEw7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOwogCi0JcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7Ci0JcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwotCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3E7CisJY3EgPSBwYmVfZXEtPmNxOwogCXNvbCA9IHF1ZXVlX3RhaWxfbm9kZShjcSk7CisJcGhiYSA9IHBiZV9lcS0+cGhiYTsKIAogCXdoaWxlIChzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIHZhbGlkKSAvIDMyXSAmCiAJICAgICAgIENRRV9WQUxJRF9NQVNLKSB7CiAJCWJlX2R3c19sZV90b19jcHUoc29sLCBzaXplb2Yoc3RydWN0IHNvbF9jcWUpKTsKIAotCQliZWlzY3NpX2Nvbm4gPSBwaGJhLT5jb25uX3RhYmxlWyh1MzIpIChzb2wtPgorCQlpZiAocmluZ19tb2RlKSB7CisJCQlwc2dsX2hhbmRsZSA9IHBoYmEtPnNnbF9obmRsX2FycmF5Wygoc29sLT4KKwkJCQkgICAgICBkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlX3JpbmcsCisJCQkJICAgICAgaWNkX2luZGV4KSAvIDMyXSAmIFNPTF9JQ0RfSU5ERVhfTUFTSykKKwkJCQkgICAgICA+PiA2KV07CisJCQliZWlzY3NpX2Nvbm4gPSBwaGJhLT5jb25uX3RhYmxlW3BzZ2xfaGFuZGxlLT5jaWRdOworCQkJaWYgKCFiZWlzY3NpX2Nvbm4gfHwgIWJlaXNjc2lfY29ubi0+ZXApIHsKKwkJCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKKwkJCQkgICAgICJDb25uZWN0aW9uIHRhYmxlIGVtcHR5IGZvciBjaWQgPSAlZFxuIiwKKwkJCQkgICAgICBwc2dsX2hhbmRsZS0+Y2lkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJYmVpc2NzaV9jb25uID0gcGhiYS0+Y29ubl90YWJsZVsodTMyKSAoc29sLT4KIAkJCQkgZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY2lkKSAvIDMyXSAmCiAJCQkJIFNPTF9DSURfTUFTSykgPj4gNl07CiAKLQkJaWYgKCFiZWlzY3NpX2Nvbm4gfHwgIWJlaXNjc2lfY29ubi0+ZXApIHsKLQkJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAorCQkJaWYgKCFiZWlzY3NpX2Nvbm4gfHwgIWJlaXNjc2lfY29ubi0+ZXApIHsKKwkJCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKIAkJCQkgICAgICJDb25uZWN0aW9uIHRhYmxlIGVtcHR5IGZvciBjaWQgPSAlZFxuIiwKIAkJCQkgICAgICh1MzIpKHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwKIAkJCQkgICAgIGNpZCkgLyAzMl0gJiBTT0xfQ0lEX01BU0spID4+IDYpOwotCQkJcmV0dXJuIDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KIAogCQlpZiAobnVtX3Byb2Nlc3NlZCA+PSAzMikgewotCQkJaHdpX3JpbmdfY3FfZGIocGhiYSwgcGh3aV9jb250ZXh0LT5iZV9jcS5pZCwKKwkJCWh3aV9yaW5nX2NxX2RiKHBoYmEsIGNxLT5pZCwKIAkJCQkJbnVtX3Byb2Nlc3NlZCwgMCwgMCk7CiAJCQl0b3RfbnVtcCArPSBudW1fcHJvY2Vzc2VkOwogCQkJbnVtX3Byb2Nlc3NlZCA9IDA7CkBAIC0xMjU4LDggKzE0ODcsMTIgQEAKIAkJCWh3aV9jb21wbGV0ZV9kcnZyX21zZ3MoYmVpc2NzaV9jb25uLCBwaGJhLCBzb2wpOwogCQkJYnJlYWs7CiAJCWNhc2UgVU5TT0xfSERSX05PVElGWToKKwkJCVNFX0RFQlVHKERCR19MVkxfOCwgIlJlY2VpdmVkIFVOU09MX0hEUl8gTk9USUZZXG4iKTsKKwkJCWh3aV9wcm9jZXNzX2RlZmF1bHRfcGR1X3JpbmcoYmVpc2NzaV9jb25uLCBwaGJhLAorCQkJCQkgICAgIChzdHJ1Y3QgaV90X2RwZHVfY3FlICopc29sKTsKKwkJCWJyZWFrOwogCQljYXNlIFVOU09MX0RBVEFfTk9USUZZOgotCQkJU0VfREVCVUcoREJHX0xWTF84LCAiUmVjZWl2ZWQgVU5TT0xfSERSL0RBVEFfTk9USUZZXG4iKTsKKwkJCVNFX0RFQlVHKERCR19MVkxfOCwgIlJlY2VpdmVkIFVOU09MX0RBVEFfTk9USUZZXG4iKTsKIAkJCWh3aV9wcm9jZXNzX2RlZmF1bHRfcGR1X3JpbmcoYmVpc2NzaV9jb25uLCBwaGJhLAogCQkJCQkgICAgIChzdHJ1Y3QgaV90X2RwZHVfY3FlICopc29sKTsKIAkJCWJyZWFrOwpAQCAtMTI3OCwxMyArMTUxMSwyMSBAQAogCQljYXNlIENNRF9DWE5fS0lMTEVEX0lUVF9JTlZBTElEOgogCQljYXNlIENNRF9DWE5fS0lMTEVEX1NFUV9PVVRPRk9SREVSOgogCQljYXNlIENNRF9DWE5fS0lMTEVEX0lOVkFMSURfREFUQVNOX1JDVkQ6Ci0JCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQlpZiAocmluZ19tb2RlKSB7CisJCQkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJCSAiQ1EgRXJyb3Igbm90aWZpY2F0aW9uIGZvciBjbWQuLiAiCisJCQkJICJjb2RlICVkIGNpZCAweCV4XG4iLAorCQkJCSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNvZGUpIC8KKwkJCQkgMzJdICYgQ1FFX0NPREVfTUFTSywgcHNnbF9oYW5kbGUtPmNpZCk7CisJCQl9IGVsc2UgeworCQkJCVNFX0RFQlVHKERCR19MVkxfMSwKIAkJCQkgIkNRIEVycm9yIG5vdGlmaWNhdGlvbiBmb3IgY21kLi4gIgogCQkJCSAiY29kZSAlZCBjaWQgMHgleFxuIiwKIAkJCQkgc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBjb2RlKSAvCiAJCQkJIDMyXSAmIENRRV9DT0RFX01BU0ssCiAJCQkJIChzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNpZCkgLwogCQkJCSAzMl0gJiBTT0xfQ0lEX01BU0spKTsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFVOU09MX0RBVEFfRElHRVNUX0VSUk9SX05PVElGWToKIAkJCVNFX0RFQlVHKERCR19MVkxfMSwKQEAgLTEzMDYsMjMgKzE1NDcsMzcgQEAKIAkJY2FzZSBDWE5fS0lMTEVEX09WRVJfUlVOX1JFU0lEVUFMOgogCQljYXNlIENYTl9LSUxMRURfVU5ERVJfUlVOX1JFU0lEVUFMOgogCQljYXNlIENYTl9LSUxMRURfQ01ORF9EQVRBX05PVF9PTl9TQU1FX0NPTk46Ci0JCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJDUSBFcnJvciAlZCwgcmVzZXR0aW5nIENJRCAiCisJCQlpZiAocmluZ19tb2RlKSB7CisJCQkJU0VfREVCVUcoREJHX0xWTF8xLCAiQ1EgRXJyb3IgJWQsIHJlc2V0IENJRCAiCisJCQkJICIweCV4Li4uXG4iLAorCQkJCSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNvZGUpIC8KKwkJCQkgMzJdICYgQ1FFX0NPREVfTUFTSywgcHNnbF9oYW5kbGUtPmNpZCk7CisJCQl9IGVsc2UgeworCQkJCVNFX0RFQlVHKERCR19MVkxfMSwgIkNRIEVycm9yICVkLCByZXNldCBDSUQgIgogCQkJCSAiMHgleC4uLlxuIiwKIAkJCQkgc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBjb2RlKSAvCiAJCQkJIDMyXSAmIENRRV9DT0RFX01BU0ssCiAJCQkJIHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY2lkKSAvCiAJCQkJIDMyXSAmIENRRV9DSURfTUFTSyk7CisJCQl9CiAJCQlpc2NzaV9jb25uX2ZhaWx1cmUoYmVpc2NzaV9jb25uLT5jb25uLAogCQkJCQkgICBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogCQkJYnJlYWs7CiAJCWNhc2UgQ1hOX0tJTExFRF9SU1RfU0VOVDoKIAkJY2FzZSBDWE5fS0lMTEVEX1JTVF9SQ1ZEOgotCQkJU0VfREVCVUcoREJHX0xWTF8xLCAiQ1EgRXJyb3IgJWQsIHJlc2V0IHJlY2VpdmVkL3NlbnQgIgotCQkJCSAib24gQ0lEIDB4JXguLi5cbiIsCisJCQlpZiAocmluZ19tb2RlKSB7CisJCQkJU0VfREVCVUcoREJHX0xWTF8xLCAiQ1EgRXJyb3IgJWQsIHJlc2V0IgorCQkJCSJyZWNlaXZlZC9zZW50IG9uIENJRCAweCV4Li4uXG4iLAorCQkJCSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNvZGUpIC8KKwkJCQkgMzJdICYgQ1FFX0NPREVfTUFTSywgcHNnbF9oYW5kbGUtPmNpZCk7CisJCQl9IGVsc2UgeworCQkJCVNFX0RFQlVHKERCR19MVkxfMSwgIkNRIEVycm9yICVkLCByZXNldCIKKwkJCQkicmVjZWl2ZWQvc2VudCBvbiBDSUQgMHgleC4uLlxuIiwKIAkJCQkgc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBjb2RlKSAvCiAJCQkJIDMyXSAmIENRRV9DT0RFX01BU0ssCiAJCQkJIHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY2lkKSAvCiAJCQkJIDMyXSAmIENRRV9DSURfTUFTSyk7CisJCQl9CiAJCQlpc2NzaV9jb25uX2ZhaWx1cmUoYmVpc2NzaV9jb25uLT5jb25uLAogCQkJCQkgICBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogCQkJYnJlYWs7CkBAIC0xMzQ0LDggKzE1OTksNyBAQAogCiAJaWYgKG51bV9wcm9jZXNzZWQgPiAwKSB7CiAJCXRvdF9udW1wICs9IG51bV9wcm9jZXNzZWQ7Ci0JCWh3aV9yaW5nX2NxX2RiKHBoYmEsIHBod2lfY29udGV4dC0+YmVfY3EuaWQsIG51bV9wcm9jZXNzZWQsCi0JCQkgICAgICAgMSwgMCk7CisJCWh3aV9yaW5nX2NxX2RiKHBoYmEsIGNxLT5pZCwgbnVtX3Byb2Nlc3NlZCwgMSwgMCk7CiAJfQogCXJldHVybiB0b3RfbnVtcDsKIH0KQEAgLTEzNTMsMjEgKzE2MDcsMzAgQEAKIHN0YXRpYyB2b2lkIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CisJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOwogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9CiAJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVpc2NzaV9oYmEsIHdvcmtfY3FzKTsKIAorCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKKwlpZiAocGhiYS0+bXNpeF9lbmFibGVkKQorCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtwaGJhLT5udW1fY3B1c107CisJZWxzZQorCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVswXTsKKwogCWlmIChwaGJhLT50b2RvX21jY19jcSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKIAkJcGhiYS0+dG9kb19tY2NfY3EgPSAwOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJNQ0MgSW50ZXJydXB0IE5vdCBleHBlY3RlZCBcbiIpOwogCX0KIAogCWlmIChwaGJhLT50b2RvX2NxKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwogCQlwaGJhLT50b2RvX2NxID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJYmVpc2NzaV9wcm9jZXNzX2NxKHBoYmEpOworCQliZWlzY3NpX3Byb2Nlc3NfY3EocGJlX2VxKTsKIAl9CiB9CiAKQEAgLTEzNzUsMTkgKzE2MzgsMTUgQEAKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IHJldDsKIAlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmE7CisJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOwogCi0JcGhiYSA9IGNvbnRhaW5lcl9vZihpb3AsIHN0cnVjdCBiZWlzY3NpX2hiYSwgaW9wb2xsKTsKLQotCXJldCA9IGJlaXNjc2lfcHJvY2Vzc19jcShwaGJhKTsKKwlwYmVfZXEgPSBjb250YWluZXJfb2YoaW9wLCBzdHJ1Y3QgYmVfZXFfb2JqLCBpb3BvbGwpOworCXJldCA9IGJlaXNjc2lfcHJvY2Vzc19jcShwYmVfZXEpOwogCWlmIChyZXQgPCBidWRnZXQpIHsKLQkJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwotCQlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7Ci0KLQkJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7Ci0JCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKKwkJcGhiYSA9IHBiZV9lcS0+cGhiYTsKIAkJYmxrX2lvcG9sbF9jb21wbGV0ZShpb3ApOwotCQlod2lfcmluZ19lcV9kYihwaGJhLCBwaHdpX2NvbnRleHQtPmJlX2VxLnEuaWQsIDAsCi0JCQkJCQkJMCwgMSwgMSk7CisJCVNFX0RFQlVHKERCR19MVkxfOCwgInJlYXJtIHBiZV9lcS0+cS5pZCA9JWRcbiIsIHBiZV9lcS0+cS5pZCk7CisJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIHBiZV9lcS0+cS5pZCwgMCwgMCwgMSwgMSk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xNTM3LDE0ICsxNzk2LDEyIEBACiAKIHN0YXRpYyB2b2lkIGJlaXNjc2lfZmluZF9tZW1fcmVxKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKLQl1bnNpZ25lZCBpbnQgbnVtX2NxX3BhZ2VzLCBudW1fZXFfcGFnZXMsIG51bV9hc3luY19wZHVfYnVmX3BhZ2VzOworCXVuc2lnbmVkIGludCBudW1fY3FfcGFnZXMsIG51bV9hc3luY19wZHVfYnVmX3BhZ2VzOwogCXVuc2lnbmVkIGludCBudW1fYXN5bmNfcGR1X2RhdGFfcGFnZXMsIHdyYl9zel9wZXJfY3huOwogCXVuc2lnbmVkIGludCBudW1fYXN5bmNfcGR1X2J1Zl9zZ2xfcGFnZXMsIG51bV9hc3luY19wZHVfZGF0YV9zZ2xfcGFnZXM7CiAKIAludW1fY3FfcGFnZXMgPSBQQUdFU19SRVFVSVJFRChwaGJhLT5wYXJhbXMubnVtX2NxX2VudHJpZXMgKiBcCiAJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb2xfY3FlKSk7Ci0JbnVtX2VxX3BhZ2VzID0gUEFHRVNfUkVRVUlSRUQocGhiYS0+cGFyYW1zLm51bV9lcV9lbnRyaWVzICogXAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYmVfZXFfZW50cnkpKTsKIAludW1fYXN5bmNfcGR1X2J1Zl9wYWdlcyA9CiAJCQlQQUdFU19SRVFVSVJFRChwaGJhLT5wYXJhbXMuYXN5bmNwZHVzX3Blcl9jdHJsICogXAogCQkJCSAgICAgICBwaGJhLT5wYXJhbXMuZGVmcGR1X2hkcl9zeik7CkBAIC0xNTY1LDggKzE4MjIsNiBAQAogCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9BREROX0NPTlRFWFRdID0KIAkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5KTsKIAotCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9DUV0gPSBudW1fY3FfcGFnZXMgKiBQQUdFX1NJWkU7Ci0JcGhiYS0+bWVtX3JlcVtIV0lfTUVNX0VRXSA9IG51bV9lcV9wYWdlcyAqIFBBR0VfU0laRTsKIAogCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9XUkJdID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV93cmIpCiAJICAgICogKHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4pCkBAIC0xNzUxLDggKzIwMDYsNiBAQAogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGhiYS0+cGFyYW1zLmN4bnNfcGVyX2N0cmwgKiAyOyBpbmRleCArPSAyKSB7CiAJCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT53cmJfY29udGV4dFtpbmRleF07Ci0JCVNFX0RFQlVHKERCR19MVkxfOCwgImNpZD0lZCBwd3JiX2NvbnRleHQ9JXAgXG4iLCBpbmRleCwKLQkJCQkJCXB3cmJfY29udGV4dCk7CiAJCXB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZSA9CiAJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHdyYl9oYW5kbGUgKikgKgogCQkJCQlwaGJhLT5wYXJhbXMud3Jic19wZXJfY3huLCBHRlBfS0VSTkVMKTsKQEAgLTE3NjcsNiArMjAyMCw3IEBACiAJCQkJcHdyYl9jb250ZXh0LT5wd3JiX2hhbmRsZV9iYXNlc3RkW2pdID0KIAkJCQkJCQkJcHdyYl9oYW5kbGU7CiAJCQkJcHdyYl9jb250ZXh0LT53cmJfaGFuZGxlc19hdmFpbGFibGUrKzsKKwkJCQlwd3JiX2hhbmRsZS0+d3JiX2luZGV4ID0gajsKIAkJCQlwd3JiX2hhbmRsZSsrOwogCQkJfQogCQkJcHdyYl9jb250ZXh0LT5mcmVlX2luZGV4ID0gMDsKQEAgLTE3ODUsNiArMjAzOSw3IEBACiAJCQkJcHdyYl9jb250ZXh0LT5wd3JiX2hhbmRsZV9iYXNlc3RkW2pdID0KIAkJCQkgICAgcHdyYl9oYW5kbGU7CiAJCQkJcHdyYl9jb250ZXh0LT53cmJfaGFuZGxlc19hdmFpbGFibGUrKzsKKwkJCQlwd3JiX2hhbmRsZS0+d3JiX2luZGV4ID0gajsKIAkJCQlwd3JiX2hhbmRsZSsrOwogCQkJfQogCQkJcHdyYl9jb250ZXh0LT5mcmVlX2luZGV4ID0gMDsKQEAgLTIwNDIsNzkgKzIyOTcsMTI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmVpc2NzaV9jcmVhdGVfZXEoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorc3RhdGljIGludCBiZWlzY3NpX2NyZWF0ZV9lcXMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJICAgICBzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQpCiB7Ci0JdW5zaWduZWQgaW50IGlkeDsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpLCBudW1fZXFfcGFnZXM7CisJaW50IHJldCwgZXFfZm9yX21jYzsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CiAJc3RydWN0IGJlX2RtYV9tZW0gKm1lbTsKLQlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcjsKIAl2b2lkICplcV92YWRkcmVzczsKKwlkbWFfYWRkcl90IHBhZGRyOwogCi0JaWR4ID0gMDsKLQllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxLnE7Ci0JbWVtID0gJmVxLT5kbWFfbWVtOwotCW1lbV9kZXNjciA9IHBoYmEtPmluaXRfbWVtOwotCW1lbV9kZXNjciArPSBIV0lfTUVNX0VROwotCWVxX3ZhZGRyZXNzID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS52aXJ0dWFsX2FkZHJlc3M7CisJbnVtX2VxX3BhZ2VzID0gUEFHRVNfUkVRVUlSRUQocGhiYS0+cGFyYW1zLm51bV9lcV9lbnRyaWVzICogXAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYmVfZXFfZW50cnkpKTsKIAotCXJldCA9IGJlX2ZpbGxfcXVldWUoZXEsIHBoYmEtPnBhcmFtcy5udW1fZXFfZW50cmllcywKLQkJCSAgICBzaXplb2Yoc3RydWN0IGJlX2VxX2VudHJ5KSwgZXFfdmFkZHJlc3MpOwotCWlmIChyZXQpIHsKLQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKLQkJCSAgICAgImJlX2ZpbGxfcXVldWUgRmFpbGVkIGZvciBFUSBcbiIpOwotCQlyZXR1cm4gcmV0OworCWlmIChwaGJhLT5tc2l4X2VuYWJsZWQpCisJCWVxX2Zvcl9tY2MgPSAxOworCWVsc2UKKwkJZXFfZm9yX21jYyA9IDA7CisJZm9yIChpID0gMDsgaSA8IChwaGJhLT5udW1fY3B1cyArIGVxX2Zvcl9tY2MpOyBpKyspIHsKKwkJZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXS5xOworCQltZW0gPSAmZXEtPmRtYV9tZW07CisJCXBod2lfY29udGV4dC0+YmVfZXFbaV0ucGhiYSA9IHBoYmE7CisJCWVxX3ZhZGRyZXNzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LAorCQkJCQkJICAgICBudW1fZXFfcGFnZXMgKiBQQUdFX1NJWkUsCisJCQkJCQkgICAgICZwYWRkcik7CisJCWlmICghZXFfdmFkZHJlc3MpCisJCQlnb3RvIGNyZWF0ZV9lcV9lcnJvcjsKKworCQltZW0tPnZhID0gZXFfdmFkZHJlc3M7CisJCXJldCA9IGJlX2ZpbGxfcXVldWUoZXEsIHBoYmEtPnBhcmFtcy5udW1fZXFfZW50cmllcywKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBiZV9lcV9lbnRyeSksIGVxX3ZhZGRyZXNzKTsKKwkJaWYgKHJldCkgeworCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgRVEgXG4iKTsKKwkJCWdvdG8gY3JlYXRlX2VxX2Vycm9yOworCQl9CisKKwkJbWVtLT5kbWEgPSBwYWRkcjsKKwkJcmV0ID0gYmVpc2NzaV9jbWRfZXFfY3JlYXRlKCZwaGJhLT5jdHJsLCBlcSwKKwkJCQkJICAgIHBod2lfY29udGV4dC0+Y3VyX2VxZCk7CisJCWlmIChyZXQpIHsKKwkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkJICAgICAiYmVpc2NzaV9jbWRfZXFfY3JlYXRlIgorCQkJCSAgICAgIkZhaWxlZGZvciBFUSBcbiIpOworCQkJZ290byBjcmVhdGVfZXFfZXJyb3I7CisJCX0KKwkJU0VfREVCVUcoREJHX0xWTF84LCAiZXFpZCA9ICVkXG4iLCBwaHdpX2NvbnRleHQtPmJlX2VxW2ldLnEuaWQpOwogCX0KLQotCW1lbS0+ZG1hID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzOwotCi0JcmV0ID0gYmVpc2NzaV9jbWRfZXFfY3JlYXRlKCZwaGJhLT5jdHJsLCBlcSwKLQkJCQkgICAgcGh3aV9jb250ZXh0LT5iZV9lcS5jdXJfZXFkKTsKLQlpZiAocmV0KSB7Ci0JCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2NtZF9lcV9jcmVhdGUiCi0JCQkgICAgICJGYWlsZWRmb3IgRVEgXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JU0VfREVCVUcoREJHX0xWTF84LCAiZXEgaWQgaXMgJWRcbiIsIHBod2lfY29udGV4dC0+YmVfZXEucS5pZCk7CiAJcmV0dXJuIDA7CitjcmVhdGVfZXFfZXJyb3I6CisJZm9yIChpID0gMDsgaSA8IChwaGJhLT5udW1fY3B1cyArIDEpOyBpKyspIHsKKwkJZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXS5xOworCQltZW0gPSAmZXEtPmRtYV9tZW07CisJCWlmIChtZW0tPnZhKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsIG51bV9lcV9wYWdlcworCQkJCQkgICAgKiBQQUdFX1NJWkUsCisJCQkJCSAgICBtZW0tPnZhLCBtZW0tPmRtYSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYmVpc2NzaV9jcmVhdGVfY3Eoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorc3RhdGljIGludCBiZWlzY3NpX2NyZWF0ZV9jcXMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJICAgICBzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQpCiB7Ci0JdW5zaWduZWQgaW50IGlkeDsKKwl1bnNpZ25lZCBpbnQgaSwgbnVtX2NxX3BhZ2VzOwogCWludCByZXQ7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxLCAqZXE7CiAJc3RydWN0IGJlX2RtYV9tZW0gKm1lbTsKLQlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcjsKKwlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7CiAJdm9pZCAqY3FfdmFkZHJlc3M7CisJZG1hX2FkZHJfdCBwYWRkcjsKIAotCWlkeCA9IDA7Ci0JY3EgPSAmcGh3aV9jb250ZXh0LT5iZV9jcTsKLQllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxLnE7Ci0JbWVtID0gJmNxLT5kbWFfbWVtOwotCW1lbV9kZXNjciA9IHBoYmEtPmluaXRfbWVtOwotCW1lbV9kZXNjciArPSBIV0lfTUVNX0NROwotCWNxX3ZhZGRyZXNzID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS52aXJ0dWFsX2FkZHJlc3M7Ci0JcmV0ID0gYmVfZmlsbF9xdWV1ZShjcSwgcGhiYS0+cGFyYW1zLmljZHNfcGVyX2N0cmwgLyAyLAotCQkJICAgIHNpemVvZihzdHJ1Y3Qgc29sX2NxZSksIGNxX3ZhZGRyZXNzKTsKLQlpZiAocmV0KSB7Ci0JCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCi0JCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgSVNDU0kgQ1EgXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJbnVtX2NxX3BhZ2VzID0gUEFHRVNfUkVRVUlSRUQocGhiYS0+cGFyYW1zLm51bV9jcV9lbnRyaWVzICogXAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc29sX2NxZSkpOwogCi0JbWVtLT5kbWEgPSBtZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLmJ1c19hZGRyZXNzLnUuYTY0LmFkZHJlc3M7Ci0JcmV0ID0gYmVpc2NzaV9jbWRfY3FfY3JlYXRlKCZwaGJhLT5jdHJsLCBjcSwgZXEsIGZhbHNlLCBmYWxzZSwgMCk7Ci0JaWYgKHJldCkgewotCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAotCQkJICAgICAiYmVpc2NzaV9jbWRfZXFfY3JlYXRlIEZhaWxlZCBmb3IgSVNDU0kgQ1EgXG4iKTsKLQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQljcSA9ICZwaHdpX2NvbnRleHQtPmJlX2NxW2ldOworCQllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldLnE7CisJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCQlwYmVfZXEtPmNxID0gY3E7CisJCXBiZV9lcS0+cGhiYSA9IHBoYmE7CisJCW1lbSA9ICZjcS0+ZG1hX21lbTsKKwkJY3FfdmFkZHJlc3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsCisJCQkJCQkgICAgIG51bV9jcV9wYWdlcyAqIFBBR0VfU0laRSwKKwkJCQkJCSAgICAgJnBhZGRyKTsKKwkJaWYgKCFjcV92YWRkcmVzcykKKwkJCWdvdG8gY3JlYXRlX2NxX2Vycm9yOworCQlyZXQgPSBiZV9maWxsX3F1ZXVlKGNxLCBwaGJhLT5wYXJhbXMuaWNkc19wZXJfY3RybCAvIDIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc29sX2NxZSksIGNxX3ZhZGRyZXNzKTsKKwkJaWYgKHJldCkgeworCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgSVNDU0kgQ1EgXG4iKTsKKwkJCWdvdG8gY3JlYXRlX2NxX2Vycm9yOworCQl9CisKKwkJbWVtLT5kbWEgPSBwYWRkcjsKKwkJcmV0ID0gYmVpc2NzaV9jbWRfY3FfY3JlYXRlKCZwaGJhLT5jdHJsLCBjcSwgZXEsIGZhbHNlLAorCQkJCQkgICAgZmFsc2UsIDApOworCQlpZiAocmV0KSB7CisJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJCSAgICAgImJlaXNjc2lfY21kX2VxX2NyZWF0ZSIKKwkJCQkgICAgICJGYWlsZWQgZm9yIElTQ1NJIENRIFxuIik7CisJCQlnb3RvIGNyZWF0ZV9jcV9lcnJvcjsKKwkJfQorCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJpc2NzaSBjcV9pZCBpcyAlZCBmb3IgZXFfaWQgJWRcbiIsCisJCQkJCQkgY3EtPmlkLCBlcS0+aWQpOworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJU0NTSSBDUSBDUkVBVEVEXG4iKTsKIAl9Ci0JU0VfREVCVUcoREJHX0xWTF84LCAiaXNjc2kgY3EgaWQgaXMgJWRcbiIsIHBod2lfY29udGV4dC0+YmVfY3EuaWQpOwotCVNFX0RFQlVHKERCR19MVkxfOCwgIklTQ1NJIENRIENSRUFURURcbiIpOwogCXJldHVybiAwOworCitjcmVhdGVfY3FfZXJyb3I6CisJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKKwkJY3EgPSAmcGh3aV9jb250ZXh0LT5iZV9jcVtpXTsKKwkJbWVtID0gJmNxLT5kbWFfbWVtOworCQlpZiAobWVtLT52YSkKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LCBudW1fY3FfcGFnZXMKKwkJCQkJICAgICogUEFHRV9TSVpFLAorCQkJCQkgICAgbWVtLT52YSwgbWVtLT5kbWEpOworCX0KKwlyZXR1cm4gcmV0OworCiB9CiAKIHN0YXRpYyBpbnQKQEAgLTIxMzIsNyArMjQzNCw3IEBACiAKIAlpZHggPSAwOwogCWRxID0gJnBod2lfY29udGV4dC0+YmVfZGVmX2hkcnE7Ci0JY3EgPSAmcGh3aV9jb250ZXh0LT5iZV9jcTsKKwljcSA9ICZwaHdpX2NvbnRleHQtPmJlX2NxWzBdOwogCW1lbSA9ICZkcS0+ZG1hX21lbTsKIAltZW1fZGVzY3IgPSBwaGJhLT5pbml0X21lbTsKIAltZW1fZGVzY3IgKz0gSFdJX01FTV9BU1lOQ19IRUFERVJfUklORzsKQEAgLTIxNzYsNyArMjQ3OCw3IEBACiAKIAlpZHggPSAwOwogCWRhdGFxID0gJnBod2lfY29udGV4dC0+YmVfZGVmX2RhdGFxOwotCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3E7CisJY3EgPSAmcGh3aV9jb250ZXh0LT5iZV9jcVswXTsKIAltZW0gPSAmZGF0YXEtPmRtYV9tZW07CiAJbWVtX2Rlc2NyID0gcGhiYS0+aW5pdF9tZW07CiAJbWVtX2Rlc2NyICs9IEhXSV9NRU1fQVNZTkNfREFUQV9SSU5HOwpAQCAtMjIzOSw2ICsyNTQxLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJlX3F1ZXVlX2ZyZWUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcSkKK3sKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtID0gJnEtPmRtYV9tZW07CisJaWYgKG1lbS0+dmEpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LCBtZW0tPnNpemUsCisJCQltZW0tPnZhLCBtZW0tPmRtYSk7Cit9CisKK3N0YXRpYyBpbnQgYmVfcXVldWVfYWxsb2Moc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcSwKKwkJdTE2IGxlbiwgdTE2IGVudHJ5X3NpemUpCit7CisJc3RydWN0IGJlX2RtYV9tZW0gKm1lbSA9ICZxLT5kbWFfbWVtOworCisJbWVtc2V0KHEsIDAsIHNpemVvZigqcSkpOworCXEtPmxlbiA9IGxlbjsKKwlxLT5lbnRyeV9zaXplID0gZW50cnlfc2l6ZTsKKwltZW0tPnNpemUgPSBsZW4gKiBlbnRyeV9zaXplOworCW1lbS0+dmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsIG1lbS0+c2l6ZSwgJm1lbS0+ZG1hKTsKKwlpZiAoIW1lbS0+dmEpCisJCXJldHVybiAtMTsKKwltZW1zZXQobWVtLT52YSwgMCwgbWVtLT5zaXplKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludAogYmVpc2NzaV9jcmVhdGVfd3JiX3JpbmdzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKIAkJCSBzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQsCkBAIC0yMzI4LDEzICsyNjU0LDI5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBiZV9tY2NfcXVldWVzX2Rlc3Ryb3koc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxOworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKworCXEgPSAmcGhiYS0+Y3RybC5tY2Nfb2JqLnE7CisJaWYgKHEtPmNyZWF0ZWQpCisJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9NQ0NRKTsKKwliZV9xdWV1ZV9mcmVlKHBoYmEsIHEpOworCisJcSA9ICZwaGJhLT5jdHJsLm1jY19vYmouY3E7CisJaWYgKHEtPmNyZWF0ZWQpCisJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9DUSk7CisJYmVfcXVldWVfZnJlZShwaGJhLCBxKTsKK30KKwogc3RhdGljIHZvaWQgaHdpX2NsZWFudXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQogewogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxOwogCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKIAlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CiAJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwotCWludCBpOworCWludCBpLCBlcV9udW07CiAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CkBAIC0yMzQzLDcgKzI2ODUsNiBAQAogCQlpZiAocS0+Y3JlYXRlZCkKIAkJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9XUkJRKTsKIAl9Ci0KIAlmcmVlX3dyYl9oYW5kbGVzKHBoYmEpOwogCiAJcSA9ICZwaHdpX2NvbnRleHQtPmJlX2RlZl9oZHJxOwpAQCAtMjM1NiwxMyArMjY5Nyw3NiBAQAogCiAJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIE5VTEwsIFFUWVBFX1NHTCk7CiAKLQlxID0gJnBod2lfY29udGV4dC0+YmVfY3E7Ci0JaWYgKHEtPmNyZWF0ZWQpCi0JCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9DUSk7CisJZm9yIChpID0gMDsgaSA8IChwaGJhLT5udW1fY3B1cyk7IGkrKykgeworCQlxID0gJnBod2lfY29udGV4dC0+YmVfY3FbaV07CisJCWlmIChxLT5jcmVhdGVkKQorCQkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX0NRKTsKKwl9CisJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkKKwkJZXFfbnVtID0gMTsKKwllbHNlCisJCWVxX251bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IChwaGJhLT5udW1fY3B1cyArIGVxX251bSk7IGkrKykgeworCQlxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV0ucTsKKwkJaWYgKHEtPmNyZWF0ZWQpCisJCQliZWlzY3NpX2NtZF9xX2Rlc3Ryb3koY3RybCwgcSwgUVRZUEVfRVEpOworCX0KKwliZV9tY2NfcXVldWVzX2Rlc3Ryb3kocGhiYSk7Cit9CiAKLQlxID0gJnBod2lfY29udGV4dC0+YmVfZXEucTsKLQlpZiAocS0+Y3JlYXRlZCkKLQkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX0VRKTsKK3N0YXRpYyBpbnQgYmVfbWNjX3F1ZXVlc19jcmVhdGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dCkKK3sKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcSwgKmNxOworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKworCS8qIEFsbG9jIE1DQyBjb21wbCBxdWV1ZSAqLworCWNxID0gJnBoYmEtPmN0cmwubWNjX29iai5jcTsKKwlpZiAoYmVfcXVldWVfYWxsb2MocGhiYSwgY3EsIE1DQ19DUV9MRU4sCisJCQlzaXplb2Yoc3RydWN0IGJlX21jY19jb21wbCkpKQorCQlnb3RvIGVycjsKKwkvKiBBc2sgQkUgdG8gY3JlYXRlIE1DQyBjb21wbCBxdWV1ZTsgKi8KKwlpZiAocGhiYS0+bXNpeF9lbmFibGVkKSB7CisJCWlmIChiZWlzY3NpX2NtZF9jcV9jcmVhdGUoY3RybCwgY3EsICZwaHdpX2NvbnRleHQtPmJlX2VxCisJCQkJCSBbcGhiYS0+bnVtX2NwdXNdLnEsIGZhbHNlLCB0cnVlLCAwKSkKKwkJZ290byBtY2NfY3FfZnJlZTsKKwl9IGVsc2UgeworCQlpZiAoYmVpc2NzaV9jbWRfY3FfY3JlYXRlKGN0cmwsIGNxLCAmcGh3aV9jb250ZXh0LT5iZV9lcVswXS5xLAorCQkJCQkgIGZhbHNlLCB0cnVlLCAwKSkKKwkJZ290byBtY2NfY3FfZnJlZTsKKwl9CisKKwkvKiBBbGxvYyBNQ0MgcXVldWUgKi8KKwlxID0gJnBoYmEtPmN0cmwubWNjX29iai5xOworCWlmIChiZV9xdWV1ZV9hbGxvYyhwaGJhLCBxLCBNQ0NfUV9MRU4sIHNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYikpKQorCQlnb3RvIG1jY19jcV9kZXN0cm95OworCisJLyogQXNrIEJFIHRvIGNyZWF0ZSBNQ0MgcXVldWUgKi8KKwlpZiAoYmVpc2NzaV9jbWRfbWNjcV9jcmVhdGUocGhiYSwgcSwgY3EpKQorCQlnb3RvIG1jY19xX2ZyZWU7CisKKwlyZXR1cm4gMDsKKworbWNjX3FfZnJlZToKKwliZV9xdWV1ZV9mcmVlKHBoYmEsIHEpOworbWNjX2NxX2Rlc3Ryb3k6CisJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIGNxLCBRVFlQRV9DUSk7CittY2NfY3FfZnJlZToKKwliZV9xdWV1ZV9mcmVlKHBoYmEsIGNxKTsKK2VycjoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9udW1fY3B1cyh2b2lkKQoreworCWludCAgbnVtX2NwdXMgPSAwOworCisJbnVtX2NwdXMgPSBudW1fb25saW5lX2NwdXMoKTsKKwlpZiAobnVtX2NwdXMgPj0gTUFYX0NQVVMpCisJCW51bV9jcHVzID0gTUFYX0NQVVMgLSAxOworCisJU0VfREVCVUcoREJHX0xWTF84LCAibnVtX2NwdXMgPSAlZCBcbiIsIG51bV9jcHVzKTsKKwlyZXR1cm4gbnVtX2NwdXM7CiB9CiAKIHN0YXRpYyBpbnQgaHdpX2luaXRfcG9ydChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCkBAIC0yMzc2LDI2ICsyNzgwLDMzIEBACiAJZGVmX3BkdV9yaW5nX3N6ID0KIAkJcGhiYS0+cGFyYW1zLmFzeW5jcGR1c19wZXJfY3RybCAqIHNpemVvZihzdHJ1Y3QgcGh5c19hZGRyKTsKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKLQogCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKLQlwaHdpX2NvbnRleHQtPmJlX2VxLm1heF9lcWQgPSAwOwotCXBod2lfY29udGV4dC0+YmVfZXEubWluX2VxZCA9IDA7Ci0JcGh3aV9jb250ZXh0LT5iZV9lcS5jdXJfZXFkID0gNjQ7Ci0JcGh3aV9jb250ZXh0LT5iZV9lcS5lbmFibGVfYWljID0gZmFsc2U7CisJcGh3aV9jb250ZXh0LT5tYXhfZXFkID0gMDsKKwlwaHdpX2NvbnRleHQtPm1pbl9lcWQgPSAwOworCXBod2lfY29udGV4dC0+Y3VyX2VxZCA9IDY0OwogCWJlX2NtZF9md19pbml0aWFsaXplKCZwaGJhLT5jdHJsKTsKLQlzdGF0dXMgPSBiZWlzY3NpX2NyZWF0ZV9lcShwaGJhLCBwaHdpX2NvbnRleHQpOworCisJc3RhdHVzID0gYmVpc2NzaV9jcmVhdGVfZXFzKHBoYmEsIHBod2lfY29udGV4dCk7CiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJFUSBub3QgY3JlYXRlZCBcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIAotCXN0YXR1cyA9IG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3KGN0cmwpOworCXN0YXR1cyA9IGJlX21jY19xdWV1ZXNfY3JlYXRlKHBoYmEsIHBod2lfY29udGV4dCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gbWdtdF9jaGVja19zdXBwb3J0ZWRfZncoY3RybCwgcGhiYSk7CiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCiAJCQkgICAgICJVbnN1cHBvcnRlZCBmdyB2ZXJzaW9uIFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCisJaWYgKHBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9mZWF0dXJlcyA9PSAweDEpCisJCXJpbmdfbW9kZSA9IDE7CisJZWxzZQorCQlyaW5nX21vZGUgPSAwOwogCXN0YXR1cyA9IG1nbXRfZ2V0X2Z3X2NvbmZpZyhjdHJsLCBwaGJhKTsKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKQEAgLTI0MDMsNyArMjgxNCw3IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0Jc3RhdHVzID0gYmVpc2NzaV9jcmVhdGVfY3EocGhiYSwgcGh3aV9jb250ZXh0KTsKKwlzdGF0dXMgPSBiZWlzY3NpX2NyZWF0ZV9jcXMocGhiYSwgcGh3aV9jb250ZXh0KTsKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgIkNRIG5vdCBjcmVhdGVkXG4iKTsKIAkJZ290byBlcnJvcjsKQEAgLTI0NDcsNyArMjg1OCw2IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLQogc3RhdGljIGludCBod2lfaW5pdF9jb250cm9sbGVyKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CkBAIC0yNTMwLDYgKzI5NDAsMTggQEAKIAogCXBoYmEtPmlvX3NnbF9obmRsX2F2YmwgPSAwOwogCXBoYmEtPmVoX3NnbF9obmRsX2F2YmwgPSAwOworCisJaWYgKHJpbmdfbW9kZSkgeworCQlwaGJhLT5zZ2xfaG5kbF9hcnJheSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ2xfaGFuZGxlICopICoKKwkJCQkJICAgICAgcGhiYS0+cGFyYW1zLmljZHNfcGVyX2N0cmwsCisJCQkJCQkgR0ZQX0tFUk5FTCk7CisJCWlmICghcGhiYS0+c2dsX2huZGxfYXJyYXkpIHsKKwkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkgICAgICJNZW0gQWxsb2MgRmFpbGVkLiBGYWlsaW5nIHRvIGxvYWRcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKIAltZW1fZGVzY3Jfc2dsaCA9IHBoYmEtPmluaXRfbWVtOwogCW1lbV9kZXNjcl9zZ2xoICs9IEhXSV9NRU1fU0dMSDsKIAlpZiAoMSA9PSBtZW1fZGVzY3Jfc2dsaC0+bnVtX2VsZW1lbnRzKSB7CkBAIC0yNTM3LDYgKzI5NTksOCBAQAogCQkJCQkJIHBoYmEtPnBhcmFtcy5pb3NfcGVyX2N0cmwsCiAJCQkJCQkgR0ZQX0tFUk5FTCk7CiAJCWlmICghcGhiYS0+aW9fc2dsX2huZGxfYmFzZSkgeworCQkJaWYgKHJpbmdfbW9kZSkKKwkJCQlrZnJlZShwaGJhLT5zZ2xfaG5kbF9hcnJheSk7CiAJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAogCQkJCSAgICAgIk1lbSBBbGxvYyBGYWlsZWQuIEZhaWxpbmcgdG8gbG9hZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI2NTYsMTMgKzMwODAsMTIgQEAKIAlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxOwogCXU4IF9faW9tZW0gKmFkZHI7Ci0JdTMyIHJlZzsKKwl1MzIgcmVnLCBpOwogCXUzMiBlbmFibGVkOwogCiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CiAJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwogCi0JZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcS5xOwogCWFkZHIgPSAodTggX19pb21lbSAqKSAoKHU4IF9faW9tZW0gKikgY3RybC0+cGNpY2ZnICsKIAkJCVBDSUNGR19NRU1CQVJfQ1RSTF9JTlRfQ1RSTF9PRkZTRVQpOwogCXJlZyA9IGlvcmVhZDMyKGFkZHIpOwpAQCAtMjY3Myw5ICszMDk2LDExIEBACiAJCXJlZyB8PSBNRU1CQVJfQ1RSTF9JTlRfQ1RSTF9IT1NUSU5UUl9NQVNLOwogCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJyZWcgPXglMDh4IGFkZHI9JXAgXG4iLCByZWcsIGFkZHIpOwogCQlpb3dyaXRlMzIocmVnLCBhZGRyKTsKLQkJU0VfREVCVUcoREJHX0xWTF84LCAiZXEtPmlkPSVkIFxuIiwgZXEtPmlkKTsKLQotCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDAsIDAsIDEsIDEpOworCQlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKKwkJCWVxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV0ucTsKKwkJCVNFX0RFQlVHKERCR19MVkxfOCwgImVxLT5pZD0lZCBcbiIsIGVxLT5pZCk7CisJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDAsIDAsIDEsIDEpOworCQl9CiAJfSBlbHNlCiAJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAogCQkJICAgICAiSW4gaHdpX2VuYWJsZV9pbnRyLCBOb3QgRW5hYmxlZCBcbiIpOwpAQCAtMjcyMCw2ICszMTQ1LDggQEAKIAlpZiAoaGJhX3NldHVwX2NpZF90YmxzKHBoYmEpKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCiAJCQkgICAgICJGYWlsZWQgaW4gaGJhX3NldHVwX2NpZF90YmxzXG4iKTsKKwkJaWYgKHJpbmdfbW9kZSkKKwkJCWtmcmVlKHBoYmEtPnNnbF9obmRsX2FycmF5KTsKIAkJa2ZyZWUocGhiYS0+aW9fc2dsX2huZGxfYmFzZSk7CiAJCWtmcmVlKHBoYmEtPmVoX3NnbF9obmRsX2Jhc2UpOwogCQlnb3RvIGRvX2NsZWFudXBfY3RybHI7CkBAIC0yNzM4LDE3ICszMTY1LDI1IEBACiAJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcTsKIAlzdHJ1Y3QgYmVfZXFfZW50cnkgKmVxZSA9IE5VTEw7CisJaW50IGksIGVxX21zaXg7CiAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7Ci0JZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcS5xOwotCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkKKwkJZXFfbXNpeCA9IDE7CisJZWxzZQorCQllcV9tc2l4ID0gMDsKIAotCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KLQkJCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKLQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7Ci0JCXF1ZXVlX3RhaWxfaW5jKGVxKTsKKwlmb3IgKGkgPSAwOyBpIDwgKHBoYmEtPm51bV9jcHVzICsgZXFfbXNpeCk7IGkrKykgeworCQllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldLnE7CiAJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisKKwkJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQorCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKKwkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKKwkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJCX0KIAl9CiB9CiAKQEAgLTI3NjIsNiArMzE5Nyw4IEBACiAJCQkgICAgICJtZ210X2VwZndfY2xlYW51cCBGQUlMRUQgXG4iKTsKIAlod2lfY2xlYW51cChwaGJhKTsKIAlod2lfcHVyZ2VfZXEocGhiYSk7CisJaWYgKHJpbmdfbW9kZSkKKwkJa2ZyZWUocGhiYS0+c2dsX2huZGxfYXJyYXkpOwogCWtmcmVlKHBoYmEtPmlvX3NnbF9obmRsX2Jhc2UpOwogCWtmcmVlKHBoYmEtPmVoX3NnbF9obmRsX2Jhc2UpOwogCWtmcmVlKHBoYmEtPmNpZF9hcnJheSk7CkBAIC0yODQ2LDggKzMyODMsOSBAQAogCWJlX2R3c19sZV90b19jcHUocHdyYiwgc2l6ZW9mKHN0cnVjdCBpc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiKSk7CiAKIAlkb29yYmVsbCB8PSBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQgJiBEQl9XUkJfUE9TVF9DSURfTUFTSzsKLQlkb29yYmVsbCB8PSAocHdyYl9oYW5kbGUtPndyYl9pbmRleCAmIERCX0RFRl9QRFVfV1JCX0lOREVYX01BU0spIDw8Ci0JCQkJCURCX0RFRl9QRFVfV1JCX0lOREVYX1NISUZUOworCWlmICghcmluZ19tb2RlKQorCQlkb29yYmVsbCB8PSAocHdyYl9oYW5kbGUtPndyYl9pbmRleCAmIERCX0RFRl9QRFVfV1JCX0lOREVYX01BU0spCisJCQkgICAgIDw8IERCX0RFRl9QRFVfV1JCX0lOREVYX1NISUZUOwogCWRvb3JiZWxsIHw9IDEgPDwgREJfREVGX1BEVV9OVU1fUE9TVEVEX1NISUZUOwogCiAJaW93cml0ZTMyKGRvb3JiZWxsLCBwaGJhLT5kYl92YSArIERCX1RYVUxQMF9PRkZTRVQpOwpAQCAtMjg1Niw3ICszMjk0LDcgQEAKIHN0YXRpYyB2b2lkIGJlaXNjc2lfcGFyc2VfcGR1KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBpdHRfdCBpdHQsCiAJCQkgICAgICBpbnQgKmluZGV4LCBpbnQgKmFnZSkKIHsKLQkqaW5kZXggPSBiZTMyX3RvX2NwdShpdHQpID4+IDE2OworCSppbmRleCA9IChpbnQpaXR0OwogCWlmIChhZ2UpCiAJCSphZ2UgPSBjb25uLT5zZXNzaW9uLT5hZ2U7CiB9CkBAIC0yODg1LDE1ICszMzIzLDEzIEBACiAKIAlpb190YXNrLT5jbWRfYmhzID0gcGNpX3Bvb2xfYWxsb2MoYmVpc2NzaV9zZXNzLT5iaHNfcG9vbCwKIAkJCQkJICBHRlBfS0VSTkVMLCAmcGFkZHIpOwotCiAJaWYgKCFpb190YXNrLT5jbWRfYmhzKQogCQlyZXR1cm4gLUVOT01FTTsKLQogCWlvX3Rhc2stPmJoc19wYS51LmE2NC5hZGRyZXNzID0gcGFkZHI7CisJaW9fdGFzay0+bGliaXNjc2lfaXR0ID0gKGl0dF90KXRhc2stPml0dDsKIAlpb190YXNrLT5wd3JiX2hhbmRsZSA9IGFsbG9jX3dyYl9oYW5kbGUocGhiYSwKIAkJCQkJCWJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCwKIAkJCQkJCXRhc2stPml0dCk7Ci0JaW9fdGFzay0+cHdyYl9oYW5kbGUtPnBpb19oYW5kbGUgPSB0YXNrOwogCWlvX3Rhc2stPmNvbm4gPSBiZWlzY3NpX2Nvbm47CiAKIAl0YXNrLT5oZHIgPSAoc3RydWN0IGlzY3NpX2hkciAqKSZpb190YXNrLT5jbWRfYmhzLT5pc2NzaV9oZHI7CkBAIC0yOTA1LDcgKzMzNDEsNiBAQAogCQlzcGluX3VubG9jaygmcGhiYS0+aW9fc2dsX2xvY2spOwogCQlpZiAoIWlvX3Rhc2stPnBzZ2xfaGFuZGxlKQogCQkJZ290byBmcmVlX2huZGxzOwotCiAJfSBlbHNlIHsKIAkJaW9fdGFzay0+c2NzaV9jbW5kID0gTlVMTDsKIAkJaWYgKCh0YXNrLT5oZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLKSA9PSBJU0NTSV9PUF9MT0dJTikgewpAQCAtMjkzMiw4ICszMzY3LDE4IEBACiAJCQkJZ290byBmcmVlX2huZGxzOwogCQl9CiAJfQotCWl0dCA9IChpdHRfdCkgY3B1X3RvX2JlMzIoKCh1bnNpZ25lZCBpbnQpdGFzay0+aXR0IDw8IDE2KSB8Ci0JCQkodW5zaWduZWQgaW50KShpb190YXNrLT5wc2dsX2hhbmRsZS0+c2dsX2luZGV4KSk7CisJaXR0ID0gKGl0dF90KSBjcHVfdG9fYmUzMigoKHVuc2lnbmVkIGludClpb190YXNrLT5wd3JiX2hhbmRsZS0+CisJCQkJIHdyYl9pbmRleCA8PCAxNikgfCAodW5zaWduZWQgaW50KQorCQkJCShpb190YXNrLT5wc2dsX2hhbmRsZS0+c2dsX2luZGV4KSk7CisJaWYgKHJpbmdfbW9kZSkgeworCQlwaGJhLT5zZ2xfaG5kbF9hcnJheVtpb190YXNrLT5wc2dsX2hhbmRsZS0+c2dsX2luZGV4IC0KKwkJCQkgICAgIHBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaWRfc3RhcnRdID0KKwkJCQkgICAgIGlvX3Rhc2stPnBzZ2xfaGFuZGxlOworCQlpb190YXNrLT5wc2dsX2hhbmRsZS0+dGFzayA9IHRhc2s7CisJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlLT5jaWQgPSBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQ7CisJfSBlbHNlCisJCWlvX3Rhc2stPnB3cmJfaGFuZGxlLT5waW9faGFuZGxlID0gdGFzazsKKwogCWlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2hkci5pdHQgPSBpdHQ7CiAJcmV0dXJuIDA7CiAKQEAgLTMwMDYsNyArMzQ1MSw2IEBACiAJaW9fdGFzay0+YmhzX2xlbiA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX2Jocyk7CiAKIAlpZiAod3JpdGVkaXIpIHsKLQkJU0VfREVCVUcoREJHX0xWTF80LCAiIFdSSVRFIENvbW1hbmQgXHQiKTsKIAkJbWVtc2V0KCZpb190YXNrLT5jbWRfYmhzLT5pc2NzaV9kYXRhX3BkdSwgMCwgNDgpOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX3BkdV9kYXRhX291dCwgaXR0LAogCQkJICAgICAgJmlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2RhdGFfcGR1LApAQCAtMzAxNiwxMSArMzQ2MCwxOCBAQAogCQkJICAgICAgSVNDU0lfT1BDT0RFX1NDU0lfREFUQV9PVVQpOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX3BkdV9kYXRhX291dCwgZmluYWxfYml0LAogCQkJICAgICAgJmlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2RhdGFfcGR1LCAxKTsKLQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsIElOSV9XUl9DTUQpOworCQlpZiAocmluZ19tb2RlKQorCQkJaW9fdGFzay0+cHNnbF9oYW5kbGUtPnR5cGUgPSBJTklfV1JfQ01EOworCQllbHNlCisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgdHlwZSwgcHdyYiwKKwkJCQkgICAgICBJTklfV1JfQ01EKTsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGRzcCwgcHdyYiwgMSk7CiAJfSBlbHNlIHsKLQkJU0VfREVCVUcoREJHX0xWTF80LCAiUkVBRCBDb21tYW5kIFx0Iik7Ci0JCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLCBJTklfUkRfQ01EKTsKKwkJaWYgKHJpbmdfbW9kZSkKKwkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlLT50eXBlID0gSU5JX1JEX0NNRDsKKwkJZWxzZQorCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsCisJCQkJICAgICAgSU5JX1JEX0NNRCk7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkc3AsIHB3cmIsIDApOwogCX0KIAltZW1jcHkoJmlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2RhdGFfcGR1LgpAQCAtMzA0NSw3ICszNDk2LDggQEAKIAliZV9kd3NfbGVfdG9fY3B1KHB3cmIsIHNpemVvZihzdHJ1Y3QgaXNjc2lfd3JiKSk7CiAKIAlkb29yYmVsbCB8PSBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQgJiBEQl9XUkJfUE9TVF9DSURfTUFTSzsKLQlkb29yYmVsbCB8PSAoaW9fdGFzay0+cHdyYl9oYW5kbGUtPndyYl9pbmRleCAmCisJaWYgKCFyaW5nX21vZGUpCisJCWRvb3JiZWxsIHw9IChpb190YXNrLT5wd3JiX2hhbmRsZS0+d3JiX2luZGV4ICYKIAkJICAgICBEQl9ERUZfUERVX1dSQl9JTkRFWF9NQVNLKSA8PCBEQl9ERUZfUERVX1dSQl9JTkRFWF9TSElGVDsKIAlkb29yYmVsbCB8PSAxIDw8IERCX0RFRl9QRFVfTlVNX1BPU1RFRF9TSElGVDsKIApAQCAtMzA1OSwxMCArMzUxMSwxNiBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGFzay0+Y29ubjsKIAlzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGJlaXNjc2lfY29ubi0+cGhiYTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbjsKIAlzdHJ1Y3QgaXNjc2lfd3JiICpwd3JiID0gTlVMTDsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV93cmJfY29udGV4dCAqcHdyYl9jb250ZXh0OworCXN0cnVjdCB3cmJfaGFuZGxlICpwd3JiX2hhbmRsZTsKIAl1bnNpZ25lZCBpbnQgZG9vcmJlbGwgPSAwOworCXVuc2lnbmVkIGludCBpLCBjaWQ7CiAJc3RydWN0IGlzY3NpX3Rhc2sgKmFib3J0ZWRfdGFzazsKIAorCWNpZCA9IGJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZDsKIAlwd3JiID0gaW9fdGFzay0+cHdyYl9oYW5kbGUtPnB3cmI7CiAJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGNtZHNuX2l0dCwgcHdyYiwKIAkJICAgICAgYmUzMl90b19jcHUodGFzay0+Y21kc24pKTsKQEAgLTMwNzMsMzggKzM1MzEsNjMgQEAKIAogCXN3aXRjaCAodGFzay0+aGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgewogCWNhc2UgSVNDU0lfT1BfTE9HSU46Ci0JCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLCBUR1RfRE1fQ01EKTsKKwkJaWYgKHJpbmdfbW9kZSkKKwkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlLT50eXBlID0gVEdUX0RNX0NNRDsKKwkJZWxzZQorCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsCisJCQkJICAgICAgVEdUX0RNX0NNRCk7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkbXNnLCBwd3JiLCAwKTsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGNtZHNuX2l0dCwgcHdyYiwgMSk7CiAJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfTk9PUF9PVVQ6Ci0JCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLCBJTklfUkRfQ01EKTsKKwkJaWYgKHJpbmdfbW9kZSkKKwkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlLT50eXBlID0gSU5JX1JEX0NNRDsKKwkJZWxzZQorCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsCisJCQkJICAgICAgSU5JX1JEX0NNRCk7CiAJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfVEVYVDoKLQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsIElOSV9XUl9DTUQpOworCQlpZiAocmluZ19tb2RlKQorCQkJaW9fdGFzay0+cHNnbF9oYW5kbGUtPnR5cGUgPSBJTklfV1JfQ01EOworCQllbHNlCisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgdHlwZSwgcHdyYiwKKwkJCQkgICAgICBJTklfV1JfQ01EKTsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGRzcCwgcHdyYiwgMSk7CiAJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfU0NTSV9UTUZVTkM6Ci0JCWFib3J0ZWRfdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCi0JCQkJCSgoc3RydWN0IGlzY3NpX3RtICopdGFzay0+aGRyKS0+cnR0KTsKKwkJc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CisJCWkgPSAoKHN0cnVjdCBpc2NzaV90bSAqKXRhc2stPmhkciktPnJ0dDsKKwkJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT53cmJfY29udGV4dFtjaWRdOworCQlwd3JiX2hhbmRsZSA9IHB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZXN0ZFtiZTMyX3RvX2NwdShpKQorCQkJCQkJCQk+PiAxNl07CisJCWFib3J0ZWRfdGFzayA9IHB3cmJfaGFuZGxlLT5waW9faGFuZGxlOwogCQkgaWYgKCFhYm9ydGVkX3Rhc2spCiAJCQlyZXR1cm4gMDsKKwogCQlhYm9ydGVkX2lvX3Rhc2sgPSBhYm9ydGVkX3Rhc2stPmRkX2RhdGE7CiAJCWlmICghYWJvcnRlZF9pb190YXNrLT5zY3NpX2NtbmQpCiAJCQlyZXR1cm4gMDsKIAogCQltZ210X2ludmFsaWRhdGVfaWNkcyhwaGJhLAogCQkJCSAgICAgYWJvcnRlZF9pb190YXNrLT5wc2dsX2hhbmRsZS0+c2dsX2luZGV4LAotCQkJCSAgICAgYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkKTsKLQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsIElOSV9UTUZfQ01EKTsKKwkJCQkgICAgIGNpZCk7CisJCWlmIChyaW5nX21vZGUpCisJCQlpb190YXNrLT5wc2dsX2hhbmRsZS0+dHlwZSA9IElOSV9UTUZfQ01EOworCQllbHNlCisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgdHlwZSwgcHdyYiwKKwkJCQkgICAgICBJTklfVE1GX0NNRCk7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkbXNnLCBwd3JiLCAwKTsKIAkJaHdpX3dyaXRlX2J1ZmZlcihwd3JiLCB0YXNrKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9PUF9MT0dPVVQ6CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkbXNnLCBwd3JiLCAwKTsKKwkJaWYgKHJpbmdfbW9kZSkKKwkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlLT50eXBlID0gSFdIX1RZUEVfTE9HT1VUOworCQllbHNlCiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLAogCQkJCUhXSF9UWVBFX0xPR09VVCk7CiAJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CkBAIC0zMTIyLDggKzM2MDUsOSBAQAogCQkgICAgICBpb190YXNrLT5wd3JiX2hhbmRsZS0+bnh0X3dyYl9pbmRleCk7CiAJYmVfZHdzX2xlX3RvX2NwdShwd3JiLCBzaXplb2Yoc3RydWN0IGlzY3NpX3dyYikpOwogCi0JZG9vcmJlbGwgfD0gYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkICYgREJfV1JCX1BPU1RfQ0lEX01BU0s7Ci0JZG9vcmJlbGwgfD0gKGlvX3Rhc2stPnB3cmJfaGFuZGxlLT53cmJfaW5kZXggJgorCWRvb3JiZWxsIHw9IGNpZCAmIERCX1dSQl9QT1NUX0NJRF9NQVNLOworCWlmICghcmluZ19tb2RlKQorCQlkb29yYmVsbCB8PSAoaW9fdGFzay0+cHdyYl9oYW5kbGUtPndyYl9pbmRleCAmCiAJCSAgICAgREJfREVGX1BEVV9XUkJfSU5ERVhfTUFTSykgPDwgREJfREVGX1BEVV9XUkJfSU5ERVhfU0hJRlQ7CiAJZG9vcmJlbGwgfD0gMSA8PCBEQl9ERUZfUERVX05VTV9QT1NURURfU0hJRlQ7CiAJaW93cml0ZTMyKGRvb3JiZWxsLCBwaGJhLT5kYl92YSArIERCX1RYVUxQMF9PRkZTRVQpOwpAQCAtMzE2NSw5ICszNjQ5LDE0IEBACiAJcmV0dXJuIGJlaXNjc2lfaW90YXNrKHRhc2ssIHNnLCBudW1fc2csIHhmZXJsZW4sIHdyaXRlZGlyKTsKIH0KIAorCiBzdGF0aWMgdm9pZCBiZWlzY3NpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQogewogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IE5VTEw7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOworCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKKwlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7CisJdW5zaWduZWQgaW50IGksIG1zaXhfdmVjOwogCiAJcGhiYSA9IChzdHJ1Y3QgYmVpc2NzaV9oYmEgKilwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKIAlpZiAoIXBoYmEpIHsKQEAgLTMxNzUsMTIgKzM2NjQsMjQgQEAKIAkJcmV0dXJuOwogCX0KIAorCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKIAlod2lfZGlzYWJsZV9pbnRyKHBoYmEpOwotCWlmIChwaGJhLT5wY2lkZXYtPmlycSkKLQkJZnJlZV9pcnEocGhiYS0+cGNpZGV2LT5pcnEsIHBoYmEpOworCWlmIChwaGJhLT5tc2l4X2VuYWJsZWQpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBwaGJhLT5udW1fY3B1czsgaSsrKSB7CisJCQltc2l4X3ZlYyA9IHBoYmEtPm1zaXhfZW50cmllc1tpXS52ZWN0b3I7CisJCQlmcmVlX2lycShtc2l4X3ZlYywgJnBod2lfY29udGV4dC0+YmVfZXFbaV0pOworCQl9CisJfSBlbHNlCisJCWlmIChwaGJhLT5wY2lkZXYtPmlycSkKKwkJCWZyZWVfaXJxKHBoYmEtPnBjaWRldi0+aXJxLCBwaGJhKTsKKwlwY2lfZGlzYWJsZV9tc2l4KHBoYmEtPnBjaWRldik7CiAJZGVzdHJveV93b3JrcXVldWUocGhiYS0+d3EpOwogCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpCi0JCWJsa19pb3BvbGxfZGlzYWJsZSgmcGhiYS0+aW9wb2xsKTsKKwkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKKwkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwYmVfZXEtPmlvcG9sbCk7CisJCX0KIAogCWJlaXNjc2lfY2xlYW5fcG9ydChwaGJhKTsKIAliZWlzY3NpX2ZyZWVfbWVtKHBoYmEpOwpAQCAtMzE5NCwxMSArMzY5NSwyOSBAQAogCWlzY3NpX2hvc3RfZnJlZShwaGJhLT5zaG9zdCk7CiB9CiAKK3N0YXRpYyB2b2lkIGJlaXNjc2lfbXNpeF9lbmFibGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCWludCBpLCBzdGF0dXM7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm51bV9jcHVzOyBpKyspCisJCXBoYmEtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CisKKwlzdGF0dXMgPSBwY2lfZW5hYmxlX21zaXgocGhiYS0+cGNpZGV2LCBwaGJhLT5tc2l4X2VudHJpZXMsCisJCQkJIChwaGJhLT5udW1fY3B1cyArIDEpKTsKKwlpZiAoIXN0YXR1cykKKwkJcGhiYS0+bXNpeF9lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybjsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgYmVpc2NzaV9kZXZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKIAkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gTlVMTDsKLQlpbnQgcmV0OworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CisJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOworCWludCByZXQsIG1zaXhfdmVjLCBudW1fY3B1cywgaTsKIAogCXJldCA9IGJlaXNjc2lfZW5hYmxlX3BjaShwY2lkZXYpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zMjEzLDggKzM3MzIsMTggQEAKIAkJCSIgRmFpbGVkIGluIGJlaXNjc2lfaGJhX2FsbG9jIFxuIik7CiAJCWdvdG8gZGlzYWJsZV9wY2k7CiAJfQorCVNFX0RFQlVHKERCR19MVkxfOCwgIiBwaGJhID0gJXAgXG4iLCBwaGJhKTsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHBoYmEpOworCWlmIChlbmFibGVfbXNpeCkKKwkJbnVtX2NwdXMgPSBmaW5kX251bV9jcHVzKCk7CisJZWxzZQorCQludW1fY3B1cyA9IDE7CisJcGhiYS0+bnVtX2NwdXMgPSBudW1fY3B1czsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJudW1fY3B1cyA9ICVkIFxuIiwgcGhiYS0+bnVtX2NwdXMpOworCisJaWYgKGVuYWJsZV9tc2l4KQorCQliZWlzY3NpX21zaXhfZW5hYmxlKHBoYmEpOwogCXJldCA9IGJlX2N0cmxfaW5pdChwaGJhLCBwY2lkZXYpOwogCWlmIChyZXQpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfZGV2X3Byb2JlLSIKQEAgLTMyMzUsNyArMzc2NCw3IEBACiAKIAlzbnByaW50ZihwaGJhLT53cV9uYW1lLCBzaXplb2YocGhiYS0+d3FfbmFtZSksICJiZWlzY3NpX3FfaXJxJXUiLAogCQkgcGhiYS0+c2hvc3QtPmhvc3Rfbm8pOwotCXBoYmEtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUocGhiYS0+d3FfbmFtZSk7CisJcGhiYS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKHBoYmEtPndxX25hbWUpOwogCWlmICghcGhiYS0+d3EpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfZGV2X3Byb2JlLSIKIAkJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIHdvcmsgcXVldWVcbiIpOwpAQCAtMzI0NCwxMSArMzc3MywxNiBAQAogCiAJSU5JVF9XT1JLKCZwaGJhLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOwogCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwogCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpIHsKLQkJYmxrX2lvcG9sbF9pbml0KCZwaGJhLT5pb3BvbGwsIGJlX2lvcG9sbF9idWRnZXQsIGJlX2lvcG9sbCk7Ci0JCWJsa19pb3BvbGxfZW5hYmxlKCZwaGJhLT5pb3BvbGwpOworCQlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07CisJCQlibGtfaW9wb2xsX2luaXQoJnBiZV9lcS0+aW9wb2xsLCBiZV9pb3BvbGxfYnVkZ2V0LAorCQkJCQliZV9pb3BvbGwpOworCQkJYmxrX2lvcG9sbF9lbmFibGUoJnBiZV9lcS0+aW9wb2xsKTsKKwkJfQogCX0KLQogCXJldCA9IGJlaXNjc2lfaW5pdF9pcnFzKHBoYmEpOwogCWlmIChyZXQgPCAwKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2Rldl9wcm9iZS0iCkBAIC0zMjYxLDE3ICszNzk1LDI2IEBACiAJCQkgICAgICJGYWlsZWQgdG8gaHdpX2VuYWJsZV9pbnRyXG4iKTsKIAkJZ290byBmcmVlX2N0cmxyOwogCX0KLQogCVNFX0RFQlVHKERCR19MVkxfOCwgIlxuXG5cbiBTVUNDRVNTIC0gRFJJVkVSIExPQURFRCBcblxuXG4iKTsKIAlyZXR1cm4gMDsKIAogZnJlZV9jdHJscjoKLQlpZiAocGhiYS0+cGNpZGV2LT5pcnEpCi0JCWZyZWVfaXJxKHBoYmEtPnBjaWRldi0+aXJxLCBwaGJhKTsKKwlpZiAocGhiYS0+bXNpeF9lbmFibGVkKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQkJbXNpeF92ZWMgPSBwaGJhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yOworCQkJZnJlZV9pcnEobXNpeF92ZWMsICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldKTsKKwkJfQorCX0gZWxzZQorCQlpZiAocGhiYS0+cGNpZGV2LT5pcnEpCisJCQlmcmVlX2lycShwaGJhLT5wY2lkZXYtPmlycSwgcGhiYSk7CisJcGNpX2Rpc2FibGVfbXNpeChwaGJhLT5wY2lkZXYpOwogZnJlZV9ibGtlbmJsZDoKIAlkZXN0cm95X3dvcmtxdWV1ZShwaGJhLT53cSk7CiAJaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkKLQkJYmxrX2lvcG9sbF9kaXNhYmxlKCZwaGJhLT5pb3BvbGwpOworCQlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07CisJCQlibGtfaW9wb2xsX2Rpc2FibGUoJnBiZV9lcS0+aW9wb2xsKTsKKwkJfQogZnJlZV90d3E6CiAJYmVpc2NzaV9jbGVhbl9wb3J0KHBoYmEpOwogCWJlaXNjc2lfZnJlZV9tZW0ocGhiYSk7CkBAIC0zMzE2LDcgKzM4NTksNyBAQAogCQlJU0NTSV9VU0VSTkFNRSB8IElTQ1NJX1BBU1NXT1JEIHwKIAkJSVNDU0lfVVNFUk5BTUVfSU4gfCBJU0NTSV9QQVNTV09SRF9JTiB8CiAJCUlTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQlJU0NTSV9MVV9SRVNFVF9UTU8gfAorCQlJU0NTSV9MVV9SRVNFVF9UTU8gfCBJU0NTSV9UR1RfUkVTRVRfVE1PIHwKIAkJSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8CiAJCUlTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKIAkuaG9zdF9wYXJhbV9tYXNrID0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfCBJU0NTSV9IT1NUX0lQQUREUkVTUyB8CkBAIC0zMzUxLDYgKzM4OTQsNyBAQAogCS5pZF90YWJsZSA9IGJlaXNjc2lfcGNpX2lkX3RhYmxlCiB9OwogCisKIHN0YXRpYyBpbnQgX19pbml0IGJlaXNjc2lfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtMzM3Myw2ICszOTE3LDcgQEAKIAkJCSAiYmVpc2NzaSBwY2kgZHJpdmVyLlxuIik7CiAJCWdvdG8gdW5yZWdpc3Rlcl9pc2NzaV90cmFuc3BvcnQ7CiAJfQorCXJpbmdfbW9kZSA9IDA7CiAJcmV0dXJuIDA7CiAKIHVucmVnaXN0ZXJfaXNjc2lfdHJhbnNwb3J0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKaW5kZXggNTNjOWI3MC4uMjVlNmIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCkBAIC0yMSwxMSArMjEsOSBAQAogI2lmbmRlZiBfQkVJU0NTSV9NQUlOXwogI2RlZmluZSBfQkVJU0NTSV9NQUlOXwogCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsay1pb3BvbGwuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KQEAgLTM1LDEyICszMyw4IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgogCiAjaW5jbHVkZSAiYmUuaCIKLQotCi0KICNkZWZpbmUgRFJWX05BTUUJCSJiZTJpc2NzaSIKICNkZWZpbmUgQlVJTERfU1RSCQkiMi4wLjUyNy4wIgotCiAjZGVmaW5lIEJFX05BTUUJCQkiU2VydmVyRW5naW5lcyBCbGFkZUVuZ2luZTIiIFwKIAkJCQkiTGludXggaVNDU0kgRHJpdmVyIHZlcnNpb24iIEJVSUxEX1NUUgogI2RlZmluZSBEUlZfREVTQwkJQkVfTkFNRSAiICIgIkRyaXZlciIKQEAgLTQ5LDYgKzQzLDggQEAKICNkZWZpbmUgQkVfREVWSUNFX0lEMQkJMHgyMTIKICNkZWZpbmUgT0NfREVWSUNFX0lEMQkJMHg3MDIKICNkZWZpbmUgT0NfREVWSUNFX0lEMgkJMHg3MDMKKyNkZWZpbmUgT0NfREVWSUNFX0lEMwkJMHg3MTIKKyNkZWZpbmUgT0NfREVWSUNFX0lENAkJMHgyMjIKIAogI2RlZmluZSBCRTJfTUFYX1NFU1NJT05TCTY0CiAjZGVmaW5lIEJFMl9DTURTX1BFUl9DWE4JMTI4CkBAIC02Myw2ICs1OSw3IEBACiAjZGVmaW5lIEJFMl9JT19ERVBUSCBcCiAJKEJFMl9NQVhfSUNEUyAvIDIgLSAoQkUyX0xPR09VVFMgKyBCRTJfVE1GUyArIEJFMl9OT1BPVVRfUkVRKSkKIAorI2RlZmluZSBNQVhfQ1BVUwkJMzEKICNkZWZpbmUgQkVJU0NTSV9TR0xJU1RfRUxFTUVOVFMJQkUyX1NHRQogCiAjZGVmaW5lIEJFSVNDU0lfTUFYX0NNTkRTCTEwMjQJLyogTWF4IElPJ3MgcGVyIEN0cmxyIHNodC0+Y2FuX3F1ZXVlICovCkBAIC03OSw3ICs3Niw3IEBACiAjZGVmaW5lIEJFX1NFTlNFX0lORk9fU0laRQkJMjU4CiAjZGVmaW5lIEJFX0lTQ1NJX1BEVV9IRUFERVJfU0laRQk2NAogI2RlZmluZSBCRV9NSU5fTUVNX1NJWkUJCQkxNjM4NAotCisjZGVmaW5lIE1BWF9DTURfU1oJCQk2NTUzNgogI2RlZmluZSBJSU9DX1NDU0lfREFUQSAgICAgICAgICAgICAgICAgIDB4MDUJLyogV3JpdGUgT3BlcmF0aW9uICovCiAKICNkZWZpbmUgREJHX0xWTAkJCQkweDAwMDAwMDAxCkBAIC0xMDAsNiArOTcsOCBAQAogCX0JCQkJCQlcCiB9IHdoaWxlICgwKTsKIAorI2RlZmluZSBCRV9BREFQVEVSX1VQCQkweDAwMDAwMDAwCisjZGVmaW5lIEJFX0FEQVBURVJfTElOS19ET1dOCTB4MDAwMDAwMDEKIC8qKgogICogaGFyZHdhcmUgbmVlZHMgdGhlIGFzeW5jIFBEVSBidWZmZXJzIHRvIGJlIHBvc3RlZCBpbiBtdWx0aXBsZXMgb2YgOAogICogU28gaGF2ZSBhdGxlYXN0IDggb2YgdGhlbSBieSBkZWZhdWx0CkBAIC0xNjAsMjEgKzE1OSwxOSBAQAogCiBlbnVtIGJlX21lbV9lbnVtIHsKIAlIV0lfTUVNX0FERE5fQ09OVEVYVCwKLQlIV0lfTUVNX0NRLAotCUhXSV9NRU1fRVEsCiAJSFdJX01FTV9XUkIsCiAJSFdJX01FTV9XUkJILAotCUhXSV9NRU1fU0dMSCwJLyogNSAqLworCUhXSV9NRU1fU0dMSCwKIAlIV0lfTUVNX1NHRSwKLQlIV0lfTUVNX0FTWU5DX0hFQURFUl9CVUYsCisJSFdJX01FTV9BU1lOQ19IRUFERVJfQlVGLCAJLyogNSAqLwogCUhXSV9NRU1fQVNZTkNfREFUQV9CVUYsCiAJSFdJX01FTV9BU1lOQ19IRUFERVJfUklORywKLQlIV0lfTUVNX0FTWU5DX0RBVEFfUklORywJLyogMTAgKi8KKwlIV0lfTUVNX0FTWU5DX0RBVEFfUklORywKIAlIV0lfTUVNX0FTWU5DX0hFQURFUl9IQU5ETEUsCi0JSFdJX01FTV9BU1lOQ19EQVRBX0hBTkRMRSwKKwlIV0lfTUVNX0FTWU5DX0RBVEFfSEFORExFLCAJLyogMTAgKi8KIAlIV0lfTUVNX0FTWU5DX1BEVV9DT05URVhULAogCUlTQ1NJX01FTV9HTE9CQUxfSEVBREVSLAotCVNFX01FTV9NQVggIAkvKiAxNSAqLworCVNFX01FTV9NQVgKIH07CiAKIHN0cnVjdCBiZV9idXNfYWRkcmVzczMyIHsKQEAgLTIxMiw2ICsyMDksOSBAQAogCiBzdHJ1Y3Qgc2dsX2hhbmRsZSB7CiAJdW5zaWduZWQgaW50IHNnbF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY2lkOworCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOwogCXN0cnVjdCBpc2NzaV9zZ2UgKnBmcmFnOwogfTsKIApAQCAtMjc0LDEzICsyNzQsMTcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwogCXVuc2lnbmVkIGludCBzdGF0ZTsKIAl1bnNpZ25lZCBzaG9ydCBhc2ljX3JldmlzaW9uOwotCXN0cnVjdCBibGtfaW9wb2xsCWlvcG9sbDsKKwl1bnNpZ25lZCBpbnQgbnVtX2NwdXM7CisJdW5zaWduZWQgaW50IG54dF9jcWlkOworCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tNQVhfQ1BVUyArIDFdOworCWJvb2wgbXNpeF9lbmFibGVkOwogCXN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqaW5pdF9tZW07CiAKIAl1bnNpZ25lZCBzaG9ydCBpb19zZ2xfYWxsb2NfaW5kZXg7CiAJdW5zaWduZWQgc2hvcnQgaW9fc2dsX2ZyZWVfaW5kZXg7CiAJdW5zaWduZWQgc2hvcnQgaW9fc2dsX2huZGxfYXZibDsKIAlzdHJ1Y3Qgc2dsX2hhbmRsZSAqKmlvX3NnbF9obmRsX2Jhc2U7CisJc3RydWN0IHNnbF9oYW5kbGUgKipzZ2xfaG5kbF9hcnJheTsKIAogCXVuc2lnbmVkIHNob3J0IGVoX3NnbF9hbGxvY19pbmRleDsKIAl1bnNpZ25lZCBzaG9ydCBlaF9zZ2xfZnJlZV9pbmRleDsKQEAgLTMxNSw2ICszMTksNyBAQAogCQl1bnNpZ25lZCBzaG9ydCBjaWRfYWxsb2M7CiAJCXVuc2lnbmVkIHNob3J0IGNpZF9mcmVlOwogCQl1bnNpZ25lZCBzaG9ydCBhdmxibF9jaWRzOworCQl1bnNpZ25lZCBzaG9ydCBpc2NzaV9mZWF0dXJlczsKIAkJc3BpbmxvY2tfdCBjaWRfbG9jazsKIAl9IGZ3X2NvbmZpZzsKIApAQCAtMzQzLDYgKzM0OCw3IEBACiAJdW5zaWduZWQgc2hvcnQgbG9naW5faW5fcHJvZ3Jlc3M7CiAJc3RydWN0IHNnbF9oYW5kbGUgKnBsb2dpbl9zZ2xfaGFuZGxlOwogCXN0cnVjdCBiZWlzY3NpX3Nlc3Npb24gKmJlaXNjc2lfc2VzczsKKwlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKIH07CiAKIC8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIGNoaXAgKi8KQEAgLTM5MCw3ICszOTYsNyBAQAogCXVuc2lnbmVkIGludCBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCBjaWQ7CiAJdW5zaWduZWQgc2hvcnQgaGVhZGVyX2xlbjsKLQorCWl0dF90IGxpYmlzY3NpX2l0dDsKIAlzdHJ1Y3QgYmVfY21kX2JocyAqY21kX2JoczsKIAlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MgYmhzX3BhOwogCXVuc2lnbmVkIHNob3J0IGJoc19sZW47CkBAIC01OTksNyArNjA1LDYgQEAKIAogdm9pZCBiZWlzY3NpX3Byb2Nlc3NfZXEoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKIAotCiBzdHJ1Y3QgaXNjc2lfd3JiIHsKIAl1MzIgZHdbMTZdOwogfSBfX3BhY2tlZDsKQEAgLTgyMCwxMCArODI1LDEyIEBACiB9OwogCiBzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5IHsKLQlzdHJ1Y3QgYmVfZXFfb2JqIGJlX2VxOwotCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX2NxOwotCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX21jY19jcTsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBiZV9tY2M7CisJLyogQWRhcHRpdmUgaW50ZXJydXB0IGNvYWxlc2NpbmcgKEFJQykgaW5mbyAqLworCXUxNiBtaW5fZXFkOwkJLyogaW4gdXNlY3MgKi8KKwl1MTYgbWF4X2VxZDsJCS8qIGluIHVzZWNzICovCisJdTE2IGN1cl9lcWQ7CQkvKiBpbiB1c2VjcyAqLworCXN0cnVjdCBiZV9lcV9vYmogYmVfZXFbTUFYX0NQVVNdOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX2NxW01BWF9DUFVTXTsKIAogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX2RlZl9oZHJxOwogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX2RlZl9kYXRhcTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCmluZGV4IDEyZTY0NGYuLjc5YzJiZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuYwpAQCAtMzUsNyArMzUsNiBAQAogCiAJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCiAJCQkgICBPUENPREVfQ09NTU9OX1FVRVJZX0ZJUk1XQVJFX0NPTkZJRywgc2l6ZW9mKCpyZXEpKTsKLQogCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOwogCWlmICghc3RhdHVzKSB7CiAJCXN0cnVjdCBiZV9md19jZmcgKnBmd19jZmc7CkBAIC01OCw3ICs1Nyw4IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotdW5zaWduZWQgY2hhciBtZ210X2NoZWNrX3N1cHBvcnRlZF9mdyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKQordW5zaWduZWQgY2hhciBtZ210X2NoZWNrX3N1cHBvcnRlZF9mdyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAorCQkJCSAgICAgIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgYmVfZG1hX21lbSBub25lbWJfY21kOwogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7CkBAIC04NSw3ICs4NSw2IEBACiAJc2dlLT5wYV9oaSA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMobm9uZW1iX2NtZC5kbWEpKTsKIAlzZ2UtPnBhX2xvID0gY3B1X3RvX2xlMzIobm9uZW1iX2NtZC5kbWEgJiAweEZGRkZGRkZGKTsKIAlzZ2UtPmxlbiA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQuc2l6ZSk7Ci0KIAlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKIAlpZiAoIXN0YXR1cykgewogCQlzdHJ1Y3QgYmVfbWdtdF9jb250cm9sbGVyX2F0dHJpYnV0ZXNfcmVzcCAqcmVzcCA9IG5vbmVtYl9jbWQudmE7CkBAIC05NSwyMSArOTQsMjUgQEAKIAkJCXJlc3AtPnBhcmFtcy5oYmFfYXR0cmlicy5maXJtd2FyZV92ZXJzaW9uX3N0cmluZyk7CiAJCVNFX0RFQlVHKERCR19MVkxfOCwKIAkJCSJEZXZlbG9wZXIgQnVpbGQsIG5vdCBwZXJmb3JtaW5nIHZlcnNpb24gY2hlY2suLi5cbiIpOwotCisJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9mZWF0dXJlcyA9CisJCQkJcmVzcC0+cGFyYW1zLmhiYV9hdHRyaWJzLmlzY3NpX2ZlYXR1cmVzOworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICIgcGhiYS0+ZndfY29uZmlnLmlzY3NpX2ZlYXR1cmVzID0gJWRcbiIsCisJCQkJICAgICAgcGhiYS0+ZndfY29uZmlnLmlzY3NpX2ZlYXR1cmVzKTsKIAl9IGVsc2UKIAkJU0VfREVCVUcoREJHX0xWTF8xLCAiIEZhaWxlZCBpbiBtZ210X2NoZWNrX3N1cHBvcnRlZF9md1xuIik7CisJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CiAJaWYgKG5vbmVtYl9jbWQudmEpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY3RybC0+cGRldiwgbm9uZW1iX2NtZC5zaXplLAogCQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CiAKLQlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCisKIHVuc2lnbmVkIGNoYXIgbWdtdF9lcGZ3X2NsZWFudXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1bnNpZ25lZCBzaG9ydCBjaHV0ZSkKIHsKIAlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7Ci0Jc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWNjcShwaGJhKTsKIAlzdHJ1Y3QgaXNjc2lfY2xlYW51cF9yZXEgKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMTI0LDcgKzEyNyw3IEBACiAJcmVxLT5oZHJfcmluZ19pZCA9IDA7CiAJcmVxLT5kYXRhX3JpbmdfaWQgPSAwOwogCi0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJc3RhdHVzID0gIGJlX21jY19ub3RpZnlfd2FpdChwaGJhKTsKIAlpZiAoc3RhdHVzKQogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKIAkJCSAgICAgIiBtZ210X2VwZndfY2xlYW51cCAsIEZBSUxFRFxuIik7CkBAIC0xMzcsNyArMTQwLDcgQEAKIHsKIAlzdHJ1Y3QgYmVfZG1hX21lbSBub25lbWJfY21kOwogCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tY2NxKHBoYmEpOwogCXN0cnVjdCBiZV9zZ2UgKnNnZSA9IG5vbmVtYmVkZGVkX3NnbCh3cmIpOwogCXN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRzX3BhcmFtc19pbiAqcmVxOwogCWludCBzdGF0dXMgPSAwOwpAQCAtMTY5LDcgKzE3Miw3IEBACiAJc2dlLT5wYV9sbyA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQuZG1hICYgMHhGRkZGRkZGRik7CiAJc2dlLT5sZW4gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLnNpemUpOwogCi0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KHBoYmEpOwogCWlmIChzdGF0dXMpCiAJCVNFX0RFQlVHKERCR19MVkxfMSwgIklDRFMgSW52YWxpZGF0aW9uIEZhaWxlZFxuIik7CiAJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CkBAIC0xODYsNyArMTg5LDcgQEAKIAkJCQkJIHVuc2lnbmVkIHNob3J0IHNhdmVjZmdfZmxhZykKIHsKIAlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7Ci0Jc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWNjcShwaGJhKTsKIAlzdHJ1Y3QgaXNjc2lfaW52YWxpZGF0ZV9jb25uZWN0aW9uX3BhcmFtc19pbiAqcmVxID0KIAkJCQkJCWVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTIwNSw3ICsyMDgsNyBAQAogCWVsc2UKIAkJcmVxLT5jbGVhbnVwX3R5cGUgPSBDTURfSVNDU0lfQ09OTkVDVElPTl9JTlZBTElEQVRFOwogCXJlcS0+c2F2ZV9jZmcgPSBzYXZlY2ZnX2ZsYWc7Ci0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJc3RhdHVzID0gIGJlX21jY19ub3RpZnlfd2FpdChwaGJhKTsKIAlpZiAoc3RhdHVzKQogCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJJbnZhbGlkYXRpb24gRmFpbGVkXG4iKTsKIApAQCAtMjE3LDcgKzIyMCw3IEBACiAJCQkJdW5zaWduZWQgc2hvcnQgY2lkLCB1bnNpZ25lZCBpbnQgdXBsb2FkX2ZsYWcpCiB7CiAJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOwotCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21jY3EocGhiYSk7CiAJc3RydWN0IHRjcF91cGxvYWRfcGFyYW1zX2luICpyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAJaW50IHN0YXR1cyA9IDA7CiAKQEAgLTIyOSw3ICsyMzIsNyBAQAogCQkJICAgT1BDT0RFX0NPTU1PTl9UQ1BfVVBMT0FELCBzaXplb2YoKnJlcSkpOwogCXJlcS0+aWQgPSAodW5zaWduZWQgc2hvcnQpY2lkOwogCXJlcS0+dXBsb2FkX3R5cGUgPSAodW5zaWduZWQgY2hhcil1cGxvYWRfZmxhZzsKLQlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQocGhiYSk7CiAJaWYgKHN0YXR1cykKIAkJU0VfREVCVUcoREJHX0xWTF8xLCAibWdtdF91cGxvYWRfY29ubmVjdGlvbiBGYWlsZWRcbiIpOwogCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwpAQCAtMjQ1LDEzICsyNDgsMTQgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRhZGRyX2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWRzdF9hZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmRhZGRyX2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopZHN0X2FkZHI7CiAJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOwotCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21jY3EocGhiYSk7CiAJc3RydWN0IHRjcF9jb25uZWN0X2FuZF9vZmZsb2FkX2luICpyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAJdW5zaWduZWQgc2hvcnQgZGVmX2hkcl9pZDsKIAl1bnNpZ25lZCBzaG9ydCBkZWZfZGF0YV9pZDsKIAlzdHJ1Y3QgcGh5c19hZGRyIHRlbXBsYXRlX2FkZHJlc3MgPSB7IDAsIDAgfTsKIAlzdHJ1Y3QgcGh5c19hZGRyICpwdGVtcGxhdGVfYWRkcmVzczsKIAlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBzaG9ydCBjaWQgPSBiZWlzY3NpX2VwLT5lcF9jaWQ7CiAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKQEAgLTI5NiwxNCArMzAwLDE4IEBACiAKIAl9CiAJcmVxLT5jaWQgPSBjaWQ7Ci0JcmVxLT5jcV9pZCA9IHBod2lfY29udGV4dC0+YmVfY3EuaWQ7CisJaSA9IHBoYmEtPm54dF9jcWlkKys7CisJaWYgKHBoYmEtPm54dF9jcWlkID09IHBoYmEtPm51bV9jcHVzKQorCQlwaGJhLT5ueHRfY3FpZCA9IDA7CisJcmVxLT5jcV9pZCA9IHBod2lfY29udGV4dC0+YmVfY3FbaV0uaWQ7CisJU0VfREVCVUcoREJHX0xWTF84LCAiaT0lZCBjcV9pZD0lZCBcbiIsIGksIHJlcS0+Y3FfaWQpOwogCXJlcS0+ZGVmcV9pZCA9IGRlZl9oZHJfaWQ7CiAJcmVxLT5oZHJfcmluZ19pZCA9IGRlZl9oZHJfaWQ7CiAJcmVxLT5kYXRhX3JpbmdfaWQgPSBkZWZfZGF0YV9pZDsKIAlyZXEtPmRvX29mZmxvYWQgPSAxOwogCXJlcS0+ZGF0YW91dF90ZW1wbGF0ZV9wYS5sbyA9IHB0ZW1wbGF0ZV9hZGRyZXNzLT5sbzsKIAlyZXEtPmRhdGFvdXRfdGVtcGxhdGVfcGEuaGkgPSBwdGVtcGxhdGVfYWRkcmVzcy0+aGk7Ci0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KHBoYmEpOwogCWlmICghc3RhdHVzKSB7CiAJCXN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXA7CiAJCXN0cnVjdCB0Y3BfY29ubmVjdF9hbmRfb2ZmbG9hZF9vdXQgKnB0Y3BjbmN0X291dCA9CkBAIC0zMTEsNyArMzE5LDcgQEAKIAogCQllcCA9IHBoYmEtPmVwX2FycmF5W3B0Y3BjbmN0X291dC0+Y2lkXTsKIAkJYmVpc2NzaV9lcCA9IGVwLT5kZF9kYXRhOwotCQliZWlzY3NpX2VwLT5md19oYW5kbGUgPSAwOworCQliZWlzY3NpX2VwLT5md19oYW5kbGUgPSBwdGNwY25jdF9vdXQtPmNvbm5lY3Rpb25faGFuZGxlOwogCQliZWlzY3NpX2VwLT5jaWRfdmxkID0gMTsKIAkJU0VfREVCVUcoREJHX0xWTF84LCAibWdtdF9vcGVuX2Nvbm5lY3Rpb24gU3VjY2Vzc1xuIik7CiAJfSBlbHNlCkBAIC0zMTksMyArMzI3LDMwIEBACiAJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KKworaW50IGJlX2NtZF9nZXRfbWFjX2FkZHIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1OCAqbWFjX2FkZHIpCit7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tY2NxKHBoYmEpOworCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9tYWNfYWRkciAqcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWludCBzdGF0dXM7CisKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZV9jbWRfZ2V0X21hY19hZGRyXG4iKTsKKwlzcGluX2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0ksCisJCQkgICBPUENPREVfQ09NTU9OX0lTQ1NJX05UV0tfR0VUX05JQ19DT05GSUcsCisJCQkgICBzaXplb2YoKnJlcSkpOworCisJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KHBoYmEpOworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfbWFjX2FkZHIgKnJlc3AgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisKKwkJbWVtY3B5KG1hY19hZGRyLCByZXNwLT5tYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCX0KKworCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5oCmluZGV4IDAwZTgxNmUuLjI0ZWFmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuaApAQCAtMTc1LDcgKzE3NSw5IEBACiAJdTggcGh5X3BvcnQ7CiAJdTMyIGZpcm13YXJlX3Bvc3Rfc3RhdHVzOwogCXUzMiBoYmFfbXR1WzhdOwotCXUzMiBmdXR1cmVfdTMyWzRdOworCXU4IGlzY3NpX2ZlYXR1cmVzOworCXU4IGZ1dHVyZV91OFszXTsKKwl1MzIgZnV0dXJlX3UzMlszXTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBtZ210X2NvbnRyb2xsZXJfYXR0cmlidXRlcyB7CkBAIC0yNDYsNCArMjQ4LDggQEAKIAkJCQkJIHVuc2lnbmVkIHNob3J0IGNpZCwKIAkJCQkJIHVuc2lnbmVkIHNob3J0IGlzc3VlX3Jlc2V0LAogCQkJCQkgdW5zaWduZWQgc2hvcnQgc2F2ZWNmZ19mbGFnKTsKKwordW5zaWduZWQgY2hhciBtZ210X2Z3X2NtZChzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAorCQkJICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkgIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NiX2lvaW1fbWFjcm9zLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jYl9pb2ltX21hY3Jvcy5oCmluZGV4IDAwNTBjODMuLjk2MWZlNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NiX2lvaW1fbWFjcm9zLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY2JfaW9pbV9tYWNyb3MuaApAQCAtNTEsNyArNTEsNyBAQAogCWx1bi5iZmFfbHVuICAgICA9IDA7CiAJbHVuLnNjc2lfbHVuWzBdID0gYmZhX29zX2h0b25zKGx1bm8pOwogCi0JcmV0dXJuIChsdW4uYmZhX2x1bik7CisJcmV0dXJuIGx1bi5iZmFfbHVuOwogfQogCiAvKioKQEAgLTY4LDcgKzY4LDcgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilkaW87CiAKLQlyZXR1cm4gKCh1OCAqKSBjbW5kLT5jbW5kKTsKKwlyZXR1cm4gKHU4ICopIGNtbmQtPmNtbmQ7CiB9CiAKIC8qKgpAQCAtOTcsNyArOTcsNyBAQAogewogCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWRpbzsKIAotCXJldHVybiAoc2NzaV9idWZmbGVuKGNtbmQpKTsKKwlyZXR1cm4gc2NzaV9idWZmbGVuKGNtbmQpOwogfQogCiAvKioKQEAgLTEyOSw3ICsxMjksNyBAQAogCXNnZSA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpX3NnbGlzdChjbW5kKSArIHNnZWlkOwogCWFkZHIgPSAodTY0KSBzZ19kbWFfYWRkcmVzcyhzZ2UpOwogCi0JcmV0dXJuICgqKHVuaW9uIGJmaV9hZGRyX3UgKikgJmFkZHIpOworCXJldHVybiAqKCh1bmlvbiBiZmlfYWRkcl91ICopICZhZGRyKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIKQEAgLTE5Nyw3ICsxOTcsNyBAQAogewogCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWRpbzsKIAotCXJldHVybiAoY21uZC0+Y21kX2xlbik7CisJcmV0dXJuIGNtbmQtPmNtZF9sZW47CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfY2VlLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jZWUuYwppbmRleCA3YTk1OWMzLi4yYjkxNzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jZWUuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jZWUuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiB1MzIKIGJmYV9jZWVfbWVtaW5mbyh2b2lkKQogewotCXJldHVybiAoYmZhX2NlZV9hdHRyX21lbWluZm8oKSArIGJmYV9jZWVfc3RhdHNfbWVtaW5mbygpKTsKKwlyZXR1cm4gYmZhX2NlZV9hdHRyX21lbWluZm8oKSArIGJmYV9jZWVfc3RhdHNfbWVtaW5mbygpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NzZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NzZGVidWcuYwppbmRleCAxYjcxZDM0Li5jYWViMTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jc2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY3NkZWJ1Zy5jCkBAIC00NywxMiArNDcsMTIgQEAKIAl0cWUgPSBiZmFfcV9uZXh0KHEpOwogCXdoaWxlICh0cWUgIT0gcSkgewogCQlpZiAodHFlID09IHFlKQotCQkJcmV0dXJuICgxKTsKKwkJCXJldHVybiAxOwogCQl0cWUgPSBiZmFfcV9uZXh0KHRxZSk7CiAJCWlmICh0cWUgPT0gTlVMTCkKIAkJCWJyZWFrOwogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jCmluZGV4IDQwMWJhYmUuLjc5MGM5NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwpAQCAtMTMxLDcgKzEzMSw3IEBACiB7CiAJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CiAKLQlyZXR1cm4gKGZjcGltLT5wYXRoX3RvdiAvIDEwMDApOworCXJldHVybiBmY3BpbS0+cGF0aF90b3YgLyAxMDAwOwogfQogCiBiZmFfc3RhdHVzX3QKQEAgLTE2OSw3ICsxNjksNyBAQAogewogCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOwogCi0JcmV0dXJuIChmY3BpbS0+cV9kZXB0aCk7CisJcmV0dXJuIGZjcGltLT5xX2RlcHRoOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltX3ByaXYuaAppbmRleCAxNTMyMDZjLi41Y2Y0MTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbV9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW1fcHJpdi5oCkBAIC0zNSw3ICszNSw3IEBACiAjZGVmaW5lIEJGQV9GQ1BJTV9QQVRIVE9WX01BWAkoOTAgKiAxMDAwKQkvKiBpbiBtaWxsaXNlY3MgKi8KIAogI2RlZmluZSBiZmFfZmNwaW1fc3RhdHMoX19mY3BpbSwgX19zdGF0cykgICBcCi0gICAgKF9fZmNwaW0pLT5zdGF0cy5fX3N0YXRzICsrCisgICAgKChfX2ZjcGltKS0+c3RhdHMuX19zdGF0cysrKQogCiBzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zIHsKIAlzdHJ1Y3QgYmZhX3MgCSpiZmE7CkBAIC0xNDMsNyArMTQzLDcgQEAKIAlzdHJ1Y3QgYmZhX2l0bmltX2hhbF9zdGF0c19zCXN0YXRzOwogfTsKIAotI2RlZmluZSBiZmFfaXRuaW1faXNfb25saW5lKF9pdG5pbSkgKF9pdG5pbSktPmlzX29ubGluZQorI2RlZmluZSBiZmFfaXRuaW1faXNfb25saW5lKF9pdG5pbSkgKChfaXRuaW0pLT5pc19vbmxpbmUpCiAjZGVmaW5lIEJGQV9GQ1BJTV9NT0QoX2hhbCkgKCYoX2hhbCktPm1vZHVsZXMuZmNwaW1fbW9kKQogI2RlZmluZSBCRkFfSU9JTV9GUk9NX1RBRyhfZmNwaW0sIF9pb3RhZykJXAogCSgmZmNwaW0tPmlvaW1fYXJyW19pb3RhZ10pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcG9ydC5jCmluZGV4IDk5MjQzNTkuLmFlZjY0OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcG9ydC5jCkBAIC0zODgsMzIgKzM4OCwyOSBAQAogCQliZmFfcHBvcnRfY2FsbGJhY2socHBvcnQsIEJGQV9QUE9SVF9MSU5LRE9XTik7CiAJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKIAkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX1NUX0NIQU5HRSwgMCwgIlBvcnQgTGlua2Rvd24iKTsKLQkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKHBwb3J0LT5iZmEpKSB7CisJCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChwcG9ydC0+YmZhKSkKIAkJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQliZmFfcHBvcnRfYWVuX3Bvc3QocHBvcnQsIEJGQV9QT1JUX0FFTl9ESVNDT05ORUNUKTsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgQkZBX1BQT1JUX1NNX1NUT1A6CiAJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9zdG9wcGVkKTsKIAkJYmZhX3Bwb3J0X3Jlc2V0X2xpbmtpbmZvKHBwb3J0KTsKLQkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKHBwb3J0LT5iZmEpKSB7CisJCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChwcG9ydC0+YmZhKSkKIAkJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQliZmFfcHBvcnRfYWVuX3Bvc3QocHBvcnQsIEJGQV9QT1JUX0FFTl9ESVNDT05ORUNUKTsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgQkZBX1BQT1JUX1NNX0hXRkFJTDoKIAkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2Rvd24pOwogCQliZmFfcHBvcnRfcmVzZXRfbGlua2luZm8ocHBvcnQpOwogCQliZmFfcHBvcnRfY2FsbGJhY2socHBvcnQsIEJGQV9QUE9SVF9MSU5LRE9XTik7Ci0JCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChwcG9ydC0+YmZhKSkgeworCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQocHBvcnQtPmJmYSkpCiAJCQliZmFfcHBvcnRfYWVuX3Bvc3QocHBvcnQsIEJGQV9QT1JUX0FFTl9PRkZMSU5FKTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fRElTQ09OTkVDVCk7Ci0JCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtOTk5LDEwICs5OTYsMTAgQEAKIAlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CiAKIAlpZiAocHBvcnQtPmRpYWdfYnVzeSkKLQkJcmV0dXJuIChCRkFfU1RBVFVTX0RJQUdfQlVTWSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RJQUdfQlVTWTsKIAllbHNlIGlmIChiZmFfc21fY21wX3N0YXRlCiAJCSAoQkZBX1BPUlRfTU9EKGJmYSksIGJmYV9wcG9ydF9zbV9kaXNhYmxpbmdfcXdhaXQpKQotCQlyZXR1cm4gKEJGQV9TVEFUVVNfREVWQlVTWSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CiAKIAliZmFfc21fc2VuZF9ldmVudChCRkFfUE9SVF9NT0QoYmZhKSwgQkZBX1BQT1JUX1NNX0VOQUJMRSk7CiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CkBAIC0xMDMyLDcgKzEwMjksNyBAQAogCiAJcHBvcnQtPmNmZy5zcGVlZCA9IHNwZWVkOwogCi0JcmV0dXJuIChCRkFfU1RBVFVTX09LKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIAogLyoqCkBAIC0xMDY4LDcgKzEwNjUsNyBAQAogCX0KIAogCXBwb3J0LT5jZmcudG9wb2xvZ3kgPSB0b3BvbG9neTsKLQlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCiAvKioKQEAgLTEwOTQsNyArMTA5MSw3IEBACiAJcHBvcnQtPmNmZy5jZmdfaGFyZGFscGEgPSBCRkFfVFJVRTsKIAlwcG9ydC0+Y2ZnLmhhcmRhbHBhID0gYWxwYTsKIAotCXJldHVybiAoQkZBX1NUQVRVU19PSyk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKIGJmYV9zdGF0dXNfdApAQCAtMTEwNiw3ICsxMTAzLDcgQEAKIAliZmFfdHJjKGJmYSwgcHBvcnQtPmNmZy5oYXJkYWxwYSk7CiAKIAlwcG9ydC0+Y2ZnLmNmZ19oYXJkYWxwYSA9IEJGQV9GQUxTRTsKLQlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCiBiZmFfYm9vbGVhbl90CkBAIC0xMTM4LDE2ICsxMTM1LDE2IEBACiAJICogd2l0aCBpbiByYW5nZQogCSAqLwogCWlmICgobWF4ZnJzaXplID4gRkNfTUFYX1BEVVNaKSB8fCAobWF4ZnJzaXplIDwgRkNfTUlOX1BEVVNaKSkKLQkJcmV0dXJuIChCRkFfU1RBVFVTX0lOVkxEX0RGU1opOworCQlyZXR1cm4gQkZBX1NUQVRVU19JTlZMRF9ERlNaOwogCiAJLyoKIAkgKiBwb3dlciBvZiAyLCBpZiBub3QgdGhlIG1heCBmcmFtZSBzaXplIG9mIDIxMTIKIAkgKi8KIAlpZiAoKG1heGZyc2l6ZSAhPSBGQ19NQVhfUERVU1opICYmIChtYXhmcnNpemUgJiAobWF4ZnJzaXplIC0gMSkpKQotCQlyZXR1cm4gKEJGQV9TVEFUVVNfSU5WTERfREZTWik7CisJCXJldHVybiBCRkFfU1RBVFVTX0lOVkxEX0RGU1o7CiAKIAlwcG9ydC0+Y2ZnLm1heGZyc2l6ZSA9IG1heGZyc2l6ZTsKLQlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCiB1MTYKQEAgLTE0MTUsNyArMTQxMiw3IEBACiAKIAlpZiAocG9ydC0+c3RhdHNfYnVzeSkgewogCQliZmFfdHJjKGJmYSwgcG9ydC0+c3RhdHNfYnVzeSk7Ci0JCXJldHVybiAoQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKIAl9CiAKIAlwb3J0LT5zdGF0c19idXN5ID0gQkZBX1RSVUU7CkBAIC0xNDI3LDcgKzE0MjQsNyBAQAogCiAJYmZhX3RpbWVyX3N0YXJ0KGJmYSwgJnBvcnQtPnRpbWVyLCBiZmFfcG9ydF9zdGF0c190aW1lb3V0LCBwb3J0LAogCQkJQkZBX1BPUlRfU1RBVFNfVE9WKTsKLQlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCiBiZmFfc3RhdHVzX3QKQEAgLTE0MzcsNyArMTQzNCw3IEBACiAKIAlpZiAocG9ydC0+c3RhdHNfYnVzeSkgewogCQliZmFfdHJjKGJmYSwgcG9ydC0+c3RhdHNfYnVzeSk7Ci0JCXJldHVybiAoQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKIAl9CiAKIAlwb3J0LT5zdGF0c19idXN5ID0gQkZBX1RSVUU7CkBAIC0xNDQ4LDcgKzE0NDUsNyBAQAogCiAJYmZhX3RpbWVyX3N0YXJ0KGJmYSwgJnBvcnQtPnRpbWVyLCBiZmFfcG9ydF9zdGF0c19jbHJfdGltZW91dCwgcG9ydCwKIAkJCUJGQV9QT1JUX1NUQVRTX1RPVik7Ci0JcmV0dXJuIChCRkFfU1RBVFVTX09LKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIAogYmZhX3N0YXR1c190CkBAIC0xNTE1LDcgKzE1MTIsNyBAQAogCS8qCiAJICogUW9TIHN0YXRzIGlzIGVtYmVkZGVkIGluIHBvcnQgc3RhdHMKIAkgKi8KLQlyZXR1cm4gKGJmYV9wcG9ydF9nZXRfc3RhdHMoYmZhLCBzdGF0cywgY2JmbiwgY2JhcmcpKTsKKwlyZXR1cm4gYmZhX3Bwb3J0X2dldF9zdGF0cyhiZmEsIHN0YXRzLCBjYmZuLCBjYmFyZyk7CiB9CiAKIGJmYV9zdGF0dXNfdApAQCAtMTUyNSw3ICsxNTIyLDcgQEAKIAogCWlmIChwb3J0LT5zdGF0c19idXN5KSB7CiAJCWJmYV90cmMoYmZhLCBwb3J0LT5zdGF0c19idXN5KTsKLQkJcmV0dXJuIChCRkFfU1RBVFVTX0RFVkJVU1kpOworCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOwogCX0KIAogCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfVFJVRTsKQEAgLTE1MzYsNyArMTUzMyw3IEBACiAKIAliZmFfdGltZXJfc3RhcnQoYmZhLCAmcG9ydC0+dGltZXIsIGJmYV9wb3J0X3N0YXRzX2Nscl90aW1lb3V0LCBwb3J0LAogCQkJQkZBX1BPUlRfU1RBVFNfVE9WKTsKLQlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCiAvKioKQEAgLTE1NDUsNyArMTU0Miw3IEBACiBiZmFfc3RhdHVzX3QKIGJmYV9wcG9ydF90cnVua19kaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKQogewotCXJldHVybiAoQkZBX1NUQVRVU19PSyk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKIGJmYV9ib29sZWFuX3QKQEAgLTE1NjIsOCArMTU1OSw4IEBACiB7CiAJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CiAKLQlyZXR1cm4gKGJmYV9zbV90b19zdGF0ZShoYWxfcHBvcnRfc21fdGFibGUsIHBvcnQtPnNtKSA9PQotCQlCRkFfUFBPUlRfU1RfRElTQUJMRUQpOworCXJldHVybiBiZmFfc21fdG9fc3RhdGUoaGFsX3Bwb3J0X3NtX3RhYmxlLCBwb3J0LT5zbSkgPT0KKwkJQkZBX1BQT1JUX1NUX0RJU0FCTEVEOwogCiB9CiAKQEAgLTE1NzIsNyArMTU2OSw3IEBACiB7CiAJc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOwogCi1yZXR1cm4gKHBwb3J0LT5jZmcucmF0ZWxpbWl0ID8gQkZBX1RSVUUgOiBCRkFfRkFMU0UpOworCXJldHVybiBwcG9ydC0+Y2ZnLnJhdGVsaW1pdCA/IEJGQV9UUlVFIDogQkZBX0ZBTFNFOwogCiB9CiAKQEAgLTE2MjAsNyArMTYxNyw3IEBACiAKIAlwcG9ydC0+Y2ZnLnRybF9kZWZfc3BlZWQgPSBzcGVlZDsKIAotCXJldHVybiAoQkZBX1NUQVRVU19PSyk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKIC8qKgpAQCAtMTYzMiw3ICsxNjI5LDcgQEAKIAlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CiAKIAliZmFfdHJjKGJmYSwgcHBvcnQtPmNmZy50cmxfZGVmX3NwZWVkKTsKLQlyZXR1cm4gKHBwb3J0LT5jZmcudHJsX2RlZl9zcGVlZCk7CisJcmV0dXJuIHBwb3J0LT5jZmcudHJsX2RlZl9zcGVlZDsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCmluZGV4IDg5NzVlZDAuLmM3YWIyNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCkBAIC01NjgsMTEgKzU2OCwxMCBAQAogCiAJX19wb3J0X2FjdGlvbltwb3J0LT5mYWJyaWMtPmZhYl90eXBlXS5vZmZsaW5lKHBvcnQpOwogCi0JaWYgKGJmYV9mY3NfZmFicmljX2lzX29ubGluZShwb3J0LT5mYWJyaWMpID09IEJGQV9UUlVFKSB7CisJaWYgKGJmYV9mY3NfZmFicmljX2lzX29ubGluZShwb3J0LT5mYWJyaWMpID09IEJGQV9UUlVFKQogCQliZmFfZmNzX3BvcnRfYWVuX3Bvc3QocG9ydCwgQkZBX0xQT1JUX0FFTl9ESVNDT05ORUNUKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJYmZhX2Zjc19wb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fT0ZGTElORSk7Ci0JfQogCWJmYV9mY2JfcG9ydF9vZmZsaW5lKHBvcnQtPmZjcy0+YmZhZCwgcG9ydC0+cG9ydF9jZmcucm9sZXMsCiAJCQlwb3J0LT5mYWJyaWMtPnZmX2RydiwKIAkJCShwb3J0LT52cG9ydCA9PSBOVUxMKSA/IE5VTEwgOiBwb3J0LT52cG9ydC0+dnBvcnRfZHJ2KTsKQEAgLTc3Nyw3ICs3NzYsNyBAQAogCX0KIAogCWJmYV90cmMocG9ydC0+ZmNzLCBwd3duKTsKLQlyZXR1cm4gKE5VTEwpOworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTc5Niw3ICs3OTUsNyBAQAogCX0KIAogCWJmYV90cmMocG9ydC0+ZmNzLCBud3duKTsKLQlyZXR1cm4gKE5VTEwpOworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTg3MCw3ICs4NjksNyBAQAogYmZhX2Jvb2xlYW5fdAogYmZhX2Zjc19wb3J0X2lzX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCiB7Ci0JcmV0dXJuIChiZmFfc21fY21wX3N0YXRlKHBvcnQsIGJmYV9mY3NfcG9ydF9zbV9vbmxpbmUpKTsKKwlyZXR1cm4gYmZhX3NtX2NtcF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fb25saW5lKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3hwLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3hwLmMKaW5kZXggNDc1NGEwZS4uY2YwYWQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmN4cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjeHAuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJaWYgKGZjeHApCiAJCWxpc3RfYWRkX3RhaWwoJmZjeHAtPnFlLCAmZm0tPmZjeHBfYWN0aXZlX3EpOwogCi0JcmV0dXJuIChmY3hwKTsKKwlyZXR1cm4gZmN4cDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUwMyw3ICs1MDMsNyBAQAogCiAJZmN4cCA9IGJmYV9mY3hwX2dldChCRkFfRkNYUF9NT0QoYmZhKSk7CiAJaWYgKGZjeHAgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CiAKIAliZmFfdHJjKGJmYSwgZmN4cC0+ZmN4cF90YWcpOwogCkBAIC01NjgsNyArNTY4LDcgQEAKIAkJfQogCX0KIAotCXJldHVybiAoZmN4cCk7CisJcmV0dXJuIGZjeHA7CiB9CiAKIC8qKgpAQCAtNzA5LDcgKzcwOSw3IEBACiBiZmFfZmN4cF9hYm9ydChzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCkKIHsKIAliZmFfYXNzZXJ0KDApOwotCXJldHVybiAoQkZBX1NUQVRVU19PSyk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHIuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHIuYwppbmRleCAwY2ExMjU3Li5iMzY1NDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pbnRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW50ci5jCkBAIC01OSw3ICs1OSw3IEBACiAJcWludHIgPSBpbnRyICYgX19IRk5fSU5UX1JNRV9NQVNLOwogCWJmYV9yZWdfd3JpdGUoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cywgcWludHIpOwogCi0JZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgQkZJX0lPQ19NQVhfQ1FTX0FTSUM7IHF1ZXVlICsrKSB7CisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgQkZJX0lPQ19NQVhfQ1FTX0FTSUM7IHF1ZXVlKyspIHsKIAkJaWYgKGludHIgJiAoX19IRk5fSU5UX1JNRV9RMCA8PCBxdWV1ZSkpCiAJCQliZmFfbXNpeF9yc3BxKGJmYSwgcXVldWUgJiAoQkZJX0lPQ19NQVhfQ1FTIC0gMSkpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHJfcHJpdi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW50cl9wcml2LmgKaW5kZXggOGNlNmU2Yi4uNWZjMzAxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW50cl9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW50cl9wcml2LmgKQEAgLTI2LDkgKzI2LDkgQEAKIHZvaWQgYmZhX2lzcl9iaW5kKGVudW0gYmZpX21jbGFzcyBtYywgYmZhX2lzcl9mdW5jX3QgaXNyX2Z1bmMpOwogCiAKLSNkZWZpbmUgYmZhX3JlcXFfcGkoX19iZmEsIF9fcmVxcSkJKF9fYmZhKS0+aW9jZmMucmVxX2NxX3BpW19fcmVxcV0KKyNkZWZpbmUgYmZhX3JlcXFfcGkoX19iZmEsIF9fcmVxcSkJKChfX2JmYSktPmlvY2ZjLnJlcV9jcV9waVtfX3JlcXFdKQogI2RlZmluZSBiZmFfcmVxcV9jaShfX2JmYSwgX19yZXFxKQkJCQkJXAotCSoodTMyICopKChfX2JmYSktPmlvY2ZjLnJlcV9jcV9zaGFkb3dfY2lbX19yZXFxXS5rdmEpCisJKCoodTMyICopKChfX2JmYSktPmlvY2ZjLnJlcV9jcV9zaGFkb3dfY2lbX19yZXFxXS5rdmEpKQogCiAjZGVmaW5lIGJmYV9yZXFxX2Z1bGwoX19iZmEsIF9fcmVxcSkJCQkJXAogCSgoKGJmYV9yZXFxX3BpKF9fYmZhLCBfX3JlcXEpICsgMSkgJgkJCVwKQEAgLTUwLDE0ICs1MCwxNiBAQAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBiZmFfcnNwcV9waShfX2JmYSwgX19yc3BxKQkJCQkJXAotCSoodTMyICopKChfX2JmYSktPmlvY2ZjLnJzcF9jcV9zaGFkb3dfcGlbX19yc3BxXS5rdmEpCisJKCoodTMyICopKChfX2JmYSktPmlvY2ZjLnJzcF9jcV9zaGFkb3dfcGlbX19yc3BxXS5rdmEpKQogCi0jZGVmaW5lIGJmYV9yc3BxX2NpKF9fYmZhLCBfX3JzcHEpCShfX2JmYSktPmlvY2ZjLnJzcF9jcV9jaVtfX3JzcHFdCisjZGVmaW5lIGJmYV9yc3BxX2NpKF9fYmZhLCBfX3JzcHEpCSgoX19iZmEpLT5pb2NmYy5yc3BfY3FfY2lbX19yc3BxXSkKICNkZWZpbmUgYmZhX3JzcHFfZWxlbShfX2JmYSwgX19yc3BxLCBfX2NpKQkJCQlcCi0JJigoc3RydWN0IGJmaV9tc2dfcyAqKSgoX19iZmEpLT5pb2NmYy5yc3BfY3FfYmFbX19yc3BxXS5rdmEpKVtfX2NpXQorCSgmKChzdHJ1Y3QgYmZpX21zZ19zICopKChfX2JmYSktPmlvY2ZjLnJzcF9jcV9iYVtfX3JzcHFdLmt2YSkpW19fY2ldKQogCi0jZGVmaW5lIENRX0lOQ1IoX19pbmRleCwgX19zaXplKQkJCQkJXAotCQkJKF9faW5kZXgpKys7IChfX2luZGV4KSAmPSAoKF9fc2l6ZSkgLSAxKQorI2RlZmluZSBDUV9JTkNSKF9faW5kZXgsIF9fc2l6ZSkgZG8gewkJCQkJXAorCQkJKF9faW5kZXgpKys7CQkJCQlcCisJCQkoX19pbmRleCkgJj0gKChfX3NpemUpIC0gMSk7ICAgICAgXAorfSB3aGlsZSAoMCkKIAogLyoqCiAgKiBRdWV1ZSBlbGVtZW50IHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxdWVzdCBxdWV1ZS4gRklGTyBvcmRlciBpcwpAQCAtOTQsNyArOTYsNyBAQAogCXdxZS0+Y2JhcmcgPSBjYmFyZzsKIH0KIAotI2RlZmluZSBiZmFfcmVxcShfX2JmYSwgX19yZXFxKQkmKF9fYmZhKS0+cmVxcV93YWl0cVtfX3JlcXFdCisjZGVmaW5lIGJmYV9yZXFxKF9fYmZhLCBfX3JlcXEpCSgmKF9fYmZhKS0+cmVxcV93YWl0cVtfX3JlcXFdKQogCiAvKioKICAqIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwppbmRleCAxNDkzNDg5Li4zOTdkN2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwpAQCAtNTEsNyArNTEsNyBAQAogCSAoc2l6ZW9mKHN0cnVjdCBiZmFfdHJjX21vZF9zKSAtCQkJXAogCSAgQkZBX1RSQ19NQVggKiBzaXplb2Yoc3RydWN0IGJmYV90cmNfcykpKQogI2RlZmluZSBCRkFfREJHX0ZXVFJDX09GRihfZm4pCShCRklfSU9DX1RSQ19PRkYgKyBCRkFfREJHX0ZXVFJDX0xFTiAqIChfZm4pKQotI2RlZmluZSBiZmFfaW9jX3N0YXRzKF9pb2MsIF9zdGF0cykJKF9pb2MpLT5zdGF0cy5fc3RhdHMgKysKKyNkZWZpbmUgYmZhX2lvY19zdGF0cyhfaW9jLCBfc3RhdHMpCSgoX2lvYyktPnN0YXRzLl9zdGF0cysrKQogCiAjZGVmaW5lIEJGQV9GTEFTSF9DSFVOS19OTyhvZmYpICAgICAgICAgKG9mZiAvIEJGSV9GTEFTSF9DSFVOS19TWl9XT1JEUykKICNkZWZpbmUgQkZBX0ZMQVNIX09GRlNFVF9JTl9DSFVOSyhvZmYpICAob2ZmICUgQkZJX0ZMQVNIX0NIVU5LX1NaX1dPUkRTKQpAQCAtMTk1Myw4ICsxOTUzLDggQEAKIGJmYV9ib29sZWFuX3QKIGJmYV9pb2NfaXNfZGlzYWJsZWQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewotCXJldHVybiAoYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGluZykKLQkJfHwgYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGVkKSk7CisJcmV0dXJuIGJmYV9mc21fY21wX3N0YXRlKGlvYywgYmZhX2lvY19zbV9kaXNhYmxpbmcpCisJCXx8IGJmYV9mc21fY21wX3N0YXRlKGlvYywgYmZhX2lvY19zbV9kaXNhYmxlZCk7CiB9CiAKIC8qKgpAQCAtMTk2Myw5ICsxOTYzLDkgQEAKIGJmYV9ib29sZWFuX3QKIGJmYV9pb2NfZndfbWlzbWF0Y2goc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewotCXJldHVybiAoYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX3Jlc2V0KQorCXJldHVybiBiZmFfZnNtX2NtcF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fcmVzZXQpCiAJCXx8IGJmYV9mc21fY21wX3N0YXRlKGlvYywgYmZhX2lvY19zbV9md2NoZWNrKQotCQl8fCBiZmFfZnNtX2NtcF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fbWlzbWF0Y2gpKTsKKwkJfHwgYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX21pc21hdGNoKTsKIH0KIAogI2RlZmluZSBiZmFfaW9jX3N0YXRlX2Rpc2FibGVkKF9fc20pCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCmluZGV4IDU4ZWZkNGIuLjdjMzBmMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCkBAIC0xNzksMTYgKzE3OSwxNiBAQAogCXN0cnVjdCBiZmFfaW9jX21ib3hfbW9kX3MgbWJveF9tb2Q7CiB9OwogCi0jZGVmaW5lIGJmYV9pb2NfcGNpZm4oX19pb2MpCQkoX19pb2MpLT5wY2lkZXYucGNpX2Z1bmMKLSNkZWZpbmUgYmZhX2lvY19kZXZpZChfX2lvYykJCShfX2lvYyktPnBjaWRldi5kZXZpY2VfaWQKLSNkZWZpbmUgYmZhX2lvY19iYXIwKF9faW9jKQkJKF9faW9jKS0+cGNpZGV2LnBjaV9iYXJfa3ZhCisjZGVmaW5lIGJmYV9pb2NfcGNpZm4oX19pb2MpCQkoKF9faW9jKS0+cGNpZGV2LnBjaV9mdW5jKQorI2RlZmluZSBiZmFfaW9jX2RldmlkKF9faW9jKQkJKChfX2lvYyktPnBjaWRldi5kZXZpY2VfaWQpCisjZGVmaW5lIGJmYV9pb2NfYmFyMChfX2lvYykJCSgoX19pb2MpLT5wY2lkZXYucGNpX2Jhcl9rdmEpCiAjZGVmaW5lIGJmYV9pb2NfcG9ydGlkKF9faW9jKQkJKChfX2lvYyktPnBvcnRfaWQpCiAjZGVmaW5lIGJmYV9pb2NfZmV0Y2hfc3RhdHMoX19pb2MsIF9fc3RhdHMpIFwKLQkJKChfX3N0YXRzKS0+ZHJ2X3N0YXRzKSA9IChfX2lvYyktPnN0YXRzCisJCSgoKF9fc3RhdHMpLT5kcnZfc3RhdHMpID0gKF9faW9jKS0+c3RhdHMpCiAjZGVmaW5lIGJmYV9pb2NfY2xyX3N0YXRzKF9faW9jKQlcCiAJCWJmYV9vc19tZW1zZXQoJihfX2lvYyktPnN0YXRzLCAwLCBzaXplb2YoKF9faW9jKS0+c3RhdHMpKQotI2RlZmluZSBiZmFfaW9jX21heGZyc2l6ZShfX2lvYykJKF9faW9jKS0+YXR0ci0+bWF4ZnJzaXplCi0jZGVmaW5lIGJmYV9pb2NfcnhfYmJjcmVkaXQoX19pb2MpCShfX2lvYyktPmF0dHItPnJ4X2JiY3JlZGl0CisjZGVmaW5lIGJmYV9pb2NfbWF4ZnJzaXplKF9faW9jKQkoKF9faW9jKS0+YXR0ci0+bWF4ZnJzaXplKQorI2RlZmluZSBiZmFfaW9jX3J4X2JiY3JlZGl0KF9faW9jKQkoKF9faW9jKS0+YXR0ci0+cnhfYmJjcmVkaXQpCiAjZGVmaW5lIGJmYV9pb2Nfc3BlZWRfc3VwKF9faW9jKQlcCiAJQkZJX0FEQVBURVJfR0VUUChTUEVFRCwgKF9faW9jKS0+YXR0ci0+YWRhcHRlcl9wcm9wKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NmYy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuYwppbmRleCAxMjM1MGIwLi5kN2FiNzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NmYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjLmMKQEAgLTc5NCw3ICs3OTQsNyBAQAogCiAJaWYgKGlvY2ZjLT5zdGF0c19idXN5KSB7CiAJCWJmYV90cmMoYmZhLCBpb2NmYy0+c3RhdHNfYnVzeSk7Ci0JCXJldHVybiAoQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKIAl9CiAKIAlpb2NmYy0+c3RhdHNfYnVzeSA9IEJGQV9UUlVFOwpAQCAtODA0LDcgKzgwNCw3IEBACiAKIAliZmFfaW9jZmNfc3RhdHNfcXVlcnkoYmZhKTsKIAotCXJldHVybiAoQkZBX1NUQVRVU19PSyk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKIGJmYV9zdGF0dXNfdApAQCAtODE0LDcgKzgxNCw3IEBACiAKIAlpZiAoaW9jZmMtPnN0YXRzX2J1c3kpIHsKIAkJYmZhX3RyYyhiZmEsIGlvY2ZjLT5zdGF0c19idXN5KTsKLQkJcmV0dXJuIChCRkFfU1RBVFVTX0RFVkJVU1kpOworCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOwogCX0KIAogCWlvY2ZjLT5zdGF0c19idXN5ID0gQkZBX1RSVUU7CkBAIC04MjIsNyArODIyLDcgQEAKIAlpb2NmYy0+c3RhdHNfY2JhcmcgPSBjYmFyZzsKIAogCWJmYV9pb2NmY19zdGF0c19jbGVhcihiZmEpOwotCXJldHVybiAoQkZBX1NUQVRVU19PSyk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjLmgKaW5kZXggN2FkMTc3ZS4uY2U5YTgzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NmYy5oCkBAIC0xMDcsMTMgKzEwNywxMyBAQAogCiAjZGVmaW5lIGJmYV9scHVpZChfX2JmYSkJCWJmYV9pb2NfcG9ydGlkKCYoX19iZmEpLT5pb2MpCiAjZGVmaW5lIGJmYV9tc2l4X2luaXQoX19iZmEsIF9fbnZlY3MpCVwKLQkoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfaW5pdChfX2JmYSwgX19udmVjcykKKwkoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19tc2l4X2luaXQoX19iZmEsIF9fbnZlY3MpKQogI2RlZmluZSBiZmFfbXNpeF9pbnN0YWxsKF9fYmZhKQlcCi0JKF9fYmZhKS0+aW9jZmMuaHdpZi5od19tc2l4X2luc3RhbGwoX19iZmEpCisJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9pbnN0YWxsKF9fYmZhKSkKICNkZWZpbmUgYmZhX21zaXhfdW5pbnN0YWxsKF9fYmZhKQlcCi0JKF9fYmZhKS0+aW9jZmMuaHdpZi5od19tc2l4X3VuaW5zdGFsbChfX2JmYSkKKwkoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19tc2l4X3VuaW5zdGFsbChfX2JmYSkpCiAjZGVmaW5lIGJmYV9pc3JfbW9kZV9zZXQoX19iZmEsIF9fbXNpeCkJXAotCShfX2JmYSktPmlvY2ZjLmh3aWYuaHdfaXNyX21vZGVfc2V0KF9fYmZhLCBfX21zaXgpCisJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfaXNyX21vZGVfc2V0KF9fYmZhLCBfX21zaXgpKQogI2RlZmluZSBiZmFfbXNpeF9nZXR2ZWNzKF9fYmZhLCBfX3ZlY21hcCwgX19udmVjcywgX19tYXh2ZWMpCVwKIAkoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfZ2V0dmVjcyhfX2JmYSwgX192ZWNtYXAsIF9fbnZlY3MsIF9fbWF4dmVjKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2ltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2ltLmMKaW5kZXggN2FlMjU1Mi4uZjgxZDM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9pbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvaW0uYwpAQCAtMTA1LDEzICsxMDUsMTMgQEAKIAkJCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CiAJCQkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKIAkJCQlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwKLQkJCQkJJmlvaW0tPmZjcGltLT5pb2ltX2NvbXBfcSk7CisJCQkJCQkmaW9pbS0+ZmNwaW0tPmlvaW1fY29tcF9xKTsKIAkJCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLAogCQkJCQkJX19iZmFfY2JfaW9pbV9wYXRodG92LCBpb2ltKTsKIAkJCX0gZWxzZSB7CiAJCQkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKIAkJCQlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwKLQkJCQkJJmlvaW0tPml0bmltLT5wZW5kaW5nX3EpOworCQkJCQkJJmlvaW0tPml0bmltLT5wZW5kaW5nX3EpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2l0bmltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pdG5pbS5jCmluZGV4IDRkNWM2MWEuLmVhYmY3ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2l0bmltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaXRuaW0uYwpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAliZmFfc3RhdHMoaXRuaW0sIGNyZWF0ZXMpOwogCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfSVROSU1fU01fQ1JFQVRFKTsKIAotCXJldHVybiAoaXRuaW0pOworCXJldHVybiBpdG5pbTsKIH0KIAogdm9pZApAQCAtMTA2MSw3ICsxMDYxLDcgQEAKIGJmYV9ib29sZWFuX3QKIGJmYV9pdG5pbV9ob2xkX2lvKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCiB7Ci0JcmV0dXJuICgKKwlyZXR1cm4KIAkJaXRuaW0tPmZjcGltLT5wYXRoX3RvdiAmJiBpdG5pbS0+aW90b3ZfYWN0aXZlICYmCiAJCShiZmFfc21fY21wX3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndjcmVhdGUpIHx8CiAJCSBiZmFfc21fY21wX3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fc2xlcikgfHwKQEAgLTEwNjksNyArMTA2OSw3IEBACiAJCSBiZmFfc21fY21wX3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndkZWxldGUpIHx8CiAJCSBiZmFfc21fY21wX3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fb2ZmbGluZSkgfHwKIAkJIGJmYV9zbV9jbXBfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKSkKLSk7CisJOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9sb2cuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2xvZy5jCmluZGV4IGMyNzM1ZTUuLmU3NTE0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2xvZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2xvZy5jCkBAIC0yMzEsOSArMjMxLDkgQEAKIAkJcmV0dXJuIEJGQV9MT0dfSU5WQUxJRDsKIAogCWlmIChsb2dfbW9kKQotCQlyZXR1cm4gKGxvZ19tb2QtPmxvZ19sZXZlbFttb2RfaWRdKTsKKwkJcmV0dXJuIGxvZ19tb2QtPmxvZ19sZXZlbFttb2RfaWRdOwogCWVsc2UKLQkJcmV0dXJuIChiZmFfbG9nX2luZm9bbW9kX2lkXS5sZXZlbCk7CisJCXJldHVybiBiZmFfbG9nX2luZm9bbW9kX2lkXS5sZXZlbDsKIH0KIAogZW51bSBiZmFfbG9nX3NldmVyaXR5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wb3J0X3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnRfcHJpdi5oCmluZGV4IDRiOTdlMjcuLjUxZjY5OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnRfcHJpdi5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnRfcHJpdi5oCkBAIC01OSw4ICs1OSw4IEBACiAJdTgJCQkqc3RhdHNfa3ZhOwogCXU2NAkJc3RhdHNfcGE7CiAJdW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKnN0YXRzOwkvKiAgcHBvcnQgc3RhdHMgKi8KLQl1MzIJCW15cGlkIDogMjQ7Ci0JdTMyCQlyc3ZkX2IgOiA4OworCXUzMgkJbXlwaWQ6MjQ7CisJdTMyCQlyc3ZkX2I6ODsKIAlzdHJ1Y3QgYmZhX3RpbWVyX3MgCXRpbWVyOwkvKiAgdGltZXIgKi8KIAl1bmlvbiBiZmFfcHBvcnRfc3RhdHNfdSAJKnN0YXRzX3JldDsKIAkJCQkJLyogIGRyaXZlciBzdGF0cyBsb2NhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Jwb3J0LmMKaW5kZXggMTZkYTc3YS4uM2UxOTkwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcnBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9ycG9ydC5jCkBAIC02NzcsNyArNjc3LDcgQEAKIAlpZiAocnBvcnQpCiAJCWxpc3RfYWRkX3RhaWwoJnJwb3J0LT5xZSwgJm1vZC0+cnBfYWN0aXZlX3EpOwogCi0JcmV0dXJuIChycG9ydCk7CisJcmV0dXJuIHJwb3J0OwogfQogCiBzdGF0aWMgdm9pZApAQCAtODM0LDcgKzgzNCw3IEBACiAJcnAgPSBiZmFfcnBvcnRfYWxsb2MoQkZBX1JQT1JUX01PRChiZmEpKTsKIAogCWlmIChycCA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOworCQlyZXR1cm4gTlVMTDsKIAogCXJwLT5iZmEgPSBiZmE7CiAJcnAtPnJwb3J0X2RydiA9IHJwb3J0X2RydjsKQEAgLTg0Myw3ICs4NDMsNyBAQAogCWJmYV9hc3NlcnQoYmZhX3NtX2NtcF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX3VuaW5pdCkpOwogCWJmYV9zbV9zZW5kX2V2ZW50KHJwLCBCRkFfUlBPUlRfU01fQ1JFQVRFKTsKIAotCXJldHVybiAocnApOworCXJldHVybiBycDsKIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfdHNraW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Rza2ltLmMKaW5kZXggMDEwZDQwZC4uZmY3YTRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfdHNraW0uYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV90c2tpbS5jCkBAIC0yMywxMyArMjMsMTQgQEAKIC8qKgogICogdGFzayBtYW5hZ2VtZW50IGNvbXBsZXRpb24gaGFuZGxpbmcKICAqLwotI2RlZmluZSBiZmFfdHNraW1fcWNvbXAoX190c2tpbSwgX19jYmZuKSBkbyB7CQkJICAgICBcCi0JYmZhX2NiX3F1ZXVlKChfX3Rza2ltKS0+YmZhLCAmKF9fdHNraW0pLT5oY2JfcWUsIF9fY2JmbiwgKF9fdHNraW0pKTsgXAorI2RlZmluZSBiZmFfdHNraW1fcWNvbXAoX190c2tpbSwgX19jYmZuKSBkbyB7CQkJXAorCWJmYV9jYl9xdWV1ZSgoX190c2tpbSktPmJmYSwgJihfX3Rza2ltKS0+aGNiX3FlLAlcCisJCQkgX19jYmZuLCAoX190c2tpbSkpOyAgICAgIFwKIAliZmFfdHNraW1fbm90aWZ5X2NvbXAoX190c2tpbSk7ICAgICAgXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBiZmFfdHNraW1fbm90aWZ5X2NvbXAoX190c2tpbSkgZG8gewkJCQkgICAgIFwKLQlpZiAoKF9fdHNraW0pLT5ub3RpZnkpCQkJCQkgICAgIAkgICAgIFwKKyNkZWZpbmUgYmZhX3Rza2ltX25vdGlmeV9jb21wKF9fdHNraW0pIGRvIHsJCQkgXAorCWlmICgoX190c2tpbSktPm5vdGlmeSkJCQkJCSBcCiAJCWJmYV9pdG5pbV90c2tkb25lKChfX3Rza2ltKS0+aXRuaW0pOyAgICAgIFwKIH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3VmLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV91Zi5jCmluZGV4IGZmNWY5ZGUuLjRiM2MyNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3VmLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfdWYuYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJc3RydWN0IGJmYV91Zl9zICAgKnVmOwogCiAJYmZhX3FfZGVxKCZ1Zl9tb2QtPnVmX2ZyZWVfcSwgJnVmKTsKLQlyZXR1cm4gKHVmKTsKKwlyZXR1cm4gdWY7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCmluZGV4IDZmMmJlNWEuLmI1MmI3NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCkBAIC0xODgsOCArMTg4LDggQEAKIGJmYWRfZ2V0X2Rydl9wb3J0KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX3ZmX3MgKnZmX2RydiwKIAkJICBzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cF9kcnYpCiB7Ci0JcmV0dXJuICgodnBfZHJ2KSA/ICgmKHZwX2RydiktPmRydl9wb3J0KQotCQk6ICgodmZfZHJ2KSA/ICgmKHZmX2RydiktPmJhc2VfcG9ydCkgOiAoJihiZmFkKS0+cHBvcnQpKSk7CisJcmV0dXJuICh2cF9kcnYpID8gKCYodnBfZHJ2KS0+ZHJ2X3BvcnQpCisJCTogKCh2Zl9kcnYpID8gKCYodmZfZHJ2KS0+YmFzZV9wb3J0KSA6ICgmKGJmYWQpLT5wcG9ydCkpOwogfQogCiBzdHJ1Y3QgYmZhZF9wb3J0X3MgKgpAQCAtNzE2LDcgKzcxNiw3IEBACiAJaWYgKChiZmFkLT5iZmFkX2ZsYWdzICYgQkZBRF9NU0lYX09OKQogCSAgICAmJiBiZmFkX2luc3RhbGxfbXNpeF9oYW5kbGVyKGJmYWQpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnN0YWxsX21zaXggZmFpbGVkLCBiZmFkJWRcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGJmYWQtPmluc3Rfbm8pOworCQkgICAgICAgX19mdW5jX18sIGJmYWQtPmluc3Rfbm8pOwogCX0KIAogCWJmYWRfaW5pdF90aW1lcihiZmFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9md2ltZy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Z3aW1nLmMKaW5kZXggYmQzNGIwZC4uMmFkNjVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Z3aW1nLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Z3aW1nLmMKQEAgLTY1LDEwICs2NSwxMCBAQAogCW1lbWNweSgqYmZpX2ltYWdlLCBmdy0+ZGF0YSwgZnctPnNpemUpOwogCSpiZmlfaW1hZ2Vfc2l6ZSA9IGZ3LT5zaXplL3NpemVvZih1MzIpOwogCi0JcmV0dXJuKCpiZmlfaW1hZ2UpOworCXJldHVybiAqYmZpX2ltYWdlOwogCiBlcnJvcjoKLQlyZXR1cm4oTlVMTCk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHUzMiAqCkBAIC03OCwxMiArNzgsMTIgQEAKIAkJaWYgKGJmaV9pbWFnZV9jdF9zaXplID09IDApCiAJCQliZmFkX3JlYWRfZmlybXdhcmUocGRldiwgJmJmaV9pbWFnZV9jdCwKIAkJCQkmYmZpX2ltYWdlX2N0X3NpemUsIEJGQURfRldfRklMRV9DVCk7Ci0JCXJldHVybihiZmlfaW1hZ2VfY3QpOworCQlyZXR1cm4gYmZpX2ltYWdlX2N0OwogCX0gZWxzZSB7CiAJCWlmIChiZmlfaW1hZ2VfY2Jfc2l6ZSA9PSAwKQogCQkJYmZhZF9yZWFkX2Zpcm13YXJlKHBkZXYsICZiZmlfaW1hZ2VfY2IsCiAJCQkJJmJmaV9pbWFnZV9jYl9zaXplLCBCRkFEX0ZXX0ZJTEVfQ0IpOwotCQlyZXR1cm4oYmZpX2ltYWdlX2NiKTsKKwkJcmV0dXJuIGJmaV9pbWFnZV9jYjsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKaW5kZXggNTVkMDEyYS4uZjc4OGMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKQEAgLTEwNTAsNyArMTA1MCw3IEBACiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJIiVzOiBpdG5pbSAlbGx4IGlzIGFscmVhZHkgaW4gb25saW5lIHN0YXRlXG4iLAotCQkJCV9fRlVOQ1RJT05fXywKKwkJCQlfX2Z1bmNfXywKIAkJCQliZmFfZmNzX2l0bmltX2dldF9wd3duKCZpdG5pbS0+ZmNzX2l0bmltKSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltX2NvbXBhdC5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltX2NvbXBhdC5oCmluZGV4IDFkM2U3NGUuLmIzNmJlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbV9jb21wYXQuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW1fY29tcGF0LmgKQEAgLTMxLDcgKzMxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdTMyICoKIGJmYWRfbG9hZF9md2ltZyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlyZXR1cm4oYmZhZF9nZXRfZmlybXdhcmVfYnVmKHBkZXYpKTsKKwlyZXR1cm4gYmZhZF9nZXRfZmlybXdhcmVfYnVmKHBkZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbnRyLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW50ci5jCmluZGV4IGYxMDRlMDIuLjdkZTg4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbnRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ludHIuYwpAQCAtMjMsMTMgKzIzLDEyIEBACiAvKioKICAqICBiZmFfaXNyIEJGQSBkcml2ZXIgaW50ZXJydXB0IGZ1bmN0aW9ucwogICovCi1pcnFyZXR1cm5fdCBiZmFkX2ludHgoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBpbnQgbXNpeF9kaXNhYmxlOwogbW9kdWxlX3BhcmFtKG1zaXhfZGlzYWJsZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiAvKioKICAqIExpbmUgYmFzZWQgaW50ZXJydXB0IGhhbmRsZXIuCiAgKi8KLWlycXJldHVybl90CitzdGF0aWMgaXJxcmV0dXJuX3QKIGJmYWRfaW50eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gZGV2X2lkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mYWJyaWMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvZmFicmljLmMKaW5kZXggYThiMTRjNC4uYTRiNWRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9mYWJyaWMuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2ZhYnJpYy5jCkBAIC0zNiwxMiArMzYsMTIgQEAKICNkZWZpbmUgQkZBX0ZDU19GQUJSSUNfUkVUUllfREVMQVkJKDIwMDApCS8qIE1pbGxpc2Vjb25kcyAqLwogI2RlZmluZSBCRkFfRkNTX0ZBQlJJQ19DTEVBTlVQX0RFTEFZCSgxMDAwMCkJLyogTWlsbGlzZWNvbmRzICovCiAKLSNkZWZpbmUgYmZhX2Zjc19mYWJyaWNfc2V0X29wZXJ0eXBlKF9fZmFicmljKSBkbyB7ICAgICAgICAgIFwKLSAgICBpZiAoYmZhX3Bwb3J0X2dldF90b3BvbG9neSgoX19mYWJyaWMpLT5mY3MtPmJmYSkgICAgXAotCQkJCT09IEJGQV9QUE9SVF9UT1BPTE9HWV9QMlApICAgXAotCSAgICAoX19mYWJyaWMpLT5vcGVyX3R5cGUgPSBCRkFfUFBPUlRfVFlQRV9OUE9SVDsgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAoX19mYWJyaWMpLT5vcGVyX3R5cGUgPSBCRkFfUFBPUlRfVFlQRV9OTFBPUlQ7ICAgICAgXAorI2RlZmluZSBiZmFfZmNzX2ZhYnJpY19zZXRfb3BlcnR5cGUoX19mYWJyaWMpIGRvIHsgICAgICAgICAgICAgXAorCWlmIChiZmFfcHBvcnRfZ2V0X3RvcG9sb2d5KChfX2ZhYnJpYyktPmZjcy0+YmZhKSAgICAgICBcCisJCQkJPT0gQkZBX1BQT1JUX1RPUE9MT0dZX1AyUCkgICAgIFwKKwkJKF9fZmFicmljKS0+b3Blcl90eXBlID0gQkZBX1BQT1JUX1RZUEVfTlBPUlQ7ICBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKF9fZmFicmljKS0+b3Blcl90eXBlID0gQkZBX1BQT1JUX1RZUEVfTkxQT1JUOyBcCiB9IHdoaWxlICgwKQogCiAvKgpAQCAtODg3LDcgKzg4Nyw3IEBACiBiZmFfYm9vbGVhbl90CiBiZmFfZmNzX2ZhYnJpY19pc19sb29wYmFjayhzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKQogewotCXJldHVybiAoYmZhX3NtX2NtcF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2xvb3BiYWNrKSk7CisJcmV0dXJuIGJmYV9zbV9jbXBfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9sb29wYmFjayk7CiB9CiAKIGVudW0gYmZhX3Bwb3J0X3R5cGUKQEAgLTk3NCw3ICs5NzQsNyBAQAogaW50CiBiZmFfZmNzX2ZhYnJpY19pc19vbmxpbmUoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKIHsKLQlyZXR1cm4gKGJmYV9zbV9jbXBfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9vbmxpbmUpKTsKKwlyZXR1cm4gYmZhX3NtX2NtcF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX29ubGluZSk7CiB9CiAKIApAQCAtMTAxNSw3ICsxMDE1LDcgQEAKIHUxNgogYmZhX2Zjc19mYWJyaWNfdnBvcnRfY291bnQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKIHsKLQlyZXR1cm4gKGZhYnJpYy0+bnVtX3Zwb3J0cyk7CisJcmV0dXJuIGZhYnJpYy0+bnVtX3Zwb3J0czsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2ZjYnVpbGQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5jCmluZGV4IGQxNzQ3MDYuLmZlZTU0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5jCkBAIC0xODgsMTQgKzE4OCwxNCBAQAogCXN3aXRjaCAoZWxzX2NtZC0+ZWxzX2NvZGUpIHsKIAljYXNlIEZDX0VMU19MU19SSlQ6CiAJCWlmIChsc19yanQtPnJlYXNvbl9jb2RlID09IEZDX0xTX1JKVF9SU05fTE9HSUNBTF9CVVNZKQotCQkJcmV0dXJuIChGQ19QQVJTRV9CVVNZKTsKKwkJCXJldHVybiBGQ19QQVJTRV9CVVNZOwogCQllbHNlCi0JCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCQkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAljYXNlIEZDX0VMU19BQ0M6Ci0JCXJldHVybiAoRkNfUEFSU0VfT0spOworCQlyZXR1cm4gRkNfUEFSU0VfT0s7CiAJfQotCXJldHVybiAoRkNfUEFSU0VfT0spOworCXJldHVybiBGQ19QQVJTRV9PSzsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTIyOCw3ICsyMjgsNyBAQAogCWJmYV9vc19tZW1jcHkoJnBsb2dpLT5wb3J0X25hbWUsICZwb3J0X25hbWUsIHNpemVvZih3d25fdCkpOwogCWJmYV9vc19tZW1jcHkoJnBsb2dpLT5ub2RlX25hbWUsICZub2RlX25hbWUsIHNpemVvZih3d25fdCkpOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX2xvZ2lfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX2xvZ2lfcyk7CiB9CiAKIHUxNgpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJZmxvZ2ktPmNzcC5ucGl2X3N1cHAgICAgPSAxOyAvKiBAdG9kby4gZmllbGQgbmFtZSBpcyBub3QgY29ycmVjdCAqLwogCXZ2bF9pbmZvWzBdCT0gYmZhX29zX2h0b25sKEZMT0dJX1ZWTF9CUkNEKTsKIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpOwogfQogCiB1MTYKQEAgLTI4Nyw3ICsyODcsNyBAQAogCiAJZmxvZ2ktPmNzcC5iYmNyZWQgPSBiZmFfb3NfaHRvbnMobG9jYWxfYmJfY3JlZGl0cyk7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKTsKIH0KIAogdTE2CkBAIC0zMDYsNyArMzA2LDcgQEAKIAlmbG9naS0+cG9ydF9uYW1lID0gcG9ydF9uYW1lOwogCWZsb2dpLT5ub2RlX25hbWUgPSBub2RlX25hbWU7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKTsKIH0KIAogdTE2CkBAIC0zMzgsMjYgKzMzOCwyNiBAQAogCWNhc2UgRkNfRUxTX0xTX1JKVDoKIAkJbHNfcmp0ID0gKHN0cnVjdCBmY19sc19yanRfcyAqKSAoZmNocyArIDEpOwogCQlpZiAobHNfcmp0LT5yZWFzb25fY29kZSA9PSBGQ19MU19SSlRfUlNOX0xPR0lDQUxfQlVTWSkKLQkJCXJldHVybiAoRkNfUEFSU0VfQlVTWSk7CisJCQlyZXR1cm4gRkNfUEFSU0VfQlVTWTsKIAkJZWxzZQotCQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCWNhc2UgRkNfRUxTX0FDQzoKIAkJcGxvZ2kgPSAoc3RydWN0IGZjX2xvZ2lfcyAqKSAoZmNocyArIDEpOwogCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKQotCQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCiAJCWlmICghd3duX2lzX2VxdWFsKHBsb2dpLT5wb3J0X25hbWUsIHBvcnRfbmFtZSkpCi0JCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCQkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAkJaWYgKCFwbG9naS0+Y2xhc3MzLmNsYXNzX3ZhbGlkKQotCQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCiAJCWlmIChiZmFfb3NfbnRvaHMocGxvZ2ktPmNsYXNzMy5yeHN6KSA8IChGQ19NSU5fUERVU1opKQotCQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCi0JCXJldHVybiAoRkNfUEFSU0VfT0spOworCQlyZXR1cm4gRkNfUEFSU0VfT0s7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAJfQogfQogCkBAIC0zNzIsNyArMzcyLDcgQEAKIAlpZiAoKGJmYV9vc19udG9ocyhwbG9naS0+Y2xhc3MzLnJ4c3opIDwgRkNfTUlOX1BEVVNaKQogCSAgICB8fCAoYmZhX29zX250b2hzKHBsb2dpLT5jbGFzczMucnhzeikgPiBGQ19NQVhfUERVU1opCiAJICAgIHx8IChwbG9naS0+Y2xhc3MzLnJ4c3ogPT0gMCkpCi0JCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCiAJcmV0dXJuIEZDX1BBUlNFX09LOwogfQpAQCAtMzkzLDcgKzM5Myw3IEBACiAJcHJsaS0+cGFyYW1wYWdlLnNlcnZwYXJhbXMudGFza19yZXRyeV9pZCA9IDA7CiAJcHJsaS0+cGFyYW1wYWdlLnNlcnZwYXJhbXMuY29uZmlybSAgICAgICA9IDE7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfcHJsaV9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcHJsaV9zKTsKIH0KIAogdTE2CkBAIC00MTQsNDEgKzQxNCw0MSBAQAogCiAJcHJsaS0+cGFyYW1wYWdlLnJzcGNvZGUgPSBGQ19QUkxJX0FDQ19YUVREOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3BybGlfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX3BybGlfcyk7CiB9CiAKIGVudW0gZmNfcGFyc2Vfc3RhdHVzCiBmY19wcmxpX3JzcF9wYXJzZShzdHJ1Y3QgZmNfcHJsaV9zICpwcmxpLCBpbnQgbGVuKQogewogCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGZjX3BybGlfcykpCi0JCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCiAJaWYgKHBybGktPmNvbW1hbmQgIT0gRkNfRUxTX0FDQykKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAlpZiAoKHBybGktPnBhcmFtcGFnZS5yc3Bjb2RlICE9IEZDX1BSTElfQUNDX1hRVEQpCiAJICAgICYmIChwcmxpLT5wYXJhbXBhZ2UucnNwY29kZSAhPSBGQ19QUkxJX0FDQ19QUkVERUZfSU1HKSkKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAlpZiAocHJsaS0+cGFyYW1wYWdlLnNlcnZwYXJhbXMudGFyZ2V0ICE9IDEpCi0JCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCi0JcmV0dXJuIChGQ19QQVJTRV9PSyk7CisJcmV0dXJuIEZDX1BBUlNFX09LOwogfQogCiBlbnVtIGZjX3BhcnNlX3N0YXR1cwogZmNfcHJsaV9wYXJzZShzdHJ1Y3QgZmNfcHJsaV9zICpwcmxpKQogewogCWlmIChwcmxpLT5wYXJhbXBhZ2UudHlwZSAhPSBGQ19UWVBFX0ZDUCkKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAlpZiAoIXBybGktPnBhcmFtcGFnZS5pbWFnZXBhaXIpCi0JCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCiAJaWYgKCFwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5pbml0aWF0b3IpCi0JCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCi0JcmV0dXJuIChGQ19QQVJTRV9PSyk7CisJcmV0dXJuIEZDX1BBUlNFX09LOwogfQogCiB1MTYKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCWxvZ28tPm5wb3J0X2lkID0gKHNfaWQpOwogCWxvZ28tPm9yaWdfcG9ydF9uYW1lID0gcG9ydF9uYW1lOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX2xvZ29fcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX2xvZ29fcyk7CiB9CiAKIHN0YXRpYyAgICAgICAgICB1MTYKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCWFkaXNjLT5vcmlnX25vZGVfbmFtZSA9IG5vZGVfbmFtZTsKIAlhZGlzYy0+bnBvcnRfaWQgPSAoc19pZCk7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfYWRpc2NfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX2FkaXNjX3MpOwogfQogCiB1MTYKQEAgLTUxMSwxNSArNTExLDE1IEBACiB7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBmY19hZGlzY19zKSkKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAlpZiAoYWRpc2MtPmVsc19jbWQuZWxzX2NvZGUgIT0gRkNfRUxTX0FDQykKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAlpZiAoIXd3bl9pc19lcXVhbChhZGlzYy0+b3JpZ19wb3J0X25hbWUsIHBvcnRfbmFtZSkpCi0JCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCi0JcmV0dXJuIChGQ19QQVJTRV9PSyk7CisJcmV0dXJuIEZDX1BBUlNFX09LOwogfQogCiBlbnVtIGZjX3BhcnNlX3N0YXR1cwpAQCAtNTI5LDE0ICs1MjksMTQgQEAKIAlzdHJ1Y3QgZmNfYWRpc2NfcyAgICAgKmFkaXNjID0gKHN0cnVjdCBmY19hZGlzY19zICopIHBsZDsKIAogCWlmIChhZGlzYy0+ZWxzX2NtZC5lbHNfY29kZSAhPSBGQ19FTFNfQUNDKQotCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCQlyZXR1cm4gRkNfUEFSU0VfRkFJTFVSRTsKIAogCWlmICgoYWRpc2MtPm5wb3J0X2lkID09IChob3N0X2RhcCkpCiAJICAgICYmIHd3bl9pc19lcXVhbChhZGlzYy0+b3JpZ19wb3J0X25hbWUsIHBvcnRfbmFtZSkKIAkgICAgJiYgd3duX2lzX2VxdWFsKGFkaXNjLT5vcmlnX25vZGVfbmFtZSwgbm9kZV9uYW1lKSkKLQkJcmV0dXJuIChGQ19QQVJTRV9PSyk7CisJCXJldHVybiBGQ19QQVJTRV9PSzsKIAotCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiB9CiAKIGVudW0gZmNfcGFyc2Vfc3RhdHVzCkBAIC01NTAsMTMgKzU1MCwxMyBAQAogCWlmICgoYmZhX29zX250b2hzKHBkaXNjLT5jbGFzczMucnhzeikgPAogCQkgKEZDX01JTl9QRFVTWiAtIHNpemVvZihzdHJ1Y3QgZmNoc19zKSkpCiAJICAgIHx8IChwZGlzYy0+Y2xhc3MzLnJ4c3ogPT0gMCkpCi0JCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCiAJaWYgKCF3d25faXNfZXF1YWwocGRpc2MtPnBvcnRfbmFtZSwgcG9ydF9uYW1lKSkKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAlpZiAoIXd3bl9pc19lcXVhbChwZGlzYy0+bm9kZV9uYW1lLCBub2RlX25hbWUpKQotCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCQlyZXR1cm4gRkNfUEFSU0VfRkFJTFVSRTsKIAogCXJldHVybiBGQ19QQVJTRV9PSzsKIH0KQEAgLTU3MCw3ICs1NzAsNyBAQAogCWZjaHMtPnNfaWQgPSAoc19pZCk7CiAJZmNocy0+b3hfaWQgPSBiZmFfb3NfaHRvbnMob3hfaWQpOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjaHNfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjaHNfcyk7CiB9CiAKIGVudW0gZmNfcGFyc2Vfc3RhdHVzCkBAIC01NzgsOSArNTc4LDkgQEAKIHsKIAlpZiAoKGZjaHMtPmNhdF9pbmZvID09IEZDX0NBVF9CQV9BQ0MpCiAJICAgIHx8IChmY2hzLT5jYXRfaW5mbyA9PSBGQ19DQVRfQkFfUkpUKSkKLQkJcmV0dXJuIChGQ19QQVJTRV9PSyk7CisJCXJldHVybiBGQ19QQVJTRV9PSzsKIAotCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiB9CiAKIHUxNgpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJcnJxLT5veF9pZCA9IGJmYV9vc19odG9ucyhycnFfb3hpZCk7CiAJcnJxLT5yeF9pZCA9IEZDX1JYSURfQU5ZOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3JycV9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcnJxX3MpOwogfQogCiB1MTYKQEAgLTYxMSw3ICs2MTEsNyBAQAogCW1lbXNldChhY2MsIDAsIHNpemVvZihzdHJ1Y3QgZmNfZWxzX2NtZF9zKSk7CiAJYWNjLT5lbHNfY29kZSA9IEZDX0VMU19BQ0M7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfZWxzX2NtZF9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfZWxzX2NtZF9zKTsKIH0KIAogdTE2CkBAIC02MjcsNyArNjI3LDcgQEAKIAlsc19yanQtPnJlYXNvbl9jb2RlX2V4cGwgPSByZWFzb25fY29kZV9leHBsOwogCWxzX3JqdC0+dmVuZG9yX3VuaXF1ZSA9IDB4MDA7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfbHNfcmp0X3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19sc19yanRfcyk7CiB9CiAKIHUxNgpAQCAtNjQzLDcgKzY0Myw3IEBACiAJYmFfYWNjLT5veF9pZCA9IGZjaHMtPm94X2lkOwogCWJhX2FjYy0+cnhfaWQgPSBmY2hzLT5yeF9pZDsKIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19iYV9hY2NfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX2JhX2FjY19zKTsKIH0KIAogdTE2CkBAIC02NTQsNyArNjU0LDcgQEAKIAltZW1zZXQoZWxzX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBmY19lbHNfY21kX3MpKTsKIAllbHNfY21kLT5lbHNfY29kZSA9IEZDX0VMU19BQ0M7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfZWxzX2NtZF9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfZWxzX2NtZF9zKTsKIH0KIAogaW50CkBAIC02OTYsNyArNjk2LDcgQEAKIAkJdHBybG9fYWNjLT50cHJsb19hY2NfcGFyYW1zW3BhZ2VdLm9yaWdfcHJvY2Vzc19hc3NjID0gMDsKIAkJdHBybG9fYWNjLT50cHJsb19hY2NfcGFyYW1zW3BhZ2VdLnJlc3BfcHJvY2Vzc19hc3NjID0gMDsKIAl9Ci0JcmV0dXJuIChiZmFfb3NfbnRvaHModHBybG9fYWNjLT5wYXlsb2FkX2xlbikpOworCXJldHVybiBiZmFfb3NfbnRvaHModHBybG9fYWNjLT5wYXlsb2FkX2xlbik7CiB9CiAKIHUxNgpAQCAtNzIxLDcgKzcyMSw3IEBACiAJCXBybG9fYWNjLT5wcmxvX2FjY19wYXJhbXNbcGFnZV0ucmVzcF9wcm9jZXNzX2Fzc2MgPSAwOwogCX0KIAotCXJldHVybiAoYmZhX29zX250b2hzKHBybG9fYWNjLT5wYXlsb2FkX2xlbikpOworCXJldHVybiBiZmFfb3NfbnRvaHMocHJsb19hY2MtPnBheWxvYWRfbGVuKTsKIH0KIAogdTE2CkBAIC03MzUsNyArNzM1LDcgQEAKIAlybmlkLT5lbHNfY21kLmVsc19jb2RlID0gRkNfRUxTX1JOSUQ7CiAJcm5pZC0+bm9kZV9pZF9kYXRhX2Zvcm1hdCA9IGRhdGFfZm9ybWF0OwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3JuaWRfY21kX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19ybmlkX2NtZF9zKTsKIH0KIAogdTE2CkBAIC03NTksMTAgKzc1OSwxMCBAQAogCQlybmlkX2FjYy0+c3BlY2lmaWNfaWRfZGF0YV9sZW5ndGggPQogCQkJc2l6ZW9mKHN0cnVjdCBmY19ybmlkX2dlbmVyYWxfdG9wb2xvZ3lfZGF0YV9zKTsKIAkJYmZhX29zX2Fzc2lnbihybmlkX2FjYy0+Z2VuX3RvcG9sb2d5X2RhdGEsICpnZW5fdG9wb19kYXRhKTsKLQkJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3JuaWRfYWNjX3MpKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcm5pZF9hY2Nfcyk7CiAJfSBlbHNlIHsKLQkJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3JuaWRfYWNjX3MpIC0KLQkJCXNpemVvZihzdHJ1Y3QgZmNfcm5pZF9nZW5lcmFsX3RvcG9sb2d5X2RhdGFfcykpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19ybmlkX2FjY19zKSAtCisJCQlzaXplb2Yoc3RydWN0IGZjX3JuaWRfZ2VuZXJhbF90b3BvbG9neV9kYXRhX3MpOwogCX0KIAogfQpAQCAtNzc2LDcgKzc3Niw3IEBACiAJbWVtc2V0KHJwc2MsIDAsIHNpemVvZihzdHJ1Y3QgZmNfcnBzY19jbWRfcykpOwogCiAJcnBzYy0+ZWxzX2NtZC5lbHNfY29kZSA9IEZDX0VMU19SUFNDOwotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19ycHNjX2NtZF9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcnBzY19jbWRfcyk7CiB9CiAKIHUxNgpAQCAtNzk3LDggKzc5Nyw4IEBACiAJZm9yIChpID0gMDsgaSA8IG5waWRzOyBpKyspCiAJCXJwc2MyLT5waWRfbGlzdFtpXS5waWQgPSBwaWRfbGlzdFtpXTsKIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19ycHNjMl9jbWRfcykgKyAoKG5waWRzIC0gMSkgKgotCQkJKHNpemVvZih1MzIpKSkpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX3Jwc2MyX2NtZF9zKSArICgobnBpZHMgLSAxKSAqCisJCQkoc2l6ZW9mKHUzMikpKTsKIH0KIAogdTE2CkBAIC04MTksNyArODE5LDcgQEAKIAlycHNjX2FjYy0+c3BlZWRfaW5mb1swXS5wb3J0X29wX3NwZWVkID0KIAkJYmZhX29zX2h0b25zKG9wZXJfc3BlZWQtPnBvcnRfb3Bfc3BlZWQpOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3Jwc2NfYWNjX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19ycHNjX2FjY19zKTsKIAogfQogCkBAIC04NTYsNyArODU2LDcgQEAKIAlwZGlzYy0+cG9ydF9uYW1lID0gcG9ydF9uYW1lOwogCXBkaXNjLT5ub2RlX25hbWUgPSBub2RlX25hbWU7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKTsKIH0KIAogdTE2CkBAIC04NjUsMjEgKzg2NSwyMSBAQAogCXN0cnVjdCBmY19sb2dpX3MgICAgICpwZGlzYyA9IChzdHJ1Y3QgZmNfbG9naV9zICopIChmY2hzICsgMSk7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKQotCQlyZXR1cm4gKEZDX1BBUlNFX0xFTl9JTlZBTCk7CisJCXJldHVybiBGQ19QQVJTRV9MRU5fSU5WQUw7CiAKIAlpZiAocGRpc2MtPmVsc19jbWQuZWxzX2NvZGUgIT0gRkNfRUxTX0FDQykKLQkJcmV0dXJuIChGQ19QQVJTRV9BQ0NfSU5WQUwpOworCQlyZXR1cm4gRkNfUEFSU0VfQUNDX0lOVkFMOwogCiAJaWYgKCF3d25faXNfZXF1YWwocGRpc2MtPnBvcnRfbmFtZSwgcG9ydF9uYW1lKSkKLQkJcmV0dXJuIChGQ19QQVJTRV9QV1dOX05PVF9FUVVBTCk7CisJCXJldHVybiBGQ19QQVJTRV9QV1dOX05PVF9FUVVBTDsKIAogCWlmICghcGRpc2MtPmNsYXNzMy5jbGFzc192YWxpZCkKLQkJcmV0dXJuIChGQ19QQVJTRV9OV1dOX05PVF9FUVVBTCk7CisJCXJldHVybiBGQ19QQVJTRV9OV1dOX05PVF9FUVVBTDsKIAogCWlmIChiZmFfb3NfbnRvaHMocGRpc2MtPmNsYXNzMy5yeHN6KSA8IChGQ19NSU5fUERVU1opKQotCQlyZXR1cm4gKEZDX1BBUlNFX1JYU1pfSU5WQUwpOworCQlyZXR1cm4gRkNfUEFSU0VfUlhTWl9JTlZBTDsKIAotCXJldHVybiAoRkNfUEFSU0VfT0spOworCXJldHVybiBGQ19QQVJTRV9PSzsKIH0KIAogdTE2CkBAIC05MDMsNyArOTAzLDcgQEAKIAkJcHJsby0+cHJsb19wYXJhbXNbcGFnZV0ucmVzcF9wcm9jZXNzX2Fzc2MgPSAwOwogCX0KIAotCXJldHVybiAoYmZhX29zX250b2hzKHBybG8tPnBheWxvYWRfbGVuKSk7CisJcmV0dXJuIGJmYV9vc19udG9ocyhwcmxvLT5wYXlsb2FkX2xlbik7CiB9CiAKIHUxNgpAQCAtOTE2LDcgKzkxNiw3IEBACiAJbGVuID0gbGVuOwogCiAJaWYgKHBybG8tPmNvbW1hbmQgIT0gRkNfRUxTX0FDQykKLQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CiAKIAludW1fcGFnZXMgPSAoKGJmYV9vc19udG9ocyhwcmxvLT5wYXlsb2FkX2xlbikpIC0gNCkgLyAxNjsKIApAQCAtOTM2LDcgKzkzNiw3IEBACiAJCWlmIChwcmxvLT5wcmxvX2FjY19wYXJhbXNbcGFnZV0ucmVzcF9wcm9jZXNzX2Fzc2MgIT0gMCkKIAkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOwogCX0KLQlyZXR1cm4gKEZDX1BBUlNFX09LKTsKKwlyZXR1cm4gRkNfUEFSU0VfT0s7CiAKIH0KIApAQCAtOTY4LDcgKzk2OCw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gKGJmYV9vc19udG9ocyh0cHJsby0+cGF5bG9hZF9sZW4pKTsKKwlyZXR1cm4gYmZhX29zX250b2hzKHRwcmxvLT5wYXlsb2FkX2xlbik7CiB9CiAKIHUxNgpAQCAtOTgxLDIzICs5ODEsMjMgQEAKIAlsZW4gPSBsZW47CiAKIAlpZiAodHBybG8tPmNvbW1hbmQgIT0gRkNfRUxTX0FDQykKLQkJcmV0dXJuIChGQ19QQVJTRV9BQ0NfSU5WQUwpOworCQlyZXR1cm4gRkNfUEFSU0VfQUNDX0lOVkFMOwogCiAJbnVtX3BhZ2VzID0gKGJmYV9vc19udG9ocyh0cHJsby0+cGF5bG9hZF9sZW4pIC0gNCkgLyAxNjsKIAogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBudW1fcGFnZXM7IHBhZ2UrKykgewogCQlpZiAodHBybG8tPnRwcmxvX2FjY19wYXJhbXNbcGFnZV0udHlwZSAhPSBGQ19UWVBFX0ZDUCkKLQkJCXJldHVybiAoRkNfUEFSU0VfTk9UX0ZDUCk7CisJCQlyZXR1cm4gRkNfUEFSU0VfTk9UX0ZDUDsKIAkJaWYgKHRwcmxvLT50cHJsb19hY2NfcGFyYW1zW3BhZ2VdLm9wYV92YWxpZCAhPSAwKQotCQkJcmV0dXJuIChGQ19QQVJTRV9PUEFGTEFHX0lOVkFMKTsKKwkJCXJldHVybiBGQ19QQVJTRV9PUEFGTEFHX0lOVkFMOwogCQlpZiAodHBybG8tPnRwcmxvX2FjY19wYXJhbXNbcGFnZV0ucnBhX3ZhbGlkICE9IDApCi0JCQlyZXR1cm4gKEZDX1BBUlNFX1JQQUZMQUdfSU5WQUwpOworCQkJcmV0dXJuIEZDX1BBUlNFX1JQQUZMQUdfSU5WQUw7CiAJCWlmICh0cHJsby0+dHBybG9fYWNjX3BhcmFtc1twYWdlXS5vcmlnX3Byb2Nlc3NfYXNzYyAhPSAwKQotCQkJcmV0dXJuIChGQ19QQVJTRV9PUEFfSU5WQUwpOworCQkJcmV0dXJuIEZDX1BBUlNFX09QQV9JTlZBTDsKIAkJaWYgKHRwcmxvLT50cHJsb19hY2NfcGFyYW1zW3BhZ2VdLnJlc3BfcHJvY2Vzc19hc3NjICE9IDApCi0JCQlyZXR1cm4gKEZDX1BBUlNFX1JQQV9JTlZBTCk7CisJCQlyZXR1cm4gRkNfUEFSU0VfUlBBX0lOVkFMOwogCX0KLQlyZXR1cm4gKEZDX1BBUlNFX09LKTsKKwlyZXR1cm4gRkNfUEFSU0VfT0s7CiB9CiAKIGVudW0gZmNfcGFyc2Vfc3RhdHVzCkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogCWZjaHMtPmNhdF9pbmZvID0gRkNfQ0FUX0JBX1JKVDsKIAliYV9yanQtPnJlYXNvbl9jb2RlID0gcmVhc29uX2NvZGU7CiAJYmFfcmp0LT5yZWFzb25fZXhwbCA9IHJlYXNvbl9leHBsOwotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19iYV9yanRfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX2JhX3JqdF9zKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwNzMsNyArMTA3Myw3IEBACiAKIAliZmFfb3NfbWVtc2V0KGdpZHBuLCAwLCBzaXplb2Yoc3RydWN0IGZjZ3NfZ2lkcG5fcmVxX3MpKTsKIAlnaWRwbi0+cG9ydF9uYW1lID0gcG9ydF9uYW1lOwotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY2dzX2dpZHBuX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY2dzX2dpZHBuX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpOwogfQogCiB1MTYKQEAgLTEwOTAsNyArMTA5MCw3IEBACiAKIAliZmFfb3NfbWVtc2V0KGdwbmlkLCAwLCBzaXplb2YoZmNnc19ncG5pZF9yZXFfdCkpOwogCWdwbmlkLT5kYXAgPSBwb3J0X2lkOwotCXJldHVybiAoc2l6ZW9mKGZjZ3NfZ3BuaWRfcmVxX3QpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworCXJldHVybiBzaXplb2YoZmNnc19ncG5pZF9yZXFfdCkgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKTsKIH0KIAogdTE2CkBAIC0xMTA3LDcgKzExMDcsNyBAQAogCiAJYmZhX29zX21lbXNldChnbm5pZCwgMCwgc2l6ZW9mKGZjZ3NfZ25uaWRfcmVxX3QpKTsKIAlnbm5pZC0+ZGFwID0gcG9ydF9pZDsKLQlyZXR1cm4gKHNpemVvZihmY2dzX2dubmlkX3JlcV90KSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKGZjZ3NfZ25uaWRfcmVxX3QpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcyk7CiB9CiAKIHUxNgpAQCAtMTEzNyw3ICsxMTM3LDcgQEAKIAlpZiAoc2V0X2JyX3JlZykKIAkJc2NyLT52dV9yZWdfZnVuYyA9IEZDX1ZVX1NDUl9SRUdfRlVOQ19GQUJSSUNfTkFNRV9DSEFOR0U7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfc2NyX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19zY3Jfcyk7CiB9CiAKIHUxNgpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKIAlyc2NuLT5ldmVudFswXS5mb3JtYXQgPSBGQ19SU0NOX0ZPUk1BVF9QT1JUSUQ7CiAJcnNjbi0+ZXZlbnRbMF0ucG9ydGlkID0gc19pZDsKIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19yc2NuX3BsX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19yc2NuX3BsX3MpOwogfQogCiB1MTYKQEAgLTExODgsNyArMTE4OCw3IEBACiAJCXJmdGlkLT5mYzRfdHlwZVtpbmRleF0gfD0gYmZhX29zX2h0b25sKHR5cGVfdmFsdWUpOwogCX0KIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY2dzX3JmdGlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY2dzX3JmdGlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpOwogfQogCiB1MTYKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAJYmZhX29zX21lbWNweSgodm9pZCAqKXJmdGlkLT5mYzRfdHlwZSwgKHZvaWQgKilmYzRfYml0bWFwLAogCQkJKGJpdG1hcF9zaXplIDwgMzIgPyBiaXRtYXBfc2l6ZSA6IDMyKSk7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19yZnRpZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNnc19yZnRpZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKTsKIH0KIAogdTE2CkBAIC0xMjMxLDcgKzEyMzEsNyBAQAogCXJmZmlkLT5mYzRmdHJfYml0cyAgPSBmYzRfZnRyczsKIAlyZmZpZC0+ZmM0X3R5cGUJCT0gZmM0X3R5cGU7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19yZmZpZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNnc19yZmZpZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKTsKIH0KIAogdTE2CkBAIC0xMjUzLDcgKzEyNTMsNyBAQAogCXJzcG5pZC0+c3BuX2xlbiA9ICh1OCkgc3RybGVuKChjaGFyICopbmFtZSk7CiAJc3RybmNweSgoY2hhciAqKXJzcG5pZC0+c3BuLCAoY2hhciAqKW5hbWUsIHJzcG5pZC0+c3BuX2xlbik7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19yc3BuaWRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjZ3NfcnNwbmlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpOwogfQogCiB1MTYKQEAgLTEyNzUsNyArMTI3NSw3IEBACiAJZ2lkZnQtPmRvbWFpbl9pZCA9IDA7CiAJZ2lkZnQtPmFyZWFfaWQgPSAwOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjZ3NfZ2lkZnRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjZ3NfZ2lkZnRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcyk7CiB9CiAKIHUxNgpAQCAtMTI5NCw3ICsxMjk0LDcgQEAKIAlycG5pZC0+cG9ydF9pZCA9IHBvcnRfaWQ7CiAJcnBuaWQtPnBvcnRfbmFtZSA9IHBvcnRfbmFtZTsKIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY2dzX3JwbmlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY2dzX3JwbmlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpOwogfQogCiB1MTYKQEAgLTEzMTMsNyArMTMxMyw3IEBACiAJcm5uaWQtPnBvcnRfaWQgPSBwb3J0X2lkOwogCXJubmlkLT5ub2RlX25hbWUgPSBub2RlX25hbWU7CiAKLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19ybm5pZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNnc19ybm5pZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKTsKIH0KIAogdTE2CkBAIC0xMzMyLDcgKzEzMzIsNyBAQAogCXJjc2lkLT5wb3J0X2lkID0gcG9ydF9pZDsKIAlyY3NpZC0+Y29zID0gY29zOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjZ3NfcmNzaWRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGZjZ3NfcmNzaWRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcyk7CiB9CiAKIHUxNgpAQCAtMTM1MSw3ICsxMzUxLDcgQEAKIAlycHRpZC0+cG9ydF9pZCA9IHBvcnRfaWQ7CiAJcnB0aWQtPnBvcnRfdHlwZSA9IHBvcnRfdHlwZTsKIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY2dzX3JwdGlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY2dzX3JwdGlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpOwogfQogCiB1MTYKQEAgLTEzNjgsNyArMTM2OCw3IEBACiAJYmZhX29zX21lbXNldChnYW54dCwgMCwgc2l6ZW9mKHN0cnVjdCBmY2dzX2dhbnh0X3JlcV9zKSk7CiAJZ2FueHQtPnBvcnRfaWQgPSBwb3J0X2lkOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSArIHNpemVvZihzdHJ1Y3QgZmNnc19nYW54dF9yZXFfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSArIHNpemVvZihzdHJ1Y3QgZmNnc19nYW54dF9yZXFfcyk7CiB9CiAKIC8qCkBAIC0xMzg1LDcgKzEzODUsNyBAQAogCWZjX2dzX2ZjaGRyX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIDApOwogCWZjX2dzX2ZkbWlfY3RoZHJfYnVpbGQoY3RoZHIsIHNfaWQsIGNtZF9jb2RlKTsKIAotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKTsKIH0KIAogLyoKQEAgLTE0MjUsNyArMTQyNSw3IEBACiAJYmZhX29zX21lbXNldChnbWFsLCAwLCBzaXplb2YoZmNnc19nbWFsX3JlcV90KSk7CiAJZ21hbC0+d3duID0gd3duOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSArIHNpemVvZihmY2dzX2dtYWxfcmVxX3QpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykgKyBzaXplb2YoZmNnc19nbWFsX3JlcV90KTsKIH0KIAogLyoKQEAgLTE0NDUsNSArMTQ0NSw1IEBACiAJYmZhX29zX21lbXNldChnZm4sIDAsIHNpemVvZihmY2dzX2dmbl9yZXFfdCkpOwogCWdmbi0+d3duID0gd3duOwogCi0JcmV0dXJuIChzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSArIHNpemVvZihmY2dzX2dmbl9yZXFfdCkpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSArIHNpemVvZihmY2dzX2dmbl9yZXFfdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2ZjYnVpbGQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5oCmluZGV4IDRkMjQ4NDIuLjhmYTdmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5oCkBAIC0zMiw4ICszMiw4IEBACiAgKiBVdGlsaXR5IE1hY3Jvcy9mdW5jdGlvbnMKICAqLwogCi0jZGVmaW5lIGZjaWZfc29mX3NldChfaWZoZHIsIF9zb2YpCShfaWZoZHIpLT5zb2YgPSBGQ18gIyMgX3NvZgotI2RlZmluZSBmY2lmX2VvZl9zZXQoX2lmaGRyLCBfZW9mKQkoX2lmaGRyKS0+ZW9mID0gRkNfICMjIF9lb2YKKyNkZWZpbmUgZmNpZl9zb2Zfc2V0KF9pZmhkciwgX3NvZikJKChfaWZoZHIpLT5zb2YgPSBGQ18gIyMgX3NvZikKKyNkZWZpbmUgZmNpZl9lb2Zfc2V0KF9pZmhkciwgX2VvZikJKChfaWZoZHIpLT5lb2YgPSBGQ18gIyMgX2VvZikKIAogI2RlZmluZSB3d25faXNfZXF1YWwoX3d3bjEsIF93d24yKQkJXAogCShtZW1jbXAoJihfd3duMSksICYoX3d3bjIpLCBzaXplb2Yod3duX3QpKSA9PSAwKQpAQCAtNDksNyArNDksNyBAQAogc3RhdGljIGlubGluZSAgIHUzMgogZmNfZ2V0X2N0cmVzcF9weWxkX2xlbih1MzIgcmVzcF9sZW4pCiB7Ci0JcmV0dXJuIChyZXNwX2xlbiAtIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKKwlyZXR1cm4gcmVzcF9sZW4gLSBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmNwaW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNwaW0uYwppbmRleCA4Y2U1ZDg5My4uMWYzYzA2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9mY3BpbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNwaW0uYwpAQCAtMjg2LDExICsyODYsMTAgQEAKIAkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9oY2Jfb2ZmbGluZSk7CiAJCWJmYV9mY2JfaXRuaW1fb2ZmbGluZShpdG5pbS0+aXRuaW1fZHJ2KTsKIAkJYmZhX2l0bmltX29mZmxpbmUoaXRuaW0tPmJmYV9pdG5pbSk7Ci0JCWlmIChiZmFfZmNzX3BvcnRfaXNfb25saW5lKGl0bmltLT5ycG9ydC0+cG9ydCkgPT0gQkZBX1RSVUUpIHsKKwkJaWYgKGJmYV9mY3NfcG9ydF9pc19vbmxpbmUoaXRuaW0tPnJwb3J0LT5wb3J0KSA9PSBCRkFfVFJVRSkKIAkJCWJmYV9mY3NfaXRuaW1fYWVuX3Bvc3QoaXRuaW0sIEJGQV9JVE5JTV9BRU5fRElTQ09OTkVDVCk7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCWJmYV9mY3NfaXRuaW1fYWVuX3Bvc3QoaXRuaW0sIEJGQV9JVE5JTV9BRU5fT0ZGTElORSk7Ci0JCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1NfSVROSU1fU01fREVMRVRFOgpAQCAtNzMyLDcgKzczMSw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJYmZhX2Fzc2VydChycG9ydC0+aXRuaW0gIT0gTlVMTCk7Ci0JcmV0dXJuIChycG9ydC0+aXRuaW0pOworCXJldHVybiBycG9ydC0+aXRuaW07CiB9CiAKIGJmYV9zdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzLmgKaW5kZXggZGVlZTY4NS4uOGQwODIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9mY3MuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2Zjcy5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaWZuZGVmIF9fRkNTX0hfXwogI2RlZmluZSBfX0ZDU19IX18KIAotI2RlZmluZSBfX2Zjc19taW5fY2ZnKF9fZmNzKSAgICAgICAoX19mY3MpLT5taW5fY2ZnCisjZGVmaW5lIF9fZmNzX21pbl9jZmcoX19mY3MpICAgICAgICgoX19mY3MpLT5taW5fY2ZnKQogCiB2b2lkIGJmYV9mY3NfbW9kZXhpdF9jb21wKHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmRtaS5jIGIvZHJpdmVycy9zY3NpL2JmYS9mZG1pLmMKaW5kZXggYjg0NWViMi4uZGYyYTFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9mZG1pLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mZG1pLmMKQEAgLTcyLDkgKzcyLDkgQEAKIAkJCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLCB1OCAqcHlsZCk7CiBzdGF0aWMgdTE2IGJmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3BvcnRhdHRyX2Jsb2NrKAogCQkJc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksIHU4ICpweWxkKTsKLXZvaWQgYmZhX2Zjc19mZG1pX2dldF9oYmFhdHRyKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorc3RhdGljIHZvaWQgYmZhX2Zjc19mZG1pX2dldF9oYmFhdHRyKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAogCQkJc3RydWN0IGJmYV9mY3NfZmRtaV9oYmFfYXR0cl9zICpoYmFfYXR0cik7Ci12b2lkIGJmYV9mY3NfZmRtaV9nZXRfcG9ydGF0dHIoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCitzdGF0aWMgdm9pZCBiZmFfZmNzX2ZkbWlfZ2V0X3BvcnRhdHRyKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAogCQkJc3RydWN0IGJmYV9mY3NfZmRtaV9wb3J0X2F0dHJfcyAqcG9ydF9hdHRyKTsKIC8qKgogICogIGZjc19mZG1pX3NtIEZDUyBGRE1JIHN0YXRlIG1hY2hpbmUKQEAgLTEwOTEsNyArMTA5MSw3IEBACiAJYmZhX3NtX3NlbmRfZXZlbnQoZmRtaSwgRkRNSVNNX0VWRU5UX1RJTUVPVVQpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYmZhX2Zjc19mZG1pX2dldF9oYmFhdHRyKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAogCQkJIHN0cnVjdCBiZmFfZmNzX2ZkbWlfaGJhX2F0dHJfcyAqaGJhX2F0dHIpCiB7CkBAIC0xMTQ1LDcgKzExNDUsNyBAQAogCiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBiZmFfZmNzX2ZkbWlfZ2V0X3BvcnRhdHRyKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAogCQkJICBzdHJ1Y3QgYmZhX2Zjc19mZG1pX3BvcnRfYXR0cl9zICpwb3J0X2F0dHIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW4uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbi5oCmluZGV4IGRhOGNhYzAuLmQ5Y2JjMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbi5oCkBAIC01NCw3ICs1NCw3IEBACiBzdGF0aWMgaW5saW5lIHMzMgogYmZhX2Flbl9nZXRfbWVtaW5mbyh2b2lkKQogewotCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBiZmFfYWVuX2VudHJ5X3MpICogYmZhX2Flbl9nZXRfbWF4X2NmZ19lbnRyeSgpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBiZmFfYWVuX2VudHJ5X3MpICogYmZhX2Flbl9nZXRfbWF4X2NmZ19lbnRyeSgpOwogfQogCiBzdGF0aWMgaW5saW5lIHMzMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYS5oCmluZGV4IDY0YzE0MTIuLmQ0YmMwZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmEuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZhLmgKQEAgLTc2LDExICs3NiwxMSBAQAogCXN0cnVjdCBiZmFfbWVtX2VsZW1fcyBtZW1pbmZvW0JGQV9NRU1fVFlQRV9NQVhdOwogfTsKICNkZWZpbmUgYmZhX21lbWluZm9fa3ZhKF9tKQlcCi0JKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfS1ZBIC0gMV0ua3ZhX2N1cnAKKwkoKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfS1ZBIC0gMV0ua3ZhX2N1cnApCiAjZGVmaW5lIGJmYV9tZW1pbmZvX2RtYV92aXJ0KF9tKQlcCi0JKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0ua3ZhX2N1cnAKKwkoKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0ua3ZhX2N1cnApCiAjZGVmaW5lIGJmYV9tZW1pbmZvX2RtYV9waHlzKF9tKQlcCi0JKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0uZG1hX2N1cnAKKwkoKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0uZG1hX2N1cnApCiAKIC8qKgogICogR2VuZXJpYyBTY2F0dGVyIEdhdGhlciBFbGVtZW50IHVzZWQgYnkgZHJpdmVyCkBAIC0xMDAsNyArMTAwLDcgQEAKIC8qCiAgKiBiZmEgc3RhdHMgaW50ZXJmYWNlcwogICovCi0jZGVmaW5lIGJmYV9zdGF0cyhfbW9kLCBfc3RhdHMpCShfbW9kKS0+c3RhdHMuX3N0YXRzICsrCisjZGVmaW5lIGJmYV9zdGF0cyhfbW9kLCBfc3RhdHMpCSgoX21vZCktPnN0YXRzLl9zdGF0cysrKQogCiAjZGVmaW5lIGJmYV9pb2NfZ2V0X3N0YXRzKF9fYmZhLCBfX2lvY19zdGF0cykJXAogCWJmYV9pb2NfZmV0Y2hfc3RhdHMoJihfX2JmYSktPmlvYywgX19pb2Nfc3RhdHMpCkBAIC0xMzYsNyArMTM2LDcgQEAKIHZvaWQgYmZhX2lzcl9kaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX21zaXhfZ2V0dmVjcyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICptc2l4X3ZlY3NfYm1hcCwKIAkJCXUzMiAqbnVtX3ZlY3MsIHUzMiAqbWF4X3ZlY19iaXQpOwotI2RlZmluZSBiZmFfbXNpeChfX2JmYSwgX192ZWMpIChfX2JmYSktPm1zaXguaGFuZGxlcltfX3ZlY10oX19iZmEsIF9fdmVjKQorI2RlZmluZSBiZmFfbXNpeChfX2JmYSwgX192ZWMpICgoX19iZmEpLT5tc2l4LmhhbmRsZXJbX192ZWNdKF9fYmZhLCBfX3ZlYykpCiAKIHZvaWQgYmZhX2NvbXBfZGVxKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wX3EpOwogdm9pZCBiZmFfY29tcF9wcm9jZXNzKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wX3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9zdmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfc3ZjLmgKaW5kZXggMGM4MGI3NC4uMjY4ZDk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9zdmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZhX3N2Yy5oCkBAIC0zNCwxMCArMzQsMTAgQEAKICAqLwogc3RydWN0IGJmYV9ycG9ydF9pbmZvX3MgewogCXUxNiAgICAgICAgbWF4X2ZybXN6OwkvKiAgbWF4IHJjdiBwZHUgc2l6ZSAgICAgICAgICAgICAgICovCi0JdTMyICAgICAgICBwaWQgOiAyNCwJLyogIHJlbW90ZSBwb3J0IElEICAgICAgICAgICAgICAgICAqLwotCQkJbHBfdGFnIDogODsKLQl1MzIgICAgICAgIGxvY2FsX3BpZCA6IDI0LAkvKiAgbG9jYWwgcG9ydCBJRAkJICAgICovCi0JCQljaXNjIDogODsJLyogIENJUk8gc3VwcG9ydGVkCQkgICAgKi8KKwl1MzIgICAgICAgIHBpZDoyNCwJCS8qICByZW1vdGUgcG9ydCBJRCAgICAgICAgICAgICAgICAgKi8KKwkJCWxwX3RhZzo4OworCXUzMiAgICAgICAgbG9jYWxfcGlkOjI0LAkvKiAgbG9jYWwgcG9ydCBJRAkJICAgICovCisJCQljaXNjOjg7CQkvKiAgQ0lSTyBzdXBwb3J0ZWQJCSAgICAqLwogCXU4ICAgICAgICAgZmNfY2xhc3M7CS8qICBzdXBwb3J0ZWQgRkMgY2xhc3Nlcy4gZW51bSBmY19jb3MgKi8KIAl1OCAgICAgICAgIHZmX2VuOwkJLyogIHZpcnR1YWwgZmFicmljIGVuYWJsZSAgICAgICAgICAqLwogCXUxNiAgICAgICAgdmZfaWQ7CQkvKiAgdmlydHVhbCBmYWJyaWMgSUQgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmkuaAppbmRleCA2Y2FkZmUwLi43MDQyYzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpLmgKQEAgLTkzLDEzICs5MywxMyBAQAogICovCiBzdHJ1Y3QgYmZpX3NnZV9zIHsKICNpZmRlZiBfX0JJR0VORElBTgotCXUzMiAgICAgICAgZmxhZ3MJOiAyLAotCQkJcnN2ZAk6IDIsCi0JCQlzZ19sZW4JOiAyODsKKwl1MzIgICAgICAgIGZsYWdzOjIsCisJCQlyc3ZkOjIsCisJCQlzZ19sZW46Mjg7CiAjZWxzZQotCXUzMiAgICAgICAgc2dfbGVuCTogMjgsCi0JCQlyc3ZkCTogMiwKLQkJCWZsYWdzCTogMjsKKwl1MzIgICAgICAgIHNnX2xlbjoyOCwKKwkJCXJzdmQ6MiwKKwkJCWZsYWdzOjI7CiAjZW5kaWYKIAl1bmlvbiBiZmlfYWRkcl91IHNnYTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9pb2MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2lvYy5oCmluZGV4IDAyNmU5YzAuLjk2ZWYwNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2lvYy5oCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlCRklfQURBUFRFUl9VTlNVUFAgICAgPSAweDQwMDAwMCwJLyogIHVua25vd24gYWRhcHRlciB0eXBlICAqLwogfTsKIAotI2RlZmluZSBCRklfQURBUFRFUl9HRVRQKF9fcHJvcCxfX2FkYXBfcHJvcCkgICAgICAgICAgCQlcCisjZGVmaW5lIEJGSV9BREFQVEVSX0dFVFAoX19wcm9wLCBfX2FkYXBfcHJvcCkgICAgICAgICAgCQlcCiAgICAgKCgoX19hZGFwX3Byb3ApICYgQkZJX0FEQVBURVJfICMjIF9fcHJvcCAjIyBfTUspID4+ICAgICAgICAgXAogICAgICBCRklfQURBUFRFUl8gIyMgX19wcm9wICMjIF9TSCkKICNkZWZpbmUgQkZJX0FEQVBURVJfU0VUUChfX3Byb3AsIF9fdmFsKSAgICAgICAgIAkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfbHBzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9scHMuaAppbmRleCA0MTRiMGUzLi5jNTlkNDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9scHMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9scHMuaApAQCAtNTUsOCArNTUsOCBAQAogCXUxNgliYl9jcmVkaXQ7CiAJdTgJCWZfcG9ydDsKIAl1OAkJbnBpdl9lbjsKLQl1MzIJbHBfcGlkIDogMjQ7Ci0JdTMyCWF1dGhfcmVxIDogODsKKwl1MzIJbHBfcGlkOjI0OworCXUzMglhdXRoX3JlcTo4OwogCW1hY190CQlscF9tYWM7CiAJbWFjX3QJCWZjZl9tYWM7CiAJdTgJCWV4dF9zdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9ycG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfcnBvcnQuaAppbmRleCAzNTIwZjU1Li5lMWNkODNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9ycG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3Jwb3J0LmgKQEAgLTM4LDEwICszOCwxMCBAQAogCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KIAl1MTYgICAgICAgIGJmYV9oYW5kbGU7CS8qICBob3N0IHJwb3J0IGhhbmRsZQkJKi8KIAl1MTYgICAgICAgIG1heF9mcm1zejsJLyogIG1heCByY3YgcGR1IHNpemUJCSovCi0JdTMyICAgICAgICBwaWQgICAgICAgOiAyNCwJLyogIHJlbW90ZSBwb3J0IElECQkqLwotCQkJbHBfdGFnICAgIDogODsJLyogIGxvY2FsIHBvcnQgdGFnCQkqLwotCXUzMiAgICAgICAgbG9jYWxfcGlkIDogMjQsCS8qICBsb2NhbCBwb3J0IElECQkqLwotCQkJY2lzYyAgICAgIDogODsKKwl1MzIgICAgICAgIHBpZDoyNCwJCS8qICByZW1vdGUgcG9ydCBJRAkJKi8KKwkJCWxwX3RhZzo4OwkvKiAgbG9jYWwgcG9ydCB0YWcJCSovCisJdTMyICAgICAgICBsb2NhbF9waWQ6MjQsCS8qICBsb2NhbCBwb3J0IElECQkqLworCQkJY2lzYzo4OwogCXU4ICAgICAgICAgZmNfY2xhc3M7CS8qICBzdXBwb3J0ZWQgRkMgY2xhc3NlcwkqLwogCXU4ICAgICAgICAgdmZfZW47CQkvKiAgdmlydHVhbCBmYWJyaWMgZW5hYmxlCSovCiAJdTE2ICAgICAgICB2Zl9pZDsJCS8qICB2aXJ0dWFsIGZhYnJpYyBJRAkJKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfY2hlY2tzdW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfY2hlY2tzdW0uaAppbmRleCBhZjhjMWQ1Li42NTBmOGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX2NoZWNrc3VtLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9jaGVja3N1bS5oCkBAIC0zMSw3ICszMSw3IEBACiAJZm9yIChpID0gMDsgaSA8IG07IGkrKykKIAkJc3VtIF49IGJ1ZltpXTsKIAotCXJldHVybiAoc3VtKTsKKwlyZXR1cm4gc3VtOwogfQogCiBzdGF0aWMgaW5saW5lIHUxNgpAQCAtNDMsNyArNDMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspCiAJCXN1bSBePSBidWZbaV07CiAKLQlyZXR1cm4gKHN1bSk7CisJcmV0dXJuIHN1bTsKIH0KIAogc3RhdGljIGlubGluZSB1OApAQCAtNTUsNiArNTUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBzejsgaSsrKQogCQlzdW0gXj0gYnVmW2ldOwogCi0JcmV0dXJuIChzdW0pOworCXJldHVybiBzdW07CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfc20uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfc20uaAppbmRleCA5ODc3MDY2Li5iMGE5MmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX3NtLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9zbS5oCkBAIC0yNCw4ICsyNCw4IEBACiAKIHR5cGVkZWYgdm9pZCAoKmJmYV9zbV90KSh2b2lkICpzbSwgaW50IGV2ZW50KTsKIAotI2RlZmluZSBiZmFfc21fc2V0X3N0YXRlKF9zbSwgX3N0YXRlKQkoX3NtKS0+c20gPSAoYmZhX3NtX3QpKF9zdGF0ZSkKLSNkZWZpbmUgYmZhX3NtX3NlbmRfZXZlbnQoX3NtLCBfZXZlbnQpCShfc20pLT5zbSgoX3NtKSwgKF9ldmVudCkpCisjZGVmaW5lIGJmYV9zbV9zZXRfc3RhdGUoX3NtLCBfc3RhdGUpCSgoX3NtKS0+c20gPSAoYmZhX3NtX3QpKF9zdGF0ZSkpCisjZGVmaW5lIGJmYV9zbV9zZW5kX2V2ZW50KF9zbSwgX2V2ZW50KQkoKF9zbSktPnNtKChfc20pLCAoX2V2ZW50KSkpCiAjZGVmaW5lIGJmYV9zbV9nZXRfc3RhdGUoX3NtKQkJKChfc20pLT5zbSkKICNkZWZpbmUgYmZhX3NtX2NtcF9zdGF0ZShfc20sIF9zdGF0ZSkJKChfc20pLT5zbSA9PSAoYmZhX3NtX3QpKF9zdGF0ZSkpCiAKQEAgLTYyLDcgKzYyLDcgQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgYmZhX2ZzbV9zZW5kX2V2ZW50KF9mc20sIF9ldmVudCkJXAotCShfZnNtKS0+ZnNtKChfZnNtKSwgKF9ldmVudCkpCisJKChfZnNtKS0+ZnNtKChfZnNtKSwgKF9ldmVudCkpKQogI2RlZmluZSBiZmFfZnNtX2NtcF9zdGF0ZShfZnNtLCBfc3RhdGUpCQlcCiAJKChfZnNtKS0+ZnNtID09IChiZmFfZnNtX3QpKF9zdGF0ZSkpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfdHJjLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX3RyYy5oCmluZGV4IDNlNzQzOTIuLjMxMDc3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfdHJjLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV90cmMuaApAQCAtMjQsNyArMjQsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgQkZBX1RSQ19UUwotI2RlZmluZSBCRkFfVFJDX1RTKF90cmNtKQkoKF90cmNtKS0+dGlja3MgKyspCisjZGVmaW5lIEJGQV9UUkNfVFMoX3RyY20pCSgoX3RyY20pLT50aWNrcysrKQogI2VuZGlmCiAKIHN0cnVjdCBiZmFfdHJjX3MgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcHBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3Bwb3J0LmgKaW5kZXggYTAwMGJjNC4uYmYzMjA0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcHBvcnQuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wcG9ydC5oCkBAIC02MSw3ICs2MSw3IEBACiAgKiAJCVBvcnQgb3BlcmF0aW9uYWwgdHlwZSAoaW4gc3luYyB3aXRoIFNOSUEgcG9ydCB0eXBlKS4KICAqLwogZW51bSBiZmFfcHBvcnRfdHlwZSB7Ci0JQkZBX1BQT1JUX1RZUEVfVU5LTk9XTiA9IDEsCS8qICBwb3J0IHR5cGUgaXMgdW5rb3duICovCisJQkZBX1BQT1JUX1RZUEVfVU5LTk9XTiA9IDEsCS8qICBwb3J0IHR5cGUgaXMgdW5rbm93biAqLwogCUJGQV9QUE9SVF9UWVBFX1RSVU5LRUQgPSAyLAkvKiAgVHJ1bmtlZCBtb2RlICovCiAJQkZBX1BQT1JUX1RZUEVfTlBPUlQgICA9IDUsCS8qICBQMlAgd2l0aCBzd2l0Y2hlZCBmYWJyaWMgKi8KIAlCRkFfUFBPUlRfVFlQRV9OTFBPUlQgID0gNiwJLyogIHB1YmxpYyBsb29wICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc190c2Vuc29yLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc190c2Vuc29yLmgKaW5kZXggMzE4ODFkMi4uYWRlNzYzZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3RzZW5zb3IuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc190c2Vuc29yLmgKQEAgLTI1LDcgKzI1LDcgQEAKICAqIFRlbXBlcmF0dXJlIHNlbnNvciBzdGF0dXMgdmFsdWVzCiAgKi8KIGVudW0gYmZhX3RzZW5zb3Jfc3RhdHVzIHsKLQlCRkFfVFNFTlNPUl9TVEFUVVNfVU5LTk9XTiAgID0gMSwgICAvKiAgdW5rb3duIHN0YXR1cyAqLworCUJGQV9UU0VOU09SX1NUQVRVU19VTktOT1dOICAgPSAxLCAgIC8qICB1bmtub3duIHN0YXR1cyAqLwogCUJGQV9UU0VOU09SX1NUQVRVU19GQVVMVFkgICAgPSAyLCAgIC8qICBzZW5zb3IgaXMgZmF1bHR5ICovCiAJQkZBX1RTRU5TT1JfU1RBVFVTX0JFTE9XX01JTiA9IDMsICAgLyogIHRlbXBlcmF0dXJlIGJlbG93IG1pbmludW0gKi8KIAlCRkFfVFNFTlNPUl9TVEFUVVNfTk9NSU5BTCAgID0gNCwgICAvKiAgbm9ybWFsIHRlbXBlcmF0dXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfZmFicmljLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfZmFicmljLmgKaW5kZXggNGZmZDIyNC4uMDhiNzlkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZhYnJpYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19mYWJyaWMuaApAQCAtNzUsNyArNzUsNyBAQAogCQkJCQkJCSAgICAqLwogfTsKIAotI2RlZmluZSBiZmFfZmNzX2ZhYnJpY19ucGl2X2NhcGFibGUoX19mKSAgICAoX19mKS0+aXNfbnBpdgorI2RlZmluZSBiZmFfZmNzX2ZhYnJpY19ucGl2X2NhcGFibGUoX19mKSAgICAoKF9fZiktPmlzX25waXYpCiAjZGVmaW5lIGJmYV9mY3NfZmFicmljX2lzX3N3aXRjaGVkKF9fZikJCQlcCiAJKChfX2YpLT5mYWJfdHlwZSA9PSBCRkFfRkNTX0ZBQlJJQ19TV0lUQ0hFRCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2xwb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfbHBvcnQuaAppbmRleCBiODVjYmE4Li45NjdjZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfbHBvcnQuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfbHBvcnQuaApAQCAtMTI1LDEyICsxMjUsMTIgQEAKIHN0cnVjdCBiZmFfZmNzX3BvcnRfcyB7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgIHFlOwkvKiAgdXNlZCBieSBwb3J0L3Zwb3J0ICovCiAJYmZhX3NtX3QgICAgICAgICAgICAgICBzbTsJLyogIHN0YXRlIG1hY2hpbmUgKi8KLQlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljOwkvKiAgcGFyZW50IGZhYnJpYyAqLwotCXN0cnVjdCBiZmFfcG9ydF9jZmdfcyAgcG9ydF9jZmc7CS8qICBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljOy8qICBwYXJlbnQgZmFicmljICovCisJc3RydWN0IGJmYV9wb3J0X2NmZ19zICBwb3J0X2NmZzsvKiAgcG9ydCBjb25maWd1cmF0aW9uICovCiAJc3RydWN0IGJmYV90aW1lcl9zIGxpbmtfdGltZXI7CS8qICB0aW1lciBmb3IgbGluayBvZmZsaW5lICovCi0JdTMyICAgICAgICBwaWQgOiAyNDsJLyogIEZDIGFkZHJlc3MgKi8KLQl1OCAgICAgICAgIGxwX3RhZzsJCS8qICBscG9ydCB0YWcgKi8KLQl1MTYgICAgICAgIG51bV9ycG9ydHM7CS8qICBOdW0gb2Ygci1wb3J0cyAqLworCXUzMiBwaWQ6MjQ7CS8qICBGQyBhZGRyZXNzICovCisJdTggIGxwX3RhZzsJLyogIGxwb3J0IHRhZyAqLworCXUxNiBudW1fcnBvcnRzOwkvKiAgTnVtIG9mIHItcG9ydHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJwb3J0X3E7CS8qICBxdWV1ZSBvZiBkaXNjb3ZlcmVkIHItcG9ydHMgKi8KIAlzdHJ1Y3QgYmZhX2Zjc19zICpmY3M7CS8qICBGQ1MgaW5zdGFuY2UgKi8KIAl1bmlvbiBiZmFfZmNzX3BvcnRfdG9wb191IHBvcnRfdG9wbzsJLyogIGZhYnJpYy9sb29wL24ybiBkZXRhaWxzICovCkBAIC0xODgsMTMgKzE4OCwxNCBAQAogfQogCiAKLSNkZWZpbmUgYmZhX2Zjc19wb3J0X2dldF9vcGVydHlwZShfbHBvcnQpCShfbHBvcnQpLT5mYWJyaWMtPm9wZXJfdHlwZQorI2RlZmluZSBiZmFfZmNzX3BvcnRfZ2V0X29wZXJ0eXBlKF9scG9ydCkJKChfbHBvcnQpLT5mYWJyaWMtPm9wZXJfdHlwZSkKIAogCi0jZGVmaW5lIGJmYV9mY3NfcG9ydF9nZXRfZmFicmljX25hbWUoX2xwb3J0KQkoX2xwb3J0KS0+ZmFicmljLT5mYWJyaWNfbmFtZQorI2RlZmluZSBiZmFfZmNzX3BvcnRfZ2V0X2ZhYnJpY19uYW1lKF9scG9ydCkJKChfbHBvcnQpLT5mYWJyaWMtPmZhYnJpY19uYW1lKQogCiAKLSNkZWZpbmUgYmZhX2Zjc19wb3J0X2dldF9mYWJyaWNfaXBhZGRyKF9scG9ydCkJKF9scG9ydCktPmZhYnJpYy0+ZmFicmljX2lwX2FkZHIKKyNkZWZpbmUgYmZhX2Zjc19wb3J0X2dldF9mYWJyaWNfaXBhZGRyKF9scG9ydCkgXAorCQkoKF9scG9ydCktPmZhYnJpYy0+ZmFicmljX2lwX2FkZHIpCiAKIC8qKgogICogYmZhIGZjcyBwb3J0IHB1YmxpYyBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC9jdC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2N0LmgKaW5kZXggYzU5ZDY2My4uYjgyNTQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2N0LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2N0LmgKQEAgLTgyLDcgKzgyLDcgQEAKIH07CiAKIC8qCi0gKiBkZWZpbnRpb25zIGZvciBDVCByZWFzb24gY29kZQorICogZGVmaW5pdGlvbnMgZm9yIENUIHJlYXNvbiBjb2RlCiAgKi8KIGVudW0gewogCUNUX1JTTl9JTlZfQ01ECQk9IDB4MDEsCkBAIC0xMjksNyArMTI5LDcgQEAKIH07CiAKIC8qCi0gKiBkZWZpbnRpb25zIGZvciB0aGUgZXhwbGFuYXRpb24gY29kZSBmb3IgYWxsIHNlcnZlcnMKKyAqIGRlZmluaXRpb25zIGZvciB0aGUgZXhwbGFuYXRpb24gY29kZSBmb3IgYWxsIHNlcnZlcnMKICAqLwogZW51bSB7CiAJQ1RfRVhQX0FVVEhfRVhDRVBUSU9OCQkJPSAweEYxLApAQCAtMTkzLDExICsxOTMsMTEgQEAKICNkZWZpbmUgRkNfR1NfRkNQX0ZDNF9GRUFUVVJFX1RBUkdFVAkgMHgwMQogCiBzdHJ1Y3QgZmNnc19yZmZpZF9yZXFfc3sKLSAgICB1MzIgICAgcnN2ZCAgICAgICAgICA6ODsKLSAgICB1MzIgICAgZGFwICAgICAgICAJICA6MjQ7CQkvKiBwb3J0IGlkZW50aWZpZXIJKi8KLSAgICB1MzIgICAgcnN2ZDEgICAgICAgICA6MTY7Ci0gICAgdTMyICAgIGZjNGZ0cl9iaXRzICAgOjg7CQkvKiBmYzQgZmVhdHVyZSBiaXRzCSovCi0gICAgdTMyICAgIGZjNF90eXBlICAgICAgOjg7CQkvKiBjb3JyZXNwb25kaW5nIEZDNCBUeXBlICovCisgICAgdTMyICAgIHJzdmQ6ODsKKyAgICB1MzIgICAgZGFwOjI0OwkJLyogcG9ydCBpZGVudGlmaWVyCSovCisgICAgdTMyICAgIHJzdmQxOjE2OworICAgIHUzMiAgICBmYzRmdHJfYml0czo4OwkvKiBmYzQgZmVhdHVyZSBiaXRzCSovCisgICAgdTMyICAgIGZjNF90eXBlOjg7CS8qIGNvcnJlc3BvbmRpbmcgRkM0IFR5cGUgKi8KIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZjLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmMuaAppbmRleCAzZTM5YmE1Li4xNDk2OWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmMuaApAQCAtNDg2LDE0ICs0ODYsMTQgQEAKICAqIHNlZSBGQy1QSC1YIHRhYmxlIDExMyAmIDExNSBmb3IgZXhwbGFuYXRpb24gYWxzbyBGQ1AgdGFibGUgOAogICovCiBzdHJ1Y3QgZmNfcHJsaV9wYXJhbXNfc3sKLQl1MzIgICAgICAgIHJlc2VydmVkOiAxNjsKKwl1MzIgICAgICAgIHJlc2VydmVkOjE2OwogI2lmZGVmIF9fQklHRU5ESUFOCi0JdTMyICAgICAgICByZXNlcnZlZDE6IDU7Ci0JdTMyICAgICAgICByZWNfc3VwcG9ydCA6IDE7Ci0JdTMyICAgICAgICB0YXNrX3JldHJ5X2lkIDogMTsKLQl1MzIgICAgICAgIHJldHJ5IDogMTsKKwl1MzIgICAgICAgIHJlc2VydmVkMTo1OworCXUzMiAgICAgICAgcmVjX3N1cHBvcnQ6MTsKKwl1MzIgICAgICAgIHRhc2tfcmV0cnlfaWQ6MTsKKwl1MzIgICAgICAgIHJldHJ5OjE7CiAKLQl1MzIgICAgICAgIGNvbmZpcm0gOiAxOworCXUzMiAgICAgICAgY29uZmlybToxOwogCXUzMiAgICAgICAgZG92ZXJsYXk6MTsKIAl1MzIgICAgICAgIGluaXRpYXRvcjoxOwogCXUzMiAgICAgICAgdGFyZ2V0OjE7CkBAIC01MDIsMTAgKzUwMiwxMCBAQAogCXUzMiAgICAgICAgcnhyZGlzYWI6MTsKIAl1MzIgICAgICAgIHd4cmRpc2FiOjE7CiAjZWxzZQotCXUzMiAgICAgICAgcmV0cnkgOiAxOwotCXUzMiAgICAgICAgdGFza19yZXRyeV9pZCA6IDE7Ci0JdTMyICAgICAgICByZWNfc3VwcG9ydCA6IDE7Ci0JdTMyICAgICAgICByZXNlcnZlZDE6IDU7CisJdTMyICAgICAgICByZXRyeToxOworCXUzMiAgICAgICAgdGFza19yZXRyeV9pZDoxOworCXUzMiAgICAgICAgcmVjX3N1cHBvcnQ6MTsKKwl1MzIgICAgICAgIHJlc2VydmVkMTo1OwogCiAJdTMyICAgICAgICB3eHJkaXNhYjoxOwogCXUzMiAgICAgICAgcnhyZGlzYWI6MTsKQEAgLTUxNCw3ICs1MTQsNyBAQAogCXUzMiAgICAgICAgdGFyZ2V0OjE7CiAJdTMyICAgICAgICBpbml0aWF0b3I6MTsKIAl1MzIgICAgICAgIGRvdmVybGF5OjE7Ci0JdTMyICAgICAgICBjb25maXJtIDogMTsKKwl1MzIgICAgICAgIGNvbmZpcm06MTsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9sb29wLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2xvb3AuYwppbmRleCBhNDE4ZGVkLi5mN2M3ZjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2xvb3AuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2xvb3AuYwpAQCAtNTgsNDkgKzU4LDE2IEBACiAvKgogICogTG9jYWwgRnVuY3Rpb25zCiAgKi8KLWJmYV9zdGF0dXNfdCAgICBiZmFfZmNzX3BvcnRfbG9vcF9zZW5kX3Bsb2dpKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKLQkJCQkJICAgICB1OCBhbHBhKTsKK3N0YXRpYyBiZmFfc3RhdHVzX3QgYmZhX2Zjc19wb3J0X2xvb3Bfc2VuZF9wbG9naShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJCXU4IGFscGEpOwogCi12b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X2xvb3BfcGxvZ2lfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAotCQkJCQkJIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAotCQkJCQkJIHZvaWQgKmNiYXJnLAotCQkJCQkJIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAotCQkJCQkJIHUzMiByc3BfbGVuLAotCQkJCQkJIHUzMiByZXNpZF9sZW4sCi0JCQkJCQkgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOwotCi1iZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19wb3J0X2xvb3Bfc2VuZF9hZGlzYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCi0JCQkJCSAgICAgdTggYWxwYSk7Ci0KLXZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfbG9vcF9hZGlzY19yZXNwb25zZSh2b2lkICpmY3NhcmcsCi0JCQkJCQkgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCi0JCQkJCQkgdm9pZCAqY2JhcmcsCi0JCQkJCQkgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCi0JCQkJCQkgdTMyIHJzcF9sZW4sCi0JCQkJCQkgdTMyIHJlc2lkX2xlbiwKLQkJCQkJCSBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7Ci0KLWJmYV9zdGF0dXNfdCAgICBiZmFfZmNzX3BvcnRfbG9vcF9zZW5kX3Bsb2dpX2FjYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCi0JCQkJCQkgdTggYWxwYSk7Ci0KLXZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfbG9vcF9wbG9naV9hY2NfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAotCQkJCQkJICAgICBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKLQkJCQkJCSAgICAgdm9pZCAqY2JhcmcsCi0JCQkJCQkgICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAotCQkJCQkJICAgICB1MzIgcnNwX2xlbiwKLQkJCQkJCSAgICAgdTMyIHJlc2lkX2xlbiwKLQkJCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOwotCi1iZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19wb3J0X2xvb3Bfc2VuZF9hZGlzY19hY2Moc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAotCQkJCQkJIHU4IGFscGEpOwotCi12b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X2xvb3BfYWRpc2NfYWNjX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywKLQkJCQkJCSAgICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCi0JCQkJCQkgICAgIHZvaWQgKmNiYXJnLAotCQkJCQkJICAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKLQkJCQkJCSAgICAgdTMyIHJzcF9sZW4sCi0JCQkJCQkgICAgIHUzMiByZXNpZF9sZW4sCi0JCQkJCQkgICAgIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKK3N0YXRpYyB2b2lkIGJmYV9mY3NfcG9ydF9sb29wX3Bsb2dpX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywKKwkJCQkJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJCXZvaWQgKmNiYXJnLAorCQkJCQliZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQkJdTMyIHJzcF9sZW4sCisJCQkJCXUzMiByZXNpZF9sZW4sCisJCQkJCXN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKIC8qKgogICogICBDYWxsZWQgYnkgcG9ydCB0byBpbml0aWFsaXphciBpbiBwcm92YXRlIExPT1AgdG9wb2xvZ3kuCiAgKi8KQEAgLTE3OSw3ICsxNDYsNyBAQAogLyoqCiAgKiBMb2NhbCBGdW5jdGlvbnMuCiAgKi8KLWJmYV9zdGF0dXNfdAorc3RhdGljIGJmYV9zdGF0dXNfdAogYmZhX2Zjc19wb3J0X2xvb3Bfc2VuZF9wbG9naShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHU4IGFscGEpCiB7CiAJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOwpAQCAtMjA4LDcgKzE3NSw3IEBACiAvKioKICAqICAgQ2FsbGVkIGJ5IGZjeHAgdG8gbm90aWZ5IHRoZSBQbG9naSByZXNwb25zZQogICovCi12b2lkCitzdGF0aWMgdm9pZAogYmZhX2Zjc19wb3J0X2xvb3BfcGxvZ2lfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKIAkJCQkgdm9pZCAqY2JhcmcsIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAogCQkJCSB1MzIgcnNwX2xlbiwgdTMyIHJlc2lkX2xlbiwKQEAgLTI0NCwxNzkgKzIxMSwzIEBACiAJCWJmYV9hc3NlcnQoMCk7CiAJfQogfQotCi1iZmFfc3RhdHVzX3QKLWJmYV9mY3NfcG9ydF9sb29wX3NlbmRfcGxvZ2lfYWNjKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgdTggYWxwYSkKLXsKLQlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7Ci0Jc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7Ci0JaW50ICAgICAgICAgICAgIGxlbjsKLQotCWJmYV90cmMocG9ydC0+ZmNzLCBhbHBhKTsKLQotCWZjeHAgPSBiZmFfZmN4cF9hbGxvYyhOVUxMLCBwb3J0LT5mY3MtPmJmYSwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgIE5VTEwpOwotCWJmYV9hc3NlcnQoZmN4cCk7Ci0KLQlsZW4gPSBmY19wbG9naV9hY2NfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksIGFscGEsCi0JCQkJIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCwKLQkJCQkgcG9ydC0+cG9ydF9jZmcucHd3biwgcG9ydC0+cG9ydF9jZmcubnd3biwKLQkJCQkgYmZhX3Bwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpKTsKLQotCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCi0JCQkJIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsCi0JCQkJIGJmYV9mY3NfcG9ydF9sb29wX3Bsb2dpX2FjY19yZXNwb25zZSwKLQkJCQkgKHZvaWQgKilwb3J0LCBGQ19NQVhfUERVU1osIDApOyAvKiBObyByZXNwb25zZQotCQkJCQkJCQkgICogZXhwZWN0ZWQKLQkJCQkJCQkJICAqLwotCi0JcmV0dXJuIEJGQV9TVEFUVVNfT0s7Ci19Ci0KLS8qCi0gKiAgUGxvZ2kgQWNjIFJlc3BvbnNlCi0gKiBXZSBkb25vdCBkbyBhbnkgcHJvY2Vzc2luZyBoZXJlLgotICovCi12b2lkCi1iZmFfZmNzX3BvcnRfbG9vcF9wbG9naV9hY2NfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKLQkJCQkgICAgIHZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKLQkJCQkgICAgIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAotCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCi17Ci0KLQlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICopIGNiYXJnOwotCi0JYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBpZCk7Ci0KLQkvKgotCSAqIFNhbml0eSBDaGVja3MKLQkgKi8KLQlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7Ci0JCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotYmZhX3N0YXR1c190Ci1iZmFfZmNzX3BvcnRfbG9vcF9zZW5kX2FkaXNjKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgdTggYWxwYSkKLXsKLQlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7Ci0Jc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7Ci0JaW50ICAgICAgICAgICAgIGxlbjsKLQotCWJmYV90cmMocG9ydC0+ZmNzLCBhbHBhKTsKLQotCWZjeHAgPSBiZmFfZmN4cF9hbGxvYyhOVUxMLCBwb3J0LT5mY3MtPmJmYSwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgIE5VTEwpOwotCWJmYV9hc3NlcnQoZmN4cCk7Ci0KLQlsZW4gPSBmY19hZGlzY19idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgYWxwYSwKLQkJCSAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCAwLAotCQkJICAgICBwb3J0LT5wb3J0X2NmZy5wd3duLCBwb3J0LT5wb3J0X2NmZy5ud3duKTsKLQotCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCi0JCQkgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsCi0JCQkgIGJmYV9mY3NfcG9ydF9sb29wX2FkaXNjX3Jlc3BvbnNlLCAodm9pZCAqKXBvcnQsCi0JCQkgIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKLQotCXJldHVybiBCRkFfU1RBVFVTX09LOwotfQotCi0vKioKLSAqICAgQ2FsbGVkIGJ5IGZjeHAgdG8gbm90aWZ5IHRoZSBBRElTQyByZXNwb25zZQotICovCi12b2lkCi1iZmFfZmNzX3BvcnRfbG9vcF9hZGlzY19yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAotCQkJCSB2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCi0JCQkJIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAotCQkJCSBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKLXsKLQlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICopIGNiYXJnOwotCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OwotCXN0cnVjdCBmY19hZGlzY19zICAgICAqYWRpc2NfcmVzcDsKLQlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgKmVsc19jbWQ7Ci0JdTMyICAgICAgICBwaWQgPSByc3BfZmNocy0+c19pZDsKLQotCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKLQotCS8qCi0JICogU2FuaXR5IENoZWNrcwotCSAqLwotCWlmIChyZXFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKLQkJLyoKLQkJICogVEJEIDogd2UgbWF5IG5lZWQgdG8gcmV0cnkgY2VydGFpbiByZXF1ZXN0cwotCQkgKi8KLQkJYmZhX2ZjeHBfZnJlZShmY3hwKTsKLQkJcmV0dXJuOwotCX0KLQotCWVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOwotCWFkaXNjX3Jlc3AgPSAoc3RydWN0IGZjX2FkaXNjX3MgKikgZWxzX2NtZDsKLQotCWlmIChlbHNfY21kLT5lbHNfY29kZSA9PSBGQ19FTFNfQUNDKSB7Ci0JfSBlbHNlIHsKLQkJYmZhX3RyYyhwb3J0LT5mY3MsIGFkaXNjX3Jlc3AtPmVsc19jbWQuZWxzX2NvZGUpOwotCi0JCS8qCi0JCSAqIFRCRDogd2UgbWF5IG5lZWQgdG8gY2hlY2sgZm9yIHJlamVjdCBjb2RlcyBhbmQgcmV0cnkKLQkJICovCi0JCXJwb3J0ID0gYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9ieV9waWQocG9ydCwgcGlkKTsKLQkJaWYgKHJwb3J0KSB7Ci0JCQlsaXN0X2RlbCgmcnBvcnQtPnFlKTsKLQkJCWJmYV9mY3NfcnBvcnRfZGVsZXRlKHJwb3J0KTsKLQkJfQotCi0JfQotCXJldHVybjsKLX0KLQotYmZhX3N0YXR1c190Ci1iZmFfZmNzX3BvcnRfbG9vcF9zZW5kX2FkaXNjX2FjYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHU4IGFscGEpCi17Ci0Jc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOwotCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOwotCWludCAgICAgICAgICAgICBsZW47Ci0KLQliZmFfdHJjKHBvcnQtPmZjcywgYWxwYSk7Ci0KLQlmY3hwID0gYmZhX2ZjeHBfYWxsb2MoTlVMTCwgcG9ydC0+ZmNzLT5iZmEsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICBOVUxMKTsKLQliZmFfYXNzZXJ0KGZjeHApOwotCi0JbGVuID0gZmNfYWRpc2NfYWNjX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBhbHBhLAotCQkJCSBiZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydCksIDAsCi0JCQkJIHBvcnQtPnBvcnRfY2ZnLnB3d24sIHBvcnQtPnBvcnRfY2ZnLm53d24pOwotCi0JYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKLQkJCQlGQ19DTEFTU18zLCBsZW4sICZmY2hzLAotCQkJCWJmYV9mY3NfcG9ydF9sb29wX2FkaXNjX2FjY19yZXNwb25zZSwKLQkJCQkodm9pZCAqKXBvcnQsIEZDX01BWF9QRFVTWiwgMCk7IC8qIG5vIHJlcG9uc2UKLQkJCQkJCQkJICogZXhwZWN0ZWQKLQkJCQkJCQkJICovCi0KLQlyZXR1cm4gQkZBX1NUQVRVU19PSzsKLX0KLQotLyoKLSAqICBBZGlzYyBBY2MgUmVzcG9uc2UKLSAqIFdlIGRvbm90IGRvIGFueSBwcm9jZXNzaW5nIGhlcmUuCi0gKi8KLXZvaWQKLWJmYV9mY3NfcG9ydF9sb29wX2FkaXNjX2FjY19yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAotCQkJCSAgICAgdm9pZCAqY2JhcmcsIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAotCQkJCSAgICAgdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCi0JCQkJICAgICBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKLXsKLQotCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKikgY2Jhcmc7Ci0KLQliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cGlkKTsKLQotCS8qCi0JICogU2FuaXR5IENoZWNrcwotCSAqLwotCWlmIChyZXFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKLQkJYmZhX3RyYyhwb3J0LT5mY3MsIHJlcV9zdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9scG9ydF9hcGkuYyBiL2RyaXZlcnMvc2NzaS9iZmEvbHBvcnRfYXBpLmMKaW5kZXggOGY1MWE4My4uMWUwNjc5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9scG9ydF9hcGkuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2xwb3J0X2FwaS5jCkBAIC00Myw3ICs0Myw3IEBACiBzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKgogYmZhX2Zjc19nZXRfYmFzZV9wb3J0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcykKIHsKLQlyZXR1cm4gKCZmY3MtPmZhYnJpYy5icG9ydCk7CisJcmV0dXJuICZmY3MtPmZhYnJpYy5icG9ydDsKIH0KIAogd3duX3QKQEAgLTg4LDExICs4OCwxMCBAQAogCX0KIAogCWJmYV90cmMoZmNzLCBpKTsKLQlpZiAocnBvcnQpIHsKKwlpZiAocnBvcnQpCiAJCXJldHVybiBycG9ydC0+cHd3bjsKLQl9IGVsc2UgeworCWVsc2UKIAkJcmV0dXJuICh3d25fdCkgMDsKLQl9CiB9CiAKIHZvaWQKQEAgLTE5OCwxNyArMTk3LDE3IEBACiAJdmYgPSBiZmFfZmNzX3ZmX2xvb2t1cChmY3MsIHZmX2lkKTsKIAlpZiAodmYgPT0gTlVMTCkgewogCQliZmFfdHJjKGZjcywgdmZfaWQpOwotCQlyZXR1cm4gKE5VTEwpOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlpZiAoIWxwd3duIHx8ICh2Zi0+YnBvcnQucG9ydF9jZmcucHd3biA9PSBscHd3bikpCi0JCXJldHVybiAoJnZmLT5icG9ydCk7CisJCXJldHVybiAmdmYtPmJwb3J0OwogCiAJdnBvcnQgPSBiZmFfZmNzX2ZhYnJpY192cG9ydF9sb29rdXAodmYsIGxwd3duKTsKIAlpZiAodnBvcnQpCi0JCXJldHVybiAoJnZwb3J0LT5scG9ydCk7CisJCXJldHVybiAmdnBvcnQtPmxwb3J0OwogCi0JcmV0dXJuIChOVUxMKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvbnMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvbnMuYwppbmRleCA1OWZlYTk5Li4yZjhiODgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL25zLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9ucy5jCkBAIC05MzIsMTEgKzkzMiwxMCBAQAogCX0KIAlucy0+ZmN4cCA9IGZjeHA7CiAKLQlpZiAoQkZBX0ZDU19WUE9SVF9JU19JTklUSUFUT1JfTU9ERShucy0+cG9ydCkpIHsKKwlpZiAoQkZBX0ZDU19WUE9SVF9JU19JTklUSUFUT1JfTU9ERShucy0+cG9ydCkpCiAJCWZjNF9mdHJzID0gRkNfR1NfRkNQX0ZDNF9GRUFUVVJFX0lOSVRJQVRPUjsKLQl9IGVsc2UgaWYgKEJGQV9GQ1NfVlBPUlRfSVNfVEFSR0VUX01PREUobnMtPnBvcnQpKSB7CisJZWxzZSBpZiAoQkZBX0ZDU19WUE9SVF9JU19UQVJHRVRfTU9ERShucy0+cG9ydCkpCiAJCWZjNF9mdHJzID0gRkNfR1NfRkNQX0ZDNF9GRUFUVVJFX1RBUkdFVDsKLQl9CiAKIAlsZW4gPSBmY19yZmZpZF9idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwKIAkJCSAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCAwLCBGQ19UWVBFX0ZDUCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvcGxvZy5jIGIvZHJpdmVycy9zY3NpL2JmYS9wbG9nLmMKaW5kZXggODZhZjgxOC4uZmNiODg2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9wbG9nLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9wbG9nLmMKQEAgLTE4MCw1ICsxODAsNSBAQAogYmZhX2Jvb2xlYW5fdAogYmZhX3Bsb2dfZ2V0X3NldHRpbmcoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2cpCiB7Ci0JcmV0dXJuKChiZmFfYm9vbGVhbl90KXBsb2ctPnBsb2dfZW5hYmxlZCk7CisJcmV0dXJuIChiZmFfYm9vbGVhbl90KXBsb2ctPnBsb2dfZW5hYmxlZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvcnBvcnRfZnRycy5jIGIvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9mdHJzLmMKaW5kZXggOGExZjU5ZC4uZTE5MzJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9mdHJzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9mdHJzLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09OTElORSA6CisJY2FzZSBSUEZTTV9FVkVOVF9SUE9SVF9PTkxJTkU6CiAJCWlmICghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKSB7CiAJCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fcnBzY19zZW5kaW5nKTsKIAkJCXJwZi0+cnBzY19yZXRyaWVzID0gMDsKQEAgLTg3LDcgKzg3LDcgQEAKIAkJCWJyZWFrOwogCQl9OwogCi0JY2FzZSBSUEZTTV9FVkVOVF9SUE9SVF9PRkZMSU5FIDoKKwljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkU6CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEwNyw3ICsxMDcsNyBAQAogCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fcnBzYyk7CiAJCWJyZWFrOwogCi0JY2FzZSBSUEZTTV9FVkVOVF9SUE9SVF9PRkZMSU5FIDoKKwljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkU6CiAJCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV9vZmZsaW5lKTsKIAkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycGYtPmZjeHBfd3FlKTsKIAkJcnBmLT5ycHNjX3JldHJpZXMgPSAwOwpAQCAtMTMwLDExICsxMzAsMTAgQEAKIAljYXNlIFJQRlNNX0VWRU5UX1JQU0NfQ09NUDoKIAkJYmZhX3NtX3NldF9zdGF0ZShycGYsIGJmYV9mY3NfcnBmX3NtX29ubGluZSk7CiAJCS8qIFVwZGF0ZSBzcGVlZCBpbmZvIGluIGYvdyB2aWEgQkZBICovCi0JCWlmIChycGYtPnJwc2Nfc3BlZWQgIT0gQkZBX1BQT1JUX1NQRUVEX1VOS05PV04pIHsKKwkJaWYgKHJwZi0+cnBzY19zcGVlZCAhPSBCRkFfUFBPUlRfU1BFRURfVU5LTk9XTikKIAkJCWJmYV9ycG9ydF9zcGVlZChycG9ydC0+YmZhX3Jwb3J0LCBycGYtPnJwc2Nfc3BlZWQpOwotCQl9IGVsc2UgaWYgKHJwZi0+YXNzaWduZWRfc3BlZWQgIT0gQkZBX1BQT1JUX1NQRUVEX1VOS05PV04pIHsKKwkJZWxzZSBpZiAocnBmLT5hc3NpZ25lZF9zcGVlZCAhPSBCRkFfUFBPUlRfU1BFRURfVU5LTk9XTikKIAkJCWJmYV9ycG9ydF9zcGVlZChycG9ydC0+YmZhX3Jwb3J0LCBycGYtPmFzc2lnbmVkX3NwZWVkKTsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgUlBGU01fRVZFTlRfUlBTQ19GQUlMOgpAQCAtMTU0LDcgKzE1Myw3IEBACiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkUgOgorCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT0ZGTElORToKIAkJYmZhX3NtX3NldF9zdGF0ZShycGYsIGJmYV9mY3NfcnBmX3NtX29mZmxpbmUpOwogCQliZmFfZmN4cF9kaXNjYXJkKHJwZi0+ZmN4cCk7CiAJCXJwZi0+cnBzY19yZXRyaWVzID0gMDsKQEAgLTE3NCwxMyArMTczLDEzIEBACiAJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBSUEZTTV9FVkVOVF9USU1FT1VUIDoKKwljYXNlIFJQRlNNX0VWRU5UX1RJTUVPVVQ6CiAJCS8qIHJlLXNlbmQgdGhlIFJQU0MgKi8KIAkJYmZhX3NtX3NldF9zdGF0ZShycGYsIGJmYV9mY3NfcnBmX3NtX3Jwc2Nfc2VuZGluZyk7CiAJCWJmYV9mY3NfcnBmX3NlbmRfcnBzYzIocnBmLCBOVUxMKTsKIAkJYnJlYWs7CiAKLQljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkUgOgorCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT0ZGTElORToKIAkJYmZhX3RpbWVyX3N0b3AoJnJwZi0+dGltZXIpOwogCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fb2ZmbGluZSk7CiAJCXJwZi0+cnBzY19yZXRyaWVzID0gMDsKQEAgLTIwMSw3ICsyMDAsNyBAQAogCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOwogCiAJc3dpdGNoIChldmVudCkgewotCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT0ZGTElORSA6CisJY2FzZSBSUEZTTV9FVkVOVF9SUE9SVF9PRkZMSU5FOgogCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fb2ZmbGluZSk7CiAJCXJwZi0+cnBzY19yZXRyaWVzID0gMDsKIAkJYnJlYWs7CkBAIC0yMjEsMTIgKzIyMCwxMiBAQAogCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOwogCiAJc3dpdGNoIChldmVudCkgewotCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT05MSU5FIDoKKwljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09OTElORToKIAkJYmZhX3NtX3NldF9zdGF0ZShycGYsIGJmYV9mY3NfcnBmX3NtX3Jwc2Nfc2VuZGluZyk7CiAJCWJmYV9mY3NfcnBmX3NlbmRfcnBzYzIocnBmLCBOVUxMKTsKIAkJYnJlYWs7CiAKLQljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkUgOgorCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT0ZGTElORToKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzY2LDEwICszNjUsOSBAQAogCQliZmFfdHJjKHJwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGUpOwogCQliZmFfdHJjKHJwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGVfZXhwbCk7CiAJCXJwb3J0LT5zdGF0cy5ycHNjX3JlamVjdHMrKzsKLQkJaWYgKGxzX3JqdC0+cmVhc29uX2NvZGUgPT0gRkNfTFNfUkpUX1JTTl9DTURfTk9UX1NVUFApIHsKKwkJaWYgKGxzX3JqdC0+cmVhc29uX2NvZGUgPT0gRkNfTFNfUkpUX1JTTl9DTURfTk9UX1NVUFApCiAJCQliZmFfc21fc2VuZF9ldmVudChycGYsIFJQRlNNX0VWRU5UX1JQU0NfRkFJTCk7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCWJmYV9zbV9zZW5kX2V2ZW50KHJwZiwgUlBGU01fRVZFTlRfUlBTQ19FUlJPUik7Ci0JCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3ZmYXBpLmMgYi9kcml2ZXJzL3Njc2kvYmZhL3ZmYXBpLmMKaW5kZXggMzFkODFmZS4uMzkxYTQ3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS92ZmFwaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvdmZhcGkuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiB7CiAJYmZhX3RyYyhmY3MsIHZmX2lkKTsKIAlpZiAodmZfaWQgPT0gRkNfVkZfSURfTlVMTCkKLQkJcmV0dXJuICgmZmNzLT5mYWJyaWMpOworCQlyZXR1cm4gJmZjcy0+ZmFicmljOwogCiAJLyoqCiAJICogQHRvZG8gdmYgc3VwcG9ydApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS92cG9ydC5jIGIvZHJpdmVycy9zY3NpL2JmYS92cG9ydC5jCmluZGV4IGMxMGFmMDYuLmU5MGYxZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvdnBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL3Zwb3J0LmMKQEAgLTMxLDEzICszMSwxMyBAQAogCiBCRkFfVFJDX0ZJTEUoRkNTLCBWUE9SVCk7CiAKLSNkZWZpbmUgX192cG9ydF9mY3MoX192cCkgICAgICAgKF9fdnApLT5scG9ydC5mY3MKLSNkZWZpbmUgX192cG9ydF9wd3duKF9fdnApICAgICAgKF9fdnApLT5scG9ydC5wb3J0X2NmZy5wd3duCi0jZGVmaW5lIF9fdnBvcnRfbnd3bihfX3ZwKSAgICAgIChfX3ZwKS0+bHBvcnQucG9ydF9jZmcubnd3bgotI2RlZmluZSBfX3Zwb3J0X2JmYShfX3ZwKSAgICAgICAoX192cCktPmxwb3J0LmZjcy0+YmZhCi0jZGVmaW5lIF9fdnBvcnRfZmNpZChfX3ZwKSAgICAgIChfX3ZwKS0+bHBvcnQucGlkCi0jZGVmaW5lIF9fdnBvcnRfZmFicmljKF9fdnApICAgIChfX3ZwKS0+bHBvcnQuZmFicmljCi0jZGVmaW5lIF9fdnBvcnRfdmZpZChfX3ZwKSAgICAgIChfX3ZwKS0+bHBvcnQuZmFicmljLT52Zl9pZAorI2RlZmluZSBfX3Zwb3J0X2ZjcyhfX3ZwKSAgICAgICAoKF9fdnApLT5scG9ydC5mY3MpCisjZGVmaW5lIF9fdnBvcnRfcHd3bihfX3ZwKSAgICAgICgoX192cCktPmxwb3J0LnBvcnRfY2ZnLnB3d24pCisjZGVmaW5lIF9fdnBvcnRfbnd3bihfX3ZwKSAgICAgICgoX192cCktPmxwb3J0LnBvcnRfY2ZnLm53d24pCisjZGVmaW5lIF9fdnBvcnRfYmZhKF9fdnApICAgICAgICgoX192cCktPmxwb3J0LmZjcy0+YmZhKQorI2RlZmluZSBfX3Zwb3J0X2ZjaWQoX192cCkgICAgICAoKF9fdnApLT5scG9ydC5waWQpCisjZGVmaW5lIF9fdnBvcnRfZmFicmljKF9fdnApICAgICgoX192cCktPmxwb3J0LmZhYnJpYykKKyNkZWZpbmUgX192cG9ydF92ZmlkKF9fdnApICAgICAgKChfX3ZwKS0+bHBvcnQuZmFicmljLT52Zl9pZCkKIAogI2RlZmluZSBCRkFfRkNTX1ZQT1JUX01BWF9SRVRSSUVTICA1CiAvKgpAQCAtNjQxLDkgKzY0MSw5IEBACiAJYmZhX2dldF9hdHRyKGZjcy0+YmZhLCAmaW9jX2F0dHIpOwogCiAJaWYgKGlvY19hdHRyLnBjaV9hdHRyLmRldmljZV9pZCA9PSBCRkFfUENJX0RFVklDRV9JRF9DVCkKLQkJcmV0dXJuIChCRkFfRkNTX01BWF9WUE9SVFNfU1VQUF9DVCk7CisJCXJldHVybiBCRkFfRkNTX01BWF9WUE9SVFNfU1VQUF9DVDsKIAllbHNlCi0JCXJldHVybiAoQkZBX0ZDU19NQVhfVlBPUlRTX1NVUFBfQ0IpOworCQlyZXR1cm4gQkZBX0ZDU19NQVhfVlBPUlRTX1NVUFBfQ0I7CiB9CiAKIApAQCAtNjc1LDcgKzY3NSw3IEBACiAJCSAgICAgc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnRfZHJ2KQogewogCWlmICh2cG9ydF9jZmctPnB3d24gPT0gMCkKLQkJcmV0dXJuIChCRkFfU1RBVFVTX0lOVkFMSURfV1dOKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU5WQUxJRF9XV047CiAKIAlpZiAoYmZhX2Zjc19wb3J0X2dldF9wd3duKCZmY3MtPmZhYnJpYy5icG9ydCkgPT0gdnBvcnRfY2ZnLT5wd3duKQogCQlyZXR1cm4gQkZBX1NUQVRVU19WUE9SVF9XV05fQlA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmkuaCBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaS5oCmluZGV4IDVlZGRlMWEuLjJiOTczZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaS5oCkBAIC0yMzIsNyArMjMyLDYgQEAKIAlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uOwogCXN0cnVjdCBibngyaV9oYmEgKmhiYTsKIAlzdHJ1Y3QgY29tcGxldGlvbiBjbWRfY2xlYW51cF9jbXBsOwotCWludCBpc19ib3VuZDsKIAogCXUzMiBpc2NzaV9jb25uX2NpZDsKICNkZWZpbmUgQk5YMklfQ0lEX1JFU0VSVkVECTB4NUFGRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYwppbmRleCBjYWZiODg4Li4xMzI4OThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYwpAQCAtMTE2MSw5ICsxMTYxLDYgQEAKIAlzdHJ1Y3QgYm54MmlfY21kICpjbWQgPSB0YXNrLT5kZF9kYXRhOwogCXN0cnVjdCBpc2NzaV9jbWQgKmhkciA9IChzdHJ1Y3QgaXNjc2lfY21kICopIHRhc2stPmhkcjsKIAotCWlmICghYm54MmlfY29ubi0+aXNfYm91bmQpCi0JCXJldHVybiAtRU5PVENPTk47Ci0KIAkvKgogCSAqIElmIHRoZXJlIGlzIG5vIHNjc2lfY21uZCB0aGlzIG11c3QgYmUgYSBtZ210IHRhc2sKIAkgKi8KQEAgLTEzNzEsNyArMTM2OCw2IEBACiAJYm54MmlfY29ubi0+ZXAgPSBibngyaV9lcDsKIAlibngyaV9jb25uLT5pc2NzaV9jb25uX2NpZCA9IGJueDJpX2VwLT5lcF9pc2NzaV9jaWQ7CiAJYm54MmlfY29ubi0+ZndfY2lkID0gYm54MmlfZXAtPmVwX2NpZDsKLQlibngyaV9jb25uLT5pc19ib3VuZCA9IDE7CiAKIAlyZXRfY29kZSA9IGJueDJpX2JpbmRfY29ubl90b19pc2NzaV9jaWQoaGJhLCBibngyaV9jb25uLAogCQkJCQkJYm54MmlfZXAtPmVwX2lzY3NpX2NpZCk7CkBAIC0xODgzLDcgKzE4NzksNyBAQAogCiAJYm54MmlfZXAgPSBlcC0+ZGRfZGF0YTsKIAotCS8qIGRyaXZlciBzaG91bGQgbm90IGF0dGVtcHQgY29ubmVjdGlvbiBjbGVhbnVwIHVudGlsbCBUQ1BfQ09OTkVDVAorCS8qIGRyaXZlciBzaG91bGQgbm90IGF0dGVtcHQgY29ubmVjdGlvbiBjbGVhbnVwIHVudGlsIFRDUF9DT05ORUNUCiAJICogY29tcGxldGVzIGVpdGhlciBzdWNjZXNzZnVsbHkgb3IgZmFpbHMuIFRpbWVvdXQgaXMgOS1zZWNzLCBzbwogCSAqIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCiAJICovCkBAIC0xODk2LDkgKzE4OTIsNyBAQAogCQljb25uID0gYm54MmlfY29ubi0+Y2xzX2Nvbm4tPmRkX2RhdGE7CiAJCXNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCi0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0JCWJueDJpX2Nvbm4tPmlzX2JvdW5kID0gMDsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlpc2NzaV9zdXNwZW5kX3F1ZXVlKGNvbm4pOwogCX0KIAogCWhiYSA9IGJueDJpX2VwLT5oYmE7CkBAIC0yMDM0LDcgKzIwMjgsNyBAQAogCQkJCSAgSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8CiAJCQkJICBJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKIAkJCQkgIElTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQkJCSAgSVNDU0lfTFVfUkVTRVRfVE1PIHwKKwkJCQkgIElTQ1NJX0xVX1JFU0VUX1RNTyB8IElTQ1NJX1RHVF9SRVNFVF9UTU8gfAogCQkJCSAgSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8CiAJCQkJICBJU0NTSV9JRkFDRV9OQU1FIHwgSVNDU0lfSU5JVElBVE9SX05BTUUsCiAJLmhvc3RfcGFyYW1fbWFzawk9IElTQ1NJX0hPU1RfSFdBRERSRVNTIHwgSVNDU0lfSE9TVF9ORVRERVZfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYyBiL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYwppbmRleCA2M2FiYjA2Li45MTI5YmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMKKysrIGIvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCkBAIC0xNDEsNiArMTQxLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyIHNlcnZfaW4xNl9hcnJbXSA9IHsKIAl7MHgxMCwgIlJlYWQgY2FwYWNpdHkoMTYpIn0sCiAJezB4MTEsICJSZWFkIGxvbmcoMTYpIn0sCisJezB4MTIsICJHZXQgTEJBIHN0YXR1cyJ9LAogfTsKICNkZWZpbmUgU0VSVl9JTjE2X1NaIEFSUkFZX1NJWkUoc2Vydl9pbjE2X2FycikKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2lzY3NpLmMKaW5kZXggMjYzMWJkZC4uOTY5YzgzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9pc2NzaS5jCkBAIC05MzcsNyArOTM3LDcgQEAKIAkJCQlJU0NTSV9VU0VSTkFNRSB8IElTQ1NJX1BBU1NXT1JEIHwKIAkJCQlJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKIAkJCQlJU0NTSV9GQVNUX0FCT1JUIHwgSVNDU0lfQUJPUlRfVE1PIHwKLQkJCQlJU0NTSV9MVV9SRVNFVF9UTU8gfAorCQkJCUlTQ1NJX0xVX1JFU0VUX1RNTyB8IElTQ1NJX1RHVF9SRVNFVF9UTU8gfAogCQkJCUlTQ1NJX1BJTkdfVE1PIHwgSVNDU0lfUkVDVl9UTU8gfAogCQkJCUlTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKIAkuaG9zdF9wYXJhbV9tYXNrCT0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfCBJU0NTSV9IT1NUX0lQQUREUkVTUyB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGMzOTV4LmMgYi9kcml2ZXJzL3Njc2kvZGMzOTV4LmMKaW5kZXggMDc1ZTIzOS4uNmM1OWMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RjMzk1eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9kYzM5NXguYwpAQCAtMTUwOSw3ICsxNTA5LDcgQEAKIAkJICogVHJ5IGFueXdheT8KIAkJICoKIAkJICogV2UgY291bGQsIEJVVDogU29tZXRpbWVzIHRoZSBUUk1fUzEwNDAgbWlzc2VzIHRvIHByb2R1Y2UgYSBTZWxlY3Rpb24KLQkJICogVGltZW91dCwgYSBEaXNjb25uZWN0IG9yIGEgUmVzZWxjdGlvbiBJUlEsIHNvIHdlIHdvdWxkIGJlIHNjcmV3ZWQhCisJCSAqIFRpbWVvdXQsIGEgRGlzY29ubmVjdCBvciBhIFJlc2VsZWN0aW9uIElSUSwgc28gd2Ugd291bGQgYmUgc2NyZXdlZCEKIAkJICogKFRoaXMgaXMgbGlrZWx5IHRvIGJlIGEgYnVnIGluIHRoZSBoYXJkd2FyZS4gT2J2aW91c2x5LCBtb3N0IHBlb3BsZQogCQkgKiAgb25seSBoYXZlIG9uZSBpbml0aWF0b3IgcGVyIFNDU0kgYnVzLikKIAkJICogSW5zdGVhZCBsZXQgdGhpcyBmYWlsIGFuZCBoYXZlIHRoZSB0aW1lciBtYWtlIHN1cmUgdGhlIGNvbW1hbmQgaXMgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaC5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGguYwppbmRleCAzZWUxY2JjLi5lMTlhMWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoLmMKQEAgLTIyNiw3ICsyMjYsNyBAQAogCQkJICogQWN0aXZhdGUgYSBkZXZpY2UgaGFuZGxlcgogCQkJICovCiAJCQlpZiAoc2NzaV9kaC0+YWN0aXZhdGUpCi0JCQkJZXJyID0gc2NzaV9kaC0+YWN0aXZhdGUoc2Rldik7CisJCQkJZXJyID0gc2NzaV9kaC0+YWN0aXZhdGUoc2RldiwgTlVMTCwgTlVMTCk7CiAJCQllbHNlCiAJCQkJZXJyID0gMDsKIAkJfQpAQCAtMzA0LDE4ICszMDQsMTUgQEAKIAlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKIAogCWlmIChhY3Rpb24gPT0gQlVTX05PVElGWV9BRERfREVWSUNFKSB7CisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzY3NpX2RoX3N0YXRlX2F0dHIpOworCQkvKiBkb24ndCBjYXJlIGFib3V0IGVyciAqLwogCQlkZXZpbmZvID0gZGV2aWNlX2hhbmRsZXJfbWF0Y2goTlVMTCwgc2Rldik7Ci0JCWlmICghZGV2aW5mbykKLQkJCWdvdG8gb3V0OwotCi0JCWVyciA9IHNjc2lfZGhfaGFuZGxlcl9hdHRhY2goc2RldiwgZGV2aW5mbyk7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNjc2lfZGhfc3RhdGVfYXR0cik7CisJCWlmIChkZXZpbmZvKQorCQkJZXJyID0gc2NzaV9kaF9oYW5kbGVyX2F0dGFjaChzZGV2LCBkZXZpbmZvKTsKIAl9IGVsc2UgaWYgKGFjdGlvbiA9PSBCVVNfTk9USUZZX0RFTF9ERVZJQ0UpIHsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNjc2lfZGhfc3RhdGVfYXR0cik7CiAJCXNjc2lfZGhfaGFuZGxlcl9kZXRhY2goc2RldiwgTlVMTCk7CiAJfQotb3V0OgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTQyMywxMCArNDIwLDE3IEBACiAvKgogICogc2NzaV9kaF9hY3RpdmF0ZSAtIGFjdGl2YXRlIHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NzaV9kZXZpY2UKICAqICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcmVxdWVzdCBxdWV1ZS4KLSAqIEBxIC0gUmVxdWVzdCBxdWV1ZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NzaV9kZXZpY2UgdG8gYmUKLSAqICAgICAgYWN0aXZhdGVkLgorICogICAgIFJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIGZvciBhY3RpdmF0aW9uIHRvIGJlIGNvbXBsZXRlZC4KKyAqIEBxICAgIC0gUmVxdWVzdCBxdWV1ZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NzaV9kZXZpY2UgdG8gYmUKKyAqICAgICAgICAgYWN0aXZhdGVkLgorICogQGZuICAgLSBGdW5jdGlvbiB0byBiZSBjYWxsZWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBhY3RpdmF0aW9uLgorICogICAgICAgICBGdW5jdGlvbiBmbiBpcyBjYWxsZWQgd2l0aCBkYXRhIChiZWxvdykgYW5kIHRoZSBlcnJvciBjb2RlLgorICogICAgICAgICBGdW5jdGlvbiBmbiBtYXkgYmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgY2FsbGluZyBjb250ZXh0LiBTbywKKyAqICAgICAgICAgZG8gbm90IGhvbGQgdGhlIGxvY2sgaW4gdGhlIGNhbGxlciB3aGljaCBtYXkgYmUgbmVlZGVkIGluIGZuLgorICogQGRhdGEgLSBkYXRhIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gZm4gdXBvbiBjb21wbGV0aW9uLgorICoKICAqLwotaW50IHNjc2lfZGhfYWN0aXZhdGUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCitpbnQgc2NzaV9kaF9hY3RpdmF0ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgYWN0aXZhdGVfY29tcGxldGUgZm4sIHZvaWQgKmRhdGEpCiB7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ0NSw3ICs0NDksNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJaWYgKHNjc2lfZGgtPmFjdGl2YXRlKQotCQllcnIgPSBzY3NpX2RoLT5hY3RpdmF0ZShzZGV2KTsKKwkJZXJyID0gc2NzaV9kaC0+YWN0aXZhdGUoc2RldiwgZm4sIGRhdGEpOwogCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfYWx1YS5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfYWx1YS5jCmluZGV4IGI1Y2RlZmEuLjRmMGQwMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2FsdWEuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9hbHVhLmMKQEAgLTYwLDExICs2MCwxNyBAQAogCWludAkJCWJ1ZmZsZW47CiAJdW5zaWduZWQgY2hhcgkJc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIAlpbnQJCQlzZW5zZWxlbjsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKnNkZXY7CisJYWN0aXZhdGVfY29tcGxldGUJY2FsbGJhY2tfZm47CisJdm9pZAkJCSpjYWxsYmFja19kYXRhOwogfTsKIAogI2RlZmluZSBBTFVBX1BPTElDWV9TV0lUQ0hfQ1VSUkVOVAkwCiAjZGVmaW5lIEFMVUFfUE9MSUNZX1NXSVRDSF9BTEwJCTEKIAorc3RhdGljIGNoYXIgcHJpbnRfYWx1YV9zdGF0ZShpbnQpOworc3RhdGljIGludCBhbHVhX2NoZWNrX3NlbnNlKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKik7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGFsdWFfZGhfZGF0YSAqZ2V0X2FsdWFfZGF0YShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CiAJc3RydWN0IHNjc2lfZGhfZGF0YSAqc2NzaV9kaF9kYXRhID0gc2Rldi0+c2NzaV9kaF9kYXRhOwpAQCAtMjMxLDE4ICsyMzcsNzEgQEAKIH0KIAogLyoKKyAqIGFsdWFfc3RwZyAtIEV2YWx1YXRlIFNFVCBUQVJHRVQgR1JPVVAgU1RBVEVTCisgKiBAc2RldjogdGhlIGRldmljZSB0byBiZSBldmFsdWF0ZWQKKyAqIEBzdGF0ZTogdGhlIG5ldyB0YXJnZXQgZ3JvdXAgc3RhdGUKKyAqCisgKiBTZW5kIGEgU0VUIFRBUkdFVCBHUk9VUCBTVEFURVMgY29tbWFuZCB0byB0aGUgZGV2aWNlLgorICogV2Ugb25seSBoYXZlIHRvIHRlc3QgaGVyZSBpZiB3ZSBzaG91bGQgcmVzdWJtaXQgdGhlIGNvbW1hbmQ7CisgKiBhbnkgb3RoZXIgZXJyb3IgaXMgYXNzdW1lZCBhcyBhIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkIHN0cGdfZW5kaW8oc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQoreworCXN0cnVjdCBhbHVhX2RoX2RhdGEgKmggPSByZXEtPmVuZF9pb19kYXRhOworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzZW5zZV9oZHI7CisJdW5zaWduZWQgZXJyID0gU0NTSV9ESF9JTzsKKworCWlmIChlcnJvciB8fCBob3N0X2J5dGUocmVxLT5lcnJvcnMpICE9IERJRF9PSyB8fAorCQkJbXNnX2J5dGUocmVxLT5lcnJvcnMpICE9IENPTU1BTkRfQ09NUExFVEUpCisJCWdvdG8gZG9uZTsKKworCWlmIChlcnIgPT0gU0NTSV9ESF9JTyAmJiBoLT5zZW5zZWxlbiA+IDApIHsKKwkJZXJyID0gc2NzaV9ub3JtYWxpemVfc2Vuc2UoaC0+c2Vuc2UsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwKKwkJCQkJICAgJnNlbnNlX2hkcik7CisJCWlmICghZXJyKSB7CisJCQllcnIgPSBTQ1NJX0RIX0lPOworCQkJZ290byBkb25lOworCQl9CisJCWVyciA9IGFsdWFfY2hlY2tfc2Vuc2UoaC0+c2RldiwgJnNlbnNlX2hkcik7CisJCWlmIChlcnIgPT0gQUREX1RPX01MUVVFVUUpIHsKKwkJCWVyciA9IFNDU0lfREhfUkVUUlk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBoLT5zZGV2LAorCQkJICAgICIlczogc3RwZyBzZW5zZSBjb2RlOiAlMDJ4LyUwMngvJTAyeFxuIiwKKwkJCSAgICBBTFVBX0RIX05BTUUsIHNlbnNlX2hkci5zZW5zZV9rZXksCisJCQkgICAgc2Vuc2VfaGRyLmFzYywgc2Vuc2VfaGRyLmFzY3EpOworCQllcnIgPSBTQ1NJX0RIX0lPOworCX0KKwlpZiAoZXJyID09IFNDU0lfREhfT0spIHsKKwkJaC0+c3RhdGUgPSBUUEdTX1NUQVRFX09QVElNSVpFRDsKKwkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBoLT5zZGV2LAorCQkJICAgICIlczogcG9ydCBncm91cCAlMDJ4IHN3aXRjaGVkIHRvIHN0YXRlICVjXG4iLAorCQkJICAgIEFMVUFfREhfTkFNRSwgaC0+Z3JvdXBfaWQsCisJCQkgICAgcHJpbnRfYWx1YV9zdGF0ZShoLT5zdGF0ZSkpOworCX0KK2RvbmU6CisJYmxrX3B1dF9yZXF1ZXN0KHJlcSk7CisJaWYgKGgtPmNhbGxiYWNrX2ZuKSB7CisJCWgtPmNhbGxiYWNrX2ZuKGgtPmNhbGxiYWNrX2RhdGEsIGVycik7CisJCWgtPmNhbGxiYWNrX2ZuID0gaC0+Y2FsbGJhY2tfZGF0YSA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworLyoKICAqIHN1Ym1pdF9zdHBnIC0gSXNzdWUgYSBTRVQgVEFSR0VUIEdST1VQIFNUQVRFUyBjb21tYW5kCi0gKiBAc2Rldjogc2RldiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc2VudCB0bwogICoKICAqIEN1cnJlbnRseSB3ZSdyZSBvbmx5IHNldHRpbmcgdGhlIGN1cnJlbnQgdGFyZ2V0IHBvcnQgZ3JvdXAgc3RhdGUKICAqIHRvICdhY3RpdmUvb3B0aW1pemVkJyBhbmQgbGV0IHRoZSBhcnJheSBmaXJtd2FyZSBmaWd1cmUgb3V0CiAgKiB0aGUgc3RhdGVzIG9mIHRoZSByZW1haW5pbmcgZ3JvdXBzLgogICovCi1zdGF0aWMgdW5zaWduZWQgc3VibWl0X3N0cGcoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYWx1YV9kaF9kYXRhICpoKQorc3RhdGljIHVuc2lnbmVkIHN1Ym1pdF9zdHBnKHN0cnVjdCBhbHVhX2RoX2RhdGEgKmgpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCBlcnIgPSBTQ1NJX0RIX1JFU19URU1QX1VOQVZBSUw7CiAJaW50IHN0cGdfbGVuID0gODsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBoLT5zZGV2OwogCiAJLyogUHJlcGFyZSB0aGUgZGF0YSBidWZmZXIgKi8KIAltZW1zZXQoaC0+YnVmZiwgMCwgc3RwZ19sZW4pOwpAQCAtMjUyLDcgKzMxMSw3IEBACiAKIAlycSA9IGdldF9hbHVhX3JlcShzZGV2LCBoLT5idWZmLCBzdHBnX2xlbiwgV1JJVEUpOwogCWlmICghcnEpCi0JCWdvdG8gZG9uZTsKKwkJcmV0dXJuIFNDU0lfREhfUkVTX1RFTVBfVU5BVkFJTDsKIAogCS8qIFByZXBhcmUgdGhlIGNvbW1hbmQuICovCiAJcnEtPmNtZFswXSA9IE1BSU5URU5BTkNFX09VVDsKQEAgLTI2NiwxNyArMzI1LDkgQEAKIAlycS0+c2Vuc2UgPSBoLT5zZW5zZTsKIAltZW1zZXQocnEtPnNlbnNlLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwogCXJxLT5zZW5zZV9sZW4gPSBoLT5zZW5zZWxlbiA9IDA7CisJcnEtPmVuZF9pb19kYXRhID0gaDsKIAotCWVyciA9IGJsa19leGVjdXRlX3JxKHJxLT5xLCBOVUxMLCBycSwgMSk7Ci0JaWYgKGVyciA9PSAtRUlPKSB7Ci0JCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2RldiwKLQkJCSAgICAiJXM6IHN0cGcgZmFpbGVkIHdpdGggJXhcbiIsCi0JCQkgICAgQUxVQV9ESF9OQU1FLCBycS0+ZXJyb3JzKTsKLQkJaC0+c2Vuc2VsZW4gPSBycS0+c2Vuc2VfbGVuOwotCQllcnIgPSBTQ1NJX0RIX0lPOwotCX0KLQlibGtfcHV0X3JlcXVlc3QocnEpOwotZG9uZToKKwlibGtfZXhlY3V0ZV9ycV9ub3dhaXQocnEtPnEsIE5VTEwsIHJxLCAxLCBzdHBnX2VuZGlvKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00NzcsNTAgKzUyOCw2IEBACiB9CiAKIC8qCi0gKiBhbHVhX3N0cGcgLSBFdmFsdWF0ZSBTRVQgVEFSR0VUIEdST1VQIFNUQVRFUwotICogQHNkZXY6IHRoZSBkZXZpY2UgdG8gYmUgZXZhbHVhdGVkCi0gKiBAc3RhdGU6IHRoZSBuZXcgdGFyZ2V0IGdyb3VwIHN0YXRlCi0gKgotICogU2VuZCBhIFNFVCBUQVJHRVQgR1JPVVAgU1RBVEVTIGNvbW1hbmQgdG8gdGhlIGRldmljZS4KLSAqIFdlIG9ubHkgaGF2ZSB0byB0ZXN0IGhlcmUgaWYgd2Ugc2hvdWxkIHJlc3VibWl0IHRoZSBjb21tYW5kOwotICogYW55IG90aGVyIGVycm9yIGlzIGFzc3VtZWQgYXMgYSBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IGFsdWFfc3RwZyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBzdGF0ZSwKLQkJICAgICBzdHJ1Y3QgYWx1YV9kaF9kYXRhICpoKQotewotCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzZW5zZV9oZHI7Ci0JdW5zaWduZWQgZXJyOwotCWludCByZXRyeSA9IEFMVUFfRkFJTE9WRVJfUkVUUklFUzsKLQotIHJldHJ5OgotCWVyciA9IHN1Ym1pdF9zdHBnKHNkZXYsIGgpOwotCWlmIChlcnIgPT0gU0NTSV9ESF9JTyAmJiBoLT5zZW5zZWxlbiA+IDApIHsKLQkJZXJyID0gc2NzaV9ub3JtYWxpemVfc2Vuc2UoaC0+c2Vuc2UsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwKLQkJCQkJICAgJnNlbnNlX2hkcik7Ci0JCWlmICghZXJyKQotCQkJcmV0dXJuIFNDU0lfREhfSU87Ci0JCWVyciA9IGFsdWFfY2hlY2tfc2Vuc2Uoc2RldiwgJnNlbnNlX2hkcik7Ci0JCWlmIChyZXRyeSA+IDAgJiYgZXJyID09IEFERF9UT19NTFFVRVVFKSB7Ci0JCQlyZXRyeS0tOwotCQkJZ290byByZXRyeTsKLQkJfQotCQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsCi0JCQkgICAgIiVzOiBzdHBnIHNlbnNlIGNvZGU6ICUwMngvJTAyeC8lMDJ4XG4iLAotCQkJICAgIEFMVUFfREhfTkFNRSwgc2Vuc2VfaGRyLnNlbnNlX2tleSwKLQkJCSAgICBzZW5zZV9oZHIuYXNjLCBzZW5zZV9oZHIuYXNjcSk7Ci0JCWVyciA9IFNDU0lfREhfSU87Ci0JfQotCWlmIChlcnIgPT0gU0NTSV9ESF9PSykgewotCQloLT5zdGF0ZSA9IHN0YXRlOwotCQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsCi0JCQkgICAgIiVzOiBwb3J0IGdyb3VwICUwMnggc3dpdGNoZWQgdG8gc3RhdGUgJWNcbiIsCi0JCQkgICAgQUxVQV9ESF9OQU1FLCBoLT5ncm91cF9pZCwKLQkJCSAgICBwcmludF9hbHVhX3N0YXRlKGgtPnN0YXRlKSApOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgogICogYWx1YV9ydHBnIC0gRXZhbHVhdGUgUkVQT1JUIFRBUkdFVCBHUk9VUCBTVEFURVMKICAqIEBzZGV2OiB0aGUgZGV2aWNlIHRvIGJlIGV2YWx1YXRlZC4KICAqCkBAIC02NTIsNyArNjU5LDggQEAKICAqIGJhc2VkIG9uIGEgY2VydGFpbiBwb2xpY3kuIEJ1dCB1bnRpbCB3ZSBhY3R1YWxseSBlbmNvdW50ZXIgdGhlbSBpdAogICogc2hvdWxkIGJlIG9rYXkuCiAgKi8KLXN0YXRpYyBpbnQgYWx1YV9hY3RpdmF0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCitzdGF0aWMgaW50IGFsdWFfYWN0aXZhdGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJYWN0aXZhdGVfY29tcGxldGUgZm4sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGFsdWFfZGhfZGF0YSAqaCA9IGdldF9hbHVhX2RhdGEoc2Rldik7CiAJaW50IGVyciA9IFNDU0lfREhfT0s7CkBAIC02NjMsMTEgKzY3MSwxOSBAQAogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGgtPnRwZ3MgJiBUUEdTX01PREVfRVhQTElDSVQgJiYgaC0+c3RhdGUgIT0gVFBHU19TVEFURV9PUFRJTUlaRUQpCi0JCWVyciA9IGFsdWFfc3RwZyhzZGV2LCBUUEdTX1NUQVRFX09QVElNSVpFRCwgaCk7CisJaWYgKGgtPnRwZ3MgJiBUUEdTX01PREVfRVhQTElDSVQgJiYgaC0+c3RhdGUgIT0gVFBHU19TVEFURV9PUFRJTUlaRUQpIHsKKwkJaC0+Y2FsbGJhY2tfZm4gPSBmbjsKKwkJaC0+Y2FsbGJhY2tfZGF0YSA9IGRhdGE7CisJCWVyciA9IHN1Ym1pdF9zdHBnKGgpOworCQlpZiAoZXJyID09IFNDU0lfREhfT0spCisJCQlyZXR1cm4gMDsKKwkJaC0+Y2FsbGJhY2tfZm4gPSBoLT5jYWxsYmFja19kYXRhID0gTlVMTDsKKwl9CiAKIG91dDoKLQlyZXR1cm4gZXJyOworCWlmIChmbikKKwkJZm4oZGF0YSwgZXJyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTc0NSw2ICs3NjEsNyBAQAogCWgtPnJlbF9wb3J0ID0gLTE7CiAJaC0+YnVmZiA9IGgtPmlucTsKIAloLT5idWZmbGVuID0gQUxVQV9JTlFVSVJZX1NJWkU7CisJaC0+c2RldiA9IHNkZXY7CiAKIAllcnIgPSBhbHVhX2luaXRpYWxpemUoc2RldiwgaCk7CiAJaWYgKGVyciAhPSBTQ1NJX0RIX09LKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfZW1jLmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYwppbmRleCAwY2ZmZTg0Li42MTk2Njc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYwpAQCAtNTI4LDcgKzUyOCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBjbGFyaWlvbl9hY3RpdmF0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCitzdGF0aWMgaW50IGNsYXJpaW9uX2FjdGl2YXRlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJCQlhY3RpdmF0ZV9jb21wbGV0ZSBmbiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY2xhcmlpb25fZGhfZGF0YSAqY3NkZXYgPSBnZXRfY2xhcmlpb25fZGF0YShzZGV2KTsKIAlpbnQgcmVzdWx0OwpAQCAtNTU5LDcgKzU2MCw5IEBACiAJCSAgICBjc2Rldi0+cG9ydCwgbHVuX3N0YXRlW2NzZGV2LT5sdW5fc3RhdGVdLAogCQkgICAgY3NkZXYtPmRlZmF1bHRfc3AgKyAnQScpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlpZiAoZm4pCisJCWZuKGRhdGEsIHJlc3VsdCk7CisJcmV0dXJuIDA7CiB9CiAvKgogICogcGFyYW1zIC0gcGFyYW1ldGVycyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfaHBfc3cuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2hwX3N3LmMKaW5kZXggZjdkYTc1My4uODU3ZmRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfaHBfc3cuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9ocF9zdy5jCkBAIC0zOSw4ICszOSwxNCBAQAogCXVuc2lnbmVkIGNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIAlpbnQgcGF0aF9zdGF0ZTsKIAlpbnQgcmV0cmllczsKKwlpbnQgcmV0cnlfY250OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlhY3RpdmF0ZV9jb21wbGV0ZQljYWxsYmFja19mbjsKKwl2b2lkCQkJKmNhbGxiYWNrX2RhdGE7CiB9OwogCitzdGF0aWMgaW50IGhwX3N3X3N0YXJ0X3N0b3Aoc3RydWN0IGhwX3N3X2RoX2RhdGEgKik7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGhwX3N3X2RoX2RhdGEgKmdldF9ocF9zd19kYXRhKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAlzdHJ1Y3Qgc2NzaV9kaF9kYXRhICpzY3NpX2RoX2RhdGEgPSBzZGV2LT5zY3NpX2RoX2RhdGE7CkBAIC0xOTEsMTkgKzE5Nyw1MyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQgc3RhcnRfc3RvcF9lbmRpbyhzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IGhwX3N3X2RoX2RhdGEgKmggPSByZXEtPmVuZF9pb19kYXRhOworCXVuc2lnbmVkIGVyciA9IFNDU0lfREhfT0s7CisKKwlpZiAoZXJyb3IgfHwgaG9zdF9ieXRlKHJlcS0+ZXJyb3JzKSAhPSBESURfT0sgfHwKKwkJCW1zZ19ieXRlKHJlcS0+ZXJyb3JzKSAhPSBDT01NQU5EX0NPTVBMRVRFKSB7CisJCXNkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgaC0+c2RldiwKKwkJCSAgICAiJXM6IHNlbmRpbmcgc3RhcnRfc3RvcF91bml0IGZhaWxlZCB3aXRoICV4XG4iLAorCQkJICAgIEhQX1NXX05BTUUsIHJlcS0+ZXJyb3JzKTsKKwkJZXJyID0gU0NTSV9ESF9JTzsKKwkJZ290byBkb25lOworCX0KKworCWlmIChyZXEtPnNlbnNlX2xlbiA+IDApIHsKKwkJZXJyID0gc3RhcnRfZG9uZShoLT5zZGV2LCBoLT5zZW5zZSk7CisJCWlmIChlcnIgPT0gU0NTSV9ESF9SRVRSWSkgeworCQkJZXJyID0gU0NTSV9ESF9JTzsKKwkJCWlmICgtLWgtPnJldHJ5X2NudCkgeworCQkJCWJsa19wdXRfcmVxdWVzdChyZXEpOworCQkJCWVyciA9IGhwX3N3X3N0YXJ0X3N0b3AoaCk7CisJCQkJaWYgKGVyciA9PSBTQ1NJX0RIX09LKQorCQkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Citkb25lOgorCWJsa19wdXRfcmVxdWVzdChyZXEpOworCWlmIChoLT5jYWxsYmFja19mbikgeworCQloLT5jYWxsYmFja19mbihoLT5jYWxsYmFja19kYXRhLCBlcnIpOworCQloLT5jYWxsYmFja19mbiA9IGgtPmNhbGxiYWNrX2RhdGEgPSBOVUxMOworCX0KKwlyZXR1cm47CisKK30KKwogLyoKICAqIGhwX3N3X3N0YXJ0X3N0b3AgLSBTZW5kIFNUQVJUIFNUT1AgVU5JVCBjb21tYW5kCiAgKiBAc2Rldjogc2RldiBjb21tYW5kIHNob3VsZCBiZSBzZW50IHRvCiAgKgogICogU2VuZGluZyBTVEFSVCBTVE9QIFVOSVQgYWN0aXZhdGVzIHRoZSBTUC4KICAqLwotc3RhdGljIGludCBocF9zd19zdGFydF9zdG9wKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGhwX3N3X2RoX2RhdGEgKmgpCitzdGF0aWMgaW50IGhwX3N3X3N0YXJ0X3N0b3Aoc3RydWN0IGhwX3N3X2RoX2RhdGEgKmgpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKLQlpbnQgcmV0LCByZXRyeTsKIAotcmV0cnk6Ci0JcmVxID0gYmxrX2dldF9yZXF1ZXN0KHNkZXYtPnJlcXVlc3RfcXVldWUsIFdSSVRFLCBHRlBfTk9JTyk7CisJcmVxID0gYmxrX2dldF9yZXF1ZXN0KGgtPnNkZXYtPnJlcXVlc3RfcXVldWUsIFdSSVRFLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXJlcSkKIAkJcmV0dXJuIFNDU0lfREhfUkVTX1RFTVBfVU5BVkFJTDsKIApAQCAtMjE3LDMyICsyNTcsMTAgQEAKIAlyZXEtPnNlbnNlID0gaC0+c2Vuc2U7CiAJbWVtc2V0KHJlcS0+c2Vuc2UsIDAsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CiAJcmVxLT5zZW5zZV9sZW4gPSAwOwotCXJldHJ5ID0gaC0+cmV0cmllczsKKwlyZXEtPmVuZF9pb19kYXRhID0gaDsKIAotCXJldCA9IGJsa19leGVjdXRlX3JxKHJlcS0+cSwgTlVMTCwgcmVxLCAxKTsKLQlpZiAocmV0ID09IC1FSU8pIHsKLQkJaWYgKHJlcS0+c2Vuc2VfbGVuID4gMCkgewotCQkJcmV0ID0gc3RhcnRfZG9uZShzZGV2LCBoLT5zZW5zZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkZXYsCi0JCQkJICAgICIlczogc2VuZGluZyBzdGFydF9zdG9wX3VuaXQgZmFpbGVkIHdpdGggJXhcbiIsCi0JCQkJICAgIEhQX1NXX05BTUUsIHJlcS0+ZXJyb3JzKTsKLQkJCXJldCA9IFNDU0lfREhfSU87Ci0JCX0KLQl9IGVsc2UKLQkJcmV0ID0gU0NTSV9ESF9PSzsKLQotCWlmIChyZXQgPT0gU0NTSV9ESF9SRVRSWSkgewotCQlpZiAoLS1yZXRyeSkgewotCQkJYmxrX3B1dF9yZXF1ZXN0KHJlcSk7Ci0JCQlnb3RvIHJldHJ5OwotCQl9Ci0JCXJldCA9IFNDU0lfREhfSU87Ci0JfQotCi0JYmxrX3B1dF9yZXF1ZXN0KHJlcSk7Ci0KLQlyZXR1cm4gcmV0OworCWJsa19leGVjdXRlX3JxX25vd2FpdChyZXEtPnEsIE5VTEwsIHJlcSwgMSwgc3RhcnRfc3RvcF9lbmRpbyk7CisJcmV0dXJuIFNDU0lfREhfT0s7CiB9CiAKIHN0YXRpYyBpbnQgaHBfc3dfcHJlcF9mbihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCkBAIC0yNjgsNyArMjg2LDggQEAKICAqIGFjdGl2YXRlIHRoZSBwYXNzaXZlIHBhdGggKGFuZCBkZWFjdGl2YXRlIHRoZQogICogcHJldmlvdXNseSBhY3RpdmUgb25lKS4KICAqLwotc3RhdGljIGludCBocF9zd19hY3RpdmF0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCitzdGF0aWMgaW50IGhwX3N3X2FjdGl2YXRlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJCQlhY3RpdmF0ZV9jb21wbGV0ZSBmbiwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmV0ID0gU0NTSV9ESF9PSzsKIAlzdHJ1Y3QgaHBfc3dfZGhfZGF0YSAqaCA9IGdldF9ocF9zd19kYXRhKHNkZXYpOwpAQCAtMjc2LDE0ICsyOTUsMTggQEAKIAlyZXQgPSBocF9zd190dXIoc2RldiwgaCk7CiAKIAlpZiAocmV0ID09IFNDU0lfREhfT0sgJiYgaC0+cGF0aF9zdGF0ZSA9PSBIUF9TV19QQVRIX1BBU1NJVkUpIHsKLQkJcmV0ID0gaHBfc3dfc3RhcnRfc3RvcChzZGV2LCBoKTsKKwkJaC0+cmV0cnlfY250ID0gaC0+cmV0cmllczsKKwkJaC0+Y2FsbGJhY2tfZm4gPSBmbjsKKwkJaC0+Y2FsbGJhY2tfZGF0YSA9IGRhdGE7CisJCXJldCA9IGhwX3N3X3N0YXJ0X3N0b3AoaCk7CiAJCWlmIChyZXQgPT0gU0NTSV9ESF9PSykKLQkJCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2RldiwKLQkJCQkgICAgIiVzOiBhY3RpdmF0ZWQgcGF0aFxuIiwKLQkJCQkgICAgSFBfU1dfTkFNRSk7CisJCQlyZXR1cm4gMDsKKwkJaC0+Y2FsbGJhY2tfZm4gPSBoLT5jYWxsYmFja19kYXRhID0gTlVMTDsKIAl9CiAKLQlyZXR1cm4gcmV0OworCWlmIChmbikKKwkJZm4oZGF0YSwgcmV0KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzY3NpX2RoX2Rldmxpc3QgaHBfc3dfZGhfZGF0YV9saXN0W10gPSB7CkBAIC0zMjYsNiArMzQ5LDcgQEAKIAloID0gKHN0cnVjdCBocF9zd19kaF9kYXRhICopIHNjc2lfZGhfZGF0YS0+YnVmOwogCWgtPnBhdGhfc3RhdGUgPSBIUF9TV19QQVRIX1VOSU5JVElBTElaRUQ7CiAJaC0+cmV0cmllcyA9IEhQX1NXX1JFVFJJRVM7CisJaC0+c2RldiA9IHNkZXY7CiAKIAlyZXQgPSBocF9zd190dXIoc2RldiwgaCk7CiAJaWYgKHJldCAhPSBTQ1NJX0RIX09LIHx8IGgtPnBhdGhfc3RhdGUgPT0gSFBfU1dfUEFUSF9VTklOSVRJQUxJWkVEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCmluZGV4IDI2ODE4OWQuLjQ3Y2ZlMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGguaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2RlZmluZSBSREFDX05BTUUgInJkYWMiCiAjZGVmaW5lIFJEQUNfUkVUUllfQ09VTlQgNQpAQCAtMTM4LDcgKzEzOSwxMyBAQAogCX0gbW9kZV9zZWxlY3Q7CiAJdTgJaW5kZXg7CiAJdTgJYXJyYXlfbmFtZVtBUlJBWV9MQUJFTF9MRU5dOworCXNwaW5sb2NrX3QJCW1zX2xvY2s7CisJaW50CQkJbXNfcXVldWVkOworCXN0cnVjdCB3b3JrX3N0cnVjdAltc193b3JrOworCXN0cnVjdCBzY3NpX2RldmljZQkqbXNfc2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW1zX2hlYWQ7CiB9OworCiBzdHJ1Y3QgYzhfaW5xdWlyeSB7CiAJdTgJcGVyaXBoZXJhbF9pbmZvOwogCXU4CXBhZ2VfY29kZTsgLyogMHhDOCAqLwpAQCAtMTk4LDggKzIwNSwxNyBAQAogCSJvd25lZCAoQVZUIG1vZGUpIiwKIH07CiAKK3N0cnVjdCByZGFjX3F1ZXVlX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQJZW50cnk7CisJc3RydWN0IHJkYWNfZGhfZGF0YQkqaDsKKwlhY3RpdmF0ZV9jb21wbGV0ZQljYWxsYmFja19mbjsKKwl2b2lkCQkJKmNhbGxiYWNrX2RhdGE7Cit9OworCiBzdGF0aWMgTElTVF9IRUFEKGN0bHJfbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxpc3RfbG9jayk7CitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmttcGF0aF9yZGFjZDsKK3N0YXRpYyB2b2lkIHNlbmRfbW9kZV9zZWxlY3Qoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyoKICAqIG1vZHVsZSBwYXJhbWV0ZXIgdG8gZW5hYmxlIHJkYWMgZGVidWcgbG9nZ2luZy4KQEAgLTI4MSw3ICsyOTcsNiBAQAogCQlyZGFjX3BnLT5zdWJwYWdlX2NvZGUgPSAweDE7CiAJCXJkYWNfcGctPnBhZ2VfbGVuWzBdID0gMHgwMTsKIAkJcmRhY19wZy0+cGFnZV9sZW5bMV0gPSAweDI4OwotCQlyZGFjX3BnLT5sdW5fdGFibGVbaC0+bHVuXSA9IDB4ODE7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHJkYWNfcGdfbGVnYWN5ICpyZGFjX3BnOwogCkBAIC0yOTEsNyArMzA2LDYgQEAKIAkJY29tbW9uID0gJnJkYWNfcGctPmNvbW1vbjsKIAkJcmRhY19wZy0+cGFnZV9jb2RlID0gUkRBQ19QQUdFX0NPREVfUkVEVU5EQU5UX0NPTlRST0xMRVI7CiAJCXJkYWNfcGctPnBhZ2VfbGVuID0gMHg2ODsKLQkJcmRhY19wZy0+bHVuX3RhYmxlW2gtPmx1bl0gPSAweDgxOwogCX0KIAljb21tb24tPnJkYWNfbW9kZVsxXSA9IFJEQUNfTU9ERV9UUkFOU0ZFUl9TUEVDSUZJRURfTFVOUzsKIAljb21tb24tPnF1aWVzY2VuY2VfdGltZW91dCA9IFJEQUNfUVVJRVNDRU5DRV9USU1FOwpAQCAtMzI1LDYgKzMzOSw3IEBACiAJc3RydWN0IHJkYWNfY29udHJvbGxlciAqY3RscjsKIAljdGxyID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCByZGFjX2NvbnRyb2xsZXIsIGtyZWYpOwogCisJZmx1c2hfd29ya3F1ZXVlKGttcGF0aF9yZGFjZCk7CiAJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOwogCWxpc3RfZGVsKCZjdGxyLT5ub2RlKTsKIAlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKQEAgLTM2Myw2ICszNzgsMTEgQEAKIAogCWtyZWZfaW5pdCgmY3Rsci0+a3JlZik7CiAJY3Rsci0+dXNlX21zMTAgPSAtMTsKKwljdGxyLT5tc19xdWV1ZWQgPSAwOworCWN0bHItPm1zX3NkZXYgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZjdGxyLT5tc19sb2NrKTsKKwlJTklUX1dPUksoJmN0bHItPm1zX3dvcmssIHNlbmRfbW9kZV9zZWxlY3QpOworCUlOSVRfTElTVF9IRUFEKCZjdGxyLT5tc19oZWFkKTsKIAlsaXN0X2FkZCgmY3Rsci0+bm9kZSwgJmN0bHJfbGlzdCk7CiBkb25lOgogCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOwpAQCAtNDkwLDcgKzUxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbW9kZV9zZWxlY3RfaGFuZGxlX3NlbnNlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKLQkJCQkgICAgdW5zaWduZWQgY2hhciAqc2Vuc2VidWYpCisJCQkJCXVuc2lnbmVkIGNoYXIgKnNlbnNlYnVmKQogewogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzZW5zZV9oZHI7CiAJaW50IGVyciA9IFNDU0lfREhfSU8sIHJldDsKQEAgLTUzMywxMSArNTUzLDI5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBzZW5kX21vZGVfc2VsZWN0KHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IHJkYWNfZGhfZGF0YSAqaCkKK3N0YXRpYyB2b2lkIHNlbmRfbW9kZV9zZWxlY3Qoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCByZGFjX2NvbnRyb2xsZXIgKmN0bHIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJkYWNfY29udHJvbGxlciwgbXNfd29yayk7CiAJc3RydWN0IHJlcXVlc3QgKnJxOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGN0bHItPm1zX3NkZXY7CisJc3RydWN0IHJkYWNfZGhfZGF0YSAqaCA9IGdldF9yZGFjX2RhdGEoc2Rldik7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBzZGV2LT5yZXF1ZXN0X3F1ZXVlOwogCWludCBlcnIsIHJldHJ5X2NudCA9IFJEQUNfUkVUUllfQ09VTlQ7CisJc3RydWN0IHJkYWNfcXVldWVfZGF0YSAqdG1wLCAqcWRhdGE7CisJTElTVF9IRUFEKGxpc3QpOworCXU4ICpsdW5fdGFibGU7CisKKwlzcGluX2xvY2soJmN0bHItPm1zX2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJmN0bHItPm1zX2hlYWQsICZsaXN0KTsKKwljdGxyLT5tc19xdWV1ZWQgPSAwOworCWN0bHItPm1zX3NkZXYgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZjdGxyLT5tc19sb2NrKTsKKworCWlmIChjdGxyLT51c2VfbXMxMCkKKwkJbHVuX3RhYmxlID0gY3Rsci0+bW9kZV9zZWxlY3QuZXhwYW5kZWQubHVuX3RhYmxlOworCWVsc2UKKwkJbHVuX3RhYmxlID0gY3Rsci0+bW9kZV9zZWxlY3QubGVnYWN5Lmx1bl90YWJsZTsKIAogcmV0cnk6CiAJZXJyID0gU0NTSV9ESF9SRVNfVEVNUF9VTkFWQUlMOwpAQCAtNTQ1LDYgKzU4MywxMCBAQAogCWlmICghcnEpCiAJCWdvdG8gZG9uZTsKIAorCWxpc3RfZm9yX2VhY2hfZW50cnkocWRhdGEsICZsaXN0LCBlbnRyeSkgeworCQlsdW5fdGFibGVbcWRhdGEtPmgtPmx1bl0gPSAweDgxOworCX0KKwogCVJEQUNfTE9HKFJEQUNfTE9HX0ZBSUxPVkVSLCBzZGV2LCAiYXJyYXkgJXMsIGN0bHIgJWQsICIKIAkJIiVzIE1PREVfU0VMRUNUIGNvbW1hbmQiLAogCQkoY2hhciAqKSBoLT5jdGxyLT5hcnJheV9uYW1lLCBoLT5jdGxyLT5pbmRleCwKQEAgLTU2NSwxMCArNjA3LDQ1IEBACiAJfQogCiBkb25lOgotCXJldHVybiBlcnI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFkYXRhLCB0bXAsICZsaXN0LCBlbnRyeSkgeworCQlsaXN0X2RlbCgmcWRhdGEtPmVudHJ5KTsKKwkJaWYgKGVyciA9PSBTQ1NJX0RIX09LKQorCQkJcWRhdGEtPmgtPnN0YXRlID0gUkRBQ19TVEFURV9BQ1RJVkU7CisJCWlmIChxZGF0YS0+Y2FsbGJhY2tfZm4pCisJCQlxZGF0YS0+Y2FsbGJhY2tfZm4ocWRhdGEtPmNhbGxiYWNrX2RhdGEsIGVycik7CisJCWtmcmVlKHFkYXRhKTsKKwl9CisJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IHJkYWNfYWN0aXZhdGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQorc3RhdGljIGludCBxdWV1ZV9tb2RlX3NlbGVjdChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkJYWN0aXZhdGVfY29tcGxldGUgZm4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJkYWNfcXVldWVfZGF0YSAqcWRhdGE7CisJc3RydWN0IHJkYWNfY29udHJvbGxlciAqY3RscjsKKworCXFkYXRhID0ga3phbGxvYyhzaXplb2YoKnFkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxZGF0YSkKKwkJcmV0dXJuIFNDU0lfREhfUkVUUlk7CisKKwlxZGF0YS0+aCA9IGdldF9yZGFjX2RhdGEoc2Rldik7CisJcWRhdGEtPmNhbGxiYWNrX2ZuID0gZm47CisJcWRhdGEtPmNhbGxiYWNrX2RhdGEgPSBkYXRhOworCisJY3RsciA9IHFkYXRhLT5oLT5jdGxyOworCXNwaW5fbG9jaygmY3Rsci0+bXNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcWRhdGEtPmVudHJ5LCAmY3Rsci0+bXNfaGVhZCk7CisJaWYgKCFjdGxyLT5tc19xdWV1ZWQpIHsKKwkJY3Rsci0+bXNfcXVldWVkID0gMTsKKwkJY3Rsci0+bXNfc2RldiA9IHNkZXY7CisJCXF1ZXVlX3dvcmsoa21wYXRoX3JkYWNkLCAmY3Rsci0+bXNfd29yayk7CisJfQorCXNwaW5fdW5sb2NrKCZjdGxyLT5tc19sb2NrKTsKKwlyZXR1cm4gU0NTSV9ESF9PSzsKK30KKworc3RhdGljIGludCByZGFjX2FjdGl2YXRlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJCWFjdGl2YXRlX2NvbXBsZXRlIGZuLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCByZGFjX2RoX2RhdGEgKmggPSBnZXRfcmRhY19kYXRhKHNkZXYpOwogCWludCBlcnIgPSBTQ1NJX0RIX09LOwpAQCAtNTc3LDEwICs2NTQsMTUgQEAKIAlpZiAoZXJyICE9IFNDU0lfREhfT0spCiAJCWdvdG8gZG9uZTsKIAotCWlmIChoLT5sdW5fc3RhdGUgPT0gUkRBQ19MVU5fVU5PV05FRCkKLQkJZXJyID0gc2VuZF9tb2RlX3NlbGVjdChzZGV2LCBoKTsKKwlpZiAoaC0+bHVuX3N0YXRlID09IFJEQUNfTFVOX1VOT1dORUQpIHsKKwkJZXJyID0gcXVldWVfbW9kZV9zZWxlY3Qoc2RldiwgZm4sIGRhdGEpOworCQlpZiAoZXJyID09IFNDU0lfREhfT0spCisJCQlyZXR1cm4gMDsKKwl9CiBkb25lOgotCXJldHVybiBlcnI7CisJaWYgKGZuKQorCQlmbihkYXRhLCBlcnIpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJkYWNfcHJlcF9mbihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCkBAIC03OTAsMTMgKzg3MiwyNiBAQAogCWludCByOwogCiAJciA9IHNjc2lfcmVnaXN0ZXJfZGV2aWNlX2hhbmRsZXIoJnJkYWNfZGgpOwotCWlmIChyICE9IDApCisJaWYgKHIgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBzY3NpIGRldmljZSBoYW5kbGVyLiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgd29ya3F1ZXVlIHRvIGhhbmRsZSBtb2RlIHNlbGVjdHMgZm9yIHJkYWMKKwkgKi8KKwlrbXBhdGhfcmRhY2QgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia21wYXRoX3JkYWNkIik7CisJaWYgKCFrbXBhdGhfcmRhY2QpIHsKKwkJc2NzaV91bnJlZ2lzdGVyX2RldmljZV9oYW5kbGVyKCZyZGFjX2RoKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJrbXBhdGhfcmRhY2QgY3JlYXRpb24gZmFpbGVkLlxuIik7CisJfQorZG9uZToKIAlyZXR1cm4gcjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHJkYWNfZXhpdCh2b2lkKQogeworCWRlc3Ryb3lfd29ya3F1ZXVlKGttcGF0aF9yZGFjZCk7CiAJc2NzaV91bnJlZ2lzdGVyX2RldmljZV9oYW5kbGVyKCZyZGFjX2RoKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RteDMxOTFkLmMgYi9kcml2ZXJzL3Njc2kvZG14MzE5MWQuYwppbmRleCBmYTczOGVjLi4yMDczNTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZG14MzE5MWQuYworKysgYi9kcml2ZXJzL3Njc2kvZG14MzE5MWQuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAKIC8qCi0gKiBEZWZpbnRpb25zIGZvciB0aGUgZ2VuZXJpYyA1MzgwIGRyaXZlci4KKyAqIERlZmluaXRpb25zIGZvciB0aGUgZ2VuZXJpYyA1MzgwIGRyaXZlci4KICAqLwogI2RlZmluZSBBVVRPU0VOU0UKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCmluZGV4IDcwNGI4ZTAuLmEzMGZmYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKQEAgLTY2LDE0ICs2NiwxNCBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IGZjb2VfcGVyY3B1X3MsIGZjb2VfcGVyY3B1KTsKIAogLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLwotc3RhdGljIGludCBmY29lX3Jlc2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK3N0YXRpYyBpbnQgZmNvZV9yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwogc3RhdGljIGludCBmY29lX3htaXQoc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBmY19mcmFtZSAqKTsKIHN0YXRpYyBpbnQgZmNvZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKiwKIAkJICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyBpbnQgZmNvZV9wZXJjcHVfcmVjZWl2ZV90aHJlYWQodm9pZCAqYXJnKTsKLXN0YXRpYyB2b2lkIGZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShzdHJ1Y3QgZmNfbHBvcnQgKmxwKTsKLXN0YXRpYyB2b2lkIGZjb2VfcGVyY3B1X2NsZWFuKHN0cnVjdCBmY19scG9ydCAqbHApOwotc3RhdGljIGludCBmY29lX2xpbmtfb2soc3RydWN0IGZjX2xwb3J0ICpscCk7CitzdGF0aWMgaW50IGZjb2VfcGVyY3B1X3JlY2VpdmVfdGhyZWFkKHZvaWQgKik7CitzdGF0aWMgdm9pZCBmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUoc3RydWN0IGZjX2xwb3J0ICopOworc3RhdGljIHZvaWQgZmNvZV9wZXJjcHVfY2xlYW4oc3RydWN0IGZjX2xwb3J0ICopOworc3RhdGljIGludCBmY29lX2xpbmtfb2soc3RydWN0IGZjX2xwb3J0ICopOwogCiBzdGF0aWMgc3RydWN0IGZjX2xwb3J0ICpmY29lX2hvc3RsaXN0X2xvb2t1cChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyBpbnQgZmNvZV9ob3N0bGlzdF9hZGQoY29uc3Qgc3RydWN0IGZjX2xwb3J0ICopOwpAQCAtODIsMTUgKzgyLDY5IEBACiBzdGF0aWMgaW50IGZjb2VfZGV2aWNlX25vdGlmaWNhdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdWxvbmcsIHZvaWQgKik7CiBzdGF0aWMgdm9pZCBmY29lX2Rldl9zZXR1cCh2b2lkKTsKIHN0YXRpYyB2b2lkIGZjb2VfZGV2X2NsZWFudXAodm9pZCk7Ci1zdGF0aWMgc3RydWN0IGZjb2VfaW50ZXJmYWNlICoKLQlmY29lX2hvc3RsaXN0X2xvb2t1cF9wb3J0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBmY29lX2ludGVyZmFjZQorKmZjb2VfaG9zdGxpc3RfbG9va3VwX3BvcnQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKik7CiAKLS8qIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiBmcm9tIG5ldCBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgZmNvZV9maXBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJIHN0cnVjdCBwYWNrZXRfdHlwZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworc3RhdGljIHZvaWQgZmNvZV9maXBfc2VuZChzdHJ1Y3QgZmNvZV9jdGxyICosIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgZmNvZV91cGRhdGVfc3JjX21hYyhzdHJ1Y3QgZmNfbHBvcnQgKiwgdTggKik7CitzdGF0aWMgdTggKmZjb2VfZ2V0X3NyY19tYWMoc3RydWN0IGZjX2xwb3J0ICopOworc3RhdGljIHZvaWQgZmNvZV9kZXN0cm95X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOworCitzdGF0aWMgaW50IGZjb2VfZGRwX3NldHVwKHN0cnVjdCBmY19scG9ydCAqLCB1MTYsIHN0cnVjdCBzY2F0dGVybGlzdCAqLAorCQkJICB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBmY29lX2RkcF9kb25lKHN0cnVjdCBmY19scG9ydCAqLCB1MTYpOworCitzdGF0aWMgaW50IGZjb2VfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOworCitzdGF0aWMgaW50IGZjb2VfY3JlYXRlKGNvbnN0IGNoYXIgKiwgc3RydWN0IGtlcm5lbF9wYXJhbSAqKTsKK3N0YXRpYyBpbnQgZmNvZV9kZXN0cm95KGNvbnN0IGNoYXIgKiwgc3RydWN0IGtlcm5lbF9wYXJhbSAqKTsKKworc3RhdGljIHN0cnVjdCBmY19zZXEgKmZjb2VfZWxzY3Rfc2VuZChzdHJ1Y3QgZmNfbHBvcnQgKiwKKwkJCQkgICAgICB1MzIgZGlkLCBzdHJ1Y3QgZmNfZnJhbWUgKiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgb3AsCisJCQkJICAgICAgdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwKKwkJCQkJCSAgIHN0cnVjdCBmY19mcmFtZSAqLAorCQkJCQkJICAgdm9pZCAqKSwKKwkJCQkgICAgICB2b2lkICosIHUzMiB0aW1lb3V0KTsKK3N0YXRpYyB2b2lkIGZjb2VfcmVjdl9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIHZvaWQgZmNvZV9nZXRfbGVzYihzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjX2Vsc19sZXNiICopOworCittb2R1bGVfcGFyYW1fY2FsbChjcmVhdGUsIGZjb2VfY3JlYXRlLCBOVUxMLCBOVUxMLCBTX0lXVVNSKTsKK19fTU9EVUxFX1BBUk1fVFlQRShjcmVhdGUsICJzdHJpbmciKTsKK01PRFVMRV9QQVJNX0RFU0MoY3JlYXRlLCAiQ3JlYXRlIGZjb2UgZmNvZSB1c2luZyBuZXQgZGV2aWNlIHBhc3NlZCBpbi4iKTsKK21vZHVsZV9wYXJhbV9jYWxsKGRlc3Ryb3ksIGZjb2VfZGVzdHJveSwgTlVMTCwgTlVMTCwgU19JV1VTUik7CitfX01PRFVMRV9QQVJNX1RZUEUoZGVzdHJveSwgInN0cmluZyIpOworTU9EVUxFX1BBUk1fREVTQyhkZXN0cm95LCAiRGVzdHJveSBmY29lIGZjb2UiKTsKKworLyogbm90aWZpY2F0aW9uIGZ1bmN0aW9uIGZvciBwYWNrZXRzIGZyb20gbmV0IGRldmljZSAqLwogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmY29lX25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gZmNvZV9kZXZpY2Vfbm90aWZpY2F0aW9uLAogfTsKIAotc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqc2NzaV90cmFuc3BvcnRfZmNvZV9zdzsKKy8qIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiBmb3IgQ1BVIGhvdHBsdWcgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZjb2VfY3B1X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gZmNvZV9jcHVfY2FsbGJhY2ssCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpmY29lX3RyYW5zcG9ydF90ZW1wbGF0ZTsKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmZjb2VfdnBvcnRfdHJhbnNwb3J0X3RlbXBsYXRlOworCitzdGF0aWMgaW50IGZjb2VfdnBvcnRfZGVzdHJveShzdHJ1Y3QgZmNfdnBvcnQgKik7CitzdGF0aWMgaW50IGZjb2VfdnBvcnRfY3JlYXRlKHN0cnVjdCBmY192cG9ydCAqLCBib29sIGRpc2FibGVkKTsKK3N0YXRpYyBpbnQgZmNvZV92cG9ydF9kaXNhYmxlKHN0cnVjdCBmY192cG9ydCAqLCBib29sIGRpc2FibGUpOworc3RhdGljIHZvaWQgZmNvZV9zZXRfdnBvcnRfc3ltYm9saWNfbmFtZShzdHJ1Y3QgZmNfdnBvcnQgKik7CisKK3N0YXRpYyBzdHJ1Y3QgbGliZmNfZnVuY3Rpb25fdGVtcGxhdGUgZmNvZV9saWJmY19mY25fdGVtcGwgPSB7CisJLmZyYW1lX3NlbmQgPSBmY29lX3htaXQsCisJLmRkcF9zZXR1cCA9IGZjb2VfZGRwX3NldHVwLAorCS5kZHBfZG9uZSA9IGZjb2VfZGRwX2RvbmUsCisJLmVsc2N0X3NlbmQgPSBmY29lX2Vsc2N0X3NlbmQsCisJLmdldF9sZXNiID0gZmNvZV9nZXRfbGVzYiwKK307CiAKIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBmY29lX3RyYW5zcG9ydF9mdW5jdGlvbiA9IHsKIAkuc2hvd19ob3N0X25vZGVfbmFtZSA9IDEsCkBAIC0xMjMsNiArMTc3LDQ4IEBACiAJLmlzc3VlX2ZjX2hvc3RfbGlwID0gZmNvZV9yZXNldCwKIAogCS50ZXJtaW5hdGVfcnBvcnRfaW8gPSBmY19ycG9ydF90ZXJtaW5hdGVfaW8sCisKKwkudnBvcnRfY3JlYXRlID0gZmNvZV92cG9ydF9jcmVhdGUsCisJLnZwb3J0X2RlbGV0ZSA9IGZjb2VfdnBvcnRfZGVzdHJveSwKKwkudnBvcnRfZGlzYWJsZSA9IGZjb2VfdnBvcnRfZGlzYWJsZSwKKwkuc2V0X3Zwb3J0X3N5bWJvbGljX25hbWUgPSBmY29lX3NldF92cG9ydF9zeW1ib2xpY19uYW1lLAorCisJLmJzZ19yZXF1ZXN0ID0gZmNfbHBvcnRfYnNnX3JlcXVlc3QsCit9OworCitzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgZmNvZV92cG9ydF90cmFuc3BvcnRfZnVuY3Rpb24gPSB7CisJLnNob3dfaG9zdF9ub2RlX25hbWUgPSAxLAorCS5zaG93X2hvc3RfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9mYzRzID0gMSwKKwkuc2hvd19ob3N0X2FjdGl2ZV9mYzRzID0gMSwKKwkuc2hvd19ob3N0X21heGZyYW1lX3NpemUgPSAxLAorCisJLnNob3dfaG9zdF9wb3J0X2lkID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9zcGVlZHMgPSAxLAorCS5nZXRfaG9zdF9zcGVlZCA9IGZjX2dldF9ob3N0X3NwZWVkLAorCS5zaG93X2hvc3Rfc3BlZWQgPSAxLAorCS5zaG93X2hvc3RfcG9ydF90eXBlID0gMSwKKwkuZ2V0X2hvc3RfcG9ydF9zdGF0ZSA9IGZjX2dldF9ob3N0X3BvcnRfc3RhdGUsCisJLnNob3dfaG9zdF9wb3J0X3N0YXRlID0gMSwKKwkuc2hvd19ob3N0X3N5bWJvbGljX25hbWUgPSAxLAorCisJLmRkX2ZjcnBvcnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiksCisJLnNob3dfcnBvcnRfbWF4ZnJhbWVfc2l6ZSA9IDEsCisJLnNob3dfcnBvcnRfc3VwcG9ydGVkX2NsYXNzZXMgPSAxLAorCisJLnNob3dfaG9zdF9mYWJyaWNfbmFtZSA9IDEsCisJLnNob3dfc3RhcmdldF9ub2RlX25hbWUgPSAxLAorCS5zaG93X3N0YXJnZXRfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19zdGFyZ2V0X3BvcnRfaWQgPSAxLAorCS5zZXRfcnBvcnRfZGV2X2xvc3NfdG1vID0gZmNfc2V0X3Jwb3J0X2xvc3NfdG1vLAorCS5zaG93X3Jwb3J0X2Rldl9sb3NzX3RtbyA9IDEsCisJLmdldF9mY19ob3N0X3N0YXRzID0gZmNfZ2V0X2hvc3Rfc3RhdHMsCisJLmlzc3VlX2ZjX2hvc3RfbGlwID0gZmNvZV9yZXNldCwKKworCS50ZXJtaW5hdGVfcnBvcnRfaW8gPSBmY19ycG9ydF90ZXJtaW5hdGVfaW8sCisKKwkuYnNnX3JlcXVlc3QgPSBmY19scG9ydF9ic2dfcmVxdWVzdCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGZjb2Vfc2hvc3RfdGVtcGxhdGUgPSB7CkBAIC0xMzcsMjAgKzIzMywxNyBAQAogCS5jaGFuZ2VfcXVldWVfZGVwdGggPSBmY19jaGFuZ2VfcXVldWVfZGVwdGgsCiAJLmNoYW5nZV9xdWV1ZV90eXBlID0gZmNfY2hhbmdlX3F1ZXVlX3R5cGUsCiAJLnRoaXNfaWQgPSAtMSwKLQkuY21kX3Blcl9sdW4gPSAzMiwKKwkuY21kX3Blcl9sdW4gPSAzLAogCS5jYW5fcXVldWUgPSBGQ09FX01BWF9PVVRTVEFORElOR19DT01NQU5EUywKIAkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuc2dfdGFibGVzaXplID0gU0dfQUxMLAogCS5tYXhfc2VjdG9ycyA9IDB4ZmZmZiwKIH07CiAKLXN0YXRpYyBpbnQgZmNvZV9maXBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUsCi0JCQkgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KTsKIC8qKgotICogZmNvZV9pbnRlcmZhY2Vfc2V0dXAoKQotICogQGZjb2U6IG5ldyBmY29lX2ludGVyZmFjZQotICogQG5ldGRldiA6IHB0ciB0byB0aGUgYXNzb2NpYXRlZCBuZXRkZXZpY2Ugc3RydWN0CisgKiBmY29lX2ludGVyZmFjZV9zZXR1cCgpIC0gU2V0dXAgYSBGQ29FIGludGVyZmFjZQorICogQGZjb2U6ICAgVGhlIG5ldyBGQ29FIGludGVyZmFjZQorICogQG5ldGRldjogVGhlIG5ldCBkZXZpY2UgdGhhdCB0aGUgZmNvZSBpbnRlcmZhY2UgaXMgb24KICAqCiAgKiBSZXR1cm5zIDogMCBmb3Igc3VjY2VzcwogICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgUlROTCBtdXRleCBoZWxkCkBAIC0xNjAsMjMgKzI1MywzNiBAQAogewogCXN0cnVjdCBmY29lX2N0bHIgKmZpcCA9ICZmY29lLT5jdGxyOwogCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2OwogCXU4IGZsb2dpX21hZGRyW0VUSF9BTEVOXTsKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wczsKIAogCWZjb2UtPm5ldGRldiA9IG5ldGRldjsKIAorCS8qIExldCBMTEQgaW5pdGlhbGl6ZSBmb3IgRkNvRSAqLworCW9wcyA9IG5ldGRldi0+bmV0ZGV2X29wczsKKwlpZiAob3BzLT5uZG9fZmNvZV9lbmFibGUpIHsKKwkJaWYgKG9wcy0+bmRvX2Zjb2VfZW5hYmxlKG5ldGRldikpCisJCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBGQ29FIgorCQkJCQkiIHNwZWNpZmljIGZlYXR1cmUgZm9yIExMRC5cbiIpOworCX0KKwogCS8qIERvIG5vdCBzdXBwb3J0IGZvciBib25kaW5nIGRldmljZSAqLwogCWlmICgobmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGX01BU1RFUl9BTEIpIHx8CiAJICAgIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfU0xBVkVfSU5BQ1RJVkUpIHx8CiAJICAgIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfTUFTVEVSXzgwMjNBRCkpIHsKKwkJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIkJvbmRlZCBpbnRlcmZhY2VzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCiAJLyogbG9vayBmb3IgU0FOIE1BQyBhZGRyZXNzLCBpZiBtdWx0aXBsZSBTQU4gTUFDcyBleGlzdCwgb25seQogCSAqIHVzZSB0aGUgZmlyc3Qgb25lIGZvciBTUE1BICovCisJcmVhbF9kZXYgPSAobmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKSA/CisJCXZsYW5fZGV2X3JlYWxfZGV2KG5ldGRldikgOiBuZXRkZXY7CiAJcmN1X3JlYWRfbG9jaygpOwotCWZvcl9lYWNoX2Rldl9hZGRyKG5ldGRldiwgaGEpIHsKKwlmb3JfZWFjaF9kZXZfYWRkcihyZWFsX2RldiwgaGEpIHsKIAkJaWYgKChoYS0+dHlwZSA9PSBORVRERVZfSFdfQUREUl9UX1NBTikgJiYKLQkJICAgIChpc192YWxpZF9ldGhlcl9hZGRyKGZpcC0+Y3RsX3NyY19hZGRyKSkpIHsKKwkJICAgIChpc192YWxpZF9ldGhlcl9hZGRyKGhhLT5hZGRyKSkpIHsKIAkJCW1lbWNweShmaXAtPmN0bF9zcmNfYWRkciwgaGEtPmFkZHIsIEVUSF9BTEVOKTsKIAkJCWZpcC0+c3BtYSA9IDE7CiAJCQlicmVhazsKQEAgLTIxNiwxOSArMzIyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZjb2VfZmlwX3NlbmQoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyB2b2lkIGZjb2VfdXBkYXRlX3NyY19tYWMoc3RydWN0IGZjb2VfY3RsciAqZmlwLCB1OCAqb2xkLCB1OCAqbmV3KTsKLXN0YXRpYyB2b2lkIGZjb2VfZGVzdHJveV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KIC8qKgotICogZmNvZV9pbnRlcmZhY2VfY3JlYXRlKCkKLSAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlCisgKiBmY29lX2ludGVyZmFjZV9jcmVhdGUoKSAtIENyZWF0ZSBhIEZDb0UgaW50ZXJmYWNlIG9uIGEgbmV0IGRldmljZQorICogQG5ldGRldjogVGhlIG5ldCBkZXZpY2UgdG8gY3JlYXRlIHRoZSBGQ29FIGludGVyZmFjZSBvbgogICoKICAqIFJldHVybnM6IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2Ugb3IgTlVMTCBvbiBlcnJvcgogICovCiBzdGF0aWMgc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lX2ludGVyZmFjZV9jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2U7CisJaW50IGVycjsKIAogCWZjb2UgPSBremFsbG9jKHNpemVvZigqZmNvZSksIEdGUF9LRVJORUwpOwogCWlmICghZmNvZSkgewpAQCAtMjQ1LDE1ICszNDgsMjIgQEAKIAlmY29lX2N0bHJfaW5pdCgmZmNvZS0+Y3Rscik7CiAJZmNvZS0+Y3Rsci5zZW5kID0gZmNvZV9maXBfc2VuZDsKIAlmY29lLT5jdGxyLnVwZGF0ZV9tYWMgPSBmY29lX3VwZGF0ZV9zcmNfbWFjOworCWZjb2UtPmN0bHIuZ2V0X3NyY19hZGRyID0gZmNvZV9nZXRfc3JjX21hYzsKIAotCWZjb2VfaW50ZXJmYWNlX3NldHVwKGZjb2UsIG5ldGRldik7CisJZXJyID0gZmNvZV9pbnRlcmZhY2Vfc2V0dXAoZmNvZSwgbmV0ZGV2KTsKKwlpZiAoZXJyKSB7CisJCWZjb2VfY3Rscl9kZXN0cm95KCZmY29lLT5jdGxyKTsKKwkJa2ZyZWUoZmNvZSk7CisJCWRldl9wdXQobmV0ZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJcmV0dXJuIGZjb2U7CiB9CiAKIC8qKgotICogZmNvZV9pbnRlcmZhY2VfY2xlYW51cCgpIC0gY2xlYW4gdXAgbmV0ZGV2IGNvbmZpZ3VyYXRpb25zCi0gKiBAZmNvZToKKyAqIGZjb2VfaW50ZXJmYWNlX2NsZWFudXAoKSAtIENsZWFuIHVwIGEgRkNvRSBpbnRlcmZhY2UKKyAqIEBmY29lOiBUaGUgRkNvRSBpbnRlcmZhY2UgdG8gYmUgY2xlYW5lZCB1cAogICoKICAqIENhbGxlciBtdXN0IGJlIGhvbGRpbmcgdGhlIFJUTkwgbXV0ZXgKICAqLwpAQCAtMjYyLDYgKzM3Miw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2UtPm5ldGRldjsKIAlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSAmZmNvZS0+Y3RscjsKIAl1OCBmbG9naV9tYWRkcltFVEhfQUxFTl07CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHM7CiAKIAkvKgogCSAqIERvbid0IGxpc3RlbiBmb3IgRXRoZXJuZXQgcGFja2V0cyBhbnltb3JlLgpAQCAtMjc2LDE2ICszODcsMjIgQEAKIAkvKiBEZWxldGUgc2Vjb25kYXJ5IE1BQyBhZGRyZXNzZXMgKi8KIAltZW1jcHkoZmxvZ2lfbWFkZHIsICh1OFs2XSkgRkNfRkNPRV9GTE9HSV9NQUMsIEVUSF9BTEVOKTsKIAlkZXZfdW5pY2FzdF9kZWxldGUobmV0ZGV2LCBmbG9naV9tYWRkcik7Ci0JaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIoZmlwLT5kYXRhX3NyY19hZGRyKSkKLQkJZGV2X3VuaWNhc3RfZGVsZXRlKG5ldGRldiwgZmlwLT5kYXRhX3NyY19hZGRyKTsKIAlpZiAoZmlwLT5zcG1hKQogCQlkZXZfdW5pY2FzdF9kZWxldGUobmV0ZGV2LCBmaXAtPmN0bF9zcmNfYWRkcik7CiAJZGV2X21jX2RlbGV0ZShuZXRkZXYsIEZJUF9BTExfRU5PREVfTUFDUywgRVRIX0FMRU4sIDApOworCisJLyogVGVsbCB0aGUgTExEIHdlIGFyZSBkb25lIHcvIEZDb0UgKi8KKwlvcHMgPSBuZXRkZXYtPm5ldGRldl9vcHM7CisJaWYgKG9wcy0+bmRvX2Zjb2VfZGlzYWJsZSkgeworCQlpZiAob3BzLT5uZG9fZmNvZV9kaXNhYmxlKG5ldGRldikpCisJCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiRmFpbGVkIHRvIGRpc2FibGUgRkNvRSIKKwkJCQkJIiBzcGVjaWZpYyBmZWF0dXJlIGZvciBMTEQuXG4iKTsKKwl9CiB9CiAKIC8qKgogICogZmNvZV9pbnRlcmZhY2VfcmVsZWFzZSgpIC0gZmNvZV9wb3J0IGtyZWYgcmVsZWFzZSBmdW5jdGlvbgotICogQGtyZWY6IGVtYmVkZGVkIHJlZmVyZW5jZSBjb3VudCBpbiBhbiBmY29lX2ludGVyZmFjZSBzdHJ1Y3QKKyAqIEBrcmVmOiBFbWJlZGRlZCByZWZlcmVuY2UgY291bnQgaW4gYW4gZmNvZV9pbnRlcmZhY2Ugc3RydWN0CiAgKi8KIHN0YXRpYyB2b2lkIGZjb2VfaW50ZXJmYWNlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCiB7CkBAIC0zMDEsOCArNDE4LDggQEAKIH0KIAogLyoqCi0gKiBmY29lX2ludGVyZmFjZV9nZXQoKQotICogQGZjb2U6CisgKiBmY29lX2ludGVyZmFjZV9nZXQoKSAtIEdldCBhIHJlZmVyZW5jZSB0byBhIEZDb0UgaW50ZXJmYWNlCisgKiBAZmNvZTogVGhlIEZDb0UgaW50ZXJmYWNlIHRvIGJlIGhlbGQKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGZjb2VfaW50ZXJmYWNlX2dldChzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2UpCiB7CkBAIC0zMTAsOCArNDI3LDggQEAKIH0KIAogLyoqCi0gKiBmY29lX2ludGVyZmFjZV9wdXQoKQotICogQGZjb2U6CisgKiBmY29lX2ludGVyZmFjZV9wdXQoKSAtIFB1dCBhIHJlZmVyZW5jZSB0byBhIEZDb0UgaW50ZXJmYWNlCisgKiBAZmNvZTogVGhlIEZDb0UgaW50ZXJmYWNlIHRvIGJlIHJlbGVhc2VkCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmY29lX2ludGVyZmFjZV9wdXQoc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lKQogewpAQCAtMzE5LDE1ICs0MzYsMTYgQEAKIH0KIAogLyoqCi0gKiBmY29lX2ZpcF9yZWN2IC0gaGFuZGxlIGEgcmVjZWl2ZWQgRklQIGZyYW1lLgotICogQHNrYjogdGhlIHJlY2VpdmUgc2tiCi0gKiBAZGV2OiBhc3NvY2lhdGVkICZuZXRfZGV2aWNlCi0gKiBAcHR5cGU6IHRoZSAmcGFja2V0X3R5cGUgc3RydWN0dXJlIHdoaWNoIHdhcyB1c2VkIHRvIHJlZ2lzdGVyIHRoaXMgaGFuZGxlci4KLSAqIEBvcmlnX2Rldjogb3JpZ2luYWwgcmVjZWl2ZSAmbmV0X2RldmljZSwgaW4gY2FzZSBAZGV2IGlzIGEgYm9uZC4KKyAqIGZjb2VfZmlwX3JlY3YoKSAtIEhhbmRsZXIgZm9yIHJlY2VpdmVkIEZJUCBmcmFtZXMKKyAqIEBza2I6ICAgICAgVGhlIHJlY2VpdmUgc2tiCisgKiBAbmV0ZGV2OiAgIFRoZSBhc3NvY2lhdGVkIG5ldCBkZXZpY2UKKyAqIEBwdHlwZTogICAgVGhlIHBhY2tldF90eXBlIHN0cnVjdHVyZSB3aGljaCB3YXMgdXNlZCB0byByZWdpc3RlciB0aGlzIGhhbmRsZXIKKyAqIEBvcmlnX2RldjogVGhlIG9yaWdpbmFsIG5ldF9kZXZpY2UgdGhlIHRoZSBza2Igd2FzIHJlY2VpdmVkIG9uLgorICoJICAgICAgKGluIGNhc2UgZGV2IGlzIGEgYm9uZCkKICAqCiAgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCiAgKi8KLXN0YXRpYyBpbnQgZmNvZV9maXBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBmY29lX2ZpcF9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSwKIAkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCiB7CkBAIC0zMzksOSArNDU3LDkgQEAKIH0KIAogLyoqCi0gKiBmY29lX2ZpcF9zZW5kKCkgLSBzZW5kIGFuIEV0aGVybmV0LWVuY2Fwc3VsYXRlZCBGSVAgZnJhbWUuCi0gKiBAZmlwOiBGQ29FIGNvbnRyb2xsZXIuCi0gKiBAc2tiOiBGSVAgUGFja2V0LgorICogZmNvZV9maXBfc2VuZCgpIC0gU2VuZCBhbiBFdGhlcm5ldC1lbmNhcHN1bGF0ZWQgRklQIGZyYW1lCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKiBAc2tiOiBUaGUgRklQIHBhY2tldCB0byBiZSBzZW50CiAgKi8KIHN0YXRpYyB2b2lkIGZjb2VfZmlwX3NlbmQoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMzUwLDg4ICs0NjgsMTAxIEBACiB9CiAKIC8qKgotICogZmNvZV91cGRhdGVfc3JjX21hYygpIC0gVXBkYXRlIEV0aGVybmV0IE1BQyBmaWx0ZXJzLgotICogQGZpcDogRkNvRSBjb250cm9sbGVyLgotICogQG9sZDogVW5pY2FzdCBNQUMgYWRkcmVzcyB0byBkZWxldGUgaWYgdGhlIE1BQyBpcyBub24temVyby4KLSAqIEBuZXc6IFVuaWNhc3QgTUFDIGFkZHJlc3MgdG8gYWRkLgorICogZmNvZV91cGRhdGVfc3JjX21hYygpIC0gVXBkYXRlIHRoZSBFdGhlcm5ldCBNQUMgZmlsdGVycworICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byB1cGRhdGUgdGhlIHNvdXJjZSBNQUMgb24KKyAqIEBhZGRyOiAgVW5pY2FzdCBNQUMgYWRkcmVzcyB0byBhZGQKICAqCiAgKiBSZW1vdmUgYW55IHByZXZpb3VzbHktc2V0IHVuaWNhc3QgTUFDIGZpbHRlci4KICAqIEFkZCBzZWNvbmRhcnkgRkNvRSBNQUMgYWRkcmVzcyBmaWx0ZXIgZm9yIG91ciBPVUkuCiAgKi8KLXN0YXRpYyB2b2lkIGZjb2VfdXBkYXRlX3NyY19tYWMoc3RydWN0IGZjb2VfY3RsciAqZmlwLCB1OCAqb2xkLCB1OCAqbmV3KQorc3RhdGljIHZvaWQgZmNvZV91cGRhdGVfc3JjX21hYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCB1OCAqYWRkcikKIHsKLQlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2U7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOworCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZSA9IHBvcnQtPmZjb2U7CiAKLQlmY29lID0gZmNvZV9mcm9tX2N0bHIoZmlwKTsKIAlydG5sX2xvY2soKTsKLQlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihvbGQpKQotCQlkZXZfdW5pY2FzdF9kZWxldGUoZmNvZS0+bmV0ZGV2LCBvbGQpOwotCWRldl91bmljYXN0X2FkZChmY29lLT5uZXRkZXYsIG5ldyk7CisJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIocG9ydC0+ZGF0YV9zcmNfYWRkcikpCisJCWRldl91bmljYXN0X2RlbGV0ZShmY29lLT5uZXRkZXYsIHBvcnQtPmRhdGFfc3JjX2FkZHIpOworCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGFkZHIpKQorCQlkZXZfdW5pY2FzdF9hZGQoZmNvZS0+bmV0ZGV2LCBhZGRyKTsKKwltZW1jcHkocG9ydC0+ZGF0YV9zcmNfYWRkciwgYWRkciwgRVRIX0FMRU4pOwogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKIC8qKgotICogZmNvZV9scG9ydF9jb25maWcoKSAtIHNldHMgdXAgdGhlIGZjX2xwb3J0Ci0gKiBAbHA6IHB0ciB0byB0aGUgZmNfbHBvcnQKKyAqIGZjb2VfZ2V0X3NyY19tYWMoKSAtIHJldHVybiB0aGUgRXRoZXJuZXQgc291cmNlIGFkZHJlc3MgZm9yIGFuIGxwb3J0CisgKiBAbHBvcnQ6IGxpYmZjIGxwb3J0CisgKi8KK3N0YXRpYyB1OCAqZmNvZV9nZXRfc3JjX21hYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKKworCXJldHVybiBwb3J0LT5kYXRhX3NyY19hZGRyOworfQorCisvKioKKyAqIGZjb2VfbHBvcnRfY29uZmlnKCkgLSBTZXQgdXAgYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIGJlIHNldHVwCiAgKgogICogUmV0dXJuczogMCBmb3Igc3VjY2VzcwogICovCi1zdGF0aWMgaW50IGZjb2VfbHBvcnRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHApCitzdGF0aWMgaW50IGZjb2VfbHBvcnRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7Ci0JbHAtPmxpbmtfdXAgPSAwOwotCWxwLT5xZnVsbCA9IDA7Ci0JbHAtPm1heF9yZXRyeV9jb3VudCA9IDM7Ci0JbHAtPm1heF9ycG9ydF9yZXRyeV9jb3VudCA9IDM7Ci0JbHAtPmVfZF90b3YgPSAyICogMTAwMDsJLyogRkMtRlMgZGVmYXVsdCAqLwotCWxwLT5yX2FfdG92ID0gMiAqIDIgKiAxMDAwOwotCWxwLT5zZXJ2aWNlX3BhcmFtcyA9IChGQ1BfU1BQRl9JTklUX0ZDTiB8IEZDUF9TUFBGX1JEX1hSRFlfRElTIHwKLQkJCSAgICAgIEZDUF9TUFBGX1JFVFJZIHwgRkNQX1NQUEZfQ09ORl9DT01QTCk7CisJbHBvcnQtPmxpbmtfdXAgPSAwOworCWxwb3J0LT5xZnVsbCA9IDA7CisJbHBvcnQtPm1heF9yZXRyeV9jb3VudCA9IDM7CisJbHBvcnQtPm1heF9ycG9ydF9yZXRyeV9jb3VudCA9IDM7CisJbHBvcnQtPmVfZF90b3YgPSAyICogMTAwMDsJLyogRkMtRlMgZGVmYXVsdCAqLworCWxwb3J0LT5yX2FfdG92ID0gMiAqIDIgKiAxMDAwOworCWxwb3J0LT5zZXJ2aWNlX3BhcmFtcyA9IChGQ1BfU1BQRl9JTklUX0ZDTiB8IEZDUF9TUFBGX1JEX1hSRFlfRElTIHwKKwkJCQkgRkNQX1NQUEZfUkVUUlkgfCBGQ1BfU1BQRl9DT05GX0NPTVBMKTsKKwlscG9ydC0+ZG9lc19ucGl2ID0gMTsKIAotCWZjX2xwb3J0X2luaXRfc3RhdHMobHApOworCWZjX2xwb3J0X2luaXRfc3RhdHMobHBvcnQpOwogCiAJLyogbHBvcnQgZmNfbHBvcnQgcmVsYXRlZCBjb25maWd1cmF0aW9uICovCi0JZmNfbHBvcnRfY29uZmlnKGxwKTsKKwlmY19scG9ydF9jb25maWcobHBvcnQpOwogCiAJLyogb2ZmbG9hZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gKi8KLQlscC0+Y3JjX29mZmxvYWQgPSAwOwotCWxwLT5zZXFfb2ZmbG9hZCA9IDA7Ci0JbHAtPmxyb19lbmFibGVkID0gMDsKLQlscC0+bHJvX3hpZCA9IDA7Ci0JbHAtPmxzb19tYXggPSAwOworCWxwb3J0LT5jcmNfb2ZmbG9hZCA9IDA7CisJbHBvcnQtPnNlcV9vZmZsb2FkID0gMDsKKwlscG9ydC0+bHJvX2VuYWJsZWQgPSAwOworCWxwb3J0LT5scm9feGlkID0gMDsKKwlscG9ydC0+bHNvX21heCA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBmY29lX3F1ZXVlX3RpbWVyKCkgLSBmY29lIHF1ZXVlIHRpbWVyCi0gKiBAbHA6IHRoZSBmY19scG9ydCBwb2ludGVyCisgKiBmY29lX3F1ZXVlX3RpbWVyKCkgLSBUaGUgZmNvZSBxdWV1ZSB0aW1lcgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydAogICoKICAqIENhbGxzIGZjb2VfY2hlY2tfd2FpdF9xdWV1ZSBvbiB0aW1lb3V0Ci0gKgogICovCi1zdGF0aWMgdm9pZCBmY29lX3F1ZXVlX3RpbWVyKHVsb25nIGxwKQorc3RhdGljIHZvaWQgZmNvZV9xdWV1ZV90aW1lcih1bG9uZyBscG9ydCkKIHsKLQlmY29lX2NoZWNrX3dhaXRfcXVldWUoKHN0cnVjdCBmY19scG9ydCAqKWxwLCBOVUxMKTsKKwlmY29lX2NoZWNrX3dhaXRfcXVldWUoKHN0cnVjdCBmY19scG9ydCAqKWxwb3J0LCBOVUxMKTsKIH0KIAogLyoqCi0gKiBmY29lX25ldGRldl9jb25maWcoKSAtIFNldCB1cCBuZXRkZXYgZm9yIFNXIEZDb0UKLSAqIEBscCA6IHB0ciB0byB0aGUgZmNfbHBvcnQKLSAqIEBuZXRkZXYgOiBwdHIgdG8gdGhlIGFzc29jaWF0ZWQgbmV0ZGV2aWNlIHN0cnVjdAorICogZmNvZV9uZXRkZXZfY29uZmlnKCkgLSBTZXQgdXAgbmV0IGRldml2ZSBmb3IgU1cgRkNvRQorICogQGxwb3J0OiAgVGhlIGxvY2FsIHBvcnQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBkZXZpY2UKKyAqIEBuZXRkZXY6IFRoZSBhc3NvY2lhdGVkIG5ldCBkZXZpY2UKICAqCi0gKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBmY29lX2xwb3J0X2NvbmZpZygpIGFzIGl0IHdpbGwgdXNlIGxwb3J0IG11dGV4CisgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBmY29lX2xwb3J0X2NvbmZpZygpIGFzIGl0IHdpbGwgdXNlIGxvY2FsIHBvcnQgbXV0ZXgKICAqCi0gKiBSZXR1cm5zIDogMCBmb3Igc3VjY2VzcworICogUmV0dXJuczogMCBmb3Igc3VjY2VzcwogICovCi1zdGF0aWMgaW50IGZjb2VfbmV0ZGV2X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIGludCBmY29lX25ldGRldl9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAl1MzIgbWZzOwogCXU2NCB3d25uLCB3d3BuOwogCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OworCWludCB2aWQgPSAwOwogCiAJLyogU2V0dXAgbHBvcnQgcHJpdmF0ZSBkYXRhIHRvIHBvaW50IHRvIGZjb2Ugc29mdGMgKi8KLQlwb3J0ID0gbHBvcnRfcHJpdihscCk7CisJcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwogCWZjb2UgPSBwb3J0LT5mY29lOwogCiAJLyoKQEAgLTQzOSw4NiArNTcwLDExMiBAQAogCSAqIHVzZXItY29uZmlndXJlZCBsaW1pdC4gIElmIHRoZSBNRlMgaXMgdG9vIGxvdywgZmNvZV9saW5rX29rKCkKIAkgKiB3aWxsIHJldHVybiAwLCBzbyBkbyB0aGlzIGZpcnN0LgogCSAqLwotCW1mcyA9IG5ldGRldi0+bXR1IC0gKHNpemVvZihzdHJ1Y3QgZmNvZV9oZHIpICsKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBmY29lX2NyY19lb2YpKTsKLQlpZiAoZmNfc2V0X21mcyhscCwgbWZzKSkKKwltZnMgPSBuZXRkZXYtPm10dTsKKwlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfRkNPRV9NVFUpIHsKKwkJbWZzID0gRkNPRV9NVFU7CisJCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJTdXBwb3J0cyBGQ09FX01UVSBvZiAlZCBieXRlc1xuIiwgbWZzKTsKKwl9CisJbWZzIC09IChzaXplb2Yoc3RydWN0IGZjb2VfaGRyKSArIHNpemVvZihzdHJ1Y3QgZmNvZV9jcmNfZW9mKSk7CisJaWYgKGZjX3NldF9tZnMobHBvcnQsIG1mcykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogb2ZmbG9hZCBmZWF0dXJlcyBzdXBwb3J0ICovCiAJaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKQotCQlscC0+c2dfc3VwcCA9IDE7CisJCWxwb3J0LT5zZ19zdXBwID0gMTsKIAogCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GQ09FX0NSQykgewotCQlscC0+Y3JjX29mZmxvYWQgPSAxOworCQlscG9ydC0+Y3JjX29mZmxvYWQgPSAxOwogCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiU3VwcG9ydHMgRkNDUkMgb2ZmbG9hZFxuIik7CiAJfQogCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GU08pIHsKLQkJbHAtPnNlcV9vZmZsb2FkID0gMTsKLQkJbHAtPmxzb19tYXggPSBuZXRkZXYtPmdzb19tYXhfc2l6ZTsKKwkJbHBvcnQtPnNlcV9vZmZsb2FkID0gMTsKKwkJbHBvcnQtPmxzb19tYXggPSBuZXRkZXYtPmdzb19tYXhfc2l6ZTsKIAkJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIlN1cHBvcnRzIExTTyBmb3IgbWF4IGxlbiAweCV4XG4iLAotCQkJCWxwLT5sc29fbWF4KTsKKwkJCQlscG9ydC0+bHNvX21heCk7CiAJfQogCWlmIChuZXRkZXYtPmZjb2VfZGRwX3hpZCkgewotCQlscC0+bHJvX2VuYWJsZWQgPSAxOwotCQlscC0+bHJvX3hpZCA9IG5ldGRldi0+ZmNvZV9kZHBfeGlkOworCQlscG9ydC0+bHJvX2VuYWJsZWQgPSAxOworCQlscG9ydC0+bHJvX3hpZCA9IG5ldGRldi0+ZmNvZV9kZHBfeGlkOwogCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiU3VwcG9ydHMgTFJPIGZvciBtYXggeGlkIDB4JXhcbiIsCi0JCQkJbHAtPmxyb194aWQpOworCQkJCWxwb3J0LT5scm9feGlkKTsKIAl9CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcG9ydC0+ZmNvZV9wZW5kaW5nX3F1ZXVlKTsKIAlwb3J0LT5mY29lX3BlbmRpbmdfcXVldWVfYWN0aXZlID0gMDsKLQlzZXR1cF90aW1lcigmcG9ydC0+dGltZXIsIGZjb2VfcXVldWVfdGltZXIsICh1bnNpZ25lZCBsb25nKWxwKTsKKwlzZXR1cF90aW1lcigmcG9ydC0+dGltZXIsIGZjb2VfcXVldWVfdGltZXIsICh1bnNpZ25lZCBsb25nKWxwb3J0KTsKIAotCXd3bm4gPSBmY29lX3d3bl9mcm9tX21hYyhuZXRkZXYtPmRldl9hZGRyLCAxLCAwKTsKLQlmY19zZXRfd3dubihscCwgd3dubik7Ci0JLyogWFhYIC0gM3JkIGFyZyBuZWVkcyB0byBiZSB2bGFuIGlkICovCi0Jd3dwbiA9IGZjb2Vfd3duX2Zyb21fbWFjKG5ldGRldi0+ZGV2X2FkZHIsIDIsIDApOwotCWZjX3NldF93d3BuKGxwLCB3d3BuKTsKKwlpZiAoIWxwb3J0LT52cG9ydCkgeworCQkvKgorCQkgKiBVc2UgTkFBIDEmMiAoRkMtRlMgUmV2LiAyLjAsIFNlYy4gMTUpIHRvIGdlbmVyYXRlIFdXTk4vV1dQTjoKKwkJICogRm9yIFdXTk4sIHdlIHVzZSBOQUEgMSB3LyBiaXQgMjctMTYgb2Ygd29yZCAwIGFzIDAuCisJCSAqIEZvciBXV1BOLCB3ZSB1c2UgTkFBIDIgdy8gYml0IDI3LTE2IG9mIHdvcmQgMCBmcm9tIFZMQU4gSUQKKwkJICovCisJCWlmIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCisJCQl2aWQgPSB2bGFuX2Rldl92bGFuX2lkKG5ldGRldik7CisJCXd3bm4gPSBmY29lX3d3bl9mcm9tX21hYyhmY29lLT5jdGxyLmN0bF9zcmNfYWRkciwgMSwgMCk7CisJCWZjX3NldF93d25uKGxwb3J0LCB3d25uKTsKKwkJd3dwbiA9IGZjb2Vfd3duX2Zyb21fbWFjKGZjb2UtPmN0bHIuY3RsX3NyY19hZGRyLCAyLCB2aWQpOworCQlmY19zZXRfd3dwbihscG9ydCwgd3dwbik7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogZmNvZV9zaG9zdF9jb25maWcoKSAtIFNldHMgdXAgZmNfbHBvcnQtPmhvc3QKLSAqIEBscCA6IHB0ciB0byB0aGUgZmNfbHBvcnQKLSAqIEBzaG9zdCA6IHB0ciB0byB0aGUgYXNzb2NpYXRlZCBzY3NpIGhvc3QKLSAqIEBkZXYgOiBkZXZpY2UgYXNzb2NpYXRlZCB0byBzY3NpIGhvc3QKKyAqIGZjb2Vfc2hvc3RfY29uZmlnKCkgLSBTZXQgdXAgdGhlIFNDU0kgaG9zdCBhc3NvY2lhdGVkIHdpdGggYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0CisgKiBAc2hvc3Q6IFRoZSBTQ1NJIGhvc3QgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGxvY2FsIHBvcnQKKyAqIEBkZXY6ICAgVGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNDU0kgaG9zdAogICoKICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGZjb2VfbHBvcnRfY29uZmlnKCkgYW5kIGZjb2VfbmV0ZGV2X2NvbmZpZygpCiAgKgotICogUmV0dXJucyA6IDAgZm9yIHN1Y2Nlc3MKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKICAqLwotc3RhdGljIGludCBmY29lX3Nob3N0X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGZjb2Vfc2hvc3RfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJjID0gMDsKIAogCS8qIGxwb3J0IHNjc2kgaG9zdCBjb25maWcgKi8KLQlscC0+aG9zdCA9IHNob3N0OwotCi0JbHAtPmhvc3QtPm1heF9sdW4gPSBGQ09FX01BWF9MVU47Ci0JbHAtPmhvc3QtPm1heF9pZCA9IEZDT0VfTUFYX0ZDUF9UQVJHRVQ7Ci0JbHAtPmhvc3QtPm1heF9jaGFubmVsID0gMDsKLQlscC0+aG9zdC0+dHJhbnNwb3J0dCA9IHNjc2lfdHJhbnNwb3J0X2Zjb2Vfc3c7CisJbHBvcnQtPmhvc3QtPm1heF9sdW4gPSBGQ09FX01BWF9MVU47CisJbHBvcnQtPmhvc3QtPm1heF9pZCA9IEZDT0VfTUFYX0ZDUF9UQVJHRVQ7CisJbHBvcnQtPmhvc3QtPm1heF9jaGFubmVsID0gMDsKKwlpZiAobHBvcnQtPnZwb3J0KQorCQlscG9ydC0+aG9zdC0+dHJhbnNwb3J0dCA9IGZjb2VfdnBvcnRfdHJhbnNwb3J0X3RlbXBsYXRlOworCWVsc2UKKwkJbHBvcnQtPmhvc3QtPnRyYW5zcG9ydHQgPSBmY29lX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIAogCS8qIGFkZCB0aGUgbmV3IGhvc3QgdG8gdGhlIFNDU0ktbWwgKi8KLQlyYyA9IHNjc2lfYWRkX2hvc3QobHAtPmhvc3QsIGRldik7CisJcmMgPSBzY3NpX2FkZF9ob3N0KGxwb3J0LT5ob3N0LCBkZXYpOwogCWlmIChyYykgewotCQlGQ09FX05FVERFVl9EQkcoZmNvZV9uZXRkZXYobHApLCAiZmNvZV9zaG9zdF9jb25maWc6ICIKKwkJRkNPRV9ORVRERVZfREJHKGZjb2VfbmV0ZGV2KGxwb3J0KSwgImZjb2Vfc2hvc3RfY29uZmlnOiAiCiAJCQkJImVycm9yIG9uIHNjc2lfYWRkX2hvc3RcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQotCXNwcmludGYoZmNfaG9zdF9zeW1ib2xpY19uYW1lKGxwLT5ob3N0KSwgIiVzIHYlcyBvdmVyICVzIiwKLQkJRkNPRV9OQU1FLCBGQ09FX1ZFUlNJT04sCi0JCWZjb2VfbmV0ZGV2KGxwKS0+bmFtZSk7CisKKwlpZiAoIWxwb3J0LT52cG9ydCkKKwkJZmNfaG9zdF9tYXhfbnBpdl92cG9ydHMobHBvcnQtPmhvc3QpID0gVVNIT1JUX01BWDsKKworCXNucHJpbnRmKGZjX2hvc3Rfc3ltYm9saWNfbmFtZShscG9ydC0+aG9zdCksIEZDX1NZTUJPTElDX05BTUVfU0laRSwKKwkJICIlcyB2JXMgb3ZlciAlcyIsIEZDT0VfTkFNRSwgRkNPRV9WRVJTSU9OLAorCQkgZmNvZV9uZXRkZXYobHBvcnQpLT5uYW1lKTsKIAogCXJldHVybiAwOwogfQogCi0vKgotICogZmNvZV9vZW1fbWF0Y2goKSAtIG1hdGNoIGZvciByZWFkIHR5cGVzIElPCi0gKiBAZnA6IHRoZSBmY19mcmFtZSBmb3IgbmV3IElPLgorLyoqCisgKiBmY29lX29lbV9tYXRjaCgpIC0gVGhlIG1hdGNoIHJvdXRpbmUgZm9yIHRoZSBvZmZsb2FkZWQgZXhjaGFuZ2UgbWFuYWdlcgorICogQGZwOiBUaGUgSS9PIGZyYW1lCiAgKgotICogUmV0dXJucyA6IHRydWUgZm9yIHJlYWQgdHlwZXMgSU8sIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICogVGhpcyByb3V0aW5lIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGV4Y2hhbmdlIG1hbmFnZXIgKEVNKS4gV2hlbgorICogdGhlIGxpYmZjIGV4Y2hhbmdlIGhhbmRsaW5nIGNvZGUgaXMgbG9va2luZyBmb3IgYW4gRU0gdG8gdXNlIGl0IHdpbGwKKyAqIGNhbGwgdGhpcyByb3V0aW5lIGFuZCBwYXNzIGl0IHRoZSBmcmFtZSB0aGF0IGl0IHdpc2hlcyB0byBzZW5kLiBUaGlzCisgKiByb3V0aW5lIHdpbGwgcmV0dXJuIFRydWUgaWYgdGhlIGFzc29jaWF0ZWQgRU0gaXMgdG8gYmUgdXNlZCBhbmQgRmFsc2UKKyAqIGlmIHRoZSBlY2hhbmdlIGNvZGUgc2hvdWxkIGNvbnRpbnVlIGxvb2tpbmcgZm9yIGFuIEVNLgorICoKKyAqIFRoZSBvZmZsb2FkIEVNIHRoYXQgdGhpcyByb3V0aW5lIGlzIGFzc29jaWF0ZWQgd2l0aCB3aWxsIGhhbmRsZSBhbnkKKyAqIHBhY2tldHMgdGhhdCBhcmUgZm9yIFNDU0kgcmVhZCByZXF1ZXN0cy4KKyAqCisgKiBSZXR1cm5zOiBUcnVlIGZvciByZWFkIHR5cGVzIEkvTywgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCiAgKi8KIGJvb2wgZmNvZV9vZW1fbWF0Y2goc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKQEAgLTUyNywxNCArNjg0LDE0IEBACiB9CiAKIC8qKgotICogZmNvZV9lbV9jb25maWcoKSAtIGFsbG9jYXRlcyBlbSBmb3IgdGhpcyBscG9ydAotICogQGxwOiB0aGUgZmNvZSB0aGF0IGVtIGlzIHRvIGFsbG9jYXRlZCBmb3IKKyAqIGZjb2VfZW1fY29uZmlnKCkgLSBBbGxvY2F0ZSBhbmQgY29uZmlndXJlIGFuIGV4Y2hhbmdlIG1hbmFnZXIKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCB0aGUgbmV3IEVNIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoCiAgKgotICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICogUmV0dXJuczogMCBvbiBzdWNjZXNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZjb2VfZW1fY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHApCitzdGF0aWMgaW5saW5lIGludCBmY29lX2VtX2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwKTsKKwlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7CiAJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lID0gcG9ydC0+ZmNvZTsKIAlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKm9sZGZjb2UgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlICpvbGRfcmVhbF9kZXYsICpjdXJfcmVhbF9kZXY7CkBAIC01NDUsOCArNzAyLDkgQEAKIAkgKiBDaGVjayBpZiBuZWVkIHRvIGFsbG9jYXRlIGFuIGVtIGluc3RhbmNlIGZvcgogCSAqIG9mZmxvYWQgZXhjaGFuZ2UgaWRzIHRvIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIFZOX1BPUlRzL2xwb3J0LgogCSAqLwotCWlmICghbHAtPmxyb19lbmFibGVkIHx8ICFscC0+bHJvX3hpZCB8fCAobHAtPmxyb194aWQgPj0gbWF4X3hpZCkpIHsKLQkJbHAtPmxyb194aWQgPSAwOworCWlmICghbHBvcnQtPmxyb19lbmFibGVkIHx8ICFscG9ydC0+bHJvX3hpZCB8fAorCSAgICAobHBvcnQtPmxyb194aWQgPj0gbWF4X3hpZCkpIHsKKwkJbHBvcnQtPmxyb194aWQgPSAwOwogCQlnb3RvIHNraXBfb2VtOwogCX0KIApAQCAtNTcyLDE2ICs3MzAsMTYgQEAKIAl9CiAKIAlpZiAoZmNvZS0+b2VtKSB7Ci0JCWlmICghZmNfZXhjaF9tZ3JfYWRkKGxwLCBmY29lLT5vZW0sIGZjb2Vfb2VtX21hdGNoKSkgeworCQlpZiAoIWZjX2V4Y2hfbWdyX2FkZChscG9ydCwgZmNvZS0+b2VtLCBmY29lX29lbV9tYXRjaCkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZmNvZV9lbV9jb25maWc6IGZhaWxlZCB0byBhZGQgIgogCQkJICAgICAgICJvZmZsb2FkIGVtOiVwIG9uIGludGVyZmFjZTolc1xuIiwKIAkJCSAgICAgICBmY29lLT5vZW0sIGZjb2UtPm5ldGRldi0+bmFtZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0gZWxzZSB7Ci0JCWZjb2UtPm9lbSA9IGZjX2V4Y2hfbWdyX2FsbG9jKGxwLCBGQ19DTEFTU18zLAotCQkJCQkgICAgRkNPRV9NSU5fWElELCBscC0+bHJvX3hpZCwKLQkJCQkJICAgIGZjb2Vfb2VtX21hdGNoKTsKKwkJZmNvZS0+b2VtID0gZmNfZXhjaF9tZ3JfYWxsb2MobHBvcnQsIEZDX0NMQVNTXzMsCisJCQkJCSAgICAgIEZDT0VfTUlOX1hJRCwgbHBvcnQtPmxyb194aWQsCisJCQkJCSAgICAgIGZjb2Vfb2VtX21hdGNoKTsKIAkJaWYgKCFmY29lLT5vZW0pIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZmNvZV9lbV9jb25maWc6IGZhaWxlZCB0byBhbGxvY2F0ZSAiCiAJCQkgICAgICAgImVtIGZvciBvZmZsb2FkIGV4Y2hlcyBvbiBpbnRlcmZhY2U6JXNcbiIsCkBAIC01OTMsMTAgKzc1MSwxMCBAQAogCS8qCiAJICogRXhjbHVkZSBvZmZsb2FkIEVNIHhpZCByYW5nZSBmcm9tIG5leHQgRU0geGlkIHJhbmdlLgogCSAqLwotCW1pbl94aWQgKz0gbHAtPmxyb194aWQgKyAxOworCW1pbl94aWQgKz0gbHBvcnQtPmxyb194aWQgKyAxOwogCiBza2lwX29lbToKLQlpZiAoIWZjX2V4Y2hfbWdyX2FsbG9jKGxwLCBGQ19DTEFTU18zLCBtaW5feGlkLCBtYXhfeGlkLCBOVUxMKSkgeworCWlmICghZmNfZXhjaF9tZ3JfYWxsb2MobHBvcnQsIEZDX0NMQVNTXzMsIG1pbl94aWQsIG1heF94aWQsIE5VTEwpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZmNvZV9lbV9jb25maWc6IGZhaWxlZCB0byAiCiAJCSAgICAgICAiYWxsb2NhdGUgZW0gb24gaW50ZXJmYWNlICVzXG4iLCBmY29lLT5uZXRkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTYwNiw4ICs3NjQsOCBAQAogfQogCiAvKioKLSAqIGZjb2VfaWZfZGVzdHJveSgpIC0gRkNvRSBzb2Z0d2FyZSBIQkEgdGVhci1kb3duIGZ1bmN0aW9uCi0gKiBAbHBvcnQ6IGZjX2xwb3J0IHRvIGRlc3Ryb3kKKyAqIGZjb2VfaWZfZGVzdHJveSgpIC0gVGVhciBkb3duIGEgU1cgRkNvRSBpbnN0YW5jZQorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBiZSBkZXN0cm95ZWQKICAqLwogc3RhdGljIHZvaWQgZmNvZV9pZl9kZXN0cm95KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CkBAIC02MzAsNiArNzg4LDExIEBACiAJLyogRnJlZSBleGlzdGluZyB0cmFuc21pdCBza2JzICovCiAJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGxwb3J0KTsKIAorCXJ0bmxfbG9jaygpOworCWlmICghaXNfemVyb19ldGhlcl9hZGRyKHBvcnQtPmRhdGFfc3JjX2FkZHIpKQorCQlkZXZfdW5pY2FzdF9kZWxldGUobmV0ZGV2LCBwb3J0LT5kYXRhX3NyY19hZGRyKTsKKwlydG5sX3VubG9jaygpOworCiAJLyogcmVjZWl2ZXMgbWF5IG5vdCBiZSBzdG9wcGVkIHVudGlsIGFmdGVyIHRoaXMgKi8KIAlmY29lX2ludGVyZmFjZV9wdXQoZmNvZSk7CiAKQEAgLTY1MCw4MiArODEzLDg5IEBACiAJc2NzaV9ob3N0X3B1dChscG9ydC0+aG9zdCk7CiB9CiAKLS8qCi0gKiBmY29lX2RkcF9zZXR1cCAtIGNhbGxzIExMRCdzIGRkcF9zZXR1cCB0aHJvdWdoIG5ldF9kZXZpY2UKLSAqIEBscDoJdGhlIGNvcnJlc3BvbmRpbmcgZmNfbHBvcnQKLSAqIEB4aWQ6IHRoZSBleGNoYW5nZSBpZCBmb3IgdGhpcyBkZHAgdHJhbnNmZXIKLSAqIEBzZ2w6IHRoZSBzY2F0dGVybGlzdCBkZXNjcmliaW5nIHRoaXMgdHJhbnNmZXIKLSAqIEBzZ2M6IG51bWJlciBvZiBzZyBpdGVtcworLyoqCisgKiBmY29lX2RkcF9zZXR1cCgpIC0gQ2FsbCBhIExMRCdzIGRkcF9zZXR1cCB0aHJvdWdoIHRoZSBuZXQgZGV2aWNlCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIHNldHVwIEREUCBmb3IKKyAqIEB4aWQ6ICAgVGhlIGV4Y2hhbmdlIElEIGZvciB0aGlzIEREUCB0cmFuc2ZlcgorICogQHNnbDogICBUaGUgc2NhdHRlcmxpc3QgZGVzY3JpYmluZyB0aGlzIHRyYW5zZmVyCisgKiBAc2djOiAgIFRoZSBudW1iZXIgb2Ygc2cgaXRlbXMKICAqCi0gKiBSZXR1cm5zIDogMCBubyBkZHAKKyAqIFJldHVybnM6IDAgaWYgdGhlIEREUCBjb250ZXh0IHdhcyBub3QgY29uZmlndXJlZAogICovCi1zdGF0aWMgaW50IGZjb2VfZGRwX3NldHVwKHN0cnVjdCBmY19scG9ydCAqbHAsIHUxNiB4aWQsCi0JCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgc2djKQorc3RhdGljIGludCBmY29lX2RkcF9zZXR1cChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCB1MTYgeGlkLAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IHNnYykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbiA9IGZjb2VfbmV0ZGV2KGxwKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZmNvZV9uZXRkZXYobHBvcnQpOwogCi0JaWYgKG4tPm5ldGRldl9vcHMgJiYgbi0+bmV0ZGV2X29wcy0+bmRvX2Zjb2VfZGRwX3NldHVwKQotCQlyZXR1cm4gbi0+bmV0ZGV2X29wcy0+bmRvX2Zjb2VfZGRwX3NldHVwKG4sIHhpZCwgc2dsLCBzZ2MpOworCWlmIChuZXRkZXYtPm5ldGRldl9vcHMtPm5kb19mY29lX2RkcF9zZXR1cCkKKwkJcmV0dXJuIG5ldGRldi0+bmV0ZGV2X29wcy0+bmRvX2Zjb2VfZGRwX3NldHVwKG5ldGRldiwKKwkJCQkJCQkgICAgICB4aWQsIHNnbCwKKwkJCQkJCQkgICAgICBzZ2MpOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBmY29lX2RkcF9kb25lIC0gY2FsbHMgTExEJ3MgZGRwX2RvbmUgdGhyb3VnaCBuZXRfZGV2aWNlCi0gKiBAbHA6CXRoZSBjb3JyZXNwb25kaW5nIGZjX2xwb3J0Ci0gKiBAeGlkOiB0aGUgZXhjaGFuZ2UgaWQgZm9yIHRoaXMgZGRwIHRyYW5zZmVyCi0gKgotICogUmV0dXJucyA6IHRoZSBsZW5ndGggb2YgZGF0YSB0aGF0IGhhdmUgYmVlbiBjb21wbGV0ZWQgYnkgZGRwCi0gKi8KLXN0YXRpYyBpbnQgZmNvZV9kZHBfZG9uZShzdHJ1Y3QgZmNfbHBvcnQgKmxwLCB1MTYgeGlkKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuID0gZmNvZV9uZXRkZXYobHApOwotCi0JaWYgKG4tPm5ldGRldl9vcHMgJiYgbi0+bmV0ZGV2X29wcy0+bmRvX2Zjb2VfZGRwX2RvbmUpCi0JCXJldHVybiBuLT5uZXRkZXZfb3BzLT5uZG9fZmNvZV9kZHBfZG9uZShuLCB4aWQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlIGZjb2VfbGliZmNfZmNuX3RlbXBsID0gewotCS5mcmFtZV9zZW5kID0gZmNvZV94bWl0LAotCS5kZHBfc2V0dXAgPSBmY29lX2RkcF9zZXR1cCwKLQkuZGRwX2RvbmUgPSBmY29lX2RkcF9kb25lLAotfTsKLQogLyoqCi0gKiBmY29lX2lmX2NyZWF0ZSgpIC0gdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBmY29lIHBvcnQKLSAqIEBmY29lOiBmY29lX2ludGVyZmFjZSBzdHJ1Y3R1cmUgdG8gY3JlYXRlIGFuIGZjX2xwb3J0IGluc3RhbmNlIG9uCi0gKiBAcGFyZW50OiBkZXZpY2UgcG9pbnRlciB0byBiZSB0aGUgcGFyZW50IGluIHN5c2ZzIGZvciB0aGUgU0NTSSBob3N0CisgKiBmY29lX2RkcF9kb25lKCkgLSBDYWxsIGEgTExEJ3MgZGRwX2RvbmUgdGhyb3VnaCB0aGUgbmV0IGRldmljZQorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBjb21wbGV0ZSBERFAgb24KKyAqIEB4aWQ6ICAgVGhlIGV4Y2hhbmdlIElEIGZvciB0aGlzIEREUCB0cmFuc2ZlcgogICoKLSAqIENyZWF0ZXMgZmNfbHBvcnQgc3RydWN0IGFuZCBzY3NpX2hvc3QgZm9yIGxwb3J0LCBjb25maWd1cmVzIGxwb3J0LgorICogUmV0dXJuczogdGhlIGxlbmd0aCBvZiBkYXRhIHRoYXQgaGF2ZSBiZWVuIGNvbXBsZXRlZCBieSBERFAKKyAqLworc3RhdGljIGludCBmY29lX2RkcF9kb25lKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHUxNiB4aWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2VfbmV0ZGV2KGxwb3J0KTsKKworCWlmIChuZXRkZXYtPm5ldGRldl9vcHMtPm5kb19mY29lX2RkcF9kb25lKQorCQlyZXR1cm4gbmV0ZGV2LT5uZXRkZXZfb3BzLT5uZG9fZmNvZV9kZHBfZG9uZShuZXRkZXYsIHhpZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmNvZV9pZl9jcmVhdGUoKSAtIENyZWF0ZSBhIEZDb0UgaW5zdGFuY2Ugb24gYW4gaW50ZXJmYWNlCisgKiBAZmNvZTogICBUaGUgRkNvRSBpbnRlcmZhY2UgdG8gY3JlYXRlIGEgbG9jYWwgcG9ydCBvbgorICogQHBhcmVudDogVGhlIGRldmljZSBwb2ludGVyIHRvIGJlIHRoZSBwYXJlbnQgaW4gc3lzZnMgZm9yIHRoZSBTQ1NJIGhvc3QKKyAqIEBucGl2OiAgIEluZGljYXRlcyBpZiB0aGUgcG9ydCBpcyBhIHZwb3J0IG9yIG5vdAogICoKLSAqIFJldHVybnMgOiBUaGUgYWxsb2NhdGVkIGZjX2xwb3J0IG9yIGFuIGVycm9yIHBvaW50ZXIKKyAqIENyZWF0ZXMgYSBmY19scG9ydCBpbnN0YW5jZSBhbmQgYSBTY3NpX0hvc3QgaW5zdGFuY2UgYW5kIGNvbmZpZ3VyZSB0aGVtLgorICoKKyAqIFJldHVybnM6IFRoZSBhbGxvY2F0ZWQgZmNfbHBvcnQgb3IgYW4gZXJyb3IgcG9pbnRlcgogICovCiBzdGF0aWMgc3RydWN0IGZjX2xwb3J0ICpmY29lX2lmX2NyZWF0ZShzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2UsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKKwkJCQkgICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50LCBpbnQgbnBpdikKIHsKLQlpbnQgcmM7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2UtPm5ldGRldjsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gTlVMTDsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBmY29lLT5uZXRkZXY7CisJaW50IHJjOworCS8qCisJICogcGFyZW50IGlzIG9ubHkgYSB2cG9ydCBpZiBucGl2IGlzIDEsCisJICogYnV0IHdlJ2xsIG9ubHkgdXNlIHZwb3J0IGluIHRoYXQgY2FzZSBzbyBnbyBhaGVhZCBhbmQgc2V0IGl0CisJICovCisJc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCA9IGRldl90b192cG9ydChwYXJlbnQpOwogCiAJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIkNyZWF0ZSBJbnRlcmZhY2VcbiIpOwogCi0Jc2hvc3QgPSBsaWJmY19ob3N0X2FsbG9jKCZmY29lX3Nob3N0X3RlbXBsYXRlLAotCQkJCSBzaXplb2Yoc3RydWN0IGZjb2VfcG9ydCkpOwotCWlmICghc2hvc3QpIHsKKwlpZiAoIW5waXYpIHsKKwkJbHBvcnQgPSBsaWJmY19ob3N0X2FsbG9jKCZmY29lX3Nob3N0X3RlbXBsYXRlLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBmY29lX3BvcnQpKTsKKwl9IGVsc2UJeworCQlscG9ydCA9IGxpYmZjX3Zwb3J0X2NyZWF0ZSh2cG9ydCwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBmY29lX3BvcnQpKTsKKwl9CisJaWYgKCFscG9ydCkgewogCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIGhvc3Qgc3RydWN0dXJlXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JbHBvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKKwlzaG9zdCA9IGxwb3J0LT5ob3N0OwogCXBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKIAlwb3J0LT5scG9ydCA9IGxwb3J0OwogCXBvcnQtPmZjb2UgPSBmY29lOwogCUlOSVRfV09SSygmcG9ydC0+ZGVzdHJveV93b3JrLCBmY29lX2Rlc3Ryb3lfd29yayk7CiAKLQkvKiBjb25maWd1cmUgZmNfbHBvcnQsIGUuZy4sIGVtICovCisJLyogY29uZmlndXJlIGEgZmNfbHBvcnQgaW5jbHVkaW5nIHRoZSBleGNoYW5nZSBtYW5hZ2VyICovCiAJcmMgPSBmY29lX2xwb3J0X2NvbmZpZyhscG9ydCk7CiAJaWYgKHJjKSB7CiAJCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJDb3VsZCBub3QgY29uZmlndXJlIGxwb3J0IGZvciB0aGUgIgpAQCAtNzMzLDYgKzkwMywxMyBAQAogCQlnb3RvIG91dF9ob3N0X3B1dDsKIAl9CiAKKwlpZiAobnBpdikgeworCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiU2V0dGluZyB2cG9ydCBuYW1lcywgMHglbGxYIDB4JWxsWFxuIiwKKwkJCQl2cG9ydC0+bm9kZV9uYW1lLCB2cG9ydC0+cG9ydF9uYW1lKTsKKwkJZmNfc2V0X3d3bm4obHBvcnQsIHZwb3J0LT5ub2RlX25hbWUpOworCQlmY19zZXRfd3dwbihscG9ydCwgdnBvcnQtPnBvcnRfbmFtZSk7CisJfQorCiAJLyogY29uZmlndXJlIGxwb3J0IG5ldHdvcmsgcHJvcGVydGllcyAqLwogCXJjID0gZmNvZV9uZXRkZXZfY29uZmlnKGxwb3J0LCBuZXRkZXYpOwogCWlmIChyYykgewpAQCAtNzU3LDIxICs5MzQsMjQgQEAKIAkJZ290byBvdXRfbHBfZGVzdHJveTsKIAl9CiAKLQkvKgotCSAqIGZjb2VfZW1fYWxsb2MoKSBhbmQgZmNvZV9ob3N0bGlzdF9hZGQoKSBib3RoCi0JICogbmVlZCB0byBiZSBhdG9taWMgd2l0aCByZXNwZWN0IHRvIG90aGVyIGNoYW5nZXMgdG8gdGhlIGhvc3RsaXN0Ci0JICogc2luY2UgZmNvZV9lbV9hbGxvYygpIGxvb2tzIGZvciBhbiBleGlzdGluZyBFTQotCSAqIGluc3RhbmNlIG9uIGhvc3QgbGlzdCB1cGRhdGVkIGJ5IGZjb2VfaG9zdGxpc3RfYWRkKCkuCi0JICoKLQkgKiBUaGlzIGlzIGN1cnJlbnRseSBoYW5kbGVkIHRocm91Z2ggdGhlIGZjb2VfY29uZmlnX211dGV4IGJlZ2luIGhlbGQuCi0JICovCisJaWYgKCFucGl2KSB7CisJCS8qCisJCSAqIGZjb2VfZW1fYWxsb2MoKSBhbmQgZmNvZV9ob3N0bGlzdF9hZGQoKSBib3RoCisJCSAqIG5lZWQgdG8gYmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBvdGhlciBjaGFuZ2VzIHRvIHRoZQorCQkgKiBob3N0bGlzdCBzaW5jZSBmY29lX2VtX2FsbG9jKCkgbG9va3MgZm9yIGFuIGV4aXN0aW5nIEVNCisJCSAqIGluc3RhbmNlIG9uIGhvc3QgbGlzdCB1cGRhdGVkIGJ5IGZjb2VfaG9zdGxpc3RfYWRkKCkuCisJCSAqCisJCSAqIFRoaXMgaXMgY3VycmVudGx5IGhhbmRsZWQgdGhyb3VnaCB0aGUgZmNvZV9jb25maWdfbXV0ZXgKKwkJICogYmVnaW4gaGVsZC4KKwkJICovCiAKLQkvKiBscG9ydCBleGNoIG1hbmFnZXIgYWxsb2NhdGlvbiAqLwotCXJjID0gZmNvZV9lbV9jb25maWcobHBvcnQpOwotCWlmIChyYykgewotCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiQ291bGQgbm90IGNvbmZpZ3VyZSB0aGUgRU0gZm9yIHRoZSAiCi0JCQkJImludGVyZmFjZVxuIik7Ci0JCWdvdG8gb3V0X2xwX2Rlc3Ryb3k7CisJCS8qIGxwb3J0IGV4Y2ggbWFuYWdlciBhbGxvY2F0aW9uICovCisJCXJjID0gZmNvZV9lbV9jb25maWcobHBvcnQpOworCQlpZiAocmMpIHsKKwkJCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJDb3VsZCBub3QgY29uZmlndXJlIHRoZSBFTSAiCisJCQkJCSJmb3IgdGhlIGludGVyZmFjZVxuIik7CisJCQlnb3RvIG91dF9scF9kZXN0cm95OworCQl9CiAJfQogCiAJZmNvZV9pbnRlcmZhY2VfZ2V0KGZjb2UpOwpAQCAtNzg2LDE3ICs5NjYsMjAgQEAKIH0KIAogLyoqCi0gKiBmY29lX2lmX2luaXQoKSAtIGF0dGFjaCB0byBzY3NpIHRyYW5zcG9ydAorICogZmNvZV9pZl9pbml0KCkgLSBJbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBmY29lLmtvCiAgKgotICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICogQXR0YWNoZXMgdGhlIFNXIEZDb0UgdHJhbnNwb3J0IHRvIHRoZSBGQyB0cmFuc3BvcnQKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MKICAqLwogc3RhdGljIGludCBfX2luaXQgZmNvZV9pZl9pbml0KHZvaWQpCiB7CiAJLyogYXR0YWNoIHRvIHNjc2kgdHJhbnNwb3J0ICovCi0Jc2NzaV90cmFuc3BvcnRfZmNvZV9zdyA9Ci0JCWZjX2F0dGFjaF90cmFuc3BvcnQoJmZjb2VfdHJhbnNwb3J0X2Z1bmN0aW9uKTsKKwlmY29lX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IGZjX2F0dGFjaF90cmFuc3BvcnQoJmZjb2VfdHJhbnNwb3J0X2Z1bmN0aW9uKTsKKwlmY29lX3Zwb3J0X3RyYW5zcG9ydF90ZW1wbGF0ZSA9CisJCWZjX2F0dGFjaF90cmFuc3BvcnQoJmZjb2VfdnBvcnRfdHJhbnNwb3J0X2Z1bmN0aW9uKTsKIAotCWlmICghc2NzaV90cmFuc3BvcnRfZmNvZV9zdykgeworCWlmICghZmNvZV90cmFuc3BvcnRfdGVtcGxhdGUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmY29lOiBGYWlsZWQgdG8gYXR0YWNoIHRvIHRoZSBGQyB0cmFuc3BvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC04MDUsMjAgKzk4OCwyNCBAQAogfQogCiAvKioKLSAqIGZjb2VfaWZfZXhpdCgpIC0gZGV0YWNoIGZyb20gc2NzaSB0cmFuc3BvcnQKKyAqIGZjb2VfaWZfZXhpdCgpIC0gVGVhciBkb3duIGZjb2Uua28KICAqCi0gKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKiBEZXRhY2hlcyB0aGUgU1cgRkNvRSB0cmFuc3BvcnQgZnJvbSB0aGUgRkMgdHJhbnNwb3J0CisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzCiAgKi8KIGludCBfX2V4aXQgZmNvZV9pZl9leGl0KHZvaWQpCiB7Ci0JZmNfcmVsZWFzZV90cmFuc3BvcnQoc2NzaV90cmFuc3BvcnRfZmNvZV9zdyk7Ci0Jc2NzaV90cmFuc3BvcnRfZmNvZV9zdyA9IE5VTEw7CisJZmNfcmVsZWFzZV90cmFuc3BvcnQoZmNvZV90cmFuc3BvcnRfdGVtcGxhdGUpOworCWZjX3JlbGVhc2VfdHJhbnNwb3J0KGZjb2VfdnBvcnRfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKwlmY29lX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IE5VTEw7CisJZmNvZV92cG9ydF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqIGZjb2VfcGVyY3B1X3RocmVhZF9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlY2VpdmUgdGhyZWFkIGZvciBhbiBvbmxpbmUgY3B1Ci0gKiBAY3B1OiBjcHUgaW5kZXggZm9yIHRoZSBvbmxpbmUgY3B1CisgKiBmY29lX3BlcmNwdV90aHJlYWRfY3JlYXRlKCkgLSBDcmVhdGUgYSByZWNlaXZlIHRocmVhZCBmb3IgYW4gb25saW5lIENQVQorICogQGNwdTogVGhlIENQVSBpbmRleCBvZiB0aGUgQ1BVIHRvIGNyZWF0ZSBhIHJlY2VpdmUgdGhyZWFkIGZvcgogICovCiBzdGF0aWMgdm9pZCBmY29lX3BlcmNwdV90aHJlYWRfY3JlYXRlKHVuc2lnbmVkIGludCBjcHUpCiB7CkBAIC04NDEsOCArMTAyOCw4IEBACiB9CiAKIC8qKgotICogZmNvZV9wZXJjcHVfdGhyZWFkX2Rlc3Ryb3koKSAtIHJlbW92ZXMgdGhlIHJ4IHRocmVhZCBmb3IgdGhlIGdpdmVuIGNwdQotICogQGNwdTogY3B1IGluZGV4IHRoZSByeCB0aHJlYWQgaXMgdG8gYmUgcmVtb3ZlZAorICogZmNvZV9wZXJjcHVfdGhyZWFkX2Rlc3Ryb3koKSAtIFJlbW92ZSB0aGUgcmVjZWl2ZSB0aHJlYWQgb2YgYSBDUFUKKyAqIEBjcHU6IFRoZSBDUFUgaW5kZXggb2YgdGhlIENQVSB3aG9zZSByZWNlaXZlIHRocmVhZCBpcyB0byBiZSBkZXN0cm95ZWQKICAqCiAgKiBEZXN0cm95cyBhIHBlci1DUFUgUnggdGhyZWFkLiBBbnkgcGVuZGluZyBza2JzIGFyZSBtb3ZlZCB0byB0aGUKICAqIGN1cnJlbnQgQ1BVJ3MgUnggdGhyZWFkLiBJZiB0aGUgdGhyZWFkIGJlaW5nIGRlc3Ryb3llZCBpcyBib3VuZCB0bwpAQCAtODkwLDcgKzEwNzcsNyBAQAogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoZSB0YXJnZXRlZCBDUFUgaXMgbm90IGluaXRpYWxpemVkIGFuZCBjYW5ub3QgYWNjZXB0Ci0JCQkgKiBuZXcgIHNrYnMuIFVubG9jayB0aGUgdGFyZ2V0ZWQgQ1BVIGFuZCBkcm9wIHRoZSBza2JzCisJCQkgKiBuZXcJc2ticy4gVW5sb2NrIHRoZSB0YXJnZXRlZCBDUFUgYW5kIGRyb3AgdGhlIHNrYnMKIAkJCSAqIG9uIHRoZSBDUFUgdGhhdCBpcyBnb2luZyBvZmZsaW5lLgogCQkJICovCiAJCQl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnAtPmZjb2VfcnhfbGlzdCkpICE9IE5VTEwpCkBAIC05MzEsMTIgKzExMTgsMTIgQEAKIH0KIAogLyoqCi0gKiBmY29lX2NwdV9jYWxsYmFjaygpIC0gZmNvZSBjcHUgaG90cGx1ZyBldmVudCBjYWxsYmFjawotICogQG5mYjogY2FsbGJhY2sgZGF0YSBibG9jawotICogQGFjdGlvbjogZXZlbnQgdHJpZ2dlcmluZyB0aGUgY2FsbGJhY2sKLSAqIEBoY3B1OiBpbmRleCBmb3IgdGhlIGNwdSBvZiB0aGlzIGV2ZW50CisgKiBmY29lX2NwdV9jYWxsYmFjaygpIC0gSGFuZGxlciBmb3IgQ1BVIGhvdHBsdWcgZXZlbnRzCisgKiBAbmZiOiAgICBUaGUgY2FsbGJhY2sgZGF0YSBibG9jaworICogQGFjdGlvbjogVGhlIGV2ZW50IHRyaWdnZXJpbmcgdGhlIGNhbGxiYWNrCisgKiBAaGNwdTogICBUaGUgaW5kZXggb2YgdGhlIENQVSB0aGF0IHRoZSBldmVudCBpcyBmb3IKICAqCi0gKiBUaGlzIGNyZWF0ZXMgb3IgZGVzdHJveXMgcGVyIGNwdSBkYXRhIGZvciBmY29lCisgKiBUaGlzIGNyZWF0ZXMgb3IgZGVzdHJveXMgcGVyLUNQVSBkYXRhIGZvciBmY29lCiAgKgogICogUmV0dXJucyBOT1RJRllfT0sgYWx3YXlzLgogICovCkBAIC05NjIsMjUgKzExNDksMjIgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZjb2VfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gZmNvZV9jcHVfY2FsbGJhY2ssCi19OwotCiAvKioKLSAqIGZjb2VfcmN2KCkgLSB0aGlzIGlzIHRoZSBmY29lIHJlY2VpdmUgZnVuY3Rpb24gY2FsbGVkIGJ5IE5FVF9SWF9TT0ZUSVJRCi0gKiBAc2tiOiB0aGUgcmVjZWl2ZSBza2IKLSAqIEBkZXY6IGFzc29jaWF0ZWQgbmV0IGRldmljZQotICogQHB0eXBlOiBjb250ZXh0Ci0gKiBAb2xkZGV2OiBsYXN0IGRldmljZQorICogZmNvZV9yY3YoKSAtIFJlY2VpdmUgcGFja2V0cyBmcm9tIGEgbmV0IGRldmljZQorICogQHNrYjogICAgVGhlIHJlY2VpdmVkIHBhY2tldAorICogQG5ldGRldjogVGhlIG5ldCBkZXZpY2UgdGhhdCB0aGUgcGFja2V0IHdhcyByZWNlaXZlZCBvbgorICogQHB0eXBlOiAgVGhlIHBhY2tldCB0eXBlIGNvbnRleHQKKyAqIEBvbGRkZXY6IFRoZSBsYXN0IGRldmljZSBuZXQgZGV2aWNlCiAgKgotICogdGhpcyBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHBhY2tldCBhbmQgYnVpbGQgZmMgZnJhbWUgYW5kIHBhc3MgaXQgdXAKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgTkVUX1JYX1NPRlRJUlEuIEl0IHJlY2VpdmVzIGEgcGFja2V0LCBidWlsZHMgYQorICogRkMgZnJhbWUgYW5kIHBhc3NlcyB0aGUgZnJhbWUgdG8gbGliZmMuCiAgKgogICogUmV0dXJuczogMCBmb3Igc3VjY2VzcwogICovCi1pbnQgZmNvZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK2ludCBmY29lX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCSAgICAgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKm9sZGRldikKIHsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGZjb2VfcmN2X2luZm8gKmZyOwogCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZTsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKQEAgLTk4OCwxNSArMTE3MiwxNSBAQAogCXVuc2lnbmVkIGludCBjcHU7CiAKIAlmY29lID0gY29udGFpbmVyX29mKHB0eXBlLCBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UsIGZjb2VfcGFja2V0X3R5cGUpOwotCWxwID0gZmNvZS0+Y3Rsci5scDsKLQlpZiAodW5saWtlbHkobHAgPT0gTlVMTCkpIHsKLQkJRkNPRV9ORVRERVZfREJHKGRldiwgIkNhbm5vdCBmaW5kIGhiYSBzdHJ1Y3R1cmUiKTsKKwlscG9ydCA9IGZjb2UtPmN0bHIubHA7CisJaWYgKHVubGlrZWx5KCFscG9ydCkpIHsKKwkJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIkNhbm5vdCBmaW5kIGhiYSBzdHJ1Y3R1cmUiKTsKIAkJZ290byBlcnIyOwogCX0KLQlpZiAoIWxwLT5saW5rX3VwKQorCWlmICghbHBvcnQtPmxpbmtfdXApCiAJCWdvdG8gZXJyMjsKIAotCUZDT0VfTkVUREVWX0RCRyhkZXYsICJza2JfaW5mbzogbGVuOiVkIGRhdGFfbGVuOiVkIGhlYWQ6JXAgIgorCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJza2JfaW5mbzogbGVuOiVkIGRhdGFfbGVuOiVkIGhlYWQ6JXAgIgogCQkJImRhdGE6JXAgdGFpbDolcCBlbmQ6JXAgc3VtOiVkIGRldjolcyIsCiAJCQlza2ItPmxlbiwgc2tiLT5kYXRhX2xlbiwgc2tiLT5oZWFkLCBza2ItPmRhdGEsCiAJCQlza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLApAQCAtMTAwNCw3ICsxMTg4LDcgQEAKIAogCS8qIGNoZWNrIGZvciBGQ09FIHBhY2tldCB0eXBlICovCiAJaWYgKHVubGlrZWx5KGV0aF9oZHIoc2tiKS0+aF9wcm90byAhPSBodG9ucyhFVEhfUF9GQ09FKSkpIHsKLQkJRkNPRV9ORVRERVZfREJHKGRldiwgIldyb25nIEZDIHR5cGUgZnJhbWUiKTsKKwkJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIldyb25nIEZDIHR5cGUgZnJhbWUiKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC0xMDEzLDE0ICsxMTk3LDE0IEBACiAJICogYW5kIEZDIGhlYWRlcnMgYXJlIHB1bGxlZCBpbnRvIHRoZSBsaW5lYXIgZGF0YSBhcmVhLgogCSAqLwogCWlmICh1bmxpa2VseSgoc2tiLT5sZW4gPCBGQ09FX01JTl9GUkFNRSkgfHwKLQkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCBGQ09FX0hFQURFUl9MRU4pKSkKKwkJICAgICAhcHNrYl9tYXlfcHVsbChza2IsIEZDT0VfSEVBREVSX0xFTikpKQogCQlnb3RvIGVycjsKIAogCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIHNpemVvZihzdHJ1Y3QgZmNvZV9oZHIpKTsKIAlmaCA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAlmciA9IGZjb2VfZGV2X2Zyb21fc2tiKHNrYik7Ci0JZnItPmZyX2RldiA9IGxwOworCWZyLT5mcl9kZXYgPSBscG9ydDsKIAlmci0+cHR5cGUgPSBwdHlwZTsKIAogCS8qCkBAIC0xMDQyLDcgKzEyMjYsNyBAQAogCQkgKiB0aGUgZmlyc3QgQ1BVIG5vdy4gRm9yIG5vbi1TTVAgc3lzdGVtcyB0aGlzCiAJCSAqIHdpbGwgY2hlY2sgdGhlIHNhbWUgQ1BVIHR3aWNlLgogCQkgKi8KLQkJRkNPRV9ORVRERVZfREJHKGRldiwgIkNQVSBpcyBvbmxpbmUsIGJ1dCBubyByZWNlaXZlIHRocmVhZCAiCisJCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJDUFUgaXMgb25saW5lLCBidXQgbm8gcmVjZWl2ZSB0aHJlYWQgIgogCQkJCSJyZWFkeSBmb3IgaW5jb21pbmcgc2tiLSB1c2luZyBmaXJzdCBvbmxpbmUgIgogCQkJCSJDUFUuXG4iKTsKIApAQCAtMTA2MSwxNSArMTI0NSwyOSBAQAogCSAqIHRoaXMgc2tiLiBXZSBhbHNvIGhhdmUgdGhpcyByZWNlaXZlIHRocmVhZCBsb2NrZWQsCiAJICogc28gd2UncmUgZnJlZSB0byBxdWV1ZSBza2JzIGludG8gaXQncyBxdWV1ZS4KIAkgKi8KLQlfX3NrYl9xdWV1ZV90YWlsKCZmcHMtPmZjb2VfcnhfbGlzdCwgc2tiKTsKLQlpZiAoZnBzLT5mY29lX3J4X2xpc3QucWxlbiA9PSAxKQotCQl3YWtlX3VwX3Byb2Nlc3MoZnBzLT50aHJlYWQpOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmZwcy0+ZmNvZV9yeF9saXN0LmxvY2spOworCS8qIElmIHRoaXMgaXMgYSBTQ1NJLUZDUCBmcmFtZSwgYW5kIHRoaXMgaXMgYWxyZWFkeSBleGVjdXRpbmcgb24gdGhlCisJICogY29ycmVjdCBDUFUsIGFuZCB0aGUgcXVldWUgZm9yIHRoaXMgQ1BVIGlzIGVtcHR5LCB0aGVuIGdvIGFoZWFkCisJICogYW5kIHByb2Nlc3MgdGhlIGZyYW1lIGRpcmVjdGx5IGluIHRoZSBzb2Z0aXJxIGNvbnRleHQuCisJICogVGhpcyBsZXRzIHVzIHByb2Nlc3MgY29tcGxldGlvbnMgd2l0aG91dCBjb250ZXh0IHN3aXRjaGluZyBmcm9tIHRoZQorCSAqIE5FVF9SWCBzb2Z0aXJxLCB0byBvdXIgcmVjZWl2ZSBwcm9jZXNzaW5nIHRocmVhZCwgYW5kIHRoZW4gYmFjayB0bworCSAqIEJMT0NLIHNvZnRpcnEgY29udGV4dC4KKwkgKi8KKwlpZiAoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9GQ1AgJiYKKwkgICAgY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSAmJgorCSAgICBza2JfcXVldWVfZW1wdHkoJmZwcy0+ZmNvZV9yeF9saXN0KSkgeworCQlzcGluX3VubG9ja19iaCgmZnBzLT5mY29lX3J4X2xpc3QubG9jayk7CisJCWZjb2VfcmVjdl9mcmFtZShza2IpOworCX0gZWxzZSB7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJmZwcy0+ZmNvZV9yeF9saXN0LCBza2IpOworCQlpZiAoZnBzLT5mY29lX3J4X2xpc3QucWxlbiA9PSAxKQorCQkJd2FrZV91cF9wcm9jZXNzKGZwcy0+dGhyZWFkKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmZwcy0+ZmNvZV9yeF9saXN0LmxvY2spOworCX0KIAogCXJldHVybiAwOwogZXJyOgotCWZjX2xwb3J0X2dldF9zdGF0cyhscCktPkVycm9yRnJhbWVzKys7CisJZmNfbHBvcnRfZ2V0X3N0YXRzKGxwb3J0KS0+RXJyb3JGcmFtZXMrKzsKIAogZXJyMjoKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTEwNzcsMTcgKzEyNzUsMjEgQEAKIH0KIAogLyoqCi0gKiBmY29lX3N0YXJ0X2lvKCkgLSBwYXNzIHRvIG5ldGRldiB0byBzdGFydCB4bWl0IGZvciBmY29lCi0gKiBAc2tiOiB0aGUgc2tiIHRvIGJlIHhtaXR0ZWQKKyAqIGZjb2Vfc3RhcnRfaW8oKSAtIFN0YXJ0IEZDb0UgSS9PCisgKiBAc2tiOiBUaGUgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSBuZXQgZGV2aWNlIHRvIHN0YXJ0IHRyYW5zbWl0dGluZworICogRkNvRSBwYWNrZXRzLgogICoKICAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdGljIGlubGluZSBpbnQgZmNvZV9zdGFydF9pbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBza19idWZmICpuc2tiOwogCWludCByYzsKIAotCXNrYl9nZXQoc2tiKTsKLQlyYyA9IGRldl9xdWV1ZV94bWl0KHNrYik7CisJbnNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCXJjID0gZGV2X3F1ZXVlX3htaXQobnNrYik7CiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTEwOTUsOSArMTI5NywxNSBAQAogfQogCiAvKioKLSAqIGZjb2VfZ2V0X3BhZ2VkX2NyY19lb2YoKSAtIGluIGNhc2Ugd2UgbmVlZCB0byBhbGxvYyBhIHBhZ2UgZm9yIGNyY19lb2YKLSAqIEBza2I6IHRoZSBza2IgdG8gYmUgeG1pdHRlZAotICogQHRsZW46IHRvdGFsIGxlbgorICogZmNvZV9nZXRfcGFnZWRfY3JjX2VvZigpIC0gQWxsb2NhdGUgYSBwYWdlIHRvIGJlIHVzZWQgZm9yIHRoZSB0cmFpbGVyIENSQworICogQHNrYjogIFRoZSBwYWNrZXQgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqIEB0bGVuOiBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSB0cmFpbGVyCisgKgorICogVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBhIHBhZ2UgZm9yIGZyYW1lIHRyYWlsZXJzLiBUaGUgcGFnZSBpcyByZS11c2VkIGlmCisgKiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBsZWZ0IG9uIGl0IGZvciB0aGUgY3VycmVudCB0cmFpbGVyLiBJZiB0aGVyZSBpc24ndAorICogZW5vdWdoIGJ1ZmZlciBsZWZ0IGEgbmV3IHBhZ2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgdHJhaWxlci4gUmVmZXJlbmNlIHRvCisgKiB0aGUgcGFnZSBmcm9tIHRoaXMgZnVuY3Rpb24gYXMgd2VsbCBhcyB0aGUgc2ticyB1c2luZyB0aGUgcGFnZSBmcmFnbWVudHMKKyAqIGVuc3VyZSB0aGF0IHRoZSBwYWdlIGlzIGZyZWVkIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lLgogICoKICAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKICAqLwpAQCAtMTEzNiwxMSArMTM0NCwxMiBAQAogfQogCiAvKioKLSAqIGZjb2VfZmNfY3JjKCkgLSBjYWxjdWxhdGVzIEZDIENSQyBpbiB0aGlzIGZjb2Ugc2tiCi0gKiBAZnA6IHRoZSBmY19mcmFtZSBjb250YWluaW5nIGRhdGEgdG8gYmUgY2hlY2tzdW1tZWQKKyAqIGZjb2VfZmNfY3JjKCkgLSBDYWxjdWxhdGVzIHRoZSBDUkMgZm9yIGEgZ2l2ZW4gZnJhbWUKKyAqIEBmcDogVGhlIGZyYW1lIHRvIGJlIGNoZWNrc3VtZWQKICAqCi0gKiBUaGlzIHVzZXMgY3JjMzIoKSB0byBjYWxjdWxhdGUgdGhlIGNyYyBmb3IgcG9ydCBmcmFtZQotICogUmV0dXJuICAgOiAzMiBiaXQgY3JjCisgKiBUaGlzIHVzZXMgY3JjMzIoKSByb3V0aW5lIHRvIGNhbGN1bGF0ZSB0aGUgQ1JDIGZvciBhIGZyYW1lCisgKgorICogUmV0dXJuOiBUaGUgMzIgYml0IENSQyB2YWx1ZQogICovCiB1MzIgZmNvZV9mY19jcmMoc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKQEAgLTExNzEsMTMgKzEzODAsMTMgQEAKIH0KIAogLyoqCi0gKiBmY29lX3htaXQoKSAtIEZDb0UgZnJhbWUgdHJhbnNtaXQgZnVuY3Rpb24KLSAqIEBscDoJdGhlIGFzc29jaWF0ZWQgbG9jYWwgZmNvZQotICogQGZwOiB0aGUgZmNfZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqIGZjb2VfeG1pdCgpIC0gVHJhbnNtaXQgYSBGQ29FIGZyYW1lCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgdGhlIGZyYW1lIGlzIHRvIGJlIHRyYW5zbWl0dGVkIGZvcgorICogQGZwOgkgICBUaGUgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQKICAqCi0gKiBSZXR1cm4gICA6IDAgZm9yIHN1Y2Nlc3MKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcwogICovCi1pbnQgZmNvZV94bWl0KHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mcmFtZSAqZnApCitpbnQgZmNvZV94bWl0KHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnApCiB7CiAJaW50IHdsZW47CiAJdTMyIGNyYzsKQEAgLTExODksNyArMTM5OCw3IEBACiAJdW5zaWduZWQgaW50IGhsZW47CQkvKiBoZWFkZXIgbGVuZ3RoIGltcGxpZXMgdGhlIHZlcnNpb24gKi8KIAl1bnNpZ25lZCBpbnQgdGxlbjsJCS8qIHRyYWlsZXIgbGVuZ3RoICovCiAJdW5zaWduZWQgaW50IGVsZW47CQkvKiBldGggaGVhZGVyLCBtYXkgaW5jbHVkZSB2bGFuICovCi0Jc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHApOworCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKIAlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2UgPSBwb3J0LT5mY29lOwogCXU4IHNvZiwgZW9mOwogCXN0cnVjdCBmY29lX2hkciAqaHA7CkBAIC0xMjAwLDEzICsxNDA5LDEzIEBACiAJc2tiID0gZnBfc2tiKGZwKTsKIAl3bGVuID0gc2tiLT5sZW4gLyBGQ09FX1dPUkRfVE9fQllURTsKIAotCWlmICghbHAtPmxpbmtfdXApIHsKKwlpZiAoIWxwb3J0LT5saW5rX3VwKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodW5saWtlbHkoZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSkgJiYKLQkgICAgZmNvZV9jdGxyX2Vsc19zZW5kKCZmY29lLT5jdGxyLCBza2IpKQorCSAgICBmY29lX2N0bHJfZWxzX3NlbmQoJmZjb2UtPmN0bHIsIGxwb3J0LCBza2IpKQogCQlyZXR1cm4gMDsKIAogCXNvZiA9IGZyX3NvZihmcCk7CkBAIC0xMjE4LDcgKzE0MjcsNyBAQAogCXdsZW4gPSAoc2tiLT5sZW4gLSB0bGVuICsgc2l6ZW9mKGNyYykpIC8gRkNPRV9XT1JEX1RPX0JZVEU7CiAKIAkvKiBjcmMgb2ZmbG9hZCAqLwotCWlmIChsaWtlbHkobHAtPmNyY19vZmZsb2FkKSkgeworCWlmIChsaWtlbHkobHBvcnQtPmNyY19vZmZsb2FkKSkgewogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl9oZWFkcm9vbShza2IpOwogCQlza2ItPmNzdW1fb2Zmc2V0ID0gc2tiLT5sZW47CkBAIC0xMjcxLDcgKzE0ODAsNyBAQAogCWlmICh1bmxpa2VseShmY29lLT5jdGxyLmZsb2dpX294aWQgIT0gRkNfWElEX1VOS05PV04pKQogCQltZW1jcHkoZWgtPmhfc291cmNlLCBmY29lLT5jdGxyLmN0bF9zcmNfYWRkciwgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtY3B5KGVoLT5oX3NvdXJjZSwgZmNvZS0+Y3Rsci5kYXRhX3NyY19hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShlaC0+aF9zb3VyY2UsIHBvcnQtPmRhdGFfc3JjX2FkZHIsIEVUSF9BTEVOKTsKIAogCWhwID0gKHN0cnVjdCBmY29lX2hkciAqKShlaCArIDEpOwogCW1lbXNldChocCwgMCwgc2l6ZW9mKCpocCkpOwpAQCAtMTI4MCw3ICsxNDg5LDcgQEAKIAlocC0+ZmNvZV9zb2YgPSBzb2Y7CiAKIAkvKiBmY29lIGxzbywgbXNzIGlzIGluIG1heF9wYXlsb2FkIHdoaWNoIGlzIG5vbi16ZXJvIGZvciBGQ1AgZGF0YSAqLwotCWlmIChscC0+c2VxX29mZmxvYWQgJiYgZnJfbWF4X3BheWxvYWQoZnApKSB7CisJaWYgKGxwb3J0LT5zZXFfb2ZmbG9hZCAmJiBmcl9tYXhfcGF5bG9hZChmcCkpIHsKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fRkNPRTsKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IGZyX21heF9wYXlsb2FkKGZwKTsKIAl9IGVsc2UgewpAQCAtMTI4OCwyMyArMTQ5NywyMyBAQAogCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gMDsKIAl9CiAJLyogdXBkYXRlIHR4IHN0YXRzOiByZWdhcmRsZXNzIGlmIExMRCBmYWlscyAqLwotCXN0YXRzID0gZmNfbHBvcnRfZ2V0X3N0YXRzKGxwKTsKKwlzdGF0cyA9IGZjX2xwb3J0X2dldF9zdGF0cyhscG9ydCk7CiAJc3RhdHMtPlR4RnJhbWVzKys7CiAJc3RhdHMtPlR4V29yZHMgKz0gd2xlbjsKIAogCS8qIHNlbmQgZG93biB0byBsbGQgKi8KLQlmcl9kZXYoZnApID0gbHA7CisJZnJfZGV2KGZwKSA9IGxwb3J0OwogCWlmIChwb3J0LT5mY29lX3BlbmRpbmdfcXVldWUucWxlbikKLQkJZmNvZV9jaGVja193YWl0X3F1ZXVlKGxwLCBza2IpOworCQlmY29lX2NoZWNrX3dhaXRfcXVldWUobHBvcnQsIHNrYik7CiAJZWxzZSBpZiAoZmNvZV9zdGFydF9pbyhza2IpKQotCQlmY29lX2NoZWNrX3dhaXRfcXVldWUobHAsIHNrYik7CisJCWZjb2VfY2hlY2tfd2FpdF9xdWV1ZShscG9ydCwgc2tiKTsKIAogCXJldHVybiAwOwogfQogCiAvKioKLSAqIGZjb2VfcGVyY3B1X2ZsdXNoX2RvbmUoKSAtIEluZGljYXRlIHBlcmNwdSBxdWV1ZSBmbHVzaCBjb21wbGV0aW9uLgotICogQHNrYjogdGhlIHNrYiBiZWluZyBjb21wbGV0ZWQuCisgKiBmY29lX3BlcmNwdV9mbHVzaF9kb25lKCkgLSBJbmRpY2F0ZSBwZXItQ1BVIHF1ZXVlIGZsdXNoIGNvbXBsZXRpb24KKyAqIEBza2I6IFRoZSBjb21wbGV0ZWQgc2tiIChhcmd1bWVudCByZXF1aXJlZCBieSBkZXN0cnVjdG9yKQogICovCiBzdGF0aWMgdm9pZCBmY29lX3BlcmNwdV9mbHVzaF9kb25lKHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xMzEyLDI1ICsxNTIxLDEzMyBAQAogfQogCiAvKioKLSAqIGZjb2VfcGVyY3B1X3JlY2VpdmVfdGhyZWFkKCkgLSByZWN2IHRocmVhZCBwZXIgY3B1Ci0gKiBAYXJnOiBwdHIgdG8gdGhlIGZjb2UgcGVyIGNwdSBzdHJ1Y3QKKyAqIGZjb2VfcmVjdl9mcmFtZSgpIC0gcHJvY2VzcyBhIHNpbmdsZSByZWNlaXZlZCBmcmFtZQorICogQHNrYjogZnJhbWUgdG8gcHJvY2VzcworICovCitzdGF0aWMgdm9pZCBmY29lX3JlY3ZfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgZnJfbGVuOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CisJc3RydWN0IGZjb2VfcmN2X2luZm8gKmZyOworCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqc3RhdHM7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjb2VfY3JjX2VvZiBjcmNfZW9mOworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJdTggKm1hYyA9IE5VTEw7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgZmNvZV9oZHIgKmhwOworCisJZnIgPSBmY29lX2Rldl9mcm9tX3NrYihza2IpOworCWxwb3J0ID0gZnItPmZyX2RldjsKKwlpZiAodW5saWtlbHkoIWxwb3J0KSkgeworCQlpZiAoc2tiLT5kZXN0cnVjdG9yICE9IGZjb2VfcGVyY3B1X2ZsdXNoX2RvbmUpCisJCQlGQ09FX05FVERFVl9EQkcoc2tiLT5kZXYsICJOVUxMIGxwb3J0IGluIHNrYiIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCUZDT0VfTkVUREVWX0RCRyhza2ItPmRldiwgInNrYl9pbmZvOiBsZW46JWQgZGF0YV9sZW46JWQgIgorCQkJImhlYWQ6JXAgZGF0YTolcCB0YWlsOiVwIGVuZDolcCBzdW06JWQgZGV2OiVzIiwKKwkJCXNrYi0+bGVuLCBza2ItPmRhdGFfbGVuLAorCQkJc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCXNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmNzdW0sCisJCQlza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIjxOVUxMPiIpOworCisJLyoKKwkgKiBTYXZlIHNvdXJjZSBNQUMgYWRkcmVzcyBiZWZvcmUgZGlzY2FyZGluZyBoZWFkZXIuCisJICovCisJcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOworCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCisJCXNrYl9saW5lYXJpemUoc2tiKTsJLyogbm90IGlkZWFsICovCisJbWFjID0gZXRoX2hkcihza2IpLT5oX3NvdXJjZTsKKworCS8qCisJICogRnJhbWUgbGVuZ3RoIGNoZWNrcyBhbmQgc2V0dGluZyB1cCB0aGUgaGVhZGVyIHBvaW50ZXJzCisJICogd2FzIGRvbmUgaW4gZmNvZV9yY3YgYWxyZWFkeS4KKwkgKi8KKwlocCA9IChzdHJ1Y3QgZmNvZV9oZHIgKikgc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJZmggPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCisJc3RhdHMgPSBmY19scG9ydF9nZXRfc3RhdHMobHBvcnQpOworCWlmICh1bmxpa2VseShGQ19GQ09FX0RFQ0FQU19WRVIoaHApICE9IEZDX0ZDT0VfVkVSKSkgeworCQlpZiAoc3RhdHMtPkVycm9yRnJhbWVzIDwgNSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImZjb2U6IEZDb0UgdmVyc2lvbiAiCisJCQkgICAgICAgIm1pc21hdGNoOiBUaGUgZnJhbWUgaGFzICIKKwkJCSAgICAgICAidmVyc2lvbiAleCwgYnV0IHRoZSAiCisJCQkgICAgICAgImluaXRpYXRvciBzdXBwb3J0cyB2ZXJzaW9uICIKKwkJCSAgICAgICAiJXhcbiIsIEZDX0ZDT0VfREVDQVBTX1ZFUihocCksCisJCQkgICAgICAgRkNfRkNPRV9WRVIpOworCQlzdGF0cy0+RXJyb3JGcmFtZXMrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZmNvZV9oZHIpKTsKKwlmcl9sZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgZmNvZV9jcmNfZW9mKTsKKworCXN0YXRzLT5SeEZyYW1lcysrOworCXN0YXRzLT5SeFdvcmRzICs9IGZyX2xlbiAvIEZDT0VfV09SRF9UT19CWVRFOworCisJZnAgPSAoc3RydWN0IGZjX2ZyYW1lICopc2tiOworCWZjX2ZyYW1lX2luaXQoZnApOworCWZyX2RldihmcCkgPSBscG9ydDsKKwlmcl9zb2YoZnApID0gaHAtPmZjb2Vfc29mOworCisJLyogQ29weSBvdXQgdGhlIENSQyBhbmQgRU9GIHRyYWlsZXIgZm9yIGFjY2VzcyAqLworCWlmIChza2JfY29weV9iaXRzKHNrYiwgZnJfbGVuLCAmY3JjX2VvZiwgc2l6ZW9mKGNyY19lb2YpKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwlmcl9lb2YoZnApID0gY3JjX2VvZi5mY29lX2VvZjsKKwlmcl9jcmMoZnApID0gY3JjX2VvZi5mY29lX2NyYzMyOworCWlmIChwc2tiX3RyaW0oc2tiLCBmcl9sZW4pKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBXZSBvbmx5IGNoZWNrIENSQyBpZiBubyBvZmZsb2FkIGlzIGF2YWlsYWJsZSBhbmQgaWYgaXQgaXMKKwkgKiBpdCdzIHNvbGljaXRlZCBkYXRhLCBpbiB3aGljaCBjYXNlLCB0aGUgRkNQIGxheWVyIHdvdWxkCisJICogY2hlY2sgaXQgZHVyaW5nIHRoZSBjb3B5LgorCSAqLworCWlmIChscG9ydC0+Y3JjX29mZmxvYWQgJiYKKwkgICAgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJCWZyX2ZsYWdzKGZwKSAmPSB+RkNQSEZfQ1JDX1VOQ0hFQ0tFRDsKKwllbHNlCisJCWZyX2ZsYWdzKGZwKSB8PSBGQ1BIRl9DUkNfVU5DSEVDS0VEOworCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlpZiAoZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRERfU09MX0RBVEEgJiYKKwkgICAgZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9GQ1ApIHsKKwkJZmNfZXhjaF9yZWN2KGxwb3J0LCBmcCk7CisJCXJldHVybjsKKwl9CisJaWYgKGZyX2ZsYWdzKGZwKSAmIEZDUEhGX0NSQ19VTkNIRUNLRUQpIHsKKwkJaWYgKGxlMzJfdG9fY3B1KGZyX2NyYyhmcCkpICE9CisJCSAgICB+Y3JjMzIofjAsIHNrYi0+ZGF0YSwgZnJfbGVuKSkgeworCQkJaWYgKHN0YXRzLT5JbnZhbGlkQ1JDQ291bnQgPCA1KQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImZjb2U6IGRyb3BwaW5nICIKKwkJCQkgICAgICAgImZyYW1lIHdpdGggQ1JDIGVycm9yXG4iKTsKKwkJCXN0YXRzLT5JbnZhbGlkQ1JDQ291bnQrKzsKKwkJCXN0YXRzLT5FcnJvckZyYW1lcysrOworCQkJZmNfZnJhbWVfZnJlZShmcCk7CisJCQlyZXR1cm47CisJCX0KKwkJZnJfZmxhZ3MoZnApICY9IH5GQ1BIRl9DUkNfVU5DSEVDS0VEOworCX0KKwlmY19leGNoX3JlY3YobHBvcnQsIGZwKTsKK30KKworLyoqCisgKiBmY29lX3BlcmNwdV9yZWNlaXZlX3RocmVhZCgpIC0gVGhlIHBlci1DUFUgcGFja2V0IHJlY2VpdmUgdGhyZWFkCisgKiBAYXJnOiBUaGUgcGVyLUNQVSBjb250ZXh0CiAgKgogICogUmV0dXJuOiAwIGZvciBzdWNjZXNzCiAgKi8KIGludCBmY29lX3BlcmNwdV9yZWNlaXZlX3RocmVhZCh2b2lkICphcmcpCiB7CiAJc3RydWN0IGZjb2VfcGVyY3B1X3MgKnAgPSBhcmc7Ci0JdTMyIGZyX2xlbjsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOwotCXN0cnVjdCBmY29lX3Jjdl9pbmZvICpmcjsKLQlzdHJ1Y3QgZmNvZV9kZXZfc3RhdHMgKnN0YXRzOwotCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGZjb2VfY3JjX2VvZiBjcmNfZW9mOwotCXN0cnVjdCBmY19mcmFtZSAqZnA7Ci0JdTggKm1hYyA9IE5VTEw7Ci0Jc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKLQlzdHJ1Y3QgZmNvZV9oZHIgKmhwOwogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOwogCkBAIC0xMzQ3LDEyOSArMTY2NCwyNyBAQAogCQkJc3Bpbl9sb2NrX2JoKCZwLT5mY29lX3J4X2xpc3QubG9jayk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgoJnAtPmZjb2VfcnhfbGlzdC5sb2NrKTsKLQkJZnIgPSBmY29lX2Rldl9mcm9tX3NrYihza2IpOwotCQlscCA9IGZyLT5mcl9kZXY7Ci0JCWlmICh1bmxpa2VseShscCA9PSBOVUxMKSkgewotCQkJaWYgKHNrYi0+ZGVzdHJ1Y3RvciAhPSBmY29lX3BlcmNwdV9mbHVzaF9kb25lKQotCQkJCUZDT0VfTkVUREVWX0RCRyhza2ItPmRldiwgIk5VTEwgbHBvcnQgaW4gc2tiIik7Ci0JCQlrZnJlZV9za2Ioc2tiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJRkNPRV9ORVRERVZfREJHKHNrYi0+ZGV2LCAic2tiX2luZm86IGxlbjolZCBkYXRhX2xlbjolZCAiCi0JCQkJImhlYWQ6JXAgZGF0YTolcCB0YWlsOiVwIGVuZDolcCBzdW06JWQgZGV2OiVzIiwKLQkJCQlza2ItPmxlbiwgc2tiLT5kYXRhX2xlbiwKLQkJCQlza2ItPmhlYWQsIHNrYi0+ZGF0YSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAotCQkJCXNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmNzdW0sCi0JCQkJc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICI8TlVMTD4iKTsKLQotCQkvKgotCQkgKiBTYXZlIHNvdXJjZSBNQUMgYWRkcmVzcyBiZWZvcmUgZGlzY2FyZGluZyBoZWFkZXIuCi0JCSAqLwotCQlwb3J0ID0gbHBvcnRfcHJpdihscCk7Ci0JCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCi0JCQlza2JfbGluZWFyaXplKHNrYik7CS8qIG5vdCBpZGVhbCAqLwotCQltYWMgPSBldGhfaGRyKHNrYiktPmhfc291cmNlOwotCi0JCS8qCi0JCSAqIEZyYW1lIGxlbmd0aCBjaGVja3MgYW5kIHNldHRpbmcgdXAgdGhlIGhlYWRlciBwb2ludGVycwotCQkgKiB3YXMgZG9uZSBpbiBmY29lX3JjdiBhbHJlYWR5LgotCQkgKi8KLQkJaHAgPSAoc3RydWN0IGZjb2VfaGRyICopIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwotCQlmaCA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Ci0KLQkJc3RhdHMgPSBmY19scG9ydF9nZXRfc3RhdHMobHApOwotCQlpZiAodW5saWtlbHkoRkNfRkNPRV9ERUNBUFNfVkVSKGhwKSAhPSBGQ19GQ09FX1ZFUikpIHsKLQkJCWlmIChzdGF0cy0+RXJyb3JGcmFtZXMgPCA1KQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImZjb2U6IEZDb0UgdmVyc2lvbiAiCi0JCQkJICAgICAgICJtaXNtYXRjaDogVGhlIGZyYW1lIGhhcyAiCi0JCQkJICAgICAgICJ2ZXJzaW9uICV4LCBidXQgdGhlICIKLQkJCQkgICAgICAgImluaXRpYXRvciBzdXBwb3J0cyB2ZXJzaW9uICIKLQkJCQkgICAgICAgIiV4XG4iLCBGQ19GQ09FX0RFQ0FQU19WRVIoaHApLAotCQkJCSAgICAgICBGQ19GQ09FX1ZFUik7Ci0JCQlzdGF0cy0+RXJyb3JGcmFtZXMrKzsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZmNvZV9oZHIpKTsKLQkJZnJfbGVuID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGZjb2VfY3JjX2VvZik7Ci0KLQkJc3RhdHMtPlJ4RnJhbWVzKys7Ci0JCXN0YXRzLT5SeFdvcmRzICs9IGZyX2xlbiAvIEZDT0VfV09SRF9UT19CWVRFOwotCi0JCWZwID0gKHN0cnVjdCBmY19mcmFtZSAqKXNrYjsKLQkJZmNfZnJhbWVfaW5pdChmcCk7Ci0JCWZyX2RldihmcCkgPSBscDsKLQkJZnJfc29mKGZwKSA9IGhwLT5mY29lX3NvZjsKLQotCQkvKiBDb3B5IG91dCB0aGUgQ1JDIGFuZCBFT0YgdHJhaWxlciBmb3IgYWNjZXNzICovCi0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgZnJfbGVuLCAmY3JjX2VvZiwgc2l6ZW9mKGNyY19lb2YpKSkgewotCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmcl9lb2YoZnApID0gY3JjX2VvZi5mY29lX2VvZjsKLQkJZnJfY3JjKGZwKSA9IGNyY19lb2YuZmNvZV9jcmMzMjsKLQkJaWYgKHBza2JfdHJpbShza2IsIGZyX2xlbikpIHsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSBvbmx5IGNoZWNrIENSQyBpZiBubyBvZmZsb2FkIGlzIGF2YWlsYWJsZSBhbmQgaWYgaXQgaXMKLQkJICogaXQncyBzb2xpY2l0ZWQgZGF0YSwgaW4gd2hpY2ggY2FzZSwgdGhlIEZDUCBsYXllciB3b3VsZAotCQkgKiBjaGVjayBpdCBkdXJpbmcgdGhlIGNvcHkuCi0JCSAqLwotCQlpZiAobHAtPmNyY19vZmZsb2FkICYmIHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQotCQkJZnJfZmxhZ3MoZnApICY9IH5GQ1BIRl9DUkNfVU5DSEVDS0VEOwotCQllbHNlCi0JCQlmcl9mbGFncyhmcCkgfD0gRkNQSEZfQ1JDX1VOQ0hFQ0tFRDsKLQotCQlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwotCQlpZiAoZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRERfU09MX0RBVEEgJiYKLQkJICAgIGZoLT5maF90eXBlID09IEZDX1RZUEVfRkNQKSB7Ci0JCQlmY19leGNoX3JlY3YobHAsIGZwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChmcl9mbGFncyhmcCkgJiBGQ1BIRl9DUkNfVU5DSEVDS0VEKSB7Ci0JCQlpZiAobGUzMl90b19jcHUoZnJfY3JjKGZwKSkgIT0KLQkJCSAgICB+Y3JjMzIofjAsIHNrYi0+ZGF0YSwgZnJfbGVuKSkgewotCQkJCWlmIChzdGF0cy0+SW52YWxpZENSQ0NvdW50IDwgNSkKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmNvZTogZHJvcHBpbmcgIgotCQkJCQkgICAgICAgImZyYW1lIHdpdGggQ1JDIGVycm9yXG4iKTsKLQkJCQlzdGF0cy0+SW52YWxpZENSQ0NvdW50Kys7Ci0JCQkJc3RhdHMtPkVycm9yRnJhbWVzKys7Ci0JCQkJZmNfZnJhbWVfZnJlZShmcCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmcl9mbGFncyhmcCkgJj0gfkZDUEhGX0NSQ19VTkNIRUNLRUQ7Ci0JCX0KLQkJaWYgKHVubGlrZWx5KHBvcnQtPmZjb2UtPmN0bHIuZmxvZ2lfb3hpZCAhPSBGQ19YSURfVU5LTk9XTikgJiYKLQkJICAgIGZjb2VfY3Rscl9yZWN2X2Zsb2dpKCZwb3J0LT5mY29lLT5jdGxyLCBmcCwgbWFjKSkgewotCQkJZmNfZnJhbWVfZnJlZShmcCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmY19leGNoX3JlY3YobHAsIGZwKTsKKwkJZmNvZV9yZWN2X2ZyYW1lKHNrYik7CiAJfQogCXJldHVybiAwOwogfQogCiAvKioKLSAqIGZjb2VfY2hlY2tfd2FpdF9xdWV1ZSgpIC0gYXR0ZW1wdCB0byBjbGVhciB0aGUgdHJhbnNtaXQgYmFja2xvZwotICogQGxwOiB0aGUgZmNfbHBvcnQKKyAqIGZjb2VfY2hlY2tfd2FpdF9xdWV1ZSgpIC0gQXR0ZW1wdCB0byBjbGVhciB0aGUgdHJhbnNtaXQgYmFja2xvZworICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB3aG9zZSBiYWNrbG9nIGlzIHRvIGJlIGNsZWFyZWQKICAqCi0gKiBUaGlzIGVtcHRpZXMgdGhlIHdhaXRfcXVldWUsIGRlcXVldWUgdGhlIGhlYWQgb2YgdGhlIHdhaXRfcXVldWUgcXVldWUKLSAqIGFuZCBjYWxscyBmY29lX3N0YXJ0X2lvKCkgZm9yIGVhY2ggcGFja2V0LCBpZiBhbGwgc2tiIGhhdmUgYmVlbgotICogdHJhbnNtaXR0ZWQsIHJldHVybiBxbGVuIG9yIC0xIGlmIGEgZXJyb3Igb2NjdXJzLCB0aGVuIHJlc3RvcmUKLSAqIHdhaXRfcXVldWUgYW5kIHRyeSBhZ2FpbiBsYXRlci4KKyAqIFRoaXMgZW1wdGllcyB0aGUgd2FpdF9xdWV1ZSwgZGVxdWV1ZXMgdGhlIGhlYWQgb2YgdGhlIHdhaXRfcXVldWUgcXVldWUKKyAqIGFuZCBjYWxscyBmY29lX3N0YXJ0X2lvKCkgZm9yIGVhY2ggcGFja2V0LiBJZiBhbGwgc2tiIGhhdmUgYmVlbgorICogdHJhbnNtaXR0ZWQgaXQgcmV0dXJucyB0aGUgcWxlbi4gSWYgYW4gZXJyb3Igb2NjdXJzIGl0IHJlc3RvcmVzCisgKiB3YWl0X3F1ZXVlICh0byB0cnkgYWdhaW4gbGF0ZXIpIGFuZCByZXR1cm5zIC0xLgogICoKLSAqIFRoZSB3YWl0X3F1ZXVlIGlzIHVzZWQgd2hlbiB0aGUgc2tiIHRyYW5zbWl0IGZhaWxzLiBza2Igd2lsbCBnbwotICogaW4gdGhlIHdhaXRfcXVldWUgd2hpY2ggd2lsbCBiZSBlbXB0aWVkIGJ5IHRoZSB0aW1lciBmdW5jdGlvbiBvcgorICogVGhlIHdhaXRfcXVldWUgaXMgdXNlZCB3aGVuIHRoZSBza2IgdHJhbnNtaXQgZmFpbHMuIFRoZSBmYWlsZWQgc2tiCisgKiB3aWxsIGdvIGluIHRoZSB3YWl0X3F1ZXVlIHdoaWNoIHdpbGwgYmUgZW1wdGllZCBieSB0aGUgdGltZXIgZnVuY3Rpb24gb3IKICAqIGJ5IHRoZSBuZXh0IHNrYiB0cmFuc21pdC4KICAqLwotc3RhdGljIHZvaWQgZmNvZV9jaGVja193YWl0X3F1ZXVlKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBmY29lX2NoZWNrX3dhaXRfcXVldWUoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscCk7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwogCWludCByYzsKIAogCXNwaW5fbG9ja19iaCgmcG9ydC0+ZmNvZV9wZW5kaW5nX3F1ZXVlLmxvY2spOwpAQCAtMTUwMSwxOSArMTcxNiwxOSBAQAogCX0KIAogCWlmIChwb3J0LT5mY29lX3BlbmRpbmdfcXVldWUucWxlbiA8IEZDT0VfTE9XX1FVRVVFX0RFUFRIKQotCQlscC0+cWZ1bGwgPSAwOworCQlscG9ydC0+cWZ1bGwgPSAwOwogCWlmIChwb3J0LT5mY29lX3BlbmRpbmdfcXVldWUucWxlbiAmJiAhdGltZXJfcGVuZGluZygmcG9ydC0+dGltZXIpKQogCQltb2RfdGltZXIoJnBvcnQtPnRpbWVyLCBqaWZmaWVzICsgMik7CiAJcG9ydC0+ZmNvZV9wZW5kaW5nX3F1ZXVlX2FjdGl2ZSA9IDA7CiBvdXQ6CiAJaWYgKHBvcnQtPmZjb2VfcGVuZGluZ19xdWV1ZS5xbGVuID4gRkNPRV9NQVhfUVVFVUVfREVQVEgpCi0JCWxwLT5xZnVsbCA9IDE7CisJCWxwb3J0LT5xZnVsbCA9IDE7CiAJc3Bpbl91bmxvY2tfYmgoJnBvcnQtPmZjb2VfcGVuZGluZ19xdWV1ZS5sb2NrKTsKIAlyZXR1cm47CiB9CiAKIC8qKgotICogZmNvZV9kZXZfc2V0dXAoKSAtIHNldHVwIGxpbmsgY2hhbmdlIG5vdGlmaWNhdGlvbiBpbnRlcmZhY2UKKyAqIGZjb2VfZGV2X3NldHVwKCkgLSBTZXR1cCB0aGUgbGluayBjaGFuZ2Ugbm90aWZpY2F0aW9uIGludGVyZmFjZQogICovCiBzdGF0aWMgdm9pZCBmY29lX2Rldl9zZXR1cCh2b2lkKQogewpAQCAtMTUyMSw3ICsxNzM2LDcgQEAKIH0KIAogLyoqCi0gKiBmY29lX2Rldl9jbGVhbnVwKCkgLSBjbGVhbnVwIGxpbmsgY2hhbmdlIG5vdGlmaWNhdGlvbiBpbnRlcmZhY2UKKyAqIGZjb2VfZGV2X2NsZWFudXAoKSAtIENsZWFudXAgdGhlIGxpbmsgY2hhbmdlIG5vdGlmaWNhdGlvbiBpbnRlcmZhY2UKICAqLwogc3RhdGljIHZvaWQgZmNvZV9kZXZfY2xlYW51cCh2b2lkKQogewpAQCAtMTUyOSwxOSArMTc0NCwxOSBAQAogfQogCiAvKioKLSAqIGZjb2VfZGV2aWNlX25vdGlmaWNhdGlvbigpIC0gbmV0ZGV2IGV2ZW50IG5vdGlmaWNhdGlvbiBjYWxsYmFjawotICogQG5vdGlmaWVyOiBjb250ZXh0IG9mIHRoZSBub3RpZmljYXRpb24KLSAqIEBldmVudDogdHlwZSBvZiBldmVudAotICogQHB0cjogZml4ZWQgYXJyYXkgZm9yIG91dHB1dCBwYXJzZWQgaWZuYW1lCisgKiBmY29lX2RldmljZV9ub3RpZmljYXRpb24oKSAtIEhhbmRsZXIgZm9yIG5ldCBkZXZpY2UgZXZlbnRzCisgKiBAbm90aWZpZXI6IFRoZSBjb250ZXh0IG9mIHRoZSBub3RpZmljYXRpb24KKyAqIEBldmVudDogICAgVGhlIHR5cGUgb2YgZXZlbnQKKyAqIEBwdHI6ICAgICAgVGhlIG5ldCBkZXZpY2UgdGhhdCB0aGUgZXZlbnQgd2FzIG9uCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGV0aGVybmV0IGRyaXZlciBpbiBjYXNlIG9mIGxpbmsgY2hhbmdlIGV2ZW50CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRXRoZXJuZXQgZHJpdmVyIGluIGNhc2Ugb2YgbGluayBjaGFuZ2UgZXZlbnQuCiAgKgogICogUmV0dXJuczogMCBmb3Igc3VjY2VzcwogICovCiBzdGF0aWMgaW50IGZjb2VfZGV2aWNlX25vdGlmaWNhdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAogCQkJCSAgICB1bG9uZyBldmVudCwgdm9pZCAqcHRyKQogewotCXN0cnVjdCBmY19scG9ydCAqbHAgPSBOVUxMOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwdHI7CiAJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CkBAIC0xNTUyLDExICsxNzY3LDExIEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjb2UsICZmY29lX2hvc3RsaXN0LCBsaXN0KSB7CiAJCWlmIChmY29lLT5uZXRkZXYgPT0gbmV0ZGV2KSB7Ci0JCQlscCA9IGZjb2UtPmN0bHIubHA7CisJCQlscG9ydCA9IGZjb2UtPmN0bHIubHA7CiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAobHAgPT0gTlVMTCkgeworCWlmICghbHBvcnQpIHsKIAkJcmMgPSBOT1RJRllfRE9ORTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTU3MCwxMCArMTc4NSwxMiBAQAogCWNhc2UgTkVUREVWX0NIQU5HRToKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCQlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfRkNPRV9NVFUpCisJCQlicmVhazsKIAkJbWZzID0gbmV0ZGV2LT5tdHUgLSAoc2l6ZW9mKHN0cnVjdCBmY29lX2hkcikgKwogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBmY29lX2NyY19lb2YpKTsKIAkJaWYgKG1mcyA+PSBGQ19NSU5fTUFYX0ZSQU1FKQotCQkJZmNfc2V0X21mcyhscCwgbWZzKTsKKwkJCWZjX3NldF9tZnMobHBvcnQsIG1mcyk7CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX1JFR0lTVEVSOgogCQlicmVhazsKQEAgLTE1ODgsMjIgKzE4MDUsMjIgQEAKIAkJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIlVua25vd24gZXZlbnQgJWxkICIKIAkJCQkiZnJvbSBuZXRkZXYgbmV0bGlua1xuIiwgZXZlbnQpOwogCX0KLQlpZiAobGlua19wb3NzaWJsZSAmJiAhZmNvZV9saW5rX29rKGxwKSkKKwlpZiAobGlua19wb3NzaWJsZSAmJiAhZmNvZV9saW5rX29rKGxwb3J0KSkKIAkJZmNvZV9jdGxyX2xpbmtfdXAoJmZjb2UtPmN0bHIpOwogCWVsc2UgaWYgKGZjb2VfY3Rscl9saW5rX2Rvd24oJmZjb2UtPmN0bHIpKSB7Ci0JCXN0YXRzID0gZmNfbHBvcnRfZ2V0X3N0YXRzKGxwKTsKKwkJc3RhdHMgPSBmY19scG9ydF9nZXRfc3RhdHMobHBvcnQpOwogCQlzdGF0cy0+TGlua0ZhaWx1cmVDb3VudCsrOwotCQlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUobHApOworCQlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUobHBvcnQpOwogCX0KIG91dDoKIAlyZXR1cm4gcmM7CiB9CiAKIC8qKgotICogZmNvZV9pZl90b19uZXRkZXYoKSAtIHBhcnNlIGEgbmFtZSBidWZmZXIgdG8gZ2V0IG5ldGRldgotICogQGJ1ZmZlcjogaW5jb21pbmcgYnVmZmVyIHRvIGJlIGNvcGllZAorICogZmNvZV9pZl90b19uZXRkZXYoKSAtIFBhcnNlIGEgbmFtZSBidWZmZXIgdG8gZ2V0IGEgbmV0IGRldmljZQorICogQGJ1ZmZlcjogVGhlIG5hbWUgb2YgdGhlIG5ldCBkZXZpY2UKICAqCi0gKiBSZXR1cm5zOiBOVUxMIG9yIHB0ciB0byBuZXRfZGV2aWNlCisgKiBSZXR1cm5zOiBOVUxMIG9yIGEgcHRyIHRvIG5ldF9kZXZpY2UKICAqLwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpmY29lX2lmX3RvX25ldGRldihjb25zdCBjaGFyICpidWZmZXIpCiB7CkBAIC0xNjIxLDkgKzE4MzgsMTEgQEAKIH0KIAogLyoqCi0gKiBmY29lX2Rlc3Ryb3koKSAtIGhhbmRsZXMgdGhlIGRlc3Ryb3kgZnJvbSBzeXNmcwotICogQGJ1ZmZlcjogZXhwZWN0ZWQgdG8gYmUgYW4gZXRoIGlmIG5hbWUKLSAqIEBrcDogYXNzb2NpYXRlZCBrZXJuZWwgcGFyYW0KKyAqIGZjb2VfZGVzdHJveSgpIC0gRGVzdHJveSBhIEZDb0UgaW50ZXJmYWNlCisgKiBAYnVmZmVyOiBUaGUgbmFtZSBvZiB0aGUgRXRoZXJuZXQgaW50ZXJmYWNlIHRvIGJlIGRlc3Ryb3llZAorICogQGtwOgkgICAgVGhlIGFzc29jaWF0ZWQga2VybmVsIHBhcmFtZXRlcgorICoKKyAqIENhbGxlZCBmcm9tIHN5c2ZzLgogICoKICAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKICAqLwpAQCAtMTYzMSw3ICsxODUwLDcgQEAKIHsKIAlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlpbnQgcmM7CisJaW50IHJjID0gMDsKIAogCW11dGV4X2xvY2soJmZjb2VfY29uZmlnX211dGV4KTsKICNpZmRlZiBDT05GSUdfRkNPRV9NT0RVTEUKQEAgLTE2NzAsNiArMTg4OSwxMCBAQAogCXJldHVybiByYzsKIH0KIAorLyoqCisgKiBmY29lX2Rlc3Ryb3lfd29yaygpIC0gRGVzdHJveSBhIEZDb0UgcG9ydCBpbiBhIGRlZmVycmVkIHdvcmsgY29udGV4dAorICogQHdvcms6IEhhbmRsZSB0byB0aGUgRkNvRSBwb3J0IHRvIGJlIGRlc3Ryb3llZAorICovCiBzdGF0aWMgdm9pZCBmY29lX2Rlc3Ryb3lfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKQEAgLTE2ODEsOSArMTkwNCwxMSBAQAogfQogCiAvKioKLSAqIGZjb2VfY3JlYXRlKCkgLSBIYW5kbGVzIHRoZSBjcmVhdGUgY2FsbCBmcm9tIHN5c2ZzCi0gKiBAYnVmZmVyOiBleHBlY3RlZCB0byBiZSBhbiBldGggaWYgbmFtZQotICogQGtwOiBhc3NvY2lhdGVkIGtlcm5lbCBwYXJhbQorICogZmNvZV9jcmVhdGUoKSAtIENyZWF0ZSBhIGZjb2UgaW50ZXJmYWNlCisgKiBAYnVmZmVyOiBUaGUgbmFtZSBvZiB0aGUgRXRoZXJuZXQgaW50ZXJmYWNlIHRvIGNyZWF0ZSBvbgorICogQGtwOgkgICAgVGhlIGFzc29jaWF0ZWQga2VybmVsIHBhcmFtCisgKgorICogQ2FsbGVkIGZyb20gc3lzZnMuCiAgKgogICogUmV0dXJuczogMCBmb3Igc3VjY2VzcwogICovCkBAIC0xNzI2LDcgKzE5NTEsNyBAQAogCQlnb3RvIG91dF9wdXRkZXY7CiAJfQogCi0JbHBvcnQgPSBmY29lX2lmX2NyZWF0ZShmY29lLCAmbmV0ZGV2LT5kZXYpOworCWxwb3J0ID0gZmNvZV9pZl9jcmVhdGUoZmNvZSwgJm5ldGRldi0+ZGV2LCAwKTsKIAlpZiAoSVNfRVJSKGxwb3J0KSkgewogCQlwcmludGsoS0VSTl9FUlIgImZjb2U6IEZhaWxlZCB0byBjcmVhdGUgaW50ZXJmYWNlICglcylcbiIsCiAJCSAgICAgICBuZXRkZXYtPm5hbWUpOwpAQCAtMTc2MiwxNiArMTk4Nyw5IEBACiAJcmV0dXJuIHJjOwogfQogCi1tb2R1bGVfcGFyYW1fY2FsbChjcmVhdGUsIGZjb2VfY3JlYXRlLCBOVUxMLCBOVUxMLCBTX0lXVVNSKTsKLV9fTU9EVUxFX1BBUk1fVFlQRShjcmVhdGUsICJzdHJpbmciKTsKLU1PRFVMRV9QQVJNX0RFU0MoY3JlYXRlLCAiQ3JlYXRlIGZjb2UgZmNvZSB1c2luZyBuZXQgZGV2aWNlIHBhc3NlZCBpbi4iKTsKLW1vZHVsZV9wYXJhbV9jYWxsKGRlc3Ryb3ksIGZjb2VfZGVzdHJveSwgTlVMTCwgTlVMTCwgU19JV1VTUik7Ci1fX01PRFVMRV9QQVJNX1RZUEUoZGVzdHJveSwgInN0cmluZyIpOwotTU9EVUxFX1BBUk1fREVTQyhkZXN0cm95LCAiRGVzdHJveSBmY29lIGZjb2UiKTsKLQogLyoqCi0gKiBmY29lX2xpbmtfb2soKSAtIENoZWNrIGlmIGxpbmsgaXMgb2sgZm9yIHRoZSBmY19scG9ydAotICogQGxwOiBwdHIgdG8gdGhlIGZjX2xwb3J0CisgKiBmY29lX2xpbmtfb2soKSAtIENoZWNrIGlmIHRoZSBsaW5rIGlzIE9LIGZvciBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gY2hlY2sgbGluayBvbgogICoKICAqIEFueSBwZXJtYW5lbnRseS1kaXNxdWFsaWZ5aW5nIGNvbmRpdGlvbnMgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2hlY2tlZC4KICAqIFRoaXMgYWxzbyB1cGRhdGVzIHRoZSBzcGVlZCBzZXR0aW5nLCB3aGljaCBtYXkgY2hhbmdlIHdpdGggbGluayBmb3IgMTAwLzEwMDAuCkBAIC0xNzgzLDI2ICsyMDAxLDI2IEBACiAgKiBSZXR1cm5zOiAwIGlmIGxpbmsgaXMgT0sgZm9yIHVzZSBieSBGQ29FLgogICoKICAqLwotaW50IGZjb2VfbGlua19vayhzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoraW50IGZjb2VfbGlua19vayhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+ZmNvZS0+bmV0ZGV2OworCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG9ydC0+ZmNvZS0+bmV0ZGV2OwogCXN0cnVjdCBldGh0b29sX2NtZCBlY21kID0geyBFVEhUT09MX0dTRVQgfTsKIAotCWlmICgoZGV2LT5mbGFncyAmIElGRl9VUCkgJiYgbmV0aWZfY2Fycmllcl9vayhkZXYpICYmCi0JICAgICghZGV2X2V0aHRvb2xfZ2V0X3NldHRpbmdzKGRldiwgJmVjbWQpKSkgewotCQlscC0+bGlua19zdXBwb3J0ZWRfc3BlZWRzICY9CisJaWYgKChuZXRkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKKwkgICAgKCFkZXZfZXRodG9vbF9nZXRfc2V0dGluZ3MobmV0ZGV2LCAmZWNtZCkpKSB7CisJCWxwb3J0LT5saW5rX3N1cHBvcnRlZF9zcGVlZHMgJj0KIAkJCX4oRkNfUE9SVFNQRUVEXzFHQklUIHwgRkNfUE9SVFNQRUVEXzEwR0JJVCk7CiAJCWlmIChlY21kLnN1cHBvcnRlZCAmIChTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAogCQkJCSAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkpCi0JCQlscC0+bGlua19zdXBwb3J0ZWRfc3BlZWRzIHw9IEZDX1BPUlRTUEVFRF8xR0JJVDsKKwkJCWxwb3J0LT5saW5rX3N1cHBvcnRlZF9zcGVlZHMgfD0gRkNfUE9SVFNQRUVEXzFHQklUOwogCQlpZiAoZWNtZC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsKQotCQkJbHAtPmxpbmtfc3VwcG9ydGVkX3NwZWVkcyB8PQorCQkJbHBvcnQtPmxpbmtfc3VwcG9ydGVkX3NwZWVkcyB8PQogCQkJCUZDX1BPUlRTUEVFRF8xMEdCSVQ7CiAJCWlmIChlY21kLnNwZWVkID09IFNQRUVEXzEwMDApCi0JCQlscC0+bGlua19zcGVlZCA9IEZDX1BPUlRTUEVFRF8xR0JJVDsKKwkJCWxwb3J0LT5saW5rX3NwZWVkID0gRkNfUE9SVFNQRUVEXzFHQklUOwogCQlpZiAoZWNtZC5zcGVlZCA9PSBTUEVFRF8xMDAwMCkKLQkJCWxwLT5saW5rX3NwZWVkID0gRkNfUE9SVFNQRUVEXzEwR0JJVDsKKwkJCWxwb3J0LT5saW5rX3NwZWVkID0gRkNfUE9SVFNQRUVEXzEwR0JJVDsKIAogCQlyZXR1cm4gMDsKIAl9CkBAIC0xODEwLDggKzIwMjgsOCBAQAogfQogCiAvKioKLSAqIGZjb2VfcGVyY3B1X2NsZWFuKCkgLSBDbGVhciB0aGUgcGVuZGluZyBza2JzIGZvciBhbiBscG9ydAotICogQGxwOiB0aGUgZmNfbHBvcnQKKyAqIGZjb2VfcGVyY3B1X2NsZWFuKCkgLSBDbGVhciBhbGwgcGVuZGluZyBza2JzIGZvciBhbiBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHdob3NlIHNrYnMgYXJlIHRvIGJlIGNsZWFyZWQKICAqCiAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGZjb2VfY3JlYXRlX211dGV4IGhlbGQgdG8gc2luZ2xlLXRocmVhZCBjb21wbGV0aW9uLgogICoKQEAgLTE4MjAsNyArMjAzOCw3IEBACiAgKiB0aGVyZSBubyBwYWNrZXRzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBscG9ydCwgYnV0IGFsc28gdGhhdCBhbnkKICAqIHRocmVhZHMgYWxyZWFkeSBoYW5kbGluZyBwYWNrZXQgaGF2ZSByZXR1cm5lZC4KICAqLwotdm9pZCBmY29lX3BlcmNwdV9jbGVhbihzdHJ1Y3QgZmNfbHBvcnQgKmxwKQordm9pZCBmY29lX3BlcmNwdV9jbGVhbihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewogCXN0cnVjdCBmY29lX3BlcmNwdV9zICpwcDsKIAlzdHJ1Y3QgZmNvZV9yY3ZfaW5mbyAqZnI7CkBAIC0xODM4LDcgKzIwNTYsNyBAQAogCQkgICAgIHNrYiA9IG5leHQpIHsKIAkJCW5leHQgPSBza2ItPm5leHQ7CiAJCQlmciA9IGZjb2VfZGV2X2Zyb21fc2tiKHNrYik7Ci0JCQlpZiAoZnItPmZyX2RldiA9PSBscCkgeworCQkJaWYgKGZyLT5mcl9kZXYgPT0gbHBvcnQpIHsKIAkJCQlfX3NrYl91bmxpbmsoc2tiLCBsaXN0KTsKIAkJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCX0KQEAgLTE4NjcsMTMgKzIwODUsMTEgQEAKIAogLyoqCiAgKiBmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUoKSAtIERlcXVldWUgYSBza2IgYW5kIGZyZWUgaXQKLSAqIEBscDogdGhlIGNvcnJlc3BvbmRpbmcgZmNfbHBvcnQKLSAqCi0gKiBSZXR1cm5zOiBub25lCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIGRlcXVldWUgYSBza2Igb24KICAqLwotdm9pZCBmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUoc3RydWN0IGZjX2xwb3J0ICpscCkKK3ZvaWQgZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7Ci0Jc3RydWN0IGZjb2VfcG9ydCAgKnBvcnQgPSBscG9ydF9wcml2KGxwKTsKKwlzdHJ1Y3QgZmNvZV9wb3J0ICAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlzcGluX2xvY2tfYmgoJnBvcnQtPmZjb2VfcGVuZGluZ19xdWV1ZS5sb2NrKTsKQEAgLTE4ODYsMTAgKzIxMDIsMTAgQEAKIH0KIAogLyoqCi0gKiBmY29lX3Jlc2V0KCkgLSBSZXNldHMgdGhlIGZjb2UKLSAqIEBzaG9zdDogc2hvc3QgdGhlIHJlc2V0IGlzIGZyb20KKyAqIGZjb2VfcmVzZXQoKSAtIFJlc2V0IGEgbG9jYWwgcG9ydAorICogQHNob3N0OiBUaGUgU0NTSSBob3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jYWwgcG9ydCB0byBiZSByZXNldAogICoKLSAqIFJldHVybnM6IGFsd2F5cyAwCisgKiBSZXR1cm5zOiBBbHdheXMgMCAocmV0dXJuIHZhbHVlIHJlcXVpcmVkIGJ5IEZDIHRyYW5zcG9ydCB0ZW1wbGF0ZSkKICAqLwogaW50IGZjb2VfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CkBAIC0xODk5LDMwICsyMTE1LDMzIEBACiB9CiAKIC8qKgotICogZmNvZV9ob3N0bGlzdF9sb29rdXBfcG9ydCgpIC0gZmluZCB0aGUgY29ycmVzcG9uZGluZyBscG9ydCBieSBhIGdpdmVuIGRldmljZQotICogQGRldjogdGhpcyBpcyBjdXJyZW50bHkgcHRyIHRvIG5ldF9kZXZpY2UKKyAqIGZjb2VfaG9zdGxpc3RfbG9va3VwX3BvcnQoKSAtIEZpbmQgdGhlIEZDb0UgaW50ZXJmYWNlIGFzc29jaWF0ZWQgd2l0aCBhIG5ldCBkZXZpY2UKKyAqIEBuZXRkZXY6IFRoZSBuZXQgZGV2aWNlIHVzZWQgYXMgYSBrZXkKICAqCi0gKiBSZXR1cm5zOiBOVUxMIG9yIHRoZSBsb2NhdGVkIGZjb2VfcG9ydAotICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgUk5MIG11dGV4IGhlbGQKKyAqIExvY2tpbmc6IE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIFJOTCBtdXRleCBoZWxkLgorICoKKyAqIFJldHVybnM6IE5VTEwgb3IgdGhlIEZDb0UgaW50ZXJmYWNlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKgotZmNvZV9ob3N0bGlzdF9sb29rdXBfcG9ydChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorZmNvZV9ob3N0bGlzdF9sb29rdXBfcG9ydChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNvZSwgJmZjb2VfaG9zdGxpc3QsIGxpc3QpIHsKLQkJaWYgKGZjb2UtPm5ldGRldiA9PSBkZXYpCisJCWlmIChmY29lLT5uZXRkZXYgPT0gbmV0ZGV2KQogCQkJcmV0dXJuIGZjb2U7CiAJfQogCXJldHVybiBOVUxMOwogfQogCiAvKioKLSAqIGZjb2VfaG9zdGxpc3RfbG9va3VwKCkgLSBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGxwb3J0IGJ5IG5ldGRldgotICogQG5ldGRldjogcHRyIHRvIG5ldF9kZXZpY2UKKyAqIGZjb2VfaG9zdGxpc3RfbG9va3VwKCkgLSBGaW5kIHRoZSBsb2NhbCBwb3J0IGFzc29jaWF0ZWQgd2l0aCBhCisgKgkJCSAgICBnaXZlbiBuZXQgZGV2aWNlCisgKiBAbmV0ZGV2OiBUaGUgbmV0ZGV2aWNlIHVzZWQgYXMgYSBrZXkKICAqCi0gKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCi0gKiBMb2NraW5nOiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBSVE5MIG11dGV4IGhlbGQKKyAqIExvY2tpbmc6IE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIFJUTkwgbXV0ZXggaGVsZAorICoKKyAqIFJldHVybnM6IE5VTEwgb3IgdGhlIGxvY2FsIHBvcnQKICAqLwogc3RhdGljIHN0cnVjdCBmY19scG9ydCAqZmNvZV9ob3N0bGlzdF9sb29rdXAoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKQEAgLTE5MzMsMTEgKzIxNTIsMTMgQEAKIH0KIAogLyoqCi0gKiBmY29lX2hvc3RsaXN0X2FkZCgpIC0gQWRkIGEgbHBvcnQgdG8gbHBvcnRzIGxpc3QKLSAqIEBscDogcHRyIHRvIHRoZSBmY19scG9ydCB0byBiZSBhZGRlZAorICogZmNvZV9ob3N0bGlzdF9hZGQoKSAtIEFkZCB0aGUgRkNvRSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSBhIGxvY2FsCisgKgkJCSBwb3J0IHRvIHRoZSBob3N0bGlzdAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IGlkZW50aWZpZXMgdGhlIEZDb0UgaW50ZXJmYWNlIHRvIGJlIGFkZGVkCisgKgorICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgUlROTCBtdXRleCBoZWxkCiAgKgogICogUmV0dXJuczogMCBmb3Igc3VjY2VzcwotICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgUlROTCBtdXRleCBoZWxkCiAgKi8KIHN0YXRpYyBpbnQgZmNvZV9ob3N0bGlzdF9hZGQoY29uc3Qgc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKQEAgLTE5NTQsMTUgKzIxNzUsMTUgQEAKIH0KIAogLyoqCi0gKiBmY29lX2luaXQoKSAtIGZjb2UgbW9kdWxlIGxvYWRpbmcgaW5pdGlhbGl6YXRpb24KKyAqIGZjb2VfaW5pdCgpIC0gSW5pdGlhbGl6ZSBmY29lLmtvCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqIFJldHVybnM6IDAgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGZjb2VfaW5pdCh2b2lkKQogeworCXN0cnVjdCBmY29lX3BlcmNwdV9zICpwOwogCXVuc2lnbmVkIGludCBjcHU7CiAJaW50IHJjID0gMDsKLQlzdHJ1Y3QgZmNvZV9wZXJjcHVfcyAqcDsKIAogCW11dGV4X2xvY2soJmZjb2VfY29uZmlnX211dGV4KTsKIApAQCAtMTk5OSwxNSArMjIyMCwxNSBAQAogbW9kdWxlX2luaXQoZmNvZV9pbml0KTsKIAogLyoqCi0gKiBmY29lX2V4aXQoKSAtIGZjb2UgbW9kdWxlIHVubG9hZGluZyBjbGVhbnVwCisgKiBmY29lX2V4aXQoKSAtIENsZWFuIHVwIGZjb2Uua28KICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICogUmV0dXJuczogMCBvbiBzdWNjZXNzIG9yIGEgIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUKICAqLwogc3RhdGljIHZvaWQgX19leGl0IGZjb2VfZXhpdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBjcHU7CiAJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lLCAqdG1wOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgaW50IGNwdTsKIAogCW11dGV4X2xvY2soJmZjb2VfY29uZmlnX211dGV4KTsKIApAQCAtMjAzMyw5ICsyMjU0LDIzOCBAQAogCS8qIGZsdXNoIGFueSBhc3luY3Jvbm91cyBpbnRlcmZhY2UgZGVzdHJveXMsCiAJICogdGhpcyBzaG91bGQgaGFwcGVuIGFmdGVyIHRoZSBuZXRkZXYgbm90aWZpZXIgaXMgdW5yZWdpc3RlcmVkICovCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkvKiBUaGF0IHdpbGwgZmx1c2ggb3V0IGFsbCB0aGUgTl9Qb3J0cyBvbiB0aGUgaG9zdGxpc3QsIGJ1dCBub3cgd2UKKwkgKiBtYXkgaGF2ZSBOUElWIFZOX1BvcnRzIHNjaGVkdWxlZCBmb3IgZGVzdHJ1Y3Rpb24gKi8KKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCiAJLyogZGV0YWNoIGZyb20gc2NzaSB0cmFuc3BvcnQKIAkgKiBtdXN0IGhhcHBlbiBhZnRlciBhbGwgZGVzdHJveXMgYXJlIGRvbmUsIHRoZXJlZm9yIGFmdGVyIHRoZSBmbHVzaCAqLwogCWZjb2VfaWZfZXhpdCgpOwogfQogbW9kdWxlX2V4aXQoZmNvZV9leGl0KTsKKworLyoqCisgKiBmY29lX2Zsb2dpX3Jlc3AoKSAtIEZDb0Ugc3BlY2lmaWMgRkxPR0kgYW5kIEZESVNDIHJlc3BvbnNlIGhhbmRsZXIKKyAqIEBzZXE6IGFjdGl2ZSBzZXF1ZW5jZSBpbiB0aGUgRkxPR0kgb3IgRkRJU0MgZXhjaGFuZ2UKKyAqIEBmcDogcmVzcG9uc2UgZnJhbWUsIG9yIGVycm9yIGVuY29kZWQgaW4gYSBwb2ludGVyICh0aW1lb3V0KQorICogQGFyZzogcG9pbnRlciB0aGUgdGhlIGZjb2VfY3RsciBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGhhbmRsZXMgTUFDIGFkZHJlc3MgbWFuYWdtZW50IGZvciBGQ29FLCB0aGVuIHBhc3NlcyBjb250cm9sIG9uIHRvCisgKiB0aGUgbGliZmMgRkxPR0kgcmVzcG9uc2UgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9mbG9naV9yZXNwKHN0cnVjdCBmY19zZXEgKnNlcSwgc3RydWN0IGZjX2ZyYW1lICpmcCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBmY29lX2N0bHIgKmZpcCA9IGFyZzsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXhjaCA9IGZjX3NlcV9leGNoKHNlcSk7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGV4Y2gtPmxwOworCXU4ICptYWM7CisKKwlpZiAoSVNfRVJSKGZwKSkKKwkJZ290byBkb25lOworCisJbWFjID0gZnJfY2IoZnApLT5ncmFudGVkX21hYzsKKwlpZiAoaXNfemVyb19ldGhlcl9hZGRyKG1hYykpIHsKKwkJLyogcHJlLUZJUCAqLworCQlpZiAoZmNvZV9jdGxyX3JlY3ZfZmxvZ2koZmlwLCBscG9ydCwgZnApKSB7CisJCQlmY19mcmFtZV9mcmVlKGZwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlmY29lX3VwZGF0ZV9zcmNfbWFjKGxwb3J0LCBtYWMpOworZG9uZToKKwlmY19scG9ydF9mbG9naV9yZXNwKHNlcSwgZnAsIGxwb3J0KTsKK30KKworLyoqCisgKiBmY29lX2xvZ29fcmVzcCgpIC0gRkNvRSBzcGVjaWZpYyBMT0dPIHJlc3BvbnNlIGhhbmRsZXIKKyAqIEBzZXE6IGFjdGl2ZSBzZXF1ZW5jZSBpbiB0aGUgTE9HTyBleGNoYW5nZQorICogQGZwOiByZXNwb25zZSBmcmFtZSwgb3IgZXJyb3IgZW5jb2RlZCBpbiBhIHBvaW50ZXIgKHRpbWVvdXQpCisgKiBAYXJnOiBwb2ludGVyIHRoZSB0aGUgZmNvZV9jdGxyIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaGFuZGxlcyBNQUMgYWRkcmVzcyBtYW5hZ21lbnQgZm9yIEZDb0UsIHRoZW4gcGFzc2VzIGNvbnRyb2wgb24gdG8KKyAqIHRoZSBsaWJmYyBMT0dPIHJlc3BvbnNlIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfbG9nb19yZXNwKHN0cnVjdCBmY19zZXEgKnNlcSwgc3RydWN0IGZjX2ZyYW1lICpmcCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBhcmc7CisJc3RhdGljIHU4IHplcm9fbWFjW0VUSF9BTEVOXSA9IHsgMCB9OworCisJaWYgKCFJU19FUlIoZnApKQorCQlmY29lX3VwZGF0ZV9zcmNfbWFjKGxwb3J0LCB6ZXJvX21hYyk7CisJZmNfbHBvcnRfbG9nb19yZXNwKHNlcSwgZnAsIGxwb3J0KTsKK30KKworLyoqCisgKiBmY29lX2Vsc2N0X3NlbmQgLSBGQ29FIHNwZWNpZmljIEVMUyBoYW5kbGVyCisgKgorICogVGhpcyBkb2VzIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBvZiBGSVAgZW5jYXBzdWFsdGVkIEVMUyBleGNoYW5nZXMgZm9yIEZDb0UsCisgKiB1c2luZyBGQ29FIHNwZWNpZmljIHJlc3BvbnNlIGhhbmRsZXJzIGFuZCBwYXNzaW5nIHRoZSBGSVAgY29udHJvbGxlciBhcworICogdGhlIGFyZ3VtZW50ICh0aGUgbHBvcnQgaXMgc3RpbGwgYXZhaWxhYmxlIGZyb20gdGhlIGV4Y2hhbmdlKS4KKyAqCisgKiBNb3N0IG9mIHRoZSB3b3JrIGhlcmUgaXMganVzdCBoYW5kZWQgb2ZmIHRvIHRoZSBsaWJmYyByb3V0aW5lLgorICovCitzdGF0aWMgc3RydWN0IGZjX3NlcSAqZmNvZV9lbHNjdF9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHUzMiBkaWQsCisJCQkJICAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCwgdW5zaWduZWQgaW50IG9wLAorCQkJCSAgICAgIHZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosCisJCQkJCQkgICBzdHJ1Y3QgZmNfZnJhbWUgKiwKKwkJCQkJCSAgIHZvaWQgKiksCisJCQkJICAgICAgdm9pZCAqYXJnLCB1MzIgdGltZW91dCkKK3sKKwlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7CisJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lID0gcG9ydC0+ZmNvZTsKKwlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSAmZmNvZS0+Y3RscjsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRUxTX0ZMT0dJOgorCWNhc2UgRUxTX0ZESVNDOgorCQlyZXR1cm4gZmNfZWxzY3Rfc2VuZChscG9ydCwgZGlkLCBmcCwgb3AsIGZjb2VfZmxvZ2lfcmVzcCwKKwkJCQkgICAgIGZpcCwgdGltZW91dCk7CisJY2FzZSBFTFNfTE9HTzoKKwkJLyogb25seSBob29rIG9udG8gZmFicmljIGxvZ291dHMsIG5vdCBwb3J0IGxvZ291dHMgKi8KKwkJaWYgKG50b2gyNChmaC0+ZmhfZF9pZCkgIT0gRkNfRklEX0ZMT0dJKQorCQkJYnJlYWs7CisJCXJldHVybiBmY19lbHNjdF9zZW5kKGxwb3J0LCBkaWQsIGZwLCBvcCwgZmNvZV9sb2dvX3Jlc3AsCisJCQkJICAgICBscG9ydCwgdGltZW91dCk7CisJfQorCXJldHVybiBmY19lbHNjdF9zZW5kKGxwb3J0LCBkaWQsIGZwLCBvcCwgcmVzcCwgYXJnLCB0aW1lb3V0KTsKK30KKworLyoqCisgKiBmY29lX3Zwb3J0X2NyZWF0ZSgpIC0gY3JlYXRlIGFuIGZjX2hvc3Qvc2NzaV9ob3N0IGZvciBhIHZwb3J0CisgKiBAdnBvcnQ6IGZjX3Zwb3J0IG9iamVjdCB0byBjcmVhdGUgYSBuZXcgZmNfaG9zdCBmb3IKKyAqIEBkaXNhYmxlZDogc3RhcnQgdGhlIG5ldyBmY19ob3N0IGluIGEgZGlzYWJsZWQgc3RhdGUgYnkgZGVmYXVsdD8KKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgZmNvZV92cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCwgYm9vbCBkaXNhYmxlZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZwb3J0X3RvX3Nob3N0KHZwb3J0KTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KG5fcG9ydCk7CisJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lID0gcG9ydC0+ZmNvZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZmNvZS0+bmV0ZGV2OworCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydDsKKworCW11dGV4X2xvY2soJmZjb2VfY29uZmlnX211dGV4KTsKKwl2bl9wb3J0ID0gZmNvZV9pZl9jcmVhdGUoZmNvZSwgJnZwb3J0LT5kZXYsIDEpOworCW11dGV4X3VubG9jaygmZmNvZV9jb25maWdfbXV0ZXgpOworCisJaWYgKElTX0VSUih2bl9wb3J0KSkgeworCQlwcmludGsoS0VSTl9FUlIgImZjb2U6IGZjb2VfdnBvcnRfY3JlYXRlKCVzKSBmYWlsZWRcbiIsCisJCSAgICAgICBuZXRkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoZGlzYWJsZWQpIHsKKwkJZmNfdnBvcnRfc2V0X3N0YXRlKHZwb3J0LCBGQ19WUE9SVF9ESVNBQkxFRCk7CisJfSBlbHNlIHsKKwkJdm5fcG9ydC0+Ym9vdF90aW1lID0gamlmZmllczsKKwkJZmNfZmFicmljX2xvZ2luKHZuX3BvcnQpOworCQlmY192cG9ydF9zZXRsaW5rKHZuX3BvcnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmY29lX3Zwb3J0X2Rlc3Ryb3koKSAtIGRlc3Ryb3kgdGhlIGZjX2hvc3Qvc2NzaV9ob3N0IGZvciBhIHZwb3J0CisgKiBAdnBvcnQ6IGZjX3Zwb3J0IG9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZAorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBmY29lX3Zwb3J0X2Rlc3Ryb3koc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZwb3J0X3RvX3Nob3N0KHZwb3J0KTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydCA9IHZwb3J0LT5kZF9kYXRhOworCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KHZuX3BvcnQpOworCisJbXV0ZXhfbG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisJbGlzdF9kZWwoJnZuX3BvcnQtPmxpc3QpOworCW11dGV4X3VubG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisJc2NoZWR1bGVfd29yaygmcG9ydC0+ZGVzdHJveV93b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmY29lX3Zwb3J0X2Rpc2FibGUoKSAtIGNoYW5nZSB2cG9ydCBzdGF0ZQorICogQHZwb3J0OiB2cG9ydCB0byBicmluZyBvbmxpbmUvb2ZmbGluZQorICogQGRpc2FibGU6IHNob3VsZCB0aGUgdnBvcnQgYmUgZGlzYWJsZWQ/CisgKi8KK3N0YXRpYyBpbnQgZmNvZV92cG9ydF9kaXNhYmxlKHN0cnVjdCBmY192cG9ydCAqdnBvcnQsIGJvb2wgZGlzYWJsZSkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gdnBvcnQtPmRkX2RhdGE7CisKKwlpZiAoZGlzYWJsZSkgeworCQlmY192cG9ydF9zZXRfc3RhdGUodnBvcnQsIEZDX1ZQT1JUX0RJU0FCTEVEKTsKKwkJZmNfZmFicmljX2xvZ29mZihscG9ydCk7CisJfSBlbHNlIHsKKwkJbHBvcnQtPmJvb3RfdGltZSA9IGppZmZpZXM7CisJCWZjX2ZhYnJpY19sb2dpbihscG9ydCk7CisJCWZjX3Zwb3J0X3NldGxpbmsobHBvcnQpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZjb2VfdnBvcnRfc2V0X3N5bWJvbGljX25hbWUoKSAtIGFwcGVuZCB2cG9ydCBzdHJpbmcgdG8gc3ltYm9saWMgbmFtZQorICogQHZwb3J0OiBmY192cG9ydCB3aXRoIGEgbmV3IHN5bWJvbGljIG5hbWUgc3RyaW5nCisgKgorICogQWZ0ZXIgZ2VuZXJhdGluZyBhIG5ldyBzeW1ib2xpYyBuYW1lIHN0cmluZywgYSBuZXcgUlNQTl9JRCByZXF1ZXN0IGlzCisgKiBzZW50IHRvIHRoZSBuYW1lIHNlcnZlci4gIFRoZXJlIGlzIG5vIHJlc3BvbnNlIGhhbmRsZXIsIHNvIGlmIGl0IGZhaWxzCisgKiBmb3Igc29tZSByZWFzb24gaXQgd2lsbCBub3QgYmUgcmV0cmllZC4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9zZXRfdnBvcnRfc3ltYm9saWNfbmFtZShzdHJ1Y3QgZmNfdnBvcnQgKnZwb3J0KQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSB2cG9ydC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXNpemVfdCBsZW47CisKKwlzbnByaW50ZihmY19ob3N0X3N5bWJvbGljX25hbWUobHBvcnQtPmhvc3QpLCBGQ19TWU1CT0xJQ19OQU1FX1NJWkUsCisJCSAiJXMgdiVzIG92ZXIgJXMgOiAlcyIsIEZDT0VfTkFNRSwgRkNPRV9WRVJTSU9OLAorCQkgZmNvZV9uZXRkZXYobHBvcnQpLT5uYW1lLCB2cG9ydC0+c3ltYm9saWNfbmFtZSk7CisKKwlpZiAobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZKQorCQlyZXR1cm47CisKKwlsZW4gPSBzdHJubGVuKGZjX2hvc3Rfc3ltYm9saWNfbmFtZShscG9ydC0+aG9zdCksIDI1NSk7CisJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGZjX2N0X2hkcikgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgZmNfbnNfcnNwbikgKyBsZW4pOworCWlmICghZnApCisJCXJldHVybjsKKwlscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgRkNfRklEX0RJUl9TRVJWLCBmcCwgRkNfTlNfUlNQTl9JRCwKKwkJCSAgICAgTlVMTCwgTlVMTCwgMyAqIGxwb3J0LT5yX2FfdG92KTsKK30KKworLyoqCisgKiBmY29lX2dldF9sZXNiKCkgLSBGaWxsIHRoZSBGQ29FIExpbmsgRXJyb3IgU3RhdHVzIEJsb2NrCisgKiBAbHBvcnQ6IHRoZSBsb2NhbCBwb3J0CisgKiBAZmNfbGVzYjogdGhlIGxpbmsgZXJyb3Igc3RhdHVzIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfZ2V0X2xlc2Ioc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKKwkJCSBzdHJ1Y3QgZmNfZWxzX2xlc2IgKmZjX2xlc2IpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwl1MzIgbGZjLCB2bGZjLCBtZGFjOworCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqZGV2c3Q7CisJc3RydWN0IGZjb2VfZmNfZWxzX2xlc2IgKmxlc2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2VfbmV0ZGV2KGxwb3J0KTsKKworCWxmYyA9IDA7CisJdmxmYyA9IDA7CisJbWRhYyA9IDA7CisJbGVzYiA9IChzdHJ1Y3QgZmNvZV9mY19lbHNfbGVzYiAqKWZjX2xlc2I7CisJbWVtc2V0KGxlc2IsIDAsIHNpemVvZigqbGVzYikpOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJZGV2c3QgPSBwZXJfY3B1X3B0cihscG9ydC0+ZGV2X3N0YXRzLCBjcHUpOworCQlsZmMgKz0gZGV2c3QtPkxpbmtGYWlsdXJlQ291bnQ7CisJCXZsZmMgKz0gZGV2c3QtPlZMaW5rRmFpbHVyZUNvdW50OworCQltZGFjICs9IGRldnN0LT5NaXNzRGlzY0FkdkNvdW50OworCX0KKwlsZXNiLT5sZXNiX2xpbmtfZmFpbCA9IGh0b25sKGxmYyk7CisJbGVzYi0+bGVzYl92bGlua19mYWlsID0gaHRvbmwodmxmYyk7CisJbGVzYi0+bGVzYl9taXNzX2ZrYSA9IGh0b25sKG1kYWMpOworCWxlc2ItPmxlc2JfZmNzX2Vycm9yID0gaHRvbmwoZGV2X2dldF9zdGF0cyhuZXRkZXYpLT5yeF9jcmNfZXJyb3JzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuaCBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuaAppbmRleCBjZTdmNjBmLi5jNjliMmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmgKKysrIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5oCkBAIC0zMiw3ICszMiw3IEBACiAjZGVmaW5lIEZDT0VfTkFNRQkiZmNvZSIKICNkZWZpbmUgRkNPRV9WRU5ET1IJIk9wZW4tRkNvRS5vcmciCiAKLSNkZWZpbmUgRkNPRV9NQVhfTFVOCQkyNTUKKyNkZWZpbmUgRkNPRV9NQVhfTFVOCQkweEZGRkYKICNkZWZpbmUgRkNPRV9NQVhfRkNQX1RBUkdFVAkyNTYKIAogI2RlZmluZSBGQ09FX01BWF9PVVRTVEFORElOR19DT01NQU5EUwkxMDI0CkBAIC00MCwxMSArNDAsMTcgQEAKICNkZWZpbmUgRkNPRV9NSU5fWElECQkweDAwMDAJLyogdGhlIG1pbiB4aWQgc3VwcG9ydGVkIGJ5IGZjb2Vfc3cgKi8KICNkZWZpbmUgRkNPRV9NQVhfWElECQkweDBGRkYJLyogdGhlIG1heCB4aWQgc3VwcG9ydGVkIGJ5IGZjb2Vfc3cgKi8KIAorLyoKKyAqIE1heCBNVFUgZm9yIEZDb0U6IDE0IChGQ29FIGhlYWRlcikgKyAyNCAoRkMgaGVhZGVyKSArIDIxMTIgKG1heCBGQyBwYXlsb2FkKQorICogKyA0IChGQyBDUkMpICsgNCAoRkNvRSB0cmFpbGVyKSA9ICAyMTU4IGJ5dGVzCisgKi8KKyNkZWZpbmUgRkNPRV9NVFUJMjE1OAorCiB1bnNpZ25lZCBpbnQgZmNvZV9kZWJ1Z19sb2dnaW5nOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX2xvZ2dpbmcsIGZjb2VfZGVidWdfbG9nZ2luZywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19sb2dnaW5nLCAiYSBiaXQgbWFzayBvZiBsb2dnaW5nIGxldmVscyIpOwogCi0jZGVmaW5lIEZDT0VfTE9HR0lORyAgICAgICAgMHgwMSAvKiBHZW5lcmFsIGxvZ2dpbmcsIG5vdCBjYXRlZ29yaXplZCAqLworI2RlZmluZSBGQ09FX0xPR0dJTkcJICAgIDB4MDEgLyogR2VuZXJhbCBsb2dnaW5nLCBub3QgY2F0ZWdvcml6ZWQgKi8KICNkZWZpbmUgRkNPRV9ORVRERVZfTE9HR0lORyAweDAyIC8qIE5ldGRldmljZSBsb2dnaW5nICovCiAKICNkZWZpbmUgRkNPRV9DSEVDS19MT0dHSU5HKExFVkVMLCBDTUQpCQkJCQlcCkBAIC02NCw4ICs3MCwxMyBAQAogCQkJICAgcHJpbnRrKEtFUk5fSU5GTyAiZmNvZTogJXM6ICIgZm10LAlcCiAJCQkJICBuZXRkZXYtPm5hbWUsICMjYXJncyk7KQogCi0vKgotICogdGhpcyBwZXJjcHUgc3RydWN0IGZvciBmY29lCisvKioKKyAqIHN0cnVjdCBmY29lX3BlcmNwdV9zIC0gVGhlIHBlci1DUFUgY29udGV4dCBmb3IgRkNvRSByZWNlaXZlIHRocmVhZHMKKyAqIEB0aHJlYWQ6CSAgICBUaGUgdGhyZWFkIGNvbnRleHQKKyAqIEBmY29lX3J4X2xpc3Q6ICAgVGhlIHF1ZXVlIG9mIHBlbmRpbmcgcGFja2V0cyB0byBwcm9jZXNzCisgKiBAcGFnZToJICAgIFRoZSBtZW1vcnkgcGFnZSBmb3IgY2FsY3VsYXRpbmcgZnJhbWUgdHJhaWxlciBDUkNzCisgKiBAY3JjX2VvZl9vZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgQ1JDIHBhZ2UgcG9pbnRpbmcgdG8gYXZhaWxhYmxlCisgKgkJICAgIG1lbW9yeSBmb3IgYSBuZXcgdHJhaWxlcgogICovCiBzdHJ1Y3QgZmNvZV9wZXJjcHVfcyB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CkBAIC03NCwzNyArODUsNjIgQEAKIAlpbnQgY3JjX2VvZl9vZmZzZXQ7CiB9OwogCi0vKgotICogYW4gRkNvRSBpbnRlcmZhY2UsIDE6MSB3aXRoIG5ldGRldgorLyoqCisgKiBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgLSBBIEZDb0UgaW50ZXJmYWNlCisgKiBAbGlzdDoJICAgICAgSGFuZGxlIGZvciBhIGxpc3Qgb2YgRkNvRSBpbnRlcmZhY2VzCisgKiBAbmV0ZGV2OgkgICAgICBUaGUgYXNzb2NpYXRlZCBuZXQgZGV2aWNlCisgKiBAZmNvZV9wYWNrZXRfdHlwZTogRkNvRSBwYWNrZXQgdHlwZQorICogQGZpcF9wYWNrZXRfdHlwZTogIEZJUCBwYWNrZXQgdHlwZQorICogQGN0bHI6CSAgICAgIFRoZSBGQ29FIGNvbnRyb2xsZXIgKGZvciBGSVApCisgKiBAb2VtOgkgICAgICBUaGUgb2ZmbG9hZCBleGNoYW5nZSBtYW5hZ2VyIGZvciBhbGwgbG9jYWwgcG9ydAorICoJCSAgICAgIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3J0CisgKiBAa3JlZjoJICAgICAgVGhlIGtlcm5lbCByZWZlcmVuY2UKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyAxOjEgd2l0aCBhIG5ldCBkZXZpdmUuCiAgKi8KIHN0cnVjdCBmY29lX2ludGVyZmFjZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IHBhY2tldF90eXBlICBmY29lX3BhY2tldF90eXBlOwotCXN0cnVjdCBwYWNrZXRfdHlwZSAgZmlwX3BhY2tldF90eXBlOwotCXN0cnVjdCBmY29lX2N0bHIgY3RscjsKLQlzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm9lbTsJCS8qIG9mZmxvYWQgZXhjaGFuZ2UgbWFuYWdlciAqLwotCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGxpc3RfaGVhZCAgIGxpc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgICpuZXRkZXY7CisJc3RydWN0IHBhY2tldF90eXBlIGZjb2VfcGFja2V0X3R5cGU7CisJc3RydWN0IHBhY2tldF90eXBlIGZpcF9wYWNrZXRfdHlwZTsKKwlzdHJ1Y3QgZmNvZV9jdGxyICAgY3RscjsKKwlzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm9lbTsKKwlzdHJ1Y3Qga3JlZgkgICBrcmVmOwogfTsKIAotLyoKLSAqIHRoZSBGQ29FIHByaXZhdGUgc3RydWN0dXJlIHRoYXQncyBhbGxvY2F0ZWQgYWxvbmcgd2l0aCB0aGUKLSAqIFNjc2lfSG9zdCBhbmQgbGliZmMgZmNfbHBvcnQgc3RydWN0dXJlcworLyoqCisgKiBzdHJ1Y3QgZmNvZV9wb3J0IC0gVGhlIEZDb0UgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqIEBmY29lOgkJICAgICAgIFRoZSBhc3NvY2lhdGVkIGZjb2UgaW50ZXJmYWNlCisgKiBAbHBvcnQ6CQkgICAgICAgVGhlIGFzc29jaWF0ZWQgbG9jYWwgcG9ydAorICogQGZjb2VfcGVuZGluZ19xdWV1ZToJICAgICAgIFRoZSBwZW5kaW5nIFJ4IHF1ZXVlIG9mIHNrYnMKKyAqIEBmY29lX3BlbmRpbmdfcXVldWVfYWN0aXZlOiBJbmRpY2F0ZXMgaWYgdGhlIHBlbmRpbmcgcXVldWUgaXMgYWN0aXZlCisgKiBAdGltZXI6CQkgICAgICAgVGhlIHF1ZXVlIHRpbWVyCisgKiBAZGVzdHJveV93b3JrOgkgICAgICAgSGFuZGxlIGZvciB3b3JrIGNvbnRleHQKKyAqCQkJICAgICAgICh0byBwcmV2ZW50IFJUTkwgZGVhZGxvY2tzKQorICogQGRhdGFfc3J0X2FkZHI6CSAgICAgICBTb3VyY2UgYWRkcmVzcyBmb3IgZGF0YQorICoKKyAqIEFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIGlzIHRvIGJlIGFsbG9jYXRlZCBhbG9uZyB3aXRoIHRoZQorICogU2NzaV9Ib3N0IGFuZCBsaWJmYyBmY19scG9ydCBzdHJ1Y3R1cmVzLgogICovCiBzdHJ1Y3QgZmNvZV9wb3J0IHsKIAlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2U7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZjb2VfcGVuZGluZ19xdWV1ZTsKLQl1OAlmY29lX3BlbmRpbmdfcXVldWVfYWN0aXZlOwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJLyogcXVldWUgdGltZXIgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVzdHJveV93b3JrOwkvKiB0byBwcmV2ZW50IHJ0bmwgZGVhZGxvY2tzICovCisJc3RydWN0IGZjX2xwb3J0CSAgICAgICpscG9ydDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICAgZmNvZV9wZW5kaW5nX3F1ZXVlOworCXU4CQkgICAgICBmY29lX3BlbmRpbmdfcXVldWVfYWN0aXZlOworCXN0cnVjdCB0aW1lcl9saXN0ICAgICB0aW1lcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgZGVzdHJveV93b3JrOworCXU4CQkgICAgICBkYXRhX3NyY19hZGRyW0VUSF9BTEVOXTsKIH07CiAKICNkZWZpbmUgZmNvZV9mcm9tX2N0bHIoZmlwKSBjb250YWluZXJfb2YoZmlwLCBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UsIGN0bHIpCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKmZjb2VfbmV0ZGV2KGNvbnN0IHN0cnVjdCBmY19scG9ydCAqbHApCisvKioKKyAqIGZjb2VfbmV0ZGV2KCkgLSBSZXR1cm4gdGhlIG5ldCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGEgbG9jYWwgcG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBnZXQgdGhlIG5ldCBkZXZpY2UgZnJvbQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpmY29lX25ldGRldihjb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCXJldHVybiAoKHN0cnVjdCBmY29lX3BvcnQgKilscG9ydF9wcml2KGxwKSktPmZjb2UtPm5ldGRldjsKKwlyZXR1cm4gKChzdHJ1Y3QgZmNvZV9wb3J0ICopbHBvcnRfcHJpdihscG9ydCkpLT5mY29lLT5uZXRkZXY7CiB9CiAKICNlbmRpZiAvKiBfRkNPRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvbGliZmNvZS5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvbGliZmNvZS5jCmluZGV4IDExYWU1YzkuLjk4MjMyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mY29lL2xpYmZjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9saWJmY29lLmMKQEAgLTU5LDI2ICs1OSwzMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX2xvZ2dpbmcsIGxpYmZjb2VfZGVidWdfbG9nZ2luZywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19sb2dnaW5nLCAiYSBiaXQgbWFzayBvZiBsb2dnaW5nIGxldmVscyIpOwogCi0jZGVmaW5lIExJQkZDT0VfTE9HR0lORyAgICAgMHgwMSAvKiBHZW5lcmFsIGxvZ2dpbmcsIG5vdCBjYXRlZ29yaXplZCAqLworI2RlZmluZSBMSUJGQ09FX0xPR0dJTkcJICAgIDB4MDEgLyogR2VuZXJhbCBsb2dnaW5nLCBub3QgY2F0ZWdvcml6ZWQgKi8KICNkZWZpbmUgTElCRkNPRV9GSVBfTE9HR0lORyAweDAyIC8qIEZJUCBsb2dnaW5nICovCiAKLSNkZWZpbmUgTElCRkNPRV9DSEVDS19MT0dHSU5HKExFVkVMLCBDTUQpCQkJCVwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCWlmICh1bmxpa2VseShsaWJmY29lX2RlYnVnX2xvZ2dpbmcgJiBMRVZFTCkpCQkJXAotCQlkbyB7CQkJCQkJCVwKLQkJCUNNRDsJCQkJCQlcCi0JCX0gd2hpbGUgKDApOwkJCQkJCVwKKyNkZWZpbmUgTElCRkNPRV9DSEVDS19MT0dHSU5HKExFVkVMLCBDTUQpCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAodW5saWtlbHkobGliZmNvZV9kZWJ1Z19sb2dnaW5nICYgTEVWRUwpKQlcCisJCWRvIHsJCQkJCVwKKwkJCUNNRDsJCQkJXAorCQl9IHdoaWxlICgwKTsJCQkJXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBMSUJGQ09FX0RCRyhmbXQsIGFyZ3MuLi4pCQkJCQlcCiAJTElCRkNPRV9DSEVDS19MT0dHSU5HKExJQkZDT0VfTE9HR0lORywJCQkJXAogCQkJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAibGliZmNvZTogIiBmbXQsICMjYXJncyk7KQogCi0jZGVmaW5lIExJQkZDT0VfRklQX0RCRyhmbXQsIGFyZ3MuLi4pCQkJCQlcCisjZGVmaW5lIExJQkZDT0VfRklQX0RCRyhmaXAsIGZtdCwgYXJncy4uLikJCQkJXAogCUxJQkZDT0VfQ0hFQ0tfTE9HR0lORyhMSUJGQ09FX0ZJUF9MT0dHSU5HLAkJCVwKLQkJCSAgICAgIHByaW50ayhLRVJOX0lORk8gImZpcDogIiBmbXQsICMjYXJncyk7KQorCQkJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCVkOiBmaXA6ICIgZm10LCAJXAorCQkJCSAgICAgKGZpcCktPmxwLT5ob3N0LT5ob3N0X25vLCAjI2FyZ3MpOykKIAotLyoKKy8qKgorICogZmNvZV9jdGxyX210dV92YWxpZCgpIC0gQ2hlY2sgaWYgYSBGQ0YncyBNVFUgaXMgdmFsaWQKKyAqIEBmY2Y6IFRoZSBGQ0YgdG8gY2hlY2sKKyAqCiAgKiBSZXR1cm4gbm9uLXplcm8gaWYgRkNGIGZjb2Vfc2l6ZSBoYXMgYmVlbiB2YWxpZGF0ZWQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGZjb2VfY3Rscl9tdHVfdmFsaWQoY29uc3Qgc3RydWN0IGZjb2VfZmNmICpmY2YpCkBAIC04Niw3ICs5MCwxMCBAQAogCXJldHVybiAoZmNmLT5mbGFncyAmIEZJUF9GTF9TT0wpICE9IDA7CiB9CiAKLS8qCisvKioKKyAqIGZjb2VfY3Rscl9mY2ZfdXNhYmxlKCkgLSBDaGVjayBpZiBhIEZDRiBpcyB1c2FibGUKKyAqIEBmY2Y6IFRoZSBGQ0YgdG8gY2hlY2sKKyAqCiAgKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIEZDRiBpcyB1c2FibGUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGZjb2VfY3Rscl9mY2ZfdXNhYmxlKHN0cnVjdCBmY29lX2ZjZiAqZmNmKQpAQCAtOTcsMTIgKzEwNCwxMyBAQAogfQogCiAvKioKLSAqIGZjb2VfY3Rscl9pbml0KCkgLSBJbml0aWFsaXplIHRoZSBGQ29FIENvbnRyb2xsZXIgaW5zdGFuY2UuCi0gKiBAZmlwOglGQ29FIGNvbnRyb2xsZXIuCisgKiBmY29lX2N0bHJfaW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgRkNvRSBDb250cm9sbGVyIGluc3RhbmNlCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyIHRvIGluaXRpYWxpemUKICAqLwogdm9pZCBmY29lX2N0bHJfaW5pdChzdHJ1Y3QgZmNvZV9jdGxyICpmaXApCiB7CiAJZmlwLT5zdGF0ZSA9IEZJUF9TVF9MSU5LX1dBSVQ7CisJZmlwLT5tb2RlID0gRklQX1NUX0FVVE87CiAJSU5JVF9MSVNUX0hFQUQoJmZpcC0+ZmNmcyk7CiAJc3Bpbl9sb2NrX2luaXQoJmZpcC0+bG9jayk7CiAJZmlwLT5mbG9naV9veGlkID0gRkNfWElEX1VOS05PV047CkBAIC0xMTQsOCArMTIyLDggQEAKIEVYUE9SVF9TWU1CT0woZmNvZV9jdGxyX2luaXQpOwogCiAvKioKLSAqIGZjb2VfY3Rscl9yZXNldF9mY2ZzKCkgLSBSZXNldCBhbmQgZnJlZSBhbGwgRkNGcyBmb3IgYSBjb250cm9sbGVyLgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgorICogZmNvZV9jdGxyX3Jlc2V0X2ZjZnMoKSAtIFJlc2V0IGFuZCBmcmVlIGFsbCBGQ0ZzIGZvciBhIGNvbnRyb2xsZXIKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgd2hvc2UgRkNGcyBhcmUgdG8gYmUgcmVzZXQKICAqCiAgKiBDYWxsZWQgd2l0aCAmZmNvZV9jdGxyIGxvY2sgaGVsZC4KICAqLwpAQCAtMTM0LDggKzE0Miw4IEBACiB9CiAKIC8qKgotICogZmNvZV9jdGxyX2Rlc3Ryb3koKSAtIERpc2FibGUgYW5kIHRlYXItZG93biB0aGUgRkNvRSBjb250cm9sbGVyLgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgorICogZmNvZV9jdGxyX2Rlc3Ryb3koKSAtIERpc2FibGUgYW5kIHRlYXIgZG93biBhIEZDb0UgY29udHJvbGxlcgorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlciB0byB0ZWFyIGRvd24KICAqCiAgKiBUaGlzIGlzIGNhbGxlZCBieSBGQ29FIGRyaXZlcnMgYmVmb3JlIGZyZWVpbmcgdGhlICZmY29lX2N0bHIuCiAgKgpAQCAtMTQ4LDkgKzE1Niw3IEBACiB2b2lkIGZjb2VfY3Rscl9kZXN0cm95KHN0cnVjdCBmY29lX2N0bHIgKmZpcCkKIHsKIAljYW5jZWxfd29ya19zeW5jKCZmaXAtPnJlY3Zfd29yayk7Ci0Jc3Bpbl9sb2NrX2JoKCZmaXAtPmZpcF9yZWN2X2xpc3QubG9jayk7Ci0JX19za2JfcXVldWVfcHVyZ2UoJmZpcC0+ZmlwX3JlY3ZfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmZpcC0+ZmlwX3JlY3ZfbGlzdC5sb2NrKTsKKwlza2JfcXVldWVfcHVyZ2UoJmZpcC0+ZmlwX3JlY3ZfbGlzdCk7CiAKIAlzcGluX2xvY2tfYmgoJmZpcC0+bG9jayk7CiAJZmlwLT5zdGF0ZSA9IEZJUF9TVF9ESVNBQkxFRDsKQEAgLTE2Miw4ICsxNjgsOCBAQAogRVhQT1JUX1NZTUJPTChmY29lX2N0bHJfZGVzdHJveSk7CiAKIC8qKgotICogZmNvZV9jdGxyX2Zjb2Vfc2l6ZSgpIC0gUmV0dXJuIHRoZSBtYXhpbXVtIEZDb0Ugc2l6ZSByZXF1aXJlZCBmb3IgVk5fUG9ydC4KLSAqIEBmaXA6CUZDb0UgY29udHJvbGxlci4KKyAqIGZjb2VfY3Rscl9mY29lX3NpemUoKSAtIFJldHVybiB0aGUgbWF4aW11bSBGQ29FIHNpemUgcmVxdWlyZWQgZm9yIFZOX1BvcnQKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgdG8gZ2V0IHRoZSBtYXhpbXVtIEZDb0Ugc2l6ZSBmcm9tCiAgKgogICogUmV0dXJucyB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBpbmNsdWRpbmcgdGhlIEZDb0UgaGVhZGVyIGFuZCB0cmFpbGVyLAogICogYnV0IG5vdCBpbmNsdWRpbmcgYW55IEV0aGVybmV0IG9yIFZMQU4gaGVhZGVycy4KQEAgLTE4MCw5ICsxODYsOSBAQAogfQogCiAvKioKLSAqIGZjb2VfY3Rscl9zb2xpY2l0KCkgLSBTZW5kIGEgc29saWNpdGF0aW9uLgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgotICogQGZjZjoJRGVzdGluYXRpb24gRkNGLiAgSWYgTlVMTCwgYSBtdWx0aWNhc3Qgc29saWNpdGF0aW9uIGlzIHNlbnQuCisgKiBmY29lX2N0bHJfc29saWNpdCgpIC0gU2VuZCBhIEZJUCBzb2xpY2l0YXRpb24KKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgdG8gc2VuZCB0aGUgc29saWNpdGF0aW9uIG9uCisgKiBAZmNmOiBUaGUgZGVzdGluYXRpb24gRkNGIChpZiBOVUxMLCBhIG11bHRpY2FzdCBzb2xpY2l0YXRpb24gaXMgc2VudCkKICAqLwogc3RhdGljIHZvaWQgZmNvZV9jdGxyX3NvbGljaXQoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3QgZmNvZV9mY2YgKmZjZikKIHsKQEAgLTI0MSw4ICsyNDcsOCBAQAogfQogCiAvKioKLSAqIGZjb2VfY3Rscl9saW5rX3VwKCkgLSBTdGFydCBGQ29FIGNvbnRyb2xsZXIuCi0gKiBAZmlwOglGQ29FIGNvbnRyb2xsZXIuCisgKiBmY29lX2N0bHJfbGlua191cCgpIC0gU3RhcnQgRkNvRSBjb250cm9sbGVyCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyIHRvIHN0YXJ0CiAgKgogICogQ2FsbGVkIGZyb20gdGhlIExMRCB3aGVuIHRoZSBuZXR3b3JrIGxpbmsgaXMgcmVhZHkuCiAgKi8KQEAgLTI1NSwxMSArMjYxLDEyIEBACiAJCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOwogCQlmY19saW5rdXAoZmlwLT5scCk7CiAJfSBlbHNlIGlmIChmaXAtPnN0YXRlID09IEZJUF9TVF9MSU5LX1dBSVQpIHsKLQkJZmlwLT5zdGF0ZSA9IEZJUF9TVF9BVVRPOworCQlmaXAtPnN0YXRlID0gZmlwLT5tb2RlOwogCQlmaXAtPmxhc3RfbGluayA9IDE7CiAJCWZpcC0+bGluayA9IDE7CiAJCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOwotCQlMSUJGQ09FX0ZJUF9EQkcoIiVzIiwgInNldHRpbmcgQVVUTyBtb2RlLlxuIik7CisJCWlmIChmaXAtPnN0YXRlID09IEZJUF9TVF9BVVRPKQorCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgIiVzIiwgInNldHRpbmcgQVVUTyBtb2RlLlxuIik7CiAJCWZjX2xpbmt1cChmaXAtPmxwKTsKIAkJZmNvZV9jdGxyX3NvbGljaXQoZmlwLCBOVUxMKTsKIAl9IGVsc2UKQEAgLTI2OCw0NSArMjc1LDIzIEBACiBFWFBPUlRfU1lNQk9MKGZjb2VfY3Rscl9saW5rX3VwKTsKIAogLyoqCi0gKiBmY29lX2N0bHJfcmVzZXQoKSAtIFJlc2V0IEZJUC4KLSAqIEBmaXA6CUZDb0UgY29udHJvbGxlci4KLSAqIEBuZXdfc3RhdGU6CUZJUCBzdGF0ZSB0byBiZSBlbnRlcmVkLgotICoKLSAqIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIGxpbmsgd2FzIHVwIGFuZCBub3cgaXNuJ3QuCisgKiBmY29lX2N0bHJfcmVzZXQoKSAtIFJlc2V0IGEgRkNvRSBjb250cm9sbGVyCisgKiBAZmlwOiAgICAgICBUaGUgRkNvRSBjb250cm9sbGVyIHRvIHJlc2V0CiAgKi8KLXN0YXRpYyBpbnQgZmNvZV9jdGxyX3Jlc2V0KHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgZW51bSBmaXBfc3RhdGUgbmV3X3N0YXRlKQorc3RhdGljIHZvaWQgZmNvZV9jdGxyX3Jlc2V0KHN0cnVjdCBmY29lX2N0bHIgKmZpcCkKIHsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZmlwLT5scDsKLQlpbnQgbGlua19kcm9wcGVkOwotCi0Jc3Bpbl9sb2NrX2JoKCZmaXAtPmxvY2spOwogCWZjb2VfY3Rscl9yZXNldF9mY2ZzKGZpcCk7CiAJZGVsX3RpbWVyKCZmaXAtPnRpbWVyKTsKLQlmaXAtPnN0YXRlID0gbmV3X3N0YXRlOwogCWZpcC0+Y3Rscl9rYV90aW1lID0gMDsKIAlmaXAtPnBvcnRfa2FfdGltZSA9IDA7CiAJZmlwLT5zb2xfdGltZSA9IDA7CiAJZmlwLT5mbG9naV9veGlkID0gRkNfWElEX1VOS05PV047CiAJZmlwLT5tYXBfZGVzdCA9IDA7Ci0JZmlwLT5sYXN0X2xpbmsgPSAwOwotCWxpbmtfZHJvcHBlZCA9IGZpcC0+bGluazsKLQlmaXAtPmxpbmsgPSAwOwotCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOwotCi0JaWYgKGxpbmtfZHJvcHBlZCkKLQkJZmNfbGlua2Rvd24obHApOwotCi0JaWYgKG5ld19zdGF0ZSA9PSBGSVBfU1RfRU5BQkxFRCkgewotCQlmY29lX2N0bHJfc29saWNpdChmaXAsIE5VTEwpOwotCQlmY19saW5rdXAobHApOwotCQlsaW5rX2Ryb3BwZWQgPSAwOwotCX0KLQlyZXR1cm4gbGlua19kcm9wcGVkOwogfQogCiAvKioKLSAqIGZjb2VfY3Rscl9saW5rX2Rvd24oKSAtIFN0b3AgRkNvRSBjb250cm9sbGVyLgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgorICogZmNvZV9jdGxyX2xpbmtfZG93bigpIC0gU3RvcCBhIEZDb0UgY29udHJvbGxlcgorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlciB0byBiZSBzdG9wcGVkCiAgKgogICogUmV0dXJucyBub24temVybyBpZiB0aGUgbGluayB3YXMgdXAgYW5kIG5vdyBpc24ndC4KICAqCkBAIC0zMTUsMTUgKzMwMCwyOSBAQAogICovCiBpbnQgZmNvZV9jdGxyX2xpbmtfZG93bihzdHJ1Y3QgZmNvZV9jdGxyICpmaXApCiB7Ci0JcmV0dXJuIGZjb2VfY3Rscl9yZXNldChmaXAsIEZJUF9TVF9MSU5LX1dBSVQpOworCWludCBsaW5rX2Ryb3BwZWQ7CisKKwlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAibGluayBkb3duLlxuIik7CisJc3Bpbl9sb2NrX2JoKCZmaXAtPmxvY2spOworCWZjb2VfY3Rscl9yZXNldChmaXApOworCWxpbmtfZHJvcHBlZCA9IGZpcC0+bGluazsKKwlmaXAtPmxpbmsgPSAwOworCWZpcC0+bGFzdF9saW5rID0gMDsKKwlmaXAtPnN0YXRlID0gRklQX1NUX0xJTktfV0FJVDsKKwlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKKworCWlmIChsaW5rX2Ryb3BwZWQpCisJCWZjX2xpbmtkb3duKGZpcC0+bHApOworCXJldHVybiBsaW5rX2Ryb3BwZWQ7CiB9CiBFWFBPUlRfU1lNQk9MKGZjb2VfY3Rscl9saW5rX2Rvd24pOwogCiAvKioKLSAqIGZjb2VfY3Rscl9zZW5kX2tlZXBfYWxpdmUoKSAtIFNlbmQgYSBrZWVwLWFsaXZlIHRvIHRoZSBzZWxlY3RlZCBGQ0YuCi0gKiBAZmlwOglGQ29FIGNvbnRyb2xsZXIuCi0gKiBAcG9ydHM6CTAgZm9yIGNvbnRyb2xsZXIga2VlcC1hbGl2ZSwgMSBmb3IgcG9ydCBrZWVwLWFsaXZlLgotICogQHNhOgkJc291cmNlIE1BQyBhZGRyZXNzLgorICogZmNvZV9jdGxyX3NlbmRfa2VlcF9hbGl2ZSgpIC0gU2VuZCBhIGtlZXAtYWxpdmUgdG8gdGhlIHNlbGVjdGVkIEZDRgorICogQGZpcDogICBUaGUgRkNvRSBjb250cm9sbGVyIHRvIHNlbmQgdGhlIEZLQSBvbgorICogQGxwb3J0OiBsaWJmYyBmY19scG9ydCB0byBzZW5kIGZyb20KKyAqIEBwb3J0czogMCBmb3IgY29udHJvbGxlciBrZWVwLWFsaXZlLCAxIGZvciBwb3J0IGtlZXAtYWxpdmUKKyAqIEBzYToJICAgVGhlIHNvdXJjZSBNQUMgYWRkcmVzcwogICoKICAqIEEgY29udHJvbGxlciBrZWVwLWFsaXZlIGlzIHNlbnQgZXZlcnkgZmthX3BlcmlvZCAodHlwaWNhbGx5IDggc2Vjb25kcykuCiAgKiBUaGUgc291cmNlIE1BQyBpcyB0aGUgbmF0aXZlIE1BQyBhZGRyZXNzLgpAQCAtMzMyLDcgKzMzMSw5IEBACiAgKiBUaGUgc291cmNlIE1BQyBpcyB0aGUgYXNzaWduZWQgbWFwcGVkIHNvdXJjZSBhZGRyZXNzLgogICogVGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBGQ0YncyBGLXBvcnQuCiAgKi8KLXN0YXRpYyB2b2lkIGZjb2VfY3Rscl9zZW5kX2tlZXBfYWxpdmUoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBpbnQgcG9ydHMsIHU4ICpzYSkKK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl9zZW5kX2tlZXBfYWxpdmUoc3RydWN0IGZjb2VfY3RsciAqZmlwLAorCQkJCSAgICAgIHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkJICAgICAgaW50IHBvcnRzLCB1OCAqc2EpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgZmlwX2thbCB7CkBAIC0zNTAsOCArMzUxLDcgQEAKIAlpZiAoIWZjZiB8fCAhZmNfaG9zdF9wb3J0X2lkKGxwLT5ob3N0KSkKIAkJcmV0dXJuOwogCi0JbGVuID0gZmNvZV9jdGxyX2Zjb2Vfc2l6ZShmaXApICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpOwotCUJVR19PTihsZW4gPCBzaXplb2YoKmthbCkgKyBzaXplb2YoKnZuKSk7CisJbGVuID0gc2l6ZW9mKCprYWwpICsgcG9ydHMgKiBzaXplb2YoKnZuKTsKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CiAJaWYgKCFza2IpCiAJCXJldHVybjsKQEAgLTM2Niw3ICszNjYsNyBAQAogCWthbC0+ZmlwLmZpcF9vcCA9IGh0b25zKEZJUF9PUF9DVFJMKTsKIAlrYWwtPmZpcC5maXBfc3ViY29kZSA9IEZJUF9TQ19LRUVQX0FMSVZFOwogCWthbC0+ZmlwLmZpcF9kbF9sZW4gPSBodG9ucygoc2l6ZW9mKGthbC0+bWFjKSArCi0JCQkJICAgIHBvcnRzICogc2l6ZW9mKCp2bikpIC8gRklQX0JQVyk7CisJCQkJICAgICBwb3J0cyAqIHNpemVvZigqdm4pKSAvIEZJUF9CUFcpOwogCWthbC0+ZmlwLmZpcF9mbGFncyA9IGh0b25zKEZJUF9GTF9GUE1BKTsKIAlpZiAoZmlwLT5zcG1hKQogCQlrYWwtPmZpcC5maXBfZmxhZ3MgfD0gaHRvbnMoRklQX0ZMX1NQTUEpOwpAQCAtMzc0LDE2ICszNzQsMTQgQEAKIAlrYWwtPm1hYy5mZF9kZXNjLmZpcF9kdHlwZSA9IEZJUF9EVF9NQUM7CiAJa2FsLT5tYWMuZmRfZGVzYy5maXBfZGxlbiA9IHNpemVvZihrYWwtPm1hYykgLyBGSVBfQlBXOwogCW1lbWNweShrYWwtPm1hYy5mZF9tYWMsIGZpcC0+Y3RsX3NyY19hZGRyLCBFVEhfQUxFTik7Ci0KIAlpZiAocG9ydHMpIHsKIAkJdm4gPSAoc3RydWN0IGZpcF92bl9kZXNjICopKGthbCArIDEpOwogCQl2bi0+ZmRfZGVzYy5maXBfZHR5cGUgPSBGSVBfRFRfVk5fSUQ7CiAJCXZuLT5mZF9kZXNjLmZpcF9kbGVuID0gc2l6ZW9mKCp2bikgLyBGSVBfQlBXOwotCQltZW1jcHkodm4tPmZkX21hYywgZmlwLT5kYXRhX3NyY19hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweSh2bi0+ZmRfbWFjLCBmaXAtPmdldF9zcmNfYWRkcihscG9ydCksIEVUSF9BTEVOKTsKIAkJaHRvbjI0KHZuLT5mZF9mY19pZCwgZmNfaG9zdF9wb3J0X2lkKGxwLT5ob3N0KSk7CiAJCXB1dF91bmFsaWduZWRfYmU2NChscC0+d3dwbiwgJnZuLT5mZF93d3BuKTsKIAl9Ci0KIAlza2JfcHV0KHNrYiwgbGVuKTsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfRklQKTsKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwpAQCAtMzkyLDEwICszOTAsMTAgQEAKIH0KIAogLyoqCi0gKiBmY29lX2N0bHJfZW5jYXBzKCkgLSBFbmNhcHN1bGF0ZSBhbiBFTFMgZnJhbWUgZm9yIEZJUCwgd2l0aG91dCBzZW5kaW5nIGl0LgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgotICogQGR0eXBlOglGSVAgZGVzY3JpcHRvciB0eXBlIGZvciB0aGUgZnJhbWUuCi0gKiBAc2tiOglGQ29FIEVMUyBmcmFtZSBpbmNsdWRpbmcgRkMgaGVhZGVyIGJ1dCBubyBGQ29FIGhlYWRlcnMuCisgKiBmY29lX2N0bHJfZW5jYXBzKCkgLSBFbmNhcHN1bGF0ZSBhbiBFTFMgZnJhbWUgZm9yIEZJUCwgd2l0aG91dCBzZW5kaW5nIGl0CisgKiBAZmlwOiAgIFRoZSBGQ29FIGNvbnRyb2xsZXIgZm9yIHRoZSBFTFMgZnJhbWUKKyAqIEBkdHlwZTogVGhlIEZJUCBkZXNjcmlwdG9yIHR5cGUgZm9yIHRoZSBmcmFtZQorICogQHNrYjogICBUaGUgRkNvRSBFTFMgZnJhbWUgaW5jbHVkaW5nIEZDIGhlYWRlciBidXQgbm8gRkNvRSBoZWFkZXJzCiAgKgogICogUmV0dXJucyBub24temVybyBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKgpAQCAtNDA1LDcgKzQwMyw3IEBACiAgKiBIZWFkcm9vbSBpbmNsdWRlcyB0aGUgRklQIGVuY2Fwc3VsYXRpb24gZGVzY3JpcHRpb24sIEZJUCBoZWFkZXIsIGFuZAogICogRXRoZXJuZXQgaGVhZGVyLiAgVGhlIHRhaWxyb29tIGlzIGZvciB0aGUgRklQIE1BQyBkZXNjcmlwdG9yLgogICovCi1zdGF0aWMgaW50IGZjb2VfY3Rscl9lbmNhcHMoc3RydWN0IGZjb2VfY3RsciAqZmlwLAorc3RhdGljIGludCBmY29lX2N0bHJfZW5jYXBzKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKIAkJCSAgICB1OCBkdHlwZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZmlwX2VuY2Fwc19oZWFkIHsKQEAgLTQ0OSw4ICs0NDcsOCBAQAogCW1lbXNldChtYWMsIDAsIHNpemVvZihtYWMpKTsKIAltYWMtPmZkX2Rlc2MuZmlwX2R0eXBlID0gRklQX0RUX01BQzsKIAltYWMtPmZkX2Rlc2MuZmlwX2RsZW4gPSBzaXplb2YoKm1hYykgLyBGSVBfQlBXOwotCWlmIChkdHlwZSAhPSBGSVBfRFRfRkxPR0kpCi0JCW1lbWNweShtYWMtPmZkX21hYywgZmlwLT5kYXRhX3NyY19hZGRyLCBFVEhfQUxFTik7CisJaWYgKGR0eXBlICE9IEZJUF9EVF9GTE9HSSAmJiBkdHlwZSAhPSBGSVBfRFRfRkRJU0MpCisJCW1lbWNweShtYWMtPmZkX21hYywgZmlwLT5nZXRfc3JjX2FkZHIobHBvcnQpLCBFVEhfQUxFTik7CiAJZWxzZSBpZiAoZmlwLT5zcG1hKQogCQltZW1jcHkobWFjLT5mZF9tYWMsIGZpcC0+Y3RsX3NyY19hZGRyLCBFVEhfQUxFTik7CiAKQEAgLTQ2Myw2ICs0NjEsNyBAQAogLyoqCiAgKiBmY29lX2N0bHJfZWxzX3NlbmQoKSAtIFNlbmQgYW4gRUxTIGZyYW1lIGVuY2Fwc3VsYXRlZCBieSBGSVAgaWYgYXBwcm9wcmlhdGUuCiAgKiBAZmlwOglGQ29FIGNvbnRyb2xsZXIuCisgKiBAbHBvcnQ6CWxpYmZjIGZjX2xwb3J0IHRvIHNlbmQgZnJvbQogICogQHNrYjoJRkNvRSBFTFMgZnJhbWUgaW5jbHVkaW5nIEZDIGhlYWRlciBidXQgbm8gRkNvRSBoZWFkZXJzLgogICoKICAqIFJldHVybnMgYSBub24temVybyBlcnJvciBjb2RlIGlmIHRoZSBmcmFtZSBzaG91bGQgbm90IGJlIHNlbnQuCkBAIC00NzEsMTEgKzQ3MCwxMyBAQAogICogVGhlIGNhbGxlciBtdXN0IGNoZWNrIHRoYXQgdGhlIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDQuCiAgKiBUaGUgU0tCIG11c3QgaGF2ZSBlbm91Z2ggaGVhZHJvb20gKDI4IGJ5dGVzKSBhbmQgdGFpbHJvb20gKDggYnl0ZXMpLgogICovCi1pbnQgZmNvZV9jdGxyX2Vsc19zZW5kKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBmY29lX2N0bHJfZWxzX3NlbmQoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAl1MTYgb2xkX3hpZDsKIAl1OCBvcDsKKwl1OCBtYWNbRVRIX0FMRU5dOwogCiAJZmggPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKXNrYi0+ZGF0YTsKIAlvcCA9ICoodTggKikoZmggKyAxKTsKQEAgLTQ5OCw2ICs0OTksOCBAQAogCiAJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX05PTl9GSVApCiAJCXJldHVybiAwOworCWlmICghZmlwLT5zZWxfZmNmKQorCQlnb3RvIGRyb3A7CiAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBFTFNfRkxPR0k6CkBAIC01MzAsMTQgKzUzMywxNSBAQAogCQkgKiBGTE9HSS4KIAkJICovCiAJCWZpcC0+ZmxvZ2lfb3hpZCA9IEZDX1hJRF9VTktOT1dOOwotCQlmY19mY29lX3NldF9tYWMoZmlwLT5kYXRhX3NyY19hZGRyLCBmaC0+Zmhfc19pZCk7CisJCWZjX2Zjb2Vfc2V0X21hYyhtYWMsIGZoLT5maF9kX2lkKTsKKwkJZmlwLT51cGRhdGVfbWFjKGxwb3J0LCBtYWMpOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlpZiAoZmlwLT5zdGF0ZSAhPSBGSVBfU1RfRU5BQkxFRCkKIAkJCWdvdG8gZHJvcDsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChmY29lX2N0bHJfZW5jYXBzKGZpcCwgb3AsIHNrYikpCisJaWYgKGZjb2VfY3Rscl9lbmNhcHMoZmlwLCBscG9ydCwgb3AsIHNrYikpCiAJCWdvdG8gZHJvcDsKIAlmaXAtPnNlbmQoZmlwLCBza2IpOwogCXJldHVybiAtRUlOUFJPR1JFU1M7CkBAIC01NDcsOSArNTUxLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0woZmNvZV9jdGxyX2Vsc19zZW5kKTsKIAotLyoKLSAqIGZjb2VfY3Rscl9hZ2VfZmNmcygpIC0gUmVzZXQgYW5kIGZyZWUgYWxsIG9sZCBGQ0ZzIGZvciBhIGNvbnRyb2xsZXIuCi0gKiBAZmlwOglGQ29FIGNvbnRyb2xsZXIuCisvKioKKyAqIGZjb2VfY3Rscl9hZ2VfZmNmcygpIC0gUmVzZXQgYW5kIGZyZWUgYWxsIG9sZCBGQ0ZzIGZvciBhIGNvbnRyb2xsZXIKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgdG8gZnJlZSBGQ0ZzIG9uCiAgKgogICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLgogICoKQEAgLTU1OCwxNCArNTYyLDI4IEBACiAgKiB0aW1lcyBpdHMga2VlcC1hbGl2ZSBwZXJpb2QgaW5jbHVkaW5nIGZ1enouCiAgKgogICogSW4gYWRkaXRpb24sIGRldGVybWluZSB0aGUgdGltZSB3aGVuIGFuIEZDRiBzZWxlY3Rpb24gY2FuIG9jY3VyLgorICoKKyAqIEFsc28sIGluY3JlbWVudCB0aGUgTWlzc0Rpc2NBZHZDb3VudCB3aGVuIG5vIGFkdmVydGlzZW1lbnQgaXMgcmVjZWl2ZWQKKyAqIGZvciB0aGUgY29ycmVzcG9uZGluZyBGQ0YgZm9yIDEuNSAqIEZLQV9BRFZfUEVSSU9EIChGQy1CQi01IExFU0IpLgogICovCiBzdGF0aWMgdm9pZCBmY29lX2N0bHJfYWdlX2ZjZnMoc3RydWN0IGZjb2VfY3RsciAqZmlwKQogewogCXN0cnVjdCBmY29lX2ZjZiAqZmNmOwogCXN0cnVjdCBmY29lX2ZjZiAqbmV4dDsKIAl1bnNpZ25lZCBsb25nIHNlbF90aW1lID0gMDsKKwl1bnNpZ25lZCBsb25nIG1kYV90aW1lID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmY2YsIG5leHQsICZmaXAtPmZjZnMsIGxpc3QpIHsKKwkJbWRhX3RpbWUgPSBmY2YtPmZrYV9wZXJpb2QgKyAoZmNmLT5ma2FfcGVyaW9kID4+IDEpOworCQlpZiAoKGZpcC0+c2VsX2ZjZiA9PSBmY2YpICYmCisJCSAgICAodGltZV9hZnRlcihqaWZmaWVzLCBmY2YtPnRpbWUgKyBtZGFfdGltZSkpKSB7CisJCQltb2RfdGltZXIoJmZpcC0+dGltZXIsIGppZmZpZXMgKyBtZGFfdGltZSk7CisJCQlmY19scG9ydF9nZXRfc3RhdHMoZmlwLT5scCktPk1pc3NEaXNjQWR2Q291bnQrKzsKKwkJCXByaW50ayhLRVJOX0lORk8gImxpYmZjb2U6IGhvc3QlZDogTWlzc2luZyBEaXNjb3ZlcnkgIgorCQkJICAgICAgICJBZHZlcnRpc2VtZW50IGZvciBmYWIgJWxseCBjb3VudCAlbGxkXG4iLAorCQkJICAgICAgIGZpcC0+bHAtPmhvc3QtPmhvc3Rfbm8sIGZjZi0+ZmFicmljX25hbWUsCisJCQkgICAgICAgZmNfbHBvcnRfZ2V0X3N0YXRzKGZpcC0+bHApLT5NaXNzRGlzY0FkdkNvdW50KTsKKwkJfQogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBmY2YtPnRpbWUgKyBmY2YtPmZrYV9wZXJpb2QgKiAzICsKIAkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKEZJUF9GQ0ZfRlVaWiAqIDMpKSkgewogCQkJaWYgKGZpcC0+c2VsX2ZjZiA9PSBmY2YpCkBAIC01NzQsNiArNTkyLDcgQEAKIAkJCVdBUk5fT04oIWZpcC0+ZmNmX2NvdW50KTsKIAkJCWZpcC0+ZmNmX2NvdW50LS07CiAJCQlrZnJlZShmY2YpOworCQkJZmNfbHBvcnRfZ2V0X3N0YXRzKGZpcC0+bHApLT5WTGlua0ZhaWx1cmVDb3VudCsrOwogCQl9IGVsc2UgaWYgKGZjb2VfY3Rscl9tdHVfdmFsaWQoZmNmKSAmJgogCQkJICAgKCFzZWxfdGltZSB8fCB0aW1lX2JlZm9yZShzZWxfdGltZSwgZmNmLT50aW1lKSkpIHsKIAkJCXNlbF90aW1lID0gZmNmLT50aW1lOwpAQCAtNTkwLDE0ICs2MDksMTYgQEAKIH0KIAogLyoqCi0gKiBmY29lX2N0bHJfcGFyc2VfYWR2KCkgLSBEZWNvZGUgYSBGSVAgYWR2ZXJ0aXNlbWVudCBpbnRvIGEgbmV3IEZDRiBlbnRyeS4KLSAqIEBza2I6CXJlY2VpdmVkIEZJUCBhZHZlcnRpc2VtZW50IGZyYW1lCi0gKiBAZmNmOglyZXN1bHRpbmcgRkNGIGVudHJ5LgorICogZmNvZV9jdGxyX3BhcnNlX2FkdigpIC0gRGVjb2RlIGEgRklQIGFkdmVydGlzZW1lbnQgaW50byBhIG5ldyBGQ0YgZW50cnkKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgcmVjZWl2aW5nIHRoZSBhZHZlcnRpc2VtZW50CisgKiBAc2tiOiBUaGUgcmVjZWl2ZWQgRklQIGFkdmVydGlzZW1lbnQgZnJhbWUKKyAqIEBmY2Y6IFRoZSByZXN1bHRpbmcgRkNGIGVudHJ5CiAgKgogICogUmV0dXJucyB6ZXJvIG9uIGEgdmFsaWQgcGFyc2VkIGFkdmVydGlzZW1lbnQsCiAgKiBvdGhlcndpc2UgcmV0dXJucyBub24gemVybyB2YWx1ZS4KICAqLwotc3RhdGljIGludCBmY29lX2N0bHJfcGFyc2VfYWR2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmY29lX2ZjZiAqZmNmKQorc3RhdGljIGludCBmY29lX2N0bHJfcGFyc2VfYWR2KHN0cnVjdCBmY29lX2N0bHIgKmZpcCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmNvZV9mY2YgKmZjZikKIHsKIAlzdHJ1Y3QgZmlwX2hlYWRlciAqZmlwaDsKIAlzdHJ1Y3QgZmlwX2Rlc2MgKmRlc2MgPSBOVUxMOwpAQCAtNjM2LDcgKzY1Nyw3IEBACiAJCQkgICAgICAgKChzdHJ1Y3QgZmlwX21hY19kZXNjICopZGVzYyktPmZkX21hYywKIAkJCSAgICAgICBFVEhfQUxFTik7CiAJCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZmNmLT5mY2ZfbWFjKSkgewotCQkJCUxJQkZDT0VfRklQX0RCRygiSW52YWxpZCBNQUMgYWRkcmVzcyAiCisJCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgIkludmFsaWQgTUFDIGFkZHJlc3MgIgogCQkJCQkJImluIEZJUCBhZHZcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQpAQCAtNjU5LDYgKzY4MCw4IEBACiAJCQlpZiAoZGxlbiAhPSBzaXplb2Yoc3RydWN0IGZpcF9ma2FfZGVzYykpCiAJCQkJZ290byBsZW5fZXJyOwogCQkJZmthID0gKHN0cnVjdCBmaXBfZmthX2Rlc2MgKilkZXNjOworCQkJaWYgKGZrYS0+ZmRfZmxhZ3MgJiBGSVBfRktBX0FEVl9EKQorCQkJCWZjZi0+ZmRfZmxhZ3MgPSAxOwogCQkJdCA9IG50b2hsKGZrYS0+ZmRfZmthX3BlcmlvZCk7CiAJCQlpZiAodCA+PSBGQ09FX0NUTFJfTUlOX0ZLQSkKIAkJCQlmY2YtPmZrYV9wZXJpb2QgPSBtc2Vjc190b19qaWZmaWVzKHQpOwpAQCAtNjcwLDcgKzY5Myw3IEBACiAJCWNhc2UgRklQX0RUX0xPR086CiAJCWNhc2UgRklQX0RUX0VMUDoKIAkJZGVmYXVsdDoKLQkJCUxJQkZDT0VfRklQX0RCRygidW5leHBlY3RlZCBkZXNjcmlwdG9yIHR5cGUgJXggIgorCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgInVuZXhwZWN0ZWQgZGVzY3JpcHRvciB0eXBlICV4ICIKIAkJCQkJImluIEZJUCBhZHZcbiIsIGRlc2MtPmZpcF9kdHlwZSk7CiAJCQkvKiBzdGFuZGFyZCBzYXlzIGlnbm9yZSB1bmtub3duIGRlc2NyaXB0b3JzID49IDEyOCAqLwogCQkJaWYgKGRlc2MtPmZpcF9kdHlwZSA8IEZJUF9EVF9WRU5ET1JfQkFTRSkKQEAgLTY4NywxNSArNzEwLDE1IEBACiAJcmV0dXJuIDA7CiAKIGxlbl9lcnI6Ci0JTElCRkNPRV9GSVBfREJHKCJGSVAgbGVuZ3RoIGVycm9yIGluIGRlc2NyaXB0b3IgdHlwZSAleCBsZW4gJXp1XG4iLAorCUxJQkZDT0VfRklQX0RCRyhmaXAsICJGSVAgbGVuZ3RoIGVycm9yIGluIGRlc2NyaXB0b3IgdHlwZSAleCBsZW4gJXp1XG4iLAogCQkJZGVzYy0+ZmlwX2R0eXBlLCBkbGVuKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyoqCi0gKiBmY29lX2N0bHJfcmVjdl9hZHYoKSAtIEhhbmRsZSBhbiBpbmNvbWluZyBhZHZlcnRpc2VtZW50LgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgotICogQHNrYjoJUmVjZWl2ZWQgRklQIHBhY2tldC4KKyAqIGZjb2VfY3Rscl9yZWN2X2FkdigpIC0gSGFuZGxlIGFuIGluY29taW5nIGFkdmVydGlzZW1lbnQKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgcmVjZWl2aW5nIHRoZSBhZHZlcnRpc2VtZW50CisgKiBAc2tiOiBUaGUgcmVjZWl2ZWQgRklQIHBhY2tldAogICovCiBzdGF0aWMgdm9pZCBmY29lX2N0bHJfcmVjdl9hZHYoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNzA2LDcgKzcyOSw3IEBACiAJaW50IGZpcnN0ID0gMDsKIAlpbnQgbXR1X3ZhbGlkOwogCi0JaWYgKGZjb2VfY3Rscl9wYXJzZV9hZHYoc2tiLCAmbmV3KSkKKwlpZiAoZmNvZV9jdGxyX3BhcnNlX2FkdihmaXAsIHNrYiwgJm5ldykpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19iaCgmZmlwLT5sb2NrKTsKQEAgLTc1Miw3ICs3NzUsNyBAQAogCW10dV92YWxpZCA9IGZjb2VfY3Rscl9tdHVfdmFsaWQoZmNmKTsKIAlmY2YtPnRpbWUgPSBqaWZmaWVzOwogCWlmICghZm91bmQpIHsKLQkJTElCRkNPRV9GSVBfREJHKCJOZXcgRkNGIGZvciBmYWIgJWxseCBtYXAgJXggdmFsICVkXG4iLAorCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAiTmV3IEZDRiBmb3IgZmFiICVsbHggbWFwICV4IHZhbCAlZFxuIiwKIAkJCQlmY2YtPmZhYnJpY19uYW1lLCBmY2YtPmZjX21hcCwgbXR1X3ZhbGlkKTsKIAl9CiAKQEAgLTc3OCw3ICs4MDEsNyBAQAogCSAqLwogCWlmIChtdHVfdmFsaWQgJiYgIWZpcC0+c2VsX3RpbWUgJiYgZmNvZV9jdGxyX2ZjZl91c2FibGUoZmNmKSkgewogCQlmaXAtPnNlbF90aW1lID0gamlmZmllcyArCi0JCQkJbXNlY3NfdG9famlmZmllcyhGQ09FX0NUTFJfU1RBUlRfREVMQVkpOworCQkJbXNlY3NfdG9famlmZmllcyhGQ09FX0NUTFJfU1RBUlRfREVMQVkpOwogCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmZpcC0+dGltZXIpIHx8CiAJCSAgICB0aW1lX2JlZm9yZShmaXAtPnNlbF90aW1lLCBmaXAtPnRpbWVyLmV4cGlyZXMpKQogCQkJbW9kX3RpbWVyKCZmaXAtPnRpbWVyLCBmaXAtPnNlbF90aW1lKTsKQEAgLTc4OCwxNSArODExLDE1IEBACiB9CiAKIC8qKgotICogZmNvZV9jdGxyX3JlY3ZfZWxzKCkgLSBIYW5kbGUgYW4gaW5jb21pbmcgRklQLWVuY2Fwc3VsYXRlZCBFTFMgZnJhbWUuCi0gKiBAZmlwOglGQ29FIGNvbnRyb2xsZXIuCi0gKiBAc2tiOglSZWNlaXZlZCBGSVAgcGFja2V0LgorICogZmNvZV9jdGxyX3JlY3ZfZWxzKCkgLSBIYW5kbGUgYW4gaW5jb21pbmcgRklQIGVuY2Fwc3VsYXRlZCBFTFMgZnJhbWUKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgd2hpY2ggcmVjZWl2ZWQgdGhlIHBhY2tldAorICogQHNrYjogVGhlIHJlY2VpdmVkIEZJUCBwYWNrZXQKICAqLwogc3RhdGljIHZvaWQgZmNvZV9jdGxyX3JlY3ZfZWxzKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZmlwLT5scDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZmlwLT5scDsKIAlzdHJ1Y3QgZmlwX2hlYWRlciAqZmlwaDsKLQlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXN0cnVjdCBmY19mcmFtZSAqZnAgPSAoc3RydWN0IGZjX2ZyYW1lICopc2tiOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoID0gTlVMTDsKIAlzdHJ1Y3QgZmlwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGZpcF9lbmNhcHMgKmVsczsKQEAgLTgzMSwxMCArODU0LDExIEBACiAJCQkgICAgICAgKChzdHJ1Y3QgZmlwX21hY19kZXNjICopZGVzYyktPmZkX21hYywKIAkJCSAgICAgICBFVEhfQUxFTik7CiAJCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZ3JhbnRlZF9tYWMpKSB7Ci0JCQkJTElCRkNPRV9GSVBfREJHKCJJbnZhbGlkIE1BQyBhZGRyZXNzICIKKwkJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAiSW52YWxpZCBNQUMgYWRkcmVzcyAiCiAJCQkJCQkiaW4gRklQIEVMU1xuIik7CiAJCQkJZ290byBkcm9wOwogCQkJfQorCQkJbWVtY3B5KGZyX2NiKGZwKS0+Z3JhbnRlZF9tYWMsIGdyYW50ZWRfbWFjLCBFVEhfQUxFTik7CiAJCQlicmVhazsKIAkJY2FzZSBGSVBfRFRfRkxPR0k6CiAJCWNhc2UgRklQX0RUX0ZESVNDOgpAQCAtODUwLDcgKzg3NCw3IEBACiAJCQllbHNfZHR5cGUgPSBkZXNjLT5maXBfZHR5cGU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCUxJQkZDT0VfRklQX0RCRygidW5leHBlY3RlZCBkZXNjcmlwdG9yIHR5cGUgJXggIgorCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgInVuZXhwZWN0ZWQgZGVzY3JpcHRvciB0eXBlICV4ICIKIAkJCQkJImluIEZJUCBhZHZcbiIsIGRlc2MtPmZpcF9kdHlwZSk7CiAJCQkvKiBzdGFuZGFyZCBzYXlzIGlnbm9yZSB1bmtub3duIGRlc2NyaXB0b3JzID49IDEyOCAqLwogCQkJaWYgKGRlc2MtPmZpcF9kdHlwZSA8IEZJUF9EVF9WRU5ET1JfQkFTRSkKQEAgLTg2NywxMSArODkxLDggQEAKIAogCWlmIChlbHNfZHR5cGUgPT0gRklQX0RUX0ZMT0dJICYmIHN1YiA9PSBGSVBfU0NfUkVQICYmCiAJICAgIGZpcC0+ZmxvZ2lfb3hpZCA9PSBudG9ocyhmaC0+Zmhfb3hfaWQpICYmCi0JICAgIGVsc19vcCA9PSBFTFNfTFNfQUNDICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIoZ3JhbnRlZF9tYWMpKSB7CisJICAgIGVsc19vcCA9PSBFTFNfTFNfQUNDICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIoZ3JhbnRlZF9tYWMpKQogCQlmaXAtPmZsb2dpX294aWQgPSBGQ19YSURfVU5LTk9XTjsKLQkJZmlwLT51cGRhdGVfbWFjKGZpcCwgZmlwLT5kYXRhX3NyY19hZGRyLCBncmFudGVkX21hYyk7Ci0JCW1lbWNweShmaXAtPmRhdGFfc3JjX2FkZHIsIGdyYW50ZWRfbWFjLCBFVEhfQUxFTik7Ci0JfQogCiAJLyoKIAkgKiBDb252ZXJ0IHNrYiBpbnRvIGFuIGZjX2ZyYW1lIGNvbnRhaW5pbmcgb25seSB0aGUgRUxTLgpAQCAtODgyLDMyICs5MDMsMzIgQEAKIAlmY19mcmFtZV9pbml0KGZwKTsKIAlmcl9zb2YoZnApID0gRkNfU09GX0kzOwogCWZyX2VvZihmcCkgPSBGQ19FT0ZfVDsKLQlmcl9kZXYoZnApID0gbHA7CisJZnJfZGV2KGZwKSA9IGxwb3J0OwogCi0Jc3RhdHMgPSBmY19scG9ydF9nZXRfc3RhdHMobHApOworCXN0YXRzID0gZmNfbHBvcnRfZ2V0X3N0YXRzKGxwb3J0KTsKIAlzdGF0cy0+UnhGcmFtZXMrKzsKIAlzdGF0cy0+UnhXb3JkcyArPSBza2ItPmxlbiAvIEZJUF9CUFc7CiAKLQlmY19leGNoX3JlY3YobHAsIGZwKTsKKwlmY19leGNoX3JlY3YobHBvcnQsIGZwKTsKIAlyZXR1cm47CiAKIGxlbl9lcnI6Ci0JTElCRkNPRV9GSVBfREJHKCJGSVAgbGVuZ3RoIGVycm9yIGluIGRlc2NyaXB0b3IgdHlwZSAleCBsZW4gJXp1XG4iLAorCUxJQkZDT0VfRklQX0RCRyhmaXAsICJGSVAgbGVuZ3RoIGVycm9yIGluIGRlc2NyaXB0b3IgdHlwZSAleCBsZW4gJXp1XG4iLAogCQkJZGVzYy0+ZmlwX2R0eXBlLCBkbGVuKTsKIGRyb3A6CiAJa2ZyZWVfc2tiKHNrYik7CiB9CiAKIC8qKgotICogZmNvZV9jdGxyX3JlY3ZfZWxzKCkgLSBIYW5kbGUgYW4gaW5jb21pbmcgbGluayByZXNldCBmcmFtZS4KLSAqIEBmaXA6CUZDb0UgY29udHJvbGxlci4KLSAqIEBmaDoJCVJlY2VpdmVkIEZJUCBoZWFkZXIuCisgKiBmY29lX2N0bHJfcmVjdl9lbHMoKSAtIEhhbmRsZSBhbiBpbmNvbWluZyBsaW5rIHJlc2V0IGZyYW1lCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyIHRoYXQgcmVjZWl2ZWQgdGhlIGZyYW1lCisgKiBAZmg6CSBUaGUgcmVjZWl2ZWQgRklQIGhlYWRlcgogICoKICAqIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBWTl9Qb3J0IGRlc2NyaXB0b3JzLgogICogVGhlIG92ZXJhbGwgbGVuZ3RoIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC4KICAqLwogc3RhdGljIHZvaWQgZmNvZV9jdGxyX3JlY3ZfY2xyX3ZsaW5rKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwKLQkJCQkgICAgICBzdHJ1Y3QgZmlwX2hlYWRlciAqZmgpCisJCQkJICAgICBzdHJ1Y3QgZmlwX2hlYWRlciAqZmgpCiB7CiAJc3RydWN0IGZpcF9kZXNjICpkZXNjOwogCXN0cnVjdCBmaXBfbWFjX2Rlc2MgKm1wOwpAQCAtOTE2LDEzICs5MzcsMTMgQEAKIAlzaXplX3QgcmxlbjsKIAlzaXplX3QgZGxlbjsKIAlzdHJ1Y3QgZmNvZV9mY2YgKmZjZiA9IGZpcC0+c2VsX2ZjZjsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZmlwLT5scDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZmlwLT5scDsKIAl1MzIJZGVzY19tYXNrOwogCi0JTElCRkNPRV9GSVBfREJHKCJDbGVhciBWaXJ0dWFsIExpbmsgcmVjZWl2ZWRcbiIpOworCUxJQkZDT0VfRklQX0RCRyhmaXAsICJDbGVhciBWaXJ0dWFsIExpbmsgcmVjZWl2ZWRcbiIpOwogCWlmICghZmNmKQogCQlyZXR1cm47Ci0JaWYgKCFmY2YgfHwgIWZjX2hvc3RfcG9ydF9pZChscC0+aG9zdCkpCisJaWYgKCFmY2YgfHwgIWZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpCiAJCXJldHVybjsKIAogCS8qCkBAIC05NTgsOSArOTc5LDEwIEBACiAJCQlpZiAoZGxlbiA8IHNpemVvZigqdnApKQogCQkJCXJldHVybjsKIAkJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIodnAtPmZkX21hYywKLQkJCSAgICBmaXAtPmRhdGFfc3JjX2FkZHIpID09IDAgJiYKLQkJCSAgICBnZXRfdW5hbGlnbmVkX2JlNjQoJnZwLT5mZF93d3BuKSA9PSBscC0+d3dwbiAmJgotCQkJICAgIG50b2gyNCh2cC0+ZmRfZmNfaWQpID09IGZjX2hvc3RfcG9ydF9pZChscC0+aG9zdCkpCisJCQkJCSAgICAgICBmaXAtPmdldF9zcmNfYWRkcihscG9ydCkpID09IDAgJiYKKwkJCSAgICBnZXRfdW5hbGlnbmVkX2JlNjQoJnZwLT5mZF93d3BuKSA9PSBscG9ydC0+d3dwbiAmJgorCQkJICAgIG50b2gyNCh2cC0+ZmRfZmNfaWQpID09CisJCQkgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSkKIAkJCQlkZXNjX21hc2sgJj0gfkJJVChGSVBfRFRfVk5fSUQpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC05NzcsMzMgKzk5OSwzOSBAQAogCSAqIHJlc2V0IG9ubHkgaWYgYWxsIHJlcXVpcmVkIGRlc2NyaXB0b3JzIHdlcmUgcHJlc2VudCBhbmQgdmFsaWQuCiAJICovCiAJaWYgKGRlc2NfbWFzaykgewotCQlMSUJGQ09FX0ZJUF9EQkcoIm1pc3NpbmcgZGVzY3JpcHRvcnMgbWFzayAleFxuIiwgZGVzY19tYXNrKTsKKwkJTElCRkNPRV9GSVBfREJHKGZpcCwgIm1pc3NpbmcgZGVzY3JpcHRvcnMgbWFzayAleFxuIiwKKwkJCQlkZXNjX21hc2spOwogCX0gZWxzZSB7Ci0JCUxJQkZDT0VfRklQX0RCRygicGVyZm9ybWluZyBDbGVhciBWaXJ0dWFsIExpbmtcbiIpOwotCQlmY29lX2N0bHJfcmVzZXQoZmlwLCBGSVBfU1RfRU5BQkxFRCk7CisJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJwZXJmb3JtaW5nIENsZWFyIFZpcnR1YWwgTGlua1xuIik7CisKKwkJc3Bpbl9sb2NrX2JoKCZmaXAtPmxvY2spOworCQlmY19scG9ydF9nZXRfc3RhdHMobHBvcnQpLT5WTGlua0ZhaWx1cmVDb3VudCsrOworCQlmY29lX2N0bHJfcmVzZXQoZmlwKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmZpcC0+bG9jayk7CisKKwkJZmNfbHBvcnRfcmVzZXQoZmlwLT5scCk7CisJCWZjb2VfY3Rscl9zb2xpY2l0KGZpcCwgTlVMTCk7CiAJfQogfQogCiAvKioKLSAqIGZjb2VfY3Rscl9yZWN2KCkgLSBSZWNlaXZlIGEgRklQIGZyYW1lLgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgotICogQHNrYjoJUmVjZWl2ZWQgRklQIHBhY2tldC4KKyAqIGZjb2VfY3Rscl9yZWN2KCkgLSBSZWNlaXZlIGEgRklQIHBhY2tldAorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlciB0aGF0IHJlY2VpdmVkIHRoZSBwYWNrZXQKKyAqIEBza2I6IFRoZSByZWNlaXZlZCBGSVAgcGFja2V0CiAgKgotICogVGhpcyBpcyBjYWxsZWQgZnJvbSBORVRfUlhfU09GVElSUS4KKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCBmcm9tIGVpdGhlciBORVRfUlhfU09GVElSUSBvciBJUlEuCiAgKi8KIHZvaWQgZmNvZV9jdGxyX3JlY3Yoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXNwaW5fbG9ja19iaCgmZmlwLT5maXBfcmVjdl9saXN0LmxvY2spOwotCV9fc2tiX3F1ZXVlX3RhaWwoJmZpcC0+ZmlwX3JlY3ZfbGlzdCwgc2tiKTsKLQlzcGluX3VubG9ja19iaCgmZmlwLT5maXBfcmVjdl9saXN0LmxvY2spOworCXNrYl9xdWV1ZV90YWlsKCZmaXAtPmZpcF9yZWN2X2xpc3QsIHNrYik7CiAJc2NoZWR1bGVfd29yaygmZmlwLT5yZWN2X3dvcmspOwogfQogRVhQT1JUX1NZTUJPTChmY29lX2N0bHJfcmVjdik7CiAKIC8qKgotICogZmNvZV9jdGxyX3JlY3ZfaGFuZGxlcigpIC0gUmVjZWl2ZSBhIEZJUCBmcmFtZS4KLSAqIEBmaXA6CUZDb0UgY29udHJvbGxlci4KLSAqIEBza2I6CVJlY2VpdmVkIEZJUCBwYWNrZXQuCisgKiBmY29lX2N0bHJfcmVjdl9oYW5kbGVyKCkgLSBSZWNlaXZlIGEgRklQIGZyYW1lCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyIHRoYXQgcmVjZWl2ZWQgdGhlIGZyYW1lCisgKiBAc2tiOiBUaGUgcmVjZWl2ZWQgRklQIGZyYW1lCiAgKgogICogUmV0dXJucyBub24temVybyBpZiB0aGUgZnJhbWUgaXMgZHJvcHBlZC4KICAqLwpAQCAtMTAzOCw3ICsxMDY2LDcgQEAKIAkJZmlwLT5tYXBfZGVzdCA9IDA7CiAJCWZpcC0+c3RhdGUgPSBGSVBfU1RfRU5BQkxFRDsKIAkJc3RhdGUgPSBGSVBfU1RfRU5BQkxFRDsKLQkJTElCRkNPRV9GSVBfREJHKCJVc2luZyBGSVAgbW9kZVxuIik7CisJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJVc2luZyBGSVAgbW9kZVxuIik7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOwogCWlmIChzdGF0ZSAhPSBGSVBfU1RfRU5BQkxFRCkKQEAgLTEwNjAsOCArMTA4OCw4IEBACiB9CiAKIC8qKgotICogZmNvZV9jdGxyX3NlbGVjdCgpIC0gU2VsZWN0IHRoZSBiZXN0IEZDRiwgaWYgcG9zc2libGUuCi0gKiBAZmlwOglGQ29FIGNvbnRyb2xsZXIuCisgKiBmY29lX2N0bHJfc2VsZWN0KCkgLSBTZWxlY3QgdGhlIGJlc3QgRkNGIChpZiBwb3NzaWJsZSkKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIKICAqCiAgKiBJZiB0aGVyZSBhcmUgY29uZmxpY3RpbmcgYWR2ZXJ0aXNlbWVudHMsIG5vIEZDRiBjYW4gYmUgY2hvc2VuLgogICoKQEAgLTEwNzMsMTEgKzExMDEsMTEgQEAKIAlzdHJ1Y3QgZmNvZV9mY2YgKmJlc3QgPSBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmY2YsICZmaXAtPmZjZnMsIGxpc3QpIHsKLQkJTElCRkNPRV9GSVBfREJHKCJjb25zaWRlciBGQ0YgZm9yIGZhYiAlbGx4IFZGSUQgJWQgbWFwICV4ICIKKwkJTElCRkNPRV9GSVBfREJHKGZpcCwgImNvbnNpZGVyIEZDRiBmb3IgZmFiICVsbHggVkZJRCAlZCBtYXAgJXggIgogCQkJCSJ2YWwgJWRcbiIsIGZjZi0+ZmFicmljX25hbWUsIGZjZi0+dmZpZCwKIAkJCQlmY2YtPmZjX21hcCwgZmNvZV9jdGxyX210dV92YWxpZChmY2YpKTsKIAkJaWYgKCFmY29lX2N0bHJfZmNmX3VzYWJsZShmY2YpKSB7Ci0JCQlMSUJGQ09FX0ZJUF9EQkcoIkZDRiBmb3IgZmFiICVsbHggbWFwICV4ICVzdmFsaWQgIgorCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgIkZDRiBmb3IgZmFiICVsbHggbWFwICV4ICVzdmFsaWQgIgogCQkJCQkiJXNhdmFpbGFibGVcbiIsIGZjZi0+ZmFicmljX25hbWUsCiAJCQkJCWZjZi0+ZmNfbWFwLCAoZmNmLT5mbGFncyAmIEZJUF9GTF9TT0wpCiAJCQkJCT8gIiIgOiAiaW4iLCAoZmNmLT5mbGFncyAmIEZJUF9GTF9BVkFJTCkKQEAgLTEwOTEsNyArMTExOSw3IEBACiAJCWlmIChmY2YtPmZhYnJpY19uYW1lICE9IGJlc3QtPmZhYnJpY19uYW1lIHx8CiAJCSAgICBmY2YtPnZmaWQgIT0gYmVzdC0+dmZpZCB8fAogCQkgICAgZmNmLT5mY19tYXAgIT0gYmVzdC0+ZmNfbWFwKSB7Ci0JCQlMSUJGQ09FX0ZJUF9EQkcoIkNvbmZsaWN0aW5nIGZhYnJpYywgVkZJRCwgIgorCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgIkNvbmZsaWN0aW5nIGZhYnJpYywgVkZJRCwgIgogCQkJCQkib3IgRkMtTUFQXG4iKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTEwMiw4ICsxMTMwLDggQEAKIH0KIAogLyoqCi0gKiBmY29lX2N0bHJfdGltZW91dCgpIC0gRklQIHRpbWVyIGZ1bmN0aW9uLgotICogQGFyZzoJJmZjb2VfY3RsciBwb2ludGVyLgorICogZmNvZV9jdGxyX3RpbWVvdXQoKSAtIEZJUCB0aW1lb3V0IGhhbmRsZXIKKyAqIEBhcmc6IFRoZSBGQ29FIGNvbnRyb2xsZXIgdGhhdCB0aW1lZCBvdXQKICAqCiAgKiBBZ2VzIEZDRnMuICBUcmlnZ2VycyBGQ0Ygc2VsZWN0aW9uIGlmIHBvc3NpYmxlLiAgU2VuZHMga2VlcC1hbGl2ZXMuCiAgKi8KQEAgLTExMTMsOCArMTE0MSw2IEBACiAJc3RydWN0IGZjb2VfZmNmICpzZWw7CiAJc3RydWN0IGZjb2VfZmNmICpmY2Y7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0tBX1BFUklPRCk7Ci0JdTggc2VuZF9jdGxyX2thOwotCXU4IHNlbmRfcG9ydF9rYTsKIAogCXNwaW5fbG9ja19iaCgmZmlwLT5sb2NrKTsKIAlpZiAoZmlwLT5zdGF0ZSA9PSBGSVBfU1RfRElTQUJMRUQpIHsKQEAgLTExNDAsNTMgKzExNjYsNDcgQEAKIAkJCSAgICAgICBmaXAtPmxwLT5ob3N0LT5ob3N0X25vLCBzZWwtPmZjZl9tYWMpOwogCQkJbWVtY3B5KGZpcC0+ZGVzdF9hZGRyLCBzZWwtPmZjZl9tYWMsIEVUSF9BTEVOKTsKIAkJCWZpcC0+cG9ydF9rYV90aW1lID0gamlmZmllcyArCi0JCQkJCSAgICBtc2Vjc190b19qaWZmaWVzKEZJUF9WTl9LQV9QRVJJT0QpOworCQkJCW1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0tBX1BFUklPRCk7CiAJCQlmaXAtPmN0bHJfa2FfdGltZSA9IGppZmZpZXMgKyBzZWwtPmZrYV9wZXJpb2Q7Ci0JCQlmaXAtPmxpbmsgPSAxOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJsaWJmY29lOiBob3N0JWQ6ICIKLQkJCSAgICAgICAiRklQIEZpYnJlLUNoYW5uZWwgRm9yd2FyZGVyIHRpbWVkIG91dC4gICIKKwkJCSAgICAgICAiRklQIEZpYnJlLUNoYW5uZWwgRm9yd2FyZGVyIHRpbWVkIG91dC4JIgogCQkJICAgICAgICJTdGFydGluZyBGQ0YgZGlzY292ZXJ5LlxuIiwKIAkJCSAgICAgICBmaXAtPmxwLT5ob3N0LT5ob3N0X25vKTsKLQkJCWZpcC0+bGluayA9IDA7CisJCQlmaXAtPnJlc2V0X3JlcSA9IDE7CisJCQlzY2hlZHVsZV93b3JrKCZmaXAtPmxpbmtfd29yayk7CiAJCX0KLQkJc2NoZWR1bGVfd29yaygmZmlwLT5saW5rX3dvcmspOwogCX0KIAotCXNlbmRfY3Rscl9rYSA9IDA7Ci0Jc2VuZF9wb3J0X2thID0gMDsKLQlpZiAoc2VsKSB7CisJaWYgKHNlbCAmJiAhc2VsLT5mZF9mbGFncykgewogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBmaXAtPmN0bHJfa2FfdGltZSkpIHsKIAkJCWZpcC0+Y3Rscl9rYV90aW1lID0gamlmZmllcyArIHNlbC0+ZmthX3BlcmlvZDsKLQkJCXNlbmRfY3Rscl9rYSA9IDE7CisJCQlmaXAtPnNlbmRfY3Rscl9rYSA9IDE7CiAJCX0KIAkJaWYgKHRpbWVfYWZ0ZXIobmV4dF90aW1lciwgZmlwLT5jdGxyX2thX3RpbWUpKQogCQkJbmV4dF90aW1lciA9IGZpcC0+Y3Rscl9rYV90aW1lOwogCiAJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGZpcC0+cG9ydF9rYV90aW1lKSkgewogCQkJZmlwLT5wb3J0X2thX3RpbWUgKz0gamlmZmllcyArCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0tBX1BFUklPRCk7Ci0JCQlzZW5kX3BvcnRfa2EgPSAxOworCQkJCW1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0tBX1BFUklPRCk7CisJCQlmaXAtPnNlbmRfcG9ydF9rYSA9IDE7CiAJCX0KIAkJaWYgKHRpbWVfYWZ0ZXIobmV4dF90aW1lciwgZmlwLT5wb3J0X2thX3RpbWUpKQogCQkJbmV4dF90aW1lciA9IGZpcC0+cG9ydF9rYV90aW1lOwogCQltb2RfdGltZXIoJmZpcC0+dGltZXIsIG5leHRfdGltZXIpOwogCX0gZWxzZSBpZiAoZmlwLT5zZWxfdGltZSkgewogCQluZXh0X3RpbWVyID0gZmlwLT5zZWxfdGltZSArCi0JCQkJbXNlY3NfdG9famlmZmllcyhGQ09FX0NUTFJfU1RBUlRfREVMQVkpOworCQkJbXNlY3NfdG9famlmZmllcyhGQ09FX0NUTFJfU1RBUlRfREVMQVkpOwogCQltb2RfdGltZXIoJmZpcC0+dGltZXIsIG5leHRfdGltZXIpOwogCX0KKwlpZiAoZmlwLT5zZW5kX2N0bHJfa2EgfHwgZmlwLT5zZW5kX3BvcnRfa2EpCisJCXNjaGVkdWxlX3dvcmsoJmZpcC0+bGlua193b3JrKTsKIAlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKLQotCWlmIChzZW5kX2N0bHJfa2EpCi0JCWZjb2VfY3Rscl9zZW5kX2tlZXBfYWxpdmUoZmlwLCAwLCBmaXAtPmN0bF9zcmNfYWRkcik7Ci0JaWYgKHNlbmRfcG9ydF9rYSkKLQkJZmNvZV9jdGxyX3NlbmRfa2VlcF9hbGl2ZShmaXAsIDEsIGZpcC0+ZGF0YV9zcmNfYWRkcik7CiB9CiAKIC8qKgotICogZmNvZV9jdGxyX2xpbmtfd29yaygpIC0gd29ya2VyIHRocmVhZCBmdW5jdGlvbiBmb3IgbGluayBjaGFuZ2VzLgotICogQHdvcms6CXBvaW50ZXIgdG8gbGlua193b3JrIG1lbWJlciBpbnNpZGUgJmZjb2VfY3Rsci4KKyAqIGZjb2VfY3Rscl9saW5rX3dvcmsoKSAtIFdvcmtlciB0aHJlYWQgZnVuY3Rpb24gZm9yIGxpbmsgY2hhbmdlcworICogQHdvcms6IEhhbmRsZSB0byBhIEZDb0UgY29udHJvbGxlcgogICoKICAqIFNlZSBpZiB0aGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQgYW5kIGlmIHNvLCByZXBvcnQgaXQuCiAgKgpAQCAtMTE5NiwyNyArMTIxNiw0OSBAQAogc3RhdGljIHZvaWQgZmNvZV9jdGxyX2xpbmtfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGZjb2VfY3RsciAqZmlwOworCXN0cnVjdCBmY19scG9ydCAqdnBvcnQ7CisJdTggKm1hYzsKIAlpbnQgbGluazsKIAlpbnQgbGFzdF9saW5rOworCWludCByZXNldDsKIAogCWZpcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmNvZV9jdGxyLCBsaW5rX3dvcmspOwogCXNwaW5fbG9ja19iaCgmZmlwLT5sb2NrKTsKIAlsYXN0X2xpbmsgPSBmaXAtPmxhc3RfbGluazsKIAlsaW5rID0gZmlwLT5saW5rOwogCWZpcC0+bGFzdF9saW5rID0gbGluazsKKwlyZXNldCA9IGZpcC0+cmVzZXRfcmVxOworCWZpcC0+cmVzZXRfcmVxID0gMDsKIAlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKIAogCWlmIChsYXN0X2xpbmsgIT0gbGluaykgewogCQlpZiAobGluaykKIAkJCWZjX2xpbmt1cChmaXAtPmxwKTsKIAkJZWxzZQotCQkJZmNvZV9jdGxyX3Jlc2V0KGZpcCwgRklQX1NUX0xJTktfV0FJVCk7CisJCQlmY19saW5rZG93bihmaXAtPmxwKTsKKwl9IGVsc2UgaWYgKHJlc2V0ICYmIGxpbmspCisJCWZjX2xwb3J0X3Jlc2V0KGZpcC0+bHApOworCisJaWYgKGZpcC0+c2VuZF9jdGxyX2thKSB7CisJCWZpcC0+c2VuZF9jdGxyX2thID0gMDsKKwkJZmNvZV9jdGxyX3NlbmRfa2VlcF9hbGl2ZShmaXAsIE5VTEwsIDAsIGZpcC0+Y3RsX3NyY19hZGRyKTsKKwl9CisJaWYgKGZpcC0+c2VuZF9wb3J0X2thKSB7CisJCWZpcC0+c2VuZF9wb3J0X2thID0gMDsKKwkJbXV0ZXhfbG9jaygmZmlwLT5scC0+bHBfbXV0ZXgpOworCQltYWMgPSBmaXAtPmdldF9zcmNfYWRkcihmaXAtPmxwKTsKKwkJZmNvZV9jdGxyX3NlbmRfa2VlcF9hbGl2ZShmaXAsIGZpcC0+bHAsIDEsIG1hYyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodnBvcnQsICZmaXAtPmxwLT52cG9ydHMsIGxpc3QpIHsKKwkJCW1hYyA9IGZpcC0+Z2V0X3NyY19hZGRyKHZwb3J0KTsKKwkJCWZjb2VfY3Rscl9zZW5kX2tlZXBfYWxpdmUoZmlwLCB2cG9ydCwgMSwgbWFjKTsKKwkJfQorCQltdXRleF91bmxvY2soJmZpcC0+bHAtPmxwX211dGV4KTsKIAl9CiB9CiAKIC8qKgotICogZmNvZV9jdGxyX3JlY3Zfd29yaygpIC0gV29ya2VyIHRocmVhZCBmdW5jdGlvbiBmb3IgcmVjZWl2aW5nIEZJUCBmcmFtZXMuCi0gKiBAcmVjdl93b3JrOglwb2ludGVyIHRvIHJlY3Zfd29yayBtZW1iZXIgaW5zaWRlICZmY29lX2N0bHIuCisgKiBmY29lX2N0bHJfcmVjdl93b3JrKCkgLSBXb3JrZXIgdGhyZWFkIGZ1bmN0aW9uIGZvciByZWNlaXZpbmcgRklQIGZyYW1lcworICogQHJlY3Zfd29yazogSGFuZGxlIHRvIGEgRkNvRSBjb250cm9sbGVyCiAgKi8KIHN0YXRpYyB2b2lkIGZjb2VfY3Rscl9yZWN2X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpyZWN2X3dvcmspCiB7CkBAIC0xMjI0LDIwICsxMjY2LDE0IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWZpcCA9IGNvbnRhaW5lcl9vZihyZWN2X3dvcmssIHN0cnVjdCBmY29lX2N0bHIsIHJlY3Zfd29yayk7Ci0Jc3Bpbl9sb2NrX2JoKCZmaXAtPmZpcF9yZWN2X2xpc3QubG9jayk7Ci0Jd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZmaXAtPmZpcF9yZWN2X2xpc3QpKSkgewotCQlzcGluX3VubG9ja19iaCgmZmlwLT5maXBfcmVjdl9saXN0LmxvY2spOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmZpcC0+ZmlwX3JlY3ZfbGlzdCkpKQogCQlmY29lX2N0bHJfcmVjdl9oYW5kbGVyKGZpcCwgc2tiKTsKLQkJc3Bpbl9sb2NrX2JoKCZmaXAtPmZpcF9yZWN2X2xpc3QubG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmZpcF9yZWN2X2xpc3QubG9jayk7CiB9CiAKIC8qKgotICogZmNvZV9jdGxyX3JlY3ZfZmxvZ2koKSAtIHNub29wIFByZS1GSVAgcmVjZWlwdCBvZiBGTE9HSSByZXNwb25zZSBvciByZXF1ZXN0LgotICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgotICogQGZwOgkJRkMgZnJhbWUuCi0gKiBAc2E6CQlFdGhlcm5ldCBzb3VyY2UgTUFDIGFkZHJlc3MgZnJvbSByZWNlaXZlZCBGQ29FIGZyYW1lLgorICogZmNvZV9jdGxyX3JlY3ZfZmxvZ2koKSAtIFNub29wIHByZS1GSVAgcmVjZWlwdCBvZiBGTE9HSSByZXNwb25zZQorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlcgorICogQGZwOgkgVGhlIEZDIGZyYW1lIHRvIHNub29wCiAgKgogICogU25vb3AgcG90ZW50aWFsIHJlc3BvbnNlIHRvIEZMT0dJIG9yIGV2ZW4gaW5jb21pbmcgRkxPR0kuCiAgKgpAQCAtMTI0NSwxNSArMTI4MSwxOCBAQAogICogYnkgZmlwLT5mbG9naV9veGlkICE9IEZDX1hJRF9VTktOT1dOLgogICoKICAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGZyYW1lLgorICogRmlsbCBpbiB0aGUgZ3JhbnRlZF9tYWMgYWRkcmVzcy4KICAqCiAgKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIGZyYW1lIHNob3VsZCBub3QgYmUgZGVsaXZlcmVkIHRvIGxpYmZjLgogICovCi1pbnQgZmNvZV9jdGxyX3JlY3ZfZmxvZ2koc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLCB1OCAqc2EpCitpbnQgZmNvZV9jdGxyX3JlY3ZfZmxvZ2koc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJIHN0cnVjdCBmY19mcmFtZSAqZnApCiB7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJdTggb3A7Ci0JdTggbWFjW0VUSF9BTEVOXTsKKwl1OCAqc2E7CiAKKwlzYSA9IGV0aF9oZHIoJmZwLT5za2IpLT5oX3NvdXJjZTsKIAlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwogCWlmIChmaC0+ZmhfdHlwZSAhPSBGQ19UWVBFX0VMUykKIAkJcmV0dXJuIDA7CkBAIC0xMjY4LDcgKzEzMDcsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJZmlwLT5zdGF0ZSA9IEZJUF9TVF9OT05fRklQOwotCQlMSUJGQ09FX0ZJUF9EQkcoInJlY2VpdmVkIEZMT0dJIExTX0FDQyB1c2luZyBub24tRklQIG1vZGVcbiIpOworCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLAorCQkJCSJyZWNlaXZlZCBGTE9HSSBMU19BQ0MgdXNpbmcgbm9uLUZJUCBtb2RlXG4iKTsKIAogCQkvKgogCQkgKiBGTE9HSSBhY2NlcHRlZC4KQEAgLTEyODMsMTEgKzEzMjMsOCBAQAogCQkJZmlwLT5tYXBfZGVzdCA9IDA7CiAJCX0KIAkJZmlwLT5mbG9naV9veGlkID0gRkNfWElEX1VOS05PV047Ci0JCW1lbWNweShtYWMsIGZpcC0+ZGF0YV9zcmNfYWRkciwgRVRIX0FMRU4pOwotCQlmY19mY29lX3NldF9tYWMoZmlwLT5kYXRhX3NyY19hZGRyLCBmaC0+ZmhfZF9pZCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOwotCi0JCWZpcC0+dXBkYXRlX21hYyhmaXAsIG1hYywgZmlwLT5kYXRhX3NyY19hZGRyKTsKKwkJZmNfZmNvZV9zZXRfbWFjKGZyX2NiKGZwKS0+Z3JhbnRlZF9tYWMsIGZoLT5maF9kX2lkKTsKIAl9IGVsc2UgaWYgKG9wID09IEVMU19GTE9HSSAmJiBmaC0+Zmhfcl9jdGwgPT0gRkNfUkNUTF9FTFNfUkVRICYmIHNhKSB7CiAJCS8qCiAJCSAqIFNhdmUgc291cmNlIE1BQyBmb3IgcG9pbnQtdG8tcG9pbnQgcmVzcG9uc2VzLgpAQCAtMTI5Nyw3ICsxMzM0LDcgQEAKIAkJCW1lbWNweShmaXAtPmRlc3RfYWRkciwgc2EsIEVUSF9BTEVOKTsKIAkJCWZpcC0+bWFwX2Rlc3QgPSAwOwogCQkJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX05PTl9GSVApCi0JCQkJTElCRkNPRV9GSVBfREJHKCJyZWNlaXZlZCBGTE9HSSBSRVEsICIKKwkJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAicmVjZWl2ZWQgRkxPR0kgUkVRLCAiCiAJCQkJCQkidXNpbmcgbm9uLUZJUCBtb2RlXG4iKTsKIAkJCWZpcC0+c3RhdGUgPSBGSVBfU1RfTk9OX0ZJUDsKIAkJfQpAQCAtMTMwOCwxMCArMTM0NSwxMCBAQAogRVhQT1JUX1NZTUJPTChmY29lX2N0bHJfcmVjdl9mbG9naSk7CiAKIC8qKgotICogZmNvZV93d25fZnJvbV9tYWMoKSAtIENvbnZlcnRzIDQ4LWJpdCBJRUVFIE1BQyBhZGRyZXNzIHRvIDY0LWJpdCBGQyBXV04uCi0gKiBAbWFjOiBtYWMgYWRkcmVzcwotICogQHNjaGVtZTogY2hlY2sgcG9ydAotICogQHBvcnQ6IHBvcnQgaW5kaWNhdG9yIGZvciBjb252ZXJ0aW5nCisgKiBmY29lX3d3bl9mcm9tX21hYygpIC0gQ29udmVydHMgYSA0OC1iaXQgSUVFRSBNQUMgYWRkcmVzcyB0byBhIDY0LWJpdCBGQyBXV04KKyAqIEBtYWM6ICAgIFRoZSBNQUMgYWRkcmVzcyB0byBjb252ZXJ0CisgKiBAc2NoZW1lOiBUaGUgc2NoZW1lIHRvIHVzZSB3aGVuIGNvbnZlcnRpbmcKKyAqIEBwb3J0OiAgIFRoZSBwb3J0IGluZGljYXRvciBmb3IgY29udmVydGluZwogICoKICAqIFJldHVybnM6IHU2NCBmYyB3b3JsZCB3aWRlIG5hbWUKICAqLwpAQCAtMTM0OSwyNCArMTM4NiwyNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV93d25fZnJvbV9tYWMpOwogCiAvKioKLSAqIGZjb2VfbGliZmNfY29uZmlnKCkgLSBzZXRzIHVwIGxpYmZjIHJlbGF0ZWQgcHJvcGVydGllcyBmb3IgbHBvcnQKLSAqIEBscDogcHRyIHRvIHRoZSBmY19scG9ydAotICogQHR0OiBsaWJmYyBmdW5jdGlvbiB0ZW1wbGF0ZQorICogZmNvZV9saWJmY19jb25maWcoKSAtIFNldHMgdXAgbGliZmMgcmVsYXRlZCBwcm9wZXJ0aWVzIGZvciBsb2NhbCBwb3J0CisgKiBAbHA6IFRoZSBsb2NhbCBwb3J0IHRvIGNvbmZpZ3VyZSBsaWJmYyBmb3IKKyAqIEB0dDogVGhlIGxpYmZjIGZ1bmN0aW9uIHRlbXBsYXRlCiAgKgogICogUmV0dXJucyA6IDAgZm9yIHN1Y2Nlc3MKICAqLwotaW50IGZjb2VfbGliZmNfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBsaWJmY19mdW5jdGlvbl90ZW1wbGF0ZSAqdHQpCitpbnQgZmNvZV9saWJmY19jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKKwkJICAgICAgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlICp0dCkKIHsKIAkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHNldCBieSB0aGUgTExERCAqLwotCW1lbWNweSgmbHAtPnR0LCB0dCwgc2l6ZW9mKCp0dCkpOwotCWlmIChmY19mY3BfaW5pdChscCkpCisJbWVtY3B5KCZscG9ydC0+dHQsIHR0LCBzaXplb2YoKnR0KSk7CisJaWYgKGZjX2ZjcF9pbml0KGxwb3J0KSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZmNfZXhjaF9pbml0KGxwKTsKLQlmY19lbHNjdF9pbml0KGxwKTsKLQlmY19scG9ydF9pbml0KGxwKTsKLQlmY19ycG9ydF9pbml0KGxwKTsKLQlmY19kaXNjX2luaXQobHApOworCWZjX2V4Y2hfaW5pdChscG9ydCk7CisJZmNfZWxzY3RfaW5pdChscG9ydCk7CisJZmNfbHBvcnRfaW5pdChscG9ydCk7CisJZmNfcnBvcnRfaW5pdChscG9ydCk7CisJZmNfZGlzY19pbml0KGxwb3J0KTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9saWJmY19jb25maWcpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljLmggYi9kcml2ZXJzL3Njc2kvZm5pYy9mbmljLmgKaW5kZXggZTRjMGEzZC4uYmIyMDhhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2ZuaWMvZm5pYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWMuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmZjb2UuaD4KICNpbmNsdWRlICJmbmljX2lvLmgiCiAjaW5jbHVkZSAiZm5pY19yZXMuaCIKICNpbmNsdWRlICJ2bmljX2Rldi5oIgpAQCAtNDQsNyArNDUsNyBAQAogI2RlZmluZQlGTklDX0lPX0xPQ0tTCQk2NCAvKiBJTyBsb2NrczogcG93ZXIgb2YgMiAqLwogI2RlZmluZSBGTklDX0RGTFRfUVVFVUVfREVQVEgJMzIKICNkZWZpbmUJRk5JQ19TVEFUU19SQVRFX0xJTUlUCTQgLyogbGltaXQgcmF0ZSBhdCB3aGljaCBzdGF0cyBhcmUgcHVsbGVkIHVwICovCi0KKyNkZWZpbmUgRk5JQ19NQVhfQ01EX0xFTiAgICAgICAgMTYgLyogU3VwcG9ydGVkIENEQiBsZW5ndGggKi8KIC8qCiAgKiBUYWcgYml0cyB1c2VkIGZvciBzcGVjaWFsIHJlcXVlc3RzLgogICovCkBAIC0xNDUsNiArMTQ2LDcgQEAKIC8qIFBlci1pbnN0YW5jZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCiBzdHJ1Y3QgZm5pYyB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKKwlzdHJ1Y3QgZmNvZV9jdGxyIGN0bHI7CQkvKiBGSVAgRkNvRSBjb250cm9sbGVyIHN0cnVjdHVyZSAqLwogCXN0cnVjdCB2bmljX2Rldl9iYXIgYmFyMDsKIAogCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cnlbRk5JQ19NU0lYX0lOVFJfTUFYXTsKQEAgLTE2MiwyMyArMTY0LDE2IEBACiAJdW5zaWduZWQgaW50IHdxX2NvdW50OwogCXVuc2lnbmVkIGludCBjcV9jb3VudDsKIAotCXUzMiBmY291aV9tb2RlOjE7CQkvKiB1c2UgZmNvdWkgYWRkcmVzcyovCiAJdTMyIHZsYW5faHdfaW5zZXJ0OjE7CSAgICAgICAgLyogbGV0IGh3IGluc2VydCB0aGUgdGFnICovCiAJdTMyIGluX3JlbW92ZToxOyAgICAgICAgICAgICAgICAvKiBmbmljIGRldmljZSBpbiByZW1vdmFsICovCiAJdTMyIHN0b3BfcnhfbGlua19ldmVudHM6MTsgICAgICAvKiBzdG9wIHByb2MuIHJ4IGZyYW1lcywgbGluayBldmVudHMgKi8KIAogCXN0cnVjdCBjb21wbGV0aW9uICpyZW1vdmVfd2FpdDsgLyogZGV2aWNlIHJlbW92ZSB0aHJlYWQgYmxvY2tzICovCiAKLQlzdHJ1Y3QgZmNfZnJhbWUgKmZsb2dpOwotCXN0cnVjdCBmY19mcmFtZSAqZmxvZ2lfcmVzcDsKLQl1MTYgZmxvZ2lfb3hpZDsKLQl1bnNpZ25lZCBsb25nIHNfaWQ7CiAJZW51bSBmbmljX3N0YXRlIHN0YXRlOwogCXNwaW5sb2NrX3QgZm5pY19sb2NrOwogCiAJdTE2IHZsYW5faWQ7CSAgICAgICAgICAgICAgICAvKiBWTEFOIHRhZyBpbmNsdWRpbmcgcHJpb3JpdHkgKi8KLQl1OCBtYWNfYWRkcltFVEhfQUxFTl07Ci0JdTggZGVzdF9hZGRyW0VUSF9BTEVOXTsKIAl1OCBkYXRhX3NyY19hZGRyW0VUSF9BTEVOXTsKIAl1NjQgZmNwX2lucHV0X2J5dGVzOwkJLyogaW50ZXJuYWwgc3RhdGlzdGljICovCiAJdTY0IGZjcF9vdXRwdXRfYnl0ZXM7CQkvKiBpbnRlcm5hbCBzdGF0aXN0aWMgKi8KQEAgLTIwNSw2ICsyMDAsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IGZyYW1lX3dvcms7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBmcmFtZV9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOwogCiAJLyogY29weSB3b3JrIHF1ZXVlIGNhY2hlIGxpbmUgc2VjdGlvbiAqLwogCV9fX19jYWNoZWxpbmVfYWxpZ25lZCBzdHJ1Y3Qgdm5pY193cV9jb3B5IHdxX2NvcHlbRk5JQ19XUV9DT1BZX01BWF07CkBAIC0yMjQsNiArMjIwLDExIEBACiAJX19fX2NhY2hlbGluZV9hbGlnbmVkIHN0cnVjdCB2bmljX2ludHIgaW50cltGTklDX01TSVhfSU5UUl9NQVhdOwogfTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZm5pYyAqZm5pY19mcm9tX2N0bHIoc3RydWN0IGZjb2VfY3RsciAqZmlwKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmlwLCBzdHJ1Y3QgZm5pYywgY3Rscik7Cit9CisKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZm5pY19ldmVudF9xdWV1ZTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZm5pY19hdHRyc1tdOwogCkBAIC0yMzksNyArMjQwLDExIEBACiBpbnQgZm5pY19ycV9jbXBsX2hhbmRsZXIoc3RydWN0IGZuaWMgKmZuaWMsIGludCk7CiBpbnQgZm5pY19hbGxvY19ycV9mcmFtZShzdHJ1Y3Qgdm5pY19ycSAqcnEpOwogdm9pZCBmbmljX2ZyZWVfcnFfYnVmKHN0cnVjdCB2bmljX3JxICpycSwgc3RydWN0IHZuaWNfcnFfYnVmICpidWYpOwotaW50IGZuaWNfc2VuZF9mcmFtZShzdHJ1Y3QgZm5pYyAqZm5pYywgc3RydWN0IGZjX2ZyYW1lICpmcCk7Cit2b2lkIGZuaWNfZmx1c2hfdHgoc3RydWN0IGZuaWMgKik7Cit2b2lkIGZuaWNfZXRoX3NlbmQoc3RydWN0IGZjb2VfY3RsciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgZm5pY19zZXRfcG9ydF9pZChzdHJ1Y3QgZmNfbHBvcnQgKiwgdTMyLCBzdHJ1Y3QgZmNfZnJhbWUgKik7Cit2b2lkIGZuaWNfdXBkYXRlX21hYyhzdHJ1Y3QgZmNfbHBvcnQgKiwgdTggKm5ldyk7Cit2b2lkIGZuaWNfdXBkYXRlX21hY19sb2NrZWQoc3RydWN0IGZuaWMgKiwgdTggKm5ldyk7CiAKIGludCBmbmljX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICosIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKIGludCBmbmljX2Fib3J0X2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICopOwpAQCAtMjUyLDcgKzI1Nyw3IEBACiB2b2lkIGZuaWNfZXhjaF9tZ3JfcmVzZXQoc3RydWN0IGZjX2xwb3J0ICosIHUzMiwgdTMyKTsKIGludCBmbmljX3dxX2NvcHlfY21wbF9oYW5kbGVyKHN0cnVjdCBmbmljICpmbmljLCBpbnQpOwogaW50IGZuaWNfd3FfY21wbF9oYW5kbGVyKHN0cnVjdCBmbmljICpmbmljLCBpbnQpOwotaW50IGZuaWNfZmxvZ2lfcmVnX2hhbmRsZXIoc3RydWN0IGZuaWMgKmZuaWMpOworaW50IGZuaWNfZmxvZ2lfcmVnX2hhbmRsZXIoc3RydWN0IGZuaWMgKmZuaWMsIHUzMik7CiB2b2lkIGZuaWNfd3FfY29weV9jbGVhbnVwX2hhbmRsZXIoc3RydWN0IHZuaWNfd3FfY29weSAqd3EsCiAJCQkJICBzdHJ1Y3QgZmNwaW9faG9zdF9yZXEgKmRlc2MpOwogaW50IGZuaWNfZndfcmVzZXRfaGFuZGxlcihzdHJ1Y3QgZm5pYyAqZm5pYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX2Zjcy5jIGIvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19mY3MuYwppbmRleCA1MGRiM2UzLi41NGY4ZDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX2Zjcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfZmNzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZpcC5oPgogI2luY2x1ZGUgPHNjc2kvZmMvZmNfZWxzLmg+CiAjaW5jbHVkZSA8c2NzaS9mYy9mY19mY29lLmg+CiAjaW5jbHVkZSA8c2NzaS9mY19mcmFtZS5oPgpAQCAtMzQsNiArMzUsOCBAQAogCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZm5pY19ldmVudF9xdWV1ZTsKIAorc3RhdGljIHZvaWQgZm5pY19zZXRfZXRoX21vZGUoc3RydWN0IGZuaWMgKik7CisKIHZvaWQgZm5pY19oYW5kbGVfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGZuaWMgKmZuaWMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGZuaWMsIGxpbmtfd29yayk7CkBAIC02NCwxMCArNjcsMTAgQEAKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKIAkJCQlGTklDX0ZDU19EQkcoS0VSTl9ERUJVRywgZm5pYy0+bHBvcnQtPmhvc3QsCiAJCQkJCSAgICAgImxpbmsgZG93blxuIik7Ci0JCQkJZmNfbGlua2Rvd24oZm5pYy0+bHBvcnQpOworCQkJCWZjb2VfY3Rscl9saW5rX2Rvd24oJmZuaWMtPmN0bHIpOwogCQkJCUZOSUNfRkNTX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwKIAkJCQkJICAgICAibGluayB1cFxuIik7Ci0JCQkJZmNfbGlua3VwKGZuaWMtPmxwb3J0KTsKKwkJCQlmY29lX2N0bHJfbGlua191cCgmZm5pYy0+Y3Rscik7CiAJCQl9IGVsc2UKIAkJCQkvKiBVUCAtPiBVUCAqLwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwpAQCAtNzYsMTMgKzc5LDEzIEBACiAJCS8qIERPV04gLT4gVVAgKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAJCUZOSUNfRkNTX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwgImxpbmsgdXBcbiIpOwotCQlmY19saW5rdXAoZm5pYy0+bHBvcnQpOworCQlmY29lX2N0bHJfbGlua191cCgmZm5pYy0+Y3Rscik7CiAJfSBlbHNlIHsKIAkJLyogVVAgLT4gRE9XTiAqLwogCQlmbmljLT5scG9ydC0+aG9zdF9zdGF0cy5saW5rX2ZhaWx1cmVfY291bnQrKzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAJCUZOSUNfRkNTX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwgImxpbmsgZG93blxuIik7Ci0JCWZjX2xpbmtkb3duKGZuaWMtPmxwb3J0KTsKKwkJZmNvZV9jdGxyX2xpbmtfZG93bigmZm5pYy0+Y3Rscik7CiAJfQogCiB9CkBAIC0xMDcsMTk3ICsxMTAsMTc5IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJZnAgPSAoc3RydWN0IGZjX2ZyYW1lICopc2tiOwotCQkvKiBpZiBGbG9naSByZXNwIGZyYW1lLCByZWdpc3RlciB0aGUgYWRkcmVzcyAqLwotCQlpZiAoZnJfZmxhZ3MoZnApKSB7Ci0JCQl2bmljX2Rldl9hZGRfYWRkcihmbmljLT52ZGV2LAotCQkJCQkgIGZuaWMtPmRhdGFfc3JjX2FkZHIpOwotCQkJZnJfZmxhZ3MoZnApID0gMDsKKworCQkvKgorCQkgKiBJZiB3ZSdyZSBpbiBhIHRyYW5zaXRpb25hbCBzdGF0ZSwganVzdCByZS1xdWV1ZSBhbmQgcmV0dXJuLgorCQkgKiBUaGUgcXVldWUgd2lsbCBiZSBzZXJ2aWNlZCB3aGVuIHdlIGdldCB0byBhIHN0YWJsZSBzdGF0ZS4KKwkJICovCisJCWlmIChmbmljLT5zdGF0ZSAhPSBGTklDX0lOX0ZDX01PREUgJiYKKwkJICAgIGZuaWMtPnN0YXRlICE9IEZOSUNfSU5fRVRIX01PREUpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZmbmljLT5mcmFtZV9xdWV1ZSwgc2tiKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogCiAJCWZjX2V4Y2hfcmVjdihscCwgZnApOwogCX0KLQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZm5pY19pbXBvcnRfcnFfZmNfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgdTMyIGxlbiwgdTggc29mLCB1OCBlb2YpCi17Ci0Jc3RydWN0IGZjX2ZyYW1lICpmcCA9IChzdHJ1Y3QgZmNfZnJhbWUgKilza2I7Ci0KLQlza2JfdHJpbShza2IsIGxlbik7Ci0JZnJfZW9mKGZwKSA9IGVvZjsKLQlmcl9zb2YoZnApID0gc29mOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IGZuaWNfaW1wb3J0X3JxX2V0aF9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbikKKy8qKgorICogZm5pY19pbXBvcnRfcnFfZXRoX3BrdCgpIC0gaGFuZGxlIHJlY2VpdmVkIEZDb0Ugb3IgRklQIGZyYW1lLgorICogQGZuaWM6CWZuaWMgaW5zdGFuY2UuCisgKiBAc2tiOglFdGhlcm5ldCBGcmFtZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZm5pY19pbXBvcnRfcnFfZXRoX3BrdChzdHJ1Y3QgZm5pYyAqZm5pYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwogCXN0cnVjdCBldGhoZHIgKmVoOwotCXN0cnVjdCB2bGFuX2V0aGhkciAqdmg7CiAJc3RydWN0IGZjb2VfaGRyICpmY29lX2hkcjsKIAlzdHJ1Y3QgZmNvZV9jcmNfZW9mICpmdDsKLQl1MzIgICAgdHJhbnNwb3J0X2xlbiA9IDA7CiAKKwkvKgorCSAqIFVuZG8gVkxBTiBlbmNhcHN1bGF0aW9uIGlmIHByZXNlbnQuCisJICovCiAJZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLQl2aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2ItPmRhdGE7Ci0JaWYgKHZoLT5oX3ZsYW5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCi0JICAgIHZoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID09IGh0b25zKEVUSF9QX0ZDT0UpKSB7Ci0JCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB2bGFuX2V0aGhkcikpOwotCQl0cmFuc3BvcnRfbGVuICs9IHNpemVvZihzdHJ1Y3Qgdmxhbl9ldGhoZHIpOwotCX0gZWxzZSBpZiAoZWgtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfRkNPRSkpIHsKLQkJdHJhbnNwb3J0X2xlbiArPSBzaXplb2Yoc3RydWN0IGV0aGhkcik7Ci0JCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC0xOworCWlmIChlaC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJbWVtbW92ZSgodTggKillaCArIFZMQU5fSExFTiwgZWgsIEVUSF9BTEVOICogMik7CisJCWVoID0gKHN0cnVjdCBldGhoZHIgKilza2JfcHVsbChza2IsIFZMQU5fSExFTik7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJfQorCWlmIChlaC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9GSVApKSB7CisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCplaCkpOworCQlmY29lX2N0bHJfcmVjdigmZm5pYy0+Y3Rsciwgc2tiKTsKKwkJcmV0dXJuIDE7CQkvKiBsZXQgY2FsbGVyIGtub3cgcGFja2V0IHdhcyB1c2VkICovCisJfQorCWlmIChlaC0+aF9wcm90byAhPSBodG9ucyhFVEhfUF9GQ09FKSkKKwkJZ290byBkcm9wOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBzaXplb2YoKmVoKSk7CisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmVoKSk7CiAKIAlmY29lX2hkciA9IChzdHJ1Y3QgZmNvZV9oZHIgKilza2ItPmRhdGE7CiAJaWYgKEZDX0ZDT0VfREVDQVBTX1ZFUihmY29lX2hkcikgIT0gRkNfRkNPRV9WRVIpCi0JCXJldHVybiAtMTsKKwkJZ290byBkcm9wOwogCiAJZnAgPSAoc3RydWN0IGZjX2ZyYW1lICopc2tiOwogCWZjX2ZyYW1lX2luaXQoZnApOwogCWZyX3NvZihmcCkgPSBmY29lX2hkci0+ZmNvZV9zb2Y7CiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGZjb2VfaGRyKSk7Ci0JdHJhbnNwb3J0X2xlbiArPSBzaXplb2Yoc3RydWN0IGZjb2VfaGRyKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCi0JZnQgPSAoc3RydWN0IGZjb2VfY3JjX2VvZiAqKShza2ItPmRhdGEgKyBsZW4gLQotCQkJCSAgICAgdHJhbnNwb3J0X2xlbiAtIHNpemVvZigqZnQpKTsKKwlmdCA9IChzdHJ1Y3QgZmNvZV9jcmNfZW9mICopKHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gc2l6ZW9mKCpmdCkpOwogCWZyX2VvZihmcCkgPSBmdC0+ZmNvZV9lb2Y7Ci0Jc2tiX3RyaW0oc2tiLCBsZW4gLSB0cmFuc3BvcnRfbGVuIC0gc2l6ZW9mKCpmdCkpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBzaXplb2YoKmZ0KSk7CiAJcmV0dXJuIDA7Citkcm9wOgorCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmbmljX2hhbmRsZV9mbG9naV9yZXNwKHN0cnVjdCBmbmljICpmbmljLAotCQkJCQkgc3RydWN0IGZjX2ZyYW1lICpmcCkKKy8qKgorICogZm5pY191cGRhdGVfbWFjX2xvY2tlZCgpIC0gc2V0IGRhdGEgTUFDIGFkZHJlc3MgYW5kIGZpbHRlcnMuCisgKiBAZm5pYzoJZm5pYyBpbnN0YW5jZS4KKyAqIEBuZXc6CW5ld2x5LWFzc2lnbmVkIEZDb0UgTUFDIGFkZHJlc3MuCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGZuaWMgbG9jayBoZWxkLgorICovCit2b2lkIGZuaWNfdXBkYXRlX21hY19sb2NrZWQoc3RydWN0IGZuaWMgKmZuaWMsIHU4ICpuZXcpCiB7Ci0JdTggbWFjW0VUSF9BTEVOXSA9IEZDX0ZDT0VfRkxPR0lfTUFDOwotCXN0cnVjdCBldGhoZHIgKmV0aF9oZHI7Ci0Jc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZmNfZnJhbWUgKm9sZF9mbG9naV9yZXNwID0gTlVMTDsKKwl1OCAqY3RsID0gZm5pYy0+Y3Rsci5jdGxfc3JjX2FkZHI7CisJdTggKmRhdGEgPSBmbmljLT5kYXRhX3NyY19hZGRyOwogCi0JZmggPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKWZyX2hkcihmcCk7CisJaWYgKGlzX3plcm9fZXRoZXJfYWRkcihuZXcpKQorCQluZXcgPSBjdGw7CisJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZGF0YSwgbmV3KSkKKwkJcmV0dXJuOworCUZOSUNfRkNTX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwgInVwZGF0ZV9tYWMgJXBNXG4iLCBuZXcpOworCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGRhdGEpICYmIGNvbXBhcmVfZXRoZXJfYWRkcihkYXRhLCBjdGwpKQorCQl2bmljX2Rldl9kZWxfYWRkcihmbmljLT52ZGV2LCBkYXRhKTsKKwltZW1jcHkoZGF0YSwgbmV3LCBFVEhfQUxFTik7CisJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihuZXcsIGN0bCkpCisJCXZuaWNfZGV2X2FkZF9hZGRyKGZuaWMtPnZkZXYsIG5ldyk7Cit9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CisvKioKKyAqIGZuaWNfdXBkYXRlX21hYygpIC0gc2V0IGRhdGEgTUFDIGFkZHJlc3MgYW5kIGZpbHRlcnMuCisgKiBAbHBvcnQ6CWxvY2FsIHBvcnQuCisgKiBAbmV3OgluZXdseS1hc3NpZ25lZCBGQ29FIE1BQyBhZGRyZXNzLgorICovCit2b2lkIGZuaWNfdXBkYXRlX21hYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCB1OCAqbmV3KQoreworCXN0cnVjdCBmbmljICpmbmljID0gbHBvcnRfcHJpdihscG9ydCk7CiAKLQlpZiAoZm5pYy0+c3RhdGUgPT0gRk5JQ19JTl9FVEhfTU9ERSkgeworCXNwaW5fbG9ja19pcnEoJmZuaWMtPmZuaWNfbG9jayk7CisJZm5pY191cGRhdGVfbWFjX2xvY2tlZChmbmljLCBuZXcpOworCXNwaW5fdW5sb2NrX2lycSgmZm5pYy0+Zm5pY19sb2NrKTsKK30KIAotCQkvKgotCQkgKiBDaGVjayBpZiBveGlkIG1hdGNoZXMgb24gdGFraW5nIHRoZSBsb2NrLiBBIG5ldyBGbG9naQotCQkgKiBpc3N1ZWQgYnkgbGliRkMgbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZSBmbmljIGNhY2hlZCBveGlkCi0JCSAqLwotCQlpZiAoZm5pYy0+ZmxvZ2lfb3hpZCAhPSBudG9ocyhmaC0+Zmhfb3hfaWQpKSB7Ci0JCQlGTklDX0ZDU19EQkcoS0VSTl9ERUJVRywgZm5pYy0+bHBvcnQtPmhvc3QsCi0JCQkJICAgICAiRmxvZ2kgcmVzcG9uc2Ugb3hpZCBub3QiCi0JCQkJICAgICAiIG1hdGNoaW5nIGNhY2hlZCBveGlkLCBkcm9wcGluZyBmcmFtZSIKLQkJCQkgICAgICJcbiIpOwotCQkJcmV0ID0gLTE7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKLQkJCWRldl9rZnJlZV9za2JfaXJxKGZwX3NrYihmcCkpOwotCQkJZ290byBoYW5kbGVfZmxvZ2lfcmVzcF9lbmQ7CisvKioKKyAqIGZuaWNfc2V0X3BvcnRfaWQoKSAtIHNldCB0aGUgcG9ydF9JRCBhZnRlciBzdWNjZXNzZnVsIEZMT0dJLgorICogQGxwb3J0Oglsb2NhbCBwb3J0LgorICogQHBvcnRfaWQ6CWFzc2lnbmVkIEZDX0lELgorICogQGZwOgkJcmVjZWl2ZWQgZnJhbWUgY29udGFpbmluZyB0aGUgRkxPR0kgYWNjZXB0IG9yIE5VTEwuCisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBsaWJmYyB3aGVuIGEgbmV3IEZDX0lEIGhhcyBiZWVuIGFzc2lnbmVkLgorICogVGhpcyBjYXVzZXMgdXMgdG8gcmVzZXQgdGhlIGZpcm13YXJlIHRvIEZDX01PREUgYW5kIHNldHVwIHRoZSBuZXcgTUFDCisgKiBhZGRyZXNzIGFuZCBGQ19JRC4KKyAqCisgKiBJdCBpcyBhbHNvIGNhbGxlZCB3aXRoIEZDX0lEIDAgd2hlbiB3ZSdyZSBsb2dnZWQgb2ZmLgorICoKKyAqIElmIHRoZSBGQ19JRCBpcyBkdWUgdG8gcG9pbnQtdG8tcG9pbnQsIGZwIG1heSBiZSBOVUxMLgorICovCit2b2lkIGZuaWNfc2V0X3BvcnRfaWQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgdTMyIHBvcnRfaWQsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZuaWMgKmZuaWMgPSBscG9ydF9wcml2KGxwb3J0KTsKKwl1OCAqbWFjOworCWludCByZXQ7CisKKwlGTklDX0ZDU19EQkcoS0VSTl9ERUJVRywgbHBvcnQtPmhvc3QsICJzZXQgcG9ydF9pZCAleCBmcCAlcFxuIiwKKwkJICAgICBwb3J0X2lkLCBmcCk7CisKKwkvKgorCSAqIElmIHdlJ3JlIGNsZWFyaW5nIHRoZSBGQ19JRCwgY2hhbmdlIHRvIHVzZSB0aGUgY3RsX3NyY19hZGRyLgorCSAqIFNldCBldGhlcm5ldCBtb2RlIHRvIHNlbmQgRkxPR0kuCisJICovCisJaWYgKCFwb3J0X2lkKSB7CisJCWZuaWNfdXBkYXRlX21hYyhscG9ydCwgZm5pYy0+Y3Rsci5jdGxfc3JjX2FkZHIpOworCQlmbmljX3NldF9ldGhfbW9kZShmbmljKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcCkgeworCQltYWMgPSBmcl9jYihmcCktPmdyYW50ZWRfbWFjOworCQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKG1hYykpIHsKKwkJCS8qIG5vbi1GSVAgLSBGTE9HSSBhbHJlYWR5IGFjY2VwdGVkIC0gaWdub3JlIHJldHVybiAqLworCQkJZmNvZV9jdGxyX3JlY3ZfZmxvZ2koJmZuaWMtPmN0bHIsIGxwb3J0LCBmcCk7CiAJCX0KKwkJZm5pY191cGRhdGVfbWFjKGxwb3J0LCBtYWMpOworCX0KIAotCQkvKiBEcm9wIG9sZGVyIGNhY2hlZCBmbG9naSByZXNwb25zZSBmcmFtZSwgY2FjaGUgdGhpcyBmcmFtZSAqLwotCQlvbGRfZmxvZ2lfcmVzcCA9IGZuaWMtPmZsb2dpX3Jlc3A7Ci0JCWZuaWMtPmZsb2dpX3Jlc3AgPSBmcDsKLQkJZm5pYy0+ZmxvZ2lfb3hpZCA9IEZDX1hJRF9VTktOT1dOOwotCi0JCS8qCi0JCSAqIHRoaXMgZnJhbWUgaXMgcGFydCBvZiBmbG9naSBnZXQgdGhlIHNyYyBtYWMgYWRkciBmcm9tIHRoaXMKLQkJICogZnJhbWUgaWYgdGhlIHNyYyBtYWMgaXMgZmNvdWkgYmFzZWQgdGhlbiB3ZSBtYXJrIHRoZQotCQkgKiBhZGRyZXNzIG1vZGUgZmxhZyB0byB1c2UgZmNvdWkgYmFzZSBmb3IgZHN0IG1hYyBhZGRyCi0JCSAqIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBmY29lIGdhdGV3YXkgYWRkcgotCQkgKi8KLQkJZXRoX2hkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoZnBfc2tiKGZwKSk7Ci0JCW1lbWNweShtYWMsIGV0aF9oZHItPmhfc291cmNlLCBFVEhfQUxFTik7Ci0KLQkJaWYgKG50b2gyNChtYWMpID09IEZDX0ZDT0VfT1VJKQotCQkJZm5pYy0+ZmNvdWlfbW9kZSA9IDE7Ci0JCWVsc2UgewotCQkJZm5pYy0+ZmNvdWlfbW9kZSA9IDA7Ci0JCQltZW1jcHkoZm5pYy0+ZGVzdF9hZGRyLCBtYWMsIEVUSF9BTEVOKTsKLQkJfQotCi0JCS8qCi0JCSAqIEV4Y2VwdCBmb3IgRmxvZ2kgZnJhbWUsIGFsbCBvdXRib3VuZCBmcmFtZXMgZnJvbSB1cyBoYXZlIHRoZQotCQkgKiBFdGggU3JjIGFkZHJlc3MgYXMgRkNfRkNPRV9PVUkib3VyX3NpZCIuIEZsb2dpIGZyYW1lIHVzZXMKLQkJICogdGhlIHZuaWMgTUFDIGFkZHJlc3MgYXMgdGhlIEV0aCBTcmMgYWRkcmVzcwotCQkgKi8KLQkJZmNfZmNvZV9zZXRfbWFjKGZuaWMtPmRhdGFfc3JjX2FkZHIsIGZoLT5maF9kX2lkKTsKLQotCQkvKiBXZSBnZXQgb3VyIHNfaWQgZnJvbSB0aGUgZF9pZCBvZiB0aGUgZmxvZ2kgcmVzcCBmcmFtZSAqLwotCQlmbmljLT5zX2lkID0gbnRvaDI0KGZoLT5maF9kX2lkKTsKLQotCQkvKiBDaGFuZ2Ugc3RhdGUgdG8gcmVmbGVjdCB0cmFuc2l0aW9uIGZyb20gRXRoIHRvIEZDIG1vZGUgKi8KKwkvKiBDaGFuZ2Ugc3RhdGUgdG8gcmVmbGVjdCB0cmFuc2l0aW9uIHRvIEZDIG1vZGUgKi8KKwlzcGluX2xvY2tfaXJxKCZmbmljLT5mbmljX2xvY2spOworCWlmIChmbmljLT5zdGF0ZSA9PSBGTklDX0lOX0VUSF9NT0RFIHx8IGZuaWMtPnN0YXRlID09IEZOSUNfSU5fRkNfTU9ERSkKIAkJZm5pYy0+c3RhdGUgPSBGTklDX0lOX0VUSF9UUkFOU19GQ19NT0RFOwotCi0JfSBlbHNlIHsKKwllbHNlIHsKIAkJRk5JQ19GQ1NfREJHKEtFUk5fREVCVUcsIGZuaWMtPmxwb3J0LT5ob3N0LAogCQkJICAgICAiVW5leHBlY3RlZCBmbmljIHN0YXRlICVzIHdoaWxlIgogCQkJICAgICAiIHByb2Nlc3NpbmcgZmxvZ2kgcmVzcFxuIiwKIAkJCSAgICAgZm5pY19zdGF0ZV90b19zdHIoZm5pYy0+c3RhdGUpKTsKLQkJcmV0ID0gLTE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwotCQlkZXZfa2ZyZWVfc2tiX2lycShmcF9za2IoZnApKTsKLQkJZ290byBoYW5kbGVfZmxvZ2lfcmVzcF9lbmQ7CisJCXNwaW5fdW5sb2NrX2lycSgmZm5pYy0+Zm5pY19sb2NrKTsKKwkJcmV0dXJuOwogCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwotCi0JLyogRHJvcCBvbGRlciBjYWNoZWQgZnJhbWUgKi8KLQlpZiAob2xkX2Zsb2dpX3Jlc3ApCi0JCWRldl9rZnJlZV9za2JfaXJxKGZwX3NrYihvbGRfZmxvZ2lfcmVzcCkpOworCXNwaW5fdW5sb2NrX2lycSgmZm5pYy0+Zm5pY19sb2NrKTsKIAogCS8qCi0JICogc2VuZCBmbG9naSByZWcgcmVxdWVzdCB0byBmaXJtd2FyZSwgdGhpcyB3aWxsIHB1dCB0aGUgZm5pYyBpbgotCSAqIGluIEZDIG1vZGUKKwkgKiBTZW5kIEZMT0dJIHJlZ2lzdHJhdGlvbiB0byBmaXJtd2FyZSB0byBzZXQgdXAgRkMgbW9kZS4KKwkgKiBUaGUgbmV3IGFkZHJlc3Mgd2lsbCBiZSBzZXQgdXAgd2hlbiByZWdpc3RyYXRpb24gY29tcGxldGVzLgogCSAqLwotCXJldCA9IGZuaWNfZmxvZ2lfcmVnX2hhbmRsZXIoZm5pYyk7CisJcmV0ID0gZm5pY19mbG9naV9yZWdfaGFuZGxlcihmbmljLCBwb3J0X2lkKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCWludCBmcmVlX2ZwID0gMTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwotCQkvKgotCQkgKiBmcmVlIHRoZSBmcmFtZSBpcyBzb21lIG90aGVyIHRocmVhZCBpcyBub3QKLQkJICogcG9pbnRpbmcgdG8gaXQKLQkJICovCi0JCWlmIChmbmljLT5mbG9naV9yZXNwICE9IGZwKQotCQkJZnJlZV9mcCA9IDA7Ci0JCWVsc2UKLQkJCWZuaWMtPmZsb2dpX3Jlc3AgPSBOVUxMOwotCisJCXNwaW5fbG9ja19pcnEoJmZuaWMtPmZuaWNfbG9jayk7CiAJCWlmIChmbmljLT5zdGF0ZSA9PSBGTklDX0lOX0VUSF9UUkFOU19GQ19NT0RFKQogCQkJZm5pYy0+c3RhdGUgPSBGTklDX0lOX0VUSF9NT0RFOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKLQkJaWYgKGZyZWVfZnApCi0JCQlkZXZfa2ZyZWVfc2tiX2lycShmcF9za2IoZnApKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZmbmljLT5mbmljX2xvY2spOwogCX0KLQotIGhhbmRsZV9mbG9naV9yZXNwX2VuZDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBSZXR1cm5zIDEgZm9yIGEgcmVzcG9uc2UgdGhhdCBtYXRjaGVzIGNhY2hlZCBmbG9naSBveGlkICovCi1zdGF0aWMgaW5saW5lIGludCBpc19tYXRjaGluZ19mbG9naV9yZXNwX2ZyYW1lKHN0cnVjdCBmbmljICpmbmljLAotCQkJCQkgICAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCkKLXsKLQlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgZl9jdGw7Ci0KLQlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwotCWZfY3RsID0gbnRvaDI0KGZoLT5maF9mX2N0bCk7Ci0KLQlpZiAoZm5pYy0+ZmxvZ2lfb3hpZCA9PSBudG9ocyhmaC0+Zmhfb3hfaWQpICYmCi0JICAgIGZoLT5maF9yX2N0bCA9PSBGQ19SQ1RMX0VMU19SRVAgJiYKLQkgICAgKGZfY3RsICYgKEZDX0ZDX0VYX0NUWCB8IEZDX0ZDX1NFUV9DVFgpKSA9PSBGQ19GQ19FWF9DVFggJiYKLQkgICAgZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9FTFMpCi0JCXJldCA9IDE7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBmbmljX3JxX2NtcGxfZnJhbWVfcmVjdihzdHJ1Y3Qgdm5pY19ycSAqcnEsIHN0cnVjdCBjcV9kZXNjCkBAIC0zMjYsNiArMzExLDcgQEAKIAlwY2lfdW5tYXBfc2luZ2xlKGZuaWMtPnBkZXYsIGJ1Zi0+ZG1hX2FkZHIsIGJ1Zi0+bGVuLAogCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJc2tiID0gYnVmLT5vc19idWY7CisJZnAgPSAoc3RydWN0IGZjX2ZyYW1lICopc2tiOwogCWJ1Zi0+b3NfYnVmID0gTlVMTDsKIAogCWNxX2Rlc2NfZGVjKGNxX2Rlc2MsICZ0eXBlLCAmY29sb3IsICZxX251bWJlciwgJmNvbXBsZXRlZF9pbmRleCk7CkBAIC0zMzgsNiArMzI0LDkgQEAKIAkJCQkgICAmZmNvZV9lbmNfZXJyb3IsICZmY3Nfb2ssICZ2bGFuX3N0cmlwcGVkLAogCQkJCSAgICZ2bGFuKTsKIAkJZXRoX2hkcnNfc3RyaXBwZWQgPSAxOworCQlza2JfdHJpbShza2IsIGZjcF9ieXRlc193cml0dGVuKTsKKwkJZnJfc29mKGZwKSA9IHNvZjsKKwkJZnJfZW9mKGZwKSA9IGVvZjsKIAogCX0gZWxzZSBpZiAodHlwZSA9PSBDUV9ERVNDX1RZUEVfUlFfRU5FVCkgewogCQljcV9lbmV0X3JxX2Rlc2NfZGVjKChzdHJ1Y3QgY3FfZW5ldF9ycV9kZXNjICopY3FfZGVzYywKQEAgLTM1Miw2ICszNDEsMTQgQEAKIAkJCQkgICAgJmlwdjRfY3N1bV9vaywgJmlwdjYsICZpcHY0LAogCQkJCSAgICAmaXB2NF9mcmFnbWVudCwgJmZjc19vayk7CiAJCWV0aF9oZHJzX3N0cmlwcGVkID0gMDsKKwkJc2tiX3RyaW0oc2tiLCBieXRlc193cml0dGVuKTsKKwkJaWYgKCFmY3Nfb2spIHsKKwkJCUZOSUNfRkNTX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwKKwkJCQkgICAgICJmY3MgZXJyb3IuICBkcm9wcGluZyBwYWNrZXQuXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlpZiAoZm5pY19pbXBvcnRfcnFfZXRoX3BrdChmbmljLCBza2IpKQorCQkJcmV0dXJuOwogCiAJfSBlbHNlIHsKIAkJLyogd3JvbmcgQ1EgdHlwZSovCkBAIC0zNzAsNDMgKzM2NywxMSBAQAogCQlnb3RvIGRyb3A7CiAJfQogCi0JaWYgKGV0aF9oZHJzX3N0cmlwcGVkKQotCQlmbmljX2ltcG9ydF9ycV9mY19mcmFtZShza2IsIGZjcF9ieXRlc193cml0dGVuLCBzb2YsIGVvZik7Ci0JZWxzZSBpZiAoZm5pY19pbXBvcnRfcnFfZXRoX3BrdChza2IsIGJ5dGVzX3dyaXR0ZW4pKQotCQlnb3RvIGRyb3A7Ci0KLQlmcCA9IChzdHJ1Y3QgZmNfZnJhbWUgKilza2I7Ci0KLQkvKgotCSAqIElmIGZyYW1lIGlzIGFuIEVMUyByZXNwb25zZSB0aGF0IG1hdGNoZXMgdGhlIGNhY2hlZCBGTE9HSSBPWF9JRCwKLQkgKiBhbmQgaXMgYWNjZXB0LCBpc3N1ZSBmbG9naV9yZWdfcmVxdWVzdCBjb3B5IHdxIHJlcXVlc3QgdG8gZmlybXdhcmUKLQkgKiB0byByZWdpc3RlciB0aGUgU19JRCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgRkNfT1VJIG1vZGUgb3IgR1cgbW9kZS4KLQkgKi8KLQlpZiAoaXNfbWF0Y2hpbmdfZmxvZ2lfcmVzcF9mcmFtZShmbmljLCBmcCkpIHsKLQkJaWYgKCFldGhfaGRyc19zdHJpcHBlZCkgewotCQkJaWYgKGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApID09IEVMU19MU19BQ0MpIHsKLQkJCQlmbmljX2hhbmRsZV9mbG9naV9yZXNwKGZuaWMsIGZwKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvKgotCQkJICogUmVjZC4gRmxvZ2kgcmVqZWN0LiBObyBwb2ludCByZWdpc3RlcmluZwotCQkJICogd2l0aCBmdywgYnV0IGZvcndhcmQgdG8gbGliRkMKLQkJCSAqLwotCQkJZ290byBmb3J3YXJkOwotCQl9Ci0JCWdvdG8gZHJvcDsKLQl9Ci0JaWYgKCFldGhfaGRyc19zdHJpcHBlZCkKLQkJZ290byBkcm9wOwotCi1mb3J3YXJkOgogCXNwaW5fbG9ja19pcnFzYXZlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKIAlpZiAoZm5pYy0+c3RvcF9yeF9saW5rX2V2ZW50cykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKIAkJZ290byBkcm9wOwogCX0KLQkvKiBVc2UgZnJfZmxhZ3MgdG8gaW5kaWNhdGUgd2hldGhlciBzdWNjLiBmbG9naSByZXNwIG9yIG5vdCAqLwotCWZyX2ZsYWdzKGZwKSA9IDA7CiAJZnJfZGV2KGZwKSA9IGZuaWMtPmxwb3J0OwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogCkBAIC00OTQsMTIgKzQ1OSw0OSBAQAogCWJ1Zi0+b3NfYnVmID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXNfZmxvZ2lfZnJhbWUoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmgpCisvKioKKyAqIGZuaWNfZXRoX3NlbmQoKSAtIFNlbmQgRXRoZXJuZXQgZnJhbWUuCisgKiBAZmlwOglmY29lX2N0bHIgaW5zdGFuY2UuCisgKiBAc2tiOglFdGhlcm5ldCBGcmFtZSwgRklQLCB3aXRob3V0IFZMQU4gZW5jYXBzdWxhdGlvbi4KKyAqLwordm9pZCBmbmljX2V0aF9zZW5kKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSAmJiAqKHU4ICopKGZoICsgMSkgPT0gRUxTX0ZMT0dJOworCXN0cnVjdCBmbmljICpmbmljID0gZm5pY19mcm9tX2N0bHIoZmlwKTsKKwlzdHJ1Y3Qgdm5pY193cSAqd3EgPSAmZm5pYy0+d3FbMF07CisJZG1hX2FkZHJfdCBwYTsKKwlzdHJ1Y3QgZXRoaGRyICpldGhfaGRyOworCXN0cnVjdCB2bGFuX2V0aGhkciAqdmxhbl9oZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZm5pYy0+dmxhbl9od19pbnNlcnQpIHsKKwkJZXRoX2hkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKKwkJdmxhbl9oZHIgPSAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiX3B1c2goc2tiLAorCQkJCXNpemVvZigqdmxhbl9oZHIpIC0gc2l6ZW9mKCpldGhfaGRyKSk7CisJCW1lbWNweSh2bGFuX2hkciwgZXRoX2hkciwgMiAqIEVUSF9BTEVOKTsKKwkJdmxhbl9oZHItPmhfdmxhbl9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsKKwkJdmxhbl9oZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBldGhfaGRyLT5oX3Byb3RvOworCQl2bGFuX2hkci0+aF92bGFuX1RDSSA9IGh0b25zKGZuaWMtPnZsYW5faWQpOworCX0KKworCXBhID0gcGNpX21hcF9zaW5nbGUoZm5pYy0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZm5pYy0+d3FfbG9ja1swXSwgZmxhZ3MpOworCWlmICghdm5pY193cV9kZXNjX2F2YWlsKHdxKSkgeworCQlwY2lfdW5tYXBfc2luZ2xlKGZuaWMtPnBkZXYsIHBhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPndxX2xvY2tbMF0sIGZsYWdzKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlmbmljX3F1ZXVlX3dxX2V0aF9kZXNjKHdxLCBza2IsIHBhLCBza2ItPmxlbiwKKwkJCSAgICAgICBmbmljLT52bGFuX2h3X2luc2VydCwgZm5pYy0+dmxhbl9pZCwgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+d3FfbG9ja1swXSwgZmxhZ3MpOwogfQogCi1pbnQgZm5pY19zZW5kX2ZyYW1lKHN0cnVjdCBmbmljICpmbmljLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQorLyoKKyAqIFNlbmQgRkMgZnJhbWUuCisgKi8KK3N0YXRpYyBpbnQgZm5pY19zZW5kX2ZyYW1lKHN0cnVjdCBmbmljICpmbmljLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCB2bmljX3dxICp3cSA9ICZmbmljLT53cVswXTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNTE1LDYgKzUxNywxMCBAQAogCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAJc2tiID0gZnBfc2tiKGZwKTsKIAorCWlmICh1bmxpa2VseShmaC0+Zmhfcl9jdGwgPT0gRkNfUkNUTF9FTFNfUkVRKSAmJgorCSAgICBmY29lX2N0bHJfZWxzX3NlbmQoJmZuaWMtPmN0bHIsIGZuaWMtPmxwb3J0LCBza2IpKQorCQlyZXR1cm4gMDsKKwogCWlmICghZm5pYy0+dmxhbl9od19pbnNlcnQpIHsKIAkJZXRoX2hkcl9sZW4gPSBzaXplb2YoKnZsYW5faGRyKSArIHNpemVvZigqZmNvZV9oZHIpOwogCQl2bGFuX2hkciA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2JfcHVzaChza2IsIGV0aF9oZHJfbGVuKTsKQEAgLTUzMCwxNiArNTM2LDExIEBACiAJCWZjb2VfaGRyID0gKHN0cnVjdCBmY29lX2hkciAqKShldGhfaGRyICsgMSk7CiAJfQogCi0JaWYgKGlzX2Zsb2dpX2ZyYW1lKGZoKSkgeworCWlmIChmbmljLT5jdGxyLm1hcF9kZXN0KQogCQlmY19mY29lX3NldF9tYWMoZXRoX2hkci0+aF9kZXN0LCBmaC0+ZmhfZF9pZCk7Ci0JCW1lbWNweShldGhfaGRyLT5oX3NvdXJjZSwgZm5pYy0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQlpZiAoZm5pYy0+ZmNvdWlfbW9kZSkKLQkJCWZjX2Zjb2Vfc2V0X21hYyhldGhfaGRyLT5oX2Rlc3QsIGZoLT5maF9kX2lkKTsKLQkJZWxzZQotCQkJbWVtY3B5KGV0aF9oZHItPmhfZGVzdCwgZm5pYy0+ZGVzdF9hZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShldGhfaGRyLT5oX3NvdXJjZSwgZm5pYy0+ZGF0YV9zcmNfYWRkciwgRVRIX0FMRU4pOwotCX0KKwllbHNlCisJCW1lbWNweShldGhfaGRyLT5oX2Rlc3QsIGZuaWMtPmN0bHIuZGVzdF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGV0aF9oZHItPmhfc291cmNlLCBmbmljLT5kYXRhX3NyY19hZGRyLCBFVEhfQUxFTik7CiAKIAl0b3RfbGVuID0gc2tiLT5sZW47CiAJQlVHX09OKHRvdF9sZW4gJSA0KTsKQEAgLTU3OCwxMDkgKzU3OSw4NSBAQAogaW50IGZuaWNfc2VuZChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCBmbmljICpmbmljID0gbHBvcnRfcHJpdihscCk7Ci0Jc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7Ci0JaW50IHJldCA9IDA7Ci0JZW51bSBmbmljX3N0YXRlIG9sZF9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBmY19mcmFtZSAqb2xkX2Zsb2dpID0gTlVMTDsKLQlzdHJ1Y3QgZmNfZnJhbWUgKm9sZF9mbG9naV9yZXNwID0gTlVMTDsKIAogCWlmIChmbmljLT5pbl9yZW1vdmUpIHsKIAkJZGV2X2tmcmVlX3NrYihmcF9za2IoZnApKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZm5pY19zZW5kX2VuZDsKKwkJcmV0dXJuIC0xOwogCX0KIAotCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7Ci0JLyogaWYgbm90IGFuIEZsb2dpIGZyYW1lLCBzZW5kIGl0IG91dCwgdGhpcyBpcyB0aGUgY29tbW9uIGNhc2UgKi8KLQlpZiAoIWlzX2Zsb2dpX2ZyYW1lKGZoKSkKLQkJcmV0dXJuIGZuaWNfc2VuZF9mcmFtZShmbmljLCBmcCk7CisJLyoKKwkgKiBRdWV1ZSBmcmFtZSBpZiBpbiBhIHRyYW5zaXRpb25hbCBzdGF0ZS4KKwkgKiBUaGlzIG9jY3VycyB3aGlsZSByZWdpc3RlcmluZyB0aGUgUG9ydF9JRCAvIE1BQyBhZGRyZXNzIGFmdGVyIEZMT0dJLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKKwlpZiAoZm5pYy0+c3RhdGUgIT0gRk5JQ19JTl9GQ19NT0RFICYmIGZuaWMtPnN0YXRlICE9IEZOSUNfSU5fRVRIX01PREUpIHsKKwkJc2tiX3F1ZXVlX3RhaWwoJmZuaWMtPnR4X3F1ZXVlLCBmcF9za2IoZnApKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKIAotCS8qIEZsb2dpIGZyYW1lLCBub3cgZW50ZXIgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKwlyZXR1cm4gZm5pY19zZW5kX2ZyYW1lKGZuaWMsIGZwKTsKK30KKworLyoqCisgKiBmbmljX2ZsdXNoX3R4KCkgLSBzZW5kIHF1ZXVlZCBmcmFtZXMuCisgKiBAZm5pYzogZm5pYyBkZXZpY2UKKyAqCisgKiBTZW5kIGZyYW1lcyB0aGF0IHdlcmUgd2FpdGluZyB0byBnbyBvdXQgaW4gRkMgb3IgRXRoZXJuZXQgbW9kZS4KKyAqIFdoZW5ldmVyIGNoYW5naW5nIG1vZGVzIHdlIHB1cmdlIHF1ZXVlZCBmcmFtZXMsIHNvIHRoZXNlIGZyYW1lcyBzaG91bGQKKyAqIGJlIHF1ZXVlZCBmb3IgdGhlIHN0YWJsZSBtb2RlIHRoYXQgd2UncmUgaW4sIGVpdGhlciBGQyBvciBFdGhlcm5ldC4KKyAqCisgKiBDYWxsZWQgd2l0aG91dCBmbmljX2xvY2sgaGVsZC4KKyAqLwordm9pZCBmbmljX2ZsdXNoX3R4KHN0cnVjdCBmbmljICpmbmljKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmZuaWMtPmZyYW1lX3F1ZXVlKSkpIHsKKwkJZnAgPSAoc3RydWN0IGZjX2ZyYW1lICopc2tiOworCQlmbmljX3NlbmRfZnJhbWUoZm5pYywgZnApOworCX0KK30KKworLyoqCisgKiBmbmljX3NldF9ldGhfbW9kZSgpIC0gcHV0IGZuaWMgaW50byBldGhlcm5ldCBtb2RlLgorICogQGZuaWM6IGZuaWMgZGV2aWNlCisgKgorICogQ2FsbGVkIHdpdGhvdXQgZm5pYyBsb2NrIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGZuaWNfc2V0X2V0aF9tb2RlKHN0cnVjdCBmbmljICpmbmljKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW51bSBmbmljX3N0YXRlIG9sZF9zdGF0ZTsKKwlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogYWdhaW46Ci0JLyogR2V0IGFueSBvbGQgY2FjaGVkIGZyYW1lcywgZnJlZSB0aGVtIGFmdGVyIGRyb3BwaW5nIGxvY2sgKi8KLQlvbGRfZmxvZ2kgPSBmbmljLT5mbG9naTsKLQlmbmljLT5mbG9naSA9IE5VTEw7Ci0Jb2xkX2Zsb2dpX3Jlc3AgPSBmbmljLT5mbG9naV9yZXNwOwotCWZuaWMtPmZsb2dpX3Jlc3AgPSBOVUxMOwotCi0JZm5pYy0+ZmxvZ2lfb3hpZCA9IEZDX1hJRF9VTktOT1dOOwotCiAJb2xkX3N0YXRlID0gZm5pYy0+c3RhdGU7CiAJc3dpdGNoIChvbGRfc3RhdGUpIHsKIAljYXNlIEZOSUNfSU5fRkNfTU9ERToKIAljYXNlIEZOSUNfSU5fRVRIX1RSQU5TX0ZDX01PREU6CiAJZGVmYXVsdDoKIAkJZm5pYy0+c3RhdGUgPSBGTklDX0lOX0ZDX1RSQU5TX0VUSF9NT0RFOwotCQl2bmljX2Rldl9kZWxfYWRkcihmbmljLT52ZGV2LCBmbmljLT5kYXRhX3NyY19hZGRyKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAKLQkJaWYgKG9sZF9mbG9naSkgewotCQkJZGV2X2tmcmVlX3NrYihmcF9za2Iob2xkX2Zsb2dpKSk7Ci0JCQlvbGRfZmxvZ2kgPSBOVUxMOwotCQl9Ci0JCWlmIChvbGRfZmxvZ2lfcmVzcCkgewotCQkJZGV2X2tmcmVlX3NrYihmcF9za2Iob2xkX2Zsb2dpX3Jlc3ApKTsKLQkJCW9sZF9mbG9naV9yZXNwID0gTlVMTDsKLQkJfQotCiAJCXJldCA9IGZuaWNfZndfcmVzZXRfaGFuZGxlcihmbmljKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAJCWlmIChmbmljLT5zdGF0ZSAhPSBGTklDX0lOX0ZDX1RSQU5TX0VUSF9NT0RFKQogCQkJZ290byBhZ2FpbjsKLQkJaWYgKHJldCkgeworCQlpZiAocmV0KQogCQkJZm5pYy0+c3RhdGUgPSBvbGRfc3RhdGU7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKLQkJCWRldl9rZnJlZV9za2IoZnBfc2tiKGZwKSk7Ci0JCQlnb3RvIGZuaWNfc2VuZF9lbmQ7Ci0JCX0KLQkJb2xkX2Zsb2dpID0gZm5pYy0+ZmxvZ2k7Ci0JCWZuaWMtPmZsb2dpID0gZnA7Ci0JCWZuaWMtPmZsb2dpX294aWQgPSBudG9ocyhmaC0+Zmhfb3hfaWQpOwotCQlvbGRfZmxvZ2lfcmVzcCA9IGZuaWMtPmZsb2dpX3Jlc3A7Ci0JCWZuaWMtPmZsb2dpX3Jlc3AgPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIEZOSUNfSU5fRkNfVFJBTlNfRVRIX01PREU6Ci0JCS8qCi0JCSAqIEEgcmVzZXQgaXMgcGVuZGluZyB3aXRoIHRoZSBmaXJtd2FyZS4gU3RvcmUgdGhlIGZsb2dpCi0JCSAqIGFuZCBpdHMgb3hpZC4gVGhlIHRyYW5zaXRpb24gb3V0IG9mIHRoaXMgc3RhdGUgaGFwcGVucwotCQkgKiBvbmx5IHdoZW4gRmlybXdhcmUgY29tcGxldGVzIHRoZSByZXNldCwgZWl0aGVyIHdpdGgKLQkJICogc3VjY2VzcyBvciBmYWlsZWQuIElmIHN1Y2Nlc3MsIHRyYW5zaXRpb24gdG8KLQkJICogRk5JQ19JTl9FVEhfTU9ERSwgaWYgZmFpbCwgdGhlbiB0cmFuc2l0aW9uIHRvCi0JCSAqIEZOSUNfSU5fRkNfTU9ERQotCQkgKi8KLQkJZm5pYy0+ZmxvZ2kgPSBmcDsKLQkJZm5pYy0+ZmxvZ2lfb3hpZCA9IG50b2hzKGZoLT5maF9veF9pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQogCWNhc2UgRk5JQ19JTl9FVEhfTU9ERToKLQkJLyoKLQkJICogVGhlIGZ3L2h3IGlzIGFscmVhZHkgaW4gZXRoIG1vZGUuIFN0b3JlIHRoZSBveGlkLAotCQkgKiBhbmQgc2VuZCB0aGUgZmxvZ2kgZnJhbWUgb3V0LiBUaGUgdHJhbnNpdGlvbiBvdXQgb2YgdGhpcwotCQkgKiBzdGF0ZSBoYXBwZW5zIG9ubHkgd2UgcmVjZWl2ZSBmbG9naSByZXNwb25zZSBmcm9tIHRoZQotCQkgKiBuZXR3b3JrLCBhbmQgdGhlIG94aWQgbWF0Y2hlcyB0aGUgY2FjaGVkIG94aWQgd2hlbiB0aGUKLQkJICogZmxvZ2kgZnJhbWUgd2FzIHNlbnQgb3V0LiBJZiB0aGV5IG1hdGNoLCB0aGVuIHdlIGlzc3VlCi0JCSAqIGEgZmxvZ2lfcmVnIHJlcXVlc3QgYW5kIHRyYW5zaXRpb24gdG8gc3RhdGUKLQkJICogRk5JQ19JTl9FVEhfVFJBTlNfRkNfTU9ERQotCQkgKi8KLQkJZm5pYy0+ZmxvZ2lfb3hpZCA9IG50b2hzKGZoLT5maF9veF9pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwotCQlyZXQgPSBmbmljX3NlbmRfZnJhbWUoZm5pYywgZnApOwogCQlicmVhazsKIAl9Ci0KLWZuaWNfc2VuZF9lbmQ6Ci0JaWYgKG9sZF9mbG9naSkKLQkJZGV2X2tmcmVlX3NrYihmcF9za2Iob2xkX2Zsb2dpKSk7Ci0JaWYgKG9sZF9mbG9naV9yZXNwKQotCQlkZXZfa2ZyZWVfc2tiKGZwX3NrYihvbGRfZmxvZ2lfcmVzcCkpOwotCXJldHVybiByZXQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGZuaWNfd3FfY29tcGxldGVfZnJhbWVfc2VuZChzdHJ1Y3Qgdm5pY193cSAqd3EsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX2lzci5jIGIvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19pc3IuYwppbmRleCAyYjMwNjQ4Li41YzFmMjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfaXNyLmMKQEAgLTQ4LDkgKzQ4LDkgQEAKIAl9CiAKIAlpZiAocGJhICYgKDEgPDwgRk5JQ19JTlRYX1dRX1JRX0NPUFlXUSkpIHsKLQkJd29ya19kb25lICs9IGZuaWNfd3FfY29weV9jbXBsX2hhbmRsZXIoZm5pYywgOCk7Ci0JCXdvcmtfZG9uZSArPSBmbmljX3dxX2NtcGxfaGFuZGxlcihmbmljLCA0KTsKLQkJd29ya19kb25lICs9IGZuaWNfcnFfY21wbF9oYW5kbGVyKGZuaWMsIDQpOworCQl3b3JrX2RvbmUgKz0gZm5pY193cV9jb3B5X2NtcGxfaGFuZGxlcihmbmljLCAtMSk7CisJCXdvcmtfZG9uZSArPSBmbmljX3dxX2NtcGxfaGFuZGxlcihmbmljLCAtMSk7CisJCXdvcmtfZG9uZSArPSBmbmljX3JxX2NtcGxfaGFuZGxlcihmbmljLCAtMSk7CiAKIAkJdm5pY19pbnRyX3JldHVybl9jcmVkaXRzKCZmbmljLT5pbnRyW0ZOSUNfSU5UWF9XUV9SUV9DT1BZV1FdLAogCQkJCQkgd29ya19kb25lLApAQCAtNjYsOSArNjYsOSBAQAogCXN0cnVjdCBmbmljICpmbmljID0gZGF0YTsKIAl1bnNpZ25lZCBsb25nIHdvcmtfZG9uZSA9IDA7CiAKLQl3b3JrX2RvbmUgKz0gZm5pY193cV9jb3B5X2NtcGxfaGFuZGxlcihmbmljLCA4KTsKLQl3b3JrX2RvbmUgKz0gZm5pY193cV9jbXBsX2hhbmRsZXIoZm5pYywgNCk7Ci0Jd29ya19kb25lICs9IGZuaWNfcnFfY21wbF9oYW5kbGVyKGZuaWMsIDQpOworCXdvcmtfZG9uZSArPSBmbmljX3dxX2NvcHlfY21wbF9oYW5kbGVyKGZuaWMsIC0xKTsKKwl3b3JrX2RvbmUgKz0gZm5pY193cV9jbXBsX2hhbmRsZXIoZm5pYywgLTEpOworCXdvcmtfZG9uZSArPSBmbmljX3JxX2NtcGxfaGFuZGxlcihmbmljLCAtMSk7CiAKIAl2bmljX2ludHJfcmV0dXJuX2NyZWRpdHMoJmZuaWMtPmludHJbMF0sCiAJCQkJIHdvcmtfZG9uZSwKQEAgLTgzLDcgKzgzLDcgQEAKIAlzdHJ1Y3QgZm5pYyAqZm5pYyA9IGRhdGE7CiAJdW5zaWduZWQgbG9uZyBycV93b3JrX2RvbmUgPSAwOwogCi0JcnFfd29ya19kb25lID0gZm5pY19ycV9jbXBsX2hhbmRsZXIoZm5pYywgNCk7CisJcnFfd29ya19kb25lID0gZm5pY19ycV9jbXBsX2hhbmRsZXIoZm5pYywgLTEpOwogCXZuaWNfaW50cl9yZXR1cm5fY3JlZGl0cygmZm5pYy0+aW50cltGTklDX01TSVhfUlFdLAogCQkJCSBycV93b3JrX2RvbmUsCiAJCQkJIDEgLyogdW5tYXNrIGludHIgKi8sCkBAIC05Nyw3ICs5Nyw3IEBACiAJc3RydWN0IGZuaWMgKmZuaWMgPSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgd3Ffd29ya19kb25lID0gMDsKIAotCXdxX3dvcmtfZG9uZSA9IGZuaWNfd3FfY21wbF9oYW5kbGVyKGZuaWMsIDQpOworCXdxX3dvcmtfZG9uZSA9IGZuaWNfd3FfY21wbF9oYW5kbGVyKGZuaWMsIC0xKTsKIAl2bmljX2ludHJfcmV0dXJuX2NyZWRpdHMoJmZuaWMtPmludHJbRk5JQ19NU0lYX1dRXSwKIAkJCQkgd3Ffd29ya19kb25lLAogCQkJCSAxIC8qIHVubWFzayBpbnRyICovLApAQCAtMTEwLDcgKzExMCw3IEBACiAJc3RydWN0IGZuaWMgKmZuaWMgPSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgd3FfY29weV93b3JrX2RvbmUgPSAwOwogCi0Jd3FfY29weV93b3JrX2RvbmUgPSBmbmljX3dxX2NvcHlfY21wbF9oYW5kbGVyKGZuaWMsIDgpOworCXdxX2NvcHlfd29ya19kb25lID0gZm5pY193cV9jb3B5X2NtcGxfaGFuZGxlcihmbmljLCAtMSk7CiAJdm5pY19pbnRyX3JldHVybl9jcmVkaXRzKCZmbmljLT5pbnRyW0ZOSUNfTVNJWF9XUV9DT1BZXSwKIAkJCQkgd3FfY29weV93b3JrX2RvbmUsCiAJCQkJIDEgLyogdW5tYXNrIGludHIgKi8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX21haW4uYyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfbWFpbi5jCmluZGV4IDcxYzdiYmUuLmZlMWIxMDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX21haW4uYworKysgYi9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX21haW4uYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZpcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KQEAgLTY4LDYgKzcwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBsaWJmY19mdW5jdGlvbl90ZW1wbGF0ZSBmbmljX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHsKIAkuZnJhbWVfc2VuZCA9IGZuaWNfc2VuZCwKKwkubHBvcnRfc2V0X3BvcnRfaWQgPSBmbmljX3NldF9wb3J0X2lkLAogCS5mY3BfYWJvcnRfaW8gPSBmbmljX2VtcHR5X3Njc2lfY2xlYW51cCwKIAkuZmNwX2NsZWFudXAgPSBmbmljX2VtcHR5X3Njc2lfY2xlYW51cCwKIAkuZXhjaF9tZ3JfcmVzZXQgPSBmbmljX2V4Y2hfbWdyX3Jlc2V0CkBAIC0xNDAsNiArMTQzLDcgQEAKIAkuZ2V0X2ZjX2hvc3Rfc3RhdHMgPSBmbmljX2dldF9zdGF0cywKIAkuZGRfZmNycG9ydF9zaXplID0gc2l6ZW9mKHN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2KSwKIAkudGVybWluYXRlX3Jwb3J0X2lvID0gZm5pY190ZXJtaW5hdGVfcnBvcnRfaW8sCisJLmJzZ19yZXF1ZXN0ID0gZmNfbHBvcnRfYnNnX3JlcXVlc3QsCiB9OwogCiBzdGF0aWMgdm9pZCBmbmljX2dldF9ob3N0X3NwZWVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQpAQCAtMzI0LDkgKzMyOCw2IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBmY19mcmFtZSAqZmxvZ2kgPSBOVUxMOwotCXN0cnVjdCBmY19mcmFtZSAqZmxvZ2lfcmVzcCA9IE5VTEw7CiAKIAl2bmljX2Rldl9kaXNhYmxlKGZuaWMtPnZkZXYpOwogCWZvciAoaSA9IDA7IGkgPCBmbmljLT5pbnRyX2NvdW50OyBpKyspCkBAIC0zNjcsMjQgKzM2OCw2IEBACiAJZm9yIChpID0gMDsgaSA8IGZuaWMtPmludHJfY291bnQ7IGkrKykKIAkJdm5pY19pbnRyX2NsZWFuKCZmbmljLT5pbnRyW2ldKTsKIAotCS8qCi0JICogUmVtb3ZlIGNhY2hlZCBmbG9naSBhbmQgZmxvZ2kgcmVzcCBmcmFtZXMgaWYgYW55Ci0JICogVGhlc2UgZnJhbWVzIGFyZSBub3QgaW4gYW55IHF1ZXVlLCBhbmQgdGhlcmVmb3JlIHF1ZXVlCi0JICogY2xlYW51cCBkb2VzIG5vdCBjbGVhbiB0aGVtLiBTbyBjbGVhbiB0aGVtIGV4cGxpY2l0bHkKLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7Ci0JZmxvZ2kgPSBmbmljLT5mbG9naTsKLQlmbmljLT5mbG9naSA9IE5VTEw7Ci0JZmxvZ2lfcmVzcCA9IGZuaWMtPmZsb2dpX3Jlc3A7Ci0JZm5pYy0+ZmxvZ2lfcmVzcCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZmxvZ2kpCi0JCWRldl9rZnJlZV9za2IoZnBfc2tiKGZsb2dpKSk7Ci0KLQlpZiAoZmxvZ2lfcmVzcCkKLQkJZGV2X2tmcmVlX3NrYihmcF9za2IoZmxvZ2lfcmVzcCkpOwotCiAJbWVtcG9vbF9kZXN0cm95KGZuaWMtPmlvX3JlcV9wb29sKTsKIAlmb3IgKGkgPSAwOyBpIDwgRk5JQ19TR0xfTlVNX0NBQ0hFUzsgaSsrKQogCQltZW1wb29sX2Rlc3Ryb3koZm5pYy0+aW9fc2dsX3Bvb2xbaV0pOwpAQCAtNDA5LDYgKzM5MiwxNyBAQAogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKG1lbSwgZ2ZwX21hc2sgfCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CiB9CiAKKy8qKgorICogZm5pY19nZXRfbWFjKCkgLSBnZXQgYXNzaWduZWQgZGF0YSBNQUMgYWRkcmVzcyBmb3IgRklQIGNvZGUuCisgKiBAbHBvcnQ6IAlsb2NhbCBwb3J0LgorICovCitzdGF0aWMgdTggKmZuaWNfZ2V0X21hYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXN0cnVjdCBmbmljICpmbmljID0gbHBvcnRfcHJpdihscG9ydCk7CisKKwlyZXR1cm4gZm5pYy0+ZGF0YV9zcmNfYWRkcjsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgZm5pY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtNDI0LDE3ICs0MTgsMTYgQEAKIAkgKiBBbGxvY2F0ZSBTQ1NJIEhvc3QgYW5kIHNldCB1cCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGhvc3QsCiAJICogbG9jYWwgcG9ydCwgYW5kIGZuaWMKIAkgKi8KLQlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZmbmljX2hvc3RfdGVtcGxhdGUsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmY19scG9ydCkgKyBzaXplb2Yoc3RydWN0IGZuaWMpKTsKLQlpZiAoIWhvc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jIFNDU0kgaG9zdFxuIik7CisJbHAgPSBsaWJmY19ob3N0X2FsbG9jKCZmbmljX2hvc3RfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgZm5pYykpOworCWlmICghbHApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jIGxpYmZjIGxvY2FsIHBvcnRcbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXQ7CiAJfQotCWxwID0gc2hvc3RfcHJpdihob3N0KTsKLQlscC0+aG9zdCA9IGhvc3Q7CisJaG9zdCA9IGxwLT5ob3N0OwogCWZuaWMgPSBscG9ydF9wcml2KGxwKTsKIAlmbmljLT5scG9ydCA9IGxwOworCWZuaWMtPmN0bHIubHAgPSBscDsKIAogCXNucHJpbnRmKGZuaWMtPm5hbWUsIHNpemVvZihmbmljLT5uYW1lKSAtIDEsICIlcyVkIiwgRFJWX05BTUUsCiAJCSBob3N0LT5ob3N0X25vKTsKQEAgLTU0MywxMiArNTM2LDE0IEBACiAJCWdvdG8gZXJyX291dF9kZXZfY2xvc2U7CiAJfQogCi0JZXJyID0gdm5pY19kZXZfbWFjX2FkZHIoZm5pYy0+dmRldiwgZm5pYy0+bWFjX2FkZHIpOworCWVyciA9IHZuaWNfZGV2X21hY19hZGRyKGZuaWMtPnZkZXYsIGZuaWMtPmN0bHIuY3RsX3NyY19hZGRyKTsKIAlpZiAoZXJyKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgZm5pYy0+bHBvcnQtPmhvc3QsCiAJCQkgICAgICJ2TklDIGdldCBNQUMgYWRkciBmYWlsZWQgXG4iKTsKIAkJZ290byBlcnJfb3V0X2Rldl9jbG9zZTsKIAl9CisJLyogc2V0IGRhdGFfc3JjIGZvciBwb2ludC10by1wb2ludCBtb2RlIGFuZCB0byBrZWVwIGl0IG5vbi16ZXJvICovCisJbWVtY3B5KGZuaWMtPmRhdGFfc3JjX2FkZHIsIGZuaWMtPmN0bHIuY3RsX3NyY19hZGRyLCBFVEhfQUxFTik7CiAKIAkvKiBHZXQgdk5JQyBjb25maWd1cmF0aW9uICovCiAJZXJyID0gZm5pY19nZXRfdm5pY19jb25maWcoZm5pYyk7CkBAIC01NjAsNiArNTU1LDcgQEAKIAl9CiAJaG9zdC0+bWF4X2x1biA9IGZuaWMtPmNvbmZpZy5sdW5zX3Blcl90Z3Q7CiAJaG9zdC0+bWF4X2lkID0gRk5JQ19NQVhfRkNQX1RBUkdFVDsKKwlob3N0LT5tYXhfY21kX2xlbiA9IEZOSUNfTUFYX0NNRF9MRU47CiAKIAlmbmljX2dldF9yZXNfY291bnRzKGZuaWMpOwogCkBAIC01NzEsMTkgKzU2NywxMiBAQAogCQlnb3RvIGVycl9vdXRfZGV2X2Nsb3NlOwogCX0KIAotCWVyciA9IGZuaWNfcmVxdWVzdF9pbnRyKGZuaWMpOwotCWlmIChlcnIpIHsKLQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBmbmljLT5scG9ydC0+aG9zdCwKLQkJCSAgICAgIlVuYWJsZSB0byByZXF1ZXN0IGlycS5cbiIpOwotCQlnb3RvIGVycl9vdXRfY2xlYXJfaW50cjsKLQl9Ci0KIAllcnIgPSBmbmljX2FsbG9jX3ZuaWNfcmVzb3VyY2VzKGZuaWMpOwogCWlmIChlcnIpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBmbmljLT5scG9ydC0+aG9zdCwKIAkJCSAgICAgIkZhaWxlZCB0byBhbGxvYyB2TklDIHJlc291cmNlcywgIgogCQkJICAgICAiYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfaW50cjsKKwkJZ290byBlcnJfb3V0X2NsZWFyX2ludHI7CiAJfQogCiAKQEAgLTYyMyw5ICs2MTIsMjEgQEAKIAlmbmljLT52bGFuX2h3X2luc2VydCA9IDE7CiAJZm5pYy0+dmxhbl9pZCA9IDA7CiAKLQlmbmljLT5mbG9naV9veGlkID0gRkNfWElEX1VOS05PV047Ci0JZm5pYy0+ZmxvZ2kgPSBOVUxMOwotCWZuaWMtPmZsb2dpX3Jlc3AgPSBOVUxMOworCS8qIEluaXRpYWxpemUgdGhlIEZJUCBmY29lX2N0cmwgc3RydWN0ICovCisJZm5pYy0+Y3Rsci5zZW5kID0gZm5pY19ldGhfc2VuZDsKKwlmbmljLT5jdGxyLnVwZGF0ZV9tYWMgPSBmbmljX3VwZGF0ZV9tYWM7CisJZm5pYy0+Y3Rsci5nZXRfc3JjX2FkZHIgPSBmbmljX2dldF9tYWM7CisJZmNvZV9jdGxyX2luaXQoJmZuaWMtPmN0bHIpOworCWlmIChmbmljLT5jb25maWcuZmxhZ3MgJiBWRkNGX0ZJUF9DQVBBQkxFKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIGZuaWMtPmxwb3J0LT5ob3N0LAorCQkJICAgICAiZmlybXdhcmUgc3VwcG9ydHMgRklQXG4iKTsKKwkJdm5pY19kZXZfYWRkX2FkZHIoZm5pYy0+dmRldiwgRklQX0FMTF9FTk9ERV9NQUNTKTsKKwkJdm5pY19kZXZfYWRkX2FkZHIoZm5pYy0+dmRldiwgZm5pYy0+Y3Rsci5jdGxfc3JjX2FkZHIpOworCX0gZWxzZSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIGZuaWMtPmxwb3J0LT5ob3N0LAorCQkJICAgICAiZmlybXdhcmUgdXNlcyBub24tRklQIG1vZGVcbiIpOworCQlmbmljLT5jdGxyLm1vZGUgPSBGSVBfU1RfTk9OX0ZJUDsKKwl9CiAJZm5pYy0+c3RhdGUgPSBGTklDX0lOX0ZDX01PREU7CiAKIAkvKiBFbmFibGUgaGFyZHdhcmUgc3RyaXBwaW5nIG9mIHZsYW4gaGVhZGVyIG9uIGluZ3Jlc3MgKi8KQEAgLTcxNiw2ICs3MTcsNyBAQAogCUlOSVRfV09SSygmZm5pYy0+bGlua193b3JrLCBmbmljX2hhbmRsZV9saW5rKTsKIAlJTklUX1dPUksoJmZuaWMtPmZyYW1lX3dvcmssIGZuaWNfaGFuZGxlX2ZyYW1lKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZmbmljLT5mcmFtZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZm5pYy0+dHhfcXVldWUpOwogCiAJLyogRW5hYmxlIGFsbCBxdWV1ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZm5pYy0+cmF3X3dxX2NvdW50OyBpKyspCkBAIC03MjgsNiArNzMwLDE0IEBACiAJZmNfZmFicmljX2xvZ2luKGxwKTsKIAogCXZuaWNfZGV2X2VuYWJsZShmbmljLT52ZGV2KTsKKworCWVyciA9IGZuaWNfcmVxdWVzdF9pbnRyKGZuaWMpOworCWlmIChlcnIpIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBmbmljLT5scG9ydC0+aG9zdCwKKwkJCSAgICAgIlVuYWJsZSB0byByZXF1ZXN0IGlycS5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9leGNoX21ncjsKKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgZm5pYy0+aW50cl9jb3VudDsgaSsrKQogCQl2bmljX2ludHJfdW5tYXNrKCZmbmljLT5pbnRyW2ldKTsKIApAQCAtNzM4LDggKzc0OCw4IEBACiBlcnJfb3V0X2ZyZWVfZXhjaF9tZ3I6CiAJZmNfZXhjaF9tZ3JfZnJlZShscCk7CiBlcnJfb3V0X3JlbW92ZV9zY3NpX2hvc3Q6Ci0JZmNfcmVtb3ZlX2hvc3QoZm5pYy0+bHBvcnQtPmhvc3QpOwotCXNjc2lfcmVtb3ZlX2hvc3QoZm5pYy0+bHBvcnQtPmhvc3QpOworCWZjX3JlbW92ZV9ob3N0KGxwLT5ob3N0KTsKKwlzY3NpX3JlbW92ZV9ob3N0KGxwLT5ob3N0KTsKIGVycl9vdXRfZnJlZV9ycV9idWY6CiAJZm9yIChpID0gMDsgaSA8IGZuaWMtPnJxX2NvdW50OyBpKyspCiAJCXZuaWNfcnFfY2xlYW4oJmZuaWMtPnJxW2ldLCBmbmljX2ZyZWVfcnFfYnVmKTsKQEAgLTc1Miw4ICs3NjIsNiBAQAogCW1lbXBvb2xfZGVzdHJveShmbmljLT5pb19yZXFfcG9vbCk7CiBlcnJfb3V0X2ZyZWVfcmVzb3VyY2VzOgogCWZuaWNfZnJlZV92bmljX3Jlc291cmNlcyhmbmljKTsKLWVycl9vdXRfZnJlZV9pbnRyOgotCWZuaWNfZnJlZV9pbnRyKGZuaWMpOwogZXJyX291dF9jbGVhcl9pbnRyOgogCWZuaWNfY2xlYXJfaW50cl9tb2RlKGZuaWMpOwogZXJyX291dF9kZXZfY2xvc2U6CkBAIC03NzUsNiArNzgzLDcgQEAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBmbmljX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgZm5pYyAqZm5pYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZm5pYy0+bHBvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qCkBAIC03OTYsNiArODA1LDcgQEAKIAkgKi8KIAlmbHVzaF93b3JrcXVldWUoZm5pY19ldmVudF9xdWV1ZSk7CiAJc2tiX3F1ZXVlX3B1cmdlKCZmbmljLT5mcmFtZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZmbmljLT50eF9xdWV1ZSk7CiAKIAkvKgogCSAqIExvZyBvZmYgdGhlIGZhYnJpYy4gVGhpcyBzdG9wcyBhbGwgcmVtb3RlIHBvcnRzLCBkbnMgcG9ydCwKQEAgLTgwOCw3ICs4MTgsOCBAQAogCWZuaWMtPmluX3JlbW92ZSA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAKLQlmY19scG9ydF9kZXN0cm95KGZuaWMtPmxwb3J0KTsKKwlmY29lX2N0bHJfZGVzdHJveSgmZm5pYy0+Y3Rscik7CisJZmNfbHBvcnRfZGVzdHJveShscCk7CiAKIAkvKgogCSAqIFRoaXMgc3RvcHMgdGhlIGZuaWMgZGV2aWNlLCBtYXNrcyBhbGwgaW50ZXJydXB0cy4gQ29tcGxldGVkCkBAIC04MTgsNiArODI5LDcgQEAKIAlmbmljX2NsZWFudXAoZm5pYyk7CiAKIAlCVUdfT04oIXNrYl9xdWV1ZV9lbXB0eSgmZm5pYy0+ZnJhbWVfcXVldWUpKTsKKwlCVUdfT04oIXNrYl9xdWV1ZV9lbXB0eSgmZm5pYy0+dHhfcXVldWUpKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmbmljX2xpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZmbmljLT5saXN0KTsKQEAgLTgyNyw4ICs4MzksOCBAQAogCXNjc2lfcmVtb3ZlX2hvc3QoZm5pYy0+bHBvcnQtPmhvc3QpOwogCWZjX2V4Y2hfbWdyX2ZyZWUoZm5pYy0+bHBvcnQpOwogCXZuaWNfZGV2X25vdGlmeV91bnNldChmbmljLT52ZGV2KTsKLQlmbmljX2ZyZWVfdm5pY19yZXNvdXJjZXMoZm5pYyk7CiAJZm5pY19mcmVlX2ludHIoZm5pYyk7CisJZm5pY19mcmVlX3ZuaWNfcmVzb3VyY2VzKGZuaWMpOwogCWZuaWNfY2xlYXJfaW50cl9tb2RlKGZuaWMpOwogCXZuaWNfZGV2X2Nsb3NlKGZuaWMtPnZkZXYpOwogCXZuaWNfZGV2X3VucmVnaXN0ZXIoZm5pYy0+dmRldik7CkBAIC04MzYsNyArODQ4LDcgQEAKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0Jc2NzaV9ob3N0X3B1dChmbmljLT5scG9ydC0+aG9zdCk7CisJc2NzaV9ob3N0X3B1dChscC0+aG9zdCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBmbmljX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfcmVzLmMgYi9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Jlcy5jCmluZGV4IDdiYTYxZWMuLjUwNDg4ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfcmVzLmMKKysrIGIvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19yZXMuYwpAQCAtMTQ0LDEwICsxNDQsOSBAQAogCWMtPmludHJfdGltZXJfdHlwZSA9IGMtPmludHJfdGltZXJfdHlwZTsKIAogCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIGZuaWMtPmxwb3J0LT5ob3N0LAotCQkgICAgICJ2TklDIE1BQyBhZGRyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICIKKwkJICAgICAidk5JQyBNQUMgYWRkciAlcE0gIgogCQkgICAgICJ3cS93cV9jb3B5L3JxICVkLyVkLyVkXG4iLAotCQkgICAgIGZuaWMtPm1hY19hZGRyWzBdLCBmbmljLT5tYWNfYWRkclsxXSwgZm5pYy0+bWFjX2FkZHJbMl0sCi0JCSAgICAgZm5pYy0+bWFjX2FkZHJbM10sIGZuaWMtPm1hY19hZGRyWzRdLCBmbmljLT5tYWNfYWRkcls1XSwKKwkJICAgICBmbmljLT5jdGxyLmN0bF9zcmNfYWRkciwKIAkJICAgICBjLT53cV9lbmV0X2Rlc2NfY291bnQsIGMtPndxX2NvcHlfZGVzY19jb3VudCwKIAkJICAgICBjLT5ycV9kZXNjX2NvdW50KTsKIAlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBmbmljLT5scG9ydC0+aG9zdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfcmVzLmggYi9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Jlcy5oCmluZGV4IGI2ZjMxMDIuLmVmOGFhZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfcmVzLmgKKysrIGIvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19yZXMuaApAQCAtNTEsNiArNTEsMzEgQEAKIAl2bmljX3dxX3Bvc3Qod3EsIG9zX2J1ZiwgZG1hX2FkZHIsIGxlbiwgc29wLCBlb3ApOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZm5pY19xdWV1ZV93cV9ldGhfZGVzYyhzdHJ1Y3Qgdm5pY193cSAqd3EsCisJCQkJICAgICAgdm9pZCAqb3NfYnVmLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBsZW4sCisJCQkJICAgICAgaW50IHZsYW5fdGFnX2luc2VydCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdmxhbl90YWcsCisJCQkJICAgICAgaW50IGNxX2VudHJ5KQoreworCXN0cnVjdCB3cV9lbmV0X2Rlc2MgKmRlc2MgPSB2bmljX3dxX25leHRfZGVzYyh3cSk7CisKKwl3cV9lbmV0X2Rlc2NfZW5jKGRlc2MsCisJCQkgKHU2NClkbWFfYWRkciB8IFZOSUNfUEFERFJfVEFSR0VULAorCQkJICh1MTYpbGVuLAorCQkJIDAsIC8qIG1zc19vcl9jc3VtX29mZnNldCAqLworCQkJIDAsIC8qIGZjX2VvZiAqLworCQkJIDAsIC8qIG9mZmxvYWRfbW9kZSAqLworCQkJIDEsIC8qIGVvcCAqLworCQkJICh1OCljcV9lbnRyeSwKKwkJCSAwLCAvKiBmY29lX2VuY2FwICovCisJCQkgKHU4KXZsYW5fdGFnX2luc2VydCwKKwkJCSAodTE2KXZsYW5fdGFnLAorCQkJIDAgLyogbG9vcGJhY2sgKi8pOworCisJdm5pY193cV9wb3N0KHdxLCBvc19idWYsIGRtYV9hZGRyLCBsZW4sIDEsIDEpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZm5pY19xdWV1ZV93cV9jb3B5X2Rlc2NfaWNtbmRfMTYoc3RydWN0IHZuaWNfd3FfY29weSAqd3EsCiAJCQkJCQkgICAgdTMyIHJlcV9pZCwKIAkJCQkJCSAgICB1MzIgbHVubWFwX2lkLCB1OCBzcGxfZmxhZ3MsCkBAIC01OCw2ICs4Myw3IEBACiAJCQkJCQkgICAgdTY0IHNnbF9hZGRyLCB1NjQgc25zX2FkZHIsCiAJCQkJCQkgICAgdTggY3JuLCB1OCBwcmlfdGEsCiAJCQkJCQkgICAgdTggZmxhZ3MsIHU4ICpzY3NpX2NkYiwKKwkJCQkJCSAgICB1OCBjZGJfbGVuLAogCQkJCQkJICAgIHUzMiBkYXRhX2xlbiwgdTggKmx1biwKIAkJCQkJCSAgICB1MzIgZF9pZCwgdTE2IG1zcywKIAkJCQkJCSAgICB1MzIgcmF0b3YsIHUzMiBlZHRvdikKQEAgLTgyLDcgKzEwOCw4IEBACiAJZGVzYy0+dS5pY21uZF8xNi5wcmlfdGEgPSBwcmlfdGE7IAkvKiBTQ1NJIFByaSAmIFRhc2sgYXR0cmlidXRlICovCiAJZGVzYy0+dS5pY21uZF8xNi5fcmVzdmQxID0gMDsgICAgICAgICAgIC8qIHJlc2VydmVkOiBzaG91bGQgYmUgMCAqLwogCWRlc2MtPnUuaWNtbmRfMTYuZmxhZ3MgPSBmbGFnczsgICAgICAgICAvKiBjb21tYW5kIGZsYWdzICovCi0JbWVtY3B5KGRlc2MtPnUuaWNtbmRfMTYuc2NzaV9jZGIsIHNjc2lfY2RiLCBDREJfMTYpOyAgICAvKiBTQ1NJIENEQiAqLworCW1lbXNldChkZXNjLT51LmljbW5kXzE2LnNjc2lfY2RiLCAwLCBDREJfMTYpOworCW1lbWNweShkZXNjLT51LmljbW5kXzE2LnNjc2lfY2RiLCBzY3NpX2NkYiwgY2RiX2xlbik7ICAgIC8qIFNDU0kgQ0RCICovCiAJZGVzYy0+dS5pY21uZF8xNi5kYXRhX2xlbiA9IGRhdGFfbGVuOyAgIC8qIGxlbmd0aCBvZiBkYXRhIGV4cGVjdGVkICovCiAJbWVtY3B5KGRlc2MtPnUuaWNtbmRfMTYubHVuLCBsdW4sIExVTl9BRERSRVNTKTsgIC8qIExVTiBhZGRyZXNzICovCiAJZGVzYy0+dS5pY21uZF8xNi5fcmVzdmQyID0gMDsgICAgICAgICAgCS8qIHJlc2VydmVkICovCkBAIC0xMzIsMTIgKzE1OSwzNyBAQAogCWRlc2MtPmhkci50YWcudS5yZXFfaWQgPSByZXFfaWQ7ICAgICAgLyogaWQgZm9yIHRoaXMgcmVxdWVzdCAqLwogCiAJZGVzYy0+dS5mbG9naV9yZWcuZm9ybWF0ID0gZm9ybWF0OworCWRlc2MtPnUuZmxvZ2lfcmVnLl9yZXN2ZCA9IDA7CiAJaHRvbjI0KGRlc2MtPnUuZmxvZ2lfcmVnLnNfaWQsIHNfaWQpOwogCW1lbWNweShkZXNjLT51LmZsb2dpX3JlZy5nYXRld2F5X21hYywgZ3dfbWFjLCBFVEhfQUxFTik7CiAKIAl2bmljX3dxX2NvcHlfcG9zdCh3cSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbmljX3F1ZXVlX3dxX2NvcHlfZGVzY19maXBfcmVnKHN0cnVjdCB2bmljX3dxX2NvcHkgKndxLAorCQkJCQkJICAgdTMyIHJlcV9pZCwgdTMyIHNfaWQsCisJCQkJCQkgICB1OCAqZmNmX21hYywgdTggKmhhX21hYywKKwkJCQkJCSAgIHUzMiByX2FfdG92LCB1MzIgZV9kX3RvdikKK3sKKwlzdHJ1Y3QgZmNwaW9faG9zdF9yZXEgKmRlc2MgPSB2bmljX3dxX2NvcHlfbmV4dF9kZXNjKHdxKTsKKworCWRlc2MtPmhkci50eXBlID0gRkNQSU9fRkxPR0lfRklQX1JFRzsgLyogZW51bSBmY3Bpb190eXBlICovCisJZGVzYy0+aGRyLnN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgc3RhdHVzIGVudHJ5ICovCisJZGVzYy0+aGRyLl9yZXN2ZCA9IDA7ICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCWRlc2MtPmhkci50YWcudS5yZXFfaWQgPSByZXFfaWQ7ICAgICAgLyogaWQgZm9yIHRoaXMgcmVxdWVzdCAqLworCisJZGVzYy0+dS5mbG9naV9maXBfcmVnLl9yZXN2ZDAgPSAwOworCWh0b24yNChkZXNjLT51LmZsb2dpX2ZpcF9yZWcuc19pZCwgc19pZCk7CisJbWVtY3B5KGRlc2MtPnUuZmxvZ2lfZmlwX3JlZy5mY2ZfbWFjLCBmY2ZfbWFjLCBFVEhfQUxFTik7CisJZGVzYy0+dS5mbG9naV9maXBfcmVnLl9yZXN2ZDEgPSAwOworCWRlc2MtPnUuZmxvZ2lfZmlwX3JlZy5yX2FfdG92ID0gcl9hX3RvdjsKKwlkZXNjLT51LmZsb2dpX2ZpcF9yZWcuZV9kX3RvdiA9IGVfZF90b3Y7CisJbWVtY3B5KGRlc2MtPnUuZmxvZ2lfZmlwX3JlZy5oYV9tYWMsIGhhX21hYywgRVRIX0FMRU4pOworCWRlc2MtPnUuZmxvZ2lfZmlwX3JlZy5fcmVzdmQyID0gMDsKKworCXZuaWNfd3FfY29weV9wb3N0KHdxKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGZuaWNfcXVldWVfd3FfY29weV9kZXNjX2Z3X3Jlc2V0KHN0cnVjdCB2bmljX3dxX2NvcHkgKndxLAogCQkJCQkJICAgIHUzMiByZXFfaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCmluZGV4IGJmYzk5NjkuLjY1YTM5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCkBAIC0xNzQsNiArMTc0LDkgQEAKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc2tiX3F1ZXVlX3B1cmdlKCZmbmljLT5mcmFtZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZmbmljLT50eF9xdWV1ZSk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZm5pYy0+d3FfY29weV9sb2NrWzBdLCBmbGFncyk7CiAKIAlpZiAodm5pY193cV9jb3B5X2Rlc2NfYXZhaWwod3EpIDw9IGZuaWMtPndxX2NvcHlfZGVzY19sb3dbMF0pCkBAIC0yMDAsOSArMjAzLDExIEBACiAgKiBmbmljX2Zsb2dpX3JlZ19oYW5kbGVyCiAgKiBSb3V0aW5lIHRvIHNlbmQgZmxvZ2kgcmVnaXN0ZXIgbXNnIHRvIGZ3CiAgKi8KLWludCBmbmljX2Zsb2dpX3JlZ19oYW5kbGVyKHN0cnVjdCBmbmljICpmbmljKQoraW50IGZuaWNfZmxvZ2lfcmVnX2hhbmRsZXIoc3RydWN0IGZuaWMgKmZuaWMsIHUzMiBmY19pZCkKIHsKIAlzdHJ1Y3Qgdm5pY193cV9jb3B5ICp3cSA9ICZmbmljLT53cV9jb3B5WzBdOworCWVudW0gZmNwaW9fZmxvZ2lfcmVnX2Zvcm1hdF90eXBlIGZvcm1hdDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZm5pYy0+bHBvcnQ7CiAJdTggZ3dfbWFjW0VUSF9BTEVOXTsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjE3LDIzICsyMjIsMzIgQEAKIAkJZ290byBmbG9naV9yZWdfaW9yZXFfZW5kOwogCX0KIAotCWlmIChmbmljLT5mY291aV9tb2RlKQorCWlmIChmbmljLT5jdGxyLm1hcF9kZXN0KSB7CiAJCW1lbXNldChnd19tYWMsIDB4ZmYsIEVUSF9BTEVOKTsKLQllbHNlCi0JCW1lbWNweShnd19tYWMsIGZuaWMtPmRlc3RfYWRkciwgRVRIX0FMRU4pOworCQlmb3JtYXQgPSBGQ1BJT19GTE9HSV9SRUdfREVGX0RFU1Q7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGd3X21hYywgZm5pYy0+Y3Rsci5kZXN0X2FkZHIsIEVUSF9BTEVOKTsKKwkJZm9ybWF0ID0gRkNQSU9fRkxPR0lfUkVHX0dXX0RFU1Q7CisJfQogCi0JZm5pY19xdWV1ZV93cV9jb3B5X2Rlc2NfZmxvZ2lfcmVnKHdxLCBTQ1NJX05PX1RBRywKLQkJCQkJICBGQ1BJT19GTE9HSV9SRUdfR1dfREVTVCwKLQkJCQkJICBmbmljLT5zX2lkLAotCQkJCQkgIGd3X21hYyk7CisJaWYgKChmbmljLT5jb25maWcuZmxhZ3MgJiBWRkNGX0ZJUF9DQVBBQkxFKSAmJiAhZm5pYy0+Y3Rsci5tYXBfZGVzdCkgeworCQlmbmljX3F1ZXVlX3dxX2NvcHlfZGVzY19maXBfcmVnKHdxLCBTQ1NJX05PX1RBRywKKwkJCQkJCWZjX2lkLCBnd19tYWMsCisJCQkJCQlmbmljLT5kYXRhX3NyY19hZGRyLAorCQkJCQkJbHAtPnJfYV90b3YsIGxwLT5lX2RfdG92KTsKKwkJRk5JQ19TQ1NJX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwKKwkJCSAgICAgICJGTE9HSSBGSVAgcmVnIGlzc3VlZCBmY2lkICV4IHNyYyAlcE0gZGVzdCAlcE1cbiIsCisJCQkgICAgICBmY19pZCwgZm5pYy0+ZGF0YV9zcmNfYWRkciwgZ3dfbWFjKTsKKwl9IGVsc2UgeworCQlmbmljX3F1ZXVlX3dxX2NvcHlfZGVzY19mbG9naV9yZWcod3EsIFNDU0lfTk9fVEFHLAorCQkJCQkJICBmb3JtYXQsIGZjX2lkLCBnd19tYWMpOworCQlGTklDX1NDU0lfREJHKEtFUk5fREVCVUcsIGZuaWMtPmxwb3J0LT5ob3N0LAorCQkJICAgICAgIkZMT0dJIHJlZyBpc3N1ZWQgZmNpZCAleCBtYXAgJWQgZGVzdCAlcE1cbiIsCisJCQkgICAgICBmY19pZCwgZm5pYy0+Y3Rsci5tYXBfZGVzdCwgZ3dfbWFjKTsKKwl9CiAKIGZsb2dpX3JlZ19pb3JlcV9lbmQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+d3FfY29weV9sb2NrWzBdLCBmbGFncyk7Ci0KLQlpZiAoIXJldCkKLQkJRk5JQ19TQ1NJX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwKLQkJCSAgICAgICJmbG9nIHJlZyBpc3N1ZWRcbiIpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzE5LDcgKzMzMyw4IEBACiAJCQkJCSAwLCAvKiBzY3NpIGNtZCByZWYsIGFsd2F5cyAwICovCiAJCQkJCSBwcmlfdGFnLCAvKiBzY3NpIHByaSBhbmQgdGFnICovCiAJCQkJCSBmbGFncywJLyogY29tbWFuZCBmbGFncyAqLwotCQkJCQkgc2MtPmNtbmQsIHNjc2lfYnVmZmxlbihzYyksCisJCQkJCSBzYy0+Y21uZCwgc2MtPmNtZF9sZW4sCisJCQkJCSBzY3NpX2J1ZmZsZW4oc2MpLAogCQkJCQkgZmNfbHVuLnNjc2lfbHVuLCBpb19yZXEtPnBvcnRfaWQsCiAJCQkJCSBycG9ydC0+bWF4ZnJhbWVfc2l6ZSwgcnAtPnJfYV90b3YsCiAJCQkJCSBycC0+ZV9kX3Rvdik7CkBAIC00NTIsNyArNDY3LDYgQEAKIAl1OCBoZHJfc3RhdHVzOwogCXN0cnVjdCBmY3Bpb190YWcgdGFnOwogCWludCByZXQgPSAwOwotCXN0cnVjdCBmY19mcmFtZSAqZmxvZ2k7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWZjcGlvX2hlYWRlcl9kZWMoJmRlc2MtPmhkciwgJnR5cGUsICZoZHJfc3RhdHVzLCAmdGFnKTsKQEAgLTQ2Miw5ICs0NzYsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogCi0JZmxvZ2kgPSBmbmljLT5mbG9naTsKLQlmbmljLT5mbG9naSA9IE5VTEw7Ci0KIAkvKiBmbmljIHNob3VsZCBiZSBpbiBGQ19UUkFOU19FVEhfTU9ERSAqLwogCWlmIChmbmljLT5zdGF0ZSA9PSBGTklDX0lOX0ZDX1RSQU5TX0VUSF9NT0RFKSB7CiAJCS8qIENoZWNrIHN0YXR1cyBvZiByZXNldCBjb21wbGV0aW9uICovCkBAIC01MDUsMTcgKzUxNiwxNCBAQAogCSAqIGZyZWUgdGhlIGZsb2dpIGZyYW1lLiBFbHNlLCBzZW5kIGl0IG91dAogCSAqLwogCWlmIChmbmljLT5yZW1vdmVfd2FpdCB8fCByZXQpIHsKLQkJZm5pYy0+ZmxvZ2lfb3hpZCA9IEZDX1hJRF9VTktOT1dOOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKLQkJaWYgKGZsb2dpKQotCQkJZGV2X2tmcmVlX3NrYl9pcnEoZnBfc2tiKGZsb2dpKSk7CisJCXNrYl9xdWV1ZV9wdXJnZSgmZm5pYy0+dHhfcXVldWUpOwogCQlnb3RvIHJlc2V0X2NtcGxfaGFuZGxlcl9lbmQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAKLQlpZiAoZmxvZ2kpCi0JCXJldCA9IGZuaWNfc2VuZF9mcmFtZShmbmljLCBmbG9naSk7CisJZm5pY19mbHVzaF90eChmbmljKTsKIAogIHJlc2V0X2NtcGxfaGFuZGxlcl9lbmQ6CiAJcmV0dXJuIHJldDsKQEAgLTUzMiwxOCArNTQwLDEzIEBACiAJdTggaGRyX3N0YXR1czsKIAlzdHJ1Y3QgZmNwaW9fdGFnIHRhZzsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZmNfZnJhbWUgKmZsb2dpX3Jlc3AgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWZjcGlvX2hlYWRlcl9kZWMoJmRlc2MtPmhkciwgJnR5cGUsICZoZHJfc3RhdHVzLCAmdGFnKTsKIAogCS8qIFVwZGF0ZSBmbmljIHN0YXRlIGJhc2VkIG9uIHN0YXR1cyBvZiBmbG9naSByZWcgY29tcGxldGlvbiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKIAotCWZsb2dpX3Jlc3AgPSBmbmljLT5mbG9naV9yZXNwOwotCWZuaWMtPmZsb2dpX3Jlc3AgPSBOVUxMOwotCiAJaWYgKGZuaWMtPnN0YXRlID09IEZOSUNfSU5fRVRIX1RSQU5TX0ZDX01PREUpIHsKIAogCQkvKiBDaGVjayBmbG9naSByZWdpc3RyYXRpb24gY29tcGxldGlvbiBzdGF0dXMgKi8KQEAgLTU2NywyNSArNTcwLDE3IEBACiAJCXJldCA9IC0xOwogCX0KIAotCS8qIFN1Y2Nlc3NmdWwgZmxvZ2kgcmVnIGNtcGwsIHBhc3MgZnJhbWUgdG8gTGliRkMgKi8KLQlpZiAoIXJldCAmJiBmbG9naV9yZXNwKSB7CisJaWYgKCFyZXQpIHsKIAkJaWYgKGZuaWMtPnN0b3BfcnhfbGlua19ldmVudHMpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogCQkJZ290byByZWdfY21wbF9oYW5kbGVyX2VuZDsKIAkJfQotCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilmbG9naV9yZXNwOwotCQkvKiBVc2UgZnJfZmxhZ3MgdG8gaW5kaWNhdGUgd2hldGhlciBmbG9naSByZXNwIG9yIG5vdCAqLwotCQlmcl9mbGFncyhmbG9naV9yZXNwKSA9IDE7Ci0JCWZyX2RldihmbG9naV9yZXNwKSA9IGZuaWMtPmxwb3J0OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbmljLT5mbmljX2xvY2ssIGZsYWdzKTsKIAotCQlza2JfcXVldWVfdGFpbCgmZm5pYy0+ZnJhbWVfcXVldWUsIHNrYik7CisJCWZuaWNfZmx1c2hfdHgoZm5pYyk7CiAJCXF1ZXVlX3dvcmsoZm5pY19ldmVudF9xdWV1ZSwgJmZuaWMtPmZyYW1lX3dvcmspOwotCiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7Ci0JCWlmIChmbG9naV9yZXNwKQotCQkJZGV2X2tmcmVlX3NrYl9pcnEoZnBfc2tiKGZsb2dpX3Jlc3ApKTsKIAl9CiAKIHJlZ19jbXBsX2hhbmRsZXJfZW5kOgpAQCAtOTA3LDYgKzkwMiw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBGQ1BJT19GTE9HSV9SRUdfQ01QTDogLyogZncgY29tcGxldGVkIGZsb2dpX3JlZyAqLworCWNhc2UgRkNQSU9fRkxPR0lfRklQX1JFR19DTVBMOiAvKiBmdyBjb21wbGV0ZWQgZmxvZ2lfZmlwX3JlZyAqLwogCQlyZXQgPSBmbmljX2ZjcGlvX2Zsb2dpX3JlZ19jbXBsX2hhbmRsZXIoZm5pYywgZGVzYyk7CiAJCWJyZWFrOwogCkBAIC0xMjI0LDIyICsxMjIwLDYgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBmbmljX2Jsb2NrX2Vycm9yX2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2MpCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzYy0+ZGV2aWNlLT5ob3N0OwotCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXdoaWxlIChycG9ydC0+cG9ydF9zdGF0ZSA9PSBGQ19QT1JUU1RBVEVfQkxPQ0tFRCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJbXNsZWVwKDEwMDApOwotCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCi19Ci0KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIHRvIFNDU0kgZm9yIHNlbmRpbmcgYWJvcnQgY21uZHMuCiAgKiBBIFNDU0kgSU8gaXMgcmVwcmVzZW50ZWQgYnkgYSBpb19yZXEgaW4gdGhlIGRyaXZlci4KQEAgLTEyNTksNyArMTIzOSw3IEBACiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sodG1fZG9uZSk7CiAKIAkvKiBXYWl0IGZvciBycG9ydCB0byB1bmJsb2NrICovCi0JZm5pY19ibG9ja19lcnJvcl9oYW5kbGVyKHNjKTsKKwlmY19ibG9ja19zY3NpX2VoKHNjKTsKIAogCS8qIEdldCBsb2NhbC1wb3J0LCBjaGVjayByZWFkeSBhbmQgbGluayB1cCAqLwogCWxwID0gc2hvc3RfcHJpdihzYy0+ZGV2aWNlLT5ob3N0KTsKQEAgLTE1NDEsNyArMTUyMSw3IEBACiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sodG1fZG9uZSk7CiAKIAkvKiBXYWl0IGZvciBycG9ydCB0byB1bmJsb2NrICovCi0JZm5pY19ibG9ja19lcnJvcl9oYW5kbGVyKHNjKTsKKwlmY19ibG9ja19zY3NpX2VoKHNjKTsKIAogCS8qIEdldCBsb2NhbC1wb3J0LCBjaGVjayByZWFkeSBhbmQgbGluayB1cCAqLwogCWxwID0gc2hvc3RfcHJpdihzYy0+ZGV2aWNlLT5ob3N0KTsKQEAgLTE3NjIsNyArMTc0Miw3IEBACiAJZm5pYy0+cmVtb3ZlX3dhaXQgPSAmcmVtb3ZlX3dhaXQ7CiAJb2xkX3N0YXRlID0gZm5pYy0+c3RhdGU7CiAJZm5pYy0+c3RhdGUgPSBGTklDX0lOX0ZDX1RSQU5TX0VUSF9NT0RFOwotCXZuaWNfZGV2X2RlbF9hZGRyKGZuaWMtPnZkZXYsIGZuaWMtPmRhdGFfc3JjX2FkZHIpOworCWZuaWNfdXBkYXRlX21hY19sb2NrZWQoZm5pYywgZm5pYy0+Y3Rsci5jdGxfc3JjX2FkZHIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogCiAJZXJyID0gZm5pY19md19yZXNldF9oYW5kbGVyKGZuaWMpOwpAQCAtMTgwMiw3ICsxNzgyLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAJb2xkX3N0YXRlID0gZm5pYy0+c3RhdGU7CiAJZm5pYy0+c3RhdGUgPSBGTklDX0lOX0ZDX1RSQU5TX0VUSF9NT0RFOwotCXZuaWNfZGV2X2RlbF9hZGRyKGZuaWMtPnZkZXYsIGZuaWMtPmRhdGFfc3JjX2FkZHIpOworCWZuaWNfdXBkYXRlX21hY19sb2NrZWQoZm5pYywgZm5pYy0+Y3Rsci5jdGxfc3JjX2FkZHIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGZuaWNfZndfcmVzZXRfaGFuZGxlcihmbmljKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2ZuaWMvdm5pY19zY3NpLmggYi9kcml2ZXJzL3Njc2kvZm5pYy92bmljX3Njc2kuaAppbmRleCA0NmJhYTUyLi5mYmI1NTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZm5pYy92bmljX3Njc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvZm5pYy92bmljX3Njc2kuaApAQCAtOTUsNSArOTUsNiBAQAogCiAjZGVmaW5lIFZGQ0ZfRkNQX1NFUV9MVkxfRVJSCTB4MQkvKiBFbmFibGUgRkNQLTIgRXJyb3IgUmVjb3ZlcnkgKi8KICNkZWZpbmUgVkZDRl9QRVJCSQkJMHgyCS8qIHBlcnNpc3RlbnQgYmluZGluZyBpbmZvIGF2YWlsYWJsZSAqLworI2RlZmluZSBWRkNGX0ZJUF9DQVBBQkxFCTB4NAkvKiBmaXJtd2FyZSBjYW4gaGFuZGxlIEZJUCAqLwogCiAjZW5kaWYgLyogX1ZOSUNfU0NTSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCBjOTY4Y2MzLi41NTQ2MjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMTgwLDE0ICsxODAsMjAgQEAKIEVYUE9SVF9TWU1CT0woc2NzaV9yZW1vdmVfaG9zdCk7CiAKIC8qKgotICogc2NzaV9hZGRfaG9zdCAtIGFkZCBhIHNjc2kgaG9zdAorICogc2NzaV9hZGRfaG9zdF93aXRoX2RtYSAtIGFkZCBhIHNjc2kgaG9zdCB3aXRoIGRtYSBkZXZpY2UKICAqIEBzaG9zdDoJc2NzaSBob3N0IHBvaW50ZXIgdG8gYWRkCiAgKiBAZGV2OglhIHN0cnVjdCBkZXZpY2Ugb2YgdHlwZSBzY3NpIGNsYXNzCisgKiBAZG1hX2RldjoJZG1hIGRldmljZSBmb3IgdGhlIGhvc3QKKyAqCisgKiBOb3RlOiBZb3UgcmFyZWx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB1bmxlc3MgeW91J3JlIGluIGEKKyAqIHZpcnR1YWxpc2VkIGhvc3QgZW52aXJvbm1lbnRzLCBzbyB1c2UgdGhlIHNpbXBsZXIgc2NzaV9hZGRfaG9zdCgpCisgKiBmdW5jdGlvbiBpbnN0ZWFkLgogICoKICAqIFJldHVybiB2YWx1ZTogCiAgKiAJMCBvbiBzdWNjZXNzIC8gIT0gMCBmb3IgZXJyb3IKICAqKi8KLWludCBzY3NpX2FkZF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgc2NzaV9hZGRfaG9zdF93aXRoX2RtYShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZSAqZG1hX2RldikKIHsKIAlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSBzaG9zdC0+aG9zdHQ7CiAJaW50IGVycm9yID0gLUVJTlZBTDsKQEAgLTIwNyw2ICsyMTMsNyBAQAogCiAJaWYgKCFzaG9zdC0+c2hvc3RfZ2VuZGV2LnBhcmVudCkKIAkJc2hvc3QtPnNob3N0X2dlbmRldi5wYXJlbnQgPSBkZXYgPyBkZXYgOiAmcGxhdGZvcm1fYnVzOworCXNob3N0LT5kbWFfZGV2ID0gZG1hX2RldjsKIAogCWVycm9yID0gZGV2aWNlX2FkZCgmc2hvc3QtPnNob3N0X2dlbmRldik7CiAJaWYgKGVycm9yKQpAQCAtMjYyLDcgKzI2OSw3IEBACiAgZmFpbDoKIAlyZXR1cm4gZXJyb3I7CiB9Ci1FWFBPUlRfU1lNQk9MKHNjc2lfYWRkX2hvc3QpOworRVhQT1JUX1NZTUJPTChzY3NpX2FkZF9ob3N0X3dpdGhfZG1hKTsKIAogc3RhdGljIHZvaWQgc2NzaV9ob3N0X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHRpb3AuYyBiL2RyaXZlcnMvc2NzaS9ocHRpb3AuYwppbmRleCBhMGU3ZTcxLi40ZjA1NTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHB0aW9wLmMKKysrIGIvZHJpdmVycy9zY3NpL2hwdGlvcC5jCkBAIC04MzQsNyArODM0LDcgQEAKIAkJCWF0b21pY19yZWFkKCZoYmEtPnJlc2V0dGluZykgPT0gMCwgNjAgKiBIWik7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmhiYS0+cmVzZXR0aW5nKSkgewotCQkvKiBJT1AgaXMgaW4gdW5rb3duIHN0YXRlLCBhYm9ydCByZXNldCAqLworCQkvKiBJT1AgaXMgaW4gdW5rbm93biBzdGF0ZSwgYWJvcnQgcmVzZXQgKi8KIAkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6IHJlc2V0IGZhaWxlZFxuIiwgaGJhLT5ob3N0LT5ob3N0X25vKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTg2MSwxMCArODYxLDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgaHB0aW9wX2FkanVzdF9kaXNrX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKLQkJCQkJCWludCBxdWV1ZV9kZXB0aCkKKwkJCQkJICBpbnQgcXVldWVfZGVwdGgsIGludCByZWFzb24pCiB7CiAJc3RydWN0IGhwdGlvcF9oYmEgKmhiYSA9IChzdHJ1Y3QgaHB0aW9wX2hiYSAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhOwogCisJaWYgKHJlYXNvbiAhPSBTQ1NJX1FERVBUSF9ERUZBVUxUKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAocXVldWVfZGVwdGggPiBoYmEtPm1heF9yZXF1ZXN0cykKIAkJcXVldWVfZGVwdGggPSBoYmEtPm1heF9yZXF1ZXN0czsKIAlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfT1JERVJFRF9UQUcsIHF1ZXVlX2RlcHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYwppbmRleCBiYjJjNjk2Li44N2I1MzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2JzZ19mYy5oPgogI2luY2x1ZGUgImlibXZmYy5oIgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfdGltZW91dCA9IElCTVZGQ19JTklUX1RJTUVPVVQ7CkBAIC01NTgsMTIgKzU1OSwxMSBAQAogLyoqCiAgKiBpYm12ZmNfaW5pdF9ob3N0IC0gU3RhcnQgaG9zdCBpbml0aWFsaXphdGlvbgogICogQHZob3N0OgkJaWJtdmZjIGhvc3Qgc3RydWN0Ci0gKiBAcmVsb2dpbjoJaXMgdGhpcyBhIHJlLWxvZ2luPwogICoKICAqIFJldHVybiB2YWx1ZToKICAqCW5vdGhpbmcKICAqKi8KLXN0YXRpYyB2b2lkIGlibXZmY19pbml0X2hvc3Qoc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCwgaW50IHJlbG9naW4pCitzdGF0aWMgdm9pZCBpYm12ZmNfaW5pdF9ob3N0KHN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QpCiB7CiAJc3RydWN0IGlibXZmY190YXJnZXQgKnRndDsKIApAQCAtNTc3LDEwICs1NzcsOCBAQAogCX0KIAogCWlmICghaWJtdmZjX3NldF9ob3N0X3N0YXRlKHZob3N0LCBJQk1WRkNfSU5JVElBTElaSU5HKSkgewotCQlpZiAoIXJlbG9naW4pIHsKLQkJCW1lbXNldCh2aG9zdC0+YXN5bmNfY3JxLm1zZ3MsIDAsIFBBR0VfU0laRSk7Ci0JCQl2aG9zdC0+YXN5bmNfY3JxLmN1ciA9IDA7Ci0JCX0KKwkJbWVtc2V0KHZob3N0LT5hc3luY19jcnEubXNncywgMCwgUEFHRV9TSVpFKTsKKwkJdmhvc3QtPmFzeW5jX2NycS5jdXIgPSAwOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodGd0LCAmdmhvc3QtPnRhcmdldHMsIHF1ZXVlKQogCQkJaWJtdmZjX3NldF90Z3RfYWN0aW9uKHRndCwgSUJNVkZDX1RHVF9BQ1RJT05fREVMX1JQT1JUKTsKQEAgLTE2NzgsNiArMTY3NiwyNzYgQEAKIH0KIAogLyoqCisgKiBpYm12ZmNfYnNnX3RpbWVvdXRfZG9uZSAtIENvbXBsZXRpb24gaGFuZGxlciBmb3IgY2FuY2VsbGluZyBCU0cgY29tbWFuZHMKKyAqIEBldnQ6CXN0cnVjdCBpYm12ZmNfZXZlbnQKKyAqCisgKiovCitzdGF0aWMgdm9pZCBpYm12ZmNfYnNnX3RpbWVvdXRfZG9uZShzdHJ1Y3QgaWJtdmZjX2V2ZW50ICpldnQpCit7CisJc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCA9IGV2dC0+dmhvc3Q7CisKKwlpYm12ZmNfZnJlZV9ldmVudChldnQpOworCXZob3N0LT5hYm9ydGluZ19wYXNzdGhydSA9IDA7CisJZGV2X2luZm8odmhvc3QtPmRldiwgIlBhc3N0aHJ1IGNvbW1hbmQgY2FuY2VsbGVkXG4iKTsKK30KKworLyoqCisgKiBpYm12ZmNfYnNnX3RpbWVvdXQgLSBIYW5kbGUgYSBCU0cgdGltZW91dAorICogQGpvYjoJc3RydWN0IGZjX2JzZ19qb2IgdGhhdCB0aW1lZCBvdXQKKyAqCisgKiBSZXR1cm5zOgorICoJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpYm12ZmNfYnNnX3RpbWVvdXQoc3RydWN0IGZjX2JzZ19qb2IgKmpvYikKK3sKKwlzdHJ1Y3QgaWJtdmZjX2hvc3QgKnZob3N0ID0gc2hvc3RfcHJpdihqb2ItPnNob3N0KTsKKwl1bnNpZ25lZCBsb25nIHBvcnRfaWQgPSAodW5zaWduZWQgbG9uZylqb2ItPmRkX2RhdGE7CisJc3RydWN0IGlibXZmY19ldmVudCAqZXZ0OworCXN0cnVjdCBpYm12ZmNfdG1mICp0bWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlFTlRFUjsKKwlzcGluX2xvY2tfaXJxc2F2ZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKHZob3N0LT5hYm9ydGluZ19wYXNzdGhydSB8fCB2aG9zdC0+c3RhdGUgIT0gSUJNVkZDX0FDVElWRSkgeworCQlfX2libXZmY19yZXNldF9ob3N0KHZob3N0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXZob3N0LT5hYm9ydGluZ19wYXNzdGhydSA9IDE7CisJZXZ0ID0gaWJtdmZjX2dldF9ldmVudCh2aG9zdCk7CisJaWJtdmZjX2luaXRfZXZlbnQoZXZ0LCBpYm12ZmNfYnNnX3RpbWVvdXRfZG9uZSwgSUJNVkZDX01BRF9GT1JNQVQpOworCisJdG1mID0gJmV2dC0+aXUudG1mOworCW1lbXNldCh0bWYsIDAsIHNpemVvZigqdG1mKSk7CisJdG1mLT5jb21tb24udmVyc2lvbiA9IDE7CisJdG1mLT5jb21tb24ub3Bjb2RlID0gSUJNVkZDX1RNRl9NQUQ7CisJdG1mLT5jb21tb24ubGVuZ3RoID0gc2l6ZW9mKCp0bWYpOworCXRtZi0+c2NzaV9pZCA9IHBvcnRfaWQ7CisJdG1mLT5jYW5jZWxfa2V5ID0gSUJNVkZDX1BBU1NUSFJVX0NBTkNFTF9LRVk7CisJdG1mLT5teV9jYW5jZWxfa2V5ID0gSUJNVkZDX0lOVEVSTkFMX0NBTkNFTF9LRVk7CisJcmMgPSBpYm12ZmNfc2VuZF9ldmVudChldnQsIHZob3N0LCBkZWZhdWx0X3RpbWVvdXQpOworCisJaWYgKHJjICE9IDApIHsKKwkJdmhvc3QtPmFib3J0aW5nX3Bhc3N0aHJ1ID0gMDsKKwkJZGV2X2Vycih2aG9zdC0+ZGV2LCAiRmFpbGVkIHRvIHNlbmQgY2FuY2VsIGV2ZW50LiByYz0lZFxuIiwgcmMpOworCQlyYyA9IC1FSU87CisJfSBlbHNlCisJCWRldl9pbmZvKHZob3N0LT5kZXYsICJDYW5jZWxsaW5nIHBhc3N0aHJ1IGNvbW1hbmQgdG8gcG9ydCBpZCAweCVseFxuIiwKKwkJCSBwb3J0X2lkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJTEVBVkU7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlibXZmY19ic2dfcGxvZ2kgLSBQTE9HSSBpbnRvIGEgdGFyZ2V0IHRvIGhhbmRsZSBhIEJTRyBjb21tYW5kCisgKiBAdmhvc3Q6CQlzdHJ1Y3QgaWJtdmZjX2hvc3QgdG8gc2VuZCBjb21tYW5kCisgKiBAcG9ydF9pZDoJcG9ydCBJRCB0byBzZW5kIGNvbW1hbmQKKyAqCisgKiBSZXR1cm5zOgorICoJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpYm12ZmNfYnNnX3Bsb2dpKHN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QsIHVuc2lnbmVkIGludCBwb3J0X2lkKQoreworCXN0cnVjdCBpYm12ZmNfcG9ydF9sb2dpbiAqcGxvZ2k7CisJc3RydWN0IGlibXZmY190YXJnZXQgKnRndDsKKwlzdHJ1Y3QgaWJtdmZjX2V2ZW50ICpldnQ7CisJdW5pb24gaWJtdmZjX2l1IHJzcF9pdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDAsIGlzc3VlX2xvZ2luID0gMTsKKworCUVOVEVSOworCXNwaW5fbG9ja19pcnFzYXZlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRndCwgJnZob3N0LT50YXJnZXRzLCBxdWV1ZSkgeworCQlpZiAodGd0LT5zY3NpX2lkID09IHBvcnRfaWQpIHsKKwkJCWlzc3VlX2xvZ2luID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFpc3N1ZV9sb2dpbikKKwkJZ290byB1bmxvY2tfb3V0OworCWlmICh1bmxpa2VseSgocmMgPSBpYm12ZmNfaG9zdF9jaGtyZWFkeSh2aG9zdCkpKSkKKwkJZ290byB1bmxvY2tfb3V0OworCisJZXZ0ID0gaWJtdmZjX2dldF9ldmVudCh2aG9zdCk7CisJaWJtdmZjX2luaXRfZXZlbnQoZXZ0LCBpYm12ZmNfc3luY19jb21wbGV0aW9uLCBJQk1WRkNfTUFEX0ZPUk1BVCk7CisJcGxvZ2kgPSAmZXZ0LT5pdS5wbG9naTsKKwltZW1zZXQocGxvZ2ksIDAsIHNpemVvZigqcGxvZ2kpKTsKKwlwbG9naS0+Y29tbW9uLnZlcnNpb24gPSAxOworCXBsb2dpLT5jb21tb24ub3Bjb2RlID0gSUJNVkZDX1BPUlRfTE9HSU47CisJcGxvZ2ktPmNvbW1vbi5sZW5ndGggPSBzaXplb2YoKnBsb2dpKTsKKwlwbG9naS0+c2NzaV9pZCA9IHBvcnRfaWQ7CisJZXZ0LT5zeW5jX2l1ID0gJnJzcF9pdTsKKwlpbml0X2NvbXBsZXRpb24oJmV2dC0+Y29tcCk7CisKKwlyYyA9IGlibXZmY19zZW5kX2V2ZW50KGV2dCwgdmhvc3QsIGRlZmF1bHRfdGltZW91dCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAocmMpCisJCXJldHVybiAtRUlPOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKKworCWlmIChyc3BfaXUucGxvZ2kuY29tbW9uLnN0YXR1cykKKwkJcmMgPSAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlibXZmY19mcmVlX2V2ZW50KGV2dCk7Cit1bmxvY2tfb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCUxFQVZFOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpYm12ZmNfYnNnX3JlcXVlc3QgLSBIYW5kbGUgYSBCU0cgcmVxdWVzdAorICogQGpvYjoJc3RydWN0IGZjX2JzZ19qb2IgdG8gYmUgZXhlY3V0ZWQKKyAqCisgKiBSZXR1cm5zOgorICoJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpYm12ZmNfYnNnX3JlcXVlc3Qoc3RydWN0IGZjX2JzZ19qb2IgKmpvYikKK3sKKwlzdHJ1Y3QgaWJtdmZjX2hvc3QgKnZob3N0ID0gc2hvc3RfcHJpdihqb2ItPnNob3N0KTsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gam9iLT5ycG9ydDsKKwlzdHJ1Y3QgaWJtdmZjX3Bhc3N0aHJ1X21hZCAqbWFkOworCXN0cnVjdCBpYm12ZmNfZXZlbnQgKmV2dDsKKwl1bmlvbiBpYm12ZmNfaXUgcnNwX2l1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHBvcnRfaWQgPSAtMTsKKwl1bnNpZ25lZCBpbnQgY29kZSA9IGpvYi0+cmVxdWVzdC0+bXNnY29kZTsKKwlpbnQgcmMgPSAwLCByZXFfc2VnLCByc3Bfc2VnLCBpc3N1ZV9sb2dpbiA9IDA7CisJdTMyIGZjX2ZsYWdzLCByc3BfbGVuOworCisJRU5URVI7CisJam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKKwlpZiAocnBvcnQpCisJCXBvcnRfaWQgPSBycG9ydC0+cG9ydF9pZDsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgRkNfQlNHX0hTVF9FTFNfTk9MT0dJTjoKKwkJcG9ydF9pZCA9IChqb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX2Vscy5wb3J0X2lkWzBdIDw8IDE2KSB8CisJCQkoam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF9lbHMucG9ydF9pZFsxXSA8PCA4KSB8CisJCQlqb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX2Vscy5wb3J0X2lkWzJdOworCWNhc2UgRkNfQlNHX1JQVF9FTFM6CisJCWZjX2ZsYWdzID0gSUJNVkZDX0ZDX0VMUzsKKwkJYnJlYWs7CisJY2FzZSBGQ19CU0dfSFNUX0NUOgorCQlpc3N1ZV9sb2dpbiA9IDE7CisJCXBvcnRfaWQgPSAoam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF9jdC5wb3J0X2lkWzBdIDw8IDE2KSB8CisJCQkoam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF9jdC5wb3J0X2lkWzFdIDw8IDgpIHwKKwkJCWpvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfY3QucG9ydF9pZFsyXTsKKwljYXNlIEZDX0JTR19SUFRfQ1Q6CisJCWZjX2ZsYWdzID0gSUJNVkZDX0ZDX0NUX0lVOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RTVVBQOworCX07CisKKwlpZiAocG9ydF9pZCA9PSAtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFtdXRleF90cnlsb2NrKCZ2aG9zdC0+cGFzc3RocnVfbXV0ZXgpKQorCQlyZXR1cm4gLUVCVVNZOworCisJam9iLT5kZF9kYXRhID0gKHZvaWQgKilwb3J0X2lkOworCXJlcV9zZWcgPSBkbWFfbWFwX3NnKHZob3N0LT5kZXYsIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJCQkgICAgIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgRE1BX1RPX0RFVklDRSk7CisKKwlpZiAoIXJlcV9zZWcpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2aG9zdC0+cGFzc3RocnVfbXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyc3Bfc2VnID0gZG1hX21hcF9zZyh2aG9zdC0+ZGV2LCBqb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCwKKwkJCSAgICAgam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgRE1BX0ZST01fREVWSUNFKTsKKworCWlmICghcnNwX3NlZykgeworCQlkbWFfdW5tYXBfc2codmhvc3QtPmRldiwgam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwKKwkJCSAgICAgam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBETUFfVE9fREVWSUNFKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2aG9zdC0+cGFzc3RocnVfbXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocmVxX3NlZyA+IDEgfHwgcnNwX3NlZyA+IDEpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaXNzdWVfbG9naW4pCisJCXJjID0gaWJtdmZjX2JzZ19wbG9naSh2aG9zdCwgcG9ydF9pZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAodW5saWtlbHkocmMgfHwgKHJwb3J0ICYmIChyYyA9IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KSkpKSB8fAorCSAgICB1bmxpa2VseSgocmMgPSBpYm12ZmNfaG9zdF9jaGtyZWFkeSh2aG9zdCkpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXZ0ID0gaWJtdmZjX2dldF9ldmVudCh2aG9zdCk7CisJaWJtdmZjX2luaXRfZXZlbnQoZXZ0LCBpYm12ZmNfc3luY19jb21wbGV0aW9uLCBJQk1WRkNfTUFEX0ZPUk1BVCk7CisJbWFkID0gJmV2dC0+aXUucGFzc3RocnU7CisKKwltZW1zZXQobWFkLCAwLCBzaXplb2YoKm1hZCkpOworCW1hZC0+Y29tbW9uLnZlcnNpb24gPSAxOworCW1hZC0+Y29tbW9uLm9wY29kZSA9IElCTVZGQ19QQVNTVEhSVTsKKwltYWQtPmNvbW1vbi5sZW5ndGggPSBzaXplb2YoKm1hZCkgLSBzaXplb2YobWFkLT5mY19pdSkgLSBzaXplb2YobWFkLT5pdSk7CisKKwltYWQtPmNtZF9pb2JhLnZhID0gKHU2NClldnQtPmNycS5pb2JhICsKKwkJb2Zmc2V0b2Yoc3RydWN0IGlibXZmY19wYXNzdGhydV9tYWQsIGl1KTsKKwltYWQtPmNtZF9pb2JhLmxlbiA9IHNpemVvZihtYWQtPml1KTsKKworCW1hZC0+aXUuY21kX2xlbiA9IGpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuOworCW1hZC0+aXUucnNwX2xlbiA9IGpvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKwltYWQtPml1LmZsYWdzID0gZmNfZmxhZ3M7CisJbWFkLT5pdS5jYW5jZWxfa2V5ID0gSUJNVkZDX1BBU1NUSFJVX0NBTkNFTF9LRVk7CisKKwltYWQtPml1LmNtZC52YSA9IHNnX2RtYV9hZGRyZXNzKGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QpOworCW1hZC0+aXUuY21kLmxlbiA9IHNnX2RtYV9sZW4oam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCk7CisJbWFkLT5pdS5yc3AudmEgPSBzZ19kbWFfYWRkcmVzcyhqb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCk7CisJbWFkLT5pdS5yc3AubGVuID0gc2dfZG1hX2xlbihqb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCk7CisJbWFkLT5pdS5zY3NpX2lkID0gcG9ydF9pZDsKKwltYWQtPml1LnRhZyA9ICh1NjQpZXZ0OworCXJzcF9sZW4gPSBtYWQtPml1LnJzcC5sZW47CisKKwlldnQtPnN5bmNfaXUgPSAmcnNwX2l1OworCWluaXRfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKKwlyYyA9IGlibXZmY19zZW5kX2V2ZW50KGV2dCwgdmhvc3QsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHJjKSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKKworCWlmIChyc3BfaXUucGFzc3RocnUuY29tbW9uLnN0YXR1cykKKwkJcmMgPSAtRUlPOworCWVsc2UKKwkJam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gcnNwX2xlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpYm12ZmNfZnJlZV9ldmVudChldnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWpvYi0+cmVwbHktPnJlc3VsdCA9IHJjOworCWpvYi0+am9iX2RvbmUoam9iKTsKKwlyYyA9IDA7CitvdXQ6CisJZG1hX3VubWFwX3NnKHZob3N0LT5kZXYsIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJCSAgICAgam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBETUFfVE9fREVWSUNFKTsKKwlkbWFfdW5tYXBfc2codmhvc3QtPmRldiwgam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QsCisJCSAgICAgam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgRE1BX0ZST01fREVWSUNFKTsKKwltdXRleF91bmxvY2soJnZob3N0LT5wYXNzdGhydV9tdXRleCk7CisJTEVBVkU7CisJcmV0dXJuIHJjOworfQorCisvKioKICAqIGlibXZmY19yZXNldF9kZXZpY2UgLSBSZXNldCB0aGUgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCByZXNldCB0eXBlCiAgKiBAc2RldjoJc2NzaSBkZXZpY2UgdG8gcmVzZXQKICAqIEB0eXBlOglyZXNldCB0eXBlCkBAIC0xNzMxLDcgKzE5OTksMTAgQEAKIAlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsICJSZXNldHRpbmcgJXNcbiIsIGRlc2MpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmV2dC0+Y29tcCk7CiAKLQlpZiAocnNwX2l1LmNtZC5zdGF0dXMpIHsKKwlpZiAocnNwX2l1LmNtZC5zdGF0dXMpCisJCXJzcF9jb2RlID0gaWJtdmZjX2dldF9lcnJfcmVzdWx0KCZyc3BfaXUuY21kKTsKKworCWlmIChyc3BfY29kZSkgewogCQlpZiAoZmNfcnNwLT5mbGFncyAmIEZDUF9SU1BfTEVOX1ZBTElEKQogCQkJcnNwX2NvZGUgPSBmY19yc3AtPmRhdGEuaW5mby5yc3BfY29kZTsKIApAQCAtMTgyMCw3ICsyMDkxLDEwIEBACiAJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LCAiQWJvcnRpbmcgb3V0c3RhbmRpbmcgY29tbWFuZHNcbiIpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmV2dC0+Y29tcCk7CiAKLQlpZiAocnNwX2l1LmNtZC5zdGF0dXMpIHsKKwlpZiAocnNwX2l1LmNtZC5zdGF0dXMpCisJCXJzcF9jb2RlID0gaWJtdmZjX2dldF9lcnJfcmVzdWx0KCZyc3BfaXUuY21kKTsKKworCWlmIChyc3BfY29kZSkgewogCQlpZiAoZmNfcnNwLT5mbGFncyAmIEZDUF9SU1BfTEVOX1ZBTElEKQogCQkJcnNwX2NvZGUgPSBmY19yc3AtPmRhdGEuaW5mby5yc3BfY29kZTsKIApAQCAtMjA2MSwxMiArMjMzNSwyNCBAQAogfQogCiAvKioKLSAqIGlibXZmY19kZXZfY2FuY2VsX2FsbCAtIERldmljZSBpdGVyYXRlZCBjYW5jZWwgYWxsIGZ1bmN0aW9uCisgKiBpYm12ZmNfZGV2X2NhbmNlbF9hbGxfYWJ0cyAtIERldmljZSBpdGVyYXRlZCBjYW5jZWwgYWxsIGZ1bmN0aW9uCiAgKiBAc2RldjoJc2NzaSBkZXZpY2Ugc3RydWN0CiAgKiBAZGF0YToJcmV0dXJuIGNvZGUKICAqCiAgKiovCi1zdGF0aWMgdm9pZCBpYm12ZmNfZGV2X2NhbmNlbF9hbGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaWJtdmZjX2Rldl9jYW5jZWxfYWxsX2FidHMoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgKnJjID0gZGF0YTsKKwkqcmMgfD0gaWJtdmZjX2NhbmNlbF9hbGwoc2RldiwgSUJNVkZDX1RNRl9BQk9SVF9UQVNLX1NFVCk7Cit9CisKKy8qKgorICogaWJtdmZjX2Rldl9jYW5jZWxfYWxsX3Jlc2V0IC0gRGV2aWNlIGl0ZXJhdGVkIGNhbmNlbCBhbGwgZnVuY3Rpb24KKyAqIEBzZGV2OglzY3NpIGRldmljZSBzdHJ1Y3QKKyAqIEBkYXRhOglyZXR1cm4gY29kZQorICoKKyAqKi8KK3N0YXRpYyB2b2lkIGlibXZmY19kZXZfY2FuY2VsX2FsbF9yZXNldChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyAqcmMgPSBkYXRhOwogCSpyYyB8PSBpYm12ZmNfY2FuY2VsX2FsbChzZGV2LCBJQk1WRkNfVE1GX1RHVF9SRVNFVCk7CkBAIC0yMTAyLDcgKzIzODgsNyBAQAogCiAJRU5URVI7CiAJaWJtdmZjX3dhaXRfd2hpbGVfcmVzZXR0aW5nKHZob3N0KTsKLQlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZShzdGFyZ2V0LCAmY2FuY2VsX3JjLCBpYm12ZmNfZGV2X2NhbmNlbF9hbGwpOworCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHN0YXJnZXQsICZjYW5jZWxfcmMsIGlibXZmY19kZXZfY2FuY2VsX2FsbF9yZXNldCk7CiAJcmVzZXRfcmMgPSBpYm12ZmNfcmVzZXRfZGV2aWNlKHNkZXYsIElCTVZGQ19UQVJHRVRfUkVTRVQsICJ0YXJnZXQiKTsKIAogCWlmICghY2FuY2VsX3JjICYmICFyZXNldF9yYykKQEAgLTIxNDQsNyArMjQzMCw3IEBACiAJaW50IHJjID0gRkFJTEVEOwogCiAJRU5URVI7Ci0Jc3RhcmdldF9mb3JfZWFjaF9kZXZpY2Uoc3RhcmdldCwgJmNhbmNlbF9yYywgaWJtdmZjX2Rldl9jYW5jZWxfYWxsKTsKKwlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZShzdGFyZ2V0LCAmY2FuY2VsX3JjLCBpYm12ZmNfZGV2X2NhbmNlbF9hbGxfYWJ0cyk7CiAJc3RhcmdldF9mb3JfZWFjaF9kZXZpY2Uoc3RhcmdldCwgJmFib3J0X3JjLCBpYm12ZmNfZGV2X2Fib3J0X2FsbCk7CiAKIAlpZiAoIWNhbmNlbF9yYyAmJiAhYWJvcnRfcmMpCkBAIC0yMjk3LDEzICsyNTgzLDEzIEBACiAJCQkvKiBTZW5kIGJhY2sgYSByZXNwb25zZSAqLwogCQkJcmMgPSBpYm12ZmNfc2VuZF9jcnFfaW5pdF9jb21wbGV0ZSh2aG9zdCk7CiAJCQlpZiAocmMgPT0gMCkKLQkJCQlpYm12ZmNfaW5pdF9ob3N0KHZob3N0LCAwKTsKKwkJCQlpYm12ZmNfaW5pdF9ob3N0KHZob3N0KTsKIAkJCWVsc2UKIAkJCQlkZXZfZXJyKHZob3N0LT5kZXYsICJVbmFibGUgdG8gc2VuZCBpbml0IHJzcC4gcmM9JWxkXG4iLCByYyk7CiAJCQlicmVhazsKIAkJY2FzZSBJQk1WRkNfQ1JRX0lOSVRfQ09NUExFVEU6CiAJCQlkZXZfaW5mbyh2aG9zdC0+ZGV2LCAiUGFydG5lciBpbml0aWFsaXphdGlvbiBjb21wbGV0ZVxuIik7Ci0JCQlpYm12ZmNfaW5pdF9ob3N0KHZob3N0LCAwKTsKKwkJCWlibXZmY19pbml0X2hvc3Qodmhvc3QpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfZXJyKHZob3N0LT5kZXYsICJVbmtub3duIGNycSBtZXNzYWdlIHR5cGU6ICVkXG4iLCBjcnEtPmZvcm1hdCk7CkBAIC0yNDc4LDEyICsyNzY0LDE3IEBACiAgKiBpYm12ZmNfY2hhbmdlX3F1ZXVlX2RlcHRoIC0gQ2hhbmdlIHRoZSBkZXZpY2UncyBxdWV1ZSBkZXB0aAogICogQHNkZXY6CXNjc2kgZGV2aWNlIHN0cnVjdAogICogQHFkZXB0aDoJZGVwdGggdG8gc2V0CisgKiBAcmVhc29uOgljYWxsaW5nIGNvbnRleHQKICAqCiAgKiBSZXR1cm4gdmFsdWU6CiAgKiAJYWN0dWFsIGRlcHRoIHNldAogICoqLwotc3RhdGljIGludCBpYm12ZmNfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKK3N0YXRpYyBpbnQgaWJtdmZjX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgsCisJCQkJICAgICBpbnQgcmVhc29uKQogeworCWlmIChyZWFzb24gIT0gU0NTSV9RREVQVEhfREVGQVVMVCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJaWYgKHFkZXB0aCA+IElCTVZGQ19NQVhfQ01EU19QRVJfTFVOKQogCQlxZGVwdGggPSBJQk1WRkNfTUFYX0NNRFNfUEVSX0xVTjsKIApAQCAtMzcyNSw3ICs0MDE2LDcgQEAKIAljYXNlIElCTVZGQ19NQURfU1VDQ0VTUzoKIAkJaWYgKGxpc3RfZW1wdHkoJnZob3N0LT5zZW50KSAmJgogCQkgICAgdmhvc3QtPmFjdGlvbiA9PSBJQk1WRkNfSE9TVF9BQ1RJT05fTE9HT19XQUlUKSB7Ci0JCQlpYm12ZmNfaW5pdF9ob3N0KHZob3N0LCAwKTsKKwkJCWlibXZmY19pbml0X2hvc3Qodmhvc3QpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMzkwMyw2ICs0MTk0LDggQEAKIAkJCXJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyB8PSBGQ19DT1NfQ0xBU1MyOwogCQlpZiAodGd0LT5zZXJ2aWNlX3Bhcm1zLmNsYXNzM19wYXJtc1swXSAmIDB4ODAwMDAwMDApCiAJCQlycG9ydC0+c3VwcG9ydGVkX2NsYXNzZXMgfD0gRkNfQ09TX0NMQVNTMzsKKwkJaWYgKHJwb3J0LT5ycXN0X3EpCisJCQlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHJwb3J0LT5ycXN0X3EsIDEpOwogCX0gZWxzZQogCQl0Z3RfZGJnKHRndCwgInJwb3J0IGFkZCBmYWlsZWRcbiIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwpAQCAtNDM0Miw2ICs0NjM1LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2aG9zdC0+d29ya193YWl0X3EpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZob3N0LT5pbml0X3dhaXRfcSk7CiAJSU5JVF9XT1JLKCZ2aG9zdC0+cnBvcnRfYWRkX3dvcmtfcSwgaWJtdmZjX3Jwb3J0X2FkZF90aHJlYWQpOworCW11dGV4X2luaXQoJnZob3N0LT5wYXNzdGhydV9tdXRleCk7CiAKIAlpZiAoKHJjID0gaWJtdmZjX2FsbG9jX21lbSh2aG9zdCkpKQogCQlnb3RvIGZyZWVfc2NzaV9ob3N0OwpAQCAtNDM3NCw2ICs0NjY4LDggQEAKIAkJZ290byByZW1vdmVfc2hvc3Q7CiAJfQogCisJaWYgKHNob3N0X3RvX2ZjX2hvc3Qoc2hvc3QpLT5ycXN0X3EpCisJCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMoc2hvc3RfdG9fZmNfaG9zdChzaG9zdCktPnJxc3RfcSwgMSk7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgdmhvc3QpOwogCXNwaW5fbG9jaygmaWJtdmZjX2RyaXZlcl9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZ2aG9zdC0+cXVldWUsICZpYm12ZmNfaGVhZCk7CkBAIC00NDE0LDcgKzQ3MTAsMTEgQEAKIAogCUVOVEVSOwogCWlibXZmY19yZW1vdmVfdHJhY2VfZmlsZSgmdmhvc3QtPmhvc3QtPnNob3N0X2Rldi5rb2JqLCAmaWJtdmZjX3RyYWNlX2F0dHIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWlibXZmY19saW5rX2Rvd24odmhvc3QsIElCTVZGQ19IT1NUX09GRkxJTkUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCiAJaWJtdmZjX3dhaXRfd2hpbGVfcmVzZXR0aW5nKHZob3N0KTsKIAlpYm12ZmNfcmVsZWFzZV9jcnFfcXVldWUodmhvc3QpOwogCWt0aHJlYWRfc3RvcCh2aG9zdC0+d29ya190aHJlYWQpOwpAQCAtNDQ5OCw2ICs0Nzk4LDkgQEAKIAogCS5nZXRfc3RhcmdldF9wb3J0X2lkID0gaWJtdmZjX2dldF9zdGFyZ2V0X3BvcnRfaWQsCiAJLnNob3dfc3RhcmdldF9wb3J0X2lkID0gMSwKKworCS5ic2dfcmVxdWVzdCA9IGlibXZmY19ic2dfcmVxdWVzdCwKKwkuYnNnX3RpbWVvdXQgPSBpYm12ZmNfYnNnX3RpbWVvdXQsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaCBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaAppbmRleCAwMDdmYTFjOS4uZDI1MTA2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaApAQCAtMjksOCArMjksOCBAQAogI2luY2x1ZGUgInZpb3NycC5oIgogCiAjZGVmaW5lIElCTVZGQ19OQU1FCSJpYm12ZmMiCi0jZGVmaW5lIElCTVZGQ19EUklWRVJfVkVSU0lPTgkJIjEuMC42IgotI2RlZmluZSBJQk1WRkNfRFJJVkVSX0RBVEUJCSIoTWF5IDI4LCAyMDA5KSIKKyNkZWZpbmUgSUJNVkZDX0RSSVZFUl9WRVJTSU9OCQkiMS4wLjciCisjZGVmaW5lIElCTVZGQ19EUklWRVJfREFURQkJIihPY3RvYmVyIDE2LCAyMDA5KSIKIAogI2RlZmluZSBJQk1WRkNfREVGQVVMVF9USU1FT1VUCTYwCiAjZGVmaW5lIElCTVZGQ19BRElTQ19DQU5DRUxfVElNRU9VVAk0NQpAQCAtNTgsOSArNTgsMTAgQEAKICAqIDEgZm9yIEVSUAogICogMSBmb3IgaW5pdGlhbGl6YXRpb24KICAqIDEgZm9yIE5QSVYgTG9nb3V0CisgKiAyIGZvciBCU0cgcGFzc3RocnUKICAqIDIgZm9yIGVhY2ggZGlzY292ZXJ5IHRocmVhZAogICovCi0jZGVmaW5lIElCTVZGQ19OVU1fSU5URVJOQUxfUkVRCSgxICsgMSArIDEgKyAoZGlzY190aHJlYWRzICogMikpCisjZGVmaW5lIElCTVZGQ19OVU1fSU5URVJOQUxfUkVRCSgxICsgMSArIDEgKyAyICsgKGRpc2NfdGhyZWFkcyAqIDIpKQogCiAjZGVmaW5lIElCTVZGQ19NQURfU1VDQ0VTUwkJMHgwMAogI2RlZmluZSBJQk1WRkNfTUFEX05PVF9TVVBQT1JURUQJMHhGMQpAQCAtNDY2LDcgKzQ2NywxMCBAQAogCXUxNiBlcnJvcjsKIAl1MzIgZmxhZ3M7CiAjZGVmaW5lIElCTVZGQ19GQ19FTFMJCTB4MDEKKyNkZWZpbmUgSUJNVkZDX0ZDX0NUX0lVCQkweDAyCiAJdTMyIGNhbmNlbF9rZXk7CisjZGVmaW5lIElCTVZGQ19QQVNTVEhSVV9DQU5DRUxfS0VZCTB4ODAwMDAwMDAKKyNkZWZpbmUgSUJNVkZDX0lOVEVSTkFMX0NBTkNFTF9LRVkJMHg4MDAwMDAwMQogCXUzMiByZXNlcnZlZDsKIAlzdHJ1Y3Qgc3JwX2RpcmVjdF9idWYgY21kOwogCXN0cnVjdCBzcnBfZGlyZWN0X2J1ZiByc3A7CkBAIC02OTMsNiArNjk3LDcgQEAKIAlpbnQgZGlzY19idWZfc3o7CiAJaW50IGxvZ19sZXZlbDsKIAlzdHJ1Y3QgaWJtdmZjX2Rpc2NvdmVyX3RhcmdldHNfYnVmICpkaXNjX2J1ZjsKKwlzdHJ1Y3QgbXV0ZXggcGFzc3RocnVfbXV0ZXg7CiAJaW50IHRhc2tfc2V0OwogCWludCBpbml0X3JldHJpZXM7CiAJaW50IGRpc2NvdmVyeV90aHJlYWRzOwpAQCAtNzAyLDYgKzcwNyw3IEBACiAJaW50IGRlbGF5X2luaXQ7CiAJaW50IHNjYW5fY29tcGxldGU7CiAJaW50IGxvZ2dlZF9pbjsKKwlpbnQgYWJvcnRpbmdfcGFzc3RocnU7CiAJaW50IGV2ZW50c190b19sb2c7CiAjZGVmaW5lIElCTVZGQ19BRV9MSU5LVVAJMHgwMDAxCiAjZGVmaW5lIElCTVZGQ19BRV9MSU5LRE9XTgkweDAwMDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKaW5kZXggZDliMGU5ZC4uZTQ3NWI3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKQEAgLTE2MzcsMTIgKzE2MzcsMTcgQEAKICAqIGlibXZzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIENoYW5nZSB0aGUgZGV2aWNlJ3MgcXVldWUgZGVwdGgKICAqIEBzZGV2OglzY3NpIGRldmljZSBzdHJ1Y3QKICAqIEBxZGVwdGg6CWRlcHRoIHRvIHNldAorICogQHJlYXNvbjoJY2FsbGluZyBjb250ZXh0CiAgKgogICogUmV0dXJuIHZhbHVlOgogICogCWFjdHVhbCBkZXB0aCBzZXQKICAqKi8KLXN0YXRpYyBpbnQgaWJtdnNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKK3N0YXRpYyBpbnQgaWJtdnNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCwKKwkJCQkgICAgICAgaW50IHJlYXNvbikKIHsKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChxZGVwdGggPiBJQk1WU0NTSV9NQVhfQ01EU19QRVJfTFVOKQogCQlxZGVwdGggPSBJQk1WU0NTSV9NQVhfQ01EU19QRVJfTFVOOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggNzZkMjk0Zi4uMjA2YzJmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtMzM2NywxNiArMzM2NywyMSBAQAogICogaXByX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIENoYW5nZSB0aGUgZGV2aWNlJ3MgcXVldWUgZGVwdGgKICAqIEBzZGV2OglzY3NpIGRldmljZSBzdHJ1Y3QKICAqIEBxZGVwdGg6CWRlcHRoIHRvIHNldAorICogQHJlYXNvbjoJY2FsbGluZyBjb250ZXh0CiAgKgogICogUmV0dXJuIHZhbHVlOgogICogCWFjdHVhbCBkZXB0aCBzZXQKICAqKi8KLXN0YXRpYyBpbnQgaXByX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgpCitzdGF0aWMgaW50IGlwcl9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcWRlcHRoLAorCQkJCSAgaW50IHJlYXNvbikKIHsKIAlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CiAKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAJcmVzID0gKHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKilzZGV2LT5ob3N0ZGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCmluZGV4IGVkYzQ5Y2EuLjUxN2RhM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKQEAgLTkwMyw3ICs5MDMsNyBAQAogCQkJCSAgSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8CiAJCQkJICBJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKIAkJCQkgIElTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQkJCSAgSVNDU0lfTFVfUkVTRVRfVE1PIHwKKwkJCQkgIElTQ1NJX0xVX1JFU0VUX1RNTyB8IElTQ1NJX1RHVF9SRVNFVF9UTU8gfAogCQkJCSAgSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8CiAJCQkJICBJU0NTSV9JRkFDRV9OQU1FIHwgSVNDU0lfSU5JVElBVE9SX05BTUUsCiAJLmhvc3RfcGFyYW1fbWFzawk9IElTQ1NJX0hPU1RfSFdBRERSRVNTIHwgSVNDU0lfSE9TVF9JUEFERFJFU1MgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2xpYmZjL01ha2VmaWxlCmluZGV4IDU1Zjk4MmQuLjRiYjIzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvTWFrZWZpbGUKQEAgLTMsMTAgKzMsMTIgQEAKIG9iai0kKENPTkZJR19MSUJGQykgKz0gbGliZmMubwogCiBsaWJmYy1vYmpzIDo9IFwKKwlmY19saWJmYy5vIFwKIAlmY19kaXNjLm8gXAogCWZjX2V4Y2gubyBcCiAJZmNfZWxzY3QubyBcCiAJZmNfZnJhbWUubyBcCiAJZmNfbHBvcnQubyBcCiAJZmNfcnBvcnQubyBcCi0JZmNfZmNwLm8KKwlmY19mY3AubyBcCisJZmNfbnBpdi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Rpc2MuYwppbmRleCBjNDg3OTllLi45YjBhNTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19kaXNjLmMKQEAgLTQwLDYgKzQwLDggQEAKIAogI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KIAorI2luY2x1ZGUgImZjX2xpYmZjLmgiCisKICNkZWZpbmUgRkNfRElTQ19SRVRSWV9MSU1JVAkzCS8qIG1heCByZXRyaWVzICovCiAjZGVmaW5lIEZDX0RJU0NfUkVUUllfREVMQVkJNTAwVUwJLyogKG1zZWNzKSBkZWxheSAqLwogCkBAIC01MSw4ICs1Myw4IEBACiBzdGF0aWMgdm9pZCBmY19kaXNjX3Jlc3RhcnQoc3RydWN0IGZjX2Rpc2MgKik7CiAKIC8qKgotICogZmNfZGlzY19zdG9wX3Jwb3J0cygpIC0gZGVsZXRlIGFsbCB0aGUgcmVtb3RlIHBvcnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbHBvcnQKLSAqIEBkaXNjOiBUaGUgZGlzY292ZXJ5IGpvYiB0byBzdG9wIHJwb3J0cyBvbgorICogZmNfZGlzY19zdG9wX3Jwb3J0cygpIC0gRGVsZXRlIGFsbCB0aGUgcmVtb3RlIHBvcnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbHBvcnQKKyAqIEBkaXNjOiBUaGUgZGlzY292ZXJ5IGpvYiB0byBzdG9wIHJlbW90ZSBwb3J0cyBvbgogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIGxwb3J0IG11dGV4IGlzIGxvY2tlZCBiZWZvcmUKICAqIGNhbGxpbmcgaXQuCkBAIC03Miw5ICs3NCw5IEBACiAKIC8qKgogICogZmNfZGlzY19yZWN2X3JzY25fcmVxKCkgLSBIYW5kbGUgUmVnaXN0ZXJlZCBTdGF0ZSBDaGFuZ2UgTm90aWZpY2F0aW9uIChSU0NOKQotICogQHNwOiBDdXJyZW50IHNlcXVlbmNlIG9mIHRoZSBSU0NOIGV4Y2hhbmdlCi0gKiBAZnA6IFJTQ04gRnJhbWUKLSAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIG9mIHRoZSBSU0NOIGV4Y2hhbmdlCisgKiBAZnA6CSAgIFRoZSBSU0NOIGZyYW1lCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzZW50IG9uCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCB0aGUgZGlzY19tdXRleCBpcyBsb2NrZWQKICAqCQkgYmVmb3JlIGl0IGlzIGNhbGxlZC4KQEAgLTE4Myw5ICsxODUsOSBAQAogCiAvKioKICAqIGZjX2Rpc2NfcmVjdl9yZXEoKSAtIEhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cwotICogQHNwOiBDdXJyZW50IHNlcXVlbmNlIG9mIHRoZSByZXF1ZXN0IGV4Y2hhbmdlCi0gKiBAZnA6IFRoZSBmcmFtZQotICogQGxwb3J0OiBUaGUgRkMgbG9jYWwgcG9ydAorICogQHNwOgkgICBUaGUgc2VxdWVuY2Ugb2YgdGhlIHJlcXVlc3QgZXhjaGFuZ2UKKyAqIEBmcDoJICAgVGhlIHJlcXVlc3QgZnJhbWUKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgcmVjZWl2aW5nIHRoZSByZXF1ZXN0CiAgKgogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBFTSBhbmQgd2lsbCBsb2NrCiAgKgkJIHRoZSBkaXNjX211dGV4IGJlZm9yZSBjYWxsaW5nIHRoZSBoYW5kbGVyIGZvciB0aGUKQEAgLTIxMyw3ICsyMTUsNyBAQAogCiAvKioKICAqIGZjX2Rpc2NfcmVzdGFydCgpIC0gUmVzdGFydCBkaXNjb3ZlcnkKLSAqIEBscG9ydDogRkMgZGlzY292ZXJ5IGNvbnRleHQKKyAqIEBkaXNjOiBUaGUgZGlzY292ZXJ5IG9iamVjdCB0byBiZSByZXN0YXJ0ZWQKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBkaXNjIG11dGV4CiAgKgkJIGlzIGFscmVhZHkgbG9ja2VkLgpAQCAtMjQwLDkgKzI0Miw5IEBACiB9CiAKIC8qKgotICogZmNfZGlzY19zdGFydCgpIC0gRmlicmUgQ2hhbm5lbCBUYXJnZXQgZGlzY292ZXJ5Ci0gKiBAbHBvcnQ6IEZDIGxvY2FsIHBvcnQKLSAqIEBkaXNjX2NhbGxiYWNrOiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBkaXNjb3ZlcnkgaXMgY29tcGxldGUKKyAqIGZjX2Rpc2Nfc3RhcnQoKSAtIFN0YXJ0IGRpc2NvdmVyeSBvbiBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDoJICAgVGhlIGxvY2FsIHBvcnQgdG8gaGF2ZSBkaXNjb3Zlcnkgc3RhcnRlZCBvbgorICogQGRpc2NfY2FsbGJhY2s6IENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGRpc2NvdmVyeSBpcyBjb21wbGV0ZQogICovCiBzdGF0aWMgdm9pZCBmY19kaXNjX3N0YXJ0KHZvaWQgKCpkaXNjX2NhbGxiYWNrKShzdHJ1Y3QgZmNfbHBvcnQgKiwKIAkJCQkJCWVudW0gZmNfZGlzY19ldmVudCksCkBAIC0yNjMsOCArMjY1LDggQEAKIAogLyoqCiAgKiBmY19kaXNjX2RvbmUoKSAtIERpc2NvdmVyeSBoYXMgYmVlbiBjb21wbGV0ZWQKLSAqIEBkaXNjOiBGQyBkaXNjb3ZlcnkgY29udGV4dAotICogQGV2ZW50OiBkaXNjb3ZlcnkgY29tcGxldGlvbiBzdGF0dXMKKyAqIEBkaXNjOiAgVGhlIGRpc2NvdmVyeSBjb250ZXh0CisgKiBAZXZlbnQ6IFRoZSBkaXNjb3ZlcnkgY29tcGxldGlvbiBzdGF0dXMKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBkaXNjIG11dGV4IGlzIGxvY2tlZCBiZWZvcmUKICAqIGl0IGlzIGNhbGxlZC4gVGhlIGRpc2NvdmVyeSBjYWxsYmFjayBpcyB0aGVuIG1hZGUgd2l0aCB0aGUgbG9jayByZWxlYXNlZCwKQEAgLTI4NCw4ICsyODYsOCBAQAogCX0KIAogCS8qCi0JICogR28gdGhyb3VnaCBhbGwgcmVtb3RlIHBvcnRzLiAgSWYgdGhleSB3ZXJlIGZvdW5kIGluIHRoZSBsYXRlc3QKLQkgKiBkaXNjb3ZlcnksIHJldmVyaWZ5IG9yIGxvZyB0aGVtIGluLiAgT3RoZXJ3aXNlLCBsb2cgdGhlbSBvdXQuCisJICogR28gdGhyb3VnaCBhbGwgcmVtb3RlIHBvcnRzLgkgSWYgdGhleSB3ZXJlIGZvdW5kIGluIHRoZSBsYXRlc3QKKwkgKiBkaXNjb3ZlcnksIHJldmVyaWZ5IG9yIGxvZyB0aGVtIGluLglPdGhlcndpc2UsIGxvZyB0aGVtIG91dC4KIAkgKiBTa2lwIHBvcnRzIHdoaWNoIHdlcmUgbmV2ZXIgZGlzY292ZXJlZC4gIFRoZXNlIGFyZSB0aGUgZE5TIHBvcnQKIAkgKiBhbmQgcG9ydHMgd2hpY2ggd2VyZSBjcmVhdGVkIGJ5IFBMT0dJLgogCSAqLwpAQCAtMzA1LDggKzMwNyw4IEBACiAKIC8qKgogICogZmNfZGlzY19lcnJvcigpIC0gSGFuZGxlIGVycm9yIG9uIGROUyByZXF1ZXN0Ci0gKiBAZGlzYzogRkMgZGlzY292ZXJ5IGNvbnRleHQKLSAqIEBmcDogVGhlIGZyYW1lIHBvaW50ZXIKKyAqIEBkaXNjOiBUaGUgZGlzY292ZXJ5IGNvbnRleHQKKyAqIEBmcDoJICBUaGUgZXJyb3IgY29kZSBlbmNvZGVkIGFzIGEgZnJhbWUgcG9pbnRlcgogICovCiBzdGF0aWMgdm9pZCBmY19kaXNjX2Vycm9yKHN0cnVjdCBmY19kaXNjICpkaXNjLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewpAQCAtMzQyLDcgKzM0NCw3IEBACiAKIC8qKgogICogZmNfZGlzY19ncG5fZnRfcmVxKCkgLSBTZW5kIEdldCBQb3J0IE5hbWVzIGJ5IEZDLTQgdHlwZSAoR1BOX0ZUKSByZXF1ZXN0Ci0gKiBAbHBvcnQ6IEZDIGRpc2NvdmVyeSBjb250ZXh0CisgKiBAbHBvcnQ6IFRoZSBkaXNjb3ZlcnkgY29udGV4dAogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIGRpc2NfbXV0ZXggaXMgbG9ja2VkCiAgKgkJIGJlZm9yZSBpdCBpcyBjYWxsZWQuCkBAIC0zNjgsMTcgKzM3MCwxNyBAQAogCWlmIChscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgMCwgZnAsCiAJCQkJIEZDX05TX0dQTl9GVCwKIAkJCQkgZmNfZGlzY19ncG5fZnRfcmVzcCwKLQkJCQkgZGlzYywgbHBvcnQtPmVfZF90b3YpKQorCQkJCSBkaXNjLCAzICogbHBvcnQtPnJfYV90b3YpKQogCQlyZXR1cm47CiBlcnI6Ci0JZmNfZGlzY19lcnJvcihkaXNjLCBmcCk7CisJZmNfZGlzY19lcnJvcihkaXNjLCBOVUxMKTsKIH0KIAogLyoqCiAgKiBmY19kaXNjX2dwbl9mdF9wYXJzZSgpIC0gUGFyc2UgdGhlIGJvZHkgb2YgdGhlIGROUyBHUE5fRlQgcmVzcG9uc2UuCi0gKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgaG9zdCBwb3J0IGluc3RhbmNlCi0gKiBAYnVmOiBHUE5fRlQgcmVzcG9uc2UgYnVmZmVyCi0gKiBAbGVuOiBzaXplIG9mIHJlc3BvbnNlIGJ1ZmZlcgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGUgR1BOX0ZUIHdhcyByZWNlaXZlZCBvbgorICogQGJ1ZjogICBUaGUgR1BOX0ZUIHJlc3BvbnNlIGJ1ZmZlcgorICogQGxlbjogICBUaGUgc2l6ZSBvZiByZXNwb25zZSBidWZmZXIKICAqCiAgKiBHb2VzIHRocm91Z2ggdGhlIGxpc3Qgb2YgSURzIGFuZCBuYW1lcyByZXN1bHRpbmcgZnJvbSBhIHJlcXVlc3QuCiAgKi8KQEAgLTQ3NywxMCArNDc5LDggQEAKIH0KIAogLyoqCi0gKiBmY19kaXNjX3RpbWVvdXQoKSAtIFJldHJ5IGhhbmRsZXIgZm9yIHRoZSBkaXNjIGNvbXBvbmVudAotICogQHdvcms6IFN0cnVjdHVyZSBob2xkaW5nIGRpc2Mgb2JqIHRoYXQgbmVlZHMgcmV0cnkgZGlzY292ZXJ5Ci0gKgotICogSGFuZGxlIHJldHJ5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZvciByZW1vdGUgcG9ydHMuCisgKiBmY19kaXNjX3RpbWVvdXQoKSAtIEhhbmRsZXIgZm9yIGRpc2NvdmVyeSB0aW1lb3V0cworICogQHdvcms6IFN0cnVjdHVyZSBob2xkaW5nIGRpc2NvdmVyeSBjb250ZXh0IHRoYXQgbmVlZHMgdG8gcmV0cnkgZGlzY292ZXJ5CiAgKi8KIHN0YXRpYyB2b2lkIGZjX2Rpc2NfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC00OTQsOSArNDk0LDkgQEAKIAogLyoqCiAgKiBmY19kaXNjX2dwbl9mdF9yZXNwKCkgLSBIYW5kbGUgYSByZXNwb25zZSBmcmFtZSBmcm9tIEdldCBQb3J0IE5hbWVzIChHUE5fRlQpCi0gKiBAc3A6IEN1cnJlbnQgc2VxdWVuY2Ugb2YgR1BOX0ZUIGV4Y2hhbmdlCi0gKiBAZnA6IHJlc3BvbnNlIGZyYW1lCi0gKiBAbHBfYXJnOiBGaWJyZSBDaGFubmVsIGhvc3QgcG9ydCBpbnN0YW5jZQorICogQHNwOgkgICAgVGhlIHNlcXVlbmNlIHRoYXQgdGhlIEdQTl9GVCByZXNwb25zZSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBmcDoJICAgIFRoZSBHUE5fRlQgcmVzcG9uc2UgZnJhbWUKKyAqIEBscF9hcmc6IFRoZSBkaXNjb3ZlcnkgY29udGV4dAogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBkaXNjIG11dGV4IGhlbGQsIGFuZAogICoJCSBzaG91bGQgZG8gYWxsIGl0cyBwcm9jZXNzaW5nIHdpdGggdGhlIG11dGV4IGhlbGQKQEAgLTU2Nyw5ICs1NjcsOSBAQAogCiAvKioKICAqIGZjX2Rpc2NfZ3BuX2lkX3Jlc3AoKSAtIEhhbmRsZSBhIHJlc3BvbnNlIGZyYW1lIGZyb20gR2V0IFBvcnQgTmFtZXMgKEdQTl9JRCkKLSAqIEBzcDogZXhjaGFuZ2Ugc2VxdWVuY2UKLSAqIEBmcDogcmVzcG9uc2UgZnJhbWUKLSAqIEByZGF0YV9hcmc6IHJlbW90ZSBwb3J0IHByaXZhdGUgZGF0YQorICogQHNwOgkgICAgICAgVGhlIHNlcXVlbmNlIHRoZSBHUE5fSUQgaXMgb24KKyAqIEBmcDoJICAgICAgIFRoZSByZXNwb25zZSBmcmFtZQorICogQHJkYXRhX2FyZzogVGhlIHJlbW90ZSBwb3J0IHRoYXQgc2VudCB0aGUgR1BOX0lEIHJlc3BvbnNlCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IGRpc2MgbXV0ZXggaGVsZC4KICAqLwpAQCAtNjM3LDcgKzYzNyw3IEBACiAKIC8qKgogICogZmNfZGlzY19ncG5faWRfcmVxKCkgLSBTZW5kIEdldCBQb3J0IE5hbWVzIGJ5IElEIChHUE5fSUQpIHJlcXVlc3QKLSAqIEBscG9ydDogbG9jYWwgcG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBpbml0aWF0ZSBkaXNjb3Zlcnkgb24KICAqIEByZGF0YTogcmVtb3RlIHBvcnQgcHJpdmF0ZSBkYXRhCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCB0aGUgZGlzY19tdXRleCBpcyBsb2NrZWQKQEAgLTY1NCw3ICs2NTQsOCBAQAogCWlmICghZnApCiAJCXJldHVybiAtRU5PTUVNOwogCWlmICghbHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIHJkYXRhLT5pZHMucG9ydF9pZCwgZnAsIEZDX05TX0dQTl9JRCwKLQkJCQkgZmNfZGlzY19ncG5faWRfcmVzcCwgcmRhdGEsIGxwb3J0LT5lX2RfdG92KSkKKwkJCQkgIGZjX2Rpc2NfZ3BuX2lkX3Jlc3AsIHJkYXRhLAorCQkJCSAgMyAqIGxwb3J0LT5yX2FfdG92KSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJa3JlZl9nZXQoJnJkYXRhLT5rcmVmKTsKIAlyZXR1cm4gMDsKQEAgLTY2Miw4ICs2NjMsOCBAQAogCiAvKioKICAqIGZjX2Rpc2Nfc2luZ2xlKCkgLSBEaXNjb3ZlciB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSB0YXJnZXQKLSAqIEBscG9ydDogbG9jYWwgcG9ydAotICogQGRwOiBUaGUgcG9ydCB0byByZWRpc2NvdmVyCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoZSByZW1vdGUgcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGgKKyAqIEBkcDoJICAgVGhlIHBvcnQgdG8gcmVkaXNjb3ZlcgogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIGRpc2NfbXV0ZXggaXMgbG9ja2VkCiAgKgkJIGJlZm9yZSBpdCBpcyBjYWxsZWQuCkBAIC02ODEsNyArNjgyLDcgQEAKIAogLyoqCiAgKiBmY19kaXNjX3N0b3AoKSAtIFN0b3AgZGlzY292ZXJ5IGZvciBhIGdpdmVuIGxwb3J0Ci0gKiBAbHBvcnQ6IFRoZSBscG9ydCB0aGF0IGRpc2NvdmVyeSBzaG91bGQgc3RvcCBmb3IKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCBkaXNjb3Zlcnkgc2hvdWxkIHN0b3Agb24KICAqLwogdm9pZCBmY19kaXNjX3N0b3Aoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKQEAgLTY5NSw3ICs2OTYsNyBAQAogCiAvKioKICAqIGZjX2Rpc2Nfc3RvcF9maW5hbCgpIC0gU3RvcCBkaXNjb3ZlcnkgZm9yIGEgZ2l2ZW4gbHBvcnQKLSAqIEBscG9ydDogVGhlIGxwb3J0IHRoYXQgZGlzY292ZXJ5IHNob3VsZCBzdG9wIGZvcgorICogQGxwb3J0OiBUaGUgbHBvcnQgdGhhdCBkaXNjb3Zlcnkgc2hvdWxkIHN0b3Agb24KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgZGlzY292ZXJ5IGhhcyBiZWVuCiAgKiBjb21wbGV0ZWx5IHN0b3BwZWQgYW5kIGFsbCBycG9ydHMgaGF2ZSBiZWVuIGRlbGV0ZWQuCkBAIC03MDcsOCArNzA4LDggQEAKIH0KIAogLyoqCi0gKiBmY19kaXNjX2luaXQoKSAtIEluaXRpYWxpemUgdGhlIGRpc2NvdmVyeSBibG9jawotICogQGxwb3J0OiBGQyBsb2NhbCBwb3J0CisgKiBmY19kaXNjX2luaXQoKSAtIEluaXRpYWxpemUgdGhlIGRpc2NvdmVyeSBsYXllciBmb3IgYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgbmVlZHMgdGhlIGRpc2NvdmVyeSBsYXllciB0byBiZSBpbml0aWFsaXplZAogICovCiBpbnQgZmNfZGlzY19pbml0KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZWxzY3QuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jCmluZGV4IDVjZmE2ODcuLjUzNzQ4NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jCkBAIC0yOCwxNyArMjgsMjIgQEAKICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAjaW5jbHVkZSA8c2NzaS9mY19lbmNvZGUuaD4KIAotLyoKLSAqIGZjX2Vsc2N0X3NlbmQgLSBzZW5kcyBFTFMvQ1QgZnJhbWUKKy8qKgorICogZmNfZWxzY3Rfc2VuZCgpIC0gU2VuZCBhbiBFTFMgb3IgQ1QgZnJhbWUKKyAqIEBscG9ydDoJVGhlIGxvY2FsIHBvcnQgdG8gc2VuZCB0aGUgZnJhbWUgb24KKyAqIEBkaWQ6CVRoZSBkZXN0aW5hdGlvbiBJRCBmb3IgdGhlIGZyYW1lCisgKiBAZnA6CQlUaGUgZnJhbWUgdG8gYmUgc2VudAorICogQG9wOgkJVGhlIG9wZXJhdGlvbmFsIGNvZGUKKyAqIEByZXNwOglUaGUgY2FsbGJhY2sgcm91dGluZSB3aGVuIHRoZSByZXNwb25zZSBpcyByZWNlaXZlZAorICogQGFyZzoJVGhlIGFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIHJlc3BvbnNlIGNhbGxiYWNrIHJvdXRpbmUKKyAqIEB0aW1lcl9tc2VjOiBUaGUgdGltZW91dCBwZXJpb2QgZm9yIHRoZSBmcmFtZSAoaW4gbXNlY3MpCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmNfc2VxICpmY19lbHNjdF9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCi0JCQkJICAgIHUzMiBkaWQsCi0JCQkJICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJICAgIHVuc2lnbmVkIGludCBvcCwKLQkJCQkgICAgdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwKLQkJCQkJCSBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAotCQkJCQkJIHZvaWQgKmFyZyksCi0JCQkJICAgIHZvaWQgKmFyZywgdTMyIHRpbWVyX21zZWMpCitzdHJ1Y3QgZmNfc2VxICpmY19lbHNjdF9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHUzMiBkaWQsCisJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsIHVuc2lnbmVkIGludCBvcCwKKwkJCSAgICAgdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwKKwkJCQkJICBzdHJ1Y3QgZmNfZnJhbWUgKiwKKwkJCQkJICB2b2lkICopLAorCQkJICAgICB2b2lkICphcmcsIHUzMiB0aW1lcl9tc2VjKQogewogCWVudW0gZmNfcmN0bCByX2N0bDsKIAllbnVtIGZjX2ZoX3R5cGUgZmhfdHlwZTsKQEAgLTUzLDE1ICs1OCwyMiBAQAogCQlkaWQgPSBGQ19GSURfRElSX1NFUlY7CiAJfQogCi0JaWYgKHJjKQorCWlmIChyYykgeworCQlmY19mcmFtZV9mcmVlKGZwKTsKIAkJcmV0dXJuIE5VTEw7CisJfQogCiAJZmNfZmlsbF9mY19oZHIoZnAsIHJfY3RsLCBkaWQsIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCksIGZoX3R5cGUsCiAJCSAgICAgICBGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOwogCiAJcmV0dXJuIGxwb3J0LT50dC5leGNoX3NlcV9zZW5kKGxwb3J0LCBmcCwgcmVzcCwgTlVMTCwgYXJnLCB0aW1lcl9tc2VjKTsKIH0KK0VYUE9SVF9TWU1CT0woZmNfZWxzY3Rfc2VuZCk7CiAKKy8qKgorICogZmNfZWxzY3RfaW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgRUxTL0NUIGxheWVyCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIGluaXRpYWxpemUgdGhlIEVMUy9DVCBsYXllciBmb3IKKyAqLwogaW50IGZjX2Vsc2N0X2luaXQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKIAlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKQpAQCAtNzIsMTIgKzg0LDE1IEBACiBFWFBPUlRfU1lNQk9MKGZjX2Vsc2N0X2luaXQpOwogCiAvKioKLSAqIGZjX2Vsc19yZXNwX3R5cGUoKSAtIHJldHVybiBzdHJpbmcgZGVzY3JpYmluZyBFTFMgcmVzcG9uc2UgZm9yIGRlYnVnLgotICogQGZwOiBmcmFtZSBwb2ludGVyIHdpdGggcG9zc2libGUgZXJyb3IgY29kZS4KKyAqIGZjX2Vsc19yZXNwX3R5cGUoKSAtIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBFTFMgcmVzcG9uc2UKKyAqIEBmcDogVGhlIGZyYW1lIHBvaW50ZXIgb3IgcG9zc2libGUgZXJyb3IgY29kZQogICovCiBjb25zdCBjaGFyICpmY19lbHNfcmVzcF90eXBlKHN0cnVjdCBmY19mcmFtZSAqZnApCiB7CiAJY29uc3QgY2hhciAqbXNnOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY19jdF9oZHIgKmN0OworCiAJaWYgKElTX0VSUihmcCkpIHsKIAkJc3dpdGNoICgtUFRSX0VSUihmcCkpIHsKIAkJY2FzZSBGQ19OT19FUlI6CkBAIC05NCwxNSArMTA5LDQxIEBACiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7Ci0JCXN3aXRjaCAoZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkpIHsKLQkJY2FzZSBFTFNfTFNfQUNDOgotCQkJbXNnID0gImFjY2VwdCI7CisJCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJCXN3aXRjaCAoZmgtPmZoX3R5cGUpIHsKKwkJY2FzZSBGQ19UWVBFX0VMUzoKKwkJCXN3aXRjaCAoZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkpIHsKKwkJCWNhc2UgRUxTX0xTX0FDQzoKKwkJCQltc2cgPSAiYWNjZXB0IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRUxTX0xTX1JKVDoKKwkJCQltc2cgPSAicmVqZWN0IjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbXNnID0gInJlc3BvbnNlIHVua25vd24gRUxTIjsKKwkJCQlicmVhazsKKwkJCX0KIAkJCWJyZWFrOwotCQljYXNlIEVMU19MU19SSlQ6Ci0JCQltc2cgPSAicmVqZWN0IjsKKwkJY2FzZSBGQ19UWVBFX0NUOgorCQkJY3QgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpjdCkpOworCQkJaWYgKGN0KSB7CisJCQkJc3dpdGNoIChudG9ocyhjdC0+Y3RfY21kKSkgeworCQkJCWNhc2UgRkNfRlNfQUNDOgorCQkJCQltc2cgPSAiQ1QgYWNjZXB0IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGQ19GU19SSlQ6CisJCQkJCW1zZyA9ICJDVCByZWplY3QiOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQltc2cgPSAicmVzcG9uc2UgdW5rbm93biBDVCI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbXNnID0gInNob3J0IENUIHJlc3BvbnNlIjsKKwkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJbXNnID0gInJlc3BvbnNlIHVua25vd24gRUxTIjsKKwkJCW1zZyA9ICJyZXNwb25zZSBub3QgRUxTIG9yIENUIjsKIAkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKaW5kZXggYzFjMTU3NC4uMTlkNzExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCkBAIC0zMiwxMCArMzIsMTMgQEAKICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAjaW5jbHVkZSA8c2NzaS9mY19lbmNvZGUuaD4KIAorI2luY2x1ZGUgImZjX2xpYmZjLmgiCisKIHUxNglmY19jcHVfbWFzazsJCS8qIGNwdSBtYXNrIGZvciBwb3NzaWJsZSBjcHVzICovCiBFWFBPUlRfU1lNQk9MKGZjX2NwdV9tYXNrKTsKIHN0YXRpYyB1MTYJZmNfY3B1X29yZGVyOwkvKiAyJ3MgcG93ZXIgdG8gcmVwcmVzZW50IHRvdGFsIHBvc3NpYmxlIGNwdXMgKi8KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZmNfZW1fY2FjaGVwOyAgICAgICAgLyogY2FjaGUgZm9yIGV4Y2hhbmdlcyAqLworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmY19lbV9jYWNoZXA7CSAgICAgICAvKiBjYWNoZSBmb3IgZXhjaGFuZ2VzICovCitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZmNfZXhjaF93b3JrcXVldWU7CiAKIC8qCiAgKiBTdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciBtYW5hZ2luZyBGaWJyZSBDaGFubmVsIEV4Y2hhbmdlcwpAQCAtNTAsMzUgKzUzLDQ2IEBACiAgKiBmY19zZXEgaG9sZHMgdGhlIHN0YXRlIGZvciBhbiBpbmRpdmlkdWFsIHNlcXVlbmNlLgogICovCiAKLS8qCi0gKiBQZXIgY3B1IGV4Y2hhbmdlIHBvb2wKKy8qKgorICogc3RydWN0IGZjX2V4Y2hfcG9vbCAtIFBlciBjcHUgZXhjaGFuZ2UgcG9vbAorICogQG5leHRfaW5kZXg6CSAgTmV4dCBwb3NzaWJsZSBmcmVlIGV4Y2hhbmdlIGluZGV4CisgKiBAdG90YWxfZXhjaGVzOiBUb3RhbCBhbGxvY2F0ZWQgZXhjaGFuZ2VzCisgKiBAbG9jazoJICBFeGNoIHBvb2wgbG9jaworICogQGV4X2xpc3Q6CSAgTGlzdCBvZiBleGNoYW5nZXMKICAqCiAgKiBUaGlzIHN0cnVjdHVyZSBtYW5hZ2VzIHBlciBjcHUgZXhjaGFuZ2VzIGluIGFycmF5IG9mIGV4Y2hhbmdlIHBvaW50ZXJzLgogICogVGhpcyBhcnJheSBpcyBhbGxvY2F0ZWQgZm9sbG93ZWQgYnkgc3RydWN0IGZjX2V4Y2hfcG9vbCBtZW1vcnkgZm9yCiAgKiBhc3NpZ25lZCByYW5nZSBvZiBleGNoYW5nZXMgdG8gcGVyIGNwdSBwb29sLgogICovCiBzdHJ1Y3QgZmNfZXhjaF9wb29sIHsKLQl1MTYJCW5leHRfaW5kZXg7CS8qIG5leHQgcG9zc2libGUgZnJlZSBleGNoYW5nZSBpbmRleCAqLwotCXUxNgkJdG90YWxfZXhjaGVzOwkvKiB0b3RhbCBhbGxvY2F0ZWQgZXhjaGFuZ2VzICovCi0Jc3BpbmxvY2tfdAlsb2NrOwkJLyogZXhjaCBwb29sIGxvY2sgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWV4X2xpc3Q7CS8qIGFsbG9jYXRlZCBleGNoYW5nZXMgbGlzdCAqLworCXUxNgkJIG5leHRfaW5kZXg7CisJdTE2CQkgdG90YWxfZXhjaGVzOworCXNwaW5sb2NrX3QJIGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBleF9saXN0OwogfTsKIAotLyoKLSAqIEV4Y2hhbmdlIG1hbmFnZXIuCisvKioKKyAqIHN0cnVjdCBmY19leGNoX21nciAtIFRoZSBFeGNoYW5nZSBNYW5hZ2VyIChFTSkuCisgKiBAY2xhc3M6CSAgICBEZWZhdWx0IGNsYXNzIGZvciBuZXcgc2VxdWVuY2VzCisgKiBAa3JlZjoJICAgIFJlZmVyZW5jZSBjb3VudGVyCisgKiBAbWluX3hpZDoJICAgIE1pbmltdW0gZXhjaGFuZ2UgSUQKKyAqIEBtYXhfeGlkOgkgICAgTWF4aW11bSBleGNoYW5nZSBJRAorICogQGVwX3Bvb2w6CSAgICBSZXNlcnZlZCBleGNoYW5nZSBwb2ludGVycworICogQHBvb2xfbWF4X2luZGV4OiBNYXggZXhjaCBhcnJheSBpbmRleCBpbiBleGNoIHBvb2wKKyAqIEBwb29sOgkgICAgUGVyIGNwdSBleGNoIHBvb2wKKyAqIEBzdGF0czoJICAgIFN0YXRpc3RpY3Mgc3RydWN0dXJlCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGNlbnRlciBmb3IgY3JlYXRpbmcgZXhjaGFuZ2VzIGFuZCBzZXF1ZW5jZXMuCiAgKiBJdCBtYW5hZ2VzIHRoZSBhbGxvY2F0aW9uIG9mIGV4Y2hhbmdlIElEcy4KICAqLwogc3RydWN0IGZjX2V4Y2hfbWdyIHsKLQllbnVtIGZjX2NsYXNzCWNsYXNzOwkJLyogZGVmYXVsdCBjbGFzcyBmb3Igc2VxdWVuY2VzICovCi0Jc3RydWN0IGtyZWYJa3JlZjsJCS8qIGV4Y2hhbmdlIG1nciByZWZlcmVuY2UgY291bnQgKi8KLQl1MTYJCW1pbl94aWQ7CS8qIG1pbiBleGNoYW5nZSBJRCAqLwotCXUxNgkJbWF4X3hpZDsJLyogbWF4IGV4Y2hhbmdlIElEICovCi0Jc3RydWN0IGxpc3RfaGVhZAlleF9saXN0OwkvKiBhbGxvY2F0ZWQgZXhjaGFuZ2VzIGxpc3QgKi8KLQltZW1wb29sX3QJKmVwX3Bvb2w7CS8qIHJlc2VydmUgZXAncyAqLwotCXUxNgkJcG9vbF9tYXhfaW5kZXg7CS8qIG1heCBleGNoIGFycmF5IGluZGV4IGluIGV4Y2ggcG9vbCAqLwotCXN0cnVjdCBmY19leGNoX3Bvb2wgKnBvb2w7CS8qIHBlciBjcHUgZXhjaCBwb29sICovCisJZW51bSBmY19jbGFzcwljbGFzczsKKwlzdHJ1Y3Qga3JlZglrcmVmOworCXUxNgkJbWluX3hpZDsKKwl1MTYJCW1heF94aWQ7CisJbWVtcG9vbF90CSplcF9wb29sOworCXUxNgkJcG9vbF9tYXhfaW5kZXg7CisJc3RydWN0IGZjX2V4Y2hfcG9vbCAqcG9vbDsKIAogCS8qCiAJICogY3VycmVudGx5IGV4Y2hhbmdlIG1nciBzdGF0cyBhcmUgdXBkYXRlZCBidXQgbm90IHVzZWQuCkBAIC05Niw2ICsxMTAsMTggQEAKIH07CiAjZGVmaW5lCWZjX3NlcV9leGNoKHNwKSBjb250YWluZXJfb2Yoc3AsIHN0cnVjdCBmY19leGNoLCBzZXEpCiAKKy8qKgorICogc3RydWN0IGZjX2V4Y2hfbWdyX2FuY2hvciAtIHByaW1hcnkgc3RydWN0dXJlIGZvciBsaXN0IG9mIEVNcworICogQGVtYV9saXN0OiBFeGNoYW5nZSBNYW5hZ2VyIEFuY2hvciBsaXN0CisgKiBAbXA6CSAgICAgIEV4Y2hhbmdlIE1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYW5jaG9yCisgKiBAbWF0Y2g6ICAgIFJvdXRpbmUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgYW5jaG9yJ3MgRU0gc2hvdWxkIGJlIHVzZWQKKyAqCisgKiBXaGVuIHdhbGtpbmcgdGhlIGxpc3Qgb2YgYW5jaG9ycyB0aGUgbWF0Y2ggcm91dGluZSB3aWxsIGJlIGNhbGxlZAorICogZm9yIGVhY2ggYW5jaG9yIHRvIGRldGVybWluZSBpZiB0aGF0IEVNIHNob3VsZCBiZSB1c2VkLiBUaGUgbGFzdAorICogYW5jaG9yIGluIHRoZSBsaXN0IHdpbGwgYWx3YXlzIG1hdGNoIHRvIGhhbmRsZSBhbnkgZXhjaGFuZ2VzIG5vdAorICogaGFuZGxlZCBieSBvdGhlciBFTXMuIFRoZSBub24tZGVmYXVsdCBFTXMgd291bGQgYmUgYWRkZWQgdG8gdGhlCisgKiBhbmNob3IgbGlzdCBieSBIVyB0aGF0IHByb3ZpZGVzIEZDb0Ugb2ZmbG9hZHMuCisgKi8KIHN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgewogCXN0cnVjdCBsaXN0X2hlYWQgZW1hX2xpc3Q7CiAJc3RydWN0IGZjX2V4Y2hfbWdyICptcDsKQEAgLTEwOCw3ICsxMzQsNiBAQAogCQkJICBlbnVtIGZjX2Vsc19yanRfZXhwbGFuKTsKIHN0YXRpYyB2b2lkIGZjX2V4Y2hfZWxzX3JlYyhzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqKTsKIHN0YXRpYyB2b2lkIGZjX2V4Y2hfZWxzX3JycShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqKTsKLXN0YXRpYyBzdHJ1Y3QgZmNfc2VxICpmY19zZXFfc3RhcnRfbmV4dF9sb2NrZWQoc3RydWN0IGZjX3NlcSAqc3ApOwogCiAvKgogICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gbm90ZXMuCkBAIC0xOTYsNiArMjIxLDE1IEBACiAKICNkZWZpbmUgRkNfVEFCTEVfU0laRSh4KSAgIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCiAKKy8qKgorICogZmNfZXhjaF9uYW1lX2xvb2t1cCgpIC0gTG9va3VwIG5hbWUgYnkgb3Bjb2RlCisgKiBAb3A6CSAgICAgICBPcGNvZGUgdG8gYmUgbG9va2VkIHVwCisgKiBAdGFibGU6ICAgICBPcGNvZGUvbmFtZSB0YWJsZQorICogQG1heF9pbmRleDogSW5kZXggbm90IHRvIGJlIGV4Y2VlZGVkCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGlkZW50aWZ5aW5nCisgKiBhIFJfQ1RMIG9wY29kZS4KKyAqLwogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpmY19leGNoX25hbWVfbG9va3VwKHVuc2lnbmVkIGludCBvcCwgY2hhciAqKnRhYmxlLAogCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4X2luZGV4KQogewpAQCAtMjA4LDI1ICsyNDIsMzQgQEAKIAlyZXR1cm4gbmFtZTsKIH0KIAorLyoqCisgKiBmY19leGNoX3JjdGxfbmFtZSgpIC0gV3JhcHBlciByb3V0aW5lIGZvciBmY19leGNoX25hbWVfbG9va3VwKCkKKyAqIEBvcDogVGhlIG9wY29kZSB0byBiZSBsb29rZWQgdXAKKyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmZjX2V4Y2hfcmN0bF9uYW1lKHVuc2lnbmVkIGludCBvcCkKIHsKIAlyZXR1cm4gZmNfZXhjaF9uYW1lX2xvb2t1cChvcCwgZmNfZXhjaF9yY3RsX25hbWVzLAogCQkJCSAgIEZDX1RBQkxFX1NJWkUoZmNfZXhjaF9yY3RsX25hbWVzKSk7CiB9CiAKLS8qCi0gKiBIb2xkIGFuIGV4Y2hhbmdlIC0ga2VlcCBpdCBmcm9tIGJlaW5nIGZyZWVkLgorLyoqCisgKiBmY19leGNoX2hvbGQoKSAtIEluY3JlbWVudCBhbiBleGNoYW5nZSdzIHJlZmVyZW5jZSBjb3VudAorICogQGVwOiBFY2hhbmdlIHRvIGJlIGhlbGQKICAqLwotc3RhdGljIHZvaWQgZmNfZXhjaF9ob2xkKHN0cnVjdCBmY19leGNoICplcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmY19leGNoX2hvbGQoc3RydWN0IGZjX2V4Y2ggKmVwKQogewogCWF0b21pY19pbmMoJmVwLT5leF9yZWZjbnQpOwogfQogCi0vKgotICogc2V0dXAgZmMgaGRyIGJ5IGluaXRpYWxpemluZyBmZXcgbW9yZSBGQyBoZWFkZXIgZmllbGRzIGFuZCBzb2YvZW9mLgotICogSW5pdGlhbGl6ZWQgZmllbGRzIGJ5IHRoaXMgZnVuYzoKLSAqCS0gZmhfb3hfaWQsIGZoX3J4X2lkLCBmaF9zZXFfaWQsIGZoX3NlcV9jbnQKLSAqCS0gc29mIGFuZCBlb2YKKy8qKgorICogZmNfZXhjaF9zZXR1cF9oZHIoKSAtIEluaXRpYWxpemUgYSBGQyBoZWFkZXIgYnkgaW5pdGlhbGl6aW5nIHNvbWUgZmllbGRzCisgKgkJCSBhbmQgZGV0ZXJtaW5lIFNPRiBhbmQgRU9GLgorICogQGVwOgkgICBUaGUgZXhjaGFuZ2UgdG8gdGhhdCB3aWxsIHVzZSB0aGUgaGVhZGVyCisgKiBAZnA6CSAgIFRoZSBmcmFtZSB3aG9zZSBoZWFkZXIgaXMgdG8gYmUgbW9kaWZpZWQKKyAqIEBmX2N0bDogRl9DVEwgYml0cyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGZyYW1lIGhlYWRlcgorICoKKyAqIFRoZSBmaWVsZHMgaW5pdGlhbGl6ZWQgYnkgdGhpcyByb3V0aW5lIGFyZTogZmhfb3hfaWQsIGZoX3J4X2lkLAorICogZmhfc2VxX2lkLCBmaF9zZXFfY250IGFuZCB0aGUgU09GIGFuZCBFT0YuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfc2V0dXBfaGRyKHN0cnVjdCBmY19leGNoICplcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKIAkJCSAgICAgIHUzMiBmX2N0bCkKQEAgLTI0Myw3ICsyODYsNyBAQAogCQlpZiAoZmNfc29mX25lZWRzX2FjayhlcC0+Y2xhc3MpKQogCQkJZnJfZW9mKGZwKSA9IEZDX0VPRl9OOwogCQkvKgotCQkgKiBGb3JtIGZfY3RsLgorCQkgKiBGcm9tIEZfQ1RMLgogCQkgKiBUaGUgbnVtYmVyIG9mIGZpbGwgYnl0ZXMgdG8gbWFrZSB0aGUgbGVuZ3RoIGEgNC1ieXRlCiAJCSAqIG11bHRpcGxlIGlzIHRoZSBsb3cgb3JkZXIgMi1iaXRzIG9mIHRoZSBmX2N0bC4KIAkJICogVGhlIGZpbGwgaXRzZWxmIHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQgYnkgdGhlIGZyYW1lCkBAIC0yNzMsMTAgKzMxNiwxMiBAQAogCWZoLT5maF9zZXFfY250ID0gaHRvbnMoZXAtPnNlcS5jbnQpOwogfQogCi0KLS8qCi0gKiBSZWxlYXNlIGEgcmVmZXJlbmNlIHRvIGFuIGV4Y2hhbmdlLgotICogSWYgdGhlIHJlZmNudCBnb2VzIHRvIHplcm8gYW5kIHRoZSBleGNoYW5nZSBpcyBjb21wbGV0ZSwgaXQgaXMgZnJlZWQuCisvKioKKyAqIGZjX2V4Y2hfcmVsZWFzZSgpIC0gRGVjcmVtZW50IGFuIGV4Y2hhbmdlJ3MgcmVmZXJlbmNlIGNvdW50CisgKiBAZXA6IEV4Y2hhbmdlIHRvIGJlIHJlbGVhc2VkCisgKgorICogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8gYW5kIHRoZSBleGNoYW5nZSBpcyBjb21wbGV0ZSwKKyAqIGl0IGlzIGZyZWVkLgogICovCiBzdGF0aWMgdm9pZCBmY19leGNoX3JlbGVhc2Uoc3RydWN0IGZjX2V4Y2ggKmVwKQogewpAQCAtMjkxLDYgKzMzNiwxMCBAQAogCX0KIH0KIAorLyoqCisgKiBmY19leGNoX2RvbmVfbG9ja2VkKCkgLSBDb21wbGV0ZSBhbiBleGNoYW5nZSB3aXRoIHRoZSBleGNoYW5nZSBsb2NrIGhlbGQKKyAqIEBlcDogVGhlIGV4Y2hhbmdlIHRoYXQgaXMgY29tcGxldGUKKyAqLwogc3RhdGljIGludCBmY19leGNoX2RvbmVfbG9ja2VkKHN0cnVjdCBmY19leGNoICplcCkKIHsKIAlpbnQgcmMgPSAxOwpAQCAtMzE1LDYgKzM2NCwxNSBAQAogCXJldHVybiByYzsKIH0KIAorLyoqCisgKiBmY19leGNoX3B0cl9nZXQoKSAtIFJldHVybiBhbiBleGNoYW5nZSBmcm9tIGFuIGV4Y2hhbmdlIHBvb2wKKyAqIEBwb29sOiAgRXhjaGFuZ2UgUG9vbCB0byBnZXQgYW4gZXhjaGFuZ2UgZnJvbQorICogQGluZGV4OiBJbmRleCBvZiB0aGUgZXhjaGFuZ2Ugd2l0aGluIHRoZSBwb29sCisgKgorICogVXNlIHRoZSBpbmRleCB0byBnZXQgYW4gZXhjaGFuZ2UgZnJvbSB3aXRoaW4gYW4gZXhjaGFuZ2UgcG9vbC4gZXhjaGVzCisgKiB3aWxsIHBvaW50IHRvIGFuIGFycmF5IG9mIGV4Y2hhbmdlIHBvaW50ZXJzLiBUaGUgaW5kZXggd2lsbCBzZWxlY3QKKyAqIHRoZSBleGNoYW5nZSB3aXRoaW4gdGhlIGFycmF5LgorICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmY19leGNoICpmY19leGNoX3B0cl9nZXQoc3RydWN0IGZjX2V4Y2hfcG9vbCAqcG9vbCwKIAkJCQkJICAgICAgdTE2IGluZGV4KQogewpAQCAtMzIyLDEyICszODAsMjIgQEAKIAlyZXR1cm4gZXhjaGVzW2luZGV4XTsKIH0KIAorLyoqCisgKiBmY19leGNoX3B0cl9zZXQoKSAtIEFzc2lnbiBhbiBleGNoYW5nZSB0byBhIHNsb3QgaW4gYW4gZXhjaGFuZ2UgcG9vbAorICogQHBvb2w6ICBUaGUgcG9vbCB0byBhc3NpZ24gdGhlIGV4Y2hhbmdlIHRvCisgKiBAaW5kZXg6IFRoZSBpbmRleCBpbiB0aGUgcG9vbCB3aGVyZSB0aGUgZXhjaGFuZ2Ugd2lsbCBiZSBhc3NpZ25lZAorICogQGVwOgkgICBUaGUgZXhjaGFuZ2UgdG8gYXNzaWduIHRvIHRoZSBwb29sCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmY19leGNoX3B0cl9zZXQoc3RydWN0IGZjX2V4Y2hfcG9vbCAqcG9vbCwgdTE2IGluZGV4LAogCQkJCSAgIHN0cnVjdCBmY19leGNoICplcCkKIHsKIAkoKHN0cnVjdCBmY19leGNoICoqKShwb29sICsgMSkpW2luZGV4XSA9IGVwOwogfQogCisvKioKKyAqIGZjX2V4Y2hfZGVsZXRlKCkgLSBEZWxldGUgYW4gZXhjaGFuZ2UKKyAqIEBlcDogVGhlIGV4Y2hhbmdlIHRvIGJlIGRlbGV0ZWQKKyAqLwogc3RhdGljIHZvaWQgZmNfZXhjaF9kZWxldGUoc3RydWN0IGZjX2V4Y2ggKmVwKQogewogCXN0cnVjdCBmY19leGNoX3Bvb2wgKnBvb2w7CkBAIC0zNDMsOCArNDExLDE0IEBACiAJZmNfZXhjaF9yZWxlYXNlKGVwKTsJLyogZHJvcCBob2xkIGZvciBleGNoIGluIG1wICovCiB9CiAKLS8qCi0gKiBJbnRlcm5hbCB2ZXJzaW9uIG9mIGZjX2V4Y2hfdGltZXJfc2V0IC0gdXNlZCB3aXRoIGxvY2sgaGVsZC4KKy8qKgorICogZmNfZXhjaF90aW1lcl9zZXRfbG9ja2VkKCkgLSBTdGFydCBhIHRpbWVyIGZvciBhbiBleGNoYW5nZSB3LyB0aGUKKyAqCQkJCXRoZSBleGNoYW5nZSBsb2NrIGhlbGQKKyAqIEBlcDoJCVRoZSBleGNoYW5nZSB3aG9zZSB0aW1lciB3aWxsIHN0YXJ0CisgKiBAdGltZXJfbXNlYzogVGhlIHRpbWVvdXQgcGVyaW9kCisgKgorICogVXNlZCBmb3IgdXBwZXIgbGV2ZWwgcHJvdG9jb2xzIHRvIHRpbWUgb3V0IHRoZSBleGNoYW5nZS4KKyAqIFRoZSB0aW1lciBpcyBjYW5jZWxsZWQgd2hlbiBpdCBmaXJlcyBvciB3aGVuIHRoZSBleGNoYW5nZSBjb21wbGV0ZXMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmY19leGNoX3RpbWVyX3NldF9sb2NrZWQoc3RydWN0IGZjX2V4Y2ggKmVwLAogCQkJCQkgICAgdW5zaWduZWQgaW50IHRpbWVyX21zZWMpCkBAIC0zNTQsMTcgKzQyOCwxNSBAQAogCiAJRkNfRVhDSF9EQkcoZXAsICJFeGNoYW5nZSB0aW1lciBhcm1lZFxuIik7CiAKLQlpZiAoc2NoZWR1bGVfZGVsYXllZF93b3JrKCZlcC0+dGltZW91dF93b3JrLAotCQkJCSAgbXNlY3NfdG9famlmZmllcyh0aW1lcl9tc2VjKSkpCisJaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhmY19leGNoX3dvcmtxdWV1ZSwgJmVwLT50aW1lb3V0X3dvcmssCisJCQkgICAgICAgbXNlY3NfdG9famlmZmllcyh0aW1lcl9tc2VjKSkpCiAJCWZjX2V4Y2hfaG9sZChlcCk7CQkvKiBob2xkIGZvciB0aW1lciAqLwogfQogCi0vKgotICogU2V0IHRpbWVyIGZvciBhbiBleGNoYW5nZS4KLSAqIFRoZSB0aW1lIGlzIGEgbWluaW11bSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdW50aWwgdGhlIHRpbWVyIGZpcmVzLgotICogVXNlZCBmb3IgdXBwZXIgbGV2ZWwgcHJvdG9jb2xzIHRvIHRpbWUgb3V0IHRoZSBleGNoYW5nZS4KLSAqIFRoZSB0aW1lciBpcyBjYW5jZWxsZWQgd2hlbiBpdCBmaXJlcyBvciB3aGVuIHRoZSBleGNoYW5nZSBjb21wbGV0ZXMuCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgdGltZXIgY291bGRuJ3QgYmUgYWxsb2NhdGVkLgorLyoqCisgKiBmY19leGNoX3RpbWVyX3NldCgpIC0gTG9jayB0aGUgZXhjaGFuZ2UgYW5kIHNldCB0aGUgdGltZXIKKyAqIEBlcDoJCVRoZSBleGNoYW5nZSB3aG9zZSB0aW1lciB3aWxsIHN0YXJ0CisgKiBAdGltZXJfbXNlYzogVGhlIHRpbWVvdXQgcGVyaW9kCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfdGltZXJfc2V0KHN0cnVjdCBmY19leGNoICplcCwgdW5zaWduZWQgaW50IHRpbWVyX21zZWMpCiB7CkBAIC0zNzMsNyArNDQ1LDExNSBAQAogCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CiB9CiAKLWludCBmY19zZXFfZXhjaF9hYm9ydChjb25zdCBzdHJ1Y3QgZmNfc2VxICpyZXFfc3AsIHVuc2lnbmVkIGludCB0aW1lcl9tc2VjKQorLyoqCisgKiBmY19zZXFfc2VuZCgpIC0gU2VuZCBhIGZyYW1lIHVzaW5nIGV4aXN0aW5nIHNlcXVlbmNlL2V4Y2hhbmdlIHBhaXIKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCB0aGUgZXhjaGFuZ2Ugd2lsbCBiZSBzZW50IG9uCisgKiBAc3A6CSAgIFRoZSBzZXF1ZW5jZSB0byBiZSBzZW50CisgKiBAZnA6CSAgIFRoZSBmcmFtZSB0byBiZSBzZW50IG9uIHRoZSBleGNoYW5nZQorICovCitzdGF0aWMgaW50IGZjX3NlcV9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19zZXEgKnNwLAorCQkgICAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3QgZmNfZXhjaCAqZXA7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlpbnQgZXJyb3I7CisJdTMyIGZfY3RsOworCisJZXAgPSBmY19zZXFfZXhjaChzcCk7CisJV0FSTl9PTigoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX1NFUV9JTklUKSAhPSBFU0JfU1RfU0VRX0lOSVQpOworCisJZl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKKwlmY19leGNoX3NldHVwX2hkcihlcCwgZnAsIGZfY3RsKTsKKworCS8qCisJICogdXBkYXRlIHNlcXVlbmNlIGNvdW50IGlmIHRoaXMgZnJhbWUgaXMgY2FycnlpbmcKKwkgKiBtdWx0aXBsZSBGQyBmcmFtZXMgd2hlbiBzZXF1ZW5jZSBvZmZsb2FkIGlzIGVuYWJsZWQKKwkgKiBieSBMTEQuCisJICovCisJaWYgKGZyX21heF9wYXlsb2FkKGZwKSkKKwkJc3AtPmNudCArPSBESVZfUk9VTkRfVVAoKGZyX2xlbihmcCkgLSBzaXplb2YoKmZoKSksCisJCQkJCWZyX21heF9wYXlsb2FkKGZwKSk7CisJZWxzZQorCQlzcC0+Y250Kys7CisKKwkvKgorCSAqIFNlbmQgdGhlIGZyYW1lLgorCSAqLworCWVycm9yID0gbHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBleGNoYW5nZSBhbmQgc2VxdWVuY2UgZmxhZ3MsCisJICogYXNzdW1pbmcgYWxsIGZyYW1lcyBmb3IgdGhlIHNlcXVlbmNlIGhhdmUgYmVlbiBzZW50LgorCSAqIFdlIGNhbiBvbmx5IGJlIGNhbGxlZCB0byBzZW5kIG9uY2UgZm9yIGVhY2ggc2VxdWVuY2UuCisJICovCisJc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJZXAtPmZfY3RsID0gZl9jdGwgJiB+RkNfRkNfRklSU1RfU0VROwkvKiBub3QgZmlyc3Qgc2VxICovCisJaWYgKGZfY3RsICYgKEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCkpCisJCWVwLT5lc2Jfc3RhdCAmPSB+RVNCX1NUX1NFUV9JTklUOworCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGZjX3NlcV9hbGxvYygpIC0gQWxsb2NhdGUgYSBzZXF1ZW5jZSBmb3IgYSBnaXZlbiBleGNoYW5nZQorICogQGVwOgkgICAgVGhlIGV4Y2hhbmdlIHRvIGFsbG9jYXRlIGEgbmV3IHNlcXVlbmNlIGZvcgorICogQHNlcV9pZDogVGhlIHNlcXVlbmNlIElEIHRvIGJlIHVzZWQKKyAqCisgKiBXZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIG9yaWdpbmF0ZWQgc2VxdWVuY2VzIG9uIHRoZSBzYW1lIGV4Y2hhbmdlLgorICogQnkgaW1wbGljYXRpb24sIGFueSBwcmV2aW91c2x5IG9yaWdpbmF0ZWQgc2VxdWVuY2Ugb24gdGhpcyBleGNoYW5nZQorICogaXMgY29tcGxldGUsIGFuZCB3ZSByZWFsbG9jYXRlIHRoZSBzYW1lIHNlcXVlbmNlLgorICovCitzdGF0aWMgc3RydWN0IGZjX3NlcSAqZmNfc2VxX2FsbG9jKHN0cnVjdCBmY19leGNoICplcCwgdTggc2VxX2lkKQoreworCXN0cnVjdCBmY19zZXEgKnNwOworCisJc3AgPSAmZXAtPnNlcTsKKwlzcC0+c3NiX3N0YXQgPSAwOworCXNwLT5jbnQgPSAwOworCXNwLT5pZCA9IHNlcV9pZDsKKwlyZXR1cm4gc3A7Cit9CisKKy8qKgorICogZmNfc2VxX3N0YXJ0X25leHRfbG9ja2VkKCkgLSBBbGxvY2F0ZSBhIG5ldyBzZXF1ZW5jZSBvbiB0aGUgc2FtZQorICoJCQkJZXhjaGFuZ2UgYXMgdGhlIHN1cHBsaWVkIHNlcXVlbmNlCisgKiBAc3A6IFRoZSBzZXF1ZW5jZS9leGNoYW5nZSB0byBnZXQgYSBuZXcgc2VxdWVuY2UgZm9yCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfc2VxICpmY19zZXFfc3RhcnRfbmV4dF9sb2NrZWQoc3RydWN0IGZjX3NlcSAqc3ApCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gZmNfc2VxX2V4Y2goc3ApOworCisJc3AgPSBmY19zZXFfYWxsb2MoZXAsIGVwLT5zZXFfaWQrKyk7CisJRkNfRVhDSF9EQkcoZXAsICJmX2N0bCAlNnggc2VxICUyeFxuIiwKKwkJICAgIGVwLT5mX2N0bCwgc3AtPmlkKTsKKwlyZXR1cm4gc3A7Cit9CisKKy8qKgorICogZmNfc2VxX3N0YXJ0X25leHQoKSAtIExvY2sgdGhlIGV4Y2hhbmdlIGFuZCBnZXQgYSBuZXcgc2VxdWVuY2UKKyAqCQkJIGZvciBhIGdpdmVuIHNlcXVlbmNlL2V4Y2hhbmdlIHBhaXIKKyAqIEBzcDogVGhlIHNlcXVlbmNlL2V4Y2hhbmdlIHRvIGdldCBhIG5ldyBleGNoYW5nZSBmb3IKKyAqLworc3RhdGljIHN0cnVjdCBmY19zZXEgKmZjX3NlcV9zdGFydF9uZXh0KHN0cnVjdCBmY19zZXEgKnNwKQoreworCXN0cnVjdCBmY19leGNoICplcCA9IGZjX3NlcV9leGNoKHNwKTsKKworCXNwaW5fbG9ja19iaCgmZXAtPmV4X2xvY2spOworCXNwID0gZmNfc2VxX3N0YXJ0X25leHRfbG9ja2VkKHNwKTsKKwlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCisJcmV0dXJuIHNwOworfQorCisvKioKKyAqIGZjX3NlcV9leGNoX2Fib3J0KCkgLSBBYm9ydCBhbiBleGNoYW5nZSBhbmQgc2VxdWVuY2UKKyAqIEByZXFfc3A6CVRoZSBzZXF1ZW5jZSB0byBiZSBhYm9ydGVkCisgKiBAdGltZXJfbXNlYzogVGhlIHBlcmlvZCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIGFib3J0aW5nCisgKgorICogR2VuZXJhbGx5IGNhbGxlZCBiZWNhdXNlIG9mIGEgdGltZW91dCBvciBhbiBhYm9ydCBmcm9tIHRoZSB1cHBlciBsYXllci4KKyAqLworc3RhdGljIGludCBmY19zZXFfZXhjaF9hYm9ydChjb25zdCBzdHJ1Y3QgZmNfc2VxICpyZXFfc3AsCisJCQkgICAgIHVuc2lnbmVkIGludCB0aW1lcl9tc2VjKQogewogCXN0cnVjdCBmY19zZXEgKnNwOwogCXN0cnVjdCBmY19leGNoICplcDsKQEAgLTQyMiwxMSArNjAyLDEwIEBACiAJCWVycm9yID0gLUVOT0JVRlM7CiAJcmV0dXJuIGVycm9yOwogfQotRVhQT1JUX1NZTUJPTChmY19zZXFfZXhjaF9hYm9ydCk7CiAKLS8qCi0gKiBFeGNoYW5nZSB0aW1lb3V0IC0gaGFuZGxlIGV4Y2hhbmdlIHRpbWVyIGV4cGlyYXRpb24uCi0gKiBUaGUgdGltZXIgd2lsbCBoYXZlIGJlZW4gY2FuY2VsbGVkIGJlZm9yZSB0aGlzIGlzIGNhbGxlZC4KKy8qKgorICogZmNfZXhjaF90aW1lb3V0KCkgLSBIYW5kbGUgZXhjaGFuZ2UgdGltZXIgZXhwaXJhdGlvbgorICogQHdvcms6IFRoZSB3b3JrX3N0cnVjdCBpZGVudGlmeWluZyB0aGUgZXhjaGFuZ2UgdGhhdCB0aW1lZCBvdXQKICAqLwogc3RhdGljIHZvaWQgZmNfZXhjaF90aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTQ3NCwyOCArNjUzLDEwIEBACiAJZmNfZXhjaF9yZWxlYXNlKGVwKTsKIH0KIAotLyoKLSAqIEFsbG9jYXRlIGEgc2VxdWVuY2UuCi0gKgotICogV2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBvcmlnaW5hdGVkIHNlcXVlbmNlcyBvbiB0aGUgc2FtZSBleGNoYW5nZS4KLSAqIEJ5IGltcGxpY2F0aW9uLCBhbnkgcHJldmlvdXNseSBvcmlnaW5hdGVkIHNlcXVlbmNlIG9uIHRoaXMgZXhjaGFuZ2UKLSAqIGlzIGNvbXBsZXRlLCBhbmQgd2UgcmVhbGxvY2F0ZSB0aGUgc2FtZSBzZXF1ZW5jZS4KLSAqLwotc3RhdGljIHN0cnVjdCBmY19zZXEgKmZjX3NlcV9hbGxvYyhzdHJ1Y3QgZmNfZXhjaCAqZXAsIHU4IHNlcV9pZCkKLXsKLQlzdHJ1Y3QgZmNfc2VxICpzcDsKLQotCXNwID0gJmVwLT5zZXE7Ci0Jc3AtPnNzYl9zdGF0ID0gMDsKLQlzcC0+Y250ID0gMDsKLQlzcC0+aWQgPSBzZXFfaWQ7Ci0JcmV0dXJuIHNwOwotfQotCiAvKioKLSAqIGZjX2V4Y2hfZW1fYWxsb2MoKSAtIGFsbG9jYXRlIGFuIGV4Y2hhbmdlIGZyb20gYSBzcGVjaWZpZWQgRU0uCi0gKiBAbHBvcnQ6CXB0ciB0byB0aGUgbG9jYWwgcG9ydAotICogQG1wOgkJcHRyIHRvIHRoZSBleGNoYW5nZSBtYW5hZ2VyCisgKiBmY19leGNoX2VtX2FsbG9jKCkgLSBBbGxvY2F0ZSBhbiBleGNoYW5nZSBmcm9tIGEgc3BlY2lmaWVkIEVNLgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHRoZSBleGNoYW5nZSBpcyBmb3IKKyAqIEBtcDoJICAgVGhlIGV4Y2hhbmdlIG1hbmFnZXIgdGhhdCB3aWxsIGFsbG9jYXRlIHRoZSBleGNoYW5nZQogICoKICAqIFJldHVybnMgcG9pbnRlciB0byBhbGxvY2F0ZWQgZmNfZXhjaCB3aXRoIGV4Y2ggbG9jayBoZWxkLgogICovCkBAIC01NjMsMTYgKzcyNCwxOCBAQAogfQogCiAvKioKLSAqIGZjX2V4Y2hfYWxsb2MoKSAtIGFsbG9jYXRlIGFuIGV4Y2hhbmdlLgotICogQGxwb3J0OglwdHIgdG8gdGhlIGxvY2FsIHBvcnQKLSAqIEBmcDoJCXB0ciB0byB0aGUgRkMgZnJhbWUKKyAqIGZjX2V4Y2hfYWxsb2MoKSAtIEFsbG9jYXRlIGFuIGV4Y2hhbmdlIGZyb20gYW4gRU0gb24gYQorICoJCSAgICAgbG9jYWwgcG9ydCdzIGxpc3Qgb2YgRU1zLgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHdpbGwgb3duIHRoZSBleGNoYW5nZQorICogQGZwOgkgICBUaGUgRkMgZnJhbWUgdGhhdCB0aGUgZXhjaGFuZ2Ugd2lsbCBiZSBmb3IKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSBsaXN0IG9mIHRoZSBleGNoYW5nZSBtYW5hZ2VyKEVNKQotICogYW5jaG9ycyB0byBzZWxlY3QgYSBFTSBmb3IgbmV3IGV4Y2hhbmdlIGFsbG9jYXRpb24uIFRoZQotICogRU0gaXMgc2VsZWN0ZWQgaGF2aW5nIGVpdGhlciBhIE5VTEwgbWF0Y2ggZnVuY3Rpb24gcG9pbnRlcgotICogb3IgY2FsbCB0byBtYXRjaCBmdW5jdGlvbiByZXR1cm5pbmcgdHJ1ZS4KKyAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIGxpc3Qgb2YgZXhjaGFuZ2UgbWFuYWdlcihFTSkKKyAqIGFuY2hvcnMgdG8gc2VsZWN0IGFuIEVNIGZvciBhIG5ldyBleGNoYW5nZSBhbGxvY2F0aW9uLiBUaGUKKyAqIEVNIGlzIHNlbGVjdGVkIHdoZW4gYSBOVUxMIG1hdGNoIGZ1bmN0aW9uIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQKKyAqIG9yIHdoZW4gYSBjYWxsIHRvIGEgbWF0Y2ggZnVuY3Rpb24gcmV0dXJucyB0cnVlLgogICovCi1zdHJ1Y3QgZmNfZXhjaCAqZmNfZXhjaF9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQorc3RhdGljIHN0cnVjdCBmY19leGNoICpmY19leGNoX2FsbG9jKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkJICAgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgKmVtYTsKIAlzdHJ1Y3QgZmNfZXhjaCAqZXA7CkBAIC01ODYsMTAgKzc0OSwxMSBAQAogCX0KIAlyZXR1cm4gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0woZmNfZXhjaF9hbGxvYyk7CiAKLS8qCi0gKiBMb29rdXAgYW5kIGhvbGQgYW4gZXhjaGFuZ2UuCisvKioKKyAqIGZjX2V4Y2hfZmluZCgpIC0gTG9va3VwIGFuZCBob2xkIGFuIGV4Y2hhbmdlCisgKiBAbXA6CSBUaGUgZXhjaGFuZ2UgbWFuYWdlciB0byBsb29rdXAgdGhlIGV4Y2hhbmdlIGZyb20KKyAqIEB4aWQ6IFRoZSBYSUQgb2YgdGhlIGV4Y2hhbmdlIHRvIGxvb2sgdXAKICAqLwogc3RhdGljIHN0cnVjdCBmY19leGNoICpmY19leGNoX2ZpbmQoc3RydWN0IGZjX2V4Y2hfbWdyICptcCwgdTE2IHhpZCkKIHsKQEAgLTYwOSw3ICs3NzMsMTMgQEAKIAlyZXR1cm4gZXA7CiB9CiAKLXZvaWQgZmNfZXhjaF9kb25lKHN0cnVjdCBmY19zZXEgKnNwKQorCisvKioKKyAqIGZjX2V4Y2hfZG9uZSgpIC0gSW5kaWNhdGUgdGhhdCBhbiBleGNoYW5nZS9zZXF1ZW5jZSB0dXBsZSBpcyBjb21wbGV0ZSBhbmQKKyAqCQkgICAgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSByZWxhdGVkIG9iamVjdHMgbWF5IGJlIGZyZWVkLgorICogQHNwOiBUaGUgc2VxdWVuY2UgdGhhdCBoYXMgY29tcGxldGVkCisgKi8KK3N0YXRpYyB2b2lkIGZjX2V4Y2hfZG9uZShzdHJ1Y3QgZmNfc2VxICpzcCkKIHsKIAlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7CiAJaW50IHJjOwpAQCAtNjIwLDEwICs3OTAsMTMgQEAKIAlpZiAoIXJjKQogCQlmY19leGNoX2RlbGV0ZShlcCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGZjX2V4Y2hfZG9uZSk7CiAKLS8qCi0gKiBBbGxvY2F0ZSBhIG5ldyBleGNoYW5nZSBhcyByZXNwb25kZXIuCisvKioKKyAqIGZjX2V4Y2hfcmVzcCgpIC0gQWxsb2NhdGUgYSBuZXcgZXhjaGFuZ2UgZm9yIGEgcmVzcG9uc2UgZnJhbWUKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCB0aGUgZXhjaGFuZ2Ugd2FzIGZvcgorICogQG1wOgkgICBUaGUgZXhjaGFuZ2UgbWFuYWdlciB0byBhbGxvY2F0ZSB0aGUgZXhjaGFuZ2UgZnJvbQorICogQGZwOgkgICBUaGUgcmVzcG9uc2UgZnJhbWUKKyAqCiAgKiBTZXRzIHRoZSByZXNwb25kZXIgSUQgaW4gdGhlIGZyYW1lIGhlYWRlci4KICAqLwogc3RhdGljIHN0cnVjdCBmY19leGNoICpmY19leGNoX3Jlc3Aoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKQEAgLTY2NCw4ICs4MzcsMTMgQEAKIAlyZXR1cm4gZXA7CiB9CiAKLS8qCi0gKiBGaW5kIGEgc2VxdWVuY2UgZm9yIHJlY2VpdmUgd2hlcmUgdGhlIG90aGVyIGVuZCBpcyBvcmlnaW5hdGluZyB0aGUgc2VxdWVuY2UuCisvKioKKyAqIGZjX3NlcV9sb29rdXBfcmVjaXAoKSAtIEZpbmQgYSBzZXF1ZW5jZSB3aGVyZSB0aGUgb3RoZXIgZW5kCisgKgkJCSAgIG9yaWdpbmF0ZWQgdGhlIHNlcXVlbmNlCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgdGhlIGZyYW1lIHdhcyBzZW50IHRvCisgKiBAbXA6CSAgIFRoZSBFeGNoYW5nZSBNYW5hZ2VyIHRvIGxvb2t1cCB0aGUgZXhjaGFuZ2UgZnJvbQorICogQGZwOgkgICBUaGUgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXF1ZW5jZSB3ZSdyZSBsb29raW5nIGZvcgorICoKICAqIElmIGZjX3BmX3JqdF9yZWFzb24gaXMgRkNfUkpUX05PTkUgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZSBhIGhvbGQKICAqIG9uIHRoZSBlcCB0aGF0IHNob3VsZCBiZSByZWxlYXNlZCBieSB0aGUgY2FsbGVyLgogICovCkBAIC03NzEsMTAgKzk0OSwxMiBAQAogCXJldHVybiByZWplY3Q7CiB9CiAKLS8qCi0gKiBGaW5kIHRoZSBzZXF1ZW5jZSBmb3IgYSBmcmFtZSBiZWluZyByZWNlaXZlZC4KLSAqIFdlIG9yaWdpbmF0ZWQgdGhlIHNlcXVlbmNlLCBzbyBpdCBzaG91bGQgYmUgZm91bmQuCi0gKiBXZSBtYXkgb3IgbWF5IG5vdCBoYXZlIG9yaWdpbmF0ZWQgdGhlIGV4Y2hhbmdlLgorLyoqCisgKiBmY19zZXFfbG9va3VwX29yaWcoKSAtIEZpbmQgYSBzZXF1ZW5jZSB3aGVyZSB0aGlzIGVuZAorICoJCQkgIG9yaWdpbmF0ZWQgdGhlIHNlcXVlbmNlCisgKiBAbXA6CSAgIFRoZSBFeGNoYW5nZSBNYW5hZ2VyIHRvIGxvb2t1cCB0aGUgZXhjaGFuZ2UgZnJvbQorICogQGZwOgkgICBUaGUgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXF1ZW5jZSB3ZSdyZSBsb29raW5nIGZvcgorICoKICAqIERvZXMgbm90IGhvbGQgdGhlIHNlcXVlbmNlIGZvciB0aGUgY2FsbGVyLgogICovCiBzdGF0aWMgc3RydWN0IGZjX3NlcSAqZmNfc2VxX2xvb2t1cF9vcmlnKHN0cnVjdCBmY19leGNoX21nciAqbXAsCkBAIC04MDYsOCArOTg2LDEyIEBACiAJcmV0dXJuIHNwOwogfQogCi0vKgotICogU2V0IGFkZHJlc3NlcyBmb3IgYW4gZXhjaGFuZ2UuCisvKioKKyAqIGZjX2V4Y2hfc2V0X2FkZHIoKSAtIFNldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBJRHMgZm9yIGFuIGV4Y2hhbmdlCisgKiBAZXA6CSAgICAgVGhlIGV4Y2hhbmdlIHRvIHNldCB0aGUgYWRkcmVzc2VzIGZvcgorICogQG9yaWdfaWQ6IFRoZSBvcmlnaW5hdG9yJ3MgSUQKKyAqIEByZXNwX2lkOiBUaGUgcmVzcG9uZGVyJ3MgSUQKKyAqCiAgKiBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZmlyc3Qgc2VxdWVuY2Ugb2YgdGhlIGV4Y2hhbmdlIGlzIHNlbnQuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfc2V0X2FkZHIoc3RydWN0IGZjX2V4Y2ggKmVwLApAQCAtODIzLDc2ICsxMDA3LDE1IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGZjX3NlcSAqZmNfc2VxX3N0YXJ0X25leHRfbG9ja2VkKHN0cnVjdCBmY19zZXEgKnNwKQotewotCXN0cnVjdCBmY19leGNoICplcCA9IGZjX3NlcV9leGNoKHNwKTsKLQotCXNwID0gZmNfc2VxX2FsbG9jKGVwLCBlcC0+c2VxX2lkKyspOwotCUZDX0VYQ0hfREJHKGVwLCAiZl9jdGwgJTZ4IHNlcSAlMnhcbiIsCi0JCSAgICBlcC0+Zl9jdGwsIHNwLT5pZCk7Ci0JcmV0dXJuIHNwOwotfQotLyoKLSAqIEFsbG9jYXRlIGEgbmV3IHNlcXVlbmNlIG9uIHRoZSBzYW1lIGV4Y2hhbmdlIGFzIHRoZSBzdXBwbGllZCBzZXF1ZW5jZS4KLSAqIFRoaXMgd2lsbCBuZXZlciByZXR1cm4gTlVMTC4KKy8qKgorICogZmNfc2VxX2Vsc19yc3Bfc2VuZCgpIC0gU2VuZCBhbiBFTFMgcmVzcG9uc2UgdXNpbmcgaW5mb21hdGlvbiBmcm9tCisgKgkJCSAgIHRoZSBleGlzdGluZyBzZXF1ZW5jZS9leGNoYW5nZS4KKyAqIEBzcDoJICAgICAgVGhlIHNlcXVlbmNlL2V4Y2hhbmdlIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tCisgKiBAZWxzX2NtZDogIFRoZSBFTFMgY29tbWFuZCB0byBiZSBzZW50CisgKiBAZWxzX2RhdGE6IFRoZSBFTFMgZGF0YSB0byBiZSBzZW50CiAgKi8KLXN0cnVjdCBmY19zZXEgKmZjX3NlcV9zdGFydF9uZXh0KHN0cnVjdCBmY19zZXEgKnNwKQotewotCXN0cnVjdCBmY19leGNoICplcCA9IGZjX3NlcV9leGNoKHNwKTsKLQotCXNwaW5fbG9ja19iaCgmZXAtPmV4X2xvY2spOwotCXNwID0gZmNfc2VxX3N0YXJ0X25leHRfbG9ja2VkKHNwKTsKLQlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOwotCi0JcmV0dXJuIHNwOwotfQotRVhQT1JUX1NZTUJPTChmY19zZXFfc3RhcnRfbmV4dCk7Ci0KLWludCBmY19zZXFfc2VuZChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKLXsKLQlzdHJ1Y3QgZmNfZXhjaCAqZXA7Ci0Jc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKLQlpbnQgZXJyb3I7Ci0JdTMyCWZfY3RsOwotCi0JZXAgPSBmY19zZXFfZXhjaChzcCk7Ci0JV0FSTl9PTigoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX1NFUV9JTklUKSAhPSBFU0JfU1RfU0VRX0lOSVQpOwotCi0JZl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKLQlmY19leGNoX3NldHVwX2hkcihlcCwgZnAsIGZfY3RsKTsKLQotCS8qCi0JICogdXBkYXRlIHNlcXVlbmNlIGNvdW50IGlmIHRoaXMgZnJhbWUgaXMgY2FycnlpbmcKLQkgKiBtdWx0aXBsZSBGQyBmcmFtZXMgd2hlbiBzZXF1ZW5jZSBvZmZsb2FkIGlzIGVuYWJsZWQKLQkgKiBieSBMTEQuCi0JICovCi0JaWYgKGZyX21heF9wYXlsb2FkKGZwKSkKLQkJc3AtPmNudCArPSBESVZfUk9VTkRfVVAoKGZyX2xlbihmcCkgLSBzaXplb2YoKmZoKSksCi0JCQkJCWZyX21heF9wYXlsb2FkKGZwKSk7Ci0JZWxzZQotCQlzcC0+Y250Kys7Ci0KLQkvKgotCSAqIFNlbmQgdGhlIGZyYW1lLgotCSAqLwotCWVycm9yID0gbHAtPnR0LmZyYW1lX3NlbmQobHAsIGZwKTsKLQotCS8qCi0JICogVXBkYXRlIHRoZSBleGNoYW5nZSBhbmQgc2VxdWVuY2UgZmxhZ3MsCi0JICogYXNzdW1pbmcgYWxsIGZyYW1lcyBmb3IgdGhlIHNlcXVlbmNlIGhhdmUgYmVlbiBzZW50LgotCSAqIFdlIGNhbiBvbmx5IGJlIGNhbGxlZCB0byBzZW5kIG9uY2UgZm9yIGVhY2ggc2VxdWVuY2UuCi0JICovCi0Jc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7Ci0JZXAtPmZfY3RsID0gZl9jdGwgJiB+RkNfRkNfRklSU1RfU0VROwkvKiBub3QgZmlyc3Qgc2VxICovCi0JaWYgKGZfY3RsICYgKEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCkpCi0JCWVwLT5lc2Jfc3RhdCAmPSB+RVNCX1NUX1NFUV9JTklUOwotCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7Ci0JcmV0dXJuIGVycm9yOwotfQotRVhQT1JUX1NZTUJPTChmY19zZXFfc2VuZCk7Ci0KLXZvaWQgZmNfc2VxX2Vsc19yc3Bfc2VuZChzdHJ1Y3QgZmNfc2VxICpzcCwgZW51bSBmY19lbHNfY21kIGVsc19jbWQsCi0JCQkgc3RydWN0IGZjX3NlcV9lbHNfZGF0YSAqZWxzX2RhdGEpCitzdGF0aWMgdm9pZCBmY19zZXFfZWxzX3JzcF9zZW5kKHN0cnVjdCBmY19zZXEgKnNwLCBlbnVtIGZjX2Vsc19jbWQgZWxzX2NtZCwKKwkJCQlzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhICplbHNfZGF0YSkKIHsKIAlzd2l0Y2ggKGVsc19jbWQpIHsKIAljYXNlIEVMU19MU19SSlQ6CkBAIC05MTEsMTAgKzEwMzQsMTMgQEAKIAkJRkNfRVhDSF9EQkcoZmNfc2VxX2V4Y2goc3ApLCAiSW52YWxpZCBFTFMgQ01EOiV4XG4iLCBlbHNfY21kKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGZjX3NlcV9lbHNfcnNwX3NlbmQpOwogCi0vKgotICogU2VuZCBhIHNlcXVlbmNlLCB3aGljaCBpcyBhbHNvIHRoZSBsYXN0IHNlcXVlbmNlIGluIHRoZSBleGNoYW5nZS4KKy8qKgorICogZmNfc2VxX3NlbmRfbGFzdCgpIC0gU2VuZCBhIHNlcXVlbmNlIHRoYXQgaXMgdGhlIGxhc3QgaW4gdGhlIGV4Y2hhbmdlCisgKiBAc3A6CSAgICAgVGhlIHNlcXVlbmNlIHRoYXQgaXMgdG8gYmUgc2VudAorICogQGZwOgkgICAgIFRoZSBmcmFtZSB0aGF0IHdpbGwgYmUgc2VudCBvbiB0aGUgc2VxdWVuY2UKKyAqIEByY3RsOiAgICBUaGUgUl9DVEwgaW5mb3JtYXRpb24gdG8gYmUgc2VudAorICogQGZoX3R5cGU6IFRoZSBmcmFtZSBoZWFkZXIgdHlwZQogICovCiBzdGF0aWMgdm9pZCBmY19zZXFfc2VuZF9sYXN0KHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAogCQkJICAgICBlbnVtIGZjX3JjdGwgcmN0bCwgZW51bSBmY19maF90eXBlIGZoX3R5cGUpCkBAIC05MjgsOSArMTA1NCwxMiBAQAogCWZjX3NlcV9zZW5kKGVwLT5scCwgc3AsIGZwKTsKIH0KIAotLyoKKy8qKgorICogZmNfc2VxX3NlbmRfYWNrKCkgLSBTZW5kIGFuIGFja25vd2xlZGdlbWVudCB0aGF0IHdlJ3ZlIHJlY2VpdmVkIGEgZnJhbWUKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIHRvIHNlbmQgdGhlIEFDSyBvbgorICogQHJ4X2ZwOiBUaGUgcmVjZWl2ZWQgZnJhbWUgdGhhdCBpcyBiZWluZyBhY2tub2xlZGdlZAorICoKICAqIFNlbmQgQUNLXzEgKG9yIGVxdWl2LikgaW5kaWNhdGluZyB3ZSByZWNlaXZlZCBzb21ldGhpbmcuCi0gKiBUaGUgZnJhbWUgd2UncmUgYWNraW5nIGlzIHN1cHBsaWVkLgogICovCiBzdGF0aWMgdm9pZCBmY19zZXFfc2VuZF9hY2soc3RydWN0IGZjX3NlcSAqc3AsIGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqcnhfZnApCiB7CkBAIC05MzgsMTQgKzEwNjcsMTQgQEAKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpyeF9maDsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscCA9IGVwLT5scDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZXAtPmxwOwogCXVuc2lnbmVkIGludCBmX2N0bDsKIAogCS8qCiAJICogRG9uJ3Qgc2VuZCBBQ0tzIGZvciBjbGFzcyAzLgogCSAqLwogCWlmIChmY19zb2ZfbmVlZHNfYWNrKGZyX3NvZihyeF9mcCkpKSB7Ci0JCWZwID0gZmNfZnJhbWVfYWxsb2MobHAsIDApOworCQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCAwKTsKIAkJaWYgKCFmcCkKIAkJCXJldHVybjsKIApAQCAtOTgwLDEyICsxMTA5LDE2IEBACiAJCWVsc2UKIAkJCWZyX2VvZihmcCkgPSBGQ19FT0ZfTjsKIAotCQkodm9pZCkgbHAtPnR0LmZyYW1lX3NlbmQobHAsIGZwKTsKKwkJbHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKTsKIAl9CiB9CiAKLS8qCi0gKiBTZW5kIEJMUyBSZWplY3QuCisvKioKKyAqIGZjX2V4Y2hfc2VuZF9iYV9yanQoKSAtIFNlbmQgQkxTIFJlamVjdAorICogQHJ4X2ZwOiAgVGhlIGZyYW1lIGJlaW5nIHJlamVjdGVkCisgKiBAcmVhc29uOiBUaGUgcmVhc29uIHRoZSBmcmFtZSBpcyBiZWluZyByZWplY3RlZAorICogQGV4cGxhbjogVGhlIGV4cGxhaW5hdGlvbiBmb3IgdGhlIHJlamVjdGlvbgorICoKICAqIFRoaXMgaXMgZm9yIHJlamVjdGluZyBCQV9BQlRTIG9ubHkuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfc2VuZF9iYV9yanQoc3RydWN0IGZjX2ZyYW1lICpyeF9mcCwKQEAgLTk5NiwxMSArMTEyOSwxMSBAQAogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKnJ4X2ZoOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwogCXN0cnVjdCBmY19iYV9yanQgKnJwOwotCXN0cnVjdCBmY19scG9ydCAqbHA7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAl1bnNpZ25lZCBpbnQgZl9jdGw7CiAKLQlscCA9IGZyX2RldihyeF9mcCk7Ci0JZnAgPSBmY19mcmFtZV9hbGxvYyhscCwgc2l6ZW9mKCpycCkpOworCWxwb3J0ID0gZnJfZGV2KHJ4X2ZwKTsKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2YoKnJwKSk7CiAJaWYgKCFmcCkKIAkJcmV0dXJuOwogCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CkBAIC0xMDQ1LDEzICsxMTc4LDE3IEBACiAJaWYgKGZjX3NvZl9uZWVkc19hY2soZnJfc29mKGZwKSkpCiAJCWZyX2VvZihmcCkgPSBGQ19FT0ZfTjsKIAotCSh2b2lkKSBscC0+dHQuZnJhbWVfc2VuZChscCwgZnApOworCWxwb3J0LT50dC5mcmFtZV9zZW5kKGxwb3J0LCBmcCk7CiB9CiAKLS8qCi0gKiBIYW5kbGUgYW4gaW5jb21pbmcgQUJUUy4gIFRoaXMgd291bGQgYmUgZm9yIHRhcmdldCBtb2RlIHVzdWFsbHksCi0gKiBidXQgY291bGQgYmUgZHVlIHRvIGxvc3QgRkNQIHRyYW5zZmVyIHJlYWR5LCBjb25maXJtIG9yIFJSUS4KLSAqIFdlIGFsd2F5cyBoYW5kbGUgdGhpcyBhcyBhbiBleGNoYW5nZSBhYm9ydCwgaWdub3JpbmcgdGhlIHBhcmFtZXRlci4KKy8qKgorICogZmNfZXhjaF9yZWN2X2FidHMoKSAtIEhhbmRsZSBhbiBpbmNvbWluZyBBQlRTCisgKiBAZXA6CSAgIFRoZSBleGNoYW5nZSB0aGUgYWJvcnQgd2FzIG9uCisgKiBAcnhfZnA6IFRoZSBBQlRTIGZyYW1lCisgKgorICogVGhpcyB3b3VsZCBiZSBmb3IgdGFyZ2V0IG1vZGUgdXN1YWxseSwgYnV0IGNvdWxkIGJlIGR1ZSB0byBsb3N0CisgKiBGQ1AgdHJhbnNmZXIgcmVhZHksIGNvbmZpcm0gb3IgUlJRLiBXZSBhbHdheXMgaGFuZGxlIHRoaXMgYXMgYW4KKyAqIGV4Y2hhbmdlIGFib3J0LCBpZ25vcmluZyB0aGUgcGFyYW1ldGVyLgogICovCiBzdGF0aWMgdm9pZCBmY19leGNoX3JlY3ZfYWJ0cyhzdHJ1Y3QgZmNfZXhjaCAqZXAsIHN0cnVjdCBmY19mcmFtZSAqcnhfZnApCiB7CkBAIC0xMTAwLDEwICsxMjM3LDE0IEBACiAJZmNfZnJhbWVfZnJlZShyeF9mcCk7CiB9CiAKLS8qCi0gKiBIYW5kbGUgcmVjZWl2ZSB3aGVyZSB0aGUgb3RoZXIgZW5kIGlzIG9yaWdpbmF0aW5nIHRoZSBzZXF1ZW5jZS4KKy8qKgorICogZmNfZXhjaF9yZWN2X3JlcSgpIC0gSGFuZGxlciBmb3IgYW4gaW5jb21pbmcgcmVxdWVzdCB3aGVyZSBpcyBvdGhlcgorICoJCQllbmQgaXMgb3JpZ2luYXRpbmcgdGhlIHNlcXVlbmNlCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgcmVjZWl2ZWQgdGhlIHJlcXVlc3QKKyAqIEBtcDoJICAgVGhlIEVNIHRoYXQgdGhlIGV4Y2hhbmdlIGlzIG9uCisgKiBAZnA6CSAgIFRoZSByZXF1ZXN0IGZyYW1lCiAgKi8KLXN0YXRpYyB2b2lkIGZjX2V4Y2hfcmVjdl9yZXEoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGZjX2V4Y2hfbWdyICptcCwKK3N0YXRpYyB2b2lkIGZjX2V4Y2hfcmVjdl9yZXEoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGZjX2V4Y2hfbWdyICptcCwKIAkJCSAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwpAQCAtMTExNCw4ICsxMjU1LDE3IEBACiAJdTMyIGZfY3RsOwogCWVudW0gZmNfcGZfcmp0X3JlYXNvbiByZWplY3Q7CiAKKwkvKiBXZSBjYW4gaGF2ZSB0aGUgd3JvbmcgZmNfbHBvcnQgYXQgdGhpcyBwb2ludCB3aXRoIE5QSVYsIHdoaWNoIGlzIGEKKwkgKiBwcm9ibGVtIG5vdyB0aGF0IHdlIGtub3cgYSBuZXcgZXhjaGFuZ2UgbmVlZHMgdG8gYmUgYWxsb2NhdGVkCisJICovCisJbHBvcnQgPSBmY192cG9ydF9pZF9sb29rdXAobHBvcnQsIG50b2gyNChmaC0+ZmhfZF9pZCkpOworCWlmICghbHBvcnQpIHsKKwkJZmNfZnJhbWVfZnJlZShmcCk7CisJCXJldHVybjsKKwl9CisKIAlmcl9zZXEoZnApID0gTlVMTDsKLQlyZWplY3QgPSBmY19zZXFfbG9va3VwX3JlY2lwKGxwLCBtcCwgZnApOworCXJlamVjdCA9IGZjX3NlcV9sb29rdXBfcmVjaXAobHBvcnQsIG1wLCBmcCk7CiAJaWYgKHJlamVjdCA9PSBGQ19SSlRfTk9ORSkgewogCQlzcCA9IGZyX3NlcShmcCk7CS8qIHNlcXVlbmNlIHdpbGwgYmUgaGVsZCAqLwogCQllcCA9IGZjX3NlcV9leGNoKHNwKTsKQEAgLTExMzgsMTcgKzEyODgsMjEgQEAKIAkJaWYgKGVwLT5yZXNwKQogCQkJZXAtPnJlc3Aoc3AsIGZwLCBlcC0+YXJnKTsKIAkJZWxzZQotCQkJbHAtPnR0Lmxwb3J0X3JlY3YobHAsIHNwLCBmcCk7CisJCQlscG9ydC0+dHQubHBvcnRfcmVjdihscG9ydCwgc3AsIGZwKTsKIAkJZmNfZXhjaF9yZWxlYXNlKGVwKTsJLyogcmVsZWFzZSBmcm9tIGxvb2t1cCAqLwogCX0gZWxzZSB7Ci0JCUZDX0xQT1JUX0RCRyhscCwgImV4Y2gvc2VxIGxvb2t1cCBmYWlsZWQ6IHJlamVjdCAleFxuIiwgcmVqZWN0KTsKKwkJRkNfTFBPUlRfREJHKGxwb3J0LCAiZXhjaC9zZXEgbG9va3VwIGZhaWxlZDogcmVqZWN0ICV4XG4iLAorCQkJICAgICByZWplY3QpOwogCQlmY19mcmFtZV9mcmVlKGZwKTsKIAl9CiB9CiAKLS8qCi0gKiBIYW5kbGUgcmVjZWl2ZSB3aGVyZSB0aGUgb3RoZXIgZW5kIGlzIG9yaWdpbmF0aW5nIHRoZSBzZXF1ZW5jZSBpbgotICogcmVzcG9uc2UgdG8gb3VyIGV4Y2hhbmdlLgorLyoqCisgKiBmY19leGNoX3JlY3Zfc2VxX3Jlc3AoKSAtIEhhbmRsZXIgZm9yIGFuIGluY29taW5nIHJlc3BvbnNlIHdoZXJlIHRoZSBvdGhlcgorICoJCQkgICAgIGVuZCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGUgc2VxdWVuY2UgdGhhdCBpcyBhCisgKgkJCSAgICAgcmVzcG9uc2UgdG8gb3VyIGluaXRpYWwgZXhjaGFuZ2UKKyAqIEBtcDogVGhlIEVNIHRoYXQgdGhlIGV4Y2hhbmdlIGlzIG9uCisgKiBAZnA6IFRoZSByZXNwb25zZSBmcmFtZQogICovCiBzdGF0aWMgdm9pZCBmY19leGNoX3JlY3Zfc2VxX3Jlc3Aoc3RydWN0IGZjX2V4Y2hfbWdyICptcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKQEAgLTEyMzksOCArMTM5MywxMSBAQAogCWZjX2ZyYW1lX2ZyZWUoZnApOwogfQogCi0vKgotICogSGFuZGxlIHJlY2VpdmUgZm9yIGEgc2VxdWVuY2Ugd2hlcmUgb3RoZXIgZW5kIGlzIHJlc3BvbmRpbmcgdG8gb3VyIHNlcXVlbmNlLgorLyoqCisgKiBmY19leGNoX3JlY3ZfcmVzcCgpIC0gSGFuZGxlciBmb3IgYSBzZXF1ZW5jZSB3aGVyZSBvdGhlciBlbmQgaXMKKyAqCQkJIHJlc3BvbmRpbmcgdG8gb3VyIHNlcXVlbmNlCisgKiBAbXA6IFRoZSBFTSB0aGF0IHRoZSBleGNoYW5nZSBpcyBvbgorICogQGZwOiBUaGUgcmVzcG9uc2UgZnJhbWUKICAqLwogc3RhdGljIHZvaWQgZmNfZXhjaF9yZWN2X3Jlc3Aoc3RydWN0IGZjX2V4Y2hfbWdyICptcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKQEAgLTEyNTYsOSArMTQxMywxMyBAQAogCWZjX2ZyYW1lX2ZyZWUoZnApOwogfQogCi0vKgotICogSGFuZGxlIHRoZSByZXNwb25zZSB0byBhbiBBQlRTIGZvciBleGNoYW5nZSBvciBzZXF1ZW5jZS4KLSAqIFRoaXMgY2FuIGJlIEJBX0FDQyBvciBCQV9SSlQuCisvKioKKyAqIGZjX2V4Y2hfYWJ0c19yZXNwKCkgLSBIYW5kbGVyIGZvciBhIHJlc3BvbnNlIHRvIGFuIEFCVAorICogQGVwOiBUaGUgZXhjaGFuZ2UgdGhhdCB0aGUgZnJhbWUgaXMgb24KKyAqIEBmcDogVGhlIHJlc3BvbnNlIGZyYW1lCisgKgorICogVGhpcyByZXNwb25zZSB3b3VsZCBiZSB0byBhbiBBQlRTIGNhbmNlbGxpbmcgYW4gZXhjaGFuZ2Ugb3Igc2VxdWVuY2UuCisgKiBUaGUgcmVzcG9uc2UgY2FuIGJlIGVpdGhlciBCQV9BQ0Mgb3IgQkFfUkpUCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfYWJ0c19yZXNwKHN0cnVjdCBmY19leGNoICplcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKQEAgLTEzMzMsOSArMTQ5NCwxMiBAQAogCiB9CiAKLS8qCi0gKiBSZWNlaXZlIEJMUyBzZXF1ZW5jZS4KLSAqIFRoaXMgaXMgYWx3YXlzIGEgc2VxdWVuY2UgaW5pdGlhdGVkIGJ5IHRoZSByZW1vdGUgc2lkZS4KKy8qKgorICogZmNfZXhjaF9yZWN2X2JscygpIC0gSGFuZGxlciBmb3IgYSBCTFMgc2VxdWVuY2UKKyAqIEBtcDogVGhlIEVNIHRoYXQgdGhlIGV4Y2hhbmdlIGlzIG9uCisgKiBAZnA6IFRoZSByZXF1ZXN0IGZyYW1lCisgKgorICogVGhlIEJMUyBmcmFtZSBpcyBhbHdheXMgYSBzZXF1ZW5jZSBpbml0aWF0ZWQgYnkgdGhlIHJlbW90ZSBzaWRlLgogICogV2UgbWF5IGJlIGVpdGhlciB0aGUgb3JpZ2luYXRvciBvciByZWNpcGllbnQgb2YgdGhlIGV4Y2hhbmdlLgogICovCiBzdGF0aWMgdm9pZCBmY19leGNoX3JlY3ZfYmxzKHN0cnVjdCBmY19leGNoX21nciAqbXAsIHN0cnVjdCBmY19mcmFtZSAqZnApCkBAIC0xMzkyLDggKzE1NTYsMTAgQEAKIAkJZmNfZXhjaF9yZWxlYXNlKGVwKTsJLyogcmVsZWFzZSBob2xkIHRha2VuIGJ5IGZjX2V4Y2hfZmluZCAqLwogfQogCi0vKgotICogQWNjZXB0IHNlcXVlbmNlIHdpdGggTFNfQUNDLgorLyoqCisgKiBmY19zZXFfbHNfYWNjKCkgLSBBY2NlcHQgc2VxdWVuY2Ugd2l0aCBMU19BQ0MKKyAqIEByZXFfc3A6IFRoZSByZXF1ZXN0IHNlcXVlbmNlCisgKgogICogSWYgdGhpcyBmYWlscyBkdWUgdG8gYWxsb2NhdGlvbiBvciB0cmFuc21pdCBjb25nZXN0aW9uLCBhc3N1bWUgdGhlCiAgKiBvcmlnaW5hdG9yIHdpbGwgcmVwZWF0IHRoZSBzZXF1ZW5jZS4KICAqLwpAQCAtMTQxMyw4ICsxNTc5LDEyIEBACiAJfQogfQogCi0vKgotICogUmVqZWN0IHNlcXVlbmNlIHdpdGggRUxTIExTX1JKVC4KKy8qKgorICogZmNfc2VxX2xzX3JqdCgpIC0gUmVqZWN0IGEgc2VxdWVuY2Ugd2l0aCBFTFMgTFNfUkpUCisgKiBAcmVxX3NwOiBUaGUgcmVxdWVzdCBzZXF1ZW5jZQorICogQHJlYXNvbjogVGhlIHJlYXNvbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgcmVqZWN0ZWQKKyAqIEBleHBsYW46IFRoZSBleHBsYWluYXRpb24gZm9yIHRoZSByZWplY3Rpb24KKyAqCiAgKiBJZiB0aGlzIGZhaWxzIGR1ZSB0byBhbGxvY2F0aW9uIG9yIHRyYW5zbWl0IGNvbmdlc3Rpb24sIGFzc3VtZSB0aGUKICAqIG9yaWdpbmF0b3Igd2lsbCByZXBlYXQgdGhlIHNlcXVlbmNlLgogICovCkBAIC0xNDM3LDYgKzE2MDcsMTAgQEAKIAl9CiB9CiAKKy8qKgorICogZmNfZXhjaF9yZXNldCgpIC0gUmVzZXQgYW4gZXhjaGFuZ2UKKyAqIEBlcDogVGhlIGV4Y2hhbmdlIHRvIGJlIHJlc2V0CisgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfcmVzZXQoc3RydWN0IGZjX2V4Y2ggKmVwKQogewogCXN0cnVjdCBmY19zZXEgKnNwOwpAQCAtMTQ0NiwxMiArMTYyMCw2IEBACiAKIAlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKIAllcC0+c3RhdGUgfD0gRkNfRVhfUlNUX0NMRUFOVVA7Ci0JLyoKLQkgKiB3ZSByZWFsbHkgd2FudCB0byBjYWxsIGRlbF90aW1lcl9zeW5jLCBidXQgY2Fubm90IGR1ZQotCSAqIHRvIHRoZSBscG9ydCBjYWxsaW5nIHdpdGggdGhlIGxwb3J0IGxvY2sgaGVsZCAoc29tZSByZXNwCi0JICogZnVuY3Rpb25zIGNhbiBhbHNvIGdyYWIgdGhlIGxwb3J0IGxvY2sgd2hpY2ggY291bGQgY2F1c2UKLQkgKiBhIGRlYWRsb2NrKS4KLQkgKi8KIAlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZXAtPnRpbWVvdXRfd29yaykpCiAJCWF0b21pY19kZWMoJmVwLT5leF9yZWZjbnQpOwkvKiBkcm9wIGhvbGQgZm9yIHRpbWVyICovCiAJcmVzcCA9IGVwLT5yZXNwOwpAQCAtMTQ3MSwxNiArMTYzOSwxNiBAQAogfQogCiAvKioKLSAqIGZjX2V4Y2hfcG9vbF9yZXNldCgpIC0gUmVzZXRzIGFuIHBlciBjcHUgZXhjaGVzIHBvb2wuCi0gKiBAbHBvcnQ6CXB0ciB0byB0aGUgbG9jYWwgcG9ydAotICogQHBvb2w6CXB0ciB0byB0aGUgcGVyIGNwdSBleGNoZXMgcG9vbAotICogQHNpZDoJc291cmNlIEZDIElECi0gKiBAZGlkOglkZXN0aW5hdGlvbiBGQyBJRAorICogZmNfZXhjaF9wb29sX3Jlc2V0KCkgLSBSZXNldCBhIHBlciBjcHUgZXhjaGFuZ2UgcG9vbAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHRoZSBleGNoYW5nZSBwb29sIGlzIG9uCisgKiBAcG9vbDogIFRoZSBleGNoYW5nZSBwb29sIHRvIGJlIHJlc2V0CisgKiBAc2lkOiAgIFRoZSBzb3VyY2UgSUQKKyAqIEBkaWQ6ICAgVGhlIGRlc3RpbmF0aW9uIElECiAgKgotICogUmVzZXRzIGFuIHBlciBjcHUgZXhjaGVzIHBvb2wsIHJlbGVhc2luZyBpdHMgYWxsIHNlcXVlbmNlcwotICogYW5kIGV4Y2hhbmdlcy4gSWYgc2lkIGlzIG5vbi16ZXJvLCB0aGVuIHJlc2V0IG9ubHkgZXhjaGFuZ2VzCi0gKiB3ZSBzb3VyY2VkIGZyb20gdGhhdCBGSUQuIElmIGRpZCBpcyBub24temVybywgcmVzZXQgb25seQotICogZXhjaGFuZ2VzIGRlc3RpbmVkIHRvIHRoYXQgRklELgorICogUmVzZXRzIGEgcGVyIGNwdSBleGNoZXMgcG9vbCwgcmVsZWFzaW5nIGFsbCBvZiBpdHMgc2VxdWVuY2VzCisgKiBhbmQgZXhjaGFuZ2VzLiBJZiBzaWQgaXMgbm9uLXplcm8gdGhlbiByZXNldCBvbmx5IGV4Y2hhbmdlcworICogd2Ugc291cmNlZCBmcm9tIHRoZSBsb2NhbCBwb3J0J3MgRklELiBJZiBkaWQgaXMgbm9uLXplcm8gdGhlbgorICogb25seSByZXNldCBleGNoYW5nZXMgZGVzdGluZWQgZm9yIHRoZSBsb2NhbCBwb3J0J3MgRklELgogICovCiBzdGF0aWMgdm9pZCBmY19leGNoX3Bvb2xfcmVzZXQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKIAkJCSAgICAgICBzdHJ1Y3QgZmNfZXhjaF9wb29sICpwb29sLApAQCAtMTUxNCwxNSArMTY4MiwxNSBAQAogfQogCiAvKioKLSAqIGZjX2V4Y2hfbWdyX3Jlc2V0KCkgLSBSZXNldHMgYWxsIEVNcyBvZiBhIGxwb3J0Ci0gKiBAbHBvcnQ6CXB0ciB0byB0aGUgbG9jYWwgcG9ydAotICogQHNpZDoJc291cmNlIEZDIElECi0gKiBAZGlkOglkZXN0aW5hdGlvbiBGQyBJRAorICogZmNfZXhjaF9tZ3JfcmVzZXQoKSAtIFJlc2V0IGFsbCBFTXMgb2YgYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHdob3NlIEVNcyBhcmUgdG8gYmUgcmVzZXQKKyAqIEBzaWQ6ICAgVGhlIHNvdXJjZSBJRAorICogQGRpZDogICBUaGUgZGVzdGluYXRpb24gSUQKICAqCi0gKiBSZXNldCBhbGwgRU1zIG9mIGEgbHBvcnQsIHJlbGVhc2luZyBpdHMgYWxsIHNlcXVlbmNlcyBhbmQKLSAqIGV4Y2hhbmdlcy4gSWYgc2lkIGlzIG5vbi16ZXJvLCB0aGVuIHJlc2V0IG9ubHkgZXhjaGFuZ2VzCi0gKiB3ZSBzb3VyY2VkIGZyb20gdGhhdCBGSUQuIElmIGRpZCBpcyBub24temVybywgcmVzZXQgb25seQotICogZXhjaGFuZ2VzIGRlc3RpbmVkIHRvIHRoYXQgRklELgorICogUmVzZXQgYWxsIEVNcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBsb2NhbCBwb3J0LiBSZWxlYXNlIGFsbAorICogc2VxdWVuY2VzIGFuZCBleGNoYW5nZXMuIElmIHNpZCBpcyBub24temVybyB0aGVuIHJlc2V0IG9ubHkgdGhlCisgKiBleGNoYW5nZXMgc2VudCBmcm9tIHRoZSBsb2NhbCBwb3J0J3MgRklELiBJZiBkaWQgaXMgbm9uLXplcm8gdGhlbgorICogcmVzZXQgb25seSBleGNoYW5nZXMgZGVzdGluZWQgZm9yIHRoZSBsb2NhbCBwb3J0J3MgRklELgogICovCiB2b2lkIGZjX2V4Y2hfbWdyX3Jlc2V0KHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHUzMiBzaWQsIHUzMiBkaWQpCiB7CkBAIC0xNTM4LDggKzE3MDYsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woZmNfZXhjaF9tZ3JfcmVzZXQpOwogCi0vKgotICogSGFuZGxlIGluY29taW5nIEVMUyBSRUMgLSBSZWFkIEV4Y2hhbmdlIENvbmNpc2UuCisvKioKKyAqIGZjX2V4Y2hfZWxzX3JlYygpIC0gSGFuZGxlciBmb3IgRUxTIFJFQyAoUmVhZCBFeGNoYW5nZSBDb25jaXNlKSByZXF1ZXN0cworICogQHNwOgkgVGhlIHNlcXVlbmNlIHRoZSBSRUMgaXMgb24KKyAqIEByZnA6IFRoZSBSRUMgZnJhbWUKKyAqCiAgKiBOb3RlIHRoYXQgdGhlIHJlcXVlc3RpbmcgcG9ydCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIFNfSUQgaW4gdGhlIHJlcXVlc3QuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfZWxzX3JlYyhzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpyZnApCkBAIC0xNjIxLDEwICsxNzkyLDExIEBACiAJZmNfZnJhbWVfZnJlZShyZnApOwogfQogCi0vKgotICogSGFuZGxlIHJlc3BvbnNlIGZyb20gUlJRLgotICogTm90IG11Y2ggdG8gZG8gaGVyZSwgcmVhbGx5LgotICogU2hvdWxkIHJlcG9ydCBlcnJvcnMuCisvKioKKyAqIGZjX2V4Y2hfcnJxX3Jlc3AoKSAtIEhhbmRsZXIgZm9yIFJSUSByZXNwb25zZXMKKyAqIEBzcDoJIFRoZSBzZXF1ZW5jZSB0aGF0IHRoZSBSUlEgaXMgb24KKyAqIEBmcDoJIFRoZSBSUlEgZnJhbWUKKyAqIEBhcmc6IFRoZSBleGNoYW5nZSB0aGF0IHRoZSBSUlEgaXMgb24KICAqCiAgKiBUT0RPOiBmaXggZXJyb3IgaGFuZGxlci4KICAqLwpAQCAtMTY2NCwyMSArMTgzNiw5OSBAQAogCWZjX2V4Y2hfcmVsZWFzZShhYm9ydGVkX2VwKTsKIH0KIAotLyoKLSAqIFNlbmQgRUxTIFJSUSAtIFJlaW5zdGF0ZSBSZWNvdmVyeSBRdWFsaWZpZXIuCisKKy8qKgorICogZmNfZXhjaF9zZXFfc2VuZCgpIC0gU2VuZCBhIGZyYW1lIHVzaW5nIGEgbmV3IGV4Y2hhbmdlIGFuZCBzZXF1ZW5jZQorICogQGxwb3J0OglUaGUgbG9jYWwgcG9ydCB0byBzZW5kIHRoZSBmcmFtZSBvbgorICogQGZwOgkJVGhlIGZyYW1lIHRvIGJlIHNlbnQKKyAqIEByZXNwOglUaGUgcmVzcG9uc2UgaGFuZGxlciBmb3IgdGhpcyByZXF1ZXN0CisgKiBAZGVzdHJ1Y3RvcjogVGhlIGRlc3RydWN0b3IgZm9yIHRoZSBleGNoYW5nZQorICogQGFyZzoJVGhlIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCB0byB0aGUgcmVzcG9uc2UgaGFuZGxlcgorICogQHRpbWVyX21zZWM6IFRoZSB0aW1lb3V0IHBlcmlvZCBmb3IgdGhlIGV4Y2hhbmdlCisgKgorICogVGhlIGZyYW1lIHBvaW50ZXIgd2l0aCBzb21lIG9mIHRoZSBoZWFkZXIncyBmaWVsZHMgbXVzdCBiZQorICogZmlsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZSwgdGhvc2UgZmllbGRzIGFyZToKKyAqCisgKiAtIHJvdXRpbmcgY29udHJvbAorICogLSBGQyBwb3J0IGRpZAorICogLSBGQyBwb3J0IHNpZAorICogLSBGQyBoZWFkZXIgdHlwZQorICogLSBmcmFtZSBjb250cm9sCisgKiAtIHBhcmFtZXRlciBvciByZWxhdGl2ZSBvZmZzZXQKKyAqLworc3RhdGljIHN0cnVjdCBmY19zZXEgKmZjX2V4Y2hfc2VxX3NlbmQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKKwkJCQkgICAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQkgICAgICAgdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwKKwkJCQkJCSAgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJCQkJICAgIHZvaWQgKmFyZyksCisJCQkJICAgICAgIHZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgZmNfc2VxICosCisJCQkJCQkJICB2b2lkICopLAorCQkJCSAgICAgICB2b2lkICphcmcsIHUzMiB0aW1lcl9tc2VjKQoreworCXN0cnVjdCBmY19leGNoICplcDsKKwlzdHJ1Y3QgZmNfc2VxICpzcCA9IE5VTEw7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJaW50IHJjID0gMTsKKworCWVwID0gZmNfZXhjaF9hbGxvYyhscG9ydCwgZnApOworCWlmICghZXApIHsKKwkJZmNfZnJhbWVfZnJlZShmcCk7CisJCXJldHVybiBOVUxMOworCX0KKwllcC0+ZXNiX3N0YXQgfD0gRVNCX1NUX1NFUV9JTklUOworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJZmNfZXhjaF9zZXRfYWRkcihlcCwgbnRvaDI0KGZoLT5maF9zX2lkKSwgbnRvaDI0KGZoLT5maF9kX2lkKSk7CisJZXAtPnJlc3AgPSByZXNwOworCWVwLT5kZXN0cnVjdG9yID0gZGVzdHJ1Y3RvcjsKKwllcC0+YXJnID0gYXJnOworCWVwLT5yX2FfdG92ID0gRkNfREVGX1JfQV9UT1Y7CisJZXAtPmxwID0gbHBvcnQ7CisJc3AgPSAmZXAtPnNlcTsKKworCWVwLT5maF90eXBlID0gZmgtPmZoX3R5cGU7IC8qIHNhdmUgZm9yIHBvc3NiaWxlIHRpbWVvdXQgaGFuZGxpbmcgKi8KKwllcC0+Zl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKKwlmY19leGNoX3NldHVwX2hkcihlcCwgZnAsIGVwLT5mX2N0bCk7CisJc3AtPmNudCsrOworCisJaWYgKGVwLT54aWQgPD0gbHBvcnQtPmxyb194aWQpCisJCWZjX2ZjcF9kZHBfc2V0dXAoZnJfZnNwKGZwKSwgZXAtPnhpZCk7CisKKwlpZiAodW5saWtlbHkobHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKSkpCisJCWdvdG8gZXJyOworCisJaWYgKHRpbWVyX21zZWMpCisJCWZjX2V4Y2hfdGltZXJfc2V0X2xvY2tlZChlcCwgdGltZXJfbXNlYyk7CisJZXAtPmZfY3RsICY9IH5GQ19GQ19GSVJTVF9TRVE7CS8qIG5vdCBmaXJzdCBzZXEgKi8KKworCWlmIChlcC0+Zl9jdGwgJiBGQ19GQ19TRVFfSU5JVCkKKwkJZXAtPmVzYl9zdGF0ICY9IH5FU0JfU1RfU0VRX0lOSVQ7CisJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlyZXR1cm4gc3A7CitlcnI6CisJcmMgPSBmY19leGNoX2RvbmVfbG9ja2VkKGVwKTsKKwlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCWlmICghcmMpCisJCWZjX2V4Y2hfZGVsZXRlKGVwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBmY19leGNoX3JycSgpIC0gU2VuZCBhbiBFTFMgUlJRIChSZWluc3RhdGUgUmVjb3ZlcnkgUXVhbGlmaWVyKSBjb21tYW5kCisgKiBAZXA6IFRoZSBleGNoYW5nZSB0byBzZW5kIHRoZSBSUlEgb24KKyAqCiAgKiBUaGlzIHRlbGxzIHRoZSByZW1vdGUgcG9ydCB0byBzdG9wIGJsb2NraW5nIHRoZSB1c2Ugb2YKICAqIHRoZSBleGNoYW5nZSBhbmQgdGhlIHNlcV9jbnQgcmFuZ2UuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfcnJxKHN0cnVjdCBmY19leGNoICplcCkKIHsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGZjX2Vsc19ycnEgKnJycTsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwogCXUzMiBkaWQ7CiAKLQlscCA9IGVwLT5scDsKKwlscG9ydCA9IGVwLT5scDsKIAotCWZwID0gZmNfZnJhbWVfYWxsb2MobHAsIHNpemVvZigqcnJxKSk7CisJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwgc2l6ZW9mKCpycnEpKTsKIAlpZiAoIWZwKQogCQlnb3RvIHJldHJ5OwogCkBAIC0xNjk0LDEwICsxOTQ0LDExIEBACiAJCWRpZCA9IGVwLT5zaWQ7CiAKIAlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVRLCBkaWQsCi0JCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHAtPmhvc3QpLCBGQ19UWVBFX0VMUywKKwkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCksIEZDX1RZUEVfRUxTLAogCQkgICAgICAgRkNfRkNfRklSU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklULCAwKTsKIAotCWlmIChmY19leGNoX3NlcV9zZW5kKGxwLCBmcCwgZmNfZXhjaF9ycnFfcmVzcCwgTlVMTCwgZXAsIGxwLT5lX2RfdG92KSkKKwlpZiAoZmNfZXhjaF9zZXFfc2VuZChscG9ydCwgZnAsIGZjX2V4Y2hfcnJxX3Jlc3AsIE5VTEwsIGVwLAorCQkJICAgICBscG9ydC0+ZV9kX3RvdikpCiAJCXJldHVybjsKIAogcmV0cnk6CkBAIC0xNzE0LDEyICsxOTY1LDE0IEBACiB9CiAKIAotLyoKLSAqIEhhbmRsZSBpbmNvbWluZyBFTFMgUlJRIC0gUmVzZXQgUmVjb3ZlcnkgUXVhbGlmaWVyLgorLyoqCisgKiBmY19leGNoX2Vsc19ycnEoKSAtIEhhbmRsZXIgZm9yIEVMUyBSUlEgKFJlc2V0IFJlY292ZXJ5IFF1YWxpZmllcikgcmVxdWVzdHMKKyAqIEBzcDogVGhlIHNlcXVlbmNlIHRoYXQgdGhlIFJSUSBpcyBvbgorICogQGZwOiBUaGUgUlJRIGZyYW1lCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfZWxzX3JycShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKLQlzdHJ1Y3QgZmNfZXhjaCAqZXA7CQkvKiByZXF1ZXN0IG9yIHN1YmplY3QgZXhjaGFuZ2UgKi8KKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBOVUxMOwkvKiByZXF1ZXN0IG9yIHN1YmplY3QgZXhjaGFuZ2UgKi8KIAlzdHJ1Y3QgZmNfZWxzX3JycSAqcnA7CiAJdTMyIHNpZDsKIAl1MTYgeGlkOwpAQCAtMTc2OSwxNyArMjAyMiwyNCBAQAogCSAqIFNlbmQgTFNfQUNDLgogCSAqLwogCWZjX3NlcV9sc19hY2Moc3ApOwotCWZjX2ZyYW1lX2ZyZWUoZnApOwotCXJldHVybjsKKwlnb3RvIG91dDsKIAogdW5sb2NrX3JlamVjdDoKIAlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOwotCWZjX2V4Y2hfcmVsZWFzZShlcCk7CS8qIGRyb3AgaG9sZCBmcm9tIGZjX2V4Y2hfZmluZCAqLwogcmVqZWN0OgogCWZjX3NlcV9sc19yanQoc3AsIEVMU19SSlRfTE9HSUMsIGV4cGxhbik7CitvdXQ6CiAJZmNfZnJhbWVfZnJlZShmcCk7CisJaWYgKGVwKQorCQlmY19leGNoX3JlbGVhc2UoZXApOwkvKiBkcm9wIGhvbGQgZnJvbSBmY19leGNoX2ZpbmQgKi8KIH0KIAorLyoqCisgKiBmY19leGNoX21ncl9hZGQoKSAtIEFkZCBhbiBleGNoYW5nZSBtYW5hZ2VyIHRvIGEgbG9jYWwgcG9ydCdzIGxpc3Qgb2YgRU1zCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIGFkZCB0aGUgZXhjaGFuZ2UgbWFuYWdlciB0bworICogQG1wOgkgICBUaGUgZXhjaGFuZ2UgbWFuYWdlciB0byBiZSBhZGRlZCB0byB0aGUgbG9jYWwgcG9ydAorICogQG1hdGNoOiBUaGUgbWF0Y2ggcm91dGluZSB0aGF0IGluZGljYXRlcyB3aGVuIHRoaXMgRU0gc2hvdWxkIGJlIHVzZWQKKyAqLwogc3RydWN0IGZjX2V4Y2hfbWdyX2FuY2hvciAqZmNfZXhjaF9tZ3JfYWRkKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCiAJCQkJCSAgIHN0cnVjdCBmY19leGNoX21nciAqbXAsCiAJCQkJCSAgIGJvb2wgKCptYXRjaCkoc3RydWN0IGZjX2ZyYW1lICopKQpAQCAtMTc5OSw2ICsyMDU5LDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGZjX2V4Y2hfbWdyX2FkZCk7CiAKKy8qKgorICogZmNfZXhjaF9tZ3JfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBleGNoYW5nZSBtYW5hZ2VyCisgKiBAa3JlZjogVGhlIHJlZmVyZW5jZSB0byB0aGUgRU0gdG8gYmUgZGVzdHJveWVkCisgKi8KIHN0YXRpYyB2b2lkIGZjX2V4Y2hfbWdyX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCiB7CiAJc3RydWN0IGZjX2V4Y2hfbWdyICptcCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZmNfZXhjaF9tZ3IsIGtyZWYpOwpAQCAtMTgwOCw2ICsyMDcyLDEwIEBACiAJa2ZyZWUobXApOwogfQogCisvKioKKyAqIGZjX2V4Y2hfbWdyX2RlbCgpIC0gRGVsZXRlIGFuIEVNIGZyb20gYSBsb2NhbCBwb3J0J3MgbGlzdAorICogQGVtYTogVGhlIGV4Y2hhbmdlIG1hbmFnZXIgYW5jaG9yIGlkZW50aWZ5aW5nIHRoZSBFTSB0byBiZSBkZWxldGVkCisgKi8KIHZvaWQgZmNfZXhjaF9tZ3JfZGVsKHN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgKmVtYSkKIHsKIAkvKiByZW1vdmUgRU0gYW5jaG9yIGZyb20gRU0gYW5jaG9ycyBsaXN0ICovCkBAIC0xODE3LDcgKzIwODUsMzUgQEAKIH0KIEVYUE9SVF9TWU1CT0woZmNfZXhjaF9tZ3JfZGVsKTsKIAotc3RydWN0IGZjX2V4Y2hfbWdyICpmY19leGNoX21ncl9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwLAorLyoqCisgKiBmY19leGNoX21ncl9saXN0X2Nsb25lKCkgLSBTaGFyZSBhbGwgZXhjaGFuZ2UgbWFuYWdlciBvYmplY3RzCisgKiBAc3JjOiBTb3VyY2UgbHBvcnQgdG8gY2xvbmUgZXhjaGFuZ2UgbWFuYWdlcnMgZnJvbQorICogQGRzdDogTmV3IGxwb3J0IHRoYXQgdGFrZXMgcmVmZXJlbmNlcyB0byBhbGwgdGhlIGV4Y2hhbmdlIG1hbmFnZXJzCisgKi8KK2ludCBmY19leGNoX21ncl9saXN0X2Nsb25lKHN0cnVjdCBmY19scG9ydCAqc3JjLCBzdHJ1Y3QgZmNfbHBvcnQgKmRzdCkKK3sKKwlzdHJ1Y3QgZmNfZXhjaF9tZ3JfYW5jaG9yICplbWEsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVtYSwgJnNyYy0+ZW1hX2xpc3QsIGVtYV9saXN0KSB7CisJCWlmICghZmNfZXhjaF9tZ3JfYWRkKGRzdCwgZW1hLT5tcCwgZW1hLT5tYXRjaCkpCisJCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVtYSwgdG1wLCAmZHN0LT5lbWFfbGlzdCwgZW1hX2xpc3QpCisJCWZjX2V4Y2hfbWdyX2RlbChlbWEpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIGZjX2V4Y2hfbWdyX2FsbG9jKCkgLSBBbGxvY2F0ZSBhbiBleGNoYW5nZSBtYW5hZ2VyCisgKiBAbHBvcnQ6ICAgVGhlIGxvY2FsIHBvcnQgdGhhdCB0aGUgbmV3IEVNIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoCisgKiBAY2xhc3M6ICAgVGhlIGRlZmF1bHQgRkMgY2xhc3MgZm9yIG5ldyBleGNoYW5nZXMKKyAqIEBtaW5feGlkOiBUaGUgbWluaW11bSBYSUQgZm9yIGV4Y2hhbmdlcyBmcm9tIHRoZSBuZXcgRU0KKyAqIEBtYXhfeGlkOiBUaGUgbWF4aW11bSBYSUQgZm9yIGV4Y2hhbmdlcyBmcm9tIHRoZSBuZXcgRU0KKyAqIEBtYXRjaDogICBUaGUgbWF0Y2ggcm91dGluZSBmb3IgdGhlIG5ldyBFTQorICovCitzdHJ1Y3QgZmNfZXhjaF9tZ3IgKmZjX2V4Y2hfbWdyX2FsbG9jKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCiAJCQkJICAgICAgZW51bSBmY19jbGFzcyBjbGFzcywKIAkJCQkgICAgICB1MTYgbWluX3hpZCwgdTE2IG1heF94aWQsCiAJCQkJICAgICAgYm9vbCAoKm1hdGNoKShzdHJ1Y3QgZmNfZnJhbWUgKikpCkBAIC0xODMwLDcgKzIxMjYsNyBAQAogCiAJaWYgKG1heF94aWQgPD0gbWluX3hpZCB8fCBtYXhfeGlkID09IEZDX1hJRF9VTktOT1dOIHx8CiAJICAgIChtaW5feGlkICYgZmNfY3B1X21hc2spICE9IDApIHsKLQkJRkNfTFBPUlRfREJHKGxwLCAiSW52YWxpZCBtaW5feGlkIDB4OiV4IGFuZCBtYXhfeGlkIDB4OiV4XG4iLAorCQlGQ19MUE9SVF9EQkcobHBvcnQsICJJbnZhbGlkIG1pbl94aWQgMHg6JXggYW5kIG1heF94aWQgMHg6JXhcbiIsCiAJCQkgICAgIG1pbl94aWQsIG1heF94aWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xODczLDcgKzIxNjksNyBAQAogCX0KIAogCWtyZWZfaW5pdCgmbXAtPmtyZWYpOwotCWlmICghZmNfZXhjaF9tZ3JfYWRkKGxwLCBtcCwgbWF0Y2gpKSB7CisJaWYgKCFmY19leGNoX21ncl9hZGQobHBvcnQsIG1wLCBtYXRjaCkpIHsKIAkJZnJlZV9wZXJjcHUobXAtPnBvb2wpOwogCQlnb3RvIGZyZWVfbWVtcG9vbDsKIAl9CkBAIC0xODk0LDc2ICsyMTkwLDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZjX2V4Y2hfbWdyX2FsbG9jKTsKIAorLyoqCisgKiBmY19leGNoX21ncl9mcmVlKCkgLSBGcmVlIGFsbCBleGNoYW5nZSBtYW5hZ2VycyBvbiBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hvc2UgRU1zIGFyZSB0byBiZSBmcmVlZAorICovCiB2b2lkIGZjX2V4Y2hfbWdyX2ZyZWUoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKIAlzdHJ1Y3QgZmNfZXhjaF9tZ3JfYW5jaG9yICplbWEsICpuZXh0OwogCisJZmx1c2hfd29ya3F1ZXVlKGZjX2V4Y2hfd29ya3F1ZXVlKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW1hLCBuZXh0LCAmbHBvcnQtPmVtYV9saXN0LCBlbWFfbGlzdCkKIAkJZmNfZXhjaF9tZ3JfZGVsKGVtYSk7CiB9CiBFWFBPUlRfU1lNQk9MKGZjX2V4Y2hfbWdyX2ZyZWUpOwogCi0KLXN0cnVjdCBmY19zZXEgKmZjX2V4Y2hfc2VxX3NlbmQoc3RydWN0IGZjX2xwb3J0ICpscCwKLQkJCQlzdHJ1Y3QgZmNfZnJhbWUgKmZwLAotCQkJCXZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosCi0JCQkJCSAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCwKLQkJCQkJICAgICB2b2lkICphcmcpLAotCQkJCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgZmNfc2VxICosIHZvaWQgKiksCi0JCQkJdm9pZCAqYXJnLCB1MzIgdGltZXJfbXNlYykKLXsKLQlzdHJ1Y3QgZmNfZXhjaCAqZXA7Ci0Jc3RydWN0IGZjX3NlcSAqc3AgPSBOVUxMOwotCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwotCWludCByYyA9IDE7Ci0KLQllcCA9IGZjX2V4Y2hfYWxsb2MobHAsIGZwKTsKLQlpZiAoIWVwKSB7Ci0JCWZjX2ZyYW1lX2ZyZWUoZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXAtPmVzYl9zdGF0IHw9IEVTQl9TVF9TRVFfSU5JVDsKLQlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwotCWZjX2V4Y2hfc2V0X2FkZHIoZXAsIG50b2gyNChmaC0+Zmhfc19pZCksIG50b2gyNChmaC0+ZmhfZF9pZCkpOwotCWVwLT5yZXNwID0gcmVzcDsKLQllcC0+ZGVzdHJ1Y3RvciA9IGRlc3RydWN0b3I7Ci0JZXAtPmFyZyA9IGFyZzsKLQllcC0+cl9hX3RvdiA9IEZDX0RFRl9SX0FfVE9WOwotCWVwLT5scCA9IGxwOwotCXNwID0gJmVwLT5zZXE7Ci0KLQllcC0+ZmhfdHlwZSA9IGZoLT5maF90eXBlOyAvKiBzYXZlIGZvciBwb3NzYmlsZSB0aW1lb3V0IGhhbmRsaW5nICovCi0JZXAtPmZfY3RsID0gbnRvaDI0KGZoLT5maF9mX2N0bCk7Ci0JZmNfZXhjaF9zZXR1cF9oZHIoZXAsIGZwLCBlcC0+Zl9jdGwpOwotCXNwLT5jbnQrKzsKLQotCWlmIChlcC0+eGlkIDw9IGxwLT5scm9feGlkKQotCQlmY19mY3BfZGRwX3NldHVwKGZyX2ZzcChmcCksIGVwLT54aWQpOwotCi0JaWYgKHVubGlrZWx5KGxwLT50dC5mcmFtZV9zZW5kKGxwLCBmcCkpKQotCQlnb3RvIGVycjsKLQotCWlmICh0aW1lcl9tc2VjKQotCQlmY19leGNoX3RpbWVyX3NldF9sb2NrZWQoZXAsIHRpbWVyX21zZWMpOwotCWVwLT5mX2N0bCAmPSB+RkNfRkNfRklSU1RfU0VROwkvKiBub3QgZmlyc3Qgc2VxICovCi0KLQlpZiAoZXAtPmZfY3RsICYgRkNfRkNfU0VRX0lOSVQpCi0JCWVwLT5lc2Jfc3RhdCAmPSB+RVNCX1NUX1NFUV9JTklUOwotCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7Ci0JcmV0dXJuIHNwOwotZXJyOgotCXJjID0gZmNfZXhjaF9kb25lX2xvY2tlZChlcCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKLQlpZiAoIXJjKQotCQlmY19leGNoX2RlbGV0ZShlcCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGZjX2V4Y2hfc2VxX3NlbmQpOwotCi0vKgotICogUmVjZWl2ZSBhIGZyYW1lCisvKioKKyAqIGZjX2V4Y2hfcmVjdigpIC0gSGFuZGxlciBmb3IgcmVjZWl2ZWQgZnJhbWVzCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBmcDoJICAgVGhlIHJlY2VpdmVkIGZyYW1lCiAgKi8KLXZvaWQgZmNfZXhjaF9yZWN2KHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mcmFtZSAqZnApCit2b2lkIGZjX2V4Y2hfcmVjdihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAJc3RydWN0IGZjX2V4Y2hfbWdyX2FuY2hvciAqZW1hOwpAQCAtMTk3MSw4ICsyMjE3LDggQEAKIAl1MTYgb3hpZDsKIAogCS8qIGxwb3J0IGxvY2sgPyAqLwotCWlmICghbHAgfHwgbHAtPnN0YXRlID09IExQT1JUX1NUX0RJU0FCTEVEKSB7Ci0JCUZDX0xQT1JUX0RCRyhscCwgIlJlY2VpdmluZyBmcmFtZXMgZm9yIGFuIGxwb3J0IHRoYXQgIgorCWlmICghbHBvcnQgfHwgbHBvcnQtPnN0YXRlID09IExQT1JUX1NUX0RJU0FCTEVEKSB7CisJCUZDX0xQT1JUX0RCRyhscG9ydCwgIlJlY2VpdmluZyBmcmFtZXMgZm9yIGFuIGxwb3J0IHRoYXQgIgogCQkJICAgICAiaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGNvcnJlY3RseVxuIik7CiAJCWZjX2ZyYW1lX2ZyZWUoZnApOwogCQlyZXR1cm47CkBAIC0xOTgxLDcgKzIyMjcsNyBAQAogCWZfY3RsID0gbnRvaDI0KGZoLT5maF9mX2N0bCk7CiAJb3hpZCA9IG50b2hzKGZoLT5maF9veF9pZCk7CiAJaWYgKGZfY3RsICYgRkNfRkNfRVhfQ1RYKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZW1hLCAmbHAtPmVtYV9saXN0LCBlbWFfbGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVtYSwgJmxwb3J0LT5lbWFfbGlzdCwgZW1hX2xpc3QpIHsKIAkJCWlmICgob3hpZCA+PSBlbWEtPm1wLT5taW5feGlkKSAmJgogCQkJICAgIChveGlkIDw9IGVtYS0+bXAtPm1heF94aWQpKSB7CiAJCQkJZm91bmQgPSAxOwpAQCAtMTk5MCwxMyArMjIzNiwxMyBAQAogCQl9CiAKIAkJaWYgKCFmb3VuZCkgewotCQkJRkNfTFBPUlRfREJHKGxwLCAiUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIG91dCAiCisJCQlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCByZXNwb25zZSBmb3Igb3V0ICIKIAkJCQkgICAgICJvZiByYW5nZSBveGlkOiVoeFxuIiwgb3hpZCk7CiAJCQlmY19mcmFtZV9mcmVlKGZwKTsKIAkJCXJldHVybjsKIAkJfQogCX0gZWxzZQotCQllbWEgPSBsaXN0X2VudHJ5KGxwLT5lbWFfbGlzdC5wcmV2LCB0eXBlb2YoKmVtYSksIGVtYV9saXN0KTsKKwkJZW1hID0gbGlzdF9lbnRyeShscG9ydC0+ZW1hX2xpc3QucHJldiwgdHlwZW9mKCplbWEpLCBlbWFfbGlzdCk7CiAKIAkvKgogCSAqIElmIGZyYW1lIGlzIG1hcmtlZCBpbnZhbGlkLCBqdXN0IGRyb3AgaXQuCkBAIC0yMDE1LDM3ICsyMjYxLDU2IEBACiAJCWVsc2UgaWYgKGZfY3RsICYgRkNfRkNfU0VRX0NUWCkKIAkJCWZjX2V4Y2hfcmVjdl9yZXNwKGVtYS0+bXAsIGZwKTsKIAkJZWxzZQotCQkJZmNfZXhjaF9yZWN2X3JlcShscCwgZW1hLT5tcCwgZnApOworCQkJZmNfZXhjaF9yZWN2X3JlcShscG9ydCwgZW1hLT5tcCwgZnApOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlGQ19MUE9SVF9EQkcobHAsICJkcm9wcGluZyBpbnZhbGlkIGZyYW1lIChlb2YgJXgpIiwgZnJfZW9mKGZwKSk7CisJCUZDX0xQT1JUX0RCRyhscG9ydCwgImRyb3BwaW5nIGludmFsaWQgZnJhbWUgKGVvZiAleCkiLAorCQkJICAgICBmcl9lb2YoZnApKTsKIAkJZmNfZnJhbWVfZnJlZShmcCk7CiAJfQogfQogRVhQT1JUX1NZTUJPTChmY19leGNoX3JlY3YpOwogCi1pbnQgZmNfZXhjaF9pbml0KHN0cnVjdCBmY19scG9ydCAqbHApCisvKioKKyAqIGZjX2V4Y2hfaW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgZXhjaGFuZ2UgbGF5ZXIgZm9yIGEgbG9jYWwgcG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBpbml0aWFsaXplIHRoZSBleGNoYW5nZSBsYXllciBmb3IKKyAqLworaW50IGZjX2V4Y2hfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCWlmICghbHAtPnR0LnNlcV9zdGFydF9uZXh0KQotCQlscC0+dHQuc2VxX3N0YXJ0X25leHQgPSBmY19zZXFfc3RhcnRfbmV4dDsKKwlpZiAoIWxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dCkKKwkJbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0ID0gZmNfc2VxX3N0YXJ0X25leHQ7CiAKLQlpZiAoIWxwLT50dC5leGNoX3NlcV9zZW5kKQotCQlscC0+dHQuZXhjaF9zZXFfc2VuZCA9IGZjX2V4Y2hfc2VxX3NlbmQ7CisJaWYgKCFscG9ydC0+dHQuZXhjaF9zZXFfc2VuZCkKKwkJbHBvcnQtPnR0LmV4Y2hfc2VxX3NlbmQgPSBmY19leGNoX3NlcV9zZW5kOwogCi0JaWYgKCFscC0+dHQuc2VxX3NlbmQpCi0JCWxwLT50dC5zZXFfc2VuZCA9IGZjX3NlcV9zZW5kOworCWlmICghbHBvcnQtPnR0LnNlcV9zZW5kKQorCQlscG9ydC0+dHQuc2VxX3NlbmQgPSBmY19zZXFfc2VuZDsKIAotCWlmICghbHAtPnR0LnNlcV9lbHNfcnNwX3NlbmQpCi0JCWxwLT50dC5zZXFfZWxzX3JzcF9zZW5kID0gZmNfc2VxX2Vsc19yc3Bfc2VuZDsKKwlpZiAoIWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKQorCQlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZCA9IGZjX3NlcV9lbHNfcnNwX3NlbmQ7CiAKLQlpZiAoIWxwLT50dC5leGNoX2RvbmUpCi0JCWxwLT50dC5leGNoX2RvbmUgPSBmY19leGNoX2RvbmU7CisJaWYgKCFscG9ydC0+dHQuZXhjaF9kb25lKQorCQlscG9ydC0+dHQuZXhjaF9kb25lID0gZmNfZXhjaF9kb25lOwogCi0JaWYgKCFscC0+dHQuZXhjaF9tZ3JfcmVzZXQpCi0JCWxwLT50dC5leGNoX21ncl9yZXNldCA9IGZjX2V4Y2hfbWdyX3Jlc2V0OworCWlmICghbHBvcnQtPnR0LmV4Y2hfbWdyX3Jlc2V0KQorCQlscG9ydC0+dHQuZXhjaF9tZ3JfcmVzZXQgPSBmY19leGNoX21ncl9yZXNldDsKIAotCWlmICghbHAtPnR0LnNlcV9leGNoX2Fib3J0KQotCQlscC0+dHQuc2VxX2V4Y2hfYWJvcnQgPSBmY19zZXFfZXhjaF9hYm9ydDsKKwlpZiAoIWxwb3J0LT50dC5zZXFfZXhjaF9hYm9ydCkKKwkJbHBvcnQtPnR0LnNlcV9leGNoX2Fib3J0ID0gZmNfc2VxX2V4Y2hfYWJvcnQ7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmNfZXhjaF9pbml0KTsKKworLyoqCisgKiBmY19zZXR1cF9leGNoX21ncigpIC0gU2V0dXAgYW4gZXhjaGFuZ2UgbWFuYWdlcgorICovCitpbnQgZmNfc2V0dXBfZXhjaF9tZ3IoKQoreworCWZjX2VtX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJsaWJmY19lbSIsIHNpemVvZihzdHJ1Y3QgZmNfZXhjaCksCisJCQkJCSAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghZmNfZW1fY2FjaGVwKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBmY19jcHVfbWFzayBhbmQgZmNfY3B1X29yZGVyLiBUaGUKQEAgLTIwNjksMjAgKzIzMzQsMTcgQEAKIAl9CiAJZmNfY3B1X21hc2stLTsKIAotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChmY19leGNoX2luaXQpOwotCi1pbnQgZmNfc2V0dXBfZXhjaF9tZ3Iodm9pZCkKLXsKLQlmY19lbV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibGliZmNfZW0iLCBzaXplb2Yoc3RydWN0IGZjX2V4Y2gpLAotCQkJCQkgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKLQlpZiAoIWZjX2VtX2NhY2hlcCkKKwlmY19leGNoX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJmY19leGNoX3dvcmtxdWV1ZSIpOworCWlmICghZmNfZXhjaF93b3JrcXVldWUpCiAJCXJldHVybiAtRU5PTUVNOwogCXJldHVybiAwOwogfQogCi12b2lkIGZjX2Rlc3Ryb3lfZXhjaF9tZ3Iodm9pZCkKKy8qKgorICogZmNfZGVzdHJveV9leGNoX21ncigpIC0gRGVzdHJveSBhbiBleGNoYW5nZSBtYW5hZ2VyCisgKi8KK3ZvaWQgZmNfZGVzdHJveV9leGNoX21ncigpCiB7CisJZGVzdHJveV93b3JrcXVldWUoZmNfZXhjaF93b3JrcXVldWUpOwogCWttZW1fY2FjaGVfZGVzdHJveShmY19lbV9jYWNoZXApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCmluZGV4IDU5YTQ0MDguLmM0YjU4ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKQEAgLTM5LDE1ICszOSw5IEBACiAjaW5jbHVkZSA8c2NzaS9saWJmYy5oPgogI2luY2x1ZGUgPHNjc2kvZmNfZW5jb2RlLmg+CiAKLU1PRFVMRV9BVVRIT1IoIk9wZW4tRkNvRS5vcmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigibGliZmMiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKyNpbmNsdWRlICJmY19saWJmYy5oIgogCi11bnNpZ25lZCBpbnQgZmNfZGVidWdfbG9nZ2luZzsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sb2dnaW5nLCBmY19kZWJ1Z19sb2dnaW5nLCBpbnQsIFNfSVJVR098U19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2xvZ2dpbmcsICJhIGJpdCBtYXNrIG9mIGxvZ2dpbmcgbGV2ZWxzIik7Ci0KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc2NzaV9wa3RfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKnNjc2lfcGt0X2NhY2hlcDsKIAogLyogU1JCIHN0YXRlIGRlZmluaXRpb25zICovCiAjZGVmaW5lIEZDX1NSQl9GUkVFCQkwCQkvKiBjbWQgaXMgZnJlZSAqLwpAQCAtNTgsNyArNTIsNiBAQAogI2RlZmluZSBGQ19TUkJfRElTQ09OVElHCSgxIDw8IDQpCS8qIG5vbi1zZXF1ZW50aWFsIGRhdGEgcmVjdmQgKi8KICNkZWZpbmUgRkNfU1JCX0NPTVBMCQkoMSA8PCA1KQkvKiBmY19pb19jb21wbCBoYXMgYmVlbiBydW4gKi8KICNkZWZpbmUgRkNfU1JCX0ZDUF9QUk9DRVNTSU5HX1RNTyAoMSA8PCA2KQkvKiB0aW1lciBmdW5jdGlvbiBwcm9jZXNzaW5nICovCi0jZGVmaW5lIEZDX1NSQl9OT01FTQkJKDEgPDwgNykJLyogZHJvcHBlZCB0byBvdXQgb2YgbWVtICovCiAKICNkZWZpbmUgRkNfU1JCX1JFQUQJCSgxIDw8IDEpCiAjZGVmaW5lIEZDX1NSQl9XUklURQkJKDEgPDwgMCkKQEAgLTczLDEwICs2NiwyMCBAQAogI2RlZmluZSBDTURfU0NTSV9TVEFUVVMoQ21uZCkJICAgICgoQ21uZCktPlNDcC5TdGF0dXMpCiAjZGVmaW5lIENNRF9SRVNJRF9MRU4oQ21uZCkJICAgICgoQ21uZCktPlNDcC5idWZmZXJzX3Jlc2lkdWFsKQogCisvKioKKyAqIHN0cnVjdCBmY19mY3BfaW50ZXJuYWwgLSBGQ1AgbGF5ZXIgaW50ZXJuYWwgZGF0YQorICogQHNjc2lfcGt0X3Bvb2w6ICBNZW1vcnkgcG9vbCB0byBkcmF3IEZDUCBwYWNrZXRzIGZyb20KKyAqIEBzY3NpX3BrdF9xdWV1ZTogQ3VycmVudCBGQ1AgcGFja2V0cworICogQGxhc3RfY2FuX3F1ZXVlX3JhbXBfZG93bl90aW1lOiByYW1wIGRvd24gdGltZQorICogQGxhc3RfY2FuX3F1ZXVlX3JhbXBfdXBfdGltZTogcmFtcCB1cCB0aW1lCisgKiBAbWF4X2Nhbl9xdWV1ZTogbWF4IGNhbl9xdWV1ZSBzaXplCisgKi8KIHN0cnVjdCBmY19mY3BfaW50ZXJuYWwgewotCW1lbXBvb2xfdAkqc2NzaV9wa3RfcG9vbDsKKwltZW1wb29sX3QJICpzY3NpX3BrdF9wb29sOwogCXN0cnVjdCBsaXN0X2hlYWQgc2NzaV9wa3RfcXVldWU7Ci0JdTgJCXRocm90dGxlZDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY2FuX3F1ZXVlX3JhbXBfZG93bl90aW1lOworCXVuc2lnbmVkIGxvbmcgbGFzdF9jYW5fcXVldWVfcmFtcF91cF90aW1lOworCWludCBtYXhfY2FuX3F1ZXVlOwogfTsKIAogI2RlZmluZSBmY19nZXRfc2NzaV9pbnRlcm5hbCh4KQkoKHN0cnVjdCBmY19mY3BfaW50ZXJuYWwgKikoeCktPnNjc2lfcHJpdikKQEAgLTkwLDkgKzkzLDkgQEAKIHN0YXRpYyB2b2lkIGZjX2ZjcF9yZXNwKHN0cnVjdCBmY19mY3BfcGt0ICosIHN0cnVjdCBmY19mcmFtZSAqKTsKIHN0YXRpYyB2b2lkIGZjX2ZjcF9jb21wbGV0ZV9sb2NrZWQoc3RydWN0IGZjX2ZjcF9wa3QgKik7CiBzdGF0aWMgdm9pZCBmY190bV9kb25lKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosIHZvaWQgKik7Ci1zdGF0aWMgdm9pZCBmY19mY3BfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCk7CitzdGF0aWMgdm9pZCBmY19mY3BfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKiwgc3RydWN0IGZjX2ZyYW1lICopOwogc3RhdGljIHZvaWQgZmNfdGltZW91dF9lcnJvcihzdHJ1Y3QgZmNfZmNwX3BrdCAqKTsKLXN0YXRpYyB2b2lkIGZjX2ZjcF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBmY19mY3BfdGltZW91dCh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyB2b2lkIGZjX2ZjcF9yZWMoc3RydWN0IGZjX2ZjcF9wa3QgKik7CiBzdGF0aWMgdm9pZCBmY19mY3BfcmVjX2Vycm9yKHN0cnVjdCBmY19mY3BfcGt0ICosIHN0cnVjdCBmY19mcmFtZSAqKTsKIHN0YXRpYyB2b2lkIGZjX2ZjcF9yZWNfcmVzcChzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqLCB2b2lkICopOwpAQCAtMTI0LDYgKzEyNyw3IEBACiAjZGVmaW5lIEZDX1NDU0lfVE1fVE9WCQkoMTAgKiBIWikKICNkZWZpbmUgRkNfU0NTSV9SRUNfVE9WCQkoMiAqIEhaKQogI2RlZmluZSBGQ19IT1NUX1JFU0VUX1RJTUVPVVQJKDMwICogSFopCisjZGVmaW5lIEZDX0NBTl9RVUVVRV9QRVJJT0QJKDYwICogSFopCiAKICNkZWZpbmUgRkNfTUFYX0VSUk9SX0NOVAk1CiAjZGVmaW5lIEZDX01BWF9SRUNPVl9SRVRSWQkzCkBAIC0xMzEsMjMgKzEzNSwyMiBAQAogI2RlZmluZSBGQ19GQ1BfREZMVF9RVUVVRV9ERVBUSCAzMgogCiAvKioKLSAqIGZjX2ZjcF9wa3RfYWxsb2MgLSBhbGxvY2F0aW9uIHJvdXRpbmUgZm9yIHNjc2lfcGt0IHBhY2tldAotICogQGxwOgkJZmMgbHBvcnQgc3RydWN0Ci0gKiBAZ2ZwOglnZnAgZmxhZ3MgZm9yIGFsbG9jYXRpb24KKyAqIGZjX2ZjcF9wa3RfYWxsb2MoKSAtIEFsbG9jYXRlIGEgZmNwX3BrdAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHRoZSBGQ1AgcGFja2V0IGlzIGZvcgorICogQGdmcDogICBHRlAgZmxhZ3MgZm9yIGFsbG9jYXRpb24KICAqCi0gKiBUaGlzIGlzIHVzZWQgYnkgdXBwZXIgbGF5ZXIgc2NzaSBkcml2ZXIuCi0gKiBSZXR1cm4gVmFsdWUgOiBzY3NpX3BrdCBzdHJ1Y3R1cmUgb3IgbnVsbCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuCi0gKiBDb250ZXh0CTogY2FsbCBmcm9tIHByb2Nlc3MgY29udGV4dC4gbm8gbG9ja2luZyByZXF1aXJlZC4KKyAqIFJldHVybiB2YWx1ZTogZmNwX3BrdCBzdHJ1Y3R1cmUgb3IgbnVsbCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuCisgKiBDb250ZXh0OgkgQ2FuIGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCwgbm8gbG9jayBpcyByZXF1aXJlZC4KICAqLwotc3RhdGljIHN0cnVjdCBmY19mY3BfcGt0ICpmY19mY3BfcGt0X2FsbG9jKHN0cnVjdCBmY19scG9ydCAqbHAsIGdmcF90IGdmcCkKK3N0YXRpYyBzdHJ1Y3QgZmNfZmNwX3BrdCAqZmNfZmNwX3BrdF9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBnZnBfdCBnZnApCiB7Ci0Jc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscCk7CisJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscG9ydCk7CiAJc3RydWN0IGZjX2ZjcF9wa3QgKmZzcDsKIAogCWZzcCA9IG1lbXBvb2xfYWxsb2Moc2ktPnNjc2lfcGt0X3Bvb2wsIGdmcCk7CiAJaWYgKGZzcCkgewogCQltZW1zZXQoZnNwLCAwLCBzaXplb2YoKmZzcCkpOwotCQlmc3AtPmxwID0gbHA7CisJCWZzcC0+bHAgPSBscG9ydDsKIAkJYXRvbWljX3NldCgmZnNwLT5yZWZfY250LCAxKTsKIAkJaW5pdF90aW1lcigmZnNwLT50aW1lcik7CiAJCUlOSVRfTElTVF9IRUFEKCZmc3AtPmxpc3QpOwpAQCAtMTU3LDEyICsxNjAsMTEgQEAKIH0KIAogLyoqCi0gKiBmY19mY3BfcGt0X3JlbGVhc2UoKSAtIHJlbGVhc2UgaG9sZCBvbiBzY3NpX3BrdCBwYWNrZXQKLSAqIEBmc3A6CWZjcCBwYWNrZXQgc3RydWN0CisgKiBmY19mY3BfcGt0X3JlbGVhc2UoKSAtIFJlbGVhc2UgaG9sZCBvbiBhIGZjcF9wa3QKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRvIGJlIHJlbGVhc2VkCiAgKgotICogVGhpcyBpcyB1c2VkIGJ5IHVwcGVyIGxheWVyIHNjc2kgZHJpdmVyLgotICogQ29udGV4dAk6IGNhbGwgZnJvbSBwcm9jZXNzICBhbmQgaW50ZXJydXB0IGNvbnRleHQuCi0gKgkJICBubyBsb2NraW5nIHJlcXVpcmVkCisgKiBDb250ZXh0OiBDYW4gYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBvciBpbnRlcnJ1cHQgY29udGV4dCwKKyAqCSAgICBubyBsb2NrIGlzIHJlcXVpcmVkLgogICovCiBzdGF0aWMgdm9pZCBmY19mY3BfcGt0X3JlbGVhc2Uoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKIHsKQEAgLTE3MywyMCArMTc1LDI1IEBACiAJfQogfQogCisvKioKKyAqIGZjX2ZjcF9wa3RfaG9sZCgpIC0gSG9sZCBhIGZjcF9wa3QKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRvIGJlIGhlbGQKKyAqLwogc3RhdGljIHZvaWQgZmNfZmNwX3BrdF9ob2xkKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCiB7CiAJYXRvbWljX2luYygmZnNwLT5yZWZfY250KTsKIH0KIAogLyoqCi0gKiBmY19mY3BfcGt0X2Rlc3RvcnkoKSAtIHJlbGVhc2UgaG9sZCBvbiBzY3NpX3BrdCBwYWNrZXQKLSAqIEBzZXE6CQlleGNoYW5nZSBzZXF1ZW5jZQotICogQGZzcDoJZmNwIHBhY2tldCBzdHJ1Y3QKKyAqIGZjX2ZjcF9wa3RfZGVzdG9yeSgpIC0gUmVsZWFzZSBob2xkIG9uIGEgZmNwX3BrdAorICogQHNlcTogVGhlIHNlcXVlbmNlIHRoYXQgdGhlIEZDUCBwYWNrZXQgaXMgb24gKHJlcXVpcmVkIGJ5IGRlc3RydWN0b3IgQVBJKQorICogQGZzcDogVGhlIEZDUCBwYWNrZXQgdG8gYmUgcmVsZWFzZWQKICAqCi0gKiBSZWxlYXNlIGhvbGQgb24gc2NzaV9wa3QgcGFja2V0IHNldCB0byBrZWVwIHNjc2lfcGt0Ci0gKiB0aWxsIEVNIGxheWVyIGV4Y2ggcmVzb3VyY2UgaXMgbm90IGZyZWVkLgotICogQ29udGV4dAk6IGNhbGxlZCBmcm9tIGZyb20gRU0gbGF5ZXIuCi0gKgkJICBubyBsb2NraW5nIHJlcXVpcmVkCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGEgZGVzdHJ1Y3RvciBjYWxsYmFjayBpbiB0aGUgZXhjaF9zZXFfc2VuZCgpCisgKiByb3V0aW5lIG9mIHRoZSBsaWJmYyBUcmFuc3BvcnQgVGVtcGxhdGUuIFRoZSAnc3RydWN0IGZjX3NlcScgaXMgYSByZXF1aXJlZAorICogYXJndW1lbnQgZXZlbiB0aG91Z2ggaXQgaXMgbm90IHVzZWQgYnkgdGhpcyByb3V0aW5lLgorICoKKyAqIENvbnRleHQ6IE5vIGxvY2tpbmcgcmVxdWlyZWQuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2ZjcF9wa3RfZGVzdHJveShzdHJ1Y3QgZmNfc2VxICpzZXEsIHZvaWQgKmZzcCkKIHsKQEAgLTE5NCwxMCArMjAxLDEwIEBACiB9CiAKIC8qKgotICogZmNfZmNwX2xvY2tfcGt0KCkgLSBsb2NrIGEgcGFja2V0IGFuZCBnZXQgYSByZWYgdG8gaXQuCi0gKiBAZnNwOglmY3AgcGFja2V0CisgKiBmY19mY3BfbG9ja19wa3QoKSAtIExvY2sgYSBmY3BfcGt0IGFuZCBpbmNyZWFzZSBpdHMgcmVmZXJlbmNlIGNvdW50CisgKiBAZnNwOiBUaGUgRkNQIHBhY2tldCB0byBiZSBsb2NrZWQgYW5kIGluY3JlbWVudGVkCiAgKgotICogV2Ugc2hvdWxkIG9ubHkgcmV0dXJuIGVycm9yIGlmIHdlIHJldHVybiBhIGNvbW1hbmQgdG8gc2NzaS1tbCBiZWZvcmUKKyAqIFdlIHNob3VsZCBvbmx5IHJldHVybiBlcnJvciBpZiB3ZSByZXR1cm4gYSBjb21tYW5kIHRvIFNDU0ktbWwgYmVmb3JlCiAgKiBnZXR0aW5nIGEgcmVzcG9uc2UuIFRoaXMgY2FuIGhhcHBlbiBpbiBjYXNlcyB3aGVyZSB3ZSBzZW5kIGEgYWJvcnQsIGJ1dAogICogZG8gbm90IHdhaXQgZm9yIHRoZSByZXNwb25zZSBhbmQgdGhlIGFib3J0IGFuZCBjb21tYW5kIGNhbiBiZSBwYXNzaW5nCiAgKiBlYWNoIG90aGVyIG9uIHRoZSB3aXJlL25ldHdvcmstbGF5ZXIuCkBAIC0yMjIsMTggKzIyOSwzMyBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGZjX2ZjcF91bmxvY2tfcGt0KCkgLSBSZWxlYXNlIGEgZmNwX3BrdCdzIGxvY2sgYW5kIGRlY3JlbWVudCBpdHMKKyAqCQkJIHJlZmVyZW5jZSBjb3VudAorICogQGZzcDogVGhlIEZDUCBwYWNrZXQgdG8gYmUgdW5sb2NrZWQgYW5kIGRlY3JlbWVudGVkCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmY19mY3BfdW5sb2NrX3BrdChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQogewogCXNwaW5fdW5sb2NrX2JoKCZmc3AtPnNjc2lfcGt0X2xvY2spOwogCWZjX2ZjcF9wa3RfcmVsZWFzZShmc3ApOwogfQogCisvKioKKyAqIGZjX2ZjcF90aW1lcl9zZXQoKSAtIFN0YXJ0IGEgdGltZXIgZm9yIGEgZmNwX3BrdAorICogQGZzcDogICBUaGUgRkNQIHBhY2tldCB0byBzdGFydCBhIHRpbWVyIGZvcgorICogQGRlbGF5OiBUaGUgdGltZW91dCBwZXJpb2QgZm9yIHRoZSB0aW1lcgorICovCiBzdGF0aWMgdm9pZCBmY19mY3BfdGltZXJfc2V0KHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7CiAJaWYgKCEoZnNwLT5zdGF0ZSAmIEZDX1NSQl9DT01QTCkpCiAJCW1vZF90aW1lcigmZnNwLT50aW1lciwgamlmZmllcyArIGRlbGF5KTsKIH0KIAorLyoqCisgKiBmY19mY3Bfc2VuZF9hYm9ydCgpIC0gU2VuZCBhbiBhYm9ydCBmb3IgZXhjaGFuZ2VzIGFzc29jaWF0ZWQgd2l0aCBhCisgKgkJCSBmY3BfcGt0CisgKiBAZnNwOiBUaGUgRkNQIHBhY2tldCB0byBhYm9ydCBleGNoYW5nZXMgb24KKyAqLwogc3RhdGljIGludCBmY19mY3Bfc2VuZF9hYm9ydChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQogewogCWlmICghZnNwLT5zZXFfcHRyKQpAQCAtMjQzLDkgKzI2NSwxNCBAQAogCXJldHVybiBmc3AtPmxwLT50dC5zZXFfZXhjaF9hYm9ydChmc3AtPnNlcV9wdHIsIDApOwogfQogCi0vKgotICogUmV0cnkgY29tbWFuZC4KLSAqIEFuIGFib3J0IGlzbid0IG5lZWRlZC4KKy8qKgorICogZmNfZmNwX3JldHJ5X2NtZCgpIC0gUmV0cnkgYSBmY3BfcGt0CisgKiBAZnNwOiBUaGUgRkNQIHBhY2tldCB0byBiZSByZXRyaWVkCisgKgorICogU2V0cyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgRkNfRVJST1IgYW5kIHRoZW4gY2FsbHMKKyAqIGZjX2ZjcF9jb21wbGV0ZV9sb2NrZWQoKSB3aGljaCBpbiB0dXJuIGNhbGxzIGZjX2lvX2NvbXBsKCkuCisgKiBmY19pb19jb21wbCgpIHdpbGwgbm90aWZ5IHRoZSBTQ1NJLW1sIHRoYXQgdGhlIEkvTyBpcyBkb25lLgorICogVGhlIFNDU0ktbWwgd2lsbCByZXRyeSB0aGUgY29tbWFuZC4KICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX3JldHJ5X2NtZChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQogewpAQCAtMjYwLDY0ICsyODcsMTQ2IEBACiAJZmNfZmNwX2NvbXBsZXRlX2xvY2tlZChmc3ApOwogfQogCi0vKgotICogZmNfZmNwX2RkcF9zZXR1cCAtIGNhbGxzIHRvIExMRCdzIGRkcF9zZXR1cCB0byBzZXQgdXAgRERQCi0gKiB0cmFuc2ZlciBmb3IgYSByZWFkIEkvTyBpbmRpY2F0ZWQgYnkgdGhlIGZjX2ZjcF9wa3QuCi0gKiBAZnNwOiBwdHIgdG8gdGhlIGZjX2ZjcF9wa3QKLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBpbiBleGNoX3NlcV9zZW5kKCkgd2hlbiB3ZSBoYXZlIGEgbmV3bHkgYWxsb2NhdGVkCi0gKiBleGNoYW5nZSB3aXRoIGEgdmFsaWQgZXhjaGFuZ2UgaWQgdG8gc2V0dXAgZGRwLgotICoKLSAqIHJldHVybnM6IG5vbmUKKy8qKgorICogZmNfZmNwX2RkcF9zZXR1cCgpIC0gQ2FsbHMgYSBMTEQncyBkZHBfc2V0dXAgcm91dGluZSB0byBzZXQgdXAgRERQIGNvbnRleHQKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRoYXQgd2lsbCBtYW5hZ2UgdGhlIEREUCBmcmFtZXMKKyAqIEB4aWQ6IFRoZSBYSUQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBERFAgZXhjaGFuZ2UKICAqLwogdm9pZCBmY19mY3BfZGRwX3NldHVwKHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsIHUxNiB4aWQpCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCiAJaWYgKCFmc3ApCiAJCXJldHVybjsKIAotCWxwID0gZnNwLT5scDsKKwlscG9ydCA9IGZzcC0+bHA7CiAJaWYgKChmc3AtPnJlcV9mbGFncyAmIEZDX1NSQl9SRUFEKSAmJgotCSAgICAobHAtPmxyb19lbmFibGVkKSAmJiAobHAtPnR0LmRkcF9zZXR1cCkpIHsKLQkJaWYgKGxwLT50dC5kZHBfc2V0dXAobHAsIHhpZCwgc2NzaV9zZ2xpc3QoZnNwLT5jbWQpLAotCQkJCSAgICAgc2NzaV9zZ19jb3VudChmc3AtPmNtZCkpKQorCSAgICAobHBvcnQtPmxyb19lbmFibGVkKSAmJiAobHBvcnQtPnR0LmRkcF9zZXR1cCkpIHsKKwkJaWYgKGxwb3J0LT50dC5kZHBfc2V0dXAobHBvcnQsIHhpZCwgc2NzaV9zZ2xpc3QoZnNwLT5jbWQpLAorCQkJCQlzY3NpX3NnX2NvdW50KGZzcC0+Y21kKSkpCiAJCQlmc3AtPnhmZXJfZGRwID0geGlkOwogCX0KIH0KLUVYUE9SVF9TWU1CT0woZmNfZmNwX2RkcF9zZXR1cCk7CiAKLS8qCi0gKiBmY19mY3BfZGRwX2RvbmUgLSBjYWxscyB0byBMTEQncyBkZHBfZG9uZSB0byByZWxlYXNlIGFueQotICogRERQIHJlbGF0ZWQgcmVzb3VyY2VzIGZvciB0aGlzIEkvTyBpZiBpdCBpcyBpbml0aWFsaXplZAotICogYXMgYSBkZHAgdHJhbnNmZXIKLSAqIEBmc3A6IHB0ciB0byB0aGUgZmNfZmNwX3BrdAotICoKLSAqIHJldHVybnM6IG5vbmUKKy8qKgorICogZmNfZmNwX2RkcF9kb25lKCkgLSBDYWxscyBhIExMRCdzIGRkcF9kb25lIHJvdXRpbmUgdG8gcmVsZWFzZSBhbnkKKyAqCQkgICAgICAgRERQIHJlbGF0ZWQgcmVzb3VyY2VzIGZvciBhIGZjcF9wa3QKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRoYXQgRERQIGhhZCBiZWVuIHVzZWQgb24KICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX2RkcF9kb25lKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCiAJaWYgKCFmc3ApCiAJCXJldHVybjsKIAotCWxwID0gZnNwLT5scDsKLQlpZiAoZnNwLT54ZmVyX2RkcCAmJiBscC0+dHQuZGRwX2RvbmUpIHsKLQkJZnNwLT54ZmVyX2xlbiA9IGxwLT50dC5kZHBfZG9uZShscCwgZnNwLT54ZmVyX2RkcCk7Ci0JCWZzcC0+eGZlcl9kZHAgPSAwOworCWlmIChmc3AtPnhmZXJfZGRwID09IEZDX1hJRF9VTktOT1dOKQorCQlyZXR1cm47CisKKwlscG9ydCA9IGZzcC0+bHA7CisJaWYgKGxwb3J0LT50dC5kZHBfZG9uZSkgeworCQlmc3AtPnhmZXJfbGVuID0gbHBvcnQtPnR0LmRkcF9kb25lKGxwb3J0LCBmc3AtPnhmZXJfZGRwKTsKKwkJZnNwLT54ZmVyX2RkcCA9IEZDX1hJRF9VTktOT1dOOwogCX0KIH0KIAorLyoqCisgKiBmY19mY3BfY2FuX3F1ZXVlX3JhbXBfdXAoKSAtIGluY3JlYXNlcyBjYW5fcXVldWUKKyAqIEBscG9ydDogbHBvcnQgdG8gcmFtcCB1cCBjYW5fcXVldWUKKyAqCisgKiBMb2NraW5nIG5vdGVzOiBDYWxsZWQgd2l0aCBTY3NpX0hvc3QgbG9jayBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGZjX2ZjcF9jYW5fcXVldWVfcmFtcF91cChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXN0cnVjdCBmY19mY3BfaW50ZXJuYWwgKnNpID0gZmNfZ2V0X3Njc2lfaW50ZXJuYWwobHBvcnQpOworCWludCBjYW5fcXVldWU7CisKKwlpZiAoc2ktPmxhc3RfY2FuX3F1ZXVlX3JhbXBfdXBfdGltZSAmJgorCSAgICAodGltZV9iZWZvcmUoamlmZmllcywgc2ktPmxhc3RfY2FuX3F1ZXVlX3JhbXBfdXBfdGltZSArCisJCQkgRkNfQ0FOX1FVRVVFX1BFUklPRCkpKQorCQlyZXR1cm47CisKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgc2ktPmxhc3RfY2FuX3F1ZXVlX3JhbXBfZG93bl90aW1lICsKKwkJCUZDX0NBTl9RVUVVRV9QRVJJT0QpKQorCQlyZXR1cm47CisKKwlzaS0+bGFzdF9jYW5fcXVldWVfcmFtcF91cF90aW1lID0gamlmZmllczsKKworCWNhbl9xdWV1ZSA9IGxwb3J0LT5ob3N0LT5jYW5fcXVldWUgPDwgMTsKKwlpZiAoY2FuX3F1ZXVlID49IHNpLT5tYXhfY2FuX3F1ZXVlKSB7CisJCWNhbl9xdWV1ZSA9IHNpLT5tYXhfY2FuX3F1ZXVlOworCQlzaS0+bGFzdF9jYW5fcXVldWVfcmFtcF9kb3duX3RpbWUgPSAwOworCX0KKwlscG9ydC0+aG9zdC0+Y2FuX3F1ZXVlID0gY2FuX3F1ZXVlOworCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgbHBvcnQtPmhvc3QsICJsaWJmYzogaW5jcmVhc2VkICIKKwkJICAgICAiY2FuX3F1ZXVlIHRvICVkLlxuIiwgY2FuX3F1ZXVlKTsKK30KKworLyoqCisgKiBmY19mY3BfY2FuX3F1ZXVlX3JhbXBfZG93bigpIC0gcmVkdWNlcyBjYW5fcXVldWUKKyAqIEBscG9ydDogbHBvcnQgdG8gcmVkdWNlIGNhbl9xdWV1ZQorICoKKyAqIElmIHdlIGFyZSBnZXR0aW5nIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLCB0aGVuIHdlIG1heQorICogYmUgdHJ5aW5nIHRvIGV4ZWN1dGUgdG9vIG1hbnkgY29tbWFuZHMuIFdlIGxldCB0aGUgcnVubmluZworICogY29tbWFuZHMgY29tcGxldGUgb3IgdGltZW91dCwgdGhlbiB0cnkgYWdhaW4gd2l0aCBhIHJlZHVjZWQKKyAqIGNhbl9xdWV1ZS4gRXZlbnR1YWxseSB3ZSB3aWxsIGhpdCB0aGUgcG9pbnQgd2hlcmUgd2UgcnVuCisgKiBvbiBhbGwgcmVzZXJ2ZWQgc3RydWN0cy4KKyAqCisgKiBMb2NraW5nIG5vdGVzOiBDYWxsZWQgd2l0aCBTY3NpX0hvc3QgbG9jayBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGZjX2ZjcF9jYW5fcXVldWVfcmFtcF9kb3duKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscG9ydCk7CisJaW50IGNhbl9xdWV1ZTsKKworCWlmIChzaS0+bGFzdF9jYW5fcXVldWVfcmFtcF9kb3duX3RpbWUgJiYKKwkgICAgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHNpLT5sYXN0X2Nhbl9xdWV1ZV9yYW1wX2Rvd25fdGltZSArCisJCQkgRkNfQ0FOX1FVRVVFX1BFUklPRCkpKQorCQlyZXR1cm47CisKKwlzaS0+bGFzdF9jYW5fcXVldWVfcmFtcF9kb3duX3RpbWUgPSBqaWZmaWVzOworCisJY2FuX3F1ZXVlID0gbHBvcnQtPmhvc3QtPmNhbl9xdWV1ZTsKKwljYW5fcXVldWUgPj49IDE7CisJaWYgKCFjYW5fcXVldWUpCisJCWNhbl9xdWV1ZSA9IDE7CisJbHBvcnQtPmhvc3QtPmNhbl9xdWV1ZSA9IGNhbl9xdWV1ZTsKKwlzaG9zdF9wcmludGsoS0VSTl9FUlIsIGxwb3J0LT5ob3N0LCAibGliZmM6IENvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZS5cbiIKKwkJICAgICAiUmVkdWNpbmcgY2FuX3F1ZXVlIHRvICVkLlxuIiwgY2FuX3F1ZXVlKTsKK30KIAogLyoKLSAqIFJlY2VpdmUgU0NTSSBkYXRhIGZyb20gdGFyZ2V0LgotICogQ2FsbGVkIGFmdGVyIHJlY2VpdmluZyBzb2xpY2l0ZWQgZGF0YS4KKyAqIGZjX2ZjcF9mcmFtZV9hbGxvYygpIC0gIEFsbG9jYXRlcyBmY19mcmFtZSBzdHJ1Y3R1cmUgYW5kIGJ1ZmZlci4KKyAqIEBscG9ydDoJZmMgbHBvcnQgc3RydWN0CisgKiBAbGVuOglwYXlsb2FkIGxlbmd0aAorICoKKyAqIEFsbG9jYXRlcyBmY19mcmFtZSBzdHJ1Y3R1cmUgYW5kIGJ1ZmZlciBidXQgaWYgZmFpbHMgdG8gYWxsb2NhdGUKKyAqIHRoZW4gcmVkdWNlIGNhbl9xdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZmNfZnJhbWUgKmZjX2ZjcF9mcmFtZV9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCQkJICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIGxlbik7CisJaWYgKCFmcCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZShscG9ydC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWZjX2ZjcF9jYW5fcXVldWVfcmFtcF9kb3duKGxwb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShscG9ydC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiBmcDsKK30KKworLyoqCisgKiBmY19mY3BfcmVjdl9kYXRhKCkgLSBIYW5kbGVyIGZvciByZWNlaXZpbmcgU0NTSS1GQ1AgZGF0YSBmcm9tIGEgdGFyZ2V0CisgKiBAZnNwOiBUaGUgRkNQIHBhY2tldCB0aGUgZGF0YSBpcyBvbgorICogQGZwOgkgVGhlIGRhdGEgZnJhbWUKICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX3JlY3ZfZGF0YShzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gZnNwLT5jbWQ7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscCA9IGZzcC0+bHA7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGZzcC0+bHA7CiAJc3RydWN0IGZjb2VfZGV2X3N0YXRzICpzdGF0czsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzaXplX3Qgc3RhcnRfb2Zmc2V0OwpAQCAtMzI3LDcgKzQzNiw3IEBACiAJc2l6ZV90IGxlbjsKIAl2b2lkICpidWY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlzaXplX3QgcmVtYWluaW5nOworCXUzMiBuZW50czsKIAogCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAJb2Zmc2V0ID0gbnRvaGwoZmgtPmZoX3Bhcm1fb2Zmc2V0KTsKQEAgLTM1MSw2NSArNDYwLDI5IEBACiAJaWYgKG9mZnNldCAhPSBmc3AtPnhmZXJfbGVuKQogCQlmc3AtPnN0YXRlIHw9IEZDX1NSQl9ESVNDT05USUc7CiAKLQljcmMgPSAwOwotCWlmIChmcl9mbGFncyhmcCkgJiBGQ1BIRl9DUkNfVU5DSEVDS0VEKQotCQljcmMgPSBjcmMzMih+MCwgKHU4ICopIGZoLCBzaXplb2YoKmZoKSk7Ci0KIAlzZyA9IHNjc2lfc2dsaXN0KHNjKTsKLQlyZW1haW5pbmcgPSBsZW47CisJbmVudHMgPSBzY3NpX3NnX2NvdW50KHNjKTsKIAotCXdoaWxlIChyZW1haW5pbmcgPiAwICYmIHNnKSB7Ci0JCXNpemVfdCBvZmY7Ci0JCXZvaWQgKnBhZ2VfYWRkcjsKLQkJc2l6ZV90IHNnX2J5dGVzOwotCi0JCWlmIChvZmZzZXQgPj0gc2ctPmxlbmd0aCkgewotCQkJb2Zmc2V0IC09IHNnLT5sZW5ndGg7Ci0JCQlzZyA9IHNnX25leHQoc2cpOwotCQkJY29udGludWU7Ci0JCX0KLQkJc2dfYnl0ZXMgPSBtaW4ocmVtYWluaW5nLCBzZy0+bGVuZ3RoIC0gb2Zmc2V0KTsKLQotCQkvKgotCQkgKiBUaGUgc2NhdHRlcmxpc3QgaXRlbSBtYXkgYmUgYmlnZ2VyIHRoYW4gUEFHRV9TSVpFLAotCQkgKiBidXQgd2UgYXJlIGxpbWl0ZWQgdG8gbWFwcGluZyBQQUdFX1NJWkUgYXQgYSB0aW1lLgotCQkgKi8KLQkJb2ZmID0gb2Zmc2V0ICsgc2ctPm9mZnNldDsKLQkJc2dfYnl0ZXMgPSBtaW4oc2dfYnl0ZXMsIChzaXplX3QpCi0JCQkgICAgICAgKFBBR0VfU0laRSAtIChvZmYgJiB+UEFHRV9NQVNLKSkpOwotCQlwYWdlX2FkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSArIChvZmYgPj4gUEFHRV9TSElGVCksCi0JCQkJCUtNX1NPRlRJUlEwKTsKLQkJaWYgKCFwYWdlX2FkZHIpCi0JCQlicmVhazsJCS8qIFhYWCBwYW5pYz8gKi8KLQotCQlpZiAoZnJfZmxhZ3MoZnApICYgRkNQSEZfQ1JDX1VOQ0hFQ0tFRCkKLQkJCWNyYyA9IGNyYzMyKGNyYywgYnVmLCBzZ19ieXRlcyk7Ci0JCW1lbWNweSgoY2hhciAqKXBhZ2VfYWRkciArIChvZmYgJiB+UEFHRV9NQVNLKSwgYnVmLAotCQkgICAgICAgc2dfYnl0ZXMpOwotCi0JCWt1bm1hcF9hdG9taWMocGFnZV9hZGRyLCBLTV9TT0ZUSVJRMCk7Ci0JCWJ1ZiArPSBzZ19ieXRlczsKLQkJb2Zmc2V0ICs9IHNnX2J5dGVzOwotCQlyZW1haW5pbmcgLT0gc2dfYnl0ZXM7Ci0JCWNvcHlfbGVuICs9IHNnX2J5dGVzOwotCX0KLQotCWlmIChmcl9mbGFncyhmcCkgJiBGQ1BIRl9DUkNfVU5DSEVDS0VEKSB7CisJaWYgKCEoZnJfZmxhZ3MoZnApICYgRkNQSEZfQ1JDX1VOQ0hFQ0tFRCkpIHsKKwkJY29weV9sZW4gPSBmY19jb3B5X2J1ZmZlcl90b19zZ2xpc3QoYnVmLCBsZW4sIHNnLCAmbmVudHMsCisJCQkJCQkgICAgJm9mZnNldCwgS01fU09GVElSUTAsIE5VTEwpOworCX0gZWxzZSB7CisJCWNyYyA9IGNyYzMyKH4wLCAodTggKikgZmgsIHNpemVvZigqZmgpKTsKKwkJY29weV9sZW4gPSBmY19jb3B5X2J1ZmZlcl90b19zZ2xpc3QoYnVmLCBsZW4sIHNnLCAmbmVudHMsCisJCQkJCQkgICAgJm9mZnNldCwgS01fU09GVElSUTAsICZjcmMpOwogCQlidWYgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgMCk7Ci0JCWlmIChsZW4gJSA0KSB7CisJCWlmIChsZW4gJSA0KQogCQkJY3JjID0gY3JjMzIoY3JjLCBidWYgKyBsZW4sIDQgLSAobGVuICUgNCkpOwotCQkJbGVuICs9IDQgLSAobGVuICUgNCk7Ci0JCX0KIAogCQlpZiAofmNyYyAhPSBsZTMyX3RvX2NwdShmcl9jcmMoZnApKSkgewogY3JjX2VycjoKLQkJCXN0YXRzID0gZmNfbHBvcnRfZ2V0X3N0YXRzKGxwKTsKKwkJCXN0YXRzID0gZmNfbHBvcnRfZ2V0X3N0YXRzKGxwb3J0KTsKIAkJCXN0YXRzLT5FcnJvckZyYW1lcysrOwogCQkJLyogRklYTUUgLSBwZXIgY3B1IGNvdW50LCBub3QgdG90YWwgY291bnQhICovCiAJCQlpZiAoc3RhdHMtPkludmFsaWRDUkNDb3VudCsrIDwgNSkKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsaWJmYzogQ1JDIGVycm9yIG9uIGRhdGEgIgogCQkJCSAgICAgICAiZnJhbWUgZm9yIHBvcnQgKCU2eClcbiIsCi0JCQkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChscC0+aG9zdCkpOworCQkJCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKIAkJCS8qCiAJCQkgKiBBc3N1bWUgdGhlIGZyYW1lIGlzIHRvdGFsIGdhcmJhZ2UuCiAJCQkgKiBXZSBtYXkgaGF2ZSBjb3BpZWQgaXQgb3ZlciB0aGUgZ29vZCBwYXJ0CkBAIC00MzcsMTggKzUxMCwxNyBAQAogfQogCiAvKioKLSAqIGZjX2ZjcF9zZW5kX2RhdGEoKSAtICBTZW5kIFNDU0kgZGF0YSB0byB0YXJnZXQuCi0gKiBAZnNwOiBwdHIgdG8gZmNfZmNwX3BrdAotICogQHNwOiBwdHIgdG8gdGhpcyBzZXF1ZW5jZQotICogQG9mZnNldDogc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGlzIGRhdGEgcmVxdWVzdAotICogQHNlcV9ibGVuOiB0aGUgYnVyc3QgbGVuZ3RoIGZvciB0aGlzIGRhdGEgcmVxdWVzdAorICogZmNfZmNwX3NlbmRfZGF0YSgpIC0gU2VuZCBTQ1NJIGRhdGEgdG8gYSB0YXJnZXQKKyAqIEBmc3A6ICAgICAgVGhlIEZDUCBwYWNrZXQgdGhlIGRhdGEgaXMgb24KKyAqIEBzcDoJICAgICAgVGhlIHNlcXVlbmNlIHRoZSBkYXRhIGlzIHRvIGJlIHNlbnQgb24KKyAqIEBvZmZzZXQ6ICAgVGhlIHN0YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyBkYXRhIHJlcXVlc3QKKyAqIEBzZXFfYmxlbjogVGhlIGJ1cnN0IGxlbmd0aCBmb3IgdGhpcyBkYXRhIHJlcXVlc3QKICAqCiAgKiBDYWxsZWQgYWZ0ZXIgcmVjZWl2aW5nIGEgVHJhbnNmZXIgUmVhZHkgZGF0YSBkZXNjcmlwdG9yLgotICogaWYgTExEIGlzIGNhcGFibGUgb2Ygc2VxIG9mZmxvYWQgdGhlbiBzZW5kIGRvd24gc2VxX2JsZW4KLSAqIHNpemUgb2YgZGF0YSBpbiBzaW5nbGUgZnJhbWUsIG90aGVyd2lzZSBzZW5kIG11bHRpcGxlIEZDCi0gKiBmcmFtZXMgb2YgbWF4IEZDIGZyYW1lIHBheWxvYWQgc3VwcG9ydGVkIGJ5IHRhcmdldCBwb3J0LgotICoKLSAqIFJldHVybnMgOiAwIGZvciBzdWNjZXNzLgorICogSWYgdGhlIExMRCBpcyBjYXBhYmxlIG9mIHNlcXVlbmNlIG9mZmxvYWQgdGhlbiBzZW5kIGRvd24gdGhlCisgKiBzZXFfYmxlbiBhbW1vdW50IG9mIGRhdGEgaW4gc2luZ2xlIGZyYW1lLCBvdGhlcndpc2Ugc2VuZAorICogbXVsdGlwbGUgZnJhbWVzIG9mIHRoZSBtYXhpbXVtIGZyYW1lIHBheWxvYWQgc3VwcG9ydGVkIGJ5CisgKiB0aGUgdGFyZ2V0IHBvcnQuCiAgKi8KIHN0YXRpYyBpbnQgZmNfZmNwX3NlbmRfZGF0YShzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBzdHJ1Y3QgZmNfc2VxICpzZXEsCiAJCQkgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNlcV9ibGVuKQpAQCAtNDU3LDE2ICs1MjksMTggQEAKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXN0cnVjdCBmY19mcmFtZSAqZnAgPSBOVUxMOwotCXN0cnVjdCBmY19scG9ydCAqbHAgPSBmc3AtPmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBmc3AtPmxwOworCXN0cnVjdCBwYWdlICpwYWdlOwogCXNpemVfdCByZW1haW5pbmc7CiAJc2l6ZV90IHRfYmxlbjsKIAlzaXplX3QgdGxlbjsKIAlzaXplX3Qgc2dfYnl0ZXM7CiAJc2l6ZV90IGZyYW1lX29mZnNldCwgZmhfcGFybV9vZmZzZXQ7CisJc2l6ZV90IG9mZjsKIAlpbnQgZXJyb3I7CiAJdm9pZCAqZGF0YSA9IE5VTEw7CiAJdm9pZCAqcGFnZV9hZGRyOwotCWludCB1c2luZ19zZyA9IGxwLT5zZ19zdXBwOworCWludCB1c2luZ19zZyA9IGxwb3J0LT5zZ19zdXBwOwogCXUzMiBmX2N0bDsKIAogCVdBUk5fT04oc2VxX2JsZW4gPD0gMCk7CkBAIC00ODgsMTAgKzU2MiwxMCBAQAogCSAqIHRvIG1heCBGQyBmcmFtZSBwYXlsb2FkIHByZXZpb3VzbHkgc2V0IGluIGZzcC0+bWF4X3BheWxvYWQuCiAJICovCiAJdF9ibGVuID0gZnNwLT5tYXhfcGF5bG9hZDsKLQlpZiAobHAtPnNlcV9vZmZsb2FkKSB7Ci0JCXRfYmxlbiA9IG1pbihzZXFfYmxlbiwgKHNpemVfdClscC0+bHNvX21heCk7CisJaWYgKGxwb3J0LT5zZXFfb2ZmbG9hZCkgeworCQl0X2JsZW4gPSBtaW4oc2VxX2JsZW4sIChzaXplX3QpbHBvcnQtPmxzb19tYXgpOwogCQlGQ19GQ1BfREJHKGZzcCwgImZzcD0lcDpsc286Ymxlbj0lenggbHNvX21heD0weCV4IHRfYmxlbj0lenhcbiIsCi0JCQkgICBmc3AsIHNlcV9ibGVuLCBscC0+bHNvX21heCwgdF9ibGVuKTsKKwkJCSAgIGZzcCwgc2VxX2JsZW4sIGxwb3J0LT5sc29fbWF4LCB0X2JsZW4pOwogCX0KIAogCVdBUk5fT04odF9ibGVuIDwgRkNfTUlOX01BWF9QQVlMT0FEKTsKQEAgLTUwMyw3ICs1NzcsNyBAQAogCXJlbWFpbmluZyA9IHNlcV9ibGVuOwogCWZoX3Bhcm1fb2Zmc2V0ID0gZnJhbWVfb2Zmc2V0ID0gb2Zmc2V0OwogCXRsZW4gPSAwOwotCXNlcSA9IGxwLT50dC5zZXFfc3RhcnRfbmV4dChzZXEpOworCXNlcSA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChzZXEpOwogCWZfY3RsID0gRkNfRkNfUkVMX09GRjsKIAlXQVJOX09OKCFzZXEpOwogCkBAIC01MjUsNDMgKzU5OSwzNCBAQAogCQkJICovCiAJCQlpZiAodGxlbiAlIDQpCiAJCQkJdXNpbmdfc2cgPSAwOwotCQkJaWYgKHVzaW5nX3NnKSB7Ci0JCQkJZnAgPSBfZmNfZnJhbWVfYWxsb2MobHAsIDApOwotCQkJCWlmICghZnApCi0JCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfSBlbHNlIHsKLQkJCQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwLCB0bGVuKTsKLQkJCQlpZiAoIWZwKQotCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHVzaW5nX3NnID8gMCA6IHRsZW4pOworCQkJaWYgKCFmcCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJCWRhdGEgPSAodm9pZCAqKShmcl9oZHIoZnApKSArCi0JCQkJCXNpemVvZihzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyKTsKLQkJCX0KKwkJCWRhdGEgPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKSArIDE7CiAJCQlmaF9wYXJtX29mZnNldCA9IGZyYW1lX29mZnNldDsKIAkJCWZyX21heF9wYXlsb2FkKGZwKSA9IGZzcC0+bWF4X3BheWxvYWQ7CiAJCX0KKworCQlvZmYgPSBvZmZzZXQgKyBzZy0+b2Zmc2V0OwogCQlzZ19ieXRlcyA9IG1pbih0bGVuLCBzZy0+bGVuZ3RoIC0gb2Zmc2V0KTsKKwkJc2dfYnl0ZXMgPSBtaW4oc2dfYnl0ZXMsCisJCQkgICAgICAgKHNpemVfdCkgKFBBR0VfU0laRSAtIChvZmYgJiB+UEFHRV9NQVNLKSkpOworCQlwYWdlID0gc2dfcGFnZShzZykgKyAob2ZmID4+IFBBR0VfU0hJRlQpOwogCQlpZiAodXNpbmdfc2cpIHsKLQkJCWdldF9wYWdlKHNnX3BhZ2Uoc2cpKTsKKwkJCWdldF9wYWdlKHBhZ2UpOwogCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKGZwX3NrYihmcCksCiAJCQkJCSAgIHNrYl9zaGluZm8oZnBfc2tiKGZwKSktPm5yX2ZyYWdzLAotCQkJCQkgICBzZ19wYWdlKHNnKSwgc2ctPm9mZnNldCArIG9mZnNldCwKLQkJCQkJICAgc2dfYnl0ZXMpOworCQkJCQkgICBwYWdlLCBvZmYgJiB+UEFHRV9NQVNLLCBzZ19ieXRlcyk7CiAJCQlmcF9za2IoZnApLT5kYXRhX2xlbiArPSBzZ19ieXRlczsKIAkJCWZyX2xlbihmcCkgKz0gc2dfYnl0ZXM7CiAJCQlmcF9za2IoZnApLT50cnVlc2l6ZSArPSBQQUdFX1NJWkU7CiAJCX0gZWxzZSB7Ci0JCQlzaXplX3Qgb2ZmID0gb2Zmc2V0ICsgc2ctPm9mZnNldDsKLQogCQkJLyoKIAkJCSAqIFRoZSBzY2F0dGVybGlzdCBpdGVtIG1heSBiZSBiaWdnZXIgdGhhbiBQQUdFX1NJWkUsCiAJCQkgKiBidXQgd2UgbXVzdCBub3QgY3Jvc3MgcGFnZXMgaW5zaWRlIHRoZSBrbWFwLgogCQkJICovCi0JCQlzZ19ieXRlcyA9IG1pbihzZ19ieXRlcywgKHNpemVfdCkgKFBBR0VfU0laRSAtCi0JCQkJCQkJICAgKG9mZiAmIH5QQUdFX01BU0spKSk7Ci0JCQlwYWdlX2FkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSArCi0JCQkJCQkob2ZmID4+IFBBR0VfU0hJRlQpLAotCQkJCQkJS01fU09GVElSUTApOworCQkJcGFnZV9hZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fU09GVElSUTApOwogCQkJbWVtY3B5KGRhdGEsIChjaGFyICopcGFnZV9hZGRyICsgKG9mZiAmIH5QQUdFX01BU0spLAogCQkJICAgICAgIHNnX2J5dGVzKTsKIAkJCWt1bm1hcF9hdG9taWMocGFnZV9hZGRyLCBLTV9TT0ZUSVJRMCk7CkBAIC01NzIsNyArNjM3LDggQEAKIAkJdGxlbiAtPSBzZ19ieXRlczsKIAkJcmVtYWluaW5nIC09IHNnX2J5dGVzOwogCi0JCWlmICh0bGVuKQorCQlpZiAoKHNrYl9zaGluZm8oZnBfc2tiKGZwKSktPm5yX2ZyYWdzIDwgRkNfRlJBTUVfU0dfTEVOKSAmJgorCQkgICAgKHRsZW4pKQogCQkJY29udGludWU7CiAKIAkJLyoKQEAgLTU4OSw3ICs2NTUsNyBAQAogCQkvKgogCQkgKiBzZW5kIGZyYWdtZW50IHVzaW5nIGZvciBhIHNlcXVlbmNlLgogCQkgKi8KLQkJZXJyb3IgPSBscC0+dHQuc2VxX3NlbmQobHAsIHNlcSwgZnApOworCQllcnJvciA9IGxwb3J0LT50dC5zZXFfc2VuZChscG9ydCwgc2VxLCBmcCk7CiAJCWlmIChlcnJvcikgewogCQkJV0FSTl9PTigxKTsJCS8qIHNlbmQgZXJyb3Igc2hvdWxkIGJlIHJhcmUgKi8KIAkJCWZjX2ZjcF9yZXRyeV9jbWQoZnNwKTsKQEAgLTYwMSw2ICs2NjcsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBmY19mY3BfYWJ0c19yZXNwKCkgLSBTZW5kIGFuIEFCVFMgcmVzcG9uc2UKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRoYXQgaXMgYmVpbmcgYWJvcnRlZAorICogQGZwOgkgVGhlIHJlc3BvbnNlIGZyYW1lCisgKi8KIHN0YXRpYyB2b2lkIGZjX2ZjcF9hYnRzX3Jlc3Aoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKIAlpbnQgYmFfZG9uZSA9IDE7CkBAIC02MzcsNDYgKzcwOCwxMyBAQAogfQogCiAvKioKLSAqIGZjX2ZjcF9yZWR1Y2VfY2FuX3F1ZXVlKCkgLSBkcm9wIGNhbl9xdWV1ZQotICogQGxwOiBscG9ydCB0byBkcm9wIHF1ZXVlaW5nIGZvcgotICoKLSAqIElmIHdlIGFyZSBnZXR0aW5nIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLCB0aGVuIHdlIG1heQotICogYmUgdHJ5aW5nIHRvIGV4ZWN1dGUgdG9vIG1hbnkgY29tbWFuZHMuIFdlIGxldCB0aGUgcnVubmluZwotICogY29tbWFuZHMgY29tcGxldGUgb3IgdGltZW91dCwgdGhlbiB0cnkgYWdhaW4gd2l0aCBhIHJlZHVjZWQKLSAqIGNhbl9xdWV1ZS4gRXZlbnR1YWxseSB3ZSB3aWxsIGhpdCB0aGUgcG9pbnQgd2hlcmUgd2UgcnVuCi0gKiBvbiBhbGwgcmVzZXJ2ZWQgc3RydWN0cy4KLSAqLwotc3RhdGljIHZvaWQgZmNfZmNwX3JlZHVjZV9jYW5fcXVldWUoc3RydWN0IGZjX2xwb3J0ICpscCkKLXsKLQlzdHJ1Y3QgZmNfZmNwX2ludGVybmFsICpzaSA9IGZjX2dldF9zY3NpX2ludGVybmFsKGxwKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjYW5fcXVldWU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShscC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaWYgKHNpLT50aHJvdHRsZWQpCi0JCWdvdG8gZG9uZTsKLQlzaS0+dGhyb3R0bGVkID0gMTsKLQotCWNhbl9xdWV1ZSA9IGxwLT5ob3N0LT5jYW5fcXVldWU7Ci0JY2FuX3F1ZXVlID4+PSAxOwotCWlmICghY2FuX3F1ZXVlKQotCQljYW5fcXVldWUgPSAxOwotCWxwLT5ob3N0LT5jYW5fcXVldWUgPSBjYW5fcXVldWU7Ci0Jc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBscC0+aG9zdCwgImxpYmZjOiBDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUuXG4iCi0JCSAgICAgIlJlZHVjaW5nIGNhbl9xdWV1ZSB0byAlZC5cbiIsIGNhbl9xdWV1ZSk7Ci1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotfQotCi0vKioKLSAqIGZjX2ZjcF9yZWN2KCkgLSBSZXZlaXZlIEZDUCBmcmFtZXMKKyAqIGZjX2ZjcF9yZWN2KCkgLSBSZXZlaXZlIGFuIEZDUCBmcmFtZQogICogQHNlcTogVGhlIHNlcXVlbmNlIHRoZSBmcmFtZSBpcyBvbgotICogQGZwOiBUaGUgRkMgZnJhbWUKKyAqIEBmcDoJIFRoZSByZWNlaXZlZCBmcmFtZQogICogQGFyZzogVGhlIHJlbGF0ZWQgRkNQIHBhY2tldAogICoKLSAqIFJldHVybiAgIDogTm9uZQotICogQ29udGV4dCAgOiBjYWxsZWQgZnJvbSBTb2Z0IElSUSBjb250ZXh0Ci0gKgkgICAgICBjYW4gbm90IGNhbGxlZCBob2xkaW5nIGxpc3QgbG9jaworICogQ29udGV4dDogQ2FsbGVkIGZyb20gU29mdCBJUlEgY29udGV4dC4gQ2FuIG5vdCBiZSBjYWxsZWQKKyAqCSAgICBob2xkaW5nIHRoZSBGQ1AgcGFja2V0IGxpc3QgbG9jay4KICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX3JlY3Yoc3RydWN0IGZjX3NlcSAqc2VxLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLCB2b2lkICphcmcpCiB7CkBAIC02ODcsOCArNzI1LDEwIEBACiAJdTggcl9jdGw7CiAJaW50IHJjID0gMDsKIAotCWlmIChJU19FUlIoZnApKQotCQlnb3RvIGVycm91dDsKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmY19mY3BfZXJyb3IoZnNwLCBmcCk7CisJCXJldHVybjsKKwl9CiAKIAlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwogCXJfY3RsID0gZmgtPmZoX3JfY3RsOwpAQCAtNzIxLDggKzc2MSw2IEBACiAJCQkJICAgICAgKHNpemVfdCkgbnRvaGwoZGQtPmZ0X2J1cnN0X2xlbikpOwogCQlpZiAoIXJjKQogCQkJc2VxLT5yZWNfZGF0YSA9IGZzcC0+eGZlcl9sZW47Ci0JCWVsc2UgaWYgKHJjID09IC1FTk9NRU0pCi0JCQlmc3AtPnN0YXRlIHw9IEZDX1NSQl9OT01FTTsKIAl9IGVsc2UgaWYgKHJfY3RsID09IEZDX1JDVExfRERfU09MX0RBVEEpIHsKIAkJLyoKIAkJICogcmVjZWl2ZWQgYSBEQVRBIGZyYW1lCkBAIC03NDIsMTMgKzc4MCwxMyBAQAogCWZjX2ZjcF91bmxvY2tfcGt0KGZzcCk7CiBvdXQ6CiAJZmNfZnJhbWVfZnJlZShmcCk7Ci1lcnJvdXQ6Ci0JaWYgKElTX0VSUihmcCkpCi0JCWZjX2ZjcF9lcnJvcihmc3AsIGZwKTsKLQllbHNlIGlmIChyYyA9PSAtRU5PTUVNKQotCQlmY19mY3BfcmVkdWNlX2Nhbl9xdWV1ZShscG9ydCk7CiB9CiAKKy8qKgorICogZmNfZmNwX3Jlc3AoKSAtIEhhbmRsZXIgZm9yIEZDUCByZXNwb25zZXMKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRoZSByZXNwb25zZSBpcyBmb3IKKyAqIEBmcDoJIFRoZSByZXNwb25zZSBmcmFtZQorICovCiBzdGF0aWMgdm9pZCBmY19mY3BfcmVzcChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwpAQCAtODYyLDE1ICs5MDAsMTYgQEAKIH0KIAogLyoqCi0gKiBmY19mY3BfY29tcGxldGVfbG9ja2VkKCkgLSBjb21wbGV0ZSBwcm9jZXNzaW5nIG9mIGEgZmNwIHBhY2tldAotICogQGZzcDoJZmNwIHBhY2tldAorICogZmNfZmNwX2NvbXBsZXRlX2xvY2tlZCgpIC0gQ29tcGxldGUgcHJvY2Vzc2luZyBvZiBhIGZjcF9wa3Qgd2l0aCB0aGUKKyAqCQkJICAgICAgZmNwX3BrdCBsb2NrIGhlbGQKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRvIGJlIGNvbXBsZXRlZAogICoKICAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIGlmIGEgdGltZXIgaXMgcGVuZGluZy4gVGhlIHBhY2tldCBsb2NrIG11c3QgYmUKICAqIGhlbGQsIGFuZCB0aGUgaG9zdCBsb2NrIG11c3Qgbm90IGJlIGhlbGQuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2ZjcF9jb21wbGV0ZV9sb2NrZWQoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKIHsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZnNwLT5scDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZnNwLT5scDsKIAlzdHJ1Y3QgZmNfc2VxICpzZXE7CiAJc3RydWN0IGZjX2V4Y2ggKmVwOwogCXUzMiBmX2N0bDsKQEAgLTkwMSw4ICs5NDAsOCBAQAogCQkJc3RydWN0IGZjX2ZyYW1lICpjb25mX2ZyYW1lOwogCQkJc3RydWN0IGZjX3NlcSAqY3NwOwogCi0JCQljc3AgPSBscC0+dHQuc2VxX3N0YXJ0X25leHQoc2VxKTsKLQkJCWNvbmZfZnJhbWUgPSBmY19mcmFtZV9hbGxvYyhmc3AtPmxwLCAwKTsKKwkJCWNzcCA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChzZXEpOworCQkJY29uZl9mcmFtZSA9IGZjX2ZjcF9mcmFtZV9hbGxvYyhmc3AtPmxwLCAwKTsKIAkJCWlmIChjb25mX2ZyYW1lKSB7CiAJCQkJZl9jdGwgPSBGQ19GQ19TRVFfSU5JVDsKIAkJCQlmX2N0bCB8PSBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVE7CkBAIC05MTAsNDMgKzk0OSw0OCBAQAogCQkJCWZjX2ZpbGxfZmNfaGRyKGNvbmZfZnJhbWUsIEZDX1JDVExfRERfU09MX0NUTCwKIAkJCQkJICAgICAgIGVwLT5kaWQsIGVwLT5zaWQsCiAJCQkJCSAgICAgICBGQ19UWVBFX0ZDUCwgZl9jdGwsIDApOwotCQkJCWxwLT50dC5zZXFfc2VuZChscCwgY3NwLCBjb25mX2ZyYW1lKTsKKwkJCQlscG9ydC0+dHQuc2VxX3NlbmQobHBvcnQsIGNzcCwgY29uZl9mcmFtZSk7CiAJCQl9CiAJCX0KLQkJbHAtPnR0LmV4Y2hfZG9uZShzZXEpOworCQlscG9ydC0+dHQuZXhjaF9kb25lKHNlcSk7CiAJfQogCWZjX2lvX2NvbXBsKGZzcCk7CiB9CiAKKy8qKgorICogZmNfZmNwX2NsZWFudXBfY21kKCkgLSBDYW5jZWwgdGhlIGFjdGl2ZSBleGNoYW5nZSBvbiBhIGZjcF9wa3QKKyAqIEBmc3A6ICAgVGhlIEZDUCBwYWNrZXQgd2hvc2UgZXhjaGFuZ2VzIHNob3VsZCBiZSBjYW5jZWxlZAorICogQGVycm9yOiBUaGUgcmVhc29uIGZvciB0aGUgY2FuY2VsbGF0aW9uCisgKi8KIHN0YXRpYyB2b2lkIGZjX2ZjcF9jbGVhbnVwX2NtZChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBpbnQgZXJyb3IpCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscCA9IGZzcC0+bHA7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGZzcC0+bHA7CiAKIAlpZiAoZnNwLT5zZXFfcHRyKSB7Ci0JCWxwLT50dC5leGNoX2RvbmUoZnNwLT5zZXFfcHRyKTsKKwkJbHBvcnQtPnR0LmV4Y2hfZG9uZShmc3AtPnNlcV9wdHIpOwogCQlmc3AtPnNlcV9wdHIgPSBOVUxMOwogCX0KIAlmc3AtPnN0YXR1c19jb2RlID0gZXJyb3I7CiB9CiAKIC8qKgotICogZmNfZmNwX2NsZWFudXBfZWFjaF9jbWQoKSAtIENsZWFudXAgYWN0aXZlIGNvbW1hZHMKLSAqIEBscDoJCWxvZ2ljYWwgcG9ydAotICogQGlkOgkJdGFyZ2V0IGlkCi0gKiBAbHVuOglsdW4KLSAqIEBlcnJvcjoJZnNwIHN0YXR1cyBjb2RlCisgKiBmY19mY3BfY2xlYW51cF9lYWNoX2NtZCgpIC0gQ2FuY2VsIGFsbCBleGNoYW5nZXMgb24gYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHdob3NlIGV4Y2hhbmdlcyBzaG91bGQgYmUgY2FuY2VsZWQKKyAqIEBpZDoJICAgVGhlIHRhcmdldCdzIElECisgKiBAbHVuOiAgIFRoZSBMVU4KKyAqIEBlcnJvcjogVGhlIHJlYXNvbiBmb3IgY2FuY2VsbGF0aW9uCiAgKgogICogSWYgbHVuIG9yIGlkIGlzIC0xLCB0aGV5IGFyZSBpZ25vcmVkLgogICovCi1zdGF0aWMgdm9pZCBmY19mY3BfY2xlYW51cF9lYWNoX2NtZChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCB1bnNpZ25lZCBpbnQgaWQsCitzdGF0aWMgdm9pZCBmY19mY3BfY2xlYW51cF9lYWNoX2NtZChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCB1bnNpZ25lZCBpbnQgaWQsCiAJCQkJICAgIHVuc2lnbmVkIGludCBsdW4sIGludCBlcnJvcikKIHsKLQlzdHJ1Y3QgZmNfZmNwX2ludGVybmFsICpzaSA9IGZjX2dldF9zY3NpX2ludGVybmFsKGxwKTsKKwlzdHJ1Y3QgZmNfZmNwX2ludGVybmFsICpzaSA9IGZjX2dldF9zY3NpX2ludGVybmFsKGxwb3J0KTsKIAlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGxwb3J0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIHJlc3RhcnQ6CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmc3AsICZzaS0+c2NzaV9wa3RfcXVldWUsIGxpc3QpIHsKIAkJc2NfY21kID0gZnNwLT5jbWQ7CkBAIC05NTcsNyArMTAwMSw3IEBACiAJCQljb250aW51ZTsKIAogCQlmY19mY3BfcGt0X2hvbGQoZnNwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShscC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHBvcnQtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCiAJCWlmICghZmNfZmNwX2xvY2tfcGt0KGZzcCkpIHsKIAkJCWZjX2ZjcF9jbGVhbnVwX2NtZChmc3AsIGVycm9yKTsKQEAgLTk2NiwzNSArMTAxMCwzNiBAQAogCQl9CiAKIAkJZmNfZmNwX3BrdF9yZWxlYXNlKGZzcCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKGxwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUobHBvcnQtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQkvKgogCQkgKiB3aGlsZSB3ZSBkcm9wcGVkIHRoZSBsb2NrIG11bHRpcGxlIHBrdHMgY291bGQKIAkJICogaGF2ZSBiZWVuIHJlbGVhc2VkLCBzbyB3ZSBoYXZlIHRvIHN0YXJ0IG92ZXIuCiAJCSAqLwogCQlnb3RvIHJlc3RhcnQ7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBmY19mY3BfYWJvcnRfaW8oc3RydWN0IGZjX2xwb3J0ICpscCkKLXsKLQlmY19mY3BfY2xlYW51cF9lYWNoX2NtZChscCwgLTEsIC0xLCBGQ19IUkRfRVJST1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHBvcnQtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogfQogCiAvKioKLSAqIGZjX2ZjcF9wa3Rfc2VuZCgpIC0gc2VuZCBhIGZjcCBwYWNrZXQgdG8gdGhlIGxvd2VyIGxldmVsLgotICogQGxwOgkJZmMgbHBvcnQKLSAqIEBmc3A6CWZjIHBhY2tldC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB1cHBlciBsYXllciBwcm90b2NvbC4KLSAqIFJldHVybiAgIDogemVybyBmb3Igc3VjY2VzcyBhbmQgLTEgZm9yIGZhaWx1cmUKLSAqIENvbnRleHQgIDogY2FsbGVkIGZyb20gcXVldWVjb21tYW5kIHdoaWNoIGNhbiBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzCi0gKgkgICAgICBvciBzY3NpIHNvZnQgaXJxLgotICogTG9ja3MgICAgOiBjYWxsZWQgd2l0aCB0aGUgaG9zdCBsb2NrIGFuZCBpcnFzIGRpc2FibGVkLgorICogZmNfZmNwX2Fib3J0X2lvKCkgLSBBYm9ydCBhbGwgRkNQLVNDU0kgZXhjaGFuZ2VzIG9uIGEgbG9jYWwgcG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB3aG9zZSBleGNoYW5nZXMgYXJlIHRvIGJlIGFib3J0ZWQKICAqLwotc3RhdGljIGludCBmY19mY3BfcGt0X3NlbmQoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKK3N0YXRpYyB2b2lkIGZjX2ZjcF9hYm9ydF9pbyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCXN0cnVjdCBmY19mY3BfaW50ZXJuYWwgKnNpID0gZmNfZ2V0X3Njc2lfaW50ZXJuYWwobHApOworCWZjX2ZjcF9jbGVhbnVwX2VhY2hfY21kKGxwb3J0LCAtMSwgLTEsIEZDX0hSRF9FUlJPUik7Cit9CisKKy8qKgorICogZmNfZmNwX3BrdF9zZW5kKCkgLSBTZW5kIGEgZmNwX3BrdAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBzZW5kIHRoZSBGQ1AgcGFja2V0IG9uCisgKiBAZnNwOiAgIFRoZSBGQ1AgcGFja2V0IHRvIHNlbmQKKyAqCisgKiBSZXR1cm46ICBaZXJvIGZvciBzdWNjZXNzIGFuZCAtMSBmb3IgZmFpbHVyZQorICogTG9ja3M6ICAgQ2FsbGVkIHdpdGggdGhlIGhvc3QgbG9jayBhbmQgaXJxcyBkaXNhYmxlZC4KKyAqLworc3RhdGljIGludCBmY19mY3BfcGt0X3NlbmQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKK3sKKwlzdHJ1Y3QgZmNfZmNwX2ludGVybmFsICpzaSA9IGZjX2dldF9zY3NpX2ludGVybmFsKGxwb3J0KTsKIAlpbnQgcmM7CiAKIAlmc3AtPmNtZC0+U0NwLnB0ciA9IChjaGFyICopZnNwOwpAQCAtMTAwNiwxNiArMTA1MSwyMiBAQAogCW1lbWNweShmc3AtPmNkYl9jbWQuZmNfY2RiLCBmc3AtPmNtZC0+Y21uZCwgZnNwLT5jbWQtPmNtZF9sZW4pOwogCWxpc3RfYWRkX3RhaWwoJmZzcC0+bGlzdCwgJnNpLT5zY3NpX3BrdF9xdWV1ZSk7CiAKLQlzcGluX3VubG9ja19pcnEobHAtPmhvc3QtPmhvc3RfbG9jayk7Ci0JcmMgPSBscC0+dHQuZmNwX2NtZF9zZW5kKGxwLCBmc3AsIGZjX2ZjcF9yZWN2KTsKLQlzcGluX2xvY2tfaXJxKGxwLT5ob3N0LT5ob3N0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycShscG9ydC0+aG9zdC0+aG9zdF9sb2NrKTsKKwlyYyA9IGxwb3J0LT50dC5mY3BfY21kX3NlbmQobHBvcnQsIGZzcCwgZmNfZmNwX3JlY3YpOworCXNwaW5fbG9ja19pcnEobHBvcnQtPmhvc3QtPmhvc3RfbG9jayk7CiAJaWYgKHJjKQogCQlsaXN0X2RlbCgmZnNwLT5saXN0KTsKIAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBmY19mY3BfY21kX3NlbmQoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwKKy8qKgorICogZmNfZmNwX2NtZF9zZW5kKCkgLSBTZW5kIGEgRkNQIGNvbW1hbmQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gc2VuZCB0aGUgY29tbWFuZCBvbgorICogQGZzcDogICBUaGUgRkNQIHBhY2tldCB0aGUgY29tbWFuZCBpcyBvbgorICogQHJlc3A6ICBUaGUgaGFuZGxlciBmb3IgdGhlIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgZmNfZmNwX2NtZF9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsCiAJCQkgICB2b2lkICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLAogCQkJCQlzdHJ1Y3QgZmNfZnJhbWUgKmZwLAogCQkJCQl2b2lkICphcmcpKQpAQCAtMTAyMywxNCArMTA3NCwxNCBAQAogCXN0cnVjdCBmY19mcmFtZSAqZnA7CiAJc3RydWN0IGZjX3NlcSAqc2VxOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7Ci0Jc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwOworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycHJpdjsKIAljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKGZzcC0+Y2RiX2NtZCk7CiAJaW50IHJjID0gMDsKIAogCWlmIChmY19mY3BfbG9ja19wa3QoZnNwKSkKIAkJcmV0dXJuIDA7CiAKLQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwLCBzaXplb2YoZnNwLT5jZGJfY21kKSk7CisJZnAgPSBmY19mY3BfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZihmc3AtPmNkYl9jbWQpKTsKIAlpZiAoIWZwKSB7CiAJCXJjID0gLTE7CiAJCWdvdG8gdW5sb2NrOwpAQCAtMTA0MCwxNSArMTA5MSwxNSBAQAogCWZyX2ZzcChmcCkgPSBmc3A7CiAJcnBvcnQgPSBmc3AtPnJwb3J0OwogCWZzcC0+bWF4X3BheWxvYWQgPSBycG9ydC0+bWF4ZnJhbWVfc2l6ZTsKLQlycCA9IHJwb3J0LT5kZF9kYXRhOworCXJwcml2ID0gcnBvcnQtPmRkX2RhdGE7CiAKIAlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9ERF9VTlNPTF9DTUQsIHJwb3J0LT5wb3J0X2lkLAotCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKHJwLT5sb2NhbF9wb3J0LT5ob3N0KSwgRkNfVFlQRV9GQ1AsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQocnByaXYtPmxvY2FsX3BvcnQtPmhvc3QpLCBGQ19UWVBFX0ZDUCwKIAkJICAgICAgIEZDX0ZDX0ZJUlNUX1NFUSB8IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCwgMCk7CiAKLQlzZXEgPSBscC0+dHQuZXhjaF9zZXFfc2VuZChscCwgZnAsIHJlc3AsIGZjX2ZjcF9wa3RfZGVzdHJveSwgZnNwLCAwKTsKKwlzZXEgPSBscG9ydC0+dHQuZXhjaF9zZXFfc2VuZChscG9ydCwgZnAsIHJlc3AsIGZjX2ZjcF9wa3RfZGVzdHJveSwKKwkJCQkgICAgICBmc3AsIDApOwogCWlmICghc2VxKSB7Ci0JCWZjX2ZyYW1lX2ZyZWUoZnApOwogCQlyYyA9IC0xOwogCQlnb3RvIHVubG9jazsKIAl9CkBAIC0xMDY1LDggKzExMTYsMTAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qCi0gKiB0cmFuc3BvcnQgZXJyb3IgaGFuZGxlcgorLyoqCisgKiBmY19mY3BfZXJyb3IoKSAtIEhhbmRsZXIgZm9yIEZDUCBsYXllciBlcnJvcnMKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRoZSBlcnJvciBpcyBvbgorICogQGZwOgkgVGhlIGZyYW1lIHRoYXQgaGFzIGVycm9yZWQKICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX2Vycm9yKHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsIHN0cnVjdCBmY19mcmFtZSAqZnApCiB7CkBAIC0xMDkxLDExICsxMTQ0LDEzIEBACiAJZmNfZmNwX3VubG9ja19wa3QoZnNwKTsKIH0KIAotLyoKLSAqIFNjc2kgYWJvcnQgaGFuZGxlci0gY2FsbHMgdG8gc2VuZCBhbiBhYm9ydAotICogYW5kIHRoZW4gd2FpdCBmb3IgYWJvcnQgY29tcGxldGlvbgorLyoqCisgKiBmY19mY3BfcGt0X2Fib3J0KCkgLSBBYm9ydCBhIGZjcF9wa3QKKyAqIEBmc3A6ICAgVGhlIEZDUCBwYWNrZXQgdG8gYWJvcnQgb24KKyAqCisgKiBDYWxsZWQgdG8gc2VuZCBhbiBhYm9ydCBhbmQgdGhlbiB3YWl0IGZvciBhYm9ydCBjb21wbGV0aW9uCiAgKi8KLXN0YXRpYyBpbnQgZmNfZmNwX3BrdF9hYm9ydChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQorc3RhdGljIGludCBmY19mY3BfcGt0X2Fib3J0KHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCiB7CiAJaW50IHJjID0gRkFJTEVEOwogCkBAIC0xMTIyLDE0ICsxMTc3LDE1IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKgotICogUmV0cnkgTFVOIHJlc2V0IGFmdGVyIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbGVkLgorLyoqCisgKiBmY19sdW5fcmVzZXRfc2VuZCgpIC0gU2VuZCBMVU4gcmVzZXQgY29tbWFuZAorICogQGRhdGE6IFRoZSBGQ1AgcGFja2V0IHRoYXQgaWRlbnRpZmllcyB0aGUgTFVOIHRvIGJlIHJlc2V0CiAgKi8KIHN0YXRpYyB2b2lkIGZjX2x1bl9yZXNldF9zZW5kKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwID0gKHN0cnVjdCBmY19mY3BfcGt0ICopZGF0YTsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZnNwLT5scDsKLQlpZiAobHAtPnR0LmZjcF9jbWRfc2VuZChscCwgZnNwLCBmY190bV9kb25lKSkgeworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBmc3AtPmxwOworCWlmIChscG9ydC0+dHQuZmNwX2NtZF9zZW5kKGxwb3J0LCBmc3AsIGZjX3RtX2RvbmUpKSB7CiAJCWlmIChmc3AtPnJlY292X3JldHJ5KysgPj0gRkNfTUFYX1JFQ09WX1JFVFJZKQogCQkJcmV0dXJuOwogCQlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCkBAIC0xMTQwLDExICsxMTk2LDE1IEBACiAJfQogfQogCi0vKgotICogU2NzaSBkZXZpY2UgcmVzZXQgaGFuZGxlci0gc2VuZCBhIExVTiBSRVNFVCB0byB0aGUgZGV2aWNlCi0gKiBhbmQgd2FpdCBmb3IgcmVzZXQgcmVwbHkKKy8qKgorICogZmNfbHVuX3Jlc2V0KCkgLSBTZW5kIGEgTFVOIFJFU0VUIGNvbW1hbmQgdG8gYSBkZXZpY2UKKyAqCQkgICAgYW5kIHdhaXQgZm9yIHRoZSByZXBseQorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBzZW50IHRoZSBjb21hbmQgb24KKyAqIEBmc3A6ICAgVGhlIEZDUCBwYWNrZXQgdGhhdCBpZGVudGlmaWVzIHRoZSBMVU4gdG8gYmUgcmVzZXQKKyAqIEBpZDoJICAgVGhlIFNDU0kgY29tbWFuZCBJRAorICogQGx1bjogICBUaGUgTFVOIElEIHRvIGJlIHJlc2V0CiAgKi8KLXN0YXRpYyBpbnQgZmNfbHVuX3Jlc2V0KHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsCitzdGF0aWMgaW50IGZjX2x1bl9yZXNldChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLAogCQkJdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgbHVuKQogewogCWludCByYzsKQEAgLTExNzIsMTQgKzEyMzIsMTQgQEAKIAogCXNwaW5fbG9ja19iaCgmZnNwLT5zY3NpX3BrdF9sb2NrKTsKIAlpZiAoZnNwLT5zZXFfcHRyKSB7Ci0JCWxwLT50dC5leGNoX2RvbmUoZnNwLT5zZXFfcHRyKTsKKwkJbHBvcnQtPnR0LmV4Y2hfZG9uZShmc3AtPnNlcV9wdHIpOwogCQlmc3AtPnNlcV9wdHIgPSBOVUxMOwogCX0KIAlmc3AtPndhaXRfZm9yX2NvbXAgPSAwOwogCXNwaW5fdW5sb2NrX2JoKCZmc3AtPnNjc2lfcGt0X2xvY2spOwogCiAJaWYgKCFyYykgewotCQlGQ19TQ1NJX0RCRyhscCwgImx1biByZXNldCBmYWlsZWRcbiIpOworCQlGQ19TQ1NJX0RCRyhscG9ydCwgImx1biByZXNldCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIApAQCAtMTE4NywxMyArMTI0NywxNiBAQAogCWlmIChmc3AtPmNkYl9zdGF0dXMgIT0gRkNQX1RNRl9DTVBMKQogCQlyZXR1cm4gRkFJTEVEOwogCi0JRkNfU0NTSV9EQkcobHAsICJsdW4gcmVzZXQgdG8gbHVuICV1IGNvbXBsZXRlZFxuIiwgbHVuKTsKLQlmY19mY3BfY2xlYW51cF9lYWNoX2NtZChscCwgaWQsIGx1biwgRkNfQ01EX0FCT1JURUQpOworCUZDX1NDU0lfREJHKGxwb3J0LCAibHVuIHJlc2V0IHRvIGx1biAldSBjb21wbGV0ZWRcbiIsIGx1bik7CisJZmNfZmNwX2NsZWFudXBfZWFjaF9jbWQobHBvcnQsIGlkLCBsdW4sIEZDX0NNRF9BQk9SVEVEKTsKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KIAotLyoKLSAqIFRhc2sgTWFuYWdtZW50IHJlc3BvbnNlIGhhbmRsZXIKKy8qKgorICogZmNfdG1fZG9uZSgpIC0gVGFzayBNYW5hZ21lbnQgcmVzcG9uc2UgaGFuZGxlcgorICogQHNlcTogVGhlIHNlcXVlbmNlIHRoYXQgdGhlIHJlc3BvbnNlIGlzIG9uCisgKiBAZnA6CSBUaGUgcmVzcG9uc2UgZnJhbWUKKyAqIEBhcmc6IFRoZSBGQ1AgcGFja2V0IHRoZSByZXNwb25zZSBpcyBmb3IKICAqLwogc3RhdGljIHZvaWQgZmNfdG1fZG9uZShzdHJ1Y3QgZmNfc2VxICpzZXEsIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZykKIHsKQEAgLTEyMzAsMzQgKzEyOTMsMzEgQEAKIAlmY19mY3BfdW5sb2NrX3BrdChmc3ApOwogfQogCi1zdGF0aWMgdm9pZCBmY19mY3BfY2xlYW51cChzdHJ1Y3QgZmNfbHBvcnQgKmxwKQorLyoqCisgKiBmY19mY3BfY2xlYW51cCgpIC0gQ2xlYW51cCBhbGwgRkNQIGV4Y2hhbmdlcyBvbiBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gYmUgY2xlYW5lZCB1cAorICovCitzdGF0aWMgdm9pZCBmY19mY3BfY2xlYW51cChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCWZjX2ZjcF9jbGVhbnVwX2VhY2hfY21kKGxwLCAtMSwgLTEsIEZDX0VSUk9SKTsKKwlmY19mY3BfY2xlYW51cF9lYWNoX2NtZChscG9ydCwgLTEsIC0xLCBGQ19FUlJPUik7CiB9CiAKLS8qCi0gKiBmY19mY3BfdGltZW91dDogY2FsbGVkIGJ5IE9TIHRpbWVyIGZ1bmN0aW9uLgorLyoqCisgKiBmY19mY3BfdGltZW91dCgpIC0gSGFuZGxlciBmb3IgZmNwX3BrdCB0aW1lb3V0cworICogQGRhdGE6IFRoZSBGQ1AgcGFja2V0IHRoYXQgaGFzIHRpbWVkIG91dAogICoKLSAqIFRoZSB0aW1lciBoYXMgYmVlbiBpbmFjdGl2YXRlZCBhbmQgbXVzdCBiZSByZWFjdGl2YXRlZCBpZiBkZXNpcmVkCi0gKiB1c2luZyBmY19mY3BfdGltZXJfc2V0KCkuCi0gKgotICogQWxnb3JpdGhtOgotICoKLSAqIElmIFJFQyBpcyBzdXBwb3J0ZWQsIGp1c3QgaXNzdWUgaXQsIGFuZCByZXR1cm4uICBUaGUgUkVDIGV4Y2hhbmdlIHdpbGwKLSAqIGNvbXBsZXRlIG9yIHRpbWUgb3V0LCBhbmQgcmVjb3ZlcnkgY2FuIGNvbnRpbnVlIGF0IHRoYXQgcG9pbnQuCi0gKgotICogT3RoZXJ3aXNlLCBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aG91dCBhbGwgdGhlIGRhdGEsCi0gKiBpdCBoYXMgYmVlbiBFUl9USU1FT1VUIHNpbmNlIHRoZSByZXNwb25zZSB3YXMgcmVjZWl2ZWQuCi0gKgotICogSWYgdGhlIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCwKLSAqIHdlIHNlZSBpZiBkYXRhIHdhcyByZWNlaXZlZCByZWNlbnRseS4gIElmIGl0IGhhcyBiZWVuLCB3ZSBjb250aW51ZSB3YWl0aW5nLAotICogb3RoZXJ3aXNlLCB3ZSBhYm9ydCB0aGUgY29tbWFuZC4KKyAqIElmIFJFQyBpcyBzdXBwb3J0ZWQgdGhlbiBqdXN0IGlzc3VlIGl0IGFuZCByZXR1cm4uIFRoZSBSRUMgZXhjaGFuZ2Ugd2lsbAorICogY29tcGxldGUgb3IgdGltZSBvdXQgYW5kIHJlY292ZXJ5IGNhbiBjb250aW51ZSBhdCB0aGF0IHBvaW50LiBPdGhlcndpc2UsCisgKiBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aG91dCBhbGwgdGhlIGRhdGEgaXQgaGFzIGJlZW4KKyAqIEVSX1RJTUVPVVQgc2luY2UgdGhlIHJlc3BvbnNlIHdhcyByZWNlaXZlZC4gSWYgdGhlIHJlc3BvbnNlIGhhcyBub3QgYmVlbgorICogcmVjZWl2ZWQgd2Ugc2VlIGlmIGRhdGEgd2FzIHJlY2VpdmVkIHJlY2VudGx5LiBJZiBpdCBoYXMgYmVlbiB0aGVuIHdlCisgKiBjb250aW51ZSB3YWl0aW5nLCBvdGhlcndpc2UsIHdlIGFib3J0IHRoZSBjb21tYW5kLgogICovCiBzdGF0aWMgdm9pZCBmY19mY3BfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCA9IChzdHJ1Y3QgZmNfZmNwX3BrdCAqKWRhdGE7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IGZzcC0+cnBvcnQ7Ci0Jc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwcml2ID0gcnBvcnQtPmRkX2RhdGE7CiAKIAlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCiAJCXJldHVybjsKQEAgLTEyNjcsNyArMTMyNyw3IEBACiAKIAlmc3AtPnN0YXRlIHw9IEZDX1NSQl9GQ1BfUFJPQ0VTU0lOR19UTU87CiAKLQlpZiAocnAtPmZsYWdzICYgRkNfUlBfRkxBR1NfUkVDX1NVUFBPUlRFRCkKKwlpZiAocnByaXYtPmZsYWdzICYgRkNfUlBfRkxBR1NfUkVDX1NVUFBPUlRFRCkKIAkJZmNfZmNwX3JlYyhmc3ApOwogCWVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoZnNwLT5sYXN0X3BrdF90aW1lICsgKEZDX1NDU0lfRVJfVElNRU9VVCAvIDIpLAogCQkJICAgICAgIGppZmZpZXMpKQpAQCAtMTI4MSwzOSArMTM0MSw0MCBAQAogCWZjX2ZjcF91bmxvY2tfcGt0KGZzcCk7CiB9CiAKLS8qCi0gKiBTZW5kIGEgUkVDIEVMUyByZXF1ZXN0CisvKioKKyAqIGZjX2ZjcF9yZWMoKSAtIFNlbmQgYSBSRUMgRUxTIHJlcXVlc3QKKyAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRvIHNlbmQgdGhlIFJFQyByZXF1ZXN0IG9uCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2ZjcF9yZWMoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKIHsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OwotCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnByaXY7CiAKLQlscCA9IGZzcC0+bHA7CisJbHBvcnQgPSBmc3AtPmxwOwogCXJwb3J0ID0gZnNwLT5ycG9ydDsKLQlycCA9IHJwb3J0LT5kZF9kYXRhOwotCWlmICghZnNwLT5zZXFfcHRyIHx8IHJwLT5ycF9zdGF0ZSAhPSBSUE9SVF9TVF9SRUFEWSkgeworCXJwcml2ID0gcnBvcnQtPmRkX2RhdGE7CisJaWYgKCFmc3AtPnNlcV9wdHIgfHwgcnByaXYtPnJwX3N0YXRlICE9IFJQT1JUX1NUX1JFQURZKSB7CiAJCWZzcC0+c3RhdHVzX2NvZGUgPSBGQ19IUkRfRVJST1I7CiAJCWZzcC0+aW9fc3RhdHVzID0gMDsKIAkJZmNfZmNwX2NvbXBsZXRlX2xvY2tlZChmc3ApOwogCQlyZXR1cm47CiAJfQotCWZwID0gZmNfZnJhbWVfYWxsb2MobHAsIHNpemVvZihzdHJ1Y3QgZmNfZWxzX3JlYykpOworCWZwID0gZmNfZmNwX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2Vsc19yZWMpKTsKIAlpZiAoIWZwKQogCQlnb3RvIHJldHJ5OwogCiAJZnJfc2VxKGZwKSA9IGZzcC0+c2VxX3B0cjsKIAlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVRLCBycG9ydC0+cG9ydF9pZCwKLQkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChycC0+bG9jYWxfcG9ydC0+aG9zdCksIEZDX1RZUEVfRUxTLAorCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKHJwcml2LT5sb2NhbF9wb3J0LT5ob3N0KSwgRkNfVFlQRV9FTFMsCiAJCSAgICAgICBGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOwotCWlmIChscC0+dHQuZWxzY3Rfc2VuZChscCwgcnBvcnQtPnBvcnRfaWQsIGZwLCBFTFNfUkVDLCBmY19mY3BfcmVjX3Jlc3AsCi0JCQkgICAgICBmc3AsIGppZmZpZXNfdG9fbXNlY3MoRkNfU0NTSV9SRUNfVE9WKSkpIHsKKwlpZiAobHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIHJwb3J0LT5wb3J0X2lkLCBmcCwgRUxTX1JFQywKKwkJCQkgZmNfZmNwX3JlY19yZXNwLCBmc3AsCisJCQkJIGppZmZpZXNfdG9fbXNlY3MoRkNfU0NTSV9SRUNfVE9WKSkpIHsKIAkJZmNfZmNwX3BrdF9ob2xkKGZzcCk7CQkvKiBob2xkIHdoaWxlIFJFQyBvdXRzdGFuZGluZyAqLwogCQlyZXR1cm47CiAJfQotCWZjX2ZyYW1lX2ZyZWUoZnApOwogcmV0cnk6CiAJaWYgKGZzcC0+cmVjb3ZfcmV0cnkrKyA8IEZDX01BWF9SRUNPVl9SRVRSWSkKIAkJZmNfZmNwX3RpbWVyX3NldChmc3AsIEZDX1NDU0lfUkVDX1RPVik7CkBAIC0xMzIxLDEyICsxMzgyLDE2IEBACiAJCWZjX3RpbWVvdXRfZXJyb3IoZnNwKTsKIH0KIAotLyoKLSAqIFJlY2VpdmUgaGFuZGxlciBmb3IgUkVDIEVMUyBmcmFtZQotICogaWYgaXQgaXMgYSByZWplY3QgdGhlbiBsZXQgdGhlIHNjc2kgbGF5ZXIgdG8gaGFuZGxlCi0gKiB0aGUgdGltZW91dC4gaWYgaXQgaXMgYSBMU19BQ0MgdGhlbiBpZiB0aGUgaW8gd2FzIG5vdCBjb21wbGV0ZWQKLSAqIHRoZW4gc2V0IHRoZSB0aW1lb3V0IGFuZCByZXR1cm4gb3RoZXJ3aXNlIGNvbXBsZXRlIHRoZSBleGNoYW5nZQotICogYW5kIHRlbGwgdGhlIHNjc2kgbGF5ZXIgdG8gcmVzdGFydCB0aGUgSS9PLgorLyoqCisgKiBmY19mY3BfcmVjX3Jlc3AoKSAtIEhhbmRsZXIgZm9yIFJFQyBFTFMgcmVzcG9uc2VzCisgKiBAc2VxOiBUaGUgc2VxdWVuY2UgdGhlIHJlc3BvbnNlIGlzIG9uCisgKiBAZnA6CSBUaGUgcmVzcG9uc2UgZnJhbWUKKyAqIEBhcmc6IFRoZSBGQ1AgcGFja2V0IHRoZSByZXNwb25zZSBpcyBvbgorICoKKyAqIElmIHRoZSByZXNwb25zZSBpcyBhIHJlamVjdCB0aGVuIHRoZSBzY3NpIGxheWVyIHdpbGwgaGFuZGxlCisgKiB0aGUgdGltZW91dC4gSWYgdGhlIHJlc3BvbnNlIGlzIGEgTFNfQUNDIHRoZW4gaWYgdGhlIEkvTyB3YXMgbm90IGNvbXBsZXRlZAorICogc2V0IHRoZSB0aW1lb3V0IGFuZCByZXR1cm4uIElmIHRoZSBJL08gd2FzIGNvbXBsZXRlZCB0aGVuIGNvbXBsZXRlIHRoZQorICogZXhjaGFuZ2UgYW5kIHRlbGwgdGhlIFNDU0kgbGF5ZXIuCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2ZjcF9yZWNfcmVzcChzdHJ1Y3QgZmNfc2VxICpzZXEsIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZykKIHsKQEAgLTEzMzgsNyArMTQwMyw3IEBACiAJdTMyIG9mZnNldDsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkYXRhX2RpcjsKIAllbnVtIGZjX3JjdGwgcl9jdGw7Ci0Jc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwOworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycHJpdjsKIAogCWlmIChJU19FUlIoZnApKSB7CiAJCWZjX2ZjcF9yZWNfZXJyb3IoZnNwLCBmcCk7CkBAIC0xMzYxLDEzICsxNDI2LDEzIEBACiAJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBFTFNfUkpUX1VOU1VQOgogCQkJRkNfRkNQX0RCRyhmc3AsICJkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBSRUNcbiIpOwotCQkJcnAgPSBmc3AtPnJwb3J0LT5kZF9kYXRhOworCQkJcnByaXYgPSBmc3AtPnJwb3J0LT5kZF9kYXRhOwogCQkJLyoKIAkJCSAqIGlmIHdlIGRvIG5vdCBzcHBvcnQgUkVDcyBvciBnb3Qgc29tZSBib2d1cwogCQkJICogcmVhc29uIHRoZW4gcmVzZXR1cCB0aW1lciBzbyB3ZSBjaGVjayBmb3IKIAkJCSAqIG1ha2luZyBwcm9ncmVzcy4KIAkJCSAqLwotCQkJcnAtPmZsYWdzICY9IH5GQ19SUF9GTEFHU19SRUNfU1VQUE9SVEVEOworCQkJcnByaXYtPmZsYWdzICY9IH5GQ19SUF9GTEFHU19SRUNfU1VQUE9SVEVEOwogCQkJZmNfZmNwX3RpbWVyX3NldChmc3AsIEZDX1NDU0lfRVJfVElNRU9VVCk7CiAJCQlicmVhazsKIAkJY2FzZSBFTFNfUkpUX0xPR0lDOgpAQCAtMTQ2NCw4ICsxNTI5LDEwIEBACiAJZmNfZnJhbWVfZnJlZShmcCk7CiB9CiAKLS8qCi0gKiBIYW5kbGUgZXJyb3IgcmVzcG9uc2Ugb3IgdGltZW91dCBmb3IgUkVDIGV4Y2hhbmdlLgorLyoqCisgKiBmY19mY3BfcmVjX2Vycm9yKCkgLSBIYW5kbGVyIGZvciBSRUMgZXJyb3JzCisgKiBAZnNwOiBUaGUgRkNQIHBhY2tldCB0aGUgZXJyb3IgaXMgb24KKyAqIEBmcDoJIFRoZSBSRUMgZnJhbWUKICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX3JlY19lcnJvcihzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewpAQCAtMTUwNCwxMCArMTU3MSw5IEBACiAJZmNfZmNwX3BrdF9yZWxlYXNlKGZzcCk7CS8qIGRyb3AgaG9sZCBmb3Igb3V0c3RhbmRpbmcgUkVDICovCiB9CiAKLS8qCi0gKiBUaW1lIG91dCBlcnJvciByb3V0aW5lOgotICogYWJvcnQncyB0aGUgSS9PIGNsb3NlIHRoZSBleGNoYW5nZSBhbmQKLSAqIHNlbmQgY29tcGxldGlvbiBub3RpZmljYXRpb24gdG8gc2NzaSBsYXllcgorLyoqCisgKiBmY190aW1lb3V0X2Vycm9yKCkgLSBIYW5kbGVyIGZvciBmY3BfcGt0IHRpbWVvdXRzCisgKiBAZnNwOiBUaGUgRkNQIHBhY2t0IHRoYXQgaGFzIHRpbWVkIG91dAogICovCiBzdGF0aWMgdm9pZCBmY190aW1lb3V0X2Vycm9yKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCiB7CkBAIC0xNTIxLDE2ICsxNTg3LDE4IEBACiAJZmNfZmNwX3NlbmRfYWJvcnQoZnNwKTsKIH0KIAotLyoKLSAqIFNlcXVlbmNlIHJldHJhbnNtaXNzaW9uIHJlcXVlc3QuCisvKioKKyAqIGZjX2ZjcF9zcnIoKSAtIFNlbmQgYSBTUlIgcmVxdWVzdCAoU2VxdWVuY2UgUmV0cmFuc21pc3Npb24gUmVxdWVzdCkKKyAqIEBmc3A6ICAgVGhlIEZDUCBwYWNrZXQgdGhlIFNSUiBpcyB0byBiZSBzZW50IG9uCisgKiBAcl9jdGw6IFRoZSBSX0NUTCBmaWVsZCBmb3IgdGhlIFNSUiByZXF1ZXN0CiAgKiBUaGlzIGlzIGNhbGxlZCBhZnRlciByZWNlaXZpbmcgc3RhdHVzIGJ1dCBpbnN1ZmZpY2llbnQgZGF0YSwgb3IKICAqIHdoZW4gZXhwZWN0aW5nIHN0YXR1cyBidXQgdGhlIHJlcXVlc3QgaGFzIHRpbWVkIG91dC4KICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX3NycihzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBlbnVtIGZjX3JjdGwgcl9jdGwsIHUzMiBvZmZzZXQpCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscCA9IGZzcC0+bHA7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGZzcC0+bHA7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKLQlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnA7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwcml2OwogCXN0cnVjdCBmY19leGNoICplcCA9IGZjX3NlcV9leGNoKGZzcC0+c2VxX3B0cik7CiAJc3RydWN0IGZjX3NlcSAqc2VxOwogCXN0cnVjdCBmY3Bfc3JyICpzcnI7CkBAIC0xNTM4LDEyICsxNjA2LDEzIEBACiAJdTggY2RiX29wOwogCiAJcnBvcnQgPSBmc3AtPnJwb3J0OwotCXJwID0gcnBvcnQtPmRkX2RhdGE7CisJcnByaXYgPSBycG9ydC0+ZGRfZGF0YTsKIAljZGJfb3AgPSBmc3AtPmNkYl9jbWQuZmNfY2RiWzBdOwogCi0JaWYgKCEocnAtPmZsYWdzICYgRkNfUlBfRkxBR1NfUkVUUlkpIHx8IHJwLT5ycF9zdGF0ZSAhPSBSUE9SVF9TVF9SRUFEWSkKKwlpZiAoIShycHJpdi0+ZmxhZ3MgJiBGQ19SUF9GTEFHU19SRVRSWSkgfHwKKwkgICAgcnByaXYtPnJwX3N0YXRlICE9IFJQT1JUX1NUX1JFQURZKQogCQlnb3RvIHJldHJ5OwkJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KLQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwLCBzaXplb2YoKnNycikpOworCWZwID0gZmNfZmNwX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2YoKnNycikpOwogCWlmICghZnApCiAJCWdvdG8gcmV0cnk7CiAKQEAgLTE1NTYsMTUgKzE2MjUsMTQgQEAKIAlzcnItPnNycl9yZWxfb2ZmID0gaHRvbmwob2Zmc2V0KTsKIAogCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0VMUzRfUkVRLCBycG9ydC0+cG9ydF9pZCwKLQkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChycC0+bG9jYWxfcG9ydC0+aG9zdCksIEZDX1RZUEVfRkNQLAorCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKHJwcml2LT5sb2NhbF9wb3J0LT5ob3N0KSwgRkNfVFlQRV9GQ1AsCiAJCSAgICAgICBGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOwogCi0Jc2VxID0gbHAtPnR0LmV4Y2hfc2VxX3NlbmQobHAsIGZwLCBmY19mY3Bfc3JyX3Jlc3AsIE5VTEwsCi0JCQkJICAgZnNwLCBqaWZmaWVzX3RvX21zZWNzKEZDX1NDU0lfUkVDX1RPVikpOwotCWlmICghc2VxKSB7Ci0JCWZjX2ZyYW1lX2ZyZWUoZnApOworCXNlcSA9IGxwb3J0LT50dC5leGNoX3NlcV9zZW5kKGxwb3J0LCBmcCwgZmNfZmNwX3Nycl9yZXNwLCBOVUxMLAorCQkJCSAgICAgIGZzcCwgamlmZmllc190b19tc2VjcyhGQ19TQ1NJX1JFQ19UT1YpKTsKKwlpZiAoIXNlcSkKIAkJZ290byByZXRyeTsKLQl9CisKIAlmc3AtPnJlY292X3NlcSA9IHNlcTsKIAlmc3AtPnhmZXJfbGVuID0gb2Zmc2V0OwogCWZzcC0+eGZlcl9jb250aWdfZW5kID0gb2Zmc2V0OwpAQCAtMTU3NSw4ICsxNjQzLDExIEBACiAJZmNfZmNwX3JldHJ5X2NtZChmc3ApOwogfQogCi0vKgotICogSGFuZGxlIHJlc3BvbnNlIGZyb20gU1JSLgorLyoqCisgKiBmY19mY3Bfc3JyX3Jlc3AoKSAtIEhhbmRsZXIgZm9yIFNSUiByZXNwb25zZQorICogQHNlcTogVGhlIHNlcXVlbmNlIHRoZSBTUlIgaXMgb24KKyAqIEBmcDoJIFRoZSBTUlIgZnJhbWUKKyAqIEBhcmc6IFRoZSBGQ1AgcGFja2V0IHRoZSBTUlIgaXMgb24KICAqLwogc3RhdGljIHZvaWQgZmNfZmNwX3Nycl9yZXNwKHN0cnVjdCBmY19zZXEgKnNlcSwgc3RydWN0IGZjX2ZyYW1lICpmcCwgdm9pZCAqYXJnKQogewpAQCAtMTYyMiw2ICsxNjkzLDExIEBACiAJZmNfZmNwX3BrdF9yZWxlYXNlKGZzcCk7CS8qIGRyb3AgaG9sZCBmb3Igb3V0c3RhbmRpbmcgU1JSICovCiB9CiAKKy8qKgorICogZmNfZmNwX3Nycl9lcnJvcigpIC0gSGFuZGxlciBmb3IgU1JSIGVycm9ycworICogQGZzcDogVGhlIEZDUCBwYWNrZXQgdGhhdCB0aGUgU1JSIGVycm9yIGlzIG9uCisgKiBAZnA6CSBUaGUgU1JSIGZyYW1lCisgKi8KIHN0YXRpYyB2b2lkIGZjX2ZjcF9zcnJfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKIAlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCkBAIC0xNjQ2LDMxICsxNzIyLDM2IEBACiAJZmNfZmNwX3BrdF9yZWxlYXNlKGZzcCk7CS8qIGRyb3AgaG9sZCBmb3Igb3V0c3RhbmRpbmcgU1JSICovCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZjX2ZjcF9scG9ydF9xdWV1ZV9yZWFkeShzdHJ1Y3QgZmNfbHBvcnQgKmxwKQorLyoqCisgKiBmY19mY3BfbHBvcnRfcXVldWVfcmVhZHkoKSAtIERldGVybWluZSBpZiB0aGUgbHBvcnQgYW5kIGl0J3MgcXVldWUgaXMgcmVhZHkKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gYmUgY2hlY2tlZAorICovCitzdGF0aWMgaW5saW5lIGludCBmY19mY3BfbHBvcnRfcXVldWVfcmVhZHkoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKIAkvKiBsb2NrID8gKi8KLQlyZXR1cm4gKGxwLT5zdGF0ZSA9PSBMUE9SVF9TVF9SRUFEWSkgJiYgbHAtPmxpbmtfdXAgJiYgIWxwLT5xZnVsbDsKKwlyZXR1cm4gKGxwb3J0LT5zdGF0ZSA9PSBMUE9SVF9TVF9SRUFEWSkgJiYKKwkJbHBvcnQtPmxpbmtfdXAgJiYgIWxwb3J0LT5xZnVsbDsKIH0KIAogLyoqCi0gKiBmY19xdWV1ZWNvbW1hbmQgLSBUaGUgcXVldWVjb21tYW5kIGZ1bmN0aW9uIG9mIHRoZSBzY3NpIHRlbXBsYXRlCi0gKiBAY21kOglzdHJ1Y3Qgc2NzaV9jbW5kIHRvIGJlIGV4ZWN1dGVkCi0gKiBAZG9uZToJQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gY21kIGlzIGNvbXBsZXRlZAorICogZmNfcXVldWVjb21tYW5kKCkgLSBUaGUgcXVldWVjb21tYW5kIGZ1bmN0aW9uIG9mIHRoZSBTQ1NJIHRlbXBsYXRlCisgKiBAY21kOiAgIFRoZSBzY3NpX2NtbmQgdG8gYmUgZXhlY3V0ZWQKKyAqIEBkb25lOiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzY3NpX2NtbmQgaXMgY29tcGxldGUKICAqCi0gKiB0aGlzIGlzIHRoZSBpL28gc3RyYXRlZ3kgcm91dGluZSwgY2FsbGVkIGJ5IHRoZSBzY3NpIGxheWVyCi0gKiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggaG9sZGluZyB0aGUgaG9zdF9sb2NrLgorICogVGhpcyBpcyB0aGUgaS9vIHN0cmF0ZWd5IHJvdXRpbmUsIGNhbGxlZCBieSB0aGUgU0NTSSBsYXllci4gVGhpcyByb3V0aW5lCisgKiBpcyBjYWxsZWQgd2l0aCB0aGUgaG9zdF9sb2NrIGhlbGQuCiAgKi8KIGludCBmY19xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2NfY21kLT5kZXZpY2UpKTsKIAlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwOwotCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnByaXY7CiAJaW50IHJ2YWw7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgZmNvZV9kZXZfc3RhdHMgKnN0YXRzOwogCi0JbHAgPSBzaG9zdF9wcml2KHNjX2NtZC0+ZGV2aWNlLT5ob3N0KTsKKwlscG9ydCA9IHNob3N0X3ByaXYoc2NfY21kLT5kZXZpY2UtPmhvc3QpOwogCiAJcnZhbCA9IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KTsKIAlpZiAocnZhbCkgewpAQCAtMTY4OSwxNCArMTc3MCwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlycCA9IHJwb3J0LT5kZF9kYXRhOworCXJwcml2ID0gcnBvcnQtPmRkX2RhdGE7CiAKLQlpZiAoIWZjX2ZjcF9scG9ydF9xdWV1ZV9yZWFkeShscCkpIHsKKwlpZiAoIWZjX2ZjcF9scG9ydF9xdWV1ZV9yZWFkeShscG9ydCkpIHsKKwkJaWYgKGxwb3J0LT5xZnVsbCkKKwkJCWZjX2ZjcF9jYW5fcXVldWVfcmFtcF9kb3duKGxwb3J0KTsKIAkJcmMgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCQlnb3RvIG91dDsKIAl9CiAKLQlmc3AgPSBmY19mY3BfcGt0X2FsbG9jKGxwLCBHRlBfQVRPTUlDKTsKKwlmc3AgPSBmY19mY3BfcGt0X2FsbG9jKGxwb3J0LCBHRlBfQVRPTUlDKTsKIAlpZiAoZnNwID09IE5VTEwpIHsKIAkJcmMgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCQlnb3RvIG91dDsKQEAgLTE3MDYsOCArMTc4OSw5IEBACiAJICogYnVpbGQgdGhlIGxpYmZjIHJlcXVlc3QgcGt0CiAJICovCiAJZnNwLT5jbWQgPSBzY19jbWQ7CS8qIHNhdmUgdGhlIGNtZCAqLwotCWZzcC0+bHAgPSBscDsJCS8qIHNhdmUgdGhlIHNvZnRjIHB0ciAqLworCWZzcC0+bHAgPSBscG9ydDsJLyogc2F2ZSB0aGUgc29mdGMgcHRyICovCiAJZnNwLT5ycG9ydCA9IHJwb3J0OwkvKiBzZXQgdGhlIHJlbW90ZSBwb3J0IHB0ciAqLworCWZzcC0+eGZlcl9kZHAgPSBGQ19YSURfVU5LTk9XTjsKIAlzY19jbWQtPnNjc2lfZG9uZSA9IGRvbmU7CiAKIAkvKgpAQCAtMTcxOSw3ICsxODAzLDcgQEAKIAkvKgogCSAqIHNldHVwIHRoZSBkYXRhIGRpcmVjdGlvbgogCSAqLwotCXN0YXRzID0gZmNfbHBvcnRfZ2V0X3N0YXRzKGxwKTsKKwlzdGF0cyA9IGZjX2xwb3J0X2dldF9zdGF0cyhscG9ydCk7CiAJaWYgKHNjX2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CiAJCWZzcC0+cmVxX2ZsYWdzID0gRkNfU1JCX1JFQUQ7CiAJCXN0YXRzLT5JbnB1dFJlcXVlc3RzKys7CkBAIC0xNzMzLDcgKzE4MTcsNyBAQAogCQlzdGF0cy0+Q29udHJvbFJlcXVlc3RzKys7CiAJfQogCi0JZnNwLT50Z3RfZmxhZ3MgPSBycC0+ZmxhZ3M7CisJZnNwLT50Z3RfZmxhZ3MgPSBycHJpdi0+ZmxhZ3M7CiAKIAlpbml0X3RpbWVyKCZmc3AtPnRpbWVyKTsKIAlmc3AtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylmc3A7CkBAIC0xNzQzLDcgKzE4MjcsNyBAQAogCSAqIGlmIHdlIGdldCAtMSByZXR1cm4gdGhlbiBwdXQgdGhlIHJlcXVlc3QgaW4gdGhlIHBlbmRpbmcKIAkgKiBxdWV1ZS4KIAkgKi8KLQlydmFsID0gZmNfZmNwX3BrdF9zZW5kKGxwLCBmc3ApOworCXJ2YWwgPSBmY19mY3BfcGt0X3NlbmQobHBvcnQsIGZzcCk7CiAJaWYgKHJ2YWwgIT0gMCkgewogCQlmc3AtPnN0YXRlID0gRkNfU1JCX0ZSRUU7CiAJCWZjX2ZjcF9wa3RfcmVsZWFzZShmc3ApOwpAQCAtMTc1NSwxOCArMTgzOSwxNyBAQAogRVhQT1JUX1NZTUJPTChmY19xdWV1ZWNvbW1hbmQpOwogCiAvKioKLSAqIGZjX2lvX2NvbXBsKCkgLSAgSGFuZGxlIHJlc3BvbnNlcyBmb3IgY29tcGxldGVkIGNvbW1hbmRzCi0gKiBAZnNwOglzY3NpIHBhY2tldAorICogZmNfaW9fY29tcGwoKSAtIEhhbmRsZSByZXNwb25zZXMgZm9yIGNvbXBsZXRlZCBjb21tYW5kcworICogQGZzcDogVGhlIEZDUCBwYWNrZXQgdGhhdCBpcyBjb21wbGV0ZQogICoKLSAqIFRyYW5zbGF0ZXMgYSBlcnJvciB0byBhIExpbnV4IFNDU0kgZXJyb3IuCi0gKgorICogVHJhbnNsYXRlcyBmY3BfcGt0IGVycm9ycyB0byBhIExpbnV4IFNDU0kgZXJyb3JzLgogICogVGhlIGZjcCBwYWNrZXQgbG9jayBtdXN0IGJlIGhlbGQgd2hlbiBjYWxsaW5nLgogICovCiBzdGF0aWMgdm9pZCBmY19pb19jb21wbChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQogewogCXN0cnVjdCBmY19mY3BfaW50ZXJuYWwgKnNpOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZDsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIHJlbGVhc2Ugb3V0c3RhbmRpbmcgZGRwIGNvbnRleHQgKi8KQEAgLTE3NzksMjggKzE4NjIsMjYgQEAKIAkJc3Bpbl9sb2NrX2JoKCZmc3AtPnNjc2lfcGt0X2xvY2spOwogCX0KIAotCWxwID0gZnNwLT5scDsKLQlzaSA9IGZjX2dldF9zY3NpX2ludGVybmFsKGxwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZShscC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbHBvcnQgPSBmc3AtPmxwOworCXNpID0gZmNfZ2V0X3Njc2lfaW50ZXJuYWwobHBvcnQpOworCXNwaW5fbG9ja19pcnFzYXZlKGxwb3J0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIWZzcC0+Y21kKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxwb3J0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qCi0JICogaWYgYSBjb21tYW5kIHRpbWVkIG91dCB3aGlsZSB3ZSBoYWQgdG8gdHJ5IGFuZCB0aHJvdHRsZSBJTwotCSAqIGFuZCBpdCBpcyBub3cgZ2V0dGluZyBjbGVhbmVkIHVwLCB0aGVuIHdlIGFyZSBhYm91dCB0bwotCSAqIHRyeSBhZ2FpbiBzbyBjbGVhciB0aGUgdGhyb3R0bGVkIGZsYWcgaW5jYXNlIHdlIGdldCBtb3JlCi0JICogdGltZSBvdXRzLgorCSAqIGlmIGNhbl9xdWV1ZSByYW1wIGRvd24gaXMgZG9uZSB0aGVuIHRyeSBjYW5fcXVldWUgcmFtcCB1cAorCSAqIHNpbmNlIGNvbW1hbmRzIGFyZSBjb21wbGV0aW5nIG5vdy4KIAkgKi8KLQlpZiAoc2ktPnRocm90dGxlZCAmJiBmc3AtPnN0YXRlICYgRkNfU1JCX05PTUVNKQotCQlzaS0+dGhyb3R0bGVkID0gMDsKKwlpZiAoc2ktPmxhc3RfY2FuX3F1ZXVlX3JhbXBfZG93bl90aW1lKQorCQlmY19mY3BfY2FuX3F1ZXVlX3JhbXBfdXAobHBvcnQpOwogCiAJc2NfY21kID0gZnNwLT5jbWQ7CiAJZnNwLT5jbWQgPSBOVUxMOwogCiAJaWYgKCFzY19jbWQtPlNDcC5wdHIpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShscC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHBvcnQtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xODE0LDIxICsxODk1LDYgQEAKIAkJCXNjX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OwogCQkJaWYgKGZzcC0+c2NzaV9yZXNpZCkKIAkJCQlDTURfUkVTSURfTEVOKHNjX2NtZCkgPSBmc3AtPnNjc2lfcmVzaWQ7Ci0JCX0gZWxzZSBpZiAoZnNwLT5jZGJfc3RhdHVzID09IFFVRVVFX0ZVTEwpIHsKLQkJCXN0cnVjdCBzY3NpX2RldmljZSAqdG1wX3NkZXY7Ci0JCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzY19jbWQtPmRldmljZTsKLQotCQkJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHRtcF9zZGV2LCBzZGV2LT5ob3N0KSB7Ci0JCQkJaWYgKHRtcF9zZGV2LT5pZCAhPSBzZGV2LT5pZCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAodG1wX3NkZXYtPnF1ZXVlX2RlcHRoID4gMSkgewotCQkJCQlzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwodG1wX3NkZXYsCi0JCQkJCQkJICAgICAgdG1wX3NkZXYtPgotCQkJCQkJCSAgICAgIHF1ZXVlX2RlcHRoIC0gMSk7Ci0JCQkJfQotCQkJfQotCQkJc2NfY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IGZzcC0+Y2RiX3N0YXR1czsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiB0cmFuc3BvcnQgbGV2ZWwgSS9PIHdhcyBvayBidXQgc2NzaQpAQCAtMTg0Niw3ICsxOTEyLDggQEAKIAkJCSAqIHNjc2kgc3RhdHVzIGlzIGdvb2QgYnV0IHRyYW5zcG9ydCBsZXZlbAogCQkJICogdW5kZXJydW4uCiAJCQkgKi8KLQkJCXNjX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJc2NfY21kLT5yZXN1bHQgPSAoZnNwLT5zdGF0ZSAmIEZDX1NSQl9SQ1ZfU1RBVFVTID8KKwkJCQkJICBESURfT0sgOiBESURfRVJST1IpIDw8IDE2OwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIHNjc2kgZ290IHVuZGVycnVuLCB0aGlzIGlzIGFuIGVycm9yCkBAIC0xODgxLDYwICsxOTQ4LDQyIEBACiAJbGlzdF9kZWwoJmZzcC0+bGlzdCk7CiAJc2NfY21kLT5TQ3AucHRyID0gTlVMTDsKIAlzY19jbWQtPnNjc2lfZG9uZShzY19jbWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHBvcnQtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCiAJLyogcmVsZWFzZSByZWYgZnJvbSBpbml0aWFsIGFsbG9jYXRpb24gaW4gcXVldWUgY29tbWFuZCAqLwogCWZjX2ZjcF9wa3RfcmVsZWFzZShmc3ApOwogfQogCiAvKioKLSAqIGZjX2ZjcF9jb21wbGV0ZSgpIC0gY29tcGxldGUgcHJvY2Vzc2luZyBvZiBhIGZjcCBwYWNrZXQKLSAqIEBmc3A6CWZjcCBwYWNrZXQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCBpZiBhIGZzcCB0aW1lciBpcyBwZW5kaW5nLgotICogVGhlIGhvc3QgbG9jayBtdXN0IG5vdCBiZSBoZWxkIGJ5IGNhbGxlci4KLSAqLwotdm9pZCBmY19mY3BfY29tcGxldGUoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKLXsKLQlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCi0JCXJldHVybjsKLQotCWZjX2ZjcF9jb21wbGV0ZV9sb2NrZWQoZnNwKTsKLQlmY19mY3BfdW5sb2NrX3BrdChmc3ApOwotfQotRVhQT1JUX1NZTUJPTChmY19mY3BfY29tcGxldGUpOwotCi0vKioKICAqIGZjX2VoX2Fib3J0KCkgLSBBYm9ydCBhIGNvbW1hbmQKLSAqIEBzY19jbWQ6CXNjc2kgY29tbWFuZCB0byBhYm9ydAorICogQHNjX2NtZDogVGhlIFNDU0kgY29tbWFuZCB0byBhYm9ydAogICoKLSAqIEZyb20gc2NzaSBob3N0IHRlbXBsYXRlLgotICogc2VuZCBBQlRTIHRvIHRoZSB0YXJnZXQgZGV2aWNlICBhbmQgd2FpdCBmb3IgdGhlIHJlc3BvbnNlCi0gKiBzY19jbWQgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgdG8gYmUgYWJvcnRlZC4KKyAqIEZyb20gU0NTSSBob3N0IHRlbXBsYXRlLgorICogU2VuZCBhbiBBQlRTIHRvIHRoZSB0YXJnZXQgZGV2aWNlIGFuZCB3YWl0IGZvciB0aGUgcmVzcG9uc2UuCiAgKi8KIGludCBmY19laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQpCiB7CiAJc3RydWN0IGZjX2ZjcF9wa3QgKmZzcDsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJaW50IHJjID0gRkFJTEVEOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlscCA9IHNob3N0X3ByaXYoc2NfY21kLT5kZXZpY2UtPmhvc3QpOwotCWlmIChscC0+c3RhdGUgIT0gTFBPUlRfU1RfUkVBRFkpCisJbHBvcnQgPSBzaG9zdF9wcml2KHNjX2NtZC0+ZGV2aWNlLT5ob3N0KTsKKwlpZiAobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZKQogCQlyZXR1cm4gcmM7Ci0JZWxzZSBpZiAoIWxwLT5saW5rX3VwKQorCWVsc2UgaWYgKCFscG9ydC0+bGlua191cCkKIAkJcmV0dXJuIHJjOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGxwb3J0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlmc3AgPSBDTURfU1Aoc2NfY21kKTsKIAlpZiAoIWZzcCkgewogCQkvKiBjb21tYW5kIGNvbXBsZXRlZCB3aGlsZSBzY3NpIGVoIHdhcyBzZXR0aW5nIHVwICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxwb3J0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIFNVQ0NFU1M7CiAJfQogCS8qIGdyYWIgYSByZWYgc28gdGhlIGZzcCBhbmQgc2NfY21kIGNhbm5vdCBiZSByZWxhc2VkIGZyb20gdW5kZXIgdXMgKi8KIAlmY19mY3BfcGt0X2hvbGQoZnNwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxwb3J0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAogCWlmIChmY19mY3BfbG9ja19wa3QoZnNwKSkgewogCQkvKiBjb21wbGV0ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIGZvciB0aW1lciB0byBiZSBkZWxldGVkICovCkBAIC0xOTQyLDcgKzE5OTEsNyBAQAogCQlnb3RvIHJlbGVhc2VfcGt0OwogCX0KIAotCXJjID0gZmNfZmNwX3BrdF9hYm9ydChscCwgZnNwKTsKKwlyYyA9IGZjX2ZjcF9wa3RfYWJvcnQoZnNwKTsKIAlmY19mY3BfdW5sb2NrX3BrdChmc3ApOwogCiByZWxlYXNlX3BrdDoKQEAgLTE5NTIsMzcgKzIwMDEsMzQgQEAKIEVYUE9SVF9TWU1CT0woZmNfZWhfYWJvcnQpOwogCiAvKioKLSAqIGZjX2VoX2RldmljZV9yZXNldCgpIFJlc2V0IGEgc2luZ2xlIExVTgotICogQHNjX2NtZDoJc2NzaSBjb21tYW5kCisgKiBmY19laF9kZXZpY2VfcmVzZXQoKSAtIFJlc2V0IGEgc2luZ2xlIExVTgorICogQHNjX2NtZDogVGhlIFNDU0kgY29tbWFuZCB3aGljaCBpZGVudGlmaWVzIHRoZSBkZXZpY2Ugd2hvc2UKKyAqCSAgICBMVU4gaXMgdG8gYmUgcmVzZXQKICAqCi0gKiBTZXQgZnJvbSBzY3NpIGhvc3QgdGVtcGxhdGUgdG8gc2VuZCB0bSBjbWQgdG8gdGhlIHRhcmdldCBhbmQgd2FpdCBmb3IgdGhlCi0gKiByZXNwb25zZS4KKyAqIFNldCBmcm9tIFNDU0kgaG9zdCB0ZW1wbGF0ZS4KICAqLwogaW50IGZjX2VoX2RldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQpCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBmY19mY3BfcGt0ICpmc3A7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2NfY21kLT5kZXZpY2UpKTsKIAlpbnQgcmMgPSBGQUlMRUQ7Ci0Jc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwOwogCWludCBydmFsOwogCiAJcnZhbCA9IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KTsKIAlpZiAocnZhbCkKIAkJZ290byBvdXQ7CiAKLQlycCA9IHJwb3J0LT5kZF9kYXRhOwotCWxwID0gc2hvc3RfcHJpdihzY19jbWQtPmRldmljZS0+aG9zdCk7CisJbHBvcnQgPSBzaG9zdF9wcml2KHNjX2NtZC0+ZGV2aWNlLT5ob3N0KTsKIAotCWlmIChscC0+c3RhdGUgIT0gTFBPUlRfU1RfUkVBRFkpCisJaWYgKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9SRUFEWSkKIAkJcmV0dXJuIHJjOwogCi0JRkNfU0NTSV9EQkcobHAsICJSZXNldHRpbmcgcnBvcnQgKCU2eClcbiIsIHJwb3J0LT5wb3J0X2lkKTsKKwlGQ19TQ1NJX0RCRyhscG9ydCwgIlJlc2V0dGluZyBycG9ydCAoJTZ4KVxuIiwgcnBvcnQtPnBvcnRfaWQpOwogCi0JZnNwID0gZmNfZmNwX3BrdF9hbGxvYyhscCwgR0ZQX05PSU8pOworCWZzcCA9IGZjX2ZjcF9wa3RfYWxsb2MobHBvcnQsIEdGUF9OT0lPKTsKIAlpZiAoZnNwID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibGliZmM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBzY3NpX3BrdFxuIik7Ci0JCXNjX2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTk5MSwxMyArMjAzNywxMyBAQAogCSAqIHRoZSBzYyBwYXNzZWQgaW4gaXMgbm90IHNldHVwIGZvciBleGVjdXRpb24gbGlrZSB3aGVuIHNlbnQKIAkgKiB0aHJvdWdoIHRoZSBxdWV1ZWNvbW1hbmQgY2FsbG91dC4KIAkgKi8KLQlmc3AtPmxwID0gbHA7CQkvKiBzYXZlIHRoZSBzb2Z0YyBwdHIgKi8KKwlmc3AtPmxwID0gbHBvcnQ7CS8qIHNhdmUgdGhlIHNvZnRjIHB0ciAqLwogCWZzcC0+cnBvcnQgPSBycG9ydDsJLyogc2V0IHRoZSByZW1vdGUgcG9ydCBwdHIgKi8KIAogCS8qCiAJICogZmx1c2ggb3V0c3RhbmRpbmcgY29tbWFuZHMKIAkgKi8KLQlyYyA9IGZjX2x1bl9yZXNldChscCwgZnNwLCBzY21kX2lkKHNjX2NtZCksIHNjX2NtZC0+ZGV2aWNlLT5sdW4pOworCXJjID0gZmNfbHVuX3Jlc2V0KGxwb3J0LCBmc3AsIHNjbWRfaWQoc2NfY21kKSwgc2NfY21kLT5kZXZpY2UtPmx1bik7CiAJZnNwLT5zdGF0ZSA9IEZDX1NSQl9GUkVFOwogCWZjX2ZjcF9wa3RfcmVsZWFzZShmc3ApOwogCkBAIC0yMDA3LDM4ICsyMDUzLDM5IEBACiBFWFBPUlRfU1lNQk9MKGZjX2VoX2RldmljZV9yZXNldCk7CiAKIC8qKgotICogZmNfZWhfaG9zdF9yZXNldCgpIC0gVGhlIHJlc2V0IGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIHBvcnRzIG9uIHRoZSBob3N0LgotICogQHNjX2NtZDoJc2NzaSBjb21tYW5kCisgKiBmY19laF9ob3N0X3Jlc2V0KCkgLSBSZXNldCBhIFNjc2lfSG9zdC4KKyAqIEBzY19jbWQ6IFRoZSBTQ1NJIGNvbW1hbmQgdGhhdCBpZGVudGlmaWVzIHRoZSBTQ1NJIGhvc3QgdG8gYmUgcmVzZXQKICAqLwogaW50IGZjX2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2NfY21kLT5kZXZpY2UtPmhvc3Q7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscCA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKIAl1bnNpZ25lZCBsb25nIHdhaXRfdG1vOwogCi0JRkNfU0NTSV9EQkcobHAsICJSZXNldHRpbmcgaG9zdFxuIik7CisJRkNfU0NTSV9EQkcobHBvcnQsICJSZXNldHRpbmcgaG9zdFxuIik7CiAKLQlscC0+dHQubHBvcnRfcmVzZXQobHApOworCWxwb3J0LT50dC5scG9ydF9yZXNldChscG9ydCk7CiAJd2FpdF90bW8gPSBqaWZmaWVzICsgRkNfSE9TVF9SRVNFVF9USU1FT1VUOwotCXdoaWxlICghZmNfZmNwX2xwb3J0X3F1ZXVlX3JlYWR5KGxwKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB3YWl0X3RtbykpCisJd2hpbGUgKCFmY19mY3BfbHBvcnRfcXVldWVfcmVhZHkobHBvcnQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJCQkJICAgICAgIHdhaXRfdG1vKSkKIAkJbXNsZWVwKDEwMDApOwogCi0JaWYgKGZjX2ZjcF9scG9ydF9xdWV1ZV9yZWFkeShscCkpIHsKKwlpZiAoZmNfZmNwX2xwb3J0X3F1ZXVlX3JlYWR5KGxwb3J0KSkgewogCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwgImxpYmZjOiBIb3N0IHJlc2V0IHN1Y2NlZWRlZCAiCi0JCQkgICAgICJvbiBwb3J0ICglNngpXG4iLCBmY19ob3N0X3BvcnRfaWQobHAtPmhvc3QpKTsKKwkJCSAgICAgIm9uIHBvcnQgKCU2eClcbiIsIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOwogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9IGVsc2UgewogCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwgImxpYmZjOiBIb3N0IHJlc2V0IGZhaWxlZCwgIgogCQkJICAgICAicG9ydCAoJTZ4KSBpcyBub3QgcmVhZHkuXG4iLAotCQkJICAgICBmY19ob3N0X3BvcnRfaWQobHAtPmhvc3QpKTsKKwkJCSAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQogfQogRVhQT1JUX1NZTUJPTChmY19laF9ob3N0X3Jlc2V0KTsKIAogLyoqCi0gKiBmY19zbGF2ZV9hbGxvYygpIC0gY29uZmlndXJlIHF1ZXVlIGRlcHRoCi0gKiBAc2RldjoJc2NzaSBkZXZpY2UKKyAqIGZjX3NsYXZlX2FsbG9jKCkgLSBDb25maWd1cmUgdGhlIHF1ZXVlIGRlcHRoIG9mIGEgU2NzaV9Ib3N0CisgKiBAc2RldjogVGhlIFNDU0kgZGV2aWNlIHRoYXQgaWRlbnRpZmllcyB0aGUgU0NTSSBob3N0CiAgKgogICogQ29uZmlndXJlcyBxdWV1ZSBkZXB0aCBiYXNlZCBvbiBob3N0J3MgY21kX3Blcl9sZW4uIElmIG5vdCBzZXQKICAqIHRoZW4gd2UgdXNlIHRoZSBsaWJmYyBkZWZhdWx0LgpAQCAtMjA0NiwyOSArMjA5Myw1MCBAQAogaW50IGZjX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzZGV2KSk7Ci0JaW50IHF1ZXVlX2RlcHRoOwogCiAJaWYgKCFycG9ydCB8fCBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCkpCiAJCXJldHVybiAtRU5YSU87CiAKLQlpZiAoc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkgewotCQlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPmNtZF9wZXJfbHVuKQotCQkJcXVldWVfZGVwdGggPSBzZGV2LT5ob3N0LT5ob3N0dC0+Y21kX3Blcl9sdW47Ci0JCWVsc2UKLQkJCXF1ZXVlX2RlcHRoID0gRkNfRkNQX0RGTFRfUVVFVUVfREVQVEg7Ci0JCXNjc2lfYWN0aXZhdGVfdGNxKHNkZXYsIHF1ZXVlX2RlcHRoKTsKLQl9CisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCXNjc2lfYWN0aXZhdGVfdGNxKHNkZXYsIEZDX0ZDUF9ERkxUX1FVRVVFX0RFUFRIKTsKKwllbHNlCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLAorCQkJCQlGQ19GQ1BfREZMVF9RVUVVRV9ERVBUSCk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZmNfc2xhdmVfYWxsb2MpOwogCi1pbnQgZmNfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKKy8qKgorICogZmNfY2hhbmdlX3F1ZXVlX2RlcHRoKCkgLSBDaGFuZ2UgYSBkZXZpY2UncyBxdWV1ZSBkZXB0aAorICogQHNkZXY6ICAgVGhlIFNDU0kgZGV2aWNlIHdob3NlIHF1ZXVlIGRlcHRoIGlzIHRvIGNoYW5nZQorICogQHFkZXB0aDogVGhlIG5ldyBxdWV1ZSBkZXB0aAorICogQHJlYXNvbjogVGhlIHJlc2Fzb24gZm9yIHRoZSBjaGFuZ2UKKyAqLworaW50IGZjX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgsIGludCByZWFzb24pCiB7Ci0Jc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIHFkZXB0aCk7CisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIFNDU0lfUURFUFRIX0RFRkFVTFQ6CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBxZGVwdGgpOworCQlicmVhazsKKwljYXNlIFNDU0lfUURFUFRIX1FGVUxMOgorCQlzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwoc2RldiwgcWRlcHRoKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX1FERVBUSF9SQU1QX1VQOgorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgcWRlcHRoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIAlyZXR1cm4gc2Rldi0+cXVldWVfZGVwdGg7CiB9CiBFWFBPUlRfU1lNQk9MKGZjX2NoYW5nZV9xdWV1ZV9kZXB0aCk7CiAKKy8qKgorICogZmNfY2hhbmdlX3F1ZXVlX3R5cGUoKSAtIENoYW5nZSBhIGRldmljZSdzIHF1ZXVlIHR5cGUKKyAqIEBzZGV2OiAgICAgVGhlIFNDU0kgZGV2aWNlIHdob3NlIHF1ZXVlIGRlcHRoIGlzIHRvIGNoYW5nZQorICogQHRhZ190eXBlOiBJZGVudGlmaWVyIGZvciBxdWV1ZSB0eXBlCisgKi8KIGludCBmY19jaGFuZ2VfcXVldWVfdHlwZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCB0YWdfdHlwZSkKIHsKIAlpZiAoc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkgewpAQCAtMjA4NCwzOCArMjE1Miw2OSBAQAogfQogRVhQT1JUX1NZTUJPTChmY19jaGFuZ2VfcXVldWVfdHlwZSk7CiAKLXZvaWQgZmNfZmNwX2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscCkKKy8qKgorICogZmNfZmNwX2Rlc3RvcnkoKSAtIFRlYXIgZG93biB0aGUgRkNQIGxheWVyIGZvciBhIGdpdmVuIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCBubyBsb25nZXIgbmVlZHMgdGhlIEZDUCBsYXllcgorICovCit2b2lkIGZjX2ZjcF9kZXN0cm95KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7Ci0Jc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscCk7CisJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscG9ydCk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnNpLT5zY3NpX3BrdF9xdWV1ZSkpCiAJCXByaW50ayhLRVJOX0VSUiAibGliZmM6IExlYWtlZCBTQ1NJIHBhY2tldHMgd2hlbiBkZXN0cm95aW5nICIKLQkJICAgICAgICJwb3J0ICglNngpXG4iLCBmY19ob3N0X3BvcnRfaWQobHAtPmhvc3QpKTsKKwkJICAgICAgICJwb3J0ICglNngpXG4iLCBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKIAogCW1lbXBvb2xfZGVzdHJveShzaS0+c2NzaV9wa3RfcG9vbCk7CiAJa2ZyZWUoc2kpOwotCWxwLT5zY3NpX3ByaXYgPSBOVUxMOworCWxwb3J0LT5zY3NpX3ByaXYgPSBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChmY19mY3BfZGVzdHJveSk7CiAKLWludCBmY19mY3BfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoraW50IGZjX3NldHVwX2ZjcCgpCit7CisJaW50IHJjID0gMDsKKworCXNjc2lfcGt0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJsaWJmY19mY3BfcGt0IiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZmNfZmNwX3BrdCksCisJCQkJCSAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghc2NzaV9wa3RfY2FjaGVwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGliZmM6IFVuYWJsZSB0byBhbGxvY2F0ZSBTUkIgY2FjaGUsICIKKwkJICAgICAgICJtb2R1bGUgbG9hZCBmYWlsZWQhIik7CisJCXJjID0gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgZmNfZGVzdHJveV9mY3AoKQoreworCWlmIChzY3NpX3BrdF9jYWNoZXApCisJCWttZW1fY2FjaGVfZGVzdHJveShzY3NpX3BrdF9jYWNoZXApOworfQorCisvKioKKyAqIGZjX2ZjcF9pbml0KCkgLSBJbml0aWFsaXplIHRoZSBGQ1AgbGF5ZXIgZm9yIGEgbG9jYWwgcG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBpbml0aWFsaXplIHRoZSBleGNoYW5nZSBsYXllciBmb3IKKyAqLworaW50IGZjX2ZjcF9pbml0KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJaW50IHJjOwogCXN0cnVjdCBmY19mY3BfaW50ZXJuYWwgKnNpOwogCi0JaWYgKCFscC0+dHQuZmNwX2NtZF9zZW5kKQotCQlscC0+dHQuZmNwX2NtZF9zZW5kID0gZmNfZmNwX2NtZF9zZW5kOworCWlmICghbHBvcnQtPnR0LmZjcF9jbWRfc2VuZCkKKwkJbHBvcnQtPnR0LmZjcF9jbWRfc2VuZCA9IGZjX2ZjcF9jbWRfc2VuZDsKIAotCWlmICghbHAtPnR0LmZjcF9jbGVhbnVwKQotCQlscC0+dHQuZmNwX2NsZWFudXAgPSBmY19mY3BfY2xlYW51cDsKKwlpZiAoIWxwb3J0LT50dC5mY3BfY2xlYW51cCkKKwkJbHBvcnQtPnR0LmZjcF9jbGVhbnVwID0gZmNfZmNwX2NsZWFudXA7CiAKLQlpZiAoIWxwLT50dC5mY3BfYWJvcnRfaW8pCi0JCWxwLT50dC5mY3BfYWJvcnRfaW8gPSBmY19mY3BfYWJvcnRfaW87CisJaWYgKCFscG9ydC0+dHQuZmNwX2Fib3J0X2lvKQorCQlscG9ydC0+dHQuZmNwX2Fib3J0X2lvID0gZmNfZmNwX2Fib3J0X2lvOwogCiAJc2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmNfZmNwX2ludGVybmFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzaSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbHAtPnNjc2lfcHJpdiA9IHNpOworCWxwb3J0LT5zY3NpX3ByaXYgPSBzaTsKKwlzaS0+bWF4X2Nhbl9xdWV1ZSA9IGxwb3J0LT5ob3N0LT5jYW5fcXVldWU7CiAJSU5JVF9MSVNUX0hFQUQoJnNpLT5zY3NpX3BrdF9xdWV1ZSk7CiAKIAlzaS0+c2NzaV9wa3RfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbCgyLCBzY3NpX3BrdF9jYWNoZXApOwpAQCAtMjEzMCw0MiArMjIyOSwzIEBACiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChmY19mY3BfaW5pdCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxpYmZjX2luaXQodm9pZCkKLXsKLQlpbnQgcmM7Ci0KLQlzY3NpX3BrdF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibGliZmNfZmNwX3BrdCIsCi0JCQkJCSAgICBzaXplb2Yoc3RydWN0IGZjX2ZjcF9wa3QpLAotCQkJCQkgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKLQlpZiAoc2NzaV9wa3RfY2FjaGVwID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsaWJmYzogVW5hYmxlIHRvIGFsbG9jYXRlIFNSQiBjYWNoZSwgIgotCQkgICAgICAgIm1vZHVsZSBsb2FkIGZhaWxlZCEiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmMgPSBmY19zZXR1cF9leGNoX21ncigpOwotCWlmIChyYykKLQkJZ290byBkZXN0cm95X3BrdF9jYWNoZTsKLQotCXJjID0gZmNfc2V0dXBfcnBvcnQoKTsKLQlpZiAocmMpCi0JCWdvdG8gZGVzdHJveV9lbTsKLQotCXJldHVybiByYzsKLWRlc3Ryb3lfZW06Ci0JZmNfZGVzdHJveV9leGNoX21ncigpOwotZGVzdHJveV9wa3RfY2FjaGU6Ci0Ja21lbV9jYWNoZV9kZXN0cm95KHNjc2lfcGt0X2NhY2hlcCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbGliZmNfZXhpdCh2b2lkKQotewotCWttZW1fY2FjaGVfZGVzdHJveShzY3NpX3BrdF9jYWNoZXApOwotCWZjX2Rlc3Ryb3lfZXhjaF9tZ3IoKTsKLQlmY19kZXN0cm95X3Jwb3J0KCk7Ci19Ci0KLW1vZHVsZV9pbml0KGxpYmZjX2luaXQpOwotbW9kdWxlX2V4aXQobGliZmNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZnJhbWUuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mcmFtZS5jCmluZGV4IDYzZmUwMGMuLjZkYTAxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mcmFtZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mcmFtZS5jCkBAIC01MSwyNCArNTEsMjQgQEAKICAqIEFsbG9jYXRlIGEgZnJhbWUgaW50ZW5kZWQgdG8gYmUgc2VudCB2aWEgZmNvZV94bWl0LgogICogR2V0IGFuIHNrX2J1ZmYgZm9yIHRoZSBmcmFtZSBhbmQgc2V0IHRoZSBsZW5ndGguCiAgKi8KLXN0cnVjdCBmY19mcmFtZSAqX19mY19mcmFtZV9hbGxvYyhzaXplX3QgbGVuKQorc3RydWN0IGZjX2ZyYW1lICpfZmNfZnJhbWVfYWxsb2Moc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlXQVJOX09OKChsZW4gJSBzaXplb2YodTMyKSkgIT0gMCk7CiAJbGVuICs9IHNpemVvZihzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyKTsKLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIEZDX0ZSQU1FX0hFQURST09NICsgRkNfRlJBTUVfVEFJTFJPT00pOworCXNrYiA9IGFsbG9jX3NrYl9mY2xvbmUobGVuICsgRkNfRlJBTUVfSEVBRFJPT00gKyBGQ19GUkFNRV9UQUlMUk9PTSArCisJCQkgICAgICAgTkVUX1NLQl9QQUQsIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKKwlza2JfcmVzZXJ2ZShza2IsIE5FVF9TS0JfUEFEICsgRkNfRlJBTUVfSEVBRFJPT00pOwogCWZwID0gKHN0cnVjdCBmY19mcmFtZSAqKSBza2I7CiAJZmNfZnJhbWVfaW5pdChmcCk7Ci0Jc2tiX3Jlc2VydmUoc2tiLCBGQ19GUkFNRV9IRUFEUk9PTSk7CiAJc2tiX3B1dChza2IsIGxlbik7CiAJcmV0dXJuIGZwOwogfQotRVhQT1JUX1NZTUJPTChfX2ZjX2ZyYW1lX2FsbG9jKTsKLQorRVhQT1JUX1NZTUJPTChfZmNfZnJhbWVfYWxsb2MpOwogCiBzdHJ1Y3QgZmNfZnJhbWUgKmZjX2ZyYW1lX2FsbG9jX2ZpbGwoc3RydWN0IGZjX2xwb3J0ICpscCwgc2l6ZV90IHBheWxvYWRfbGVuKQogewpAQCAtNzgsNyArNzgsNyBAQAogCWZpbGwgPSBwYXlsb2FkX2xlbiAlIDQ7CiAJaWYgKGZpbGwgIT0gMCkKIAkJZmlsbCA9IDQgLSBmaWxsOwotCWZwID0gX19mY19mcmFtZV9hbGxvYyhwYXlsb2FkX2xlbiArIGZpbGwpOworCWZwID0gX2ZjX2ZyYW1lX2FsbG9jKHBheWxvYWRfbGVuICsgZmlsbCk7CiAJaWYgKGZwKSB7CiAJCW1lbXNldCgoY2hhciAqKSBmcl9oZHIoZnApICsgcGF5bG9hZF9sZW4sIDAsIGZpbGwpOwogCQkvKiB0cmltIGlzIE9LLCB3ZSBqdXN0IGFsbG9jYXRlZCBpdCBzbyB0aGVyZSBhcmUgbm8gZnJhZ21lbnRzICovCkBAIC04NywzICs4Nyw0IEBACiAJfQogCXJldHVybiBmcDsKIH0KK0VYUE9SVF9TWU1CT0woZmNfZnJhbWVfYWxsb2NfZmlsbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbGliZmMuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjRiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbGliZmMuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KKworI2luY2x1ZGUgImZjX2xpYmZjLmgiCisKK01PRFVMRV9BVVRIT1IoIk9wZW4tRkNvRS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigibGliZmMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKwordW5zaWduZWQgaW50IGZjX2RlYnVnX2xvZ2dpbmc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfbG9nZ2luZywgZmNfZGVidWdfbG9nZ2luZywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19sb2dnaW5nLCAiYSBiaXQgbWFzayBvZiBsb2dnaW5nIGxldmVscyIpOworCisvKioKKyAqIGxpYmZjX2luaXQoKSAtIEluaXRpYWxpemUgbGliZmMua28KKyAqLworc3RhdGljIGludCBfX2luaXQgbGliZmNfaW5pdCh2b2lkKQoreworCWludCByYyA9IDA7CisKKwlyYyA9IGZjX3NldHVwX2ZjcCgpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBmY19zZXR1cF9leGNoX21ncigpOworCWlmIChyYykKKwkJZ290byBkZXN0cm95X3BrdF9jYWNoZTsKKworCXJjID0gZmNfc2V0dXBfcnBvcnQoKTsKKwlpZiAocmMpCisJCWdvdG8gZGVzdHJveV9lbTsKKworCXJldHVybiByYzsKK2Rlc3Ryb3lfZW06CisJZmNfZGVzdHJveV9leGNoX21ncigpOworZGVzdHJveV9wa3RfY2FjaGU6CisJZmNfZGVzdHJveV9mY3AoKTsKKwlyZXR1cm4gcmM7Cit9Cittb2R1bGVfaW5pdChsaWJmY19pbml0KTsKKworLyoqCisgKiBsaWJmY19leGl0KCkgLSBUZWFyIGRvd24gbGliZmMua28KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGxpYmZjX2V4aXQodm9pZCkKK3sKKwlmY19kZXN0cm95X2ZjcCgpOworCWZjX2Rlc3Ryb3lfZXhjaF9tZ3IoKTsKKwlmY19kZXN0cm95X3Jwb3J0KCk7Cit9Cittb2R1bGVfZXhpdChsaWJmY19leGl0KTsKKworLyoqCisgKiBmY19jb3B5X2J1ZmZlcl90b19zZ2xpc3QoKSAtIFRoaXMgcm91dGluZSBjb3BpZXMgdGhlIGRhdGEgb2YgYSBidWZmZXIKKyAqCQkJCWludG8gYSBzY2F0dGVyLWdhdGhlciBsaXN0IChTRyBsaXN0KS4KKyAqCisgKiBAYnVmOiBwb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlci4KKyAqIEBsZW46IHRoZSBieXRlLWxlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIuCisgKiBAc2c6IHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgb2YgdGhlIFNHIGxpc3QuCisgKiBAbmVudHM6IHBvaW50ZXIgdG8gdGhlIHJlbWFpbmluZyBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgU0cgbGlzdC4KKyAqIEBvZmZzZXQ6IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBTRyBsaXN0LgorICogQGttX3R5cGU6IGRlZGljYXRlZCBwYWdlIHRhYmxlIHNsb3QgdHlwZSBmb3Iga21hcF9hdG9taWMuCisgKiBAY3JjOiBwb2ludGVyIHRvIHRoZSAzMi1iaXQgY3JjIHZhbHVlLgorICoJIElmIGNyYyBpcyBOVUxMLCBDUkMgaXMgbm90IGNhbGN1bGF0ZWQuCisgKi8KK3UzMiBmY19jb3B5X2J1ZmZlcl90b19zZ2xpc3Qodm9pZCAqYnVmLCBzaXplX3QgbGVuLAorCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgICB1MzIgKm5lbnRzLCBzaXplX3QgKm9mZnNldCwKKwkJCSAgICAgZW51bSBrbV90eXBlIGttX3R5cGUsIHUzMiAqY3JjKQoreworCXNpemVfdCByZW1haW5pbmcgPSBsZW47CisJdTMyIGNvcHlfbGVuID0gMDsKKworCXdoaWxlIChyZW1haW5pbmcgPiAwICYmIHNnKSB7CisJCXNpemVfdCBvZmYsIHNnX2J5dGVzOworCQl2b2lkICpwYWdlX2FkZHI7CisKKwkJaWYgKCpvZmZzZXQgPj0gc2ctPmxlbmd0aCkgeworCQkJLyoKKwkJCSAqIENoZWNrIGZvciBlbmQgYW5kIGRyb3AgcmVzb3VyY2VzCisJCQkgKiBmcm9tIHRoZSBsYXN0IGl0ZXJhdGlvbi4KKwkJCSAqLworCQkJaWYgKCEoKm5lbnRzKSkKKwkJCQlicmVhazsKKwkJCS0tKCpuZW50cyk7CisJCQkqb2Zmc2V0IC09IHNnLT5sZW5ndGg7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJY29udGludWU7CisJCX0KKwkJc2dfYnl0ZXMgPSBtaW4ocmVtYWluaW5nLCBzZy0+bGVuZ3RoIC0gKm9mZnNldCk7CisKKwkJLyoKKwkJICogVGhlIHNjYXR0ZXJsaXN0IGl0ZW0gbWF5IGJlIGJpZ2dlciB0aGFuIFBBR0VfU0laRSwKKwkJICogYnV0IHdlIGFyZSBsaW1pdGVkIHRvIG1hcHBpbmcgUEFHRV9TSVpFIGF0IGEgdGltZS4KKwkJICovCisJCW9mZiA9ICpvZmZzZXQgKyBzZy0+b2Zmc2V0OworCQlzZ19ieXRlcyA9IG1pbihzZ19ieXRlcywKKwkJCSAgICAgICAoc2l6ZV90KShQQUdFX1NJWkUgLSAob2ZmICYgflBBR0VfTUFTSykpKTsKKwkJcGFnZV9hZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShzZykgKyAob2ZmID4+IFBBR0VfU0hJRlQpLAorCQkJCQlrbV90eXBlKTsKKwkJaWYgKGNyYykKKwkJCSpjcmMgPSBjcmMzMigqY3JjLCBidWYsIHNnX2J5dGVzKTsKKwkJbWVtY3B5KChjaGFyICopcGFnZV9hZGRyICsgKG9mZiAmIH5QQUdFX01BU0spLCBidWYsIHNnX2J5dGVzKTsKKwkJa3VubWFwX2F0b21pYyhwYWdlX2FkZHIsIGttX3R5cGUpOworCQlidWYgKz0gc2dfYnl0ZXM7CisJCSpvZmZzZXQgKz0gc2dfYnl0ZXM7CisJCXJlbWFpbmluZyAtPSBzZ19ieXRlczsKKwkJY29weV9sZW4gKz0gc2dfYnl0ZXM7CisJfQorCXJldHVybiBjb3B5X2xlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5oIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZmQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGF0IHd3dy5PcGVuLUZDb0Uub3JnCisgKi8KKworI2lmbmRlZiBfRkNfTElCRkNfSF8KKyNkZWZpbmUgX0ZDX0xJQkZDX0hfCisKKyNkZWZpbmUgRkNfTElCRkNfTE9HR0lORyAweDAxIC8qIEdlbmVyYWwgbG9nZ2luZywgbm90IGNhdGVnb3JpemVkICovCisjZGVmaW5lIEZDX0xQT1JUX0xPR0dJTkcgMHgwMiAvKiBscG9ydCBsYXllciBsb2dnaW5nICovCisjZGVmaW5lIEZDX0RJU0NfTE9HR0lORwkgMHgwNCAvKiBkaXNjb3ZlcnkgbGF5ZXIgbG9nZ2luZyAqLworI2RlZmluZSBGQ19SUE9SVF9MT0dHSU5HIDB4MDggLyogcnBvcnQgbGF5ZXIgbG9nZ2luZyAqLworI2RlZmluZSBGQ19GQ1BfTE9HR0lORwkgMHgxMCAvKiBJL08gcGF0aCBsb2dnaW5nICovCisjZGVmaW5lIEZDX0VNX0xPR0dJTkcJIDB4MjAgLyogRXhjaGFuZ2UgTWFuYWdlciBsb2dnaW5nICovCisjZGVmaW5lIEZDX0VYQ0hfTE9HR0lORwkgMHg0MCAvKiBFeGNoYW5nZS9TZXF1ZW5jZSBsb2dnaW5nICovCisjZGVmaW5lIEZDX1NDU0lfTE9HR0lORwkgMHg4MCAvKiBTQ1NJIGxvZ2dpbmcgKG1vc3RseSBlcnJvciBoYW5kbGluZykgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBmY19kZWJ1Z19sb2dnaW5nOworCisjZGVmaW5lIEZDX0NIRUNLX0xPR0dJTkcoTEVWRUwsIENNRCkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKHVubGlrZWx5KGZjX2RlYnVnX2xvZ2dpbmcgJiBMRVZFTCkpCVwKKwkJCWRvIHsJCQkJXAorCQkJCUNNRDsJCQlcCisJCQl9IHdoaWxlICgwKTsJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBGQ19MSUJGQ19EQkcoZm10LCBhcmdzLi4uKQkJCQkJXAorCUZDX0NIRUNLX0xPR0dJTkcoRkNfTElCRkNfTE9HR0lORywJCQkJXAorCQkJIHByaW50ayhLRVJOX0lORk8gImxpYmZjOiAiIGZtdCwgIyNhcmdzKSkKKworI2RlZmluZSBGQ19MUE9SVF9EQkcobHBvcnQsIGZtdCwgYXJncy4uLikJCQkJXAorCUZDX0NIRUNLX0xPR0dJTkcoRkNfTFBPUlRfTE9HR0lORywJCQkJXAorCQkJIHByaW50ayhLRVJOX0lORk8gImhvc3QldTogbHBvcnQgJTZ4OiAiIGZtdCwJXAorCQkJCShscG9ydCktPmhvc3QtPmhvc3Rfbm8sCQkJXAorCQkJCWZjX2hvc3RfcG9ydF9pZCgobHBvcnQpLT5ob3N0KSwgIyNhcmdzKSkKKworI2RlZmluZSBGQ19ESVNDX0RCRyhkaXNjLCBmbXQsIGFyZ3MuLi4pCQkJCVwKKwlGQ19DSEVDS19MT0dHSU5HKEZDX0RJU0NfTE9HR0lORywJCQlcCisJCQkgcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCV1OiBkaXNjOiAiIGZtdCwJXAorCQkJCShkaXNjKS0+bHBvcnQtPmhvc3QtPmhvc3Rfbm8sCVwKKwkJCQkjI2FyZ3MpKQorCisjZGVmaW5lIEZDX1JQT1JUX0lEX0RCRyhscG9ydCwgcG9ydF9pZCwgZm10LCBhcmdzLi4uKQkJCVwKKwlGQ19DSEVDS19MT0dHSU5HKEZDX1JQT1JUX0xPR0dJTkcsCQkJCVwKKwkJCSBwcmludGsoS0VSTl9JTkZPICJob3N0JXU6IHJwb3J0ICU2eDogIiBmbXQsCVwKKwkJCQkobHBvcnQpLT5ob3N0LT5ob3N0X25vLAkJCVwKKwkJCQkocG9ydF9pZCksICMjYXJncykpCisKKyNkZWZpbmUgRkNfUlBPUlRfREJHKHJkYXRhLCBmbXQsIGFyZ3MuLi4pCQkJCVwKKwlGQ19SUE9SVF9JRF9EQkcoKHJkYXRhKS0+bG9jYWxfcG9ydCwgKHJkYXRhKS0+aWRzLnBvcnRfaWQsIGZtdCwgIyNhcmdzKQorCisjZGVmaW5lIEZDX0ZDUF9EQkcocGt0LCBmbXQsIGFyZ3MuLi4pCQkJCQlcCisJRkNfQ0hFQ0tfTE9HR0lORyhGQ19GQ1BfTE9HR0lORywJCQkJXAorCQkJIHByaW50ayhLRVJOX0lORk8gImhvc3QldTogZmNwOiAlNng6ICIgZm10LAlcCisJCQkJKHBrdCktPmxwLT5ob3N0LT5ob3N0X25vLAkJXAorCQkJCXBrdC0+cnBvcnQtPnBvcnRfaWQsICMjYXJncykpCisKKyNkZWZpbmUgRkNfRVhDSF9EQkcoZXhjaCwgZm10LCBhcmdzLi4uKQkJCQkJXAorCUZDX0NIRUNLX0xPR0dJTkcoRkNfRVhDSF9MT0dHSU5HLAkJCQlcCisJCQkgcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCV1OiB4aWQgJTR4OiAiIGZtdCwJXAorCQkJCShleGNoKS0+bHAtPmhvc3QtPmhvc3Rfbm8sCQlcCisJCQkJZXhjaC0+eGlkLCAjI2FyZ3MpKQorCisjZGVmaW5lIEZDX1NDU0lfREJHKGxwb3J0LCBmbXQsIGFyZ3MuLi4pCQkJCVwKKwlGQ19DSEVDS19MT0dHSU5HKEZDX1NDU0lfTE9HR0lORywJCQkJXAorCQkJIHByaW50ayhLRVJOX0lORk8gImhvc3QldTogc2NzaTogIiBmbXQsCQlcCisJCQkJKGxwb3J0KS0+aG9zdC0+aG9zdF9ubywJIyNhcmdzKSkKKworLyoKKyAqIFNldCB1cCBkaXJlY3QtZGF0YSBwbGFjZW1lbnQgZm9yIHRoaXMgSS9PIHJlcXVlc3QKKyAqLwordm9pZCBmY19mY3BfZGRwX3NldHVwKHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsIHUxNiB4aWQpOworCisvKgorICogTW9kdWxlIHNldHVwIGZ1bmN0aW9ucworICovCitpbnQgZmNfc2V0dXBfZXhjaF9tZ3Iodm9pZCk7Cit2b2lkIGZjX2Rlc3Ryb3lfZXhjaF9tZ3Iodm9pZCk7CitpbnQgZmNfc2V0dXBfcnBvcnQodm9pZCk7Cit2b2lkIGZjX2Rlc3Ryb3lfcnBvcnQodm9pZCk7CitpbnQgZmNfc2V0dXBfZmNwKHZvaWQpOwordm9pZCBmY19kZXN0cm95X2ZjcCh2b2lkKTsKKworLyoKKyAqIEludGVybmFsIGxpYmZjIGZ1bmN0aW9ucworICovCitjb25zdCBjaGFyICpmY19lbHNfcmVzcF90eXBlKHN0cnVjdCBmY19mcmFtZSAqKTsKKworLyoKKyAqIENvcGllcyBhIGJ1ZmZlciBpbnRvIGFuIHNnIGxpc3QKKyAqLwordTMyIGZjX2NvcHlfYnVmZmVyX3RvX3NnbGlzdCh2b2lkICpidWYsIHNpemVfdCBsZW4sCisJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgIHUzMiAqbmVudHMsIHNpemVfdCAqb2Zmc2V0LAorCQkJICAgICBlbnVtIGttX3R5cGUga21fdHlwZSwgdTMyICpjcmMpOworCisjZW5kaWYgLyogX0ZDX0xJQkZDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19scG9ydC5jCmluZGV4IGJkMmY3NzEuLjc0MzM4YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19scG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19scG9ydC5jCkBAIC01Niw3ICs1Niw3IEBACiAgKiBhdCB0aGUgc2FtZSB0aW1lLgogICoKICAqIFdoZW4gZGlzY292ZXJ5IHN1Y2NlZWRzIG9yIGZhaWxzIGEgY2FsbGJhY2sgaXMgbWFkZSB0byB0aGUgbHBvcnQgYXMKLSAqIG5vdGlmaWNhdGlvbi4gQ3VycmVudGx5LCBzdWNjZXNmdWwgZGlzY292ZXJ5IGNhdXNlcyB0aGUgbHBvcnQgdG8gdGFrZSBubworICogbm90aWZpY2F0aW9uLiBDdXJyZW50bHksIHN1Y2Nlc3NmdWwgZGlzY292ZXJ5IGNhdXNlcyB0aGUgbHBvcnQgdG8gdGFrZSBubwogICogYWN0aW9uLiBBIGZhaWx1cmUgd2lsbCBjYXVzZSB0aGUgbHBvcnQgdG8gcmVzZXQuIFRoZXJlIGlzIGxpa2VseSBhIGNpcmN1bGFyCiAgKiBsb2NraW5nIHByb2JsZW0gd2l0aCB0aGlzIGltcGxlbWVudGF0aW9uLgogICovCkBAIC05NCw2ICs5NCw5IEBACiAKICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAjaW5jbHVkZSA8c2NzaS9mY19lbmNvZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCisjaW5jbHVkZSAiZmNfbGliZmMuaCIKIAogLyogRmFicmljIElEcyB0byB1c2UgZm9yIHBvaW50LXRvLXBvaW50IG1vZGUsIGNob3NlbiBvbiB3aGltcy4gKi8KICNkZWZpbmUgRkNfTE9DQUxfUFRQX0ZJRF9MTyAgIDB4MDEwMTAxCkBAIC0xMDYsOCArMTA5LDcgQEAKIHN0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX3Jlc2V0KHN0cnVjdCBmY19scG9ydCAqKTsKIHN0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX2Zsb2dpKHN0cnVjdCBmY19scG9ydCAqKTsKIHN0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX2RucyhzdHJ1Y3QgZmNfbHBvcnQgKik7Ci1zdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9ycG5faWQoc3RydWN0IGZjX2xwb3J0ICopOwotc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfcmZ0X2lkKHN0cnVjdCBmY19scG9ydCAqKTsKK3N0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX25zKHN0cnVjdCBmY19scG9ydCAqLCBlbnVtIGZjX2xwb3J0X3N0YXRlKTsKIHN0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX3NjcihzdHJ1Y3QgZmNfbHBvcnQgKik7CiBzdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9yZWFkeShzdHJ1Y3QgZmNfbHBvcnQgKik7CiBzdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9sb2dvKHN0cnVjdCBmY19scG9ydCAqKTsKQEAgLTExNiwxNCArMTE4LDQwIEBACiAJW0xQT1JUX1NUX0RJU0FCTEVEXSA9ICJkaXNhYmxlZCIsCiAJW0xQT1JUX1NUX0ZMT0dJXSA9ICAgICJGTE9HSSIsCiAJW0xQT1JUX1NUX0ROU10gPSAgICAgICJkTlMiLAotCVtMUE9SVF9TVF9SUE5fSURdID0gICAiUlBOX0lEIiwKKwlbTFBPUlRfU1RfUk5OX0lEXSA9ICAgIlJOTl9JRCIsCisJW0xQT1JUX1NUX1JTTk5fTk5dID0gICJSU05OX05OIiwKKwlbTFBPUlRfU1RfUlNQTl9JRF0gPSAgIlJTUE5fSUQiLAogCVtMUE9SVF9TVF9SRlRfSURdID0gICAiUkZUX0lEIiwKKwlbTFBPUlRfU1RfUkZGX0lEXSA9ICAgIlJGRl9JRCIsCiAJW0xQT1JUX1NUX1NDUl0gPSAgICAgICJTQ1IiLAogCVtMUE9SVF9TVF9SRUFEWV0gPSAgICAiUmVhZHkiLAogCVtMUE9SVF9TVF9MT0dPXSA9ICAgICAiTE9HTyIsCiAJW0xQT1JUX1NUX1JFU0VUXSA9ICAgICJyZXNldCIsCiB9OwogCisvKioKKyAqIHN0cnVjdCBmY19ic2dfaW5mbyAtIEZDIFBhc3N0aHJvdWdoIG1hbmFnZW1ldCBzdHJ1Y3R1cmUKKyAqIEBqb2I6ICAgICAgVGhlIHBhc3N0aHJvdWdoIGpvYgorICogQGxwb3J0OiAgICBUaGUgbG9jYWwgcG9ydCB0byBwYXNzIHRocm91Z2ggYSBjb21tYW5kCisgKiBAcnNwX2NvZGU6IFRoZSBleHBlY3RlZCByZXNwb25zZSBjb2RlCisgKiBAc2c6CSAgICAgIGpvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0CisgKiBAbmVudHM6ICAgIGpvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQKKyAqIEBvZmZzZXQ6ICAgVGhlIG9mZnNldCBpbnRvIHRoZSByZXNwb25zZSBkYXRhCisgKi8KK3N0cnVjdCBmY19ic2dfaW5mbyB7CisJc3RydWN0IGZjX2JzZ19qb2IgKmpvYjsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworCXUxNiByc3BfY29kZTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXUzMiBuZW50czsKKwlzaXplX3Qgb2Zmc2V0OworfTsKKworLyoqCisgKiBmY19mcmFtZV9kcm9wKCkgLSBEdW1teSBmcmFtZSBoYW5kbGVyCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBmcDoJICAgVGhlIHJlY2VpdmVkIGZyYW1lCisgKi8KIHN0YXRpYyBpbnQgZmNfZnJhbWVfZHJvcChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCWZjX2ZyYW1lX2ZyZWUoZnApOwpAQCAtMTUwLDggKzE3OCw4IEBACiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgUlBPUlRfRVZfUkVBRFk6CiAJCWlmIChscG9ydC0+c3RhdGUgPT0gTFBPUlRfU1RfRE5TKSB7Ci0JCQlscG9ydC0+ZG5zX3JwID0gcmRhdGE7Ci0JCQlmY19scG9ydF9lbnRlcl9ycG5faWQobHBvcnQpOworCQkJbHBvcnQtPmRuc19yZGF0YSA9IHJkYXRhOworCQkJZmNfbHBvcnRfZW50ZXJfbnMobHBvcnQsIExQT1JUX1NUX1JOTl9JRCk7CiAJCX0gZWxzZSB7CiAJCQlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBhbiBSRUFEWSBldmVudCAiCiAJCQkJICAgICAib24gcG9ydCAoJTZ4KSBmb3IgdGhlIGRpcmVjdG9yeSAiCkBAIC0xNjUsNyArMTkzLDcgQEAKIAljYXNlIFJQT1JUX0VWX0xPR086CiAJY2FzZSBSUE9SVF9FVl9GQUlMRUQ6CiAJY2FzZSBSUE9SVF9FVl9TVE9QOgotCQlscG9ydC0+ZG5zX3JwID0gTlVMTDsKKwkJbHBvcnQtPmRuc19yZGF0YSA9IE5VTEw7CiAJCWJyZWFrOwogCWNhc2UgUlBPUlRfRVZfTk9ORToKIAkJYnJlYWs7CkBAIC0xODksOCArMjE3LDggQEAKIAogLyoqCiAgKiBmY19scG9ydF9wdHBfc2V0dXAoKSAtIENyZWF0ZSBhbiBycG9ydCBmb3IgcG9pbnQtdG8tcG9pbnQgbW9kZQotICogQGxwb3J0OiBUaGUgbHBvcnQgdG8gYXR0YWNoIHRoZSBwdHAgcnBvcnQgdG8KLSAqIEBmaWQ6IFRoZSBGSUQgb2YgdGhlIHB0cCBycG9ydAorICogQGxwb3J0OgkgVGhlIGxwb3J0IHRvIGF0dGFjaCB0aGUgcHRwIHJwb3J0IHRvCisgKiBAcmVtb3RlX2ZpZDoJIFRoZSBGSUQgb2YgdGhlIHB0cCBycG9ydAogICogQHJlbW90ZV93d3BuOiBUaGUgV1dQTiBvZiB0aGUgcHRwIHJwb3J0CiAgKiBAcmVtb3RlX3d3bm46IFRoZSBXV05OIG9mIHRoZSBwdHAgcnBvcnQKICAqLwpAQCAtMTk5LDE4ICsyMjcsMjIgQEAKIAkJCSAgICAgICB1NjQgcmVtb3RlX3d3bm4pCiB7CiAJbXV0ZXhfbG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7Ci0JaWYgKGxwb3J0LT5wdHBfcnApCi0JCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYobHBvcnQtPnB0cF9ycCk7Ci0JbHBvcnQtPnB0cF9ycCA9IGxwb3J0LT50dC5ycG9ydF9jcmVhdGUobHBvcnQsIHJlbW90ZV9maWQpOwotCWxwb3J0LT5wdHBfcnAtPmlkcy5wb3J0X25hbWUgPSByZW1vdGVfd3dwbjsKLQlscG9ydC0+cHRwX3JwLT5pZHMubm9kZV9uYW1lID0gcmVtb3RlX3d3bm47CisJaWYgKGxwb3J0LT5wdHBfcmRhdGEpCisJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYobHBvcnQtPnB0cF9yZGF0YSk7CisJbHBvcnQtPnB0cF9yZGF0YSA9IGxwb3J0LT50dC5ycG9ydF9jcmVhdGUobHBvcnQsIHJlbW90ZV9maWQpOworCWxwb3J0LT5wdHBfcmRhdGEtPmlkcy5wb3J0X25hbWUgPSByZW1vdGVfd3dwbjsKKwlscG9ydC0+cHRwX3JkYXRhLT5pZHMubm9kZV9uYW1lID0gcmVtb3RlX3d3bm47CiAJbXV0ZXhfdW5sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKIAotCWxwb3J0LT50dC5ycG9ydF9sb2dpbihscG9ydC0+cHRwX3JwKTsKKwlscG9ydC0+dHQucnBvcnRfbG9naW4obHBvcnQtPnB0cF9yZGF0YSk7CiAKIAlmY19scG9ydF9lbnRlcl9yZWFkeShscG9ydCk7CiB9CiAKKy8qKgorICogZmNfZ2V0X2hvc3RfcG9ydF90eXBlKCkgLSBSZXR1cm4gdGhlIHBvcnQgdHlwZSBvZiB0aGUgZ2l2ZW4gU2NzaV9Ib3N0CisgKiBAc2hvc3Q6IFRoZSBTQ1NJIGhvc3Qgd2hvc2UgcG9ydCB0eXBlIGlzIHRvIGJlIGRldGVybWluZWQKKyAqLwogdm9pZCBmY19nZXRfaG9zdF9wb3J0X3R5cGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CiAJLyogVE9ETyAtIGN1cnJlbnRseSBqdXN0IE5QT1JUICovCkBAIC0yMTgsMTcgKzI1MCwzMyBAQAogfQogRVhQT1JUX1NZTUJPTChmY19nZXRfaG9zdF9wb3J0X3R5cGUpOwogCisvKioKKyAqIGZjX2dldF9ob3N0X3BvcnRfc3RhdGUoKSAtIFJldHVybiB0aGUgcG9ydCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gU2NzaV9Ib3N0CisgKiBAc2hvc3Q6ICBUaGUgU0NTSSBob3N0IHdob3NlIHBvcnQgc3RhdGUgaXMgdG8gYmUgZGV0ZXJtaW5lZAorICovCiB2b2lkIGZjX2dldF9ob3N0X3BvcnRfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscCA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKIAotCWlmIChscC0+bGlua191cCkKLQkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9PTkxJTkU7CisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlpZiAoIWxwb3J0LT5saW5rX3VwKQorCQlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX0xJTktET1dOOwogCWVsc2UKLQkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9PRkZMSU5FOworCQlzd2l0Y2ggKGxwb3J0LT5zdGF0ZSkgeworCQljYXNlIExQT1JUX1NUX1JFQURZOgorCQkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9PTkxJTkU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZjX2hvc3RfcG9ydF9zdGF0ZShzaG9zdCkgPSBGQ19QT1JUU1RBVEVfT0ZGTElORTsKKwkJfQorCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woZmNfZ2V0X2hvc3RfcG9ydF9zdGF0ZSk7CiAKKy8qKgorICogZmNfZ2V0X2hvc3Rfc3BlZWQoKSAtIFJldHVybiB0aGUgc3BlZWQgb2YgdGhlIGdpdmVuIFNjc2lfSG9zdAorICogQHNob3N0OiBUaGUgU0NTSSBob3N0IHdob3NlIHBvcnQgc3BlZWQgaXMgdG8gYmUgZGV0ZXJtaW5lZAorICovCiB2b2lkIGZjX2dldF9ob3N0X3NwZWVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKQEAgLTIzNywyNCArMjg1LDI4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZjX2dldF9ob3N0X3NwZWVkKTsKIAorLyoqCisgKiBmY19nZXRfaG9zdF9zdGF0cygpIC0gUmV0dXJuIHRoZSBTY3NpX0hvc3QncyBzdGF0aXN0aWNzCisgKiBAc2hvc3Q6IFRoZSBTQ1NJIGhvc3Qgd2hvc2Ugc3RhdGlzdGljcyBhcmUgdG8gYmUgcmV0dXJuZWQKKyAqLwogc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqZmNfZ2V0X2hvc3Rfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CiAJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqZmNvZV9zdGF0czsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOwogCXN0cnVjdCB0aW1lc3BlYyB2MCwgdjE7CiAJdW5zaWduZWQgaW50IGNwdTsKIAotCWZjb2Vfc3RhdHMgPSAmbHAtPmhvc3Rfc3RhdHM7CisJZmNvZV9zdGF0cyA9ICZscG9ydC0+aG9zdF9zdGF0czsKIAltZW1zZXQoZmNvZV9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MpKTsKIAogCWppZmZpZXNfdG9fdGltZXNwZWMoamlmZmllcywgJnYwKTsKLQlqaWZmaWVzX3RvX3RpbWVzcGVjKGxwLT5ib290X3RpbWUsICZ2MSk7CisJamlmZmllc190b190aW1lc3BlYyhscG9ydC0+Ym9vdF90aW1lLCAmdjEpOwogCWZjb2Vfc3RhdHMtPnNlY29uZHNfc2luY2VfbGFzdF9yZXNldCA9ICh2MC50dl9zZWMgLSB2MS50dl9zZWMpOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlzdHJ1Y3QgZmNvZV9kZXZfc3RhdHMgKnN0YXRzOwogCi0JCXN0YXRzID0gcGVyX2NwdV9wdHIobHAtPmRldl9zdGF0cywgY3B1KTsKKwkJc3RhdHMgPSBwZXJfY3B1X3B0cihscG9ydC0+ZGV2X3N0YXRzLCBjcHUpOwogCiAJCWZjb2Vfc3RhdHMtPnR4X2ZyYW1lcyArPSBzdGF0cy0+VHhGcmFtZXM7CiAJCWZjb2Vfc3RhdHMtPnR4X3dvcmRzICs9IHN0YXRzLT5UeFdvcmRzOwpAQCAtMjc5LDEyICszMzEsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woZmNfZ2V0X2hvc3Rfc3RhdHMpOwogCi0vKgotICogRmlsbCBpbiBGTE9HSSBjb21tYW5kIGZvciByZXF1ZXN0LgorLyoqCisgKiBmY19scG9ydF9mbG9naV9maWxsKCkgLSBGaWxsIGluIEZMT0dJIGNvbW1hbmQgZm9yIHJlcXVlc3QKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhlIEZMT0dJIGlzIGZvcgorICogQGZsb2dpOiBUaGUgRkxPR0kgY29tbWFuZAorICogQG9wOgkgICBUaGUgb3Bjb2RlCiAgKi8KLXN0YXRpYyB2b2lkCi1mY19scG9ydF9mbG9naV9maWxsKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19lbHNfZmxvZ2kgKmZsb2dpLAotCQkgICAgdW5zaWduZWQgaW50IG9wKQorc3RhdGljIHZvaWQgZmNfbHBvcnRfZmxvZ2lfZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCXN0cnVjdCBmY19lbHNfZmxvZ2kgKmZsb2dpLAorCQkJCXVuc2lnbmVkIGludCBvcCkKIHsKIAlzdHJ1Y3QgZmNfZWxzX2NzcCAqc3A7CiAJc3RydWN0IGZjX2Vsc19jc3NwICpjcDsKQEAgLTMxMiw4ICszNjcsMTAgQEAKIAl9CiB9CiAKLS8qCi0gKiBBZGQgYSBzdXBwb3J0ZWQgRkMtNCB0eXBlLgorLyoqCisgKiBmY19scG9ydF9hZGRfZmM0X3R5cGUoKSAtIEFkZCBhIHN1cHBvcnRlZCBGQy00IHR5cGUgdG8gYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIGFkZCBhIG5ldyBGQy00IHR5cGUgdG8KKyAqIEB0eXBlOiAgVGhlIG5ldyBGQy00IHR5cGUKICAqLwogc3RhdGljIHZvaWQgZmNfbHBvcnRfYWRkX2ZjNF90eXBlKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIGVudW0gZmNfZmhfdHlwZSB0eXBlKQogewpAQCAtMzI1LDExICszODIsMTEgQEAKIAogLyoqCiAgKiBmY19scG9ydF9yZWN2X3JsaXJfcmVxKCkgLSBIYW5kbGUgcmVjZWl2ZWQgUmVnaXN0ZXJlZCBMaW5rIEluY2lkZW50IFJlcG9ydC4KKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIGluIHRoZSBSTElSIGV4Y2hhbmdlCisgKiBAZnA6CSAgIFRoZSBSTElSIHJlcXVlc3QgZnJhbWUKICAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHJlY2lldmluZyB0aGUgUkxJUgotICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBSTElSIGV4Y2hhbmdlCi0gKiBAZnA6IFJMSVIgcmVxdWVzdCBmcmFtZQogICoKLSAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKICAqIHRoaXMgZnVuY3Rpb24uCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2xwb3J0X3JlY3Zfcmxpcl9yZXEoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCkBAIC0zNDQsMTEgKzQwMSwxMSBAQAogCiAvKioKICAqIGZjX2xwb3J0X3JlY3ZfZWNob19yZXEoKSAtIEhhbmRsZSByZWNlaXZlZCBFQ0hPIHJlcXVlc3QKLSAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHJlY2lldmluZyB0aGUgRUNITwotICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBFQ0hPIGV4Y2hhbmdlCi0gKiBAZnA6IEVDSE8gcmVxdWVzdCBmcmFtZQorICogQHNwOgkgICBUaGUgc2VxdWVuY2UgaW4gdGhlIEVDSE8gZXhjaGFuZ2UKKyAqIEBmcDoJICAgRUNITyByZXF1ZXN0IGZyYW1lCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHJlY2lldmluZyB0aGUgRUNITwogICoKLSAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKICAqIHRoaXMgZnVuY3Rpb24uCiAgKi8KIHN0YXRpYyB2b2lkIGZjX2xwb3J0X3JlY3ZfZWNob19yZXEoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqaW5fZnAsCkBAIC0zNjEsNyArNDE4LDcgQEAKIAl2b2lkICpkcDsKIAl1MzIgZl9jdGw7CiAKLQlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBSTElSIHJlcXVlc3Qgd2hpbGUgaW4gc3RhdGUgJXNcbiIsCisJRkNfTFBPUlRfREJHKGxwb3J0LCAiUmVjZWl2ZWQgRUNITyByZXF1ZXN0IHdoaWxlIGluIHN0YXRlICVzXG4iLAogCQkgICAgIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CiAKIAlsZW4gPSBmcl9sZW4oaW5fZnApIC0gc2l6ZW9mKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIpOwpAQCAtMzc0LDcgKzQzMSw3IEBACiAJaWYgKGZwKSB7CiAJCWRwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIGxlbik7CiAJCW1lbWNweShkcCwgcHAsIGxlbik7Ci0JCSooKHUzMiAqKWRwKSA9IGh0b25sKEVMU19MU19BQ0MgPDwgMjQpOworCQkqKChfX2JlMzIgKilkcCkgPSBodG9ubChFTFNfTFNfQUNDIDw8IDI0KTsKIAkJc3AgPSBscG9ydC0+dHQuc2VxX3N0YXJ0X25leHQoc3ApOwogCQlmX2N0bCA9IEZDX0ZDX0VYX0NUWCB8IEZDX0ZDX0xBU1RfU0VRIHwgRkNfRkNfRU5EX1NFUTsKIAkJZmNfZmlsbF9mY19oZHIoZnAsIEZDX1JDVExfRUxTX1JFUCwgZXAtPmRpZCwgZXAtPnNpZCwKQEAgLTM4NSwxMiArNDQyLDEyIEBACiB9CiAKIC8qKgotICogZmNfbHBvcnRfcmVjdl9lY2hvX3JlcSgpIC0gSGFuZGxlIHJlY2VpdmVkIFJlcXVlc3QgTm9kZSBJRCBkYXRhIHJlcXVlc3QKLSAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHJlY2lldmluZyB0aGUgUk5JRAotICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBSTklEIGV4Y2hhbmdlCi0gKiBAZnA6IFJOSUQgcmVxdWVzdCBmcmFtZQorICogZmNfbHBvcnRfcmVjdl9ybmlkX3JlcSgpIC0gSGFuZGxlIHJlY2VpdmVkIFJlcXVlc3QgTm9kZSBJRCBkYXRhIHJlcXVlc3QKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIGluIHRoZSBSTklEIGV4Y2hhbmdlCisgKiBAZnA6CSAgIFRoZSBSTklEIHJlcXVlc3QgZnJhbWUKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgcmVjaWV2aW5nIHRoZSBSTklECiAgKgotICogTG9ja2luZyBOb3RlOiBUaGUgbHBvcnQgbG9jayBpcyBleGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9ybmlkX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICppbl9mcCwKQEAgLTQ1Myw5ICs1MTAsOSBAQAogCiAvKioKICAqIGZjX2xwb3J0X3JlY3ZfbG9nb19yZXEoKSAtIEhhbmRsZSByZWNlaXZlZCBmYWJyaWMgTE9HTyByZXF1ZXN0Ci0gKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCByZWNpZXZpbmcgdGhlIExPR08KLSAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgTE9HTyBleGNoYW5nZQotICogQGZwOiBMT0dPIHJlcXVlc3QgZnJhbWUKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIGluIHRoZSBMT0dPIGV4Y2hhbmdlCisgKiBAZnA6CSAgIFRoZSBMT0dPIHJlcXVlc3QgZnJhbWUKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgcmVjaWV2aW5nIHRoZSBMT0dPCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGUgbHBvcnQgbG9jayBpcyBleGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKICAqIHRoaXMgZnVuY3Rpb24uCkBAIC00NzAsNyArNTI3LDcgQEAKIAogLyoqCiAgKiBmY19mYWJyaWNfbG9naW4oKSAtIFN0YXJ0IHRoZSBscG9ydCBzdGF0ZSBtYWNoaW5lCi0gKiBAbHBvcnQ6IFRoZSBscG9ydCB0aGF0IHNob3VsZCBsb2cgaW50byB0aGUgZmFicmljCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgc2hvdWxkIGxvZyBpbnRvIHRoZSBmYWJyaWMKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQKICAqCQkgd2l0aCB0aGUgbHBvcnQgbG9jayBoZWxkLgpAQCAtNDkxLDQ3ICs1NDgsNjkgQEAKIEVYUE9SVF9TWU1CT0woZmNfZmFicmljX2xvZ2luKTsKIAogLyoqCi0gKiBmY19saW5rdXAoKSAtIEhhbmRsZXIgZm9yIHRyYW5zcG9ydCBsaW5rdXAgZXZlbnRzCisgKiBfX2ZjX2xpbmt1cCgpIC0gSGFuZGxlciBmb3IgdHJhbnNwb3J0IGxpbmt1cCBldmVudHMKICAqIEBscG9ydDogVGhlIGxwb3J0IHdob3NlIGxpbmsgaXMgdXAKKyAqCisgKiBMb2NraW5nOiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBscF9tdXRleCBoZWxkCiAgKi8KLXZvaWQgZmNfbGlua3VwKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit2b2lkIF9fZmNfbGlua3VwKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibGliZmM6IExpbmsgdXAgb24gcG9ydCAoJTZ4KVxuIiwKLQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7Ci0KLQltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwogCWlmICghbHBvcnQtPmxpbmtfdXApIHsKIAkJbHBvcnQtPmxpbmtfdXAgPSAxOwogCiAJCWlmIChscG9ydC0+c3RhdGUgPT0gTFBPUlRfU1RfUkVTRVQpCiAJCQlmY19scG9ydF9lbnRlcl9mbG9naShscG9ydCk7CiAJfQorfQorCisvKioKKyAqIGZjX2xpbmt1cCgpIC0gSGFuZGxlciBmb3IgdHJhbnNwb3J0IGxpbmt1cCBldmVudHMKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hvc2UgbGluayBpcyB1cAorICovCit2b2lkIGZjX2xpbmt1cChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXByaW50ayhLRVJOX0lORk8gImhvc3QlZDogbGliZmM6IExpbmsgdXAgb24gcG9ydCAoJTZ4KVxuIiwKKwkgICAgICAgbHBvcnQtPmhvc3QtPmhvc3Rfbm8sIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOworCisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlfX2ZjX2xpbmt1cChscG9ydCk7CiAJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChmY19saW5rdXApOwogCiAvKioKLSAqIGZjX2xpbmtkb3duKCkgLSBIYW5kbGVyIGZvciB0cmFuc3BvcnQgbGlua2Rvd24gZXZlbnRzCisgKiBfX2ZjX2xpbmtkb3duKCkgLSBIYW5kbGVyIGZvciB0cmFuc3BvcnQgbGlua2Rvd24gZXZlbnRzCiAgKiBAbHBvcnQ6IFRoZSBscG9ydCB3aG9zZSBsaW5rIGlzIGRvd24KKyAqCisgKiBMb2NraW5nOiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBscF9tdXRleCBoZWxkCiAgKi8KLXZvaWQgZmNfbGlua2Rvd24oc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3ZvaWQgX19mY19saW5rZG93bihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibGliZmM6IExpbmsgZG93biBvbiBwb3J0ICglNngpXG4iLAotCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKLQogCWlmIChscG9ydC0+bGlua191cCkgewogCQlscG9ydC0+bGlua191cCA9IDA7CiAJCWZjX2xwb3J0X2VudGVyX3Jlc2V0KGxwb3J0KTsKIAkJbHBvcnQtPnR0LmZjcF9jbGVhbnVwKGxwb3J0KTsKIAl9Cit9CisKKy8qKgorICogZmNfbGlua2Rvd24oKSAtIEhhbmRsZXIgZm9yIHRyYW5zcG9ydCBsaW5rZG93biBldmVudHMKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hvc2UgbGluayBpcyBkb3duCisgKi8KK3ZvaWQgZmNfbGlua2Rvd24oc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJob3N0JWQ6IGxpYmZjOiBMaW5rIGRvd24gb24gcG9ydCAoJTZ4KVxuIiwKKwkgICAgICAgbHBvcnQtPmhvc3QtPmhvc3Rfbm8sIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOworCisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlfX2ZjX2xpbmtkb3duKGxwb3J0KTsKIAltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKGZjX2xpbmtkb3duKTsKIAogLyoqCiAgKiBmY19mYWJyaWNfbG9nb2ZmKCkgLSBMb2dvdXQgb2YgdGhlIGZhYnJpYwotICogQGxwb3J0OgkgICAgICBmY19scG9ydCBwb2ludGVyIHRvIGxvZ29mZiB0aGUgZmFicmljCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIGxvZ29mZiB0aGUgZmFicmljCiAgKgogICogUmV0dXJuIHZhbHVlOgogICoJMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUKQEAgLTU0MCw4ICs2MTksOCBAQAogewogCWxwb3J0LT50dC5kaXNjX3N0b3BfZmluYWwobHBvcnQpOwogCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7Ci0JaWYgKGxwb3J0LT5kbnNfcnApCi0JCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYobHBvcnQtPmRuc19ycCk7CisJaWYgKGxwb3J0LT5kbnNfcmRhdGEpCisJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYobHBvcnQtPmRuc19yZGF0YSk7CiAJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwogCWxwb3J0LT50dC5ycG9ydF9mbHVzaF9xdWV1ZSgpOwogCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CkBAIC01NTMsMTEgKzYzMiw5IEBACiBFWFBPUlRfU1lNQk9MKGZjX2ZhYnJpY19sb2dvZmYpOwogCiAvKioKLSAqIGZjX2xwb3J0X2Rlc3Ryb3koKSAtIHVucmVnaXN0ZXIgYSBmY19scG9ydAotICogQGxwb3J0OgkgICAgICBmY19scG9ydCBwb2ludGVyIHRvIHVucmVnaXN0ZXIKKyAqIGZjX2xwb3J0X2Rlc3Ryb3koKSAtIFVucmVnaXN0ZXIgYSBmY19scG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byB1bnJlZ2lzdGVyCiAgKgotICogUmV0dXJuIHZhbHVlOgotICoJTm9uZQogICogTm90ZToKICAqIGV4aXQgcm91dGluZSBmb3IgZmNfbHBvcnQgaW5zdGFuY2UKICAqIGNsZWFuLXVwIGFsbCB0aGUgYWxsb2NhdGVkIG1lbW9yeQpAQCAtNTgwLDEzICs2NTcsOSBAQAogRVhQT1JUX1NZTUJPTChmY19scG9ydF9kZXN0cm95KTsKIAogLyoqCi0gKiBmY19zZXRfbWZzKCkgLSBzZXRzIHVwIHRoZSBtZnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZjX2xwb3J0Ci0gKiBAbHBvcnQ6IGZjX2xwb3J0IHBvaW50ZXIgdG8gdW5yZWdpc3RlcgotICogQG1mczogdGhlIG5ldyBtZnMgZm9yIGZjX2xwb3J0Ci0gKgotICogU2V0IG1mcyBmb3IgdGhlIGdpdmVuIGZjX2xwb3J0IHRvIHRoZSBuZXcgbWZzLgotICoKLSAqIFJldHVybjogMCBmb3Igc3VjY2VzcworICogZmNfc2V0X21mcygpIC0gU2V0IHRoZSBtYXhpbXVtIGZyYW1lIHNpemUgZm9yIGEgbG9jYWwgcG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBzZXQgdGhlIE1GUyBmb3IKKyAqIEBtZnM6ICAgVGhlIG5ldyBNRlMKICAqLwogaW50IGZjX3NldF9tZnMoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgdTMyIG1mcykKIHsKQEAgLTYxNyw3ICs2OTAsNyBAQAogCiAvKioKICAqIGZjX2xwb3J0X2Rpc2NfY2FsbGJhY2soKSAtIENhbGxiYWNrIGZvciBkaXNjb3ZlcnkgZXZlbnRzCi0gKiBAbHBvcnQ6IEZDIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgcmVjZWl2aW5nIHRoZSBldmVudAogICogQGV2ZW50OiBUaGUgZGlzY292ZXJ5IGV2ZW50CiAgKi8KIHZvaWQgZmNfbHBvcnRfZGlzY19jYWxsYmFjayhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBlbnVtIGZjX2Rpc2NfZXZlbnQgZXZlbnQpCkBAIC02MjcsOCArNzAwLDkgQEAKIAkJRkNfTFBPUlRfREJHKGxwb3J0LCAiRGlzY292ZXJ5IHN1Y2NlZWRlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgRElTQ19FVl9GQUlMRUQ6Ci0JCXByaW50ayhLRVJOX0VSUiAibGliZmM6IERpc2NvdmVyeSBmYWlsZWQgZm9yIHBvcnQgKCU2eClcbiIsCi0JCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJob3N0JWQ6IGxpYmZjOiAiCisJCSAgICAgICAiRGlzY292ZXJ5IGZhaWxlZCBmb3IgcG9ydCAoJTZ4KVxuIiwKKwkJICAgICAgIGxwb3J0LT5ob3N0LT5ob3N0X25vLCBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKIAkJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKIAkJZmNfbHBvcnRfZW50ZXJfcmVzZXQobHBvcnQpOwogCQltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CkBAIC02NDEsNyArNzE1LDcgQEAKIAogLyoqCiAgKiBmY19ycG9ydF9lbnRlcl9yZWFkeSgpIC0gRW50ZXIgdGhlIHJlYWR5IHN0YXRlIGFuZCBzdGFydCBkaXNjb3ZlcnkKLSAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHRoYXQgaXMgcmVhZHkKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCBpcyByZWFkeQogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtNjUyLDIyICs3MjYsNDYgQEAKIAkJICAgICBmY19scG9ydF9zdGF0ZShscG9ydCkpOwogCiAJZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX1JFQURZKTsKKwlpZiAobHBvcnQtPnZwb3J0KQorCQlmY192cG9ydF9zZXRfc3RhdGUobHBvcnQtPnZwb3J0LCBGQ19WUE9SVF9BQ1RJVkUpOworCWZjX3Zwb3J0c19saW5rY2hhbmdlKGxwb3J0KTsKIAotCWlmICghbHBvcnQtPnB0cF9ycCkKKwlpZiAoIWxwb3J0LT5wdHBfcmRhdGEpCiAJCWxwb3J0LT50dC5kaXNjX3N0YXJ0KGZjX2xwb3J0X2Rpc2NfY2FsbGJhY2ssIGxwb3J0KTsKIH0KIAogLyoqCisgKiBmY19scG9ydF9zZXRfcG9ydF9pZCgpIC0gc2V0IHRoZSBsb2NhbCBwb3J0IFBvcnQgSUQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hpY2ggd2lsbCBoYXZlIGl0cyBQb3J0IElEIHNldC4KKyAqIEBwb3J0X2lkOiBUaGUgbmV3IHBvcnQgSUQuCisgKiBAZnA6IFRoZSBmcmFtZSBjb250YWluaW5nIHRoZSBpbmNvbWluZyByZXF1ZXN0LCBvciBOVUxMLgorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfc2V0X3BvcnRfaWQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgdTMyIHBvcnRfaWQsCisJCQkJIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJaWYgKHBvcnRfaWQpCisJCXByaW50ayhLRVJOX0lORk8gImhvc3QlZDogQXNzaWduZWQgUG9ydCBJRCAlNnhcbiIsCisJCSAgICAgICBscG9ydC0+aG9zdC0+aG9zdF9ubywgcG9ydF9pZCk7CisKKwlmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpID0gcG9ydF9pZDsKKwlpZiAobHBvcnQtPnR0Lmxwb3J0X3NldF9wb3J0X2lkKQorCQlscG9ydC0+dHQubHBvcnRfc2V0X3BvcnRfaWQobHBvcnQsIHBvcnRfaWQsIGZwKTsKK30KKworLyoqCiAgKiBmY19scG9ydF9yZWN2X2Zsb2dpX3JlcSgpIC0gUmVjZWl2ZSBhIEZMT0dJIHJlcXVlc3QKICAqIEBzcF9pbjogVGhlIHNlcXVlbmNlIHRoZSBGTE9HSSBpcyBvbgotICogQHJ4X2ZwOiBUaGUgZnJhbWUgdGhlIEZMT0dJIGlzIGluCi0gKiBAbHBvcnQ6IFRoZSBscG9ydCB0aGF0IHJlY2lldmVkIHRoZSByZXF1ZXN0CisgKiBAcnhfZnA6IFRoZSBGTE9HSSBmcmFtZQorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHJlY2lldmVkIHRoZSByZXF1ZXN0CiAgKgogICogQSByZWNlaXZlZCBGTE9HSSByZXF1ZXN0IGluZGljYXRlcyBhIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb24uCiAgKiBBY2NlcHQgaXQgd2l0aCB0aGUgY29tbW9uIHNlcnZpY2UgcGFyYW1ldGVycyBpbmRpY2F0aW5nIG91ciBOIHBvcnQuCiAgKiBTZXQgdXAgdG8gZG8gYSBQTE9HSSBpZiB3ZSBoYXZlIHRoZSBoaWdoZXItbnVtYmVyIFdXUE4uCiAgKgotICogTG9ja2luZyBOb3RlOiBUaGUgbHBvcnQgbG9jayBpcyBleGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9mbG9naV9yZXEoc3RydWN0IGZjX3NlcSAqc3BfaW4sCkBAIC02OTUsOCArNzkzLDkgQEAKIAkJZ290byBvdXQ7CiAJcmVtb3RlX3d3cG4gPSBnZXRfdW5hbGlnbmVkX2JlNjQoJmZscC0+Zmxfd3dwbik7CiAJaWYgKHJlbW90ZV93d3BuID09IGxwb3J0LT53d3BuKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImxpYmZjOiBSZWNlaXZlZCBGTE9HSSBmcm9tIHBvcnQgIgotCQkgICAgICAgIndpdGggc2FtZSBXV1BOICVsbHhcbiIsIHJlbW90ZV93d3BuKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaG9zdCVkOiBsaWJmYzogUmVjZWl2ZWQgRkxPR0kgZnJvbSBwb3J0ICIKKwkJICAgICAgICJ3aXRoIHNhbWUgV1dQTiAlbGx4XG4iLAorCQkgICAgICAgbHBvcnQtPmhvc3QtPmhvc3Rfbm8sIHJlbW90ZV93d3BuKTsKIAkJZ290byBvdXQ7CiAJfQogCUZDX0xQT1JUX0RCRyhscG9ydCwgIkZMT0dJIGZyb20gcG9ydCBXV1BOICVsbHhcbiIsIHJlbW90ZV93d3BuKTsKQEAgLTcxNSw3ICs4MTQsNyBAQAogCQlyZW1vdGVfZmlkID0gRkNfTE9DQUxfUFRQX0ZJRF9ISTsKIAl9CiAKLQlmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpID0gbG9jYWxfZmlkOworCWZjX2xwb3J0X3NldF9wb3J0X2lkKGxwb3J0LCBsb2NhbF9maWQsIHJ4X2ZwKTsKIAogCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqZmxwKSk7CiAJaWYgKGZwKSB7CkBAIC03NDcsOSArODQ2LDkgQEAKIAogLyoqCiAgKiBmY19scG9ydF9yZWN2X3JlcSgpIC0gVGhlIGdlbmVyaWMgbHBvcnQgcmVxdWVzdCBoYW5kbGVyCi0gKiBAbHBvcnQ6IFRoZSBscG9ydCB0aGF0IHJlY2VpdmVkIHRoZSByZXF1ZXN0Ci0gKiBAc3A6IFRoZSBzZXF1ZW5jZSB0aGUgcmVxdWVzdCBpcyBvbgotICogQGZwOiBUaGUgZnJhbWUgdGhlIHJlcXVlc3QgaXMgaW4KKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCByZWNlaXZlZCB0aGUgcmVxdWVzdAorICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhlIHJlcXVlc3QgaXMgb24KKyAqIEBmcDoJICAgVGhlIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VlIGlmIHRoZSBscG9ydCBoYW5kbGVzIHRoZSByZXF1ZXN0IG9yCiAgKiBpZiBhbiBycG9ydCBzaG91bGQgaGFuZGxlIHRoZSByZXF1ZXN0LgpAQCAtODE3LDggKzkxNiw4IEBACiB9CiAKIC8qKgotICogZmNfbHBvcnRfcmVzZXQoKSAtIFJlc2V0IGFuIGxwb3J0Ci0gKiBAbHBvcnQ6IFRoZSBscG9ydCB3aGljaCBzaG91bGQgYmUgcmVzZXQKKyAqIGZjX2xwb3J0X3Jlc2V0KCkgLSBSZXNldCBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hpY2ggc2hvdWxkIGJlIHJlc2V0CiAgKgogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIHRoZQogICoJCSBscG9ydCBsb2NrIGhlbGQuCkBAIC04MzQsMjkgKzkzMywzMSBAQAogRVhQT1JUX1NZTUJPTChmY19scG9ydF9yZXNldCk7CiAKIC8qKgotICogZmNfbHBvcnRfcmVzZXRfbG9ja2VkKCkgLSBSZXNldCB0aGUgbG9jYWwgcG9ydAotICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGxvY2FsIHBvcnQgdG8gYmUgcmVzZXQKKyAqIGZjX2xwb3J0X3Jlc2V0X2xvY2tlZCgpIC0gUmVzZXQgdGhlIGxvY2FsIHBvcnQgdy8gdGhlIGxwb3J0IGxvY2sgaGVsZAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBiZSByZXNldAogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgogICovCiBzdGF0aWMgdm9pZCBmY19scG9ydF9yZXNldF9sb2NrZWQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKLQlpZiAobHBvcnQtPmRuc19ycCkKLQkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihscG9ydC0+ZG5zX3JwKTsKKwlpZiAobHBvcnQtPmRuc19yZGF0YSkKKwkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihscG9ydC0+ZG5zX3JkYXRhKTsKIAotCWxwb3J0LT5wdHBfcnAgPSBOVUxMOworCWxwb3J0LT5wdHBfcmRhdGEgPSBOVUxMOwogCiAJbHBvcnQtPnR0LmRpc2Nfc3RvcChscG9ydCk7CiAKIAlscG9ydC0+dHQuZXhjaF9tZ3JfcmVzZXQobHBvcnQsIDAsIDApOwogCWZjX2hvc3RfZmFicmljX25hbWUobHBvcnQtPmhvc3QpID0gMDsKLQlmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpID0gMDsKKworCWlmIChmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKQorCQlmY19scG9ydF9zZXRfcG9ydF9pZChscG9ydCwgMCwgTlVMTCk7CiB9CiAKIC8qKgogICogZmNfbHBvcnRfZW50ZXJfcmVzZXQoKSAtIFJlc2V0IHRoZSBsb2NhbCBwb3J0Ci0gKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCB0byBiZSByZXNldAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBiZSByZXNldAogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtODY2LDE1ICs5NjcsMjIgQEAKIAlGQ19MUE9SVF9EQkcobHBvcnQsICJFbnRlcmVkIFJFU0VUIHN0YXRlIGZyb20gJXMgc3RhdGVcbiIsCiAJCSAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKIAorCWlmIChscG9ydC0+dnBvcnQpIHsKKwkJaWYgKGxwb3J0LT5saW5rX3VwKQorCQkJZmNfdnBvcnRfc2V0X3N0YXRlKGxwb3J0LT52cG9ydCwgRkNfVlBPUlRfSU5JVElBTElaSU5HKTsKKwkJZWxzZQorCQkJZmNfdnBvcnRfc2V0X3N0YXRlKGxwb3J0LT52cG9ydCwgRkNfVlBPUlRfTElOS0RPV04pOworCX0KIAlmY19scG9ydF9zdGF0ZV9lbnRlcihscG9ydCwgTFBPUlRfU1RfUkVTRVQpOworCWZjX3Zwb3J0c19saW5rY2hhbmdlKGxwb3J0KTsKIAlmY19scG9ydF9yZXNldF9sb2NrZWQobHBvcnQpOwogCWlmIChscG9ydC0+bGlua191cCkKIAkJZmNfbHBvcnRfZW50ZXJfZmxvZ2kobHBvcnQpOwogfQogCiAvKioKLSAqIGZjX2xwb3J0X2VudGVyX2Rpc2FibGVkKCkgLSBkaXNhYmxlIHRoZSBsb2NhbCBwb3J0Ci0gKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCB0byBiZSByZXNldAorICogZmNfbHBvcnRfZW50ZXJfZGlzYWJsZWQoKSAtIERpc2FibGUgdGhlIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gYmUgcmVzZXQKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKICAqIHRoaXMgcm91dGluZS4KQEAgLTg4NSwxMyArOTkzLDE0IEBACiAJCSAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKIAogCWZjX2xwb3J0X3N0YXRlX2VudGVyKGxwb3J0LCBMUE9SVF9TVF9ESVNBQkxFRCk7CisJZmNfdnBvcnRzX2xpbmtjaGFuZ2UobHBvcnQpOwogCWZjX2xwb3J0X3Jlc2V0X2xvY2tlZChscG9ydCk7CiB9CiAKIC8qKgogICogZmNfbHBvcnRfZXJyb3IoKSAtIEhhbmRsZXIgZm9yIGFueSBlcnJvcnMKLSAqIEBscG9ydDogVGhlIGZjX2xwb3J0IG9iamVjdAotICogQGZwOiBUaGUgZnJhbWUgcG9pbnRlcgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHRoZSBlcnJvciB3YXMgb24KKyAqIEBmcDoJICAgVGhlIGVycm9yIGNvZGUgZW5jb2RlZCBpbiBhIGZyYW1lIHBvaW50ZXIKICAqCiAgKiBJZiB0aGUgZXJyb3Igd2FzIGNhdXNlZCBieSBhIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHVyZQogICogdGhlbiB3YWl0IGZvciBoYWxmIGEgc2Vjb25kIGFuZCByZXRyeSwgb3RoZXJ3aXNlIHJldHJ5CkBAIC05MjIsOCArMTAzMSwxMSBAQAogCQkJY2FzZSBMUE9SVF9TVF9ESVNBQkxFRDoKIAkJCWNhc2UgTFBPUlRfU1RfUkVBRFk6CiAJCQljYXNlIExQT1JUX1NUX1JFU0VUOgotCQkJY2FzZSBMUE9SVF9TVF9SUE5fSUQ6CisJCQljYXNlIExQT1JUX1NUX1JOTl9JRDoKKwkJCWNhc2UgTFBPUlRfU1RfUlNOTl9OTjoKKwkJCWNhc2UgTFBPUlRfU1RfUlNQTl9JRDoKIAkJCWNhc2UgTFBPUlRfU1RfUkZUX0lEOgorCQkJY2FzZSBMUE9SVF9TVF9SRkZfSUQ6CiAJCQljYXNlIExQT1JUX1NUX1NDUjoKIAkJCWNhc2UgTFBPUlRfU1RfRE5TOgogCQkJY2FzZSBMUE9SVF9TVF9GTE9HSToKQEAgLTkzNiwzMyArMTA0OCwzMyBAQAogfQogCiAvKioKLSAqIGZjX2xwb3J0X3JmdF9pZF9yZXNwKCkgLSBIYW5kbGUgcmVzcG9uc2UgdG8gUmVnaXN0ZXIgRmlicmUKLSAqCQkJICAgIENoYW5uZWwgVHlwZXMgYnkgSUQgKFJQTl9JRCkgcmVxdWVzdAotICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIFJQTl9JRCBleGNoYW5nZQotICogQGZwOiByZXNwb25zZSBmcmFtZQorICogZmNfbHBvcnRfbnNfcmVzcCgpIC0gSGFuZGxlIHJlc3BvbnNlIHRvIGEgbmFtZSBzZXJ2ZXIKKyAqCQkJcmVnaXN0cmF0aW9uIGV4Y2hhbmdlCisgKiBAc3A6CSAgICBjdXJyZW50IHNlcXVlbmNlIGluIGV4Y2hhbmdlCisgKiBAZnA6CSAgICByZXNwb25zZSBmcmFtZQogICogQGxwX2FyZzogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbHBvcnQgbG9jawotICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19scG9ydF9lcnJvcgorICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19scG9ydF9lcnJvcigpCiAgKiBhbmQgdGhlbiB1bmxvY2sgdGhlIGxwb3J0LgogICovCi1zdGF0aWMgdm9pZCBmY19scG9ydF9yZnRfaWRfcmVzcChzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKLQkJCQkgdm9pZCAqbHBfYXJnKQorc3RhdGljIHZvaWQgZmNfbHBvcnRfbnNfcmVzcChzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCSAgICAgdm9pZCAqbHBfYXJnKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBscF9hcmc7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJc3RydWN0IGZjX2N0X2hkciAqY3Q7CiAKLQlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBhIFJGVF9JRCAlc1xuIiwgZmNfZWxzX3Jlc3BfdHlwZShmcCkpOworCUZDX0xQT1JUX0RCRyhscG9ydCwgIlJlY2VpdmVkIGEgbnMgJXNcbiIsIGZjX2Vsc19yZXNwX3R5cGUoZnApKTsKIAogCWlmIChmcCA9PSBFUlJfUFRSKC1GQ19FWF9DTE9TRUQpKQogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwogCi0JaWYgKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9SRlRfSUQpIHsKLQkJRkNfTFBPUlRfREJHKGxwb3J0LCAiUmVjZWl2ZWQgYSBSRlRfSUQgcmVzcG9uc2UsIGJ1dCBpbiBzdGF0ZSAiCi0JCQkgICAgICIlc1xuIiwgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKKwlpZiAobHBvcnQtPnN0YXRlIDwgTFBPUlRfU1RfUk5OX0lEIHx8IGxwb3J0LT5zdGF0ZSA+IExQT1JUX1NUX1JGRl9JRCkgeworCQlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBhIG5hbWUgc2VydmVyIHJlc3BvbnNlLCAiCisJCQkgICAgICJidXQgaW4gc3RhdGUgJXNcbiIsIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CiAJCWlmIChJU19FUlIoZnApKQogCQkJZ290byBlcnI7CiAJCWdvdG8gb3V0OwpAQCAtOTgwLDcgKzEwOTIsMjYgQEAKIAkgICAgY3QtPmN0X2ZzX3R5cGUgPT0gRkNfRlNUX0RJUiAmJgogCSAgICBjdC0+Y3RfZnNfc3VidHlwZSA9PSBGQ19OU19TVUJUWVBFICYmCiAJICAgIG50b2hzKGN0LT5jdF9jbWQpID09IEZDX0ZTX0FDQykKLQkJZmNfbHBvcnRfZW50ZXJfc2NyKGxwb3J0KTsKKwkJc3dpdGNoIChscG9ydC0+c3RhdGUpIHsKKwkJY2FzZSBMUE9SVF9TVF9STk5fSUQ6CisJCQlmY19scG9ydF9lbnRlcl9ucyhscG9ydCwgTFBPUlRfU1RfUlNOTl9OTik7CisJCQlicmVhazsKKwkJY2FzZSBMUE9SVF9TVF9SU05OX05OOgorCQkJZmNfbHBvcnRfZW50ZXJfbnMobHBvcnQsIExQT1JUX1NUX1JTUE5fSUQpOworCQkJYnJlYWs7CisJCWNhc2UgTFBPUlRfU1RfUlNQTl9JRDoKKwkJCWZjX2xwb3J0X2VudGVyX25zKGxwb3J0LCBMUE9SVF9TVF9SRlRfSUQpOworCQkJYnJlYWs7CisJCWNhc2UgTFBPUlRfU1RfUkZUX0lEOgorCQkJZmNfbHBvcnRfZW50ZXJfbnMobHBvcnQsIExQT1JUX1NUX1JGRl9JRCk7CisJCQlicmVhazsKKwkJY2FzZSBMUE9SVF9TVF9SRkZfSUQ6CisJCQlmY19scG9ydF9lbnRlcl9zY3IobHBvcnQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGJ5IHN0YXRlIGNoZWNrcyAqLworCQkJYnJlYWs7CisJCX0KIAllbHNlCiAJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CiBvdXQ6CkBAIC05OTAsNjMgKzExMjEsOSBAQAogfQogCiAvKioKLSAqIGZjX2xwb3J0X3Jwbl9pZF9yZXNwKCkgLSBIYW5kbGUgcmVzcG9uc2UgdG8gUmVnaXN0ZXIgUG9ydAotICoJCQkgICAgTmFtZSBieSBJRCAoUlBOX0lEKSByZXF1ZXN0Ci0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gUlBOX0lEIGV4Y2hhbmdlCi0gKiBAZnA6IHJlc3BvbnNlIGZyYW1lCi0gKiBAbHBfYXJnOiBGaWJyZSBDaGFubmVsIGhvc3QgcG9ydCBpbnN0YW5jZQotICoKLSAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBscG9ydCBsb2NrCi0gKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX2xwb3J0X2Vycm9yCi0gKiBhbmQgdGhlbiB1bmxvY2sgdGhlIGxwb3J0LgotICovCi1zdGF0aWMgdm9pZCBmY19scG9ydF9ycG5faWRfcmVzcChzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKLQkJCQkgdm9pZCAqbHBfYXJnKQotewotCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBscF9hcmc7Ci0Jc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7Ci0Jc3RydWN0IGZjX2N0X2hkciAqY3Q7Ci0KLQlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBhIFJQTl9JRCAlc1xuIiwgZmNfZWxzX3Jlc3BfdHlwZShmcCkpOwotCi0JaWYgKGZwID09IEVSUl9QVFIoLUZDX0VYX0NMT1NFRCkpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7Ci0KLQlpZiAobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1JQTl9JRCkgewotCQlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBhIFJQTl9JRCByZXNwb25zZSwgYnV0IGluIHN0YXRlICIKLQkJCSAgICAgIiVzXG4iLCBmY19scG9ydF9zdGF0ZShscG9ydCkpOwotCQlpZiAoSVNfRVJSKGZwKSkKLQkJCWdvdG8gZXJyOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoSVNfRVJSKGZwKSkgewotCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwotCWN0ID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqY3QpKTsKLQlpZiAoZmggJiYgY3QgJiYgZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9DVCAmJgotCSAgICBjdC0+Y3RfZnNfdHlwZSA9PSBGQ19GU1RfRElSICYmCi0JICAgIGN0LT5jdF9mc19zdWJ0eXBlID09IEZDX05TX1NVQlRZUEUgJiYKLQkgICAgbnRvaHMoY3QtPmN0X2NtZCkgPT0gRkNfRlNfQUNDKQotCQlmY19scG9ydF9lbnRlcl9yZnRfaWQobHBvcnQpOwotCWVsc2UKLQkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKLQotb3V0OgotCWZjX2ZyYW1lX2ZyZWUoZnApOwotZXJyOgotCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKLX0KLQotLyoqCiAgKiBmY19scG9ydF9zY3JfcmVzcCgpIC0gSGFuZGxlIHJlc3BvbnNlIHRvIFN0YXRlIENoYW5nZSBSZWdpc3RlciAoU0NSKSByZXF1ZXN0Ci0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gU0NSIGV4Y2hhbmdlCi0gKiBAZnA6IHJlc3BvbnNlIGZyYW1lCisgKiBAc3A6CSAgICBjdXJyZW50IHNlcXVlbmNlIGluIFNDUiBleGNoYW5nZQorICogQGZwOgkgICAgcmVzcG9uc2UgZnJhbWUKICAqIEBscF9hcmc6IEZpYnJlIENoYW5uZWwgbHBvcnQgcG9ydCBpbnN0YW5jZSB0aGF0IHNlbnQgdGhlIHJlZ2lzdHJhdGlvbiByZXF1ZXN0CiAgKgogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIGxwb3J0IGxvY2sKQEAgLTEwOTIsOCArMTE2OSw4IEBACiB9CiAKIC8qKgotICogZmNfbHBvcnRfZW50ZXJfc2NyKCkgLSBTZW5kIGEgU3RhdGUgQ2hhbmdlIFJlZ2lzdGVyIChTQ1IpIHJlcXVlc3QKLSAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHRvIHJlZ2lzdGVyIGZvciBzdGF0ZSBjaGFuZ2VzCisgKiBmY19scG9ydF9lbnRlcl9zY3IoKSAtIFNlbmQgYSBTQ1IgKFN0YXRlIENoYW5nZSBSZWdpc3RlcikgcmVxdWVzdAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byByZWdpc3RlciBmb3Igc3RhdGUgY2hhbmdlcwogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtMTExNCw3OCArMTE5MSw3NCBAQAogCX0KIAogCWlmICghbHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIEZDX0ZJRF9GQ1RSTCwgZnAsIEVMU19TQ1IsCi0JCQkJICBmY19scG9ydF9zY3JfcmVzcCwgbHBvcnQsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJCQkgIGZjX2xwb3J0X3Njcl9yZXNwLCBscG9ydCwKKwkJCQkgIDIgKiBscG9ydC0+cl9hX3RvdikpCisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBOVUxMKTsKIH0KIAogLyoqCi0gKiBmY19scG9ydF9lbnRlcl9yZnRfaWQoKSAtIFJlZ2lzdGVyIEZDNC10eXBlcyB3aXRoIHRoZSBuYW1lIHNlcnZlcgorICogZmNfbHBvcnRfZW50ZXJfbnMoKSAtIHJlZ2lzdGVyIHNvbWUgb2JqZWN0IHdpdGggdGhlIG5hbWUgc2VydmVyCiAgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCB0byByZWdpc3RlcgogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgogICovCi1zdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9yZnRfaWQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3N0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX25zKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIGVudW0gZmNfbHBvcnRfc3RhdGUgc3RhdGUpCiB7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKLQlzdHJ1Y3QgZmNfbnNfZnRzICpscHM7Ci0JaW50IGk7CisJZW51bSBmY19uc19yZXEgY21kOworCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBmY19jdF9oZHIpOworCXNpemVfdCBsZW47CiAKLQlGQ19MUE9SVF9EQkcobHBvcnQsICJFbnRlcmVkIFJGVF9JRCBzdGF0ZSBmcm9tICVzIHN0YXRlXG4iLAorCUZDX0xQT1JUX0RCRyhscG9ydCwgIkVudGVyZWQgJXMgc3RhdGUgZnJvbSAlcyBzdGF0ZVxuIiwKKwkJICAgICBmY19scG9ydF9zdGF0ZV9uYW1lc1tzdGF0ZV0sCiAJCSAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKIAotCWZjX2xwb3J0X3N0YXRlX2VudGVyKGxwb3J0LCBMUE9SVF9TVF9SRlRfSUQpOworCWZjX2xwb3J0X3N0YXRlX2VudGVyKGxwb3J0LCBzdGF0ZSk7CiAKLQlscHMgPSAmbHBvcnQtPmZjdHM7Ci0JaSA9IHNpemVvZihscHMtPmZmX3R5cGVfbWFwKSAvIHNpemVvZihscHMtPmZmX3R5cGVfbWFwWzBdKTsKLQl3aGlsZSAoLS1pID49IDApCi0JCWlmIChudG9obChscHMtPmZmX3R5cGVfbWFwW2ldKSAhPSAwKQotCQkJYnJlYWs7Ci0JaWYgKGkgPCAwKSB7Ci0JCS8qIG5vdGhpbmcgdG8gcmVnaXN0ZXIsIG1vdmUgb24gdG8gU0NSICovCi0JCWZjX2xwb3J0X2VudGVyX3NjcihscG9ydCk7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgTFBPUlRfU1RfUk5OX0lEOgorCQljbWQgPSBGQ19OU19STk5fSUQ7CisJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBmY19uc19ybl9pZCk7CisJCWJyZWFrOworCWNhc2UgTFBPUlRfU1RfUlNOTl9OTjoKKwkJbGVuID0gc3RybmxlbihmY19ob3N0X3N5bWJvbGljX25hbWUobHBvcnQtPmhvc3QpLCAyNTUpOworCQkvKiBpZiB0aGVyZSBpcyBubyBzeW1ib2xpYyBuYW1lLCBza2lwIHRvIFJGVF9JRCAqLworCQlpZiAoIWxlbikKKwkJCXJldHVybiBmY19scG9ydF9lbnRlcl9ucyhscG9ydCwgTFBPUlRfU1RfUkZUX0lEKTsKKwkJY21kID0gRkNfTlNfUlNOTl9OTjsKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGZjX25zX3Jzbm4pICsgbGVuOworCQlicmVhazsKKwljYXNlIExQT1JUX1NUX1JTUE5fSUQ6CisJCWxlbiA9IHN0cm5sZW4oZmNfaG9zdF9zeW1ib2xpY19uYW1lKGxwb3J0LT5ob3N0KSwgMjU1KTsKKwkJLyogaWYgdGhlcmUgaXMgbm8gc3ltYm9saWMgbmFtZSwgc2tpcCB0byBSRlRfSUQgKi8KKwkJaWYgKCFsZW4pCisJCQlyZXR1cm4gZmNfbHBvcnRfZW50ZXJfbnMobHBvcnQsIExQT1JUX1NUX1JGVF9JRCk7CisJCWNtZCA9IEZDX05TX1JTUE5fSUQ7CisJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBmY19uc19yc3BuKSArIGxlbjsKKwkJYnJlYWs7CisJY2FzZSBMUE9SVF9TVF9SRlRfSUQ6CisJCWNtZCA9IEZDX05TX1JGVF9JRDsKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGZjX25zX3JmdCk7CisJCWJyZWFrOworCWNhc2UgTFBPUlRfU1RfUkZGX0lEOgorCQljbWQgPSBGQ19OU19SRkZfSUQ7CisJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBmY19uc19yZmZfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmY19scG9ydF9lcnJvcihscG9ydCwgTlVMTCk7CiAJCXJldHVybjsKIAl9CiAKLQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2N0X2hkcikgKwotCQkJICAgIHNpemVvZihzdHJ1Y3QgZmNfbnNfcmZ0KSk7CisJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwgc2l6ZSk7CiAJaWYgKCFmcCkgewogCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgRkNfRklEX0RJUl9TRVJWLCBmcCwgRkNfTlNfUkZUX0lELAotCQkJCSAgZmNfbHBvcnRfcmZ0X2lkX3Jlc3AsCi0JCQkJICBscG9ydCwgbHBvcnQtPmVfZF90b3YpKQotCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOwotfQotCi0vKioKLSAqIGZjX3Jwb3J0X2VudGVyX3JmdF9pZCgpIC0gUmVnaXN0ZXIgcG9ydCBuYW1lIHdpdGggdGhlIG5hbWUgc2VydmVyCi0gKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCB0byByZWdpc3RlcgotICoKLSAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwotICogdGhpcyByb3V0aW5lLgotICovCi1zdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9ycG5faWQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKLXsKLQlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwotCi0JRkNfTFBPUlRfREJHKGxwb3J0LCAiRW50ZXJlZCBSUE5fSUQgc3RhdGUgZnJvbSAlcyBzdGF0ZVxuIiwKLQkJICAgICBmY19scG9ydF9zdGF0ZShscG9ydCkpOwotCi0JZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX1JQTl9JRCk7Ci0KLQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2N0X2hkcikgKwotCQkJICAgIHNpemVvZihzdHJ1Y3QgZmNfbnNfcm5faWQpKTsKLQlpZiAoIWZwKSB7Ci0JCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBGQ19GSURfRElSX1NFUlYsIGZwLCBGQ19OU19SUE5fSUQsCi0JCQkJICBmY19scG9ydF9ycG5faWRfcmVzcCwKLQkJCQkgIGxwb3J0LCBscG9ydC0+ZV9kX3RvdikpCisJaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgRkNfRklEX0RJUl9TRVJWLCBmcCwgY21kLAorCQkJCSAgZmNfbHBvcnRfbnNfcmVzcCwKKwkJCQkgIGxwb3J0LCAzICogbHBvcnQtPnJfYV90b3YpKQogCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOwogfQogCkBAIC0xMTk0LDggKzEyNjcsOCBAQAogfTsKIAogLyoqCi0gKiBmY19ycG9ydF9lbnRlcl9kbnMoKSAtIENyZWF0ZSBhIHJwb3J0IHRvIHRoZSBuYW1lIHNlcnZlcgotICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGxvY2FsIHBvcnQgcmVxdWVzdGluZyBhIHJwb3J0IGZvciB0aGUgbmFtZSBzZXJ2ZXIKKyAqIGZjX3Jwb3J0X2VudGVyX2RucygpIC0gQ3JlYXRlIGEgZmNfcnBvcnQgZm9yIHRoZSBuYW1lIHNlcnZlcgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCByZXF1ZXN0aW5nIGEgcmVtb3RlIHBvcnQgZm9yIHRoZSBuYW1lIHNlcnZlcgogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtMTIyNCw4ICsxMjk3LDggQEAKIH0KIAogLyoqCi0gKiBmY19scG9ydF90aW1lb3V0KCkgLSBIYW5kbGVyIGZvciB0aGUgcmV0cnlfd29yayB0aW1lci4KLSAqIEB3b3JrOiBUaGUgd29yayBzdHJ1Y3Qgb2YgdGhlIGZjX2xwb3J0CisgKiBmY19scG9ydF90aW1lb3V0KCkgLSBIYW5kbGVyIGZvciB0aGUgcmV0cnlfd29yayB0aW1lcgorICogQHdvcms6IFRoZSB3b3JrIHN0cnVjdCBvZiB0aGUgbG9jYWwgcG9ydAogICovCiBzdGF0aWMgdm9pZCBmY19scG9ydF90aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTEyMzcsMjEgKzEzMTAsMjUgQEAKIAogCXN3aXRjaCAobHBvcnQtPnN0YXRlKSB7CiAJY2FzZSBMUE9SVF9TVF9ESVNBQkxFRDoKLQljYXNlIExQT1JUX1NUX1JFQURZOgotCWNhc2UgTFBPUlRfU1RfUkVTRVQ6CiAJCVdBUk5fT04oMSk7CiAJCWJyZWFrOworCWNhc2UgTFBPUlRfU1RfUkVBRFk6CisJCVdBUk5fT04oMSk7CisJCWJyZWFrOworCWNhc2UgTFBPUlRfU1RfUkVTRVQ6CisJCWJyZWFrOwogCWNhc2UgTFBPUlRfU1RfRkxPR0k6CiAJCWZjX2xwb3J0X2VudGVyX2Zsb2dpKGxwb3J0KTsKIAkJYnJlYWs7CiAJY2FzZSBMUE9SVF9TVF9ETlM6CiAJCWZjX2xwb3J0X2VudGVyX2RucyhscG9ydCk7CiAJCWJyZWFrOwotCWNhc2UgTFBPUlRfU1RfUlBOX0lEOgotCQlmY19scG9ydF9lbnRlcl9ycG5faWQobHBvcnQpOwotCQlicmVhazsKKwljYXNlIExQT1JUX1NUX1JOTl9JRDoKKwljYXNlIExQT1JUX1NUX1JTTk5fTk46CisJY2FzZSBMUE9SVF9TVF9SU1BOX0lEOgogCWNhc2UgTFBPUlRfU1RfUkZUX0lEOgotCQlmY19scG9ydF9lbnRlcl9yZnRfaWQobHBvcnQpOworCWNhc2UgTFBPUlRfU1RfUkZGX0lEOgorCQlmY19scG9ydF9lbnRlcl9ucyhscG9ydCwgbHBvcnQtPnN0YXRlKTsKIAkJYnJlYWs7CiAJY2FzZSBMUE9SVF9TVF9TQ1I6CiAJCWZjX2xwb3J0X2VudGVyX3NjcihscG9ydCk7CkBAIC0xMjY2LDE2ICsxMzQzLDE2IEBACiAKIC8qKgogICogZmNfbHBvcnRfbG9nb19yZXNwKCkgLSBIYW5kbGUgcmVzcG9uc2UgdG8gTE9HTyByZXF1ZXN0Ci0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gTE9HTyBleGNoYW5nZQotICogQGZwOiByZXNwb25zZSBmcmFtZQotICogQGxwX2FyZzogRmlicmUgQ2hhbm5lbCBscG9ydCBwb3J0IGluc3RhbmNlIHRoYXQgc2VudCB0aGUgTE9HTyByZXF1ZXN0CisgKiBAc3A6CSAgICBUaGUgc2VxdWVuY2UgdGhhdCB0aGUgTE9HTyB3YXMgb24KKyAqIEBmcDoJICAgIFRoZSBMT0dPIGZyYW1lCisgKiBAbHBfYXJnOiBUaGUgbHBvcnQgcG9ydCB0aGF0IHJlY2VpdmVkIHRoZSBMT0dPIHJlcXVlc3QKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbHBvcnQgbG9jawotICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19scG9ydF9lcnJvcgorICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19scG9ydF9lcnJvcigpCiAgKiBhbmQgdGhlbiB1bmxvY2sgdGhlIGxwb3J0LgogICovCi1zdGF0aWMgdm9pZCBmY19scG9ydF9sb2dvX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkgICAgICAgdm9pZCAqbHBfYXJnKQordm9pZCBmY19scG9ydF9sb2dvX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQl2b2lkICpscF9hcmcpCiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGxwX2FyZzsKIAl1OCBvcDsKQEAgLTEzMTEsMTAgKzEzODgsMTEgQEAKIGVycjoKIAltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CiB9CitFWFBPUlRfU1lNQk9MKGZjX2xwb3J0X2xvZ29fcmVzcCk7CiAKIC8qKgogICogZmNfcnBvcnRfZW50ZXJfbG9nbygpIC0gTG9nb3V0IG9mIHRoZSBmYWJyaWMKLSAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHRvIGJlIGxvZ2dlZCBvdXQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gYmUgbG9nZ2VkIG91dAogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtMTMyOCw2ICsxNDA2LDcgQEAKIAkJICAgICBmY19scG9ydF9zdGF0ZShscG9ydCkpOwogCiAJZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX0xPR08pOworCWZjX3Zwb3J0c19saW5rY2hhbmdlKGxwb3J0KTsKIAogCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqbG9nbykpOwogCWlmICghZnApIHsKQEAgLTEzMzYsMjIgKzE0MTUsMjMgQEAKIAl9CiAKIAlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBGQ19GSURfRkxPR0ksIGZwLCBFTFNfTE9HTywKLQkJCQkgIGZjX2xwb3J0X2xvZ29fcmVzcCwgbHBvcnQsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJCQkgIGZjX2xwb3J0X2xvZ29fcmVzcCwgbHBvcnQsCisJCQkJICAyICogbHBvcnQtPnJfYV90b3YpKQorCQlmY19scG9ydF9lcnJvcihscG9ydCwgTlVMTCk7CiB9CiAKIC8qKgogICogZmNfbHBvcnRfZmxvZ2lfcmVzcCgpIC0gSGFuZGxlIHJlc3BvbnNlIHRvIEZMT0dJIHJlcXVlc3QKLSAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiBGTE9HSSBleGNoYW5nZQotICogQGZwOiByZXNwb25zZSBmcmFtZQotICogQGxwX2FyZzogRmlicmUgQ2hhbm5lbCBscG9ydCBwb3J0IGluc3RhbmNlIHRoYXQgc2VudCB0aGUgRkxPR0kgcmVxdWVzdAorICogQHNwOgkgICAgVGhlIHNlcXVlbmNlIHRoYXQgdGhlIEZMT0dJIHdhcyBvbgorICogQGZwOgkgICAgVGhlIEZMT0dJIHJlc3BvbnNlIGZyYW1lCisgKiBAbHBfYXJnOiBUaGUgbHBvcnQgcG9ydCB0aGF0IHJlY2VpdmVkIHRoZSBGTE9HSSByZXNwb25zZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBscG9ydCBsb2NrCi0gKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX2xwb3J0X2Vycm9yCisgKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX2xwb3J0X2Vycm9yKCkKICAqIGFuZCB0aGVuIHVubG9jayB0aGUgbHBvcnQuCiAgKi8KLXN0YXRpYyB2b2lkIGZjX2xwb3J0X2Zsb2dpX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJdm9pZCAqbHBfYXJnKQordm9pZCBmY19scG9ydF9mbG9naV9yZXNwKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJIHZvaWQgKmxwX2FyZykKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gbHBfYXJnOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwpAQCAtMTM4NSwxMSArMTQ2NSw2IEBACiAJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKIAlkaWQgPSBudG9oMjQoZmgtPmZoX2RfaWQpOwogCWlmIChmY19mcmFtZV9wYXlsb2FkX29wKGZwKSA9PSBFTFNfTFNfQUNDICYmIGRpZCAhPSAwKSB7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAibGliZmM6IEFzc2lnbmVkIEZJRCAoJTZ4KSBpbiBGTE9HSSByZXNwb25zZVxuIiwKLQkJICAgICAgIGRpZCk7Ci0JCWZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkgPSBkaWQ7Ci0KIAkJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7CiAJCWlmIChmbHApIHsKIAkJCW1mcyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2JiX2RhdGEpICYKQEAgLTE0MDIsMTIgKzE0NzcsMTggQEAKIAkJCWVfZF90b3YgPSBudG9obChmbHAtPmZsX2NzcC5zcF9lX2RfdG92KTsKIAkJCWlmIChjc3BfZmxhZ3MgJiBGQ19TUF9GVF9FRFRSKQogCQkJCWVfZF90b3YgLz0gMTAwMDAwMDsKKworCQkJbHBvcnQtPm5waXZfZW5hYmxlZCA9ICEhKGNzcF9mbGFncyAmIEZDX1NQX0ZUX05QSVZfQUNDKTsKKwogCQkJaWYgKChjc3BfZmxhZ3MgJiBGQ19TUF9GVF9GUE9SVCkgPT0gMCkgewogCQkJCWlmIChlX2RfdG92ID4gbHBvcnQtPmVfZF90b3YpCiAJCQkJCWxwb3J0LT5lX2RfdG92ID0gZV9kX3RvdjsKIAkJCQlscG9ydC0+cl9hX3RvdiA9IDIgKiBlX2RfdG92OwotCQkJCXByaW50ayhLRVJOX0lORk8gImxpYmZjOiBQb3J0ICglNngpIGVudGVyZWQgIgotCQkJCSAgICAgICAicG9pbnQgdG8gcG9pbnQgbW9kZVxuIiwgZGlkKTsKKwkJCQlmY19scG9ydF9zZXRfcG9ydF9pZChscG9ydCwgZGlkLCBmcCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCVkOiBsaWJmYzogIgorCQkJCSAgICAgICAiUG9ydCAoJTZ4KSBlbnRlcmVkICIKKwkJCQkgICAgICAgInBvaW50LXRvLXBvaW50IG1vZGVcbiIsCisJCQkJICAgICAgIGxwb3J0LT5ob3N0LT5ob3N0X25vLCBkaWQpOwogCQkJCWZjX2xwb3J0X3B0cF9zZXR1cChscG9ydCwgbnRvaDI0KGZoLT5maF9zX2lkKSwKIAkJCQkJCSAgIGdldF91bmFsaWduZWRfYmU2NCgKIAkJCQkJCQkgICAmZmxwLT5mbF93d3BuKSwKQEAgLTE0MTgsNiArMTQ5OSw3IEBACiAJCQkJbHBvcnQtPnJfYV90b3YgPSByX2FfdG92OwogCQkJCWZjX2hvc3RfZmFicmljX25hbWUobHBvcnQtPmhvc3QpID0KIAkJCQkJZ2V0X3VuYWxpZ25lZF9iZTY0KCZmbHAtPmZsX3d3bm4pOworCQkJCWZjX2xwb3J0X3NldF9wb3J0X2lkKGxwb3J0LCBkaWQsIGZwKTsKIAkJCQlmY19scG9ydF9lbnRlcl9kbnMobHBvcnQpOwogCQkJfQogCQl9CkBAIC0xNDMwLDYgKzE1MTIsNyBAQAogZXJyOgogCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKIH0KK0VYUE9SVF9TWU1CT0woZmNfbHBvcnRfZmxvZ2lfcmVzcCk7CiAKIC8qKgogICogZmNfcnBvcnRfZW50ZXJfZmxvZ2koKSAtIFNlbmQgYSBGTE9HSSByZXF1ZXN0IHRvIHRoZSBmYWJyaWMgbWFuYWdlcgpAQCAtMTQ1MSwxMiArMTUzNCwxOCBAQAogCWlmICghZnApCiAJCXJldHVybiBmY19scG9ydF9lcnJvcihscG9ydCwgZnApOwogCi0JaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgRkNfRklEX0ZMT0dJLCBmcCwgRUxTX0ZMT0dJLAotCQkJCSAgZmNfbHBvcnRfZmxvZ2lfcmVzcCwgbHBvcnQsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBGQ19GSURfRkxPR0ksIGZwLAorCQkJCSAgbHBvcnQtPnZwb3J0ID8gRUxTX0ZESVNDIDogRUxTX0ZMT0dJLAorCQkJCSAgZmNfbHBvcnRfZmxvZ2lfcmVzcCwgbHBvcnQsCisJCQkJICBscG9ydC0+dnBvcnQgPyAyICogbHBvcnQtPnJfYV90b3YgOgorCQkJCSAgbHBvcnQtPmVfZF90b3YpKQorCQlmY19scG9ydF9lcnJvcihscG9ydCwgTlVMTCk7CiB9CiAKLS8qIENvbmZpZ3VyZSBhIGZjX2xwb3J0ICovCisvKioKKyAqIGZjX2xwb3J0X2NvbmZpZygpIC0gQ29uZmlndXJlIGEgZmNfbHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gYmUgY29uZmlndXJlZAorICovCiBpbnQgZmNfbHBvcnRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmxwb3J0LT5yZXRyeV93b3JrLCBmY19scG9ydF90aW1lb3V0KTsKQEAgLTE0NzEsNiArMTU2MCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChmY19scG9ydF9jb25maWcpOwogCisvKioKKyAqIGZjX2xwb3J0X2luaXQoKSAtIEluaXRpYWxpemUgdGhlIGxwb3J0IGxheWVyIGZvciBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gaW5pdGlhbGl6ZSB0aGUgZXhjaGFuZ2UgbGF5ZXIgZm9yCisgKi8KIGludCBmY19scG9ydF9pbml0KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJaWYgKCFscG9ydC0+dHQubHBvcnRfcmVjdikKQEAgLTE1MDAsNyArMTU5MywyNTMgQEAKIAlpZiAobHBvcnQtPmxpbmtfc3VwcG9ydGVkX3NwZWVkcyAmIEZDX1BPUlRTUEVFRF8xMEdCSVQpCiAJCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhscG9ydC0+aG9zdCkgfD0gRkNfUE9SVFNQRUVEXzEwR0JJVDsKIAotCUlOSVRfTElTVF9IRUFEKCZscG9ydC0+ZW1hX2xpc3QpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChmY19scG9ydF9pbml0KTsKKworLyoqCisgKiBmY19scG9ydF9ic2dfcmVzcCgpIC0gVGhlIGNvbW1vbiByZXNwb25zZSBoYW5kbGVyIGZvciBGQyBQYXNzdGhyb3VnaCByZXF1ZXN0cworICogQHNwOgkgICAgICBUaGUgc2VxdWVuY2UgZm9yIHRoZSBGQyBQYXNzdGhyb3VnaCByZXNwb25zZQorICogQGZwOgkgICAgICBUaGUgcmVzcG9uc2UgZnJhbWUKKyAqIEBpbmZvX2FyZzogVGhlIEJTRyBpbmZvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGZvcgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9ic2dfcmVzcChzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCSAgICAgIHZvaWQgKmluZm9fYXJnKQoreworCXN0cnVjdCBmY19ic2dfaW5mbyAqaW5mbyA9IGluZm9fYXJnOworCXN0cnVjdCBmY19ic2dfam9iICpqb2IgPSBpbmZvLT5qb2I7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGluZm8tPmxwb3J0OworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXNpemVfdCBsZW47CisJdm9pZCAqYnVmOworCisJaWYgKElTX0VSUihmcCkpIHsKKwkJam9iLT5yZXBseS0+cmVzdWx0ID0gKFBUUl9FUlIoZnApID09IC1GQ19FWF9DTE9TRUQpID8KKwkJCS1FQ09OTkFCT1JURUQgOiAtRVRJTUVET1VUOworCQlqb2ItPnJlcGx5X2xlbiA9IHNpemVvZih1aW50MzJfdCk7CisJCWpvYi0+c3RhdGVfZmxhZ3MgfD0gRkNfUlFTVF9TVEFURV9ET05FOworCQlqb2ItPmpvYl9kb25lKGpvYik7CisJCWtmcmVlKGluZm8pOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCWxlbiA9IGZyX2xlbihmcCkgLSBzaXplb2YoKmZoKTsKKwlidWYgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgMCk7CisKKwlpZiAoZnJfc29mKGZwKSA9PSBGQ19TT0ZfSTMgJiYgIW50b2hzKGZoLT5maF9zZXFfY250KSkgeworCQkvKiBHZXQgdGhlIHJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgZmlyc3QgZnJhbWUgcGF5bG9hZCAqLworCQl1bnNpZ25lZCBzaG9ydCBjbWQgPSAoaW5mby0+cnNwX2NvZGUgPT0gRkNfRlNfQUNDKSA/CisJCQludG9ocygoKHN0cnVjdCBmY19jdF9oZHIgKilidWYpLT5jdF9jbWQpIDoKKwkJCSh1bnNpZ25lZCBzaG9ydClmY19mcmFtZV9wYXlsb2FkX29wKGZwKTsKKworCQkvKiBTYXZlIHRoZSByZXBseSBzdGF0dXMgb2YgdGhlIGpvYiAqLworCQlqb2ItPnJlcGx5LT5yZXBseV9kYXRhLmN0ZWxzX3JlcGx5LnN0YXR1cyA9CisJCQkoY21kID09IGluZm8tPnJzcF9jb2RlKSA/CisJCQlGQ19DVEVMU19TVEFUVVNfT0sgOiBGQ19DVEVMU19TVEFUVVNfUkVKRUNUOworCX0KKworCWpvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiArPQorCQlmY19jb3B5X2J1ZmZlcl90b19zZ2xpc3QoYnVmLCBsZW4sIGluZm8tPnNnLCAmaW5mby0+bmVudHMsCisJCQkJCSAmaW5mby0+b2Zmc2V0LCBLTV9CSU9fU1JDX0lSUSwgTlVMTCk7CisKKwlpZiAoZnJfZW9mKGZwKSA9PSBGQ19FT0ZfVCAmJgorCSAgICAobnRvaDI0KGZoLT5maF9mX2N0bCkgJiAoRkNfRkNfTEFTVF9TRVEgfCBGQ19GQ19FTkRfU0VRKSkgPT0KKwkgICAgKEZDX0ZDX0xBU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSkpIHsKKwkJaWYgKGpvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA+CisJCSAgICBqb2ItPnJlcGx5X3BheWxvYWQucGF5bG9hZF9sZW4pCisJCQlqb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQorCQkJCWpvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKwkJam9iLT5yZXBseS0+cmVzdWx0ID0gMDsKKwkJam9iLT5zdGF0ZV9mbGFncyB8PSBGQ19SUVNUX1NUQVRFX0RPTkU7CisJCWpvYi0+am9iX2RvbmUoam9iKTsKKwkJa2ZyZWUoaW5mbyk7CisJfQorCWZjX2ZyYW1lX2ZyZWUoZnApOworCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKK30KKworLyoqCisgKiBmY19scG9ydF9lbHNfcmVxdWVzdCgpIC0gU2VuZCBFTFMgcGFzc3Rocm91Z2ggcmVxdWVzdAorICogQGpvYjogICBUaGUgQlNHIFBhc3N0aHJvdWdoIGpvYgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCBzZW5kaW5nIHRoZSByZXF1ZXN0CisgKiBAZGlkOiAgIFRoZSBkZXN0aW5hdGlvbiBwb3J0IGlkCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgbHBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgZmNfbHBvcnRfZWxzX3JlcXVlc3Qoc3RydWN0IGZjX2JzZ19qb2IgKmpvYiwKKwkJCQlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCXUzMiBkaWQsIHUzMiB0b3YpCit7CisJc3RydWN0IGZjX2JzZ19pbmZvICppbmZvOworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJY2hhciAqcHA7CisJaW50IGxlbjsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuOworCXBwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIGxlbik7CisKKwlzZ19jb3B5X3RvX2J1ZmZlcihqb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LAorCQkJICBqb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsCisJCQkgIHBwLCBsZW4pOworCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlmaC0+Zmhfcl9jdGwgPSBGQ19SQ1RMX0VMU19SRVE7CisJaHRvbjI0KGZoLT5maF9kX2lkLCBkaWQpOworCWh0b24yNChmaC0+Zmhfc19pZCwgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisJZmgtPmZoX3R5cGUgPSBGQ19UWVBFX0VMUzsKKwlodG9uMjQoZmgtPmZoX2ZfY3RsLCBGQ19GQ19GSVJTVF9TRVEgfAorCSAgICAgICBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQpOworCWZoLT5maF9jc19jdGwgPSAwOworCWZoLT5maF9kZl9jdGwgPSAwOworCWZoLT5maF9wYXJtX29mZnNldCA9IDA7CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZjX2JzZ19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCWZjX2ZyYW1lX2ZyZWUoZnApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbmZvLT5qb2IgPSBqb2I7CisJaW5mby0+bHBvcnQgPSBscG9ydDsKKwlpbmZvLT5yc3BfY29kZSA9IEVMU19MU19BQ0M7CisJaW5mby0+bmVudHMgPSBqb2ItPnJlcGx5X3BheWxvYWQuc2dfY250OworCWluZm8tPnNnID0gam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3Q7CisKKwlpZiAoIWxwb3J0LT50dC5leGNoX3NlcV9zZW5kKGxwb3J0LCBmcCwgZmNfbHBvcnRfYnNnX3Jlc3AsCisJCQkJICAgICBOVUxMLCBpbmZvLCB0b3YpKQorCQlyZXR1cm4gLUVDT01NOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZjX2xwb3J0X2N0X3JlcXVlc3QoKSAtIFNlbmQgQ1QgUGFzc3Rocm91Z2ggcmVxdWVzdAorICogQGpvYjogICBUaGUgQlNHIFBhc3N0aHJvdWdoIGpvYgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCBzZW5kaW5nIHRoZSByZXF1ZXN0CisgKiBAZGlkOiAgIFRoZSBkZXN0aW5hdGlvbiBGQy1JRAorICogQHRvdjogICBUaGUgdGltZW91dCBwZXJpb2QgdG8gd2FpdCBmb3IgdGhlIHJlc3BvbnNlCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgbHBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgZmNfbHBvcnRfY3RfcmVxdWVzdChzdHJ1Y3QgZmNfYnNnX2pvYiAqam9iLAorCQkJICAgICAgIHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHUzMiBkaWQsIHUzMiB0b3YpCit7CisJc3RydWN0IGZjX2JzZ19pbmZvICppbmZvOworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX2N0X3JlcSAqY3Q7CisJc2l6ZV90IGxlbjsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZihzdHJ1Y3QgZmNfY3RfaGRyKSArCisJCQkgICAgam9iLT5yZXF1ZXN0X3BheWxvYWQucGF5bG9hZF9sZW4pOworCWlmICghZnApCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gam9iLT5yZXF1ZXN0X3BheWxvYWQucGF5bG9hZF9sZW47CisJY3QgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgbGVuKTsKKworCXNnX2NvcHlfdG9fYnVmZmVyKGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJCQkgIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwKKwkJCSAgY3QsIGxlbik7CisKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCWZoLT5maF9yX2N0bCA9IEZDX1JDVExfRERfVU5TT0xfQ1RMOworCWh0b24yNChmaC0+ZmhfZF9pZCwgZGlkKTsKKwlodG9uMjQoZmgtPmZoX3NfaWQsIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOworCWZoLT5maF90eXBlID0gRkNfVFlQRV9DVDsKKwlodG9uMjQoZmgtPmZoX2ZfY3RsLCBGQ19GQ19GSVJTVF9TRVEgfAorCSAgICAgICBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQpOworCWZoLT5maF9jc19jdGwgPSAwOworCWZoLT5maF9kZl9jdGwgPSAwOworCWZoLT5maF9wYXJtX29mZnNldCA9IDA7CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZjX2JzZ19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCWZjX2ZyYW1lX2ZyZWUoZnApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbmZvLT5qb2IgPSBqb2I7CisJaW5mby0+bHBvcnQgPSBscG9ydDsKKwlpbmZvLT5yc3BfY29kZSA9IEZDX0ZTX0FDQzsKKwlpbmZvLT5uZW50cyA9IGpvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQ7CisJaW5mby0+c2cgPSBqb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdDsKKworCWlmICghbHBvcnQtPnR0LmV4Y2hfc2VxX3NlbmQobHBvcnQsIGZwLCBmY19scG9ydF9ic2dfcmVzcCwKKwkJCQkgICAgIE5VTEwsIGluZm8sIHRvdikpCisJCXJldHVybiAtRUNPTU07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmNfbHBvcnRfYnNnX3JlcXVlc3QoKSAtIFRoZSBjb21tb24gZW50cnkgcG9pbnQgZm9yIHNlbmRpbmcKKyAqCQkJICAgIEZDIFBhc3N0aHJvdWdoIHJlcXVlc3RzCisgKiBAam9iOiBUaGUgQlNHIHBhc3N0aHJvdWdoIGpvYgorICovCitpbnQgZmNfbHBvcnRfYnNnX3JlcXVlc3Qoc3RydWN0IGZjX2JzZ19qb2IgKmpvYikKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnNwID0gam9iLT5yZXEtPm5leHRfcnE7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBqb2ItPnNob3N0OworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCXUzMiBkaWQ7CisKKwlqb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCXJzcC0+cmVzaWRfbGVuID0gam9iLT5yZXBseV9wYXlsb2FkLnBheWxvYWRfbGVuOworCisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKworCXN3aXRjaCAoam9iLT5yZXF1ZXN0LT5tc2djb2RlKSB7CisJY2FzZSBGQ19CU0dfUlBUX0VMUzoKKwkJcnBvcnQgPSBqb2ItPnJwb3J0OworCQlpZiAoIXJwb3J0KQorCQkJYnJlYWs7CisKKwkJcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwkJcmMgPSBmY19scG9ydF9lbHNfcmVxdWVzdChqb2IsIGxwb3J0LCBycG9ydC0+cG9ydF9pZCwKKwkJCQkJICByZGF0YS0+ZV9kX3Rvdik7CisJCWJyZWFrOworCisJY2FzZSBGQ19CU0dfUlBUX0NUOgorCQlycG9ydCA9IGpvYi0+cnBvcnQ7CisJCWlmICghcnBvcnQpCisJCQlicmVhazsKKworCQlyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCQlyYyA9IGZjX2xwb3J0X2N0X3JlcXVlc3Qoam9iLCBscG9ydCwgcnBvcnQtPnBvcnRfaWQsCisJCQkJCSByZGF0YS0+ZV9kX3Rvdik7CisJCWJyZWFrOworCisJY2FzZSBGQ19CU0dfSFNUX0NUOgorCQlkaWQgPSBudG9oMjQoam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF9jdC5wb3J0X2lkKTsKKwkJaWYgKGRpZCA9PSBGQ19GSURfRElSX1NFUlYpCisJCQlyZGF0YSA9IGxwb3J0LT5kbnNfcmRhdGE7CisJCWVsc2UKKwkJCXJkYXRhID0gbHBvcnQtPnR0LnJwb3J0X2xvb2t1cChscG9ydCwgZGlkKTsKKworCQlpZiAoIXJkYXRhKQorCQkJYnJlYWs7CisKKwkJcmMgPSBmY19scG9ydF9jdF9yZXF1ZXN0KGpvYiwgbHBvcnQsIGRpZCwgcmRhdGEtPmVfZF90b3YpOworCQlicmVhazsKKworCWNhc2UgRkNfQlNHX0hTVF9FTFNfTk9MT0dJTjoKKwkJZGlkID0gbnRvaDI0KGpvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfZWxzLnBvcnRfaWQpOworCQlyYyA9IGZjX2xwb3J0X2Vsc19yZXF1ZXN0KGpvYiwgbHBvcnQsIGRpZCwgbHBvcnQtPmVfZF90b3YpOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChmY19scG9ydF9ic2dfcmVxdWVzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbnBpdi5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX25waXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhmNmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX25waXYuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKy8qCisgKiBOUElWIFZOX1BvcnQgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbGliZmMKKyAqLworCisjaW5jbHVkZSA8c2NzaS9saWJmYy5oPgorCisvKioKKyAqIGZjX3Zwb3J0X2NyZWF0ZSgpIC0gQ3JlYXRlIGEgbmV3IE5QSVYgdnBvcnQgaW5zdGFuY2UKKyAqIEB2cG9ydDogZmNfdnBvcnQgc3RydWN0dXJlIGZyb20gc2NzaV90cmFuc3BvcnRfZmMKKyAqIEBwcml2c2l6ZTogZHJpdmVyIHByaXZhdGUgZGF0YSBzaXplIHRvIGFsbG9jYXRlIGFsb25nIHdpdGggdGhlIFNjc2lfSG9zdAorICovCisKK3N0cnVjdCBmY19scG9ydCAqbGliZmNfdnBvcnRfY3JlYXRlKHN0cnVjdCBmY192cG9ydCAqdnBvcnQsIGludCBwcml2c2l6ZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZwb3J0X3RvX3Nob3N0KHZwb3J0KTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydDsKKworCXZuX3BvcnQgPSBsaWJmY19ob3N0X2FsbG9jKHNob3N0LT5ob3N0dCwgcHJpdnNpemUpOworCWlmICghdm5fcG9ydCkKKwkJZ290byBlcnJfb3V0OworCWlmIChmY19leGNoX21ncl9saXN0X2Nsb25lKG5fcG9ydCwgdm5fcG9ydCkpCisJCWdvdG8gZXJyX3B1dDsKKworCXZuX3BvcnQtPnZwb3J0ID0gdnBvcnQ7CisJdnBvcnQtPmRkX2RhdGEgPSB2bl9wb3J0OworCisJbXV0ZXhfbG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmdm5fcG9ydC0+bGlzdCwgJm5fcG9ydC0+dnBvcnRzKTsKKwltdXRleF91bmxvY2soJm5fcG9ydC0+bHBfbXV0ZXgpOworCisJcmV0dXJuIHZuX3BvcnQ7CisKK2Vycl9wdXQ6CisJc2NzaV9ob3N0X3B1dCh2bl9wb3J0LT5ob3N0KTsKK2Vycl9vdXQ6CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGxpYmZjX3Zwb3J0X2NyZWF0ZSk7CisKKy8qKgorICogZmNfdnBvcnRfaWRfbG9va3VwKCkgLSBmaW5kIE5QSVYgbHBvcnQgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gZmFicmljIElECisgKiBAbl9wb3J0OiBUb3AgbGV2ZWwgTl9Qb3J0IHdoaWNoIG1heSBoYXZlIG11bHRpcGxlIE5QSVYgVk5fUG9ydHMKKyAqIEBwb3J0X2lkOiBGYWJyaWMgSUQgdG8gZmluZCBhIG1hdGNoIGZvcgorICoKKyAqIFJldHVybnM6IG1hdGNoaW5nIGxwb3J0IHBvaW50ZXIgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaAorICovCitzdHJ1Y3QgZmNfbHBvcnQgKmZjX3Zwb3J0X2lkX2xvb2t1cChzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCwgdTMyIHBvcnRfaWQpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IE5VTEw7CisJc3RydWN0IGZjX2xwb3J0ICp2bl9wb3J0OworCisJaWYgKGZjX2hvc3RfcG9ydF9pZChuX3BvcnQtPmhvc3QpID09IHBvcnRfaWQpCisJCXJldHVybiBuX3BvcnQ7CisKKwltdXRleF9sb2NrKCZuX3BvcnQtPmxwX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZuX3BvcnQsICZuX3BvcnQtPnZwb3J0cywgbGlzdCkgeworCQlpZiAoZmNfaG9zdF9wb3J0X2lkKHZuX3BvcnQtPmhvc3QpID09IHBvcnRfaWQpIHsKKwkJCWxwb3J0ID0gdm5fcG9ydDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisKKwlyZXR1cm4gbHBvcnQ7Cit9CisKKy8qCisgKiBXaGVuIHNldHRpbmcgdGhlIGxpbmsgc3RhdGUgb2YgdnBvcnRzIGR1cmluZyBhbiBscG9ydCBzdGF0ZSBjaGFuZ2UsIGl0J3MKKyAqIG5lY2Vzc2FyeSB0byBob2xkIHRoZSBscF9tdXRleCBvZiBib3RoIHRoZSBOX1BvcnQgYW5kIHRoZSBWTl9Qb3J0LgorICogVGhpcyB0ZWxscyB0aGUgbG9ja2RlcCBlbmdpbmUgdG8gdHJlYXQgdGhlIG5lc3RlZCBsb2NraW5nIG9mIHRoZSBWTl9Qb3J0CisgKiBhcyBhIGRpZmZlcmVudCBsb2NrIGNsYXNzLgorICovCitlbnVtIGxpYmZjX2xwb3J0X211dGV4X2NsYXNzIHsKKwlMUE9SVF9NVVRFWF9OT1JNQUwgPSAwLAorCUxQT1JUX01VVEVYX1ZOX1BPUlQgPSAxLAorfTsKKworLyoqCisgKiBfX2ZjX3Zwb3J0X3NldGxpbmsoKSAtIHVwZGF0ZSBsaW5rIGFuZCBzdGF0dXMgb24gYSBWTl9Qb3J0CisgKiBAbl9wb3J0OiBwYXJlbnQgTl9Qb3J0CisgKiBAdm5fcG9ydDogVk5fUG9ydCB0byB1cGRhdGUKKyAqCisgKiBMb2NraW5nOiBtdXN0IGJlIGNhbGxlZCB3aXRoIGJvdGggdGhlIE5fUG9ydCBhbmQgVk5fUG9ydCBscF9tdXRleCBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIF9fZmNfdnBvcnRfc2V0bGluayhzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCwKKwkJCSAgICAgICBzdHJ1Y3QgZmNfbHBvcnQgKnZuX3BvcnQpCit7CisJc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCA9IHZuX3BvcnQtPnZwb3J0OworCisJaWYgKHZuX3BvcnQtPnN0YXRlID09IExQT1JUX1NUX0RJU0FCTEVEKQorCQlyZXR1cm47CisKKwlpZiAobl9wb3J0LT5zdGF0ZSA9PSBMUE9SVF9TVF9SRUFEWSkgeworCQlpZiAobl9wb3J0LT5ucGl2X2VuYWJsZWQpIHsKKwkJCWZjX3Zwb3J0X3NldF9zdGF0ZSh2cG9ydCwgRkNfVlBPUlRfSU5JVElBTElaSU5HKTsKKwkJCV9fZmNfbGlua3VwKHZuX3BvcnQpOworCQl9IGVsc2UgeworCQkJZmNfdnBvcnRfc2V0X3N0YXRlKHZwb3J0LCBGQ19WUE9SVF9OT19GQUJSSUNfU1VQUCk7CisJCQlfX2ZjX2xpbmtkb3duKHZuX3BvcnQpOworCQl9CisJfSBlbHNlIHsKKwkJZmNfdnBvcnRfc2V0X3N0YXRlKHZwb3J0LCBGQ19WUE9SVF9MSU5LRE9XTik7CisJCV9fZmNfbGlua2Rvd24odm5fcG9ydCk7CisJfQorfQorCisvKioKKyAqIGZjX3Zwb3J0X3NldGxpbmsoKSAtIHVwZGF0ZSBsaW5rIGFuZCBzdGF0dXMgb24gYSBWTl9Qb3J0CisgKiBAdm5fcG9ydDogdmlydHVhbCBwb3J0IHRvIHVwZGF0ZQorICovCit2b2lkIGZjX3Zwb3J0X3NldGxpbmsoc3RydWN0IGZjX2xwb3J0ICp2bl9wb3J0KQoreworCXN0cnVjdCBmY192cG9ydCAqdnBvcnQgPSB2bl9wb3J0LT52cG9ydDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZwb3J0X3RvX3Nob3N0KHZwb3J0KTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOworCisJbXV0ZXhfbG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJnZuX3BvcnQtPmxwX211dGV4LCBMUE9SVF9NVVRFWF9WTl9QT1JUKTsKKwlfX2ZjX3Zwb3J0X3NldGxpbmsobl9wb3J0LCB2bl9wb3J0KTsKKwltdXRleF91bmxvY2soJnZuX3BvcnQtPmxwX211dGV4KTsKKwltdXRleF91bmxvY2soJm5fcG9ydC0+bHBfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChmY192cG9ydF9zZXRsaW5rKTsKKworLyoqCisgKiBmY192cG9ydHNfbGlua2NoYW5nZSgpIC0gY2hhbmdlIHRoZSBsaW5rIHN0YXRlIG9mIGFsbCB2cG9ydHMKKyAqIEBuX3BvcnQ6IFBhcmVudCBOX1BvcnQgdGhhdCBoYXMgY2hhbmdlZCBzdGF0ZQorICoKKyAqIExvY2tpbmc6IGNhbGxlZCB3aXRoIHRoZSBuX3BvcnQgbHBfbXV0ZXggaGVsZAorICovCit2b2lkIGZjX3Zwb3J0c19saW5rY2hhbmdlKHN0cnVjdCBmY19scG9ydCAqbl9wb3J0KQoreworCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodm5fcG9ydCwgJm5fcG9ydC0+dnBvcnRzLCBsaXN0KSB7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZ2bl9wb3J0LT5scF9tdXRleCwgTFBPUlRfTVVURVhfVk5fUE9SVCk7CisJCV9fZmNfdnBvcnRfc2V0bGluayhuX3BvcnQsIHZuX3BvcnQpOworCQltdXRleF91bmxvY2soJnZuX3BvcnQtPmxwX211dGV4KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKaW5kZXggMDNlYTY3NC4uMzVjYTBlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKQEAgLTU1LDYgKzU1LDggQEAKICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAjaW5jbHVkZSA8c2NzaS9mY19lbmNvZGUuaD4KIAorI2luY2x1ZGUgImZjX2xpYmZjLmgiCisKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpycG9ydF9ldmVudF9xdWV1ZTsKIAogc3RhdGljIHZvaWQgZmNfcnBvcnRfZW50ZXJfcGxvZ2koc3RydWN0IGZjX3Jwb3J0X3ByaXYgKik7CkBAIC04NiwxMiArODgsMTMgQEAKIAlbUlBPUlRfU1RfTE9HT10gPSAiTE9HTyIsCiAJW1JQT1JUX1NUX0FESVNDXSA9ICJBRElTQyIsCiAJW1JQT1JUX1NUX0RFTEVURV0gPSAiRGVsZXRlIiwKKwlbUlBPUlRfU1RfUkVTVEFSVF0gPSAiUmVzdGFydCIsCiB9OwogCiAvKioKLSAqIGZjX3Jwb3J0X2xvb2t1cCgpIC0gbG9va3VwIGEgcmVtb3RlIHBvcnQgYnkgcG9ydF9pZAotICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGhvc3QgcG9ydCBpbnN0YW5jZQotICogQHBvcnRfaWQ6IHJlbW90ZSBwb3J0IHBvcnRfaWQgdG8gbWF0Y2gKKyAqIGZjX3Jwb3J0X2xvb2t1cCgpIC0gTG9va3VwIGEgcmVtb3RlIHBvcnQgYnkgcG9ydF9pZAorICogQGxwb3J0OiAgIFRoZSBsb2NhbCBwb3J0IHRvIGxvb2t1cCB0aGUgcmVtb3RlIHBvcnQgb24KKyAqIEBwb3J0X2lkOiBUaGUgcmVtb3RlIHBvcnQgSUQgdG8gbG9vayB1cAogICovCiBzdGF0aWMgc3RydWN0IGZjX3Jwb3J0X3ByaXYgKmZjX3Jwb3J0X2xvb2t1cChjb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAogCQkJCQkgICAgIHUzMiBwb3J0X2lkKQpAQCAtOTksMTYgKzEwMiwxNyBAQAogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmRhdGEsICZscG9ydC0+ZGlzYy5ycG9ydHMsIHBlZXJzKQotCQlpZiAocmRhdGEtPmlkcy5wb3J0X2lkID09IHBvcnRfaWQgJiYKLQkJICAgIHJkYXRhLT5ycF9zdGF0ZSAhPSBSUE9SVF9TVF9ERUxFVEUpCisJCWlmIChyZGF0YS0+aWRzLnBvcnRfaWQgPT0gcG9ydF9pZCkKIAkJCXJldHVybiByZGF0YTsKIAlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCiAgKiBmY19ycG9ydF9jcmVhdGUoKSAtIENyZWF0ZSBhIG5ldyByZW1vdGUgcG9ydAotICogQGxwb3J0OiAgIFRoZSBsb2NhbCBwb3J0IHRoYXQgdGhlIG5ldyByZW1vdGUgcG9ydCBpcyBmb3IKLSAqIEBwb3J0X2lkOiBUaGUgcG9ydCBJRCBmb3IgdGhlIG5ldyByZW1vdGUgcG9ydAorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGlzIHJlbW90ZSBwb3J0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoCisgKiBAaWRzOiAgIFRoZSBpZGVudGlmaWVycyBmb3IgdGhlIG5ldyByZW1vdGUgcG9ydAorICoKKyAqIFRoZSByZW1vdGUgcG9ydCB3aWxsIHN0YXJ0IGluIHRoZSBJTklUIHN0YXRlLgogICoKICAqIExvY2tpbmcgbm90ZTogIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGRpc2NfbXV0ZXggaGVsZC4KICAqLwpAQCAtMTQ3LDggKzE1MSw4IEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfZGVzdHJveSgpIC0gZnJlZSBhIHJlbW90ZSBwb3J0IGFmdGVyIGxhc3QgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLgotICogQGtyZWY6IHBvaW50ZXIgdG8ga3JlZiBpbnNpZGUgc3RydWN0IGZjX3Jwb3J0X3ByaXYKKyAqIGZjX3Jwb3J0X2Rlc3Ryb3koKSAtIEZyZWUgYSByZW1vdGUgcG9ydCBhZnRlciBsYXN0IHJlZmVyZW5jZSBpcyByZWxlYXNlZAorICogQGtyZWY6IFRoZSByZW1vdGUgcG9ydCdzIGtyZWYKICAqLwogc3RhdGljIHZvaWQgZmNfcnBvcnRfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKQEAgLTE1OSw4ICsxNjMsOCBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X3N0YXRlKCkgLSByZXR1cm4gYSBzdHJpbmcgZm9yIHRoZSBzdGF0ZSB0aGUgcnBvcnQgaXMgaW4KLSAqIEByZGF0YTogcmVtb3RlIHBvcnQgcHJpdmF0ZSBkYXRhCisgKiBmY19ycG9ydF9zdGF0ZSgpIC0gUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSByZW1vdGUgcG9ydCdzIHN0YXRlCisgKiBAcmRhdGE6IFRoZSByZW1vdGUgcG9ydAogICovCiBzdGF0aWMgY29uc3QgY2hhciAqZmNfcnBvcnRfc3RhdGUoc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhKQogewpAQCAtMTczLDkgKzE3Nyw5IEBACiB9CiAKIC8qKgotICogZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKCkgLSBTZXQgdGhlIHJlbW90ZSBwb3J0IGxvc3MgdGltZW91dCBpbiBzZWNvbmRzLgotICogQHJwb3J0OiBQb2ludGVyIHRvIEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgc3RydWN0dXJlCi0gKiBAdGltZW91dDogdGltZW91dCBpbiBzZWNvbmRzCisgKiBmY19zZXRfcnBvcnRfbG9zc190bW8oKSAtIFNldCB0aGUgcmVtb3RlIHBvcnQgbG9zcyB0aW1lb3V0CisgKiBAcnBvcnQ6ICAgVGhlIHJlbW90ZSBwb3J0IHRoYXQgZ2V0cyBhIG5ldyB0aW1lb3V0IHZhbHVlCisgKiBAdGltZW91dDogVGhlIG5ldyB0aW1lb3V0IHZhbHVlIChpbiBzZWNvbmRzKQogICovCiB2b2lkIGZjX3NldF9ycG9ydF9sb3NzX3RtbyhzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0LCB1MzIgdGltZW91dCkKIHsKQEAgLTE4Nyw5ICsxOTEsMTEgQEAKIEVYUE9SVF9TWU1CT0woZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKTsKIAogLyoqCi0gKiBmY19wbG9naV9nZXRfbWF4ZnJhbWUoKSAtIEdldCBtYXggcGF5bG9hZCBmcm9tIHRoZSBjb21tb24gc2VydmljZSBwYXJhbWV0ZXJzCi0gKiBAZmxwOiBGTE9HSSBwYXlsb2FkIHN0cnVjdHVyZQotICogQG1heHZhbDogdXBwZXIgbGltaXQsIG1heSBiZSBsZXNzIHRoYW4gd2hhdCBpcyBpbiB0aGUgc2VydmljZSBwYXJhbWV0ZXJzCisgKiBmY19wbG9naV9nZXRfbWF4ZnJhbWUoKSAtIEdldCB0aGUgbWF4aW11bSBwYXlsb2FkIGZyb20gdGhlIGNvbW1vbiBzZXJ2aWNlCisgKgkJCSAgICAgcGFyYW1ldGVycyBpbiBhIEZMT0dJIGZyYW1lCisgKiBAZmxwOiAgICBUaGUgRkxPR0kgcGF5bG9hZAorICogQG1heHZhbDogVGhlIG1heGltdW0gZnJhbWUgc2l6ZSB1cHBlciBsaW1pdDsgdGhpcyBtYXkgYmUgbGVzcyB0aGFuIHdoYXQKKyAqCSAgICBpcyBpbiB0aGUgc2VydmljZSBwYXJhbWV0ZXJzCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmNfcGxvZ2lfZ2V0X21heGZyYW1lKHN0cnVjdCBmY19lbHNfZmxvZ2kgKmZscCwKIAkJCQkJICB1bnNpZ25lZCBpbnQgbWF4dmFsKQpAQCAtMjEwLDkgKzIxNiw5IEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfc3RhdGVfZW50ZXIoKSAtIENoYW5nZSB0aGUgcnBvcnQncyBzdGF0ZQotICogQHJkYXRhOiBUaGUgcnBvcnQgd2hvc2Ugc3RhdGUgc2hvdWxkIGNoYW5nZQotICogQG5ldzogVGhlIG5ldyBzdGF0ZSBvZiB0aGUgcnBvcnQKKyAqIGZjX3Jwb3J0X3N0YXRlX2VudGVyKCkgLSBDaGFuZ2UgdGhlIHN0YXRlIG9mIGEgcmVtb3RlIHBvcnQKKyAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHdob3NlIHN0YXRlIHNob3VsZCBjaGFuZ2UKKyAqIEBuZXc6ICAgVGhlIG5ldyBzdGF0ZQogICoKICAqIExvY2tpbmcgTm90ZTogQ2FsbGVkIHdpdGggdGhlIHJwb3J0IGxvY2sgaGVsZAogICovCkBAIC0yMjQsMTcgKzIzMCwyMiBAQAogCXJkYXRhLT5ycF9zdGF0ZSA9IG5ldzsKIH0KIAorLyoqCisgKiBmY19ycG9ydF93b3JrKCkgLSBIYW5kbGVyIGZvciByZW1vdGUgcG9ydCBldmVudHMgaW4gdGhlIHJwb3J0X2V2ZW50X3F1ZXVlCisgKiBAd29yazogSGFuZGxlIHRvIHRoZSByZW1vdGUgcG9ydCBiZWluZyBkZXF1ZXVlZAorICovCiBzdGF0aWMgdm9pZCBmY19ycG9ydF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1MzIgcG9ydF9pZDsKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZjX3Jwb3J0X3ByaXYsIGV2ZW50X3dvcmspOwotCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnByaXY7CiAJZW51bSBmY19ycG9ydF9ldmVudCBldmVudDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CiAJc3RydWN0IGZjX3Jwb3J0X29wZXJhdGlvbnMgKnJwb3J0X29wczsKIAlzdHJ1Y3QgZmNfcnBvcnRfaWRlbnRpZmllcnMgaWRzOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJaW50IHJlc3RhcnQgPSAwOwogCiAJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKIAlldmVudCA9IHJkYXRhLT5ldmVudDsKQEAgLTI2NSwxMiArMjc2LDEyIEBACiAJCXJwb3J0LT5tYXhmcmFtZV9zaXplID0gcmRhdGEtPm1heGZyYW1lX3NpemU7CiAJCXJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IHJkYXRhLT5zdXBwb3J0ZWRfY2xhc3NlczsKIAotCQlycCA9IHJwb3J0LT5kZF9kYXRhOwotCQlycC0+bG9jYWxfcG9ydCA9IGxwb3J0OwotCQlycC0+cnBfc3RhdGUgPSByZGF0YS0+cnBfc3RhdGU7Ci0JCXJwLT5mbGFncyA9IHJkYXRhLT5mbGFnczsKLQkJcnAtPmVfZF90b3YgPSByZGF0YS0+ZV9kX3RvdjsKLQkJcnAtPnJfYV90b3YgPSByZGF0YS0+cl9hX3RvdjsKKwkJcnByaXYgPSBycG9ydC0+ZGRfZGF0YTsKKwkJcnByaXYtPmxvY2FsX3BvcnQgPSBscG9ydDsKKwkJcnByaXYtPnJwX3N0YXRlID0gcmRhdGEtPnJwX3N0YXRlOworCQlycHJpdi0+ZmxhZ3MgPSByZGF0YS0+ZmxhZ3M7CisJCXJwcml2LT5lX2RfdG92ID0gcmRhdGEtPmVfZF90b3Y7CisJCXJwcml2LT5yX2FfdG92ID0gcmRhdGEtPnJfYV90b3Y7CiAJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKIAogCQlpZiAocnBvcnRfb3BzICYmIHJwb3J0X29wcy0+ZXZlbnRfY2FsbGJhY2spIHsKQEAgLTI4Nyw4ICsyOTgsMTkgQEAKIAkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCiAJCWlmIChwb3J0X2lkICE9IEZDX0ZJRF9ESVJfU0VSVikgeworCQkJLyoKKwkJCSAqIFdlIG11c3QgZHJvcCBycF9tdXRleCBiZWZvcmUgdGFraW5nIGRpc2NfbXV0ZXguCisJCQkgKiBSZS1ldmFsdWF0ZSBzdGF0ZSB0byBhbGxvdyBmb3IgcmVzdGFydC4KKwkJCSAqIEEgdHJhbnNpdGlvbiB0byBSRVNUQVJUIHN0YXRlIG11c3Qgb25seSBoYXBwZW4KKwkJCSAqIHdoaWxlIGRpc2NfbXV0ZXggaXMgaGVsZCBhbmQgcmRhdGEgaXMgb24gdGhlIGxpc3QuCisJCQkgKi8KIAkJCW11dGV4X2xvY2soJmxwb3J0LT5kaXNjLmRpc2NfbXV0ZXgpOwotCQkJbGlzdF9kZWwoJnJkYXRhLT5wZWVycyk7CisJCQltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCQkJaWYgKHJkYXRhLT5ycF9zdGF0ZSA9PSBSUE9SVF9TVF9SRVNUQVJUKQorCQkJCXJlc3RhcnQgPSAxOworCQkJZWxzZQorCQkJCWxpc3RfZGVsKCZyZGF0YS0+cGVlcnMpOworCQkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCQkJbXV0ZXhfdW5sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKIAkJfQogCkBAIC0zMDUsMTQgKzMyNywyMCBAQAogCQlscG9ydC0+dHQuZXhjaF9tZ3JfcmVzZXQobHBvcnQsIHBvcnRfaWQsIDApOwogCiAJCWlmIChycG9ydCkgewotCQkJcnAgPSBycG9ydC0+ZGRfZGF0YTsKLQkJCXJwLT5ycF9zdGF0ZSA9IFJQT1JUX1NUX0RFTEVURTsKKwkJCXJwcml2ID0gcnBvcnQtPmRkX2RhdGE7CisJCQlycHJpdi0+cnBfc3RhdGUgPSBSUE9SVF9TVF9ERUxFVEU7CiAJCQltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCQkJcmRhdGEtPnJwb3J0ID0gTlVMTDsKIAkJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKIAkJCWZjX3JlbW90ZV9wb3J0X2RlbGV0ZShycG9ydCk7CiAJCX0KLQkJa3JlZl9wdXQoJnJkYXRhLT5rcmVmLCBscG9ydC0+dHQucnBvcnRfZGVzdHJveSk7CisJCWlmIChyZXN0YXJ0KSB7CisJCQltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCQkJRkNfUlBPUlRfREJHKHJkYXRhLCAid29yayByZXN0YXJ0XG4iKTsKKwkJCWZjX3Jwb3J0X2VudGVyX3Bsb2dpKHJkYXRhKTsKKwkJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKKwkJfSBlbHNlCisJCQlrcmVmX3B1dCgmcmRhdGEtPmtyZWYsIGxwb3J0LT50dC5ycG9ydF9kZXN0cm95KTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzIzLDcgKzM1MSw3IEBACiAKIC8qKgogICogZmNfcnBvcnRfbG9naW4oKSAtIFN0YXJ0IHRoZSByZW1vdGUgcG9ydCBsb2dpbiBzdGF0ZSBtYWNoaW5lCi0gKiBAcmRhdGE6IHByaXZhdGUgcmVtb3RlIHBvcnQKKyAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRvIGJlIGxvZ2dlZCBpbiB0bwogICoKICAqIExvY2tpbmcgTm90ZTogQ2FsbGVkIHdpdGhvdXQgdGhlIHJwb3J0IGxvY2sgaGVsZC4gVGhpcwogICogZnVuY3Rpb24gd2lsbCBob2xkIHRoZSBycG9ydCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qCkBAIC0zNDIsNiArMzcwLDEyIEBACiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIkFESVNDIHBvcnRcbiIpOwogCQlmY19ycG9ydF9lbnRlcl9hZGlzYyhyZGF0YSk7CiAJCWJyZWFrOworCWNhc2UgUlBPUlRfU1RfUkVTVEFSVDoKKwkJYnJlYWs7CisJY2FzZSBSUE9SVF9TVF9ERUxFVEU6CisJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlc3RhcnQgZGVsZXRlZCBwb3J0XG4iKTsKKwkJZmNfcnBvcnRfc3RhdGVfZW50ZXIocmRhdGEsIFJQT1JUX1NUX1JFU1RBUlQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlGQ19SUE9SVF9EQkcocmRhdGEsICJMb2dpbiB0byBwb3J0XG4iKTsKIAkJZmNfcnBvcnRfZW50ZXJfcGxvZ2kocmRhdGEpOwpAQCAtMzUzLDkgKzM4Nyw5IEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfZW50ZXJfZGVsZXRlKCkgLSBzY2hlZHVsZSBhIHJlbW90ZSBwb3J0IHRvIGJlIGRlbGV0ZWQuCi0gKiBAcmRhdGE6IHByaXZhdGUgcmVtb3RlIHBvcnQKLSAqIEBldmVudDogZXZlbnQgdG8gcmVwb3J0IGFzIHRoZSByZWFzb24gZm9yIGRlbGV0aW9uCisgKiBmY19ycG9ydF9lbnRlcl9kZWxldGUoKSAtIFNjaGVkdWxlIGEgcmVtb3RlIHBvcnQgdG8gYmUgZGVsZXRlZAorICogQHJkYXRhOiBUaGUgcmVtb3RlIHBvcnQgdG8gYmUgZGVsZXRlZAorICogQGV2ZW50OiBUaGUgZXZlbnQgdG8gcmVwb3J0IGFzIHRoZSByZWFzb24gZm9yIGRlbGV0aW9uCiAgKgogICogTG9ja2luZyBOb3RlOiBDYWxsZWQgd2l0aCB0aGUgcnBvcnQgbG9jayBoZWxkLgogICoKQEAgLTM4Miw4ICs0MTYsOCBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X2xvZ29mZigpIC0gTG9nb2ZmIGFuZCByZW1vdmUgYW4gcnBvcnQKLSAqIEByZGF0YTogcHJpdmF0ZSByZW1vdGUgcG9ydAorICogZmNfcnBvcnRfbG9nb2ZmKCkgLSBMb2dvZmYgYW5kIHJlbW92ZSBhIHJlbW90ZSBwb3J0CisgKiBAcmRhdGE6IFRoZSByZW1vdGUgcG9ydCB0byBiZSBsb2dnZWQgb2ZmIG9mCiAgKgogICogTG9ja2luZyBOb3RlOiBDYWxsZWQgd2l0aG91dCB0aGUgcnBvcnQgbG9jayBoZWxkLiBUaGlzCiAgKiBmdW5jdGlvbiB3aWxsIGhvbGQgdGhlIHJwb3J0IGxvY2ssIGNhbGwgYW4gX2VudGVyXyoKQEAgLTM5NywyNiArNDMxLDI3IEBACiAKIAlpZiAocmRhdGEtPnJwX3N0YXRlID09IFJQT1JUX1NUX0RFTEVURSkgewogCQlGQ19SUE9SVF9EQkcocmRhdGEsICJQb3J0IGluIERlbGV0ZSBzdGF0ZSwgbm90IHJlbW92aW5nXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlmY19ycG9ydF9lbnRlcl9sb2dvKHJkYXRhKTsKKwlpZiAocmRhdGEtPnJwX3N0YXRlID09IFJQT1JUX1NUX1JFU1RBUlQpCisJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlBvcnQgaW4gUmVzdGFydCBzdGF0ZSwgZGVsZXRpbmdcbiIpOworCWVsc2UKKwkJZmNfcnBvcnRfZW50ZXJfbG9nbyhyZGF0YSk7CiAKIAkvKgogCSAqIENoYW5nZSB0aGUgc3RhdGUgdG8gRGVsZXRlIHNvIHRoYXQgd2UgZGlzY2FyZAogCSAqIHRoZSByZXNwb25zZS4KIAkgKi8KIAlmY19ycG9ydF9lbnRlcl9kZWxldGUocmRhdGEsIFJQT1JUX0VWX1NUT1ApOwotCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKLQogb3V0OgorCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBmY19ycG9ydF9lbnRlcl9yZWFkeSgpIC0gVGhlIHJwb3J0IGlzIHJlYWR5Ci0gKiBAcmRhdGE6IHByaXZhdGUgcmVtb3RlIHBvcnQKKyAqIGZjX3Jwb3J0X2VudGVyX3JlYWR5KCkgLSBUcmFuc2l0aW9uIHRvIHRoZSBSUE9SVF9TVF9SRUFEWSBzdGF0ZQorICogQHJkYXRhOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBpcyByZWFkeQogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtNDMzLDggKzQ2OCw4IEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfdGltZW91dCgpIC0gSGFuZGxlciBmb3IgdGhlIHJldHJ5X3dvcmsgdGltZXIuCi0gKiBAd29yazogVGhlIHdvcmsgc3RydWN0IG9mIHRoZSBmY19ycG9ydF9wcml2CisgKiBmY19ycG9ydF90aW1lb3V0KCkgLSBIYW5kbGVyIGZvciB0aGUgcmV0cnlfd29yayB0aW1lcgorICogQHdvcms6IEhhbmRsZSB0byB0aGUgcmVtb3RlIHBvcnQgdGhhdCBoYXMgdGltZWQgb3V0CiAgKgogICogTG9ja2luZyBOb3RlOiBDYWxsZWQgd2l0aG91dCB0aGUgcnBvcnQgbG9jayBoZWxkLiBUaGlzCiAgKiBmdW5jdGlvbiB3aWxsIGhvbGQgdGhlIHJwb3J0IGxvY2ssIGNhbGwgYW4gX2VudGVyXyoKQEAgLTQ2Niw2ICs1MDEsNyBAQAogCWNhc2UgUlBPUlRfU1RfUkVBRFk6CiAJY2FzZSBSUE9SVF9TVF9JTklUOgogCWNhc2UgUlBPUlRfU1RfREVMRVRFOgorCWNhc2UgUlBPUlRfU1RfUkVTVEFSVDoKIAkJYnJlYWs7CiAJfQogCkBAIC00NzQsOCArNTEwLDggQEAKIAogLyoqCiAgKiBmY19ycG9ydF9lcnJvcigpIC0gRXJyb3IgaGFuZGxlciwgY2FsbGVkIG9uY2UgcmV0cmllcyBoYXZlIGJlZW4gZXhoYXVzdGVkCi0gKiBAcmRhdGE6IHByaXZhdGUgcmVtb3RlIHBvcnQKLSAqIEBmcDogVGhlIGZyYW1lIHBvaW50ZXIKKyAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRoZSBlcnJvciBpcyBoYXBwZW5lZCBvbgorICogQGZwOgkgICBUaGUgZXJyb3IgY29kZSBlbmNhcHN1bGF0ZWQgaW4gYSBmcmFtZSBwb2ludGVyCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZQogICogY2FsbGluZyB0aGlzIHJvdXRpbmUKQEAgLTQ5OSw2ICs1MzUsNyBAQAogCQlmY19ycG9ydF9lbnRlcl9sb2dvKHJkYXRhKTsKIAkJYnJlYWs7CiAJY2FzZSBSUE9SVF9TVF9ERUxFVEU6CisJY2FzZSBSUE9SVF9TVF9SRVNUQVJUOgogCWNhc2UgUlBPUlRfU1RfUkVBRFk6CiAJY2FzZSBSUE9SVF9TVF9JTklUOgogCQlicmVhazsKQEAgLTUwNiw5ICs1NDMsOSBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X2Vycm9yX3JldHJ5KCkgLSBFcnJvciBoYW5kbGVyIHdoZW4gcmV0cmllcyBhcmUgZGVzaXJlZAotICogQHJkYXRhOiBwcml2YXRlIHJlbW90ZSBwb3J0IGRhdGEKLSAqIEBmcDogVGhlIGZyYW1lIHBvaW50ZXIKKyAqIGZjX3Jwb3J0X2Vycm9yX3JldHJ5KCkgLSBIYW5kbGVyIGZvciByZW1vdGUgcG9ydCBzdGF0ZSByZXRyaWVzCisgKiBAcmRhdGE6IFRoZSByZW1vdGUgcG9ydCB3aG9zZSBzdGF0ZSBpcyB0byBiZSByZXRyaWVkCisgKiBAZnA6CSAgIFRoZSBlcnJvciBjb2RlIGVuY2Fwc3VsYXRlZCBpbiBhIGZyYW1lIHBvaW50ZXIKICAqCiAgKiBJZiB0aGUgZXJyb3Igd2FzIGFuIGV4Y2hhbmdlIHRpbWVvdXQgcmV0cnkgaW1tZWRpYXRlbHksCiAgKiBvdGhlcndpc2Ugd2FpdCBmb3IgRV9EX1RPVi4KQEAgLTU0MCwxMCArNTc3LDEwIEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfcGxvZ2lfcmVjdl9yZXNwKCkgLSBIYW5kbGUgaW5jb21pbmcgRUxTIFBMT0dJIHJlc3BvbnNlCi0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIFBMT0dJIGV4Y2hhbmdlCi0gKiBAZnA6IHJlc3BvbnNlIGZyYW1lCi0gKiBAcmRhdGFfYXJnOiBwcml2YXRlIHJlbW90ZSBwb3J0IGRhdGEKKyAqIGZjX3Jwb3J0X3Bsb2dpX3JlY3ZfcmVzcCgpIC0gSGFuZGxlciBmb3IgRUxTIFBMT0dJIHJlc3BvbnNlcworICogQHNwOgkgICAgICAgVGhlIHNlcXVlbmNlIHRoZSBQTE9HSSBpcyBvbgorICogQGZwOgkgICAgICAgVGhlIFBMT0dJIHJlc3BvbnNlIGZyYW1lCisgKiBAcmRhdGFfYXJnOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBQTE9HSSByZXNwb25zZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBycG9ydCBsb2NrCiAgKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX3Jwb3J0X2Vycm9yCkBAIC02MDYsOCArNjQzLDggQEAKIH0KIAogLyoqCi0gKiBmY19ycG9ydF9lbnRlcl9wbG9naSgpIC0gU2VuZCBQb3J0IExvZ2luIChQTE9HSSkgcmVxdWVzdCB0byBwZWVyCi0gKiBAcmRhdGE6IHByaXZhdGUgcmVtb3RlIHBvcnQgZGF0YQorICogZmNfcnBvcnRfZW50ZXJfcGxvZ2koKSAtIFNlbmQgUG9ydCBMb2dpbiAoUExPR0kpIHJlcXVlc3QKKyAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRvIHNlbmQgYSBQTE9HSSB0bwogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtNjMxLDE3ICs2NjgsMTggQEAKIAlyZGF0YS0+ZV9kX3RvdiA9IGxwb3J0LT5lX2RfdG92OwogCiAJaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgcmRhdGEtPmlkcy5wb3J0X2lkLCBmcCwgRUxTX1BMT0dJLAotCQkJCSAgZmNfcnBvcnRfcGxvZ2lfcmVzcCwgcmRhdGEsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKKwkJCQkgIGZjX3Jwb3J0X3Bsb2dpX3Jlc3AsIHJkYXRhLAorCQkJCSAgMiAqIGxwb3J0LT5yX2FfdG92KSkKKwkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIE5VTEwpOwogCWVsc2UKIAkJa3JlZl9nZXQoJnJkYXRhLT5rcmVmKTsKIH0KIAogLyoqCiAgKiBmY19ycG9ydF9wcmxpX3Jlc3AoKSAtIFByb2Nlc3MgTG9naW4gKFBSTEkpIHJlc3BvbnNlIGhhbmRsZXIKLSAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgUFJMSSBleGNoYW5nZQotICogQGZwOiByZXNwb25zZSBmcmFtZQotICogQHJkYXRhX2FyZzogcHJpdmF0ZSByZW1vdGUgcG9ydCBkYXRhCisgKiBAc3A6CSAgICAgICBUaGUgc2VxdWVuY2UgdGhlIFBSTEkgcmVzcG9uc2Ugd2FzIG9uCisgKiBAZnA6CSAgICAgICBUaGUgUFJMSSByZXNwb25zZSBmcmFtZQorICogQHJkYXRhX2FyZzogVGhlIHJlbW90ZSBwb3J0IHRoYXQgc2VudCB0aGUgUFJMSSByZXNwb25zZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBycG9ydCBsb2NrCiAgKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX3Jwb3J0X2Vycm9yCkBAIC03MTAsMTAgKzc0OCwxMCBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X2xvZ29fcmVzcCgpIC0gTG9nb3V0IChMT0dPKSByZXNwb25zZSBoYW5kbGVyCi0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIExPR08gZXhjaGFuZ2UKLSAqIEBmcDogcmVzcG9uc2UgZnJhbWUKLSAqIEByZGF0YV9hcmc6IHByaXZhdGUgcmVtb3RlIHBvcnQgZGF0YQorICogZmNfcnBvcnRfbG9nb19yZXNwKCkgLSBIYW5kbGVyIGZvciBsb2dvdXQgKExPR08pIHJlc3BvbnNlcworICogQHNwOgkgICAgICAgVGhlIHNlcXVlbmNlIHRoZSBMT0dPIHdhcyBvbgorICogQGZwOgkgICAgICAgVGhlIExPR08gcmVzcG9uc2UgZnJhbWUKKyAqIEByZGF0YV9hcmc6IFRoZSByZW1vdGUgcG9ydCB0aGF0IHNlbnQgdGhlIExPR08gcmVzcG9uc2UKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgcnBvcnQgbG9jawogICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19ycG9ydF9lcnJvcgpAQCAtNzU2LDggKzc5NCw4IEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfZW50ZXJfcHJsaSgpIC0gU2VuZCBQcm9jZXNzIExvZ2luIChQUkxJKSByZXF1ZXN0IHRvIHBlZXIKLSAqIEByZGF0YTogcHJpdmF0ZSByZW1vdGUgcG9ydCBkYXRhCisgKiBmY19ycG9ydF9lbnRlcl9wcmxpKCkgLSBTZW5kIFByb2Nlc3MgTG9naW4gKFBSTEkpIHJlcXVlc3QKKyAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRvIHNlbmQgdGhlIFBSTEkgcmVxdWVzdCB0bwogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtNzkyLDE3ICs4MzAsMTggQEAKIAl9CiAKIAlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCByZGF0YS0+aWRzLnBvcnRfaWQsIGZwLCBFTFNfUFJMSSwKLQkJCQkgIGZjX3Jwb3J0X3BybGlfcmVzcCwgcmRhdGEsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKKwkJCQkgIGZjX3Jwb3J0X3BybGlfcmVzcCwgcmRhdGEsCisJCQkJICAyICogbHBvcnQtPnJfYV90b3YpKQorCQlmY19ycG9ydF9lcnJvcl9yZXRyeShyZGF0YSwgTlVMTCk7CiAJZWxzZQogCQlrcmVmX2dldCgmcmRhdGEtPmtyZWYpOwogfQogCiAvKioKLSAqIGZjX3Jwb3J0X2Vsc19ydHZfcmVzcCgpIC0gUmVxdWVzdCBUaW1lb3V0IFZhbHVlIHJlc3BvbnNlIGhhbmRsZXIKLSAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgUlRWIGV4Y2hhbmdlCi0gKiBAZnA6IHJlc3BvbnNlIGZyYW1lCi0gKiBAcmRhdGFfYXJnOiBwcml2YXRlIHJlbW90ZSBwb3J0IGRhdGEKKyAqIGZjX3Jwb3J0X2Vsc19ydHZfcmVzcCgpIC0gSGFuZGxlciBmb3IgUmVxdWVzdCBUaW1lb3V0IFZhbHVlIChSVFYpIHJlc3BvbnNlcworICogQHNwOgkgICAgICAgVGhlIHNlcXVlbmNlIHRoZSBSVFYgd2FzIG9uCisgKiBAZnA6CSAgICAgICBUaGUgUlRWIHJlc3BvbnNlIGZyYW1lCisgKiBAcmRhdGFfYXJnOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBSVFYgcmVzcG9uc2UKICAqCiAgKiBNYW55IHRhcmdldHMgZG9uJ3Qgc2VlbSB0byBzdXBwb3J0IHRoaXMuCiAgKgpAQCAtODY1LDggKzkwNCw4IEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfZW50ZXJfcnR2KCkgLSBTZW5kIFJlcXVlc3QgVGltZW91dCBWYWx1ZSAoUlRWKSByZXF1ZXN0IHRvIHBlZXIKLSAqIEByZGF0YTogcHJpdmF0ZSByZW1vdGUgcG9ydCBkYXRhCisgKiBmY19ycG9ydF9lbnRlcl9ydHYoKSAtIFNlbmQgUmVxdWVzdCBUaW1lb3V0IFZhbHVlIChSVFYpIHJlcXVlc3QKKyAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRvIHNlbmQgdGhlIFJUViByZXF1ZXN0IHRvCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCiAgKiB0aGlzIHJvdXRpbmUuCkBAIC04ODgsMTUgKzkyNywxNiBAQAogCX0KIAogCWlmICghbHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIHJkYXRhLT5pZHMucG9ydF9pZCwgZnAsIEVMU19SVFYsCi0JCQkJICAgICBmY19ycG9ydF9ydHZfcmVzcCwgcmRhdGEsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKKwkJCQkgIGZjX3Jwb3J0X3J0dl9yZXNwLCByZGF0YSwKKwkJCQkgIDIgKiBscG9ydC0+cl9hX3RvdikpCisJCWZjX3Jwb3J0X2Vycm9yX3JldHJ5KHJkYXRhLCBOVUxMKTsKIAllbHNlCiAJCWtyZWZfZ2V0KCZyZGF0YS0+a3JlZik7CiB9CiAKIC8qKgotICogZmNfcnBvcnRfZW50ZXJfbG9nbygpIC0gU2VuZCBMb2dvdXQgKExPR08pIHJlcXVlc3QgdG8gcGVlcgotICogQHJkYXRhOiBwcml2YXRlIHJlbW90ZSBwb3J0IGRhdGEKKyAqIGZjX3Jwb3J0X2VudGVyX2xvZ28oKSAtIFNlbmQgYSBsb2dvdXQgKExPR08pIHJlcXVlc3QKKyAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRvIHNlbmQgdGhlIExPR08gcmVxdWVzdCB0bwogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyByb3V0aW5lLgpAQCAtOTE4LDI0ICs5NTgsMjUgQEAKIAl9CiAKIAlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCByZGF0YS0+aWRzLnBvcnRfaWQsIGZwLCBFTFNfTE9HTywKLQkJCQkgIGZjX3Jwb3J0X2xvZ29fcmVzcCwgcmRhdGEsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKKwkJCQkgIGZjX3Jwb3J0X2xvZ29fcmVzcCwgcmRhdGEsCisJCQkJICAyICogbHBvcnQtPnJfYV90b3YpKQorCQlmY19ycG9ydF9lcnJvcl9yZXRyeShyZGF0YSwgTlVMTCk7CiAJZWxzZQogCQlrcmVmX2dldCgmcmRhdGEtPmtyZWYpOwogfQogCiAvKioKLSAqIGZjX3Jwb3J0X2Vsc19hZGlzY19yZXNwKCkgLSBBZGRyZXNzIERpc2NvdmVyeSByZXNwb25zZSBoYW5kbGVyCi0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIEFESVNDIGV4Y2hhbmdlCi0gKiBAZnA6IHJlc3BvbnNlIGZyYW1lCi0gKiBAcmRhdGFfYXJnOiByZW1vdGUgcG9ydCBwcml2YXRlLgorICogZmNfcnBvcnRfZWxzX2FkaXNjX3Jlc3AoKSAtIEhhbmRsZXIgZm9yIEFkZHJlc3MgRGlzY292ZXJ5IChBRElTQykgcmVzcG9uc2VzCisgKiBAc3A6CSAgICAgICBUaGUgc2VxdWVuY2UgdGhlIEFESVNDIHJlc3BvbnNlIHdhcyBvbgorICogQGZwOgkgICAgICAgVGhlIEFESVNDIHJlc3BvbnNlIGZyYW1lCisgKiBAcmRhdGFfYXJnOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBBRElTQyByZXNwb25zZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBycG9ydCBsb2NrCiAgKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX3Jwb3J0X2Vycm9yCiAgKiBhbmQgdGhlbiB1bmxvY2sgdGhlIHJwb3J0LgogICovCiBzdGF0aWMgdm9pZCBmY19ycG9ydF9hZGlzY19yZXNwKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAotCQkJICAgICAgdm9pZCAqcmRhdGFfYXJnKQorCQkJCXZvaWQgKnJkYXRhX2FyZykKIHsKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEgPSByZGF0YV9hcmc7CiAJc3RydWN0IGZjX2Vsc19hZGlzYyAqYWRpc2M7CkBAIC05ODMsOCArMTAyNCw4IEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfZW50ZXJfYWRpc2MoKSAtIFNlbmQgQWRkcmVzcyBEaXNjb3ZlciAoQURJU0MpIHJlcXVlc3QgdG8gcGVlcgotICogQHJkYXRhOiByZW1vdGUgcG9ydCBwcml2YXRlIGRhdGEKKyAqIGZjX3Jwb3J0X2VudGVyX2FkaXNjKCkgLSBTZW5kIEFkZHJlc3MgRGlzY292ZXIgKEFESVNDKSByZXF1ZXN0CisgKiBAcmRhdGE6IFRoZSByZW1vdGUgcG9ydCB0byBzZW5kIHRoZSBBRElTQyByZXF1ZXN0IHRvCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCiAgKiB0aGlzIHJvdXRpbmUuCkBAIC0xMDA1LDE3ICsxMDQ2LDE4IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgcmRhdGEtPmlkcy5wb3J0X2lkLCBmcCwgRUxTX0FESVNDLAotCQkJCSAgZmNfcnBvcnRfYWRpc2NfcmVzcCwgcmRhdGEsIGxwb3J0LT5lX2RfdG92KSkKLQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKKwkJCQkgIGZjX3Jwb3J0X2FkaXNjX3Jlc3AsIHJkYXRhLAorCQkJCSAgMiAqIGxwb3J0LT5yX2FfdG92KSkKKwkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIE5VTEwpOwogCWVsc2UKIAkJa3JlZl9nZXQoJnJkYXRhLT5rcmVmKTsKIH0KIAogLyoqCi0gKiBmY19ycG9ydF9yZWN2X2FkaXNjX3JlcSgpIC0gSGFuZGxlIGluY29taW5nIEFkZHJlc3MgRGlzY292ZXJ5IChBRElTQykgUmVxdWVzdAotICogQHJkYXRhOiByZW1vdGUgcG9ydCBwcml2YXRlCi0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIEFESVNDIGV4Y2hhbmdlCi0gKiBAaW5fZnA6IEFESVNDIHJlcXVlc3QgZnJhbWUKKyAqIGZjX3Jwb3J0X3JlY3ZfYWRpc2NfcmVxKCkgLSBIYW5kbGVyIGZvciBBZGRyZXNzIERpc2NvdmVyeSAoQURJU0MpIHJlcXVlc3RzCisgKiBAcmRhdGE6IFRoZSByZW1vdGUgcG9ydCB0aGF0IHNlbnQgdGhlIEFESVNDIHJlcXVlc3QKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIHRoZSBBRElTQyByZXF1ZXN0IHdhcyBvbgorICogQGluX2ZwOiBUaGUgQURJU0MgcmVxdWVzdCBmcmFtZQogICoKICAqIExvY2tpbmcgTm90ZTogIENhbGxlZCB3aXRoIHRoZSBscG9ydCBhbmQgcnBvcnQgbG9ja3MgaGVsZC4KICAqLwpAQCAtMTA1NiwxMCArMTA5OCw4MiBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X3JlY3ZfZWxzX3JlcSgpIC0gaGFuZGxlIGEgdmFsaWRhdGVkIEVMUyByZXF1ZXN0LgotICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGxvY2FsIHBvcnQKLSAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgUExPR0kgZXhjaGFuZ2UKLSAqIEBmcDogcmVzcG9uc2UgZnJhbWUKKyAqIGZjX3Jwb3J0X3JlY3ZfcmxzX3JlcSgpIC0gSGFuZGxlIHJlY2VpdmVkIFJlYWQgTGluayBTdGF0dXMgcmVxdWVzdAorICogQHJkYXRhOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBSTFMgcmVxdWVzdAorICogQHNwOglUaGUgc2VxdWVuY2UgdGhhdCB0aGUgUkxTIHdhcyBvbgorICogQHJ4X2ZwOiBUaGUgUFJMSSByZXF1ZXN0IGZyYW1lCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X3Jsc19yZXEoc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhLAorCQkJCSAgc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqcnhfZnApCisKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7CisJc3RydWN0IGZjX2Vsc19ybHMgKnJsczsKKwlzdHJ1Y3QgZmNfZWxzX3Jsc19yZXNwICpyc3A7CisJc3RydWN0IGZjX2Vsc19sZXNiICpsZXNiOworCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgcmp0X2RhdGE7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqaHN0OworCXUzMiBmX2N0bDsKKworCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIFJMUyByZXF1ZXN0IHdoaWxlIGluIHN0YXRlICVzXG4iLAorCQkgICAgIGZjX3Jwb3J0X3N0YXRlKHJkYXRhKSk7CisKKwlybHMgPSBmY19mcmFtZV9wYXlsb2FkX2dldChyeF9mcCwgc2l6ZW9mKCpybHMpKTsKKwlpZiAoIXJscykgeworCQlyanRfZGF0YS5yZWFzb24gPSBFTFNfUkpUX1BST1Q7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX0lOVl9MRU47CisJCWdvdG8gb3V0X3JqdDsKKwl9CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2YoKnJzcCkpOworCWlmICghZnApIHsKKwkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9VTkFCOworCQlyanRfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9JTlNVRl9SRVM7CisJCWdvdG8gb3V0X3JqdDsKKwl9CisKKwlyc3AgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpyc3ApKTsKKwltZW1zZXQocnNwLCAwLCBzaXplb2YoKnJzcCkpOworCXJzcC0+cmxzX2NtZCA9IEVMU19MU19BQ0M7CisJbGVzYiA9ICZyc3AtPnJsc19sZXNiOworCWlmIChscG9ydC0+dHQuZ2V0X2xlc2IpIHsKKwkJLyogZ2V0IExFU0IgZnJvbSBMTEQgaWYgaXQgc3VwcG9ydHMgaXQgKi8KKwkJbHBvcnQtPnR0LmdldF9sZXNiKGxwb3J0LCBsZXNiKTsKKwl9IGVsc2UgeworCQlmY19nZXRfaG9zdF9zdGF0cyhscG9ydC0+aG9zdCk7CisJCWhzdCA9ICZscG9ydC0+aG9zdF9zdGF0czsKKwkJbGVzYi0+bGVzYl9saW5rX2ZhaWwgPSBodG9ubChoc3QtPmxpbmtfZmFpbHVyZV9jb3VudCk7CisJCWxlc2ItPmxlc2Jfc3luY19sb3NzID0gaHRvbmwoaHN0LT5sb3NzX29mX3N5bmNfY291bnQpOworCQlsZXNiLT5sZXNiX3NpZ19sb3NzID0gaHRvbmwoaHN0LT5sb3NzX29mX3NpZ25hbF9jb3VudCk7CisJCWxlc2ItPmxlc2JfcHJpbV9lcnIgPSBodG9ubChoc3QtPnByaW1fc2VxX3Byb3RvY29sX2Vycl9jb3VudCk7CisJCWxlc2ItPmxlc2JfaW52X3dvcmQgPSBodG9ubChoc3QtPmludmFsaWRfdHhfd29yZF9jb3VudCk7CisJCWxlc2ItPmxlc2JfaW52X2NyYyA9IGh0b25sKGhzdC0+aW52YWxpZF9jcmNfY291bnQpOworCX0KKworCXNwID0gbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0KHNwKTsKKwlmX2N0bCA9IEZDX0ZDX0VYX0NUWCB8IEZDX0ZDX0xBU1RfU0VRIHwgRkNfRkNfRU5EX1NFUTsKKwlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCBlcC0+ZGlkLCBlcC0+c2lkLAorCQkgICAgICAgRkNfVFlQRV9FTFMsIGZfY3RsLCAwKTsKKwlscG9ydC0+dHQuc2VxX3NlbmQobHBvcnQsIHNwLCBmcCk7CisJZ290byBvdXQ7CisKK291dF9yanQ6CisJcmp0X2RhdGEuZnAgPSBOVUxMOworCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworb3V0OgorCWZjX2ZyYW1lX2ZyZWUocnhfZnApOworfQorCisvKioKKyAqIGZjX3Jwb3J0X3JlY3ZfZWxzX3JlcSgpIC0gSGFuZGxlciBmb3IgdmFsaWRhdGVkIEVMUyByZXF1ZXN0cworICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHJlY2VpdmVkIHRoZSBFTFMgcmVxdWVzdAorICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhhdCB0aGUgRUxTIHJlcXVlc3Qgd2FzIG9uCisgKiBAZnA6CSAgIFRoZSBFTFMgcmVxdWVzdCBmcmFtZQogICoKICAqIEhhbmRsZSBpbmNvbWluZyBFTFMgcmVxdWVzdHMgdGhhdCByZXF1aXJlIHBvcnQgbG9naW4uCiAgKiBUaGUgRUxTIG9wY29kZSBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSB0aGUgY2FsbGVyLgpAQCAtMTExNyw2ICsxMjMxLDkgQEAKIAkJZWxzX2RhdGEuZnAgPSBmcDsKIAkJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19SRUMsICZlbHNfZGF0YSk7CiAJCWJyZWFrOworCWNhc2UgRUxTX1JMUzoKKwkJZmNfcnBvcnRfcmVjdl9ybHNfcmVxKHJkYXRhLCBzcCwgZnApOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlmY19mcmFtZV9mcmVlKGZwKTsJLyogY2FuJ3QgaGFwcGVuICovCiAJCWJyZWFrOwpAQCAtMTEzMSwxMCArMTI0OCwxMCBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X3JlY3ZfcmVxKCkgLSBIYW5kbGUgYSByZWNlaXZlZCBFTFMgcmVxdWVzdCBmcm9tIGEgcnBvcnQKLSAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgUExPR0kgZXhjaGFuZ2UKLSAqIEBmcDogcmVzcG9uc2UgZnJhbWUKLSAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0CisgKiBmY19ycG9ydF9yZWN2X3JlcSgpIC0gSGFuZGxlciBmb3IgcmVxdWVzdHMKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIHRoZSByZXF1ZXN0IHdhcyBvbgorICogQGZwOgkgICBUaGUgcmVxdWVzdCBmcmFtZQorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHJlY2VpdmVkIHRoZSByZXF1ZXN0CiAgKgogICogTG9ja2luZyBOb3RlOiBDYWxsZWQgd2l0aCB0aGUgbHBvcnQgbG9jayBoZWxkLgogICovCkBAIC0xMTYxLDYgKzEyNzgsNyBAQAogCWNhc2UgRUxTX0FESVNDOgogCWNhc2UgRUxTX1JSUToKIAljYXNlIEVMU19SRUM6CisJY2FzZSBFTFNfUkxTOgogCQlmY19ycG9ydF9yZWN2X2Vsc19yZXEobHBvcnQsIHNwLCBmcCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMTc0LDEwICsxMjkyLDEwIEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfcmVjdl9wbG9naV9yZXEoKSAtIEhhbmRsZSBpbmNvbWluZyBQb3J0IExvZ2luIChQTE9HSSkgcmVxdWVzdAotICogQGxwb3J0OiBsb2NhbCBwb3J0Ci0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIFBMT0dJIGV4Y2hhbmdlCi0gKiBAZnA6IFBMT0dJIHJlcXVlc3QgZnJhbWUKKyAqIGZjX3Jwb3J0X3JlY3ZfcGxvZ2lfcmVxKCkgLSBIYW5kbGVyIGZvciBQb3J0IExvZ2luIChQTE9HSSkgcmVxdWVzdHMKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCByZWNlaXZlZCB0aGUgUExPR0kgcmVxdWVzdAorICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhhdCB0aGUgUExPR0kgcmVxdWVzdCB3YXMgb24KKyAqIEByeF9mcDogVGhlIFBMT0dJIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICAqLwpAQCAtMTI0OCw2ICsxMzY2LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFJQT1JUX1NUX1BSTEk6CisJY2FzZSBSUE9SVF9TVF9SVFY6CiAJY2FzZSBSUE9SVF9TVF9SRUFEWToKIAljYXNlIFJQT1JUX1NUX0FESVNDOgogCQlGQ19SUE9SVF9EQkcocmRhdGEsICJSZWNlaXZlZCBQTE9HSSBpbiBsb2dnZWQtaW4gc3RhdGUgJWQgIgpAQCAtMTI1NSwxMSArMTM3NCwxNCBAQAogCQkvKiBYWFggVEJEIC0gc2hvdWxkIHJlc2V0ICovCiAJCWJyZWFrOwogCWNhc2UgUlBPUlRfU1RfREVMRVRFOgotCWRlZmF1bHQ6Ci0JCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIFBMT0dJIGluIHVuZXhwZWN0ZWQgc3RhdGUgJWRcbiIsCi0JCQkgICAgIHJkYXRhLT5ycF9zdGF0ZSk7Ci0JCWZjX2ZyYW1lX2ZyZWUocnhfZnApOwotCQlnb3RvIG91dDsKKwljYXNlIFJQT1JUX1NUX0xPR086CisJY2FzZSBSUE9SVF9TVF9SRVNUQVJUOgorCQlGQ19SUE9SVF9EQkcocmRhdGEsICJSZWNlaXZlZCBQTE9HSSBpbiBzdGF0ZSAlcyAtIHNlbmQgYnVzeVxuIiwKKwkJCSAgICAgZmNfcnBvcnRfc3RhdGUocmRhdGEpKTsKKwkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCQlyanRfZGF0YS5yZWFzb24gPSBFTFNfUkpUX0JVU1k7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PTkU7CisJCWdvdG8gcmVqZWN0OwogCX0KIAogCS8qCkBAIC0xMjk1LDEwICsxNDE3LDEwIEBACiB9CiAKIC8qKgotICogZmNfcnBvcnRfcmVjdl9wcmxpX3JlcSgpIC0gSGFuZGxlIGluY29taW5nIFByb2Nlc3MgTG9naW4gKFBSTEkpIHJlcXVlc3QKLSAqIEByZGF0YTogcHJpdmF0ZSByZW1vdGUgcG9ydCBkYXRhCi0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIFBSTEkgZXhjaGFuZ2UKLSAqIEBmcDogUFJMSSByZXF1ZXN0IGZyYW1lCisgKiBmY19ycG9ydF9yZWN2X3BybGlfcmVxKCkgLSBIYW5kbGVyIGZvciBwcm9jZXNzIGxvZ2luIChQUkxJKSByZXF1ZXN0cworICogQHJkYXRhOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBQUkxJIHJlcXVlc3QKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIHRoYXQgdGhlIFBSTEkgd2FzIG9uCisgKiBAcnhfZnA6IFRoZSBQUkxJIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KQEAgLTE0MDIsNyArMTUyNCw3IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIEZDX1RZUEVfRkNQOgogCQkJCWZjcF9wYXJtID0gbnRvaGwocnNwcC0+c3BwX3BhcmFtcyk7Ci0JCQkJaWYgKGZjcF9wYXJtICogRkNQX1NQUEZfUkVUUlkpCisJCQkJaWYgKGZjcF9wYXJtICYgRkNQX1NQUEZfUkVUUlkpCiAJCQkJCXJkYXRhLT5mbGFncyB8PSBGQ19SUF9GTEFHU19SRVRSWTsKIAkJCQlyZGF0YS0+c3VwcG9ydGVkX2NsYXNzZXMgPSBGQ19DT1NfQ0xBU1MzOwogCQkJCWlmIChmY3BfcGFybSAmIEZDUF9TUFBGX0lOSVRfRkNOKQpAQCAtMTQ1MiwxMCArMTU3NCwxMCBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X3JlY3ZfcHJsb19yZXEoKSAtIEhhbmRsZSBpbmNvbWluZyBQcm9jZXNzIExvZ291dCAoUFJMTykgcmVxdWVzdAotICogQHJkYXRhOiBwcml2YXRlIHJlbW90ZSBwb3J0IGRhdGEKLSAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgUFJMTyBleGNoYW5nZQotICogQGZwOiBQUkxPIHJlcXVlc3QgZnJhbWUKKyAqIGZjX3Jwb3J0X3JlY3ZfcHJsb19yZXEoKSAtIEhhbmRsZXIgZm9yIHByb2Nlc3MgbG9nb3V0IChQUkxPKSByZXF1ZXN0cworICogQHJkYXRhOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBQUkxPIHJlcXVlc3QKKyAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIHRoYXQgdGhlIFBSTE8gd2FzIG9uCisgKiBAZnA6CSAgIFRoZSBQUkxPIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KQEAgLTE0ODIsMTAgKzE2MDQsMTAgQEAKIH0KIAogLyoqCi0gKiBmY19ycG9ydF9yZWN2X2xvZ29fcmVxKCkgLSBIYW5kbGUgaW5jb21pbmcgTG9nb3V0IChMT0dPKSByZXF1ZXN0Ci0gKiBAbHBvcnQ6IGxvY2FsIHBvcnQuCi0gKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIExPR08gZXhjaGFuZ2UKLSAqIEBmcDogTE9HTyByZXF1ZXN0IGZyYW1lCisgKiBmY19ycG9ydF9yZWN2X2xvZ29fcmVxKCkgLSBIYW5kbGVyIGZvciBsb2dvdXQgKExPR08pIHJlcXVlc3RzCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgcmVjZWl2ZWQgdGhlIExPR08gcmVxdWVzdAorICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhhdCB0aGUgTE9HTyByZXF1ZXN0IHdhcyBvbgorICogQGZwOgkgICBUaGUgTE9HTyByZXF1ZXN0IGZyYW1lCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKICAqIHRoaXMgZnVuY3Rpb24uCkBAIC0xNTEwLDE0ICsxNjMyLDE0IEBACiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIExPR08gcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKIAkJCSAgICAgZmNfcnBvcnRfc3RhdGUocmRhdGEpKTsKIAorCQlmY19ycG9ydF9lbnRlcl9kZWxldGUocmRhdGEsIFJQT1JUX0VWX0xPR08pOworCiAJCS8qCi0JCSAqIElmIHRoZSByZW1vdGUgcG9ydCB3YXMgY3JlYXRlZCBkdWUgdG8gZGlzY292ZXJ5LAotCQkgKiBsb2cgYmFjayBpbi4gIEl0IG1heSBoYXZlIHNlZW4gYSBzdGFsZSBSU0NOIGFib3V0IHVzLgorCQkgKiBJZiB0aGUgcmVtb3RlIHBvcnQgd2FzIGNyZWF0ZWQgZHVlIHRvIGRpc2NvdmVyeSwgc2V0IHN0YXRlCisJCSAqIHRvIGxvZyBiYWNrIGluLiAgSXQgbWF5IGhhdmUgc2VlbiBhIHN0YWxlIFJTQ04gYWJvdXQgdXMuCiAJCSAqLwotCQlpZiAocmRhdGEtPnJwX3N0YXRlICE9IFJQT1JUX1NUX0RFTEVURSAmJiByZGF0YS0+ZGlzY19pZCkKLQkJCWZjX3Jwb3J0X2VudGVyX3Bsb2dpKHJkYXRhKTsKLQkJZWxzZQotCQkJZmNfcnBvcnRfZW50ZXJfZGVsZXRlKHJkYXRhLCBSUE9SVF9FVl9MT0dPKTsKKwkJaWYgKHJkYXRhLT5kaXNjX2lkKQorCQkJZmNfcnBvcnRfc3RhdGVfZW50ZXIocmRhdGEsIFJQT1JUX1NUX1JFU1RBUlQpOwogCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CiAJfSBlbHNlCiAJCUZDX1JQT1JUX0lEX0RCRyhscG9ydCwgc2lkLApAQCAtMTUyNiwxMSArMTY0OCwxOCBAQAogCWZjX2ZyYW1lX2ZyZWUoZnApOwogfQogCisvKioKKyAqIGZjX3Jwb3J0X2ZsdXNoX3F1ZXVlKCkgLSBGbHVzaCB0aGUgcnBvcnRfZXZlbnRfcXVldWUKKyAqLwogc3RhdGljIHZvaWQgZmNfcnBvcnRfZmx1c2hfcXVldWUodm9pZCkKIHsKIAlmbHVzaF93b3JrcXVldWUocnBvcnRfZXZlbnRfcXVldWUpOwogfQogCisvKioKKyAqIGZjX3Jwb3J0X2luaXQoKSAtIEluaXRpYWxpemUgdGhlIHJlbW90ZSBwb3J0IGxheWVyIGZvciBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gaW5pdGlhbGl6ZSB0aGUgcmVtb3RlIHBvcnQgbGF5ZXIgZm9yCisgKi8KIGludCBmY19ycG9ydF9pbml0KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJaWYgKCFscG9ydC0+dHQucnBvcnRfbG9va3VwKQpAQCAtMTU1OCwyNSArMTY4NywzMyBAQAogfQogRVhQT1JUX1NZTUJPTChmY19ycG9ydF9pbml0KTsKIAotaW50IGZjX3NldHVwX3Jwb3J0KHZvaWQpCisvKioKKyAqIGZjX3NldHVwX3Jwb3J0KCkgLSBJbml0aWFsaXplIHRoZSBycG9ydF9ldmVudF9xdWV1ZQorICovCitpbnQgZmNfc2V0dXBfcnBvcnQoKQogewogCXJwb3J0X2V2ZW50X3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZjX3Jwb3J0X2VxIik7CiAJaWYgKCFycG9ydF9ldmVudF9xdWV1ZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGZjX3NldHVwX3Jwb3J0KTsKIAotdm9pZCBmY19kZXN0cm95X3Jwb3J0KHZvaWQpCisvKioKKyAqIGZjX2Rlc3Ryb3lfcnBvcnQoKSAtIERlc3Ryb3kgdGhlIHJwb3J0X2V2ZW50X3F1ZXVlCisgKi8KK3ZvaWQgZmNfZGVzdHJveV9ycG9ydCgpCiB7CiAJZGVzdHJveV93b3JrcXVldWUocnBvcnRfZXZlbnRfcXVldWUpOwogfQotRVhQT1JUX1NZTUJPTChmY19kZXN0cm95X3Jwb3J0KTsKIAorLyoqCisgKiBmY19ycG9ydF90ZXJtaW5hdGVfaW8oKSAtIFN0b3AgYWxsIG91dHN0YW5kaW5nIEkvTyBvbiBhIHJlbW90ZSBwb3J0CisgKiBAcnBvcnQ6IFRoZSByZW1vdGUgcG9ydCB3aG9zZSBJL08gc2hvdWxkIGJlIHRlcm1pbmF0ZWQKKyAqLwogdm9pZCBmY19ycG9ydF90ZXJtaW5hdGVfaW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKIHsKLQlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnAgPSBycG9ydC0+ZGRfZGF0YTsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcnAtPmxvY2FsX3BvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwcml2ID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJwcml2LT5sb2NhbF9wb3J0OwogCiAJbHBvcnQtPnR0LmV4Y2hfbWdyX3Jlc2V0KGxwb3J0LCAwLCBycG9ydC0+cG9ydF9pZCk7CiAJbHBvcnQtPnR0LmV4Y2hfbWdyX3Jlc2V0KGxwb3J0LCBycG9ydC0+cG9ydF9pZCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCmluZGV4IGYxYTQyNDYuLmI3Njg5ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCkBAIC0yNjYsNiArMjY2LDg4IEBACiB9CiAKIC8qKgorICogaXNjc2lfY2hlY2tfdG1mX3Jlc3RyaWN0aW9ucyAtIGNoZWNrIGlmIGEgdGFzayBpcyBhZmZlY3RlZCBieSBUTUYKKyAqIEB0YXNrOiBpc2NzaSB0YXNrCisgKiBAb3Bjb2RlOiBvcGNvZGUgdG8gY2hlY2sgZm9yCisgKgorICogRHVyaW5nIFRNRiBhIHRhc2sgaGFzIHRvIGJlIGNoZWNrZWQgaWYgaXQncyBhZmZlY3RlZC4KKyAqIEFsbCB1bnJlbGF0ZWQgSS9PIGNhbiBiZSBwYXNzZWQgdGhyb3VnaCwgYnV0IEkvTyB0byB0aGUKKyAqIGFmZmVjdGVkIExVTiBzaG91bGQgYmUgcmVzdHJpY3RlZC4KKyAqIElmICdmYXN0X2Fib3J0JyBpcyBzZXQgd2Ugd29uJ3QgYmUgc2VuZGluZyBhbnkgSS9PIHRvIHRoZQorICogYWZmZWN0ZWQgTFVOLgorICogT3RoZXJ3aXNlIHRoZSB0YXJnZXQgaXMgd2FpdGluZyBmb3IgYWxsIFRUVHMgdG8gYmUgY29tcGxldGVkLAorICogc28gd2UgaGF2ZSB0byBzZW5kIGFsbCBvdXRzdGFuZGluZyBEYXRhLU91dCBQRFVzIHRvIHRoZSB0YXJnZXQuCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfY2hlY2tfdG1mX3Jlc3RyaWN0aW9ucyhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgaW50IG9wY29kZSkKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CisJc3RydWN0IGlzY3NpX3RtICp0bWYgPSAmY29ubi0+dG1oZHI7CisJdW5zaWduZWQgaW50IGhkcl9sdW47CisKKwlpZiAoY29ubi0+dG1mX3N0YXRlID09IFRNRl9JTklUSUFMKQorCQlyZXR1cm4gMDsKKworCWlmICgodG1mLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgIT0gSVNDU0lfT1BfU0NTSV9UTUZVTkMpCisJCXJldHVybiAwOworCisJc3dpdGNoIChJU0NTSV9UTV9GVU5DX1ZBTFVFKHRtZikpIHsKKwljYXNlIElTQ1NJX1RNX0ZVTkNfTE9HSUNBTF9VTklUX1JFU0VUOgorCQkvKgorCQkgKiBBbGxvdyBQRFVzIGZvciB1bnJlbGF0ZWQgTFVOcworCQkgKi8KKwkJaGRyX2x1biA9IHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKil0bWYtPmx1bik7CisJCWlmIChoZHJfbHVuICE9IHRhc2stPnNjLT5kZXZpY2UtPmx1bikKKwkJCXJldHVybiAwOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIElTQ1NJX1RNX0ZVTkNfVEFSR0VUX1dBUk1fUkVTRVQ6CisJCS8qCisJCSAqIEZhaWwgYWxsIFNDU0kgY21kIFBEVXMKKwkJICovCisJCWlmIChvcGNvZGUgIT0gSVNDU0lfT1BfU0NTSV9EQVRBX09VVCkgeworCQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9JTkZPLCBjb25uLAorCQkJCQkgICJ0YXNrIFtvcCAleC8leCBpdHQgIgorCQkJCQkgICIweCV4LzB4JXhdICIKKwkJCQkJICAicmVqZWN0ZWQuXG4iLAorCQkJCQkgIHRhc2stPmhkci0+b3Bjb2RlLCBvcGNvZGUsCisJCQkJCSAgdGFzay0+aXR0LCB0YXNrLT5oZHJfaXR0KTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCS8qCisJCSAqIEFuZCBhbHNvIGFsbCBkYXRhLW91dCBQRFVzIGluIHJlc3BvbnNlIHRvIFIyVAorCQkgKiBpZiBmYXN0X2Fib3J0IGlzIHNldC4KKwkJICovCisJCWlmIChjb25uLT5zZXNzaW9uLT5mYXN0X2Fib3J0KSB7CisJCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0lORk8sIGNvbm4sCisJCQkJCSAgInRhc2sgW29wICV4LyV4IGl0dCAiCisJCQkJCSAgIjB4JXgvMHgleF0gZmFzdCBhYm9ydC5cbiIsCisJCQkJCSAgdGFzay0+aGRyLT5vcGNvZGUsIG9wY29kZSwKKwkJCQkJICB0YXNrLT5pdHQsIHRhc2stPmhkcl9pdHQpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9UTV9GVU5DX0FCT1JUX1RBU0s6CisJCS8qCisJCSAqIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCBpZiB0aGUgdGFzaworCQkgKiB0aGV5IHdhbnQgdG8gYWJvcnQgd2FzIGluIHRoZSBwZW5kaW5nIHF1ZXVlIHNvIGlmCisJCSAqIHdlIGFyZSBoZXJlIHRoZSBjbWQgcGR1IGhhcyBnb25lIG91dCBhbHJlYWR5LCBhbmQKKwkJICogd2Ugd2lsbCBvbmx5IGhpdCB0aGlzIGZvciBkYXRhLW91dHMKKwkJICovCisJCWlmIChvcGNvZGUgPT0gSVNDU0lfT1BfU0NTSV9EQVRBX09VVCAmJgorCQkgICAgdGFzay0+aGRyX2l0dCA9PSB0bWYtPnJ0dCkgeworCQkJSVNDU0lfREJHX1NFU1NJT04oY29ubi0+c2Vzc2lvbiwKKwkJCQkJICAiUHJldmVudGluZyB0YXNrICV4LyV4IGZyb20gc2VuZGluZyAiCisJCQkJCSAgImRhdGEtb3V0IGR1ZSB0byBhYm9ydCB0YXNrIGluICIKKwkJCQkJICAicHJvZ3Jlc3NcbiIsIHRhc2stPml0dCwKKwkJCQkJICB0YXNrLT5oZHJfaXR0KTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKioKICAqIGlzY3NpX3ByZXBfc2NzaV9jbWRfcGR1IC0gcHJlcCBpc2NzaSBzY3NpIGNtZCBwZHUKICAqIEB0YXNrOiBpc2NzaSB0YXNrCiAgKgpAQCAtMjgyLDYgKzM2NCwxMCBAQAogCWl0dF90IGl0dDsKIAlpbnQgcmM7CiAKKwlyYyA9IGlzY3NpX2NoZWNrX3RtZl9yZXN0cmljdGlvbnModGFzaywgSVNDU0lfT1BfU0NTSV9DTUQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCiAJaWYgKGNvbm4tPnNlc3Npb24tPnR0LT5hbGxvY19wZHUpIHsKIAkJcmMgPSBjb25uLT5zZXNzaW9uLT50dC0+YWxsb2NfcGR1KHRhc2ssIElTQ1NJX09QX1NDU0lfQ01EKTsKIAkJaWYgKHJjKQpAQCAtNTc3LDEyICs2NjMsMTIgQEAKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAJc3RydWN0IGlzY3NpX2hkciAqaGRyID0gdGFzay0+aGRyOwogCXN0cnVjdCBpc2NzaV9ub3BvdXQgKm5vcCA9IChzdHJ1Y3QgaXNjc2lfbm9wb3V0ICopaGRyOworCXVpbnQ4X3Qgb3Bjb2RlID0gaGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSzsKIAogCWlmIChjb25uLT5zZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9MT0dHSU5HX09VVCkKIAkJcmV0dXJuIC1FTk9UQ09OTjsKIAotCWlmIChoZHItPm9wY29kZSAhPSAoSVNDU0lfT1BfTE9HSU4gfCBJU0NTSV9PUF9JTU1FRElBVEUpICYmCi0JICAgIGhkci0+b3Bjb2RlICE9IChJU0NTSV9PUF9URVhUIHwgSVNDU0lfT1BfSU1NRURJQVRFKSkKKwlpZiAob3Bjb2RlICE9IElTQ1NJX09QX0xPR0lOICYmIG9wY29kZSAhPSBJU0NTSV9PUF9URVhUKQogCQlub3AtPmV4cF9zdGF0c24gPSBjcHVfdG9fYmUzMihjb25uLT5leHBfc3RhdHNuKTsKIAkvKgogCSAqIHByZS1mb3JtYXQgQ21kU04gZm9yIG91dGdvaW5nIFBEVS4KQEAgLTU5MCw5ICs2NzYsMTIgQEAKIAlub3AtPmNtZHNuID0gY3B1X3RvX2JlMzIoc2Vzc2lvbi0+Y21kc24pOwogCWlmIChoZHItPml0dCAhPSBSRVNFUlZFRF9JVFQpIHsKIAkJLyoKLQkJICogVE9ETzogV2UgYWx3YXlzIHVzZSBpbW1lZGlhdGUsIHNvIHdlIG5ldmVyIGhpdCB0aGlzLgorCQkgKiBUT0RPOiBXZSBhbHdheXMgdXNlIGltbWVkaWF0ZSBmb3Igbm9ybWFsIHNlc3Npb24gcGR1cy4KIAkJICogSWYgd2Ugc3RhcnQgdG8gc2VuZCB0bWZzIG9yIG5vcHMgYXMgbm9uLWltbWVkaWF0ZSB0aGVuCiAJCSAqIHdlIHNob3VsZCBzdGFydCBjaGVja2luZyB0aGUgY21kc24gbnVtYmVycyBmb3IgbWdtdCB0YXNrcy4KKwkJICoKKwkJICogRHVyaW5nIGRpc2NvdmVyeSBzZXNzaW9ucyBpc2NzaWQgc2VuZHMgVEVYVCBhcyBub24gaW1tZWRpYXRlLAorCQkgKiBidXQgd2UgYWx3YXlzIG9ubHkgc2VuZCBvbmUgUERVIGF0IGEgdGltZS4KIAkJICovCiAJCWlmIChjb25uLT5jX3N0YWdlID09IElTQ1NJX0NPTk5fU1RBUlRFRCAmJgogCQkgICAgIShoZHItPm9wY29kZSAmIElTQ1NJX09QX0lNTUVESUFURSkpIHsKQEAgLTYyMCwyMiArNzA5LDI4IEBACiB7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCXN0cnVjdCBpc2NzaV9ob3N0ICppaG9zdCA9IHNob3N0X3ByaXYoc2Vzc2lvbi0+aG9zdCk7CisJdWludDhfdCBvcGNvZGUgPSBoZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLOwogCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOwogCWl0dF90IGl0dDsKIAogCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9URVJNSU5BVEUpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKGhkci0+b3Bjb2RlID09IChJU0NTSV9PUF9MT0dJTiB8IElTQ1NJX09QX0lNTUVESUFURSkgfHwKLQkgICAgaGRyLT5vcGNvZGUgPT0gKElTQ1NJX09QX1RFWFQgfCBJU0NTSV9PUF9JTU1FRElBVEUpKQorCWlmIChvcGNvZGUgPT0gSVNDU0lfT1BfTE9HSU4gfHwgb3Bjb2RlID09IElTQ1NJX09QX1RFWFQpIHsKIAkJLyoKIAkJICogTG9naW4gYW5kIFRleHQgYXJlIHNlbnQgc2VyaWFsbHksIGluCiAJCSAqIHJlcXVlc3QtZm9sbG93ZWQtYnktcmVzcG9uc2Ugc2VxdWVuY2UuCiAJCSAqIFNhbWUgdGFzayBjYW4gYmUgdXNlZC4gU2FtZSBJVFQgbXVzdCBiZSB1c2VkLgogCQkgKiBOb3RlIHRoYXQgbG9naW5fdGFzayBpcyBwcmVhbGxvY2F0ZWQgYXQgY29ubl9jcmVhdGUoKS4KIAkJICovCisJCWlmIChjb25uLT5sb2dpbl90YXNrLT5zdGF0ZSAhPSBJU0NTSV9UQVNLX0ZSRUUpIHsKKwkJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLCAiTG9naW4vVGV4dCBpbiAiCisJCQkJCSAgInByb2dyZXNzLiBDYW5ub3Qgc3RhcnQgbmV3IHRhc2suXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKIAkJdGFzayA9IGNvbm4tPmxvZ2luX3Rhc2s7Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaWYgKHNlc3Npb24tPnN0YXRlICE9IElTQ1NJX1NUQVRFX0xPR0dFRF9JTikKIAkJCXJldHVybiBOVUxMOwogCkBAIC0xMzU3LDYgKzE0NTIsNyBAQAogICoqLwogc3RhdGljIGludCBpc2NzaV9kYXRhX3htaXQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCiB7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CiAJaW50IHJjID0gMDsKIAogCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CkBAIC0xMzk0LDExICsxNDkwLDggQEAKIAogCS8qIHByb2Nlc3MgcGVuZGluZyBjb21tYW5kIHF1ZXVlICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb25uLT5jbWRxdWV1ZSkpIHsKLQkJaWYgKGNvbm4tPnRtZl9zdGF0ZSA9PSBUTUZfUVVFVUVEKQotCQkJYnJlYWs7Ci0KLQkJY29ubi0+dGFzayA9IGxpc3RfZW50cnkoY29ubi0+Y21kcXVldWUubmV4dCwKLQkJCQkJIHN0cnVjdCBpc2NzaV90YXNrLCBydW5uaW5nKTsKKwkJY29ubi0+dGFzayA9IGxpc3RfZW50cnkoY29ubi0+Y21kcXVldWUubmV4dCwgc3RydWN0IGlzY3NpX3Rhc2ssCisJCQkJCXJ1bm5pbmcpOwogCQlsaXN0X2RlbF9pbml0KCZjb25uLT50YXNrLT5ydW5uaW5nKTsKIAkJaWYgKGNvbm4tPnNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX0xPR0dJTkdfT1VUKSB7CiAJCQlmYWlsX3Njc2lfdGFzayhjb25uLT50YXNrLCBESURfSU1NX1JFVFJZKTsKQEAgLTE0MDYsNyArMTQ5OSw3IEBACiAJCX0KIAkJcmMgPSBpc2NzaV9wcmVwX3Njc2lfY21kX3BkdShjb25uLT50YXNrKTsKIAkJaWYgKHJjKSB7Ci0JCQlpZiAocmMgPT0gLUVOT01FTSkgeworCQkJaWYgKHJjID09IC1FTk9NRU0gfHwgcmMgPT0gLUVBQ0NFUykgewogCQkJCWxpc3RfYWRkX3RhaWwoJmNvbm4tPnRhc2stPnJ1bm5pbmcsCiAJCQkJCSAgICAgICZjb25uLT5jbWRxdWV1ZSk7CiAJCQkJY29ubi0+dGFzayA9IE5VTEw7CkBAIC0xNDI4LDE3ICsxNTIxLDE4IEBACiAJfQogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb25uLT5yZXF1ZXVlKSkgewotCQlpZiAoY29ubi0+c2Vzc2lvbi0+ZmFzdF9hYm9ydCAmJiBjb25uLT50bWZfc3RhdGUgIT0gVE1GX0lOSVRJQUwpCi0JCQlicmVhazsKLQogCQkvKgogCQkgKiB3ZSBhbHdheXMgZG8gZmFzdGxvZ291dCAtIGNvbm4gc3RvcCBjb2RlIHdpbGwgY2xlYW4gdXAuCiAJCSAqLwogCQlpZiAoY29ubi0+c2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfTE9HR0lOR19PVVQpCiAJCQlicmVhazsKIAotCQljb25uLT50YXNrID0gbGlzdF9lbnRyeShjb25uLT5yZXF1ZXVlLm5leHQsCi0JCQkJCSBzdHJ1Y3QgaXNjc2lfdGFzaywgcnVubmluZyk7CisJCXRhc2sgPSBsaXN0X2VudHJ5KGNvbm4tPnJlcXVldWUubmV4dCwgc3RydWN0IGlzY3NpX3Rhc2ssCisJCQkJICBydW5uaW5nKTsKKwkJaWYgKGlzY3NpX2NoZWNrX3RtZl9yZXN0cmljdGlvbnModGFzaywgSVNDU0lfT1BfU0NTSV9EQVRBX09VVCkpCisJCQlicmVhazsKKworCQljb25uLT50YXNrID0gdGFzazsKIAkJbGlzdF9kZWxfaW5pdCgmY29ubi0+dGFzay0+cnVubmluZyk7CiAJCWNvbm4tPnRhc2stPnN0YXRlID0gSVNDU0lfVEFTS19SVU5OSU5HOwogCQlyYyA9IGlzY3NpX3htaXRfdGFzayhjb25uKTsKQEAgLTE1OTEsNyArMTY4NSw3IEBACiAJaWYgKCFpaG9zdC0+d29ya3EpIHsKIAkJcmVhc29uID0gaXNjc2lfcHJlcF9zY3NpX2NtZF9wZHUodGFzayk7CiAJCWlmIChyZWFzb24pIHsKLQkJCWlmIChyZWFzb24gPT0gLUVOT01FTSkgeworCQkJaWYgKHJlYXNvbiA9PSAtRU5PTUVNIHx8ICByZWFzb24gPT0gLUVBQ0NFUykgewogCQkJCXJlYXNvbiA9IEZBSUxVUkVfT09NOwogCQkJCWdvdG8gcHJlcGRfcmVqZWN0OwogCQkJfSBlbHNlIHsKQEAgLTE2NDMsOSArMTczNywyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfcXVldWVjb21tYW5kKTsKIAotaW50IGlzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkZXB0aCkKK2ludCBpc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgZGVwdGgsIGludCByZWFzb24pCiB7Ci0Jc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIGRlcHRoKTsKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgU0NTSV9RREVQVEhfREVGQVVMVDoKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIGRlcHRoKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX1FERVBUSF9RRlVMTDoKKwkJc2NzaV90cmFja19xdWV1ZV9mdWxsKHNkZXYsIGRlcHRoKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX1FERVBUSF9SQU1QX1VQOgorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgZGVwdGgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aCk7CkBAIC0xNjYwLDcyICsxNzY2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RhcmdldF9hbGxvYyk7CiAKLXZvaWQgaXNjc2lfc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQotewotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7Ci0KLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCWlmIChzZXNzaW9uLT5zdGF0ZSAhPSBJU0NTSV9TVEFURV9MT0dHRURfSU4pIHsKLQkJc2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9SRUNPVkVSWV9GQUlMRUQ7Ci0JCWlmIChzZXNzaW9uLT5sZWFkY29ubikKLQkJCXdha2VfdXAoJnNlc3Npb24tPmxlYWRjb25uLT5laHdhaXQpOwotCX0KLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0KTsKLQotaW50IGlzY3NpX2VoX3RhcmdldF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKLXsKLQlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uOwotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uOwotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOwotCi0JY2xzX3Nlc3Npb24gPSBzdGFyZ2V0X3RvX3Nlc3Npb24oc2NzaV90YXJnZXQoc2MtPmRldmljZSkpOwotCXNlc3Npb24gPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKLQljb25uID0gc2Vzc2lvbi0+bGVhZGNvbm47Ci0KLQltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfVEVSTUlOQVRFKSB7Ci1mYWlsZWQ6Ci0JCUlTQ1NJX0RCR19FSChzZXNzaW9uLAotCQkJICAgICAiZmFpbGluZyB0YXJnZXQgcmVzZXQ6IENvdWxkIG5vdCBsb2cgYmFjayBpbnRvICIKLQkJCSAgICAgInRhcmdldCBbYWdlICVkXVxuIiwKLQkJCSAgICAgc2Vzc2lvbi0+YWdlKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCQltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKLQkJcmV0dXJuIEZBSUxFRDsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0JLyoKLQkgKiB3ZSBkcm9wIHRoZSBsb2NrIGhlcmUgYnV0IHRoZSBsZWFkY29ubiBjYW5ub3QgYmUgZGVzdG95ZWQgd2hpbGUKLQkgKiB3ZSBhcmUgaW4gdGhlIHNjc2kgZWgKLQkgKi8KLQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKLQotCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAid2FpdCBmb3IgcmVsb2dpblxuIik7Ci0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNvbm4tPmVod2FpdCwKLQkJCQkgc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfVEVSTUlOQVRFIHx8Ci0JCQkJIHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX0xPR0dFRF9JTiB8fAotCQkJCSBzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9SRUNPVkVSWV9GQUlMRUQpOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKLQotCW11dGV4X2xvY2soJnNlc3Npb24tPmVoX211dGV4KTsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9MT0dHRURfSU4pIHsKLQkJSVNDU0lfREJHX0VIKHNlc3Npb24sCi0JCQkgICAgICJ0YXJnZXQgcmVzZXQgc3VjY2VlZGVkXG4iKTsKLQl9IGVsc2UKLQkJZ290byBmYWlsZWQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXJldHVybiBTVUNDRVNTOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfZWhfdGFyZ2V0X3Jlc2V0KTsKLQogc3RhdGljIHZvaWQgaXNjc2lfdG1mX3RpbWVkb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IChzdHJ1Y3QgaXNjc2lfY29ubiAqKWRhdGE7CkBAIC0yMTA4LDYgKzIxNDgsNyBAQAogCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCQlmYWlsX3Njc2lfdGFzayh0YXNrLCBESURfQUJPUlQpOwogCQljb25uLT50bWZfc3RhdGUgPSBUTUZfSU5JVElBTDsKKwkJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCQlpc2NzaV9zdGFydF90eChjb25uKTsKIAkJZ290byBzdWNjZXNzX3VubG9ja2VkOwpAQCAtMjExOCw2ICsyMTU5LDcgQEAKIAljYXNlIFRNRl9OT1RfRk9VTkQ6CiAJCWlmICghc2MtPlNDcC5wdHIpIHsKIAkJCWNvbm4tPnRtZl9zdGF0ZSA9IFRNRl9JTklUSUFMOworCQkJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKIAkJCS8qIHRhc2sgY29tcGxldGVkIGJlZm9yZSB0bWYgYWJvcnQgcmVzcG9uc2UgKi8KIAkJCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAic2MgY29tcGxldGVkIHdoaWxlIGFib3J0CWluICIKIAkJCQkJICAgICAgInByb2dyZXNzXG4iKTsKQEAgLTIyMTIsNiArMjI1NCw3IEBACiAJaXNjc2lfc3VzcGVuZF90eChjb25uKTsKIAogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKIAlmYWlsX3Njc2lfdGFza3MoY29ubiwgc2MtPmRldmljZS0+bHVuLCBESURfRVJST1IpOwogCWNvbm4tPnRtZl9zdGF0ZSA9IFRNRl9JTklUSUFMOwogCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKQEAgLTIyMjksNiArMjI3MiwxNzIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2VoX2RldmljZV9yZXNldCk7CiAKK3ZvaWQgaXNjc2lfc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CisKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCWlmIChzZXNzaW9uLT5zdGF0ZSAhPSBJU0NTSV9TVEFURV9MT0dHRURfSU4pIHsKKwkJc2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9SRUNPVkVSWV9GQUlMRUQ7CisJCWlmIChzZXNzaW9uLT5sZWFkY29ubikKKwkJCXdha2VfdXAoJnNlc3Npb24tPmxlYWRjb25uLT5laHdhaXQpOworCX0KKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0KTsKKworLyoqCisgKiBpc2NzaV9laF9zZXNzaW9uX3Jlc2V0IC0gZHJvcCBzZXNzaW9uIGFuZCBhdHRlbXB0IHJlbG9naW4KKyAqIEBzYzogc2NzaSBjb21tYW5kCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGEgcmVsb2dpbiwgc2Vzc2lvbiB0ZXJtaW5hdGlvbiBmcm9tCisgKiB1c2Vyc3BhY2UsIG9yIGEgcmVjb3ZlcnkvcmVwbGFjZW1lbnQgdGltZW91dC4KKyAqLworc3RhdGljIGludCBpc2NzaV9laF9zZXNzaW9uX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjKQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb247CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisKKwljbHNfc2Vzc2lvbiA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7CisJc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOworCWNvbm4gPSBzZXNzaW9uLT5sZWFkY29ubjsKKworCW11dGV4X2xvY2soJnNlc3Npb24tPmVoX211dGV4KTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9URVJNSU5BVEUpIHsKK2ZhaWxlZDoKKwkJSVNDU0lfREJHX0VIKHNlc3Npb24sCisJCQkgICAgICJmYWlsaW5nIHNlc3Npb24gcmVzZXQ6IENvdWxkIG5vdCBsb2cgYmFjayBpbnRvICIKKwkJCSAgICAgIiVzLCAlcyBbYWdlICVkXVxuIiwgc2Vzc2lvbi0+dGFyZ2V0bmFtZSwKKwkJCSAgICAgY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzLCBzZXNzaW9uLT5hZ2UpOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKKwkvKgorCSAqIHdlIGRyb3AgdGhlIGxvY2sgaGVyZSBidXQgdGhlIGxlYWRjb25uIGNhbm5vdCBiZSBkZXN0b3llZCB3aGlsZQorCSAqIHdlIGFyZSBpbiB0aGUgc2NzaSBlaAorCSAqLworCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOworCisJSVNDU0lfREJHX0VIKHNlc3Npb24sICJ3YWl0IGZvciByZWxvZ2luXG4iKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY29ubi0+ZWh3YWl0LAorCQkJCSBzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9URVJNSU5BVEUgfHwKKwkJCQkgc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOIHx8CisJCQkJIHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX1JFQ09WRVJZX0ZBSUxFRCk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCisJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX0xPR0dFRF9JTikgeworCQlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwKKwkJCSAgICAgInNlc3Npb24gcmVzZXQgc3VjY2VlZGVkIGZvciAlcywlc1xuIiwKKwkJCSAgICAgc2Vzc2lvbi0+dGFyZ2V0bmFtZSwgY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzKTsKKwl9IGVsc2UKKwkJZ290byBmYWlsZWQ7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBpc2NzaV9wcmVwX3RndF9yZXNldF9wZHUoc3RydWN0IHNjc2lfY21uZCAqc2MsIHN0cnVjdCBpc2NzaV90bSAqaGRyKQoreworCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7CisJaGRyLT5vcGNvZGUgPSBJU0NTSV9PUF9TQ1NJX1RNRlVOQyB8IElTQ1NJX09QX0lNTUVESUFURTsKKwloZHItPmZsYWdzID0gSVNDU0lfVE1fRlVOQ19UQVJHRVRfV0FSTV9SRVNFVCAmIElTQ1NJX0ZMQUdfVE1fRlVOQ19NQVNLOworCWhkci0+ZmxhZ3MgfD0gSVNDU0lfRkxBR19DTURfRklOQUw7CisJaGRyLT5ydHQgPSBSRVNFUlZFRF9JVFQ7Cit9CisKKy8qKgorICogaXNjc2lfZWhfdGFyZ2V0X3Jlc2V0IC0gcmVzZXQgdGFyZ2V0CisgKiBAc2M6IHNjc2kgY29tbWFuZAorICoKKyAqIFRoaXMgd2lsbCBhdHRlbXB0IHRvIHNlbmQgYSB3YXJtIHRhcmdldCByZXNldC4gSWYgdGhhdCBmYWlscworICogdGhlbiB3ZSB3aWxsIGRyb3AgdGhlIHNlc3Npb24gYW5kIGF0dGVtcHQgRVJMMCByZWNvdmVyeS4KKyAqLworaW50IGlzY3NpX2VoX3RhcmdldF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV90bSAqaGRyOworCWludCByYyA9IEZBSUxFRDsKKworCWNsc19zZXNzaW9uID0gc3RhcmdldF90b19zZXNzaW9uKHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKKwlzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CisKKwlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInRndCBSZXNldCBbc2MgJXAgdGd0ICVzXVxuIiwgc2MsCisJCSAgICAgc2Vzc2lvbi0+dGFyZ2V0bmFtZSk7CisKKwltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkvKgorCSAqIEp1c3QgY2hlY2sgaWYgd2UgYXJlIG5vdCBsb2dnZWQgaW4uIFdlIGNhbm5vdCBjaGVjayBmb3IKKwkgKiB0aGUgcGhhc2UgYmVjYXVzZSB0aGUgcmVzZXQgY291bGQgY29tZSBmcm9tIGEgaW9jdGwuCisJICovCisJaWYgKCFzZXNzaW9uLT5sZWFkY29ubiB8fCBzZXNzaW9uLT5zdGF0ZSAhPSBJU0NTSV9TVEFURV9MT0dHRURfSU4pCisJCWdvdG8gdW5sb2NrOworCWNvbm4gPSBzZXNzaW9uLT5sZWFkY29ubjsKKworCS8qIG9ubHkgaGF2ZSBvbmUgdG1mIG91dHN0YW5kaW5nIGF0IGEgdGltZSAqLworCWlmIChjb25uLT50bWZfc3RhdGUgIT0gVE1GX0lOSVRJQUwpCisJCWdvdG8gdW5sb2NrOworCWNvbm4tPnRtZl9zdGF0ZSA9IFRNRl9RVUVVRUQ7CisKKwloZHIgPSAmY29ubi0+dG1oZHI7CisJaXNjc2lfcHJlcF90Z3RfcmVzZXRfcGR1KHNjLCBoZHIpOworCisJaWYgKGlzY3NpX2V4ZWNfdGFza19tZ210X2ZuKGNvbm4sIGhkciwgc2Vzc2lvbi0+YWdlLAorCQkJCSAgICBzZXNzaW9uLT50Z3RfcmVzZXRfdGltZW91dCkpIHsKKwkJcmMgPSBGQUlMRUQ7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXN3aXRjaCAoY29ubi0+dG1mX3N0YXRlKSB7CisJY2FzZSBUTUZfU1VDQ0VTUzoKKwkJYnJlYWs7CisJY2FzZSBUTUZfVElNRURPVVQ6CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisJCWdvdG8gZG9uZTsKKwlkZWZhdWx0OgorCQljb25uLT50bWZfc3RhdGUgPSBUTUZfSU5JVElBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcmMgPSBTVUNDRVNTOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKworCWlzY3NpX3N1c3BlbmRfdHgoY29ubik7CisKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7CisJZmFpbF9zY3NpX3Rhc2tzKGNvbm4sIC0xLCBESURfRVJST1IpOworCWNvbm4tPnRtZl9zdGF0ZSA9IFRNRl9JTklUSUFMOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKworCWlzY3NpX3N0YXJ0X3R4KGNvbm4pOworCWdvdG8gZG9uZTsKKwordW5sb2NrOgorCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKK2RvbmU6CisJSVNDU0lfREJHX0VIKHNlc3Npb24sICJ0Z3QgJXMgcmVzZXQgcmVzdWx0ID0gJXNcbiIsIHNlc3Npb24tPnRhcmdldG5hbWUsCisJCSAgICAgcmMgPT0gU1VDQ0VTUyA/ICJTVUNDRVNTIiA6ICJGQUlMRUQiKTsKKwltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKKworCWlmIChyYyA9PSBGQUlMRUQpCisJCXJjID0gaXNjc2lfZWhfc2Vzc2lvbl9yZXNldChzYyk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfZWhfdGFyZ2V0X3Jlc2V0KTsKKwogLyoKICAqIFByZS1hbGxvY2F0ZSBhIHBvb2wgb2YgQG1heCBpdGVtcyBvZiBAaXRlbV9zaXplLiBCeSBkZWZhdWx0LCB0aGUgcG9vbAogICogc2hvdWxkIGJlIGFjY2Vzc2VkIHZpYSBrZmlmb197Z2V0LHB1dH0gb24gcS0+cXVldWUuCkBAIC0yNDk1LDYgKzI3MDQsNyBAQAogCXNlc3Npb24tPmhvc3QgPSBzaG9zdDsKIAlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NUQVRFX0ZSRUU7CiAJc2Vzc2lvbi0+ZmFzdF9hYm9ydCA9IDE7CisJc2Vzc2lvbi0+dGd0X3Jlc2V0X3RpbWVvdXQgPSAzMDsKIAlzZXNzaW9uLT5sdV9yZXNldF90aW1lb3V0ID0gMTU7CiAJc2Vzc2lvbi0+YWJvcnRfdGltZW91dCA9IDEwOwogCXNlc3Npb24tPnNjc2lfY21kc19tYXggPSBzY3NpX2NtZHM7CkBAIC0yODU2LDYgKzMwNjYsNyBAQAogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAJZmFpbF9zY3NpX3Rhc2tzKGNvbm4sIC0xLCBESURfVFJBTlNQT1JUX0RJU1JVUFRFRCk7CiAJZmFpbF9tZ210X3Rhc2tzKHNlc3Npb24sIGNvbm4pOworCW1lbXNldCgmY29ubi0+dG1oZHIsIDAsIHNpemVvZihjb25uLT50bWhkcikpOwogCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIH0KQEAgLTI5MzIsNiArMzE0Myw5IEBACiAJY2FzZSBJU0NTSV9QQVJBTV9MVV9SRVNFVF9UTU86CiAJCXNzY2FuZihidWYsICIlZCIsICZzZXNzaW9uLT5sdV9yZXNldF90aW1lb3V0KTsKIAkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1POgorCQlzc2NhbmYoYnVmLCAiJWQiLCAmc2Vzc2lvbi0+dGd0X3Jlc2V0X3RpbWVvdXQpOworCQlicmVhazsKIAljYXNlIElTQ1NJX1BBUkFNX1BJTkdfVE1POgogCQlzc2NhbmYoYnVmLCAiJWQiLCAmY29ubi0+cGluZ190aW1lb3V0KTsKIAkJYnJlYWs7CkBAIC0zMDMxLDYgKzMyNDUsOSBAQAogCWNhc2UgSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1POgogCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzZXNzaW9uLT5sdV9yZXNldF90aW1lb3V0KTsKIAkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1POgorCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzZXNzaW9uLT50Z3RfcmVzZXRfdGltZW91dCk7CisJCWJyZWFrOwogCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBTF9SMlRfRU46CiAJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHNlc3Npb24tPmluaXRpYWxfcjJ0X2VuKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMKaW5kZXggMmUwNzQ2ZC4uY2EyNWVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYwpAQCAtMTAwNCw3ICsxMDA0LDcgQEAKICAqIGlzY3NpX3RjcF90YXNrX3htaXQgLSB4bWl0IG5vcm1hbCBQRFUgdGFzawogICogQHRhc2s6IGlzY3NpIGNvbW1hbmQgdGFzawogICoKLSAqIFdlJ3JlIGV4cGVjdGVkIHRvIHJldHVybiAwIHdoZW4gZXZlcnl0aGluZyB3YXMgdHJhbnNtaXR0ZWQgc3VjY2VzZnVsbHksCisgKiBXZSdyZSBleHBlY3RlZCB0byByZXR1cm4gMCB3aGVuIGV2ZXJ5dGhpbmcgd2FzIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSwKICAqIC1FQUdBSU4gaWYgdGhlcmUncyBzdGlsbCBkYXRhIGluIHRoZSBxdWV1ZSwgb3IgIT0gMCBmb3IgYW55IG90aGVyIGtpbmQKICAqIG9mIGVycm9yLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCmluZGV4IDFjNTU4ZDMuLjE0YjEzMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCkBAIC04MjAsMTAgKzgyMCwxNCBAQAogCQlhdGFfcG9ydF9kaXNhYmxlKGRldi0+c2F0YV9kZXYuYXApOwogfQogCi1pbnQgc2FzX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2LCBpbnQgbmV3X2RlcHRoKQoraW50IHNhc19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldiwgaW50IG5ld19kZXB0aCwKKwkJCSAgIGludCByZWFzb24pCiB7CiAJaW50IHJlcyA9IG1pbihuZXdfZGVwdGgsIFNBU19NQVhfUUQpOwogCisJaWYgKHJlYXNvbiAhPSBTQ1NJX1FERVBUSF9ERUZBVUxUKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAoc2NzaV9kZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCiAJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNjc2lfZGV2LCBzY3NpX2dldF90YWdfdHlwZShzY3NpX2RldiksCiAJCQkJCXJlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggYWExMGY3OS4uMWNjMjNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtMTA5LDcgKzEwOSw4IEBACiAJc3RydWN0IGxwZmNfZG1hYnVmIGRidWY7CiAJdWludDMyX3Qgc2l6ZTsKIAl1aW50MzJfdCB0YWc7Ci0Jc3RydWN0IGxwZmNfcmNxZSByY3FlOworCXN0cnVjdCBscGZjX2NxX2V2ZW50IGNxX2V2ZW50OworCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFtcDsKIH07CiAKIC8qIFByaW9yaXR5IGJpdC4gIFNldCB2YWx1ZSB0byBleGNlZWQgbG93IHdhdGVyIG1hcmsgaW4gbHBmY19tZW0uICovCkBAIC0yMDEsNiArMjAyLDcgQEAKIAl1aW50MzJfdCBlbHNSY3ZMSVJSOwogCXVpbnQzMl90IGVsc1JjdlJQUzsKIAl1aW50MzJfdCBlbHNSY3ZSUEw7CisJdWludDMyX3QgZWxzUmN2UlJROwogCXVpbnQzMl90IGVsc1htaXRGTE9HSTsKIAl1aW50MzJfdCBlbHNYbWl0RkRJU0M7CiAJdWludDMyX3QgZWxzWG1pdFBMT0dJOwpAQCAtMjg5LDggKzI5MSw4IEBACiAKIAl1aW50MTZfdCB2cGk7CiAJdWludDE2X3QgdmZpOwotCXVpbnQ4X3QgdmZpX3N0YXRlOwotI2RlZmluZSBMUEZDX1ZGSV9SRUdJU1RFUkVECTB4MQorCXVpbnQ4X3QgdnBpX3N0YXRlOworI2RlZmluZSBMUEZDX1ZQSV9SRUdJU1RFUkVECTB4MQogCiAJdWludDMyX3QgZmNfZmxhZzsJLyogRkMgZmxhZ3MgKi8KIC8qIFNldmVyYWwgb2YgdGhlc2UgZmxhZ3MgYXJlIEhCQSBjZW50cmljIGFuZCBzaG91bGQgYmUgbW92ZWQgdG8KQEAgLTQwNSw2ICs0MDcsNyBAQAogCXVpbnQ4X3Qgc3RhdF9kYXRhX2VuYWJsZWQ7CiAJdWludDhfdCBzdGF0X2RhdGFfYmxvY2tlZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJjdl9idWZmZXJfbGlzdDsKKwl1bnNpZ25lZCBsb25nIHJjdl9idWZmZXJfdGltZV9zdGFtcDsKIAl1aW50MzJfdCB2cG9ydF9mbGFnOwogI2RlZmluZSBTVEFUSUNfVlBPUlQJMQogfTsKQEAgLTUyNywxMyArNTMwLDE2IEBACiAjZGVmaW5lIEhCQV9FUkFUVF9IQU5ETEVECTB4MSAvKiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gZXJhdHQgaGFuZGxlZCAqLwogI2RlZmluZSBERUZFUl9FUkFUVAkJMHgyIC8qIERlZmVycmVkIGVycm9yIGF0dGVudGlvbiBpbiBwcm9ncmVzcyAqLwogI2RlZmluZSBIQkFfRkNPRV9TVVBQT1JUCTB4NCAvKiBIQkEgZnVuY3Rpb24gc3VwcG9ydHMgRkNPRSAqLwotI2RlZmluZSBIQkFfUkVDRUlWRV9CVUZGRVIJMHg4IC8qIFJjdiBidWZmZXIgcG9zdGVkIHRvIHdvcmtlciB0aHJlYWQgKi8KKyNkZWZpbmUgSEJBX1NQX1FVRVVFX0VWVAkweDggLyogU2xvdy1wYXRoIHFldnQgcG9zdGVkIHRvIHdvcmtlciB0aHJlYWQqLwogI2RlZmluZSBIQkFfUE9TVF9SRUNFSVZFX0JVRkZFUiAweDEwIC8qIFJjdiBidWZmZXJzIG5lZWQgdG8gYmUgcG9zdGVkICovCiAjZGVmaW5lIEZDUF9YUklfQUJPUlRfRVZFTlQJMHgyMAogI2RlZmluZSBFTFNfWFJJX0FCT1JUX0VWRU5UCTB4NDAKICNkZWZpbmUgQVNZTkNfRVZFTlQJCTB4ODAKICNkZWZpbmUgTElOS19ESVNBQkxFRAkJMHgxMDAgLyogTGluayBkaXNhYmxlZCBieSB1c2VyICovCiAjZGVmaW5lIEZDRl9ESVNDX0lOUFJPR1JFU1MJMHgyMDAgLyogRkNGIGRpc2NvdmVyeSBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBIQkFfRklQX1NVUFBPUlQJCTB4NDAwIC8qIEZJUCBzdXBwb3J0IGluIEhCQSAqLworI2RlZmluZSBIQkFfQUVSX0VOQUJMRUQJCTB4ODAwIC8qIEFFUiBlbmFibGVkIHdpdGggSEJBICovCisJdWludDMyX3QgZmNwX3JpbmdfaW5fdXNlOyAvKiBXaGVuIHBvbGxpbmcgdGVzdCBpZiBpbnRyLWhuZGxyIGFjdGl2ZSovCiAJc3RydWN0IGxwZmNfZG1hYnVmIHNsaW0ycDsKIAogCU1BSUxCT1hfdCAqbWJveDsKQEAgLTU1MSw2ICs1NTcsNyBAQAogCXVpbnQ4X3QgZmNfbGlua3NwZWVkOwkvKiBMaW5rIHNwZWVkIGFmdGVyIGxhc3QgUkVBRF9MQSAqLwogCiAJdWludDMyX3QgZmNfZXZlbnRUYWc7CS8qIGV2ZW50IHRhZyBmb3IgbGluayBhdHRlbnRpb24gKi8KKwl1aW50MzJfdCBsaW5rX2V2ZW50czsKIAogCS8qIFRoZXNlIGZpZWxkcyB1c2VkIHRvIGJlIGJpbmZvICovCiAJdWludDMyX3QgZmNfcHJlZl9ESUQ7CS8qIHByZWZlcnJlZCBEX0lEICovCkBAIC02MDQsOCArNjExLDggQEAKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2hiYV9yZXNldDsKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2hiYV9oZWFydGJlYXQ7CiAJdWludDMyX3QgY2ZnX2VuYWJsZV9iZzsKLQl1aW50MzJfdCBjZmdfZW5hYmxlX2ZpcDsKIAl1aW50MzJfdCBjZmdfbG9nX3ZlcmJvc2U7CisJdWludDMyX3QgY2ZnX2Flcl9zdXBwb3J0OwogCiAJbHBmY192cGRfdCB2cGQ7CQkvKiB2aXRhbCBwcm9kdWN0IGRhdGEgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwppbmRleCBlMWEzMGExLi45MTU0MmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwpAQCAtMjMsMTIgKzIzLDE0IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZXIuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisjaW5jbHVkZSA8c2NzaS9mYy9mY19mcy5oPgogCiAjaW5jbHVkZSAibHBmY19odzQuaCIKICNpbmNsdWRlICJscGZjX2h3LmgiCkBAIC05OCw2ICsxMDAsMjggQEAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIExQRkNfTU9EVUxFX0RFU0MgIlxuIik7CiB9CiAKKy8qKgorICogbHBmY19lbmFibGVfZmlwX3Nob3cgLSBSZXR1cm4gdGhlIGZpcCBtb2RlIG9mIHRoZSBIQkEKKyAqIEBkZXY6IGNsYXNzIHVudXNlZCB2YXJpYWJsZS4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IG9uIHJldHVybiBjb250YWlucyB0aGUgbW9kdWxlIGRlc2NyaXB0aW9uIHRleHQuCisgKgorICogUmV0dXJuczogc2l6ZSBvZiBmb3JtYXR0ZWQgc3RyaW5nLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfZW5hYmxlX2ZpcF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKworCWlmIChwaGJhLT5oYmFfZmxhZyAmIEhCQV9GSVBfU1VQUE9SVCkKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMVxuIik7CisJZWxzZQorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIwXG4iKTsKK30KKwogc3RhdGljIHNzaXplX3QKIGxwZmNfYmdfaW5mb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCSAgY2hhciAqYnVmKQpAQCAtNjU0LDcgKzY3OCw3IEBACiAgKiBOb3RlczoKICAqIEFzc3VtZXMgYW55IGVycm9yIGZyb20gbHBmY19zZWxlY3RpdmVfcmVzZXQoKSB3aWxsIGJlIG5lZ2F0aXZlLgogICogSWYgbHBmY19zZWxlY3RpdmVfcmVzZXQoKSByZXR1cm5zIHplcm8gdGhlbiB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKLSAqIGlzIHJldHVybmVkIHdoaWNoIGluZGljYXRlcyBzdWNjY2VzcworICogaXMgcmV0dXJuZWQgd2hpY2ggaW5kaWNhdGVzIHN1Y2Nlc3MKICAqCiAgKiBSZXR1cm5zOgogICogLUVJTlZBTCBpZiB0aGUgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAic2VsZWN0aXZlIgpAQCAtNzYyLDkgKzc4NiwxNSBAQAogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJvZmZsaW5lIiwgc2l6ZW9mKCJvZmZsaW5lIikgLSAxKSA9PSAwKQogCQlzdGF0dXMgPSBscGZjX2RvX29mZmxpbmUocGhiYSwgTFBGQ19FVlRfT0ZGTElORSk7CiAJZWxzZSBpZiAoc3RybmNtcChidWYsICJ3YXJtIiwgc2l6ZW9mKCJ3YXJtIikgLSAxKSA9PSAwKQotCQlzdGF0dXMgPSBscGZjX2RvX29mZmxpbmUocGhiYSwgTFBGQ19FVlRfV0FSTV9TVEFSVCk7CisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZQorCQkJc3RhdHVzID0gbHBmY19kb19vZmZsaW5lKHBoYmEsIExQRkNfRVZUX1dBUk1fU1RBUlQpOwogCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiZXJyb3IiLCBzaXplb2YoImVycm9yIikgLSAxKSA9PSAwKQotCQlzdGF0dXMgPSBscGZjX2RvX29mZmxpbmUocGhiYSwgTFBGQ19FVlRfS0lMTCk7CisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZQorCQkJc3RhdHVzID0gbHBmY19kb19vZmZsaW5lKHBoYmEsIExQRkNfRVZUX0tJTEwpOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTExMjYsNiArMTE1Niw5IEBACiAJaWYgKCh2YWwgJiAweDMpICE9IHZhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQl2YWwgPSAwOworCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKIAlvbGRfdmFsID0gcGhiYS0+Y2ZnX3BvbGw7CkBAIC0xNTg5LDYgKzE2MjIsNyBAQAogc3RhdGljIERFVklDRV9BVFRSKG1lbmxvX21nbXRfbW9kZSwgU19JUlVHTywgbHBmY19tbG9tZ210X3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKG5wb3J0X2V2dF9jbnQsIFNfSVJVR08sIGxwZmNfbnBvcnRfZXZ0X2NudF9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihscGZjX2RydnJfdmVyc2lvbiwgU19JUlVHTywgbHBmY19kcnZyX3ZlcnNpb25fc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobHBmY19lbmFibGVfZmlwLCBTX0lSVUdPLCBscGZjX2VuYWJsZV9maXBfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoYm9hcmRfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgIGxwZmNfYm9hcmRfbW9kZV9zaG93LCBscGZjX2JvYXJkX21vZGVfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKGlzc3VlX3Jlc2V0LCBTX0lXVVNSLCBOVUxMLCBscGZjX2lzc3VlX3Jlc2V0KTsKQEAgLTI3NTksNiArMjc5MywxOTYgQEAKIAkJbHBmY19saW5rX3NwZWVkX3Nob3csIGxwZmNfbGlua19zcGVlZF9zdG9yZSk7CiAKIC8qCisjIGxwZmNfYWVyX3N1cHBvcnQ6IFN1cHBvcnQgUENJZSBkZXZpY2UgQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIChBRVIpCisjICAgICAgIDAgID0gYWVyIGRpc2FibGVkIG9yIG5vdCBzdXBwb3J0ZWQKKyMgICAgICAgMSAgPSBhZXIgc3VwcG9ydGVkIGFuZCBlbmFibGVkIChkZWZhdWx0KQorIyBWYWx1ZSByYW5nZSBpcyBbMCwxXS4gRGVmYXVsdCB2YWx1ZSBpcyAxLgorKi8KKworLyoqCisgKiBscGZjX2Flcl9zdXBwb3J0X3N0b3JlIC0gU2V0IHRoZSBhZGFwdGVyIGZvciBhZXIgc3VwcG9ydAorICoKKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogY29udGFpbmluZyB0aGUgc3RyaW5nICJzZWxlY3RpdmUiLgorICogQGNvdW50OiB1bnVzZWQgdmFyaWFibGUuCisgKgorICogRGVzY3JpcHRpb246CisgKiBJZiB0aGUgdmFsIGlzIDEgYW5kIGN1cnJlbnRseSB0aGUgZGV2aWNlJ3MgQUVSIGNhcGFiaWxpdHkgd2FzIG5vdAorICogZW5hYmxlZCwgaW52b2tlIHRoZSBrZXJuZWwncyBlbmFibGUgQUVSIGhlbHBlciByb3V0aW5lLCB0cnlpbmcgdG8KKyAqIGVuYWJsZSB0aGUgZGV2aWNlJ3MgQUVSIGNhcGFiaWxpdHkuIElmIHRoZSBoZWxwZXIgcm91dGluZSBlbmFibGluZworICogQUVSIHJldHVybnMgc3VjY2VzcywgdXBkYXRlIHRoZSBkZXZpY2UncyBjZmdfYWVyX3N1cHBvcnQgZmxhZyB0bworICogaW5kaWNhdGUgQUVSIGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlOyBvdGhlcndpc2UsIGlmIHRoZSBkZXZpY2UKKyAqIEFFUiBjYXBhYmlsaXR5IGlzIGFscmVhZHkgZW5hYmxlZCB0byBzdXBwb3J0IEFFUiwgdGhlbiBkbyBub3RoaW5nLgorICoKKyAqIElmIHRoZSB2YWwgaXMgMCBhbmQgY3VycmVudGx5IHRoZSBkZXZpY2UncyBBRVIgc3VwcG9ydCB3YXMgZW5hYmxlZCwKKyAqIGludm9rZSB0aGUga2VybmVsJ3MgZGlzYWJsZSBBRVIgaGVscGVyIHJvdXRpbmUuIEFmdGVyIHRoYXQsIHVwZGF0ZQorICogdGhlIGRldmljZSdzIGNmZ19hZXJfc3VwcG9ydCBmbGFnIHRvIGluZGljYXRlIEFFUiBpcyBub3Qgc3VwcG9ydGVkCisgKiBieSB0aGUgZGV2aWNlOyBvdGhlcndpc2UsIGlmIHRoZSBkZXZpY2UgQUVSIGNhcGFiaWxpdHkgaXMgYWxyZWFkeQorICogZGlzYWJsZWQgZnJvbSBzdXBwb3J0aW5nIEFFUiwgdGhlbiBkbyBub3RoaW5nLgorICoKKyAqIFJldHVybnM6CisgKiBsZW5ndGggb2YgdGhlIGJ1ZiBvbiBzdWNjZXNzIGlmIHZhbCBpcyBpbiByYW5nZSB0aGUgaW50ZW5kZWQgbW9kZQorICogaXMgc3VwcG9ydGVkLgorICogLUVJTlZBTCBpZiB2YWwgb3V0IG9mIHJhbmdlIG9yIGludGVuZGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZC4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX2Flcl9zdXBwb3J0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IHZwb3J0LT5waGJhOworCWludCB2YWwgPSAwLCByYyA9IC1FSU5WQUw7CisKKwkvKiBBRVIgbm90IHN1cHBvcnRlZCBvbiBPQyBkZXZpY2VzIHlldCAqLworCWlmIChwaGJhLT5wY2lfZGV2X2dycCA9PSBMUEZDX1BDSV9ERVZfT0MpCisJCXJldHVybiAtRVBFUk07CisJaWYgKCFpc2RpZ2l0KGJ1ZlswXSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmdmFsKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOgorCQlpZiAocGhiYS0+aGJhX2ZsYWcgJiBIQkFfQUVSX0VOQUJMRUQpIHsKKwkJCXJjID0gcGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGhiYS0+cGNpZGV2KTsKKwkJCWlmICghcmMpIHsKKwkJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkJCQlwaGJhLT5oYmFfZmxhZyAmPSB+SEJBX0FFUl9FTkFCTEVEOworCQkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQkJcGhiYS0+Y2ZnX2Flcl9zdXBwb3J0ID0gMDsKKwkJCQlyYyA9IHN0cmxlbihidWYpOworCQkJfSBlbHNlCisJCQkJcmMgPSAtRVBFUk07CisJCX0gZWxzZSB7CisJCQlwaGJhLT5jZmdfYWVyX3N1cHBvcnQgPSAwOworCQkJcmMgPSBzdHJsZW4oYnVmKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDE6CisJCWlmICghKHBoYmEtPmhiYV9mbGFnICYgSEJBX0FFUl9FTkFCTEVEKSkgeworCQkJcmMgPSBwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBoYmEtPnBjaWRldik7CisJCQlpZiAoIXJjKSB7CisJCQkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQkJcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX0FFUl9FTkFCTEVEOworCQkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQkJcGhiYS0+Y2ZnX2Flcl9zdXBwb3J0ID0gMTsKKwkJCQlyYyA9IHN0cmxlbihidWYpOworCQkJfSBlbHNlCisJCQkJIHJjID0gLUVQRVJNOworCQl9IGVsc2UgeworCQkJcGhiYS0+Y2ZnX2Flcl9zdXBwb3J0ID0gMTsKKwkJCXJjID0gc3RybGVuKGJ1Zik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxwZmNfYWVyX3N1cHBvcnQgPSAxOworbW9kdWxlX3BhcmFtKGxwZmNfYWVyX3N1cHBvcnQsIGludCwgMSk7CitNT0RVTEVfUEFSTV9ERVNDKGxwZmNfYWVyX3N1cHBvcnQsICJFbmFibGUgUENJZSBkZXZpY2UgQUVSIHN1cHBvcnQiKTsKK2xwZmNfcGFyYW1fc2hvdyhhZXJfc3VwcG9ydCkKKworLyoqCisgKiBscGZjX2Flcl9zdXBwb3J0X2luaXQgLSBTZXQgdGhlIGluaXRpYWwgYWRhcHRlcnMgYWVyIHN1cHBvcnQgZmxhZworICogQHBoYmE6IGxwZmNfaGJhIHBvaW50ZXIuCisgKiBAdmFsOiBsaW5rIHNwZWVkIHZhbHVlLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogSWYgdmFsIGlzIGluIGEgdmFsaWQgcmFuZ2UgWzAsMV0sIHRoZW4gc2V0IHRoZSBhZGFwdGVyJ3MgaW5pdGlhbAorICogY2ZnX2Flcl9zdXBwb3J0IGZpZWxkLiBJdCB3aWxsIGJlIHVwIHRvIHRoZSBkcml2ZXIncyBwcm9iZV9vbmUKKyAqIHJvdXRpbmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRldmljZSdzIEFFUiBzdXBwb3J0IGNhbiBiZSBzZXQKKyAqIG9yIG5vdC4KKyAqCisgKiBOb3RlczoKKyAqIElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gcmFuZ2UgbG9nIGEga2VybmVsIGVycm9yIG1lc3NhZ2UsIGFuZAorICogY2hvb3NlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHNldHRpbmcgQUVSIHN1cHBvcnQgYW5kIHJldHVybi4KKyAqCisgKiBSZXR1cm5zOgorICogemVybyBpZiB2YWwgc2F2ZWQuCisgKiAtRUlOVkFMIHZhbCBvdXQgb2YgcmFuZ2UKKyAqKi8KK3N0YXRpYyBpbnQKK2xwZmNfYWVyX3N1cHBvcnRfaW5pdChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGludCB2YWwpCit7CisJLyogQUVSIG5vdCBzdXBwb3J0ZWQgb24gT0MgZGV2aWNlcyB5ZXQgKi8KKwlpZiAocGhiYS0+cGNpX2Rldl9ncnAgPT0gTFBGQ19QQ0lfREVWX09DKSB7CisJCXBoYmEtPmNmZ19hZXJfc3VwcG9ydCA9IDA7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKHZhbCA9PSAwIHx8IHZhbCA9PSAxKSB7CisJCXBoYmEtPmNmZ19hZXJfc3VwcG9ydCA9IHZhbDsKKwkJcmV0dXJuIDA7CisJfQorCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkiMjcxMiBscGZjX2Flcl9zdXBwb3J0IGF0dHJpYnV0ZSB2YWx1ZSAlZCBvdXQgIgorCQkJIm9mIHJhbmdlLCBhbGxvd2VkIHZhbHVlcyBhcmUgMHwxLCBzZXR0aW5nIGl0ICIKKwkJCSJ0byBkZWZhdWx0IHZhbHVlIG9mIDFcbiIsIHZhbCk7CisJLyogQnkgZGVmYXVsdCwgdHJ5IHRvIGVuYWJsZSBBRVIgb24gYSBkZXZpY2UgKi8KKwlwaGJhLT5jZmdfYWVyX3N1cHBvcnQgPSAxOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobHBmY19hZXJfc3VwcG9ydCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGxwZmNfYWVyX3N1cHBvcnRfc2hvdywgbHBmY19hZXJfc3VwcG9ydF9zdG9yZSk7CisKKy8qKgorICogbHBmY19hZXJfY2xlYW51cF9zdGF0ZSAtIENsZWFuIHVwIGFlciBzdGF0ZSB0byB0aGUgYWVyIGVuYWJsZWQgZGV2aWNlCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGNvbnRhaW5pbmcgdGhlIHN0cmluZyAic2VsZWN0aXZlIi4KKyAqIEBjb3VudDogdW51c2VkIHZhcmlhYmxlLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogSWYgdGhlIEBidWYgY29udGFpbnMgMSBhbmQgdGhlIGRldmljZSBjdXJyZW50bHkgaGFzIHRoZSBBRVIgc3VwcG9ydAorICogZW5hYmxlZCwgdGhlbiBpbnZva2VzIHRoZSBrZXJuZWwgQUVSIGhlbHBlciByb3V0aW5lCisgKiBwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyB0byBjbGVhbiB1cCB0aGUgdW5jb3JyZWN0YWJsZQorICogZXJyb3Igc3RhdHVzIHJlZ2lzdGVyLgorICoKKyAqIE5vdGVzOgorICoKKyAqIFJldHVybnM6CisgKiAtRUlOVkFMIGlmIHRoZSBidWYgZG9lcyBub3QgY29udGFpbiB0aGUgMSBvciB0aGUgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkKKyAqIGVuYWJsZWQgd2l0aCB0aGUgQUVSIHN1cHBvcnQuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19hZXJfY2xlYW51cF9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CisJaW50IHZhbCwgcmMgPSAtMTsKKworCS8qIEFFUiBub3Qgc3VwcG9ydGVkIG9uIE9DIGRldmljZXMgeWV0ICovCisJaWYgKHBoYmEtPnBjaV9kZXZfZ3JwID09IExQRkNfUENJX0RFVl9PQykKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoIWlzZGlnaXQoYnVmWzBdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNzY2FuZihidWYsICIlaSIsICZ2YWwpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGhiYS0+aGJhX2ZsYWcgJiBIQkFfQUVSX0VOQUJMRUQpCisJCXJjID0gcGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMocGhiYS0+cGNpZGV2KTsKKworCWlmIChyYyA9PSAwKQorCQlyZXR1cm4gc3RybGVuKGJ1Zik7CisJZWxzZQorCQlyZXR1cm4gLUVQRVJNOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobHBmY19hZXJfc3RhdGVfY2xlYW51cCwgU19JV1VTUiwgTlVMTCwKKwkJICAgbHBmY19hZXJfY2xlYW51cF9zdGF0ZSk7CisKKy8qCiAjIGxwZmNfZmNwX2NsYXNzOiAgRGV0ZXJtaW5lcyBGQyBjbGFzcyB0byB1c2UgZm9yIHRoZSBGQ1AgcHJvdG9jb2wuCiAjIFZhbHVlIHJhbmdlIGlzIFsyLDNdLiBEZWZhdWx0IHZhbHVlIGlzIDMuCiAqLwpAQCAtMjg0Niw3ICszMDcwLDcgQEAKICMgaWRlbnRpZmllcyB3aGF0IHJjdGwgdmFsdWUgdG8gY29uZmlndXJlIHRoZSBhZGRpdGlvbmFsIHJpbmcgZm9yLgogIyBWYWx1ZSByYW5nZSBpcyBbMSwweGZmXS4gRGVmYXVsdCB2YWx1ZSBpcyA0IChVbnNvbGljYXRlZCBEYXRhKS4KICovCi1MUEZDX0FUVFJfUihtdWx0aV9yaW5nX3JjdGwsIEZDX1VOU09MX0RBVEEsIDEsCitMUEZDX0FUVFJfUihtdWx0aV9yaW5nX3JjdGwsIEZDX1JDVExfRERfVU5TT0xfREFUQSwgMSwKIAkgICAgIDI1NSwgIklkZW50aWZpZXMgUkNUTCBmb3IgYWRkaXRpb25hbCByaW5nIGNvbmZpZ3VyYXRpb24iKTsKIAogLyoKQEAgLTI4NTQsNyArMzA3OCw3IEBACiAjIGlkZW50aWZpZXMgd2hhdCB0eXBlIHZhbHVlIHRvIGNvbmZpZ3VyZSB0aGUgYWRkaXRpb25hbCByaW5nIGZvci4KICMgVmFsdWUgcmFuZ2UgaXMgWzEsMHhmZl0uIERlZmF1bHQgdmFsdWUgaXMgNSAoTExDL1NOQVApLgogKi8KLUxQRkNfQVRUUl9SKG11bHRpX3JpbmdfdHlwZSwgRkNfTExDX1NOQVAsIDEsCitMUEZDX0FUVFJfUihtdWx0aV9yaW5nX3R5cGUsIEZDX1RZUEVfSVAsIDEsCiAJICAgICAyNTUsICJJZGVudGlmaWVzIFRZUEUgZm9yIGFkZGl0aW9uYWwgcmluZyBjb25maWd1cmF0aW9uIik7CiAKIC8qCkBAIC0yOTQ3LDE1ICszMTcxLDYgQEAKIExQRkNfQVRUUl9SKGVuYWJsZV9iZywgMCwgMCwgMSwgIkVuYWJsZSBCbG9ja0d1YXJkIFN1cHBvcnQiKTsKIAogLyoKLSMgbHBmY19lbmFibGVfZmlwOiBXaGVuIHNldCwgRklQIGlzIHJlcXVpcmVkIHRvIHN0YXJ0IGRpc2NvdmVyeS4gSWYgbm90Ci0jIHNldCwgdGhlIGRyaXZlciB3aWxsIGFkZCBhbiBGQ0YgcmVjb3JkIG1hbnVhbGx5IGlmIHRoZSBwb3J0IGhhcyBubwotIyBGQ0YgcmVjb3JkcyBhdmFpbGFibGUgYW5kIHN0YXJ0IGRpc2NvdmVyeS4KLSMgVmFsdWUgcmFuZ2UgaXMgWzAsMV0uIERlZmF1bHQgdmFsdWUgaXMgMSAoZW5hYmxlZCkKLSovCi1MUEZDX0FUVFJfUlcoZW5hYmxlX2ZpcCwgMCwgMCwgMSwgIkVuYWJsZSBGSVAgRGlzY292ZXJ5Iik7Ci0KLQotLyoKICMgbHBmY19wcm90X21hc2s6IGkKICMJLSBCaXQgbWFzayBvZiBob3N0IHByb3RlY3Rpb24gY2FwYWJpbGl0aWVzIHVzZWQgdG8gcmVnaXN0ZXIgd2l0aCB0aGUKICMJICBTQ1NJIG1pZC1sYXllcgpAQCAtMzAxMyw2ICszMjI4LDcgQEAKIAkmZGV2X2F0dHJfbnVtX2Rpc2NvdmVyZWRfcG9ydHMsCiAJJmRldl9hdHRyX21lbmxvX21nbXRfbW9kZSwKIAkmZGV2X2F0dHJfbHBmY19kcnZyX3ZlcnNpb24sCisJJmRldl9hdHRyX2xwZmNfZW5hYmxlX2ZpcCwKIAkmZGV2X2F0dHJfbHBmY190ZW1wX3NlbnNvciwKIAkmZGV2X2F0dHJfbHBmY19sb2dfdmVyYm9zZSwKIAkmZGV2X2F0dHJfbHBmY19sdW5fcXVldWVfZGVwdGgsCkBAIC0zMDIwLDcgKzMyMzYsNiBAQAogCSZkZXZfYXR0cl9scGZjX3BlZXJfcG9ydF9sb2dpbiwKIAkmZGV2X2F0dHJfbHBmY19ub2Rldl90bW8sCiAJJmRldl9hdHRyX2xwZmNfZGV2bG9zc190bW8sCi0JJmRldl9hdHRyX2xwZmNfZW5hYmxlX2ZpcCwKIAkmZGV2X2F0dHJfbHBmY19mY3BfY2xhc3MsCiAJJmRldl9hdHRyX2xwZmNfdXNlX2FkaXNjLAogCSZkZXZfYXR0cl9scGZjX2FjazAsCkBAIC0zMDYxLDYgKzMyNzYsOCBAQAogCSZkZXZfYXR0cl9scGZjX21heF9zY3NpY21wbF90aW1lLAogCSZkZXZfYXR0cl9scGZjX3N0YXRfZGF0YV9jdHJsLAogCSZkZXZfYXR0cl9scGZjX3Byb3Rfc2dfc2VnX2NudCwKKwkmZGV2X2F0dHJfbHBmY19hZXJfc3VwcG9ydCwKKwkmZGV2X2F0dHJfbHBmY19hZXJfc3RhdGVfY2xlYW51cCwKIAlOVUxMLAogfTsKIApAQCAtMzA3Myw3ICszMjkwLDYgQEAKIAkmZGV2X2F0dHJfbHBmY19sdW5fcXVldWVfZGVwdGgsCiAJJmRldl9hdHRyX2xwZmNfbm9kZXZfdG1vLAogCSZkZXZfYXR0cl9scGZjX2Rldmxvc3NfdG1vLAotCSZkZXZfYXR0cl9scGZjX2VuYWJsZV9maXAsCiAJJmRldl9hdHRyX2xwZmNfaGJhX3F1ZXVlX2RlcHRoLAogCSZkZXZfYXR0cl9scGZjX3BlZXJfcG9ydF9sb2dpbiwKIAkmZGV2X2F0dHJfbHBmY19yZXN0cmljdF9sb2dpbiwKQEAgLTMxNDcsNyArMzM2Myw3IEBACiAgKiBzeXNmc19jdGxyZWdfcmVhZCAtIFJlYWQgbWV0aG9kIGZvciByZWFkaW5nIGZyb20gY3RscmVnCiAgKiBAa29iajoga2VybmVsIGtvYmplY3QgdGhhdCBjb250YWlucyB0aGUga2VybmVsIGNsYXNzIGRldmljZS4KICAqIEBiaW5fYXR0cjoga2VybmVsIGF0dHJpYnV0ZXMgcGFzc2VkIHRvIHVzLgotICogQGJ1ZjogaWYgc3VjY2VzZnVsIGNvbnRhaW5zIHRoZSBkYXRhIGZyb20gdGhlIGFkYXB0ZXIgSU9SRUcgc3BhY2UuCisgKiBAYnVmOiBpZiBzdWNjZXNzZnVsIGNvbnRhaW5zIHRoZSBkYXRhIGZyb20gdGhlIGFkYXB0ZXIgSU9SRUcgc3BhY2UuCiAgKiBAb2ZmOiBvZmZzZXQgaW50byBidWZmZXIgdG8gYmVnaW5uaW5nIG9mIGRhdGEuCiAgKiBAY291bnQ6IGJ5dGVzIHRvIHRyYW5zZmVyLgogICoKQEAgLTM4MTUsNyArNDAzMSwxMSBAQAogCWhzLT5pbnZhbGlkX2NyY19jb3VudCAtPSBsc28tPmludmFsaWRfY3JjX2NvdW50OwogCWhzLT5lcnJvcl9mcmFtZXMgLT0gbHNvLT5lcnJvcl9mcmFtZXM7CiAKLQlpZiAocGhiYS0+ZmNfdG9wb2xvZ3kgPT0gVE9QT0xPR1lfTE9PUCkgeworCWlmIChwaGJhLT5oYmFfZmxhZyAmIEhCQV9GQ09FX1NVUFBPUlQpIHsKKwkJaHMtPmxpcF9jb3VudCA9IC0xOworCQlocy0+bm9zX2NvdW50ID0gKHBoYmEtPmxpbmtfZXZlbnRzID4+IDEpOworCQlocy0+bm9zX2NvdW50IC09IGxzby0+bGlua19ldmVudHM7CisJfSBlbHNlIGlmIChwaGJhLT5mY190b3BvbG9neSA9PSBUT1BPTE9HWV9MT09QKSB7CiAJCWhzLT5saXBfY291bnQgPSAocGhiYS0+ZmNfZXZlbnRUYWcgPj4gMSk7CiAJCWhzLT5saXBfY291bnQgLT0gbHNvLT5saW5rX2V2ZW50czsKIAkJaHMtPm5vc19jb3VudCA9IC0xOwpAQCAtMzkwNiw3ICs0MTI2LDEwIEBACiAJbHNvLT5pbnZhbGlkX3R4X3dvcmRfY291bnQgPSBwbWItPnVuLnZhclJkTG5rLmludmFsaWRYbWl0V29yZDsKIAlsc28tPmludmFsaWRfY3JjX2NvdW50ID0gcG1iLT51bi52YXJSZExuay5jcmNDbnQ7CiAJbHNvLT5lcnJvcl9mcmFtZXMgPSBwbWItPnVuLnZhclJkTG5rLmNyY0NudDsKLQlsc28tPmxpbmtfZXZlbnRzID0gKHBoYmEtPmZjX2V2ZW50VGFnID4+IDEpOworCWlmIChwaGJhLT5oYmFfZmxhZyAmIEhCQV9GQ09FX1NVUFBPUlQpCisJCWxzby0+bGlua19ldmVudHMgPSAocGhiYS0+bGlua19ldmVudHMgPj4gMSk7CisJZWxzZQorCQlsc28tPmxpbmtfZXZlbnRzID0gKHBoYmEtPmZjX2V2ZW50VGFnID4+IDEpOwogCiAJcHNsaS0+c3RhdHNfc3RhcnQgPSBnZXRfc2Vjb25kcygpOwogCkBAIC00MjIyLDE0ICs0NDQ1LDE3IEBACiAJbHBmY19lbmFibGVfaGJhX3Jlc2V0X2luaXQocGhiYSwgbHBmY19lbmFibGVfaGJhX3Jlc2V0KTsKIAlscGZjX2VuYWJsZV9oYmFfaGVhcnRiZWF0X2luaXQocGhiYSwgbHBmY19lbmFibGVfaGJhX2hlYXJ0YmVhdCk7CiAJbHBmY19lbmFibGVfYmdfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9iZyk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJcGhiYS0+Y2ZnX3BvbGwgPSAwOworCWVsc2UKIAlwaGJhLT5jZmdfcG9sbCA9IGxwZmNfcG9sbDsKIAlwaGJhLT5jZmdfc29mdF93d25uID0gMEw7CiAJcGhiYS0+Y2ZnX3NvZnRfd3dwbiA9IDBMOwogCWxwZmNfc2dfc2VnX2NudF9pbml0KHBoYmEsIGxwZmNfc2dfc2VnX2NudCk7CiAJbHBmY19wcm90X3NnX3NlZ19jbnRfaW5pdChwaGJhLCBscGZjX3Byb3Rfc2dfc2VnX2NudCk7CiAJbHBmY19oYmFfcXVldWVfZGVwdGhfaW5pdChwaGJhLCBscGZjX2hiYV9xdWV1ZV9kZXB0aCk7Ci0JbHBmY19lbmFibGVfZmlwX2luaXQocGhiYSwgbHBmY19lbmFibGVfZmlwKTsKIAlscGZjX2hiYV9sb2dfdmVyYm9zZV9pbml0KHBoYmEsIGxwZmNfbG9nX3ZlcmJvc2UpOworCWxwZmNfYWVyX3N1cHBvcnRfaW5pdChwaGJhLCBscGZjX2Flcl9zdXBwb3J0KTsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jCmluZGV4IGRhNmJmNWEuLmE1ZDkwNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ic2dfZmMuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZzLmg+CiAKICNpbmNsdWRlICJscGZjX2h3NC5oIgogI2luY2x1ZGUgImxwZmNfaHcuaCIKQEAgLTE0OCw4ICsxNDksOCBAQAogCWNtZC0+dWxwQ29tbWFuZCA9IENNRF9HRU5fUkVRVUVTVDY0X0NSOwogCWNtZC0+dW4uZ2VucmVxNjQudzUuaGNzdy5GY3RsID0gKFNJIHwgTEEpOwogCWNtZC0+dW4uZ2VucmVxNjQudzUuaGNzdy5EZmN0bCA9IDA7Ci0JY21kLT51bi5nZW5yZXE2NC53NS5oY3N3LlJjdGwgPSBGQ19VTlNPTF9DVEw7Ci0JY21kLT51bi5nZW5yZXE2NC53NS5oY3N3LlR5cGUgPSBGQ19DT01NT05fVFJBTlNQT1JUX1VMUDsKKwljbWQtPnVuLmdlbnJlcTY0Lnc1Lmhjc3cuUmN0bCA9IEZDX1JDVExfRERfVU5TT0xfQ1RMOworCWNtZC0+dW4uZ2VucmVxNjQudzUuaGNzdy5UeXBlID0gRkNfVFlQRV9DVDsKIAljbWQtPnVscEJkZUNvdW50ID0gMTsKIAljbWQtPnVscExlID0gMTsKIAljbWQtPnVscENsYXNzID0gQ0xBU1MzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAppbmRleCAwODMwZjM3Li42NTA0OTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaApAQCAtNDksNiArNDksOCBAQAogdm9pZCBscGZjX3JlcXVlc3RfZmVhdHVyZXMoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjTWJveHEgKik7CiAKIHN0cnVjdCBscGZjX3Zwb3J0ICpscGZjX2ZpbmRfdnBvcnRfYnlfZGlkKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MzJfdCk7Cit2b2lkIGxwZmNfY2xlYW51cF9yY3ZfYnVmZmVycyhzdHJ1Y3QgbHBmY192cG9ydCAqKTsKK3ZvaWQgbHBmY19yY3Zfc2VxX2NoZWNrX2VkdG92KHN0cnVjdCBscGZjX3Zwb3J0ICopOwogdm9pZCBscGZjX2NsZWFudXBfcnBpcyhzdHJ1Y3QgbHBmY192cG9ydCAqLCBpbnQpOwogaW50IGxwZmNfbGlua2Rvd24oc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX2xpbmtkb3duX3BvcnQoc3RydWN0IGxwZmNfdnBvcnQgKik7CkBAIC0xNDQsNiArMTQ2LDggQEAKIAogdm9pZCBscGZjX2N0X3Vuc29sX2V2ZW50KHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19zbGlfcmluZyAqLAogCQkJIHN0cnVjdCBscGZjX2lvY2JxICopOwordm9pZCBscGZjX3NsaTRfY3RfYWJvcnRfdW5zb2xfZXZlbnQoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX3NsaV9yaW5nICosCisJCQkJICAgIHN0cnVjdCBscGZjX2lvY2JxICopOwogaW50IGxwZmNfbnNfY21kKHN0cnVjdCBscGZjX3Zwb3J0ICosIGludCwgdWludDhfdCwgdWludDMyX3QpOwogaW50IGxwZmNfZmRtaV9jbWQoc3RydWN0IGxwZmNfdnBvcnQgKiwgc3RydWN0IGxwZmNfbm9kZWxpc3QgKiwgaW50KTsKIHZvaWQgbHBmY19mZG1pX3Rtbyh1bnNpZ25lZCBsb25nKTsKQEAgLTE4OCw3ICsxOTIsNyBAQAogdm9pZCBscGZjX2luaXRfdmZpKHN0cnVjdCBscGZjTWJveHEgKiwgc3RydWN0IGxwZmNfdnBvcnQgKik7CiB2b2lkIGxwZmNfcmVnX3ZmaShzdHJ1Y3QgbHBmY01ib3hxICosIHN0cnVjdCBscGZjX3Zwb3J0ICosIGRtYV9hZGRyX3QpOwogdm9pZCBscGZjX2luaXRfdnBpKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY01ib3hxICosIHVpbnQxNl90KTsKLXZvaWQgbHBmY191bnJlZ192Zmkoc3RydWN0IGxwZmNNYm94cSAqLCB1aW50MTZfdCk7Cit2b2lkIGxwZmNfdW5yZWdfdmZpKHN0cnVjdCBscGZjTWJveHEgKiwgc3RydWN0IGxwZmNfdnBvcnQgKik7CiB2b2lkIGxwZmNfcmVnX2ZjZmkoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjTWJveHEgKik7CiB2b2lkIGxwZmNfdW5yZWdfZmNmaShzdHJ1Y3QgbHBmY01ib3hxICosIHVpbnQxNl90KTsKIHZvaWQgbHBmY19yZXN1bWVfcnBpKHN0cnVjdCBscGZjTWJveHEgKiwgc3RydWN0IGxwZmNfbm9kZWxpc3QgKik7CkBAIC0yMTIsNyArMjE2LDEwIEBACiB2b2lkIGxwZmNfcG9sbF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgcHRyKTsKIHZvaWQgbHBmY19wb2xsX3N0YXJ0X3RpbWVyKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19wb2xsX2VyYXR0KHVuc2lnbmVkIGxvbmcpOwotdm9pZCBscGZjX3NsaV9wb2xsX2ZjcF9yaW5nKHN0cnVjdCBscGZjX2hiYSAqKTsKK2ludAorbHBmY19zbGlfaGFuZGxlX2Zhc3RfcmluZ19ldmVudChzdHJ1Y3QgbHBmY19oYmEgKiwKKwkJCXN0cnVjdCBscGZjX3NsaV9yaW5nICosIHVpbnQzMl90KTsKKwogc3RydWN0IGxwZmNfaW9jYnEgKiBscGZjX3NsaV9nZXRfaW9jYnEoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3NsaV9yZWxlYXNlX2lvY2JxKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19pb2NicSAqKTsKIHVpbnQxNl90IGxwZmNfc2xpX25leHRfaW90YWcoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX2lvY2JxICopOwpAQCAtMjM1LDcgKzI0Miw3IEBACiBpbnQgbHBmY19zbGlfY2hlY2tfZXJhdHQoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3NsaV9oYW5kbGVfc2xvd19yaW5nX2V2ZW50KHN0cnVjdCBscGZjX2hiYSAqLAogCQkJCSAgICBzdHJ1Y3QgbHBmY19zbGlfcmluZyAqLCB1aW50MzJfdCk7Ci1pbnQgbHBmY19zbGk0X2hhbmRsZV9yZWNlaXZlZF9idWZmZXIoc3RydWN0IGxwZmNfaGJhICopOwordm9pZCBscGZjX3NsaTRfaGFuZGxlX3JlY2VpdmVkX2J1ZmZlcihzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGhicV9kbWFidWYgKik7CiB2b2lkIGxwZmNfc2xpX2RlZl9tYm94X2NtcGwoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIGludCBscGZjX3NsaV9pc3N1ZV9pb2NiKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MzJfdCwKIAkJCXN0cnVjdCBscGZjX2lvY2JxICosIHVpbnQzMl90KTsKQEAgLTM2MSw2ICszNjgsNyBAQAogdm9pZCBscGZjX3BhcnNlX2Zjb2VfY29uZihzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDhfdCAqLCB1aW50MzJfdCk7CiBpbnQgbHBmY19wYXJzZV92cGQoc3RydWN0IGxwZmNfaGJhICosIHVpbnQ4X3QgKiwgaW50KTsKIHZvaWQgbHBmY19zdGFydF9mZGlzY3Moc3RydWN0IGxwZmNfaGJhICpwaGJhKTsKK3N0cnVjdCBscGZjX3Zwb3J0ICpscGZjX2ZpbmRfdnBvcnRfYnlfdnBpZChzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDE2X3QpOwogCiAjZGVmaW5lIFNjc2lSZXN1bHQoaG9zdF9jb2RlLCBzY3NpX2NvZGUpICgoKGhvc3RfY29kZSkgPDwgMTYpIHwgc2NzaV9jb2RlKQogI2RlZmluZSBIQkFfRVZFTlRfUlNDTiAgICAgICAgICAgICAgICAgICA1CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKaW5kZXggOWExYmQ5NS4uMGViY2Q5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZzLmg+CiAKICNpbmNsdWRlICJscGZjX2h3NC5oIgogI2luY2x1ZGUgImxwZmNfaHcuaCIKQEAgLTg3LDcgKzg4LDYgQEAKIGxwZmNfY3RfdW5zb2xfZXZlbnQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcsCiAJCSAgICBzdHJ1Y3QgbHBmY19pb2NicSAqcGlvY2JxKQogewotCiAJc3RydWN0IGxwZmNfZG1hYnVmICptcCA9IE5VTEw7CiAJSU9DQl90ICppY21kID0gJnBpb2NicS0+aW9jYjsKIAlpbnQgaTsKQEAgLTE2MCw2ICsxNjAsMzkgQEAKIAl9CiB9CiAKKy8qKgorICogbHBmY19zbGk0X2N0X2Fib3J0X3Vuc29sX2V2ZW50IC0gRGVmYXVsdCBoYW5kbGUgZm9yIHNsaTQgdW5zb2wgYWJvcnQKKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqIEBwcmluZzogUG9pbnRlciB0byB0aGUgZHJpdmVyIGludGVybmFsIEkvTyByaW5nLgorICogQHBpb2NicTogUG9pbnRlciB0byB0aGUgSU9DQlEuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgdGhlIGRlZmF1bHQgaGFuZGxlciBmb3IgdGhlIHNsaTQgdW5zb2xpY2l0ZWQKKyAqIGFib3J0IGV2ZW50LiBJdCBzaGFsbCBiZSBpbnZva2VkIHdoZW4gdGhlcmUgaXMgbm8gYXBwbGljYXRpb24gaW50ZXJmYWNlCisgKiByZWdpc3RlcmVkIHVuc29saWNpdGVkIGFib3J0IGhhbmRsZXIuIFRoaXMgaGFuZGxlciBkb2VzIG5vdGhpbmcgYnV0CisgKiBqdXN0IHNpbXBseSByZWxlYXNlcyB0aGUgZG1hIGJ1ZmZlciB1c2VkIGJ5IHRoZSB1bnNvbCBhYm9ydCBldmVudC4KKyAqKi8KK3ZvaWQKK2xwZmNfc2xpNF9jdF9hYm9ydF91bnNvbF9ldmVudChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCisJCQkgICAgICAgc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nLAorCQkJICAgICAgIHN0cnVjdCBscGZjX2lvY2JxICpwaW9jYnEpCit7CisJSU9DQl90ICppY21kID0gJnBpb2NicS0+aW9jYjsKKwlzdHJ1Y3QgbHBmY19kbWFidWYgKmJkZUJ1ZjsKKwl1aW50MzJfdCBzaXplOworCisJLyogRm9yd2FyZCBhYm9ydCBldmVudCB0byBhbnkgcHJvY2VzcyByZWdpc3RlcmVkIHRvIHJlY2VpdmUgY3QgZXZlbnQgKi8KKwlscGZjX2JzZ19jdF91bnNvbF9ldmVudChwaGJhLCBwcmluZywgcGlvY2JxKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIEJERSBhc3NvY2lhdGVkIHdpdGggSU9DQiwgdGhlcmUgaXMgbm90aGluZyB0byBkbyAqLworCWlmIChpY21kLT51bHBCZGVDb3VudCA9PSAwKQorCQlyZXR1cm47CisJYmRlQnVmID0gcGlvY2JxLT5jb250ZXh0MjsKKwlwaW9jYnEtPmNvbnRleHQyID0gTlVMTDsKKwlzaXplICA9IGljbWQtPnVuLmNvbnQ2NFswXS50dXMuZi5iZGVTaXplOworCWxwZmNfY3RfdW5zb2xfYnVmZmVyKHBoYmEsIHBpb2NicSwgYmRlQnVmLCBzaXplKTsKKwlscGZjX2luX2J1Zl9mcmVlKHBoYmEsIGJkZUJ1Zik7Cit9CisKIHN0YXRpYyB2b2lkCiBscGZjX2ZyZWVfY3RfcnNwKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfZG1hYnVmICptbGlzdCkKIHsKQEAgLTMwNCw4ICszMzcsOCBAQAogCS8qIEZpbGwgaW4gcmVzdCBvZiBpb2NiICovCiAJaWNtZC0+dW4uZ2VucmVxNjQudzUuaGNzdy5GY3RsID0gKFNJIHwgTEEpOwogCWljbWQtPnVuLmdlbnJlcTY0Lnc1Lmhjc3cuRGZjdGwgPSAwOwotCWljbWQtPnVuLmdlbnJlcTY0Lnc1Lmhjc3cuUmN0bCA9IEZDX1VOU09MX0NUTDsKLQlpY21kLT51bi5nZW5yZXE2NC53NS5oY3N3LlR5cGUgPSBGQ19DT01NT05fVFJBTlNQT1JUX1VMUDsKKwlpY21kLT51bi5nZW5yZXE2NC53NS5oY3N3LlJjdGwgPSBGQ19SQ1RMX0REX1VOU09MX0NUTDsKKwlpY21kLT51bi5nZW5yZXE2NC53NS5oY3N3LlR5cGUgPSBGQ19UWVBFX0NUOwogCiAJaWYgKCF0bW8pIHsKIAkJIC8qIEZDIHNwZWMgc3RhdGVzIHdlIG5lZWQgMyAqIHJhdG92IGZvciBDVCByZXF1ZXN0cyAqLwpAQCAtMzYzLDkgKzM5NiwxNCBAQAogCW91dG1wID0gbHBmY19hbGxvY19jdF9yc3AocGhiYSwgY21kY29kZSwgYnBsLCByc3Bfc2l6ZSwgJmNudCk7CiAJaWYgKCFvdXRtcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0KKwkvKgorCSAqIEZvcm0gdGhlIENUIElPQ0IuICBUaGUgdG90YWwgbnVtYmVyIG9mIEJERXMgaW4gdGhpcyBJT0NCCisJICogaXMgdGhlIHNpbmdsZSBjb21tYW5kIHBsdXMgcmVzcG9uc2UgY291bnQgZnJvbQorCSAqIGxwZmNfYWxsb2NfY3RfcnNwLgorCSAqLworCWNudCArPSAxOwogCXN0YXR1cyA9IGxwZmNfZ2VuX3JlcSh2cG9ydCwgYm1wLCBpbm1wLCBvdXRtcCwgY21wbCwgbmRscCwgMCwKLQkJCSAgICAgIGNudCsxLCAwLCByZXRyeSk7CisJCQkgICAgICBjbnQsIDAsIHJldHJ5KTsKIAlpZiAoc3RhdHVzKSB7CiAJCWxwZmNfZnJlZV9jdF9yc3AocGhiYSwgb3V0bXApOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTUwMSw2ICs1MzksOSBAQAogCQkJCQkJCVNMSV9DVE5TX0dGRl9JRCwKIAkJCQkJCQkwLCBEaWQpID09IDApCiAJCQkJCQkJdnBvcnQtPm51bV9kaXNjX25vZGVzKys7CisJCQkJCQllbHNlCisJCQkJCQkJbHBmY19zZXR1cF9kaXNjX25vZGUKKwkJCQkJCQkJKHZwb3J0LCBEaWQpOwogCQkJCQl9CiAJCQkJCWVsc2UgewogCQkJCQkJbHBmY19kZWJ1Z2ZzX2Rpc2NfdHJjKHZwb3J0LApAQCAtMTIwOSw3ICsxMjUwLDcgQEAKIAkJICAgIGJlMTZfdG9fY3B1KFNMSV9DVE5TX1JGRl9JRCk7CiAJCUN0UmVxLT51bi5yZmYuUG9ydElkID0gY3B1X3RvX2JlMzIodnBvcnQtPmZjX215RElEKTsKIAkJQ3RSZXEtPnVuLnJmZi5mYml0cyA9IEZDNF9GRUFUVVJFX0lOSVQ7Ci0JCUN0UmVxLT51bi5yZmYudHlwZV9jb2RlID0gRkNfRkNQX0RBVEE7CisJCUN0UmVxLT51bi5yZmYudHlwZV9jb2RlID0gRkNfVFlQRV9GQ1A7CiAJCWNtcGwgPSBscGZjX2NtcGxfY3RfY21kX3JmZl9pZDsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYwppbmRleCA4ZDBmMGRlLi4zOTE1ODQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYwpAQCAtOTI2LDcgKzkyNiw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogUm91bmQgdG8gcGFnZSBib3VuZHJ5ICovCi0JcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgJXM6IF9kdW1wX2J1Zl9kYXRhPTB4JXBcbiIsCisJcHJpbnRrKEtFUk5fRVJSICI5MDU5IEJMS0dSRDogICVzOiBfZHVtcF9idWZfZGF0YT0weCVwXG4iLAogCQkJX19mdW5jX18sIF9kdW1wX2J1Zl9kYXRhKTsKIAlkZWJ1Zy0+YnVmZmVyID0gX2R1bXBfYnVmX2RhdGE7CiAJaWYgKCFkZWJ1Zy0+YnVmZmVyKSB7CkBAIC05NTYsOCArOTU2LDggQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBSb3VuZCB0byBwYWdlIGJvdW5kcnkgKi8KLQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCAlczogX2R1bXBfYnVmX2RpZj0weCVwIGZpbGU9JXNcbiIsIF9fZnVuY19fLAotCSAgICAgICBfZHVtcF9idWZfZGlmLCBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXByaW50ayhLRVJOX0VSUgkiOTA2MCBCTEtHUkQ6ICVzOiBfZHVtcF9idWZfZGlmPTB4JXAgZmlsZT0lc1xuIiwKKwkJX19mdW5jX18sIF9kdW1wX2J1Zl9kaWYsIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJZGVidWctPmJ1ZmZlciA9IF9kdW1wX2J1Zl9kaWY7CiAJaWYgKCFkZWJ1Zy0+YnVmZmVyKSB7CiAJCWtmcmVlKGRlYnVnKTsKQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAJCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCk7CiAJCWlmICghdnBvcnQtPnZwb3J0X2RlYnVnZnNfcm9vdCkgewogCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCQkgIjA0MTcgQ2FudCBjcmVhdGUgZGVidWdmcyIpOworCQkJCQkgIjA0MTcgQ2FudCBjcmVhdGUgZGVidWdmc1xuIik7CiAJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKIAkJfQogCQlhdG9taWNfaW5jKCZwaGJhLT5kZWJ1Z2ZzX3Zwb3J0X2NvdW50KTsKQEAgLTE0MzAsNyArMTQzMCw3IEBACiAJCQkJIHZwb3J0LCAmbHBmY19kZWJ1Z2ZzX29wX25vZGVsaXN0KTsKIAlpZiAoIXZwb3J0LT5kZWJ1Z19ub2RlbGlzdCkgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCi0JCQkJICIwNDA5IENhbnQgY3JlYXRlIGRlYnVnZnMgbm9kZWxpc3QiKTsKKwkJCQkgIjA0MDkgQ2FudCBjcmVhdGUgZGVidWdmcyBub2RlbGlzdFxuIik7CiAJCWdvdG8gZGVidWdfZmFpbGVkOwogCX0KIGRlYnVnX2ZhaWxlZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGlzYy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKaW5kZXggMTE0MjA3MC4uMjg1MWQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKQEAgLTE5LDcgKzE5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIEZDX01BWF9IT0xEX1JTQ04gICAgIDMyCSAgICAgIC8qIG1heCBudW1iZXIgb2YgZGVmZXJyZWQgUlNDTnMgKi8KLSNkZWZpbmUgRkNfTUFYX05TX1JTUCAgICAgICAgNjU1MzYgICAgLyogbWF4IHNpemUgTmFtZVNlcnZlciByc3AgKi8KKyNkZWZpbmUgRkNfTUFYX05TX1JTUCAgICAgICAgNjQ1MTIgICAgLyogbWF4IHNpemUgTmFtZVNlcnZlciByc3AgKi8KICNkZWZpbmUgRkNfTUFYTE9PUCAgICAgICAgICAgMTI2ICAgICAgLyogbWF4IGRldmljZXMgc3VwcG9ydGVkIG9uIGEgZmMgbG9vcCAqLwogI2RlZmluZSBMUEZDX0RJU0NfRkxPR0lfVE1PICAxMAkgICAgICAvKiBEaXNjb3ZlcnkgRkxPR0kgcmF0b3YgKi8KIApAQCAtMTA1LDggKzEwNSw2IEBACiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0OwogCXN0cnVjdCBscGZjX3dvcmtfZXZ0IGVsc19yZXRyeV9ldnQ7CiAJc3RydWN0IGxwZmNfd29ya19ldnQgZGV2X2xvc3NfZXZ0OwotCXVuc2lnbmVkIGxvbmcgbGFzdF9yYW1wX3VwX3RpbWU7ICAgICAgICAvKiBqaWZmeSBvZiBsYXN0IHJhbXAgdXAgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfcV9mdWxsX3RpbWU7CQkvKiBqaWZmeSBvZiBsYXN0IHF1ZXVlIGZ1bGwgKi8KIAlzdHJ1Y3Qga3JlZiAgICAga3JlZjsKIAlhdG9taWNfdCBjbWRfcGVuZGluZzsKIAl1aW50MzJfdCBjbWRfcWRlcHRoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKaW5kZXggNDUzMzdjZC4uY2U1MjI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCkBAIC0xNzMsMTMgKzE3MywyNiBAQAogCSAqIGluIEZJUCBtb2RlIHNlbmQgRkxPR0ksIEZESVNDIGFuZCBMT0dPIGFzIEZJUCBmcmFtZXMuCiAJICovCiAJaWYgKChkaWQgPT0gRmFicmljX0RJRCkgJiYKLQkJYmZfZ2V0KGxwZmNfZmlwX2ZsYWcsICZwaGJhLT5zbGk0X2hiYS5zbGk0X2ZsYWdzKSAmJgorCQkocGhiYS0+aGJhX2ZsYWcgJiBIQkFfRklQX1NVUFBPUlQpICYmCiAJCSgoZWxzY21kID09IEVMU19DTURfRkxPR0kpIHx8CiAJCSAoZWxzY21kID09IEVMU19DTURfRkRJU0MpIHx8CiAJCSAoZWxzY21kID09IEVMU19DTURfTE9HTykpKQotCQllbHNpb2NiLT5pb2NiX2ZsYWcgfD0gTFBGQ19GSVBfRUxTOworCQlzd2l0Y2ggKGVsc2NtZCkgeworCQljYXNlIEVMU19DTURfRkxPR0k6CisJCWVsc2lvY2ItPmlvY2JfZmxhZyB8PSAoKEVMU19JRF9GTE9HSSA8PCBMUEZDX0ZJUF9FTFNfSURfU0hJRlQpCisJCQkJCSYgTFBGQ19GSVBfRUxTX0lEX01BU0spOworCQlicmVhazsKKwkJY2FzZSBFTFNfQ01EX0ZESVNDOgorCQllbHNpb2NiLT5pb2NiX2ZsYWcgfD0gKChFTFNfSURfRkRJU0MgPDwgTFBGQ19GSVBfRUxTX0lEX1NISUZUKQorCQkJCQkmIExQRkNfRklQX0VMU19JRF9NQVNLKTsKKwkJYnJlYWs7CisJCWNhc2UgRUxTX0NNRF9MT0dPOgorCQllbHNpb2NiLT5pb2NiX2ZsYWcgfD0gKChFTFNfSURfTE9HTyA8PCBMUEZDX0ZJUF9FTFNfSURfU0hJRlQpCisJCQkJCSYgTFBGQ19GSVBfRUxTX0lEX01BU0spOworCQlicmVhazsKKwkJfQogCWVsc2UKLQkJZWxzaW9jYi0+aW9jYl9mbGFnICY9IH5MUEZDX0ZJUF9FTFM7CisJCWVsc2lvY2ItPmlvY2JfZmxhZyAmPSB+TFBGQ19GSVBfRUxTX0lEX01BU0s7CiAKIAlpY21kID0gJmVsc2lvY2ItPmlvY2I7CiAKQEAgLTU5MSw3ICs2MDQsNyBAQAogCX0gZWxzZSB7CiAJCW5kbHAtPm5scF90eXBlIHw9IE5MUF9GQUJSSUM7CiAJCWxwZmNfbmxwX3NldF9zdGF0ZSh2cG9ydCwgbmRscCwgTkxQX1NURV9VTk1BUFBFRF9OT0RFKTsKLQkJaWYgKHZwb3J0LT52Zmlfc3RhdGUgJiBMUEZDX1ZGSV9SRUdJU1RFUkVEKSB7CisJCWlmICh2cG9ydC0+dnBpX3N0YXRlICYgTFBGQ19WUElfUkVHSVNURVJFRCkgewogCQkJbHBmY19zdGFydF9mZGlzY3MocGhiYSk7CiAJCQlscGZjX2RvX3Njcl9uc19wbG9naShwaGJhLCB2cG9ydCk7CiAJCX0gZWxzZQpAQCAtODAyLDcgKzgxNSw3IEBACiAKIAkvKiBGTE9HSSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5ICovCiAJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRUxTLAotCQkJICIwMTAxIEZMT0dJIGNvbXBsZXRlcyBzdWNlc3NmdWxseSAiCisJCQkgIjAxMDEgRkxPR0kgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSAiCiAJCQkgIkRhdGE6IHgleCB4JXggeCV4IHgleFxuIiwKIAkJCSBpcnNwLT51bi51bHBXb3JkWzRdLCBzcC0+Y21uLmVfZF90b3YsCiAJCQkgc3AtPmNtbi53Mi5yX2FfdG92LCBzcC0+Y21uLmVkdG92UmVzb2x1dGlvbik7CkBAIC0yNDUyLDYgKzI0NjUsNyBAQAogCSAqLwogCWRlbF90aW1lcl9zeW5jKCZuZGxwLT5ubHBfZGVsYXlmdW5jKTsKIAlyZXRyeSA9IG5kbHAtPm5scF9yZXRyeTsKKwluZGxwLT5ubHBfcmV0cnkgPSAwOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEVMU19DTURfRkxPR0k6CkBAIC0yNzExLDEyICsyNzI1LDE2IEBACiAJICAgICFscGZjX2Vycm9yX2xvc3RfbGluayhpcnNwKSkgewogCQkvKiBGTE9HSSByZXRyeSBwb2xpY3kgKi8KIAkJcmV0cnkgPSAxOwotCQltYXhyZXRyeSA9IDQ4OwotCQlpZiAoY21kaW9jYi0+cmV0cnkgPj0gMzIpCisJCS8qIHJldHJ5IGZvcmV2ZXIgKi8KKwkJbWF4cmV0cnkgPSAwOworCQlpZiAoY21kaW9jYi0+cmV0cnkgPj0gMTAwKQorCQkJZGVsYXkgPSA1MDAwOworCQllbHNlIGlmIChjbWRpb2NiLT5yZXRyeSA+PSAzMikKIAkJCWRlbGF5ID0gMTAwMDsKIAl9CiAKLQlpZiAoKCsrY21kaW9jYi0+cmV0cnkpID49IG1heHJldHJ5KSB7CisJY21kaW9jYi0+cmV0cnkrKzsKKwlpZiAobWF4cmV0cnkgJiYgKGNtZGlvY2ItPnJldHJ5ID49IG1heHJldHJ5KSkgewogCQlwaGJhLT5mY19zdGF0LmVsc1JldHJ5RXhjZWVkZWQrKzsKIAkJcmV0cnkgPSAwOwogCX0KQEAgLTQxMzMsNyArNDE1MSw3IEBACiAJLyogSW5kaWNhdGUgd2UgYXJlIHdhbGtpbmcgZmNfcnNjbl9pZF9saXN0IG9uIHRoaXMgdnBvcnQgKi8KIAl2cG9ydC0+ZmNfcnNjbl9mbHVzaCA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwotCS8qIEdldCB0aGUgYXJyYXkgY291bnQgYWZ0ZXIgc3VjZXNzZnVsbHkgaGF2ZSB0aGUgdG9rZW4gKi8KKwkvKiBHZXQgdGhlIGFycmF5IGNvdW50IGFmdGVyIHN1Y2Nlc3NmdWxseSBoYXZlIHRoZSB0b2tlbiAqLwogCXJzY25fY250ID0gdnBvcnQtPmZjX3JzY25faWRfY250OwogCS8qIElmIHdlIGFyZSBhbHJlYWR5IHByb2Nlc3NpbmcgYW4gUlNDTiwgc2F2ZSB0aGUgcmVjZWl2ZWQKIAkgKiBSU0NOIHBheWxvYWQgYnVmZmVyLCBjbWRpb2NiLT5jb250ZXh0MiB0byBwcm9jZXNzIGxhdGVyLgpAQCAtNDUwMyw2ICs0NTIxLDI5IEBACiB9CiAKIC8qKgorICogbHBmY19lbHNfcmN2X3JycSAtIFByb2Nlc3MgYW4gdW5zb2xpY2l0ZWQgcnJxIGlvY2IKKyAqIEB2cG9ydDogcG9pbnRlciB0byBhIGhvc3QgdmlydHVhbCBOX1BvcnQgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAY21kaW9jYjogcG9pbnRlciB0byBscGZjIGNvbW1hbmQgaW9jYiBkYXRhIHN0cnVjdHVyZS4KKyAqIEBuZGxwOiBwb2ludGVyIHRvIGEgbm9kZS1saXN0IGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBwcm9jZXNzZXMgYSBSZWluc3RhdGUgUmVjb3ZlcnkgUXVhbGlmaWVyIChSUlEpIElPQ0IKKyAqIHJlY2VpdmVkIGFzIGFuIEVMUyB1bnNvbGljaXRlZCBldmVudC4gQSByZXF1ZXN0IHRvIFJSUSBzaGFsbCBvbmx5CisgKiBiZSBhY2NlcHRlZCBpZiB0aGUgT3JpZ2luYXRvciBOeF9Qb3J0IE5fUG9ydF9JRCBvciB0aGUgUmVzcG9uZGVyCisgKiBOeF9Qb3J0IE5fUG9ydF9JRCBvZiB0aGUgdGFyZ2V0IEV4Y2hhbmdlIGlzIHRoZSBzYW1lIGFzIHRoZQorICogTl9Qb3J0X0lEIG9mIHRoZSBOeF9Qb3J0IHRoYXQgbWFrZXMgdGhlIHJlcXVlc3QuIElmIHRoZSBSUlEgaXMKKyAqIG5vdCBhY2NlcHRlZCwgYW4gTFNfUkpUIHdpdGggcmVhc29uIGNvZGUgIlVuYWJsZSB0byBwZXJmb3JtCisgKiBjb21tYW5kIHJlcXVlc3QiIGFuZCByZWFzb24gY29kZSBleHBsYW5hdGlvbiAiSW52YWxpZCBPcmlnaW5hdG9yCisgKiBTX0lEIiBzaGFsbCBiZSByZXR1cm5lZC4gRm9yIG5vdywgd2UganVzdCB1bmNvbmRpdGlvbmFsbHkgYWNjZXB0CisgKiBSUlEgZnJvbSB0aGUgdGFyZ2V0LgorICoqLworc3RhdGljIHZvaWQKK2xwZmNfZWxzX3Jjdl9ycnEoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LCBzdHJ1Y3QgbHBmY19pb2NicSAqY21kaW9jYiwKKwkJIHN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwKQoreworCWxwZmNfZWxzX3JzcF9hY2ModnBvcnQsIEVMU19DTURfQUNDLCBjbWRpb2NiLCBuZGxwLCBOVUxMKTsKK30KKworLyoqCiAgKiBscGZjX2Vsc19yc3BfcnBzX2FjYyAtIENvbXBsZXRpb24gY2FsbGJrIGZ1bmMgZm9yIE1CWF9SRUFEX0xOS19TVEFUIG1ib3ggY21kCiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KICAqIEBwbWI6IHBvaW50ZXIgdG8gdGhlIGRyaXZlciBpbnRlcm5hbCBxdWV1ZSBlbGVtZW50IGZvciBtYWlsYm94IGNvbW1hbmQuCkBAIC01Mzk2LDcgKzU0MzcsNyBAQAogCWlmIChscGZjX2Vsc19jaGtfbGF0dCh2cG9ydCkpCiAJCWdvdG8gZHJvcGl0OwogCi0JLyogSWdub3JlIHRyYWZmaWMgcmVjZXZpZWQgZHVyaW5nIHZwb3J0IHNodXRkb3duLiAqLworCS8qIElnbm9yZSB0cmFmZmljIHJlY2VpdmVkIGR1cmluZyB2cG9ydCBzaHV0ZG93bi4gKi8KIAlpZiAodnBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykKIAkJZ290byBkcm9waXQ7CiAKQEAgLTU2MTgsNiArNTY1OSwxNiBAQAogCQlpZiAobmV3bm9kZSkKIAkJCWxwZmNfbmxwX3B1dChuZGxwKTsKIAkJYnJlYWs7CisJY2FzZSBFTFNfQ01EX1JSUToKKwkJbHBmY19kZWJ1Z2ZzX2Rpc2NfdHJjKHZwb3J0LCBMUEZDX0RJU0NfVFJDX0VMU19VTlNPTCwKKwkJCSJSQ1YgUlJROiAgICAgICAgIGRpZDp4JXgvc3RlOngleCBmbGc6eCV4IiwKKwkJCWRpZCwgdnBvcnQtPnBvcnRfc3RhdGUsIG5kbHAtPm5scF9mbGFnKTsKKworCQlwaGJhLT5mY19zdGF0LmVsc1JjdlJSUSsrOworCQlscGZjX2Vsc19yY3ZfcnJxKHZwb3J0LCBlbHNpb2NiLCBuZGxwKTsKKwkJaWYgKG5ld25vZGUpCisJCQlscGZjX25scF9wdXQobmRscCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWxwZmNfZGVidWdmc19kaXNjX3RyYyh2cG9ydCwgTFBGQ19ESVNDX1RSQ19FTFNfVU5TT0wsCiAJCQkiUkNWIEVMUyBjbWQ6ICAgICBjbWQ6eCV4IGRpZDp4JXgvc3RlOngleCIsCkBAIC01NjcwLDcgKzU3MjEsNyBAQAogICogICAgTlVMTCAtIE5vIHZwb3J0IHdpdGggdGhlIG1hdGNoaW5nIEB2cGkgZm91bmQKICAqICAgIE90aGVyd2lzZSAtIEFkZHJlc3MgdG8gdGhlIHZwb3J0IHdpdGggdGhlIG1hdGNoaW5nIEB2cGkuCiAgKiovCi1zdGF0aWMgc3RydWN0IGxwZmNfdnBvcnQgKgorc3RydWN0IGxwZmNfdnBvcnQgKgogbHBmY19maW5kX3Zwb3J0X2J5X3ZwaWQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MTZfdCB2cGkpCiB7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0OwpAQCAtNjAyNCwxMSArNjA3NSw2IEBACiAJCQkJIGlyc3AtPnVscFN0YXR1cywgaXJzcC0+dW4udWxwV29yZFs0XSk7CiAJCWdvdG8gZmRpc2NfZmFpbGVkOwogCX0KLQkJaWYgKHZwb3J0LT5mY192cG9ydC0+dnBvcnRfc3RhdGUgPT0gRkNfVlBPUlRfSU5JVElBTElaSU5HKQotCQkJbHBmY192cG9ydF9zZXRfc3RhdGUodnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7Ci0JCWxwZmNfbmxwX3B1dChuZGxwKTsKLQkJLyogZ2l2aW5nIHVwIG9uIEZESVNDLiBDYW5jZWwgZGlzY292ZXJ5IHRpbWVyICovCi0JCWxwZmNfY2FuX2Rpc2N0bW8odnBvcnQpOwogCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CiAJdnBvcnQtPmZjX2ZsYWcgfD0gRkNfRkFCUklDOwogCWlmICh2cG9ydC0+cGhiYS0+ZmNfdG9wb2xvZ3kgPT0gVE9QT0xPR1lfTE9PUCkKQEAgLTYxMDcsNiArNjE1Myw3IEBACiAJaW50IGRpZCA9IG5kbHAtPm5scF9ESUQ7CiAJaW50IHJjOwogCisJdnBvcnQtPnBvcnRfc3RhdGUgPSBMUEZDX0ZESVNDOwogCWNtZHNpemUgPSAoc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihzdHJ1Y3Qgc2Vydl9wYXJtKSk7CiAJZWxzaW9jYiA9IGxwZmNfcHJlcF9lbHNfaW9jYih2cG9ydCwgMSwgY21kc2l6ZSwgcmV0cnksIG5kbHAsIGRpZCwKIAkJCQkgICAgIEVMU19DTURfRkRJU0MpOwpAQCAtNjE3Miw3ICs2MjE5LDYgQEAKIAkJcmV0dXJuIDE7CiAJfQogCWxwZmNfdnBvcnRfc2V0X3N0YXRlKHZwb3J0LCBGQ19WUE9SVF9JTklUSUFMSVpJTkcpOwotCXZwb3J0LT5wb3J0X3N0YXRlID0gTFBGQ19GRElTQzsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGU2YTQ3ZTIuLjNiOTQyNDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKQEAgLTUyNSw4ICs1MjUsNiBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJCWxwZmNfc2xpX2hicWJ1Zl9hZGRfaGJxcyhwaGJhLCBMUEZDX0VMU19IQlEpOwogCQl9Ci0JCWlmIChwaGJhLT5oYmFfZmxhZyAmIEhCQV9SRUNFSVZFX0JVRkZFUikKLQkJCWxwZmNfc2xpNF9oYW5kbGVfcmVjZWl2ZWRfYnVmZmVyKHBoYmEpOwogCX0KIAogCXZwb3J0cyA9IGxwZmNfY3JlYXRlX3Zwb3J0X3dvcmtfYXJyYXkocGhiYSk7CkBAIC01NjgsOCArNTY2LDkgQEAKIAlwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKIAlzdGF0dXMgPSAoaGFfY29weSAmIChIQV9SWE1BU0sgIDw8ICg0KkxQRkNfRUxTX1JJTkcpKSk7CiAJc3RhdHVzID4+PSAoNCpMUEZDX0VMU19SSU5HKTsKLQlpZiAoKHN0YXR1cyAmIEhBX1JYTUFTSykKLQkJfHwgKHByaW5nLT5mbGFnICYgTFBGQ19ERUZFUlJFRF9SSU5HX0VWRU5UKSkgeworCWlmICgoc3RhdHVzICYgSEFfUlhNQVNLKSB8fAorCSAgICAocHJpbmctPmZsYWcgJiBMUEZDX0RFRkVSUkVEX1JJTkdfRVZFTlQpIHx8CisJICAgIChwaGJhLT5oYmFfZmxhZyAmIEhCQV9TUF9RVUVVRV9FVlQpKSB7CiAJCWlmIChwcmluZy0+ZmxhZyAmIExQRkNfU1RPUF9JT0NCX0VWRU5UKSB7CiAJCQlwcmluZy0+ZmxhZyB8PSBMUEZDX0RFRkVSUkVEX1JJTkdfRVZFTlQ7CiAJCQkvKiBTZXQgdGhlIGxwZmMgZGF0YSBwZW5kaW5nIGZsYWcgKi8KQEAgLTY4OCw3ICs2ODcsOCBAQAogCQkJbHBmY191bnJlZ19ycGkodnBvcnQsIG5kbHApOwogCiAJCS8qIExlYXZlIEZhYnJpYyBub2RlcyBhbG9uZSBvbiBsaW5rIGRvd24gKi8KLQkJaWYgKCFyZW1vdmUgJiYgbmRscC0+bmxwX3R5cGUgJiBOTFBfRkFCUklDKQorCQlpZiAoKHBoYmEtPnNsaV9yZXYgPCBMUEZDX1NMSV9SRVY0KSAmJgorCQkgICAgKCFyZW1vdmUgJiYgbmRscC0+bmxwX3R5cGUgJiBOTFBfRkFCUklDKSkKIAkJCWNvbnRpbnVlOwogCQlyYyA9IGxwZmNfZGlzY19zdGF0ZV9tYWNoaW5lKHZwb3J0LCBuZGxwLCBOVUxMLAogCQkJCQkgICAgIHJlbW92ZQpAQCAtNzA2LDYgKzcwNiw5IEBACiB2b2lkCiBscGZjX3BvcnRfbGlua19mYWlsdXJlKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCkKIHsKKwkvKiBDbGVhbnVwIGFueSBvdXRzdGFuZGluZyByZWNlaXZlZCBidWZmZXJzICovCisJbHBmY19jbGVhbnVwX3Jjdl9idWZmZXJzKHZwb3J0KTsKKwogCS8qIENsZWFudXAgYW55IG91dHN0YW5kaW5nIFJTQ04gYWN0aXZpdHkgKi8KIAlscGZjX2Vsc19mbHVzaF9yc2NuKHZwb3J0KTsKIApAQCAtMTAxNSwxMyArMTAxOCwxMiBAQAogCQltZW1wb29sX2ZyZWUobWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCQlyZXR1cm47CiAJfQotCWlmICh2cG9ydC0+cG9ydF9zdGF0ZSAhPSBMUEZDX0ZMT0dJKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7Ci0JCXBoYmEtPmZjZi5mY2ZfZmxhZyB8PSAoRkNGX0RJU0NPVkVSRUQgfCBGQ0ZfSU5fVVNFKTsKLQkJcGhiYS0+aGJhX2ZsYWcgJj0gfkZDRl9ESVNDX0lOUFJPR1JFU1M7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOworCXBoYmEtPmZjZi5mY2ZfZmxhZyB8PSAoRkNGX0RJU0NPVkVSRUQgfCBGQ0ZfSU5fVVNFKTsKKwlwaGJhLT5oYmFfZmxhZyAmPSB+RkNGX0RJU0NfSU5QUk9HUkVTUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7CisJaWYgKHZwb3J0LT5wb3J0X3N0YXRlICE9IExQRkNfRkxPR0kpCiAJCWxwZmNfaW5pdGlhbF9mbG9naSh2cG9ydCk7Ci0JfQogCiAJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKIAlyZXR1cm47CkBAIC0xMTk5LDYgKzEyMDEsNyBAQAogCiAJLyogSWYgdGhlIEZDRiBpcyBub3QgYXZhaWxhYmUgZG8gbm90aGluZy4gKi8KIAlpZiAoIShwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfQVZBSUxBQkxFKSkgeworCQlwaGJhLT5oYmFfZmxhZyAmPSB+RkNGX0RJU0NfSU5QUk9HUkVTUzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtMTIxNiwxNSArMTIxOSwyMyBAQAogCiAJZmNmX21ieHEgPSBtZW1wb29sX2FsbG9jKHBoYmEtPm1ib3hfbWVtX3Bvb2wsCiAJCUdGUF9LRVJORUwpOwotCWlmICghZmNmX21ieHEpCisJaWYgKCFmY2ZfbWJ4cSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOworCQlwaGJhLT5oYmFfZmxhZyAmPSB+RkNGX0RJU0NfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CisJfQogCiAJbHBmY19yZWdfZmNmaShwaGJhLCBmY2ZfbWJ4cSk7CiAJZmNmX21ieHEtPnZwb3J0ID0gcGhiYS0+cHBvcnQ7CiAJZmNmX21ieHEtPm1ib3hfY21wbCA9IGxwZmNfbWJ4X2NtcGxfcmVnX2ZjZmk7CiAJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIGZjZl9tYnhxLCBNQlhfTk9XQUlUKTsKLQlpZiAocmMgPT0gTUJYX05PVF9GSU5JU0hFRCkKKwlpZiAocmMgPT0gTUJYX05PVF9GSU5JU0hFRCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOworCQlwaGJhLT5oYmFfZmxhZyAmPSB+RkNGX0RJU0NfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwogCQltZW1wb29sX2ZyZWUoZmNmX21ieHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOworCX0KIAogCXJldHVybjsKIH0KQEAgLTEyNTMsMTMgKzEyNjQsMjcgQEAKIAkJCXVpbnQxNl90ICp2bGFuX2lkKQogewogCXN0cnVjdCBscGZjX2ZjZl9jb25uX2VudHJ5ICpjb25uX2VudHJ5OworCWludCBpLCBqLCBmY2Zfdmxhbl9pZCA9IDA7CisKKwkvKiBGaW5kIHRoZSBsb3dlc3QgVkxBTiBpZCBpbiB0aGUgRkNGIHJlY29yZCAqLworCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQlpZiAobmV3X2ZjZl9yZWNvcmQtPnZsYW5fYml0bWFwW2ldKSB7CisJCQlmY2Zfdmxhbl9pZCA9IGkgKiA4OworCQkJaiA9IDA7CisJCQl3aGlsZSAoISgobmV3X2ZjZl9yZWNvcmQtPnZsYW5fYml0bWFwW2ldID4+IGopICYgMSkpIHsKKwkJCQlqKys7CisJCQkJZmNmX3ZsYW5faWQrKzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQogCiAJLyogSWYgRkNGIG5vdCBhdmFpbGFibGUgcmV0dXJuIDAgKi8KIAlpZiAoIWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX2F2YWlsLCBuZXdfZmNmX3JlY29yZCkgfHwKIAkJIWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX3ZhbGlkLCBuZXdfZmNmX3JlY29yZCkpCiAJCXJldHVybiAwOwogCi0JaWYgKCFwaGJhLT5jZmdfZW5hYmxlX2ZpcCkgeworCWlmICghKHBoYmEtPmhiYV9mbGFnICYgSEJBX0ZJUF9TVVBQT1JUKSkgewogCQkqYm9vdF9mbGFnID0gMDsKIAkJKmFkZHJfbW9kZSA9IGJmX2dldChscGZjX2ZjZl9yZWNvcmRfbWFjX2FkZHJfcHJvdiwKIAkJCQluZXdfZmNmX3JlY29yZCk7CkBAIC0xMjg2LDcgKzEzMTEsMTEgQEAKIAkJaWYgKCphZGRyX21vZGUgJiBMUEZDX0ZDRl9GUE1BKQogCQkJKmFkZHJfbW9kZSA9IExQRkNfRkNGX0ZQTUE7CiAKLQkJKnZsYW5faWQgPSAweEZGRkY7CisJCS8qIElmIEZDRiByZWNvcmQgcmVwb3J0IGEgdmxhbiBpZCB1c2UgdGhhdCB2bGFuIGlkICovCisJCWlmIChmY2Zfdmxhbl9pZCkKKwkJCSp2bGFuX2lkID0gZmNmX3ZsYW5faWQ7CisJCWVsc2UKKwkJCSp2bGFuX2lkID0gMHhGRkZGOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTEzODQsOCArMTQxMywxNSBAQAogCQkJKCphZGRyX21vZGUgJiBMUEZDX0ZDRl9GUE1BKSkKIAkJCQkqYWRkcl9tb2RlID0gTFBGQ19GQ0ZfRlBNQTsKIAorCQkvKiBJZiBtYXRjaGluZyBjb25uZWN0IGxpc3QgaGFzIGEgdmxhbiBpZCwgdXNlIGl0ICovCiAJCWlmIChjb25uX2VudHJ5LT5jb25uX3JlYy5mbGFncyAmIEZDRkNOQ1RfVkxBTl9WQUxJRCkKIAkJCSp2bGFuX2lkID0gY29ubl9lbnRyeS0+Y29ubl9yZWMudmxhbl90YWc7CisJCS8qCisJCSAqIElmIG5vIHZsYW4gaWQgaXMgc3BlY2lmaWVkIGluIGNvbm5lY3QgbGlzdCwgdXNlIHRoZSB2bGFuIGlkCisJCSAqIGluIHRoZSBGQ0YgcmVjb3JkCisJCSAqLworCQllbHNlIGlmIChmY2Zfdmxhbl9pZCkKKwkJCSp2bGFuX2lkID0gZmNmX3ZsYW5faWQ7CiAJCWVsc2UKIAkJCSp2bGFuX2lkID0gMHhGRkZGOwogCkBAIC0xNDIzLDYgKzE0NTksMTUgQEAKIAogCWlmIChwaGJhLT5saW5rX3N0YXRlID49IExQRkNfTElOS19VUCkKIAkJbHBmY19zbGk0X3JlYWRfZmNmX3JlY29yZChwaGJhLCBMUEZDX0ZDT0VfRkNGX0dFVF9GSVJTVCk7CisJZWxzZSB7CisJCS8qCisJCSAqIERvIG5vdCBjb250aW51ZSBGQ0YgZGlzY292ZXJ5IGFuZCBjbGVhciBGQ0ZfRElTQ19JTlBST0dSRVNTCisJCSAqIGZsYWcKKwkJICovCisJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQlwaGJhLT5oYmFfZmxhZyAmPSB+RkNGX0RJU0NfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwl9CiAKIAlpZiAodW5yZWdfZmNmKSB7CiAJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwpAQCAtMTY1OSw5ICsxNzA0LDggQEAKIAkJbHBmY19pbml0aWFsX2ZkaXNjKHZwb3J0KTsKIAllbHNlIHsKIAkJbHBmY192cG9ydF9zZXRfc3RhdGUodnBvcnQsIEZDX1ZQT1JUX05PX0ZBQlJJQ19TVVBQKTsKLQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsCi0JCQlMT0dfRUxTLAotCQkJIjI2MDYgTm8gTlBJViBGYWJyaWMgc3VwcG9ydFxuIik7CisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRUxTLAorCQkJCSAiMjYwNiBObyBOUElWIEZhYnJpYyBzdXBwb3J0XG4iKTsKIAl9CiAJcmV0dXJuOwogfQpAQCAtMTc1Niw4ICsxODAwLDggQEAKIAkJbHBmY192cG9ydF9zZXRfc3RhdGUodnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7CiAJCWdvdG8gZmFpbF9mcmVlX21lbTsKIAl9Ci0JLyogTWFyayB0aGUgdnBvcnQgaGFzIHJlZ2lzdGVyZWQgd2l0aCBpdHMgVkZJICovCi0JdnBvcnQtPnZmaV9zdGF0ZSB8PSBMUEZDX1ZGSV9SRUdJU1RFUkVEOworCS8qIFRoZSBWUEkgaXMgaW1wbGljaXRseSByZWdpc3RlcmVkIHdoZW4gdGhlIFZGSSBpcyByZWdpc3RlcmVkICovCisJdnBvcnQtPnZwaV9zdGF0ZSB8PSBMUEZDX1ZQSV9SRUdJU1RFUkVEOwogCiAJaWYgKHZwb3J0LT5wb3J0X3N0YXRlID09IExQRkNfRkFCUklDX0NGR19MSU5LKSB7CiAJCWxwZmNfc3RhcnRfZmRpc2NzKHBoYmEpOwpAQCAtMTg2MSw3ICsxOTA1LDEwIEBACiAJaWYgKHBoYmEtPmZjX3RvcG9sb2d5ID09IFRPUE9MT0dZX0xPT1ApIHsKIAkJcGhiYS0+c2xpM19vcHRpb25zICY9IH5MUEZDX1NMSTNfTlBJVl9FTkFCTEVEOwogCi0JCWlmIChwaGJhLT5jZmdfZW5hYmxlX25waXYpCisJCS8qIGlmIG5waXYgaXMgZW5hYmxlZCBhbmQgdGhpcyBhZGFwdGVyIHN1cHBvcnRzIG5waXYgbG9nCisJCSAqIGEgbWVzc2FnZSB0aGF0IG5waXYgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHRvcG9sb2d5CisJCSAqLworCQlpZiAocGhiYS0+Y2ZnX2VuYWJsZV9ucGl2ICYmIHBoYmEtPm1heF92cGkpCiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19MSU5LX0VWRU5ULAogCQkJCSIxMzA5IExpbmsgVXAgRXZlbnQgbnBpdiBub3Qgc3VwcG9ydGVkIGluIGxvb3AgIgogCQkJCSJ0b3BvbG9neVxuIik7CkBAIC0xOTU1LDcgKzIwMDIsNyBAQAogCQkgKiBpcyBwaGFzZSAxIGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydCBGQ0YgaW5kZXggMCBhbmQgZHJpdmVyCiAJCSAqIGRlZmF1bHRzLgogCQkgKi8KLQkJaWYgKHBoYmEtPmNmZ19lbmFibGVfZmlwID09IDApIHsKKwkJaWYgKCEocGhiYS0+aGJhX2ZsYWcgJiBIQkFfRklQX1NVUFBPUlQpKSB7CiAJCQlmY2ZfcmVjb3JkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZjZl9yZWNvcmQpLAogCQkJCQlHRlBfS0VSTkVMKTsKIAkJCWlmICh1bmxpa2VseSghZmNmX3JlY29yZCkpIHsKQEAgLTIwODUsNiArMjEzMiw3IEBACiAJZWxzZQogCQlwaGJhLT5zbGkuc2xpX2ZsYWcgJj0gfkxQRkNfTUVOTE9fTUFJTlQ7CiAKKwlwaGJhLT5saW5rX2V2ZW50cysrOwogCWlmIChsYS0+YXR0VHlwZSA9PSBBVF9MSU5LX1VQICYmICghbGEtPm1tKSkgewogCQlwaGJhLT5mY19zdGF0LkxpbmtVcCsrOwogCQlpZiAocGhiYS0+bGlua19mbGFnICYgTFNfTE9PUEJBQ0tfTU9ERSkgewpAQCAtMjIxMSwxMyArMjI1OSwxNCBAQAogCQkJCSBtYi0+bWJ4U3RhdHVzKTsKIAkJYnJlYWs7CiAJfQorCXZwb3J0LT52cGlfc3RhdGUgJj0gfkxQRkNfVlBJX1JFR0lTVEVSRUQ7CiAJdnBvcnQtPnVucmVnX3ZwaV9jbXBsID0gVlBPUlRfT0s7CiAJbWVtcG9vbF9mcmVlKHBtYiwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJLyoKIAkgKiBUaGlzIHNob3N0IHJlZmVyZW5jZSBtaWdodCBoYXZlIGJlZW4gdGFrZW4gYXQgdGhlIGJlZ2lubmluZyBvZgogCSAqIGxwZmNfdnBvcnRfZGVsZXRlKCkKIAkgKi8KLQlpZiAodnBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykKKwlpZiAoKHZwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpICYmICh2cG9ydCAhPSBwaGJhLT5wcG9ydCkpCiAJCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwogfQogCkBAIC0yMjY4LDYgKzIzMTcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwl2cG9ydC0+dnBpX3N0YXRlIHw9IExQRkNfVlBJX1JFR0lTVEVSRUQ7CiAJdnBvcnQtPm51bV9kaXNjX25vZGVzID0gMDsKIAkvKiBnbyB0aHJ1IE5QUiBsaXN0IGFuZCBpc3N1ZSBFTFMgUExPR0lzICovCiAJaWYgKHZwb3J0LT5mY19ucHJfY250KQpAQCAtMzA3Nyw3ICszMTI3LDcgQEAKIAlzdHJ1Y3QgbHBmY19zbGkgKnBzbGk7CiAJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nOwogCXN0cnVjdCBscGZjX2lvY2JxICppb2NiLCAqbmV4dF9pb2NiOwotCXVpbnQzMl90IHJwaSwgaTsKKwl1aW50MzJfdCBpOwogCiAJbHBmY19mYWJyaWNfYWJvcnRfbnBvcnQobmRscCk7CiAKQEAgLTMwODYsNyArMzEzNiw2IEBACiAJICogYnkgZmlybXdhcmUgd2l0aCBhIG5vIHJwaSBlcnJvci4KIAkgKi8KIAlwc2xpID0gJnBoYmEtPnNsaTsKLQlycGkgPSBuZGxwLT5ubHBfcnBpOwogCWlmIChuZGxwLT5ubHBfZmxhZyAmIE5MUF9SUElfVkFMSUQpIHsKIAkJLyogTm93IHByb2Nlc3MgZWFjaCByaW5nICovCiAJCWZvciAoaSA9IDA7IGkgPCBwc2xpLT5udW1fcmluZ3M7IGkrKykgewpAQCAtNDMyMiw2ICs0MzcxLDE0IEBACiAJCQkJcmV0ID0gMTsKIAkJCQlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CiAJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19FTFMsCisJCQkJCSIyNjI0IFJQSSAleCBESUQgJXggZmxnICV4IHN0aWxsICIKKwkJCQkJImxvZ2dlZCBpblxuIiwKKwkJCQkJbmRscC0+bmxwX3JwaSwgbmRscC0+bmxwX0RJRCwKKwkJCQkJbmRscC0+bmxwX2ZsYWcpOworCQkJCWlmIChuZGxwLT5ubHBfZmxhZyAmIE5MUF9SUElfVkFMSUQpCisJCQkJCXJldCA9IDE7CiAJCQl9CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwpAQCAtNDQwMCw3ICs0NDU3LDcgQEAKIAkgKi8KIAlpZiAoIShwaGJhLT5oYmFfZmxhZyAmIEhCQV9GQ09FX1NVUFBPUlQpIHx8CiAJCSEocGhiYS0+ZmNmLmZjZl9mbGFnICYgRkNGX1JFR0lTVEVSRUQpIHx8Ci0JCShwaGJhLT5jZmdfZW5hYmxlX2ZpcCA9PSAwKSkgeworCQkoIShwaGJhLT5oYmFfZmxhZyAmIEhCQV9GSVBfU1VQUE9SVCkpKSB7CiAJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCXJldHVybjsKIAl9CkBAIC00NDA5LDYgKzQ0NjYsOCBAQAogCWlmIChscGZjX2ZjZl9pbnVzZShwaGJhKSkKIAkJcmV0dXJuOwogCisJLyogQXQgdGhpcyBwb2ludCwgYWxsIGRpc2NvdmVyeSBpcyBhYm9ydGVkICovCisJcGhiYS0+cHBvcnQtPnBvcnRfc3RhdGUgPSBMUEZDX1ZQT1JUX1VOS05PV047CiAKIAkvKiBVbnJlZ2lzdGVyIFZQSXMgKi8KIAl2cG9ydHMgPSBscGZjX2NyZWF0ZV92cG9ydF93b3JrX2FycmF5KHBoYmEpOwpAQCAtNDQxNiw4ICs0NDc1LDggQEAKIAkJKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19OUElWX0VOQUJMRUQpKQogCQlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm1heF92cG9ydHMgJiYgdnBvcnRzW2ldICE9IE5VTEw7IGkrKykgewogCQkJbHBmY19tYnhfdW5yZWdfdnBpKHZwb3J0c1tpXSk7Ci0JCQl2cG9ydHNbaV0tPmZjX2ZsYWcgfD0gRkNfVlBPUlRfTkVFRFNfUkVHX1ZQSTsKLQkJCXZwb3J0c1tpXS0+dmZpX3N0YXRlICY9IH5MUEZDX1ZGSV9SRUdJU1RFUkVEOworCQkJdnBvcnRzW2ldLT5mY19mbGFnIHw9IEZDX1ZQT1JUX05FRURTX0lOSVRfVlBJOworCQkJdnBvcnRzW2ldLT52cGlfc3RhdGUgJj0gfkxQRkNfVlBJX1JFR0lTVEVSRUQ7CiAJCX0KIAlscGZjX2Rlc3Ryb3lfdnBvcnRfd29ya19hcnJheShwaGJhLCB2cG9ydHMpOwogCkBAIC00NDMxLDcgKzQ0OTAsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JbHBmY191bnJlZ192ZmkobWJveCwgcGhiYS0+cHBvcnQtPnZmaSk7CisJbHBmY191bnJlZ192ZmkobWJveCwgcGhiYS0+cHBvcnQpOwogCW1ib3gtPnZwb3J0ID0gcGhiYS0+cHBvcnQ7CiAJbWJveC0+bWJveF9jbXBsID0gbHBmY191bnJlZ2lzdGVyX3ZmaV9jbXBsOwogCkBAIC00NTEyLDggKzQ1NzEsMTAgQEAKIAogCS8qIEZyZWUgdGhlIGN1cnJlbnQgY29ubmVjdCB0YWJsZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb25uX2VudHJ5LCBuZXh0X2Nvbm5fZW50cnksCi0JCSZwaGJhLT5mY2ZfY29ubl9yZWNfbGlzdCwgbGlzdCkKKwkJJnBoYmEtPmZjZl9jb25uX3JlY19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNvbm5fZW50cnktPmxpc3QpOwogCQlrZnJlZShjb25uX2VudHJ5KTsKKwl9CiAKIAljb25uX2hkciA9IChzdHJ1Y3QgbHBmY19mY2ZfY29ubl9oZHIgKikgYnVmZjsKIAlyZWNvcmRfY291bnQgPSBjb25uX2hkci0+bGVuZ3RoICogc2l6ZW9mKHVpbnQzMl90KS8KQEAgLTQ1NjksMTQgKzQ2MzAsNiBAQAogCQkoZmNvZV9wYXJhbV9oZHItPmxlbmd0aCAhPSBGQ09FX1BBUkFNX0xFTkdUSCkpCiAJCXJldHVybjsKIAotCWlmIChiZl9nZXQobHBmY19maXBfcGFyYW1faGRyX2ZpcHBfbW9kZSwgZmNvZV9wYXJhbV9oZHIpID09Ci0JCQlGSVBQX01PREVfT04pCi0JCXBoYmEtPmNmZ19lbmFibGVfZmlwID0gMTsKLQotCWlmIChiZl9nZXQobHBmY19maXBfcGFyYW1faGRyX2ZpcHBfbW9kZSwgZmNvZV9wYXJhbV9oZHIpID09Ci0JCUZJUFBfTU9ERV9PRkYpCi0JCXBoYmEtPmNmZ19lbmFibGVfZmlwID0gMDsKLQogCWlmIChmY29lX3BhcmFtX2hkci0+cGFybV9mbGFncyAmIEZJUFBfVkxBTl9WQUxJRCkgewogCQlwaGJhLT52YWxpZF92bGFuID0gMTsKIAkJcGhiYS0+dmxhbl9pZCA9IGxlMTZfdG9fY3B1KGZjb2VfcGFyYW0tPnZsYW5fdGFnKSAmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKaW5kZXggY2NiMjY3Mi4uYzlmYWExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaApAQCAtMTEyNCwyMSArMTEyNCw2IEBACiAvKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIGFuIElPQ0IuICovCiAjZGVmaW5lIElPQ0JfV09SRF9TWiAgICA4CiAKLS8qIGRlZmluZXMgZm9yIHR5cGUgZmllbGQgaW4gZmMgaGVhZGVyICovCi0jZGVmaW5lIEZDX0VMU19EQVRBICAgICAweDEKLSNkZWZpbmUgRkNfTExDX1NOQVAgICAgIDB4NQotI2RlZmluZSBGQ19GQ1BfREFUQSAgICAgMHg4Ci0jZGVmaW5lIEZDX0NPTU1PTl9UUkFOU1BPUlRfVUxQIDB4MjAKLQotLyogZGVmaW5lcyBmb3IgcmN0bCBmaWVsZCBpbiBmYyBoZWFkZXIgKi8KLSNkZWZpbmUgRkNfREVWX0RBVEEgICAgIDB4MAotI2RlZmluZSBGQ19VTlNPTF9DVEwgICAgMHgyCi0jZGVmaW5lIEZDX1NPTF9DVEwgICAgICAweDMKLSNkZWZpbmUgRkNfVU5TT0xfREFUQSAgIDB4NAotI2RlZmluZSBGQ19GQ1BfQ01ORCAgICAgMHg2Ci0jZGVmaW5lIEZDX0VMU19SRVEgICAgICAweDIyCi0jZGVmaW5lIEZDX0VMU19SU1AgICAgICAweDIzCi0KIC8qIG5ldHdvcmsgaGVhZGVycyBmb3IgRGZjdGwgZmllbGQgKi8KICNkZWZpbmUgRkNfTkVUX0hEUiAgICAgIDB4MjAKIApAQCAtMTE4Myw2ICsxMTY4LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9aRVBIWVJfRENTUCAgIDB4ZmUxMgogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NFUlZFUkVOR0lORSAgMHgxOWEyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHRVJTSEFSSyAgICAweDA3MDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UT01DQVQgICAgICAgIDB4MDcxNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBTENPTiAgICAgICAgMHhmMTgwCiAKICNkZWZpbmUgSkVERUNfSURfQUREUkVTUyAgICAgICAgICAgIDB4MDA4MDAwMWMKICNkZWZpbmUgRklSRUZMWV9KRURFQ19JRCAgICAgICAgICAgIDB4MUFDQwpAQCAtMTQ0NCw2ICsxNDMxLDcgQEAKICNkZWZpbmUgQ01EX0FCT1JUX01YUkk2NF9DTiAgICAgMHg4QwogI2RlZmluZSBDTURfUkNWX0VMU19SRVE2NF9DWCAgICAweDhECiAjZGVmaW5lIENNRF9YTUlUX0VMU19SU1A2NF9DWCAgIDB4OTUKKyNkZWZpbmUgQ01EX1hNSVRfQkxTX1JTUDY0X0NYICAgMHg5NwogI2RlZmluZSBDTURfRkNQX0lXUklURTY0X0NSICAgICAweDk4CiAjZGVmaW5lIENNRF9GQ1BfSVdSSVRFNjRfQ1ggICAgIDB4OTkKICNkZWZpbmUgQ01EX0ZDUF9JUkVBRDY0X0NSICAgICAgMHg5QQpAQCAtMjMwNiw4ICsyMjk0LDcgQEAKIAl1aW50MzJfdCByc3ZkMTsKIAl1aW50MzJfdCByc3ZkMjo4OwogCXVpbnQzMl90IHNpZDoyNDsKLQl1aW50MzJfdCByc3ZkMzsKLQl1aW50MzJfdCByc3ZkNDsKKwl1aW50MzJfdCB3d25bMl07CiAJdWludDMyX3QgcnN2ZDU7CiAJdWludDE2X3QgdmZpOwogCXVpbnQxNl90IHZwaTsKQEAgLTIzMTUsOCArMjMwMiw3IEBACiAJdWludDMyX3QgcnN2ZDE7CiAJdWludDMyX3Qgc2lkOjI0OwogCXVpbnQzMl90IHJzdmQyOjg7Ci0JdWludDMyX3QgcnN2ZDM7Ci0JdWludDMyX3QgcnN2ZDQ7CisJdWludDMyX3Qgd3duWzJdOwogCXVpbnQzMl90IHJzdmQ1OwogCXVpbnQxNl90IHZwaTsKIAl1aW50MTZfdCB2Zmk7CkBAIC0yMzI2LDcgKzIzMTIsMTMgQEAKIC8qIFN0cnVjdHVyZSBmb3IgTUIgQ29tbWFuZCBVTlJFR19WUEkgKDB4OTcpICovCiB0eXBlZGVmIHN0cnVjdCB7CiAJdWludDMyX3QgcnN2ZDE7Ci0JdWludDMyX3QgcnN2ZDI7CisjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECisJdWludDE2X3QgcnN2ZDI7CisJdWludDE2X3Qgc2xpNF92cGk7CisjZWxzZQkvKiAgX19MSVRUTEVfRU5ESUFOICovCisJdWludDE2X3Qgc2xpNF92cGk7CisJdWludDE2X3QgcnN2ZDI7CisjZW5kaWYKIAl1aW50MzJfdCByc3ZkMzsKIAl1aW50MzJfdCByc3ZkNDsKIAl1aW50MzJfdCByc3ZkNTsKQEAgLTM1NDcsNyArMzUzOSw3IEBACiAJCUFTWU5DU1RBVF9GSUVMRFMgYXN5bmNzdGF0OyAvKiBhc3luY19zdGF0dXMgaW9jYiAqLwogCQlRVUVfWFJJNjRfQ1hfRklFTERTIHF1ZXhyaTY0Y3g7IC8qIHF1ZV94cmk2NF9jeCBmaWVsZHMgKi8KIAkJc3RydWN0IHJjdl9zZXE2NCByY3ZzZXE2NDsJLyogUkNWX1NFUTY0IGFuZCBSQ1ZfQ09OVDY0ICovCi0KKwkJc3RydWN0IHNsaTRfYmxzX2FjYyBibHNfYWNjOyAvKiBVTlNPTCBBQlRTIEJMU19BQ0MgcGFyYW1zICovCiAJCXVpbnQzMl90IHVscFdvcmRbSU9DQl9XT1JEX1NaIC0gMl07CS8qIGdlbmVyaWMgNiAnd29yZHMnICovCiAJfSB1bjsKIAl1bmlvbiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaAppbmRleCAzNjg5ZWVlLi4xNTg1MTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKQEAgLTE5NCw2ICsxOTQsMjYgQEAKICNkZWZpbmUgbHBmY19maXBfZmxhZ19XT1JEIHdvcmQwCiB9OwogCitzdHJ1Y3Qgc2xpNF9ibHNfYWNjIHsKKwl1aW50MzJfdCB3b3JkMF9yc3ZkOyAgICAgIC8qIFdvcmQwIG11c3QgYmUgcmVzZXJ2ZWQgKi8KKwl1aW50MzJfdCB3b3JkMTsKKyNkZWZpbmUgbHBmY19hYnRzX29yaWdfU0hJRlQgICAgICAwCisjZGVmaW5lIGxwZmNfYWJ0c19vcmlnX01BU0sgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX2FidHNfb3JpZ19XT1JEICAgICAgIHdvcmQxCisjZGVmaW5lIExQRkNfQUJUU19VTlNPTF9SU1AgICAgICAgMQorI2RlZmluZSBMUEZDX0FCVFNfVU5TT0xfSU5UICAgICAgIDAKKwl1aW50MzJfdCB3b3JkMjsKKyNkZWZpbmUgbHBmY19hYnRzX3J4aWRfU0hJRlQgICAgICAwCisjZGVmaW5lIGxwZmNfYWJ0c19yeGlkX01BU0sgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBscGZjX2FidHNfcnhpZF9XT1JEICAgICAgIHdvcmQyCisjZGVmaW5lIGxwZmNfYWJ0c19veGlkX1NISUZUICAgICAgMTYKKyNkZWZpbmUgbHBmY19hYnRzX294aWRfTUFTSyAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIGxwZmNfYWJ0c19veGlkX1dPUkQgICAgICAgd29yZDIKKwl1aW50MzJfdCB3b3JkMzsKKwl1aW50MzJfdCB3b3JkNDsKKwl1aW50MzJfdCB3b3JkNV9yc3ZkOwkvKiBXb3JkNSBtdXN0IGJlIHJlc2VydmVkICovCit9OworCiAvKiBldmVudCBxdWV1ZSBlbnRyeSBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBscGZjX2VxZSB7CiAJdWludDMyX3Qgd29yZDA7CkBAIC00MjUsNyArNDQ1LDcgQEAKICNkZWZpbmUgbHBmY193cWVfZ2VuX3N0YXR1c19NQVNLCTB4MDAwMDAwMEYKICNkZWZpbmUgbHBmY193cWVfZ2VuX3N0YXR1c19XT1JECXdvcmQ3CiAjZGVmaW5lIGxwZmNfd3FlX2dlbl9jdF9TSElGVAkJMgotI2RlZmluZSBscGZjX3dxZV9nZW5fY3RfTUFTSwkJMHgwMDAwMDAwNworI2RlZmluZSBscGZjX3dxZV9nZW5fY3RfTUFTSwkJMHgwMDAwMDAwMwogI2RlZmluZSBscGZjX3dxZV9nZW5fY3RfV09SRAkJd29yZDcKIAl1aW50MzJfdCBhYm9ydF90YWc7CiAJdWludDMyX3Qgd29yZDk7CkBAIC00NTMsNiArNDczLDEzIEBACiAjZGVmaW5lIGxwZmNfd3FlX2dlbl93cWVjX1NISUZUCQk3CiAjZGVmaW5lIGxwZmNfd3FlX2dlbl93cWVjX01BU0sJCTB4MDAwMDAwMDEKICNkZWZpbmUgbHBmY193cWVfZ2VuX3dxZWNfV09SRAkJd29yZDExCisjZGVmaW5lIEVMU19JRF9GTE9HSSAzCisjZGVmaW5lIEVMU19JRF9GRElTQyAyCisjZGVmaW5lIEVMU19JRF9MT0dPICAxCisjZGVmaW5lIEVMU19JRF9ERUZBVUxUIDAKKyNkZWZpbmUgbHBmY193cWVfZ2VuX2Vsc19pZF9TSElGVAk0CisjZGVmaW5lIGxwZmNfd3FlX2dlbl9lbHNfaWRfTUFTSwkweDAwMDAwMDAzCisjZGVmaW5lIGxwZmNfd3FlX2dlbl9lbHNfaWRfV09SRAl3b3JkMTEKICNkZWZpbmUgbHBmY193cWVfZ2VuX2NtZF90eXBlX1NISUZUCTAKICNkZWZpbmUgbHBmY193cWVfZ2VuX2NtZF90eXBlX01BU0sJMHgwMDAwMDAwRgogI2RlZmluZSBscGZjX3dxZV9nZW5fY21kX3R5cGVfV09SRAl3b3JkMTEKQEAgLTQ4Nyw4ICs1MTQsOCBAQAogCiAjZGVmaW5lIExQRkNfVUVSUl9TVEFUVVNfSEkJCTB4MDBBNAogI2RlZmluZSBMUEZDX1VFUlJfU1RBVFVTX0xPCQkweDAwQTAKLSNkZWZpbmUgTFBGQ19PTkxJTkUwCQkJMHgwMEIwCi0jZGVmaW5lIExQRkNfT05MSU5FMQkJCTB4MDBCNAorI2RlZmluZSBMUEZDX1VFX01BU0tfSEkJCQkweDAwQUMKKyNkZWZpbmUgTFBGQ19VRV9NQVNLX0xPCQkJMHgwMEE4CiAjZGVmaW5lIExQRkNfU0NSQVRDSFBBRAkJCTB4MDA1OAogCiAvKiBCQVIwIFJlZ2lzdGVycyAqLwpAQCAtNzYwLDYgKzc4Nyw3IEBACiAjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTVFfREVTVFJPWQkJMHgzNQogI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0NRX0RFU1RST1kJCTB4MzYKICNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9FUV9ERVNUUk9ZCQkweDM3CisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfUVVFUllfRldfQ0ZHCQkweDNBCiAjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRlVOQ1RJT05fUkVTRVQJCTB4M0QKIAogLyogRkNvRSBPcGNvZGVzICovCkBAIC0xMjczLDYgKzEzMDEsNTEgQEAKICNkZWZpbmUgbHBmY19tYnhfZGVsX2ZjZl90YmxfaW5kZXhfV09SRAkJd29yZDEwCiB9OwogCitzdHJ1Y3QgbHBmY19tYnhfcXVlcnlfZndfY2ZnIHsKKwlzdHJ1Y3QgbWJveF9oZWFkZXIgaGVhZGVyOworCXVpbnQzMl90IGNvbmZpZ19udW1iZXI7CisJdWludDMyX3QgYXNpY19yZXY7CisJdWludDMyX3QgcGh5c19wb3J0OworCXVpbnQzMl90IGZ1bmN0aW9uX21vZGU7CisvKiBmaXJtd2FyZSBGdW5jdGlvbiBNb2RlICovCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV90b2VfU0hJRlQJCTAKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX3RvZV9NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV90b2VfV09SRAkJZnVuY3Rpb25fbW9kZQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfbmljX1NISUZUCQkxCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9uaWNfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfbmljX1dPUkQJCWZ1bmN0aW9uX21vZGUKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX3JkbWFfU0hJRlQJCTIKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX3JkbWFfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfcmRtYV9XT1JECQlmdW5jdGlvbl9tb2RlCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV92bV9TSElGVAkJMworI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfdm1fTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfdm1fV09SRAkJZnVuY3Rpb25fbW9kZQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfaXNjc2lfaV9TSElGVAk0CisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9pc2NzaV9pX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX2lzY3NpX2lfV09SRAkJZnVuY3Rpb25fbW9kZQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfaXNjc2lfdF9TSElGVAk1CisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9pc2NzaV90X01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX2lzY3NpX3RfV09SRAkJZnVuY3Rpb25fbW9kZQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfZmNvZV9pX1NISUZUCQk2CisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9mY29lX2lfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfZmNvZV9pX1dPUkQJCWZ1bmN0aW9uX21vZGUKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX2Zjb2VfdF9TSElGVAkJNworI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfZmNvZV90X01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX2Zjb2VfdF9XT1JECQlmdW5jdGlvbl9tb2RlCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9kYWxfU0hJRlQJCTgKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX2RhbF9NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9kYWxfV09SRAkJZnVuY3Rpb25fbW9kZQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfbHJvX1NISUZUCQk5CisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9scm9fTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfbHJvX1dPUkQJCWZ1bmN0aW9uX21vZGU5CisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9mbGV4MTBfU0hJRlQJCTEwCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9mbGV4MTBfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX2Z1bmN0aW9uX21vZGVfZmxleDEwX1dPUkQJCWZ1bmN0aW9uX21vZGUKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX25jc2lfU0hJRlQJCTExCisjZGVmaW5lIGxwZmNfZnVuY3Rpb25fbW9kZV9uY3NpX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgbHBmY19mdW5jdGlvbl9tb2RlX25jc2lfV09SRAkJZnVuY3Rpb25fbW9kZQorfTsKKwogLyogU3RhdHVzIGZpZWxkIGZvciBlbWJlZGRlZCBTTElfQ09ORklHIG1haWxib3ggY29tbWFuZCAqLwogI2RlZmluZSBTVEFUVVNfU1VDQ0VTUwkJCQkJMHgwCiAjZGVmaW5lIFNUQVRVU19GQUlMRUQgCQkJCQkweDEKQEAgLTEzNDksOCArMTQyMiw3IEBACiAjZGVmaW5lIGxwZmNfcmVnX3ZmaV9mY2ZpX1NISUZUCQkwCiAjZGVmaW5lIGxwZmNfcmVnX3ZmaV9mY2ZpX01BU0sJCTB4MDAwMEZGRkYKICNkZWZpbmUgbHBmY19yZWdfdmZpX2ZjZmlfV09SRAkJd29yZDIKLQl1aW50MzJfdCB3b3JkM19yc3ZkOwotCXVpbnQzMl90IHdvcmQ0X3JzdmQ7CisJdWludDMyX3Qgd3duWzJdOwogCXN0cnVjdCB1bHBfYmRlNjQgYmRlOwogCXVpbnQzMl90IHdvcmQ4X3JzdmQ7CiAJdWludDMyX3Qgd29yZDlfcnN2ZDsKQEAgLTE1NTUsNiArMTYyNywxMSBAQAogI2RlZmluZSBscGZjX21ieF9yZF9yZXZfZmNvZV9TSElGVAkJMjAKICNkZWZpbmUgbHBmY19tYnhfcmRfcmV2X2Zjb2VfTUFTSwkJMHgwMDAwMDAwMQogI2RlZmluZSBscGZjX21ieF9yZF9yZXZfZmNvZV9XT1JECQl3b3JkMQorI2RlZmluZSBscGZjX21ieF9yZF9yZXZfY2VlX3Zlcl9TSElGVAkJMjEKKyNkZWZpbmUgbHBmY19tYnhfcmRfcmV2X2NlZV92ZXJfTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBscGZjX21ieF9yZF9yZXZfY2VlX3Zlcl9XT1JECQl3b3JkMQorI2RlZmluZSBMUEZDX1BSRURDQlhfQ0VFX01PREUJMAorI2RlZmluZSBMUEZDX0RDQlhfQ0VFX01PREUJMQogI2RlZmluZSBscGZjX21ieF9yZF9yZXZfdnBkX1NISUZUCQkyOQogI2RlZmluZSBscGZjX21ieF9yZF9yZXZfdnBkX01BU0sJCTB4MDAwMDAwMDEKICNkZWZpbmUgbHBmY19tYnhfcmRfcmV2X3ZwZF9XT1JECQl3b3JkMQpAQCAtMTgwNCw2ICsxODgxLDcgQEAKIAkJc3RydWN0IGxwZmNfbWJ4X3JlYWRfY29uZmlnIHJkX2NvbmZpZzsKIAkJc3RydWN0IGxwZmNfbWJ4X3JlcXVlc3RfZmVhdHVyZXMgcmVxX2Z0cnM7CiAJCXN0cnVjdCBscGZjX21ieF9wb3N0X2hkcl90bXBsIGhkcl90bXBsOworCQlzdHJ1Y3QgbHBmY19tYnhfcXVlcnlfZndfY2ZnIHF1ZXJ5X2Z3X2NmZzsKIAkJc3RydWN0IGxwZmNfbWJ4X25vcCBub3A7CiAJfSB1bjsKIH07CkBAIC0xODg1LDcgKzE5NjMsNyBAQAogfTsKIAogc3RydWN0IGxwZmNfYWNxZV9mY29lIHsKLQl1aW50MzJfdCBmY2ZfaW5kZXg7CisJdWludDMyX3QgaW5kZXg7CiAJdWludDMyX3Qgd29yZDE7CiAjZGVmaW5lIGxwZmNfYWNxZV9mY29lX2ZjZl9jb3VudF9TSElGVAkJMAogI2RlZmluZSBscGZjX2FjcWVfZmNvZV9mY2ZfY291bnRfTUFTSwkJMHgwMDAwRkZGRgpAQCAtMTg5Niw2ICsxOTc0LDcgQEAKICNkZWZpbmUgTFBGQ19GQ09FX0VWRU5UX1RZUEVfTkVXX0ZDRgkJMHgxCiAjZGVmaW5lIExQRkNfRkNPRV9FVkVOVF9UWVBFX0ZDRl9UQUJMRV9GVUxMCTB4MgogI2RlZmluZSBMUEZDX0ZDT0VfRVZFTlRfVFlQRV9GQ0ZfREVBRAkJMHgzCisjZGVmaW5lIExQRkNfRkNPRV9FVkVOVF9UWVBFX0NWTAkJMHg0CiAJdWludDMyX3QgZXZlbnRfdGFnOwogCXVpbnQzMl90IHRyYWlsZXI7CiB9OwpAQCAtMTkyMSwxMiArMjAwMCwxMyBAQAogI2RlZmluZSBTR0xfQUxJR05fU1ogNjQKICNkZWZpbmUgU0dMX1BBR0VfU0laRSA0MDk2CiAvKiBhbGlnbiBTR0wgYWRkciBvbiBhIHNpemUgYm91bmRhcnkgLSBhZGp1c3QgYWRkcmVzcyB1cCAqLwotI2RlZmluZSBOT19YUkkgKCh1aW50MTZfdCktMSkKKyNkZWZpbmUgTk9fWFJJICAoKHVpbnQxNl90KS0xKQorCiBzdHJ1Y3Qgd3FlX2NvbW1vbiB7CiAJdWludDMyX3Qgd29yZDY7Ci0jZGVmaW5lIHdxZV94cmlfU0hJRlQgICAgICAgICAwCi0jZGVmaW5lIHdxZV94cmlfTUFTSyAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIHdxZV94cmlfV09SRCAgICAgICAgICB3b3JkNgorI2RlZmluZSB3cWVfeHJpX3RhZ19TSElGVCAgICAgMAorI2RlZmluZSB3cWVfeHJpX3RhZ19NQVNLICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSB3cWVfeHJpX3RhZ19XT1JEICAgICAgd29yZDYKICNkZWZpbmUgd3FlX2N0eHRfdGFnX1NISUZUICAgIDE2CiAjZGVmaW5lIHdxZV9jdHh0X3RhZ19NQVNLICAgICAweDAwMDBGRkZGCiAjZGVmaW5lIHdxZV9jdHh0X3RhZ19XT1JEICAgICB3b3JkNgpAQCAtMTk4Nyw3ICsyMDY3LDcgQEAKICNkZWZpbmUgd3FlX3dxZWNfTUFTSyAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIHdxZV93cWVjX1dPUkQgICAgICAgd29yZDExCiAjZGVmaW5lIHdxZV9jcWlkX1NISUZUICAgICAgMTYKLSNkZWZpbmUgd3FlX2NxaWRfTUFTSyAgICAgICAweDAwMDAwM2ZmCisjZGVmaW5lIHdxZV9jcWlkX01BU0sgICAgICAgMHgwMDAwZmZmZgogI2RlZmluZSB3cWVfY3FpZF9XT1JEICAgICAgIHdvcmQxMQogfTsKIApAQCAtMTk5Niw2ICsyMDc2LDkgQEAKICNkZWZpbmUgd3FlX2Vsc19kaWRfU0hJRlQgICAgICAgICAwCiAjZGVmaW5lIHdxZV9lbHNfZGlkX01BU0sgICAgICAgICAgMHgwMEZGRkZGRgogI2RlZmluZSB3cWVfZWxzX2RpZF9XT1JEICAgICAgICAgIHdvcmQ1CisjZGVmaW5lIHdxZV94bWl0X2Jsc19wdF9TSElGVCAgICAgICAgIDI4CisjZGVmaW5lIHdxZV94bWl0X2Jsc19wdF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgd3FlX3htaXRfYmxzX3B0X1dPUkQgICAgICAgICAgd29yZDUKICNkZWZpbmUgd3FlX3htaXRfYmxzX2FyX1NISUZUICAgICAgICAgMzAKICNkZWZpbmUgd3FlX3htaXRfYmxzX2FyX01BU0sgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSB3cWVfeG1pdF9ibHNfYXJfV09SRCAgICAgICAgICB3b3JkNQpAQCAtMjA0NCw2ICsyMTI3LDIzIEBACiAKIHN0cnVjdCB4bWl0X2Jsc19yc3A2NF93cWUgewogCXVpbnQzMl90IHBheWxvYWQwOworLyogUGF5bG9hZDAgZm9yIEJBX0FDQyAqLworI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9hY2Nfc2VxX2lkX1NISUZUICAgICAgICAxNgorI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9hY2Nfc2VxX2lkX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X2FjY19zZXFfaWRfV09SRCAgICAgICAgIHBheWxvYWQwCisjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X2FjY19zZXFfaWRfdmFsZF9TSElGVCAgIDI0CisjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X2FjY19zZXFfaWRfdmFsZF9NQVNLICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgeG1pdF9ibHNfcnNwNjRfYWNjX3NlcV9pZF92YWxkX1dPUkQgICAgcGF5bG9hZDAKKy8qIFBheWxvYWQwIGZvciBCQV9SSlQgKi8KKyNkZWZpbmUgeG1pdF9ibHNfcnNwNjRfcmp0X3ZzcGVjX1NISUZUICAgMAorI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9yanRfdnNwZWNfTUFTSyAgICAweDAwMDAwMGZmCisjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3JqdF92c3BlY19XT1JEICAgIHBheWxvYWQwCisjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3JqdF9leHBjX1NISUZUICAgIDgKKyNkZWZpbmUgeG1pdF9ibHNfcnNwNjRfcmp0X2V4cGNfTUFTSyAgICAgMHgwMDAwMDBmZgorI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9yanRfZXhwY19XT1JEICAgICBwYXlsb2FkMAorI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9yanRfcnNuY19TSElGVCAgICAxNgorI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9yanRfcnNuY19NQVNLICAgICAweDAwMDAwMGZmCisjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3JqdF9yc25jX1dPUkQgICAgIHBheWxvYWQwCiAJdWludDMyX3Qgd29yZDE7CiAjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3J4aWRfU0hJRlQgIDAKICNkZWZpbmUgeG1pdF9ibHNfcnNwNjRfcnhpZF9NQVNLICAgMHgwMDAwZmZmZgpAQCAtMjA1MiwxOCArMjE1MiwxOSBAQAogI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9veGlkX01BU0sgICAweDAwMDBmZmZmCiAjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X294aWRfV09SRCAgIHdvcmQxCiAJdWludDMyX3Qgd29yZDI7Ci0jZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3NlcWNudGxvX1NISUZUICAwCi0jZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3NlcWNudGxvX01BU0sgICAweDAwMDBmZmZmCi0jZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3NlcWNudGxvX1dPUkQgICB3b3JkMgotI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9zZXFjbnRoaV9TSElGVCAgMTYKKyNkZWZpbmUgeG1pdF9ibHNfcnNwNjRfc2VxY250aGlfU0hJRlQgIDAKICNkZWZpbmUgeG1pdF9ibHNfcnNwNjRfc2VxY250aGlfTUFTSyAgIDB4MDAwMGZmZmYKICNkZWZpbmUgeG1pdF9ibHNfcnNwNjRfc2VxY250aGlfV09SRCAgIHdvcmQyCisjZGVmaW5lIHhtaXRfYmxzX3JzcDY0X3NlcWNudGxvX1NISUZUICAxNgorI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9zZXFjbnRsb19NQVNLICAgMHgwMDAwZmZmZgorI2RlZmluZSB4bWl0X2Jsc19yc3A2NF9zZXFjbnRsb19XT1JEICAgd29yZDIKIAl1aW50MzJfdCByc3J2ZDM7CiAJdWludDMyX3QgcnNydmQ0OwogCXN0cnVjdCB3cWVfZGlkCXdxZV9kZXN0OwogCXN0cnVjdCB3cWVfY29tbW9uIHdxZV9jb207IC8qIHdvcmRzIDYtMTEgKi8KIAl1aW50MzJfdCByc3ZkXzEyXzE1WzRdOwogfTsKKwogc3RydWN0IHdxZV9yY3RsX2RmY3RsIHsKIAl1aW50MzJfdCB3b3JkNTsKICNkZWZpbmUgd3FlX3NpX1NISUZUIDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggNTYyZDhjZS4uMjI2OTIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvYWVyLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CkBAIC02NDUsNyArNjQ2LDcgQEAKICAqIGRvd24gdGhlIFNMSSBMYXllci4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqICAgMCAtIHN1Y2Vzcy4KKyAqICAgMCAtIHN1Y2Nlc3MuCiAgKiAgIEFueSBvdGhlciB2YWx1ZSAtIGVycm9yLgogICoqLwogc3RhdGljIGludApAQCAtNzAwLDcgKzcwMSw3IEBACiAgKiBkb3duIHRoZSBTTEkgTGF5ZXIuCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAgIDAgLSBzdWNlc3MuCisgKiAgIDAgLSBzdWNjZXNzLgogICogICBBbnkgb3RoZXIgdmFsdWUgLSBlcnJvci4KICAqKi8KIHN0YXRpYyBpbnQKQEAgLTc1NSw3ICs3NTYsNyBAQAogICogdW5pbml0aWFsaXphdGlvbiBhZnRlciB0aGUgSEJBIGlzIHJlc2V0IHdoZW4gYnJpbmcgZG93biB0aGUgU0xJIExheWVyLgogICoKICAqIFJldHVybiBjb2RlcwotICogICAwIC0gc3VjZXNzLgorICogICAwIC0gc3VjY2Vzcy4KICAqICAgQW55IG90aGVyIHZhbHVlIC0gZXJyb3IuCiAgKiovCiBpbnQKQEAgLTg1MiwxMiArODUzLDE5IEBACiB2b2lkCiBscGZjX2hiX3RpbWVvdXRfaGFuZGxlcihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CisJc3RydWN0IGxwZmNfdnBvcnQgKip2cG9ydHM7CiAJTFBGQ19NQk9YUV90ICpwbWJveHE7CiAJc3RydWN0IGxwZmNfZG1hYnVmICpidWZfcHRyOwotCWludCByZXR2YWw7CisJaW50IHJldHZhbCwgaTsKIAlzdHJ1Y3QgbHBmY19zbGkgKnBzbGkgPSAmcGhiYS0+c2xpOwogCUxJU1RfSEVBRChjb21wbGV0aW9ucyk7CiAKKwl2cG9ydHMgPSBscGZjX2NyZWF0ZV92cG9ydF93b3JrX2FycmF5KHBoYmEpOworCWlmICh2cG9ydHMgIT0gTlVMTCkKKwkJZm9yIChpID0gMDsgaSA8PSBwaGJhLT5tYXhfdnBvcnRzICYmIHZwb3J0c1tpXSAhPSBOVUxMOyBpKyspCisJCQlscGZjX3Jjdl9zZXFfY2hlY2tfZWR0b3YodnBvcnRzW2ldKTsKKwlscGZjX2Rlc3Ryb3lfdnBvcnRfd29ya19hcnJheShwaGJhLCB2cG9ydHMpOworCiAJaWYgKChwaGJhLT5saW5rX3N0YXRlID09IExQRkNfSEJBX0VSUk9SKSB8fAogCQkocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykgfHwKIAkJKHBoYmEtPnBwb3J0LT5mY19mbGFnICYgRkNfT0ZGTElORV9NT0RFKSkKQEAgLTEyNTQsNyArMTI2Miw3IEBACiAgKiByb3V0aW5lIGZyb20gdGhlIEFQSSBqdW1wIHRhYmxlIGZ1bmN0aW9uIHBvaW50ZXIgZnJvbSB0aGUgbHBmY19oYmEgc3RydWN0LgogICoKICAqIFJldHVybiBjb2RlcwotICogICAwIC0gc3VjZXNzLgorICogICAwIC0gc3VjY2Vzcy4KICAqICAgQW55IG90aGVyIHZhbHVlIC0gZXJyb3IuCiAgKiovCiB2b2lkCkBAIC0xNTIxLDEwICsxNTI5LDEwIEBACiAJaW50IEdFID0gMDsKIAlpbnQgb25lQ29ubmVjdCA9IDA7IC8qIGRlZmF1bHQgaXMgbm90IGEgb25lQ29ubmVjdCAqLwogCXN0cnVjdCB7Ci0JCWNoYXIgKiBuYW1lOwotCQlpbnQgICAgbWF4X3NwZWVkOwotCQljaGFyICogYnVzOwotCX0gbSA9IHsiPFVua25vd24+IiwgMCwgIiJ9OworCQljaGFyICpuYW1lOworCQljaGFyICpidXM7CisJCWNoYXIgKmZ1bmN0aW9uOworCX0gbSA9IHsiPFVua25vd24+IiwgIiIsICIifTsKIAogCWlmIChtZHAgJiYgbWRwWzBdICE9ICdcMCcKIAkJJiYgZGVzY3AgJiYgZGVzY3BbMF0gIT0gJ1wwJykKQEAgLTE1NDUsMTMyICsxNTUzLDE1NSBAQAogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfRklSRUZMWToKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDYwMDAiLCBtYXhfc3BlZWQsICJQQ0kifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDYwMDAiLCAiUENJIiwgIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfU1VQRVJGTFk6CiAJCWlmICh2cC0+cmV2LmJpdVJldiA+PSAxICYmIHZwLT5yZXYuYml1UmV2IDw9IDMpCi0JCQltID0gKHR5cGVvZihtKSl7IkxQNzAwMCIsIG1heF9zcGVlZCwgICJQQ0kifTsKKwkJCW0gPSAodHlwZW9mKG0pKXsiTFA3MDAwIiwgIlBDSSIsCisJCQkJCSJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJZWxzZQotCQkJbSA9ICh0eXBlb2YobSkpeyJMUDcwMDBFIiwgbWF4X3NwZWVkLCAiUENJIn07CisJCQltID0gKHR5cGVvZihtKSl7IkxQNzAwMEUiLCAiUENJIiwKKwkJCQkJIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfRFJBR09ORkxZOgotCQltID0gKHR5cGVvZihtKSl7IkxQODAwMCIsIG1heF9zcGVlZCwgIlBDSSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQODAwMCIsICJQQ0kiLAorCQkJCSJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0NFTlRBVVI6CiAJCWlmIChGQ19KRURFQ19JRCh2cC0+cmV2LmJpdVJldikgPT0gQ0VOVEFVUl8yR19KRURFQ19JRCkKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFA5MDAyIiwgbWF4X3NwZWVkLCAiUENJIn07CisJCQltID0gKHR5cGVvZihtKSl7IkxQOTAwMiIsICJQQ0kiLAorCQkJCQkiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWVsc2UKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFA5MDAwIiwgbWF4X3NwZWVkLCAiUENJIn07CisJCQltID0gKHR5cGVvZihtKSl7IkxQOTAwMCIsICJQQ0kiLAorCQkJCQkiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9SRkxZOgotCQltID0gKHR5cGVvZihtKSl7IkxQOTUyIiwgbWF4X3NwZWVkLCAiUENJIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFA5NTIiLCAiUENJIiwKKwkJCQkiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9QRUdBU1VTOgotCQltID0gKHR5cGVvZihtKSl7IkxQOTgwMiIsIG1heF9zcGVlZCwgIlBDSS1YIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFA5ODAyIiwgIlBDSS1YIiwKKwkJCQkiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9USE9SOgotCQltID0gKHR5cGVvZihtKSl7IkxQMTAwMDAiLCBtYXhfc3BlZWQsICJQQ0ktWCJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQMTAwMDAiLCAiUENJLVgiLAorCQkJCSJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJUEVSOgotCQltID0gKHR5cGVvZihtKSl7IkxQWDEwMDAiLCBtYXhfc3BlZWQsICAiUENJLVgifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUFgxMDAwIiwgICJQQ0ktWCIsCisJCQkJIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfUEZMWToKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDk4MiIsIG1heF9zcGVlZCwgIlBDSS1YIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFA5ODIiLCAiUENJLVgiLAorCQkJCSJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1RGTFk6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFAxMDUwIiwgbWF4X3NwZWVkLCAiUENJLVgifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDEwNTAiLCAiUENJLVgiLAorCQkJCSJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0hFTElPUzoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDExMDAwIiwgbWF4X3NwZWVkLCAiUENJLVgyIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFAxMTAwMCIsICJQQ0ktWDIiLAorCQkJCSJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0hFTElPU19TQ1NQOgotCQltID0gKHR5cGVvZihtKSl7IkxQMTEwMDAtU1AiLCBtYXhfc3BlZWQsICJQQ0ktWDIifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDExMDAwLVNQIiwgIlBDSS1YMiIsCisJCQkJIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfSEVMSU9TX0RDU1A6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFAxMTAwMi1TUCIsIG1heF9zcGVlZCwgIlBDSS1YMiJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQMTEwMDItU1AiLCAgIlBDSS1YMiIsCisJCQkJIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTkVQVFVORToKLQkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMDAwIiwgbWF4X3NwZWVkLCAiUENJZSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZTEwMDAiLCAiUENJZSIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX05FUFRVTkVfU0NTUDoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMDAwLVNQIiwgbWF4X3NwZWVkLCAiUENJZSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZTEwMDAtU1AiLCAiUENJZSIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX05FUFRVTkVfRENTUDoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMDAyLVNQIiwgbWF4X3NwZWVkLCAiUENJZSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZTEwMDItU1AiLCAiUENJZSIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0JNSUQ6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFAxMTUwIiwgbWF4X3NwZWVkLCAiUENJLVgyIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFAxMTUwIiwgIlBDSS1YMiIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0JTTUI6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFAxMTEiLCBtYXhfc3BlZWQsICJQQ0ktWDIifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDExMSIsICJQQ0ktWDIiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9aRVBIWVI6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBlMTEwMDAiLCBtYXhfc3BlZWQsICJQQ0llIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTEwMDAiLCAiUENJZSIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1pFUEhZUl9TQ1NQOgotCQltID0gKHR5cGVvZihtKSl7IkxQZTExMDAwIiwgbWF4X3NwZWVkLCAiUENJZSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZTExMDAwIiwgIlBDSWUiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9aRVBIWVJfRENTUDoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDIxMDUiLCBtYXhfc3BlZWQsICJQQ0llIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFAyMTA1IiwgIlBDSWUiLCAiRkNvRSBBZGFwdGVyIn07CiAJCUdFID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1pNSUQ6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBlMTE1MCIsIG1heF9zcGVlZCwgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTUwIiwgIlBDSWUiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9aU01COgotCQltID0gKHR5cGVvZihtKSl7IkxQZTExMSIsIG1heF9zcGVlZCwgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTEiLCAiUENJZSIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xQMTAxOgotCQltID0gKHR5cGVvZihtKSl7IkxQMTAxIiwgbWF4X3NwZWVkLCAiUENJLVgifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDEwMSIsICJQQ0ktWCIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xQMTAwMDBTOgotCQltID0gKHR5cGVvZihtKSl7IkxQMTAwMDAtUyIsIG1heF9zcGVlZCwgIlBDSSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQMTAwMDAtUyIsICJQQ0kiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9MUDExMDAwUzoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDExMDAwLVMiLCBtYXhfc3BlZWQsCi0JCQkiUENJLVgyIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFAxMTAwMC1TIiwgIlBDSS1YMiIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xQRTExMDAwUzoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTAwMC1TIiwgbWF4X3NwZWVkLAotCQkJIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTAwMC1TIiwgIlBDSWUiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9TQVQ6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBlMTIwMDAiLCBtYXhfc3BlZWQsICJQQ0llIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTIwMDAiLCAiUENJZSIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1NBVF9NSUQ6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBlMTI1MCIsIG1heF9zcGVlZCwgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMjUwIiwgIlBDSWUiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9TQVRfU01COgotCQltID0gKHR5cGVvZihtKSl7IkxQZTEyMSIsIG1heF9zcGVlZCwgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMjEiLCAiUENJZSIsICJGaWJyZSBDaGFubmVsIEFkYXB0ZXIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1NBVF9EQ1NQOgotCQltID0gKHR5cGVvZihtKSl7IkxQZTEyMDAyLVNQIiwgbWF4X3NwZWVkLCAiUENJZSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZTEyMDAyLVNQIiwgIlBDSWUiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9TQVRfU0NTUDoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMjAwMC1TUCIsIG1heF9zcGVlZCwgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMjAwMC1TUCIsICJQQ0llIiwgIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfU0FUX1M6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBlMTIwMDAtUyIsIG1heF9zcGVlZCwgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMjAwMC1TIiwgIlBDSWUiLCAiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9IT1JORVQ6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFAyMTAwMCIsIG1heF9zcGVlZCwgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDIxMDAwIiwgIlBDSWUiLCAiRkNvRSBBZGFwdGVyIn07CiAJCUdFID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1BST1RFVVNfVkY6Ci0JCW0gPSAodHlwZW9mKG0pKSB7IkxQZXYxMjAwMCIsIG1heF9zcGVlZCwgIlBDSWUgSU9WIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFBldjEyMDAwIiwgIlBDSWUgSU9WIiwKKwkJCQkiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9QUk9URVVTX1BGOgotCQltID0gKHR5cGVvZihtKSkgeyJMUGV2MTIwMDAiLCBtYXhfc3BlZWQsICJQQ0llIElPViJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZXYxMjAwMCIsICJQQ0llIElPViIsCisJCQkJIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfUFJPVEVVU19TOgotCQltID0gKHR5cGVvZihtKSkgeyJMUGVtdjEyMDAyLVMiLCBtYXhfc3BlZWQsICJQQ0llIElPViJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZW12MTIwMDItUyIsICJQQ0llIElPViIsCisJCQkJIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfVElHRVJTSEFSSzoKIAkJb25lQ29ubmVjdCA9IDE7Ci0JCW0gPSAodHlwZW9mKG0pKSB7Ik9DZTEwMTAwLUYiLCBtYXhfc3BlZWQsICJQQ0llIn07CisJCW0gPSAodHlwZW9mKG0pKXsiT0NlMTAxMDAiLCAiUENJZSIsICJGQ29FIn07CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UT01DQVQ6CisJCW9uZUNvbm5lY3QgPSAxOworCQltID0gKHR5cGVvZihtKSl7Ik9DZTExMTAwIiwgIlBDSWUiLCAiRkNvRSJ9OworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfRkFMQ09OOgorCQltID0gKHR5cGVvZihtKSl7IkxQU2UxMjAwMi1NTDEtRSIsICJQQ0llIiwKKwkJCQkiRW11bGV4U2VjdXJlIEZpYnJlIn07CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW0gPSAodHlwZW9mKG0pKXsgTlVMTCB9OworCQltID0gKHR5cGVvZihtKSl7IlVua25vd24iLCAiIiwgIiJ9OwogCQlicmVhazsKIAl9CiAKQEAgLTE2ODIsMTcgKzE3MTMsMTQgQEAKIAlpZiAoZGVzY3AgJiYgZGVzY3BbMF0gPT0gJ1wwJykgewogCQlpZiAob25lQ29ubmVjdCkKIAkJCXNucHJpbnRmKGRlc2NwLCAyNTUsCi0JCQkJIkVtdWxleCBPbmVDb25uZWN0ICVzLCBGQ29FIEluaXRpYXRvciwgUG9ydCAlcyIsCi0JCQkJbS5uYW1lLAorCQkJCSJFbXVsZXggT25lQ29ubmVjdCAlcywgJXMgSW5pdGlhdG9yLCBQb3J0ICVzIiwKKwkJCQltLm5hbWUsIG0uZnVuY3Rpb24sCiAJCQkJcGhiYS0+UG9ydCk7CiAJCWVsc2UKIAkJCXNucHJpbnRmKGRlc2NwLCAyNTUsCiAJCQkJIkVtdWxleCAlcyAlZCVzICVzICVzIiwKLQkJCQltLm5hbWUsIG0ubWF4X3NwZWVkLAotCQkJCShHRSkgPyAiR0UiIDogIkdiIiwKLQkJCQltLmJ1cywKLQkJCQkoR0UpID8gIkZDb0UgQWRhcHRlciIgOgotCQkJCQkiRmlicmUgQ2hhbm5lbCBBZGFwdGVyIik7CisJCQkJbS5uYW1lLCBtYXhfc3BlZWQsIChHRSkgPyAiR0UiIDogIkdiIiwKKwkJCQltLmJ1cywgbS5mdW5jdGlvbik7CiAJfQogfQogCkBAIC0yMjE3LDcgKzIyNDUsNyBAQAogCiAJCQlpZiAodnBvcnRzW2ldLT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpCiAJCQkJY29udGludWU7Ci0JCQl2cG9ydHNbaV0tPnZmaV9zdGF0ZSAmPSB+TFBGQ19WRklfUkVHSVNURVJFRDsKKwkJCXZwb3J0c1tpXS0+dnBpX3N0YXRlICY9IH5MUEZDX1ZQSV9SRUdJU1RFUkVEOwogCQkJc2hvc3QgPQlscGZjX3Nob3N0X2Zyb21fdnBvcnQodnBvcnRzW2ldKTsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZGxwLCBuZXh0X25kbHAsCiAJCQkJCQkgJnZwb3J0c1tpXS0+ZmNfbm9kZXMsCkBAIC0yMzA4LDYgKzIzMzYsNyBAQAogCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJLyogUmVsZWFzZSBhbGwgdGhlIGxwZmNfc2NzaV9idWZzIG1haW50YWluZWQgYnkgdGhpcyBob3N0LiAqLworCXNwaW5fbG9jaygmcGhiYS0+c2NzaV9idWZfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2IsIHNiX25leHQsICZwaGJhLT5scGZjX3Njc2lfYnVmX2xpc3QsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJnNiLT5saXN0KTsKIAkJcGNpX3Bvb2xfZnJlZShwaGJhLT5scGZjX3Njc2lfZG1hX2J1Zl9wb29sLCBzYi0+ZGF0YSwKQEAgLTIzMTUsNiArMjM0NCw3IEBACiAJCWtmcmVlKHNiKTsKIAkJcGhiYS0+dG90YWxfc2NzaV9idWZzLS07CiAJfQorCXNwaW5fdW5sb2NrKCZwaGJhLT5zY3NpX2J1Zl9saXN0X2xvY2spOwogCiAJLyogUmVsZWFzZSBhbGwgdGhlIGxwZmNfaW9jYnEgZW50cmllcyBtYWludGFpbmVkIGJ5IHRoaXMgaG9zdC4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW8sIGlvX25leHQsICZwaGJhLT5scGZjX2lvY2JfbGlzdCwgbGlzdCkgewpAQCAtMjMyMiw5ICsyMzUyLDcgQEAKIAkJa2ZyZWUoaW8pOwogCQlwaGJhLT50b3RhbF9pb2NicV9idWZzLS07CiAJfQotCiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yNDA4LDcgKzI0MzYsNyBAQAogCXZwb3J0LT5lbHNfdG1vZnVuYy5mdW5jdGlvbiA9IGxwZmNfZWxzX3RpbWVvdXQ7CiAJdnBvcnQtPmVsc190bW9mdW5jLmRhdGEgPSAodW5zaWduZWQgbG9uZyl2cG9ydDsKIAotCWVycm9yID0gc2NzaV9hZGRfaG9zdChzaG9zdCwgZGV2KTsKKwllcnJvciA9IHNjc2lfYWRkX2hvc3Rfd2l0aF9kbWEoc2hvc3QsIGRldiwgJnBoYmEtPnBjaWRldi0+ZGV2KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3B1dF9zaG9zdDsKIApAQCAtMjY5OSw2ICsyNzI3LDYzIEBACiB9CiAKIC8qKgorICogbHBmY19zbGk0X2Z3X2NmZ19jaGVjayAtIFJlYWQgdGhlIGZpcm13YXJlIGNvbmZpZyBhbmQgdmVyaWZ5IEZDb0Ugc3VwcG9ydAorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBRVUVSWV9GV19DRkcgbWFpbGJveCBjb21tYW5kIHRvIGRldGVybWluZSBpZiB0aGUKKyAqIGZpcm13YXJlIGxvYWRlZCBzdXBwb3J0cyBGQ29FLiBBIHJldHVybiBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBtYWlsYm94CisgKiB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhlIGZpcm13YXJlIHN1cHBvcnRzIEZDb0UuIEFueSBvdGhlciByZXR1cm4gaW5kaWNhdGVzCisgKiBhIGVycm9yLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgaW50ZXJydXB0cworICogYXJlIGVuYWJsZWQuCisgKiovCitzdGF0aWMgaW50CitscGZjX3NsaTRfZndfY2ZnX2NoZWNrKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlpbnQgcmMgPSAwOworCUxQRkNfTUJPWFFfdCAqbWJveHE7CisJc3RydWN0IGxwZmNfbWJ4X3F1ZXJ5X2Z3X2NmZyAqcXVlcnlfZndfY2ZnOworCXVpbnQzMl90IGxlbmd0aDsKKwl1aW50MzJfdCBzaGRyX3N0YXR1cywgc2hkcl9hZGRfc3RhdHVzOworCisJbWJveHEgPSBtZW1wb29sX2FsbG9jKHBoYmEtPm1ib3hfbWVtX3Bvb2wsIEdGUF9LRVJORUwpOworCWlmICghbWJveHEpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMjYyMSBGYWlsZWQgdG8gYWxsb2NhdGUgbWJveCBmb3IgIgorCQkJCSJxdWVyeSBmaXJtd2FyZSBjb25maWcgY21kXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXF1ZXJ5X2Z3X2NmZyA9ICZtYm94cS0+dS5tcWUudW4ucXVlcnlfZndfY2ZnOworCWxlbmd0aCA9IChzaXplb2Yoc3RydWN0IGxwZmNfbWJ4X3F1ZXJ5X2Z3X2NmZykgLQorCQkgIHNpemVvZihzdHJ1Y3QgbHBmY19zbGk0X2NmZ19taGRyKSk7CisJbHBmY19zbGk0X2NvbmZpZyhwaGJhLCBtYm94cSwgTFBGQ19NQk9YX1NVQlNZU1RFTV9DT01NT04sCisJCQkgTFBGQ19NQk9YX09QQ09ERV9RVUVSWV9GV19DRkcsCisJCQkgbGVuZ3RoLCBMUEZDX1NMSTRfTUJYX0VNQkVEKTsKKwlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveHEsIE1CWF9QT0xMKTsKKwkvKiBUaGUgSU9DVEwgc3RhdHVzIGlzIGVtYmVkZGVkIGluIHRoZSBtYWlsYm94IHN1YmhlYWRlci4gKi8KKwlzaGRyX3N0YXR1cyA9IGJmX2dldChscGZjX21ib3hfaGRyX3N0YXR1cywKKwkJCSAgICAgJnF1ZXJ5X2Z3X2NmZy0+aGVhZGVyLmNmZ19zaGRyLnJlc3BvbnNlKTsKKwlzaGRyX2FkZF9zdGF0dXMgPSBiZl9nZXQobHBmY19tYm94X2hkcl9hZGRfc3RhdHVzLAorCQkJCSAmcXVlcnlfZndfY2ZnLT5oZWFkZXIuY2ZnX3NoZHIucmVzcG9uc2UpOworCWlmIChzaGRyX3N0YXR1cyB8fCBzaGRyX2FkZF9zdGF0dXMgfHwgcmMgIT0gTUJYX1NVQ0NFU1MpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCSIyNjIyIFF1ZXJ5IEZpcm13YXJlIENvbmZpZyBmYWlsZWQgIgorCQkJCSJtYnggc3RhdHVzIHgleCwgc3RhdHVzIHgleCBhZGRfc3RhdHVzIHgleFxuIiwKKwkJCQlyYywgc2hkcl9zdGF0dXMsIHNoZHJfYWRkX3N0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWJmX2dldChscGZjX2Z1bmN0aW9uX21vZGVfZmNvZV9pLCBxdWVyeV9md19jZmcpKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkiMjYyMyBGQ29FIEZ1bmN0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgZmlybXdhcmUuICIKKwkJCQkiRnVuY3Rpb24gbW9kZSA9ICUwOHhcbiIsCisJCQkJcXVlcnlfZndfY2ZnLT5mdW5jdGlvbl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyYyAhPSBNQlhfVElNRU9VVCkKKwkJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBscGZjX3NsaTRfcGFyc2VfbGF0dF9mYXVsdCAtIFBhcnNlIHNsaTQgbGluay1hdHRlbnRpb24gbGluayBmYXVsdCBjb2RlCiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KICAqIEBhY3FlX2xpbms6IHBvaW50ZXIgdG8gdGhlIGFzeW5jIGxpbmsgY29tcGxldGlvbiBxdWV1ZSBlbnRyeS4KQEAgLTI5MTgsMTMgKzMwMDMsMTcgQEAKIHsKIAl1aW50OF90IGV2ZW50X3R5cGUgPSBiZl9nZXQobHBmY19hY3FlX2Zjb2VfZXZlbnRfdHlwZSwgYWNxZV9mY29lKTsKIAlpbnQgcmM7CisJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0OworCXN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwOworCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdDsKIAorCXBoYmEtPmZjX2V2ZW50VGFnID0gYWNxZV9mY29lLT5ldmVudF90YWc7CiAJcGhiYS0+ZmNvZV9ldmVudHRhZyA9IGFjcWVfZmNvZS0+ZXZlbnRfdGFnOwogCXN3aXRjaCAoZXZlbnRfdHlwZSkgewogCWNhc2UgTFBGQ19GQ09FX0VWRU5UX1RZUEVfTkVXX0ZDRjoKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfRElTQ09WRVJZLAogCQkJIjI1NDYgTmV3IEZDRiBmb3VuZCBpbmRleCAweCV4IHRhZyAweCV4XG4iLAotCQkJYWNxZV9mY29lLT5mY2ZfaW5kZXgsCisJCQlhY3FlX2Zjb2UtPmluZGV4LAogCQkJYWNxZV9mY29lLT5ldmVudF90YWcpOwogCQkvKgogCQkgKiBJZiB0aGUgY3VycmVudCBGQ0YgaXMgaW4gZGlzY292ZXJlZCBzdGF0ZSwgb3IKQEAgLTI5MzksMTIgKzMwMjgsMTEgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAogCQkvKiBSZWFkIHRoZSBGQ0YgdGFibGUgYW5kIHJlLWRpc2NvdmVyIFNBTi4gKi8KLQkJcmMgPSBscGZjX3NsaTRfcmVhZF9mY2ZfcmVjb3JkKHBoYmEsCi0JCQlMUEZDX0ZDT0VfRkNGX0dFVF9GSVJTVCk7CisJCXJjID0gbHBmY19zbGk0X3JlYWRfZmNmX3JlY29yZChwaGJhLCBMUEZDX0ZDT0VfRkNGX0dFVF9GSVJTVCk7CiAJCWlmIChyYykKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0RJU0NPVkVSWSwKLQkJCQkiMjU0NyBSZWFkIEZDRiByZWNvcmQgZmFpbGVkIDB4JXhcbiIsCi0JCQkJcmMpOworCQkJCQkiMjU0NyBSZWFkIEZDRiByZWNvcmQgZmFpbGVkIDB4JXhcbiIsCisJCQkJCXJjKTsKIAkJYnJlYWs7CiAKIAljYXNlIExQRkNfRkNPRV9FVkVOVF9UWVBFX0ZDRl9UQUJMRV9GVUxMOgpAQCAtMjk1NiwxMSArMzA0NCwxMSBAQAogCiAJY2FzZSBMUEZDX0ZDT0VfRVZFTlRfVFlQRV9GQ0ZfREVBRDoKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfRElTQ09WRVJZLAotCQkJIjI1NDkgRkNGIGRpc2Nvbm5lY3RlZCBmcm9uIG5ldHdvcmsgaW5kZXggMHgleCIKLQkJCSIgdGFnIDB4JXhcbiIsIGFjcWVfZmNvZS0+ZmNmX2luZGV4LAorCQkJIjI1NDkgRkNGIGRpc2Nvbm5lY3RlZCBmcm9tIG5ldHdvcmsgaW5kZXggMHgleCIKKwkJCSIgdGFnIDB4JXhcbiIsIGFjcWVfZmNvZS0+aW5kZXgsCiAJCQlhY3FlX2Zjb2UtPmV2ZW50X3RhZyk7CiAJCS8qIElmIHRoZSBldmVudCBpcyBub3QgZm9yIGN1cnJlbnRseSB1c2VkIGZjZiBkbyBub3RoaW5nICovCi0JCWlmIChwaGJhLT5mY2YuZmNmX2luZHggIT0gYWNxZV9mY29lLT5mY2ZfaW5kZXgpCisJCWlmIChwaGJhLT5mY2YuZmNmX2luZHggIT0gYWNxZV9mY29lLT5pbmRleCkKIAkJCWJyZWFrOwogCQkvKgogCQkgKiBDdXJyZW50bHksIGRyaXZlciBzdXBwb3J0IG9ubHkgb25lIEZDRiAtIHNvIHRyZWF0IHRoaXMgYXMKQEAgLTI5NzAsNyArMzA1OCwyOCBAQAogCQkvKiBVbnJlZ2lzdGVyIEZDRiBpZiBubyBkZXZpY2VzIGNvbm5lY3RlZCB0byBpdCAqLwogCQlscGZjX3VucmVnaXN0ZXJfdW51c2VkX2ZjZihwaGJhKTsKIAkJYnJlYWs7Ci0KKwljYXNlIExQRkNfRkNPRV9FVkVOVF9UWVBFX0NWTDoKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfRElTQ09WRVJZLAorCQkJIjI3MTggQ2xlYXIgVmlydHVhbCBMaW5rIFJlY2VpdmVkIGZvciBWUEkgMHgleCIKKwkJCSIgdGFnIDB4JXhcbiIsIGFjcWVfZmNvZS0+aW5kZXgsIGFjcWVfZmNvZS0+ZXZlbnRfdGFnKTsKKwkJdnBvcnQgPSBscGZjX2ZpbmRfdnBvcnRfYnlfdnBpZChwaGJhLAorCQkJCWFjcWVfZmNvZS0+aW5kZXggLSBwaGJhLT52cGlfYmFzZSk7CisJCWlmICghdnBvcnQpCisJCQlicmVhazsKKwkJbmRscCA9IGxwZmNfZmluZG5vZGVfZGlkKHZwb3J0LCBGYWJyaWNfRElEKTsKKwkJaWYgKCFuZGxwKQorCQkJYnJlYWs7CisJCXNob3N0ID0gbHBmY19zaG9zdF9mcm9tX3Zwb3J0KHZwb3J0KTsKKwkJbHBmY19saW5rZG93bl9wb3J0KHZwb3J0KTsKKwkJaWYgKHZwb3J0LT5wb3J0X3R5cGUgIT0gTFBGQ19OUElWX1BPUlQpIHsKKwkJCW1vZF90aW1lcigmbmRscC0+bmxwX2RlbGF5ZnVuYywgamlmZmllcyArIEhaKTsKKwkJCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CisJCQluZGxwLT5ubHBfZmxhZyB8PSBOTFBfREVMQVlfVE1POworCQkJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOworCQkJbmRscC0+bmxwX2xhc3RfZWxzY21kID0gRUxTX0NNRF9GTE9HSTsKKwkJCXZwb3J0LT5wb3J0X3N0YXRlID0gTFBGQ19GTE9HSTsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCiAJCQkiMDI4OCBVbmtub3duIEZDb0UgZXZlbnQgdHlwZSAweCV4IGV2ZW50IHRhZyAiCkBAIC0yOTkwLDYgKzMwOTksNyBAQAogbHBmY19zbGk0X2FzeW5jX2RjYnhfZXZ0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwKIAkJCSBzdHJ1Y3QgbHBmY19hY3FlX2RjYnggKmFjcWVfZGNieCkKIHsKKwlwaGJhLT5mY19ldmVudFRhZyA9IGFjcWVfZGNieC0+ZXZlbnRfdGFnOwogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKIAkJCSIwMjkwIFRoZSBTTEk0IERDQlggYXN5bmNocm9ub3VzIGV2ZW50IGlzIG5vdCAiCiAJCQkiaGFuZGxlZCB5ZXRcbiIpOwpAQCAtMzEyNCw3ICszMjM0LDcgQEAKICAqIFBDSSBkZXZpY2VzLgogICoKICAqIFJldHVybiBjb2RlcwotICogCTAgLSBzdWNlc3NmdWwKKyAqIAkwIC0gc3VjY2Vzc2Z1bAogICogCW90aGVyIHZhbHVlcyAtIGVycm9yCiAgKiovCiBzdGF0aWMgaW50CkBAIC0zMjIwLDcgKzMzMzAsNyBAQAogICogc3VwcG9ydCB0aGUgU0xJLTMgSEJBIGRldmljZSBpdCBhdHRhY2hlZCB0by4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqIAlvdGhlciB2YWx1ZXMgLSBlcnJvcgogICoqLwogc3RhdGljIGludApAQCAtMzMyMSw3ICszNDMxLDcgQEAKICAqIHN1cHBvcnQgdGhlIFNMSS00IEhCQSBkZXZpY2UgaXQgYXR0YWNoZWQgdG8uCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAJMCAtIHN1Y2Vzc2Z1bAorICogCTAgLSBzdWNjZXNzZnVsCiAgKiAJb3RoZXIgdmFsdWVzIC0gZXJyb3IKICAqKi8KIHN0YXRpYyBpbnQKQEAgLTM0MzIsNyArMzU0Miw3IEBACiAJLyogRHJpdmVyIGludGVybmVsIHNsb3ctcGF0aCBDUSBFdmVudCBwb29sICovCiAJSU5JVF9MSVNUX0hFQUQoJnBoYmEtPnNsaTRfaGJhLnNwX2NxZV9ldmVudF9wb29sKTsKIAkvKiBSZXNwb25zZSBJT0NCIHdvcmsgcXVldWUgbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCZwaGJhLT5zbGk0X2hiYS5zcF9yc3Bpb2NiX3dvcmtfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZwaGJhLT5zbGk0X2hiYS5zcF9xdWV1ZV9ldmVudCk7CiAJLyogQXN5bmNocm9ub3VzIGV2ZW50IENRIEV2ZW50IHdvcmsgcXVldWUgbGlzdCAqLwogCUlOSVRfTElTVF9IRUFEKCZwaGJhLT5zbGk0X2hiYS5zcF9hc3luY2Vfd29ya19xdWV1ZSk7CiAJLyogRmFzdC1wYXRoIFhSSSBhYm9ydGVkIENRIEV2ZW50IHdvcmsgcXVldWUgbGlzdCAqLwpAQCAtMzQ2MSw2ICszNTcxLDEwIEBACiAJaWYgKHVubGlrZWx5KHJjKSkKIAkJZ290byBvdXRfZnJlZV9ic21ieDsKIAorCXJjID0gbHBmY19zbGk0X2Z3X2NmZ19jaGVjayhwaGJhKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlnb3RvIG91dF9mcmVlX2JzbWJ4OworCiAJLyogU2V0IHVwIHRoZSBoYmEncyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICovCiAJcmMgPSBscGZjX3NsaTRfcmVhZF9jb25maWcocGhiYSk7CiAJaWYgKHVubGlrZWx5KHJjKSkKQEAgLTM1OTQsOCArMzcwOCwxMCBAQAogCiAJLyogRnJlZSB0aGUgY3VycmVudCBjb25uZWN0IHRhYmxlICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm5fZW50cnksIG5leHRfY29ubl9lbnRyeSwKLQkJJnBoYmEtPmZjZl9jb25uX3JlY19saXN0LCBsaXN0KQorCQkmcGhiYS0+ZmNmX2Nvbm5fcmVjX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY29ubl9lbnRyeS0+bGlzdCk7CiAJCWtmcmVlKGNvbm5fZW50cnkpOworCX0KIAogCXJldHVybjsKIH0KQEAgLTM2NDIsNyArMzc1OCw3IEBACiAgKiBkZXZpY2Ugc3BlY2lmaWMgcmVzb3VyY2Ugc2V0dXAgdG8gc3VwcG9ydCB0aGUgSEJBIGRldmljZSBpdCBhdHRhY2hlZCB0by4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqCTAgLSBzdWNlc3NmdWwKKyAqCTAgLSBzdWNjZXNzZnVsCiAgKglvdGhlciB2YWx1ZXMgLSBlcnJvcgogICoqLwogc3RhdGljIGludApAQCAtMzY4OCw3ICszODA0LDcgQEAKICAqIGRldmljZSBzcGVjaWZpYyByZXNvdXJjZSBzZXR1cCB0byBzdXBwb3J0IHRoZSBIQkEgZGV2aWNlIGl0IGF0dGFjaGVkIHRvLgogICoKICAqIFJldHVybiBjb2RlcwotICogCTAgLSBzdWNlc3NmdWwKKyAqIAkwIC0gc3VjY2Vzc2Z1bAogICogCW90aGVyIHZhbHVlcyAtIGVycm9yCiAgKiovCiBzdGF0aWMgaW50CkBAIC0zNzUzLDcgKzM4NjksNyBAQAogICogbGlzdCBhbmQgc2V0IHVwIHRoZSBJT0NCIHRhZyBhcnJheSBhY2NvcmRpbmdseS4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqCTAgLSBzdWNlc3NmdWwKKyAqCTAgLSBzdWNjZXNzZnVsCiAgKglvdGhlciB2YWx1ZXMgLSBlcnJvcgogICoqLwogc3RhdGljIGludApAQCAtMzgyNCw3ICszOTQwLDcgQEAKIAlyYyA9IGxwZmNfc2xpNF9yZW1vdmVfYWxsX3NnbF9wYWdlcyhwaGJhKTsKIAlpZiAocmMpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAotCQkJIjIwMDUgVW5hYmxlIHRvIGRlcmVnaXN0ZXIgcGFnZXMgZnJvbSBIQkE6ICV4IiwgcmMpOworCQkJIjIwMDUgVW5hYmxlIHRvIGRlcmVnaXN0ZXIgcGFnZXMgZnJvbSBIQkE6ICV4XG4iLCByYyk7CiAJfQogCWtmcmVlKHBoYmEtPnNsaTRfaGJhLmxwZmNfZWxzX3NnbF9hcnJheSk7CiB9CkBAIC0zODcyLDcgKzM5ODgsNyBAQAogICogbGlzdCBhbmQgc2V0IHVwIHRoZSBzZ2wgeHJpdGFnIHRhZyBhcnJheSBhY2NvcmRpbmdseS4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqCTAgLSBzdWNlc3NmdWwKKyAqCTAgLSBzdWNjZXNzZnVsCiAgKglvdGhlciB2YWx1ZXMgLSBlcnJvcgogICoqLwogc3RhdGljIGludApAQCAtMzk4Niw3ICs0MTAyLDcgQEAKICAqIGVuYWJsZWQgYW5kIHRoZSBkcml2ZXIgaXMgcmVpbml0aWFsaXppbmcgdGhlIGRldmljZS4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqIAlFTk9NRU0gLSBObyBhdmFpbGJsZSBtZW1vcnkKICAqICAgICAgRUlPIC0gVGhlIG1haWxib3ggZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KICAqKi8KQEAgLTQxNDYsNyArNDI2Miw3IEBACiAgKiBQQ0kgZGV2aWNlIGRhdGEgc3RydWN0dXJlIGlzIHNldC4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqICAgICAgcG9pbnRlciB0byBAcGhiYSAtIHN1Y2Vzc2Z1bAorICogICAgICBwb2ludGVyIHRvIEBwaGJhIC0gc3VjY2Vzc2Z1bAogICogICAgICBOVUxMIC0gZXJyb3IKICAqKi8KIHN0YXRpYyBzdHJ1Y3QgbHBmY19oYmEgKgpAQCAtNDIwMiw3ICs0MzE4LDcgQEAKICAqIGhvc3Qgd2l0aCBpdC4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqICAgICAgMCAtIHN1Y2Vzc2Z1bAorICogICAgICAwIC0gc3VjY2Vzc2Z1bAogICogICAgICBvdGhlciB2YWx1ZXMgLSBlcnJvcgogICoqLwogc3RhdGljIGludApAQCAtNDI3Myw3ICs0Mzg5LDggQEAKIAkJCV9kdW1wX2J1Zl9kYXRhID0KIAkJCQkoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VjbnQpOwogCQkJaWYgKF9kdW1wX2J1Zl9kYXRhKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgYWxsb2NhdGVkICVkIHBhZ2VzIGZvciAiCisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJCSI5MDQzIEJMS0dSRDogYWxsb2NhdGVkICVkIHBhZ2VzIGZvciAiCiAJCQkJICAgICAgICJfZHVtcF9idWZfZGF0YSBhdCAweCVwXG4iLAogCQkJCSAgICAgICAoMSA8PCBwYWdlY250KSwgX2R1bXBfYnVmX2RhdGEpOwogCQkJCV9kdW1wX2J1Zl9kYXRhX29yZGVyID0gcGFnZWNudDsKQEAgLTQyODQsMTcgKzQ0MDEsMjAgQEAKIAkJCQktLXBhZ2VjbnQ7CiAJCX0KIAkJaWYgKCFfZHVtcF9idWZfZGF0YV9vcmRlcikKLQkJCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SIHVuYWJsZSB0byBhbGxvY2F0ZSAiCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCQkiOTA0NCBCTEtHUkQ6IEVSUk9SIHVuYWJsZSB0byBhbGxvY2F0ZSAiCiAJCQkgICAgICAgIm1lbW9yeSBmb3IgaGV4ZHVtcFxuIik7CiAJfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIGFscmVhZHkgYWxsb2NhdGVkIF9kdW1wX2J1Zl9kYXRhPTB4JXAiCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJIjkwNDUgQkxLR1JEOiBhbHJlYWR5IGFsbG9jYXRlZCBfZHVtcF9idWZfZGF0YT0weCVwIgogCQkgICAgICAgIlxuIiwgX2R1bXBfYnVmX2RhdGEpOwogCWlmICghX2R1bXBfYnVmX2RpZikgewogCQl3aGlsZSAocGFnZWNudCkgewogCQkJX2R1bXBfYnVmX2RpZiA9CiAJCQkJKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlY250KTsKIAkJCWlmIChfZHVtcF9idWZfZGlmKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgYWxsb2NhdGVkICVkIHBhZ2VzIGZvciAiCisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJCSI5MDQ2IEJMS0dSRDogYWxsb2NhdGVkICVkIHBhZ2VzIGZvciAiCiAJCQkJICAgICAgICJfZHVtcF9idWZfZGlmIGF0IDB4JXBcbiIsCiAJCQkJICAgICAgICgxIDw8IHBhZ2VjbnQpLCBfZHVtcF9idWZfZGlmKTsKIAkJCQlfZHVtcF9idWZfZGlmX29yZGVyID0gcGFnZWNudDsKQEAgLTQzMDUsMTAgKzQ0MjUsMTIgQEAKIAkJCQktLXBhZ2VjbnQ7CiAJCX0KIAkJaWYgKCFfZHVtcF9idWZfZGlmX29yZGVyKQotCQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgRVJST1IgdW5hYmxlIHRvIGFsbG9jYXRlICIKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJIjkwNDcgQkxLR1JEOiBFUlJPUiB1bmFibGUgdG8gYWxsb2NhdGUgIgogCQkJICAgICAgICJtZW1vcnkgZm9yIGhleGR1bXBcbiIpOwogCX0gZWxzZQotCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCBhbHJlYWR5IGFsbG9jYXRlZCBfZHVtcF9idWZfZGlmPTB4JXBcbiIsCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJIjkwNDggQkxLR1JEOiBhbHJlYWR5IGFsbG9jYXRlZCBfZHVtcF9idWZfZGlmPTB4JXBcbiIsCiAJCSAgICAgICBfZHVtcF9idWZfZGlmKTsKIH0KIApAQCAtNDM2NSw3ICs0NDg3LDcgQEAKICAqIHdpdGggU0xJLTMgaW50ZXJmYWNlIHNwZWMuCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAJMCAtIHN1Y2Vzc2Z1bAorICogCTAgLSBzdWNjZXNzZnVsCiAgKiAJb3RoZXIgdmFsdWVzIC0gZXJyb3IKICAqKi8KIHN0YXRpYyBpbnQKQEAgLTQ1MTIsNyArNDYzNCw2IEBACiBscGZjX3NsaTRfcG9zdF9zdGF0dXNfY2hlY2soc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewogCXN0cnVjdCBscGZjX3JlZ2lzdGVyIHN0YV9yZWcsIHVlcnJsb19yZWcsIHVlcnJoaV9yZWcsIHNjcmF0Y2hwYWQ7Ci0JdWludDMyX3Qgb25sbnJlZzAsIG9ubG5yZWcxOwogCWludCBpLCBwb3J0X2Vycm9yID0gLUVOT0RFVjsKIAogCWlmICghcGhiYS0+c2xpNF9oYmEuU1RBcmVnYWRkcikKQEAgLTQ1NTYsMjEgKzQ2NzcsMjAgQEAKIAkJCWJmX2dldChscGZjX3NjcmF0Y2hwYWRfc2xpcmV2LCAmc2NyYXRjaHBhZCksCiAJCQliZl9nZXQobHBmY19zY3JhdGNocGFkX2ZlYXR1cmVsZXZlbDEsICZzY3JhdGNocGFkKSwKIAkJCWJmX2dldChscGZjX3NjcmF0Y2hwYWRfZmVhdHVyZWxldmVsMiwgJnNjcmF0Y2hwYWQpKTsKLQorCXBoYmEtPnNsaTRfaGJhLnVlX21hc2tfbG8gPSByZWFkbChwaGJhLT5zbGk0X2hiYS5VRU1BU0tMT3JlZ2FkZHIpOworCXBoYmEtPnNsaTRfaGJhLnVlX21hc2tfaGkgPSByZWFkbChwaGJhLT5zbGk0X2hiYS5VRU1BU0tISXJlZ2FkZHIpOwogCS8qIFdpdGggdW5jb3ZlcmFibGUgZXJyb3IsIGxvZyB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIGVycm9yICovCi0Jb25sbnJlZzAgPSByZWFkbChwaGJhLT5zbGk0X2hiYS5PTkxJTkUwcmVnYWRkcik7Ci0Jb25sbnJlZzEgPSByZWFkbChwaGJhLT5zbGk0X2hiYS5PTkxJTkUxcmVnYWRkcik7Ci0JaWYgKChvbmxucmVnMCAhPSBMUEZDX09OTElORV9ORVJSKSB8fCAob25sbnJlZzEgIT0gTFBGQ19PTkxJTkVfTkVSUikpIHsKLQkJdWVycmxvX3JlZy53b3JkMCA9IHJlYWRsKHBoYmEtPnNsaTRfaGJhLlVFUlJMT3JlZ2FkZHIpOwotCQl1ZXJyaGlfcmVnLndvcmQwID0gcmVhZGwocGhiYS0+c2xpNF9oYmEuVUVSUkhJcmVnYWRkcik7Ci0JCWlmICh1ZXJybG9fcmVnLndvcmQwIHx8IHVlcnJoaV9yZWcud29yZDApIHsKLQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCi0JCQkJCSIxNDIyIEhCQSBVbnJlY292ZXJhYmxlIGVycm9yOiAiCi0JCQkJCSJ1ZXJyX2xvX3JlZz0weCV4LCB1ZXJyX2hpX3JlZz0weCV4LCAiCi0JCQkJCSJvbmxpbmUwX3JlZz0weCV4LCBvbmxpbmUxX3JlZz0weCV4XG4iLAotCQkJCQl1ZXJybG9fcmVnLndvcmQwLCB1ZXJyaGlfcmVnLndvcmQwLAotCQkJCQlvbmxucmVnMCwgb25sbnJlZzEpOwotCQl9CisJdWVycmxvX3JlZy53b3JkMCA9IHJlYWRsKHBoYmEtPnNsaTRfaGJhLlVFUlJMT3JlZ2FkZHIpOworCXVlcnJoaV9yZWcud29yZDAgPSByZWFkbChwaGJhLT5zbGk0X2hiYS5VRVJSSElyZWdhZGRyKTsKKwlpZiAoKH5waGJhLT5zbGk0X2hiYS51ZV9tYXNrX2xvICYgdWVycmxvX3JlZy53b3JkMCkgfHwKKwkgICAgKH5waGJhLT5zbGk0X2hiYS51ZV9tYXNrX2hpICYgdWVycmhpX3JlZy53b3JkMCkpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMTQyMiBIQkEgVW5yZWNvdmVyYWJsZSBlcnJvcjogIgorCQkJCSJ1ZXJyX2xvX3JlZz0weCV4LCB1ZXJyX2hpX3JlZz0weCV4LCAiCisJCQkJInVlX21hc2tfbG9fcmVnPTB4JXgsIHVlX21hc2tfaGlfcmVnPTB4JXhcbiIsCisJCQkJdWVycmxvX3JlZy53b3JkMCwgdWVycmhpX3JlZy53b3JkMCwKKwkJCQlwaGJhLT5zbGk0X2hiYS51ZV9tYXNrX2xvLAorCQkJCXBoYmEtPnNsaTRfaGJhLnVlX21hc2tfaGkpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTQ1OTEsMTAgKzQ3MTEsMTAgQEAKIAkJCQkJTFBGQ19VRVJSX1NUQVRVU19MTzsKIAlwaGJhLT5zbGk0X2hiYS5VRVJSSElyZWdhZGRyID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKIAkJCQkJTFBGQ19VRVJSX1NUQVRVU19ISTsKLQlwaGJhLT5zbGk0X2hiYS5PTkxJTkUwcmVnYWRkciA9IHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCi0JCQkJCUxQRkNfT05MSU5FMDsKLQlwaGJhLT5zbGk0X2hiYS5PTkxJTkUxcmVnYWRkciA9IHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCi0JCQkJCUxQRkNfT05MSU5FMTsKKwlwaGJhLT5zbGk0X2hiYS5VRU1BU0tMT3JlZ2FkZHIgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQlMUEZDX1VFX01BU0tfTE87CisJcGhiYS0+c2xpNF9oYmEuVUVNQVNLSElyZWdhZGRyID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJTFBGQ19VRV9NQVNLX0hJOwogCXBoYmEtPnNsaTRfaGJhLlNDUkFUQ0hQQURyZWdhZGRyID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKIAkJCQkJTFBGQ19TQ1JBVENIUEFEOwogfQpAQCAtNDY2Miw3ICs0NzgyLDcgQEAKICAqIHRoaXMgcm91dGluZS4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqIAlFTk9NRU0gLSBjb3VsZCBub3QgYWxsb2NhdGVkIG1lbW9yeS4KICAqKi8KIHN0YXRpYyBpbnQKQEAgLTQ3NjEsNyArNDg4MSw3IEBACiAgKiBhbGxvY2F0aW9uIGZvciB0aGUgcG9ydC4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqIAlFTk9NRU0gLSBObyBhdmFpbGJsZSBtZW1vcnkKICAqICAgICAgRUlPIC0gVGhlIG1haWxib3ggZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KICAqKi8KQEAgLTQ4MjUsNyArNDk0NSw4IEBACiAJCXBoYmEtPnZwaV9iYXNlID0gcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS52cGlfYmFzZTsKIAkJcGhiYS0+dmZpX2Jhc2UgPSBwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLnZmaV9iYXNlOwogCQlwaGJhLT5zbGk0X2hiYS5uZXh0X3JwaSA9IHBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ucnBpX2Jhc2U7Ci0JCXBoYmEtPm1heF92cGkgPSBwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF92cGk7CisJCXBoYmEtPm1heF92cGkgPSAocGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfdnBpID4gMCkgPworCQkJCShwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF92cGkgLSAxKSA6IDA7CiAJCXBoYmEtPm1heF92cG9ydHMgPSBwaGJhLT5tYXhfdnBpOwogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfU0xJLAogCQkJCSIyMDAzIGNmZyBwYXJhbXMgWFJJKEI6JWQgTTolZCksICIKQEAgLTQ4NjEsNyArNDk4Miw3IEBACiAgKiBIQkEgY29uc2lzdGVudCB3aXRoIHRoZSBTTEktNCBpbnRlcmZhY2Ugc3BlYy4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqIAlFTk9NRU0gLSBObyBhdmFpbGJsZSBtZW1vcnkKICAqICAgICAgRUlPIC0gVGhlIG1haWxib3ggZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KICAqKi8KQEAgLTQ5MTAsNyArNTAzMSw3IEBACiAgKiB3ZSBqdXN0IHVzZSBzb21lIGNvbnN0YW50IG51bWJlciBhcyBwbGFjZSBob2xkZXIuCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAgICAgIDAgLSBzdWNlc3NmdWwKKyAqICAgICAgMCAtIHN1Y2Nlc3NmdWwKICAqICAgICAgRU5PTUVNIC0gTm8gYXZhaWxibGUgbWVtb3J5CiAgKiAgICAgIEVJTyAtIFRoZSBtYWlsYm94IGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCiAgKiovCkBAIC00OTc5LDEwICs1MTAwLDkgQEAKIAkvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgbW9yZSBFUXMgdGhhbiBXUXMgKi8KIAlpZiAoY2ZnX2ZjcF9lcV9jb3VudCA+IHBoYmEtPmNmZ19mY3Bfd3FfY291bnQpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0lOSVQsCi0JCQkJIjI1OTMgVGhlIG51bWJlciBvZiBGQ1AgRVFzICglZCkgaXMgbW9yZSAiCi0JCQkJInRoYW4gdGhlIG51bWJlciBvZiBGQ1AgV1FzICglZCksIHRha2UgIgotCQkJCSJ0aGUgbnVtYmVyIG9mIEZDUCBFUXMgc2FtZSBhcyB0aGFuIG9mICIKLQkJCQkiV1FzICglZClcbiIsIGNmZ19mY3BfZXFfY291bnQsCisJCQkJIjI1OTMgVGhlIEZDUCBFUSBjb3VudCglZCkgY2Fubm90IGJlIGdyZWF0ZXIgIgorCQkJCSJ0aGFuIHRoZSBGQ1AgV1EgY291bnQoJWQpLCBsaW1pdGluZyB0aGUgIgorCQkJCSJGQ1AgRVEgY291bnQgdG8gJWRcbiIsIGNmZ19mY3BfZXFfY291bnQsCiAJCQkJcGhiYS0+Y2ZnX2ZjcF93cV9jb3VudCwKIAkJCQlwaGJhLT5jZmdfZmNwX3dxX2NvdW50KTsKIAkJY2ZnX2ZjcF9lcV9jb3VudCA9IHBoYmEtPmNmZ19mY3Bfd3FfY291bnQ7CkBAIC01MDU4LDE1ICs1MTc4LDYgQEAKIAl9CiAJcGhiYS0+c2xpNF9oYmEuZWxzX2NxID0gcWRlc2M7CiAKLQkvKiBDcmVhdGUgc2xvdy1wYXRoIFVuc29saWNpdGVkIFJlY2VpdmUgQ29tcGxldGUgUXVldWUgKi8KLQlxZGVzYyA9IGxwZmNfc2xpNF9xdWV1ZV9hbGxvYyhwaGJhLCBwaGJhLT5zbGk0X2hiYS5jcV9lc2l6ZSwKLQkJCQkgICAgICBwaGJhLT5zbGk0X2hiYS5jcV9lY291bnQpOwotCWlmICghcWRlc2MpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMDUwMiBGYWlsZWQgYWxsb2NhdGUgc2xvdy1wYXRoIFVTT0wgUlggQ1FcbiIpOwotCQlnb3RvIG91dF9mcmVlX2Vsc19jcTsKLQl9Ci0JcGhiYS0+c2xpNF9oYmEucnhxX2NxID0gcWRlc2M7CiAKIAkvKiBDcmVhdGUgZmFzdC1wYXRoIEZDUCBDb21wbGV0aW9uIFF1ZXVlKHMpLCBvbmUtdG8tb25lIHdpdGggRVFzICovCiAJcGhiYS0+c2xpNF9oYmEuZmNwX2NxID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBscGZjX3F1ZXVlICopICoKQEAgLTUwNzUsNyArNTE4Niw3IEBACiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjI1NzcgRmFpbGVkIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmFzdC1wYXRoICIKIAkJCQkiQ1EgcmVjb3JkIGFycmF5XG4iKTsKLQkJZ290byBvdXRfZnJlZV9yeHFfY3E7CisJCWdvdG8gb3V0X2ZyZWVfZWxzX2NxOwogCX0KIAlmb3IgKGZjcF9jcWlkeCA9IDA7IGZjcF9jcWlkeCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQ7IGZjcF9jcWlkeCsrKSB7CiAJCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmNxX2VzaXplLApAQCAtNTE4OCw5ICs1Mjk5LDYgQEAKIAkJcGhiYS0+c2xpNF9oYmEuZmNwX2NxW2ZjcF9jcWlkeF0gPSBOVUxMOwogCX0KIAlrZnJlZShwaGJhLT5zbGk0X2hiYS5mY3BfY3EpOwotb3V0X2ZyZWVfcnhxX2NxOgotCWxwZmNfc2xpNF9xdWV1ZV9mcmVlKHBoYmEtPnNsaTRfaGJhLnJ4cV9jcSk7Ci0JcGhiYS0+c2xpNF9oYmEucnhxX2NxID0gTlVMTDsKIG91dF9mcmVlX2Vsc19jcToKIAlscGZjX3NsaTRfcXVldWVfZnJlZShwaGJhLT5zbGk0X2hiYS5lbHNfY3EpOwogCXBoYmEtPnNsaTRfaGJhLmVsc19jcSA9IE5VTEw7CkBAIC01MjE4LDcgKzUzMjYsNyBAQAogICogb3BlcmF0aW9uLgogICoKICAqIFJldHVybiBjb2RlcwotICogICAgICAwIC0gc3VjZXNzZnVsCisgKiAgICAgIDAgLSBzdWNjZXNzZnVsCiAgKiAgICAgIEVOT01FTSAtIE5vIGF2YWlsYmxlIG1lbW9yeQogICogICAgICBFSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgogICoqLwpAQCAtNTI0NywxMCArNTM1NSw2IEBACiAJbHBmY19zbGk0X3F1ZXVlX2ZyZWUocGhiYS0+c2xpNF9oYmEuZGF0X3JxKTsKIAlwaGJhLT5zbGk0X2hiYS5kYXRfcnEgPSBOVUxMOwogCi0JLyogUmVsZWFzZSB1bnNvbGljaXRlZCByZWNlaXZlIGNvbXBsZXRlIHF1ZXVlICovCi0JbHBmY19zbGk0X3F1ZXVlX2ZyZWUocGhiYS0+c2xpNF9oYmEucnhxX2NxKTsKLQlwaGJhLT5zbGk0X2hiYS5yeHFfY3EgPSBOVUxMOwotCiAJLyogUmVsZWFzZSBFTFMgY29tcGxldGUgcXVldWUgKi8KIAlscGZjX3NsaTRfcXVldWVfZnJlZShwaGJhLT5zbGk0X2hiYS5lbHNfY3EpOwogCXBoYmEtPnNsaTRfaGJhLmVsc19jcSA9IE5VTEw7CkBAIC01Mjg2LDcgKzUzOTAsNyBAQAogICogb3BlcmF0aW9uLgogICoKICAqIFJldHVybiBjb2RlcwotICogICAgICAwIC0gc3VjZXNzZnVsCisgKiAgICAgIDAgLSBzdWNjZXNzZnVsCiAgKiAgICAgIEVOT01FTSAtIE5vIGF2YWlsYmxlIG1lbW9yeQogICogICAgICBFSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgogICoqLwpAQCAtNTM4MywyNSArNTQ4Nyw2IEBACiAJCQlwaGJhLT5zbGk0X2hiYS5lbHNfY3EtPnF1ZXVlX2lkLAogCQkJcGhiYS0+c2xpNF9oYmEuc3BfZXEtPnF1ZXVlX2lkKTsKIAotCS8qIFNldCB1cCBzbG93LXBhdGggVW5zb2xpY2l0ZWQgUmVjZWl2ZSBDb21wbGV0ZSBRdWV1ZSAqLwotCWlmICghcGhiYS0+c2xpNF9oYmEucnhxX2NxKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCi0JCQkJIjA1MzIgVVNPTCBSWCBDUSBub3QgYWxsb2NhdGVkXG4iKTsKLQkJZ290byBvdXRfZGVzdHJveV9lbHNfY3E7Ci0JfQotCXJjID0gbHBmY19jcV9jcmVhdGUocGhiYSwgcGhiYS0+c2xpNF9oYmEucnhxX2NxLCBwaGJhLT5zbGk0X2hiYS5zcF9lcSwKLQkJCSAgICBMUEZDX1JDUSwgTFBGQ19VU09MKTsKLQlpZiAocmMpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMDUzMyBGYWlsZWQgc2V0dXAgb2Ygc2xvdy1wYXRoIFVTT0wgUlggQ1E6ICIKLQkJCQkicmMgPSAweCV4XG4iLCByYyk7Ci0JCWdvdG8gb3V0X2Rlc3Ryb3lfZWxzX2NxOwotCX0KLQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKLQkJCSIyNTg3IFVTTCBDUSBzZXR1cDogY3EtaWQ9JWQsIHBhcmVudCBlcS1pZD0lZFxuIiwKLQkJCXBoYmEtPnNsaTRfaGJhLnJ4cV9jcS0+cXVldWVfaWQsCi0JCQlwaGJhLT5zbGk0X2hiYS5zcF9lcS0+cXVldWVfaWQpOwotCiAJLyogU2V0IHVwIGZhc3QtcGF0aCBGQ1AgUmVzcG9uc2UgQ29tcGxldGUgUXVldWUgKi8KIAlmb3IgKGZjcF9jcWlkeCA9IDA7IGZjcF9jcWlkeCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQ7IGZjcF9jcWlkeCsrKSB7CiAJCWlmICghcGhiYS0+c2xpNF9oYmEuZmNwX2NxW2ZjcF9jcWlkeF0pIHsKQEAgLTU1MDcsNyArNTU5Miw3IEBACiAJCWdvdG8gb3V0X2Rlc3Ryb3lfZmNwX3dxOwogCX0KIAlyYyA9IGxwZmNfcnFfY3JlYXRlKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmhkcl9ycSwgcGhiYS0+c2xpNF9oYmEuZGF0X3JxLAotCQkJICAgIHBoYmEtPnNsaTRfaGJhLnJ4cV9jcSwgTFBGQ19VU09MKTsKKwkJCSAgICBwaGJhLT5zbGk0X2hiYS5lbHNfY3EsIExQRkNfVVNPTCk7CiAJaWYgKHJjKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjA1NDEgRmFpbGVkIHNldHVwIG9mIFJlY2VpdmUgUXVldWU6ICIKQEAgLTU1MTksNyArNTYwNCw3IEBACiAJCQkicGFyZW50IGNxLWlkPSVkXG4iLAogCQkJcGhiYS0+c2xpNF9oYmEuaGRyX3JxLT5xdWV1ZV9pZCwKIAkJCXBoYmEtPnNsaTRfaGJhLmRhdF9ycS0+cXVldWVfaWQsCi0JCQlwaGJhLT5zbGk0X2hiYS5yeHFfY3EtPnF1ZXVlX2lkKTsKKwkJCXBoYmEtPnNsaTRfaGJhLmVsc19jcS0+cXVldWVfaWQpOwogCXJldHVybiAwOwogCiBvdXRfZGVzdHJveV9mY3Bfd3E6CkBAIC01NTMxLDggKzU2MTYsNiBAQAogb3V0X2Rlc3Ryb3lfZmNwX2NxOgogCWZvciAoLS1mY3BfY3FpZHg7IGZjcF9jcWlkeCA+PSAwOyBmY3BfY3FpZHgtLSkKIAkJbHBmY19jcV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLmZjcF9jcVtmY3BfY3FpZHhdKTsKLQlscGZjX2NxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEucnhxX2NxKTsKLW91dF9kZXN0cm95X2Vsc19jcToKIAlscGZjX2NxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEuZWxzX2NxKTsKIG91dF9kZXN0cm95X21ieF9jcToKIAlscGZjX2NxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEubWJ4X2NxKTsKQEAgLTU1NTIsNyArNTYzNSw3IEBACiAgKiBvcGVyYXRpb24uCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAgICAgIDAgLSBzdWNlc3NmdWwKKyAqICAgICAgMCAtIHN1Y2Nlc3NmdWwKICAqICAgICAgRU5PTUVNIC0gTm8gYXZhaWxibGUgbWVtb3J5CiAgKiAgICAgIEVJTyAtIFRoZSBtYWlsYm94IGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCiAgKiovCkBAIC01NTc0LDggKzU2NTcsNiBAQAogCWxwZmNfY3FfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5tYnhfY3EpOwogCS8qIFVuc2V0IEVMUyBjb21wbGV0ZSBxdWV1ZSAqLwogCWxwZmNfY3FfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5lbHNfY3EpOwotCS8qIFVuc2V0IHVuc29saWNpdGVkIHJlY2VpdmUgY29tcGxldGUgcXVldWUgKi8KLQlscGZjX2NxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEucnhxX2NxKTsKIAkvKiBVbnNldCBGQ1AgcmVzcG9uc2UgY29tcGxldGUgcXVldWUgKi8KIAlmb3IgKGZjcF9xaWR4ID0gMDsgZmNwX3FpZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50OyBmY3BfcWlkeCsrKQogCQlscGZjX2NxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEuZmNwX2NxW2ZjcF9xaWR4XSk7CkBAIC01NTk5LDcgKzU2ODAsNyBAQAogICogTGF0ZXIsIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGFsbCB0aGUgc2xvdy1wYXRoIGV2ZW50cy4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqICAgICAgMCAtIHN1Y2Vzc2Z1bAorICogICAgICAwIC0gc3VjY2Vzc2Z1bAogICogICAgICAtRU5PTUVNIC0gTm8gYXZhaWxibGUgbWVtb3J5CiAgKiovCiBzdGF0aWMgaW50CkBAIC01NzYwLDcgKzU4NDEsNyBAQAogICogYWxsIHJlc291cmNlcyBhc3NpZ25lZCB0byB0aGUgUENJIGZ1bmN0aW9uIHdoaWNoIG9yaWdpbmF0ZXMgdGhpcyByZXF1ZXN0LgogICoKICAqIFJldHVybiBjb2RlcwotICogICAgICAwIC0gc3VjZXNzZnVsCisgKiAgICAgIDAgLSBzdWNjZXNzZnVsCiAgKiAgICAgIEVOT01FTSAtIE5vIGF2YWlsYmxlIG1lbW9yeQogICogICAgICBFSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgogICoqLwpAQCAtNTkyMyw3ICs2MDA0LDcgQEAKICAqIHdpdGggU0xJLTQgaW50ZXJmYWNlIHNwZWMuCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAJMCAtIHN1Y2Vzc2Z1bAorICogCTAgLSBzdWNjZXNzZnVsCiAgKiAJb3RoZXIgdmFsdWVzIC0gZXJyb3IKICAqKi8KIHN0YXRpYyBpbnQKQEAgLTYwNTIsNyArNjEzMyw3IEBACiAgKiB3aWxsIGJlIGxlZnQgd2l0aCBNU0ktWCBlbmFibGVkIGFuZCBsZWFrcyBpdHMgdmVjdG9ycy4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqICAgMCAtIHN1Y2Vzc2Z1bAorICogICAwIC0gc3VjY2Vzc2Z1bAogICogICBvdGhlciB2YWx1ZXMgLSBlcnJvcgogICoqLwogc3RhdGljIGludApAQCAtNjE4NCw3ICs2MjY1LDcgQEAKICAqIGlzIGRvbmUgaW4gdGhpcyBmdW5jdGlvbi4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqIAlvdGhlciB2YWx1ZXMgLSBlcnJvcgogICovCiBzdGF0aWMgaW50CkBAIC02MjQzLDcgKzYzMjQsNyBAQAogICogTVNJLVggLT4gTVNJIC0+IElSUS4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqICAgMCAtIHN1Y2Vzc2Z1bAorICogICAwIC0gc3VjY2Vzc2Z1bAogICogICBvdGhlciB2YWx1ZXMgLSBlcnJvcgogICoqLwogc3RhdGljIHVpbnQzMl90CkBAIC02MzMzLDcgKzY0MTQsNyBAQAogICogZW5hYmxlZCBhbmQgbGVha3MgaXRzIHZlY3RvcnMuCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAwIC0gc3VjZXNzZnVsCisgKiAwIC0gc3VjY2Vzc2Z1bAogICogb3RoZXIgdmFsdWVzIC0gZXJyb3IKICAqKi8KIHN0YXRpYyBpbnQKQEAgLTY0NDMsNyArNjUyNCw3IEBACiAgKiB3aGljaCBpcyBkb25lIGluIHRoaXMgZnVuY3Rpb24uCiAgKgogICogUmV0dXJuIGNvZGVzCi0gKiAJMCAtIHN1Y2Vzc2Z1bAorICogCTAgLSBzdWNjZXNzZnVsCiAgKiAJb3RoZXIgdmFsdWVzIC0gZXJyb3IKICAqKi8KIHN0YXRpYyBpbnQKQEAgLTY1MDgsNyArNjU4OSw3IEBACiAgKiBNU0ktWCAtPiBNU0kgLT4gSVJRLgogICoKICAqIFJldHVybiBjb2RlcwotICogCTAgLSBzdWNlc3NmdWwKKyAqIAkwIC0gc3VjY2Vzc2Z1bAogICogCW90aGVyIHZhbHVlcyAtIGVycm9yCiAgKiovCiBzdGF0aWMgdWludDMyX3QKQEAgLTY3MjIsNiArNjgwMyw3IEBACiB7CiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmE7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gTlVMTDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBOVUxMOwogCWludCBlcnJvcjsKIAl1aW50MzJfdCBjZmdfbW9kZSwgaW50cl9tb2RlOwogCkBAIC02ODAwLDYgKzY4ODIsNyBAQAogCQlnb3RvIG91dF9kZXN0cm95X3Nob3N0OwogCX0KIAorCXNob3N0ID0gbHBmY19zaG9zdF9mcm9tX3Zwb3J0KHZwb3J0KTsgLyogc2F2ZSBzaG9zdCBmb3IgZXJyb3IgY2xlYW51cCAqLwogCS8qIE5vdywgdHJ5aW5nIHRvIGVuYWJsZSBpbnRlcnJ1cHQgYW5kIGJyaW5nIHVwIHRoZSBkZXZpY2UgKi8KIAljZmdfbW9kZSA9IHBoYmEtPmNmZ191c2VfbXNpOwogCXdoaWxlICh0cnVlKSB7CkBAIC02ODY2LDYgKzY5NDksOCBAQAogCWxwZmNfc2xpX3BjaV9tZW1fdW5zZXQocGhiYSk7CiBvdXRfZGlzYWJsZV9wY2lfZGV2OgogCWxwZmNfZGlzYWJsZV9wY2lfZGV2KHBoYmEpOworCWlmIChzaG9zdCkKKwkJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiBvdXRfZnJlZV9waGJhOgogCWxwZmNfaGJhX2ZyZWUocGhiYSk7CiAJcmV0dXJuIGVycm9yOwpAQCAtNzAzNiw2ICs3MTIxLDcgQEAKIAkvKiBSZXN0b3JlIGRldmljZSBzdGF0ZSBmcm9tIFBDSSBjb25maWcgc3BhY2UgKi8KIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKIAlpZiAocGRldi0+aXNfYnVzbWFzdGVyKQogCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKIApAQCAtNzA3MCw2ICs3MTU2LDc1IEBACiB9CiAKIC8qKgorICogbHBmY19zbGlfcHJlcF9kZXZfZm9yX3JlY292ZXIgLSBQcmVwYXJlIFNMSTMgZGV2aWNlIGZvciBwY2kgc2xvdCByZWNvdmVyCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHByZXBhcmUgdGhlIFNMSTMgZGV2aWNlIGZvciBQQ0kgc2xvdCByZWNvdmVyLiBJdAorICogYWJvcnRzIGFuZCBzdG9wcyBhbGwgdGhlIG9uLWdvaW5nIEkvT3Mgb24gdGhlIHBjaSBkZXZpY2UuCisgKiovCitzdGF0aWMgdm9pZAorbHBmY19zbGlfcHJlcF9kZXZfZm9yX3JlY292ZXIoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkiMjcyMyBQQ0kgY2hhbm5lbCBJL08gYWJvcnQgcHJlcGFyaW5nIGZvciByZWNvdmVyeVxuIik7CisJLyogUHJlcGFyZSBmb3IgYnJpbmdpbmcgSEJBIG9mZmxpbmUgKi8KKwlscGZjX29mZmxpbmVfcHJlcChwaGJhKTsKKwkvKiBDbGVhciBzbGkgYWN0aXZlIGZsYWcgdG8gcHJldmVudCBzeXNmcyBhY2Nlc3MgdG8gSEJBICovCisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJcGhiYS0+c2xpLnNsaV9mbGFnICY9IH5MUEZDX1NMSV9BQ1RJVkU7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkvKiBTdG9wIGFuZCBmbHVzaCBhbGwgSS9PcyBhbmQgYnJpbmcgSEJBIG9mZmxpbmUgKi8KKwlscGZjX29mZmxpbmUocGhiYSk7Cit9CisKKy8qKgorICogbHBmY19zbGlfcHJlcF9kZXZfZm9yX3Jlc2V0IC0gUHJlcGFyZSBTTEkzIGRldmljZSBmb3IgcGNpIHNsb3QgcmVzZXQKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gcHJlcGFyZSB0aGUgU0xJMyBkZXZpY2UgZm9yIFBDSSBzbG90IHJlc2V0LiBJdAorICogZGlzYWJsZXMgdGhlIGRldmljZSBpbnRlcnJ1cHQgYW5kIHBjaSBkZXZpY2UsIGFuZCBhYm9ydHMgdGhlIGludGVybmFsIEZDUAorICogcGVuZGluZyBJL09zLgorICoqLworc3RhdGljIHZvaWQKK2xwZmNfc2xpX3ByZXBfZGV2X2Zvcl9yZXNldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJc3RydWN0IGxwZmNfc2xpICpwc2xpID0gJnBoYmEtPnNsaTsKKwlzdHJ1Y3QgbHBmY19zbGlfcmluZyAgKnByaW5nOworCisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCSIyNzEwIFBDSSBjaGFubmVsIGRpc2FibGUgcHJlcGFyaW5nIGZvciByZXNldFxuIik7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgYW5kIHBjaSBkZXZpY2UgKi8KKwlscGZjX3NsaV9kaXNhYmxlX2ludHIocGhiYSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBoYmEtPnBjaWRldik7CisJLyoKKwkgKiBUaGVyZSBtYXkgYmUgSS9PcyBkcm9wcGVkIGJ5IHRoZSBmaXJtd2FyZS4KKwkgKiBFcnJvciBpb2NiIChJL08pIG9uIHR4Y21wbHEgYW5kIGxldCB0aGUgU0NTSSBsYXllcgorCSAqIHJldHJ5IGl0IGFmdGVyIHJlLWVzdGFibGlzaGluZyBsaW5rLgorCSAqLworCXByaW5nID0gJnBzbGktPnJpbmdbcHNsaS0+ZmNwX3JpbmddOworCWxwZmNfc2xpX2Fib3J0X2lvY2JfcmluZyhwaGJhLCBwcmluZyk7Cit9CisKKy8qKgorICogbHBmY19zbGlfcHJlcF9kZXZfZm9yX3Blcm1fZmFpbHVyZSAtIFByZXBhcmUgU0xJMyBkZXYgZm9yIHBjaSBzbG90IGRpc2FibGUKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gcHJlcGFyZSB0aGUgU0xJMyBkZXZpY2UgZm9yIFBDSSBzbG90IHBlcm1hbmVudGx5CisgKiBkaXNhYmxpbmcuIEl0IGJsb2NrcyB0aGUgU0NTSSB0cmFuc3BvcnQgbGF5ZXIgdHJhZmZpYyBhbmQgZmx1c2hlcyB0aGUgRkNQCisgKiBwZW5kaW5nIEkvT3MuCisgKiovCitzdGF0aWMgdm9pZAorbHBmY19wcmVwX2Rldl9mb3JfcGVybV9mYWlsdXJlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJIjI3MTEgUENJIGNoYW5uZWwgcGVybWFuZW50IGRpc2FibGUgZm9yIGZhaWx1cmVcbiIpOworCS8qIEJsb2NrIGFsbCBTQ1NJIGRldmljZXMnIEkvT3Mgb24gdGhlIGhvc3QgKi8KKwlscGZjX3Njc2lfZGV2X2Jsb2NrKHBoYmEpOworCS8qIENsZWFuIHVwIGFsbCBkcml2ZXIncyBvdXRzdGFuZGluZyBTQ1NJIEkvT3MgKi8KKwlscGZjX3NsaV9mbHVzaF9mY3BfcmluZ3MocGhiYSk7Cit9CisKKy8qKgogICogbHBmY19pb19lcnJvcl9kZXRlY3RlZF9zMyAtIE1ldGhvZCBmb3IgaGFuZGxpbmcgU0xJLTMgZGV2aWNlIFBDSSBJL08gZXJyb3IKICAqIEBwZGV2OiBwb2ludGVyIHRvIFBDSSBkZXZpY2UuCiAgKiBAc3RhdGU6IHRoZSBjdXJyZW50IFBDSSBjb25uZWN0aW9uIHN0YXRlLgpAQCAtNzA4Myw2ICs3MjM4LDcgQEAKICAqIGFzIGRlc2lyZWQuCiAgKgogICogUmV0dXJuIGNvZGVzCisgKiAJUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVIgLSBjYW4gYmUgcmVjb3ZlcmVkIHdpdGggcmVzZXRfbGluawogICogCVBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQgLSBuZWVkIHRvIHJlc2V0IGJlZm9yZSByZWNvdmVyeQogICogCVBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QgLSBkZXZpY2UgY291bGQgbm90IGJlIHJlY292ZXJlZAogICoqLwpAQCAtNzA5MSwzMyArNzI0NywyNyBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOwotCXN0cnVjdCBscGZjX3NsaSAqcHNsaSA9ICZwaGJhLT5zbGk7Ci0Jc3RydWN0IGxwZmNfc2xpX3JpbmcgICpwcmluZzsKIAotCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMDQ3MiBQQ0kgY2hhbm5lbCBJL08gcGVybWFuZW50IGZhaWx1cmVcbiIpOwotCQkvKiBCbG9jayBhbGwgU0NTSSBkZXZpY2VzJyBJL09zIG9uIHRoZSBob3N0ICovCi0JCWxwZmNfc2NzaV9kZXZfYmxvY2socGhiYSk7Ci0JCS8qIENsZWFuIHVwIGFsbCBkcml2ZXIncyBvdXRzdGFuZGluZyBTQ1NJIEkvT3MgKi8KLQkJbHBmY19zbGlfZmx1c2hfZmNwX3JpbmdzKHBoYmEpOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIHBjaV9jaGFubmVsX2lvX25vcm1hbDoKKwkJLyogTm9uLWZhdGFsIGVycm9yLCBwcmVwYXJlIGZvciByZWNvdmVyeSAqLworCQlscGZjX3NsaV9wcmVwX2Rldl9mb3JfcmVjb3ZlcihwaGJhKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSOworCWNhc2UgcGNpX2NoYW5uZWxfaW9fZnJvemVuOgorCQkvKiBGYXRhbCBlcnJvciwgcHJlcGFyZSBmb3Igc2xvdCByZXNldCAqLworCQlscGZjX3NsaV9wcmVwX2Rldl9mb3JfcmVzZXQocGhiYSk7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworCWNhc2UgcGNpX2NoYW5uZWxfaW9fcGVybV9mYWlsdXJlOgorCQkvKiBQZXJtYW5lbnQgZmFpbHVyZSwgcHJlcGFyZSBmb3IgZGV2aWNlIGRvd24gKi8KKwkJbHBmY19wcmVwX2Rldl9mb3JfcGVybV9mYWlsdXJlKHBoYmEpOwogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIHN0YXRlLCBwcmVwYXJlIGFuZCByZXF1ZXN0IHNsb3QgcmVzZXQgKi8KKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDQ3MiBVbmtub3duIFBDSSBlcnJvciBzdGF0ZTogeCV4XG4iLCBzdGF0ZSk7CisJCWxwZmNfc2xpX3ByZXBfZGV2X2Zvcl9yZXNldChwaGJhKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7CiAJfQotCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCS8qCi0JICogVGhlcmUgbWF5IGJlIEkvT3MgZHJvcHBlZCBieSB0aGUgZmlybXdhcmUuCi0JICogRXJyb3IgaW9jYiAoSS9PKSBvbiB0eGNtcGxxIGFuZCBsZXQgdGhlIFNDU0kgbGF5ZXIKLQkgKiByZXRyeSBpdCBhZnRlciByZS1lc3RhYmxpc2hpbmcgbGluay4KLQkgKi8KLQlwcmluZyA9ICZwc2xpLT5yaW5nW3BzbGktPmZjcF9yaW5nXTsKLQlscGZjX3NsaV9hYm9ydF9pb2NiX3JpbmcocGhiYSwgcHJpbmcpOwotCi0JLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8KLQlscGZjX3NsaV9kaXNhYmxlX2ludHIocGhiYSk7Ci0KLQkvKiBSZXF1ZXN0IGEgc2xvdCByZXNldC4gKi8KLQlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKIH0KIAogLyoqCkBAIC03MTk3LDcgKzczNDcsMTIgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKIAorCS8qIEJyaW5nIHRoZSBkZXZpY2Ugb25saW5lICovCiAJbHBmY19vbmxpbmUocGhiYSk7CisKKwkvKiBDbGVhbiB1cCBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgKEFFUikgaWYgbmVlZGVkICovCisJaWYgKHBoYmEtPmhiYV9mbGFnICYgSEJBX0FFUl9FTkFCTEVEKQorCQlwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyhwZGV2KTsKIH0KIAogLyoqCkBAIC03MjEzLDE1ICs3MzY4LDE1IEBACiAKIAlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSB7CiAJCWlmIChtYXhfeHJpIDw9IDEwMCkKLQkJCXJldHVybiA0OworCQkJcmV0dXJuIDEwOwogCQllbHNlIGlmIChtYXhfeHJpIDw9IDI1NikKLQkJCXJldHVybiA4OworCQkJcmV0dXJuIDI1OwogCQllbHNlIGlmIChtYXhfeHJpIDw9IDUxMikKLQkJCXJldHVybiAxNjsKKwkJCXJldHVybiA1MDsKIAkJZWxzZSBpZiAobWF4X3hyaSA8PSAxMDI0KQotCQkJcmV0dXJuIDMyOworCQkJcmV0dXJuIDEwMDsKIAkJZWxzZQotCQkJcmV0dXJuIDQ4OworCQkJcmV0dXJuIDE1MDsKIAl9IGVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC03MjQ5LDYgKzc0MDQsNyBAQAogewogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhOwogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IE5VTEw7CisJc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0ID0gTlVMTDsKIAlpbnQgZXJyb3I7CiAJdWludDMyX3QgY2ZnX21vZGUsIGludHJfbW9kZTsKIAlpbnQgbWNudDsKQEAgLTczMjksNiArNzQ4NSw3IEBACiAJCWdvdG8gb3V0X2Rlc3Ryb3lfc2hvc3Q7CiAJfQogCisJc2hvc3QgPSBscGZjX3Nob3N0X2Zyb21fdnBvcnQodnBvcnQpOyAvKiBzYXZlIHNob3N0IGZvciBlcnJvciBjbGVhbnVwICovCiAJLyogTm93LCB0cnlpbmcgdG8gZW5hYmxlIGludGVycnVwdCBhbmQgYnJpbmcgdXAgdGhlIGRldmljZSAqLwogCWNmZ19tb2RlID0gcGhiYS0+Y2ZnX3VzZV9tc2k7CiAJd2hpbGUgKHRydWUpIHsKQEAgLTczOTcsNiArNzU1NCw4IEBACiAJbHBmY19zbGk0X3BjaV9tZW1fdW5zZXQocGhiYSk7CiBvdXRfZGlzYWJsZV9wY2lfZGV2OgogCWxwZmNfZGlzYWJsZV9wY2lfZGV2KHBoYmEpOworCWlmIChzaG9zdCkKKwkJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiBvdXRfZnJlZV9waGJhOgogCWxwZmNfaGJhX2ZyZWUocGhiYSk7CiAJcmV0dXJuIGVycm9yOwpAQCAtNzk3MSw2ICs4MTMwLDEwIEBACiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCiAJe1BDSV9WRU5ET1JfSURfU0VSVkVSRU5HSU5FLCBQQ0lfREVWSUNFX0lEX1RJR0VSU0hBUkssCiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJe1BDSV9WRU5ET1JfSURfU0VSVkVSRU5HSU5FLCBQQ0lfREVWSUNFX0lEX1RPTUNBVCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7UENJX1ZFTkRPUl9JRF9FTVVMRVgsIFBDSV9ERVZJQ0VfSURfRkFMQ09OLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAogCXsgMCB9CiB9OwogCkBAIC04MDUzLDE1ICs4MjE2LDE1IEBACiAJaWYgKGxwZmNfZW5hYmxlX25waXYpCiAJCWZjX3JlbGVhc2VfdHJhbnNwb3J0KGxwZmNfdnBvcnRfdHJhbnNwb3J0X3RlbXBsYXRlKTsKIAlpZiAoX2R1bXBfYnVmX2RhdGEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgZnJlZWluZyAlbHUgcGFnZXMgZm9yIF9kdW1wX2J1Zl9kYXRhICIKLQkJCQkiYXQgMHglcFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSCSI5MDYyIEJMS0dSRDogZnJlZWluZyAlbHUgcGFnZXMgZm9yICIKKwkJCQkiX2R1bXBfYnVmX2RhdGEgYXQgMHglcFxuIiwKIAkJCQkoMUwgPDwgX2R1bXBfYnVmX2RhdGFfb3JkZXIpLCBfZHVtcF9idWZfZGF0YSk7CiAJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpX2R1bXBfYnVmX2RhdGEsIF9kdW1wX2J1Zl9kYXRhX29yZGVyKTsKIAl9CiAKIAlpZiAoX2R1bXBfYnVmX2RpZikgewotCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCBmcmVlaW5nICVsdSBwYWdlcyBmb3IgX2R1bXBfYnVmX2RpZiAiCi0JCQkJImF0IDB4JXBcbiIsCisJCXByaW50ayhLRVJOX0VSUgkiOTA0OSBCTEtHUkQ6IGZyZWVpbmcgJWx1IHBhZ2VzIGZvciAiCisJCQkJIl9kdW1wX2J1Zl9kaWYgYXQgMHglcFxuIiwKIAkJCQkoMUwgPDwgX2R1bXBfYnVmX2RpZl9vcmRlciksIF9kdW1wX2J1Zl9kaWYpOwogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKV9kdW1wX2J1Zl9kaWYsIF9kdW1wX2J1Zl9kaWZfb3JkZXIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKaW5kZXggMWFiNDA1OS4uYTlhZmQ4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKQEAgLTI1LDggKzI1LDggQEAKIAogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+Ci0KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZzLmg+CiAKICNpbmNsdWRlICJscGZjX2h3NC5oIgogI2luY2x1ZGUgImxwZmNfaHcuaCIKQEAgLTgyMCw2ICs4MjAsMTAgQEAKIAltYi0+dW4udmFyUmVnVnBpLnZwaSA9IHZwb3J0LT52cGkgKyB2cG9ydC0+cGhiYS0+dnBpX2Jhc2U7CiAJbWItPnVuLnZhclJlZ1ZwaS5zaWQgPSB2cG9ydC0+ZmNfbXlESUQ7CiAJbWItPnVuLnZhclJlZ1ZwaS52ZmkgPSB2cG9ydC0+dmZpICsgdnBvcnQtPnBoYmEtPnZmaV9iYXNlOworCW1lbWNweShtYi0+dW4udmFyUmVnVnBpLnd3biwgJnZwb3J0LT5mY19wb3J0bmFtZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwltYi0+dW4udmFyUmVnVnBpLnd3blswXSA9IGNwdV90b19sZTMyKG1iLT51bi52YXJSZWdWcGkud3duWzBdKTsKKwltYi0+dW4udmFyUmVnVnBpLnd3blsxXSA9IGNwdV90b19sZTMyKG1iLT51bi52YXJSZWdWcGkud3duWzFdKTsKIAogCW1iLT5tYnhDb21tYW5kID0gTUJYX1JFR19WUEk7CiAJbWItPm1ieE93bmVyID0gT1dOX0hPU1Q7CkBAIC04NDksNyArODUzLDEwIEBACiAJTUFJTEJPWF90ICptYiA9ICZwbWItPnUubWI7CiAJbWVtc2V0KHBtYiwgMCwgc2l6ZW9mIChMUEZDX01CT1hRX3QpKTsKIAotCW1iLT51bi52YXJVbnJlZ1ZwaS52cGkgPSB2cGkgKyBwaGJhLT52cGlfYmFzZTsKKwlpZiAocGhiYS0+c2xpX3JldiA8IExQRkNfU0xJX1JFVjQpCisJCW1iLT51bi52YXJVbnJlZ1ZwaS52cGkgPSB2cGkgKyBwaGJhLT52cGlfYmFzZTsKKwllbHNlCisJCW1iLT51bi52YXJVbnJlZ1ZwaS5zbGk0X3ZwaSA9IHZwaSArIHBoYmEtPnZwaV9iYXNlOwogCiAJbWItPm1ieENvbW1hbmQgPSBNQlhfVU5SRUdfVlBJOwogCW1iLT5tYnhPd25lciA9IE9XTl9IT1NUOwpAQCAtMTEzMiw3ICsxMTM5LDcgQEAKIAkvKiBPdGhlcndpc2Ugd2Ugc2V0dXAgc3BlY2lmaWMgcmN0bCAvIHR5cGUgbWFza3MgZm9yIHRoaXMgcmluZyAqLwogCWZvciAoaSA9IDA7IGkgPCBwcmluZy0+bnVtX21hc2s7IGkrKykgewogCQltYi0+dW4udmFyQ2ZnUmluZy5yclJlZ3NbaV0ucnZhbCA9IHByaW5nLT5wcnRbaV0ucmN0bDsKLQkJaWYgKG1iLT51bi52YXJDZmdSaW5nLnJyUmVnc1tpXS5ydmFsICE9IEZDX0VMU19SRVEpCisJCWlmIChtYi0+dW4udmFyQ2ZnUmluZy5yclJlZ3NbaV0ucnZhbCAhPSBGQ19SQ1RMX0VMU19SRVEpCiAJCQltYi0+dW4udmFyQ2ZnUmluZy5yclJlZ3NbaV0ucm1hc2sgPSAweGZmOwogCQllbHNlCiAJCQltYi0+dW4udmFyQ2ZnUmluZy5yclJlZ3NbaV0ucm1hc2sgPSAweGZlOwpAQCAtMTY1NCw5ICsxNjYxLDEyIEBACiAJLyogQWxsb2NhdGUgcmVjb3JkIGZvciBrZWVwaW5nIFNHRSB2aXJ0dWFsIGFkZHJlc3NlcyAqLwogCW1ib3gtPnNnZV9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBscGZjX21ieF9uZW1iZWRfc2dlX3ZpcnQpLAogCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYm94LT5zZ2VfYXJyYXkpCisJaWYgKCFtYm94LT5zZ2VfYXJyYXkpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTUJPWCwKKwkJCQkiMjUyNyBGYWlsZWQgdG8gYWxsb2NhdGUgbm9uLWVtYmVkZGVkIFNHRSAiCisJCQkJImFycmF5LlxuIik7CiAJCXJldHVybiAwOwotCisJfQogCWZvciAocGFnZW4gPSAwLCBhbGxvY19sZW4gPSAwOyBwYWdlbiA8IHBjb3VudDsgcGFnZW4rKykgewogCQkvKiBUaGUgRE1BIG1lbW9yeSBpcyBhbHdheXMgYWxsb2NhdGVkIGluIHRoZSBsZW5ndGggb2YgYQogCQkgKiBwYWdlIGV2ZW4gdGhvdWdoIHRoZSBsYXN0IFNHRSBtaWdodCBub3QgZmlsbCB1cCB0byBhCkBAIC0xNzUzLDExICsxNzYzLDYgQEAKIAkvKiBTZXQgdXAgaG9zdCByZXF1ZXN0ZWQgZmVhdHVyZXMuICovCiAJYmZfc2V0KGxwZmNfbWJ4X3JxX2Z0cl9ycV9mY3BpLCAmbWJveHEtPnUubXFlLnVuLnJlcV9mdHJzLCAxKTsKIAotCWlmIChwaGJhLT5jZmdfZW5hYmxlX2ZpcCkKLQkJYmZfc2V0KGxwZmNfbWJ4X3JxX2Z0cl9ycV9pZmlwLCAmbWJveHEtPnUubXFlLnVuLnJlcV9mdHJzLCAwKTsKLQllbHNlCi0JCWJmX3NldChscGZjX21ieF9ycV9mdHJfcnFfaWZpcCwgJm1ib3hxLT51Lm1xZS51bi5yZXFfZnRycywgMSk7Ci0KIAkvKiBFbmFibGUgRElGIChibG9jayBndWFyZCkgb25seSBpZiBjb25maWd1cmVkIHRvIGRvIHNvLiAqLwogCWlmIChwaGJhLT5jZmdfZW5hYmxlX2JnKQogCQliZl9zZXQobHBmY19tYnhfcnFfZnRyX3JxX2RpZiwgJm1ib3hxLT51Lm1xZS51bi5yZXFfZnRycywgMSk7CkBAIC0xODE3LDYgKzE4MjIsOSBAQAogCWJmX3NldChscGZjX3JlZ192ZmlfdmZpLCByZWdfdmZpLCB2cG9ydC0+dmZpICsgdnBvcnQtPnBoYmEtPnZmaV9iYXNlKTsKIAliZl9zZXQobHBmY19yZWdfdmZpX2ZjZmksIHJlZ192ZmksIHZwb3J0LT5waGJhLT5mY2YuZmNmaSk7CiAJYmZfc2V0KGxwZmNfcmVnX3ZmaV92cGksIHJlZ192ZmksIHZwb3J0LT52cGkgKyB2cG9ydC0+cGhiYS0+dnBpX2Jhc2UpOworCW1lbWNweShyZWdfdmZpLT53d24sICZ2cG9ydC0+ZmNfcG9ydG5hbWUsIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJcmVnX3ZmaS0+d3duWzBdID0gY3B1X3RvX2xlMzIocmVnX3ZmaS0+d3duWzBdKTsKKwlyZWdfdmZpLT53d25bMV0gPSBjcHVfdG9fbGUzMihyZWdfdmZpLT53d25bMV0pOwogCXJlZ192ZmktPmJkZS5hZGRySGlnaCA9IHB1dFBhZGRySGlnaChwaHlzKTsKIAlyZWdfdmZpLT5iZGUuYWRkckxvdyA9IHB1dFBhZGRyTG93KHBoeXMpOwogCXJlZ192ZmktPmJkZS50dXMuZi5iZGVTaXplID0gc2l6ZW9mKHZwb3J0LT5mY19zcGFyYW0pOwpAQCAtMTg1MCw3ICsxODU4LDcgQEAKIC8qKgogICogbHBmY191bnJlZ192ZmkgLSBJbml0aWFsaXplIHRoZSBVTlJFR19WRkkgbWFpbGJveCBjb21tYW5kCiAgKiBAbWJveDogcG9pbnRlciB0byBscGZjIG1ib3ggY29tbWFuZCB0byBpbml0aWFsaXplLgotICogQHZmaTogVkZJIHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAqIEB2cG9ydDogdnBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBWRi4KICAqCiAgKiBUaGUgVU5SRUdfVkZJIG1haWxib3ggY29tbWFuZCBjYXVzZXMgdGhlIFNMSSBIb3N0IHRvIHB1dCBhIHZpcnR1YWwgZmFicmljCiAgKiAobG9naWNhbCBOUG9ydCkgaW50byB0aGUgaW5hY3RpdmUgc3RhdGUuIFRoZSBTTEkgSG9zdCBtdXN0IGhhdmUgbG9nZ2VkIG91dApAQCAtMTg1OSwxMSArMTg2NywxMiBAQAogICogZmFicmljIGluYWN0aXZlLgogICoqLwogdm9pZAotbHBmY191bnJlZ192Zmkoc3RydWN0IGxwZmNNYm94cSAqbWJveCwgdWludDE2X3QgdmZpKQorbHBmY191bnJlZ192Zmkoc3RydWN0IGxwZmNNYm94cSAqbWJveCwgc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0KQogewogCW1lbXNldChtYm94LCAwLCBzaXplb2YoKm1ib3gpKTsKIAliZl9zZXQobHBmY19tcWVfY29tbWFuZCwgJm1ib3gtPnUubXFlLCBNQlhfVU5SRUdfVkZJKTsKLQliZl9zZXQobHBmY191bnJlZ192ZmlfdmZpLCAmbWJveC0+dS5tcWUudW4udW5yZWdfdmZpLCB2ZmkpOworCWJmX3NldChscGZjX3VucmVnX3ZmaV92ZmksICZtYm94LT51Lm1xZS51bi51bnJlZ192ZmksCisJICAgICAgIHZwb3J0LT52ZmkgKyB2cG9ydC0+cGhiYS0+dmZpX2Jhc2UpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCmluZGV4IDNlNzQxMzYuLjJlZDZhZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYwpAQCAtMTIyMyw2ICsxMjIzLDEyIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1iLCBuZXh0bWIsICZwaGJhLT5zbGkubWJveHEsIGxpc3QpIHsKIAkJaWYgKChtYi0+dS5tYi5tYnhDb21tYW5kID09IE1CWF9SRUdfTE9HSU42NCkgJiYKIAkJICAgKG5kbHAgPT0gKHN0cnVjdCBscGZjX25vZGVsaXN0ICopIG1iLT5jb250ZXh0MikpIHsKKwkJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJCWxwZmNfc2xpNF9mcmVlX3JwaShwaGJhLAorCQkJCQltYi0+dS5tYi51bi52YXJSZWdMb2dpbi5ycGkpOworCQkJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJfQogCQkJbXAgPSAoc3RydWN0IGxwZmNfZG1hYnVmICopIChtYi0+Y29udGV4dDEpOwogCQkJaWYgKG1wKSB7CiAJCQkJX19scGZjX21idWZfZnJlZShwaGJhLCBtcC0+dmlydCwgbXAtPnBoeXMpOwpAQCAtMTIzMCw2ICsxMjM2LDcgQEAKIAkJCX0KIAkJCWxwZmNfbmxwX3B1dChuZGxwKTsKIAkJCWxpc3RfZGVsKCZtYi0+bGlzdCk7CisJCQlwaGJhLT5zbGkubWJveHFfY250LS07CiAJCQltZW1wb29sX2ZyZWUobWIsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwppbmRleCBjODhmNTlmLi5hMjQ2NDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwpAQCAtNTksMjIgKzU5LDI2IEBACiB9Owogc3RhdGljIHZvaWQKIGxwZmNfcmVsZWFzZV9zY3NpX2J1Zl9zNChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX3Njc2lfYnVmICpwc2IpOworc3RhdGljIHZvaWQKK2xwZmNfcmVsZWFzZV9zY3NpX2J1Zl9zMyhzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX3Njc2lfYnVmICpwc2IpOwogCiBzdGF0aWMgdm9pZAotbHBmY19kZWJ1Z19zYXZlX2RhdGEoc3RydWN0IHNjc2lfY21uZCAqY21uZCkKK2xwZmNfZGVidWdfc2F2ZV9kYXRhKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IHNjc2lfY21uZCAqY21uZCkKIHsKIAl2b2lkICpzcmMsICpkc3Q7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2RlID0gc2NzaV9zZ2xpc3QoY21uZCk7CiAKIAlpZiAoIV9kdW1wX2J1Zl9kYXRhKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SICVzIF9kdW1wX2J1Zl9kYXRhIGlzIE5VTExcbiIsCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJIjkwNTAgQkxLR1JEOiBFUlJPUiAlcyBfZHVtcF9idWZfZGF0YSBpcyBOVUxMXG4iLAogCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCiAJaWYgKCFzZ2RlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SOiBkYXRhIHNjYXR0ZXJsaXN0IGlzIG51bGxcbiIpOworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCSI5MDUxIEJMS0dSRDogRVJST1I6IGRhdGEgc2NhdHRlcmxpc3QgaXMgbnVsbFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg4LDE5ICs5MiwyMSBAQAogfQogCiBzdGF0aWMgdm9pZAotbHBmY19kZWJ1Z19zYXZlX2RpZihzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQorbHBmY19kZWJ1Z19zYXZlX2RpZihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCiB7CiAJdm9pZCAqc3JjLCAqZHN0OwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dkZSA9IHNjc2lfcHJvdF9zZ2xpc3QoY21uZCk7CiAKIAlpZiAoIV9kdW1wX2J1Zl9kaWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgRVJST1IgJXMgX2R1bXBfYnVmX2RhdGEgaXMgTlVMTFxuIiwKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkiOTA1MiBCTEtHUkQ6IEVSUk9SICVzIF9kdW1wX2J1Zl9kYXRhIGlzIE5VTExcbiIsCiAJCQkJX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKCFzZ2RlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SOiBwcm90IHNjYXR0ZXJsaXN0IGlzIG51bGxcbiIpOworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCSI5MDUzIEJMS0dSRDogRVJST1I6IHByb3Qgc2NhdHRlcmxpc3QgaXMgbnVsbFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI0Miw2ICsyNDgsMzYgQEAKIH0KIAogLyoqCisgKiBscGZjX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIEFsdGVyIHNjc2kgZGV2aWNlIHF1ZXVlIGRlcHRoCisgKiBAc2RldjogUG9pbnRlciB0aGUgc2NzaSBkZXZpY2Ugb24gd2hpY2ggdG8gY2hhbmdlIHRoZSBxdWV1ZSBkZXB0aC4KKyAqIEBxZGVwdGg6IE5ldyBxdWV1ZSBkZXB0aCB0byBzZXQgdGhlIHNkZXYgdG8uCisgKiBAcmVhc29uOiBUaGUgcmVhc29uIGZvciB0aGUgcXVldWUgZGVwdGggY2hhbmdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBtaWRsYXllciBhbmQgdGhlIExMRCB0byBhbHRlciB0aGUgcXVldWUKKyAqIGRlcHRoIGZvciBhIHNjc2kgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHF1ZXVlIGRlcHRoIHRvIHRoZSBuZXcKKyAqIHZhbHVlIGFuZCBzZW5kcyBhbiBldmVudCBvdXQgdG8gbG9nIHRoZSBxdWV1ZSBkZXB0aCBjaGFuZ2UuCisgKiovCitpbnQKK2xwZmNfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCwgaW50IHJlYXNvbikKK3sKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKwlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YTsKKwl1bnNpZ25lZCBsb25nIG5ld19xdWV1ZV9kZXB0aCwgb2xkX3F1ZXVlX2RlcHRoOworCisJb2xkX3F1ZXVlX2RlcHRoID0gc2Rldi0+cXVldWVfZGVwdGg7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIHFkZXB0aCk7CisJbmV3X3F1ZXVlX2RlcHRoID0gc2Rldi0+cXVldWVfZGVwdGg7CisJcmRhdGEgPSBzZGV2LT5ob3N0ZGF0YTsKKwlpZiAocmRhdGEpCisJCWxwZmNfc2VuZF9zZGV2X3F1ZXVlZGVwdGhfY2hhbmdlX2V2ZW50KHBoYmEsIHZwb3J0LAorCQkJCQkJICAgICAgIHJkYXRhLT5wbm9kZSwgc2Rldi0+bHVuLAorCQkJCQkJICAgICAgIG9sZF9xdWV1ZV9kZXB0aCwKKwkJCQkJCSAgICAgICBuZXdfcXVldWVfZGVwdGgpOworCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKK30KKworLyoqCiAgKiBscGZjX3JhbXBkb3duX3F1ZXVlX2RlcHRoIC0gUG9zdCBSQU1QX0RPV05fUVVFVUUgZXZlbnQgdG8gd29ya2VyIHRocmVhZAogICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KICAqCkBAIC0zMDUsOCArMzQxLDEwIEBACiAJaWYgKHZwb3J0LT5jZmdfbHVuX3F1ZXVlX2RlcHRoIDw9IHF1ZXVlX2RlcHRoKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKLQlpZiAoKChwaGJhLT5sYXN0X3JhbXBfdXBfdGltZSArIFFVRVVFX1JBTVBfVVBfSU5URVJWQUwpID4gamlmZmllcykgfHwKLQkgKChwaGJhLT5sYXN0X3JzcmNfZXJyb3JfdGltZSArIFFVRVVFX1JBTVBfVVBfSU5URVJWQUwgKSA+IGppZmZpZXMpKSB7CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQlwaGJhLT5sYXN0X3JhbXBfdXBfdGltZSArIFFVRVVFX1JBTVBfVVBfSU5URVJWQUwpIHx8CisJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQlwaGJhLT5sYXN0X3JzcmNfZXJyb3JfdGltZSArIFFVRVVFX1JBTVBfVVBfSU5URVJWQUwpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMzOCwxMCArMzc2LDkgQEAKIAlzdHJ1Y3QgbHBmY192cG9ydCAqKnZwb3J0czsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3Q7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwotCXVuc2lnbmVkIGxvbmcgbmV3X3F1ZXVlX2RlcHRoLCBvbGRfcXVldWVfZGVwdGg7CisJdW5zaWduZWQgbG9uZyBuZXdfcXVldWVfZGVwdGg7CiAJdW5zaWduZWQgbG9uZyBudW1fcnNyY19lcnIsIG51bV9jbWRfc3VjY2VzczsKIAlpbnQgaTsKLQlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YTsKIAogCW51bV9yc3JjX2VyciA9IGF0b21pY19yZWFkKCZwaGJhLT5udW1fcnNyY19lcnIpOwogCW51bV9jbWRfc3VjY2VzcyA9IGF0b21pY19yZWFkKCZwaGJhLT5udW1fY21kX3N1Y2Nlc3MpOwpAQCAtMzU5LDIyICszOTYsOCBAQAogCQkJCWVsc2UKIAkJCQkJbmV3X3F1ZXVlX2RlcHRoID0gc2Rldi0+cXVldWVfZGVwdGggLQogCQkJCQkJCQluZXdfcXVldWVfZGVwdGg7Ci0JCQkJb2xkX3F1ZXVlX2RlcHRoID0gc2Rldi0+cXVldWVfZGVwdGg7Ci0JCQkJaWYgKHNkZXYtPm9yZGVyZWRfdGFncykKLQkJCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwKLQkJCQkJCQlNU0dfT1JERVJFRF9UQUcsCi0JCQkJCQkJbmV3X3F1ZXVlX2RlcHRoKTsKLQkJCQllbHNlCi0JCQkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsCi0JCQkJCQkJTVNHX1NJTVBMRV9UQUcsCi0JCQkJCQkJbmV3X3F1ZXVlX2RlcHRoKTsKLQkJCQlyZGF0YSA9IHNkZXYtPmhvc3RkYXRhOwotCQkJCWlmIChyZGF0YSkKLQkJCQkJbHBmY19zZW5kX3NkZXZfcXVldWVkZXB0aF9jaGFuZ2VfZXZlbnQoCi0JCQkJCQlwaGJhLCB2cG9ydHNbaV0sCi0JCQkJCQlyZGF0YS0+cG5vZGUsCi0JCQkJCQlzZGV2LT5sdW4sIG9sZF9xdWV1ZV9kZXB0aCwKLQkJCQkJCW5ld19xdWV1ZV9kZXB0aCk7CisJCQkJbHBmY19jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwgbmV3X3F1ZXVlX2RlcHRoLAorCQkJCQkJCVNDU0lfUURFUFRIX0RFRkFVTFQpOwogCQkJfQogCQl9CiAJbHBmY19kZXN0cm95X3Zwb3J0X3dvcmtfYXJyYXkocGhiYSwgdnBvcnRzKTsKQEAgLTM5OCw3ICs0MjEsNiBAQAogCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAJaW50IGk7Ci0Jc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGE7CiAKIAl2cG9ydHMgPSBscGZjX2NyZWF0ZV92cG9ydF93b3JrX2FycmF5KHBoYmEpOwogCWlmICh2cG9ydHMgIT0gTlVMTCkKQEAgLTQwOCwyMiArNDMwLDkgQEAKIAkJCQlpZiAodnBvcnRzW2ldLT5jZmdfbHVuX3F1ZXVlX2RlcHRoIDw9CiAJCQkJICAgIHNkZXYtPnF1ZXVlX2RlcHRoKQogCQkJCQljb250aW51ZTsKLQkJCQlpZiAoc2Rldi0+b3JkZXJlZF90YWdzKQotCQkJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LAotCQkJCQkJCU1TR19PUkRFUkVEX1RBRywKLQkJCQkJCQlzZGV2LT5xdWV1ZV9kZXB0aCsxKTsKLQkJCQllbHNlCi0JCQkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsCi0JCQkJCQkJTVNHX1NJTVBMRV9UQUcsCi0JCQkJCQkJc2Rldi0+cXVldWVfZGVwdGgrMSk7Ci0JCQkJcmRhdGEgPSBzZGV2LT5ob3N0ZGF0YTsKLQkJCQlpZiAocmRhdGEpCi0JCQkJCWxwZmNfc2VuZF9zZGV2X3F1ZXVlZGVwdGhfY2hhbmdlX2V2ZW50KAotCQkJCQkJcGhiYSwgdnBvcnRzW2ldLAotCQkJCQkJcmRhdGEtPnBub2RlLAotCQkJCQkJc2Rldi0+bHVuLAotCQkJCQkJc2Rldi0+cXVldWVfZGVwdGggLSAxLAotCQkJCQkJc2Rldi0+cXVldWVfZGVwdGgpOworCQkJCWxwZmNfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsCisJCQkJCQkJc2Rldi0+cXVldWVfZGVwdGgrMSwKKwkJCQkJCQlTQ1NJX1FERVBUSF9SQU1QX1VQKTsKIAkJCX0KIAkJfQogCWxwZmNfZGVzdHJveV92cG9ydF93b3JrX2FycmF5KHBoYmEsIHZwb3J0cyk7CkBAIC01ODksNyArNTk4LDcgQEAKIAkJaW9jYi0+dWxwQ2xhc3MgPSBDTEFTUzM7CiAJCXBzYi0+c3RhdHVzID0gSU9TVEFUX1NVQ0NFU1M7CiAJCS8qIFB1dCBpdCBiYWNrIGludG8gdGhlIFNDU0kgYnVmZmVyIGxpc3QgKi8KLQkJbHBmY19yZWxlYXNlX3Njc2lfYnVmX3M0KHBoYmEsIHBzYik7CisJCWxwZmNfcmVsZWFzZV9zY3NpX2J1Zl9zMyhwaGJhLCBwc2IpOwogCiAJfQogCkBAIC0xMDI0LDcgKzEwMzMsOCBAQAogCiAJCWxwZmNfY21kLT5zZWdfY250ID0gbnNlZzsKIAkJaWYgKGxwZmNfY21kLT5zZWdfY250ID4gcGhiYS0+Y2ZnX3NnX3NlZ19jbnQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRvbyBtYW55IHNnIHNlZ21lbnRzIGZyb20gIgorCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJIjkwNjQgQkxLR1JEOiAlczogVG9vIG1hbnkgc2cgc2VnbWVudHMgZnJvbSAiCiAJCQkgICAgICAgImRtYV9tYXBfc2cuICBDb25maWcgJWQsIHNlZ19jbnQgJWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHBoYmEtPmNmZ19zZ19zZWdfY250LAogCQkJICAgICAgIGxwZmNfY21kLT5zZWdfY250KTsKQEAgLTExMTIsNyArMTEyMiw3IEBACiAgKiB3aXRoIHRoZSBjbWQKICAqLwogc3RhdGljIGludAotbHBmY19zY190b19zbGlfcHJvZihzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKK2xwZmNfc2NfdG9fc2xpX3Byb2Yoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKIHsKIAl1aW50OF90IGd1YXJkX3R5cGUgPSBzY3NpX2hvc3RfZ2V0X2d1YXJkKHNjLT5kZXZpY2UtPmhvc3QpOwogCXVpbnQ4X3QgcmV0X3Byb2YgPSBMUEZDX1BST0ZfSU5WQUxJRDsKQEAgLTExMzYsNyArMTE0Niw4IEBACiAKIAkJY2FzZSBTQ1NJX1BST1RfTk9STUFMOgogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJCYWQgb3AvZ3VhcmQ6JWQvJWQgY29tYmluYXRpb25cbiIsCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCQkiOTA2MyBCTEtHUkQ6QmFkIG9wL2d1YXJkOiVkLyVkIGNvbWJpbmF0aW9uXG4iLAogCQkJCQlzY3NpX2dldF9wcm90X29wKHNjKSwgZ3VhcmRfdHlwZSk7CiAJCQlicmVhazsKIApAQCAtMTE1Nyw3ICsxMTY4LDggQEAKIAkJY2FzZSBTQ1NJX1BST1RfV1JJVEVfU1RSSVA6CiAJCWNhc2UgU0NTSV9QUk9UX05PUk1BTDoKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAiQmFkIG9wL2d1YXJkOiVkLyVkIGNvbWJpbmF0aW9uXG4iLAorCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJIjkwNzUgQkxLR1JEOiBCYWQgb3AvZ3VhcmQ6JWQvJWQgY29tYmluYXRpb25cbiIsCiAJCQkJCXNjc2lfZ2V0X3Byb3Rfb3Aoc2MpLCBndWFyZF90eXBlKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMjU5LDcgKzEyNzEsNyBAQAogCXVpbnQxNl90IGFwcHRhZ21hc2ssIGFwcHRhZ3ZhbDsKIAogCXBkZTEgPSAoc3RydWN0IGxwZmNfcGRlICopIGJwbDsKLQlwcm9mID0gbHBmY19zY190b19zbGlfcHJvZihzYyk7CisJcHJvZiA9IGxwZmNfc2NfdG9fc2xpX3Byb2YocGhiYSwgc2MpOwogCiAJaWYgKHByb2YgPT0gTFBGQ19QUk9GX0lOVkFMSUQpCiAJCWdvdG8gb3V0OwpAQCAtMTM1OSw3ICsxMzcxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcHJvZiA9IGxwZmNfc2NfdG9fc2xpX3Byb2Yoc2MpOworCXByb2YgPSBscGZjX3NjX3RvX3NsaV9wcm9mKHBoYmEsIHNjKTsKIAlpZiAocHJvZiA9PSBMUEZDX1BST0ZfSU5WQUxJRCkKIAkJZ290byBvdXQ7CiAKQEAgLTE0MDgsNyArMTQyMCw4IEBACiAJCXN1YnRvdGFsID0gMDsgLyogdG90YWwgYnl0ZXMgcHJvY2Vzc2VkIGZvciBjdXJyZW50IHByb3QgZ3JwICovCiAJCXdoaWxlICghcGdkb25lKSB7CiAJCQlpZiAoIXNnZGUpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIEludmFsaWQgZGF0YSBzZWdtZW50XG4iLAorCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCQkiOTA2NSBCTEtHUkQ6JXMgSW52YWxpZCBkYXRhIHNlZ21lbnRcbiIsCiAJCQkJCQlfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0xNDYyLDcgKzE0NzUsOCBAQAogCQkJcmVmdGFnICs9IHByb3RncnBfYmxrczsKIAkJfSBlbHNlIHsKIAkJCS8qIGlmIHdlJ3JlIGhlcmUsIHdlIGhhdmUgYSBidWcgKi8KLQkJCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEOiBidWcgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCSI5MDU0IEJMS0dSRDogYnVnIGluICVzXG4iLCBfX2Z1bmNfXyk7CiAJCX0KIAogCX0gd2hpbGUgKCFhbGxkb25lKTsKQEAgLTE1NDQsOCArMTU1OCwxMCBAQAogCiAJCWxwZmNfY21kLT5zZWdfY250ID0gZGF0YXNlZ2NudDsKIAkJaWYgKGxwZmNfY21kLT5zZWdfY250ID4gcGhiYS0+Y2ZnX3NnX3NlZ19jbnQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRvbyBtYW55IHNnIHNlZ21lbnRzIGZyb20gIgotCQkJCQkiZG1hX21hcF9zZy4gIENvbmZpZyAlZCwgc2VnX2NudCAlZFxuIiwKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCQkiOTA2NyBCTEtHUkQ6ICVzOiBUb28gbWFueSBzZyBzZWdtZW50cyIKKwkJCQkJIiBmcm9tIGRtYV9tYXBfc2cuICBDb25maWcgJWQsIHNlZ19jbnQiCisJCQkJCSIgJWRcbiIsCiAJCQkJCV9fZnVuY19fLCBwaGJhLT5jZmdfc2dfc2VnX2NudCwKIAkJCQkJbHBmY19jbWQtPnNlZ19jbnQpOwogCQkJc2NzaV9kbWFfdW5tYXAoc2NzaV9jbW5kKTsKQEAgLTE1NzksOCArMTU5NSw5IEBACiAJCQlscGZjX2NtZC0+cHJvdF9zZWdfY250ID0gcHJvdHNlZ2NudDsKIAkJCWlmIChscGZjX2NtZC0+cHJvdF9zZWdfY250CiAJCQkgICAgPiBwaGJhLT5jZmdfcHJvdF9zZ19zZWdfY250KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVG9vIG1hbnkgcHJvdCBzZyBzZWdtZW50cyAiCi0JCQkJCQkiZnJvbSBkbWFfbWFwX3NnLiAgQ29uZmlnICVkLCIKKwkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCQkJIjkwNjggQkxLR1JEOiAlczogVG9vIG1hbnkgcHJvdCBzZyAiCisJCQkJCSJzZWdtZW50cyBmcm9tIGRtYV9tYXBfc2cuICBDb25maWcgJWQsIgogCQkJCQkJInByb3Rfc2VnX2NudCAlZFxuIiwgX19mdW5jX18sCiAJCQkJCQlwaGJhLT5jZmdfcHJvdF9zZ19zZWdfY250LAogCQkJCQkJbHBmY19jbWQtPnByb3Rfc2VnX2NudCk7CkBAIC0xNjcxLDIzICsxNjg4LDI2IEBACiAJdWludDMyX3QgYmdzdGF0ID0gYmdmLT5iZ3N0YXQ7CiAJdWludDY0X3QgZmFpbGluZ19zZWN0b3IgPSAwOwogCi0JcHJpbnRrKEtFUk5fRVJSICJCRyBFUlJPUiBpbiBjbWQgMHgleCBsYmEgMHglbGx4IGJsayBjbnQgMHgleCAiCisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsICI5MDY5IEJMS0dSRDogQkcgRVJST1IgaW4gY21kIgorCQkJIiAweCV4IGxiYSAweCVsbHggYmxrIGNudCAweCV4ICIKIAkJCSJiZ3N0YXQ9MHgleCBiZ2htPTB4JXhcbiIsCiAJCQljbWQtPmNtbmRbMF0sICh1bnNpZ25lZCBsb25nIGxvbmcpc2NzaV9nZXRfbGJhKGNtZCksCiAJCQlibGtfcnFfc2VjdG9ycyhjbWQtPnJlcXVlc3QpLCBiZ3N0YXQsIGJnaG0pOwogCiAJc3Bpbl9sb2NrKCZfZHVtcF9idWZfbG9jayk7CiAJaWYgKCFfZHVtcF9idWZfZG9uZSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNhdmluZyBEYXRhIGZvciAldSBibG9ja3MgdG8gZGVidWdmc1xuIiwKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsICAiOTA3MCBCTEtHUkQ6IFNhdmluZyIKKwkJCSIgRGF0YSBmb3IgJXUgYmxvY2tzIHRvIGRlYnVnZnNcbiIsCiAJCQkJKGNtZC0+Y21uZFs3XSA8PCA4IHwgY21kLT5jbW5kWzhdKSk7Ci0JCWxwZmNfZGVidWdfc2F2ZV9kYXRhKGNtZCk7CisJCWxwZmNfZGVidWdfc2F2ZV9kYXRhKHBoYmEsIGNtZCk7CiAKIAkJLyogSWYgd2UgaGF2ZSBhIHByb3Qgc2dsLCBzYXZlIHRoZSBESUYgYnVmZmVyICovCiAJCWlmIChscGZjX3Byb3RfZ3JvdXBfdHlwZShwaGJhLCBjbWQpID09CiAJCQkJTFBGQ19QR19UWVBFX0RJRl9CVUYpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU2F2aW5nIERJRiBmb3IgJXUgYmxvY2tzIHRvIGRlYnVnZnNcbiIsCi0JCQkJCShjbWQtPmNtbmRbN10gPDwgOCB8IGNtZC0+Y21uZFs4XSkpOwotCQkJbHBmY19kZWJ1Z19zYXZlX2RpZihjbWQpOworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsICI5MDcxIEJMS0dSRDogIgorCQkJCSJTYXZpbmcgRElGIGZvciAldSBibG9ja3MgdG8gZGVidWdmc1xuIiwKKwkJCQkoY21kLT5jbW5kWzddIDw8IDggfCBjbWQtPmNtbmRbOF0pKTsKKwkJCWxwZmNfZGVidWdfc2F2ZV9kaWYocGhiYSwgY21kKTsKIAkJfQogCiAJCV9kdW1wX2J1Zl9kb25lID0gMTsKQEAgLTE2OTYsMTUgKzE3MTYsMTcgQEAKIAogCWlmIChscGZjX2Jnc19nZXRfaW52YWxpZF9wcm9mKGJnc3RhdCkpIHsKIAkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9FUlJPUiwgMCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBCbG9ja0d1YXJkIHByb2ZpbGUuIGJnc3RhdDoweCV4XG4iLAotCQkJCWJnc3RhdCk7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLCAiOTA3MiBCTEtHUkQ6IEludmFsaWQiCisJCQkiIEJsb2NrR3VhcmQgcHJvZmlsZS4gYmdzdGF0OjB4JXhcbiIsCisJCQliZ3N0YXQpOwogCQlyZXQgPSAoLTEpOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAobHBmY19iZ3NfZ2V0X3VuaW5pdF9kaWZfYmxvY2soYmdzdGF0KSkgewogCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX0VSUk9SLCAwKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEJsb2NrR3VhcmQgRElGIEJsb2NrLiBiZ3N0YXQ6MHgleFxuIiwKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsICI5MDczIEJMS0dSRDogIgorCQkJCSJJbnZhbGlkIEJsb2NrR3VhcmQgRElGIEJsb2NrLiBiZ3N0YXQ6MHgleFxuIiwKIAkJCQliZ3N0YXQpOwogCQlyZXQgPSAoLTEpOwogCQlnb3RvIG91dDsKQEAgLTE3MTgsNyArMTc0MCw4IEBACiAJCWNtZC0+cmVzdWx0ID0gRFJJVkVSX1NFTlNFIDw8IDI0CiAJCQl8IFNjc2lSZXN1bHQoRElEX0FCT1JULCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04pOwogCQlwaGJhLT5iZ19ndWFyZF9lcnJfY250Kys7Ci0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEOiBndWFyZF90YWcgZXJyb3JcbiIpOworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCSI5MDU1IEJMS0dSRDogZ3VhcmRfdGFnIGVycm9yXG4iKTsKIAl9CiAKIAlpZiAobHBmY19iZ3NfZ2V0X3JlZnRhZ19lcnIoYmdzdGF0KSkgewpAQCAtMTczMCw3ICsxNzUzLDggQEAKIAkJCXwgU2NzaVJlc3VsdChESURfQUJPUlQsIFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTik7CiAKIAkJcGhiYS0+YmdfcmVmdGFnX2Vycl9jbnQrKzsKLQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQ6IHJlZl90YWcgZXJyb3JcbiIpOworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCSI5MDU2IEJMS0dSRDogcmVmX3RhZyBlcnJvclxuIik7CiAJfQogCiAJaWYgKGxwZmNfYmdzX2dldF9hcHB0YWdfZXJyKGJnc3RhdCkpIHsKQEAgLTE3NDIsNyArMTc2Niw4IEBACiAJCQl8IFNjc2lSZXN1bHQoRElEX0FCT1JULCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04pOwogCiAJCXBoYmEtPmJnX2FwcHRhZ19lcnJfY250Kys7Ci0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEOiBhcHBfdGFnIGVycm9yXG4iKTsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkiOTA2MSBCTEtHUkQ6IGFwcF90YWcgZXJyb3JcbiIpOwogCX0KIAogCWlmIChscGZjX2Jnc19nZXRfaGlfd2F0ZXJfbWFya19wcmVzZW50KGJnc3RhdCkpIHsKQEAgLTE3NjMsNyArMTc4OCw4IEBACiAJaWYgKCFyZXQpIHsKIAkJLyogTm8gZXJyb3Igd2FzIHJlcG9ydGVkIC0gcHJvYmxlbSBpbiBGVz8gKi8KIAkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9FUlJPUiwgMCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEOiBubyBlcnJvcnMgcmVwb3J0ZWQhXG4iKTsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkiOTA1NyBCTEtHUkQ6IG5vIGVycm9ycyByZXBvcnRlZCFcbiIpOwogCX0KIAogb3V0OgpAQCAtMTgyMiw5ICsxODQ4LDEwIEBACiAKIAkJbHBmY19jbWQtPnNlZ19jbnQgPSBuc2VnOwogCQlpZiAobHBmY19jbWQtPnNlZ19jbnQgPiBwaGJhLT5jZmdfc2dfc2VnX2NudCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVG9vIG1hbnkgc2cgc2VnbWVudHMgZnJvbSAiCi0JCQkgICAgICAgImRtYV9tYXBfc2cuICBDb25maWcgJWQsIHNlZ19jbnQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHBoYmEtPmNmZ19zZ19zZWdfY250LAorCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsICI5MDc0IEJMS0dSRDoiCisJCQkJIiAlczogVG9vIG1hbnkgc2cgc2VnbWVudHMgZnJvbSAiCisJCQkJImRtYV9tYXBfc2cuICBDb25maWcgJWQsIHNlZ19jbnQgJWRcbiIsCisJCQkJX19mdW5jX18sIHBoYmEtPmNmZ19zZ19zZWdfY250LAogCQkJICAgICAgIGxwZmNfY21kLT5zZWdfY250KTsKIAkJCXNjc2lfZG1hX3VubWFwKHNjc2lfY21uZCk7CiAJCQlyZXR1cm4gMTsKQEAgLTIwNTAsNiArMjA3NywyMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAocmVzcF9pbmZvICYgUlNQX0xFTl9WQUxJRCkgeworCQlyc3BsZW4gPSBiZTMyX3RvX2NwdShmY3Byc3AtPnJzcFJzcExlbik7CisJCWlmICgocnNwbGVuICE9IDAgJiYgcnNwbGVuICE9IDQgJiYgcnNwbGVuICE9IDgpIHx8CisJCSAgICAoZmNwcnNwLT5yc3BJbmZvMyAhPSBSU1BfTk9fRkFJTFVSRSkpIHsKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRkNQLAorCQkJCSAiMjcxOSBJbnZhbGlkIHJlc3BvbnNlIGxlbmd0aDogIgorCQkJCSAidGd0IHgleCBsdW4geCV4IGNtbmQgeCV4IHJzcGxlbiB4JXhcbiIsCisJCQkJIGNtbmQtPmRldmljZS0+aWQsCisJCQkJIGNtbmQtPmRldmljZS0+bHVuLCBjbW5kLT5jbW5kWzBdLAorCQkJCSByc3BsZW4pOworCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwogCWlmICgocmVzcF9pbmZvICYgU05TX0xFTl9WQUxJRCkgJiYgZmNwcnNwLT5yc3BTbnNMZW4pIHsKIAkJdWludDMyX3Qgc25zbGVuID0gYmUzMl90b19jcHUoZmNwcnNwLT5yc3BTbnNMZW4pOwogCQlpZiAoc25zbGVuID4gU0NTSV9TRU5TRV9CVUZGRVJTSVpFKQpAQCAtMjA3NCwxNSArMjExNiw2IEBACiAJCQkgYmUzMl90b19jcHUoZmNwcnNwLT5yc3BSc3BMZW4pLAogCQkJIGZjcHJzcC0+cnNwSW5mbzMpOwogCi0JaWYgKHJlc3BfaW5mbyAmIFJTUF9MRU5fVkFMSUQpIHsKLQkJcnNwbGVuID0gYmUzMl90b19jcHUoZmNwcnNwLT5yc3BSc3BMZW4pOwotCQlpZiAoKHJzcGxlbiAhPSAwICYmIHJzcGxlbiAhPSA0ICYmIHJzcGxlbiAhPSA4KSB8fAotCQkgICAgKGZjcHJzcC0+cnNwSW5mbzMgIT0gUlNQX05PX0ZBSUxVUkUpKSB7Ci0JCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJc2NzaV9zZXRfcmVzaWQoY21uZCwgMCk7CiAJaWYgKHJlc3BfaW5mbyAmIFJFU0lEX1VOREVSKSB7CiAJCXNjc2lfc2V0X3Jlc2lkKGNtbmQsIGJlMzJfdG9fY3B1KGZjcHJzcC0+cnNwUmVzSWQpKTsKQEAgLTIxODAsNyArMjIxMyw3IEBACiAJc3RydWN0IHNjc2lfY21uZCAqY21kID0gbHBmY19jbWQtPnBDbWQ7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnRtcF9zZGV2OwotCWludCBkZXB0aCA9IDA7CisJaW50IGRlcHRoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxwZmNfZmFzdF9wYXRoX2V2ZW50ICpmYXN0X3BhdGhfZXZ0OwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CkBAIC0yMjY0LDcgKzIyOTcsNyBAQAogCQkJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsCiAJCQkJCQkJTE9HX0JHLAogCQkJCQkJCSI5MDMxIG5vbi16ZXJvIEJHU1RBVCAiCi0JCQkJCQkJIm9uIHVucHJvdGVjdGVkIGNtZCIpOworCQkJCQkJCSJvbiB1bnByb3RlY3RlZCBjbWRcbiIpOwogCQkJCX0KIAkJCX0KIApAQCAtMjM0Nyw2NyArMjM4MCwyOSBAQAogCQlyZXR1cm47CiAJfQogCi0KIAlpZiAoIXJlc3VsdCkKIAkJbHBmY19yYW1wdXBfcXVldWVfZGVwdGgodnBvcnQsIHF1ZXVlX2RlcHRoKTsKIAotCWlmICghcmVzdWx0ICYmIHBub2RlICYmIE5MUF9DSEtfTk9ERV9BQ1QocG5vZGUpICYmCi0JICAgKChqaWZmaWVzIC0gcG5vZGUtPmxhc3RfcmFtcF91cF90aW1lKSA+Ci0JCUxQRkNfUV9SQU1QX1VQX0lOVEVSVkFMICogSFopICYmCi0JICAgKChqaWZmaWVzIC0gcG5vZGUtPmxhc3RfcV9mdWxsX3RpbWUpID4KLQkJTFBGQ19RX1JBTVBfVVBfSU5URVJWQUwgKiBIWikgJiYKLQkgICAodnBvcnQtPmNmZ19sdW5fcXVldWVfZGVwdGggPiBxdWV1ZV9kZXB0aCkpIHsKLQkJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHRtcF9zZGV2LCBzaG9zdCkgewotCQkJaWYgKHZwb3J0LT5jZmdfbHVuX3F1ZXVlX2RlcHRoID4gdG1wX3NkZXYtPnF1ZXVlX2RlcHRoKXsKLQkJCQlpZiAodG1wX3NkZXYtPmlkICE9IHNjc2lfaWQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICh0bXBfc2Rldi0+b3JkZXJlZF90YWdzKQotCQkJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aCh0bXBfc2RldiwKLQkJCQkJCU1TR19PUkRFUkVEX1RBRywKLQkJCQkJCXRtcF9zZGV2LT5xdWV1ZV9kZXB0aCsxKTsKLQkJCQllbHNlCi0JCQkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHRtcF9zZGV2LAotCQkJCQkJTVNHX1NJTVBMRV9UQUcsCi0JCQkJCQl0bXBfc2Rldi0+cXVldWVfZGVwdGgrMSk7Ci0KLQkJCQlwbm9kZS0+bGFzdF9yYW1wX3VwX3RpbWUgPSBqaWZmaWVzOwotCQkJfQotCQl9Ci0JCWxwZmNfc2VuZF9zZGV2X3F1ZXVlZGVwdGhfY2hhbmdlX2V2ZW50KHBoYmEsIHZwb3J0LCBwbm9kZSwKLQkJCTB4RkZGRkZGRkYsCi0JCQlxdWV1ZV9kZXB0aCAsIHF1ZXVlX2RlcHRoICsgMSk7Ci0JfQotCiAJLyoKIAkgKiBDaGVjayBmb3IgcXVldWUgZnVsbC4gIElmIHRoZSBsdW4gaXMgcmVwb3J0aW5nIHF1ZXVlIGZ1bGwsIHRoZW4KIAkgKiBiYWNrIG9mZiB0aGUgbHVuIHF1ZXVlIGRlcHRoIHRvIHByZXZlbnQgdGFyZ2V0IG92ZXJsb2Fkcy4KIAkgKi8KIAlpZiAocmVzdWx0ID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwgJiYgcG5vZGUgJiYKIAkgICAgTkxQX0NIS19OT0RFX0FDVChwbm9kZSkpIHsKLQkJcG5vZGUtPmxhc3RfcV9mdWxsX3RpbWUgPSBqaWZmaWVzOwotCiAJCXNob3N0X2Zvcl9lYWNoX2RldmljZSh0bXBfc2Rldiwgc2hvc3QpIHsKIAkJCWlmICh0bXBfc2Rldi0+aWQgIT0gc2NzaV9pZCkKIAkJCQljb250aW51ZTsKIAkJCWRlcHRoID0gc2NzaV90cmFja19xdWV1ZV9mdWxsKHRtcF9zZGV2LAotCQkJCQl0bXBfc2Rldi0+cXVldWVfZGVwdGggLSAxKTsKLQkJfQotCQkvKgotCQkgKiBUaGUgcXVldWUgZGVwdGggY2Fubm90IGJlIGxvd2VyZWQgYW55IG1vcmUuCi0JCSAqIE1vZGlmeSB0aGUgcmV0dXJuZWQgZXJyb3IgY29kZSB0byBzdG9yZQotCQkgKiB0aGUgZmluYWwgZGVwdGggdmFsdWUgc2V0IGJ5Ci0JCSAqIHNjc2lfdHJhY2tfcXVldWVfZnVsbC4KLQkJICovCi0JCWlmIChkZXB0aCA9PSAtMSkKLQkJCWRlcHRoID0gc2hvc3QtPmNtZF9wZXJfbHVuOwotCi0JCWlmIChkZXB0aCkgeworCQkJCQkJICAgICAgdG1wX3NkZXYtPnF1ZXVlX2RlcHRoLTEpOworCQkJaWYgKGRlcHRoIDw9IDApCisJCQkJY29udGludWU7CiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19GQ1AsCiAJCQkJCSAiMDcxMSBkZXRlY3RlZCBxdWV1ZSBmdWxsIC0gbHVuIHF1ZXVlICIKIAkJCQkJICJkZXB0aCBhZGp1c3RlZCB0byAlZC5cbiIsIGRlcHRoKTsKIAkJCWxwZmNfc2VuZF9zZGV2X3F1ZXVlZGVwdGhfY2hhbmdlX2V2ZW50KHBoYmEsIHZwb3J0LAotCQkJCXBub2RlLCAweEZGRkZGRkZGLAotCQkJCWRlcHRoKzEsIGRlcHRoKTsKKwkJCQkJCQkgICAgICAgcG5vZGUsCisJCQkJCQkJICAgICAgIHRtcF9zZGV2LT5sdW4sCisJCQkJCQkJICAgICAgIGRlcHRoKzEsIGRlcHRoKTsKIAkJfQogCX0KIApAQCAtMjc0NSw3ICsyNzQwLDkgQEAKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopIHB0cjsKIAogCWlmIChwaGJhLT5jZmdfcG9sbCAmIEVOQUJMRV9GQ1BfUklOR19QT0xMSU5HKSB7Ci0JCWxwZmNfc2xpX3BvbGxfZmNwX3JpbmcgKHBoYmEpOworCQlscGZjX3NsaV9oYW5kbGVfZmFzdF9yaW5nX2V2ZW50KHBoYmEsCisJCQkmcGhiYS0+c2xpLnJpbmdbTFBGQ19GQ1BfUklOR10sIEhBX1IwUkVfUkVRKTsKKwogCQlpZiAocGhiYS0+Y2ZnX3BvbGwgJiBESVNBQkxFX0ZDUF9SSU5HX0lOVCkKIAkJCWxwZmNfcG9sbF9yZWFybV90aW1lcihwaGJhKTsKIAl9CkBAIC0yNzcxLDcgKzI3NjgsNyBAQAogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKIAlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0Jc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHAgPSByZGF0YS0+cG5vZGU7CisJc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHA7CiAJc3RydWN0IGxwZmNfc2NzaV9idWYgKmxwZmNfY21kOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KGNtbmQtPmRldmljZSkpOwogCWludCBlcnI7CkBAIC0yNzgxLDEzICsyNzc4LDE1IEBACiAJCWNtbmQtPnJlc3VsdCA9IGVycjsKIAkJZ290byBvdXRfZmFpbF9jb21tYW5kOwogCX0KKwluZGxwID0gcmRhdGEtPnBub2RlOwogCiAJaWYgKCEocGhiYS0+c2xpM19vcHRpb25zICYgTFBGQ19TTEkzX0JHX0VOQUJMRUQpICYmCiAJCXNjc2lfZ2V0X3Byb3Rfb3AoY21uZCkgIT0gU0NTSV9QUk9UX05PUk1BTCkgewogCi0JCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SOiByY3ZkIHByb3RlY3RlZCBjbWQ6JTAyeCBvcDolMDJ4ICIKLQkJCQkic3RyPSVzIHdpdGhvdXQgcmVnaXN0ZXJpbmcgZm9yIEJsb2NrR3VhcmQgLSAiCi0JCQkJIlJlamVjdGluZyBjb21tYW5kXG4iLAorCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCQkiOTA1OCBCTEtHUkQ6IEVSUk9SOiByY3ZkIHByb3RlY3RlZCBjbWQ6JTAyeCIKKwkJCQkiIG9wOiUwMnggc3RyPSVzIHdpdGhvdXQgcmVnaXN0ZXJpbmcgZm9yIgorCQkJCSIgQmxvY2tHdWFyZCAtIFJlamVjdGluZyBjb21tYW5kXG4iLAogCQkJCWNtbmQtPmNtbmRbMF0sIHNjc2lfZ2V0X3Byb3Rfb3AoY21uZCksCiAJCQkJZGlmX29wX3N0cltzY3NpX2dldF9wcm90X29wKGNtbmQpXSk7CiAJCWdvdG8gb3V0X2ZhaWxfY29tbWFuZDsKQEAgLTI4MjcsNjEgKzI4MjYsNjYgQEAKIAljbW5kLT5zY3NpX2RvbmUgPSBkb25lOwogCiAJaWYgKHNjc2lfZ2V0X3Byb3Rfb3AoY21uZCkgIT0gU0NTSV9QUk9UX05PUk1BTCkgewotCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJaWYgKHZwb3J0LT5waGJhLT5jZmdfZW5hYmxlX2JnKSB7CisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKIAkJCQkiOTAzMyBCTEtHUkQ6IHJjdmQgcHJvdGVjdGVkIGNtZDolMDJ4IG9wOiUwMnggIgogCQkJCSJzdHI9JXNcbiIsCiAJCQkJY21uZC0+Y21uZFswXSwgc2NzaV9nZXRfcHJvdF9vcChjbW5kKSwKIAkJCQlkaWZfb3Bfc3RyW3Njc2lfZ2V0X3Byb3Rfb3AoY21uZCldKTsKLQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKIAkJCQkiOTAzNCBCTEtHUkQ6IENEQjogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKIAkJCQkiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAogCQkJCWNtbmQtPmNtbmRbMF0sIGNtbmQtPmNtbmRbMV0sIGNtbmQtPmNtbmRbMl0sCiAJCQkJY21uZC0+Y21uZFszXSwgY21uZC0+Y21uZFs0XSwgY21uZC0+Y21uZFs1XSwKIAkJCQljbW5kLT5jbW5kWzZdLCBjbW5kLT5jbW5kWzddLCBjbW5kLT5jbW5kWzhdLAogCQkJCWNtbmQtPmNtbmRbOV0pOwotCQlpZiAoY21uZC0+Y21uZFswXSA9PSBSRUFEXzEwKQotCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCisJCQlpZiAoY21uZC0+Y21uZFswXSA9PSBSRUFEXzEwKQorCQkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0JHLAogCQkJCQkiOTAzNSBCTEtHUkQ6IFJFQUQgQCBzZWN0b3IgJWxsdSwgIgogCQkJCQkiY291bnQgJXVcbiIsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2NzaV9nZXRfbGJhKGNtbmQpLAogCQkJCQlibGtfcnFfc2VjdG9ycyhjbW5kLT5yZXF1ZXN0KSk7Ci0JCWVsc2UgaWYgKGNtbmQtPmNtbmRbMF0gPT0gV1JJVEVfMTApCi0JCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCWVsc2UgaWYgKGNtbmQtPmNtbmRbMF0gPT0gV1JJVEVfMTApCisJCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCiAJCQkJCSI5MDM2IEJMS0dSRDogV1JJVEUgQCBzZWN0b3IgJWxsdSwgIgogCQkJCQkiY291bnQgJXUgY21kPSVwXG4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfZ2V0X2xiYShjbW5kKSwKIAkJCQkJYmxrX3JxX3NlY3RvcnMoY21uZC0+cmVxdWVzdCksCiAJCQkJCWNtbmQpOworCQl9CiAKIAkJZXJyID0gbHBmY19iZ19zY3NpX3ByZXBfZG1hX2J1ZihwaGJhLCBscGZjX2NtZCk7CiAJfSBlbHNlIHsKLQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCi0JCQkJIjkwMzggQkxLR1JEOiByY3ZkIHVucHJvdGVjdGVkIGNtZDolMDJ4IG9wOiUwMngiCi0JCQkJIiBzdHI9JXNcbiIsCi0JCQkJY21uZC0+Y21uZFswXSwgc2NzaV9nZXRfcHJvdF9vcChjbW5kKSwKLQkJCQlkaWZfb3Bfc3RyW3Njc2lfZ2V0X3Byb3Rfb3AoY21uZCldKTsKLQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCi0JCQkJICI5MDM5IEJMS0dSRDogQ0RCOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIgotCQkJCSAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCQkJCSBjbW5kLT5jbW5kWzBdLCBjbW5kLT5jbW5kWzFdLCBjbW5kLT5jbW5kWzJdLAotCQkJCSBjbW5kLT5jbW5kWzNdLCBjbW5kLT5jbW5kWzRdLCBjbW5kLT5jbW5kWzVdLAotCQkJCSBjbW5kLT5jbW5kWzZdLCBjbW5kLT5jbW5kWzddLCBjbW5kLT5jbW5kWzhdLAotCQkJCSBjbW5kLT5jbW5kWzldKTsKLQkJaWYgKGNtbmQtPmNtbmRbMF0gPT0gUkVBRF8xMCkKKwkJaWYgKHZwb3J0LT5waGJhLT5jZmdfZW5hYmxlX2JnKSB7CiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKLQkJCQkJICI5MDQwIGRiZzogUkVBRCBAIHNlY3RvciAlbGx1LCAiCi0JCQkJCSAiY291bnQgJXVcbiIsCi0JCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfZ2V0X2xiYShjbW5kKSwKKwkJCQkJIjkwMzggQkxLR1JEOiByY3ZkIHVucHJvdGVjdGVkIGNtZDoiCisJCQkJCSIlMDJ4IG9wOiUwMnggc3RyPSVzXG4iLAorCQkJCQljbW5kLT5jbW5kWzBdLCBzY3NpX2dldF9wcm90X29wKGNtbmQpLAorCQkJCQlkaWZfb3Bfc3RyW3Njc2lfZ2V0X3Byb3Rfb3AoY21uZCldKTsKKwkJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCQkJIjkwMzkgQkxLR1JEOiBDREI6ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkJIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJCWNtbmQtPmNtbmRbMF0sIGNtbmQtPmNtbmRbMV0sCisJCQkJCWNtbmQtPmNtbmRbMl0sIGNtbmQtPmNtbmRbM10sCisJCQkJCWNtbmQtPmNtbmRbNF0sIGNtbmQtPmNtbmRbNV0sCisJCQkJCWNtbmQtPmNtbmRbNl0sIGNtbmQtPmNtbmRbN10sCisJCQkJCWNtbmQtPmNtbmRbOF0sIGNtbmQtPmNtbmRbOV0pOworCQkJaWYgKGNtbmQtPmNtbmRbMF0gPT0gUkVBRF8xMCkKKwkJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCQkJIjkwNDAgZGJnOiBSRUFEIEAgc2VjdG9yICVsbHUsICIKKwkJCQkJImNvdW50ICV1XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfZ2V0X2xiYShjbW5kKSwKIAkJCQkJIGJsa19ycV9zZWN0b3JzKGNtbmQtPnJlcXVlc3QpKTsKLQkJZWxzZSBpZiAoY21uZC0+Y21uZFswXSA9PSBXUklURV8xMCkKLQkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0JHLAorCQkJZWxzZSBpZiAoY21uZC0+Y21uZFswXSA9PSBXUklURV8xMCkKKwkJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKIAkJCQkJICI5MDQxIGRiZzogV1JJVEUgQCBzZWN0b3IgJWxsdSwgIgogCQkJCQkgImNvdW50ICV1IGNtZD0lcFxuIiwKIAkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpc2NzaV9nZXRfbGJhKGNtbmQpLAogCQkJCQkgYmxrX3JxX3NlY3RvcnMoY21uZC0+cmVxdWVzdCksIGNtbmQpOwotCQllbHNlCi0JCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCWVsc2UKKwkJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKIAkJCQkJICI5MDQyIGRiZzogcGFyc2VyIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCX0KIAkJZXJyID0gbHBmY19zY3NpX3ByZXBfZG1hX2J1ZihwaGJhLCBscGZjX2NtZCk7CiAJfQogCkBAIC0yODk4LDcgKzI5MDIsMTEgQEAKIAkJZ290byBvdXRfaG9zdF9idXN5X2ZyZWVfYnVmOwogCX0KIAlpZiAocGhiYS0+Y2ZnX3BvbGwgJiBFTkFCTEVfRkNQX1JJTkdfUE9MTElORykgewotCQlscGZjX3NsaV9wb2xsX2ZjcF9yaW5nKHBoYmEpOworCQlzcGluX3VubG9jayhzaG9zdC0+aG9zdF9sb2NrKTsKKwkJbHBmY19zbGlfaGFuZGxlX2Zhc3RfcmluZ19ldmVudChwaGJhLAorCQkJJnBoYmEtPnNsaS5yaW5nW0xQRkNfRkNQX1JJTkddLCBIQV9SMFJFX1JFUSk7CisKKwkJc3Bpbl9sb2NrKHNob3N0LT5ob3N0X2xvY2spOwogCQlpZiAocGhiYS0+Y2ZnX3BvbGwgJiBESVNBQkxFX0ZDUF9SSU5HX0lOVCkKIAkJCWxwZmNfcG9sbF9yZWFybV90aW1lcihwaGJhKTsKIAl9CkBAIC0yOTE3LDI4ICsyOTI1LDYgQEAKIH0KIAogLyoqCi0gKiBscGZjX2Jsb2NrX2Vycm9yX2hhbmRsZXIgLSBSb3V0aW5lIHRvIGJsb2NrIGVycm9yICBoYW5kbGVyCi0gKiBAY21uZDogUG9pbnRlciB0byBzY3NpX2NtbmQgZGF0YSBzdHJ1Y3R1cmUuCi0gKgotICogIFRoaXMgcm91dGluZSBibG9ja3MgZXhlY3V0aW9uIHRpbGwgZmNfcnBvcnQgc3RhdGUgaXMgbm90IEZDX1BPUlNUQVRfQkxDT0VLRC4KLSAqKi8KLXN0YXRpYyB2b2lkCi1scGZjX2Jsb2NrX2Vycm9yX2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21uZCkKLXsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChjbW5kLT5kZXZpY2UpKTsKLQotCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7Ci0Jd2hpbGUgKHJwb3J0LT5wb3J0X3N0YXRlID09IEZDX1BPUlRTVEFURV9CTE9DS0VEKSB7Ci0JCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKLQkJbXNsZWVwKDEwMDApOwotCQlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwotCX0KLQlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7Ci0JcmV0dXJuOwotfQotCi0vKioKICAqIGxwZmNfYWJvcnRfaGFuZGxlciAtIHNjc2lfaG9zdF90ZW1wbGF0ZSBlaF9hYm9ydF9oYW5kbGVyIGVudHJ5IHBvaW50CiAgKiBAY21uZDogUG9pbnRlciB0byBzY3NpX2NtbmQgZGF0YSBzdHJ1Y3R1cmUuCiAgKgpAQCAtMjk2MSw3ICsyOTQ3LDcgQEAKIAlpbnQgcmV0ID0gU1VDQ0VTUzsKIAlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHdhaXRxKTsKIAotCWxwZmNfYmxvY2tfZXJyb3JfaGFuZGxlcihjbW5kKTsKKwlmY19ibG9ja19zY3NpX2VoKGNtbmQpOwogCWxwZmNfY21kID0gKHN0cnVjdCBscGZjX3Njc2lfYnVmICopY21uZC0+aG9zdF9zY3JpYmJsZTsKIAlCVUdfT04oIWxwZmNfY21kKTsKIApAQCAtMzAwMSw2ICsyOTg3LDEwIEBACiAKIAlpY21kLT51bHBMZSA9IDE7CiAJaWNtZC0+dWxwQ2xhc3MgPSBjbWQtPnVscENsYXNzOworCisJLyogQUJUUyBXUUUgbXVzdCBnbyB0byB0aGUgc2FtZSBXUSBhcyB0aGUgV1FFIHRvIGJlIGFib3J0ZWQgKi8KKwlhYnRzaW9jYi0+ZmNwX3dxaWR4ID0gaW9jYi0+ZmNwX3dxaWR4OworCiAJaWYgKGxwZmNfaXNfbGlua191cChwaGJhKSkKIAkJaWNtZC0+dWxwQ29tbWFuZCA9IENNRF9BQk9SVF9YUklfQ047CiAJZWxzZQpAQCAtMzAxNiw3ICszMDA2LDggQEAKIAl9CiAKIAlpZiAocGhiYS0+Y2ZnX3BvbGwgJiBESVNBQkxFX0ZDUF9SSU5HX0lOVCkKLQkJbHBmY19zbGlfcG9sbF9mY3BfcmluZyAocGhiYSk7CisJCWxwZmNfc2xpX2hhbmRsZV9mYXN0X3JpbmdfZXZlbnQocGhiYSwKKwkJCSZwaGJhLT5zbGkucmluZ1tMUEZDX0ZDUF9SSU5HXSwgSEFfUjBSRV9SRVEpOwogCiAJbHBmY19jbWQtPndhaXRxID0gJndhaXRxOwogCS8qIFdhaXQgZm9yIGFib3J0IHRvIGNvbXBsZXRlICovCkBAIC0zMTY2LDkgKzMxNTcsMTUgQEAKIGxwZmNfY2hrX3RndF9tYXBwZWQoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQogewogCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqcG5vZGUgPSByZGF0YS0+cG5vZGU7CisJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlOwogCXVuc2lnbmVkIGxvbmcgbGF0ZXI7CiAKKwlpZiAoIXJkYXRhKSB7CisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0ZDUCwKKwkJCSIwNzk3IFRndCBNYXAgcnBvcnQgZmFpbHVyZTogcmRhdGEgeCVwXG4iLCByZGF0YSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXBub2RlID0gcmRhdGEtPnBub2RlOwogCS8qCiAJICogSWYgdGFyZ2V0IGlzIG5vdCBpbiBhIE1BUFBFRCBzdGF0ZSwgZGVsYXkgdW50aWwKIAkgKiB0YXJnZXQgaXMgcmVkaXNjb3ZlcmVkIG9yIGRldmxvc3MgdGltZW91dCBleHBpcmVzLgpAQCAtMzI1MywxMyArMzI1MCwxOSBAQAogCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqcG5vZGUgPSByZGF0YS0+cG5vZGU7CisJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlOwogCXVuc2lnbmVkIHRndF9pZCA9IGNtbmQtPmRldmljZS0+aWQ7CiAJdW5zaWduZWQgaW50IGx1bl9pZCA9IGNtbmQtPmRldmljZS0+bHVuOwogCXN0cnVjdCBscGZjX3Njc2lfZXZlbnRfaGVhZGVyIHNjc2lfZXZlbnQ7CiAJaW50IHN0YXR1czsKIAotCWxwZmNfYmxvY2tfZXJyb3JfaGFuZGxlcihjbW5kKTsKKwlpZiAoIXJkYXRhKSB7CisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRkNQLAorCQkJIjA3OTggRGV2aWNlIFJlc2V0IHJwb3J0IGZhaWx1cmU6IHJkYXRhIHglcFxuIiwgcmRhdGEpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlwbm9kZSA9IHJkYXRhLT5wbm9kZTsKKwlmY19ibG9ja19zY3NpX2VoKGNtbmQpOwogCiAJc3RhdHVzID0gbHBmY19jaGtfdGd0X21hcHBlZCh2cG9ydCwgY21uZCk7CiAJaWYgKHN0YXR1cyA9PSBGQUlMRUQpIHsKQEAgLTMzMTIsMTMgKzMzMTUsMTkgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBjbW5kLT5kZXZpY2UtPmhvc3Q7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNob3N0LT5ob3N0ZGF0YTsKIAlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0Jc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlID0gcmRhdGEtPnBub2RlOworCXN0cnVjdCBscGZjX25vZGVsaXN0ICpwbm9kZTsKIAl1bnNpZ25lZCB0Z3RfaWQgPSBjbW5kLT5kZXZpY2UtPmlkOwogCXVuc2lnbmVkIGludCBsdW5faWQgPSBjbW5kLT5kZXZpY2UtPmx1bjsKIAlzdHJ1Y3QgbHBmY19zY3NpX2V2ZW50X2hlYWRlciBzY3NpX2V2ZW50OwogCWludCBzdGF0dXM7CiAKLQlscGZjX2Jsb2NrX2Vycm9yX2hhbmRsZXIoY21uZCk7CisJaWYgKCFyZGF0YSkgeworCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0ZDUCwKKwkJCSIwNzk5IFRhcmdldCBSZXNldCBycG9ydCBmYWlsdXJlOiByZGF0YSB4JXBcbiIsIHJkYXRhKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcG5vZGUgPSByZGF0YS0+cG5vZGU7CisJZmNfYmxvY2tfc2NzaV9laChjbW5kKTsKIAogCXN0YXR1cyA9IGxwZmNfY2hrX3RndF9tYXBwZWQodnBvcnQsIGNtbmQpOwogCWlmIChzdGF0dXMgPT0gRkFJTEVEKSB7CkBAIC0zMzg0LDcgKzMzOTMsNyBAQAogCWZjX2hvc3RfcG9zdF92ZW5kb3JfZXZlbnQoc2hvc3QsIGZjX2dldF9ldmVudF9udW1iZXIoKSwKIAkJc2l6ZW9mKHNjc2lfZXZlbnQpLCAoY2hhciAqKSZzY3NpX2V2ZW50LCBMUEZDX05MX1ZFTkRPUl9JRCk7CiAKLQlscGZjX2Jsb2NrX2Vycm9yX2hhbmRsZXIoY21uZCk7CisJZmNfYmxvY2tfc2NzaV9laChjbW5kKTsKIAogCS8qCiAJICogU2luY2UgdGhlIGRyaXZlciBtYW5hZ2VzIGEgc2luZ2xlIGJ1cyBkZXZpY2UsIHJlc2V0IGFsbApAQCAtMzQ5OCw2ICszNTA3LDggQEAKIAkJCQkgIkFsbG9jYXRlZCAlZCBidWZmZXJzLlxuIiwKIAkJCQkgbnVtX3RvX2FsbG9jLCBudW1fYWxsb2NhdGVkKTsKIAl9CisJaWYgKG51bV9hbGxvY2F0ZWQgPiAwKQorCQlwaGJhLT50b3RhbF9zY3NpX2J1ZnMgKz0gbnVtX2FsbG9jYXRlZDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzUzNCw3ICszNTQ1LDggQEAKIAlycG9ydC0+ZGV2X2xvc3NfdG1vID0gdnBvcnQtPmNmZ19kZXZsb3NzX3RtbzsKIAogCWlmIChwaGJhLT5jZmdfcG9sbCAmIEVOQUJMRV9GQ1BfUklOR19QT0xMSU5HKSB7Ci0JCWxwZmNfc2xpX3BvbGxfZmNwX3JpbmcocGhiYSk7CisJCWxwZmNfc2xpX2hhbmRsZV9mYXN0X3JpbmdfZXZlbnQocGhiYSwKKwkJCSZwaGJhLT5zbGkucmluZ1tMUEZDX0ZDUF9SSU5HXSwgSEFfUjBSRV9SRVEpOwogCQlpZiAocGhiYS0+Y2ZnX3BvbGwgJiBESVNBQkxFX0ZDUF9SSU5HX0lOVCkKIAkJCWxwZmNfcG9sbF9yZWFybV90aW1lcihwaGJhKTsKIAl9CkBAIC0zNTc2LDYgKzM1ODgsNyBAQAogCS5zaG9zdF9hdHRycwkJPSBscGZjX2hiYV9hdHRycywKIAkubWF4X3NlY3RvcnMJCT0gMHhGRkZGLAogCS52ZW5kb3JfaWQJCT0gTFBGQ19OTF9WRU5ET1JfSUQsCisJLmNoYW5nZV9xdWV1ZV9kZXB0aAk9IGxwZmNfY2hhbmdlX3F1ZXVlX2RlcHRoLAogfTsKIAogc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBscGZjX3Zwb3J0X3RlbXBsYXRlID0gewpAQCAtMzU5Nyw0ICszNjEwLDUgQEAKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCiAJLnNob3N0X2F0dHJzCQk9IGxwZmNfdnBvcnRfYXR0cnMsCiAJLm1heF9zZWN0b3JzCQk9IDB4RkZGRiwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gbHBmY19jaGFuZ2VfcXVldWVfZGVwdGgsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKaW5kZXggNDNjYmUzMy4uNzkzNTY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CiAjaW5jbHVkZSA8c2NzaS9mYy9mY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Flci5oPgogCiAjaW5jbHVkZSAibHBmY19odzQuaCIKICNpbmNsdWRlICJscGZjX2h3LmgiCkBAIC01OCw4ICs1OSwxMSBAQAogc3RhdGljIGludCBscGZjX3NsaV9pc3N1ZV9tYm94X3M0KHN0cnVjdCBscGZjX2hiYSAqLCBMUEZDX01CT1hRX3QgKiwKIAkJCQkgIHVpbnQzMl90KTsKIHN0YXRpYyBpbnQgbHBmY19zbGk0X3JlYWRfcmV2KHN0cnVjdCBscGZjX2hiYSAqLCBMUEZDX01CT1hRX3QgKiwKLQkJCSAgICB1aW50OF90ICosIHVpbnQzMl90ICopOwotCisJCQkgICAgICB1aW50OF90ICosIHVpbnQzMl90ICopOworc3RhdGljIHN0cnVjdCBscGZjX2lvY2JxICpscGZjX3NsaTRfZWxzX3djcWVfdG9fcnNwaW9jYnEoc3RydWN0IGxwZmNfaGJhICosCisJCQkJCQkJIHN0cnVjdCBscGZjX2lvY2JxICopOworc3RhdGljIHZvaWQgbHBmY19zbGk0X3NlbmRfc2VxX3RvX3VscChzdHJ1Y3QgbHBmY192cG9ydCAqLAorCQkJCSAgICAgIHN0cnVjdCBoYnFfZG1hYnVmICopOwogc3RhdGljIElPQ0JfdCAqCiBscGZjX2dldF9pb2NiX2Zyb21faW9jYnEoc3RydWN0IGxwZmNfaW9jYnEgKmlvY2JxKQogewpAQCAtMjU5LDYgKzI2Myw5IEBACiAJYmZfc2V0KGxwZmNfZXFjcV9kb29yYmVsbF9xdCwgJmRvb3JiZWxsLCBMUEZDX1FVRVVFX1RZUEVfRVZFTlQpOwogCWJmX3NldChscGZjX2VxY3FfZG9vcmJlbGxfZXFpZCwgJmRvb3JiZWxsLCBxLT5xdWV1ZV9pZCk7CiAJd3JpdGVsKGRvb3JiZWxsLndvcmQwLCBxLT5waGJhLT5zbGk0X2hiYS5FUUNRREJyZWdhZGRyKTsKKwkvKiBQQ0kgcmVhZCB0byBmbHVzaCBQQ0kgcGlwZWxpbmUgb24gcmUtYXJtaW5nIGZvciBJTlR4IG1vZGUgKi8KKwlpZiAoKHEtPnBoYmEtPmludHJfdHlwZSA9PSBJTlR4KSAmJiAoYXJtID09IExQRkNfUVVFVUVfUkVBUk0pKQorCQlyZWFkbChxLT5waGJhLT5zbGk0X2hiYS5FUUNRREJyZWdhZGRyKTsKIAlyZXR1cm4gcmVsZWFzZWQ7CiB9CiAKQEAgLTUxNSw2ICs1MjIsOCBAQAogCXN0cnVjdCBscGZjX3NnbHEgKnNnbHEgPSBOVUxMOwogCXVpbnQxNl90IGFkal94cmk7CiAJbGlzdF9yZW1vdmVfaGVhZChscGZjX3NnbF9saXN0LCBzZ2xxLCBzdHJ1Y3QgbHBmY19zZ2xxLCBsaXN0KTsKKwlpZiAoIXNnbHEpCisJCXJldHVybiBOVUxMOwogCWFkal94cmkgPSBzZ2xxLT5zbGk0X3hyaXRhZyAtIHBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ueHJpX2Jhc2U7CiAJcGhiYS0+c2xpNF9oYmEubHBmY19zZ2xxX2FjdGl2ZV9saXN0W2Fkal94cmldID0gc2dscTsKIAlyZXR1cm4gc2dscTsKQEAgLTU3Miw5ICs1ODEsOSBAQAogCQlzZ2xxID0gX19scGZjX2NsZWFyX2FjdGl2ZV9zZ2xxKHBoYmEsIGlvY2JxLT5zbGk0X3hyaXRhZyk7CiAJaWYgKHNnbHEpICB7CiAJCWlmIChpb2NicS0+aW9jYl9mbGFnICYgTFBGQ19EUklWRVJfQUJPUlRFRAotCQkJfHwgKChpb2NicS0+aW9jYi51bHBTdGF0dXMgPT0gSU9TVEFUX0xPQ0FMX1JFSkVDVCkKKwkJCSYmICgoaW9jYnEtPmlvY2IudWxwU3RhdHVzID09IElPU1RBVF9MT0NBTF9SRUpFQ1QpCiAJCQkmJiAoaW9jYnEtPmlvY2IudW4udWxwV29yZFs0XQotCQkJCT09IElPRVJSX1NMSV9BQk9SVEVEKSkpIHsKKwkJCQk9PSBJT0VSUl9BQk9SVF9SRVFVRVNURUQpKSkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPnNsaTRfaGJhLmFidHNfc2dsX2xpc3RfbG9jaywKIAkJCQkJaWZsYWcpOwogCQkJbGlzdF9hZGQoJnNnbHEtPmxpc3QsCkBAIC03NjcsNiArNzc2LDcgQEAKIAljYXNlIENNRF9DTE9TRV9YUklfQ1g6CiAJY2FzZSBDTURfWFJJX0FCT1JURURfQ1g6CiAJY2FzZSBDTURfQUJPUlRfTVhSSTY0X0NOOgorCWNhc2UgQ01EX1hNSVRfQkxTX1JTUDY0X0NYOgogCQl0eXBlID0gTFBGQ19BQk9SVF9JT0NCOwogCQlicmVhazsKIAljYXNlIENNRF9SQ1ZfU0VRVUVOQ0VfQ1g6CkBAIC0xNzk0LDcgKzE4MDQsNyBAQAogCQkgKi8KIAkJaWYgKGxwZmNfc2xpX2Noa19tYnhfY29tbWFuZChwbWJveC0+bWJ4Q29tbWFuZCkgPT0KIAkJICAgIE1CWF9TSFVURE9XTikgewotCQkJLyogVW5rbm93IG1haWxib3ggY29tbWFuZCBjb21wbCAqLworCQkJLyogVW5rbm93biBtYWlsYm94IGNvbW1hbmQgY29tcGwgKi8KIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLAogCQkJCQkiKCVkKTowMzIzIFVua25vd24gTWFpbGJveCBjb21tYW5kICIKIAkJCQkJIngleCAoeCV4KSBDbXBsXG4iLApAQCAtMjA2OCw4ICsyMDc4LDggQEAKIAlpZiAoKGlyc3AtPnVscENvbW1hbmQgPT0gQ01EX1JDVl9FTFNfUkVRNjRfQ1gpIHx8CiAJICAgIChpcnNwLT51bHBDb21tYW5kID09IENNRF9SQ1ZfRUxTX1JFUV9DWCkgfHwKIAkgICAgKGlyc3AtPnVscENvbW1hbmQgPT0gQ01EX0lPQ0JfUkNWX0VMUzY0X0NYKSkgewotCQlSY3RsID0gRkNfRUxTX1JFUTsKLQkJVHlwZSA9IEZDX0VMU19EQVRBOworCQlSY3RsID0gRkNfUkNUTF9FTFNfUkVROworCQlUeXBlID0gRkNfVFlQRV9FTFM7CiAJfSBlbHNlIHsKIAkJdzVwID0gKFdPUkQ1ICopJihzYXZlcS0+aW9jYi51bi51bHBXb3JkWzVdKTsKIAkJUmN0bCA9IHc1cC0+aGNzdy5SY3RsOwpAQCAtMjA3OSw4ICsyMDg5LDggQEAKIAkJaWYgKChSY3RsID09IDApICYmIChwcmluZy0+cmluZ25vID09IExQRkNfRUxTX1JJTkcpICYmCiAJCQkoaXJzcC0+dWxwQ29tbWFuZCA9PSBDTURfUkNWX1NFUVVFTkNFNjRfQ1ggfHwKIAkJCSBpcnNwLT51bHBDb21tYW5kID09IENNRF9JT0NCX1JDVl9TRVE2NF9DWCkpIHsKLQkJCVJjdGwgPSBGQ19FTFNfUkVROwotCQkJVHlwZSA9IEZDX0VMU19EQVRBOworCQkJUmN0bCA9IEZDX1JDVExfRUxTX1JFUTsKKwkJCVR5cGUgPSBGQ19UWVBFX0VMUzsKIAkJCXc1cC0+aGNzdy5SY3RsID0gUmN0bDsKIAkJCXc1cC0+aGNzdy5UeXBlID0gVHlwZTsKIAkJfQpAQCAtMjMyNCwxNjggKzIzMzQsNiBAQAogCXJldHVybjsKIH0KIAotLyoqCi0gKiBscGZjX3NsaV9wb2xsX2ZjcF9yaW5nIC0gSGFuZGxlIEZDUCByaW5nIGNvbXBsZXRpb24gaW4gcG9sbGluZyBtb2RlCi0gKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBscGZjX3F1ZXVlY29tbWFuZCwgbHBmY19wb2xsX3RpbWVvdXQsCi0gKiBscGZjX2Fib3J0X2hhbmRsZXIgYW5kIGxwZmNfc2xhdmVfY29uZmlndXJlIHdoZW4gRkNQX1JJTkdfUE9MTElORwotICogaXMgZW5hYmxlZC4KLSAqCi0gKiBUaGUgY2FsbGVyIGRvZXMgbm90IGhvbGQgYW55IGxvY2suCi0gKiBUaGUgZnVuY3Rpb24gcHJvY2Vzc2VzIGVhY2ggcmVzcG9uc2UgaW9jYiBpbiB0aGUgcmVzcG9uc2UgcmluZyB1bnRpbCBpdAotICogZmluZHMgYW4gaW9jYiB3aXRoIExFIGJpdCBzZXQgYW5kIGNoYWlucyBhbGwgdGhlIGlvY2JzIHVwdG8gdGhlIGlvY2Igd2l0aAotICogTEUgYml0IHNldC4gVGhlIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgY29tcGxldGlvbiBoYW5kbGVyIG9mIHRoZSBjb21tYW5kIGlvY2IKLSAqIGlmIHRoZSByZXNwb25zZSBpb2NiIGluZGljYXRlcyBhIGNvbXBsZXRpb24gZm9yIGEgY29tbWFuZCBpb2NiIG9yIGl0IGlzCi0gKiBhbiBhYm9ydCBjb21wbGV0aW9uLgotICoqLwotdm9pZCBscGZjX3NsaV9wb2xsX2ZjcF9yaW5nKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKLXsKLQlzdHJ1Y3QgbHBmY19zbGkgICAgICAqcHNsaSAgPSAmcGhiYS0+c2xpOwotCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwc2xpLT5yaW5nW0xQRkNfRkNQX1JJTkddOwotCUlPQ0JfdCAqaXJzcCA9IE5VTEw7Ci0JSU9DQl90ICplbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGxwZmNfaW9jYnEgKmNtZGlvY2JxID0gTlVMTDsKLQlzdHJ1Y3QgbHBmY19pb2NicSByc3Bpb2NicTsKLQlzdHJ1Y3QgbHBmY19wZ3AgKnBncCA9ICZwaGJhLT5wb3J0X2dwW3ByaW5nLT5yaW5nbm9dOwotCXVpbnQzMl90IHN0YXR1czsKLQl1aW50MzJfdCBwb3J0UnNwUHV0LCBwb3J0UnNwTWF4OwotCWludCB0eXBlOwotCXVpbnQzMl90IHJzcF9jbXBsID0gMDsKLQl1aW50MzJfdCBoYV9jb3B5OwotCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwotCi0JcHJpbmctPnN0YXRzLmlvY2JfZXZlbnQrKzsKLQotCS8qCi0JICogVGhlIG5leHQgYXZhaWxhYmxlIHJlc3BvbnNlIGVudHJ5IHNob3VsZCBuZXZlciBleGNlZWQgdGhlIG1heGltdW0KLQkgKiBlbnRyaWVzLiAgSWYgaXQgZG9lcywgdHJlYXQgaXQgYXMgYW4gYWRhcHRlciBoYXJkd2FyZSBlcnJvci4KLQkgKi8KLQlwb3J0UnNwTWF4ID0gcHJpbmctPm51bVJpb2NiOwotCXBvcnRSc3BQdXQgPSBsZTMyX3RvX2NwdShwZ3AtPnJzcFB1dElueCk7Ci0JaWYgKHVubGlrZWx5KHBvcnRSc3BQdXQgPj0gcG9ydFJzcE1heCkpIHsKLQkJbHBmY19zbGlfcnNwX3BvaW50ZXJzX2Vycm9yKHBoYmEsIHByaW5nKTsKLQkJcmV0dXJuOwotCX0KLQotCXJtYigpOwotCXdoaWxlIChwcmluZy0+cnNwaWR4ICE9IHBvcnRSc3BQdXQpIHsKLQkJZW50cnkgPSBscGZjX3Jlc3BfaW9jYihwaGJhLCBwcmluZyk7Ci0JCWlmICgrK3ByaW5nLT5yc3BpZHggPj0gcG9ydFJzcE1heCkKLQkJCXByaW5nLT5yc3BpZHggPSAwOwotCi0JCWxwZmNfc2xpX3BjaW1lbV9iY29weSgodWludDMyX3QgKikgZW50cnksCi0JCQkJICAgICAgKHVpbnQzMl90ICopICZyc3Bpb2NicS5pb2NiLAotCQkJCSAgICAgIHBoYmEtPmlvY2JfcnNwX3NpemUpOwotCQlpcnNwID0gJnJzcGlvY2JxLmlvY2I7Ci0JCXR5cGUgPSBscGZjX3NsaV9pb2NiX2NtZF90eXBlKGlyc3AtPnVscENvbW1hbmQgJiBDTURfSU9DQl9NQVNLKTsKLQkJcHJpbmctPnN0YXRzLmlvY2JfcnNwKys7Ci0JCXJzcF9jbXBsKys7Ci0KLQkJaWYgKHVubGlrZWx5KGlyc3AtPnVscFN0YXR1cykpIHsKLQkJCS8qIFJzcCByaW5nIDxyaW5nbm8+IGVycm9yOiBJT0NCICovCi0JCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfU0xJLAotCQkJCQkiMDMyNiBSc3AgUmluZyAlZCBlcnJvcjogSU9DQiBEYXRhOiAiCi0JCQkJCSJ4JXggeCV4IHgleCB4JXggeCV4IHgleCB4JXggeCV4XG4iLAotCQkJCQlwcmluZy0+cmluZ25vLAotCQkJCQlpcnNwLT51bi51bHBXb3JkWzBdLAotCQkJCQlpcnNwLT51bi51bHBXb3JkWzFdLAotCQkJCQlpcnNwLT51bi51bHBXb3JkWzJdLAotCQkJCQlpcnNwLT51bi51bHBXb3JkWzNdLAotCQkJCQlpcnNwLT51bi51bHBXb3JkWzRdLAotCQkJCQlpcnNwLT51bi51bHBXb3JkWzVdLAotCQkJCQkqKHVpbnQzMl90ICopJmlyc3AtPnVuMSwKLQkJCQkJKigodWludDMyX3QgKikmaXJzcC0+dW4xICsgMSkpOwotCQl9Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgTFBGQ19BQk9SVF9JT0NCOgotCQljYXNlIExQRkNfU09MX0lPQ0I6Ci0JCQkvKgotCQkJICogSWRsZSBleGNoYW5nZSBjbG9zZWQgdmlhIEFCVFMgZnJvbSBwb3J0LiAgTm8gaW9jYgotCQkJICogcmVzb3VyY2VzIG5lZWQgdG8gYmUgcmVjb3ZlcmVkLgotCQkJICovCi0JCQlpZiAodW5saWtlbHkoaXJzcC0+dWxwQ29tbWFuZCA9PSBDTURfWFJJX0FCT1JURURfQ1gpKSB7Ci0JCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX1NMSSwKLQkJCQkJCSIwMzE0IElPQ0IgY21kIDB4JXggIgotCQkJCQkJInByb2Nlc3NlZC4gU2tpcHBpbmcgIgotCQkJCQkJImNvbXBsZXRpb24iLAotCQkJCQkJaXJzcC0+dWxwQ29tbWFuZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOwotCQkJY21kaW9jYnEgPSBscGZjX3NsaV9pb2NicV9sb29rdXAocGhiYSwgcHJpbmcsCi0JCQkJCQkJICZyc3Bpb2NicSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOwotCQkJaWYgKChjbWRpb2NicSkgJiYgKGNtZGlvY2JxLT5pb2NiX2NtcGwpKSB7Ci0JCQkJKGNtZGlvY2JxLT5pb2NiX2NtcGwpKHBoYmEsIGNtZGlvY2JxLAotCQkJCQkJICAgICAgJnJzcGlvY2JxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGlyc3AtPnVscENvbW1hbmQgPT0gQ01EX0FEQVBURVJfTVNHKSB7Ci0JCQkJY2hhciBhZGFwdGVybXNnW0xQRkNfTUFYX0FEUFRNU0ddOwotCQkJCW1lbXNldChhZGFwdGVybXNnLCAwLCBMUEZDX01BWF9BRFBUTVNHKTsKLQkJCQltZW1jcHkoJmFkYXB0ZXJtc2dbMF0sICh1aW50OF90ICopIGlyc3AsCi0JCQkJICAgICAgIE1BWF9NU0dfREFUQSk7Ci0JCQkJZGV2X3dhcm4oJigocGhiYS0+cGNpZGV2KS0+ZGV2KSwKLQkJCQkJICJscGZjJWQ6ICVzXG4iLAotCQkJCQkgcGhiYS0+YnJkX25vLCBhZGFwdGVybXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogVW5rbm93biBJT0NCIGNvbW1hbmQgKi8KLQkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCi0JCQkJCQkiMDMyMSBVbmtub3duIElPQ0IgY29tbWFuZCAiCi0JCQkJCQkiRGF0YTogeCV4LCB4JXggeCV4IHgleCB4JXhcbiIsCi0JCQkJCQl0eXBlLCBpcnNwLT51bHBDb21tYW5kLAotCQkJCQkJaXJzcC0+dWxwU3RhdHVzLAotCQkJCQkJaXJzcC0+dWxwSW9UYWcsCi0JCQkJCQlpcnNwLT51bHBDb250ZXh0KTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogVGhlIHJlc3BvbnNlIElPQ0IgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgVXBkYXRlIHRoZSByaW5nCi0JCSAqIHBvaW50ZXIgaW4gU0xJTS4gIElmIHRoZSBwb3J0IHJlc3BvbnNlIHB1dCBwb2ludGVyIGhhcyBub3QKLQkJICogYmVlbiB1cGRhdGVkLCBzeW5jIHRoZSBwZ3AtPnJzcFB1dElueCBhbmQgZmV0Y2ggdGhlIG5ldyBwb3J0Ci0JCSAqIHJlc3BvbnNlIHB1dCBwb2ludGVyLgotCQkgKi8KLQkJd3JpdGVsKHByaW5nLT5yc3BpZHgsICZwaGJhLT5ob3N0X2dwW3ByaW5nLT5yaW5nbm9dLnJzcEdldElueCk7Ci0KLQkJaWYgKHByaW5nLT5yc3BpZHggPT0gcG9ydFJzcFB1dCkKLQkJCXBvcnRSc3BQdXQgPSBsZTMyX3RvX2NwdShwZ3AtPnJzcFB1dElueCk7Ci0JfQotCi0JaGFfY29weSA9IHJlYWRsKHBoYmEtPkhBcmVnYWRkcik7Ci0JaGFfY29weSA+Pj0gKExQRkNfRkNQX1JJTkcgKiA0KTsKLQotCWlmICgocnNwX2NtcGwgPiAwKSAmJiAoaGFfY29weSAmIEhBX1IwUkVfUkVRKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKLQkJcHJpbmctPnN0YXRzLmlvY2JfcnNwX2Z1bGwrKzsKLQkJc3RhdHVzID0gKChDQV9SMEFUVCB8IENBX1IwUkVfUlNQKSA8PCAoTFBGQ19GQ1BfUklORyAqIDQpKTsKLQkJd3JpdGVsKHN0YXR1cywgcGhiYS0+Q0FyZWdhZGRyKTsKLQkJcmVhZGwocGhiYS0+Q0FyZWdhZGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKLQl9Ci0JaWYgKChoYV9jb3B5ICYgSEFfUjBDRV9SU1ApICYmCi0JICAgIChwcmluZy0+ZmxhZyAmIExQRkNfQ0FMTF9SSU5HX0FWQUlMQUJMRSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7Ci0JCXByaW5nLT5mbGFnICY9IH5MUEZDX0NBTExfUklOR19BVkFJTEFCTEU7Ci0JCXByaW5nLT5zdGF0cy5pb2NiX2NtZF9lbXB0eSsrOwotCi0JCS8qIEZvcmNlIHVwZGF0ZSBvZiB0aGUgbG9jYWwgY29weSBvZiBjbWRHZXRJbnggKi8KLQkJcHJpbmctPmxvY2FsX2dldGlkeCA9IGxlMzJfdG9fY3B1KHBncC0+Y21kR2V0SW54KTsKLQkJbHBmY19zbGlfcmVzdW1lX2lvY2IocGhiYSwgcHJpbmcpOwotCi0JCWlmICgocHJpbmctPmxwZmNfc2xpX2NtZF9hdmFpbGFibGUpKQotCQkJKHByaW5nLT5scGZjX3NsaV9jbWRfYXZhaWxhYmxlKSAocGhiYSwgcHJpbmcpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7Ci0JfQotCi0JcmV0dXJuOwotfQogCiAvKioKICAqIGxwZmNfc2xpX2hhbmRsZV9mYXN0X3JpbmdfZXZlbnQgLSBIYW5kbGUgcmluZyBldmVudHMgb24gRkNQIHJpbmcKQEAgLTI1MDIsOSArMjM1MCw5IEBACiAgKiBhbiBhYm9ydCBjb21wbGV0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBjYWxsIGxwZmNfc2xpX3Byb2Nlc3NfdW5zb2xfaW9jYgogICogZnVuY3Rpb24gaWYgdGhpcyBpcyBhbiB1bnNvbGljaXRlZCBpb2NiLgogICogVGhpcyByb3V0aW5lIHByZXN1bWVzIExQRkNfRkNQX1JJTkcgaGFuZGxpbmcgYW5kIGRvZXNuJ3QgYm90aGVyCi0gKiB0byBjaGVjayBpdCBleHBsaWNpdGx5LiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIDEuCi0gKiovCi1zdGF0aWMgaW50CisgKiB0byBjaGVjayBpdCBleHBsaWNpdGx5LgorICovCitpbnQKIGxwZmNfc2xpX2hhbmRsZV9mYXN0X3JpbmdfZXZlbnQoc3RydWN0IGxwZmNfaGJhICpwaGJhLAogCQkJCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZywgdWludDMyX3QgbWFzaykKIHsKQEAgLTI1MzQsNiArMjM4MiwxMSBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJCXJldHVybiAxOwogCX0KKwlpZiAocGhiYS0+ZmNwX3JpbmdfaW5fdXNlKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJCXBoYmEtPmZjcF9yaW5nX2luX3VzZSA9IDE7CiAKIAlybWIoKTsKIAl3aGlsZSAocHJpbmctPnJzcGlkeCAhPSBwb3J0UnNwUHV0KSB7CkBAIC0yNjA0LDEwICsyNDU3LDYgQEAKIAkJCWNtZGlvY2JxID0gbHBmY19zbGlfaW9jYnFfbG9va3VwKHBoYmEsIHByaW5nLAogCQkJCQkJCSAmcnNwaW9jYnEpOwogCQkJaWYgKChjbWRpb2NicSkgJiYgKGNtZGlvY2JxLT5pb2NiX2NtcGwpKSB7Ci0JCQkJaWYgKHBoYmEtPmNmZ19wb2xsICYgRU5BQkxFX0ZDUF9SSU5HX1BPTExJTkcpIHsKLQkJCQkJKGNtZGlvY2JxLT5pb2NiX2NtcGwpKHBoYmEsIGNtZGlvY2JxLAotCQkJCQkJCSAgICAgICZyc3Bpb2NicSk7Ci0JCQkJfSBlbHNlIHsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywKIAkJCQkJCQkgICAgICAgaWZsYWcpOwogCQkJCQkoY21kaW9jYnEtPmlvY2JfY21wbCkocGhiYSwgY21kaW9jYnEsCkBAIC0yNjE1LDcgKzI0NjQsNiBAQAogCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywKIAkJCQkJCQkgIGlmbGFnKTsKIAkJCQl9Ci0JCQl9CiAJCQlicmVhazsKIAkJY2FzZSBMUEZDX1VOU09MX0lPQ0I6CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CkBAIC0yNjc1LDYgKzI1MjMsNyBAQAogCiAJfQogCisJcGhiYS0+ZmNwX3JpbmdfaW5fdXNlID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMzAxOCwxNiArMjg2NywzOSBAQAogCQkJCSAgIHN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZywgdWludDMyX3QgbWFzaykKIHsKIAlzdHJ1Y3QgbHBmY19pb2NicSAqaXJzcGlvY2JxOworCXN0cnVjdCBoYnFfZG1hYnVmICpkbWFidWY7CisJc3RydWN0IGxwZmNfY3FfZXZlbnQgKmNxX2V2ZW50OwogCXVuc2lnbmVkIGxvbmcgaWZsYWc7CiAKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnBoYmEtPnNsaTRfaGJhLnNwX3JzcGlvY2Jfd29ya19xdWV1ZSkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOworCXBoYmEtPmhiYV9mbGFnICY9IH5IQkFfU1BfUVVFVUVfRVZUOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnBoYmEtPnNsaTRfaGJhLnNwX3F1ZXVlX2V2ZW50KSkgewogCQkvKiBHZXQgdGhlIHJlc3BvbnNlIGlvY2IgZnJvbSB0aGUgaGVhZCBvZiB3b3JrIHF1ZXVlICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7Ci0JCWxpc3RfcmVtb3ZlX2hlYWQoJnBoYmEtPnNsaTRfaGJhLnNwX3JzcGlvY2Jfd29ya19xdWV1ZSwKLQkJCQkgaXJzcGlvY2JxLCBzdHJ1Y3QgbHBmY19pb2NicSwgbGlzdCk7CisJCWxpc3RfcmVtb3ZlX2hlYWQoJnBoYmEtPnNsaTRfaGJhLnNwX3F1ZXVlX2V2ZW50LAorCQkJCSBjcV9ldmVudCwgc3RydWN0IGxwZmNfY3FfZXZlbnQsIGxpc3QpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7Ci0JCS8qIFByb2Nlc3MgdGhlIHJlc3BvbnNlIGlvY2IgKi8KLQkJbHBmY19zbGlfc3BfaGFuZGxlX3JzcGlvY2IocGhiYSwgcHJpbmcsIGlyc3Bpb2NicSk7CisKKwkJc3dpdGNoIChiZl9nZXQobHBmY193Y3FlX2NfY29kZSwgJmNxX2V2ZW50LT5jcWUud2NxZV9jbXBsKSkgeworCQljYXNlIENRRV9DT0RFX0NPTVBMX1dRRToKKwkJCWlyc3Bpb2NicSA9IGNvbnRhaW5lcl9vZihjcV9ldmVudCwgc3RydWN0IGxwZmNfaW9jYnEsCisJCQkJCQkgY3FfZXZlbnQpOworCQkJLyogVHJhbnNsYXRlIEVMUyBXQ1FFIHRvIHJlc3BvbnNlIElPQ0JRICovCisJCQlpcnNwaW9jYnEgPSBscGZjX3NsaTRfZWxzX3djcWVfdG9fcnNwaW9jYnEocGhiYSwKKwkJCQkJCQkJICAgaXJzcGlvY2JxKTsKKwkJCWlmIChpcnNwaW9jYnEpCisJCQkJbHBmY19zbGlfc3BfaGFuZGxlX3JzcGlvY2IocGhiYSwgcHJpbmcsCisJCQkJCQkJICAgaXJzcGlvY2JxKTsKKwkJCWJyZWFrOworCQljYXNlIENRRV9DT0RFX1JFQ0VJVkU6CisJCQlkbWFidWYgPSBjb250YWluZXJfb2YoY3FfZXZlbnQsIHN0cnVjdCBoYnFfZG1hYnVmLAorCQkJCQkgICAgICBjcV9ldmVudCk7CisJCQlscGZjX3NsaTRfaGFuZGxlX3JlY2VpdmVkX2J1ZmZlcihwaGJhLCBkbWFidWYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KIH0KIApAQCAtMzQxNiw2ICszMjg4LDcgQEAKIAogCS8qIHBlcmZvcm0gYm9hcmQgcmVzZXQgKi8KIAlwaGJhLT5mY19ldmVudFRhZyA9IDA7CisJcGhiYS0+bGlua19ldmVudHMgPSAwOwogCXBoYmEtPnBwb3J0LT5mY19teURJRCA9IDA7CiAJcGhiYS0+cHBvcnQtPmZjX3ByZXZESUQgPSAwOwogCkBAIC0zNDc2LDYgKzMzNDksNyBAQAogCiAJLyogcGVyZm9ybSBib2FyZCByZXNldCAqLwogCXBoYmEtPmZjX2V2ZW50VGFnID0gMDsKKwlwaGJhLT5saW5rX2V2ZW50cyA9IDA7CiAJcGhiYS0+cHBvcnQtPmZjX215RElEID0gMDsKIAlwaGJhLT5wcG9ydC0+ZmNfcHJldkRJRCA9IDA7CiAKQEAgLTM0OTUsNyArMzM2OSw2IEBACiAJbGlzdF9kZWxfaW5pdCgmcGhiYS0+c2xpNF9oYmEuZGF0X3JxLT5saXN0KTsKIAlsaXN0X2RlbF9pbml0KCZwaGJhLT5zbGk0X2hiYS5tYnhfY3EtPmxpc3QpOwogCWxpc3RfZGVsX2luaXQoJnBoYmEtPnNsaTRfaGJhLmVsc19jcS0+bGlzdCk7Ci0JbGlzdF9kZWxfaW5pdCgmcGhiYS0+c2xpNF9oYmEucnhxX2NxLT5saXN0KTsKIAlmb3IgKHFpbmR4ID0gMDsgcWluZHggPCBwaGJhLT5jZmdfZmNwX3dxX2NvdW50OyBxaW5keCsrKQogCQlsaXN0X2RlbF9pbml0KCZwaGJhLT5zbGk0X2hiYS5mY3Bfd3FbcWluZHhdLT5saXN0KTsKIAlmb3IgKHFpbmR4ID0gMDsgcWluZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50OyBxaW5keCsrKQpAQCAtMzUzMSw5ICszNDA0LDEzIEBACiAJc3RydWN0IGxwZmNfc2xpICpwc2xpOwogCXZvbGF0aWxlIHVpbnQzMl90IHdvcmQwOwogCXZvaWQgX19pb21lbSAqdG9fc2xpbTsKKwl1aW50MzJfdCBoYmFfYWVyX2VuYWJsZWQ7CiAKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAorCS8qIFRha2UgUENJZSBkZXZpY2UgQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIChBRVIpIHN0YXRlICovCisJaGJhX2Flcl9lbmFibGVkID0gcGhiYS0+aGJhX2ZsYWcgJiBIQkFfQUVSX0VOQUJMRUQ7CisKIAlwc2xpID0gJnBoYmEtPnNsaTsKIAogCS8qIFJlc3RhcnQgSEJBICovCkBAIC0zNTczLDYgKzM0NTAsMTAgQEAKIAkvKiBHaXZlIHRoZSBJTklURkYgYW5kIFBvc3QgdGltZSB0byBzZXR0bGUuICovCiAJbWRlbGF5KDEwMCk7CiAKKwkvKiBSZXNldCBIQkEgQUVSIGlmIGl0IHdhcyBlbmFibGVkLCBub3RlIGhiYV9mbGFnIHdhcyByZXNldCBhYm92ZSAqLworCWlmIChoYmFfYWVyX2VuYWJsZWQpCisJCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBoYmEtPnBjaWRldik7CisKIAlscGZjX2hiYV9kb3duX3Bvc3QocGhiYSk7CiAKIAlyZXR1cm4gMDsKQEAgLTQwNDIsNiArMzkyMywyNCBAQAogCWlmIChyYykKIAkJZ290byBscGZjX3NsaV9oYmFfc2V0dXBfZXJyb3I7CiAKKwkvKiBFbmFibGUgUENJZSBkZXZpY2UgQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIChBRVIpIGlmIGNvbmZpZ3VyZWQgKi8KKwlpZiAocGhiYS0+Y2ZnX2Flcl9zdXBwb3J0ID09IDEgJiYgIShwaGJhLT5oYmFfZmxhZyAmIEhCQV9BRVJfRU5BQkxFRCkpIHsKKwkJcmMgPSBwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBoYmEtPnBjaWRldik7CisJCWlmICghcmMpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJCQkiMjcwOSBUaGlzIGRldmljZSBzdXBwb3J0cyAiCisJCQkJCSJBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgKEFFUilcbiIpOworCQkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQlwaGJhLT5oYmFfZmxhZyB8PSBIQkFfQUVSX0VOQUJMRUQ7CisJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQl9IGVsc2UgeworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCisJCQkJCSIyNzA4IFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgIgorCQkJCQkiQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIChBRVIpXG4iKTsKKwkJCXBoYmEtPmNmZ19hZXJfc3VwcG9ydCA9IDA7CisJCX0KKwl9CisKIAlpZiAocGhiYS0+c2xpX3JldiA9PSAzKSB7CiAJCXBoYmEtPmlvY2JfY21kX3NpemUgPSBTTEkzX0lPQ0JfQ01EX1NJWkU7CiAJCXBoYmEtPmlvY2JfcnNwX3NpemUgPSBTTEkzX0lPQ0JfUlNQX1NJWkU7CkBAIC00MTYzLDcgKzQwNjIsNyBAQAogICogYWRkaXRpb24sIHRoaXMgcm91dGluZSBnZXRzIHRoZSBwb3J0IHZwZCBkYXRhLgogICoKICAqIFJldHVybiBjb2RlcwotICogCTAgLSBzdWNlc3NmdWwKKyAqIAkwIC0gc3VjY2Vzc2Z1bAogICogCUVOT01FTSAtIGNvdWxkIG5vdCBhbGxvY2F0ZWQgbWVtb3J5LgogICoqLwogc3RhdGljIGludApAQCAtNDI0Myw3ICs0MTQyLDYgQEAKIAogCWxwZmNfc2xpNF9jcV9yZWxlYXNlKHBoYmEtPnNsaTRfaGJhLm1ieF9jcSwgTFBGQ19RVUVVRV9SRUFSTSk7CiAJbHBmY19zbGk0X2NxX3JlbGVhc2UocGhiYS0+c2xpNF9oYmEuZWxzX2NxLCBMUEZDX1FVRVVFX1JFQVJNKTsKLQlscGZjX3NsaTRfY3FfcmVsZWFzZShwaGJhLT5zbGk0X2hiYS5yeHFfY3EsIExQRkNfUVVFVUVfUkVBUk0pOwogCWZvciAoZmNwX2VxaWR4ID0gMDsgZmNwX2VxaWR4IDwgcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudDsgZmNwX2VxaWR4KyspCiAJCWxwZmNfc2xpNF9jcV9yZWxlYXNlKHBoYmEtPnNsaTRfaGJhLmZjcF9jcVtmY3BfZXFpZHhdLAogCQkJCSAgICAgTFBGQ19RVUVVRV9SRUFSTSk7CkBAIC00MzIyLDYgKzQyMjAsMTMgQEAKIAlwaGJhLT5zbGlfcmV2ID0gYmZfZ2V0KGxwZmNfbWJ4X3JkX3Jldl9zbGlfbHZsLCAmbXFlLT51bi5yZWFkX3Jldik7CiAJaWYgKGJmX2dldChscGZjX21ieF9yZF9yZXZfZmNvZSwgJm1xZS0+dW4ucmVhZF9yZXYpKQogCQlwaGJhLT5oYmFfZmxhZyB8PSBIQkFfRkNPRV9TVVBQT1JUOworCisJaWYgKGJmX2dldChscGZjX21ieF9yZF9yZXZfY2VlX3ZlciwgJm1xZS0+dW4ucmVhZF9yZXYpID09CisJCUxQRkNfRENCWF9DRUVfTU9ERSkKKwkJcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX0ZJUF9TVVBQT1JUOworCWVsc2UKKwkJcGhiYS0+aGJhX2ZsYWcgJj0gfkhCQV9GSVBfU1VQUE9SVDsKKwogCWlmIChwaGJhLT5zbGlfcmV2ICE9IExQRkNfU0xJX1JFVjQgfHwKIAkgICAgIShwaGJhLT5oYmFfZmxhZyAmIEhCQV9GQ09FX1NVUFBPUlQpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLApAQCAtNDQ2OCw3ICs0MzczLDggQEAKIAlyYyA9IGxwZmNfc2xpNF9wb3N0X3NnbF9saXN0KHBoYmEpOwogCWlmICh1bmxpa2VseShyYykpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTUJPWCB8IExPR19TTEksCi0JCQkJIjA1ODIgRXJyb3IgJWQgZHVyaW5nIHNnbCBwb3N0IG9wZXJhdGlvbiIsIHJjKTsKKwkJCQkiMDU4MiBFcnJvciAlZCBkdXJpbmcgc2dsIHBvc3Qgb3BlcmF0aW9uXG4iLAorCQkJCQlyYyk7CiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBvdXRfZnJlZV92cGQ7CiAJfQpAQCAtNDQ3Nyw4ICs0MzgzLDggQEAKIAlyYyA9IGxwZmNfc2xpNF9yZXBvc3Rfc2NzaV9zZ2xfbGlzdChwaGJhKTsKIAlpZiAodW5saWtlbHkocmMpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19NQk9YIHwgTE9HX1NMSSwKLQkJCQkiMDM4MyBFcnJvciAlZCBkdXJpbmcgc2NzaSBzZ2wgcG9zdCBvcGVhdGlvbiIsCi0JCQkJcmMpOworCQkJCSIwMzgzIEVycm9yICVkIGR1cmluZyBzY3NpIHNnbCBwb3N0ICIKKwkJCQkib3BlcmF0aW9uXG4iLCByYyk7CiAJCS8qIFNvbWUgU2NzaSBidWZmZXJzIHdlcmUgbW92ZWQgdG8gdGhlIGFib3J0IHNjc2kgbGlzdCAqLwogCQkvKiBBIHBjaSBmdW5jdGlvbiByZXNldCB3aWxsIHJlcG9zdCB0aGVtICovCiAJCXJjID0gLUVOT0RFVjsKQEAgLTQ0OTQsMTAgKzQ0MDAsNiBAQAogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0X2ZyZWVfdnBkOwogCX0KLQlpZiAocGhiYS0+Y2ZnX2VuYWJsZV9maXApCi0JCWJmX3NldChscGZjX2ZpcF9mbGFnLCAmcGhiYS0+c2xpNF9oYmEuc2xpNF9mbGFncywgMSk7Ci0JZWxzZQotCQliZl9zZXQobHBmY19maXBfZmxhZywgJnBoYmEtPnNsaTRfaGJhLnNsaTRfZmxhZ3MsIDApOwogCiAJLyogU2V0IHVwIGFsbCB0aGUgcXVldWVzIHRvIHRoZSBkZXZpY2UgKi8KIAlyYyA9IGxwZmNfc2xpNF9xdWV1ZV9zZXR1cChwaGJhKTsKQEAgLTU2NjksNyArNTU3MSw3IEBACiAJCWNhc2UgQ01EX0dFTl9SRVFVRVNUNjRfQ1g6CiAJCQlpZiAoIShwaGJhLT5zbGkuc2xpX2ZsYWcgJiBMUEZDX01FTkxPX01BSU5UKSB8fAogCQkJCShwaW9jYi0+aW9jYi51bi5nZW5yZXE2NC53NS5oY3N3LlJjdGwgIT0KLQkJCQkJRkNfRkNQX0NNTkQpIHx8CisJCQkJCUZDX1JDVExfRERfVU5TT0xfQ01EKSB8fAogCQkJCShwaW9jYi0+aW9jYi51bi5nZW5yZXE2NC53NS5oY3N3LlR5cGUgIT0KIAkJCQkJTUVOTE9fVFJBTlNQT1JUX1RZUEUpKQogCkBAIC01ODQ5LDcgKzU3NTEsNyBAQAogbHBmY19zbGk0X2lvY2Iyd3FlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfaW9jYnEgKmlvY2JxLAogCQl1bmlvbiBscGZjX3dxZSAqd3FlKQogewotCXVpbnQzMl90IHBheWxvYWRfbGVuID0gMDsKKwl1aW50MzJfdCB4bWl0X2xlbiA9IDAsIHRvdGFsX2xlbiA9IDA7CiAJdWludDhfdCBjdCA9IDA7CiAJdWludDMyX3QgZmlwOwogCXVpbnQzMl90IGFib3J0X3RhZzsKQEAgLTU4NTcsMTIgKzU3NTksMTUgQEAKIAl1aW50OF90IGNtbmQ7CiAJdWludDE2X3QgeHJpdGFnOwogCXN0cnVjdCB1bHBfYmRlNjQgKmJwbCA9IE5VTEw7CisJdWludDMyX3QgZWxzX2lkID0gRUxTX0lEX0RFRkFVTFQ7CisJaW50IG51bUJkZXMsIGk7CisJc3RydWN0IHVscF9iZGU2NCBiZGU7CiAKLQlmaXAgPSBiZl9nZXQobHBmY19maXBfZmxhZywgJnBoYmEtPnNsaTRfaGJhLnNsaTRfZmxhZ3MpOworCWZpcCA9IHBoYmEtPmhiYV9mbGFnICYgSEJBX0ZJUF9TVVBQT1JUOwogCS8qIFRoZSBmY3AgY29tbWFuZHMgd2lsbCBzZXQgY29tbWFuZCB0eXBlICovCiAJaWYgKGlvY2JxLT5pb2NiX2ZsYWcgJiAgTFBGQ19JT19GQ1ApCiAJCWNvbW1hbmRfdHlwZSA9IEZDUF9DT01NQU5EOwotCWVsc2UgaWYgKGZpcCAmJiAoaW9jYnEtPmlvY2JfZmxhZyAmIExQRkNfRklQX0VMUykpCisJZWxzZSBpZiAoZmlwICYmIChpb2NicS0+aW9jYl9mbGFnICYgTFBGQ19GSVBfRUxTX0lEX01BU0spKQogCQljb21tYW5kX3R5cGUgPSBFTFNfQ09NTUFORF9GSVA7CiAJZWxzZQogCQljb21tYW5kX3R5cGUgPSBFTFNfQ09NTUFORF9OT05fRklQOwpAQCAtNTg3NCw2ICs1Nzc5LDggQEAKIAl3cWUtPndvcmRzWzddID0gMDsgLyogVGhlIGN0IGZpZWxkIGhhcyBtb3ZlZCBzbyByZXNldCAqLwogCS8qIHdvcmRzMC0yIGJwbCBjb252ZXJ0IGJkZSAqLwogCWlmIChpb2NicS0+aW9jYi51bi5nZW5yZXE2NC5iZGwuYmRlRmxhZ3MgPT0gQlVGRl9UWVBFX0JMUF82NCkgeworCQludW1CZGVzID0gaW9jYnEtPmlvY2IudW4uZ2VucmVxNjQuYmRsLmJkZVNpemUgLworCQkJCXNpemVvZihzdHJ1Y3QgdWxwX2JkZTY0KTsKIAkJYnBsICA9IChzdHJ1Y3QgdWxwX2JkZTY0ICopCiAJCQkoKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKWlvY2JxLT5jb250ZXh0MyktPnZpcnQ7CiAJCWlmICghYnBsKQpAQCAtNTg4Niw5ICs1NzkzLDE0IEBACiAJCSAqIGNhbiBhc3NpZ24gaXQgdG8gdGhlIHNnbC4KIAkJICovCiAJCXdxZS0+Z2VuZXJpYy5iZGUudHVzLncgID0gbGUzMl90b19jcHUoYnBsLT50dXMudyk7Ci0JCXBheWxvYWRfbGVuID0gd3FlLT5nZW5lcmljLmJkZS50dXMuZi5iZGVTaXplOworCQl4bWl0X2xlbiA9IHdxZS0+Z2VuZXJpYy5iZGUudHVzLmYuYmRlU2l6ZTsKKwkJdG90YWxfbGVuID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG51bUJkZXM7IGkrKykgeworCQkJYmRlLnR1cy53ICA9IGxlMzJfdG9fY3B1KGJwbFtpXS50dXMudyk7CisJCQl0b3RhbF9sZW4gKz0gYmRlLnR1cy5mLmJkZVNpemU7CisJCX0KIAl9IGVsc2UKLQkJcGF5bG9hZF9sZW4gPSBpb2NicS0+aW9jYi51bi5mY3BpNjQuYmRsLmJkZVNpemU7CisJCXhtaXRfbGVuID0gaW9jYnEtPmlvY2IudW4uZmNwaTY0LmJkbC5iZGVTaXplOwogCiAJaW9jYnEtPmlvY2IudWxwSW9UYWcgPSBpb2NicS0+aW90YWc7CiAJY21uZCA9IGlvY2JxLT5pb2NiLnVscENvbW1hbmQ7CkBAIC01OTAyLDcgKzU4MTQsNyBAQAogCQkJCWlvY2JxLT5pb2NiLnVscENvbW1hbmQpOwogCQkJcmV0dXJuIElPQ0JfRVJST1I7CiAJCX0KLQkJd3FlLT5lbHNfcmVxLnBheWxvYWRfbGVuID0gcGF5bG9hZF9sZW47CisJCXdxZS0+ZWxzX3JlcS5wYXlsb2FkX2xlbiA9IHhtaXRfbGVuOwogCQkvKiBFbHNfcmVndWVzdDY0IGhhcyBhIFRNTyAqLwogCQliZl9zZXQod3FlX3RtbywgJndxZS0+ZWxzX3JlcS53cWVfY29tLAogCQkJaW9jYnEtPmlvY2IudWxwVGltZW91dCk7CkBAIC01OTIzLDcgKzU4MzUsMjMgQEAKIAkJYmZfc2V0KGxwZmNfd3FlX2dlbl9jdCwgJndxZS0+Z2VuZXJpYywgY3QpOwogCQliZl9zZXQobHBmY193cWVfZ2VuX3B1LCAmd3FlLT5nZW5lcmljLCAwKTsKIAkJLyogQ0NQIENDUEUgUFYgUFJJIGluIHdvcmQxMCB3ZXJlIHNldCBpbiB0aGUgbWVtY3B5ICovCisKKwkJaWYgKGNvbW1hbmRfdHlwZSA9PSBFTFNfQ09NTUFORF9GSVApIHsKKwkJCWVsc19pZCA9ICgoaW9jYnEtPmlvY2JfZmxhZyAmIExQRkNfRklQX0VMU19JRF9NQVNLKQorCQkJCQk+PiBMUEZDX0ZJUF9FTFNfSURfU0hJRlQpOworCQl9CisJCWJmX3NldChscGZjX3dxZV9nZW5fZWxzX2lkLCAmd3FlLT5nZW5lcmljLCBlbHNfaWQpOworCiAJYnJlYWs7CisJY2FzZSBDTURfWE1JVF9TRVFVRU5DRTY0X0NYOgorCQliZl9zZXQobHBmY193cWVfZ2VuX2NvbnRleHQsICZ3cWUtPmdlbmVyaWMsCisJCQkJCWlvY2JxLT5pb2NiLnVuLnVscFdvcmRbM10pOworCQl3cWUtPmdlbmVyaWMud29yZDMgPSAwOworCQliZl9zZXQod3FlX3Jjdm94aWQsICZ3cWUtPmdlbmVyaWMsIGlvY2JxLT5pb2NiLnVscENvbnRleHQpOworCQliZl9zZXQod3FlX3hjLCAmd3FlLT5nZW5lcmljLCAxKTsKKwkJLyogVGhlIGVudGlyZSBzZXF1ZW5jZSBpcyB0cmFuc21pdHRlZCBmb3IgdGhpcyBJT0NCICovCisJCXhtaXRfbGVuID0gdG90YWxfbGVuOworCQljbW5kID0gQ01EX1hNSVRfU0VRVUVOQ0U2NF9DUjsKIAljYXNlIENNRF9YTUlUX1NFUVVFTkNFNjRfQ1I6CiAJCS8qIHdvcmQzIGlvY2I9aW9fdGFnMzIgd3FlPXBheWxvYWRfb2Zmc2V0ICovCiAJCS8qIHBheWxvYWQgb2Zmc2V0IHVzZWQgZm9yIG11bHRpbHBlIG91dHN0YW5kaW5nCkBAIC01OTMzLDcgKzU4NjEsOCBAQAogCQkvKiB3b3JkNCByZWxhdGl2ZV9vZmZzZXQgbWVtY3B5ICovCiAJCS8qIHdvcmQ1IHJfY3RsL2RmX2N0bCBtZW1jcHkgKi8KIAkJYmZfc2V0KGxwZmNfd3FlX2dlbl9wdSwgJndxZS0+Z2VuZXJpYywgMCk7Ci0JCXdxZS0+eG1pdF9zZXF1ZW5jZS54bWl0X2xlbiA9IHBheWxvYWRfbGVuOworCQl3cWUtPnhtaXRfc2VxdWVuY2UueG1pdF9sZW4gPSB4bWl0X2xlbjsKKwkJY29tbWFuZF90eXBlID0gT1RIRVJfQ09NTUFORDsKIAlicmVhazsKIAljYXNlIENNRF9YTUlUX0JDQVNUNjRfQ046CiAJCS8qIHdvcmQzIGlvY2I9aW90YWczMiB3cWU9cGF5bG9hZF9sZW4gKi8KQEAgLTU5NjIsNyArNTg5MSw3IEBACiAJY2FzZSBDTURfRkNQX0lSRUFENjRfQ1I6CiAJCS8qIEZDUF9DTUQgaXMgYWx3YXlzIHRoZSAxc3Qgc2dsIGVudHJ5ICovCiAJCXdxZS0+ZmNwX2lyZWFkLnBheWxvYWRfbGVuID0KLQkJCXBheWxvYWRfbGVuICsgc2l6ZW9mKHN0cnVjdCBmY3BfcnNwKTsKKwkJCXhtaXRfbGVuICsgc2l6ZW9mKHN0cnVjdCBmY3BfcnNwKTsKIAogCQkvKiB3b3JkIDQgKHhmZXIgbGVuZ3RoKSBzaG91bGQgaGF2ZSBiZWVuIHNldCBvbiB0aGUgbWVtY3B5ICovCiAKQEAgLTU5OTksNyArNTkyOCw3IEBACiAJCSAqIHNnbFsxXSA9IHJzcC4KIAkJICoKIAkJICovCi0JCXdxZS0+Z2VuX3JlcS5jb21tYW5kX2xlbiA9IHBheWxvYWRfbGVuOworCQl3cWUtPmdlbl9yZXEuY29tbWFuZF9sZW4gPSB4bWl0X2xlbjsKIAkJLyogV29yZDQgcGFyYW1ldGVyICBjb3BpZWQgaW4gdGhlIG1lbWNweSAqLwogCQkvKiBXb3JkNSBbcmN0bCwgdHlwZSwgZGZfY3RsLCBsYV0gY29waWVkIGluIG1lbWNweSAqLwogCQkvKiB3b3JkNiBjb250ZXh0IHRhZyBjb3BpZWQgaW4gbWVtY3B5ICovCkBAIC02MDY2LDYgKzU5OTUsMzggQEAKIAkJY29tbWFuZF90eXBlID0gT1RIRVJfQ09NTUFORDsKIAkJeHJpdGFnID0gMDsKIAlicmVhazsKKwljYXNlIENNRF9YTUlUX0JMU19SU1A2NF9DWDoKKwkJLyogQXMgQkxTIEFCVFMtQUNDIFdRRSBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIG90aGVyIFdRRXMsCisJCSAqIHdlIHJlLWNvbnN0cnVjdCB0aGlzIFdRRSBoZXJlIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluCisJCSAqIGlvY2JxIGZyb20gc2NyYXRjaC4KKwkJICovCisJCW1lbXNldCh3cWUsIDAsIHNpemVvZih1bmlvbiBscGZjX3dxZSkpOworCQkvKiBPWF9JRCBpcyBpbnZhcmlhYmxlIHRvIHdobyBzZW50IEFCVFMgdG8gQ1QgZXhjaGFuZ2UgKi8KKwkJYmZfc2V0KHhtaXRfYmxzX3JzcDY0X294aWQsICZ3cWUtPnhtaXRfYmxzX3JzcCwKKwkJICAgICAgIGJmX2dldChscGZjX2FidHNfb3hpZCwgJmlvY2JxLT5pb2NiLnVuLmJsc19hY2MpKTsKKwkJaWYgKGJmX2dldChscGZjX2FidHNfb3JpZywgJmlvY2JxLT5pb2NiLnVuLmJsc19hY2MpID09CisJCSAgICBMUEZDX0FCVFNfVU5TT0xfSU5UKSB7CisJCQkvKiBBQlRTIHNlbnQgYnkgaW5pdGlhdG9yIHRvIENUIGV4Y2hhbmdlLCB0aGUKKwkJCSAqIFJYX0lEIGZpZWxkIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG5ld2x5CisJCQkgKiBhbGxvY2F0ZWQgcmVzcG9uZGVyIFhSSS4KKwkJCSAqLworCQkJYmZfc2V0KHhtaXRfYmxzX3JzcDY0X3J4aWQsICZ3cWUtPnhtaXRfYmxzX3JzcCwKKwkJCSAgICAgICBpb2NicS0+c2xpNF94cml0YWcpOworCQl9IGVsc2UgeworCQkJLyogQUJUUyBzZW50IGJ5IHJlc3BvbmRlciB0byBDVCBleGNoYW5nZSwgdGhlCisJCQkgKiBSWF9JRCBmaWVsZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSByZXNwb25kZXIKKwkJCSAqIFJYX0lEIGZyb20gQUJUUy4KKwkJCSAqLworCQkJYmZfc2V0KHhtaXRfYmxzX3JzcDY0X3J4aWQsICZ3cWUtPnhtaXRfYmxzX3JzcCwKKwkJCSAgICAgICBiZl9nZXQobHBmY19hYnRzX3J4aWQsICZpb2NicS0+aW9jYi51bi5ibHNfYWNjKSk7CisJCX0KKwkJYmZfc2V0KHhtaXRfYmxzX3JzcDY0X3NlcWNudGhpLCAmd3FlLT54bWl0X2Jsc19yc3AsIDB4ZmZmZik7CisJCWJmX3NldCh3cWVfeG1pdF9ibHNfcHQsICZ3cWUtPnhtaXRfYmxzX3JzcC53cWVfZGVzdCwgMHgxKTsKKwkJYmZfc2V0KHdxZV9jdHh0X3RhZywgJndxZS0+eG1pdF9ibHNfcnNwLndxZV9jb20sCisJCSAgICAgICBpb2NicS0+aW9jYi51bHBDb250ZXh0KTsKKwkJLyogT3ZlcndyaXRlIHRoZSBwcmUtc2V0IGNvbW5kIHR5cGUgd2l0aCBPVEhFUl9DT01NQU5EICovCisJCWNvbW1hbmRfdHlwZSA9IE9USEVSX0NPTU1BTkQ7CisJYnJlYWs7CiAJY2FzZSBDTURfWFJJX0FCT1JURURfQ1g6CiAJY2FzZSBDTURfQ1JFQVRFX1hSSV9DUjogLyogRG8gd2UgZXhwZWN0IHRvIHVzZSB0aGlzPyAqLwogCQkvKiB3b3JkczAtMiBhcmUgYWxsIDAncyBubyBiZGUgKi8KQEAgLTYxMjAsMTEgKzYwODEsMTAgQEAKIAl1aW50MTZfdCB4cml0YWc7CiAJdW5pb24gbHBmY193cWUgd3FlOwogCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tyaW5nX251bWJlcl07Ci0JdWludDMyX3QgZmNwX3dxaWR4OwogCiAJaWYgKHBpb2NiLT5zbGk0X3hyaXRhZyA9PSBOT19YUkkpIHsKIAkJaWYgKHBpb2NiLT5pb2NiLnVscENvbW1hbmQgPT0gQ01EX0FCT1JUX1hSSV9DTiB8fAotCQkJcGlvY2ItPmlvY2IudWxwQ29tbWFuZCA9PSBDTURfQ0xPU0VfWFJJX0NOKQorCQkgICAgcGlvY2ItPmlvY2IudWxwQ29tbWFuZCA9PSBDTURfQ0xPU0VfWFJJX0NOKQogCQkJc2dscSA9IE5VTEw7CiAJCWVsc2UgewogCQkJc2dscSA9IF9fbHBmY19zbGlfZ2V0X3NnbHEocGhiYSk7CkBAIC02MTU1LDggKzYxMTUsMTcgQEAKIAkJcmV0dXJuIElPQ0JfRVJST1I7CiAKIAlpZiAocGlvY2ItPmlvY2JfZmxhZyAmICBMUEZDX0lPX0ZDUCkgewotCQlmY3Bfd3FpZHggPSBscGZjX3NsaTRfc2NtZF90b193cWlkeF9kaXN0cihwaGJhKTsKLQkJaWYgKGxwZmNfc2xpNF93cV9wdXQocGhiYS0+c2xpNF9oYmEuZmNwX3dxW2ZjcF93cWlkeF0sICZ3cWUpKQorCQkvKgorCQkgKiBGb3IgRkNQIGNvbW1hbmQgSU9DQiwgZ2V0IGEgbmV3IFdRIGluZGV4IHRvIGRpc3RyaWJ1dGUKKwkJICogV1FFIGFjcm9zcyB0aGUgV1Fzci4gT24gdGhlIG90aGVyIGhhbmQsIGZvciBhYm9ydCBJT0NCLAorCQkgKiBpdCBjYXJyaWVzIHRoZSBzYW1lIFdRIGluZGV4IHRvIHRoZSBvcmlnaW5hbCBjb21tYW5kCisJCSAqIElPQ0IuCisJCSAqLworCQlpZiAoKHBpb2NiLT5pb2NiLnVscENvbW1hbmQgIT0gQ01EX0FCT1JUX1hSSV9DTikgJiYKKwkJICAgIChwaW9jYi0+aW9jYi51bHBDb21tYW5kICE9IENNRF9DTE9TRV9YUklfQ04pKQorCQkJcGlvY2ItPmZjcF93cWlkeCA9IGxwZmNfc2xpNF9zY21kX3RvX3dxaWR4X2Rpc3RyKHBoYmEpOworCQlpZiAobHBmY19zbGk0X3dxX3B1dChwaGJhLT5zbGk0X2hiYS5mY3Bfd3FbcGlvY2ItPmZjcF93cWlkeF0sCisJCQkJICAgICAmd3FlKSkKIAkJCXJldHVybiBJT0NCX0VSUk9SOwogCX0gZWxzZSB7CiAJCWlmIChscGZjX3NsaTRfd3FfcHV0KHBoYmEtPnNsaTRfaGJhLmVsc193cSwgJndxZSkpCkBAIC02NDQ5LDMxICs2NDE4LDM3IEBACiAJCQlwcmluZy0+aW90YWdfbWF4ID0gNDA5NjsKIAkJCXByaW5nLT5scGZjX3NsaV9yY3ZfYXN5bmNfc3RhdHVzID0KIAkJCQlscGZjX3NsaV9hc3luY19ldmVudF9oYW5kbGVyOwotCQkJcHJpbmctPm51bV9tYXNrID0gNDsKKwkJCXByaW5nLT5udW1fbWFzayA9IExQRkNfTUFYX1JJTkdfTUFTSzsKIAkJCXByaW5nLT5wcnRbMF0ucHJvZmlsZSA9IDA7CS8qIE1hc2sgMCAqLwotCQkJcHJpbmctPnBydFswXS5yY3RsID0gRkNfRUxTX1JFUTsKLQkJCXByaW5nLT5wcnRbMF0udHlwZSA9IEZDX0VMU19EQVRBOworCQkJcHJpbmctPnBydFswXS5yY3RsID0gRkNfUkNUTF9FTFNfUkVROworCQkJcHJpbmctPnBydFswXS50eXBlID0gRkNfVFlQRV9FTFM7CiAJCQlwcmluZy0+cHJ0WzBdLmxwZmNfc2xpX3Jjdl91bnNvbF9ldmVudCA9CiAJCQkgICAgbHBmY19lbHNfdW5zb2xfZXZlbnQ7CiAJCQlwcmluZy0+cHJ0WzFdLnByb2ZpbGUgPSAwOwkvKiBNYXNrIDEgKi8KLQkJCXByaW5nLT5wcnRbMV0ucmN0bCA9IEZDX0VMU19SU1A7Ci0JCQlwcmluZy0+cHJ0WzFdLnR5cGUgPSBGQ19FTFNfREFUQTsKKwkJCXByaW5nLT5wcnRbMV0ucmN0bCA9IEZDX1JDVExfRUxTX1JFUDsKKwkJCXByaW5nLT5wcnRbMV0udHlwZSA9IEZDX1RZUEVfRUxTOwogCQkJcHJpbmctPnBydFsxXS5scGZjX3NsaV9yY3ZfdW5zb2xfZXZlbnQgPQogCQkJICAgIGxwZmNfZWxzX3Vuc29sX2V2ZW50OwogCQkJcHJpbmctPnBydFsyXS5wcm9maWxlID0gMDsJLyogTWFzayAyICovCiAJCQkvKiBOYW1lU2VydmVyIElucXVpcnkgKi8KLQkJCXByaW5nLT5wcnRbMl0ucmN0bCA9IEZDX1VOU09MX0NUTDsKKwkJCXByaW5nLT5wcnRbMl0ucmN0bCA9IEZDX1JDVExfRERfVU5TT0xfQ1RMOwogCQkJLyogTmFtZVNlcnZlciAqLwotCQkJcHJpbmctPnBydFsyXS50eXBlID0gRkNfQ09NTU9OX1RSQU5TUE9SVF9VTFA7CisJCQlwcmluZy0+cHJ0WzJdLnR5cGUgPSBGQ19UWVBFX0NUOwogCQkJcHJpbmctPnBydFsyXS5scGZjX3NsaV9yY3ZfdW5zb2xfZXZlbnQgPQogCQkJICAgIGxwZmNfY3RfdW5zb2xfZXZlbnQ7CiAJCQlwcmluZy0+cHJ0WzNdLnByb2ZpbGUgPSAwOwkvKiBNYXNrIDMgKi8KIAkJCS8qIE5hbWVTZXJ2ZXIgcmVzcG9uc2UgKi8KLQkJCXByaW5nLT5wcnRbM10ucmN0bCA9IEZDX1NPTF9DVEw7CisJCQlwcmluZy0+cHJ0WzNdLnJjdGwgPSBGQ19SQ1RMX0REX1NPTF9DVEw7CiAJCQkvKiBOYW1lU2VydmVyICovCi0JCQlwcmluZy0+cHJ0WzNdLnR5cGUgPSBGQ19DT01NT05fVFJBTlNQT1JUX1VMUDsKKwkJCXByaW5nLT5wcnRbM10udHlwZSA9IEZDX1RZUEVfQ1Q7CiAJCQlwcmluZy0+cHJ0WzNdLmxwZmNfc2xpX3Jjdl91bnNvbF9ldmVudCA9CiAJCQkgICAgbHBmY19jdF91bnNvbF9ldmVudDsKKwkJCS8qIGFib3J0IHVuc29saWNpdGVkIHNlcXVlbmNlICovCisJCQlwcmluZy0+cHJ0WzRdLnByb2ZpbGUgPSAwOwkvKiBNYXNrIDQgKi8KKwkJCXByaW5nLT5wcnRbNF0ucmN0bCA9IEZDX1JDVExfQkFfQUJUUzsKKwkJCXByaW5nLT5wcnRbNF0udHlwZSA9IEZDX1RZUEVfQkxTOworCQkJcHJpbmctPnBydFs0XS5scGZjX3NsaV9yY3ZfdW5zb2xfZXZlbnQgPQorCQkJICAgIGxwZmNfc2xpNF9jdF9hYm9ydF91bnNvbF9ldmVudDsKIAkJCWJyZWFrOwogCQl9CiAJCXRvdGlvY2JzaXplICs9IChwcmluZy0+bnVtQ2lvY2IgKiBwcmluZy0+c2l6ZUNpb2NiKSArCkBAIC02OTc2LDggKzY5NTEsMTggQEAKIAkJYWJvcnRfaW90YWcgPSBjbWRpb2NiLT5pb2NiLnVuLmFjeHJpLmFib3J0SW9UYWc7CiAKIAkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JCWlmIChhYm9ydF9pb3RhZyAhPSAwICYmIGFib3J0X2lvdGFnIDw9IHBoYmEtPnNsaS5sYXN0X2lvdGFnKQotCQkJYWJvcnRfaW9jYiA9IHBoYmEtPnNsaS5pb2NicV9sb29rdXBbYWJvcnRfaW90YWddOworCQlpZiAocGhiYS0+c2xpX3JldiA8IExQRkNfU0xJX1JFVjQpIHsKKwkJCWlmIChhYm9ydF9pb3RhZyAhPSAwICYmCisJCQkJYWJvcnRfaW90YWcgPD0gcGhiYS0+c2xpLmxhc3RfaW90YWcpCisJCQkJYWJvcnRfaW9jYiA9CisJCQkJCXBoYmEtPnNsaS5pb2NicV9sb29rdXBbYWJvcnRfaW90YWddOworCQl9IGVsc2UKKwkJCS8qIEZvciBzbGk0IHRoZSBhYm9ydF90YWcgaXMgdGhlIFhSSSwKKwkJCSAqIHNvIHRoZSBhYm9ydCByb3V0aW5lIHB1dHMgdGhlIGlvdGFnICBvZiB0aGUgaW9jYgorCQkJICogYmVpbmcgYWJvcnRlZCBpbiB0aGUgY29udGV4dCBmaWVsZCBvZiB0aGUgYWJvcnQKKwkJCSAqIElPQ0IuCisJCQkgKi8KKwkJCWFib3J0X2lvY2IgPSBwaGJhLT5zbGkuaW9jYnFfbG9va3VwW2Fib3J0X2NvbnRleHRdOwogCiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19FTFMgfCBMT0dfU0xJLAogCQkJCSIwMzI3IENhbm5vdCBhYm9ydCBlbHMgaW9jYiAlcCAiCkBAIC02OTkxLDkgKzY5NzYsMTggQEAKIAkJICogIG1pZ2h0IGhhdmUgY29tcGxldGVkIGFscmVhZHkuIERvIG5vdCBmcmVlIGl0IGFnYWluLgogCQkgKi8KIAkJaWYgKGlyc3AtPnVscFN0YXR1cyA9PSBJT1NUQVRfTE9DQUxfUkVKRUNUKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCQkJbHBmY19zbGlfcmVsZWFzZV9pb2NicShwaGJhLCBjbWRpb2NiKTsKLQkJCXJldHVybjsKKwkJCWlmIChpcnNwLT51bi51bHBXb3JkWzRdICE9IElPRVJSX05PX1hSSSkgeworCQkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQkJbHBmY19zbGlfcmVsZWFzZV9pb2NicShwaGJhLCBjbWRpb2NiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBGb3IgU0xJNCB0aGUgdWxwQ29udGV4dCBmaWVsZCBmb3IgYWJvcnQgSU9DQgorCQkJICogaG9sZHMgdGhlIGlvdGFnIG9mIHRoZSBJT0NCIGJlaW5nIGFib3J0ZWQgc28KKwkJCSAqIHRoZSBsb2NhbCBhYm9ydF9jb250ZXh0IG5lZWRzIHRvIGJlIHJlc2V0IHRvCisJCQkgKiBtYXRjaCB0aGUgYWJvcnRlZCBJT0NCcyB1bHBDb250ZXh0LgorCQkJICovCisJCQlpZiAoYWJvcnRfaW9jYiAmJiBwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCQkJYWJvcnRfY29udGV4dCA9IGFib3J0X2lvY2ItPmlvY2IudWxwQ29udGV4dDsKIAkJfQogCQkvKgogCQkgKiBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgaW9jYnEgYmVmb3JlIHRha2luZyBpdApAQCAtNzExMiwxMyArNzEwNiwxOCBAQAogCWlhYnQgPSAmYWJ0c2lvY2JwLT5pb2NiOwogCWlhYnQtPnVuLmFjeHJpLmFib3J0VHlwZSA9IEFCT1JUX1RZUEVfQUJUUzsKIAlpYWJ0LT51bi5hY3hyaS5hYm9ydENvbnRleHRUYWcgPSBpY21kLT51bHBDb250ZXh0OwotCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgewogCQlpYWJ0LT51bi5hY3hyaS5hYm9ydElvVGFnID0gY21kaW9jYi0+c2xpNF94cml0YWc7CisJCWlhYnQtPnVuLmFjeHJpLmFib3J0Q29udGV4dFRhZyA9IGNtZGlvY2ItPmlvdGFnOworCX0KIAllbHNlCiAJCWlhYnQtPnVuLmFjeHJpLmFib3J0SW9UYWcgPSBpY21kLT51bHBJb1RhZzsKIAlpYWJ0LT51bHBMZSA9IDE7CiAJaWFidC0+dWxwQ2xhc3MgPSBpY21kLT51bHBDbGFzczsKIAorCS8qIEFCVFMgV1FFIG11c3QgZ28gdG8gdGhlIHNhbWUgV1EgYXMgdGhlIFdRRSB0byBiZSBhYm9ydGVkICovCisJYWJ0c2lvY2JwLT5mY3Bfd3FpZHggPSBjbWRpb2NiLT5mY3Bfd3FpZHg7CisKIAlpZiAocGhiYS0+bGlua19zdGF0ZSA+PSBMUEZDX0xJTktfVVApCiAJCWlhYnQtPnVscENvbW1hbmQgPSBDTURfQUJPUlRfWFJJX0NOOwogCWVsc2UKQEAgLTczMjIsNiArNzMyMSw5IEBACiAJCWFidHNpb2NiLT5pb2NiLnVscENsYXNzID0gY21kLT51bHBDbGFzczsKIAkJYWJ0c2lvY2ItPnZwb3J0ID0gcGhiYS0+cHBvcnQ7CiAKKwkJLyogQUJUUyBXUUUgbXVzdCBnbyB0byB0aGUgc2FtZSBXUSBhcyB0aGUgV1FFIHRvIGJlIGFib3J0ZWQgKi8KKwkJYWJ0c2lvY2ItPmZjcF93cWlkeCA9IGlvY2JxLT5mY3Bfd3FpZHg7CisKIAkJaWYgKGxwZmNfaXNfbGlua191cChwaGJhKSkKIAkJCWFidHNpb2NiLT5pb2NiLnVscENvbW1hbmQgPSBDTURfQUJPUlRfWFJJX0NOOwogCQllbHNlCkBAIC03Njg3LDMxICs3Njg5LDI4IEBACiBscGZjX3NsaTRfZXJhdHRfcmVhZChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CiAJdWludDMyX3QgdWVycl9zdGFfaGksIHVlcnJfc3RhX2xvOwotCXVpbnQzMl90IG9ubG5yZWcwLCBvbmxucmVnMTsKIAogCS8qIEZvciBub3csIHVzZSB0aGUgU0xJNCBkZXZpY2UgaW50ZXJuYWwgdW5yZWNvdmVyYWJsZSBlcnJvcgogCSAqIHJlZ2lzdGVycyBmb3IgZXJyb3IgYXR0ZW50aW9uLiBUaGlzIGNhbiBiZSBjaGFuZ2VkIGxhdGVyLgogCSAqLwotCW9ubG5yZWcwID0gcmVhZGwocGhiYS0+c2xpNF9oYmEuT05MSU5FMHJlZ2FkZHIpOwotCW9ubG5yZWcxID0gcmVhZGwocGhiYS0+c2xpNF9oYmEuT05MSU5FMXJlZ2FkZHIpOwotCWlmICgob25sbnJlZzAgIT0gTFBGQ19PTkxJTkVfTkVSUikgfHwgKG9ubG5yZWcxICE9IExQRkNfT05MSU5FX05FUlIpKSB7Ci0JCXVlcnJfc3RhX2xvID0gcmVhZGwocGhiYS0+c2xpNF9oYmEuVUVSUkxPcmVnYWRkcik7Ci0JCXVlcnJfc3RhX2hpID0gcmVhZGwocGhiYS0+c2xpNF9oYmEuVUVSUkhJcmVnYWRkcik7Ci0JCWlmICh1ZXJyX3N0YV9sbyB8fCB1ZXJyX3N0YV9oaSkgewotCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkJIjE0MjMgSEJBIFVucmVjb3ZlcmFibGUgZXJyb3I6ICIKLQkJCQkJInVlcnJfbG9fcmVnPTB4JXgsIHVlcnJfaGlfcmVnPTB4JXgsICIKLQkJCQkJIm9ubGluZTBfcmVnPTB4JXgsIG9ubGluZTFfcmVnPTB4JXhcbiIsCi0JCQkJCXVlcnJfc3RhX2xvLCB1ZXJyX3N0YV9oaSwKLQkJCQkJb25sbnJlZzAsIG9ubG5yZWcxKTsKLQkJCXBoYmEtPndvcmtfc3RhdHVzWzBdID0gdWVycl9zdGFfbG87Ci0JCQlwaGJhLT53b3JrX3N0YXR1c1sxXSA9IHVlcnJfc3RhX2hpOwotCQkJLyogU2V0IHRoZSBkcml2ZXIgSEEgd29yayBiaXRtYXAgKi8KLQkJCXBoYmEtPndvcmtfaGEgfD0gSEFfRVJBVFQ7Ci0JCQkvKiBJbmRpY2F0ZSBwb2xsaW5nIGhhbmRsZXMgdGhpcyBFUkFUVCAqLwotCQkJcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX0VSQVRUX0hBTkRMRUQ7Ci0JCQlyZXR1cm4gMTsKLQkJfQorCXVlcnJfc3RhX2xvID0gcmVhZGwocGhiYS0+c2xpNF9oYmEuVUVSUkxPcmVnYWRkcik7CisJdWVycl9zdGFfaGkgPSByZWFkbChwaGJhLT5zbGk0X2hiYS5VRVJSSElyZWdhZGRyKTsKKwlpZiAoKH5waGJhLT5zbGk0X2hiYS51ZV9tYXNrX2xvICYgdWVycl9zdGFfbG8pIHx8CisJICAgICh+cGhiYS0+c2xpNF9oYmEudWVfbWFza19oaSAmIHVlcnJfc3RhX2hpKSkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIxNDIzIEhCQSBVbnJlY292ZXJhYmxlIGVycm9yOiAiCisJCQkJInVlcnJfbG9fcmVnPTB4JXgsIHVlcnJfaGlfcmVnPTB4JXgsICIKKwkJCQkidWVfbWFza19sb19yZWc9MHgleCwgdWVfbWFza19oaV9yZWc9MHgleFxuIiwKKwkJCQl1ZXJyX3N0YV9sbywgdWVycl9zdGFfaGksCisJCQkJcGhiYS0+c2xpNF9oYmEudWVfbWFza19sbywKKwkJCQlwaGJhLT5zbGk0X2hiYS51ZV9tYXNrX2hpKTsKKwkJcGhiYS0+d29ya19zdGF0dXNbMF0gPSB1ZXJyX3N0YV9sbzsKKwkJcGhiYS0+d29ya19zdGF0dXNbMV0gPSB1ZXJyX3N0YV9oaTsKKwkJLyogU2V0IHRoZSBkcml2ZXIgSEEgd29yayBiaXRtYXAgKi8KKwkJcGhiYS0+d29ya19oYSB8PSBIQV9FUkFUVDsKKwkJLyogSW5kaWNhdGUgcG9sbGluZyBoYW5kbGVzIHRoaXMgRVJBVFQgKi8KKwkJcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX0VSQVRUX0hBTkRMRUQ7CisJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc4MzQsNyArNzgzMyw3IEBACiBscGZjX3NsaV9zcF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBscGZjX2hiYSAgKnBoYmE7Ci0JdWludDMyX3QgaGFfY29weTsKKwl1aW50MzJfdCBoYV9jb3B5LCBoY19jb3B5OwogCXVpbnQzMl90IHdvcmtfaGFfY29weTsKIAl1bnNpZ25lZCBsb25nIHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGlmbGFnOwpAQCAtNzg5Miw4ICs3ODkxLDEzIEBACiAJCX0KIAogCQkvKiBDbGVhciB1cCBvbmx5IGF0dGVudGlvbiBzb3VyY2UgcmVsYXRlZCB0byBzbG93LXBhdGggKi8KKwkJaGNfY29weSA9IHJlYWRsKHBoYmEtPkhDcmVnYWRkcik7CisJCXdyaXRlbChoY19jb3B5ICYgfihIQ19NQklOVF9FTkEgfCBIQ19SMklOVF9FTkEgfAorCQkJSENfTEFJTlRfRU5BIHwgSENfRVJJTlRfRU5BKSwKKwkJCXBoYmEtPkhDcmVnYWRkcik7CiAJCXdyaXRlbCgoaGFfY29weSAmIChIQV9NQkFUVCB8IEhBX1IyX0NMUl9NU0spKSwKIAkJCXBoYmEtPkhBcmVnYWRkcik7CisJCXdyaXRlbChoY19jb3B5LCBwaGJhLT5IQ3JlZ2FkZHIpOwogCQlyZWFkbChwaGJhLT5IQXJlZ2FkZHIpOyAvKiBmbHVzaCAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJfSBlbHNlCkBAIC04MDQ5LDcgKzgwNTMsNyBAQAogCQkJCQkJCUtFUk5fRVJSLAogCQkJCQkJCUxPR19NQk9YIHwgTE9HX1NMSSwKIAkJCQkJCQkiMDM1MCByYyBzaG91bGQgaGF2ZSIKLQkJCQkJCQkiYmVlbiBNQlhfQlVTWSIpOworCQkJCQkJCSJiZWVuIE1CWF9CVVNZXG4iKTsKIAkJCQkJCWlmIChyYyAhPSBNQlhfTk9UX0ZJTklTSEVEKQogCQkJCQkJCWdvdG8gc2VuZF9jdXJyZW50X21ib3g7CiAJCQkJCX0KQEAgLTgwNzgsNyArODA4Miw3IEBACiAJCQlpZiAocmMgIT0gTUJYX1NVQ0NFU1MpCiAJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTUJPWCB8CiAJCQkJCQlMT0dfU0xJLCAiMDM0OSByYyBzaG91bGQgYmUgIgotCQkJCQkJIk1CWF9TVUNDRVNTIik7CisJCQkJCQkiTUJYX1NVQ0NFU1NcbiIpOwogCQl9CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKQEAgLTgyMDMsNiArODIwNyw3IEBACiAJc3RydWN0IGxwZmNfaGJhICAqcGhiYTsKIAlpcnFyZXR1cm5fdCBzcF9pcnFfcmMsIGZwX2lycV9yYzsKIAl1bnNpZ25lZCBsb25nIHN0YXR1czEsIHN0YXR1czI7CisJdWludDMyX3QgaGNfY29weTsKIAogCS8qCiAJICogR2V0IHRoZSBkcml2ZXIncyBwaGJhIHN0cnVjdHVyZSBmcm9tIHRoZSBkZXZfaWQgYW5kCkBAIC04MjQwLDcgKzgyNDUsMTIgQEAKIAl9CiAKIAkvKiBDbGVhciBhdHRlbnRpb24gc291cmNlcyBleGNlcHQgbGluayBhbmQgZXJyb3IgYXR0ZW50aW9ucyAqLworCWhjX2NvcHkgPSByZWFkbChwaGJhLT5IQ3JlZ2FkZHIpOworCXdyaXRlbChoY19jb3B5ICYgfihIQ19NQklOVF9FTkEgfCBIQ19SMElOVF9FTkEgfCBIQ19SMUlOVF9FTkEKKwkJfCBIQ19SMklOVF9FTkEgfCBIQ19MQUlOVF9FTkEgfCBIQ19FUklOVF9FTkEpLAorCQlwaGJhLT5IQ3JlZ2FkZHIpOwogCXdyaXRlbCgocGhiYS0+aGFfY29weSAmIH4oSEFfTEFUVCB8IEhBX0VSQVRUKSksIHBoYmEtPkhBcmVnYWRkcik7CisJd3JpdGVsKGhjX2NvcHksIHBoYmEtPkhDcmVnYWRkcik7CiAJcmVhZGwocGhiYS0+SEFyZWdhZGRyKTsgLyogZmx1c2ggKi8KIAlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CiAKQEAgLTgzNTEsOCArODM2MSw2IEBACiAKIAltZW1jcHkoKGNoYXIgKilwSW9jYkluICsgb2Zmc2V0LCAoY2hhciAqKXBJb2NiT3V0ICsgb2Zmc2V0LAogCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfaW9jYnEpIC0gb2Zmc2V0KTsKLQltZW1zZXQoJnBJb2NiSW4tPnNsaTRfaW5mbywgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX3NsaTRfcnNwaW9jYl9pbmZvKSk7CiAJLyogTWFwIFdDUUUgcGFyYW1ldGVycyBpbnRvIGlyc3Bpb2NiIHBhcmFtZXRlcnMgKi8KIAlwSW9jYkluLT5pb2NiLnVscFN0YXR1cyA9IGJmX2dldChscGZjX3djcWVfY19zdGF0dXMsIHdjcWUpOwogCWlmIChwSW9jYk91dC0+aW9jYl9mbGFnICYgTFBGQ19JT19GQ1ApCkBAIC04MzY0LDE2ICs4MzcyLDQ5IEBACiAJCQlwSW9jYkluLT5pb2NiLnVuLnVscFdvcmRbNF0gPSB3Y3FlLT5wYXJhbWV0ZXI7CiAJZWxzZQogCQlwSW9jYkluLT5pb2NiLnVuLnVscFdvcmRbNF0gPSB3Y3FlLT5wYXJhbWV0ZXI7Ci0JLyogTG9hZCBpbiBhZGRpdGlvbmFsIFdDUUUgcGFyYW1ldGVycyAqLwotCXBJb2NiSW4tPnNsaTRfaW5mby5od19zdGF0dXMgPSBiZl9nZXQobHBmY193Y3FlX2NfaHdfc3RhdHVzLCB3Y3FlKTsKLQlwSW9jYkluLT5zbGk0X2luZm8uYmZpZWxkID0gMDsKLQlpZiAoYmZfZ2V0KGxwZmNfd2NxZV9jX3hiLCB3Y3FlKSkKLQkJcElvY2JJbi0+c2xpNF9pbmZvLmJmaWVsZCB8PSBMUEZDX1hCOwotCWlmIChiZl9nZXQobHBmY193Y3FlX2NfcHYsIHdjcWUpKSB7Ci0JCXBJb2NiSW4tPnNsaTRfaW5mby5iZmllbGQgfD0gTFBGQ19QVjsKLQkJcElvY2JJbi0+c2xpNF9pbmZvLnByaW9yaXR5ID0KLQkJCQkJYmZfZ2V0KGxwZmNfd2NxZV9jX3ByaW9yaXR5LCB3Y3FlKTsKK30KKworLyoqCisgKiBscGZjX3NsaTRfZWxzX3djcWVfdG9fcnNwaW9jYnEgLSBHZXQgcmVzcG9uc2UgaW9jYnEgZnJvbSBlbHMgd2NxZQorICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgorICogQHdjcWU6IFBvaW50ZXIgdG8gd29yay1xdWV1ZSBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5LgorICoKKyAqIFRoaXMgcm91dGluZSBoYW5kbGVzIGFuIEVMUyB3b3JrLXF1ZXVlIGNvbXBsZXRpb24gZXZlbnQgYW5kIGNvbnN0cnVjdAorICogYSBwc2V1ZG8gcmVzcG9uc2UgRUxTIElPREJRIGZyb20gdGhlIFNMSTQgRUxTIFdDUUUgZm9yIHRoZSBjb21tb24KKyAqIGRpc2NvdmVyeSBlbmdpbmUgdG8gaGFuZGxlLgorICoKKyAqIFJldHVybjogUG9pbnRlciB0byB0aGUgcmVjZWl2ZSBJT0NCUSwgTlVMTCBvdGhlcndpc2UuCisgKiovCitzdGF0aWMgc3RydWN0IGxwZmNfaW9jYnEgKgorbHBmY19zbGk0X2Vsc193Y3FlX3RvX3JzcGlvY2JxKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwKKwkJCSAgICAgICBzdHJ1Y3QgbHBmY19pb2NicSAqaXJzcGlvY2JxKQoreworCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKKwlzdHJ1Y3QgbHBmY19pb2NicSAqY21kaW9jYnE7CisJc3RydWN0IGxwZmNfd2NxZV9jb21wbGV0ZSAqd2NxZTsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCXdjcWUgPSAmaXJzcGlvY2JxLT5jcV9ldmVudC5jcWUud2NxZV9jbXBsOworCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOworCXByaW5nLT5zdGF0cy5pb2NiX2V2ZW50Kys7CisJLyogTG9vayB1cCB0aGUgRUxTIGNvbW1hbmQgSU9DQiBhbmQgY3JlYXRlIHBzZXVkbyByZXNwb25zZSBJT0NCICovCisJY21kaW9jYnEgPSBscGZjX3NsaV9pb2NicV9sb29rdXBfYnlfdGFnKHBoYmEsIHByaW5nLAorCQkJCWJmX2dldChscGZjX3djcWVfY19yZXF1ZXN0X3RhZywgd2NxZSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7CisKKwlpZiAodW5saWtlbHkoIWNtZGlvY2JxKSkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfU0xJLAorCQkJCSIwMzg2IEVMUyBjb21wbGV0ZSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgIgorCQkJCSJjbWRpb2NiOiBpb3RhZyAoJWQpXG4iLAorCQkJCWJmX2dldChscGZjX3djcWVfY19yZXF1ZXN0X3RhZywgd2NxZSkpOworCQlscGZjX3NsaV9yZWxlYXNlX2lvY2JxKHBoYmEsIGlyc3Bpb2NicSk7CisJCXJldHVybiBOVUxMOwogCX0KKworCS8qIEZha2UgdGhlIGlyc3Bpb2NicSBhbmQgY29weSBuZWNlc3NhcnkgcmVzcG9uc2UgaW5mb3JtYXRpb24gKi8KKwlscGZjX3NsaTRfaW9jYl9wYXJhbV90cmFuc2ZlcihpcnNwaW9jYnEsIGNtZGlvY2JxLCB3Y3FlKTsKKworCXJldHVybiBpcnNwaW9jYnE7CiB9CiAKIC8qKgpAQCAtODU2Niw0NSArODYwNywyNiBAQAogbHBmY19zbGk0X3NwX2hhbmRsZV9lbHNfd2NxZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCiAJCQkgICAgIHN0cnVjdCBscGZjX3djcWVfY29tcGxldGUgKndjcWUpCiB7Ci0Jc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddOwotCXN0cnVjdCBscGZjX2lvY2JxICpjbWRpb2NicTsKIAlzdHJ1Y3QgbHBmY19pb2NicSAqaXJzcGlvY2JxOwogCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwotCWJvb2wgd29ya3Bvc3RlZCA9IGZhbHNlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7Ci0JcHJpbmctPnN0YXRzLmlvY2JfZXZlbnQrKzsKLQkvKiBMb29rIHVwIHRoZSBFTFMgY29tbWFuZCBJT0NCIGFuZCBjcmVhdGUgcHNldWRvIHJlc3BvbnNlIElPQ0IgKi8KLQljbWRpb2NicSA9IGxwZmNfc2xpX2lvY2JxX2xvb2t1cF9ieV90YWcocGhiYSwgcHJpbmcsCi0JCQkJYmZfZ2V0KGxwZmNfd2NxZV9jX3JlcXVlc3RfdGFnLCB3Y3FlKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKLQotCWlmICh1bmxpa2VseSghY21kaW9jYnEpKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19TTEksCi0JCQkJIjAzODYgRUxTIGNvbXBsZXRlIHdpdGggbm8gY29ycmVzcG9uZGluZyAiCi0JCQkJImNtZGlvY2I6IGlvdGFnICglZClcbiIsCi0JCQkJYmZfZ2V0KGxwZmNfd2NxZV9jX3JlcXVlc3RfdGFnLCB3Y3FlKSk7Ci0JCXJldHVybiB3b3JrcG9zdGVkOwotCX0KLQotCS8qIEZha2UgdGhlIGlyc3Bpb2NicSBhbmQgY29weSBuZWNlc3NhcnkgcmVzcG9uc2UgaW5mb3JtYXRpb24gKi8KKwkvKiBHZXQgYW4gaXJzcGlvY2JxIGZvciBsYXRlciBFTFMgcmVzcG9uc2UgcHJvY2Vzc2luZyB1c2UgKi8KIAlpcnNwaW9jYnEgPSBscGZjX3NsaV9nZXRfaW9jYnEocGhiYSk7CiAJaWYgKCFpcnNwaW9jYnEpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAogCQkJCSIwMzg3IEZhaWxlZCB0byBhbGxvY2F0ZSBhbiBpb2NicVxuIik7Ci0JCXJldHVybiB3b3JrcG9zdGVkOworCQlyZXR1cm4gZmFsc2U7CiAJfQotCWxwZmNfc2xpNF9pb2NiX3BhcmFtX3RyYW5zZmVyKGlyc3Bpb2NicSwgY21kaW9jYnEsIHdjcWUpOwogCi0JLyogQWRkIHRoZSBpcnNwaW9jYiB0byB0aGUgcmVzcG9uc2UgSU9DQiB3b3JrIGxpc3QgKi8KKwkvKiBTYXZlIG9mZiB0aGUgc2xvdy1wYXRoIHF1ZXVlIGV2ZW50IGZvciB3b3JrIHRocmVhZCB0byBwcm9jZXNzICovCisJbWVtY3B5KCZpcnNwaW9jYnEtPmNxX2V2ZW50LmNxZS53Y3FlX2NtcGwsIHdjcWUsIHNpemVvZigqd2NxZSkpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmlyc3Bpb2NicS0+bGlzdCwgJnBoYmEtPnNsaTRfaGJhLnNwX3JzcGlvY2Jfd29ya19xdWV1ZSk7Ci0JLyogSW5kaWNhdGUgRUxTIHJpbmcgYXR0ZW50aW9uICovCi0JcGhiYS0+d29ya19oYSB8PSAoSEFfUjBBVFQgPDwgKDQqTFBGQ19FTFNfUklORykpOworCWxpc3RfYWRkX3RhaWwoJmlyc3Bpb2NicS0+Y3FfZXZlbnQubGlzdCwKKwkJICAgICAgJnBoYmEtPnNsaTRfaGJhLnNwX3F1ZXVlX2V2ZW50KTsKKwlwaGJhLT5oYmFfZmxhZyB8PSBIQkFfU1BfUVVFVUVfRVZUOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7Ci0Jd29ya3Bvc3RlZCA9IHRydWU7CiAKLQlyZXR1cm4gd29ya3Bvc3RlZDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoqCkBAIC04NjkwLDUyICs4NzEyLDYgQEAKIH0KIAogLyoqCi0gKiBscGZjX3NsaTRfc3BfaGFuZGxlX3djcWUgLSBQcm9jZXNzIGEgd29yay1xdWV1ZSBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5Ci0gKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCi0gKiBAY3E6IFBvaW50ZXIgdG8gdGhlIGNvbXBsZXRpb24gcXVldWUuCi0gKiBAd2NxZTogUG9pbnRlciB0byBhIGNvbXBsZXRpb24gcXVldWUgZW50cnkuCi0gKgotICogVGhpcyByb3V0aW5lIHByb2Nlc3MgYSBzbG93LXBhdGggd29yay1xdWV1ZSBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5LgotICoKLSAqIFJldHVybjogdHJ1ZSBpZiB3b3JrIHBvc3RlZCB0byB3b3JrZXIgdGhyZWFkLCBvdGhlcndpc2UgZmFsc2UuCi0gKiovCi1zdGF0aWMgYm9vbAotbHBmY19zbGk0X3NwX2hhbmRsZV93Y3FlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfcXVldWUgKmNxLAotCQkJIHN0cnVjdCBscGZjX2NxZSAqY3FlKQotewotCXN0cnVjdCBscGZjX3djcWVfY29tcGxldGUgd2NxZTsKLQlib29sIHdvcmtwb3N0ZWQgPSBmYWxzZTsKLQotCS8qIENvcHkgdGhlIHdvcmsgcXVldWUgQ1FFIGFuZCBjb252ZXJ0IGVuZGlhbiBvcmRlciBpZiBuZWVkZWQgKi8KLQlscGZjX3NsaV9wY2ltZW1fYmNvcHkoY3FlLCAmd2NxZSwgc2l6ZW9mKHN0cnVjdCBscGZjX2NxZSkpOwotCi0JLyogQ2hlY2sgYW5kIHByb2Nlc3MgZm9yIGRpZmZlcmVudCB0eXBlIG9mIFdDUUUgYW5kIGRpc3BhdGNoICovCi0Jc3dpdGNoIChiZl9nZXQobHBmY193Y3FlX2NfY29kZSwgJndjcWUpKSB7Ci0JY2FzZSBDUUVfQ09ERV9DT01QTF9XUUU6Ci0JCS8qIFByb2Nlc3MgdGhlIFdRIGNvbXBsZXRlIGV2ZW50ICovCi0JCXdvcmtwb3N0ZWQgPSBscGZjX3NsaTRfc3BfaGFuZGxlX2Vsc193Y3FlKHBoYmEsCi0JCQkJCShzdHJ1Y3QgbHBmY193Y3FlX2NvbXBsZXRlICopJndjcWUpOwotCQlicmVhazsKLQljYXNlIENRRV9DT0RFX1JFTEVBU0VfV1FFOgotCQkvKiBQcm9jZXNzIHRoZSBXUSByZWxlYXNlIGV2ZW50ICovCi0JCWxwZmNfc2xpNF9zcF9oYW5kbGVfcmVsX3djcWUocGhiYSwKLQkJCQkJKHN0cnVjdCBscGZjX3djcWVfcmVsZWFzZSAqKSZ3Y3FlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUUVfQ09ERV9YUklfQUJPUlRFRDoKLQkJLyogUHJvY2VzcyB0aGUgV1EgWFJJIGFib3J0IGV2ZW50ICovCi0JCXdvcmtwb3N0ZWQgPSBscGZjX3NsaTRfc3BfaGFuZGxlX2Fib3J0X3hyaV93Y3FlKHBoYmEsIGNxLAotCQkJCQkoc3RydWN0IHNsaTRfd2NxZV94cmlfYWJvcnRlZCAqKSZ3Y3FlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAotCQkJCSIwMzg4IE5vdCBhIHZhbGlkIFdDUUUgY29kZTogeCV4XG4iLAotCQkJCWJmX2dldChscGZjX3djcWVfY19jb2RlLCAmd2NxZSkpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHdvcmtwb3N0ZWQ7Ci19Ci0KLS8qKgogICogbHBmY19zbGk0X3NwX2hhbmRsZV9yY3FlIC0gUHJvY2VzcyBhIHJlY2VpdmUtcXVldWUgY29tcGxldGlvbiBxdWV1ZSBlbnRyeQogICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgogICogQHJjcWU6IFBvaW50ZXIgdG8gcmVjZWl2ZS1xdWV1ZSBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5LgpAQCAtODc0NSw5ICs4NzIxLDggQEAKICAqIFJldHVybjogdHJ1ZSBpZiB3b3JrIHBvc3RlZCB0byB3b3JrZXIgdGhyZWFkLCBvdGhlcndpc2UgZmFsc2UuCiAgKiovCiBzdGF0aWMgYm9vbAotbHBmY19zbGk0X3NwX2hhbmRsZV9yY3FlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfY3FlICpjcWUpCitscGZjX3NsaTRfc3BfaGFuZGxlX3JjcWUoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19yY3FlICpyY3FlKQogewotCXN0cnVjdCBscGZjX3JjcWUgcmNxZTsKIAlib29sIHdvcmtwb3N0ZWQgPSBmYWxzZTsKIAlzdHJ1Y3QgbHBmY19xdWV1ZSAqaHJxID0gcGhiYS0+c2xpNF9oYmEuaGRyX3JxOwogCXN0cnVjdCBscGZjX3F1ZXVlICpkcnEgPSBwaGJhLT5zbGk0X2hiYS5kYXRfcnE7CkBAIC04NzU1LDMxICs4NzMwLDI4IEBACiAJdWludDMyX3Qgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwogCi0JLyogQ29weSB0aGUgcmVjZWl2ZSBxdWV1ZSBDUUUgYW5kIGNvbnZlcnQgZW5kaWFuIG9yZGVyIGlmIG5lZWRlZCAqLwotCWxwZmNfc2xpX3BjaW1lbV9iY29weShjcWUsICZyY3FlLCBzaXplb2Yoc3RydWN0IGxwZmNfcmNxZSkpOwotCWxwZmNfc2xpNF9ycV9yZWxlYXNlKGhycSwgZHJxKTsKLQlpZiAoYmZfZ2V0KGxwZmNfcmNxZV9jb2RlLCAmcmNxZSkgIT0gQ1FFX0NPREVfUkVDRUlWRSkKLQkJZ290byBvdXQ7Ci0JaWYgKGJmX2dldChscGZjX3JjcWVfcnFfaWQsICZyY3FlKSAhPSBocnEtPnF1ZXVlX2lkKQorCWlmIChiZl9nZXQobHBmY19yY3FlX3JxX2lkLCByY3FlKSAhPSBocnEtPnF1ZXVlX2lkKQogCQlnb3RvIG91dDsKIAotCXN0YXR1cyA9IGJmX2dldChscGZjX3JjcWVfc3RhdHVzLCAmcmNxZSk7CisJc3RhdHVzID0gYmZfZ2V0KGxwZmNfcmNxZV9zdGF0dXMsIHJjcWUpOwogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSBGQ19TVEFUVVNfUlFfQlVGX0xFTl9FWENFRURFRDoKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAogCQkJCSIyNTM3IFJlY2VpdmUgRnJhbWUgVHJ1bmNhdGVkISFcbiIpOwogCWNhc2UgRkNfU1RBVFVTX1JRX1NVQ0NFU1M6CisJCWxwZmNfc2xpNF9ycV9yZWxlYXNlKGhycSwgZHJxKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7CiAJCWRtYV9idWYgPSBscGZjX3NsaV9oYnFidWZfZ2V0KCZwaGJhLT5oYnFzWzBdLmhicV9idWZmZXJfbGlzdCk7CiAJCWlmICghZG1hX2J1ZikgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCW1lbWNweSgmZG1hX2J1Zi0+cmNxZSwgJnJjcWUsIHNpemVvZihyY3FlKSk7CisJCW1lbWNweSgmZG1hX2J1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCwgcmNxZSwgc2l6ZW9mKCpyY3FlKSk7CiAJCS8qIHNhdmUgb2ZmIHRoZSBmcmFtZSBmb3IgdGhlIHdvcmQgdGhyZWFkIHRvIHByb2Nlc3MgKi8KLQkJbGlzdF9hZGRfdGFpbCgmZG1hX2J1Zi0+ZGJ1Zi5saXN0LCAmcGhiYS0+cmJfcGVuZF9saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmZG1hX2J1Zi0+Y3FfZXZlbnQubGlzdCwKKwkJCSAgICAgICZwaGJhLT5zbGk0X2hiYS5zcF9xdWV1ZV9ldmVudCk7CiAJCS8qIEZyYW1lIHJlY2VpdmVkICovCi0JCXBoYmEtPmhiYV9mbGFnIHw9IEhCQV9SRUNFSVZFX0JVRkZFUjsKKwkJcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX1NQX1FVRVVFX0VWVDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKIAkJd29ya3Bvc3RlZCA9IHRydWU7CiAJCWJyZWFrOwpAQCAtODc5NCw3ICs4NzY2LDU4IEBACiAJfQogb3V0OgogCXJldHVybiB3b3JrcG9zdGVkOworfQogCisvKioKKyAqIGxwZmNfc2xpNF9zcF9oYW5kbGVfY3FlIC0gUHJvY2VzcyBhIHNsb3cgcGF0aCBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5CisgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCisgKiBAY3E6IFBvaW50ZXIgdG8gdGhlIGNvbXBsZXRpb24gcXVldWUuCisgKiBAd2NxZTogUG9pbnRlciB0byBhIGNvbXBsZXRpb24gcXVldWUgZW50cnkuCisgKgorICogVGhpcyByb3V0aW5lIHByb2Nlc3MgYSBzbG93LXBhdGggd29yay1xdWV1ZSBvciByZWNpZXZlIHF1ZXVlIGNvbXBsZXRpb24gcXVldWUKKyAqIGVudHJ5LgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB3b3JrIHBvc3RlZCB0byB3b3JrZXIgdGhyZWFkLCBvdGhlcndpc2UgZmFsc2UuCisgKiovCitzdGF0aWMgYm9vbAorbHBmY19zbGk0X3NwX2hhbmRsZV9jcWUoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19xdWV1ZSAqY3EsCisJCQkgc3RydWN0IGxwZmNfY3FlICpjcWUpCit7CisJc3RydWN0IGxwZmNfY3FlIGNxZXZ0OworCWJvb2wgd29ya3Bvc3RlZCA9IGZhbHNlOworCisJLyogQ29weSB0aGUgd29yayBxdWV1ZSBDUUUgYW5kIGNvbnZlcnQgZW5kaWFuIG9yZGVyIGlmIG5lZWRlZCAqLworCWxwZmNfc2xpX3BjaW1lbV9iY29weShjcWUsICZjcWV2dCwgc2l6ZW9mKHN0cnVjdCBscGZjX2NxZSkpOworCisJLyogQ2hlY2sgYW5kIHByb2Nlc3MgZm9yIGRpZmZlcmVudCB0eXBlIG9mIFdDUUUgYW5kIGRpc3BhdGNoICovCisJc3dpdGNoIChiZl9nZXQobHBmY19jcWVfY29kZSwgJmNxZXZ0KSkgeworCWNhc2UgQ1FFX0NPREVfQ09NUExfV1FFOgorCQkvKiBQcm9jZXNzIHRoZSBXUS9SUSBjb21wbGV0ZSBldmVudCAqLworCQl3b3JrcG9zdGVkID0gbHBmY19zbGk0X3NwX2hhbmRsZV9lbHNfd2NxZShwaGJhLAorCQkJCShzdHJ1Y3QgbHBmY193Y3FlX2NvbXBsZXRlICopJmNxZXZ0KTsKKwkJYnJlYWs7CisJY2FzZSBDUUVfQ09ERV9SRUxFQVNFX1dRRToKKwkJLyogUHJvY2VzcyB0aGUgV1EgcmVsZWFzZSBldmVudCAqLworCQlscGZjX3NsaTRfc3BfaGFuZGxlX3JlbF93Y3FlKHBoYmEsCisJCQkJKHN0cnVjdCBscGZjX3djcWVfcmVsZWFzZSAqKSZjcWV2dCk7CisJCWJyZWFrOworCWNhc2UgQ1FFX0NPREVfWFJJX0FCT1JURUQ6CisJCS8qIFByb2Nlc3MgdGhlIFdRIFhSSSBhYm9ydCBldmVudCAqLworCQl3b3JrcG9zdGVkID0gbHBmY19zbGk0X3NwX2hhbmRsZV9hYm9ydF94cmlfd2NxZShwaGJhLCBjcSwKKwkJCQkoc3RydWN0IHNsaTRfd2NxZV94cmlfYWJvcnRlZCAqKSZjcWV2dCk7CisJCWJyZWFrOworCWNhc2UgQ1FFX0NPREVfUkVDRUlWRToKKwkJLyogUHJvY2VzcyB0aGUgUlEgZXZlbnQgKi8KKwkJd29ya3Bvc3RlZCA9IGxwZmNfc2xpNF9zcF9oYW5kbGVfcmNxZShwaGJhLAorCQkJCShzdHJ1Y3QgbHBmY19yY3FlICopJmNxZXZ0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCSIwMzg4IE5vdCBhIHZhbGlkIFdDUUUgY29kZTogeCV4XG4iLAorCQkJCWJmX2dldChscGZjX2NxZV9jb2RlLCAmY3FldnQpKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB3b3JrcG9zdGVkOwogfQogCiAvKioKQEAgLTg4NTgsMTQgKzg4ODEsNyBAQAogCQlicmVhazsKIAljYXNlIExQRkNfV0NROgogCQl3aGlsZSAoKGNxZSA9IGxwZmNfc2xpNF9jcV9nZXQoY3EpKSkgewotCQkJd29ya3Bvc3RlZCB8PSBscGZjX3NsaTRfc3BfaGFuZGxlX3djcWUocGhiYSwgY3EsIGNxZSk7Ci0JCQlpZiAoISgrK2Vjb3VudCAlIExQRkNfR0VUX1FFX1JFTF9JTlQpKQotCQkJCWxwZmNfc2xpNF9jcV9yZWxlYXNlKGNxLCBMUEZDX1FVRVVFX05PQVJNKTsKLQkJfQotCQlicmVhazsKLQljYXNlIExQRkNfUkNROgotCQl3aGlsZSAoKGNxZSA9IGxwZmNfc2xpNF9jcV9nZXQoY3EpKSkgewotCQkJd29ya3Bvc3RlZCB8PSBscGZjX3NsaTRfc3BfaGFuZGxlX3JjcWUocGhiYSwgY3FlKTsKKwkJCXdvcmtwb3N0ZWQgfD0gbHBmY19zbGk0X3NwX2hhbmRsZV9jcWUocGhiYSwgY3EsIGNxZSk7CiAJCQlpZiAoISgrK2Vjb3VudCAlIExQRkNfR0VUX1FFX1JFTF9JTlQpKQogCQkJCWxwZmNfc2xpNF9jcV9yZWxlYXNlKGNxLCBMUEZDX1FVRVVFX05PQVJNKTsKIAkJfQpAQCAtMTA0MjcsOCArMTA0NDMsNyBAQAogCQlyZXR1cm4geHJpdGFnOwogCX0KIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCi0JbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19TTEksCiAJCQkiMjAwNCBGYWlsZWQgdG8gYWxsb2NhdGUgWFJJLmxhc3QgWFJJVEFHIGlzICVkIgogCQkJIiBNYXggWFJJIGlzICVkLCBVc2VkIFhSSSBpcyAlZFxuIiwKIAkJCXBoYmEtPnNsaTRfaGJhLm5leHRfeHJpLApAQCAtMTA0OTIsMTUgKzEwNTA3LDcgQEAKIAkJbHBmY19zbGk0X21ib3hfY21kX2ZyZWUocGhiYSwgbWJveCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQogCS8qIEdldCB0aGUgZmlyc3QgU0dFIGVudHJ5IGZyb20gdGhlIG5vbi1lbWJlZGRlZCBETUEgbWVtb3J5ICovCi0JaWYgKHVubGlrZWx5KCFtYm94LT5zZ2VfYXJyYXkpKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1gsCi0JCQkJIjI1MjUgRmFpbGVkIHRvIGdldCB0aGUgbm9uLWVtYmVkZGVkIFNHRSAiCi0JCQkJInZpcnR1YWwgYWRkcmVzc1xuIik7Ci0JCWxwZmNfc2xpNF9tYm94X2NtZF9mcmVlKHBoYmEsIG1ib3gpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJdmlyYWRkciA9IG1ib3gtPnNnZV9hcnJheS0+YWRkclswXTsKIAogCS8qIFNldCB1cCB0aGUgU0dMIHBhZ2VzIGluIHRoZSBub24tZW1iZWRkZWQgRE1BIHBhZ2VzICovCkBAIC0xMDUyNCw4ICsxMDUzMSw3IEBACiAJCXNnbF9wZ19wYWlycysrOwogCX0KIAliZl9zZXQobHBmY19wb3N0X3NnbF9wYWdlc194cmksIHNnbCwgeHJpdGFnX3N0YXJ0KTsKLQlwZ19wYWlycyA9IChwZ19wYWlycyA+IDApID8gKHBnX3BhaXJzIC0gMSkgOiBwZ19wYWlyczsKLQliZl9zZXQobHBmY19wb3N0X3NnbF9wYWdlc194cmljbnQsIHNnbCwgcGdfcGFpcnMpOworCWJmX3NldChscGZjX3Bvc3Rfc2dsX3BhZ2VzX3hyaWNudCwgc2dsLCBlbHNfeHJpX2NudCk7CiAJLyogUGVyZm9ybSBlbmRpYW4gY29udmVyc2lvbiBpZiBuZWNlc3NhcnkgKi8KIAlzZ2wtPndvcmQwID0gY3B1X3RvX2xlMzIoc2dsLT53b3JkMCk7CiAKQEAgLTEwNjA3LDE1ICsxMDYxMyw3IEBACiAJCWxwZmNfc2xpNF9tYm94X2NtZF9mcmVlKHBoYmEsIG1ib3gpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KIAkvKiBHZXQgdGhlIGZpcnN0IFNHRSBlbnRyeSBmcm9tIHRoZSBub24tZW1iZWRkZWQgRE1BIG1lbW9yeSAqLwotCWlmICh1bmxpa2VseSghbWJveC0+c2dlX2FycmF5KSkgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YLAotCQkJCSIyNTY1IEZhaWxlZCB0byBnZXQgdGhlIG5vbi1lbWJlZGRlZCBTR0UgIgotCQkJCSJ2aXJ0dWFsIGFkZHJlc3NcbiIpOwotCQlscGZjX3NsaTRfbWJveF9jbWRfZnJlZShwaGJhLCBtYm94KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXZpcmFkZHIgPSBtYm94LT5zZ2VfYXJyYXktPmFkZHJbMF07CiAKIAkvKiBTZXQgdXAgdGhlIFNHTCBwYWdlcyBpbiB0aGUgbm9uLWVtYmVkZGVkIERNQSBwYWdlcyAqLwpAQCAtMTA4MDIsNiArMTA4MDAsMTA1IEBACiB9CiAKIC8qKgorICogbHBmY191cGRhdGVfcmN2X3RpbWVfc3RhbXAgLSBVcGRhdGUgdnBvcnQncyByY3Ygc2VxIHRpbWUgc3RhbXAKKyAqIEB2cG9ydDogVGhlIHZwb3J0IHRvIHdvcmsgb24uCisgKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSByZWNlaXZlIHNlcXVlbmNlIHRpbWUgc3RhbXAgZm9yIHRoaXMgdnBvcnQuIFRoZQorICogcmVjZWl2ZSBzZXF1ZW5jZSB0aW1lIHN0YW1wIGluZGljYXRlcyB0aGUgdGltZSB0aGF0IHRoZSBsYXN0IGZyYW1lIG9mIHRoZQorICogdGhlIHNlcXVlbmNlIHRoYXQgaGFzIGJlZW4gaWRsZSBmb3IgdGhlIGxvbmdlc3QgYW1vdW50IG9mIHRpbWUgd2FzIHJlY2VpdmVkLgorICogdGhlIGRyaXZlciB1c2VzIHRoaXMgdGltZSBzdGFtcCB0byBpbmRpY2F0ZSBpZiBhbnkgcmVjZWl2ZWQgc2VxdWVuY2VzIGhhdmUKKyAqIHRpbWVkIG91dC4KKyAqKi8KK3ZvaWQKK2xwZmNfdXBkYXRlX3Jjdl90aW1lX3N0YW1wKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCkKK3sKKwlzdHJ1Y3QgbHBmY19kbWFidWYgKmhfYnVmOworCXN0cnVjdCBoYnFfZG1hYnVmICpkbWFidWYgPSBOVUxMOworCisJLyogZ2V0IHRoZSBvbGRlc3Qgc2VxdWVuY2Ugb24gdGhlIHJjdiBsaXN0ICovCisJaF9idWYgPSBsaXN0X2dldF9maXJzdCgmdnBvcnQtPnJjdl9idWZmZXJfbGlzdCwKKwkJCSAgICAgICBzdHJ1Y3QgbHBmY19kbWFidWYsIGxpc3QpOworCWlmICghaF9idWYpCisJCXJldHVybjsKKwlkbWFidWYgPSBjb250YWluZXJfb2YoaF9idWYsIHN0cnVjdCBoYnFfZG1hYnVmLCBoYnVmKTsKKwl2cG9ydC0+cmN2X2J1ZmZlcl90aW1lX3N0YW1wID0gZG1hYnVmLT50aW1lX3N0YW1wOworfQorCisvKioKKyAqIGxwZmNfY2xlYW51cF9yY3ZfYnVmZmVycyAtIENsZWFucyB1cCBhbGwgb3V0c3RhbmRpbmcgcmVjZWl2ZSBzZXF1ZW5jZXMuCisgKiBAdnBvcnQ6IFRoZSB2cG9ydCB0aGF0IHRoZSByZWNlaXZlZCBzZXF1ZW5jZXMgd2VyZSBzZW50IHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFsbCBvdXRzdGFuZGluZyByZWNlaXZlZCBzZXF1ZW5jZXMuIFRoaXMgaXMgY2FsbGVkCisgKiBieSB0aGUgZHJpdmVyIHdoZW4gYSBsaW5rIGV2ZW50IG9yIHVzZXIgYWN0aW9uIGludmFsaWRhdGVzIGFsbCB0aGUgcmVjZWl2ZWQKKyAqIHNlcXVlbmNlcy4KKyAqKi8KK3ZvaWQKK2xwZmNfY2xlYW51cF9yY3ZfYnVmZmVycyhzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQpCit7CisJc3RydWN0IGxwZmNfZG1hYnVmICpoX2J1ZiwgKmhuZXh0OworCXN0cnVjdCBscGZjX2RtYWJ1ZiAqZF9idWYsICpkbmV4dDsKKwlzdHJ1Y3QgaGJxX2RtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKKworCS8qIHN0YXJ0IHdpdGggdGhlIG9sZGVzdCBzZXF1ZW5jZSBvbiB0aGUgcmN2IGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaF9idWYsIGhuZXh0LCAmdnBvcnQtPnJjdl9idWZmZXJfbGlzdCwgbGlzdCkgeworCQlkbWFidWYgPSBjb250YWluZXJfb2YoaF9idWYsIHN0cnVjdCBoYnFfZG1hYnVmLCBoYnVmKTsKKwkJbGlzdF9kZWxfaW5pdCgmZG1hYnVmLT5oYnVmLmxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZF9idWYsIGRuZXh0LAorCQkJCQkgJmRtYWJ1Zi0+ZGJ1Zi5saXN0LCBsaXN0KSB7CisJCQlsaXN0X2RlbF9pbml0KCZkX2J1Zi0+bGlzdCk7CisJCQlscGZjX2luX2J1Zl9mcmVlKHZwb3J0LT5waGJhLCBkX2J1Zik7CisJCX0KKwkJbHBmY19pbl9idWZfZnJlZSh2cG9ydC0+cGhiYSwgJmRtYWJ1Zi0+ZGJ1Zik7CisJfQorfQorCisvKioKKyAqIGxwZmNfcmN2X3NlcV9jaGVja19lZHRvdiAtIENsZWFucyB1cCB0aW1lZCBvdXQgcmVjZWl2ZSBzZXF1ZW5jZXMuCisgKiBAdnBvcnQ6IFRoZSB2cG9ydCB0aGF0IHRoZSByZWNlaXZlZCBzZXF1ZW5jZXMgd2VyZSBzZW50IHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIGFueSByZWNlaXZlZCBzZXF1ZW5jZXMgaGF2ZSB0aW1lZCBvdXQgYnkKKyAqIGZpcnN0IGNoZWNraW5nIHRoZSB2cG9ydCdzIHJjdl9idWZmZXJfdGltZV9zdGFtcC4gSWYgdGhpcyB0aW1lX3N0YW1wCisgKiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdGltZWQgb3V0IHNlcXVlbmNlIHRoaXMgcm91dGluZSB3aWxsCisgKiBnbyB0aHJvdWdoIHRoZSByZWNlaXZlZCBzZXF1ZW5jZXMgb25lIGF0IGEgdGltZSBmcm9tIG1vc3QgaW5hY3RpdmUgdG8gbW9zdAorICogYWN0aXZlIHRvIGRldGVybWluZSB3aGljaCBvbmVzIG5lZWQgdG8gYmUgY2xlYW5lZCB1cC4gT25jZSBpdCBoYXMgZGV0ZXJtaW5lZAorICogdGhhdCBhIHNlcXVlbmNlIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAgaXQgd2lsbCBzaW1wbHkgZnJlZSB1cCB0aGUgcmVzb3VyY2VzCisgKiB3aXRob3V0IHNlbmRpbmcgYW4gYWJvcnQuCisgKiovCit2b2lkCitscGZjX3Jjdl9zZXFfY2hlY2tfZWR0b3Yoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0KQoreworCXN0cnVjdCBscGZjX2RtYWJ1ZiAqaF9idWYsICpobmV4dDsKKwlzdHJ1Y3QgbHBmY19kbWFidWYgKmRfYnVmLCAqZG5leHQ7CisJc3RydWN0IGhicV9kbWFidWYgKmRtYWJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBhYm9ydF9jb3VudCA9IDA7CisKKwl0aW1lb3V0ID0gKG1zZWNzX3RvX2ppZmZpZXModnBvcnQtPnBoYmEtPmZjX2VkdG92KSArCisJCSAgIHZwb3J0LT5yY3ZfYnVmZmVyX3RpbWVfc3RhbXApOworCWlmIChsaXN0X2VtcHR5KCZ2cG9ydC0+cmN2X2J1ZmZlcl9saXN0KSB8fAorCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJcmV0dXJuOworCS8qIHN0YXJ0IHdpdGggdGhlIG9sZGVzdCBzZXF1ZW5jZSBvbiB0aGUgcmN2IGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaF9idWYsIGhuZXh0LCAmdnBvcnQtPnJjdl9idWZmZXJfbGlzdCwgbGlzdCkgeworCQlkbWFidWYgPSBjb250YWluZXJfb2YoaF9idWYsIHN0cnVjdCBoYnFfZG1hYnVmLCBoYnVmKTsKKwkJdGltZW91dCA9IChtc2Vjc190b19qaWZmaWVzKHZwb3J0LT5waGJhLT5mY19lZHRvdikgKworCQkJICAgZG1hYnVmLT50aW1lX3N0YW1wKTsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJCWFib3J0X2NvdW50Kys7CisJCWxpc3RfZGVsX2luaXQoJmRtYWJ1Zi0+aGJ1Zi5saXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRfYnVmLCBkbmV4dCwKKwkJCQkJICZkbWFidWYtPmRidWYubGlzdCwgbGlzdCkgeworCQkJbGlzdF9kZWxfaW5pdCgmZF9idWYtPmxpc3QpOworCQkJbHBmY19pbl9idWZfZnJlZSh2cG9ydC0+cGhiYSwgZF9idWYpOworCQl9CisJCWxwZmNfaW5fYnVmX2ZyZWUodnBvcnQtPnBoYmEsICZkbWFidWYtPmRidWYpOworCX0KKwlpZiAoYWJvcnRfY291bnQpCisJCWxwZmNfdXBkYXRlX3Jjdl90aW1lX3N0YW1wKHZwb3J0KTsKK30KKworLyoqCiAgKiBscGZjX2ZjX2ZyYW1lX2FkZCAtIEFkZHMgYSBmcmFtZSB0byB0aGUgdnBvcnQncyBsaXN0IG9mIHJlY2VpdmVkIHNlcXVlbmNlcwogICogQGRtYWJ1ZjogcG9pbnRlciB0byBhIGRtYWJ1ZiB0aGF0IGRlc2NyaWJlcyB0aGUgaGRyIGFuZCBkYXRhIG9mIHRoZSBGQyBmcmFtZQogICoKQEAgLTEwODIzLDYgKzEwOTIwLDggQEAKIAlzdHJ1Y3QgaGJxX2RtYWJ1ZiAqc2VxX2RtYWJ1ZiA9IE5VTEw7CiAJc3RydWN0IGhicV9kbWFidWYgKnRlbXBfZG1hYnVmID0gTlVMTDsKIAorCUlOSVRfTElTVF9IRUFEKCZkbWFidWYtPmRidWYubGlzdCk7CisJZG1hYnVmLT50aW1lX3N0YW1wID0gamlmZmllczsKIAluZXdfaGRyID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKilkbWFidWYtPmhidWYudmlydDsKIAkvKiBVc2UgdGhlIGhkcl9idWYgdG8gZmluZCB0aGUgc2VxdWVuY2UgdGhhdCB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhfYnVmLCAmdnBvcnQtPnJjdl9idWZmZXJfbGlzdCwgbGlzdCkgewpAQCAtMTA4NDEsMTMgKzEwOTQwLDIxIEBACiAJCSAqIFF1ZXVlIHRoZSBidWZmZXIgb24gdGhlIHZwb3J0J3MgcmN2X2J1ZmZlcl9saXN0LgogCQkgKi8KIAkJbGlzdF9hZGRfdGFpbCgmZG1hYnVmLT5oYnVmLmxpc3QsICZ2cG9ydC0+cmN2X2J1ZmZlcl9saXN0KTsKKwkJbHBmY191cGRhdGVfcmN2X3RpbWVfc3RhbXAodnBvcnQpOwogCQlyZXR1cm4gZG1hYnVmOwogCX0KIAl0ZW1wX2hkciA9IHNlcV9kbWFidWYtPmhidWYudmlydDsKIAlpZiAobmV3X2hkci0+Zmhfc2VxX2NudCA8IHRlbXBfaGRyLT5maF9zZXFfY250KSB7Ci0JCWxpc3RfYWRkKCZzZXFfZG1hYnVmLT5kYnVmLmxpc3QsICZkbWFidWYtPmRidWYubGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnNlcV9kbWFidWYtPmhidWYubGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmRtYWJ1Zi0+aGJ1Zi5saXN0LCAmdnBvcnQtPnJjdl9idWZmZXJfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmRtYWJ1Zi0+ZGJ1Zi5saXN0LCAmc2VxX2RtYWJ1Zi0+ZGJ1Zi5saXN0KTsKKwkJbHBmY191cGRhdGVfcmN2X3RpbWVfc3RhbXAodnBvcnQpOwogCQlyZXR1cm4gZG1hYnVmOwogCX0KKwkvKiBtb3ZlIHRoaXMgc2VxdWVuY2UgdG8gdGhlIHRhaWwgdG8gaW5kaWNhdGUgYSB5b3VuZyBzZXF1ZW5jZSAqLworCWxpc3RfbW92ZV90YWlsKCZzZXFfZG1hYnVmLT5oYnVmLmxpc3QsICZ2cG9ydC0+cmN2X2J1ZmZlcl9saXN0KTsKKwlzZXFfZG1hYnVmLT50aW1lX3N0YW1wID0gamlmZmllczsKKwlscGZjX3VwZGF0ZV9yY3ZfdGltZV9zdGFtcCh2cG9ydCk7CiAJLyogZmluZCB0aGUgY29ycmVjdCBwbGFjZSBpbiB0aGUgc2VxdWVuY2UgdG8gaW5zZXJ0IHRoaXMgZnJhbWUgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZF9idWYsICZzZXFfZG1hYnVmLT5kYnVmLmxpc3QsIGxpc3QpIHsKIAkJdGVtcF9kbWFidWYgPSBjb250YWluZXJfb2YoZF9idWYsIHN0cnVjdCBoYnFfZG1hYnVmLCBkYnVmKTsKQEAgLTEwODY1LDYgKzEwOTcyLDIxMCBAQAogfQogCiAvKioKKyAqIGxwZmNfc2xpNF9hYm9ydF9wYXJ0aWFsX3NlcSAtIEFib3J0IHBhcnRpYWxseSBhc3NlbWJsZWQgdW5zb2wgc2VxdWVuY2UKKyAqIEB2cG9ydDogcG9pbnRlciB0byBhIHZpdHVyYWwgcG9ydAorICogQGRtYWJ1ZjogcG9pbnRlciB0byBhIGRtYWJ1ZiB0aGF0IGRlc2NyaWJlcyB0aGUgRkMgc2VxdWVuY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGFib3J0IGZyb20gdGhlIHBhcnRpYWxseSBhc3NlbWJlZCBzZXF1ZW5jZSwgZGVzY3JpYmVkCisgKiBieSB0aGUgaW5mb3JtYXRpb24gZnJvbSBiYXNpYyBhYmJvcnQgQGRtYWJ1Zi4gSXQgY2hlY2tzIHRvIHNlZSB3aGV0aGVyIHN1Y2gKKyAqIHBhcnRpYWxseSBhc3NlbWJsZWQgc2VxdWVuY2UgaGVsZCBieSB0aGUgZHJpdmVyLiBJZiBzbywgaXQgc2hhbGwgZnJlZSB1cCBhbGwKKyAqIHRoZSBmcmFtZXMgZnJvbSB0aGUgcGFydGlhbGx5IGFzc2VtYmxlZCBzZXF1ZW5jZS4KKyAqCisgKiBSZXR1cm4KKyAqIHRydWUgIC0tIGlmIHRoZXJlIGlzIG1hdGNoaW5nIHBhcnRpYWxseSBhc3NlbWJsZWQgc2VxdWVuY2UgcHJlc2VudCBhbmQgYWxsCisgKiAgICAgICAgICB0aGUgZnJhbWVzIGZyZWVkIHdpdGggdGhlIHNlcXVlbmNlOworICogZmFsc2UgLS0gaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgcGFydGlhbGx5IGFzc2VtYmxlZCBzZXF1ZW5jZSBwcmVzZW50IHNvCisgKiAgICAgICAgICBub3RoaW5nIGdvdCBhYm9ydGVkIGluIHRoZSBsb3dlciBsYXllciBkcml2ZXIKKyAqKi8KK3N0YXRpYyBib29sCitscGZjX3NsaTRfYWJvcnRfcGFydGlhbF9zZXEoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAorCQkJICAgIHN0cnVjdCBoYnFfZG1hYnVmICpkbWFidWYpCit7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqbmV3X2hkcjsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICp0ZW1wX2hkcjsKKwlzdHJ1Y3QgbHBmY19kbWFidWYgKmRfYnVmLCAqbl9idWYsICpoX2J1ZjsKKwlzdHJ1Y3QgaGJxX2RtYWJ1ZiAqc2VxX2RtYWJ1ZiA9IE5VTEw7CisKKwkvKiBVc2UgdGhlIGhkcl9idWYgdG8gZmluZCB0aGUgc2VxdWVuY2UgdGhhdCBtYXRjaGVzIHRoaXMgZnJhbWUgKi8KKwlJTklUX0xJU1RfSEVBRCgmZG1hYnVmLT5kYnVmLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkbWFidWYtPmhidWYubGlzdCk7CisJbmV3X2hkciA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopZG1hYnVmLT5oYnVmLnZpcnQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShoX2J1ZiwgJnZwb3J0LT5yY3ZfYnVmZmVyX2xpc3QsIGxpc3QpIHsKKwkJdGVtcF9oZHIgPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKWhfYnVmLT52aXJ0OworCQlpZiAoKHRlbXBfaGRyLT5maF9zZXFfaWQgIT0gbmV3X2hkci0+Zmhfc2VxX2lkKSB8fAorCQkgICAgKHRlbXBfaGRyLT5maF9veF9pZCAhPSBuZXdfaGRyLT5maF9veF9pZCkgfHwKKwkJICAgIChtZW1jbXAoJnRlbXBfaGRyLT5maF9zX2lkLCAmbmV3X2hkci0+Zmhfc19pZCwgMykpKQorCQkJY29udGludWU7CisJCS8qIGZvdW5kIGEgcGVuZGluZyBzZXF1ZW5jZSB0aGF0IG1hdGNoZXMgdGhpcyBmcmFtZSAqLworCQlzZXFfZG1hYnVmID0gY29udGFpbmVyX29mKGhfYnVmLCBzdHJ1Y3QgaGJxX2RtYWJ1ZiwgaGJ1Zik7CisJCWJyZWFrOworCX0KKworCS8qIEZyZWUgdXAgYWxsIHRoZSBmcmFtZXMgZnJvbSB0aGUgcGFydGlhbGx5IGFzc2VtYmxlZCBzZXF1ZW5jZSAqLworCWlmIChzZXFfZG1hYnVmKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkX2J1Ziwgbl9idWYsCisJCQkJCSAmc2VxX2RtYWJ1Zi0+ZGJ1Zi5saXN0LCBsaXN0KSB7CisJCQlsaXN0X2RlbF9pbml0KCZkX2J1Zi0+bGlzdCk7CisJCQlscGZjX2luX2J1Zl9mcmVlKHZwb3J0LT5waGJhLCBkX2J1Zik7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBscGZjX3NsaTRfc2VxX2Fib3J0X2FjY19jbXBsIC0gQWNjZXB0IHNlcSBhYm9ydCBpb2NiIGNvbXBsZXRlIGhhbmRsZXIKKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqIEBjbWRfaW9jYnE6IHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgaW9jYnEgc3RydWN0dXJlLgorICogQHJzcF9pb2NicTogcG9pbnRlciB0byB0aGUgcmVzcG9uc2UgaW9jYnEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgc2VxdWVuY2UgYWJvcnQgYWNjZXB0IGlvY2IgY29tbWFuZCBjb21wbGV0ZQorICogZXZlbnQuIEl0IHByb3Blcmx5IHJlbGVhc2VzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIHRoZSBzZXF1ZW5jZSBhYm9ydAorICogYWNjZXB0IGlvY2IuCisgKiovCitzdGF0aWMgdm9pZAorbHBmY19zbGk0X3NlcV9hYm9ydF9hY2NfY21wbChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCisJCQkgICAgIHN0cnVjdCBscGZjX2lvY2JxICpjbWRfaW9jYnEsCisJCQkgICAgIHN0cnVjdCBscGZjX2lvY2JxICpyc3BfaW9jYnEpCit7CisJaWYgKGNtZF9pb2NicSkKKwkJbHBmY19zbGlfcmVsZWFzZV9pb2NicShwaGJhLCBjbWRfaW9jYnEpOworfQorCisvKioKKyAqIGxwZmNfc2xpNF9zZXFfYWJvcnRfYWNjIC0gQWNjZXB0IHNlcXVlbmNlIGFib3J0CisgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCisgKiBAZmNfaGRyOiBwb2ludGVyIHRvIGEgRkMgZnJhbWUgaGVhZGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBiYXNpYyBhY2NlcHQgdG8gYSBwcmV2aW91cyB1bnNvbCBzZXF1ZW5jZSBhYm9ydAorICogZXZlbnQgYWZ0ZXIgYWJvcnRpbmcgdGhlIHNlcXVlbmNlIGhhbmRsaW5nLgorICoqLworc3RhdGljIHZvaWQKK2xwZmNfc2xpNF9zZXFfYWJvcnRfYWNjKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwKKwkJCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZjX2hkcikKK3sKKwlzdHJ1Y3QgbHBmY19pb2NicSAqY3Rpb2NiID0gTlVMTDsKKwlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqbmRscDsKKwl1aW50MTZfdCBveGlkLCByeGlkOworCXVpbnQzMl90IHNpZCwgZmN0bDsKKwlJT0NCX3QgKmljbWQ7CisKKwlpZiAoIWxwZmNfaXNfbGlua191cChwaGJhKSkKKwkJcmV0dXJuOworCisJc2lkID0gc2xpNF9zaWRfZnJvbV9mY19oZHIoZmNfaGRyKTsKKwlveGlkID0gYmUxNl90b19jcHUoZmNfaGRyLT5maF9veF9pZCk7CisJcnhpZCA9IGJlMTZfdG9fY3B1KGZjX2hkci0+ZmhfcnhfaWQpOworCisJbmRscCA9IGxwZmNfZmluZG5vZGVfZGlkKHBoYmEtPnBwb3J0LCBzaWQpOworCWlmICghbmRscCkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRUxTLAorCQkJCSIxMjY4IEZpbmQgbmRscCByZXR1cm5lZCBOVUxMIGZvciBveGlkOngleCAiCisJCQkJIlNJRDp4JXhcbiIsIG94aWQsIHNpZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGFjYyBpb2NiICovCisJY3Rpb2NiID0gbHBmY19zbGlfZ2V0X2lvY2JxKHBoYmEpOworCWlmICghY3Rpb2NiKQorCQlyZXR1cm47CisKKwkvKiBFeHRyYWN0IHRoZSBGX0NUTCBmaWVsZCBmcm9tIEZDX0hEUiAqLworCWZjdGwgPSBzbGk0X2ZjdGxfZnJvbV9mY19oZHIoZmNfaGRyKTsKKworCWljbWQgPSAmY3Rpb2NiLT5pb2NiOworCWljbWQtPnVuLnhzZXE2NC5iZGwuYmRlU2l6ZSA9IDA7CisJaWNtZC0+dW4ueHNlcTY0LmJkbC51bHBJb1RhZzMyID0gMDsKKwlpY21kLT51bi54c2VxNjQudzUuaGNzdy5EZmN0bCA9IDA7CisJaWNtZC0+dW4ueHNlcTY0Lnc1Lmhjc3cuUmN0bCA9IEZDX1JDVExfQkFfQUNDOworCWljbWQtPnVuLnhzZXE2NC53NS5oY3N3LlR5cGUgPSBGQ19UWVBFX0JMUzsKKworCS8qIEZpbGwgaW4gdGhlIHJlc3Qgb2YgaW9jYiBmaWVsZHMgKi8KKwlpY21kLT51bHBDb21tYW5kID0gQ01EX1hNSVRfQkxTX1JTUDY0X0NYOworCWljbWQtPnVscEJkZUNvdW50ID0gMDsKKwlpY21kLT51bHBMZSA9IDE7CisJaWNtZC0+dWxwQ2xhc3MgPSBDTEFTUzM7CisJaWNtZC0+dWxwQ29udGV4dCA9IG5kbHAtPm5scF9ycGk7CisKKwljdGlvY2ItPmlvY2JfY21wbCA9IE5VTEw7CisJY3Rpb2NiLT52cG9ydCA9IHBoYmEtPnBwb3J0OworCWN0aW9jYi0+aW9jYl9jbXBsID0gbHBmY19zbGk0X3NlcV9hYm9ydF9hY2NfY21wbDsKKworCWlmIChmY3RsICYgRkNfRkNfRVhfQ1RYKSB7CisJCS8qIEFCVFMgc2VudCBieSByZXNwb25kZXIgdG8gQ1QgZXhjaGFuZ2UsIGNvbnN0cnVjdGlvbgorCQkgKiBvZiBCQV9BQ0Mgd2lsbCB1c2UgT1hfSUQgZnJvbSBBQlRTIGZvciB0aGUgWFJJX1RBRworCQkgKiBmaWVsZCBhbmQgUlhfSUQgZnJvbSBBQlRTIGZvciBSWF9JRCBmaWVsZC4KKwkJICovCisJCWJmX3NldChscGZjX2FidHNfb3JpZywgJmljbWQtPnVuLmJsc19hY2MsIExQRkNfQUJUU19VTlNPTF9SU1ApOworCQliZl9zZXQobHBmY19hYnRzX3J4aWQsICZpY21kLT51bi5ibHNfYWNjLCByeGlkKTsKKwkJY3Rpb2NiLT5zbGk0X3hyaXRhZyA9IG94aWQ7CisJfSBlbHNlIHsKKwkJLyogQUJUUyBzZW50IGJ5IGluaXRpYXRvciB0byBDVCBleGNoYW5nZSwgY29uc3RydWN0aW9uCisJCSAqIG9mIEJBX0FDQyB3aWxsIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgWFJJIGFzIGZvciB0aGUKKwkJICogWFJJX1RBRyBhbmQgUlhfSUQgZmllbGRzLgorCQkgKi8KKwkJYmZfc2V0KGxwZmNfYWJ0c19vcmlnLCAmaWNtZC0+dW4uYmxzX2FjYywgTFBGQ19BQlRTX1VOU09MX0lOVCk7CisJCWJmX3NldChscGZjX2FidHNfcnhpZCwgJmljbWQtPnVuLmJsc19hY2MsIE5PX1hSSSk7CisJCWN0aW9jYi0+c2xpNF94cml0YWcgPSBOT19YUkk7CisJfQorCWJmX3NldChscGZjX2FidHNfb3hpZCwgJmljbWQtPnVuLmJsc19hY2MsIG94aWQpOworCisJLyogWG1pdCBDVCBhYnRzIGFjY2VwdCBvbiBleGNoYW5nZSA8eGlkPiAqLworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19FTFMsCisJCQkiMTIwMCBYbWl0IENUIEFCVFMgQUNDIG9uIGV4Y2hhbmdlIHgleCBEYXRhOiB4JXhcbiIsCisJCQlDTURfWE1JVF9CTFNfUlNQNjRfQ1gsIHBoYmEtPmxpbmtfc3RhdGUpOworCWxwZmNfc2xpX2lzc3VlX2lvY2IocGhiYSwgTFBGQ19FTFNfUklORywgY3Rpb2NiLCAwKTsKK30KKworLyoqCisgKiBscGZjX3NsaTRfaGFuZGxlX3Vuc29sX2Fib3J0IC0gSGFuZGxlIHNsaS00IHVuc29saWNpdGVkIGFib3J0IGV2ZW50CisgKiBAdnBvcnQ6IFBvaW50ZXIgdG8gdGhlIHZwb3J0IG9uIHdoaWNoIHRoaXMgc2VxdWVuY2Ugd2FzIHJlY2VpdmVkCisgKiBAZG1hYnVmOiBwb2ludGVyIHRvIGEgZG1hYnVmIHRoYXQgZGVzY3JpYmVzIHRoZSBGQyBzZXF1ZW5jZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBTTEktNCB1bnNvbGljaXRlZCBhYm9ydCBldmVudC4gSWYgdGhlIHVuc29saWNpdGVkCisgKiByZWNlaXZlIHNlcXVlbmNlIGlzIG9ubHkgcGFydGlhbGx5IGFzc2VtYmVkIGJ5IHRoZSBkcml2ZXIsIGl0IHNoYWxsIGFib3J0CisgKiB0aGUgcGFydGlhbGx5IGFzc2VtYmxlZCBmcmFtZXMgZm9yIHRoZSBzZXF1ZW5jZS4gT3RoZXJ3aXNlLCBpZiB0aGUKKyAqIHVuc29saWNpdGVkIHJlY2VpdmUgc2VxdWVuY2UgaGFzIGJlZW4gY29tcGxldGVseSBhc3NlbWJsZWQgYW5kIHBhc3NlZCB0bworICogdGhlIFVwcGVyIExheWVyIFByb3RvY29sIChVUEwpLCBpdCB0aGVuIG1hcmsgdGhlIHBlciBveGlkIHN0YXR1cyBmb3IgdGhlCisgKiB1bnNvbGljaXRlZCBzZXF1ZW5jZSBoYXMgYmVlbiBhYm9ydGVkLiBBZnRlciB0aGF0LCBpdCB3aWxsIGlzc3VlIGEgYmFzaWMKKyAqIGFjY2VwdCB0byBhY2NlcHQgdGhlIGFib3J0LgorICoqLwordm9pZAorbHBmY19zbGk0X2hhbmRsZV91bnNvbF9hYm9ydChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCisJCQkgICAgIHN0cnVjdCBoYnFfZG1hYnVmICpkbWFidWYpCit7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciBmY19oZHI7CisJdWludDMyX3QgZmN0bDsKKwlib29sIGFidHNfcGFyOworCisJLyogTWFrZSBhIGNvcHkgb2YgZmNfaGRyIGJlZm9yZSB0aGUgZG1hYnVmIGJlaW5nIHJlbGVhc2VkICovCisJbWVtY3B5KCZmY19oZHIsIGRtYWJ1Zi0+aGJ1Zi52aXJ0LCBzaXplb2Yoc3RydWN0IGZjX2ZyYW1lX2hlYWRlcikpOworCWZjdGwgPSBzbGk0X2ZjdGxfZnJvbV9mY19oZHIoJmZjX2hkcik7CisKKwlpZiAoZmN0bCAmIEZDX0ZDX0VYX0NUWCkgeworCQkvKgorCQkgKiBBQlRTIHNlbnQgYnkgcmVzcG9uZGVyIHRvIGV4Y2hhbmdlLCBqdXN0IGZyZWUgdGhlIGJ1ZmZlcgorCQkgKi8KKwkJbHBmY19pbl9idWZfZnJlZShwaGJhLCAmZG1hYnVmLT5kYnVmKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBQlRTIHNlbnQgYnkgaW5pdGlhdG9yIHRvIGV4Y2hhbmdlLCBuZWVkIHRvIGRvIGNsZWFudXAKKwkJICovCisJCS8qIFRyeSB0byBhYm9ydCBwYXJ0aWFsbHkgYXNzZW1ibGVkIHNlcSAqLworCQlhYnRzX3BhciA9IGxwZmNfc2xpNF9hYm9ydF9wYXJ0aWFsX3NlcSh2cG9ydCwgZG1hYnVmKTsKKworCQkvKiBTZW5kIGFib3J0IHRvIFVMUCBpZiBwYXJ0aWFsbHkgc2VxIGFib3J0IGZhaWxlZCAqLworCQlpZiAoYWJ0c19wYXIgPT0gZmFsc2UpCisJCQlscGZjX3NsaTRfc2VuZF9zZXFfdG9fdWxwKHZwb3J0LCBkbWFidWYpOworCQllbHNlCisJCQlscGZjX2luX2J1Zl9mcmVlKHBoYmEsICZkbWFidWYtPmRidWYpOworCX0KKwkvKiBTZW5kIGJhc2ljIGFjY2VwdCAoQkFfQUNDKSB0byB0aGUgYWJvcnQgcmVxdWVzdGVyICovCisJbHBmY19zbGk0X3NlcV9hYm9ydF9hY2MocGhiYSwgJmZjX2hkcik7Cit9CisKKy8qKgogICogbHBmY19zZXFfY29tcGxldGUgLSBJbmRpY2F0ZXMgaWYgYSBzZXF1ZW5jZSBpcyBjb21wbGV0ZQogICogQGRtYWJ1ZjogcG9pbnRlciB0byBhIGRtYWJ1ZiB0aGF0IGRlc2NyaWJlcyB0aGUgRkMgc2VxdWVuY2UKICAqCkBAIC0xMDkzNSwxMCArMTEyNDYsOSBAQAogCWZjX2hkciA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopc2VxX2RtYWJ1Zi0+aGJ1Zi52aXJ0OwogCS8qIHJlbW92ZSBmcm9tIHJlY2VpdmUgYnVmZmVyIGxpc3QgKi8KIAlsaXN0X2RlbF9pbml0KCZzZXFfZG1hYnVmLT5oYnVmLmxpc3QpOworCWxwZmNfdXBkYXRlX3Jjdl90aW1lX3N0YW1wKHZwb3J0KTsKIAkvKiBnZXQgdGhlIFJlbW90ZSBQb3J0J3MgU0lEICovCi0Jc2lkID0gKGZjX2hkci0+Zmhfc19pZFswXSA8PCAxNiB8Ci0JICAgICAgIGZjX2hkci0+Zmhfc19pZFsxXSA8PCA4IHwKLQkgICAgICAgZmNfaGRyLT5maF9zX2lkWzJdKTsKKwlzaWQgPSBzbGk0X3NpZF9mcm9tX2ZjX2hkcihmY19oZHIpOwogCS8qIEdldCBhbiBpb2NicSBzdHJ1Y3QgdG8gZmlsbCBpbi4gKi8KIAlmaXJzdF9pb2NicSA9IGxwZmNfc2xpX2dldF9pb2NicSh2cG9ydC0+cGhiYSk7CiAJaWYgKGZpcnN0X2lvY2JxKSB7CkBAIC0xMDk1Nyw3ICsxMTI2Nyw4IEBACiAJCQkJCQkJTFBGQ19EQVRBX0JVRl9TSVpFOwogCQlmaXJzdF9pb2NicS0+aW9jYi51bi5yY3ZlbHMucmVtb3RlSUQgPSBzaWQ7CiAJCWZpcnN0X2lvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLmFjY19sZW4gKz0KLQkJCQliZl9nZXQobHBmY19yY3FlX2xlbmd0aCwgJnNlcV9kbWFidWYtPnJjcWUpOworCQkJCWJmX2dldChscGZjX3JjcWVfbGVuZ3RoLAorCQkJCSAgICAgICAmc2VxX2RtYWJ1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCk7CiAJfQogCWlvY2JxID0gZmlyc3RfaW9jYnE7CiAJLyoKQEAgLTEwOTc1LDcgKzExMjg2LDggQEAKIAkJCWlvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLmJkZTIudHVzLmYuYmRlU2l6ZSA9CiAJCQkJCQkJTFBGQ19EQVRBX0JVRl9TSVpFOwogCQkJZmlyc3RfaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbiArPQotCQkJCWJmX2dldChscGZjX3JjcWVfbGVuZ3RoLCAmc2VxX2RtYWJ1Zi0+cmNxZSk7CisJCQkJYmZfZ2V0KGxwZmNfcmNxZV9sZW5ndGgsCisJCQkJICAgICAgICZzZXFfZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKTsKIAkJfSBlbHNlIHsKIAkJCWlvY2JxID0gbHBmY19zbGlfZ2V0X2lvY2JxKHZwb3J0LT5waGJhKTsKIAkJCWlmICghaW9jYnEpIHsKQEAgLTEwOTk0LDcgKzExMzA2LDggQEAKIAkJCWlvY2JxLT5pb2NiLnVuLmNvbnQ2NFswXS50dXMuZi5iZGVTaXplID0KIAkJCQkJCQlMUEZDX0RBVEFfQlVGX1NJWkU7CiAJCQlmaXJzdF9pb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5hY2NfbGVuICs9Ci0JCQkJYmZfZ2V0KGxwZmNfcmNxZV9sZW5ndGgsICZzZXFfZG1hYnVmLT5yY3FlKTsKKwkJCQliZl9nZXQobHBmY19yY3FlX2xlbmd0aCwKKwkJCQkgICAgICAgJnNlcV9kbWFidWYtPmNxX2V2ZW50LmNxZS5yY3FlX2NtcGwpOwogCQkJaW9jYnEtPmlvY2IudW4ucmN2ZWxzLnJlbW90ZUlEID0gc2lkOwogCQkJbGlzdF9hZGRfdGFpbCgmaW9jYnEtPmxpc3QsICZmaXJzdF9pb2NicS0+bGlzdCk7CiAJCX0KQEAgLTExMDAyLDYgKzExMzE1LDQzIEBACiAJcmV0dXJuIGZpcnN0X2lvY2JxOwogfQogCitzdGF0aWMgdm9pZAorbHBmY19zbGk0X3NlbmRfc2VxX3RvX3VscChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCisJCQkgIHN0cnVjdCBoYnFfZG1hYnVmICpzZXFfZG1hYnVmKQoreworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZjX2hkcjsKKwlzdHJ1Y3QgbHBmY19pb2NicSAqaW9jYnEsICpjdXJyX2lvY2IsICpuZXh0X2lvY2I7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7CisKKwlmY19oZHIgPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKXNlcV9kbWFidWYtPmhidWYudmlydDsKKwlpb2NicSA9IGxwZmNfcHJlcF9zZXEodnBvcnQsIHNlcV9kbWFidWYpOworCWlmICghaW9jYnEpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCSIyNzA3IFJpbmcgJWQgaGFuZGxlcjogRmFpbGVkIHRvIGFsbG9jYXRlICIKKwkJCQkiaW9jYiBSY3RsIHgleCBUeXBlIHgleCByZWNlaXZlZFxuIiwKKwkJCQlMUEZDX0VMU19SSU5HLAorCQkJCWZjX2hkci0+Zmhfcl9jdGwsIGZjX2hkci0+ZmhfdHlwZSk7CisJCXJldHVybjsKKwl9CisJaWYgKCFscGZjX2NvbXBsZXRlX3Vuc29sX2lvY2IocGhiYSwKKwkJCQkgICAgICAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR10sCisJCQkJICAgICAgaW9jYnEsIGZjX2hkci0+Zmhfcl9jdGwsCisJCQkJICAgICAgZmNfaGRyLT5maF90eXBlKSkKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX1NMSSwKKwkJCQkiMjU0MCBSaW5nICVkIGhhbmRsZXI6IHVuZXhwZWN0ZWQgUmN0bCAiCisJCQkJIngleCBUeXBlIHgleCByZWNlaXZlZFxuIiwKKwkJCQlMUEZDX0VMU19SSU5HLAorCQkJCWZjX2hkci0+Zmhfcl9jdGwsIGZjX2hkci0+ZmhfdHlwZSk7CisKKwkvKiBGcmVlIGlvY2IgY3JlYXRlZCBpbiBscGZjX3ByZXBfc2VxICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1cnJfaW9jYiwgbmV4dF9pb2NiLAorCQkmaW9jYnEtPmxpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY3Vycl9pb2NiLT5saXN0KTsKKwkJbHBmY19zbGlfcmVsZWFzZV9pb2NicShwaGJhLCBjdXJyX2lvY2IpOworCX0KKwlscGZjX3NsaV9yZWxlYXNlX2lvY2JxKHBoYmEsIGlvY2JxKTsKK30KKwogLyoqCiAgKiBscGZjX3NsaTRfaGFuZGxlX3JlY2VpdmVkX2J1ZmZlciAtIEhhbmRsZSByZWNlaXZlZCBidWZmZXJzIGZyb20gZmlybXdhcmUKICAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KQEAgLTExMDE0LDY3ICsxMTM2NCw1NCBAQAogICogV29ya2VyIHRocmVhZCBjYWxscyBscGZjX3NsaTRfaGFuZGxlX3JlY2VpdmVkX2J1ZmZlciwgd2hpY2ggd2lsbCBjYWxsIHRoZQogICogYXBwcm9wcmlhdGUgcmVjZWl2ZSBmdW5jdGlvbiB3aGVuIHRoZSBmaW5hbCBmcmFtZSBpbiBhIHNlcXVlbmNlIGlzIHJlY2VpdmVkLgogICoqLwotaW50Ci1scGZjX3NsaTRfaGFuZGxlX3JlY2VpdmVkX2J1ZmZlcihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit2b2lkCitscGZjX3NsaTRfaGFuZGxlX3JlY2VpdmVkX2J1ZmZlcihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCisJCQkJIHN0cnVjdCBoYnFfZG1hYnVmICpkbWFidWYpCiB7Ci0JTElTVF9IRUFEKGNtcGxxKTsKLQlzdHJ1Y3QgaGJxX2RtYWJ1ZiAqZG1hYnVmLCAqc2VxX2RtYWJ1ZjsKKwlzdHJ1Y3QgaGJxX2RtYWJ1ZiAqc2VxX2RtYWJ1ZjsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmY19oZHI7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0OwogCXVpbnQzMl90IGZjZmk7Ci0Jc3RydWN0IGxwZmNfaW9jYnEgKmlvY2JxOwotCi0JLyogQ2xlYXIgaGJhIGZsYWcgYW5kIGdldCBhbGwgcmVjZWl2ZWQgYnVmZmVycyBpbnRvIHRoZSBjbXBscSAqLwotCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCXBoYmEtPmhiYV9mbGFnICY9IH5IQkFfUkVDRUlWRV9CVUZGRVI7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmcGhiYS0+cmJfcGVuZF9saXN0LCAmY21wbHEpOwotCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKIAkvKiBQcm9jZXNzIGVhY2ggcmVjZWl2ZWQgYnVmZmVyICovCi0Jd2hpbGUgKChkbWFidWYgPSBscGZjX3NsaV9oYnFidWZfZ2V0KCZjbXBscSkpICE9IE5VTEwpIHsKLQkJZmNfaGRyID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKilkbWFidWYtPmhidWYudmlydDsKLQkJLyogY2hlY2sgdG8gc2VlIGlmIHRoaXMgYSB2YWxpZCB0eXBlIG9mIGZyYW1lICovCi0JCWlmIChscGZjX2ZjX2ZyYW1lX2NoZWNrKHBoYmEsIGZjX2hkcikpIHsKLQkJCWxwZmNfaW5fYnVmX2ZyZWUocGhiYSwgJmRtYWJ1Zi0+ZGJ1Zik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmY2ZpID0gYmZfZ2V0KGxwZmNfcmNxZV9mY2ZfaWQsICZkbWFidWYtPnJjcWUpOwotCQl2cG9ydCA9IGxwZmNfZmNfZnJhbWVfdG9fdnBvcnQocGhiYSwgZmNfaGRyLCBmY2ZpKTsKLQkJaWYgKCF2cG9ydCkgewotCQkJLyogdGhyb3cgb3V0IHRoZSBmcmFtZSAqLwotCQkJbHBmY19pbl9idWZfZnJlZShwaGJhLCAmZG1hYnVmLT5kYnVmKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIExpbmsgdGhpcyBmcmFtZSAqLwotCQlzZXFfZG1hYnVmID0gbHBmY19mY19mcmFtZV9hZGQodnBvcnQsIGRtYWJ1Zik7Ci0JCWlmICghc2VxX2RtYWJ1ZikgewotCQkJLyogdW5hYmxlIHRvIGFkZCBmcmFtZSB0byB2cG9ydCAtIHRocm93IGl0IG91dCAqLwotCQkJbHBmY19pbl9idWZfZnJlZShwaGJhLCAmZG1hYnVmLT5kYnVmKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIElmIG5vdCBsYXN0IGZyYW1lIGluIHNlcXVlbmNlIGNvbnRpbnVlIHByb2Nlc3NpbmcgZnJhbWVzLiAqLwotCQlpZiAoIWxwZmNfc2VxX2NvbXBsZXRlKHNlcV9kbWFidWYpKSB7Ci0JCQkvKgotCQkJICogV2hlbiBzYXZpbmcgb2ZmIGZyYW1lcyBwb3N0IGEgbmV3IG9uZSBhbmQgbWFyayB0aGlzCi0JCQkgKiBmcmFtZSB0byBiZSBmcmVlZCB3aGVuIGl0IGlzIGZpbmlzaGVkLgotCQkJICoqLwotCQkJbHBmY19zbGlfaGJxYnVmX2ZpbGxfaGJxcyhwaGJhLCBMUEZDX0VMU19IQlEsIDEpOwotCQkJZG1hYnVmLT50YWcgPSAtMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWZjX2hkciA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopc2VxX2RtYWJ1Zi0+aGJ1Zi52aXJ0OwotCQlpb2NicSA9IGxwZmNfcHJlcF9zZXEodnBvcnQsIHNlcV9kbWFidWYpOwotCQlpZiAoIWxwZmNfY29tcGxldGVfdW5zb2xfaW9jYihwaGJhLAotCQkJCQkgICAgICAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR10sCi0JCQkJCSAgICAgIGlvY2JxLCBmY19oZHItPmZoX3JfY3RsLAotCQkJCQkgICAgICBmY19oZHItPmZoX3R5cGUpKQotCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX1NMSSwKLQkJCQkJIjI1NDAgUmluZyAlZCBoYW5kbGVyOiB1bmV4cGVjdGVkIFJjdGwgIgotCQkJCQkieCV4IFR5cGUgeCV4IHJlY2VpdmVkXG4iLAotCQkJCQlMUEZDX0VMU19SSU5HLAotCQkJCQlmY19oZHItPmZoX3JfY3RsLCBmY19oZHItPmZoX3R5cGUpOwotCX07Ci0JcmV0dXJuIDA7CisJZmNfaGRyID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKilkbWFidWYtPmhidWYudmlydDsKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyBhIHZhbGlkIHR5cGUgb2YgZnJhbWUgKi8KKwlpZiAobHBmY19mY19mcmFtZV9jaGVjayhwaGJhLCBmY19oZHIpKSB7CisJCWxwZmNfaW5fYnVmX2ZyZWUocGhiYSwgJmRtYWJ1Zi0+ZGJ1Zik7CisJCXJldHVybjsKKwl9CisJZmNmaSA9IGJmX2dldChscGZjX3JjcWVfZmNmX2lkLCAmZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKTsKKwl2cG9ydCA9IGxwZmNfZmNfZnJhbWVfdG9fdnBvcnQocGhiYSwgZmNfaGRyLCBmY2ZpKTsKKwlpZiAoIXZwb3J0IHx8ICEodnBvcnQtPnZwaV9zdGF0ZSAmIExQRkNfVlBJX1JFR0lTVEVSRUQpKSB7CisJCS8qIHRocm93IG91dCB0aGUgZnJhbWUgKi8KKwkJbHBmY19pbl9idWZfZnJlZShwaGJhLCAmZG1hYnVmLT5kYnVmKTsKKwkJcmV0dXJuOworCX0KKwkvKiBIYW5kbGUgdGhlIGJhc2ljIGFib3J0IHNlcXVlbmNlIChCQV9BQlRTKSBldmVudCAqLworCWlmIChmY19oZHItPmZoX3JfY3RsID09IEZDX1JDVExfQkFfQUJUUykgeworCQlscGZjX3NsaTRfaGFuZGxlX3Vuc29sX2Fib3J0KHZwb3J0LCBkbWFidWYpOworCQlyZXR1cm47CisJfQorCisJLyogTGluayB0aGlzIGZyYW1lICovCisJc2VxX2RtYWJ1ZiA9IGxwZmNfZmNfZnJhbWVfYWRkKHZwb3J0LCBkbWFidWYpOworCWlmICghc2VxX2RtYWJ1ZikgeworCQkvKiB1bmFibGUgdG8gYWRkIGZyYW1lIHRvIHZwb3J0IC0gdGhyb3cgaXQgb3V0ICovCisJCWxwZmNfaW5fYnVmX2ZyZWUocGhiYSwgJmRtYWJ1Zi0+ZGJ1Zik7CisJCXJldHVybjsKKwl9CisJLyogSWYgbm90IGxhc3QgZnJhbWUgaW4gc2VxdWVuY2UgY29udGludWUgcHJvY2Vzc2luZyBmcmFtZXMuICovCisJaWYgKCFscGZjX3NlcV9jb21wbGV0ZShzZXFfZG1hYnVmKSkgeworCQkvKgorCQkgKiBXaGVuIHNhdmluZyBvZmYgZnJhbWVzIHBvc3QgYSBuZXcgb25lIGFuZCBtYXJrIHRoaXMKKwkJICogZnJhbWUgdG8gYmUgZnJlZWQgd2hlbiBpdCBpcyBmaW5pc2hlZC4KKwkJICoqLworCQlscGZjX3NsaV9oYnFidWZfZmlsbF9oYnFzKHBoYmEsIExQRkNfRUxTX0hCUSwgMSk7CisJCWRtYWJ1Zi0+dGFnID0gLTE7CisJCXJldHVybjsKKwl9CisJLyogU2VuZCB0aGUgY29tcGxldGUgc2VxdWVuY2UgdG8gdGhlIHVwcGVyIGxheWVyIHByb3RvY29sICovCisJbHBmY19zbGk0X3NlbmRfc2VxX3RvX3VscCh2cG9ydCwgc2VxX2RtYWJ1Zik7CiB9CiAKIC8qKgpAQCAtMTEwOTEsNyArMTE0MjgsNyBAQAogICogc2VxdWVudGlhbC4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqICAgICAgRUlPIC0gVGhlIG1haWxib3ggZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KICAqIAlXaGVuIHRoaXMgZXJyb3Igb2NjdXJzLCB0aGUgZHJpdmVyIGlzIG5vdCBndWFyYW50ZWVkCiAgKgl0byBoYXZlIGFueSBycGkgcmVnaW9ucyBwb3N0ZWQgdG8gdGhlIGRldmljZSBhbmQKQEAgLTExMTI5LDcgKzExNDY2LDcgQEAKICAqIG1hcHMgdXAgdG8gNjQgcnBpIGNvbnRleHQgcmVnaW9ucy4KICAqCiAgKiBSZXR1cm4gY29kZXMKLSAqIAkwIC0gc3VjZXNzZnVsCisgKiAJMCAtIHN1Y2Nlc3NmdWwKICAqIAlFTk9NRU0gLSBObyBhdmFpbGFibGUgbWVtb3J5CiAgKiAgICAgIEVJTyAtIFRoZSBtYWlsYm94IGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCiAgKiovCkBAIC0xMTE5MSw3ICsxMTUyOCw3IEBACiAgKiBQQUdFX1NJWkUgbW9kdWxvIDY0IHJwaSBjb250ZXh0IGhlYWRlcnMuCiAgKgogICogUmV0dXJucwotICogCUEgbm9uemVybyBycGkgZGVmaW5lZCBhcyBycGlfYmFzZSA8PSBycGkgPCBtYXhfcnBpIGlmIHN1Y2Vzc2Z1bAorICogCUEgbm9uemVybyBycGkgZGVmaW5lZCBhcyBycGlfYmFzZSA8PSBycGkgPCBtYXhfcnBpIGlmIHN1Y2Nlc3NmdWwKICAqIAlMUEZDX1JQSV9BTExPQ19FUlJPUiBpZiBubyBycGlzIGFyZSBhdmFpbGFibGUuCiAgKiovCiBpbnQKQEAgLTExMzM0LDYgKzExNjcxLDcgQEAKIHsKIAlMUEZDX01CT1hRX3QgKm1ib3hxOwogCWludCByYyA9IDA7CisJaW50IHJldHZhbCA9IE1CWF9TVUNDRVNTOwogCXVpbnQzMl90IG1ib3hfdG1vOwogCiAJaWYgKHZwaSA9PSAwKQpAQCAtMTEzNDQsMTYgKzExNjgyLDE3IEBACiAJbHBmY19pbml0X3ZwaShwaGJhLCBtYm94cSwgdnBpKTsKIAltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9JTklUX1ZQSSk7CiAJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveHEsIG1ib3hfdG1vKTsKLQlpZiAocmMgIT0gTUJYX1RJTUVPVVQpCi0JCW1lbXBvb2xfZnJlZShtYm94cSwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJaWYgKHJjICE9IE1CWF9TVUNDRVNTKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKIAkJCQkiMjAyMiBJTklUIFZQSSBNYWlsYm94IGZhaWxlZCAiCiAJCQkJInN0YXR1cyAlZCwgbWJ4U3RhdHVzIHgleFxuIiwgcmMsCiAJCQkJYmZfZ2V0KGxwZmNfbXFlX3N0YXR1cywgJm1ib3hxLT51Lm1xZSkpOwotCQlyYyA9IC1FSU87CisJCXJldHZhbCA9IC1FSU87CiAJfQotCXJldHVybiByYzsKKwlpZiAocmMgIT0gTUJYX1RJTUVPVVQpCisJCW1lbXBvb2xfZnJlZShtYm94cSwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CisKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKioKQEAgLTExNDM4LDEzICsxMTc3Nyw2IEBACiAJICovCiAJbHBmY19zbGk0X21ieF9zZ2VfZ2V0KG1ib3hxLCAwLCAmc2dlKTsKIAlwaHlzX2FkZHIgPSBnZXRQYWRkcihzZ2UucGFfaGksIHNnZS5wYV9sbyk7Ci0JaWYgKHVubGlrZWx5KCFtYm94cS0+c2dlX2FycmF5KSkgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YLAotCQkJCSIyNTI2IEZhaWxlZCB0byBnZXQgdGhlIG5vbi1lbWJlZGRlZCBTR0UgIgotCQkJCSJ2aXJ0dWFsIGFkZHJlc3NcbiIpOwotCQlscGZjX3NsaTRfbWJveF9jbWRfZnJlZShwaGJhLCBtYm94cSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KIAl2aXJ0X2FkZHIgPSBtYm94cS0+c2dlX2FycmF5LT5hZGRyWzBdOwogCS8qCiAJICogQ29uZmlndXJlIHRoZSBGQ0YgcmVjb3JkIGZvciBGQ0ZJIDAuICBUaGlzIGlzIHRoZSBkcml2ZXIncwpAQCAtMTE1NDIsNyArMTE4NzQsOCBAQAogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCSIyMDAwIEZhaWxlZCB0byBhbGxvY2F0ZSBtYm94IGZvciAiCiAJCQkJIlJFQURfRkNGIGNtZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9mY2ZzY2FuOwogCX0KIAogCXJlcV9sZW4gPSBzaXplb2Yoc3RydWN0IGZjZl9yZWNvcmQpICsKQEAgLTExNTU4LDggKzExODkxLDggQEAKIAkJCQkiMDI5MSBBbGxvY2F0ZWQgRE1BIG1lbW9yeSBzaXplICh4JXgpIGlzICIKIAkJCQkibGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgRE1BIG1lbW9yeSAiCiAJCQkJInNpemUgKHgleClcbiIsIGFsbG9jX2xlbiwgcmVxX2xlbik7Ci0JCWxwZmNfc2xpNF9tYm94X2NtZF9mcmVlKHBoYmEsIG1ib3hxKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2ZjZnNjYW47CiAJfQogCiAJLyogR2V0IHRoZSBmaXJzdCBTR0UgZW50cnkgZnJvbSB0aGUgbm9uLWVtYmVkZGVkIERNQSBtZW1vcnkuIFRoaXMKQEAgLTExNTY3LDEzICsxMTkwMCw2IEBACiAJICovCiAJbHBmY19zbGk0X21ieF9zZ2VfZ2V0KG1ib3hxLCAwLCAmc2dlKTsKIAlwaHlzX2FkZHIgPSBnZXRQYWRkcihzZ2UucGFfaGksIHNnZS5wYV9sbyk7Ci0JaWYgKHVubGlrZWx5KCFtYm94cS0+c2dlX2FycmF5KSkgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YLAotCQkJCSIyNTI3IEZhaWxlZCB0byBnZXQgdGhlIG5vbi1lbWJlZGRlZCBTR0UgIgotCQkJCSJ2aXJ0dWFsIGFkZHJlc3NcbiIpOwotCQlscGZjX3NsaTRfbWJveF9jbWRfZnJlZShwaGJhLCBtYm94cSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KIAl2aXJ0X2FkZHIgPSBtYm94cS0+c2dlX2FycmF5LT5hZGRyWzBdOwogCXJlYWRfZmNmID0gKHN0cnVjdCBscGZjX21ieF9yZWFkX2ZjZl90YmwgKil2aXJ0X2FkZHI7CiAKQEAgLTExNTg2LDcgKzExOTEyLDYgQEAKIAltYm94cS0+bWJveF9jbXBsID0gbHBmY19tYnhfY21wbF9yZWFkX2ZjZl9yZWNvcmQ7CiAJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3hxLCBNQlhfTk9XQUlUKTsKIAlpZiAocmMgPT0gTUJYX05PVF9GSU5JU0hFRCkgewotCQlscGZjX3NsaTRfbWJveF9jbWRfZnJlZShwaGJhLCBtYm94cSk7CiAJCWVycm9yID0gLUVJTzsKIAl9IGVsc2UgewogCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKQEAgLTExNTk0LDYgKzExOTE5LDE1IEBACiAJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCWVycm9yID0gMDsKIAl9CitmYWlsX2ZjZnNjYW46CisJaWYgKGVycm9yKSB7CisJCWlmIChtYm94cSkKKwkJCWxwZmNfc2xpNF9tYm94X2NtZF9mcmVlKHBoYmEsIG1ib3hxKTsKKwkJLyogRkNGIHNjYW4gZmFpbGVkLCBjbGVhciBGQ0ZfRElTQ19JTlBST0dSRVNTIGZsYWcgKi8KKwkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCXBoYmEtPmhiYV9mbGFnICY9IH5GQ0ZfRElTQ19JTlBST0dSRVNTOworCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oCmluZGV4IDNjNTMzMTYuLmJhMzhkZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaApAQCAtMjksMTQgKzI5LDE3IEBACiAJTFBGQ19DVFhfSE9TVAogfSBscGZjX2N0eF9jbWQ7CiAKLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gY2FycnkgdGhlIG5lZWRlZCByZXNwb25zZSBJT0NCIHN0YXRlcyAqLwotc3RydWN0IGxwZmNfc2xpNF9yc3Bpb2NiX2luZm8gewotCXVpbnQ4X3QgaHdfc3RhdHVzOwotCXVpbnQ4X3QgYmZpZWxkOwotI2RlZmluZSBMUEZDX1hCCTB4MQotI2RlZmluZSBMUEZDX1BWCTB4MgotCXVpbnQ4X3QgcHJpb3JpdHk7Ci0JdWludDhfdCByZXNlcnZlZDsKK3N0cnVjdCBscGZjX2NxX2V2ZW50IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5pb24geworCQlzdHJ1Y3QgbHBmY19tY3FlCQltY3FlX2NtcGw7CisJCXN0cnVjdCBscGZjX2FjcWVfbGluawkJYWNxZV9saW5rOworCQlzdHJ1Y3QgbHBmY19hY3FlX2Zjb2UJCWFjcWVfZmNvZTsKKwkJc3RydWN0IGxwZmNfYWNxZV9kY2J4CQlhY3FlX2RjYng7CisJCXN0cnVjdCBscGZjX3JjcWUJCXJjcWVfY21wbDsKKwkJc3RydWN0IHNsaTRfd2NxZV94cmlfYWJvcnRlZAl3Y3FlX2F4cmk7CisJCXN0cnVjdCBscGZjX3djcWVfY29tcGxldGUJd2NxZV9jbXBsOworCX0gY3FlOwogfTsKIAogLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBoYW5kbGUgSU9DQiByZXF1ZXN0cyAvIHJlc3BvbnNlcyAqLwpAQCAtNDYsNiArNDksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgY2xpc3Q7CiAJdWludDE2X3QgaW90YWc7ICAgICAgICAgLyogcHJlLWFzc2lnbmVkIElPIHRhZyAqLwogCXVpbnQxNl90IHNsaTRfeHJpdGFnOyAgIC8qIHByZS1hc3NpZ25lZCBYUkksIChPWElEKSB0YWcuICovCisJc3RydWN0IGxwZmNfY3FfZXZlbnQgY3FfZXZlbnQ7CiAKIAlJT0NCX3QgaW9jYjsJCS8qIElPQ0IgY21kICovCiAJdWludDhfdCByZXRyeTsJCS8qIHJldHJ5IGNvdW50ZXIgZm9yIElPQ0IgY21kIC0gaWYgbmVlZGVkICovCkBAIC01NiwxMSArNjAsMTMgQEAKICNkZWZpbmUgTFBGQ19EUklWRVJfQUJPUlRFRAk4CS8qIGRyaXZlciBhYm9ydGVkIHRoaXMgcmVxdWVzdCAqLwogI2RlZmluZSBMUEZDX0lPX0ZBQlJJQwkJMHgxMAkvKiBJb2NiIHNlbmQgdXNpbmcgZmFicmljIHNjaGVkdWxlciAqLwogI2RlZmluZSBMUEZDX0RFTEFZX01FTV9GUkVFCTB4MjAgICAgLyogRGVmZXIgZnJlZSdpbmcgb2YgRkMgZGF0YSAqLwotI2RlZmluZSBMUEZDX0ZJUF9FTFMJCTB4NDAKKyNkZWZpbmUgTFBGQ19GSVBfRUxTX0lEX01BU0sJMHhjMAkvKiBFTFNfSUQgcmFuZ2UgMC0zICovCisjZGVmaW5lIExQRkNfRklQX0VMU19JRF9TSElGVAk2CiAKIAl1aW50OF90IGFib3J0X2NvdW50OwogCXVpbnQ4X3QgcnN2ZDI7CiAJdWludDMyX3QgZHJ2clRpbWVvdXQ7CS8qIGRyaXZlciB0aW1lb3V0IGluIHNlY29uZHMgKi8KKwl1aW50MzJfdCBmY3Bfd3FpZHg7CS8qIGluZGV4IHRvIEZDUCB3b3JrIHF1ZXVlICovCiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0Oy8qIHZpcnR1YWwgcG9ydCBwb2ludGVyICovCiAJdm9pZCAqY29udGV4dDE7CQkvKiBjYWxsZXIgY29udGV4dCBpbmZvcm1hdGlvbiAqLwogCXZvaWQgKmNvbnRleHQyOwkJLyogY2FsbGVyIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KQEAgLTc2LDcgKzgyLDYgQEAKIAkJCSAgIHN0cnVjdCBscGZjX2lvY2JxICopOwogCXZvaWQgKCppb2NiX2NtcGwpIChzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfaW9jYnEgKiwKIAkJCSAgIHN0cnVjdCBscGZjX2lvY2JxICopOwotCXN0cnVjdCBscGZjX3NsaTRfcnNwaW9jYl9pbmZvIHNsaTRfaW5mbzsKIH07CiAKICNkZWZpbmUgU0xJX0lPQ0JfUkVUX0lPQ0IgICAgICAxCS8qIFJldHVybiBJT0NCIGlmIGNtZCByaW5nIGZ1bGwgKi8KQEAgLTExMCw3ICsxMTUsNyBAQAogCQkJCSAgIHJldHVybiAqLwogI2RlZmluZSBNQlhfTk9XQUlUICAgICAgMgkvKiBpc3N1ZSBjb21tYW5kIHRoZW4gcmV0dXJuIGltbWVkaWF0ZWx5ICovCiAKLSNkZWZpbmUgTFBGQ19NQVhfUklOR19NQVNLICA0CS8qIG1heCBudW0gb2YgcmN0bC90eXBlIG1hc2tzIGFsbG93ZWQgcGVyCisjZGVmaW5lIExQRkNfTUFYX1JJTkdfTUFTSyAgNQkvKiBtYXggbnVtIG9mIHJjdGwvdHlwZSBtYXNrcyBhbGxvd2VkIHBlcgogCQkJCSAgIHJpbmcgKi8KICNkZWZpbmUgTFBGQ19NQVhfUklORyAgICAgICA0CS8qIG1heCBudW0gb2YgU0xJIHJpbmdzIHVzZWQgYnkgZHJpdmVyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKaW5kZXggYjVmNGJhMS4uMjVkNjZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKQEAgLTU4LDYgKzU4LDE2IEBACiAjZGVmaW5lIExQRkNfRkNPRV9GS0FfQURWX1BFUgkwCiAjZGVmaW5lIExQRkNfRkNPRV9GSVBfUFJJT1JJVFkJMHg4MAogCisjZGVmaW5lIHNsaTRfc2lkX2Zyb21fZmNfaGRyKGZjX2hkcikgIFwKKwkoKGZjX2hkciktPmZoX3NfaWRbMF0gPDwgMTYgfCBcCisJIChmY19oZHIpLT5maF9zX2lkWzFdIDw8ICA4IHwgXAorCSAoZmNfaGRyKS0+Zmhfc19pZFsyXSkKKworI2RlZmluZSBzbGk0X2ZjdGxfZnJvbV9mY19oZHIoZmNfaGRyKSAgXAorCSgoZmNfaGRyKS0+ZmhfZl9jdGxbMF0gPDwgMTYgfCBcCisJIChmY19oZHIpLT5maF9mX2N0bFsxXSA8PCAgOCB8IFwKKwkgKGZjX2hkciktPmZoX2ZfY3RsWzJdKQorCiBlbnVtIGxwZmNfc2xpNF9xdWV1ZV90eXBlIHsKIAlMUEZDX0VRLAogCUxQRkNfR0NRLApAQCAtMTEwLDE4ICsxMjAsNiBAQAogCXVuaW9uIHNsaTRfcWUgcWVbMV07CS8qIGFycmF5IHRvIGluZGV4IGVudHJpZXMgKG11c3QgYmUgbGFzdCkgKi8KIH07CiAKLXN0cnVjdCBscGZjX2NxX2V2ZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JdW5pb24gewotCQlzdHJ1Y3QgbHBmY19tY3FlCQltY3FlX2NtcGw7Ci0JCXN0cnVjdCBscGZjX2FjcWVfbGluawkJYWNxZV9saW5rOwotCQlzdHJ1Y3QgbHBmY19hY3FlX2Zjb2UJCWFjcWVfZmNvZTsKLQkJc3RydWN0IGxwZmNfYWNxZV9kY2J4CQlhY3FlX2RjYng7Ci0JCXN0cnVjdCBscGZjX3JjcWUJCXJjcWVfY21wbDsKLQkJc3RydWN0IHNsaTRfd2NxZV94cmlfYWJvcnRlZAl3Y3FlX2F4cmk7Ci0JfSBjcWU7Ci19OwotCiBzdHJ1Y3QgbHBmY19zbGk0X2xpbmsgewogCXVpbnQ4X3Qgc3BlZWQ7CiAJdWludDhfdCBkdXBsZXg7CkBAIC0xNjYsNyArMTY0LDcgQEAKICNkZWZpbmUJbHBmY19maXBfcGFyYW1faGRyX2ZpcHBfbW9kZV9TSElGVAk2CiAjZGVmaW5lCWxwZmNfZmlwX3BhcmFtX2hkcl9maXBwX21vZGVfTUFTSwkweDMKICNkZWZpbmUgbHBmY19maXBfcGFyYW1faGRyX2ZpcHBfbW9kZV9XT1JECXBhcm1fZmxhZ3MKLSNkZWZpbmUJRklQUF9NT0RFX09OCQkJCTB4MgorI2RlZmluZQlGSVBQX01PREVfT04JCQkJMHgxCiAjZGVmaW5lCUZJUFBfTU9ERV9PRkYJCQkJMHgwCiAjZGVmaW5lIEZJUFBfVkxBTl9WQUxJRAkJCQkweDEKIH07CkBAIC0yOTUsOSArMjkzLDggQEAKIAkvKiBCQVIwIFBDSSBjb25maWcgc3BhY2UgcmVnaXN0ZXIgbWVtb3J5IG1hcCAqLwogCXZvaWQgX19pb21lbSAqVUVSUkxPcmVnYWRkcjsgLyogQWRkcmVzcyB0byBVRVJSX1NUQVRVU19MTyByZWdpc3RlciAqLwogCXZvaWQgX19pb21lbSAqVUVSUkhJcmVnYWRkcjsgLyogQWRkcmVzcyB0byBVRVJSX1NUQVRVU19ISSByZWdpc3RlciAqLwotCXZvaWQgX19pb21lbSAqT05MSU5FMHJlZ2FkZHI7IC8qIEFkZHJlc3MgdG8gY29tcG9uZW50cyBvZiBpbnRlcm5hbCBVRSAqLwotCXZvaWQgX19pb21lbSAqT05MSU5FMXJlZ2FkZHI7IC8qIEFkZHJlc3MgdG8gY29tcG9uZW50cyBvZiBpbnRlcm5hbCBVRSAqLwotI2RlZmluZSBMUEZDX09OTElORV9ORVJSCTB4RkZGRkZGRkYKKwl2b2lkIF9faW9tZW0gKlVFTUFTS0xPcmVnYWRkcjsgLyogQWRkcmVzcyB0byBVRV9NQVNLX0xPIHJlZ2lzdGVyICovCisJdm9pZCBfX2lvbWVtICpVRU1BU0tISXJlZ2FkZHI7IC8qIEFkZHJlc3MgdG8gVUVfTUFTS19ISSByZWdpc3RlciAqLwogCXZvaWQgX19pb21lbSAqU0NSQVRDSFBBRHJlZ2FkZHI7IC8qIEFkZHJlc3MgdG8gc2NyYXRjaHBhZCByZWdpc3RlciAqLwogCS8qIEJBUjEgRkNvRSBmdW5jdGlvbiBDU1IgcmVnaXN0ZXIgbWVtb3J5IG1hcCAqLwogCXZvaWQgX19pb21lbSAqU1RBcmVnYWRkcjsgICAgLyogQWRkcmVzcyB0byBIU1RfU1RBVEUgcmVnaXN0ZXIgKi8KQEAgLTMxMSw2ICszMDgsOCBAQAogCXZvaWQgX19pb21lbSAqTVFEQnJlZ2FkZHI7ICAgLyogQWRkcmVzcyB0byBNUV9ET09SQkVMTCByZWdpc3RlciAqLwogCXZvaWQgX19pb21lbSAqQk1CWHJlZ2FkZHI7ICAgLyogQWRkcmVzcyB0byBCb290U3RyYXAgTUJYIHJlZ2lzdGVyICovCiAKKwl1aW50MzJfdCB1ZV9tYXNrX2xvOworCXVpbnQzMl90IHVlX21hc2tfaGk7CiAJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKIAl1aW50MzJfdCBjZmdfZXFuOwogCXN0cnVjdCBscGZjX2ZjcF9lcV9oZGwgKmZjcF9lcV9oZGw7IC8qIEZDUCBwZXItV1EgaGFuZGxlICovCkBAIC0zMjUsNyArMzI0LDYgQEAKIAlzdHJ1Y3QgbHBmY19xdWV1ZSAqKmZjcF9jcTsvKiBGYXN0LXBhdGggRkNQIGNvbXBsIHF1ZXVlICovCiAJc3RydWN0IGxwZmNfcXVldWUgKm1ieF9jcTsgLyogU2xvdy1wYXRoIG1haWxib3ggY29tcGxldGUgcXVldWUgKi8KIAlzdHJ1Y3QgbHBmY19xdWV1ZSAqZWxzX2NxOyAvKiBTbG93LXBhdGggRUxTIHJlc3BvbnNlIGNvbXBsZXRlIHF1ZXVlICovCi0Jc3RydWN0IGxwZmNfcXVldWUgKnJ4cV9jcTsgLyogU2xvdy1wYXRoIHVuc29saWNpdGVkIGNvbXBsZXRlIHF1ZXVlICovCiAKIAkvKiBTZXR1cCBpbmZvcm1hdGlvbiBmb3IgdmFyaW91cyBxdWV1ZSBwYXJhbWV0ZXJzICovCiAJaW50IGVxX2VzaXplOwpAQCAtMzYwLDcgKzM1OCw3IEBACiAJdW5zaWduZWQgbG9uZyAqcnBpX2JtYXNrOwogCXVpbnQxNl90IHJwaV9jb3VudDsKIAlzdHJ1Y3QgbHBmY19zbGk0X2ZsYWdzIHNsaTRfZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzcF9yc3Bpb2NiX3dvcmtfcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCBzcF9xdWV1ZV9ldmVudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNwX2NxZV9ldmVudF9wb29sOwogCXN0cnVjdCBsaXN0X2hlYWQgc3BfYXN5bmNlX3dvcmtfcXVldWU7CiAJc3RydWN0IGxpc3RfaGVhZCBzcF9mY3BfeHJpX2Fib3J0ZWRfd29ya19xdWV1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKaW5kZXggOWFlMjBhZi4uYzdmM2FlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKQEAgLTE4LDggKzE4LDcgQEAKICAqIGluY2x1ZGVkIHdpdGggdGhpcyBwYWNrYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjMuNCIKLQorI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjMuNiIKICNkZWZpbmUgTFBGQ19EUklWRVJfTkFNRQkJImxwZmMiCiAjZGVmaW5lIExQRkNfU1BfRFJJVkVSX0hBTkRMRVJfTkFNRQkibHBmYzpzcCIKICNkZWZpbmUgTFBGQ19GUF9EUklWRVJfSEFORExFUl9OQU1FCSJscGZjOmZwIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192cG9ydC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192cG9ydC5jCmluZGV4IDYwNmVmYTcuLjdkNmRkODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdnBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Zwb3J0LmMKQEAgLTM4OSw3ICszODksNyBAQAogCSAqIGJ5IHRoZSBwb3J0LgogCSAqLwogCWlmICgocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSAmJgotCQkocHBvcnQtPnZmaV9zdGF0ZSAmIExQRkNfVkZJX1JFR0lTVEVSRUQpKSB7CisJICAgIChwcG9ydC0+dnBpX3N0YXRlICYgTFBGQ19WUElfUkVHSVNURVJFRCkpIHsKIAkJcmMgPSBscGZjX3NsaTRfaW5pdF92cGkocGhiYSwgdnBpKTsKIAkJaWYgKHJjKSB7CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19WUE9SVCwKQEAgLTcwMCw2ICs3MDAsOCBAQAogCQkJfQogCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5uZGxwX2xvY2spOwogCQl9CisJCWlmICh2cG9ydC0+dnBpX3N0YXRlICE9IExQRkNfVlBJX1JFR0lTVEVSRUQpCisJCQlnb3RvIHNraXBfbG9nbzsKIAkJdnBvcnQtPnVucmVnX3ZwaV9jbXBsID0gVlBPUlRfSU5WQUw7CiAJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHBoYmEtPmZjX3JhdG92ICogMjAwMCk7CiAJCWlmICghbHBmY19pc3N1ZV9lbHNfbnBpdl9sb2dvKHZwb3J0LCBuZGxwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKaW5kZXggNTEyYzJjYy4uZDMxMGY0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKQEAgLTM4MSw3ICszODEsNyBAQAogCXU4CWJhdHRlcnlfc3RhdHVzOwkvKgogCQkJCSAqIEJJVCAwOiBiYXR0ZXJ5IG1vZHVsZSBtaXNzaW5nCiAJCQkJICogQklUIDE6IFZCQUQKLQkJCQkgKiBCSVQgMjogdGVtcHJhdHVyZSBoaWdoCisJCQkJICogQklUIDI6IHRlbXBlcmF0dXJlIGhpZ2gKIAkJCQkgKiBCSVQgMzogYmF0dGVyeSBwYWNrIG1pc3NpbmcKIAkJCQkgKiBCSVQgNCw1OgogCQkJCSAqICAgMDAgLSBjaGFyZ2UgY29tcGxldGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tYm94X2RlZnMuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tYm94X2RlZnMuaAppbmRleCBiMjViNzQ3Li5jZTI0ODdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWJveF9kZWZzLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21ib3hfZGVmcy5oCkBAIC00OTcsNyArNDk3LDcgQEAKICAqIEBpbnNlcnRlZF9kcml2ZQkJOiBjaGFubmVsOklkIG9mIGluc2VydGVkIGRyaXZlCiAgKiBAYmF0dGVyeV9zdGF0dXMJCTogYml0IDA6IGJhdHRlcnkgbW9kdWxlIG1pc3NpbmcKICAqCQkJCWJpdCAxOiBWQkFECi0gKgkJCQliaXQgMjogdGVtcHJhdHVyZSBoaWdoCisgKgkJCQliaXQgMjogdGVtcGVyYXR1cmUgaGlnaAogICoJCQkJYml0IDM6IGJhdHRlcnkgcGFjayBtaXNzaW5nCiAgKgkJCQliaXQgNCw1OgogICoJCQkJCTAwIC0gY2hhcmdlIGNvbXBsZXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwppbmRleCAyMzRmMGI3Li43Zjk3Nzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKQEAgLTMzNSwxMiArMzM1LDE3IEBACiAgKiBtZWdhcmFpZF9jaGFuZ2VfcXVldWVfZGVwdGggLSBDaGFuZ2UgdGhlIGRldmljZSdzIHF1ZXVlIGRlcHRoCiAgKiBAc2RldjoJc2NzaSBkZXZpY2Ugc3RydWN0CiAgKiBAcWRlcHRoOglkZXB0aCB0byBzZXQKKyAqIEByZWFzb246CWNhbGxpbmcgY29udGV4dAogICoKICAqIFJldHVybiB2YWx1ZToKICAqIAlhY3R1YWwgZGVwdGggc2V0CiAgKi8KLXN0YXRpYyBpbnQgbWVnYXJhaWRfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKK3N0YXRpYyBpbnQgbWVnYXJhaWRfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCwKKwkJCQkgICAgICAgaW50IHJlYXNvbikKIHsKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChxZGVwdGggPiBNQk9YX01BWF9TQ1NJX0NNRFMpCiAJCXFkZXB0aCA9IE1CT1hfTUFYX1NDU0lfQ01EUzsKIAlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCAwLCBxZGVwdGgpOwpAQCAtMjcwNCw3ICsyNzA5LDcgQEAKIAl9CiAJZWxzZSB7CiAJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9OT1RJQ0UKLQkJIm1lZ2FyYWlkIG1ib3g6IHJlc2V0IHNlcXVlbmNlIGNvbXBsZXRlZCBzdWNlc3NmdWxseVxuIikpOworCQkibWVnYXJhaWQgbWJveDogcmVzZXQgc2VxdWVuY2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuIikpOwogCX0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMKaW5kZXggYTM5YWRkYy4uMTM0YzYzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuYwpAQCAtMTAsNyArMTAsNyBAQAogICoJICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKiBGSUxFCQk6IG1lZ2FyYWlkX3Nhcy5jCi0gKiBWZXJzaW9uICAgICA6IHYwMC4wMC4wNC4wMS1yYzEKKyAqIFZlcnNpb24gICAgIDogdjAwLjAwLjA0LjEyLXJjMQogICoKICAqIEF1dGhvcnM6CiAgKgkoZW1haWwtaWQgOiBtZWdhcmFpZGxpbnV4QGxzaS5jb20pCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpAQCAtNzUsNiArNzYsMTAgQEAKIAkvKiBnZW4yKi8KIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3OUdFTjIpfSwKIAkvKiBnZW4yKi8KKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWSl9LAorCS8qIHNraW5ueSovCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpfSwKKwkvKiBza2lubnkqLwogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9WRVJERV9aQ1IpfSwKIAkvKiB4c2NhbGUgSU9QLCB2ZWdhICovCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ERUxMLCBQQ0lfREVWSUNFX0lEX0RFTExfUEVSQzUpfSwKQEAgLTg5LDggKzk0LDE0IEBACiBzdGF0aWMgc3RydWN0IGZhc3luY19zdHJ1Y3QgKm1lZ2FzYXNfYXN5bmNfcXVldWU7CiBzdGF0aWMgREVGSU5FX01VVEVYKG1lZ2FzYXNfYXN5bmNfcXVldWVfbXV0ZXgpOwogCitzdGF0aWMgaW50IG1lZ2FzYXNfcG9sbF93YWl0X2FlbjsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtZWdhc2FzX3BvbGxfd2FpdCk7CitzdGF0aWMgdTMyIHN1cHBvcnRfcG9sbF9mb3JfZXZlbnQ7CiBzdGF0aWMgdTMyIG1lZ2FzYXNfZGJnX2x2bDsKIAorLyogZGVmaW5lIGxvY2sgZm9yIGFlbiBwb2xsICovCitzcGlubG9ja190IHBvbGxfYWVuX2xvY2s7CisKIHN0YXRpYyB2b2lkCiBtZWdhc2FzX2NvbXBsZXRlX2NtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLAogCQkgICAgIHU4IGFsdF9zdGF0dXMpOwpAQCAtMjE1LDcgKzIyNiwxMCBAQAogICogQHJlZ3MgOgkJCU1GSSByZWdpc3RlciBzZXQKICAqLwogc3RhdGljIGlubGluZSB2b2lkIAotbWVnYXNhc19maXJlX2NtZF94c2NhbGUoZG1hX2FkZHJfdCBmcmFtZV9waHlzX2FkZHIsdTMyIGZyYW1lX2NvdW50LCBzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqcmVncykKK21lZ2FzYXNfZmlyZV9jbWRfeHNjYWxlKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJZG1hX2FkZHJfdCBmcmFtZV9waHlzX2FkZHIsCisJCXUzMiBmcmFtZV9jb3VudCwKKwkJc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKnJlZ3MpCiB7CiAJd3JpdGVsKChmcmFtZV9waHlzX2FkZHIgPj4gMyl8KGZyYW1lX2NvdW50KSwKIAkgICAgICAgJihyZWdzKS0+aW5ib3VuZF9xdWV1ZV9wb3J0KTsKQEAgLTMxMiw3ICszMjYsMTAgQEAKICAqIEByZWdzIDoJCQlNRkkgcmVnaXN0ZXIgc2V0CiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAKLW1lZ2FzYXNfZmlyZV9jbWRfcHBjKGRtYV9hZGRyX3QgZnJhbWVfcGh5c19hZGRyLCB1MzIgZnJhbWVfY291bnQsIHN0cnVjdCBtZWdhc2FzX3JlZ2lzdGVyX3NldCBfX2lvbWVtICpyZWdzKQorbWVnYXNhc19maXJlX2NtZF9wcGMoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQlkbWFfYWRkcl90IGZyYW1lX3BoeXNfYWRkciwKKwkJdTMyIGZyYW1lX2NvdW50LAorCQlzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqcmVncykKIHsKIAl3cml0ZWwoKGZyYW1lX3BoeXNfYWRkciB8IChmcmFtZV9jb3VudDw8MSkpfDEsIAogCQkJJihyZWdzKS0+aW5ib3VuZF9xdWV1ZV9wb3J0KTsKQEAgLTMyOCw2ICszNDUsMTA0IEBACiB9OwogCiAvKioKKyAqIG1lZ2FzYXNfZW5hYmxlX2ludHJfc2tpbm55IC0JRW5hYmxlcyBpbnRlcnJ1cHRzCisgKiBAcmVnczoJCQlNRkkgcmVnaXN0ZXIgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVnYXNhc19lbmFibGVfaW50cl9za2lubnkoc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKnJlZ3MpCit7CisJd3JpdGVsKDB4RkZGRkZGRkYsICYocmVncyktPm91dGJvdW5kX2ludHJfbWFzayk7CisKKwl3cml0ZWwofk1GSV9TS0lOTllfRU5BQkxFX0lOVEVSUlVQVF9NQVNLLCAmKHJlZ3MpLT5vdXRib3VuZF9pbnRyX21hc2spOworCisJLyogRHVtbXkgcmVhZGwgdG8gZm9yY2UgcGNpIGZsdXNoICovCisJcmVhZGwoJnJlZ3MtPm91dGJvdW5kX2ludHJfbWFzayk7Cit9CisKKy8qKgorICogbWVnYXNhc19kaXNhYmxlX2ludHJfc2tpbm55IC0JRGlzYWJsZXMgaW50ZXJydXB0CisgKiBAcmVnczoJCQlNRkkgcmVnaXN0ZXIgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVnYXNhc19kaXNhYmxlX2ludHJfc2tpbm55KHN0cnVjdCBtZWdhc2FzX3JlZ2lzdGVyX3NldCBfX2lvbWVtICpyZWdzKQoreworCXUzMiBtYXNrID0gMHhGRkZGRkZGRjsKKwl3cml0ZWwobWFzaywgJnJlZ3MtPm91dGJvdW5kX2ludHJfbWFzayk7CisJLyogRHVtbXkgcmVhZGwgdG8gZm9yY2UgcGNpIGZsdXNoICovCisJcmVhZGwoJnJlZ3MtPm91dGJvdW5kX2ludHJfbWFzayk7Cit9CisKKy8qKgorICogbWVnYXNhc19yZWFkX2Z3X3N0YXR1c19yZWdfc2tpbm55IC0gcmV0dXJucyB0aGUgY3VycmVudCBGVyBzdGF0dXMgdmFsdWUKKyAqIEByZWdzOgkJCU1GSSByZWdpc3RlciBzZXQKKyAqLworc3RhdGljIHUzMgorbWVnYXNhc19yZWFkX2Z3X3N0YXR1c19yZWdfc2tpbm55KHN0cnVjdCBtZWdhc2FzX3JlZ2lzdGVyX3NldCBfX2lvbWVtICpyZWdzKQoreworCXJldHVybiByZWFkbCgmKHJlZ3MpLT5vdXRib3VuZF9zY3JhdGNoX3BhZCk7Cit9CisKKy8qKgorICogbWVnYXNhc19jbGVhcl9pbnRlcnJ1cHRfc2tpbm55IC0JQ2hlY2sgJiBjbGVhciBpbnRlcnJ1cHQKKyAqIEByZWdzOgkJCQlNRkkgcmVnaXN0ZXIgc2V0CisgKi8KK3N0YXRpYyBpbnQKK21lZ2FzYXNfY2xlYXJfaW50cl9za2lubnkoc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKnJlZ3MpCit7CisJdTMyIHN0YXR1czsKKwkvKgorCSAqIENoZWNrIGlmIGl0IGlzIG91ciBpbnRlcnJ1cHQKKwkgKi8KKwlzdGF0dXMgPSByZWFkbCgmcmVncy0+b3V0Ym91bmRfaW50cl9zdGF0dXMpOworCisJaWYgKCEoc3RhdHVzICYgTUZJX1NLSU5OWV9FTkFCTEVfSU5URVJSVVBUX01BU0spKSB7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogQ2xlYXIgdGhlIGludGVycnVwdCBieSB3cml0aW5nIGJhY2sgdGhlIHNhbWUgdmFsdWUKKwkgKi8KKwl3cml0ZWwoc3RhdHVzLCAmcmVncy0+b3V0Ym91bmRfaW50cl9zdGF0dXMpOworCisJLyoKKwkqIGR1bW15IHJlYWQgdG8gZmx1c2ggUENJCisJKi8KKwlyZWFkbCgmcmVncy0+b3V0Ym91bmRfaW50cl9zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVnYXNhc19maXJlX2NtZF9za2lubnkgLQlTZW5kcyBjb21tYW5kIHRvIHRoZSBGVworICogQGZyYW1lX3BoeXNfYWRkciA6CQlQaHlzaWNhbCBhZGRyZXNzIG9mIGNtZAorICogQGZyYW1lX2NvdW50IDoJCU51bWJlciBvZiBmcmFtZXMgZm9yIHRoZSBjb21tYW5kCisgKiBAcmVncyA6CQkJTUZJIHJlZ2lzdGVyIHNldAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21lZ2FzYXNfZmlyZV9jbWRfc2tpbm55KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCWRtYV9hZGRyX3QgZnJhbWVfcGh5c19hZGRyLAorCQkJdTMyIGZyYW1lX2NvdW50LAorCQkJc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPmZpcmVfbG9jaywgZmxhZ3MpOworCXdyaXRlbCgwLCAmKHJlZ3MpLT5pbmJvdW5kX2hpZ2hfcXVldWVfcG9ydCk7CisJd3JpdGVsKChmcmFtZV9waHlzX2FkZHIgfCAoZnJhbWVfY291bnQ8PDEpKXwxLAorCQkmKHJlZ3MpLT5pbmJvdW5kX2xvd19xdWV1ZV9wb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+ZmlyZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZSBtZWdhc2FzX2luc3RhbmNlX3RlbXBsYXRlX3NraW5ueSA9IHsKKworCS5maXJlX2NtZCA9IG1lZ2FzYXNfZmlyZV9jbWRfc2tpbm55LAorCS5lbmFibGVfaW50ciA9IG1lZ2FzYXNfZW5hYmxlX2ludHJfc2tpbm55LAorCS5kaXNhYmxlX2ludHIgPSBtZWdhc2FzX2Rpc2FibGVfaW50cl9za2lubnksCisJLmNsZWFyX2ludHIgPSBtZWdhc2FzX2NsZWFyX2ludHJfc2tpbm55LAorCS5yZWFkX2Z3X3N0YXR1c19yZWcgPSBtZWdhc2FzX3JlYWRfZndfc3RhdHVzX3JlZ19za2lubnksCit9OworCisKKy8qKgogKglUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBmb3IgZ2VuMiAoZGV2aWNlaWQgOiAweDc4IDB4NzkpCiAqCWNvbnRyb2xsZXJzCiAqLwpAQCAtNDA0LDcgKzUxOSw5IEBACiAgKiBAcmVncyA6ICAgICAgICAgICAgICAgICAgICAgTUZJIHJlZ2lzdGVyIHNldAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLW1lZ2FzYXNfZmlyZV9jbWRfZ2VuMihkbWFfYWRkcl90IGZyYW1lX3BoeXNfYWRkciwgdTMyIGZyYW1lX2NvdW50LAorbWVnYXNhc19maXJlX2NtZF9nZW4yKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCWRtYV9hZGRyX3QgZnJhbWVfcGh5c19hZGRyLAorCQkJdTMyIGZyYW1lX2NvdW50LAogCQkJc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKnJlZ3MpCiB7CiAJd3JpdGVsKChmcmFtZV9waHlzX2FkZHIgfCAoZnJhbWVfY291bnQ8PDEpKXwxLApAQCAtNDQ2LDcgKzU2Myw4IEBACiAJLyoKIAkgKiBJc3N1ZSB0aGUgZnJhbWUgdXNpbmcgaW5ib3VuZCBxdWV1ZSBwb3J0CiAJICovCi0JaW5zdGFuY2UtPmluc3RhbmNldC0+ZmlyZV9jbWQoY21kLT5mcmFtZV9waHlzX2FkZHIgLDAsaW5zdGFuY2UtPnJlZ19zZXQpOworCWluc3RhbmNlLT5pbnN0YW5jZXQtPmZpcmVfY21kKGluc3RhbmNlLAorCQkJY21kLT5mcmFtZV9waHlzX2FkZHIsIDAsIGluc3RhbmNlLT5yZWdfc2V0KTsKIAogCS8qCiAJICogV2FpdCBmb3IgY21kX3N0YXR1cyB0byBjaGFuZ2UKQEAgLTQ3Nyw3ICs1OTUsOCBAQAogewogCWNtZC0+Y21kX3N0YXR1cyA9IEVOT0RBVEE7CiAKLQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5maXJlX2NtZChjbWQtPmZyYW1lX3BoeXNfYWRkciAsMCxpbnN0YW5jZS0+cmVnX3NldCk7CisJaW5zdGFuY2UtPmluc3RhbmNldC0+ZmlyZV9jbWQoaW5zdGFuY2UsCisJCQljbWQtPmZyYW1lX3BoeXNfYWRkciwgMCwgaW5zdGFuY2UtPnJlZ19zZXQpOwogCiAJd2FpdF9ldmVudF90aW1lb3V0KGluc3RhbmNlLT5pbnRfY21kX3dhaXRfcSwgKGNtZC0+Y21kX3N0YXR1cyAhPSBFTk9EQVRBKSwKIAkJTUVHQVNBU19JTlRFUk5BTF9DTURfV0FJVF9USU1FKkhaKTsKQEAgLTUyMiw3ICs2NDEsOCBAQAogCWNtZC0+c3luY19jbWQgPSAxOwogCWNtZC0+Y21kX3N0YXR1cyA9IDB4RkY7CiAKLQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5maXJlX2NtZChjbWQtPmZyYW1lX3BoeXNfYWRkciAsMCxpbnN0YW5jZS0+cmVnX3NldCk7CisJaW5zdGFuY2UtPmluc3RhbmNldC0+ZmlyZV9jbWQoaW5zdGFuY2UsCisJCQljbWQtPmZyYW1lX3BoeXNfYWRkciwgMCwgaW5zdGFuY2UtPnJlZ19zZXQpOwogCiAJLyoKIAkgKiBXYWl0IGZvciB0aGlzIGNtZCB0byBjb21wbGV0ZQpAQCAtNTkyLDYgKzcxMiwzNSBAQAogCXJldHVybiBzZ2VfY291bnQ7CiB9CiAKKy8qKgorICogbWVnYXNhc19tYWtlX3NnbF9za2lubnkgLSBQcmVwYXJlcyBJRUVFIFNHTAorICogQGluc3RhbmNlOiAgICAgICAgICAgQWRhcHRlciBzb2Z0IHN0YXRlCisgKiBAc2NwOiAgICAgICAgICAgICAgICBTQ1NJIGNvbW1hbmQgZnJvbSB0aGUgbWlkLWxheWVyCisgKiBAbWZpX3NnbDogICAgICAgICAgICBTR0wgdG8gYmUgZmlsbGVkIGluCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMuIE90aGVyd2lzZSwKKyAqIGl0IHJldHVybmVzIC0xLgorICovCitzdGF0aWMgaW50CittZWdhc2FzX21ha2Vfc2dsX3NraW5ueShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCXN0cnVjdCBzY3NpX2NtbmQgKnNjcCwgdW5pb24gbWVnYXNhc19zZ2wgKm1maV9zZ2wpCit7CisJaW50IGk7CisJaW50IHNnZV9jb3VudDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKm9zX3NnbDsKKworCXNnZV9jb3VudCA9IHNjc2lfZG1hX21hcChzY3ApOworCisJaWYgKHNnZV9jb3VudCkgeworCQlzY3NpX2Zvcl9lYWNoX3NnKHNjcCwgb3Nfc2dsLCBzZ2VfY291bnQsIGkpIHsKKwkJCW1maV9zZ2wtPnNnZV9za2lubnlbaV0ubGVuZ3RoID0gc2dfZG1hX2xlbihvc19zZ2wpOworCQkJbWZpX3NnbC0+c2dlX3NraW5ueVtpXS5waHlzX2FkZHIgPQorCQkJCQkJc2dfZG1hX2FkZHJlc3Mob3Nfc2dsKTsKKwkJfQorCX0KKwlyZXR1cm4gc2dlX2NvdW50OworfQorCiAgLyoqCiAgKiBtZWdhc2FzX2dldF9mcmFtZV9jb3VudCAtIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzCiAgKiBAZnJhbWVfdHlwZQkJOiB0eXBlIG9mIGZyYW1lLSBpbyBvciBwdGhydSBmcmFtZQpAQCAtNjAwLDcgKzc0OSw4IEBACiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHJlcXVpcmVkIGZvciBudW1uYmVyIG9mIHNnZSdzIChzZ2VfY291bnQpCiAgKi8KIAotc3RhdGljIHUzMiBtZWdhc2FzX2dldF9mcmFtZV9jb3VudCh1OCBzZ2VfY291bnQsIHU4IGZyYW1lX3R5cGUpCitzdGF0aWMgdTMyIG1lZ2FzYXNfZ2V0X2ZyYW1lX2NvdW50KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCXU4IHNnZV9jb3VudCwgdTggZnJhbWVfdHlwZSkKIHsKIAlpbnQgbnVtX2NudDsKIAlpbnQgc2dlX2J5dGVzOwpAQCAtNjEwLDYgKzc2MCwxMCBAQAogCXNnZV9zeiA9IChJU19ETUE2NCkgPyBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfc2dlNjQpIDoKIAkgICAgc2l6ZW9mKHN0cnVjdCBtZWdhc2FzX3NnZTMyKTsKIAorCWlmIChpbnN0YW5jZS0+ZmxhZ19pZWVlKSB7CisJCXNnZV9zeiA9IHNpemVvZihzdHJ1Y3QgbWVnYXNhc19zZ2Vfc2tpbm55KTsKKwl9CisKIAkvKgogCSAqIE1haW4gZnJhbWUgY2FuIGNvbnRhaW4gMiBTR0VzIGZvciA2NC1iaXQgU0dMcyBhbmQKIAkgKiAzIFNHRXMgZm9yIDMyLWJpdCBTR0xzIGZvciBsZGlvICYKQEAgLTYxNywxMiArNzcxLDE2IEBACiAJICogMiBTR0VzIGZvciAzMi1iaXQgU0dMcyBmb3IgcHRocnUgZnJhbWUKIAkgKi8KIAlpZiAodW5saWtlbHkoZnJhbWVfdHlwZSA9PSBQVEhSVV9GUkFNRSkpIHsKLQkJaWYgKElTX0RNQTY0KQorCQlpZiAoaW5zdGFuY2UtPmZsYWdfaWVlZSA9PSAxKSB7CisJCQludW1fY250ID0gc2dlX2NvdW50IC0gMTsKKwkJfSBlbHNlIGlmIChJU19ETUE2NCkKIAkJCW51bV9jbnQgPSBzZ2VfY291bnQgLSAxOwogCQllbHNlCiAJCQludW1fY250ID0gc2dlX2NvdW50IC0gMjsKIAl9IGVsc2UgewotCQlpZiAoSVNfRE1BNjQpCisJCWlmIChpbnN0YW5jZS0+ZmxhZ19pZWVlID09IDEpIHsKKwkJCW51bV9jbnQgPSBzZ2VfY291bnQgLSAxOworCQl9IGVsc2UgaWYgKElTX0RNQTY0KQogCQkJbnVtX2NudCA9IHNnZV9jb3VudCAtIDI7CiAJCWVsc2UKIAkJCW51bV9jbnQgPSBzZ2VfY291bnQgLSAzOwpAQCAtNjcxLDYgKzgyOSwxMCBAQAogCWVsc2UgaWYgKHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKQogCQlmbGFncyA9IE1GSV9GUkFNRV9ESVJfTk9ORTsKIAorCWlmIChpbnN0YW5jZS0+ZmxhZ19pZWVlID09IDEpIHsKKwkJZmxhZ3MgfD0gTUZJX0ZSQU1FX0lFRUU7CisJfQorCiAJLyoKIAkgKiBQcmVwYXJlIHRoZSBEQ0RCIGZyYW1lCiAJICovCkBAIC02ODcsOSArODQ5LDI0IEBACiAJbWVtY3B5KHB0aHJ1LT5jZGIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKIAogCS8qCisJKiBJZiB0aGUgY29tbWFuZCBpcyBmb3IgdGhlIHRhcGUgZGV2aWNlLCBzZXQgdGhlCisJKiBwdGhydSB0aW1lb3V0IHRvIHRoZSBvcyBsYXllciB0aW1lb3V0IHZhbHVlLgorCSovCisJaWYgKHNjcC0+ZGV2aWNlLT50eXBlID09IFRZUEVfVEFQRSkgeworCQlpZiAoKHNjcC0+cmVxdWVzdC0+dGltZW91dCAvIEhaKSA+IDB4RkZGRikKKwkJCXB0aHJ1LT50aW1lb3V0ID0gMHhGRkZGOworCQllbHNlCisJCQlwdGhydS0+dGltZW91dCA9IHNjcC0+cmVxdWVzdC0+dGltZW91dCAvIEhaOworCX0KKworCS8qCiAJICogQ29uc3RydWN0IFNHTAogCSAqLwotCWlmIChJU19ETUE2NCkgeworCWlmIChpbnN0YW5jZS0+ZmxhZ19pZWVlID09IDEpIHsKKwkJcHRocnUtPmZsYWdzIHw9IE1GSV9GUkFNRV9TR0w2NDsKKwkJcHRocnUtPnNnZV9jb3VudCA9IG1lZ2FzYXNfbWFrZV9zZ2xfc2tpbm55KGluc3RhbmNlLCBzY3AsCisJCQkJCQkgICAgICAmcHRocnUtPnNnbCk7CisJfSBlbHNlIGlmIChJU19ETUE2NCkgewogCQlwdGhydS0+ZmxhZ3MgfD0gTUZJX0ZSQU1FX1NHTDY0OwogCQlwdGhydS0+c2dlX2NvdW50ID0gbWVnYXNhc19tYWtlX3NnbDY0KGluc3RhbmNlLCBzY3AsCiAJCQkJCQkgICAgICAmcHRocnUtPnNnbCk7CkBAIC03MDgsNyArODg1LDcgQEAKIAkgKiBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHRoaXMgY29tbWFuZCBjb25zdW1lcy4gRlcgdXNlcwogCSAqIHRoaXMgbnVtYmVyIHRvIHB1bGwgc3VmZmljaWVudCBudW1iZXIgb2YgZnJhbWVzIGZyb20gaG9zdCBtZW1vcnkuCiAJICovCi0JY21kLT5mcmFtZV9jb3VudCA9IG1lZ2FzYXNfZ2V0X2ZyYW1lX2NvdW50KHB0aHJ1LT5zZ2VfY291bnQsCisJY21kLT5mcmFtZV9jb3VudCA9IG1lZ2FzYXNfZ2V0X2ZyYW1lX2NvdW50KGluc3RhbmNlLCBwdGhydS0+c2dlX2NvdW50LAogCQkJCQkJCVBUSFJVX0ZSQU1FKTsKIAogCXJldHVybiBjbWQtPmZyYW1lX2NvdW50OwpAQCAtNzM5LDYgKzkxNiwxMCBAQAogCWVsc2UgaWYgKHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gUENJX0RNQV9GUk9NREVWSUNFKQogCQlmbGFncyA9IE1GSV9GUkFNRV9ESVJfUkVBRDsKIAorCWlmIChpbnN0YW5jZS0+ZmxhZ19pZWVlID09IDEpIHsKKwkJZmxhZ3MgfD0gTUZJX0ZSQU1FX0lFRUU7CisJfQorCiAJLyoKIAkgKiBQcmVwYXJlIHRoZSBMb2dpY2FsIElPIGZyYW1lOiAybmQgYml0IGlzIHplcm8gZm9yIGFsbCByZWFkIGNtZHMKIAkgKi8KQEAgLTgwOSw3ICs5OTAsMTEgQEAKIAkvKgogCSAqIENvbnN0cnVjdCBTR0wKIAkgKi8KLQlpZiAoSVNfRE1BNjQpIHsKKwlpZiAoaW5zdGFuY2UtPmZsYWdfaWVlZSkgeworCQlsZGlvLT5mbGFncyB8PSBNRklfRlJBTUVfU0dMNjQ7CisJCWxkaW8tPnNnZV9jb3VudCA9IG1lZ2FzYXNfbWFrZV9zZ2xfc2tpbm55KGluc3RhbmNlLCBzY3AsCisJCQkJCSAgICAgICZsZGlvLT5zZ2wpOworCX0gZWxzZSBpZiAoSVNfRE1BNjQpIHsKIAkJbGRpby0+ZmxhZ3MgfD0gTUZJX0ZSQU1FX1NHTDY0OwogCQlsZGlvLT5zZ2VfY291bnQgPSBtZWdhc2FzX21ha2Vfc2dsNjQoaW5zdGFuY2UsIHNjcCwgJmxkaW8tPnNnbCk7CiAJfSBlbHNlCkBAIC04MjYsNyArMTAxMSw4IEBACiAJICogQ29tcHV0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB0aGlzIGNvbW1hbmQgY29uc3VtZXMuIEZXIHVzZXMKIAkgKiB0aGlzIG51bWJlciB0byBwdWxsIHN1ZmZpY2llbnQgbnVtYmVyIG9mIGZyYW1lcyBmcm9tIGhvc3QgbWVtb3J5LgogCSAqLwotCWNtZC0+ZnJhbWVfY291bnQgPSBtZWdhc2FzX2dldF9mcmFtZV9jb3VudChsZGlvLT5zZ2VfY291bnQsIElPX0ZSQU1FKTsKKwljbWQtPmZyYW1lX2NvdW50ID0gbWVnYXNhc19nZXRfZnJhbWVfY291bnQoaW5zdGFuY2UsCisJCQlsZGlvLT5zZ2VfY291bnQsIElPX0ZSQU1FKTsKIAogCXJldHVybiBjbWQtPmZyYW1lX2NvdW50OwogfQpAQCAtOTgzLDcgKzExNjksOCBAQAogCSAqLwogCWF0b21pY19pbmMoJmluc3RhbmNlLT5md19vdXRzdGFuZGluZyk7CiAKLQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5maXJlX2NtZChjbWQtPmZyYW1lX3BoeXNfYWRkciAsY21kLT5mcmFtZV9jb3VudC0xLGluc3RhbmNlLT5yZWdfc2V0KTsKKwlpbnN0YW5jZS0+aW5zdGFuY2V0LT5maXJlX2NtZChpbnN0YW5jZSwgY21kLT5mcmFtZV9waHlzX2FkZHIsCisJCQkJY21kLT5mcmFtZV9jb3VudC0xLCBpbnN0YW5jZS0+cmVnX3NldCk7CiAJLyoKIAkgKiBDaGVjayBpZiB3ZSBoYXZlIHBlbmQgY21kcyB0byBiZSBjb21wbGV0ZWQKIAkgKi8KQEAgLTEwMDAsMjQgKzExODcsNzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICptZWdhc2FzX2xvb2t1cF9pbnN0YW5jZSh1MTYgaG9zdF9ubykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtZWdhc2FzX21nbXRfaW5mby5tYXhfaW5kZXg7IGkrKykgeworCisJCWlmICgobWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV0pICYmCisJCSAgICAobWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV0tPmhvc3QtPmhvc3Rfbm8gPT0gaG9zdF9ubykpCisJCQlyZXR1cm4gbWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgbWVnYXNhc19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCS8qCi0JICogRG9uJ3QgZXhwb3J0IHBoeXNpY2FsIGRpc2sgZGV2aWNlcyB0byB0aGUgZGlzayBkcml2ZXIuCi0JICoKLQkgKiBGSVhNRTogQ3VycmVudGx5IHdlIGRvbid0IGV4cG9ydCB0aGVtIHRvIHRoZSBtaWRsYXllciBhdCBhbGwuCi0JICogCSAgVGhhdCB3aWxsIGJlIGZpeGVkIG9uY2UgTFNJIGVuZ2luZWVycyBoYXZlIGF1ZGl0ZWQgdGhlCi0JICogCSAgZmlybXdhcmUgZm9yIHBvc3NpYmxlIGlzc3Vlcy4KLQkgKi8KLQlpZiAoc2Rldi0+Y2hhbm5lbCA8IE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICYmIHNkZXYtPnR5cGUgPT0gVFlQRV9ESVNLKQotCQlyZXR1cm4gLUVOWElPOworCXUxNiAgICAgICAgICAgICBwZF9pbmRleCA9IDA7CisJc3RydWN0ICBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSA7CisKKwlpbnN0YW5jZSA9IG1lZ2FzYXNfbG9va3VwX2luc3RhbmNlKHNkZXYtPmhvc3QtPmhvc3Rfbm8pOwogCiAJLyoKLQkgKiBUaGUgUkFJRCBmaXJtd2FyZSBtYXkgcmVxdWlyZSBleHRlbmRlZCB0aW1lb3V0cy4KLQkgKi8KLQlpZiAoc2Rldi0+Y2hhbm5lbCA+PSBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUykKLQkJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwKLQkJCQkgICAgIE1FR0FTQVNfREVGQVVMVF9DTURfVElNRU9VVCAqIEhaKTsKKwkqIERvbid0IGV4cG9ydCBwaHlzaWNhbCBkaXNrIGRldmljZXMgdG8gdGhlIGRpc2sgZHJpdmVyLgorCSoKKwkqIEZJWE1FOiBDdXJyZW50bHkgd2UgZG9uJ3QgZXhwb3J0IHRoZW0gdG8gdGhlIG1pZGxheWVyIGF0IGFsbC4KKwkqICAgICAgICBUaGF0IHdpbGwgYmUgZml4ZWQgb25jZSBMU0kgZW5naW5lZXJzIGhhdmUgYXVkaXRlZCB0aGUKKwkqICAgICAgICBmaXJtd2FyZSBmb3IgcG9zc2libGUgaXNzdWVzLgorCSovCisJaWYgKHNkZXYtPmNoYW5uZWwgPCBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyAmJgorCQkJCXNkZXYtPnR5cGUgPT0gVFlQRV9ESVNLKSB7CisJCXBkX2luZGV4ID0gKHNkZXYtPmNoYW5uZWwgKiBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwpICsKKwkJCQkJCQkJc2Rldi0+aWQ7CisJCWlmIChpbnN0YW5jZS0+cGRfbGlzdFtwZF9pbmRleF0uZHJpdmVTdGF0ZSA9PQorCQkJCQkJTVJfUERfU1RBVEVfU1lTVEVNKSB7CisJCQlibGtfcXVldWVfcnFfdGltZW91dChzZGV2LT5yZXF1ZXN0X3F1ZXVlLAorCQkJCU1FR0FTQVNfREVGQVVMVF9DTURfVElNRU9VVCAqIEhaKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkqIFRoZSBSQUlEIGZpcm13YXJlIG1heSByZXF1aXJlIGV4dGVuZGVkIHRpbWVvdXRzLgorCSovCisJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwKKwkJTUVHQVNBU19ERUZBVUxUX0NNRF9USU1FT1VUICogSFopOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lZ2FzYXNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXUxNiAgICAgICAgICAgICBwZF9pbmRleCA9IDA7CisJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlIDsKKwlpbnN0YW5jZSA9IG1lZ2FzYXNfbG9va3VwX2luc3RhbmNlKHNkZXYtPmhvc3QtPmhvc3Rfbm8pOworCWlmICgoc2Rldi0+Y2hhbm5lbCA8IE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTKSAmJgorCQkJCShzZGV2LT50eXBlID09IFRZUEVfRElTSykpIHsKKwkJLyoKKwkJICogT3BlbiB0aGUgT1Mgc2NhbiB0byB0aGUgU1lTVEVNIFBECisJCSAqLworCQlwZF9pbmRleCA9CisJCQkoc2Rldi0+Y2hhbm5lbCAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkgKworCQkJc2Rldi0+aWQ7CisJCWlmICgoaW5zdGFuY2UtPnBkX2xpc3RbcGRfaW5kZXhdLmRyaXZlU3RhdGUgPT0KKwkJCQkJTVJfUERfU1RBVEVfU1lTVEVNKSAmJgorCQkJKGluc3RhbmNlLT5wZF9saXN0W3BkX2luZGV4XS5kcml2ZVR5cGUgPT0KKwkJCQkJCVRZUEVfRElTSykpIHsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAtRU5YSU87CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xMDcyLDcgKzEzMTEsMTQgQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCWluc3RhbmNlLT5mbGFnICY9IH5NRUdBU0FTX0ZXX0JVU1k7Ci0JCWluc3RhbmNlLT5ob3N0LT5jYW5fcXVldWUgPQorCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzNTS0lOTlkpIHx8CisJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkpIHsKKwkJCWluc3RhbmNlLT5ob3N0LT5jYW5fcXVldWUgPQorCQkJCWluc3RhbmNlLT5tYXhfZndfY21kcyAtIE1FR0FTQVNfU0tJTk5ZX0lOVF9DTURTOworCQl9IGVsc2UKKwkJCWluc3RhbmNlLT5ob3N0LT5jYW5fcXVldWUgPQogCQkJCWluc3RhbmNlLT5tYXhfZndfY21kcyAtIE1FR0FTQVNfSU5UX0NNRFM7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CkBAIC0xMTE3LDggKzEzNjMsMTYgQEAKIAkJKiBTZW5kIHNpZ25hbCB0byBGVyB0byBzdG9wIHByb2Nlc3NpbmcgYW55IHBlbmRpbmcgY21kcy4KIAkJKiBUaGUgY29udHJvbGxlciB3aWxsIGJlIHRha2VuIG9mZmxpbmUgYnkgdGhlIE9TIG5vdy4KIAkJKi8KLQkJd3JpdGVsKE1GSV9TVE9QX0FEUCwKKwkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQlQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDczU0tJTk5ZKSB8fAorCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpKSB7CisJCQl3cml0ZWwoTUZJX1NUT1BfQURQLAorCQkJCSZpbnN0YW5jZS0+cmVnX3NldC0+cmVzZXJ2ZWRfMFswXSk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwoTUZJX1NUT1BfQURQLAogCQkJCSZpbnN0YW5jZS0+cmVnX3NldC0+aW5ib3VuZF9kb29yYmVsbCk7CisJCX0KIAkJbWVnYXNhc19kdW1wX3BlbmRpbmdfZnJhbWVzKGluc3RhbmNlKTsKIAkJaW5zdGFuY2UtPmh3X2NyaXRfZXJyb3IgPSAxOwogCQlyZXR1cm4gRkFJTEVEOwpAQCAtMTI2Niw2ICsxNTIwLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWVnYXNhc19hZW5fcG9sbGluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCiAvKioKICAqIG1lZ2FzYXNfc2VydmljZV9hZW4gLQlQcm9jZXNzZXMgYW4gZXZlbnQgbm90aWZpY2F0aW9uCiAgKiBAaW5zdGFuY2U6CQkJQWRhcHRlciBzb2Z0IHN0YXRlCkBAIC0xMjgxLDE2ICsxNTM3LDM2IEBACiBzdGF0aWMgdm9pZAogbWVnYXNhc19zZXJ2aWNlX2FlbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLyoKIAkgKiBEb24ndCBzaWduYWwgYXBwIGlmIGl0IGlzIGp1c3QgYW4gYWJvcnRlZCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgYWVuCiAJICovCi0JaWYgKCFjbWQtPmFib3J0X2FlbikKKwlpZiAoKCFjbWQtPmFib3J0X2FlbikgJiYgKGluc3RhbmNlLT51bmxvYWQgPT0gMCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvbGxfYWVuX2xvY2ssIGZsYWdzKTsKKwkJbWVnYXNhc19wb2xsX3dhaXRfYWVuID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9sbF9hZW5fbG9jaywgZmxhZ3MpOworCQl3YWtlX3VwKCZtZWdhc2FzX3BvbGxfd2FpdCk7CiAJCWtpbGxfZmFzeW5jKCZtZWdhc2FzX2FzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CisJfQogCWVsc2UKIAkJY21kLT5hYm9ydF9hZW4gPSAwOwogCiAJaW5zdGFuY2UtPmFlbl9jbWQgPSBOVUxMOwogCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKKworCWlmIChpbnN0YW5jZS0+dW5sb2FkID09IDApIHsKKwkJc3RydWN0IG1lZ2FzYXNfYWVuX2V2ZW50ICpldjsKKwkJZXYgPSBremFsbG9jKHNpemVvZigqZXYpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtZWdhc2FzX3NlcnZpY2VfYWVuOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJfSBlbHNlIHsKKwkJCWV2LT5pbnN0YW5jZSA9IGluc3RhbmNlOworCQkJaW5zdGFuY2UtPmV2ID0gZXY7CisJCQlJTklUX1dPUksoJmV2LT5ob3RwbHVnX3dvcmssIG1lZ2FzYXNfYWVuX3BvbGxpbmcpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKAorCQkJCShzdHJ1Y3QgZGVsYXllZF93b3JrICopJmV2LT5ob3RwbHVnX3dvcmssIDApOworCQl9CisJfQogfQogCiAvKgpAQCAtMTMwMiw2ICsxNTc4LDcgQEAKIAkubmFtZSA9ICJMU0kgU0FTIGJhc2VkIE1lZ2FSQUlEIGRyaXZlciIsCiAJLnByb2NfbmFtZSA9ICJtZWdhcmFpZF9zYXMiLAogCS5zbGF2ZV9jb25maWd1cmUgPSBtZWdhc2FzX3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfYWxsb2MgPSBtZWdhc2FzX3NsYXZlX2FsbG9jLAogCS5xdWV1ZWNvbW1hbmQgPSBtZWdhc2FzX3F1ZXVlX2NvbW1hbmQsCiAJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gbWVnYXNhc19yZXNldF9kZXZpY2UsCiAJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gbWVnYXNhc19yZXNldF9idXNfaG9zdCwKQEAgLTEzNzAsNiArMTY0Nyw3IEBACiB7CiAJaW50IGV4Y2VwdGlvbiA9IDA7CiAJc3RydWN0IG1lZ2FzYXNfaGVhZGVyICpoZHIgPSAmY21kLT5mcmFtZS0+aGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY21kLT5zY21kKQogCQljbWQtPnNjbWQtPlNDcC5wdHIgPSBOVUxMOwpAQCAtMTQ1OSw2ICsxNzM3LDEyIEBACiAJY2FzZSBNRklfQ01EX1NNUDoKIAljYXNlIE1GSV9DTURfU1RQOgogCWNhc2UgTUZJX0NNRF9EQ01EOgorCQlpZiAoY21kLT5mcmFtZS0+ZGNtZC5vcGNvZGUgPT0gTVJfRENNRF9DVFJMX0VWRU5UX0dFVF9JTkZPIHx8CisJCQljbWQtPmZyYW1lLT5kY21kLm9wY29kZSA9PSBNUl9EQ01EX0NUUkxfRVZFTlRfR0VUKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9sbF9hZW5fbG9jaywgZmxhZ3MpOworCQkJbWVnYXNhc19wb2xsX3dhaXRfYWVuID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvbGxfYWVuX2xvY2ssIGZsYWdzKTsKKwkJfQogCiAJCS8qCiAJCSAqIFNlZSBpZiBnb3QgYW4gZXZlbnQgbm90aWZpY2F0aW9uCkBAIC0xNTM2LDYgKzE4MjAsNyBAQAogCXU4IG1heF93YWl0OwogCXUzMiBmd19zdGF0ZTsKIAl1MzIgY3VyX3N0YXRlOworCXUzMiBhYnNfc3RhdGUsIGN1cnJfYWJzX3N0YXRlOwogCiAJZndfc3RhdGUgPSBpbnN0YW5jZS0+aW5zdGFuY2V0LT5yZWFkX2Z3X3N0YXR1c19yZWcoaW5zdGFuY2UtPnJlZ19zZXQpICYgTUZJX1NUQVRFX01BU0s7CiAKQEAgLTE1NDUsNiArMTgzMCw5IEBACiAKIAl3aGlsZSAoZndfc3RhdGUgIT0gTUZJX1NUQVRFX1JFQURZKSB7CiAKKwkJYWJzX3N0YXRlID0KKwkJaW5zdGFuY2UtPmluc3RhbmNldC0+cmVhZF9md19zdGF0dXNfcmVnKGluc3RhbmNlLT5yZWdfc2V0KTsKKwogCQlzd2l0Y2ggKGZ3X3N0YXRlKSB7CiAKIAkJY2FzZSBNRklfU1RBVEVfRkFVTFQ6CkBAIC0xNTU2LDE4ICsxODQ0LDM2IEBACiAJCQkvKgogCQkJICogU2V0IHRoZSBDTFIgYml0IGluIGluYm91bmQgZG9vcmJlbGwKIAkJCSAqLwotCQkJd3JpdGVsKE1GSV9JTklUX0NMRUFSX0hBTkRTSEFLRXxNRklfSU5JVF9IT1RQTFVHLAotCQkJCSZpbnN0YW5jZS0+cmVnX3NldC0+aW5ib3VuZF9kb29yYmVsbCk7CisJCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCQlQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDczU0tJTk5ZKSB8fAorCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkpIHsKIAotCQkJbWF4X3dhaXQgPSAyOworCQkJCXdyaXRlbCgKKwkJCQkgIE1GSV9JTklUX0NMRUFSX0hBTkRTSEFLRXxNRklfSU5JVF9IT1RQTFVHLAorCQkJCSAgJmluc3RhbmNlLT5yZWdfc2V0LT5yZXNlcnZlZF8wWzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJd3JpdGVsKAorCQkJCSAgICBNRklfSU5JVF9DTEVBUl9IQU5EU0hBS0V8TUZJX0lOSVRfSE9UUExVRywKKwkJCQkJJmluc3RhbmNlLT5yZWdfc2V0LT5pbmJvdW5kX2Rvb3JiZWxsKTsKKwkJCX0KKworCQkJbWF4X3dhaXQgPSBNRUdBU0FTX1JFU0VUX1dBSVRfVElNRTsKIAkJCWN1cl9zdGF0ZSA9IE1GSV9TVEFURV9XQUlUX0hBTkRTSEFLRTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUZJX1NUQVRFX0JPT1RfTUVTU0FHRV9QRU5ESU5HOgotCQkJd3JpdGVsKE1GSV9JTklUX0hPVFBMVUcsCi0JCQkJJmluc3RhbmNlLT5yZWdfc2V0LT5pbmJvdW5kX2Rvb3JiZWxsKTsKKwkJCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzNTS0lOTlkpIHx8CisJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpKSB7CisJCQkJd3JpdGVsKE1GSV9JTklUX0hPVFBMVUcsCisJCQkJJmluc3RhbmNlLT5yZWdfc2V0LT5yZXNlcnZlZF8wWzBdKTsKKwkJCX0gZWxzZQorCQkJCXdyaXRlbChNRklfSU5JVF9IT1RQTFVHLAorCQkJCQkmaW5zdGFuY2UtPnJlZ19zZXQtPmluYm91bmRfZG9vcmJlbGwpOwogCi0JCQltYXhfd2FpdCA9IDEwOworCQkJbWF4X3dhaXQgPSBNRUdBU0FTX1JFU0VUX1dBSVRfVElNRTsKIAkJCWN1cl9zdGF0ZSA9IE1GSV9TVEFURV9CT09UX01FU1NBR0VfUEVORElORzsKIAkJCWJyZWFrOwogCkBAIC0xNTc2LDkgKzE4ODIsMTcgQEAKIAkJCSAqIEJyaW5nIGl0IHRvIFJFQURZIHN0YXRlOyBhc3N1bWluZyBtYXggd2FpdCAxMCBzZWNzCiAJCQkgKi8KIAkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7Ci0JCQl3cml0ZWwoTUZJX1JFU0VUX0ZMQUdTLCAmaW5zdGFuY2UtPnJlZ19zZXQtPmluYm91bmRfZG9vcmJlbGwpOworCQkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWSkgfHwKKwkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpKSB7CisJCQkJd3JpdGVsKE1GSV9SRVNFVF9GTEFHUywKKwkJCQkJJmluc3RhbmNlLT5yZWdfc2V0LT5yZXNlcnZlZF8wWzBdKTsKKwkJCX0gZWxzZQorCQkJCXdyaXRlbChNRklfUkVTRVRfRkxBR1MsCisJCQkJCSZpbnN0YW5jZS0+cmVnX3NldC0+aW5ib3VuZF9kb29yYmVsbCk7CiAKLQkJCW1heF93YWl0ID0gNjA7CisJCQltYXhfd2FpdCA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOwogCQkJY3VyX3N0YXRlID0gTUZJX1NUQVRFX09QRVJBVElPTkFMOwogCQkJYnJlYWs7CiAKQEAgLTE1ODYsMzIgKzE5MDAsMzIgQEAKIAkJCS8qCiAJCQkgKiBUaGlzIHN0YXRlIHNob3VsZCBub3QgbGFzdCBmb3IgbW9yZSB0aGFuIDIgc2Vjb25kcwogCQkJICovCi0JCQltYXhfd2FpdCA9IDI7CisJCQltYXhfd2FpdCA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOwogCQkJY3VyX3N0YXRlID0gTUZJX1NUQVRFX1VOREVGSU5FRDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUZJX1NUQVRFX0JCX0lOSVQ6Ci0JCQltYXhfd2FpdCA9IDI7CisJCQltYXhfd2FpdCA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOwogCQkJY3VyX3N0YXRlID0gTUZJX1NUQVRFX0JCX0lOSVQ7CiAJCQlicmVhazsKIAogCQljYXNlIE1GSV9TVEFURV9GV19JTklUOgotCQkJbWF4X3dhaXQgPSAyMDsKKwkJCW1heF93YWl0ID0gTUVHQVNBU19SRVNFVF9XQUlUX1RJTUU7CiAJCQljdXJfc3RhdGUgPSBNRklfU1RBVEVfRldfSU5JVDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUZJX1NUQVRFX0ZXX0lOSVRfMjoKLQkJCW1heF93YWl0ID0gMjA7CisJCQltYXhfd2FpdCA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOwogCQkJY3VyX3N0YXRlID0gTUZJX1NUQVRFX0ZXX0lOSVRfMjsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUZJX1NUQVRFX0RFVklDRV9TQ0FOOgotCQkJbWF4X3dhaXQgPSAyMDsKKwkJCW1heF93YWl0ID0gTUVHQVNBU19SRVNFVF9XQUlUX1RJTUU7CiAJCQljdXJfc3RhdGUgPSBNRklfU1RBVEVfREVWSUNFX1NDQU47CiAJCQlicmVhazsKIAogCQljYXNlIE1GSV9TVEFURV9GTFVTSF9DQUNIRToKLQkJCW1heF93YWl0ID0gMjA7CisJCQltYXhfd2FpdCA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOwogCQkJY3VyX3N0YXRlID0gTUZJX1NUQVRFX0ZMVVNIX0NBQ0hFOwogCQkJYnJlYWs7CiAKQEAgLTE2MjcsOCArMTk0MSwxMCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgKG1heF93YWl0ICogMTAwMCk7IGkrKykgewogCQkJZndfc3RhdGUgPSBpbnN0YW5jZS0+aW5zdGFuY2V0LT5yZWFkX2Z3X3N0YXR1c19yZWcoaW5zdGFuY2UtPnJlZ19zZXQpICYgIAogCQkJCQlNRklfU1RBVEVfTUFTSyA7CisJCWN1cnJfYWJzX3N0YXRlID0KKwkJaW5zdGFuY2UtPmluc3RhbmNldC0+cmVhZF9md19zdGF0dXNfcmVnKGluc3RhbmNlLT5yZWdfc2V0KTsKIAotCQkJaWYgKGZ3X3N0YXRlID09IGN1cl9zdGF0ZSkgeworCQkJaWYgKGFic19zdGF0ZSA9PSBjdXJyX2Fic19zdGF0ZSkgewogCQkJCW1zbGVlcCgxKTsKIAkJCX0gZWxzZQogCQkJCWJyZWFrOwpAQCAtMTYzNyw3ICsxOTUzLDcgQEAKIAkJLyoKIAkJICogUmV0dXJuIGVycm9yIGlmIGZ3X3N0YXRlIGhhc24ndCBjaGFuZ2VkIGFmdGVyIG1heF93YWl0CiAJCSAqLwotCQlpZiAoZndfc3RhdGUgPT0gY3VyX3N0YXRlKSB7CisJCWlmIChjdXJyX2Fic19zdGF0ZSA9PSBhYnNfc3RhdGUpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJGVyBzdGF0ZSBbJWRdIGhhc24ndCBjaGFuZ2VkICIKIAkJCSAgICAgICAiaW4gJWQgc2Vjc1xuIiwgZndfc3RhdGUsIG1heF93YWl0KTsKIAkJCXJldHVybiAtRU5PREVWOwpAQCAtMTcxNSw2ICsyMDMxLDEwIEBACiAJc2dlX3N6ID0gKElTX0RNQTY0KSA/IHNpemVvZihzdHJ1Y3QgbWVnYXNhc19zZ2U2NCkgOgogCSAgICBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfc2dlMzIpOwogCisJaWYgKGluc3RhbmNlLT5mbGFnX2llZWUpIHsKKwkJc2dlX3N6ID0gc2l6ZW9mKHN0cnVjdCBtZWdhc2FzX3NnZV9za2lubnkpOworCX0KKwogCS8qCiAJICogQ2FsY3VsYXRlZCB0aGUgbnVtYmVyIG9mIDY0Ynl0ZSBmcmFtZXMgcmVxdWlyZWQgZm9yIFNHTAogCSAqLwpAQCAtMTc3Nyw2ICsyMDk3LDcgQEAKIAkJfQogCiAJCWNtZC0+ZnJhbWUtPmlvLmNvbnRleHQgPSBjbWQtPmluZGV4OworCQljbWQtPmZyYW1lLT5pby5wYWRfMCA9IDA7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xODgyLDYgKzIyMDMsOTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIG1lZ2FzYXNfZ2V0X3BkX2xpc3RfaW5mbyAtCVJldHVybnMgRlcncyBwZF9saXN0IHN0cnVjdHVyZQorICogQGluc3RhbmNlOgkJCQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqIEBwZF9saXN0OgkJCQlwZF9saXN0IHN0cnVjdHVyZQorICoKKyAqIElzc3VlcyBhbiBpbnRlcm5hbCBjb21tYW5kIChEQ01EKSB0byBnZXQgdGhlIEZXJ3MgY29udHJvbGxlciBQRAorICogbGlzdCBzdHJ1Y3R1cmUuICBUaGlzIGluZm9ybWF0aW9uIGlzIG1haW5seSB1c2VkIHRvIGZpbmQgb3V0IFNZU1RFTQorICogc3VwcG9ydGVkIGJ5IHRoZSBGVy4KKyAqLworc3RhdGljIGludAorbWVnYXNhc19nZXRfcGRfbGlzdChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisJaW50IHJldCA9IDAsIHBkX2luZGV4ID0gMDsKKwlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWVnYXNhc19kY21kX2ZyYW1lICpkY21kOworCXN0cnVjdCBNUl9QRF9MSVNUICpjaTsKKwlzdHJ1Y3QgTVJfUERfQUREUkVTUyAqcGRfYWRkcjsKKwlkbWFfYWRkcl90IGNpX2ggPSAwOworCisJY21kID0gbWVnYXNhc19nZXRfY21kKGluc3RhbmNlKTsKKworCWlmICghY21kKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzIChnZXRfcGRfbGlzdCk6IEZhaWxlZCB0byBnZXQgY21kXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGNtZCA9ICZjbWQtPmZyYW1lLT5kY21kOworCisJY2kgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpbnN0YW5jZS0+cGRldiwKKwkJICBNRUdBU0FTX01BWF9QRCAqIHNpemVvZihzdHJ1Y3QgTVJfUERfTElTVCksICZjaV9oKTsKKworCWlmICghY2kpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkZhaWxlZCB0byBhbGxvYyBtZW0gZm9yIHBkX2xpc3RcbiIpOworCQltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjaSwgMCwgc2l6ZW9mKCpjaSkpOworCW1lbXNldChkY21kLT5tYm94LmIsIDAsIE1GSV9NQk9YX1NJWkUpOworCisJZGNtZC0+bWJveC5iWzBdID0gTVJfUERfUVVFUllfVFlQRV9FWFBPU0VEX1RPX0hPU1Q7CisJZGNtZC0+bWJveC5iWzFdID0gMDsKKwlkY21kLT5jbWQgPSBNRklfQ01EX0RDTUQ7CisJZGNtZC0+Y21kX3N0YXR1cyA9IDB4RkY7CisJZGNtZC0+c2dlX2NvdW50ID0gMTsKKwlkY21kLT5mbGFncyA9IE1GSV9GUkFNRV9ESVJfUkVBRDsKKwlkY21kLT50aW1lb3V0ID0gMDsKKwlkY21kLT5kYXRhX3hmZXJfbGVuID0gTUVHQVNBU19NQVhfUEQgKiBzaXplb2Yoc3RydWN0IE1SX1BEX0xJU1QpOworCWRjbWQtPm9wY29kZSA9IE1SX0RDTURfUERfTElTVF9RVUVSWTsKKwlkY21kLT5zZ2wuc2dlMzJbMF0ucGh5c19hZGRyID0gY2lfaDsKKwlkY21kLT5zZ2wuc2dlMzJbMF0ubGVuZ3RoID0gTUVHQVNBU19NQVhfUEQgKiBzaXplb2Yoc3RydWN0IE1SX1BEX0xJU1QpOworCisJaWYgKCFtZWdhc2FzX2lzc3VlX3BvbGxlZChpbnN0YW5jZSwgY21kKSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IC0xOworCX0KKworCS8qCisJKiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHdpbGwgZ2V0IHRoZSBpbnN0YW5jZSBQRCBMSVNULgorCSovCisKKwlwZF9hZGRyID0gY2ktPmFkZHI7CisKKwlpZiAoIHJldCA9PSAwICYmCisJCShjaS0+Y291bnQgPAorCQkgIChNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyAqIE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkpKSB7CisKKwkJbWVtc2V0KGluc3RhbmNlLT5wZF9saXN0LCAwLAorCQkJTUVHQVNBU19NQVhfUEQgKiBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfcGRfbGlzdCkpOworCisJCWZvciAocGRfaW5kZXggPSAwOyBwZF9pbmRleCA8IGNpLT5jb3VudDsgcGRfaW5kZXgrKykgeworCisJCQlpbnN0YW5jZS0+cGRfbGlzdFtwZF9hZGRyLT5kZXZpY2VJZF0udGlkCT0KKwkJCQkJCQlwZF9hZGRyLT5kZXZpY2VJZDsKKwkJCWluc3RhbmNlLT5wZF9saXN0W3BkX2FkZHItPmRldmljZUlkXS5kcml2ZVR5cGUJPQorCQkJCQkJCXBkX2FkZHItPnNjc2lEZXZUeXBlOworCQkJaW5zdGFuY2UtPnBkX2xpc3RbcGRfYWRkci0+ZGV2aWNlSWRdLmRyaXZlU3RhdGUJPQorCQkJCQkJCU1SX1BEX1NUQVRFX1NZU1RFTTsKKwkJCXBkX2FkZHIrKzsKKwkJfQorCX0KKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW5zdGFuY2UtPnBkZXYsCisJCQkJTUVHQVNBU19NQVhfUEQgKiBzaXplb2Yoc3RydWN0IE1SX1BEX0xJU1QpLAorCQkJCWNpLCBjaV9oKTsKKwltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIG1lZ2FzYXNfZ2V0X2NvbnRyb2xsZXJfaW5mbyAtCVJldHVybnMgRlcncyBjb250cm9sbGVyIHN0cnVjdHVyZQogICogQGluc3RhbmNlOgkJCQlBZGFwdGVyIHNvZnQgc3RhdGUKQEAgLTIwODEsNiArMjQ5Myw4IEBACiAJICogTWFwIHRoZSBtZXNzYWdlIHJlZ2lzdGVycwogCSAqLwogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9TQVMxMDc4R0VOMikgfHwKKwkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkgfHwKKwkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWSkgfHwKIAkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3OUdFTjIpKSB7CiAJCWluc3RhbmNlLT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaW5zdGFuY2UtPnBkZXYsIDEpOwogCX0gZWxzZSB7CkBAIC0yMTExLDYgKzI1MjUsMTAgQEAKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDc5R0VOMjoKIAkJCWluc3RhbmNlLT5pbnN0YW5jZXQgPSAmbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZV9nZW4yOwogCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDcxU0tJTk5ZOgorCQkJaW5zdGFuY2UtPmluc3RhbmNldCA9ICZtZWdhc2FzX2luc3RhbmNlX3RlbXBsYXRlX3NraW5ueTsKKwkJCWJyZWFrOwogCQljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX1NBUzEwNjRSOgogCQljYXNlIFBDSV9ERVZJQ0VfSURfREVMTF9QRVJDNToKIAkJZGVmYXVsdDoKQEAgLTIxNjYsNiArMjU4NCwxMCBAQAogCWlmIChtZWdhc2FzX2lzc3VlX2luaXRfbWZpKGluc3RhbmNlKSkKIAkJZ290byBmYWlsX2Z3X2luaXQ7CiAKKwltZW1zZXQoaW5zdGFuY2UtPnBkX2xpc3QsIDAgLAorCQkoTUVHQVNBU19NQVhfUEQgKiBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfcGRfbGlzdCkpKTsKKwltZWdhc2FzX2dldF9wZF9saXN0KGluc3RhbmNlKTsKKwogCWN0cmxfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZWdhc2FzX2N0cmxfaW5mbyksIEdGUF9LRVJORUwpOwogCiAJLyoKQEAgLTI0MDksNiArMjgzMSwxMSBAQAogCWRjbWQtPnNnbC5zZ2UzMlswXS5waHlzX2FkZHIgPSAodTMyKSBpbnN0YW5jZS0+ZXZ0X2RldGFpbF9oOwogCWRjbWQtPnNnbC5zZ2UzMlswXS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfZXZ0X2RldGFpbCk7CiAKKwlpZiAoaW5zdGFuY2UtPmFlbl9jbWQgIT0gTlVMTCkgeworCQltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CisJCXJldHVybiAwOworCX0KKwogCS8qCiAJICogU3RvcmUgcmVmZXJlbmNlIHRvIHRoZSBjbWQgdXNlZCB0byByZWdpc3RlciBmb3IgQUVOLiBXaGVuIGFuCiAJICogYXBwbGljYXRpb24gd2FudHMgdXMgdG8gcmVnaXN0ZXIgZm9yIEFFTiwgd2UgaGF2ZSB0byBhYm9ydCB0aGlzCkBAIC0yNDE5LDcgKzI4NDYsOCBAQAogCS8qCiAJICogSXNzdWUgdGhlIGFlbiByZWdpc3RyYXRpb24gZnJhbWUKIAkgKi8KLQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5maXJlX2NtZChjbWQtPmZyYW1lX3BoeXNfYWRkciAsMCxpbnN0YW5jZS0+cmVnX3NldCk7CisJaW5zdGFuY2UtPmluc3RhbmNldC0+ZmlyZV9jbWQoaW5zdGFuY2UsCisJCQljbWQtPmZyYW1lX3BoeXNfYWRkciwgMCwgaW5zdGFuY2UtPnJlZ19zZXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDY1LDcgKzI4OTMsMTMgQEAKIAkgKi8KIAlob3N0LT5pcnEgPSBpbnN0YW5jZS0+cGRldi0+aXJxOwogCWhvc3QtPnVuaXF1ZV9pZCA9IGluc3RhbmNlLT51bmlxdWVfaWQ7Ci0JaG9zdC0+Y2FuX3F1ZXVlID0gaW5zdGFuY2UtPm1heF9md19jbWRzIC0gTUVHQVNBU19JTlRfQ01EUzsKKwlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWSkgfHwKKwkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkpIHsKKwkJaG9zdC0+Y2FuX3F1ZXVlID0KKwkJCWluc3RhbmNlLT5tYXhfZndfY21kcyAtIE1FR0FTQVNfU0tJTk5ZX0lOVF9DTURTOworCX0gZWxzZQorCQlob3N0LT5jYW5fcXVldWUgPQorCQkJaW5zdGFuY2UtPm1heF9md19jbWRzIC0gTUVHQVNBU19JTlRfQ01EUzsKIAlob3N0LT50aGlzX2lkID0gaW5zdGFuY2UtPmluaXRfaWQ7CiAJaG9zdC0+c2dfdGFibGVzaXplID0gaW5zdGFuY2UtPm1heF9udW1fc2dlOwogCWhvc3QtPm1heF9zZWN0b3JzID0gaW5zdGFuY2UtPm1heF9zZWN0b3JzX3Blcl9yZXE7CkBAIC0yNTcyLDYgKzMwMDYsOSBAQAogCiAJKmluc3RhbmNlLT5wcm9kdWNlciA9IDA7CiAJKmluc3RhbmNlLT5jb25zdW1lciA9IDA7CisJbWVnYXNhc19wb2xsX3dhaXRfYWVuID0gMDsKKwlpbnN0YW5jZS0+ZmxhZ19pZWVlID0gMDsKKwlpbnN0YW5jZS0+ZXYgPSBOVUxMOwogCiAJaW5zdGFuY2UtPmV2dF9kZXRhaWwgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAogCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QKQEAgLTI1OTUsMTAgKzMwMzIsMTEgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbnN0YW5jZS0+YWJvcnRfY21kX3dhaXRfcSk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaW5zdGFuY2UtPmNtZF9wb29sX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpbnN0YW5jZS0+ZmlyZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaW5zdGFuY2UtPmNvbXBsZXRpb25fbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBvbGxfYWVuX2xvY2spOwogCiAJbXV0ZXhfaW5pdCgmaW5zdGFuY2UtPmFlbl9tdXRleCk7Ci0Jc2VtYV9pbml0KCZpbnN0YW5jZS0+aW9jdGxfc2VtLCBNRUdBU0FTX0lOVF9DTURTKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBQQ0kgcmVsYXRlZCBhbmQgbWlzYyBwYXJhbWV0ZXJzCkBAIC0yNjA4LDggKzMwNDYsMTYgQEAKIAlpbnN0YW5jZS0+dW5pcXVlX2lkID0gcGRldi0+YnVzLT5udW1iZXIgPDwgOCB8IHBkZXYtPmRldmZuOwogCWluc3RhbmNlLT5pbml0X2lkID0gTUVHQVNBU19ERUZBVUxUX0lOSVRfSUQ7CiAKKwlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWSkgfHwKKwkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkpIHsKKwkJaW5zdGFuY2UtPmZsYWdfaWVlZSA9IDE7CisJCXNlbWFfaW5pdCgmaW5zdGFuY2UtPmlvY3RsX3NlbSwgTUVHQVNBU19TS0lOTllfSU5UX0NNRFMpOworCX0gZWxzZQorCQlzZW1hX2luaXQoJmluc3RhbmNlLT5pb2N0bF9zZW0sIE1FR0FTQVNfSU5UX0NNRFMpOworCiAJbWVnYXNhc19kYmdfbHZsID0gMDsKIAlpbnN0YW5jZS0+ZmxhZyA9IDA7CisJaW5zdGFuY2UtPnVubG9hZCA9IDE7CiAJaW5zdGFuY2UtPmxhc3RfdGltZSA9IDA7CiAKIAkvKgpAQCAtMjY1NSw2ICszMTAxLDcgQEAKIAlpZiAobWVnYXNhc19pb19hdHRhY2goaW5zdGFuY2UpKQogCQlnb3RvIGZhaWxfaW9fYXR0YWNoOwogCisJaW5zdGFuY2UtPnVubG9hZCA9IDA7CiAJcmV0dXJuIDA7CiAKICAgICAgIGZhaWxfc3RhcnRfYWVuOgpAQCAtMjc3OCwxMiArMzIyNSwyMyBAQAogCiAJaW5zdGFuY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaG9zdCA9IGluc3RhbmNlLT5ob3N0OworCWluc3RhbmNlLT51bmxvYWQgPSAxOwogCiAJaWYgKHBvbGxfbW9kZV9pbykKIAkJZGVsX3RpbWVyX3N5bmMoJmluc3RhbmNlLT5pb19jb21wbGV0aW9uX3RpbWVyKTsKIAogCW1lZ2FzYXNfZmx1c2hfY2FjaGUoaW5zdGFuY2UpOwogCW1lZ2FzYXNfc2h1dGRvd25fY29udHJvbGxlcihpbnN0YW5jZSwgTVJfRENNRF9ISUJFUk5BVEVfU0hVVERPV04pOworCisJLyogY2FuY2VsIHRoZSBkZWxheWVkIHdvcmsgaWYgdGhpcyB3b3JrIHN0aWxsIGluIHF1ZXVlICovCisJaWYgKGluc3RhbmNlLT5ldiAhPSBOVUxMKSB7CisJCXN0cnVjdCBtZWdhc2FzX2Flbl9ldmVudCAqZXYgPSBpbnN0YW5jZS0+ZXY7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoCisJCQkoc3RydWN0IGRlbGF5ZWRfd29yayAqKSZldi0+aG90cGx1Z193b3JrKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkJaW5zdGFuY2UtPmV2ID0gTlVMTDsKKwl9CisKIAl0YXNrbGV0X2tpbGwoJmluc3RhbmNlLT5pc3JfdGFza2xldCk7CiAKIAlwY2lfc2V0X2RydmRhdGEoaW5zdGFuY2UtPnBkZXYsIGluc3RhbmNlKTsKQEAgLTI4NzMsNiArMzMzMSw4IEBACiAJCW1lZ2FzYXNfc3RhcnRfdGltZXIoaW5zdGFuY2UsICZpbnN0YW5jZS0+aW9fY29tcGxldGlvbl90aW1lciwKIAkJCQltZWdhc2FzX2lvX2NvbXBsZXRpb25fdGltZXIsCiAJCQkJTUVHQVNBU19DT01QTEVUSU9OX1RJTUVSX0lOVEVSVkFMKTsKKwlpbnN0YW5jZS0+dW5sb2FkID0gMDsKKwogCXJldHVybiAwOwogCiBmYWlsX2lycToKQEAgLTI5MTMsNiArMzM3Myw3IEBACiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOwogCiAJaW5zdGFuY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW5zdGFuY2UtPnVubG9hZCA9IDE7CiAJaG9zdCA9IGluc3RhbmNlLT5ob3N0OwogCiAJaWYgKHBvbGxfbW9kZV9pbykKQEAgLTI5MjEsNiArMzM4MiwxNiBAQAogCXNjc2lfcmVtb3ZlX2hvc3QoaW5zdGFuY2UtPmhvc3QpOwogCW1lZ2FzYXNfZmx1c2hfY2FjaGUoaW5zdGFuY2UpOwogCW1lZ2FzYXNfc2h1dGRvd25fY29udHJvbGxlcihpbnN0YW5jZSwgTVJfRENNRF9DVFJMX1NIVVRET1dOKTsKKworCS8qIGNhbmNlbCB0aGUgZGVsYXllZCB3b3JrIGlmIHRoaXMgd29yayBzdGlsbCBpbiBxdWV1ZSovCisJaWYgKGluc3RhbmNlLT5ldiAhPSBOVUxMKSB7CisJCXN0cnVjdCBtZWdhc2FzX2Flbl9ldmVudCAqZXYgPSBpbnN0YW5jZS0+ZXY7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoCisJCQkoc3RydWN0IGRlbGF5ZWRfd29yayAqKSZldi0+aG90cGx1Z193b3JrKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkJaW5zdGFuY2UtPmV2ID0gTlVMTDsKKwl9CisKIAl0YXNrbGV0X2tpbGwoJmluc3RhbmNlLT5pc3JfdGFza2xldCk7CiAKIAkvKgpAQCAtMjk2OSw2ICszNDQwLDcgQEAKIHN0YXRpYyB2b2lkIG1lZ2FzYXNfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWluc3RhbmNlLT51bmxvYWQgPSAxOwogCW1lZ2FzYXNfZmx1c2hfY2FjaGUoaW5zdGFuY2UpOwogCW1lZ2FzYXNfc2h1dGRvd25fY29udHJvbGxlcihpbnN0YW5jZSwgTVJfRENNRF9DVFJMX1NIVVRET1dOKTsKIH0KQEAgLTMwMTYsNiArMzQ4OCwyMyBAQAogfQogCiAvKioKKyAqIG1lZ2FzYXNfbWdtdF9wb2xsIC0gIGNoYXIgbm9kZSAicG9sbCIgZW50cnkgcG9pbnQKKyAqICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1lZ2FzYXNfbWdtdF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcG9sbF93YWl0KGZpbGUsICZtZWdhc2FzX3BvbGxfd2FpdCwgd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvbGxfYWVuX2xvY2ssIGZsYWdzKTsKKwlpZiAobWVnYXNhc19wb2xsX3dhaXRfYWVuKQorCQltYXNrID0gICAoUE9MTElOIHwgUE9MTFJETk9STSk7CisJZWxzZQorCQltYXNrID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb2xsX2Flbl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgogICogbWVnYXNhc19tZ210X2Z3X2lvY3RsIC0JSXNzdWVzIG1hbmFnZW1lbnQgaW9jdGxzIHRvIEZXCiAgKiBAaW5zdGFuY2U6CQkJQWRhcHRlciBzb2Z0IHN0YXRlCiAgKiBAYXJncDoJCQlVc2VyJ3MgaW9jdGwgcGFja2V0CkBAIC0zMDMyLDcgKzM1MjEsNyBAQAogCWludCBlcnJvciA9IDAsIGk7CiAJdm9pZCAqc2Vuc2UgPSBOVUxMOwogCWRtYV9hZGRyX3Qgc2Vuc2VfaGFuZGxlOwotCXUzMiAqc2Vuc2VfcHRyOworCXVuc2lnbmVkIGxvbmcgKnNlbnNlX3B0cjsKIAogCW1lbXNldChrYnVmZl9hcnIsIDAsIHNpemVvZihrYnVmZl9hcnIpKTsKIApAQCAtMzA1Niw2ICszNTQ1LDcgQEAKIAkgKi8KIAltZW1jcHkoY21kLT5mcmFtZSwgaW9jLT5mcmFtZS5yYXcsIDIgKiBNRUdBTUZJX0ZSQU1FX1NJWkUpOwogCWNtZC0+ZnJhbWUtPmhkci5jb250ZXh0ID0gY21kLT5pbmRleDsKKwljbWQtPmZyYW1lLT5oZHIucGFkXzAgPSAwOwogCiAJLyoKIAkgKiBUaGUgbWFuYWdlbWVudCBpbnRlcmZhY2UgYmV0d2VlbiBhcHBsaWNhdGlvbnMgYW5kIHRoZSBmdyB1c2VzCkBAIC0zMTA5LDcgKzM1OTksNyBAQAogCQl9CiAKIAkJc2Vuc2VfcHRyID0KLQkJICAgICh1MzIgKikgKCh1bnNpZ25lZCBsb25nKWNtZC0+ZnJhbWUgKyBpb2MtPnNlbnNlX29mZik7CisJCSh1bnNpZ25lZCBsb25nICopICgodW5zaWduZWQgbG9uZyljbWQtPmZyYW1lICsgaW9jLT5zZW5zZV9vZmYpOwogCQkqc2Vuc2VfcHRyID0gc2Vuc2VfaGFuZGxlOwogCX0KIApAQCAtMzE0MCw4ICszNjMwLDggQEAKIAkJICogc2Vuc2VfcHRyIHBvaW50cyB0byB0aGUgbG9jYXRpb24gdGhhdCBoYXMgdGhlIHVzZXIKIAkJICogc2Vuc2UgYnVmZmVyIGFkZHJlc3MKIAkJICovCi0JCXNlbnNlX3B0ciA9ICh1MzIgKikgKCh1bnNpZ25lZCBsb25nKWlvYy0+ZnJhbWUucmF3ICsKLQkJCQkgICAgIGlvYy0+c2Vuc2Vfb2ZmKTsKKwkJc2Vuc2VfcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgKCh1bnNpZ25lZCBsb25nKWlvYy0+ZnJhbWUucmF3ICsKKwkJCQlpb2MtPnNlbnNlX29mZik7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoKHVuc2lnbmVkIGxvbmcpKCpzZW5zZV9wdHIpKSwKIAkJCQkgc2Vuc2UsIGlvYy0+c2Vuc2VfbGVuKSkgewpAQCAtMzE3NywyMCArMzY2Nyw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKm1lZ2FzYXNfbG9va3VwX2luc3RhbmNlKHUxNiBob3N0X25vKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG1lZ2FzYXNfbWdtdF9pbmZvLm1heF9pbmRleDsgaSsrKSB7Ci0KLQkJaWYgKChtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXSkgJiYKLQkJICAgIChtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXS0+aG9zdC0+aG9zdF9ubyA9PSBob3N0X25vKSkKLQkJCXJldHVybiBtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXTsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIGludCBtZWdhc2FzX21nbXRfaW9jdGxfZncoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBtZWdhc2FzX2lvY3BhY2tldCBfX3VzZXIgKnVzZXJfaW9jID0KQEAgLTMyMTQsNiArMzY5MCwxNyBAQAogCQlnb3RvIG91dF9rZnJlZV9pb2M7CiAJfQogCisJaWYgKGluc3RhbmNlLT5od19jcml0X2Vycm9yID09IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvbnRyb2xsZXIgaW4gQ3JpdCBFUlJPUlxuIik7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBvdXRfa2ZyZWVfaW9jOworCX0KKworCWlmIChpbnN0YW5jZS0+dW5sb2FkID09IDEpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIG91dF9rZnJlZV9pb2M7CisJfQorCiAJLyoKIAkgKiBXZSB3aWxsIGFsbG93IG9ubHkgTUVHQVNBU19JTlRfQ01EUyBudW1iZXIgb2YgcGFyYWxsZWwgaW9jdGwgY21kcwogCSAqLwpAQCAtMzI0OSw2ICszNzM2LDE0IEBACiAJaWYgKCFpbnN0YW5jZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoaW5zdGFuY2UtPmh3X2NyaXRfZXJyb3IgPT0gMSkgeworCQllcnJvciA9IC1FTk9ERVY7CisJfQorCisJaWYgKGluc3RhbmNlLT51bmxvYWQgPT0gMSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAltdXRleF9sb2NrKCZpbnN0YW5jZS0+YWVuX211dGV4KTsKIAllcnJvciA9IG1lZ2FzYXNfcmVnaXN0ZXJfYWVuKGluc3RhbmNlLCBhZW4uc2VxX251bSwKIAkJCQkgICAgIGFlbi5jbGFzc19sb2NhbGVfd29yZCk7CkBAIC0zMzM3LDYgKzM4MzIsNyBAQAogCS5vcGVuID0gbWVnYXNhc19tZ210X29wZW4sCiAJLmZhc3luYyA9IG1lZ2FzYXNfbWdtdF9mYXN5bmMsCiAJLnVubG9ja2VkX2lvY3RsID0gbWVnYXNhc19tZ210X2lvY3RsLAorCS5wb2xsID0gbWVnYXNhc19tZ210X3BvbGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwgPSBtZWdhc2FzX21nbXRfY29tcGF0X2lvY3RsLAogI2VuZGlmCkBAIC0zMzc4LDYgKzM4NzQsMTUgQEAKIAkJICAgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90CittZWdhc2FzX3N5c2ZzX3Nob3dfc3VwcG9ydF9wb2xsX2Zvcl9ldmVudChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGQsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc3VwcG9ydF9wb2xsX2Zvcl9ldmVudCk7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUihzdXBwb3J0X3BvbGxfZm9yX2V2ZW50LCBTX0lSVUdPLAorCQkJbWVnYXNhc19zeXNmc19zaG93X3N1cHBvcnRfcG9sbF9mb3JfZXZlbnQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAogbWVnYXNhc19zeXNmc19zaG93X2RiZ19sdmwoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIG1lZ2FzYXNfZGJnX2x2bCk7CkBAIC0zNDUxLDYgKzM5NTYsOTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgdm9pZAorbWVnYXNhc19hZW5fcG9sbGluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1lZ2FzYXNfYWVuX2V2ZW50ICpldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWVnYXNhc19hZW5fZXZlbnQsIGhvdHBsdWdfd29yayk7CisJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0gZXYtPmluc3RhbmNlOworCXVuaW9uIG1lZ2FzYXNfZXZ0X2NsYXNzX2xvY2FsZSBjbGFzc19sb2NhbGU7CisJc3RydWN0ICBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0ICBzY3NpX2RldmljZSAqc2RldjE7CisJdTE2ICAgICBwZF9pbmRleCA9IDA7CisJaW50ICAgICBpLCBqLCBkb3NjYW4gPSAwOworCXUzMiBzZXFfbnVtOworCWludCBlcnJvcjsKKworCWlmICghaW5zdGFuY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIGluc3RhbmNlIVxuIik7CisJCWtmcmVlKGV2KTsKKwkJcmV0dXJuOworCX0KKwlpbnN0YW5jZS0+ZXYgPSBOVUxMOworCWhvc3QgPSBpbnN0YW5jZS0+aG9zdDsKKwlpZiAoaW5zdGFuY2UtPmV2dF9kZXRhaWwpIHsKKworCQlzd2l0Y2ggKGluc3RhbmNlLT5ldnRfZGV0YWlsLT5jb2RlKSB7CisJCWNhc2UgTVJfRVZUX1BEX0lOU0VSVEVEOgorCQljYXNlIE1SX0VWVF9QRF9SRU1PVkVEOgorCQljYXNlIE1SX0VWVF9DVFJMX0hPU1RfQlVTX1NDQU5fUkVRVUVTVEVEOgorCQkJZG9zY2FuID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZG9zY2FuID0gMDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIGV2dF9kZXRhaWwhXG4iKTsKKwkJa2ZyZWUoZXYpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRvc2NhbikgeworCQlwcmludGsoS0VSTl9JTkZPICJzY2FubmluZyAuLi5cbiIpOworCQltZWdhc2FzX2dldF9wZF9saXN0KGluc3RhbmNlKTsKKwkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7IGorKykgeworCQkJCXBkX2luZGV4ID0gaSpNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwgKyBqOworCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsIGksIGosIDApOworCQkJCWlmIChpbnN0YW5jZS0+cGRfbGlzdFtwZF9pbmRleF0uZHJpdmVTdGF0ZSA9PQorCQkJCQkJCU1SX1BEX1NUQVRFX1NZU1RFTSkgeworCQkJCQlpZiAoIXNkZXYxKSB7CisJCQkJCQlzY3NpX2FkZF9kZXZpY2UoaG9zdCwgaSwgaiwgMCk7CisJCQkJCX0KKwkJCQkJaWYgKHNkZXYxKQorCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc2RldjEpIHsKKwkJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2MSk7CisJCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKCBpbnN0YW5jZS0+YWVuX2NtZCAhPSBOVUxMICkgeworCQlrZnJlZShldik7CisJCXJldHVybiA7CisJfQorCisJc2VxX251bSA9IGluc3RhbmNlLT5ldnRfZGV0YWlsLT5zZXFfbnVtICsgMTsKKworCS8qIFJlZ2lzdGVyIEFFTiB3aXRoIEZXIGZvciBsYXRlc3Qgc2VxdWVuY2UgbnVtYmVyIHBsdXMgMSAqLworCWNsYXNzX2xvY2FsZS5tZW1iZXJzLnJlc2VydmVkID0gMDsKKwljbGFzc19sb2NhbGUubWVtYmVycy5sb2NhbGUgPSBNUl9FVlRfTE9DQUxFX0FMTDsKKwljbGFzc19sb2NhbGUubWVtYmVycy5jbGFzcyA9IE1SX0VWVF9DTEFTU19ERUJVRzsKKwltdXRleF9sb2NrKCZpbnN0YW5jZS0+YWVuX211dGV4KTsKKwllcnJvciA9IG1lZ2FzYXNfcmVnaXN0ZXJfYWVuKGluc3RhbmNlLCBzZXFfbnVtLAorCQkJCQljbGFzc19sb2NhbGUud29yZCk7CisJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+YWVuX211dGV4KTsKKworCWlmIChlcnJvcikKKwkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3RlciBhZW4gZmFpbGVkIGVycm9yICV4XG4iLCBlcnJvcik7CisKKwlrZnJlZShldik7Cit9CisKKwogc3RhdGljIERSSVZFUl9BVFRSKHBvbGxfbW9kZV9pbywgU19JUlVHT3xTX0lXVUdPLAogCQltZWdhc2FzX3N5c2ZzX3Nob3dfcG9sbF9tb2RlX2lvLAogCQltZWdhc2FzX3N5c2ZzX3NldF9wb2xsX21vZGVfaW8pOwpAQCAtMzQ2OCw2ICs0MDU5LDggQEAKIAlwcmludGsoS0VSTl9JTkZPICJtZWdhc2FzOiAlcyAlc1xuIiwgTUVHQVNBU19WRVJTSU9OLAogCSAgICAgICBNRUdBU0FTX0VYVF9WRVJTSU9OKTsKIAorCXN1cHBvcnRfcG9sbF9mb3JfZXZlbnQgPSAyOworCiAJbWVtc2V0KCZtZWdhc2FzX21nbXRfaW5mbywgMCwgc2l6ZW9mKG1lZ2FzYXNfbWdtdF9pbmZvKSk7CiAKIAkvKgpAQCAtMzUwMCw2ICs0MDkzLDEyIEBACiAJCQkJICAmZHJpdmVyX2F0dHJfcmVsZWFzZV9kYXRlKTsKIAlpZiAocnZhbCkKIAkJZ290byBlcnJfZGNmX3JlbF9kYXRlOworCisJcnZhbCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmbWVnYXNhc19wY2lfZHJpdmVyLmRyaXZlciwKKwkJCQkmZHJpdmVyX2F0dHJfc3VwcG9ydF9wb2xsX2Zvcl9ldmVudCk7CisJaWYgKHJ2YWwpCisJCWdvdG8gZXJyX2RjZl9zdXBwb3J0X3BvbGxfZm9yX2V2ZW50OworCiAJcnZhbCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmbWVnYXNhc19wY2lfZHJpdmVyLmRyaXZlciwKIAkJCQkgICZkcml2ZXJfYXR0cl9kYmdfbHZsKTsKIAlpZiAocnZhbCkKQEAgLTM1MTYsNyArNDExNSwxMiBAQAogCQkJICAgJmRyaXZlcl9hdHRyX2RiZ19sdmwpOwogZXJyX2RjZl9kYmdfbHZsOgogCWRyaXZlcl9yZW1vdmVfZmlsZSgmbWVnYXNhc19wY2lfZHJpdmVyLmRyaXZlciwKKwkJCSZkcml2ZXJfYXR0cl9zdXBwb3J0X3BvbGxfZm9yX2V2ZW50KTsKKworZXJyX2RjZl9zdXBwb3J0X3BvbGxfZm9yX2V2ZW50OgorCWRyaXZlcl9yZW1vdmVfZmlsZSgmbWVnYXNhc19wY2lfZHJpdmVyLmRyaXZlciwKIAkJCSAgICZkcml2ZXJfYXR0cl9yZWxlYXNlX2RhdGUpOworCiBlcnJfZGNmX3JlbF9kYXRlOgogCWRyaXZlcl9yZW1vdmVfZmlsZSgmbWVnYXNhc19wY2lfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOwogZXJyX2RjZl9hdHRyX3ZlcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaAppbmRleCAwZDAzMzI0Li43MmIyOGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCkBAIC0xOCw5ICsxOCw5IEBACiAvKgogICogTWVnYVJBSUQgU0FTIERyaXZlciBtZXRhIGRhdGEKICAqLwotI2RlZmluZSBNRUdBU0FTX1ZFUlNJT04JCQkJIjAwLjAwLjA0LjAxIgotI2RlZmluZSBNRUdBU0FTX1JFTERBVEUJCQkJIkp1bHkgMjQsIDIwMDgiCi0jZGVmaW5lIE1FR0FTQVNfRVhUX1ZFUlNJT04JCQkiVGh1IEp1bHkgMjQgMTE6NDE6NTEgUFNUIDIwMDgiCisjZGVmaW5lIE1FR0FTQVNfVkVSU0lPTgkJCQkiMDAuMDAuMDQuMTItcmMxIgorI2RlZmluZSBNRUdBU0FTX1JFTERBVEUJCQkJIlNlcC4gMTcsIDIwMDkiCisjZGVmaW5lIE1FR0FTQVNfRVhUX1ZFUlNJT04JCQkiVGh1IFNlcC4gMTcgMTE6NDE6NTEgUFNUIDIwMDkiCiAKIC8qCiAgKiBEZXZpY2UgSURzCkBAIC0zMCw2ICszMCw4IEBACiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTFNJX1ZFUkRFX1pDUgkJMHgwNDEzCiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzEwNzhHRU4yCQkweDAwNzgKICNkZWZpbmUJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3OUdFTjIJCTB4MDA3OQorI2RlZmluZQlQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDczU0tJTk5ZCQkweDAwNzMKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWQkJMHgwMDcxCiAKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC05NCw2ICs5Niw3IEBACiAjZGVmaW5lIE1GSV9GUkFNRV9ESVJfV1JJVEUJCQkweDAwMDgKICNkZWZpbmUgTUZJX0ZSQU1FX0RJUl9SRUFECQkJMHgwMDEwCiAjZGVmaW5lIE1GSV9GUkFNRV9ESVJfQk9USAkJCTB4MDAxOAorI2RlZmluZSBNRklfRlJBTUVfSUVFRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCiAKIC8qCiAgKiBEZWZpbml0aW9uIGZvciBjbWRfc3RhdHVzCkBAIC0xMzEsNiArMTM0LDcgQEAKICNkZWZpbmUgTVJfRENNRF9DTFVTVEVSCQkJCTB4MDgwMDAwMDAKICNkZWZpbmUgTVJfRENNRF9DTFVTVEVSX1JFU0VUX0FMTAkJMHgwODAxMDEwMAogI2RlZmluZSBNUl9EQ01EX0NMVVNURVJfUkVTRVRfTEQJCTB4MDgwMTAyMDAKKyNkZWZpbmUgTVJfRENNRF9QRF9MSVNUX1FVRVJZICAgICAgICAgICAgICAgICAgIDB4MDIwMTAxMDAKIAogLyoKICAqIE1GSSBjb21tYW5kIGNvbXBsZXRpb24gY29kZXMKQEAgLTI1MSwxMCArMjU1LDEwMSBAQAogCU1SX0VWVF9BUkdTX1NUUiwKIAlNUl9FVlRfQVJHU19USU1FLAogCU1SX0VWVF9BUkdTX0VDQywKLQorCU1SX0VWVF9BUkdTX0xEX1BST1AsCisJTVJfRVZUX0FSR1NfUERfU1BBUkUsCisJTVJfRVZUX0FSR1NfUERfSU5ERVgsCisJTVJfRVZUX0FSR1NfRElBR19QQVNTLAorCU1SX0VWVF9BUkdTX0RJQUdfRkFJTCwKKwlNUl9FVlRfQVJHU19QRF9MQkFfTEJBLAorCU1SX0VWVF9BUkdTX1BPUlRfUEhZLAorCU1SX0VWVF9BUkdTX1BEX01JU1NJTkcsCisJTVJfRVZUX0FSR1NfUERfQUREUkVTUywKKwlNUl9FVlRfQVJHU19CSVRNQVAsCisJTVJfRVZUX0FSR1NfQ09OTkVDVE9SLAorCU1SX0VWVF9BUkdTX1BEX1BELAorCU1SX0VWVF9BUkdTX1BEX0ZSVSwKKwlNUl9FVlRfQVJHU19QRF9QQVRISU5GTywKKwlNUl9FVlRfQVJHU19QRF9QT1dFUl9TVEFURSwKKwlNUl9FVlRfQVJHU19HRU5FUklDLAogfTsKIAogLyoKKyAqIGRlZmluZSBjb25zdGFudHMgZm9yIGRldmljZSBsaXN0IHF1ZXJ5IG9wdGlvbnMKKyAqLworZW51bSBNUl9QRF9RVUVSWV9UWVBFIHsKKwlNUl9QRF9RVUVSWV9UWVBFX0FMTCAgICAgICAgICAgICAgICA9IDAsCisJTVJfUERfUVVFUllfVFlQRV9TVEFURSAgICAgICAgICAgICAgPSAxLAorCU1SX1BEX1FVRVJZX1RZUEVfUE9XRVJfU1RBVEUgICAgICAgID0gMiwKKwlNUl9QRF9RVUVSWV9UWVBFX01FRElBX1RZUEUgICAgICAgICA9IDMsCisJTVJfUERfUVVFUllfVFlQRV9TUEVFRCAgICAgICAgICAgICAgPSA0LAorCU1SX1BEX1FVRVJZX1RZUEVfRVhQT1NFRF9UT19IT1NUICAgID0gNSwKK307CisKKyNkZWZpbmUgTVJfRVZUX0NGR19DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIE1SX0VWVF9MRF9TVEFURV9DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MQorI2RlZmluZSBNUl9FVlRfUERfSU5TRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNWIKKyNkZWZpbmUgTVJfRVZUX1BEX1JFTU9WRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDcwCisjZGVmaW5lIE1SX0VWVF9MRF9DUkVBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4YQorI2RlZmluZSBNUl9FVlRfTERfREVMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOGIKKyNkZWZpbmUgTVJfRVZUX0ZPUkVJR05fQ0ZHX0lNUE9SVEVEICAgICAgICAgICAgICAgICAgICAgMHgwMGRiCisjZGVmaW5lIE1SX0VWVF9MRF9PRkZMSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmYworI2RlZmluZSBNUl9FVlRfQ1RSTF9IT1NUX0JVU19TQ0FOX1JFUVVFU1RFRCAgICAgICAgICAgICAweDAxNTIKKyNkZWZpbmUgTUFYX0xPR0lDQUxfRFJJVkVTCQkJCTY0CisKK2VudW0gTVJfUERfU1RBVEUgeworCU1SX1BEX1NUQVRFX1VOQ09ORklHVVJFRF9HT09EICAgPSAweDAwLAorCU1SX1BEX1NUQVRFX1VOQ09ORklHVVJFRF9CQUQgICAgPSAweDAxLAorCU1SX1BEX1NUQVRFX0hPVF9TUEFSRSAgICAgICAgICAgPSAweDAyLAorCU1SX1BEX1NUQVRFX09GRkxJTkUgICAgICAgICAgICAgPSAweDEwLAorCU1SX1BEX1NUQVRFX0ZBSUxFRCAgICAgICAgICAgICAgPSAweDExLAorCU1SX1BEX1NUQVRFX1JFQlVJTEQgICAgICAgICAgICAgPSAweDE0LAorCU1SX1BEX1NUQVRFX09OTElORSAgICAgICAgICAgICAgPSAweDE4LAorCU1SX1BEX1NUQVRFX0NPUFlCQUNLICAgICAgICAgICAgPSAweDIwLAorCU1SX1BEX1NUQVRFX1NZU1RFTSAgICAgICAgICAgICAgPSAweDQwLAorIH07CisKKworIC8qCisgKiBkZWZpbmVzIHRoZSBwaHlzaWNhbCBkcml2ZSBhZGRyZXNzIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgTVJfUERfQUREUkVTUyB7CisJdTE2ICAgICBkZXZpY2VJZDsKKwl1MTYgICAgIGVuY2xEZXZpY2VJZDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4ICBlbmNsSW5kZXg7CisJCQl1OCAgc2xvdE51bWJlcjsKKwkJfSBtclBkQWRkcmVzczsKKwkJc3RydWN0IHsKKwkJCXU4ICBlbmNsUG9zaXRpb247CisJCQl1OCAgZW5jbENvbm5lY3RvckluZGV4OworCQl9IG1yRW5jbEFkZHJlc3M7CisJfTsKKwl1OCAgICAgIHNjc2lEZXZUeXBlOworCXVuaW9uIHsKKwkJdTggICAgICBjb25uZWN0ZWRQb3J0Qml0bWFwOworCQl1OCAgICAgIGNvbm5lY3RlZFBvcnROdW1iZXJzOworCX07CisJdTY0ICAgICBzYXNBZGRyWzJdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIGRlZmluZXMgdGhlIHBoeXNpY2FsIGRyaXZlIGxpc3Qgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBNUl9QRF9MSVNUIHsKKwl1MzIgICAgICAgICAgICAgc2l6ZTsKKwl1MzIgICAgICAgICAgICAgY291bnQ7CisJc3RydWN0IE1SX1BEX0FERFJFU1MgICBhZGRyWzFdOworfSBfX3BhY2tlZDsKKworc3RydWN0IG1lZ2FzYXNfcGRfbGlzdCB7CisJdTE2ICAgICAgICAgICAgIHRpZDsKKwl1OCAgICAgICAgICAgICBkcml2ZVR5cGU7CisJdTggICAgICAgICAgICAgZHJpdmVTdGF0ZTsKK30gX19wYWNrZWQ7CisKKy8qCiAgKiBTQVMgY29udHJvbGxlciBwcm9wZXJ0aWVzCiAgKi8KIHN0cnVjdCBtZWdhc2FzX2N0cmxfcHJvcCB7CkBAIC0yODIsNyArMzc3LDcgQEAKIAl1OCBleHBvc2VfZW5jbF9kZXZpY2VzOwogCXU4IHJlc2VydmVkWzM4XTsKIAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogU0FTIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24KQEAgLTUyNSw3ICs2MjAsNyBAQAogCiAJdTggcGFkWzB4ODAwIC0gMHg2YTBdOwogCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01NDAsNiArNjM1LDggQEAKICNkZWZpbmUgTUVHQVNBU19ERUZBVUxUX0lOSVRfSUQJCQktMQogI2RlZmluZSBNRUdBU0FTX01BWF9MVU4JCQkJOAogI2RlZmluZSBNRUdBU0FTX01BWF9MRAkJCQk2NAorI2RlZmluZSBNRUdBU0FTX01BWF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICogXAorCQkJCQkJTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKQogCiAjZGVmaW5lIE1FR0FTQVNfREJHX0xWTAkJCQkxCiAKQEAgLTU3MCw2ICs2NjcsNyBAQAogICogaXMgc2hvd24gYmVsb3cKICAqLwogI2RlZmluZSBNRUdBU0FTX0lOVF9DTURTCQkJMzIKKyNkZWZpbmUgTUVHQVNBU19TS0lOTllfSU5UX0NNRFMJCQk1CiAKIC8qCiAgKiBGVyBjYW4gYWNjZXB0IGJvdGggMzIgYW5kIDY0IGJpdCBTR0xzLiBXZSB3YW50IHRvIGFsbG9jYXRlIDMyLzY0IGJpdApAQCAtNTg0LDYgKzY4Miw4IEBACiAjZGVmaW5lIE1GSV9SRVBMWV8xMDc4X01FU1NBR0VfSU5URVJSVVBUCTB4ODAwMDAwMDAKICNkZWZpbmUgTUZJX1JFUExZX0dFTjJfTUVTU0FHRV9JTlRFUlJVUFQJMHgwMDAwMDAwMQogI2RlZmluZSBNRklfR0VOMl9FTkFCTEVfSU5URVJSVVBUX01BU0sJCSgweDAwMDAwMDAxIHwgMHgwMDAwMDAwNCkKKyNkZWZpbmUgTUZJX1JFUExZX1NLSU5OWV9NRVNTQUdFX0lOVEVSUlVQVAkweDQwMDAwMDAwCisjZGVmaW5lIE1GSV9TS0lOTllfRU5BQkxFX0lOVEVSUlVQVF9NQVNLCSgweDAwMDAwMDAxKQogCiAvKgogKiByZWdpc3RlciBzZXQgZm9yIGJvdGggMTA2OCBhbmQgMTA3OCBjb250cm9sbGVycwpAQCAtNjQ0LDEwICs3NDQsMTcgQEAKIAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKK3N0cnVjdCBtZWdhc2FzX3NnZV9za2lubnkgeworCXU2NCBwaHlzX2FkZHI7CisJdTMyIGxlbmd0aDsKKwl1MzIgZmxhZzsKK30gX19wYWNrZWQ7CisKIHVuaW9uIG1lZ2FzYXNfc2dsIHsKIAogCXN0cnVjdCBtZWdhc2FzX3NnZTMyIHNnZTMyWzFdOwogCXN0cnVjdCBtZWdhc2FzX3NnZTY0IHNnZTY0WzFdOworCXN0cnVjdCBtZWdhc2FzX3NnZV9za2lubnkgc2dlX3NraW5ueVsxXTsKIAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKQEAgLTEwNjEsMTYgKzExNjgsMTAgQEAKIAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLSBzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZSB7Ci0Jdm9pZCAoKmZpcmVfY21kKShkbWFfYWRkcl90ICx1MzIgLHN0cnVjdCBtZWdhc2FzX3JlZ2lzdGVyX3NldCBfX2lvbWVtICopOwotCi0Jdm9pZCAoKmVuYWJsZV9pbnRyKShzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqKSA7Ci0Jdm9pZCAoKmRpc2FibGVfaW50cikoc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKik7Ci0KLQlpbnQgKCpjbGVhcl9pbnRyKShzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqKTsKLQotCXUzMiAoKnJlYWRfZndfc3RhdHVzX3JlZykoc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKik7Ci0gfTsKK3N0cnVjdCBtZWdhc2FzX2Flbl9ldmVudCB7CisJc3RydWN0IHdvcmtfc3RydWN0IGhvdHBsdWdfd29yazsKKwlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7Cit9OwogCiBzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSB7CiAKQEAgLTEwODUsMTcgKzExODYsMjEgQEAKIAl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKIAlzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqcmVnX3NldDsKIAorCXN0cnVjdCBtZWdhc2FzX3BkX2xpc3QgICAgICAgICAgcGRfbGlzdFtNRUdBU0FTX01BWF9QRF07CiAJczggaW5pdF9pZDsKIAogCXUxNiBtYXhfbnVtX3NnZTsKIAl1MTYgbWF4X2Z3X2NtZHM7CiAJdTMyIG1heF9zZWN0b3JzX3Blcl9yZXE7CisJc3RydWN0IG1lZ2FzYXNfYWVuX2V2ZW50ICpldjsKIAogCXN0cnVjdCBtZWdhc2FzX2NtZCAqKmNtZF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgY21kX3Bvb2w7CiAJc3BpbmxvY2tfdCBjbWRfcG9vbF9sb2NrOwogCS8qIHVzZWQgdG8gc3luY2ggcHJvZHVjZXIsIGNvbnN1bWVyIHB0cnMgaW4gZHBjICovCiAJc3BpbmxvY2tfdCBjb21wbGV0aW9uX2xvY2s7CisJLyogdXNlZCB0byBzeW5jIGZpcmUgdGhlIGNtZCB0byBmdyAqLworCXNwaW5sb2NrX3QgZmlyZV9sb2NrOwogCXN0cnVjdCBkbWFfcG9vbCAqZnJhbWVfZG1hX3Bvb2w7CiAJc3RydWN0IGRtYV9wb29sICpzZW5zZV9kbWFfcG9vbDsKIApAQCAtMTEyMCwxMSArMTIyNSwyNSBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpc3JfdGFza2xldDsKIAogCXU4IGZsYWc7CisJdTggdW5sb2FkOworCXU4IGZsYWdfaWVlZTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdGltZTsKIAogCXN0cnVjdCB0aW1lcl9saXN0IGlvX2NvbXBsZXRpb25fdGltZXI7CiB9OwogCitzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZSB7CisJdm9pZCAoKmZpcmVfY21kKShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqLCBkbWFfYWRkcl90LCBcCisJCXUzMiwgc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKik7CisKKwl2b2lkICgqZW5hYmxlX2ludHIpKHN0cnVjdCBtZWdhc2FzX3JlZ2lzdGVyX3NldCBfX2lvbWVtICopIDsKKwl2b2lkICgqZGlzYWJsZV9pbnRyKShzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqKTsKKworCWludCAoKmNsZWFyX2ludHIpKHN0cnVjdCBtZWdhc2FzX3JlZ2lzdGVyX3NldCBfX2lvbWVtICopOworCisJdTMyICgqcmVhZF9md19zdGF0dXNfcmVnKShzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqKTsKK307CisKICNkZWZpbmUgTUVHQVNBU19JU19MT0dJQ0FMKHNjcCkJCQkJCQlcCiAJKHNjcC0+ZGV2aWNlLT5jaGFubmVsIDwgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMpID8gMCA6IDEKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyLmgKaW5kZXggZjlmNmMwOC4uOTE0MTY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oCkBAIC04LDcgKzgsNyBAQAogICogICAgICAgICAgICAgICAgICBzY2F0dGVyL2dhdGhlciBmb3JtYXRzLgogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDIxLCAyMDA2CiAgKgotICogIG1waTIuaCBWZXJzaW9uOiAgMDIuMDAuMTIKKyAqICBtcGkyLmggVmVyc2lvbjogIDAyLjAwLjEzCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNTIsNiArNTIsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgTVBJMl9TQ1NJX0lPX1NVQ0NFU1NfUkVQTFlfREVTQ1JJUFRPUiBhbmQgbWFkZSB0aG9zZQogICogICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgcmVzZXJ2ZWQuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBSQUlEIEFjY2VsZXJhdG9yIGZ1bmN0aW9uYWxpdHkuCisgKiAgMDctMzAtMDkgIDAyLjAwLjEzICBCdW1wZWQgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklULgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNzcsNyArNzgsNyBAQAogI2RlZmluZSBNUEkyX1ZFUlNJT05fMDJfMDAgICAgICAgICAgICAgICAgICAoMHgwMjAwKQogCiAvKiB2ZXJzaW9uaW5nIGZvciB0aGlzIE1QSSBoZWFkZXIgc2V0ICovCi0jZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVCAgICAgICAgICAgICgweDBDKQorI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAoMHgwRCkKICNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9ERVYgICAgICAgICAgICAgKDB4MDApCiAjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVF9NQVNLICAgICAgICgweEZGMDApCiAjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVF9TSElGVCAgICAgICg4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oCmluZGV4IGFiNDdjNDYuLjE2MTFjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2NuZmcuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9jbmZnLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGFuZCBwYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBOb3ZlbWJlciAxMCwgMjAwNgogICoKLSAqICAgIG1waTJfY25mZy5oIFZlcnNpb246ICAwMi4wMC4xMQorICogICAgbXBpMl9jbmZnLmggVmVyc2lvbjogIDAyLjAwLjEyCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMTAwLDYgKzEwMCwxMyBAQAogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZXhwYW5kZXIgcmVkdWNlZCBmdW5jdGlvbmFsaXR5IGRhdGEgdG8gU0FTCiAgKiAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRlciBQYWdlIDAuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBTQVMgUEhZIFBhZ2UgMiBhbmQgU0FTIFBIWSBQYWdlIDMuCisgKiAgMDctMzAtMDkgIDAyLjAwLjEyICBBZGRlZCBJTyBVbml0IFBhZ2UgNy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyBkZXZpY2UgaWRzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU0FTIElPIFVuaXQgUGFnZSA1LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgcGFydGlhbCBhbmQgc2x1bWJlciBwb3dlciBtYW5hZ2VtZW50IGNhcGFibGUgZmxhZ3MKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIFNBUyBEZXZpY2UgUGFnZSAwIEZsYWdzIGZpZWxkLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUGh5SW5mbyBkZWZpbmVzIGZvciBwb3dlciBjb25kaXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBFdGhlcm5ldCBjb25maWd1cmF0aW9uIHBhZ2VzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMTgyLDYgKzE4OSw3IEBACiAjZGVmaW5lIE1QSTJfQ09ORklHX0VYVFBBR0VUWVBFX1JBSURfQ09ORklHICAgICAgICAgKDB4MTYpCiAjZGVmaW5lIE1QSTJfQ09ORklHX0VYVFBBR0VUWVBFX0RSSVZFUl9NQVBQSU5HICAgICAgKDB4MTcpCiAjZGVmaW5lIE1QSTJfQ09ORklHX0VYVFBBR0VUWVBFX1NBU19QT1JUICAgICAgICAgICAgKDB4MTgpCisjZGVmaW5lIE1QSTJfQ09ORklHX0VYVFBBR0VUWVBFX0VUSEVSTkVUICAgICAgICAgICAgKDB4MTkpCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjgsNiArMjc2LDE0IEBACiAjZGVmaW5lIE1QSTJfRFBNX1BHQURfU1RBUlRfRU5UUllfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMEZGRkYpCiAKIAorLyogRXRoZXJuZXQgUGFnZUFkZHJlc3MgZm9ybWF0ICovCisjZGVmaW5lIE1QSTJfRVRIRVJORVRfUEdBRF9GT1JNX01BU0sgICAgICAgICAgICAgICAgKDB4RjAwMDAwMDApCisjZGVmaW5lIE1QSTJfRVRIRVJORVRfUEdBRF9GT1JNX0lGX05VTSAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisKKyNkZWZpbmUgTVBJMl9FVEhFUk5FVF9QR0FEX0lGX05VTUJFUl9NQVNLICAgICAgICAgICAoMHgwMDAwMDBGRikKKworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgQ29uZmlndXJhdGlvbiBtZXNzYWdlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM0OSw2ICszNjUsMTUgQEAKICNkZWZpbmUgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIxMTZfMSAgICAgICAgICAgICAgICAoMHgwMDY0KQogI2RlZmluZSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjExNl8yICAgICAgICAgICAgICAgICgweDAwNjUpCiAKKyNkZWZpbmUgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfMSAgICAgICAgICAgICAgICAoMHgwMDgwKQorI2RlZmluZSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjIwOF8yICAgICAgICAgICAgICAgICgweDAwODEpCisjZGVmaW5lIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMjA4XzMgICAgICAgICAgICAgICAgKDB4MDA4MikKKyNkZWZpbmUgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNCAgICAgICAgICAgICAgICAoMHgwMDgzKQorI2RlZmluZSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjIwOF81ICAgICAgICAgICAgICAgICgweDAwODQpCisjZGVmaW5lIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMjA4XzYgICAgICAgICAgICAgICAgKDB4MDA4NSkKKyNkZWZpbmUgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNyAgICAgICAgICAgICAgICAoMHgwMDg2KQorI2RlZmluZSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjIwOF84ICAgICAgICAgICAgICAgICgweDAwODcpCisKIAogLyogTWFudWZhY3R1cmluZyBQYWdlIDAgKi8KIApAQCAtNzg3LDYgKzgxMiw1NiBAQAogI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U2X0ZMQUdTX0VOQUJMRV9SQUlEX0FDQ0VMRVJBVE9SICAoMHgwMDAxKQogCiAKKy8qIElPIFVuaXQgUGFnZSA3ICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfNyB7CisgICAgTVBJMl9DT05GSUdfUEFHRV9IRUFERVIgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBDSWVXaWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDA2ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUENJZVNwZWVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDcgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzb3JTdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DVGVtcGVyYXR1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJT0NUZW1wZXJhdHVyZVVuaXRzOyAgICAgICAgICAgICAgICAgICAgLyogMHgxMiAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIElPQ1NwZWVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDEzICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTQgKi8KK30gTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzcsIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzcsCisgIE1waTJJT1VuaXRQYWdlN190LCBNUEkyX1BPSU5URVIgcE1waTJJT1VuaXRQYWdlN190OworCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICgweDAwKQorCisvKiBkZWZpbmVzIGZvciBJTyBVbml0IFBhZ2UgNyBQQ0llV2lkdGggZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QQ0lFX1dJRFRIX1gxICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QQ0lFX1dJRFRIX1gyICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QQ0lFX1dJRFRIX1g0ICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QQ0lFX1dJRFRIX1g4ICAgICAgICAgICAgICAoMHgwOCkKKworLyogZGVmaW5lcyBmb3IgSU8gVW5pdCBQYWdlIDcgUENJZVNwZWVkIGZpZWxkICovCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfUENJRV9TUEVFRF8yXzVfR0JQUyAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfUENJRV9TUEVFRF81XzBfR0JQUyAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfUENJRV9TUEVFRF84XzBfR0JQUyAgICAgICAgKDB4MDIpCisKKy8qIGRlZmluZXMgZm9yIElPIFVuaXQgUGFnZSA3IFByb2Nlc3NvclN0YXRlIGZpZWxkICovCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfUFNUQVRFX01BU0tfU0VDT05EICAgICAgICAgKDB4MDAwMDAwMEYpCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfUFNUQVRFX1NISUZUX1NFQ09ORCAgICAgICAgKDApCisKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QU1RBVEVfTk9UX1BSRVNFTlQgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAoMHgwMikKKworLyogZGVmaW5lcyBmb3IgSU8gVW5pdCBQYWdlIDcgSU9DVGVtcGVyYXR1cmVVbml0cyBmaWVsZCAqLworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X0lPQ19URU1QX05PVF9QUkVTRU5UICAgICAgICgweDAwKQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X0lPQ19URU1QX0ZBSFJFTkhFSVQgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X0lPQ19URU1QX0NFTFNJVVMgICAgICAgICAgICgweDAyKQorCisvKiBkZWZpbmVzIGZvciBJTyBVbml0IFBhZ2UgNyBJT0NTcGVlZCBmaWVsZCAqLworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X0lPQ19TUEVFRF9GVUxMICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X0lPQ19TUEVFRF9IQUxGICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X0lPQ19TUEVFRF9RVUFSVEVSICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X0lPQ19TUEVFRF9FSUdIVEggICAgICAgICAgICgweDA4KQorCisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICBJT0MgQ29uZmlnIFBhZ2VzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTQ3MCw2ICsxNTQ1LDEyIEBACiAKIC8qIHZhbHVlcyBmb3IgUGh5SW5mbyBmaWVsZHMgKi8KICNkZWZpbmUgTVBJMl9TQVNfUEhZSU5GT19QSFlfVkFDQU5UICAgICAgICAgICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgTVBJMl9TQVNfUEhZSU5GT19QSFlfUE9XRVJfQ09ORElUSU9OX01BU0sgICAgICAgKDB4MTgwMDAwMDApCisjZGVmaW5lIE1QSTJfU0FTX1BIWUlORk9fUEhZX1BPV0VSX0FDVElWRSAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUEkyX1NBU19QSFlJTkZPX1BIWV9QT1dFUl9QQVJUSUFMICAgICAgICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgTVBJMl9TQVNfUEhZSU5GT19QSFlfUE9XRVJfU0xVTUJFUiAgICAgICAgICAgICAgKDB4MTAwMDAwMDApCisKICNkZWZpbmUgTVBJMl9TQVNfUEhZSU5GT19DSEFOR0VEX1JFUV9JTlNJREVfWlBTRFMgICAgICAgKDB4MDQwMDAwMDApCiAjZGVmaW5lIE1QSTJfU0FTX1BIWUlORk9fSU5TSURFX1pQU0RTX1BFUlNJU1RFTlQgICAgICAgICgweDAyMDAwMDAwKQogI2RlZmluZSBNUEkyX1NBU19QSFlJTkZPX1JFUV9JTlNJREVfWlBTRFMgICAgICAgICAgICAgICAoMHgwMTAwMDAwMCkKQEAgLTE2ODIsMTEgKzE3NjMsMTEgQEAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAxIFBvcnRGbGFncyAqLwogI2RlZmluZSBNUEkyX1NBU0lPVU5JVDFfUE9SVF9GTEFHU19BVVRPX1BPUlRfQ09ORklHICAgICAgICAgICAgICAgICAoMHgwMSkKIAotLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDIgUGh5RmxhZ3MgKi8KKy8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAxIFBoeUZsYWdzICovCiAjZGVmaW5lIE1QSTJfU0FTSU9VTklUMV9QSFlGTEFHU19aT05JTkdfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICgweDEwKQogI2RlZmluZSBNUEkyX1NBU0lPVU5JVDFfUEhZRkxBR1NfUEhZX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKIAotLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDAgTWF4TWluTGlua1JhdGUgKi8KKy8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAxIE1heE1pbkxpbmtSYXRlICovCiAjZGVmaW5lIE1QSTJfU0FTSU9VTklUMV9NQVhfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEYwKQogI2RlZmluZSBNUEkyX1NBU0lPVU5JVDFfTUFYX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkKICNkZWZpbmUgTVBJMl9TQVNJT1VOSVQxX01BWF9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTApCkBAIC0xNzQ1LDYgKzE4MjYsNzQgQEAKICNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ0X1BIWV9TUElOVVBfR1JPVVBfTUFTSyAgICAgICAgICAgICAgICgweDAzKQogCiAKKy8qIFNBUyBJTyBVbml0IFBhZ2UgNSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9TQVNfSU9fVU5JVDVfUEhZX1BNX1NFVFRJTkdTIHsKKyAgICBVOCAgICAgICAgICBDb250cm9sRmxhZ3M7ICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisgICAgVTE2ICAgICAgICAgSW5hY3Rpdml0eVRpbWVyRXhwb25lbnQ7ICAgIC8qIDB4MDIgKi8KKyAgICBVOCAgICAgICAgICBTQVRBUGFydGlhbFRpbWVvdXQ7ICAgICAgICAgLyogMHgwNCAqLworICAgIFU4ICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDA1ICovCisgICAgVTggICAgICAgICAgU0FUQVNsdW1iZXJUaW1lb3V0OyAgICAgICAgIC8qIDB4MDYgKi8KKyAgICBVOCAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLworICAgIFU4ICAgICAgICAgIFNBU1BhcnRpYWxUaW1lb3V0OyAgICAgICAgICAvKiAweDA4ICovCisgICAgVTggICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKyAgICBVOCAgICAgICAgICBTQVNTbHVtYmVyVGltZW91dDsgICAgICAgICAgLyogMHgwQSAqLworICAgIFU4ICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgICAgICAgICAvKiAweDBCICovCit9IE1QSTJfU0FTX0lPX1VOSVQ1X1BIWV9QTV9TRVRUSU5HUywKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1NBU19JT19VTklUNV9QSFlfUE1fU0VUVElOR1MsCisgIE1waTJTYXNJT1VuaXQ1UGh5UG1TZXR0aW5nc190LCBNUEkyX1BPSU5URVIgcE1waTJTYXNJT1VuaXQ1UGh5UG1TZXR0aW5nc190OworCisvKiBkZWZpbmVzIGZvciBDb250cm9sRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0NPTlRST0xfU0FTX1NMVU1CRVJfRU5BQkxFICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUNV9DT05UUk9MX1NBU19QQVJUSUFMX0VOQUJMRSAgICAgICgweDA0KQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfQ09OVFJPTF9TQVRBX1NMVU1CRVJfRU5BQkxFICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0NPTlRST0xfU0FUQV9QQVJUSUFMX0VOQUJMRSAgICAgKDB4MDEpCisKKy8qIGRlZmluZXMgZm9yIEluYWN0aXZpdHlUaW1lckV4cG9uZW50IGZpZWxkICovCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUNV9JVEVfTUFTS19TQVNfU0xVTUJFUiAgICAgICAgICAgICgweDcwMDApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUNV9JVEVfU0hJRlRfU0FTX1NMVU1CRVIgICAgICAgICAgICgxMikKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0lURV9NQVNLX1NBU19QQVJUSUFMICAgICAgICAgICAgKDB4MDcwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0lURV9TSElGVF9TQVNfUEFSVElBTCAgICAgICAgICAgKDgpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUNV9JVEVfTUFTS19TQVRBX1NMVU1CRVIgICAgICAgICAgICgweDAwNzApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUNV9JVEVfU0hJRlRfU0FUQV9TTFVNQkVSICAgICAgICAgICg0KQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfSVRFX01BU0tfU0FUQV9QQVJUSUFMICAgICAgICAgICAoMHgwMDA3KQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfSVRFX1NISUZUX1NBVEFfUEFSVElBTCAgICAgICAgICAoMCkKKworI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfSVRFX1RFTl9TRUNPTkRTICAgICAgICAgICAgICAgICAoNykKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0lURV9PTkVfU0VDT05EICAgICAgICAgICAgICAgICAgKDYpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUNV9JVEVfSFVORFJFRF9NSUxMSVNFQ09ORFMgICAgICAgICg1KQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfSVRFX1RFTl9NSUxMSVNFQ09ORFMgICAgICAgICAgICAoNCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0lURV9PTkVfTUlMTElTRUNPTkQgICAgICAgICAgICAgKDMpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUNV9JVEVfSFVORFJFRF9NSUNST1NFQ09ORFMgICAgICAgICgyKQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfSVRFX1RFTl9NSUNST1NFQ09ORFMgICAgICAgICAgICAoMSkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0lURV9PTkVfTUlDUk9TRUNPTkQgICAgICAgICAgICAgKDApCisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayBIZWFkZXIuRXh0UGFnZUxlbmd0aCBvciBOdW1QaHlzIGF0IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgTVBJMl9TQVNfSU9VTklUNV9QSFlfTUFYCisjZGVmaW5lIE1QSTJfU0FTX0lPVU5JVDVfUEhZX01BWCAgICAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzUgeworICAgIE1QSTJfQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSICAgIEhlYWRlcjsJCS8qIDB4MDAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1QaHlzOwkvKiAweDA4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOwkvKiAweDA5ICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOwkvKiAweDBBICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOwkvKiAweDBDICovCisgICAgTVBJMl9TQVNfSU9fVU5JVDVfUEhZX1BNX1NFVFRJTkdTICAgU0FTUGh5UG93ZXJNYW5hZ2VtZW50U2V0dGluZ3MKKwkJCQkJW01QSTJfU0FTX0lPVU5JVDVfUEhZX01BWF07ICAvKiAweDEwICovCit9IE1QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzUsCisgIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9TQVNJT1VOSVRfNSwKKyAgTXBpMlNhc0lPVW5pdFBhZ2U1X3QsIE1QSTJfUE9JTlRFUiBwTXBpMlNhc0lPVW5pdFBhZ2U1X3Q7CisKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVRQQUdFNV9QQUdFVkVSU0lPTiAgICAgKDB4MDApCisKKworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgU0FTIEV4cGFuZGVyIENvbmZpZyBQYWdlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5MjcsNiArMjA3Niw4IEBACiAvKiBzZWUgbXBpMl9zYXMuaCBmb3IgdmFsdWVzIGZvciBTQVMgRGV2aWNlIFBhZ2UgMCBEZXZpY2VJbmZvIHZhbHVlcyAqLwogCiAvKiB2YWx1ZXMgZm9yIFNBUyBEZXZpY2UgUGFnZSAwIEZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1QSTJfU0FTX0RFVklDRTBfRkxBR1NfU0xVTUJFUl9QTV9DQVBBQkxFICAgICAgICAgICAoMHgxMDAwKQorI2RlZmluZSBNUEkyX1NBU19ERVZJQ0UwX0ZMQUdTX1BBUlRJQUxfUE1fQ0FQQUJMRSAgICAgICAgICAgKDB4MDgwMCkKICNkZWZpbmUgTVBJMl9TQVNfREVWSUNFMF9GTEFHU19TQVRBX0FTWU5DSFJPTk9VU19OT1RJRlkgICAgICgweDA0MDApCiAjZGVmaW5lIE1QSTJfU0FTX0RFVklDRTBfRkxBR1NfU0FUQV9TV19QUkVTRVJWRSAgICAgICAgICAgICAoMHgwMjAwKQogI2RlZmluZSBNUEkyX1NBU19ERVZJQ0UwX0ZMQUdTX1VOU1VQUE9SVEVEX0RFVklDRSAgICAgICAgICAgKDB4MDEwMCkKQEAgLTIzNDMsNSArMjQ5NCwxMjIgQEAKICNkZWZpbmUgTVBJMl9EUlZNQVAwX01BUElORk9fTUlTU0lOR19NQVNLICAgICAgICAgICAoMHgwMDBGKQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgRXRoZXJuZXQgQ29uZmlnIFBhZ2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFdGhlcm5ldCBQYWdlIDAgKi8KKworLyogSVAgYWRkcmVzcyAodW5pb24gb2YgSVB2NCBhbmQgSVB2NikgKi8KK3R5cGVkZWYgdW5pb24gX01QSTJfRVRIRVJORVRfSVBfQUREUiB7CisgICAgVTMyICAgICBJUHY0QWRkcjsKKyAgICBVMzIgICAgIElQdjZBZGRyWzRdOworfSBNUEkyX0VUSEVSTkVUX0lQX0FERFIsIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9FVEhFUk5FVF9JUF9BRERSLAorICBNcGkyRXRoZXJuZXRJcEFkZHJfdCwgTVBJMl9QT0lOVEVSIHBNcGkyRXRoZXJuZXRJcEFkZHJfdDsKKworI2RlZmluZSBNUEkyX0VUSEVSTkVUX0hPU1RfTkFNRV9MRU5HVEggICAgICAgICAgKDMyKQorCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9DT05GSUdfUEFHRV9FVEhFUk5FVF8wIHsKKyAgICBNUEkyX0NPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAvKiAweDAwICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW50ZXJmYWNlczsgICAgICAgICAgLyogMHgwOCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMDsgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAweDBBICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzOyAgICAgICAgICAgICAgICAgLyogMHgwQyAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhU3RhdGU7ICAgICAgICAgICAgIC8qIDB4MTAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAweDExICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgLyogMHgxMiAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY0FkZHJlc3NbNl07ICAgICAgICAgIC8qIDB4MTQgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAvKiAweDFBICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgLyogMHgxQiAqLworICAgIE1QSTJfRVRIRVJORVRfSVBfQUREUiAgICAgICAgICAgICAgIElwQWRkcmVzczsgICAgICAgICAgICAgIC8qIDB4MUMgKi8KKyAgICBNUEkyX0VUSEVSTkVUX0lQX0FERFIgICAgICAgICAgICAgICBTdWJuZXRNYXNrOyAgICAgICAgICAgICAvKiAweDJDICovCisgICAgTVBJMl9FVEhFUk5FVF9JUF9BRERSICAgICAgICAgICAgICAgR2F0ZXdheUlwQWRkcmVzczsgICAgICAgLyogMHgzQyAqLworICAgIE1QSTJfRVRIRVJORVRfSVBfQUREUiAgICAgICAgICAgICAgIEROUzFJcEFkZHJlc3M7ICAgICAgICAgIC8qIDB4NEMgKi8KKyAgICBNUEkyX0VUSEVSTkVUX0lQX0FERFIgICAgICAgICAgICAgICBETlMySXBBZGRyZXNzOyAgICAgICAgICAvKiAweDVDICovCisgICAgTVBJMl9FVEhFUk5FVF9JUF9BRERSICAgICAgICAgICAgICAgRGhjcElwQWRkcmVzczsgICAgICAgICAgLyogMHg2QyAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3ROYW1lCisJCQkJW01QSTJfRVRIRVJORVRfSE9TVF9OQU1FX0xFTkdUSF07LyogMHg3QyAqLworfSBNUEkyX0NPTkZJR19QQUdFX0VUSEVSTkVUXzAsIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9FVEhFUk5FVF8wLAorICBNcGkyRXRoZXJuZXRQYWdlMF90LCBNUEkyX1BPSU5URVIgcE1waTJFdGhlcm5ldFBhZ2UwX3Q7CisKKyNkZWZpbmUgTVBJMl9FVEhFUk5FVFBBR0UwX1BBR0VWRVJTSU9OICAgKDB4MDApCisKKy8qIHZhbHVlcyBmb3IgRXRoZXJuZXQgUGFnZSAwIFN0YXR1cyBmaWVsZCAqLworI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfSVBWNl9DQVBBQkxFICAgICAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfSVBWNF9DQVBBQkxFICAgICAgICAgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfQ09OU09MRV9DT05ORUNURUQgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfREVGQVVMVF9JRiAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfRldfRFdOTERfRU5BQkxFRCAgICAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfVEVMTkVUX0VOQUJMRUQgICAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfU1NIMl9FTkFCTEVEICAgICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfREhDUF9DTElFTlRfRU5BQkxFRCAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfSVBWNl9FTkFCTEVEICAgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfSVBWNF9FTkFCTEVEICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfSVBWNl9BRERSRVNTRVMgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUEkyX0VUSFBHMF9TVEFUVVNfRVRIX0lGX0VOQUJMRUQgICAgICAgICAgICgweDAwMDAwMDAxKQorCisvKiB2YWx1ZXMgZm9yIEV0aGVybmV0IFBhZ2UgMCBNZWRpYVN0YXRlIGZpZWxkICovCisjZGVmaW5lIE1QSTJfRVRIUEcwX01TX0RVUExFWF9NQVNLICAgICAgICAgICAgICAgICAgKDB4ODApCisjZGVmaW5lIE1QSTJfRVRIUEcwX01TX0hBTEZfRFVQTEVYICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfRVRIUEcwX01TX0ZVTExfRFVQTEVYICAgICAgICAgICAgICAgICAgKDB4ODApCisKKyNkZWZpbmUgTVBJMl9FVEhQRzBfTVNfQ09OTkVDVF9TUEVFRF9NQVNLICAgICAgICAgICAoMHgwNykKKyNkZWZpbmUgTVBJMl9FVEhQRzBfTVNfTk9UX0NPTk5FQ1RFRCAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJMl9FVEhQRzBfTVNfMTBNQklUICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9FVEhQRzBfTVNfMTAwTUJJVCAgICAgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9FVEhQRzBfTVNfMUdCSVQgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKKworCisvKiBFdGhlcm5ldCBQYWdlIDEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfQ09ORklHX1BBR0VfRVRIRVJORVRfMSB7CisgICAgTVBJMl9DT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMDsgICAgICAgICAgICAgIC8qIDB4MDggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsgICAgICAgICAgICAgLyogMHgxMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDB4MTEgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAweDEyICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjQWRkcmVzc1s2XTsgICAgICAgICAgLyogMHgxNCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIDB4MUEgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAvKiAweDFCICovCisgICAgTVBJMl9FVEhFUk5FVF9JUF9BRERSICAgICAgICAgICAgICAgU3RhdGljSXBBZGRyZXNzOyAgICAgICAgLyogMHgxQyAqLworICAgIE1QSTJfRVRIRVJORVRfSVBfQUREUiAgICAgICAgICAgICAgIFN0YXRpY1N1Ym5ldE1hc2s7ICAgICAgIC8qIDB4MkMgKi8KKyAgICBNUEkyX0VUSEVSTkVUX0lQX0FERFIgICAgICAgICAgICAgICBTdGF0aWNHYXRld2F5SXBBZGRyZXNzOyAvKiAweDNDICovCisgICAgTVBJMl9FVEhFUk5FVF9JUF9BRERSICAgICAgICAgICAgICAgU3RhdGljRE5TMUlwQWRkcmVzczsgICAgLyogMHg0QyAqLworICAgIE1QSTJfRVRIRVJORVRfSVBfQUREUiAgICAgICAgICAgICAgIFN0YXRpY0ROUzJJcEFkZHJlc3M7ICAgIC8qIDB4NUMgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgICAgICAvKiAweDZDICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ2OyAgICAgICAgICAgICAgLyogMHg3MCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNzsgICAgICAgICAgICAgIC8qIDB4NzQgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDg7ICAgICAgICAgICAgICAvKiAweDc4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdE5hbWUKKwkJCQlbTVBJMl9FVEhFUk5FVF9IT1NUX05BTUVfTEVOR1RIXTsvKiAweDdDICovCit9IE1QSTJfQ09ORklHX1BBR0VfRVRIRVJORVRfMSwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX0VUSEVSTkVUXzEsCisgIE1waTJFdGhlcm5ldFBhZ2UxX3QsIE1QSTJfUE9JTlRFUiBwTXBpMkV0aGVybmV0UGFnZTFfdDsKKworI2RlZmluZSBNUEkyX0VUSEVSTkVUUEFHRTFfUEFHRVZFUlNJT04gICAoMHgwMCkKKworLyogdmFsdWVzIGZvciBFdGhlcm5ldCBQYWdlIDEgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19TRVRfREVGQVVMVF9JRiAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19FTkFCTEVfRldfRE9XTkxPQUQgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19FTkFCTEVfVEVMTkVUICAgICAgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19FTkFCTEVfU1NIMiAgICAgICAgICAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19FTkFCTEVfREhDUF9DTElFTlQgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19FTkFCTEVfSVBWNiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19FTkFCTEVfSVBWNCAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19VU0VfSVBWNl9BRERSRVNTRVMgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJMl9FVEhQRzFfRkxBR19FTkFCTEVfRVRIX0lGICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKworLyogdmFsdWVzIGZvciBFdGhlcm5ldCBQYWdlIDEgTWVkaWFTdGF0ZSBmaWVsZCAqLworI2RlZmluZSBNUEkyX0VUSFBHMV9NU19EVVBMRVhfTUFTSyAgICAgICAgICAgICAgICAgICgweDgwKQorI2RlZmluZSBNUEkyX0VUSFBHMV9NU19IQUxGX0RVUExFWCAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUEkyX0VUSFBHMV9NU19GVUxMX0RVUExFWCAgICAgICAgICAgICAgICAgICgweDgwKQorCisjZGVmaW5lIE1QSTJfRVRIUEcxX01TX0RBVEFfUkFURV9NQVNLICAgICAgICAgICAgICAgKDB4MDcpCisjZGVmaW5lIE1QSTJfRVRIUEcxX01TX0RBVEFfUkFURV9BVVRPICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfRVRIUEcxX01TX0RBVEFfUkFURV8xME1CSVQgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfRVRIUEcxX01TX0RBVEFfUkFURV8xMDBNQklUICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSTJfRVRIUEcxX01TX0RBVEFfUkFURV8xR0JJVCAgICAgICAgICAgICAgKDB4MDMpCisKKwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKaW5kZXggYzI5NDEyOC4uZWE1MWNlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBJT0MsIFBvcnQsIEV2ZW50LCBGVyBEb3dubG9hZCwgYW5kIEZXIFVwbG9hZCBtZXNzYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBPY3RvYmVyIDExLCAyMDA2CiAgKgotICogIG1waTJfaW9jLmggVmVyc2lvbjogIDAyLjAwLjExCisgKiAgbXBpMl9pb2MuaCBWZXJzaW9uOiAgMDIuMDAuMTIKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC04NCw2ICs4NCw5IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCB0d28gbmV3IHJlYXNvbiBjb2RlcyBmb3IgU0FTIERldmljZSBTdGF0dXMgQ2hhbmdlCiAgKiAgICAgICAgICAgICAgICAgICAgICBFdmVudC4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyBldmVudDogU0FTIFBIWSBDb3VudGVyLgorICogIDA3LTMwLTA5ICAwMi4wMC4xMiAgQWRkZWQgR1BJTyBJbnRlcnJ1cHQgZXZlbnQgZGVmaW5lIGFuZCBzdHJ1Y3R1cmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfRVhURU5ERURfQlVGRkVSIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyBwcm9kdWN0IGlkIGZhbWlseSBmb3IgMjIwOC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTI3NCw2ICsyNzcsNyBAQAogI2RlZmluZSBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfTVVMVElDQVNUICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKICNkZWZpbmUgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX0JJRElSRUNUSU9OQUxfVEFSR0VUICAgKDB4MDAwMDAwODApCiAjZGVmaW5lIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9FRURQICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfRVhURU5ERURfQlVGRkVSICAgICAgICAoMHgwMDAwMDAyMCkKICNkZWZpbmUgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX1NOQVBTSE9UX0JVRkZFUiAgICAgICAgKDB4MDAwMDAwMTApCiAjZGVmaW5lIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9ESUFHX1RSQUNFX0JVRkZFUiAgICAgICgweDAwMDAwMDA4KQogI2RlZmluZSBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfVEFTS19TRVRfRlVMTF9IQU5ETElORyAoMHgwMDAwMDAwNCkKQEAgLTQ0OCw2ICs0NTIsNyBAQAogI2RlZmluZSBNUEkyX0VWRU5UX0lSX0NPTkZJR1VSQVRJT05fQ0hBTkdFX0xJU1QgICAgICgweDAwMjApCiAjZGVmaW5lIE1QSTJfRVZFTlRfTE9HX0VOVFJZX0FEREVEICAgICAgICAgICAgICAgICAgKDB4MDAyMSkKICNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfUEhZX0NPVU5URVIgICAgICAgICAgICAgICAgICAoMHgwMDIyKQorI2RlZmluZSBNUEkyX0VWRU5UX0dQSU9fSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICgweDAwMjMpCiAKIAogLyogTG9nIEVudHJ5IEFkZGVkIEV2ZW50IGRhdGEgKi8KQEAgLTQ2OSw2ICs0NzQsMTYgQEAKICAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0VWRU5UX0RBVEFfTE9HX0VOVFJZX0FEREVELAogICBNcGkyRXZlbnREYXRhTG9nRW50cnlBZGRlZF90LCBNUEkyX1BPSU5URVIgcE1waTJFdmVudERhdGFMb2dFbnRyeUFkZGVkX3Q7CiAKKy8qIEdQSU8gSW50ZXJydXB0IEV2ZW50IGRhdGEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfRVZFTlRfREFUQV9HUElPX0lOVEVSUlVQVCB7CisgICAgVTggICAgICAgICAgR1BJT051bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVMTYgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAyICovCit9IE1QSTJfRVZFTlRfREFUQV9HUElPX0lOVEVSUlVQVCwKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0VWRU5UX0RBVEFfR1BJT19JTlRFUlJVUFQsCisgIE1waTJFdmVudERhdGFHcGlvSW50ZXJydXB0X3QsIE1QSTJfUE9JTlRFUiBwTXBpMkV2ZW50RGF0YUdwaW9JbnRlcnJ1cHRfdDsKKwogLyogSGFyZCBSZXNldCBSZWNlaXZlZCBFdmVudCBkYXRhICovCiAKIHR5cGVkZWYgc3RydWN0IF9NUEkyX0VWRU5UX0RBVEFfSEFSRF9SRVNFVF9SRUNFSVZFRApAQCAtMTExNyw2ICsxMTMyLDcgQEAKICNkZWZpbmUgTVBJMl9GV19IRUFERVJfUElEX0ZBTUlMWV9NQVNLICAgICAgICAgICgweDAwRkYpCiAvKiBTQVMgKi8KICNkZWZpbmUgTVBJMl9GV19IRUFERVJfUElEX0ZBTUlMWV8yMTA4X1NBUyAgICAgICgweDAwMTApCisjZGVmaW5lIE1QSTJfRldfSEVBREVSX1BJRF9GQU1JTFlfMjIwOF9TQVMgICAgICAoMHgwMDExKQogCiAvKiB1c2UgTVBJMl9JT0NGQUNUU19QUk9UT0NPTF8gZGVmaW5lcyBmb3IgUHJvdG9jb2xGbGFncyBmaWVsZCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9yYWlkLmggYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9yYWlkLmgKaW5kZXggNzEzNDgxNi4uNTE2MGMzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX3JhaWQuaApAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIEludGVncmF0ZWQgUkFJRCBtZXNzYWdlcyBhbmQgc3RydWN0dXJlcwogICogIENyZWF0aW9uIERhdGU6ICBBcHJpbCAyNiwgMjAwNwogICoKLSAqICAgIG1waTJfcmFpZC5oIFZlcnNpb246ICAwMi4wMC4wMworICogICAgbXBpMl9yYWlkLmggVmVyc2lvbjogIDAyLjAwLjA0CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMjAsNiArMjAsOCBAQAogICogIDA1LTIxLTA4ICAwMi4wMC4wMyAgQWRkZWQgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9OVU1fUEhZU0RJU0tTIHNvIHRoYXQKICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBQaHlzRGlzayBhcnJheSBpbiBNUEkyX1JBSURfVk9MVU1FX0NSRUFUSU9OX1NUUlVDVAogICogICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHNpemVkIGJ5IHRoZSBidWlsZCBlbnZpcm9ubWVudC4KKyAqICAwNy0zMC0wOSAgMDIuMDAuMDQgIEFkZGVkIHByb3BlciBkZWZpbmUgZm9yIHRoZSBVc2UgRGVmYXVsdCBTZXR0aW5ncyBiaXQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUNyZWF0aW9uRmxhZ3MgYW5kIG1hcmtlZCB0aGUgb2xkIG9uZSBhcyBvYnNvbGV0ZS4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTIxNywxMCArMjE5LDE0IEBACiAvKiB1c2UgTVBJMl9SQUlEX1ZPTF9UWVBFXyBkZWZpbmVzIGZyb20gbXBpMl9jbmZnLmggZm9yIFZvbHVtZVR5cGUgKi8KIAogLyogZGVmaW5lcyBmb3IgdGhlIFZvbHVtZUNyZWF0aW9uRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9ERUZBVUxUX1NFVFRJTkdTICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9CQUNLR1JPVU5EX0lOSVQgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9MT1dfTEVWRUxfSU5JVCAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9NSUdSQVRFX0RBVEEgICAgICAgICAoMHgwMDAwMDAwMSkKKy8qIFRoZSBmb2xsb3dpbmcgaXMgYW4gb2Jzb2xldGUgZGVmaW5lLgorICogSXQgbXVzdCBiZSBzaGlmdGVkIGxlZnQgMjQgYml0cyBpbiBvcmRlciB0byBzZXQgdGhlIHByb3BlciBiaXQuCisgKi8KICNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9VU0VfREVGQVVMVF9TRVRUSU5HUyAoMHg4MCkKLSNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9CQUNLR1JPVU5EX0lOSVQgICAgICAoMHgwNCkKLSNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9MT1dfTEVWRUxfSU5JVCAgICAgICAoMHgwMikKLSNkZWZpbmUgTVBJMl9SQUlEX1ZPTF9DUkVBVElPTl9NSUdSQVRFX0RBVEEgICAgICAgICAoMHgwMSkKIAogCiAvKiBSQUlEIE9ubGluZSBDYXBhY2l0eSBFeHBhbnNpb24gU3RydWN0dXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl90b29sLmggYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl90b29sLmgKaW5kZXggMDA3ZTk1MC4uNzNmY2RiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfdG9vbC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX3Rvb2wuaApAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIGRpYWdub3N0aWMgdG9vbCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwogICogIENyZWF0aW9uIERhdGU6ICBNYXJjaCAyNiwgMjAwNwogICoKLSAqICAgIG1waTJfdG9vbC5oIFZlcnNpb246ICAwMi4wMC4wMworICogICAgbXBpMl90b29sLmggVmVyc2lvbjogIDAyLjAwLjA0CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMTgsNiArMTgsMTAgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMuCiAgKiAgMDItMjktMDggIDAyLjAwLjAyICBNb2RpZmllZCB2YXJpb3VzIG5hbWVzIHRvIG1ha2UgdGhlbSAzMi1jaGFyYWN0ZXIgdW5pcXVlLgogICogIDA1LTA2LTA5ICAwMi4wMC4wMyAgQWRkZWQgSVNUV0kgUmVhZCBXcml0ZSBUb29sIGFuZCBEaWFnbm9zdGljIENMSSBUb29sLgorICogIDA3LTMwLTA5ICAwMi4wMC4wNCAgQWRkZWQgRXh0ZW5kZWRUeXBlIGZpZWxkIHRvIERpYWdub3N0aWNCdWZmZXJQb3N0IHJlcXVlc3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXBseSBtZXNzYWdlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfRElBR19CVUZfVFlQRV9FWFRFTkRFRC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGVkIE1QSTJfRElBR19CVUZfVFlQRV9DT1VOVC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTI4Miw3ICsyODYsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9ESUFHX0JVRkZFUl9QT1NUX1JFUVVFU1QKIHsKLSAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVHlwZTsgICAgICAgICAgICAgICAvKiAweDAwICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVmZmVyVHlwZTsgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgLyogMHgwMiAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAweDAzICovCkBAIC0zMDEsMTEgKzMwNSwxNSBAQAogfSBNUEkyX0RJQUdfQlVGRkVSX1BPU1RfUkVRVUVTVCwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0RJQUdfQlVGRkVSX1BPU1RfUkVRVUVTVCwKICAgTXBpMkRpYWdCdWZmZXJQb3N0UmVxdWVzdF90LCBNUEkyX1BPSU5URVIgcE1waTJEaWFnQnVmZmVyUG9zdFJlcXVlc3RfdDsKIAorLyogdmFsdWVzIGZvciB0aGUgRXh0ZW5kZWRUeXBlIGZpZWxkICovCisjZGVmaW5lIE1QSTJfRElBR19FWFRFTkRFRF9UWVBFX1VUSUxJWkFUSU9OICAgICAgICAgKDB4MDIpCisKIC8qIHZhbHVlcyBmb3IgdGhlIEJ1ZmZlclR5cGUgZmllbGQgKi8KICNkZWZpbmUgTVBJMl9ESUFHX0JVRl9UWVBFX1RSQUNFICAgICAgICAgICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJMl9ESUFHX0JVRl9UWVBFX1NOQVBTSE9UICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9ESUFHX0JVRl9UWVBFX0VYVEVOREVEICAgICAgICAgICAgICAgICAoMHgwMikKIC8qIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYnVmZmVyIHR5cGVzICovCi0jZGVmaW5lIE1QSTJfRElBR19CVUZfVFlQRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSTJfRElBR19CVUZfVFlQRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgKDB4MDMpCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMxNCw3ICszMjIsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9ESUFHX0JVRkZFUl9QT1NUX1JFUExZCiB7Ci0gICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFR5cGU7ICAgICAgICAgICAgICAgLyogMHgwMCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclR5cGU7ICAgICAgICAgICAgICAgICAvKiAweDAxICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYwppbmRleCA2NzAyNDFlLi42NDIyZTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgogCiAjaW5jbHVkZSAibXB0MnNhc19iYXNlLmgiCiAKQEAgLTc3LDYgKzc4LDQ0IEBACiBtb2R1bGVfcGFyYW0obXNpeF9kaXNhYmxlLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhtc2l4X2Rpc2FibGUsICIgZGlzYWJsZSBtc2l4IHJvdXRlZCBpbnRlcnJ1cHRzIChkZWZhdWx0PTApIik7CiAKKy8qIGRpYWdfYnVmZmVyX2VuYWJsZSBpcyBiaXR3aXNlCisgKiBiaXQgMCBzZXQgPSBUUkFDRQorICogYml0IDEgc2V0ID0gU05BUFNIT1QKKyAqIGJpdCAyIHNldCA9IEVYVEVOREVECisgKgorICogRWl0aGVyIGJpdCBjYW4gYmUgc2V0LCBvciBib3RoCisgKi8KK3N0YXRpYyBpbnQgZGlhZ19idWZmZXJfZW5hYmxlOworbW9kdWxlX3BhcmFtKGRpYWdfYnVmZmVyX2VuYWJsZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlhZ19idWZmZXJfZW5hYmxlLCAiIHBvc3QgZGlhZyBidWZmZXJzICIKKyAgICAiKFRSQUNFPTEvU05BUFNIT1Q9Mi9FWFRFTkRFRD00L2RlZmF1bHQ9MCkiKTsKKworaW50IG1wdDJzYXNfZndmYXVsdF9kZWJ1ZzsKK01PRFVMRV9QQVJNX0RFU0MobXB0MnNhc19md2ZhdWx0X2RlYnVnLCAiIGVuYWJsZSBkZXRlY3Rpb24gb2YgZmlybXdhcmUgZmF1bHQgIgorICAgICJhbmQgaGFsdCBmaXJtd2FyZSAtIChkZWZhdWx0PTApIik7CisKKy8qKgorICogX3Njc2loX3NldF9md2ZhdWx0X2RlYnVnIC0gZ2xvYmFsIHNldHRpbmcgb2YgaW9jLT5md2ZhdWx0X2RlYnVnLgorICoKKyAqLworc3RhdGljIGludAorX3Njc2loX3NldF9md2ZhdWx0X2RlYnVnKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaW50IHJldCA9IHBhcmFtX3NldF9pbnQodmFsLCBrcCk7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXByaW50ayhLRVJOX0lORk8gInNldHRpbmcgbG9nZ2luZ19sZXZlbCgweCUwOHgpXG4iLAorCQkJCW1wdDJzYXNfZndmYXVsdF9kZWJ1Zyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpb2MsICZtcHQyc2FzX2lvY19saXN0LCBsaXN0KQorCQlpb2MtPmZ3ZmF1bHRfZGVidWcgPSBtcHQyc2FzX2Z3ZmF1bHRfZGVidWc7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfcGFyYW1fY2FsbChtcHQyc2FzX2Z3ZmF1bHRfZGVidWcsIF9zY3NpaF9zZXRfZndmYXVsdF9kZWJ1ZywKKyAgICBwYXJhbV9nZXRfaW50LCAmbXB0MnNhc19md2ZhdWx0X2RlYnVnLCAwNjQ0KTsKKwogLyoqCiAgKiBfYmFzZV9mYXVsdF9yZXNldF93b3JrIC0gd29ya3EgaGFuZGxpbmcgaW9jIGZhdWx0IGNvbmRpdGlvbnMKICAqIEB3b3JrOiBpbnB1dCBhcmd1bWVudCwgdXNlZCB0byBkZXJpdmUgaW9jCkBAIC0xMjEsNyArMTYwLDcgQEAKIAogLyoqCiAgKiBtcHQyc2FzX2Jhc2Vfc3RhcnRfd2F0Y2hkb2cgLSBzdGFydCB0aGUgZmF1bHRfcmVzZXRfd29ya19xCi0gKiBAaW9jOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQ29udGV4dDogc2xlZXAuCiAgKgogICogUmV0dXJuIG5vdGhpbmcuCkBAIC0xNTUsNyArMTk0LDcgQEAKIAogLyoqCiAgKiBtcHQyc2FzX2Jhc2Vfc3RvcF93YXRjaGRvZyAtIHN0b3AgdGhlIGZhdWx0X3Jlc2V0X3dvcmtfcQotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIENvbnRleHQ6IHNsZWVwLgogICoKICAqIFJldHVybiBub3RoaW5nLgpAQCAtMTc3LDEwICsyMTYsNTUgQEAKIAl9CiB9CiAKKy8qKgorICogbXB0MnNhc19iYXNlX2ZhdWx0X2luZm8gLSB2ZXJib3NlIHRyYW5zbGF0aW9uIG9mIGZpcm13YXJlIEZBVUxUIGNvZGUKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQGZhdWx0X2NvZGU6IGZhdWx0IGNvZGUKKyAqCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLwordm9pZAorbXB0MnNhc19iYXNlX2ZhdWx0X2luZm8oc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jICwgdTE2IGZhdWx0X2NvZGUpCit7CisJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmF1bHRfc3RhdGUoMHglMDR4KSFcbiIsCisJICAgIGlvYy0+bmFtZSwgZmF1bHRfY29kZSk7Cit9CisKKy8qKgorICogbXB0MnNhc19oYWx0X2Zpcm13YXJlIC0gaGFsdCdzIG1wdCBjb250cm9sbGVyIGZpcm13YXJlCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqCisgKiBGb3IgZGVidWdnaW5nIHRpbWVvdXQgcmVsYXRlZCBpc3N1ZXMuICBXcml0aW5nIDB4Q09GRkVFMDAKKyAqIHRvIHRoZSBkb29yYmVsbCByZWdpc3RlciB3aWxsIGhhbHQgY29udHJvbGxlciBmaXJtd2FyZS4gV2l0aAorICogdGhlIHB1cnBvc2UgdG8gc3RvcCBib3RoIGRyaXZlciBhbmQgZmlybXdhcmUsIHRoZSBlbmR1c2VyIGNhbgorICogb2J0YWluIGEgcmluZyBidWZmZXIgZnJvbSBjb250cm9sbGVyIFVBUlQuCisgKi8KK3ZvaWQKK21wdDJzYXNfaGFsdF9maXJtd2FyZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJdTMyIGRvb3JiZWxsOworCisJaWYgKCFpb2MtPmZ3ZmF1bHRfZGVidWcpCisJCXJldHVybjsKKworCWR1bXBfc3RhY2soKTsKKworCWRvb3JiZWxsID0gcmVhZGwoJmlvYy0+Y2hpcC0+RG9vcmJlbGwpOworCWlmICgoZG9vcmJlbGwgJiBNUEkyX0lPQ19TVEFURV9NQVNLKSA9PSBNUEkyX0lPQ19TVEFURV9GQVVMVCkKKwkJbXB0MnNhc19iYXNlX2ZhdWx0X2luZm8oaW9jICwgZG9vcmJlbGwpOworCWVsc2UgeworCQl3cml0ZWwoMHhDMEZGRUUwMCwgJmlvYy0+Y2hpcC0+RG9vcmJlbGwpOworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJGaXJtd2FyZSBpcyBoYWx0ZWQgZHVlIHRvIGNvbW1hbmQgIgorCQkgICAgInRpbWVvdXRcbiIsIGlvYy0+bmFtZSk7CisJfQorCisJcGFuaWMoInBhbmljIGluICVzXG4iLCBfX2Z1bmNfXyk7Cit9CisKICNpZmRlZiBDT05GSUdfU0NTSV9NUFQyU0FTX0xPR0dJTkcKIC8qKgogICogX2Jhc2Vfc2FzX2lvY19pbmZvIC0gdmVyYm9zZSB0cmFuc2xhdGlvbiBvZiB0aGUgaW9jIHN0YXR1cwotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBtcGlfcmVwbHk6IHJlcGx5IG1mIHBheWxvYWQgcmV0dXJuZWQgZnJvbSBmaXJtd2FyZQogICogQHJlcXVlc3RfaGRyOiByZXF1ZXN0IG1mCiAgKgpAQCAtMzk0LDcgKzQ3OCw3IEBACiAKIC8qKgogICogX2Jhc2VfZGlzcGxheV9ldmVudF9kYXRhIC0gdmVyYm9zZSB0cmFuc2xhdGlvbiBvZiBmaXJtd2FyZSBhc3luIGV2ZW50cwotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBtcGlfcmVwbHk6IHJlcGx5IG1mIHBheWxvYWQgcmV0dXJuZWQgZnJvbSBmaXJtd2FyZQogICoKICAqIFJldHVybiBub3RoaW5nLgpAQCAtNDc0LDcgKzU1OCw3IEBACiAKIC8qKgogICogX2Jhc2Vfc2FzX2xvZ19pbmZvIC0gdmVyYm9zZSB0cmFuc2xhdGlvbiBvZiBmaXJtd2FyZSBsb2cgaW5mbwotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBsb2dfaW5mbzogbG9nIGluZm8KICAqCiAgKiBSZXR1cm4gbm90aGluZy4KQEAgLTUyNiwyMiArNjEwLDggQEAKIH0KIAogLyoqCi0gKiBtcHQyc2FzX2Jhc2VfZmF1bHRfaW5mbyAtIHZlcmJvc2UgdHJhbnNsYXRpb24gb2YgZmlybXdhcmUgRkFVTFQgY29kZQotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0Ci0gKiBAZmF1bHRfY29kZTogZmF1bHQgY29kZQotICoKLSAqIFJldHVybiBub3RoaW5nLgotICovCi12b2lkCi1tcHQyc2FzX2Jhc2VfZmF1bHRfaW5mbyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgLCB1MTYgZmF1bHRfY29kZSkKLXsKLQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYXVsdF9zdGF0ZSgweCUwNHgpIVxuIiwKLQkgICAgaW9jLT5uYW1lLCBmYXVsdF9jb2RlKTsKLX0KLQotLyoqCiAgKiBfYmFzZV9kaXNwbGF5X3JlcGx5X2luZm8gLQotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4CiAgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKICAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQpAQCAtNTcwLDcgKzY0MCw3IEBACiAKIC8qKgogICogbXB0MnNhc19iYXNlX2RvbmUgLSBiYXNlIGludGVybmFsIGNvbW1hbmQgY29tcGxldGlvbiByb3V0aW5lCi0gKiBAaW9jOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgKICAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUwogICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCkBAIC02MDMsNyArNjczLDcgQEAKIAogLyoqCiAgKiBfYmFzZV9hc3luY19ldmVudCAtIG1haW4gY2FsbGJhY2sgaGFuZGxlciBmb3IgZmlybXdhcmUgYXN5biBldmVudHMKLSAqIEBpb2M6IHBvaW50ZXIgdG8gc2NzaSBjb21tYW5kIG9iamVjdAorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKICAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQogICoKQEAgLTY4NCw3ICs3NTQsNyBAQAogCiAvKioKICAqIF9iYXNlX21hc2tfaW50ZXJydXB0cyAtIGRpc2FibGUgaW50ZXJydXB0cwotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqCiAgKiBEaXNhYmxpbmcgUmVzZXRJUlEsIFJlcGx5IGFuZCBEb29yYmVsbCBJbnRlcnJ1cHRzCiAgKgpAQCAtNzA0LDcgKzc3NCw3IEBACiAKIC8qKgogICogX2Jhc2VfdW5tYXNrX2ludGVycnVwdHMgLSBlbmFibGUgaW50ZXJydXB0cwotICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqCiAgKiBFbmFibGluZyBvbmx5IFJlcGx5IEludGVycnVwdHMKICAqCkBAIC0xMjU4LDEyICsxMzI4LDEzIEBACiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4CiAgKgotICogUmV0dXJucyBwaHlzIHBvaW50ZXIgdG8gc2Vuc2UgYnVmZmVyLgorICogUmV0dXJucyBwaHlzIHBvaW50ZXIgdG8gdGhlIGxvdyAzMmJpdCBhZGRyZXNzIG9mIHRoZSBzZW5zZSBidWZmZXIuCiAgKi8KLWRtYV9hZGRyX3QKK19fbGUzMgogbXB0MnNhc19iYXNlX2dldF9zZW5zZV9idWZmZXJfZG1hKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQpCiB7Ci0JcmV0dXJuIGlvYy0+c2Vuc2VfZG1hICsgKChzbWlkIC0gMSkgKiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCXJldHVybiBjcHVfdG9fbGUzMihpb2MtPnNlbnNlX2RtYSArCisJCQkoKHNtaWQgLSAxKSAqIFNDU0lfU0VOU0VfQlVGRkVSU0laRSkpOwogfQogCiAvKioKQEAgLTE2OTcsNiArMTc2OCwxMiBAQAogCX0KIAogCWlmIChpb2MtPmZhY3RzLklPQ0NhcGFiaWxpdGllcyAmCisJICAgIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9FWFRFTkRFRF9CVUZGRVIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXNEaWFnIEV4dGVuZGVkIEJ1ZmZlciIsIGkgPyAiLCIgOiAiIik7CisJCWkrKzsKKwl9CisKKwlpZiAoaW9jLT5mYWN0cy5JT0NDYXBhYmlsaXRpZXMgJgogCSAgICBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfVEFTS19TRVRfRlVMTF9IQU5ETElORykgewogCQlwcmludGsoIiVzVGFzayBTZXQgRnVsbCIsIGkgPyAiLCIgOiAiIik7CiAJCWkrKzsKQEAgLTI4NzEsNiArMjk0OCw4IEBACiAJTXBpMklPQ0luaXRSZXF1ZXN0X3QgbXBpX3JlcXVlc3Q7CiAJTXBpMklPQ0luaXRSZXBseV90IG1waV9yZXBseTsKIAlpbnQgcjsKKwlzdHJ1Y3QgdGltZXZhbCBjdXJyZW50X3RpbWU7CisJdTE2IGlvY19zdGF0dXM7CiAKIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKQEAgLTI5MjEsNiArMzAwMCwxMyBAQAogCSAgICBjcHVfdG9fbGUzMihpb2MtPnJlcGx5X3Bvc3RfZnJlZV9kbWEpOwogI2VuZGlmCiAKKwkvKiBUaGlzIHRpbWUgc3RhbXAgc3BlY2lmaWVzIG51bWJlciBvZiBtaWxsaXNlY29uZHMKKwkgKiBzaW5jZSBlcG9jaCB+IG1pZG5pZ2h0IEphbnVhcnkgMSwgMTk3MC4KKwkgKi8KKwlkb19nZXR0aW1lb2ZkYXkoJmN1cnJlbnRfdGltZSk7CisJbXBpX3JlcXVlc3QuVGltZVN0YW1wID0gKGN1cnJlbnRfdGltZS50dl9zZWMgKiAxMDAwKSArCisJICAgIChjdXJyZW50X3RpbWUudHZfdXNlYyA+PiAzKTsKKwogCWlmIChpb2MtPmxvZ2dpbmdfbGV2ZWwgJiBNUFRfREVCVUdfSU5JVCkgewogCQl1MzIgKm1mcDsKIAkJaW50IGk7CkBAIC0yOTQzLDcgKzMwMjksOCBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQlpZiAobXBpX3JlcGx5LklPQ1N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTIHx8CisJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpICYgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwlpZiAoaW9jX3N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTIHx8CiAJICAgIG1waV9yZXBseS5JT0NMb2dJbmZvKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWRcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOwogCQlyID0gLUVJTzsKQEAgLTM0NjEsMTEgKzM1NDgsMTEgQEAKIAkJcmV0dXJuIHI7CiAKIAlwY2lfc2V0X2RydmRhdGEoaW9jLT5wZGV2LCBpb2MtPnNob3N0KTsKLQlyID0gX2Jhc2VfbWFrZV9pb2NfcmVhZHkoaW9jLCBDQU5fU0xFRVAsIFNPRlRfUkVTRVQpOworCXIgPSBfYmFzZV9nZXRfaW9jX2ZhY3RzKGlvYywgQ0FOX1NMRUVQKTsKIAlpZiAocikKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKLQlyID0gX2Jhc2VfZ2V0X2lvY19mYWN0cyhpb2MsIENBTl9TTEVFUCk7CisJciA9IF9iYXNlX21ha2VfaW9jX3JlYWR5KGlvYywgQ0FOX1NMRUVQLCBTT0ZUX1JFU0VUKTsKIAlpZiAocikKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKQEAgLTM1MzEsNiArMzYxOCw4IEBACiAJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOwogCiAJbXB0MnNhc19iYXNlX3N0YXJ0X3dhdGNoZG9nKGlvYyk7CisJaWYgKGRpYWdfYnVmZmVyX2VuYWJsZSAhPSAwKQorCQltcHQyc2FzX2VuYWJsZV9kaWFnX2J1ZmZlcihpb2MsIGRpYWdfYnVmZmVyX2VuYWJsZSk7CiAJcmV0dXJuIDA7CiAKICBvdXRfZnJlZV9yZXNvdXJjZXM6CkBAIC0zNjg0LDYgKzM3NzMsOSBAQAogCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKKwlpZiAobXB0MnNhc19md2ZhdWx0X2RlYnVnKQorCQltcHQyc2FzX2hhbHRfZmlybXdhcmUoaW9jKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrLCBmbGFncyk7CiAJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmggYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaAppbmRleCAwY2Y2YmMyLi5iYjRmMTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaApAQCAtNjksOCArNjksOCBAQAogI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9OQU1FCQkibXB0MnNhcyIKICNkZWZpbmUgTVBUMlNBU19BVVRIT1IJIkxTSSBDb3Jwb3JhdGlvbiA8REwtTVBURnVzaW9uTGludXhAbHNpLmNvbT4iCiAjZGVmaW5lIE1QVDJTQVNfREVTQ1JJUFRJT04JIkxTSSBNUFQgRnVzaW9uIFNBUyAyLjAgRGV2aWNlIERyaXZlciIKLSNkZWZpbmUgTVBUMlNBU19EUklWRVJfVkVSU0lPTgkJIjAyLjEwMC4wMy4wMCIKLSNkZWZpbmUgTVBUMlNBU19NQUpPUl9WRVJTSU9OCQkwMgorI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9WRVJTSU9OCQkiMDMuMTAwLjAzLjAwIgorI2RlZmluZSBNUFQyU0FTX01BSk9SX1ZFUlNJT04JCTAzCiAjZGVmaW5lIE1QVDJTQVNfTUlOT1JfVkVSU0lPTgkJMTAwCiAjZGVmaW5lIE1QVDJTQVNfQlVJTERfVkVSU0lPTgkJMDMKICNkZWZpbmUgTVBUMlNBU19SRUxFQVNFX1ZFUlNJT04JCTAwCkBAIC0yNzgsNyArMjc4LDcgQEAKICAqIEBzYXNfYWRkcmVzczogZGV2aWNlIHNhcyBhZGRyZXNzCiAgKiBAZGV2aWNlX25hbWU6IHJldHJpZXZlZCBmcm9tIHRoZSBTQVMgSURFTlRJRlkgZnJhbWUuCiAgKiBAaGFuZGxlOiBkZXZpY2UgaGFuZGxlCi0gKiBAcGFyZW50X2hhbmRsZTogaGFuZGxlIHRvIHBhcmVudCBkZXZpY2UKKyAqIEBzYXNfYWRkcmVzc19wYXJlbnQ6IHNhcyBhZGRyZXNzIG9mIHBhcmVudCBleHBhbmRlciBvciBzYXMgaG9zdAogICogQGVuY2xvc3VyZV9oYW5kbGU6IGVuY2xvc3VyZSBoYW5kbGUKICAqIEBlbmNsb3N1cmVfbG9naWNhbF9pZDogZW5jbG9zdXJlIGxvZ2ljYWwgaWRlbnRpZmllcgogICogQHZvbHVtZV9oYW5kbGU6IHZvbHVtZSBoYW5kbGUgKHZhbGlkIHdoZW4gaGlkZGVuIHJhaWQgbWVtYmVyKQpAQCAtMjk2LDcgKzI5Niw3IEBACiAJdTY0CXNhc19hZGRyZXNzOwogCXU2NAlkZXZpY2VfbmFtZTsKIAl1MTYJaGFuZGxlOwotCXUxNglwYXJlbnRfaGFuZGxlOworCXU2NAlzYXNfYWRkcmVzc19wYXJlbnQ7CiAJdTE2CWVuY2xvc3VyZV9oYW5kbGU7CiAJdTY0CWVuY2xvc3VyZV9sb2dpY2FsX2lkOwogCXUxNgl2b2x1bWVfaGFuZGxlOwpAQCAtMzUyLDggKzM1Miw2IEBACiAvKioKICAqIHN0cnVjdCBfc2FzX3BvcnQgLSB3aWRlL25hcnJvdyBzYXMgcG9ydCBpbmZvcm1hdGlvbgogICogQHBvcnRfbGlzdDogbGlzdCBvZiBwb3J0cyBiZWxvbmdpbmcgdG8gZXhwYW5kZXIKLSAqIEBoYW5kbGU6IGRldmljZSBoYW5kbGUgZm9yIHRoaXMgcG9ydAotICogQHNhc19hZGRyZXNzOiBzYXMgYWRkcmVzcyBvZiB0aGlzIHBvcnQKICAqIEBudW1fcGh5czogbnVtYmVyIG9mIHBoeXMgYmVsb25naW5nIHRvIHRoaXMgcG9ydAogICogQHJlbW90ZV9pZGVudGlmeTogYXR0YWNoZWQgZGV2aWNlIGlkZW50aWZpY2F0aW9uCiAgKiBAcnBoeTogc2FzIHRyYW5zcG9ydCBycGh5IG9iamVjdApAQCAtMzYyLDggKzM2MCw2IEBACiAgKi8KIHN0cnVjdCBfc2FzX3BvcnQgewogCXN0cnVjdCBsaXN0X2hlYWQgcG9ydF9saXN0OwotCXUxNgloYW5kbGU7Ci0JdTY0CXNhc19hZGRyZXNzOwogCXU4CW51bV9waHlzOwogCXN0cnVjdCBzYXNfaWRlbnRpZnkgcmVtb3RlX2lkZW50aWZ5OwogCXN0cnVjdCBzYXNfcnBoeSAqcnBoeTsKQEAgLTM5OCw3ICszOTQsNyBAQAogICogQG51bV9waHlzOiBudW1iZXIgcGh5cyBiZWxvbmdpbmcgdG8gdGhpcyBzYXNfaG9zdC9leHBhbmRlcgogICogQHNhc19hZGRyZXNzOiBzYXMgYWRkcmVzcyBvZiB0aGlzIHNhc19ob3N0L2V4cGFuZGVyCiAgKiBAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgc2FzX2hvc3QvZXhwYW5kZXIKLSAqIEBwYXJlbnRfaGFuZGxlOiBwYXJlbnQgaGFuZGxlCisgKiBAc2FzX2FkZHJlc3NfcGFyZW50OiBzYXMgYWRkcmVzcyBvZiBwYXJlbnQgZXhwYW5kZXIgb3Igc2FzIGhvc3QKICAqIEBlbmNsb3N1cmVfaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgYSBtZW1iZXIgb2YgYW4gZW5jbG9zdXJlCiAgKiBAZGV2aWNlX2luZm86IGJpdHdpc2UgZGVmaW5pbmcgY2FwYWJpbGl0aWVzIG9mIHRoaXMgc2FzX2hvc3QvZXhwYW5kZXIKICAqIEByZXNwb25kaW5nOiB1c2VkIGluIF9zY3NpaF9leHBhbmRlcl9kZXZpY2VfbWFya19yZXNwb25kaW5nCkBAIC00MTEsNyArNDA3LDcgQEAKIAl1OAludW1fcGh5czsKIAl1NjQJc2FzX2FkZHJlc3M7CiAJdTE2CWhhbmRsZTsKLQl1MTYJcGFyZW50X2hhbmRsZTsKKwl1NjQJc2FzX2FkZHJlc3NfcGFyZW50OwogCXUxNgllbmNsb3N1cmVfaGFuZGxlOwogCXU2NAllbmNsb3N1cmVfbG9naWNhbF9pZDsKIAl1OAlyZXNwb25kaW5nOwpAQCAtNDcwLDYgKzQ2Niw3IEBACiAgKiBAY2hpcF9waHlzOiBwaHlzaWNhbCBhZGRyc3MgcHJpb3IgdG8gbWFwcGluZwogICogQHBpb19jaGlwOiBJL08gbWFwcGVkIHJlZ2lzdGVyIHNwYWNlCiAgKiBAbG9nZ2luZ19sZXZlbDogc2VlIG1wdDJzYXNfZGVidWcuaAorICogQGZ3ZmF1bHRfZGVidWc6IGRlYnVnaW5nIEZXIHRpbWVvdXRzCiAgKiBAaXJfZmlybXdhcmU6IElSIGZpcm13YXJlIHByZXNlbnQKICAqIEBiYXJzOiBiaXRtYXNrIG9mIEJBUidzIHRoYXQgbXVzdCBiZSBjb25maWd1cmVkCiAgKiBAbWFza19pbnRlcnJ1cHRzOiBpZ25vcmUgaW50ZXJydXB0CkBAIC00OTUsMTIgKzQ5MiwxNCBAQAogICogQG1zaXhfdGFibGVfYmFja3VwOiBiYWNrdXAgbXNpeCB0YWJsZQogICogQHNjc2lfaW9fY2JfaWR4OiBzaG9zdCBnZW5lcmF0ZWQgY29tbWFuZHMKICAqIEB0bV9jYl9pZHg6IHRhc2sgbWFuYWdlbWVudCBjb21tYW5kcworICogQHNjc2loX2NiX2lkeDogc2NzaWggaW50ZXJuYWwgY29tbWFuZHMKICAqIEB0cmFuc3BvcnRfY2JfaWR4OiB0cmFuc3BvcnQgaW50ZXJuYWwgY29tbWFuZHMKICAqIEBjdGxfY2JfaWR4OiBjbHQgaW50ZXJuYWwgY29tbWFuZHMKICAqIEBiYXNlX2NiX2lkeDogYmFzZSBpbnRlcm5hbCBjb21tYW5kcwogICogQGNvbmZpZ19jYl9pZHg6IGJhc2UgaW50ZXJuYWwgY29tbWFuZHMKICAqIEBiYXNlX2NtZHM6CiAgKiBAdHJhbnNwb3J0X2NtZHM6CisgKiBAc2NzaWhfY21kczoKICAqIEB0bV9jbWRzOgogICogQGN0bF9jbWRzOgogICogQGNvbmZpZ19jbWRzOgpAQCAtNTkxLDYgKzU5MCw3IEBACiAJdW5zaWduZWQgbG9uZwljaGlwX3BoeXM7CiAJdW5zaWduZWQgbG9uZwlwaW9fY2hpcDsKIAlpbnQJCWxvZ2dpbmdfbGV2ZWw7CisJaW50CQlmd2ZhdWx0X2RlYnVnOwogCXU4CQlpcl9maXJtd2FyZTsKIAlpbnQJCWJhcnM7CiAJdTgJCW1hc2tfaW50ZXJydXB0czsKQEAgLTYyNiw2ICs2MjYsNyBAQAogCXU4CQlzY3NpX2lvX2NiX2lkeDsKIAl1OAkJdG1fY2JfaWR4OwogCXU4CQl0cmFuc3BvcnRfY2JfaWR4OworCXU4CQlzY3NpaF9jYl9pZHg7CiAJdTgJCWN0bF9jYl9pZHg7CiAJdTgJCWJhc2VfY2JfaWR4OwogCXU4CQljb25maWdfY2JfaWR4OwpAQCAtNjMzLDYgKzYzNCw3IEBACiAJdTgJCXRtX3Nhc19jb250cm9sX2NiX2lkeDsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCBiYXNlX2NtZHM7CiAJc3RydWN0IF9pbnRlcm5hbF9jbWQgdHJhbnNwb3J0X2NtZHM7CisJc3RydWN0IF9pbnRlcm5hbF9jbWQgc2NzaWhfY21kczsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCB0bV9jbWRzOwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIGN0bF9jbWRzOwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIGNvbmZpZ19jbWRzOwpAQCAtNzczLDcgKzc3NSw3IEBACiB2b2lkICptcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKTsKIHZvaWQgKm1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQpOwogdm9pZCBtcHQyc2FzX2Jhc2VfYnVpbGRfemVyb19sZW5fc2dlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdm9pZCAqcGFkZHIpOwotZG1hX2FkZHJfdCBtcHQyc2FzX2Jhc2VfZ2V0X3NlbnNlX2J1ZmZlcl9kbWEoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorX19sZTMyIG1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyX2RtYShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCiAgICAgdTE2IHNtaWQpOwogCiAvKiBoaS1wcmlvcml0eSBxdWV1ZSAqLwpAQCAtODA3LDYgKzgwOSw4IEBACiAgICAgTXBpMlNlcFJlcGx5X3QgKm1waV9yZXBseSwgTXBpMlNlcFJlcXVlc3RfdCAqbXBpX3JlcXVlc3QpOwogdm9pZCBtcHQyc2FzX2Jhc2VfdmFsaWRhdGVfZXZlbnRfdHlwZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUzMiAqZXZlbnRfdHlwZSk7CiAKK3ZvaWQgbXB0MnNhc19oYWx0X2Zpcm13YXJlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyk7CisKIC8qIHNjc2loIHNoYXJlZCBBUEkgKi8KIHU4IG1wdDJzYXNfc2NzaWhfZXZlbnRfY2FsbGJhY2soc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBtc2l4X2luZGV4LAogICAgIHUzMiByZXBseSk7CkBAIC04ODYsMTkgKzg5MCwyMiBAQAogdm9pZCBtcHQyc2FzX2N0bF9hZGRfdG9fZXZlbnRfbG9nKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKICAgICBNcGkyRXZlbnROb3RpZmljYXRpb25SZXBseV90ICptcGlfcmVwbHkpOwogCit2b2lkIG1wdDJzYXNfZW5hYmxlX2RpYWdfYnVmZmVyKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKKwl1OCBiaXRzX3RvX3JlZ3NpdGVyKTsKKwogLyogdHJhbnNwb3J0IHNoYXJlZCBBUEkgKi8KIHU4IG1wdDJzYXNfdHJhbnNwb3J0X2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKICAgICB1MzIgcmVwbHkpOwogc3RydWN0IF9zYXNfcG9ydCAqbXB0MnNhc190cmFuc3BvcnRfcG9ydF9hZGQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAotICAgIHUxNiBoYW5kbGUsIHUxNiBwYXJlbnRfaGFuZGxlKTsKKyAgICAgdTE2IGhhbmRsZSwgdTY0IHNhc19hZGRyZXNzKTsKIHZvaWQgbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1NjQgc2FzX2FkZHJlc3MsCi0gICAgdTE2IHBhcmVudF9oYW5kbGUpOworICAgICB1NjQgc2FzX2FkZHJlc3NfcGFyZW50KTsKIGludCBtcHQyc2FzX3RyYW5zcG9ydF9hZGRfaG9zdF9waHkoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBzdHJ1Y3QgX3Nhc19waHkKICAgICAqbXB0MnNhc19waHksIE1waTJTYXNQaHlQYWdlMF90IHBoeV9wZzAsIHN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYpOwogaW50IG1wdDJzYXNfdHJhbnNwb3J0X2FkZF9leHBhbmRlcl9waHkoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBzdHJ1Y3QgX3Nhc19waHkKICAgICAqbXB0MnNhc19waHksIE1waTJFeHBhbmRlclBhZ2UxX3QgZXhwYW5kZXJfcGcxLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2KTsKLXZvaWQgbXB0MnNhc190cmFuc3BvcnRfdXBkYXRlX2xpbmtzKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSwKLSAgIHUxNiBhdHRhY2hlZF9oYW5kbGUsIHU4IHBoeV9udW1iZXIsIHU4IGxpbmtfcmF0ZSk7Cit2b2lkIG1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCisgICAgIHU2NCBzYXNfYWRkcmVzcywgdTE2IGhhbmRsZSwgdTggcGh5X251bWJlciwgdTggbGlua19yYXRlKTsKIGV4dGVybiBzdHJ1Y3Qgc2FzX2Z1bmN0aW9uX3RlbXBsYXRlIG1wdDJzYXNfdHJhbnNwb3J0X2Z1bmN0aW9uczsKIGV4dGVybiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKm1wdDJzYXNfdHJhbnNwb3J0X3RlbXBsYXRlOwogZXh0ZXJuIGludCBzY3NpX2ludGVybmFsX2RldmljZV9ibG9jayhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMKaW5kZXggNTdkNzI0Ni4uODRhMTI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5jCkBAIC03NDAsNyArNzQwLDcgQEAKIAkJTXBpMlNDU0lJT1JlcXVlc3RfdCAqc2NzaWlvX3JlcXVlc3QgPQogCQkgICAgKE1waTJTQ1NJSU9SZXF1ZXN0X3QgKiltcGlfcmVxdWVzdDsKIAkJc2NzaWlvX3JlcXVlc3QtPlNlbnNlQnVmZmVyTG93QWRkcmVzcyA9Ci0JCSAgICAodTMyKW1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyX2RtYShpb2MsIHNtaWQpOworCQkgICAgbXB0MnNhc19iYXNlX2dldF9zZW5zZV9idWZmZXJfZG1hKGlvYywgc21pZCk7CiAJCXByaXZfc2Vuc2UgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NlbnNlX2J1ZmZlcihpb2MsIHNtaWQpOwogCQltZW1zZXQocHJpdl9zZW5zZSwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKIAkJbXB0MnNhc19iYXNlX3B1dF9zbWlkX3Njc2lfaW8oaW9jLCBzbWlkLApAQCAtODQ4LDggKzg0OCw5IEBACiAJCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiVEFTS19NR01UOiAiCiAJCSAgICAiSU9DU3RhdHVzKDB4JTA0eCksIElPQ0xvZ0luZm8oMHglMDh4KSwgIgogCQkgICAgIlRlcm1pbmF0aW9uQ291bnQoMHglMDh4KVxuIiwgaW9jLT5uYW1lLAotCQkgICAgdG1fcmVwbHktPklPQ1N0YXR1cywgdG1fcmVwbHktPklPQ0xvZ0luZm8sCi0JCSAgICB0bV9yZXBseS0+VGVybWluYXRpb25Db3VudCk7CisJCSAgICBsZTE2X3RvX2NwdSh0bV9yZXBseS0+SU9DU3RhdHVzKSwKKwkJICAgIGxlMzJfdG9fY3B1KHRtX3JlcGx5LT5JT0NMb2dJbmZvKSwKKwkJICAgIGxlMzJfdG9fY3B1KHRtX3JlcGx5LT5UZXJtaW5hdGlvbkNvdW50KSk7CiAJfQogI2VuZGlmCiAJLyogY29weSBvdXQgeGRhdGEgdG8gdXNlciAqLwpAQCAtODk2LDYgKzg5Nyw3IEBACiAJCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiaXNzdWUgdGFyZ2V0IHJlc2V0OiBoYW5kbGUgIgogCQkJICAgICI9ICgweCUwNHgpXG4iLCBpb2MtPm5hbWUsCiAJCQkgICAgbXBpX3JlcXVlc3QtPkZ1bmN0aW9uRGVwZW5kZW50MSk7CisJCQltcHQyc2FzX2hhbHRfZmlybXdhcmUoaW9jKTsKIAkJCW11dGV4X2xvY2soJmlvYy0+dG1fY21kcy5tdXRleCk7CiAJCQltcHQyc2FzX3Njc2loX2lzc3VlX3RtKGlvYywKIAkJCSAgICBtcGlfcmVxdWVzdC0+RnVuY3Rpb25EZXBlbmRlbnQxLCAwLApAQCAtMTIyOSw3ICsxMjMxLDcgQEAKIC8qKgogICogX2N0bF9kaWFnX2NhcGFiaWxpdHkgLSByZXR1cm4gZGlhZyBidWZmZXIgY2FwYWJpbGl0eQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAYnVmZmVyX3R5cGU6IHNwZWNpZmllcyBlaXRoZXIgVFJBQ0Ugb3IgU05BUFNIT1QKKyAqIEBidWZmZXJfdHlwZTogc3BlY2lmaWVzIGVpdGhlciBUUkFDRSwgU05BUFNIT1QsIG9yIEVYVEVOREVECiAgKgogICogcmV0dXJucyAxIHdoZW4gZGlhZyBidWZmZXIgc3VwcG9ydCBpcyBlbmFibGVkIGluIGZpcm13YXJlCiAgKi8KQEAgLTEyNDksMjQgKzEyNTEsMjUgQEAKIAkJICAgIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9TTkFQU0hPVF9CVUZGRVIpCiAJCQlyYyA9IDE7CiAJCWJyZWFrOworCWNhc2UgTVBJMl9ESUFHX0JVRl9UWVBFX0VYVEVOREVEOgorCQlpZiAoaW9jLT5mYWN0cy5JT0NDYXBhYmlsaXRpZXMgJgorCQkgICAgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX0VYVEVOREVEX0JVRkZFUikKKwkJCXJjID0gMTsKIAl9CiAKIAlyZXR1cm4gcmM7CiB9CiAKIC8qKgotICogX2N0bF9kaWFnX3JlZ2lzdGVyIC0gYXBwbGljYXRpb24gcmVnaXN0ZXIgd2l0aCBkcml2ZXIKLSAqIEBhcmcgLSB1c2VyIHNwYWNlIGJ1ZmZlciBjb250YWluaW5nIGlvY3RsIGNvbnRlbnQKLSAqIEBzdGF0ZSAtIE5PTl9CTE9DS0lORyBvciBCTE9DS0lORworICogX2N0bF9kaWFnX3JlZ2lzdGVyXzIgLSB3cmFwcGVyIGZvciByZWdpc3RlcmluZyBkaWFnIGJ1ZmZlciBzdXBwb3J0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBkaWFnX3JlZ2lzdGVyOiB0aGUgZGlhZ19yZWdpc3RlciBzdHJ1Y3QgcGFzc2VkIGluIGZyb20gdXNlciBzcGFjZQogICoKLSAqIFRoaXMgd2lsbCBhbGxvdyB0aGUgZHJpdmVyIHRvIHNldHVwIGFueSByZXF1aXJlZCBidWZmZXJzIHRoYXQgd2lsbCBiZQotICogbmVlZGVkIGJ5IGZpcm13YXJlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRyaXZlci4KICAqLwogc3RhdGljIGxvbmcKLV9jdGxfZGlhZ19yZWdpc3Rlcih2b2lkIF9fdXNlciAqYXJnLCBlbnVtIGJsb2NrX3N0YXRlIHN0YXRlKQorX2N0bF9kaWFnX3JlZ2lzdGVyXzIoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorICAgIHN0cnVjdCBtcHQyX2RpYWdfcmVnaXN0ZXIgKmRpYWdfcmVnaXN0ZXIpCiB7Ci0Jc3RydWN0IG1wdDJfZGlhZ19yZWdpc3RlciBrYXJnOwotCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYzsKIAlpbnQgcmMsIGk7CiAJdm9pZCAqcmVxdWVzdF9kYXRhID0gTlVMTDsKIAlkbWFfYWRkcl90IHJlcXVlc3RfZGF0YV9kbWE7CkBAIC0xMjc5LDE4ICsxMjgyLDE3IEBACiAJdTE2IGlvY19zdGF0dXM7CiAJdTggaXNzdWVfcmVzZXQgPSAwOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihrYXJnKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAotCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAoX2N0bF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NfbnVtYmVyLCAmaW9jKSA9PSAtMSB8fCAhaW9jKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKLQlidWZmZXJfdHlwZSA9IGthcmcuYnVmZmVyX3R5cGU7CisJaWYgKGlvYy0+Y3RsX2NtZHMuc3RhdHVzICE9IE1QVDJfQ01EX05PVF9VU0VEKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBjdGxfY21kIGluIHVzZVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlyYyA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWJ1ZmZlcl90eXBlID0gZGlhZ19yZWdpc3Rlci0+YnVmZmVyX3R5cGU7CiAJaWYgKCFfY3RsX2RpYWdfY2FwYWJpbGl0eShpb2MsIGJ1ZmZlcl90eXBlKSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogZG9lc24ndCBoYXZlIGNhcGFiaWxpdHkgZm9yICIKIAkJICAgICJidWZmZXJfdHlwZSgweCUwMngpXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLCBidWZmZXJfdHlwZSk7CkBAIC0xMzA1LDI0ICsxMzA3LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChrYXJnLnJlcXVlc3RlZF9idWZmZXJfc2l6ZSAlIDQpICB7CisJaWYgKGRpYWdfcmVnaXN0ZXItPnJlcXVlc3RlZF9idWZmZXJfc2l6ZSAlIDQpICB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiB0aGUgcmVxdWVzdGVkX2J1ZmZlcl9zaXplICIKIAkJICAgICJpcyBub3QgNCBieXRlIGFsaWduZWRcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoc3RhdGUgPT0gTk9OX0JMT0NLSU5HICYmICFtdXRleF90cnlsb2NrKCZpb2MtPmN0bF9jbWRzLm11dGV4KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0JZWxzZSBpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpb2MtPmN0bF9jbWRzLm11dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWlmIChpb2MtPmN0bF9jbWRzLnN0YXR1cyAhPSBNUFQyX0NNRF9OT1RfVVNFRCkgewotCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogY3RsX2NtZCBpbiB1c2VcbiIsCi0JCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUFHQUlOOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkKGlvYywgaW9jLT5jdGxfY2JfaWR4KTsKIAlpZiAoIXNtaWQpIHsKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBvYnRhaW5pbmcgYSBzbWlkXG4iLApAQCAtMTMzOCwxMiArMTMyOCwxMiBAQAogCWlvYy0+Y3RsX2NtZHMuc21pZCA9IHNtaWQ7CiAKIAlyZXF1ZXN0X2RhdGEgPSBpb2MtPmRpYWdfYnVmZmVyW2J1ZmZlcl90eXBlXTsKLQlyZXF1ZXN0X2RhdGFfc3ogPSBrYXJnLnJlcXVlc3RlZF9idWZmZXJfc2l6ZTsKLQlpb2MtPnVuaXF1ZV9pZFtidWZmZXJfdHlwZV0gPSBrYXJnLnVuaXF1ZV9pZDsKKwlyZXF1ZXN0X2RhdGFfc3ogPSBkaWFnX3JlZ2lzdGVyLT5yZXF1ZXN0ZWRfYnVmZmVyX3NpemU7CisJaW9jLT51bmlxdWVfaWRbYnVmZmVyX3R5cGVdID0gZGlhZ19yZWdpc3Rlci0+dW5pcXVlX2lkOwogCWlvYy0+ZGlhZ19idWZmZXJfc3RhdHVzW2J1ZmZlcl90eXBlXSA9IDA7Ci0JbWVtY3B5KGlvYy0+cHJvZHVjdF9zcGVjaWZpY1tidWZmZXJfdHlwZV0sIGthcmcucHJvZHVjdF9zcGVjaWZpYywKLQkgICAgTVBUMl9QUk9EVUNUX1NQRUNJRklDX0RXT1JEUyk7Ci0JaW9jLT5kaWFnbm9zdGljX2ZsYWdzW2J1ZmZlcl90eXBlXSA9IGthcmcuZGlhZ25vc3RpY19mbGFnczsKKwltZW1jcHkoaW9jLT5wcm9kdWN0X3NwZWNpZmljW2J1ZmZlcl90eXBlXSwKKwkgICAgZGlhZ19yZWdpc3Rlci0+cHJvZHVjdF9zcGVjaWZpYywgTVBUMl9QUk9EVUNUX1NQRUNJRklDX0RXT1JEUyk7CisJaW9jLT5kaWFnbm9zdGljX2ZsYWdzW2J1ZmZlcl90eXBlXSA9IGRpYWdfcmVnaXN0ZXItPmRpYWdub3N0aWNfZmxhZ3M7CiAKIAlpZiAocmVxdWVzdF9kYXRhKSB7CiAJCXJlcXVlc3RfZGF0YV9kbWEgPSBpb2MtPmRpYWdfYnVmZmVyX2RtYVtidWZmZXJfdHlwZV07CkBAIC0xMzczLDggKzEzNjMsOCBAQAogCX0KIAogCW1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fRElBR19CVUZGRVJfUE9TVDsKLQltcGlfcmVxdWVzdC0+QnVmZmVyVHlwZSA9IGthcmcuYnVmZmVyX3R5cGU7Ci0JbXBpX3JlcXVlc3QtPkZsYWdzID0gY3B1X3RvX2xlMzIoa2FyZy5kaWFnbm9zdGljX2ZsYWdzKTsKKwltcGlfcmVxdWVzdC0+QnVmZmVyVHlwZSA9IGRpYWdfcmVnaXN0ZXItPmJ1ZmZlcl90eXBlOworCW1waV9yZXF1ZXN0LT5GbGFncyA9IGNwdV90b19sZTMyKGRpYWdfcmVnaXN0ZXItPmRpYWdub3N0aWNfZmxhZ3MpOwogCW1waV9yZXF1ZXN0LT5CdWZmZXJBZGRyZXNzID0gY3B1X3RvX2xlNjQocmVxdWVzdF9kYXRhX2RtYSk7CiAJbXBpX3JlcXVlc3QtPkJ1ZmZlckxlbmd0aCA9IGNwdV90b19sZTMyKHJlcXVlc3RfZGF0YV9zeik7CiAJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLwpAQCAtMTQyMiw3ICsxNDEyLDcgQEAKIAl9IGVsc2UgewogCQlwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiBpb2Nfc3RhdHVzKDB4JTA0eCkgIgogCQkgICAgImxvZ19pbmZvKDB4JTA4eClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCi0JCSAgICBpb2Nfc3RhdHVzLCBtcGlfcmVwbHktPklPQ0xvZ0luZm8pOworCQkgICAgaW9jX3N0YXR1cywgbGUzMl90b19jcHUobXBpX3JlcGx5LT5JT0NMb2dJbmZvKSk7CiAJCXJjID0gLUVGQVVMVDsKIAl9CiAKQEAgLTE0MzgsNiArMTQyOCw4MyBAQAogCQkgICAgcmVxdWVzdF9kYXRhLCByZXF1ZXN0X2RhdGFfZG1hKTsKIAogCWlvYy0+Y3RsX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIG1wdDJzYXNfZW5hYmxlX2RpYWdfYnVmZmVyIC0gZW5hYmxpbmcgZGlhZ19idWZmZXJzIHN1cHBvcnQgZHJpdmVyIGxvYWQgdGltZQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAYml0c190b19yZWdpc3RlcjogYml0d2lzZSBmaWVsZCB3aGVyZSB0cmFjZSBpcyBiaXQgMCwgYW5kIHNuYXBzaG90IGlzIGJpdCAxCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBjb21tYW5kIGxpbmUgb3B0aW9uIGRpYWdfYnVmZmVyX2VuYWJsZSBpcyBlbmFibGVkCisgKiBhdCBkcml2ZXIgbG9hZCB0aW1lLgorICovCit2b2lkCittcHQyc2FzX2VuYWJsZV9kaWFnX2J1ZmZlcihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IGJpdHNfdG9fcmVnaXN0ZXIpCit7CisJc3RydWN0IG1wdDJfZGlhZ19yZWdpc3RlciBkaWFnX3JlZ2lzdGVyOworCisJbWVtc2V0KCZkaWFnX3JlZ2lzdGVyLCAwLCBzaXplb2Yoc3RydWN0IG1wdDJfZGlhZ19yZWdpc3RlcikpOworCisJaWYgKGJpdHNfdG9fcmVnaXN0ZXIgJiAxKSB7CisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZWdpc3RlcmluZyB0cmFjZSBidWZmZXIgc3VwcG9ydFxuIiwKKwkJICAgIGlvYy0+bmFtZSk7CisJCWRpYWdfcmVnaXN0ZXIuYnVmZmVyX3R5cGUgPSBNUEkyX0RJQUdfQlVGX1RZUEVfVFJBQ0U7CisJCS8qIHJlZ2lzdGVyIGZvciAxTUIgYnVmZmVycyAgKi8KKwkJZGlhZ19yZWdpc3Rlci5yZXF1ZXN0ZWRfYnVmZmVyX3NpemUgPSAoMTAyNCAqIDEwMjQpOworCQlkaWFnX3JlZ2lzdGVyLnVuaXF1ZV9pZCA9IDB4NzA3NTkwMDsKKwkJX2N0bF9kaWFnX3JlZ2lzdGVyXzIoaW9jLCAgJmRpYWdfcmVnaXN0ZXIpOworCX0KKworCWlmIChiaXRzX3RvX3JlZ2lzdGVyICYgMikgeworCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicmVnaXN0ZXJpbmcgc25hcHNob3QgYnVmZmVyIHN1cHBvcnRcbiIsCisJCSAgICBpb2MtPm5hbWUpOworCQlkaWFnX3JlZ2lzdGVyLmJ1ZmZlcl90eXBlID0gTVBJMl9ESUFHX0JVRl9UWVBFX1NOQVBTSE9UOworCQkvKiByZWdpc3RlciBmb3IgMk1CIGJ1ZmZlcnMgICovCisJCWRpYWdfcmVnaXN0ZXIucmVxdWVzdGVkX2J1ZmZlcl9zaXplID0gMiAqICgxMDI0ICogMTAyNCk7CisJCWRpYWdfcmVnaXN0ZXIudW5pcXVlX2lkID0gMHg3MDc1OTAxOworCQlfY3RsX2RpYWdfcmVnaXN0ZXJfMihpb2MsICAmZGlhZ19yZWdpc3Rlcik7CisJfQorCisJaWYgKGJpdHNfdG9fcmVnaXN0ZXIgJiA0KSB7CisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZWdpc3RlcmluZyBleHRlbmRlZCBidWZmZXIgc3VwcG9ydFxuIiwKKwkJICAgIGlvYy0+bmFtZSk7CisJCWRpYWdfcmVnaXN0ZXIuYnVmZmVyX3R5cGUgPSBNUEkyX0RJQUdfQlVGX1RZUEVfRVhURU5ERUQ7CisJCS8qIHJlZ2lzdGVyIGZvciAyTUIgYnVmZmVycyAgKi8KKwkJZGlhZ19yZWdpc3Rlci5yZXF1ZXN0ZWRfYnVmZmVyX3NpemUgPSAyICogKDEwMjQgKiAxMDI0KTsKKwkJZGlhZ19yZWdpc3Rlci51bmlxdWVfaWQgPSAweDcwNzU5MDE7CisJCV9jdGxfZGlhZ19yZWdpc3Rlcl8yKGlvYywgICZkaWFnX3JlZ2lzdGVyKTsKKwl9Cit9CisKKy8qKgorICogX2N0bF9kaWFnX3JlZ2lzdGVyIC0gYXBwbGljYXRpb24gcmVnaXN0ZXIgd2l0aCBkcml2ZXIKKyAqIEBhcmcgLSB1c2VyIHNwYWNlIGJ1ZmZlciBjb250YWluaW5nIGlvY3RsIGNvbnRlbnQKKyAqIEBzdGF0ZSAtIE5PTl9CTE9DS0lORyBvciBCTE9DS0lORworICoKKyAqIFRoaXMgd2lsbCBhbGxvdyB0aGUgZHJpdmVyIHRvIHNldHVwIGFueSByZXF1aXJlZCBidWZmZXJzIHRoYXQgd2lsbCBiZQorICogbmVlZGVkIGJ5IGZpcm13YXJlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGxvbmcKK19jdGxfZGlhZ19yZWdpc3Rlcih2b2lkIF9fdXNlciAqYXJnLCBlbnVtIGJsb2NrX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBtcHQyX2RpYWdfcmVnaXN0ZXIga2FyZzsKKwlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2M7CisJbG9uZyByYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigma2FyZywgYXJnLCBzaXplb2Yoa2FyZykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKKwkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKF9jdGxfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jX251bWJlciwgJmlvYykgPT0gLTEgfHwgIWlvYykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc3RhdGUgPT0gTk9OX0JMT0NLSU5HICYmICFtdXRleF90cnlsb2NrKCZpb2MtPmN0bF9jbWRzLm11dGV4KSkKKwkJcmV0dXJuIC1FQUdBSU47CisJZWxzZSBpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpb2MtPmN0bF9jbWRzLm11dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyYyA9IF9jdGxfZGlhZ19yZWdpc3Rlcl8yKGlvYywgJmthcmcpOwogCW11dGV4X3VubG9jaygmaW9jLT5jdGxfY21kcy5tdXRleCk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTYwMCw3ICsxNjY3LDcgQEAKIC8qKgogICogX2N0bF9zZW5kX3JlbGVhc2UgLSBEaWFnIFJlbGVhc2UgTWVzc2FnZQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAYnVmZmVyX3R5cGUgLSBzcGVjaWZpZXMgZWl0aGVyIFRSQUNFIG9yIFNOQVBTSE9UCisgKiBAYnVmZmVyX3R5cGUgLSBzcGVjaWZpZXMgZWl0aGVyIFRSQUNFLCBTTkFQU0hPVCwgb3IgRVhURU5ERUQKICAqIEBpc3N1ZV9yZXNldCAtIHNwZWNpZmllcyB3aGV0aGVyIGhvc3QgcmVzZXQgaXMgcmVxdWlyZWQuCiAgKgogICovCkBAIC0xNjkwLDcgKzE3NTcsNyBAQAogCX0gZWxzZSB7CiAJCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGlvY19zdGF0dXMoMHglMDR4KSAiCiAJCSAgICAibG9nX2luZm8oMHglMDh4KVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywKLQkJICAgIGlvY19zdGF0dXMsIG1waV9yZXBseS0+SU9DTG9nSW5mbyk7CisJCSAgICBpb2Nfc3RhdHVzLCBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pKTsKIAkJcmMgPSAtRUZBVUxUOwogCX0KIApAQCAtMTk1MSw3ICsyMDE4LDcgQEAKIAl9IGVsc2UgewogCQlwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiBpb2Nfc3RhdHVzKDB4JTA0eCkgIgogCQkgICAgImxvZ19pbmZvKDB4JTA4eClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCi0JCSAgICBpb2Nfc3RhdHVzLCBtcGlfcmVwbHktPklPQ0xvZ0luZm8pOworCQkgICAgaW9jX3N0YXR1cywgbGUzMl90b19jcHUobXBpX3JlcGx5LT5JT0NMb2dJbmZvKSk7CiAJCXJjID0gLUVGQVVMVDsKIAl9CiAKQEAgLTI0NzQsNiArMjU0MSw0MyBAQAogc3RhdGljIERFVklDRV9BVFRSKGxvZ2dpbmdfbGV2ZWwsIFNfSVJVR08gfCBTX0lXVVNSLAogICAgIF9jdGxfbG9nZ2luZ19sZXZlbF9zaG93LCBfY3RsX2xvZ2dpbmdfbGV2ZWxfc3RvcmUpOwogCisvKiBkZXZpY2UgYXR0cmlidXRlcyAqLworLyoKKyAqIF9jdGxfZndmYXVsdF9kZWJ1Z19zaG93IC0gc2hvdy9zdG9yZSBmd2ZhdWx0X2RlYnVnCisgKiBAY2RldiAtIHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCisgKiBAYnVmIC0gdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIG1wdDJzYXNfZndmYXVsdF9kZWJ1ZyBpcyBjb21tYW5kIGxpbmUgb3B0aW9uCisgKiBBIHN5c2ZzICdyZWFkL3dyaXRlJyBzaG9zdCBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitfY3RsX2Z3ZmF1bHRfZGVidWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LAorICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBpb2MtPmZ3ZmF1bHRfZGVidWcpOworfQorc3RhdGljIHNzaXplX3QKK19jdGxfZndmYXVsdF9kZWJ1Z19zdG9yZShzdHJ1Y3QgZGV2aWNlICpjZGV2LAorICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOworCWludCB2YWwgPSAwOworCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZ2YWwpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaW9jLT5md2ZhdWx0X2RlYnVnID0gdmFsOworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJmd2ZhdWx0X2RlYnVnPSVkXG4iLCBpb2MtPm5hbWUsCisJICAgIGlvYy0+ZndmYXVsdF9kZWJ1Zyk7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorc3RhdGljIERFVklDRV9BVFRSKGZ3ZmF1bHRfZGVidWcsIFNfSVJVR08gfCBTX0lXVVNSLAorICAgIF9jdGxfZndmYXVsdF9kZWJ1Z19zaG93LCBfY3RsX2Z3ZmF1bHRfZGVidWdfc3RvcmUpOworCiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbXB0MnNhc19ob3N0X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3ZlcnNpb25fZncsCiAJJmRldl9hdHRyX3ZlcnNpb25fYmlvcywKQEAgLTI0ODcsMTMgKzI1OTEsMTIgQEAKIAkmZGV2X2F0dHJfaW9fZGVsYXksCiAJJmRldl9hdHRyX2RldmljZV9kZWxheSwKIAkmZGV2X2F0dHJfbG9nZ2luZ19sZXZlbCwKKwkmZGV2X2F0dHJfZndmYXVsdF9kZWJ1ZywKIAkmZGV2X2F0dHJfZndfcXVldWVfZGVwdGgsCiAJJmRldl9hdHRyX2hvc3Rfc2FzX2FkZHJlc3MsCiAJTlVMTCwKIH07CiAKLS8qIGRldmljZSBhdHRyaWJ1dGVzICovCi0KIC8qKgogICogX2N0bF9kZXZpY2Vfc2FzX2FkZHJlc3Nfc2hvdyAtIHNhcyBhZGRyZXNzCiAgKiBAY2RldiAtIHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuaAppbmRleCAyMTFmMjk2Li44YTVlZWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmgKQEAgLTMxMyw3ICszMTMsNyBAQAogICogc3RydWN0IG1wdDJfZGlhZ19yZWdpc3RlciAtIGFwcGxpY2F0aW9uIHJlZ2lzdGVyIHdpdGggZHJpdmVyCiAgKiBAaGRyIC0gZ2VuZXJpYyBoZWFkZXIKICAqIEByZXNlcnZlZCAtCi0gKiBAYnVmZmVyX3R5cGUgLSBzcGVjaWZpZXMgZWl0aGVyIFRSQUNFIG9yIFNOQVBTSE9UCisgKiBAYnVmZmVyX3R5cGUgLSBzcGVjaWZpZXMgZWl0aGVyIFRSQUNFLCBTTkFQU0hPVCwgb3IgRVhURU5ERUQKICAqIEBhcHBsaWNhdGlvbl9mbGFncyAtIG1pc2MgZmxhZ3MKICAqIEBkaWFnbm9zdGljX2ZsYWdzIC0gc3BlY2lmaWVzIGZsYWdzIGFmZmVjdGluZyBjb21tYW5kIHByb2Nlc3NpbmcKICAqIEBwcm9kdWN0X3NwZWNpZmljIC0gcHJvZHVjdCBzcGVjaWZpYyBpbmZvcm1hdGlvbgpAQCAtMzUyLDcgKzM1Miw3IEBACiAgKiBzdHJ1Y3QgbXB0Ml9kaWFnX3F1ZXJ5IC0gcXVlcnkgcmVsZXZhbnQgaW5mbyBhc3NvY2lhdGVkIHdpdGggZGlhZyBidWZmZXJzCiAgKiBAaGRyIC0gZ2VuZXJpYyBoZWFkZXIKICAqIEByZXNlcnZlZCAtCi0gKiBAYnVmZmVyX3R5cGUgLSBzcGVjaWZpZXMgZWl0aGVyIFRSQUNFIG9yIFNOQVBTSE9UCisgKiBAYnVmZmVyX3R5cGUgLSBzcGVjaWZpZXMgZWl0aGVyIFRSQUNFLCBTTkFQU0hPVCwgb3IgRVhURU5ERUQKICAqIEBhcHBsaWNhdGlvbl9mbGFncyAtIG1pc2MgZmxhZ3MKICAqIEBkaWFnbm9zdGljX2ZsYWdzIC0gc3BlY2lmaWVzIGZsYWdzIGFmZmVjdGluZyBjb21tYW5kIHByb2Nlc3NpbmcKICAqIEBwcm9kdWN0X3NwZWNpZmljIC0gcHJvZHVjdCBzcGVjaWZpYyBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCmluZGV4IDg2YWIzMmQuLmVmYWJlYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKQEAgLTc2LDYgKzc2LDcgQEAKIHN0YXRpYyB1OCBjdGxfY2JfaWR4ID0gLTE7CiBzdGF0aWMgdTggYmFzZV9jYl9pZHggPSAtMTsKIHN0YXRpYyB1OCB0cmFuc3BvcnRfY2JfaWR4ID0gLTE7CitzdGF0aWMgdTggc2NzaWhfY2JfaWR4ID0gLTE7CiBzdGF0aWMgdTggY29uZmlnX2NiX2lkeCA9IC0xOwogc3RhdGljIGludCBtcHRfaWRzOwogCkBAIC0xOTYsMTAgKzE5NywyOCBAQAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCiAJeyBNUEkyX01GR1BBR0VfVkVORE9SSURfTFNJLCBNUEkyX01GR1BBR0VfREVWSURfU0FTMjEwOF8zLAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJLyogTWV0ZW9yIH4gMjExNiAqLwogCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIxMTZfMSwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAogCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIxMTZfMiwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCS8qIFRodW5kZXJib2x0IH4gMjIwOCAqLworCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfMSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfMywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfOCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAogCXswfQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzY3NpaF9wY2lfdGFibGUpOwpAQCAtMzE3LDYgKzMzNiw0NyBAQAogfQogCiAvKioKKyAqIF9zY3NpaF9nZXRfc2FzX2FkZHJlc3MgLSBzZXQgdGhlIHNhc19hZGRyZXNzIGZvciBnaXZlbiBkZXZpY2UgaGFuZGxlCisgKiBAaGFuZGxlOiBkZXZpY2UgaGFuZGxlCisgKiBAc2FzX2FkZHJlc3M6IHNhcyBhZGRyZXNzCisgKgorICogUmV0dXJucyAwIHN1Y2Nlc3MsIG5vbi16ZXJvIHdoZW4gZmFpbHVyZQorICovCitzdGF0aWMgaW50Citfc2NzaWhfZ2V0X3Nhc19hZGRyZXNzKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSwKKyAgICB1NjQgKnNhc19hZGRyZXNzKQoreworCU1waTJTYXNEZXZpY2VQYWdlMF90IHNhc19kZXZpY2VfcGcwOworCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKKwl1MzIgaW9jX3N0YXR1czsKKworCWlmIChoYW5kbGUgPD0gaW9jLT5zYXNfaGJhLm51bV9waHlzKSB7CisJCSpzYXNfYWRkcmVzcyA9IGlvYy0+c2FzX2hiYS5zYXNfYWRkcmVzczsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCSpzYXNfYWRkcmVzcyA9IDA7CisKKwlpZiAoKG1wdDJzYXNfY29uZmlnX2dldF9zYXNfZGV2aWNlX3BnMChpb2MsICZtcGlfcmVwbHksICZzYXNfZGV2aWNlX3BnMCwKKwkgICAgTVBJMl9TQVNfREVWSUNFX1BHQURfRk9STV9IQU5ETEUsIGhhbmRsZSkpKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSAmCisJICAgIE1QSTJfSU9DU1RBVFVTX01BU0s7CisJaWYgKGlvY19zdGF0dXMgIT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJoYW5kbGUoMHglMDR4KSwgaW9jX3N0YXR1cygweCUwNHgpIgorCQkgICAgIlxuZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUsIGlvY19zdGF0dXMsCisJCSAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCSpzYXNfYWRkcmVzcyA9IGxlNjRfdG9fY3B1KHNhc19kZXZpY2VfcGcwLlNBU0FkZHJlc3MpOworCXJldHVybiAwOworfQorCisvKioKICAqIF9zY3NpaF9kZXRlcm1pbmVfYm9vdF9kZXZpY2UgLSBkZXRlcm1pbmUgYm9vdCBkZXZpY2UuCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBkZXZpY2U6IGVpdGhlciBzYXNfZGV2aWNlIG9yIHJhaWRfZGV2aWNlIG9iamVjdApAQCAtNTEwLDggKzU3MCw2IEBACiAgICAgc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IGhhbmRsZSwgcGFyZW50X2hhbmRsZTsKLQl1NjQgc2FzX2FkZHJlc3M7CiAKIAlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogaGFuZGxlIgogCSAgICAiKDB4JTA0eCksIHNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCkBAIC01MjEsMTAgKzU3OSw4IEBACiAJbGlzdF9hZGRfdGFpbCgmc2FzX2RldmljZS0+bGlzdCwgJmlvYy0+c2FzX2RldmljZV9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCi0JaGFuZGxlID0gc2FzX2RldmljZS0+aGFuZGxlOwotCXBhcmVudF9oYW5kbGUgPSBzYXNfZGV2aWNlLT5wYXJlbnRfaGFuZGxlOwotCXNhc19hZGRyZXNzID0gc2FzX2RldmljZS0+c2FzX2FkZHJlc3M7Ci0JaWYgKCFtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIGhhbmRsZSwgcGFyZW50X2hhbmRsZSkpCisJaWYgKCFtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIHNhc19kZXZpY2UtPmhhbmRsZSwKKwkgICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCkpCiAJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOwogfQogCkBAIC01NTMsMzEgKzYwOSw2IEBACiB9CiAKIC8qKgotICogbXB0MnNhc19zY3NpaF9leHBhbmRlcl9maW5kX2J5X2hhbmRsZSAtIGV4cGFuZGVyIGRldmljZSBzZWFyY2gKLSAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQGhhbmRsZTogZXhwYW5kZXIgaGFuZGxlIChhc3NpZ25lZCBieSBmaXJtd2FyZSkKLSAqIENvbnRleHQ6IENhbGxpbmcgZnVuY3Rpb24gc2hvdWxkIGFjcXVpcmUgaW9jLT5zYXNfZGV2aWNlX2xvY2sKLSAqCi0gKiBUaGlzIHNlYXJjaGVzIGZvciBleHBhbmRlciBkZXZpY2UgYmFzZWQgb24gaGFuZGxlLCB0aGVuIHJldHVybnMgdGhlCi0gKiBzYXNfbm9kZSBvYmplY3QuCi0gKi8KLXN0cnVjdCBfc2FzX25vZGUgKgotbXB0MnNhc19zY3NpaF9leHBhbmRlcl9maW5kX2J5X2hhbmRsZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpCi17Ci0Jc3RydWN0IF9zYXNfbm9kZSAqc2FzX2V4cGFuZGVyLCAqcjsKLQotCXIgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2FzX2V4cGFuZGVyLCAmaW9jLT5zYXNfZXhwYW5kZXJfbGlzdCwgbGlzdCkgewotCQlpZiAoc2FzX2V4cGFuZGVyLT5oYW5kbGUgIT0gaGFuZGxlKQotCQkJY29udGludWU7Ci0JCXIgPSBzYXNfZXhwYW5kZXI7Ci0JCWdvdG8gb3V0OwotCX0KLSBvdXQ6Ci0JcmV0dXJuIHI7Ci19Ci0KLS8qKgogICogX3Njc2loX3JhaWRfZGV2aWNlX2ZpbmRfYnlfaWQgLSByYWlkIGRldmljZSBzZWFyY2gKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQGlkOiBzYXMgZGV2aWNlIHRhcmdldCBpZApAQCAtNjk5LDYgKzczMCwzMSBAQAogfQogCiAvKioKKyAqIG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9oYW5kbGUgLSBleHBhbmRlciBkZXZpY2Ugc2VhcmNoCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBoYW5kbGU6IGV4cGFuZGVyIGhhbmRsZSAoYXNzaWduZWQgYnkgZmlybXdhcmUpCisgKiBDb250ZXh0OiBDYWxsaW5nIGZ1bmN0aW9uIHNob3VsZCBhY3F1aXJlIGlvYy0+c2FzX2RldmljZV9sb2NrCisgKgorICogVGhpcyBzZWFyY2hlcyBmb3IgZXhwYW5kZXIgZGV2aWNlIGJhc2VkIG9uIGhhbmRsZSwgdGhlbiByZXR1cm5zIHRoZQorICogc2FzX25vZGUgb2JqZWN0LgorICovCitzdHJ1Y3QgX3Nhc19ub2RlICoKK21wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9oYW5kbGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlKQoreworCXN0cnVjdCBfc2FzX25vZGUgKnNhc19leHBhbmRlciwgKnI7CisKKwlyID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNhc19leHBhbmRlciwgJmlvYy0+c2FzX2V4cGFuZGVyX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHNhc19leHBhbmRlci0+aGFuZGxlICE9IGhhbmRsZSkKKwkJCWNvbnRpbnVlOworCQlyID0gc2FzX2V4cGFuZGVyOworCQlnb3RvIG91dDsKKwl9Cisgb3V0OgorCXJldHVybiByOworfQorCisvKioKICAqIG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9zYXNfYWRkcmVzcyAtIGV4cGFuZGVyIGRldmljZSBzZWFyY2gKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNhc19hZGRyZXNzOiBzYXMgYWRkcmVzcwpAQCAtMTA0MywxNyArMTA5OSw0NiBAQAogICogX3Njc2loX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIHNldHRpbmcgZGV2aWNlIHF1ZXVlIGRlcHRoCiAgKiBAc2Rldjogc2NzaSBkZXZpY2Ugc3RydWN0CiAgKiBAcWRlcHRoOiByZXF1ZXN0ZWQgcXVldWUgZGVwdGgKKyAqIEByZWFzb246IGNhbGxpbmcgY29udGV4dAogICoKICAqIFJldHVybnMgcXVldWUgZGVwdGguCiAgKi8KIHN0YXRpYyBpbnQKLV9zY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcWRlcHRoKQorX3Njc2loX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgsIGludCByZWFzb24pCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OwogCWludCBtYXhfZGVwdGg7CiAJaW50IHRhZ190eXBlOworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBNUFQyU0FTX0RFVklDRSAqc2FzX2RldmljZV9wcml2X2RhdGE7CisJc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YTsKKwlzdHJ1Y3QgX3Nhc19kZXZpY2UgKnNhc19kZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyZWFzb24gIT0gU0NTSV9RREVQVEhfREVGQVVMVCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbWF4X2RlcHRoID0gc2hvc3QtPmNhbl9xdWV1ZTsKKworCS8qIGxpbWl0IG1heCBkZXZpY2UgcXVldWUgZm9yIFNBVEEgdG8gMzIgKi8KKwlzYXNfZGV2aWNlX3ByaXZfZGF0YSA9IHNkZXYtPmhvc3RkYXRhOworCWlmICghc2FzX2RldmljZV9wcml2X2RhdGEpCisJCWdvdG8gbm90X3NhdGE7CisJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzYXNfZGV2aWNlX3ByaXZfZGF0YS0+c2FzX3RhcmdldDsKKwlpZiAoIXNhc190YXJnZXRfcHJpdl9kYXRhKQorCQlnb3RvIG5vdF9zYXRhOworCWlmICgoc2FzX3RhcmdldF9wcml2X2RhdGEtPmZsYWdzICYgTVBUX1RBUkdFVF9GTEFHU19WT0xVTUUpKQorCQlnb3RvIG5vdF9zYXRhOworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCXNhc19kZXZpY2UgPSBtcHQyc2FzX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJICAgc2FzX2RldmljZV9wcml2X2RhdGEtPnNhc190YXJnZXQtPnNhc19hZGRyZXNzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCWlmIChzYXNfZGV2aWNlICYmIHNhc19kZXZpY2UtPmRldmljZV9pbmZvICYKKwkgICAgTVBJMl9TQVNfREVWSUNFX0lORk9fU0FUQV9ERVZJQ0UpCisJCW1heF9kZXB0aCA9IE1QVDJTQVNfU0FUQV9RVUVVRV9ERVBUSDsKKworIG5vdF9zYXRhOgorCiAJaWYgKCFzZGV2LT50YWdnZWRfc3VwcG9ydGVkKQogCQltYXhfZGVwdGggPSAxOwogCWlmIChxZGVwdGggPiBtYXhfZGVwdGgpCkBAIC0xNDg4LDcgKzE1NzMsNyBAQAogCQkgICAgcl9sZXZlbCwgcmFpZF9kZXZpY2UtPmhhbmRsZSwKIAkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmFpZF9kZXZpY2UtPnd3aWQsCiAJCSAgICByYWlkX2RldmljZS0+bnVtX3BkcywgZHMpOwotCQlfc2NzaWhfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsIHFkZXB0aCk7CisJCV9zY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwgcWRlcHRoLCBTQ1NJX1FERVBUSF9ERUZBVUxUKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNTM0LDcgKzE2MTksNyBAQAogCQkJX3Njc2loX2Rpc3BsYXlfc2F0YV9jYXBhYmlsaXRpZXMoaW9jLCBzYXNfZGV2aWNlLCBzZGV2KTsKIAl9CiAKLQlfc2NzaWhfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsIHFkZXB0aCk7CisJX3Njc2loX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LCBxZGVwdGgsIFNDU0lfUURFUFRIX0RFRkFVTFQpOwogCiAJaWYgKHNzcF90YXJnZXQpCiAJCXNhc19yZWFkX3BvcnRfbW9kZV9wYWdlKHNkZXYpOwpAQCAtMTg3NCw2ICsxOTU5LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCisJbXB0MnNhc19oYWx0X2Zpcm13YXJlKGlvYyk7CisKIAltdXRleF9sb2NrKCZpb2MtPnRtX2NtZHMubXV0ZXgpOwogCWhhbmRsZSA9IHNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0LT5oYW5kbGU7CiAJbXB0MnNhc19zY3NpaF9pc3N1ZV90bShpb2MsIGhhbmRsZSwgc2FzX2RldmljZV9wcml2X2RhdGEtPmx1biwKQEAgLTIyOTcsNyArMjM4NCw2IEBACiAJdTE2IGhhbmRsZTsKIAl1MTYgcmVhc29uX2NvZGU7CiAJdTggcGh5X251bWJlcjsKLQl1OCBsaW5rX3JhdGU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZXZlbnRfZGF0YS0+TnVtRW50cmllczsgaSsrKSB7CiAJCWhhbmRsZSA9IGxlMTZfdG9fY3B1KGV2ZW50X2RhdGEtPlBIWVtpXS5BdHRhY2hlZERldkhhbmRsZSk7CkBAIC0yMzA4LDExICsyMzk0LDYgQEAKIAkJICAgIE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfTUFTSzsKIAkJaWYgKHJlYXNvbl9jb2RlID09IE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfREVMQVlfTk9UX1JFU1BPTkRJTkcpCiAJCQlfc2NzaWhfYmxvY2tfaW9fZGV2aWNlKGlvYywgaGFuZGxlKTsKLQkJaWYgKHJlYXNvbl9jb2RlID09IE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfUEhZX0NIQU5HRUQpIHsKLQkJCWxpbmtfcmF0ZSA9IGV2ZW50X2RhdGEtPlBIWVtpXS5MaW5rUmF0ZSA+PiA0OwotCQkJaWYgKGxpbmtfcmF0ZSA+PSBNUEkyX1NBU19ORUdfTElOS19SQVRFXzFfNSkKLQkJCQlfc2NzaWhfdWJsb2NrX2lvX2RldmljZShpb2MsIGhhbmRsZSk7Ci0JCX0KIAl9CiB9CiAKQEAgLTIzNDksMTYgKzI0MzAsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCXNhc19kZXZpY2UgPSBfc2NzaWhfc2FzX2RldmljZV9maW5kX2J5X2hhbmRsZShpb2MsIGhhbmRsZSk7Ci0JaWYgKCFzYXNfZGV2aWNlKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7Ci0JCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgZmluZGluZyBzYXNfZGV2aWNlXG4iLAotCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAogCS8qIHNraXAgaXMgaGlkZGVuIHJhaWQgY29tcG9uZW50ICovCi0JaWYgKHNhc19kZXZpY2UtPmhpZGRlbl9yYWlkX2NvbXBvbmVudCkKKwlpZiAoc2FzX2RldmljZSAmJiBzYXNfZGV2aWNlLT5oaWRkZW5fcmFpZF9jb21wb25lbnQpCiAJCXJldHVybjsKIAogCXNtaWQgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWRfaHByKGlvYywgaW9jLT50bV90cl9jYl9pZHgpOwpAQCAtMjM3MSwxOCArMjQ0NiwzMSBAQAogCQlkZWxheWVkX3RyLT5zdGF0ZSA9IE1QVDJTQVNfUkVRX1NBU19DTlRSTDsKIAkJbGlzdF9hZGRfdGFpbCgmZGVsYXllZF90ci0+bGlzdCwKIAkJICAgICZpb2MtPmRlbGF5ZWRfdHJfbGlzdCk7Ci0JCWlmIChzYXNfZGV2aWNlLT5zdGFyZ2V0KQorCQlpZiAoc2FzX2RldmljZSAmJiBzYXNfZGV2aWNlLT5zdGFyZ2V0KSB7CiAJCQlkZXd0cHJpbnRrKGlvYywgc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLAogCQkJICAgIHNhc19kZXZpY2UtPnN0YXJnZXQsICJERUxBWUVEOnRyOmhhbmRsZSgweCUwNHgpLCAiCi0JCQkgICAgIihvcGVuKVxuIiwgc2FzX2RldmljZS0+aGFuZGxlKSk7CisJCQkgICAgIihvcGVuKVxuIiwgaGFuZGxlKSk7CisJCX0gZWxzZSB7CisJCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJCSAgICAiREVMQVlFRDp0cjpoYW5kbGUoMHglMDR4KSwgKG9wZW4pXG4iLAorCQkJICAgIGlvYy0+bmFtZSwgaGFuZGxlKSk7CisJCX0KIAkJcmV0dXJuOwogCX0KIAotCWlmIChzYXNfZGV2aWNlLT5zdGFyZ2V0ICYmIHNhc19kZXZpY2UtPnN0YXJnZXQtPmhvc3RkYXRhKSB7Ci0JCXNhc190YXJnZXRfcHJpdl9kYXRhID0gc2FzX2RldmljZS0+c3RhcmdldC0+aG9zdGRhdGE7Ci0JCXNhc190YXJnZXRfcHJpdl9kYXRhLT50bV9idXN5ID0gMTsKLQkJZGV3dHByaW50ayhpb2MsIHN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc2FzX2RldmljZS0+c3RhcmdldCwKLQkJICAgICJ0cjpoYW5kbGUoMHglMDR4KSwgKG9wZW4pXG4iLCBzYXNfZGV2aWNlLT5oYW5kbGUpKTsKKwlpZiAoc2FzX2RldmljZSkgeworCQlzYXNfZGV2aWNlLT5zdGF0ZSB8PSBNUFRTQVNfU1RBVEVfVFJfU0VORDsKKwkJc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUMlNBU19SRVFfU0FTX0NOVFJMOworCQlpZiAoc2FzX2RldmljZS0+c3RhcmdldCAmJiBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YSkgeworCQkJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YTsKKwkJCXNhc190YXJnZXRfcHJpdl9kYXRhLT50bV9idXN5ID0gMTsKKwkJCWRld3RwcmludGsoaW9jLCBzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sCisJCQkgICAgc2FzX2RldmljZS0+c3RhcmdldCwgInRyOmhhbmRsZSgweCUwNHgpLCAob3BlbilcbiIsCisJCQkgICAgaGFuZGxlKSk7CisJCX0KKwl9IGVsc2UgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJICAgICJ0cjpoYW5kbGUoMHglMDR4KSwgKG9wZW4pXG4iLCBpb2MtPm5hbWUsIGhhbmRsZSkpOwogCX0KIAogCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKQEAgLTIzOTAsOCArMjQ3OCw2IEBACiAJbXBpX3JlcXVlc3QtPkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVDsKIAltcGlfcmVxdWVzdC0+RGV2SGFuZGxlID0gY3B1X3RvX2xlMTYoaGFuZGxlKTsKIAltcGlfcmVxdWVzdC0+VGFza1R5cGUgPSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9UQVJHRVRfUkVTRVQ7Ci0Jc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUU0FTX1NUQVRFX1RSX1NFTkQ7Ci0Jc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUMlNBU19SRVFfU0FTX0NOVFJMOwogCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9oaV9wcmlvcml0eShpb2MsIHNtaWQpOwogfQogCkBAIC0yNDI2LDIxICsyNTEyLDI1IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAlzYXNfZGV2aWNlID0gX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOwotCWlmICghc2FzX2RldmljZSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwotCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogZmFpbGVkIGZpbmRpbmcgc2FzX2RldmljZVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOwotCQlyZXR1cm4gMTsKLQl9Ci0Jc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUU0FTX1NUQVRFX0NOVFJMX0NPTVBMRVRFOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoc2FzX2RldmljZS0+c3RhcmdldCkKLQkJZGV3dHByaW50ayhpb2MsIHN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc2FzX2RldmljZS0+c3RhcmdldCwKKwlpZiAoc2FzX2RldmljZSkgeworCQlzYXNfZGV2aWNlLT5zdGF0ZSB8PSBNUFRTQVNfU1RBVEVfQ05UUkxfQ09NUExFVEU7CisJCWlmIChzYXNfZGV2aWNlLT5zdGFyZ2V0KQorCQkJZGV3dHByaW50ayhpb2MsIHN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywKKwkJCSAgICBzYXNfZGV2aWNlLT5zdGFyZ2V0LAorCQkJICAgICJzY19jb21wbGV0ZTpoYW5kbGUoMHglMDR4KSwgIgorCQkJICAgICJpb2Nfc3RhdHVzKDB4JTA0eCksIGxvZ2luZm8oMHglMDh4KVxuIiwKKwkJCSAgICBoYW5kbGUsIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+SU9DU3RhdHVzKSwKKwkJCSAgICBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pKSk7CisJfSBlbHNlIHsKKwkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCiAJCSAgICAic2NfY29tcGxldGU6aGFuZGxlKDB4JTA0eCksICIKIAkJICAgICJpb2Nfc3RhdHVzKDB4JTA0eCksIGxvZ2luZm8oMHglMDh4KVxuIiwKLQkJICAgIGhhbmRsZSwgbGUxNl90b19jcHUobXBpX3JlcGx5LT5JT0NTdGF0dXMpLAorCQkgICAgaW9jLT5uYW1lLCBoYW5kbGUsIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+SU9DU3RhdHVzKSwKIAkJICAgIGxlMzJfdG9fY3B1KG1waV9yZXBseS0+SU9DTG9nSW5mbykpKTsKKwl9CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjQ3OCwyOCArMjU2OCwzMyBAQAogCWhhbmRsZSA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS0+RGV2SGFuZGxlKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAlzYXNfZGV2aWNlID0gX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOwotCWlmICghc2FzX2RldmljZSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwotCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogZmFpbGVkIGZpbmRpbmcgc2FzX2RldmljZVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOwotCQlyZXR1cm4gMTsKLQl9Ci0Jc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUU0FTX1NUQVRFX1RSX0NPTVBMRVRFOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoc2FzX2RldmljZS0+c3RhcmdldCkKLQkJZGV3dHByaW50ayhpb2MsIHN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc2FzX2RldmljZS0+c3RhcmdldCwKLQkJICAgICJ0cl9jb21wbGV0ZTpoYW5kbGUoMHglMDR4KSwgKCVzKSBpb2Nfc3RhdHVzKDB4JTA0eCksICIKLQkJICAgICJsb2dpbmZvKDB4JTA4eCksIGNvbXBsZXRlZCglZClcbiIsCi0JCSAgICBzYXNfZGV2aWNlLT5oYW5kbGUsIChzYXNfZGV2aWNlLT5zdGF0ZSAmCi0JCSAgICBNUFQyU0FTX1JFUV9TQVNfQ05UUkwpID8gIm9wZW4iIDogImFjdGl2ZSIsCi0JCSAgICBsZTE2X3RvX2NwdShtcGlfcmVwbHktPklPQ1N0YXR1cyksCisJaWYgKHNhc19kZXZpY2UpIHsKKwkJc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUU0FTX1NUQVRFX1RSX0NPTVBMRVRFOworCQlpZiAoc2FzX2RldmljZS0+c3RhcmdldCkgeworCQkJZGV3dHByaW50ayhpb2MsIHN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywKKwkJCSAgICBzYXNfZGV2aWNlLT5zdGFyZ2V0LCAidHJfY29tcGxldGU6aGFuZGxlKDB4JTA0eCksICIKKwkJCSAgICAiKCVzKSBpb2Nfc3RhdHVzKDB4JTA0eCksIGxvZ2luZm8oMHglMDh4KSwgIgorCQkJICAgICJjb21wbGV0ZWQoJWQpXG4iLCBzYXNfZGV2aWNlLT5oYW5kbGUsCisJCQkgICAgKHNhc19kZXZpY2UtPnN0YXRlICYgTVBUMlNBU19SRVFfU0FTX0NOVFJMKSA/CisJCQkgICAgIm9wZW4iIDogImFjdGl2ZSIsCisJCQkgICAgbGUxNl90b19jcHUobXBpX3JlcGx5LT5JT0NTdGF0dXMpLAorCQkJICAgIGxlMzJfdG9fY3B1KG1waV9yZXBseS0+SU9DTG9nSW5mbyksCisJCQkgICAgbGUzMl90b19jcHUobXBpX3JlcGx5LT5UZXJtaW5hdGlvbkNvdW50KSkpOworCQkJaWYgKHNhc19kZXZpY2UtPnN0YXJnZXQtPmhvc3RkYXRhKSB7CisJCQkJc2FzX3RhcmdldF9wcml2X2RhdGEgPQorCQkJCSAgICBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YTsKKwkJCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+dG1fYnVzeSA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJICAgICJ0cl9jb21wbGV0ZTpoYW5kbGUoMHglMDR4KSwgKG9wZW4pIGlvY19zdGF0dXMoMHglMDR4KSwgIgorCQkgICAgImxvZ2luZm8oMHglMDh4KSwgY29tcGxldGVkKCVkKVxuIiwgaW9jLT5uYW1lLAorCQkgICAgaGFuZGxlLCBsZTE2X3RvX2NwdShtcGlfcmVwbHktPklPQ1N0YXR1cyksCiAJCSAgICBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pLAogCQkgICAgbGUzMl90b19jcHUobXBpX3JlcGx5LT5UZXJtaW5hdGlvbkNvdW50KSkpOwotCi0JaWYgKHNhc19kZXZpY2UtPnN0YXJnZXQgJiYgc2FzX2RldmljZS0+c3RhcmdldC0+aG9zdGRhdGEpIHsKLQkJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YTsKLQkJc2FzX3RhcmdldF9wcml2X2RhdGEtPnRtX2J1c3kgPSAwOwogCX0KIAogCWlmICghbGlzdF9lbXB0eSgmaW9jLT5kZWxheWVkX3RyX2xpc3QpKSB7CkBAIC0yNTE0LDggKzI2MDksNyBAQAogCX0gZWxzZQogCQlyYyA9IDE7CiAKLQotCWlmICghKHNhc19kZXZpY2UtPnN0YXRlICYgTVBUMlNBU19SRVFfU0FTX0NOVFJMKSkKKwlpZiAoc2FzX2RldmljZSAmJiAhKHNhc19kZXZpY2UtPnN0YXRlICYgTVBUMlNBU19SRVFfU0FTX0NOVFJMKSkKIAkJcmV0dXJuIHJjOwogCiAJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpIHsKQEAgLTI1MzEsMTIgKzI2MjUsMTQgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAorCWlmIChzYXNfZGV2aWNlKQorCQlzYXNfZGV2aWNlLT5zdGF0ZSB8PSBNUFRTQVNfU1RBVEVfQ05UUkxfU0VORDsKKwogCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkX3Nhc19jdHJsKTsKIAltZW1zZXQobXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkyU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdCkpOwogCW1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fU0FTX0lPX1VOSVRfQ09OVFJPTDsKIAltcGlfcmVxdWVzdC0+T3BlcmF0aW9uID0gTVBJMl9TQVNfT1BfUkVNT1ZFX0RFVklDRTsKIAltcGlfcmVxdWVzdC0+RGV2SGFuZGxlID0gbXBpX3JlcGx5LT5EZXZIYW5kbGU7Ci0Jc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUU0FTX1NUQVRFX0NOVFJMX1NFTkQ7CiAJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkX3Nhc19jdHJsKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0yNjc4LDggKzI3NzQsNiBAQAogCWVsc2UKIAkJcmV0dXJuOwogCi0JbXBpX3JlcXVlc3QtPkVFRFBCbG9ja1NpemUgPSBzY21kLT5kZXZpY2UtPnNlY3Rvcl9zaXplOwotCiAJc3dpdGNoIChwcm90X3R5cGUpIHsKIAljYXNlIFNDU0lfUFJPVF9ESUZfVFlQRTE6CiAKQEAgLTI2ODcsOCArMjc4MSw3IEBACiAJCSogZW5hYmxlIHJlZi9ndWFyZCBjaGVja2luZwogCQkqIGF1dG8gaW5jcmVtZW50IHJlZiB0YWcKIAkJKi8KLQkJbXBpX3JlcXVlc3QtPkVFRFBGbGFncyA9IGVlZHBfZmxhZ3MgfAotCQkgICAgTVBJMl9TQ1NJSU9fRUVEUEZMQUdTX0lOQ19QUklfUkVGVEFHIHwKKwkJZWVkcF9mbGFncyB8PSBNUEkyX1NDU0lJT19FRURQRkxBR1NfSU5DX1BSSV9SRUZUQUcgfAogCQkgICAgTVBJMl9TQ1NJSU9fRUVEUEZMQUdTX0NIRUNLX1JFRlRBRyB8CiAJCSAgICBNUEkyX1NDU0lJT19FRURQRkxBR1NfQ0hFQ0tfR1VBUkQ7CiAJCW1waV9yZXF1ZXN0LT5DREIuRUVEUDMyLlByaW1hcnlSZWZlcmVuY2VUYWcgPQpAQCAtMjcwMSwxMSArMjc5NCwxMSBAQAogCQkvKgogCQkqIGVuYWJsZSBndWFyZCBjaGVja2luZwogCQkqLwotCQltcGlfcmVxdWVzdC0+RUVEUEZsYWdzID0gZWVkcF9mbGFncyB8Ci0JCSAgICBNUEkyX1NDU0lJT19FRURQRkxBR1NfQ0hFQ0tfR1VBUkQ7Ci0KKwkJZWVkcF9mbGFncyB8PSBNUEkyX1NDU0lJT19FRURQRkxBR1NfQ0hFQ0tfR1VBUkQ7CiAJCWJyZWFrOwogCX0KKwltcGlfcmVxdWVzdC0+RUVEUEJsb2NrU2l6ZSA9IGNwdV90b19sZTMyKHNjbWQtPmRldmljZS0+c2VjdG9yX3NpemUpOworCW1waV9yZXF1ZXN0LT5FRURQRmxhZ3MgPSBjcHVfdG9fbGUxNihlZWRwX2ZsYWdzKTsKIH0KIAogLyoqCkBAIC0yNzg4LDcgKzI4ODEsNyBAQAogCX0KIAogCS8qIHNlZSBpZiB3ZSBhcmUgYnVzeSB3aXRoIHRhc2sgbWFuYWdtZW50IHN0dWZmICovCi0JaWYgKHNhc190YXJnZXRfcHJpdl9kYXRhLT50bV9idXN5KQorCWlmIChzYXNfZGV2aWNlX3ByaXZfZGF0YS0+YmxvY2sgfHwgc2FzX3RhcmdldF9wcml2X2RhdGEtPnRtX2J1c3kpCiAJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiAJZWxzZSBpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPmlvY19saW5rX3Jlc2V0X2luX3Byb2dyZXNzKQogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKQEAgLTI4NDIsNyArMjkzNSw3IEBACiAJbXBpX3JlcXVlc3QtPk1zZ0ZsYWdzID0gTVBJMl9TQ1NJSU9fTVNHRkxBR1NfU1lTVEVNX1NFTlNFX0FERFI7CiAJbXBpX3JlcXVlc3QtPlNlbnNlQnVmZmVyTGVuZ3RoID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOwogCW1waV9yZXF1ZXN0LT5TZW5zZUJ1ZmZlckxvd0FkZHJlc3MgPQotCSAgICAodTMyKW1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyX2RtYShpb2MsIHNtaWQpOworCSAgICBtcHQyc2FzX2Jhc2VfZ2V0X3NlbnNlX2J1ZmZlcl9kbWEoaW9jLCBzbWlkKTsKIAltcGlfcmVxdWVzdC0+U0dMT2Zmc2V0MCA9IG9mZnNldG9mKE1waTJTQ1NJSU9SZXF1ZXN0X3QsIFNHTCkgLyA0OwogCW1waV9yZXF1ZXN0LT5TR0xGbGFncyA9IGNwdV90b19sZTE2KE1QSTJfU0NTSUlPX1NHTEZMQUdTX1RZUEVfTVBJICsKIAkgICAgTVBJMl9TQ1NJSU9fU0dMRkxBR1NfU1lTVEVNX0FERFIpOwpAQCAtMjg5NCw3ICsyOTg3LDcgQEAKIAogI2lmZGVmIENPTkZJR19TQ1NJX01QVDJTQVNfTE9HR0lORwogLyoqCi0gKiBfc2NzaWhfc2NzaV9pb2NfaW5mbyAtIHRyYW5zbGF0ZWQgbm9uLXN1Y2Nlc2Z1bGwgU0NTSV9JTyByZXF1ZXN0CisgKiBfc2NzaWhfc2NzaV9pb2NfaW5mbyAtIHRyYW5zbGF0ZWQgbm9uLXN1Y2Nlc3NmdWxsIFNDU0lfSU8gcmVxdWVzdAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAc2NtZDogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CiAgKiBAbXBpX3JlcGx5OiByZXBseSBtZiBwYXlsb2FkIHJldHVybmVkIGZyb20gZmlybXdhcmUKQEAgLTMwNTksNyArMzE1Miw3IEBACiAJaWYgKHNjc2lfc3RhdGUgJiBNUEkyX1NDU0lfU1RBVEVfUkVTUE9OU0VfSU5GT19WQUxJRCkgewogCQlyZXNwb25zZV9pbmZvID0gbGUzMl90b19jcHUobXBpX3JlcGx5LT5SZXNwb25zZUluZm8pOwogCQlyZXNwb25zZV9ieXRlcyA9ICh1OCAqKSZyZXNwb25zZV9pbmZvOwotCQlfc2NzaWhfcmVzcG9uc2VfY29kZShpb2MsIHJlc3BvbnNlX2J5dGVzWzNdKTsKKwkJX3Njc2loX3Jlc3BvbnNlX2NvZGUoaW9jLCByZXNwb25zZV9ieXRlc1swXSk7CiAJfQogfQogI2VuZGlmCkBAIC0zMTc3LDcgKzMyNzAsNyBAQAogCXU4IHNjc2lfc3RhdHVzOwogCXUzMiBsb2dfaW5mbzsKIAlzdHJ1Y3QgTVBUMlNBU19ERVZJQ0UgKnNhc19kZXZpY2VfcHJpdl9kYXRhOwotCXUzMiByZXNwb25zZV9jb2RlOworCXUzMiByZXNwb25zZV9jb2RlID0gMDsKIAogCW1waV9yZXBseSA9IG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwogCXNjbWQgPSBfc2NzaWhfc2NzaV9sb29rdXBfZ2V0KGlvYywgc21pZCk7CkBAIC0zMTk5LDE2ICszMjkyLDE2IEBACiAJfQogCiAJLyogdHVybmluZyBvZmYgVExSICovCisJc2NzaV9zdGF0ZSA9IG1waV9yZXBseS0+U0NTSVN0YXRlOworCWlmIChzY3NpX3N0YXRlICYgTVBJMl9TQ1NJX1NUQVRFX1JFU1BPTlNFX0lORk9fVkFMSUQpCisJCXJlc3BvbnNlX2NvZGUgPQorCQkgICAgbGUzMl90b19jcHUobXBpX3JlcGx5LT5SZXNwb25zZUluZm8pICYgMHhGRjsKIAlpZiAoIXNhc19kZXZpY2VfcHJpdl9kYXRhLT50bHJfc25vb3BfY2hlY2spIHsKIAkJc2FzX2RldmljZV9wcml2X2RhdGEtPnRscl9zbm9vcF9jaGVjaysrOwotCQlpZiAoc2FzX2RldmljZV9wcml2X2RhdGEtPmZsYWdzICYgTVBUX0RFVklDRV9UTFJfT04pIHsKLQkJCXJlc3BvbnNlX2NvZGUgPSAobGUzMl90b19jcHUobXBpX3JlcGx5LT5SZXNwb25zZUluZm8pCi0JCQkgICAgPj4gMjQpOwotCQkJaWYgKHJlc3BvbnNlX2NvZGUgPT0KLQkJCSAgICBNUEkyX1NDU0lUQVNLTUdNVF9SU1BfSU5WQUxJRF9GUkFNRSkKLQkJCQlzYXNfZGV2aWNlX3ByaXZfZGF0YS0+ZmxhZ3MgJj0KLQkJCQkgICAgfk1QVF9ERVZJQ0VfVExSX09OOwotCQl9CisJCWlmICgoc2FzX2RldmljZV9wcml2X2RhdGEtPmZsYWdzICYgTVBUX0RFVklDRV9UTFJfT04pICYmCisJCSAgICByZXNwb25zZV9jb2RlID09IE1QSTJfU0NTSVRBU0tNR01UX1JTUF9JTlZBTElEX0ZSQU1FKQorCQkJc2FzX2RldmljZV9wcml2X2RhdGEtPmZsYWdzICY9CisJCQkgICAgfk1QVF9ERVZJQ0VfVExSX09OOwogCX0KIAogCXhmZXJfY250ID0gbGUzMl90b19jcHUobXBpX3JlcGx5LT5UcmFuc2ZlckNvdW50KTsKQEAgLTMyMTksNyArMzMxMiw2IEBACiAJZWxzZQogCQlsb2dfaW5mbyA9IDA7CiAJaW9jX3N0YXR1cyAmPSBNUEkyX0lPQ1NUQVRVU19NQVNLOwotCXNjc2lfc3RhdGUgPSBtcGlfcmVwbHktPlNDU0lTdGF0ZTsKIAlzY3NpX3N0YXR1cyA9IG1waV9yZXBseS0+U0NTSVN0YXR1czsKIAogCWlmIChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX1NDU0lfREFUQV9VTkRFUlJVTiAmJiB4ZmVyX2NudCA9PSAwICYmCkBAIC0zMjU1LDEwICszMzQ3LDkgQEAKIAogCWNhc2UgTVBJMl9JT0NTVEFUVVNfU0NTSV9JT0NfVEVSTUlOQVRFRDoKIAkJaWYgKHNhc19kZXZpY2VfcHJpdl9kYXRhLT5ibG9jaykgewotCQkJc2NtZC0+cmVzdWx0ID0gKERJRF9CVVNfQlVTWSA8PCAxNik7Ci0JCQlicmVhazsKKwkJCXNjbWQtPnJlc3VsdCA9IERJRF9UUkFOU1BPUlRfRElTUlVQVEVEIDw8IDE2OworCQkJZ290byBvdXQ7CiAJCX0KLQogCWNhc2UgTVBJMl9JT0NTVEFUVVNfU0NTSV9UQVNLX1RFUk1JTkFURUQ6CiAJY2FzZSBNUEkyX0lPQ1NUQVRVU19TQ1NJX0VYVF9URVJNSU5BVEVEOgogCQlzY21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CkBAIC0zMzA0LDggKzMzOTUsMTAgQEAKIAljYXNlIE1QSTJfSU9DU1RBVFVTX1NDU0lfUkVDT1ZFUkVEX0VSUk9SOgogCWNhc2UgTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUzoKIAkJc2NtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzY3NpX3N0YXR1czsKLQkJaWYgKHNjc2lfc3RhdGUgJiAoTVBJMl9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9GQUlMRUQgfAotCQkgICAgIE1QSTJfU0NTSV9TVEFURV9OT19TQ1NJX1NUQVRVUykpCisJCWlmIChyZXNwb25zZV9jb2RlID09CisJCSAgICBNUEkyX1NDU0lUQVNLTUdNVF9SU1BfSU5WQUxJRF9GUkFNRSB8fAorCQkgICAgKHNjc2lfc3RhdGUgJiAoTVBJMl9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9GQUlMRUQgfAorCQkgICAgIE1QSTJfU0NTSV9TVEFURV9OT19TQ1NJX1NUQVRVUykpKQogCQkJc2NtZC0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CiAJCWVsc2UgaWYgKHNjc2lfc3RhdGUgJiBNUEkyX1NDU0lfU1RBVEVfVEVSTUlOQVRFRCkKIAkJCXNjbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKQEAgLTMzNDQsNyArMzQzNyw2IEBACiAvKioKICAqIF9zY3NpaF9zYXNfaG9zdF9yZWZyZXNoIC0gcmVmcmVzaGluZyBzYXMgaG9zdCBvYmplY3QgY29udGVudHMKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQHVwZGF0ZTogdXBkYXRlIGxpbmsgaW5mb3JtYXRpb24KICAqIENvbnRleHQ6IHVzZXIKICAqCiAgKiBEdXJpbmcgcG9ydCBlbmFibGUsIGZ3IHdpbGwgc2VuZCB0b3BvbG9neSBldmVudHMgZm9yIGV2ZXJ5IGRldmljZS4gSXRzCkBAIC0zMzU0LDEzICszNDQ2LDE0IEBACiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwogc3RhdGljIHZvaWQKLV9zY3NpaF9zYXNfaG9zdF9yZWZyZXNoKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggdXBkYXRlKQorX3Njc2loX3Nhc19ob3N0X3JlZnJlc2goc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQogewogCXUxNiBzejsKIAl1MTYgaW9jX3N0YXR1czsKIAlpbnQgaTsKIAlNcGkyQ29uZmlnUmVwbHlfdCBtcGlfcmVwbHk7CiAJTXBpMlNhc0lPVW5pdFBhZ2UwX3QgKnNhc19pb3VuaXRfcGcwID0gTlVMTDsKKwl1MTYgYXR0YWNoZWRfaGFuZGxlOwogCiAJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkgICAgInVwZGF0aW5nIGhhbmRsZXMgZm9yIHNhc19ob3N0KDB4JTAxNmxseClcbiIsCkBAIC0zMzc0LDI3ICszNDY3LDI0IEBACiAJCSAgICBpb2MtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQotCWlmICghKG1wdDJzYXNfY29uZmlnX2dldF9zYXNfaW91bml0X3BnMChpb2MsICZtcGlfcmVwbHksCi0JICAgIHNhc19pb3VuaXRfcGcwLCBzeikpKSB7Ci0JCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSAmCi0JCSAgICBNUEkyX0lPQ1NUQVRVU19NQVNLOwotCQlpZiAoaW9jX3N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKQotCQkJZ290byBvdXQ7Ci0JCWZvciAoaSA9IDA7IGkgPCBpb2MtPnNhc19oYmEubnVtX3BoeXMgOyBpKyspIHsKLQkJCWlvYy0+c2FzX2hiYS5waHlbaV0uaGFuZGxlID0KLQkJCSAgICBsZTE2X3RvX2NwdShzYXNfaW91bml0X3BnMC0+UGh5RGF0YVtpXS4KLQkJCQlDb250cm9sbGVyRGV2SGFuZGxlKTsKLQkJCWlmICh1cGRhdGUpCi0JCQkJbXB0MnNhc190cmFuc3BvcnRfdXBkYXRlX2xpbmtzKAotCQkJCSAgICBpb2MsCi0JCQkJICAgIGlvYy0+c2FzX2hiYS5waHlbaV0uaGFuZGxlLAotCQkJCSAgICBsZTE2X3RvX2NwdShzYXNfaW91bml0X3BnMC0+UGh5RGF0YVtpXS4KLQkJCQkgICAgQXR0YWNoZWREZXZIYW5kbGUpLCBpLAotCQkJCSAgICBzYXNfaW91bml0X3BnMC0+UGh5RGF0YVtpXS4KLQkJCQkgICAgTmVnb3RpYXRlZExpbmtSYXRlID4+IDQpOwotCQl9Ci0JfQogCisJaWYgKChtcHQyc2FzX2NvbmZpZ19nZXRfc2FzX2lvdW5pdF9wZzAoaW9jLCAmbXBpX3JlcGx5LAorCSAgICBzYXNfaW91bml0X3BnMCwgc3opKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJiBNUEkyX0lPQ1NUQVRVU19NQVNLOworCWlmIChpb2Nfc3RhdHVzICE9IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gb3V0OworCWZvciAoaSA9IDA7IGkgPCBpb2MtPnNhc19oYmEubnVtX3BoeXMgOyBpKyspIHsKKwkJaWYgKGkgPT0gMCkKKwkJCWlvYy0+c2FzX2hiYS5oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfaW91bml0X3BnMC0+CisJCQkgICAgUGh5RGF0YVswXS5Db250cm9sbGVyRGV2SGFuZGxlKTsKKwkJaW9jLT5zYXNfaGJhLnBoeVtpXS5oYW5kbGUgPSBpb2MtPnNhc19oYmEuaGFuZGxlOworCQlhdHRhY2hlZF9oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfaW91bml0X3BnMC0+UGh5RGF0YVtpXS4KKwkJICAgIEF0dGFjaGVkRGV2SGFuZGxlKTsKKwkJbXB0MnNhc190cmFuc3BvcnRfdXBkYXRlX2xpbmtzKGlvYywgaW9jLT5zYXNfaGJhLnNhc19hZGRyZXNzLAorCQkgICAgYXR0YWNoZWRfaGFuZGxlLCBpLCBzYXNfaW91bml0X3BnMC0+UGh5RGF0YVtpXS4KKwkJICAgIE5lZ290aWF0ZWRMaW5rUmF0ZSA+PiA0KTsKKwl9CiAgb3V0OgogCWtmcmVlKHNhc19pb3VuaXRfcGcwKTsKIH0KQEAgLTM1MDcsMTkgKzM1OTcsMjEgQEAKIAkJCSAgICBpb2MtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJaW9jLT5zYXNfaGJhLnBoeVtpXS5oYW5kbGUgPQotCQkgICAgbGUxNl90b19jcHUoc2FzX2lvdW5pdF9wZzAtPlBoeURhdGFbaV0uQ29udHJvbGxlckRldkhhbmRsZSk7CisKKwkJaWYgKGkgPT0gMCkKKwkJCWlvYy0+c2FzX2hiYS5oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfaW91bml0X3BnMC0+CisJCQkgICAgUGh5RGF0YVswXS5Db250cm9sbGVyRGV2SGFuZGxlKTsKKwkJaW9jLT5zYXNfaGJhLnBoeVtpXS5oYW5kbGUgPSBpb2MtPnNhc19oYmEuaGFuZGxlOwogCQlpb2MtPnNhc19oYmEucGh5W2ldLnBoeV9pZCA9IGk7CiAJCW1wdDJzYXNfdHJhbnNwb3J0X2FkZF9ob3N0X3BoeShpb2MsICZpb2MtPnNhc19oYmEucGh5W2ldLAogCQkgICAgcGh5X3BnMCwgaW9jLT5zYXNfaGJhLnBhcmVudF9kZXYpOwogCX0KIAlpZiAoKG1wdDJzYXNfY29uZmlnX2dldF9zYXNfZGV2aWNlX3BnMChpb2MsICZtcGlfcmVwbHksICZzYXNfZGV2aWNlX3BnMCwKLQkgICAgTVBJMl9TQVNfREVWSUNFX1BHQURfRk9STV9IQU5ETEUsIGlvYy0+c2FzX2hiYS5waHlbMF0uaGFuZGxlKSkpIHsKKwkgICAgTVBJMl9TQVNfREVWSUNFX1BHQURfRk9STV9IQU5ETEUsIGlvYy0+c2FzX2hiYS5oYW5kbGUpKSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CiAJfQotCWlvYy0+c2FzX2hiYS5oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5EZXZIYW5kbGUpOwogCWlvYy0+c2FzX2hiYS5lbmNsb3N1cmVfaGFuZGxlID0KIAkgICAgbGUxNl90b19jcHUoc2FzX2RldmljZV9wZzAuRW5jbG9zdXJlSGFuZGxlKTsKIAlpb2MtPnNhc19oYmEuc2FzX2FkZHJlc3MgPSBsZTY0X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5TQVNBZGRyZXNzKTsKQEAgLTM1NjIsNyArMzY1NCw3IEBACiAJTXBpMlNhc0VuY2xvc3VyZVBhZ2UwX3QgZW5jbG9zdXJlX3BnMDsKIAl1MzIgaW9jX3N0YXR1czsKIAl1MTYgcGFyZW50X2hhbmRsZTsKLQlfX2xlNjQgc2FzX2FkZHJlc3M7CisJX19sZTY0IHNhc19hZGRyZXNzLCBzYXNfYWRkcmVzc19wYXJlbnQgPSAwOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IF9zYXNfcG9ydCAqbXB0MnNhc19wb3J0ID0gTlVMTDsKQEAgLTM1OTEsMTAgKzM2ODMsMTYgQEAKIAogCS8qIGhhbmRsZSBvdXQgb2Ygb3JkZXIgdG9wb2xvZ3kgZXZlbnRzICovCiAJcGFyZW50X2hhbmRsZSA9IGxlMTZfdG9fY3B1KGV4cGFuZGVyX3BnMC5QYXJlbnREZXZIYW5kbGUpOwotCWlmIChwYXJlbnRfaGFuZGxlID49IGlvYy0+c2FzX2hiYS5udW1fcGh5cykgeworCWlmIChfc2NzaWhfZ2V0X3Nhc19hZGRyZXNzKGlvYywgcGFyZW50X2hhbmRsZSwgJnNhc19hZGRyZXNzX3BhcmVudCkKKwkgICAgIT0gMCkgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc2FzX2FkZHJlc3NfcGFyZW50ICE9IGlvYy0+c2FzX2hiYS5zYXNfYWRkcmVzcykgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7Ci0JCXNhc19leHBhbmRlciA9IG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9oYW5kbGUoaW9jLAotCQkgICAgcGFyZW50X2hhbmRsZSk7CisJCXNhc19leHBhbmRlciA9IG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJCSAgICBzYXNfYWRkcmVzc19wYXJlbnQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKIAkJaWYgKCFzYXNfZXhwYW5kZXIpIHsKIAkJCXJjID0gX3Njc2loX2V4cGFuZGVyX2FkZChpb2MsIHBhcmVudF9oYW5kbGUpOwpAQCAtMzYyMiwxNCArMzcyMCwxMiBAQAogCiAJc2FzX2V4cGFuZGVyLT5oYW5kbGUgPSBoYW5kbGU7CiAJc2FzX2V4cGFuZGVyLT5udW1fcGh5cyA9IGV4cGFuZGVyX3BnMC5OdW1QaHlzOwotCXNhc19leHBhbmRlci0+cGFyZW50X2hhbmRsZSA9IHBhcmVudF9oYW5kbGU7Ci0Jc2FzX2V4cGFuZGVyLT5lbmNsb3N1cmVfaGFuZGxlID0KLQkgICAgbGUxNl90b19jcHUoZXhwYW5kZXJfcGcwLkVuY2xvc3VyZUhhbmRsZSk7CisJc2FzX2V4cGFuZGVyLT5zYXNfYWRkcmVzc19wYXJlbnQgPSBzYXNfYWRkcmVzc19wYXJlbnQ7CiAJc2FzX2V4cGFuZGVyLT5zYXNfYWRkcmVzcyA9IHNhc19hZGRyZXNzOwogCiAJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImV4cGFuZGVyX2FkZDogaGFuZGxlKDB4JTA0eCksIgogCSAgICAiIHBhcmVudCgweCUwNHgpLCBzYXNfYWRkcigweCUwMTZsbHgpLCBwaHlzKCVkKVxuIiwgaW9jLT5uYW1lLAotCSAgICBoYW5kbGUsIHNhc19leHBhbmRlci0+cGFyZW50X2hhbmRsZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkgICAgaGFuZGxlLCBwYXJlbnRfaGFuZGxlLCAodW5zaWduZWQgbG9uZyBsb25nKQogCSAgICBzYXNfZXhwYW5kZXItPnNhc19hZGRyZXNzLCBzYXNfZXhwYW5kZXItPm51bV9waHlzKTsKIAogCWlmICghc2FzX2V4cGFuZGVyLT5udW1fcGh5cykKQEAgLTM2NDUsNyArMzc0MSw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmc2FzX2V4cGFuZGVyLT5zYXNfcG9ydF9saXN0KTsKIAltcHQyc2FzX3BvcnQgPSBtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIGhhbmRsZSwKLQkgICAgc2FzX2V4cGFuZGVyLT5wYXJlbnRfaGFuZGxlKTsKKwkgICAgc2FzX2FkZHJlc3NfcGFyZW50KTsKIAlpZiAoIW1wdDJzYXNfcG9ydCkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKQEAgLTM2OTEsMjAgKzM3ODcsNTQgQEAKIAogCWlmIChtcHQyc2FzX3BvcnQpCiAJCW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKGlvYywgc2FzX2V4cGFuZGVyLT5zYXNfYWRkcmVzcywKLQkJICAgIHNhc19leHBhbmRlci0+cGFyZW50X2hhbmRsZSk7CisJCSAgICBzYXNfYWRkcmVzc19wYXJlbnQpOwogCWtmcmVlKHNhc19leHBhbmRlcik7CiAJcmV0dXJuIHJjOwogfQogCiAvKioKKyAqIF9zY3NpaF9kb25lIC0gIHNjc2loIGNhbGxiYWNrIGhhbmRsZXIuCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4CisgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKKyAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQorICoKKyAqIENhbGxiYWNrIGhhbmRsZXIgd2hlbiBzZW5kaW5nIGludGVybmFsIGdlbmVyYXRlZCBtZXNzYWdlIGZyYW1lcy4KKyAqIFRoZSBjYWxsYmFjayBpbmRleCBwYXNzZWQgaXMgYGlvYy0+c2NzaWhfY2JfaWR4YAorICoKKyAqIFJldHVybiAxIG1lYW5pbmcgbWYgc2hvdWxkIGJlIGZyZWVkIGZyb20gX2Jhc2VfaW50ZXJydXB0CisgKiAgICAgICAgMCBtZWFucyB0aGUgbWYgaXMgZnJlZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdTgKK19zY3NpaF9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IG1zaXhfaW5kZXgsIHUzMiByZXBseSkKK3sKKwlNUEkyRGVmYXVsdFJlcGx5X3QgKm1waV9yZXBseTsKKworCW1waV9yZXBseSA9ICBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKKwlpZiAoaW9jLT5zY3NpaF9jbWRzLnN0YXR1cyA9PSBNUFQyX0NNRF9OT1RfVVNFRCkKKwkJcmV0dXJuIDE7CisJaWYgKGlvYy0+c2NzaWhfY21kcy5zbWlkICE9IHNtaWQpCisJCXJldHVybiAxOworCWlvYy0+c2NzaWhfY21kcy5zdGF0dXMgfD0gTVBUMl9DTURfQ09NUExFVEU7CisJaWYgKG1waV9yZXBseSkgeworCQltZW1jcHkoaW9jLT5zY3NpaF9jbWRzLnJlcGx5LCBtcGlfcmVwbHksCisJCSAgICBtcGlfcmVwbHktPk1zZ0xlbmd0aCo0KTsKKwkJaW9jLT5zY3NpaF9jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9SRVBMWV9WQUxJRDsKKwl9CisJaW9jLT5zY3NpaF9jbWRzLnN0YXR1cyAmPSB+TVBUMl9DTURfUEVORElORzsKKwljb21wbGV0ZSgmaW9jLT5zY3NpaF9jbWRzLmRvbmUpOworCXJldHVybiAxOworfQorCisvKioKICAqIF9zY3NpaF9leHBhbmRlcl9yZW1vdmUgLSByZW1vdmluZyBleHBhbmRlciBvYmplY3QKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQGhhbmRsZTogZXhwYW5kZXIgaGFuZGxlCisgKiBAc2FzX2FkZHJlc3M6IGV4cGFuZGVyIHNhc19hZGRyZXNzCiAgKgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCi1fc2NzaWhfZXhwYW5kZXJfcmVtb3ZlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSkKK19zY3NpaF9leHBhbmRlcl9yZW1vdmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1NjQgc2FzX2FkZHJlc3MpCiB7CiAJc3RydWN0IF9zYXNfbm9kZSAqc2FzX2V4cGFuZGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zNzEzLDcgKzM4NDMsOCBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7Ci0Jc2FzX2V4cGFuZGVyID0gbXB0MnNhc19zY3NpaF9leHBhbmRlcl9maW5kX2J5X2hhbmRsZShpb2MsIGhhbmRsZSk7CisJc2FzX2V4cGFuZGVyID0gbXB0MnNhc19zY3NpaF9leHBhbmRlcl9maW5kX2J5X3Nhc19hZGRyZXNzKGlvYywKKwkgICAgc2FzX2FkZHJlc3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOwogCV9zY3NpaF9leHBhbmRlcl9ub2RlX3JlbW92ZShpb2MsIHNhc19leHBhbmRlcik7CiB9CkBAIC0zODA1LDggKzM5MzYsMTEgQEAKIAl9CiAKIAlzYXNfZGV2aWNlLT5oYW5kbGUgPSBoYW5kbGU7Ci0Jc2FzX2RldmljZS0+cGFyZW50X2hhbmRsZSA9Ci0JICAgIGxlMTZfdG9fY3B1KHNhc19kZXZpY2VfcGcwLlBhcmVudERldkhhbmRsZSk7CisJaWYgKF9zY3NpaF9nZXRfc2FzX2FkZHJlc3MoaW9jLCBsZTE2X3RvX2NwdQorCQkoc2FzX2RldmljZV9wZzAuUGFyZW50RGV2SGFuZGxlKSwKKwkJJnNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCkgIT0gMCkKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAJc2FzX2RldmljZS0+ZW5jbG9zdXJlX2hhbmRsZSA9CiAJICAgIGxlMTZfdG9fY3B1KHNhc19kZXZpY2VfcGcwLkVuY2xvc3VyZUhhbmRsZSk7CiAJc2FzX2RldmljZS0+c2xvdCA9CkBAIC0zODM2LDQzICszOTcwLDM5IEBACiAvKioKICAqIF9zY3NpaF9yZW1vdmVfZGV2aWNlIC0gIHJlbW92aW5nIHNhcyBkZXZpY2Ugb2JqZWN0CiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBoYW5kbGU6IHNhcyBkZXZpY2UgaGFuZGxlCisgKiBAc2FzX2RldmljZTogdGhlIHNhc19kZXZpY2Ugb2JqZWN0CiAgKgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCi1fc2NzaWhfcmVtb3ZlX2RldmljZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpCitfc2NzaWhfcmVtb3ZlX2RldmljZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHN0cnVjdCBfc2FzX2RldmljZQorICAgICpzYXNfZGV2aWNlKQogewogCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGE7Ci0Jc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJTXBpMlNhc0lvVW5pdENvbnRyb2xSZXBseV90IG1waV9yZXBseTsKIAlNcGkyU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdCBtcGlfcmVxdWVzdDsKLQl1MTYgZGV2aWNlX2hhbmRsZTsKKwl1MTYgZGV2aWNlX2hhbmRsZSwgaGFuZGxlOwogCi0JLyogbG9va3VwIHNhc19kZXZpY2UgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKLQlzYXNfZGV2aWNlID0gX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOwotCWlmICghc2FzX2RldmljZSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCWlmICghc2FzX2RldmljZSkKIAkJcmV0dXJuOwotCX0KIAotCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGVudGVyOiBoYW5kbGUiCi0JICAgICIoMHglMDR4KVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywgaGFuZGxlKSk7CisJaGFuZGxlID0gc2FzX2RldmljZS0+aGFuZGxlOworCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGVudGVyOiBoYW5kbGUoMHglMDR4KSwiCisJICAgICIgc2FzX2FkZHIoMHglMDE2bGx4KVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywgaGFuZGxlLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzcykpOwogCiAJaWYgKHNhc19kZXZpY2UtPnN0YXJnZXQgJiYgc2FzX2RldmljZS0+c3RhcmdldC0+aG9zdGRhdGEpIHsKIAkJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YTsKIAkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmRlbGV0ZWQgPSAxOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGlvYy0+cmVtb3ZlX2hvc3QpCisJaWYgKGlvYy0+cmVtb3ZlX2hvc3QgfHwgaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCAhaGFuZGxlKQogCQlnb3RvIG91dDsKIAogCWlmICgoc2FzX2RldmljZS0+c3RhdGUgJiBNUFRTQVNfU1RBVEVfVFJfQ09NUExFVEUpKSB7CiAJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiXHRza2lwICIKLQkJICAgInRhcmdldF9yZXNldCBoYW5kbGUoMHglMDR4KVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUpKTsKKwkJICAgInRhcmdldF9yZXNldCBoYW5kbGUoMHglMDR4KVxuIiwgaW9jLT5uYW1lLAorCQkgICBoYW5kbGUpKTsKIAkJZ290byBza2lwX3RyOwogCX0KIApAQCAtMzkyNSwxMCArNDA1NSwxMCBAQAogCV9zY3NpaF91YmxvY2tfaW9fZGV2aWNlKGlvYywgaGFuZGxlKTsKIAogCW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKGlvYywgc2FzX2RldmljZS0+c2FzX2FkZHJlc3MsCi0JICAgIHNhc19kZXZpY2UtPnBhcmVudF9oYW5kbGUpOworCSAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpOwogCiAJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInJlbW92aW5nIGhhbmRsZSgweCUwNHgpLCBzYXNfYWRkciIKLQkgICAgIigweCUwMTZsbHgpXG4iLCBpb2MtPm5hbWUsIHNhc19kZXZpY2UtPmhhbmRsZSwKKwkgICAgIigweCUwMTZsbHgpXG4iLCBpb2MtPm5hbWUsIGhhbmRsZSwKIAkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2FzX2RldmljZS0+c2FzX2FkZHJlc3MpOwogCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOwogCkBAIC0zOTUyLDcgKzQwODIsNyBAQAogCXUxNiByZWFzb25fY29kZTsKIAl1OCBwaHlfbnVtYmVyOwogCWNoYXIgKnN0YXR1c19zdHIgPSBOVUxMOwotCWNoYXIgbGlua19yYXRlWzI1XTsKKwl1OCBsaW5rX3JhdGUsIHByZXZfbGlua19yYXRlOwogCiAJc3dpdGNoIChldmVudF9kYXRhLT5FeHBTdGF0dXMpIHsKIAljYXNlIE1QSTJfRVZFTlRfU0FTX1RPUE9fRVNfQURERUQ6CkBAIC0zOTYyLDYgKzQwOTIsNyBAQAogCQlzdGF0dXNfc3RyID0gInJlbW92ZSI7CiAJCWJyZWFrOwogCWNhc2UgTVBJMl9FVkVOVF9TQVNfVE9QT19FU19SRVNQT05ESU5HOgorCWNhc2UgMDoKIAkJc3RhdHVzX3N0ciA9ICAicmVzcG9uZGluZyI7CiAJCWJyZWFrOwogCWNhc2UgTVBJMl9FVkVOVF9TQVNfVE9QT19FU19ERUxBWV9OT1RfUkVTUE9ORElORzoKQEAgLTM5ODcsMzAgKzQxMTgsMzAgQEAKIAkJICAgIE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfTUFTSzsKIAkJc3dpdGNoIChyZWFzb25fY29kZSkgewogCQljYXNlIE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfVEFSR19BRERFRDoKLQkJCXNucHJpbnRmKGxpbmtfcmF0ZSwgMjUsICI6IGFkZCwgbGluaygweCUwMngpIiwKLQkJCSAgICAoZXZlbnRfZGF0YS0+UEhZW2ldLkxpbmtSYXRlID4+IDQpKTsKLQkJCXN0YXR1c19zdHIgPSBsaW5rX3JhdGU7CisJCQlzdGF0dXNfc3RyID0gInRhcmdldCBhZGQiOwogCQkJYnJlYWs7CiAJCWNhc2UgTVBJMl9FVkVOVF9TQVNfVE9QT19SQ19UQVJHX05PVF9SRVNQT05ESU5HOgotCQkJc3RhdHVzX3N0ciA9ICI6IHJlbW92ZSI7CisJCQlzdGF0dXNfc3RyID0gInRhcmdldCByZW1vdmUiOwogCQkJYnJlYWs7CiAJCWNhc2UgTVBJMl9FVkVOVF9TQVNfVE9QT19SQ19ERUxBWV9OT1RfUkVTUE9ORElORzoKLQkJCXN0YXR1c19zdHIgPSAiOiByZW1vdmVfZGVsYXkiOworCQkJc3RhdHVzX3N0ciA9ICJkZWxheSB0YXJnZXQgcmVtb3ZlIjsKIAkJCWJyZWFrOwogCQljYXNlIE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfUEhZX0NIQU5HRUQ6Ci0JCQlzbnByaW50ZihsaW5rX3JhdGUsIDI1LCAiOiBsaW5rKDB4JTAyeCkiLAotCQkJICAgIChldmVudF9kYXRhLT5QSFlbaV0uTGlua1JhdGUgPj4gNCkpOwotCQkJc3RhdHVzX3N0ciA9IGxpbmtfcmF0ZTsKKwkJCXN0YXR1c19zdHIgPSAibGluayByYXRlIGNoYW5nZSI7CiAJCQlicmVhazsKIAkJY2FzZSBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX05PX0NIQU5HRToKLQkJCXN0YXR1c19zdHIgPSAiOiByZXNwb25kaW5nIjsKKwkJCXN0YXR1c19zdHIgPSAidGFyZ2V0IHJlc3BvbmRpbmciOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlzdGF0dXNfc3RyID0gIjogdW5rbm93biI7CisJCQlzdGF0dXNfc3RyID0gInVua25vd24iOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJpbnRrKEtFUk5fREVCVUcgIlx0cGh5KCUwMmQpLCBhdHRhY2hlZF9oYW5kbGUoMHglMDR4KSVzXG4iLAotCQkgICAgcGh5X251bWJlciwgaGFuZGxlLCBzdGF0dXNfc3RyKTsKKwkJbGlua19yYXRlID0gZXZlbnRfZGF0YS0+UEhZW2ldLkxpbmtSYXRlID4+IDQ7CisJCXByZXZfbGlua19yYXRlID0gZXZlbnRfZGF0YS0+UEhZW2ldLkxpbmtSYXRlICYgMHhGOworCQlwcmludGsoS0VSTl9ERUJVRyAiXHRwaHkoJTAyZCksIGF0dGFjaGVkX2hhbmRsZSgweCUwNHgpOiAlczoiCisJCSAgICAiIGxpbmsgcmF0ZTogbmV3KDB4JTAyeCksIG9sZCgweCUwMngpXG4iLCBwaHlfbnVtYmVyLAorCQkgICAgaGFuZGxlLCBzdGF0dXNfc3RyLCBsaW5rX3JhdGUsIHByZXZfbGlua19yYXRlKTsKKwogCX0KIH0KICNlbmRpZgpAQCAtNDAzMSw4ICs0MTYyLDEwIEBACiAJdTE2IHJlYXNvbl9jb2RlOwogCXU4IHBoeV9udW1iZXI7CiAJc3RydWN0IF9zYXNfbm9kZSAqc2FzX2V4cGFuZGVyOworCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZTsKKwl1NjQgc2FzX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBsaW5rX3JhdGVfOworCXU4IGxpbmtfcmF0ZSwgcHJldl9saW5rX3JhdGU7CiAJTXBpMkV2ZW50RGF0YVNhc1RvcG9sb2d5Q2hhbmdlTGlzdF90ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7CiAKICNpZmRlZiBDT05GSUdfU0NTSV9NUFQyU0FTX0xPR0dJTkcKQEAgLTQwNDAsMTAgKzQxNzMsMTMgQEAKIAkJX3Njc2loX3Nhc190b3BvbG9neV9jaGFuZ2VfZXZlbnRfZGVidWcoaW9jLCBldmVudF9kYXRhKTsKICNlbmRpZgogCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpCisJCXJldHVybjsKKwogCWlmICghaW9jLT5zYXNfaGJhLm51bV9waHlzKQogCQlfc2NzaWhfc2FzX2hvc3RfYWRkKGlvYyk7CiAJZWxzZQotCQlfc2NzaWhfc2FzX2hvc3RfcmVmcmVzaChpb2MsIDApOworCQlfc2NzaWhfc2FzX2hvc3RfcmVmcmVzaChpb2MpOwogCiAJaWYgKGZ3X2V2ZW50LT5pZ25vcmUpIHsKIAkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiaWdub3JpbmcgZXhwYW5kZXIgIgpAQCAtNDA1OCw2ICs0MTk0LDE3IEBACiAJCWlmIChfc2NzaWhfZXhwYW5kZXJfYWRkKGlvYywgcGFyZW50X2hhbmRsZSkgIT0gMCkKIAkJCXJldHVybjsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKKwlzYXNfZXhwYW5kZXIgPSBtcHQyc2FzX3Njc2loX2V4cGFuZGVyX2ZpbmRfYnlfaGFuZGxlKGlvYywKKwkgICAgcGFyZW50X2hhbmRsZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CisJaWYgKHNhc19leHBhbmRlcikKKwkJc2FzX2FkZHJlc3MgPSBzYXNfZXhwYW5kZXItPnNhc19hZGRyZXNzOworCWVsc2UgaWYgKHBhcmVudF9oYW5kbGUgPCBpb2MtPnNhc19oYmEubnVtX3BoeXMpCisJCXNhc19hZGRyZXNzID0gaW9jLT5zYXNfaGJhLnNhc19hZGRyZXNzOworCWVsc2UKKwkJcmV0dXJuOworCiAJLyogaGFuZGxlIHNpYmxpbmdzIGV2ZW50cyAqLwogCWZvciAoaSA9IDA7IGkgPCBldmVudF9kYXRhLT5OdW1FbnRyaWVzOyBpKyspIHsKIAkJaWYgKGZ3X2V2ZW50LT5pZ25vcmUpIHsKQEAgLTQwNzcsNDggKzQyMjQsNDcgQEAKIAkJaGFuZGxlID0gbGUxNl90b19jcHUoZXZlbnRfZGF0YS0+UEhZW2ldLkF0dGFjaGVkRGV2SGFuZGxlKTsKIAkJaWYgKCFoYW5kbGUpCiAJCQljb250aW51ZTsKLQkJbGlua19yYXRlXyA9IGV2ZW50X2RhdGEtPlBIWVtpXS5MaW5rUmF0ZSA+PiA0OworCQlsaW5rX3JhdGUgPSBldmVudF9kYXRhLT5QSFlbaV0uTGlua1JhdGUgPj4gNDsKKwkJcHJldl9saW5rX3JhdGUgPSBldmVudF9kYXRhLT5QSFlbaV0uTGlua1JhdGUgJiAweEY7CiAJCXN3aXRjaCAocmVhc29uX2NvZGUpIHsKIAkJY2FzZSBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX1BIWV9DSEFOR0VEOgorCisJCQlpZiAobGlua19yYXRlID09IHByZXZfbGlua19yYXRlKQorCQkJCWJyZWFrOworCisJCQltcHQyc2FzX3RyYW5zcG9ydF91cGRhdGVfbGlua3MoaW9jLCBzYXNfYWRkcmVzcywKKwkJCSAgICBoYW5kbGUsIHBoeV9udW1iZXIsIGxpbmtfcmF0ZSk7CisKKwkJCWlmIChsaW5rX3JhdGUgPj0gTVBJMl9TQVNfTkVHX0xJTktfUkFURV8xXzUpCisJCQkJX3Njc2loX3VibG9ja19pb19kZXZpY2UoaW9jLCBoYW5kbGUpOworCQkJYnJlYWs7CiAJCWNhc2UgTVBJMl9FVkVOVF9TQVNfVE9QT19SQ19UQVJHX0FEREVEOgotCQkJaWYgKCFwYXJlbnRfaGFuZGxlKSB7Ci0JCQkJaWYgKHBoeV9udW1iZXIgPCBpb2MtPnNhc19oYmEubnVtX3BoeXMpCi0JCQkJCW1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcygKLQkJCQkJaW9jLAotCQkJCQlpb2MtPnNhc19oYmEucGh5W3BoeV9udW1iZXJdLmhhbmRsZSwKLQkJCQkJaGFuZGxlLCBwaHlfbnVtYmVyLCBsaW5rX3JhdGVfKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOwotCQkJCXNhc19leHBhbmRlciA9Ci0JCQkJICAgIG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9oYW5kbGUoaW9jLAotCQkJCQlwYXJlbnRfaGFuZGxlKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19ub2RlX2xvY2ssCi0JCQkJICAgIGZsYWdzKTsKLQkJCQlpZiAoc2FzX2V4cGFuZGVyKSB7Ci0JCQkJCWlmIChwaHlfbnVtYmVyIDwgc2FzX2V4cGFuZGVyLT5udW1fcGh5cykKLQkJCQkJCW1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcygKLQkJCQkJCWlvYywKLQkJCQkJCXNhc19leHBhbmRlci0+Ci0JCQkJCQlwaHlbcGh5X251bWJlcl0uaGFuZGxlLAotCQkJCQkJaGFuZGxlLCBwaHlfbnVtYmVyLAotCQkJCQkJbGlua19yYXRlXyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlYXNvbl9jb2RlID09IE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfVEFSR19BRERFRCkgewotCQkJCWlmIChsaW5rX3JhdGVfIDwgTVBJMl9TQVNfTkVHX0xJTktfUkFURV8xXzUpCi0JCQkJCWJyZWFrOwotCQkJCV9zY3NpaF9hZGRfZGV2aWNlKGlvYywgaGFuZGxlLCBwaHlfbnVtYmVyLCAwKTsKLQkJCX0KKworCQkJbXB0MnNhc190cmFuc3BvcnRfdXBkYXRlX2xpbmtzKGlvYywgc2FzX2FkZHJlc3MsCisJCQkgICAgaGFuZGxlLCBwaHlfbnVtYmVyLCBsaW5rX3JhdGUpOworCisJCQlfc2NzaWhfYWRkX2RldmljZShpb2MsIGhhbmRsZSwgcGh5X251bWJlciwgMCk7CiAJCQlicmVhazsKIAkJY2FzZSBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX1RBUkdfTk9UX1JFU1BPTkRJTkc6Ci0JCQlfc2NzaWhfcmVtb3ZlX2RldmljZShpb2MsIGhhbmRsZSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCQkJc2FzX2RldmljZSA9IF9zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKGlvYywKKwkJCSAgICBoYW5kbGUpOworCQkJaWYgKCFzYXNfZGV2aWNlKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssCisJCQkJICAgIGZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJCQlfc2NzaWhfcmVtb3ZlX2RldmljZShpb2MsIHNhc19kZXZpY2UpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKIAkvKiBoYW5kbGUgZXhwYW5kZXIgcmVtb3ZhbCAqLwotCWlmIChldmVudF9kYXRhLT5FeHBTdGF0dXMgPT0gTVBJMl9FVkVOVF9TQVNfVE9QT19FU19OT1RfUkVTUE9ORElORykKLQkJX3Njc2loX2V4cGFuZGVyX3JlbW92ZShpb2MsIHBhcmVudF9oYW5kbGUpOworCWlmIChldmVudF9kYXRhLT5FeHBTdGF0dXMgPT0gTVBJMl9FVkVOVF9TQVNfVE9QT19FU19OT1RfUkVTUE9ORElORyAmJgorCSAgICBzYXNfZXhwYW5kZXIpCisJCV9zY3NpaF9leHBhbmRlcl9yZW1vdmUoaW9jLCBzYXNfYWRkcmVzcyk7CiAKIH0KIApAQCAtNDE3MCw2ICs0MzE2LDEyIEBACiAJY2FzZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19BU1lOQ19OT1RJRklDQVRJT046CiAJCXJlYXNvbl9zdHIgPSAiaW50ZXJuYWwgYXN5bmMgbm90aWZpY2F0aW9uIjsKIAkJYnJlYWs7CisJY2FzZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19FWFBBTkRFUl9SRURVQ0VEX0ZVTkNUSU9OQUxJVFk6CisJCXJlYXNvbl9zdHIgPSAiZXhwYW5kZXIgcmVkdWNlZCBmdW5jdGlvbmFsaXR5IjsKKwkJYnJlYWs7CisJY2FzZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19DTVBfRVhQQU5ERVJfUkVEVUNFRF9GVU5DVElPTkFMSVRZOgorCQlyZWFzb25fc3RyID0gImV4cGFuZGVyIHJlZHVjZWQgZnVuY3Rpb25hbGl0eSBjb21wbGV0ZSI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJlYXNvbl9zdHIgPSAidW5rbm93biByZWFzb24iOwogCQlicmVhazsKQEAgLTQxOTcsMTEgKzQzNDksNDMgQEAKIF9zY3NpaF9zYXNfZGV2aWNlX3N0YXR1c19jaGFuZ2VfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAogICAgIHN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCkKIHsKKwlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnRhcmdldF9wcml2X2RhdGE7CisJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOworCV9fbGU2NCBzYXNfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCU1waTJFdmVudERhdGFTYXNEZXZpY2VTdGF0dXNDaGFuZ2VfdCAqZXZlbnRfZGF0YSA9CisJICAgIGZ3X2V2ZW50LT5ldmVudF9kYXRhOworCiAjaWZkZWYgQ09ORklHX1NDU0lfTVBUMlNBU19MT0dHSU5HCiAJaWYgKGlvYy0+bG9nZ2luZ19sZXZlbCAmIE1QVF9ERUJVR19FVkVOVF9XT1JLX1RBU0spCiAJCV9zY3NpaF9zYXNfZGV2aWNlX3N0YXR1c19jaGFuZ2VfZXZlbnRfZGVidWcoaW9jLAotCQkgICAgIGZ3X2V2ZW50LT5ldmVudF9kYXRhKTsKKwkJICAgICBldmVudF9kYXRhKTsKICNlbmRpZgorCisJaWYgKCEoZXZlbnRfZGF0YS0+UmVhc29uQ29kZSA9PQorCSAgICBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19JTlRFUk5BTF9ERVZJQ0VfUkVTRVQgJiYKKwkgICBldmVudF9kYXRhLT5SZWFzb25Db2RlID09CisJICAgIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0NNUF9JTlRFUk5BTF9ERVZfUkVTRVQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlzYXNfYWRkcmVzcyA9IGxlNjRfdG9fY3B1KGV2ZW50X2RhdGEtPlNBU0FkZHJlc3MpOworCXNhc19kZXZpY2UgPSBtcHQyc2FzX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJICAgIHNhc19hZGRyZXNzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCisJaWYgKCFzYXNfZGV2aWNlIHx8ICFzYXNfZGV2aWNlLT5zdGFyZ2V0KQorCQlyZXR1cm47CisKKwl0YXJnZXRfcHJpdl9kYXRhID0gc2FzX2RldmljZS0+c3RhcmdldC0+aG9zdGRhdGE7CisJaWYgKCF0YXJnZXRfcHJpdl9kYXRhKQorCQlyZXR1cm47CisKKwlpZiAoZXZlbnRfZGF0YS0+UmVhc29uQ29kZSA9PQorCSAgICBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19JTlRFUk5BTF9ERVZJQ0VfUkVTRVQpCisJCXRhcmdldF9wcml2X2RhdGEtPnRtX2J1c3kgPSAxOworCWVsc2UKKwkJdGFyZ2V0X3ByaXZfZGF0YS0+dG1fYnVzeSA9IDA7CiB9CiAKICNpZmRlZiBDT05GSUdfU0NTSV9NUFQyU0FTX0xPR0dJTkcKQEAgLTQyODEsNiArNDQ2NSw3IEBACiAjaWZkZWYgQ09ORklHX1NDU0lfTVBUMlNBU19MT0dHSU5HCiAJTXBpMkV2ZW50RGF0YVNhc0Jyb2FkY2FzdFByaW1pdGl2ZV90ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7CiAjZW5kaWYKKwl1MTYgaW9jX3N0YXR1czsKIAlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJicm9hZGNhc3QgcHJpbWF0aXZlOiAiCiAJICAgICJwaHkgbnVtYmVyKCVkKSwgd2lkdGgoJWQpXG4iLCBpb2MtPm5hbWUsIGV2ZW50X2RhdGEtPlBoeU51bSwKIAkgICAgZXZlbnRfZGF0YS0+UG9ydFdpZHRoKSk7CkBAIC00MzE0LDggKzQ0OTksOSBAQAogCQltcHQyc2FzX3Njc2loX2lzc3VlX3RtKGlvYywgaGFuZGxlLCBsdW4sCiAJCSAgICBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9RVUVSWV9UQVNLLCBzbWlkLCAzMCk7CiAJCWlvYy0+dG1fY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9OT1RfVVNFRDsKLQotCQlpZiAoKG1waV9yZXBseS0+SU9DU3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpICYmCisJCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHktPklPQ1N0YXR1cykKKwkJICAgICYgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwkJaWYgKChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpICYmCiAJCSAgICAobXBpX3JlcGx5LT5SZXNwb25zZUNvZGUgPT0KIAkJICAgICBNUEkyX1NDU0lUQVNLTUdNVF9SU1BfVE1fU1VDQ0VFREVEIHx8CiAJCSAgICAgbXBpX3JlcGx5LT5SZXNwb25zZUNvZGUgPT0KQEAgLTQ1NzAsNyArNDc1Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAlpZiAoIXNhc19kZXZpY2UpCiAJCXJldHVybjsKLQlfc2NzaWhfcmVtb3ZlX2RldmljZShpb2MsIGhhbmRsZSk7CisJX3Njc2loX3JlbW92ZV9kZXZpY2UoaW9jLCBzYXNfZGV2aWNlKTsKIH0KIAogLyoqCkBAIC00NTkxLDYgKzQ3NzcsOCBAQAogCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKIAlNcGkyU2FzRGV2aWNlUGFnZTBfdCBzYXNfZGV2aWNlX3BnMDsKIAl1MzIgaW9jX3N0YXR1czsKKwl1NjQgc2FzX2FkZHJlc3M7CisJdTE2IHBhcmVudF9oYW5kbGU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAlzYXNfZGV2aWNlID0gX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOwpAQCAtNDYxNSw5ICs0ODAzLDEwIEBACiAJCXJldHVybjsKIAl9CiAKLQltcHQyc2FzX3RyYW5zcG9ydF91cGRhdGVfbGlua3MoaW9jLAotCSAgICBsZTE2X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5QYXJlbnREZXZIYW5kbGUpLAotCSAgICBoYW5kbGUsIHNhc19kZXZpY2VfcGcwLlBoeU51bSwgTVBJMl9TQVNfTkVHX0xJTktfUkFURV8xXzUpOworCXBhcmVudF9oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5QYXJlbnREZXZIYW5kbGUpOworCWlmICghX3Njc2loX2dldF9zYXNfYWRkcmVzcyhpb2MsIHBhcmVudF9oYW5kbGUsICZzYXNfYWRkcmVzcykpCisJCW1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcyhpb2MsIHNhc19hZGRyZXNzLCBoYW5kbGUsCisJCSAgICBzYXNfZGV2aWNlX3BnMC5QaHlOdW0sIE1QSTJfU0FTX05FR19MSU5LX1JBVEVfMV81KTsKIAogCV9zY3NpaF9hZGRfZGV2aWNlKGlvYywgaGFuZGxlLCAwLCAxKTsKIH0KQEAgLTQ4NTcsNyArNTA0Niw3IEBACiBfc2NzaWhfc2FzX2lyX3BoeXNpY2FsX2Rpc2tfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAogICAgIHN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCkKIHsKLQl1MTYgaGFuZGxlOworCXUxNiBoYW5kbGUsIHBhcmVudF9oYW5kbGU7CiAJdTMyIHN0YXRlOwogCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDg2NSw2ICs1MDU0LDcgQEAKIAlNcGkyU2FzRGV2aWNlUGFnZTBfdCBzYXNfZGV2aWNlX3BnMDsKIAl1MzIgaW9jX3N0YXR1czsKIAlNcGkyRXZlbnREYXRhSXJQaHlzaWNhbERpc2tfdCAqZXZlbnRfZGF0YSA9IGZ3X2V2ZW50LT5ldmVudF9kYXRhOworCXU2NCBzYXNfYWRkcmVzczsKIAogCWlmIChldmVudF9kYXRhLT5SZWFzb25Db2RlICE9IE1QSTJfRVZFTlRfSVJfUEhZU0RJU0tfUkNfU1RBVEVfQ0hBTkdFRCkKIAkJcmV0dXJuOwpAQCAtNDkwNiw5ICs1MDk2LDEwIEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQltcHQyc2FzX3RyYW5zcG9ydF91cGRhdGVfbGlua3MoaW9jLAotCQkgICAgbGUxNl90b19jcHUoc2FzX2RldmljZV9wZzAuUGFyZW50RGV2SGFuZGxlKSwKLQkJICAgIGhhbmRsZSwgc2FzX2RldmljZV9wZzAuUGh5TnVtLCBNUEkyX1NBU19ORUdfTElOS19SQVRFXzFfNSk7CisJCXBhcmVudF9oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5QYXJlbnREZXZIYW5kbGUpOworCQlpZiAoIV9zY3NpaF9nZXRfc2FzX2FkZHJlc3MoaW9jLCBwYXJlbnRfaGFuZGxlLCAmc2FzX2FkZHJlc3MpKQorCQkJbXB0MnNhc190cmFuc3BvcnRfdXBkYXRlX2xpbmtzKGlvYywgc2FzX2FkZHJlc3MsIGhhbmRsZSwKKwkJCSAgICBzYXNfZGV2aWNlX3BnMC5QaHlOdW0sIE1QSTJfU0FTX05FR19MSU5LX1JBVEVfMV81KTsKIAogCQlfc2NzaWhfYWRkX2RldmljZShpb2MsIGhhbmRsZSwgMCwgMSk7CiAKQEAgLTQ5NDgsMTEgKzUxMzksMTcgQEAKIAljYXNlIE1QSTJfRVZFTlRfSVJfUkFJRE9QX0NPTlNJU1RFTkNZX0NIRUNLOgogCQlyZWFzb25fc3RyID0gImNvbnNpc3RlbmN5IGNoZWNrIjsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmVhc29uX3N0ciA9ICJ1bmtub3duIHJlYXNvbiI7CisJY2FzZSBNUEkyX0VWRU5UX0lSX1JBSURPUF9CQUNLR1JPVU5EX0lOSVQ6CisJCXJlYXNvbl9zdHIgPSAiYmFja2dyb3VuZCBpbml0IjsKKwkJYnJlYWs7CisJY2FzZSBNUEkyX0VWRU5UX0lSX1JBSURPUF9NQUtFX0RBVEFfQ09OU0lTVEVOVDoKKwkJcmVhc29uX3N0ciA9ICJtYWtlIGRhdGEgY29uc2lzdGVudCI7CiAJCWJyZWFrOwogCX0KIAorCWlmICghcmVhc29uX3N0cikKKwkJcmV0dXJuOworCiAJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInJhaWQgb3BlcmF0aW9uYWwgc3RhdHVzOiAoJXMpIgogCSAgICAiXHRoYW5kbGUoMHglMDR4KSwgcGVyY2VudCBjb21wbGV0ZSglZClcbiIsCiAJICAgIGlvYy0+bmFtZSwgcmVhc29uX3N0ciwKQEAgLTUyNTIsMTggKzU0NDksMjMgQEAKIHsKIAlzdHJ1Y3QgX3Nhc19ub2RlICpzYXNfZXhwYW5kZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNhc19leHBhbmRlciwgJmlvYy0+c2FzX2V4cGFuZGVyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHNhc19leHBhbmRlci0+c2FzX2FkZHJlc3MgPT0gc2FzX2FkZHJlc3MpIHsKLQkJCXNhc19leHBhbmRlci0+cmVzcG9uZGluZyA9IDE7Ci0JCQlpZiAoc2FzX2V4cGFuZGVyLT5oYW5kbGUgIT0gaGFuZGxlKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAib2xkIGhhbmRsZSgweCUwNHgpXG4iLAotCQkJCSAgICBzYXNfZXhwYW5kZXItPmhhbmRsZSk7Ci0JCQkJc2FzX2V4cGFuZGVyLT5oYW5kbGUgPSBoYW5kbGU7Ci0JCQl9CisJCWlmIChzYXNfZXhwYW5kZXItPnNhc19hZGRyZXNzICE9IHNhc19hZGRyZXNzKQorCQkJY29udGludWU7CisJCXNhc19leHBhbmRlci0+cmVzcG9uZGluZyA9IDE7CisJCWlmIChzYXNfZXhwYW5kZXItPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQlnb3RvIG91dDsKLQkJfQorCQlwcmludGsoS0VSTl9JTkZPICJcdGV4cGFuZGVyKDB4JTAxNmxseCk6IGhhbmRsZSBjaGFuZ2VkIgorCQkgICAgIiBmcm9tKDB4JTA0eCkgdG8gKDB4JTA0eCkhISFcbiIsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhc19leHBhbmRlci0+c2FzX2FkZHJlc3MsCisJCSAgICBzYXNfZXhwYW5kZXItPmhhbmRsZSwgaGFuZGxlKTsKKwkJc2FzX2V4cGFuZGVyLT5oYW5kbGUgPSBoYW5kbGU7CisJCWZvciAoaSA9IDAgOyBpIDwgc2FzX2V4cGFuZGVyLT5udW1fcGh5cyA7IGkrKykKKwkJCXNhc19leHBhbmRlci0+cGh5W2ldLmhhbmRsZSA9IGhhbmRsZTsKKwkJZ290byBvdXQ7CiAJfQogIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKQEAgLTUzNDAsNyArNTU0Miw5IEBACiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCSAgICBzYXNfZGV2aWNlLT5lbmNsb3N1cmVfbG9naWNhbF9pZCwKIAkJCSAgICBzYXNfZGV2aWNlLT5zbG90KTsKLQkJX3Njc2loX3JlbW92ZV9kZXZpY2UoaW9jLCBzYXNfZGV2aWNlLT5oYW5kbGUpOworCQkvKiBpbnZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCisJCXNhc19kZXZpY2UtPmhhbmRsZSA9IDA7CisJCV9zY3NpaF9yZW1vdmVfZGV2aWNlKGlvYywgc2FzX2RldmljZSk7CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJhaWRfZGV2aWNlLCByYWlkX2RldmljZV9uZXh0LApAQCAtNTM2Niw3ICs1NTcwLDcgQEAKIAkJCXNhc19leHBhbmRlci0+cmVzcG9uZGluZyA9IDA7CiAJCQljb250aW51ZTsKIAkJfQotCQlfc2NzaWhfZXhwYW5kZXJfcmVtb3ZlKGlvYywgc2FzX2V4cGFuZGVyLT5oYW5kbGUpOworCQlfc2NzaWhfZXhwYW5kZXJfcmVtb3ZlKGlvYywgc2FzX2V4cGFuZGVyLT5zYXNfYWRkcmVzcyk7CiAJCWdvdG8gcmV0cnlfZXhwYW5kZXJfc2VhcmNoOwogCX0KIH0KQEAgLTU0MDYsNyArNTYxMCw3IEBACiAJY2FzZSBNUFQyX0lPQ19ET05FX1JFU0VUOgogCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCiAJCSAgICAiTVBUMl9JT0NfRE9ORV9SRVNFVFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwotCQlfc2NzaWhfc2FzX2hvc3RfcmVmcmVzaChpb2MsIDApOworCQlfc2NzaWhfc2FzX2hvc3RfcmVmcmVzaChpb2MpOwogCQlfc2NzaWhfc2VhcmNoX3Jlc3BvbmRpbmdfc2FzX2RldmljZXMoaW9jKTsKIAkJX3Njc2loX3NlYXJjaF9yZXNwb25kaW5nX3JhaWRfZGV2aWNlcyhpb2MpOwogCQlfc2NzaWhfc2VhcmNoX3Jlc3BvbmRpbmdfZXhwYW5kZXJzKGlvYyk7CkBAIC01NjQ2LDcgKzU4NTAsNyBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAkJCWlmICghc2FzX2RldmljZSkKIAkJCQljb250aW51ZTsKLQkJCV9zY3NpaF9yZW1vdmVfZGV2aWNlKGlvYywgc2FzX2RldmljZS0+aGFuZGxlKTsKKwkJCV9zY3NpaF9yZW1vdmVfZGV2aWNlKGlvYywgc2FzX2RldmljZSk7CiAJCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKIAkJCQlyZXR1cm47CiAJCQlnb3RvIHJldHJ5X2RldmljZV9zZWFyY2g7CkBAIC01NjY5LDcgKzU4NzMsOCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CiAJCQlpZiAoIWV4cGFuZGVyX3NpYmxpbmcpCiAJCQkJY29udGludWU7Ci0JCQlfc2NzaWhfZXhwYW5kZXJfcmVtb3ZlKGlvYywgZXhwYW5kZXJfc2libGluZy0+aGFuZGxlKTsKKwkJCV9zY3NpaF9leHBhbmRlcl9yZW1vdmUoaW9jLAorCQkJICAgIGV4cGFuZGVyX3NpYmxpbmctPnNhc19hZGRyZXNzKTsKIAkJCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQogCQkJCXJldHVybjsKIAkJCWdvdG8gcmV0cnlfZXhwYW5kZXJfc2VhcmNoOwpAQCAtNTY3Nyw3ICs1ODgyLDcgQEAKIAl9CiAKIAltcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZShpb2MsIHNhc19leHBhbmRlci0+c2FzX2FkZHJlc3MsCi0JICAgIHNhc19leHBhbmRlci0+cGFyZW50X2hhbmRsZSk7CisJICAgIHNhc19leHBhbmRlci0+c2FzX2FkZHJlc3NfcGFyZW50KTsKIAogCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJleHBhbmRlcl9yZW1vdmU6IGhhbmRsZSIKIAkgICAiKDB4JTA0eCksIHNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwKQEAgLTU2OTAsOSArNTg5NSw5OSBAQAogfQogCiAvKioKKyAqIF9zY3NpaF9pcl9zaHV0ZG93biAtIElSIHNodXRkb3duIG5vdGlmaWNhdGlvbgorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKgorICogU2VuZGluZyBSQUlEIEFjdGlvbiB0byBhbGVydCB0aGUgSW50ZWdyYXRlZCBSQUlEIHN1YnN5c3RlbSBvZiB0aGUgSU9DIHRoYXQKKyAqIHRoZSBob3N0IHN5c3RlbSBpcyBzaHV0dGluZyBkb3duLgorICoKKyAqIFJldHVybiBub3RoaW5nLgorICovCitzdGF0aWMgdm9pZAorX3Njc2loX2lyX3NodXRkb3duKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKK3sKKwlNcGkyUmFpZEFjdGlvblJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CisJTXBpMlJhaWRBY3Rpb25SZXBseV90ICptcGlfcmVwbHk7CisJdTE2IHNtaWQ7CisKKwkvKiBpcyBJUiBmaXJtd2FyZSBidWlsZCBsb2FkZWQgPyAqLworCWlmICghaW9jLT5pcl9maXJtd2FyZSkKKwkJcmV0dXJuOworCisJLyogYXJlIHRoZXJlIGFueSB2b2x1bWVzID8gKi8KKwlpZiAobGlzdF9lbXB0eSgmaW9jLT5yYWlkX2RldmljZV9saXN0KSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmaW9jLT5zY3NpaF9jbWRzLm11dGV4KTsKKworCWlmIChpb2MtPnNjc2loX2NtZHMuc3RhdHVzICE9IE1QVDJfQ01EX05PVF9VU0VEKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBzY3NpaF9jbWQgaW4gdXNlXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKwlpb2MtPnNjc2loX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfUEVORElORzsKKworCXNtaWQgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWQoaW9jLCBpb2MtPnNjc2loX2NiX2lkeCk7CisJaWYgKCFzbWlkKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlpb2MtPnNjc2loX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CisJCWdvdG8gb3V0OworCX0KKworCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKKwlpb2MtPnNjc2loX2NtZHMuc21pZCA9IHNtaWQ7CisJbWVtc2V0KG1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMlJhaWRBY3Rpb25SZXF1ZXN0X3QpKTsKKworCW1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fUkFJRF9BQ1RJT047CisJbXBpX3JlcXVlc3QtPkFjdGlvbiA9IE1QSTJfUkFJRF9BQ1RJT05fU1lTVEVNX1NIVVRET1dOX0lOSVRJQVRFRDsKKworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJJUiBzaHV0ZG93biAoc2VuZGluZylcbiIsIGlvYy0+bmFtZSk7CisJaW5pdF9jb21wbGV0aW9uKCZpb2MtPnNjc2loX2NtZHMuZG9uZSk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+c2NzaWhfY21kcy5kb25lLCAxMCpIWik7CisKKwlpZiAoIShpb2MtPnNjc2loX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfQ09NUExFVEUpKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiB0aW1lb3V0XG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpb2MtPnNjc2loX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfUkVQTFlfVkFMSUQpIHsKKwkJbXBpX3JlcGx5ID0gaW9jLT5zY3NpaF9jbWRzLnJlcGx5OworCisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJJUiBzaHV0ZG93biAoY29tcGxldGUpOiAiCisJCSAgICAiaW9jX3N0YXR1cygweCUwNHgpLCBsb2dpbmZvKDB4JTA4eClcbiIsCisJCSAgICBpb2MtPm5hbWUsIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+SU9DU3RhdHVzKSwKKwkJICAgIGxlMzJfdG9fY3B1KG1waV9yZXBseS0+SU9DTG9nSW5mbykpOworCX0KKworIG91dDoKKwlpb2MtPnNjc2loX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CisJbXV0ZXhfdW5sb2NrKCZpb2MtPnNjc2loX2NtZHMubXV0ZXgpOworfQorCisvKioKKyAqIF9zY3NpaF9zaHV0ZG93biAtIHJvdXRpbmUgY2FsbCBkdXJpbmcgc3lzdGVtIHNodXRkb3duCisgKiBAcGRldjogUENJIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQKK19zY3NpaF9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKKworCV9zY3NpaF9pcl9zaHV0ZG93bihpb2MpOworCW1wdDJzYXNfYmFzZV9kZXRhY2goaW9jKTsKK30KKworLyoqCiAgKiBfc2NzaWhfcmVtb3ZlIC0gZGV0YWNoIGFuZCByZW1vdmUgYWRkIGhvc3QKICAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdAogICoKKyAqIFJvdXRpbmUgY2FsbGVkIHdoZW4gdW5sb2FkaW5nIHRoZSBkcml2ZXIuCiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwogc3RhdGljIHZvaWQgX19kZXZleGl0CkBAIC01NzI2LDcgKzYwMjEsNyBAQAogCQkJICAgIG1wdDJzYXNfc2NzaWhfc2FzX2RldmljZV9maW5kX2J5X3Nhc19hZGRyZXNzKGlvYywKIAkJCSAgIG1wdDJzYXNfcG9ydC0+cmVtb3RlX2lkZW50aWZ5LnNhc19hZGRyZXNzKTsKIAkJCWlmIChzYXNfZGV2aWNlKSB7Ci0JCQkJX3Njc2loX3JlbW92ZV9kZXZpY2UoaW9jLCBzYXNfZGV2aWNlLT5oYW5kbGUpOworCQkJCV9zY3NpaF9yZW1vdmVfZGV2aWNlKGlvYywgc2FzX2RldmljZSk7CiAJCQkJZ290byByZXRyeV9hZ2FpbjsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTU3MzUsNyArNjAzMCw3IEBACiAJCQkgICAgbXB0MnNhc19wb3J0LT5yZW1vdGVfaWRlbnRpZnkuc2FzX2FkZHJlc3MpOwogCQkJaWYgKGV4cGFuZGVyX3NpYmxpbmcpIHsKIAkJCQlfc2NzaWhfZXhwYW5kZXJfcmVtb3ZlKGlvYywKLQkJCQkgICAgZXhwYW5kZXJfc2libGluZy0+aGFuZGxlKTsKKwkJCQkgICAgZXhwYW5kZXJfc2libGluZy0+c2FzX2FkZHJlc3MpOwogCQkJCWdvdG8gcmV0cnlfYWdhaW47CiAJCQl9CiAJCX0KQEAgLTU3NDksNyArNjA0NCw3IEBACiAJfQogCiAJc2FzX3JlbW92ZV9ob3N0KHNob3N0KTsKLQltcHQyc2FzX2Jhc2VfZGV0YWNoKGlvYyk7CisJX3Njc2loX3NodXRkb3duKHBkZXYpOwogCWxpc3RfZGVsKCZpb2MtPmxpc3QpOwogCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwogCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwpAQCAtNTc3MCw3ICs2MDY1LDggQEAKIAl2b2lkICpkZXZpY2U7CiAJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOwogCXN0cnVjdCBfcmFpZF9kZXZpY2UgKnJhaWRfZGV2aWNlOwotCXUxNiBoYW5kbGUsIHBhcmVudF9oYW5kbGU7CisJdTE2IGhhbmRsZTsKKwl1NjQgc2FzX2FkZHJlc3NfcGFyZW50OwogCXU2NCBzYXNfYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKQEAgLTU3OTksMTcgKzYwOTUsMTcgQEAKIAl9IGVsc2UgewogCQlzYXNfZGV2aWNlID0gZGV2aWNlOwogCQloYW5kbGUgPSBzYXNfZGV2aWNlLT5oYW5kbGU7Ci0JCXBhcmVudF9oYW5kbGUgPSBzYXNfZGV2aWNlLT5wYXJlbnRfaGFuZGxlOworCQlzYXNfYWRkcmVzc19wYXJlbnQgPSBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQ7CiAJCXNhc19hZGRyZXNzID0gc2FzX2RldmljZS0+c2FzX2FkZHJlc3M7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCQlsaXN0X21vdmVfdGFpbCgmc2FzX2RldmljZS0+bGlzdCwgJmlvYy0+c2FzX2RldmljZV9saXN0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAkJaWYgKCFtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIHNhc19kZXZpY2UtPmhhbmRsZSwKLQkJICAgIHNhc19kZXZpY2UtPnBhcmVudF9oYW5kbGUpKSB7CisJCSAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpKSB7CiAJCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKIAkJfSBlbHNlIGlmICghc2FzX2RldmljZS0+c3RhcmdldCkgewogCQkJbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoaW9jLCBzYXNfYWRkcmVzcywKLQkJCSAgICBwYXJlbnRfaGFuZGxlKTsKKwkJCSAgICBzYXNfYWRkcmVzc19wYXJlbnQpOwogCQkJX3Njc2loX3Nhc19kZXZpY2VfcmVtb3ZlKGlvYywgc2FzX2RldmljZSk7CiAJCX0KIAl9CkBAIC01ODQ5LDggKzYxNDUsNiBAQAogewogCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZSwgKm5leHQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MTYgaGFuZGxlLCBwYXJlbnRfaGFuZGxlOwotCXU2NCBzYXNfYWRkcmVzczsKIAogCS8qIFNBUyBEZXZpY2UgTGlzdCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzYXNfZGV2aWNlLCBuZXh0LCAmaW9jLT5zYXNfZGV2aWNlX2luaXRfbGlzdCwKQEAgLTU4NTksMTQgKzYxNTMsMTMgQEAKIAkJbGlzdF9tb3ZlX3RhaWwoJnNhc19kZXZpY2UtPmxpc3QsICZpb2MtPnNhc19kZXZpY2VfbGlzdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CiAKLQkJaGFuZGxlID0gc2FzX2RldmljZS0+aGFuZGxlOwotCQlwYXJlbnRfaGFuZGxlID0gc2FzX2RldmljZS0+cGFyZW50X2hhbmRsZTsKLQkJc2FzX2FkZHJlc3MgPSBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzczsKLQkJaWYgKCFtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIGhhbmRsZSwgcGFyZW50X2hhbmRsZSkpIHsKKwkJaWYgKCFtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIHNhc19kZXZpY2UtPmhhbmRsZSwKKwkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCkpIHsKIAkJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOwogCQl9IGVsc2UgaWYgKCFzYXNfZGV2aWNlLT5zdGFyZ2V0KSB7Ci0JCQltcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZShpb2MsIHNhc19hZGRyZXNzLAotCQkJICAgIHBhcmVudF9oYW5kbGUpOworCQkJbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoaW9jLAorCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzLAorCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCk7CiAJCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKIAkJfQogCX0KQEAgLTU5MzUsNiArNjIyOCw3IEBACiAJaW9jLT5jdGxfY2JfaWR4ID0gY3RsX2NiX2lkeDsKIAlpb2MtPmJhc2VfY2JfaWR4ID0gYmFzZV9jYl9pZHg7CiAJaW9jLT50cmFuc3BvcnRfY2JfaWR4ID0gdHJhbnNwb3J0X2NiX2lkeDsKKwlpb2MtPnNjc2loX2NiX2lkeCA9IHNjc2loX2NiX2lkeDsKIAlpb2MtPmNvbmZpZ19jYl9pZHggPSBjb25maWdfY2JfaWR4OwogCWlvYy0+dG1fdHJfY2JfaWR4ID0gdG1fdHJfY2JfaWR4OwogCWlvYy0+dG1fc2FzX2NvbnRyb2xfY2JfaWR4ID0gdG1fc2FzX2NvbnRyb2xfY2JfaWR4OwpAQCAtNjA3Miw2ICs2MzY2LDcgQEAKIAkuaWRfdGFibGUJPSBzY3NpaF9wY2lfdGFibGUsCiAJLnByb2JlCQk9IF9zY3NpaF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKF9zY3NpaF9yZW1vdmUpLAorCS5zaHV0ZG93bgk9IF9zY3NpaF9zaHV0ZG93biwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAk9IF9zY3NpaF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gX3Njc2loX3Jlc3VtZSwKQEAgLTYxMTMsNiArNjQwOCw5IEBACiAJdHJhbnNwb3J0X2NiX2lkeCA9IG1wdDJzYXNfYmFzZV9yZWdpc3Rlcl9jYWxsYmFja19oYW5kbGVyKAogCSAgICBtcHQyc2FzX3RyYW5zcG9ydF9kb25lKTsKIAorCS8qIHNjc2loIGludGVybmFsIGNvbW1hbmRzIGNhbGxiYWNrIGhhbmRsZXIgKi8KKwlzY3NpaF9jYl9pZHggPSBtcHQyc2FzX2Jhc2VfcmVnaXN0ZXJfY2FsbGJhY2tfaGFuZGxlcihfc2NzaWhfZG9uZSk7CisKIAkvKiBjb25maWd1cmF0aW9uIHBhZ2UgQVBJIGludGVybmFsIGNvbW1hbmRzIGNhbGxiYWNrIGhhbmRsZXIgKi8KIAljb25maWdfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCiAJICAgIG1wdDJzYXNfY29uZmlnX2RvbmUpOwpAQCAtNjE1Miw2ICs2NDUwLDcgQEAKIAltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKHRtX2NiX2lkeCk7CiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcihiYXNlX2NiX2lkeCk7CiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcih0cmFuc3BvcnRfY2JfaWR4KTsKKwltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKHNjc2loX2NiX2lkeCk7CiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcihjb25maWdfY2JfaWR4KTsKIAltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKGN0bF9jYl9pZHgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYwppbmRleCBlYjk4MTg4Li4zYTgyODcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKQEAgLTU5LDI0ICs1OSwyMyBAQAogCiAjaW5jbHVkZSAibXB0MnNhc19iYXNlLmgiCiAvKioKLSAqIF90cmFuc3BvcnRfc2FzX25vZGVfZmluZF9ieV9oYW5kbGUgLSBzYXMgbm9kZSBzZWFyY2gKKyAqIF90cmFuc3BvcnRfc2FzX25vZGVfZmluZF9ieV9zYXNfYWRkcmVzcyAtIHNhcyBub2RlIHNlYXJjaAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAaGFuZGxlOiBleHBhbmRlciBvciBoYmEgaGFuZGxlIChhc3NpZ25lZCBieSBmaXJtd2FyZSkKKyAqIEBzYXNfYWRkcmVzczogc2FzIGFkZHJlc3Mgb2YgZXhwYW5kZXIgb3Igc2FzIGhvc3QKICAqIENvbnRleHQ6IENhbGxpbmcgZnVuY3Rpb24gc2hvdWxkIGFjcXVpcmUgaW9jLT5zYXNfbm9kZV9sb2NrLgogICoKICAqIFNlYXJjaCBmb3IgZWl0aGVyIGhiYSBwaHlzIG9yIGV4cGFuZGVyIGRldmljZSBiYXNlZCBvbiBoYW5kbGUsIHRoZW4gcmV0dXJucwogICogdGhlIHNhc19ub2RlIG9iamVjdC4KICAqLwogc3RhdGljIHN0cnVjdCBfc2FzX25vZGUgKgotX3RyYW5zcG9ydF9zYXNfbm9kZV9maW5kX2J5X2hhbmRsZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpCitfdHJhbnNwb3J0X3Nhc19ub2RlX2ZpbmRfYnlfc2FzX2FkZHJlc3Moc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorICAgIHU2NCBzYXNfYWRkcmVzcykKIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBpb2MtPnNhc19oYmEubnVtX3BoeXM7IGkrKykKLQkJaWYgKGlvYy0+c2FzX2hiYS5waHlbaV0uaGFuZGxlID09IGhhbmRsZSkKLQkJCXJldHVybiAmaW9jLT5zYXNfaGJhOwotCi0JcmV0dXJuIG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOworCWlmIChpb2MtPnNhc19oYmEuc2FzX2FkZHJlc3MgPT0gc2FzX2FkZHJlc3MpCisJCXJldHVybiAmaW9jLT5zYXNfaGJhOworCWVsc2UKKwkJcmV0dXJuIG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJCSAgICBzYXNfYWRkcmVzcyk7CiB9CiAKIC8qKgpAQCAtMjU5LDggKzI1OCw3IEBACiAJdTggcmVzcG9uc2VfbGVuZ3RoOwogCXUxNiBleHBhbmRlcl9jaGFuZ2VfY291bnQ7CiAJdTggcmVzZXJ2ZWQwWzJdOwotCXU4IHNhc19mb3JtYXQ6MTsKLQl1OCByZXNlcnZlZDE6NzsKKwl1OCBzYXNfZm9ybWF0OwogCXU4IHJlc2VydmVkMlszXTsKIAl1OCB2ZW5kb3JfaWRbU0FTX0VYUEFOREVSX1ZFTkRPUl9JRF9MRU5dOwogCXU4IHByb2R1Y3RfaWRbU0FTX0VYUEFOREVSX1BST0RVQ1RfSURfTEVOXTsKQEAgLTM3NSw3ICszNzMsOCBAQAogCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CiAJc2FzX2FkZHJlc3NfbGUgPSAodTY0ICopJm1waV9yZXF1ZXN0LT5TQVNBZGRyZXNzOwogCSpzYXNfYWRkcmVzc19sZSA9IGNwdV90b19sZTY0KHNhc19hZGRyZXNzKTsKLQltcGlfcmVxdWVzdC0+UmVxdWVzdERhdGFMZW5ndGggPSBzaXplb2Yoc3RydWN0IHJlcF9tYW51X3JlcXVlc3QpOworCW1waV9yZXF1ZXN0LT5SZXF1ZXN0RGF0YUxlbmd0aCA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgcmVwX21hbnVfcmVxdWVzdCkpOwogCXBzZ2UgPSAmbXBpX3JlcXVlc3QtPlNHTDsKIAogCS8qIFdSSVRFIHNnZWwgZmlyc3QgKi8KQEAgLTQzOCw4ICs0MzcsOCBAQAogCQkgICAgIFNBU19FWFBBTkRFUl9QUk9EVUNUX0lEX0xFTik7CiAJCXN0cm5jcHkoZWRldi0+cHJvZHVjdF9yZXYsIG1hbnVmYWN0dXJlX3JlcGx5LT5wcm9kdWN0X3JldiwKIAkJICAgICBTQVNfRVhQQU5ERVJfUFJPRFVDVF9SRVZfTEVOKTsKLQkJZWRldi0+bGV2ZWwgPSBtYW51ZmFjdHVyZV9yZXBseS0+c2FzX2Zvcm1hdDsKLQkJaWYgKG1hbnVmYWN0dXJlX3JlcGx5LT5zYXNfZm9ybWF0KSB7CisJCWVkZXYtPmxldmVsID0gbWFudWZhY3R1cmVfcmVwbHktPnNhc19mb3JtYXQgJiAxOworCQlpZiAoZWRldi0+bGV2ZWwpIHsKIAkJCXN0cm5jcHkoZWRldi0+Y29tcG9uZW50X3ZlbmRvcl9pZCwKIAkJCSAgICBtYW51ZmFjdHVyZV9yZXBseS0+Y29tcG9uZW50X3ZlbmRvcl9pZCwKIAkJCSAgICAgU0FTX0VYUEFOREVSX0NPTVBPTkVOVF9WRU5ET1JfSURfTEVOKTsKQEAgLTQ2OSw3ICs0NjgsNyBAQAogICogbXB0MnNhc190cmFuc3BvcnRfcG9ydF9hZGQgLSBpbnNlcnQgcG9ydCB0byB0aGUgbGlzdAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAaGFuZGxlOiBoYW5kbGUgb2YgYXR0YWNoZWQgZGV2aWNlCi0gKiBAcGFyZW50X2hhbmRsZTogcGFyZW50IGhhbmRsZShlaXRoZXIgaGJhIG9yIGV4cGFuZGVyKQorICogQHNhc19hZGRyZXNzOiBzYXMgYWRkcmVzcyBvZiBwYXJlbnQgZXhwYW5kZXIgb3Igc2FzIGhvc3QKICAqIENvbnRleHQ6IFRoaXMgZnVuY3Rpb24gd2lsbCBhY3F1aXJlIGlvYy0+c2FzX25vZGVfbG9jay4KICAqCiAgKiBBZGRpbmcgbmV3IHBvcnQgb2JqZWN0IHRvIHRoZSBzYXNfbm9kZS0+c2FzX3BvcnRfbGlzdC4KQEAgLTQ3OCw3ICs0NzcsNyBAQAogICovCiBzdHJ1Y3QgX3Nhc19wb3J0ICoKIG1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfYWRkKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSwKLSAgICB1MTYgcGFyZW50X2hhbmRsZSkKKyAgICB1NjQgc2FzX2FkZHJlc3MpCiB7CiAJc3RydWN0IF9zYXNfcGh5ICptcHQyc2FzX3BoeSwgKm5leHQ7CiAJc3RydWN0IF9zYXNfcG9ydCAqbXB0MnNhc19wb3J0OwpAQCAtNDg4LDkgKzQ4Nyw2IEBACiAJaW50IGk7CiAJc3RydWN0IHNhc19wb3J0ICpwb3J0OwogCi0JaWYgKCFwYXJlbnRfaGFuZGxlKQotCQlyZXR1cm4gTlVMTDsKLQogCW1wdDJzYXNfcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBfc2FzX3BvcnQpLAogCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIW1wdDJzYXNfcG9ydCkgewpAQCAtNTAyLDE3ICs0OTgsMTYgQEAKIAlJTklUX0xJU1RfSEVBRCgmbXB0MnNhc19wb3J0LT5wb3J0X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZtcHQyc2FzX3BvcnQtPnBoeV9saXN0KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7Ci0Jc2FzX25vZGUgPSBfdHJhbnNwb3J0X3Nhc19ub2RlX2ZpbmRfYnlfaGFuZGxlKGlvYywgcGFyZW50X2hhbmRsZSk7CisJc2FzX25vZGUgPSBfdHJhbnNwb3J0X3Nhc19ub2RlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoaW9jLCBzYXNfYWRkcmVzcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIXNhc19ub2RlKSB7Ci0JCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBDb3VsZCBub3QgZmluZCBwYXJlbnQoMHglMDR4KSFcbiIsCi0JCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fLCBwYXJlbnRfaGFuZGxlKTsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IENvdWxkIG5vdCBmaW5kICIKKwkJICAgICJwYXJlbnQgc2FzX2FkZHJlc3MoMHglMDE2bGx4KSFcbiIsIGlvYy0+bmFtZSwKKwkJICAgIF9fZnVuY19fLCAodW5zaWduZWQgbG9uZyBsb25nKXNhc19hZGRyZXNzKTsKIAkJZ290byBvdXRfZmFpbDsKIAl9CiAKLQltcHQyc2FzX3BvcnQtPmhhbmRsZSA9IHBhcmVudF9oYW5kbGU7Ci0JbXB0MnNhc19wb3J0LT5zYXNfYWRkcmVzcyA9IHNhc19ub2RlLT5zYXNfYWRkcmVzczsKIAlpZiAoKF90cmFuc3BvcnRfc2V0X2lkZW50aWZ5KGlvYywgaGFuZGxlLAogCSAgICAmbXB0MnNhc19wb3J0LT5yZW1vdGVfaWRlbnRpZnkpKSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLApAQCAtNjA0LDcgKzU5OSw3IEBACiAgKiBtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZSAtIHJlbW92ZSBwb3J0IGZyb20gdGhlIGxpc3QKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNhc19hZGRyZXNzOiBzYXMgYWRkcmVzcyBvZiBhdHRhY2hlZCBkZXZpY2UKLSAqIEBwYXJlbnRfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIHVwc3RyZWFtIHBhcmVudChlaXRoZXIgaGJhIG9yIGV4cGFuZGVyKQorICogQHNhc19hZGRyZXNzX3BhcmVudDogc2FzIGFkZHJlc3Mgb2YgcGFyZW50IGV4cGFuZGVyIG9yIHNhcyBob3N0CiAgKiBDb250ZXh0OiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWNxdWlyZSBpb2MtPnNhc19ub2RlX2xvY2suCiAgKgogICogUmVtb3Zpbmcgb2JqZWN0IGFuZCBmcmVlaW5nIGFzc29jaWF0ZWQgbWVtb3J5IGZyb20gdGhlCkBAIC02MTQsNyArNjA5LDcgQEAKICAqLwogdm9pZAogbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1NjQgc2FzX2FkZHJlc3MsCi0gICAgdTE2IHBhcmVudF9oYW5kbGUpCisgICAgdTY0IHNhc19hZGRyZXNzX3BhcmVudCkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNjI0LDcgKzYxOSw4IEBACiAJc3RydWN0IF9zYXNfcGh5ICptcHQyc2FzX3BoeSwgKm5leHRfcGh5OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOwotCXNhc19ub2RlID0gX3RyYW5zcG9ydF9zYXNfbm9kZV9maW5kX2J5X2hhbmRsZShpb2MsIHBhcmVudF9oYW5kbGUpOworCXNhc19ub2RlID0gX3RyYW5zcG9ydF9zYXNfbm9kZV9maW5kX2J5X3Nhc19hZGRyZXNzKGlvYywKKwkgICAgc2FzX2FkZHJlc3NfcGFyZW50KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKIAlpZiAoIXNhc19ub2RlKQogCQlyZXR1cm47CkBAIC02NTAsOCArNjQ2LDcgQEAKIAkgICAgJm1wdDJzYXNfcG9ydC0+cGh5X2xpc3QsIHBvcnRfc2libGluZ3MpIHsKIAkJaWYgKChpb2MtPmxvZ2dpbmdfbGV2ZWwgJiBNUFRfREVCVUdfVFJBTlNQT1JUKSkKIAkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmbXB0MnNhc19wb3J0LT5wb3J0LT5kZXYsCi0JCQkgICAgInJlbW92ZTogcGFyZW50X2hhbmRsZSgweCUwNHgpLCAiCi0JCQkgICAgInNhc19hZGRyKDB4JTAxNmxseCksIHBoeSglZClcbiIsIHBhcmVudF9oYW5kbGUsCisJCQkgICAgInJlbW92ZTogc2FzX2FkZHIoMHglMDE2bGx4KSwgcGh5KCVkKVxuIiwKIAkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKQogCQkJICAgIG1wdDJzYXNfcG9ydC0+cmVtb3RlX2lkZW50aWZ5LnNhc19hZGRyZXNzLAogCQkJICAgIG1wdDJzYXNfcGh5LT5waHlfaWQpOwpAQCAtNzk5LDggKzc5NCw4IEBACiAvKioKICAqIG1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcyAtIHJlZnJlc2hpbmcgcGh5IGxpbmsgY2hhbmdlcwogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAaGFuZGxlOiBoYW5kbGUgdG8gc2FzX2hvc3Qgb3IgZXhwYW5kZXIKLSAqIEBhdHRhY2hlZF9oYW5kbGU6IGF0dGFjaGVkIGRldmljZSBoYW5kbGUKKyAqIEBzYXNfYWRkcmVzczogc2FzIGFkZHJlc3Mgb2YgcGFyZW50IGV4cGFuZGVyIG9yIHNhcyBob3N0CisgKiBAaGFuZGxlOiBhdHRhY2hlZCBkZXZpY2UgaGFuZGxlCiAgKiBAcGh5X251bWJlcnY6IHBoeSBudW1iZXIKICAqIEBsaW5rX3JhdGU6IG5ldyBsaW5rIHJhdGUKICAqCkBAIC04MDgsMjggKzgwMywyNSBAQAogICovCiB2b2lkCiBtcHQyc2FzX3RyYW5zcG9ydF91cGRhdGVfbGlua3Moc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAotICAgIHUxNiBoYW5kbGUsIHUxNiBhdHRhY2hlZF9oYW5kbGUsIHU4IHBoeV9udW1iZXIsIHU4IGxpbmtfcmF0ZSkKKyAgICAgdTY0IHNhc19hZGRyZXNzLCB1MTYgaGFuZGxlLCB1OCBwaHlfbnVtYmVyLCB1OCBsaW5rX3JhdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgX3Nhc19ub2RlICpzYXNfbm9kZTsKIAlzdHJ1Y3QgX3Nhc19waHkgKm1wdDJzYXNfcGh5OwogCi0JaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpIHsKLQkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluIHByb2dyZXNzIVxuIiwKLQkJCV9fZnVuY19fLCBpb2MtPm5hbWUpOworCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQogCQlyZXR1cm47Ci0JfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOwotCXNhc19ub2RlID0gX3RyYW5zcG9ydF9zYXNfbm9kZV9maW5kX2J5X2hhbmRsZShpb2MsIGhhbmRsZSk7CisJc2FzX25vZGUgPSBfdHJhbnNwb3J0X3Nhc19ub2RlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoaW9jLCBzYXNfYWRkcmVzcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CiAJaWYgKCFzYXNfbm9kZSkKIAkJcmV0dXJuOwogCiAJbXB0MnNhc19waHkgPSAmc2FzX25vZGUtPnBoeVtwaHlfbnVtYmVyXTsKLQltcHQyc2FzX3BoeS0+YXR0YWNoZWRfaGFuZGxlID0gYXR0YWNoZWRfaGFuZGxlOwotCWlmIChhdHRhY2hlZF9oYW5kbGUgJiYgKGxpbmtfcmF0ZSA+PSBNUEkyX1NBU19ORUdfTElOS19SQVRFXzFfNSkpCi0JCV90cmFuc3BvcnRfc2V0X2lkZW50aWZ5KGlvYywgbXB0MnNhc19waHktPmF0dGFjaGVkX2hhbmRsZSwKKwltcHQyc2FzX3BoeS0+YXR0YWNoZWRfaGFuZGxlID0gaGFuZGxlOworCWlmIChoYW5kbGUgJiYgKGxpbmtfcmF0ZSA+PSBNUEkyX1NBU19ORUdfTElOS19SQVRFXzFfNSkpCisJCV90cmFuc3BvcnRfc2V0X2lkZW50aWZ5KGlvYywgaGFuZGxlLAogCQkgICAgJm1wdDJzYXNfcGh5LT5yZW1vdGVfaWRlbnRpZnkpOwogCWVsc2UKIAkJbWVtc2V0KCZtcHQyc2FzX3BoeS0+cmVtb3RlX2lkZW50aWZ5LCAwICwgc2l6ZW9mKHN0cnVjdApAQCAtODQxLDEzICs4MzMsMTEgQEAKIAogCWlmICgoaW9jLT5sb2dnaW5nX2xldmVsICYgTVBUX0RFQlVHX1RSQU5TUE9SVCkpCiAJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmbXB0MnNhc19waHktPnBoeS0+ZGV2LAotCQkgICAgInJlZnJlc2g6IGhhbmRsZSgweCUwNHgpLCBzYXNfYWRkcigweCUwMTZsbHgpLFxuIgorCQkgICAgInJlZnJlc2g6IHBhcmVudCBzYXNfYWRkcigweCUwMTZsbHgpLFxuIgogCQkgICAgIlx0bGlua19yYXRlKDB4JTAyeCksIHBoeSglZClcbiIKIAkJICAgICJcdGF0dGFjaGVkX2hhbmRsZSgweCUwNHgpLCBzYXNfYWRkcigweCUwMTZsbHgpXG4iLAotCQkgICAgaGFuZGxlLCAodW5zaWduZWQgbG9uZyBsb25nKQotCQkgICAgbXB0MnNhc19waHktPmlkZW50aWZ5LnNhc19hZGRyZXNzLCBsaW5rX3JhdGUsCi0JCSAgICBwaHlfbnVtYmVyLCBhdHRhY2hlZF9oYW5kbGUsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfYWRkcmVzcywKKwkJICAgIGxpbmtfcmF0ZSwgcGh5X251bWJlciwgaGFuZGxlLCAodW5zaWduZWQgbG9uZyBsb25nKQogCQkgICAgbXB0MnNhc19waHktPnJlbW90ZV9pZGVudGlmeS5zYXNfYWRkcmVzcyk7CiB9CiAKQEAgLTExMjYsNyArMTExNiw3IEBACiAJZG1hX2FkZHJfb3V0ID0gcGNpX21hcF9zaW5nbGUoaW9jLT5wZGV2LCBiaW9fZGF0YShyZXEtPmJpbyksCiAJCWJsa19ycV9ieXRlcyhyZXEpLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWlmICghZG1hX2FkZHJfb3V0KSB7Ci0JCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBsZTE2X3RvX2NwdShzbWlkKSk7CisJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBzbWlkKTsKIAkJZ290byB1bm1hcDsKIAl9CiAKQEAgLTExNDQsNyArMTEzNCw3IEBACiAJZG1hX2FkZHJfaW4gPSBwY2lfbWFwX3NpbmdsZShpb2MtPnBkZXYsIGJpb19kYXRhKHJzcC0+YmlvKSwKIAkJCQkgICAgIGJsa19ycV9ieXRlcyhyc3ApLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWlmICghZG1hX2FkZHJfaW4pIHsKLQkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIGxlMTZfdG9fY3B1KHNtaWQpKTsKKwkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIHNtaWQpOwogCQlnb3RvIHVubWFwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jIGIvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jCmluZGV4IGUzYzQ4MmEuLmEyZDU2OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguYworKysgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMKQEAgLTY0OTUsNyArNjQ5NSw3IEBACiAJKioJd2UgZm9yY2UgYSBTSVJfTkVHT19QUk9UTyBpbnRlcnJ1cHQgKGl0IGlzIGEgaGFjayB0aGF0IGF2b2lkcyAKIAkqKglibG9hdCBmb3Igc3VjaCBhIHNob3VsZF9ub3RfaGFwcGVuIHNpdHVhdGlvbikuCiAJKioJSW4gYWxsIG90aGVyIHNpdHVhdGlvbiwgd2UgcmVzZXQgdGhlIEJVUy4KLQkqKglBcmUgdGhlc2UgYXNzdW1wdGlvbnMgcmVhc29ubmFibGUgPyAoV2FpdCBhbmQgc2VlIC4uLikKKwkqKglBcmUgdGhlc2UgYXNzdW1wdGlvbnMgcmVhc29uYWJsZSA/IChXYWl0IGFuZCBzZWUgLi4uKQogCSovCiB1bmV4cGVjdGVkX3BoYXNlOgogCWRzcCAtPSA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25zcDMyLmMgYi9kcml2ZXJzL3Njc2kvbnNwMzIuYwppbmRleCAyYmU3ZDViLi4yYzk4YTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbnNwMzIuYworKysgYi9kcml2ZXJzL3Njc2kvbnNwMzIuYwpAQCAtMTQxOSw3ICsxNDE5LDcgQEAKIAkJbnNwMzJfbXNnKEtFUk5fRVJSLCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBCTUNOVEVSUiBJUlEhICIpOwogCQkvKgogCQkgKiBUT0RPOiBUbyBiZSBpbXBsZW1lbnRlZCBpbXByb3ZpbmcgYnVzIG1hc3RlcgotCQkgKiB0cmFuc2ZlciByZWxpYWJsaXR5IHdoZW4gQk1DTlRFUlIgaXMgb2NjdXJyZWQgaW4KKwkJICogdHJhbnNmZXIgcmVsaWFiaWxpdHkgd2hlbiBCTUNOVEVSUiBpcyBvY2N1cnJlZCBpbgogCQkgKiBBdXRvU0NTSSBwaGFzZSBkZXNjcmliZWQgaW4gc3BlY2lmaWNhdGlvbi4KIAkJICovCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zZC9vc2RfaW5pdGlhdG9yLmMgYi9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYwppbmRleCA3YTExN2MxLi45NTAyMDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYworKysgYi9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYwpAQCAtNzMsNyArNzMsOCBAQAogCiAjZGVmaW5lIEFUVFJfREVGX1JJKGlkLCBsZW4pIEFUVFJfREVGKE9TRF9BUEFHRV9ST09UX0lORk9STUFUSU9OLCBpZCwgbGVuKQogCi1zdGF0aWMgaW50IF9vc2RfcHJpbnRfc3lzdGVtX2luZm8oc3RydWN0IG9zZF9kZXYgKm9kLCB2b2lkICpjYXBzKQorc3RhdGljIGludCBfb3NkX2dldF9wcmludF9zeXN0ZW1faW5mbyhzdHJ1Y3Qgb3NkX2RldiAqb2QsCisJdm9pZCAqY2Fwcywgc3RydWN0IG9zZF9kZXZfaW5mbyAqb2RpKQogewogCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3I7CiAJc3RydWN0IG9zZF9hdHRyIGdldF9hdHRyc1tdID0gewpAQCAtMTM3LDggKzEzOCwxMiBAQAogCU9TRF9JTkZPKCJQUk9EVUNUX1NFUklBTF9OVU1CRVIgIFslc11cbiIsCiAJCShjaGFyICopcEZpcnN0KTsKIAotCXBGaXJzdCA9IGdldF9hdHRyc1thXS52YWxfcHRyOwotCU9TRF9JTkZPKCJPU0RfTkFNRSAgICAgICAgICAgICAgIFslc11cbiIsIChjaGFyICopcEZpcnN0KTsKKwlvZGktPm9zZG5hbWVfbGVuID0gZ2V0X2F0dHJzW2FdLmxlbjsKKwkvKiBBdm9pZCBOVUxMIGZvciBtZW1jbXAgb3B0aW1pemF0aW9uIDAtbGVuZ3RoIGlzIGdvb2QgZW5vdWdoICovCisJb2RpLT5vc2RuYW1lID0ga3phbGxvYyhvZGktPm9zZG5hbWVfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKG9kaS0+b3NkbmFtZV9sZW4pCisJCW1lbWNweShvZGktPm9zZG5hbWUsIGdldF9hdHRyc1thXS52YWxfcHRyLCBvZGktPm9zZG5hbWVfbGVuKTsKKwlPU0RfSU5GTygiT1NEX05BTUUgICAgICAgICAgICAgICBbJXNdXG4iLCBvZGktPm9zZG5hbWUpOwogCWErKzsKIAogCXBGaXJzdCA9IGdldF9hdHRyc1thKytdLnZhbF9wdHI7CkBAIC0xNzEsNiArMTc2LDE0IEBACiAJCQkJICAgc2lkX2R1bXAsIHNpemVvZihzaWRfZHVtcCksIHRydWUpOwogCQlPU0RfSU5GTygiT1NEX1NZU1RFTV9JRCglZClcbiIKIAkJCSAiICAgICAgICBbJXNdXG4iLCBsZW4sIHNpZF9kdW1wKTsKKworCQlpZiAodW5saWtlbHkobGVuID4gc2l6ZW9mKG9kaS0+c3lzdGVtaWQpKSkgeworCQkJT1NEX0VSUigiT1NEIFRhcmdldCBlcnJvcjogT1NEX1NZU1RFTV9JRCB0b28gbG9uZyglZCkuICIKKwkJCQkiZGV2aWNlIGlkZXRpZmljYXRpb24gbWlnaHQgbm90IHdvcmtcbiIsIGxlbik7CisJCQlsZW4gPSBzaXplb2Yob2RpLT5zeXN0ZW1pZCk7CisJCX0KKwkJb2RpLT5zeXN0ZW1pZF9sZW4gPSBsZW47CisJCW1lbWNweShvZGktPnN5c3RlbWlkLCBnZXRfYXR0cnNbYV0udmFsX3B0ciwgbGVuKTsKIAkJYSsrOwogCX0KIG91dDoKQEAgLTE3OCwxNiArMTkxLDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG9zZF9hdXRvX2RldGVjdF92ZXIoc3RydWN0IG9zZF9kZXYgKm9kLCB2b2lkICpjYXBzKQoraW50IG9zZF9hdXRvX2RldGVjdF92ZXIoc3RydWN0IG9zZF9kZXYgKm9kLAorCXZvaWQgKmNhcHMsIHN0cnVjdCBvc2RfZGV2X2luZm8gKm9kaSkKIHsKIAlpbnQgcmV0OwogCiAJLyogQXV0by1kZXRlY3QgdGhlIG9zZCB2ZXJzaW9uICovCi0JcmV0ID0gX29zZF9wcmludF9zeXN0ZW1faW5mbyhvZCwgY2Fwcyk7CisJcmV0ID0gX29zZF9nZXRfcHJpbnRfc3lzdGVtX2luZm8ob2QsIGNhcHMsIG9kaSk7CiAJaWYgKHJldCkgewogCQlvc2RfZGV2X3NldF92ZXIob2QsIE9TRF9WRVIxKTsKIAkJT1NEX0RFQlVHKCJjb252ZXJ0aW5nIHRvIE9TRDFcbiIpOwotCQlyZXQgPSBfb3NkX3ByaW50X3N5c3RlbV9pbmZvKG9kLCBjYXBzKTsKKwkJcmV0ID0gX29zZF9nZXRfcHJpbnRfc3lzdGVtX2luZm8ob2QsIGNhcHMsIG9kaSk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTQ2MSw3ICs0NzUsOCBAQAogCiBpbnQgb3NkX2V4ZWN1dGVfcmVxdWVzdChzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yKQogewotCXJldHVybiBibGtfZXhlY3V0ZV9ycShvci0+cmVxdWVzdC0+cSwgTlVMTCwgb3ItPnJlcXVlc3QsIDApOworCXJldHVybiBvci0+YXN5bmNfZXJyb3IgPQorCQkJYmxrX2V4ZWN1dGVfcnEob3ItPnJlcXVlc3QtPnEsIE5VTEwsIG9yLT5yZXF1ZXN0LCAwKTsKIH0KIEVYUE9SVF9TWU1CT0wob3NkX2V4ZWN1dGVfcmVxdWVzdCk7CiAKQEAgLTQ3MSw4ICs0ODYsMTIgQEAKIAogCW9yLT5hc3luY19lcnJvciA9IGVycm9yOwogCi0JaWYgKGVycm9yKQotCQlPU0RfREVCVUcoIm9zZF9yZXF1ZXN0X2FzeW5jX2RvbmUgZXJyb3IgcmVjaWV2ZWQgJWRcbiIsIGVycm9yKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKSB7CisJCU9TRF9ERUJVRygib3NkX3JlcXVlc3RfYXN5bmNfZG9uZSBlcnJvciByZWNpZXZlZCAlZCAiCisJCQkgICJlcnJvcnMgMHgleFxuIiwgZXJyb3IsIHJlcS0+ZXJyb3JzKTsKKwkJaWYgKCFyZXEtPmVycm9ycykgLyogZG9uJ3QgbWlzcyBvdXQgb24gdGhpcyBvbmUgKi8KKwkJCXJlcS0+ZXJyb3JzID0gZXJyb3I7CisJfQogCiAJaWYgKG9yLT5hc3luY19kb25lKQogCQlvci0+YXN5bmNfZG9uZShvciwgb3ItPmFzeW5jX3ByaXZhdGUpOwpAQCAtMTE1Myw2ICsxMTcyLDcgQEAKIAkJCQkiYz0lZCByPSVkIG49JWRcbiIsCiAJCQkJY3VyX2J5dGVzLCByZXR1cm5lZF9ieXRlcywgbik7CiAJCQlvYS0+dmFsX3B0ciA9IE5VTEw7CisJCQljdXJfYnl0ZXMgPSByZXR1cm5lZF9ieXRlczsgLyogYnJlYWsgdGhlIGNhbGxlciBsb29wICovCiAJCQlicmVhazsKIAkJfQogCkBAIC0xNDM2LDYgKzE0NTYsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0wob3NkX2ZpbmFsaXplX3JlcXVlc3QpOwogCitzdGF0aWMgYm9vbCBfaXNfb3NkX3NlY3VyaXR5X2NvZGUoaW50IGNvZGUpCit7CisJcmV0dXJuCShjb2RlID09IG9zZF9zZWN1cml0eV9hdWRpdF92YWx1ZV9mcm96ZW4pIHx8CisJCShjb2RlID09IG9zZF9zZWN1cml0eV93b3JraW5nX2tleV9mcm96ZW4pIHx8CisJCShjb2RlID09IG9zZF9ub25jZV9ub3RfdW5pcXVlKSB8fAorCQkoY29kZSA9PSBvc2Rfbm9uY2VfdGltZXN0YW1wX291dF9vZl9yYW5nZSkgfHwKKwkJKGNvZGUgPT0gb3NkX2ludmFsaWRfZGF0YW91dF9idWZmZXJfaW50ZWdyaXR5X2NoZWNrX3ZhbHVlKTsKK30KKwogI2RlZmluZSBPU0RfU0VOU0VfUFJJTlQxKGZtdCwgYS4uLikgXAogCWRvIHsgXAogCQlpZiAoX19jdXJfc2Vuc2VfbmVlZF9vdXRwdXQpIFwKQEAgLTE0NTgsOSArMTQ4NywxNiBAQAogI2Vsc2UKIAlib29sIF9fY3VyX3NlbnNlX25lZWRfb3V0cHV0ID0gIXNpbGVudDsKICNlbmRpZgorCWludCByZXQ7CiAKLQlpZiAoIW9yLT5yZXF1ZXN0LT5lcnJvcnMpCisJaWYgKGxpa2VseSghb3ItPnJlcXVlc3QtPmVycm9ycykpIHsKKwkJb3NpLT5vdXRfcmVzaWQgPSAwOworCQlvc2ktPmluX3Jlc2lkID0gMDsKIAkJcmV0dXJuIDA7CisJfQorCisJb3NpID0gb3NpID8gOiAmbG9jYWxfb3NpOworCW1lbXNldChvc2ksIDAsIHNpemVvZigqb3NpKSk7CiAKIAlzc2RiID0gb3ItPnJlcXVlc3QtPnNlbnNlOwogCXNlbnNlX2xlbiA9IG9yLT5yZXF1ZXN0LT5zZW5zZV9sZW47CkBAIC0xNDY4LDE3ICsxNTA0LDE1IEBACiAJCU9TRF9FUlIoIkJsb2NrLWxheWVyIHJldHVybmVkIGVycm9yKDB4JXgpIGJ1dCAiCiAJCQkic2Vuc2VfbGVuKCV1KSB8fCBrZXkoJWQpIGlzIGVtcHR5XG4iLAogCQkJb3ItPnJlcXVlc3QtPmVycm9ycywgc2Vuc2VfbGVuLCBzc2RiLT5zZW5zZV9rZXkpOwotCQlyZXR1cm4gLUVJTzsKKwkJZ290byBhbmFseXplOwogCX0KIAogCWlmICgoc3NkYi0+cmVzcG9uc2VfY29kZSAhPSAweDcyKSAmJiAoc3NkYi0+cmVzcG9uc2VfY29kZSAhPSAweDczKSkgewogCQlPU0RfRVJSKCJVbnJlY29nbml6ZWQgc2NzaSBzZW5zZTogcmNvZGU9JXggbGVuZ3RoPSVkXG4iLAogCQkJc3NkYi0+cmVzcG9uc2VfY29kZSwgc2Vuc2VfbGVuKTsKLQkJcmV0dXJuIC1FSU87CisJCWdvdG8gYW5hbHl6ZTsKIAl9CiAKLQlvc2kgPSBvc2kgPyA6ICZsb2NhbF9vc2k7Ci0JbWVtc2V0KG9zaSwgMCwgc2l6ZW9mKCpvc2kpKTsKIAlvc2ktPmtleSA9IHNzZGItPnNlbnNlX2tleTsKIAlvc2ktPmFkZGl0aW9uYWxfY29kZSA9IGJlMTZfdG9fY3B1KHNzZGItPmFkZGl0aW9uYWxfc2Vuc2VfY29kZSk7CiAJb3JpZ2luYWxfc2Vuc2VfbGVuID0gc3NkYi0+YWRkaXRpb25hbF9zZW5zZV9sZW5ndGggKyA4OwpAQCAtMTQ4OCw5ICsxNTIyLDEwIEBACiAJCV9fY3VyX3NlbnNlX25lZWRfb3V0cHV0ID0gKG9zaS0+a2V5ID4gc2NzaV9za19yZWNvdmVyZWRfZXJyb3IpOwogI2VuZGlmCiAJT1NEX1NFTlNFX1BSSU5UMSgiTWFpbiBTZW5zZSBpbmZvcm1hdGlvbiBrZXk9MHgleCBsZW5ndGgoJWQsICVkKSAiCi0JCQkiYWRkaXRpb25hbF9jb2RlPTB4JXhcbiIsCisJCQkiYWRkaXRpb25hbF9jb2RlPTB4JXggYXN5bmNfZXJyb3I9JWQgZXJyb3JzPTB4JXhcbiIsCiAJCQlvc2ktPmtleSwgb3JpZ2luYWxfc2Vuc2VfbGVuLCBzZW5zZV9sZW4sCi0JCQlvc2ktPmFkZGl0aW9uYWxfY29kZSk7CisJCQlvc2ktPmFkZGl0aW9uYWxfY29kZSwgb3ItPmFzeW5jX2Vycm9yLAorCQkJb3ItPnJlcXVlc3QtPmVycm9ycyk7CiAKIAlpZiAob3JpZ2luYWxfc2Vuc2VfbGVuIDwgc2Vuc2VfbGVuKQogCQlzZW5zZV9sZW4gPSBvcmlnaW5hbF9zZW5zZV9sZW47CkBAIC0xNTY5LDE1ICsxNjA0LDE0IEBACiAJCXsKIAkJCXN0cnVjdCBvc2Rfc2Vuc2VfYXR0cmlidXRlc19kYXRhX2Rlc2NyaXB0b3IKIAkJCQkqb3NhZGQgPSBjdXJfZGVzY3JpcHRvcjsKLQkJCWludCBsZW4gPSBtaW4oY3VyX2xlbiwgc2Vuc2VfbGVuKTsKLQkJCWludCBpID0gMDsKKwkJCXVuc2lnbmVkIGxlbiA9IG1pbihjdXJfbGVuLCBzZW5zZV9sZW4pOwogCQkJc3RydWN0IG9zZF9zZW5zZV9hdHRyICpwYXR0ciA9IG9zYWRkLT5zZW5zZV9hdHRyczsKIAotCQkJd2hpbGUgKGxlbiA8IDApIHsKKwkJCXdoaWxlIChsZW4gPj0gc2l6ZW9mKCpwYXR0cikpIHsKIAkJCQl1MzIgYXR0cl9wYWdlID0gYmUzMl90b19jcHUocGF0dHItPmF0dHJfcGFnZSk7CiAJCQkJdTMyIGF0dHJfaWQgPSBiZTMyX3RvX2NwdShwYXR0ci0+YXR0cl9pZCk7CiAKLQkJCQlpZiAoaSsrID09IDApIHsKKwkJCQlpZiAoIW9zaS0+YXR0ci5hdHRyX3BhZ2UpIHsKIAkJCQkJb3NpLT5hdHRyLmF0dHJfcGFnZSA9IGF0dHJfcGFnZTsKIAkJCQkJb3NpLT5hdHRyLmF0dHJfaWQgPSBhdHRyX2lkOwogCQkJCX0KQEAgLTE1ODgsNiArMTYyMiw4IEBACiAJCQkJCWJhZF9hdHRyX2xpc3QrKzsKIAkJCQkJbWF4X2F0dHItLTsKIAkJCQl9CisKKwkJCQlsZW4gLT0gc2l6ZW9mKCpwYXR0cik7CiAJCQkJT1NEX1NFTlNFX1BSSU5UMigKIAkJCQkJIm9zZF9zZW5zZV9hdHRyaWJ1dGVfaWRlbnRpZmljYXRpb24iCiAJCQkJCSJhdHRyX3BhZ2U9MHgleCBhdHRyX2lkPTB4JXhcbiIsCkBAIC0xNjIxLDcgKzE2NTcsNTAgQEAKIAkJY3VyX2Rlc2NyaXB0b3IgKz0gY3VyX2xlbjsKIAl9CiAKLQlyZXR1cm4gKG9zaS0+a2V5ID4gc2NzaV9za19yZWNvdmVyZWRfZXJyb3IpID8gLUVJTyA6IDA7CithbmFseXplOgorCWlmICghb3NpLT5rZXkpIHsKKwkJLyogc2NzaSBzZW5zZSBpcyBFbXB0eSwgdGhlIHJlcXVlc3Qgd2FzIG5ldmVyIGlzc3VlZCB0byB0YXJnZXQKKwkJICogbGludXggcmV0dXJuIGNvZGUgbWlnaHQgdGVsbCB1cyB3aGF0IGhhcHBlbmVkLgorCQkgKi8KKwkJaWYgKG9yLT5hc3luY19lcnJvciA9PSAtRU5PTUVNKQorCQkJb3NpLT5vc2RfZXJyX3ByaSA9IE9TRF9FUlJfUFJJX1JFU09VUkNFOworCQllbHNlCisJCQlvc2ktPm9zZF9lcnJfcHJpID0gT1NEX0VSUl9QUklfVU5SRUFDSEFCTEU7CisJCXJldCA9IG9yLT5hc3luY19lcnJvcjsKKwl9IGVsc2UgaWYgKG9zaS0+a2V5IDw9IHNjc2lfc2tfcmVjb3ZlcmVkX2Vycm9yKSB7CisJCW9zaS0+b3NkX2Vycl9wcmkgPSAwOworCQlyZXQgPSAwOworCX0gZWxzZSBpZiAob3NpLT5hZGRpdGlvbmFsX2NvZGUgPT0gc2NzaV9pbnZhbGlkX2ZpZWxkX2luX2NkYikgeworCQlpZiAob3NpLT5jZGJfZmllbGRfb2Zmc2V0ID09IE9TRF9DRk9fU1RBUlRJTkdfQllURSkgeworCQkJb3NpLT5vc2RfZXJyX3ByaSA9IE9TRF9FUlJfUFJJX0NMRUFSX1BBR0VTOworCQkJcmV0ID0gLUVGQVVMVDsgLyogY2FsbGVyIHNob3VsZCByZWNvdmVyIGZyb20gdGhpcyAqLworCQl9IGVsc2UgaWYgKG9zaS0+Y2RiX2ZpZWxkX29mZnNldCA9PSBPU0RfQ0ZPX09CSkVDVF9JRCkgeworCQkJb3NpLT5vc2RfZXJyX3ByaSA9IE9TRF9FUlJfUFJJX05PVF9GT1VORDsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCX0gZWxzZSBpZiAob3NpLT5jZGJfZmllbGRfb2Zmc2V0ID09IE9TRF9DRk9fUEVSTUlTU0lPTlMpIHsKKwkJCW9zaS0+b3NkX2Vycl9wcmkgPSBPU0RfRVJSX1BSSV9OT19BQ0NFU1M7CisJCQlyZXQgPSAtRUFDQ0VTOworCQl9IGVsc2UgeworCQkJb3NpLT5vc2RfZXJyX3ByaSA9IE9TRF9FUlJfUFJJX0JBRF9DUkVEOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAob3NpLT5hZGRpdGlvbmFsX2NvZGUgPT0gb3NkX3F1b3RhX2Vycm9yKSB7CisJCW9zaS0+b3NkX2Vycl9wcmkgPSBPU0RfRVJSX1BSSV9OT19TUEFDRTsKKwkJcmV0ID0gLUVOT1NQQzsKKwl9IGVsc2UgaWYgKF9pc19vc2Rfc2VjdXJpdHlfY29kZShvc2ktPmFkZGl0aW9uYWxfY29kZSkpIHsKKwkJb3NpLT5vc2RfZXJyX3ByaSA9IE9TRF9FUlJfUFJJX0JBRF9DUkVEOworCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCW9zaS0+b3NkX2Vycl9wcmkgPSBPU0RfRVJSX1BSSV9FSU87CisJCXJldCA9IC1FSU87CisJfQorCisJaWYgKG9yLT5vdXQucmVxKQorCQlvc2ktPm91dF9yZXNpZCA9IG9yLT5vdXQucmVxLT5yZXNpZF9sZW4gPzogb3ItPm91dC50b3RhbF9ieXRlczsKKwlpZiAob3ItPmluLnJlcSkKKwkJb3NpLT5pbl9yZXNpZCA9IG9yLT5pbi5yZXEtPnJlc2lkX2xlbiA/OiBvci0+aW4udG90YWxfYnl0ZXM7CisKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChvc2RfcmVxX2RlY29kZV9zZW5zZV9mdWxsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zZC9vc2RfdWxkLmMgYi9kcml2ZXJzL3Njc2kvb3NkL29zZF91bGQuYwppbmRleCAwYmRlZjMzLi4wYTkwNzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvb3NkL29zZF91bGQuYworKysgYi9kcml2ZXJzL3Njc2kvb3NkL29zZF91bGQuYwpAQCAtNzEsOCArNzEsNyBAQAogI2RlZmluZSBTQ1NJX09TRF9NQVhfTUlOT1IgNjQKIAogc3RhdGljIGNvbnN0IGNoYXIgb3NkX25hbWVbXSA9ICJvc2QiOwotc3RhdGljIGNvbnN0IGNoYXIgKm9zZF92ZXJzaW9uX3N0cmluZyA9ICJvcGVuLW9zZCAwLjEuMCI7Ci1jb25zdCBjaGFyIG9zZF9zeW1saW5rW10gPSAic2NzaV9vc2QiOworc3RhdGljIGNvbnN0IGNoYXIgKm9zZF92ZXJzaW9uX3N0cmluZyA9ICJvcGVuLW9zZCAwLjIuMCI7CiAKIE1PRFVMRV9BVVRIT1IoIkJvYXogSGFycm9zaCA8YmhhcnJvc2hAcGFuYXNhcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIm9wZW4tb3NkIFVwcGVyLUxheWVyLURyaXZlciBvc2Qua28iKTsKQEAgLTgyLDE1ICs4MSwyNSBAQAogCiBzdHJ1Y3Qgb3NkX3VsZF9kZXZpY2UgewogCWludCBtaW5vcjsKLQlzdHJ1Y3Qga3JlZiBrcmVmOworCXN0cnVjdCBkZXZpY2UgY2xhc3NfZGV2OwogCXN0cnVjdCBjZGV2IGNkZXY7CiAJc3RydWN0IG9zZF9kZXYgb2Q7CisJc3RydWN0IG9zZF9kZXZfaW5mbyBvZGk7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7Ci0Jc3RydWN0IGRldmljZSAqY2xhc3NfbWVtYmVyOwogfTsKIAotc3RhdGljIHZvaWQgX191bGRfZ2V0KHN0cnVjdCBvc2RfdWxkX2RldmljZSAqb3VkKTsKLXN0YXRpYyB2b2lkIF9fdWxkX3B1dChzdHJ1Y3Qgb3NkX3VsZF9kZXZpY2UgKm91ZCk7CitzdHJ1Y3Qgb3NkX2Rldl9oYW5kbGUgeworCXN0cnVjdCBvc2RfZGV2IG9kOworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBvc2RfdWxkX2RldmljZSAqb3VkOworfSA7CisKK3N0YXRpYyBERUZJTkVfSURBKG9zZF9taW5vcl9pZGEpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIG9zZF91bGRfY2xhc3MgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJzY3NpX29zZCIsCit9OwogCiAvKgogICogQ2hhciBEZXZpY2Ugb3BlcmF0aW9ucwpAQCAtMTAxLDcgKzExMCw3IEBACiAJc3RydWN0IG9zZF91bGRfZGV2aWNlICpvdWQgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2RldiwKIAkJCQkJc3RydWN0IG9zZF91bGRfZGV2aWNlLCBjZGV2KTsKIAotCV9fdWxkX2dldChvdWQpOworCWdldF9kZXZpY2UoJm91ZC0+Y2xhc3NfZGV2KTsKIAkvKiBjYWNoZSBvc2RfdWxkX2RldmljZSBvbiBmaWxlIGhhbmRsZSAqLwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IG91ZDsKIAlPU0RfREVCVUcoIm9zZF91bGRfb3BlbiAlcFxuIiwgb3VkKTsKQEAgLTExNCw3ICsxMjMsNyBAQAogCiAJT1NEX0RFQlVHKCJvc2RfdWxkX3JlbGVhc2UgJXBcbiIsIGZpbGUtPnByaXZhdGVfZGF0YSk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlfX3VsZF9wdXQob3VkKTsKKwlwdXRfZGV2aWNlKCZvdWQtPmNsYXNzX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3Nyw3ICsxODYsNyBAQAogc3RydWN0IG9zZF9kZXYgKm9zZHVsZF9wYXRoX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBvc2RfdWxkX2RldmljZSAqb3VkOwotCXN0cnVjdCBvc2RfZGV2ICpvZDsKKwlzdHJ1Y3Qgb3NkX2Rldl9oYW5kbGUgKm9kaDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlpbnQgZXJyb3I7CiAKQEAgLTE4Niw4ICsxOTUsOCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQlvZCA9IGt6YWxsb2Moc2l6ZW9mKCpvZCksIEdGUF9LRVJORUwpOwotCWlmICghb2QpCisJb2RoID0ga3phbGxvYyhzaXplb2YoKm9kaCksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghb2RoKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlmaWxlID0gZmlscF9vcGVuKG5hbWUsIE9fUkRXUiwgMCk7CkBAIC0yMDMsMzMgKzIxMiwxMzQgQEAKIAogCW91ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCSpvZCA9IG91ZC0+b2Q7Ci0Jb2QtPmZpbGUgPSBmaWxlOworCW9kaC0+b2QgPSBvdWQtPm9kOworCW9kaC0+ZmlsZSA9IGZpbGU7CisJb2RoLT5vdWQgPSBvdWQ7CiAKLQlyZXR1cm4gb2Q7CisJcmV0dXJuICZvZGgtPm9kOwogCiBjbG9zZV9maWxlOgogCWZwdXQoZmlsZSk7CiBmcmVlX29kOgotCWtmcmVlKG9kKTsKKwlrZnJlZShvZGgpOwogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIEVYUE9SVF9TWU1CT0wob3NkdWxkX3BhdGhfbG9va3VwKTsKIAorc3RhdGljIGlubGluZSBib29sIF90aGVfc2FtZV9vcl9udWxsKGNvbnN0IHU4ICphMSwgdW5zaWduZWQgYTFfbGVuLAorCQkJCSAgICAgY29uc3QgdTggKmEyLCB1bnNpZ25lZCBhMl9sZW4pCit7CisJaWYgKCFhMl9sZW4pIC8qIFVzZXIgc3RyaW5nIGlzIEVtcHR5IG1lYW5zIGRvbid0IGNhcmUgKi8KKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoYTFfbGVuICE9IGEyX2xlbikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIDAgPT0gbWVtY21wKGExLCBhMiwgYTFfbGVuKTsKK30KKworc3RydWN0IGZpbmRfb3VkX3QgeworCWNvbnN0IHN0cnVjdCBvc2RfZGV2X2luZm8gKm9kaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG9zZF91bGRfZGV2aWNlICpvdWQ7Cit9IDsKKworaW50IF9tYWNoX29kaShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmZpbmRfZGF0YSkKK3sKKwlzdHJ1Y3Qgb3NkX3VsZF9kZXZpY2UgKm91ZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBvc2RfdWxkX2RldmljZSwKKwkJCQkJCSAgY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmluZF9vdWRfdCAqZm90ID0gZmluZF9kYXRhOworCWNvbnN0IHN0cnVjdCBvc2RfZGV2X2luZm8gKm9kaSA9IGZvdC0+b2RpOworCisJaWYgKF90aGVfc2FtZV9vcl9udWxsKG91ZC0+b2RpLnN5c3RlbWlkLCBvdWQtPm9kaS5zeXN0ZW1pZF9sZW4sCisJCQkgICAgICBvZGktPnN5c3RlbWlkLCBvZGktPnN5c3RlbWlkX2xlbikgJiYKKwkgICAgX3RoZV9zYW1lX29yX251bGwob3VkLT5vZGkub3NkbmFtZSwgb3VkLT5vZGkub3NkbmFtZV9sZW4sCisJCQkgICAgICBvZGktPm9zZG5hbWUsIG9kaS0+b3NkbmFtZV9sZW4pKSB7CisJCU9TRF9ERUJVRygiZm91bmQgZGV2aWNlIHN5c2lkX2xlbj0lZCBvc2RuYW1lPSVkXG4iLAorCQkJICBvZGktPnN5c3RlbWlkX2xlbiwgb2RpLT5vc2RuYW1lX2xlbik7CisJCWZvdC0+b3VkID0gb3VkOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIG9zZHVsZF9pbmZvX2xvb2t1cCAtIExvb3AgdGhyb3VnaCBhbGwgZGV2aWNlcywgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgb3NkX2Rldi4KKyAqCisgKiBpZiBAb2RpLT5zeXN0ZW1pZF9sZW4gYW5kL29yIEBvZGktPm9zZG5hbWVfbGVuIGFyZSB6ZXJvLCB0aGV5IGFjdCBhcyBhIGRvbid0CisgKiBjYXJlLiAuZS5nIGlmIHRoZXkncmUgYm90aCB6ZXJvIC9kZXYvb3NkMCBpcyByZXR1cm5lZC4KKyAqLworc3RydWN0IG9zZF9kZXYgKm9zZHVsZF9pbmZvX2xvb2t1cChjb25zdCBzdHJ1Y3Qgb3NkX2Rldl9pbmZvICpvZGkpCit7CisJc3RydWN0IGZpbmRfb3VkX3QgZmluZCA9IHsub2RpID0gb2RpfTsKKworCWZpbmQuZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UoJm9zZF91bGRfY2xhc3MsIE5VTEwsICZmaW5kLCBfbWFjaF9vZGkpOworCWlmIChsaWtlbHkoZmluZC5kZXYpKSB7CisJCXN0cnVjdCBvc2RfZGV2X2hhbmRsZSAqb2RoID0ga3phbGxvYyhzaXplb2YoKm9kaCksIEdGUF9LRVJORUwpOworCisJCWlmICh1bmxpa2VseSghb2RoKSkgeworCQkJcHV0X2RldmljZShmaW5kLmRldik7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJfQorCisJCW9kaC0+b2QgPSBmaW5kLm91ZC0+b2Q7CisJCW9kaC0+b3VkID0gZmluZC5vdWQ7CisKKwkJcmV0dXJuICZvZGgtPm9kOworCX0KKworCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworfQorRVhQT1JUX1NZTUJPTChvc2R1bGRfaW5mb19sb29rdXApOworCiB2b2lkIG9zZHVsZF9wdXRfZGV2aWNlKHN0cnVjdCBvc2RfZGV2ICpvZCkKIHsKLQogCWlmIChvZCAmJiAhSVNfRVJSKG9kKSkgewotCQlzdHJ1Y3Qgb3NkX3VsZF9kZXZpY2UgKm91ZCA9IG9kLT5maWxlLT5wcml2YXRlX2RhdGE7CisJCXN0cnVjdCBvc2RfZGV2X2hhbmRsZSAqb2RoID0KKwkJCQljb250YWluZXJfb2Yob2QsIHN0cnVjdCBvc2RfZGV2X2hhbmRsZSwgb2QpOworCQlzdHJ1Y3Qgb3NkX3VsZF9kZXZpY2UgKm91ZCA9IG9kaC0+b3VkOwogCiAJCUJVR19PTihvZC0+c2NzaV9kZXZpY2UgIT0gb3VkLT5vZC5zY3NpX2RldmljZSk7CiAKLQkJZnB1dChvZC0+ZmlsZSk7Ci0JCWtmcmVlKG9kKTsKKwkJLyogSWYgc2NzaSBoYXMgcmVsZWFzZWQgdGhlIGRldmljZSAobG9nb3V0KSwgYW5kIGV4b2ZzIGhhcyBsYXN0CisJCSAqIHJlZmVyZW5jZSBvbiBvdWQgaXQgd2lsbCBiZSBmcmVlZCBieSBhYm92ZSBvc2RfdWxkX3JlbGVhc2UKKwkJICogd2l0aGluIGZwdXQgYmVsb3cuIEJ1dCB0aGlzIHdpbGwgb29wcyBpbiBjZGV2X3JlbGVhc2Ugd2hpY2gKKwkJICogaXMgY2FsbGVkIGFmdGVyIHRoZSBmb3BzLT5yZWxlYXNlLiBBIGdldF8vcHV0XyBwYWlyIG1ha2VzCisJCSAqIHN1cmUgd2UgaGF2ZSBhIGNkZXYgZm9yIHRoZSBkdXJhdGlvbiBvZiBmcHV0CisJCSAqLworCQlpZiAob2RoLT5maWxlKSB7CisJCQlnZXRfZGV2aWNlKCZvdWQtPmNsYXNzX2Rldik7CisJCQlmcHV0KG9kaC0+ZmlsZSk7CisJCX0KKwkJcHV0X2RldmljZSgmb3VkLT5jbGFzc19kZXYpOworCQlrZnJlZShvZGgpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0wob3NkdWxkX3B1dF9kZXZpY2UpOwogCitjb25zdCBzdHJ1Y3Qgb3NkX2Rldl9pbmZvICpvc2R1bGRfZGV2aWNlX2luZm8oc3RydWN0IG9zZF9kZXYgKm9kKQoreworCXN0cnVjdCBvc2RfZGV2X2hhbmRsZSAqb2RoID0KKwkJCQljb250YWluZXJfb2Yob2QsIHN0cnVjdCBvc2RfZGV2X2hhbmRsZSwgb2QpOworCXJldHVybiAmb2RoLT5vdWQtPm9kaTsKK30KK0VYUE9SVF9TWU1CT0wob3NkdWxkX2RldmljZV9pbmZvKTsKKworYm9vbCBvc2R1bGRfZGV2aWNlX3NhbWUoc3RydWN0IG9zZF9kZXYgKm9kLCBjb25zdCBzdHJ1Y3Qgb3NkX2Rldl9pbmZvICpvZGkpCit7CisJc3RydWN0IG9zZF9kZXZfaGFuZGxlICpvZGggPQorCQkJCWNvbnRhaW5lcl9vZihvZCwgc3RydWN0IG9zZF9kZXZfaGFuZGxlLCBvZCk7CisJc3RydWN0IG9zZF91bGRfZGV2aWNlICpvdWQgPSBvZGgtPm91ZDsKKworCXJldHVybiAob3VkLT5vZGkuc3lzdGVtaWRfbGVuID09IG9kaS0+c3lzdGVtaWRfbGVuKSAmJgorCQlfdGhlX3NhbWVfb3JfbnVsbChvdWQtPm9kaS5zeXN0ZW1pZCwgb3VkLT5vZGkuc3lzdGVtaWRfbGVuLAorCQkJCSBvZGktPnN5c3RlbWlkLCBvZGktPnN5c3RlbWlkX2xlbikgJiYKKwkJKG91ZC0+b2RpLm9zZG5hbWVfbGVuID09IG9kaS0+b3NkbmFtZV9sZW4pICYmCisJCV90aGVfc2FtZV9vcl9udWxsKG91ZC0+b2RpLm9zZG5hbWUsIG91ZC0+b2RpLm9zZG5hbWVfbGVuLAorCQkJCSAgb2RpLT5vc2RuYW1lLCBvZGktPm9zZG5hbWVfbGVuKTsKK30KK0VYUE9SVF9TWU1CT0wob3NkdWxkX2RldmljZV9zYW1lKTsKKwogLyoKICAqIFNjc2kgRGV2aWNlIG9wZXJhdGlvbnMKICAqLwpAQCAtMjUwLDE0ICszNjAsMzUgQEAKIAkJT1NEX0VSUigid2FybmluZzogc2NzaV90ZXN0X3VuaXRfcmVhZHkgZmFpbGVkXG4iKTsKIAogCW9zZF9zZWNfaW5pdF9ub3NlY19kb2FsbF9jYXBzKGNhcHMsICZvc2Rfcm9vdF9vYmplY3QsIGZhbHNlLCB0cnVlKTsKLQlpZiAob3NkX2F1dG9fZGV0ZWN0X3Zlcigmb3VkLT5vZCwgY2FwcykpCisJaWYgKG9zZF9hdXRvX2RldGVjdF92ZXIoJm91ZC0+b2QsIGNhcHMsICZvdWQtPm9kaSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3MgKm9zZF9zeXNmc19jbGFzczsKLXN0YXRpYyBERUZJTkVfSURBKG9zZF9taW5vcl9pZGEpOworc3RhdGljIHZvaWQgX19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBvc2RfdWxkX2RldmljZSAqb3VkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG9zZF91bGRfZGV2aWNlLAorCQkJCQkJICBjbGFzc19kZXYpOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXZpY2UgPSBvdWQtPm9kLnNjc2lfZGV2aWNlOworCisJa2ZyZWUob3VkLT5vZGkub3NkbmFtZSk7CisKKwlpZiAob3VkLT5jZGV2Lm93bmVyKQorCQljZGV2X2RlbCgmb3VkLT5jZGV2KTsKKworCW9zZF9kZXZfZmluaSgmb3VkLT5vZCk7CisJc2NzaV9kZXZpY2VfcHV0KHNjc2lfZGV2aWNlKTsKKworCU9TRF9JTkZPKCJvc2RfcmVtb3ZlICVzXG4iLAorCQkgb3VkLT5kaXNrID8gb3VkLT5kaXNrLT5kaXNrX25hbWUgOiBOVUxMKTsKKworCWlmIChvdWQtPmRpc2spCisJCXB1dF9kaXNrKG91ZC0+ZGlzayk7CisJaWRhX3JlbW92ZSgmb3NkX21pbm9yX2lkYSwgb3VkLT5taW5vcik7CisKKwlrZnJlZShvdWQpOworfQogCiBzdGF0aWMgaW50IG9zZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0yODksNyArNDIwLDYgQEAKIAlpZiAoTlVMTCA9PSBvdWQpCiAJCWdvdG8gZXJyX3JldHJhY3RfbWlub3I7CiAKLQlrcmVmX2luaXQoJm91ZC0+a3JlZik7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgb3VkKTsKIAlvdWQtPm1pbm9yID0gbWlub3I7CiAKQEAgLTMyNywxOCArNDU3LDI1IEBACiAJCU9TRF9FUlIoImNkZXZfYWRkIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX3B1dF9kaXNrOwogCX0KLQlrb2JqZWN0X2dldCgmb3VkLT5jZGV2LmtvYmopOyAvKiAybmQgcmVmIHNlZSBvc2RfcmVtb3ZlKCkgKi8KIAotCS8qIGNsYXNzX21lbWJlciAqLwotCW91ZC0+Y2xhc3NfbWVtYmVyID0gZGV2aWNlX2NyZWF0ZShvc2Rfc3lzZnNfY2xhc3MsIGRldiwKLQkJTUtERVYoU0NTSV9PU0RfTUFKT1IsIG91ZC0+bWlub3IpLCAiJXMiLCBkaXNrLT5kaXNrX25hbWUpOwotCWlmIChJU19FUlIob3VkLT5jbGFzc19tZW1iZXIpKSB7Ci0JCU9TRF9FUlIoImNsYXNzX2RldmljZV9jcmVhdGUgZmFpbGVkXG4iKTsKLQkJZXJyb3IgPSBQVFJfRVJSKG91ZC0+Y2xhc3NfbWVtYmVyKTsKKwkvKiBjbGFzcyBkZXZpY2UgbWVtYmVyICovCisJb3VkLT5jbGFzc19kZXYuZGV2dCA9IG91ZC0+Y2Rldi5kZXY7CisJb3VkLT5jbGFzc19kZXYuY2xhc3MgPSAmb3NkX3VsZF9jbGFzczsKKwlvdWQtPmNsYXNzX2Rldi5wYXJlbnQgPSBkZXY7CisJb3VkLT5jbGFzc19kZXYucmVsZWFzZSA9IF9fcmVtb3ZlOworCWVycm9yID0gZGV2X3NldF9uYW1lKCZvdWQtPmNsYXNzX2RldiwgZGlzay0+ZGlza19uYW1lKTsKKwlpZiAoZXJyb3IpIHsKKwkJT1NEX0VSUigiZGV2X3NldF9uYW1lIGZhaWxlZCA9PiAlZFxuIiwgZXJyb3IpOwogCQlnb3RvIGVycl9wdXRfY2RldjsKIAl9CiAKLQlkZXZfc2V0X2RydmRhdGEob3VkLT5jbGFzc19tZW1iZXIsIG91ZCk7CisJZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJm91ZC0+Y2xhc3NfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJT1NEX0VSUigiZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZCA9PiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycl9wdXRfY2RldjsKKwl9CisKKwlnZXRfZGV2aWNlKCZvdWQtPmNsYXNzX2Rldik7CiAKIAlPU0RfSU5GTygib3NkX3Byb2JlICVzXG4iLCBkaXNrLT5kaXNrX25hbWUpOwogCXJldHVybiAwOwpAQCAtMzY3LDU0ICs1MDQsMTIgQEAKIAkJCXNjc2lfZGV2aWNlKTsKIAl9CiAKLQlpZiAob3VkLT5jbGFzc19tZW1iZXIpCi0JCWRldmljZV9kZXN0cm95KG9zZF9zeXNmc19jbGFzcywKLQkJCSAgICAgICBNS0RFVihTQ1NJX09TRF9NQUpPUiwgb3VkLT5taW5vcikpOworCWRldmljZV91bnJlZ2lzdGVyKCZvdWQtPmNsYXNzX2Rldik7CiAKLQkvKiBXZSBoYXZlIDIgcmVmZXJlbmNlcyB0byB0aGUgY2Rldi4gT25lIGlzIHJlbGVhc2VkIGhlcmUKLQkgKiBhbmQgYWxzbyB0YWtlcyBkb3duIHRoZSAvZGV2L29zZFggbWFwcGluZy4gVGhlIHNlY29uZAotCSAqIFdpbGwgYmUgcmVsZWFzZWQgaW4gX19yZW1vdmUoKSBhZnRlciBhbGwgdXNlcnMgaGF2ZSByZWxlYXNlZAotCSAqIHRoZSBvc2RfdWxkX2RldmljZS4KLQkgKi8KLQlpZiAob3VkLT5jZGV2Lm93bmVyKQotCQljZGV2X2RlbCgmb3VkLT5jZGV2KTsKLQotCV9fdWxkX3B1dChvdWQpOworCXB1dF9kZXZpY2UoJm91ZC0+Y2xhc3NfZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19yZW1vdmUoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IG9zZF91bGRfZGV2aWNlICpvdWQgPSBjb250YWluZXJfb2Yoa3JlZiwKLQkJCQkJc3RydWN0IG9zZF91bGRfZGV2aWNlLCBrcmVmKTsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlID0gb3VkLT5vZC5zY3NpX2RldmljZTsKLQotCS8qIG5vdyBsZXQgZGVsZXRlIHRoZSBjaGFyX2RldiAqLwotCWtvYmplY3RfcHV0KCZvdWQtPmNkZXYua29iaik7Ci0KLQlvc2RfZGV2X2ZpbmkoJm91ZC0+b2QpOwotCXNjc2lfZGV2aWNlX3B1dChzY3NpX2RldmljZSk7Ci0KLQlPU0RfSU5GTygib3NkX3JlbW92ZSAlc1xuIiwKLQkJIG91ZC0+ZGlzayA/IG91ZC0+ZGlzay0+ZGlza19uYW1lIDogTlVMTCk7Ci0KLQlpZiAob3VkLT5kaXNrKQotCQlwdXRfZGlzayhvdWQtPmRpc2spOwotCi0JaWRhX3JlbW92ZSgmb3NkX21pbm9yX2lkYSwgb3VkLT5taW5vcik7Ci0Ja2ZyZWUob3VkKTsKLX0KLQotc3RhdGljIHZvaWQgX191bGRfZ2V0KHN0cnVjdCBvc2RfdWxkX2RldmljZSAqb3VkKQotewotCWtyZWZfZ2V0KCZvdWQtPmtyZWYpOwotfQotCi1zdGF0aWMgdm9pZCBfX3VsZF9wdXQoc3RydWN0IG9zZF91bGRfZGV2aWNlICpvdWQpCi17Ci0Ja3JlZl9wdXQoJm91ZC0+a3JlZiwgX19yZW1vdmUpOwotfQotCiAvKgogICogR2xvYmFsIGRyaXZlciBhbmQgc2NzaSByZWdpc3RyYXRpb24KICAqLwpAQCAtNDMyLDExICs1MjcsMTAgQEAKIHsKIAlpbnQgZXJyOwogCi0Jb3NkX3N5c2ZzX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBvc2Rfc3ltbGluayk7Ci0JaWYgKElTX0VSUihvc2Rfc3lzZnNfY2xhc3MpKSB7Ci0JCU9TRF9FUlIoIlVuYWJsZSB0byByZWdpc3RlciBzeXNmcyBjbGFzcyA9PiAlbGRcbiIsCi0JCQlQVFJfRVJSKG9zZF9zeXNmc19jbGFzcykpOwotCQlyZXR1cm4gUFRSX0VSUihvc2Rfc3lzZnNfY2xhc3MpOworCWVyciA9IGNsYXNzX3JlZ2lzdGVyKCZvc2RfdWxkX2NsYXNzKTsKKwlpZiAoZXJyKSB7CisJCU9TRF9FUlIoIlVuYWJsZSB0byByZWdpc3RlciBzeXNmcyBjbGFzcyA9PiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAllcnIgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFNDU0lfT1NEX01BSk9SLCAwKSwKQEAgLTQ1OSw3ICs1NTMsNyBAQAogZXJyX291dF9jaHJkZXY6CiAJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFNDU0lfT1NEX01BSk9SLCAwKSwgU0NTSV9PU0RfTUFYX01JTk9SKTsKIGVycl9vdXQ6Ci0JY2xhc3NfZGVzdHJveShvc2Rfc3lzZnNfY2xhc3MpOworCWNsYXNzX3VucmVnaXN0ZXIoJm9zZF91bGRfY2xhc3MpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTQ2Nyw3ICs1NjEsNyBAQAogewogCXNjc2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm9zZF9kcml2ZXIuZ2VuZHJ2KTsKIAl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoU0NTSV9PU0RfTUFKT1IsIDApLCBTQ1NJX09TRF9NQVhfTUlOT1IpOwotCWNsYXNzX2Rlc3Ryb3kob3NkX3N5c2ZzX2NsYXNzKTsKKwljbGFzc191bnJlZ2lzdGVyKCZvc2RfdWxkX2NsYXNzKTsKIAlPU0RfSU5GTygiVU5MT0FERUQgJXNcbiIsIG9zZF92ZXJzaW9uX3N0cmluZyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvcG04MDAxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjA0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgS2VybmVsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFBNODAwMSBTQVMvU0FUQSA4eDZHIGJhc2VkIEhCQSBkcml2ZXIKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgIFVTSSBDby4sIEx0ZC4KKworCitvYmotJChDT05GSUdfU0NTSV9QTTgwMDEpICs9IHBtODAwMS5vCitwbTgwMDEteSArPSBwbTgwMDFfaW5pdC5vIFwKKwkJcG04MDAxX3Nhcy5vICBcCisJCXBtODAwMV9jdGwubyAgXAorCQlwbTgwMDFfaHdpLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY2hpcHMuaCBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2NoaXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmYTRkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2NoaXBzLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIFBNQy1TaWVycmEgU1BDIDgwMDEgU0FTL1NBVEEgYmFzZWQgaG9zdCBhZGFwdGVycyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBVU0kgQ28uLCBMdGQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICovCisKKyNpZm5kZWYgX1BNODAwMV9DSElQU19IXworI2RlZmluZSBfUE04MDAxX0NISVBTX0hfCisKK3N0YXRpYyBpbmxpbmUgdTMyIHBtODAwMV9yZWFkXzMyKHZvaWQgKnZpcnRfYWRkcikKK3sKKwlyZXR1cm4gKigodTMyICopdmlydF9hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBtODAwMV93cml0ZV8zMih2b2lkICphZGRyLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCSooKHUzMiAqKShhZGRyICsgb2Zmc2V0KSkgPSB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBtODAwMV9jcjMyKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdTMyIGJhciwKKwkJdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwocG04MDAxX2hhLT5pb19tZW1bYmFyXS5tZW12aXJ0YWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbTgwMDFfY3czMihzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHUzMiBiYXIsCisJCXUzMiBhZGRyLCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIHBtODAwMV9oYS0+aW9fbWVtW2Jhcl0ubWVtdmlydGFkZHIgKyBhZGRyKTsKK30KK3N0YXRpYyBpbmxpbmUgdTMyIHBtODAwMV9tcjMyKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwoYWRkciArIG9mZnNldCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcG04MDAxX213MzIodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIGFkZHIgKyBvZmZzZXQpOworfQorc3RhdGljIGlubGluZSB1MzIgZ2V0X3BjaV9iYXJfaW5kZXgodTMyIHBjaWJhcikKK3sKKwkJc3dpdGNoIChwY2liYXIpIHsKKwkJY2FzZSAweDE4OgorCQljYXNlIDB4MUM6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSAweDIwOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgMHgyNDoKKwkJCXJldHVybiAzOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCisjZW5kaWYgIC8qIF9QTTgwMDFfQ0hJUFNfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIxM2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmMKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBQTUMtU2llcnJhIFNQQyA4MDAxIFNBUy9TQVRBIGJhc2VkIGhvc3QgYWRhcHRlcnMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgVVNJIENvLiwgTHRkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSAicG04MDAxX3Nhcy5oIgorI2luY2x1ZGUgInBtODAwMV9jdGwuaCIKKworLyogc2NzaSBob3N0IGF0dHJpYnV0ZXMgKi8KKworLyoqCisgKiBwbTgwMDFfY3RsX21waV9pbnRlcmZhY2VfcmV2X3Nob3cgLSBNUEkgaW50ZXJmYWNlIHJldmlzaW9uIG51bWJlcgorICogQGNkZXY6IHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCisgKiBAYnVmOiB0aGUgYnVmZmVyIHJldHVybmVkCisgKgorICogQSBzeXNmcyAncmVhZC1vbmx5JyBzaG9zdCBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHBtODAwMV9jdGxfbXBpX2ludGVyZmFjZV9yZXZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgPSBzaGEtPmxsZGRfaGE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190YmwuaW50ZXJmYWNlX3Jldik7Cit9CitzdGF0aWMKK0RFVklDRV9BVFRSKGludGVyZmFjZV9yZXYsIFNfSVJVR08sIHBtODAwMV9jdGxfbXBpX2ludGVyZmFjZV9yZXZfc2hvdywgTlVMTCk7CisKKy8qKgorICogcG04MDAxX2N0bF9md192ZXJzaW9uX3Nob3cgLSBmaXJtd2FyZSB2ZXJzaW9uCisgKiBAY2RldjogcG9pbnRlciB0byBlbWJlZGRlZCBjbGFzcyBkZXZpY2UKKyAqIEBidWY6IHRoZSBidWZmZXIgcmV0dXJuZWQKKyAqCisgKiBBIHN5c2ZzICdyZWFkLW9ubHknIHNob3N0IGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHNzaXplX3QgcG04MDAxX2N0bF9md192ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTAyeC4lMDJ4LiUwMnguJTAyeFxuIiwKKwkJICAgICAgICh1OCkocG04MDAxX2hhLT5tYWluX2NmZ190YmwuZmlybXdhcmVfcmV2ID4+IDI0KSwKKwkJICAgICAgICh1OCkocG04MDAxX2hhLT5tYWluX2NmZ190YmwuZmlybXdhcmVfcmV2ID4+IDE2KSwKKwkJICAgICAgICh1OCkocG04MDAxX2hhLT5tYWluX2NmZ190YmwuZmlybXdhcmVfcmV2ID4+IDgpLAorCQkgICAgICAgKHU4KShwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5maXJtd2FyZV9yZXYpKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihmd192ZXJzaW9uLCBTX0lSVUdPLCBwbTgwMDFfY3RsX2Z3X3ZlcnNpb25fc2hvdywgTlVMTCk7CisvKioKKyAqIHBtODAwMV9jdGxfbWF4X291dF9pb19zaG93IC0gbWF4IG91dHN0YW5kaW5nIGlvIHN1cHBvcnRlZAorICogQGNkZXY6IHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCisgKiBAYnVmOiB0aGUgYnVmZmVyIHJldHVybmVkCisgKgorICogQSBzeXNmcyAncmVhZC1vbmx5JyBzaG9zdCBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHBtODAwMV9jdGxfbWF4X291dF9pb19zaG93KHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHNoYS0+bGxkZF9oYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJcG04MDAxX2hhLT5tYWluX2NmZ190YmwubWF4X291dF9pbyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobWF4X291dF9pbywgU19JUlVHTywgcG04MDAxX2N0bF9tYXhfb3V0X2lvX3Nob3csIE5VTEwpOworLyoqCisgKiBwbTgwMDFfY3RsX21heF9kZXZpY2VzX3Nob3cgLSBtYXggZGV2aWNlcyBzdXBwb3J0CisgKiBAY2RldjogcG9pbnRlciB0byBlbWJlZGRlZCBjbGFzcyBkZXZpY2UKKyAqIEBidWY6IHRoZSBidWZmZXIgcmV0dXJuZWQKKyAqCisgKiBBIHN5c2ZzICdyZWFkLW9ubHknIHNob3N0IGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHNzaXplX3QgcG04MDAxX2N0bF9tYXhfZGV2aWNlc19zaG93KHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHNoYS0+bGxkZF9oYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNGRcbiIsCisJCQkodTE2KShwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5tYXhfc2dsID4+IDE2KSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobWF4X2RldmljZXMsIFNfSVJVR08sIHBtODAwMV9jdGxfbWF4X2RldmljZXNfc2hvdywgTlVMTCk7CisvKioKKyAqIHBtODAwMV9jdGxfbWF4X3NnX2xpc3Rfc2hvdyAtIG1heCBzZyBsaXN0IHN1cHBvcnRlZCBpZmYgbm90IDAuMCBmb3Igbm8KKyAqIGhhcmR3YXJlIGxpbWl0YXRpb24KKyAqIEBjZGV2OiBwb2ludGVyIHRvIGVtYmVkZGVkIGNsYXNzIGRldmljZQorICogQGJ1ZjogdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIEEgc3lzZnMgJ3JlYWQtb25seScgc2hvc3QgYXR0cmlidXRlLgorICovCitzdGF0aWMgc3NpemVfdCBwbTgwMDFfY3RsX21heF9zZ19saXN0X3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTA0ZFxuIiwKKwkJCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm1heF9zZ2wgJiAweDAwMDBGRkZGKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihtYXhfc2dfbGlzdCwgU19JUlVHTywgcG04MDAxX2N0bF9tYXhfc2dfbGlzdF9zaG93LCBOVUxMKTsKKworI2RlZmluZSBTQVNfMV8wIDB4MQorI2RlZmluZSBTQVNfMV8xIDB4MgorI2RlZmluZSBTQVNfMl8wIDB4NAorCitzdGF0aWMgc3NpemVfdAorc2hvd19zYXNfc3BlY19zdXBwb3J0X3N0YXR1cyh1bnNpZ25lZCBpbnQgbW9kZSwgY2hhciAqYnVmKQoreworCXNzaXplX3QgbGVuID0gMDsKKworCWlmIChtb2RlICYgU0FTXzFfMSkKKwkJbGVuID0gc3ByaW50ZihidWYsICIlcyIsICJTQVMxLjEiKTsKKwlpZiAobW9kZSAmIFNBU18yXzApCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzJXMiLCBsZW4gPyAiLCAiIDogIiIsICJTQVMyLjAiKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBwbTgwMDFfY3RsX3Nhc19zcGVjX3N1cHBvcnRfc2hvdyAtIHNhcyBzcGVjIHN1cHBvcnRlZAorICogQGNkZXY6IHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCisgKiBAYnVmOiB0aGUgYnVmZmVyIHJldHVybmVkCisgKgorICogQSBzeXNmcyAncmVhZC1vbmx5JyBzaG9zdCBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHBtODAwMV9jdGxfc2FzX3NwZWNfc3VwcG9ydF9zaG93KHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHNoYS0+bGxkZF9oYTsKKwltb2RlID0gKHBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmN0cmxfY2FwX2ZsYWcgJiAweGZlMDAwMDAwKT4+MjU7CisJcmV0dXJuIHNob3dfc2FzX3NwZWNfc3VwcG9ydF9zdGF0dXMobW9kZSwgYnVmKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzYXNfc3BlY19zdXBwb3J0LCBTX0lSVUdPLAorCQkgICBwbTgwMDFfY3RsX3Nhc19zcGVjX3N1cHBvcnRfc2hvdywgTlVMTCk7CisKKy8qKgorICogcG04MDAxX2N0bF9zYXNfYWRkcmVzc19zaG93IC0gc2FzIGFkZHJlc3MKKyAqIEBjZGV2OiBwb2ludGVyIHRvIGVtYmVkZGVkIGNsYXNzIGRldmljZQorICogQGJ1ZjogdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIFRoaXMgaXMgdGhlIGNvbnRyb2xsZXIgc2FzIGFkZHJlc3MKKyAqCisgKiBBIHN5c2ZzICdyZWFkLW9ubHknIHNob3N0IGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHNzaXplX3QgcG04MDAxX2N0bF9ob3N0X3Nhc19hZGRyZXNzX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTAxNmxseFxuIiwKKwkJCWJlNjRfdG9fY3B1KCooX19iZTY0ICopcG04MDAxX2hhLT5zYXNfYWRkcikpOworfQorc3RhdGljIERFVklDRV9BVFRSKGhvc3Rfc2FzX2FkZHJlc3MsIFNfSVJVR08sCisJCSAgIHBtODAwMV9jdGxfaG9zdF9zYXNfYWRkcmVzc19zaG93LCBOVUxMKTsKKworLyoqCisgKiBwbTgwMDFfY3RsX2xvZ2dpbmdfbGV2ZWxfc2hvdyAtIGxvZ2dpbmcgbGV2ZWwKKyAqIEBjZGV2OiBwb2ludGVyIHRvIGVtYmVkZGVkIGNsYXNzIGRldmljZQorICogQGJ1ZjogdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIEEgc3lzZnMgJ3JlYWQvd3JpdGUnIHNob3N0IGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHNzaXplX3QgcG04MDAxX2N0bF9sb2dnaW5nX2xldmVsX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTA4eGhcbiIsIHBtODAwMV9oYS0+bG9nZ2luZ19sZXZlbCk7Cit9CitzdGF0aWMgc3NpemVfdCBwbTgwMDFfY3RsX2xvZ2dpbmdfbGV2ZWxfc3RvcmUoc3RydWN0IGRldmljZSAqY2RldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgPSBzaGEtPmxsZGRfaGE7CisJaW50IHZhbCA9IDA7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJnZhbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwbTgwMDFfaGEtPmxvZ2dpbmdfbGV2ZWwgPSB2YWw7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobG9nZ2luZ19sZXZlbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJcG04MDAxX2N0bF9sb2dnaW5nX2xldmVsX3Nob3csIHBtODAwMV9jdGxfbG9nZ2luZ19sZXZlbF9zdG9yZSk7CisvKioKKyAqIHBtODAwMV9jdGxfYWFwX2xvZ19zaG93IC0gYWFwMSBldmVudCBsb2cKKyAqIEBjZGV2OiBwb2ludGVyIHRvIGVtYmVkZGVkIGNsYXNzIGRldmljZQorICogQGJ1ZjogdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIEEgc3lzZnMgJ3JlYWQtb25seScgc2hvc3QgYXR0cmlidXRlLgorICovCitzdGF0aWMgc3NpemVfdCBwbTgwMDFfY3RsX2FhcF9sb2dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgPSBzaGEtPmxsZGRfaGE7CisJaW50IGk7CisjZGVmaW5lIEFBUDFfTUVNTUFQKHIsIGMpIFwKKwkoKih1MzIgKikoKHU4KilwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bQUFQMV0udmlydF9wdHIgKyAocikgKiAzMiBcCisJKyAoYykpKQorCisJY2hhciAqc3RyID0gYnVmOworCWludCBtYXggPSAyOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCIKKwkJCSAgICAgICAiMHglMDh4IDB4JTA4eFxuIiwKKwkJCSAgICAgICBBQVAxX01FTU1BUChpLCAwKSwKKwkJCSAgICAgICBBQVAxX01FTU1BUChpLCA0KSwKKwkJCSAgICAgICBBQVAxX01FTU1BUChpLCA4KSwKKwkJCSAgICAgICBBQVAxX01FTU1BUChpLCAxMiksCisJCQkgICAgICAgQUFQMV9NRU1NQVAoaSwgMTYpLAorCQkJICAgICAgIEFBUDFfTUVNTUFQKGksIDIwKSwKKwkJCSAgICAgICBBQVAxX01FTU1BUChpLCAyNCksCisJCQkgICAgICAgQUFQMV9NRU1NQVAoaSwgMjgpKTsKKwl9CisKKwlyZXR1cm4gc3RyIC0gYnVmOworfQorc3RhdGljIERFVklDRV9BVFRSKGFhcF9sb2csIFNfSVJVR08sIHBtODAwMV9jdGxfYWFwX2xvZ19zaG93LCBOVUxMKTsKKy8qKgorICogcG04MDAxX2N0bF9hYXBfbG9nX3Nob3cgLSBJT1AgZXZlbnQgbG9nCisgKiBAY2RldjogcG9pbnRlciB0byBlbWJlZGRlZCBjbGFzcyBkZXZpY2UKKyAqIEBidWY6IHRoZSBidWZmZXIgcmV0dXJuZWQKKyAqCisgKiBBIHN5c2ZzICdyZWFkLW9ubHknIHNob3N0IGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHNzaXplX3QgcG04MDAxX2N0bF9pb3BfbG9nX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworI2RlZmluZSBJT1BfTUVNTUFQKHIsIGMpIFwKKwkoKih1MzIgKikoKHU4KilwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bSU9QXS52aXJ0X3B0ciArIChyKSAqIDMyIFwKKwkrIChjKSkpCisJaW50IGk7CisJY2hhciAqc3RyID0gYnVmOworCWludCBtYXggPSAyOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCIKKwkJCSAgICAgICAiMHglMDh4IDB4JTA4eFxuIiwKKwkJCSAgICAgICBJT1BfTUVNTUFQKGksIDApLAorCQkJICAgICAgIElPUF9NRU1NQVAoaSwgNCksCisJCQkgICAgICAgSU9QX01FTU1BUChpLCA4KSwKKwkJCSAgICAgICBJT1BfTUVNTUFQKGksIDEyKSwKKwkJCSAgICAgICBJT1BfTUVNTUFQKGksIDE2KSwKKwkJCSAgICAgICBJT1BfTUVNTUFQKGksIDIwKSwKKwkJCSAgICAgICBJT1BfTUVNTUFQKGksIDI0KSwKKwkJCSAgICAgICBJT1BfTUVNTUFQKGksIDI4KSk7CisJfQorCisJcmV0dXJuIHN0ciAtIGJ1ZjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihpb3BfbG9nLCBTX0lSVUdPLCBwbTgwMDFfY3RsX2lvcF9sb2dfc2hvdywgTlVMTCk7CisKKyNkZWZpbmUgRkxBU0hfQ01EX05PTkUgICAgICAweDAwCisjZGVmaW5lIEZMQVNIX0NNRF9VUERBVEUgICAgMHgwMQorI2RlZmluZSBGTEFTSF9DTURfU0VUX05WTUQgICAgMHgwMgorCitzdHJ1Y3QgZmxhc2hfY29tbWFuZCB7CisgICAgIHU4ICAgICAgY29tbWFuZFs4XTsKKyAgICAgaW50ICAgICBjb2RlOworfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9jb21tYW5kIGZsYXNoX2NvbW1hbmRfdGFibGVbXSA9Cit7CisgICAgIHsic2V0X252bWQiLCAgICBGTEFTSF9DTURfU0VUX05WTUR9LAorICAgICB7InVwZGF0ZSIsICAgICAgRkxBU0hfQ01EX1VQREFURX0sCisgICAgIHsiIiwgICAgICAgICAgICBGTEFTSF9DTURfTk9ORX0gLyogTGFzdCBlbnRyeSBzaG91bGQgYmUgTlVMTC4gKi8KK307CisKK3N0cnVjdCBlcnJvcl9mdyB7CisgICAgIGNoYXIgICAgKnJlYXNvbjsKKyAgICAgaW50ICAgICBlcnJfY29kZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXJyb3JfZncgZmxhc2hfZXJyb3JfdGFibGVbXSA9Cit7CisgICAgIHsiRmFpbGVkIHRvIG9wZW4gZncgaW1hZ2UgZmlsZSIsCUZBSUxfT1BFTl9CSU9TX0ZJTEV9LAorICAgICB7ImltYWdlIGhlYWRlciBtaXNtYXRjaCIsCQlGTEFTSF9VUERBVEVfSERSX0VSUn0sCisgICAgIHsiaW1hZ2Ugb2Zmc2V0IG1pc21hdGNoIiwJCUZMQVNIX1VQREFURV9PRkZTRVRfRVJSfSwKKyAgICAgeyJpbWFnZSBDUkMgRXJyb3IiLAkJRkxBU0hfVVBEQVRFX0NSQ19FUlJ9LAorICAgICB7ImltYWdlIGxlbmd0aCBFcnJvci4iLAkJRkxBU0hfVVBEQVRFX0xFTkdUSF9FUlJ9LAorICAgICB7IkZhaWxlZCB0byBwcm9ncmFtIGZsYXNoIGNoaXAiLAlGTEFTSF9VUERBVEVfSFdfRVJSfSwKKyAgICAgeyJGbGFzaCBjaGlwIG5vdCBzdXBwb3J0ZWQuIiwJRkxBU0hfVVBEQVRFX0ROTERfTk9UX1NVUFBPUlRFRH0sCisgICAgIHsiRmxhc2ggdXBkYXRlIGRpc2FibGVkLiIsCQlGTEFTSF9VUERBVEVfRElTQUJMRUR9LAorICAgICB7IkZsYXNoIGluIHByb2dyZXNzIiwJCUZMQVNIX0lOX1BST0dSRVNTfSwKKyAgICAgeyJJbWFnZSBmaWxlIHNpemUgRXJyb3IiLAkJRkFJTF9GSUxFX1NJWkV9LAorICAgICB7IklucHV0IHBhcmFtZXRlciBlcnJvciIsCQlGQUlMX1BBUkFNRVRFUlN9LAorICAgICB7Ik91dCBvZiBtZW1vcnkiLAkJCUZBSUxfT1VUX01FTU9SWX0sCisgICAgIHsiT0siLCAwfQkvKiBMYXN0IGVudHJ5IGVycl9jb2RlID0gMC4gKi8KK307CisKK3N0YXRpYyBpbnQgcG04MDAxX3NldF9udm1kKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwlzdHJ1Y3QgcG04MDAxX2lvY3RsX3BheWxvYWQJKnBheWxvYWQ7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcGxldGlvbik7CisJdTgJCSppb2N0bGJ1ZmZlciA9IE5VTEw7CisJdTMyCQlsZW5ndGggPSAwOworCXUzMgkJcmV0ID0gMDsKKworCWxlbmd0aCA9IDEwMjQgKiA1ICsgc2l6ZW9mKCpwYXlsb2FkKSAtIDE7CisJaW9jdGxidWZmZXIgPSBremFsbG9jKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb2N0bGJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChwbTgwMDFfaGEtPmZ3X2ltYWdlLT5zaXplIDw9IDApIHx8CisJICAgIChwbTgwMDFfaGEtPmZ3X2ltYWdlLT5zaXplID4gNDA5NikpIHsKKwkJcmV0ID0gRkFJTF9GSUxFX1NJWkU7CisJCWdvdG8gb3V0OworCX0KKwlwYXlsb2FkID0gKHN0cnVjdCBwbTgwMDFfaW9jdGxfcGF5bG9hZCAqKWlvY3RsYnVmZmVyOworCW1lbWNweSgodTggKilwYXlsb2FkLT5mdW5jX3NwZWNpZmljLCAodTggKilwbTgwMDFfaGEtPmZ3X2ltYWdlLT5kYXRhLAorCQkJCXBtODAwMV9oYS0+ZndfaW1hZ2UtPnNpemUpOworCXBheWxvYWQtPmxlbmd0aCA9IHBtODAwMV9oYS0+ZndfaW1hZ2UtPnNpemU7CisJcGF5bG9hZC0+aWQgPSAwOworCXBtODAwMV9oYS0+bnZtZF9jb21wbGV0aW9uID0gJmNvbXBsZXRpb247CisJcmV0ID0gUE04MDAxX0NISVBfRElTUC0+c2V0X252bWRfcmVxKHBtODAwMV9oYSwgcGF5bG9hZCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGlvbik7CitvdXQ6CisJa2ZyZWUoaW9jdGxidWZmZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG04MDAxX3VwZGF0ZV9mbGFzaChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJc3RydWN0IHBtODAwMV9pb2N0bF9wYXlsb2FkCSpwYXlsb2FkOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRpb24pOworCXU4CQkqaW9jdGxidWZmZXIgPSBOVUxMOworCXUzMgkJbGVuZ3RoID0gMDsKKwlzdHJ1Y3QgZndfY29udHJvbF9pbmZvCSpmd0NvbnRyb2w7CisJdTMyCQlsb29wTnVtYmVyLCBsb29wY291bnQgPSAwOworCXUzMgkJc2l6ZVJlYWQgPSAwOworCXUzMgkJcGFydGl0aW9uU2l6ZSwgcGFydGl0aW9uU2l6ZVRtcDsKKwl1MzIJCXJldCA9IDA7CisJdTMyCQlwYXJ0aXRpb25OdW1iZXIgPSAwOworCXN0cnVjdCBwbTgwMDFfZndfaW1hZ2VfaGVhZGVyICppbWFnZV9oZHI7CisKKwlsZW5ndGggPSAxMDI0ICogMTYgKyBzaXplb2YoKnBheWxvYWQpIC0gMTsKKwlpb2N0bGJ1ZmZlciA9IGt6YWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpbWFnZV9oZHIgPSAoc3RydWN0IHBtODAwMV9md19pbWFnZV9oZWFkZXIgKilwbTgwMDFfaGEtPmZ3X2ltYWdlLT5kYXRhOworCWlmICghaW9jdGxidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChwbTgwMDFfaGEtPmZ3X2ltYWdlLT5zaXplIDwgMjgpIHsKKwkJcmV0ID0gRkFJTF9GSUxFX1NJWkU7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChzaXplUmVhZCA8IHBtODAwMV9oYS0+ZndfaW1hZ2UtPnNpemUpIHsKKwkJcGFydGl0aW9uU2l6ZVRtcCA9CisJCQkqKHUzMiAqKSgodTggKikmaW1hZ2VfaGRyLT5pbWFnZV9sZW5ndGggKyBzaXplUmVhZCk7CisJCXBhcnRpdGlvblNpemUgPSBiZTMyX3RvX2NwdShwYXJ0aXRpb25TaXplVG1wKTsKKwkJbG9vcGNvdW50ID0gKHBhcnRpdGlvblNpemUgKyBIRUFERVJfTEVOKS9JT0NUTF9CVUZfU0laRTsKKwkJaWYgKGxvb3Bjb3VudCAlIElPQ1RMX0JVRl9TSVpFKQorCQkJbG9vcGNvdW50Kys7CisJCWlmIChsb29wY291bnQgPT0gMCkKKwkJCWxvb3Bjb3VudCsrOworCQlmb3IgKGxvb3BOdW1iZXIgPSAwOyBsb29wTnVtYmVyIDwgbG9vcGNvdW50OyBsb29wTnVtYmVyKyspIHsKKwkJCXBheWxvYWQgPSAoc3RydWN0IHBtODAwMV9pb2N0bF9wYXlsb2FkICopaW9jdGxidWZmZXI7CisJCQlwYXlsb2FkLT5sZW5ndGggPSAxMDI0KjE2OworCQkJcGF5bG9hZC0+aWQgPSAwOworCQkJZndDb250cm9sID0KKwkJCSAgICAgIChzdHJ1Y3QgZndfY29udHJvbF9pbmZvICopcGF5bG9hZC0+ZnVuY19zcGVjaWZpYzsKKwkJCWZ3Q29udHJvbC0+bGVuID0gSU9DVExfQlVGX1NJWkU7ICAgLyogSU4gKi8KKwkJCWZ3Q29udHJvbC0+c2l6ZSA9IHBhcnRpdGlvblNpemUgKyBIRUFERVJfTEVOOy8qIElOICovCisJCQlmd0NvbnRyb2wtPnJldGNvZGUgPSAwOy8qIE9VVCAqLworCQkJZndDb250cm9sLT5vZmZzZXQgPSBsb29wTnVtYmVyICogSU9DVExfQlVGX1NJWkU7LypPVVQgKi8KKworCQkvKiBmb3IgdGhlIGxhc3QgY2h1bmsgb2YgZGF0YSBpbiBjYXNlIGZpbGUgc2l6ZSBpcyBub3QgZXZlbiB3aXRoCisJCTRrLCBsb2FkIG9ubHkgdGhlIHJlc3QqLworCQlpZiAoKChsb29wY291bnQtbG9vcE51bWJlcikgPT0gMSkgJiYKKwkJCSgocGFydGl0aW9uU2l6ZSArIEhFQURFUl9MRU4pICUgSU9DVExfQlVGX1NJWkUpKSB7CisJCQlmd0NvbnRyb2wtPmxlbiA9CisJCQkJKHBhcnRpdGlvblNpemUgKyBIRUFERVJfTEVOKSAlIElPQ1RMX0JVRl9TSVpFOworCQkJbWVtY3B5KCh1OCAqKWZ3Q29udHJvbC0+YnVmZmVyLAorCQkJCSh1OCAqKXBtODAwMV9oYS0+ZndfaW1hZ2UtPmRhdGEgKyBzaXplUmVhZCwKKwkJCQkocGFydGl0aW9uU2l6ZSArIEhFQURFUl9MRU4pICUgSU9DVExfQlVGX1NJWkUpOworCQkJc2l6ZVJlYWQgKz0KKwkJCQkocGFydGl0aW9uU2l6ZSArIEhFQURFUl9MRU4pICUgSU9DVExfQlVGX1NJWkU7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoKHU4ICopZndDb250cm9sLT5idWZmZXIsCisJCQkJKHU4ICopcG04MDAxX2hhLT5md19pbWFnZS0+ZGF0YSArIHNpemVSZWFkLAorCQkJCUlPQ1RMX0JVRl9TSVpFKTsKKwkJCXNpemVSZWFkICs9IElPQ1RMX0JVRl9TSVpFOworCQl9CisKKwkJcG04MDAxX2hhLT5udm1kX2NvbXBsZXRpb24gPSAmY29tcGxldGlvbjsKKwkJcmV0ID0gUE04MDAxX0NISVBfRElTUC0+ZndfZmxhc2hfdXBkYXRlX3JlcShwbTgwMDFfaGEsIHBheWxvYWQpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uKTsKKwkJaWYgKHJldCB8fCAoZndDb250cm9sLT5yZXRjb2RlID4gRkxBU0hfVVBEQVRFX0lOX1BST0dSRVNTKSkgeworCQkJcmV0ID0gZndDb250cm9sLT5yZXRjb2RlOworCQkJa2ZyZWUoaW9jdGxidWZmZXIpOworCQkJaW9jdGxidWZmZXIgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJldCkKKwkJYnJlYWs7CisJcGFydGl0aW9uTnVtYmVyKys7Cit9CitvdXQ6CisJa2ZyZWUoaW9jdGxidWZmZXIpOworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgc3NpemVfdCBwbTgwMDFfc3RvcmVfdXBkYXRlX2Z3KHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgPSBzaGEtPmxsZGRfaGE7CisJY2hhciAqY21kX3B0ciwgKmZpbGVuYW1lX3B0cjsKKwlpbnQgcmVzLCBpOworCWludCBmbGFzaF9jb21tYW5kID0gRkxBU0hfQ01EX05PTkU7CisJaW50IGVyciA9IDA7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWNtZF9wdHIgPSBremFsbG9jKGNvdW50KjIsIEdGUF9LRVJORUwpOworCisJaWYgKCFjbWRfcHRyKSB7CisJCWVyciA9IEZBSUxfT1VUX01FTU9SWTsKKwkJZ290byBvdXQ7CisJfQorCisJZmlsZW5hbWVfcHRyID0gY21kX3B0ciArIGNvdW50OworCXJlcyA9IHNzY2FuZihidWYsICIlcyAlcyIsIGNtZF9wdHIsIGZpbGVuYW1lX3B0cik7CisJaWYgKHJlcyAhPSAyKSB7CisJCWVyciA9IEZBSUxfUEFSQU1FVEVSUzsKKwkJZ290byBvdXQxOworCX0KKworCWZvciAoaSA9IDA7IGZsYXNoX2NvbW1hbmRfdGFibGVbaV0uY29kZSAhPSBGTEFTSF9DTURfTk9ORTsgaSsrKSB7CisJCWlmICghbWVtY21wKGZsYXNoX2NvbW1hbmRfdGFibGVbaV0uY29tbWFuZCwKKwkJCQkgY21kX3B0ciwgc3RybGVuKGNtZF9wdHIpKSkgeworCQkJZmxhc2hfY29tbWFuZCA9IGZsYXNoX2NvbW1hbmRfdGFibGVbaV0uY29kZTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmbGFzaF9jb21tYW5kID09IEZMQVNIX0NNRF9OT05FKSB7CisJCWVyciA9IEZBSUxfUEFSQU1FVEVSUzsKKwkJZ290byBvdXQxOworCX0KKworCWlmIChwbTgwMDFfaGEtPmZ3X3N0YXR1cyA9PSBGTEFTSF9JTl9QUk9HUkVTUykgeworCQllcnIgPSBGTEFTSF9JTl9QUk9HUkVTUzsKKwkJZ290byBvdXQxOworCX0KKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZwbTgwMDFfaGEtPmZ3X2ltYWdlLAorCQkJICAgICAgIGZpbGVuYW1lX3B0ciwKKwkJCSAgICAgICBwbTgwMDFfaGEtPmRldik7CisKKwlpZiAoZXJyKSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBpbWFnZSBmaWxlICVzLCIKKwkJCSIgZXJyb3IgJWRcbiIsIGZpbGVuYW1lX3B0ciwgZXJyKSk7CisJCWVyciA9IEZBSUxfT1BFTl9CSU9TX0ZJTEU7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlzd2l0Y2ggKGZsYXNoX2NvbW1hbmQpIHsKKwljYXNlIEZMQVNIX0NNRF9VUERBVEU6CisJCXBtODAwMV9oYS0+Zndfc3RhdHVzID0gRkxBU0hfSU5fUFJPR1JFU1M7CisJCWVyciA9IHBtODAwMV91cGRhdGVfZmxhc2gocG04MDAxX2hhKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DTURfU0VUX05WTUQ6CisJCXBtODAwMV9oYS0+Zndfc3RhdHVzID0gRkxBU0hfSU5fUFJPR1JFU1M7CisJCWVyciA9IHBtODAwMV9zZXRfbnZtZChwbTgwMDFfaGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwbTgwMDFfaGEtPmZ3X3N0YXR1cyA9IEZBSUxfUEFSQU1FVEVSUzsKKwkJZXJyID0gRkFJTF9QQVJBTUVURVJTOworCQlicmVhazsKKwl9CisJcmVsZWFzZV9maXJtd2FyZShwbTgwMDFfaGEtPmZ3X2ltYWdlKTsKK291dDE6CisJa2ZyZWUoY21kX3B0cik7CitvdXQ6CisJcG04MDAxX2hhLT5md19zdGF0dXMgPSBlcnI7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuIGNvdW50OworCWVsc2UKKwkJcmV0dXJuIC1lcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBtODAwMV9zaG93X3VwZGF0ZV9mdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHNoYS0+bGxkZF9oYTsKKworCWZvciAoaSA9IDA7IGZsYXNoX2Vycm9yX3RhYmxlW2ldLmVycl9jb2RlICE9IDA7IGkrKykgeworCQlpZiAoZmxhc2hfZXJyb3JfdGFibGVbaV0uZXJyX2NvZGUgPT0gcG04MDAxX2hhLT5md19zdGF0dXMpCisJCQlicmVhazsKKwl9CisJaWYgKHBtODAwMV9oYS0+Zndfc3RhdHVzICE9IEZMQVNIX0lOX1BST0dSRVNTKQorCQlwbTgwMDFfaGEtPmZ3X3N0YXR1cyA9IEZMQVNIX09LOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAic3RhdHVzPSV4ICVzXG4iLAorCQkJZmxhc2hfZXJyb3JfdGFibGVbaV0uZXJyX2NvZGUsCisJCQlmbGFzaF9lcnJvcl90YWJsZVtpXS5yZWFzb24pOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2Z3LCBTX0lSVUdPfFNfSVdVR08sCisJcG04MDAxX3Nob3dfdXBkYXRlX2Z3LCBwbTgwMDFfc3RvcmVfdXBkYXRlX2Z3KTsKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpwbTgwMDFfaG9zdF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9pbnRlcmZhY2VfcmV2LAorCSZkZXZfYXR0cl9md192ZXJzaW9uLAorCSZkZXZfYXR0cl91cGRhdGVfZncsCisJJmRldl9hdHRyX2FhcF9sb2csCisJJmRldl9hdHRyX2lvcF9sb2csCisJJmRldl9hdHRyX21heF9vdXRfaW8sCisJJmRldl9hdHRyX21heF9kZXZpY2VzLAorCSZkZXZfYXR0cl9tYXhfc2dfbGlzdCwKKwkmZGV2X2F0dHJfc2FzX3NwZWNfc3VwcG9ydCwKKwkmZGV2X2F0dHJfbG9nZ2luZ19sZXZlbCwKKwkmZGV2X2F0dHJfaG9zdF9zYXNfYWRkcmVzcywKKwlOVUxMLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmggYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY0NGRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmgKQEAgLTAsMCArMSw2NyBAQAorIC8qCisgICogUE1DLVNpZXJyYSBTUEMgODAwMSBTQVMvU0FUQSBiYXNlZCBob3N0IGFkYXB0ZXJzIGRyaXZlcgorICAqCisgICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgVVNJIENvLiwgTHRkLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgKiBhcmUgbWV0OgorICAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICAqCisgICogTk8gV0FSUkFOVFkKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICAqCisgICovCisKKyNpZm5kZWYgUE04MDAxX0NUTF9IX0lOQ0xVREVECisjZGVmaW5lIFBNODAwMV9DVExfSF9JTkNMVURFRAorCisjZGVmaW5lIElPQ1RMX0JVRl9TSVpFCQk0MDk2CisjZGVmaW5lIEhFQURFUl9MRU4JCQkyOAorI2RlZmluZSBTSVpFX09GRlNFVAkJCTE2CisKK3N0cnVjdCBwbTgwMDFfaW9jdGxfcGF5bG9hZCB7CisJdTMyCXNpZ25hdHVyZTsKKwl1MTYJbWFqb3JfZnVuY3Rpb247CisJdTE2CW1pbm9yX2Z1bmN0aW9uOworCXUxNglsZW5ndGg7CisJdTE2CXN0YXR1czsKKwl1MTYJb2Zmc2V0OworCXUxNglpZDsKKwl1OAlmdW5jX3NwZWNpZmljWzFdOworfTsKKworI2RlZmluZSBGTEFTSF9PSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwCisjZGVmaW5lIEZBSUxfT1BFTl9CSU9TX0ZJTEUgICAgICAgICAgICAgMHgwMDAxMDAKKyNkZWZpbmUgRkFJTF9GSUxFX1NJWkUgICAgICAgICAgICAgICAgICAweDAwMGEwMAorI2RlZmluZSBGQUlMX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgIDB4MDAwYjAwCisjZGVmaW5lIEZBSUxfT1VUX01FTU9SWSAgICAgICAgICAgICAgICAgMHgwMDBjMDAKKyNkZWZpbmUgRkxBU0hfSU5fUFJPR1JFU1MgICAgICAgICAgICAgICAweDAwMTAwMAorCisjZW5kaWYgLyogUE04MDAxX0NUTF9IX0lOQ0xVREVEICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2RlZnMuaCBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDRhZmFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfZGVmcy5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogUE1DLVNpZXJyYSBTUEMgODAwMSBTQVMvU0FUQSBiYXNlZCBob3N0IGFkYXB0ZXJzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFVTSSBDby4sIEx0ZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKworI2lmbmRlZiBfUE04MDAxX0RFRlNfSF8KKyNkZWZpbmUgX1BNODAwMV9ERUZTX0hfCisKK2VudW0gY2hpcF9mbGF2b3JzIHsKKwljaGlwXzgwMDEsCit9OworI2RlZmluZSBVU0lfTUFYX01FTUNOVAkJCTkKKyNkZWZpbmUgUE04MDAxX01BWF9ETUFfU0cJCVNHX0FMTAorZW51bSBwaHlfc3BlZWQgeworCVBIWV9TUEVFRF8xNSA9IDB4MDEsCisJUEhZX1NQRUVEXzMwID0gMHgwMiwKKwlQSFlfU1BFRURfNjAgPSAweDA0LAorfTsKKworZW51bSBkYXRhX2RpcmVjdGlvbiB7CisJREFUQV9ESVJfTk9ORSA9IDB4MCwJLyogTk8gVFJBTlNGRVIgKi8KKwlEQVRBX0RJUl9JTiA9IDB4MDEsCS8qIElOQk9VTkQgKi8KKwlEQVRBX0RJUl9PVVQgPSAweDAyLAkvKiBPVVRCT1VORCAqLworCURBVEFfRElSX0JZUkVDSVBJRU5UID0gMHgwNCwgLyogVU5TUEVDSUZJRUQgKi8KK307CisKK2VudW0gcG9ydF90eXBlIHsKKwlQT1JUX1RZUEVfU0FTID0gKDFMIDw8IDEpLAorCVBPUlRfVFlQRV9TQVRBID0gKDFMIDw8IDApLAorfTsKKworLyogZHJpdmVyIGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lCVBNODAwMV9NQVhfQ0NCCQkgNTEyCS8qIG1heCBjY2JzIHN1cHBvcnRlZCAqLworI2RlZmluZQlQTTgwMDFfTUFYX0lOQl9OVU0JIDEKKyNkZWZpbmUJUE04MDAxX01BWF9PVVRCX05VTQkgMQorI2RlZmluZQlQTTgwMDFfQ0FOX1FVRVVFCSAxMjgJLyogU0NTSSBRdWV1ZSBkZXB0aCAqLworCisvKiB1bmNoYW5nZWFibGUgaGFyZHdhcmUgZGV0YWlscyAqLworI2RlZmluZQlQTTgwMDFfTUFYX1BIWVMJCSA4CS8qIG1heC4gcG9zc2libGUgcGh5cyAqLworI2RlZmluZQlQTTgwMDFfTUFYX1BPUlRTCSA4CS8qIG1heC4gcG9zc2libGUgcG9ydHMgKi8KKyNkZWZpbmUJUE04MDAxX01BWF9ERVZJQ0VTCSAxMDI0CS8qIG1heCBzdXBwb3J0ZWQgZGV2aWNlICovCisKK2VudW0gbWVtb3J5X3JlZ2lvbl9udW0geworCUFBUDEgPSAweDAsIC8qIGFwcGxpY2F0aW9uIGFjY2VsZXJhdGlvbiBwcm9jZXNzb3IgKi8KKwlJT1AsCSAgICAvKiBJTyBwcm9jZXNzb3IgKi8KKwlDSSwJICAgIC8qIGNvbnN1bWVyIGluZGV4ICovCisJUEksCSAgICAvKiBwcm9kdWNlciBpbmRleCAqLworCUlCLAkgICAgLyogaW5ib3VuZCBxdWV1ZSAqLworCU9CLAkgICAgLyogb3V0Ym91bmQgcXVldWUgKi8KKwlOVk1ELAkgICAgLyogTlZNIGRldmljZSAqLworCURFVl9NRU0sICAgIC8qIG1lbW9yeSBmb3IgZGV2aWNlcyAqLworCUNDQl9NRU0sICAgIC8qIG1lbW9yeSBmb3IgY29tbWFuZCBjb250cm9sIGJsb2NrICovCit9OworI2RlZmluZQlQTTgwMDFfRVZFTlRfTE9HX1NJWkUJICgxMjggKiAxMDI0KQorCisvKmVycm9yIGNvZGUqLworZW51bSBtcGlfZXJyIHsKKwlNUElfSU9fU1RBVFVTX1NVQ0NFU1MgPSAweDAsCisJTVBJX0lPX1NUQVRVU19CVVNZID0gMHgwMSwKKwlNUElfSU9fU1RBVFVTX0ZBSUwgPSAweDAyLAorfTsKKworLyoqCisgKiBQaHkgQ29udHJvbCBjb25zdGFudHMKKyAqLworZW51bSBwaHlfY29udHJvbF90eXBlIHsKKwlQSFlfTElOS19SRVNFVCA9IDB4MDEsCisJUEhZX0hBUkRfUkVTRVQgPSAweDAyLAorCVBIWV9OT1RJRllfRU5BQkxFX1NQSU5VUCA9IDB4MTAsCit9OworCitlbnVtIHBtODAwMV9oYmFfaW5mb19mbGFncyB7CisJUE04MDAxRl9JTklUX1RJTUUJPSAoMVUgPDwgMCksCisJUE04MDAxRl9SVU5fVElNRQk9ICgxVSA8PCAxKSwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RlMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMKQEAgLTAsMCArMSw0NDU4IEBACisvKgorICogUE1DLVNpZXJyYSBTUEMgODAwMSBTQVMvU0FUQSBiYXNlZCBob3N0IGFkYXB0ZXJzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFVTSSBDby4sIEx0ZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKyAjaW5jbHVkZSAicG04MDAxX3Nhcy5oIgorICNpbmNsdWRlICJwbTgwMDFfaHdpLmgiCisgI2luY2x1ZGUgInBtODAwMV9jaGlwcy5oIgorICNpbmNsdWRlICJwbTgwMDFfY3RsLmgiCisKKy8qKgorICogcmVhZF9tYWluX2NvbmZpZ190YWJsZSAtIHJlYWQgdGhlIGNvbmZpZ3VyZSB0YWJsZSBhbmQgc2F2ZSBpdC4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcmVhZF9tYWluX2NvbmZpZ190YWJsZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJdm9pZCBfX2lvbWVtICphZGRyZXNzID0gcG04MDAxX2hhLT5tYWluX2NmZ190YmxfYWRkcjsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5zaWduYXR1cmUJPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDAwKTsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5pbnRlcmZhY2VfcmV2CT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHgwNCk7CisJcG04MDAxX2hhLT5tYWluX2NmZ190YmwuZmlybXdhcmVfcmV2CT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHgwOCk7CisJcG04MDAxX2hhLT5tYWluX2NmZ190YmwubWF4X291dF9pbwk9IHBtODAwMV9tcjMyKGFkZHJlc3MsIDB4MEMpOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm1heF9zZ2wJCT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHgxMCk7CisJcG04MDAxX2hhLT5tYWluX2NmZ190YmwuY3RybF9jYXBfZmxhZwk9IHBtODAwMV9tcjMyKGFkZHJlc3MsIDB4MTQpOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmdzdF9vZmZzZXQJPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDE4KTsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5pbmJvdW5kX3F1ZXVlX29mZnNldCA9CisJCXBtODAwMV9tcjMyKGFkZHJlc3MsIE1BSU5fSUJRX09GRlNFVCk7CisJcG04MDAxX2hhLT5tYWluX2NmZ190Ymwub3V0Ym91bmRfcXVldWVfb2Zmc2V0ID0KKwkJcG04MDAxX21yMzIoYWRkcmVzcywgTUFJTl9PQlFfT0ZGU0VUKTsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5oZGFfbW9kZV9mbGFnCT0KKwkJcG04MDAxX21yMzIoYWRkcmVzcywgTUFJTl9IREFfRkxBR1NfT0ZGU0VUKTsKKworCS8qIHJlYWQgYW5hbG9nIFNldHRpbmcgb2Zmc2V0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdGFibGUgKi8KKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5hbm9sb2dfc2V0dXBfdGFibGVfb2Zmc2V0ID0KKwkJcG04MDAxX21yMzIoYWRkcmVzcywgTUFJTl9BTkFMT0dfU0VUVVBfT0ZGU0VUKTsKKworCS8qIHJlYWQgRXJyb3IgRHVtcCBPZmZzZXQgYW5kIExlbmd0aCAqLworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmZhdGFsX2Vycl9kdW1wX29mZnNldDAgPQorCQlwbTgwMDFfbXIzMihhZGRyZXNzLCBNQUlOX0ZBVEFMX0VSUk9SX1JEVU1QMF9PRkZTRVQpOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmZhdGFsX2Vycl9kdW1wX2xlbmd0aDAgPQorCQlwbTgwMDFfbXIzMihhZGRyZXNzLCBNQUlOX0ZBVEFMX0VSUk9SX1JEVU1QMF9MRU5HVEgpOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmZhdGFsX2Vycl9kdW1wX29mZnNldDEgPQorCQlwbTgwMDFfbXIzMihhZGRyZXNzLCBNQUlOX0ZBVEFMX0VSUk9SX1JEVU1QMV9PRkZTRVQpOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmZhdGFsX2Vycl9kdW1wX2xlbmd0aDEgPQorCQlwbTgwMDFfbXIzMihhZGRyZXNzLCBNQUlOX0ZBVEFMX0VSUk9SX1JEVU1QMV9MRU5HVEgpOworfQorCisvKioKKyAqIHJlYWRfZ2VuZXJhbF9zdGF0dXNfdGFibGUgLSByZWFkIHRoZSBnZW5lcmFsIHN0YXR1cyB0YWJsZSBhbmQgc2F2ZSBpdC4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3JlYWRfZ2VuZXJhbF9zdGF0dXNfdGFibGUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXZvaWQgX19pb21lbSAqYWRkcmVzcyA9IHBtODAwMV9oYS0+Z2VuZXJhbF9zdGF0X3RibF9hZGRyOworCXBtODAwMV9oYS0+Z3NfdGJsLmdzdF9sZW5fbXBpc3RhdGUJPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDAwKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5pcV9mcmVlemVfc3RhdGUwCT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHgwNCk7CisJcG04MDAxX2hhLT5nc190YmwuaXFfZnJlZXplX3N0YXRlMQk9IHBtODAwMV9tcjMyKGFkZHJlc3MsIDB4MDgpOworCXBtODAwMV9oYS0+Z3NfdGJsLm1zZ3VfdGNudAkJPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDBDKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5pb3BfdGNudAkJPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDEwKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5yZXNlcnZlZAkJPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDE0KTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbMF0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDE4KTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbMV0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDFDKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbMl0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDIwKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbM10JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDI0KTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbNF0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDI4KTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbNV0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDJDKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbNl0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDMwKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5waHlfc3RhdGVbN10JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDM0KTsKKwlwbTgwMDFfaGEtPmdzX3RibC5yZXNlcnZlZDEJCT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHgzOCk7CisJcG04MDAxX2hhLT5nc190YmwucmVzZXJ2ZWQyCQk9IHBtODAwMV9tcjMyKGFkZHJlc3MsIDB4M0MpOworCXBtODAwMV9oYS0+Z3NfdGJsLnJlc2VydmVkMwkJPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDQwKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5yZWNvdmVyX2Vycl9pbmZvWzBdCT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHg0NCk7CisJcG04MDAxX2hhLT5nc190YmwucmVjb3Zlcl9lcnJfaW5mb1sxXQk9IHBtODAwMV9tcjMyKGFkZHJlc3MsIDB4NDgpOworCXBtODAwMV9oYS0+Z3NfdGJsLnJlY292ZXJfZXJyX2luZm9bMl0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDRDKTsKKwlwbTgwMDFfaGEtPmdzX3RibC5yZWNvdmVyX2Vycl9pbmZvWzNdCT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHg1MCk7CisJcG04MDAxX2hhLT5nc190YmwucmVjb3Zlcl9lcnJfaW5mb1s0XQk9IHBtODAwMV9tcjMyKGFkZHJlc3MsIDB4NTQpOworCXBtODAwMV9oYS0+Z3NfdGJsLnJlY292ZXJfZXJyX2luZm9bNV0JPSBwbTgwMDFfbXIzMihhZGRyZXNzLCAweDU4KTsKKwlwbTgwMDFfaGEtPmdzX3RibC5yZWNvdmVyX2Vycl9pbmZvWzZdCT0gcG04MDAxX21yMzIoYWRkcmVzcywgMHg1Qyk7CisJcG04MDAxX2hhLT5nc190YmwucmVjb3Zlcl9lcnJfaW5mb1s3XQk9IHBtODAwMV9tcjMyKGFkZHJlc3MsIDB4NjApOworfQorCisvKioKKyAqIHJlYWRfaW5ibmRfcXVldWVfdGFibGUgLSByZWFkIHRoZSBpbmJvdW5kIHF1ZXVlIHRhYmxlIGFuZCBzYXZlIGl0LgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorcmVhZF9pbmJuZF9xdWV1ZV90YWJsZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJaW50IGluYlFfbnVtID0gMTsKKwlpbnQgaTsKKwl2b2lkIF9faW9tZW0gKmFkZHJlc3MgPSBwbTgwMDFfaGEtPmluYm5kX3FfdGJsX2FkZHI7CisJZm9yIChpID0gMDsgaSA8IGluYlFfbnVtOyBpKyspIHsKKwkJdTMyIG9mZnNldCA9IGkgKiAweDIwOworCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW2ldLnBpX3BjaV9iYXIgPQorCQkgICAgICBnZXRfcGNpX2Jhcl9pbmRleChwbTgwMDFfbXIzMihhZGRyZXNzLCAob2Zmc2V0ICsgMHgxNCkpKTsKKwkJcG04MDAxX2hhLT5pbmJuZF9xX3RibFtpXS5waV9vZmZzZXQgPQorCQkJcG04MDAxX21yMzIoYWRkcmVzcywgKG9mZnNldCArIDB4MTgpKTsKKwl9Cit9CisKKy8qKgorICogcmVhZF9vdXRibmRfcXVldWVfdGFibGUgLSByZWFkIHRoZSBvdXRib3VuZCBxdWV1ZSB0YWJsZSBhbmQgc2F2ZSBpdC4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3JlYWRfb3V0Ym5kX3F1ZXVlX3RhYmxlKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwlpbnQgb3V0YlFfbnVtID0gMTsKKwlpbnQgaTsKKwl2b2lkIF9faW9tZW0gKmFkZHJlc3MgPSBwbTgwMDFfaGEtPm91dGJuZF9xX3RibF9hZGRyOworCWZvciAoaSA9IDA7IGkgPCBvdXRiUV9udW07IGkrKykgeworCQl1MzIgb2Zmc2V0ID0gaSAqIDB4MjQ7CisJCXBtODAwMV9oYS0+b3V0Ym5kX3FfdGJsW2ldLmNpX3BjaV9iYXIgPQorCQkgICAgICBnZXRfcGNpX2Jhcl9pbmRleChwbTgwMDFfbXIzMihhZGRyZXNzLCAob2Zmc2V0ICsgMHgxNCkpKTsKKwkJcG04MDAxX2hhLT5vdXRibmRfcV90YmxbaV0uY2lfb2Zmc2V0ID0KKwkJCXBtODAwMV9tcjMyKGFkZHJlc3MsIChvZmZzZXQgKyAweDE4KSk7CisJfQorfQorCisvKioKKyAqIGluaXRfZGVmYXVsdF90YWJsZV92YWx1ZXMgLSBpbml0IHRoZSBkZWZhdWx0IHRhYmxlLgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAoraW5pdF9kZWZhdWx0X3RhYmxlX3ZhbHVlcyhzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJaW50IHFuID0gMTsKKwlpbnQgaTsKKwl1MzIgb2Zmc2V0aWIsIG9mZnNldG9iOworCXZvaWQgX19pb21lbSAqYWRkcmVzc2liID0gcG04MDAxX2hhLT5pbmJuZF9xX3RibF9hZGRyOworCXZvaWQgX19pb21lbSAqYWRkcmVzc29iID0gcG04MDAxX2hhLT5vdXRibmRfcV90YmxfYWRkcjsKKworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmluYm91bmRfcV9ucHBkX2hwcGQJCQk9IDA7CisJcG04MDAxX2hhLT5tYWluX2NmZ190Ymwub3V0Ym91bmRfaHdfZXZlbnRfcGlkMF8zIAkJPSAwOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX2h3X2V2ZW50X3BpZDRfNwkJPSAwOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX25jcV9ldmVudF9waWQwXzMJCT0gMDsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5vdXRib3VuZF9uY3FfZXZlbnRfcGlkNF83CQk9IDA7CisJcG04MDAxX2hhLT5tYWluX2NmZ190Ymwub3V0Ym91bmRfdGd0X0lUTmV4dXNfZXZlbnRfcGlkMF8zCT0gMDsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5vdXRib3VuZF90Z3RfSVROZXh1c19ldmVudF9waWQ0XzcJPSAwOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX3RndF9zc3BfZXZlbnRfcGlkMF8zCT0gMDsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5vdXRib3VuZF90Z3Rfc3NwX2V2ZW50X3BpZDRfNwk9IDA7CisJcG04MDAxX2hhLT5tYWluX2NmZ190Ymwub3V0Ym91bmRfdGd0X3NtcF9ldmVudF9waWQwXzMJPSAwOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX3RndF9zbXBfZXZlbnRfcGlkNF83CT0gMDsKKworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLnVwcGVyX2V2ZW50X2xvZ19hZGRyCQk9CisJCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltBQVAxXS5waHlzX2FkZHJfaGk7CisJcG04MDAxX2hhLT5tYWluX2NmZ190YmwubG93ZXJfZXZlbnRfbG9nX2FkZHIJCT0KKwkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0FBUDFdLnBoeXNfYWRkcl9sbzsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5ldmVudF9sb2dfc2l6ZQk9IFBNODAwMV9FVkVOVF9MT0dfU0laRTsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5ldmVudF9sb2dfb3B0aW9uCQk9IDB4MDE7CisJcG04MDAxX2hhLT5tYWluX2NmZ190YmwudXBwZXJfaW9wX2V2ZW50X2xvZ19hZGRyCT0KKwkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lPUF0ucGh5c19hZGRyX2hpOworCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmxvd2VyX2lvcF9ldmVudF9sb2dfYWRkcgk9CisJCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltJT1BdLnBoeXNfYWRkcl9sbzsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5pb3BfZXZlbnRfbG9nX3NpemUJPSBQTTgwMDFfRVZFTlRfTE9HX1NJWkU7CisJcG04MDAxX2hhLT5tYWluX2NmZ190YmwuaW9wX2V2ZW50X2xvZ19vcHRpb24JCT0gMHgwMTsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5mYXRhbF9lcnJfaW50ZXJydXB0CQk9IDB4MDE7CisJZm9yIChpID0gMDsgaSA8IHFuOyBpKyspIHsKKwkJcG04MDAxX2hhLT5pbmJuZF9xX3RibFtpXS5lbGVtZW50X3ByaV9zaXplX2NudAk9CisJCQkweDAwMDAwMTAwIHwgKDB4MDAwMDAwNDAgPDwgMTYpIHwgKDB4MDA8PDMwKTsKKwkJcG04MDAxX2hhLT5pbmJuZF9xX3RibFtpXS51cHBlcl9iYXNlX2FkZHIJPQorCQkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lCXS5waHlzX2FkZHJfaGk7CisJCXBtODAwMV9oYS0+aW5ibmRfcV90YmxbaV0ubG93ZXJfYmFzZV9hZGRyCT0KKwkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lCXS5waHlzX2FkZHJfbG87CisJCXBtODAwMV9oYS0+aW5ibmRfcV90YmxbaV0uYmFzZV92aXJ0CQk9CisJCQkodTggKilwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bSUJdLnZpcnRfcHRyOworCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW2ldLnRvdGFsX2xlbmd0aAkJPQorCQkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lCXS50b3RhbF9sZW47CisJCXBtODAwMV9oYS0+aW5ibmRfcV90YmxbaV0uY2lfdXBwZXJfYmFzZV9hZGRyCT0KKwkJCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltDSV0ucGh5c19hZGRyX2hpOworCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW2ldLmNpX2xvd2VyX2Jhc2VfYWRkcgk9CisJCQlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bQ0ldLnBoeXNfYWRkcl9sbzsKKwkJcG04MDAxX2hhLT5pbmJuZF9xX3RibFtpXS5jaV92aXJ0CQk9CisJCQlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bQ0ldLnZpcnRfcHRyOworCQlvZmZzZXRpYiA9IGkgKiAweDIwOworCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW2ldLnBpX3BjaV9iYXIJCT0KKwkJCWdldF9wY2lfYmFyX2luZGV4KHBtODAwMV9tcjMyKGFkZHJlc3NpYiwKKwkJCQkob2Zmc2V0aWIgKyAweDE0KSkpOworCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW2ldLnBpX29mZnNldAkJPQorCQkJcG04MDAxX21yMzIoYWRkcmVzc2liLCAob2Zmc2V0aWIgKyAweDE4KSk7CisJCXBtODAwMV9oYS0+aW5ibmRfcV90YmxbaV0ucHJvZHVjZXJfaWR4CQk9IDA7CisJCXBtODAwMV9oYS0+aW5ibmRfcV90YmxbaV0uY29uc3VtZXJfaW5kZXgJPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcW47IGkrKykgeworCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtpXS5lbGVtZW50X3NpemVfY250CT0KKwkJCTI1NiB8ICg2NCA8PCAxNikgfCAoMTw8MzApOworCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtpXS51cHBlcl9iYXNlX2FkZHIJPQorCQkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW09CXS5waHlzX2FkZHJfaGk7CisJCXBtODAwMV9oYS0+b3V0Ym5kX3FfdGJsW2ldLmxvd2VyX2Jhc2VfYWRkcgk9CisJCQlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bT0JdLnBoeXNfYWRkcl9sbzsKKwkJcG04MDAxX2hhLT5vdXRibmRfcV90YmxbaV0uYmFzZV92aXJ0CQk9CisJCQkodTggKilwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bT0JdLnZpcnRfcHRyOworCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtpXS50b3RhbF9sZW5ndGgJCT0KKwkJCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltPQl0udG90YWxfbGVuOworCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtpXS5waV91cHBlcl9iYXNlX2FkZHIJPQorCQkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW1BJXS5waHlzX2FkZHJfaGk7CisJCXBtODAwMV9oYS0+b3V0Ym5kX3FfdGJsW2ldLnBpX2xvd2VyX2Jhc2VfYWRkcgk9CisJCQlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bUEldLnBoeXNfYWRkcl9sbzsKKwkJcG04MDAxX2hhLT5vdXRibmRfcV90YmxbaV0uaW50ZXJydXBfdmVjX2NudF9kZWxheQk9CisJCQkwIHwgKDEwIDw8IDE2KSB8ICgwIDw8IDI0KTsKKwkJcG04MDAxX2hhLT5vdXRibmRfcV90YmxbaV0ucGlfdmlydAkJPQorCQkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW1BJXS52aXJ0X3B0cjsKKwkJb2Zmc2V0b2IgPSBpICogMHgyNDsKKwkJcG04MDAxX2hhLT5vdXRibmRfcV90YmxbaV0uY2lfcGNpX2JhcgkJPQorCQkJZ2V0X3BjaV9iYXJfaW5kZXgocG04MDAxX21yMzIoYWRkcmVzc29iLAorCQkJb2Zmc2V0b2IgKyAweDE0KSk7CisJCXBtODAwMV9oYS0+b3V0Ym5kX3FfdGJsW2ldLmNpX29mZnNldAkJPQorCQkJcG04MDAxX21yMzIoYWRkcmVzc29iLCAob2Zmc2V0b2IgKyAweDE4KSk7CisJCXBtODAwMV9oYS0+b3V0Ym5kX3FfdGJsW2ldLmNvbnN1bWVyX2lkeAkJPSAwOworCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtpXS5wcm9kdWNlcl9pbmRleAk9IDA7CisJfQorfQorCisvKioKKyAqIHVwZGF0ZV9tYWluX2NvbmZpZ190YWJsZSAtIHVwZGF0ZSB0aGUgbWFpbiBkZWZhdWx0IHRhYmxlIHRvIHRoZSBIQkEuCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0Cit1cGRhdGVfbWFpbl9jb25maWdfdGFibGUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXZvaWQgX19pb21lbSAqYWRkcmVzcyA9IHBtODAwMV9oYS0+bWFpbl9jZmdfdGJsX2FkZHI7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHgyNCwKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190YmwuaW5ib3VuZF9xX25wcGRfaHBwZCk7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHgyOCwKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190Ymwub3V0Ym91bmRfaHdfZXZlbnRfcGlkMF8zKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCAweDJDLAorCQlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5vdXRib3VuZF9od19ldmVudF9waWQ0XzcpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIDB4MzAsCisJCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX25jcV9ldmVudF9waWQwXzMpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIDB4MzQsCisJCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX25jcV9ldmVudF9waWQ0XzcpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIDB4MzgsCisJCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX3RndF9JVE5leHVzX2V2ZW50X3BpZDBfMyk7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHgzQywKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190Ymwub3V0Ym91bmRfdGd0X0lUTmV4dXNfZXZlbnRfcGlkNF83KTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCAweDQwLAorCQlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5vdXRib3VuZF90Z3Rfc3NwX2V2ZW50X3BpZDBfMyk7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHg0NCwKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190Ymwub3V0Ym91bmRfdGd0X3NzcF9ldmVudF9waWQ0XzcpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIDB4NDgsCisJCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLm91dGJvdW5kX3RndF9zbXBfZXZlbnRfcGlkMF8zKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCAweDRDLAorCQlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5vdXRib3VuZF90Z3Rfc21wX2V2ZW50X3BpZDRfNyk7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHg1MCwKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190YmwudXBwZXJfZXZlbnRfbG9nX2FkZHIpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIDB4NTQsCisJCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmxvd2VyX2V2ZW50X2xvZ19hZGRyKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCAweDU4LCBwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5ldmVudF9sb2dfc2l6ZSk7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHg1QywgcG04MDAxX2hhLT5tYWluX2NmZ190YmwuZXZlbnRfbG9nX29wdGlvbik7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHg2MCwKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190YmwudXBwZXJfaW9wX2V2ZW50X2xvZ19hZGRyKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCAweDY0LAorCQlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibC5sb3dlcl9pb3BfZXZlbnRfbG9nX2FkZHIpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIDB4NjgsIHBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmlvcF9ldmVudF9sb2dfc2l6ZSk7CisJcG04MDAxX213MzIoYWRkcmVzcywgMHg2QywKKwkJcG04MDAxX2hhLT5tYWluX2NmZ190YmwuaW9wX2V2ZW50X2xvZ19vcHRpb24pOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIDB4NzAsCisJCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsLmZhdGFsX2Vycl9pbnRlcnJ1cHQpOworfQorCisvKioKKyAqIHVwZGF0ZV9pbmJuZF9xdWV1ZV90YWJsZSAtIHVwZGF0ZSB0aGUgaW5ib3VuZCBxdWV1ZSB0YWJsZSB0byB0aGUgSEJBLgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAordXBkYXRlX2luYm5kX3F1ZXVlX3RhYmxlKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgaW50IG51bWJlcikKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHJlc3MgPSBwbTgwMDFfaGEtPmluYm5kX3FfdGJsX2FkZHI7CisJdTE2IG9mZnNldCA9IG51bWJlciAqIDB4MjA7CisJcG04MDAxX213MzIoYWRkcmVzcywgb2Zmc2V0ICsgMHgwMCwKKwkJcG04MDAxX2hhLT5pbmJuZF9xX3RibFtudW1iZXJdLmVsZW1lbnRfcHJpX3NpemVfY250KTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCBvZmZzZXQgKyAweDA0LAorCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW251bWJlcl0udXBwZXJfYmFzZV9hZGRyKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCBvZmZzZXQgKyAweDA4LAorCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW251bWJlcl0ubG93ZXJfYmFzZV9hZGRyKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCBvZmZzZXQgKyAweDBDLAorCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW251bWJlcl0uY2lfdXBwZXJfYmFzZV9hZGRyKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCBvZmZzZXQgKyAweDEwLAorCQlwbTgwMDFfaGEtPmluYm5kX3FfdGJsW251bWJlcl0uY2lfbG93ZXJfYmFzZV9hZGRyKTsKK30KKworLyoqCisgKiB1cGRhdGVfb3V0Ym5kX3F1ZXVlX3RhYmxlIC0gdXBkYXRlIHRoZSBvdXRib3VuZCBxdWV1ZSB0YWJsZSB0byB0aGUgSEJBLgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAordXBkYXRlX291dGJuZF9xdWV1ZV90YWJsZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIGludCBudW1iZXIpCit7CisJdm9pZCBfX2lvbWVtICphZGRyZXNzID0gcG04MDAxX2hhLT5vdXRibmRfcV90YmxfYWRkcjsKKwl1MTYgb2Zmc2V0ID0gbnVtYmVyICogMHgyNDsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCBvZmZzZXQgKyAweDAwLAorCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtudW1iZXJdLmVsZW1lbnRfc2l6ZV9jbnQpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIG9mZnNldCArIDB4MDQsCisJCXBtODAwMV9oYS0+b3V0Ym5kX3FfdGJsW251bWJlcl0udXBwZXJfYmFzZV9hZGRyKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCBvZmZzZXQgKyAweDA4LAorCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtudW1iZXJdLmxvd2VyX2Jhc2VfYWRkcik7CisJcG04MDAxX213MzIoYWRkcmVzcywgb2Zmc2V0ICsgMHgwQywKKwkJcG04MDAxX2hhLT5vdXRibmRfcV90YmxbbnVtYmVyXS5waV91cHBlcl9iYXNlX2FkZHIpOworCXBtODAwMV9tdzMyKGFkZHJlc3MsIG9mZnNldCArIDB4MTAsCisJCXBtODAwMV9oYS0+b3V0Ym5kX3FfdGJsW251bWJlcl0ucGlfbG93ZXJfYmFzZV9hZGRyKTsKKwlwbTgwMDFfbXczMihhZGRyZXNzLCBvZmZzZXQgKyAweDFDLAorCQlwbTgwMDFfaGEtPm91dGJuZF9xX3RibFtudW1iZXJdLmludGVycnVwX3ZlY19jbnRfZGVsYXkpOworfQorCisvKioKKyAqIGJhcjRfc2hpZnQgLSBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2hpZnQgQkFSIGJhc2UgYWRkcmVzcworICogQHBtODAwMV9oYSA6IG91ciBoYmEgY2FyZCBpbmZvbWF0aW9uCisgKiBAc2hpZnRWYWx1ZSA6IHNoaWZ0aW5nIHZhbHVlIGluIG1lbW9yeSBiYXIuCisgKi8KK3N0YXRpYyBpbnQgYmFyNF9zaGlmdChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHUzMiBzaGlmdFZhbHVlKQoreworCXUzMiByZWdWYWw7CisJdTMyIG1heF93YWl0X2NvdW50OworCisJLyogcHJvZ3JhbSB0aGUgaW5ib3VuZCBBWEkgdHJhbnNsYXRpb24gTG93ZXIgQWRkcmVzcyAqLworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMSwgU1BDX0lCV19BWElfVFJBTlNMQVRJT05fTE9XLCBzaGlmdFZhbHVlKTsKKworCS8qIGNvbmZpcm0gdGhlIHNldHRpbmcgaXMgd3JpdHRlbiAqLworCW1heF93YWl0X2NvdW50ID0gMSAqIDEwMDAgKiAxMDAwOyAgLyogMSBzZWMgKi8KKwlkbyB7CisJCXVkZWxheSgxKTsKKwkJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAxLCBTUENfSUJXX0FYSV9UUkFOU0xBVElPTl9MT1cpOworCX0gd2hpbGUgKChyZWdWYWwgIT0gc2hpZnRWYWx1ZSkgJiYgKC0tbWF4X3dhaXRfY291bnQpKTsKKworCWlmICghbWF4X3dhaXRfY291bnQpIHsKKwkJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIlRJTUVPVVQ6U1BDX0lCV19BWElfVFJBTlNMQVRJT05fTE9XIgorCQkJIiA9IDB4JXhcbiIsIHJlZ1ZhbCkpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG1waV9zZXRfcGh5c19nM193aXRoX3NzYworICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKiBAU1NDYml0OiBzZXQgU1NDYml0IHRvIDAgdG8gZGlzYWJsZSBhbGwgcGh5cyBzc2M7IDEgdG8gZW5hYmxlIGFsbCBwaHlzIHNzYy4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0CittcGlfc2V0X3BoeXNfZzNfd2l0aF9zc2Moc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB1MzIgU1NDYml0KQoreworCXUzMiBvZmZzZXQ7CisJdTMyIHZhbHVlOworCXUzMiBpLCBqOworCXUzMiBiaXRfY250OworCisjZGVmaW5lIFNBUzJfU0VUVElOR1NfTE9DQUxfUEhZXzBfM19TSElGVF9BRERSIDB4MDAwMzAwMDAKKyNkZWZpbmUgU0FTMl9TRVRUSU5HU19MT0NBTF9QSFlfNF83X1NISUZUX0FERFIgMHgwMDA0MDAwMAorI2RlZmluZSBTQVMyX1NFVFRJTkdTX0xPQ0FMX1BIWV8wXzNfT0ZGU0VUIDB4MTA3NAorI2RlZmluZSBTQVMyX1NFVFRJTkdTX0xPQ0FMX1BIWV80XzdfT0ZGU0VUIDB4MTA3NAorI2RlZmluZSBQSFlfRzNfV0lUSE9VVF9TU0NfQklUX1NISUZUIDEyCisjZGVmaW5lIFBIWV9HM19XSVRIX1NTQ19CSVRfU0hJRlQgMTMKKyNkZWZpbmUgU05XM19QSFlfQ0FQQUJJTElUSUVTX1BBUklUWSAzMQorCisgICAvKgorICAgICogVXNpbmcgc2hpZnRlZCBkZXN0aW5hdGlvbiBhZGRyZXNzIDB4M18wMDAwOjB4MTA3NCArIDB4NDAwMCpOIChOPTA6MykKKyAgICAqIFVzaW5nIHNoaWZ0ZWQgZGVzdGluYXRpb24gYWRkcmVzcyAweDRfMDAwMDoweDEwNzQgKyAweDQwMDAqKE4tNCkgKE49NDo3KQorICAgICovCisJaWYgKC0xID09IGJhcjRfc2hpZnQocG04MDAxX2hhLCBTQVMyX1NFVFRJTkdTX0xPQ0FMX1BIWV8wXzNfU0hJRlRfQUREUikpCisJCXJldHVybjsKKwkvKiBzZXQgU1NDIGJpdCBvZiBQSFkgMCAtIDMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCW9mZnNldCA9IFNBUzJfU0VUVElOR1NfTE9DQUxfUEhZXzBfM19PRkZTRVQgKyAweDQwMDAgKiBpOworCQl2YWx1ZSA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgb2Zmc2V0KTsKKwkJaWYgKFNTQ2JpdCkgeworCQkJdmFsdWUgfD0gMHgwMDAwMDAwMSA8PCBQSFlfRzNfV0lUSF9TU0NfQklUX1NISUZUOworCQkJdmFsdWUgJj0gfigweDAwMDAwMDAxIDw8IFBIWV9HM19XSVRIT1VUX1NTQ19CSVRfU0hJRlQpOworCQl9IGVsc2UgeworCQkJdmFsdWUgfD0gMHgwMDAwMDAwMSA8PCBQSFlfRzNfV0lUSE9VVF9TU0NfQklUX1NISUZUOworCQkJdmFsdWUgJj0gfigweDAwMDAwMDAxIDw8IFBIWV9HM19XSVRIX1NTQ19CSVRfU0hJRlQpOworCQl9CisJCWJpdF9jbnQgPSAwOworCQlmb3IgKGogPSAwOyBqIDwgMzE7IGorKykKKwkJCWlmICgodmFsdWUgPj4gaikgJiAweDAwMDAwMDAxKQorCQkJCWJpdF9jbnQrKzsKKwkJaWYgKGJpdF9jbnQgJSAyKQorCQkJdmFsdWUgJj0gfigweDAwMDAwMDAxIDw8IFNOVzNfUEhZX0NBUEFCSUxJVElFU19QQVJJVFkpOworCQllbHNlCisJCQl2YWx1ZSB8PSAweDAwMDAwMDAxIDw8IFNOVzNfUEhZX0NBUEFCSUxJVElFU19QQVJJVFk7CisKKwkJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBvZmZzZXQsIHZhbHVlKTsKKwl9CisKKwkvKiBzaGlmdCBtZW1iYXNlIDMgZm9yIFNBUzJfU0VUVElOR1NfTE9DQUxfUEhZIDQgLSA3ICovCisJaWYgKC0xID09IGJhcjRfc2hpZnQocG04MDAxX2hhLCBTQVMyX1NFVFRJTkdTX0xPQ0FMX1BIWV80XzdfU0hJRlRfQUREUikpCisJCXJldHVybjsKKworCS8qIHNldCBTU0MgYml0IG9mIFBIWSA0IC0gNyAqLworCWZvciAoaSA9IDQ7IGkgPCA4OyBpKyspIHsKKwkJb2Zmc2V0ID0gU0FTMl9TRVRUSU5HU19MT0NBTF9QSFlfNF83X09GRlNFVCArIDB4NDAwMCAqIChpLTQpOworCQl2YWx1ZSA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgb2Zmc2V0KTsKKwkJaWYgKFNTQ2JpdCkgeworCQkJdmFsdWUgfD0gMHgwMDAwMDAwMSA8PCBQSFlfRzNfV0lUSF9TU0NfQklUX1NISUZUOworCQkJdmFsdWUgJj0gfigweDAwMDAwMDAxIDw8IFBIWV9HM19XSVRIT1VUX1NTQ19CSVRfU0hJRlQpOworCQl9IGVsc2UgeworCQkJdmFsdWUgfD0gMHgwMDAwMDAwMSA8PCBQSFlfRzNfV0lUSE9VVF9TU0NfQklUX1NISUZUOworCQkJdmFsdWUgJj0gfigweDAwMDAwMDAxIDw8IFBIWV9HM19XSVRIX1NTQ19CSVRfU0hJRlQpOworCQl9CisJCWJpdF9jbnQgPSAwOworCQlmb3IgKGogPSAwOyBqIDwgMzE7IGorKykKKwkJCWlmICgodmFsdWUgPj4gaikgJiAweDAwMDAwMDAxKQorCQkJCWJpdF9jbnQrKzsKKwkJaWYgKGJpdF9jbnQgJSAyKQorCQkJdmFsdWUgJj0gfigweDAwMDAwMDAxIDw8IFNOVzNfUEhZX0NBUEFCSUxJVElFU19QQVJJVFkpOworCQllbHNlCisJCQl2YWx1ZSB8PSAweDAwMDAwMDAxIDw8IFNOVzNfUEhZX0NBUEFCSUxJVElFU19QQVJJVFk7CisKKwkJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBvZmZzZXQsIHZhbHVlKTsKKwl9CisKKwkvKnNldCB0aGUgc2hpZnRlZCBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIDB4MCB0byBhdm9pZCBlcnJvciBvcGVyYXRpb24gKi8KKwliYXI0X3NoaWZ0KHBtODAwMV9oYSwgMHgwKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbXBpX3NldF9vcGVuX3JldHJ5X2ludGVydmFsX3JlZworICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKiBAaW50ZXJ2YWwgLSBpbnRlcnZhbCB0aW1lIGZvciBlYWNoIE9QRU5fUkVKRUNUIChSRVRSWSkuIFRoZSB1bml0cyBhcmUgaW4gMXVzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK21waV9zZXRfb3Blbl9yZXRyeV9pbnRlcnZhbF9yZWcoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCQkJCXUzMiBpbnRlcnZhbCkKK3sKKwl1MzIgb2Zmc2V0OworCXUzMiB2YWx1ZTsKKwl1MzIgaTsKKworI2RlZmluZSBPUEVOX1JFVFJZX0lOVEVSVkFMX1BIWV8wXzNfU0hJRlRfQUREUiAweDAwMDMwMDAwCisjZGVmaW5lIE9QRU5fUkVUUllfSU5URVJWQUxfUEhZXzRfN19TSElGVF9BRERSIDB4MDAwNDAwMDAKKyNkZWZpbmUgT1BFTl9SRVRSWV9JTlRFUlZBTF9QSFlfMF8zX09GRlNFVCAweDMwQjQKKyNkZWZpbmUgT1BFTl9SRVRSWV9JTlRFUlZBTF9QSFlfNF83X09GRlNFVCAweDMwQjQKKyNkZWZpbmUgT1BFTl9SRVRSWV9JTlRFUlZBTF9SRUdfTUFTSyAweDAwMDBGRkZGCisKKwl2YWx1ZSA9IGludGVydmFsICYgT1BFTl9SRVRSWV9JTlRFUlZBTF9SRUdfTUFTSzsKKwkvKiBzaGlmdCBiYXIgYW5kIHNldCB0aGUgT1BFTl9SRUpFQ1QoUkVUUlkpIGludGVydmFsIHRpbWUgb2YgUEhZIDAgLTMuKi8KKwlpZiAoLTEgPT0gYmFyNF9zaGlmdChwbTgwMDFfaGEsCisJCQkgICAgIE9QRU5fUkVUUllfSU5URVJWQUxfUEhZXzBfM19TSElGVF9BRERSKSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJb2Zmc2V0ID0gT1BFTl9SRVRSWV9JTlRFUlZBTF9QSFlfMF8zX09GRlNFVCArIDB4NDAwMCAqIGk7CisJCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMiwgb2Zmc2V0LCB2YWx1ZSk7CisJfQorCisJaWYgKC0xID09IGJhcjRfc2hpZnQocG04MDAxX2hhLAorCQkJICAgICBPUEVOX1JFVFJZX0lOVEVSVkFMX1BIWV80XzdfU0hJRlRfQUREUikpCisJCXJldHVybjsKKwlmb3IgKGkgPSA0OyBpIDwgODsgaSsrKSB7CisJCW9mZnNldCA9IE9QRU5fUkVUUllfSU5URVJWQUxfUEhZXzRfN19PRkZTRVQgKyAweDQwMDAgKiAoaS00KTsKKwkJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBvZmZzZXQsIHZhbHVlKTsKKwl9CisJLypzZXQgdGhlIHNoaWZ0ZWQgZGVzdGluYXRpb24gYWRkcmVzcyB0byAweDAgdG8gYXZvaWQgZXJyb3Igb3BlcmF0aW9uICovCisJYmFyNF9zaGlmdChwbTgwMDFfaGEsIDB4MCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG1waV9pbml0X2NoZWNrIC0gY2hlY2sgZmlybXdhcmUgaW5pdGlhbGl6YXRpb24gc3RhdHVzLgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyBpbnQgbXBpX2luaXRfY2hlY2soc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXUzMiBtYXhfd2FpdF9jb3VudDsKKwl1MzIgdmFsdWU7CisJdTMyIGdzdF9sZW5fbXBpc3RhdGU7CisJLyogV3JpdGUgYml0MD0xIHRvIEluYm91bmQgRG9vckJlbGwgUmVnaXN0ZXIgdG8gdGVsbCB0aGUgU1BDIEZXIHRoZQorCXRhYmxlIGlzIHVwZGF0ZWQgKi8KKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDAsIE1TR1VfSUJEQl9TRVQsIFNQQ19NU0dVX0NGR19UQUJMRV9VUERBVEUpOworCS8qIHdhaXQgdW50aWwgSW5ib3VuZCBEb29yQmVsbCBDbGVhciBSZWdpc3RlciB0b2dnbGVkICovCisJbWF4X3dhaXRfY291bnQgPSAxICogMTAwMCAqIDEwMDA7LyogMSBzZWMgKi8KKwlkbyB7CisJCXVkZWxheSgxKTsKKwkJdmFsdWUgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfSUJEQl9TRVQpOworCQl2YWx1ZSAmPSBTUENfTVNHVV9DRkdfVEFCTEVfVVBEQVRFOworCX0gd2hpbGUgKCh2YWx1ZSAhPSAwKSAmJiAoLS1tYXhfd2FpdF9jb3VudCkpOworCisJaWYgKCFtYXhfd2FpdF9jb3VudCkKKwkJcmV0dXJuIC0xOworCS8qIGNoZWNrIHRoZSBNUEktU3RhdGUgZm9yIGluaXRpYWxpemF0aW9uICovCisJZ3N0X2xlbl9tcGlzdGF0ZSA9CisJCXBtODAwMV9tcjMyKHBtODAwMV9oYS0+Z2VuZXJhbF9zdGF0X3RibF9hZGRyLAorCQlHU1RfR1NUTEVOX01QSVNfT0ZGU0VUKTsKKwlpZiAoR1NUX01QSV9TVEFURV9JTklUICE9IChnc3RfbGVuX21waXN0YXRlICYgR1NUX01QSV9TVEFURV9NQVNLKSkKKwkJcmV0dXJuIC0xOworCS8qIGNoZWNrIE1QSSBJbml0aWFsaXphdGlvbiBlcnJvciAqLworCWdzdF9sZW5fbXBpc3RhdGUgPSBnc3RfbGVuX21waXN0YXRlID4+IDE2OworCWlmICgweDAwMDAgIT0gZ3N0X2xlbl9tcGlzdGF0ZSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKioKKyAqIGNoZWNrX2Z3X3JlYWR5IC0gVGhlIExMREQgY2hlY2sgaWYgdGhlIEZXIGlzIHJlYWR5LCBpZiBub3QsIHJldHVybiBlcnJvci4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgaW50IGNoZWNrX2Z3X3JlYWR5KHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwl1MzIgdmFsdWUsIHZhbHVlMTsKKwl1MzIgbWF4X3dhaXRfY291bnQ7CisJLyogY2hlY2sgZXJyb3Igc3RhdGUgKi8KKwl2YWx1ZSA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwgTVNHVV9TQ1JBVENIX1BBRF8xKTsKKwl2YWx1ZTEgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfU0NSQVRDSF9QQURfMik7CisJLyogY2hlY2sgQUFQIGVycm9yICovCisJaWYgKFNDUkFUQ0hfUEFEMV9FUlIgPT0gKHZhbHVlICYgU0NSQVRDSF9QQURfU1RBVEVfTUFTSykpIHsKKwkJLyogZXJyb3Igc3RhdGUgKi8KKwkJdmFsdWUgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfU0NSQVRDSF9QQURfMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayBJT1AgZXJyb3IgKi8KKwlpZiAoU0NSQVRDSF9QQUQyX0VSUiA9PSAodmFsdWUxICYgU0NSQVRDSF9QQURfU1RBVEVfTUFTSykpIHsKKwkJLyogZXJyb3Igc3RhdGUgKi8KKwkJdmFsdWUxID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLCBNU0dVX1NDUkFUQ0hfUEFEXzMpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYml0IDQtMzEgb2Ygc2NyYXRjaCBwYWQxIHNob3VsZCBiZSB6ZXJvcyBpZiBpdCBpcyBub3QKKwlpbiBlcnJvciBzdGF0ZSovCisJaWYgKHZhbHVlICYgU0NSQVRDSF9QQUQxX1NUQVRFX01BU0spIHsKKwkJLyogZXJyb3IgY2FzZSAqLworCQlwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfU0NSQVRDSF9QQURfMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBiaXQgMiwgNC0zMSBvZiBzY3JhdGNoIHBhZDIgc2hvdWxkIGJlIHplcm9zIGlmIGl0IGlzIG5vdAorCWluIGVycm9yIHN0YXRlICovCisJaWYgKHZhbHVlMSAmIFNDUkFUQ0hfUEFEMl9TVEFURV9NQVNLKSB7CisJCS8qIGVycm9yIGNhc2UgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCW1heF93YWl0X2NvdW50ID0gMSAqIDEwMDAgKiAxMDAwOy8qIDEgc2VjIHRpbWVvdXQgKi8KKworCS8qIHdhaXQgdW50aWwgc2NyYXRjaCBwYWQgMSBhbmQgMiByZWdpc3RlcnMgaW4gcmVhZHkgc3RhdGUgICovCisJZG8geworCQl1ZGVsYXkoMSk7CisJCXZhbHVlID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLCBNU0dVX1NDUkFUQ0hfUEFEXzEpCisJCQkmIFNDUkFUQ0hfUEFEMV9SRFk7CisJCXZhbHVlMSA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwgTVNHVV9TQ1JBVENIX1BBRF8yKQorCQkJJiBTQ1JBVENIX1BBRDJfUkRZOworCQlpZiAoKC0tbWF4X3dhaXRfY291bnQpID09IDApCisJCQlyZXR1cm4gLTE7CisJfSB3aGlsZSAoKHZhbHVlICE9IFNDUkFUQ0hfUEFEMV9SRFkpIHx8ICh2YWx1ZTEgIT0gU0NSQVRDSF9QQUQyX1JEWSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3BjaV9kZXZpY2VfYWRkcmVzc2VzKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwl1MzIJdmFsdWU7CisJdTMyCW9mZnNldDsKKwl1MzIJcGNpYmFyOworCXUzMglwY2lsb2dpYzsKKworCXZhbHVlID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLCAweDQ0KTsKKwlvZmZzZXQgPSB2YWx1ZSAmIDB4MDNGRkZGRkY7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiU2NyYXRjaHBhZCAwIE9mZnNldDogJXggXG4iLCBvZmZzZXQpKTsKKwlwY2lsb2dpYyA9ICh2YWx1ZSAmIDB4RkMwMDAwMDApID4+IDI2OworCXBjaWJhciA9IGdldF9wY2lfYmFyX2luZGV4KHBjaWxvZ2ljKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJTY3JhdGNocGFkIDAgUENJIEJBUjogJWQgXG4iLCBwY2liYXIpKTsKKwlwbTgwMDFfaGEtPm1haW5fY2ZnX3RibF9hZGRyID0gYmFzZV9hZGRyID0KKwkJcG04MDAxX2hhLT5pb19tZW1bcGNpYmFyXS5tZW12aXJ0YWRkciArIG9mZnNldDsKKwlwbTgwMDFfaGEtPmdlbmVyYWxfc3RhdF90YmxfYWRkciA9CisJCWJhc2VfYWRkciArIHBtODAwMV9jcjMyKHBtODAwMV9oYSwgcGNpYmFyLCBvZmZzZXQgKyAweDE4KTsKKwlwbTgwMDFfaGEtPmluYm5kX3FfdGJsX2FkZHIgPQorCQliYXNlX2FkZHIgKyBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIHBjaWJhciwgb2Zmc2V0ICsgMHgxQyk7CisJcG04MDAxX2hhLT5vdXRibmRfcV90YmxfYWRkciA9CisJCWJhc2VfYWRkciArIHBtODAwMV9jcjMyKHBtODAwMV9oYSwgcGNpYmFyLCBvZmZzZXQgKyAweDIwKTsKK30KKworLyoqCisgKiBwbTgwMDFfY2hpcF9pbml0IC0gdGhlIG1haW4gaW5pdCBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemUgd2hvbGUgUE04MDAxIGNoaXAuCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgcG04MDAxX2NoaXBfaW5pdChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJLyogY2hlY2sgdGhlIGZpcm13YXJlIHN0YXR1cyAqLworCWlmICgtMSA9PSBjaGVja19md19yZWFkeShwbTgwMDFfaGEpKSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJGaXJtd2FyZSBpcyBub3QgcmVhZHkhXG4iKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogSW5pdGlhbGl6ZSBwY2kgc3BhY2UgYWRkcmVzcyBlZzogbXBpIG9mZnNldCAqLworCWluaXRfcGNpX2RldmljZV9hZGRyZXNzZXMocG04MDAxX2hhKTsKKwlpbml0X2RlZmF1bHRfdGFibGVfdmFsdWVzKHBtODAwMV9oYSk7CisJcmVhZF9tYWluX2NvbmZpZ190YWJsZShwbTgwMDFfaGEpOworCXJlYWRfZ2VuZXJhbF9zdGF0dXNfdGFibGUocG04MDAxX2hhKTsKKwlyZWFkX2luYm5kX3F1ZXVlX3RhYmxlKHBtODAwMV9oYSk7CisJcmVhZF9vdXRibmRfcXVldWVfdGFibGUocG04MDAxX2hhKTsKKwkvKiB1cGRhdGUgbWFpbiBjb25maWcgdGFibGUgLGluYm91bmQgdGFibGUgYW5kIG91dGJvdW5kIHRhYmxlICovCisJdXBkYXRlX21haW5fY29uZmlnX3RhYmxlKHBtODAwMV9oYSk7CisJdXBkYXRlX2luYm5kX3F1ZXVlX3RhYmxlKHBtODAwMV9oYSwgMCk7CisJdXBkYXRlX291dGJuZF9xdWV1ZV90YWJsZShwbTgwMDFfaGEsIDApOworCW1waV9zZXRfcGh5c19nM193aXRoX3NzYyhwbTgwMDFfaGEsIDApOworCW1waV9zZXRfb3Blbl9yZXRyeV9pbnRlcnZhbF9yZWcocG04MDAxX2hhLCA3KTsKKwkvKiBub3RpZnkgZmlybXdhcmUgdXBkYXRlIGZpbmlzaGVkIGFuZCBjaGVjayBpbml0aWFsaXphdGlvbiBzdGF0dXMgKi8KKwlpZiAoMCA9PSBtcGlfaW5pdF9jaGVjayhwbTgwMDFfaGEpKSB7CisJCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJNUEkgaW5pdGlhbGl6ZSBzdWNjZXNzZnVsIVxuIikpOworCX0gZWxzZQorCQlyZXR1cm4gLUVCVVNZOworCS8qVGhpcyByZWdpc3RlciBpcyBhIDE2LWJpdCB0aW1lciB3aXRoIGEgcmVzb2x1dGlvbiBvZiAxdXMuIFRoaXMgaXMgdGhlCisJdGltZXIgdXNlZCBmb3IgaW50ZXJydXB0IGRlbGF5L2NvYWxlc2NpbmcgaW4gdGhlIFBDSWUgQXBwbGljYXRpb24gTGF5ZXIuCisJWmVybyBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gQSB2YWx1ZSBvZiAxIGluIHRoZSByZWdpc3RlciB3aWxsIGNhdXNlIHRoZQorCWludGVycnVwdHMgdG8gYmUgbm9ybWFsLiBBIHZhbHVlIGdyZWF0ZXIgdGhhbiAxIHdpbGwgY2F1c2UgY29hbGVzY2luZworCWRlbGF5cy4qLworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMSwgMHgwMDMzYzAsIDB4MSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAxLCAweDAwMzNjNCwgMHgwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGlfdW5pbml0X2NoZWNrKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwl1MzIgbWF4X3dhaXRfY291bnQ7CisJdTMyIHZhbHVlOworCXUzMiBnc3RfbGVuX21waXN0YXRlOworCWluaXRfcGNpX2RldmljZV9hZGRyZXNzZXMocG04MDAxX2hhKTsKKwkvKiBXcml0ZSBiaXQxPTEgdG8gSW5ib3VuZCBEb29yQmVsbCBSZWdpc3RlciB0byB0ZWxsIHRoZSBTUEMgRlcgdGhlCisJdGFibGUgaXMgc3RvcCAqLworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMCwgTVNHVV9JQkRCX1NFVCwgU1BDX01TR1VfQ0ZHX1RBQkxFX1JFU0VUKTsKKworCS8qIHdhaXQgdW50aWwgSW5ib3VuZCBEb29yQmVsbCBDbGVhciBSZWdpc3RlciB0b2dnbGVkICovCisJbWF4X3dhaXRfY291bnQgPSAxICogMTAwMCAqIDEwMDA7LyogMSBzZWMgKi8KKwlkbyB7CisJCXVkZWxheSgxKTsKKwkJdmFsdWUgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfSUJEQl9TRVQpOworCQl2YWx1ZSAmPSBTUENfTVNHVV9DRkdfVEFCTEVfUkVTRVQ7CisJfSB3aGlsZSAoKHZhbHVlICE9IDApICYmICgtLW1heF93YWl0X2NvdW50KSk7CisKKwlpZiAoIW1heF93YWl0X2NvdW50KSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJUSU1FT1VUOklCREIgdmFsdWUvPTB4JXhcbiIsIHZhbHVlKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayB0aGUgTVBJLVN0YXRlIGZvciB0ZXJtaW5hdGlvbiBpbiBwcm9ncmVzcyAqLworCS8qIHdhaXQgdW50aWwgSW5ib3VuZCBEb29yQmVsbCBDbGVhciBSZWdpc3RlciB0b2dnbGVkICovCisJbWF4X3dhaXRfY291bnQgPSAxICogMTAwMCAqIDEwMDA7ICAvKiAxIHNlYyAqLworCWRvIHsKKwkJdWRlbGF5KDEpOworCQlnc3RfbGVuX21waXN0YXRlID0KKwkJCXBtODAwMV9tcjMyKHBtODAwMV9oYS0+Z2VuZXJhbF9zdGF0X3RibF9hZGRyLAorCQkJR1NUX0dTVExFTl9NUElTX09GRlNFVCk7CisJCWlmIChHU1RfTVBJX1NUQVRFX1VOSU5JVCA9PQorCQkJKGdzdF9sZW5fbXBpc3RhdGUgJiBHU1RfTVBJX1NUQVRFX01BU0spKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoLS1tYXhfd2FpdF9jb3VudCk7CisJaWYgKCFtYXhfd2FpdF9jb3VudCkgeworCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiIFRJTUUgT1VUIE1QSSBTdGF0ZSA9IDB4JXhcbiIsCisJCQkJZ3N0X2xlbl9tcGlzdGF0ZSAmIEdTVF9NUElfU1RBVEVfTUFTSykpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHNvZnRfcmVzZXRfcmVhZHlfY2hlY2sgLSBGdW5jdGlvbiB0byBjaGVjayBGVyBpcyByZWFkeSBmb3Igc29mdCByZXNldC4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdTMyIHNvZnRfcmVzZXRfcmVhZHlfY2hlY2soc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXUzMiByZWdWYWwsIHJlZ1ZhbDEsIHJlZ1ZhbDI7CisJaWYgKG1waV91bmluaXRfY2hlY2socG04MDAxX2hhKSAhPSAwKSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJNUEkgc3RhdGUgaXMgbm90IHJlYWR5XG4iKSk7CisJCXJldHVybiAtMTsKKwl9CisJLyogcmVhZCB0aGUgc2NyYXRjaCBwYWQgMiByZWdpc3RlciBiaXQgMiAqLworCXJlZ1ZhbCA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwgTVNHVV9TQ1JBVENIX1BBRF8yKQorCQkmIFNDUkFUQ0hfUEFEMl9GV1JEWV9SU1Q7CisJaWYgKHJlZ1ZhbCA9PSBTQ1JBVENIX1BBRDJfRldSRFlfUlNUKSB7CisJCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJGaXJtd2FyZSBpcyByZWFkeSBmb3IgcmVzZXQgLlxuIikpOworCX0gZWxzZSB7CisJLyogVHJpZ2dlciBOTUkgdHdpY2UgdmlhIFJCNiAqLworCQlpZiAoLTEgPT0gYmFyNF9zaGlmdChwbTgwMDFfaGEsIFJCNl9BQ0NFU1NfUkVHKSkgeworCQkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJTaGlmdCBCYXI0IHRvIDB4JXggZmFpbGVkXG4iLAorCQkJCQlSQjZfQUNDRVNTX1JFRykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMiwgU1BDX1JCNl9PRkZTRVQsCisJCQlSQjZfTUFHSUNfTlVNQkVSX1JTVCk7CisJCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMiwgU1BDX1JCNl9PRkZTRVQsIFJCNl9NQUdJQ19OVU1CRVJfUlNUKTsKKwkJLyogd2FpdCBmb3IgMTAwIG1zICovCisJCW1kZWxheSgxMDApOworCQlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfU0NSQVRDSF9QQURfMikgJgorCQkJU0NSQVRDSF9QQUQyX0ZXUkRZX1JTVDsKKwkJaWYgKHJlZ1ZhbCAhPSBTQ1JBVENIX1BBRDJfRldSRFlfUlNUKSB7CisJCQlyZWdWYWwxID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLCBNU0dVX1NDUkFUQ0hfUEFEXzEpOworCQkJcmVnVmFsMiA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwgTVNHVV9TQ1JBVENIX1BBRF8yKTsKKwkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQkJcG04MDAxX3ByaW50aygiVElNRU9VVDpNU0dVX1NDUkFUQ0hfUEFEMSIKKwkJCQkiPTB4JXgsIE1TR1VfU0NSQVRDSF9QQUQyPTB4JXhcbiIsCisJCQkJcmVnVmFsMSwgcmVnVmFsMikpOworCQkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJTQ1JBVENIX1BBRDAgdmFsdWUgPSAweCV4XG4iLAorCQkJCXBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwgTVNHVV9TQ1JBVENIX1BBRF8wKSkpOworCQkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJTQ1JBVENIX1BBRDMgdmFsdWUgPSAweCV4XG4iLAorCQkJCXBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwgTVNHVV9TQ1JBVENIX1BBRF8zKSkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX3NvZnRfcnN0IC0gc29mdCByZXNldCB0aGUgUE04MDAxIGNoaXAsIHNvIHRoYXQgdGhlIGNsZWFyIGFsbAorICogdGhlIEZXIHJlZ2lzdGVyIHN0YXR1cyB0byB0aGUgb3JpZ2luYXRlZCBzdGF0dXMuCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqIEBzaWduYXR1cmU6IHNpZ25hdHVyZSBpbiBob3N0IHNjcmF0Y2ggcGFkMCByZWdpc3Rlci4KKyAqLworc3RhdGljIGludAorcG04MDAxX2NoaXBfc29mdF9yc3Qoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB1MzIgc2lnbmF0dXJlKQoreworCXUzMglyZWdWYWwsIHRvZ2dsZVZhbDsKKwl1MzIJbWF4X3dhaXRfY291bnQ7CisJdTMyCXJlZ1ZhbDEsIHJlZ1ZhbDIsIHJlZ1ZhbDM7CisKKwkvKiBzdGVwMTogQ2hlY2sgRlcgaXMgcmVhZHkgZm9yIHNvZnQgcmVzZXQgKi8KKwlpZiAoc29mdF9yZXNldF9yZWFkeV9jaGVjayhwbTgwMDFfaGEpICE9IDApIHsKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiRlcgaXMgbm90IHJlYWR5XG4iKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBzdGVwIDI6IGNsZWFyIE5NSSBzdGF0dXMgcmVnaXN0ZXIgb24gQUFQMSBhbmQgSU9QLCB3cml0ZSB0aGUgc2FtZQorCXZhbHVlIHRvIGNsZWFyICovCisJLyogbWFwIDB4NjAwMDAgdG8gQkFSNCgweDIwKSwgQkFSMih3aW4pICovCisJaWYgKC0xID09IGJhcjRfc2hpZnQocG04MDAxX2hhLCBNQklDX0FBUDFfQUREUl9CQVNFKSkgeworCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiU2hpZnQgQmFyNCB0byAweCV4IGZhaWxlZFxuIiwKKwkJCU1CSUNfQUFQMV9BRERSX0JBU0UpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIE1CSUNfTk1JX0VOQUJMRV9WUEUwX0lPUCk7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiTUJJQyAtIE5NSSBFbmFibGUgVlBFMCAoSU9QKT0gMHgleFxuIiwgcmVnVmFsKSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBNQklDX05NSV9FTkFCTEVfVlBFMF9JT1AsIDB4MCk7CisJLyogbWFwIDB4NzAwMDAgdG8gQkFSNCgweDIwKSwgQkFSMih3aW4pICovCisJaWYgKC0xID09IGJhcjRfc2hpZnQocG04MDAxX2hhLCBNQklDX0lPUF9BRERSX0JBU0UpKSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJTaGlmdCBCYXI0IHRvIDB4JXggZmFpbGVkXG4iLAorCQkJTUJJQ19JT1BfQUREUl9CQVNFKSk7CisJCXJldHVybiAtMTsKKwl9CisJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBNQklDX05NSV9FTkFCTEVfVlBFMF9BQVAxKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJNQklDIC0gTk1JIEVuYWJsZSBWUEUwIChBQVAxKT0gMHgleFxuIiwgcmVnVmFsKSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBNQklDX05NSV9FTkFCTEVfVlBFMF9BQVAxLCAweDApOworCisJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAxLCBQQ0lFX0VWRU5UX0lOVEVSUlVQVF9FTkFCTEUpOworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIlBDSUUgLUV2ZW50IEludGVycnVwdCBFbmFibGUgPSAweCV4XG4iLCByZWdWYWwpKTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDEsIFBDSUVfRVZFTlRfSU5URVJSVVBUX0VOQUJMRSwgMHgwKTsKKworCXJlZ1ZhbCA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMSwgUENJRV9FVkVOVF9JTlRFUlJVUFQpOworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIlBDSUUgLSBFdmVudCBJbnRlcnJ1cHQgID0gMHgleFxuIiwgcmVnVmFsKSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAxLCBQQ0lFX0VWRU5UX0lOVEVSUlVQVCwgcmVnVmFsKTsKKworCXJlZ1ZhbCA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMSwgUENJRV9FUlJPUl9JTlRFUlJVUFRfRU5BQkxFKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJQQ0lFIC1FcnJvciBJbnRlcnJ1cHQgRW5hYmxlID0gMHgleFxuIiwgcmVnVmFsKSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAxLCBQQ0lFX0VSUk9SX0lOVEVSUlVQVF9FTkFCTEUsIDB4MCk7CisKKwlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDEsIFBDSUVfRVJST1JfSU5URVJSVVBUKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJQQ0lFIC0gRXJyb3IgSW50ZXJydXB0ID0gMHgleFxuIiwgcmVnVmFsKSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAxLCBQQ0lFX0VSUk9SX0lOVEVSUlVQVCwgcmVnVmFsKTsKKworCS8qIHJlYWQgdGhlIHNjcmF0Y2ggcGFkIDEgcmVnaXN0ZXIgYml0IDIgKi8KKwlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfU0NSQVRDSF9QQURfMSkKKwkJJiBTQ1JBVENIX1BBRDFfUlNUOworCXRvZ2dsZVZhbCA9IHJlZ1ZhbCBeIFNDUkFUQ0hfUEFEMV9SU1Q7CisKKwkvKiBzZXQgc2lnbmF0dXJlIGluIGhvc3Qgc2NyYXRjaCBwYWQwIHJlZ2lzdGVyIHRvIHRlbGwgU1BDIHRoYXQgdGhlCisJaG9zdCBwZXJmb3JtcyB0aGUgc29mdCByZXNldCAqLworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMCwgTVNHVV9IT1NUX1NDUkFUQ0hfUEFEXzAsIHNpZ25hdHVyZSk7CisKKwkvKiByZWFkIHJlcXVpcmVkIHJlZ2lzdGVycyBmb3IgY29uZmlybW1pbmcgKi8KKwkvKiBtYXAgMHgwNzAwMDAwIHRvIEJBUjQoMHgyMCksIEJBUjIod2luKSAqLworCWlmICgtMSA9PSBiYXI0X3NoaWZ0KHBtODAwMV9oYSwgR1NNX0FERFJfQkFTRSkpIHsKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIlNoaWZ0IEJhcjQgdG8gMHgleCBmYWlsZWRcbiIsCisJCQlHU01fQUREUl9CQVNFKSk7CisJCXJldHVybiAtMTsKKwl9CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiR1NNIDB4MCgweDAwMDA3Yjg4KS1HU00gQ29uZmlndXJhdGlvbiBhbmQiCisJCSIgUmVzZXQgPSAweCV4XG4iLAorCQlwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9DT05GSUdfUkVTRVQpKSk7CisKKwkvKiBzdGVwIDM6IGhvc3QgcmVhZCBHU00gQ29uZmlndXJhdGlvbiBhbmQgUmVzZXQgcmVnaXN0ZXIgKi8KKwlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9DT05GSUdfUkVTRVQpOworCS8qIFB1dCB0aG9zZSBiaXRzIHRvIGxvdyAqLworCS8qIEdTTSBYQ0JJIG9mZnNldCA9IDB4NzAgMDAwMAorCTB4MDAgQml0IDEzIENPTV9TTFZfU1dfUlNUQiAxCisJMHgwMCBCaXQgMTIgUVNTUF9TV19SU1RCIDEKKwkweDAwIEJpdCAxMSBSQUFFX1NXX1JTVEIgMQorCTB4MDAgQml0IDkgUkJfMV9TV19SU1RCIDEKKwkweDAwIEJpdCA4IFNNX1NXX1JTVEIgMQorCSovCisJcmVnVmFsICY9IH4oMHgwMDAwM2IwMCk7CisJLyogaG9zdCB3cml0ZSBHU00gQ29uZmlndXJhdGlvbiBhbmQgUmVzZXQgcmVnaXN0ZXIgKi8KKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDIsIEdTTV9DT05GSUdfUkVTRVQsIHJlZ1ZhbCk7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiR1NNIDB4MCAoMHgwMDAwN2I4OCA9PT4gMHgwMDAwNDA4OCkgLSBHU00gIgorCQkiQ29uZmlndXJhdGlvbiBhbmQgUmVzZXQgaXMgc2V0IHRvID0gMHgleFxuIiwKKwkJcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBHU01fQ09ORklHX1JFU0VUKSkpOworCisJLyogc3RlcCA0OiAqLworCS8qIGRpc2FibGUgR1NNIC0gUmVhZCBBZGRyZXNzIFBhcml0eSBDaGVjayAqLworCXJlZ1ZhbDEgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9SRUFEX0FERFJfUEFSSVRZX0NIRUNLKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJHU00gMHg3MDAwMzggLSBSZWFkIEFkZHJlc3MgUGFyaXR5IENoZWNrICIKKwkJIkVuYWJsZSA9IDB4JXhcbiIsIHJlZ1ZhbDEpKTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDIsIEdTTV9SRUFEX0FERFJfUEFSSVRZX0NIRUNLLCAweDApOworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIkdTTSAweDcwMDAzOCAtIFJlYWQgQWRkcmVzcyBQYXJpdHkgQ2hlY2sgRW5hYmxlIgorCQkiaXMgc2V0IHRvID0gMHgleFxuIiwKKwkJcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBHU01fUkVBRF9BRERSX1BBUklUWV9DSEVDSykpKTsKKworCS8qIGRpc2FibGUgR1NNIC0gV3JpdGUgQWRkcmVzcyBQYXJpdHkgQ2hlY2sgKi8KKwlyZWdWYWwyID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBHU01fV1JJVEVfQUREUl9QQVJJVFlfQ0hFQ0spOworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIkdTTSAweDcwMDA0MCAtIFdyaXRlIEFkZHJlc3MgUGFyaXR5IENoZWNrIgorCQkiIEVuYWJsZSA9IDB4JXhcbiIsIHJlZ1ZhbDIpKTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDIsIEdTTV9XUklURV9BRERSX1BBUklUWV9DSEVDSywgMHgwKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJHU00gMHg3MDAwNDAgLSBXcml0ZSBBZGRyZXNzIFBhcml0eSBDaGVjayAiCisJCSJFbmFibGUgaXMgc2V0IHRvID0gMHgleFxuIiwKKwkJcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBHU01fV1JJVEVfQUREUl9QQVJJVFlfQ0hFQ0spKSk7CisKKwkvKiBkaXNhYmxlIEdTTSAtIFdyaXRlIERhdGEgUGFyaXR5IENoZWNrICovCisJcmVnVmFsMyA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgR1NNX1dSSVRFX0RBVEFfUEFSSVRZX0NIRUNLKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJHU00gMHgzMDAwNDggLSBXcml0ZSBEYXRhIFBhcml0eSBDaGVjayIKKwkJIiBFbmFibGUgPSAweCV4XG4iLCByZWdWYWwzKSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBHU01fV1JJVEVfREFUQV9QQVJJVFlfQ0hFQ0ssIDB4MCk7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiR1NNIDB4MzAwMDQ4IC0gV3JpdGUgRGF0YSBQYXJpdHkgQ2hlY2sgRW5hYmxlIgorCQkiaXMgc2V0IHRvID0gMHgleFxuIiwKKwlwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9XUklURV9EQVRBX1BBUklUWV9DSEVDSykpKTsKKworCS8qIHN0ZXAgNTogZGVsYXkgMTAgdXNlYyAqLworCXVkZWxheSgxMCk7CisJLyogc3RlcCA1LWI6IHNldCBHUElPLTAgb3V0cHV0IGNvbnRyb2wgdG8gdHJpc3RhdGUgYW55d2F5ICovCisJaWYgKC0xID09IGJhcjRfc2hpZnQocG04MDAxX2hhLCBHUElPX0FERFJfQkFTRSkpIHsKKwkJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJTaGlmdCBCYXI0IHRvIDB4JXggZmFpbGVkXG4iLAorCQkJCUdQSU9fQUREUl9CQVNFKSk7CisJCXJldHVybiAtMTsKKwl9CisJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBHUElPX0dQSU9fMF8wVVRQVVRfQ1RMX09GRlNFVCk7CisJCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCQkJcG04MDAxX3ByaW50aygiR1BJTyBPdXRwdXQgQ29udHJvbCBSZWdpc3RlcjoiCisJCQkJIiA9IDB4JXhcbiIsIHJlZ1ZhbCkpOworCS8qIHNldCBHUElPLTAgb3V0cHV0IGNvbnRyb2wgdG8gdHJpLXN0YXRlICovCisJcmVnVmFsICY9IDB4RkZGRkZGRkM7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBHUElPX0dQSU9fMF8wVVRQVVRfQ1RMX09GRlNFVCwgcmVnVmFsKTsKKworCS8qIFN0ZXAgNjogUmVzZXQgdGhlIElPUCBhbmQgQUFQMSAqLworCS8qIG1hcCAweDAwMDAwIHRvIEJBUjQoMHgyMCksIEJBUjIod2luKSAqLworCWlmICgtMSA9PSBiYXI0X3NoaWZ0KHBtODAwMV9oYSwgU1BDX1RPUF9MRVZFTF9BRERSX0JBU0UpKSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJTUEMgU2hpZnQgQmFyNCB0byAweCV4IGZhaWxlZFxuIiwKKwkJCVNQQ19UT1BfTEVWRUxfQUREUl9CQVNFKSk7CisJCXJldHVybiAtMTsKKwl9CisJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBTUENfUkVHX1JFU0VUKTsKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJUb3AgUmVnaXN0ZXIgYmVmb3JlIHJlc2V0dGluZyBJT1AvQUFQMSIKKwkJIjo9IDB4JXhcbiIsIHJlZ1ZhbCkpOworCXJlZ1ZhbCAmPSB+KFNQQ19SRUdfUkVTRVRfUENTX0lPUF9TUyB8IFNQQ19SRUdfUkVTRVRfUENTX0FBUDFfU1MpOworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMiwgU1BDX1JFR19SRVNFVCwgcmVnVmFsKTsKKworCS8qIHN0ZXAgNzogUmVzZXQgdGhlIEJETUEvT1NTUCAqLworCXJlZ1ZhbCA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgU1BDX1JFR19SRVNFVCk7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiVG9wIFJlZ2lzdGVyIGJlZm9yZSByZXNldHRpbmcgQkRNQS9PU1NQIgorCQkiOiA9IDB4JXhcbiIsIHJlZ1ZhbCkpOworCXJlZ1ZhbCAmPSB+KFNQQ19SRUdfUkVTRVRfQkRNQV9DT1JFIHwgU1BDX1JFR19SRVNFVF9PU1NQKTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDIsIFNQQ19SRUdfUkVTRVQsIHJlZ1ZhbCk7CisKKwkvKiBzdGVwIDg6IGRlbGF5IDEwIHVzZWMgKi8KKwl1ZGVsYXkoMTApOworCisJLyogc3RlcCA5OiBicmluZyB0aGUgQkRNQSBhbmQgT1NTUCBvdXQgb2YgcmVzZXQgKi8KKwlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIFNQQ19SRUdfUkVTRVQpOworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIlRvcCBSZWdpc3RlciBiZWZvcmUgYnJpbmdpbmcgdXAgQkRNQS9PU1NQIgorCQkiOj0gMHgleFxuIiwgcmVnVmFsKSk7CisJcmVnVmFsIHw9IChTUENfUkVHX1JFU0VUX0JETUFfQ09SRSB8IFNQQ19SRUdfUkVTRVRfT1NTUCk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBTUENfUkVHX1JFU0VULCByZWdWYWwpOworCisJLyogc3RlcCAxMDogZGVsYXkgMTAgdXNlYyAqLworCXVkZWxheSgxMCk7CisKKwkvKiBzdGVwIDExOiByZWFkcyBhbmQgc2V0cyB0aGUgR1NNIENvbmZpZ3VyYXRpb24gYW5kIFJlc2V0IFJlZ2lzdGVyICovCisJLyogbWFwIDB4MDcwMDAwMCB0byBCQVI0KDB4MjApLCBCQVIyKHdpbikgKi8KKwlpZiAoLTEgPT0gYmFyNF9zaGlmdChwbTgwMDFfaGEsIEdTTV9BRERSX0JBU0UpKSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJTUEMgU2hpZnQgQmFyNCB0byAweCV4IGZhaWxlZFxuIiwKKwkJCUdTTV9BRERSX0JBU0UpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJHU00gMHgwICgweDAwMDA3Yjg4KS1HU00gQ29uZmlndXJhdGlvbiBhbmQgIgorCQkiUmVzZXQgPSAweCV4XG4iLCBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9DT05GSUdfUkVTRVQpKSk7CisJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBHU01fQ09ORklHX1JFU0VUKTsKKwkvKiBQdXQgdGhvc2UgYml0cyB0byBoaWdoICovCisJLyogR1NNIFhDQkkgb2Zmc2V0ID0gMHg3MCAwMDAwCisJMHgwMCBCaXQgMTMgQ09NX1NMVl9TV19SU1RCIDEKKwkweDAwIEJpdCAxMiBRU1NQX1NXX1JTVEIgMQorCTB4MDAgQml0IDExIFJBQUVfU1dfUlNUQiAxCisJMHgwMCBCaXQgOSAgIFJCXzFfU1dfUlNUQiAxCisJMHgwMCBCaXQgOCAgIFNNX1NXX1JTVEIgMQorCSovCisJcmVnVmFsIHw9IChHU01fQ09ORklHX1JFU0VUX1ZBTFVFKTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDIsIEdTTV9DT05GSUdfUkVTRVQsIHJlZ1ZhbCk7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiR1NNICgweDAwMDA0MDg4ID09PiAweDAwMDA3Yjg4KSAtIEdTTSIKKwkJIiBDb25maWd1cmF0aW9uIGFuZCBSZXNldCBpcyBzZXQgdG8gPSAweCV4XG4iLAorCQlwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9DT05GSUdfUkVTRVQpKSk7CisKKwkvKiBzdGVwIDEyOiBSZXN0b3JlIEdTTSAtIFJlYWQgQWRkcmVzcyBQYXJpdHkgQ2hlY2sgKi8KKwlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9SRUFEX0FERFJfUEFSSVRZX0NIRUNLKTsKKwkvKiBqdXN0IGZvciBkZWJ1Z2dpbmcgKi8KKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJHU00gMHg3MDAwMzggLSBSZWFkIEFkZHJlc3MgUGFyaXR5IENoZWNrIEVuYWJsZSIKKwkJIiA9IDB4JXhcbiIsIHJlZ1ZhbCkpOworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMiwgR1NNX1JFQURfQUREUl9QQVJJVFlfQ0hFQ0ssIHJlZ1ZhbDEpOworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIkdTTSAweDcwMDAzOCAtIFJlYWQgQWRkcmVzcyBQYXJpdHkiCisJCSIgQ2hlY2sgRW5hYmxlIGlzIHNldCB0byA9IDB4JXhcbiIsCisJCXBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgR1NNX1JFQURfQUREUl9QQVJJVFlfQ0hFQ0spKSk7CisJLyogUmVzdG9yZSBHU00gLSBXcml0ZSBBZGRyZXNzIFBhcml0eSBDaGVjayAqLworCXJlZ1ZhbCA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgR1NNX1dSSVRFX0FERFJfUEFSSVRZX0NIRUNLKTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDIsIEdTTV9XUklURV9BRERSX1BBUklUWV9DSEVDSywgcmVnVmFsMik7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiR1NNIDB4NzAwMDQwIC0gV3JpdGUgQWRkcmVzcyBQYXJpdHkgQ2hlY2siCisJCSIgRW5hYmxlIGlzIHNldCB0byA9IDB4JXhcbiIsCisJCXBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgR1NNX1dSSVRFX0FERFJfUEFSSVRZX0NIRUNLKSkpOworCS8qIFJlc3RvcmUgR1NNIC0gV3JpdGUgRGF0YSBQYXJpdHkgQ2hlY2sgKi8KKwlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDIsIEdTTV9XUklURV9EQVRBX1BBUklUWV9DSEVDSyk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAyLCBHU01fV1JJVEVfREFUQV9QQVJJVFlfQ0hFQ0ssIHJlZ1ZhbDMpOworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIkdTTSAweDcwMDA0OCAtIFdyaXRlIERhdGEgUGFyaXR5IENoZWNrIEVuYWJsZSIKKwkJImlzIHNldCB0byA9IDB4JXhcbiIsCisJCXBtODAwMV9jcjMyKHBtODAwMV9oYSwgMiwgR1NNX1dSSVRFX0RBVEFfUEFSSVRZX0NIRUNLKSkpOworCisJLyogc3RlcCAxMzogYnJpbmcgdGhlIElPUCBhbmQgQUFQMSBvdXQgb2YgcmVzZXQgKi8KKwkvKiBtYXAgMHgwMDAwMCB0byBCQVI0KDB4MjApLCBCQVIyKHdpbikgKi8KKwlpZiAoLTEgPT0gYmFyNF9zaGlmdChwbTgwMDFfaGEsIFNQQ19UT1BfTEVWRUxfQUREUl9CQVNFKSkgeworCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiU2hpZnQgQmFyNCB0byAweCV4IGZhaWxlZFxuIiwKKwkJCVNQQ19UT1BfTEVWRUxfQUREUl9CQVNFKSk7CisJCXJldHVybiAtMTsKKwl9CisJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAyLCBTUENfUkVHX1JFU0VUKTsKKwlyZWdWYWwgfD0gKFNQQ19SRUdfUkVTRVRfUENTX0lPUF9TUyB8IFNQQ19SRUdfUkVTRVRfUENTX0FBUDFfU1MpOworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMiwgU1BDX1JFR19SRVNFVCwgcmVnVmFsKTsKKworCS8qIHN0ZXAgMTQ6IGRlbGF5IDEwIHVzZWMgLSBOb3JtYWwgTW9kZSAqLworCXVkZWxheSgxMCk7CisJLyogY2hlY2sgU29mdCBSZXNldCBOb3JtYWwgbW9kZSBvciBTb2Z0IFJlc2V0IEhEQSBtb2RlICovCisJaWYgKHNpZ25hdHVyZSA9PSBTUENfU09GVF9SRVNFVF9TSUdOQVRVUkUpIHsKKwkJLyogc3RlcCAxNSAoTm9ybWFsIE1vZGUpOiB3YWl0IHVudGlsIHNjcmF0Y2ggcGFkMSByZWdpc3RlcgorCQliaXQgMiB0b2dnbGVkICovCisJCW1heF93YWl0X2NvdW50ID0gMiAqIDEwMDAgKiAxMDAwOy8qIDIgc2VjICovCisJCWRvIHsKKwkJCXVkZWxheSgxKTsKKwkJCXJlZ1ZhbCA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwgTVNHVV9TQ1JBVENIX1BBRF8xKSAmCisJCQkJU0NSQVRDSF9QQUQxX1JTVDsKKwkJfSB3aGlsZSAoKHJlZ1ZhbCAhPSB0b2dnbGVWYWwpICYmICgtLW1heF93YWl0X2NvdW50KSk7CisKKwkJaWYgKCFtYXhfd2FpdF9jb3VudCkgeworCQkJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLAorCQkJCU1TR1VfU0NSQVRDSF9QQURfMSk7CisJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIlRJTUVPVVQgOiBUb2dnbGVWYWwgMHgleCwiCisJCQkJIk1TR1VfU0NSQVRDSF9QQUQxID0gMHgleFxuIiwKKwkJCQl0b2dnbGVWYWwsIHJlZ1ZhbCkpOworCQkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJTQ1JBVENIX1BBRDAgdmFsdWUgPSAweCV4XG4iLAorCQkJCXBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwKKwkJCQlNU0dVX1NDUkFUQ0hfUEFEXzApKSk7CisJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIlNDUkFUQ0hfUEFEMiB2YWx1ZSA9IDB4JXhcbiIsCisJCQkJcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLAorCQkJCU1TR1VfU0NSQVRDSF9QQURfMikpKTsKKwkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQkJcG04MDAxX3ByaW50aygiU0NSQVRDSF9QQUQzIHZhbHVlID0gMHgleFxuIiwKKwkJCQlwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsCisJCQkJTVNHVV9TQ1JBVENIX1BBRF8zKSkpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogc3RlcCAxNiAoTm9ybWFsKSAtIENsZWFyIE9ETVIgYW5kIE9EQ1IgKi8KKwkJcG04MDAxX2N3MzIocG04MDAxX2hhLCAwLCBNU0dVX09EQ1IsIE9EQ1JfQ0xFQVJfQUxMKTsKKwkJcG04MDAxX2N3MzIocG04MDAxX2hhLCAwLCBNU0dVX09ETVIsIE9ETVJfQ0xFQVJfQUxMKTsKKworCQkvKiBzdGVwIDE3IChOb3JtYWwgTW9kZSk6IHdhaXQgZm9yIHRoZSBGVyBhbmQgSU9QIHRvIGdldAorCQlyZWFkeSAtIDEgc2VjIHRpbWVvdXQgKi8KKwkJLyogV2FpdCBmb3IgdGhlIFNQQyBDb25maWd1cmF0aW9uIFRhYmxlIHRvIGJlIHJlYWR5ICovCisJCWlmIChjaGVja19md19yZWFkeShwbTgwMDFfaGEpID09IC0xKSB7CisJCQlyZWdWYWwgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIE1TR1VfU0NSQVRDSF9QQURfMSk7CisJCQkvKiByZXR1cm4gZXJyb3IgaWYgTVBJIENvbmZpZ3VyYXRpb24gVGFibGUgbm90IHJlYWR5ICovCisJCQlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIkZXIG5vdCByZWFkeSBTQ1JBVENIX1BBRDEiCisJCQkJIiA9IDB4JXhcbiIsIHJlZ1ZhbCkpOworCQkJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLCBNU0dVX1NDUkFUQ0hfUEFEXzIpOworCQkJLyogcmV0dXJuIGVycm9yIGlmIE1QSSBDb25maWd1cmF0aW9uIFRhYmxlIG5vdCByZWFkeSAqLworCQkJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJGVyBub3QgcmVhZHkgU0NSQVRDSF9QQUQyIgorCQkJCSIgPSAweCV4XG4iLCByZWdWYWwpKTsKKwkJCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCQkJcG04MDAxX3ByaW50aygiU0NSQVRDSF9QQUQwIHZhbHVlID0gMHgleFxuIiwKKwkJCQlwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsCisJCQkJTVNHVV9TQ1JBVENIX1BBRF8wKSkpOworCQkJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJTQ1JBVENIX1BBRDMgdmFsdWUgPSAweCV4XG4iLAorCQkJCXBtODAwMV9jcjMyKHBtODAwMV9oYSwgMCwKKwkJCQlNU0dVX1NDUkFUQ0hfUEFEXzMpKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJTUEMgc29mdCByZXNldCBDb21wbGV0ZVxuIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbTgwMDFfaHdfY2hpcF9yc3Qoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXUzMiBpOworCXUzMiByZWdWYWw7CisJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiY2hpcCByZXNldCBzdGFydFxuIikpOworCisJLyogZG8gU1BDIGNoaXAgcmVzZXQuICovCisJcmVnVmFsID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAxLCBTUENfUkVHX1JFU0VUKTsKKwlyZWdWYWwgJj0gfihTUENfUkVHX1JFU0VUX0RFVklDRSk7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAxLCBTUENfUkVHX1JFU0VULCByZWdWYWwpOworCisJLyogZGVsYXkgMTAgdXNlYyAqLworCXVkZWxheSgxMCk7CisKKwkvKiBicmluZyBjaGlwIHJlc2V0IG91dCBvZiByZXNldCAqLworCXJlZ1ZhbCA9IHBtODAwMV9jcjMyKHBtODAwMV9oYSwgMSwgU1BDX1JFR19SRVNFVCk7CisJcmVnVmFsIHw9IFNQQ19SRUdfUkVTRVRfREVWSUNFOworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMSwgU1BDX1JFR19SRVNFVCwgcmVnVmFsKTsKKworCS8qIGRlbGF5IDEwIHVzZWMgKi8KKwl1ZGVsYXkoMTApOworCisJLyogd2FpdCBmb3IgMjAgbXNlYyB1bnRpbCB0aGUgZmlybXdhcmUgZ2V0cyByZWxvYWRlZCAqLworCWkgPSAyMDsKKwlkbyB7CisJCW1kZWxheSgxKTsKKwl9IHdoaWxlICgoLS1pKSAhPSAwKTsKKworCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoImNoaXAgcmVzZXQgZmluaXNoZWRcbiIpKTsKK30KKworLyoqCisgKiBwbTgwMDFfY2hpcF9pb3VubWFwIC0gd2hpY2ggbWFwZWQgd2hlbiBpbml0aWxpemVkLgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHBtODAwMV9jaGlwX2lvdW5tYXAoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXM4IGJhciwgbG9naWNhbCA9IDA7CisJZm9yIChiYXIgPSAwOyBiYXIgPCA2OyBiYXIrKykgeworCQkvKgorCQkqKiBsb2dpY2FsIEJBUnMgZm9yIFNQQzoKKwkJKiogYmFyIDAgYW5kIDEgLSBsb2dpY2FsIEJBUjAKKwkJKiogYmFyIDIgYW5kIDMgLSBsb2dpY2FsIEJBUjEKKwkJKiogYmFyNCAtIGxvZ2ljYWwgQkFSMgorCQkqKiBiYXI1IC0gbG9naWNhbCBCQVIzCisJCSoqIFNraXAgdGhlIGFwcHJvcHJpYXRlIGFzc2lnbm1lbnRzOgorCQkqLworCQlpZiAoKGJhciA9PSAxKSB8fCAoYmFyID09IDMpKQorCQkJY29udGludWU7CisJCWlmIChwbTgwMDFfaGEtPmlvX21lbVtsb2dpY2FsXS5tZW12aXJ0YWRkcikgeworCQkJaW91bm1hcChwbTgwMDFfaGEtPmlvX21lbVtsb2dpY2FsXS5tZW12aXJ0YWRkcik7CisJCQlsb2dpY2FsKys7CisJCX0KKwl9Cit9CisKKy8qKgorICogcG04MDAxX2NoaXBfaW50ZXJydXB0X2VuYWJsZSAtIGVuYWJsZSBQTTgwMDEgY2hpcCBpbnRlcnJ1cHQKKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZAorcG04MDAxX2NoaXBfaW50eF9pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDAsIE1TR1VfT0RNUiwgT0RNUl9DTEVBUl9BTEwpOworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMCwgTVNHVV9PRENSLCBPRENSX0NMRUFSX0FMTCk7Cit9CisKKyAvKioKKyAgKiBwbTgwMDFfY2hpcF9pbnR4X2ludGVycnVwdF9kaXNhYmxlLSBkaXNhYmxlIFBNODAwMSBjaGlwIGludGVycnVwdAorICAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICAqLworc3RhdGljIHZvaWQKK3BtODAwMV9jaGlwX2ludHhfaW50ZXJydXB0X2Rpc2FibGUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgMCwgTVNHVV9PRE1SLCBPRE1SX01BU0tfQUxMKTsKK30KKworLyoqCisgKiBwbTgwMDFfY2hpcF9tc2l4X2ludGVycnVwdF9lbmFibGUgLSBlbmFibGUgUE04MDAxIGNoaXAgaW50ZXJydXB0CisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQKK3BtODAwMV9jaGlwX21zaXhfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJdTMyIGludF92ZWNfaWR4KQoreworCXUzMiBtc2lfaW5kZXg7CisJdTMyIHZhbHVlOworCW1zaV9pbmRleCA9IGludF92ZWNfaWR4ICogTVNJWF9UQUJMRV9FTEVNRU5UX1NJWkU7CisJbXNpX2luZGV4ICs9IE1TSVhfVEFCTEVfQkFTRTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDAsIG1zaV9pbmRleCwgTVNJWF9JTlRFUlJVUFRfRU5BQkxFKTsKKwl2YWx1ZSA9ICgxIDw8IGludF92ZWNfaWR4KTsKKwlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDAsICBNU0dVX09EQ1IsIHZhbHVlKTsKKworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX21zaXhfaW50ZXJydXB0X2Rpc2FibGUgLSBkaXNhYmxlIFBNODAwMSBjaGlwIGludGVycnVwdAorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitwbTgwMDFfY2hpcF9tc2l4X2ludGVycnVwdF9kaXNhYmxlKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwl1MzIgaW50X3ZlY19pZHgpCit7CisJdTMyIG1zaV9pbmRleDsKKwltc2lfaW5kZXggPSBpbnRfdmVjX2lkeCAqIE1TSVhfVEFCTEVfRUxFTUVOVF9TSVpFOworCW1zaV9pbmRleCArPSBNU0lYX1RBQkxFX0JBU0U7CisJcG04MDAxX2N3MzIocG04MDAxX2hhLCAwLCAgbXNpX2luZGV4LCBNU0lYX0lOVEVSUlVQVF9ESVNBQkxFKTsKKworfQorLyoqCisgKiBwbTgwMDFfY2hpcF9pbnRlcnJ1cHRfZW5hYmxlIC0gZW5hYmxlIFBNODAwMSBjaGlwIGludGVycnVwdAorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitwbTgwMDFfY2hpcF9pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKyNpZmRlZiBQTTgwMDFfVVNFX01TSVgKKwlwbTgwMDFfY2hpcF9tc2l4X2ludGVycnVwdF9lbmFibGUocG04MDAxX2hhLCAwKTsKKwlyZXR1cm47CisjZW5kaWYKKwlwbTgwMDFfY2hpcF9pbnR4X2ludGVycnVwdF9lbmFibGUocG04MDAxX2hhKTsKKworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX2ludHhfaW50ZXJydXB0X2Rpc2FibGUtIGRpc2FibGUgUE04MDAxIGNoaXAgaW50ZXJydXB0CisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQKK3BtODAwMV9jaGlwX2ludGVycnVwdF9kaXNhYmxlKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKyNpZmRlZiBQTTgwMDFfVVNFX01TSVgKKwlwbTgwMDFfY2hpcF9tc2l4X2ludGVycnVwdF9kaXNhYmxlKHBtODAwMV9oYSwgMCk7CisJcmV0dXJuOworI2VuZGlmCisJcG04MDAxX2NoaXBfaW50eF9pbnRlcnJ1cHRfZGlzYWJsZShwbTgwMDFfaGEpOworCit9CisKKy8qKgorICogbXBpX21zZ19mcmVlX2dldC0gZ2V0IHRoZSBmcmVlIG1lc3NhZ2UgYnVmZmVyIGZvciB0cmFuc2ZlciBpbmJvdW5kIHF1ZXVlLgorICogQGNpcmN1bGFyUTogdGhlIGluYm91bmQgcXVldWUgIHdlIHdhbnQgdG8gdHJhbnNmZXIgdG8gSEJBLgorICogQG1lc3NhZ2VTaXplOiB0aGUgbWVzc2FnZSBzaXplIG9mIHRoaXMgdHJhbnNmZXIsIG5vcm1hbGx5IGl0IGlzIDY0IGJ5dGVzCisgKiBAbWVzc2FnZVB0cjogdGhlIHBvaW50ZXIgdG8gbWVzc2FnZS4KKyAqLworc3RhdGljIGludCBtcGlfbXNnX2ZyZWVfZ2V0KHN0cnVjdCBpbmJvdW5kX3F1ZXVlX3RhYmxlICpjaXJjdWxhclEsCisJCQkgICAgdTE2IG1lc3NhZ2VTaXplLCB2b2lkICoqbWVzc2FnZVB0cikKK3sKKwl1MzIgb2Zmc2V0LCBjb25zdW1lcl9pbmRleDsKKwlzdHJ1Y3QgbXBpX21zZ19oZHIgKm1zZ0hlYWRlcjsKKwl1OCBiY0NvdW50ID0gMTsgLyogb25seSBzdXBwb3J0IHNpbmdsZSBidWZmZXIgKi8KKworCS8qIENoZWNrcyBpcyB0aGUgcmVxdWVzdGVkIG1lc3NhZ2Ugc2l6ZSBjYW4gYmUgYWxsb2NhdGVkIGluIHRoaXMgcXVldWUqLworCWlmIChtZXNzYWdlU2l6ZSA+IDY0KSB7CisJCSptZXNzYWdlUHRyID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFN0b3JlcyB0aGUgbmV3IGNvbnN1bWVyIGluZGV4ICovCisJY29uc3VtZXJfaW5kZXggPSBwbTgwMDFfcmVhZF8zMihjaXJjdWxhclEtPmNpX3ZpcnQpOworCWNpcmN1bGFyUS0+Y29uc3VtZXJfaW5kZXggPSBjcHVfdG9fbGUzMihjb25zdW1lcl9pbmRleCk7CisJaWYgKCgoY2lyY3VsYXJRLT5wcm9kdWNlcl9pZHggKyBiY0NvdW50KSAlIDI1NikgPT0KKwkJY2lyY3VsYXJRLT5jb25zdW1lcl9pbmRleCkgeworCQkqbWVzc2FnZVB0ciA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisJLyogZ2V0IG1lbW9yeSBJT01CIGJ1ZmZlciBhZGRyZXNzICovCisJb2Zmc2V0ID0gY2lyY3VsYXJRLT5wcm9kdWNlcl9pZHggKiA2NDsKKwkvKiBpbmNyZW1lbnQgdG8gbmV4dCBiY0NvdW50IGVsZW1lbnQgKi8KKwljaXJjdWxhclEtPnByb2R1Y2VyX2lkeCA9IChjaXJjdWxhclEtPnByb2R1Y2VyX2lkeCArIGJjQ291bnQpICUgMjU2OworCS8qIEFkZHMgdGhhdCBkaXN0YW5jZSB0byB0aGUgYmFzZSBvZiB0aGUgcmVnaW9uIHZpcnR1YWwgYWRkcmVzcyBwbHVzCisJdGhlIG1lc3NhZ2UgaGVhZGVyIHNpemUqLworCW1zZ0hlYWRlciA9IChzdHJ1Y3QgbXBpX21zZ19oZHIgKikoY2lyY3VsYXJRLT5iYXNlX3ZpcnQJKyBvZmZzZXQpOworCSptZXNzYWdlUHRyID0gKCh2b2lkICopbXNnSGVhZGVyKSArIHNpemVvZihzdHJ1Y3QgbXBpX21zZ19oZHIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG1waV9idWlsZF9jbWQtIGJ1aWxkIHRoZSBtZXNzYWdlIHF1ZXVlIGZvciB0cmFuc2ZlciwgdXBkYXRlIHRoZSBQSSB0byBGVworICogdG8gdGVsbCB0aGUgZncgdG8gZ2V0IHRoaXMgbWVzc2FnZSBmcm9tIElPTUIuCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqIEBjaXJjdWxhclE6IHRoZSBpbmJvdW5kIHF1ZXVlIHdlIHdhbnQgdG8gdHJhbnNmZXIgdG8gSEJBLgorICogQG9wQ29kZTogdGhlIG9wZXJhdGlvbiBjb2RlIHJlcHJlc2VudHMgY29tbWFuZHMgd2hpY2ggTExERCBhbmQgZncgcmVjb2duaXplZC4KKyAqIEBwYXlsb2FkOiB0aGUgY29tbWFuZCBwYXlsb2FkIG9mIGVhY2ggb3BlcmF0aW9uIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgbXBpX2J1aWxkX2NtZChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCQkgc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUSwKKwkJCSB1MzIgb3BDb2RlLCB2b2lkICpwYXlsb2FkKQoreworCXUzMiBIZWFkZXIgPSAwLCBocHJpb3JpdHkgPSAwLCBiYyA9IDEsIGNhdGVnb3J5ID0gMHgwMjsKKwl1MzIgcmVzcG9uc2VRdWV1ZSA9IDA7CisJdm9pZCAqcE1lc3NhZ2U7CisKKwlpZiAobXBpX21zZ19mcmVlX2dldChjaXJjdWxhclEsIDY0LCAmcE1lc3NhZ2UpIDwgMCkgeworCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk5vIGZyZWUgbXBpIGJ1ZmZlciBcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlCVUdfT04oIXBheWxvYWQpOworCS8qQ29weSB0byB0aGUgcGF5bG9hZCovCisJbWVtY3B5KHBNZXNzYWdlLCBwYXlsb2FkLCAoNjQgLSBzaXplb2Yoc3RydWN0IG1waV9tc2dfaGRyKSkpOworCisJLypCdWlsZCB0aGUgaGVhZGVyKi8KKwlIZWFkZXIgPSAoKDEgPDwgMzEpIHwgKGhwcmlvcml0eSA8PCAzMCkgfCAoKGJjICYgMHgxZikgPDwgMjQpCisJCXwgKChyZXNwb25zZVF1ZXVlICYgMHgzRikgPDwgMTYpCisJCXwgKChjYXRlZ29yeSAmIDB4RikgPDwgMTIpIHwgKG9wQ29kZSAmIDB4RkZGKSk7CisKKwlwbTgwMDFfd3JpdGVfMzIoKHBNZXNzYWdlIC0gNCksIDAsIGNwdV90b19sZTMyKEhlYWRlcikpOworCS8qVXBkYXRlIHRoZSBQSSB0byB0aGUgZmlybXdhcmUqLworCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgY2lyY3VsYXJRLT5waV9wY2lfYmFyLAorCQljaXJjdWxhclEtPnBpX29mZnNldCwgY2lyY3VsYXJRLT5wcm9kdWNlcl9pZHgpOworCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJhZnRlciBQST0gJWQgQ0k9ICVkIFxuIiwgY2lyY3VsYXJRLT5wcm9kdWNlcl9pZHgsCisJCWNpcmN1bGFyUS0+Y29uc3VtZXJfaW5kZXgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBtcGlfbXNnX2ZyZWVfc2V0KHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcE1zZywKKwkJCSAgICBzdHJ1Y3Qgb3V0Ym91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUSwgdTggYmMpCit7CisJdTMyIHByb2R1Y2VyX2luZGV4OworCXN0cnVjdCBtcGlfbXNnX2hkciAqbXNnSGVhZGVyOworCXN0cnVjdCBtcGlfbXNnX2hkciAqcE91dEJvdW5kTXNnSGVhZGVyOworCisJbXNnSGVhZGVyID0gKHN0cnVjdCBtcGlfbXNnX2hkciAqKShwTXNnIC0gc2l6ZW9mKHN0cnVjdCBtcGlfbXNnX2hkcikpOworCXBPdXRCb3VuZE1zZ0hlYWRlciA9IChzdHJ1Y3QgbXBpX21zZ19oZHIgKikoY2lyY3VsYXJRLT5iYXNlX3ZpcnQgKworCQkJCWNpcmN1bGFyUS0+Y29uc3VtZXJfaWR4ICogNjQpOworCWlmIChwT3V0Qm91bmRNc2dIZWFkZXIgIT0gbXNnSGVhZGVyKSB7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJjb25zdW1lcl9pZHggPSAlZCBtc2dIZWFkZXIgPSAlcFxuIiwKKwkJCWNpcmN1bGFyUS0+Y29uc3VtZXJfaWR4LCBtc2dIZWFkZXIpKTsKKworCQkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4IGZyb20gU1BDICovCisJCXByb2R1Y2VyX2luZGV4ID0gcG04MDAxX3JlYWRfMzIoY2lyY3VsYXJRLT5waV92aXJ0KTsKKwkJY2lyY3VsYXJRLT5wcm9kdWNlcl9pbmRleCA9IGNwdV90b19sZTMyKHByb2R1Y2VyX2luZGV4KTsKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoImNvbnN1bWVyX2lkeCA9ICVkIHByb2R1Y2VyX2luZGV4ID0gJWQiCisJCQkibXNnSGVhZGVyID0gJXBcbiIsIGNpcmN1bGFyUS0+Y29uc3VtZXJfaWR4LAorCQkJY2lyY3VsYXJRLT5wcm9kdWNlcl9pbmRleCwgbXNnSGVhZGVyKSk7CisJCXJldHVybiAwOworCX0KKwkvKiBmcmVlIHRoZSBjaXJjdWxhciBxdWV1ZSBidWZmZXIgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlKi8KKwljaXJjdWxhclEtPmNvbnN1bWVyX2lkeCA9IChjaXJjdWxhclEtPmNvbnN1bWVyX2lkeCArIGJjKSAlIDI1NjsKKwkvKiB1cGRhdGUgdGhlIENJIG9mIG91dGJvdW5kIHF1ZXVlICovCisJcG04MDAxX2N3MzIocG04MDAxX2hhLCBjaXJjdWxhclEtPmNpX3BjaV9iYXIsIGNpcmN1bGFyUS0+Y2lfb2Zmc2V0LAorCQljaXJjdWxhclEtPmNvbnN1bWVyX2lkeCk7CisJLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleCBmcm9tIFNQQyovCisJcHJvZHVjZXJfaW5kZXggPSBwbTgwMDFfcmVhZF8zMihjaXJjdWxhclEtPnBpX3ZpcnQpOworCWNpcmN1bGFyUS0+cHJvZHVjZXJfaW5kZXggPSBjcHVfdG9fbGUzMihwcm9kdWNlcl9pbmRleCk7CisJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIiBDST0lZCBQST0lZFxuIiwgY2lyY3VsYXJRLT5jb25zdW1lcl9pZHgsCisJCWNpcmN1bGFyUS0+cHJvZHVjZXJfaW5kZXgpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtcGlfbXNnX2NvbnN1bWUtIGdldCB0aGUgTVBJIG1lc3NhZ2UgZnJvbSAgb3V0Ym91bmQgcXVldWUgbWVzc2FnZSB0YWJsZS4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICogQGNpcmN1bGFyUTogdGhlIG91dGJvdW5kIHF1ZXVlICB0YWJsZS4KKyAqIEBtZXNzYWdlUHRyMTogdGhlIG1lc3NhZ2UgY29udGVudHMgb2YgdGhpcyBvdXRib3VuZCBtZXNzYWdlLgorICogQHBCQzogdGhlIG1lc3NhZ2Ugc2l6ZS4KKyAqLworc3RhdGljIHUzMiBtcGlfbXNnX2NvbnN1bWUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCQkJICAgc3RydWN0IG91dGJvdW5kX3F1ZXVlX3RhYmxlICpjaXJjdWxhclEsCisJCQkgICB2b2lkICoqbWVzc2FnZVB0cjEsIHU4ICpwQkMpCit7CisJc3RydWN0IG1waV9tc2dfaGRyCSptc2dIZWFkZXI7CisJX19sZTMyCW1zZ0hlYWRlcl90bXA7CisJdTMyIGhlYWRlcl90bXA7CisJZG8geworCQkvKiBJZiB0aGVyZSBhcmUgbm90LXlldC1kZWxpdmVyZWQgbWVzc2FnZXMgLi4uICovCisJCWlmIChjaXJjdWxhclEtPnByb2R1Y2VyX2luZGV4ICE9IGNpcmN1bGFyUS0+Y29uc3VtZXJfaWR4KSB7CisJCQkvKkdldCB0aGUgcG9pbnRlciB0byB0aGUgY2lyY3VsYXIgcXVldWUgYnVmZmVyIGVsZW1lbnQqLworCQkJbXNnSGVhZGVyID0gKHN0cnVjdCBtcGlfbXNnX2hkciAqKQorCQkJCShjaXJjdWxhclEtPmJhc2VfdmlydCArCisJCQkJY2lyY3VsYXJRLT5jb25zdW1lcl9pZHggKiA2NCk7CisJCQkvKiByZWFkIGhlYWRlciAqLworCQkJaGVhZGVyX3RtcCA9IHBtODAwMV9yZWFkXzMyKG1zZ0hlYWRlcik7CisJCQltc2dIZWFkZXJfdG1wID0gY3B1X3RvX2xlMzIoaGVhZGVyX3RtcCk7CisJCQlpZiAoMCAhPSAobXNnSGVhZGVyX3RtcCAmIDB4ODAwMDAwMDApKSB7CisJCQkJaWYgKE9QQ19PVUJfU0tJUF9FTlRSWSAhPQorCQkJCQkobXNnSGVhZGVyX3RtcCAmIDB4ZmZmKSkgeworCQkJCQkqbWVzc2FnZVB0cjEgPQorCQkJCQkJKCh1OCAqKW1zZ0hlYWRlcikgKworCQkJCQkJc2l6ZW9mKHN0cnVjdCBtcGlfbXNnX2hkcik7CisJCQkJCSpwQkMgPSAodTgpKChtc2dIZWFkZXJfdG1wID4+IDI0KSAmCisJCQkJCQkweDFmKTsKKwkJCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQkJCQlwbTgwMDFfcHJpbnRrKCI6IENJPSVkIFBJPSVkICIKKwkJCQkJCSJtc2dIZWFkZXI9JXhcbiIsCisJCQkJCQljaXJjdWxhclEtPmNvbnN1bWVyX2lkeCwKKwkJCQkJCWNpcmN1bGFyUS0+cHJvZHVjZXJfaW5kZXgsCisJCQkJCQltc2dIZWFkZXJfdG1wKSk7CisJCQkJCXJldHVybiBNUElfSU9fU1RBVFVTX1NVQ0NFU1M7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2lyY3VsYXJRLT5jb25zdW1lcl9pZHggPQorCQkJCQkJKGNpcmN1bGFyUS0+Y29uc3VtZXJfaWR4ICsKKwkJCQkJCSgobXNnSGVhZGVyX3RtcCA+PiAyNCkgJiAweDFmKSkKKwkJCQkJCSUgMjU2OworCQkJCQltc2dIZWFkZXJfdG1wID0gMDsKKwkJCQkJcG04MDAxX3dyaXRlXzMyKG1zZ0hlYWRlciwgMCwgMCk7CisJCQkJCS8qIHVwZGF0ZSB0aGUgQ0kgb2Ygb3V0Ym91bmQgcXVldWUgKi8KKwkJCQkJcG04MDAxX2N3MzIocG04MDAxX2hhLAorCQkJCQkJY2lyY3VsYXJRLT5jaV9wY2lfYmFyLAorCQkJCQkJY2lyY3VsYXJRLT5jaV9vZmZzZXQsCisJCQkJCQljaXJjdWxhclEtPmNvbnN1bWVyX2lkeCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljaXJjdWxhclEtPmNvbnN1bWVyX2lkeCA9CisJCQkJCShjaXJjdWxhclEtPmNvbnN1bWVyX2lkeCArCisJCQkJCSgobXNnSGVhZGVyX3RtcCA+PiAyNCkgJiAweDFmKSkgJSAyNTY7CisJCQkJbXNnSGVhZGVyX3RtcCA9IDA7CisJCQkJcG04MDAxX3dyaXRlXzMyKG1zZ0hlYWRlciwgMCwgMCk7CisJCQkJLyogdXBkYXRlIHRoZSBDSSBvZiBvdXRib3VuZCBxdWV1ZSAqLworCQkJCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgY2lyY3VsYXJRLT5jaV9wY2lfYmFyLAorCQkJCQljaXJjdWxhclEtPmNpX29mZnNldCwKKwkJCQkJY2lyY3VsYXJRLT5jb25zdW1lcl9pZHgpOworCQkJCXJldHVybiBNUElfSU9fU1RBVFVTX0ZBSUw7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1MzIgcHJvZHVjZXJfaW5kZXg7CisJCQl2b2lkICpwaV92aXJ0ID0gY2lyY3VsYXJRLT5waV92aXJ0OworCQkJLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleCBmcm9tIFNQQyAqLworCQkJcHJvZHVjZXJfaW5kZXggPSBwbTgwMDFfcmVhZF8zMihwaV92aXJ0KTsKKwkJCWNpcmN1bGFyUS0+cHJvZHVjZXJfaW5kZXggPSBjcHVfdG9fbGUzMihwcm9kdWNlcl9pbmRleCk7CisJCX0KKwl9IHdoaWxlIChjaXJjdWxhclEtPnByb2R1Y2VyX2luZGV4ICE9IGNpcmN1bGFyUS0+Y29uc3VtZXJfaWR4KTsKKwkvKiB3aGlsZSB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIG5vdC15ZXQtZGVsaXZlcmVkIG1lc3NhZ2UgKi8KKwkvKiByZXBvcnQgZW1wdHkgKi8KKwlyZXR1cm4gTVBJX0lPX1NUQVRVU19CVVNZOworfQorCitzdGF0aWMgdm9pZCBwbTgwMDFfd29ya19xdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHcgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJc3RydWN0IHBtODAwMV93cSAqd3EgPSBjb250YWluZXJfb2YoZHcsIHN0cnVjdCBwbTgwMDFfd3EsIHdvcmtfcSk7CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXY7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UJKmRldjsKKworCXN3aXRjaCAod3EtPmhhbmRsZXIpIHsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1M6CisJCXBtODAwMV9kZXYgPSB3cS0+ZGF0YTsKKwkJZGV2ID0gcG04MDAxX2Rldi0+c2FzX2RldmljZTsKKwkJcG04MDAxX0lfVF9uZXh1c19yZXNldChkZXYpOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX1NUUF9SRVNPVVJDRVNfQlVTWToKKwkJcG04MDAxX2RldiA9IHdxLT5kYXRhOworCQlkZXYgPSBwbTgwMDFfZGV2LT5zYXNfZGV2aWNlOworCQlwbTgwMDFfSV9UX25leHVzX3Jlc2V0KGRldik7CisJCWJyZWFrOworCWNhc2UgSU9fRFNfSU5fRVJST1I6CisJCXBtODAwMV9kZXYgPSB3cS0+ZGF0YTsKKwkJZGV2ID0gcG04MDAxX2Rldi0+c2FzX2RldmljZTsKKwkJcG04MDAxX0lfVF9uZXh1c19yZXNldChkZXYpOworCQlicmVhazsKKwljYXNlIElPX0RTX05PTl9PUEVSQVRJT05BTDoKKwkJcG04MDAxX2RldiA9IHdxLT5kYXRhOworCQlkZXYgPSBwbTgwMDFfZGV2LT5zYXNfZGV2aWNlOworCQlwbTgwMDFfSV9UX25leHVzX3Jlc2V0KGRldik7CisJCWJyZWFrOworCX0KKwlsaXN0X2RlbCgmd3EtPmVudHJ5KTsKKwlrZnJlZSh3cSk7Cit9CisKK3N0YXRpYyBpbnQgcG04MDAxX2hhbmRsZV9ldmVudChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHZvaWQgKmRhdGEsCisJCQkgICAgICAgaW50IGhhbmRsZXIpCit7CisJc3RydWN0IHBtODAwMV93cSAqd3E7CisJaW50IHJldCA9IDA7CisKKwl3cSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbTgwMDFfd3EpLCBHRlBfQVRPTUlDKTsKKwlpZiAod3EpIHsKKwkJd3EtPnBtODAwMV9oYSA9IHBtODAwMV9oYTsKKwkJd3EtPmRhdGEgPSBkYXRhOworCQl3cS0+aGFuZGxlciA9IGhhbmRsZXI7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZ3cS0+d29ya19xLCBwbTgwMDFfd29ya19xdWV1ZSk7CisJCWxpc3RfYWRkX3RhaWwoJndxLT5lbnRyeSwgJnBtODAwMV9oYS0+d3FfbGlzdCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmd3EtPndvcmtfcSwgMCk7CisJfSBlbHNlCisJCXJldCA9IC1FTk9NRU07CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG1waV9zc3BfY29tcGxldGlvbi0gcHJvY2VzcyB0aGUgZXZlbnQgdGhhdCBGVyByZXNwb25zZSB0byB0aGUgU1NQIHJlcXVlc3QuCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqIEBwaW9tYjogdGhlIG1lc3NhZ2UgY29udGVudHMgb2YgdGhpcyBvdXRib3VuZCBtZXNzYWdlLgorICoKKyAqIFdoZW4gRlcgaGFzIGNvbXBsZXRlZCBhIHNzcCByZXF1ZXN0IGZvciBleGFtcGxlIGEgSU8gcmVxdWVzdCwgYWZ0ZXIgaXQgaGFzCisgKiBmaWxsZWQgdGhlIFNHIGRhdGEgd2l0aCB0aGUgZGF0YSwgaXQgd2lsbCB0cmlnZ2VyIHRoaXMgZXZlbnQgcmVwcmVzZW50CisgKiB0aGF0IGhlIGhhcyBmaW5pc2hlZCB0aGUgam9iLHBsZWFzZSBjaGVjayB0aGUgY29yZXNwb25kaW5nIGJ1ZmZlci4KKyAqIFNvIHdlIHdpbGwgdGVsbCB0aGUgY2FsbGVyIHdobyBtYXliZSB3YWl0aW5nIHRoZSByZXN1bHQgdG8gdGVsbCB1cHBlciBsYXllcgorICogdGhhdCB0aGUgdGFzayBoYXMgYmVlbiBmaW5pc2hlZC4KKyAqLworc3RhdGljIHZvaWQKK21waV9zc3BfY29tcGxldGlvbihzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgLCB2b2lkICpwaW9tYikKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnQ7CisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHN0YXR1czsKKwl1MzIgcGFyYW07CisJdTMyIHRhZzsKKwlzdHJ1Y3Qgc3NwX2NvbXBsZXRpb25fcmVzcCAqcHNzcFBheWxvYWQ7CisJc3RydWN0IHRhc2tfc3RhdHVzX3N0cnVjdCAqdHM7CisJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqaXU7CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXY7CisJcHNzcFBheWxvYWQgPSAoc3RydWN0IHNzcF9jb21wbGV0aW9uX3Jlc3AgKikocGlvbWIgKyA0KTsKKwlzdGF0dXMgPSBsZTMyX3RvX2NwdShwc3NwUGF5bG9hZC0+c3RhdHVzKTsKKwl0YWcgPSBsZTMyX3RvX2NwdShwc3NwUGF5bG9hZC0+dGFnKTsKKwljY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1t0YWddOworCXBtODAwMV9kZXYgPSBjY2ItPmRldmljZTsKKwlwYXJhbSA9IGxlMzJfdG9fY3B1KHBzc3BQYXlsb2FkLT5wYXJhbSk7CisKKwl0ID0gY2NiLT50YXNrOworCisJaWYgKHN0YXR1cyAmJiBzdGF0dXMgIT0gSU9fVU5ERVJGTE9XKQorCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygic2FzIElPIHN0YXR1cyAweCV4XG4iLCBzdGF0dXMpKTsKKwlpZiAodW5saWtlbHkoIXQgfHwgIXQtPmxsZGRfdGFzayB8fCAhdC0+ZGV2KSkKKwkJcmV0dXJuOworCXRzID0gJnQtPnRhc2tfc3RhdHVzOworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBJT19TVUNDRVNTOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fU1VDQ0VTUyIKKwkJCSIscGFyYW0gPSAlZCBcbiIsIHBhcmFtKSk7CisJCWlmIChwYXJhbSA9PSAwKSB7CisJCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQkJdHMtPnN0YXQgPSBTQU1fR09PRDsKKwkJfSBlbHNlIHsKKwkJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCQl0cy0+c3RhdCA9IFNBU19QUk9UT19SRVNQT05TRTsKKwkJCXRzLT5yZXNpZHVhbCA9IHBhcmFtOworCQkJaXUgPSAmcHNzcFBheWxvYWQtPnNzcF9yZXNwX2l1OworCQkJc2FzX3NzcF90YXNrX3Jlc3BvbnNlKHBtODAwMV9oYS0+ZGV2LCB0LCBpdSk7CisJCX0KKwkJaWYgKHBtODAwMV9kZXYpCisJCQlwbTgwMDFfZGV2LT5ydW5uaW5nX3JlcS0tOworCQlicmVhazsKKwljYXNlIElPX0FCT1JURUQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fQUJPUlRFRCBJT01CIFRhZyBcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfQUJPUlRFRF9UQVNLOworCQlicmVhazsKKwljYXNlIElPX1VOREVSRkxPVzoKKwkJLyogU1NQIENvbXBsZXRpb24gd2l0aCBlcnJvciAqLworCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fVU5ERVJGTE9XIgorCQkJIixwYXJhbSA9ICVkIFxuIiwgcGFyYW0pKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfREFUQV9VTkRFUlJVTjsKKwkJdHMtPnJlc2lkdWFsID0gcGFyYW07CisJCWlmIChwbTgwMDFfZGV2KQorCQkJcG04MDAxX2Rldi0+cnVubmluZ19yZXEtLTsKKwkJYnJlYWs7CisJY2FzZSBJT19OT19ERVZJQ0U6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fTk9fREVWSUNFXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCXRzLT5zdGF0ID0gU0FTX1BIWV9ET1dOOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfQlJFQUs6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9CUkVBS1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1BIWV9OT1RfUkVBRFk6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9QSFlfTk9UX1JFQURZXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfUlNWRF9SRVRSWTsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfUFJPVE9DT0xfTk9UX1NVUFBPUlRFRFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX0VQUk9UTzsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9aT05FX1ZJT0xBVElPTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9aT05FX1ZJT0xBVElPTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1VOS05PV047CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfQlJFQUs6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfQlJFQUtcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9SU1ZEX1JFVFJZOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1M6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TU1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1VOS05PV047CisJCWlmICghdC0+dWxkZF90YXNrKQorCQkJcG04MDAxX2hhbmRsZV9ldmVudChwbTgwMDFfaGEsCisJCQkJcG04MDAxX2RldiwKKwkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9CQURfREVTVElOQVRJT046CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfQkFEX0RFU1RJTkFUSU9OXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfQkFEX0RFU1Q7CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfQ09OTkVDVElPTl9SQVRFX05PVF9TVVBQT1JURUQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfQ09OTkVDVElPTl9SQVRFXyIKKwkJCSJOT1RfU1VQUE9SVEVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfQ09OTl9SQVRFOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX1dST05HX0RFU1RJTkFUSU9OOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX1dST05HX0RFU1RJTkFUSU9OXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfV1JPTkdfREVTVDsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX05BS19SRUNFSVZFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX05BS19SRUNFSVZFRFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9BQ0tfTkFLX1RJTUVPVVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9BQ0tfTkFLX1RJTUVPVVRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfTkFLX1JfRVJSOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfRE1BOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9ETUFcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9PUEVOX1JFVFJZX1RJTUVPVVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9PUEVOX1JFVFJZX1RJTUVPVVRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9SU1ZEX1JFVFJZOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfT0ZGU0VUX01JU01BVENIOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfT0ZGU0VUX01JU01BVENIXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQlicmVhazsKKwljYXNlIElPX1BPUlRfSU5fUkVTRVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fUE9SVF9JTl9SRVNFVFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJYnJlYWs7CisJY2FzZSBJT19EU19OT05fT1BFUkFUSU9OQUw6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fRFNfTk9OX09QRVJBVElPTkFMXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQlpZiAoIXQtPnVsZGRfdGFzaykKKwkJCXBtODAwMV9oYW5kbGVfZXZlbnQocG04MDAxX2hhLAorCQkJCXBtODAwMV9kZXYsCisJCQkJSU9fRFNfTk9OX09QRVJBVElPTkFMKTsKKwkJYnJlYWs7CisJY2FzZSBJT19EU19JTl9SRUNPVkVSWToKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19EU19JTl9SRUNPVkVSWVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJYnJlYWs7CisJY2FzZSBJT19UTV9UQUdfTk9UX0ZPVU5EOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1RNX1RBR19OT1RfRk9VTkRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCWJyZWFrOworCWNhc2UgSU9fU1NQX0VYVF9JVV9aRVJPX0xFTl9FUlJPUjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19TU1BfRVhUX0lVX1pFUk9fTEVOX0VSUk9SXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0hXX1JFU09VUkNFX0JVU1k6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfSFdfUkVTT1VSQ0VfQlVTWVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJZGVmYXVsdDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJVbmtub3duIHN0YXR1cyAweCV4XG4iLCBzdGF0dXMpKTsKKwkJLyogbm90IGFsbG93ZWQgY2FzZS4gVGhlcmVmb3JlLCByZXR1cm4gZmFpbGVkIHN0YXR1cyAqLworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJYnJlYWs7CisJfQorCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJzY3NpX3N0YXR1cyA9ICV4IFxuICIsCisJCXBzc3BQYXlsb2FkLT5zc3BfcmVzcF9pdS5zdGF0dXMpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJdC0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfU1RBVEVfUEVORElORzsKKwl0LT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19BVF9JTklUSUFUT1I7CisJdC0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9ET05FOworCWlmICh1bmxpa2VseSgodC0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygidGFzayAweCVwIGRvbmUgd2l0aCIKKwkJCSIgaW9fc3RhdHVzIDB4JXggcmVzcCAweCV4ICIKKwkJCSJzdGF0IDB4JXggYnV0IGFib3J0ZWQgYnkgdXBwZXIgbGF5ZXIhXG4iLAorCQkJdCwgc3RhdHVzLCB0cy0+cmVzcCwgdHMtPnN0YXQpKTsKKwkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOworCQltYigpOy8qIGluIG9yZGVyIHRvIGZvcmNlIENQVSBvcmRlcmluZyAqLworCQl0LT50YXNrX2RvbmUodCk7CisJfQorfQorCisvKlNlZSB0aGUgY29tbWVudHMgZm9yIG1waV9zc3BfY29tcGxldGlvbiAqLworc3RhdGljIHZvaWQgbXBpX3NzcF9ldmVudChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgLCB2b2lkICpwaW9tYikKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdGFza19zdGF0dXNfc3RydWN0ICp0czsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2I7CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXY7CisJc3RydWN0IHNzcF9ldmVudF9yZXNwICpwc3NwUGF5bG9hZCA9CisJCShzdHJ1Y3Qgc3NwX2V2ZW50X3Jlc3AgKikocGlvbWIgKyA0KTsKKwl1MzIgZXZlbnQgPSBsZTMyX3RvX2NwdShwc3NwUGF5bG9hZC0+ZXZlbnQpOworCXUzMiB0YWcgPSBsZTMyX3RvX2NwdShwc3NwUGF5bG9hZC0+dGFnKTsKKwl1MzIgcG9ydF9pZCA9IGxlMzJfdG9fY3B1KHBzc3BQYXlsb2FkLT5wb3J0X2lkKTsKKwl1MzIgZGV2X2lkID0gbGUzMl90b19jcHUocHNzcFBheWxvYWQtPmRldmljZV9pZCk7CisKKwljY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1t0YWddOworCXQgPSBjY2ItPnRhc2s7CisJcG04MDAxX2RldiA9IGNjYi0+ZGV2aWNlOworCWlmIChldmVudCkKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoInNhcyBJTyBzdGF0dXMgMHgleFxuIiwgZXZlbnQpKTsKKwlpZiAodW5saWtlbHkoIXQgfHwgIXQtPmxsZGRfdGFzayB8fCAhdC0+ZGV2KSkKKwkJcmV0dXJuOworCXRzID0gJnQtPnRhc2tfc3RhdHVzOworCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJwb3J0X2lkID0gJXgsZGV2aWNlX2lkID0gJXhcbiIsCisJCXBvcnRfaWQsIGRldl9pZCkpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElPX09WRVJGTE9XOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fVU5ERVJGTE9XXG4iKTspCisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RBVEFfT1ZFUlJVTjsKKwkJdHMtPnJlc2lkdWFsID0gMDsKKwkJaWYgKHBtODAwMV9kZXYpCisJCQlwbTgwMDFfZGV2LT5ydW5uaW5nX3JlcS0tOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfQlJFQUs6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9CUkVBS1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19JTlRFUlJVUFRFRDsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1BIWV9OT1RfUkVBRFk6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9QSFlfTk9UX1JFQURZXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfUlNWRF9SRVRSWTsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX1BST1RPQ09MX05PVCIKKwkJCSJfU1VQUE9SVEVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfRVBST1RPOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX1pPTkVfVklPTEFUSU9OOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX1pPTkVfVklPTEFUSU9OXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfVU5LTk9XTjsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9CUkVBSzoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9CUkVBS1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUzoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfVU5LTk9XTjsKKwkJaWYgKCF0LT51bGRkX3Rhc2spCisJCQlwbTgwMDFfaGFuZGxlX2V2ZW50KHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfZGV2LAorCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0JBRF9ERVNUSU5BVElPTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9CQURfREVTVElOQVRJT05cbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9CQURfREVTVDsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9DT05ORUNUSU9OX1JBVEVfIgorCQkJIk5PVF9TVVBQT1JURURcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9DT05OX1JBVEU7CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfV1JPTkdfREVTVElOQVRJT046CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkgICAgICAgcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfV1JPTkdfREVTVElOQVRJT05cbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9XUk9OR19ERVNUOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfTkFLX1JFQ0VJVkVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfTkFLX1JFQ0VJVkVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfUlNWRF9SRVRSWTsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX0FDS19OQUtfVElNRU9VVDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX0FDS19OQUtfVElNRU9VVFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19OQUtfUl9FUlI7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9PUEVOX1JFVFJZX1RJTUVPVVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9PUEVOX1JFVFJZX1RJTUVPVVRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9SU1ZEX1JFVFJZOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfVU5FWFBFQ1RFRF9QSEFTRToKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1VORVhQRUNURURfUEhBU0VcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfREFUQV9PVkVSUlVOOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfWEZFUl9SRFlfT1ZFUlJVTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1hGRVJfUkRZX09WRVJSVU5cbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfREFUQV9PVkVSUlVOOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfWEZFUl9SRFlfTk9UX0VYUEVDVEVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJICAgICAgIHBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfWEZFUl9SRFlfTk9UX0VYUEVDVEVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RBVEFfT1ZFUlJVTjsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX0NNRF9JU1NVRV9BQ0tfTkFLX1RJTUVPVVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX0NNRF9JU1NVRV9BQ0tfTkFLX1RJTUVPVVRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfREFUQV9PVkVSUlVOOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfT0ZGU0VUX01JU01BVENIOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfT0ZGU0VUX01JU01BVENIXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RBVEFfT1ZFUlJVTjsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1hGRVJfWkVST19EQVRBX0xFTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1hGRVJfWkVST19EQVRBX0xFTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19EQVRBX09WRVJSVU47CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9DTURfRlJBTUVfSVNTVUVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIiAgSU9fWEZFUl9DTURfRlJBTUVfSVNTVUVEXG4iKSk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIlVua25vd24gc3RhdHVzIDB4JXhcbiIsIGV2ZW50KSk7CisJCS8qIG5vdCBhbGxvd2VkIGNhc2UuIFRoZXJlZm9yZSwgcmV0dXJuIGZhaWxlZCBzdGF0dXMgKi8KKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfREFUQV9PVkVSUlVOOworCQlicmVhazsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCXQtPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX1NUQVRFX1BFTkRJTkc7CisJdC0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfQVRfSU5JVElBVE9SOworCXQtPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKKwlpZiAodW5saWtlbHkoKHQtPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoInRhc2sgMHglcCBkb25lIHdpdGgiCisJCQkiIGV2ZW50IDB4JXggcmVzcCAweCV4ICIKKwkJCSJzdGF0IDB4JXggYnV0IGFib3J0ZWQgYnkgdXBwZXIgbGF5ZXIhXG4iLAorCQkJdCwgZXZlbnQsIHRzLT5yZXNwLCB0cy0+c3RhdCkpOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CisJCW1iKCk7LyogaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nICovCisJCXQtPnRhc2tfZG9uZSh0KTsKKwl9Cit9CisKKy8qU2VlIHRoZSBjb21tZW50cyBmb3IgbXBpX3NzcF9jb21wbGV0aW9uICovCitzdGF0aWMgdm9pZAorbXBpX3NhdGFfY29tcGxldGlvbihzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHZvaWQgKnBpb21iKQoreworCXN0cnVjdCBzYXNfdGFzayAqdDsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcGFyYW07CisJdTMyIHN0YXR1czsKKwl1MzIgdGFnOworCXN0cnVjdCBzYXRhX2NvbXBsZXRpb25fcmVzcCAqcHNhdGFQYXlsb2FkOworCXN0cnVjdCB0YXNrX3N0YXR1c19zdHJ1Y3QgKnRzOworCXN0cnVjdCBhdGFfdGFza19yZXNwICpyZXNwIDsKKwl1MzIgKnNhdGFfcmVzcDsKKwlzdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2RldjsKKworCXBzYXRhUGF5bG9hZCA9IChzdHJ1Y3Qgc2F0YV9jb21wbGV0aW9uX3Jlc3AgKikocGlvbWIgKyA0KTsKKwlzdGF0dXMgPSBsZTMyX3RvX2NwdShwc2F0YVBheWxvYWQtPnN0YXR1cyk7CisJdGFnID0gbGUzMl90b19jcHUocHNhdGFQYXlsb2FkLT50YWcpOworCisJY2NiID0gJnBtODAwMV9oYS0+Y2NiX2luZm9bdGFnXTsKKwlwYXJhbSA9IGxlMzJfdG9fY3B1KHBzYXRhUGF5bG9hZC0+cGFyYW0pOworCXQgPSBjY2ItPnRhc2s7CisJdHMgPSAmdC0+dGFza19zdGF0dXM7CisJcG04MDAxX2RldiA9IGNjYi0+ZGV2aWNlOworCWlmIChzdGF0dXMpCisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJzYXRhIElPIHN0YXR1cyAweCV4XG4iLCBzdGF0dXMpKTsKKwlpZiAodW5saWtlbHkoIXQgfHwgIXQtPmxsZGRfdGFzayB8fCAhdC0+ZGV2KSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIElPX1NVQ0NFU1M6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJJT19TVUNDRVNTXG4iKSk7CisJCWlmIChwYXJhbSA9PSAwKSB7CisJCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQkJdHMtPnN0YXQgPSBTQU1fR09PRDsKKwkJfSBlbHNlIHsKKwkJCXU4IGxlbjsKKwkJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCQl0cy0+c3RhdCA9IFNBU19QUk9UT19SRVNQT05TRTsKKwkJCXRzLT5yZXNpZHVhbCA9IHBhcmFtOworCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQkJcG04MDAxX3ByaW50aygiU0FTX1BST1RPX1JFU1BPTlNFIGxlbiA9ICVkXG4iLAorCQkJCXBhcmFtKSk7CisJCQlzYXRhX3Jlc3AgPSAmcHNhdGFQYXlsb2FkLT5zYXRhX3Jlc3BbMF07CisJCQlyZXNwID0gKHN0cnVjdCBhdGFfdGFza19yZXNwICopdHMtPmJ1ZjsKKwkJCWlmICh0LT5hdGFfdGFzay5kbWFfeGZlciA9PSAwICYmCisJCQl0LT5kYXRhX2RpciA9PSBQQ0lfRE1BX0ZST01ERVZJQ0UpIHsKKwkJCQlsZW4gPSBzaXplb2Yoc3RydWN0IHBpb19zZXR1cF9maXMpOworCQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIlBJTyByZWFkIGxlbiA9ICVkXG4iLCBsZW4pKTsKKwkJCX0gZWxzZSBpZiAodC0+YXRhX3Rhc2sudXNlX25jcSkgeworCQkJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc2V0X2Rldl9iaXRzX2Zpcyk7CisJCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQkJCXBtODAwMV9wcmludGsoIkZQRE1BIGxlbiA9ICVkXG4iLCBsZW4pKTsKKwkJCX0gZWxzZSB7CisJCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBkZXZfdG9faG9zdF9maXMpOworCQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIm90aGVyIGxlbiA9ICVkXG4iLCBsZW4pKTsKKwkJCX0KKwkJCWlmIChTQVNfU1RBVFVTX0JVRl9TSVpFID49IHNpemVvZigqcmVzcCkpIHsKKwkJCQlyZXNwLT5mcmFtZV9sZW4gPSBsZW47CisJCQkJbWVtY3B5KCZyZXNwLT5lbmRpbmdfZmlzWzBdLCBzYXRhX3Jlc3AsIGxlbik7CisJCQkJdHMtPmJ1Zl92YWxpZF9zaXplID0gc2l6ZW9mKCpyZXNwKTsKKwkJCX0gZWxzZQorCQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJCQlwbTgwMDFfcHJpbnRrKCJyZXNwb25zZSB0byBsYXJnZSBcbiIpKTsKKwkJfQorCQlpZiAocG04MDAxX2RldikKKwkJCXBtODAwMV9kZXYtPnJ1bm5pbmdfcmVxLS07CisJCWJyZWFrOworCWNhc2UgSU9fQUJPUlRFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19BQk9SVEVEIElPTUIgVGFnIFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19BQk9SVEVEX1RBU0s7CisJCWlmIChwbTgwMDFfZGV2KQorCQkJcG04MDAxX2Rldi0+cnVubmluZ19yZXEtLTsKKwkJYnJlYWs7CisJCS8qIGZvbGxvd2luZyBjYXNlcyBhcmUgdG8gZG8gY2FzZXMgKi8KKwljYXNlIElPX1VOREVSRkxPVzoKKwkJLyogU0FUQSBDb21wbGV0aW9uIHdpdGggZXJyb3IgKi8KKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19VTkRFUkZMT1cgcGFyYW0gPSAlZFxuIiwgcGFyYW0pKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfREFUQV9VTkRFUlJVTjsKKwkJdHMtPnJlc2lkdWFsID0gIHBhcmFtOworCQlpZiAocG04MDAxX2RldikKKwkJCXBtODAwMV9kZXYtPnJ1bm5pbmdfcmVxLS07CisJCWJyZWFrOworCWNhc2UgSU9fTk9fREVWSUNFOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX05PX0RFVklDRVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCQl0cy0+c3RhdCA9IFNBU19QSFlfRE9XTjsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX0JSRUFLOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfQlJFQUtcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfSU5URVJSVVBURUQ7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9QSFlfTk9UX1JFQURZOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfUEhZX05PVF9SRUFEWVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfUFJPVE9DT0xfTk9UX1NVUFBPUlRFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9QUk9UT0NPTF9OT1QiCisJCQkiX1NVUFBPUlRFRFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX0VQUk9UTzsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9aT05FX1ZJT0xBVElPTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9aT05FX1ZJT0xBVElPTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1VOS05PV047CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfQlJFQUs6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfQlJFQUtcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9SU1ZEX0NPTlQwOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1M6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TU1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19ERVZfTk9fUkVTUE9OU0U7CisJCWlmICghdC0+dWxkZF90YXNrKSB7CisJCQlwbTgwMDFfaGFuZGxlX2V2ZW50KHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfZGV2LAorCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOworCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKKwkJCW1iKCk7LyppbiBvcmRlciB0byBmb3JjZSBDUFUgb3JkZXJpbmcqLworCQkJdC0+dGFza19kb25lKHQpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfQkFEX0RFU1RJTkFUSU9OOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX0JBRF9ERVNUSU5BVElPTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX0JBRF9ERVNUOworCQlpZiAoIXQtPnVsZGRfdGFzaykgeworCQkJcG04MDAxX2hhbmRsZV9ldmVudChwbTgwMDFfaGEsCisJCQkJcG04MDAxX2RldiwKKwkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKKwkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CisJCQltYigpOy8qZGl0dG8qLworCQkJdC0+dGFza19kb25lKHQpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfQ09OTkVDVElPTl9SQVRFX05PVF9TVVBQT1JURUQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfQ09OTkVDVElPTl9SQVRFXyIKKwkJCSJOT1RfU1VQUE9SVEVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfQ09OTl9SQVRFOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX1NUUF9SRVNPVVJDRVNfQlVTWToKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9TVFBfUkVTT1VSQ0VTIgorCQkJIl9CVVNZXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RFVl9OT19SRVNQT05TRTsKKwkJaWYgKCF0LT51bGRkX3Rhc2spIHsKKwkJCXBtODAwMV9oYW5kbGVfZXZlbnQocG04MDAxX2hhLAorCQkJCXBtODAwMV9kZXYsCisJCQkJSU9fT1BFTl9DTlhfRVJST1JfU1RQX1JFU09VUkNFU19CVVNZKTsKKwkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CisJCQltYigpOy8qIGRpdHRvKi8KKwkJCXQtPnRhc2tfZG9uZSh0KTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX1dST05HX0RFU1RJTkFUSU9OOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJICAgICAgIHBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX1dST05HX0RFU1RJTkFUSU9OXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfV1JPTkdfREVTVDsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX05BS19SRUNFSVZFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX05BS19SRUNFSVZFRFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19OQUtfUl9FUlI7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9BQ0tfTkFLX1RJTUVPVVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9BQ0tfTkFLX1RJTUVPVVRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfTkFLX1JfRVJSOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfRE1BOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfRE1BXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0FCT1JURURfVEFTSzsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1NBVEFfTElOS19USU1FT1VUOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfU0FUQV9MSU5LX1RJTUVPVVRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJdHMtPnN0YXQgPSBTQVNfREVWX05PX1JFU1BPTlNFOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfUkVKRUNURURfTkNRX01PREU6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9SRUpFQ1RFRF9OQ1FfTU9ERVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19EQVRBX1VOREVSUlVOOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfT1BFTl9SRVRSWV9USU1FT1VUOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfT1BFTl9SRVRSWV9USU1FT1VUXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fVE87CisJCWJyZWFrOworCWNhc2UgSU9fUE9SVF9JTl9SRVNFVDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19QT1JUX0lOX1JFU0VUXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RFVl9OT19SRVNQT05TRTsKKwkJYnJlYWs7CisJY2FzZSBJT19EU19OT05fT1BFUkFUSU9OQUw6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fRFNfTk9OX09QRVJBVElPTkFMXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RFVl9OT19SRVNQT05TRTsKKwkJaWYgKCF0LT51bGRkX3Rhc2spIHsKKwkJCXBtODAwMV9oYW5kbGVfZXZlbnQocG04MDAxX2hhLCBwbTgwMDFfZGV2LAorCQkJCSAgICBJT19EU19OT05fT1BFUkFUSU9OQUwpOworCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKKwkJCW1iKCk7LypkaXR0byovCisJCQl0LT50YXNrX2RvbmUodCk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJT19EU19JTl9SRUNPVkVSWToKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCIgIElPX0RTX0lOX1JFQ09WRVJZXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RFVl9OT19SRVNQT05TRTsKKwkJYnJlYWs7CisJY2FzZSBJT19EU19JTl9FUlJPUjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19EU19JTl9FUlJPUlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19ERVZfTk9fUkVTUE9OU0U7CisJCWlmICghdC0+dWxkZF90YXNrKSB7CisJCQlwbTgwMDFfaGFuZGxlX2V2ZW50KHBtODAwMV9oYSwgcG04MDAxX2RldiwKKwkJCQkgICAgSU9fRFNfSU5fRVJST1IpOworCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKKwkJCW1iKCk7LypkaXR0byovCisJCQl0LT50YXNrX2RvbmUodCk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9IV19SRVNPVVJDRV9CVVNZOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX0hXX1JFU09VUkNFX0JVU1lcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9SU1ZEX1JFVFJZOworCWRlZmF1bHQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiVW5rbm93biBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKSk7CisJCS8qIG5vdCBhbGxvd2VkIGNhc2UuIFRoZXJlZm9yZSwgcmV0dXJuIGZhaWxlZCBzdGF0dXMgKi8KKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfREVWX05PX1JFU1BPTlNFOworCQlicmVhazsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCXQtPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX1NUQVRFX1BFTkRJTkc7CisJdC0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfQVRfSU5JVElBVE9SOworCXQtPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKKwlpZiAodW5saWtlbHkoKHQtPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJ0YXNrIDB4JXAgZG9uZSB3aXRoIGlvX3N0YXR1cyAweCV4IgorCQkJIiByZXNwIDB4JXggc3RhdCAweCV4IGJ1dCBhYm9ydGVkIGJ5IHVwcGVyIGxheWVyIVxuIiwKKwkJCXQsIHN0YXR1cywgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKKwkJbWIoKTsvKiBkaXR0byAqLworCQl0LT50YXNrX2RvbmUodCk7CisJfQorfQorCisvKlNlZSB0aGUgY29tbWVudHMgZm9yIG1waV9zc3BfY29tcGxldGlvbiAqLworc3RhdGljIHZvaWQgbXBpX3NhdGFfZXZlbnQoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhICwgdm9pZCAqcGlvbWIpCit7CisJc3RydWN0IHNhc190YXNrICp0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHRhc2tfc3RhdHVzX3N0cnVjdCAqdHM7CisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiOworCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2OworCXN0cnVjdCBzYXRhX2V2ZW50X3Jlc3AgKnBzYXRhUGF5bG9hZCA9CisJCShzdHJ1Y3Qgc2F0YV9ldmVudF9yZXNwICopKHBpb21iICsgNCk7CisJdTMyIGV2ZW50ID0gbGUzMl90b19jcHUocHNhdGFQYXlsb2FkLT5ldmVudCk7CisJdTMyIHRhZyA9IGxlMzJfdG9fY3B1KHBzYXRhUGF5bG9hZC0+dGFnKTsKKwl1MzIgcG9ydF9pZCA9IGxlMzJfdG9fY3B1KHBzYXRhUGF5bG9hZC0+cG9ydF9pZCk7CisJdTMyIGRldl9pZCA9IGxlMzJfdG9fY3B1KHBzYXRhUGF5bG9hZC0+ZGV2aWNlX2lkKTsKKworCWNjYiA9ICZwbTgwMDFfaGEtPmNjYl9pbmZvW3RhZ107CisJdCA9IGNjYi0+dGFzazsKKwlwbTgwMDFfZGV2ID0gY2NiLT5kZXZpY2U7CisJaWYgKGV2ZW50KQorCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygic2F0YSBJTyBzdGF0dXMgMHgleFxuIiwgZXZlbnQpKTsKKwlpZiAodW5saWtlbHkoIXQgfHwgIXQtPmxsZGRfdGFzayB8fCAhdC0+ZGV2KSkKKwkJcmV0dXJuOworCXRzID0gJnQtPnRhc2tfc3RhdHVzOworCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJwb3J0X2lkID0gJXgsZGV2aWNlX2lkID0gJXhcbiIsCisJCXBvcnRfaWQsIGRldl9pZCkpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElPX09WRVJGTE9XOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fVU5ERVJGTE9XXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RBVEFfT1ZFUlJVTjsKKwkJdHMtPnJlc2lkdWFsID0gMDsKKwkJaWYgKHBtODAwMV9kZXYpCisJCQlwbTgwMDFfZGV2LT5ydW5uaW5nX3JlcS0tOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfQlJFQUs6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9CUkVBS1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19JTlRFUlJVUFRFRDsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1BIWV9OT1RfUkVBRFk6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9QSFlfTk9UX1JFQURZXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfUlNWRF9SRVRSWTsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX1BST1RPQ09MX05PVCIKKwkJCSJfU1VQUE9SVEVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfRVBST1RPOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX1pPTkVfVklPTEFUSU9OOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX1pPTkVfVklPTEFUSU9OXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfVU5LTk9XTjsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9CUkVBSzoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9CUkVBS1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfQ09OVDA7CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUzoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCXRzLT5zdGF0ID0gU0FTX0RFVl9OT19SRVNQT05TRTsKKwkJaWYgKCF0LT51bGRkX3Rhc2spIHsKKwkJCXBtODAwMV9oYW5kbGVfZXZlbnQocG04MDAxX2hhLAorCQkJCXBtODAwMV9kZXYsCisJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CisJCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOworCQkJbWIoKTsvKmRpdHRvKi8KKwkJCXQtPnRhc2tfZG9uZSh0KTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0JBRF9ERVNUSU5BVElPTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9CQURfREVTVElOQVRJT05cbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9CQURfREVTVDsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9DT05ORUNUSU9OX1JBVEVfIgorCQkJIk5PVF9TVVBQT1JURURcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9DT05OX1JBVEU7CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfV1JPTkdfREVTVElOQVRJT046CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkgICAgICAgcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfV1JPTkdfREVTVElOQVRJT05cbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9XUk9OR19ERVNUOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfTkFLX1JFQ0VJVkVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfTkFLX1JFQ0VJVkVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX05BS19SX0VSUjsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1BFRVJfQUJPUlRFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1BFRVJfQUJPUlRFRFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19OQUtfUl9FUlI7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9SRUpFQ1RFRF9OQ1FfTU9ERToKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1JFSkVDVEVEX05DUV9NT0RFXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RBVEFfVU5ERVJSVU47CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9PUEVOX1JFVFJZX1RJTUVPVVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9PUEVOX1JFVFJZX1RJTUVPVVRcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9UTzsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1VORVhQRUNURURfUEhBU0U6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9VTkVYUEVDVEVEX1BIQVNFXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fVE87CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9YRkVSX1JEWV9PVkVSUlVOOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfWEZFUl9SRFlfT1ZFUlJVTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1RPOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfRVJST1JfWEZFUl9SRFlfTk9UX0VYUEVDVEVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJICAgICAgIHBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfWEZFUl9SRFlfTk9UX0VYUEVDVEVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fVE87CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9PRkZTRVRfTUlTTUFUQ0g6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fWEZFUl9FUlJPUl9PRkZTRVRfTUlTTUFUQ0hcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9UTzsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX0VSUk9SX1hGRVJfWkVST19EQVRBX0xFTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1hGRVJfWkVST19EQVRBX0xFTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1RPOworCQlicmVhazsKKwljYXNlIElPX1hGRVJfQ01EX0ZSQU1FX0lTU1VFRDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0NNRF9GUkFNRV9JU1NVRURcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX1BJT19TRVRVUF9FUlJPUjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX1BJT19TRVRVUF9FUlJPUlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1RPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIlVua25vd24gc3RhdHVzIDB4JXhcbiIsIGV2ZW50KSk7CisJCS8qIG5vdCBhbGxvd2VkIGNhc2UuIFRoZXJlZm9yZSwgcmV0dXJuIGZhaWxlZCBzdGF0dXMgKi8KKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9UTzsKKwkJYnJlYWs7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwl0LT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19TVEFURV9QRU5ESU5HOworCXQtPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX0FUX0lOSVRJQVRPUjsKKwl0LT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0RPTkU7CisJaWYgKHVubGlrZWx5KCh0LT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygidGFzayAweCVwIGRvbmUgd2l0aCBpb19zdGF0dXMgMHgleCIKKwkJCSIgcmVzcCAweCV4IHN0YXQgMHgleCBidXQgYWJvcnRlZCBieSB1cHBlciBsYXllciFcbiIsCisJCQl0LCBldmVudCwgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKKwkJbWIoKTsvKiBpbiBvcmRlciB0byBmb3JjZSBDUFUgb3JkZXJpbmcgKi8KKwkJdC0+dGFza19kb25lKHQpOworCX0KK30KKworLypTZWUgdGhlIGNvbW1lbnRzIGZvciBtcGlfc3NwX2NvbXBsZXRpb24gKi8KK3N0YXRpYyB2b2lkCittcGlfc21wX2NvbXBsZXRpb24oc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB2b2lkICpwaW9tYikKK3sKKwl1MzIgcGFyYW07CisJc3RydWN0IHNhc190YXNrICp0OworCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0dXM7CisJdTMyIHRhZzsKKwlzdHJ1Y3Qgc21wX2NvbXBsZXRpb25fcmVzcCAqcHNtcFBheWxvYWQ7CisJc3RydWN0IHRhc2tfc3RhdHVzX3N0cnVjdCAqdHM7CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXY7CisKKwlwc21wUGF5bG9hZCA9IChzdHJ1Y3Qgc21wX2NvbXBsZXRpb25fcmVzcCAqKShwaW9tYiArIDQpOworCXN0YXR1cyA9IGxlMzJfdG9fY3B1KHBzbXBQYXlsb2FkLT5zdGF0dXMpOworCXRhZyA9IGxlMzJfdG9fY3B1KHBzbXBQYXlsb2FkLT50YWcpOworCisJY2NiID0gJnBtODAwMV9oYS0+Y2NiX2luZm9bdGFnXTsKKwlwYXJhbSA9IGxlMzJfdG9fY3B1KHBzbXBQYXlsb2FkLT5wYXJhbSk7CisJdCA9IGNjYi0+dGFzazsKKwl0cyA9ICZ0LT50YXNrX3N0YXR1czsKKwlwbTgwMDFfZGV2ID0gY2NiLT5kZXZpY2U7CisJaWYgKHN0YXR1cykKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoInNtcCBJTyBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKSk7CisJaWYgKHVubGlrZWx5KCF0IHx8ICF0LT5sbGRkX3Rhc2sgfHwgIXQtPmRldikpCisJCXJldHVybjsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBJT19TVUNDRVNTOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fU1VDQ0VTU1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBTV9HT09EOworCWlmIChwbTgwMDFfZGV2KQorCQkJcG04MDAxX2Rldi0+cnVubmluZ19yZXEtLTsKKwkJYnJlYWs7CisJY2FzZSBJT19BQk9SVEVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX0FCT1JURUQgSU9NQlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19BQk9SVEVEX1RBU0s7CisJCWlmIChwbTgwMDFfZGV2KQorCQkJcG04MDAxX2Rldi0+cnVubmluZ19yZXEtLTsKKwkJYnJlYWs7CisJY2FzZSBJT19PVkVSRkxPVzoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIklPX1VOREVSRkxPV1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19EQVRBX09WRVJSVU47CisJCXRzLT5yZXNpZHVhbCA9IDA7CisJCWlmIChwbTgwMDFfZGV2KQorCQkJcG04MDAxX2Rldi0+cnVubmluZ19yZXEtLTsKKwkJYnJlYWs7CisJY2FzZSBJT19OT19ERVZJQ0U6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJJT19OT19ERVZJQ0VcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfUEhZX0RPV047CisJCWJyZWFrOworCWNhc2UgSU9fRVJST1JfSFdfVElNRU9VVDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19FUlJPUl9IV19USU1FT1VUXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FNX0JVU1k7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9CUkVBSzoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX0JSRUFLXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FNX0JVU1k7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9QSFlfTk9UX1JFQURZOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfUEhZX05PVF9SRUFEWVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBTV9CVVNZOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX1BST1RPQ09MX05PVF9TVVBQT1JURUQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOworCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfVU5LTk9XTjsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9aT05FX1ZJT0xBVElPTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9aT05FX1ZJT0xBVElPTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1VOS05PV047CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfQlJFQUs6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfQlJFQUtcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9SU1ZEX0NPTlQwOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1M6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TU1xuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1VOS05PV047CisJCXBtODAwMV9oYW5kbGVfZXZlbnQocG04MDAxX2hhLAorCQkJCXBtODAwMV9kZXYsCisJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CisJCWJyZWFrOworCWNhc2UgSU9fT1BFTl9DTlhfRVJST1JfQkFEX0RFU1RJTkFUSU9OOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX0JBRF9ERVNUSU5BVElPTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX0JBRF9ERVNUOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0NPTk5FQ1RJT05fUkFURV9OT1RfU1VQUE9SVEVEOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX09QRU5fQ05YX0VSUk9SX0NPTk5FQ1RJT05fUkFURV8iCisJCQkiTk9UX1NVUFBPUlRFRFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX0NPTk5fUkFURTsKKwkJYnJlYWs7CisJY2FzZSBJT19PUEVOX0NOWF9FUlJPUl9XUk9OR19ERVNUSU5BVElPTjoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCSAgICAgICBwbTgwMDFfcHJpbnRrKCJJT19PUEVOX0NOWF9FUlJPUl9XUk9OR19ERVNUSU5BVElPTlxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1dST05HX0RFU1Q7CisJCWJyZWFrOworCWNhc2UgSU9fWEZFUl9FUlJPUl9SWF9GUkFNRToKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1JYX0ZSQU1FXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RFVl9OT19SRVNQT05TRTsKKwkJYnJlYWs7CisJY2FzZSBJT19YRkVSX09QRU5fUkVUUllfVElNRU9VVDoKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX09QRU5fUkVUUllfVElNRU9VVFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJCWJyZWFrOworCWNhc2UgSU9fRVJST1JfSU5URVJOQUxfU01QX1JFU09VUkNFOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX0VSUk9SX0lOVEVSTkFMX1NNUF9SRVNPVVJDRVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOworCQlicmVhazsKKwljYXNlIElPX1BPUlRfSU5fUkVTRVQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fUE9SVF9JTl9SRVNFVFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJCWJyZWFrOworCWNhc2UgSU9fRFNfTk9OX09QRVJBVElPTkFMOgorCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIklPX0RTX05PTl9PUEVSQVRJT05BTFxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19ERVZfTk9fUkVTUE9OU0U7CisJCWJyZWFrOworCWNhc2UgSU9fRFNfSU5fUkVDT1ZFUlk6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fRFNfSU5fUkVDT1ZFUllcbiIpKTsKKwkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKKwkJdHMtPnN0YXQgPSBTQVNfT1BFTl9SRUpFQ1Q7CisJCXRzLT5vcGVuX3Jlal9yZWFzb24gPSBTQVNfT1JFSl9SU1ZEX1JFVFJZOworCQlicmVhazsKKwljYXNlIElPX09QRU5fQ05YX0VSUk9SX0hXX1JFU09VUkNFX0JVU1k6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSU9fT1BFTl9DTlhfRVJST1JfSFdfUkVTT1VSQ0VfQlVTWVxuIikpOworCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOworCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKKwkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiVW5rbm93biBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FTX0RFVl9OT19SRVNQT05TRTsKKwkJLyogbm90IGFsbG93ZWQgY2FzZS4gVGhlcmVmb3JlLCByZXR1cm4gZmFpbGVkIHN0YXR1cyAqLworCQlicmVhazsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCXQtPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX1NUQVRFX1BFTkRJTkc7CisJdC0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfQVRfSU5JVElBVE9SOworCXQtPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKKwlpZiAodW5saWtlbHkoKHQtPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoInRhc2sgMHglcCBkb25lIHdpdGgiCisJCQkiIGlvX3N0YXR1cyAweCV4IHJlc3AgMHgleCAiCisJCQkic3RhdCAweCV4IGJ1dCBhYm9ydGVkIGJ5IHVwcGVyIGxheWVyIVxuIiwKKwkJCXQsIHN0YXR1cywgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKKwkJbWIoKTsvKiBpbiBvcmRlciB0byBmb3JjZSBDUFUgb3JkZXJpbmcgKi8KKwkJdC0+dGFza19kb25lKHQpOworCX0KK30KKworc3RhdGljIHZvaWQKK21waV9zZXRfZGV2X3N0YXRlX3Jlc3Aoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB2b2lkICpwaW9tYikKK3sKKwlzdHJ1Y3Qgc2V0X2Rldl9zdGF0ZV9yZXNwICpwUGF5bG9hZCA9CisJCShzdHJ1Y3Qgc2V0X2Rldl9zdGF0ZV9yZXNwICopKHBpb21iICsgNCk7CisJdTMyIHRhZyA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT50YWcpOworCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYiA9ICZwbTgwMDFfaGEtPmNjYl9pbmZvW3RhZ107CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXYgPSBjY2ItPmRldmljZTsKKwl1MzIgc3RhdHVzID0gbGUzMl90b19jcHUocFBheWxvYWQtPnN0YXR1cyk7CisJdTMyIGRldmljZV9pZCA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5kZXZpY2VfaWQpOworCXU4IHBkcyA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5wZHNfbmRzKSB8IFBEU19CSVRTOworCXU4IG5kcyA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5wZHNfbmRzKSB8IE5EU19CSVRTOworCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiU2V0IGRldmljZSBpZCA9IDB4JXggc3RhdGUgIgorCQkiZnJvbSAweCV4IHRvIDB4JXggc3RhdHVzID0gMHgleCFcbiIsCisJCWRldmljZV9pZCwgcGRzLCBuZHMsIHN0YXR1cykpOworCWNvbXBsZXRlKHBtODAwMV9kZXYtPnNldGRzX2NvbXBsZXRpb24pOworCWNjYi0+dGFzayA9IE5VTEw7CisJY2NiLT5jY2JfdGFnID0gMHhGRkZGRkZGRjsKKwlwbTgwMDFfY2NiX2ZyZWUocG04MDAxX2hhLCB0YWcpOworfQorCitzdGF0aWMgdm9pZAorbXBpX3NldF9udm1kX3Jlc3Aoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB2b2lkICpwaW9tYikKK3sKKwlzdHJ1Y3QgZ2V0X252bV9kYXRhX3Jlc3AgKnBQYXlsb2FkID0KKwkJKHN0cnVjdCBnZXRfbnZtX2RhdGFfcmVzcCAqKShwaW9tYiArIDQpOworCXUzMiB0YWcgPSBsZTMyX3RvX2NwdShwUGF5bG9hZC0+dGFnKTsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1t0YWddOworCXUzMiBkbGVuX3N0YXR1cyA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5kbGVuX3N0YXR1cyk7CisJY29tcGxldGUocG04MDAxX2hhLT5udm1kX2NvbXBsZXRpb24pOworCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiU2V0IG52bSBkYXRhIGNvbXBsZXRlIVxuIikpOworCWlmICgoZGxlbl9zdGF0dXMgJiBOVk1EX1NUQVQpICE9IDApIHsKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIlNldCBudm0gZGF0YSBlcnJvciFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwljY2ItPnRhc2sgPSBOVUxMOworCWNjYi0+Y2NiX3RhZyA9IDB4RkZGRkZGRkY7CisJcG04MDAxX2NjYl9mcmVlKHBtODAwMV9oYSwgdGFnKTsKK30KKworc3RhdGljIHZvaWQKK21waV9nZXRfbnZtZF9yZXNwKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcGlvbWIpCit7CisJc3RydWN0IGZ3X2NvbnRyb2xfZXgJKmZ3X2NvbnRyb2xfY29udGV4dDsKKwlzdHJ1Y3QgZ2V0X252bV9kYXRhX3Jlc3AgKnBQYXlsb2FkID0KKwkJKHN0cnVjdCBnZXRfbnZtX2RhdGFfcmVzcCAqKShwaW9tYiArIDQpOworCXUzMiB0YWcgPSBsZTMyX3RvX2NwdShwUGF5bG9hZC0+dGFnKTsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1t0YWddOworCXUzMiBkbGVuX3N0YXR1cyA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5kbGVuX3N0YXR1cyk7CisJdTMyIGlyX3Rkc19ibl9kcHNfZGFzX252bSA9CisJCWxlMzJfdG9fY3B1KHBQYXlsb2FkLT5pcl90ZGFfYm5fZHBzX2Rhc19udm0pOworCXZvaWQgKnZpcnRfYWRkciA9IHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS52aXJ0X3B0cjsKKwlmd19jb250cm9sX2NvbnRleHQgPSBjY2ItPmZ3X2NvbnRyb2xfY29udGV4dDsKKworCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiR2V0IG52bSBkYXRhIGNvbXBsZXRlIVxuIikpOworCWlmICgoZGxlbl9zdGF0dXMgJiBOVk1EX1NUQVQpICE9IDApIHsKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkdldCBudm0gZGF0YSBlcnJvciFcbiIpKTsKKwkJY29tcGxldGUocG04MDAxX2hhLT5udm1kX2NvbXBsZXRpb24pOworCQlyZXR1cm47CisJfQorCisJaWYgKGlyX3Rkc19ibl9kcHNfZGFzX252bSAmIElQTW9kZSkgeworCQkvKiBpbmRpcmVjdCBtb2RlIC0gSVIgYml0IHNldCAqLworCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJHZXQgTlZNRCBzdWNjZXNzLCBJUj0xXG4iKSk7CisJCWlmICgoaXJfdGRzX2JuX2Rwc19kYXNfbnZtICYgTlZNRF9UWVBFKSA9PSBUV0lfREVWSUNFKSB7CisJCQlpZiAoaXJfdGRzX2JuX2Rwc19kYXNfbnZtID09IDB4ODBhODAyMDApIHsKKwkJCQltZW1jcHkocG04MDAxX2hhLT5zYXNfYWRkciwKKwkJCQkgICAgICAoKHU4ICopdmlydF9hZGRyICsgNCksCisJCQkJICAgICAgIFNBU19BRERSX1NJWkUpOworCQkJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCQkJcG04MDAxX3ByaW50aygiR2V0IFNBUyBhZGRyZXNzIgorCQkJCQkiIGZyb20gVlBEIHN1Y2Nlc3NmdWxseSFcbiIpKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKGlyX3Rkc19ibl9kcHNfZGFzX252bSAmIE5WTURfVFlQRSkgPT0gQ19TRUVQUk9NKQorCQkJfHwgKChpcl90ZHNfYm5fZHBzX2Rhc19udm0gJiBOVk1EX1RZUEUpID09IFZQRF9GTEFTSCkgfHwKKwkJCSgoaXJfdGRzX2JuX2Rwc19kYXNfbnZtICYgTlZNRF9UWVBFKSA9PSBFWFBBTl9ST00pKSB7CisJCQkJOworCQl9IGVsc2UgaWYgKCgoaXJfdGRzX2JuX2Rwc19kYXNfbnZtICYgTlZNRF9UWVBFKSA9PSBBQVAxX1JEVU1QKQorCQkJfHwgKChpcl90ZHNfYm5fZHBzX2Rhc19udm0gJiBOVk1EX1RZUEUpID09IElPUF9SRFVNUCkpIHsKKwkJCTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNob3VsZCBub3QgYmUgaGFwcGVuZWQqLworCQkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIihJUj0xKVdyb25nIERldmljZSB0eXBlIDB4JXhcbiIsCisJCQkJaXJfdGRzX2JuX2Rwc19kYXNfbnZtKSk7CisJCX0KKwl9IGVsc2UgLyogZGlyZWN0IG1vZGUgKi97CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkdldCBOVk1EIHN1Y2Nlc3MsIElSPTAsIGRhdGFMZW49JWRcbiIsCisJCQkoZGxlbl9zdGF0dXMgJiBOVk1EX0xFTikgPj4gMjQpKTsKKwl9CisJbWVtY3B5KGZ3X2NvbnRyb2xfY29udGV4dC0+dXNyQWRkciwKKwkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLnZpcnRfcHRyLAorCQlmd19jb250cm9sX2NvbnRleHQtPmxlbik7CisJY29tcGxldGUocG04MDAxX2hhLT5udm1kX2NvbXBsZXRpb24pOworCWNjYi0+dGFzayA9IE5VTEw7CisJY2NiLT5jY2JfdGFnID0gMHhGRkZGRkZGRjsKKwlwbTgwMDFfY2NiX2ZyZWUocG04MDAxX2hhLCB0YWcpOworfQorCitzdGF0aWMgaW50IG1waV9sb2NhbF9waHlfY3RsKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcGlvbWIpCit7CisJc3RydWN0IGxvY2FsX3BoeV9jdGxfcmVzcCAqcFBheWxvYWQgPQorCQkoc3RydWN0IGxvY2FsX3BoeV9jdGxfcmVzcCAqKShwaW9tYiArIDQpOworCXUzMiBzdGF0dXMgPSBsZTMyX3RvX2NwdShwUGF5bG9hZC0+c3RhdHVzKTsKKwl1MzIgcGh5X2lkID0gbGUzMl90b19jcHUocFBheWxvYWQtPnBoeW9wX3BoeWlkKSAmIElEX0JJVFM7CisJdTMyIHBoeV9vcCA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5waHlvcF9waHlpZCkgJiBPUF9CSVRTOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCIleCBwaHkgZXhlY3V0ZSAleCBwaHkgb3AgZmFpbGVkISBcbiIsCisJCQlwaHlfaWQsIHBoeV9vcCkpOworCX0gZWxzZQorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCIleCBwaHkgZXhlY3V0ZSAleCBwaHkgb3Agc3VjY2VzcyEgXG4iLAorCQkJcGh5X2lkLCBwaHlfb3ApKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwbTgwMDFfYnl0ZXNfZG1hZWQgLSBvbmUgb2YgdGhlIGludGVyZmFjZSBmdW5jdGlvbiBjb21tdW5pY2F0aW9uIHdpdGggbGlic2FzCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqIEBpOiB3aGljaCBwaHkgdGhhdCByZWNlaXZlZCB0aGUgZXZlbnQuCisgKgorICogd2hlbiBIQkEgZHJpdmVyIHJlY2VpdmVkIHRoZSBpZGVudGlmeSBkb25lIGV2ZW50IG9yIGluaXRpYXRlIEZJUyByZWNlaXZlZAorICogZXZlbnQoZm9yIFNBVEEpLCBpdCB3aWxsIGludm9rZSB0aGlzIGZ1bmN0aW9uIHRvIG5vdGlmeSB0aGUgc2FzIGxheWVyIHRoYXQKKyAqIHRoZSBzYXMgdG9wbG9neSBoYXMgZm9ybWVkLCBwbGVhc2UgZGlzY292ZXIgdGhlIHRoZSB3aG9sZSBzYXMgZG9tYWluLAorICogd2hpbGUgcmVjZWl2ZSBhIGJyb2FkY2FzdChjaGFuZ2UpIHByaW1pdGl2ZSBqdXN0IHRlbGwgdGhlIHNhcworICogbGF5ZXIgdG8gZGlzY292ZXIgdGhlIGNoYW5nZWQgZG9tYWluIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBkb21haW4uCisgKi8KK3N0YXRpYyB2b2lkIHBtODAwMV9ieXRlc19kbWFlZChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIGludCBpKQoreworCXN0cnVjdCBwbTgwMDFfcGh5ICpwaHkgPSAmcG04MDAxX2hhLT5waHlbaV07CisJc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5ID0gJnBoeS0+c2FzX3BoeTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhOworCWlmICghcGh5LT5waHlfYXR0YWNoZWQpCisJCXJldHVybjsKKworCXNhc19oYSA9IHBtODAwMV9oYS0+c2FzOworCWlmIChzYXNfcGh5LT5waHkpIHsKKwkJc3RydWN0IHNhc19waHkgKnNwaHkgPSBzYXNfcGh5LT5waHk7CisJCXNwaHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBzYXNfcGh5LT5saW5rcmF0ZTsKKwkJc3BoeS0+bWluaW11bV9saW5rcmF0ZSA9IHBoeS0+bWluaW11bV9saW5rcmF0ZTsKKwkJc3BoeS0+bWluaW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfMV81X0dCUFM7CisJCXNwaHktPm1heGltdW1fbGlua3JhdGUgPSBwaHktPm1heGltdW1fbGlua3JhdGU7CisJCXNwaHktPm1heGltdW1fbGlua3JhdGVfaHcgPSBwaHktPm1heGltdW1fbGlua3JhdGU7CisJfQorCisJaWYgKHBoeS0+cGh5X3R5cGUgJiBQT1JUX1RZUEVfU0FTKSB7CisJCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgKmlkOworCQlpZCA9IChzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lICopcGh5LT5mcmFtZV9yY3ZkOworCQlpZC0+ZGV2X3R5cGUgPSBwaHktPmlkZW50aWZ5LmRldmljZV90eXBlOworCQlpZC0+aW5pdGlhdG9yX2JpdHMgPSBTQVNfUFJPVE9DT0xfQUxMOworCQlpZC0+dGFyZ2V0X2JpdHMgPSBwaHktPmlkZW50aWZ5LnRhcmdldF9wb3J0X3Byb3RvY29sczsKKwl9IGVsc2UgaWYgKHBoeS0+cGh5X3R5cGUgJiBQT1JUX1RZUEVfU0FUQSkgeworCQkvKk5vdGhpbmcqLworCX0KKwlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoInBoeSAlZCBieXRlIGRtYWRlZC5cbiIsIGkpKTsKKworCXNhc19waHktPmZyYW1lX3JjdmRfc2l6ZSA9IHBoeS0+ZnJhbWVfcmN2ZF9zaXplOworCXBtODAwMV9oYS0+c2FzLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9CWVRFU19ETUFFRCk7Cit9CisKKy8qIEdldCB0aGUgbGluayByYXRlIHNwZWVkICAqLworc3RhdGljIHZvaWQgZ2V0X2xyYXRlX21vZGUoc3RydWN0IHBtODAwMV9waHkgKnBoeSwgdTggbGlua19yYXRlKQoreworCXN0cnVjdCBzYXNfcGh5ICpzYXNfcGh5ID0gcGh5LT5zYXNfcGh5LnBoeTsKKworCXN3aXRjaCAobGlua19yYXRlKSB7CisJY2FzZSBQSFlfU1BFRURfNjA6CisJCXBoeS0+c2FzX3BoeS5saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfNl8wX0dCUFM7CisJCXBoeS0+c2FzX3BoeS5waHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzZfMF9HQlBTOworCQlicmVhazsKKwljYXNlIFBIWV9TUEVFRF8zMDoKKwkJcGh5LT5zYXNfcGh5LmxpbmtyYXRlID0gU0FTX0xJTktfUkFURV8zXzBfR0JQUzsKKwkJcGh5LT5zYXNfcGh5LnBoeS0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfM18wX0dCUFM7CisJCWJyZWFrOworCWNhc2UgUEhZX1NQRUVEXzE1OgorCQlwaHktPnNhc19waHkubGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOworCQlwaHktPnNhc19waHkucGh5LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKKwkJYnJlYWs7CisJfQorCXNhc19waHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBwaHktPnNhc19waHkubGlua3JhdGU7CisJc2FzX3BoeS0+bWF4aW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfNl8wX0dCUFM7CisJc2FzX3BoeS0+bWluaW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfMV81X0dCUFM7CisJc2FzX3BoeS0+bWF4aW11bV9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfNl8wX0dCUFM7CisJc2FzX3BoeS0+bWluaW11bV9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfMV81X0dCUFM7Cit9CisKKy8qKgorICogYXNkX2dldF9hdHRhY2hlZF9zYXNfYWRkciAtLSBleHRyYWN0L2dlbmVyYXRlIGF0dGFjaGVkIFNBUyBhZGRyZXNzCisgKiBAcGh5OiBwb2ludGVyIHRvIGFzZF9waHkKKyAqIEBzYXNfYWRkcjogcG9pbnRlciB0byBidWZmZXIgd2hlcmUgdGhlIFNBUyBhZGRyZXNzIGlzIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBTQVMgYWRkcmVzcyBmcm9tIGFuIElERU5USUZZIGZyYW1lCisgKiByZWNlaXZlZC4gIElmIE9PQiBpcyBTQVRBLCB0aGVuIGEgU0FTIGFkZHJlc3MgaXMgZ2VuZXJhdGVkIGZyb20gdGhlCisgKiBIQSB0YWJsZXMuCisgKgorICogTE9DS0lORzogdGhlIGZyYW1lX3JjdmRfbG9jayBuZWVkcyB0byBiZSBoZWxkIHNpbmNlIHRoaXMgcGFyc2VzIHRoZSBmcmFtZQorICogYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBwbTgwMDFfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyKHN0cnVjdCBwbTgwMDFfcGh5ICpwaHksCisJdTggKnNhc19hZGRyKQoreworCWlmIChwaHktPnNhc19waHkuZnJhbWVfcmN2ZFswXSA9PSAweDM0CisJCSYmIHBoeS0+c2FzX3BoeS5vb2JfbW9kZSA9PSBTQVRBX09PQl9NT0RFKSB7CisJCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHBoeS0+c2FzX3BoeS5oYS0+bGxkZF9oYTsKKwkJLyogRklTIGRldmljZS10by1ob3N0ICovCisJCXU2NCBhZGRyID0gYmU2NF90b19jcHUoKihfX2JlNjQgKilwbTgwMDFfaGEtPnNhc19hZGRyKTsKKwkJYWRkciArPSBwaHktPnNhc19waHkuaWQ7CisJCSooX19iZTY0ICopc2FzX2FkZHIgPSBjcHVfdG9fYmU2NChhZGRyKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lICppZGZyYW1lID0KKwkJCSh2b2lkICopIHBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkOworCQltZW1jcHkoc2FzX2FkZHIsIGlkZnJhbWUtPnNhc19hZGRyLCBTQVNfQUREUl9TSVpFKTsKKwl9Cit9CisKKy8qKgorICogcG04MDAxX2h3X2V2ZW50X2Fja19yZXEtIEZvciBQTTgwMDEsc29tZSBldmVudHMgbmVlZCB0byBhY2tub3dhZ2UgdG8gRlcuCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqIEBRbnVtOiB0aGUgb3V0Ym91bmQgcXVldWUgbWVzc2FnZSBudW1iZXIuCisgKiBAU0VBOiBzb3VyY2Ugb2YgZXZlbnQgdG8gYWNrCisgKiBAcG9ydF9pZDogcG9ydCBpZC4KKyAqIEBwaHlJZDogcGh5IGlkLgorICogQHBhcmFtMDogcGFyYW1ldGVyIDAuCisgKiBAcGFyYW0xOiBwYXJhbWV0ZXIgMS4KKyAqLworc3RhdGljIHZvaWQgcG04MDAxX2h3X2V2ZW50X2Fja19yZXEoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXUzMiBRbnVtLCB1MzIgU0VBLCB1MzIgcG9ydF9pZCwgdTMyIHBoeUlkLCB1MzIgcGFyYW0wLCB1MzIgcGFyYW0xKQoreworCXN0cnVjdCBod19ldmVudF9hY2tfcmVxCSBwYXlsb2FkOworCXUzMiBvcGMgPSBPUENfSU5CX1NBU19IV19FVkVOVF9BQ0s7CisKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCisJbWVtc2V0KCh1OCAqKSZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOworCWNpcmN1bGFyUSA9ICZwbTgwMDFfaGEtPmluYm5kX3FfdGJsW1FudW1dOworCXBheWxvYWQudGFnID0gMTsKKwlwYXlsb2FkLnNlYV9waHlpZF9wb3J0aWQgPSBjcHVfdG9fbGUzMigoKFNFQSAmIDB4RkZGRikgPDwgOCkgfAorCQkoKHBoeUlkICYgMHgwRikgPDwgNCkgfCAocG9ydF9pZCAmIDB4MEYpKTsKKwlwYXlsb2FkLnBhcmFtMCA9IGNwdV90b19sZTMyKHBhcmFtMCk7CisJcGF5bG9hZC5wYXJhbTEgPSBjcHVfdG9fbGUzMihwYXJhbTEpOworCW1waV9idWlsZF9jbWQocG04MDAxX2hhLCBjaXJjdWxhclEsIG9wYywgJnBheWxvYWQpOworfQorCitzdGF0aWMgaW50IHBtODAwMV9jaGlwX3BoeV9jdGxfcmVxKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwl1MzIgcGh5SWQsIHUzMiBwaHlfb3ApOworCisvKioKKyAqIGh3X2V2ZW50X3Nhc19waHlfdXAgLUZXIHRlbGxzIG1lIGEgU0FTIHBoeSB1cCBldmVudC4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICogQHBpb21iOiBJTyBtZXNzYWdlIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZAoraHdfZXZlbnRfc2FzX3BoeV91cChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHZvaWQgKnBpb21iKQoreworCXN0cnVjdCBod19ldmVudF9yZXNwICpwUGF5bG9hZCA9CisJCShzdHJ1Y3QgaHdfZXZlbnRfcmVzcCAqKShwaW9tYiArIDQpOworCXUzMiBscl9ldnRfc3RhdHVzX3BoeWlkX3BvcnRpZCA9CisJCWxlMzJfdG9fY3B1KHBQYXlsb2FkLT5scl9ldnRfc3RhdHVzX3BoeWlkX3BvcnRpZCk7CisJdTggbGlua19yYXRlID0KKwkJKHU4KSgobHJfZXZ0X3N0YXR1c19waHlpZF9wb3J0aWQgJiAweEYwMDAwMDAwKSA+PiAyOCk7CisJdTggcGh5X2lkID0KKwkJKHU4KSgobHJfZXZ0X3N0YXR1c19waHlpZF9wb3J0aWQgJiAweDAwMDAwMEYwKSA+PiA0KTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gcG04MDAxX2hhLT5zYXM7CisJc3RydWN0IHBtODAwMV9waHkgKnBoeSA9ICZwbTgwMDFfaGEtPnBoeVtwaHlfaWRdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggZGV2aWNlVHlwZSA9IHBQYXlsb2FkLT5zYXNfaWRlbnRpZnkuZGV2X3R5cGU7CisKKwlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1NBU19QSFlfVVAgXG4iKSk7CisKKwlzd2l0Y2ggKGRldmljZVR5cGUpIHsKKwljYXNlIFNBU19QSFlfVU5VU0VEOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJkZXZpY2UgdHlwZSBubyBkZXZpY2UuXG4iKSk7CisJCWJyZWFrOworCWNhc2UgU0FTX0VORF9ERVZJQ0U6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiZW5kIGRldmljZS5cbiIpKTsKKwkJcG04MDAxX2NoaXBfcGh5X2N0bF9yZXEocG04MDAxX2hhLCBwaHlfaWQsCisJCQlQSFlfTk9USUZZX0VOQUJMRV9TUElOVVApOworCQlnZXRfbHJhdGVfbW9kZShwaHksIGxpbmtfcmF0ZSk7CisJCWJyZWFrOworCWNhc2UgU0FTX0VER0VfRVhQQU5ERVJfREVWSUNFOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJleHBhbmRlciBkZXZpY2UuXG4iKSk7CisJCWdldF9scmF0ZV9tb2RlKHBoeSwgbGlua19yYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTQVNfRkFOT1VUX0VYUEFOREVSX0RFVklDRToKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiZmFub3V0IGV4cGFuZGVyIGRldmljZS5cbiIpKTsKKwkJZ2V0X2xyYXRlX21vZGUocGh5LCBsaW5rX3JhdGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJ1bmtvd24gZGV2aWNlIHR5cGUoJXgpXG4iLCBkZXZpY2VUeXBlKSk7CisJCWJyZWFrOworCX0KKwlwaHktPnBoeV90eXBlIHw9IFBPUlRfVFlQRV9TQVM7CisJcGh5LT5pZGVudGlmeS5kZXZpY2VfdHlwZSA9IGRldmljZVR5cGU7CisJcGh5LT5waHlfYXR0YWNoZWQgPSAxOworCWlmIChwaHktPmlkZW50aWZ5LmRldmljZV90eXBlID09IFNBU19FTkRfREVWKQorCQlwaHktPmlkZW50aWZ5LnRhcmdldF9wb3J0X3Byb3RvY29scyA9IFNBU19QUk9UT0NPTF9TU1A7CisJZWxzZSBpZiAocGh5LT5pZGVudGlmeS5kZXZpY2VfdHlwZSAhPSBOT19ERVZJQ0UpCisJCXBoeS0+aWRlbnRpZnkudGFyZ2V0X3BvcnRfcHJvdG9jb2xzID0gU0FTX1BST1RPQ09MX1NNUDsKKwlwaHktPnNhc19waHkub29iX21vZGUgPSBTQVNfT09CX01PREU7CisJc2FzX2hhLT5ub3RpZnlfcGh5X2V2ZW50KCZwaHktPnNhc19waHksIFBIWUVfT09CX0RPTkUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CisJbWVtY3B5KHBoeS0+ZnJhbWVfcmN2ZCwgJnBQYXlsb2FkLT5zYXNfaWRlbnRpZnksCisJCXNpemVvZihzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lKS00KTsKKwlwaHktPmZyYW1lX3JjdmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lKSAtIDQ7CisJcG04MDAxX2dldF9hdHRhY2hlZF9zYXNfYWRkcihwaHksIHBoeS0+c2FzX3BoeS5hdHRhY2hlZF9zYXNfYWRkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCWlmIChwbTgwMDFfaGEtPmZsYWdzID09IFBNODAwMUZfUlVOX1RJTUUpCisJCW1kZWxheSgyMDApOy8qZGVsYXkgYSBtb21lbnQgdG8gd2FpdCBkaXNrIHRvIHNwaW51cCovCisJcG04MDAxX2J5dGVzX2RtYWVkKHBtODAwMV9oYSwgcGh5X2lkKTsKK30KKworLyoqCisgKiBod19ldmVudF9zYXRhX3BoeV91cCAtRlcgdGVsbHMgbWUgYSBTQVRBIHBoeSB1cCBldmVudC4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICogQHBpb21iOiBJTyBtZXNzYWdlIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZAoraHdfZXZlbnRfc2F0YV9waHlfdXAoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB2b2lkICpwaW9tYikKK3sKKwlzdHJ1Y3QgaHdfZXZlbnRfcmVzcCAqcFBheWxvYWQgPQorCQkoc3RydWN0IGh3X2V2ZW50X3Jlc3AgKikocGlvbWIgKyA0KTsKKwl1MzIgbHJfZXZ0X3N0YXR1c19waHlpZF9wb3J0aWQgPQorCQlsZTMyX3RvX2NwdShwUGF5bG9hZC0+bHJfZXZ0X3N0YXR1c19waHlpZF9wb3J0aWQpOworCXU4IGxpbmtfcmF0ZSA9CisJCSh1OCkoKGxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkICYgMHhGMDAwMDAwMCkgPj4gMjgpOworCXU4IHBoeV9pZCA9CisJCSh1OCkoKGxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkICYgMHgwMDAwMDBGMCkgPj4gNCk7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IHBtODAwMV9oYS0+c2FzOworCXN0cnVjdCBwbTgwMDFfcGh5ICpwaHkgPSAmcG04MDAxX2hhLT5waHlbcGh5X2lkXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWdldF9scmF0ZV9tb2RlKHBoeSwgbGlua19yYXRlKTsKKwlwaHktPnBoeV90eXBlIHw9IFBPUlRfVFlQRV9TQVRBOworCXBoeS0+cGh5X2F0dGFjaGVkID0gMTsKKwlwaHktPnNhc19waHkub29iX21vZGUgPSBTQVRBX09PQl9NT0RFOworCXNhc19oYS0+bm90aWZ5X3BoeV9ldmVudCgmcGh5LT5zYXNfcGh5LCBQSFlFX09PQl9ET05FKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCW1lbWNweShwaHktPmZyYW1lX3JjdmQsICgodTggKikmcFBheWxvYWQtPnNhdGFfZmlzIC0gNCksCisJCXNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKSk7CisJcGh5LT5mcmFtZV9yY3ZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2Zpcyk7CisJcGh5LT5pZGVudGlmeS50YXJnZXRfcG9ydF9wcm90b2NvbHMgPSBTQVNfUFJPVE9DT0xfU0FUQTsKKwlwaHktPmlkZW50aWZ5LmRldmljZV90eXBlID0gU0FUQV9ERVY7CisJcG04MDAxX2dldF9hdHRhY2hlZF9zYXNfYWRkcihwaHksIHBoeS0+c2FzX3BoeS5hdHRhY2hlZF9zYXNfYWRkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCXBtODAwMV9ieXRlc19kbWFlZChwbTgwMDFfaGEsIHBoeV9pZCk7Cit9CisKKy8qKgorICogaHdfZXZlbnRfcGh5X2Rvd24gLXdlIHNob3VsZCBub3RpZnkgdGhlIGxpYnNhcyB0aGUgcGh5IGlzIGRvd24uCisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAqIEBwaW9tYjogSU8gbWVzc2FnZSBidWZmZXIKKyAqLworc3RhdGljIHZvaWQKK2h3X2V2ZW50X3BoeV9kb3duKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcGlvbWIpCit7CisJc3RydWN0IGh3X2V2ZW50X3Jlc3AgKnBQYXlsb2FkID0KKwkJKHN0cnVjdCBod19ldmVudF9yZXNwICopKHBpb21iICsgNCk7CisJdTMyIGxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkID0KKwkJbGUzMl90b19jcHUocFBheWxvYWQtPmxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkKTsKKwl1OCBwb3J0X2lkID0gKHU4KShscl9ldnRfc3RhdHVzX3BoeWlkX3BvcnRpZCAmIDB4MDAwMDAwMEYpOworCXU4IHBoeV9pZCA9CisJCSh1OCkoKGxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkICYgMHgwMDAwMDBGMCkgPj4gNCk7CisJdTMyIG5waXBfcG9ydHN0YXRlID0gbGUzMl90b19jcHUocFBheWxvYWQtPm5waXBfcG9ydHN0YXRlKTsKKwl1OCBwb3J0c3RhdGUgPSAodTgpKG5waXBfcG9ydHN0YXRlICYgMHgwMDAwMDAwRik7CisKKwlzd2l0Y2ggKHBvcnRzdGF0ZSkgeworCWNhc2UgUE9SVF9WQUxJRDoKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0lOVkFMSUQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIiBQb3J0SW52YWxpZCBwb3J0SUQgJWQgXG4iLCBwb3J0X2lkKSk7CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIiBMYXN0IHBoeSBEb3duIGFuZCBwb3J0IGludmFsaWRcbiIpKTsKKwkJcG04MDAxX2h3X2V2ZW50X2Fja19yZXEocG04MDAxX2hhLCAwLCBIV19FVkVOVF9QSFlfRE9XTiwKKwkJCXBvcnRfaWQsIHBoeV9pZCwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgUE9SVF9JTl9SRVNFVDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiIFBvcnRJblJlc2V0IHBvcnRJRCAlZCBcbiIsIHBvcnRfaWQpKTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX05PVF9FU1RBQkxJU0hFRDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiIHBoeSBEb3duIGFuZCBQT1JUX05PVF9FU1RBQkxJU0hFRFxuIikpOworCQlicmVhazsKKwljYXNlIFBPUlRfTE9TVENPTU06CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIiBwaHkgRG93biBhbmQgUE9SVF9MT1NUQ09NTVxuIikpOworCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCIgTGFzdCBwaHkgRG93biBhbmQgcG9ydCBpbnZhbGlkXG4iKSk7CisJCXBtODAwMV9od19ldmVudF9hY2tfcmVxKHBtODAwMV9oYSwgMCwgSFdfRVZFTlRfUEhZX0RPV04sCisJCQlwb3J0X2lkLCBwaHlfaWQsIDAsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCIgcGh5IERvd24gYW5kKGRlZmF1bHQpID0gJXhcbiIsCisJCQlwb3J0c3RhdGUpKTsKKwkJYnJlYWs7CisKKwl9Cit9CisKKy8qKgorICogbXBpX3JlZ19yZXNwIC1wcm9jZXNzIHJlZ2lzdGVyIGRldmljZSBJRCByZXNwb25zZS4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICogQHBpb21iOiBJTyBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIHdoZW4gc2FzIGxheWVyIGZpbmQgYSBkZXZpY2UgaXQgd2lsbCBub3RpZnkgTExERCwgdGhlbiB0aGUgZHJpdmVyIHJlZ2lzdGVyCisgKiB0aGUgZG9tYWluIGRldmljZSB0byBGVywgdGhpcyBldmVudCBpcyB0aGUgcmV0dXJuIGRldmljZSBJRCB3aGljaCB0aGUgRlcKKyAqIGhhcyBhc3NpZ25lZCwgZnJvbSBub3csaW50ZXItY29tbXVuaWNhdGlvbiB3aXRoIEZXIGlzIG5vIGxvbmdlciB1c2luZyB0aGUKKyAqIFNBUyBhZGRyZXNzLCB1c2UgZGV2aWNlIElEIHdoaWNoIEZXIGFzc2lnbmVkLgorICovCitzdGF0aWMgaW50IG1waV9yZWdfcmVzcChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHZvaWQgKnBpb21iKQoreworCXUzMiBzdGF0dXM7CisJdTMyIGRldmljZV9pZDsKKwl1MzIgaHRhZzsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2I7CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXY7CisJc3RydWN0IGRldl9yZWdfcmVzcCAqcmVnaXN0ZXJSZXNwUGF5bG9hZCA9CisJCShzdHJ1Y3QgZGV2X3JlZ19yZXNwICopKHBpb21iICsgNCk7CisKKwlodGFnID0gbGUzMl90b19jcHUocmVnaXN0ZXJSZXNwUGF5bG9hZC0+dGFnKTsKKwljY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1tyZWdpc3RlclJlc3BQYXlsb2FkLT50YWddOworCXBtODAwMV9kZXYgPSBjY2ItPmRldmljZTsKKwlzdGF0dXMgPSBsZTMyX3RvX2NwdShyZWdpc3RlclJlc3BQYXlsb2FkLT5zdGF0dXMpOworCWRldmljZV9pZCA9IGxlMzJfdG9fY3B1KHJlZ2lzdGVyUmVzcFBheWxvYWQtPmRldmljZV9pZCk7CisJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCIgcmVnaXN0ZXIgZGV2aWNlIGlzIHN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpKTsKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgREVWUkVHX1NVQ0NFU1M6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiREVWUkVHX1NVQ0NFU1NcbiIpKTsKKwkJcG04MDAxX2Rldi0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCQlicmVhazsKKwljYXNlIERFVlJFR19GQUlMVVJFX09VVF9PRl9SRVNPVVJDRToKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiREVWUkVHX0ZBSUxVUkVfT1VUX09GX1JFU09VUkNFXG4iKSk7CisJCWJyZWFrOworCWNhc2UgREVWUkVHX0ZBSUxVUkVfREVWSUNFX0FMUkVBRFlfUkVHSVNURVJFRDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkgICBwbTgwMDFfcHJpbnRrKCJERVZSRUdfRkFJTFVSRV9ERVZJQ0VfQUxSRUFEWV9SRUdJU1RFUkVEXG4iKSk7CisJCWJyZWFrOworCWNhc2UgREVWUkVHX0ZBSUxVUkVfSU5WQUxJRF9QSFlfSUQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkRFVlJFR19GQUlMVVJFX0lOVkFMSURfUEhZX0lEXG4iKSk7CisJCWJyZWFrOworCWNhc2UgREVWUkVHX0ZBSUxVUkVfUEhZX0lEX0FMUkVBRFlfUkVHSVNURVJFRDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkgICBwbTgwMDFfcHJpbnRrKCJERVZSRUdfRkFJTFVSRV9QSFlfSURfQUxSRUFEWV9SRUdJU1RFUkVEXG4iKSk7CisJCWJyZWFrOworCWNhc2UgREVWUkVHX0ZBSUxVUkVfUE9SVF9JRF9PVVRfT0ZfUkFOR0U6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkRFVlJFR19GQUlMVVJFX1BPUlRfSURfT1VUX09GX1JBTkdFXG4iKSk7CisJCWJyZWFrOworCWNhc2UgREVWUkVHX0ZBSUxVUkVfUE9SVF9OT1RfVkFMSURfU1RBVEU6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkRFVlJFR19GQUlMVVJFX1BPUlRfTk9UX1ZBTElEX1NUQVRFXG4iKSk7CisJCWJyZWFrOworCWNhc2UgREVWUkVHX0ZBSUxVUkVfREVWSUNFX1RZUEVfTk9UX1ZBTElEOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCSAgICAgICBwbTgwMDFfcHJpbnRrKCJERVZSRUdfRkFJTFVSRV9ERVZJQ0VfVFlQRV9OT1RfVkFMSURcbiIpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkgcG04MDAxX3ByaW50aygiREVWUkVHX0ZBSUxVUkVfREVWSUNFX1RZUEVfTk9UX1VOU09SUE9SVEVEXG4iKSk7CisJCWJyZWFrOworCX0KKwljb21wbGV0ZShwbTgwMDFfZGV2LT5kY29tcGxldGlvbik7CisJY2NiLT50YXNrID0gTlVMTDsKKwljY2ItPmNjYl90YWcgPSAweEZGRkZGRkZGOworCXBtODAwMV9jY2JfZnJlZShwbTgwMDFfaGEsIGh0YWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1waV9kZXJlZ19yZXNwKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcGlvbWIpCit7CisJdTMyIHN0YXR1czsKKwl1MzIgZGV2aWNlX2lkOworCXN0cnVjdCBkZXZfcmVnX3Jlc3AgKnJlZ2lzdGVyUmVzcFBheWxvYWQgPQorCQkoc3RydWN0IGRldl9yZWdfcmVzcCAqKShwaW9tYiArIDQpOworCisJc3RhdHVzID0gbGUzMl90b19jcHUocmVnaXN0ZXJSZXNwUGF5bG9hZC0+c3RhdHVzKTsKKwlkZXZpY2VfaWQgPSBsZTMyX3RvX2NwdShyZWdpc3RlclJlc3BQYXlsb2FkLT5kZXZpY2VfaWQpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiIGRlcmVnaXN0ZXIgZGV2aWNlIGZhaWxlZCAsc3RhdHVzID0gJXgiCisJCQkiLCBkZXZpY2VfaWQgPSAleFxuIiwgc3RhdHVzLCBkZXZpY2VfaWQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbXBpX2Z3X2ZsYXNoX3VwZGF0ZV9yZXNwKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcGlvbWIpCit7CisJdTMyIHN0YXR1czsKKwlzdHJ1Y3QgZndfY29udHJvbF9leAlmd19jb250cm9sX2NvbnRleHQ7CisJc3RydWN0IGZ3X2ZsYXNoX1VwZGF0ZV9yZXNwICpwcGF5bG9hZCA9CisJCShzdHJ1Y3QgZndfZmxhc2hfVXBkYXRlX3Jlc3AgKikocGlvbWIgKyA0KTsKKwl1MzIgdGFnID0gbGUzMl90b19jcHUocHBheWxvYWQtPnRhZyk7CisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiID0gJnBtODAwMV9oYS0+Y2NiX2luZm9bdGFnXTsKKwlzdGF0dXMgPSBsZTMyX3RvX2NwdShwcGF5bG9hZC0+c3RhdHVzKTsKKwltZW1jcHkoJmZ3X2NvbnRyb2xfY29udGV4dCwKKwkJY2NiLT5md19jb250cm9sX2NvbnRleHQsCisJCXNpemVvZihmd19jb250cm9sX2NvbnRleHQpKTsKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgRkxBU0hfVVBEQVRFX0NPTVBMRVRFX1BFTkRJTkdfUkVCT09UOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoIjogRkxBU0hfVVBEQVRFX0NPTVBMRVRFX1BFTkRJTkdfUkVCT09UXG4iKSk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfVVBEQVRFX0lOX1BST0dSRVNTOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCI6IEZMQVNIX1VQREFURV9JTl9QUk9HUkVTU1xuIikpOworCQlicmVhazsKKwljYXNlIEZMQVNIX1VQREFURV9IRFJfRVJSOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCI6IEZMQVNIX1VQREFURV9IRFJfRVJSXG4iKSk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfVVBEQVRFX09GRlNFVF9FUlI6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIjogRkxBU0hfVVBEQVRFX09GRlNFVF9FUlJcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9VUERBVEVfQ1JDX0VSUjoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiOiBGTEFTSF9VUERBVEVfQ1JDX0VSUlxuIikpOworCQlicmVhazsKKwljYXNlIEZMQVNIX1VQREFURV9MRU5HVEhfRVJSOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCI6IEZMQVNIX1VQREFURV9MRU5HVEhfRVJSXG4iKSk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfVVBEQVRFX0hXX0VSUjoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiOiBGTEFTSF9VUERBVEVfSFdfRVJSXG4iKSk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfVVBEQVRFX0ROTERfTk9UX1NVUFBPUlRFRDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiOiBGTEFTSF9VUERBVEVfRE5MRF9OT1RfU1VQUE9SVEVEXG4iKSk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfVVBEQVRFX0RJU0FCTEVEOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCI6IEZMQVNIX1VQREFURV9ESVNBQkxFRFxuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJObyBtYXRjaGVkIHN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpKTsKKwkJYnJlYWs7CisJfQorCWNjYi0+ZndfY29udHJvbF9jb250ZXh0LT5md19jb250cm9sLT5yZXRjb2RlID0gc3RhdHVzOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocG04MDAxX2hhLT5wZGV2LAorCQkJZndfY29udHJvbF9jb250ZXh0LmxlbiwKKwkJCWZ3X2NvbnRyb2xfY29udGV4dC52aXJ0QWRkciwKKwkJCWZ3X2NvbnRyb2xfY29udGV4dC5waHlzX2FkZHIpOworCWNvbXBsZXRlKHBtODAwMV9oYS0+bnZtZF9jb21wbGV0aW9uKTsKKwljY2ItPnRhc2sgPSBOVUxMOworCWNjYi0+Y2NiX3RhZyA9IDB4RkZGRkZGRkY7CisJcG04MDAxX2NjYl9mcmVlKHBtODAwMV9oYSwgdGFnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbXBpX2dlbmVyYWxfZXZlbnQoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhICwgdm9pZCAqcGlvbWIpCit7CisJdTMyIHN0YXR1czsKKwlpbnQgaTsKKwlzdHJ1Y3QgZ2VuZXJhbF9ldmVudF9yZXNwICpwUGF5bG9hZCA9CisJCShzdHJ1Y3QgZ2VuZXJhbF9ldmVudF9yZXNwICopKHBpb21iICsgNCk7CisJc3RhdHVzID0gbGUzMl90b19jcHUocFBheWxvYWQtPnN0YXR1cyk7CisJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCIgc3RhdHVzID0gMHgleFxuIiwgc3RhdHVzKSk7CisJZm9yIChpID0gMDsgaSA8IEdFTkVSQUxfRVZFTlRfUEFZTE9BRDsgaSsrKQorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJpbmJfSU9NQl9wYXlsb2FkWzB4JXhdIDB4JXgsIFxuIiwgaSwKKwkJCXBQYXlsb2FkLT5pbmJfSU9NQl9wYXlsb2FkW2ldKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21waV90YXNrX2Fib3J0X3Jlc3Aoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB2b2lkICpwaW9tYikKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnQ7CisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHN0YXR1cyA7CisJdTMyIHRhZywgc2NwOworCXN0cnVjdCB0YXNrX3N0YXR1c19zdHJ1Y3QgKnRzOworCisJc3RydWN0IHRhc2tfYWJvcnRfcmVzcCAqcFBheWxvYWQgPQorCQkoc3RydWN0IHRhc2tfYWJvcnRfcmVzcCAqKShwaW9tYiArIDQpOworCWNjYiA9ICZwbTgwMDFfaGEtPmNjYl9pbmZvW3BQYXlsb2FkLT50YWddOworCXQgPSBjY2ItPnRhc2s7CisKKworCXN0YXR1cyA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5zdGF0dXMpOworCXRhZyA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT50YWcpOworCXNjcCA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5zY3ApOworCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCIgc3RhdHVzID0gMHgleFxuIiwgc3RhdHVzKSk7CisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXRzID0gJnQtPnRhc2tfc3RhdHVzOworCWlmIChzdGF0dXMgIT0gMCkKKwkJUE04MDAxX0ZBSUxfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoInRhc2sgYWJvcnQgZmFpbGVkIHN0YXR1cyAweCV4ICwiCisJCQkidGFnID0gMHgleCwgc2NwPSAweCV4XG4iLCBzdGF0dXMsIHRhZywgc2NwKSk7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIElPX1NVQ0NFU1M6CisJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJJT19TVUNDRVNTXG4iKSk7CisJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CisJCXRzLT5zdGF0ID0gU0FNX0dPT0Q7CisJCWJyZWFrOworCWNhc2UgSU9fTk9UX1ZBTElEOgorCQlQTTgwMDFfRUhfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fTk9UX1ZBTElEXG4iKSk7CisJCXRzLT5yZXNwID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJCWJyZWFrOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJdC0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfU1RBVEVfUEVORElORzsKKwl0LT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19BVF9JTklUSUFUT1I7CisJdC0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9ET05FOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCBwUGF5bG9hZC0+dGFnKTsKKwltYigpOworCXQtPnRhc2tfZG9uZSh0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtcGlfaHdfZXZlbnQgLVRoZSBodyBldmVudCBoYXMgY29tZS4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICogQHBpb21iOiBJTyBtZXNzYWdlIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IG1waV9od19ldmVudChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHZvaWQqIHBpb21iKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGh3X2V2ZW50X3Jlc3AgKnBQYXlsb2FkID0KKwkJKHN0cnVjdCBod19ldmVudF9yZXNwICopKHBpb21iICsgNCk7CisJdTMyIGxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkID0KKwkJbGUzMl90b19jcHUocFBheWxvYWQtPmxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkKTsKKwl1OCBwb3J0X2lkID0gKHU4KShscl9ldnRfc3RhdHVzX3BoeWlkX3BvcnRpZCAmIDB4MDAwMDAwMEYpOworCXU4IHBoeV9pZCA9CisJCSh1OCkoKGxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkICYgMHgwMDAwMDBGMCkgPj4gNCk7CisJdTE2IGV2ZW50VHlwZSA9CisJCSh1MTYpKChscl9ldnRfc3RhdHVzX3BoeWlkX3BvcnRpZCAmIDB4MDBGRkZGMDApID4+IDgpOworCXU4IHN0YXR1cyA9CisJCSh1OCkoKGxyX2V2dF9zdGF0dXNfcGh5aWRfcG9ydGlkICYgMHgwRjAwMDAwMCkgPj4gMjQpOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBwbTgwMDFfaGEtPnNhczsKKwlzdHJ1Y3QgcG04MDAxX3BoeSAqcGh5ID0gJnBtODAwMV9oYS0+cGh5W3BoeV9pZF07CisJc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5ID0gc2FzX2hhLT5zYXNfcGh5W3BoeV9pZF07CisJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQlwbTgwMDFfcHJpbnRrKCJvdXRib3VuZCBxdWV1ZSBIVyBldmVudCAmIGV2ZW50IHR5cGUgOiAiKSk7CisJc3dpdGNoIChldmVudFR5cGUpIHsKKwljYXNlIEhXX0VWRU5UX1BIWV9TVEFSVF9TVEFUVVM6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUEhZX1NUQVJUX1NUQVRVUyIKKwkJCSIgc3RhdHVzID0gJXhcbiIsIHN0YXR1cykpOworCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCXBoeS0+cGh5X3N0YXRlID0gMTsKKwkJCWlmIChwbTgwMDFfaGEtPmZsYWdzID09IFBNODAwMUZfUlVOX1RJTUUpCisJCQkJY29tcGxldGUocGh5LT5lbmFibGVfY29tcGxldGlvbik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9TQVNfUEhZX1VQOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QSFlfU1RBUlRfU1RBVFVTIFxuIikpOworCQlod19ldmVudF9zYXNfcGh5X3VwKHBtODAwMV9oYSwgcGlvbWIpOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX1NBVEFfUEhZX1VQOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9TQVRBX1BIWV9VUCBcbiIpKTsKKwkJaHdfZXZlbnRfc2F0YV9waHlfdXAocG04MDAxX2hhLCBwaW9tYik7CisJCWJyZWFrOworCWNhc2UgSFdfRVZFTlRfUEhZX1NUT1BfU1RBVFVTOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QSFlfU1RPUF9TVEFUVVMgIgorCQkJInN0YXR1cyA9ICV4XG4iLCBzdGF0dXMpKTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJcGh5LT5waHlfc3RhdGUgPSAwOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQgXG4iKSk7CisJCXNhc19oYS0+bm90aWZ5X3BoeV9ldmVudCgmcGh5LT5zYXNfcGh5LCBQSFlFX1NQSU5VUF9IT0xEKTsKKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9QSFlfRE9XTjoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUEhZX0RPV04gXG4iKSk7CisJCXNhc19oYS0+bm90aWZ5X3BoeV9ldmVudCgmcGh5LT5zYXNfcGh5LCBQSFlFX0xPU1NfT0ZfU0lHTkFMKTsKKwkJcGh5LT5waHlfYXR0YWNoZWQgPSAwOworCQlwaHktPnBoeV9zdGF0ZSA9IDA7CisJCWh3X2V2ZW50X3BoeV9kb3duKHBtODAwMV9oYSwgcGlvbWIpOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX1BPUlRfSU5WQUxJRDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9JTlZBTElEXG4iKSk7CisJCXNhc19waHlfZGlzY29ubmVjdGVkKHNhc19waHkpOworCQlwaHktPnBoeV9hdHRhY2hlZCA9IDA7CisJCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoc2FzX3BoeSwgUE9SVEVfTElOS19SRVNFVF9FUlIpOworCQlicmVhazsKKwkvKiB0aGUgYnJvYWRjYXN0IGNoYW5nZSBwcmltaXRpdmUgcmVjZWl2ZWQsIHRlbGwgdGhlIExJQlNBUyB0aGlzIGV2ZW50CisJdG8gcmV2YWxpZGF0ZSB0aGUgc2FzIGRvbWFpbiovCisJY2FzZSBIV19FVkVOVF9CUk9BRENBU1RfQ0hBTkdFOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9CUk9BRENBU1RfQ0hBTkdFXG4iKSk7CisJCXBtODAwMV9od19ldmVudF9hY2tfcmVxKHBtODAwMV9oYSwgMCwgSFdfRVZFTlRfQlJPQURDQVNUX0NIQU5HRSwKKwkJCXBvcnRfaWQsIHBoeV9pZCwgMSwgMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzYXNfcGh5LT5zYXNfcHJpbV9sb2NrLCBmbGFncyk7CisJCXNhc19waHktPnNhc19wcmltID0gSFdfRVZFTlRfQlJPQURDQVNUX0NIQU5HRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FzX3BoeS0+c2FzX3ByaW1fbG9jaywgZmxhZ3MpOworCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9QSFlfRVJST1I6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BIWV9FUlJPUlxuIikpOworCQlzYXNfcGh5X2Rpc2Nvbm5lY3RlZCgmcGh5LT5zYXNfcGh5KTsKKwkJcGh5LT5waHlfYXR0YWNoZWQgPSAwOworCQlzYXNfaGEtPm5vdGlmeV9waHlfZXZlbnQoJnBoeS0+c2FzX3BoeSwgUEhZRV9PT0JfRVJST1IpOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX0JST0FEQ0FTVF9FWFA6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX0JST0FEQ0FTVF9FWFBcbiIpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNhc19waHktPnNhc19wcmltX2xvY2ssIGZsYWdzKTsKKwkJc2FzX3BoeS0+c2FzX3ByaW0gPSBIV19FVkVOVF9CUk9BRENBU1RfRVhQOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYXNfcGh5LT5zYXNfcHJpbV9sb2NrLCBmbGFncyk7CisJCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoc2FzX3BoeSwgUE9SVEVfQlJPQURDQVNUX1JDVkQpOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX0xJTktfRVJSX0lOVkFMSURfRFdPUkQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX0xJTktfRVJSX0lOVkFMSURfRFdPUkRcbiIpKTsKKwkJcG04MDAxX2h3X2V2ZW50X2Fja19yZXEocG04MDAxX2hhLCAwLAorCQkJSFdfRVZFTlRfTElOS19FUlJfSU5WQUxJRF9EV09SRCwgcG9ydF9pZCwgcGh5X2lkLCAwLCAwKTsKKwkJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CisJCXBoeS0+cGh5X2F0dGFjaGVkID0gMDsKKwkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9MSU5LX1JFU0VUX0VSUik7CisJCWJyZWFrOworCWNhc2UgSFdfRVZFTlRfTElOS19FUlJfRElTUEFSSVRZX0VSUk9SOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9MSU5LX0VSUl9ESVNQQVJJVFlfRVJST1JcbiIpKTsKKwkJcG04MDAxX2h3X2V2ZW50X2Fja19yZXEocG04MDAxX2hhLCAwLAorCQkJSFdfRVZFTlRfTElOS19FUlJfRElTUEFSSVRZX0VSUk9SLAorCQkJcG9ydF9pZCwgcGh5X2lkLCAwLCAwKTsKKwkJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CisJCXBoeS0+cGh5X2F0dGFjaGVkID0gMDsKKwkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9MSU5LX1JFU0VUX0VSUik7CisJCWJyZWFrOworCWNhc2UgSFdfRVZFTlRfTElOS19FUlJfQ09ERV9WSU9MQVRJT046CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX0xJTktfRVJSX0NPREVfVklPTEFUSU9OXG4iKSk7CisJCXBtODAwMV9od19ldmVudF9hY2tfcmVxKHBtODAwMV9oYSwgMCwKKwkJCUhXX0VWRU5UX0xJTktfRVJSX0NPREVfVklPTEFUSU9OLAorCQkJcG9ydF9pZCwgcGh5X2lkLCAwLCAwKTsKKwkJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CisJCXBoeS0+cGh5X2F0dGFjaGVkID0gMDsKKwkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9MSU5LX1JFU0VUX0VSUik7CisJCWJyZWFrOworCWNhc2UgSFdfRVZFTlRfTElOS19FUlJfTE9TU19PRl9EV09SRF9TWU5DSDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkgICAgICBwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9MSU5LX0VSUl9MT1NTX09GX0RXT1JEX1NZTkNIXG4iKSk7CisJCXBtODAwMV9od19ldmVudF9hY2tfcmVxKHBtODAwMV9oYSwgMCwKKwkJCUhXX0VWRU5UX0xJTktfRVJSX0xPU1NfT0ZfRFdPUkRfU1lOQ0gsCisJCQlwb3J0X2lkLCBwaHlfaWQsIDAsIDApOworCQlzYXNfcGh5X2Rpc2Nvbm5lY3RlZChzYXNfcGh5KTsKKwkJcGh5LT5waHlfYXR0YWNoZWQgPSAwOworCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0xJTktfUkVTRVRfRVJSKTsKKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9NQUxGVU5DVElPTjoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfTUFMRlVOQ1RJT05cbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9CUk9BRENBU1RfU0VTOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9CUk9BRENBU1RfU0VTXG4iKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzYXNfcGh5LT5zYXNfcHJpbV9sb2NrLCBmbGFncyk7CisJCXNhc19waHktPnNhc19wcmltID0gSFdfRVZFTlRfQlJPQURDQVNUX1NFUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FzX3BoeS0+c2FzX3ByaW1fbG9jaywgZmxhZ3MpOworCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9JTkJPVU5EX0NSQ19FUlJPUjoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfSU5CT1VORF9DUkNfRVJST1JcbiIpKTsKKwkJcG04MDAxX2h3X2V2ZW50X2Fja19yZXEocG04MDAxX2hhLCAwLAorCQkJSFdfRVZFTlRfSU5CT1VORF9DUkNfRVJST1IsCisJCQlwb3J0X2lkLCBwaHlfaWQsIDAsIDApOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX0hBUkRfUkVTRVRfUkVDRUlWRUQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX0hBUkRfUkVTRVRfUkVDRUlWRURcbiIpKTsKKwkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9IQVJEX1JFU0VUKTsKKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9JRF9GUkFNRV9USU1FT1VUOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9JRF9GUkFNRV9USU1FT1VUXG4iKSk7CisJCXNhc19waHlfZGlzY29ubmVjdGVkKHNhc19waHkpOworCQlwaHktPnBoeV9hdHRhY2hlZCA9IDA7CisJCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoc2FzX3BoeSwgUE9SVEVfTElOS19SRVNFVF9FUlIpOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX0xJTktfRVJSX1BIWV9SRVNFVF9GQUlMRUQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX0xJTktfRVJSX1BIWV9SRVNFVF9GQUlMRUQgXG4iKSk7CisJCXBtODAwMV9od19ldmVudF9hY2tfcmVxKHBtODAwMV9oYSwgMCwKKwkJCUhXX0VWRU5UX0xJTktfRVJSX1BIWV9SRVNFVF9GQUlMRUQsCisJCQlwb3J0X2lkLCBwaHlfaWQsIDAsIDApOworCQlzYXNfcGh5X2Rpc2Nvbm5lY3RlZChzYXNfcGh5KTsKKwkJcGh5LT5waHlfYXR0YWNoZWQgPSAwOworCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0xJTktfUkVTRVRfRVJSKTsKKwkJYnJlYWs7CisJY2FzZSBIV19FVkVOVF9QT1JUX1JFU0VUX1RJTUVSX1RNTzoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9SRVNFVF9USU1FUl9UTU8gXG4iKSk7CisJCXNhc19waHlfZGlzY29ubmVjdGVkKHNhc19waHkpOworCQlwaHktPnBoeV9hdHRhY2hlZCA9IDA7CisJCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoc2FzX3BoeSwgUE9SVEVfTElOS19SRVNFVF9FUlIpOworCQlicmVhazsKKwljYXNlIEhXX0VWRU5UX1BPUlRfUkVDT1ZFUllfVElNRVJfVE1POgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFQ09WRVJZX1RJTUVSX1RNTyBcbiIpKTsKKwkJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CisJCXBoeS0+cGh5X2F0dGFjaGVkID0gMDsKKwkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9MSU5LX1JFU0VUX0VSUik7CisJCWJyZWFrOworCWNhc2UgSFdfRVZFTlRfUE9SVF9SRUNPVkVSOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFQ09WRVIgXG4iKSk7CisJCWJyZWFrOworCWNhc2UgSFdfRVZFTlRfUE9SVF9SRVNFVF9DT01QTEVURToKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9SRVNFVF9DT01QTEVURSBcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBFVkVOVF9CUk9BRENBU1RfQVNZTkNIX0VWRU5UOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJFVkVOVF9CUk9BRENBU1RfQVNZTkNIX0VWRU5UXG4iKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIlVua25vd24gZXZlbnQgdHlwZSA9ICV4XG4iLCBldmVudFR5cGUpKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHByb2Nlc3Nfb25lX2lvbWIgLSBwcm9jZXNzIG9uZSBvdXRib3VuZCBRdWV1ZSBtZW1vcnkgYmxvY2sKKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICogQHBpb21iOiBJTyBtZXNzYWdlIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX29uZV9pb21iKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcGlvbWIpCit7CisJdTMyIHBIZWFkZXIgPSAodTMyKSoodTMyICopcGlvbWI7CisJdTggb3BjID0gKHU4KSgobGUzMl90b19jcHUocEhlYWRlcikpICYgMHhGRkYpOworCisJUE04MDAxX01TR19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJwcm9jZXNzX29uZV9pb21iOiIpKTsKKworCXN3aXRjaCAob3BjKSB7CisJY2FzZSBPUENfT1VCX0VDSE86CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiT1BDX09VQl9FQ0hPIFxuIikpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfSFdfRVZFTlQ6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfSFdfRVZFTlQgXG4iKSk7CisJCW1waV9od19ldmVudChwbTgwMDFfaGEsIHBpb21iKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX1NTUF9DT01QOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NTUF9DT01QIFxuIikpOworCQltcGlfc3NwX2NvbXBsZXRpb24ocG04MDAxX2hhLCBwaW9tYik7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9TTVBfQ09NUDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TTVBfQ09NUCBcbiIpKTsKKwkJbXBpX3NtcF9jb21wbGV0aW9uKHBtODAwMV9oYSwgcGlvbWIpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfTE9DQUxfUEhZX0NOVFJMOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0xPQ0FMX1BIWV9DTlRSTFxuIikpOworCQltcGlfbG9jYWxfcGh5X2N0bChwbTgwMDFfaGEsIHBpb21iKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX0RFVl9SRUdJU1Q6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfREVWX1JFR0lTVCBcbiIpKTsKKwkJbXBpX3JlZ19yZXNwKHBtODAwMV9oYSwgcGlvbWIpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfREVSRUdfREVWOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJ1bnJlc2dpc3RlciB0aGUgZGV2aWVjZSBcbiIpKTsKKwkJbXBpX2RlcmVnX3Jlc3AocG04MDAxX2hhLCBwaW9tYik7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9HRVRfREVWX0hBTkRMRToKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9HRVRfREVWX0hBTkRMRSBcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX1NBVEFfQ09NUDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TQVRBX0NPTVAgXG4iKSk7CisJCW1waV9zYXRhX2NvbXBsZXRpb24ocG04MDAxX2hhLCBwaW9tYik7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9TQVRBX0VWRU5UOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NBVEFfRVZFTlQgXG4iKSk7CisJCW1waV9zYXRhX2V2ZW50KHBtODAwMV9oYSwgcGlvbWIpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfU1NQX0VWRU5UOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NTUF9FVkVOVFxuIikpOworCQltcGlfc3NwX2V2ZW50KHBtODAwMV9oYSwgcGlvbWIpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfREVWX0hBTkRMRV9BUlJJVjoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9ERVZfSEFORExFX0FSUklWXG4iKSk7CisJCS8qVGhpcyBpcyBmb3IgdGFyZ2V0Ki8KKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX1NTUF9SRUNWX0VWRU5UOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NTUF9SRUNWX0VWRU5UXG4iKSk7CisJCS8qVGhpcyBpcyBmb3IgdGFyZ2V0Ki8KKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX0RFVl9JTkZPOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0RFVl9JTkZPXG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9GV19GTEFTSF9VUERBVEU6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfRldfRkxBU0hfVVBEQVRFXG4iKSk7CisJCW1waV9md19mbGFzaF91cGRhdGVfcmVzcChwbTgwMDFfaGEsIHBpb21iKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX0dQSU9fUkVTUE9OU0U6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfR1BJT19SRVNQT05TRVxuIikpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfR1BJT19FVkVOVDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9HUElPX0VWRU5UXG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9HRU5FUkFMX0VWRU5UOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0dFTkVSQUxfRVZFTlRcbiIpKTsKKwkJbXBpX2dlbmVyYWxfZXZlbnQocG04MDAxX2hhLCBwaW9tYik7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9TU1BfQUJPUlRfUlNQOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NTUF9BQk9SVF9SU1BcbiIpKTsKKwkJbXBpX3Rhc2tfYWJvcnRfcmVzcChwbTgwMDFfaGEsIHBpb21iKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX1NBVEFfQUJPUlRfUlNQOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NBVEFfQUJPUlRfUlNQXG4iKSk7CisJCW1waV90YXNrX2Fib3J0X3Jlc3AocG04MDAxX2hhLCBwaW9tYik7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9TQVNfRElBR19NT0RFX1NUQVJUX0VORDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TQVNfRElBR19NT0RFX1NUQVJUX0VORFxuIikpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfU0FTX0RJQUdfRVhFQ1VURToKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TQVNfRElBR19FWEVDVVRFXG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9HRVRfVElNRV9TVEFNUDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9HRVRfVElNRV9TVEFNUFxuIikpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfU0FTX0hXX0VWRU5UX0FDSzoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TQVNfSFdfRVZFTlRfQUNLXG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9QT1JUX0NPTlRST0w6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfUE9SVF9DT05UUk9MXG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9TTVBfQUJPUlRfUlNQOgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NNUF9BQk9SVF9SU1BcbiIpKTsKKwkJbXBpX3Rhc2tfYWJvcnRfcmVzcChwbTgwMDFfaGEsIHBpb21iKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX0dFVF9OVk1EX0RBVEE6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfR0VUX05WTURfREFUQVxuIikpOworCQltcGlfZ2V0X252bWRfcmVzcChwbTgwMDFfaGEsIHBpb21iKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX1NFVF9OVk1EX0RBVEE6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU0VUX05WTURfREFUQVxuIikpOworCQltcGlfc2V0X252bWRfcmVzcChwbTgwMDFfaGEsIHBpb21iKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX0RFVklDRV9IQU5ETEVfUkVNT1ZBTDoKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9ERVZJQ0VfSEFORExFX1JFTU9WQUxcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBPUENfT1VCX1NFVF9ERVZJQ0VfU1RBVEU6CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU0VUX0RFVklDRV9TVEFURVxuIikpOworCQltcGlfc2V0X2Rldl9zdGF0ZV9yZXNwKHBtODAwMV9oYSwgcGlvbWIpOworCQlicmVhazsKKwljYXNlIE9QQ19PVUJfR0VUX0RFVklDRV9TVEFURToKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9HRVRfREVWSUNFX1NUQVRFXG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9TRVRfREVWX0lORk86CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU0VUX0RFVl9JTkZPXG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1BDX09VQl9TQVNfUkVfSU5JVElBTElaRToKKwkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TQVNfUkVfSU5JVElBTElaRVxuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJVbmtub3duIG91dGJvdW5kIFF1ZXVlIElPTUIgT1BDID0gJXhcbiIsCisJCQlvcGMpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfb3Eoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXN0cnVjdCBvdXRib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCXZvaWQgKnBNc2cxID0gTlVMTDsKKwl1OCBiYyA9IDA7CisJdTMyIHJldCA9IE1QSV9JT19TVEFUVVNfRkFJTDsKKworCWNpcmN1bGFyUSA9ICZwbTgwMDFfaGEtPm91dGJuZF9xX3RibFswXTsKKwlkbyB7CisJCXJldCA9IG1waV9tc2dfY29uc3VtZShwbTgwMDFfaGEsIGNpcmN1bGFyUSwgJnBNc2cxLCAmYmMpOworCQlpZiAoTVBJX0lPX1NUQVRVU19TVUNDRVNTID09IHJldCkgeworCQkJLyogcHJvY2VzcyB0aGUgb3V0Ym91bmQgbWVzc2FnZSAqLworCQkJcHJvY2Vzc19vbmVfaW9tYihwbTgwMDFfaGEsICh2b2lkICopKHBNc2cxIC0gNCkpOworCQkJLyogZnJlZSB0aGUgbWVzc2FnZSBmcm9tIHRoZSBvdXRib3VuZCBjaXJjdWxhciBidWZmZXIgKi8KKwkJCW1waV9tc2dfZnJlZV9zZXQocG04MDAxX2hhLCBwTXNnMSwgY2lyY3VsYXJRLCBiYyk7CisJCX0KKwkJaWYgKE1QSV9JT19TVEFUVVNfQlVTWSA9PSByZXQpIHsKKwkJCXUzMiBwcm9kdWNlcl9pZHg7CisJCQkvKiBVcGRhdGUgdGhlIHByb2R1Y2VyIGluZGV4IGZyb20gU1BDICovCisJCQlwcm9kdWNlcl9pZHggPSBwbTgwMDFfcmVhZF8zMihjaXJjdWxhclEtPnBpX3ZpcnQpOworCQkJY2lyY3VsYXJRLT5wcm9kdWNlcl9pbmRleCA9IGNwdV90b19sZTMyKHByb2R1Y2VyX2lkeCk7CisJCQlpZiAoY2lyY3VsYXJRLT5wcm9kdWNlcl9pbmRleCA9PQorCQkJCWNpcmN1bGFyUS0+Y29uc3VtZXJfaWR4KQorCQkJCS8qIE9RIGlzIGVtcHR5ICovCisJCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBQQ0lfRE1BXy4uLiB0byBvdXIgZGlyZWN0aW9uIHRyYW5zbGF0aW9uLiAqLworc3RhdGljIGNvbnN0IHU4IGRhdGFfZGlyX2ZsYWdzW10gPSB7CisJW1BDSV9ETUFfQklESVJFQ1RJT05BTF0gPSBEQVRBX0RJUl9CWVJFQ0lQSUVOVCwvKiBVTlNQRUNJRklFRCAqLworCVtQQ0lfRE1BX1RPREVWSUNFXQk9IERBVEFfRElSX09VVCwvKiBPVVRCT1VORCAqLworCVtQQ0lfRE1BX0ZST01ERVZJQ0VdCT0gREFUQV9ESVJfSU4sLyogSU5CT1VORCAqLworCVtQQ0lfRE1BX05PTkVdCQk9IERBVEFfRElSX05PTkUsLyogTk8gVFJBTlNGRVIgKi8KK307CitzdGF0aWMgdm9pZAorcG04MDAxX2NoaXBfbWFrZV9zZyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjYXR0ZXIsIGludCBuciwgdm9pZCAqcHJkKQoreworCWludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHBtODAwMV9wcmQgKmJ1Zl9wcmQgPSBwcmQ7CisKKwlmb3JfZWFjaF9zZyhzY2F0dGVyLCBzZywgbnIsIGkpIHsKKwkJYnVmX3ByZC0+YWRkciA9IGNwdV90b19sZTY0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCWJ1Zl9wcmQtPmltX2xlbi5sZW4gPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSk7CisJCWJ1Zl9wcmQtPmltX2xlbi5lID0gMDsKKwkJYnVmX3ByZCsrOworCX0KK30KKworc3RhdGljIHZvaWQgYnVpbGRfc21wX2NtZCh1MzIgZGV2aWNlSUQsIHUzMiBoVGFnLCBzdHJ1Y3Qgc21wX3JlcSAqcHNtcF9jbWQpCit7CisJcHNtcF9jbWQtPnRhZyA9IGNwdV90b19sZTMyKGhUYWcpOworCXBzbXBfY21kLT5kZXZpY2VfaWQgPSBjcHVfdG9fbGUzMihkZXZpY2VJRCk7CisJcHNtcF9jbWQtPmxlbl9pcF9pciA9IGNwdV90b19sZTMyKDF8KDEgPDwgMSkpOworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX3NtcF9yZXEgLSBzZW5kIGEgU01QIHRhc2sgdG8gRlcKKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbi4KKyAqIEBjY2I6IHRoZSBjY2IgaW5mb3JtYXRpb24gdGhpcyByZXF1ZXN0IHVzZWQuCisgKi8KK3N0YXRpYyBpbnQgcG04MDAxX2NoaXBfc21wX3JlcShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiKQoreworCWludCBlbGVtLCByYzsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBjY2ItPnRhc2s7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IHRhc2stPmRldjsKKwlzdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2RldiA9IGRldi0+bGxkZF9kZXY7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19yZXEsICpzZ19yZXNwOworCXUzMiByZXFfbGVuLCByZXNwX2xlbjsKKwlzdHJ1Y3Qgc21wX3JlcSBzbXBfY21kOworCXUzMiBvcGM7CisJc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUTsKKworCW1lbXNldCgmc21wX2NtZCwgMCwgc2l6ZW9mKHNtcF9jbWQpKTsKKwkvKgorCSAqIERNQS1tYXAgU01QIHJlcXVlc3QsIHJlc3BvbnNlIGJ1ZmZlcnMKKwkgKi8KKwlzZ19yZXEgPSAmdGFzay0+c21wX3Rhc2suc21wX3JlcTsKKwllbGVtID0gZG1hX21hcF9zZyhwbTgwMDFfaGEtPmRldiwgc2dfcmVxLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoIWVsZW0pCisJCXJldHVybiAtRU5PTUVNOworCXJlcV9sZW4gPSBzZ19kbWFfbGVuKHNnX3JlcSk7CisKKwlzZ19yZXNwID0gJnRhc2stPnNtcF90YXNrLnNtcF9yZXNwOworCWVsZW0gPSBkbWFfbWFwX3NnKHBtODAwMV9oYS0+ZGV2LCBzZ19yZXNwLCAxLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmICghZWxlbSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJcmVzcF9sZW4gPSBzZ19kbWFfbGVuKHNnX3Jlc3ApOworCS8qIG11c3QgYmUgaW4gZHdvcmRzICovCisJaWYgKChyZXFfbGVuICYgMHgzKSB8fCAocmVzcF9sZW4gJiAweDMpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb3V0XzI7CisJfQorCisJb3BjID0gT1BDX0lOQl9TTVBfUkVRVUVTVDsKKwljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKKwlzbXBfY21kLnRhZyA9IGNwdV90b19sZTMyKGNjYi0+Y2NiX3RhZyk7CisJc21wX2NtZC5sb25nX3NtcF9yZXEubG9uZ19yZXFfYWRkciA9CisJCWNwdV90b19sZTY0KCh1NjQpc2dfZG1hX2FkZHJlc3MoJnRhc2stPnNtcF90YXNrLnNtcF9yZXEpKTsKKwlzbXBfY21kLmxvbmdfc21wX3JlcS5sb25nX3JlcV9zaXplID0KKwkJY3B1X3RvX2xlMzIoKHUzMilzZ19kbWFfbGVuKCZ0YXNrLT5zbXBfdGFzay5zbXBfcmVxKS00KTsKKwlzbXBfY21kLmxvbmdfc21wX3JlcS5sb25nX3Jlc3BfYWRkciA9CisJCWNwdV90b19sZTY0KCh1NjQpc2dfZG1hX2FkZHJlc3MoJnRhc2stPnNtcF90YXNrLnNtcF9yZXNwKSk7CisJc21wX2NtZC5sb25nX3NtcF9yZXEubG9uZ19yZXNwX3NpemUgPQorCQljcHVfdG9fbGUzMigodTMyKXNnX2RtYV9sZW4oJnRhc2stPnNtcF90YXNrLnNtcF9yZXNwKS00KTsKKwlidWlsZF9zbXBfY21kKHBtODAwMV9kZXYtPmRldmljZV9pZCwgc21wX2NtZC50YWcsICZzbXBfY21kKTsKKwltcGlfYnVpbGRfY21kKHBtODAwMV9oYSwgY2lyY3VsYXJRLCBvcGMsICh1MzIgKikmc21wX2NtZCk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfMjoKKwlkbWFfdW5tYXBfc2cocG04MDAxX2hhLT5kZXYsICZjY2ItPnRhc2stPnNtcF90YXNrLnNtcF9yZXNwLCAxLAorCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKK2Vycl9vdXQ6CisJZG1hX3VubWFwX3NnKHBtODAwMV9oYS0+ZGV2LCAmY2NiLT50YXNrLT5zbXBfdGFzay5zbXBfcmVxLCAxLAorCQkJUENJX0RNQV9UT0RFVklDRSk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX3NzcF9pb19yZXEgLSBzZW5kIGEgU1NQIHRhc2sgdG8gRlcKKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbi4KKyAqIEBjY2I6IHRoZSBjY2IgaW5mb3JtYXRpb24gdGhpcyByZXF1ZXN0IHVzZWQuCisgKi8KK3N0YXRpYyBpbnQgcG04MDAxX2NoaXBfc3NwX2lvX3JlcShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGNjYi0+dGFzazsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gdGFzay0+ZGV2OworCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2ID0gZGV2LT5sbGRkX2RldjsKKwlzdHJ1Y3Qgc3NwX2luaV9pb19zdGFydF9yZXEgc3NwX2NtZDsKKwl1MzIgdGFnID0gY2NiLT5jY2JfdGFnOworCWludCByZXQ7CisJX19sZTY0IHBoeXNfYWRkcjsKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCXUzMiBvcGMgPSBPUENfSU5CX1NTUElOSUlPU1RBUlQ7CisJbWVtc2V0KCZzc3BfY21kLCAwLCBzaXplb2Yoc3NwX2NtZCkpOworCW1lbWNweShzc3BfY21kLnNzcF9pdS5sdW4sIHRhc2stPnNzcF90YXNrLkxVTiwgOCk7CisJc3NwX2NtZC5kaXJfbV90bHIgPSBkYXRhX2Rpcl9mbGFnc1t0YXNrLT5kYXRhX2Rpcl0gPDwgOCB8IDB4MDsvKjAgZm9yCisJU0FTIDEuMSBjb21wYXRpYmxlIFRMUiovCisJc3NwX2NtZC5kYXRhX2xlbiA9IGNwdV90b19sZTMyKHRhc2stPnRvdGFsX3hmZXJfbGVuKTsKKwlzc3BfY21kLmRldmljZV9pZCA9IGNwdV90b19sZTMyKHBtODAwMV9kZXYtPmRldmljZV9pZCk7CisJc3NwX2NtZC50YWcgPSBjcHVfdG9fbGUzMih0YWcpOworCWlmICh0YXNrLT5zc3BfdGFzay5lbmFibGVfZmlyc3RfYnVyc3QpCisJCXNzcF9jbWQuc3NwX2l1LmVmYl9wcmlvX2F0dHIgfD0gMHg4MDsKKwlzc3BfY21kLnNzcF9pdS5lZmJfcHJpb19hdHRyIHw9ICh0YXNrLT5zc3BfdGFzay50YXNrX3ByaW8gPDwgMyk7CisJc3NwX2NtZC5zc3BfaXUuZWZiX3ByaW9fYXR0ciB8PSAodGFzay0+c3NwX3Rhc2sudGFza19hdHRyICYgNyk7CisJbWVtY3B5KHNzcF9jbWQuc3NwX2l1LmNkYiwgdGFzay0+c3NwX3Rhc2suY2RiLCAxNik7CisJY2lyY3VsYXJRID0gJnBtODAwMV9oYS0+aW5ibmRfcV90YmxbMF07CisKKwkvKiBmaWxsIGluIFBSRCAoc2NhdHRlci9nYXRoZXIpIHRhYmxlLCBpZiBhbnkgKi8KKwlpZiAodGFzay0+bnVtX3NjYXR0ZXIgPiAxKSB7CisJCXBtODAwMV9jaGlwX21ha2Vfc2codGFzay0+c2NhdHRlciwgY2NiLT5uX2VsZW0sIGNjYi0+YnVmX3ByZCk7CisJCXBoeXNfYWRkciA9IGNwdV90b19sZTY0KGNjYi0+Y2NiX2RtYV9oYW5kbGUgKworCQkJCW9mZnNldG9mKHN0cnVjdCBwbTgwMDFfY2NiX2luZm8sIGJ1Zl9wcmRbMF0pKTsKKwkJc3NwX2NtZC5hZGRyX2xvdyA9IGxvd2VyXzMyX2JpdHMocGh5c19hZGRyKTsKKwkJc3NwX2NtZC5hZGRyX2hpZ2ggPSB1cHBlcl8zMl9iaXRzKHBoeXNfYWRkcik7CisJCXNzcF9jbWQuZXNnbCA9IGNwdV90b19sZTMyKDE8PDMxKTsKKwl9IGVsc2UgaWYgKHRhc2stPm51bV9zY2F0dGVyID09IDEpIHsKKwkJX19sZTY0IGRtYV9hZGRyID0gY3B1X3RvX2xlNjQoc2dfZG1hX2FkZHJlc3ModGFzay0+c2NhdHRlcikpOworCQlzc3BfY21kLmFkZHJfbG93ID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcik7CisJCXNzcF9jbWQuYWRkcl9oaWdoID0gdXBwZXJfMzJfYml0cyhkbWFfYWRkcik7CisJCXNzcF9jbWQubGVuID0gY3B1X3RvX2xlMzIodGFzay0+dG90YWxfeGZlcl9sZW4pOworCQlzc3BfY21kLmVzZ2wgPSAwOworCX0gZWxzZSBpZiAodGFzay0+bnVtX3NjYXR0ZXIgPT0gMCkgeworCQlzc3BfY21kLmFkZHJfbG93ID0gMDsKKwkJc3NwX2NtZC5hZGRyX2hpZ2ggPSAwOworCQlzc3BfY21kLmxlbiA9IGNwdV90b19sZTMyKHRhc2stPnRvdGFsX3hmZXJfbGVuKTsKKwkJc3NwX2NtZC5lc2dsID0gMDsKKwl9CisJcmV0ID0gbXBpX2J1aWxkX2NtZChwbTgwMDFfaGEsIGNpcmN1bGFyUSwgb3BjLCAmc3NwX2NtZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTgwMDFfY2hpcF9zYXRhX3JlcShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGNjYi0+dGFzazsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gdGFzay0+ZGV2OworCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfaGFfZGV2ID0gZGV2LT5sbGRkX2RldjsKKwl1MzIgdGFnID0gY2NiLT5jY2JfdGFnOworCWludCByZXQ7CisJc3RydWN0IHNhdGFfc3RhcnRfcmVxIHNhdGFfY21kOworCXUzMiBoZHJfdGFnLCBuY2dfdGFnID0gMDsKKwlfX2xlNjQgcGh5c19hZGRyOworCXUzMiBBVEFQID0gMHgwOworCXUzMiBkaXI7CisJc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUTsKKwl1MzIgIG9wYyA9IE9QQ19JTkJfU0FUQV9IT1NUX09QU1RBUlQ7CisJbWVtc2V0KCZzYXRhX2NtZCwgMCwgc2l6ZW9mKHNhdGFfY21kKSk7CisJY2lyY3VsYXJRID0gJnBtODAwMV9oYS0+aW5ibmRfcV90YmxbMF07CisJaWYgKHRhc2stPmRhdGFfZGlyID09IFBDSV9ETUFfTk9ORSkgeworCQlBVEFQID0gMHgwNDsgIC8qIG5vIGRhdGEqLworCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygibm8gZGF0YSBcbiIpKTsKKwl9IGVsc2UgaWYgKGxpa2VseSghdGFzay0+YXRhX3Rhc2suZGV2aWNlX2NvbnRyb2xfcmVnX3VwZGF0ZSkpIHsKKwkJaWYgKHRhc2stPmF0YV90YXNrLmRtYV94ZmVyKSB7CisJCQlBVEFQID0gMHgwNjsgLyogRE1BICovCisJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiRE1BIFxuIikpOworCQl9IGVsc2UgeworCQkJQVRBUCA9IDB4MDU7IC8qIFBJTyovCisJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiUElPIFxuIikpOworCQl9CisJCWlmICh0YXNrLT5hdGFfdGFzay51c2VfbmNxICYmCisJCQlkZXYtPnNhdGFfZGV2LmNvbW1hbmRfc2V0ICE9IEFUQVBJX0NPTU1BTkRfU0VUKSB7CisJCQlBVEFQID0gMHgwNzsgLyogRlBETUEgKi8KKwkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJGUERNQSBcbiIpKTsKKwkJfQorCX0KKwlpZiAodGFzay0+YXRhX3Rhc2sudXNlX25jcSAmJiBwbTgwMDFfZ2V0X25jcV90YWcodGFzaywgJmhkcl90YWcpKQorCQluY2dfdGFnID0gY3B1X3RvX2xlMzIoaGRyX3RhZyk7CisJZGlyID0gZGF0YV9kaXJfZmxhZ3NbdGFzay0+ZGF0YV9kaXJdIDw8IDg7CisJc2F0YV9jbWQudGFnID0gY3B1X3RvX2xlMzIodGFnKTsKKwlzYXRhX2NtZC5kZXZpY2VfaWQgPSBjcHVfdG9fbGUzMihwbTgwMDFfaGFfZGV2LT5kZXZpY2VfaWQpOworCXNhdGFfY21kLmRhdGFfbGVuID0gY3B1X3RvX2xlMzIodGFzay0+dG90YWxfeGZlcl9sZW4pOworCXNhdGFfY21kLm5jcXRhZ19hdGFwX2Rpcl9tID0KKwkJY3B1X3RvX2xlMzIoKChuY2dfdGFnICYgMHhmZik8PDE2KXwoKEFUQVAgJiAweDNmKSA8PCAxMCkgfCBkaXIpOworCXNhdGFfY21kLnNhdGFfZmlzID0gdGFzay0+YXRhX3Rhc2suZmlzOworCWlmIChsaWtlbHkoIXRhc2stPmF0YV90YXNrLmRldmljZV9jb250cm9sX3JlZ191cGRhdGUpKQorCQlzYXRhX2NtZC5zYXRhX2Zpcy5mbGFncyB8PSAweDgwOy8qIEM9MTogdXBkYXRlIEFUQSBjbWQgcmVnICovCisJc2F0YV9jbWQuc2F0YV9maXMuZmxhZ3MgJj0gMHhGMDsvKiBQTV9QT1JUIGZpZWxkIHNoYWxsIGJlIDAgKi8KKwkvKiBmaWxsIGluIFBSRCAoc2NhdHRlci9nYXRoZXIpIHRhYmxlLCBpZiBhbnkgKi8KKwlpZiAodGFzay0+bnVtX3NjYXR0ZXIgPiAxKSB7CisJCXBtODAwMV9jaGlwX21ha2Vfc2codGFzay0+c2NhdHRlciwgY2NiLT5uX2VsZW0sIGNjYi0+YnVmX3ByZCk7CisJCXBoeXNfYWRkciA9IGNwdV90b19sZTY0KGNjYi0+Y2NiX2RtYV9oYW5kbGUgKworCQkJCW9mZnNldG9mKHN0cnVjdCBwbTgwMDFfY2NiX2luZm8sIGJ1Zl9wcmRbMF0pKTsKKwkJc2F0YV9jbWQuYWRkcl9sb3cgPSBsb3dlcl8zMl9iaXRzKHBoeXNfYWRkcik7CisJCXNhdGFfY21kLmFkZHJfaGlnaCA9IHVwcGVyXzMyX2JpdHMocGh5c19hZGRyKTsKKwkJc2F0YV9jbWQuZXNnbCA9IGNwdV90b19sZTMyKDEgPDwgMzEpOworCX0gZWxzZSBpZiAodGFzay0+bnVtX3NjYXR0ZXIgPT0gMSkgeworCQlfX2xlNjQgZG1hX2FkZHIgPSBjcHVfdG9fbGU2NChzZ19kbWFfYWRkcmVzcyh0YXNrLT5zY2F0dGVyKSk7CisJCXNhdGFfY21kLmFkZHJfbG93ID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcik7CisJCXNhdGFfY21kLmFkZHJfaGlnaCA9IHVwcGVyXzMyX2JpdHMoZG1hX2FkZHIpOworCQlzYXRhX2NtZC5sZW4gPSBjcHVfdG9fbGUzMih0YXNrLT50b3RhbF94ZmVyX2xlbik7CisJCXNhdGFfY21kLmVzZ2wgPSAwOworCX0gZWxzZSBpZiAodGFzay0+bnVtX3NjYXR0ZXIgPT0gMCkgeworCQlzYXRhX2NtZC5hZGRyX2xvdyA9IDA7CisJCXNhdGFfY21kLmFkZHJfaGlnaCA9IDA7CisJCXNhdGFfY21kLmxlbiA9IGNwdV90b19sZTMyKHRhc2stPnRvdGFsX3hmZXJfbGVuKTsKKwkJc2F0YV9jbWQuZXNnbCA9IDA7CisJfQorCXJldCA9IG1waV9idWlsZF9jbWQocG04MDAxX2hhLCBjaXJjdWxhclEsIG9wYywgJnNhdGFfY21kKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX3BoeV9zdGFydF9yZXEgLSBzdGFydCBwaHkgdmlhIFBIWV9TVEFSVCBDT01NQU5ECisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24uCisgKiBAbnVtOiB0aGUgaW5ib3VuZCBxdWV1ZSBudW1iZXIKKyAqIEBwaHlfaWQ6IHRoZSBwaHkgaWQgd2hpY2ggd2Ugd2FudGVkIHRvIHN0YXJ0IHVwLgorICovCitzdGF0aWMgaW50CitwbTgwMDFfY2hpcF9waHlfc3RhcnRfcmVxKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdTggcGh5X2lkKQoreworCXN0cnVjdCBwaHlfc3RhcnRfcmVxIHBheWxvYWQ7CisJc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUTsKKwlpbnQgcmV0OworCXUzMiB0YWcgPSAweDAxOworCXUzMiBvcGNvZGUgPSBPUENfSU5CX1BIWVNUQVJUOworCWNpcmN1bGFyUSA9ICZwbTgwMDFfaGEtPmluYm5kX3FfdGJsWzBdOworCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKwlwYXlsb2FkLnRhZyA9IGNwdV90b19sZTMyKHRhZyk7CisJLyoKKwkgKiogWzA6N10gICBQSFkgSWRlbnRpZmllcgorCSAqKiBbODoxMV0gIGxpbmsgcmF0ZSAxLjVHLCAzRywgNkcKKwkgKiogWzEyOjEzXSBsaW5rIG1vZGUgMDFiIFNBUyBtb2RlOyAxMGIgU0FUQSBtb2RlOyAxMWIgYm90aAorCSAqKiBbMTRdICAgIDBiIGRpc2FibGUgc3BpbiB1cCBob2xkOyAxYiBlbmFibGUgc3BpbiB1cCBob2xkCisJICovCisJcGF5bG9hZC5hc2Vfc2hfbG1fc2xyX3BoeWlkID0gY3B1X3RvX2xlMzIoU1BJTkhPTERfRElTQUJMRSB8CisJCUxJTktNT0RFX0FVVE8gfAlMSU5LUkFURV8xNSB8CisJCUxJTktSQVRFXzMwIHwgTElOS1JBVEVfNjAgfCBwaHlfaWQpOworCXBheWxvYWQuc2FzX2lkZW50aWZ5LmRldl90eXBlID0gU0FTX0VORF9ERVY7CisJcGF5bG9hZC5zYXNfaWRlbnRpZnkuaW5pdGlhdG9yX2JpdHMgPSBTQVNfUFJPVE9DT0xfQUxMOworCW1lbWNweShwYXlsb2FkLnNhc19pZGVudGlmeS5zYXNfYWRkciwKKwkJcG04MDAxX2hhLT5zYXNfYWRkciwgU0FTX0FERFJfU0laRSk7CisJcGF5bG9hZC5zYXNfaWRlbnRpZnkucGh5X2lkID0gcGh5X2lkOworCXJldCA9IG1waV9idWlsZF9jbWQocG04MDAxX2hhLCBjaXJjdWxhclEsIG9wY29kZSwgJnBheWxvYWQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcG04MDAxX2NoaXBfcGh5X3N0b3BfcmVxIC0gc3RhcnQgcGh5IHZpYSBQSFlfU1RPUCBDT01NQU5ECisgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24uCisgKiBAbnVtOiB0aGUgaW5ib3VuZCBxdWV1ZSBudW1iZXIKKyAqIEBwaHlfaWQ6IHRoZSBwaHkgaWQgd2hpY2ggd2Ugd2FudGVkIHRvIHN0YXJ0IHVwLgorICovCitzdGF0aWMgaW50IHBtODAwMV9jaGlwX3BoeV9zdG9wX3JlcShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJdTggcGh5X2lkKQoreworCXN0cnVjdCBwaHlfc3RvcF9yZXEgcGF5bG9hZDsKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCWludCByZXQ7CisJdTMyIHRhZyA9IDB4MDE7CisJdTMyIG9wY29kZSA9IE9QQ19JTkJfUEhZU1RPUDsKKwljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKKwltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CisJcGF5bG9hZC50YWcgPSBjcHVfdG9fbGUzMih0YWcpOworCXBheWxvYWQucGh5X2lkID0gY3B1X3RvX2xlMzIocGh5X2lkKTsKKwlyZXQgPSBtcGlfYnVpbGRfY21kKHBtODAwMV9oYSwgY2lyY3VsYXJRLCBvcGNvZGUsICZwYXlsb2FkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNlZSBjb21tZW50cyBvbiBtcGlfcmVnX3Jlc3AuCisgKi8KK3N0YXRpYyBpbnQgcG04MDAxX2NoaXBfcmVnX2Rldl9yZXEoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2LCB1MzIgZmxhZykKK3sKKwlzdHJ1Y3QgcmVnX2Rldl9yZXEgcGF5bG9hZDsKKwl1MzIJb3BjOworCXUzMiBzdHBfc3Nwc21wX3NhdGEgPSAweDQ7CisJc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUTsKKwl1MzIgbGlua3JhdGUsIHBoeV9pZDsKKwlpbnQgcmMsIHRhZyA9IDB4ZGVhZGJlZWY7CisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiOworCXU4IHJldHJ5RmxhZyA9IDB4MTsKKwl1MTYgZmlyc3RCdXJzdFNpemUgPSAwOworCXUxNiBJVE5UID0gMjAwMDsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gcG04MDAxX2Rldi0+c2FzX2RldmljZTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqcGFyZW50X2RldiA9IGRldi0+cGFyZW50OworCWNpcmN1bGFyUSA9ICZwbTgwMDFfaGEtPmluYm5kX3FfdGJsWzBdOworCisJbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOworCXJjID0gcG04MDAxX3RhZ19hbGxvYyhwbTgwMDFfaGEsICZ0YWcpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWNjYiA9ICZwbTgwMDFfaGEtPmNjYl9pbmZvW3RhZ107CisJY2NiLT5kZXZpY2UgPSBwbTgwMDFfZGV2OworCWNjYi0+Y2NiX3RhZyA9IHRhZzsKKwlwYXlsb2FkLnRhZyA9IGNwdV90b19sZTMyKHRhZyk7CisJaWYgKGZsYWcgPT0gMSkKKwkJc3RwX3NzcHNtcF9zYXRhID0gMHgwMjsgLypkaXJlY3QgYXR0YWNoZWQgc2F0YSAqLworCWVsc2UgeworCQlpZiAocG04MDAxX2Rldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYpCisJCQlzdHBfc3Nwc21wX3NhdGEgPSAweDAwOyAvKiBzdHAqLworCQllbHNlIGlmIChwbTgwMDFfZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFViB8fAorCQkJcG04MDAxX2Rldi0+ZGV2X3R5cGUgPT0gRURHRV9ERVYgfHwKKwkJCXBtODAwMV9kZXYtPmRldl90eXBlID09IEZBTk9VVF9ERVYpCisJCQlzdHBfc3Nwc21wX3NhdGEgPSAweDAxOyAvKnNzcCBvciBzbXAqLworCX0KKwlpZiAocGFyZW50X2RldiAmJiBERVZfSVNfRVhQQU5ERVIocGFyZW50X2Rldi0+ZGV2X3R5cGUpKQorCQlwaHlfaWQgPSBwYXJlbnRfZGV2LT5leF9kZXYuZXhfcGh5LT5waHlfaWQ7CisJZWxzZQorCQlwaHlfaWQgPSBwbTgwMDFfZGV2LT5hdHRhY2hlZF9waHk7CisJb3BjID0gT1BDX0lOQl9SRUdfREVWOworCWxpbmtyYXRlID0gKHBtODAwMV9kZXYtPnNhc19kZXZpY2UtPmxpbmtyYXRlIDwgZGV2LT5wb3J0LT5saW5rcmF0ZSkgPworCQkJcG04MDAxX2Rldi0+c2FzX2RldmljZS0+bGlua3JhdGUgOiBkZXYtPnBvcnQtPmxpbmtyYXRlOworCXBheWxvYWQucGh5aWRfcG9ydGlkID0KKwkJY3B1X3RvX2xlMzIoKChwbTgwMDFfZGV2LT5zYXNfZGV2aWNlLT5wb3J0LT5pZCkgJiAweDBGKSB8CisJCSgocGh5X2lkICYgMHgwRikgPDwgNCkpOworCXBheWxvYWQuZHR5cGVfZGxyX3JldHJ5ID0gY3B1X3RvX2xlMzIoKHJldHJ5RmxhZyAmIDB4MDEpIHwKKwkJKChsaW5rcmF0ZSAmIDB4MEYpICogMHgxMDAwMDAwKSB8CisJCSgoc3RwX3NzcHNtcF9zYXRhICYgMHgwMykgKiAweDEwMDAwMDAwKSk7CisJcGF5bG9hZC5maXJzdGJ1cnN0c2l6ZV9JVE5leHVzdGltZW91dCA9CisJCWNwdV90b19sZTMyKElUTlQgfCAoZmlyc3RCdXJzdFNpemUgKiAweDEwMDAwKSk7CisJbWVtY3B5KCZwYXlsb2FkLnNhc19hZGRyX2hpLCBwbTgwMDFfZGV2LT5zYXNfZGV2aWNlLT5zYXNfYWRkciwKKwkJU0FTX0FERFJfU0laRSk7CisJcmMgPSBtcGlfYnVpbGRfY21kKHBtODAwMV9oYSwgY2lyY3VsYXJRLCBvcGMsICZwYXlsb2FkKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogc2VlIGNvbW1lbnRzIG9uIG1waV9yZWdfcmVzcC4KKyAqLworc3RhdGljIGludCBwbTgwMDFfY2hpcF9kZXJlZ19kZXZfcmVxKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwl1MzIgZGV2aWNlX2lkKQoreworCXN0cnVjdCBkZXJlZ19kZXZfcmVxIHBheWxvYWQ7CisJdTMyIG9wYyA9IE9QQ19JTkJfREVSRUdfREVWX0hBTkRMRTsKKwlpbnQgcmV0OworCXN0cnVjdCBpbmJvdW5kX3F1ZXVlX3RhYmxlICpjaXJjdWxhclE7CisKKwljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKKwltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CisJcGF5bG9hZC50YWcgPSAxOworCXBheWxvYWQuZGV2aWNlX2lkID0gY3B1X3RvX2xlMzIoZGV2aWNlX2lkKTsKKwlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCisJCXBtODAwMV9wcmludGsoInVucmVnaXN0ZXIgZGV2aWNlIGRldmljZV9pZCA9ICVkXG4iLCBkZXZpY2VfaWQpKTsKKwlyZXQgPSBtcGlfYnVpbGRfY21kKHBtODAwMV9oYSwgY2lyY3VsYXJRLCBvcGMsICZwYXlsb2FkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX3BoeV9jdGxfcmVxIC0gc3VwcG9ydCB0aGUgbG9jYWwgcGh5IG9wZXJhdGlvbgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uLgorICogQG51bTogdGhlIGluYm91bmQgcXVldWUgbnVtYmVyCisgKiBAcGh5X2lkOiB0aGUgcGh5IGlkIHdoaWNoIHdlIHdhbnRlZCB0byBvcGVyYXRlCisgKiBAcGh5X29wOgorICovCitzdGF0aWMgaW50IHBtODAwMV9jaGlwX3BoeV9jdGxfcmVxKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwl1MzIgcGh5SWQsIHUzMiBwaHlfb3ApCit7CisJc3RydWN0IGxvY2FsX3BoeV9jdGxfcmVxIHBheWxvYWQ7CisJc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUTsKKwlpbnQgcmV0OworCXUzMiBvcGMgPSBPUENfSU5CX0xPQ0FMX1BIWV9DT05UUk9MOworCW1lbXNldCgodTggKikmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKwljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKKwlwYXlsb2FkLnRhZyA9IDE7CisJcGF5bG9hZC5waHlvcF9waHlpZCA9CisJCWNwdV90b19sZTMyKCgocGh5X29wICYgMHhmZikgPDwgOCkgfCAocGh5SWQgJiAweDBGKSk7CisJcmV0ID0gbXBpX2J1aWxkX2NtZChwbTgwMDFfaGEsIGNpcmN1bGFyUSwgb3BjLCAmcGF5bG9hZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBwbTgwMDFfY2hpcF9pc19vdXJfaW50ZXJ1cHQoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXUzMiB2YWx1ZTsKKyNpZmRlZiBQTTgwMDFfVVNFX01TSVgKKwlyZXR1cm4gMTsKKyNlbmRpZgorCXZhbHVlID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLCBNU0dVX09EUik7CisJaWYgKHZhbHVlKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX2lzciAtIFBNODAwMSBpc3IgaGFuZGxlci4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbi4KKyAqIEBpcnE6IGlycSBudW1iZXIuCisgKiBAc3RhdDogc3RhdC4KKyAqLworc3RhdGljIGlycXJldHVybl90CitwbTgwMDFfY2hpcF9pc3Ioc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBtODAwMV9oYS0+bG9jaywgZmxhZ3MpOworCXBtODAwMV9jaGlwX2ludGVycnVwdF9kaXNhYmxlKHBtODAwMV9oYSk7CisJcHJvY2Vzc19vcShwbTgwMDFfaGEpOworCXBtODAwMV9jaGlwX2ludGVycnVwdF9lbmFibGUocG04MDAxX2hhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbTgwMDFfaGEtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF90YXNrX2Fib3J0KHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdTMyIG9wYywKKwl1MzIgZGV2X2lkLCB1OCBmbGFnLCB1MzIgdGFza190YWcsIHUzMiBjbWRfdGFnKQoreworCXN0cnVjdCB0YXNrX2Fib3J0X3JlcSB0YXNrX2Fib3J0OworCXN0cnVjdCBpbmJvdW5kX3F1ZXVlX3RhYmxlICpjaXJjdWxhclE7CisJaW50IHJldDsKKwljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKKwltZW1zZXQoJnRhc2tfYWJvcnQsIDAsIHNpemVvZih0YXNrX2Fib3J0KSk7CisJaWYgKEFCT1JUX1NJTkdMRSA9PSAoZmxhZyAmIEFCT1JUX01BU0spKSB7CisJCXRhc2tfYWJvcnQuYWJvcnRfYWxsID0gMDsKKwkJdGFza19hYm9ydC5kZXZpY2VfaWQgPSBjcHVfdG9fbGUzMihkZXZfaWQpOworCQl0YXNrX2Fib3J0LnRhZ190b19hYm9ydCA9IGNwdV90b19sZTMyKHRhc2tfdGFnKTsKKwkJdGFza19hYm9ydC50YWcgPSBjcHVfdG9fbGUzMihjbWRfdGFnKTsKKwl9IGVsc2UgaWYgKEFCT1JUX0FMTCA9PSAoZmxhZyAmIEFCT1JUX01BU0spKSB7CisJCXRhc2tfYWJvcnQuYWJvcnRfYWxsID0gY3B1X3RvX2xlMzIoMSk7CisJCXRhc2tfYWJvcnQuZGV2aWNlX2lkID0gY3B1X3RvX2xlMzIoZGV2X2lkKTsKKwkJdGFza19hYm9ydC50YWcgPSBjcHVfdG9fbGUzMihjbWRfdGFnKTsKKwl9CisJcmV0ID0gbXBpX2J1aWxkX2NtZChwbTgwMDFfaGEsIGNpcmN1bGFyUSwgb3BjLCAmdGFza19hYm9ydCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBwbTgwMDFfY2hpcF9hYm9ydF90YXNrIC0gU0FTIGFib3J0IHRhc2sgd2hlbiBlcnJvciBvciBleGNlcHRpb24gaGFwcGVuZWQuCisgKiBAdGFzazogdGhlIHRhc2sgd2Ugd2FudGVkIHRvIGFib3J0ZWQuCisgKiBAZmxhZzogdGhlIGFib3J0IGZsYWcuCisgKi8KK3N0YXRpYyBpbnQgcG04MDAxX2NoaXBfYWJvcnRfdGFzayhzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXYsIHU4IGZsYWcsIHUzMiB0YXNrX3RhZywgdTMyIGNtZF90YWcpCit7CisJdTMyIG9wYywgZGV2aWNlX2lkOworCWludCByYyA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJjbWRfdGFnID0gJXgsIGFib3J0IHRhc2sgdGFnIgorCQkiID0gJXgiLCBjbWRfdGFnLCB0YXNrX3RhZykpOworCWlmIChwbTgwMDFfZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFVikKKwkJb3BjID0gT1BDX0lOQl9TU1BfQUJPUlQ7CisJZWxzZSBpZiAocG04MDAxX2Rldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYpCisJCW9wYyA9IE9QQ19JTkJfU0FUQV9BQk9SVDsKKwllbHNlCisJCW9wYyA9IE9QQ19JTkJfU01QX0FCT1JUOy8qIFNNUCAqLworCWRldmljZV9pZCA9IHBtODAwMV9kZXYtPmRldmljZV9pZDsKKwlyYyA9IHNlbmRfdGFza19hYm9ydChwbTgwMDFfaGEsIG9wYywgZGV2aWNlX2lkLCBmbGFnLAorCQl0YXNrX3RhZywgY21kX3RhZyk7CisJaWYgKHJjICE9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpCisJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJyYz0gJWRcbiIsIHJjKSk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHBtODAwMV9jaGlwX3NzcF90bV9yZXEgLSBidWlsdCB0aGUgdGFzayBtYW5hZ21lbnQgY29tbWFuZC4KKyAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbi4KKyAqIEBjY2I6IHRoZSBjY2IgaW5mb3JtYXRpb24uCisgKiBAdG1mOiB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgcG04MDAxX2NoaXBfc3NwX3RtX3JlcShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiLCBzdHJ1Y3QgcG04MDAxX3RtZl90YXNrICp0bWYpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gY2NiLT50YXNrOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSB0YXNrLT5kZXY7CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXYgPSBkZXYtPmxsZGRfZGV2OworCXUzMiBvcGMgPSBPUENfSU5CX1NTUElOSVRNU1RBUlQ7CisJc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUTsKKwlzdHJ1Y3Qgc3NwX2luaV90bV9zdGFydF9yZXEgc3NwVE1DbWQ7CisJaW50IHJldDsKKworCW1lbXNldCgmc3NwVE1DbWQsIDAsIHNpemVvZihzc3BUTUNtZCkpOworCXNzcFRNQ21kLmRldmljZV9pZCA9IGNwdV90b19sZTMyKHBtODAwMV9kZXYtPmRldmljZV9pZCk7CisJc3NwVE1DbWQucmVsYXRlX3RhZyA9IGNwdV90b19sZTMyKHRtZi0+dGFnX29mX3Rhc2tfdG9fYmVfbWFuYWdlZCk7CisJc3NwVE1DbWQudG1mID0gY3B1X3RvX2xlMzIodG1mLT50bWYpOworCW1lbWNweShzc3BUTUNtZC5sdW4sIHRhc2stPnNzcF90YXNrLkxVTiwgOCk7CisJc3NwVE1DbWQudGFnID0gY3B1X3RvX2xlMzIoY2NiLT5jY2JfdGFnKTsKKwljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKKwlyZXQgPSBtcGlfYnVpbGRfY21kKHBtODAwMV9oYSwgY2lyY3VsYXJRLCBvcGMsICZzc3BUTUNtZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTgwMDFfY2hpcF9nZXRfbnZtZF9yZXEoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXZvaWQgKnBheWxvYWQpCit7CisJdTMyIG9wYyA9IE9QQ19JTkJfR0VUX05WTURfREFUQTsKKwl1MzIgbnZtZF90eXBlOworCWludCByYzsKKwl1MzIgdGFnOworCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYjsKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCXN0cnVjdCBnZXRfbnZtX2RhdGFfcmVxIG52bWRfcmVxOworCXN0cnVjdCBmd19jb250cm9sX2V4ICpmd19jb250cm9sX2NvbnRleHQ7CisJc3RydWN0IHBtODAwMV9pb2N0bF9wYXlsb2FkICppb2N0bF9wYXlsb2FkID0gcGF5bG9hZDsKKworCW52bWRfdHlwZSA9IGlvY3RsX3BheWxvYWQtPm1pbm9yX2Z1bmN0aW9uOworCWZ3X2NvbnRyb2xfY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmd19jb250cm9sX2V4KSwgR0ZQX0tFUk5FTCk7CisJZndfY29udHJvbF9jb250ZXh0LT51c3JBZGRyID0gKHU4ICopJmlvY3RsX3BheWxvYWQtPmZ1bmNfc3BlY2lmaWNbMF07CisJZndfY29udHJvbF9jb250ZXh0LT5sZW4gPSBpb2N0bF9wYXlsb2FkLT5sZW5ndGg7CisJY2lyY3VsYXJRID0gJnBtODAwMV9oYS0+aW5ibmRfcV90YmxbMF07CisJbWVtc2V0KCZudm1kX3JlcSwgMCwgc2l6ZW9mKG52bWRfcmVxKSk7CisJcmMgPSBwbTgwMDFfdGFnX2FsbG9jKHBtODAwMV9oYSwgJnRhZyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJY2NiID0gJnBtODAwMV9oYS0+Y2NiX2luZm9bdGFnXTsKKwljY2ItPmNjYl90YWcgPSB0YWc7CisJY2NiLT5md19jb250cm9sX2NvbnRleHQgPSBmd19jb250cm9sX2NvbnRleHQ7CisJbnZtZF9yZXEudGFnID0gY3B1X3RvX2xlMzIodGFnKTsKKworCXN3aXRjaCAobnZtZF90eXBlKSB7CisJY2FzZSBUV0lfREVWSUNFOiB7CisJCXUzMiB0d2lfYWRkciwgdHdpX3BhZ2Vfc2l6ZTsKKwkJdHdpX2FkZHIgPSAweGE4OworCQl0d2lfcGFnZV9zaXplID0gMjsKKworCQludm1kX3JlcS5sZW5faXJfdnBkZCA9IGNwdV90b19sZTMyKElQTW9kZSB8IHR3aV9hZGRyIDw8IDE2IHwKKwkJCXR3aV9wYWdlX3NpemUgPDwgOCB8IFRXSV9ERVZJQ0UpOworCQludm1kX3JlcS5yZXNwX2xlbiA9IGNwdV90b19sZTMyKGlvY3RsX3BheWxvYWQtPmxlbmd0aCk7CisJCW52bWRfcmVxLnJlc3BfYWRkcl9oaSA9CisJCSAgICBjcHVfdG9fbGUzMihwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bTlZNRF0ucGh5c19hZGRyX2hpKTsKKwkJbnZtZF9yZXEucmVzcF9hZGRyX2xvID0KKwkJICAgIGNwdV90b19sZTMyKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS5waHlzX2FkZHJfbG8pOworCQlicmVhazsKKwl9CisJY2FzZSBDX1NFRVBST006IHsKKwkJbnZtZF9yZXEubGVuX2lyX3ZwZGQgPSBjcHVfdG9fbGUzMihJUE1vZGUgfCBDX1NFRVBST00pOworCQludm1kX3JlcS5yZXNwX2xlbiA9IGNwdV90b19sZTMyKGlvY3RsX3BheWxvYWQtPmxlbmd0aCk7CisJCW52bWRfcmVxLnJlc3BfYWRkcl9oaSA9CisJCSAgICBjcHVfdG9fbGUzMihwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bTlZNRF0ucGh5c19hZGRyX2hpKTsKKwkJbnZtZF9yZXEucmVzcF9hZGRyX2xvID0KKwkJICAgIGNwdV90b19sZTMyKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS5waHlzX2FkZHJfbG8pOworCQlicmVhazsKKwl9CisJY2FzZSBWUERfRkxBU0g6IHsKKwkJbnZtZF9yZXEubGVuX2lyX3ZwZGQgPSBjcHVfdG9fbGUzMihJUE1vZGUgfCBWUERfRkxBU0gpOworCQludm1kX3JlcS5yZXNwX2xlbiA9IGNwdV90b19sZTMyKGlvY3RsX3BheWxvYWQtPmxlbmd0aCk7CisJCW52bWRfcmVxLnJlc3BfYWRkcl9oaSA9CisJCSAgICBjcHVfdG9fbGUzMihwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bTlZNRF0ucGh5c19hZGRyX2hpKTsKKwkJbnZtZF9yZXEucmVzcF9hZGRyX2xvID0KKwkJICAgIGNwdV90b19sZTMyKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS5waHlzX2FkZHJfbG8pOworCQlicmVhazsKKwl9CisJY2FzZSBFWFBBTl9ST006IHsKKwkJbnZtZF9yZXEubGVuX2lyX3ZwZGQgPSBjcHVfdG9fbGUzMihJUE1vZGUgfCBFWFBBTl9ST00pOworCQludm1kX3JlcS5yZXNwX2xlbiA9IGNwdV90b19sZTMyKGlvY3RsX3BheWxvYWQtPmxlbmd0aCk7CisJCW52bWRfcmVxLnJlc3BfYWRkcl9oaSA9CisJCSAgICBjcHVfdG9fbGUzMihwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bTlZNRF0ucGh5c19hZGRyX2hpKTsKKwkJbnZtZF9yZXEucmVzcF9hZGRyX2xvID0KKwkJICAgIGNwdV90b19sZTMyKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS5waHlzX2FkZHJfbG8pOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJjID0gbXBpX2J1aWxkX2NtZChwbTgwMDFfaGEsIGNpcmN1bGFyUSwgb3BjLCAmbnZtZF9yZXEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbTgwMDFfY2hpcF9zZXRfbnZtZF9yZXEoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXZvaWQgKnBheWxvYWQpCit7CisJdTMyIG9wYyA9IE9QQ19JTkJfU0VUX05WTURfREFUQTsKKwl1MzIgbnZtZF90eXBlOworCWludCByYzsKKwl1MzIgdGFnOworCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYjsKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCXN0cnVjdCBzZXRfbnZtX2RhdGFfcmVxIG52bWRfcmVxOworCXN0cnVjdCBmd19jb250cm9sX2V4ICpmd19jb250cm9sX2NvbnRleHQ7CisJc3RydWN0IHBtODAwMV9pb2N0bF9wYXlsb2FkICppb2N0bF9wYXlsb2FkID0gcGF5bG9hZDsKKworCW52bWRfdHlwZSA9IGlvY3RsX3BheWxvYWQtPm1pbm9yX2Z1bmN0aW9uOworCWZ3X2NvbnRyb2xfY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmd19jb250cm9sX2V4KSwgR0ZQX0tFUk5FTCk7CisJY2lyY3VsYXJRID0gJnBtODAwMV9oYS0+aW5ibmRfcV90YmxbMF07CisJbWVtY3B5KHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS52aXJ0X3B0ciwKKwkJaW9jdGxfcGF5bG9hZC0+ZnVuY19zcGVjaWZpYywKKwkJaW9jdGxfcGF5bG9hZC0+bGVuZ3RoKTsKKwltZW1zZXQoJm52bWRfcmVxLCAwLCBzaXplb2YobnZtZF9yZXEpKTsKKwlyYyA9IHBtODAwMV90YWdfYWxsb2MocG04MDAxX2hhLCAmdGFnKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwljY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1t0YWddOworCWNjYi0+ZndfY29udHJvbF9jb250ZXh0ID0gZndfY29udHJvbF9jb250ZXh0OworCWNjYi0+Y2NiX3RhZyA9IHRhZzsKKwludm1kX3JlcS50YWcgPSBjcHVfdG9fbGUzMih0YWcpOworCXN3aXRjaCAobnZtZF90eXBlKSB7CisJY2FzZSBUV0lfREVWSUNFOiB7CisJCXUzMiB0d2lfYWRkciwgdHdpX3BhZ2Vfc2l6ZTsKKwkJdHdpX2FkZHIgPSAweGE4OworCQl0d2lfcGFnZV9zaXplID0gMjsKKwkJbnZtZF9yZXEucmVzZXJ2ZWRbMF0gPSBjcHVfdG9fbGUzMigweEZFRENCQTk4KTsKKwkJbnZtZF9yZXEubGVuX2lyX3ZwZGQgPSBjcHVfdG9fbGUzMihJUE1vZGUgfCB0d2lfYWRkciA8PCAxNiB8CisJCQl0d2lfcGFnZV9zaXplIDw8IDggfCBUV0lfREVWSUNFKTsKKwkJbnZtZF9yZXEucmVzcF9sZW4gPSBjcHVfdG9fbGUzMihpb2N0bF9wYXlsb2FkLT5sZW5ndGgpOworCQludm1kX3JlcS5yZXNwX2FkZHJfaGkgPQorCQkgICAgY3B1X3RvX2xlMzIocG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLnBoeXNfYWRkcl9oaSk7CisJCW52bWRfcmVxLnJlc3BfYWRkcl9sbyA9CisJCSAgICBjcHVfdG9fbGUzMihwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bTlZNRF0ucGh5c19hZGRyX2xvKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQ19TRUVQUk9NOgorCQludm1kX3JlcS5sZW5faXJfdnBkZCA9IGNwdV90b19sZTMyKElQTW9kZSB8IENfU0VFUFJPTSk7CisJCW52bWRfcmVxLnJlc3BfbGVuID0gY3B1X3RvX2xlMzIoaW9jdGxfcGF5bG9hZC0+bGVuZ3RoKTsKKwkJbnZtZF9yZXEucmVzZXJ2ZWRbMF0gPSBjcHVfdG9fbGUzMigweEZFRENCQTk4KTsKKwkJbnZtZF9yZXEucmVzcF9hZGRyX2hpID0KKwkJICAgIGNwdV90b19sZTMyKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS5waHlzX2FkZHJfaGkpOworCQludm1kX3JlcS5yZXNwX2FkZHJfbG8gPQorCQkgICAgY3B1X3RvX2xlMzIocG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLnBoeXNfYWRkcl9sbyk7CisJCWJyZWFrOworCWNhc2UgVlBEX0ZMQVNIOgorCQludm1kX3JlcS5sZW5faXJfdnBkZCA9IGNwdV90b19sZTMyKElQTW9kZSB8IFZQRF9GTEFTSCk7CisJCW52bWRfcmVxLnJlc3BfbGVuID0gY3B1X3RvX2xlMzIoaW9jdGxfcGF5bG9hZC0+bGVuZ3RoKTsKKwkJbnZtZF9yZXEucmVzZXJ2ZWRbMF0gPSBjcHVfdG9fbGUzMigweEZFRENCQTk4KTsKKwkJbnZtZF9yZXEucmVzcF9hZGRyX2hpID0KKwkJICAgIGNwdV90b19sZTMyKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS5waHlzX2FkZHJfaGkpOworCQludm1kX3JlcS5yZXNwX2FkZHJfbG8gPQorCQkgICAgY3B1X3RvX2xlMzIocG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLnBoeXNfYWRkcl9sbyk7CisJCWJyZWFrOworCWNhc2UgRVhQQU5fUk9NOgorCQludm1kX3JlcS5sZW5faXJfdnBkZCA9IGNwdV90b19sZTMyKElQTW9kZSB8IEVYUEFOX1JPTSk7CisJCW52bWRfcmVxLnJlc3BfbGVuID0gY3B1X3RvX2xlMzIoaW9jdGxfcGF5bG9hZC0+bGVuZ3RoKTsKKwkJbnZtZF9yZXEucmVzZXJ2ZWRbMF0gPSBjcHVfdG9fbGUzMigweEZFRENCQTk4KTsKKwkJbnZtZF9yZXEucmVzcF9hZGRyX2hpID0KKwkJICAgIGNwdV90b19sZTMyKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltOVk1EXS5waHlzX2FkZHJfaGkpOworCQludm1kX3JlcS5yZXNwX2FkZHJfbG8gPQorCQkgICAgY3B1X3RvX2xlMzIocG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLnBoeXNfYWRkcl9sbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyYyA9IG1waV9idWlsZF9jbWQocG04MDAxX2hhLCBjaXJjdWxhclEsIG9wYywgJm52bWRfcmVxKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogcG04MDAxX2NoaXBfZndfZmxhc2hfdXBkYXRlX2J1aWxkIC0gc3VwcG9ydCB0aGUgZmlybXdhcmUgdXBkYXRlIG9wZXJhdGlvbgorICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uLgorICogQGZ3X2ZsYXNoX3VwZGF0YV9pbmZvOiBmaXJtd2FyZSBmbGFzaCB1cGRhdGUgcGFyYW0KKyAqLworc3RhdGljIGludAorcG04MDAxX2NoaXBfZndfZmxhc2hfdXBkYXRlX2J1aWxkKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwl2b2lkICpmd19mbGFzaF91cGRhdGFfaW5mbywgdTMyIHRhZykKK3sKKwlzdHJ1Y3QgZndfZmxhc2hfVXBkYXRlX3JlcSBwYXlsb2FkOworCXN0cnVjdCBmd19mbGFzaF91cGRhdGFfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCWludCByZXQ7CisJdTMyIG9wYyA9IE9QQ19JTkJfRldfRkxBU0hfVVBEQVRFOworCisJbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2Yoc3RydWN0IGZ3X2ZsYXNoX1VwZGF0ZV9yZXEpKTsKKwljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKKwlpbmZvID0gZndfZmxhc2hfdXBkYXRhX2luZm87CisJcGF5bG9hZC50YWcgPSBjcHVfdG9fbGUzMih0YWcpOworCXBheWxvYWQuY3VyX2ltYWdlX2xlbiA9IGNwdV90b19sZTMyKGluZm8tPmN1cl9pbWFnZV9sZW4pOworCXBheWxvYWQuY3VyX2ltYWdlX29mZnNldCA9IGNwdV90b19sZTMyKGluZm8tPmN1cl9pbWFnZV9vZmZzZXQpOworCXBheWxvYWQudG90YWxfaW1hZ2VfbGVuID0gY3B1X3RvX2xlMzIoaW5mby0+dG90YWxfaW1hZ2VfbGVuKTsKKwlwYXlsb2FkLmxlbiA9IGluZm8tPnNnbC5pbV9sZW4ubGVuIDsKKwlwYXlsb2FkLnNnbF9hZGRyX2xvID0gbG93ZXJfMzJfYml0cyhpbmZvLT5zZ2wuYWRkcik7CisJcGF5bG9hZC5zZ2xfYWRkcl9oaSA9IHVwcGVyXzMyX2JpdHMoaW5mby0+c2dsLmFkZHIpOworCXJldCA9IG1waV9idWlsZF9jbWQocG04MDAxX2hhLCBjaXJjdWxhclEsIG9wYywgJnBheWxvYWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3BtODAwMV9jaGlwX2Z3X2ZsYXNoX3VwZGF0ZV9yZXEoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXZvaWQgKnBheWxvYWQpCit7CisJc3RydWN0IGZ3X2ZsYXNoX3VwZGF0YV9pbmZvIGZsYXNoX3VwZGF0ZV9pbmZvOworCXN0cnVjdCBmd19jb250cm9sX2luZm8gKmZ3X2NvbnRyb2w7CisJc3RydWN0IGZ3X2NvbnRyb2xfZXggKmZ3X2NvbnRyb2xfY29udGV4dDsKKwlpbnQgcmM7CisJdTMyIHRhZzsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2I7CisJdm9pZCAqYnVmZmVyID0gTlVMTDsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKwl1MzIgcGh5c19hZGRyX2hpOworCXUzMiBwaHlzX2FkZHJfbG87CisJc3RydWN0IHBtODAwMV9pb2N0bF9wYXlsb2FkICppb2N0bF9wYXlsb2FkID0gcGF5bG9hZDsKKworCWZ3X2NvbnRyb2xfY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmd19jb250cm9sX2V4KSwgR0ZQX0tFUk5FTCk7CisJZndfY29udHJvbCA9IChzdHJ1Y3QgZndfY29udHJvbF9pbmZvICopJmlvY3RsX3BheWxvYWQtPmZ1bmNfc3BlY2lmaWNbMF07CisJaWYgKGZ3X2NvbnRyb2wtPmxlbiAhPSAwKSB7CisJCWlmIChwbTgwMDFfbWVtX2FsbG9jKHBtODAwMV9oYS0+cGRldiwKKwkJCSh2b2lkICoqKSZidWZmZXIsCisJCQkmcGh5c19hZGRyLAorCQkJJnBoeXNfYWRkcl9oaSwKKwkJCSZwaHlzX2FkZHJfbG8sCisJCQlmd19jb250cm9sLT5sZW4sIDApICE9IDApIHsKKwkJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJCQlwbTgwMDFfcHJpbnRrKCJNZW0gYWxsb2MgZmFpbHVyZVxuIikpOworCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCW1lbXNldChidWZmZXIsIDAsIGZ3X2NvbnRyb2wtPmxlbik7CisJbWVtY3B5KGJ1ZmZlciwgZndfY29udHJvbC0+YnVmZmVyLCBmd19jb250cm9sLT5sZW4pOworCWZsYXNoX3VwZGF0ZV9pbmZvLnNnbC5hZGRyID0gY3B1X3RvX2xlNjQocGh5c19hZGRyKTsKKwlmbGFzaF91cGRhdGVfaW5mby5zZ2wuaW1fbGVuLmxlbiA9IGNwdV90b19sZTMyKGZ3X2NvbnRyb2wtPmxlbik7CisJZmxhc2hfdXBkYXRlX2luZm8uc2dsLmltX2xlbi5lID0gMDsKKwlmbGFzaF91cGRhdGVfaW5mby5jdXJfaW1hZ2Vfb2Zmc2V0ID0gZndfY29udHJvbC0+b2Zmc2V0OworCWZsYXNoX3VwZGF0ZV9pbmZvLmN1cl9pbWFnZV9sZW4gPSBmd19jb250cm9sLT5sZW47CisJZmxhc2hfdXBkYXRlX2luZm8udG90YWxfaW1hZ2VfbGVuID0gZndfY29udHJvbC0+c2l6ZTsKKwlmd19jb250cm9sX2NvbnRleHQtPmZ3X2NvbnRyb2wgPSBmd19jb250cm9sOworCWZ3X2NvbnRyb2xfY29udGV4dC0+dmlydEFkZHIgPSBidWZmZXI7CisJZndfY29udHJvbF9jb250ZXh0LT5sZW4gPSBmd19jb250cm9sLT5sZW47CisJcmMgPSBwbTgwMDFfdGFnX2FsbG9jKHBtODAwMV9oYSwgJnRhZyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJY2NiID0gJnBtODAwMV9oYS0+Y2NiX2luZm9bdGFnXTsKKwljY2ItPmZ3X2NvbnRyb2xfY29udGV4dCA9IGZ3X2NvbnRyb2xfY29udGV4dDsKKwljY2ItPmNjYl90YWcgPSB0YWc7CisJcmMgPSBwbTgwMDFfY2hpcF9md19mbGFzaF91cGRhdGVfYnVpbGQocG04MDAxX2hhLCAmZmxhc2hfdXBkYXRlX2luZm8sCisJCXRhZyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitwbTgwMDFfY2hpcF9zZXRfZGV2X3N0YXRlX3JlcShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2V0X2Rldl9zdGF0ZV9yZXEgcGF5bG9hZDsKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROworCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYjsKKwlpbnQgcmM7CisJdTMyIHRhZzsKKwl1MzIgb3BjID0gT1BDX0lOQl9TRVRfREVWSUNFX1NUQVRFOworCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKwlyYyA9IHBtODAwMV90YWdfYWxsb2MocG04MDAxX2hhLCAmdGFnKTsKKwlpZiAocmMpCisJCXJldHVybiAtMTsKKwljY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1t0YWddOworCWNjYi0+Y2NiX3RhZyA9IHRhZzsKKwljY2ItPmRldmljZSA9IHBtODAwMV9kZXY7CisJY2lyY3VsYXJRID0gJnBtODAwMV9oYS0+aW5ibmRfcV90YmxbMF07CisJcGF5bG9hZC50YWcgPSBjcHVfdG9fbGUzMih0YWcpOworCXBheWxvYWQuZGV2aWNlX2lkID0gY3B1X3RvX2xlMzIocG04MDAxX2Rldi0+ZGV2aWNlX2lkKTsKKwlwYXlsb2FkLm5kcyA9IGNwdV90b19sZTMyKHN0YXRlKTsKKwlyYyA9IG1waV9idWlsZF9jbWQocG04MDAxX2hhLCBjaXJjdWxhclEsIG9wYywgJnBheWxvYWQpOworCXJldHVybiByYzsKKworfQorCitzdGF0aWMgaW50CitwbTgwMDFfY2hpcF9zYXNfcmVfaW5pdGlhbGl6YXRpb24oc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXN0cnVjdCBzYXNfcmVfaW5pdGlhbGl6YXRpb25fcmVxIHBheWxvYWQ7CisJc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgKmNpcmN1bGFyUTsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2I7CisJaW50IHJjOworCXUzMiB0YWc7CisJdTMyIG9wYyA9IE9QQ19JTkJfU0FTX1JFX0lOSVRJQUxJWkU7CisJbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOworCXJjID0gcG04MDAxX3RhZ19hbGxvYyhwbTgwMDFfaGEsICZ0YWcpOworCWlmIChyYykKKwkJcmV0dXJuIC0xOworCWNjYiA9ICZwbTgwMDFfaGEtPmNjYl9pbmZvW3RhZ107CisJY2NiLT5jY2JfdGFnID0gdGFnOworCWNpcmN1bGFyUSA9ICZwbTgwMDFfaGEtPmluYm5kX3FfdGJsWzBdOworCXBheWxvYWQudGFnID0gY3B1X3RvX2xlMzIodGFnKTsKKwlwYXlsb2FkLlNTQUhPTFQgPSBjcHVfdG9fbGUzMigweGQgPDwgMjUpOworCXBheWxvYWQuc2F0YV9ob2xfdG1vID0gY3B1X3RvX2xlMzIoODApOworCXBheWxvYWQub3Blbl9yZWplY3RfY21kcmV0cmllc19kYXRhX3JldHJpZXMgPSBjcHVfdG9fbGUzMigweGZmMDBmZik7CisJcmMgPSBtcGlfYnVpbGRfY21kKHBtODAwMV9oYSwgY2lyY3VsYXJRLCBvcGMsICZwYXlsb2FkKTsKKwlyZXR1cm4gcmM7CisKK30KKworY29uc3Qgc3RydWN0IHBtODAwMV9kaXNwYXRjaCBwbTgwMDFfODAwMV9kaXNwYXRjaCA9IHsKKwkubmFtZQkJCT0gInBtYzgwMDEiLAorCS5jaGlwX2luaXQJCT0gcG04MDAxX2NoaXBfaW5pdCwKKwkuY2hpcF9zb2Z0X3JzdAkJPSBwbTgwMDFfY2hpcF9zb2Z0X3JzdCwKKwkuY2hpcF9yc3QJCT0gcG04MDAxX2h3X2NoaXBfcnN0LAorCS5jaGlwX2lvdW5tYXAJCT0gcG04MDAxX2NoaXBfaW91bm1hcCwKKwkuaXNyCQkJPSBwbTgwMDFfY2hpcF9pc3IsCisJLmlzX291cl9pbnRlcnVwdAk9IHBtODAwMV9jaGlwX2lzX291cl9pbnRlcnVwdCwKKwkuaXNyX3Byb2Nlc3Nfb3EJCT0gcHJvY2Vzc19vcSwKKwkuaW50ZXJydXB0X2VuYWJsZSAJPSBwbTgwMDFfY2hpcF9pbnRlcnJ1cHRfZW5hYmxlLAorCS5pbnRlcnJ1cHRfZGlzYWJsZQk9IHBtODAwMV9jaGlwX2ludGVycnVwdF9kaXNhYmxlLAorCS5tYWtlX3ByZAkJPSBwbTgwMDFfY2hpcF9tYWtlX3NnLAorCS5zbXBfcmVxCQk9IHBtODAwMV9jaGlwX3NtcF9yZXEsCisJLnNzcF9pb19yZXEJCT0gcG04MDAxX2NoaXBfc3NwX2lvX3JlcSwKKwkuc2F0YV9yZXEJCT0gcG04MDAxX2NoaXBfc2F0YV9yZXEsCisJLnBoeV9zdGFydF9yZXEJCT0gcG04MDAxX2NoaXBfcGh5X3N0YXJ0X3JlcSwKKwkucGh5X3N0b3BfcmVxCQk9IHBtODAwMV9jaGlwX3BoeV9zdG9wX3JlcSwKKwkucmVnX2Rldl9yZXEJCT0gcG04MDAxX2NoaXBfcmVnX2Rldl9yZXEsCisJLmRlcmVnX2Rldl9yZXEJCT0gcG04MDAxX2NoaXBfZGVyZWdfZGV2X3JlcSwKKwkucGh5X2N0bF9yZXEJCT0gcG04MDAxX2NoaXBfcGh5X2N0bF9yZXEsCisJLnRhc2tfYWJvcnQJCT0gcG04MDAxX2NoaXBfYWJvcnRfdGFzaywKKwkuc3NwX3RtX3JlcQkJPSBwbTgwMDFfY2hpcF9zc3BfdG1fcmVxLAorCS5nZXRfbnZtZF9yZXEJCT0gcG04MDAxX2NoaXBfZ2V0X252bWRfcmVxLAorCS5zZXRfbnZtZF9yZXEJCT0gcG04MDAxX2NoaXBfc2V0X252bWRfcmVxLAorCS5md19mbGFzaF91cGRhdGVfcmVxCT0gcG04MDAxX2NoaXBfZndfZmxhc2hfdXBkYXRlX3JlcSwKKwkuc2V0X2Rldl9zdGF0ZV9yZXEJPSBwbTgwMDFfY2hpcF9zZXRfZGV2X3N0YXRlX3JlcSwKKwkuc2FzX3JlX2luaXRfcmVxCT0gcG04MDAxX2NoaXBfc2FzX3JlX2luaXRpYWxpemF0aW9uLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmggYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU0ZGFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmgKQEAgLTAsMCArMSwxMDMwIEBACisvKgorICogUE1DLVNpZXJyYSBTUEMgODAwMSBTQVMvU0FUQSBiYXNlZCBob3N0IGFkYXB0ZXJzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFVTSSBDby4sIEx0ZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKyNpZm5kZWYgX1BNQzgwMDFfUkVHX0hfCisjZGVmaW5lIF9QTUM4MDAxX1JFR19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYnNhcy5oPgorCisKKy8qIGZvciBSZXF1ZXN0IE9wY29kZSBvZiBJT01CICovCisjZGVmaW5lIE9QQ19JTkJfRUNITwkJCQkxCS8qIDB4MDAwICovCisjZGVmaW5lIE9QQ19JTkJfUEhZU1RBUlQJCQk0CS8qIDB4MDA0ICovCisjZGVmaW5lIE9QQ19JTkJfUEhZU1RPUAkJCQk1CS8qIDB4MDA1ICovCisjZGVmaW5lIE9QQ19JTkJfU1NQSU5JSU9TVEFSVAkJCTYJLyogMHgwMDYgKi8KKyNkZWZpbmUgT1BDX0lOQl9TU1BJTklUTVNUQVJUCQkJNwkvKiAweDAwNyAqLworI2RlZmluZSBPUENfSU5CX1NTUElOSUVYVElPU1RBUlQJCTgJLyogMHgwMDggKi8KKyNkZWZpbmUgT1BDX0lOQl9ERVZfSEFORExFX0FDQ0VQVAkJOQkvKiAweDAwOSAqLworI2RlZmluZSBPUENfSU5CX1NTUFRHVElPU1RBUlQJCQkxMAkvKiAweDAwQSAqLworI2RlZmluZSBPUENfSU5CX1NTUFRHVFJTUFNUQVJUCQkJMTEJLyogMHgwMEIgKi8KKyNkZWZpbmUgT1BDX0lOQl9TU1BJTklFRENJT1NUQVJUCQkxMgkvKiAweDAwQyAqLworI2RlZmluZSBPUENfSU5CX1NTUElOSUVYVEVEQ0lPU1RBUlQJCTEzCS8qIDB4MDBEICovCisjZGVmaW5lIE9QQ19JTkJfU1NQVEdURURDSU9TVEFSVAkJMTQJLyogMHgwMEUgKi8KKyNkZWZpbmUgT1BDX0lOQl9TU1BfQUJPUlQJCQkxNQkvKiAweDAwRiAqLworI2RlZmluZSBPUENfSU5CX0RFUkVHX0RFVl9IQU5ETEUJCTE2CS8qIDB4MDEwICovCisjZGVmaW5lIE9QQ19JTkJfR0VUX0RFVl9IQU5ETEUJCQkxNwkvKiAweDAxMSAqLworI2RlZmluZSBPUENfSU5CX1NNUF9SRVFVRVNUCQkJMTgJLyogMHgwMTIgKi8KKy8qIFNNUF9SRVNQT05TRSBpcyByZW1vdmVkICovCisjZGVmaW5lIE9QQ19JTkJfU01QX1JFU1BPTlNFCQkJMTkJLyogMHgwMTMgKi8KKyNkZWZpbmUgT1BDX0lOQl9TTVBfQUJPUlQJCQkyMAkvKiAweDAxNCAqLworI2RlZmluZSBPUENfSU5CX1JFR19ERVYJCQkJMjIJLyogMHgwMTYgKi8KKyNkZWZpbmUgT1BDX0lOQl9TQVRBX0hPU1RfT1BTVEFSVAkJMjMJLyogMHgwMTcgKi8KKyNkZWZpbmUgT1BDX0lOQl9TQVRBX0FCT1JUCQkJMjQJLyogMHgwMTggKi8KKyNkZWZpbmUgT1BDX0lOQl9MT0NBTF9QSFlfQ09OVFJPTAkJMjUJLyogMHgwMTkgKi8KKyNkZWZpbmUgT1BDX0lOQl9HRVRfREVWX0lORk8JCQkyNgkvKiAweDAxQSAqLworI2RlZmluZSBPUENfSU5CX0ZXX0ZMQVNIX1VQREFURQkJCTMyCS8qIDB4MDIwICovCisjZGVmaW5lIE9QQ19JTkJfR1BJTwkJCQkzNAkvKiAweDAyMiAqLworI2RlZmluZSBPUENfSU5CX1NBU19ESUFHX01PREVfU1RBUlRfRU5ECQkzNQkvKiAweDAyMyAqLworI2RlZmluZSBPUENfSU5CX1NBU19ESUFHX0VYRUNVVEUJCTM2CS8qIDB4MDI0ICovCisjZGVmaW5lIE9QQ19JTkJfU0FTX0hXX0VWRU5UX0FDSwkJMzcJLyogMHgwMjUgKi8KKyNkZWZpbmUgT1BDX0lOQl9HRVRfVElNRV9TVEFNUAkJCTM4CS8qIDB4MDI2ICovCisjZGVmaW5lIE9QQ19JTkJfUE9SVF9DT05UUk9MCQkJMzkJLyogMHgwMjcgKi8KKyNkZWZpbmUgT1BDX0lOQl9HRVRfTlZNRF9EQVRBCQkJNDAJLyogMHgwMjggKi8KKyNkZWZpbmUgT1BDX0lOQl9TRVRfTlZNRF9EQVRBCQkJNDEJLyogMHgwMjkgKi8KKyNkZWZpbmUgT1BDX0lOQl9TRVRfREVWSUNFX1NUQVRFCQk0MgkvKiAweDAyQSAqLworI2RlZmluZSBPUENfSU5CX0dFVF9ERVZJQ0VfU1RBVEUJCTQzCS8qIDB4MDJCICovCisjZGVmaW5lIE9QQ19JTkJfU0VUX0RFVl9JTkZPCQkJNDQJLyogMHgwMkMgKi8KKyNkZWZpbmUgT1BDX0lOQl9TQVNfUkVfSU5JVElBTElaRQkJNDUJLyogMHgwMkQgKi8KKworLyogZm9yIFJlc3BvbnNlIE9wY29kZSBvZiBJT01CICovCisjZGVmaW5lIE9QQ19PVUJfRUNITwkJCQkxCS8qIDB4MDAxICovCisjZGVmaW5lIE9QQ19PVUJfSFdfRVZFTlQJCQk0CS8qIDB4MDA0ICovCisjZGVmaW5lIE9QQ19PVUJfU1NQX0NPTVAJCQk1CS8qIDB4MDA1ICovCisjZGVmaW5lIE9QQ19PVUJfU01QX0NPTVAJCQk2CS8qIDB4MDA2ICovCisjZGVmaW5lIE9QQ19PVUJfTE9DQUxfUEhZX0NOVFJMCQkJNwkvKiAweDAwNyAqLworI2RlZmluZSBPUENfT1VCX0RFVl9SRUdJU1QJCQkxMAkvKiAweDAwQSAqLworI2RlZmluZSBPUENfT1VCX0RFUkVHX0RFVgkJCTExCS8qIDB4MDBCICovCisjZGVmaW5lIE9QQ19PVUJfR0VUX0RFVl9IQU5ETEUJCQkxMgkvKiAweDAwQyAqLworI2RlZmluZSBPUENfT1VCX1NBVEFfQ09NUAkJCTEzCS8qIDB4MDBEICovCisjZGVmaW5lIE9QQ19PVUJfU0FUQV9FVkVOVAkJCTE0CS8qIDB4MDBFICovCisjZGVmaW5lIE9QQ19PVUJfU1NQX0VWRU5UCQkJMTUJLyogMHgwMEYgKi8KKyNkZWZpbmUgT1BDX09VQl9ERVZfSEFORExFX0FSUklWCQkxNgkvKiAweDAxMCAqLworLyogU01QX1JFQ0VJVkVEIE5vdGlmaWNhdGlvbiBpcyByZW1vdmVkICovCisjZGVmaW5lIE9QQ19PVUJfU01QX1JFQ1ZfRVZFTlQJCQkxNwkvKiAweDAxMSAqLworI2RlZmluZSBPUENfT1VCX1NTUF9SRUNWX0VWRU5UCQkJMTgJLyogMHgwMTIgKi8KKyNkZWZpbmUgT1BDX09VQl9ERVZfSU5GTwkJCTE5CS8qIDB4MDEzICovCisjZGVmaW5lIE9QQ19PVUJfRldfRkxBU0hfVVBEQVRFCQkJMjAJLyogMHgwMTQgKi8KKyNkZWZpbmUgT1BDX09VQl9HUElPX1JFU1BPTlNFCQkJMjIJLyogMHgwMTYgKi8KKyNkZWZpbmUgT1BDX09VQl9HUElPX0VWRU5UCQkJMjMJLyogMHgwMTcgKi8KKyNkZWZpbmUgT1BDX09VQl9HRU5FUkFMX0VWRU5UCQkJMjQJLyogMHgwMTggKi8KKyNkZWZpbmUgT1BDX09VQl9TU1BfQUJPUlRfUlNQCQkJMjYJLyogMHgwMUEgKi8KKyNkZWZpbmUgT1BDX09VQl9TQVRBX0FCT1JUX1JTUAkJCTI3CS8qIDB4MDFCICovCisjZGVmaW5lIE9QQ19PVUJfU0FTX0RJQUdfTU9ERV9TVEFSVF9FTkQJCTI4CS8qIDB4MDFDICovCisjZGVmaW5lIE9QQ19PVUJfU0FTX0RJQUdfRVhFQ1VURQkJMjkJLyogMHgwMUQgKi8KKyNkZWZpbmUgT1BDX09VQl9HRVRfVElNRV9TVEFNUAkJCTMwCS8qIDB4MDFFICovCisjZGVmaW5lIE9QQ19PVUJfU0FTX0hXX0VWRU5UX0FDSwkJMzEJLyogMHgwMUYgKi8KKyNkZWZpbmUgT1BDX09VQl9QT1JUX0NPTlRST0wJCQkzMgkvKiAweDAyMCAqLworI2RlZmluZSBPUENfT1VCX1NLSVBfRU5UUlkJCQkzMwkvKiAweDAyMSAqLworI2RlZmluZSBPUENfT1VCX1NNUF9BQk9SVF9SU1AJCQkzNAkvKiAweDAyMiAqLworI2RlZmluZSBPUENfT1VCX0dFVF9OVk1EX0RBVEEJCQkzNQkvKiAweDAyMyAqLworI2RlZmluZSBPUENfT1VCX1NFVF9OVk1EX0RBVEEJCQkzNgkvKiAweDAyNCAqLworI2RlZmluZSBPUENfT1VCX0RFVklDRV9IQU5ETEVfUkVNT1ZBTAkJMzcJLyogMHgwMjUgKi8KKyNkZWZpbmUgT1BDX09VQl9TRVRfREVWSUNFX1NUQVRFCQkzOAkvKiAweDAyNiAqLworI2RlZmluZSBPUENfT1VCX0dFVF9ERVZJQ0VfU1RBVEUJCTM5CS8qIDB4MDI3ICovCisjZGVmaW5lIE9QQ19PVUJfU0VUX0RFVl9JTkZPCQkJNDAJLyogMHgwMjggKi8KKyNkZWZpbmUgT1BDX09VQl9TQVNfUkVfSU5JVElBTElaRQkJNDEJLyogMHgwMjkgKi8KKworLyogZm9yIHBoeSBzdGFydCovCisjZGVmaW5lIFNQSU5IT0xEX0RJU0FCTEUJCSgweDAwIDw8IDE0KQorI2RlZmluZSBTUElOSE9MRF9FTkFCTEUJCQkoMHgwMSA8PCAxNCkKKyNkZWZpbmUgTElOS01PREVfU0FTCQkJKDB4MDEgPDwgMTIpCisjZGVmaW5lIExJTktNT0RFX0RTQVRBCQkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIExJTktNT0RFX0FVVE8JCQkoMHgwMyA8PCAxMikKKyNkZWZpbmUgTElOS1JBVEVfMTUJCQkoMHgwMSA8PCA4KQorI2RlZmluZSBMSU5LUkFURV8zMAkJCSgweDAyIDw8IDgpCisjZGVmaW5lIExJTktSQVRFXzYwCQkJKDB4MDQgPDwgOCkKKworc3RydWN0IG1waV9tc2dfaGRyeworCV9fbGUzMgloZWFkZXI7CS8qIEJpdHMgWzExOjBdICAtIE1lc3NhZ2Ugb3BlcmF0aW9uIGNvZGUgKi8KKwkvKiBCaXRzIFsxNToxMl0gLSBNZXNzYWdlIENhdGVnb3J5ICovCisJLyogQml0cyBbMjE6MTZdIC0gT3V0Ym91bmRxdWV1ZSBJRCBmb3IgdGhlCisJb3BlcmF0aW9uIGNvbXBsZXRpb24gbWVzc2FnZSAqLworCS8qIEJpdHMgWzIzOjIyXSAtIFJlc2VydmVkICovCisJLyogQml0cyBbMjg6MjRdIC0gQnVmZmVyIENvdW50LCBpbmRpY2F0ZXMgaG93CisJbWFueSBidWZmZXIgYXJlIGFsbG9jYXRlZCBmb3IgdGhlIG1hc3NhZ2UgKi8KKwkvKiBCaXRzIFszMDoyOV0gLSBSZXNlcnZlZCAqLworCS8qIEJpdHMgWzMxXSAtIE1lc3NhZ2UgVmFsaWQgYml0ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisKKy8qCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgUEhZIFN0YXJ0IENvbW1hbmQKKyAqIHVzZSB0byBkZXNjcmliZSBlbmFibGUgdGhlIHBoeSAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBwaHlfc3RhcnRfcmVxIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglhc2Vfc2hfbG1fc2xyX3BoeWlkOworCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgc2FzX2lkZW50aWZ5OworCXUzMglyZXNlcnZlZFs1XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBQSFkgU3RhcnQgQ29tbWFuZAorICogdXNlIHRvIGRpc2FibGUgdGhlIHBoeSAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBwaHlfc3RvcF9yZXEgeworCV9fbGUzMgl0YWc7CisJX19sZTMyCXBoeV9pZDsKKwl1MzIJcmVzZXJ2ZWRbMTNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisvKiBzZXQgZGV2aWNlIGJpdHMgZmlzIC0gZGV2aWNlIHRvIGhvc3QgKi8KK3N0cnVjdCAgc2V0X2Rldl9iaXRzX2ZpcyB7CisJdTgJZmlzX3R5cGU7CS8qIDB4QTEqLworCXU4CW5faV9wbXBvcnQ7CisJLyogYjcgOiBuIEJpdC4gTm90aWZpY2F0aW9uIGJpdC4gSWYgc2V0IGRldmljZSBuZWVkcyBhdHRlbnRpb24uICovCisJLyogYjYgOiBpIEJpdC4gSW50ZXJydXB0IEJpdCAqLworCS8qIGI1LWI0OiByZXNlcnZlZDIgKi8KKwkvKiBiMy1iMDogUE0gUG9ydCAqLworCXU4IAlzdGF0dXM7CisJdTgJZXJyb3I7CisJdTMyCV9yX2E7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKy8qIFBJTyBzZXR1cCBGSVMgLSBkZXZpY2UgdG8gaG9zdCAqLworc3RydWN0ICBwaW9fc2V0dXBfZmlzIHsKKwl1OAlmaXNfdHlwZTsJLyogMHg1ZiAqLworCXU4CWlfZF9wbVBvcnQ7CisJLyogYjcgOiByZXNlcnZlZCAqLworCS8qIGI2IDogaSBiaXQuIEludGVycnVwdCBiaXQgKi8KKwkvKiBiNSA6IGQgYml0LiBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbi4gc2V0IHRvIDEgZm9yIGRldmljZSB0byBob3N0CisJeGZlciAqLworCS8qIGI0IDogcmVzZXJ2ZWQgKi8KKwkvKiBiMy1iMDogUE0gUG9ydCAqLworCXU4CXN0YXR1czsKKwl1OAllcnJvcjsKKwl1OAlsYmFsOworCXU4CWxiYW07CisJdTgJbGJhaDsKKwl1OAlkZXZpY2U7CisJdTgJbGJhbF9leHA7CisJdTgJbGJhbV9leHA7CisJdTgJbGJhaF9leHA7CisJdTgJX3JfYTsKKwl1OAlzZWN0b3JfY291bnQ7CisJdTgJc2VjdG9yX2NvdW50X2V4cDsKKwl1OAlfcl9iOworCXU4CWVfc3RhdHVzOworCXU4CV9yX2NbMl07CisJdTgJdHJhbnNmZXJfY291bnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTQVRBIENvbXBsZXRpb24gUmVzcG9uc2UKKyAqIHVzZSB0byBkaXNjcmliZSB0aGUgc2F0YSB0YXNrIHJlc3BvbnNlICg2NCBieXRlcykKKyAqLworc3RydWN0IHNhdGFfY29tcGxldGlvbl9yZXNwIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglzdGF0dXM7CisJX19sZTMyCXBhcmFtOworCXUzMglzYXRhX3Jlc3BbMTJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisvKgorICogYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mIFNBUyBIVyBFdmVudCBOb3RpZmljYXRpb24KKyAqIHVzZSB0byBhbGVydCB0aGUgaG9zdCBhYm91dCB0aGUgaGFyZHdhcmUgZXZlbnQoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBod19ldmVudF9yZXNwIHsKKwlfX2xlMzIJbHJfZXZ0X3N0YXR1c19waHlpZF9wb3J0aWQ7CisJX19sZTMyCWV2dF9wYXJhbTsKKwlfX2xlMzIJbnBpcF9wb3J0c3RhdGU7CisJc3RydWN0IHNhc19pZGVudGlmeV9mcmFtZQlzYXNfaWRlbnRpZnk7CisJc3RydWN0IGRldl90b19ob3N0X2ZpcwlzYXRhX2ZpczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiAgUkVHSVNURVIgREVWSUNFIENvbW1hbmQKKyAqIHVzZSB0byBkZXNjcmliZSBNUEkgUkVHSVNURVIgREVWSUNFIENvbW1hbmQgKDY0IGJ5dGVzKQorICovCisKK3N0cnVjdCByZWdfZGV2X3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJcGh5aWRfcG9ydGlkOworCV9fbGUzMglkdHlwZV9kbHJfcmV0cnk7CisJX19sZTMyCWZpcnN0YnVyc3RzaXplX0lUTmV4dXN0aW1lb3V0OworCXUzMglzYXNfYWRkcl9oaTsKKwl1MzIJc2FzX2FkZHJfbG93OworCV9fbGUzMgl1cHBlcl9kZXZpY2VfaWQ7CisJdTMyCXJlc2VydmVkWzhdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisvKgorICogYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mICBERVJFR0lTVEVSIERFVklDRSBDb21tYW5kCisgKiB1c2UgdG8gcmVxdWVzdCBzcGMgdG8gcmVtb3ZlIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZGV2aWNlIGlkICg2NCBieXRlcykKKyAqLworCitzdHJ1Y3QgZGVyZWdfZGV2X3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJZGV2aWNlX2lkOworCXUzMglyZXNlcnZlZFsxM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisKKy8qCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgREVWSUNFX1JFR0lTVFJBVElPTiBSZXNwb25zZQorICogdXNlIHRvIG5vdGlmeSB0aGUgY29tcGxldGlvbiBvZiB0aGUgZGV2aWNlIHJlZ2lzdHJhdGlvbiAgKDY0IGJ5dGVzKQorICovCisKK3N0cnVjdCBkZXZfcmVnX3Jlc3AgeworCV9fbGUzMgl0YWc7CisJX19sZTMyCXN0YXR1czsKKwlfX2xlMzIJZGV2aWNlX2lkOworCXUzMglyZXNlcnZlZFsxMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisKKy8qCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgTG9jYWwgUEhZIENvbnRyb2wgQ29tbWFuZAorICogdXNlIHRvIGlzc3VlIFBIWSBDT05UUk9MIHRvIGxvY2FsIHBoeSAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBsb2NhbF9waHlfY3RsX3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJcGh5b3BfcGh5aWQ7CisJdTMyCXJlc2VydmVkMVsxM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisKKy8qKgorICogYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mIExvY2FsIFBoeSBDb250cm9sIFJlc3BvbnNlCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIExvY2FsIFBoeSBDb250cm9sIFJlc3BvbnNlICg2NCBieXRlcykKKyAqLworc3RydWN0IGxvY2FsX3BoeV9jdGxfcmVzcCB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJcGh5b3BfcGh5aWQ7CisJX19sZTMyCXN0YXR1czsKKwl1MzIJcmVzZXJ2ZWRbMTJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisjZGVmaW5lIE9QX0JJVFMgMHgwMDAwRkYwMAorI2RlZmluZSBJRF9CSVRTIDB4MDAwMDAwMEYKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBQT1JUIENvbnRyb2wgQ29tbWFuZAorICogdXNlIHRvIGNvbnRyb2wgcG9ydCBwcm9wZXJ0aWVzICg2NCBieXRlcykKKyAqLworCitzdHJ1Y3QgcG9ydF9jdGxfcmVxIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglwb3J0b3BfcG9ydGlkOworCV9fbGUzMglwYXJhbTA7CisJX19sZTMyCXBhcmFtMTsKKwl1MzIJcmVzZXJ2ZWQxWzExXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBIVyBFdmVudCBBY2sgQ29tbWFuZAorICogdXNlIHRvIGFja25vd2xlZGdlIHJlY2VpdmUgSFcgZXZlbnQgKDY0IGJ5dGVzKQorICovCisKK3N0cnVjdCBod19ldmVudF9hY2tfcmVxIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglzZWFfcGh5aWRfcG9ydGlkOworCV9fbGUzMglwYXJhbTA7CisJX19sZTMyCXBhcmFtMTsKKwl1MzIJcmVzZXJ2ZWQxWzExXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTU1AgQ29tcGxldGlvbiBSZXNwb25zZQorICogdXNlIHRvIGluZGljYXRlIGEgU1NQIENvbXBsZXRpb24gIChuIGJ5dGVzKQorICovCitzdHJ1Y3Qgc3NwX2NvbXBsZXRpb25fcmVzcCB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJc3RhdHVzOworCV9fbGUzMglwYXJhbTsKKwlfX2xlMzIJc3NwdGFnX3Jlc2N2X3Jlc2NwYWQ7CisJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAgc3NwX3Jlc3BfaXU7CisJX19sZTMyCXJlc2lkdWFsX2NvdW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisjZGVmaW5lIFNTUF9SRVNDVl9CSVQJMHgwMDAxMDAwMAorCisvKgorICogYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mIFNBVEEgRVZORVQgZXNwb25zZQorICogdXNlIHRvIGluZGljYXRlIGEgU0FUQSBDb21wbGV0aW9uICAoNjQgYnl0ZXMpCisgKi8KKworc3RydWN0IHNhdGFfZXZlbnRfcmVzcCB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJZXZlbnQ7CisJX19sZTMyCXBvcnRfaWQ7CisJX19sZTMyCWRldmljZV9pZDsKKwl1MzIJcmVzZXJ2ZWRbMTFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTU1AgRVZORVQgZXNwb25zZQorICogdXNlIHRvIGluZGljYXRlIGEgU1NQIENvbXBsZXRpb24gICg2NCBieXRlcykKKyAqLworCitzdHJ1Y3Qgc3NwX2V2ZW50X3Jlc3AgeworCV9fbGUzMgl0YWc7CisJX19sZTMyCWV2ZW50OworCV9fbGUzMglwb3J0X2lkOworCV9fbGUzMglkZXZpY2VfaWQ7CisJdTMyCXJlc2VydmVkWzExXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKy8qKgorICogYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mIEdlbmVyYWwgRXZlbnQgTm90aWZpY2F0aW9uIFJlc3BvbnNlCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIEdlbmVyYWwgRXZlbnQgTm90aWZpY2F0aW9uIFJlc3BvbnNlICg2NCBieXRlcykKKyAqLworc3RydWN0IGdlbmVyYWxfZXZlbnRfcmVzcCB7CisJX19sZTMyCXN0YXR1czsKKwlfX2xlMzIJaW5iX0lPTUJfcGF5bG9hZFsxNF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisKKyNkZWZpbmUgR0VORVJBTF9FVkVOVF9QQVlMT0FECTE0CisjZGVmaW5lIE9QQ09ERV9CSVRTCTB4MDAwMDBmZmYKKworLyoKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTTVAgUmVxdWVzdCBDb21tYW5kCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNNUCBSRVFVRVNUIENvbW1hbmQgKDY0IGJ5dGVzKQorICovCitzdHJ1Y3Qgc21wX3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJZGV2aWNlX2lkOworCV9fbGUzMglsZW5faXBfaXI7CisJLyogQml0cyBbMF0gIC0gSW5kaXJlY3QgcmVzcG9uc2UgKi8KKwkvKiBCaXRzIFsxXSAtIEluZGlyZWN0IFBheWxvYWQgKi8KKwkvKiBCaXRzIFsxNToyXSAtIFJlc2VydmVkICovCisJLyogQml0cyBbMjM6MTZdIC0gZGlyZWN0IHBheWxvYWQgTGVuICovCisJLyogQml0cyBbMzE6MjRdIC0gUmVzZXJ2ZWQgKi8KKwl1OAlzbXBfcmVxMTZbMTZdOworCXVuaW9uIHsKKwkJdTgJc21wX3JlcVszMl07CisJCXN0cnVjdCB7CisJCQlfX2xlNjQgbG9uZ19yZXFfYWRkcjsvKiBzZyBkbWEgYWRkcmVzcywgTEUgKi8KKwkJCV9fbGUzMiBsb25nX3JlcV9zaXplOy8qIExFICovCisJCQl1MzIJX3JfYTsKKwkJCV9fbGU2NCBsb25nX3Jlc3BfYWRkcjsvKiBzZyBkbWEgYWRkcmVzcywgTEUgKi8KKwkJCV9fbGUzMiBsb25nX3Jlc3Bfc2l6ZTsvKiBMRSAqLworCQkJdTMyCV9yX2I7CisJCQl9IGxvbmdfc21wX3JlcTsvKiBzZXF1ZW5jZXIgZXh0ZW5zaW9uICovCisJfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisvKgorICogYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mIFNNUCBDb21wbGV0aW9uIFJlc3BvbnNlCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNNUCBDb21wbGV0aW9uIFJlc3BvbnNlICg2NCBieXRlcykKKyAqLworc3RydWN0IHNtcF9jb21wbGV0aW9uX3Jlc3AgeworCV9fbGUzMgl0YWc7CisJX19sZTMyCXN0YXR1czsKKwlfX2xlMzIJcGFyYW07CisJX19sZTMyCV9yX2FbMTJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworLyoKKyAqYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mIFNTUCBTTVAgU0FUQSBBYm9ydCBDb21tYW5kCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNTUCBTTVAgJiBTQVRBIEFib3J0IENvbW1hbmQgKDY0IGJ5dGVzKQorICovCitzdHJ1Y3QgdGFza19hYm9ydF9yZXEgeworCV9fbGUzMgl0YWc7CisJX19sZTMyCWRldmljZV9pZDsKKwlfX2xlMzIJdGFnX3RvX2Fib3J0OworCV9fbGUzMglhYm9ydF9hbGw7CisJdTMyCXJlc2VydmVkWzExXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKy8qIFRoZXNlIGZsYWdzIHVzZWQgZm9yIFNTUCBTTVAgJiBTQVRBIEFib3J0ICovCisjZGVmaW5lIEFCT1JUX01BU0sJCTB4MworI2RlZmluZSBBQk9SVF9TSU5HTEUJCTB4MAorI2RlZmluZSBBQk9SVF9BTEwJCTB4MQorCisvKioKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTU1AgU0FUQSBTTVAgQWJvcnQgUmVzcG9uc2UKKyAqIHVzZSB0byBkZXNjcmliZSBTU1AgU01QICYgU0FUQSBBYm9ydCBSZXNwb25zZSAoIDY0IGJ5dGVzKQorICovCitzdHJ1Y3QgdGFza19hYm9ydF9yZXNwIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglzdGF0dXM7CisJX19sZTMyCXNjcDsKKwl1MzIJcmVzZXJ2ZWRbMTJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisvKioKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTQVMgRGlhZ25vc3RpYyBTdGFydC9FbmQgQ29tbWFuZAorICogdXNlIHRvIGRlc2NyaWJlIE1QSSBTQVMgRGlhZ25vc3RpYyBTdGFydC9FbmQgQ29tbWFuZCAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBzYXNfZGlhZ19zdGFydF9lbmRfcmVxIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglvcGVyYXRpb25fcGh5aWQ7CisJdTMyCXJlc2VydmVkWzEzXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoqCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgU0FTIERpYWdub3N0aWMgRXhlY3V0ZSBDb21tYW5kCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNBUyBEaWFnbm9zdGljIEV4ZWN1dGUgQ29tbWFuZCAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBzYXNfZGlhZ19leGVjdXRlX3JlcXsKKwlfX2xlMzIJdGFnOworCV9fbGUzMgljbWR0eXBlX2NtZGRlc2NfcGh5aWQ7CisJX19sZTMyCXBhdDFfcGF0MjsKKwlfX2xlMzIJdGhyZXNob2xkOworCV9fbGUzMgljb2RlcGF0X2Vycm1zazsKKwlfX2xlMzIJcG1vbjsKKwlfX2xlMzIJcEVSRjFDVEw7CisJdTMyCXJlc2VydmVkWzhdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisjZGVmaW5lIFNBU19ESUFHX1BBUkFNX0JZVEVTIDI0CisKKy8qCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgU2V0IERldmljZSBTdGF0ZSBDb21tYW5kCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNldCBEZXZpY2UgU3RhdGUgQ29tbWFuZCAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBzZXRfZGV2X3N0YXRlX3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJZGV2aWNlX2lkOworCV9fbGUzMgluZHM7CisJdTMyCXJlc2VydmVkWzEyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKy8qCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2Ygc2FzX3JlX2luaXRpYWxpemF0aW9uCisgKi8KK3N0cnVjdCBzYXNfcmVfaW5pdGlhbGl6YXRpb25fcmVxIHsKKworCV9fbGUzMgl0YWc7CisJX19sZTMyCVNTQUhPTFQ7LyogYml0Mjktc2V0IG1heCBwb3J0OworCQkJKiogYml0Mjgtc2V0IG9wZW4gcmVqZWN0IGNtZCByZXRyaWVzLgorCQkJKiogYml0Mjctc2V0IG9wZW4gcmVqZWN0IGRhdGEgcmV0cmllcy4KKwkJCSoqIGJpdDI2LXNldCBvcGVuIHJlamVjdCBvcHRpb24sIHJlbWFwOjEgb3Igbm90OjAuCisJCQkqKiBiaXQyNS1zZXQgc2F0YSBoZWFkIG9mIGxpbmUgdGltZSBvdXQuCisJCQkqLworCV9fbGUzMiByZXNlcnZlZF9tYXhQb3J0czsKKwlfX2xlMzIgb3Blbl9yZWplY3RfY21kcmV0cmllc19kYXRhX3JldHJpZXM7LyogY21kIHJldHJpZXM6IDMxLWJpdDE2OworCQkJCQkJICAgICogZGF0YSByZXRyaWVzOiBiaXQxNS1iaXQwLgorCQkJCQkJICAgICovCisJX19sZTMyCXNhdGFfaG9sX3RtbzsKKwl1MzIJcmVzZXJ2ZWQxWzEwXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKy8qCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgU0FUQSBTdGFydCBDb21tYW5kCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNBVEEgSU8gU3RhcnQgQ29tbWFuZCAoNjQgYnl0ZXMpCisgKi8KKworc3RydWN0IHNhdGFfc3RhcnRfcmVxIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglkZXZpY2VfaWQ7CisJX19sZTMyCWRhdGFfbGVuOworCV9fbGUzMgluY3F0YWdfYXRhcF9kaXJfbTsKKwlzdHJ1Y3QgaG9zdF90b19kZXZfZmlzCXNhdGFfZmlzOworCXUzMglyZXNlcnZlZDE7CisJdTMyCXJlc2VydmVkMjsKKwl1MzIJYWRkcl9sb3c7CisJdTMyCWFkZHJfaGlnaDsKKwlfX2xlMzIJbGVuOworCV9fbGUzMgllc2dsOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworLyoqCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgU1NQIElOSSBUTSBTdGFydCBDb21tYW5kCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNTUCBJTkkgVE0gU3RhcnQgQ29tbWFuZCAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBzc3BfaW5pX3RtX3N0YXJ0X3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJZGV2aWNlX2lkOworCV9fbGUzMglyZWxhdGVfdGFnOworCV9fbGUzMgl0bWY7CisJdTgJbHVuWzhdOworCV9fbGUzMglkc19hZHNfbTsKKwl1MzIJcmVzZXJ2ZWRbOF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisKK3N0cnVjdCBzc3BfaW5mb191bml0IHsKKwl1OAlsdW5bOF07LyogU0NTSSBMb2dpY2FsIFVuaXQgTnVtYmVyICovCisJdTgJcmVzZXJ2ZWQxOy8qIHJlc2VydmVkICovCisJdTgJZWZiX3ByaW9fYXR0cjsKKwkvKiBCNyAgIDogZW5hYmxlZEZpcnN0QnVyc3QgKi8KKwkvKiBCNi0zIDogdGFza1ByaW9yaXR5ICovCisJLyogQjItMCA6IHRhc2tBdHRyaWJ1dGUgKi8KKwl1OAlyZXNlcnZlZDI7CS8qIHJlc2VydmVkICovCisJdTgJYWRkaXRpb25hbF9jZGJfbGVuOworCS8qIEI3LTIgOiBhZGRpdGlvbmFsX2NkYl9sZW4gKi8KKwkvKiBCMS0wIDogcmVzZXJ2ZWQgKi8KKwl1OAljZGJbMTZdOy8qIFRoZSBTQ1NJIENEQiB1cCB0byAxNiBieXRlcyBsZW5ndGggKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoqCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgU1NQIElOSSBJTyBTdGFydCBDb21tYW5kCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNTUCBJTkkgSU8gU3RhcnQgQ29tbWFuZCAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBzc3BfaW5pX2lvX3N0YXJ0X3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJZGV2aWNlX2lkOworCV9fbGUzMglkYXRhX2xlbjsKKwlfX2xlMzIJZGlyX21fdGxyOworCXN0cnVjdCBzc3BfaW5mb191bml0CXNzcF9pdTsKKwlfX2xlMzIJYWRkcl9sb3c7CisJX19sZTMyCWFkZHJfaGlnaDsKKwlfX2xlMzIJbGVuOworCV9fbGUzMgllc2dsOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisvKioKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBGaXJtd2FyZSBkb3dubG9hZAorICogdXNlIHRvIGRlc2NyaWJlIE1QSSBGVyBET1dOTE9BRCBDb21tYW5kICg2NCBieXRlcykKKyAqLworc3RydWN0IGZ3X2ZsYXNoX1VwZGF0ZV9yZXEgeworCV9fbGUzMgl0YWc7CisJX19sZTMyCWN1cl9pbWFnZV9vZmZzZXQ7CisJX19sZTMyCWN1cl9pbWFnZV9sZW47CisJX19sZTMyCXRvdGFsX2ltYWdlX2xlbjsKKwl1MzIJcmVzZXJ2ZWQwWzddOworCV9fbGUzMglzZ2xfYWRkcl9sbzsKKwlfX2xlMzIJc2dsX2FkZHJfaGk7CisJX19sZTMyCWxlbjsKKwlfX2xlMzIJZXh0X3Jlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisjZGVmaW5lIEZXRkxBU0hfSU9NQl9SRVNFUlZFRF9MRU4gMHgwNworLyoqCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgRldfRkxBU0hfVVBEQVRFIFJlc3BvbnNlCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIEZXX0ZMQVNIX1VQREFURSBSZXNwb25zZSAoNjQgYnl0ZXMpCisgKgorICovCitzdHJ1Y3QgZndfZmxhc2hfVXBkYXRlX3Jlc3AgeworCWRtYV9hZGRyX3QJdGFnOworCV9fbGUzMglzdGF0dXM7CisJdTMyCXJlc2VydmVkWzEzXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoqCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgR2V0IE5WTSBEYXRhIENvbW1hbmQKKyAqIHVzZSB0byBnZXQgZGF0YSBmcm9tIE5WTSBpbiBIQkEoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBnZXRfbnZtX2RhdGFfcmVxIHsKKwlfX2xlMzIJdGFnOworCV9fbGUzMglsZW5faXJfdnBkZDsKKwlfX2xlMzIJdnBkX29mZnNldDsKKwl1MzIJcmVzZXJ2ZWRbOF07CisJX19sZTMyCXJlc3BfYWRkcl9sbzsKKwlfX2xlMzIJcmVzcF9hZGRyX2hpOworCV9fbGUzMglyZXNwX2xlbjsKKwl1MzIJcmVzZXJ2ZWQxOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCitzdHJ1Y3Qgc2V0X252bV9kYXRhX3JlcSB7CisJX19sZTMyCXRhZzsKKwlfX2xlMzIJbGVuX2lyX3ZwZGQ7CisJX19sZTMyCXZwZF9vZmZzZXQ7CisJdTMyCXJlc2VydmVkWzhdOworCV9fbGUzMglyZXNwX2FkZHJfbG87CisJX19sZTMyCXJlc3BfYWRkcl9oaTsKKwlfX2xlMzIJcmVzcF9sZW47CisJdTMyCXJlc2VydmVkMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworI2RlZmluZSBUV0lfREVWSUNFCTB4MAorI2RlZmluZSBDX1NFRVBST00JMHgxCisjZGVmaW5lIFZQRF9GTEFTSAkweDQKKyNkZWZpbmUgQUFQMV9SRFVNUAkweDUKKyNkZWZpbmUgSU9QX1JEVU1QCTB4NgorI2RlZmluZSBFWFBBTl9ST00JMHg3CisKKyNkZWZpbmUgSVBNb2RlCQkweDgwMDAwMDAwCisjZGVmaW5lIE5WTURfVFlQRQkweDAwMDAwMDBGCisjZGVmaW5lIE5WTURfU1RBVAkweDAwMDBGRkZGCisjZGVmaW5lIE5WTURfTEVOCTB4RkYwMDAwMDAKKy8qKgorICogYnJpZWYgdGhlIGRhdGEgc3RydWN0dXJlIG9mIEdldCBOVk1EIERhdGEgUmVzcG9uc2UKKyAqIHVzZSB0byBkZXNjcmliZSBNUEkgR2V0IE5WTUQgRGF0YSBSZXNwb25zZSAoNjQgYnl0ZXMpCisgKi8KK3N0cnVjdCBnZXRfbnZtX2RhdGFfcmVzcCB7CisJX19sZTMyCQl0YWc7CisJX19sZTMyCQlpcl90ZGFfYm5fZHBzX2Rhc19udm07CisJX19sZTMyCQlkbGVuX3N0YXR1czsKKwlfX2xlMzIJCW52bV9kYXRhWzEyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKworLyoqCisgKiBicmllZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgU0FTIERpYWdub3N0aWMgU3RhcnQvRW5kIFJlc3BvbnNlCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNBUyBEaWFnbm9zdGljIFN0YXJ0L0VuZCBSZXNwb25zZSAoNjQgYnl0ZXMpCisgKgorICovCitzdHJ1Y3Qgc2FzX2RpYWdfc3RhcnRfZW5kX3Jlc3AgeworCV9fbGUzMgkJdGFnOworCV9fbGUzMgkJc3RhdHVzOworCXUzMgkJcmVzZXJ2ZWRbMTNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisvKioKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTQVMgRGlhZ25vc3RpYyBFeGVjdXRlIFJlc3BvbnNlCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNBUyBEaWFnbm9zdGljIEV4ZWN1dGUgUmVzcG9uc2UgKDY0IGJ5dGVzKQorICoKKyAqLworc3RydWN0IHNhc19kaWFnX2V4ZWN1dGVfcmVzcCB7CisJX19sZTMyCQl0YWc7CisJX19sZTMyCQljbWR0eXBlX2NtZGRlc2NfcGh5aWQ7CisJX19sZTMyCQlTdGF0dXM7CisJX19sZTMyCQlSZXBvcnREYXRhOworCXUzMgkJcmVzZXJ2ZWRbMTFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisvKioKKyAqIGJyaWVmIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBTZXQgRGV2aWNlIFN0YXRlIFJlc3BvbnNlCisgKiB1c2UgdG8gZGVzY3JpYmUgTVBJIFNldCBEZXZpY2UgU3RhdGUgUmVzcG9uc2UgKDY0IGJ5dGVzKQorICoKKyAqLworc3RydWN0IHNldF9kZXZfc3RhdGVfcmVzcCB7CisJX19sZTMyCQl0YWc7CisJX19sZTMyCQlzdGF0dXM7CisJX19sZTMyCQlkZXZpY2VfaWQ7CisJX19sZTMyCQlwZHNfbmRzOworCXUzMgkJcmVzZXJ2ZWRbMTFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworCisjZGVmaW5lIE5EU19CSVRTIDB4MEYKKyNkZWZpbmUgUERTX0JJVFMgMHhGMAorCisvKgorICogSFcgRXZlbnRzIHR5cGUKKyAqLworCisjZGVmaW5lIEhXX0VWRU5UX1JFU0VUX1NUQVJUCQkJMHgwMQorI2RlZmluZSBIV19FVkVOVF9DSElQX1JFU0VUX0NPTVBMRVRFCQkweDAyCisjZGVmaW5lIEhXX0VWRU5UX1BIWV9TVE9QX1NUQVRVUwkJMHgwMworI2RlZmluZSBIV19FVkVOVF9TQVNfUEhZX1VQCQkJMHgwNAorI2RlZmluZSBIV19FVkVOVF9TQVRBX1BIWV9VUAkJCTB4MDUKKyNkZWZpbmUgSFdfRVZFTlRfU0FUQV9TUElOVVBfSE9MRAkJMHgwNgorI2RlZmluZSBIV19FVkVOVF9QSFlfRE9XTgkJCTB4MDcKKyNkZWZpbmUgSFdfRVZFTlRfUE9SVF9JTlZBTElECQkJMHgwOAorI2RlZmluZSBIV19FVkVOVF9CUk9BRENBU1RfQ0hBTkdFCQkweDA5CisjZGVmaW5lIEhXX0VWRU5UX1BIWV9FUlJPUgkJCTB4MEEKKyNkZWZpbmUgSFdfRVZFTlRfQlJPQURDQVNUX1NFUwkJCTB4MEIKKyNkZWZpbmUgSFdfRVZFTlRfSU5CT1VORF9DUkNfRVJST1IJCTB4MEMKKyNkZWZpbmUgSFdfRVZFTlRfSEFSRF9SRVNFVF9SRUNFSVZFRAkJMHgwRAorI2RlZmluZSBIV19FVkVOVF9NQUxGVU5DVElPTgkJCTB4MEUKKyNkZWZpbmUgSFdfRVZFTlRfSURfRlJBTUVfVElNRU9VVAkJMHgwRgorI2RlZmluZSBIV19FVkVOVF9CUk9BRENBU1RfRVhQCQkJMHgxMAorI2RlZmluZSBIV19FVkVOVF9QSFlfU1RBUlRfU1RBVFVTCQkweDExCisjZGVmaW5lIEhXX0VWRU5UX0xJTktfRVJSX0lOVkFMSURfRFdPUkQJCTB4MTIKKyNkZWZpbmUgSFdfRVZFTlRfTElOS19FUlJfRElTUEFSSVRZX0VSUk9SCTB4MTMKKyNkZWZpbmUgSFdfRVZFTlRfTElOS19FUlJfQ09ERV9WSU9MQVRJT04JMHgxNAorI2RlZmluZSBIV19FVkVOVF9MSU5LX0VSUl9MT1NTX09GX0RXT1JEX1NZTkNICTB4MTUKKyNkZWZpbmUgSFdfRVZFTlRfTElOS19FUlJfUEhZX1JFU0VUX0ZBSUxFRAkweDE2CisjZGVmaW5lIEhXX0VWRU5UX1BPUlRfUkVDT1ZFUllfVElNRVJfVE1PCTB4MTcKKyNkZWZpbmUgSFdfRVZFTlRfUE9SVF9SRUNPVkVSCQkJMHgxOAorI2RlZmluZSBIV19FVkVOVF9QT1JUX1JFU0VUX1RJTUVSX1RNTwkJMHgxOQorI2RlZmluZSBIV19FVkVOVF9QT1JUX1JFU0VUX0NPTVBMRVRFCQkweDIwCisjZGVmaW5lIEVWRU5UX0JST0FEQ0FTVF9BU1lOQ0hfRVZFTlQJCTB4MjEKKworLyogcG9ydCBzdGF0ZSAqLworI2RlZmluZSBQT1JUX05PVF9FU1RBQkxJU0hFRAkJCTB4MDAKKyNkZWZpbmUgUE9SVF9WQUxJRAkJCQkweDAxCisjZGVmaW5lIFBPUlRfTE9TVENPTU0JCQkJMHgwMgorI2RlZmluZSBQT1JUX0lOX1JFU0VUCQkJCTB4MDQKKyNkZWZpbmUgUE9SVF9JTlZBTElECQkJCTB4MDgKKworLyoKKyAqIFNTUC9TTVAvU0FUQSBJTyBDb21wbGV0aW9uIFN0YXR1cyB2YWx1ZXMKKyAqLworCisjZGVmaW5lIElPX1NVQ0NFU1MJCQkJMHgwMAorI2RlZmluZSBJT19BQk9SVEVECQkJCTB4MDEKKyNkZWZpbmUgSU9fT1ZFUkZMT1cJCQkJMHgwMgorI2RlZmluZSBJT19VTkRFUkZMT1cJCQkJMHgwMworI2RlZmluZSBJT19GQUlMRUQJCQkJMHgwNAorI2RlZmluZSBJT19BQk9SVF9SRVNFVAkJCQkweDA1CisjZGVmaW5lIElPX05PVF9WQUxJRAkJCQkweDA2CisjZGVmaW5lIElPX05PX0RFVklDRQkJCQkweDA3CisjZGVmaW5lIElPX0lMTEVHQUxfUEFSQU1FVEVSCQkJMHgwOAorI2RlZmluZSBJT19MSU5LX0ZBSUxVUkUJCQkJMHgwOQorI2RlZmluZSBJT19QUk9HX0VSUk9SCQkJCTB4MEEKKyNkZWZpbmUgSU9fRURDX0lOX0VSUk9SCQkJCTB4MEIKKyNkZWZpbmUgSU9fRURDX09VVF9FUlJPUgkJCTB4MEMKKyNkZWZpbmUgSU9fRVJST1JfSFdfVElNRU9VVAkJCTB4MEQKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9CUkVBSwkJCTB4MEUKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9QSFlfTk9UX1JFQURZCQkweDBGCisjZGVmaW5lIElPX09QRU5fQ05YX0VSUk9SX1BST1RPQ09MX05PVF9TVVBQT1JURUQJMHgxMAorI2RlZmluZSBJT19PUEVOX0NOWF9FUlJPUl9aT05FX1ZJT0xBVElPTgkJMHgxMQorI2RlZmluZSBJT19PUEVOX0NOWF9FUlJPUl9CUkVBSwkJCQkweDEyCisjZGVmaW5lIElPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MJCQkweDEzCisjZGVmaW5lIElPX09QRU5fQ05YX0VSUk9SX0JBRF9ERVNUSU5BVElPTgkJMHgxNAorI2RlZmluZSBJT19PUEVOX0NOWF9FUlJPUl9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRAkweDE1CisjZGVmaW5lIElPX09QRU5fQ05YX0VSUk9SX1NUUF9SRVNPVVJDRVNfQlVTWQkJMHgxNgorI2RlZmluZSBJT19PUEVOX0NOWF9FUlJPUl9XUk9OR19ERVNUSU5BVElPTgkJMHgxNworI2RlZmluZSBJT19PUEVOX0NOWF9FUlJPUl9VTktOT1dOX0VSUk9SCQkJMHgxOAorI2RlZmluZSBJT19YRkVSX0VSUk9SX05BS19SRUNFSVZFRAkJCTB4MTkKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9BQ0tfTkFLX1RJTUVPVVQJCQkweDFBCisjZGVmaW5lIElPX1hGRVJfRVJST1JfUEVFUl9BQk9SVEVECQkJMHgxQgorI2RlZmluZSBJT19YRkVSX0VSUk9SX1JYX0ZSQU1FCQkJCTB4MUMKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9ETUEJCQkJMHgxRAorI2RlZmluZSBJT19YRkVSX0VSUk9SX0NSRURJVF9USU1FT1VUCQkJMHgxRQorI2RlZmluZSBJT19YRkVSX0VSUk9SX1NBVEFfTElOS19USU1FT1VUCQkJMHgxRgorI2RlZmluZSBJT19YRkVSX0VSUk9SX1NBVEEJCQkJMHgyMAorI2RlZmluZSBJT19YRkVSX0VSUk9SX0FCT1JURURfRFVFX1RPX1NSU1QJCTB4MjIKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9SRUpFQ1RFRF9OQ1FfTU9ERQkJCTB4MjEKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9BQk9SVEVEX05DUV9NT0RFCQkJMHgyMworI2RlZmluZSBJT19YRkVSX09QRU5fUkVUUllfVElNRU9VVAkJCTB4MjQKKyNkZWZpbmUgSU9fWEZFUl9TTVBfUkVTUF9DT05ORUNUSU9OX0VSUk9SCQkweDI1CisjZGVmaW5lIElPX1hGRVJfRVJST1JfVU5FWFBFQ1RFRF9QSEFTRQkJCTB4MjYKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9YRkVSX1JEWV9PVkVSUlVOCQkJMHgyNworI2RlZmluZSBJT19YRkVSX0VSUk9SX1hGRVJfUkRZX05PVF9FWFBFQ1RFRAkJMHgyOAorCisjZGVmaW5lIElPX1hGRVJfRVJST1JfQ01EX0lTU1VFX0FDS19OQUtfVElNRU9VVAkJMHgzMAorI2RlZmluZSBJT19YRkVSX0VSUk9SX0NNRF9JU1NVRV9CUkVBS19CRUZPUkVfQUNLX05BSwkweDMxCisjZGVmaW5lIElPX1hGRVJfRVJST1JfQ01EX0lTU1VFX1BIWV9ET1dOX0JFRk9SRV9BQ0tfTkFLCTB4MzIKKworI2RlZmluZSBJT19YRkVSX0VSUk9SX09GRlNFVF9NSVNNQVRDSAkJCTB4MzQKKyNkZWZpbmUgSU9fWEZFUl9FUlJPUl9YRkVSX1pFUk9fREFUQV9MRU4JCTB4MzUKKyNkZWZpbmUgSU9fWEZFUl9DTURfRlJBTUVfSVNTVUVECQkJMHgzNgorI2RlZmluZSBJT19FUlJPUl9JTlRFUk5BTF9TTVBfUkVTT1VSQ0UJCQkweDM3CisjZGVmaW5lIElPX1BPUlRfSU5fUkVTRVQJCQkJMHgzOAorI2RlZmluZSBJT19EU19OT05fT1BFUkFUSU9OQUwJCQkJMHgzOQorI2RlZmluZSBJT19EU19JTl9SRUNPVkVSWQkJCQkweDNBCisjZGVmaW5lIElPX1RNX1RBR19OT1RfRk9VTkQJCQkJMHgzQgorI2RlZmluZSBJT19YRkVSX1BJT19TRVRVUF9FUlJPUgkJCQkweDNDCisjZGVmaW5lIElPX1NTUF9FWFRfSVVfWkVST19MRU5fRVJST1IJCQkweDNECisjZGVmaW5lIElPX0RTX0lOX0VSUk9SCQkJCQkweDNFCisjZGVmaW5lIElPX09QRU5fQ05YX0VSUk9SX0hXX1JFU09VUkNFX0JVU1kJCTB4M0YKKyNkZWZpbmUgSU9fQUJPUlRfSU5fUFJPR1JFU1MJCQkJMHg0MAorI2RlZmluZSBJT19BQk9SVF9ERUxBWUVECQkJCTB4NDEKKyNkZWZpbmUgSU9fSU5WQUxJRF9MRU5HVEgJCQkJMHg0MgorCisvKiBXQVJOSU5HOiBUaGlzIGVycm9yIGNvZGUgbXVzdCBhbHdheXMgYmUgdGhlIGxhc3QgbnVtYmVyLgorICogSWYgeW91IGFkZCBlcnJvciBjb2RlLCBtb2RpZnkgdGhpcyBjb2RlIGFsc28KKyAqIEl0IGlzIHVzZWQgYXMgYW4gaW5kZXgKKyAqLworI2RlZmluZSBJT19FUlJPUl9VTktOT1dOX0dFTkVSSUMJCQkweDQzCisKKy8qIE1TR1UgQ09ORklHVVJBVElPTiAgVEFCTEUqLworCisjZGVmaW5lIFNQQ19NU0dVX0NGR19UQUJMRV9VUERBVEUJCTB4MDEvKiBJbmJvdW5kIGRvb3JiZWxsIGJpdDAgKi8KKyNkZWZpbmUgU1BDX01TR1VfQ0ZHX1RBQkxFX1JFU0VUCQkweDAyLyogSW5ib3VuZCBkb29yYmVsbCBiaXQxICovCisjZGVmaW5lIFNQQ19NU0dVX0NGR19UQUJMRV9GUkVFWkUJCTB4MDQvKiBJbmJvdW5kIGRvb3JiZWxsIGJpdDIgKi8KKyNkZWZpbmUgU1BDX01TR1VfQ0ZHX1RBQkxFX1VORlJFRVpFCQkweDA4LyogSW5ib3VuZCBkb29yYmVsbCBiaXQ0ICovCisjZGVmaW5lIE1TR1VfSUJEQl9TRVQJCQkJMHgwNAorI2RlZmluZSBNU0dVX0hPU1RfSU5UX1NUQVRVUwkJCTB4MDgKKyNkZWZpbmUgTVNHVV9IT1NUX0lOVF9NQVNLCQkJMHgwQworI2RlZmluZSBNU0dVX0lPUElCX0lOVF9TVEFUVVMJCQkweDE4CisjZGVmaW5lIE1TR1VfSU9QSUJfSU5UX01BU0sJCQkweDFDCisjZGVmaW5lIE1TR1VfSUJEQl9DTEVBUgkJCQkweDIwLyogUmV2QiAtIEhvc3Qgbm90IHVzZSAqLworI2RlZmluZSBNU0dVX01TR1VfQ09OVFJPTAkJCTB4MjQKKyNkZWZpbmUgTVNHVV9PRFIJCQkJMHgzQy8qIFJldkIgKi8KKyNkZWZpbmUgTVNHVV9PRENSCQkJCTB4NDAvKiBSZXZCICovCisjZGVmaW5lIE1TR1VfU0NSQVRDSF9QQURfMAkJCTB4NDQKKyNkZWZpbmUgTVNHVV9TQ1JBVENIX1BBRF8xCQkJMHg0OAorI2RlZmluZSBNU0dVX1NDUkFUQ0hfUEFEXzIJCQkweDRDCisjZGVmaW5lIE1TR1VfU0NSQVRDSF9QQURfMwkJCTB4NTAKKyNkZWZpbmUgTVNHVV9IT1NUX1NDUkFUQ0hfUEFEXzAJCQkweDU0CisjZGVmaW5lIE1TR1VfSE9TVF9TQ1JBVENIX1BBRF8xCQkJMHg1OAorI2RlZmluZSBNU0dVX0hPU1RfU0NSQVRDSF9QQURfMgkJCTB4NUMKKyNkZWZpbmUgTVNHVV9IT1NUX1NDUkFUQ0hfUEFEXzMJCQkweDYwCisjZGVmaW5lIE1TR1VfSE9TVF9TQ1JBVENIX1BBRF80CQkJMHg2NAorI2RlZmluZSBNU0dVX0hPU1RfU0NSQVRDSF9QQURfNQkJCTB4NjgKKyNkZWZpbmUgTVNHVV9IT1NUX1NDUkFUQ0hfUEFEXzYJCQkweDZDCisjZGVmaW5lIE1TR1VfSE9TVF9TQ1JBVENIX1BBRF83CQkJMHg3MAorI2RlZmluZSBNU0dVX09ETVIJCQkJMHg3NC8qIFJldkIgKi8KKworLyogYml0IGRlZmluaXRpb24gZm9yIE9ETVIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT0RNUl9NQVNLX0FMTAkJCQkweEZGRkZGRkZGLyogbWFzayBhbGwKKwkJCQkJaW50ZXJydXB0IHZlY3RvciAqLworI2RlZmluZSBPRE1SX0NMRUFSX0FMTAkJCQkwLyogY2xlYXIgYWxsCisJCQkJCWludGVycnVwdCB2ZWN0b3IgKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBPRENSIHJlZ2lzdGVyICovCisjZGVmaW5lIE9EQ1JfQ0xFQVJfQUxMCQkweEZGRkZGRkZGICAgLyogbWFzayBhbGwKKwkJCQkJaW50ZXJydXB0IHZlY3RvciovCisvKiBNU0lYIEludGVydXB0cyAqLworI2RlZmluZSBNU0lYX1RBQkxFX09GRlNFVAkJMHgyMDAwCisjZGVmaW5lIE1TSVhfVEFCTEVfRUxFTUVOVF9TSVpFCQkweDEwCisjZGVmaW5lIE1TSVhfSU5URVJSVVBUX0NPTlRST0xfT0ZGU0VUCTB4QworI2RlZmluZSBNU0lYX1RBQkxFX0JBU0UJICAoTVNJWF9UQUJMRV9PRkZTRVQgKyBNU0lYX0lOVEVSUlVQVF9DT05UUk9MX09GRlNFVCkKKyNkZWZpbmUgTVNJWF9JTlRFUlJVUFRfRElTQUJMRQkJMHgxCisjZGVmaW5lIE1TSVhfSU5URVJSVVBUX0VOQUJMRQkJMHgwCisKKworLyogc3RhdGUgZGVmaW5pdGlvbiBmb3IgU2NyYXRjaCBQYWQxIHJlZ2lzdGVyICovCisjZGVmaW5lIFNDUkFUQ0hfUEFEMV9QT1IJCTB4MDAgIC8qIHBvd2VyIG9uIHJlc2V0IHN0YXRlICovCisjZGVmaW5lIFNDUkFUQ0hfUEFEMV9TRlIJCTB4MDEgIC8qIHNvZnQgcmVzZXQgc3RhdGUgKi8KKyNkZWZpbmUgU0NSQVRDSF9QQUQxX0VSUgkJMHgwMiAgLyogZXJyb3Igc3RhdGUgKi8KKyNkZWZpbmUgU0NSQVRDSF9QQUQxX1JEWQkJMHgwMyAgLyogcmVhZHkgc3RhdGUgKi8KKyNkZWZpbmUgU0NSQVRDSF9QQUQxX1JTVAkJMHgwNCAgLyogc29mdCByZXNldCB0b2dnbGUgZmxhZyAqLworI2RlZmluZSBTQ1JBVENIX1BBRDFfQUFQMVJEWV9SU1QJMHgwOCAgLyogQUFQMSByZWFkeSBmb3Igc29mdCByZXNldCAqLworI2RlZmluZSBTQ1JBVENIX1BBRDFfU1RBVEVfTUFTSwkJMHhGRkZGRkZGMCAgIC8qIFNjcmF0Y2hQYWQxCisgTWFzaywgYml0MS0wIFN0YXRlLCBiaXQyIFNvZnQgUmVzZXQsIGJpdDMgRlcgUkRZIGZvciBTb2Z0IFJlc2V0ICovCisjZGVmaW5lIFNDUkFUQ0hfUEFEMV9SRVNFUlZFRAkJMHgwMDAwMDNGOCAgIC8qIFNjcmF0Y2ggUGFkMQorIFJlc2VydmVkIGJpdCAzIHRvIDkgKi8KKworIC8qIHN0YXRlIGRlZmluaXRpb24gZm9yIFNjcmF0Y2ggUGFkMiByZWdpc3RlciAqLworI2RlZmluZSBTQ1JBVENIX1BBRDJfUE9SCQkweDAwICAvKiBwb3dlciBvbiBzdGF0ZSAqLworI2RlZmluZSBTQ1JBVENIX1BBRDJfU0ZSCQkweDAxICAvKiBzb2Z0IHJlc2V0IHN0YXRlICovCisjZGVmaW5lIFNDUkFUQ0hfUEFEMl9FUlIJCTB4MDIgIC8qIGVycm9yIHN0YXRlICovCisjZGVmaW5lIFNDUkFUQ0hfUEFEMl9SRFkJCTB4MDMgIC8qIHJlYWR5IHN0YXRlICovCisjZGVmaW5lIFNDUkFUQ0hfUEFEMl9GV1JEWV9SU1QJCTB4MDQgIC8qIEZXIHJlYWR5IGZvciBzb2Z0IHJlc2V0IGZsYWcqLworI2RlZmluZSBTQ1JBVENIX1BBRDJfSU9QUkRZX1JTVAkJMHgwOCAgLyogSU9QIHJlYWR5IGZvciBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIFNDUkFUQ0hfUEFEMl9TVEFURV9NQVNLCQkweEZGRkZGRkY0IC8qIFNjcmF0Y2hQYWQgMgorIE1hc2ssIGJpdDEtMCBTdGF0ZSAqLworI2RlZmluZSBTQ1JBVENIX1BBRDJfUkVTRVJWRUQJCTB4MDAwMDAzRkMgICAvKiBTY3JhdGNoIFBhZDEKKyBSZXNlcnZlZCBiaXQgMiB0byA5ICovCisKKyNkZWZpbmUgU0NSQVRDSF9QQURfRVJST1JfTUFTSwkJMHhGRkZGRkMwMCAgIC8qIEVycm9yIG1hc2sgYml0cyAqLworI2RlZmluZSBTQ1JBVENIX1BBRF9TVEFURV9NQVNLCQkweDAwMDAwMDAzICAgLyogU3RhdGUgTWFzayBiaXRzICovCisKKy8qIG1haW4gY29uZmlndXJhdGlvbiBvZmZzZXQgLSBieXRlIG9mZnNldCAqLworI2RlZmluZSBNQUlOX1NJR05BVFVSRV9PRkZTRVQJCTB4MDAvKiBEV09SRCAweDAwICovCisjZGVmaW5lIE1BSU5fSU5URVJGQUNFX1JFVklTSU9OCQkweDA0LyogRFdPUkQgMHgwMSAqLworI2RlZmluZSBNQUlOX0ZXX1JFVklTSU9OCQkweDA4LyogRFdPUkQgMHgwMiAqLworI2RlZmluZSBNQUlOX01BWF9PVVRTVEFORElOR19JT19PRkZTRVQJMHgwQy8qIERXT1JEIDB4MDMgKi8KKyNkZWZpbmUgTUFJTl9NQVhfU0dMX09GRlNFVAkJMHgxMC8qIERXT1JEIDB4MDQgKi8KKyNkZWZpbmUgTUFJTl9DTlRSTF9DQVBfT0ZGU0VUCQkweDE0LyogRFdPUkQgMHgwNSAqLworI2RlZmluZSBNQUlOX0dTVF9PRkZTRVQJCQkweDE4LyogRFdPUkQgMHgwNiAqLworI2RlZmluZSBNQUlOX0lCUV9PRkZTRVQJCQkweDFDLyogRFdPUkQgMHgwNyAqLworI2RlZmluZSBNQUlOX09CUV9PRkZTRVQJCQkweDIwLyogRFdPUkQgMHgwOCAqLworI2RlZmluZSBNQUlOX0lRTlBQRF9IUFBEX09GRlNFVAkJMHgyNC8qIERXT1JEIDB4MDkgKi8KKyNkZWZpbmUgTUFJTl9PQl9IV19FVkVOVF9QSUQwM19PRkZTRVQJMHgyOC8qIERXT1JEIDB4MEEgKi8KKyNkZWZpbmUgTUFJTl9PQl9IV19FVkVOVF9QSUQ0N19PRkZTRVQJMHgyQy8qIERXT1JEIDB4MEIgKi8KKyNkZWZpbmUgTUFJTl9PQl9OQ1FfRVZFTlRfUElEMDNfT0ZGU0VUCTB4MzAvKiBEV09SRCAweDBDICovCisjZGVmaW5lIE1BSU5fT0JfTkNRX0VWRU5UX1BJRDQ3X09GRlNFVAkweDM0LyogRFdPUkQgMHgwRCAqLworI2RlZmluZSBNQUlOX1RJVE5YX0VWRU5UX1BJRDAzX09GRlNFVAkweDM4LyogRFdPUkQgMHgwRSAqLworI2RlZmluZSBNQUlOX1RJVE5YX0VWRU5UX1BJRDQ3X09GRlNFVAkweDNDLyogRFdPUkQgMHgwRiAqLworI2RlZmluZSBNQUlOX09CX1NTUF9FVkVOVF9QSUQwM19PRkZTRVQJMHg0MC8qIERXT1JEIDB4MTAgKi8KKyNkZWZpbmUgTUFJTl9PQl9TU1BfRVZFTlRfUElENDdfT0ZGU0VUCTB4NDQvKiBEV09SRCAweDExICovCisjZGVmaW5lIE1BSU5fT0JfU01QX0VWRU5UX1BJRDAzX09GRlNFVAkweDQ4LyogRFdPUkQgMHgxMiAqLworI2RlZmluZSBNQUlOX09CX1NNUF9FVkVOVF9QSUQ0N19PRkZTRVQJMHg0Qy8qIERXT1JEIDB4MTMgKi8KKyNkZWZpbmUgTUFJTl9FVkVOVF9MT0dfQUREUl9ISQkJMHg1MC8qIERXT1JEIDB4MTQgKi8KKyNkZWZpbmUgTUFJTl9FVkVOVF9MT0dfQUREUl9MTwkJMHg1NC8qIERXT1JEIDB4MTUgKi8KKyNkZWZpbmUgTUFJTl9FVkVOVF9MT0dfQlVGRl9TSVpFCTB4NTgvKiBEV09SRCAweDE2ICovCisjZGVmaW5lIE1BSU5fRVZFTlRfTE9HX09QVElPTgkJMHg1Qy8qIERXT1JEIDB4MTcgKi8KKyNkZWZpbmUgTUFJTl9JT1BfRVZFTlRfTE9HX0FERFJfSEkJMHg2MC8qIERXT1JEIDB4MTggKi8KKyNkZWZpbmUgTUFJTl9JT1BfRVZFTlRfTE9HX0FERFJfTE8JMHg2NC8qIERXT1JEIDB4MTkgKi8KKyNkZWZpbmUgTUFJTl9JT1BfRVZFTlRfTE9HX0JVRkZfU0laRQkweDY4LyogRFdPUkQgMHgxQSAqLworI2RlZmluZSBNQUlOX0lPUF9FVkVOVF9MT0dfT1BUSU9OCTB4NkMvKiBEV09SRCAweDFCICovCisjZGVmaW5lIE1BSU5fRkFUQUxfRVJST1JfSU5URVJSVVBUCTB4NzAvKiBEV09SRCAweDFDICovCisjZGVmaW5lIE1BSU5fRkFUQUxfRVJST1JfUkRVTVAwX09GRlNFVAkweDc0LyogRFdPUkQgMHgxRCAqLworI2RlZmluZSBNQUlOX0ZBVEFMX0VSUk9SX1JEVU1QMF9MRU5HVEgJMHg3OC8qIERXT1JEIDB4MUUgKi8KKyNkZWZpbmUgTUFJTl9GQVRBTF9FUlJPUl9SRFVNUDFfT0ZGU0VUCTB4N0MvKiBEV09SRCAweDFGICovCisjZGVmaW5lIE1BSU5fRkFUQUxfRVJST1JfUkRVTVAxX0xFTkdUSAkweDgwLyogRFdPUkQgMHgyMCAqLworI2RlZmluZSBNQUlOX0hEQV9GTEFHU19PRkZTRVQJCTB4ODQvKiBEV09SRCAweDIxICovCisjZGVmaW5lIE1BSU5fQU5BTE9HX1NFVFVQX09GRlNFVAkweDg4LyogRFdPUkQgMHgyMiAqLworCisvKiBHZXJlcmFsIFN0YXR1cyBUYWJsZSBvZmZzZXQgLSBieXRlIG9mZnNldCAqLworI2RlZmluZSBHU1RfR1NUTEVOX01QSVNfT0ZGU0VUCQkweDAwCisjZGVmaW5lIEdTVF9JUV9GUkVFWkVfU1RBVEUwX09GRlNFVAkweDA0CisjZGVmaW5lIEdTVF9JUV9GUkVFWkVfU1RBVEUxX09GRlNFVAkweDA4CisjZGVmaW5lIEdTVF9NU0dVVENOVF9PRkZTRVQJCTB4MEMKKyNkZWZpbmUgR1NUX0lPUFRDTlRfT0ZGU0VUCQkweDEwCisjZGVmaW5lIEdTVF9QSFlTVEFURV9PRkZTRVQJCTB4MTgKKyNkZWZpbmUgR1NUX1BIWVNUQVRFMF9PRkZTRVQJCTB4MTgKKyNkZWZpbmUgR1NUX1BIWVNUQVRFMV9PRkZTRVQJCTB4MUMKKyNkZWZpbmUgR1NUX1BIWVNUQVRFMl9PRkZTRVQJCTB4MjAKKyNkZWZpbmUgR1NUX1BIWVNUQVRFM19PRkZTRVQJCTB4MjQKKyNkZWZpbmUgR1NUX1BIWVNUQVRFNF9PRkZTRVQJCTB4MjgKKyNkZWZpbmUgR1NUX1BIWVNUQVRFNV9PRkZTRVQJCTB4MkMKKyNkZWZpbmUgR1NUX1BIWVNUQVRFNl9PRkZTRVQJCTB4MzAKKyNkZWZpbmUgR1NUX1BIWVNUQVRFN19PRkZTRVQJCTB4MzQKKyNkZWZpbmUgR1NUX1JFUlJJTkZPX09GRlNFVAkJMHg0NAorCisvKiBHZW5lcmFsIFN0YXR1cyBUYWJsZSAtIE1QSSBzdGF0ZSAqLworI2RlZmluZSBHU1RfTVBJX1NUQVRFX1VOSU5JVAkJMHgwMAorI2RlZmluZSBHU1RfTVBJX1NUQVRFX0lOSVQJCTB4MDEKKyNkZWZpbmUgR1NUX01QSV9TVEFURV9URVJNSU5BVElPTgkweDAyCisjZGVmaW5lIEdTVF9NUElfU1RBVEVfRVJST1IJCTB4MDMKKyNkZWZpbmUgR1NUX01QSV9TVEFURV9NQVNLCQkweDA3CisKKyNkZWZpbmUgTUJJQ19OTUlfRU5BQkxFX1ZQRTBfSU9QCTB4MDAwNDE4CisjZGVmaW5lIE1CSUNfTk1JX0VOQUJMRV9WUEUwX0FBUDEJMHgwMDA0MTgKKy8qIFBDSUUgcmVnaXN0ZXJzIC0gQkFSMigweDE4KSwgQkFSMSh3aW4pIDB4MDEwMDAwICovCisjZGVmaW5lIFBDSUVfRVZFTlRfSU5URVJSVVBUX0VOQUJMRQkweDAwMzA0MAorI2RlZmluZSBQQ0lFX0VWRU5UX0lOVEVSUlVQVAkJMHgwMDMwNDQKKyNkZWZpbmUgUENJRV9FUlJPUl9JTlRFUlJVUFRfRU5BQkxFCTB4MDAzMDQ4CisjZGVmaW5lIFBDSUVfRVJST1JfSU5URVJSVVBUCQkweDAwMzA0QworLyogc2lnbmF0dXJlIGRlZmludGlvbiBmb3IgaG9zdCBzY3JhdGNoIHBhZDAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BDX1NPRlRfUkVTRVRfU0lHTkFUVVJFCTB4MjUyYWNiY2QKKy8qIFNpZ25hdHVyZSBmb3IgU29mdCBSZXNldCAqLworCisvKiBTUEMgUmVzZXQgcmVnaXN0ZXIgLSBCQVI0KDB4MjApLCBCQVIyKHdpbikgKG5lZWQgZHluYW1pYyBtYXBwaW5nKSAqLworI2RlZmluZSBTUENfUkVHX1JFU0VUCQkJMHgwMDAwMDAvKiByZXNldCByZWdpc3RlciAqLworCisvKiBiaXQgZGlmaW5hdGlvbiBmb3IgU1BDX1JFU0VUIHJlZ2lzdGVyICovCisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9PU1NQCQkweDAwMDAwMDAxCisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9SQUFFCQkweDAwMDAwMDAyCisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9QQ1NfU1BCQwkweDAwMDAwMDA0CisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9QQ1NfSU9QX1NTCTB4MDAwMDAwMDgKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX1BDU19BQVAxX1NTCTB4MDAwMDAwMTAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX1BDU19BQVAyX1NTCTB4MDAwMDAwMjAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX1BDU19MTQkJMHgwMDAwMDA0MAorI2RlZmluZSAgIFNQQ19SRUdfUkVTRVRfUENTCQkweDAwMDAwMDgwCisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9HU00JCTB4MDAwMDAxMDAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX0REUjIJCTB4MDAwMTAwMDAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX0JETUFfQ09SRQkweDAwMDIwMDAwCisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9CRE1BX1NYQ0JJCTB4MDAwNDAwMDAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX1BDSUVfQUxfU1hDQkkJMHgwMDA4MDAwMAorI2RlZmluZSAgIFNQQ19SRUdfUkVTRVRfUENJRV9QV1IJMHgwMDEwMDAwMAorI2RlZmluZSAgIFNQQ19SRUdfUkVTRVRfUENJRV9TRlQJMHgwMDIwMDAwMAorI2RlZmluZSAgIFNQQ19SRUdfUkVTRVRfUENTX1NYQ0JJCTB4MDA0MDAwMDAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX0xNU19TWENCSQkweDAwODAwMDAwCisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9QTUlDX1NYQ0JJCTB4MDEwMDAwMDAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX1BNSUNfQ09SRQkweDAyMDAwMDAwCisjZGVmaW5lICAgU1BDX1JFR19SRVNFVF9QQ0lFX1BDX1NYQ0JJCTB4MDQwMDAwMDAKKyNkZWZpbmUgICBTUENfUkVHX1JFU0VUX0RFVklDRQkJMHg4MDAwMDAwMAorCisvKiByZWdpc3RlcnMgZm9yIEJBUiBTaGlmdGluZyAtIEJBUjIoMHgxOCksIEJBUjEod2luKSAqLworI2RlZmluZSBTUENfSUJXX0FYSV9UUkFOU0xBVElPTl9MT1cJMHgwMDMyNTgKKworI2RlZmluZSBNQklDX0FBUDFfQUREUl9CQVNFCQkweDA2MDAwMAorI2RlZmluZSBNQklDX0lPUF9BRERSX0JBU0UJCTB4MDcwMDAwCisjZGVmaW5lIEdTTV9BRERSX0JBU0UJCQkweDA3MDAwMDAKKy8qIER5bmFtaWMgbWFwIHRocm91Z2ggQmFyNCAtIDB4MDA3MDAwMDAgKi8KKyNkZWZpbmUgR1NNX0NPTkZJR19SRVNFVAkJMHgwMDAwMDAwMAorI2RlZmluZSBSQU1fRUNDX0RCX0VSUgkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgR1NNX1JFQURfQUREUl9QQVJJVFlfSU5ESUMJMHgwMDAwMDA1OAorI2RlZmluZSBHU01fV1JJVEVfQUREUl9QQVJJVFlfSU5ESUMJMHgwMDAwMDA2MAorI2RlZmluZSBHU01fV1JJVEVfREFUQV9QQVJJVFlfSU5ESUMJMHgwMDAwMDA2OAorI2RlZmluZSBHU01fUkVBRF9BRERSX1BBUklUWV9DSEVDSwkweDAwMDAwMDM4CisjZGVmaW5lIEdTTV9XUklURV9BRERSX1BBUklUWV9DSEVDSwkweDAwMDAwMDQwCisjZGVmaW5lIEdTTV9XUklURV9EQVRBX1BBUklUWV9DSEVDSwkweDAwMDAwMDQ4CisKKyNkZWZpbmUgUkI2X0FDQ0VTU19SRUcJCQkweDZBMDAwMAorI2RlZmluZSBIREFDX0VYRUNfQ01ECQkJMHgwMDAyCisjZGVmaW5lIEhEQV9DX1BBCQkJMHhjYgorI2RlZmluZSBIREFfU0VRX0lEX0JJVFMJCQkweDAwZmYwMDAwCisjZGVmaW5lIEhEQV9HU01fT0ZGU0VUX0JJVFMJCTB4MDBGRkZGRkYKKyNkZWZpbmUgTUJJQ19BQVAxX0FERFJfQkFTRQkJMHgwNjAwMDAKKyNkZWZpbmUgTUJJQ19JT1BfQUREUl9CQVNFCQkweDA3MDAwMAorI2RlZmluZSBHU01fQUREUl9CQVNFCQkJMHgwNzAwMDAwCisjZGVmaW5lIFNQQ19UT1BfTEVWRUxfQUREUl9CQVNFCQkweDAwMDAwMAorI2RlZmluZSBHU01fQ09ORklHX1JFU0VUX1ZBTFVFICAgICAgICAgIDB4MDAwMDNiMDAKKyNkZWZpbmUgR1BJT19BRERSX0JBU0UgICAgICAgICAgICAgICAgICAweDAwMDkwMDAwCisjZGVmaW5lIEdQSU9fR1BJT18wXzBVVFBVVF9DVExfT0ZGU0VUICAgMHgwMDAwMDEwYworCisvKiBSQjYgb2Zmc2V0ICovCisjZGVmaW5lIFNQQ19SQjZfT0ZGU0VUCQkJMHg4MEMwCisvKiBNYWdpYyBudW1iZXIgb2YgIHNvZnQgcmVzZXQgZm9yIFJCNiAqLworI2RlZmluZSBSQjZfTUFHSUNfTlVNQkVSX1JTVAkJMHgxMjM0CisKKy8qIERldmljZSBSZWdpc3RlciBzdGF0dXMgKi8KKyNkZWZpbmUgREVWUkVHX1NVQ0NFU1MJCQkJCTB4MDAKKyNkZWZpbmUgREVWUkVHX0ZBSUxVUkVfT1VUX09GX1JFU09VUkNFCQkJMHgwMQorI2RlZmluZSBERVZSRUdfRkFJTFVSRV9ERVZJQ0VfQUxSRUFEWV9SRUdJU1RFUkVECTB4MDIKKyNkZWZpbmUgREVWUkVHX0ZBSUxVUkVfSU5WQUxJRF9QSFlfSUQJCQkweDAzCisjZGVmaW5lIERFVlJFR19GQUlMVVJFX1BIWV9JRF9BTFJFQURZX1JFR0lTVEVSRUQJMHgwNAorI2RlZmluZSBERVZSRUdfRkFJTFVSRV9QT1JUX0lEX09VVF9PRl9SQU5HRQkJMHgwNQorI2RlZmluZSBERVZSRUdfRkFJTFVSRV9QT1JUX05PVF9WQUxJRF9TVEFURQkJMHgwNgorI2RlZmluZSBERVZSRUdfRkFJTFVSRV9ERVZJQ0VfVFlQRV9OT1RfVkFMSUQJCTB4MDcKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmViZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jCkBAIC0wLDAgKzEsODkxIEBACisvKgorICogUE1DLVNpZXJyYSBTUEMgODAwMSBTQVMvU0FUQSBiYXNlZCBob3N0IGFkYXB0ZXJzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFVTSSBDby4sIEx0ZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKworI2luY2x1ZGUgInBtODAwMV9zYXMuaCIKKyNpbmNsdWRlICJwbTgwMDFfY2hpcHMuaCIKKworc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqcG04MDAxX3N0dDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbTgwMDFfY2hpcF9pbmZvIHBtODAwMV9jaGlwc1tdID0geworCVtjaGlwXzgwMDFdID0geyAgOCwgJnBtODAwMV84MDAxX2Rpc3BhdGNoLH0sCit9Oworc3RhdGljIGludCBwbTgwMDFfaWQ7CisKK0xJU1RfSEVBRChoYmFfbGlzdCk7CisKKy8qKgorICogVGhlIG1haW4gc3RydWN0dXJlIHdoaWNoIExMREQgbXVzdCByZWdpc3RlciBmb3Igc2NzaSBjb3JlLgorICovCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwbTgwMDFfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkucXVldWVjb21tYW5kCQk9IHNhc19xdWV1ZWNvbW1hbmQsCisJLnRhcmdldF9hbGxvYwkJPSBzYXNfdGFyZ2V0X2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUJPSBwbTgwMDFfc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9kZXN0cm95CQk9IHNhc19zbGF2ZV9kZXN0cm95LAorCS5zY2FuX2ZpbmlzaGVkCQk9IHBtODAwMV9zY2FuX2ZpbmlzaGVkLAorCS5zY2FuX3N0YXJ0CQk9IHBtODAwMV9zY2FuX3N0YXJ0LAorCS5jaGFuZ2VfcXVldWVfZGVwdGgJPSBzYXNfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5jaGFuZ2VfcXVldWVfdHlwZQk9IHNhc19jaGFuZ2VfcXVldWVfdHlwZSwKKwkuYmlvc19wYXJhbQkJPSBzYXNfYmlvc19wYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IDEsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLm1heF9zZWN0b3JzCQk9IFNDU0lfREVGQVVMVF9NQVhfU0VDVE9SUywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gc2FzX2VoX2RldmljZV9yZXNldF9oYW5kbGVyLAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHNhc19laF9idXNfcmVzZXRfaGFuZGxlciwKKwkuc2xhdmVfYWxsb2MJCT0gcG04MDAxX3NsYXZlX2FsbG9jLAorCS50YXJnZXRfZGVzdHJveQkJPSBzYXNfdGFyZ2V0X2Rlc3Ryb3ksCisJLmlvY3RsCQkJPSBzYXNfaW9jdGwsCisJLnNob3N0X2F0dHJzCQk9IHBtODAwMV9ob3N0X2F0dHJzLAorfTsKKworLyoqCisgKiBTYXMgbGF5ZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgc3BlY2lmaWMgdGFzay4KKyAqLworc3RhdGljIHN0cnVjdCBzYXNfZG9tYWluX2Z1bmN0aW9uX3RlbXBsYXRlIHBtODAwMV90cmFuc3BvcnRfb3BzID0geworCS5sbGRkX2Rldl9mb3VuZAkJPSBwbTgwMDFfZGV2X2ZvdW5kLAorCS5sbGRkX2Rldl9nb25lCQk9IHBtODAwMV9kZXZfZ29uZSwKKworCS5sbGRkX2V4ZWN1dGVfdGFzawk9IHBtODAwMV9xdWV1ZV9jb21tYW5kLAorCS5sbGRkX2NvbnRyb2xfcGh5CT0gcG04MDAxX3BoeV9jb250cm9sLAorCisJLmxsZGRfYWJvcnRfdGFzawk9IHBtODAwMV9hYm9ydF90YXNrLAorCS5sbGRkX2Fib3J0X3Rhc2tfc2V0CT0gcG04MDAxX2Fib3J0X3Rhc2tfc2V0LAorCS5sbGRkX2NsZWFyX2FjYQkJPSBwbTgwMDFfY2xlYXJfYWNhLAorCS5sbGRkX2NsZWFyX3Rhc2tfc2V0CT0gcG04MDAxX2NsZWFyX3Rhc2tfc2V0LAorCS5sbGRkX0lfVF9uZXh1c19yZXNldCAgID0gcG04MDAxX0lfVF9uZXh1c19yZXNldCwKKwkubGxkZF9sdV9yZXNldAkJPSBwbTgwMDFfbHVfcmVzZXQsCisJLmxsZGRfcXVlcnlfdGFzawk9IHBtODAwMV9xdWVyeV90YXNrLAorfTsKKworLyoqCisgKnBtODAwMV9waHlfaW5pdCAtIGluaXRpYXRlIG91ciBhZGFwdGVyIHBoeXMKKyAqQHBtODAwMV9oYTogb3VyIGhiYSBzdHJ1Y3R1cmUuCisgKkBwaHlfaWQ6IHBoeSBpZC4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBtODAwMV9waHlfaW5pdChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJaW50IHBoeV9pZCkKK3sKKwlzdHJ1Y3QgcG04MDAxX3BoeSAqcGh5ID0gJnBtODAwMV9oYS0+cGh5W3BoeV9pZF07CisJc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5ID0gJnBoeS0+c2FzX3BoeTsKKwlwaHktPnBoeV9zdGF0ZSA9IDA7CisJcGh5LT5wbTgwMDFfaGEgPSBwbTgwMDFfaGE7CisJc2FzX3BoeS0+ZW5hYmxlZCA9IChwaHlfaWQgPCBwbTgwMDFfaGEtPmNoaXAtPm5fcGh5KSA/IDEgOiAwOworCXNhc19waHktPmNsYXNzID0gU0FTOworCXNhc19waHktPmlwcm90byA9IFNBU19QUk9UT0NPTF9BTEw7CisJc2FzX3BoeS0+dHByb3RvID0gMDsKKwlzYXNfcGh5LT50eXBlID0gUEhZX1RZUEVfUEhZU0lDQUw7CisJc2FzX3BoeS0+cm9sZSA9IFBIWV9ST0xFX0lOSVRJQVRPUjsKKwlzYXNfcGh5LT5vb2JfbW9kZSA9IE9PQl9OT1RfQ09OTkVDVEVEOworCXNhc19waHktPmxpbmtyYXRlID0gU0FTX0xJTktfUkFURV9VTktOT1dOOworCXNhc19waHktPmlkID0gcGh5X2lkOworCXNhc19waHktPnNhc19hZGRyID0gJnBtODAwMV9oYS0+c2FzX2FkZHJbMF07CisJc2FzX3BoeS0+ZnJhbWVfcmN2ZCA9ICZwaHktPmZyYW1lX3JjdmRbMF07CisJc2FzX3BoeS0+aGEgPSAoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKilwbTgwMDFfaGEtPnNob3N0LT5ob3N0ZGF0YTsKKwlzYXNfcGh5LT5sbGRkX3BoeSA9IHBoeTsKK30KKworLyoqCisgKnBtODAwMV9mcmVlIC0gZnJlZSBoYmEKKyAqQHBtODAwMV9oYToJb3VyIGhiYSBzdHJ1Y3R1cmUuCisgKgorICovCitzdGF0aWMgdm9pZCBwbTgwMDFfZnJlZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJaW50IGk7CisJc3RydWN0IHBtODAwMV93cSAqd3E7CisKKwlpZiAoIXBtODAwMV9oYSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IFVTSV9NQVhfTUVNQ05UOyBpKyspIHsKKwkJaWYgKHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltpXS52aXJ0X3B0ciAhPSBOVUxMKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBtODAwMV9oYS0+cGRldiwKKwkJCQlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25baV0uZWxlbWVudF9zaXplLAorCQkJCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltpXS52aXJ0X3B0ciwKKwkJCQlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25baV0ucGh5c19hZGRyKTsKKwkJCX0KKwl9CisJUE04MDAxX0NISVBfRElTUC0+Y2hpcF9pb3VubWFwKHBtODAwMV9oYSk7CisJaWYgKHBtODAwMV9oYS0+c2hvc3QpCisJCXNjc2lfaG9zdF9wdXQocG04MDAxX2hhLT5zaG9zdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3cSwgJnBtODAwMV9oYS0+d3FfbGlzdCwgZW50cnkpCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJndxLT53b3JrX3EpOworCWtmcmVlKHBtODAwMV9oYS0+dGFncyk7CisJa2ZyZWUocG04MDAxX2hhKTsKK30KKworI2lmZGVmIFBNODAwMV9VU0VfVEFTS0xFVAorc3RhdGljIHZvaWQgcG04MDAxX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBvcGFxdWUpCit7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhOworCXBtODAwMV9oYSA9IChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICopb3BhcXVlOzsKKwlpZiAodW5saWtlbHkoIXBtODAwMV9oYSkpCisJCUJVR19PTigxKTsKKwlQTTgwMDFfQ0hJUF9ESVNQLT5pc3IocG04MDAxX2hhKTsKK30KKyNlbmRpZgorCisKKyAvKioKKyAgKiBwbTgwMDFfaW50ZXJydXB0IC0gd2hlbiBIQkEgb3JpZ2luYXRlIGEgaW50ZXJydXB0LHdlIHNob3VsZCBpbnZva2UgdGhpcworICAqIGRpc3BhdGNoZXIgdG8gaGFuZGxlIGVhY2ggY2FzZS4KKyAgKiBAaXJxOiBpcnEgbnVtYmVyLgorICAqIEBvcGFxdWU6IHRoZSBwYXNzZWQgZ2VuZXJhbCBob3N0IGFkYXB0ZXIgc3RydWN0CisgICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcG04MDAxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpvcGFxdWUpCit7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhOworCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBvcGFxdWU7CisJcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCWlmICh1bmxpa2VseSghcG04MDAxX2hhKSkKKwkJcmV0dXJuIElSUV9OT05FOworCWlmICghUE04MDAxX0NISVBfRElTUC0+aXNfb3VyX2ludGVydXB0KHBtODAwMV9oYSkpCisJCXJldHVybiBJUlFfTk9ORTsKKyNpZmRlZiBQTTgwMDFfVVNFX1RBU0tMRVQKKwl0YXNrbGV0X3NjaGVkdWxlKCZwbTgwMDFfaGEtPnRhc2tsZXQpOworI2Vsc2UKKwlyZXQgPSBQTTgwMDFfQ0hJUF9ESVNQLT5pc3IocG04MDAxX2hhKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcG04MDAxX2FsbG9jIC0gaW5pdGlhdGUgb3VyIGhiYSBzdHJ1Y3R1cmUgYW5kIDYgRE1BcyBhcmVhLgorICogQHBtODAwMV9oYTpvdXIgaGJhIHN0cnVjdHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHBtODAwMV9hbGxvYyhzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJaW50IGk7CisJc3Bpbl9sb2NrX2luaXQoJnBtODAwMV9oYS0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IHBtODAwMV9oYS0+Y2hpcC0+bl9waHk7IGkrKykKKwkJcG04MDAxX3BoeV9pbml0KHBtODAwMV9oYSwgaSk7CisKKwlwbTgwMDFfaGEtPnRhZ3MgPSBremFsbG9jKFBNODAwMV9NQVhfQ0NCLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtODAwMV9oYS0+dGFncykKKwkJZ290byBlcnJfb3V0OworCS8qIE1QSSBNZW1vcnkgcmVnaW9uIDEgZm9yIEFBUCBFdmVudCBMb2cgZm9yIGZ3ICovCisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0FBUDFdLm51bV9lbGVtZW50cyA9IDE7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0FBUDFdLmVsZW1lbnRfc2l6ZSA9IFBNODAwMV9FVkVOVF9MT0dfU0laRTsKKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bQUFQMV0udG90YWxfbGVuID0gUE04MDAxX0VWRU5UX0xPR19TSVpFOworCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltBQVAxXS5hbGlnbm1lbnQgPSAzMjsKKworCS8qIE1QSSBNZW1vcnkgcmVnaW9uIDIgZm9yIElPUCBFdmVudCBMb2cgZm9yIGZ3ICovCisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lPUF0ubnVtX2VsZW1lbnRzID0gMTsKKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bSU9QXS5lbGVtZW50X3NpemUgPSBQTTgwMDFfRVZFTlRfTE9HX1NJWkU7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lPUF0udG90YWxfbGVuID0gUE04MDAxX0VWRU5UX0xPR19TSVpFOworCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltJT1BdLmFsaWdubWVudCA9IDMyOworCisJLyogTVBJIE1lbW9yeSByZWdpb24gMyBmb3IgY29uc3VtZXIgSW5kZXggb2YgaW5ib3VuZCBxdWV1ZXMgKi8KKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bQ0ldLm51bV9lbGVtZW50cyA9IDE7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0NJXS5lbGVtZW50X3NpemUgPSA0OworCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltDSV0udG90YWxfbGVuID0gNDsKKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bQ0ldLmFsaWdubWVudCA9IDQ7CisKKwkvKiBNUEkgTWVtb3J5IHJlZ2lvbiA0IGZvciBwcm9kdWNlciBJbmRleCBvZiBvdXRib3VuZCBxdWV1ZXMgKi8KKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bUEldLm51bV9lbGVtZW50cyA9IDE7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW1BJXS5lbGVtZW50X3NpemUgPSA0OworCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltQSV0udG90YWxfbGVuID0gNDsKKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bUEldLmFsaWdubWVudCA9IDQ7CisKKwkvKiBNUEkgTWVtb3J5IHJlZ2lvbiA1IGluYm91bmQgcXVldWVzICovCisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lCXS5udW1fZWxlbWVudHMgPSAyNTY7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0lCXS5lbGVtZW50X3NpemUgPSA2NDsKKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bSUJdLnRvdGFsX2xlbiA9IDI1NiAqIDY0OworCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltJQl0uYWxpZ25tZW50ID0gNjQ7CisKKwkvKiBNUEkgTWVtb3J5IHJlZ2lvbiA2IGluYm91bmQgcXVldWVzICovCisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW09CXS5udW1fZWxlbWVudHMgPSAyNTY7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW09CXS5lbGVtZW50X3NpemUgPSA2NDsKKwlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25bT0JdLnRvdGFsX2xlbiA9IDI1NiAqIDY0OworCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltPQl0uYWxpZ25tZW50ID0gNjQ7CisKKwkvKiBNZW1vcnkgcmVnaW9uIHdyaXRlIERNQSovCisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLm51bV9lbGVtZW50cyA9IDE7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLmVsZW1lbnRfc2l6ZSA9IDQwOTY7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW05WTURdLnRvdGFsX2xlbiA9IDQwOTY7CisJLyogTWVtb3J5IHJlZ2lvbiBmb3IgZGV2aWNlcyovCisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0RFVl9NRU1dLm51bV9lbGVtZW50cyA9IDE7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0RFVl9NRU1dLmVsZW1lbnRfc2l6ZSA9IFBNODAwMV9NQVhfREVWSUNFUyAqCisJCXNpemVvZihzdHJ1Y3QgcG04MDAxX2RldmljZSk7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0RFVl9NRU1dLnRvdGFsX2xlbiA9IFBNODAwMV9NQVhfREVWSUNFUyAqCisJCXNpemVvZihzdHJ1Y3QgcG04MDAxX2RldmljZSk7CisKKwkvKiBNZW1vcnkgcmVnaW9uIGZvciBjY2JfaW5mbyovCisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0NDQl9NRU1dLm51bV9lbGVtZW50cyA9IDE7CisJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0NDQl9NRU1dLmVsZW1lbnRfc2l6ZSA9IFBNODAwMV9NQVhfQ0NCICoKKwkJc2l6ZW9mKHN0cnVjdCBwbTgwMDFfY2NiX2luZm8pOworCXBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltDQ0JfTUVNXS50b3RhbF9sZW4gPSBQTTgwMDFfTUFYX0NDQiAqCisJCXNpemVvZihzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvKTsKKworCWZvciAoaSA9IDA7IGkgPCBVU0lfTUFYX01FTUNOVDsgaSsrKSB7CisJCWlmIChwbTgwMDFfbWVtX2FsbG9jKHBtODAwMV9oYS0+cGRldiwKKwkJCSZwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25baV0udmlydF9wdHIsCisJCQkmcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW2ldLnBoeXNfYWRkciwKKwkJCSZwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25baV0ucGh5c19hZGRyX2hpLAorCQkJJnBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltpXS5waHlzX2FkZHJfbG8sCisJCQlwbTgwMDFfaGEtPm1lbW9yeU1hcC5yZWdpb25baV0udG90YWxfbGVuLAorCQkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW2ldLmFsaWdubWVudCkgIT0gMCkgeworCQkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQkJCXBtODAwMV9wcmludGsoIk1lbSVkIGFsbG9jIGZhaWxlZFxuIiwKKwkJCQkJaSkpOworCQkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKworCXBtODAwMV9oYS0+ZGV2aWNlcyA9IHBtODAwMV9oYS0+bWVtb3J5TWFwLnJlZ2lvbltERVZfTUVNXS52aXJ0X3B0cjsKKwlmb3IgKGkgPSAwOyBpIDwgUE04MDAxX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJcG04MDAxX2hhLT5kZXZpY2VzW2ldLmRldl90eXBlID0gTk9fREVWSUNFOworCQlwbTgwMDFfaGEtPmRldmljZXNbaV0uaWQgPSBpOworCQlwbTgwMDFfaGEtPmRldmljZXNbaV0uZGV2aWNlX2lkID0gUE04MDAxX01BWF9ERVZJQ0VTOworCQlwbTgwMDFfaGEtPmRldmljZXNbaV0ucnVubmluZ19yZXEgPSAwOworCX0KKwlwbTgwMDFfaGEtPmNjYl9pbmZvID0gcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0NDQl9NRU1dLnZpcnRfcHRyOworCWZvciAoaSA9IDA7IGkgPCBQTTgwMDFfTUFYX0NDQjsgaSsrKSB7CisJCXBtODAwMV9oYS0+Y2NiX2luZm9baV0uY2NiX2RtYV9oYW5kbGUgPQorCQkJcG04MDAxX2hhLT5tZW1vcnlNYXAucmVnaW9uW0NDQl9NRU1dLnBoeXNfYWRkciArCisJCQlpICogc2l6ZW9mKHN0cnVjdCBwbTgwMDFfY2NiX2luZm8pOworCQlwbTgwMDFfaGEtPmNjYl9pbmZvW2ldLnRhc2sgPSBOVUxMOworCQlwbTgwMDFfaGEtPmNjYl9pbmZvW2ldLmNjYl90YWcgPSAweGZmZmZmZmZmOworCQlwbTgwMDFfaGEtPmNjYl9pbmZvW2ldLmRldmljZSA9IE5VTEw7CisJCSsrcG04MDAxX2hhLT50YWdzX251bTsKKwl9CisJcG04MDAxX2hhLT5mbGFncyA9IFBNODAwMUZfSU5JVF9USU1FOworCS8qIEluaXRpYWxpemUgdGFncyAqLworCXBtODAwMV90YWdfaW5pdChwbTgwMDFfaGEpOworCXJldHVybiAwOworZXJyX291dDoKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBwbTgwMDFfaW9yZW1hcCAtIHJlbWFwIHRoZSBwY2kgaGlnaCBwaHlzaWNhbCBhZGRyZXNzIHRvIGtlcm5hbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGVtLgorICogQHBtODAwMV9oYTpvdXIgaGJhIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBwbTgwMDFfaW9yZW1hcChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJdTMyIGJhcjsKKwl1MzIgbG9naWNhbEJhciA9IDA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlwZGV2ID0gcG04MDAxX2hhLT5wZGV2OworCS8qIG1hcCBwY2kgbWVtIChQTUMgcGNpIGJhc2UgMC0zKSovCisJZm9yIChiYXIgPSAwOyBiYXIgPCA2OyBiYXIrKykgeworCQkvKgorCQkqKiBsb2dpY2FsIEJBUnMgZm9yIFNQQzoKKwkJKiogYmFyIDAgYW5kIDEgLSBsb2dpY2FsIEJBUjAKKwkJKiogYmFyIDIgYW5kIDMgLSBsb2dpY2FsIEJBUjEKKwkJKiogYmFyNCAtIGxvZ2ljYWwgQkFSMgorCQkqKiBiYXI1IC0gbG9naWNhbCBCQVIzCisJCSoqIFNraXAgdGhlIGFwcHJvcHJpYXRlIGFzc2lnbm1lbnRzOgorCQkqLworCQlpZiAoKGJhciA9PSAxKSB8fCAoYmFyID09IDMpKQorCQkJY29udGludWU7CisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgYmFyKSAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCQlwbTgwMDFfaGEtPmlvX21lbVtsb2dpY2FsQmFyXS5tZW1iYXNlID0KKwkJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKTsKKwkJCXBtODAwMV9oYS0+aW9fbWVtW2xvZ2ljYWxCYXJdLm1lbWJhc2UgJj0KKwkJCQkodTMyKVBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJCQlwbTgwMDFfaGEtPmlvX21lbVtsb2dpY2FsQmFyXS5tZW1zaXplID0KKwkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcik7CisJCQlwbTgwMDFfaGEtPmlvX21lbVtsb2dpY2FsQmFyXS5tZW12aXJ0YWRkciA9CisJCQkJaW9yZW1hcChwbTgwMDFfaGEtPmlvX21lbVtsb2dpY2FsQmFyXS5tZW1iYXNlLAorCQkJCXBtODAwMV9oYS0+aW9fbWVtW2xvZ2ljYWxCYXJdLm1lbXNpemUpOworCQkJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJQQ0k6IGJhciAlZCwgbG9naWNhbEJhciAlZCAiCisJCQkJInZpcnRfYWRkcj0lbHgsbGVuPSVkXG4iLCBiYXIsIGxvZ2ljYWxCYXIsCisJCQkJKHVuc2lnbmVkIGxvbmcpCisJCQkJcG04MDAxX2hhLT5pb19tZW1bbG9naWNhbEJhcl0ubWVtdmlydGFkZHIsCisJCQkJcG04MDAxX2hhLT5pb19tZW1bbG9naWNhbEJhcl0ubWVtc2l6ZSkpOworCQl9IGVsc2UgeworCQkJcG04MDAxX2hhLT5pb19tZW1bbG9naWNhbEJhcl0ubWVtYmFzZQk9IDA7CisJCQlwbTgwMDFfaGEtPmlvX21lbVtsb2dpY2FsQmFyXS5tZW1zaXplCT0gMDsKKwkJCXBtODAwMV9oYS0+aW9fbWVtW2xvZ2ljYWxCYXJdLm1lbXZpcnRhZGRyID0gMDsKKwkJfQorCQlsb2dpY2FsQmFyKys7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHBtODAwMV9wY2lfYWxsb2MgLSBpbml0aWFsaXplIG91ciBoYSBjYXJkIHN0cnVjdHVyZQorICogQHBkZXY6IHBjaSBkZXZpY2UuCisgKiBAZW50OiBlbnQKKyAqIEBzaG9zdDogc2NzaSBob3N0IHN0cnVjdCB3aGljaCBoYXMgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpfX2RldmluaXQKK3BtODAwMV9wY2lfYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBjaGlwX2lkLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGE7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisKKworCXBtODAwMV9oYSA9IHNoYS0+bGxkZF9oYTsKKwlpZiAoIXBtODAwMV9oYSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwbTgwMDFfaGEtPnBkZXYgPSBwZGV2OworCXBtODAwMV9oYS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbTgwMDFfaGEtPmNoaXBfaWQgPSBjaGlwX2lkOworCXBtODAwMV9oYS0+Y2hpcCA9ICZwbTgwMDFfY2hpcHNbcG04MDAxX2hhLT5jaGlwX2lkXTsKKwlwbTgwMDFfaGEtPmlycSA9IHBkZXYtPmlycTsKKwlwbTgwMDFfaGEtPnNhcyA9IHNoYTsKKwlwbTgwMDFfaGEtPnNob3N0ID0gc2hvc3Q7CisJcG04MDAxX2hhLT5pZCA9IHBtODAwMV9pZCsrOworCUlOSVRfTElTVF9IRUFEKCZwbTgwMDFfaGEtPndxX2xpc3QpOworCXBtODAwMV9oYS0+bG9nZ2luZ19sZXZlbCA9IDB4MDE7CisJc3ByaW50ZihwbTgwMDFfaGEtPm5hbWUsICIlcyVkIiwgRFJWX05BTUUsIHBtODAwMV9oYS0+aWQpOworI2lmZGVmIFBNODAwMV9VU0VfVEFTS0xFVAorCXRhc2tsZXRfaW5pdCgmcG04MDAxX2hhLT50YXNrbGV0LCBwbTgwMDFfdGFza2xldCwKKwkJKHVuc2lnbmVkIGxvbmcpcG04MDAxX2hhKTsKKyNlbmRpZgorCXBtODAwMV9pb3JlbWFwKHBtODAwMV9oYSk7CisJaWYgKCFwbTgwMDFfYWxsb2MocG04MDAxX2hhKSkKKwkJcmV0dXJuIHBtODAwMV9oYTsKKwlwbTgwMDFfZnJlZShwbTgwMDFfaGEpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHBjaV9nb180NCAtIHBtODAwMSBzcGVjaWZpZWQsIGl0cyBETUEgaXMgNDQgYml0IHJhdGhlciB0aGFuIDY0IGJpdAorICogQHBkZXY6IHBjaSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgcGNpX2dvXzQ0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByYzsKKworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNDQpKSkgeworCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNDQpKTsKKwkJaWYgKHJjKSB7CisJCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LAorCQkJCURNQV9CSVRfTUFTSygzMikpOworCQkJaWYgKHJjKSB7CisJCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCQkJIjQ0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmMpIHsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkJIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmIChyYykgeworCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCQkiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKiBwbTgwMDFfcHJlcF9zYXNfaGFfaW5pdCAtIGFsbG9jYXRlIG1lbW9yeSBpbiBnZW5lcmFsIGhiYSBzdHJ1Y3QgJiYgaW5pdCB0aGVtLgorICogQHNob3N0OiBzY3NpIGhvc3Qgd2hpY2ggaGFzIGJlZW4gYWxsb2NhdGVkIG91dHNpZGUuCisgKiBAY2hpcF9pbmZvOiBvdXIgaGEgc3RydWN0LgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbTgwMDFfcHJlcF9zYXNfaGFfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICogc2hvc3QsCisJY29uc3Qgc3RydWN0IHBtODAwMV9jaGlwX2luZm8gKmNoaXBfaW5mbykKK3sKKwlpbnQgcGh5X25yLCBwb3J0X25yOworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqKmFycl9waHk7CisJc3RydWN0IGFzZF9zYXNfcG9ydCAqKmFycl9wb3J0OworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCisJcGh5X25yID0gY2hpcF9pbmZvLT5uX3BoeTsKKwlwb3J0X25yID0gcGh5X25yOworCW1lbXNldChzaGEsIDB4MDAsIHNpemVvZigqc2hhKSk7CisJYXJyX3BoeSA9IGtjYWxsb2MocGh5X25yLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcnJfcGh5KQorCQlnb3RvIGV4aXQ7CisJYXJyX3BvcnQgPSBrY2FsbG9jKHBvcnRfbnIsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFycl9wb3J0KQorCQlnb3RvIGV4aXRfZnJlZTI7CisKKwlzaGEtPnNhc19waHkgPSBhcnJfcGh5OworCXNoYS0+c2FzX3BvcnQgPSBhcnJfcG9ydDsKKwlzaGEtPmxsZGRfaGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaGEtPmxsZGRfaGEpCisJCWdvdG8gZXhpdF9mcmVlMTsKKworCXNob3N0LT50cmFuc3BvcnR0ID0gcG04MDAxX3N0dDsKKwlzaG9zdC0+bWF4X2lkID0gUE04MDAxX01BWF9ERVZJQ0VTOworCXNob3N0LT5tYXhfbHVuID0gODsKKwlzaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCXNob3N0LT51bmlxdWVfaWQgPSBwbTgwMDFfaWQ7CisJc2hvc3QtPm1heF9jbWRfbGVuID0gMTY7CisJc2hvc3QtPmNhbl9xdWV1ZSA9IFBNODAwMV9DQU5fUVVFVUU7CisJc2hvc3QtPmNtZF9wZXJfbHVuID0gMzI7CisJcmV0dXJuIDA7CitleGl0X2ZyZWUxOgorCWtmcmVlKGFycl9wb3J0KTsKK2V4aXRfZnJlZTI6CisJa2ZyZWUoYXJyX3BoeSk7CitleGl0OgorCXJldHVybiAtMTsKK30KKworLyoqCisgKiBwbTgwMDFfcG9zdF9zYXNfaGFfaW5pdCAtIGluaXRpYWxpemUgZ2VuZXJhbCBoYmEgc3RydWN0IGRlZmluZWQgaW4gbGlic2FzCisgKiBAc2hvc3Q6IHNjc2kgaG9zdCB3aGljaCBoYXMgYmVlbiBhbGxvY2F0ZWQgb3V0c2lkZQorICogQGNoaXBfaW5mbzogb3VyIGhhIHN0cnVjdC4KKyAqLworc3RhdGljIHZvaWQgIF9fZGV2aW5pdCBwbTgwMDFfcG9zdF9zYXNfaGFfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwljb25zdCBzdHJ1Y3QgcG04MDAxX2NoaXBfaW5mbyAqY2hpcF9pbmZvKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGE7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisKKwlwbTgwMDFfaGEgPSBzaGEtPmxsZGRfaGE7CisJZm9yIChpID0gMDsgaSA8IGNoaXBfaW5mby0+bl9waHk7IGkrKykgeworCQlzaGEtPnNhc19waHlbaV0gPSAmcG04MDAxX2hhLT5waHlbaV0uc2FzX3BoeTsKKwkJc2hhLT5zYXNfcG9ydFtpXSA9ICZwbTgwMDFfaGEtPnBvcnRbaV0uc2FzX3BvcnQ7CisJfQorCXNoYS0+c2FzX2hhX25hbWUgPSBEUlZfTkFNRTsKKwlzaGEtPmRldiA9IHBtODAwMV9oYS0+ZGV2OworCisJc2hhLT5sbGRkX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXNoYS0+c2FzX2FkZHIgPSAmcG04MDAxX2hhLT5zYXNfYWRkclswXTsKKwlzaGEtPm51bV9waHlzID0gY2hpcF9pbmZvLT5uX3BoeTsKKwlzaGEtPmxsZGRfbWF4X2V4ZWN1dGVfbnVtID0gMTsKKwlzaGEtPmxsZGRfcXVldWVfc2l6ZSA9IFBNODAwMV9DQU5fUVVFVUU7CisJc2hhLT5jb3JlLnNob3N0ID0gc2hvc3Q7Cit9CisKKy8qKgorICogcG04MDAxX2luaXRfc2FzX2FkZCAtIGluaXRpYWxpemUgc2FzIGFkZHJlc3MKKyAqIEBjaGlwX2luZm86IG91ciBoYSBzdHJ1Y3QuCisgKgorICogQ3VycmVudGx5IHdlIGp1c3Qgc2V0IHRoZSBmaXhlZCBTQVMgYWRkcmVzcyB0byBvdXIgSEJBLGZvciBtYW51ZmFjdHVyZSwKKyAqIGl0IHNob3VsZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICovCitzdGF0aWMgdm9pZCBwbTgwMDFfaW5pdF9zYXNfYWRkKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwl1OCBpOworI2lmZGVmIFBNODAwMV9SRUFEX1ZQRAorCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRpb24pOworCXBtODAwMV9oYS0+bnZtZF9jb21wbGV0aW9uID0gJmNvbXBsZXRpb247CisJUE04MDAxX0NISVBfRElTUC0+Z2V0X252bWRfcmVxKHBtODAwMV9oYSwgMCwgMCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGlvbik7CisJZm9yIChpID0gMDsgaSA8IHBtODAwMV9oYS0+Y2hpcC0+bl9waHk7IGkrKykgeworCQltZW1jcHkoJnBtODAwMV9oYS0+cGh5W2ldLmRldl9zYXNfYWRkciwgcG04MDAxX2hhLT5zYXNfYWRkciwKKwkJCVNBU19BRERSX1NJWkUpOworCQlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygicGh5ICVkIHNhc19hZGRyID0gJXggXG4iLCBpLAorCQkJKHU2NClwbTgwMDFfaGEtPnBoeVtpXS5kZXZfc2FzX2FkZHIpKTsKKwl9CisjZWxzZQorCWZvciAoaSA9IDA7IGkgPCBwbTgwMDFfaGEtPmNoaXAtPm5fcGh5OyBpKyspIHsKKwkJcG04MDAxX2hhLT5waHlbaV0uZGV2X3Nhc19hZGRyID0gMHg1MDBlMDA0MDEwMDAwMDA0VUxMOworCQlwbTgwMDFfaGEtPnBoeVtpXS5kZXZfc2FzX2FkZHIgPQorCQkJY3B1X3RvX2JlNjQoKHU2NCkKKwkJCQkoKih1NjQgKikmcG04MDAxX2hhLT5waHlbaV0uZGV2X3Nhc19hZGRyKSk7CisJfQorCW1lbWNweShwbTgwMDFfaGEtPnNhc19hZGRyLCAmcG04MDAxX2hhLT5waHlbMF0uZGV2X3Nhc19hZGRyLAorCQlTQVNfQUREUl9TSVpFKTsKKyNlbmRpZgorfQorCisjaWZkZWYgUE04MDAxX1VTRV9NU0lYCisvKioKKyAqIHBtODAwMV9zZXR1cF9tc2l4IC0gZW5hYmxlIE1TSS1YIGludGVycnVwdAorICogQGNoaXBfaW5mbzogb3VyIGhhIHN0cnVjdC4KKyAqIEBpcnFfaGFuZGxlcjogaXJxX2hhbmRsZXIKKyAqLworc3RhdGljIHUzMiBwbTgwMDFfc2V0dXBfbXNpeChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlcikKK3sKKwl1MzIgaSA9IDAsIGogPSAwOworCXUzMiBudW1iZXJfb2ZfaW50ciA9IDE7CisJaW50IGZsYWcgPSAwOworCXUzMiBtYXhfZW50cnk7CisJaW50IHJjOworCW1heF9lbnRyeSA9IHNpemVvZihwbTgwMDFfaGEtPm1zaXhfZW50cmllcykgLworCQlzaXplb2YocG04MDAxX2hhLT5tc2l4X2VudHJpZXNbMF0pOworCWZsYWcgfD0gSVJRRl9ESVNBQkxFRDsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2VudHJ5IDsgaSsrKQorCQlwbTgwMDFfaGEtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CisJcmMgPSBwY2lfZW5hYmxlX21zaXgocG04MDAxX2hhLT5wZGV2LCBwbTgwMDFfaGEtPm1zaXhfZW50cmllcywKKwkJbnVtYmVyX29mX2ludHIpOworCXBtODAwMV9oYS0+bnVtYmVyX29mX2ludHIgPSBudW1iZXJfb2ZfaW50cjsKKwlpZiAoIXJjKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfaW50cjsgaSsrKSB7CisJCQlpZiAocmVxdWVzdF9pcnEocG04MDAxX2hhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCWlycV9oYW5kbGVyLCBmbGFnLCBEUlZfTkFNRSwKKwkJCQlTSE9TVF9UT19TQVNfSEEocG04MDAxX2hhLT5zaG9zdCkpKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQkJZnJlZV9pcnEoCisJCQkJCXBtODAwMV9oYS0+bXNpeF9lbnRyaWVzW2pdLnZlY3RvciwKKwkJCQkJU0hPU1RfVE9fU0FTX0hBKHBtODAwMV9oYS0+c2hvc3QpKTsKKwkJCQlwY2lfZGlzYWJsZV9tc2l4KHBtODAwMV9oYS0+cGRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKKy8qKgorICogcG04MDAxX3JlcXVlc3RfaXJxIC0gcmVnaXN0ZXIgaW50ZXJydXB0CisgKiBAY2hpcF9pbmZvOiBvdXIgaGEgc3RydWN0LgorICovCitzdGF0aWMgdTMyIHBtODAwMV9yZXF1ZXN0X2lycShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlciA9IHBtODAwMV9pbnRlcnJ1cHQ7CisJaW50IHJjOworCisJcGRldiA9IHBtODAwMV9oYS0+cGRldjsKKworI2lmZGVmIFBNODAwMV9VU0VfTVNJWAorCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJWCkpCisJCXJldHVybiBwbTgwMDFfc2V0dXBfbXNpeChwbTgwMDFfaGEsIGlycV9oYW5kbGVyKTsKKwllbHNlCisJCWdvdG8gaW50eDsKKyNlbmRpZgorCitpbnR4OgorCS8qIGludGlhbGl6ZSB0aGUgSU5ULVggaW50ZXJydXB0ICovCisJcmMgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGlycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsCisJCVNIT1NUX1RPX1NBU19IQShwbTgwMDFfaGEtPnNob3N0KSk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHBtODAwMV9wY2lfcHJvYmUgLSBwcm9iZSBzdXBwb3J0ZWQgZGV2aWNlCisgKiBAcGRldjogcGNpIGRldmljZSB3aGljaCBrZXJuZWwgaGFzIGJlZW4gcHJlcGFyZWQgZm9yLgorICogQGVudDogcGNpIGRldmljZSBpZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1haW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24sIHdoZW4gcmVnaXN0ZXIgYSBuZXcKKyAqIHBjaSBkcml2ZXIgaXQgaXMgaW52b2tlZCwgYWxsIHN0cnVjdCBhbiBoYXJkd2FyZSBpbml0aWxpemF0aW9uIHNob3VsZCBiZSBkb25lCisgKiBoZXJlLCBhbHNvLCByZWdpc3RlciBpbnRlcnJ1cHQKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgcG04MDAxX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXVuc2lnbmVkIGludCByYzsKKwl1MzIJcGNpX3JlZzsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGE7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBwbTgwMDFfY2hpcF9pbmZvICpjaGlwOworCisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCisJCSJwbTgwMDE6IGRyaXZlciB2ZXJzaW9uICVzXG4iLCBEUlZfVkVSU0lPTik7CisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9lbmFibGU7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJLyoKKwkgKiBFbmFibGUgcGNpIHNsb3QgYnVzbWFzdGVyIGJ5IHNldHRpbmcgcGNpIGNvbW1hbmQgcmVnaXN0ZXIuCisJICogVGhpcyBpcyByZXF1aXJlZCBieSBGVyBmb3IgQ3ljbG9uZSBjYXJkLgorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX3JlZyk7CisJcGNpX3JlZyB8PSAweDE1NzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBwY2lfcmVnKTsKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJcmMgPSBwY2lfZ29fNDQocGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZwbTgwMDFfc2h0LCBzaXplb2Yodm9pZCAqKSk7CisJaWYgKCFzaG9zdCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKwljaGlwID0gJnBtODAwMV9jaGlwc1tlbnQtPmRyaXZlcl9kYXRhXTsKKwlTSE9TVF9UT19TQVNfSEEoc2hvc3QpID0KKwkJa2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHNhc19oYV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIVNIT1NUX1RPX1NBU19IQShzaG9zdCkpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9ob3N0OworCX0KKworCXJjID0gcG04MDAxX3ByZXBfc2FzX2hhX2luaXQoc2hvc3QsIGNoaXApOworCWlmIChyYykgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgU0hPU1RfVE9fU0FTX0hBKHNob3N0KSk7CisJcG04MDAxX2hhID0gcG04MDAxX3BjaV9hbGxvYyhwZGV2LCBjaGlwXzgwMDEsIHNob3N0KTsKKwlpZiAoIXBtODAwMV9oYSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKwlsaXN0X2FkZF90YWlsKCZwbTgwMDFfaGEtPmxpc3QsICZoYmFfbGlzdCk7CisJUE04MDAxX0NISVBfRElTUC0+Y2hpcF9zb2Z0X3JzdChwbTgwMDFfaGEsIDB4MjUyYWNiY2QpOworCXJjID0gUE04MDAxX0NISVBfRElTUC0+Y2hpcF9pbml0KHBtODAwMV9oYSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaGFfZnJlZTsKKworCXJjID0gc2NzaV9hZGRfaG9zdChzaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaGFfZnJlZTsKKwlyYyA9IHBtODAwMV9yZXF1ZXN0X2lycShwbTgwMDFfaGEpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3Nob3N0OworCisJUE04MDAxX0NISVBfRElTUC0+aW50ZXJydXB0X2VuYWJsZShwbTgwMDFfaGEpOworCXBtODAwMV9pbml0X3Nhc19hZGQocG04MDAxX2hhKTsKKwlwbTgwMDFfcG9zdF9zYXNfaGFfaW5pdChzaG9zdCwgY2hpcCk7CisJcmMgPSBzYXNfcmVnaXN0ZXJfaGEoU0hPU1RfVE9fU0FTX0hBKHNob3N0KSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfc2hvc3Q7CisJc2NzaV9zY2FuX2hvc3QocG04MDAxX2hhLT5zaG9zdCk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfc2hvc3Q6CisJc2NzaV9yZW1vdmVfaG9zdChwbTgwMDFfaGEtPnNob3N0KTsKK2Vycl9vdXRfaGFfZnJlZToKKwlwbTgwMDFfZnJlZShwbTgwMDFfaGEpOworZXJyX291dF9mcmVlOgorCWtmcmVlKFNIT1NUX1RPX1NBU19IQShzaG9zdCkpOworZXJyX291dF9mcmVlX2hvc3Q6CisJa2ZyZWUoc2hvc3QpOworZXJyX291dF9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dF9lbmFibGU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcG04MDAxX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGE7CisJaW50IGk7CisJcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlzYXNfdW5yZWdpc3Rlcl9oYShzaGEpOworCXNhc19yZW1vdmVfaG9zdChwbTgwMDFfaGEtPnNob3N0KTsKKwlsaXN0X2RlbCgmcG04MDAxX2hhLT5saXN0KTsKKwlzY3NpX3JlbW92ZV9ob3N0KHBtODAwMV9oYS0+c2hvc3QpOworCVBNODAwMV9DSElQX0RJU1AtPmludGVycnVwdF9kaXNhYmxlKHBtODAwMV9oYSk7CisJUE04MDAxX0NISVBfRElTUC0+Y2hpcF9zb2Z0X3JzdChwbTgwMDFfaGEsIDB4MjUyYWNiY2QpOworCisjaWZkZWYgUE04MDAxX1VTRV9NU0lYCisJZm9yIChpID0gMDsgaSA8IHBtODAwMV9oYS0+bnVtYmVyX29mX2ludHI7IGkrKykKKwkJc3luY2hyb25pemVfaXJxKHBtODAwMV9oYS0+bXNpeF9lbnRyaWVzW2ldLnZlY3Rvcik7CisJZm9yIChpID0gMDsgaSA8IHBtODAwMV9oYS0+bnVtYmVyX29mX2ludHI7IGkrKykKKwkJZnJlZV9pcnEocG04MDAxX2hhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLCBzaGEpOworCXBjaV9kaXNhYmxlX21zaXgocGRldik7CisjZWxzZQorCWZyZWVfaXJxKHBtODAwMV9oYS0+aXJxLCBzaGEpOworI2VuZGlmCisjaWZkZWYgUE04MDAxX1VTRV9UQVNLTEVUCisJdGFza2xldF9raWxsKCZwbTgwMDFfaGEtPnRhc2tsZXQpOworI2VuZGlmCisJcG04MDAxX2ZyZWUocG04MDAxX2hhKTsKKwlrZnJlZShzaGEtPnNhc19waHkpOworCWtmcmVlKHNoYS0+c2FzX3BvcnQpOworCWtmcmVlKHNoYSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKy8qKgorICogcG04MDAxX3BjaV9zdXNwZW5kIC0gcG93ZXIgbWFuYWdlbWVudCBzdXNwZW5kIG1haW4gZW50cnkgcG9pbnQKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdAorICogQHN0YXRlOiBQTSBzdGF0ZSBjaGFuZ2UgdG8gKHVzdWFsbHkgUENJX0QzKQorICoKKyAqIFJldHVybnMgMCBzdWNjZXNzLCBhbnl0aGluZyBlbHNlIGVycm9yLgorICovCitzdGF0aWMgaW50IHBtODAwMV9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhOworCWludCBpICwgcG9zOworCXUzMiBkZXZpY2Vfc3RhdGU7CisJcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJc2NzaV9ibG9ja19yZXF1ZXN0cyhwbTgwMDFfaGEtPnNob3N0KTsKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOworCWlmIChwb3MgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiBQQ0kgUE0gbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlQTTgwMDFfQ0hJUF9ESVNQLT5pbnRlcnJ1cHRfZGlzYWJsZShwbTgwMDFfaGEpOworCVBNODAwMV9DSElQX0RJU1AtPmNoaXBfc29mdF9yc3QocG04MDAxX2hhLCAweDI1MmFjYmNkKTsKKyNpZmRlZiBQTTgwMDFfVVNFX01TSVgKKwlmb3IgKGkgPSAwOyBpIDwgcG04MDAxX2hhLT5udW1iZXJfb2ZfaW50cjsgaSsrKQorCQlzeW5jaHJvbml6ZV9pcnEocG04MDAxX2hhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yKTsKKwlmb3IgKGkgPSAwOyBpIDwgcG04MDAxX2hhLT5udW1iZXJfb2ZfaW50cjsgaSsrKQorCQlmcmVlX2lycShwbTgwMDFfaGEtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsIHNoYSk7CisJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKKyNlbHNlCisJZnJlZV9pcnEocG04MDAxX2hhLT5pcnEsIHNoYSk7CisjZW5kaWYKKyNpZmRlZiBQTTgwMDFfVVNFX1RBU0tMRVQKKwl0YXNrbGV0X2tpbGwoJnBtODAwMV9oYS0+dGFza2xldCk7CisjZW5kaWYKKwlkZXZpY2Vfc3RhdGUgPSBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKTsKKwlwbTgwMDFfcHJpbnRrKCJwZGV2PTB4JXAsIHNsb3Q9JXMsIGVudGVyaW5nICIKKwkJICAgICAgIm9wZXJhdGluZyBzdGF0ZSBbRCVkXVxuIiwgcGRldiwKKwkJICAgICAgcG04MDAxX2hhLT5uYW1lLCBkZXZpY2Vfc3RhdGUpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIGRldmljZV9zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcG04MDAxX3BjaV9yZXN1bWUgLSBwb3dlciBtYW5hZ2VtZW50IHJlc3VtZSBtYWluIGVudHJ5IHBvaW50CisgKiBAcGRldjogUENJIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm5zIDAgc3VjY2VzcywgYW55dGhpbmcgZWxzZSBlcnJvci4KKyAqLworc3RhdGljIGludCBwbTgwMDFfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYTsKKwlpbnQgcmM7CisJdTMyIGRldmljZV9zdGF0ZTsKKwlwbTgwMDFfaGEgPSBzaGEtPmxsZGRfaGE7CisJZGV2aWNlX3N0YXRlID0gcGRldi0+Y3VycmVudF9zdGF0ZTsKKworCXBtODAwMV9wcmludGsoInBkZXY9MHglcCwgc2xvdD0lcywgcmVzdW1pbmcgZnJvbSBwcmV2aW91cyAiCisJCSJvcGVyYXRpbmcgc3RhdGUgW0QlZF1cbiIsIHBkZXYsIHBtODAwMV9oYS0+bmFtZSwgZGV2aWNlX3N0YXRlKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykgeworCQlwbTgwMDFfcHJpbnRrKCJzbG90PSVzIEVuYWJsZSBkZXZpY2UgZmFpbGVkIGR1cmluZyByZXN1bWVcbiIsCisJCQkgICAgICBwbTgwMDFfaGEtPm5hbWUpOworCQlnb3RvIGVycl9vdXRfZW5hYmxlOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXJjID0gcGNpX2dvXzQ0KHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisKKwlQTTgwMDFfQ0hJUF9ESVNQLT5jaGlwX3NvZnRfcnN0KHBtODAwMV9oYSwgMHgyNTJhY2JjZCk7CisJcmMgPSBQTTgwMDFfQ0hJUF9ESVNQLT5jaGlwX2luaXQocG04MDAxX2hhKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCVBNODAwMV9DSElQX0RJU1AtPmludGVycnVwdF9kaXNhYmxlKHBtODAwMV9oYSk7CisJcmMgPSBwbTgwMDFfcmVxdWVzdF9pcnEocG04MDAxX2hhKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCSNpZmRlZiBQTTgwMDFfVVNFX1RBU0tMRVQKKwl0YXNrbGV0X2luaXQoJnBtODAwMV9oYS0+dGFza2xldCwgcG04MDAxX3Rhc2tsZXQsCisJCSAgICAodW5zaWduZWQgbG9uZylwbTgwMDFfaGEpOworCSNlbmRpZgorCVBNODAwMV9DSElQX0RJU1AtPmludGVycnVwdF9lbmFibGUocG04MDAxX2hhKTsKKwlzY3NpX3VuYmxvY2tfcmVxdWVzdHMocG04MDAxX2hhLT5zaG9zdCk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZGlzYWJsZToKKwlzY3NpX3JlbW92ZV9ob3N0KHBtODAwMV9oYS0+c2hvc3QpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9vdXRfZW5hYmxlOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9fZGV2aW5pdGRhdGEgcG04MDAxX3BjaV90YWJsZVtdID0geworCXsKKwkJUENJX1ZERVZJQ0UoUE1DX1NpZXJyYSwgMHg4MDAxKSwgY2hpcF84MDAxCisJfSwKKwl7CisJCVBDSV9ERVZJQ0UoMHgxMTdjLCAweDAwNDIpLAorCQkuZHJpdmVyX2RhdGEgPSBjaGlwXzgwMDEKKwl9LAorCXt9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcG04MDAxX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gcG04MDAxX3BjaV90YWJsZSwKKwkucHJvYmUJCT0gcG04MDAxX3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBtODAwMV9wY2lfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IHBtODAwMV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHBtODAwMV9wY2lfcmVzdW1lLAorfTsKKworLyoqCisgKglwbTgwMDFfaW5pdCAtIGluaXRpYWxpemUgc2NzaSB0cmFuc3BvcnQgdGVtcGxhdGUKKyAqLworc3RhdGljIGludCBfX2luaXQgcG04MDAxX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisJcG04MDAxX2lkID0gMDsKKwlwbTgwMDFfc3R0ID0gc2FzX2RvbWFpbl9hdHRhY2hfdHJhbnNwb3J0KCZwbTgwMDFfdHJhbnNwb3J0X29wcyk7CisJaWYgKCFwbTgwMDFfc3R0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlyYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBtODAwMV9wY2lfZHJpdmVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KHBtODAwMV9zdHQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBtODAwMV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwbTgwMDFfcGNpX2RyaXZlcik7CisJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KHBtODAwMV9zdHQpOworfQorCittb2R1bGVfaW5pdChwbTgwMDFfaW5pdCk7Cittb2R1bGVfZXhpdChwbTgwMDFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkphY2sgV2FuZyA8amFja193YW5nQHVzaXNoLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUE1DLVNpZXJyYSBQTTgwMDEgU0FTL1NBVEEgY29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwbTgwMDFfcGNpX3RhYmxlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc2N2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMKQEAgLTAsMCArMSwxMTAzIEBACisvKgorICogUE1DLVNpZXJyYSBTUEMgODAwMSBTQVMvU0FUQSBiYXNlZCBob3N0IGFkYXB0ZXJzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFVTSSBDby4sIEx0ZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKworI2luY2x1ZGUgInBtODAwMV9zYXMuaCIKKworLyoqCisgKiBwbTgwMDFfZmluZF90YWcgLSBmcm9tIHNhcyB0YXNrIHRvIGZpbmQgb3V0ICB0YWcgdGhhdCBiZWxvbmdzIHRvIHRoaXMgdGFzaworICogQHRhc2s6IHRoZSB0YXNrIHNlbnQgdG8gdGhlIExMREQKKyAqIEB0YWc6IHRoZSBmb3VuZCB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrCisgKi8KK3N0YXRpYyBpbnQgcG04MDAxX2ZpbmRfdGFnKHN0cnVjdCBzYXNfdGFzayAqdGFzaywgdTMyICp0YWcpCit7CisJaWYgKHRhc2stPmxsZGRfdGFzaykgeworCQlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2I7CisJCWNjYiA9IHRhc2stPmxsZGRfdGFzazsKKwkJKnRhZyA9IGNjYi0+Y2NiX3RhZzsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAgKiBwbTgwMDFfdGFnX2NsZWFyIC0gY2xlYXIgdGhlIHRhZ3MgYml0bWFwCisgICogQHBtODAwMV9oYTogb3VyIGhiYSBzdHJ1Y3QKKyAgKiBAdGFnOiB0aGUgZm91bmQgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzaworICAqLworc3RhdGljIHZvaWQgcG04MDAxX3RhZ19jbGVhcihzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHUzMiB0YWcpCit7CisJdm9pZCAqYml0bWFwID0gcG04MDAxX2hhLT50YWdzOworCWNsZWFyX2JpdCh0YWcsIGJpdG1hcCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtODAwMV90YWdfZnJlZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHUzMiB0YWcpCit7CisJcG04MDAxX3RhZ19jbGVhcihwbTgwMDFfaGEsIHRhZyk7Cit9CisKK3N0YXRpYyB2b2lkIHBtODAwMV90YWdfc2V0KHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdTMyIHRhZykKK3sKKwl2b2lkICpiaXRtYXAgPSBwbTgwMDFfaGEtPnRhZ3M7CisJc2V0X2JpdCh0YWcsIGJpdG1hcCk7Cit9CisKKy8qKgorICAqIHBtODAwMV90YWdfYWxsb2MgLSBhbGxvY2F0ZSBhIGVtcHR5IHRhZyBmb3IgdGFzayB1c2VkLgorICAqIEBwbTgwMDFfaGE6IG91ciBoYmEgc3RydWN0CisgICogQHRhZ19vdXQ6IHRoZSBmb3VuZCBlbXB0eSB0YWcgLgorICAqLworaW5saW5lIGludCBwbTgwMDFfdGFnX2FsbG9jKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdTMyICp0YWdfb3V0KQoreworCXVuc2lnbmVkIGludCBpbmRleCwgdGFnOworCXZvaWQgKmJpdG1hcCA9IHBtODAwMV9oYS0+dGFnczsKKworCWluZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdChiaXRtYXAsIHBtODAwMV9oYS0+dGFnc19udW0pOworCXRhZyA9IGluZGV4OworCWlmICh0YWcgPj0gcG04MDAxX2hhLT50YWdzX251bSkKKwkJcmV0dXJuIC1TQVNfUVVFVUVfRlVMTDsKKwlwbTgwMDFfdGFnX3NldChwbTgwMDFfaGEsIHRhZyk7CisJKnRhZ19vdXQgPSB0YWc7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcG04MDAxX3RhZ19pbml0KHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcG04MDAxX2hhLT50YWdzX251bTsgKytpKQorCQlwbTgwMDFfdGFnX2NsZWFyKHBtODAwMV9oYSwgaSk7Cit9CisKKyAvKioKKyAgKiBwbTgwMDFfbWVtX2FsbG9jIC0gYWxsb2NhdGUgbWVtb3J5IGZvciBwbTgwMDEuCisgICogQHBkZXY6IHBjaSBkZXZpY2UuCisgICogQHZpcnRfYWRkcjogdGhlIGFsbG9jYXRlZCB2aXJ0dWFsIGFkZHJlc3MKKyAgKiBAcHBoeXNfYWRkcl9oaTogdGhlIHBoeXNpY2FsIGFkZHJlc3MgaGlnaCBieXRlIGFkZHJlc3MuCisgICogQHBwaHlzX2FkZHJfbG86IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGxvdyBieXRlIGFkZHJlc3MuCisgICogQG1lbV9zaXplOiBtZW1vcnkgc2l6ZS4KKyAgKi8KK2ludCBwbTgwMDFfbWVtX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkICoqdmlydF9hZGRyLAorCWRtYV9hZGRyX3QgKnBwaHlzX2FkZHIsIHUzMiAqcHBoeXNfYWRkcl9oaSwKKwl1MzIgKnBwaHlzX2FkZHJfbG8sIHUzMiBtZW1fc2l6ZSwgdTMyIGFsaWduKQoreworCWNhZGRyX3QgbWVtX3ZpcnRfYWxsb2M7CisJZG1hX2FkZHJfdCBtZW1fZG1hX2hhbmRsZTsKKwl1NjQgcGh5c19hbGlnbjsKKwl1NjQgYWxpZ25fb2Zmc2V0ID0gMDsKKwlpZiAoYWxpZ24pCisJCWFsaWduX29mZnNldCA9IChkbWFfYWRkcl90KWFsaWduIC0gMTsKKwltZW1fdmlydF9hbGxvYyA9CisJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIG1lbV9zaXplICsgYWxpZ24sICZtZW1fZG1hX2hhbmRsZSk7CisJaWYgKCFtZW1fdmlydF9hbGxvYykgeworCQlwbTgwMDFfcHJpbnRrKCJtZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KCh2b2lkICopbWVtX3ZpcnRfYWxsb2MsIDAsIG1lbV9zaXplK2FsaWduKTsKKwkqcHBoeXNfYWRkciA9IG1lbV9kbWFfaGFuZGxlOworCXBoeXNfYWxpZ24gPSAoKnBwaHlzX2FkZHIgKyBhbGlnbl9vZmZzZXQpICYgfmFsaWduX29mZnNldDsKKwkqdmlydF9hZGRyID0gKHZvaWQgKiltZW1fdmlydF9hbGxvYyArIHBoeXNfYWxpZ24gLSAqcHBoeXNfYWRkcjsKKwkqcHBoeXNfYWRkcl9oaSA9IHVwcGVyXzMyX2JpdHMocGh5c19hbGlnbik7CisJKnBwaHlzX2FkZHJfbG8gPSBsb3dlcl8zMl9iaXRzKHBoeXNfYWxpZ24pOworCXJldHVybiAwOworfQorLyoqCisgICogcG04MDAxX2ZpbmRfaGFfYnlfZGV2IC0gZnJvbSBkb21haW4gZGV2aWNlIHdoaWNoIGNvbWUgZnJvbSBzYXMgbGF5ZXIgdG8KKyAgKiBmaW5kIG91dCBvdXIgaGJhIHN0cnVjdC4KKyAgKiBAZGV2OiB0aGUgZG9tYWluIGRldmljZSB3aGljaCBmcm9tIHNhcyBsYXllci4KKyAgKi8KK3N0YXRpYworc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2ZpbmRfaGFfYnlfZGV2KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IGRldi0+cG9ydC0+aGE7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gc2hhLT5sbGRkX2hhOworCXJldHVybiBwbTgwMDFfaGE7Cit9CisKKy8qKgorICAqIHBtODAwMV9waHlfY29udHJvbCAtIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdG8KKyAgKiBzYXNfZG9tYWluX2Z1bmN0aW9uX3RlbXBsYXRlIHRvIHByb3ZpZGUgbGlic2FzIHVzZWQsIG5vdGU6IHRoaXMgaXMganVzdAorICAqIGNvbnRyb2wgdGhlIEhCQSBwaHkgcmF0aGVyIHRoYW4gb3RoZXIgZXhwYW5kZXIgcGh5IGlmIHlvdSB3YW50IGNvbnRyb2wKKyAgKiBvdGhlciBwaHksIHlvdSBzaG91bGQgdXNlIFNNUCBjb21tYW5kLgorICAqIEBzYXNfcGh5OiB3aGljaCBwaHkgaW4gSEJBIHBoeXMuCisgICogQGZ1bmM6IHRoZSBvcGVyYXRpb24uCisgICogQGZ1bmNkYXRhOiBhbHdheXMgTlVMTC4KKyAgKi8KK2ludCBwbTgwMDFfcGh5X2NvbnRyb2woc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5LCBlbnVtIHBoeV9mdW5jIGZ1bmMsCisJdm9pZCAqZnVuY2RhdGEpCit7CisJaW50IHJjID0gMCwgcGh5X2lkID0gc2FzX3BoeS0+aWQ7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gTlVMTDsKKwlzdHJ1Y3Qgc2FzX3BoeV9saW5rcmF0ZXMgKnJhdGVzOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRpb24pOworCXBtODAwMV9oYSA9IHNhc19waHktPmhhLT5sbGRkX2hhOworCXBtODAwMV9oYS0+cGh5W3BoeV9pZF0uZW5hYmxlX2NvbXBsZXRpb24gPSAmY29tcGxldGlvbjsKKwlzd2l0Y2ggKGZ1bmMpIHsKKwljYXNlIFBIWV9GVU5DX1NFVF9MSU5LX1JBVEU6CisJCXJhdGVzID0gZnVuY2RhdGE7CisJCWlmIChyYXRlcy0+bWluaW11bV9saW5rcmF0ZSkgeworCQkJcG04MDAxX2hhLT5waHlbcGh5X2lkXS5taW5pbXVtX2xpbmtyYXRlID0KKwkJCQlyYXRlcy0+bWluaW11bV9saW5rcmF0ZTsKKwkJfQorCQlpZiAocmF0ZXMtPm1heGltdW1fbGlua3JhdGUpIHsKKwkJCXBtODAwMV9oYS0+cGh5W3BoeV9pZF0ubWF4aW11bV9saW5rcmF0ZSA9CisJCQkJcmF0ZXMtPm1heGltdW1fbGlua3JhdGU7CisJCX0KKwkJaWYgKHBtODAwMV9oYS0+cGh5W3BoeV9pZF0ucGh5X3N0YXRlID09IDApIHsKKwkJCVBNODAwMV9DSElQX0RJU1AtPnBoeV9zdGFydF9yZXEocG04MDAxX2hhLCBwaHlfaWQpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGlvbik7CisJCX0KKwkJUE04MDAxX0NISVBfRElTUC0+cGh5X2N0bF9yZXEocG04MDAxX2hhLCBwaHlfaWQsCisJCQkJCSAgICAgIFBIWV9MSU5LX1JFU0VUKTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfRlVOQ19IQVJEX1JFU0VUOgorCQlpZiAocG04MDAxX2hhLT5waHlbcGh5X2lkXS5waHlfc3RhdGUgPT0gMCkgeworCQkJUE04MDAxX0NISVBfRElTUC0+cGh5X3N0YXJ0X3JlcShwbTgwMDFfaGEsIHBoeV9pZCk7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uKTsKKwkJfQorCQlQTTgwMDFfQ0hJUF9ESVNQLT5waHlfY3RsX3JlcShwbTgwMDFfaGEsIHBoeV9pZCwKKwkJCQkJICAgICAgUEhZX0hBUkRfUkVTRVQpOworCQlicmVhazsKKwljYXNlIFBIWV9GVU5DX0xJTktfUkVTRVQ6CisJCWlmIChwbTgwMDFfaGEtPnBoeVtwaHlfaWRdLnBoeV9zdGF0ZSA9PSAwKSB7CisJCQlQTTgwMDFfQ0hJUF9ESVNQLT5waHlfc3RhcnRfcmVxKHBtODAwMV9oYSwgcGh5X2lkKTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRpb24pOworCQl9CisJCVBNODAwMV9DSElQX0RJU1AtPnBoeV9jdGxfcmVxKHBtODAwMV9oYSwgcGh5X2lkLAorCQkJCQkgICAgICBQSFlfTElOS19SRVNFVCk7CisJCWJyZWFrOworCWNhc2UgUEhZX0ZVTkNfUkVMRUFTRV9TUElOVVBfSE9MRDoKKwkJUE04MDAxX0NISVBfRElTUC0+cGh5X2N0bF9yZXEocG04MDAxX2hhLCBwaHlfaWQsCisJCQkJCSAgICAgIFBIWV9MSU5LX1JFU0VUKTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfRlVOQ19ESVNBQkxFOgorCQlQTTgwMDFfQ0hJUF9ESVNQLT5waHlfc3RvcF9yZXEocG04MDAxX2hhLCBwaHlfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FT1BOT1RTVVBQOworCX0KKwltc2xlZXAoMzAwKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBwbTgwMDFfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldikKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNjc2lfZGV2KTsKKwlpZiAoZGV2X2lzX3NhdGEoZGV2KSkgeworCQkvKiBXZSBkb24ndCBuZWVkIHRvIHJlc2NhbiB0YXJnZXRzCisJCSogaWYgUkVQT1JUX0xVTlMgcmVxdWVzdCBpcyBmYWlsZWQKKwkJKi8KKwkJaWYgKHNjc2lfZGV2LT5sdW4gPiAwKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJc2NzaV9kZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgPSAxOworCX0KKwlyZXR1cm4gc2FzX3NsYXZlX2FsbG9jKHNjc2lfZGV2KTsKK30KKworLyoqCisgICogcG04MDAxX3NjYW5fc3RhcnQgLSB3ZSBzaG91bGQgZW5hYmxlIGFsbCBIQkEgcGh5cyBieSBzZW5kaW5nIHRoZSBwaHlfc3RhcnQKKyAgKiBjb21tYW5kIHRvIEhCQS4KKyAgKiBAc2hvc3Q6IHRoZSBzY3NpIGhvc3QgZGF0YS4KKyAgKi8KK3ZvaWQgcG04MDAxX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaW50IGk7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXBtODAwMV9oYSA9IHNoYS0+bGxkZF9oYTsKKwlQTTgwMDFfQ0hJUF9ESVNQLT5zYXNfcmVfaW5pdF9yZXEocG04MDAxX2hhKTsKKwlmb3IgKGkgPSAwOyBpIDwgcG04MDAxX2hhLT5jaGlwLT5uX3BoeTsgKytpKQorCQlQTTgwMDFfQ0hJUF9ESVNQLT5waHlfc3RhcnRfcmVxKHBtODAwMV9oYSwgaSk7Cit9CisKK2ludCBwbTgwMDFfc2Nhbl9maW5pc2hlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworCS8qIGdpdmUgdGhlIHBoeSBlbmFibGluZyBpbnRlcnJ1cHQgZXZlbnQgdGltZSB0byBjb21lIGluICgxcworCSogaXMgZW1waXJpY2FsbHkgYWJvdXQgYWxsIGl0IHRha2VzKSAqLworCWlmICh0aW1lIDwgSFopCisJCXJldHVybiAwOworCS8qIFdhaXQgZm9yIGRpc2NvdmVyeSB0byBmaW5pc2ggKi8KKwlzY3NpX2ZsdXNoX3dvcmsoc2hvc3QpOworCXJldHVybiAxOworfQorCisvKioKKyAgKiBwbTgwMDFfdGFza19wcmVwX3NtcCAtIHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uLCBwcmVwYXJlIGRhdGEgZm9yIHNtcCB0YXNrCisgICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgICogQGNjYjogdGhlIGNjYiB3aGljaCBhdHRhY2hlZCB0byBzbXAgdGFzaworICAqLworc3RhdGljIGludCBwbTgwMDFfdGFza19wcmVwX3NtcChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiKQoreworCXJldHVybiBQTTgwMDFfQ0hJUF9ESVNQLT5zbXBfcmVxKHBtODAwMV9oYSwgY2NiKTsKK30KKwordTMyIHBtODAwMV9nZXRfbmNxX3RhZyhzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssIHUzMiAqdGFnKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSB0YXNrLT51bGRkX3Rhc2s7CisJaWYgKHFjKSB7CisJCWlmIChxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX0ZQRE1BX1dSSVRFIHx8CisJCQlxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX0ZQRE1BX1JFQUQpIHsKKwkJCSp0YWcgPSBxYy0+dGFnOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICAqIHBtODAwMV90YXNrX3ByZXBfYXRhIC0gdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24sIHByZXBhcmUgZGF0YSBmb3Igc2F0YSB0YXNrCisgICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgICogQGNjYjogdGhlIGNjYiB3aGljaCBhdHRhY2hlZCB0byBzYXRhIHRhc2sKKyAgKi8KK3N0YXRpYyBpbnQgcG04MDAxX3Rhc2tfcHJlcF9hdGEoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYikKK3sKKwlyZXR1cm4gUE04MDAxX0NISVBfRElTUC0+c2F0YV9yZXEocG04MDAxX2hhLCBjY2IpOworfQorCisvKioKKyAgKiBwbTgwMDFfdGFza19wcmVwX3NzcF90bSAtIHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uLCBwcmVwYXJlIHRhc2sgbWFuYWdlbWVudCBkYXRhCisgICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgICogQGNjYjogdGhlIGNjYiB3aGljaCBhdHRhY2hlZCB0byBUTQorICAqIEB0bWY6IHRoZSB0YXNrIG1hbmFnZW1lbnQgSVUKKyAgKi8KK3N0YXRpYyBpbnQgcG04MDAxX3Rhc2tfcHJlcF9zc3BfdG0oc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYiwgc3RydWN0IHBtODAwMV90bWZfdGFzayAqdG1mKQoreworCXJldHVybiBQTTgwMDFfQ0hJUF9ESVNQLT5zc3BfdG1fcmVxKHBtODAwMV9oYSwgY2NiLCB0bWYpOworfQorCisvKioKKyAgKiBwbTgwMDFfdGFza19wcmVwX3NzcCAtIHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uLHByZXBhcmUgc3NwIGRhdGEgZm9yIHNzcCB0YXNrCisgICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCisgICogQGNjYjogdGhlIGNjYiB3aGljaCBhdHRhY2hlZCB0byBzc3AgdGFzaworICAqLworc3RhdGljIGludCBwbTgwMDFfdGFza19wcmVwX3NzcChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiKQoreworCXJldHVybiBQTTgwMDFfQ0hJUF9ESVNQLT5zc3BfaW9fcmVxKHBtODAwMV9oYSwgY2NiKTsKK30KK2ludCBwbTgwMDFfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNkZXYpOworCWludCByZXQgPSBzYXNfc2xhdmVfY29uZmlndXJlKHNkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKGRldl9pc19zYXRhKGRldikpIHsKKwkjaWZkZWYgUE04MDAxX0RJU0FCTEVfTkNRCisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPnNhdGFfZGV2LmFwOworCQlzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiA9IGFwLT5saW5rLmRldmljZTsKKwkJYWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX05DUV9PRkY7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIE1TR19TSU1QTEVfVEFHLCAxKTsKKwkjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisvKioKKyAgKiBwbTgwMDFfdGFza19leGVjIC0gcXVldWUgdGhlIHRhc2soc3NwLCBzbXAgJiYgYXRhKSB0byB0aGUgaGFyZHdhcmUuCisgICogQHRhc2s6IHRoZSB0YXNrIHRvIGJlIGV4ZWN1dGUuCisgICogQG51bTogaWYgY2FuX3F1ZXVlIGdyZWF0IHRoYW4gMSwgdGhlIHRhc2sgY2FuIGJlIHF1ZXVlZCB1cC4gZm9yIFNNUCB0YXNrLAorICAqIHdlIGFsd2F5cyBleGVjdXRlIG9uZSBvbmUgdGltZS4KKyAgKiBAZ2ZwX2ZsYWdzOiBnZnBfZmxhZ3MuCisgICogQGlzX3RtZjogaWYgaXQgaXMgdGFzayBtYW5hZ2VtZW50IHRhc2suCisgICogQHRtZjogdGhlIHRhc2sgbWFuYWdlbWVudCBJVQorICAqLworI2RlZmluZSBERVZfSVNfR09ORShwbTgwMDFfZGV2KQlcCisJKCghcG04MDAxX2RldiB8fCAocG04MDAxX2Rldi0+ZGV2X3R5cGUgPT0gTk9fREVWSUNFKSkpCitzdGF0aWMgaW50IHBtODAwMV90YXNrX2V4ZWMoc3RydWN0IHNhc190YXNrICp0YXNrLCBjb25zdCBpbnQgbnVtLAorCWdmcF90IGdmcF9mbGFncywgaW50IGlzX3RtZiwgc3RydWN0IHBtODAwMV90bWZfdGFzayAqdG1mKQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSB0YXNrLT5kZXY7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhOworCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2OworCXN0cnVjdCBzYXNfdGFzayAqdCA9IHRhc2s7CisJc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiOworCXUzMiB0YWcgPSAweGRlYWRiZWVmLCByYywgbl9lbGVtID0gMDsKKwl1MzIgbiA9IG51bTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCWlmICghZGV2LT5wb3J0KSB7CisJCXN0cnVjdCB0YXNrX3N0YXR1c19zdHJ1Y3QgKnRzbSA9ICZ0LT50YXNrX3N0YXR1czsKKwkJdHNtLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCXRzbS0+c3RhdCA9IFNBU19QSFlfRE9XTjsKKwkJaWYgKGRldi0+ZGV2X3R5cGUgIT0gU0FUQV9ERVYpCisJCQl0LT50YXNrX2RvbmUodCk7CisJCXJldHVybiAwOworCX0KKwlwbTgwMDFfaGEgPSBwbTgwMDFfZmluZF9oYV9ieV9kZXYodGFzay0+ZGV2KTsKKwlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygicG04MDAxX3Rhc2tfZXhlYyBkZXZpY2UgXG4gIikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwbTgwMDFfaGEtPmxvY2ssIGZsYWdzKTsKKwlkbyB7CisJCWRldiA9IHQtPmRldjsKKwkJcG04MDAxX2RldiA9IGRldi0+bGxkZF9kZXY7CisJCWlmIChERVZfSVNfR09ORShwbTgwMDFfZGV2KSkgeworCQkJaWYgKHBtODAwMV9kZXYpIHsKKwkJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCQkJcG04MDAxX3ByaW50aygiZGV2aWNlICVkIG5vdCByZWFkeS5cbiIsCisJCQkJCXBtODAwMV9kZXYtPmRldmljZV9pZCkpOworCQkJfSBlbHNlIHsKKwkJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCQkJcG04MDAxX3ByaW50aygiZGV2aWNlICUwMTZsbHggbm90ICIKKwkJCQkJInJlYWR5LlxuIiwgU0FTX0FERFIoZGV2LT5zYXNfYWRkcikpKTsKKwkJCX0KKwkJCXJjID0gU0FTX1BIWV9ET1dOOworCQkJZ290byBvdXRfZG9uZTsKKwkJfQorCQlyYyA9IHBtODAwMV90YWdfYWxsb2MocG04MDAxX2hhLCAmdGFnKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJfb3V0OworCQljY2IgPSAmcG04MDAxX2hhLT5jY2JfaW5mb1t0YWddOworCisJCWlmICghc2FzX3Byb3RvY29sX2F0YSh0LT50YXNrX3Byb3RvKSkgeworCQkJaWYgKHQtPm51bV9zY2F0dGVyKSB7CisJCQkJbl9lbGVtID0gZG1hX21hcF9zZyhwbTgwMDFfaGEtPmRldiwKKwkJCQkJdC0+c2NhdHRlciwKKwkJCQkJdC0+bnVtX3NjYXR0ZXIsCisJCQkJCXQtPmRhdGFfZGlyKTsKKwkJCQlpZiAoIW5fZWxlbSkgeworCQkJCQlyYyA9IC1FTk9NRU07CisJCQkJCWdvdG8gZXJyX291dF90YWc7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJbl9lbGVtID0gdC0+bnVtX3NjYXR0ZXI7CisJCX0KKworCQl0LT5sbGRkX3Rhc2sgPSBjY2I7CisJCWNjYi0+bl9lbGVtID0gbl9lbGVtOworCQljY2ItPmNjYl90YWcgPSB0YWc7CisJCWNjYi0+dGFzayA9IHQ7CisJCXN3aXRjaCAodC0+dGFza19wcm90bykgeworCQljYXNlIFNBU19QUk9UT0NPTF9TTVA6CisJCQlyYyA9IHBtODAwMV90YXNrX3ByZXBfc21wKHBtODAwMV9oYSwgY2NiKTsKKwkJCWJyZWFrOworCQljYXNlIFNBU19QUk9UT0NPTF9TU1A6CisJCQlpZiAoaXNfdG1mKQorCQkJCXJjID0gcG04MDAxX3Rhc2tfcHJlcF9zc3BfdG0ocG04MDAxX2hhLAorCQkJCQljY2IsIHRtZik7CisJCQllbHNlCisJCQkJcmMgPSBwbTgwMDFfdGFza19wcmVwX3NzcChwbTgwMDFfaGEsIGNjYik7CisJCQlicmVhazsKKwkJY2FzZSBTQVNfUFJPVE9DT0xfU0FUQToKKwkJY2FzZSBTQVNfUFJPVE9DT0xfU1RQOgorCQljYXNlIFNBU19QUk9UT0NPTF9TQVRBIHwgU0FTX1BST1RPQ09MX1NUUDoKKwkJCXJjID0gcG04MDAxX3Rhc2tfcHJlcF9hdGEocG04MDAxX2hhLCBjY2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBwbTgwMDFfaGEtPmRldiwKKwkJCQkidW5rbm93biBzYXNfdGFzayBwcm90bzogMHgleFxuIiwKKwkJCQl0LT50YXNrX3Byb3RvKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJjKSB7CisJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJyYyBpcyAleFxuIiwgcmMpKTsKKwkJCWdvdG8gZXJyX291dF90YWc7CisJCX0KKwkJLyogVE9ETzogc2VsZWN0IG5vcm1hbCBvciBoaWdoIHByaW9yaXR5ICovCisJCXNwaW5fbG9jaygmdC0+dGFza19zdGF0ZV9sb2NrKTsKKwkJdC0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19BVF9JTklUSUFUT1I7CisJCXNwaW5fdW5sb2NrKCZ0LT50YXNrX3N0YXRlX2xvY2spOworCQlwbTgwMDFfZGV2LT5ydW5uaW5nX3JlcSsrOworCQlpZiAobiA+IDEpCisJCQl0ID0gbGlzdF9lbnRyeSh0LT5saXN0Lm5leHQsIHN0cnVjdCBzYXNfdGFzaywgbGlzdCk7CisJfSB3aGlsZSAoLS1uKTsKKwlyYyA9IDA7CisJZ290byBvdXRfZG9uZTsKKworZXJyX291dF90YWc6CisJcG04MDAxX3RhZ19mcmVlKHBtODAwMV9oYSwgdGFnKTsKK2Vycl9vdXQ6CisJZGV2X3ByaW50ayhLRVJOX0VSUiwgcG04MDAxX2hhLT5kZXYsICJwbTgwMDEgZXhlYyBmYWlsZWRbJWRdIVxuIiwgcmMpOworCWlmICghc2FzX3Byb3RvY29sX2F0YSh0LT50YXNrX3Byb3RvKSkKKwkJaWYgKG5fZWxlbSkKKwkJCWRtYV91bm1hcF9zZyhwbTgwMDFfaGEtPmRldiwgdC0+c2NhdHRlciwgbl9lbGVtLAorCQkJCXQtPmRhdGFfZGlyKTsKK291dF9kb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtODAwMV9oYS0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworLyoqCisgICogcG04MDAxX3F1ZXVlX2NvbW1hbmQgLSByZWdpc3RlciBmb3IgdXBwZXIgbGF5ZXIgdXNlZCwgYWxsIElPIGNvbW1hbmRzIHNlbnQKKyAgKiB0byBIQkEgYXJlIGZyb20gdGhpcyBpbnRlcmZhY2UuCisgICogQHRhc2s6IHRoZSB0YXNrIHRvIGJlIGV4ZWN1dGUuCisgICogQG51bTogaWYgY2FuX3F1ZXVlIGdyZWF0IHRoYW4gMSwgdGhlIHRhc2sgY2FuIGJlIHF1ZXVlZCB1cC4gZm9yIFNNUCB0YXNrLAorICAqIHdlIGFsd2F5cyBleGVjdXRlIG9uZSBvbmUgdGltZQorICAqIEBnZnBfZmxhZ3M6IGdmcF9mbGFncworICAqLworaW50IHBtODAwMV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzYXNfdGFzayAqdGFzaywgY29uc3QgaW50IG51bSwKKwkJZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXJldHVybiBwbTgwMDFfdGFza19leGVjKHRhc2ssIG51bSwgZ2ZwX2ZsYWdzLCAwLCBOVUxMKTsKK30KKwordm9pZCBwbTgwMDFfY2NiX2ZyZWUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB1MzIgY2NiX2lkeCkKK3sKKwlwbTgwMDFfdGFnX2NsZWFyKHBtODAwMV9oYSwgY2NiX2lkeCk7Cit9CisKKy8qKgorICAqIHBtODAwMV9jY2JfdGFza19mcmVlIC0gZnJlZSB0aGUgc2cgZm9yIHNzcCBhbmQgc21wIGNvbW1hbmQsIGZyZWUgdGhlIGNjYi4KKyAgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KKyAgKiBAY2NiOiB0aGUgY2NiIHdoaWNoIGF0dGFjaGVkIHRvIHNzcCB0YXNrCisgICogQHRhc2s6IHRoZSB0YXNrIHRvIGJlIGZyZWUuCisgICogQGNjYl9pZHg6IGNjYiBpbmRleC4KKyAgKi8KK3ZvaWQgcG04MDAxX2NjYl90YXNrX2ZyZWUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXN0cnVjdCBzYXNfdGFzayAqdGFzaywgc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiLCB1MzIgY2NiX2lkeCkKK3sKKwlpZiAoIWNjYi0+dGFzaykKKwkJcmV0dXJuOworCWlmICghc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSkKKwkJaWYgKGNjYi0+bl9lbGVtKQorCQkJZG1hX3VubWFwX3NnKHBtODAwMV9oYS0+ZGV2LCB0YXNrLT5zY2F0dGVyLAorCQkJCXRhc2stPm51bV9zY2F0dGVyLCB0YXNrLT5kYXRhX2Rpcik7CisKKwlzd2l0Y2ggKHRhc2stPnRhc2tfcHJvdG8pIHsKKwljYXNlIFNBU19QUk9UT0NPTF9TTVA6CisJCWRtYV91bm1hcF9zZyhwbTgwMDFfaGEtPmRldiwgJnRhc2stPnNtcF90YXNrLnNtcF9yZXNwLCAxLAorCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZG1hX3VubWFwX3NnKHBtODAwMV9oYS0+ZGV2LCAmdGFzay0+c21wX3Rhc2suc21wX3JlcSwgMSwKKwkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQlicmVhazsKKworCWNhc2UgU0FTX1BST1RPQ09MX1NBVEE6CisJY2FzZSBTQVNfUFJPVE9DT0xfU1RQOgorCWNhc2UgU0FTX1BST1RPQ09MX1NTUDoKKwlkZWZhdWx0OgorCQkvKiBkbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KKwl0YXNrLT5sbGRkX3Rhc2sgPSBOVUxMOworCWNjYi0+dGFzayA9IE5VTEw7CisJY2NiLT5jY2JfdGFnID0gMHhGRkZGRkZGRjsKKwlwbTgwMDFfY2NiX2ZyZWUocG04MDAxX2hhLCBjY2JfaWR4KTsKK30KKworIC8qKgorICAqIHBtODAwMV9hbGxvY19kZXYgLSBmaW5kIGEgZW1wdHkgcG04MDAxX2RldmljZQorICAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbgorICAqLworc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9hbGxvY19kZXYoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQoreworCXUzMiBkZXY7CisJZm9yIChkZXYgPSAwOyBkZXYgPCBQTTgwMDFfTUFYX0RFVklDRVM7IGRldisrKSB7CisJCWlmIChwbTgwMDFfaGEtPmRldmljZXNbZGV2XS5kZXZfdHlwZSA9PSBOT19ERVZJQ0UpIHsKKwkJCXBtODAwMV9oYS0+ZGV2aWNlc1tkZXZdLmlkID0gZGV2OworCQkJcmV0dXJuICZwbTgwMDFfaGEtPmRldmljZXNbZGV2XTsKKwkJfQorCX0KKwlpZiAoZGV2ID09IFBNODAwMV9NQVhfREVWSUNFUykgeworCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygibWF4IHN1cHBvcnQgJWQgZGV2aWNlcywgaWdub3JlIC4uXG4iLAorCQkJUE04MDAxX01BWF9ERVZJQ0VTKSk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwbTgwMDFfZnJlZV9kZXYoc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXYpCit7CisJdTMyIGlkID0gcG04MDAxX2Rldi0+aWQ7CisJbWVtc2V0KHBtODAwMV9kZXYsIDAsIHNpemVvZigqcG04MDAxX2RldikpOworCXBtODAwMV9kZXYtPmlkID0gaWQ7CisJcG04MDAxX2Rldi0+ZGV2X3R5cGUgPSBOT19ERVZJQ0U7CisJcG04MDAxX2Rldi0+ZGV2aWNlX2lkID0gUE04MDAxX01BWF9ERVZJQ0VTOworCXBtODAwMV9kZXYtPnNhc19kZXZpY2UgPSBOVUxMOworfQorCisvKioKKyAgKiBwbTgwMDFfZGV2X2ZvdW5kX25vdGlmeSAtIGxpYnNhcyBub3RpZnkgYSBkZXZpY2UgaXMgZm91bmQuCisgICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUgd2hpY2ggc2FzIGxheWVyIHVzZWQuCisgICoKKyAgKiB3aGVuIGxpYnNhcyBmaW5kIGEgc2FzIGRvbWFpbiBkZXZpY2UsIGl0IHNob3VsZCB0ZWxsIHRoZSBMTEREIHRoYXQKKyAgKiBkZXZpY2UgaXMgZm91bmQsIGFuZCB0aGVuIExMREQgcmVnaXN0ZXIgdGhpcyBkZXZpY2UgdG8gSEJBIGZpcm13YXJlCisgICogYnkgdGhlIGNvbW1hbmQgIk9QQ19JTkJfUkVHX0RFViIsIGFmdGVyIHRoYXQgdGhlIEhCQSB3aWxsIGFzc2lnbiBhCisgICogZGV2aWNlIElEKGFjY29yZGluZyB0byBkZXZpY2UncyBzYXMgYWRkcmVzcykgYW5kIHJldHVybmVkIGl0IHRvIExMREQuIEZyb20KKyAgKiBub3cgb24sIHdlIGNvbW11bmljYXRlIHdpdGggSEJBIEZXIHdpdGggdGhlIGRldmljZSBJRCB3aGljaCBIQkEgYXNzaWduZWQKKyAgKiByYXRoZXIgdGhhbiBzYXMgYWRkcmVzcy4gaXQgaXMgdGhlIG5lY2Nlc3Nhcnkgc3RlcCBmb3Igb3VyIEhCQSBidXQgaXQgaXMKKyAgKiB0aGUgb3B0aW9uYWwgZm9yIG90aGVyIEhCQSBkcml2ZXIuCisgICovCitzdGF0aWMgaW50IHBtODAwMV9kZXZfZm91bmRfbm90aWZ5KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IHJlcyA9IDA7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gTlVMTDsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqcGFyZW50X2RldiA9IGRldi0+cGFyZW50OworCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2aWNlOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRpb24pOworCXUzMiBmbGFnID0gMDsKKwlwbTgwMDFfaGEgPSBwbTgwMDFfZmluZF9oYV9ieV9kZXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG04MDAxX2hhLT5sb2NrLCBmbGFncyk7CisKKwlwbTgwMDFfZGV2aWNlID0gcG04MDAxX2FsbG9jX2RldihwbTgwMDFfaGEpOworCXBtODAwMV9kZXZpY2UtPnNhc19kZXZpY2UgPSBkZXY7CisJaWYgKCFwbTgwMDFfZGV2aWNlKSB7CisJCXJlcyA9IC0xOworCQlnb3RvIGZvdW5kX291dDsKKwl9CisJZGV2LT5sbGRkX2RldiA9IHBtODAwMV9kZXZpY2U7CisJcG04MDAxX2RldmljZS0+ZGV2X3R5cGUgPSBkZXYtPmRldl90eXBlOworCXBtODAwMV9kZXZpY2UtPmRjb21wbGV0aW9uID0gJmNvbXBsZXRpb247CisJaWYgKHBhcmVudF9kZXYgJiYgREVWX0lTX0VYUEFOREVSKHBhcmVudF9kZXYtPmRldl90eXBlKSkgeworCQlpbnQgcGh5X2lkOworCQlzdHJ1Y3QgZXhfcGh5ICpwaHk7CisJCWZvciAocGh5X2lkID0gMDsgcGh5X2lkIDwgcGFyZW50X2Rldi0+ZXhfZGV2Lm51bV9waHlzOworCQlwaHlfaWQrKykgeworCQkJcGh5ID0gJnBhcmVudF9kZXYtPmV4X2Rldi5leF9waHlbcGh5X2lkXTsKKwkJCWlmIChTQVNfQUREUihwaHktPmF0dGFjaGVkX3Nhc19hZGRyKQorCQkJCT09IFNBU19BRERSKGRldi0+c2FzX2FkZHIpKSB7CisJCQkJcG04MDAxX2RldmljZS0+YXR0YWNoZWRfcGh5ID0gcGh5X2lkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChwaHlfaWQgPT0gcGFyZW50X2Rldi0+ZXhfZGV2Lm51bV9waHlzKSB7CisJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiRXJyb3I6IG5vIGF0dGFjaGVkIGRldjolMDE2bGx4IgorCQkJIiBhdCBleDolMDE2bGx4LlxuIiwgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCisJCQkJU0FTX0FERFIocGFyZW50X2Rldi0+c2FzX2FkZHIpKSk7CisJCQlyZXMgPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWKSB7CisJCQlwbTgwMDFfZGV2aWNlLT5hdHRhY2hlZF9waHkgPQorCQkJCWRldi0+cnBoeS0+aWRlbnRpZnkucGh5X2lkZW50aWZpZXI7CisJCQkJZmxhZyA9IDE7IC8qIGRpcmVjdGx5IHNhdGEqLworCQl9CisJfSAvKnJlZ2lzdGVyIHRoaXMgZGV2aWNlIHRvIEhCQSovCisJUE04MDAxX0RJU0NfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiRm91bmQgZGV2aWNlIFxuIikpOworCVBNODAwMV9DSElQX0RJU1AtPnJlZ19kZXZfcmVxKHBtODAwMV9oYSwgcG04MDAxX2RldmljZSwgZmxhZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG04MDAxX2hhLT5sb2NrLCBmbGFncyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGlvbik7CisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYpCisJCW1zbGVlcCg1MCk7CisJcG04MDAxX2hhLT5mbGFncyA9IFBNODAwMUZfUlVOX1RJTUUgOworCXJldHVybiAwOworZm91bmRfb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtODAwMV9oYS0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXM7Cit9CisKK2ludCBwbTgwMDFfZGV2X2ZvdW5kKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBtODAwMV9kZXZfZm91bmRfbm90aWZ5KGRldik7Cit9CisKKy8qKgorICAqIHBtODAwMV9hbGxvY190YXNrIC0gYWxsb2NhdGUgYSB0YXNrIHN0cnVjdHVyZSBmb3IgVE1GCisgICovCitzdGF0aWMgc3RydWN0IHNhc190YXNrICpwbTgwMDFfYWxsb2NfdGFzayh2b2lkKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGt6YWxsb2Moc2l6ZW9mKCp0YXNrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRhc2spIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnRhc2stPmxpc3QpOworCQlzcGluX2xvY2tfaW5pdCgmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyA9IFNBU19UQVNLX1NUQVRFX1BFTkRJTkc7CisJCWluaXRfdGltZXIoJnRhc2stPnRpbWVyKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZ0YXNrLT5jb21wbGV0aW9uKTsKKwl9CisJcmV0dXJuIHRhc2s7Cit9CisKK3N0YXRpYyB2b2lkIHBtODAwMV9mcmVlX3Rhc2soc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCWlmICh0YXNrKSB7CisJCUJVR19PTighbGlzdF9lbXB0eSgmdGFzay0+bGlzdCkpOworCQlrZnJlZSh0YXNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBtODAwMV90YXNrX2RvbmUoc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCWlmICghZGVsX3RpbWVyKCZ0YXNrLT50aW1lcikpCisJCXJldHVybjsKKwljb21wbGV0ZSgmdGFzay0+Y29tcGxldGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHBtODAwMV90bWZfdGltZWRvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IChzdHJ1Y3Qgc2FzX3Rhc2sgKilkYXRhOworCisJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9BQk9SVEVEOworCWNvbXBsZXRlKCZ0YXNrLT5jb21wbGV0aW9uKTsKK30KKworI2RlZmluZSBQTTgwMDFfVEFTS19USU1FT1VUIDIwCisvKioKKyAgKiBwbTgwMDFfZXhlY19pbnRlcm5hbF90bWZfdGFzayAtIGV4ZWN1dGUgc29tZSB0YXNrIG1hbmFnZW1lbnQgY29tbWFuZHMuCisgICogQGRldjogdGhlIHdhbnRlZCBkZXZpY2UuCisgICogQHRtZjogd2hpY2ggdGFzayBtYW5hZ2VtZW50IHdhbnRlZCB0byBiZSB0YWtlLgorICAqIEBwYXJhX2xlbjogcGFyYV9sZW4uCisgICogQHBhcmFtZXRlcjogc3NwIHRhc2sgcGFyYW1ldGVyLgorICAqCisgICogd2hlbiBlcnJvcnMgb3IgZXhjZXB0aW9uIGhhcHBlbmVkLCB3ZSBtYXkgd2FudCB0byBkbyBzb21ldGhpbmcsIGZvciBleGFtcGxlCisgICogYWJvcnQgdGhlIGlzc3VlZCB0YXNrIHdoaWNoIHJlc3VsdCBpbiB0aGlzIGV4ZWNwdGlvbiwgaXQgaXMgZG9uZSBieSBjYWxsaW5nCisgICogdGhpcyBmdW5jdGlvbiwgbm90ZSBpdCBpcyBhbHNvIHdpdGggdGhlIHRhc2sgZXhlY3V0ZSBpbnRlcmZhY2UuCisgICovCitzdGF0aWMgaW50IHBtODAwMV9leGVjX2ludGVybmFsX3RtZl90YXNrKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsCisJdm9pZCAqcGFyYW1ldGVyLCB1MzIgcGFyYV9sZW4sIHN0cnVjdCBwbTgwMDFfdG1mX3Rhc2sgKnRtZikKK3sKKwlpbnQgcmVzLCByZXRyeTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBOVUxMOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHBtODAwMV9maW5kX2hhX2J5X2RldihkZXYpOworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgeworCQl0YXNrID0gcG04MDAxX2FsbG9jX3Rhc2soKTsKKwkJaWYgKCF0YXNrKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdGFzay0+ZGV2ID0gZGV2OworCQl0YXNrLT50YXNrX3Byb3RvID0gZGV2LT50cHJvdG87CisJCW1lbWNweSgmdGFzay0+c3NwX3Rhc2ssIHBhcmFtZXRlciwgcGFyYV9sZW4pOworCQl0YXNrLT50YXNrX2RvbmUgPSBwbTgwMDFfdGFza19kb25lOworCQl0YXNrLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdGFzazsKKwkJdGFzay0+dGltZXIuZnVuY3Rpb24gPSBwbTgwMDFfdG1mX3RpbWVkb3V0OworCQl0YXNrLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBNODAwMV9UQVNLX1RJTUVPVVQqSFo7CisJCWFkZF90aW1lcigmdGFzay0+dGltZXIpOworCisJCXJlcyA9IHBtODAwMV90YXNrX2V4ZWModGFzaywgMSwgR0ZQX0tFUk5FTCwgMSwgdG1mKTsKKworCQlpZiAocmVzKSB7CisJCQlkZWxfdGltZXIoJnRhc2stPnRpbWVyKTsKKwkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQkJcG04MDAxX3ByaW50aygiRXhlY3V0aW5nIGludGVybmFsIHRhc2sgIgorCQkJCSJmYWlsZWRcbiIpKTsKKwkJCWdvdG8gZXhfZXJyOworCQl9CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOworCQlyZXMgPSAtVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJCS8qIEV2ZW4gVE1GIHRpbWVkIG91dCwgcmV0dXJuIGRpcmVjdC4gKi8KKwkJaWYgKCh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgeworCQkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQkJCXBtODAwMV9wcmludGsoIlRNRiB0YXNrWyV4XXRpbWVvdXQuXG4iLAorCQkJCQl0bWYtPnRtZikpOworCQkJCWdvdG8gZXhfZXJyOworCQkJfQorCQl9CisKKwkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKKwkJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX0dPT0QpIHsKKwkJCXJlcyA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0YXNrLT50YXNrX3N0YXR1cy5yZXNwID09IFNBU19UQVNLX0NPTVBMRVRFICYmCisJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FTX0RBVEFfVU5ERVJSVU4pIHsKKwkJCS8qIG5vIGVycm9yLCBidXQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YKKwkJCSogdW5kZXJydW4gKi8KKwkJCXJlcyA9IHRhc2stPnRhc2tfc3RhdHVzLnJlc2lkdWFsOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgorCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQVNfREFUQV9PVkVSUlVOKSB7CisJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIkJsb2NrZWQgdGFzayBlcnJvci5cbiIpKTsKKwkJCXJlcyA9IC1FTVNHU0laRTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJUE04MDAxX0VIX0RCRyhwbTgwMDFfaGEsCisJCQkJcG04MDAxX3ByaW50aygiIFRhc2sgdG8gZGV2ICUwMTZsbHggcmVzcG9uc2U6IgorCQkJCSIweCV4IHN0YXR1cyAweCV4XG4iLAorCQkJCVNBU19BRERSKGRldi0+c2FzX2FkZHIpLAorCQkJCXRhc2stPnRhc2tfc3RhdHVzLnJlc3AsCisJCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCkpOworCQkJcG04MDAxX2ZyZWVfdGFzayh0YXNrKTsKKwkJCXRhc2sgPSBOVUxMOworCQl9CisJfQorZXhfZXJyOgorCUJVR19PTihyZXRyeSA9PSAzICYmIHRhc2sgIT0gTlVMTCk7CisJaWYgKHRhc2sgIT0gTlVMTCkKKwkJcG04MDAxX2ZyZWVfdGFzayh0YXNrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CitwbTgwMDFfZXhlY19pbnRlcm5hbF90YXNrX2Fib3J0KHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwlzdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2Rldiwgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdTMyIGZsYWcsCisJdTMyIHRhc2tfdGFnKQoreworCWludCByZXMsIHJldHJ5OworCXUzMiBjY2JfdGFnOworCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYjsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBOVUxMOworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgeworCQl0YXNrID0gcG04MDAxX2FsbG9jX3Rhc2soKTsKKwkJaWYgKCF0YXNrKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdGFzay0+ZGV2ID0gZGV2OworCQl0YXNrLT50YXNrX3Byb3RvID0gZGV2LT50cHJvdG87CisJCXRhc2stPnRhc2tfZG9uZSA9IHBtODAwMV90YXNrX2RvbmU7CisJCXRhc2stPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyl0YXNrOworCQl0YXNrLT50aW1lci5mdW5jdGlvbiA9IHBtODAwMV90bWZfdGltZWRvdXQ7CisJCXRhc2stPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUE04MDAxX1RBU0tfVElNRU9VVCpIWjsKKwkJYWRkX3RpbWVyKCZ0YXNrLT50aW1lcik7CisKKwkJcmVzID0gcG04MDAxX3RhZ19hbGxvYyhwbTgwMDFfaGEsICZjY2JfdGFnKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCWNjYiA9ICZwbTgwMDFfaGEtPmNjYl9pbmZvW2NjYl90YWddOworCQljY2ItPmRldmljZSA9IHBtODAwMV9kZXY7CisJCWNjYi0+Y2NiX3RhZyA9IGNjYl90YWc7CisJCWNjYi0+dGFzayA9IHRhc2s7CisKKwkJcmVzID0gUE04MDAxX0NISVBfRElTUC0+dGFza19hYm9ydChwbTgwMDFfaGEsCisJCQlwbTgwMDFfZGV2LCBmbGFnLCB0YXNrX3RhZywgY2NiX3RhZyk7CisKKwkJaWYgKHJlcykgeworCQkJZGVsX3RpbWVyKCZ0YXNrLT50aW1lcik7CisJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAorCQkJCXBtODAwMV9wcmludGsoIkV4ZWN1dGluZyBpbnRlcm5hbCB0YXNrICIKKwkJCQkiZmFpbGVkXG4iKSk7CisJCQlnb3RvIGV4X2VycjsKKwkJfQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0YXNrLT5jb21wbGV0aW9uKTsKKwkJcmVzID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJCS8qIEV2ZW4gVE1GIHRpbWVkIG91dCwgcmV0dXJuIGRpcmVjdC4gKi8KKwkJaWYgKCh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgeworCQkJCVBNODAwMV9GQUlMX0RCRyhwbTgwMDFfaGEsCisJCQkJCXBtODAwMV9wcmludGsoIlRNRiB0YXNrIHRpbWVvdXQuXG4iKSk7CisJCQkJZ290byBleF9lcnI7CisJCQl9CisJCX0KKworCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgorCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fR09PRCkgeworCQkJcmVzID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJCWJyZWFrOworCisJCX0gZWxzZSB7CisJCQlQTTgwMDFfRUhfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCIgVGFzayB0byBkZXYgJTAxNmxseCByZXNwb25zZTogIgorCQkJCQkiMHgleCBzdGF0dXMgMHgleFxuIiwKKwkJCQlTQVNfQUREUihkZXYtPnNhc19hZGRyKSwKKwkJCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNwLAorCQkJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQpKTsKKwkJCXBtODAwMV9mcmVlX3Rhc2sodGFzayk7CisJCQl0YXNrID0gTlVMTDsKKwkJfQorCX0KK2V4X2VycjoKKwlCVUdfT04ocmV0cnkgPT0gMyAmJiB0YXNrICE9IE5VTEwpOworCWlmICh0YXNrICE9IE5VTEwpCisJCXBtODAwMV9mcmVlX3Rhc2sodGFzayk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgICogcG04MDAxX2Rldl9nb25lX25vdGlmeSAtIHNlZSB0aGUgY29tbWVudHMgZm9yICJwbTgwMDFfZGV2X2ZvdW5kX25vdGlmeSIKKyAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aGljaCBzYXMgbGF5ZXIgdXNlZC4KKyAgKi8KK3N0YXRpYyB2b2lkIHBtODAwMV9kZXZfZ29uZV9ub3RpZnkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1MzIgdGFnOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYTsKKwlzdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2RldiA9IGRldi0+bGxkZF9kZXY7CisJdTMyIGRldmljZV9pZCA9IHBtODAwMV9kZXYtPmRldmljZV9pZDsKKwlwbTgwMDFfaGEgPSBwbTgwMDFfZmluZF9oYV9ieV9kZXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG04MDAxX2hhLT5sb2NrLCBmbGFncyk7CisJcG04MDAxX3RhZ19hbGxvYyhwbTgwMDFfaGEsICZ0YWcpOworCWlmIChwbTgwMDFfZGV2KSB7CisJCVBNODAwMV9ESVNDX0RCRyhwbTgwMDFfaGEsCisJCQlwbTgwMDFfcHJpbnRrKCJmb3VuZCBkZXZbJWQ6JXhdIGlzIGdvbmUuXG4iLAorCQkJcG04MDAxX2Rldi0+ZGV2aWNlX2lkLCBwbTgwMDFfZGV2LT5kZXZfdHlwZSkpOworCQlpZiAocG04MDAxX2Rldi0+cnVubmluZ19yZXEpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtODAwMV9oYS0+bG9jaywgZmxhZ3MpOworCQkJcG04MDAxX2V4ZWNfaW50ZXJuYWxfdGFza19hYm9ydChwbTgwMDFfaGEsIHBtODAwMV9kZXYgLAorCQkJCWRldiwgMSwgMCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG04MDAxX2hhLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJUE04MDAxX0NISVBfRElTUC0+ZGVyZWdfZGV2X3JlcShwbTgwMDFfaGEsIGRldmljZV9pZCk7CisJCXBtODAwMV9mcmVlX2RldihwbTgwMDFfZGV2KTsKKwl9IGVsc2UgeworCQlQTTgwMDFfRElTQ19EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiRm91bmQgZGV2IGhhcyBnb25lLlxuIikpOworCX0KKwlkZXYtPmxsZGRfZGV2ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbTgwMDFfaGEtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBwbTgwMDFfZGV2X2dvbmUoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlwbTgwMDFfZGV2X2dvbmVfbm90aWZ5KGRldik7Cit9CisKK3N0YXRpYyBpbnQgcG04MDAxX2lzc3VlX3NzcF90bWYoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwKKwl1OCAqbHVuLCBzdHJ1Y3QgcG04MDAxX3RtZl90YXNrICp0bWYpCit7CisJc3RydWN0IHNhc19zc3BfdGFzayBzc3BfdGFzazsKKwlpZiAoIShkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TU1ApKQorCQlyZXR1cm4gVE1GX1JFU1BfRlVOQ19FU1VQUDsKKworCXN0cm5jcHkoKHU4ICopJnNzcF90YXNrLkxVTiwgbHVuLCA4KTsKKwlyZXR1cm4gcG04MDAxX2V4ZWNfaW50ZXJuYWxfdG1mX3Rhc2soZGV2LCAmc3NwX3Rhc2ssIHNpemVvZihzc3BfdGFzayksCisJCXRtZik7Cit9CisKKy8qKgorICAqIFN0YW5kYXJkIG1hbmRhdGVzIGxpbmsgcmVzZXQgZm9yIEFUQSAgKHR5cGUgMCkgYW5kIGhhcmQgcmVzZXQgZm9yCisgICogU1NQICh0eXBlIDEpICwgb25seSBmb3IgUkVDT1ZFUlkKKyAgKi8KK2ludCBwbTgwMDFfSV9UX25leHVzX3Jlc2V0KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJaW50IHJjID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXY7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhOworCXN0cnVjdCBzYXNfcGh5ICpwaHk7CisJaWYgKCFkZXYgfHwgIWRldi0+bGxkZF9kZXYpCisJCXJldHVybiAtMTsKKworCXBtODAwMV9kZXYgPSBkZXYtPmxsZGRfZGV2OworCXBtODAwMV9oYSA9IHBtODAwMV9maW5kX2hhX2J5X2RldihkZXYpOworCXBoeSA9IHNhc19maW5kX2xvY2FsX3BoeShkZXYpOworCisJaWYgKGRldl9pc19zYXRhKGRldikpIHsKKwkJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcGxldGlvbl9zZXRzdGF0ZSk7CisJCXJjID0gc2FzX3BoeV9yZXNldChwaHksIDEpOworCQltc2xlZXAoMjAwMCk7CisJCXJjID0gcG04MDAxX2V4ZWNfaW50ZXJuYWxfdGFza19hYm9ydChwbTgwMDFfaGEsIHBtODAwMV9kZXYgLAorCQkJZGV2LCAxLCAwKTsKKwkJcG04MDAxX2Rldi0+c2V0ZHNfY29tcGxldGlvbiA9ICZjb21wbGV0aW9uX3NldHN0YXRlOworCQlyYyA9IFBNODAwMV9DSElQX0RJU1AtPnNldF9kZXZfc3RhdGVfcmVxKHBtODAwMV9oYSwKKwkJCXBtODAwMV9kZXYsIDB4MDEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uX3NldHN0YXRlKTsKKwl9IGVsc2V7CisJcmMgPSBzYXNfcGh5X3Jlc2V0KHBoeSwgMSk7CisJbXNsZWVwKDIwMDApOworCX0KKwlQTTgwMDFfRUhfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiIGZvciBkZXZpY2VbJXhdOnJjPSVkXG4iLAorCQlwbTgwMDFfZGV2LT5kZXZpY2VfaWQsIHJjKSk7CisJcmV0dXJuIHJjOworfQorCisvKiBtYW5kYXRvcnkgU0FNLTMsIHRoZSB0YXNrIHJlc2V0IHRoZSBzcGVjaWZpZWQgTFVOKi8KK2ludCBwbTgwMDFfbHVfcmVzZXQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdTggKmx1bikKK3sKKwlpbnQgcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwlzdHJ1Y3QgcG04MDAxX3RtZl90YXNrIHRtZl90YXNrOworCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2ID0gZGV2LT5sbGRkX2RldjsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEgPSBwbTgwMDFfZmluZF9oYV9ieV9kZXYoZGV2KTsKKwlpZiAoZGV2X2lzX3NhdGEoZGV2KSkgeworCQlzdHJ1Y3Qgc2FzX3BoeSAqcGh5ID0gc2FzX2ZpbmRfbG9jYWxfcGh5KGRldik7CisJCXJjID0gcG04MDAxX2V4ZWNfaW50ZXJuYWxfdGFza19hYm9ydChwbTgwMDFfaGEsIHBtODAwMV9kZXYgLAorCQkJZGV2LCAxLCAwKTsKKwkJcmMgPSBzYXNfcGh5X3Jlc2V0KHBoeSwgMSk7CisJCXJjID0gUE04MDAxX0NISVBfRElTUC0+c2V0X2Rldl9zdGF0ZV9yZXEocG04MDAxX2hhLAorCQkJcG04MDAxX2RldiwgMHgwMSk7CisJCW1zbGVlcCgyMDAwKTsKKwl9IGVsc2UgeworCQl0bWZfdGFzay50bWYgPSBUTUZfTFVfUkVTRVQ7CisJCXJjID0gcG04MDAxX2lzc3VlX3NzcF90bWYoZGV2LCBsdW4sICZ0bWZfdGFzayk7CisJfQorCS8qIElmIGZhaWxlZCwgZmFsbC10aHJvdWdoIElfVF9OZXh1cyByZXNldCAqLworCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJmb3IgZGV2aWNlWyV4XTpyYz0lZFxuIiwKKwkJcG04MDAxX2Rldi0+ZGV2aWNlX2lkLCByYykpOworCXJldHVybiByYzsKK30KKworLyogb3B0aW9uYWwgU0FNLTMgKi8KK2ludCBwbTgwMDFfcXVlcnlfdGFzayhzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJdTMyIHRhZyA9IDB4ZGVhZGJlZWY7CisJaW50IGkgPSAwOworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJc3RydWN0IHBtODAwMV90bWZfdGFzayB0bWZfdGFzazsKKwlpbnQgcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwlpZiAodW5saWtlbHkoIXRhc2sgfHwgIXRhc2stPmxsZGRfdGFzayB8fCAhdGFzay0+ZGV2KSkKKwkJcmV0dXJuIHJjOworCisJaWYgKHRhc2stPnRhc2tfcHJvdG8gJiBTQVNfUFJPVE9DT0xfU1NQKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSB0YXNrLT51bGRkX3Rhc2s7CisJCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSB0YXNrLT5kZXY7CisJCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9CisJCQlwbTgwMDFfZmluZF9oYV9ieV9kZXYoZGV2KTsKKworCQlpbnRfdG9fc2NzaWx1bihjbW5kLT5kZXZpY2UtPmx1biwgJmx1bik7CisJCXJjID0gcG04MDAxX2ZpbmRfdGFnKHRhc2ssICZ0YWcpOworCQlpZiAocmMgPT0gMCkgeworCQkJcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwkJCXJldHVybiByYzsKKwkJfQorCQlQTTgwMDFfRUhfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiUXVlcnk6WyIpKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlwcmludGsoS0VSTl9JTkZPICIlMDJ4ICIsIGNtbmQtPmNtbmRbaV0pOworCQlwcmludGsoS0VSTl9JTkZPICJdXG4iKTsKKwkJdG1mX3Rhc2sudG1mID0gCVRNRl9RVUVSWV9UQVNLOworCQl0bWZfdGFzay50YWdfb2ZfdGFza190b19iZV9tYW5hZ2VkID0gdGFnOworCisJCXJjID0gcG04MDAxX2lzc3VlX3NzcF90bWYoZGV2LCBsdW4uc2NzaV9sdW4sICZ0bWZfdGFzayk7CisJCXN3aXRjaCAocmMpIHsKKwkJLyogVGhlIHRhc2sgaXMgc3RpbGwgaW4gTHVuLCByZWxlYXNlIGl0IHRoZW4gKi8KKwkJY2FzZSBUTUZfUkVTUF9GVU5DX1NVQ0M6CisJCQlQTTgwMDFfRUhfREJHKHBtODAwMV9oYSwKKwkJCQlwbTgwMDFfcHJpbnRrKCJUaGUgdGFzayBpcyBzdGlsbCBpbiBMdW4gXG4iKSk7CisJCS8qIFRoZSB0YXNrIGlzIG5vdCBpbiBMdW4gb3IgZmFpbGVkLCByZXNldCB0aGUgcGh5ICovCisJCWNhc2UgVE1GX1JFU1BfRlVOQ19GQUlMRUQ6CisJCWNhc2UgVE1GX1JFU1BfRlVOQ19DT01QTEVURToKKwkJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiVGhlIHRhc2sgaXMgbm90IGluIEx1biBvciBmYWlsZWQsIgorCQkJIiByZXNldCB0aGUgcGh5IFxuIikpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcG04MDAxX3ByaW50aygiOnJjPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyogIG1hbmRhdG9yeSBTQU0tMywgc3RpbGwgbmVlZCBmcmVlIHRhc2svY2NiIGluZm8sIGFib3JkIHRoZSBzcGVjaWZpZWQgdGFzayAqLworaW50IHBtODAwMV9hYm9ydF90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0YWcgPSAweGRlYWRiZWVmOworCXUzMiBkZXZpY2VfaWQ7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gTlVMTDsKKwlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2I7CisJc3RydWN0IHNjc2lfbHVuIGx1bjsKKwlzdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2RldjsKKwlzdHJ1Y3QgcG04MDAxX3RtZl90YXNrIHRtZl90YXNrOworCWludCByYyA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCWlmICh1bmxpa2VseSghdGFzayB8fCAhdGFzay0+bGxkZF90YXNrIHx8ICF0YXNrLT5kZXYpKQorCQlyZXR1cm4gcmM7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCWlmICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfRE9ORSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJcmMgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKHRhc2stPnRhc2tfcHJvdG8gJiBTQVNfUFJPVE9DT0xfU1NQKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSB0YXNrLT51bGRkX3Rhc2s7CisJCWRldiA9IHRhc2stPmRldjsKKwkJY2NiID0gdGFzay0+bGxkZF90YXNrOworCQlwbTgwMDFfZGV2ID0gZGV2LT5sbGRkX2RldjsKKwkJcG04MDAxX2hhID0gcG04MDAxX2ZpbmRfaGFfYnlfZGV2KGRldik7CisJCWludF90b19zY3NpbHVuKGNtbmQtPmRldmljZS0+bHVuLCAmbHVuKTsKKwkJcmMgPSBwbTgwMDFfZmluZF90YWcodGFzaywgJnRhZyk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJObyBzdWNoIHRhZyBpbiAlc1xuIiwgX19mdW5jX18pOworCQkJcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwkJCXJldHVybiByYzsKKwkJfQorCQlkZXZpY2VfaWQgPSBwbTgwMDFfZGV2LT5kZXZpY2VfaWQ7CisJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLAorCQkJcG04MDAxX3ByaW50aygiYWJvcnQgaW8gdG8gZGV2aWNlaWQ9ICVkXG4iLCBkZXZpY2VfaWQpKTsKKwkJdG1mX3Rhc2sudG1mID0gVE1GX0FCT1JUX1RBU0s7CisJCXRtZl90YXNrLnRhZ19vZl90YXNrX3RvX2JlX21hbmFnZWQgPSB0YWc7CisJCXJjID0gcG04MDAxX2lzc3VlX3NzcF90bWYoZGV2LCBsdW4uc2NzaV9sdW4sICZ0bWZfdGFzayk7CisJCXBtODAwMV9leGVjX2ludGVybmFsX3Rhc2tfYWJvcnQocG04MDAxX2hhLCBwbTgwMDFfZGV2LAorCQkJcG04MDAxX2Rldi0+c2FzX2RldmljZSwgMCwgdGFnKTsKKwl9IGVsc2UgaWYgKHRhc2stPnRhc2tfcHJvdG8gJiBTQVNfUFJPVE9DT0xfU0FUQSB8fAorCQl0YXNrLT50YXNrX3Byb3RvICYgU0FTX1BST1RPQ09MX1NUUCkgeworCQlkZXYgPSB0YXNrLT5kZXY7CisJCXBtODAwMV9kZXYgPSBkZXYtPmxsZGRfZGV2OworCQlwbTgwMDFfaGEgPSBwbTgwMDFfZmluZF9oYV9ieV9kZXYoZGV2KTsKKwkJcmMgPSBwbTgwMDFfZmluZF90YWcodGFzaywgJnRhZyk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJObyBzdWNoIHRhZyBpbiAlc1xuIiwgX19mdW5jX18pOworCQkJcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyYyA9IHBtODAwMV9leGVjX2ludGVybmFsX3Rhc2tfYWJvcnQocG04MDAxX2hhLCBwbTgwMDFfZGV2LAorCQkJcG04MDAxX2Rldi0+c2FzX2RldmljZSwgMCwgdGFnKTsKKwl9IGVsc2UgaWYgKHRhc2stPnRhc2tfcHJvdG8gJiBTQVNfUFJPVE9DT0xfU01QKSB7CisJCS8qIFNNUCAqLworCQlkZXYgPSB0YXNrLT5kZXY7CisJCXBtODAwMV9kZXYgPSBkZXYtPmxsZGRfZGV2OworCQlwbTgwMDFfaGEgPSBwbTgwMDFfZmluZF9oYV9ieV9kZXYoZGV2KTsKKwkJcmMgPSBwbTgwMDFfZmluZF90YWcodGFzaywgJnRhZyk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJObyBzdWNoIHRhZyBpbiAlc1xuIiwgX19mdW5jX18pOworCQkJcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyYyA9IHBtODAwMV9leGVjX2ludGVybmFsX3Rhc2tfYWJvcnQocG04MDAxX2hhLCBwbTgwMDFfZGV2LAorCQkJcG04MDAxX2Rldi0+c2FzX2RldmljZSwgMCwgdGFnKTsKKworCX0KK291dDoKKwlpZiAocmMgIT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkKKwkJcG04MDAxX3ByaW50aygicmM9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcG04MDAxX2Fib3J0X3Rhc2tfc2V0KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsIHU4ICpsdW4pCit7CisJaW50IHJjID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJc3RydWN0IHBtODAwMV90bWZfdGFzayB0bWZfdGFzazsKKworCXRtZl90YXNrLnRtZiA9IFRNRl9BQk9SVF9UQVNLX1NFVDsKKwlyYyA9IHBtODAwMV9pc3N1ZV9zc3BfdG1mKGRldiwgbHVuLCAmdG1mX3Rhc2spOworCXJldHVybiByYzsKK30KKworaW50IHBtODAwMV9jbGVhcl9hY2Eoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdTggKmx1bikKK3sKKwlpbnQgcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwlzdHJ1Y3QgcG04MDAxX3RtZl90YXNrIHRtZl90YXNrOworCisJdG1mX3Rhc2sudG1mID0gVE1GX0NMRUFSX0FDQTsKKwlyYyA9IHBtODAwMV9pc3N1ZV9zc3BfdG1mKGRldiwgbHVuLCAmdG1mX3Rhc2spOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcG04MDAxX2NsZWFyX3Rhc2tfc2V0KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsIHU4ICpsdW4pCit7CisJaW50IHJjID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJc3RydWN0IHBtODAwMV90bWZfdGFzayB0bWZfdGFzazsKKwlzdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2RldiA9IGRldi0+bGxkZF9kZXY7CisJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gcG04MDAxX2ZpbmRfaGFfYnlfZGV2KGRldik7CisKKwlQTTgwMDFfRUhfREJHKHBtODAwMV9oYSwKKwkJcG04MDAxX3ByaW50aygiSV9UX0xfUSBjbGVhciB0YXNrIHNldFsleF1cbiIsCisJCXBtODAwMV9kZXYtPmRldmljZV9pZCkpOworCXRtZl90YXNrLnRtZiA9IFRNRl9DTEVBUl9UQVNLX1NFVDsKKwlyYyA9IHBtODAwMV9pc3N1ZV9zc3BfdG1mKGRldiwgbHVuLCAmdG1mX3Rhc2spOworCXJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmggYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGYyZWRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmgKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBQTUMtU2llcnJhIFNQQyA4MDAxIFNBUy9TQVRBIGJhc2VkIGhvc3QgYWRhcHRlcnMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgVVNJIENvLiwgTHRkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqLworCisjaWZuZGVmIF9QTTgwMDFfU0FTX0hfCisjZGVmaW5lIF9QTTgwMDFfU0FTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxzY3NpL2xpYnNhcy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Nhc19hdGEuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSAicG04MDAxX2RlZnMuaCIKKworI2RlZmluZSBEUlZfTkFNRQkJInBtODAwMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIwLjEuMzYiCisjZGVmaW5lIFBNODAwMV9GQUlMX0xPR0dJTkcJMHgwMSAvKiBsaWJzYXMgRUggZnVuY3Rpb24gbG9nZ2luZyAqLworI2RlZmluZSBQTTgwMDFfSU5JVF9MT0dHSU5HCTB4MDIgLyogZHJpdmVyIGluaXQgbG9nZ2luZyAqLworI2RlZmluZSBQTTgwMDFfRElTQ19MT0dHSU5HCTB4MDQgLyogZGlzY292ZXJ5IGxheWVyIGxvZ2dpbmcgKi8KKyNkZWZpbmUgUE04MDAxX0lPX0xPR0dJTkcJMHgwOCAvKiBJL08gcGF0aCBsb2dnaW5nICovCisjZGVmaW5lIFBNODAwMV9FSF9MT0dHSU5HCTB4MTAgLyogRXJyb3IgbWVzc2FnZSBsb2dnaW5nICovCisjZGVmaW5lIFBNODAwMV9JT0NUTF9MT0dHSU5HCTB4MjAgLyogSU9DVEwgbWVzc2FnZSBsb2dnaW5nICovCisjZGVmaW5lIFBNODAwMV9NU0dfTE9HR0lORwkweDQwIC8qIG1pc2MgbWVzc2FnZSBsb2dnaW5nICovCisjZGVmaW5lIHBtODAwMV9wcmludGsoZm9ybWF0LCBhcmcuLi4pCXByaW50ayhLRVJOX0lORk8gIiVzICVkOiIgZm9ybWF0LFwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sICMjIGFyZykKKyNkZWZpbmUgUE04MDAxX0NIRUNLX0xPR0dJTkcoSEJBLCBMRVZFTCwgQ01EKQlcCitkbyB7CQkJCQkJXAorCWlmICh1bmxpa2VseShIQkEtPmxvZ2dpbmdfbGV2ZWwgJiBMRVZFTCkpCVwKKwkJZG8gewkJCQkJXAorCQkJQ01EOwkJCQlcCisJCX0gd2hpbGUgKDApOwkJCQlcCit9IHdoaWxlICgwKTsKKworI2RlZmluZSBQTTgwMDFfRUhfREJHKEhCQSwgQ01EKQkJCVwKKwlQTTgwMDFfQ0hFQ0tfTE9HR0lORyhIQkEsIFBNODAwMV9FSF9MT0dHSU5HLCBDTUQpCisKKyNkZWZpbmUgUE04MDAxX0lOSVRfREJHKEhCQSwgQ01EKQkJXAorCVBNODAwMV9DSEVDS19MT0dHSU5HKEhCQSwgUE04MDAxX0lOSVRfTE9HR0lORywgQ01EKQorCisjZGVmaW5lIFBNODAwMV9ESVNDX0RCRyhIQkEsIENNRCkJCVwKKwlQTTgwMDFfQ0hFQ0tfTE9HR0lORyhIQkEsIFBNODAwMV9ESVNDX0xPR0dJTkcsIENNRCkKKworI2RlZmluZSBQTTgwMDFfSU9fREJHKEhCQSwgQ01EKQkJXAorCVBNODAwMV9DSEVDS19MT0dHSU5HKEhCQSwgUE04MDAxX0lPX0xPR0dJTkcsIENNRCkKKworI2RlZmluZSBQTTgwMDFfRkFJTF9EQkcoSEJBLCBDTUQpCQlcCisJUE04MDAxX0NIRUNLX0xPR0dJTkcoSEJBLCBQTTgwMDFfRkFJTF9MT0dHSU5HLCBDTUQpCisKKyNkZWZpbmUgUE04MDAxX0lPQ1RMX0RCRyhIQkEsIENNRCkJCVwKKwlQTTgwMDFfQ0hFQ0tfTE9HR0lORyhIQkEsIFBNODAwMV9JT0NUTF9MT0dHSU5HLCBDTUQpCisKKyNkZWZpbmUgUE04MDAxX01TR19EQkcoSEJBLCBDTUQpCQlcCisJUE04MDAxX0NIRUNLX0xPR0dJTkcoSEJBLCBQTTgwMDFfTVNHX0xPR0dJTkcsIENNRCkKKworCisjZGVmaW5lIFBNODAwMV9VU0VfVEFTS0xFVAorI2RlZmluZSBQTTgwMDFfVVNFX01TSVgKKworCisjZGVmaW5lIERFVl9JU19FWFBBTkRFUih0eXBlKQkoKHR5cGUgPT0gRURHRV9ERVYpIHx8ICh0eXBlID09IEZBTk9VVF9ERVYpKQorCisjZGVmaW5lIFBNODAwMV9OQU1FX0xFTkdUSAkJMzIvKiBnZW5lcmljIGxlbmd0aCBvZiBzdHJpbmdzICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoYmFfbGlzdDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcG04MDAxX2Rpc3BhdGNoIHBtODAwMV84MDAxX2Rpc3BhdGNoOworCitzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvOworc3RydWN0IHBtODAwMV9jY2JfaW5mbzsKK3N0cnVjdCBwbTgwMDFfZGV2aWNlOworc3RydWN0IHBtODAwMV90bWZfdGFzazsKK3N0cnVjdCBwbTgwMDFfZGlzcGF0Y2ggeworCWNoYXIgKm5hbWU7CisJaW50ICgqY2hpcF9pbml0KShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpOworCWludCAoKmNoaXBfc29mdF9yc3QpKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdTMyIHNpZ25hdHVyZSk7CisJdm9pZCAoKmNoaXBfcnN0KShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpOworCWludCAoKmNoaXBfaW9yZW1hcCkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKTsKKwl2b2lkICgqY2hpcF9pb3VubWFwKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpOworCWlycXJldHVybl90ICgqaXNyKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpOworCXUzMiAoKmlzX291cl9pbnRlcnVwdCkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKTsKKwlpbnQgKCppc3JfcHJvY2Vzc19vcSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKTsKKwl2b2lkICgqaW50ZXJydXB0X2VuYWJsZSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKTsKKwl2b2lkICgqaW50ZXJydXB0X2Rpc2FibGUpKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSk7CisJdm9pZCAoKm1ha2VfcHJkKShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjYXR0ZXIsIGludCBuciwgdm9pZCAqcHJkKTsKKwlpbnQgKCpzbXBfcmVxKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYik7CisJaW50ICgqc3NwX2lvX3JlcSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCQlzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2IpOworCWludCAoKnNhdGFfcmVxKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYik7CisJaW50ICgqcGh5X3N0YXJ0X3JlcSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAl1OCBwaHlfaWQpOworCWludCAoKnBoeV9zdG9wX3JlcSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB1OCBwaHlfaWQpOworCWludCAoKnJlZ19kZXZfcmVxKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2LCB1MzIgZmxhZyk7CisJaW50ICgqZGVyZWdfZGV2X3JlcSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB1MzIgZGV2aWNlX2lkKTsKKwlpbnQgKCpwaHlfY3RsX3JlcSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCQl1MzIgcGh5X2lkLCB1MzIgcGh5X29wKTsKKwlpbnQgKCp0YXNrX2Fib3J0KShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCXN0cnVjdCBwbTgwMDFfZGV2aWNlICpwbTgwMDFfZGV2LCB1OCBmbGFnLCB1MzIgdGFza190YWcsCisJCXUzMiBjbWRfdGFnKTsKKwlpbnQgKCpzc3BfdG1fcmVxKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCXN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYiwgc3RydWN0IHBtODAwMV90bWZfdGFzayAqdG1mKTsKKwlpbnQgKCpnZXRfbnZtZF9yZXEpKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwgdm9pZCAqcGF5bG9hZCk7CisJaW50ICgqc2V0X252bWRfcmVxKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHZvaWQgKnBheWxvYWQpOworCWludCAoKmZ3X2ZsYXNoX3VwZGF0ZV9yZXEpKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwkJdm9pZCAqcGF5bG9hZCk7CisJaW50ICgqc2V0X2Rldl9zdGF0ZV9yZXEpKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwkJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXYsIHUzMiBzdGF0ZSk7CisJaW50ICgqc2FzX2RpYWdfc3RhcnRfZW5kX3JlcSkoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCQl1MzIgc3RhdGUpOworCWludCAoKnNhc19kaWFnX2V4ZWN1dGVfcmVxKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsCisJCXUzMiBzdGF0ZSk7CisJaW50ICgqc2FzX3JlX2luaXRfcmVxKShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpOworfTsKKworc3RydWN0IHBtODAwMV9jaGlwX2luZm8geworCXUzMgluX3BoeTsKKwljb25zdCBzdHJ1Y3QgcG04MDAxX2Rpc3BhdGNoCSpkaXNwYXRjaDsKK307CisjZGVmaW5lIFBNODAwMV9DSElQX0RJU1AJKHBtODAwMV9oYS0+Y2hpcC0+ZGlzcGF0Y2gpCisKK3N0cnVjdCBwbTgwMDFfcG9ydCB7CisJc3RydWN0IGFzZF9zYXNfcG9ydAlzYXNfcG9ydDsKK307CisKK3N0cnVjdCBwbTgwMDFfcGh5IHsKKwlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvCSpwbTgwMDFfaGE7CisJc3RydWN0IHBtODAwMV9wb3J0CSpwb3J0OworCXN0cnVjdCBhc2Rfc2FzX3BoeQlzYXNfcGh5OworCXN0cnVjdCBzYXNfaWRlbnRpZnkJaWRlbnRpZnk7CisJc3RydWN0IHNjc2lfZGV2aWNlCSpzZGV2OworCXU2NAkJCWRldl9zYXNfYWRkcjsKKwl1MzIJCQlwaHlfdHlwZTsKKwlzdHJ1Y3QgY29tcGxldGlvbgkqZW5hYmxlX2NvbXBsZXRpb247CisJdTMyCQkJZnJhbWVfcmN2ZF9zaXplOworCXU4CQkJZnJhbWVfcmN2ZFszMl07CisJdTgJCQlwaHlfYXR0YWNoZWQ7CisJdTgJCQlwaHlfc3RhdGU7CisJZW51bSBzYXNfbGlua3JhdGUJbWluaW11bV9saW5rcmF0ZTsKKwllbnVtIHNhc19saW5rcmF0ZQltYXhpbXVtX2xpbmtyYXRlOworfTsKKworc3RydWN0IHBtODAwMV9kZXZpY2UgeworCWVudW0gc2FzX2Rldl90eXBlCWRldl90eXBlOworCXN0cnVjdCBkb21haW5fZGV2aWNlCSpzYXNfZGV2aWNlOworCXUzMgkJCWF0dGFjaGVkX3BoeTsKKwl1MzIJCQlpZDsKKwlzdHJ1Y3QgY29tcGxldGlvbgkqZGNvbXBsZXRpb247CisJc3RydWN0IGNvbXBsZXRpb24JKnNldGRzX2NvbXBsZXRpb247CisJdTMyCQkJZGV2aWNlX2lkOworCXUzMgkJCXJ1bm5pbmdfcmVxOworfTsKKworc3RydWN0IHBtODAwMV9wcmRfaW10IHsKKwlfX2xlMzIJCQlsZW47CisJX19sZTMyCQkJZTsKK307CisKK3N0cnVjdCBwbTgwMDFfcHJkIHsKKwlfX2xlNjQJCQlhZGRyOwkJLyogNjQtYml0IGJ1ZmZlciBhZGRyZXNzICovCisJc3RydWN0IHBtODAwMV9wcmRfaW10CWltX2xlbjsJCS8qIDY0LWJpdCBsZW5ndGggKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworLyoKKyAqIENDQihDb21tYW5kIENvbnRyb2wgQmxvY2spCisgKi8KK3N0cnVjdCBwbTgwMDFfY2NiX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQJZW50cnk7CisJc3RydWN0IHNhc190YXNrCQkqdGFzazsKKwl1MzIJCQluX2VsZW07CisJdTMyCQkJY2NiX3RhZzsKKwlkbWFfYWRkcl90CQljY2JfZG1hX2hhbmRsZTsKKwlzdHJ1Y3QgcG04MDAxX2RldmljZQkqZGV2aWNlOworCXN0cnVjdCBwbTgwMDFfcHJkCWJ1Zl9wcmRbUE04MDAxX01BWF9ETUFfU0ddOworCXN0cnVjdCBmd19jb250cm9sX2V4CSpmd19jb250cm9sX2NvbnRleHQ7Cit9OworCitzdHJ1Y3QgbXBpX21lbSB7CisJdm9pZAkJCSp2aXJ0X3B0cjsKKwlkbWFfYWRkcl90CQlwaHlzX2FkZHI7CisJdTMyCQkJcGh5c19hZGRyX2hpOworCXUzMgkJCXBoeXNfYWRkcl9sbzsKKwl1MzIJCQl0b3RhbF9sZW47CisJdTMyCQkJbnVtX2VsZW1lbnRzOworCXUzMgkJCWVsZW1lbnRfc2l6ZTsKKwl1MzIJCQlhbGlnbm1lbnQ7Cit9OworCitzdHJ1Y3QgbXBpX21lbV9yZXEgeworCS8qIFRoZSBudW1iZXIgb2YgZWxlbWVudCBpbiB0aGUgIG1waU1lbW9yeSBhcnJheSAqLworCXUzMgkJCWNvdW50OworCS8qIFRoZSBhcnJheSBvZiBzdHJ1Y3R1cmVzIHRoYXQgZGVmaW5lIG1lbXJveSByZWdpb25zKi8KKwlzdHJ1Y3QgbXBpX21lbQkJcmVnaW9uW1VTSV9NQVhfTUVNQ05UXTsKK307CisKK3N0cnVjdCBtYWluX2NmZ190YWJsZSB7CisJdTMyCQkJc2lnbmF0dXJlOworCXUzMgkJCWludGVyZmFjZV9yZXY7CisJdTMyCQkJZmlybXdhcmVfcmV2OworCXUzMgkJCW1heF9vdXRfaW87CisJdTMyCQkJbWF4X3NnbDsKKwl1MzIJCQljdHJsX2NhcF9mbGFnOworCXUzMgkJCWdzdF9vZmZzZXQ7CisJdTMyCQkJaW5ib3VuZF9xdWV1ZV9vZmZzZXQ7CisJdTMyCQkJb3V0Ym91bmRfcXVldWVfb2Zmc2V0OworCXUzMgkJCWluYm91bmRfcV9ucHBkX2hwcGQ7CisJdTMyCQkJb3V0Ym91bmRfaHdfZXZlbnRfcGlkMF8zOworCXUzMgkJCW91dGJvdW5kX2h3X2V2ZW50X3BpZDRfNzsKKwl1MzIJCQlvdXRib3VuZF9uY3FfZXZlbnRfcGlkMF8zOworCXUzMgkJCW91dGJvdW5kX25jcV9ldmVudF9waWQ0Xzc7CisJdTMyCQkJb3V0Ym91bmRfdGd0X0lUTmV4dXNfZXZlbnRfcGlkMF8zOworCXUzMgkJCW91dGJvdW5kX3RndF9JVE5leHVzX2V2ZW50X3BpZDRfNzsKKwl1MzIJCQlvdXRib3VuZF90Z3Rfc3NwX2V2ZW50X3BpZDBfMzsKKwl1MzIJCQlvdXRib3VuZF90Z3Rfc3NwX2V2ZW50X3BpZDRfNzsKKwl1MzIJCQlvdXRib3VuZF90Z3Rfc21wX2V2ZW50X3BpZDBfMzsKKwl1MzIJCQlvdXRib3VuZF90Z3Rfc21wX2V2ZW50X3BpZDRfNzsKKwl1MzIJCQl1cHBlcl9ldmVudF9sb2dfYWRkcjsKKwl1MzIJCQlsb3dlcl9ldmVudF9sb2dfYWRkcjsKKwl1MzIJCQlldmVudF9sb2dfc2l6ZTsKKwl1MzIJCQlldmVudF9sb2dfb3B0aW9uOworCXUzMgkJCXVwcGVyX2lvcF9ldmVudF9sb2dfYWRkcjsKKwl1MzIJCQlsb3dlcl9pb3BfZXZlbnRfbG9nX2FkZHI7CisJdTMyCQkJaW9wX2V2ZW50X2xvZ19zaXplOworCXUzMgkJCWlvcF9ldmVudF9sb2dfb3B0aW9uOworCXUzMgkJCWZhdGFsX2Vycl9pbnRlcnJ1cHQ7CisJdTMyCQkJZmF0YWxfZXJyX2R1bXBfb2Zmc2V0MDsKKwl1MzIJCQlmYXRhbF9lcnJfZHVtcF9sZW5ndGgwOworCXUzMgkJCWZhdGFsX2Vycl9kdW1wX29mZnNldDE7CisJdTMyCQkJZmF0YWxfZXJyX2R1bXBfbGVuZ3RoMTsKKwl1MzIJCQloZGFfbW9kZV9mbGFnOworCXUzMgkJCWFub2xvZ19zZXR1cF90YWJsZV9vZmZzZXQ7Cit9Oworc3RydWN0IGdlbmVyYWxfc3RhdHVzX3RhYmxlIHsKKwl1MzIJCQlnc3RfbGVuX21waXN0YXRlOworCXUzMgkJCWlxX2ZyZWV6ZV9zdGF0ZTA7CisJdTMyCQkJaXFfZnJlZXplX3N0YXRlMTsKKwl1MzIJCQltc2d1X3RjbnQ7CisJdTMyCQkJaW9wX3RjbnQ7CisJdTMyCQkJcmVzZXJ2ZWQ7CisJdTMyCQkJcGh5X3N0YXRlWzhdOworCXUzMgkJCXJlc2VydmVkMTsKKwl1MzIJCQlyZXNlcnZlZDI7CisJdTMyCQkJcmVzZXJ2ZWQzOworCXUzMgkJCXJlY292ZXJfZXJyX2luZm9bOF07Cit9Oworc3RydWN0IGluYm91bmRfcXVldWVfdGFibGUgeworCXUzMgkJCWVsZW1lbnRfcHJpX3NpemVfY250OworCXUzMgkJCXVwcGVyX2Jhc2VfYWRkcjsKKwl1MzIJCQlsb3dlcl9iYXNlX2FkZHI7CisJdTMyCQkJY2lfdXBwZXJfYmFzZV9hZGRyOworCXUzMgkJCWNpX2xvd2VyX2Jhc2VfYWRkcjsKKwl1MzIJCQlwaV9wY2lfYmFyOworCXUzMgkJCXBpX29mZnNldDsKKwl1MzIJCQl0b3RhbF9sZW5ndGg7CisJdm9pZAkJCSpiYXNlX3ZpcnQ7CisJdm9pZAkJCSpjaV92aXJ0OworCXUzMgkJCXJlc2VydmVkOworCV9fbGUzMgkJCWNvbnN1bWVyX2luZGV4OworCXUzMgkJCXByb2R1Y2VyX2lkeDsKK307CitzdHJ1Y3Qgb3V0Ym91bmRfcXVldWVfdGFibGUgeworCXUzMgkJCWVsZW1lbnRfc2l6ZV9jbnQ7CisJdTMyCQkJdXBwZXJfYmFzZV9hZGRyOworCXUzMgkJCWxvd2VyX2Jhc2VfYWRkcjsKKwl2b2lkCQkJKmJhc2VfdmlydDsKKwl1MzIJCQlwaV91cHBlcl9iYXNlX2FkZHI7CisJdTMyCQkJcGlfbG93ZXJfYmFzZV9hZGRyOworCXUzMgkJCWNpX3BjaV9iYXI7CisJdTMyCQkJY2lfb2Zmc2V0OworCXUzMgkJCXRvdGFsX2xlbmd0aDsKKwl2b2lkCQkJKnBpX3ZpcnQ7CisJdTMyCQkJaW50ZXJydXBfdmVjX2NudF9kZWxheTsKKwl1MzIJCQlkaW50ZXJydXBfdG9fcGNpX29mZnNldDsKKwlfX2xlMzIJCQlwcm9kdWNlcl9pbmRleDsKKwl1MzIJCQljb25zdW1lcl9pZHg7Cit9Oworc3RydWN0IHBtODAwMV9oYmFfbWVtc3BhY2UgeworCXZvaWQgX19pb21lbSAgCQkqbWVtdmlydGFkZHI7CisJdTY0CQkJbWVtYmFzZTsKKwl1MzIJCQltZW1zaXplOworfTsKK3N0cnVjdCBwbTgwMDFfaGJhX2luZm8geworCWNoYXIJCQluYW1lW1BNODAwMV9OQU1FX0xFTkdUSF07CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXNwaW5sb2NrX3QJCWxvY2s7LyogaG9zdC13aWRlIGxvY2sgKi8KKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7Lyogb3VyIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IHBtODAwMV9oYmFfbWVtc3BhY2UgaW9fbWVtWzZdOworCXN0cnVjdCBtcGlfbWVtX3JlcQltZW1vcnlNYXA7CisJdm9pZCBfX2lvbWVtCSptc2dfdW5pdF90YmxfYWRkcjsvKk1lc3NhZ2UgVW5pdCBUYWJsZSBBZGRyKi8KKwl2b2lkIF9faW9tZW0JKm1haW5fY2ZnX3RibF9hZGRyOy8qTWFpbiBDb25maWcgVGFibGUgQWRkciovCisJdm9pZCBfX2lvbWVtCSpnZW5lcmFsX3N0YXRfdGJsX2FkZHI7LypHZW5lcmFsIFN0YXR1cyBUYWJsZSBBZGRyKi8KKwl2b2lkIF9faW9tZW0JKmluYm5kX3FfdGJsX2FkZHI7LypJbmJvdW5kIFF1ZXVlIENvbmZpZyBUYWJsZSBBZGRyKi8KKwl2b2lkIF9faW9tZW0JKm91dGJuZF9xX3RibF9hZGRyOy8qT3V0Ym91bmQgUXVldWUgQ29uZmlnIFRhYmxlIEFkZHIqLworCXN0cnVjdCBtYWluX2NmZ190YWJsZQltYWluX2NmZ190Ymw7CisJc3RydWN0IGdlbmVyYWxfc3RhdHVzX3RhYmxlCWdzX3RibDsKKwlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZQlpbmJuZF9xX3RibFtQTTgwMDFfTUFYX0lOQl9OVU1dOworCXN0cnVjdCBvdXRib3VuZF9xdWV1ZV90YWJsZQlvdXRibmRfcV90YmxbUE04MDAxX01BWF9PVVRCX05VTV07CisJdTgJCQlzYXNfYWRkcltTQVNfQUREUl9TSVpFXTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdAkqc2FzOy8qIFNDU0kvU0FTIGdsdWUgKi8KKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpzaG9zdDsKKwl1MzIJCQljaGlwX2lkOworCWNvbnN0IHN0cnVjdCBwbTgwMDFfY2hpcF9pbmZvCSpjaGlwOworCXN0cnVjdCBjb21wbGV0aW9uCSpudm1kX2NvbXBsZXRpb247CisJaW50CQkJdGFnc19udW07CisJdW5zaWduZWQgbG9uZwkJKnRhZ3M7CisJc3RydWN0IHBtODAwMV9waHkJcGh5W1BNODAwMV9NQVhfUEhZU107CisJc3RydWN0IHBtODAwMV9wb3J0CXBvcnRbUE04MDAxX01BWF9QSFlTXTsKKwl1MzIJCQlpZDsKKwl1MzIJCQlpcnE7CisJc3RydWN0IHBtODAwMV9kZXZpY2UJKmRldmljZXM7CisJc3RydWN0IHBtODAwMV9jY2JfaW5mbwkqY2NiX2luZm87CisjaWZkZWYgUE04MDAxX1VTRV9NU0lYCisJc3RydWN0IG1zaXhfZW50cnkJbXNpeF9lbnRyaWVzWzE2XTsvKmZvciBtc2kteCBpbnRlcnJ1cHQqLworCWludAkJCW51bWJlcl9vZl9pbnRyOy8qd2lsbCBiZSB1c2VkIGluIHJlbW92ZSgpKi8KKyNlbmRpZgorI2lmZGVmIFBNODAwMV9VU0VfVEFTS0xFVAorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YXNrbGV0OworI2VuZGlmCisJc3RydWN0IGxpc3RfaGVhZCAJd3FfbGlzdDsKKwl1MzIJCQlsb2dnaW5nX2xldmVsOworCXUzMgkJCWZ3X3N0YXR1czsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgCSpmd19pbWFnZTsKK307CisKK3N0cnVjdCBwbTgwMDFfd3EgeworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29ya19xOworCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYTsKKwl2b2lkICpkYXRhOworCWludCBoYW5kbGVyOworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7Cit9OworCitzdHJ1Y3QgcG04MDAxX2Z3X2ltYWdlX2hlYWRlciB7CisJdTggdmVuZGVyX2lkWzhdOworCXU4IHByb2R1Y3RfaWQ7CisJdTggaGFyZHdhcmVfcmV2OworCXU4IGRlc3RfcGFydGl0aW9uOworCXU4IHJlc2VydmVkOworCXU4IGZ3X3Jldls0XTsKKwlfX2JlMzIgIGltYWdlX2xlbmd0aDsKKwlfX2JlMzIgaW1hZ2VfY3JjOworCV9fYmUzMiBzdGFydHVwX2VudHJ5OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworLyogZGVmaW5lIHRhc2sgbWFuYWdlbWVudCBJVSAqLworc3RydWN0IHBtODAwMV90bWZfdGFzayB7CisJdTgJdG1mOworCXUzMgl0YWdfb2ZfdGFza190b19iZV9tYW5hZ2VkOworfTsKKy8qKgorICogRlcgRmxhc2ggVXBkYXRlIHN0YXR1cyB2YWx1ZXMKKyAqLworI2RlZmluZSBGTEFTSF9VUERBVEVfQ09NUExFVEVfUEVORElOR19SRUJPT1QJMHgwMAorI2RlZmluZSBGTEFTSF9VUERBVEVfSU5fUFJPR1JFU1MJCTB4MDEKKyNkZWZpbmUgRkxBU0hfVVBEQVRFX0hEUl9FUlIJCQkweDAyCisjZGVmaW5lIEZMQVNIX1VQREFURV9PRkZTRVRfRVJSCQkJMHgwMworI2RlZmluZSBGTEFTSF9VUERBVEVfQ1JDX0VSUgkJCTB4MDQKKyNkZWZpbmUgRkxBU0hfVVBEQVRFX0xFTkdUSF9FUlIJCQkweDA1CisjZGVmaW5lIEZMQVNIX1VQREFURV9IV19FUlIJCQkweDA2CisjZGVmaW5lIEZMQVNIX1VQREFURV9ETkxEX05PVF9TVVBQT1JURUQJCTB4MTAKKyNkZWZpbmUgRkxBU0hfVVBEQVRFX0RJU0FCTEVECQkJMHgxMQorCisvKioKKyAqIGJyaWVmIHBhcmFtIHN0cnVjdHVyZSBmb3IgZmlybXdhcmUgZmxhc2ggdXBkYXRlLgorICovCitzdHJ1Y3QgZndfZmxhc2hfdXBkYXRhX2luZm8geworCXUzMgkJCWN1cl9pbWFnZV9vZmZzZXQ7CisJdTMyCQkJY3VyX2ltYWdlX2xlbjsKKwl1MzIJCQl0b3RhbF9pbWFnZV9sZW47CisJc3RydWN0IHBtODAwMV9wcmQJc2dsOworfTsKKworc3RydWN0IGZ3X2NvbnRyb2xfaW5mbyB7CisJdTMyCQkJcmV0Y29kZTsvKnJldCBjb2RlIChzdGF0dXMpKi8KKwl1MzIJCQlwaGFzZTsvKnJldCBjb2RlIHBoYXNlKi8KKwl1MzIJCQlwaGFzZUNtcGx0Oy8qcGVyY2VudCBjb21wbGV0ZSBmb3IgdGhlIGN1cnJlbnQKKwl1cGRhdGUgcGhhc2UgKi8KKwl1MzIJCQl2ZXJzaW9uOy8qSGV4IGVuY29kZWQgZmlybXdhcmUgdmVyc2lvbiBudW1iZXIqLworCXUzMgkJCW9mZnNldDsvKlVzZWQgZm9yIGRvd25sb2FkaW5nIGZpcm13YXJlCSovCisJdTMyCQkJbGVuOyAvKmxlbiBvZiBidWZmZXIqLworCXUzMgkJCXNpemU7LyogVXNlZCBpbiBPUyBWUEQgYW5kIFRyYWNlIGdldCBzaXplCisJb3BlcmF0aW9ucy4qLworCXUzMgkJCXJlc2VydmVkOy8qIHBhZGRpbmcgcmVxdWlyZWQgZm9yIDY0IGJpdAorCWFsaWdubWVudCAqLworCXU4CQkJYnVmZmVyWzFdOy8qIFN0YXJ0IG9mIGJ1ZmZlciAqLworfTsKK3N0cnVjdCBmd19jb250cm9sX2V4IHsKKwlzdHJ1Y3QgZndfY29udHJvbF9pbmZvICpmd19jb250cm9sOworCXZvaWQJCQkqYnVmZmVyOy8qIGtlZXAgYnVmZmVyIHBvaW50ZXIgdG8gYmUKKwlmcmVlZCB3aGVuIHRoZSByZXNwb25jZSBjb21lcyovCisJdm9pZAkJCSp2aXJ0QWRkcjsvKiBrZWVwIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgZGF0YSAqLworCXZvaWQJCQkqdXNyQWRkcjsvKiBrZWVwIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUKKwl1c2VyIGRhdGEgKi8KKwlkbWFfYWRkcl90CQlwaHlzX2FkZHI7CisJdTMyCQkJbGVuOyAvKiBsZW4gb2YgYnVmZmVyICAqLworCXZvaWQJCQkqcGF5bG9hZDsgLyogcG9pbnRlciB0byBJT0NUTCBQYXlsb2FkICovCisJdTgJCQlpblByb2dyZXNzOy8qaWYgMSAtIHRoZSBJT0NUTCByZXF1ZXN0IGlzIGluCisJcHJvZ3Jlc3MgKi8KKwl2b2lkCQkJKnBhcmFtMTsKKwl2b2lkCQkJKnBhcmFtMjsKKwl2b2lkCQkJKnBhcmFtMzsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKiBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKioqLworaW50IHBtODAwMV90YWdfYWxsb2Moc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLCB1MzIgKnRhZ19vdXQpOwordm9pZCBwbTgwMDFfdGFnX2luaXQoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKTsKK3UzMiBwbTgwMDFfZ2V0X25jcV90YWcoc3RydWN0IHNhc190YXNrICp0YXNrLCB1MzIgKnRhZyk7Cit2b2lkIHBtODAwMV9jY2JfZnJlZShzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEsIHUzMiBjY2JfaWR4KTsKK3ZvaWQgcG04MDAxX2NjYl90YXNrX2ZyZWUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCXN0cnVjdCBzYXNfdGFzayAqdGFzaywgc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiLCB1MzIgY2NiX2lkeCk7CitpbnQgcG04MDAxX3BoeV9jb250cm9sKHN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSwgZW51bSBwaHlfZnVuYyBmdW5jLAorCXZvaWQgKmZ1bmNkYXRhKTsKK2ludCBwbTgwMDFfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2Rldik7CitpbnQgcG04MDAxX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwordm9pZCBwbTgwMDFfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitpbnQgcG04MDAxX3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSk7CitpbnQgcG04MDAxX3F1ZXVlX2NvbW1hbmQoc3RydWN0IHNhc190YXNrICp0YXNrLCBjb25zdCBpbnQgbnVtLAorCWdmcF90IGdmcF9mbGFncyk7CitpbnQgcG04MDAxX2Fib3J0X3Rhc2soc3RydWN0IHNhc190YXNrICp0YXNrKTsKK2ludCBwbTgwMDFfYWJvcnRfdGFza19zZXQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdTggKmx1bik7CitpbnQgcG04MDAxX2NsZWFyX2FjYShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCB1OCAqbHVuKTsKK2ludCBwbTgwMDFfY2xlYXJfdGFza19zZXQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdTggKmx1bik7CitpbnQgcG04MDAxX2Rldl9mb3VuZChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KTsKK3ZvaWQgcG04MDAxX2Rldl9nb25lKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpOworaW50IHBtODAwMV9sdV9yZXNldChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCB1OCAqbHVuKTsKK2ludCBwbTgwMDFfSV9UX25leHVzX3Jlc2V0KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpOworaW50IHBtODAwMV9xdWVyeV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzayk7CitpbnQgcG04MDAxX21lbV9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqKnZpcnRfYWRkciwKKwlkbWFfYWRkcl90ICpwcGh5c19hZGRyLCB1MzIgKnBwaHlzX2FkZHJfaGksIHUzMiAqcHBoeXNfYWRkcl9sbywKKwl1MzIgbWVtX3NpemUsIHUzMiBhbGlnbik7CisKKworLyogY3RsIHNoYXJlZCBBUEkgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqcG04MDAxX2hvc3RfYXR0cnNbXTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMgYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCmluZGV4IDBhOTdiYzkuLjM0YzZiODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwpAQCAtMjc4LDEyICsyNzgsMTcgQEAKICAqIHBtY3JhaWRfY2hhbmdlX3F1ZXVlX2RlcHRoIC0gQ2hhbmdlIHRoZSBkZXZpY2UncyBxdWV1ZSBkZXB0aAogICogQHNjc2lfZGV2OiBzY3NpIGRldmljZSBzdHJ1Y3QKICAqIEBkZXB0aDogZGVwdGggdG8gc2V0CisgKiBAcmVhc29uOiBjYWxsaW5nIGNvbnRleHQKICAqCiAgKiBSZXR1cm4gdmFsdWUKICAqIAlhY3R1YWwgZGVwdGggc2V0CiAgKi8KLXN0YXRpYyBpbnQgcG1jcmFpZF9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldiwgaW50IGRlcHRoKQorc3RhdGljIGludCBwbWNyYWlkX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2LCBpbnQgZGVwdGgsCisJCQkJICAgICAgaW50IHJlYXNvbikKIHsKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChkZXB0aCA+IFBNQ1JBSURfTUFYX0NNRF9QRVJfTFVOKQogCQlkZXB0aCA9IFBNQ1JBSURfTUFYX0NNRF9QRVJfTFVOOwogCkBAIC0zMzQyLDcgKzMzNDcsNyBAQAogICogQGRpcmVjdGlvbiA6IGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uCiAgKgogICogUmV0dXJuIHZhbHVlCi0gKiAgMCBvbiBzdWNlc3MsIG5vbi16ZXJvIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICogIDAgb24gc3VjY2Vzcywgbm9uLXplcm8gZXJyb3IgY29kZSBvbiBmYWlsdXJlCiAgKi8KIHN0YXRpYyBpbnQgcG1jcmFpZF9idWlsZF9wYXNzdGhyb3VnaF9pb2FkbHMoCiAJc3RydWN0IHBtY3JhaWRfY21kICpjbWQsCkBAIC0zNDAxLDcgKzM0MDYsNyBAQAogICogQGRpcmVjdGlvbjogZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24KICAqCiAgKiBSZXR1cm4gdmFsdWUKLSAqICAwIG9uIHN1Y2Vzcywgbm9uLXplcm8gZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKiAgMCBvbiBzdWNjZXNzLCBub24temVybyBlcnJvciBjb2RlIG9uIGZhaWx1cmUKICAqLwogc3RhdGljIHZvaWQgcG1jcmFpZF9yZWxlYXNlX3Bhc3N0aHJvdWdoX2lvYWRscygKIAlzdHJ1Y3QgcG1jcmFpZF9jbWQgKmNtZCwKQEAgLTM0MjksNyArMzQzNCw3IEBACiAgKiBAYXJnOiBwb2ludGVyIHRvIHBtY3JhaWRfcGFzc3Rocm91Z2hfYnVmZmVyIHVzZXIgYnVmZmVyCiAgKgogICogUmV0dXJuIHZhbHVlCi0gKiAgMCBvbiBzdWNlc3MsIG5vbi16ZXJvIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICogIDAgb24gc3VjY2Vzcywgbm9uLXplcm8gZXJyb3IgY29kZSBvbiBmYWlsdXJlCiAgKi8KIHN0YXRpYyBsb25nIHBtY3JhaWRfaW9jdGxfcGFzc3Rocm91Z2goCiAJc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5oCmluZGV4IDM0NDFiM2YuLjI3NTJiNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmgKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuaApAQCAtNzcxLDExICs3NzEsMTEgQEAKIAl7MHgwMTE4MDYwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCiAJICJSZWNvdmVyZWQgRXJyb3IsIHNvZnQgbWVkaWEgZXJyb3IsIHNlY3RvciByZWFzc2lnbm1lbnQgc3VnZ2VzdGVkIn0sCiAJezB4MDE1RDAwMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAotCSAiUmVjb3ZlcmVkIEVycm9yLCBmYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNvbGQgZXhjZWVkZWQifSwKKwkgIlJlY292ZXJlZCBFcnJvciwgZmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCJ9LAogCXsweDAxNUQ5MjAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKLQkgIlJlY292ZXJlZCBFcnJvciwgc29mdCBDYWNoZSBDYXJkIEJhdHRlcnkgZXJyb3IgdGhyZXNvbGQifSwKKwkgIlJlY292ZXJlZCBFcnJvciwgc29mdCBDYWNoZSBDYXJkIEJhdHRlcnkgZXJyb3IgdGhyZXNob2xkIn0sCiAJezB4MDE1RDkyMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAotCSAiUmVjb3ZlcmVkIEVycm9yLCBzb2Z0IENhY2hlIENhcmQgQmF0dGVyeSBlcnJvciB0aHJlc29sZCJ9LAorCSAiUmVjb3ZlcmVkIEVycm9yLCBzb2Z0IENhY2hlIENhcmQgQmF0dGVyeSBlcnJvciB0aHJlc2hvbGQifSwKIAl7MHgwMjA0ODAwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCiAJICJOb3QgUmVhZHksIElPQSBSZXNldCBSZXF1aXJlZCJ9LAogCXsweDAyNDA4NTAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IGZiY2I4MmEuLjIxZTJiYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMTY1NCw3ICsxNjU0LDggQEAKIAkJCWZjX3Zwb3J0X3NldF9zdGF0ZShmY192cG9ydCwgRkNfVlBPUlRfTElOS0RPV04pOwogCX0KIAotCWlmIChzY3NpX2FkZF9ob3N0KHZoYS0+aG9zdCwgJmZjX3Zwb3J0LT5kZXYpKSB7CisJaWYgKHNjc2lfYWRkX2hvc3Rfd2l0aF9kbWEodmhhLT5ob3N0LCAmZmNfdnBvcnQtPmRldiwKKwkJCQkgICAmaGEtPnBkZXYtPmRldikpIHsKIAkJREVCVUcxNShwcmludGsoInNjc2koJWxkKTogc2NzaV9hZGRfaG9zdCBmYWlsdXJlIGZvciBWUFslZF0uXG4iLAogCQkJdmhhLT5ob3N0X25vLCB2aGEtPnZwX2lkeCkpOwogCQlnb3RvIHZwb3J0X2NyZWF0ZV9mYWlsZWRfMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCBjY2E4ZTRhLi5jYjJlY2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC0zNzcsNiArMzc3LDI0IEBACiAJcmV0dXJuIHB0ciArIHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbik7CiB9CiAKK3N0YXRpYyB2b2lkCitxbGEyeHh4X2R1bXBfcG9zdF9wcm9jZXNzKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQgcnZhbCkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpISEhXG4iLCBydmFsKTsKKwkJaGEtPmZ3X2R1bXBlZCA9IDA7CisJfSBlbHNlIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIkZpcm13YXJlIGR1bXAgc2F2ZWQgdG8gdGVtcCBidWZmZXIgKCVsZC8lcCkuXG4iLAorCQkgICAgdmhhLT5ob3N0X25vLCBoYS0+ZndfZHVtcCk7CisJCWhhLT5md19kdW1wZWQgPSAxOworCQlxbGEyeDAwX3Bvc3RfdWV2ZW50X3dvcmsodmhhLCBRTEFfVUVWRU5UX0NPREVfRldfRFVNUCk7CisJfQorfQorCiAvKioKICAqIHFsYTIzMDBfZndfZHVtcCgpIC0gRHVtcHMgYmluYXJ5IGRhdGEgZnJvbSB0aGUgMjMwMCBmaXJtd2FyZS4KICAqIEBoYTogSEEgY29udGV4dApAQCAtNTMwLDE3ICs1NDgsNyBAQAogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKQogCQlxbGEyeHh4X2NvcHlfcXVldWVzKGhhLCBueHQpOwogCi0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZhaWxlZCB0byBkdW1wIGZpcm13YXJlICgleCkhISFcbiIsIHJ2YWwpOwotCQloYS0+ZndfZHVtcGVkID0gMDsKLQotCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJGaXJtd2FyZSBkdW1wIHNhdmVkIHRvIHRlbXAgYnVmZmVyICglbGQvJXApLlxuIiwKLQkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBoYS0+ZndfZHVtcCk7Ci0JCWhhLT5md19kdW1wZWQgPSAxOwotCX0KKwlxbGEyeHh4X2R1bXBfcG9zdF9wcm9jZXNzKGJhc2VfdmhhLCBydmFsKTsKIAogcWxhMjMwMF9md19kdW1wX2ZhaWxlZDoKIAlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKQEAgLTczNywxNyArNzQ1LDcgQEAKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykKIAkJcWxhMnh4eF9jb3B5X3F1ZXVlcyhoYSwgJmZ3LT5yaXNjX3JhbVtjbnRdKTsKIAotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpISEhXG4iLCBydmFsKTsKLQkJaGEtPmZ3X2R1bXBlZCA9IDA7Ci0KLQl9IGVsc2UgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOwotCQloYS0+ZndfZHVtcGVkID0gMTsKLQl9CisJcWxhMnh4eF9kdW1wX3Bvc3RfcHJvY2VzcyhiYXNlX3ZoYSwgcnZhbCk7CiAKIHFsYTIxMDBfZndfZHVtcF9mYWlsZWQ6CiAJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCkBAIC05ODQsMTcgKzk4Miw3IEBACiAJcWxhMjR4eF9jb3B5X2VmdChoYSwgbnh0KTsKIAogcWxhMjR4eF9md19kdW1wX2ZhaWxlZF8wOgotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpISEhXG4iLCBydmFsKTsKLQkJaGEtPmZ3X2R1bXBlZCA9IDA7Ci0KLQl9IGVsc2UgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOwotCQloYS0+ZndfZHVtcGVkID0gMTsKLQl9CisJcWxhMnh4eF9kdW1wX3Bvc3RfcHJvY2VzcyhiYXNlX3ZoYSwgcnZhbCk7CiAKIHFsYTI0eHhfZndfZHVtcF9mYWlsZWQ6CiAJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCkBAIC0xMzA1LDE3ICsxMjkzLDcgQEAKIAl9CiAKIHFsYTI1eHhfZndfZHVtcF9mYWlsZWRfMDoKLQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmFpbGVkIHRvIGR1bXAgZmlybXdhcmUgKCV4KSEhIVxuIiwgcnZhbCk7Ci0JCWhhLT5md19kdW1wZWQgPSAwOwotCi0JfSBlbHNlIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIkZpcm13YXJlIGR1bXAgc2F2ZWQgdG8gdGVtcCBidWZmZXIgKCVsZC8lcCkuXG4iLAotCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKLQkJaGEtPmZ3X2R1bXBlZCA9IDE7Ci0JfQorCXFsYTJ4eHhfZHVtcF9wb3N0X3Byb2Nlc3MoYmFzZV92aGEsIHJ2YWwpOwogCiBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkOgogCWlmICghaGFyZHdhcmVfbG9ja2VkKQpAQCAtMTYyOCwxNyArMTYwNiw3IEBACiAJfQogCiBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkXzA6Ci0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZhaWxlZCB0byBkdW1wIGZpcm13YXJlICgleCkhISFcbiIsIHJ2YWwpOwotCQloYS0+ZndfZHVtcGVkID0gMDsKLQotCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJGaXJtd2FyZSBkdW1wIHNhdmVkIHRvIHRlbXAgYnVmZmVyICglbGQvJXApLlxuIiwKLQkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBoYS0+ZndfZHVtcCk7Ci0JCWhhLT5md19kdW1wZWQgPSAxOwotCX0KKwlxbGEyeHh4X2R1bXBfcG9zdF9wcm9jZXNzKGJhc2VfdmhhLCBydmFsKTsKIAogcWxhODF4eF9md19kdW1wX2ZhaWxlZDoKIAlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAppbmRleCAyMTUwNjE4Li42YjliZjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC0yMTIzLDYgKzIxMjMsNyBAQAogCVFMQV9FVlRfQVNZTkNfTE9HSU5fRE9ORSwKIAlRTEFfRVZUX0FTWU5DX0xPR09VVCwKIAlRTEFfRVZUX0FTWU5DX0xPR09VVF9ET05FLAorCVFMQV9FVlRfVUVWRU5ULAogfTsKIAogCkBAIC0yMTQ2LDYgKzIxNDcsMTAgQEAKICNkZWZpbmUgUUxBX0xPR0lPX0xPR0lOX1JFVFJJRUQJQklUXzAKIAkJCXUxNiBkYXRhWzJdOwogCQl9IGxvZ2lvOworCQlzdHJ1Y3QgeworCQkJdTMyIGNvZGU7CisjZGVmaW5lIFFMQV9VRVZFTlRfQ09ERV9GV19EVU1QCTAKKwkJfSB1ZXZlbnQ7CiAJfSB1OwogfTsKIApAQCAtMjQzNSwxMSArMjQ0MCwxMSBAQAogCWRtYV9hZGRyX3QJZWRjX2RhdGFfZG1hOwogCXVpbnQxNl90CWVkY19kYXRhX2xlbjsKIAotI2RlZmluZSBYR01BQ19EQVRBX1NJWkUJUEFHRV9TSVpFCisjZGVmaW5lIFhHTUFDX0RBVEFfU0laRQk0MDk2CiAJdm9pZAkJKnhnbWFjX2RhdGE7CiAJZG1hX2FkZHJfdAl4Z21hY19kYXRhX2RtYTsKIAotI2RlZmluZSBEQ0JYX1RMVl9EQVRBX1NJWkUgUEFHRV9TSVpFCisjZGVmaW5lIERDQlhfVExWX0RBVEFfU0laRSA0MDk2CiAJdm9pZAkJKmRjYnhfdGx2OwogCWRtYV9hZGRyX3QJZGNieF90bHZfZG1hOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggZjNkMWQxYS4uZTIxODUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtOTIsNiArOTIsNyBAQAogICAgIHVpbnQxNl90ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX3Bvc3RfYXN5bmNfbG9nb3V0X2RvbmVfd29yayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLAogICAgIGZjX3BvcnRfdCAqLCB1aW50MTZfdCAqKTsKK2V4dGVybiBpbnQgcWxhMngwMF9wb3N0X3VldmVudF93b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHUzMik7CiAKIGV4dGVybiBpbnQgcWxhODF4eF9yZXN0YXJ0X21waV9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKik7CiAKQEAgLTI0Niw3ICsyNDcsNyBAQAogCiBleHRlcm4gaW50CiBxbGEyeDAwX2dldF9yZXNvdXJjZV9jbnRzKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqLCB1aW50MTZfdCAqLAotICAgIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICopOworICAgIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICopOwogCiBleHRlcm4gaW50CiBxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcChzY3NpX3FsYV9ob3N0X3QgKmhhLCBjaGFyICpwb3NfbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IDllM2VhYWMuLmI3NDkyNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtMjc3LDcgKzI3Nyw2IEBACiAJdmhhLT5tYXJrZXJfbmVlZGVkID0gMDsKIAloYS0+aXNwX2Fib3J0X2NudCA9IDA7CiAJaGEtPmJlYWNvbl9ibGlua19sZWQgPSAwOwotCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAKIAlzZXRfYml0KDAsIGhhLT5yZXFfcWlkX21hcCk7CiAJc2V0X2JpdCgwLCBoYS0+cnNwX3FpZF9tYXApOwpAQCAtMTIwMyw3ICsxMjAyLDcgQEAKIAkJCQl9CiAJCQkJcWxhMngwMF9nZXRfcmVzb3VyY2VfY250cyh2aGEsIE5VTEwsCiAJCQkJICAgICZoYS0+ZndfeGNiX2NvdW50LCBOVUxMLCBOVUxMLAotCQkJCSAgICAmaGEtPm1heF9ucGl2X3Zwb3J0cyk7CisJCQkJICAgICZoYS0+bWF4X25waXZfdnBvcnRzLCBOVUxMKTsKIAogCQkJCWlmICghZndfbWFqb3JfdmVyc2lvbiAmJiBxbDJ4YWxsb2Nmd2R1bXApCiAJCQkJCXFsYTJ4MDBfYWxsb2NfZndfZHVtcCh2aGEpOwpAQCAtMzU3Myw2ICszNTcyLDE1IEBACiAJCQloYS0+aXNwX2Fib3J0X2NudCA9IDA7CiAJCQljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpOwogCisJCQlpZiAoSVNfUUxBODFYWChoYSkpCisJCQkJcWxhMngwMF9nZXRfZndfdmVyc2lvbih2aGEsCisJCQkJICAgICZoYS0+ZndfbWFqb3JfdmVyc2lvbiwKKwkJCQkgICAgJmhhLT5md19taW5vcl92ZXJzaW9uLAorCQkJCSAgICAmaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sCisJCQkJICAgICZoYS0+ZndfYXR0cmlidXRlcywgJmhhLT5md19tZW1vcnlfc2l6ZSwKKwkJCQkgICAgaGEtPm1waV92ZXJzaW9uLCAmaGEtPm1waV9jYXBhYmlsaXRpZXMsCisJCQkJICAgIGhhLT5waHlfdmVyc2lvbik7CisKIAkJCWlmIChoYS0+ZmNlKSB7CiAJCQkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMTsKIAkJCQltZW1zZXQoaGEtPmZjZSwgMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwppbmRleCBiMjBhNzE2Li44MDQ5ODczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCkBAIC0zMTMsMTAgKzMxMywxMSBAQAogCXN0YXRpYyBjaGFyCSpsaW5rX3NwZWVkc1tdID0geyAiMSIsICIyIiwgIj8iLCAiNCIsICI4IiwgIjEwIiB9OwogCWNoYXIJCSpsaW5rX3NwZWVkOwogCXVpbnQxNl90CWhhbmRsZV9jbnQ7Ci0JdWludDE2X3QJY250OworCXVpbnQxNl90CWNudCwgbWJ4OwogCXVpbnQzMl90CWhhbmRsZXNbNV07CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnMjQgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAJdWludDMyX3QJcnNjbl9lbnRyeSwgaG9zdF9waWQ7CiAJdWludDhfdAkJcnNjbl9xdWV1ZV9pbmRleDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwpAQCAtMzk1LDkgKzM5NiwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgTUJBX1NZU1RFTV9FUlI6CQkvKiBTeXN0ZW0gRXJyb3IgKi8KKwkJbWJ4ID0gSVNfUUxBODFYWChoYSkgPyBSRF9SRUdfV09SRCgmcmVnMjQtPm1haWxib3g3KSA6IDA7CiAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJJU1AgU3lzdGVtIEVycm9yIC0gbWJ4MT0leGggbWJ4Mj0leGggbWJ4Mz0leGguXG4iLAotCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CisJCSAgICAiSVNQIFN5c3RlbSBFcnJvciAtIG1ieDE9JXhoIG1ieDI9JXhoIG1ieDM9JXhoICIKKwkJICAgICJtYng3PSV4aC5cbiIsIG1iWzFdLCBtYlsyXSwgbWJbM10sIG1ieCk7CiAKIAkJaGEtPmlzcF9vcHMtPmZ3X2R1bXAodmhhLCAxKTsKIApAQCAtNDE5LDkgKzQyMSwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgTUJBX1JFUV9UUkFOU0ZFUl9FUlI6CS8qIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IgKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvci5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSVNQIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IuXG4iKTsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvciAoJXgpLlxuIiwKKwkJICAgIHZoYS0+aG9zdF9ubywgbWJbMV0pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIklTUCBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yICgleCkuXG4iLCBtYlsxXSk7CiAKIAkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKQEAgLTQ4NSwxMCArNDg4LDEzIEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfTE9PUF9ET1dOOgkJLyogTG9vcCBEb3duIEV2ZW50ICovCisJCW1ieCA9IElTX1FMQTgxWFgoaGEpID8gUkRfUkVHX1dPUkQoJnJlZzI0LT5tYWlsYm94NCkgOiAwOwogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBMT09QIERPV04gIgotCQkgICAgIigleCAleCAleCkuXG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTE9PUCBET1dOIGRldGVjdGVkICgleCAleCAleCkuXG4iLAotCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CisJCSAgICAiKCV4ICV4ICV4ICV4KS5cbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSwKKwkJICAgIG1ieCkpOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiTE9PUCBET1dOIGRldGVjdGVkICgleCAleCAleCAleCkuXG4iLCBtYlsxXSwgbWJbMl0sIG1iWzNdLAorCQkgICAgbWJ4KTsKIAogCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CiAJCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CkBAIC0xMzQ3LDE2ICsxMzUzLDIyIEBACiAKIAlzZW5zZV9sZW4gPSByc3BfaW5mb19sZW4gPSByZXNpZF9sZW4gPSBmd19yZXNpZF9sZW4gPSAwOwogCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCXNlbnNlX2xlbiA9IGxlMzJfdG9fY3B1KHN0czI0LT5zZW5zZV9sZW4pOwotCQlyc3BfaW5mb19sZW4gPSBsZTMyX3RvX2NwdShzdHMyNC0+cnNwX2RhdGFfbGVuKTsKLQkJcmVzaWRfbGVuID0gbGUzMl90b19jcHUoc3RzMjQtPnJzcF9yZXNpZHVhbF9jb3VudCk7Ci0JCWZ3X3Jlc2lkX2xlbiA9IGxlMzJfdG9fY3B1KHN0czI0LT5yZXNpZHVhbF9sZW4pOworCQlpZiAoc2NzaV9zdGF0dXMgJiBTU19TRU5TRV9MRU5fVkFMSUQpCisJCQlzZW5zZV9sZW4gPSBsZTMyX3RvX2NwdShzdHMyNC0+c2Vuc2VfbGVuKTsKKwkJaWYgKHNjc2lfc3RhdHVzICYgU1NfUkVTUE9OU0VfSU5GT19MRU5fVkFMSUQpCisJCQlyc3BfaW5mb19sZW4gPSBsZTMyX3RvX2NwdShzdHMyNC0+cnNwX2RhdGFfbGVuKTsKKwkJaWYgKHNjc2lfc3RhdHVzICYgKFNTX1JFU0lEVUFMX1VOREVSIHwgU1NfUkVTSURVQUxfT1ZFUikpCisJCQlyZXNpZF9sZW4gPSBsZTMyX3RvX2NwdShzdHMyNC0+cnNwX3Jlc2lkdWFsX2NvdW50KTsKKwkJaWYgKGNvbXBfc3RhdHVzID09IENTX0RBVEFfVU5ERVJSVU4pCisJCQlmd19yZXNpZF9sZW4gPSBsZTMyX3RvX2NwdShzdHMyNC0+cmVzaWR1YWxfbGVuKTsKIAkJcnNwX2luZm8gPSBzdHMyNC0+ZGF0YTsKIAkJc2Vuc2VfZGF0YSA9IHN0czI0LT5kYXRhOwogCQlob3N0X3RvX2ZjcF9zd2FwKHN0czI0LT5kYXRhLCBzaXplb2Yoc3RzMjQtPmRhdGEpKTsKIAl9IGVsc2UgewotCQlzZW5zZV9sZW4gPSBsZTE2X3RvX2NwdShzdHMtPnJlcV9zZW5zZV9sZW5ndGgpOwotCQlyc3BfaW5mb19sZW4gPSBsZTE2X3RvX2NwdShzdHMtPnJzcF9pbmZvX2xlbik7CisJCWlmIChzY3NpX3N0YXR1cyAmIFNTX1NFTlNFX0xFTl9WQUxJRCkKKwkJCXNlbnNlX2xlbiA9IGxlMTZfdG9fY3B1KHN0cy0+cmVxX3NlbnNlX2xlbmd0aCk7CisJCWlmIChzY3NpX3N0YXR1cyAmIFNTX1JFU1BPTlNFX0lORk9fTEVOX1ZBTElEKQorCQkJcnNwX2luZm9fbGVuID0gbGUxNl90b19jcHUoc3RzLT5yc3BfaW5mb19sZW4pOwogCQlyZXNpZF9sZW4gPSBsZTMyX3RvX2NwdShzdHMtPnJlc2lkdWFsX2xlbmd0aCk7CiAJCXJzcF9pbmZvID0gc3RzLT5yc3BfaW5mbzsKIAkJc2Vuc2VfZGF0YSA9IHN0cy0+cmVxX3NlbnNlX2RhdGE7CkBAIC0xNDQzLDM4ICsxNDU1LDYyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBDU19EQVRBX1VOREVSUlVOOgotCQlyZXNpZCA9IHJlc2lkX2xlbjsKKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICJzY3NpKCVsZDolZDolZCkgVU5ERVJSVU4gc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleC4gIgorCQkgICAgInJlc2lkPTB4JXggZndfcmVzaWQ9MHgleCBjZGI9MHgleCBvc191bmRlcmZsb3c9MHgleFxuIiwKKwkJICAgIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwgY29tcF9zdGF0dXMsCisJCSAgICBzY3NpX3N0YXR1cywgcmVzaWRfbGVuLCBmd19yZXNpZF9sZW4sIGNwLT5jbW5kWzBdLAorCQkgICAgY3AtPnVuZGVyZmxvdykpOworCiAJCS8qIFVzZSBGL1cgY2FsY3VsYXRlZCByZXNpZHVhbCBsZW5ndGguICovCi0JCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCQlpZiAoIShzY3NpX3N0YXR1cyAmIFNTX1JFU0lEVUFMX1VOREVSKSkgewotCQkJCWxzY3NpX3N0YXR1cyA9IDA7Ci0JCQl9IGVsc2UgaWYgKHJlc2lkICE9IGZ3X3Jlc2lkX2xlbikgewotCQkJCXNjc2lfc3RhdHVzICY9IH5TU19SRVNJRFVBTF9VTkRFUjsKLQkJCQlsc2NzaV9zdGF0dXMgPSAwOwotCQkJfQotCQkJcmVzaWQgPSBmd19yZXNpZF9sZW47Ci0JCX0KLQorCQlyZXNpZCA9IElTX0ZXSTJfQ0FQQUJMRShoYSkgPyBmd19yZXNpZF9sZW4gOiByZXNpZF9sZW47CisJCXNjc2lfc2V0X3Jlc2lkKGNwLCByZXNpZCk7CiAJCWlmIChzY3NpX3N0YXR1cyAmIFNTX1JFU0lEVUFMX1VOREVSKSB7Ci0JCQlzY3NpX3NldF9yZXNpZChjcCwgcmVzaWQpOwotCQl9IGVsc2UgewotCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQ6JWQ6JWQpIFVOREVSUlVOIHN0YXR1cyBkZXRlY3RlZCAiCi0JCQkgICAgIjB4JXgtMHgleC4gcmVzaWQ9MHgleCBmd19yZXNpZD0weCV4IGNkYj0weCV4ICIKLQkJCSAgICAib3NfdW5kZXJmbG93PTB4JXhcbiIsIHZoYS0+aG9zdF9ubywKLQkJCSAgICBjcC0+ZGV2aWNlLT5pZCwgY3AtPmRldmljZS0+bHVuLCBjb21wX3N0YXR1cywKLQkJCSAgICBzY3NpX3N0YXR1cywgcmVzaWRfbGVuLCByZXNpZCwgY3AtPmNtbmRbMF0sCi0JCQkgICAgY3AtPnVuZGVyZmxvdykpOworCQkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkgJiYgZndfcmVzaWRfbGVuICE9IHJlc2lkX2xlbikgeworCQkJCURFQlVHMihwcmludGsoCisJCQkJICAgICJzY3NpKCVsZDolZDolZDolZCkgRHJvcHBlZCBmcmFtZShzKSAiCisJCQkJICAgICJkZXRlY3RlZCAoJXggb2YgJXggYnl0ZXMpLi4ucmVzaWR1YWwgIgorCQkJCSAgICAibGVuZ3RoIG1pc21hdGNoLi4ucmV0cnlpbmcgY29tbWFuZC5cbiIsCisJCQkJICAgIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+Y2hhbm5lbCwKKwkJCQkgICAgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwgcmVzaWQsCisJCQkJICAgIHNjc2lfYnVmZmxlbihjcCkpKTsKIAorCQkJCWNwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfCBsc2NzaV9zdGF0dXM7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghbHNjc2lfc3RhdHVzICYmCisJCQkgICAgKCh1bnNpZ25lZCkoc2NzaV9idWZmbGVuKGNwKSAtIHJlc2lkKSA8CisJCQkgICAgY3AtPnVuZGVyZmxvdykpIHsKKwkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAgICJzY3NpKCVsZDolZDolZDolZCk6IE1pZC1sYXllciB1bmRlcmZsb3cgIgorCQkJCSAgICAiZGV0ZWN0ZWQgKCV4IG9mICV4IGJ5dGVzKS4uLnJldHVybmluZyAiCisJCQkJICAgICJlcnJvciBzdGF0dXMuXG4iLCB2aGEtPmhvc3Rfbm8sCisJCQkJICAgIGNwLT5kZXZpY2UtPmNoYW5uZWwsIGNwLT5kZXZpY2UtPmlkLAorCQkJCSAgICBjcC0+ZGV2aWNlLT5sdW4sIHJlc2lkLCBzY3NpX2J1ZmZsZW4oY3ApKTsKKworCQkJCWNwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoIWxzY3NpX3N0YXR1cykgeworCQkJREVCVUcyKHByaW50aygKKwkJCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpIERyb3BwZWQgZnJhbWUocykgZGV0ZWN0ZWQgIgorCQkJICAgICIoJXggb2YgJXggYnl0ZXMpLi4uZmlybXdhcmUgcmVwb3J0ZWQgdW5kZXJydW4uLi4iCisJCQkgICAgInJldHJ5aW5nIGNvbW1hbmQuXG4iLCB2aGEtPmhvc3Rfbm8sCisJCQkgICAgY3AtPmRldmljZS0+Y2hhbm5lbCwgY3AtPmRldmljZS0+aWQsCisJCQkgICAgY3AtPmRldmljZS0+bHVuLCByZXNpZCwgc2NzaV9idWZmbGVuKGNwKSkpOworCisJCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJYnJlYWs7CiAJCX0KIAorCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgbHNjc2lfc3RhdHVzOworCiAJCS8qCiAJCSAqIENoZWNrIHRvIHNlZSBpZiBTQ1NJIFN0YXR1cyBpcyBub24gemVyby4gSWYgc28gcmVwb3J0IFNDU0kKIAkJICogU3RhdHVzLgogCQkgKi8KIAkJaWYgKGxzY3NpX3N0YXR1cyAhPSAwKSB7Ci0JCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgbHNjc2lfc3RhdHVzOwotCiAJCQlpZiAobHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKIAkJCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwogCQkJCSAgICAic2NzaSglbGQpOiBRVUVVRSBGVUxMIHN0YXR1cyBkZXRlY3RlZCAiCkBAIC0xNTAxLDQyICsxNTM3LDYgQEAKIAkJCQlicmVhazsKIAogCQkJcWxhMngwMF9oYW5kbGVfc2Vuc2Uoc3AsIHNlbnNlX2RhdGEsIHNlbnNlX2xlbiwgcnNwKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJZiBSSVNDIHJlcG9ydHMgdW5kZXJydW4gYW5kIHRhcmdldCBkb2VzIG5vdCByZXBvcnQKLQkJCSAqIGl0IHRoZW4gd2UgbXVzdCBoYXZlIGEgbG9zdCBmcmFtZSwgc28gdGVsbCB1cHBlcgotCQkJICogbGF5ZXIgdG8gcmV0cnkgaXQgYnkgcmVwb3J0aW5nIGFuIGVycm9yLgotCQkJICovCi0JCQlpZiAoIShzY3NpX3N0YXR1cyAmIFNTX1JFU0lEVUFMX1VOREVSKSkgewotCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkOiVkOiVkOiVkKSBEcm9wcGVkICIKLQkJCQkJICAgICAgImZyYW1lKHMpIGRldGVjdGVkICgleCBvZiAleCBieXRlcykuLi4iCi0JCQkJCSAgICAgICJyZXRyeWluZyBjb21tYW5kLlxuIiwKLQkJCQkJdmhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5jaGFubmVsLAotCQkJCQljcC0+ZGV2aWNlLT5pZCwgY3AtPmRldmljZS0+bHVuLCByZXNpZCwKLQkJCQkJc2NzaV9idWZmbGVuKGNwKSkpOwotCi0JCQkJc2NzaV9zZXRfcmVzaWQoY3AsIHJlc2lkKTsKLQkJCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBIYW5kbGUgbWlkLWxheWVyIHVuZGVyZmxvdyAqLwotCQkJaWYgKCh1bnNpZ25lZCkoc2NzaV9idWZmbGVuKGNwKSAtIHJlc2lkKSA8Ci0JCQkgICAgY3AtPnVuZGVyZmxvdykgewotCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkJICAgInNjc2koJWxkOiVkOiVkOiVkKTogTWlkLWxheWVyIHVuZGVyZmxvdyAiCi0JCQkJCSAgICJkZXRlY3RlZCAoJXggb2YgJXggYnl0ZXMpLi4ucmV0dXJuaW5nICIKLQkJCQkJICAgImVycm9yIHN0YXR1cy5cbiIsIHZoYS0+aG9zdF9ubywKLQkJCQkJICAgY3AtPmRldmljZS0+Y2hhbm5lbCwgY3AtPmRldmljZS0+aWQsCi0JCQkJCSAgIGNwLT5kZXZpY2UtPmx1biwgcmVzaWQsCi0JCQkJCSAgIHNjc2lfYnVmZmxlbihjcCkpOwotCi0JCQkJY3AtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogRXZlcnlib2R5IG9ubGluZSwgbG9va2luZyBnb29kLi4uICovCi0JCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OwogCQl9CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKaW5kZXggYjYyMDJmZS4uMDVkNTk1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpAQCAtMjAwNiw3ICsyMDA2LDcgQEAKIGludAogcWxhMngwMF9nZXRfcmVzb3VyY2VfY250cyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgKmN1cl94Y2hnX2NudCwKICAgICB1aW50MTZfdCAqb3JpZ194Y2hnX2NudCwgdWludDE2X3QgKmN1cl9pb2NiX2NudCwKLSAgICB1aW50MTZfdCAqb3JpZ19pb2NiX2NudCwgdWludDE2X3QgKm1heF9ucGl2X3Zwb3J0cykKKyAgICB1aW50MTZfdCAqb3JpZ19pb2NiX2NudCwgdWludDE2X3QgKm1heF9ucGl2X3Zwb3J0cywgdWludDE2X3QgKm1heF9mY2ZzKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKQEAgLTIwMTcsNiArMjAxNyw4IEBACiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfUkVTT1VSQ0VfQ09VTlRTOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF8xMXxNQlhfMTB8TUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJaWYgKElTX1FMQTgxWFgodmhhLT5odykpCisJCW1jcC0+aW5fbWIgfD0gTUJYXzEyOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CkBAIC0yMDI3LDkgKzIwMjksMTAgQEAKIAkJICAgIHZoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOwogCX0gZWxzZSB7CiAJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLiBtYjE9JXggbWIyPSV4IG1iMz0leCBtYjY9JXggIgotCQkgICAgIm1iNz0leCBtYjEwPSV4IG1iMTE9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkgICAgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSwgbWNwLT5tYlszXSwgbWNwLT5tYls2XSwgbWNwLT5tYls3XSwKLQkJICAgIG1jcC0+bWJbMTBdLCBtY3AtPm1iWzExXSkpOworCQkgICAgIm1iNz0leCBtYjEwPSV4IG1iMTE9JXggbWIxMj0leC5cbiIsIF9fZnVuY19fLAorCQkgICAgdmhhLT5ob3N0X25vLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLCBtY3AtPm1iWzNdLAorCQkgICAgbWNwLT5tYls2XSwgbWNwLT5tYls3XSwgbWNwLT5tYlsxMF0sIG1jcC0+bWJbMTFdLAorCQkgICAgbWNwLT5tYlsxMl0pKTsKIAogCQlpZiAoY3VyX3hjaGdfY250KQogCQkJKmN1cl94Y2hnX2NudCA9IG1jcC0+bWJbM107CkBAIC0yMDQxLDYgKzIwNDQsOCBAQAogCQkJKm9yaWdfaW9jYl9jbnQgPSBtY3AtPm1iWzEwXTsKIAkJaWYgKHZoYS0+aHctPmZsYWdzLm5waXZfc3VwcG9ydGVkICYmIG1heF9ucGl2X3Zwb3J0cykKIAkJCSptYXhfbnBpdl92cG9ydHMgPSBtY3AtPm1iWzExXTsKKwkJaWYgKElTX1FMQTgxWFgodmhhLT5odykgJiYgbWF4X2ZjZnMpCisJCQkqbWF4X2ZjZnMgPSBtY3AtPm1iWzEyXTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMjMxMyw2ICsyMzE4LDcgQEAKIHsKIAlpbnQJCXJ2YWwsIHJ2YWwyOwogCXN0cnVjdCB0c2tfbWdtdF9jbWQgKnRzazsKKwlzdHJ1Y3Qgc3RzX2VudHJ5XzI0eHggKnN0czsKIAlkbWFfYWRkcl90CXRza19kbWE7CiAJc2NzaV9xbGFfaG9zdF90ICp2aGE7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYTsKQEAgLTIzNTIsMjAgKzIzNTgsMzcgQEAKIAkJICAgIHNpemVvZih0c2stPnAudHNrLmx1bikpOwogCX0KIAorCXN0cyA9ICZ0c2stPnAuc3RzOwogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCB0c2ssIHRza19kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlICVzIFJlc2V0IElPQ0IgIgogCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBuYW1lLCBydmFsKSk7Ci0JfSBlbHNlIGlmICh0c2stPnAuc3RzLmVudHJ5X3N0YXR1cyAhPSAwKSB7CisJfSBlbHNlIGlmIChzdHMtPmVudHJ5X3N0YXR1cyAhPSAwKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgogCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJICAgIHRzay0+cC5zdHMuZW50cnlfc3RhdHVzKSk7CisJCSAgICBzdHMtPmVudHJ5X3N0YXR1cykpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQl9IGVsc2UgaWYgKHRzay0+cC5zdHMuY29tcF9zdGF0dXMgIT0KKwl9IGVsc2UgaWYgKHN0cy0+Y29tcF9zdGF0dXMgIT0KIAkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihDU19DT01QTEVURSkpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCiAJCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBsZTE2X3RvX2NwdSh0c2stPnAuc3RzLmNvbXBfc3RhdHVzKSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBsZTE2X3RvX2NwdShzdHMtPmNvbXBfc3RhdHVzKSkpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgaWYgKCEobGUxNl90b19jcHUoc3RzLT5zY3NpX3N0YXR1cykgJgorCSAgICBTU19SRVNQT05TRV9JTkZPX0xFTl9WQUxJRCkpIHsKKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCisJCSAgICAiLS0gbm8gcmVzcG9uc2UgaW5mbyAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKKwkJICAgIGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpKSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSBpZiAobGUzMl90b19jcHUoc3RzLT5yc3BfZGF0YV9sZW4pIDwgNCkgeworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKKwkJICAgICItLSBub3QgZW5vdWdoIHJlc3BvbnNlIGluZm8gKCVkKS5cbiIsIF9fZnVuY19fLAorCQkgICAgdmhhLT5ob3N0X25vLCBsZTMyX3RvX2NwdShzdHMtPnJzcF9kYXRhX2xlbikpKTsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIGlmIChzdHMtPmRhdGFbM10pIHsKKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCisJCSAgICAiLS0gcmVzcG9uc2UgKCV4KS5cbiIsIF9fZnVuY19fLAorCQkgICAgdmhhLT5ob3N0X25vLCBzdHMtPmRhdGFbM10pKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCkBAIC0yNzU5LDggKzI3ODIsMTAgQEAKIAkJICAgIHZwX2lkeCwgTVNCKHN0YXQpLAogCQkgICAgcnB0aWRfZW50cnktPnBvcnRfaWRbMl0sIHJwdGlkX2VudHJ5LT5wb3J0X2lkWzFdLAogCQkgICAgcnB0aWRfZW50cnktPnBvcnRfaWRbMF0pKTsKLQkJaWYgKHZwX2lkeCA9PSAwKQotCQkJcmV0dXJuOworCisJCXZwID0gdmhhOworCQlpZiAodnBfaWR4ID09IDAgJiYgKE1TQihzdGF0KSAhPSAxKSkKKwkJCWdvdG8gcmVnX25lZWRlZDsKIAogCQlpZiAoTVNCKHN0YXQpID09IDEpIHsKIAkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQ291bGQgbm90IGFjcXVpcmUgSUQgZm9yICIKQEAgLTI3ODMsOCArMjgwOCwxMSBAQAogCQkgKiByZXNwb25zZSBxdWV1ZS4gSGFuZGxlIGl0IGluIGRwYyBjb250ZXh0LgogCQkgKi8KIAkJc2V0X2JpdChWUF9JRFhfQUNRVUlSRUQsICZ2cC0+dnBfZmxhZ3MpOwotCQlzZXRfYml0KFZQX0RQQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAKK3JlZ19uZWVkZWQ6CisJCXNldF9iaXQoUkVHSVNURVJfRkM0X05FRURFRCwgJnZwLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KFJFR0lTVEVSX0ZETUlfTkVFREVELCAmdnAtPmRwY19mbGFncyk7CisJCXNldF9iaXQoVlBfRFBDX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwppbmRleCBlMDdiMzYxLi5hNDdkMzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCkBAIC0zODIsOCArMzgyLDYgQEAKIAl2aGEtPm1nbXRfc3ZyX2xvb3BfaWQgPSAxMCArIHZoYS0+dnBfaWR4OwogCiAJdmhhLT5kcGNfZmxhZ3MgPSAwTDsKLQlzZXRfYml0KFJFR0lTVEVSX0ZETUlfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwotCXNldF9iaXQoUkVHSVNURVJfRkM0X05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAogCS8qCiAJICogVG8gZml4IHRoZSBpc3N1ZSBvZiBwcm9jZXNzaW5nIGEgcGFyZW50J3MgUlNDTiBmb3IgdGhlIHZwb3J0IGJlZm9yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCBiNzlmY2E3Li40MTY2OTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgpAQCAtMTM3LDcgKzEzOCw3IEBACiBzdGF0aWMgaW50IHFsYTJ4eHhfZWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CiBzdGF0aWMgaW50IHFsYTJ4eHhfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCi1zdGF0aWMgaW50IHFsYTJ4MDBfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqLCBpbnQpOworc3RhdGljIGludCBxbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgaW50LCBpbnQpOwogc3RhdGljIGludCBxbGEyeDAwX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqLCBpbnQpOwogCiBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHFsYTJ4eHhfZHJpdmVyX3RlbXBsYXRlID0gewpAQCAtNzI3LDIzICs3MjgsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkCi1xbGEyeDAwX2Jsb2NrX2Vycm9yX2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21uZCkKLXsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChjbW5kLT5kZXZpY2UpKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXdoaWxlIChycG9ydC0+cG9ydF9zdGF0ZSA9PSBGQ19QT1JUU1RBVEVfQkxPQ0tFRCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJbXNsZWVwKDEwMDApOwotCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybjsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIHFsYTJ4eHhfZWhfYWJvcnQKICoKQEAgLTc3Myw3ICs3NTcsNyBAQAogCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPnJlcTsKIAlzcmJfdCAqc3B0OwogCi0JcWxhMngwMF9ibG9ja19lcnJvcl9oYW5kbGVyKGNtZCk7CisJZmNfYmxvY2tfc2NzaV9laChjbWQpOwogCiAJaWYgKCFDTURfU1AoY21kKSkKIAkJcmV0dXJuIFNVQ0NFU1M7CkBAIC05MDQsNyArODg4LDcgQEAKIAlmY19wb3J0X3QgKmZjcG9ydCA9IChzdHJ1Y3QgZmNfcG9ydCAqKSBjbWQtPmRldmljZS0+aG9zdGRhdGE7CiAJaW50IGVycjsKIAotCXFsYTJ4MDBfYmxvY2tfZXJyb3JfaGFuZGxlcihjbWQpOworCWZjX2Jsb2NrX3Njc2lfZWgoY21kKTsKIAogCWlmICghZmNwb3J0KQogCQlyZXR1cm4gRkFJTEVEOwpAQCAtOTg0LDcgKzk2OCw3IEBACiAJdW5zaWduZWQgbG9uZyBzZXJpYWw7CiAJc3JiX3QgKnNwID0gKHNyYl90ICopIENNRF9TUChjbWQpOwogCi0JcWxhMngwMF9ibG9ja19lcnJvcl9oYW5kbGVyKGNtZCk7CisJZmNfYmxvY2tfc2NzaV9laChjbWQpOwogCiAJaWQgPSBjbWQtPmRldmljZS0+aWQ7CiAJbHVuID0gY21kLT5kZXZpY2UtPmx1bjsKQEAgLTEwNDcsNyArMTAzMSw3IEBACiAJc3JiX3QgKnNwID0gKHNyYl90ICopIENNRF9TUChjbWQpOwogCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCi0JcWxhMngwMF9ibG9ja19lcnJvcl9oYW5kbGVyKGNtZCk7CisJZmNfYmxvY2tfc2NzaV9laChjbWQpOwogCiAJaWQgPSBjbWQtPmRldmljZS0+aWQ7CiAJbHVuID0gY21kLT5kZXZpY2UtPmx1bjsKQEAgLTEyMzQsOCArMTIxOCwxMSBAQAogfQogCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgpCitxbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgsIGludCByZWFzb24pCiB7CisJaWYgKHJlYXNvbiAhPSBTQ1NJX1FERVBUSF9ERUZBVUxUKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgcWRlcHRoKTsKIAlyZXR1cm4gc2Rldi0+cXVldWVfZGVwdGg7CiB9CkBAIC0yNjUzLDYgKzI2NDAsMzcgQEAKIHFsYTJ4MDBfcG9zdF9hc3luY193b3JrKGxvZ291dCwgUUxBX0VWVF9BU1lOQ19MT0dPVVQpOwogcWxhMngwMF9wb3N0X2FzeW5jX3dvcmsobG9nb3V0X2RvbmUsIFFMQV9FVlRfQVNZTkNfTE9HT1VUX0RPTkUpOwogCitpbnQKK3FsYTJ4MDBfcG9zdF91ZXZlbnRfd29yayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCB1MzIgY29kZSkKK3sKKwlzdHJ1Y3QgcWxhX3dvcmtfZXZ0ICplOworCisJZSA9IHFsYTJ4MDBfYWxsb2Nfd29yayh2aGEsIFFMQV9FVlRfVUVWRU5UKTsKKwlpZiAoIWUpCisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJZS0+dS51ZXZlbnQuY29kZSA9IGNvZGU7CisJcmV0dXJuIHFsYTJ4MDBfcG9zdF93b3JrKHZoYSwgZSk7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyeDAwX3VldmVudF9lbWl0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHUzMiBjb2RlKQoreworCWNoYXIgZXZlbnRfc3RyaW5nWzQwXTsKKwljaGFyICplbnZwW10gPSB7IGV2ZW50X3N0cmluZywgTlVMTCB9OworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBRTEFfVUVWRU5UX0NPREVfRldfRFVNUDoKKwkJc25wcmludGYoZXZlbnRfc3RyaW5nLCBzaXplb2YoZXZlbnRfc3RyaW5nKSwgIkZXX0RVTVA9JWxkIiwKKwkJICAgIHZoYS0+aG9zdF9ubyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCWtvYmplY3RfdWV2ZW50X2VudigmdmhhLT5ody0+cGRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKK30KKwogdm9pZAogcWxhMngwMF9kb193b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCiB7CkBAIC0yNjkwLDYgKzI3MDgsOSBAQAogCQkJcWxhMngwMF9hc3luY19sb2dvdXRfZG9uZSh2aGEsIGUtPnUubG9naW8uZmNwb3J0LAogCQkJICAgIGUtPnUubG9naW8uZGF0YSk7CiAJCQlicmVhazsKKwkJY2FzZSBRTEFfRVZUX1VFVkVOVDoKKwkJCXFsYTJ4MDBfdWV2ZW50X2VtaXQodmhhLCBlLT51LnVldmVudC5jb2RlKTsKKwkJCWJyZWFrOwogCQl9CiAJCWlmIChlLT5mbGFncyAmIFFMQV9FVlRfRkxBR19GUkVFKQogCQkJa2ZyZWUoZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAppbmRleCBhYzEwN2EyLi44MDdlMGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTcsNyArNyw3IEBACiAvKgogICogRHJpdmVyIHZlcnNpb24KICAqLwotI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMy4wMS1rNiIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDMuMDEtazciCiAKICNkZWZpbmUgUUxBX0RSSVZFUl9NQUpPUl9WRVIJOAogI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgkzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmggYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmgKaW5kZXggOWMwNTNiYi4uZTNjNzRkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuaApAQCAtNDMsNyArNDMsNyBAQAogICogZGV0ZXJtaW5lZCBmb3IgZWFjaCBxdWV1ZSByZXF1ZXN0IGFuZXcuCiAgKi8KICNkZWZpbmUgUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4JMjU1CS8qIG11c3QgYmUgcG93ZXIgb2YgdHdvIC0gMSAqLwotI2RlZmluZSBRTE9HSUNQVElfTUFYX1NHKHFsKQkoNCArICgocWwpID4gMCkgPyA3KigocWwpIC0gMSkgOiAwKQorI2RlZmluZSBRTE9HSUNQVElfTUFYX1NHKHFsKQkoNCArICgoKHFsKSA+IDApID8gNyooKHFsKSAtIDEpIDogMCkpCiAKIC8qIG1haWxib3ggY29tbWFuZCBjb21wbGV0ZSBzdGF0dXMgY29kZXMgKi8KICNkZWZpbmUgTUJPWF9DT01NQU5EX0NPTVBMRVRFCQkweDQwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCmluZGV4IGRkMDk4Y2EuLmE2MGRhNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtOTQwLDEwICs5NDAsMTYgQEAKICAqLwogaW50IHNjc2lfdHJhY2tfcXVldWVfZnVsbChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkZXB0aCkKIHsKLQlpZiAoKGppZmZpZXMgPj4gNCkgPT0gc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX3RpbWUpCisKKwkvKgorCSAqIERvbid0IGxldCBRVUVVRV9GVUxMcyBvbiB0aGUgc2FtZQorCSAqIGppZmZpZXMgY291bnQsIHRoZXkgY291bGQgYWxsIGJlIGZyb20KKwkgKiBzYW1lIGV2ZW50LgorCSAqLworCWlmICgoamlmZmllcyA+PiA0KSA9PSAoc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX3RpbWUgPj4gNCkpCiAJCXJldHVybiAwOwogCi0Jc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX3RpbWUgPSAoamlmZmllcyA+PiA0KTsKKwlzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfdGltZSA9IGppZmZpZXM7CiAJaWYgKHNkZXYtPmxhc3RfcXVldWVfZnVsbF9kZXB0aCAhPSBkZXB0aCkgewogCQlzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfY291bnQgPSAxOwogCQlzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfZGVwdGggPSBkZXB0aDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCmluZGV4IGM0MTAzYmUuLjBiNTc1YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtNDQsNiArNDQsOCBAQAogCiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KQEAgLTEwNSw2ICsxMDcsMTAgQEAKICNkZWZpbmUgREVGX0FUTyAxCiAjZGVmaW5lIERFRl9QSFlTQkxLX0VYUCAwCiAjZGVmaW5lIERFRl9MT1dFU1RfQUxJR05FRCAwCisjZGVmaW5lIERFRl9VTk1BUF9NQVhfQkxPQ0tTIDAKKyNkZWZpbmUgREVGX1VOTUFQX01BWF9ERVNDIDAKKyNkZWZpbmUgREVGX1VOTUFQX0dSQU5VTEFSSVRZIDAKKyNkZWZpbmUgREVGX1VOTUFQX0FMSUdOTUVOVCAwCiAKIC8qIGJpdCBtYXNrIHZhbHVlcyBmb3Igc2NzaV9kZWJ1Z19vcHRzICovCiAjZGVmaW5lIFNDU0lfREVCVUdfT1BUX05PSVNFICAgMQpAQCAtMTYyLDYgKzE2OCwxMCBAQAogc3RhdGljIGludCBzY3NpX2RlYnVnX2F0byA9IERFRl9BVE87CiBzdGF0aWMgaW50IHNjc2lfZGVidWdfcGh5c2Jsa19leHAgPSBERUZfUEhZU0JMS19FWFA7CiBzdGF0aWMgaW50IHNjc2lfZGVidWdfbG93ZXN0X2FsaWduZWQgPSBERUZfTE9XRVNUX0FMSUdORUQ7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfdW5tYXBfbWF4X2Rlc2MgPSBERUZfVU5NQVBfTUFYX0RFU0M7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfdW5tYXBfbWF4X2Jsb2NrcyA9IERFRl9VTk1BUF9NQVhfQkxPQ0tTOworc3RhdGljIGludCBzY3NpX2RlYnVnX3VubWFwX2dyYW51bGFyaXR5ID0gREVGX1VOTUFQX0dSQU5VTEFSSVRZOworc3RhdGljIGludCBzY3NpX2RlYnVnX3VubWFwX2FsaWdubWVudCA9IERFRl9VTk1BUF9BTElHTk1FTlQ7CiAKIHN0YXRpYyBpbnQgc2NzaV9kZWJ1Z19jbW5kX2NvdW50ID0gMDsKIApAQCAtMjIzLDcgKzIzMyw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICogZmFrZV9zdG9yZXA7CS8qIHJhbWRpc2sgc3RvcmFnZSAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRpZl9zdG9yZXA7CS8qIHByb3RlY3Rpb24gaW5mbyAqLworc3RhdGljIHZvaWQgKm1hcF9zdG9yZXA7CQkvKiBwcm92aXNpb25pbmcgbWFwICovCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1hcF9zaXplOwogc3RhdGljIGludCBudW1fYWJvcnRzID0gMDsKIHN0YXRpYyBpbnQgbnVtX2Rldl9yZXNldHMgPSAwOwogc3RhdGljIGludCBudW1fYnVzX3Jlc2V0cyA9IDA7CkBAIC0zMTcsNiArMzI5LDcgQEAKIAkJCSh1MzIpY21kWzI4XSA8PCAyNDsKIAkJYnJlYWs7CiAKKwljYXNlIFdSSVRFX1NBTUVfMTY6CiAJY2FzZSBXUklURV8xNjoKIAljYXNlIFJFQURfMTY6CiAJCSpsYmEgPSAodTY0KWNtZFs5XSB8ICh1NjQpY21kWzhdIDw8IDggfApAQCAtMzM1LDYgKzM0OCw3IEBACiAJCSpudW0gPSAodTMyKWNtZFs5XSB8ICh1MzIpY21kWzhdIDw8IDggfCAodTMyKWNtZFs3XSA8PCAxNiB8CiAJCQkodTMyKWNtZFs2XSA8PCAyNDsKIAkJYnJlYWs7CisJY2FzZSBXUklURV9TQU1FOgogCWNhc2UgV1JJVEVfMTA6CiAJY2FzZSBSRUFEXzEwOgogCWNhc2UgWERXUklURVJFQURfMTA6CkBAIC02NzEsMTAgKzY4NSwxMiBAQAogfQogCiAKKy8qIEJsb2NrIGxpbWl0cyBWUEQgcGFnZSAoU0JDLTMpICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciB2cGRiMF9kYXRhW10gPSB7Ci0JLyogZnJvbSA0dGggYnl0ZSAqLyAwLDAsMCw0LAotCTAsMCwweDQsMCwKLQkwLDAsMCw2NCwKKwkvKiBmcm9tIDR0aCBieXRlICovIDAsMCwwLDQsIDAsMCwweDQsMCwgMCwwLDAsNjQsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCiB9OwogCiBzdGF0aWMgaW50IGlucXVpcnlfZXZwZF9iMCh1bnNpZ25lZCBjaGFyICogYXJyKQpAQCAtNjkxLDE0ICs3MDcsNDAgQEAKIAkJYXJyWzZdID0gKHNkZWJ1Z19zdG9yZV9zZWN0b3JzID4+IDgpICYgMHhmZjsKIAkJYXJyWzddID0gc2RlYnVnX3N0b3JlX3NlY3RvcnMgJiAweGZmOwogCX0KKworCWlmIChzY3NpX2RlYnVnX3VubWFwX21heF9kZXNjKSB7CisJCXVuc2lnbmVkIGludCBibG9ja3M7CisKKwkJaWYgKHNjc2lfZGVidWdfdW5tYXBfbWF4X2Jsb2NrcykKKwkJCWJsb2NrcyA9IHNjc2lfZGVidWdfdW5tYXBfbWF4X2Jsb2NrczsKKwkJZWxzZQorCQkJYmxvY2tzID0gMHhmZmZmZmZmZjsKKworCQlwdXRfdW5hbGlnbmVkX2JlMzIoYmxvY2tzLCAmYXJyWzE2XSk7CisJCXB1dF91bmFsaWduZWRfYmUzMihzY3NpX2RlYnVnX3VubWFwX21heF9kZXNjLCAmYXJyWzIwXSk7CisJfQorCisJaWYgKHNjc2lfZGVidWdfdW5tYXBfYWxpZ25tZW50KSB7CisJCXB1dF91bmFsaWduZWRfYmUzMihzY3NpX2RlYnVnX3VubWFwX2FsaWdubWVudCwgJmFyclsyOF0pOworCQlhcnJbMjhdIHw9IDB4ODA7IC8qIFVHQVZBTElEICovCisJfQorCisJaWYgKHNjc2lfZGVidWdfdW5tYXBfZ3JhbnVsYXJpdHkpIHsKKwkJcHV0X3VuYWxpZ25lZF9iZTMyKHNjc2lfZGVidWdfdW5tYXBfZ3JhbnVsYXJpdHksICZhcnJbMjRdKTsKKwkJcmV0dXJuIDB4M2M7IC8qIE1hbmRhdG9yeSBwYWdlIGxlbmd0aCBmb3IgdGhpbiBwcm92aXNpb25pbmcgKi8KKwl9CisKIAlyZXR1cm4gc2l6ZW9mKHZwZGIwX2RhdGEpOwogfQogCisvKiBCbG9jayBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIFZQRCBwYWdlIChTQkMtMykgKi8KIHN0YXRpYyBpbnQgaW5xdWlyeV9ldnBkX2IxKHVuc2lnbmVkIGNoYXIgKmFycikKIHsKIAltZW1zZXQoYXJyLCAwLCAweDNjKTsKIAlhcnJbMF0gPSAwOwotCWFyclsxXSA9IDE7CisJYXJyWzFdID0gMTsJLyogbm9uIHJvdGF0aW5nIG1lZGl1bSAoZS5nLiBzb2xpZCBzdGF0ZSkgKi8KKwlhcnJbMl0gPSAwOworCWFyclszXSA9IDU7CS8qIGxlc3MgdGhhbiAxLjgiICovCiAKIAlyZXR1cm4gMHgzYzsKIH0KQEAgLTk3NCw2ICsxMDE2LDEwIEBACiAJYXJyWzExXSA9IHNjc2lfZGVidWdfc2VjdG9yX3NpemUgJiAweGZmOwogCWFyclsxM10gPSBzY3NpX2RlYnVnX3BoeXNibGtfZXhwICYgMHhmOwogCWFyclsxNF0gPSAoc2NzaV9kZWJ1Z19sb3dlc3RfYWxpZ25lZCA+PiA4KSAmIDB4M2Y7CisKKwlpZiAoc2NzaV9kZWJ1Z191bm1hcF9ncmFudWxhcml0eSkKKwkJYXJyWzE0XSB8PSAweDgwOyAvKiBUUEUgKi8KKwogCWFyclsxNV0gPSBzY3NpX2RlYnVnX2xvd2VzdF9hbGlnbmVkICYgMHhmZjsKIAogCWlmIChzY3NpX2RlYnVnX2RpZikgewpAQCAtMTg4Nyw2ICsxOTMzLDcwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBtYXBfc3RhdGUoc2VjdG9yX3QgbGJhLCB1bnNpZ25lZCBpbnQgKm51bSkKK3sKKwl1bnNpZ25lZCBpbnQgZ3JhbnVsYXJpdHksIGFsaWdubWVudCwgbWFwcGVkOworCXNlY3Rvcl90IGJsb2NrLCBuZXh0LCBlbmQ7CisKKwlncmFudWxhcml0eSA9IHNjc2lfZGVidWdfdW5tYXBfZ3JhbnVsYXJpdHk7CisJYWxpZ25tZW50ID0gZ3JhbnVsYXJpdHkgLSBzY3NpX2RlYnVnX3VubWFwX2FsaWdubWVudDsKKwlibG9jayA9IGxiYSArIGFsaWdubWVudDsKKwlkb19kaXYoYmxvY2ssIGdyYW51bGFyaXR5KTsKKworCW1hcHBlZCA9IHRlc3RfYml0KGJsb2NrLCBtYXBfc3RvcmVwKTsKKworCWlmIChtYXBwZWQpCisJCW5leHQgPSBmaW5kX25leHRfemVyb19iaXQobWFwX3N0b3JlcCwgbWFwX3NpemUsIGJsb2NrKTsKKwllbHNlCisJCW5leHQgPSBmaW5kX25leHRfYml0KG1hcF9zdG9yZXAsIG1hcF9zaXplLCBibG9jayk7CisKKwllbmQgPSBuZXh0ICogZ3JhbnVsYXJpdHkgLSBzY3NpX2RlYnVnX3VubWFwX2FsaWdubWVudDsKKwkqbnVtID0gZW5kIC0gbGJhOworCisJcmV0dXJuIG1hcHBlZDsKK30KKworc3RhdGljIHZvaWQgbWFwX3JlZ2lvbihzZWN0b3JfdCBsYmEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGdyYW51bGFyaXR5LCBhbGlnbm1lbnQ7CisJc2VjdG9yX3QgZW5kID0gbGJhICsgbGVuOworCisJZ3JhbnVsYXJpdHkgPSBzY3NpX2RlYnVnX3VubWFwX2dyYW51bGFyaXR5OworCWFsaWdubWVudCA9IGdyYW51bGFyaXR5IC0gc2NzaV9kZWJ1Z191bm1hcF9hbGlnbm1lbnQ7CisKKwl3aGlsZSAobGJhIDwgZW5kKSB7CisJCXNlY3Rvcl90IGJsb2NrLCByZW07CisKKwkJYmxvY2sgPSBsYmEgKyBhbGlnbm1lbnQ7CisJCXJlbSA9IGRvX2RpdihibG9jaywgZ3JhbnVsYXJpdHkpOworCisJCXNldF9iaXQoYmxvY2ssIG1hcF9zdG9yZXApOworCisJCWxiYSArPSBncmFudWxhcml0eSAtIHJlbTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX3JlZ2lvbihzZWN0b3JfdCBsYmEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGdyYW51bGFyaXR5LCBhbGlnbm1lbnQ7CisJc2VjdG9yX3QgZW5kID0gbGJhICsgbGVuOworCisJZ3JhbnVsYXJpdHkgPSBzY3NpX2RlYnVnX3VubWFwX2dyYW51bGFyaXR5OworCWFsaWdubWVudCA9IGdyYW51bGFyaXR5IC0gc2NzaV9kZWJ1Z191bm1hcF9hbGlnbm1lbnQ7CisKKwl3aGlsZSAobGJhIDwgZW5kKSB7CisJCXNlY3Rvcl90IGJsb2NrLCByZW07CisKKwkJYmxvY2sgPSBsYmEgKyBhbGlnbm1lbnQ7CisJCXJlbSA9IGRvX2RpdihibG9jaywgZ3JhbnVsYXJpdHkpOworCisJCWlmIChyZW0gPT0gMCAmJiBsYmEgKyBncmFudWxhcml0eSA8PSBlbmQpCisJCQljbGVhcl9iaXQoYmxvY2ssIG1hcF9zdG9yZXApOworCisJCWxiYSArPSBncmFudWxhcml0eSAtIHJlbTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgcmVzcF93cml0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdW5zaWduZWQgbG9uZyBsb25nIGxiYSwKIAkJICAgICAgdW5zaWduZWQgaW50IG51bSwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqZGV2aXAsCiAJCSAgICAgIHUzMiBlaV9sYmEpCkBAIC0xOTEwLDYgKzIwMjAsOCBAQAogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CiAJcmV0ID0gZG9fZGV2aWNlX2FjY2VzcyhTQ3BudCwgZGV2aXAsIGxiYSwgbnVtLCAxKTsKKwlpZiAoc2NzaV9kZWJ1Z191bm1hcF9ncmFudWxhcml0eSkKKwkJbWFwX3JlZ2lvbihsYmEsIG51bSk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19ydywgaWZsYWdzKTsKIAlpZiAoLTEgPT0gcmV0KQogCQlyZXR1cm4gKERJRF9FUlJPUiA8PCAxNik7CkBAIC0xOTE3LDkgKzIwMjksMTQzIEBACiAJCSAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpKQogCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiB3cml0ZTogY2RiIGluZGljYXRlZD0ldSwgIgogCQkgICAgICAgIiBJTyBzZW50PSVkIGJ5dGVzXG4iLCBudW0gKiBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplLCByZXQpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcmVzcF93cml0ZV9zYW1lKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYmEsCisJCSAgICAgIHVuc2lnbmVkIGludCBudW0sIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKmRldmlwLAorCQkJICAgdTMyIGVpX2xiYSwgdW5zaWduZWQgaW50IHVubWFwKQoreworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpOworCWludCByZXQ7CisKKwlyZXQgPSBjaGVja19kZXZpY2VfYWNjZXNzX3BhcmFtcyhkZXZpcCwgbGJhLCBudW0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmF0b21pY19ydywgaWZsYWdzKTsKKworCWlmICh1bm1hcCAmJiBzY3NpX2RlYnVnX3VubWFwX2dyYW51bGFyaXR5KSB7CisJCXVubWFwX3JlZ2lvbihsYmEsIG51bSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEVsc2UgZmV0Y2ggb25lIGxvZ2ljYWwgYmxvY2sgKi8KKwlyZXQgPSBmZXRjaF90b19kZXZfYnVmZmVyKHNjbWQsCisJCQkJICBmYWtlX3N0b3JlcCArIChsYmEgKiBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplKSwKKwkJCQkgIHNjc2lfZGVidWdfc2VjdG9yX3NpemUpOworCisJaWYgKC0xID09IHJldCkgeworCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX3J3LCBpZmxhZ3MpOworCQlyZXR1cm4gKERJRF9FUlJPUiA8PCAxNik7CisJfSBlbHNlIGlmICgocmV0IDwgKG51bSAqIHNjc2lfZGVidWdfc2VjdG9yX3NpemUpKSAmJgorCQkgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1Zzogd3JpdGUgc2FtZTogY2RiIGluZGljYXRlZD0ldSwgIgorCQkgICAgICAgIiBJTyBzZW50PSVkIGJ5dGVzXG4iLCBudW0gKiBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplLCByZXQpOworCisJLyogQ29weSBmaXJzdCBzZWN0b3IgdG8gcmVtYWluaW5nIGJsb2NrcyAqLworCWZvciAoaSA9IDEgOyBpIDwgbnVtIDsgaSsrKQorCQltZW1jcHkoZmFrZV9zdG9yZXAgKyAoKGxiYSArIGkpICogc2NzaV9kZWJ1Z19zZWN0b3Jfc2l6ZSksCisJCSAgICAgICBmYWtlX3N0b3JlcCArIChsYmEgKiBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplKSwKKwkJICAgICAgIHNjc2lfZGVidWdfc2VjdG9yX3NpemUpOworCisJaWYgKHNjc2lfZGVidWdfdW5tYXBfZ3JhbnVsYXJpdHkpCisJCW1hcF9yZWdpb24obGJhLCBudW0pOworb3V0OgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhdG9taWNfcncsIGlmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHVubWFwX2Jsb2NrX2Rlc2MgeworCV9fYmU2NAlsYmE7CisJX19iZTMyCWJsb2NrczsKKwlfX2JlMzIJX19yZXNlcnZlZDsKK307CisKK3N0YXRpYyBpbnQgcmVzcF91bm1hcChzdHJ1Y3Qgc2NzaV9jbW5kICogc2NtZCwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgdW5tYXBfYmxvY2tfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgaSwgcGF5bG9hZF9sZW4sIGRlc2NyaXB0b3JzOworCWludCByZXQ7CisKKwlyZXQgPSBjaGVja19yZWFkaW5lc3Moc2NtZCwgMSwgZGV2aXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwYXlsb2FkX2xlbiA9IGdldF91bmFsaWduZWRfYmUxNigmc2NtZC0+Y21uZFs3XSk7CisJQlVHX09OKHNjc2lfYnVmZmxlbihzY21kKSAhPSBwYXlsb2FkX2xlbik7CisKKwlkZXNjcmlwdG9ycyA9IChwYXlsb2FkX2xlbiAtIDgpIC8gMTY7CisKKwlidWYgPSBrbWFsbG9jKHNjc2lfYnVmZmxlbihzY21kKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidWYpCisJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCisJc2NzaV9zZ19jb3B5X3RvX2J1ZmZlcihzY21kLCBidWYsIHNjc2lfYnVmZmxlbihzY21kKSk7CisKKwlCVUdfT04oZ2V0X3VuYWxpZ25lZF9iZTE2KCZidWZbMF0pICE9IHBheWxvYWRfbGVuIC0gMik7CisJQlVHX09OKGdldF91bmFsaWduZWRfYmUxNigmYnVmWzJdKSAhPSBkZXNjcmlwdG9ycyAqIDE2KTsKKworCWRlc2MgPSAodm9pZCAqKSZidWZbOF07CisKKwlmb3IgKGkgPSAwIDsgaSA8IGRlc2NyaXB0b3JzIDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmEgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJmRlc2NbaV0ubGJhKTsKKwkJdW5zaWduZWQgaW50IG51bSA9IGdldF91bmFsaWduZWRfYmUzMigmZGVzY1tpXS5ibG9ja3MpOworCisJCXJldCA9IGNoZWNrX2RldmljZV9hY2Nlc3NfcGFyYW1zKGRldmlwLCBsYmEsIG51bSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQl1bm1hcF9yZWdpb24obGJhLCBudW0pOworCX0KKworCXJldCA9IDA7CisKK291dDoKKwlrZnJlZShidWYpOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBTREVCVUdfR0VUX0xCQV9TVEFUVVNfTEVOIDMyCisKK3N0YXRpYyBpbnQgcmVzcF9nZXRfbGJhX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICogc2NtZCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGxiYTsKKwl1bnNpZ25lZCBpbnQgYWxsb2NfbGVuLCBtYXBwZWQsIG51bTsKKwl1bnNpZ25lZCBjaGFyIGFycltTREVCVUdfR0VUX0xCQV9TVEFUVVNfTEVOXTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hlY2tfcmVhZGluZXNzKHNjbWQsIDEsIGRldmlwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTY0KCZzY21kLT5jbW5kWzJdKTsKKwlhbGxvY19sZW4gPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnNjbWQtPmNtbmRbMTBdKTsKKworCWlmIChhbGxvY19sZW4gPCAyNCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBjaGVja19kZXZpY2VfYWNjZXNzX3BhcmFtcyhkZXZpcCwgbGJhLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFwcGVkID0gbWFwX3N0YXRlKGxiYSwgJm51bSk7CisKKwltZW1zZXQoYXJyLCAwLCBTREVCVUdfR0VUX0xCQV9TVEFUVVNfTEVOKTsKKwlwdXRfdW5hbGlnbmVkX2JlMzIoMTYsICZhcnJbMF0pOwkvKiBQYXJhbWV0ZXIgRGF0YSBMZW5ndGggKi8KKwlwdXRfdW5hbGlnbmVkX2JlNjQobGJhLCAmYXJyWzhdKTsJLyogTEJBICovCisJcHV0X3VuYWxpZ25lZF9iZTMyKG51bSwgJmFyclsxNl0pOwkvKiBOdW1iZXIgb2YgYmxvY2tzICovCisJYXJyWzIwXSA9ICFtYXBwZWQ7CQkJLyogbWFwcGVkID0gMCwgdW5tYXBwZWQgPSAxICovCisKKwlyZXR1cm4gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NtZCwgYXJyLCBTREVCVUdfR0VUX0xCQV9TVEFUVVNfTEVOKTsKK30KKwogI2RlZmluZSBTREVCVUdfUkxVTl9BUlJfU1ogMjU2CiAKIHN0YXRpYyBpbnQgcmVzcF9yZXBvcnRfbHVucyhzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLApAQCAtMjQzMCw2ICsyNjc2LDEwIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoYXRvLCBzY3NpX2RlYnVnX2F0bywgaW50LCBTX0lSVUdPKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChwaHlzYmxrX2V4cCwgc2NzaV9kZWJ1Z19waHlzYmxrX2V4cCwgaW50LCBTX0lSVUdPKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChsb3dlc3RfYWxpZ25lZCwgc2NzaV9kZWJ1Z19sb3dlc3RfYWxpZ25lZCwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh1bm1hcF9tYXhfYmxvY2tzLCBzY3NpX2RlYnVnX3VubWFwX21heF9ibG9ja3MsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fbmFtZWQodW5tYXBfbWF4X2Rlc2MsIHNjc2lfZGVidWdfdW5tYXBfbWF4X2Rlc2MsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fbmFtZWQodW5tYXBfZ3JhbnVsYXJpdHksIHNjc2lfZGVidWdfdW5tYXBfZ3JhbnVsYXJpdHksIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fbmFtZWQodW5tYXBfYWxpZ25tZW50LCBzY3NpX2RlYnVnX3VubWFwX2FsaWdubWVudCwgaW50LCBTX0lSVUdPKTsKIAogTU9EVUxFX0FVVEhPUigiRXJpYyBZb3VuZ2RhbGUgKyBEb3VnbGFzIEdpbGJlcnQiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0NTSSBkZWJ1ZyBhZGFwdGVyIGRyaXZlciIpOwpAQCAtMjQ1OCw2ICsyNzA4LDEwIEBACiBNT0RVTEVfUEFSTV9ERVNDKGRpZiwgImRhdGEgaW50ZWdyaXR5IGZpZWxkIHR5cGU6IDAtMyAoZGVmPTApIik7CiBNT0RVTEVfUEFSTV9ERVNDKGd1YXJkLCAicHJvdGVjdGlvbiBjaGVja3N1bTogMD1jcmMsIDE9aXAgKGRlZj0wKSIpOwogTU9EVUxFX1BBUk1fREVTQyhhdG8sICJhcHBsaWNhdGlvbiB0YWcgb3duZXJzaGlwOiAwPWRpc2sgMT1ob3N0IChkZWY9MSkiKTsKK01PRFVMRV9QQVJNX0RFU0ModW5tYXBfbWF4X2Jsb2NrcywgIm1heCAjIG9mIGJsb2NrcyBjYW4gYmUgdW5tYXBwZWQgaW4gb25lIGNtZCAoZGVmPTApIik7CitNT0RVTEVfUEFSTV9ERVNDKHVubWFwX21heF9kZXNjLCAibWF4ICMgb2YgcmFuZ2VzIHRoYXQgY2FuIGJlIHVubWFwcGVkIGluIG9uZSBjbWQgKGRlZj0wKSIpOworTU9EVUxFX1BBUk1fREVTQyh1bm1hcF9ncmFudWxhcml0eSwgInRoaW4gcHJvdmlzaW9uaW5nIGdyYW51bGFyaXR5IGluIGJsb2NrcyAoZGVmPTApIik7CitNT0RVTEVfUEFSTV9ERVNDKHVubWFwX2FsaWdubWVudCwgImxvd2VzdCBhbGlnbmVkIHRoaW4gcHJvdmlzaW9uaW5nIGxiYSAoZGVmPTApIik7CiAKIHN0YXRpYyBjaGFyIHNkZWJ1Z19pbmZvWzI1Nl07CiAKQEAgLTI4MTYsNiArMzA3MCwyMyBAQAogfQogRFJJVkVSX0FUVFIoYXRvLCBTX0lSVUdPLCBzZGVidWdfYXRvX3Nob3csIE5VTEwpOwogCitzdGF0aWMgc3NpemVfdCBzZGVidWdfbWFwX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXNzaXplX3QgY291bnQ7CisKKwlpZiAoc2NzaV9kZWJ1Z191bm1hcF9ncmFudWxhcml0eSA9PSAwKQorCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMC0ldVxuIiwKKwkJCQkgc2RlYnVnX3N0b3JlX3NlY3RvcnMpOworCisJY291bnQgPSBiaXRtYXBfc2NubGlzdHByaW50ZihidWYsIFBBR0VfU0laRSwgbWFwX3N0b3JlcCwgbWFwX3NpemUpOworCisJYnVmW2NvdW50KytdID0gJ1xuJzsKKwlidWZbY291bnQrK10gPSAwOworCisJcmV0dXJuIGNvdW50OworfQorRFJJVkVSX0FUVFIobWFwLCBTX0lSVUdPLCBzZGVidWdfbWFwX3Nob3csIE5VTEwpOworCiAKIC8qIE5vdGU6IFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gY3JlYXRlcyBhdHRyaWJ1dGUgZmlsZXMgaW4gdGhlCiAgICAvc3lzL2J1cy9wc2V1ZG8vZHJpdmVycy9zY3NpX2RlYnVnIGRpcmVjdG9yeS4gVGhlIGFkdmFudGFnZSBvZiB0aGVzZQpAQCAtMjg0NywxMSArMzExOCwxMyBAQAogCXJldCB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9kaWYpOwogCXJldCB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9ndWFyZCk7CiAJcmV0IHw9IGRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2F0byk7CisJcmV0IHw9IGRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX21hcCk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgZG9fcmVtb3ZlX2RyaXZlcmZzX2ZpbGVzKHZvaWQpCiB7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfbWFwKTsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9hdG8pOwogCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2d1YXJkKTsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9kaWYpOwpAQCAtMjk4OSw2ICszMjYyLDM2IEBACiAJCW1lbXNldChkaWZfc3RvcmVwLCAweGZmLCBkaWZfc2l6ZSk7CiAJfQogCisJaWYgKHNjc2lfZGVidWdfdW5tYXBfZ3JhbnVsYXJpdHkpIHsKKwkJdW5zaWduZWQgaW50IG1hcF9ieXRlczsKKworCQlpZiAoc2NzaV9kZWJ1Z191bm1hcF9ncmFudWxhcml0eSA8IHNjc2lfZGVidWdfdW5tYXBfYWxpZ25tZW50KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IEVSUjogdW5tYXBfZ3JhbnVsYXJpdHkgPCB1bm1hcF9hbGlnbm1lbnRcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQltYXBfc2l6ZSA9IChzZGVidWdfc3RvcmVfc2VjdG9ycyAvIHNjc2lfZGVidWdfdW5tYXBfZ3JhbnVsYXJpdHkpOworCQltYXBfYnl0ZXMgPSBtYXBfc2l6ZSA+PiAzOworCQltYXBfc3RvcmVwID0gdm1hbGxvYyhtYXBfYnl0ZXMpOworCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWdfaW5pdDogJWx1IHByb3Zpc2lvbmluZyBibG9ja3NcbiIsCisJCSAgICAgICBtYXBfc2l6ZSk7CisKKwkJaWYgKG1hcF9zdG9yZXAgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpX2RlYnVnX2luaXQ6IG91dCBvZiBtZW0uIChNQVApXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfdm07CisJCX0KKworCQltZW1zZXQobWFwX3N0b3JlcCwgMHgwLCBtYXBfYnl0ZXMpOworCisJCS8qIE1hcCBmaXJzdCAxS0IgZm9yIHBhcnRpdGlvbiB0YWJsZSAqLworCQlpZiAoc2NzaV9kZWJ1Z19udW1fcGFydHMpCisJCQltYXBfcmVnaW9uKDAsIDIpOworCX0KKwogCXJldCA9IGRldmljZV9yZWdpc3RlcigmcHNldWRvX3ByaW1hcnkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2lfZGVidWc6IGRldmljZV9yZWdpc3RlciBlcnJvcjogJWRcbiIsCkBAIC0zMDQxLDYgKzMzNDQsOCBAQAogZGV2X3VucmVnOgogCWRldmljZV91bnJlZ2lzdGVyKCZwc2V1ZG9fcHJpbWFyeSk7CiBmcmVlX3ZtOgorCWlmIChtYXBfc3RvcmVwKQorCQl2ZnJlZShtYXBfc3RvcmVwKTsKIAlpZiAoZGlmX3N0b3JlcCkKIAkJdmZyZWUoZGlmX3N0b3JlcCk7CiAJdmZyZWUoZmFrZV9zdG9yZXApOwpAQCAtMzE2Nyw2ICszNDcyLDcgQEAKIAlpbnQgaW5qX2RpZiA9IDA7CiAJaW50IGlual9kaXggPSAwOwogCWludCBkZWxheV9vdmVycmlkZSA9IDA7CisJaW50IHVubWFwID0gMDsKIAogCXNjc2lfc2V0X3Jlc2lkKFNDcG50LCAwKTsKIAlpZiAoKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKSAmJiBjbWQpIHsKQEAgLTMyNzIsMTMgKzM1NzgsMjEgQEAKIAkJZXJyc3RzID0gcmVzcF9yZWFkY2FwKFNDcG50LCBkZXZpcCk7CiAJCWJyZWFrOwogCWNhc2UgU0VSVklDRV9BQ1RJT05fSU46Ci0JCWlmIChTQUlfUkVBRF9DQVBBQ0lUWV8xNiAhPSBjbWRbMV0pIHsKKwkJaWYgKGNtZFsxXSA9PSBTQUlfUkVBRF9DQVBBQ0lUWV8xNikKKwkJCWVycnN0cyA9IHJlc3BfcmVhZGNhcDE2KFNDcG50LCBkZXZpcCk7CisJCWVsc2UgaWYgKGNtZFsxXSA9PSBTQUlfR0VUX0xCQV9TVEFUVVMpIHsKKworCQkJaWYgKHNjc2lfZGVidWdfdW5tYXBfbWF4X2Rlc2MgPT0gMCkgeworCQkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULAorCQkJCQkJSU5WQUxJRF9DT01NQU5EX09QQ09ERSwgMCk7CisJCQkJZXJyc3RzID0gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwkJCX0gZWxzZQorCQkJCWVycnN0cyA9IHJlc3BfZ2V0X2xiYV9zdGF0dXMoU0NwbnQsIGRldmlwKTsKKwkJfSBlbHNlIHsKIAkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULAogCQkJCQlJTlZBTElEX09QQ09ERSwgMCk7CiAJCQllcnJzdHMgPSBjaGVja19jb25kaXRpb25fcmVzdWx0OwotCQkJYnJlYWs7CiAJCX0KLQkJZXJyc3RzID0gcmVzcF9yZWFkY2FwMTYoU0NwbnQsIGRldmlwKTsKIAkJYnJlYWs7CiAJY2FzZSBNQUlOVEVOQU5DRV9JTjoKIAkJaWYgKE1JX1JFUE9SVF9UQVJHRVRfUEdTICE9IGNtZFsxXSkgewpAQCAtMzM3OCw2ICszNjkyLDI5IEBACiAJCQllcnJzdHMgPSBpbGxlZ2FsX2NvbmRpdGlvbl9yZXN1bHQ7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBXUklURV9TQU1FXzE2OgorCQlpZiAoY21kWzFdICYgMHg4KQorCQkJdW5tYXAgPSAxOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFdSSVRFX1NBTUU6CisJCWVycnN0cyA9IGNoZWNrX3JlYWRpbmVzcyhTQ3BudCwgMCwgZGV2aXApOworCQlpZiAoZXJyc3RzKQorCQkJYnJlYWs7CisJCWdldF9kYXRhX3RyYW5zZmVyX2luZm8oY21kLCAmbGJhLCAmbnVtLCAmZWlfbGJhKTsKKwkJZXJyc3RzID0gcmVzcF93cml0ZV9zYW1lKFNDcG50LCBsYmEsIG51bSwgZGV2aXAsIGVpX2xiYSwgdW5tYXApOworCQlicmVhazsKKwljYXNlIFVOTUFQOgorCQllcnJzdHMgPSBjaGVja19yZWFkaW5lc3MoU0NwbnQsIDAsIGRldmlwKTsKKwkJaWYgKGVycnN0cykKKwkJCWJyZWFrOworCisJCWlmIChzY3NpX2RlYnVnX3VubWFwX21heF9kZXNjID09IDApIHsKKwkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULAorCQkJCQlJTlZBTElEX0NPTU1BTkRfT1BDT0RFLCAwKTsKKwkJCWVycnN0cyA9IGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJCX0gZWxzZQorCQkJZXJyc3RzID0gcmVzcF91bm1hcChTQ3BudCwgZGV2aXApOworCQlicmVhazsKIAljYXNlIE1PREVfU0VOU0U6CiAJY2FzZSBNT0RFX1NFTlNFXzEwOgogCQllcnJzdHMgPSByZXNwX21vZGVfc2Vuc2UoU0NwbnQsIHRhcmdldCwgZGV2aXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCmluZGV4IDkzYzI2MjIuLjM3YWYxNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKQEAgLTE2OCwxMSArMTY4LDEwIEBACiAJeyJHZW5lcmljIiwgIlVTQiBTRCBSZWFkZXIiLCAiMS4wMCIsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCiAJeyJHZW5lcmljIiwgIlVTQiBTdG9yYWdlLVNNQyIsICIwMTgwIiwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9JTlFVSVJZXzM2fSwKIAl7IkdlbmVyaWMiLCAiVVNCIFN0b3JhZ2UtU01DIiwgIjAyMDciLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAotCXsiSElUQUNISSIsICJERjQwMCIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKLQl7IkhJVEFDSEkiLCAiREY1MDAiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCi0JeyJISVRBQ0hJIiwgIkRGNjAwIiwgIioiLCBCTElTVF9TUEFSU0VMVU59LAotCXsiSElUQUNISSIsICJESVNLLVNVQlNZU1RFTSIsICIqIiwgQkxJU1RfQVRUQUNIX1BRMyB8IEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0xBUkdFTFVOfSwKLQl7IkhJVEFDSEkiLCAiT1BFTi1FIiwgIioiLCBCTElTVF9BVFRBQ0hfUFEzIHwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTEFSR0VMVU59LAorCXsiSElUQUNISSIsICJERjQwMCIsICIqIiwgQkxJU1RfUkVQT1JUTFVOMn0sCisJeyJISVRBQ0hJIiwgIkRGNTAwIiwgIioiLCBCTElTVF9SRVBPUlRMVU4yfSwKKwl7IkhJVEFDSEkiLCAiRElTSy1TVUJTWVNURU0iLCAiKiIsIEJMSVNUX1JFUE9SVExVTjJ9LAorCXsiSElUQUNISSIsICJPUEVOLSIsICIqIiwgQkxJU1RfUkVQT1JUTFVOMn0sCiAJeyJISVRBQ0hJIiwgIk9QLUMtIiwgIioiLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTn0sCiAJeyJISVRBQ0hJIiwgIjMzODAtIiwgIioiLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTn0sCiAJeyJISVRBQ0hJIiwgIjMzOTAtIiwgIioiLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTn0sCkBAIC00NTQsNyArNDUzLDcgQEAKIAogCiAvKioKLSAqIGdldF9kZXZpY2VfZmxhZ3Nfa2V5ZWQgLSBnZXQgZGV2aWNlIHNwZWNpZmljIGZsYWdzIGZyb20gdGhlIGR5bmFtaWMgZGV2aWNlIGxpc3QuCisgKiBzY3NpX2dldF9kZXZpY2VfZmxhZ3Nfa2V5ZWQgLSBnZXQgZGV2aWNlIHNwZWNpZmljIGZsYWdzIGZyb20gdGhlIGR5bmFtaWMgZGV2aWNlIGxpc3QKICAqIEBzZGV2OiAgICAgICAmc2NzaV9kZXZpY2UgdG8gZ2V0IGZsYWdzIGZvcgogICogQHZlbmRvcjoJdmVuZG9yIG5hbWUKICAqIEBtb2RlbDoJbW9kZWwgbmFtZQpAQCAtNjg1LDcgKzY4NCw3IEBACiAJCSAic2NzaSBkZWZhdWx0IGRldmljZSBmbGFnIGludGVnZXIgdmFsdWUiKTsKIAogLyoqCi0gKiBzY3NpX2Rldl9pbmZvX2xpc3RfZGVsZXRlIC0gY2FsbGVkIGZyb20gc2NzaS5jOmV4aXRfc2NzaSB0byByZW1vdmUgdGhlIHNjc2lfZGV2X2luZm9fbGlzdC4KKyAqIHNjc2lfZXhpdF9kZXZpbmZvIC0gcmVtb3ZlIC9wcm9jL3Njc2kvZGV2aWNlX2luZm8gJiB0aGUgc2NzaV9kZXZfaW5mb19saXN0CiAgKiovCiB2b2lkIHNjc2lfZXhpdF9kZXZpbmZvKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwppbmRleCAxYjAwNjBiLi4wOGVkNTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKQEAgLTMzMSw2ICszMzEsNjQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNjc2lfaGFuZGxlX3F1ZXVlX3JhbXBfdXAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9IHNkZXYtPmhvc3QtPmhvc3R0OworCXN0cnVjdCBzY3NpX2RldmljZSAqdG1wX3NkZXY7CisKKwlpZiAoIXNodC0+Y2hhbmdlX3F1ZXVlX2RlcHRoIHx8CisJICAgIHNkZXYtPnF1ZXVlX2RlcHRoID49IHNkZXYtPm1heF9xdWV1ZV9kZXB0aCkKKwkJcmV0dXJuOworCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsCisJICAgIHNkZXYtPmxhc3RfcXVldWVfcmFtcF91cCArIHNkZXYtPnF1ZXVlX3JhbXBfdXBfcGVyaW9kKSkKKwkJcmV0dXJuOworCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsCisJICAgIHNkZXYtPmxhc3RfcXVldWVfZnVsbF90aW1lICsgc2Rldi0+cXVldWVfcmFtcF91cF9wZXJpb2QpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdhbGsgYWxsIGRldmljZXMgb2YgYSB0YXJnZXQgYW5kIGRvCisJICogcmFtcCB1cCBvbiB0aGVtLgorCSAqLworCXNob3N0X2Zvcl9lYWNoX2RldmljZSh0bXBfc2Rldiwgc2Rldi0+aG9zdCkgeworCQlpZiAodG1wX3NkZXYtPmNoYW5uZWwgIT0gc2Rldi0+Y2hhbm5lbCB8fAorCQkgICAgdG1wX3NkZXYtPmlkICE9IHNkZXYtPmlkIHx8CisJCSAgICB0bXBfc2Rldi0+cXVldWVfZGVwdGggPT0gc2Rldi0+bWF4X3F1ZXVlX2RlcHRoKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIGNhbGwgYmFjayBpbnRvIExMRCB0byBpbmNyZWFzZSBxdWV1ZV9kZXB0aCBieSBvbmUKKwkJICogd2l0aCByYW1wIHVwIHJlYXNvbiBjb2RlLgorCQkgKi8KKwkJc2h0LT5jaGFuZ2VfcXVldWVfZGVwdGgodG1wX3NkZXYsIHRtcF9zZGV2LT5xdWV1ZV9kZXB0aCArIDEsCisJCQkJCVNDU0lfUURFUFRIX1JBTVBfVVApOworCQlzZGV2LT5sYXN0X3F1ZXVlX3JhbXBfdXAgPSBqaWZmaWVzOworCX0KK30KKworc3RhdGljIHZvaWQgc2NzaV9oYW5kbGVfcXVldWVfZnVsbChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0ID0gc2Rldi0+aG9zdC0+aG9zdHQ7CisJc3RydWN0IHNjc2lfZGV2aWNlICp0bXBfc2RldjsKKworCWlmICghc2h0LT5jaGFuZ2VfcXVldWVfZGVwdGgpCisJCXJldHVybjsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZSh0bXBfc2Rldiwgc2Rldi0+aG9zdCkgeworCQlpZiAodG1wX3NkZXYtPmNoYW5uZWwgIT0gc2Rldi0+Y2hhbm5lbCB8fAorCQkgICAgdG1wX3NkZXYtPmlkICE9IHNkZXYtPmlkKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBrbm93IHRoZSBudW1iZXIgb2YgY29tbWFuZHMgdGhhdCB3ZXJlIGF0CisJCSAqIHRoZSBkZXZpY2Ugd2hlbiB3ZSBnb3QgdGhlIHF1ZXVlIGZ1bGwgc28gd2Ugc3RhcnQKKwkJICogZnJvbSB0aGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZSBhbmQgd29yayBvdXIgd2F5IGRvd24uCisJCSAqLworCQlzaHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCh0bXBfc2RldiwgdG1wX3NkZXYtPnF1ZXVlX2RlcHRoIC0gMSwKKwkJCQkJU0NTSV9RREVQVEhfUUZVTEwpOworCX0KK30KKwogLyoqCiAgKiBzY3NpX2VoX2NvbXBsZXRlZF9ub3JtYWxseSAtIERpc3Bvc2l0aW9uIGEgZWggY21kIG9uIHJldHVybiBmcm9tIExMRC4KICAqIEBzY21kOglTQ1NJIGNtZCB0byBleGFtaW5lLgpAQCAtMzcxLDYgKzQyOSw3IEBACiAJICovCiAJc3dpdGNoIChzdGF0dXNfYnl0ZShzY21kLT5yZXN1bHQpKSB7CiAJY2FzZSBHT09EOgorCQlzY3NpX2hhbmRsZV9xdWV1ZV9yYW1wX3VwKHNjbWQtPmRldmljZSk7CiAJY2FzZSBDT01NQU5EX1RFUk1JTkFURUQ6CiAJCXJldHVybiBTVUNDRVNTOwogCWNhc2UgQ0hFQ0tfQ09ORElUSU9OOgpAQCAtMzg3LDggKzQ0NiwxMCBAQAogCQkgKiBsZXQgaXNzdWVyIGRlYWwgd2l0aCB0aGlzLCBpdCBjb3VsZCBiZSBqdXN0IGZpbmUKIAkJICovCiAJCXJldHVybiBTVUNDRVNTOwotCWNhc2UgQlVTWToKIAljYXNlIFFVRVVFX0ZVTEw6CisJCXNjc2lfaGFuZGxlX3F1ZXVlX2Z1bGwoc2NtZC0+ZGV2aWNlKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBCVVNZOgogCWRlZmF1bHQ6CiAJCXJldHVybiBGQUlMRUQ7CiAJfQpAQCAtMTM4Nyw2ICsxNDQ4LDcgQEAKIAkgKi8KIAlzd2l0Y2ggKHN0YXR1c19ieXRlKHNjbWQtPnJlc3VsdCkpIHsKIAljYXNlIFFVRVVFX0ZVTEw6CisJCXNjc2lfaGFuZGxlX3F1ZXVlX2Z1bGwoc2NtZC0+ZGV2aWNlKTsKIAkJLyoKIAkJICogdGhlIGNhc2Ugb2YgdHJ5aW5nIHRvIHNlbmQgdG9vIG1hbnkgY29tbWFuZHMgdG8gYQogCQkgKiB0YWdnZWQgcXVldWVpbmcgZGV2aWNlLgpAQCAtMTQwMCw2ICsxNDYyLDcgQEAKIAkJICovCiAJCXJldHVybiBBRERfVE9fTUxRVUVVRTsKIAljYXNlIEdPT0Q6CisJCXNjc2lfaGFuZGxlX3F1ZXVlX3JhbXBfdXAoc2NtZC0+ZGV2aWNlKTsKIAljYXNlIENPTU1BTkRfVEVSTUlOQVRFRDoKIAkJcmV0dXJuIFNVQ0NFU1M7CiAJY2FzZSBUQVNLX0FCT1JURUQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYwppbmRleCBiOThmNzYzLi5kOTU2NGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKQEAgLTMwOCw2ICszMDgsOSBAQAogCQljYXNlIFNHX1NDU0lfUkVTRVRfREVWSUNFOgogCQkJdmFsID0gU0NTSV9UUllfUkVTRVRfREVWSUNFOwogCQkJYnJlYWs7CisJCWNhc2UgU0dfU0NTSV9SRVNFVF9UQVJHRVQ6CisJCQl2YWwgPSBTQ1NJX1RSWV9SRVNFVF9UQVJHRVQ7CisJCQlicmVhazsKIAkJY2FzZSBTR19TQ1NJX1JFU0VUX0JVUzoKIAkJCXZhbCA9IFNDU0lfVFJZX1JFU0VUX0JVUzsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCA1OTg3ZGE4Li5lNDk1ZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtODk4LDcgKzg5OCw3IEBACiAJCQkJc2NzaV9wcmludF9zZW5zZSgiIiwgY21kKTsKIAkJCXNjc2lfcHJpbnRfY29tbWFuZChjbWQpOwogCQl9Ci0JCWlmIChibGtfZW5kX3JlcXVlc3RfZXJyKHJlcSwgLUVJTykpCisJCWlmIChibGtfZW5kX3JlcXVlc3RfZXJyKHJlcSwgZXJyb3IpKQogCQkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKIAkJZWxzZQogCQkJc2NzaV9uZXh0X2NvbW1hbmQoY21kKTsKQEAgLTEzNTksOSArMTM1OSw5IEBACiBzdGF0aWMgdm9pZCBzY3NpX2tpbGxfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSByZXEtPnNwZWNpYWw7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7Ci0Jc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NzaV90YXJnZXQoc2Rldik7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAKIAlibGtfc3RhcnRfcmVxdWVzdChyZXEpOwogCkBAIC0xMzcxLDYgKzEzNzEsOSBAQAogCQlCVUcoKTsKIAl9CiAKKwlzZGV2ID0gY21kLT5kZXZpY2U7CisJc3RhcmdldCA9IHNjc2lfdGFyZ2V0KHNkZXYpOworCXNob3N0ID0gc2Rldi0+aG9zdDsKIAlzY3NpX2luaXRfY21kX2VycmgoY21kKTsKIAljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb3JlcXVlc3RfY250KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYl9kbWEuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYl9kbWEuYwppbmRleCBhYzY4NTVjLi5kY2QxMjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWJfZG1hLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliX2RtYS5jCkBAIC0yMyw3ICsyMyw3IEBACiAJaW50IG5zZWcgPSAwOwogCiAJaWYgKHNjc2lfc2dfY291bnQoY21kKSkgewotCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjbWQtPmRldmljZS0+aG9zdC0+c2hvc3RfZ2VuZGV2LnBhcmVudDsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3QtPmRtYV9kZXY7CiAKIAkJbnNlZyA9IGRtYV9tYXBfc2coZGV2LCBzY3NpX3NnbGlzdChjbWQpLCBzY3NpX3NnX2NvdW50KGNtZCksCiAJCQkJICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKQEAgLTQxLDcgKzQxLDcgQEAKIHZvaWQgc2NzaV9kbWFfdW5tYXAoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCWlmIChzY3NpX3NnX2NvdW50KGNtZCkpIHsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gY21kLT5kZXZpY2UtPmhvc3QtPnNob3N0X2dlbmRldi5wYXJlbnQ7CisJCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNtZC0+ZGV2aWNlLT5ob3N0LT5kbWFfZGV2OwogCiAJCWRtYV91bm1hcF9zZyhkZXYsIHNjc2lfc2dsaXN0KGNtZCksIHNjc2lfc2dfY291bnQoY21kKSwKIAkJCSAgICAgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMKaW5kZXggNzIzZmRlYy4uMGZkNmFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYwpAQCAtNjEzLDcgKzYxMyw3IEBACiAgKiBAZGF0YV9idWY6CQlwb2ludGVyIHRvIHZlbmRvciB1bmlxdWUgZGF0YSBidWZmZXIKICAqCiAgKiBSZXR1cm5zOgotICogICAwIG9uIHN1Y2Nlc2Z1bCByZXR1cm4KKyAqICAgMCBvbiBzdWNjZXNzZnVsIHJldHVybgogICogICBvdGhlcndpc2UsIGZhaWxpbmcgZXJyb3IgY29kZQogICoKICAqIE5vdGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCmluZGV4IDQ3MjkxYmMuLjAxMmY3M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTI1MSw2ICsyNTEsNyBAQAogCXNkZXYtPm1vZGVsID0gc2NzaV9udWxsX2RldmljZV9zdHJzOwogCXNkZXYtPnJldiA9IHNjc2lfbnVsbF9kZXZpY2Vfc3RyczsKIAlzZGV2LT5ob3N0ID0gc2hvc3Q7CisJc2Rldi0+cXVldWVfcmFtcF91cF9wZXJpb2QgPSBTQ1NJX0RFRkFVTFRfUkFNUF9VUF9QRVJJT0Q7CiAJc2Rldi0+aWQgPSBzdGFyZ2V0LT5pZDsKIAlzZGV2LT5sdW4gPSBsdW47CiAJc2Rldi0+Y2hhbm5lbCA9IHN0YXJnZXQtPmNoYW5uZWw7CkBAIC05NDEsNiArOTQyLDggQEAKIAkJfQogCX0KIAorCXNkZXYtPm1heF9xdWV1ZV9kZXB0aCA9IHNkZXYtPnF1ZXVlX2RlcHRoOworCiAJLyoKIAkgKiBPaywgdGhlIGRldmljZSBpcyBub3cgYWxsIHNldCB1cCwgd2UgY2FuCiAJICogcmVnaXN0ZXIgaXQgYW5kIHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggMzkyZDhkYi4uNWEwNjUwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC03NjYsMTAgKzc2NiwxMyBAQAogCWlmIChkZXB0aCA8IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dmFsID0gc2h0LT5jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwgZGVwdGgpOworCXJldHZhbCA9IHNodC0+Y2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsIGRlcHRoLAorCQkJCQkgU0NTSV9RREVQVEhfREVGQVVMVCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CiAKKwlzZGV2LT5tYXhfcXVldWVfZGVwdGggPSBzZGV2LT5xdWV1ZV9kZXB0aDsKKwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtNzc4LDYgKzc4MSwzNyBAQAogCSAgICAgICBzZGV2X3N0b3JlX3F1ZXVlX2RlcHRoX3J3KTsKIAogc3RhdGljIHNzaXplX3QKK3NkZXZfc2hvd19xdWV1ZV9yYW1wX3VwX3BlcmlvZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiV1XG4iLAorCQkJamlmZmllc190b19tc2VjcyhzZGV2LT5xdWV1ZV9yYW1wX3VwX3BlcmlvZCkpOworfQorCitzdGF0aWMgc3NpemVfdAorc2Rldl9zdG9yZV9xdWV1ZV9yYW1wX3VwX3BlcmlvZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHBlcmlvZDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmcGVyaW9kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZGV2LT5xdWV1ZV9yYW1wX3VwX3BlcmlvZCA9IG1zZWNzX3RvX2ppZmZpZXMocGVyaW9kKTsKKwlyZXR1cm4gcGVyaW9kOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2Rldl9hdHRyX3F1ZXVlX3JhbXBfdXBfcGVyaW9kID0KKwlfX0FUVFIocXVldWVfcmFtcF91cF9wZXJpb2QsIFNfSVJVR08gfCBTX0lXVVNSLAorCSAgICAgICBzZGV2X3Nob3dfcXVldWVfcmFtcF91cF9wZXJpb2QsCisJICAgICAgIHNkZXZfc3RvcmVfcXVldWVfcmFtcF91cF9wZXJpb2QpOworCitzdGF0aWMgc3NpemVfdAogc2Rldl9zdG9yZV9xdWV1ZV90eXBlX3J3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CkBAIC04NjcsOCArOTAxLDEyIEBACiAJc2Rldi0+aXNfdmlzaWJsZSA9IDE7CiAKIAkvKiBjcmVhdGUgcXVldWUgZmlsZXMsIHdoaWNoIG1heSBiZSB3cml0YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBob3N0ICovCi0JaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfZGVwdGgpCi0JCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5zZGV2X2dlbmRldiwgJnNkZXZfYXR0cl9xdWV1ZV9kZXB0aF9ydyk7CisJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfZGVwdGgpIHsKKwkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LAorCQkJCQkgICAmc2Rldl9hdHRyX3F1ZXVlX2RlcHRoX3J3KTsKKwkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LAorCQkJCQkgICAmc2Rldl9hdHRyX3F1ZXVlX3JhbXBfdXBfcGVyaW9kKTsKKwl9CiAJZWxzZQogCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2Rldi0+c2Rldl9nZW5kZXYsICZkZXZfYXR0cl9xdWV1ZV9kZXB0aCk7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwppbmRleCBjNmY3MGRhLi42NTMxYzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpAQCAtMjcsNiArMjcsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgpAQCAtMjM4NCw2ICsyMzg1LDcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKIAlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZG9fY2FsbGJhY2sgPSAwOwogCiAJLyoKIAkgKiBpZiBhIHNjYW4gaXMgcGVuZGluZywgZmx1c2ggdGhlIFNDU0kgSG9zdCB3b3JrX3Egc28gdGhhdApAQCAtMjQyMiw4ICsyNDI0LDE1IEBACiAJICogQXZvaWQgdGhpcyBjYWxsIGlmIHdlIGFscmVhZHkgY2FsbGVkIGl0IHdoZW4gd2UgcHJlc2VydmVkIHRoZQogCSAqIHJwb3J0IGZvciB0aGUgYmluZGluZy4KIAkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJaWYgKCEocnBvcnQtPmZsYWdzICYgRkNfUlBPUlRfREVWTE9TU19DQUxMQktfRE9ORSkgJiYKLQkgICAgKGktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmspKQorCSAgICAoaS0+Zi0+ZGV2X2xvc3NfdG1vX2NhbGxiaykpIHsKKwkJcnBvcnQtPmZsYWdzIHw9IEZDX1JQT1JUX0RFVkxPU1NfQ0FMTEJLX0RPTkU7CisJCWRvX2NhbGxiYWNrID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoZG9fY2FsbGJhY2spCiAJCWktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmsocnBvcnQpOwogCiAJZmNfYnNnX3JlbW92ZShycG9ydC0+cnFzdF9xKTsKQEAgLTI5NzAsNiArMjk3OSw3IEBACiAJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOwogCXN0cnVjdCBmY19ob3N0X2F0dHJzICpmY19ob3N0ID0gc2hvc3RfdG9fZmNfaG9zdChzaG9zdCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZG9fY2FsbGJhY2sgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCkBAIC0zMDM1LDcgKzMwNDUsNiBAQAogCXJwb3J0LT5yb2xlcyA9IEZDX1BPUlRfUk9MRV9VTktOT1dOOwogCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX05PVFBSRVNFTlQ7CiAJcnBvcnQtPmZsYWdzICY9IH5GQ19SUE9SVF9GQVNUX0ZBSUxfVElNRURPVVQ7Ci0JcnBvcnQtPmZsYWdzIHw9IEZDX1JQT1JUX0RFVkxPU1NfQ0FMTEJLX0RPTkU7CiAKIAkvKgogCSAqIFByZS1lbXB0aXZlbHkga2lsbCBJL08gcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHdvcmsgcXVldWUKQEAgLTMwNDUsMzIgKzMwNTQsNDAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlmY190ZXJtaW5hdGVfcnBvcnRfaW8ocnBvcnQpOwogCi0JQlVHX09OKHJwb3J0LT5wb3J0X3N0YXRlICE9IEZDX1BPUlRTVEFURV9OT1RQUkVTRU5UKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKLQkvKiByZW1vdmUgdGhlIGlkZW50aWZpZXJzIHRoYXQgYXJlbid0IHVzZWQgaW4gdGhlIGNvbnNpc3RpbmcgYmluZGluZyAqLwotCXN3aXRjaCAoZmNfaG9zdC0+dGd0aWRfYmluZF90eXBlKSB7Ci0JY2FzZSBGQ19UR1RJRF9CSU5EX0JZX1dXUE46Ci0JCXJwb3J0LT5ub2RlX25hbWUgPSAtMTsKLQkJcnBvcnQtPnBvcnRfaWQgPSAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBGQ19UR1RJRF9CSU5EX0JZX1dXTk46Ci0JCXJwb3J0LT5wb3J0X25hbWUgPSAtMTsKLQkJcnBvcnQtPnBvcnRfaWQgPSAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBGQ19UR1RJRF9CSU5EX0JZX0lEOgotCQlycG9ydC0+bm9kZV9uYW1lID0gLTE7Ci0JCXJwb3J0LT5wb3J0X25hbWUgPSAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBGQ19UR1RJRF9CSU5EX05PTkU6CS8qIHRvIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KLQkJYnJlYWs7CisJaWYgKHJwb3J0LT5wb3J0X3N0YXRlID09IEZDX1BPUlRTVEFURV9OT1RQUkVTRU5UKSB7CS8qIHN0aWxsIG1pc3NpbmcgKi8KKworCQkvKiByZW1vdmUgdGhlIGlkZW50aWZpZXJzIHRoYXQgYXJlbid0IHVzZWQgaW4gdGhlIGNvbnNpc3RpbmcgYmluZGluZyAqLworCQlzd2l0Y2ggKGZjX2hvc3QtPnRndGlkX2JpbmRfdHlwZSkgeworCQljYXNlIEZDX1RHVElEX0JJTkRfQllfV1dQTjoKKwkJCXJwb3J0LT5ub2RlX25hbWUgPSAtMTsKKwkJCXJwb3J0LT5wb3J0X2lkID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSBGQ19UR1RJRF9CSU5EX0JZX1dXTk46CisJCQlycG9ydC0+cG9ydF9uYW1lID0gLTE7CisJCQlycG9ydC0+cG9ydF9pZCA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgRkNfVEdUSURfQklORF9CWV9JRDoKKwkJCXJwb3J0LT5ub2RlX25hbWUgPSAtMTsKKwkJCXJwb3J0LT5wb3J0X25hbWUgPSAtMTsKKwkJCWJyZWFrOworCQljYXNlIEZDX1RHVElEX0JJTkRfTk9ORToJLyogdG8ga2VlcCBjb21waWxlciBoYXBweSAqLworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBBcyB0aGlzIG9ubHkgb2NjdXJzIGlmIHRoZSByZW1vdGUgcG9ydCAoc2NzaSB0YXJnZXQpCisJCSAqIHdlbnQgYXdheSBhbmQgZGlkbid0IGNvbWUgYmFjayAtIHdlJ2xsIHJlbW92ZQorCQkgKiBhbGwgYXR0YWNoZWQgc2NzaSBkZXZpY2VzLgorCQkgKi8KKwkJcnBvcnQtPmZsYWdzIHw9IEZDX1JQT1JUX0RFVkxPU1NfQ0FMTEJLX0RPTkU7CisJCWZjX3F1ZXVlX3dvcmsoc2hvc3QsICZycG9ydC0+c3RndF9kZWxldGVfd29yayk7CisKKwkJZG9fY2FsbGJhY2sgPSAxOwogCX0KIAotCS8qCi0JICogQXMgdGhpcyBvbmx5IG9jY3VycyBpZiB0aGUgcmVtb3RlIHBvcnQgKHNjc2kgdGFyZ2V0KQotCSAqIHdlbnQgYXdheSBhbmQgZGlkbid0IGNvbWUgYmFjayAtIHdlJ2xsIHJlbW92ZQotCSAqIGFsbCBhdHRhY2hlZCBzY3NpIGRldmljZXMuCi0JICovCi0JZmNfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zdGd0X2RlbGV0ZV93b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAogCS8qCiAJICogTm90aWZ5IHRoZSBkcml2ZXIgdGhhdCB0aGUgcnBvcnQgaXMgbm93IGRlYWQuIFRoZSBMTEREIHdpbGwKQEAgLTMwNzgsNyArMzA5NSw3IEBACiAJICoKIAkgKiBOb3RlOiB3ZSBzZXQgdGhlIENBTExCS19ET05FIGZsYWcgYWJvdmUgdG8gY29ycmVzcG9uZAogCSAqLwotCWlmIChpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKQorCWlmIChkb19jYWxsYmFjayAmJiBpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKQogCQlpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKHJwb3J0KTsKIH0KIApAQCAtMzEyOCw2ICszMTQ1LDMxIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiB9CiAKKy8qKgorICogZmNfYmxvY2tfc2NzaV9laCAtIEJsb2NrIFNDU0kgZWggdGhyZWFkIGZvciBibG9ja2VkIGZjX3Jwb3J0CisgKiBAY21uZDogU0NTSSBjb21tYW5kIHRoYXQgc2NzaV9laCBpcyB0cnlpbmcgdG8gcmVjb3ZlcgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIGZyb20gYSBGQyBMTEQgc2NzaV9laCBjYWxsYmFjay4gSXQKKyAqIGJsb2NrcyB0aGUgc2NzaV9laCB0aHJlYWQgdW50aWwgdGhlIGZjX3Jwb3J0IGxlYXZlcyB0aGUKKyAqIEZDX1BPUlRTVEFURV9CTE9DS0VELiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCB0aGUgc2NzaV9laAorICogZmFpbGluZyByZWNvdmVyeSBhY3Rpb25zIGZvciBibG9ja2VkIHJwb3J0cyB3aGljaCB3b3VsZCBsZWFkIHRvCisgKiBvZmZsaW5lZCBTQ1NJIGRldmljZXMuCisgKi8KK3ZvaWQgZmNfYmxvY2tfc2NzaV9laChzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY21uZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KGNtbmQtPmRldmljZSkpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJd2hpbGUgKHJwb3J0LT5wb3J0X3N0YXRlID09IEZDX1BPUlRTVEFURV9CTE9DS0VEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQltc2xlZXAoMTAwMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2Jsb2NrX3Njc2lfZWgpOwogCiAvKioKICAqIGZjX3Zwb3J0X3NldHVwIC0gYWxsb2NhdGVzIGFuZCBjcmVhdGVzIGEgRkMgdmlydHVhbCBwb3J0LgpAQCAtMzc2OSw4ICszODExLDkgQEAKIAkJcmV0dXJuOwogCiAJd2hpbGUgKCFibGtfcXVldWVfcGx1Z2dlZChxKSkgewotCQlpZiAocnBvcnQgJiYgKHJwb3J0LT5wb3J0X3N0YXRlID09IEZDX1BPUlRTVEFURV9CTE9DS0VEKSkKLQkJCQlicmVhazsKKwkJaWYgKHJwb3J0ICYmIChycG9ydC0+cG9ydF9zdGF0ZSA9PSBGQ19QT1JUU1RBVEVfQkxPQ0tFRCkgJiYKKwkJICAgICEocnBvcnQtPmZsYWdzICYgRkNfUlBPUlRfRkFTVF9GQUlMX1RJTUVET1VUKSkKKwkJCWJyZWFrOwogCiAJCXJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOwogCQlpZiAoIXJlcSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggYWQ4OTdkZi4uZWEzODkyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9pc2NzaV9pZi5oPgogCi0jZGVmaW5lIElTQ1NJX1NFU1NJT05fQVRUUlMgMjEKKyNkZWZpbmUgSVNDU0lfU0VTU0lPTl9BVFRSUyAyMgogI2RlZmluZSBJU0NTSV9DT05OX0FUVFJTIDEzCiAjZGVmaW5lIElTQ1NJX0hPU1RfQVRUUlMgNAogCkBAIC02MjcsOCArNjI3LDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOwogCXNjc2lfdGFyZ2V0X2Jsb2NrKCZzZXNzaW9uLT5kZXYpOwogCUlTQ1NJX0RCR19UUkFOU19TRVNTSU9OKHNlc3Npb24sICJDb21wbGV0ZWQgU0NTSSB0YXJnZXQgYmxvY2tpbmdcbiIpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhpc2NzaV9laF90aW1lcl93b3JrcSwgJnNlc3Npb24tPnJlY292ZXJ5X3dvcmssCi0JCQkgICBzZXNzaW9uLT5yZWNvdmVyeV90bW8gKiBIWik7CisJaWYgKHNlc3Npb24tPnJlY292ZXJ5X3RtbyA+PSAwKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoaXNjc2lfZWhfdGltZXJfd29ya3EsCisJCQkJICAgJnNlc3Npb24tPnJlY292ZXJ5X3dvcmssCisJCQkJICAgc2Vzc2lvbi0+cmVjb3ZlcnlfdG1vICogSFopOwogfQogCiB2b2lkIGlzY3NpX2Jsb2NrX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKQpAQCAtMTM0OCw4ICsxMzUwLDcgQEAKIAlzd2l0Y2ggKGV2LT51LnNldF9wYXJhbS5wYXJhbSkgewogCWNhc2UgSVNDU0lfUEFSQU1fU0VTU19SRUNPVkVSWV9UTU86CiAJCXNzY2FuZihkYXRhLCAiJWQiLCAmdmFsdWUpOwotCQlpZiAodmFsdWUgIT0gMCkKLQkJCXNlc3Npb24tPnJlY292ZXJ5X3RtbyA9IHZhbHVlOworCQlzZXNzaW9uLT5yZWNvdmVyeV90bW8gPSB2YWx1ZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gdHJhbnNwb3J0LT5zZXRfcGFyYW0oY29ubiwgZXYtPnUuc2V0X3BhcmFtLnBhcmFtLApAQCAtMTc1OSw2ICsxNzYwLDcgQEAKIGlzY3NpX3Nlc3Npb25fYXR0cihmYXN0X2Fib3J0LCBJU0NTSV9QQVJBTV9GQVNUX0FCT1JULCAwKTsKIGlzY3NpX3Nlc3Npb25fYXR0cihhYm9ydF90bW8sIElTQ1NJX1BBUkFNX0FCT1JUX1RNTywgMCk7CiBpc2NzaV9zZXNzaW9uX2F0dHIobHVfcmVzZXRfdG1vLCBJU0NTSV9QQVJBTV9MVV9SRVNFVF9UTU8sIDApOworaXNjc2lfc2Vzc2lvbl9hdHRyKHRndF9yZXNldF90bW8sIElTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU8sIDApOwogaXNjc2lfc2Vzc2lvbl9hdHRyKGlmYWNlbmFtZSwgSVNDU0lfUEFSQU1fSUZBQ0VfTkFNRSwgMCk7CiBpc2NzaV9zZXNzaW9uX2F0dHIoaW5pdGlhdG9ybmFtZSwgSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUUsIDApCiAKQEAgLTIwMDAsNiArMjAwMiw3IEBACiAJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGZhc3RfYWJvcnQsIElTQ1NJX0ZBU1RfQUJPUlQpOwogCVNFVFVQX1NFU1NJT05fUkRfQVRUUihhYm9ydF90bW8sIElTQ1NJX0FCT1JUX1RNTyk7CiAJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGx1X3Jlc2V0X3RtbyxJU0NTSV9MVV9SRVNFVF9UTU8pOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUih0Z3RfcmVzZXRfdG1vLElTQ1NJX1RHVF9SRVNFVF9UTU8pOwogCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpZmFjZW5hbWUsIElTQ1NJX0lGQUNFX05BTUUpOwogCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpbml0aWF0b3JuYW1lLCBJU0NTSV9JTklUSUFUT1JfTkFNRSk7CiAJU0VUVVBfUFJJVl9TRVNTSU9OX1JEX0FUVFIocmVjb3ZlcnlfdG1vKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwppbmRleCBmZDQ3Y2IxLi5mMjdlNTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCkBAIC02NjYsNyArNjY2LDcgQEAKICAqCiAgKiBOb3RlOgogICogICBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSBjYWxsZWQgb24gYSBQSFkgdGhhdCBoYXMgbm90Ci0gKiAgIHN1Y2Vzc2Z1bGx5IGJlZW4gYWRkZWQgdXNpbmcgc2FzX3BoeV9hZGQoKS4KKyAqICAgc3VjY2Vzc2Z1bGx5IGJlZW4gYWRkZWQgdXNpbmcgc2FzX3BoeV9hZGQoKS4KICAqLwogdm9pZCBzYXNfcGh5X2ZyZWUoc3RydWN0IHNhc19waHkgKnBoeSkKIHsKQEAgLTg5Niw3ICs4OTYsNyBAQAogICoKICAqIE5vdGU6CiAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIGNhbGxlZCBvbiBhIFBPUlQgdGhhdCBoYXMgbm90Ci0gKiAgIHN1Y2Vzc2Z1bGx5IGJlZW4gYWRkZWQgdXNpbmcgc2FzX3BvcnRfYWRkKCkuCisgKiAgIHN1Y2Nlc3NmdWxseSBiZWVuIGFkZGVkIHVzaW5nIHNhc19wb3J0X2FkZCgpLgogICovCiB2b2lkIHNhc19wb3J0X2ZyZWUoc3RydWN0IHNhc19wb3J0ICpwb3J0KQogewpAQCAtMTQ3Niw3ICsxNDc2LDcgQEAKICAqCiAgKiBOb3RlOgogICogICBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSBjYWxsZWQgb24gYSByZW1vdGUKLSAqICAgUEhZIHRoYXQgaGFzIG5vdCBzdWNlc3NmdWxseSBiZWVuIGFkZGVkIHVzaW5nCisgKiAgIFBIWSB0aGF0IGhhcyBub3Qgc3VjY2Vzc2Z1bGx5IGJlZW4gYWRkZWQgdXNpbmcKICAqICAgc2FzX3JwaHlfYWRkKCkgKG9yIGhhcyBiZWVuIHNhc19ycGh5X3JlbW92ZSgpJ2QpCiAgKi8KIHZvaWQgc2FzX3JwaHlfZnJlZShzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IDEyZDU4YTcuLmFkNTlhYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0yMjgwLDcgKzIyODAsOCBAQAogCX0gZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9TRVRfQ0xOKSB7CiAJCXZhbHVlID0gKG9wdGlvbnMgJiB+TVRfU1RfT1BUSU9OUykgJiAweGZmOwogCQlpZiAodmFsdWUgIT0gMCAmJgotCQkgICAgdmFsdWUgPCBFWFRFTkRFRF9TRU5TRV9TVEFSVCAmJiB2YWx1ZSA+PSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCisJCQkodmFsdWUgPCBFWFRFTkRFRF9TRU5TRV9TVEFSVCB8fAorCQkJCXZhbHVlID49IFNDU0lfU0VOU0VfQlVGRkVSU0laRSkpCiAJCQlyZXR1cm4gKC1FSU5WQUwpOwogCQlTVHAtPmNsbl9tb2RlID0gdmFsdWU7CiAJCVNUcC0+Y2xuX3NlbnNlX21hc2sgPSAob3B0aW9ucyA+PiA4KSAmIDB4ZmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3RleC5jIGIvZHJpdmVycy9zY3NpL3N0ZXguYwppbmRleCAwOWZhODg2Li4zMDU4YmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3RleC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdGV4LmMKQEAgLTM2LDExICszNiwxMSBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJzdGV4IgotI2RlZmluZSBTVF9EUklWRVJfVkVSU0lPTiAiNC42LjAwMDAuMyIKKyNkZWZpbmUgU1RfRFJJVkVSX1ZFUlNJT04gIjQuNi4wMDAwLjQiCiAjZGVmaW5lIFNUX1ZFUl9NQUpPUgkJNAogI2RlZmluZSBTVF9WRVJfTUlOT1IJCTYKICNkZWZpbmUgU1RfT0VNCQkJMAotI2RlZmluZSBTVF9CVUlMRF9WRVIJCTMKKyNkZWZpbmUgU1RfQlVJTERfVkVSCQk0CiAKIGVudW0gewogCS8qIE1VIHJlZ2lzdGVyIG9mZnNldCAqLwpAQCAtNjQsMjQgKzY0LDI0IEBACiAJWUgySV9SRVFfSEkJCQkJPSAweGM0LAogCiAJLyogTVUgcmVnaXN0ZXIgdmFsdWUgKi8KLQlNVV9JTkJPVU5EX0RPT1JCRUxMX0hBTkRTSEFLRQkJPSAxLAotCU1VX0lOQk9VTkRfRE9PUkJFTExfUkVRSEVBRENIQU5HRUQJPSAyLAotCU1VX0lOQk9VTkRfRE9PUkJFTExfU1RBVFVTVEFJTENIQU5HRUQJPSA0LAotCU1VX0lOQk9VTkRfRE9PUkJFTExfSE1VU1RPUFBFRAkJPSA4LAotCU1VX0lOQk9VTkRfRE9PUkJFTExfUkVTRVQJCT0gMTYsCisJTVVfSU5CT1VORF9ET09SQkVMTF9IQU5EU0hBS0UJCT0gKDEgPDwgMCksCisJTVVfSU5CT1VORF9ET09SQkVMTF9SRVFIRUFEQ0hBTkdFRAk9ICgxIDw8IDEpLAorCU1VX0lOQk9VTkRfRE9PUkJFTExfU1RBVFVTVEFJTENIQU5HRUQJPSAoMSA8PCAyKSwKKwlNVV9JTkJPVU5EX0RPT1JCRUxMX0hNVVNUT1BQRUQJCT0gKDEgPDwgMyksCisJTVVfSU5CT1VORF9ET09SQkVMTF9SRVNFVAkJPSAoMSA8PCA0KSwKIAotCU1VX09VVEJPVU5EX0RPT1JCRUxMX0hBTkRTSEFLRQkJPSAxLAotCU1VX09VVEJPVU5EX0RPT1JCRUxMX1JFUVVFU1RUQUlMQ0hBTkdFRAk9IDIsCi0JTVVfT1VUQk9VTkRfRE9PUkJFTExfU1RBVFVTSEVBRENIQU5HRUQJPSA0LAotCU1VX09VVEJPVU5EX0RPT1JCRUxMX0JVU0NIQU5HRQkJPSA4LAotCU1VX09VVEJPVU5EX0RPT1JCRUxMX0hBU0VWRU5UCQk9IDE2LAorCU1VX09VVEJPVU5EX0RPT1JCRUxMX0hBTkRTSEFLRQkJPSAoMSA8PCAwKSwKKwlNVV9PVVRCT1VORF9ET09SQkVMTF9SRVFVRVNUVEFJTENIQU5HRUQJPSAoMSA8PCAxKSwKKwlNVV9PVVRCT1VORF9ET09SQkVMTF9TVEFUVVNIRUFEQ0hBTkdFRAk9ICgxIDw8IDIpLAorCU1VX09VVEJPVU5EX0RPT1JCRUxMX0JVU0NIQU5HRQkJPSAoMSA8PCAzKSwKKwlNVV9PVVRCT1VORF9ET09SQkVMTF9IQVNFVkVOVAkJPSAoMSA8PCA0KSwKKwlNVV9PVVRCT1VORF9ET09SQkVMTF9SRVFVRVNUX1JFU0VUCT0gKDEgPDwgMjcpLAogCiAJLyogTVUgc3RhdHVzIGNvZGUgKi8KIAlNVV9TVEFURV9TVEFSVElORwkJCT0gMSwKLQlNVV9TVEFURV9GTVVfUkVBRFlfRk9SX0hBTkRTSEFLRQk9IDIsCi0JTVVfU1RBVEVfU0VORF9IQU5EU0hBS0VfRlJBTUUJCT0gMywKLQlNVV9TVEFURV9TVEFSVEVECQkJPSA0LAotCU1VX1NUQVRFX1JFU0VUVElORwkJCT0gNSwKKwlNVV9TVEFURV9TVEFSVEVECQkJPSAyLAorCU1VX1NUQVRFX1JFU0VUVElORwkJCT0gMywKKwlNVV9TVEFURV9GQUlMRUQJCQkJPSA0LAogCiAJTVVfTUFYX0RFTEFZCQkJCT0gMTIwLAogCU1VX0hBTkRTSEFLRV9TSUdOQVRVUkUJCQk9IDB4NTVhYWFhNTUsCkBAIC0xMTEsNiArMTExLDggQEAKIAogCVNTX0gySV9JTlRfUkVTRVQJCQk9IDB4MTAwLAogCisJU1NfSTJIX1JFUVVFU1RfUkVTRVQJCQk9IDB4MjAwMCwKKwogCVNTX01VX09QRVJBVElPTkFMCQkJPSAweDgwMDAwMDAwLAogCiAJU1RFWF9DREJfTEVOR1RICQkJCT0gMTYsCkBAIC0xNjAsNiArMTYyLDcgQEAKIAlJTlFVSVJZX0VWUEQJCQkJPSAweDAxLAogCiAJU1RfQURESVRJT05BTF9NRU0JCQk9IDB4MjAwMDAwLAorCVNUX0FERElUSU9OQUxfTUVNX01JTgkJCT0gMHg4MDAwMCwKIH07CiAKIHN0cnVjdCBzdF9zZ2l0ZW0gewpAQCAtMzExLDYgKzMxNCwxMCBAQAogCXN0cnVjdCBzdF9jY2IgKndhaXRfY2NiOwogCV9fbGUzMiAqc2NyYXRjaDsKIAorCWNoYXIgd29ya19xX25hbWVbMjBdOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrX3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dvcms7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfd2FpdHE7CiAJdW5zaWduZWQgaW50IG11X3N0YXR1czsKIAl1bnNpZ25lZCBpbnQgY2FyZHR5cGU7CiAJaW50IG1zaV9lbmFibGVkOwpAQCAtNTc3LDYgKzU4NCw5IEBACiAJbHVuID0gY21kLT5kZXZpY2UtPmx1bjsKIAloYmEgPSAoc3RydWN0IHN0X2hiYSAqKSAmaG9zdC0+aG9zdGRhdGFbMF07CiAKKwlpZiAodW5saWtlbHkoaGJhLT5tdV9zdGF0dXMgPT0gTVVfU1RBVEVfUkVTRVRUSU5HKSkKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKIAlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgewogCWNhc2UgTU9ERV9TRU5TRV8xMDoKIAl7CkBAIC04NDEsNyArODUxLDYgQEAKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBoYmEtPm1taW9fYmFzZTsKIAl1MzIgZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBoYW5kbGVkID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKQEAgLTg1MiwxMiArODYxLDE2IEBACiAJCXdyaXRlbChkYXRhLCBiYXNlICsgT0RCTCk7CiAJCXJlYWRsKGJhc2UgKyBPREJMKTsgLyogZmx1c2ggKi8KIAkJc3RleF9tdV9pbnRyKGhiYSwgZGF0YSk7Ci0JCWhhbmRsZWQgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmICh1bmxpa2VseShkYXRhICYgTVVfT1VUQk9VTkRfRE9PUkJFTExfUkVRVUVTVF9SRVNFVCAmJgorCQkJaGJhLT5jYXJkdHlwZSA9PSBzdF9zaGFzdGEpKQorCQkJcXVldWVfd29yayhoYmEtPndvcmtfcSwgJmhiYS0+cmVzZXRfd29yayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKKwlyZXR1cm4gSVJRX05PTkU7CiB9CiAKIHN0YXRpYyB2b2lkIHN0ZXhfc3NfbXVfaW50cihzdHJ1Y3Qgc3RfaGJhICpoYmEpCkBAIC05MzksNyArOTUyLDYgQEAKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBoYmEtPm1taW9fYmFzZTsKIAl1MzIgZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBoYW5kbGVkID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKQEAgLTk0OCwxMiArOTYwLDE1IEBACiAJCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KIAkJd3JpdGVsKGRhdGEsIGJhc2UgKyBZSTJIX0lOVF9DKTsKIAkJc3RleF9zc19tdV9pbnRyKGhiYSk7Ci0JCWhhbmRsZWQgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmICh1bmxpa2VseShkYXRhICYgU1NfSTJIX1JFUVVFU1RfUkVTRVQpKQorCQkJcXVldWVfd29yayhoYmEtPndvcmtfcSwgJmhiYS0+cmVzZXRfd29yayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKKwlyZXR1cm4gSVJRX05PTkU7CiB9CiAKIHN0YXRpYyBpbnQgc3RleF9jb21tb25faGFuZHNoYWtlKHN0cnVjdCBzdF9oYmEgKmhiYSkKQEAgLTEwMDEsNyArMTAxNiw3IEBACiAJaC0+cGFydG5lcl90eXBlID0gSE1VX1BBUlRORVJfVFlQRTsKIAlpZiAoaGJhLT5leHRyYV9vZmZzZXQpIHsKIAkJaC0+ZXh0cmFfb2Zmc2V0ID0gY3B1X3RvX2xlMzIoaGJhLT5leHRyYV9vZmZzZXQpOwotCQloLT5leHRyYV9zaXplID0gY3B1X3RvX2xlMzIoU1RfQURESVRJT05BTF9NRU0pOworCQloLT5leHRyYV9zaXplID0gY3B1X3RvX2xlMzIoaGJhLT5kbWFfc2l6ZSAtIGhiYS0+ZXh0cmFfb2Zmc2V0KTsKIAl9IGVsc2UKIAkJaC0+ZXh0cmFfb2Zmc2V0ID0gaC0+ZXh0cmFfc2l6ZSA9IDA7CiAKQEAgLTEwNDYsNyArMTA2MSw3IEBACiAJc3RydWN0IHN0X21zZ19oZWFkZXIgKm1zZ19oOwogCXN0cnVjdCBoYW5kc2hha2VfZnJhbWUgKmg7CiAJX19sZTMyICpzY3JhdGNoOwotCXUzMiBkYXRhOworCXUzMiBkYXRhLCBzY3JhdGNoX3NpemU7CiAJdW5zaWduZWQgbG9uZyBiZWZvcmU7CiAJaW50IHJldCA9IDA7CiAKQEAgLTEwNzQsMTMgKzEwODksMTYgQEAKIAlzdGV4X2dldHRpbWUoJmgtPmhvc3R0aW1lKTsKIAloLT5wYXJ0bmVyX3R5cGUgPSBITVVfUEFSVE5FUl9UWVBFOwogCWgtPmV4dHJhX29mZnNldCA9IGgtPmV4dHJhX3NpemUgPSAwOwotCWgtPnNjcmF0Y2hfc2l6ZSA9IGNwdV90b19sZTMyKChoYmEtPnN0c19jb3VudCsxKSpzaXplb2YodTMyKSk7CisJc2NyYXRjaF9zaXplID0gKGhiYS0+c3RzX2NvdW50KzEpKnNpemVvZih1MzIpOworCWgtPnNjcmF0Y2hfc2l6ZSA9IGNwdV90b19sZTMyKHNjcmF0Y2hfc2l6ZSk7CiAKIAlkYXRhID0gcmVhZGwoYmFzZSArIFlJTlRfRU4pOwogCWRhdGEgJj0gfjQ7CiAJd3JpdGVsKGRhdGEsIGJhc2UgKyBZSU5UX0VOKTsKIAl3cml0ZWwoKGhiYS0+ZG1hX2hhbmRsZSA+PiAxNikgPj4gMTYsIGJhc2UgKyBZSDJJX1JFUV9ISSk7CisJcmVhZGwoYmFzZSArIFlIMklfUkVRX0hJKTsKIAl3cml0ZWwoaGJhLT5kbWFfaGFuZGxlLCBiYXNlICsgWUgySV9SRVEpOworCXJlYWRsKGJhc2UgKyBZSDJJX1JFUSk7IC8qIGZsdXNoICovCiAKIAlzY3JhdGNoID0gaGJhLT5zY3JhdGNoOwogCWJlZm9yZSA9IGppZmZpZXM7CkBAIC0xMDk2LDcgKzExMTQsNyBAQAogCQltc2xlZXAoMSk7CiAJfQogCi0JKnNjcmF0Y2ggPSAwOworCW1lbXNldChzY3JhdGNoLCAwLCBzY3JhdGNoX3NpemUpOwogCW1zZ19oLT5mbGFnID0gMDsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTEwNSwxOSArMTEyMywyNCBAQAogewogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbXVfc3RhdHVzOwogCiAJZXJyID0gKGhiYS0+Y2FyZHR5cGUgPT0gc3RfeWVsKSA/CiAJCXN0ZXhfc3NfaGFuZHNoYWtlKGhiYSkgOiBzdGV4X2NvbW1vbl9oYW5kc2hha2UoaGJhKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCW11X3N0YXR1cyA9IGhiYS0+bXVfc3RhdHVzOwogCWlmIChlcnIgPT0gMCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQloYmEtPnJlcV9oZWFkID0gMDsKIAkJaGJhLT5yZXFfdGFpbCA9IDA7CiAJCWhiYS0+c3RhdHVzX2hlYWQgPSAwOwogCQloYmEtPnN0YXR1c190YWlsID0gMDsKIAkJaGJhLT5vdXRfcmVxX2NudCA9IDA7CiAJCWhiYS0+bXVfc3RhdHVzID0gTVVfU1RBVEVfU1RBUlRFRDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCX0KKwl9IGVsc2UKKwkJaGJhLT5tdV9zdGF0dXMgPSBNVV9TVEFURV9GQUlMRUQ7CisJaWYgKG11X3N0YXR1cyA9PSBNVV9TVEFURV9SRVNFVFRJTkcpCisJCXdha2VfdXBfYWxsKCZoYmEtPnJlc2V0X3dhaXRxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTEzNywxNyArMTE2MCwxMSBAQAogCiAJYmFzZSA9IGhiYS0+bW1pb19iYXNlOwogCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCWlmICh0YWcgPCBob3N0LT5jYW5fcXVldWUgJiYgaGJhLT5jY2JbdGFnXS5jbWQgPT0gY21kKQorCWlmICh0YWcgPCBob3N0LT5jYW5fcXVldWUgJiYKKwkJaGJhLT5jY2JbdGFnXS5yZXEgJiYgaGJhLT5jY2JbdGFnXS5jbWQgPT0gY21kKQogCQloYmEtPndhaXRfY2NiID0gJmhiYS0+Y2NiW3RhZ107Ci0JZWxzZSB7Ci0JCWZvciAodGFnID0gMDsgdGFnIDwgaG9zdC0+Y2FuX3F1ZXVlOyB0YWcrKykKLQkJCWlmIChoYmEtPmNjYlt0YWddLmNtZCA9PSBjbWQpIHsKLQkJCQloYmEtPndhaXRfY2NiID0gJmhiYS0+Y2NiW3RhZ107Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWlmICh0YWcgPj0gaG9zdC0+Y2FuX3F1ZXVlKQotCQkJZ290byBvdXQ7Ci0JfQorCWVsc2UKKwkJZ290byBvdXQ7CiAKIAlpZiAoaGJhLT5jYXJkdHlwZSA9PSBzdF95ZWwpIHsKIAkJZGF0YSA9IHJlYWRsKGJhc2UgKyBZSTJIX0lOVCk7CkBAIC0xMjIxLDYgKzEyMzgsMzcgQEAKIAkJCWhiYS0+cGRldi0+c2F2ZWRfY29uZmlnX3NwYWNlW2ldKTsKIH0KIAorc3RhdGljIGludCBzdGV4X3lvc19yZXNldChzdHJ1Y3Qgc3RfaGJhICpoYmEpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGJlZm9yZTsKKwlpbnQgcmV0ID0gMDsKKworCWJhc2UgPSBoYmEtPm1taW9fYmFzZTsKKwl3cml0ZWwoTVVfSU5CT1VORF9ET09SQkVMTF9SRVNFVCwgYmFzZSArIElEQkwpOworCXJlYWRsKGJhc2UgKyBJREJMKTsgLyogZmx1c2ggKi8KKwliZWZvcmUgPSBqaWZmaWVzOworCXdoaWxlIChoYmEtPm91dF9yZXFfY250ID4gMCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBiZWZvcmUgKyBTVF9JTlRFUk5BTF9USU1FT1VUICogSFopKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkJIiglcyk6IHJlc2V0IHRpbWVvdXRcbiIsIHBjaV9uYW1lKGhiYS0+cGRldikpOworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpZiAocmV0ID09IC0xKQorCQloYmEtPm11X3N0YXR1cyA9IE1VX1NUQVRFX0ZBSUxFRDsKKwllbHNlCisJCWhiYS0+bXVfc3RhdHVzID0gTVVfU1RBVEVfU1RBUlRFRDsKKwl3YWtlX3VwX2FsbCgmaGJhLT5yZXNldF93YWl0cSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgc3RleF9zc19yZXNldChzdHJ1Y3Qgc3RfaGJhICpoYmEpCiB7CiAJd3JpdGVsKFNTX0gySV9JTlRfUkVTRVQsIGhiYS0+bW1pb19iYXNlICsgWUgySV9JTlQpOwpAQCAtMTIyOCwxMSArMTI3Niw3MSBAQAogCXNzbGVlcCg1KTsKIH0KIAorc3RhdGljIGludCBzdGV4X2RvX3Jlc2V0KHN0cnVjdCBzdF9oYmEgKmhiYSkKK3sKKwlzdHJ1Y3Qgc3RfY2NiICpjY2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbXVfc3RhdHVzID0gTVVfU1RBVEVfUkVTRVRUSU5HOworCXUxNiB0YWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmIChoYmEtPm11X3N0YXR1cyA9PSBNVV9TVEFURV9TVEFSVElORykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIiglcyk6IHJlcXVlc3QgcmVzZXQgZHVyaW5nIGluaXRcbiIsCisJCQlwY2lfbmFtZShoYmEtPnBkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChoYmEtPm11X3N0YXR1cyA9PSBNVV9TVEFURV9SRVNFVFRJTkcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl3YWl0X2V2ZW50X3RpbWVvdXQoaGJhLT5yZXNldF93YWl0cSwKKwkJCQkgICBoYmEtPm11X3N0YXR1cyAhPSBNVV9TVEFURV9SRVNFVFRJTkcsCisJCQkJICAgTVVfTUFYX0RFTEFZICogSFopOworCQlzcGluX2xvY2tfaXJxc2F2ZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQltdV9zdGF0dXMgPSBoYmEtPm11X3N0YXR1czsKKwl9CisKKwlpZiAobXVfc3RhdHVzICE9IE1VX1NUQVRFX1JFU0VUVElORykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAobXVfc3RhdHVzID09IE1VX1NUQVRFX1NUQVJURUQpID8gMCA6IC0xOworCX0KKworCWhiYS0+bXVfc3RhdHVzID0gTVVfU1RBVEVfUkVTRVRUSU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmIChoYmEtPmNhcmR0eXBlID09IHN0X3lvc2VtaXRlKQorCQlyZXR1cm4gc3RleF95b3NfcmVzZXQoaGJhKTsKKworCWlmIChoYmEtPmNhcmR0eXBlID09IHN0X3NoYXN0YSkKKwkJc3RleF9oYXJkX3Jlc2V0KGhiYSk7CisJZWxzZSBpZiAoaGJhLT5jYXJkdHlwZSA9PSBzdF95ZWwpCisJCXN0ZXhfc3NfcmVzZXQoaGJhKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJZm9yICh0YWcgPSAwOyB0YWcgPCBoYmEtPmhvc3QtPmNhbl9xdWV1ZTsgdGFnKyspIHsKKwkJY2NiID0gJmhiYS0+Y2NiW3RhZ107CisJCWlmIChjY2ItPnJlcSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWNjYi0+cmVxID0gTlVMTDsKKwkJaWYgKGNjYi0+Y21kKSB7CisJCQlzY3NpX2RtYV91bm1hcChjY2ItPmNtZCk7CisJCQljY2ItPmNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJY2NiLT5jbWQtPnNjc2lfZG9uZShjY2ItPmNtZCk7CisJCQljY2ItPmNtZCA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShoYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHN0ZXhfaGFuZHNoYWtlKGhiYSkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICIoJXMpOiByZXNldHRpbmc6IGhhbmRzaGFrZSBmYWlsZWRcbiIsCisJCXBjaV9uYW1lKGhiYS0+cGRldikpOworCXJldHVybiAtMTsKK30KKwogc3RhdGljIGludCBzdGV4X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3Qgc3RfaGJhICpoYmE7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGJlZm9yZTsKIAogCWhiYSA9IChzdHJ1Y3Qgc3RfaGJhICopICZjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CiAKQEAgLTEyNDAsNTQgKzEzNDgsMTQgQEAKIAkJIiglcyk6IHJlc2V0dGluZyBob3N0XG4iLCBwY2lfbmFtZShoYmEtPnBkZXYpKTsKIAlzY3NpX3ByaW50X2NvbW1hbmQoY21kKTsKIAotCWhiYS0+bXVfc3RhdHVzID0gTVVfU1RBVEVfUkVTRVRUSU5HOworCXJldHVybiBzdGV4X2RvX3Jlc2V0KGhiYSkgPyBGQUlMRUQgOiBTVUNDRVNTOworfQogCi0JaWYgKGhiYS0+Y2FyZHR5cGUgPT0gc3Rfc2hhc3RhKQotCQlzdGV4X2hhcmRfcmVzZXQoaGJhKTsKLQllbHNlIGlmIChoYmEtPmNhcmR0eXBlID09IHN0X3llbCkKLQkJc3RleF9zc19yZXNldChoYmEpOworc3RhdGljIHZvaWQgc3RleF9yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc3RfaGJhICpoYmEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHN0X2hiYSwgcmVzZXRfd29yayk7CiAKLQlpZiAoaGJhLT5jYXJkdHlwZSAhPSBzdF95b3NlbWl0ZSkgewotCQlpZiAoc3RleF9oYW5kc2hha2UoaGJhKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQotCQkJCSIoJXMpOiByZXNldHRpbmc6IGhhbmRzaGFrZSBmYWlsZWRcbiIsCi0JCQkJcGNpX25hbWUoaGJhLT5wZGV2KSk7Ci0JCQlyZXR1cm4gRkFJTEVEOwotCQl9Ci0JCXJldHVybiBTVUNDRVNTOwotCX0KLQotCS8qIHN0X3lvc2VtaXRlICovCi0Jd3JpdGVsKE1VX0lOQk9VTkRfRE9PUkJFTExfUkVTRVQsIGhiYS0+bW1pb19iYXNlICsgSURCTCk7Ci0JcmVhZGwoaGJhLT5tbWlvX2Jhc2UgKyBJREJMKTsgLyogZmx1c2ggKi8KLQliZWZvcmUgPSBqaWZmaWVzOwotCXdoaWxlIChoYmEtPm91dF9yZXFfY250ID4gMCkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBiZWZvcmUgKyBTVF9JTlRFUk5BTF9USU1FT1VUICogSFopKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCi0JCQkJIiglcyk6IHJlc2V0IHRpbWVvdXRcbiIsIHBjaV9uYW1lKGhiYS0+cGRldikpOwotCQkJcmV0dXJuIEZBSUxFRDsKLQkJfQotCQltc2xlZXAoMSk7Ci0JfQotCi0JYmFzZSA9IGhiYS0+bW1pb19iYXNlOwotCXdyaXRlbCgwLCBiYXNlICsgSU1SMCk7Ci0JcmVhZGwoYmFzZSArIElNUjApOwotCXdyaXRlbCgwLCBiYXNlICsgT01SMCk7Ci0JcmVhZGwoYmFzZSArIE9NUjApOwotCXdyaXRlbCgwLCBiYXNlICsgSU1SMSk7Ci0JcmVhZGwoYmFzZSArIElNUjEpOwotCXdyaXRlbCgwLCBiYXNlICsgT01SMSk7Ci0JcmVhZGwoYmFzZSArIE9NUjEpOyAvKiBmbHVzaCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaGJhLT5yZXFfaGVhZCA9IDA7Ci0JaGJhLT5yZXFfdGFpbCA9IDA7Ci0JaGJhLT5zdGF0dXNfaGVhZCA9IDA7Ci0JaGJhLT5zdGF0dXNfdGFpbCA9IDA7Ci0JaGJhLT5vdXRfcmVxX2NudCA9IDA7Ci0JaGJhLT5tdV9zdGF0dXMgPSBNVV9TVEFURV9TVEFSVEVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gU1VDQ0VTUzsKKwlzdGV4X2RvX3Jlc2V0KGhiYSk7CiB9CiAKIHN0YXRpYyBpbnQgc3RleF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LApAQCAtMTQyMCw4ICsxNDg4LDggQEAKIHsKIAlpbnQgcmV0OwogCi0JaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsICBETUFfQklUX01BU0soNjQpKQotCQkmJiAhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsICBETUFfQklUX01BU0soNjQpKSkKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkKKwkJJiYgIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKSkKIAkJcmV0dXJuIDA7CiAJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAoIXJldCkKQEAgLTE1MjgsMTAgKzE1OTYsMjQgQEAKIAloYmEtPmRtYV9tZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKIAkJaGJhLT5kbWFfc2l6ZSwgJmhiYS0+ZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYmEtPmRtYV9tZW0pIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiBkbWEgbWVtIGFsbG9jIGZhaWxlZFxuIiwKLQkJCXBjaV9uYW1lKHBkZXYpKTsKLQkJZ290byBvdXRfaW91bm1hcDsKKwkJLyogUmV0cnkgbWluaW11bSBjb2hlcmVudCBtYXBwaW5nIGZvciBzdF9zZXEgYW5kIHN0X3ZzYyAqLworCQlpZiAoaGJhLT5jYXJkdHlwZSA9PSBzdF9zZXEgfHwKKwkJICAgIChoYmEtPmNhcmR0eXBlID09IHN0X3ZzYyAmJiAocGRldi0+c3Vic3lzdGVtX2RldmljZSAmIDEpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJCSIoJXMpOiBhbGxvY2F0aW5nIG1pbiBidWZmZXIgZm9yIGNvbnRyb2xsZXJcbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJaGJhLT5kbWFfc2l6ZSA9IGhiYS0+ZXh0cmFfb2Zmc2V0CisJCQkJKyBTVF9BRERJVElPTkFMX01FTV9NSU47CisJCQloYmEtPmRtYV9tZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQloYmEtPmRtYV9zaXplLCAmaGJhLT5kbWFfaGFuZGxlLCBHRlBfS0VSTkVMKTsKKwkJfQorCisJCWlmICghaGJhLT5kbWFfbWVtKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiBkbWEgbWVtIGFsbG9jIGZhaWxlZFxuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCQlnb3RvIG91dF9pb3VubWFwOworCQl9CiAJfQogCiAJaGJhLT5jY2IgPSBrY2FsbG9jKGNpLT5ycV9jb3VudCwgc2l6ZW9mKHN0cnVjdCBzdF9jY2IpLCBHRlBfS0VSTkVMKTsKQEAgLTE1NjgsMTIgKzE2NTAsMjQgQEAKIAogCWhiYS0+aG9zdCA9IGhvc3Q7CiAJaGJhLT5wZGV2ID0gcGRldjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoYmEtPnJlc2V0X3dhaXRxKTsKKworCXNucHJpbnRmKGhiYS0+d29ya19xX25hbWUsIHNpemVvZihoYmEtPndvcmtfcV9uYW1lKSwKKwkJICJzdGV4X3dxXyVkIiwgaG9zdC0+aG9zdF9ubyk7CisJaGJhLT53b3JrX3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShoYmEtPndvcmtfcV9uYW1lKTsKKwlpZiAoIWhiYS0+d29ya19xKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogY3JlYXRlIHdvcmtxdWV1ZSBmYWlsZWRcbiIsCisJCQlwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2NjYl9mcmVlOworCX0KKwlJTklUX1dPUksoJmhiYS0+cmVzZXRfd29yaywgc3RleF9yZXNldF93b3JrKTsKIAogCWVyciA9IHN0ZXhfcmVxdWVzdF9pcnEoaGJhKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogcmVxdWVzdCBpcnEgZmFpbGVkXG4iLAogCQkJcGNpX25hbWUocGRldikpOwotCQlnb3RvIG91dF9jY2JfZnJlZTsKKwkJZ290byBvdXRfZnJlZV93cTsKIAl9CiAKIAllcnIgPSBzdGV4X2hhbmRzaGFrZShoYmEpOwpAQCAtMTYwMiw2ICsxNjk2LDggQEAKIAogb3V0X2ZyZWVfaXJxOgogCXN0ZXhfZnJlZV9pcnEoaGJhKTsKK291dF9mcmVlX3dxOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGhiYS0+d29ya19xKTsKIG91dF9jY2JfZnJlZToKIAlrZnJlZShoYmEtPmNjYik7CiBvdXRfcGNpX2ZyZWU6CkBAIC0xNjY5LDYgKzE3NjUsOCBAQAogewogCXN0ZXhfZnJlZV9pcnEoaGJhKTsKIAorCWRlc3Ryb3lfd29ya3F1ZXVlKGhiYS0+d29ya19xKTsKKwogCWlvdW5tYXAoaGJhLT5tbWlvX2Jhc2UpOwogCiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhoYmEtPnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYwppbmRleCA0NTM3NGQ2Li4yYjM4ZjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYworKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYwpAQCAtMTg2NCw3ICsxODY0LDcgQEAKICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgc2ltaWxhciB0byBzeW1fc2V0X3dvcmthcm91bmRzKCksIGV4Y2VwdAogICogdGhhdCwgYXQgdGhpcyBwb2ludCwgd2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGRldmljZSB3YXMKLSAqIHN1Y2Nlc2Z1bGx5IGludGlhbGl6ZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUsIGFuZCBzbyBtb3N0CisgKiBzdWNjZXNzZnVsbHkgaW50aWFsaXplZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSwgYW5kIHNvIG1vc3QKICAqIG9mIHRoZSBzdGVwcyB0YWtlbiB0aGVyZSBhcmUgdW4tbmVlZGVkIGhlcmUuCiAgKi8KIHN0YXRpYyB2b2lkIHN5bTJfcmVzZXRfd29ya2Fyb3VuZHMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuYyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5jCmluZGV4IDI5N2RlYjguLmE3YmM4YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5jCkBAIC0yNjkyLDcgKzI2OTIsNyBAQAogCSAqICB3ZSBmb3JjZSBhIFNJUl9ORUdPX1BST1RPIGludGVycnVwdCAoaXQgaXMgYSBoYWNrIHRoYXQgYXZvaWRzIAogCSAqICBibG9hdCBmb3Igc3VjaCBhIHNob3VsZF9ub3RfaGFwcGVuIHNpdHVhdGlvbikuCiAJICogIEluIGFsbCBvdGhlciBzaXR1YXRpb24sIHdlIHJlc2V0IHRoZSBCVVMuCi0JICogIEFyZSB0aGVzZSBhc3N1bXB0aW9ucyByZWFzb25uYWJsZSA/IChXYWl0IGFuZCBzZWUgLi4uKQorCSAqICBBcmUgdGhlc2UgYXNzdW1wdGlvbnMgcmVhc29uYWJsZSA/IChXYWl0IGFuZCBzZWUgLi4uKQogCSAqLwogdW5leHBlY3RlZF9waGFzZToKIAlkc3AgLT0gODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmgKaW5kZXggMDUzZTYzYy4uNWE4MGNiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmgKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmgKQEAgLTU0LDcgKzU0LDcgQEAKICAqCiAgKiAgICBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORwogICogICAgICAgIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgZHJpdmVyIHRyaWVzIHRvIGxpbWl0IHRhZ2dlZCAKLSAqICAgICAgICBjb21tYW5kIHJlb3JkZXJpbmcgdG8gc29tZSByZWFzb25uYWJsZSB2YWx1ZS4KKyAqICAgICAgICBjb21tYW5kIHJlb3JkZXJpbmcgdG8gc29tZSByZWFzb25hYmxlIHZhbHVlLgogICogICAgICAgIChzZXQgZm9yIExpbnV4KQogICovCiAjaWYgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuYyBiL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2MDRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmMKQEAgLTAsMCArMSwxNDA3IEBACisvKgorICogTGludXggZHJpdmVyIGZvciBWTXdhcmUncyBwYXJhLXZpcnR1YWxpemVkIFNDU0kgSEJBLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSBhbmQgbm8gbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIE1haW50YWluZWQgYnk6IEFsb2sgTiBLYXRhcmlhIDxha2F0YXJpYUB2bXdhcmUuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorCisjaW5jbHVkZSAidm13X3B2c2NzaS5oIgorCisjZGVmaW5lIFBWU0NTSV9MSU5VWF9EUklWRVJfREVTQyAiVk13YXJlIFBWU0NTSSBkcml2ZXIiCisKK01PRFVMRV9ERVNDUklQVElPTihQVlNDU0lfTElOVVhfRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUigiVk13YXJlLCBJbmMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihQVlNDU0lfRFJJVkVSX1ZFUlNJT05fU1RSSU5HKTsKKworI2RlZmluZSBQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfUEVSX1JJTkcJOAorI2RlZmluZSBQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfTVNHX1JJTkcJMQorI2RlZmluZSBQVlNDU0lfREVGQVVMVF9RVUVVRV9ERVBUSAkJNjQKKyNkZWZpbmUgU0dMX1NJWkUJCQkJUEFHRV9TSVpFCisKK3N0cnVjdCBwdnNjc2lfc2dfbGlzdCB7CisJc3RydWN0IFBWU0NTSVNHRWxlbWVudCBzZ2VbUFZTQ1NJX01BWF9OVU1fU0dfRU5UUklFU19QRVJfU0VHTUVOVF07Cit9OworCitzdHJ1Y3QgcHZzY3NpX2N0eCB7CisJLyoKKwkgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnRleHQgaW4gY21kX21hcCBzZXJ2ZXMgYXMgdGhlIGNvbnRleHQgSUQgZm9yIGEKKwkgKiAxLXRvLTEgbWFwcGluZyBjb21wbGV0aW9ucyBiYWNrIHRvIHJlcXVlc3RzLgorCSAqLworCXN0cnVjdCBzY3NpX2NtbmQJKmNtZDsKKwlzdHJ1Y3QgcHZzY3NpX3NnX2xpc3QJKnNnbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJZG1hX2FkZHJfdAkJZGF0YVBBOworCWRtYV9hZGRyX3QJCXNlbnNlUEE7CisJZG1hX2FkZHJfdAkJc2dsUEE7Cit9OworCitzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgeworCWNoYXIJCQkJKm1taW9CYXNlOworCXVuc2lnbmVkIGludAkJCWlycTsKKwl1OAkJCQlyZXY7CisJYm9vbAkJCQl1c2VfbXNpOworCWJvb2wJCQkJdXNlX21zaXg7CisJYm9vbAkJCQl1c2VfbXNnOworCisJc3BpbmxvY2tfdAkJCWh3X2xvY2s7CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkJKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcms7CisKKwlzdHJ1Y3QgUFZTQ1NJUmluZ1JlcURlc2MJKnJlcV9yaW5nOworCXVuc2lnbmVkCQkJcmVxX3BhZ2VzOworCXVuc2lnbmVkCQkJcmVxX2RlcHRoOworCWRtYV9hZGRyX3QJCQlyZXFSaW5nUEE7CisKKwlzdHJ1Y3QgUFZTQ1NJUmluZ0NtcERlc2MJKmNtcF9yaW5nOworCXVuc2lnbmVkCQkJY21wX3BhZ2VzOworCWRtYV9hZGRyX3QJCQljbXBSaW5nUEE7CisKKwlzdHJ1Y3QgUFZTQ1NJUmluZ01zZ0Rlc2MJKm1zZ19yaW5nOworCXVuc2lnbmVkCQkJbXNnX3BhZ2VzOworCWRtYV9hZGRyX3QJCQltc2dSaW5nUEE7CisKKwlzdHJ1Y3QgUFZTQ1NJUmluZ3NTdGF0ZQkJKnJpbmdzX3N0YXRlOworCWRtYV9hZGRyX3QJCQlyaW5nU3RhdGVQQTsKKworCXN0cnVjdCBwY2lfZGV2CQkJKmRldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CQkqaG9zdDsKKworCXN0cnVjdCBsaXN0X2hlYWQJCWNtZF9wb29sOworCXN0cnVjdCBwdnNjc2lfY3R4CQkqY21kX21hcDsKK307CisKKworLyogQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgcHZzY3NpX3JpbmdfcGFnZXMgICAgID0gUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HOworc3RhdGljIGludCBwdnNjc2lfbXNnX3JpbmdfcGFnZXMgPSBQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfTVNHX1JJTkc7CitzdGF0aWMgaW50IHB2c2NzaV9jbWRfcGVyX2x1biAgICA9IFBWU0NTSV9ERUZBVUxUX1FVRVVFX0RFUFRIOworc3RhdGljIGJvb2wgcHZzY3NpX2Rpc2FibGVfbXNpOworc3RhdGljIGJvb2wgcHZzY3NpX2Rpc2FibGVfbXNpeDsKK3N0YXRpYyBib29sIHB2c2NzaV91c2VfbXNnICAgICAgID0gdHJ1ZTsKKworI2RlZmluZSBQVlNDU0lfUlcgKFNfSVJVU1IgfCBTX0lXVVNSKQorCittb2R1bGVfcGFyYW1fbmFtZWQocmluZ19wYWdlcywgcHZzY3NpX3JpbmdfcGFnZXMsIGludCwgUFZTQ1NJX1JXKTsKK01PRFVMRV9QQVJNX0RFU0MocmluZ19wYWdlcywgIk51bWJlciBvZiBwYWdlcyBwZXIgcmVxL2NtcCByaW5nIC0gKGRlZmF1bHQ9IgorCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HKSAiKSIpOworCittb2R1bGVfcGFyYW1fbmFtZWQobXNnX3JpbmdfcGFnZXMsIHB2c2NzaV9tc2dfcmluZ19wYWdlcywgaW50LCBQVlNDU0lfUlcpOworTU9EVUxFX1BBUk1fREVTQyhtc2dfcmluZ19wYWdlcywgIk51bWJlciBvZiBwYWdlcyBmb3IgdGhlIG1zZyByaW5nIC0gKGRlZmF1bHQ9IgorCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX01TR19SSU5HKSAiKSIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoY21kX3Blcl9sdW4sIHB2c2NzaV9jbWRfcGVyX2x1biwgaW50LCBQVlNDU0lfUlcpOworTU9EVUxFX1BBUk1fREVTQyhjbWRfcGVyX2x1biwgIk1heGltdW0gY29tbWFuZHMgcGVyIGx1biAtIChkZWZhdWx0PSIKKwkJIF9fc3RyaW5naWZ5KFBWU0NTSV9NQVhfUkVRX1FVRVVFX0RFUFRIKSAiKSIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9tc2ksIHB2c2NzaV9kaXNhYmxlX21zaSwgYm9vbCwgUFZTQ1NJX1JXKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9tc2ksICJEaXNhYmxlIE1TSSB1c2UgaW4gZHJpdmVyIC0gKGRlZmF1bHQ9MCkiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGRpc2FibGVfbXNpeCwgcHZzY3NpX2Rpc2FibGVfbXNpeCwgYm9vbCwgUFZTQ1NJX1JXKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9tc2l4LCAiRGlzYWJsZSBNU0ktWCB1c2UgaW4gZHJpdmVyIC0gKGRlZmF1bHQ9MCkiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9tc2csIHB2c2NzaV91c2VfbXNnLCBib29sLCBQVlNDU0lfUlcpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbXNnLCAiVXNlIG1zZyByaW5nIHdoZW4gYXZhaWxhYmxlIC0gKGRlZmF1bHQ9MSkiKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHB2c2NzaV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkRFVklDRShWTVdBUkUsIFBDSV9ERVZJQ0VfSURfVk1XQVJFX1BWU0NTSSkgfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHB2c2NzaV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorcHZzY3NpX2Rldihjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuICYoYWRhcHRlci0+ZGV2LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHB2c2NzaV9jdHggKgorcHZzY3NpX2ZpbmRfY29udGV4dChjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgcHZzY3NpX2N0eCAqY3R4LCAqZW5kOworCisJZW5kID0gJmFkYXB0ZXItPmNtZF9tYXBbYWRhcHRlci0+cmVxX2RlcHRoXTsKKwlmb3IgKGN0eCA9IGFkYXB0ZXItPmNtZF9tYXA7IGN0eCA8IGVuZDsgY3R4KyspCisJCWlmIChjdHgtPmNtZCA9PSBjbWQpCisJCQlyZXR1cm4gY3R4OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHZzY3NpX2N0eCAqCitwdnNjc2lfYWNxdWlyZV9jb250ZXh0KHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBwdnNjc2lfY3R4ICpjdHg7CisKKwlpZiAobGlzdF9lbXB0eSgmYWRhcHRlci0+Y21kX3Bvb2wpKQorCQlyZXR1cm4gTlVMTDsKKworCWN0eCA9IGxpc3RfZmlyc3RfZW50cnkoJmFkYXB0ZXItPmNtZF9wb29sLCBzdHJ1Y3QgcHZzY3NpX2N0eCwgbGlzdCk7CisJY3R4LT5jbWQgPSBjbWQ7CisJbGlzdF9kZWwoJmN0eC0+bGlzdCk7CisKKwlyZXR1cm4gY3R4OworfQorCitzdGF0aWMgdm9pZCBwdnNjc2lfcmVsZWFzZV9jb250ZXh0KHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICBzdHJ1Y3QgcHZzY3NpX2N0eCAqY3R4KQoreworCWN0eC0+Y21kID0gTlVMTDsKKwlsaXN0X2FkZCgmY3R4LT5saXN0LCAmYWRhcHRlci0+Y21kX3Bvb2wpOworfQorCisvKgorICogTWFwIGEgcHZzY3NpX2N0eCBzdHJ1Y3QgdG8gYSBjb250ZXh0IElEIGZpZWxkIHZhbHVlOyB3ZSBtYXAgdG8gYSBzaW1wbGUKKyAqIG5vbi16ZXJvIGludGVnZXIuIGN0eCBhbHdheXMgcG9pbnRzIHRvIGFuIGVudHJ5IGluIGNtZF9tYXAgYXJyYXksIGhlbmNlCisgKiB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyA+PTEuCisgKi8KK3N0YXRpYyB1NjQgcHZzY3NpX21hcF9jb250ZXh0KGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwdnNjc2lfY3R4ICpjdHgpCit7CisJcmV0dXJuIGN0eCAtIGFkYXB0ZXItPmNtZF9tYXAgKyAxOworfQorCitzdGF0aWMgc3RydWN0IHB2c2NzaV9jdHggKgorcHZzY3NpX2dldF9jb250ZXh0KGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwgdTY0IGNvbnRleHQpCit7CisJcmV0dXJuICZhZGFwdGVyLT5jbWRfbWFwW2NvbnRleHQgLSAxXTsKK30KKworc3RhdGljIHZvaWQgcHZzY3NpX3JlZ193cml0ZShjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIHUzMiBvZmZzZXQsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgYWRhcHRlci0+bW1pb0Jhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdTMyIHB2c2NzaV9yZWdfcmVhZChjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGFkYXB0ZXItPm1taW9CYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHUzMiBwdnNjc2lfcmVhZF9pbnRyX3N0YXR1cyhjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIHB2c2NzaV9yZWdfcmVhZChhZGFwdGVyLCBQVlNDU0lfUkVHX09GRlNFVF9JTlRSX1NUQVRVUyk7Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV93cml0ZV9pbnRyX3N0YXR1cyhjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICB1MzIgdmFsKQoreworCXB2c2NzaV9yZWdfd3JpdGUoYWRhcHRlciwgUFZTQ1NJX1JFR19PRkZTRVRfSU5UUl9TVEFUVVMsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV91bm1hc2tfaW50cihjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGludHJfYml0czsKKworCWludHJfYml0cyA9IFBWU0NTSV9JTlRSX0NNUExfTUFTSzsKKwlpZiAoYWRhcHRlci0+dXNlX21zZykKKwkJaW50cl9iaXRzIHw9IFBWU0NTSV9JTlRSX01TR19NQVNLOworCisJcHZzY3NpX3JlZ193cml0ZShhZGFwdGVyLCBQVlNDU0lfUkVHX09GRlNFVF9JTlRSX01BU0ssIGludHJfYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV9tYXNrX2ludHIoY29uc3Qgc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQoreworCXB2c2NzaV9yZWdfd3JpdGUoYWRhcHRlciwgUFZTQ1NJX1JFR19PRkZTRVRfSU5UUl9NQVNLLCAwKTsKK30KKworc3RhdGljIHZvaWQgcHZzY3NpX3dyaXRlX2NtZF9kZXNjKGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgIHUzMiBjbWQsIGNvbnN0IHZvaWQgKmRlc2MsIHNpemVfdCBsZW4pCit7CisJY29uc3QgdTMyICpwdHIgPSBkZXNjOworCXNpemVfdCBpOworCisJbGVuIC89IHNpemVvZigqcHRyKTsKKwlwdnNjc2lfcmVnX3dyaXRlKGFkYXB0ZXIsIFBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkQsIGNtZCk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwdnNjc2lfcmVnX3dyaXRlKGFkYXB0ZXIsCisJCQkJIFBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkRfREFUQSwgcHRyW2ldKTsKK30KKworc3RhdGljIHZvaWQgcHZzY3NpX2Fib3J0X2NtZChjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBwdnNjc2lfY3R4ICpjdHgpCit7CisJc3RydWN0IFBWU0NTSUNtZERlc2NBYm9ydENtZCBjbWQgPSB7IDAgfTsKKworCWNtZC50YXJnZXQgPSBjdHgtPmNtZC0+ZGV2aWNlLT5pZDsKKwljbWQuY29udGV4dCA9IHB2c2NzaV9tYXBfY29udGV4dChhZGFwdGVyLCBjdHgpOworCisJcHZzY3NpX3dyaXRlX2NtZF9kZXNjKGFkYXB0ZXIsIFBWU0NTSV9DTURfQUJPUlRfQ01ELCAmY21kLCBzaXplb2YoY21kKSk7Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV9raWNrX3J3X2lvKGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlwdnNjc2lfcmVnX3dyaXRlKGFkYXB0ZXIsIFBWU0NTSV9SRUdfT0ZGU0VUX0tJQ0tfUldfSU8sIDApOworfQorCitzdGF0aWMgdm9pZCBwdnNjc2lfcHJvY2Vzc19yZXF1ZXN0X3JpbmcoY29uc3Qgc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQoreworCXB2c2NzaV9yZWdfd3JpdGUoYWRhcHRlciwgUFZTQ1NJX1JFR19PRkZTRVRfS0lDS19OT05fUldfSU8sIDApOworfQorCitzdGF0aWMgaW50IHNjc2lfaXNfcncodW5zaWduZWQgY2hhciBvcCkKK3sKKwlyZXR1cm4gb3AgPT0gUkVBRF82ICB8fCBvcCA9PSBXUklURV82IHx8CisJICAgICAgIG9wID09IFJFQURfMTAgfHwgb3AgPT0gV1JJVEVfMTAgfHwKKwkgICAgICAgb3AgPT0gUkVBRF8xMiB8fCBvcCA9PSBXUklURV8xMiB8fAorCSAgICAgICBvcCA9PSBSRUFEXzE2IHx8IG9wID09IFdSSVRFXzE2OworfQorCitzdGF0aWMgdm9pZCBwdnNjc2lfa2lja19pbyhjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICB1bnNpZ25lZCBjaGFyIG9wKQoreworCWlmIChzY3NpX2lzX3J3KG9wKSkKKwkJcHZzY3NpX2tpY2tfcndfaW8oYWRhcHRlcik7CisJZWxzZQorCQlwdnNjc2lfcHJvY2Vzc19yZXF1ZXN0X3JpbmcoYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGxsX2FkYXB0ZXJfcmVzZXQoY29uc3Qgc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQoreworCWRldl9kYmcocHZzY3NpX2RldihhZGFwdGVyKSwgIkFkYXB0ZXIgUmVzZXQgb24gJXBcbiIsIGFkYXB0ZXIpOworCisJcHZzY3NpX3dyaXRlX2NtZF9kZXNjKGFkYXB0ZXIsIFBWU0NTSV9DTURfQURBUFRFUl9SRVNFVCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGxsX2J1c19yZXNldChjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJZGV2X2RiZyhwdnNjc2lfZGV2KGFkYXB0ZXIpLCAiUmVzZXRpbmcgYnVzIG9uICVwXG4iLCBhZGFwdGVyKTsKKworCXB2c2NzaV93cml0ZV9jbWRfZGVzYyhhZGFwdGVyLCBQVlNDU0lfQ01EX1JFU0VUX0JVUywgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGxsX2RldmljZV9yZXNldChjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiB0YXJnZXQpCit7CisJc3RydWN0IFBWU0NTSUNtZERlc2NSZXNldERldmljZSBjbWQgPSB7IDAgfTsKKworCWRldl9kYmcocHZzY3NpX2RldihhZGFwdGVyKSwgIlJlc2V0aW5nIGRldmljZTogdGFyZ2V0PSV1XG4iLCB0YXJnZXQpOworCisJY21kLnRhcmdldCA9IHRhcmdldDsKKworCXB2c2NzaV93cml0ZV9jbWRfZGVzYyhhZGFwdGVyLCBQVlNDU0lfQ01EX1JFU0VUX0RFVklDRSwKKwkJCSAgICAgICZjbWQsIHNpemVvZihjbWQpKTsKK30KKworc3RhdGljIHZvaWQgcHZzY3NpX2NyZWF0ZV9zZyhzdHJ1Y3QgcHZzY3NpX2N0eCAqY3R4LAorCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpOworCXN0cnVjdCBQVlNDU0lTR0VsZW1lbnQgKnNnZTsKKworCUJVR19PTihjb3VudCA+IFBWU0NTSV9NQVhfTlVNX1NHX0VOVFJJRVNfUEVSX1NFR01FTlQpOworCisJc2dlID0gJmN0eC0+c2dsLT5zZ2VbMF07CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHNnKyspIHsKKwkJc2dlW2ldLmFkZHIgICA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJc2dlW2ldLmxlbmd0aCA9IHNnX2RtYV9sZW4oc2cpOworCQlzZ2VbaV0uZmxhZ3MgID0gMDsKKwl9Cit9CisKKy8qCisgKiBNYXAgYWxsIGRhdGEgYnVmZmVycyBmb3IgYSBjb21tYW5kIGludG8gUENJIHNwYWNlIGFuZAorICogc2V0dXAgdGhlIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCBwdnNjc2lfbWFwX2J1ZmZlcnMoc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgIHN0cnVjdCBwdnNjc2lfY3R4ICpjdHgsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgICBzdHJ1Y3QgUFZTQ1NJUmluZ1JlcURlc2MgKmUpCit7CisJdW5zaWduZWQgY291bnQ7CisJdW5zaWduZWQgYnVmZmxlbiA9IHNjc2lfYnVmZmxlbihjbWQpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwllLT5kYXRhTGVuID0gYnVmZmxlbjsKKwllLT5kYXRhQWRkciA9IDA7CisJaWYgKGJ1ZmZsZW4gPT0gMCkKKwkJcmV0dXJuOworCisJc2cgPSBzY3NpX3NnbGlzdChjbWQpOworCWNvdW50ID0gc2NzaV9zZ19jb3VudChjbWQpOworCWlmIChjb3VudCAhPSAwKSB7CisJCWludCBzZWdzID0gc2NzaV9kbWFfbWFwKGNtZCk7CisJCWlmIChzZWdzID4gMSkgeworCQkJcHZzY3NpX2NyZWF0ZV9zZyhjdHgsIHNnLCBzZWdzKTsKKworCQkJZS0+ZmxhZ3MgfD0gUFZTQ1NJX0ZMQUdfQ01EX1dJVEhfU0dfTElTVDsKKwkJCWN0eC0+c2dsUEEgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5kZXYsIGN0eC0+c2dsLAorCQkJCQkJICAgIFNHTF9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWUtPmRhdGFBZGRyID0gY3R4LT5zZ2xQQTsKKwkJfSBlbHNlCisJCQllLT5kYXRhQWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJbiBjYXNlIHRoZXJlIGlzIG5vIFMvRyBsaXN0LCBzY3NpX3NnbGlzdCBwb2ludHMKKwkJICogZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlci4KKwkJICovCisJCWN0eC0+ZGF0YVBBID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+ZGV2LCBzZywgYnVmZmxlbiwKKwkJCQkJICAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJZS0+ZGF0YUFkZHIgPSBjdHgtPmRhdGFQQTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV91bm1hcF9idWZmZXJzKGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgc3RydWN0IHB2c2NzaV9jdHggKmN0eCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJdW5zaWduZWQgYnVmZmxlbjsKKworCWNtZCA9IGN0eC0+Y21kOworCWJ1ZmZsZW4gPSBzY3NpX2J1ZmZsZW4oY21kKTsKKworCWlmIChidWZmbGVuICE9IDApIHsKKwkJdW5zaWduZWQgY291bnQgPSBzY3NpX3NnX2NvdW50KGNtZCk7CisKKwkJaWYgKGNvdW50ICE9IDApIHsKKwkJCXNjc2lfZG1hX3VubWFwKGNtZCk7CisJCQlpZiAoY3R4LT5zZ2xQQSkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+ZGV2LCBjdHgtPnNnbFBBLAorCQkJCQkJIFNHTF9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQljdHgtPnNnbFBBID0gMDsKKwkJCX0KKwkJfSBlbHNlCisJCQlwY2lfdW5tYXBfc2luZ2xlKGFkYXB0ZXItPmRldiwgY3R4LT5kYXRhUEEsIGJ1ZmZsZW4sCisJCQkJCSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9CisJaWYgKGNtZC0+c2Vuc2VfYnVmZmVyKQorCQlwY2lfdW5tYXBfc2luZ2xlKGFkYXB0ZXItPmRldiwgY3R4LT5zZW5zZVBBLAorCQkJCSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB2c2NzaV9hbGxvY2F0ZV9yaW5ncyhzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJYWRhcHRlci0+cmluZ3Nfc3RhdGUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsIFBBR0VfU0laRSwKKwkJCQkJCSAgICAmYWRhcHRlci0+cmluZ1N0YXRlUEEpOworCWlmICghYWRhcHRlci0+cmluZ3Nfc3RhdGUpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhcHRlci0+cmVxX3BhZ2VzID0gbWluKFBWU0NTSV9NQVhfTlVNX1BBR0VTX1JFUV9SSU5HLAorCQkJCSBwdnNjc2lfcmluZ19wYWdlcyk7CisJYWRhcHRlci0+cmVxX2RlcHRoID0gYWRhcHRlci0+cmVxX3BhZ2VzCisJCQkJCSogUFZTQ1NJX01BWF9OVU1fUkVRX0VOVFJJRVNfUEVSX1BBR0U7CisJYWRhcHRlci0+cmVxX3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJCQkgYWRhcHRlci0+cmVxX3BhZ2VzICogUEFHRV9TSVpFLAorCQkJCQkJICZhZGFwdGVyLT5yZXFSaW5nUEEpOworCWlmICghYWRhcHRlci0+cmVxX3JpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhcHRlci0+Y21wX3BhZ2VzID0gbWluKFBWU0NTSV9NQVhfTlVNX1BBR0VTX0NNUF9SSU5HLAorCQkJCSBwdnNjc2lfcmluZ19wYWdlcyk7CisJYWRhcHRlci0+Y21wX3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJCQkgYWRhcHRlci0+Y21wX3BhZ2VzICogUEFHRV9TSVpFLAorCQkJCQkJICZhZGFwdGVyLT5jbXBSaW5nUEEpOworCWlmICghYWRhcHRlci0+Y21wX3JpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJQlVHX09OKCFJU19BTElHTkVEKGFkYXB0ZXItPnJpbmdTdGF0ZVBBLCBQQUdFX1NJWkUpKTsKKwlCVUdfT04oIUlTX0FMSUdORUQoYWRhcHRlci0+cmVxUmluZ1BBLCBQQUdFX1NJWkUpKTsKKwlCVUdfT04oIUlTX0FMSUdORUQoYWRhcHRlci0+Y21wUmluZ1BBLCBQQUdFX1NJWkUpKTsKKworCWlmICghYWRhcHRlci0+dXNlX21zZykKKwkJcmV0dXJuIDA7CisKKwlhZGFwdGVyLT5tc2dfcGFnZXMgPSBtaW4oUFZTQ1NJX01BWF9OVU1fUEFHRVNfTVNHX1JJTkcsCisJCQkJIHB2c2NzaV9tc2dfcmluZ19wYWdlcyk7CisJYWRhcHRlci0+bXNnX3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJCQkgYWRhcHRlci0+bXNnX3BhZ2VzICogUEFHRV9TSVpFLAorCQkJCQkJICZhZGFwdGVyLT5tc2dSaW5nUEEpOworCWlmICghYWRhcHRlci0+bXNnX3JpbmcpCisJCXJldHVybiAtRU5PTUVNOworCUJVR19PTighSVNfQUxJR05FRChhZGFwdGVyLT5tc2dSaW5nUEEsIFBBR0VfU0laRSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV9zZXR1cF9hbGxfcmluZ3MoY29uc3Qgc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBQVlNDU0lDbWREZXNjU2V0dXBSaW5ncyBjbWQgPSB7IDAgfTsKKwlkbWFfYWRkcl90IGJhc2U7CisJdW5zaWduZWQgaTsKKworCWNtZC5yaW5nc1N0YXRlUFBOICAgPSBhZGFwdGVyLT5yaW5nU3RhdGVQQSA+PiBQQUdFX1NISUZUOworCWNtZC5yZXFSaW5nTnVtUGFnZXMgPSBhZGFwdGVyLT5yZXFfcGFnZXM7CisJY21kLmNtcFJpbmdOdW1QYWdlcyA9IGFkYXB0ZXItPmNtcF9wYWdlczsKKworCWJhc2UgPSBhZGFwdGVyLT5yZXFSaW5nUEE7CisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnJlcV9wYWdlczsgaSsrKSB7CisJCWNtZC5yZXFSaW5nUFBOc1tpXSA9IGJhc2UgPj4gUEFHRV9TSElGVDsKKwkJYmFzZSArPSBQQUdFX1NJWkU7CisJfQorCisJYmFzZSA9IGFkYXB0ZXItPmNtcFJpbmdQQTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+Y21wX3BhZ2VzOyBpKyspIHsKKwkJY21kLmNtcFJpbmdQUE5zW2ldID0gYmFzZSA+PiBQQUdFX1NISUZUOworCQliYXNlICs9IFBBR0VfU0laRTsKKwl9CisKKwltZW1zZXQoYWRhcHRlci0+cmluZ3Nfc3RhdGUsIDAsIFBBR0VfU0laRSk7CisJbWVtc2V0KGFkYXB0ZXItPnJlcV9yaW5nLCAwLCBhZGFwdGVyLT5yZXFfcGFnZXMgKiBQQUdFX1NJWkUpOworCW1lbXNldChhZGFwdGVyLT5jbXBfcmluZywgMCwgYWRhcHRlci0+Y21wX3BhZ2VzICogUEFHRV9TSVpFKTsKKworCXB2c2NzaV93cml0ZV9jbWRfZGVzYyhhZGFwdGVyLCBQVlNDU0lfQ01EX1NFVFVQX1JJTkdTLAorCQkJICAgICAgJmNtZCwgc2l6ZW9mKGNtZCkpOworCisJaWYgKGFkYXB0ZXItPnVzZV9tc2cpIHsKKwkJc3RydWN0IFBWU0NTSUNtZERlc2NTZXR1cE1zZ1JpbmcgY21kX21zZyA9IHsgMCB9OworCisJCWNtZF9tc2cubnVtUGFnZXMgPSBhZGFwdGVyLT5tc2dfcGFnZXM7CisKKwkJYmFzZSA9IGFkYXB0ZXItPm1zZ1JpbmdQQTsKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm1zZ19wYWdlczsgaSsrKSB7CisJCQljbWRfbXNnLnJpbmdQUE5zW2ldID0gYmFzZSA+PiBQQUdFX1NISUZUOworCQkJYmFzZSArPSBQQUdFX1NJWkU7CisJCX0KKwkJbWVtc2V0KGFkYXB0ZXItPm1zZ19yaW5nLCAwLCBhZGFwdGVyLT5tc2dfcGFnZXMgKiBQQUdFX1NJWkUpOworCisJCXB2c2NzaV93cml0ZV9jbWRfZGVzYyhhZGFwdGVyLCBQVlNDU0lfQ01EX1NFVFVQX01TR19SSU5HLAorCQkJCSAgICAgICZjbWRfbXNnLCBzaXplb2YoY21kX21zZykpOworCX0KK30KKworLyoKKyAqIFB1bGwgYSBjb21wbGV0aW9uIGRlc2NyaXB0b3Igb2ZmIGFuZCBwYXNzIHRoZSBjb21wbGV0aW9uIGJhY2sKKyAqIHRvIHRoZSBTQ1NJIG1pZCBsYXllci4KKyAqLworc3RhdGljIHZvaWQgcHZzY3NpX2NvbXBsZXRlX3JlcXVlc3Qoc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgUFZTQ1NJUmluZ0NtcERlc2MgKmUpCit7CisJc3RydWN0IHB2c2NzaV9jdHggKmN0eDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJdTMyIGJ0c3RhdCA9IGUtPmhvc3RTdGF0dXM7CisJdTMyIHNkc3RhdCA9IGUtPnNjc2lTdGF0dXM7CisKKwljdHggPSBwdnNjc2lfZ2V0X2NvbnRleHQoYWRhcHRlciwgZS0+Y29udGV4dCk7CisJY21kID0gY3R4LT5jbWQ7CisJcHZzY3NpX3VubWFwX2J1ZmZlcnMoYWRhcHRlciwgY3R4KTsKKwlwdnNjc2lfcmVsZWFzZV9jb250ZXh0KGFkYXB0ZXIsIGN0eCk7CisJY21kLT5yZXN1bHQgPSAwOworCisJaWYgKHNkc3RhdCAhPSBTQU1fU1RBVF9HT09EICYmCisJICAgIChidHN0YXQgPT0gQlRTVEFUX1NVQ0NFU1MgfHwKKwkgICAgIGJ0c3RhdCA9PSBCVFNUQVRfTElOS0VEX0NPTU1BTkRfQ09NUExFVEVEIHx8CisJICAgICBidHN0YXQgPT0gQlRTVEFUX0xJTktFRF9DT01NQU5EX0NPTVBMRVRFRF9XSVRIX0ZMQUcpKSB7CisJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzZHN0YXQ7CisJCWlmIChzZHN0YXQgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OICYmIGNtZC0+c2Vuc2VfYnVmZmVyKQorCQkJY21kLT5yZXN1bHQgfD0gKERSSVZFUl9TRU5TRSA8PCAyNCk7CisJfSBlbHNlCisJCXN3aXRjaCAoYnRzdGF0KSB7CisJCWNhc2UgQlRTVEFUX1NVQ0NFU1M6CisJCWNhc2UgQlRTVEFUX0xJTktFRF9DT01NQU5EX0NPTVBMRVRFRDoKKwkJY2FzZSBCVFNUQVRfTElOS0VEX0NPTU1BTkRfQ09NUExFVEVEX1dJVEhfRkxBRzoKKwkJCS8qIElmIGV2ZXJ5dGhpbmcgd2VudCBmaW5lLCBsZXQncyBtb3ZlIG9uLi4gICovCisJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVFNUQVRfREFUQVJVTjoKKwkJY2FzZSBCVFNUQVRfREFUQV9VTkRFUlJVTjoKKwkJCS8qIFJlcG9ydCByZXNpZHVhbCBkYXRhIGluIHVuZGVycnVucyAqLworCQkJc2NzaV9zZXRfcmVzaWQoY21kLCBzY3NpX2J1ZmZsZW4oY21kKSAtIGUtPmRhdGFMZW4pOworCQkJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQlRTVEFUX1NFTFRJTUVPOgorCQkJLyogT3VyIGVtdWxhdGlvbiByZXR1cm5zIHRoaXMgZm9yIG5vbi1jb25uZWN0ZWQgZGV2cyAqLworCQkJY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVFNUQVRfTFVOTUlTTUFUQ0g6CisJCWNhc2UgQlRTVEFUX1RBR1JFSkVDVDoKKwkJY2FzZSBCVFNUQVRfQkFETVNHOgorCQkJY21kLT5yZXN1bHQgPSAoRFJJVkVSX0lOVkFMSUQgPDwgMjQpOworCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJY2FzZSBCVFNUQVRfSEFIQVJEV0FSRToKKwkJY2FzZSBCVFNUQVRfSU5WUEhBU0U6CisJCWNhc2UgQlRTVEFUX0hBVElNRU9VVDoKKwkJY2FzZSBCVFNUQVRfTk9SRVNQT05TRToKKwkJY2FzZSBCVFNUQVRfRElTQ09OTkVDVDoKKwkJY2FzZSBCVFNUQVRfSEFTT0ZUV0FSRToKKwkJY2FzZSBCVFNUQVRfQlVTRlJFRToKKwkJY2FzZSBCVFNUQVRfU0VOU0ZBSUxFRDoKKwkJCWNtZC0+cmVzdWx0IHw9IChESURfRVJST1IgPDwgMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVFNUQVRfU0VOVFJTVDoKKwkJY2FzZSBCVFNUQVRfUkVDVlJTVDoKKwkJY2FzZSBCVFNUQVRfQlVTUkVTRVQ6CisJCQljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVFNUQVRfQUJPUlRRVUVVRToKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisJCQlicmVhazsKKworCQljYXNlIEJUU1RBVF9TQ1NJUEFSSVRZOgorCQkJY21kLT5yZXN1bHQgPSAoRElEX1BBUklUWSA8PCAxNik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCXNjbWRfcHJpbnRrKEtFUk5fREVCVUcsIGNtZCwKKwkJCQkgICAgIlVua25vd24gY29tcGxldGlvbiBzdGF0dXM6IDB4JXhcbiIsCisJCQkJICAgIGJ0c3RhdCk7CisJfQorCisJZGV2X2RiZygmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2LAorCQkiY21kPSVwICV4IGN0eD0lcCByZXN1bHQ9MHgleCBzdGF0dXM9MHgleCwleFxuIiwKKwkJY21kLCBjbWQtPmNtbmRbMF0sIGN0eCwgY21kLT5yZXN1bHQsIGJ0c3RhdCwgc2RzdGF0KTsKKworCWNtZC0+c2NzaV9kb25lKGNtZCk7Cit9CisKKy8qCisgKiBiYXJyaWVyIHVzYWdlIDogU2luY2UgdGhlIFBWU0NTSSBkZXZpY2UgaXMgZW11bGF0ZWQsIHRoZXJlIGNvdWxkIGJlIGNhc2VzCisgKiB3aGVyZSB3ZSBtYXkgd2FudCB0byBzZXJpYWxpemUgc29tZSBhY2Nlc3NlcyBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZQorICogZW11bGF0aW9uIGxheWVyLiBXZSB1c2UgY29tcGlsZXIgYmFycmllcnMgaW5zdGVhZCBvZiB0aGUgbW9yZSBleHBlbnNpdmUKKyAqIG1lbW9yeSBiYXJyaWVycyBiZWNhdXNlIFBWU0NTSSBpcyBvbmx5IHN1cHBvcnRlZCBvbiBYODYgd2hpY2ggaGFzIHN0cm9uZworICogbWVtb3J5IGFjY2VzcyBvcmRlcmluZy4KKyAqLworc3RhdGljIHZvaWQgcHZzY3NpX3Byb2Nlc3NfY29tcGxldGlvbl9yaW5nKHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgUFZTQ1NJUmluZ3NTdGF0ZSAqcyA9IGFkYXB0ZXItPnJpbmdzX3N0YXRlOworCXN0cnVjdCBQVlNDU0lSaW5nQ21wRGVzYyAqcmluZyA9IGFkYXB0ZXItPmNtcF9yaW5nOworCXUzMiBjbXBfZW50cmllcyA9IHMtPmNtcE51bUVudHJpZXNMb2cyOworCisJd2hpbGUgKHMtPmNtcENvbnNJZHggIT0gcy0+Y21wUHJvZElkeCkgeworCQlzdHJ1Y3QgUFZTQ1NJUmluZ0NtcERlc2MgKmUgPSByaW5nICsgKHMtPmNtcENvbnNJZHggJgorCQkJCQkJICAgICAgTUFTSyhjbXBfZW50cmllcykpOworCQkvKgorCQkgKiBUaGlzIGJhcnJpZXIoKSBlbnN1cmVzIHRoYXQgKmUgaXMgbm90IGRlcmVmZXJlbmNlZCB3aGlsZQorCQkgKiB0aGUgZGV2aWNlIGVtdWxhdGlvbiBzdGlsbCB3cml0ZXMgZGF0YSBpbnRvIHRoZSBzbG90LgorCQkgKiBTaW5jZSB0aGUgZGV2aWNlIGVtdWxhdGlvbiBhZHZhbmNlcyBzLT5jbXBQcm9kSWR4IG9ubHkgYWZ0ZXIKKwkJICogdXBkYXRpbmcgdGhlIHNsb3Qgd2Ugd2FudCB0byBjaGVjayBpdCBmaXJzdC4KKwkJICovCisJCWJhcnJpZXIoKTsKKwkJcHZzY3NpX2NvbXBsZXRlX3JlcXVlc3QoYWRhcHRlciwgZSk7CisJCS8qCisJCSAqIFRoaXMgYmFycmllcigpIGVuc3VyZXMgdGhhdCBjb21waWxlciBkb2Vzbid0IHJlb3JkZXIgd3JpdGUKKwkJICogdG8gcy0+Y21wQ29uc0lkeCBiZWZvcmUgdGhlIHJlYWQgb2YgKCplKSBpbnNpZGUKKwkJICogcHZzY3NpX2NvbXBsZXRlX3JlcXVlc3QuIE90aGVyd2lzZSwgZGV2aWNlIGVtdWxhdGlvbiBtYXkKKwkJICogb3ZlcndyaXRlICplIGJlZm9yZSB3ZSBoYWQgYSBjaGFuY2UgdG8gcmVhZCBpdC4KKwkJICovCisJCWJhcnJpZXIoKTsKKwkJcy0+Y21wQ29uc0lkeCsrOworCX0KK30KKworLyoKKyAqIFRyYW5zbGF0ZSBhIExpbnV4IFNDU0kgcmVxdWVzdCBpbnRvIGEgcmVxdWVzdCByaW5nIGVudHJ5LgorICovCitzdGF0aWMgaW50IHB2c2NzaV9xdWV1ZV9yaW5nKHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgc3RydWN0IHB2c2NzaV9jdHggKmN0eCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBQVlNDU0lSaW5nc1N0YXRlICpzOworCXN0cnVjdCBQVlNDU0lSaW5nUmVxRGVzYyAqZTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJdTMyIHJlcV9lbnRyaWVzOworCisJcyA9IGFkYXB0ZXItPnJpbmdzX3N0YXRlOworCXNkZXYgPSBjbWQtPmRldmljZTsKKwlyZXFfZW50cmllcyA9IHMtPnJlcU51bUVudHJpZXNMb2cyOworCisJLyoKKwkgKiBJZiB0aGlzIGNvbmRpdGlvbiBob2xkcywgd2UgbWlnaHQgaGF2ZSByb29tIG9uIHRoZSByZXF1ZXN0IHJpbmcsIGJ1dAorCSAqIHdlIG1pZ2h0IG5vdCBoYXZlIHJvb20gb24gdGhlIGNvbXBsZXRpb24gcmluZyBmb3IgdGhlIHJlc3BvbnNlLgorCSAqIEhvd2V2ZXIsIHdlIGhhdmUgYWxyZWFkeSBydWxlZCBvdXQgdGhpcyBwb3NzaWJpbGl0eSAtIHdlIHdvdWxkIG5vdAorCSAqIGhhdmUgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBhIGNvbnRleHQgaWYgaXQgd2VyZSB0cnVlLCBzaW5jZSB3ZSBvbmx5CisJICogaGF2ZSBvbmUgY29udGV4dCBwZXIgcmVxdWVzdCBlbnRyeS4gIENoZWNrIGZvciBpdCBhbnl3YXksIHNpbmNlIGl0CisJICogd291bGQgYmUgYSBzZXJpb3VzIGJ1Zy4KKwkgKi8KKwlpZiAocy0+cmVxUHJvZElkeCAtIHMtPmNtcENvbnNJZHggPj0gMSA8PCByZXFfZW50cmllcykgeworCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21kLCAidm13X3B2c2NzaTogIgorCQkJICAgICJyaW5nIGZ1bGw6IHJlcVByb2RJZHg9JWQgY21wQ29uc0lkeD0lZFxuIiwKKwkJCSAgICBzLT5yZXFQcm9kSWR4LCBzLT5jbXBDb25zSWR4KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWUgPSBhZGFwdGVyLT5yZXFfcmluZyArIChzLT5yZXFQcm9kSWR4ICYgTUFTSyhyZXFfZW50cmllcykpOworCisJZS0+YnVzICAgID0gc2Rldi0+Y2hhbm5lbDsKKwllLT50YXJnZXQgPSBzZGV2LT5pZDsKKwltZW1zZXQoZS0+bHVuLCAwLCBzaXplb2YoZS0+bHVuKSk7CisJZS0+bHVuWzFdID0gc2Rldi0+bHVuOworCisJaWYgKGNtZC0+c2Vuc2VfYnVmZmVyKSB7CisJCWN0eC0+c2Vuc2VQQSA9IHBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPmRldiwgY21kLT5zZW5zZV9idWZmZXIsCisJCQkJCSAgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwKKwkJCQkJICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZS0+c2Vuc2VBZGRyID0gY3R4LT5zZW5zZVBBOworCQllLT5zZW5zZUxlbiA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwl9IGVsc2UgeworCQllLT5zZW5zZUxlbiAgPSAwOworCQllLT5zZW5zZUFkZHIgPSAwOworCX0KKwllLT5jZGJMZW4gICA9IGNtZC0+Y21kX2xlbjsKKwllLT52Y3B1SGludCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwltZW1jcHkoZS0+Y2RiLCBjbWQtPmNtbmQsIGUtPmNkYkxlbik7CisKKwllLT50YWcgPSBTSU1QTEVfUVVFVUVfVEFHOworCWlmIChzZGV2LT50YWdnZWRfc3VwcG9ydGVkICYmCisJICAgIChjbWQtPnRhZyA9PSBIRUFEX09GX1FVRVVFX1RBRyB8fAorCSAgICAgY21kLT50YWcgPT0gT1JERVJFRF9RVUVVRV9UQUcpKQorCQllLT50YWcgPSBjbWQtPnRhZzsKKworCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKKwkJZS0+ZmxhZ3MgPSBQVlNDU0lfRkxBR19DTURfRElSX1RPSE9TVDsKKwllbHNlIGlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCWUtPmZsYWdzID0gUFZTQ1NJX0ZMQUdfQ01EX0RJUl9UT0RFVklDRTsKKwllbHNlIGlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKQorCQllLT5mbGFncyA9IFBWU0NTSV9GTEFHX0NNRF9ESVJfTk9ORTsKKwllbHNlCisJCWUtPmZsYWdzID0gMDsKKworCXB2c2NzaV9tYXBfYnVmZmVycyhhZGFwdGVyLCBjdHgsIGNtZCwgZSk7CisKKwllLT5jb250ZXh0ID0gcHZzY3NpX21hcF9jb250ZXh0KGFkYXB0ZXIsIGN0eCk7CisKKwliYXJyaWVyKCk7CisKKwlzLT5yZXFQcm9kSWR4Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdnNjc2lfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyID0gc2hvc3RfcHJpdihob3N0KTsKKwlzdHJ1Y3QgcHZzY3NpX2N0eCAqY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCisJY3R4ID0gcHZzY3NpX2FjcXVpcmVfY29udGV4dChhZGFwdGVyLCBjbWQpOworCWlmICghY3R4IHx8IHB2c2NzaV9xdWV1ZV9yaW5nKGFkYXB0ZXIsIGN0eCwgY21kKSAhPSAwKSB7CisJCWlmIChjdHgpCisJCQlwdnNjc2lfcmVsZWFzZV9jb250ZXh0KGFkYXB0ZXIsIGN0eCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmh3X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJfQorCisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCisJZGV2X2RiZygmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2LAorCQkicXVldWVkIGNtZCAlcCwgY3R4ICVwLCBvcD0leFxuIiwgY21kLCBjdHgsIGNtZC0+Y21uZFswXSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisKKwlwdnNjc2lfa2lja19pbyhhZGFwdGVyLCBjbWQtPmNtbmRbMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHZzY3NpX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIgPSBzaG9zdF9wcml2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlzdHJ1Y3QgcHZzY3NpX2N0eCAqY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzY21kX3ByaW50ayhLRVJOX0RFQlVHLCBjbWQsICJ0YXNrIGFib3J0IG9uIGhvc3QgJXUsICVwXG4iLAorCQkgICAgYWRhcHRlci0+aG9zdC0+aG9zdF9ubywgY21kKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFBvbGwgdGhlIGNvbXBsZXRpb24gcmluZyBmaXJzdCAtIHdlIG1pZ2h0IGJlIHRyeWluZyB0byBhYm9ydAorCSAqIGEgY29tbWFuZCB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgZGlzcGF0Y2hlZCBpbiB0aGUgY29tcGxldGlvbiByaW5nLgorCSAqLworCXB2c2NzaV9wcm9jZXNzX2NvbXBsZXRpb25fcmluZyhhZGFwdGVyKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gY29udGV4dCBmb3IgdGhlIGNvbW1hbmQsIGl0IGVpdGhlciBhbHJlYWR5IHN1Y2NlZWRlZAorCSAqIG9yIGVsc2Ugd2FzIG5ldmVyIHByb3Blcmx5IGlzc3VlZC4gIE5vdCBvdXIgcHJvYmxlbS4KKwkgKi8KKwljdHggPSBwdnNjc2lfZmluZF9jb250ZXh0KGFkYXB0ZXIsIGNtZCk7CisJaWYgKCFjdHgpIHsKKwkJc2NtZF9wcmludGsoS0VSTl9ERUJVRywgY21kLCAiRmFpbGVkIHRvIGFib3J0IGNtZCAlcFxuIiwgY21kKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHZzY3NpX2Fib3J0X2NtZChhZGFwdGVyLCBjdHgpOworCisJcHZzY3NpX3Byb2Nlc3NfY29tcGxldGlvbl9yaW5nKGFkYXB0ZXIpOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICogQWJvcnQgYWxsIG91dHN0YW5kaW5nIHJlcXVlc3RzLiAgVGhpcyBpcyBvbmx5IHNhZmUgdG8gdXNlIGlmIHRoZSBjb21wbGV0aW9uCisgKiByaW5nIHdpbGwgbmV2ZXIgYmUgd2Fsa2VkIGFnYWluIG9yIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVzZXQsIGJlY2F1c2UgaXQKKyAqIGRlc3Ryb3lzIHRoZSAxLTEgbWFwcGluZyBiZXR3ZWVuIGNvbnRleHQgZmllbGQgcGFzc2VkIHRvIGVtdWxhdGlvbiBhbmQgb3VyCisgKiByZXF1ZXN0IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgcHZzY3NpX3Jlc2V0X2FsbChzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5yZXFfZGVwdGg7IGkrKykgeworCQlzdHJ1Y3QgcHZzY3NpX2N0eCAqY3R4ID0gJmFkYXB0ZXItPmNtZF9tYXBbaV07CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGN0eC0+Y21kOworCQlpZiAoY21kKSB7CisJCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21kLAorCQkJCSAgICAiRm9yY2VkIHJlc2V0IG9uIGNtZCAlcFxuIiwgY21kKTsKKwkJCXB2c2NzaV91bm1hcF9idWZmZXJzKGFkYXB0ZXIsIGN0eCk7CisJCQlwdnNjc2lfcmVsZWFzZV9jb250ZXh0KGFkYXB0ZXIsIGN0eCk7CisJCQljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBwdnNjc2lfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IHNob3N0X3ByaXYoaG9zdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHVzZV9tc2c7CisKKwlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIlNDU0kgSG9zdCByZXNldFxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCisJdXNlX21zZyA9IGFkYXB0ZXItPnVzZV9tc2c7CisKKwlpZiAodXNlX21zZykgeworCQlhZGFwdGVyLT51c2VfbXNnID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIE5vdyB0aGF0IHdlIGtub3cgdGhhdCB0aGUgSVNSIHdvbid0IGFkZCBtb3JlIHdvcmsgb24gdGhlCisJCSAqIHdvcmtxdWV1ZSB3ZSBjYW4gc2FmZWx5IGZsdXNoIGFueSBvdXRzdGFuZGluZyB3b3JrLgorCQkgKi8KKwkJZmx1c2hfd29ya3F1ZXVlKGFkYXB0ZXItPndvcmtxdWV1ZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisJfQorCisJLyoKKwkgKiBXZSdyZSBnb2luZyB0byB0ZWFyIGRvd24gdGhlIGVudGlyZSByaW5nIHN0cnVjdHVyZSBhbmQgc2V0IGl0IGJhY2sKKwkgKiB1cCwgc28gc3RhbGxpbmcgbmV3IHJlcXVlc3RzIHVudGlsIGFsbCBjb21wbGV0aW9ucyBhcmUgZmx1c2hlZCBhbmQKKwkgKiB0aGUgcmluZ3MgYXJlIGJhY2sgaW4gcGxhY2UuCisJICovCisKKwlwdnNjc2lfcHJvY2Vzc19yZXF1ZXN0X3JpbmcoYWRhcHRlcik7CisKKwlsbF9hZGFwdGVyX3Jlc2V0KGFkYXB0ZXIpOworCisJLyoKKwkgKiBOb3cgcHJvY2VzcyBhbnkgY29tcGxldGlvbnMuICBOb3RlIHdlIGRvIHRoaXMgQUZURVIgYWRhcHRlciByZXNldCwKKwkgKiB3aGljaCBpcyBzdHJhbmdlLCBidXQgc3RvcHMgcmFjZXMgd2hlcmUgY29tcGxldGlvbnMgZ2V0IHBvc3RlZAorCSAqIGJldHdlZW4gcHJvY2Vzc2luZyB0aGUgcmluZyBhbmQgaXNzdWluZyB0aGUgcmVzZXQuICBUaGUgYmFja2VuZCB3aWxsCisJICogbm90IHRvdWNoIHRoZSByaW5nIG1lbW9yeSBhZnRlciByZXNldCwgc28gdGhlIGltbWVkaWF0ZWx5IHByZS1yZXNldAorCSAqIGNvbXBsZXRpb24gcmluZyBzdGF0ZSBpcyBzdGlsbCB2YWxpZC4KKwkgKi8KKwlwdnNjc2lfcHJvY2Vzc19jb21wbGV0aW9uX3JpbmcoYWRhcHRlcik7CisKKwlwdnNjc2lfcmVzZXRfYWxsKGFkYXB0ZXIpOworCWFkYXB0ZXItPnVzZV9tc2cgPSB1c2VfbXNnOworCXB2c2NzaV9zZXR1cF9hbGxfcmluZ3MoYWRhcHRlcik7CisJcHZzY3NpX3VubWFza19pbnRyKGFkYXB0ZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgcHZzY3NpX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IHNob3N0X3ByaXYoaG9zdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNjbWRfcHJpbnRrKEtFUk5fSU5GTywgY21kLCAiU0NTSSBCdXMgcmVzZXRcbiIpOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIHF1ZXVlIG5ldyByZXF1ZXN0cyBmb3IgdGhpcyBidXMgYWZ0ZXIKKwkgKiBmbHVzaGluZyBhbGwgcGVuZGluZyByZXF1ZXN0cyB0byBlbXVsYXRpb24sIHNpbmNlIG5ldworCSAqIHJlcXVlc3RzIGNvdWxkIHRoZW4gc25lYWsgaW4gZHVyaW5nIHRoaXMgYnVzIHJlc2V0IHBoYXNlLAorCSAqIHNvIHRha2UgdGhlIGxvY2sgbm93LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisKKwlwdnNjc2lfcHJvY2Vzc19yZXF1ZXN0X3JpbmcoYWRhcHRlcik7CisJbGxfYnVzX3Jlc2V0KGFkYXB0ZXIpOworCXB2c2NzaV9wcm9jZXNzX2NvbXBsZXRpb25fcmluZyhhZGFwdGVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmh3X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IHB2c2NzaV9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIgPSBzaG9zdF9wcml2KGhvc3QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIlNDU0kgZGV2aWNlIHJlc2V0IG9uIHNjc2kldToldVxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCk7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gcXVldWUgbmV3IHJlcXVlc3RzIGZvciB0aGlzIGRldmljZSBhZnRlciBmbHVzaGluZworCSAqIGFsbCBwZW5kaW5nIHJlcXVlc3RzIHRvIGVtdWxhdGlvbiwgc2luY2UgbmV3IHJlcXVlc3RzIGNvdWxkIHRoZW4KKwkgKiBzbmVhayBpbiBkdXJpbmcgdGhpcyBkZXZpY2UgcmVzZXQgcGhhc2UsIHNvIHRha2UgdGhlIGxvY2sgbm93LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisKKwlwdnNjc2lfcHJvY2Vzc19yZXF1ZXN0X3JpbmcoYWRhcHRlcik7CisJbGxfZGV2aWNlX3Jlc2V0KGFkYXB0ZXIsIGNtZC0+ZGV2aWNlLT5pZCk7CisJcHZzY3NpX3Byb2Nlc3NfY29tcGxldGlvbl9yaW5nKGFkYXB0ZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHB2c2NzaV90ZW1wbGF0ZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnB2c2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyID0gc2hvc3RfcHJpdihob3N0KTsKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCXNwcmludGYoYnVmLCAiVk13YXJlIFBWU0NTSSBzdG9yYWdlIGFkYXB0ZXIgcmV2ICVkLCByZXEvY21wL21zZyByaW5nczogIgorCQkiJXUvJXUvJXUgcGFnZXMsIGNtZF9wZXJfbHVuPSV1IiwgYWRhcHRlci0+cmV2LAorCQlhZGFwdGVyLT5yZXFfcGFnZXMsIGFkYXB0ZXItPmNtcF9wYWdlcywgYWRhcHRlci0+bXNnX3BhZ2VzLAorCQlwdnNjc2lfdGVtcGxhdGUuY21kX3Blcl9sdW4pOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcHZzY3NpX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCQk9ICJWTXdhcmUgUFZTQ1NJIEhvc3QgQWRhcHRlciIsCisJLnByb2NfbmFtZQkJCT0gInZtd19wdnNjc2kiLAorCS5pbmZvCQkJCT0gcHZzY3NpX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJCT0gcHZzY3NpX3F1ZXVlLAorCS50aGlzX2lkCQkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQkJPSBQVlNDU0lfTUFYX05VTV9TR19FTlRSSUVTX1BFUl9TRUdNRU5ULAorCS5kbWFfYm91bmRhcnkJCQk9IFVJTlRfTUFYLAorCS5tYXhfc2VjdG9ycwkJCT0gMHhmZmZmLAorCS51c2VfY2x1c3RlcmluZwkJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gcHZzY3NpX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IHB2c2NzaV9kZXZpY2VfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IHB2c2NzaV9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBwdnNjc2lfaG9zdF9yZXNldCwKK307CisKK3N0YXRpYyB2b2lkIHB2c2NzaV9wcm9jZXNzX21zZyhjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IFBWU0NTSVJpbmdNc2dEZXNjICplKQoreworCXN0cnVjdCBQVlNDU0lSaW5nc1N0YXRlICpzID0gYWRhcHRlci0+cmluZ3Nfc3RhdGU7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGFkYXB0ZXItPmhvc3Q7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyAidm13X3B2c2NzaTogbXNnIHR5cGU6IDB4JXggLSBNU0cgUklORzogJXUvJXUgKCV1KSBcbiIsCisJICAgICAgIGUtPnR5cGUsIHMtPm1zZ1Byb2RJZHgsIHMtPm1zZ0NvbnNJZHgsIHMtPm1zZ051bUVudHJpZXNMb2cyKTsKKworCUJVSUxEX0JVR19PTihQVlNDU0lfTVNHX0xBU1QgIT0gMik7CisKKwlpZiAoZS0+dHlwZSA9PSBQVlNDU0lfTVNHX0RFVl9BRERFRCkgeworCQlzdHJ1Y3QgUFZTQ1NJTXNnRGVzY0RldlN0YXR1c0NoYW5nZWQgKmRlc2M7CisJCWRlc2MgPSAoc3RydWN0IFBWU0NTSU1zZ0Rlc2NEZXZTdGF0dXNDaGFuZ2VkICopZTsKKworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAidm13X3B2c2NzaTogbXNnOiBkZXZpY2UgYWRkZWQgYXQgc2NzaSV1OiV1OiV1XG4iLAorCQkgICAgICAgZGVzYy0+YnVzLCBkZXNjLT50YXJnZXQsIGRlc2MtPmx1blsxXSk7CisKKwkJaWYgKCFzY3NpX2hvc3RfZ2V0KGhvc3QpKQorCQkJcmV0dXJuOworCisJCXNkZXYgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwgZGVzYy0+YnVzLCBkZXNjLT50YXJnZXQsCisJCQkJCSAgZGVzYy0+bHVuWzFdKTsKKwkJaWYgKHNkZXYpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInZtd19wdnNjc2k6IGRldmljZSBhbHJlYWR5IGV4aXN0c1xuIik7CisJCQlzY3NpX2RldmljZV9wdXQoc2Rldik7CisJCX0gZWxzZQorCQkJc2NzaV9hZGRfZGV2aWNlKGFkYXB0ZXItPmhvc3QsIGRlc2MtPmJ1cywKKwkJCQkJZGVzYy0+dGFyZ2V0LCBkZXNjLT5sdW5bMV0pOworCisJCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJfSBlbHNlIGlmIChlLT50eXBlID09IFBWU0NTSV9NU0dfREVWX1JFTU9WRUQpIHsKKwkJc3RydWN0IFBWU0NTSU1zZ0Rlc2NEZXZTdGF0dXNDaGFuZ2VkICpkZXNjOworCQlkZXNjID0gKHN0cnVjdCBQVlNDU0lNc2dEZXNjRGV2U3RhdHVzQ2hhbmdlZCAqKWU7CisKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInZtd19wdnNjc2k6IG1zZzogZGV2aWNlIHJlbW92ZWQgYXQgc2NzaSV1OiV1OiV1XG4iLAorCQkgICAgICAgZGVzYy0+YnVzLCBkZXNjLT50YXJnZXQsIGRlc2MtPmx1blsxXSk7CisKKwkJaWYgKCFzY3NpX2hvc3RfZ2V0KGhvc3QpKQorCQkJcmV0dXJuOworCisJCXNkZXYgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwgZGVzYy0+YnVzLCBkZXNjLT50YXJnZXQsCisJCQkJCSAgZGVzYy0+bHVuWzFdKTsKKwkJaWYgKHNkZXYpIHsKKwkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKKwkJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgInZtd19wdnNjc2k6IGZhaWxlZCB0byBsb29rdXAgc2NzaSV1OiV1OiV1XG4iLAorCQkJICAgICAgIGRlc2MtPmJ1cywgZGVzYy0+dGFyZ2V0LCBkZXNjLT5sdW5bMV0pOworCisJCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJfQorfQorCitzdGF0aWMgaW50IHB2c2NzaV9tc2dfcGVuZGluZyhjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IFBWU0NTSVJpbmdzU3RhdGUgKnMgPSBhZGFwdGVyLT5yaW5nc19zdGF0ZTsKKworCXJldHVybiBzLT5tc2dQcm9kSWR4ICE9IHMtPm1zZ0NvbnNJZHg7Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV9wcm9jZXNzX21zZ19yaW5nKGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgUFZTQ1NJUmluZ3NTdGF0ZSAqcyA9IGFkYXB0ZXItPnJpbmdzX3N0YXRlOworCXN0cnVjdCBQVlNDU0lSaW5nTXNnRGVzYyAqcmluZyA9IGFkYXB0ZXItPm1zZ19yaW5nOworCXUzMiBtc2dfZW50cmllcyA9IHMtPm1zZ051bUVudHJpZXNMb2cyOworCisJd2hpbGUgKHB2c2NzaV9tc2dfcGVuZGluZyhhZGFwdGVyKSkgeworCQlzdHJ1Y3QgUFZTQ1NJUmluZ01zZ0Rlc2MgKmUgPSByaW5nICsgKHMtPm1zZ0NvbnNJZHggJgorCQkJCQkJICAgICAgTUFTSyhtc2dfZW50cmllcykpOworCisJCWJhcnJpZXIoKTsKKwkJcHZzY3NpX3Byb2Nlc3NfbXNnKGFkYXB0ZXIsIGUpOworCQliYXJyaWVyKCk7CisJCXMtPm1zZ0NvbnNJZHgrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB2c2NzaV9tc2dfd29ya3F1ZXVlX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcjsKKworCWFkYXB0ZXIgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IHB2c2NzaV9hZGFwdGVyLCB3b3JrKTsKKworCXB2c2NzaV9wcm9jZXNzX21zZ19yaW5nKGFkYXB0ZXIpOworfQorCitzdGF0aWMgaW50IHB2c2NzaV9zZXR1cF9tc2dfd29ya3F1ZXVlKHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcikKK3sKKwljaGFyIG5hbWVbMzJdOworCisJaWYgKCFwdnNjc2lfdXNlX21zZykKKwkJcmV0dXJuIDA7CisKKwlwdnNjc2lfcmVnX3dyaXRlKGFkYXB0ZXIsIFBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkQsCisJCQkgUFZTQ1NJX0NNRF9TRVRVUF9NU0dfUklORyk7CisKKwlpZiAocHZzY3NpX3JlZ19yZWFkKGFkYXB0ZXIsIFBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkRfU1RBVFVTKSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksCisJCSAidm13X3B2c2NzaV93cV8ldSIsIGFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8pOworCisJYWRhcHRlci0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobmFtZSk7CisJaWYgKCFhZGFwdGVyLT53b3JrcXVldWUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiBmYWlsZWQgdG8gY3JlYXRlIHdvcmsgcXVldWVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJSU5JVF9XT1JLKCZhZGFwdGVyLT53b3JrLCBwdnNjc2lfbXNnX3dvcmtxdWV1ZV9oYW5kbGVyKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcHZzY3NpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZwKQoreworCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IGRldnA7CisJaW50IGhhbmRsZWQ7CisKKwlpZiAoYWRhcHRlci0+dXNlX21zaSB8fCBhZGFwdGVyLT51c2VfbXNpeCkKKwkJaGFuZGxlZCA9IHRydWU7CisJZWxzZSB7CisJCXUzMiB2YWwgPSBwdnNjc2lfcmVhZF9pbnRyX3N0YXR1cyhhZGFwdGVyKTsKKwkJaGFuZGxlZCA9ICh2YWwgJiBQVlNDU0lfSU5UUl9BTExfU1VQUE9SVEVEKSAhPSAwOworCQlpZiAoaGFuZGxlZCkKKwkJCXB2c2NzaV93cml0ZV9pbnRyX3N0YXR1cyhkZXZwLCB2YWwpOworCX0KKworCWlmIChoYW5kbGVkKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmh3X2xvY2ssIGZsYWdzKTsKKworCQlwdnNjc2lfcHJvY2Vzc19jb21wbGV0aW9uX3JpbmcoYWRhcHRlcik7CisJCWlmIChhZGFwdGVyLT51c2VfbXNnICYmIHB2c2NzaV9tc2dfcGVuZGluZyhhZGFwdGVyKSkKKwkJCXF1ZXVlX3dvcmsoYWRhcHRlci0+d29ya3F1ZXVlLCAmYWRhcHRlci0+d29yayk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBwdnNjc2lfZnJlZV9zZ2xzKGNvbnN0IHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcHZzY3NpX2N0eCAqY3R4ID0gYWRhcHRlci0+Y21kX21hcDsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnJlcV9kZXB0aDsgKytpLCArK2N0eCkKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyljdHgtPnNnbCwgZ2V0X29yZGVyKFNHTF9TSVpFKSk7Cit9CisKK3N0YXRpYyBpbnQgcHZzY3NpX3NldHVwX21zaXgoY29uc3Qgc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyLCBpbnQgKmlycSkKK3sKKwlzdHJ1Y3QgbXNpeF9lbnRyeSBlbnRyeSA9IHsgMCwgUFZTQ1NJX1ZFQ1RPUl9DT01QTEVUSU9OIH07CisJaW50IHJldDsKKworCXJldCA9IHBjaV9lbmFibGVfbXNpeChhZGFwdGVyLT5kZXYsICZlbnRyeSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSppcnEgPSBlbnRyeS52ZWN0b3I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHZzY3NpX3NodXRkb3duX2ludHIoc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5pcnEpIHsKKwkJZnJlZV9pcnEoYWRhcHRlci0+aXJxLCBhZGFwdGVyKTsKKwkJYWRhcHRlci0+aXJxID0gMDsKKwl9CisJaWYgKGFkYXB0ZXItPnVzZV9tc2kpIHsKKwkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPmRldik7CisJCWFkYXB0ZXItPnVzZV9tc2kgPSAwOworCX0gZWxzZSBpZiAoYWRhcHRlci0+dXNlX21zaXgpIHsKKwkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5kZXYpOworCQlhZGFwdGVyLT51c2VfbXNpeCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBwdnNjc2lfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQoreworCXB2c2NzaV9zaHV0ZG93bl9pbnRyKGFkYXB0ZXIpOworCisJaWYgKGFkYXB0ZXItPndvcmtxdWV1ZSkKKwkJZGVzdHJveV93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKKworCWlmIChhZGFwdGVyLT5tbWlvQmFzZSkKKwkJcGNpX2lvdW5tYXAoYWRhcHRlci0+ZGV2LCBhZGFwdGVyLT5tbWlvQmFzZSk7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGFkYXB0ZXItPmRldik7CisKKwlpZiAoYWRhcHRlci0+Y21kX21hcCkgeworCQlwdnNjc2lfZnJlZV9zZ2xzKGFkYXB0ZXIpOworCQlrZnJlZShhZGFwdGVyLT5jbWRfbWFwKTsKKwl9CisKKwlpZiAoYWRhcHRlci0+cmluZ3Nfc3RhdGUpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LCBQQUdFX1NJWkUsCisJCQkJICAgIGFkYXB0ZXItPnJpbmdzX3N0YXRlLCBhZGFwdGVyLT5yaW5nU3RhdGVQQSk7CisKKwlpZiAoYWRhcHRlci0+cmVxX3JpbmcpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LAorCQkJCSAgICBhZGFwdGVyLT5yZXFfcGFnZXMgKiBQQUdFX1NJWkUsCisJCQkJICAgIGFkYXB0ZXItPnJlcV9yaW5nLCBhZGFwdGVyLT5yZXFSaW5nUEEpOworCisJaWYgKGFkYXB0ZXItPmNtcF9yaW5nKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwKKwkJCQkgICAgYWRhcHRlci0+Y21wX3BhZ2VzICogUEFHRV9TSVpFLAorCQkJCSAgICBhZGFwdGVyLT5jbXBfcmluZywgYWRhcHRlci0+Y21wUmluZ1BBKTsKKworCWlmIChhZGFwdGVyLT5tc2dfcmluZykKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJICAgIGFkYXB0ZXItPm1zZ19wYWdlcyAqIFBBR0VfU0laRSwKKwkJCQkgICAgYWRhcHRlci0+bXNnX3JpbmcsIGFkYXB0ZXItPm1zZ1JpbmdQQSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzY2F0dGVyIGdhdGhlciBsaXN0cy4KKyAqCisgKiBUaGVzZSBhcmUgc3RhdGljYWxseSBhbGxvY2F0ZWQuICBUcnlpbmcgdG8gYmUgY2xldmVyIHdhcyBub3Qgd29ydGggaXQuCisgKgorICogRHluYW1pYyBhbGxvY2F0aW9uIGNhbiBmYWlsLCBhbmQgd2UgY2FuJ3QgZ28gZGVlZXAgaW50byB0aGUgbWVtb3J5CisgKiBhbGxvY2F0b3IsIHNpbmNlIHdlJ3JlIGEgU0NTSSBkcml2ZXIsIGFuZCB0cnlpbmcgdG9vIGhhcmQgdG8gYWxsb2NhdGUKKyAqIG1lbW9yeSBtaWdodCBnZW5lcmF0ZSBkaXNrIEkvTy4gIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBmYWlsIGRpc2sgSS9PCisgKiBpbiB0aGF0IGNhc2UgYmVjYXVzZSB3ZSBjYW4ndCBnZXQgYW4gYWxsb2NhdGlvbiAtIHRoZSBJL08gY291bGQgYmUKKyAqIHRyeWluZyB0byBzd2FwIG91dCBkYXRhIHRvIGZyZWUgbWVtb3J5LiAgU2luY2UgdGhhdCBpcyBwYXRob2xvZ2ljYWwsCisgKiBqdXN0IHVzZSBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHNjYXR0ZXIgbGlzdC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHB2c2NzaV9hbGxvY2F0ZV9zZyhzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHB2c2NzaV9jdHggKmN0eDsKKwlpbnQgaTsKKworCWN0eCA9IGFkYXB0ZXItPmNtZF9tYXA7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcHZzY3NpX3NnX2xpc3QpID4gU0dMX1NJWkUpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnJlcV9kZXB0aDsgKytpLCArK2N0eCkgeworCQljdHgtPnNnbCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkJICAgIGdldF9vcmRlcihTR0xfU0laRSkpOworCQljdHgtPnNnbFBBID0gMDsKKwkJQlVHX09OKCFJU19BTElHTkVEKCgodW5zaWduZWQgbG9uZyljdHgtPnNnbCksIFBBR0VfU0laRSkpOworCQlpZiAoIWN0eC0+c2dsKSB7CisJCQlmb3IgKDsgaSA+PSAwOyAtLWksIC0tY3R4KSB7CisJCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyljdHgtPnNnbCwKKwkJCQkJICAgZ2V0X29yZGVyKFNHTF9TSVpFKSk7CisJCQkJY3R4LT5zZ2wgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHZzY3NpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVOT0RFVjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkgPT0gMCAmJgorCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJ2bXdfcHZzY3NpOiB1c2luZyA2NGJpdCBkbWFcbiIpOworCX0gZWxzZSBpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSA9PSAwICYmCisJCSAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInZtd19wdnNjc2k6IHVzaW5nIDMyYml0IGRtYVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiBmYWlsZWQgdG8gc2V0IERNQSBtYXNrXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcHZzY3NpX3RlbXBsYXRlLmNhbl9xdWV1ZSA9CisJCW1pbihQVlNDU0lfTUFYX05VTV9QQUdFU19SRVFfUklORywgcHZzY3NpX3JpbmdfcGFnZXMpICoKKwkJUFZTQ1NJX01BWF9OVU1fUkVRX0VOVFJJRVNfUEVSX1BBR0U7CisJcHZzY3NpX3RlbXBsYXRlLmNtZF9wZXJfbHVuID0KKwkJbWluKHB2c2NzaV90ZW1wbGF0ZS5jYW5fcXVldWUsIHB2c2NzaV9jbWRfcGVyX2x1bik7CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcHZzY3NpX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IHB2c2NzaV9hZGFwdGVyKSk7CisJaWYgKCFob3N0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidm13X3B2c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIGhvc3RcbiIpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlhZGFwdGVyID0gc2hvc3RfcHJpdihob3N0KTsKKwltZW1zZXQoYWRhcHRlciwgMCwgc2l6ZW9mKCphZGFwdGVyKSk7CisJYWRhcHRlci0+ZGV2ICA9IHBkZXY7CisJYWRhcHRlci0+aG9zdCA9IGhvc3Q7CisKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+aHdfbG9jayk7CisKKwlob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJaG9zdC0+bWF4X2lkICAgICAgPSAxNjsKKwlob3N0LT5tYXhfbHVuICAgICA9IDE7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSAxNjsKKworCWFkYXB0ZXItPnJldiA9IHBkZXYtPnJldmlzaW9uOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInZtd19wdnNjc2kiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInZtd19wdnNjc2k6IHBjaSBtZW1vcnkgc2VsZWN0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaG9zdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKKwkJaWYgKChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpIDwgUFZTQ1NJX01FTV9TUEFDRV9TSVpFKQorCQkJY29udGludWU7CisKKwkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gREVWSUNFX0NPVU5UX1JFU09VUkNFKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInZtd19wdnNjc2k6IGFkYXB0ZXIgaGFzIG5vIHN1aXRhYmxlIE1NSU8gcmVnaW9uXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZXNvdXJjZXM7CisJfQorCisJYWRhcHRlci0+bW1pb0Jhc2UgPSBwY2lfaW9tYXAocGRldiwgaSwgUFZTQ1NJX01FTV9TUEFDRV9TSVpFKTsKKworCWlmICghYWRhcHRlci0+bW1pb0Jhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAidm13X3B2c2NzaTogY2FuJ3QgaW9tYXAgZm9yIEJBUiAlZCBtZW1zaXplICVsdVxuIiwKKwkJICAgICAgIGksIFBWU0NTSV9NRU1fU1BBQ0VfU0laRSk7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVzb3VyY2VzOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKKworCWxsX2FkYXB0ZXJfcmVzZXQoYWRhcHRlcik7CisKKwlhZGFwdGVyLT51c2VfbXNnID0gcHZzY3NpX3NldHVwX21zZ193b3JrcXVldWUoYWRhcHRlcik7CisKKwllcnJvciA9IHB2c2NzaV9hbGxvY2F0ZV9yaW5ncyhhZGFwdGVyKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiB1bmFibGUgdG8gYWxsb2NhdGUgcmluZyBtZW1vcnlcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlczsKKwl9CisKKwkvKgorCSAqIEZyb20gdGhpcyBwb2ludCBvbiB3ZSBzaG91bGQgcmVzZXQgdGhlIGFkYXB0ZXIgaWYgYW55dGhpbmcgZ29lcworCSAqIHdyb25nLgorCSAqLworCXB2c2NzaV9zZXR1cF9hbGxfcmluZ3MoYWRhcHRlcik7CisKKwlhZGFwdGVyLT5jbWRfbWFwID0ga2NhbGxvYyhhZGFwdGVyLT5yZXFfZGVwdGgsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBwdnNjc2lfY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5jbWRfbWFwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidm13X3B2c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3Jlc2V0X2FkYXB0ZXI7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmNtZF9wb29sKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cmVxX2RlcHRoOyBpKyspIHsKKwkJc3RydWN0IHB2c2NzaV9jdHggKmN0eCA9IGFkYXB0ZXItPmNtZF9tYXAgKyBpOworCQlsaXN0X2FkZCgmY3R4LT5saXN0LCAmYWRhcHRlci0+Y21kX3Bvb2wpOworCX0KKworCWVycm9yID0gcHZzY3NpX2FsbG9jYXRlX3NnKGFkYXB0ZXIpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIgInZtd19wdnNjc2k6IHVuYWJsZSB0byBhbGxvY2F0ZSBzL2cgdGFibGVcbiIpOworCQlnb3RvIG91dF9yZXNldF9hZGFwdGVyOworCX0KKworCWlmICghcHZzY3NpX2Rpc2FibGVfbXNpeCAmJgorCSAgICBwdnNjc2lfc2V0dXBfbXNpeChhZGFwdGVyLCAmYWRhcHRlci0+aXJxKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInZtd19wdnNjc2k6IHVzaW5nIE1TSS1YXG4iKTsKKwkJYWRhcHRlci0+dXNlX21zaXggPSAxOworCX0gZWxzZSBpZiAoIXB2c2NzaV9kaXNhYmxlX21zaSAmJiBwY2lfZW5hYmxlX21zaShwZGV2KSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInZtd19wdnNjc2k6IHVzaW5nIE1TSVxuIik7CisJCWFkYXB0ZXItPnVzZV9tc2kgPSAxOworCQlhZGFwdGVyLT5pcnEgPSBwZGV2LT5pcnE7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidm13X3B2c2NzaTogdXNpbmcgSU5UeFxuIik7CisJCWFkYXB0ZXItPmlycSA9IHBkZXYtPmlycTsKKwkJZmxhZ3MgPSBJUlFGX1NIQVJFRDsKKwl9CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPmlycSwgcHZzY3NpX2lzciwgZmxhZ3MsCisJCQkgICAgInZtd19wdnNjc2kiLCBhZGFwdGVyKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAidm13X3B2c2NzaTogdW5hYmxlIHRvIHJlcXVlc3QgSVJROiAlZFxuIiwgZXJyb3IpOworCQlhZGFwdGVyLT5pcnEgPSAwOworCQlnb3RvIG91dF9yZXNldF9hZGFwdGVyOworCX0KKworCWVycm9yID0gc2NzaV9hZGRfaG9zdChob3N0LCAmcGRldi0+ZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAidm13X3B2c2NzaTogc2NzaV9hZGRfaG9zdCBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gb3V0X3Jlc2V0X2FkYXB0ZXI7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlZNd2FyZSBQVlNDU0kgcmV2ICVkIGhvc3QgIyV1XG4iLAorCQkgYWRhcHRlci0+cmV2LCBob3N0LT5ob3N0X25vKTsKKworCXB2c2NzaV91bm1hc2tfaW50cihhZGFwdGVyKTsKKworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIDA7CisKK291dF9yZXNldF9hZGFwdGVyOgorCWxsX2FkYXB0ZXJfcmVzZXQoYWRhcHRlcik7CitvdXRfcmVsZWFzZV9yZXNvdXJjZXM6CisJcHZzY3NpX3JlbGVhc2VfcmVzb3VyY2VzKGFkYXB0ZXIpOworb3V0X2ZyZWVfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fcHZzY3NpX3NodXRkb3duKHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlwdnNjc2lfbWFza19pbnRyKGFkYXB0ZXIpOworCisJaWYgKGFkYXB0ZXItPndvcmtxdWV1ZSkKKwkJZmx1c2hfd29ya3F1ZXVlKGFkYXB0ZXItPndvcmtxdWV1ZSk7CisKKwlwdnNjc2lfc2h1dGRvd25faW50cihhZGFwdGVyKTsKKworCXB2c2NzaV9wcm9jZXNzX3JlcXVlc3RfcmluZyhhZGFwdGVyKTsKKwlwdnNjc2lfcHJvY2Vzc19jb21wbGV0aW9uX3JpbmcoYWRhcHRlcik7CisJbGxfYWRhcHRlcl9yZXNldChhZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgcHZzY3NpX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IHNob3N0X3ByaXYoaG9zdCk7CisKKwlfX3B2c2NzaV9zaHV0ZG93bihhZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgcHZzY3NpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IHNob3N0X3ByaXYoaG9zdCk7CisKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCisJX19wdnNjc2lfc2h1dGRvd24oYWRhcHRlcik7CisJcHZzY3NpX3JlbGVhc2VfcmVzb3VyY2VzKGFkYXB0ZXIpOworCisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwdnNjc2lfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidm13X3B2c2NzaSIsCisJLmlkX3RhYmxlCT0gcHZzY3NpX3BjaV90YmwsCisJLnByb2JlCQk9IHB2c2NzaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB2c2NzaV9yZW1vdmUpLAorCS5zaHV0ZG93biAgICAgICA9IHB2c2NzaV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB2c2NzaV9pbml0KHZvaWQpCit7CisJcHJfaW5mbygiJXMgLSB2ZXJzaW9uICVzXG4iLAorCQlQVlNDU0lfTElOVVhfRFJJVkVSX0RFU0MsIFBWU0NTSV9EUklWRVJfVkVSU0lPTl9TVFJJTkcpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwdnNjc2lfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwdnNjc2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHZzY3NpX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwdnNjc2lfaW5pdCk7Cittb2R1bGVfZXhpdChwdnNjc2lfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5oIGIvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmUzNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuaApAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIFZNd2FyZSBQVlNDU0kgaGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UgYW5kIG5vIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiBBbG9rIE4gS2F0YXJpYSA8YWthdGFyaWFAdm13YXJlLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfVk1XX1BWU0NTSV9IXworI2RlZmluZSBfVk1XX1BWU0NTSV9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBQVlNDU0lfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMC4xLjAtayIKKworI2RlZmluZSBQVlNDU0lfTUFYX05VTV9TR19FTlRSSUVTX1BFUl9TRUdNRU5UIDEyOAorCisjZGVmaW5lIE1BU0sobikgICAgICAgICgoMSA8PCAobikpIC0gMSkgICAgICAgIC8qIG1ha2UgYW4gbi1iaXQgbWFzayAqLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVk1XQVJFCQkweDE1QUQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTVdBUkVfUFZTQ1NJCTB4MDdDMAorCisvKgorICogaG9zdCBhZGFwdGVyIHN0YXR1cy9lcnJvciBjb2RlcworICovCitlbnVtIEhvc3RCdXNBZGFwdGVyU3RhdHVzIHsKKyAgIEJUU1RBVF9TVUNDRVNTICAgICAgID0gMHgwMCwgIC8qIENDQiBjb21wbGV0ZSBub3JtYWxseSB3aXRoIG5vIGVycm9ycyAqLworICAgQlRTVEFUX0xJTktFRF9DT01NQU5EX0NPTVBMRVRFRCAgICAgICAgICAgPSAweDBhLAorICAgQlRTVEFUX0xJTktFRF9DT01NQU5EX0NPTVBMRVRFRF9XSVRIX0ZMQUcgPSAweDBiLAorICAgQlRTVEFUX0RBVEFfVU5ERVJSVU4gPSAweDBjLAorICAgQlRTVEFUX1NFTFRJTUVPICAgICAgPSAweDExLCAgLyogU0NTSSBzZWxlY3Rpb24gdGltZW91dCAqLworICAgQlRTVEFUX0RBVEFSVU4gICAgICAgPSAweDEyLCAgLyogZGF0YSBvdmVycnVuL3VuZGVycnVuICovCisgICBCVFNUQVRfQlVTRlJFRSAgICAgICA9IDB4MTMsICAvKiB1bmV4cGVjdGVkIGJ1cyBmcmVlICovCisgICBCVFNUQVRfSU5WUEhBU0UgICAgICA9IDB4MTQsICAvKiBpbnZhbGlkIGJ1cyBwaGFzZSBvciBzZXF1ZW5jZSByZXF1ZXN0ZWQgYnkgdGFyZ2V0ICovCisgICBCVFNUQVRfTFVOTUlTTUFUQ0ggICA9IDB4MTcsICAvKiBsaW5rZWQgQ0NCIGhhcyBkaWZmZXJlbnQgTFVOIGZyb20gZmlyc3QgQ0NCICovCisgICBCVFNUQVRfU0VOU0ZBSUxFRCAgICA9IDB4MWIsICAvKiBhdXRvIHJlcXVlc3Qgc2Vuc2UgZmFpbGVkICovCisgICBCVFNUQVRfVEFHUkVKRUNUICAgICA9IDB4MWMsICAvKiBTQ1NJIElJIHRhZ2dlZCBxdWV1ZWluZyBtZXNzYWdlIHJlamVjdGVkIGJ5IHRhcmdldCAqLworICAgQlRTVEFUX0JBRE1TRyAgICAgICAgPSAweDFkLCAgLyogdW5zdXBwb3J0ZWQgbWVzc2FnZSByZWNlaXZlZCBieSB0aGUgaG9zdCBhZGFwdGVyICovCisgICBCVFNUQVRfSEFIQVJEV0FSRSAgICA9IDB4MjAsICAvKiBob3N0IGFkYXB0ZXIgaGFyZHdhcmUgZmFpbGVkICovCisgICBCVFNUQVRfTk9SRVNQT05TRSAgICA9IDB4MjEsICAvKiB0YXJnZXQgZGlkIG5vdCByZXNwb25kIHRvIFNDU0kgQVROLCBzZW50IGEgU0NTSSBSU1QgKi8KKyAgIEJUU1RBVF9TRU5UUlNUICAgICAgID0gMHgyMiwgIC8qIGhvc3QgYWRhcHRlciBhc3NlcnRlZCBhIFNDU0kgUlNUICovCisgICBCVFNUQVRfUkVDVlJTVCAgICAgICA9IDB4MjMsICAvKiBvdGhlciBTQ1NJIGRldmljZXMgYXNzZXJ0ZWQgYSBTQ1NJIFJTVCAqLworICAgQlRTVEFUX0RJU0NPTk5FQ1QgICAgPSAweDI0LCAgLyogdGFyZ2V0IGRldmljZSByZWNvbm5lY3RlZCBpbXByb3Blcmx5ICh3L28gdGFnKSAqLworICAgQlRTVEFUX0JVU1JFU0VUICAgICAgPSAweDI1LCAgLyogaG9zdCBhZGFwdGVyIGlzc3VlZCBCVVMgZGV2aWNlIHJlc2V0ICovCisgICBCVFNUQVRfQUJPUlRRVUVVRSAgICA9IDB4MjYsICAvKiBhYm9ydCBxdWV1ZSBnZW5lcmF0ZWQgKi8KKyAgIEJUU1RBVF9IQVNPRlRXQVJFICAgID0gMHgyNywgIC8qIGhvc3QgYWRhcHRlciBzb2Z0d2FyZSBlcnJvciAqLworICAgQlRTVEFUX0hBVElNRU9VVCAgICAgPSAweDMwLCAgLyogaG9zdCBhZGFwdGVyIGhhcmR3YXJlIHRpbWVvdXQgZXJyb3IgKi8KKyAgIEJUU1RBVF9TQ1NJUEFSSVRZICAgID0gMHgzNCwgIC8qIFNDU0kgcGFyaXR5IGVycm9yIGRldGVjdGVkICovCit9OworCisvKgorICogUmVnaXN0ZXIgb2Zmc2V0cy4KKyAqCisgKiBUaGVzZSByZWdpc3RlcnMgYXJlIGFjY2Vzc2libGUgYm90aCB2aWEgaS9vIHNwYWNlIGFuZCBtbSBpL28uCisgKi8KKworZW51bSBQVlNDU0lSZWdPZmZzZXQgeworCVBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkQgICAgICAgID0gICAgMHgwLAorCVBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkRfREFUQSAgID0gICAgMHg0LAorCVBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkRfU1RBVFVTID0gICAgMHg4LAorCVBWU0NTSV9SRUdfT0ZGU0VUX0xBU1RfU1RTXzAgICAgID0gIDB4MTAwLAorCVBWU0NTSV9SRUdfT0ZGU0VUX0xBU1RfU1RTXzEgICAgID0gIDB4MTA0LAorCVBWU0NTSV9SRUdfT0ZGU0VUX0xBU1RfU1RTXzIgICAgID0gIDB4MTA4LAorCVBWU0NTSV9SRUdfT0ZGU0VUX0xBU1RfU1RTXzMgICAgID0gIDB4MTBjLAorCVBWU0NTSV9SRUdfT0ZGU0VUX0lOVFJfU1RBVFVTICAgID0gMHgxMDBjLAorCVBWU0NTSV9SRUdfT0ZGU0VUX0lOVFJfTUFTSyAgICAgID0gMHgyMDEwLAorCVBWU0NTSV9SRUdfT0ZGU0VUX0tJQ0tfTk9OX1JXX0lPID0gMHgzMDE0LAorCVBWU0NTSV9SRUdfT0ZGU0VUX0RFQlVHICAgICAgICAgID0gMHgzMDE4LAorCVBWU0NTSV9SRUdfT0ZGU0VUX0tJQ0tfUldfSU8gICAgID0gMHg0MDE4LAorfTsKKworLyoKKyAqIFZpcnR1YWwgaC93IGNvbW1hbmRzLgorICovCisKK2VudW0gUFZTQ1NJQ29tbWFuZHMgeworCVBWU0NTSV9DTURfRklSU1QgICAgICAgICAgICAgPSAwLCAvKiBoYXMgdG8gYmUgZmlyc3QgKi8KKworCVBWU0NTSV9DTURfQURBUFRFUl9SRVNFVCAgICAgPSAxLAorCVBWU0NTSV9DTURfSVNTVUVfU0NTSSAgICAgICAgPSAyLAorCVBWU0NTSV9DTURfU0VUVVBfUklOR1MgICAgICAgPSAzLAorCVBWU0NTSV9DTURfUkVTRVRfQlVTICAgICAgICAgPSA0LAorCVBWU0NTSV9DTURfUkVTRVRfREVWSUNFICAgICAgPSA1LAorCVBWU0NTSV9DTURfQUJPUlRfQ01EICAgICAgICAgPSA2LAorCVBWU0NTSV9DTURfQ09ORklHICAgICAgICAgICAgPSA3LAorCVBWU0NTSV9DTURfU0VUVVBfTVNHX1JJTkcgICAgPSA4LAorCVBWU0NTSV9DTURfREVWSUNFX1VOUExVRyAgICAgPSA5LAorCisJUFZTQ1NJX0NNRF9MQVNUICAgICAgICAgICAgICA9IDEwICAvKiBoYXMgdG8gYmUgbGFzdCAqLworfTsKKworLyoKKyAqIENvbW1hbmQgZGVzY3JpcHRvciBmb3IgUFZTQ1NJX0NNRF9SRVNFVF9ERVZJQ0UgLS0KKyAqLworCitzdHJ1Y3QgUFZTQ1NJQ21kRGVzY1Jlc2V0RGV2aWNlIHsKKwl1MzIJdGFyZ2V0OworCXU4CWx1bls4XTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDb21tYW5kIGRlc2NyaXB0b3IgZm9yIFBWU0NTSV9DTURfQUJPUlRfQ01EIC0tCisgKgorICogLSBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBzcGVjaWZ5aW5nIHRoZSBMVU4uCisgKiAtIF9wYWQgc2hvdWxkIGJlIDAuCisgKi8KKworc3RydWN0IFBWU0NTSUNtZERlc2NBYm9ydENtZCB7CisJdTY0CWNvbnRleHQ7CisJdTMyCXRhcmdldDsKKwl1MzIJX3BhZDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDb21tYW5kIGRlc2NyaXB0b3IgZm9yIFBWU0NTSV9DTURfU0VUVVBfUklOR1MgLS0KKyAqCisgKiBOb3RlczoKKyAqIC0gcmVxUmluZ051bVBhZ2VzIGFuZCBjbXBSaW5nTnVtUGFnZXMgbmVlZCB0byBiZSBwb3dlciBvZiB0d28uCisgKiAtIHJlcVJpbmdOdW1QYWdlcyBhbmQgY21wUmluZ051bVBhZ2VzIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gMCwKKyAqIC0gcmVxUmluZ051bVBhZ2VzIGFuZCBjbXBSaW5nTnVtUGFnZXMgbmVlZCB0byBiZSBpbmZlcmlvciB0bworICogICBQVlNDU0lfU0VUVVBfUklOR1NfTUFYX05VTV9QQUdFUy4KKyAqLworCisjZGVmaW5lIFBWU0NTSV9TRVRVUF9SSU5HU19NQVhfTlVNX1BBR0VTICAgICAgICAzMgorc3RydWN0IFBWU0NTSUNtZERlc2NTZXR1cFJpbmdzIHsKKwl1MzIJcmVxUmluZ051bVBhZ2VzOworCXUzMgljbXBSaW5nTnVtUGFnZXM7CisJdTY0CXJpbmdzU3RhdGVQUE47CisJdTY0CXJlcVJpbmdQUE5zW1BWU0NTSV9TRVRVUF9SSU5HU19NQVhfTlVNX1BBR0VTXTsKKwl1NjQJY21wUmluZ1BQTnNbUFZTQ1NJX1NFVFVQX1JJTkdTX01BWF9OVU1fUEFHRVNdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENvbW1hbmQgZGVzY3JpcHRvciBmb3IgUFZTQ1NJX0NNRF9TRVRVUF9NU0dfUklORyAtLQorICoKKyAqIE5vdGVzOgorICogLSB0aGlzIGNvbW1hbmQgd2FzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGluaXRpYWwgcmV2aXNpb24gb2YgdGhlIGgvdworICogICBpbnRlcmZhY2UuIEJlZm9yZSB1c2luZyBpdCwgeW91IG5lZWQgdG8gY2hlY2sgdGhhdCBpdCBpcyBzdXBwb3J0ZWQgYnkKKyAqICAgd3JpdGluZyBQVlNDU0lfQ01EX1NFVFVQX01TR19SSU5HIHRvIHRoZSAnY29tbWFuZCcgcmVnaXN0ZXIsIHRoZW4KKyAqICAgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVhZCB0aGUgJ2NvbW1hbmQgc3RhdHVzJyByZWdpc3RlcjoKKyAqICAgICAgICogYSB2YWx1ZSBvZiAtMSBtZWFucyB0aGF0IHRoZSBjbWQgaXMgTk9UIHN1cHBvcnRlZCwKKyAqICAgICAgICogYSB2YWx1ZSAhPSAtMSBtZWFucyB0aGF0IHRoZSBjbWQgSVMgc3VwcG9ydGVkLgorICogICBJZiBpdCdzIHN1cHBvcnRlZCB0aGUgJ2NvbW1hbmQgc3RhdHVzJyByZWdpc3RlciBzaG91bGQgcmV0dXJuOgorICogICAgICBzaXplb2YoUFZTQ1NJQ21kRGVzY1NldHVwTXNnUmluZykgLyBzaXplb2YodTMyKS4KKyAqIC0gdGhpcyBjb21tYW5kIHNob3VsZCBiZSBpc3N1ZWQgX2FmdGVyXyB0aGUgdXN1YWwgU0VUVVBfUklOR1Mgc28gdGhhdCB0aGUKKyAqICAgUmluZ3NTdGF0ZSBwYWdlIGlzIGFscmVhZHkgc2V0dXAuIElmIG5vdCwgdGhlIGNvbW1hbmQgaXMgYSBub3AuCisgKiAtIG51bVBhZ2VzIG5lZWRzIHRvIGJlIGEgcG93ZXIgb2YgdHdvLAorICogLSBudW1QYWdlcyBuZWVkcyB0byBiZSBkaWZmZXJlbnQgZnJvbSAwLAorICogLSBfcGFkIHNob3VsZCBiZSB6ZXJvLgorICovCisKKyNkZWZpbmUgUFZTQ1NJX1NFVFVQX01TR19SSU5HX01BWF9OVU1fUEFHRVMgIDE2CisKK3N0cnVjdCBQVlNDU0lDbWREZXNjU2V0dXBNc2dSaW5nIHsKKwl1MzIJbnVtUGFnZXM7CisJdTMyCV9wYWQ7CisJdTY0CXJpbmdQUE5zW1BWU0NTSV9TRVRVUF9NU0dfUklOR19NQVhfTlVNX1BBR0VTXTsKK30gX19wYWNrZWQ7CisKK2VudW0gUFZTQ1NJTXNnVHlwZSB7CisJUFZTQ1NJX01TR19ERVZfQURERUQgICAgICAgICAgPSAwLAorCVBWU0NTSV9NU0dfREVWX1JFTU9WRUQgICAgICAgID0gMSwKKwlQVlNDU0lfTVNHX0xBU1QgICAgICAgICAgICAgICA9IDIsCit9OworCisvKgorICogTXNnIGRlc2NyaXB0b3IuCisgKgorICogc2l6ZW9mKHN0cnVjdCBQVlNDU0lSaW5nTXNnRGVzYykgPT0gMTI4LgorICoKKyAqIC0gdHlwZSBpcyBvZiB0eXBlIGVudW0gUFZTQ1NJTXNnVHlwZS4KKyAqIC0gdGhlIGNvbnRlbnQgb2YgYXJncyBkZXBlbmQgb24gdGhlIHR5cGUgb2YgZXZlbnQgYmVpbmcgZGVsaXZlcmVkLgorICovCisKK3N0cnVjdCBQVlNDU0lSaW5nTXNnRGVzYyB7CisJdTMyCXR5cGU7CisJdTMyCWFyZ3NbMzFdOworfSBfX3BhY2tlZDsKKworc3RydWN0IFBWU0NTSU1zZ0Rlc2NEZXZTdGF0dXNDaGFuZ2VkIHsKKwl1MzIJdHlwZTsgIC8qIFBWU0NTSV9NU0dfREVWIF9BRERFRCAvIF9SRU1PVkVEICovCisJdTMyCWJ1czsKKwl1MzIJdGFyZ2V0OworCXU4CWx1bls4XTsKKwl1MzIJcGFkWzI3XTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBSaW5ncyBzdGF0ZS4KKyAqCisgKiAtIHRoZSBmaWVsZHM6CisgKiAgICAuIG1zZ1Byb2RJZHgsCisgKiAgICAuIG1zZ0NvbnNJZHgsCisgKiAgICAuIG1zZ051bUVudHJpZXNMb2cyLAorICogICAuLiBhcmUgb25seSB1c2VkIG9uY2UgdGhlIFNFVFVQX01TR19SSU5HIGNtZCBoYXMgYmVlbiBpc3N1ZWQuCisgKiAtICdfcGFkJyBoZWxwcyB0byBlbnN1cmUgdGhhdCB0aGUgbXNnIHJlbGF0ZWQgZmllbGRzIGFyZSBvbiB0aGVpciBvd24KKyAqICAgY2FjaGUtbGluZS4KKyAqLworCitzdHJ1Y3QgUFZTQ1NJUmluZ3NTdGF0ZSB7CisJdTMyCXJlcVByb2RJZHg7CisJdTMyCXJlcUNvbnNJZHg7CisJdTMyCXJlcU51bUVudHJpZXNMb2cyOworCisJdTMyCWNtcFByb2RJZHg7CisJdTMyCWNtcENvbnNJZHg7CisJdTMyCWNtcE51bUVudHJpZXNMb2cyOworCisJdTgJX3BhZFsxMDRdOworCisJdTMyCW1zZ1Byb2RJZHg7CisJdTMyCW1zZ0NvbnNJZHg7CisJdTMyCW1zZ051bUVudHJpZXNMb2cyOworfSBfX3BhY2tlZDsKKworLyoKKyAqIFJlcXVlc3QgZGVzY3JpcHRvci4KKyAqCisgKiBzaXplb2YoUmluZ1JlcURlc2MpID0gMTI4CisgKgorICogLSBjb250ZXh0OiBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgY29tbWFuZC4gSXQgY291bGQgbm9ybWFsbHkgYmUgYW55CisgKiAgIDY0Yml0IHZhbHVlLCBob3dldmVyIHdlIGN1cnJlbnRseSBzdG9yZSBpdCBpbiB0aGUgc2VyaWFsTnVtYmVyIHZhcmlhYmxlCisgKiAgIG9mIHN0cnVjdCBTQ1NJX0NvbW1hbmQsIHNvIHdlIGhhdmUgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnMgZHVlIHRvIHRoZQorICogICB3YXkgdGhpcyBmaWVsZCBpcyBoYW5kbGVkIGluIHRoZSB2bWtlcm5lbCBzdG9yYWdlIHN0YWNrOgorICogICAgKiB0aGlzIHZhbHVlIGNhbid0IGJlIDAsCisgKiAgICAqIHRoZSB1cHBlciAzMmJpdCBuZWVkIHRvIGJlIDAgc2luY2Ugc2VyaWFsTnVtYmVyIGlzIGFzIGEgdTMyLgorICogICBDdXJyZW50bHkgdHJhY2tlZCBhcyBQUiAyOTIwNjAuCisgKiAtIGRhdGFMZW46IGNvbnRhaW5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHRyYW5zZmVycmVkLgorICogLSBkYXRhQWRkcjoKKyAqICAgKiBpZiBQVlNDU0lfRkxBR19DTURfV0lUSF9TR19MSVNUIGlzIHNldDogZGF0YUFkZHIgaXMgdGhlIFBBIG9mIHRoZSBmaXJzdAorICogICAgIHMvZyB0YWJsZSBzZWdtZW50LCBlYWNoIHMvZyBzZWdtZW50IGlzIGVudGlyZWx5IGNvbnRhaW5lZCBvbiBhIHNpbmdsZQorICogICAgIHBhZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5LAorICogICAqIGlmIFBWU0NTSV9GTEFHX0NNRF9XSVRIX1NHX0xJU1QgaXMgTk9UIHNldCwgdGhlbiBkYXRhQWRkciBpcyB0aGUgUEEgb2YKKyAqICAgICB0aGUgYnVmZmVyIHVzZWQgZm9yIHRoZSBETUEgdHJhbnNmZXIsCisgKiAtIGZsYWdzOgorICogICAqIFBWU0NTSV9GTEFHX0NNRF9XSVRIX1NHX0xJU1Q6IHNlZSBkYXRhQWRkciBhYm92ZSwKKyAqICAgKiBQVlNDU0lfRkxBR19DTURfRElSX05PTkU6IG5vIERNQSBpbnZvbHZlZCwKKyAqICAgKiBQVlNDU0lfRkxBR19DTURfRElSX1RPSE9TVDogdHJhbnNmZXIgZnJvbSBkZXZpY2UgdG8gbWFpbiBtZW1vcnksCisgKiAgICogUFZTQ1NJX0ZMQUdfQ01EX0RJUl9UT0RFVklDRTogdHJhbnNmZXIgZnJvbSBtYWluIG1lbW9yeSB0byBkZXZpY2UsCisgKiAgICogUFZTQ1NJX0ZMQUdfQ01EX09VVF9PRl9CQU5EX0NEQjogcmVzZXJ2ZWQgdG8gaGFuZGxlIENEQnMgbGFyZ2VyIHRoYW4KKyAqICAgICAxNmJ5dGVzLiBUbyBiZSBzcGVjaWZpZWQuCisgKiAtIHZjcHVIaW50OiB2Y3B1SWQgb2YgdGhlIHByb2Nlc3NvciB0aGF0IHdpbGwgYmUgbW9zdCBsaWtlbHkgd2FpdGluZyBmb3IgdGhlCisgKiAgIGNvbXBsZXRpb24gb2YgdGhlIGkvby4gRm9yIGd1ZXN0IE9TZXMgdGhhdCB1c2UgbG93ZXN0IHByaW9yaXR5IG1lc3NhZ2UKKyAqICAgZGVsaXZlcnkgbW9kZSAoc3VjaCBhcyB3aW5kb3dzKSwgd2UgdXNlIHRoaXMgImhpbnQiIHRvIGRlbGl2ZXIgdGhlCisgKiAgIGNvbXBsZXRpb24gYWN0aW9uIHRvIHRoZSBwcm9wZXIgdmNwdS4gRm9yIG5vdywgd2UgY2FuIHVzZSB0aGUgdmNwdUlkIG9mCisgKiAgIHRoZSBwcm9jZXNzb3IgdGhhdCBpbml0aWF0ZWQgdGhlIGkvbyBhcyBhIGxpa2VseSBjYW5kaWRhdGUgZm9yIHRoZSB2Y3B1CisgKiAgIHRoYXQgd2lsbCBiZSB3YWl0aW5nIGZvciB0aGUgY29tcGxldGlvbi4uCisgKiAtIGJ1cyBzaG91bGQgYmUgMDogd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBidXMgMCBmb3Igbm93LgorICogLSB1bnVzZWQgc2hvdWxkIGJlIHplcm8nZC4KKyAqLworCisjZGVmaW5lIFBWU0NTSV9GTEFHX0NNRF9XSVRIX1NHX0xJU1QgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFBWU0NTSV9GTEFHX0NNRF9PVVRfT0ZfQkFORF9DREIgICAgICgxIDw8IDEpCisjZGVmaW5lIFBWU0NTSV9GTEFHX0NNRF9ESVJfTk9ORSAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFBWU0NTSV9GTEFHX0NNRF9ESVJfVE9IT1NUICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFBWU0NTSV9GTEFHX0NNRF9ESVJfVE9ERVZJQ0UgICAgICAgICgxIDw8IDQpCisKK3N0cnVjdCBQVlNDU0lSaW5nUmVxRGVzYyB7CisJdTY0CWNvbnRleHQ7CisJdTY0CWRhdGFBZGRyOworCXU2NAlkYXRhTGVuOworCXU2NAlzZW5zZUFkZHI7CisJdTMyCXNlbnNlTGVuOworCXUzMglmbGFnczsKKwl1OAljZGJbMTZdOworCXU4CWNkYkxlbjsKKwl1OAlsdW5bOF07CisJdTgJdGFnOworCXU4CWJ1czsKKwl1OAl0YXJnZXQ7CisJdTgJdmNwdUhpbnQ7CisJdTgJdW51c2VkWzU5XTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBTY2F0dGVyLWdhdGhlciBsaXN0IG1hbmFnZW1lbnQuCisgKgorICogQXMgZGVzY3JpYmVkIGFib3ZlLCB3aGVuIFBWU0NTSV9GTEFHX0NNRF9XSVRIX1NHX0xJU1QgaXMgc2V0IGluIHRoZQorICogUmluZ1JlcURlc2MuZmxhZ3MsIHRoZW4gUmluZ1JlcURlc2MuZGF0YUFkZHIgaXMgdGhlIFBBIG9mIHRoZSBmaXJzdCBzL2cKKyAqIHRhYmxlIHNlZ21lbnQuCisgKgorICogLSBlYWNoIHNlZ21lbnQgb2YgdGhlIHMvZyB0YWJsZSBjb250YWluIGEgc3VjY2Vzc2lvbiBvZiBzdHJ1Y3QKKyAqICAgUFZTQ1NJU0dFbGVtZW50LgorICogLSBlYWNoIHNlZ21lbnQgaXMgZW50aXJlbHkgY29udGFpbmVkIG9uIGEgc2luZ2xlIHBoeXNpY2FsIHBhZ2Ugb2YgbWVtb3J5LgorICogLSBhICJjaGFpbiIgcy9nIGVsZW1lbnQgaGFzIHRoZSBmbGFnIFBWU0NTSV9TR0VfRkxBR19DSEFJTl9FTEVNRU5UIHNldCBpbgorICogICBQVlNDU0lTR0VsZW1lbnQuZmxhZ3MgYW5kIGluIHRoaXMgY2FzZToKKyAqICAgICAqIGFkZHIgaXMgdGhlIFBBIG9mIHRoZSBuZXh0IHMvZyBzZWdtZW50LAorICogICAgICogbGVuZ3RoIGlzIHVuZGVmaW5lZCwgYXNzdW1lZCB0byBiZSAwLgorICovCisKK3N0cnVjdCBQVlNDU0lTR0VsZW1lbnQgeworCXU2NAlhZGRyOworCXUzMglsZW5ndGg7CisJdTMyCWZsYWdzOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENvbXBsZXRpb24gZGVzY3JpcHRvci4KKyAqCisgKiBzaXplb2YoUmluZ0NtcERlc2MpID0gMzIKKyAqCisgKiAtIGNvbnRleHQ6IGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQuIFRoZSBzYW1lIHRoaW5nIHRoYXQgd2FzIHNwZWNpZmllZAorICogICB1bmRlciAiY29udGV4dCIgYXMgcGFydCBvZiBzdHJ1Y3QgUmluZ1JlcURlc2MgYXQgaW5pdGlhdGlvbiB0aW1lLAorICogLSBkYXRhTGVuOiBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZm9yIHRoZSBhY3R1YWwgaS9vIG9wZXJhdGlvbiwKKyAqIC0gc2Vuc2VMZW46IG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gdGhlIHNlbnNlIGJ1ZmZlciwKKyAqIC0gaG9zdFN0YXR1czogYWRhcHRlciBzdGF0dXMsCisgKiAtIHNjc2lTdGF0dXM6IGRldmljZSBzdGF0dXMsCisgKiAtIF9wYWQgc2hvdWxkIGJlIHplcm8uCisgKi8KKworc3RydWN0IFBWU0NTSVJpbmdDbXBEZXNjIHsKKwl1NjQJY29udGV4dDsKKwl1NjQJZGF0YUxlbjsKKwl1MzIJc2Vuc2VMZW47CisJdTE2CWhvc3RTdGF0dXM7CisJdTE2CXNjc2lTdGF0dXM7CisJdTMyCV9wYWRbMl07Cit9IF9fcGFja2VkOworCisvKgorICogSW50ZXJydXB0IHN0YXR1cyAvIElSUSBiaXRzLgorICovCisKKyNkZWZpbmUgUFZTQ1NJX0lOVFJfQ01QTF8wICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBQVlNDU0lfSU5UUl9DTVBMXzEgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFBWU0NTSV9JTlRSX0NNUExfTUFTSyAgICAgICAgICAgICAgTUFTSygyKQorCisjZGVmaW5lIFBWU0NTSV9JTlRSX01TR18wICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgUFZTQ1NJX0lOVFJfTVNHXzEgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBQVlNDU0lfSU5UUl9NU0dfTUFTSyAgICAgICAgICAgICAgIChNQVNLKDIpIDw8IDIpCisKKyNkZWZpbmUgUFZTQ1NJX0lOVFJfQUxMX1NVUFBPUlRFRCAgICAgICAgICBNQVNLKDQpCisKKy8qCisgKiBOdW1iZXIgb2YgTVNJLVggdmVjdG9ycyBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgUFZTQ1NJX01BWF9JTlRSUyAgICAgICAgMjQKKworLyoKKyAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBNU0ktWCB2ZWN0b3JzCisgKi8KKyNkZWZpbmUgUFZTQ1NJX1ZFQ1RPUl9DT01QTEVUSU9OICAgMAorCisvKgorICogTWlzYyBjb25zdGFudHMgZm9yIHRoZSByaW5ncy4KKyAqLworCisjZGVmaW5lIFBWU0NTSV9NQVhfTlVNX1BBR0VTX1JFUV9SSU5HICAgUFZTQ1NJX1NFVFVQX1JJTkdTX01BWF9OVU1fUEFHRVMKKyNkZWZpbmUgUFZTQ1NJX01BWF9OVU1fUEFHRVNfQ01QX1JJTkcgICBQVlNDU0lfU0VUVVBfUklOR1NfTUFYX05VTV9QQUdFUworI2RlZmluZSBQVlNDU0lfTUFYX05VTV9QQUdFU19NU0dfUklORyAgIFBWU0NTSV9TRVRVUF9NU0dfUklOR19NQVhfTlVNX1BBR0VTCisKKyNkZWZpbmUgUFZTQ1NJX01BWF9OVU1fUkVRX0VOVFJJRVNfUEVSX1BBR0UgXAorCQkJCShQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IFBWU0NTSVJpbmdSZXFEZXNjKSkKKworI2RlZmluZSBQVlNDU0lfTUFYX1JFUV9RVUVVRV9ERVBUSCBcCisJKFBWU0NTSV9NQVhfTlVNX1BBR0VTX1JFUV9SSU5HICogUFZTQ1NJX01BWF9OVU1fUkVRX0VOVFJJRVNfUEVSX1BBR0UpCisKKyNkZWZpbmUgUFZTQ1NJX01FTV9TUEFDRV9DT01NQU5EX05VTV9QQUdFUyAgICAgMQorI2RlZmluZSBQVlNDU0lfTUVNX1NQQUNFX0lOVFJfU1RBVFVTX05VTV9QQUdFUyAxCisjZGVmaW5lIFBWU0NTSV9NRU1fU1BBQ0VfTUlTQ19OVU1fUEFHRVMgICAgICAgIDIKKyNkZWZpbmUgUFZTQ1NJX01FTV9TUEFDRV9LSUNLX0lPX05VTV9QQUdFUyAgICAgMgorI2RlZmluZSBQVlNDU0lfTUVNX1NQQUNFX01TSVhfTlVNX1BBR0VTICAgICAgICAyCisKK2VudW0gUFZTQ1NJTWVtU3BhY2UgeworCVBWU0NTSV9NRU1fU1BBQ0VfQ09NTUFORF9QQUdFCQk9IDAsCisJUFZTQ1NJX01FTV9TUEFDRV9JTlRSX1NUQVRVU19QQUdFCT0gMSwKKwlQVlNDU0lfTUVNX1NQQUNFX01JU0NfUEFHRQkJPSAyLAorCVBWU0NTSV9NRU1fU1BBQ0VfS0lDS19JT19QQUdFCQk9IDQsCisJUFZTQ1NJX01FTV9TUEFDRV9NU0lYX1RBQkxFX1BBR0UJPSA2LAorCVBWU0NTSV9NRU1fU1BBQ0VfTVNJWF9QQkFfUEFHRQkJPSA3LAorfTsKKworI2RlZmluZSBQVlNDU0lfTUVNX1NQQUNFX05VTV9QQUdFUyBcCisJKFBWU0NTSV9NRU1fU1BBQ0VfQ09NTUFORF9OVU1fUEFHRVMgKyAgICAgICBcCisJIFBWU0NTSV9NRU1fU1BBQ0VfSU5UUl9TVEFUVVNfTlVNX1BBR0VTICsgICBcCisJIFBWU0NTSV9NRU1fU1BBQ0VfTUlTQ19OVU1fUEFHRVMgKyAgICAgICAgICBcCisJIFBWU0NTSV9NRU1fU1BBQ0VfS0lDS19JT19OVU1fUEFHRVMgKyAgICAgICBcCisJIFBWU0NTSV9NRU1fU1BBQ0VfTVNJWF9OVU1fUEFHRVMpCisKKyNkZWZpbmUgUFZTQ1NJX01FTV9TUEFDRV9TSVpFICAgICAgICAoUFZTQ1NJX01FTV9TUEFDRV9OVU1fUEFHRVMgKiBQQUdFX1NJWkUpCisKKyNlbmRpZiAvKiBfVk1XX1BWU0NTSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jIGIvZHJpdmVycy9zY3NpL3dkNzAwMC5jCmluZGV4IDA5MzYxMGIuLjJmNmU5ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS93ZDcwMDAuYworKysgYi9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogICoKICAqIDIwMDMvMDIvMTIgLSBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CiAgKgotICogQ2xlYW5lZCB1cCBob3N0IHRlbXBsYXRlIGRlZmludGlvbgorICogQ2xlYW5lZCB1cCBob3N0IHRlbXBsYXRlIGRlZmluaXRpb24KICAqIFJlbW92ZWQgbm93IG9ic29sZXRlIHdkNzAwMC5oCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9wbnAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcG5wLmMKaW5kZXggZDcxZGZlMy4uMzZlZGUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9wbnAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BucC5jCkBAIC0zNjEsOSArMzYxLDkgQEAKIAl7CSJMVFMwMDAxIiwJCTAgICAgICAgfSwKIAkvKiBSb2Nrd2VsbCdzIChQT1JBTGlOSykgMzM2MDAgSU5UIFBOUCAqLwogCXsJIldDSTAwMDMiLAkJMAl9LAotCS8qIFVua293biBQblAgbW9kZW1zICovCisJLyogVW5rbm93biBQblAgbW9kZW1zICovCiAJewkiUE5QQ1hYWCIsCQlVTktOT1dOX0RFVgl9LAotCS8qIE1vcmUgdW5rb3duIFBuUCBtb2RlbXMgKi8KKwkvKiBNb3JlIHVua25vd24gUG5QIG1vZGVtcyAqLwogCXsJIlBOUERYWFgiLAkJVU5LTk9XTl9ERVYJfSwKIAl7CSIiLAkJCTAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IDUwOTQzZmYuLjlmZjQ3ZGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTk5Niw3ICs5OTYsNyBAQAogCiBjb25maWcgU0VSSUFMX1NIX1NDSQogCXRyaXN0YXRlICJTdXBlckggU0NJKEYpIHNlcmlhbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTVVBFUkggfHwgSDgzMDAKKwlkZXBlbmRzIG9uIEhBVkVfQ0xLICYmIChTVVBFUkggfHwgSDgzMDApCiAJc2VsZWN0IFNFUklBTF9DT1JFCiAKIGNvbmZpZyBTRVJJQUxfU0hfU0NJX05SX1VBUlRTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tY2YuYyBiL2RyaXZlcnMvc2VyaWFsL21jZi5jCmluZGV4IGI0NDM4MjQuLjdiYjVmZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL21jZi5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL21jZi5jCkBAIC02MDIsNyArNjAyLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgbWNmX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgbWNmX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmggYi9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmgKaW5kZXggNTcwYjBkOS4uZjZlNzdmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuaApAQCAtNzMsNyArNzMsNyBAQAogfQogCiAvKgotICogUmVnaXN0ZXIgYWNlc3NvcnMuIE5vdGUgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGVuZm9yY2UgYSByZWNvdmVyeQorICogUmVnaXN0ZXIgYWNjZXNzb3JzLiBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBlbmZvcmNlIGEgcmVjb3ZlcnkKICAqIGRlbGF5IG9uIFBDSSBQb3dlck1hYyBoYXJkd2FyZSwgaXQncyBkZWFsdCBpbiBIVyBieSB0aGUgTWFjSU8gY2hpcCwKICAqIHRob3VnaCBpZiB3ZSB0cnkgdG8gdXNlIHRoaXMgZHJpdmVyIG9uIG9sZGVyIG1hY2hpbmVzLCB3ZSBtaWdodCBoYXZlCiAgKiB0byBhZGQgaXQgYmFjawpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwppbmRleCA2NDk4YmQxLi5mZjM4ZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogI2lmZGVmIENPTkZJR19TVVBFUkgKLSNpbmNsdWRlIDxhc20vY2xvY2suaD4KICNpbmNsdWRlIDxhc20vc2hfYmlvcy5oPgogI2VuZGlmCiAKQEAgLTc5LDIyICs3OCwxOCBAQAogCXN0cnVjdCB0aW1lcl9saXN0CWJyZWFrX3RpbWVyOwogCWludAkJCWJyZWFrX2ZsYWc7CiAKLSNpZmRlZiBDT05GSUdfSEFWRV9DTEsKIAkvKiBJbnRlcmZhY2UgY2xvY2sgKi8KIAlzdHJ1Y3QgY2xrCQkqaWNsazsKIAkvKiBEYXRhIGNsb2NrICovCiAJc3RydWN0IGNsawkJKmRjbGs7Ci0jZW5kaWYKKwogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIH07CiAKIHN0cnVjdCBzaF9zY2lfcHJpdiB7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgcG9ydHM7Ci0KLSNpZmRlZiBDT05GSUdfSEFWRV9DTEsKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY2xrX25iOwotI2VuZGlmCiB9OwogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCkBAIC0xNTYsMzIgKzE1MSw2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0NPTlNPTEVfUE9MTCB8fCBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFICovCiAKLSNpZiBkZWZpbmVkKF9fSDgzMDBTX18pCi1lbnVtIHsgc2NpX2Rpc2FibGUsIHNjaV9lbmFibGUgfTsKLQotc3RhdGljIHZvaWQgaDgzMDBfc2NpX2NvbmZpZyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY3RybCkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICptc3RwY3JsID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilNU1RQQ1JMOwotCWludCBjaCA9IChwb3J0LT5tYXBiYXNlICAtIFNNUjApID4+IDM7Ci0JdW5zaWduZWQgY2hhciBtYXNrID0gMSA8PCAoY2grMSk7Ci0KLQlpZiAoY3RybCA9PSBzY2lfZGlzYWJsZSkKLQkJKm1zdHBjcmwgfD0gbWFzazsKLQllbHNlCi0JCSptc3RwY3JsICY9IH5tYXNrOwotfQotCi1zdGF0aWMgdm9pZCBoODMwMF9zY2lfZW5hYmxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaDgzMDBfc2NpX2NvbmZpZyhwb3J0LCBzY2lfZW5hYmxlKTsKLX0KLQotc3RhdGljIHZvaWQgaDgzMDBfc2NpX2Rpc2FibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQloODMwMF9zY2lfY29uZmlnKHBvcnQsIHNjaV9kaXNhYmxlKTsKLX0KLSNlbmRpZgotCiAjaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCiBzdGF0aWMgdm9pZCBzY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKIHsKQEAgLTczMyw3ICs3MDIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfSEFWRV9DTEsKIC8qCiAgKiBIZXJlIHdlIGRlZmluZSBhIHRyYW5zaXN0aW9uIG5vdGlmaWVyIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSBhbGwgb2Ygb3VyCiAgKiBwb3J0cycgYmF1ZCByYXRlIHdoZW4gdGhlIHBlcmlwaGVyYWwgY2xvY2sgY2hhbmdlcy4KQEAgLTc1MSw3ICs3MTksNiBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjaV9wb3J0LCAmcHJpdi0+cG9ydHMsIG5vZGUpCiAJCQlzY2lfcG9ydC0+cG9ydC51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKHNjaV9wb3J0LT5kY2xrKTsKLQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJfQogCkBAIC03NzgsNyArNzQ1LDYgQEAKIAogCWNsa19kaXNhYmxlKHNjaV9wb3J0LT5kY2xrKTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IHNjaV9yZXF1ZXN0X2lycShzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQpCiB7CkBAIC04MzMsOCArNzk5LDggQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzY2lfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQkvKiBDYW4ndCBkZXRlY3QgKi8KLQlyZXR1cm4gVElPQ1NFUl9URU1UOworCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7CisJcmV0dXJuIHN0YXR1cyAmIFNDeFNSX1RFTkQocG9ydCkgPyBUSU9DU0VSX1RFTVQgOiAwOwogfQogCiBzdGF0aWMgdm9pZCBzY2lfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKQEAgLTEwNzcsMjEgKzEwNDMsMTAgQEAKIAlzY2lfcG9ydC0+cG9ydC5pb3R5cGUJPSBVUElPX01FTTsKIAlzY2lfcG9ydC0+cG9ydC5saW5lCT0gaW5kZXg7CiAJc2NpX3BvcnQtPnBvcnQuZmlmb3NpemUJPSAxOwotCi0jaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCi0jaWZkZWYgX19IODMwMFNfXwotCXNjaV9wb3J0LT5lbmFibGUJPSBoODMwMF9zY2lfZW5hYmxlOwotCXNjaV9wb3J0LT5kaXNhYmxlCT0gaDgzMDBfc2NpX2Rpc2FibGU7Ci0jZW5kaWYKLQlzY2lfcG9ydC0+cG9ydC51YXJ0Y2xrCT0gQ09ORklHX0NQVV9DTE9DSzsKLSNlbGlmIGRlZmluZWQoQ09ORklHX0hBVkVfQ0xLKQogCXNjaV9wb3J0LT5pY2xrCQk9IHAtPmNsayA/IGNsa19nZXQoJmRldi0+ZGV2LCBwLT5jbGspIDogTlVMTDsKIAlzY2lfcG9ydC0+ZGNsawkJPSBjbGtfZ2V0KCZkZXYtPmRldiwgInBlcmlwaGVyYWxfY2xrIik7CiAJc2NpX3BvcnQtPmVuYWJsZQk9IHNjaV9jbGtfZW5hYmxlOwogCXNjaV9wb3J0LT5kaXNhYmxlCT0gc2NpX2Nsa19kaXNhYmxlOwotI2Vsc2UKLSNlcnJvciAiTmVlZCBhIHZhbGlkIHVhcnRjbGsiCi0jZW5kaWYKIAogCXNjaV9wb3J0LT5icmVha190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NpX3BvcnQ7CiAJc2NpX3BvcnQtPmJyZWFrX3RpbWVyLmZ1bmN0aW9uID0gc2NpX2JyZWFrX3RpbWVyOwpAQCAtMTEwNiw3ICsxMDYxLDYgQEAKIAlzY2lfcG9ydC0+dHlwZQkJPSBzY2lfcG9ydC0+cG9ydC50eXBlID0gcC0+dHlwZTsKIAogCW1lbWNweSgmc2NpX3BvcnQtPmlycXMsICZwLT5pcnFzLCBzaXplb2YocC0+aXJxcykpOwotCiB9CiAKICNpZmRlZiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFCkBAIC0xMjM5LDE0ICsxMTkzLDExIEBACiAJc3RydWN0IHNjaV9wb3J0ICpwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSNpZmRlZiBDT05GSUdfSEFWRV9DTEsKIAljcHVmcmVxX3VucmVnaXN0ZXJfbm90aWZpZXIoJnByaXYtPmNsa19uYiwgQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKLSNlbmRpZgogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZwcml2LT5wb3J0cywgbm9kZSkKIAkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNjaV91YXJ0X2RyaXZlciwgJnAtPnBvcnQpOwotCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJa2ZyZWUocHJpdik7CkBAIC0xMzA3LDEwICsxMjU4LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBwcml2KTsKIAotI2lmZGVmIENPTkZJR19IQVZFX0NMSwogCXByaXYtPmNsa19uYi5ub3RpZmllcl9jYWxsID0gc2NpX25vdGlmaWVyOwogCWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnByaXYtPmNsa19uYiwgQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKLSNlbmRpZgogCiAJaWYgKGRldi0+aWQgIT0gLTEpIHsKIAkJcmV0ID0gc2NpX3Byb2JlX3NpbmdsZShkZXYsIGRldi0+aWQsIHAsICZzY2lfcG9ydHNbZGV2LT5pZF0pOwpAQCAtMTM3MCw3ICsxMzE5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NpX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gc2NpX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2NpX3JlbW92ZSksCisJLnJlbW92ZQkJPSBzY2lfcmVtb3ZlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzaC1zY2kiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKaW5kZXggM2UyZmNmOS4uYTMyMDk0ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19IODMwMDcpIHx8IGRlZmluZWQoQ09ORklHX0g4MzA2OCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC91Y2NfdWFydC5jCmluZGV4IDBjMDhmMjguLjQ2ZGU1NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdWNjX3VhcnQuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBzdHVmZiBvZiBhbGwgdGhlIGNoYXJhY3RlcnMgZnJvbSB0aGUKICAqIGtlcm5lbCdzIHRyYW5zbWl0IGJ1ZmZlciBpbnRvIFRYIEJEcy4KICAqCi0gKiBBIHJldHVybiB2YWx1ZSBvZiBub24temVybyBpbmRpY2F0ZXMgdGhhdCBpdCBzdWNlc3NmdWxseSBzdHVmZmVkIGFsbAorICogQSByZXR1cm4gdmFsdWUgb2Ygbm9uLXplcm8gaW5kaWNhdGVzIHRoYXQgaXQgc3VjY2Vzc2Z1bGx5IHN0dWZmZWQgYWxsCiAgKiBjaGFyYWN0ZXJzIGZyb20gdGhlIGtlcm5lbCBidWZmZXIuCiAgKgogICogQSByZXR1cm4gdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgc3RpbGwgY2hhcmFjdGVycyBpbiB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvTWFrZWZpbGUgYi9kcml2ZXJzL3NoL01ha2VmaWxlCmluZGV4IDZhMDI1Y2UuLjQ5NTZiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zaC9NYWtlZmlsZQpAQCAtMyw0ICszLDUgQEAKICMKIG9iai0kKENPTkZJR19TVVBFUkhZV0FZKQkrPSBzdXBlcmh5d2F5Lwogb2JqLSQoQ09ORklHX01BUExFKQkJKz0gbWFwbGUvCitvYmotJChDT05GSUdfR0VORVJJQ19HUElPKQkrPSBwZmMubwogb2JqLXkJCQkJKz0gaW50Yy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2ludGMuYyBiL2RyaXZlcnMvc2gvaW50Yy5jCmluZGV4IDU1OWI1ZmUuLmE3ZTVjMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvaW50Yy5jCisrKyBiL2RyaXZlcnMvc2gvaW50Yy5jCkBAIC0yLDYgKzIsNyBAQAogICogU2hhcmVkIGludGVycnVwdCBoYW5kbGluZyBjb2RlIGZvciBJUFIgYW5kIElOVEMyIHR5cGVzIG9mIElSUXMuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IE1hZ251cyBEYW1tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGF1bCBNdW5kdAogICoKICAqIEJhc2VkIG9uIGludGMyLmMgYW5kIGlwci5jCiAgKgpAQCAtMjQsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogCiAjZGVmaW5lIF9JTlRDX01LKGZuLCBtb2RlLCBhZGRyX2UsIGFkZHJfZCwgd2lkdGgsIHNoaWZ0KSBcCiAJKChzaGlmdCkgfCAoKHdpZHRoKSA8PCA1KSB8ICgoZm4pIDw8IDkpIHwgKChtb2RlKSA8PCAxMykgfCBcCkBAIC01OSw2ICs2MSwyMCBAQAogCiBzdGF0aWMgTElTVF9IRUFEKGludGNfbGlzdCk7CiAKKy8qCisgKiBUaGUgaW50Y19pcnFfbWFwIHByb3ZpZGVzIGEgZ2xvYmFsIG1hcCBvZiBib3VuZCBJUlEgdmVjdG9ycyBmb3IgYQorICogZ2l2ZW4gcGxhdGZvcm0uIEFsbG9jYXRpb24gb2YgSVJRcyBhcmUgZWl0aGVyIHN0YXRpYyB0aHJvdWdoIHRoZSBDUFUKKyAqIHZlY3RvciBtYXAsIG9yIGR5bmFtaWMgaW4gdGhlIGNhc2Ugb2YgYm9hcmQgbXV4IHZlY3RvcnMgb3IgTVNJLgorICoKKyAqIEFzIHRoaXMgaXMgYSBjZW50cmFsIHBvaW50IGZvciBhbGwgSVJRIGNvbnRyb2xsZXJzIG9uIHRoZSBzeXN0ZW0sCisgKiBlYWNoIG9mIHRoZSBhdmFpbGFibGUgc291cmNlcyBhcmUgbWFwcGVkIG91dCBoZXJlLiBUaGlzIGNvbWJpbmVkIHdpdGgKKyAqIHNwYXJzZWlycSBtYWtlcyBpdCBxdWl0ZSB0cml2aWFsIHRvIGtlZXAgdGhlIHZlY3RvciBtYXAgdGlnaHRseSBwYWNrZWQKKyAqIHdoZW4gZHluYW1pY2FsbHkgY3JlYXRpbmcgSVJRcywgYXMgd2VsbCBhcyB0eWluZyBpbiB0byBvdGhlcndpc2UKKyAqIHVudXNlZCBpcnFfZGVzYyBwb3NpdGlvbnMgaW4gdGhlIHNwYXJzZSBhcnJheS4KKyAqLworc3RhdGljIERFQ0xBUkVfQklUTUFQKGludGNfaXJxX21hcCwgTlJfSVJRUyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZlY3Rvcl9sb2NrKTsKKwogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgSVNfU01QKHgpIHguc21wCiAjZGVmaW5lIElOVENfUkVHKGQsIHgsIGMpIChkLT5yZWdbKHgpXSArICgoZC0+c21wWyh4KV0gJiAweGZmKSAqIGMpKQpAQCAtNzAsOSArODYsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW50Y19wcmlvX2xldmVsW05SX0lSUVNdOyAvKiBmb3Igbm93ICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhY2tfaGFuZGxlW05SX0lSUVNdOwotI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGludGNfZGVzY19pbnQgKmdldF9pbnRjX2Rlc2ModW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTI1MCw3ICsyNjQsNiBAQAogCXJldHVybiAwOyAvKiBhbGxvdyB3YWtldXAsIGJ1dCBzZXR1cCBoYXJkd2FyZSBpbiBpbnRjX3N1c3BlbmQoKSAqLwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCiBzdGF0aWMgdm9pZCBpbnRjX21hc2tfYWNrKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGludGNfZGVzY19pbnQgKmQgPSBnZXRfaW50Y19kZXNjKGlycSk7CkBAIC0yODIsNyArMjk1LDYgQEAKIAkJfQogCX0KIH0KLSNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGludGNfaGFuZGxlX2ludCAqaW50Y19maW5kX2lycShzdHJ1Y3QgaW50Y19oYW5kbGVfaW50ICpocCwKIAkJCQkJICAgICB1bnNpZ25lZCBpbnQgbnJfaHAsCkBAIC01MDEsNyArNTEzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDMpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW50Y19hY2tfZGF0YShzdHJ1Y3QgaW50Y19kZXNjICpkZXNjLAogCQkJCQkgIHN0cnVjdCBpbnRjX2Rlc2NfaW50ICpkLAogCQkJCQkgIGludGNfZW51bSBlbnVtX2lkKQpAQCAtNTMzLDcgKzU0NCw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBpbnRjX3NlbnNlX2RhdGEoc3RydWN0IGludGNfZGVzYyAqZGVzYywKIAkJCQkJICAgc3RydWN0IGludGNfZGVzY19pbnQgKmQsCkBAIC01NzIsNiArNTgyLDExIEBACiAJc3RydWN0IGludGNfaGFuZGxlX2ludCAqaHA7CiAJdW5zaWduZWQgaW50IGRhdGFbMl0sIHByaW1hcnk7CiAKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBJUlEgcG9zaXRpb24gd2l0aCB0aGUgZ2xvYmFsIElSUSBtYXAKKwkgKi8KKwlzZXRfYml0KGlycSwgaW50Y19pcnFfbWFwKTsKKwogCS8qIFByZWZlciBzaW5nbGUgaW50ZXJydXB0IHNvdXJjZSBiaXRtYXAgb3ZlciBvdGhlciBjb21iaW5hdGlvbnM6CiAJICogMS4gYml0bWFwLCBzaW5nbGUgaW50ZXJydXB0IHNvdXJjZQogCSAqIDIuIHByaW9yaXR5LCBzaW5nbGUgaW50ZXJydXB0IHNvdXJjZQpAQCAtNjQxLDEwICs2NTYsOCBAQAogCS8qIGlycSBzaG91bGQgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLwogCWQtPmNoaXAubWFzayhpcnEpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCiAJaWYgKGRlc2MtPmFja19yZWdzKQogCQlhY2tfaGFuZGxlW2lycV0gPSBpbnRjX2Fja19kYXRhKGRlc2MsIGQsIGVudW1faWQpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHNhdmVfcmVnKHN0cnVjdCBpbnRjX2Rlc2NfaW50ICpkLApAQCAtNjgxLDEwICs2OTQsOCBAQAogCWQtPm5yX3JlZyA9IGRlc2MtPm1hc2tfcmVncyA/IGRlc2MtPm5yX21hc2tfcmVncyAqIDIgOiAwOwogCWQtPm5yX3JlZyArPSBkZXNjLT5wcmlvX3JlZ3MgPyBkZXNjLT5ucl9wcmlvX3JlZ3MgKiAyIDogMDsKIAlkLT5ucl9yZWcgKz0gZGVzYy0+c2Vuc2VfcmVncyA/IGRlc2MtPm5yX3NlbnNlX3JlZ3MgOiAwOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCiAJZC0+bnJfcmVnICs9IGRlc2MtPmFja19yZWdzID8gZGVzYy0+bnJfYWNrX3JlZ3MgOiAwOwotI2VuZGlmCisKIAlkLT5yZWcgPSBremFsbG9jKGQtPm5yX3JlZyAqIHNpemVvZigqZC0+cmVnKSwgR0ZQX05PV0FJVCk7CiAjaWZkZWYgQ09ORklHX1NNUAogCWQtPnNtcCA9IGt6YWxsb2MoZC0+bnJfcmVnICogc2l6ZW9mKCpkLT5zbXApLCBHRlBfTk9XQUlUKTsKQEAgLTcyNywxNCArNzM4LDEyIEBACiAJZC0+Y2hpcC5zZXRfdHlwZSA9IGludGNfc2V0X3NlbnNlOwogCWQtPmNoaXAuc2V0X3dha2UgPSBpbnRjX3NldF93YWtlOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCiAJaWYgKGRlc2MtPmFja19yZWdzKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9hY2tfcmVnczsgaSsrKQogCQkJayArPSBzYXZlX3JlZyhkLCBrLCBkZXNjLT5hY2tfcmVnc1tpXS5zZXRfcmVnLCAwKTsKIAogCQlkLT5jaGlwLm1hc2tfYWNrID0gaW50Y19tYXNrX2FjazsKIAl9Ci0jZW5kaWYKIAogCUJVR19PTihrID4gMjU2KTsgLyogX0lOVENfQUREUl9FKCkgYW5kIF9JTlRDX0FERFJfRCgpIGFyZSA4IGJpdHMgKi8KIApAQCAtODU2LDUgKzg2NSw5MSBAQAogCiAJcmV0dXJuIGVycm9yOwogfQotCiBkZXZpY2VfaW5pdGNhbGwocmVnaXN0ZXJfaW50Y19zeXNkZXZzKTsKKworLyoKKyAqIER5bmFtaWMgSVJRIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNyZWF0ZV9pcnFfb25fbm9kZSh1bnNpZ25lZCBpbnQgaXJxX3dhbnQsIGludCBub2RlKQoreworCXVuc2lnbmVkIGludCBpcnEgPSAwLCBuZXc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogRmlyc3QgdHJ5IHRoZSB3YW50ZWQgSVJRLCB0aGVuIHNjYW4uCisJICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoaXJxX3dhbnQsIGludGNfaXJxX21hcCkpIHsKKwkJbmV3ID0gZmluZF9maXJzdF96ZXJvX2JpdChpbnRjX2lycV9tYXAsIG5yX2lycXMpOworCQlpZiAodW5saWtlbHkobmV3ID09IG5yX2lycXMpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKG5ldywgbm9kZSk7CisJCWlmICh1bmxpa2VseSghZGVzYykpIHsKKwkJCXByX2luZm8oImNhbid0IGdldCBpcnFfZGVzYyBmb3IgJWRcbiIsIG5ldyk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQlkZXNjID0gbW92ZV9pcnFfZGVzYyhkZXNjLCBub2RlKTsKKwkJX19zZXRfYml0KG5ldywgaW50Y19pcnFfbWFwKTsKKwkJaXJxID0gbmV3OworCX0KKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOworCisJaWYgKGlycSA+IDApCisJCWR5bmFtaWNfaXJxX2luaXQoaXJxKTsKKworCXJldHVybiBpcnE7Cit9CisKK2ludCBjcmVhdGVfaXJxKHZvaWQpCit7CisJaW50IG5pZCA9IGNwdV90b19ub2RlKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJaW50IGlycTsKKworCWlycSA9IGNyZWF0ZV9pcnFfb25fbm9kZShOUl9JUlFTX0xFR0FDWSwgbmlkKTsKKwlpZiAoaXJxID09IDApCisJCWlycSA9IC0xOworCisJcmV0dXJuIGlycTsKK30KKwordm9pZCBkZXN0cm95X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkeW5hbWljX2lycV9jbGVhbnVwKGlycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKKwlfX2NsZWFyX2JpdChpcnEsIGludGNfaXJxX21hcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKK30KKworaW50IHJlc2VydmVfaXJxX3ZlY3Rvcih1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChpcnEsIGludGNfaXJxX21hcCkpCisJCXJldCA9IC1FQlVTWTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCByZXNlcnZlX2lycV9sZWdhY3kodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBqOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7CisJaiA9IGZpbmRfZmlyc3RfYml0KGludGNfaXJxX21hcCwgbnJfaXJxcyk7CisJZm9yIChpID0gMDsgaSA8IGo7IGkrKykKKwkJX19zZXRfYml0KGksIGludGNfaXJxX21hcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvbWFwbGUvbWFwbGUuYyBiL2RyaXZlcnMvc2gvbWFwbGUvbWFwbGUuYwppbmRleCA5M2MyMGUxLi40ZThmNTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL21hcGxlL21hcGxlLmMKKysrIGIvZHJpdmVycy9zaC9tYXBsZS9tYXBsZS5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkqIG1heCBkZWxheSBpcyAxMQogCSovCiAJY3RybF9vdXRsKE1BUExFXzJNQlBTIHwgTUFQTEVfVElNRU9VVCgweEZGRkYpLCBNQVBMRV9TUEVFRCk7Ci0JY3RybF9vdXRsKFBIWVNBRERSKG1hcGxlX3NlbmRidWYpLCBNQVBMRV9ETUFBRERSKTsKKwljdHJsX291dGwodmlydF90b19waHlzKG1hcGxlX3NlbmRidWYpLCBNQVBMRV9ETUFBRERSKTsKIAljdHJsX291dGwoMSwgTUFQTEVfRU5BQkxFKTsKIH0KIApAQCAtMjU4LDcgKzI1OCw3IEBACiAJbWFwbGVfbGFzdHB0ciA9IG1hcGxlX3NlbmRwdHI7CiAKIAkqbWFwbGVfc2VuZHB0cisrID0gKHBvcnQgPDwgMTYpIHwgbGVuIHwgMHg4MDAwMDAwMDsKLQkqbWFwbGVfc2VuZHB0cisrID0gUEhZU0FERFIobXEtPnJlY3ZidWYtPmJ1Zik7CisJKm1hcGxlX3NlbmRwdHIrKyA9IHZpcnRfdG9fcGh5cyhtcS0+cmVjdmJ1Zi0+YnVmKTsKIAkqbWFwbGVfc2VuZHB0cisrID0KIAkgICAgbXEtPmNvbW1hbmQgfCAodG8gPDwgOCkgfCAoZnJvbSA8PCAxNikgfCAobGVuIDw8IDI0KTsKIAl3aGlsZSAobGVuLS0gPiAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZ3Bpby5jIGIvZHJpdmVycy9zaC9wZmMuYwpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBhcmNoL3NoL2tlcm5lbC9ncGlvLmMKcmVuYW1lIHRvIGRyaXZlcnMvc2gvcGZjLmMKaW5kZXggZDIyZTVhZi4uODQxZWQ1MCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvZ3Bpby5jCisrKyBiL2RyaXZlcnMvc2gvcGZjLmMKQEAgLTcsNyArNyw2IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTM1LDExICszNCwxMSBAQAogewogCXN3aXRjaCAocmVnX3dpZHRoKSB7CiAJY2FzZSA4OgotCQlyZXR1cm4gY3RybF9pbmIocmVnKTsKKwkJcmV0dXJuIF9fcmF3X3JlYWRiKHJlZyk7CiAJY2FzZSAxNjoKLQkJcmV0dXJuIGN0cmxfaW53KHJlZyk7CisJCXJldHVybiBfX3Jhd19yZWFkdyhyZWcpOwogCWNhc2UgMzI6Ci0JCXJldHVybiBjdHJsX2lubChyZWcpOworCQlyZXR1cm4gX19yYXdfcmVhZGwocmVnKTsKIAl9CiAKIAlCVUcoKTsKQEAgLTUyLDEzICs1MSwxMyBAQAogewogCXN3aXRjaCAocmVnX3dpZHRoKSB7CiAJY2FzZSA4OgotCQljdHJsX291dGIoZGF0YSwgcmVnKTsKKwkJX19yYXdfd3JpdGViKGRhdGEsIHJlZyk7CiAJCXJldHVybjsKIAljYXNlIDE2OgotCQljdHJsX291dHcoZGF0YSwgcmVnKTsKKwkJX19yYXdfd3JpdGV3KGRhdGEsIHJlZyk7CiAJCXJldHVybjsKIAljYXNlIDMyOgotCQljdHJsX291dGwoZGF0YSwgcmVnKTsKKwkJX19yYXdfd3JpdGVsKGRhdGEsIHJlZyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTcyLDExICs3MSw5IEBACiAKIAlwb3MgPSBkci0+cmVnX3dpZHRoIC0gKGluX3BvcyArIDEpOwogCi0jaWZkZWYgREVCVUcKLQlwcl9pbmZvKCJ3cml0ZV9iaXQgYWRkciA9ICVseCwgdmFsdWUgPSAlbGQsIHBvcyA9ICVsZCwgIgotCQkicl93aWR0aCA9ICVsZFxuIiwKLQkJZHItPnJlZywgISF2YWx1ZSwgcG9zLCBkci0+cmVnX3dpZHRoKTsKLSNlbmRpZgorCXByX2RlYnVnKCJ3cml0ZV9iaXQgYWRkciA9ICVseCwgdmFsdWUgPSAlbGQsIHBvcyA9ICVsZCwgIgorCQkgInJfd2lkdGggPSAlbGRcbiIsCisJCSBkci0+cmVnLCAhIXZhbHVlLCBwb3MsIGRyLT5yZWdfd2lkdGgpOwogCiAJaWYgKHZhbHVlKQogCQlzZXRfYml0KHBvcywgJmRyLT5yZWdfc2hhZG93KTsKQEAgLTk1LDExICs5Miw5IEBACiAJbWFzayA9ICgxIDw8IGZpZWxkX3dpZHRoKSAtIDE7CiAJcG9zID0gcmVnX3dpZHRoIC0gKChpbl9wb3MgKyAxKSAqIGZpZWxkX3dpZHRoKTsKIAotI2lmZGVmIERFQlVHCi0JcHJfaW5mbygicmVhZF9yZWc6IGFkZHIgPSAlbHgsIHBvcyA9ICVsZCwgIgotCQkicl93aWR0aCA9ICVsZCwgZl93aWR0aCA9ICVsZFxuIiwKLQkJcmVnLCBwb3MsIHJlZ193aWR0aCwgZmllbGRfd2lkdGgpOwotI2VuZGlmCisJcHJfZGVidWcoInJlYWRfcmVnOiBhZGRyID0gJWx4LCBwb3MgPSAlbGQsICIKKwkJICJyX3dpZHRoID0gJWxkLCBmX3dpZHRoID0gJWxkXG4iLAorCQkgcmVnLCBwb3MsIHJlZ193aWR0aCwgZmllbGRfd2lkdGgpOwogCiAJZGF0YSA9IGdwaW9fcmVhZF9yYXdfcmVnKHJlZywgcmVnX3dpZHRoKTsKIAlyZXR1cm4gKGRhdGEgPj4gcG9zKSAmIG1hc2s7CkBAIC0xMTQsMjQgKzEwOSwyMiBAQAogCW1hc2sgPSAoMSA8PCBmaWVsZF93aWR0aCkgLSAxOwogCXBvcyA9IHJlZ193aWR0aCAtICgoaW5fcG9zICsgMSkgKiBmaWVsZF93aWR0aCk7CiAKLSNpZmRlZiBERUJVRwotCXByX2luZm8oIndyaXRlX3JlZyBhZGRyID0gJWx4LCB2YWx1ZSA9ICVsZCwgcG9zID0gJWxkLCAiCi0JCSJyX3dpZHRoID0gJWxkLCBmX3dpZHRoID0gJWxkXG4iLAotCQlyZWcsIHZhbHVlLCBwb3MsIHJlZ193aWR0aCwgZmllbGRfd2lkdGgpOwotI2VuZGlmCisJcHJfZGVidWcoIndyaXRlX3JlZyBhZGRyID0gJWx4LCB2YWx1ZSA9ICVsZCwgcG9zID0gJWxkLCAiCisJCSAicl93aWR0aCA9ICVsZCwgZl93aWR0aCA9ICVsZFxuIiwKKwkJIHJlZywgdmFsdWUsIHBvcywgcmVnX3dpZHRoLCBmaWVsZF93aWR0aCk7CiAKIAltYXNrID0gfihtYXNrIDw8IHBvcyk7CiAJdmFsdWUgPSB2YWx1ZSA8PCBwb3M7CiAKIAlzd2l0Y2ggKHJlZ193aWR0aCkgewogCWNhc2UgODoKLQkJY3RybF9vdXRiKChjdHJsX2luYihyZWcpICYgbWFzaykgfCB2YWx1ZSwgcmVnKTsKKwkJX19yYXdfd3JpdGViKChfX3Jhd19yZWFkYihyZWcpICYgbWFzaykgfCB2YWx1ZSwgcmVnKTsKIAkJYnJlYWs7CiAJY2FzZSAxNjoKLQkJY3RybF9vdXR3KChjdHJsX2ludyhyZWcpICYgbWFzaykgfCB2YWx1ZSwgcmVnKTsKKwkJX19yYXdfd3JpdGV3KChfX3Jhd19yZWFkdyhyZWcpICYgbWFzaykgfCB2YWx1ZSwgcmVnKTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKLQkJY3RybF9vdXRsKChjdHJsX2lubChyZWcpICYgbWFzaykgfCB2YWx1ZSwgcmVnKTsKKwkJX19yYXdfd3JpdGVsKChfX3Jhd19yZWFkbChyZWcpICYgbWFzaykgfCB2YWx1ZSwgcmVnKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpZGV2LmMgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwppbmRleCA1ZDIzOTgzLi4yMGQ3MzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlkZXYuYworKysgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpZGV2Lmg+CkBAIC00Miw3ICs0MSw3IEBACiAgKiBUaGlzIHN1cHBvcnRzIGFjY2Nlc3MgdG8gU1BJIGRldmljZXMgdXNpbmcgbm9ybWFsIHVzZXJzcGFjZSBJL08gY2FsbHMuCiAgKiBOb3RlIHRoYXQgd2hpbGUgdHJhZGl0aW9uYWwgVU5JWC9QT1NJWCBJL08gc2VtYW50aWNzIGFyZSBoYWxmIGR1cGxleCwKICAqIGFuZCBvZnRlbiBtYXNrIG1lc3NhZ2UgYm91bmRhcmllcywgZnVsbCBTUEkgc3VwcG9ydCByZXF1aXJlcyBmdWxsIGR1cGxleAotICogdHJhbnNmZXJzLiAgVGhlcmUgYXJlIHNldmVyYWwga2luZHMgb2Ygb2YgaW50ZXJuYWwgbWVzc2FnZSBib3VuZGFyaWVzIHRvCisgKiB0cmFuc2ZlcnMuICBUaGVyZSBhcmUgc2V2ZXJhbCBraW5kcyBvZiBpbnRlcm5hbCBtZXNzYWdlIGJvdW5kYXJpZXMgdG8KICAqIGhhbmRsZSBjaGlwc2VsZWN0IG1hbmFnZW1lbnQgYW5kIG90aGVyIHByb3RvY29sIG9wdGlvbnMuCiAgKgogICogU1BJIGhhcyBhIGNoYXJhY3RlciBtYWpvciBudW1iZXIgYXNzaWduZWQuICBXZSBhbGxvY2F0ZSBtaW5vciBudW1iZXJzCkBAIC00NzcsNyArNDc2LDYgQEAKIAlzdHJ1Y3Qgc3BpZGV2X2RhdGEJKnNwaWRldjsKIAlpbnQJCQlzdGF0dXMgPSAtRU5YSU87CiAKLQlsb2NrX2tlcm5lbCgpOwogCW11dGV4X2xvY2soJmRldmljZV9saXN0X2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzcGlkZXYsICZkZXZpY2VfbGlzdCwgZGV2aWNlX2VudHJ5KSB7CkBAIC01MDMsNyArNTAxLDYgQEAKIAkJcHJfZGVidWcoInNwaWRldjogbm90aGluZyBmb3IgbWlub3IgJWRcbiIsIGltaW5vcihpbm9kZSkpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXZpY2VfbGlzdF9sb2NrKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKaW5kZXggMTMwMWNhYS4uZDM3YjdlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogCiBvYmotJChDT05GSUdfVklERU9fR083MDA3KSArPSBnbzcwMDcubwogb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwN19VU0IpICs9IGdvNzAwNy11c2Iubwotb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwN19VU0JfUzIyNTBfQk9BUkQpICs9IHMyMjUwLm8KK29iai0kKENPTkZJR19WSURFT19HTzcwMDdfVVNCX1MyMjUwX0JPQVJEKSArPSBzMjI1MC5vIHMyMjUwLWxvYWRlci5vCiBvYmotJChDT05GSUdfVklERU9fR083MDA3X1NBQTcxMTMpICs9IHdpcy1zYWE3MTEzLm8KIG9iai0kKENPTkZJR19WSURFT19HTzcwMDdfT1Y3NjQwKSArPSB3aXMtb3Y3NjQwLm8KIG9iai0kKENPTkZJR19WSURFT19HTzcwMDdfU0FBNzExNSkgKz0gd2lzLXNhYTcxMTUubwpAQCAtMTcsNyArMTcsNyBAQAogZ283MDA3LW9ianMgKz0gZ283MDA3LXY0bDIubyBnbzcwMDctZHJpdmVyLm8gZ283MDA3LWkyYy5vIGdvNzAwNy1mdy5vIFwKIAkJc25kLWdvNzAwNy5vCiAKLXMyMjUwLW9ianMgKz0gczIyNTAtYm9hcmQubyBzMjI1MC1sb2FkZXIubworczIyNTAtb2JqcyArPSBzMjI1MC1ib2FyZC5vCiAKICMgVW5jb21tZW50IHdoZW4gdGhlIHNhYTcxMzQgcGF0Y2hlcyBnZXQgaW50byB1cHN0cmVhbQogI2lmbmVxICgkKENPTkZJR19WSURFT19TQUE3MTM0KSwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jCmluZGV4IDQ3MmY0YmIuLmZiMTM0NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jCkBAIC00OSw3ICs0OSw3IEBACiAJZ28tPmhwaV9vcHMtPnJlYWRfaW50ZXJydXB0KGdvKTsKIAlpZiAod2FpdF9ldmVudF90aW1lb3V0KGdvLT5pbnRlcnJ1cHRfd2FpdHEsCiAJCQkJZ28tPmludGVycnVwdF9hdmFpbGFibGUsIDUqSFopIDwgMCkgewotCQl2NGwyX2Vycihnby0+dmlkZW9fZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciByZWFkIGludGVycnVwdFxuIik7CisJCXY0bDJfZXJyKCZnby0+djRsMl9kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIHJlYWQgaW50ZXJydXB0XG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoIWdvLT5pbnRlcnJ1cHRfYXZhaWxhYmxlKQpAQCAtMTkzLDcgKzE5Myw4IEBACiBzdGF0aWMgaW50IGluaXRfaTJjX21vZHVsZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IGNoYXIgKnR5cGUsCiAJCQkgICBpbnQgaWQsIGludCBhZGRyKQogewotCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCXN0cnVjdCBnbzcwMDcgKmdvID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gJmdvLT52NGwyX2RldjsKIAljaGFyICptb2RuYW1lOwogCiAJc3dpdGNoIChpZCkgewpAQCAtMjE5LDIwICsyMjAsMTYgQEAKIAkJbW9kbmFtZSA9ICJ3aXMtb3Y3NjQwIjsKIAkJYnJlYWs7CiAJY2FzZSBJMkNfRFJJVkVSSURfUzIyNTA6Ci0JCW1vZG5hbWUgPSAiczIyNTAtYm9hcmQiOworCQltb2RuYW1lID0gInMyMjUwIjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbW9kbmFtZSA9IE5VTEw7CiAJCWJyZWFrOwogCX0KLQlpZiAobW9kbmFtZSAhPSBOVUxMKQotCQlyZXF1ZXN0X21vZHVsZShtb2RuYW1lKTsKIAotCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOwotCWluZm8uYWRkciA9IGFkZHI7Ci0Jc3RybGNweShpbmZvLnR5cGUsIHR5cGUsIEkyQ19OQU1FX1NJWkUpOwotCWlmICghaTJjX25ld19kZXZpY2UoYWRhcHRlciwgJmluZm8pKQorCWlmICh2NGwyX2kyY19uZXdfc3ViZGV2KHY0bDJfZGV2LCBhZGFwdGVyLCBtb2RuYW1lLCB0eXBlLCBhZGRyLCBOVUxMKSkKIAkJcmV0dXJuIDA7CisKIAlpZiAobW9kbmFtZSAhPSBOVUxMKQogCQlwcmludGsoS0VSTl9JTkZPCiAJCQkiZ283MDA3OiBwcm9iaW5nIGZvciBtb2R1bGUgJXMgZmFpbGVkXG4iLCBtb2RuYW1lKTsKQEAgLTI2Miw2ICsyNTksMTEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIC0xOwogCisJLyogdjRsMiBpbml0IG11c3QgaGFwcGVuIGJlZm9yZSBpMmMgc3ViZGV2cyAqLworCXJldCA9IGdvNzAwN192NGwyX2luaXQoZ28pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lICYmCiAJCQlnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfVVNFX09OQk9BUkRfSTJDKSB7CiAJCWlmIChnbzcwMDdfaTJjX2luaXQoZ28pIDwgMCkKQEAgLTI4Miw3ICsyODQsNyBAQAogCQlnby0+YXVkaW9fZW5hYmxlZCA9IDE7CiAJCWdvNzAwN19zbmRfaW5pdChnbyk7CiAJfQotCXJldHVybiBnbzcwMDdfdjRsMl9pbml0KGdvKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZ283MDA3X3JlZ2lzdGVyX2VuY29kZXIpOwogCkBAIC0zMTUsNyArMzE3LDcgQEAKIAogCWlmIChnbzcwMDdfc2VuZF9maXJtd2FyZShnbywgZncsIGZ3X2xlbikgPCAwIHx8CiAJCQlnbzcwMDdfcmVhZF9pbnRlcnJ1cHQoZ28sICZpbnRyX3ZhbCwgJmludHJfZGF0YSkgPCAwKSB7Ci0JCXY0bDJfZXJyKGdvLT52aWRlb19kZXYsICJlcnJvciB0cmFuc2ZlcnJpbmcgZmlybXdhcmVcbiIpOworCQl2NGwyX2VycigmZ28tPnY0bDJfZGV2LCAiZXJyb3IgdHJhbnNmZXJyaW5nIGZpcm13YXJlXG4iKTsKIAkJcnYgPSAtMTsKIAkJZ290byBzdGFydF9lcnJvcjsKIAl9CkBAIC0zMjQsNyArMzI2LDcgQEAKIAlnby0+cGFyc2VfbGVuZ3RoID0gMDsKIAlnby0+c2Vlbl9mcmFtZSA9IDA7CiAJaWYgKGdvNzAwN19zdHJlYW1fc3RhcnQoZ28pIDwgMCkgewotCQl2NGwyX2Vycihnby0+dmlkZW9fZGV2LCAiZXJyb3Igc3RhcnRpbmcgc3RyZWFtIHRyYW5zZmVyXG4iKTsKKwkJdjRsMl9lcnIoJmdvLT52NGwyX2RldiwgImVycm9yIHN0YXJ0aW5nIHN0cmVhbSB0cmFuc2ZlclxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gc3RhcnRfZXJyb3I7CiAJfQpAQCAtNDIwLDcgKzQyMiw3IEBACiAJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAJCWlmIChnby0+YWN0aXZlX2J1ZiAhPSBOVUxMICYmCiAJCQkgICAgZ28tPmFjdGl2ZV9idWYtPmJ5dGVzdXNlZCA+PSBHTzcwMDdfQlVGX1NJWkUgLSAzKSB7Ci0JCQl2NGwyX2luZm8oZ28tPnZpZGVvX2RldiwgImRyb3BwaW5nIG92ZXJzaXplZCBmcmFtZVxuIik7CisJCQl2NGwyX2luZm8oJmdvLT52NGwyX2RldiwgImRyb3BwaW5nIG92ZXJzaXplZCBmcmFtZVxuIik7CiAJCQlnby0+YWN0aXZlX2J1Zi0+b2Zmc2V0IC09IGdvLT5hY3RpdmVfYnVmLT5ieXRlc3VzZWQ7CiAJCQlnby0+YWN0aXZlX2J1Zi0+Ynl0ZXN1c2VkID0gMDsKIAkJCWdvLT5hY3RpdmVfYnVmLT5tb2RldF9hY3RpdmUgPSAwOwpAQCAtNjY4LDcgKzY3MCw3IEBACiAJCWlmIChpMmNfZGVsX2FkYXB0ZXIoJmdvLT5pMmNfYWRhcHRlcikgPT0gMCkKIAkJCWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUgPSAwOwogCQllbHNlCi0JCQl2NGwyX2Vycihnby0+dmlkZW9fZGV2LAorCQkJdjRsMl9lcnIoJmdvLT52NGwyX2RldiwKIAkJCQkiZXJyb3IgcmVtb3ZpbmcgSTJDIGFkYXB0ZXIhXG4iKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaAppbmRleCBjZTkzMDdlLi5iNThjMzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1wcml2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctcHJpdi5oCkBAIC0yMSw2ICsyMSw4IEBACiAgKiB1c2VyLXNwYWNlIGFwcGxpY2F0aW9ucy4KICAqLwogCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKwogc3RydWN0IGdvNzAwNzsKIAogLyogSURzIHRvIGFjdGl2YXRlIGJvYXJkLXNwZWNpZmljIHN1cHBvcnQgY29kZSAqLwpAQCAtMTY3LDYgKzE2OSw3IEBACiAJaW50IGNoYW5uZWxfbnVtYmVyOyAvKiBmb3IgbXVsdGktY2hhbm5lbCBib2FyZHMgbGlrZSBBZGxpbmsgUENJLU1QRzI0ICovCiAJY2hhciBuYW1lWzY0XTsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXY7CisJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwogCWludCByZWZfY291bnQ7CiAJZW51bSB7IFNUQVRVU19JTklULCBTVEFUVVNfT05MSU5FLCBTVEFUVVNfU0hVVERPV04gfSBzdGF0dXM7CiAJc3BpbmxvY2tfdCBzcGlubG9jazsKQEAgLTI0MCw2ICsyNDMsMTEgQEAKIAl1bnNpZ25lZCBzaG9ydCBpbnRlcnJ1cHRfZGF0YTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdvNzAwNyAqdG9fZ283MDA3KHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2NGwyX2Rldiwgc3RydWN0IGdvNzAwNywgdjRsMl9kZXYpOworfQorCiAvKiBBbGwgb2YgdGhlc2UgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaHBpX2xvY2sgbXV0ZXggaGVsZCEgKi8KICNkZWZpbmUgZ283MDA3X2ludGVyZmFjZV9yZXNldChnbykgXAogCQkJKChnbyktPmhwaV9vcHMtPmludGVyZmFjZV9yZXNldChnbykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCmluZGV4IGVjYWEzYzkuLjFlODlkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJLm51bV9pMmNfZGV2cwkgPSAxLAogCQkuaTJjX2RldnMJID0gewogCQkJewotCQkJCS50eXBlCT0gInMyMjUwX2JvYXJkIiwKKwkJCQkudHlwZQk9ICJzMjI1MCIsCiAJCQkJLmlkCT0gSTJDX0RSSVZFUklEX1MyMjUwLAogCQkJCS5hZGRyCT0gMHg0MywKIAkJCX0sCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogCQkJdXNiX3JjdmludHBpcGUodXNiLT51c2JkZXYsIDQpLAogCQkJdXNiLT5pbnRyX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCAyKnNpemVvZih1MTYpLAogCQkJZ283MDA3X3VzYl9yZWFkaW50ZXJydXB0X2NvbXBsZXRlLCBnbywgOCk7Ci0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBnbyk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCAmZ28tPnY0bDJfZGV2KTsKIAogCS8qIEJvb3QgdGhlIEdPNzAwNyAqLwogCWlmIChnbzcwMDdfYm9vdF9lbmNvZGVyKGdvLCBnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJgpAQCAtMTIzMyw3ICsxMjMzLDcgQEAKIAogc3RhdGljIHZvaWQgZ283MDA3X3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCBnbzcwMDcgKmdvID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IHRvX2dvNzAwNyh1c2JfZ2V0X2ludGZkYXRhKGludGYpKTsKIAlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OwogCXN0cnVjdCB1cmIgKnZ1cmIsICphdXJiOwogCWludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCmluZGV4IDRiZDM1M2EuLmIxOGQ4ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpAQCAtNDYsNiArNDcsOSBAQAogI2RlZmluZQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180ICAgMwogI2VuZGlmCiAKKyNkZWZpbmUgY2FsbF9hbGwoZGV2LCBvLCBmLCBhcmdzLi4uKSBcCisJdjRsMl9kZXZpY2VfY2FsbF91bnRpbF9lcnIoZGV2LCAwLCBvLCBmLCAjI2FyZ3MpCisKIHN0YXRpYyB2b2lkIGRlYWN0aXZhdGVfYnVmZmVyKHN0cnVjdCBnbzcwMDdfYnVmZmVyICpnb2J1ZikKIHsKIAlpbnQgaTsKQEAgLTI0NywxOSArMjUxLDIzIEBACiAJCWdvLT5tb2RldF9tYXBbaV0gPSAwOwogCiAJaWYgKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1NDQUxJTkcpIHsKLQkJc3RydWN0IHZpZGVvX2RlY29kZXJfcmVzb2x1dGlvbiByZXM7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCByZXM7CiAKLQkJcmVzLndpZHRoID0gd2lkdGg7CisJCWlmIChmbXQgIT0gTlVMTCkgeworCQkJcmVzID0gKmZtdDsKKwkJfSBlbHNlIHsKKwkJCXJlcy50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkJcmVzLmZtdC5waXgud2lkdGggPSB3aWR0aDsKKwkJfQorCiAJCWlmIChoZWlnaHQgPiBzZW5zb3JfaGVpZ2h0IC8gMikgewotCQkJcmVzLmhlaWdodCA9IGhlaWdodCAvIDI7CisJCQlyZXMuZm10LnBpeC5oZWlnaHQgPSBoZWlnaHQgLyAyOwogCQkJZ28tPmVuY29kZXJfdl9oYWx2ZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlyZXMuaGVpZ2h0ID0gaGVpZ2h0OworCQkJcmVzLmZtdC5waXguaGVpZ2h0ID0gaGVpZ2h0OwogCQkJZ28tPmVuY29kZXJfdl9oYWx2ZSA9IDE7CiAJCX0KLQkJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCURFQ09ERVJfU0VUX1JFU09MVVRJT04sICZyZXMpOworCQljYWxsX2FsbCgmZ28tPnY0bDJfZGV2LCB2aWRlbywgc19mbXQsICZyZXMpOwogCX0gZWxzZSB7CiAJCWlmICh3aWR0aCA8PSBzZW5zb3Jfd2lkdGggLyA0KSB7CiAJCQlnby0+ZW5jb2Rlcl9oX2hhbHZlID0gMTsKQEAgLTM4NSw3ICszOTMsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgbXBlZ19xdWVyeWN0cmwoc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsKQorc3RhdGljIGludCBtcGVnX3F1ZXJ5X2N0cmwoc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsKQogewogCXN0YXRpYyBjb25zdCB1MzIgbXBlZ19jdHJsc1tdID0gewogCQlWNEwyX0NJRF9NUEVHX0NMQVNTLApAQCAtOTczLDUxICs5ODEsMzUgQEAKIAkJCSAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcXVlcnkpCiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSAoKHN0cnVjdCBnbzcwMDdfZmlsZSAqKSBwcml2KS0+Z287CisJaW50IGlkID0gcXVlcnktPmlkOwogCi0JaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoMCA9PSBjYWxsX2FsbCgmZ28tPnY0bDJfZGV2LCBjb3JlLCBxdWVyeWN0cmwsIHF1ZXJ5KSkKKwkJcmV0dXJuIDA7CiAKLQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsIHF1ZXJ5KTsKLQotCXJldHVybiAoIXF1ZXJ5LT5uYW1lWzBdKSA/IG1wZWdfcXVlcnljdHJsKHF1ZXJ5KSA6IDA7CisJcXVlcnktPmlkID0gaWQ7CisJcmV0dXJuIG1wZWdfcXVlcnlfY3RybChxdWVyeSk7CiB9CiAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gKChzdHJ1Y3QgZ283MDA3X2ZpbGUgKikgcHJpdiktPmdvOwotCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKIAotCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJcmV0dXJuIC1FSU87CisJaWYgKDAgPT0gY2FsbF9hbGwoJmdvLT52NGwyX2RldiwgY29yZSwgZ19jdHJsLCBjdHJsKSkKKwkJcmV0dXJuIDA7CiAKLQltZW1zZXQoJnF1ZXJ5LCAwLCBzaXplb2YocXVlcnkpKTsKLQlxdWVyeS5pZCA9IGN0cmwtPmlkOwotCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5KTsKLQlpZiAocXVlcnkubmFtZVswXSA9PSAwKQotCQlyZXR1cm4gbXBlZ19nX2N0cmwoY3RybCwgZ28pOwotCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfQ1RSTCwgY3RybCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gbXBlZ19nX2N0cmwoY3RybCwgZ28pOwogfQogCiBzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9ICgoc3RydWN0IGdvNzAwN19maWxlICopIHByaXYpLT5nbzsKLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcXVlcnk7CiAKLQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCXJldHVybiAtRUlPOworCWlmICgwID09IGNhbGxfYWxsKCZnby0+djRsMl9kZXYsIGNvcmUsIHNfY3RybCwgY3RybCkpCisJCXJldHVybiAwOwogCi0JbWVtc2V0KCZxdWVyeSwgMCwgc2l6ZW9mKHF1ZXJ5KSk7Ci0JcXVlcnkuaWQgPSBjdHJsLT5pZDsKLQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsICZxdWVyeSk7Ci0JaWYgKHF1ZXJ5Lm5hbWVbMF0gPT0gMCkKLQkJcmV0dXJuIG1wZWdfc19jdHJsKGN0cmwsIGdvKTsKLQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0NUUkwsIGN0cmwpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIG1wZWdfc19jdHJsKGN0cmwsIGdvKTsKIH0KIAogc3RhdGljIGludCB2aWRpb2NfZ19wYXJtKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LApAQCAtMTEzNSw4ICsxMTI3LDcgQEAKIAlpZiAoZ28tPnN0cmVhbWluZykKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmICghKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSAmJgotCQkJKnN0ZCAhPSAwKQorCWlmICghKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSAmJiAqc3RkICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCpzdGQgPT0gMCkKQEAgLTExNDYsOSArMTEzNyw3IEBACiAJCQlnby0+aW5wdXQgPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKSB7CiAJCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKIAkJCXJldHVybiAtRUlPOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCVZJRElPQ19TX1NURCwgc3RkKTsKLQkJaWYgKCEqc3RkKSAvKiBoYWNrIHRvIGluZGljYXRlIEVJTlZBTCBmcm9tIHR1bmVyICovCisJCWlmIChjYWxsX2FsbCgmZ28tPnY0bDJfZGV2LCBjb3JlLCBzX3N0ZCwgKnN0ZCkgPCAwKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTY0LDkgKzExNTMsNyBAQAogCX0gZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCVZJRElPQ19TX1NURCwgc3RkKTsKKwljYWxsX2FsbCgmZ28tPnY0bDJfZGV2LCBjb3JlLCBzX3N0ZCwgKnN0ZCk7CiAJc2V0X2NhcHR1cmVfc2l6ZShnbywgTlVMTCwgMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTExODAsNyArMTE2Nyw3IEBACiAJCQlnby0+aW5wdXQgPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKSB7CiAJCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKIAkJCXJldHVybiAtRUlPOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWVNURCwgc3RkKTsKKwkJcmV0dXJuIGNhbGxfYWxsKCZnby0+djRsMl9kZXYsIHZpZGVvLCBxdWVyeXN0ZCwgc3RkKTsKIAl9IGVsc2UgaWYgKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKQogCQkqc3RkID0gVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNOwogCWVsc2UKQEAgLTEyMzgsMTQgKzEyMjUsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJZ28tPmlucHV0ID0gaW5wdXQ7Ci0JaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpIHsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19JTlBVVCwKLQkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2lucHV0XS52aWRlb19pbnB1dCk7Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfQVVESU8sCi0JCQkmZ28tPmJvYXJkX2luZm8tPmlucHV0c1tpbnB1dF0uYXVkaW9faW5wdXQpOwotCX0KIAotCXJldHVybiAwOworCXJldHVybiBjYWxsX2FsbCgmZ28tPnY0bDJfZGV2LCB2aWRlbywgc19yb3V0aW5nLCBpbnB1dCwgMCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMjYwLDEwICsxMjQxLDcgQEAKIAlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCiAJCXJldHVybiAtRUlPOwogCi0JaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19UVU5FUiwgdCk7Ci0KLQl0LT5pbmRleCA9IDA7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNhbGxfYWxsKCZnby0+djRsMl9kZXYsIHR1bmVyLCBnX3R1bmVyLCB0KTsKIH0KIAogc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTEyODcsOSArMTI2NSw3IEBACiAJCWJyZWFrOwogCX0KIAotCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfVFVORVIsIHQpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGNhbGxfYWxsKCZnby0+djRsMl9kZXYsIHR1bmVyLCBzX3R1bmVyLCB0KTsKIH0KIAogc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMzAzLDggKzEyNzksOCBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWYtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX0ZSRVFVRU5DWSwgZik7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gY2FsbF9hbGwoJmdvLT52NGwyX2RldiwgdHVuZXIsIGdfZnJlcXVlbmN5LCBmKTsKIH0KIAogc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMzE3LDkgKzEyOTMsNyBAQAogCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0ZSRVFVRU5DWSwgZik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gY2FsbF9hbGwoJmdvLT52NGwyX2RldiwgdHVuZXIsIHNfZnJlcXVlbmN5LCBmKTsKIH0KIAogc3RhdGljIGludCB2aWRpb2NfY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTE4MjcsNyArMTgwMSw3IEBACiAJZ28tPnZpZGVvX2RldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCWlmIChnby0+dmlkZW9fZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbWNweShnby0+dmlkZW9fZGV2LCAmZ283MDA3X3RlbXBsYXRlLCBzaXplb2YoZ283MDA3X3RlbXBsYXRlKSk7CisJKmdvLT52aWRlb19kZXYgPSBnbzcwMDdfdGVtcGxhdGU7CiAJZ28tPnZpZGVvX2Rldi0+cGFyZW50ID0gZ28tPmRldjsKIAlydiA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShnby0+dmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CiAJaWYgKHJ2IDwgMCkgewpAQCAtMTgzNSw2ICsxODA5LDEyIEBACiAJCWdvLT52aWRlb19kZXYgPSBOVUxMOwogCQlyZXR1cm4gcnY7CiAJfQorCXJ2ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoZ28tPmRldiwgJmdvLT52NGwyX2Rldik7CisJaWYgKHJ2IDwgMCkgeworCQl2aWRlb19kZXZpY2VfcmVsZWFzZShnby0+dmlkZW9fZGV2KTsKKwkJZ28tPnZpZGVvX2RldiA9IE5VTEw7CisJCXJldHVybiBydjsKKwl9CiAJdmlkZW9fc2V0X2RydmRhdGEoZ28tPnZpZGVvX2RldiwgZ28pOwogCSsrZ28tPnJlZl9jb3VudDsKIAlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgdmlkZW8lZCBbdjRsMl1cbiIsCkBAIC0xODU4LDQgKzE4MzgsNSBAQAogCW11dGV4X3VubG9jaygmZ28tPmh3X2xvY2spOwogCWlmIChnby0+dmlkZW9fZGV2KQogCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShnby0+dmlkZW9fZGV2KTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZnby0+djRsMl9kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jCmluZGV4IGY0YTY1NDEuLjhjZjdmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtYm9hcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWJvYXJkLmMKQEAgLTIwLDEwICsyMCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlICJzMjI1MC1sb2FkZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogI2luY2x1ZGUgImdvNzAwNy1wcml2LmgiCi0jaW5jbHVkZSAid2lzLWkyYy5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlNlbnNvcmF5IDIyNTAvMjI1MSBpMmMgdjRsMiBzdWJkZXYgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiAKICNkZWZpbmUgVExWMzIwX0FERFJFU1MgICAgICAweDM0CiAjZGVmaW5lIFZQWDMyMl9BRERSX0FOQUxPR0NPTlRST0wxCTB4MDIKQEAgLTExMiw2ICsxMTYsNyBAQAogfTsKIAogc3RydWN0IHMyMjUwIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CiAJdjRsMl9zdGRfaWQgc3RkOwogCWludCBpbnB1dDsKIAlpbnQgYnJpZ2h0bmVzczsKQEAgLTEyMyw2ICsxMjgsMTEgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqYXVkaW87CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzMjI1MCAqdG9fc3RhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgczIyNTAsIHNkKTsKK30KKwogLyogZnJvbSBnbzcwMDctdXNiLmMgd2hpY2ggaXMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgTWljcm9uYXMgVVNBIEluYy4qLwogc3RhdGljIGludCBnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgcmVxdWVzdCwKIAl1MTYgdmFsdWUsIHUxNiBpbmRleCwgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgbGVuZ3RoLCBpbnQgaW4pCkBAIC0zMDYsMjUzICszMTYsMjYyIEBACiB9CiAKIAotc3RhdGljIGludCBzMjI1MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHMyMjUwX3NfdmlkZW9fcm91dGluZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgaW5wdXQsIHUzMiBvdXRwdXQsCisJCQkJIHUzMiBjb25maWcpCiB7Ci0Jc3RydWN0IHMyMjUwICpkZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgczIyNTAgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlpbnQgdmlkc3lzOwogCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCXsKLQkJaW50IHZpZHN5czsKLQkJaW50ICppbnB1dCA9IGFyZzsKKwl2aWRzeXMgPSAoc3RhdGUtPnN0ZCA9PSBWNEwyX1NURF9OVFNDKSA/IDB4MDEgOiAweDAwOworCWlmIChpbnB1dCA9PSAwKSB7CisJCS8qIGNvbXBvc2l0ZSAqLworCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCAweDAyMCB8IHZpZHN5cyk7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjYyKTsKKwkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwl9IGVsc2UgaWYgKGlucHV0ID09IDEpIHsKKwkJLyogUy1WaWRlbyAqLworCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCAweDA0MCB8IHZpZHN5cyk7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjY2KTsKKwkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3RhdGUtPmlucHV0ID0gaW5wdXQ7CisJcmV0dXJuIDA7Cit9CiAKLQkJdmlkc3lzID0gKGRlYy0+c3RkID09IFY0TDJfU1REX05UU0MpID8gMHgwMSA6IDB4MDA7Ci0JCWlmICgqaW5wdXQgPT0gMCkgewotCQkJLyogY29tcG9zaXRlICovCi0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCAweDAyMCB8IHZpZHN5cyk7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIxLCAweDY2Mik7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOwotCQl9IGVsc2UgewotCQkJLyogUy1WaWRlbyAqLwotCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMCwgMHgwNDAgfCB2aWRzeXMpOwotCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMSwgMHg2NjYpOwotCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKLQkJfQotCQlkZWMtPmlucHV0ID0gKmlucHV0Oworc3RhdGljIGludCBzMjI1MF9zX3N0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBub3JtKQoreworCXN0cnVjdCBzMjI1MCAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXUxNiB2aWRzb3VyY2U7CisKKwl2aWRzb3VyY2UgPSAoc3RhdGUtPmlucHV0ID09IDEpID8gMHgwNDAgOiAweDAyMDsKKwlzd2l0Y2ggKG5vcm0pIHsKKwljYXNlIFY0TDJfU1REX05UU0M6CisJCXdyaXRlX3JlZ3NfZnAoY2xpZW50LCB2aWRfcmVnc19mcCk7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIHZpZHNvdXJjZSB8IDEpOwogCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOwotCQl1MTYgdmlkc291cmNlOwotCi0JCXZpZHNvdXJjZSA9IChkZWMtPmlucHV0ID09IDEpID8gMHgwNDAgOiAweDAyMDsKLQkJZGVjLT5zdGQgPSAqc3RkOwotCQlzd2l0Y2ggKGRlYy0+c3RkKSB7Ci0JCWNhc2UgVjRMMl9TVERfTlRTQzoKLQkJCXdyaXRlX3JlZ3NfZnAoY2xpZW50LCB2aWRfcmVnc19mcCk7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCB2aWRzb3VyY2UgfCAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfU1REX1BBTDoKLQkJCXdyaXRlX3JlZ3NfZnAoY2xpZW50LCB2aWRfcmVnc19mcCk7Ci0JCQl3cml0ZV9yZWdzX2ZwKGNsaWVudCwgdmlkX3JlZ3NfZnBfcGFsKTsKLQkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIHZpZHNvdXJjZSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJY2FzZSBWNEwyX1NURF9QQUw6CisJCXdyaXRlX3JlZ3NfZnAoY2xpZW50LCB2aWRfcmVnc19mcCk7CisJCXdyaXRlX3JlZ3NfZnAoY2xpZW50LCB2aWRfcmVnc19mcF9wYWwpOworCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCB2aWRzb3VyY2UpOwogCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsID0gYXJnOwotCQlzdGF0aWMgY29uc3QgdTMyIHVzZXJfY3RybHNbXSA9IHsKLQkJCVY0TDJfQ0lEX0JSSUdIVE5FU1MsCi0JCQlWNEwyX0NJRF9DT05UUkFTVCwKLQkJCVY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JCQlWNEwyX0NJRF9IVUUsCi0JCQkwCi0JCX07Ci0JCXN0YXRpYyBjb25zdCB1MzIgKmN0cmxfY2xhc3Nlc1tdID0gewotCQkJdXNlcl9jdHJscywKLQkJCU5VTEwKLQkJfTsKLQotCQljdHJsLT5pZCA9IHY0bDJfY3RybF9uZXh0KGN0cmxfY2xhc3NlcywgY3RybC0+aWQpOwotCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJCXY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsIDAsIDEwMCwgMSwgNTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJCXY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsIC01MCwgNTAsIDEsIDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQljdHJsLT5uYW1lWzBdID0gJ1wwJzsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwotCQlpbnQgdmFsdWUxOwotCQl1MTYgb2xkdmFsdWU7Ci0KLQkJc3dpdGNoIChjdHJsLT5pZCkgewotCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCQlpZiAoY3RybC0+dmFsdWUgPiAxMDApCi0JCQkJZGVjLT5icmlnaHRuZXNzID0gMTAwOwotCQkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPCAwKQotCQkJCWRlYy0+YnJpZ2h0bmVzcyA9IDA7Ci0JCQllbHNlCi0JCQkJZGVjLT5icmlnaHRuZXNzID0gY3RybC0+dmFsdWU7Ci0JCQl2YWx1ZTEgPSAoZGVjLT5icmlnaHRuZXNzIC0gNTApICogMjU1IC8gMTAwOwotCQkJcmVhZF9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9CUklHSFRORVNTMCwgJm9sZHZhbHVlKTsKLQkJCXdyaXRlX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0JSSUdIVE5FU1MwLAotCQkJCSAgICAgdmFsdWUxIHwgKG9sZHZhbHVlICYgfjB4ZmYpKTsKLQkJCXJlYWRfcmVnX2ZwKGNsaWVudCwgVlBYMzIyX0FERFJfQlJJR0hUTkVTUzEsICZvbGR2YWx1ZSk7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9CUklHSFRORVNTMSwKLQkJCQkgICAgIHZhbHVlMSB8IChvbGR2YWx1ZSAmIH4weGZmKSk7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHg2MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJCWlmIChjdHJsLT52YWx1ZSA+IDEwMCkKLQkJCQlkZWMtPmNvbnRyYXN0ID0gMTAwOwotCQkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPCAwKQotCQkJCWRlYy0+Y29udHJhc3QgPSAwOwotCQkJZWxzZQotCQkJCWRlYy0+Y29udHJhc3QgPSBjdHJsLT52YWx1ZTsKLQkJCXZhbHVlMSA9IGRlYy0+Y29udHJhc3QgKiAweDQwIC8gMTAwOwotCQkJaWYgKHZhbHVlMSA+IDB4M2YpCi0JCQkJdmFsdWUxID0gMHgzZjsgLyogbWF4ICovCi0JCQlyZWFkX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0NPTlRSQVNUMCwgJm9sZHZhbHVlKTsKLQkJCXdyaXRlX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0NPTlRSQVNUMCwKLQkJCQkgICAgIHZhbHVlMSB8IChvbGR2YWx1ZSAmIH4weDNmKSk7Ci0JCQlyZWFkX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0NPTlRSQVNUMSwgJm9sZHZhbHVlKTsKLQkJCXdyaXRlX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0NPTlRSQVNUMSwKLQkJCQkgICAgIHZhbHVlMSB8IChvbGR2YWx1ZSAmIH4weDNmKSk7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHg2MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQkJaWYgKGN0cmwtPnZhbHVlID4gMTI3KQotCQkJCWRlYy0+c2F0dXJhdGlvbiA9IDEyNzsKLQkJCWVsc2UgaWYgKGN0cmwtPnZhbHVlIDwgMCkKLQkJCQlkZWMtPnNhdHVyYXRpb24gPSAwOwotCQkJZWxzZQotCQkJCWRlYy0+c2F0dXJhdGlvbiA9IGN0cmwtPnZhbHVlOwotCi0JCQl2YWx1ZTEgPSBkZWMtPnNhdHVyYXRpb24gKiA0MTQwIC8gMTAwOwotCQkJaWYgKHZhbHVlMSA+IDQwOTQpCi0JCQkJdmFsdWUxID0gNDA5NDsKLQkJCXdyaXRlX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX1NBVCwgdmFsdWUxKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJCWlmIChjdHJsLT52YWx1ZSA+IDUwKQotCQkJCWRlYy0+aHVlID0gNTA7Ci0JCQllbHNlIGlmIChjdHJsLT52YWx1ZSA8IC01MCkKLQkJCQlkZWMtPmh1ZSA9IC01MDsKLQkJCWVsc2UKLQkJCQlkZWMtPmh1ZSA9IGN0cmwtPnZhbHVlOwotCQkJLyogY2xhbXAgdGhlIGh1ZSByYW5nZSAqLwotCQkJdmFsdWUxID0gZGVjLT5odWUgKiAyODAgLyA1MDsKLQkJCXdyaXRlX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0hVRSwgdmFsdWUxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19HX0NUUkw6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwotCi0JCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQkJY3RybC0+dmFsdWUgPSBkZWMtPmJyaWdodG5lc3M7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJCWN0cmwtPnZhbHVlID0gZGVjLT5jb250cmFzdDsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCQljdHJsLT52YWx1ZSA9IGRlYy0+c2F0dXJhdGlvbjsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJCWN0cmwtPnZhbHVlID0gZGVjLT5odWU7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKLQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPCA2NDApIHsKLQkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTJiLCBkZWMtPnJlZzEyYl92YWwgfCAweDQwMCk7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOwotCQl9IGVsc2UgewotCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxMmIsIGRlYy0+cmVnMTJiX3ZhbCAmIH4weDQwMCk7Ci0JCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19HX0FVRElPOgotCXsKLQkJc3RydWN0IHY0bDJfYXVkaW8gKmF1ZGlvID0gYXJnOwotCi0JCW1lbXNldChhdWRpbywgMCwgc2l6ZW9mKCphdWRpbykpOwotCQlhdWRpby0+aW5kZXggPSBkZWMtPmF1ZGlvX2lucHV0OwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQl9Ci0JY2FzZSBWSURJT0NfRU5VTUFVRElPOgotCXsKLQkJc3RydWN0IHY0bDJfYXVkaW8gKmF1ZGlvID0gYXJnOwotCi0JCXN3aXRjaCAoYXVkaW8tPmluZGV4KSB7Ci0JCWNhc2UgMDoKLQkJCXN0cmNweShhdWRpby0+bmFtZSwgIkxpbmUgSW4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlzdHJjcHkoYXVkaW8tPm5hbWUsICJNaWMiKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlzdHJjcHkoYXVkaW8tPm5hbWUsICJNaWMgQm9vc3QiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYXVkaW8tPm5hbWVbMF0gPSAnXDAnOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYXVkaW8tPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87Ci0JCWF1ZGlvLT5tb2RlID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfQVVESU86Ci0JewotCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8gPSBhcmc7Ci0KLQkJc3dpdGNoIChhdWRpby0+aW5kZXgpIHsKLQkJY2FzZSAwOgotCQkJd3JpdGVfcmVnKGRlYy0+YXVkaW8sIDB4MDgsIDB4MDIpOyAvKiBMaW5lIEluICovCi0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJd3JpdGVfcmVnKGRlYy0+YXVkaW8sIDB4MDgsIDB4MDQpOyAvKiBNaWMgKi8KLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQl3cml0ZV9yZWcoZGVjLT5hdWRpbywgMHgwOCwgMHgwNSk7IC8qIE1pYyBCb29zdCAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlkZWMtPmF1ZGlvX2lucHV0ID0gYXVkaW8tPmluZGV4OwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJzMjI1MDogdW5rbm93biBjb21tYW5kIDB4JXhcbiIsIGNtZCk7Ci0JCWJyZWFrOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3RhdGUtPnN0ZCA9IG5vcm07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczIyNTBfcXVlcnljdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcXVlcnkpCit7CisJc3dpdGNoIChxdWVyeS0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxdWVyeSwgMCwgMTAwLCAxLCA1MCk7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHF1ZXJ5LCAwLCAxMDAsIDEsIDUwKTsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxdWVyeSwgMCwgMTAwLCAxLCA1MCk7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxdWVyeSwgLTUwLCA1MCwgMSwgMCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHMyMjUwX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBzMjI1MCAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCWludCB2YWx1ZTE7CisJdTE2IG9sZHZhbHVlOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJaWYgKGN0cmwtPnZhbHVlID4gMTAwKQorCQkJc3RhdGUtPmJyaWdodG5lc3MgPSAxMDA7CisJCWVsc2UgaWYgKGN0cmwtPnZhbHVlIDwgMCkKKwkJCXN0YXRlLT5icmlnaHRuZXNzID0gMDsKKwkJZWxzZQorCQkJc3RhdGUtPmJyaWdodG5lc3MgPSBjdHJsLT52YWx1ZTsKKwkJdmFsdWUxID0gKHN0YXRlLT5icmlnaHRuZXNzIC0gNTApICogMjU1IC8gMTAwOworCQlyZWFkX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0JSSUdIVE5FU1MwLCAmb2xkdmFsdWUpOworCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9CUklHSFRORVNTMCwKKwkJCSAgICAgdmFsdWUxIHwgKG9sZHZhbHVlICYgfjB4ZmYpKTsKKwkJcmVhZF9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9CUklHSFRORVNTMSwgJm9sZHZhbHVlKTsKKwkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgVlBYMzIyX0FERFJfQlJJR0hUTkVTUzEsCisJCQkgICAgIHZhbHVlMSB8IChvbGR2YWx1ZSAmIH4weGZmKSk7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDYwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJaWYgKGN0cmwtPnZhbHVlID4gMTAwKQorCQkJc3RhdGUtPmNvbnRyYXN0ID0gMTAwOworCQllbHNlIGlmIChjdHJsLT52YWx1ZSA8IDApCisJCQlzdGF0ZS0+Y29udHJhc3QgPSAwOworCQllbHNlCisJCQlzdGF0ZS0+Y29udHJhc3QgPSBjdHJsLT52YWx1ZTsKKwkJdmFsdWUxID0gc3RhdGUtPmNvbnRyYXN0ICogMHg0MCAvIDEwMDsKKwkJaWYgKHZhbHVlMSA+IDB4M2YpCisJCQl2YWx1ZTEgPSAweDNmOyAvKiBtYXggKi8KKwkJcmVhZF9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9DT05UUkFTVDAsICZvbGR2YWx1ZSk7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0NPTlRSQVNUMCwKKwkJCSAgICAgdmFsdWUxIHwgKG9sZHZhbHVlICYgfjB4M2YpKTsKKwkJcmVhZF9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9DT05UUkFTVDEsICZvbGR2YWx1ZSk7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIFZQWDMyMl9BRERSX0NPTlRSQVNUMSwKKwkJCSAgICAgdmFsdWUxIHwgKG9sZHZhbHVlICYgfjB4M2YpKTsKKwkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4NjApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCWlmIChjdHJsLT52YWx1ZSA+IDEwMCkKKwkJCXN0YXRlLT5zYXR1cmF0aW9uID0gMTAwOworCQllbHNlIGlmIChjdHJsLT52YWx1ZSA8IDApCisJCQlzdGF0ZS0+c2F0dXJhdGlvbiA9IDA7CisJCWVsc2UKKwkJCXN0YXRlLT5zYXR1cmF0aW9uID0gY3RybC0+dmFsdWU7CisJCXZhbHVlMSA9IHN0YXRlLT5zYXR1cmF0aW9uICogNDE0MCAvIDEwMDsKKwkJaWYgKHZhbHVlMSA+IDQwOTQpCisJCQl2YWx1ZTEgPSA0MDk0OworCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9TQVQsIHZhbHVlMSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQlpZiAoY3RybC0+dmFsdWUgPiA1MCkKKwkJCXN0YXRlLT5odWUgPSA1MDsKKwkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPCAtNTApCisJCQlzdGF0ZS0+aHVlID0gLTUwOworCQllbHNlCisJCQlzdGF0ZS0+aHVlID0gY3RybC0+dmFsdWU7CisJCS8qIGNsYW1wIHRoZSBodWUgcmFuZ2UgKi8KKwkJdmFsdWUxID0gc3RhdGUtPmh1ZSAqIDI4MCAvIDUwOworCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9IVUUsIHZhbHVlMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzMjI1MF9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgczIyNTAgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+YnJpZ2h0bmVzczsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+Y29udHJhc3Q7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+c2F0dXJhdGlvbjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWN0cmwtPnZhbHVlID0gc3RhdGUtPmh1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMyMjUwX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBzMjI1MCAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPCA2NDApIHsKKwkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxMmIsIHN0YXRlLT5yZWcxMmJfdmFsIHwgMHg0MDApOworCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOworCX0gZWxzZSB7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTJiLCBzdGF0ZS0+cmVnMTJiX3ZhbCAmIH4weDQwMCk7CisJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMyMjUwX3NfYXVkaW9fcm91dGluZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgaW5wdXQsIHUzMiBvdXRwdXQsCisJCQkJIHUzMiBjb25maWcpCit7CisJc3RydWN0IHMyMjUwICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCXN3aXRjaCAoaW5wdXQpIHsKKwljYXNlIDA6CisJCXdyaXRlX3JlZyhzdGF0ZS0+YXVkaW8sIDB4MDgsIDB4MDIpOyAvKiBMaW5lIEluICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJd3JpdGVfcmVnKHN0YXRlLT5hdWRpbywgMHgwOCwgMHgwNCk7IC8qIE1pYyAqLworCQlicmVhazsKKwljYXNlIDI6CisJCXdyaXRlX3JlZyhzdGF0ZS0+YXVkaW8sIDB4MDgsIDB4MDUpOyAvKiBNaWMgQm9vc3QgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN0YXRlLT5hdWRpb19pbnB1dCA9IGlucHV0OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgczIyNTBfbG9nX3N0YXR1cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBzMjI1MCAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwl2NGwyX2luZm8oc2QsICJTdGFuZGFyZDogJXNcbiIsIHN0YXRlLT5zdGQgPT0gVjRMMl9TVERfTlRTQyA/ICJOVFNDIiA6CisJCQkJCXN0YXRlLT5zdGQgPT0gVjRMMl9TVERfUEFMID8gIlBBTCIgOgorCQkJCQlzdGF0ZS0+c3RkID09IFY0TDJfU1REX1NFQ0FNID8gIlNFQ0FNIiA6CisJCQkJCSJ1bmtub3duIik7CisJdjRsMl9pbmZvKHNkLCAiSW5wdXQ6ICVzXG4iLCBzdGF0ZS0+aW5wdXQgPT0gMCA/ICJDb21wb3NpdGUiIDoKKwkJCQkJc3RhdGUtPmlucHV0ID09IDEgPyAiUy12aWRlbyIgOgorCQkJCQkiZXJyb3IiKTsKKwl2NGwyX2luZm8oc2QsICJCcmlnaHRuZXNzOiAlZFxuIiwgc3RhdGUtPmJyaWdodG5lc3MpOworCXY0bDJfaW5mbyhzZCwgIkNvbnRyYXN0OiAlZFxuIiwgc3RhdGUtPmNvbnRyYXN0KTsKKwl2NGwyX2luZm8oc2QsICJTYXR1cmF0aW9uOiAlZFxuIiwgc3RhdGUtPnNhdHVyYXRpb24pOworCXY0bDJfaW5mbyhzZCwgIkh1ZTogJWRcbiIsIHN0YXRlLT5odWUpOwlyZXR1cm4gMDsKKwl2NGwyX2luZm8oc2QsICJBdWRpbyBpbnB1dDogJXNcbiIsIHN0YXRlLT5hdWRpb19pbnB1dCA9PSAwID8gIkxpbmUgSW4iIDoKKwkJCQkJc3RhdGUtPmF1ZGlvX2lucHV0ID09IDEgPyAiTWljIiA6CisJCQkJCXN0YXRlLT5hdWRpb19pbnB1dCA9PSAyID8gIk1pYyBCb29zdCIgOgorCQkJCQkiZXJyb3IiKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHMyMjUwX2NvcmVfb3BzID0geworCS5sb2dfc3RhdHVzID0gczIyNTBfbG9nX3N0YXR1cywKKwkuZ19jdHJsID0gczIyNTBfZ19jdHJsLAorCS5zX2N0cmwgPSBzMjI1MF9zX2N0cmwsCisJLnF1ZXJ5Y3RybCA9IHMyMjUwX3F1ZXJ5Y3RybCwKKwkuc19zdGQgPSBzMjI1MF9zX3N0ZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfYXVkaW9fb3BzIHMyMjUwX2F1ZGlvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gczIyNTBfc19hdWRpb19yb3V0aW5nLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgczIyNTBfdmlkZW9fb3BzID0geworCS5zX3JvdXRpbmcgPSBzMjI1MF9zX3ZpZGVvX3JvdXRpbmcsCisJLnNfZm10ID0gczIyNTBfc19mbXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzMjI1MF9vcHMgPSB7CisJLmNvcmUgPSAmczIyNTBfY29yZV9vcHMsCisJLmF1ZGlvID0gJnMyMjUwX2F1ZGlvX29wcywKKwkudmlkZW8gPSAmczIyNTBfdmlkZW9fb3BzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiBzdGF0aWMgaW50IHMyMjUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmF1ZGlvOwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKLQlzdHJ1Y3QgczIyNTAgKmRlYzsKKwlzdHJ1Y3QgczIyNTAgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAJdTggKmRhdGE7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOwogCXN0cnVjdCBnbzcwMDdfdXNiICp1c2IgPSBnby0+aHBpX2NvbnRleHQ7CkBAIC01NjEsMzAgKzU4MCwzMSBAQAogCWlmIChhdWRpbyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzMjI1MCksIEdGUF9LRVJORUwpOwotCWlmIChkZWMgPT0gTlVMTCkgeworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHMyMjUwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpIHsKIAkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGF1ZGlvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZGVjLT5zdGQgPSBWNEwyX1NURF9OVFNDOwotCWRlYy0+YnJpZ2h0bmVzcyA9IDUwOwotCWRlYy0+Y29udHJhc3QgPSA1MDsKLQlkZWMtPnNhdHVyYXRpb24gPSA1MDsKLQlkZWMtPmh1ZSA9IDA7Ci0JZGVjLT5hdWRpbyA9IGF1ZGlvOwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRlYyk7CisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZzMjI1MF9vcHMpOwogCi0JcHJpbnRrKEtFUk5fREVCVUcKLQkgICAgICAgInMyMjUwOiBpbml0aWFsaXppbmcgdmlkZW8gZGVjb2RlciBvbiAlc1xuIiwKLQkgICAgICAgYWRhcHRlci0+bmFtZSk7CisJdjRsMl9pbmZvKHNkLCAiaW5pdGlhbGl6aW5nICVzIGF0IGFkZHJlc3MgMHgleCBvbiAlc1xuIiwKKwkgICAgICAgIlNlbnNvcmF5IDIyNTAvMjI1MSIsIGNsaWVudC0+YWRkciwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKworCXN0YXRlLT5zdGQgPSBWNEwyX1NURF9OVFNDOworCXN0YXRlLT5icmlnaHRuZXNzID0gNTA7CisJc3RhdGUtPmNvbnRyYXN0ID0gNTA7CisJc3RhdGUtPnNhdHVyYXRpb24gPSA1MDsKKwlzdGF0ZS0+aHVlID0gMDsKKwlzdGF0ZS0+YXVkaW8gPSBhdWRpbzsKIAogCS8qIGluaXRpYWxpemUgdGhlIGF1ZGlvICovCiAJaWYgKHdyaXRlX3JlZ3MoYXVkaW8sIGF1ZF9yZWdzKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiczIyNTA6IGVycm9yIGluaXRpYWxpemluZyBhdWRpb1xuIik7CiAJCWkyY191bnJlZ2lzdGVyX2RldmljZShhdWRpbyk7Ci0JCWtmcmVlKGRlYyk7CisJCWtmcmVlKHN0YXRlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01OTIsMTQgKzYxMiwxNCBAQAogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJzMjI1MDogZXJyb3IgaW5pdGlhbGl6aW5nIGRlY29kZXJcbiIpOwogCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoYXVkaW8pOwotCQlrZnJlZShkZWMpOworCQlrZnJlZShzdGF0ZSk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAod3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiczIyNTA6IGVycm9yIGluaXRpYWxpemluZyBkZWNvZGVyXG4iKTsKIAkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGF1ZGlvKTsKLQkJa2ZyZWUoZGVjKTsKKwkJa2ZyZWUoc3RhdGUpOwogCQlyZXR1cm4gMDsKIAl9CiAJLyogc2V0IGRlZmF1bHQgY2hhbm5lbCAqLwpAQCAtNjA5LDcgKzYyOSw3IEBACiAJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKIAogCS8qIHNldCBkZWZhdWx0IGF1ZGlvIGlucHV0ICovCi0JZGVjLT5hdWRpb19pbnB1dCA9IDA7CisJc3RhdGUtPmF1ZGlvX2lucHV0ID0gMDsKIAl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDAyKTsgLyogTGluZSBJbiAqLwogCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdXNiLT5pMmNfbG9jaykgPT0gMCkgewpAQCAtNjM0LDYwICs2NTQsMjggQEAKIAkJbXV0ZXhfdW5sb2NrKCZ1c2ItPmkyY19sb2NrKTsKIAl9CiAKLQlwcmludGsoInMyMjUwOiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcbiIpOworCXY0bDJfaW5mbyhzZCwgImluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgczIyNTBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IHMyMjUwICpkZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKLQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoZGVjLT5hdWRpbyk7Ci0Ja2ZyZWUoZGVjKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJa2ZyZWUodG9fc3RhdGUoc2QpKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHMyMjUwX2lkW10gPSB7Ci0JeyAiczIyNTBfYm9hcmQiLCAwIH0sCisJeyAiczIyNTAiLCAwIH0sCiAJeyB9CiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHMyMjUwX2lkKTsKIAotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHMyMjUwX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJTZW5zb3JheSAyMjUwIGJvYXJkIGRyaXZlciIsCi0JfSwKLQkucHJvYmUJCT0gczIyNTBfcHJvYmUsCi0JLnJlbW92ZQkJPSBzMjI1MF9yZW1vdmUsCi0JLmNvbW1hbmQJPSBzMjI1MF9jb21tYW5kLAotCS5pZF90YWJsZQk9IHMyMjUwX2lkLAorc3RhdGljIHN0cnVjdCB2NGwyX2kyY19kcml2ZXJfZGF0YSB2NGwyX2kyY19kYXRhID0geworCS5uYW1lID0gInMyMjUwIiwKKwkucHJvYmUgPSBzMjI1MF9wcm9iZSwKKwkucmVtb3ZlID0gczIyNTBfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHMyMjUwX2lkLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgczIyNTBfaW5pdCh2b2lkKQotewotCWludCByOwotCi0JciA9IHMyMjUwbG9hZGVyX2luaXQoKTsKLQlpZiAociA8IDApCi0JCXJldHVybiByOwotCi0JciA9IGkyY19hZGRfZHJpdmVyKCZzMjI1MF9kcml2ZXIpOwotCWlmIChyIDwgMCkKLQkJczIyNTBsb2FkZXJfY2xlYW51cCgpOwotCi0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzMjI1MF9jbGVhbnVwKHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJnMyMjUwX2RyaXZlcik7Ci0KLQlzMjI1MGxvYWRlcl9jbGVhbnVwKCk7Ci19Ci0KLW1vZHVsZV9pbml0KHMyMjUwX2luaXQpOwotbW9kdWxlX2V4aXQoczIyNTBfY2xlYW51cCk7Ci0KLU1PRFVMRV9BVVRIT1IoIiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCb2FyZCBkcml2ZXIgZm9yIFNlbnNvcnlyYXkgMjI1MCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtbG9hZGVyLmMKaW5kZXggZDdiZjgyOS4uYzE1MmFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWxvYWRlci5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkuaWRfdGFibGUJPSBzMjI1MGxvYWRlcl9pZHMsCiB9OwogCi1pbnQgczIyNTBsb2FkZXJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgczIyNTBsb2FkZXJfaW5pdCh2b2lkKQogewogCWludCByOwogCXVuc2lnbmVkIGkgPSAwOwpAQCAtMTc5LDExICsxNzksMTUgQEAKIAlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9pbml0OiBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHMyMjUwbG9hZGVyX2luaXQpOworbW9kdWxlX2luaXQoczIyNTBsb2FkZXJfaW5pdCk7CiAKLXZvaWQgczIyNTBsb2FkZXJfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHMyMjUwbG9hZGVyX2NsZWFudXAodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9jbGVhbnVwXG4iKTsKIAl1c2JfZGVyZWdpc3RlcigmczIyNTBsb2FkZXJfZHJpdmVyKTsKIH0KLUVYUE9SVF9TWU1CT0woczIyNTBsb2FkZXJfY2xlYW51cCk7Cittb2R1bGVfZXhpdChzMjI1MGxvYWRlcl9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImZpcm13YXJlIGxvYWRlciBmb3IgU2Vuc29yYXkgMjI1MC8yMjUxIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmaS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaAppbmRleCBhMzViZDVkLi42MGI3ZDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlICIuLi9vYWxfZHQuaCIKIAogLyoqKioqIFNlY3Rpb24gMSA6IFR1bmFibGUgUGFyYW1ldGVycyAqKioqKi8KLS8qIFRoZSBkZWZpbnRpb25zIGluIHRoaXMgc2VjdGlvbiBhcmUgdHVuYWJlbCBwYXJhbWV0ZXJzICovCisvKiBUaGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGFyZSB0dW5hYmVsIHBhcmFtZXRlcnMgKi8KIAogLyogTWF4aW11bSBudW1iZXIgb2YgQlNTIHRoYXQgY291bGQgYmUgc2NhbmVkICovCiAjZGVmaW5lIFpNX01BWF9CU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvemRjb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkY29tcGF0LmgKaW5kZXggODRhYzQzMy4uY2RjYWVmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvemRjb21wYXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZGNvbXBhdC5oCkBAIC0xNyw3ICsxNyw3IEBACiAvKiAgTW9kdWxlIE5hbWUgOiB6ZGNvbXBhdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb24gZGVmaW50aW9uIGZvciBjb21wYXRpYmlsaXR5LiAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIGNvbXBhdGliaWxpdHkuICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaAppbmRleCA4MjE2ZDdlLi4zNWVkNjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCkBAIC01MjEsNyArNTIxLDcgQEAKIAkvL3UzMiBOdW1UeE9rSW5QZXJpb2Q7ICAgLy9ZSixkZWwsMDgwODI4CiAJdTggICBUeFBvbGxpbmdUaW1lczsKIAotCWJvb2wJYkFwQnVmT3VyRnJhbWU7Ly8gVFJVRSBpZiBBUCBidWZmZXIgb3VyIHVuaWNhc3QgZGF0YSAsIHdlIHdpbGwga2VlcCBlQXdha2UgdW50aWxsIHJlY2VpdmUgZGF0YSBvciB0aW1lb3V0LgorCWJvb2wJYkFwQnVmT3VyRnJhbWU7Ly8gVFJVRSBpZiBBUCBidWZmZXIgb3VyIHVuaWNhc3QgZGF0YSAsIHdlIHdpbGwga2VlcCBlQXdha2UgdW50aWwgcmVjZWl2ZSBkYXRhIG9yIHRpbWVvdXQuCiAJdTgJV2FpdEJ1ZkRhdGFCY25Db3VudDsKIAl1OAlXYWl0QnVmRGF0YVRpbWVPdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKaW5kZXggOTZjN2NmYS4uYWNmNjQ0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKQEAgLTM4LDcgKzM4LDcgQEAKIC8vIDIuIDB4ODAwLzB4OTAwLzB4QTAwLzB4QzAwLzB4RDAwLzB4RTAwCiAvLyAzLiBSRiByZWdpc3RlciAweDAwLTJFCiAvLyA0LiBCaXQgTWFzayBmb3IgQkIvUkYgcmVnaXN0ZXIKLS8vIDUuIE90aGVyIGRlZmludGlvbiBmb3IgQkIvUkYgUi9XCisvLyA1LiBPdGhlciBkZWZpbml0aW9uIGZvciBCQi9SRiBSL1cKIC8vCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dhdmVsYW4vd2F2ZWxhbl9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dhdmVsYW4vd2F2ZWxhbl9jcy5jCmluZGV4IDMzOTE4ZmQuLjEwYzcwMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93YXZlbGFuL3dhdmVsYW5fY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2F2ZWxhbi93YXZlbGFuX2NzLmMKQEAgLTM5ODcsNyArMzk4Nyw3IEBACiAjZW5kaWYKIAogICAvKiBQcmV2ZW50IHJlZW50cmFuY3kuIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIHdlIG1heSBoYXZlCi0gICAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VyZW50bHkuCisgICAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VycmVudGx5LgogICAgKiBJdCBpcyBzYWZlIGJlY2F1c2UgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYmVmb3JlIGFxdWlyaW5nCiAgICAqIHRoZSBzcGlubG9jay4gKi8KICAgc3Bpbl9sb2NrKCZscC0+c3BpbmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMgYi9kcml2ZXJzL3RlbGVwaG9ueS9peGouYwppbmRleCA0MGRlMTUxLi5lODkzMDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouYworKysgYi9kcml2ZXJzL3RlbGVwaG9ueS9peGouYwpAQCAtNDE5MCw3ICs0MTkwLDcgQEAKIAkJCQlpeGpfV3JpdGVEU1BDb21tYW5kKDB4MTIyNCwgaik7CiAKIAkJCWl4al9Xcml0ZURTUENvbW1hbmQoMHhFMDE0LCBqKTsKLQkJCWl4al9Xcml0ZURTUENvbW1hbmQoMHgwMDAzLCBqKTsJLyogTG9jayB0aHJlYXNob2xkIGF0IDNkQiAqLworCQkJaXhqX1dyaXRlRFNQQ29tbWFuZCgweDAwMDMsIGopOwkvKiBMb2NrIHRocmVzaG9sZCBhdCAzZEIgKi8KIAogCQkJaXhqX1dyaXRlRFNQQ29tbWFuZCgweEUzMzgsIGopOwkvKiBTZXQgRWNobyBTdXBwcmVzc2VyIEF0dGVudWF0aW9uIHRvIDBkQiAqLwogCkBAIC00MjM1LDcgKzQyMzUsNyBAQAogCQkJCWl4al9Xcml0ZURTUENvbW1hbmQoMHgxMjI0LCBqKTsKIAogCQkJaXhqX1dyaXRlRFNQQ29tbWFuZCgweEUwMTQsIGopOwotCQkJaXhqX1dyaXRlRFNQQ29tbWFuZCgweDAwMDMsIGopOwkvKiBMb2NrIHRocmVhc2hvbGQgYXQgM2RCICovCisJCQlpeGpfV3JpdGVEU1BDb21tYW5kKDB4MDAwMywgaik7CS8qIExvY2sgdGhyZXNob2xkIGF0IDNkQiAqLwogCiAJCQlpeGpfV3JpdGVEU1BDb21tYW5kKDB4RTMzOCwgaik7CS8qIFNldCBFY2hvIFN1cHByZXNzZXIgQXR0ZW51YXRpb24gdG8gMGRCICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IGQxNzFiNTYuLmJiYTRkM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtMTk1OCw3ICsxOTU4LDcgQEAKIAkJZ290byBiYWQxOwogCiAJLyogRklYTUUgOiBBREk5MzAgcmVwbHkgd3JvbmcgcHJlYW1idWxlIChmdW5jID0gMiwgc3ViID0gMikgdG8KLQkgKiB0aGUgZmlyc3QgTUVNQUNFU1MgY212LiBJZ25vcmUgaXQuLi4KKwkgKiB0aGUgZmlyc3QgTUVNQUNDRVNTIGNtdi4gSWdub3JlIGl0Li4uCiAJICovCiAJaWYgKGNtdi0+YkZ1bmN0aW9uICE9IGRzYy0+ZnVuY3Rpb24pIHsKIAkJaWYgKFVFQV9DSElQX1ZFUlNJT04oc2MpID09IEFESTkzMApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwppbmRleCAyNDczY2YwLi5iNGJkMjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMgLSBVU0IgVGVzdCAmIE1lYXN1cm1lbnQgY2xhc3MgZHJpdmVyCisgKiBkcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYyAtIFVTQiBUZXN0ICYgTWVhc3VyZW1lbnQgY2xhc3MgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA3IFN0ZWZhbiBLb3BwLCBHZWNoaW5nZW4sIEdlcm1hbnkKICAqIENvcHlyaWdodCAoQykgMjAwOCBOb3ZlbGwsIEluYy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggZGE3MThlOC4uZTgwZjFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTE4OTAsNyArMTg5MCw3IEBACiAgKiByb3V0aW5lIGdldHMgYXJvdW5kIHRoZSBub3JtYWwgcmVzdHJpY3Rpb25zIGJ5IHVzaW5nIGEgd29yayB0aHJlYWQgdG8KICAqIHN1Ym1pdCB0aGUgY2hhbmdlLWNvbmZpZyByZXF1ZXN0LgogICoKLSAqIFJldHVybnMgMCBpZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2VzZnVsbHkgcXVldWVkLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqIFJldHVybnMgMCBpZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZCwgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAgKiBUaGUgY2FsbGVyIGhhcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIHRoZSBxdWV1ZWQgcmVxdWVzdCB3aWxsIGV2ZW50dWFsbHkKICAqIHN1Y2NlZWQuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYWNtLmMKaW5kZXggNzk1Mzk0OC4uNGUzNjU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYWNtLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYWNtLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogICogQGxlbmd0aDogc2l6ZSBvZiBkYXRhCiAgKiBDb250ZXh0OiBpcnFzIGJsb2NrZWQsIGFjbS0+bG9jayBoZWxkLCBhY21fbm90aWZ5X3JlcSBub24tbnVsbAogICoKLSAqIFJldHVybnMgemVybyBvbiBzdWNlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJuby4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8uCiAgKgogICogU2VlIHNlY3Rpb24gNi4zLjUgb2YgdGhlIENEQyAxLjEgc3BlY2lmaWNhdGlvbiBmb3IgaW5mb3JtYXRpb24KICAqIGFib3V0IHRoZSBvbmx5IG5vdGlmaWNhdGlvbiB3ZSBpc3N1ZTogIFNlcmlhbFN0YXRlIGNoYW5nZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCmluZGV4IDE5MzdkOGMuLmFkZGExMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYwpAQCAtMTUyNCw3ICsxNTI0LDcgQEAKICAqIHB4YV91ZGNfd2FrZXVwIC0gRm9yY2UgdWRjIGRldmljZSBvdXQgb2Ygc3VzcGVuZAogICogQF9nYWRnZXQ6IHVzYiBnYWRnZXQKICAqCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2VzZnVsbCwgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsbCwgZXJyb3IgY29kZSBvdGhlcndpc2UKICAqLwogc3RhdGljIGludCBweGFfdWRjX3dha2V1cChzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCBmNWY1NjAxLi5kOGY0YWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAlpZiAoZXJyb3IpIHsKIAkJZWhjaV9oYWx0KGVoY2kpOwogCQllaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOwotCQllaGNpX2VycihlaGNpLCAiZm9yY2UgaGFsdDsgaGFuZGhha2UgJXAgJTA4eCAlMDh4IC0+ICVkXG4iLAorCQllaGNpX2VycihlaGNpLCAiZm9yY2UgaGFsdDsgaGFuZHNoYWtlICVwICUwOHggJTA4eCAtPiAlZFxuIiwKIAkJCXB0ciwgbWFzaywgZG9uZSwgZXJyb3IpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9maGNpLXNjaGVkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktc2NoZWQuYwppbmRleCA2MmEyMjZiLi4wMGEyOTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktc2NoZWQuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktc2NoZWQuYwpAQCAtNjI3LDcgKzYyNyw3IEBACiAKIAogLyoKLSAqIFByb2Nlc3Mgbm9ybWFsIGNvbXBsZXRpb25zKGVycm9yIG9yIHN1Y2VzcykgYW5kIGNsZWFuIHRoZSBzY2hlZHVsZS4KKyAqIFByb2Nlc3Mgbm9ybWFsIGNvbXBsZXRpb25zKGVycm9yIG9yIHN1Y2Nlc3MpIGFuZCBjbGVhbiB0aGUgc2NoZWR1bGUuCiAgKgogICogVGhpcyBpcyB0aGUgbWFpbiBwYXRoIGZvciBoYW5kaW5nIHVyYnMgYmFjayB0byBkcml2ZXJzLiBUaGUgb25seSBvdGhlciBwYXR0aAogICogaXMgcHJvY2Vzc19kZWxfbGlzdCgpLHdoaWNoIHVubGlua3MgVVJCcyBieSBzY2FubmluZyBFRHMsaW5zdGVhZCBvZiBzY2FubmluZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvY3J5cHRvLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9jcnlwdG8uYwppbmRleCA5ZWM3ZmQ1Li45NTc5Y2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9jcnlwdG8uYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9jcnlwdG8uYwpAQCAtMTExLDcgKzExMSw3IEBACiAgKgogICogQ0NNIHVzZXMgQXggYmxvY2tzIHRvIGdlbmVyYXRlIGEga2V5c3RyZWFtIHdpdGggd2hpY2ggdGhlIE1JQyBhbmQKICAqIHRoZSBtZXNzYWdlJ3MgcGF5bG9hZCBhcmUgZW5jb2RlZC4gQTAgYWx3YXlzIGVuY3J5cHRzL2RlY3J5cHRzIHRoZQotICogTUlDLiBBeCAoeD4wKSBhcmUgdXNlZCBmb3IgdGhlIHN1Y2VzaXZlIHBheWxvYWQgYmxvY2tzLgorICogTUlDLiBBeCAoeD4wKSBhcmUgdXNlZCBmb3IgdGhlIHN1Y2Nlc3NpdmUgcGF5bG9hZCBibG9ja3MuCiAgKgogICogVGhlIHggaXMgdGhlIGNvdW50ZXIsIGFuZCBpcyBpbmNyZWFzZWQgZm9yIGVhY2ggYmxvY2suCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYwppbmRleCA2MTNhNWZjLi40ODliNDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC01NTgsNyArNTU4LDcgQEAKIC8qCiAgKiBDYWxsYmFjayBmb3IgdGhlIHNlZ21lbnQgcmVxdWVzdAogICoKLSAqIElmIHN1Y2Nlc2Z1bCB0cmFuc2l0aW9uIHN0YXRlICh1bmxlc3MgYWxyZWFkeSB0cmFuc2l0aW9uZWQgb3IKKyAqIElmIHN1Y2Nlc3NmdWwgdHJhbnNpdGlvbiBzdGF0ZSAodW5sZXNzIGFscmVhZHkgdHJhbnNpdGlvbmVkIG9yCiAgKiBvdXRib3VuZCB0cmFuc2Zlcik7IG90aGVyd2lzZSwgdGFrZSBhIG5vdGUgb2YgdGhlIGVycm9yLCBtYXJrIHRoaXMKICAqIHNlZ21lbnQgZG9uZSBhbmQgdHJ5IGNvbXBsZXRpb24uCiAgKgpAQCAtMTM2NCw3ICsxMzY0LDcgQEAKIC8qCiAgKiBDYWxsYmFjayBmb3IgdGhlIElOIGRhdGEgcGhhc2UKICAqCi0gKiBJZiBzdWNjZXNmdWwgdHJhbnNpdGlvbiBzdGF0ZTsgb3RoZXJ3aXNlLCB0YWtlIGEgbm90ZSBvZiB0aGUKKyAqIElmIHN1Y2Nlc3NmdWwgdHJhbnNpdGlvbiBzdGF0ZTsgb3RoZXJ3aXNlLCB0YWtlIGEgbm90ZSBvZiB0aGUKICAqIGVycm9yLCBtYXJrIHRoaXMgc2VnbWVudCBkb25lIGFuZCB0cnkgY29tcGxldGlvbi4KICAqCiAgKiBOb3RlIHdlIGRvbid0IGFjY2VzcyB1bnRpbCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSB0cmFuc2ZlciBoYXNuJ3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL2kxNDgwL2RmdS91c2IuYyBiL2RyaXZlcnMvdXdiL2kxNDgwL2RmdS91c2IuYwppbmRleCBjNzA4MGQ0Li4wYmI2NjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvdXNiLmMKKysrIGIvZHJpdmVycy91d2IvaTE0ODAvZGZ1L3VzYi5jCkBAIC0yMjksNyArMjI5LDcgQEAKICAqIHdpbGwgdmVyaWZ5IGl0LgogICoKICAqIFNldCBpMTQ4MC0+ZXZ0X3Jlc3VsdCB3aXRoIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgZXZlbnQgb3IgaXRzCi0gKiBzaXplIChpZiBzdWNjZXNmdWwpLgorICogc2l6ZSAoaWYgc3VjY2Vzc2Z1bCkuCiAgKgogICogRGVsaXZlcnMgdGhlIGRhdGEgZGlyZWN0bHkgdG8gaTE0ODAtPmV2dF9idWYKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvbmVoLmMgYi9kcml2ZXJzL3V3Yi9uZWguYwppbmRleCAwYWY4OTE2Li43ODUxMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9uZWguYworKysgYi9kcml2ZXJzL3V3Yi9uZWguYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgKgkgMHhmZiBpcyBpbnZhbGlkLCBzbyB0aGV5IG11c3Qgbm90IGJlIHVzZWQuIEluaXRpYWxpemF0aW9uCiAgKgkgZmlsbHMgdXAgdGhvc2UgdHdvIGluIHRoZSBiaXRtYXAgc28gdGhleSBhcmUgbm90IGFsbG9jYXRlZC4KICAqCi0gKiBXZSBzcHJlYWQgdGhlIGFsbG9jYXRpb24gYXJvdW5kIHRvIHJlZHVjZSB0aGUgcG9zaWJsaXR5IG9mIHR3bworICogV2Ugc3ByZWFkIHRoZSBhbGxvY2F0aW9uIGFyb3VuZCB0byByZWR1Y2UgdGhlIHBvc3NpYmlsaXR5IG9mIHR3bwogICogY29uc2VjdXRpdmUgb3BlbmVkIEBuZWgncyBnZXR0aW5nIHRoZSBzYW1lIGNvbnRleHQgSUQgYXNzaWduZWQgKHRvCiAgKiBhdm9pZCBzdXJwcmlzZXMgd2l0aCBsYXRlIGV2ZW50cyB0aGF0IHRpbWVkIG91dCBsb25nIHRpbWUgYWdvKS4gU28KICAqIGZpcnN0IHdlIHNlYXJjaCBmcm9tIHdoZXJlIEByYy0+Y3R4X3JvbGwgaXMsIGlmIG5vdCBmb3VuZCwgd2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3dscC90eHJ4LmMgYi9kcml2ZXJzL3V3Yi93bHAvdHhyeC5jCmluZGV4IDg2YTg1M2IuLjczNTBlZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3dscC90eHJ4LmMKKysrIGIvZHJpdmVycy91d2Ivd2xwL3R4cnguYwpAQCAtMjgyLDcgKzI4Miw3IEBACiAgKiAgICAgICAgIGFuZCB0cmFuc21pc3Npb24gd2lsbCBiZSBkb25lIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgogICogQGRzdDogICBPbiByZXR1cm4gdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGRldmljZSBhZGRyZXNzIHRvIHdoaWNoIHRoZQogICogICAgICAgICBmcmFtZSBpcyBkZXN0aW5lZC4KLSAqIEByZXR1cm5zOiAwIG9uIHN1Y2Nlc3Mgbm8gdHggOiBXTFAgaGVhZGVyIHN1Y2Vzc2Z1bGx5IGFwcGxpZWQgdG8gc2tiIGJ1ZmZlciwKKyAqIEByZXR1cm5zOiAwIG9uIHN1Y2Nlc3Mgbm8gdHggOiBXTFAgaGVhZGVyIHN1Y2Nlc3NmdWxseSBhcHBsaWVkIHRvIHNrYiBidWZmZXIsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBmdW5jdGlvbiBjYW4gcHJvY2VlZCB3aXRoIHR4CiAgKiAgICAgICAgICAgMSBvbiBzdWNjZXNzIHdpdGggdHggOiBXTFAgd2lsbCB0YWtlIG92ZXIgdHJhbnNtaXNzaW9uIG9mIHRoaXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggOGJlNTIzZi4uYmI1ZmJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtMjA2Niw2ICsyMDY2LDcgQEAKIAlzZWxlY3QgRkJfU1lTX0lNQUdFQkxJVAogCXNlbGVjdCBGQl9TWVNfRk9QUwogCXNlbGVjdCBGQl9ERUZFUlJFRF9JTworCXNlbGVjdCBYRU5fWEVOQlVTX0ZST05URU5ECiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyB0aGUgZnJvbnQtZW5kIG9mIHRoZSBYZW4gdmlydHVhbApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jIGIvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jCmluZGV4IGQ1ZTgwMTAuLjNkODg2YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMKQEAgLTk2NCw3ICs5NjQsNyBAQAogCWlmIChzaW5mby0+YXRtZWxfbGNkZmJfcG93ZXJfY29udHJvbCkKIAkJc2luZm8tPmF0bWVsX2xjZGZiX3Bvd2VyX2NvbnRyb2woMSk7CiAKLQlkZXZfaW5mbyhkZXYsICJmYiVkOiBBdG1lbCBMQ0RDIGF0IDB4JTA4bHggKG1hcHBlZCBhdCAlcCksIGlycSAlbHVcbiIsCisJZGV2X2luZm8oZGV2LCAiZmIlZDogQXRtZWwgTENEQyBhdCAweCUwOGx4IChtYXBwZWQgYXQgJXApLCBpcnEgJWRcbiIsCiAJCSAgICAgICBpbmZvLT5ub2RlLCBpbmZvLT5maXgubW1pb19zdGFydCwgc2luZm8tPm1taW8sIHNpbmZvLT5pcnFfYmFzZSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwppbmRleCA5MTNiNGE0Li4xZGRlYjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC0zMjc2LDcgKzMyNzYsNyBAQAogCQkJCXR4dGZvcm1hdCA9ICIyNCBiaXQgaW50ZXJmYWNlIjsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJdHh0Zm9ybWF0ID0gInVua293biBmb3JtYXQiOworCQkJCXR4dGZvcm1hdCA9ICJ1bmtub3duIGZvcm1hdCI7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlzd2l0Y2ggKGZvcm1hdCAmIDcpIHsKQEAgLTMyOTksNyArMzI5OSw3IEBACiAJCQkJdHh0Zm9ybWF0ID0gIjI2MjE0NCBjb2xvdXJzIChGRFBJLTIgbW9kZSkiOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQl0eHRmb3JtYXQgPSAidW5rb3duIGZvcm1hdCI7CisJCQkJdHh0Zm9ybWF0ID0gInVua25vd24gZm9ybWF0IjsKIAkJCX0KIAkJfQogCQlQUklOVEtJKCIlcyVzICVzIG1vbml0b3IgZGV0ZWN0ZWQ6ICVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYXRtZWwtcHdtLWJsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hdG1lbC1wd20tYmwuYwppbmRleCA1MDVjMDgyLi4yY2Y3YmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hdG1lbC1wd20tYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hdG1lbC1wd20tYmwuYwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCQlnb3RvIGVycl9mcmVlX3B3bTsKIAkJfQogCi0JCS8qIFR1cm4gZGlzcGxheSBvZmYgYnkgZGVmYXR1bHQuICovCisJCS8qIFR1cm4gZGlzcGxheSBvZmYgYnkgZGVmYXVsdC4gKi8KIAkJcmV0dmFsID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHB3bWJsLT5ncGlvX29uLAogCQkJCTAgXiBwZGF0YS0+b25fYWN0aXZlX2xvdyk7CiAJCWlmIChyZXR2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90b3NhX2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvdG9zYV9sY2QuYwppbmRleCA1MGVjMTdkLi5mYTMyYjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90b3NhX2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Rvc2FfbGNkLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkYXRhLT5pc192Z2EgPSB0cnVlOyAvKiBkZWZhdXQgdG8gVkdBIG1vZGUgKi8KKwlkYXRhLT5pc192Z2EgPSB0cnVlOyAvKiBkZWZhdWx0IHRvIFZHQSBtb2RlICovCiAKIAkvKgogCSAqIGJpdHNfcGVyX3dvcmQgY2Fubm90IGJlIGNvbmZpZ3VyZWQgaW4gcGxhdGZvcm0gZGF0YQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9icm9hZHNoZWV0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYnJvYWRzaGVldGZiLmMKaW5kZXggNTA5Y2I5Mi4uZGY5Y2NiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9icm9hZHNoZWV0ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Jyb2Fkc2hlZXRmYi5jCkBAIC00NzAsNyArNDcwLDcgQEAKIAlwYXItPnJlYWRfcmVnID0gYnJvYWRzaGVldF9yZWFkX3JlZzsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwYXItPndhaXRxKTsKIAotCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQgfCBGQklORk9fVklSVEZCOwogCiAJaW5mby0+ZmJkZWZpbyA9ICZicm9hZHNoZWV0ZmJfZGVmaW87CiAJZmJfZGVmZXJyZWRfaW9faW5pdChpbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29yZS5jCmluZGV4IDg1N2IzNjYuLjY0NjhhMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3N0aWNvcmUuYwpAQCAtNDM2LDcgKzQzNiw3IEBACiAJCQkgICAgKG9mZnMgPCBQQ0lfQkFTRV9BRERSRVNTXzAgfHwKIAkJCSAgICAgb2ZmcyA+IFBDSV9CQVNFX0FERFJFU1NfNSkpIHsKIAkJCQlwcmludGsgKEtFUk5fV0FSTklORwotCQkJCQkiU1RJIHBjaSByZWdpb24gbWFwaW5nIGZvciByZWdpb24gJWQgKCUwMngpIGNhbid0IGJlIG1hcHBlZFxuIiwKKwkJCQkJIlNUSSBwY2kgcmVnaW9uIG1hcHBpbmcgZm9yIHJlZ2lvbiAlZCAoJTAyeCkgY2FuJ3QgYmUgbWFwcGVkXG4iLAogCQkJCQlpLHN0aS0+cm1fZW50cnlbaV0pOwogCQkJCWNvbnRpbnVlOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYl9kZWZpby5jIGIvZHJpdmVycy92aWRlby9mYl9kZWZpby5jCmluZGV4IGMyN2FiMWUuLjQ0Y2U5MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJfZGVmaW8uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RlZmlvLmMKQEAgLTcxLDcgKzcxLDcgQEAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCS8qIFNraXAgaWYgZGVmZXJyZWQgaW8gaXMgY29tcGxpZWQtaW4gYnV0IGRpc2FibGVkIG9uIHRoaXMgZmJkZXYgKi8KKwkvKiBTa2lwIGlmIGRlZmVycmVkIGlvIGlzIGNvbXBpbGVkLWluIGJ1dCBkaXNhYmxlZCBvbiB0aGlzIGZiZGV2ICovCiAJaWYgKCFpbmZvLT5mYmRlZmlvKQogCQlyZXR1cm4gMDsKIApAQCAtMTQ0LDcgKzE0NCw5IEBACiBzdGF0aWMgaW50IGZiX2RlZmVycmVkX2lvX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXZtYS0+dm1fb3BzID0gJmZiX2RlZmVycmVkX2lvX3ZtX29wczsKLQl2bWEtPnZtX2ZsYWdzIHw9ICggVk1fSU8gfCBWTV9SRVNFUlZFRCB8IFZNX0RPTlRFWFBBTkQgKTsKKwl2bWEtPnZtX2ZsYWdzIHw9ICggVk1fUkVTRVJWRUQgfCBWTV9ET05URVhQQU5EICk7CisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fVklSVEZCKSkKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKIAl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IGluZm87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKaW5kZXggZjY3ZGI0Mi4uNjk1ZmEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nYmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwpAQCAtNzAxLDcgKzcwMSw3IEBACiAJICAgYmxvY2tzIG9mIDUxMngxMjgsIDI1NngxMjggb3IgMTI4eDEyOCBwaXhlbHMsIHJlc3BlY3RpdmVseSBmb3IgOGJpdCwKIAkgICAxNmJpdCBhbmQgMzIgYml0IG1vZGVzICg2NCBrQikuIFRoZXkgY292ZXIgdGhlIHNjcmVlbiB3aXRoIHBhcnRpYWwKIAkgICB0aWxlcyBvbiB0aGUgcmlnaHQgYW5kL29yIGJvdHRvbSBvZiB0aGUgc2NyZWVuIGlmIG5lZWRlZC4KLQkgICBGb3IgZXhlbXBsZSBpbiA2NDB4NDgwIDggYml0IG1vZGUgdGhlIG1hcHBpbmcgaXM6CisJICAgRm9yIGV4YW1wbGUgaW4gNjQweDQ4MCA4IGJpdCBtb2RlIHRoZSBtYXBwaW5nIGlzOgogCiAJICAgPC0tLS0tLS0tIDY0MCAtLS0tLT4KIAkgICA8LS0tLSA1MTIgLS0tLT48MTI4fDM4NCBvZmZzY3JlZW4+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2hlY3ViYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hlY3ViYWZiLmMKaW5kZXggMGI0YmZmYi4uZjlkNzdhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9oZWN1YmFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaGVjdWJhZmIuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJcGFyLT5zZW5kX2NvbW1hbmQgPSBhcG9sbG9fc2VuZF9jb21tYW5kOwogCXBhci0+c2VuZF9kYXRhID0gYXBvbGxvX3NlbmRfZGF0YTsKIAotCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQgfCBGQklORk9fVklSVEZCOwogCiAJaW5mby0+ZmJkZWZpbyA9ICZoZWN1YmFmYl9kZWZpbzsKIAlmYl9kZWZlcnJlZF9pb19pbml0KGluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tZXRyb25vbWVmYi5jIGIvZHJpdmVycy92aWRlby9tZXRyb25vbWVmYi5jCmluZGV4IGRmMWY3NTcuLjY2MWJmZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWV0cm9ub21lZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21ldHJvbm9tZWZiLmMKQEAgLTcwMCw3ICs3MDAsNyBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIGVycl9mcmVlX2lycTsKIAotCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQgfCBGQklORk9fVklSVEZCOwogCiAJaW5mby0+ZmJkZWZpbyA9ICZtZXRyb25vbWVmYl9kZWZpbzsKIAlmYl9kZWZlcnJlZF9pb19pbml0KGluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9hbXNfZGVsdGEuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYW1zX2RlbHRhLmMKaW5kZXggOTM0MGNhMy4uNTY3ZGI2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9hbXNfZGVsdGEuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2Ftc19kZWx0YS5jCkBAIC0xMjQsMTIgKzEyNCwxMiBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IGFtc19kZWx0YV9wYW5lbF9kcnZfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgYW1zX2RlbHRhX3BhbmVsX2Rydl9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW1zX2RlbHRhX3BhbmVsX2RyaXZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIGFtc19kZWx0YV9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFtc19kZWx0YV9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXNfZGVsdGFfcGFuZWxfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbWlwaWQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbWlwaWQuYwppbmRleCA0NmNhOTBkLi5hYmUxYzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX21pcGlkLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9taXBpZC5jCkBAIC02MDgsNyArNjA4LDcgQEAKIAkucmVtb3ZlCT0gX19kZXZleGl0X3AobWlwaWRfc3BpX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgaW50IG1pcGlkX2Rydl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtaXBpZF9kcnZfaW5pdCh2b2lkKQogewogCXNwaV9yZWdpc3Rlcl9kcml2ZXIoJm1pcGlkX3NwaV9kcml2ZXIpOwogCkBAIC02MTYsNyArNjE2LDcgQEAKIH0KIG1vZHVsZV9pbml0KG1pcGlkX2Rydl9pbml0KTsKIAotc3RhdGljIHZvaWQgbWlwaWRfZHJ2X2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaXBpZF9kcnZfY2xlYW51cCh2b2lkKQogewogCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWlwaWRfc3BpX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCmluZGV4IGJiYTUzNzEuLmY4NjAxMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCkBAIC0yNjAsMTMgKzI2MCwxMyBAQAogCXZhci0+Z3JheXNjYWxlID0gMDsJLyogTm8gZ3JheXNjYWxlIGZvciBub3cgKi8KIAogCS8qIGRldGVybWluZSB2YWxpZCByZXNvbHV0aW9uIGFuZCB0aW1pbmcgKi8KLQlmb3IgKG1pbl9tb2RlID0gMDsgbWluX21vZGUgPCBEQkVfVlRfU0laRTsgbWluX21vZGUrKykgeworCWZvciAobWluX21vZGUgPSAwOyBtaW5fbW9kZSA8IEFSUkFZX1NJWkUoZGJlVlRpbWluZ3MpOyBtaW5fbW9kZSsrKSB7CiAJCWlmIChkYmVWVGltaW5nc1ttaW5fbW9kZV0ud2lkdGggPj0gdmFyLT54cmVzICYmCiAJCSAgICBkYmVWVGltaW5nc1ttaW5fbW9kZV0uaGVpZ2h0ID49IHZhci0+eXJlcykKIAkJCWJyZWFrOwogCX0KIAotCWlmIChtaW5fbW9kZSA9PSBEQkVfVlRfU0laRSkKKwlpZiAobWluX21vZGUgPT0gQVJSQVlfU0laRShkYmVWVGltaW5ncykpCiAJCXJldHVybiAtRUlOVkFMOwkvKiBSZXNvbHV0aW9uIHRvIGhpZ2ggKi8KIAogCS8qIFhYWCBGSVhNRSAtIHNob3VsZCB0cnkgdG8gcGljayBiZXN0IHJlZnJlc2ggcmF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbGNkY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYwppbmRleCAzYWQ1MTU3Li5iNGI1ZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYwpAQCAtMjgxLDE4ICsyODEsMzQgQEAKIAkJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QpCiB7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoID0gaW5mby0+cGFyOwotCXVuc2lnbmVkIGludCBucl9wYWdlczsKIAogCS8qIGVuYWJsZSBjbG9ja3MgYmVmb3JlIGFjY2Vzc2luZyBoYXJkd2FyZSAqLwogCXNoX21vYmlsZV9sY2RjX2Nsa19vbihjaC0+bGNkYyk7CiAKLQlucl9wYWdlcyA9IHNoX21vYmlsZV9sY2RjX3NnaW5pdChpbmZvLCBwYWdlbGlzdCk7Ci0JZG1hX21hcF9zZyhpbmZvLT5kZXYsIGNoLT5zZ2xpc3QsIG5yX3BhZ2VzLCBETUFfVE9fREVWSUNFKTsKKwkvKgorCSAqIEl0J3MgcG9zc2libGUgdG8gZ2V0IGhlcmUgd2l0aG91dCBhbnl0aGluZyBvbiB0aGUgcGFnZWxpc3QgdmlhCisJICogc2hfbW9iaWxlX2xjZGNfZGVmZXJyZWRfaW9fdG91Y2goKSBvciB2aWEgYSB1c2Vyc3BhY2UgZnN5bmMoKQorCSAqIGludm9jYXRpb24uIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIGFjY2VsZXJhdGlvbiByb3V0aW5lcyBhcmUKKwkgKiBzdGVwcGVkIGluIHRvIHdoZW4gdXNpbmcgdGhlIGZyYW1lYnVmZmVyIGNvbnNvbGUgY2F1c2luZyB0aGUKKwkgKiB3b3JrcXVldWUgdG8gYmUgc2NoZWR1bGVkIHdpdGhvdXQgYW55IGRpcnR5IHBhZ2VzIG9uIHRoZSBsaXN0LgorCSAqCisJICogRGVzcGl0ZSB0aGlzLCBhIHBhbmVsIHVwZGF0ZSBpcyBzdGlsbCBuZWVkZWQgZ2l2ZW4gdGhhdCB0aGUKKwkgKiBhY2NlbGVyYXRpb24gcm91dGluZXMgaGF2ZSB0aGVpciBvd24gbWV0aG9kcyBmb3Igd3JpdGluZyBpbgorCSAqIHRoYXQgc3RpbGwgbmVlZCB0byBiZSB1cGRhdGVkLgorCSAqCisJICogVGhlIGZzeW5jKCkgYW5kIGVtcHR5IHBhZ2VsaXN0IGNhc2UgY291bGQgYmUgb3B0aW1pemVkIGZvciwKKwkgKiBidXQgd2UgZG9uJ3QgYm90aGVyLCBhcyBhbnkgYXBwbGljYXRpb24gZXhoaWJpdGluZyBzdWNoCisJICogYmVoYXZpb3VyIGlzIGZ1bmRhbWVudGFsbHkgYnJva2VuIGFueXdheXMuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KHBhZ2VsaXN0KSkgeworCQl1bnNpZ25lZCBpbnQgbnJfcGFnZXMgPSBzaF9tb2JpbGVfbGNkY19zZ2luaXQoaW5mbywgcGFnZWxpc3QpOwogCi0JLyogdHJpZ2dlciBwYW5lbCB1cGRhdGUgKi8KLQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00yUiwgMSk7Ci0KLQlkbWFfdW5tYXBfc2coaW5mby0+ZGV2LCBjaC0+c2dsaXN0LCBucl9wYWdlcywgRE1BX1RPX0RFVklDRSk7CisJCS8qIHRyaWdnZXIgcGFuZWwgdXBkYXRlICovCisJCWRtYV9tYXBfc2coaW5mby0+ZGV2LCBjaC0+c2dsaXN0LCBucl9wYWdlcywgRE1BX1RPX0RFVklDRSk7CisJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTJSLCAxKTsKKwkJZG1hX3VubWFwX3NnKGluZm8tPmRldiwgY2gtPnNnbGlzdCwgbnJfcGFnZXMsIERNQV9UT19ERVZJQ0UpOworCX0gZWxzZQorCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00yUiwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNoX21vYmlsZV9sY2RjX2RlZmVycmVkX2lvX3RvdWNoKHN0cnVjdCBmYl9pbmZvICppbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zdGlmYi5jIGIvZHJpdmVycy92aWRlby9zdGlmYi5jCmluZGV4IDYxMjBmMGMuLjg3NjY0OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc3RpZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3N0aWZiLmMKQEAgLTc1Niw5ICs3NTYsOSBAQAogCQlpZiAoZmItPmluZm8udmFyLmJpdHNfcGVyX3BpeGVsID09IDMyKQogCQkJY29udHJvbFBsYW5lUmVnID0gMHgwNDAwMEYwMDsKIAkJZWxzZQotCQkJY29udHJvbFBsYW5lUmVnID0gMHgwMDAwMEYwMDsgICAvKiAweDAwMDAwODAwIHNob3VsZCBiZSBlbm91Z2h0LCBidXQgbGV0cyBjbGVhciBhbGwgNCBiaXRzICovCisJCQljb250cm9sUGxhbmVSZWcgPSAweDAwMDAwRjAwOyAgIC8qIDB4MDAwMDA4MDAgc2hvdWxkIGJlIGVub3VnaCwgYnV0IGxldHMgY2xlYXIgYWxsIDQgYml0cyAqLwogCWVsc2UKLQkJY29udHJvbFBsYW5lUmVnID0gMHgwMDAwMEYwMDsgLyogMHgwMDAwMDEwMCBzaG91bGQgYmUgZW5vdWdodCwgYnV0IGxldHMgY2xlYXIgYWxsIDQgYml0cyAqLworCQljb250cm9sUGxhbmVSZWcgPSAweDAwMDAwRjAwOyAvKiAweDAwMDAwMTAwIHNob3VsZCBiZSBlbm91Z2gsIGJ1dCBsZXRzIGNsZWFyIGFsbCA0IGJpdHMgKi8KIAogCXN3aXRjaCAoZW5hYmxlKSB7CiAJY2FzZSBFTkFCTEU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RkZnhmYi5jIGIvZHJpdmVycy92aWRlby90ZGZ4ZmIuYwppbmRleCBmZjQzYzg4Li45ODA1NDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RkZnhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdGRmeGZiLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAqCiAgKiAwLjEuMyAocmVsZWFzZWQgMTk5OS0xMS0wMikJYWRkZWQgQXR0aWxhJ3MgcGFubmluZyBzdXBwb3J0LCBjb2RlCiAgKgkJCQlyZW9yZywgaHdjdXJzb3IgYWRkcmVzcyBwYWdlIHNpemUgYWxpZ25tZW50Ci0gKgkJCQkoZm9yIG1tYXBpbmcgYm90aCBmcmFtZSBidWZmZXIgYW5kIHJlZ3MpLAorICoJCQkJKGZvciBtbWFwcGluZyBib3RoIGZyYW1lIGJ1ZmZlciBhbmQgcmVncyksCiAgKgkJCQlhbmQgbXkgY2hhbmdlcyB0byBnZXQgcmlkIG9mIGhhcmRjb2RlZAogICoJCQkJVkdBIGkvbyByZWdpc3RlciBsb2NhdGlvbnMgKHVzZXMgUENJCiAgKgkJCQljb25maWd1cmF0aW9uIGluZm8gbm93KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvZHZpLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9kdmkuYwppbmRleCBjNWMzMmI2Li42N2IzNjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS9kdmkuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9kdmkuYwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJZGVmYXVsdDoKIAkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmR2aV9wYW5lbF9zaXplID0KIAkJCVZJQV9SRVNfMTAyNFg3Njg7Ci0JCURFQlVHX01TRyhLRVJOX0lORk8gIlVua25vdyBwYW5lbCBzaXplIG1heCByZXNvbHV0aW9uID0gJWQgIVwKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiVW5rbm93biBwYW5lbCBzaXplIG1heCByZXNvbHV0aW9uID0gJWQgIVwKIAkJCQkJIHNldCBkZWZhdWx0IHBhbmVsIHNpemUuXG4iLCBtYXhfaCk7CiAJCWJyZWFrOwogCX0KQEAgLTUzNCw3ICs1MzQsNyBAQAogCWRlZmF1bHQ6CiAJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5kdmlfcGFuZWxfc2l6ZSA9CiAJCQlWSUFfUkVTXzEwMjRYNzY4OwotCQlERUJVR19NU0coS0VSTl9JTkZPICJVbmtub3cgcGFuZWwgc2l6ZSBtYXggcmVzb2x1dGlvbiA9ICVkIVwKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiVW5rbm93biBwYW5lbCBzaXplIG1heCByZXNvbHV0aW9uID0gJWQhXAogCQkJCQlzZXQgZGVmYXVsdCBwYW5lbCBzaXplLlxuIiwgSFNpemUpOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMKaW5kZXggM2RmMTdkYy4uNjVjY2QyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92dDg2MjNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKIAlzdmdhX3dzZXFfbWFzaygweDFFLCAweEYwLCAweEYwKTsgLy8gREkvRFZQIGJ1cwogCXN2Z2Ffd3NlcV9tYXNrKDB4MkEsIDB4MEYsIDB4MEYpOyAvLyBESS9EVlAgYnVzCi0Jc3ZnYV93c2VxX21hc2soMHgxNiwgMHgwOCwgMHhCRik7IC8vIEZJRk8gcmVhZCB0cmVzaG9sZAorCXN2Z2Ffd3NlcV9tYXNrKDB4MTYsIDB4MDgsIDB4QkYpOyAvLyBGSUZPIHJlYWQgdGhyZXNob2xkCiAJdmdhX3dzZXEoTlVMTCwgMHgxNywgMHgxRik7ICAgICAgIC8vIEZJRk8gZGVwdGgKIAl2Z2Ffd3NlcShOVUxMLCAweDE4LCAweDRFKTsKIAlzdmdhX3dzZXFfbWFzaygweDFBLCAweDA4LCAweDA4KTsgLy8gZW5hYmxlIE1NSU8gPwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCmluZGV4IDU0Y2Q5MTYuLjkxYTY4ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYworKysgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCWZiX2luZm8tPmZpeC50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwogCWZiX2luZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX05PTkU7CiAKLQlmYl9pbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJZmJfaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUIHwgRkJJTkZPX1ZJUlRGQjsKIAogCXJldCA9IGZiX2FsbG9jX2NtYXAoJmZiX2luZm8tPmNtYXAsIDI1NiwgMCk7CiAJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9jb2g5MDEzMjdfd2R0LmMKaW5kZXggMzgxMDI2Yy4uOTIzY2M2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9jb2g5MDEzMjdfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9jb2g5MDEzMjdfd2R0LmMKQEAgLTUwOCw3ICs1MDgsNyBAQAogCSAqIGRlYWN0aXZhdGluZyB0aGUgd2F0Y2hkb2cgYmVmb3JlIGl0IGlzIHNodXQgZG93biBieSBpdC4KIAkgKgogCSAqIE5PVEU6IG9uIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgd2F0Y2hkb2csIHRoaXMgcmVzdHJpY3Rpb24gaXMKLQkgKiBnb25lOiB0aGUgd2F0Y2hkb2cgd2lsbCBiZSByZWxvYWRlZCB3aXRoIGEgZGVmYXVsIHZhbHVlICgxIG1pbikKKwkgKiBnb25lOiB0aGUgd2F0Y2hkb2cgd2lsbCBiZSByZWxvYWRlZCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSAoMSBtaW4pCiAJICogaW5zdGVhZCBvZiBsYXN0IHZhbHVlLCBhbmQgeW91IGNhbiBjb252ZW5pZW50bHkgc2V0IHRoZSB3YXRjaGRvZwogCSAqIHRpbWVvdXQgdG8gMTBtcyAodmFsdWUgPSAxKSB3aXRob3V0IGFueSBwcm9ibGVtcy4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbWFjaHp3ZC5jIGIvZHJpdmVycy93YXRjaGRvZy9tYWNoendkLmMKaW5kZXggYjZiM2Y1OS4uNDdkNzE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9tYWNoendkLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9tYWNoendkLmMKQEAgLTIxLDcgKzIxLDcgQEAKICAqICAgICAgd2QjMSAtIDIgc2Vjb25kczsKICAqICAgICAgd2QjMiAtIDcuMiBtczsKICAqICBBZnRlciB0aGUgZXhwaXJhdGlvbiBvZiB3ZCMxLCBpdCBjYW4gZ2VuZXJhdGUgYSBOTUksIFNDSSwgU01JLCBvcgotICogIGEgc3lzdGVtIFJFU0VUIGFuZCBpdCBzdGFydHMgd2QjMiB0aGF0IHVuY29uZGl0aW9uYWx5IHdpbGwgUkVTRVQKKyAqICBhIHN5c3RlbSBSRVNFVCBhbmQgaXQgc3RhcnRzIHdkIzIgdGhhdCB1bmNvbmRpdGlvbmFsbHkgd2lsbCBSRVNFVAogICogIHRoZSBzeXN0ZW0gd2hlbiB0aGUgY291bnRlciByZWFjaGVzIHplcm8uCiAgKgogICogIDE0LURlYy0yMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2Jfd2RvZy5jIGIvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKaW5kZXggOTc0OGVlZC4uYzhlYWRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogV2F0Y2hkb2cgZHJpdmVyIGZvciBTaUJ5dGUgU0IxIFNvQ3MKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgT25TdG9yLCBJbmMuICogQW5kcmV3IFNoYXJwIDxhbmR5LnNoYXJwQG9uc3Rvci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT25TdG9yLCBJbmMuICogQW5kcmV3IFNoYXJwIDxhbmR5LnNoYXJwQGxzaS5jb20+CiAgKgogICogVGhpcyBkcml2ZXIgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgc2Vjb25kIG9mIHR3byBoYXJkd2FyZSB3YXRjaGRvZ3MKICAqIG9uIHRoZSBTaWJ5dGUgMTJYWCBhbmQgMTFYWCBTb0NzIGF2YWlsYWJsZSB0byB0aGUgdXNlci4gIFRoZXJlIGFyZSB0d28KQEAgLTMyNiw3ICszMjYsNyBAQAogbW9kdWxlX2luaXQoc2J3ZG9nX2luaXQpOwogbW9kdWxlX2V4aXQoc2J3ZG9nX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJBbmRyZXcgU2hhcnAgPGFuZHkuc2hhcnBAb25zdG9yLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJldyBTaGFycCA8YW5keS5zaGFycEBsc2kuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTaUJ5dGUgV2F0Y2hkb2ciKTsKIAogbW9kdWxlX3BhcmFtKHRpbWVvdXQsIHVsb25nLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2RydGFzLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dkcnRhcy5jCmluZGV4IDNiZGU1NmIuLjViZmIxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvd2RydGFzLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ZHJ0YXMuYwpAQCAtNTQyLDcgKzU0Miw3IEBACiAvKioKICAqIHdkcnRhc19nZXRfdG9rZW5zIC0gcmVhZHMgaW4gUlRBUyB0b2tlbnMKICAqCi0gKiByZXR1cm5zIDAgb24gc3VjY2VzLCA8MCBvbiBmYWlsdXJlCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQogICoKICAqIHdkcnRhc19nZXRfdG9rZW5zIHJlYWRzIGluIHRoZSB0b2tlbnMgZm9yIHRoZSBSVEFTIGNhbGxzIHVzZWQgaW4KICAqIHRoaXMgd2F0Y2hkb2cgZHJpdmVyLiBJdCB0b2xlcmF0ZXMsIGlmICJnZXQtc2Vuc29yLXN0YXRlIiBhbmQKQEAgLTU5OCw3ICs1OTgsNyBAQAogLyoqCiAgKiB3ZHJ0YXNfcmVnaXN0ZXJfZGV2cyAtIHJlZ2lzdGVycyB0aGUgbWlzYyBkZXYgaGFuZGxlcnMKICAqCi0gKiByZXR1cm5zIDAgb24gc3VjY2VzLCA8MCBvbiBmYWlsdXJlCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQogICoKICAqIHdkcnRhc19yZWdpc3Rlcl9kZXZzIHJlZ2lzdGVycyB0aGUgd2F0Y2hkb2cgYW5kIHRlbXBlcmF0dXJlIHdhdGNoZG9nCiAgKiBtaXNjIGRldnMKQEAgLTYzMCw3ICs2MzAsNyBAQAogLyoqCiAgKiB3ZHJ0YXNfaW5pdCAtIGluaXQgZnVuY3Rpb24gb2YgdGhlIHdhdGNoZG9nIGRyaXZlcgogICoKLSAqIHJldHVybnMgMCBvbiBzdWNjZXMsIDwwIG9uIGZhaWx1cmUKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlCiAgKgogICogcmVnaXN0ZXJzIHRoZSBmaWxlIGhhbmRsZXJzIGFuZCB0aGUgcmVib290IG5vdGlmaWVyCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2JhbGxvb24uYyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwppbmRleCBkMzE1MDViLi40MjA0MzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCkBAIC02Niw4ICs2Niw2IEBACiAJLyogV2UgYWltIGZvciAnY3VycmVudCBhbGxvY2F0aW9uJyA9PSAndGFyZ2V0IGFsbG9jYXRpb24nLiAqLwogCXVuc2lnbmVkIGxvbmcgY3VycmVudF9wYWdlczsKIAl1bnNpZ25lZCBsb25nIHRhcmdldF9wYWdlczsKLQkvKiBXZSBtYXkgaGl0IHRoZSBoYXJkIGxpbWl0IGluIFhlbi4gSWYgd2UgZG8gdGhlbiB3ZSByZW1lbWJlciBpdC4gKi8KLQl1bnNpZ25lZCBsb25nIGhhcmRfbGltaXQ7CiAJLyoKIAkgKiBEcml2ZXJzIG1heSBhbHRlciB0aGUgbWVtb3J5IHJlc2VydmF0aW9uIGluZGVwZW5kZW50bHksIGJ1dCB0aGV5CiAJICogbXVzdCBpbmZvcm0gdGhlIGJhbGxvb24gZHJpdmVyIHNvIHdlIGF2b2lkIGhpdHRpbmcgdGhlIGhhcmQgbGltaXQuCkBAIC0xMzYsNiArMTM0LDggQEAKIAkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJmJhbGxvb25lZF9wYWdlcyk7CiAJCWJhbGxvb25fc3RhdHMuYmFsbG9vbl9sb3crKzsKIAl9CisKKwl0b3RhbHJhbV9wYWdlcy0tOwogfQogCiAvKiBiYWxsb29uX3JldHJpZXZlOiByZXNjdWUgYSBwYWdlIGZyb20gdGhlIGJhbGxvb24sIGlmIGl0IGlzIG5vdCBlbXB0eS4gKi8KQEAgLTE1Niw2ICsxNTYsOCBAQAogCWVsc2UKIAkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdy0tOwogCisJdG90YWxyYW1fcGFnZXMrKzsKKwogCXJldHVybiBwYWdlOwogfQogCkBAIC0xODEsNyArMTgzLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF90YXJnZXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHRhcmdldCA9IG1pbihiYWxsb29uX3N0YXRzLnRhcmdldF9wYWdlcywgYmFsbG9vbl9zdGF0cy5oYXJkX2xpbWl0KTsKKwl1bnNpZ25lZCBsb25nIHRhcmdldCA9IGJhbGxvb25fc3RhdHMudGFyZ2V0X3BhZ2VzOwogCiAJdGFyZ2V0ID0gbWluKHRhcmdldCwKIAkJICAgICBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgKwpAQCAtMjE3LDIzICsyMTksMTAgQEAKIAlzZXRfeGVuX2d1ZXN0X2hhbmRsZShyZXNlcnZhdGlvbi5leHRlbnRfc3RhcnQsIGZyYW1lX2xpc3QpOwogCXJlc2VydmF0aW9uLm5yX2V4dGVudHMgPSBucl9wYWdlczsKIAlyYyA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9wb3B1bGF0ZV9waHlzbWFwLCAmcmVzZXJ2YXRpb24pOwotCWlmIChyYyA8IG5yX3BhZ2VzKSB7Ci0JCWlmIChyYyA+IDApIHsKLQkJCWludCByZXQ7Ci0KLQkJCS8qIFdlIGhpdCB0aGUgWGVuIGhhcmQgbGltaXQ6IHJlcHJvYmUuICovCi0JCQlyZXNlcnZhdGlvbi5ucl9leHRlbnRzID0gcmM7Ci0JCQlyZXQgPSBIWVBFUlZJU09SX21lbW9yeV9vcChYRU5NRU1fZGVjcmVhc2VfcmVzZXJ2YXRpb24sCi0JCQkJCQkgICAmcmVzZXJ2YXRpb24pOwotCQkJQlVHX09OKHJldCAhPSByYyk7Ci0JCX0KLQkJaWYgKHJjID49IDApCi0JCQliYWxsb29uX3N0YXRzLmhhcmRfbGltaXQgPSAoYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzICsgcmMgLQotCQkJCQkJICAgIGJhbGxvb25fc3RhdHMuZHJpdmVyX3BhZ2VzKTsKKwlpZiAocmMgPCAwKQogCQlnb3RvIG91dDsKLQl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCByYzsgaSsrKSB7CiAJCXBhZ2UgPSBiYWxsb29uX3JldHJpZXZlKCk7CiAJCUJVR19PTihwYWdlID09IE5VTEwpOwogCkBAIC0yNTksMTMgKzI0OCwxMiBAQAogCQlfX2ZyZWVfcGFnZShwYWdlKTsKIAl9CiAKLQliYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgKz0gbnJfcGFnZXM7Ci0JdG90YWxyYW1fcGFnZXMgPSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXM7CisJYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzICs9IHJjOwogCiAgb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbGxvb25fbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJjIDwgMCA/IHJjIDogcmMgIT0gbnJfcGFnZXM7CiB9CiAKIHN0YXRpYyBpbnQgZGVjcmVhc2VfcmVzZXJ2YXRpb24odW5zaWduZWQgbG9uZyBucl9wYWdlcykKQEAgLTMyMyw3ICszMTEsNiBAQAogCUJVR19PTihyZXQgIT0gbnJfcGFnZXMpOwogCiAJYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzIC09IG5yX3BhZ2VzOwotCXRvdGFscmFtX3BhZ2VzID0gYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7CiAKQEAgLTM2Nyw3ICszNTQsNiBAQAogc3RhdGljIHZvaWQgYmFsbG9vbl9zZXRfbmV3X3RhcmdldCh1bnNpZ25lZCBsb25nIHRhcmdldCkKIHsKIAkvKiBObyBuZWVkIGZvciBsb2NrLiBOb3QgcmVhZC1tb2RpZnktd3JpdGUgdXBkYXRlcy4gKi8KLQliYWxsb29uX3N0YXRzLmhhcmRfbGltaXQgICA9IH4wVUw7CiAJYmFsbG9vbl9zdGF0cy50YXJnZXRfcGFnZXMgPSB0YXJnZXQ7CiAJc2NoZWR1bGVfd29yaygmYmFsbG9vbl93b3JrZXIpOwogfQpAQCAtNDIyLDEyICs0MDgsMTAgQEAKIAlwcl9pbmZvKCJ4ZW5fYmFsbG9vbjogSW5pdGlhbGlzaW5nIGJhbGxvb24gZHJpdmVyLlxuIik7CiAKIAliYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgPSBtaW4oeGVuX3N0YXJ0X2luZm8tPm5yX3BhZ2VzLCBtYXhfcGZuKTsKLQl0b3RhbHJhbV9wYWdlcyAgID0gYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzOwogCWJhbGxvb25fc3RhdHMudGFyZ2V0X3BhZ2VzICA9IGJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlczsKIAliYWxsb29uX3N0YXRzLmJhbGxvb25fbG93ICAgPSAwOwogCWJhbGxvb25fc3RhdHMuYmFsbG9vbl9oaWdoICA9IDA7CiAJYmFsbG9vbl9zdGF0cy5kcml2ZXJfcGFnZXMgID0gMFVMOwotCWJhbGxvb25fc3RhdHMuaGFyZF9saW1pdCAgICA9IH4wVUw7CiAKIAlpbml0X3RpbWVyKCZiYWxsb29uX3RpbWVyKTsKIAliYWxsb29uX3RpbWVyLmRhdGEgPSAwOwpAQCAtNDcyLDkgKzQ1Niw2IEBACiBCQUxMT09OX1NIT1coY3VycmVudF9rYiwgIiVsdVxuIiwgUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzKSk7CiBCQUxMT09OX1NIT1cobG93X2tiLCAiJWx1XG4iLCBQQUdFUzJLQihiYWxsb29uX3N0YXRzLmJhbGxvb25fbG93KSk7CiBCQUxMT09OX1NIT1coaGlnaF9rYiwgIiVsdVxuIiwgUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hpZ2gpKTsKLUJBTExPT05fU0hPVyhoYXJkX2xpbWl0X2tiLAotCSAgICAgKGJhbGxvb25fc3RhdHMuaGFyZF9saW1pdCE9fjBVTCkgPyAiJWx1XG4iIDogIj8/P1xuIiwKLQkgICAgIChiYWxsb29uX3N0YXRzLmhhcmRfbGltaXQhPX4wVUwpID8gUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5oYXJkX2xpbWl0KSA6IDApOwogQkFMTE9PTl9TSE9XKGRyaXZlcl9rYiwgIiVsdVxuIiwgUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5kcml2ZXJfcGFnZXMpKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd190YXJnZXRfa2Ioc3RydWN0IHN5c19kZXZpY2UgKmRldiwgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCkBAIC01NDQsNyArNTI1LDYgQEAKIAkmYXR0cl9jdXJyZW50X2tiLmF0dHIsCiAJJmF0dHJfbG93X2tiLmF0dHIsCiAJJmF0dHJfaGlnaF9rYi5hdHRyLAotCSZhdHRyX2hhcmRfbGltaXRfa2IuYXR0ciwKIAkmYXR0cl9kcml2ZXJfa2IuYXR0ciwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCAyZjU3Mjc2Li5jZTYwMmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtNDc0LDYgKzQ3NCw5IEBACiAJCWJpbmRfZXZ0Y2huX3RvX2NwdShldnRjaG4sIDApOwogCiAJCWV2dGNobl90b19pcnFbZXZ0Y2huXSA9IC0xOworCX0KKworCWlmIChpcnFfaW5mb1tpcnFdLnR5cGUgIT0gSVJRVF9VTkJPVU5EKSB7CiAJCWlycV9pbmZvW2lycV0gPSBta191bmJvdW5kX2luZm8oKTsKIAogCQlkeW5hbWljX2lycV9jbGVhbnVwKGlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9tYW5hZ2UuYyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCmluZGV4IDEwZDAzZDcuLmM0OTk3OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL21hbmFnZS5jCisrKyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCkBAIC00Myw3ICs0Myw2IEBACiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgInhlbl9zdXNwZW5kOiBzeXNkZXZfc3VzcGVuZCBmYWlsZWQ6ICVkXG4iLAogCQkJZXJyKTsKLQkJZHBtX3Jlc3VtZV9ub2lycShQTVNHX1JFU1VNRSk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02OSw3ICs2OCw2IEBACiAJfQogCiAJc3lzZGV2X3Jlc3VtZSgpOwotCWRwbV9yZXN1bWVfbm9pcnEoUE1TR19SRVNVTUUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MSw2ICs3OSwxMiBAQAogCiAJc2h1dHRpbmdfZG93biA9IFNIVVRET1dOX1NVU1BFTkQ7CiAKKwllcnIgPSBzdG9wX21hY2hpbmVfY3JlYXRlKCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInhlbiBzdXNwZW5kOiBmYWlsZWQgdG8gc2V0dXAgc3RvcF9tYWNoaW5lICVkXG4iLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CisKICNpZmRlZiBDT05GSUdfUFJFRU1QVAogCS8qIElmIHRoZSBrZXJuZWwgaXMgcHJlZW1wdGlibGUsIHdlIG5lZWQgdG8gZnJlZXplIGFsbCB0aGUgcHJvY2Vzc2VzCiAJICAgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIHBhZ2V0YWJsZSB1cGRhdGUKQEAgLTg4LDI5ICs5MiwzMiBAQAogCWVyciA9IGZyZWV6ZV9wcm9jZXNzZXMoKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieGVuIHN1c3BlbmQ6IGZyZWV6ZSBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCXJldHVybjsKKwkJZ290byBvdXRfZGVzdHJveV9zbTsKIAl9CiAjZW5kaWYKIAogCWVyciA9IGRwbV9zdXNwZW5kX3N0YXJ0KFBNU0dfU1VTUEVORCk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgInhlbiBzdXNwZW5kOiBkcG1fc3VzcGVuZF9zdGFydCAlZFxuIiwgZXJyKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3RoYXc7CisJfQorCisJZXJyID0gZHBtX3N1c3BlbmRfbm9pcnEoUE1TR19TVVNQRU5EKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHBtX3N1c3BlbmRfbm9pcnEgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJZ290byBvdXRfcmVzdW1lOwogCX0KIAogCXByaW50ayhLRVJOX0RFQlVHICJzdXNwZW5kaW5nIHhlbnN0b3JlLi4uXG4iKTsKIAl4c19zdXNwZW5kKCk7CiAKLQllcnIgPSBkcG1fc3VzcGVuZF9ub2lycShQTVNHX1NVU1BFTkQpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkcG1fc3VzcGVuZF9ub2lycSBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotCQlnb3RvIHJlc3VtZV9kZXZpY2VzOwotCX0KLQogCWVyciA9IHN0b3BfbWFjaGluZSh4ZW5fc3VzcGVuZCwgJmNhbmNlbGxlZCwgY3B1bWFza19vZigwKSk7CisKKwlkcG1fcmVzdW1lX25vaXJxKFBNU0dfUkVTVU1FKTsKKwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gc3RhcnQgeGVuX3N1c3BlbmQ6ICVkXG4iLCBlcnIpOwotCQlnb3RvIG91dDsKKwkJY2FuY2VsbGVkID0gMTsKIAl9CiAKIAlpZiAoIWNhbmNlbGxlZCkgewpAQCAtMTE5LDE3ICsxMjYsMjEgQEAKIAl9IGVsc2UKIAkJeHNfc3VzcGVuZF9jYW5jZWwoKTsKIAotCWRwbV9yZXN1bWVfbm9pcnEoUE1TR19SRVNVTUUpOwotCi1yZXN1bWVfZGV2aWNlczoKK291dF9yZXN1bWU6CiAJZHBtX3Jlc3VtZV9lbmQoUE1TR19SRVNVTUUpOwogCiAJLyogTWFrZSBzdXJlIHRpbWVyIGV2ZW50cyBnZXQgcmV0cmlnZ2VyZWQgb24gYWxsIENQVXMgKi8KIAljbG9ja193YXNfc2V0KCk7Ci1vdXQ6CisKK291dF90aGF3OgogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAJdGhhd19wcm9jZXNzZXMoKTsKKworb3V0X2Rlc3Ryb3lfc206CiAjZW5kaWYKKwlzdG9wX21hY2hpbmVfZGVzdHJveSgpOworCitvdXQ6CiAJc2h1dHRpbmdfZG93biA9IFNIVVRET1dOX0lOVkFMSUQ7CiB9CiAjZW5kaWYJLyogQ09ORklHX1BNX1NMRUVQICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggZDQyZTI1ZC4uNjQ5ZmNkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtNDU0LDIxICs0NTQsMjEgQEAKIHsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgdG9feGVuYnVzX2RldmljZShkZXYpLT5ub2RlbmFtZSk7CiB9Ci1ERVZJQ0VfQVRUUihub2RlbmFtZSwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCB4ZW5kZXZfc2hvd19ub2RlbmFtZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobm9kZW5hbWUsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwgeGVuZGV2X3Nob3dfbm9kZW5hbWUsIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCB4ZW5kZXZfc2hvd19kZXZ0eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB0b194ZW5idXNfZGV2aWNlKGRldiktPmRldmljZXR5cGUpOwogfQotREVWSUNFX0FUVFIoZGV2dHlwZSwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCB4ZW5kZXZfc2hvd19kZXZ0eXBlLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZXZ0eXBlLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsIHhlbmRldl9zaG93X2RldnR5cGUsIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCB4ZW5kZXZfc2hvd19tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAieGVuOiVzXG4iLCB0b194ZW5idXNfZGV2aWNlKGRldiktPmRldmljZXR5cGUpOwogfQotREVWSUNFX0FUVFIobW9kYWxpYXMsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwgeGVuZGV2X3Nob3dfbW9kYWxpYXMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG1vZGFsaWFzLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsIHhlbmRldl9zaG93X21vZGFsaWFzLCBOVUxMKTsKIAogaW50IHhlbmJ1c19wcm9iZV9ub2RlKHN0cnVjdCB4ZW5fYnVzX3R5cGUgKmJ1cywKIAkJICAgICAgY29uc3QgY2hhciAqdHlwZSwKQEAgLTg0Myw3ICs4NDMsNyBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgaXNfZGlzY29ubmVjdGVkX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGlzX2RldmljZV9jb25uZWN0aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGVuZGV2ID0gdG9feGVuYnVzX2RldmljZShkZXYpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkYXRhOwpAQCAtODYxLDE0ICs4NjEsMTUgQEAKIAkJcmV0dXJuIDA7CiAKIAl4ZW5kcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlyZXR1cm4gKHhlbmRldi0+c3RhdGUgIT0gWGVuYnVzU3RhdGVDb25uZWN0ZWQgfHwKLQkJKHhlbmRydi0+aXNfcmVhZHkgJiYgIXhlbmRydi0+aXNfcmVhZHkoeGVuZGV2KSkpOworCXJldHVybiAoeGVuZGV2LT5zdGF0ZSA8IFhlbmJ1c1N0YXRlQ29ubmVjdGVkIHx8CisJCSh4ZW5kZXYtPnN0YXRlID09IFhlbmJ1c1N0YXRlQ29ubmVjdGVkICYmCisJCSB4ZW5kcnYtPmlzX3JlYWR5ICYmICF4ZW5kcnYtPmlzX3JlYWR5KHhlbmRldikpKTsKIH0KIAotc3RhdGljIGludCBleGlzdHNfZGlzY29ubmVjdGVkX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQorc3RhdGljIGludCBleGlzdHNfY29ubmVjdGluZ19kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKIAlyZXR1cm4gYnVzX2Zvcl9lYWNoX2RldigmeGVuYnVzX2Zyb250ZW5kLmJ1cywgTlVMTCwgZHJ2LAotCQkJCWlzX2Rpc2Nvbm5lY3RlZF9kZXZpY2UpOworCQkJCWlzX2RldmljZV9jb25uZWN0aW5nKTsKIH0KIAogc3RhdGljIGludCBwcmludF9kZXZpY2Vfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKQEAgLTg4NCwxMCArODg1LDEzIEBACiAJCS8qIEluZm9ybWF0aW9uIG9ubHk6IGlzIHRoaXMgdG9vIG5vaXN5PyAqLwogCQlwcmludGsoS0VSTl9JTkZPICJYRU5CVVM6IERldmljZSB3aXRoIG5vIGRyaXZlcjogJXNcbiIsCiAJCSAgICAgICB4ZW5kZXYtPm5vZGVuYW1lKTsKLQl9IGVsc2UgaWYgKHhlbmRldi0+c3RhdGUgIT0gWGVuYnVzU3RhdGVDb25uZWN0ZWQpIHsKKwl9IGVsc2UgaWYgKHhlbmRldi0+c3RhdGUgPCBYZW5idXNTdGF0ZUNvbm5lY3RlZCkgeworCQllbnVtIHhlbmJ1c19zdGF0ZSByc3RhdGUgPSBYZW5idXNTdGF0ZVVua25vd247CisJCWlmICh4ZW5kZXYtPm90aGVyZW5kKQorCQkJcnN0YXRlID0geGVuYnVzX3JlYWRfZHJpdmVyX3N0YXRlKHhlbmRldi0+b3RoZXJlbmQpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IFRpbWVvdXQgY29ubmVjdGluZyAiCi0JCSAgICAgICAidG8gZGV2aWNlOiAlcyAoc3RhdGUgJWQpXG4iLAotCQkgICAgICAgeGVuZGV2LT5ub2RlbmFtZSwgeGVuZGV2LT5zdGF0ZSk7CisJCSAgICAgICAidG8gZGV2aWNlOiAlcyAobG9jYWwgc3RhdGUgJWQsIHJlbW90ZSBzdGF0ZSAlZClcbiIsCisJCSAgICAgICB4ZW5kZXYtPm5vZGVuYW1lLCB4ZW5kZXYtPnN0YXRlLCByc3RhdGUpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODk3LDcgKzkwMSw3IEBACiBzdGF0aWMgaW50IHJlYWR5X3RvX3dhaXRfZm9yX2RldmljZXM7CiAKIC8qCi0gKiBPbiBhIDEwIHNlY29uZCB0aW1lb3V0LCB3YWl0IGZvciBhbGwgZGV2aWNlcyBjdXJyZW50bHkgY29uZmlndXJlZC4gIFdlIG5lZWQKKyAqIE9uIGEgNS1taW51dGUgdGltZW91dCwgd2FpdCBmb3IgYWxsIGRldmljZXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuICBXZSBuZWVkCiAgKiB0byBkbyB0aGlzIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBmaWxlc3lzdGVtcyBhbmQgLyBvciBuZXR3b3JrIGRldmljZXMKICAqIG5lZWRlZCBmb3IgYm9vdCBhcmUgYXZhaWxhYmxlLCBiZWZvcmUgd2UgY2FuIGFsbG93IHRoZSBib290IHRvIHByb2NlZWQuCiAgKgpAQCAtOTEyLDE4ICs5MTYsMzAgQEAKICAqLwogc3RhdGljIHZvaWQgd2FpdF9mb3JfZGV2aWNlcyhzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqeGVuZHJ2KQogewotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAxMCpIWjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0geGVuZHJ2ID8gJnhlbmRydi0+ZHJpdmVyIDogTlVMTDsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kc193YWl0ZWQgPSAwOwogCiAJaWYgKCFyZWFkeV90b193YWl0X2Zvcl9kZXZpY2VzIHx8ICF4ZW5fZG9tYWluKCkpCiAJCXJldHVybjsKIAotCXdoaWxlIChleGlzdHNfZGlzY29ubmVjdGVkX2RldmljZShkcnYpKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQkJYnJlYWs7CisJd2hpbGUgKGV4aXN0c19jb25uZWN0aW5nX2RldmljZShkcnYpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgKHNlY29uZHNfd2FpdGVkKzUpKkhaKSkgeworCQkJaWYgKCFzZWNvbmRzX3dhaXRlZCkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IFdhaXRpbmcgZm9yICIKKwkJCQkgICAgICAgImRldmljZXMgdG8gaW5pdGlhbGlzZTogIik7CisJCQlzZWNvbmRzX3dhaXRlZCArPSA1OworCQkJcHJpbnRrKCIldXMuLi4iLCAzMDAgLSBzZWNvbmRzX3dhaXRlZCk7CisJCQlpZiAoc2Vjb25kc193YWl0ZWQgPT0gMzAwKQorCQkJCWJyZWFrOworCQl9CisKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaLzEwKTsKIAl9CiAKKwlpZiAoc2Vjb25kc193YWl0ZWQpCisJCXByaW50aygiXG4iKTsKKwogCWJ1c19mb3JfZWFjaF9kZXYoJnhlbmJ1c19mcm9udGVuZC5idXMsIE5VTEwsIGRydiwKIAkJCSBwcmludF9kZXZpY2Vfc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCBiOWIzYmI1Li5kMTVlYTE3IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC03NjcsNyArNzY3LDcgQEAKIAkKIAljdXJyZW50LT5tbS0+c3RhcnRfc3RhY2sgPSBicHJtLT5wOwogCi0JLyogTm93IHdlIGRvIGEgbGl0dGxlIGdydW5neSB3b3JrIGJ5IG1tYXBpbmcgdGhlIEVMRiBpbWFnZSBpbnRvCisJLyogTm93IHdlIGRvIGEgbGl0dGxlIGdydW5neSB3b3JrIGJ5IG1tYXBwaW5nIHRoZSBFTEYgaW1hZ2UgaW50bwogCSAgIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIG1lbW9yeS4gKi8KIAlmb3IoaSA9IDAsIGVsZl9wcG50ID0gZWxmX3BoZGF0YTsKIAkgICAgaSA8IGxvYy0+ZWxmX2V4LmVfcGhudW07IGkrKywgZWxmX3BwbnQrKykgewpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCBlMjNhNjNmLi43NmU2NzEzIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMjcyLDcgKzI3Miw3IEBACiAgKiAgIGZvciBhICZzdHJ1Y3QgYmlvIHRvIGJlY29tZSBmcmVlLiBJZiBhICVOVUxMIEBicyBpcyBwYXNzZWQgaW4sIHdlIHdpbGwKICAqICAgZmFsbCBiYWNrIHRvIGp1c3QgdXNpbmcgQGttYWxsb2MgdG8gYWxsb2NhdGUgdGhlIHJlcXVpcmVkIG1lbW9yeS4KICAqCi0gKiAgIE5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3Qgc2V0IC0+YmlfZGVzdHJ1Y3RvciBvbiBzdWNjZXNmdWwgcmV0dXJuCisgKiAgIE5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3Qgc2V0IC0+YmlfZGVzdHJ1Y3RvciBvbiBzdWNjZXNzZnVsIHJldHVybgogICogICBvZiBhIGJpbywgdG8gZG8gdGhlIGFwcHJvcHJpYXRlIGZyZWVpbmcgb2YgdGhlIGJpbyBvbmNlIHRoZSByZWZlcmVuY2UKICAqICAgY291bnQgZHJvcHMgdG8gemVyby4KICAqKi8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9tYXAuYyBiL2ZzL2J0cmZzL2V4dGVudF9tYXAuYwppbmRleCBjY2JkY2I1Li40NmJlYTBmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfbWFwLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50X21hcC5jCkBAIC0yNTYsNyArMjU2LDcgQEAKICAqIEluc2VydCBAZW0gaW50byBAdHJlZSBvciBwZXJmb3JtIGEgc2ltcGxlIGZvcndhcmQvYmFja3dhcmQgbWVyZ2Ugd2l0aAogICogZXhpc3RpbmcgbWFwcGluZ3MuICBUaGUgZXh0ZW50X21hcCBzdHJ1Y3QgcGFzc2VkIGluIHdpbGwgYmUgaW5zZXJ0ZWQKICAqIGludG8gdGhlIHRyZWUgZGlyZWN0bHksIHdpdGggYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdGFrZW4sIG9yIGEKLSAqIHJlZmVyZW5jZSBkcm9wcGVkIGlmIHRoZSBtZXJnZSBhdHRlbXB0IHdhcyBzdWNlc3NmdWxsLgorICogcmVmZXJlbmNlIGRyb3BwZWQgaWYgdGhlIG1lcmdlIGF0dGVtcHQgd2FzIHN1Y2Nlc3NmdWxsLgogICovCiBpbnQgYWRkX2V4dGVudF9tYXBwaW5nKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsCiAJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pCmRpZmYgLS1naXQgYS9mcy9jaWZzL1JFQURNRSBiL2ZzL2NpZnMvUkVBRE1FCmluZGV4IDc5YzFhOTMuLmE3MjdiN2MgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvUkVBRE1FCisrKyBiL2ZzL2NpZnMvUkVBRE1FCkBAIC00MjMsNyArNDIzLDcgQEAKIAkJc291cmNlIG5hbWUgdG8gdXNlIHRvIHJlcHJlc2VudCB0aGUgY2xpZW50IG5ldGJpb3MgbWFjaGluZSAKIAkJbmFtZSB3aGVuIGRvaW5nIHRoZSBSRkMxMDAxIG5ldGJpb3Mgc2Vzc2lvbiBpbml0aWFsaXplLgogICBkaXJlY3QgICAgICAgIERvIG5vdCBkbyBpbm9kZSBkYXRhIGNhY2hpbmcgb24gZmlsZXMgb3BlbmVkIG9uIHRoaXMgbW91bnQuCi0JCVRoaXMgcHJlY2x1ZGVzIG1tYXBpbmcgZmlsZXMgb24gdGhpcyBtb3VudC4gSW4gc29tZSBjYXNlcworCQlUaGlzIHByZWNsdWRlcyBtbWFwcGluZyBmaWxlcyBvbiB0aGlzIG1vdW50LiBJbiBzb21lIGNhc2VzCiAJCXdpdGggZmFzdCBuZXR3b3JrcyBhbmQgbGl0dGxlIG9yIG5vIGNhY2hpbmcgYmVuZWZpdHMgb24gdGhlCiAJCWNsaWVudCAoZS5nLiB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBkb2luZyBsYXJnZSBzZXF1ZW50aWFsCiAJCXJlYWRzIGJpZ2dlciB0aGFuIHBhZ2Ugc2l6ZSB3aXRob3V0IHJlcmVhZGluZyB0aGUgc2FtZSBkYXRhKSAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2dsb2IuaCBiL2ZzL2NpZnMvY2lmc2dsb2IuaAppbmRleCA1ZDBmZGUxLi40YjM1ZjdlIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNnbG9iLmgKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC0zOSw3ICszOSw3IEBACiAKIC8qCiAgKiBNQVhfUkVRIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IFdFIHdpbGwgc2VuZAotICogb24gb25lIHNvY2tldCBjb25jdXJlbnRseS4gSXQgYWxzbyBtYXRjaGVzIHRoZSBtb3N0IGNvbW1vbgorICogb24gb25lIHNvY2tldCBjb25jdXJyZW50bHkuIEl0IGFsc28gbWF0Y2hlcyB0aGUgbW9zdCBjb21tb24KICAqIHZhbHVlIG9mIG1heCBtdWx0aXBsZXggcmV0dXJuZWQgYnkgc2VydmVycy4gIFdlIG1heQogICogZXZlbnR1YWxseSB3YW50IHRvIHVzZSB0aGUgbmVnb3RpYXRlZCB2YWx1ZSAoaW4gY2FzZQogICogZnV0dXJlIHNlcnZlcnMgY2FuIGhhbmRsZSBtb3JlKSB3aGVuIHdlIGFyZSBtb3JlIGNvbmZpZGVudCB0aGF0CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNwZHUuaCBiL2ZzL2NpZnMvY2lmc3BkdS5oCmluZGV4IDJkMDdmODkuLjM4Nzc3MzcgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3BkdS5oCisrKyBiL2ZzL2NpZnMvY2lmc3BkdS5oCkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogLyogZW1wdHkgd2N0IHJlc3BvbnNlIHRvIHNldGF0dHIgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBOVCBUcmFuc2FjdCBzdHJ1Y3R1cmUgZGVmaW50aW9ucyBmb2xsb3cgICAgICAgICAgICAgKi8KKy8qIE5UIFRyYW5zYWN0IHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb2xsb3cgICAgICAgICAgICAqLwogLyogQ3VycmVudGx5IG9ubHkgaW9jdGwsIGFjbCAoZ2V0IHNlY3VyaXR5IGRlc2NyaXB0b3IpICovCiAvKiBhbmQgbm90aWZ5IGFyZSBpbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IGNhYmFiZDguLmNmMThlZTcgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTkxNCw4ICs5MTQsOCBAQAogLyoKICAqIElmIGRlbnRyeS0+ZF9pbm9kZSBpcyBudWxsICh1c3VhbGx5IG1lYW5pbmcgdGhlIGNhY2hlZCBkZW50cnkKICAqIGlzIGEgbmVnYXRpdmUgZGVudHJ5KSB0aGVuIHdlIHdvdWxkIGF0dGVtcHQgYSBzdGFuZGFyZCBTTUIgZGVsZXRlLCBidXQKLSAqIGlmIHRoYXQgZmFpbHMgd2UgY2FuIG5vdCBhdHRlbXB0IHRoZSBmYWxsIGJhY2sgbWVjaGFuaXNtcyBvbiBFQUNFU1MKLSAqIGJ1dCB3aWxsIHJldHVybiB0aGUgRUFDRVNTIHRvIHRoZSBjYWxsZXIuICBOb3RlIHRoYXQgdGhlIFZGUyBkb2VzIG5vdCBjYWxsCisgKiBpZiB0aGF0IGZhaWxzIHdlIGNhbiBub3QgYXR0ZW1wdCB0aGUgZmFsbCBiYWNrIG1lY2hhbmlzbXMgb24gRUFDQ0VTUworICogYnV0IHdpbGwgcmV0dXJuIHRoZSBFQUNDRVNTIHRvIHRoZSBjYWxsZXIuIE5vdGUgdGhhdCB0aGUgVkZTIGRvZXMgbm90IGNhbGwKICAqIHVubGluayBvbiBuZWdhdGl2ZSBkZW50cmllcyBjdXJyZW50bHkuCiAgKi8KIGludCBjaWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zbWJkZXMuYyBiL2ZzL2NpZnMvc21iZGVzLmMKaW5kZXggMjI0YTFmNC4uYjZiNmRjYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zbWJkZXMuYworKysgYi9mcy9jaWZzL3NtYmRlcy5jCkBAIC0zNzEsNyArMzcxLDcgQEAKIAlzbWJoYXNoKHAyNCArIDE2LCBjOCwgcDIxICsgMTQsIDEpOwogfQogCi0jaWYgMCAvKiBjdXJyZW50bHkgdW5zdWVkICovCisjaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkICovCiBzdGF0aWMgdm9pZAogRF9QMTYodW5zaWduZWQgY2hhciAqcDE0LCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0KQogewpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCAyMjllNzIyLi4yMzQ2ODk1IDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMTkyMCw3ICsxOTIwLDcgQEAKICNlbmRpZgogI2lmZGVmIFRJT0NTVEFSVAogLyoKLSAqIEZvciB0aGVzZSB0d28gd2UgaGF2ZSBkZWZpbnRpb25zIGluIGlvY3Rscy5oIGFuZC9vciB0ZXJtaW9zLmggb24KKyAqIEZvciB0aGVzZSB0d28gd2UgaGF2ZSBkZWZpbml0aW9ucyBpbiBpb2N0bHMuaCBhbmQvb3IgdGVybWlvcy5oIG9uCiAgKiBzb21lIGFyY2hpdGVjdHVyZXMgYnV0IG5vIGFjdHVhbCBpbXBsZW1lbnRpb24uICBTb21lIGFwcGxpY2F0aW9ucwogICogbGlrZSBiYXNoIGNhbGwgdGhlbSBpZiB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBoZWFkZXJzLCBzbyB3ZSBwcm92aWRlCiAgKiBlbnRyaWVzIGhlcmUgdG8gYXZvaWQgc3lzbG9nIG1lc3NhZ2Ugc3Bldy4KZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwppbmRleCBkMjI0MzhlLi4wZDIzYjUyIDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2lub2RlLmMKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIC8qKgogICogZGVidWdmc19jcmVhdGVfZmlsZSAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbQogICogQG5hbWU6IGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KLSAqIEBtb2RlOiB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZSBmaWxlIHNob3VsZCBoYXZlCisgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZS4KICAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQogICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQogICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KQEAgLTE5NSw4ICsxOTUsOCBAQAogICogICAgICAgIHRoaXMgZmlsZS4KICAqCiAgKiBUaGlzIGlzIHRoZSBiYXNpYyAiY3JlYXRlIGEgZmlsZSIgZnVuY3Rpb24gZm9yIGRlYnVnZnMuICBJdCBhbGxvd3MgZm9yIGEKLSAqIHdpZGUgcmFuZ2Ugb2YgZmxleGliaWxpdHkgaW4gY3JlYXRlaW5nIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgKGlmIHlvdQotICogd2FudCB0byBjcmVhdGUgYSBkaXJlY3RvcnksIHRoZSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoKSBmdW5jdGlvbiBpcworICogd2lkZSByYW5nZSBvZiBmbGV4aWJpbGl0eSBpbiBjcmVhdGluZyBhIGZpbGUsIG9yIGEgZGlyZWN0b3J5IChpZiB5b3Ugd2FudAorICogdG8gY3JlYXRlIGEgZGlyZWN0b3J5LCB0aGUgZGVidWdmc19jcmVhdGVfZGlyKCkgZnVuY3Rpb24gaXMKICAqIHJlY29tbWVuZGVkIHRvIGJlIHVzZWQgaW5zdGVhZC4pCiAgKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCmRpZmYgLS1naXQgYS9mcy9kbG0vY29uZmlnLmMgYi9mcy9kbG0vY29uZmlnLmMKaW5kZXggZmQ5ODU5Zi4uMGRmMjQzOCAxMDA2NDQKLS0tIGEvZnMvZGxtL2NvbmZpZy5jCisrKyBiL2ZzL2RsbS9jb25maWcuYwpAQCAtNDEwLDEwICs0MTAsMTAgQEAKIAlzdHJ1Y3QgZGxtX2NvbW1zICpjbXMgPSBOVUxMOwogCXZvaWQgKmdwcyA9IE5VTEw7CiAKLQljbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fY2x1c3RlciksIEdGUF9LRVJORUwpOwotCWdwcyA9IGtjYWxsb2MoMywgc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXAgKiksIEdGUF9LRVJORUwpOwotCXNwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fc3BhY2VzKSwgR0ZQX0tFUk5FTCk7Ci0JY21zID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9jb21tcyksIEdGUF9LRVJORUwpOworCWNsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9jbHVzdGVyKSwgR0ZQX05PRlMpOworCWdwcyA9IGtjYWxsb2MoMywgc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXAgKiksIEdGUF9OT0ZTKTsKKwlzcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX3NwYWNlcyksIEdGUF9OT0ZTKTsKKwljbXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2NvbW1zKSwgR0ZQX05PRlMpOwogCiAJaWYgKCFjbCB8fCAhZ3BzIHx8ICFzcHMgfHwgIWNtcykKIAkJZ290byBmYWlsOwpAQCAtNDgyLDkgKzQ4Miw5IEBACiAJc3RydWN0IGRsbV9ub2RlcyAqbmRzID0gTlVMTDsKIAl2b2lkICpncHMgPSBOVUxMOwogCi0Jc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX3NwYWNlKSwgR0ZQX0tFUk5FTCk7Ci0JZ3BzID0ga2NhbGxvYygyLCBzaXplb2Yoc3RydWN0IGNvbmZpZ19ncm91cCAqKSwgR0ZQX0tFUk5FTCk7Ci0JbmRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9ub2RlcyksIEdGUF9LRVJORUwpOworCXNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9zcGFjZSksIEdGUF9OT0ZTKTsKKwlncHMgPSBrY2FsbG9jKDIsIHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwICopLCBHRlBfTk9GUyk7CisJbmRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9ub2RlcyksIEdGUF9OT0ZTKTsKIAogCWlmICghc3AgfHwgIWdwcyB8fCAhbmRzKQogCQlnb3RvIGZhaWw7CkBAIC01MzYsNyArNTM2LDcgQEAKIHsKIAlzdHJ1Y3QgZGxtX2NvbW0gKmNtOwogCi0JY20gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2NvbW0pLCBHRlBfS0VSTkVMKTsKKwljbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fY29tbSksIEdGUF9OT0ZTKTsKIAlpZiAoIWNtKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtNTY5LDcgKzU2OSw3IEBACiAJc3RydWN0IGRsbV9zcGFjZSAqc3AgPSBjb25maWdfaXRlbV90b19zcGFjZShnLT5jZ19pdGVtLmNpX3BhcmVudCk7CiAJc3RydWN0IGRsbV9ub2RlICpuZDsKIAotCW5kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJbmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX25vZGUpLCBHRlBfTk9GUyk7CiAJaWYgKCFuZCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKQEAgLTcwNSw3ICs3MDUsNyBAQAogCWlmIChjbS0+YWRkcl9jb3VudCA+PSBETE1fTUFYX0FERFJfQ09VTlQpCiAJCXJldHVybiAtRU5PU1BDOwogCi0JYWRkciA9IGt6YWxsb2Moc2l6ZW9mKCphZGRyKSwgR0ZQX0tFUk5FTCk7CisJYWRkciA9IGt6YWxsb2Moc2l6ZW9mKCphZGRyKSwgR0ZQX05PRlMpOwogCWlmICghYWRkcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTg2OCw3ICs4NjgsNyBAQAogCiAJaWRzX2NvdW50ID0gc3AtPm1lbWJlcnNfY291bnQ7CiAKLQlpZHMgPSBrY2FsbG9jKGlkc19jb3VudCwgc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCWlkcyA9IGtjYWxsb2MoaWRzX2NvdW50LCBzaXplb2YoaW50KSwgR0ZQX05PRlMpOwogCWlmICghaWRzKSB7CiAJCXJ2ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC04ODYsNyArODg2LDcgQEAKIAlpZiAoIW5ld19jb3VudCkKIAkJZ290byBvdXRfaWRzOwogCi0JbmV3ID0ga2NhbGxvYyhuZXdfY291bnQsIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwluZXcgPSBrY2FsbG9jKG5ld19jb3VudCwgc2l6ZW9mKGludCksIEdGUF9OT0ZTKTsKIAlpZiAoIW5ldykgewogCQlrZnJlZShpZHMpOwogCQlydiA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9mcy9kbG0vZGVidWdfZnMuYyBiL2ZzL2RsbS9kZWJ1Z19mcy5jCmluZGV4IDFjOGJiOGMuLjM3NWEyMzUgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9kZWJ1Z19mcy5jCisrKyBiL2ZzL2RsbS9kZWJ1Z19mcy5jCkBAIC00MDQsNyArNDA0LDcgQEAKIAlpZiAoYnVja2V0ID49IGxzLT5sc19yc2J0Ymxfc2l6ZSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByc2J0YmxfaXRlciksIEdGUF9LRVJORUwpOworCXJpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzYnRibF9pdGVyKSwgR0ZQX05PRlMpOwogCWlmICghcmkpCiAJCXJldHVybiBOVUxMOwogCWlmIChuID09IDApCmRpZmYgLS1naXQgYS9mcy9kbG0vZGlyLmMgYi9mcy9kbG0vZGlyLmMKaW5kZXggYzRkZmExZC4uN2I4NGMxZCAxMDA2NDQKLS0tIGEvZnMvZGxtL2Rpci5jCisrKyBiL2ZzL2RsbS9kaXIuYwpAQCAtNDksOCArNDksNyBAQAogCXNwaW5fdW5sb2NrKCZscy0+bHNfcmVjb3Zlcl9saXN0X2xvY2spOwogCiAJaWYgKCFmb3VuZCkKLQkJZGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2RpcmVudHJ5KSArIGxlbiwKLQkJCSAgICAgbHMtPmxzX2FsbG9jYXRpb24pOworCQlkZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fZGlyZW50cnkpICsgbGVuLCBHRlBfTk9GUyk7CiAJcmV0dXJuIGRlOwogfQogCkBAIC0yMTIsNyArMjExLDcgQEAKIAogCWRsbV9kaXJfY2xlYXIobHMpOwogCi0JbGFzdF9uYW1lID0ga21hbGxvYyhETE1fUkVTTkFNRV9NQVhMRU4sIGxzLT5sc19hbGxvY2F0aW9uKTsKKwlsYXN0X25hbWUgPSBrbWFsbG9jKERMTV9SRVNOQU1FX01BWExFTiwgR0ZQX05PRlMpOwogCWlmICghbGFzdF9uYW1lKQogCQlnb3RvIG91dDsKIApAQCAtMzIzLDcgKzMyMiw3IEBACiAJaWYgKG5hbWVsZW4gPiBETE1fUkVTTkFNRV9NQVhMRU4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2RpcmVudHJ5KSArIG5hbWVsZW4sIGxzLT5sc19hbGxvY2F0aW9uKTsKKwlkZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fZGlyZW50cnkpICsgbmFtZWxlbiwgR0ZQX05PRlMpOwogCWlmICghZGUpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9mcy9kbG0vZGxtX2ludGVybmFsLmggYi9mcy9kbG0vZGxtX2ludGVybmFsLmgKaW5kZXggZDAxY2EwYS4uODI2ZDNkYyAxMDA2NDQKLS0tIGEvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCisrKyBiL2ZzL2RsbS9kbG1faW50ZXJuYWwuaApAQCAtNDczLDcgKzQ3Myw2IEBACiAJaW50CQkJbHNfbG93X25vZGVpZDsKIAlpbnQJCQlsc190b3RhbF93ZWlnaHQ7CiAJaW50CQkJKmxzX25vZGVfYXJyYXk7Ci0JZ2ZwX3QJCQlsc19hbGxvY2F0aW9uOwogCiAJc3RydWN0IGRsbV9yc2IJCWxzX3N0dWJfcnNiOwkvKiBmb3IgcmV0dXJuaW5nIGVycm9ycyAqLwogCXN0cnVjdCBkbG1fbGtiCQlsc19zdHViX2xrYjsJLyogZm9yIHJldHVybmluZyBlcnJvcnMgKi8KZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb2NrLmMgYi9mcy9kbG0vbG9jay5jCmluZGV4IGViNTA3YzQuLjljMGMxZGIgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb2NrLmMKKysrIGIvZnMvZGxtL2xvY2suYwpAQCAtMjY4OSw3ICsyNjg5LDcgQEAKIAkgICBwYXNzIGludG8gbG93Y29tbXNfY29tbWl0IGFuZCBhIG1lc3NhZ2UgYnVmZmVyIChtYikgdGhhdCB3ZQogCSAgIHdyaXRlIG91ciBkYXRhIGludG8gKi8KIAotCW1oID0gZGxtX2xvd2NvbW1zX2dldF9idWZmZXIodG9fbm9kZWlkLCBtYl9sZW4sIGxzLT5sc19hbGxvY2F0aW9uLCAmbWIpOworCW1oID0gZGxtX2xvd2NvbW1zX2dldF9idWZmZXIodG9fbm9kZWlkLCBtYl9sZW4sIEdGUF9OT0ZTLCAmbWIpOwogCWlmICghbWgpCiAJCXJldHVybiAtRU5PQlVGUzsKIApAQCAtNDUxMiw3ICs0NTEyLDcgQEAKIAl9CiAKIAlpZiAoZmxhZ3MgJiBETE1fTEtGX1ZBTEJMSykgewotCQl1YS0+bGtzYi5zYl9sdmJwdHIgPSBremFsbG9jKERMTV9VU0VSX0xWQl9MRU4sIEdGUF9LRVJORUwpOworCQl1YS0+bGtzYi5zYl9sdmJwdHIgPSBremFsbG9jKERMTV9VU0VSX0xWQl9MRU4sIEdGUF9OT0ZTKTsKIAkJaWYgKCF1YS0+bGtzYi5zYl9sdmJwdHIpIHsKIAkJCWtmcmVlKHVhKTsKIAkJCV9fcHV0X2xrYihscywgbGtiKTsKQEAgLTQ1ODIsNyArNDU4Miw3IEBACiAJdWEgPSBsa2ItPmxrYl91YTsKIAogCWlmIChmbGFncyAmIERMTV9MS0ZfVkFMQkxLICYmICF1YS0+bGtzYi5zYl9sdmJwdHIpIHsKLQkJdWEtPmxrc2Iuc2JfbHZicHRyID0ga3phbGxvYyhETE1fVVNFUl9MVkJfTEVOLCBHRlBfS0VSTkVMKTsKKwkJdWEtPmxrc2Iuc2JfbHZicHRyID0ga3phbGxvYyhETE1fVVNFUl9MVkJfTEVOLCBHRlBfTk9GUyk7CiAJCWlmICghdWEtPmxrc2Iuc2JfbHZicHRyKSB7CiAJCQllcnJvciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF9wdXQ7CmRpZmYgLS1naXQgYS9mcy9kbG0vbG9ja3NwYWNlLmMgYi9mcy9kbG0vbG9ja3NwYWNlLmMKaW5kZXggZDQ4OWZjYy4uYzAxMGVjZiAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvY2tzcGFjZS5jCisrKyBiL2ZzL2RsbS9sb2Nrc3BhY2UuYwpAQCAtNDMwLDcgKzQzMCw3IEBACiAKIAllcnJvciA9IC1FTk9NRU07CiAKLQlscyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fbHMpICsgbmFtZWxlbiwgR0ZQX0tFUk5FTCk7CisJbHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2xzKSArIG5hbWVsZW4sIEdGUF9OT0ZTKTsKIAlpZiAoIWxzKQogCQlnb3RvIG91dDsKIAltZW1jcHkobHMtPmxzX25hbWUsIG5hbWUsIG5hbWVsZW4pOwpAQCAtNDQzLDExICs0NDMsNiBAQAogCWlmIChmbGFncyAmIERMTV9MU0ZMX1RJTUVXQVJOKQogCQlzZXRfYml0KExTRkxfVElNRVdBUk4sICZscy0+bHNfZmxhZ3MpOwogCi0JaWYgKGZsYWdzICYgRExNX0xTRkxfRlMpCi0JCWxzLT5sc19hbGxvY2F0aW9uID0gR0ZQX05PRlM7Ci0JZWxzZQotCQlscy0+bHNfYWxsb2NhdGlvbiA9IEdGUF9LRVJORUw7Ci0KIAkvKiBsc19leGZsYWdzIGFyZSBmb3JjZWQgdG8gbWF0Y2ggYW1vbmcgbm9kZXMsIGFuZCB3ZSBkb24ndAogCSAgIG5lZWQgdG8gcmVxdWlyZSBhbGwgbm9kZXMgdG8gaGF2ZSBzb21lIGZsYWdzIHNldCAqLwogCWxzLT5sc19leGZsYWdzID0gKGZsYWdzICYgfihETE1fTFNGTF9USU1FV0FSTiB8IERMTV9MU0ZMX0ZTIHwKQEAgLTQ1Niw3ICs0NTEsNyBAQAogCXNpemUgPSBkbG1fY29uZmlnLmNpX3JzYnRibF9zaXplOwogCWxzLT5sc19yc2J0Ymxfc2l6ZSA9IHNpemU7CiAKLQlscy0+bHNfcnNidGJsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9yc2J0YWJsZSkgKiBzaXplLCBHRlBfS0VSTkVMKTsKKwlscy0+bHNfcnNidGJsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9yc2J0YWJsZSkgKiBzaXplLCBHRlBfTk9GUyk7CiAJaWYgKCFscy0+bHNfcnNidGJsKQogCQlnb3RvIG91dF9sc2ZyZWU7CiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewpAQCAtNDY4LDcgKzQ2Myw3IEBACiAJc2l6ZSA9IGRsbV9jb25maWcuY2lfbGtidGJsX3NpemU7CiAJbHMtPmxzX2xrYnRibF9zaXplID0gc2l6ZTsKIAotCWxzLT5sc19sa2J0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2xrYnRhYmxlKSAqIHNpemUsIEdGUF9LRVJORUwpOworCWxzLT5sc19sa2J0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2xrYnRhYmxlKSAqIHNpemUsIEdGUF9OT0ZTKTsKIAlpZiAoIWxzLT5sc19sa2J0YmwpCiAJCWdvdG8gb3V0X3JzYmZyZWU7CiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewpAQCAtNDgwLDcgKzQ3NSw3IEBACiAJc2l6ZSA9IGRsbV9jb25maWcuY2lfZGlydGJsX3NpemU7CiAJbHMtPmxzX2RpcnRibF9zaXplID0gc2l6ZTsKIAotCWxzLT5sc19kaXJ0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2RpcnRhYmxlKSAqIHNpemUsIEdGUF9LRVJORUwpOworCWxzLT5sc19kaXJ0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2RpcnRhYmxlKSAqIHNpemUsIEdGUF9OT0ZTKTsKIAlpZiAoIWxzLT5sc19kaXJ0YmwpCiAJCWdvdG8gb3V0X2xrYmZyZWU7CiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewpAQCAtNTI3LDcgKzUyMiw3IEBACiAJbXV0ZXhfaW5pdCgmbHMtPmxzX3JlcXVlc3RxdWV1ZV9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmbHMtPmxzX2NsZWFyX3Byb2NfbG9ja3MpOwogCi0JbHMtPmxzX3JlY292ZXJfYnVmID0ga21hbGxvYyhkbG1fY29uZmlnLmNpX2J1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwlscy0+bHNfcmVjb3Zlcl9idWYgPSBrbWFsbG9jKGRsbV9jb25maWcuY2lfYnVmZmVyX3NpemUsIEdGUF9OT0ZTKTsKIAlpZiAoIWxzLT5sc19yZWNvdmVyX2J1ZikKIAkJZ290byBvdXRfZGlyZnJlZTsKIApkaWZmIC0tZ2l0IGEvZnMvZGxtL2xvd2NvbW1zLmMgYi9mcy9kbG0vbG93Y29tbXMuYwppbmRleCA3MDczNmViLi41MmNhYjE2IDEwMDY0NAotLS0gYS9mcy9kbG0vbG93Y29tbXMuYworKysgYi9mcy9kbG0vbG93Y29tbXMuYwpAQCAtMTA2MCw3ICsxMDYwLDcgQEAKIAkJaWYgKGRsbV9vdXJfYWRkcigmc2FzLCBpKSkKIAkJCWJyZWFrOwogCi0JCWFkZHIgPSBrbWFsbG9jKHNpemVvZigqYWRkciksIEdGUF9LRVJORUwpOworCQlhZGRyID0ga21hbGxvYyhzaXplb2YoKmFkZHIpLCBHRlBfTk9GUyk7CiAJCWlmICghYWRkcikKIAkJCWJyZWFrOwogCQltZW1jcHkoYWRkciwgJnNhcywgc2l6ZW9mKCphZGRyKSk7CkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGxvY2FsYWRkcjsKIAlzdHJ1Y3Qgc2N0cF9ldmVudF9zdWJzY3JpYmUgc3Vic2NyaWJlOwogCWludCByZXN1bHQgPSAtRUlOVkFMLCBudW0gPSAxLCBpLCBhZGRyX2xlbjsKLQlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uID0gbm9kZWlkMmNvbigwLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uID0gbm9kZWlkMmNvbigwLCBHRlBfTk9GUyk7CiAJaW50IGJ1ZnNpemUgPSBORUVERURfUk1FTTsKIAogCWlmICghY29uKQpAQCAtMTE3MSw3ICsxMTcxLDcgQEAKIHN0YXRpYyBpbnQgdGNwX2xpc3Rlbl9mb3JfYWxsKHZvaWQpCiB7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IE5VTEw7Ci0Jc3RydWN0IGNvbm5lY3Rpb24gKmNvbiA9IG5vZGVpZDJjb24oMCwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGNvbm5lY3Rpb24gKmNvbiA9IG5vZGVpZDJjb24oMCwgR0ZQX05PRlMpOwogCWludCByZXN1bHQgPSAtRUlOVkFMOwogCiAJaWYgKCFjb24pCmRpZmYgLS1naXQgYS9mcy9kbG0vbWVtYmVyLmMgYi9mcy9kbG0vbWVtYmVyLmMKaW5kZXggYjEyODc3NS4uODRmNzBiZiAxMDA2NDQKLS0tIGEvZnMvZGxtL21lbWJlci5jCisrKyBiL2ZzL2RsbS9tZW1iZXIuYwpAQCAtNDgsNyArNDgsNyBAQAogCXN0cnVjdCBkbG1fbWVtYmVyICptZW1iOwogCWludCB3LCBlcnJvcjsKIAotCW1lbWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX21lbWJlciksIGxzLT5sc19hbGxvY2F0aW9uKTsKKwltZW1iID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9tZW1iZXIpLCBHRlBfTk9GUyk7CiAJaWYgKCFtZW1iKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTQzLDcgKzE0Myw3IEBACiAKIAlscy0+bHNfdG90YWxfd2VpZ2h0ID0gdG90YWw7CiAKLQlhcnJheSA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiB0b3RhbCwgbHMtPmxzX2FsbG9jYXRpb24pOworCWFycmF5ID0ga21hbGxvYyhzaXplb2YoaW50KSAqIHRvdGFsLCBHRlBfTk9GUyk7CiAJaWYgKCFhcnJheSkKIAkJcmV0dXJuOwogCkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlsb2dfZGVidWcobHMsICJuZXcgbm9kZWlkICVkIGlzIGEgcmUtYWRkZWQgbWVtYmVyIiwgcnYtPm5ld1tpXSk7CiAKLQkJbWVtYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fbWVtYmVyKSwgbHMtPmxzX2FsbG9jYXRpb24pOworCQltZW1iID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9tZW1iZXIpLCBHRlBfTk9GUyk7CiAJCWlmICghbWVtYikKIAkJCXJldHVybiAtRU5PTUVNOwogCQltZW1iLT5ub2RlaWQgPSBydi0+bmV3W2ldOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAJaW50ICppZHMgPSBOVUxMLCAqbmV3ID0gTlVMTDsKIAlpbnQgZXJyb3IsIGlkc19jb3VudCA9IDAsIG5ld19jb3VudCA9IDA7CiAKLQlydiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fcmVjb3ZlciksIGxzLT5sc19hbGxvY2F0aW9uKTsKKwlydiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fcmVjb3ZlciksIEdGUF9OT0ZTKTsKIAlpZiAoIXJ2KQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZnMvZGxtL21lbW9yeS5jIGIvZnMvZGxtL21lbW9yeS5jCmluZGV4IGMxNzc1YjguLjhlMGQwMGQgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9tZW1vcnkuYworKysgYi9mcy9kbG0vbWVtb3J5LmMKQEAgLTM5LDcgKzM5LDcgQEAKIHsKIAljaGFyICpwOwogCi0JcCA9IGt6YWxsb2MobHMtPmxzX2x2YmxlbiwgbHMtPmxzX2FsbG9jYXRpb24pOworCXAgPSBremFsbG9jKGxzLT5sc19sdmJsZW4sIEdGUF9OT0ZTKTsKIAlyZXR1cm4gcDsKIH0KIApAQCAtNTcsNyArNTcsNyBAQAogCiAJRExNX0FTU0VSVChuYW1lbGVuIDw9IERMTV9SRVNOQU1FX01BWExFTiwpOwogCi0JciA9IGt6YWxsb2Moc2l6ZW9mKCpyKSArIG5hbWVsZW4sIGxzLT5sc19hbGxvY2F0aW9uKTsKKwlyID0ga3phbGxvYyhzaXplb2YoKnIpICsgbmFtZWxlbiwgR0ZQX05PRlMpOwogCXJldHVybiByOwogfQogCkBAIC03Miw3ICs3Miw3IEBACiB7CiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKIAotCWxrYiA9IGttZW1fY2FjaGVfemFsbG9jKGxrYl9jYWNoZSwgbHMtPmxzX2FsbG9jYXRpb24pOworCWxrYiA9IGttZW1fY2FjaGVfemFsbG9jKGxrYl9jYWNoZSwgR0ZQX05PRlMpOwogCXJldHVybiBsa2I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9uZXRsaW5rLmMgYi9mcy9kbG0vbmV0bGluay5jCmluZGV4IDU1ZWEzNjkuLjA1MjA5NWMgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9uZXRsaW5rLmMKKysrIGIvZnMvZGxtL25ldGxpbmsuYwpAQCAtMjYsNyArMjYsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJdm9pZCAqZGF0YTsKIAotCXNrYiA9IGdlbmxtc2dfbmV3KHNpemUsIEdGUF9LRVJORUwpOworCXNrYiA9IGdlbmxtc2dfbmV3KHNpemUsIEdGUF9OT0ZTKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9wbG9jay5jIGIvZnMvZGxtL3Bsb2NrLmMKaW5kZXggMTZmNjgyZS4uYjVmODlhZSAxMDA2NDQKLS0tIGEvZnMvZGxtL3Bsb2NrLmMKKysrIGIvZnMvZGxtL3Bsb2NrLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAlpZiAoIWxzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXhvcCA9IGt6YWxsb2Moc2l6ZW9mKCp4b3ApLCBHRlBfS0VSTkVMKTsKKwl4b3AgPSBremFsbG9jKHNpemVvZigqeG9wKSwgR0ZQX05PRlMpOwogCWlmICgheG9wKSB7CiAJCXJ2ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0xNDMsNyArMTQzLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRsbV9wb3NpeF9sb2NrKTsKIAotLyogUmV0dXJucyBmYWlsdXJlIGlmZiBhIHN1Y2Nlc2Z1bCBsb2NrIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FuY2VsZWQgKi8KKy8qIFJldHVybnMgZmFpbHVyZSBpZmYgYSBzdWNjZXNzZnVsIGxvY2sgb3BlcmF0aW9uIHNob3VsZCBiZSBjYW5jZWxlZCAqLwogc3RhdGljIGludCBkbG1fcGxvY2tfY2FsbGJhY2soc3RydWN0IHBsb2NrX29wICpvcCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCWlmICghbHMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jb3AgPSBremFsbG9jKHNpemVvZigqb3ApLCBHRlBfS0VSTkVMKTsKKwlvcCA9IGt6YWxsb2Moc2l6ZW9mKCpvcCksIEdGUF9OT0ZTKTsKIAlpZiAoIW9wKSB7CiAJCXJ2ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0yNjYsNyArMjY2LDcgQEAKIAlpZiAoIWxzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW9wID0ga3phbGxvYyhzaXplb2YoKm9wKSwgR0ZQX0tFUk5FTCk7CisJb3AgPSBremFsbG9jKHNpemVvZigqb3ApLCBHRlBfTk9GUyk7CiAJaWYgKCFvcCkgewogCQlydiA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZnMvZGxtL3Jjb20uYyBiL2ZzL2RsbS9yY29tLmMKaW5kZXggNjc1MjJjMi4uM2M4M2E0OSAxMDA2NDQKLS0tIGEvZnMvZGxtL3Jjb20uYworKysgYi9mcy9kbG0vcmNvbS5jCkBAIC0zOCw3ICszOCw3IEBACiAJY2hhciAqbWI7CiAJaW50IG1iX2xlbiA9IHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pICsgbGVuOwogCi0JbWggPSBkbG1fbG93Y29tbXNfZ2V0X2J1ZmZlcih0b19ub2RlaWQsIG1iX2xlbiwgbHMtPmxzX2FsbG9jYXRpb24sICZtYik7CisJbWggPSBkbG1fbG93Y29tbXNfZ2V0X2J1ZmZlcih0b19ub2RlaWQsIG1iX2xlbiwgR0ZQX05PRlMsICZtYik7CiAJaWYgKCFtaCkgewogCQlsb2dfcHJpbnQoImNyZWF0ZV9yY29tIHRvICVkIHR5cGUgJWQgbGVuICVkIEVOT0JVRlMiLAogCQkJICB0b19ub2RlaWQsIHR5cGUsIGxlbik7CmRpZmYgLS1naXQgYS9mcy9kbG0vcmVxdWVzdHF1ZXVlLmMgYi9mcy9kbG0vcmVxdWVzdHF1ZXVlLmMKaW5kZXggN2EyMzA3Yy4uYTQ0ZmEyMiAxMDA2NDQKLS0tIGEvZnMvZGxtL3JlcXVlc3RxdWV1ZS5jCisrKyBiL2ZzL2RsbS9yZXF1ZXN0cXVldWUuYwpAQCAtMzUsNyArMzUsNyBAQAogCXN0cnVjdCBycV9lbnRyeSAqZTsKIAlpbnQgbGVuZ3RoID0gbXMtPm1faGVhZGVyLmhfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBkbG1fbWVzc2FnZSk7CiAKLQllID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJxX2VudHJ5KSArIGxlbmd0aCwgbHMtPmxzX2FsbG9jYXRpb24pOworCWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnFfZW50cnkpICsgbGVuZ3RoLCBHRlBfTk9GUyk7CiAJaWYgKCFlKSB7CiAJCWxvZ19wcmludCgiZGxtX2FkZF9yZXF1ZXN0cXVldWU6IG91dCBvZiBtZW1vcnkgbGVuICVkIiwgbGVuZ3RoKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL3VzZXIuYyBiL2ZzL2RsbS91c2VyLmMKaW5kZXggZWJjZTk5NC4uZTczYTRiYiAxMDA2NDQKLS0tIGEvZnMvZGxtL3VzZXIuYworKysgYi9mcy9kbG0vdXNlci5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JdWEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX3VzZXJfYXJncyksIEdGUF9LRVJORUwpOworCXVhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV91c2VyX2FyZ3MpLCBHRlBfTk9GUyk7CiAJaWYgKCF1YSkKIAkJZ290byBvdXQ7CiAJdWEtPnByb2MgPSBwcm9jOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJaWYgKCFscykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQl1YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fdXNlcl9hcmdzKSwgR0ZQX0tFUk5FTCk7CisJdWEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX3VzZXJfYXJncyksIEdGUF9OT0ZTKTsKIAlpZiAoIXVhKQogCQlnb3RvIG91dDsKIAl1YS0+cHJvYyA9IHByb2M7CkBAIC0zNTIsNyArMzUyLDcgQEAKIAogCWVycm9yID0gLUVOT01FTTsKIAlsZW4gPSBzdHJsZW4obmFtZSkgKyBzdHJsZW4obmFtZV9wcmVmaXgpICsgMjsKLQlscy0+bHNfZGV2aWNlLm5hbWUgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJbHMtPmxzX2RldmljZS5uYW1lID0ga3phbGxvYyhsZW4sIEdGUF9OT0ZTKTsKIAlpZiAoIWxzLT5sc19kZXZpY2UubmFtZSkKIAkJZ290byBmYWlsOwogCkBAIC01MjAsNyArNTIwLDcgQEAKICNlbmRpZgogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWtidWYgPSBremFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisJa2J1ZiA9IGt6YWxsb2MoY291bnQgKyAxLCBHRlBfTk9GUyk7CiAJaWYgKCFrYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNTQ2LDcgKzU0Niw3IEBACiAKIAkJLyogYWRkIDEgYWZ0ZXIgbmFtZWxlbiBzbyB0aGF0IHRoZSBuYW1lIHN0cmluZyBpcyB0ZXJtaW5hdGVkICovCiAJCWtidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX3dyaXRlX3JlcXVlc3QpICsgbmFtZWxlbiArIDEsCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCQkgICAgICAgR0ZQX05PRlMpOwogCQlpZiAoIWtidWYpIHsKIAkJCWtmcmVlKGszMmJ1Zik7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY0OCw3ICs2NDgsNyBAQAogCWlmICghbHMpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JcHJvYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fdXNlcl9wcm9jKSwgR0ZQX0tFUk5FTCk7CisJcHJvYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fdXNlcl9wcm9jKSwgR0ZQX05PRlMpOwogCWlmICghcHJvYykgewogCQlkbG1fcHV0X2xvY2tzcGFjZShscyk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvS2J1aWxkIGIvZnMvZXhvZnMvS2J1aWxkCmluZGV4IGNjMmQyMmQuLjJkMGY3NTcgMTAwNjQ0Ci0tLSBhL2ZzL2V4b2ZzL0tidWlsZAorKysgYi9mcy9leG9mcy9LYnVpbGQKQEAgLTEyLDUgKzEyLDUgQEAKICMgS2J1aWxkIC0gR2V0cyBpbmNsdWRlZCBmcm9tIHRoZSBLZXJuZWxzIE1ha2VmaWxlIGFuZCBidWlsZCBzeXN0ZW0KICMKIAotZXhvZnMteSA6PSBvc2QubyBpbm9kZS5vIGZpbGUubyBzeW1saW5rLm8gbmFtZWkubyBkaXIubyBzdXBlci5vCitleG9mcy15IDo9IGlvcy5vIGlub2RlLm8gZmlsZS5vIHN5bWxpbmsubyBuYW1laS5vIGRpci5vIHN1cGVyLm8KIG9iai0kKENPTkZJR19FWE9GU19GUykgKz0gZXhvZnMubwpkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvY29tbW9uLmggYi9mcy9leG9mcy9jb21tb24uaAppbmRleCBjNjcxOGU0Li5iMWIxNzhlIDEwMDY0NAotLS0gYS9mcy9leG9mcy9jb21tb24uaAorKysgYi9mcy9leG9mcy9jb21tb24uaApAQCAtNDksNiArNDksNyBAQAogI2RlZmluZSBFWE9GU19NSU5fUElEICAgMHgxMDAwMAkvKiBTbWFsbGVzdCBwYXJ0aXRpb24gSUQgKi8KICNkZWZpbmUgRVhPRlNfT0JKX09GRgkweDEwMDAwCS8qIG9mZnNldCBmb3Igb2JqZWN0cyAqLwogI2RlZmluZSBFWE9GU19TVVBFUl9JRAkweDEwMDAwCS8qIG9iamVjdCBJRCBmb3Igb24tZGlzayBzdXBlcmJsb2NrICovCisjZGVmaW5lIEVYT0ZTX0RFVlRBQkxFX0lEIDB4MTAwMDEgLyogb2JqZWN0IElEIGZvciBvbi1kaXNrIGRldmljZSB0YWJsZSAqLwogI2RlZmluZSBFWE9GU19ST09UX0lECTB4MTAwMDIJLyogb2JqZWN0IElEIGZvciByb290IGRpcmVjdG9yeSAqLwogCiAvKiBleG9mcyBBcHBsaWNhdGlvbiBzcGVjaWZpYyBwYWdlL2F0dHJpYnV0ZSAqLwpAQCAtNzgsMTcgKzc5LDY3IEBACiAjZGVmaW5lIEVYT0ZTX1NVUEVSX01BR0lDCTB4NURGNQogCiAvKgotICogVGhlIGZpbGUgc3lzdGVtIGNvbnRyb2wgYmxvY2sgLSBzdG9yZWQgaW4gYW4gb2JqZWN0J3MgZGF0YSAobWFpbmx5LCB0aGUgb25lCi0gKiB3aXRoIElEIEVYT0ZTX1NVUEVSX0lEKS4gIFRoaXMgaXMgd2hlcmUgdGhlIGluLW1lbW9yeSBzdXBlcmJsb2NrIGlzIHN0b3JlZAotICogb24gZGlzay4gIFJpZ2h0IG5vdyBpdCBqdXN0IGhhcyBhIG1hZ2ljIHZhbHVlLCB3aGljaCBpcyBiYXNpY2FsbHkgYSBzYW5pdHkKLSAqIGNoZWNrIG9uIG91ciBhYmlsaXR5IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG9iamVjdCBzdG9yZS4KKyAqIFRoZSBmaWxlIHN5c3RlbSBjb250cm9sIGJsb2NrIC0gc3RvcmVkIGluIG9iamVjdCBFWE9GU19TVVBFUl9JRCdzIGRhdGEuCisgKiBUaGlzIGlzIHdoZXJlIHRoZSBpbi1tZW1vcnkgc3VwZXJibG9jayBpcyBzdG9yZWQgb24gZGlzay4KICAqLworZW51bSB7RVhPRlNfRlNDQl9WRVIgPSAxLCBFWE9GU19EVF9WRVIgPSAxfTsKIHN0cnVjdCBleG9mc19mc2NiIHsKIAlfX2xlNjQgIHNfbmV4dGlkOwkvKiBIaWdoZXN0IG9iamVjdCBJRCB1c2VkICovCi0JX19sZTMyICBzX251bWZpbGVzOwkvKiBOdW1iZXIgb2YgZmlsZXMgb24gZnMgKi8KKwlfX2xlNjQgIHNfbnVtZmlsZXM7CS8qIE51bWJlciBvZiBmaWxlcyBvbiBmcyAqLworCV9fbGUzMglzX3ZlcnNpb247CS8qID09IEVYT0ZTX0ZTQ0JfVkVSICovCiAJX19sZTE2ICBzX21hZ2ljOwkvKiBNYWdpYyBzaWduYXR1cmUgKi8KIAlfX2xlMTYgIHNfbmV3ZnM7CS8qIE5vbi16ZXJvIGlmIHRoaXMgaXMgYSBuZXcgZnMgKi8KLX07CisKKwkvKiBGcm9tIGhlcmUgb24gaXQncyBhIHN0YXRpYyBwYXJ0LCBvbmx5IHdyaXR0ZW4gYnkgbWtleG9mcyAqLworCV9fbGU2NAlzX2Rldl90YWJsZV9vaWQ7ICAgLyogUmVzdXJ2ZWQsIG5vdCB1c2VkICovCisJX19sZTY0CXNfZGV2X3RhYmxlX2NvdW50OyAvKiA9PSAwIG1lYW5zIG5vIGRldl90YWJsZSAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIERlc2NyaWJlcyB0aGUgcmFpZCB1c2VkIGluIHRoZSBGUy4gSXQgaXMgcGFydCBvZiB0aGUgZGV2aWNlIHRhYmxlLgorICogVGhpcyBoZXJlIGlzIHRha2VuIGZyb20gdGhlIHBORlMtb2JqZWN0cyBkZWZpbml0aW9uLiBJbiBleG9mcyB3ZQorICogdXNlIG9uZSByYWlkIHBvbGljeSB0aHJvdWdoLW91dCB0aGUgZmlsZXN5c3RlbS4gKE5PVEU6IHRoZSBmdW5ueQorICogYWxpZ25tZW50IGF0IGJlZ2luaW5nLiBXZSB0YWtlIGNhcmUgb2YgaXQgYXQgZXhvZnNfZGV2aWNlX3RhYmxlLgorICovCitzdHJ1Y3QgZXhvZnNfZHRfZGF0YV9tYXAgeworCV9fbGUzMgljYl9udW1fY29tcHM7CisJX19sZTY0CWNiX3N0cmlwZV91bml0OworCV9fbGUzMgljYl9ncm91cF93aWR0aDsKKwlfX2xlMzIJY2JfZ3JvdXBfZGVwdGg7CisJX19sZTMyCWNiX21pcnJvcl9jbnQ7CisJX19sZTMyCWNiX3JhaWRfYWxnb3JpdGhtOworfSBfX3BhY2tlZDsKKworLyoKKyAqIFRoaXMgaXMgYW4gb3NkIGRldmljZSBpbmZvcm1hdGlvbiBkZXNjcmlwdG9yLiBJdCBpcyBhIHNpbmdsZSBlbnRyeSBpbgorICogdGhlIGV4b2ZzIGRldmljZSB0YWJsZS4gSXQgZGVzY3JpYmVzIGFuIG9zZCB0YXJnZXQgbHVuIHdoaWNoCisgKiBjb250YWlucyBkYXRhIGJlbG9uZ2luZyB0byB0aGlzIEZTLiAoU2FtZSBwYXJ0aXRpb25faWQgb24gYWxsIGRldmljZXMpCisgKi8KK3N0cnVjdCBleG9mc19kdF9kZXZpY2VfaW5mbyB7CisJX19sZTMyCXN5c3RlbWlkX2xlbjsKKwl1OAlzeXN0ZW1pZFtPU0RfU1lTVEVNSURfTEVOXTsKKwlfX2xlNjQJbG9uZ19uYW1lX29mZnNldDsJLyogSWYgITAgdGhlbiBvZmZzZXQtaW4tZmlsZSAqLworCV9fbGUzMglvc2RuYW1lX2xlbjsJCS8qICovCisJdTgJb3NkbmFtZVs0NF07CQkvKiBFbWJiZWRlZCwgVXN1c2FsbHkgYW4gYXNjaSB1dWlkICovCit9IF9fcGFja2VkOworCisvKgorICogVGhlIEVYT0ZTIGRldmljZSB0YWJsZSAtIHN0b3JlZCBpbiBvYmplY3QgRVhPRlNfREVWVEFCTEVfSUQncyBkYXRhLgorICogSXQgY29udGFpbnMgdGhlIHJhaWQgdXNlZCBmb3IgdGhpcyBtdWx0eS1kZXZpY2UgRlMgYW5kIGFuIGFycmF5IG9mCisgKiBwYXJ0aWNpcGF0aW5nIGRldmljZXMuCisgKi8KK3N0cnVjdCBleG9mc19kZXZpY2VfdGFibGUgeworCV9fbGUzMgkJCQlkdF92ZXJzaW9uOwkvKiA9PSBFWE9GU19EVF9WRVIgKi8KKwlzdHJ1Y3QgZXhvZnNfZHRfZGF0YV9tYXAJZHRfZGF0YV9tYXA7CS8qIFJhaWQgcG9saWN5IHRvIHVzZSAqLworCisJLyogUmVzdXJ2ZWQgc3BhY2UgRm9yIGZ1dHVyZSB1c2UuIFRvdGFsIGluY2x1ZGVpbmcgdGhpczoKKwkgKiAoOCAqIHNpemVvZihsZTY0KSkKKwkgKi8KKwlfX2xlNjQJCQkJX19SZXN1cnZlZFs0XTsKKworCV9fbGU2NAkJCQlkdF9udW1fZGV2aWNlczsJLyogQXJyYXkgc2l6ZSAqLworCXN0cnVjdCBleG9mc19kdF9kZXZpY2VfaW5mbwlkdF9kZXZfdGFibGVbXTsJLyogQXJyYXkgb2YgZGV2aWNlcyAqLworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGlub2RlLXJlbGF0ZWQgdGhpbmdzCkBAIC0xNTUsMjIgKzIwNiw0IEBACiAJKCgobmFtZV9sZW4pICsgb2Zmc2V0b2Yoc3RydWN0IGV4b2ZzX2Rpcl9lbnRyeSwgbmFtZSkgICsgXAogCSAgRVhPRlNfRElSX1JPVU5EKSAmIH5FWE9GU19ESVJfUk9VTkQpCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKgotICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBvc2QuYyAgICAgICAgICAgICAgICAgKi8KLXZvaWQgZXhvZnNfbWFrZV9jcmVkZW50aWFsKHU4IGNyZWRfYVtPU0RfQ0FQX0xFTl0sCi0JCQkgICBjb25zdCBzdHJ1Y3Qgb3NkX29ial9pZCAqb2JqKTsKLQotaW50IGV4b2ZzX2NoZWNrX29rX3Jlc2lkKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIHU2NCAqaW5fcmVzaWQsIHU2NCAqb3V0X3Jlc2lkKTsKLXN0YXRpYyBpbmxpbmUgaW50IGV4b2ZzX2NoZWNrX29rKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IpCi17Ci0JcmV0dXJuIGV4b2ZzX2NoZWNrX29rX3Jlc2lkKG9yLCBOVUxMLCBOVUxMKTsKLX0KLWludCBleG9mc19zeW5jX29wKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIGludCB0aW1lb3V0LCB1OCAqY3JlZCk7Ci1pbnQgZXhvZnNfYXN5bmNfb3Aoc3RydWN0IG9zZF9yZXF1ZXN0ICpvciwKLQlvc2RfcmVxX2RvbmVfZm4gKmFzeW5jX2RvbmUsIHZvaWQgKmNhbGxlcl9jb250ZXh0LCB1OCAqY3JlZCk7Ci0KLWludCBleHRyYWN0X2F0dHJfZnJvbV9yZXEoc3RydWN0IG9zZF9yZXF1ZXN0ICpvciwgc3RydWN0IG9zZF9hdHRyICphdHRyKTsKLQogI2VuZGlmIC8qaWZuZGVmIF9fRVhPRlNfQ09NX0hfXyovCmRpZmYgLS1naXQgYS9mcy9leG9mcy9leG9mcy5oIGIvZnMvZXhvZnMvZXhvZnMuaAppbmRleCA1ZWM3MmUwLi5jMzVmZDQ2IDEwMDY0NAotLS0gYS9mcy9leG9mcy9leG9mcy5oCisrKyBiL2ZzL2V4b2ZzL2V4b2ZzLmgKQEAgLTMwLDEzICszMCwxNyBAQAogICogYWxvbmcgd2l0aCBleG9mczsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLworI2lmbmRlZiBfX0VYT0ZTX0hfXworI2RlZmluZSBfX0VYT0ZTX0hfXwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKLSNpZm5kZWYgX19FWE9GU19IX18KLSNkZWZpbmUgX19FWE9GU19IX18KKy8qIEZJWE1FOiBSZW1vdmUgb25jZSBwbmZzIGhpdHMgbWFpbmxpbmUKKyAqICNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy9wbmZzX29zZF94ZHIuaD4KKyAqLworI2luY2x1ZGUgInBuZnMuaCIKIAogI2RlZmluZSBFWE9GU19FUlIoZm10LCBhLi4uKSBwcmludGsoS0VSTl9FUlIgImV4b2ZzOiAiIGZtdCwgIyNhKQogCkBAIC01NSw3ICs1OSw3IEBACiAgKiBvdXIgZXh0ZW5zaW9uIHRvIHRoZSBpbi1tZW1vcnkgc3VwZXJibG9jawogICovCiBzdHJ1Y3QgZXhvZnNfc2JfaW5mbyB7Ci0Jc3RydWN0IG9zZF9kZXYJKnNfZGV2OwkJCS8qIHJldHVybmVkIGJ5IGdldF9vc2RfZGV2ICAgICovCisJc3RydWN0IGV4b2ZzX2ZzY2Igc19mc2NiOwkJLyogV3JpdHRlbiBvZnRlbiwgcHJlLWFsbG9jYXRlKi8KIAlvc2RfaWQJCXNfcGlkOwkJCS8qIHBhcnRpdGlvbiBJRCBvZiBmaWxlIHN5c3RlbSovCiAJaW50CQlzX3RpbWVvdXQ7CQkvKiB0aW1lb3V0IGZvciBPU0Qgb3BlcmF0aW9ucyAqLwogCXVpbnQ2NF90CXNfbmV4dGlkOwkJLyogaGlnaGVzdCBvYmplY3QgSUQgdXNlZCAgICAgKi8KQEAgLTYzLDcgKzY3LDExIEBACiAJc3BpbmxvY2tfdAlzX25leHRfZ2VuX2xvY2s7CS8qIHNwaW5sb2NrIGZvciBnZW4gIyB1cGRhdGUgICovCiAJdTMyCQlzX25leHRfZ2VuZXJhdGlvbjsJLyogbmV4dCBnZW4gIyB0byB1c2UgICAgICAgICAgKi8KIAlhdG9taWNfdAlzX2N1cnJfcGVuZGluZzsJCS8qIG51bWJlciBvZiBwZW5kaW5nIGNvbW1hbmRzICovCi0JdWludDhfdAkJc19jcmVkW09TRF9DQVBfTEVOXTsJLyogYWxsLXBvd2VyZnVsIGNyZWRlbnRpYWwgICAgKi8KKwl1aW50OF90CQlzX2NyZWRbT1NEX0NBUF9MRU5dOwkvKiBjcmVkZW50aWFsIGZvciB0aGUgZnNjYiAgICAqLworCisJc3RydWN0IHBuZnNfb3NkX2RhdGFfbWFwIGRhdGFfbWFwOwkvKiBEZWZhdWx0IHJhaWQgdG8gdXNlICAgICAgICAqLworCXVuc2lnbmVkCXNfbnVtZGV2czsJCS8qIE51bSBvZiBkZXZpY2VzIGluIGFycmF5ICAgICovCisJc3RydWN0IG9zZF9kZXYJKnNfb2RzWzFdOwkJLyogVmFyaWFibGUgbGVuZ3RoLCBtaW5pbXVtIDEgKi8KIH07CiAKIC8qCkBAIC03OSw2ICs4Nyw1MCBAQAogCXN0cnVjdCBpbm9kZSAgIHZmc19pbm9kZTsgICAgICAgICAgLyogbm9ybWFsIGluLW1lbW9yeSBpbm9kZSAgICAgICAgICAqLwogfTsKIAorc3RhdGljIGlubGluZSBvc2RfaWQgZXhvZnNfb2lfb2Jqbm8oc3RydWN0IGV4b2ZzX2lfaW5mbyAqb2kpCit7CisJcmV0dXJuIG9pLT52ZnNfaW5vZGUuaV9pbm8gKyBFWE9GU19PQkpfT0ZGOworfQorCitzdHJ1Y3QgZXhvZnNfaW9fc3RhdGU7Cit0eXBlZGVmIHZvaWQgKCpleG9mc19pb19kb25lX2ZuKShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKm9yLCB2b2lkICpwcml2YXRlKTsKKworc3RydWN0IGV4b2ZzX2lvX3N0YXRlIHsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKworCXZvaWQJCQkqcHJpdmF0ZTsKKwlleG9mc19pb19kb25lX2ZuCWRvbmU7CisKKwlzdHJ1Y3QgZXhvZnNfc2JfaW5mbwkqc2JpOworCXN0cnVjdCBvc2Rfb2JqX2lkCW9iajsKKwl1OAkJCSpjcmVkOworCisJLyogR2xvYmFsIHJlYWQvd3JpdGUgSU8qLworCWxvZmZfdAkJCW9mZnNldDsKKwl1bnNpZ25lZCBsb25nCQlsZW5ndGg7CisJdm9pZAkJCSprZXJuX2J1ZmY7CisJc3RydWN0IGJpbwkJKmJpbzsKKworCS8qIEF0dHJpYnV0ZXMgKi8KKwl1bnNpZ25lZAkJaW5fYXR0cl9sZW47CisJc3RydWN0IG9zZF9hdHRyIAkqaW5fYXR0cjsKKwl1bnNpZ25lZAkJb3V0X2F0dHJfbGVuOworCXN0cnVjdCBvc2RfYXR0ciAJKm91dF9hdHRyOworCisJLyogVmFyaWFibGUgYXJyYXkgb2Ygc2l6ZSBudW1kZXZzICovCisJdW5zaWduZWQgbnVtZGV2czsKKwlzdHJ1Y3QgZXhvZnNfcGVyX2Rldl9zdGF0ZSB7CisJCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3I7CisJCXN0cnVjdCBiaW8gKmJpbzsKKwl9IHBlcl9kZXZbXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZXhvZnNfaW9fc3RhdGVfc2l6ZSh1bnNpZ25lZCBudW1kZXZzKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IGV4b2ZzX2lvX3N0YXRlKSArCisJCXNpemVvZihzdHJ1Y3QgZXhvZnNfcGVyX2Rldl9zdGF0ZSkgKiBudW1kZXZzOworfQorCiAvKgogICogb3VyIGlub2RlIGZsYWdzCiAgKi8KQEAgLTEzMCw2ICsxODIsNDIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKgogICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGlvcy5jICovCit2b2lkIGV4b2ZzX21ha2VfY3JlZGVudGlhbCh1OCBjcmVkX2FbT1NEX0NBUF9MRU5dLAorCQkJICAgY29uc3Qgc3RydWN0IG9zZF9vYmpfaWQgKm9iaik7CitpbnQgZXhvZnNfcmVhZF9rZXJuKHN0cnVjdCBvc2RfZGV2ICpvZCwgdTggKmNyZWQsIHN0cnVjdCBvc2Rfb2JqX2lkICpvYmosCisJCSAgICB1NjQgb2Zmc2V0LCB2b2lkICpwLCB1bnNpZ25lZCBsZW5ndGgpOworCitpbnQgIGV4b2ZzX2dldF9pb19zdGF0ZShzdHJ1Y3QgZXhvZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUqKiBpb3MpOwordm9pZCBleG9mc19wdXRfaW9fc3RhdGUoc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MpOworCitpbnQgZXhvZnNfY2hlY2tfaW8oc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MsIHU2NCAqcmVzaWQpOworCitpbnQgZXhvZnNfc2JpX2NyZWF0ZShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcyk7CitpbnQgZXhvZnNfc2JpX3JlbW92ZShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcyk7CitpbnQgZXhvZnNfc2JpX3dyaXRlKHN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zKTsKK2ludCBleG9mc19zYmlfcmVhZChzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcyk7CisKK2ludCBleHRyYWN0X2F0dHJfZnJvbV9pb3Moc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MsIHN0cnVjdCBvc2RfYXR0ciAqYXR0cik7CisKK2ludCBleG9mc19vaV90cnVuY2F0ZShzdHJ1Y3QgZXhvZnNfaV9pbmZvICpvaSwgdTY0IG5ld19sZW4pOworc3RhdGljIGlubGluZSBpbnQgZXhvZnNfb2lfd3JpdGUoc3RydWN0IGV4b2ZzX2lfaW5mbyAqb2ksCisJCQkJIHN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zKQoreworCWlvcy0+b2JqLmlkID0gZXhvZnNfb2lfb2Jqbm8ob2kpOworCWlvcy0+Y3JlZCA9IG9pLT5pX2NyZWQ7CisJcmV0dXJuIGV4b2ZzX3NiaV93cml0ZShpb3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleG9mc19vaV9yZWFkKHN0cnVjdCBleG9mc19pX2luZm8gKm9pLAorCQkJCXN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zKQoreworCWlvcy0+b2JqLmlkID0gZXhvZnNfb2lfb2Jqbm8ob2kpOworCWlvcy0+Y3JlZCA9IG9pLT5pX2NyZWQ7CisJcmV0dXJuIGV4b2ZzX3NiaV9yZWFkKGlvcyk7Cit9CisKIC8qIGlub2RlLmMgICAgICAgICAgICAgICAqLwogdm9pZCBleG9mc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBleG9mc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwpAQCAtMTY5LDYgKzI1Nyw3IEBACiAKIC8qIGlub2RlLmMgICAgICAgICAgICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBleG9mc19hb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvc2RfYXR0ciBnX2F0dHJfbG9naWNhbF9sZW5ndGg7CiAKIC8qIG5hbWVpLmMgICAgICAgICAgICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXhvZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9leG9mcy9pbm9kZS5jIGIvZnMvZXhvZnMvaW5vZGUuYwppbmRleCA2YzEwZjc0Li42OThhODYzIDEwMDY0NAotLS0gYS9mcy9leG9mcy9pbm9kZS5jCisrKyBiL2ZzL2V4b2ZzL2lub2RlLmMKQEAgLTM3LDE1ICszNywxOCBAQAogCiAjaW5jbHVkZSAiZXhvZnMuaCIKIAotI2lmZGVmIENPTkZJR19FWE9GU19ERUJVRwotIyAgZGVmaW5lIEVYT0ZTX0RFQlVHX09CSl9JU0laRSAxCi0jZW5kaWYKKyNkZWZpbmUgRVhPRlNfREJHTVNHMihNLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworZW51bSB7IEJJT19NQVhfUEFHRVNfS01BTExPQyA9CisJCShQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGJpbykpIC8gc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwKK307CiAKIHN0cnVjdCBwYWdlX2NvbGxlY3QgewogCXN0cnVjdCBleG9mc19zYl9pbmZvICpzYmk7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJlcV9xOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJdW5zaWduZWQgZXhwZWN0ZWRfcGFnZXM7CisJc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3M7CiAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJdW5zaWduZWQgbnJfcGFnZXM7CkBAIC01NCwyMiArNTcsMjMgQEAKIH07CiAKIHN0YXRpYyB2b2lkIF9wY29sX2luaXQoc3RydWN0IHBhZ2VfY29sbGVjdCAqcGNvbCwgdW5zaWduZWQgZXhwZWN0ZWRfcGFnZXMsCi0JCXN0cnVjdCBpbm9kZSAqaW5vZGUpCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBleG9mc19zYl9pbmZvICpzYmkgPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOwogCiAJcGNvbC0+c2JpID0gc2JpOwotCXBjb2wtPnJlcV9xID0gb3NkX3JlcXVlc3RfcXVldWUoc2JpLT5zX2Rldik7CisJLyogQ3JlYXRlIG1hc3RlciBiaW9zIG9uIGZpcnN0IFEsIGxhdGVyIG9uIGNsb25pbmcsIGVhY2ggY2xvbmUgd2lsbCBiZQorCSAqIGFsbG9jYXRlZCBvbiBpdCdzIGRlc3RpbmF0aW9uIFEKKwkgKi8KKwlwY29sLT5yZXFfcSA9IG9zZF9yZXF1ZXN0X3F1ZXVlKHNiaS0+c19vZHNbMF0pOwogCXBjb2wtPmlub2RlID0gaW5vZGU7CiAJcGNvbC0+ZXhwZWN0ZWRfcGFnZXMgPSBleHBlY3RlZF9wYWdlczsKIAorCXBjb2wtPmlvcyA9IE5VTEw7CiAJcGNvbC0+YmlvID0gTlVMTDsKIAlwY29sLT5ucl9wYWdlcyA9IDA7CiAJcGNvbC0+bGVuZ3RoID0gMDsKIAlwY29sLT5wZ19maXJzdCA9IC0xOwotCi0JRVhPRlNfREJHTVNHKCJfcGNvbF9pbml0IGlubz0weCVseCBleHBlY3RlZF9wYWdlcz0ldVxuIiwgaW5vZGUtPmlfaW5vLAotCQkgICAgIGV4cGVjdGVkX3BhZ2VzKTsKIH0KIAogc3RhdGljIHZvaWQgX3Bjb2xfcmVzZXQoc3RydWN0IHBhZ2VfY29sbGVjdCAqcGNvbCkKQEAgLTgwLDM1ICs4NCw0OSBAQAogCXBjb2wtPm5yX3BhZ2VzID0gMDsKIAlwY29sLT5sZW5ndGggPSAwOwogCXBjb2wtPnBnX2ZpcnN0ID0gLTE7Ci0JRVhPRlNfREJHTVNHKCJfcGNvbF9yZXNldCBpbm89MHglbHggZXhwZWN0ZWRfcGFnZXM9JXVcbiIsCi0JCSAgICAgcGNvbC0+aW5vZGUtPmlfaW5vLCBwY29sLT5leHBlY3RlZF9wYWdlcyk7CisJcGNvbC0+aW9zID0gTlVMTDsKIAogCS8qIHRoaXMgaXMgcHJvYmFibHkgdGhlIGVuZCBvZiB0aGUgbG9vcCBidXQgaW4gd3JpdGVzCiAJICogaXQgbWlnaHQgbm90IGVuZCBoZXJlLiBkb24ndCBiZSBsZWZ0IHdpdGggbm90aGluZwogCSAqLwogCWlmICghcGNvbC0+ZXhwZWN0ZWRfcGFnZXMpCi0JCXBjb2wtPmV4cGVjdGVkX3BhZ2VzID0gMTI4OworCQlwY29sLT5leHBlY3RlZF9wYWdlcyA9IEJJT19NQVhfUEFHRVNfS01BTExPQzsKIH0KIAogc3RhdGljIGludCBwY29sX3RyeV9hbGxvYyhzdHJ1Y3QgcGFnZV9jb2xsZWN0ICpwY29sKQogewotCWludCBwYWdlcyA9IG1pbl90KHVuc2lnbmVkLCBwY29sLT5leHBlY3RlZF9wYWdlcywgQklPX01BWF9QQUdFUyk7CisJaW50IHBhZ2VzID0gbWluX3QodW5zaWduZWQsIHBjb2wtPmV4cGVjdGVkX3BhZ2VzLAorCQkJICBCSU9fTUFYX1BBR0VTX0tNQUxMT0MpOworCisJaWYgKCFwY29sLT5pb3MpIHsgLyogRmlyc3QgdGltZSBhbGxvY2F0ZSBpb19zdGF0ZSAqLworCQlpbnQgcmV0ID0gZXhvZnNfZ2V0X2lvX3N0YXRlKHBjb2wtPnNiaSwgJnBjb2wtPmlvcyk7CisKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJZm9yICg7IHBhZ2VzOyBwYWdlcyA+Pj0gMSkgewotCQlwY29sLT5iaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgcGFnZXMpOworCQlwY29sLT5iaW8gPSBiaW9fa21hbGxvYyhHRlBfS0VSTkVMLCBwYWdlcyk7CiAJCWlmIChsaWtlbHkocGNvbC0+YmlvKSkKIAkJCXJldHVybiAwOwogCX0KIAotCUVYT0ZTX0VSUigiRmFpbGVkIHRvIGtjYWxsb2MgZXhwZWN0ZWRfcGFnZXM9JXVcbiIsCisJRVhPRlNfRVJSKCJGYWlsZWQgdG8gYmlvX2ttYWxsb2MgZXhwZWN0ZWRfcGFnZXM9JXVcbiIsCiAJCSAgcGNvbC0+ZXhwZWN0ZWRfcGFnZXMpOwogCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBwY29sX2ZyZWUoc3RydWN0IHBhZ2VfY29sbGVjdCAqcGNvbCkKIHsKLQliaW9fcHV0KHBjb2wtPmJpbyk7Ci0JcGNvbC0+YmlvID0gTlVMTDsKKwlpZiAocGNvbC0+YmlvKSB7CisJCWJpb19wdXQocGNvbC0+YmlvKTsKKwkJcGNvbC0+YmlvID0gTlVMTDsKKwl9CisKKwlpZiAocGNvbC0+aW9zKSB7CisJCWV4b2ZzX3B1dF9pb19zdGF0ZShwY29sLT5pb3MpOworCQlwY29sLT5pb3MgPSBOVUxMOworCX0KIH0KIAogc3RhdGljIGludCBwY29sX2FkZF9wYWdlKHN0cnVjdCBwYWdlX2NvbGxlY3QgKnBjb2wsIHN0cnVjdCBwYWdlICpwYWdlLApAQCAtMTYxLDIyICsxNzksMTcgQEAKIC8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHJlYWRzLCB0byBvcHRpb25hbGx5IHVubG9jayBwYWdlcyBhbmQgdXBkYXRlIHRoZWlyCiAgKiBzdGF0dXMuCiAgKi8KLXN0YXRpYyBpbnQgX19yZWFkcGFnZXNfZG9uZShzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yLCBzdHJ1Y3QgcGFnZV9jb2xsZWN0ICpwY29sLAotCQkJICAgIGJvb2wgZG9fdW5sb2NrKQorc3RhdGljIGludCBfX3JlYWRwYWdlc19kb25lKHN0cnVjdCBwYWdlX2NvbGxlY3QgKnBjb2wsIGJvb2wgZG9fdW5sb2NrKQogewogCXN0cnVjdCBiaW9fdmVjICpidmVjOwogCWludCBpOwogCXU2NCByZXNpZDsKIAl1NjQgZ29vZF9ieXRlczsKIAl1NjQgbGVuZ3RoID0gMDsKLQlpbnQgcmV0ID0gZXhvZnNfY2hlY2tfb2tfcmVzaWQob3IsICZyZXNpZCwgTlVMTCk7Ci0KLQlvc2RfZW5kX3JlcXVlc3Qob3IpOworCWludCByZXQgPSBleG9mc19jaGVja19pbyhwY29sLT5pb3MsICZyZXNpZCk7CiAKIAlpZiAobGlrZWx5KCFyZXQpKQogCQlnb29kX2J5dGVzID0gcGNvbC0+bGVuZ3RoOwotCWVsc2UgaWYgKCFyZXNpZCkKLQkJZ29vZF9ieXRlcyA9IDA7CiAJZWxzZQogCQlnb29kX2J5dGVzID0gcGNvbC0+bGVuZ3RoIC0gcmVzaWQ7CiAKQEAgLTE5OCw3ICsyMTEsNyBAQAogCQllbHNlCiAJCQlwYWdlX3N0YXQgPSByZXQ7CiAKLQkJRVhPRlNfREJHTVNHKCIgICAgcmVhZHBhZ2VzX2RvbmUoMHglbHgsIDB4JWx4KSAlc1xuIiwKKwkJRVhPRlNfREJHTVNHMigiICAgIHJlYWRwYWdlc19kb25lKDB4JWx4LCAweCVseCkgJXNcbiIsCiAJCQkgIGlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgsCiAJCQkgIHBhZ2Vfc3RhdCA/ICJiYWRfYnl0ZXMiIDogImdvb2RfYnl0ZXMiKTsKIApAQCAtMjE0LDEzICsyMjcsMTMgQEAKIH0KIAogLyogY2FsbGJhY2sgb2YgYXN5bmMgcmVhZHMgKi8KLXN0YXRpYyB2b2lkIHJlYWRwYWdlc19kb25lKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIHZvaWQgKnApCitzdGF0aWMgdm9pZCByZWFkcGFnZXNfZG9uZShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcywgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgcGFnZV9jb2xsZWN0ICpwY29sID0gcDsKIAotCV9fcmVhZHBhZ2VzX2RvbmUob3IsIHBjb2wsIHRydWUpOworCV9fcmVhZHBhZ2VzX2RvbmUocGNvbCwgdHJ1ZSk7CiAJYXRvbWljX2RlYygmcGNvbC0+c2JpLT5zX2N1cnJfcGVuZGluZyk7Ci0Ja2ZyZWUocCk7CisJa2ZyZWUocGNvbCk7CiB9CiAKIHN0YXRpYyB2b2lkIF91bmxvY2tfcGNvbF9wYWdlcyhzdHJ1Y3QgcGFnZV9jb2xsZWN0ICpwY29sLCBpbnQgcmV0LCBpbnQgcncpCkBAIC0yMzgsMTcgKzI1MSwxMyBAQAogCiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCX0KLQlwY29sX2ZyZWUocGNvbCk7CiB9CiAKIHN0YXRpYyBpbnQgcmVhZF9leGVjKHN0cnVjdCBwYWdlX2NvbGxlY3QgKnBjb2wsIGJvb2wgaXNfc3luYykKIHsKIAlzdHJ1Y3QgZXhvZnNfaV9pbmZvICpvaSA9IGV4b2ZzX2kocGNvbC0+aW5vZGUpOwotCXN0cnVjdCBvc2Rfb2JqX2lkIG9iaiA9IHtwY29sLT5zYmktPnNfcGlkLAotCQkJCQlwY29sLT5pbm9kZS0+aV9pbm8gKyBFWE9GU19PQkpfT0ZGfTsKLQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yID0gTlVMTDsKKwlzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcyA9IHBjb2wtPmlvczsKIAlzdHJ1Y3QgcGFnZV9jb2xsZWN0ICpwY29sX2NvcHkgPSBOVUxMOwotCWxvZmZfdCBpX3N0YXJ0ID0gcGNvbC0+cGdfZmlyc3QgPDwgUEFHRV9DQUNIRV9TSElGVDsKIAlpbnQgcmV0OwogCiAJaWYgKCFwY29sLT5iaW8pCkBAIC0yNTcsMTcgKzI2NiwxMyBAQAogCS8qIHNlZSBjb21tZW50IGluIF9yZWFkcGFnZSgpIGFib3V0IHN5bmMgcmVhZHMgKi8KIAlXQVJOX09OKGlzX3N5bmMgJiYgKHBjb2wtPm5yX3BhZ2VzICE9IDEpKTsKIAotCW9yID0gb3NkX3N0YXJ0X3JlcXVlc3QocGNvbC0+c2JpLT5zX2RldiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFvcikpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jb3NkX3JlcV9yZWFkKG9yLCAmb2JqLCBpX3N0YXJ0LCBwY29sLT5iaW8sIHBjb2wtPmxlbmd0aCk7CisJaW9zLT5iaW8gPSBwY29sLT5iaW87CisJaW9zLT5sZW5ndGggPSBwY29sLT5sZW5ndGg7CisJaW9zLT5vZmZzZXQgPSBwY29sLT5wZ19maXJzdCA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCiAJaWYgKGlzX3N5bmMpIHsKLQkJZXhvZnNfc3luY19vcChvciwgcGNvbC0+c2JpLT5zX3RpbWVvdXQsIG9pLT5pX2NyZWQpOwotCQlyZXR1cm4gX19yZWFkcGFnZXNfZG9uZShvciwgcGNvbCwgZmFsc2UpOworCQlleG9mc19vaV9yZWFkKG9pLCBwY29sLT5pb3MpOworCQlyZXR1cm4gX19yZWFkcGFnZXNfZG9uZShwY29sLCBmYWxzZSk7CiAJfQogCiAJcGNvbF9jb3B5ID0ga21hbGxvYyhzaXplb2YoKnBjb2xfY29weSksIEdGUF9LRVJORUwpOwpAQCAtMjc3LDE0ICsyODIsMTYgQEAKIAl9CiAKIAkqcGNvbF9jb3B5ID0gKnBjb2w7Ci0JcmV0ID0gZXhvZnNfYXN5bmNfb3Aob3IsIHJlYWRwYWdlc19kb25lLCBwY29sX2NvcHksIG9pLT5pX2NyZWQpOworCWlvcy0+ZG9uZSA9IHJlYWRwYWdlc19kb25lOworCWlvcy0+cHJpdmF0ZSA9IHBjb2xfY29weTsKKwlyZXQgPSBleG9mc19vaV9yZWFkKG9pLCBpb3MpOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlnb3RvIGVycjsKIAogCWF0b21pY19pbmMoJnBjb2wtPnNiaS0+c19jdXJyX3BlbmRpbmcpOwogCiAJRVhPRlNfREJHTVNHKCJyZWFkX2V4ZWMgb2JqPTB4JWxseCBzdGFydD0weCVsbHggbGVuZ3RoPTB4JWx4XG4iLAotCQkgIG9iai5pZCwgX0xMVShpX3N0YXJ0KSwgcGNvbC0+bGVuZ3RoKTsKKwkJICBpb3MtPm9iai5pZCwgX0xMVShpb3MtPm9mZnNldCksIHBjb2wtPmxlbmd0aCk7CiAKIAkvKiBwYWdlcyBvd25lcnNoaXAgd2FzIHBhc3NlZCB0byBwY29sX2NvcHkgKi8KIAlfcGNvbF9yZXNldChwY29sKTsKQEAgLTI5MywxMiArMzAwLDEwIEBACiBlcnI6CiAJaWYgKCFpc19zeW5jKQogCQlfdW5sb2NrX3Bjb2xfcGFnZXMocGNvbCwgcmV0LCBSRUFEKTsKLQllbHNlIC8qIFBhZ2VzIHVubG9ja2VkIGJ5IGNhbGxlciBpbiBzeW5jIG1vZGUgb25seSBmcmVlIGJpbyAqLwotCQlwY29sX2ZyZWUocGNvbCk7CisKKwlwY29sX2ZyZWUocGNvbCk7CiAKIAlrZnJlZShwY29sX2NvcHkpOwotCWlmIChvcikKLQkJb3NkX2VuZF9yZXF1ZXN0KG9yKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNzAsMTIgKzM3NSwxMiBAQAogCWlmIChsZW4gIT0gUEFHRV9DQUNIRV9TSVpFKQogCQl6ZXJvX3VzZXIocGFnZSwgbGVuLCBQQUdFX0NBQ0hFX1NJWkUgLSBsZW4pOwogCi0JRVhPRlNfREJHTVNHKCIgICAgcmVhZHBhZ2Vfc3RyaXAoMHglbHgsIDB4JWx4KSBsZW49MHglenhcbiIsCisJRVhPRlNfREJHTVNHMigiICAgIHJlYWRwYWdlX3N0cmlwKDB4JWx4LCAweCVseCkgbGVuPTB4JXp4XG4iLAogCQkgICAgIGlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgsIGxlbik7CiAKIAlyZXQgPSBwY29sX2FkZF9wYWdlKHBjb2wsIHBhZ2UsIGxlbik7CiAJaWYgKHJldCkgewotCQlFWE9GU19EQkdNU0coIkZhaWxlZCBwY29sX2FkZF9wYWdlIHBhZ2VzW2ldPSVwICIKKwkJRVhPRlNfREJHTVNHMigiRmFpbGVkIHBjb2xfYWRkX3BhZ2UgcGFnZXNbaV09JXAgIgogCQkJICAidGhpc19sZW49MHglenggbnJfcGFnZXM9JXUgbGVuZ3RoPTB4JWx4XG4iLAogCQkJICBwYWdlLCBsZW4sIHBjb2wtPm5yX3BhZ2VzLCBwY29sLT5sZW5ndGgpOwogCkBAIC00MTksOSArNDI0LDggQEAKIAogCV9wY29sX2luaXQoJnBjb2wsIDEsIHBhZ2UtPm1hcHBpbmctPmhvc3QpOwogCi0JLyogcmVhZHBhZ2Vfc3RyaXAgbWlnaHQgY2FsbCByZWFkX2V4ZWMoLGFzeW5jKSBpbnNpZGUgYXQgc2V2ZXJhbCBwbGFjZXMKLQkgKiBidXQgdGhpcyBpcyBzYWZlIGZvciBpc19hc3luYz0wIHNpbmNlIHJlYWRfZXhlYyB3aWxsIG5vdCBkbyBhbnl0aGluZwotCSAqIHdoZW4gd2UgaGF2ZSBhIHNpbmdsZSBwYWdlLgorCS8qIHJlYWRwYWdlX3N0cmlwIG1pZ2h0IGNhbGwgcmVhZF9leGVjKCxpc19zeW5jPT1mYWxzZSkgYXQgc2V2ZXJhbAorCSAqIHBsYWNlcyBidXQgbm90IGlmIHdlIGhhdmUgYSBzaW5nbGUgcGFnZS4KIAkgKi8KIAlyZXQgPSByZWFkcGFnZV9zdHJpcCgmcGNvbCwgcGFnZSk7CiAJaWYgKHJldCkgewpAQCAtNDQwLDggKzQ0NCw4IEBACiAJcmV0dXJuIF9yZWFkcGFnZShwYWdlLCBmYWxzZSk7CiB9CiAKLS8qIENhbGxiYWNrIGZvciBvc2Rfd3JpdGUuIEFsbCB3cml0ZXMgYXJlIGFzeW5jaHJvbm91c2UgKi8KLXN0YXRpYyB2b2lkIHdyaXRlcGFnZXNfZG9uZShzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yLCB2b2lkICpwKQorLyogQ2FsbGJhY2sgZm9yIG9zZF93cml0ZS4gQWxsIHdyaXRlcyBhcmUgYXN5bmNocm9ub3VzICovCitzdGF0aWMgdm9pZCB3cml0ZXBhZ2VzX2RvbmUoc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MsIHZvaWQgKnApCiB7CiAJc3RydWN0IHBhZ2VfY29sbGVjdCAqcGNvbCA9IHA7CiAJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CkBAIC00NDksMTYgKzQ1MywxMiBAQAogCXU2NCByZXNpZDsKIAl1NjQgIGdvb2RfYnl0ZXM7CiAJdTY0ICBsZW5ndGggPSAwOworCWludCByZXQgPSBleG9mc19jaGVja19pbyhpb3MsICZyZXNpZCk7CiAKLQlpbnQgcmV0ID0gZXhvZnNfY2hlY2tfb2tfcmVzaWQob3IsIE5VTEwsICZyZXNpZCk7Ci0KLQlvc2RfZW5kX3JlcXVlc3Qob3IpOwogCWF0b21pY19kZWMoJnBjb2wtPnNiaS0+c19jdXJyX3BlbmRpbmcpOwogCiAJaWYgKGxpa2VseSghcmV0KSkKIAkJZ29vZF9ieXRlcyA9IHBjb2wtPmxlbmd0aDsKLQllbHNlIGlmICghcmVzaWQpCi0JCWdvb2RfYnl0ZXMgPSAwOwogCWVsc2UKIAkJZ29vZF9ieXRlcyA9IHBjb2wtPmxlbmd0aCAtIHJlc2lkOwogCkBAIC00ODIsNyArNDgyLDcgQEAKIAogCQl1cGRhdGVfd3JpdGVfcGFnZShwYWdlLCBwYWdlX3N0YXQpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJRVhPRlNfREJHTVNHKCIgICAgd3JpdGVwYWdlc19kb25lKDB4JWx4LCAweCVseCkgc3RhdHVzPSVkXG4iLAorCQlFWE9GU19EQkdNU0cyKCIgICAgd3JpdGVwYWdlc19kb25lKDB4JWx4LCAweCVseCkgc3RhdHVzPSVkXG4iLAogCQkJICAgICBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4LCBwYWdlX3N0YXQpOwogCiAJCWxlbmd0aCArPSBidmVjLT5idl9sZW47CkBAIC00OTYsMjMgKzQ5NiwxMyBAQAogc3RhdGljIGludCB3cml0ZV9leGVjKHN0cnVjdCBwYWdlX2NvbGxlY3QgKnBjb2wpCiB7CiAJc3RydWN0IGV4b2ZzX2lfaW5mbyAqb2kgPSBleG9mc19pKHBjb2wtPmlub2RlKTsKLQlzdHJ1Y3Qgb3NkX29ial9pZCBvYmogPSB7cGNvbC0+c2JpLT5zX3BpZCwKLQkJCQkJcGNvbC0+aW5vZGUtPmlfaW5vICsgRVhPRlNfT0JKX09GRn07Ci0Jc3RydWN0IG9zZF9yZXF1ZXN0ICpvciA9IE5VTEw7CisJc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MgPSBwY29sLT5pb3M7CiAJc3RydWN0IHBhZ2VfY29sbGVjdCAqcGNvbF9jb3B5ID0gTlVMTDsKLQlsb2ZmX3QgaV9zdGFydCA9IHBjb2wtPnBnX2ZpcnN0IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJaW50IHJldDsKIAogCWlmICghcGNvbC0+YmlvKQogCQlyZXR1cm4gMDsKIAotCW9yID0gb3NkX3N0YXJ0X3JlcXVlc3QocGNvbC0+c2JpLT5zX2RldiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFvcikpIHsKLQkJRVhPRlNfRVJSKCJ3cml0ZV9leGVjOiBGYWlsZCB0byBvc2Rfc3RhcnRfcmVxdWVzdCgpXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCiAJcGNvbF9jb3B5ID0ga21hbGxvYyhzaXplb2YoKnBjb2xfY29weSksIEdGUF9LRVJORUwpOwogCWlmICghcGNvbF9jb3B5KSB7CiAJCUVYT0ZTX0VSUigid3JpdGVfZXhlYzogRmFpbGQgdG8ga21hbGxvYyhwY29sKVxuIik7CkBAIC01MjMsMTYgKzUxMywyMiBAQAogCSpwY29sX2NvcHkgPSAqcGNvbDsKIAogCXBjb2xfY29weS0+YmlvLT5iaV9ydyB8PSAoMSA8PCBCSU9fUlcpOyAvKiBGSVhNRTogYmlvX3NldF9kaXIoKSAqLwotCW9zZF9yZXFfd3JpdGUob3IsICZvYmosIGlfc3RhcnQsIHBjb2xfY29weS0+YmlvLCBwY29sX2NvcHktPmxlbmd0aCk7Ci0JcmV0ID0gZXhvZnNfYXN5bmNfb3Aob3IsIHdyaXRlcGFnZXNfZG9uZSwgcGNvbF9jb3B5LCBvaS0+aV9jcmVkKTsKKworCWlvcy0+YmlvID0gcGNvbF9jb3B5LT5iaW87CisJaW9zLT5vZmZzZXQgPSBwY29sX2NvcHktPnBnX2ZpcnN0IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW9zLT5sZW5ndGggPSBwY29sX2NvcHktPmxlbmd0aDsKKwlpb3MtPmRvbmUgPSB3cml0ZXBhZ2VzX2RvbmU7CisJaW9zLT5wcml2YXRlID0gcGNvbF9jb3B5OworCisJcmV0ID0gZXhvZnNfb2lfd3JpdGUob2ksIGlvcyk7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJRVhPRlNfRVJSKCJ3cml0ZV9leGVjOiBleG9mc19hc3luY19vcCgpIEZhaWxkXG4iKTsKKwkJRVhPRlNfRVJSKCJ3cml0ZV9leGVjOiBleG9mc19vaV93cml0ZSgpIEZhaWxkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJYXRvbWljX2luYygmcGNvbC0+c2JpLT5zX2N1cnJfcGVuZGluZyk7CiAJRVhPRlNfREJHTVNHKCJ3cml0ZV9leGVjKDB4JWx4LCAweCVsbHgpIHN0YXJ0PTB4JWxseCBsZW5ndGg9MHglbHhcbiIsCi0JCSAgcGNvbC0+aW5vZGUtPmlfaW5vLCBwY29sLT5wZ19maXJzdCwgX0xMVShpX3N0YXJ0KSwKKwkJICBwY29sLT5pbm9kZS0+aV9pbm8sIHBjb2wtPnBnX2ZpcnN0LCBfTExVKGlvcy0+b2Zmc2V0KSwKIAkJICBwY29sLT5sZW5ndGgpOwogCS8qIHBhZ2VzIG93bmVyc2hpcCB3YXMgcGFzc2VkIHRvIHBjb2xfY29weSAqLwogCV9wY29sX3Jlc2V0KHBjb2wpOwpAQCAtNTQwLDkgKzUzNiw5IEBACiAKIGVycjoKIAlfdW5sb2NrX3Bjb2xfcGFnZXMocGNvbCwgcmV0LCBXUklURSk7CisJcGNvbF9mcmVlKHBjb2wpOwogCWtmcmVlKHBjb2xfY29weSk7Ci0JaWYgKG9yKQotCQlvc2RfZW5kX3JlcXVlc3Qob3IpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTg2LDYgKzU4Miw5IEBACiAJCQlpZiAoUGFnZUVycm9yKHBhZ2UpKQogCQkJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOwogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlFWE9GU19EQkdNU0coIndyaXRlcGFnZV9zdHJpcCgweCVseCwgMHglbHgpICIKKwkJCQkgICAgICJvdXRzaWRlIHRoZSBsaW1pdHNcbiIsCisJCQkJICAgICBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNjAwLDYgKzU5OSw5IEBACiAJCXJldCA9IHdyaXRlX2V4ZWMocGNvbCk7CiAJCWlmICh1bmxpa2VseShyZXQpKQogCQkJZ290byBmYWlsOworCisJCUVYT0ZTX0RCR01TRygid3JpdGVwYWdlX3N0cmlwKDB4JWx4LCAweCVseCkgRGlzY29udGludWl0eVxuIiwKKwkJCSAgICAgaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCk7CiAJCWdvdG8gdHJ5X2FnYWluOwogCX0KIApAQCAtNjA5LDcgKzYxMSw3IEBACiAJCQlnb3RvIGZhaWw7CiAJfQogCi0JRVhPRlNfREJHTVNHKCIgICAgd3JpdGVwYWdlX3N0cmlwKDB4JWx4LCAweCVseCkgbGVuPTB4JXp4XG4iLAorCUVYT0ZTX0RCR01TRzIoIiAgICB3cml0ZXBhZ2Vfc3RyaXAoMHglbHgsIDB4JWx4KSBsZW49MHglenhcbiIsCiAJCSAgICAgaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCwgbGVuKTsKIAogCXJldCA9IHBjb2xfYWRkX3BhZ2UocGNvbCwgcGFnZSwgbGVuKTsKQEAgLTYzNCw2ICs2MzYsOCBAQAogCXJldHVybiAwOwogCiBmYWlsOgorCUVYT0ZTX0RCR01TRygiRXJyb3I6IHdyaXRlcGFnZV9zdHJpcCgweCVseCwgMHglbHgpPT4lZFxuIiwKKwkJICAgICBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4LCByZXQpOwogCXNldF9iaXQoQVNfRUlPLCAmcGFnZS0+bWFwcGluZy0+ZmxhZ3MpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCXJldHVybiByZXQ7CkBAIC02NTIsMTQgKzY1NiwxNyBAQAogCQkJd2JjLT5yYW5nZV9lbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAogCWlmIChzdGFydCB8fCBlbmQpCi0JCWV4cGVjdGVkX3BhZ2VzID0gbWluKGVuZCAtIHN0YXJ0ICsgMSwgMzJMKTsKKwkJZXhwZWN0ZWRfcGFnZXMgPSBlbmQgLSBzdGFydCArIDE7CiAJZWxzZQogCQlleHBlY3RlZF9wYWdlcyA9IG1hcHBpbmctPm5ycGFnZXM7CiAKLQlFWE9GU19EQkdNU0coImlub2RlKDB4JWx4KSB3YmMtPnN0YXJ0PTB4JWxseCB3YmMtPmVuZD0weCVsbHgiCi0JCSAgICAgIiBtLT5ucnBhZ2VzPSVsdSBzdGFydD0weCVseCBlbmQ9MHglbHhcbiIsCisJaWYgKGV4cGVjdGVkX3BhZ2VzIDwgMzJMKQorCQlleHBlY3RlZF9wYWdlcyA9IDMyTDsKKworCUVYT0ZTX0RCR01TRygiaW5vZGUoMHglbHgpIHdiYy0+c3RhcnQ9MHglbGx4IHdiYy0+ZW5kPTB4JWxseCAiCisJCSAgICAgIm5ycGFnZXM9JWx1IHN0YXJ0PTB4JWx4IGVuZD0weCVseCBleHBlY3RlZF9wYWdlcz0lbGRcbiIsCiAJCSAgICAgbWFwcGluZy0+aG9zdC0+aV9pbm8sIHdiYy0+cmFuZ2Vfc3RhcnQsIHdiYy0+cmFuZ2VfZW5kLAotCQkgICAgIG1hcHBpbmctPm5ycGFnZXMsIHN0YXJ0LCBlbmQpOworCQkgICAgIG1hcHBpbmctPm5ycGFnZXMsIHN0YXJ0LCBlbmQsIGV4cGVjdGVkX3BhZ2VzKTsKIAogCV9wY29sX2luaXQoJnBjb2wsIGV4cGVjdGVkX3BhZ2VzLCBtYXBwaW5nLT5ob3N0KTsKIApAQCAtNzcxLDE5ICs3NzgsMjggQEAKIGNvbnN0IHN0cnVjdCBvc2RfYXR0ciBnX2F0dHJfbG9naWNhbF9sZW5ndGggPSBBVFRSX0RFRigKIAlPU0RfQVBBR0VfT0JKRUNUX0lORk9STUFUSU9OLCBPU0RfQVRUUl9PSV9MT0dJQ0FMX0xFTkdUSCwgOCk7CiAKK3N0YXRpYyBpbnQgX2RvX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4b2ZzX2lfaW5mbyAqb2kgPSBleG9mc19pKGlub2RlKTsKKwlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJaW50IHJldDsKKworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisKKwlub2JoX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaXNpemUsIGV4b2ZzX2dldF9ibG9jayk7CisKKwlyZXQgPSBleG9mc19vaV90cnVuY2F0ZShvaSwgKHU2NClpc2l6ZSk7CisJRVhPRlNfREJHTVNHKCIoMHglbHgpIHNpemU9MHglbGx4XG4iLCBpbm9kZS0+aV9pbm8sIGlzaXplKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogVHJ1bmNhdGUgYSBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgc2l6ZSAtIGFsbCB3ZSBoYXZlIHRvIGRvIGlzIHNldCB0aGUgc2l6ZQogICogYXR0cmlidXRlLiAgV2UgbWFrZSBzdXJlIHRoZSBvYmplY3QgZXhpc3RzIGZpcnN0LgogICovCiB2b2lkIGV4b2ZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IGV4b2ZzX3NiX2luZm8gKnNiaSA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CiAJc3RydWN0IGV4b2ZzX2lfaW5mbyAqb2kgPSBleG9mc19pKGlub2RlKTsKLQlzdHJ1Y3Qgb3NkX29ial9pZCBvYmogPSB7c2JpLT5zX3BpZCwgaW5vZGUtPmlfaW5vICsgRVhPRlNfT0JKX09GRn07Ci0Jc3RydWN0IG9zZF9yZXF1ZXN0ICpvcjsKLQlzdHJ1Y3Qgb3NkX2F0dHIgYXR0cjsKLQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JX19iZTY0IG5ld3NpemU7CiAJaW50IHJldDsKIAogCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKQpAQCAtNzkzLDIyICs4MDksNiBAQAogCQlyZXR1cm47CiAJaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKIAkJcmV0dXJuOwotCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0KLQlub2JoX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaXNpemUsIGV4b2ZzX2dldF9ibG9jayk7Ci0KLQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19kZXYsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghb3IpKSB7Ci0JCUVYT0ZTX0VSUigiRVJST1I6IGV4b2ZzX3RydW5jYXRlOiBvc2Rfc3RhcnRfcmVxdWVzdCBmYWlsZWRcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jb3NkX3JlcV9zZXRfYXR0cmlidXRlcyhvciwgJm9iaik7Ci0KLQluZXdzaXplID0gY3B1X3RvX2JlNjQoKHU2NClpc2l6ZSk7Ci0JYXR0ciA9IGdfYXR0cl9sb2dpY2FsX2xlbmd0aDsKLQlhdHRyLnZhbF9wdHIgPSAmbmV3c2l6ZTsKLQlvc2RfcmVxX2FkZF9zZXRfYXR0cl9saXN0KG9yLCAmYXR0ciwgMSk7CiAKIAkvKiBpZiB3ZSBhcmUgYWJvdXQgdG8gdHJ1bmNhdGUgYW4gb2JqZWN0LCBhbmQgaXQgaGFzbid0IGJlZW4KIAkgKiBjcmVhdGVkIHlldCwgd2FpdApAQCAtODE2LDggKzgxNiw3IEBACiAJaWYgKHVubGlrZWx5KHdhaXRfb2JqX2NyZWF0ZWQob2kpKSkKIAkJZ290byBmYWlsOwogCi0JcmV0ID0gZXhvZnNfc3luY19vcChvciwgc2JpLT5zX3RpbWVvdXQsIG9pLT5pX2NyZWQpOwotCW9zZF9lbmRfcmVxdWVzdChvcik7CisJcmV0ID0gX2RvX3RydW5jYXRlKGlub2RlKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKQEAgLTg0Nyw2NSArODQ2LDYyIEBACiAKIC8qCiAgKiBSZWFkIGFuIGlub2RlIGZyb20gdGhlIE9TRCwgYW5kIHJldHVybiBpdCBhcyBpcy4gIFdlIGFsc28gcmV0dXJuIHRoZSBzaXplCi0gKiBhdHRyaWJ1dGUgaW4gdGhlICdzYW5pdHknIGFyZ3VtZW50IGlmIHdlIGdvdCBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyB0dXJuZWQKLSAqIG9uLgorICogYXR0cmlidXRlIGluIHRoZSAnb2JqX3NpemUnIGFyZ3VtZW50LgogICovCiBzdGF0aWMgaW50IGV4b2ZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXhvZnNfaV9pbmZvICpvaSwKLQkJICAgIHN0cnVjdCBleG9mc19mY2IgKmlub2RlLCB1aW50NjRfdCAqc2FuaXR5KQorCQkgICAgc3RydWN0IGV4b2ZzX2ZjYiAqaW5vZGUsIHVpbnQ2NF90ICpvYmpfc2l6ZSkKIHsKIAlzdHJ1Y3QgZXhvZnNfc2JfaW5mbyAqc2JpID0gc2ItPnNfZnNfaW5mbzsKLQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yOwotCXN0cnVjdCBvc2RfYXR0ciBhdHRyOwotCXN0cnVjdCBvc2Rfb2JqX2lkIG9iaiA9IHtzYmktPnNfcGlkLAotCQkJCSBvaS0+dmZzX2lub2RlLmlfaW5vICsgRVhPRlNfT0JKX09GRn07CisJc3RydWN0IG9zZF9hdHRyIGF0dHJzWzJdOworCXN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zOwogCWludCByZXQ7CiAKLQlleG9mc19tYWtlX2NyZWRlbnRpYWwob2ktPmlfY3JlZCwgJm9iaik7Ci0KLQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19kZXYsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghb3IpKSB7Ci0JCUVYT0ZTX0VSUigiZXhvZnNfZ2V0X2lub2RlOiBvc2Rfc3RhcnRfcmVxdWVzdCBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJKm9ial9zaXplID0gfjA7CisJcmV0ID0gZXhvZnNfZ2V0X2lvX3N0YXRlKHNiaSwgJmlvcyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJRVhPRlNfRVJSKCIlczogZXhvZnNfZ2V0X2lvX3N0YXRlIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKIAl9Ci0Jb3NkX3JlcV9nZXRfYXR0cmlidXRlcyhvciwgJm9iaik7CiAKLQkvKiB3ZSBuZWVkIHRoZSBpbm9kZSBhdHRyaWJ1dGUgKi8KLQlvc2RfcmVxX2FkZF9nZXRfYXR0cl9saXN0KG9yLCAmZ19hdHRyX2lub2RlX2RhdGEsIDEpOworCWlvcy0+b2JqLmlkID0gZXhvZnNfb2lfb2Jqbm8ob2kpOworCWV4b2ZzX21ha2VfY3JlZGVudGlhbChvaS0+aV9jcmVkLCAmaW9zLT5vYmopOworCWlvcy0+Y3JlZCA9IG9pLT5pX2NyZWQ7CiAKLSNpZmRlZiBFWE9GU19ERUJVR19PQkpfSVNJWkUKLQkvKiB3ZSBnZXQgdGhlIHNpemUgYXR0cmlidXRlcyB0byBkbyBhIHNhbml0eSBjaGVjayAqLwotCW9zZF9yZXFfYWRkX2dldF9hdHRyX2xpc3Qob3IsICZnX2F0dHJfbG9naWNhbF9sZW5ndGgsIDEpOwotI2VuZGlmCisJYXR0cnNbMF0gPSBnX2F0dHJfaW5vZGVfZGF0YTsKKwlhdHRyc1sxXSA9IGdfYXR0cl9sb2dpY2FsX2xlbmd0aDsKKwlpb3MtPmluX2F0dHIgPSBhdHRyczsKKwlpb3MtPmluX2F0dHJfbGVuID0gQVJSQVlfU0laRShhdHRycyk7CiAKLQlyZXQgPSBleG9mc19zeW5jX29wKG9yLCBzYmktPnNfdGltZW91dCwgb2ktPmlfY3JlZCk7CisJcmV0ID0gZXhvZnNfc2JpX3JlYWQoaW9zKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCWF0dHIgPSBnX2F0dHJfaW5vZGVfZGF0YTsKLQlyZXQgPSBleHRyYWN0X2F0dHJfZnJvbV9yZXEob3IsICZhdHRyKTsKKwlyZXQgPSBleHRyYWN0X2F0dHJfZnJvbV9pb3MoaW9zLCAmYXR0cnNbMF0pOwogCWlmIChyZXQpIHsKLQkJRVhPRlNfRVJSKCJleG9mc19nZXRfaW5vZGU6IGV4dHJhY3RfYXR0cl9mcm9tX3JlcSBmYWlsZWRcbiIpOworCQlFWE9GU19FUlIoIiVzOiBleHRyYWN0X2F0dHIgb2YgaW5vZGVfZGF0YSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CiAJfQorCVdBUk5fT04oYXR0cnNbMF0ubGVuICE9IEVYT0ZTX0lOT19BVFRSX1NJWkUpOworCW1lbWNweShpbm9kZSwgYXR0cnNbMF0udmFsX3B0ciwgRVhPRlNfSU5PX0FUVFJfU0laRSk7CiAKLQlXQVJOX09OKGF0dHIubGVuICE9IEVYT0ZTX0lOT19BVFRSX1NJWkUpOwotCW1lbWNweShpbm9kZSwgYXR0ci52YWxfcHRyLCBFWE9GU19JTk9fQVRUUl9TSVpFKTsKLQotI2lmZGVmIEVYT0ZTX0RFQlVHX09CSl9JU0laRQotCWF0dHIgPSBnX2F0dHJfbG9naWNhbF9sZW5ndGg7Ci0JcmV0ID0gZXh0cmFjdF9hdHRyX2Zyb21fcmVxKG9yLCAmYXR0cik7CisJcmV0ID0gZXh0cmFjdF9hdHRyX2Zyb21faW9zKGlvcywgJmF0dHJzWzFdKTsKIAlpZiAocmV0KSB7Ci0JCUVYT0ZTX0VSUigiRVJST1I6IGV4dHJhY3QgYXR0ciBmcm9tIG9yIGZhaWxlZFxuIik7CisJCUVYT0ZTX0VSUigiJXM6IGV4dHJhY3RfYXR0ciBvZiBsb2dpY2FsX2xlbmd0aCBmYWlsZWRcbiIsCisJCQkgIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CiAJfQotCSpzYW5pdHkgPSBnZXRfdW5hbGlnbmVkX2JlNjQoYXR0ci52YWxfcHRyKTsKLSNlbmRpZgorCSpvYmpfc2l6ZSA9IGdldF91bmFsaWduZWRfYmU2NChhdHRyc1sxXS52YWxfcHRyKTsKIAogb3V0OgotCW9zZF9lbmRfcmVxdWVzdChvcik7CisJZXhvZnNfcHV0X2lvX3N0YXRlKGlvcyk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgX19vaV9pbml0KHN0cnVjdCBleG9mc19pX2luZm8gKm9pKQoreworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9pLT5pX3dxKTsKKwlvaS0+aV9mbGFncyA9IDA7Cit9CiAvKgogICogRmlsbCBpbiBhbiBpbm9kZSByZWFkIGZyb20gdGhlIE9TRCBhbmQgc2V0IGl0IHVwIGZvciB1c2UKICAqLwpAQCAtOTE0LDcgKzkxMCw3IEBACiAJc3RydWN0IGV4b2ZzX2lfaW5mbyAqb2k7CiAJc3RydWN0IGV4b2ZzX2ZjYiBmY2I7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQl1aW50NjRfdCB1bmluaXRpYWxpemVkX3ZhcihzYW5pdHkpOworCXVpbnQ2NF90IG9ial9zaXplOwogCWludCByZXQ7CiAKIAlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOwpAQCAtOTIzLDEzICs5MTksMTMgQEAKIAlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKIAkJcmV0dXJuIGlub2RlOwogCW9pID0gZXhvZnNfaShpbm9kZSk7CisJX19vaV9pbml0KG9pKTsKIAogCS8qIHJlYWQgdGhlIGlub2RlIGZyb20gdGhlIG9zZCAqLwotCXJldCA9IGV4b2ZzX2dldF9pbm9kZShzYiwgb2ksICZmY2IsICZzYW5pdHkpOworCXJldCA9IGV4b2ZzX2dldF9pbm9kZShzYiwgb2ksICZmY2IsICZvYmpfc2l6ZSk7CiAJaWYgKHJldCkKIAkJZ290byBiYWRfaW5vZGU7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvaS0+aV93cSk7CiAJc2V0X29ial9jcmVhdGVkKG9pKTsKIAogCS8qIGNvcHkgc3R1ZmYgZnJvbSBvbi1kaXNrIHN0cnVjdCB0byBpbi1tZW1vcnkgc3RydWN0ICovCkBAIC05NDcsMTQgKzk0MywxMiBAQAogCWlub2RlLT5pX2Jsa2JpdHMgPSBFWE9GU19CTEtTSElGVDsKIAlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZmNiLmlfZ2VuZXJhdGlvbik7CiAKLSNpZmRlZiBFWE9GU19ERUJVR19PQkpfSVNJWkUKLQlpZiAoKGlub2RlLT5pX3NpemUgIT0gc2FuaXR5KSAmJgorCWlmICgoaW5vZGUtPmlfc2l6ZSAhPSBvYmpfc2l6ZSkgJiYKIAkJKCFleG9mc19pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKSkgewotCQlFWE9GU19FUlIoIldBUk5JTkc6IFNpemUgb2Ygb2JqZWN0IGZyb20gaW5vZGUgYW5kICIKLQkJCSAgImF0dHJpYnV0ZXMgZGlmZmVyICglbGxkICE9ICVsbHUpXG4iLAotCQkJICBpbm9kZS0+aV9zaXplLCBfTExVKHNhbml0eSkpOworCQlFWE9GU19FUlIoIldBUk5JTkc6IFNpemUgb2YgaW5vZGU9JWxsdSAhPSBvYmplY3Q9JWxsdVxuIiwKKwkJCSAgaW5vZGUtPmlfc2l6ZSwgX0xMVShvYmpfc2l6ZSkpOworCQkvKiBGSVhNRTogY2FsbCBleG9mc19pbm9kZV9yZWNvdmVyeSgpICovCiAJfQotI2VuZGlmCiAKIAlvaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKIApAQCAtMTAyMCwyMyArMTAxNCwzMCBAQAogICogc2V0IHRoZSBvYmpfY3JlYXRlZCBmbGFnIHNvIHRoYXQgb3RoZXIgbWV0aG9kcyBrbm93IHRoYXQgdGhlIG9iamVjdCBleGlzdHMgb24KICAqIHRoZSBPU0QuCiAgKi8KLXN0YXRpYyB2b2lkIGNyZWF0ZV9kb25lKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIHZvaWQgKnApCitzdGF0aWMgdm9pZCBjcmVhdGVfZG9uZShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcywgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcDsKIAlzdHJ1Y3QgZXhvZnNfaV9pbmZvICpvaSA9IGV4b2ZzX2koaW5vZGUpOwogCXN0cnVjdCBleG9mc19zYl9pbmZvICpzYmkgPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOwogCWludCByZXQ7CiAKLQlyZXQgPSBleG9mc19jaGVja19vayhvcik7Ci0Jb3NkX2VuZF9yZXF1ZXN0KG9yKTsKKwlyZXQgPSBleG9mc19jaGVja19pbyhpb3MsIE5VTEwpOworCWV4b2ZzX3B1dF9pb19zdGF0ZShpb3MpOworCiAJYXRvbWljX2RlYygmc2JpLT5zX2N1cnJfcGVuZGluZyk7CiAKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQlFWE9GU19FUlIoIm9iamVjdD0weCVsbHggY3JlYXRpb24gZmFpbGQgaW4gcGlkPTB4JWxseCIsCi0JCQkgIF9MTFUoc2JpLT5zX3BpZCksIF9MTFUoaW5vZGUtPmlfaW5vICsgRVhPRlNfT0JKX09GRikpOwotCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7Ci0JfSBlbHNlCi0JCXNldF9vYmpfY3JlYXRlZChvaSk7CisJCQkgIF9MTFUoZXhvZnNfb2lfb2Jqbm8ob2kpKSwgX0xMVShzYmktPnNfcGlkKSk7CisJCS8qVE9ETzogV2hlbiBGUyBpcyBjb3JydXB0ZWQgY3JlYXRpb24gY2FuIGZhaWwsIG9iamVjdCBhbHJlYWR5CisJCSAqIGV4aXN0LiBHZXQgcmlkIG9mIHRoaXMgYXN5bmNocm9ub3VzIGNyZWF0aW9uLCBpZiBleGlzdAorCQkgKiBpbmNyZW1lbnQgdGhlIG9iaiBjb3VudGVyIGFuZCB0cnkgdGhlIG5leHQgb2JqZWN0LiBVbnRpbCB3ZQorCQkgKiBzdWNjZWVkLiBBbGwgdGhlc2UgZGFuZ2xpbmcgb2JqZWN0cyB3aWxsIGJlIG1hZGUgaW50byBsb3N0CisJCSAqIGZpbGVzIGJ5IGNoa2ZzLmV4b2ZzCisJCSAqLworCX0KKworCXNldF9vYmpfY3JlYXRlZChvaSk7CiAKIAlhdG9taWNfZGVjKCZpbm9kZS0+aV9jb3VudCk7CiAJd2FrZV91cCgmb2ktPmlfd3EpOwpAQCAtMTA1MSw4ICsxMDUyLDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBleG9mc19pX2luZm8gKm9pOwogCXN0cnVjdCBleG9mc19zYl9pbmZvICpzYmk7Ci0Jc3RydWN0IG9zZF9yZXF1ZXN0ICpvcjsKLQlzdHJ1Y3Qgb3NkX29ial9pZCBvYmo7CisJc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3M7CiAJaW50IHJldDsKIAogCXNiID0gZGlyLT5pX3NiOwpAQCAtMTA2MSw4ICsxMDYxLDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlvaSA9IGV4b2ZzX2koaW5vZGUpOworCV9fb2lfaW5pdChvaSk7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvaS0+aV93cSk7CiAJc2V0X29ial8yYmNyZWF0ZWQob2kpOwogCiAJc2JpID0gc2ItPnNfZnNfaW5mbzsKQEAgLTEwODksMjggKzEwODksMjggQEAKIAogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCi0Jb2JqLnBhcnRpdGlvbiA9IHNiaS0+c19waWQ7Ci0Jb2JqLmlkID0gaW5vZGUtPmlfaW5vICsgRVhPRlNfT0JKX09GRjsKLQlleG9mc19tYWtlX2NyZWRlbnRpYWwob2ktPmlfY3JlZCwgJm9iaik7Ci0KLQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19kZXYsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghb3IpKSB7Ci0JCUVYT0ZTX0VSUigiZXhvZnNfbmV3X2lub2RlOiBvc2Rfc3RhcnRfcmVxdWVzdCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlyZXQgPSBleG9mc19nZXRfaW9fc3RhdGUoc2JpLCAmaW9zKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlFWE9GU19FUlIoImV4b2ZzX25ld19pbm9kZTogZXhvZnNfZ2V0X2lvX3N0YXRlIGZhaWxlZFxuIik7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCi0Jb3NkX3JlcV9jcmVhdGVfb2JqZWN0KG9yLCAmb2JqKTsKKwlpb3MtPm9iai5pZCA9IGV4b2ZzX29pX29iam5vKG9pKTsKKwlleG9mc19tYWtlX2NyZWRlbnRpYWwob2ktPmlfY3JlZCwgJmlvcy0+b2JqKTsKIAogCS8qIGluY3JlbWVudCB0aGUgcmVmY291bnQgc28gdGhhdCB0aGUgaW5vZGUgd2lsbCBzdGlsbCBiZSBhcm91bmQgd2hlbiB3ZQogCSAqIHJlYWNoIHRoZSBjYWxsYmFjawogCSAqLwogCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKIAotCXJldCA9IGV4b2ZzX2FzeW5jX29wKG9yLCBjcmVhdGVfZG9uZSwgaW5vZGUsIG9pLT5pX2NyZWQpOworCWlvcy0+ZG9uZSA9IGNyZWF0ZV9kb25lOworCWlvcy0+cHJpdmF0ZSA9IGlub2RlOworCWlvcy0+Y3JlZCA9IG9pLT5pX2NyZWQ7CisJcmV0ID0gZXhvZnNfc2JpX2NyZWF0ZShpb3MpOwogCWlmIChyZXQpIHsKIAkJYXRvbWljX2RlYygmaW5vZGUtPmlfY291bnQpOwotCQlvc2RfZW5kX3JlcXVlc3Qob3IpOwotCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJZXhvZnNfcHV0X2lvX3N0YXRlKGlvcyk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCWF0b21pY19pbmMoJnNiaS0+c19jdXJyX3BlbmRpbmcpOwogCkBAIC0xMTI4LDExICsxMTI4LDExIEBACiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBleG9mc191cGRhdGVfaW5vZGUoKS4KICAqLwotc3RhdGljIHZvaWQgdXBkYXRlaV9kb25lKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIHZvaWQgKnApCitzdGF0aWMgdm9pZCB1cGRhdGVpX2RvbmUoc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MsIHZvaWQgKnApCiB7CiAJc3RydWN0IHVwZGF0ZWlfYXJncyAqYXJncyA9IHA7CiAKLQlvc2RfZW5kX3JlcXVlc3Qob3IpOworCWV4b2ZzX3B1dF9pb19zdGF0ZShpb3MpOwogCiAJYXRvbWljX2RlYygmYXJncy0+c2JpLT5zX2N1cnJfcGVuZGluZyk7CiAKQEAgLTExNDgsOCArMTE0OCw3IEBACiAJc3RydWN0IGV4b2ZzX2lfaW5mbyAqb2kgPSBleG9mc19pKGlub2RlKTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGV4b2ZzX3NiX2luZm8gKnNiaSA9IHNiLT5zX2ZzX2luZm87Ci0Jc3RydWN0IG9zZF9vYmpfaWQgb2JqID0ge3NiaS0+c19waWQsIGlub2RlLT5pX2lubyArIEVYT0ZTX09CSl9PRkZ9OwotCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3I7CisJc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3M7CiAJc3RydWN0IG9zZF9hdHRyIGF0dHI7CiAJc3RydWN0IGV4b2ZzX2ZjYiAqZmNiOwogCXN0cnVjdCB1cGRhdGVpX2FyZ3MgKmFyZ3M7CkBAIC0xMTg2LDE4ICsxMTg1LDE2IEBACiAJfSBlbHNlCiAJCW1lbWNweShmY2ItPmlfZGF0YSwgb2ktPmlfZGF0YSwgc2l6ZW9mKGZjYi0+aV9kYXRhKSk7CiAKLQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19kZXYsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghb3IpKSB7Ci0JCUVYT0ZTX0VSUigiZXhvZnNfdXBkYXRlX2lub2RlOiBvc2Rfc3RhcnRfcmVxdWVzdCBmYWlsZWQuXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZXQgPSBleG9mc19nZXRfaW9fc3RhdGUoc2JpLCAmaW9zKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlFWE9GU19FUlIoIiVzOiBleG9mc19nZXRfaW9fc3RhdGUgZmFpbGVkLlxuIiwgX19mdW5jX18pOwogCQlnb3RvIGZyZWVfYXJnczsKIAl9CiAKLQlvc2RfcmVxX3NldF9hdHRyaWJ1dGVzKG9yLCAmb2JqKTsKLQogCWF0dHIgPSBnX2F0dHJfaW5vZGVfZGF0YTsKIAlhdHRyLnZhbF9wdHIgPSBmY2I7Ci0Jb3NkX3JlcV9hZGRfc2V0X2F0dHJfbGlzdChvciwgJmF0dHIsIDEpOworCWlvcy0+b3V0X2F0dHJfbGVuID0gMTsKKwlpb3MtPm91dF9hdHRyID0gJmF0dHI7CiAKIAlpZiAoIW9ial9jcmVhdGVkKG9pKSkgewogCQlFWE9GU19EQkdNU0coIiFvYmpfY3JlYXRlZFxuIik7CkBAIC0xMjA2LDIyICsxMjAzLDE5IEBACiAJCUVYT0ZTX0RCR01TRygid2FpdF9ldmVudCBkb25lXG4iKTsKIAl9CiAKLQlpZiAoZG9fc3luYykgewotCQlyZXQgPSBleG9mc19zeW5jX29wKG9yLCBzYmktPnNfdGltZW91dCwgb2ktPmlfY3JlZCk7Ci0JCW9zZF9lbmRfcmVxdWVzdChvcik7Ci0JCWdvdG8gZnJlZV9hcmdzOwotCX0gZWxzZSB7CisJaWYgKCFkb19zeW5jKSB7CiAJCWFyZ3MtPnNiaSA9IHNiaTsKKwkJaW9zLT5kb25lID0gdXBkYXRlaV9kb25lOworCQlpb3MtPnByaXZhdGUgPSBhcmdzOworCX0KIAotCQlyZXQgPSBleG9mc19hc3luY19vcChvciwgdXBkYXRlaV9kb25lLCBhcmdzLCBvaS0+aV9jcmVkKTsKLQkJaWYgKHJldCkgewotCQkJb3NkX2VuZF9yZXF1ZXN0KG9yKTsKLQkJCWdvdG8gZnJlZV9hcmdzOwotCQl9CisJcmV0ID0gZXhvZnNfb2lfd3JpdGUob2ksIGlvcyk7CisJaWYgKCFkb19zeW5jICYmICFyZXQpIHsKIAkJYXRvbWljX2luYygmc2JpLT5zX2N1cnJfcGVuZGluZyk7CiAJCWdvdG8gb3V0OyAvKiBkZWFsbG9jYXRpb24gaW4gdXBkYXRlaV9kb25lICovCiAJfQogCisJZXhvZnNfcHV0X2lvX3N0YXRlKGlvcyk7CiBmcmVlX2FyZ3M6CiAJa2ZyZWUoYXJncyk7CiBvdXQ6CkBAIC0xMjM4LDExICsxMjMyLDEyIEBACiAgKiBDYWxsYmFjayBmdW5jdGlvbiBmcm9tIGV4b2ZzX2RlbGV0ZV9pbm9kZSgpIC0gZG9uJ3QgaGF2ZSBtdWNoIGNsZWFuaW5nIHVwIHRvCiAgKiBkby4KICAqLwotc3RhdGljIHZvaWQgZGVsZXRlX2RvbmUoc3RydWN0IG9zZF9yZXF1ZXN0ICpvciwgdm9pZCAqcCkKK3N0YXRpYyB2b2lkIGRlbGV0ZV9kb25lKHN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zLCB2b2lkICpwKQogewotCXN0cnVjdCBleG9mc19zYl9pbmZvICpzYmk7Ci0Jb3NkX2VuZF9yZXF1ZXN0KG9yKTsKLQlzYmkgPSBwOworCXN0cnVjdCBleG9mc19zYl9pbmZvICpzYmkgPSBwOworCisJZXhvZnNfcHV0X2lvX3N0YXRlKGlvcyk7CisKIAlhdG9taWNfZGVjKCZzYmktPnNfY3Vycl9wZW5kaW5nKTsKIH0KIApAQCAtMTI1Niw4ICsxMjUxLDcgQEAKIAlzdHJ1Y3QgZXhvZnNfaV9pbmZvICpvaSA9IGV4b2ZzX2koaW5vZGUpOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgZXhvZnNfc2JfaW5mbyAqc2JpID0gc2ItPnNfZnNfaW5mbzsKLQlzdHJ1Y3Qgb3NkX29ial9pZCBvYmogPSB7c2JpLT5zX3BpZCwgaW5vZGUtPmlfaW5vICsgRVhPRlNfT0JKX09GRn07Ci0Jc3RydWN0IG9zZF9yZXF1ZXN0ICpvcjsKKwlzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvczsKIAlpbnQgcmV0OwogCiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwpAQCAtMTI3NCwyNSArMTI2OCwyNiBAQAogCiAJY2xlYXJfaW5vZGUoaW5vZGUpOwogCi0Jb3IgPSBvc2Rfc3RhcnRfcmVxdWVzdChzYmktPnNfZGV2LCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIW9yKSkgewotCQlFWE9GU19FUlIoImV4b2ZzX2RlbGV0ZV9pbm9kZTogb3NkX3N0YXJ0X3JlcXVlc3QgZmFpbGVkXG4iKTsKKwlyZXQgPSBleG9mc19nZXRfaW9fc3RhdGUoc2JpLCAmaW9zKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlFWE9GU19FUlIoIiVzOiBleG9mc19nZXRfaW9fc3RhdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQlvc2RfcmVxX3JlbW92ZV9vYmplY3Qob3IsICZvYmopOwotCiAJLyogaWYgd2UgYXJlIGRlbGV0aW5nIGFuIG9iaiB0aGF0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LCB3YWl0ICovCiAJaWYgKCFvYmpfY3JlYXRlZChvaSkpIHsKIAkJQlVHX09OKCFvYmpfMmJjcmVhdGVkKG9pKSk7CiAJCXdhaXRfZXZlbnQob2ktPmlfd3EsIG9ial9jcmVhdGVkKG9pKSk7CiAJfQogCi0JcmV0ID0gZXhvZnNfYXN5bmNfb3Aob3IsIGRlbGV0ZV9kb25lLCBzYmksIG9pLT5pX2NyZWQpOworCWlvcy0+b2JqLmlkID0gZXhvZnNfb2lfb2Jqbm8ob2kpOworCWlvcy0+ZG9uZSA9IGRlbGV0ZV9kb25lOworCWlvcy0+cHJpdmF0ZSA9IHNiaTsKKwlpb3MtPmNyZWQgPSBvaS0+aV9jcmVkOworCXJldCA9IGV4b2ZzX3NiaV9yZW1vdmUoaW9zKTsKIAlpZiAocmV0KSB7Ci0JCUVYT0ZTX0VSUigKLQkJICAgICAgICJFUlJPUjogQGV4b2ZzX2RlbGV0ZV9pbm9kZSBleG9mc19hc3luY19vcCBmYWlsZWRcbiIpOwotCQlvc2RfZW5kX3JlcXVlc3Qob3IpOworCQlFWE9GU19FUlIoIiVzOiBleG9mc19zYmlfcmVtb3ZlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlleG9mc19wdXRfaW9fc3RhdGUoaW9zKTsKIAkJcmV0dXJuOwogCX0KIAlhdG9taWNfaW5jKCZzYmktPnNfY3Vycl9wZW5kaW5nKTsKZGlmZiAtLWdpdCBhL2ZzL2V4b2ZzL2lvcy5jIGIvZnMvZXhvZnMvaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhZDAxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4b2ZzL2lvcy5jCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2CisgKiBBdmlzaGF5IFRyYWVnZXIgKGF2aXNoYXlAZ21haWwuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5CisgKiBCb2F6IEhhcnJvc2ggPGJoYXJyb3NoQHBhbmFzYXMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGV4b2ZzLgorICoKKyAqIGV4b2ZzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgU2luY2UgaXQgaXMgYmFzZWQgb24gZXh0MiwgYW5kIHRoZSBvbmx5CisgKiB2YWxpZCB2ZXJzaW9uIG9mIEdQTCBmb3IgdGhlIExpbnV4IGtlcm5lbCBpcyB2ZXJzaW9uIDIsIHRoZSBvbmx5IHZhbGlkCisgKiB2ZXJzaW9uIG9mIEdQTCBmb3IgZXhvZnMgaXMgdmVyc2lvbiAyLgorICoKKyAqIGV4b2ZzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBleG9mczsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorCisjaW5jbHVkZSAiZXhvZnMuaCIKKwordm9pZCBleG9mc19tYWtlX2NyZWRlbnRpYWwodTggY3JlZF9hW09TRF9DQVBfTEVOXSwgY29uc3Qgc3RydWN0IG9zZF9vYmpfaWQgKm9iaikKK3sKKwlvc2Rfc2VjX2luaXRfbm9zZWNfZG9hbGxfY2FwcyhjcmVkX2EsIG9iaiwgZmFsc2UsIHRydWUpOworfQorCitpbnQgZXhvZnNfcmVhZF9rZXJuKHN0cnVjdCBvc2RfZGV2ICpvZCwgdTggKmNyZWQsIHN0cnVjdCBvc2Rfb2JqX2lkICpvYmosCisJCSAgICB1NjQgb2Zmc2V0LCB2b2lkICpwLCB1bnNpZ25lZCBsZW5ndGgpCit7CisJc3RydWN0IG9zZF9yZXF1ZXN0ICpvciA9IG9zZF9zdGFydF9yZXF1ZXN0KG9kLCBHRlBfS0VSTkVMKTsKKy8qCXN0cnVjdCBvc2Rfc2Vuc2VfaW5mbyBvc2kgPSB7LmtleSA9IDB9OyovCisJaW50IHJldDsKKworCWlmICh1bmxpa2VseSghb3IpKSB7CisJCUVYT0ZTX0RCR01TRygiJXM6IG9zZF9zdGFydF9yZXF1ZXN0IGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldCA9IG9zZF9yZXFfcmVhZF9rZXJuKG9yLCBvYmosIG9mZnNldCwgcCwgbGVuZ3RoKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlFWE9GU19EQkdNU0coIiVzOiBvc2RfcmVxX3JlYWRfa2VybiBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9zZF9maW5hbGl6ZV9yZXF1ZXN0KG9yLCAwLCBjcmVkLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlFWE9GU19EQkdNU0coIkZhaWxkIHRvIG9zZF9maW5hbGl6ZV9yZXF1ZXN0KCkgPT4gJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9zZF9leGVjdXRlX3JlcXVlc3Qob3IpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlFWE9GU19EQkdNU0coIm9zZF9leGVjdXRlX3JlcXVlc3QoKSA9PiAlZFxuIiwgcmV0KTsKKwkvKiBvc2RfcmVxX2RlY29kZV9zZW5zZShvciwgcmV0KTsgKi8KKworb3V0OgorCW9zZF9lbmRfcmVxdWVzdChvcik7CisJcmV0dXJuIHJldDsKK30KKworaW50IGV4b2ZzX2dldF9pb19zdGF0ZShzdHJ1Y3QgZXhvZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUqKiBwaW9zKQoreworCXN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zOworCisJLypUT0RPOiBNYXliZSB1c2Uga21lbV9jYWNoIHBlciBzYmkgb2Ygc2l6ZQorCSAqIGV4b2ZzX2lvX3N0YXRlX3NpemUoc2JpLT5zX251bWRldnMpCisJICovCisJaW9zID0ga3phbGxvYyhleG9mc19pb19zdGF0ZV9zaXplKHNiaS0+c19udW1kZXZzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFpb3MpKSB7CisJCSpwaW9zID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW9zLT5zYmkgPSBzYmk7CisJaW9zLT5vYmoucGFydGl0aW9uID0gc2JpLT5zX3BpZDsKKwkqcGlvcyA9IGlvczsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBleG9mc19wdXRfaW9fc3RhdGUoc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MpCit7CisJaWYgKGlvcykgeworCQl1bnNpZ25lZCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBpb3MtPm51bWRldnM7IGkrKykgeworCQkJc3RydWN0IGV4b2ZzX3Blcl9kZXZfc3RhdGUgKnBlcl9kZXYgPSAmaW9zLT5wZXJfZGV2W2ldOworCisJCQlpZiAocGVyX2Rldi0+b3IpCisJCQkJb3NkX2VuZF9yZXF1ZXN0KHBlcl9kZXYtPm9yKTsKKwkJCWlmIChwZXJfZGV2LT5iaW8pCisJCQkJYmlvX3B1dChwZXJfZGV2LT5iaW8pOworCQl9CisKKwkJa2ZyZWUoaW9zKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9zeW5jX2RvbmUoc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MsIHZvaWQgKnApCit7CisJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmcgPSBwOworCisJY29tcGxldGUod2FpdGluZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9sYXN0X2lvKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zID0gY29udGFpbmVyX29mKAorCQkJCQlrcmVmLCBzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUsIGtyZWYpOworCisJaW9zLT5kb25lKGlvcywgaW9zLT5wcml2YXRlKTsKK30KKworc3RhdGljIHZvaWQgX2RvbmVfaW8oc3RydWN0IG9zZF9yZXF1ZXN0ICpvciwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcyA9IHA7CisKKwlrcmVmX3B1dCgmaW9zLT5rcmVmLCBfbGFzdF9pbyk7Cit9CisKK3N0YXRpYyBpbnQgZXhvZnNfaW9fZXhlY3V0ZShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcykKK3sKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh3YWl0KTsKKwlib29sIHN5bmMgPSAoaW9zLT5kb25lID09IE5VTEwpOworCWludCBpLCByZXQ7CisKKwlpZiAoc3luYykgeworCQlpb3MtPmRvbmUgPSBfc3luY19kb25lOworCQlpb3MtPnByaXZhdGUgPSAmd2FpdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9zLT5udW1kZXZzOyBpKyspIHsKKwkJc3RydWN0IG9zZF9yZXF1ZXN0ICpvciA9IGlvcy0+cGVyX2RldltpXS5vcjsKKwkJaWYgKHVubGlrZWx5KCFvcikpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBvc2RfZmluYWxpemVfcmVxdWVzdChvciwgMCwgaW9zLT5jcmVkLCBOVUxMKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCUVYT0ZTX0RCR01TRygiRmFpbGQgdG8gb3NkX2ZpbmFsaXplX3JlcXVlc3QoKSA9PiAlZFxuIiwKKwkJCQkgICAgIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJa3JlZl9pbml0KCZpb3MtPmtyZWYpOworCisJZm9yIChpID0gMDsgaSA8IGlvcy0+bnVtZGV2czsgaSsrKSB7CisJCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3IgPSBpb3MtPnBlcl9kZXZbaV0ub3I7CisJCWlmICh1bmxpa2VseSghb3IpKQorCQkJY29udGludWU7CisKKwkJa3JlZl9nZXQoJmlvcy0+a3JlZik7CisJCW9zZF9leGVjdXRlX3JlcXVlc3RfYXN5bmMob3IsIF9kb25lX2lvLCBpb3MpOworCX0KKworCWtyZWZfcHV0KCZpb3MtPmtyZWYsIF9sYXN0X2lvKTsKKwlyZXQgPSAwOworCisJaWYgKHN5bmMpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CisJCXJldCA9IGV4b2ZzX2NoZWNrX2lvKGlvcywgTlVMTCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBleG9mc19jaGVja19pbyhzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcywgdTY0ICpyZXNpZCkKK3sKKwllbnVtIG9zZF9lcnJfcHJpb3JpdHkgYWN1bXVsYXRlZF9vc2RfZXJyID0gMDsKKwlpbnQgYWN1bXVsYXRlZF9saW5fZXJyID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpb3MtPm51bWRldnM7IGkrKykgeworCQlzdHJ1Y3Qgb3NkX3NlbnNlX2luZm8gb3NpOworCQlpbnQgcmV0ID0gb3NkX3JlcV9kZWNvZGVfc2Vuc2UoaW9zLT5wZXJfZGV2W2ldLm9yLCAmb3NpKTsKKworCQlpZiAobGlrZWx5KCFyZXQpKQorCQkJY29udGludWU7CisKKwkJaWYgKHVubGlrZWx5KHJldCA9PSAtRUZBVUxUKSkgeworCQkJRVhPRlNfREJHTVNHKCIlczogRUZBVUxUIE5lZWQgcGFnZSBjbGVhclxuIiwgX19mdW5jX18pOworCQkJLypGSVhNRTogQWxsIHRoZSBwYWdlcyBpbiB0aGlzIGRldmljZSByYW5nZSBzaG91bGQ6CisJCQkgKgljbGVhcl9oaWdocGFnZShwYWdlKTsKKwkJCSAqLworCQl9CisKKwkJaWYgKG9zaS5vc2RfZXJyX3ByaSA+PSBhY3VtdWxhdGVkX29zZF9lcnIpIHsKKwkJCWFjdW11bGF0ZWRfb3NkX2VyciA9IG9zaS5vc2RfZXJyX3ByaTsKKwkJCWFjdW11bGF0ZWRfbGluX2VyciA9IHJldDsKKwkJfQorCX0KKworCS8qIFRPRE86IHJhaWQgc3BlY2lmaWMgcmVzaWR1YWwgY2FsY3VsYXRpb25zICovCisJaWYgKHJlc2lkKSB7CisJCWlmIChsaWtlbHkoIWFjdW11bGF0ZWRfbGluX2VycikpCisJCQkqcmVzaWQgPSAwOworCQllbHNlCisJCQkqcmVzaWQgPSBpb3MtPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gYWN1bXVsYXRlZF9saW5fZXJyOworfQorCitpbnQgZXhvZnNfc2JpX2NyZWF0ZShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcykKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IGlvcy0+c2JpLT5zX251bWRldnM7IGkrKykgeworCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yOworCisJCW9yID0gb3NkX3N0YXJ0X3JlcXVlc3QoaW9zLT5zYmktPnNfb2RzW2ldLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KCFvcikpIHsKKwkJCUVYT0ZTX0VSUigiJXM6IG9zZF9zdGFydF9yZXF1ZXN0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlvcy0+cGVyX2RldltpXS5vciA9IG9yOworCQlpb3MtPm51bWRldnMrKzsKKworCQlvc2RfcmVxX2NyZWF0ZV9vYmplY3Qob3IsICZpb3MtPm9iaik7CisJfQorCXJldCA9IGV4b2ZzX2lvX2V4ZWN1dGUoaW9zKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBleG9mc19zYmlfcmVtb3ZlKHN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zKQoreworCWludCBpLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9zLT5zYmktPnNfbnVtZGV2czsgaSsrKSB7CisJCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3I7CisKKwkJb3IgPSBvc2Rfc3RhcnRfcmVxdWVzdChpb3MtPnNiaS0+c19vZHNbaV0sIEdGUF9LRVJORUwpOworCQlpZiAodW5saWtlbHkoIW9yKSkgeworCQkJRVhPRlNfRVJSKCIlczogb3NkX3N0YXJ0X3JlcXVlc3QgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJaW9zLT5wZXJfZGV2W2ldLm9yID0gb3I7CisJCWlvcy0+bnVtZGV2cysrOworCisJCW9zZF9yZXFfcmVtb3ZlX29iamVjdChvciwgJmlvcy0+b2JqKTsKKwl9CisJcmV0ID0gZXhvZnNfaW9fZXhlY3V0ZShpb3MpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IGV4b2ZzX3NiaV93cml0ZShzdHJ1Y3QgZXhvZnNfaW9fc3RhdGUgKmlvcykKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IGlvcy0+c2JpLT5zX251bWRldnM7IGkrKykgeworCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yOworCisJCW9yID0gb3NkX3N0YXJ0X3JlcXVlc3QoaW9zLT5zYmktPnNfb2RzW2ldLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KCFvcikpIHsKKwkJCUVYT0ZTX0VSUigiJXM6IG9zZF9zdGFydF9yZXF1ZXN0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlvcy0+cGVyX2RldltpXS5vciA9IG9yOworCQlpb3MtPm51bWRldnMrKzsKKworCQlpZiAoaW9zLT5iaW8pIHsKKwkJCXN0cnVjdCBiaW8gKmJpbzsKKworCQkJaWYgKGkgIT0gMCkgeworCQkJCWJpbyA9IGJpb19rbWFsbG9jKEdGUF9LRVJORUwsCisJCQkJCQkgIGlvcy0+YmlvLT5iaV9tYXhfdmVjcyk7CisJCQkJaWYgKHVubGlrZWx5KCFiaW8pKSB7CisJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCV9fYmlvX2Nsb25lKGJpbywgaW9zLT5iaW8pOworCQkJCWJpby0+YmlfYmRldiA9IE5VTEw7CisJCQkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKKwkJCQlpb3MtPnBlcl9kZXZbaV0uYmlvID0gIGJpbzsKKwkJCX0gZWxzZSB7CisJCQkJYmlvID0gaW9zLT5iaW87CisJCQl9CisKKwkJCW9zZF9yZXFfd3JpdGUob3IsICZpb3MtPm9iaiwgaW9zLT5vZmZzZXQsIGJpbywKKwkJCQkgICAgICBpb3MtPmxlbmd0aCk7CisvKgkJCUVYT0ZTX0RCR01TRygid3JpdGUgc3luYz0lZFxuIiwgc3luYyk7Ki8KKwkJfSBlbHNlIGlmIChpb3MtPmtlcm5fYnVmZikgeworCQkJb3NkX3JlcV93cml0ZV9rZXJuKG9yLCAmaW9zLT5vYmosIGlvcy0+b2Zmc2V0LAorCQkJCQkgICBpb3MtPmtlcm5fYnVmZiwgaW9zLT5sZW5ndGgpOworLyoJCQlFWE9GU19EQkdNU0coIndyaXRlX2tlcm4gc3luYz0lZFxuIiwgc3luYyk7Ki8KKwkJfSBlbHNlIHsKKwkJCW9zZF9yZXFfc2V0X2F0dHJpYnV0ZXMob3IsICZpb3MtPm9iaik7CisvKgkJCUVYT0ZTX0RCR01TRygic2V0X2F0dHJpYnV0ZXMgc3luYz0lZFxuIiwgc3luYyk7Ki8KKwkJfQorCisJCWlmIChpb3MtPm91dF9hdHRyKQorCQkJb3NkX3JlcV9hZGRfc2V0X2F0dHJfbGlzdChvciwgaW9zLT5vdXRfYXR0ciwKKwkJCQkJCSAgaW9zLT5vdXRfYXR0cl9sZW4pOworCisJCWlmIChpb3MtPmluX2F0dHIpCisJCQlvc2RfcmVxX2FkZF9nZXRfYXR0cl9saXN0KG9yLCBpb3MtPmluX2F0dHIsCisJCQkJCQkgIGlvcy0+aW5fYXR0cl9sZW4pOworCX0KKwlyZXQgPSBleG9mc19pb19leGVjdXRlKGlvcyk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZXhvZnNfc2JpX3JlYWQoc3RydWN0IGV4b2ZzX2lvX3N0YXRlICppb3MpCit7CisJaW50IGksIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHsKKwkJc3RydWN0IG9zZF9yZXF1ZXN0ICpvcjsKKwkJdW5zaWduZWQgZmlyc3RfZGV2ID0gKHVuc2lnbmVkKWlvcy0+b2JqLmlkOworCisJCWZpcnN0X2RldiAlPSBpb3MtPnNiaS0+c19udW1kZXZzOworCQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KGlvcy0+c2JpLT5zX29kc1tmaXJzdF9kZXZdLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KCFvcikpIHsKKwkJCUVYT0ZTX0VSUigiJXM6IG9zZF9zdGFydF9yZXF1ZXN0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlvcy0+cGVyX2RldltpXS5vciA9IG9yOworCQlpb3MtPm51bWRldnMrKzsKKworCQlpZiAoaW9zLT5iaW8pIHsKKwkJCW9zZF9yZXFfcmVhZChvciwgJmlvcy0+b2JqLCBpb3MtPm9mZnNldCwgaW9zLT5iaW8sCisJCQkJICAgICBpb3MtPmxlbmd0aCk7CisvKgkJCUVYT0ZTX0RCR01TRygicmVhZCBzeW5jPSVkXG4iLCBzeW5jKTsqLworCQl9IGVsc2UgaWYgKGlvcy0+a2Vybl9idWZmKSB7CisJCQlvc2RfcmVxX3JlYWRfa2VybihvciwgJmlvcy0+b2JqLCBpb3MtPm9mZnNldCwKKwkJCQkJICAgaW9zLT5rZXJuX2J1ZmYsIGlvcy0+bGVuZ3RoKTsKKy8qCQkJRVhPRlNfREJHTVNHKCJyZWFkX2tlcm4gc3luYz0lZFxuIiwgc3luYyk7Ki8KKwkJfSBlbHNlIHsKKwkJCW9zZF9yZXFfZ2V0X2F0dHJpYnV0ZXMob3IsICZpb3MtPm9iaik7CisvKgkJCUVYT0ZTX0RCR01TRygiZ2V0X2F0dHJpYnV0ZXMgc3luYz0lZFxuIiwgc3luYyk7Ki8KKwkJfQorCisJCWlmIChpb3MtPm91dF9hdHRyKQorCQkJb3NkX3JlcV9hZGRfc2V0X2F0dHJfbGlzdChvciwgaW9zLT5vdXRfYXR0ciwKKwkJCQkJCSAgaW9zLT5vdXRfYXR0cl9sZW4pOworCisJCWlmIChpb3MtPmluX2F0dHIpCisJCQlvc2RfcmVxX2FkZF9nZXRfYXR0cl9saXN0KG9yLCBpb3MtPmluX2F0dHIsCisJCQkJCQkgIGlvcy0+aW5fYXR0cl9sZW4pOworCX0KKwlyZXQgPSBleG9mc19pb19leGVjdXRlKGlvcyk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZXh0cmFjdF9hdHRyX2Zyb21faW9zKHN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zLCBzdHJ1Y3Qgb3NkX2F0dHIgKmF0dHIpCit7CisJc3RydWN0IG9zZF9hdHRyIGN1cl9hdHRyID0gey5hdHRyX3BhZ2UgPSAwfTsgLyogc3RhcnQgd2l0aCB6ZXJvcyAqLworCXZvaWQgKml0ZXIgPSBOVUxMOworCWludCBuZWxlbTsKKworCWRvIHsKKwkJbmVsZW0gPSAxOworCQlvc2RfcmVxX2RlY29kZV9nZXRfYXR0cl9saXN0KGlvcy0+cGVyX2RldlswXS5vciwKKwkJCQkJICAgICAmY3VyX2F0dHIsICZuZWxlbSwgJml0ZXIpOworCQlpZiAoKGN1cl9hdHRyLmF0dHJfcGFnZSA9PSBhdHRyLT5hdHRyX3BhZ2UpICYmCisJCSAgICAoY3VyX2F0dHIuYXR0cl9pZCA9PSBhdHRyLT5hdHRyX2lkKSkgeworCQkJYXR0ci0+bGVuID0gY3VyX2F0dHIubGVuOworCQkJYXR0ci0+dmFsX3B0ciA9IGN1cl9hdHRyLnZhbF9wdHI7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKGl0ZXIpOworCisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBleG9mc19vaV90cnVuY2F0ZShzdHJ1Y3QgZXhvZnNfaV9pbmZvICpvaSwgdTY0IHNpemUpCit7CisJc3RydWN0IGV4b2ZzX3NiX2luZm8gKnNiaSA9IG9pLT52ZnNfaW5vZGUuaV9zYi0+c19mc19pbmZvOworCXN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zOworCXN0cnVjdCBvc2RfYXR0ciBhdHRyOworCV9fYmU2NCBuZXdzaXplOworCWludCBpLCByZXQ7CisKKwlpZiAoZXhvZnNfZ2V0X2lvX3N0YXRlKHNiaSwgJmlvcykpCisJCXJldHVybiAtRU5PTUVNOworCisJaW9zLT5vYmouaWQgPSBleG9mc19vaV9vYmpubyhvaSk7CisJaW9zLT5jcmVkID0gb2ktPmlfY3JlZDsKKworCW5ld3NpemUgPSBjcHVfdG9fYmU2NChzaXplKTsKKwlhdHRyID0gZ19hdHRyX2xvZ2ljYWxfbGVuZ3RoOworCWF0dHIudmFsX3B0ciA9ICZuZXdzaXplOworCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19udW1kZXZzOyBpKyspIHsKKwkJc3RydWN0IG9zZF9yZXF1ZXN0ICpvcjsKKworCQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19vZHNbaV0sIEdGUF9LRVJORUwpOworCQlpZiAodW5saWtlbHkoIW9yKSkgeworCQkJRVhPRlNfRVJSKCIlczogb3NkX3N0YXJ0X3JlcXVlc3QgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJaW9zLT5wZXJfZGV2W2ldLm9yID0gb3I7CisJCWlvcy0+bnVtZGV2cysrOworCisJCW9zZF9yZXFfc2V0X2F0dHJpYnV0ZXMob3IsICZpb3MtPm9iaik7CisJCW9zZF9yZXFfYWRkX3NldF9hdHRyX2xpc3Qob3IsICZhdHRyLCAxKTsKKwl9CisJcmV0ID0gZXhvZnNfaW9fZXhlY3V0ZShpb3MpOworCitvdXQ6CisJZXhvZnNfcHV0X2lvX3N0YXRlKGlvcyk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4b2ZzL29zZC5jIGIvZnMvZXhvZnMvb3NkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzI1NDIuLjAwMDAwMDAKLS0tIGEvZnMvZXhvZnMvb3NkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNgotICogQXZpc2hheSBUcmFlZ2VyIChhdmlzaGF5QGdtYWlsLmNvbSkKLSAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOQotICogQm9heiBIYXJyb3NoIDxiaGFycm9zaEBwYW5hc2FzLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBleG9mcy4KLSAqCi0gKiBleG9mcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFNpbmNlIGl0IGlzIGJhc2VkIG9uIGV4dDIsIGFuZCB0aGUgb25seQotICogdmFsaWQgdmVyc2lvbiBvZiBHUEwgZm9yIHRoZSBMaW51eCBrZXJuZWwgaXMgdmVyc2lvbiAyLCB0aGUgb25seSB2YWxpZAotICogdmVyc2lvbiBvZiBHUEwgZm9yIGV4b2ZzIGlzIHZlcnNpb24gMi4KLSAqCi0gKiBleG9mcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggZXhvZnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxzY3NpL29zZF9zZW5zZS5oPgotCi0jaW5jbHVkZSAiZXhvZnMuaCIKLQotaW50IGV4b2ZzX2NoZWNrX29rX3Jlc2lkKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIHU2NCAqaW5fcmVzaWQsIHU2NCAqb3V0X3Jlc2lkKQotewotCXN0cnVjdCBvc2Rfc2Vuc2VfaW5mbyBvc2k7Ci0JaW50IHJldCA9IG9zZF9yZXFfZGVjb2RlX3NlbnNlKG9yLCAmb3NpKTsKLQotCWlmIChyZXQpIHsgLyogdHJhbnNsYXRlIHRvIExpbnV4IGNvZGVzICovCi0JCWlmIChvc2kuYWRkaXRpb25hbF9jb2RlID09IHNjc2lfaW52YWxpZF9maWVsZF9pbl9jZGIpIHsKLQkJCWlmIChvc2kuY2RiX2ZpZWxkX29mZnNldCA9PSBPU0RfQ0ZPX1NUQVJUSU5HX0JZVEUpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWlmIChvc2kuY2RiX2ZpZWxkX29mZnNldCA9PSBPU0RfQ0ZPX09CSkVDVF9JRCkKLQkJCQlyZXQgPSAtRU5PRU5UOwotCQkJZWxzZQotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0gZWxzZSBpZiAob3NpLmFkZGl0aW9uYWxfY29kZSA9PSBvc2RfcXVvdGFfZXJyb3IpCi0JCQlyZXQgPSAtRU5PU1BDOwotCQllbHNlCi0JCQlyZXQgPSAtRUlPOwotCX0KLQotCS8qIEZJWE1FOiBzaG91bGQgYmUgaW5jbHVkZSBpbiBvc2Rfc2Vuc2VfaW5mbyAqLwotCWlmIChpbl9yZXNpZCkKLQkJKmluX3Jlc2lkID0gb3ItPmluLnJlcSA/IG9yLT5pbi5yZXEtPnJlc2lkX2xlbiA6IDA7Ci0KLQlpZiAob3V0X3Jlc2lkKQotCQkqb3V0X3Jlc2lkID0gb3ItPm91dC5yZXEgPyBvci0+b3V0LnJlcS0+cmVzaWRfbGVuIDogMDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZXhvZnNfbWFrZV9jcmVkZW50aWFsKHU4IGNyZWRfYVtPU0RfQ0FQX0xFTl0sIGNvbnN0IHN0cnVjdCBvc2Rfb2JqX2lkICpvYmopCi17Ci0Jb3NkX3NlY19pbml0X25vc2VjX2RvYWxsX2NhcHMoY3JlZF9hLCBvYmosIGZhbHNlLCB0cnVlKTsKLX0KLQotLyoKLSAqIFBlcmZvcm0gYSBzeW5jaHJvbm91cyBPU0Qgb3BlcmF0aW9uLgotICovCi1pbnQgZXhvZnNfc3luY19vcChzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yLCBpbnQgdGltZW91dCwgdWludDhfdCAqY3JlZGVudGlhbCkKLXsKLQlpbnQgcmV0OwotCi0Jb3ItPnRpbWVvdXQgPSB0aW1lb3V0OwotCXJldCA9IG9zZF9maW5hbGl6ZV9yZXF1ZXN0KG9yLCAwLCBjcmVkZW50aWFsLCBOVUxMKTsKLQlpZiAocmV0KSB7Ci0JCUVYT0ZTX0RCR01TRygiRmFpbGQgdG8gb3NkX2ZpbmFsaXplX3JlcXVlc3QoKSA9PiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBvc2RfZXhlY3V0ZV9yZXF1ZXN0KG9yKTsKLQotCWlmIChyZXQpCi0JCUVYT0ZTX0RCR01TRygib3NkX2V4ZWN1dGVfcmVxdWVzdCgpID0+ICVkXG4iLCByZXQpOwotCS8qIG9zZF9yZXFfZGVjb2RlX3NlbnNlKG9yLCByZXQpOyAqLwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGFuIGFzeW5jaHJvbm91cyBPU0Qgb3BlcmF0aW9uLgotICovCi1pbnQgZXhvZnNfYXN5bmNfb3Aoc3RydWN0IG9zZF9yZXF1ZXN0ICpvciwgb3NkX3JlcV9kb25lX2ZuICphc3luY19kb25lLAotCQkgICB2b2lkICpjYWxsZXJfY29udGV4dCwgdTggKmNyZWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG9zZF9maW5hbGl6ZV9yZXF1ZXN0KG9yLCAwLCBjcmVkLCBOVUxMKTsKLQlpZiAocmV0KSB7Ci0JCUVYT0ZTX0RCR01TRygiRmFpbGQgdG8gb3NkX2ZpbmFsaXplX3JlcXVlc3QoKSA9PiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBvc2RfZXhlY3V0ZV9yZXF1ZXN0X2FzeW5jKG9yLCBhc3luY19kb25lLCBjYWxsZXJfY29udGV4dCk7Ci0KLQlpZiAocmV0KQotCQlFWE9GU19EQkdNU0coIm9zZF9leGVjdXRlX3JlcXVlc3RfYXN5bmMoKSA9PiAlZFxuIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZXh0cmFjdF9hdHRyX2Zyb21fcmVxKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIHN0cnVjdCBvc2RfYXR0ciAqYXR0cikKLXsKLQlzdHJ1Y3Qgb3NkX2F0dHIgY3VyX2F0dHIgPSB7LmF0dHJfcGFnZSA9IDB9OyAvKiBzdGFydCB3aXRoIHplcm9zICovCi0Jdm9pZCAqaXRlciA9IE5VTEw7Ci0JaW50IG5lbGVtOwotCi0JZG8gewotCQluZWxlbSA9IDE7Ci0JCW9zZF9yZXFfZGVjb2RlX2dldF9hdHRyX2xpc3Qob3IsICZjdXJfYXR0ciwgJm5lbGVtLCAmaXRlcik7Ci0JCWlmICgoY3VyX2F0dHIuYXR0cl9wYWdlID09IGF0dHItPmF0dHJfcGFnZSkgJiYKLQkJICAgIChjdXJfYXR0ci5hdHRyX2lkID09IGF0dHItPmF0dHJfaWQpKSB7Ci0JCQlhdHRyLT5sZW4gPSBjdXJfYXR0ci5sZW47Ci0JCQlhdHRyLT52YWxfcHRyID0gY3VyX2F0dHIudmFsX3B0cjsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSB3aGlsZSAoaXRlcik7Ci0KLQlyZXR1cm4gLUVJTzsKLX0KZGlmZiAtLWdpdCBhL2ZzL2V4b2ZzL3BuZnMuaCBiL2ZzL2V4b2ZzL3BuZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjMwMzNhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXhvZnMvcG5mcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkKKyAqIEJvYXogSGFycm9zaCA8YmhhcnJvc2hAcGFuYXNhcy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgZXhvZnMuCisgKgorICogZXhvZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworLyogRklYTUU6IFJlbW92ZSB0aGlzIGZpbGUgb25jZSBwbmZzIGhpdHMgbWFpbmxpbmUgKi8KKworI2lmbmRlZiBfX0VYT0ZTX1BORlNfSF9fCisjZGVmaW5lIF9fRVhPRlNfUE5GU19IX18KKworI2lmIGRlZmluZWQoQ09ORklHX1BORlMpCisKKworLyogRklYTUU6IG1vdmUgdGhpcyBmaWxlIHRvOiBsaW51eC9leHBvcnRmcy9wbmZzX29zZF94ZHIuaCAqLworI2luY2x1ZGUgIi4uL25mcy9vYmpsYXlvdXQvcG5mc19vc2RfeGRyLmgiCisKKyNlbHNlIC8qIGRlZmluZWQoQ09ORklHX1BORlMpICovCisKK2VudW0gcG5mc19pb21vZGUgeworCUlPTU9ERV9SRUFEID0gMSwKKwlJT01PREVfUlcgPSAyLAorCUlPTU9ERV9BTlkgPSAzLAorfTsKKworLyogTGF5b3V0IFN0cnVjdHVyZSAqLworZW51bSBwbmZzX29zZF9yYWlkX2FsZ29yaXRobTQgeworCVBORlNfT1NEX1JBSURfMAkJPSAxLAorCVBORlNfT1NEX1JBSURfNAkJPSAyLAorCVBORlNfT1NEX1JBSURfNQkJPSAzLAorCVBORlNfT1NEX1JBSURfUFEJPSA0ICAgICAvKiBSZWVkLVNvbG9tb24gUCtRICovCit9OworCitzdHJ1Y3QgcG5mc19vc2RfZGF0YV9tYXAgeworCXUzMglvZG1fbnVtX2NvbXBzOworCXU2NAlvZG1fc3RyaXBlX3VuaXQ7CisJdTMyCW9kbV9ncm91cF93aWR0aDsKKwl1MzIJb2RtX2dyb3VwX2RlcHRoOworCXUzMglvZG1fbWlycm9yX2NudDsKKwl1MzIJb2RtX3JhaWRfYWxnb3JpdGhtOworfTsKKworI2VuZGlmIC8qIGVsc2UgZGVmaW5lZChDT05GSUdfUE5GUykgKi8KKworI2VuZGlmIC8qIF9fRVhPRlNfUE5GU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2V4b2ZzL3N1cGVyLmMgYi9mcy9leG9mcy9zdXBlci5jCmluZGV4IDlmNTAwZGUuLmExZDFlNzcgMTAwNjQ0Ci0tLSBhL2ZzL2V4b2ZzL3N1cGVyLmMKKysrIGIvZnMvZXhvZnMvc3VwZXIuYwpAQCAtMjAzLDQ5ICsyMDMsNDUgQEAKIHsKIAlzdHJ1Y3QgZXhvZnNfc2JfaW5mbyAqc2JpOwogCXN0cnVjdCBleG9mc19mc2NiICpmc2NiOwotCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3I7Ci0Jc3RydWN0IG9zZF9vYmpfaWQgb2JqOworCXN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zOwogCWludCByZXQgPSAtRU5PTUVNOwogCi0JZnNjYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBleG9mc19mc2NiKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmc2NiKSB7Ci0JCUVYT0ZTX0VSUigiZXhvZnNfd3JpdGVfc3VwZXI6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlsb2NrX3N1cGVyKHNiKTsKIAlzYmkgPSBzYi0+c19mc19pbmZvOworCWZzY2IgPSAmc2JpLT5zX2ZzY2I7CisKKwlyZXQgPSBleG9mc19nZXRfaW9fc3RhdGUoc2JpLCAmaW9zKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIE5vdGU6IFdlIG9ubHkgd3JpdGUgdGhlIGNoYW5naW5nIHBhcnQgb2YgdGhlIGZzY2IuIC5pLmUgdXB0byB0aGUKKwkgKiAgICAgICB0aGUgZnNjYi0+c19kZXZfdGFibGVfb2lkIG1lbWJlci4gVGhlcmUgaXMgbm8gcmVhZC1tb2RpZnktd3JpdGUKKwkgKiAgICAgICBoZXJlLgorCSAqLworCWlvcy0+bGVuZ3RoID0gb2Zmc2V0b2Yoc3RydWN0IGV4b2ZzX2ZzY2IsIHNfZGV2X3RhYmxlX29pZCk7CisJbWVtc2V0KGZzY2IsIDAsIGlvcy0+bGVuZ3RoKTsKIAlmc2NiLT5zX25leHRpZCA9IGNwdV90b19sZTY0KHNiaS0+c19uZXh0aWQpOwogCWZzY2ItPnNfbnVtZmlsZXMgPSBjcHVfdG9fbGUzMihzYmktPnNfbnVtZmlsZXMpOwogCWZzY2ItPnNfbWFnaWMgPSBjcHVfdG9fbGUxNihzYi0+c19tYWdpYyk7CiAJZnNjYi0+c19uZXdmcyA9IDA7CisJZnNjYi0+c192ZXJzaW9uID0gRVhPRlNfRlNDQl9WRVI7CiAKLQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19kZXYsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghb3IpKSB7Ci0JCUVYT0ZTX0VSUigiZXhvZnNfd3JpdGVfc3VwZXI6IG9zZF9zdGFydF9yZXF1ZXN0IGZhaWxlZC5cbiIpOwotCQlnb3RvIG91dDsKLQl9CisJaW9zLT5vYmouaWQgPSBFWE9GU19TVVBFUl9JRDsKKwlpb3MtPm9mZnNldCA9IDA7CisJaW9zLT5rZXJuX2J1ZmYgPSBmc2NiOworCWlvcy0+Y3JlZCA9IHNiaS0+c19jcmVkOwogCi0Jb2JqLnBhcnRpdGlvbiA9IHNiaS0+c19waWQ7Ci0Jb2JqLmlkID0gRVhPRlNfU1VQRVJfSUQ7Ci0JcmV0ID0gb3NkX3JlcV93cml0ZV9rZXJuKG9yLCAmb2JqLCAwLCBmc2NiLCBzaXplb2YoKmZzY2IpKTsKKwlyZXQgPSBleG9mc19zYmlfd3JpdGUoaW9zKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewotCQlFWE9GU19FUlIoImV4b2ZzX3dyaXRlX3N1cGVyOiBvc2RfcmVxX3dyaXRlX2tlcm4gZmFpbGVkLlxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IGV4b2ZzX3N5bmNfb3Aob3IsIHNiaS0+c190aW1lb3V0LCBzYmktPnNfY3JlZCk7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJRVhPRlNfRVJSKCJleG9mc193cml0ZV9zdXBlcjogZXhvZnNfc3luY19vcCBmYWlsZWQuXG4iKTsKKwkJRVhPRlNfRVJSKCIlczogZXhvZnNfc2JpX3dyaXRlIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CiAJfQogCXNiLT5zX2RpcnQgPSAwOwogCiBvdXQ6Ci0JaWYgKG9yKQotCQlvc2RfZW5kX3JlcXVlc3Qob3IpOworCUVYT0ZTX0RCR01TRygic19uZXh0aWQ9MHglbGx4IHJldD0lZFxuIiwgX0xMVShzYmktPnNfbmV4dGlkKSwgcmV0KTsKKwlleG9mc19wdXRfaW9fc3RhdGUoaW9zKTsKIAl1bmxvY2tfc3VwZXIoc2IpOwotCWtmcmVlKGZzY2IpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI1Nyw2ICsyNTMsMjkgQEAKIAkJc2ItPnNfZGlydCA9IDA7CiB9CiAKK3N0YXRpYyB2b2lkIF9leG9mc19wcmludF9kZXZpY2UoY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICpkZXZfcGF0aCwKKwkJCQlzdHJ1Y3Qgb3NkX2RldiAqb2QsIHU2NCBwaWQpCit7CisJY29uc3Qgc3RydWN0IG9zZF9kZXZfaW5mbyAqb2RpID0gb3NkdWxkX2RldmljZV9pbmZvKG9kKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiZXhvZnM6ICVzICVzIG9zZF9uYW1lLSVzIHBpZC0weCVsbHhcbiIsCisJCW1zZywgZGV2X3BhdGggPzogIiIsIG9kaS0+b3NkbmFtZSwgX0xMVShwaWQpKTsKK30KKwordm9pZCBleG9mc19mcmVlX3NiaShzdHJ1Y3QgZXhvZnNfc2JfaW5mbyAqc2JpKQoreworCXdoaWxlIChzYmktPnNfbnVtZGV2cykgeworCQlpbnQgaSA9IC0tc2JpLT5zX251bWRldnM7CisJCXN0cnVjdCBvc2RfZGV2ICpvZCA9IHNiaS0+c19vZHNbaV07CisKKwkJaWYgKG9kKSB7CisJCQlzYmktPnNfb2RzW2ldID0gTlVMTDsKKwkJCW9zZHVsZF9wdXRfZGV2aWNlKG9kKTsKKwkJfQorCX0KKwlrZnJlZShzYmkpOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmZzIGlzIGZyZWVpbmcgdGhlIHN1cGVyYmxvY2suICBXZSBqdXN0CiAgKiBuZWVkIHRvIGZyZWUgb3VyIG93biBwYXJ0LgpAQCAtMjc5LDExICsyOTgsMTgyIEBACiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwogCX0KIAotCW9zZHVsZF9wdXRfZGV2aWNlKHNiaS0+c19kZXYpOwotCWtmcmVlKHNiLT5zX2ZzX2luZm8pOworCV9leG9mc19wcmludF9kZXZpY2UoIlVubW91bnRpbmciLCBOVUxMLCBzYmktPnNfb2RzWzBdLCBzYmktPnNfcGlkKTsKKworCWV4b2ZzX2ZyZWVfc2JpKHNiaSk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQgX3JlYWRfYW5kX21hdGNoX2RhdGFfbWFwKHN0cnVjdCBleG9mc19zYl9pbmZvICpzYmksIHVuc2lnbmVkIG51bWRldnMsCisJCQkJICAgIHN0cnVjdCBleG9mc19kZXZpY2VfdGFibGUgKmR0KQoreworCXNiaS0+ZGF0YV9tYXAub2RtX251bV9jb21wcyAgID0KKwkJCQlsZTMyX3RvX2NwdShkdC0+ZHRfZGF0YV9tYXAuY2JfbnVtX2NvbXBzKTsKKwlzYmktPmRhdGFfbWFwLm9kbV9zdHJpcGVfdW5pdCA9CisJCQkJbGU2NF90b19jcHUoZHQtPmR0X2RhdGFfbWFwLmNiX3N0cmlwZV91bml0KTsKKwlzYmktPmRhdGFfbWFwLm9kbV9ncm91cF93aWR0aCA9CisJCQkJbGUzMl90b19jcHUoZHQtPmR0X2RhdGFfbWFwLmNiX2dyb3VwX3dpZHRoKTsKKwlzYmktPmRhdGFfbWFwLm9kbV9ncm91cF9kZXB0aCA9CisJCQkJbGUzMl90b19jcHUoZHQtPmR0X2RhdGFfbWFwLmNiX2dyb3VwX2RlcHRoKTsKKwlzYmktPmRhdGFfbWFwLm9kbV9taXJyb3JfY250ICA9CisJCQkJbGUzMl90b19jcHUoZHQtPmR0X2RhdGFfbWFwLmNiX21pcnJvcl9jbnQpOworCXNiaS0+ZGF0YV9tYXAub2RtX3JhaWRfYWxnb3JpdGhtICA9CisJCQkJbGUzMl90b19jcHUoZHQtPmR0X2RhdGFfbWFwLmNiX3JhaWRfYWxnb3JpdGhtKTsKKworLyogRklYTUU6IEhhcmQgY29kZWQgbWlycm9yIG9ubHkgZm9yIG5vdy4gaWYgbm90IHNvIGRvIG5vdCBtb3VudCAqLworCWlmICgoc2JpLT5kYXRhX21hcC5vZG1fbnVtX2NvbXBzICE9IG51bWRldnMpIHx8CisJICAgIChzYmktPmRhdGFfbWFwLm9kbV9zdHJpcGVfdW5pdCAhPSBFWE9GU19CTEtTSVpFKSB8fAorCSAgICAoc2JpLT5kYXRhX21hcC5vZG1fcmFpZF9hbGdvcml0aG0gIT0gUE5GU19PU0RfUkFJRF8wKSB8fAorCSAgICAoc2JpLT5kYXRhX21hcC5vZG1fbWlycm9yX2NudCAhPSAobnVtZGV2cyAtIDEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogQG9kaSBpcyB2YWxpZCBvbmx5IGFzIGxvbmcgYXMgQGZzY2JfZGV2IGlzIHZhbGlkICovCitzdGF0aWMgaW50IGV4b2ZzX2RldnNfMl9vZGkoc3RydWN0IGV4b2ZzX2R0X2RldmljZV9pbmZvICpkdF9kZXYsCisJCQkgICAgIHN0cnVjdCBvc2RfZGV2X2luZm8gKm9kaSkKK3sKKwlvZGktPnN5c3RlbWlkX2xlbiA9IGxlMzJfdG9fY3B1KGR0X2Rldi0+c3lzdGVtaWRfbGVuKTsKKwltZW1jcHkob2RpLT5zeXN0ZW1pZCwgZHRfZGV2LT5zeXN0ZW1pZCwgb2RpLT5zeXN0ZW1pZF9sZW4pOworCisJb2RpLT5vc2RuYW1lX2xlbiA9IGxlMzJfdG9fY3B1KGR0X2Rldi0+b3NkbmFtZV9sZW4pOworCW9kaS0+b3NkbmFtZSA9IGR0X2Rldi0+b3NkbmFtZTsKKworCS8qIEZJWE1FIHN1cHBvcnQgbG9uZyBuYW1lcy4gV2lsbCBuZWVkIGEgX3B1dCBmdW5jdGlvbiAqLworCWlmIChkdF9kZXYtPmxvbmdfbmFtZV9vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWFrZSBzdXJlIG9zZG5hbWUgaXMgcHJpbnRhYmxlIQorCSAqIG1rZXhvZnMgc2hvdWxkIGdpdmUgdXMgc3BhY2UgZm9yIGEgbnVsbC10ZXJtaW5hdG9yIGVsc2UgdGhlCisJICogZGV2aWNlLXRhYmxlIGlzIGludmFsaWQuCisJICovCisJaWYgKHVubGlrZWx5KG9kaS0+b3NkbmFtZV9sZW4gPj0gc2l6ZW9mKGR0X2Rldi0+b3NkbmFtZSkpKQorCQlvZGktPm9zZG5hbWVfbGVuID0gc2l6ZW9mKGR0X2Rldi0+b3NkbmFtZSkgLSAxOworCWR0X2Rldi0+b3NkbmFtZVtvZGktPm9zZG5hbWVfbGVuXSA9IDA7CisKKwkvKiBJZiBpdCdzIGFsbCB6ZXJvcyBzb21ldGhpbmcgaXMgYmFkIHdlIHJlYWQgcGFzdCBlbmQtb2Ytb2JqICovCisJcmV0dXJuICEob2RpLT5zeXN0ZW1pZF9sZW4gfHwgb2RpLT5vc2RuYW1lX2xlbik7Cit9CisKK3N0YXRpYyBpbnQgZXhvZnNfcmVhZF9sb29rdXBfZGV2X3RhYmxlKHN0cnVjdCBleG9mc19zYl9pbmZvICoqcHNiaSwKKwkJCQkgICAgICAgdW5zaWduZWQgdGFibGVfY291bnQpCit7CisJc3RydWN0IGV4b2ZzX3NiX2luZm8gKnNiaSA9ICpwc2JpOworCXN0cnVjdCBvc2RfZGV2ICpmc2NiX29kOworCXN0cnVjdCBvc2Rfb2JqX2lkIG9iaiA9IHsucGFydGl0aW9uID0gc2JpLT5zX3BpZCwKKwkJCQkgLmlkID0gRVhPRlNfREVWVEFCTEVfSUR9OworCXN0cnVjdCBleG9mc19kZXZpY2VfdGFibGUgKmR0OworCXVuc2lnbmVkIHRhYmxlX2J5dGVzID0gdGFibGVfY291bnQgKiBzaXplb2YoZHQtPmR0X2Rldl90YWJsZVswXSkgKworCQkJCQkgICAgIHNpemVvZigqZHQpOworCXVuc2lnbmVkIG51bWRldnMsIGk7CisJaW50IHJldDsKKworCWR0ID0ga21hbGxvYyh0YWJsZV9ieXRlcywgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFkdCkpIHsKKwkJRVhPRlNfRVJSKCJFUlJPUjogYWxsb2NhdGluZyAleCBieXRlcyBmb3IgZGV2aWNlIHRhYmxlXG4iLAorCQkJICB0YWJsZV9ieXRlcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZzY2Jfb2QgPSBzYmktPnNfb2RzWzBdOworCXNiaS0+c19vZHNbMF0gPSBOVUxMOworCXNiaS0+c19udW1kZXZzID0gMDsKKwlyZXQgPSBleG9mc19yZWFkX2tlcm4oZnNjYl9vZCwgc2JpLT5zX2NyZWQsICZvYmosIDAsIGR0LCB0YWJsZV9ieXRlcyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJRVhPRlNfRVJSKCJFUlJPUjogcmVhZGluZyBkZXZpY2UgdGFibGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwludW1kZXZzID0gbGU2NF90b19jcHUoZHQtPmR0X251bV9kZXZpY2VzKTsKKwlpZiAodW5saWtlbHkoIW51bWRldnMpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlXQVJOX09OKHRhYmxlX2NvdW50ICE9IG51bWRldnMpOworCisJcmV0ID0gX3JlYWRfYW5kX21hdGNoX2RhdGFfbWFwKHNiaSwgbnVtZGV2cywgZHQpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCWlmIChsaWtlbHkobnVtZGV2cyA+IDEpKSB7CisJCXVuc2lnbmVkIHNpemUgPSBudW1kZXZzICogc2l6ZW9mKHNiaS0+c19vZHNbMF0pOworCisJCXNiaSA9IGtyZWFsbG9jKHNiaSwgc2l6ZW9mKCpzYmkpICsgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseSghc2JpKSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1lbXNldCgmc2JpLT5zX29kc1sxXSwgMCwgc2l6ZSAtIHNpemVvZihzYmktPnNfb2RzWzBdKSk7CisJCSpwc2JpID0gc2JpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1kZXZzOyBpKyspIHsKKwkJc3RydWN0IGV4b2ZzX2ZzY2IgZnNjYjsKKwkJc3RydWN0IG9zZF9kZXZfaW5mbyBvZGk7CisJCXN0cnVjdCBvc2RfZGV2ICpvZDsKKworCQlpZiAoZXhvZnNfZGV2c18yX29kaSgmZHQtPmR0X2Rldl90YWJsZVtpXSwgJm9kaSkpIHsKKwkJCUVYT0ZTX0VSUigiRVJST1I6IFJlYWQgYWxsLXplcm9zIGRldmljZSBlbnRyeVxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFkZCBkZXZpY2VbJWRdOiBvc2RfbmFtZS0lc1xuIiwKKwkJICAgICAgIGksIG9kaS5vc2RuYW1lKTsKKworCQkvKiBPbiBhbGwgZGV2aWNlcyB0aGUgZGV2aWNlIHRhYmxlIGlzIGlkZW50aWNhbC4gVGhlIHVzZXIgY2FuCisJCSAqIHNwZWNpZnkgYW55IG9uZSBvZiB0aGUgcGFydGljaXBhdGluZyBkZXZpY2VzIG9uIHRoZSBjb21tYW5kCisJCSAqIGxpbmUuIFdlIGFsd2F5cyBrZWVwIHRoZW0gaW4gZGV2aWNlLXRhYmxlIG9yZGVyLgorCQkgKi8KKwkJaWYgKGZzY2Jfb2QgJiYgb3NkdWxkX2RldmljZV9zYW1lKGZzY2Jfb2QsICZvZGkpKSB7CisJCQlzYmktPnNfb2RzW2ldID0gZnNjYl9vZDsKKwkJCSsrc2JpLT5zX251bWRldnM7CisJCQlmc2NiX29kID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJb2QgPSBvc2R1bGRfaW5mb19sb29rdXAoJm9kaSk7CisJCWlmICh1bmxpa2VseShJU19FUlIob2QpKSkgeworCQkJcmV0ID0gUFRSX0VSUihvZCk7CisJCQlFWE9GU19FUlIoIkVSUk9SOiBkZXZpY2UgcmVxdWVzdGVkIGlzIG5vdCBmb3VuZCAiCisJCQkJICAib3NkX25hbWUtJXMgPT4lZFxuIiwgb2RpLm9zZG5hbWUsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNiaS0+c19vZHNbaV0gPSBvZDsKKwkJKytzYmktPnNfbnVtZGV2czsKKworCQkvKiBSZWFkIHRoZSBmc2NiIG9mIHRoZSBvdGhlciBkZXZpY2VzIHRvIG1ha2Ugc3VyZSB0aGUgRlMKKwkJICogcGFydGl0aW9uIGlzIHRoZXJlLgorCQkgKi8KKwkJcmV0ID0gZXhvZnNfcmVhZF9rZXJuKG9kLCBzYmktPnNfY3JlZCwgJm9iaiwgMCwgJmZzY2IsCisJCQkJICAgICAgc2l6ZW9mKGZzY2IpKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCUVYT0ZTX0VSUigiRVJST1I6IE1hbGZvcm1lZCBwYXJ0aWNpcGF0aW5nIGRldmljZSAiCisJCQkJICAiZXJyb3IgcmVhZGluZyBmc2NiIG9zZF9uYW1lLSVzXG4iLAorCQkJCSAgb2RpLm9zZG5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBUT0RPOiB2ZXJpZnkgb3RoZXIgaW5mb3JtYXRpb24gaXMgY29ycmVjdCBhbmQgRlMtdXVpZAorCQkgKgkgbWF0Y2hlcy4gQmVubnkgd2hhdCBkaWQgeW91IHNheSBhYm91dCBkZXZpY2UgdGFibGUKKwkJICoJIGdlbmVyYXRpb24gYW5kIG9sZCBkZXZpY2VzPworCQkgKi8KKwl9CisKK291dDoKKwlrZnJlZShkdCk7CisJaWYgKHVubGlrZWx5KCFyZXQgJiYgZnNjYl9vZCkpIHsKKwkJRVhPRlNfRVJSKAorCQkgICAgICAiRVJST1I6IEJhZCBkZXZpY2UtdGFibGUgY29udGFpbmVyIGRldmljZSBub3QgcHJlc2VudFxuIik7CisJCW9zZHVsZF9wdXRfZGV2aWNlKGZzY2Jfb2QpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBSZWFkIHRoZSBzdXBlcmJsb2NrIGZyb20gdGhlIE9TRCBhbmQgZmlsbCBpbiB0aGUgZmllbGRzCiAgKi8KQEAgLTI5MiwyNCArNDgyLDI1IEBACiAJc3RydWN0IGlub2RlICpyb290OwogCXN0cnVjdCBleG9mc19tb3VudG9wdCAqb3B0cyA9IGRhdGE7CiAJc3RydWN0IGV4b2ZzX3NiX2luZm8gKnNiaTsJLypleHRlbmRlZCBpbmZvICAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgb3NkX2RldiAqb2Q7CQkvKiBNYXN0ZXIgZGV2aWNlICAgICAgICAgICAgICAgICAqLwogCXN0cnVjdCBleG9mc19mc2NiIGZzY2I7CQkvKm9uLWRpc2sgc3VwZXJibG9jayBpbmZvICAgICAgICAqLwotCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3IgPSBOVUxMOwogCXN0cnVjdCBvc2Rfb2JqX2lkIG9iajsKKwl1bnNpZ25lZCB0YWJsZV9jb3VudDsKIAlpbnQgcmV0OwogCiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzYi0+c19mc19pbmZvID0gc2JpOwogCiAJLyogdXNlIG1vdW50IG9wdGlvbnMgdG8gZmlsbCBzdXBlcmJsb2NrICovCi0Jc2JpLT5zX2RldiA9IG9zZHVsZF9wYXRoX2xvb2t1cChvcHRzLT5kZXZfbmFtZSk7Ci0JaWYgKElTX0VSUihzYmktPnNfZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKHNiaS0+c19kZXYpOwotCQlzYmktPnNfZGV2ID0gTlVMTDsKKwlvZCA9IG9zZHVsZF9wYXRoX2xvb2t1cChvcHRzLT5kZXZfbmFtZSk7CisJaWYgKElTX0VSUihvZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihvZCk7CiAJCWdvdG8gZnJlZV9zYmk7CiAJfQogCisJc2JpLT5zX29kc1swXSA9IG9kOworCXNiaS0+c19udW1kZXZzID0gMTsKIAlzYmktPnNfcGlkID0gb3B0cy0+cGlkOwogCXNiaS0+c190aW1lb3V0ID0gb3B0cy0+dGltZW91dDsKIApAQCAtMzIzLDM1ICs1MTQsMTMgQEAKIAlzYi0+c19iZGV2ID0gTlVMTDsKIAlzYi0+c19kZXYgPSAwOwogCi0JLyogcmVhZCBkYXRhIGZyb20gb24tZGlzayBzdXBlcmJsb2NrIG9iamVjdCAqLwogCW9iai5wYXJ0aXRpb24gPSBzYmktPnNfcGlkOwogCW9iai5pZCA9IEVYT0ZTX1NVUEVSX0lEOwogCWV4b2ZzX21ha2VfY3JlZGVudGlhbChzYmktPnNfY3JlZCwgJm9iaik7CiAKLQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19kZXYsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghb3IpKSB7Ci0JCWlmICghc2lsZW50KQotCQkJRVhPRlNfRVJSKAotCQkJICAgICAgICJleG9mc19maWxsX3N1cGVyOiBvc2Rfc3RhcnRfcmVxdWVzdCBmYWlsZWQuXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZXQgPSBleG9mc19yZWFkX2tlcm4ob2QsIHNiaS0+c19jcmVkLCAmb2JqLCAwLCAmZnNjYiwgc2l6ZW9mKGZzY2IpKTsKKwlpZiAodW5saWtlbHkocmV0KSkKIAkJZ290byBmcmVlX3NiaTsKLQl9Ci0JcmV0ID0gb3NkX3JlcV9yZWFkX2tlcm4ob3IsICZvYmosIDAsICZmc2NiLCBzaXplb2YoZnNjYikpOwotCWlmICh1bmxpa2VseShyZXQpKSB7Ci0JCWlmICghc2lsZW50KQotCQkJRVhPRlNfRVJSKAotCQkJICAgICAgICJleG9mc19maWxsX3N1cGVyOiBvc2RfcmVxX3JlYWRfa2VybiBmYWlsZWQuXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmcmVlX3NiaTsKLQl9Ci0KLQlyZXQgPSBleG9mc19zeW5jX29wKG9yLCBzYmktPnNfdGltZW91dCwgc2JpLT5zX2NyZWQpOwotCWlmICh1bmxpa2VseShyZXQpKSB7Ci0JCWlmICghc2lsZW50KQotCQkJRVhPRlNfRVJSKCJleG9mc19maWxsX3N1cGVyOiBleG9mc19zeW5jX29wIGZhaWxlZC5cbiIpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGZyZWVfc2JpOwotCX0KIAogCXNiLT5zX21hZ2ljID0gbGUxNl90b19jcHUoZnNjYi5zX21hZ2ljKTsKIAlzYmktPnNfbmV4dGlkID0gbGU2NF90b19jcHUoZnNjYi5zX25leHRpZCk7CkBAIC0zNjQsMTIgKzUzMywyNiBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGZyZWVfc2JpOwogCX0KKwlpZiAobGUzMl90b19jcHUoZnNjYi5zX3ZlcnNpb24pICE9IEVYT0ZTX0ZTQ0JfVkVSKSB7CisJCUVYT0ZTX0VSUigiRVJST1I6IEJhZCBGU0NCIHZlcnNpb24gZXhwZWN0ZWQtJWQgZ290LSVkXG4iLAorCQkJICBFWE9GU19GU0NCX1ZFUiwgbGUzMl90b19jcHUoZnNjYi5zX3ZlcnNpb24pKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX3NiaTsKKwl9CiAKIAkvKiBzdGFydCBnZW5lcmF0aW9uIG51bWJlcnMgZnJvbSBhIHJhbmRvbSBwb2ludCAqLwogCWdldF9yYW5kb21fYnl0ZXMoJnNiaS0+c19uZXh0X2dlbmVyYXRpb24sIHNpemVvZih1MzIpKTsKIAlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX25leHRfZ2VuX2xvY2spOwogCisJdGFibGVfY291bnQgPSBsZTY0X3RvX2NwdShmc2NiLnNfZGV2X3RhYmxlX2NvdW50KTsKKwlpZiAodGFibGVfY291bnQpIHsKKwkJcmV0ID0gZXhvZnNfcmVhZF9sb29rdXBfZGV2X3RhYmxlKCZzYmksIHRhYmxlX2NvdW50KTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlnb3RvIGZyZWVfc2JpOworCX0KKwogCS8qIHNldCB1cCBvcGVyYXRpb24gdmVjdG9ycyAqLworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CiAJc2ItPnNfb3AgPSAmZXhvZnNfc29wczsKIAlzYi0+c19leHBvcnRfb3AgPSAmZXhvZnNfZXhwb3J0X29wczsKIAlyb290ID0gZXhvZnNfaWdldChzYiwgRVhPRlNfUk9PVF9JRCAtIEVYT0ZTX09CSl9PRkYpOwpAQCAtMzk1LDE2ICs1NzgsMTUgQEAKIAkJZ290byBmcmVlX3NiaTsKIAl9CiAKLQlyZXQgPSAwOwotb3V0OgotCWlmIChvcikKLQkJb3NkX2VuZF9yZXF1ZXN0KG9yKTsKLQlyZXR1cm4gcmV0OworCV9leG9mc19wcmludF9kZXZpY2UoIk1vdW50aW5nIiwgb3B0cy0+ZGV2X25hbWUsIHNiaS0+c19vZHNbMF0sCisJCQkgICAgc2JpLT5zX3BpZCk7CisJcmV0dXJuIDA7CiAKIGZyZWVfc2JpOgotCW9zZHVsZF9wdXRfZGV2aWNlKHNiaS0+c19kZXYpOyAvKiBOVUxMIHNhZmUgKi8KLQlrZnJlZShzYmkpOwotCWdvdG8gb3V0OworCUVYT0ZTX0VSUigiVW5hYmxlIHRvIG1vdW50IGV4b2ZzIG9uICVzIHBpZD0weCVsbHggZXJyPSVkXG4iLAorCQkgIG9wdHMtPmRldl9uYW1lLCBzYmktPnNfcGlkLCByZXQpOworCWV4b2ZzX2ZyZWVfc2JpKHNiaSk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTQzMyw3ICs2MTUsNyBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGV4b2ZzX3NiX2luZm8gKnNiaSA9IHNiLT5zX2ZzX2luZm87Ci0Jc3RydWN0IG9zZF9vYmpfaWQgb2JqID0ge3NiaS0+c19waWQsIDB9OworCXN0cnVjdCBleG9mc19pb19zdGF0ZSAqaW9zOwogCXN0cnVjdCBvc2RfYXR0ciBhdHRyc1tdID0gewogCQlBVFRSX0RFRihPU0RfQVBBR0VfUEFSVElUSU9OX1FVT1RBUywKIAkJCU9TRF9BVFRSX1BRX0NBUEFDSVRZX1FVT1RBLCBzaXplb2YoX19iZTY0KSksCkBAIC00NDIsMzIgKzYyNCwzMyBAQAogCX07CiAJdWludDY0X3QgY2FwYWNpdHkgPSBVTExPTkdfTUFYOwogCXVpbnQ2NF90IHVzZWQgPSBVTExPTkdfTUFYOwotCXN0cnVjdCBvc2RfcmVxdWVzdCAqb3I7CiAJdWludDhfdCBjcmVkX2FbT1NEX0NBUF9MRU5dOwogCWludCByZXQ7CiAKLQkvKiBnZXQgdXNlZC9jYXBhY2l0eSBhdHRyaWJ1dGVzICovCi0JZXhvZnNfbWFrZV9jcmVkZW50aWFsKGNyZWRfYSwgJm9iaik7Ci0KLQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KHNiaS0+c19kZXYsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghb3IpKSB7Ci0JCUVYT0ZTX0RCR01TRygiZXhvZnNfc3RhdGZzOiBvc2Rfc3RhcnRfcmVxdWVzdCBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gZXhvZnNfZ2V0X2lvX3N0YXRlKHNiaSwgJmlvcyk7CisJaWYgKHJldCkgeworCQlFWE9GU19EQkdNU0coImV4b2ZzX2dldF9pb19zdGF0ZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKLQlvc2RfcmVxX2dldF9hdHRyaWJ1dGVzKG9yLCAmb2JqKTsKLQlvc2RfcmVxX2FkZF9nZXRfYXR0cl9saXN0KG9yLCBhdHRycywgQVJSQVlfU0laRShhdHRycykpOwotCXJldCA9IGV4b2ZzX3N5bmNfb3Aob3IsIHNiaS0+c190aW1lb3V0LCBjcmVkX2EpOworCWV4b2ZzX21ha2VfY3JlZGVudGlhbChjcmVkX2EsICZpb3MtPm9iaik7CisJaW9zLT5jcmVkID0gc2JpLT5zX2NyZWQ7CisJaW9zLT5pbl9hdHRyID0gYXR0cnM7CisJaW9zLT5pbl9hdHRyX2xlbiA9IEFSUkFZX1NJWkUoYXR0cnMpOworCisJcmV0ID0gZXhvZnNfc2JpX3JlYWQoaW9zKTsKIAlpZiAodW5saWtlbHkocmV0KSkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSBleHRyYWN0X2F0dHJfZnJvbV9yZXEob3IsICZhdHRyc1swXSk7Ci0JaWYgKGxpa2VseSghcmV0KSkKKwlyZXQgPSBleHRyYWN0X2F0dHJfZnJvbV9pb3MoaW9zLCAmYXR0cnNbMF0pOworCWlmIChsaWtlbHkoIXJldCkpIHsKIAkJY2FwYWNpdHkgPSBnZXRfdW5hbGlnbmVkX2JlNjQoYXR0cnNbMF0udmFsX3B0cik7Ci0JZWxzZQorCQlpZiAodW5saWtlbHkoIWNhcGFjaXR5KSkKKwkJCWNhcGFjaXR5ID0gVUxMT05HX01BWDsKKwl9IGVsc2UKIAkJRVhPRlNfREJHTVNHKCJleG9mc19zdGF0ZnM6IGdldCBjYXBhY2l0eSBmYWlsZWQuXG4iKTsKIAotCXJldCA9IGV4dHJhY3RfYXR0cl9mcm9tX3JlcShvciwgJmF0dHJzWzFdKTsKKwlyZXQgPSBleHRyYWN0X2F0dHJfZnJvbV9pb3MoaW9zLCAmYXR0cnNbMV0pOwogCWlmIChsaWtlbHkoIXJldCkpCiAJCXVzZWQgPSBnZXRfdW5hbGlnbmVkX2JlNjQoYXR0cnNbMV0udmFsX3B0cik7CiAJZWxzZQpAQCAtNDc2LDE1ICs2NTksMTUgQEAKIAkvKiBmaWxsIGluIHRoZSBzdGF0cyBidWZmZXIgKi8KIAlidWYtPmZfdHlwZSA9IEVYT0ZTX1NVUEVSX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IEVYT0ZTX0JMS1NJWkU7Ci0JYnVmLT5mX2Jsb2NrcyA9IChjYXBhY2l0eSA+PiBFWE9GU19CTEtTSElGVCk7Ci0JYnVmLT5mX2JmcmVlID0gKChjYXBhY2l0eSAtIHVzZWQpID4+IEVYT0ZTX0JMS1NISUZUKTsKKwlidWYtPmZfYmxvY2tzID0gY2FwYWNpdHkgPj4gOTsKKwlidWYtPmZfYmZyZWUgPSAoY2FwYWNpdHkgLSB1c2VkKSA+PiA5OwogCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWU7CiAJYnVmLT5mX2ZpbGVzID0gc2JpLT5zX251bWZpbGVzOwogCWJ1Zi0+Zl9mZnJlZSA9IEVYT0ZTX01BWF9JRCAtIHNiaS0+c19udW1maWxlczsKIAlidWYtPmZfbmFtZWxlbiA9IEVYT0ZTX05BTUVfTEVOOwogCiBvdXQ6Ci0Jb3NkX2VuZF9yZXF1ZXN0KG9yKTsKKwlleG9mc19wdXRfaW9fc3RhdGUoaW9zKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggMzU0ZWQzYi4uMmRiOTU3NyAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjAzMyw3ICsyMDMzLDcgQEAKIAlpbnQgaywgZXJyOwogCiAJKnRvcCA9IDA7Ci0JLyogTWFrZSBrIGluZGV4IHRoZSBkZWVwZXN0IG5vbi1udWxsIG9mZmVzdCArIDEgKi8KKwkvKiBNYWtlIGsgaW5kZXggdGhlIGRlZXBlc3Qgbm9uLW51bGwgb2Zmc2V0ICsgMSAqLwogCWZvciAoayA9IGRlcHRoOyBrID4gMSAmJiAhb2Zmc2V0c1trLTFdOyBrLS0pCiAJCTsKIAlwYXJ0aWFsID0gZXh0M19nZXRfYnJhbmNoKGlub2RlLCBrLCBvZmZzZXRzLCBjaGFpbiwgJmVycik7CmRpZmYgLS1naXQgYS9mcy9leHQ0L0tjb25maWcgYi9mcy9leHQ0L0tjb25maWcKaW5kZXggOWYyZDQ1ZC4uOWFjZjdlOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9LY29uZmlnCisrKyBiL2ZzL2V4dDQvS2NvbmZpZwpAQCAtMjYsNiArMjYsMTYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEVYVDRfVVNFX0ZPUl9FWFQyMworCWJvb2wgIlVzZSBleHQ0IGZvciBleHQyL2V4dDMgZmlsZSBzeXN0ZW1zIgorCWRlcGVuZHMgb24gRVhUM19GUz1uIHx8IEVYVDJfRlM9bgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFsbG93IHRoZSBleHQ0IGZpbGUgc3lzdGVtIGRyaXZlciBjb2RlIHRvIGJlIHVzZWQgZm9yIGV4dDIgb3IKKwkgIGV4dDMgZmlsZSBzeXN0ZW0gbW91bnRzLiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gcmVkdWNlIHRoZWlyCisJICBjb21waWxlZCBrZXJuZWwgc2l6ZSBieSB1c2luZyBvbmUgZmlsZSBzeXN0ZW0gZHJpdmVyIGZvcgorCSAgZXh0MiwgZXh0MywgYW5kIGV4dDQgZmlsZSBzeXN0ZW1zLgorCiBjb25maWcgRVhUNF9GU19YQVRUUgogCWJvb2wgIkV4dDQgZXh0ZW5kZWQgYXR0cmlidXRlcyIKIAlkZXBlbmRzIG9uIEVYVDRfRlMKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYmFsbG9jLmMgYi9mcy9leHQ0L2JhbGxvYy5jCmluZGV4IDFkMDQxODkuLjIyYmM3NDMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9iYWxsb2MuYwpAQCAtNDk5LDQ0ICs0OTksNiBAQAogfQogCiAvKioKLSAqIGV4dDRfZnJlZV9ibG9ja3MoKSAtLSBGcmVlIGdpdmVuIGJsb2NrcyBhbmQgdXBkYXRlIHF1b3RhCi0gKiBAaGFuZGxlOgkJaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAaW5vZGU6CQlpbm9kZQotICogQGJsb2NrOgkJc3RhcnQgcGh5c2ljYWwgYmxvY2sgdG8gZnJlZQotICogQGNvdW50OgkJbnVtYmVyIG9mIGJsb2NrcyB0byBjb3VudAotICogQG1ldGFkYXRhOiAJCUFyZSB0aGVzZSBtZXRhZGF0YSBibG9ja3MKLSAqLwotdm9pZCBleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCi0JCQlpbnQgbWV0YWRhdGEpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKLQl1bnNpZ25lZCBsb25nIGRxdW90X2ZyZWVkX2Jsb2NrczsKLQotCS8qIHRoaXMgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIHRvIGRlY2lkZSB3aGV0aGVyIGJsb2NrIGlzIG1ldGFkYXRhCi0JICogaW5vZGUuYy9leHRlbnRzLmMga25vd3MgYmV0dGVyLCBidXQgZm9yIHNhZmV0eSAuLi4gKi8KLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQotCQltZXRhZGF0YSA9IDE7Ci0KLQkvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCByZXVzZQotCSAqIGJsb2NrIHJlbGVhc2VkIHVudGlsbCB0aGUgdHJhbnNhY3Rpb24gY29tbWl0LgotCSAqIHdyaXRlYmFjayBtb2RlIGhhdmUgd2VhayBkYXRhIGNvbnNpc3RlbmN5IHNvCi0JICogZG9uJ3QgZm9yY2UgZGF0YSBhcyBtZXRhZGF0YSB3aGVuIGZyZWVpbmcgYmxvY2sKLQkgKiBmb3Igd3JpdGViYWNrIG1vZGUuCi0JICovCi0JaWYgKG1ldGFkYXRhID09IDAgJiYgIWV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKGlub2RlKSkKLQkJbWV0YWRhdGEgPSAxOwotCi0Jc2IgPSBpbm9kZS0+aV9zYjsKLQotCWV4dDRfbWJfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmxvY2ssIGNvdW50LAotCQkJICAgIG1ldGFkYXRhLCAmZHF1b3RfZnJlZWRfYmxvY2tzKTsKLQlpZiAoZHF1b3RfZnJlZWRfYmxvY2tzKQotCQl2ZnNfZHFfZnJlZV9ibG9jayhpbm9kZSwgZHF1b3RfZnJlZWRfYmxvY2tzKTsKLQlyZXR1cm47Ci19Ci0KLS8qKgogICogZXh0NF9oYXNfZnJlZV9ibG9ja3MoKQogICogQHNiaToJaW4tY29yZSBzdXBlciBibG9jayBzdHJ1Y3R1cmUuCiAgKiBAbmJsb2NrczoJbnVtYmVyIG9mIG5lZWRlZCBibG9ja3MKQEAgLTc2MSw3ICs3MjMsMTMgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGV4dDRfYmdfbnVtX2dkYl9ub21ldGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkJZXh0NF9ncm91cF90IGdyb3VwKQogewotCXJldHVybiBleHQ0X2JnX2hhc19zdXBlcihzYiwgZ3JvdXApID8gRVhUNF9TQihzYiktPnNfZ2RiX2NvdW50IDogMDsKKwlpZiAoIWV4dDRfYmdfaGFzX3N1cGVyKHNiLCBncm91cCkpCisJCXJldHVybiAwOworCisJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsRVhUNF9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpKQorCQlyZXR1cm4gbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfZmlyc3RfbWV0YV9iZyk7CisJZWxzZQorCQlyZXR1cm4gRVhUNF9TQihzYiktPnNfZ2RiX2NvdW50OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYmxvY2tfdmFsaWRpdHkuYyBiL2ZzL2V4dDQvYmxvY2tfdmFsaWRpdHkuYwppbmRleCA1MDc4NGVmLi40ZGY4NjIxIDEwMDY0NAotLS0gYS9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMKKysrIGIvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJaWYgKGV4dDRfYmdfaGFzX3N1cGVyKHNiLCBpKSAmJgogCQkgICAgKChpIDwgNSkgfHwgKChpICUgZmxleF9zaXplKSA9PSAwKSkpCiAJCQlhZGRfc3lzdGVtX3pvbmUoc2JpLCBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBpKSwKLQkJCQkJc2JpLT5zX2dkYl9jb3VudCArIDEpOworCQkJCQlleHQ0X2JnX251bV9nZGIoc2IsIGkpICsgMSk7CiAJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlyZXQgPSBhZGRfc3lzdGVtX3pvbmUoc2JpLCBleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgMSk7CiAJCWlmIChyZXQpCkBAIC0yMjgsNiArMjI4LDcgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHNiaS0+c3lzdGVtX2Jsa3MucmJfbm9kZTsKIAogCWlmICgoc3RhcnRfYmxrIDw9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgfHwKKwkgICAgKHN0YXJ0X2JsayArIGNvdW50IDwgc3RhcnRfYmxrKSB8fAogCSAgICAoc3RhcnRfYmxrICsgY291bnQgPiBleHQ0X2Jsb2Nrc19jb3VudChzYmktPnNfZXMpKSkKIAkJcmV0dXJuIDA7CiAJd2hpbGUgKG4pIHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NC5oIGIvZnMvZXh0NC9leHQ0LmgKaW5kZXggODgyNTUxNS4uYWIzMWU2NSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0LmgKKysrIGIvZnMvZXh0NC9leHQ0LmgKQEAgLTM3Niw2ICszNzYsMTIgQEAKIAkJCQkJIEVYVDRfR0VUX0JMT0NLU19ESU9fQ1JFQVRFX0VYVCkKIAogLyoKKyAqIEZsYWdzIHVzZWQgYnkgZXh0NF9mcmVlX2Jsb2NrcworICovCisjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEEJMHgwMDAxCisjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUCQkweDAwMDIKKworLyoKICAqIGlvY3RsIGNvbW1hbmRzCiAgKi8KICNkZWZpbmUJRVhUNF9JT0NfR0VURkxBR1MJCUZTX0lPQ19HRVRGTEFHUwpAQCAtNzAzLDYgKzcwOSwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgaV9haW9fZGlvX2NvbXBsZXRlX2xpc3Q7CiAJLyogY3VycmVudCBpb19lbmQgc3RydWN0dXJlIGZvciBhc3luYyBESU8gd3JpdGUqLwogCWV4dDRfaW9fZW5kX3QgKmN1cl9haW9fZGlvOworCisJLyoKKwkgKiBUcmFuc2FjdGlvbnMgdGhhdCBjb250YWluIGlub2RlJ3MgbWV0YWRhdGEgbmVlZGVkIHRvIGNvbXBsZXRlCisJICogZnN5bmMgYW5kIGZkYXRhc3luYywgcmVzcGVjdGl2ZWx5LgorCSAqLworCXRpZF90IGlfc3luY190aWQ7CisJdGlkX3QgaV9kYXRhc3luY190aWQ7CiB9OwogCiAvKgpAQCAtNzUwLDYgKzc2Myw3IEBACiAjZGVmaW5lIEVYVDRfTU9VTlRfREVMQUxMT0MJCTB4ODAwMDAwMCAvKiBEZWxhbGxvYyBzdXBwb3J0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfREFUQV9FUlJfQUJPUlQJMHgxMDAwMDAwMCAvKiBBYm9ydCBvbiBmaWxlIGRhdGEgd3JpdGUgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9CTE9DS19WQUxJRElUWQkweDIwMDAwMDAwIC8qIEJsb2NrIHZhbGlkaXR5IGNoZWNraW5nICovCisjZGVmaW5lIEVYVDRfTU9VTlRfRElTQ0FSRAkJMHg0MDAwMDAwMCAvKiBJc3N1ZSBESVNDQVJEIHJlcXVlc3RzICovCiAKICNkZWZpbmUgY2xlYXJfb3B0KG8sIG9wdCkJCW8gJj0gfkVYVDRfTU9VTlRfIyNvcHQKICNkZWZpbmUgc2V0X29wdChvLCBvcHQpCQkJbyB8PSBFWFQ0X01PVU5UXyMjb3B0CkBAIC0xMzI0LDggKzEzMzgsNiBAQAogCQkJZXh0NF9mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOwogZXh0ZXJuIGludCBleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgczY0IG5ibG9ja3MpOwogZXh0ZXJuIGludCBleHQ0X2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksIHM2NCBuYmxvY2tzKTsKLWV4dGVybiB2b2lkIGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50IG1ldGFkYXRhKTsKIGV4dGVybiB2b2lkIGV4dDRfYWRkX2dyb3VwYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CkBAIC0xMzg0LDE2ICsxMzk2LDE1IEBACiBleHRlcm4gdm9pZCBleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBfX2luaXQgaW5pdF9leHQ0X21iYWxsb2Modm9pZCk7CiBleHRlcm4gdm9pZCBleGl0X2V4dDRfbWJhbGxvYyh2b2lkKTsKLWV4dGVybiB2b2lkIGV4dDRfbWJfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosCi0JCWV4dDRfZnNibGtfdCwgdW5zaWduZWQgbG9uZywgaW50LCB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2ssCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBmbGFncyk7CiBleHRlcm4gaW50IGV4dDRfbWJfYWRkX2dyb3VwaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQlleHQ0X2dyb3VwX3QgaSwgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYyk7CiBleHRlcm4gaW50IGV4dDRfbWJfZ2V0X2J1ZGR5X2NhY2hlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICosIGV4dDRfZ3JvdXBfdCk7CiBleHRlcm4gdm9pZCBleHQ0X21iX3B1dF9idWRkeV9jYWNoZV9sb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqLAogCQkJCQkJZXh0NF9ncm91cF90LCBpbnQpOwogLyogaW5vZGUuYyAqLwotaW50IGV4dDRfZm9yZ2V0KGhhbmRsZV90ICpoYW5kbGUsIGludCBpc19tZXRhZGF0YSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgZXh0NF9mc2Jsa190IGJsb2NrbnIpOwogc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQ0X2dldGJsayhoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwKIAkJCQkJCWV4dDRfbGJsa190LCBpbnQsIGludCAqKTsKIHN0cnVjdCBidWZmZXJfaGVhZCAqZXh0NF9icmVhZChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMgYi9mcy9leHQ0L2V4dDRfamJkMi5jCmluZGV4IDZhOTQwOTkuLmI1N2U1YzcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMKKysrIGIvZnMvZXh0NC9leHQ0X2piZDIuYwpAQCAtNCw2ICs0LDggQEAKIAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2V4dDQuaD4KKwogaW50IF9fZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewpAQCAtMzIsMzUgKzM0LDY5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IF9fZXh0NF9qb3VybmFsX2ZvcmdldChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorLyoKKyAqIFRoZSBleHQ0IGZvcmdldCBmdW5jdGlvbiBtdXN0IHBlcmZvcm0gYSByZXZva2UgaWYgd2UgYXJlIGZyZWVpbmcgZGF0YQorICogd2hpY2ggaGFzIGJlZW4gam91cm5hbGVkLiAgTWV0YWRhdGEgKGVnLiBpbmRpcmVjdCBibG9ja3MpIG11c3QgYmUKKyAqIHJldm9rZWQgaW4gYWxsIGNhc2VzLgorICoKKyAqICJiaCIgbWF5IGJlIE5VTEw6IGEgbWV0YWRhdGEgYmxvY2sgbWF5IGhhdmUgYmVlbiBmcmVlZCBmcm9tIG1lbW9yeQorICogYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHJlY29yZCBvZiBpdCBpbiB0aGUgam91cm5hbCwgYW5kIHRoYXQgcmVjb3JkCisgKiBzdGlsbCBuZWVkcyB0byBiZSByZXZva2VkLgorICoKKyAqIElmIHRoZSBoYW5kbGUgaXNuJ3QgdmFsaWQgd2UncmUgbm90IGpvdXJuYWxpbmcsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvCisgKiBjYWxsIGludG8gZXh0NF9qb3VybmFsX3Jldm9rZSgpIHRvIHB1dCB0aGUgYnVmZmVyIGhlYWQuCisgKi8KK2ludCBfX2V4dDRfZm9yZ2V0KGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsCisJCSAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJICBleHQ0X2ZzYmxrX3QgYmxvY2tucikKIHsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCi0JaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKLQkJZXJyID0gamJkMl9qb3VybmFsX2ZvcmdldChoYW5kbGUsIGJoKTsKLQkJaWYgKGVycikKLQkJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwKLQkJCQkJCSAgaGFuZGxlLCBlcnIpOwotCX0KLQllbHNlCisJbWlnaHRfc2xlZXAoKTsKKworCXRyYWNlX2V4dDRfZm9yZ2V0KGlub2RlLCBpc19tZXRhZGF0YSwgYmxvY2tucik7CisJQlVGRkVSX1RSQUNFKGJoLCAiZW50ZXIiKTsKKworCWpiZF9kZWJ1Zyg0LCAiZm9yZ2V0dGluZyBiaCAlcDogaXNfbWV0YWRhdGEgPSAlZCwgbW9kZSAlbywgIgorCQkgICJkYXRhIG1vZGUgJXhcbiIsCisJCSAgYmgsIGlzX21ldGFkYXRhLCBpbm9kZS0+aV9tb2RlLAorCQkgIHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVRBX0ZMQUdTKSk7CisKKwkvKiBJbiB0aGUgbm8gam91cm5hbCBjYXNlLCB3ZSBjYW4ganVzdCBkbyBhIGJmb3JnZXQgYW5kIHJldHVybiAqLworCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgewogCQliZm9yZ2V0KGJoKTsKLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgX19leHQ0X2pvdXJuYWxfcmV2b2tlKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCWV4dDRfZnNibGtfdCBibG9ja25yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWludCBlcnIgPSAwOwotCi0JaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKLQkJZXJyID0gamJkMl9qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKTsKLQkJaWYgKGVycikKLQkJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwKLQkJCQkJCSAgaGFuZGxlLCBlcnIpOworCQlyZXR1cm4gMDsKIAl9Ci0JZWxzZQotCQliZm9yZ2V0KGJoKTsKKworCS8qIE5ldmVyIHVzZSB0aGUgcmV2b2tlIGZ1bmN0aW9uIGlmIHdlIGFyZSBkb2luZyBmdWxsIGRhdGEKKwkgKiBqb3VybmFsaW5nOiB0aGVyZSBpcyBubyBuZWVkIHRvLCBhbmQgYSBWMSBzdXBlcmJsb2NrIHdvbid0CisJICogc3VwcG9ydCBpdC4gIE90aGVyd2lzZSwgb25seSBza2lwIHRoZSByZXZva2Ugb24gdW4tam91cm5hbGVkCisJICogZGF0YSBibG9ja3MuICovCisKKwlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBIHx8CisJICAgICghaXNfbWV0YWRhdGEgJiYgIWV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpKSB7CisJCWlmIChiaCkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBqYmQyX2pvdXJuYWxfZm9yZ2V0Iik7CisJCQllcnIgPSBqYmQyX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikKKwkJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkJICBoYW5kbGUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogZGF0YSE9am91cm5hbCAmJiAoaXNfbWV0YWRhdGEgfHwgc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpCisJICovCisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBqYmQyX2pvdXJuYWxfcmV2b2tlIik7CisJZXJyID0gamJkMl9qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKTsKKwlpZiAoZXJyKSB7CisJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwgaGFuZGxlLCBlcnIpOworCQlleHQ0X2Fib3J0KGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKKwkJCSAgICJlcnJvciAlZCB3aGVuIGF0dGVtcHRpbmcgcmV2b2tlIiwgZXJyKTsKKwl9CisJQlVGRkVSX1RSQUNFKGJoLCAiZXhpdCIpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9qYmQyLmggYi9mcy9leHQ0L2V4dDRfamJkMi5oCmluZGV4IGEyODY1OTguLjA1ZWNhODEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9qYmQyLmgKKysrIGIvZnMvZXh0NC9leHQ0X2piZDIuaApAQCAtNDksNyArNDksNyBAQAogCiAjZGVmaW5lIEVYVDRfREFUQV9UUkFOU19CTE9DS1Moc2IpCShFWFQ0X1NJTkdMRURBVEFfVFJBTlNfQkxPQ0tTKHNiKSArIFwKIAkJCQkJIEVYVDRfWEFUVFJfVFJBTlNfQkxPQ0tTIC0gMiArIFwKLQkJCQkJIDIqRVhUNF9RVU9UQV9UUkFOU19CTE9DS1Moc2IpKQorCQkJCQkgRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKHNiKSkKIAogLyoKICAqIERlZmluZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyB3ZSBuZWVkIHRvIGFjY291bnQgdG8gbW9kaWZ5IGRhdGEuCkBAIC01Nyw3ICs1Nyw3IEBACiAgKiBUaGlzIGluY2x1ZGUgc3VwZXIgYmxvY2ssIGlub2RlIGJsb2NrLCBxdW90YSBibG9ja3MgYW5kIHhhdHRyIGJsb2NrcwogICovCiAjZGVmaW5lIEVYVDRfTUVUQV9UUkFOU19CTE9DS1Moc2IpCShFWFQ0X1hBVFRSX1RSQU5TX0JMT0NLUyArIFwKLQkJCQkJMipFWFQ0X1FVT1RBX1RSQU5TX0JMT0NLUyhzYikpCisJCQkJCUVYVDRfTUFYUVVPVEFTX1RSQU5TX0JMT0NLUyhzYikpCiAKIC8qIERlbGV0ZSBvcGVyYXRpb25zIHBvdGVudGlhbGx5IGhpdCBvbmUgZGlyZWN0b3J5J3MgbmFtZXNwYWNlIHBsdXMgYW4KICAqIGVudGlyZSBpbm9kZSwgcGx1cyBhcmJpdHJhcnkgYW1vdW50cyBvZiBiaXRtYXAvaW5kaXJlY3Rpb24gZGF0YS4gIEJlCkBAIC05Miw2ICs5Miw3IEBACiAgKiBidXQgaW5vZGUsIHNiIGFuZCBncm91cCB1cGRhdGVzIGFyZSBkb25lIG9ubHkgb25jZSAqLwogI2RlZmluZSBFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKHNiKSAodGVzdF9vcHQoc2IsIFFVT1RBKSA/IChEUVVPVF9JTklUX0FMTE9DKlwKIAkJKEVYVDRfU0lOR0xFREFUQV9UUkFOU19CTE9DS1Moc2IpLTMpKzMrRFFVT1RfSU5JVF9SRVdSSVRFKSA6IDApCisKICNkZWZpbmUgRVhUNF9RVU9UQV9ERUxfQkxPQ0tTKHNiKSAodGVzdF9vcHQoc2IsIFFVT1RBKSA/IChEUVVPVF9ERUxfQUxMT0MqXAogCQkoRVhUNF9TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUyhzYiktMykrMytEUVVPVF9ERUxfUkVXUklURSkgOiAwKQogI2Vsc2UKQEAgLTk5LDYgKzEwMCw5IEBACiAjZGVmaW5lIEVYVDRfUVVPVEFfSU5JVF9CTE9DS1Moc2IpIDAKICNkZWZpbmUgRVhUNF9RVU9UQV9ERUxfQkxPQ0tTKHNiKSAwCiAjZW5kaWYKKyNkZWZpbmUgRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKHNiKSAoTUFYUVVPVEFTKkVYVDRfUVVPVEFfVFJBTlNfQkxPQ0tTKHNiKSkKKyNkZWZpbmUgRVhUNF9NQVhRVU9UQVNfSU5JVF9CTE9DS1Moc2IpIChNQVhRVU9UQVMqRVhUNF9RVU9UQV9JTklUX0JMT0NLUyhzYikpCisjZGVmaW5lIEVYVDRfTUFYUVVPVEFTX0RFTF9CTE9DS1Moc2IpIChNQVhRVU9UQVMqRVhUNF9RVU9UQV9ERUxfQkxPQ0tTKHNiKSkKIAogaW50CiBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLApAQCAtMTE2LDEyICsxMjAsOCBAQAogaW50IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogLyoKLSAqIFdyYXBwZXIgZnVuY3Rpb25zIHdpdGggd2hpY2ggZXh0NCBjYWxscyBpbnRvIEpCRC4gIFRoZSBpbnRlbnQgaGVyZSBpcwotICogdG8gYWxsb3cgdGhlc2UgdG8gYmUgdHVybmVkIGludG8gYXBwcm9wcmlhdGUgc3R1YnMgc28gZXh0NCBjYW4gY29udHJvbAotICogZXh0MiBmaWxlc3lzdGVtcywgc28gZXh0MitleHQ0IHN5c3RlbXMgb25seSBuZWUgb25lIGZzLiAgVGhpcyB3b3JrIGhhc24ndAotICogYmVlbiBkb25lIHlldC4KKyAqIFdyYXBwZXIgZnVuY3Rpb25zIHdpdGggd2hpY2ggZXh0NCBjYWxscyBpbnRvIEpCRC4KICAqLwotCiB2b2lkIGV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUoY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICplcnJfZm4sCiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGhhbmRsZV90ICpoYW5kbGUsIGludCBlcnIpOwogCkBAIC0xMzEsMTMgKzEzMSw5IEBACiBpbnQgX19leHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAotLyogV2hlbiBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIGhhbmRsZSwgdGhpcyB3aWxsIHN0aWxsIGRvIGEgcHV0IG9uIHRoZSBCSCAqLwotaW50IF9fZXh0NF9qb3VybmFsX2ZvcmdldChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKLQotLyogV2hlbiBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIGhhbmRsZSwgdGhpcyB3aWxsIHN0aWxsIGRvIGEgcHV0IG9uIHRoZSBCSCAqLwotaW50IF9fZXh0NF9qb3VybmFsX3Jldm9rZShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQlleHQ0X2ZzYmxrX3QgYmxvY2tuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitpbnQgX19leHQ0X2ZvcmdldChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlzX21ldGFkYXRhLAorCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCSAgZXh0NF9mc2Jsa190IGJsb2NrbnIpOwogCiBpbnQgX19leHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsCiAJCQkJaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CkBAIC0xNDksMTIgKzE0NSwxMSBAQAogCV9fZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhfX2Z1bmNfXywgKGhhbmRsZSksIChiaCkpCiAjZGVmaW5lIGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpIFwKIAlfX2V4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKLSNkZWZpbmUgZXh0NF9qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKSBcCi0JX19leHQ0X2pvdXJuYWxfcmV2b2tlKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJsb2NrbnIpLCAoYmgpKQorI2RlZmluZSBleHQ0X2ZvcmdldChoYW5kbGUsIGlzX21ldGFkYXRhLCBpbm9kZSwgYmgsIGJsb2NrX25yKSBcCisJX19leHQ0X2ZvcmdldChfX2Z1bmNfXywgKGhhbmRsZSksIChpc19tZXRhZGF0YSksIChpbm9kZSksIChiaCksXAorCQkgICAgICAoYmxvY2tfbnIpKQogI2RlZmluZSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkgXAogCV9fZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKLSNkZWZpbmUgZXh0NF9qb3VybmFsX2ZvcmdldChoYW5kbGUsIGJoKSBcCi0JX19leHQ0X2pvdXJuYWxfZm9yZ2V0KF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKICNkZWZpbmUgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpIFwKIAlfX2V4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKF9fZnVuY19fLCAoaGFuZGxlKSwgKGlub2RlKSwgKGJoKSkKIApAQCAtMjU0LDYgKzI0OSwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJIGludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllaS0+aV9zeW5jX3RpZCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQ7CisJCWlmIChkYXRhc3luYykKKwkJCWVpLT5pX2RhdGFzeW5jX3RpZCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQ7CisJfQorfQorCiAvKiBzdXBlci5jICovCiBpbnQgZXh0NF9mb3JjZV9jb21taXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggNzE1MjY0Yi4uM2E3OTI4ZiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKKysrIGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTEwMDcsNyArMTAwNyw4IEBACiAJCWZvciAoaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CiAJCQlpZiAoIWFibG9ja3NbaV0pCiAJCQkJY29udGludWU7Ci0JCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGFibG9ja3NbaV0sIDEsIDEpOworCQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAwLCBhYmxvY2tzW2ldLCAxLAorCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSk7CiAJCX0KIAl9CiAJa2ZyZWUoYWJsb2Nrcyk7CkBAIC0xNzYxLDcgKzE3NjIsOSBAQAogCXdoaWxlIChibG9jayA8IGxhc3QgJiYgYmxvY2sgIT0gRVhUX01BWF9CTE9DSykgewogCQludW0gPSBsYXN0IC0gYmxvY2s7CiAJCS8qIGZpbmQgZXh0ZW50IGZvciB0aGlzIGJsb2NrICovCisJCWRvd25fcmVhZCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CiAJCXBhdGggPSBleHQ0X2V4dF9maW5kX2V4dGVudChpbm9kZSwgYmxvY2ssIHBhdGgpOworCQl1cF9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKIAkJaWYgKElTX0VSUihwYXRoKSkgewogCQkJZXJyID0gUFRSX0VSUihwYXRoKTsKIAkJCXBhdGggPSBOVUxMOwpAQCAtMTk1Nyw3ICsxOTYwLDYgQEAKIHN0YXRpYyBpbnQgZXh0NF9leHRfcm1faWR4KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKIHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWludCBlcnI7CiAJZXh0NF9mc2Jsa190IGxlYWY7CiAKQEAgLTE5NzMsOSArMTk3NSw4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlleHRfZGVidWcoImluZGV4IGlzIGVtcHR5LCByZW1vdmUgaXQsIGZyZWUgYmxvY2sgJWxsdVxuIiwgbGVhZik7Ci0JYmggPSBzYl9maW5kX2dldF9ibG9jayhpbm9kZS0+aV9zYiwgbGVhZik7Ci0JZXh0NF9mb3JnZXQoaGFuZGxlLCAxLCBpbm9kZSwgYmgsIGxlYWYpOwotCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbGVhZiwgMSwgMSk7CisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAwLCBsZWFmLCAxLAorCQkJIEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEEgfCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjA0MiwxMiArMjA0MywxMSBAQAogCQkJCXN0cnVjdCBleHQ0X2V4dGVudCAqZXgsCiAJCQkJZXh0NF9sYmxrX3QgZnJvbSwgZXh0NF9sYmxrX3QgdG8pCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAl1bnNpZ25lZCBzaG9ydCBlZV9sZW4gPSAgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpOwotCWludCBpLCBtZXRhZGF0YSA9IDA7CisJaW50IGZsYWdzID0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQ7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQotCQltZXRhZGF0YSA9IDE7CisJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEE7CiAjaWZkZWYgRVhURU5UU19TVEFUUwogCXsKIAkJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CkBAIC0yMDcyLDExICsyMDcyLDcgQEAKIAkJbnVtID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSArIGVlX2xlbiAtIGZyb207CiAJCXN0YXJ0ID0gZXh0X3BibG9jayhleCkgKyBlZV9sZW4gLSBudW07CiAJCWV4dF9kZWJ1ZygiZnJlZSBsYXN0ICV1IGJsb2NrcyBzdGFydGluZyAlbGx1XG4iLCBudW0sIHN0YXJ0KTsKLQkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQliaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKGlub2RlLT5pX3NiLCBzdGFydCArIGkpOwotCQkJZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgYmgsIHN0YXJ0ICsgaSk7Ci0JCX0KLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBzdGFydCwgbnVtLCBtZXRhZGF0YSk7CisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgMCwgc3RhcnQsIG51bSwgZmxhZ3MpOwogCX0gZWxzZSBpZiAoZnJvbSA9PSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spCiAJCSAgICYmIHRvIDw9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykgKyBlZV9sZW4gLSAxKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInN0cmFuZ2UgcmVxdWVzdDogcmVtb3ZhbCAldS0ldSBmcm9tICV1OiV1XG4iLApAQCAtMjE2Nyw3ICsyMTYzLDcgQEAKIAkJCWNvcnJlY3RfaW5kZXggPSAxOwogCQkJY3JlZGl0cyArPSAoZXh0X2RlcHRoKGlub2RlKSkgKyAxOwogCQl9Ci0JCWNyZWRpdHMgKz0gMiAqIEVYVDRfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKKwkJY3JlZGl0cyArPSBFWFQ0X01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpOwogCiAJCWVyciA9IGV4dDRfZXh0X3RydW5jYXRlX2V4dGVuZF9yZXN0YXJ0KGhhbmRsZSwgaW5vZGUsIGNyZWRpdHMpOwogCQlpZiAoZXJyKQpAQCAtMzA2NCw2ICszMDYwLDggQEAKIAlpZiAoZmxhZ3MgPT0gRVhUNF9HRVRfQkxPQ0tTX0RJT19DT05WRVJUX0VYVCkgewogCQlyZXQgPSBleHQ0X2NvbnZlcnRfdW53cml0dGVuX2V4dGVudHNfZGlvKGhhbmRsZSwgaW5vZGUsCiAJCQkJCQkJcGF0aCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCWV4dDRfdXBkYXRlX2lub2RlX2ZzeW5jX3RyYW5zKGhhbmRsZSwgaW5vZGUsIDEpOwogCQlnb3RvIG91dDI7CiAJfQogCS8qIGJ1ZmZlcmVkIElPIGNhc2UgKi8KQEAgLTMwOTEsNiArMzA4OSw4IEBACiAJcmV0ID0gZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZChoYW5kbGUsIGlub2RlLAogCQkJCQkJcGF0aCwgaWJsb2NrLAogCQkJCQkJbWF4X2Jsb2Nrcyk7CisJaWYgKHJldCA+PSAwKQorCQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKIG91dDoKIAlpZiAocmV0IDw9IDApIHsKIAkJZXJyID0gcmV0OwpAQCAtMzMxOSw4ICszMzE5LDggQEAKIAkJLyogbm90IGEgZ29vZCBpZGVhIHRvIGNhbGwgZGlzY2FyZCBoZXJlIGRpcmVjdGx5LAogCQkgKiBidXQgb3RoZXJ3aXNlIHdlJ2QgbmVlZCB0byBjYWxsIGl0IGV2ZXJ5IGZyZWUoKSAqLwogCQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwotCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGV4dF9wYmxvY2soJm5ld2V4KSwKLQkJCQkJZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oJm5ld2V4KSwgMCk7CisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgMCwgZXh0X3BibG9jaygmbmV3ZXgpLAorCQkJCSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbigmbmV3ZXgpLCAwKTsKIAkJZ290byBvdXQyOwogCX0KIApAQCAtMzMyOSwxMCArMzMyOSwxNiBAQAogCWFsbG9jYXRlZCA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCk7CiAJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKIAotCS8qIENhY2hlIG9ubHkgd2hlbiBpdCBpcyBfbm90XyBhbiB1bmluaXRpYWxpemVkIGV4dGVudCAqLwotCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCkgPT0gMCkKKwkvKgorCSAqIENhY2hlIHRoZSBleHRlbnQgYW5kIHVwZGF0ZSB0cmFuc2FjdGlvbiB0byBjb21taXQgb24gZmRhdGFzeW5jIG9ubHkKKwkgKiB3aGVuIGl0IGlzIF9ub3RfIGFuIHVuaW5pdGlhbGl6ZWQgZXh0ZW50LgorCSAqLworCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCkgPT0gMCkgewogCQlleHQ0X2V4dF9wdXRfaW5fY2FjaGUoaW5vZGUsIGlibG9jaywgYWxsb2NhdGVkLCBuZXdibG9jaywKIAkJCQkJCUVYVDRfRVhUX0NBQ0hFX0VYVEVOVCk7CisJCWV4dDRfdXBkYXRlX2lub2RlX2ZzeW5jX3RyYW5zKGhhbmRsZSwgaW5vZGUsIDEpOworCX0gZWxzZQorCQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAwKTsKIG91dDoKIAlpZiAoYWxsb2NhdGVkID4gbWF4X2Jsb2NrcykKIAkJYWxsb2NhdGVkID0gbWF4X2Jsb2NrczsKQEAgLTM3MjAsMTAgKzM3MjYsOCBAQAogCQkgKiBXYWxrIHRoZSBleHRlbnQgdHJlZSBnYXRoZXJpbmcgZXh0ZW50IGluZm9ybWF0aW9uLgogCQkgKiBleHQ0X2V4dF9maWVtYXBfY2Igd2lsbCBwdXNoIGV4dGVudHMgYmFjayB0byB1c2VyLgogCQkgKi8KLQkJZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKIAkJZXJyb3IgPSBleHQ0X2V4dF93YWxrX3NwYWNlKGlub2RlLCBzdGFydF9ibGssIGxlbl9ibGtzLAogCQkJCQkgIGV4dDRfZXh0X2ZpZW1hcF9jYiwgZmllaW5mbyk7Ci0JCXVwX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOwogCX0KIAogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZnN5bmMuYyBiL2ZzL2V4dDQvZnN5bmMuYwppbmRleCAyYjE1MzEyLi4wYjIyNDk3IDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZzeW5jLmMKKysrIGIvZnMvZXh0NC9mc3luYy5jCkBAIC01MSwyNSArNTEsMzAgQEAKIGludCBleHQ0X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbDsKLQlpbnQgZXJyLCByZXQgPSAwOworCWludCByZXQ7CisJdGlkX3QgY29tbWl0X3RpZDsKIAogCUpfQVNTRVJUKGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpID09IE5VTEwpOwogCiAJdHJhY2VfZXh0NF9zeW5jX2ZpbGUoZmlsZSwgZGVudHJ5LCBkYXRhc3luYyk7CiAKKwlpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybiAwOworCiAJcmV0ID0gZmx1c2hfYWlvX2Rpb19jb21wbGV0ZWRfSU8oaW5vZGUpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJldDsKKwkKKwlpZiAoIWpvdXJuYWwpCisJCXJldHVybiBzaW1wbGVfZnN5bmMoZmlsZSwgZGVudHJ5LCBkYXRhc3luYyk7CisKIAkvKgotCSAqIGRhdGE9d3JpdGViYWNrOgorCSAqIGRhdGE9d3JpdGViYWNrLG9yZGVyZWQ6CiAJICogIFRoZSBjYWxsZXIncyBmaWxlbWFwX2ZkYXRhd3JpdGUoKS93YWl0IHdpbGwgc3luYyB0aGUgZGF0YS4KLQkgKiAgc3luY19pbm9kZSgpIHdpbGwgc3luYyB0aGUgbWV0YWRhdGEKLQkgKgotCSAqIGRhdGE9b3JkZXJlZDoKLQkgKiAgVGhlIGNhbGxlcidzIGZpbGVtYXBfZmRhdGF3cml0ZSgpIHdpbGwgd3JpdGUgdGhlIGRhdGEgYW5kCi0JICogIHN5bmNfaW5vZGUoKSB3aWxsIHdyaXRlIHRoZSBpbm9kZSBpZiBpdCBpcyBkaXJ0eS4gIFRoZW4gdGhlIGNhbGxlcidzCi0JICogIGZpbGVtYXBfZmRhdGF3YWl0KCkgd2lsbCB3YWl0IG9uIHRoZSBwYWdlcy4KKwkgKiAgTWV0YWRhdGEgaXMgaW4gdGhlIGpvdXJuYWwsIHdlIHdhaXQgZm9yIHByb3BlciB0cmFuc2FjdGlvbiB0bworCSAqICBjb21taXQgaGVyZS4KIAkgKgogCSAqIGRhdGE9am91cm5hbDoKIAkgKiAgZmlsZW1hcF9mZGF0YXdyaXRlIHdvbid0IGRvIGFueXRoaW5nICh0aGUgYnVmZmVycyBhcmUgY2xlYW4pLgpAQCAtNzksMzIgKzg0LDEzIEBACiAJICogICh0aGV5IHdlcmUgZGlydGllZCBieSBjb21taXQpLiAgQnV0IHRoYXQncyBPSyAtIHRoZSBibG9ja3MgYXJlCiAJICogIHNhZmUgaW4tam91cm5hbCwgd2hpY2ggaXMgYWxsIGZzeW5jKCkgbmVlZHMgdG8gZW5zdXJlLgogCSAqLwotCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSB7Ci0JCXJldCA9IGV4dDRfZm9yY2VfY29tbWl0KGlub2RlLT5pX3NiKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKQorCQlyZXR1cm4gZXh0NF9mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOwogCi0JaWYgKCFqb3VybmFsKQotCQlyZXQgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKLQotCWlmIChkYXRhc3luYyAmJiAhKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpCi0JCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBUaGUgVkZTIGhhcyB3cml0dGVuIHRoZSBmaWxlIGRhdGEuICBJZiB0aGUgaW5vZGUgaXMgdW5hbHRlcmVkCi0JICogdGhlbiB3ZSBuZWVkIG5vdCBzdGFydCBhIGNvbW1pdC4KLQkgKi8KLQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9ESVJUWV9TWU5DfElfRElSVFlfREFUQVNZTkMpKSB7Ci0JCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7Ci0JCQkuc3luY19tb2RlID0gV0JfU1lOQ19BTEwsCi0JCQkubnJfdG9fd3JpdGUgPSAwLCAvKiBzeXNfZnN5bmMgZGlkIHRoaXMgKi8KLQkJfTsKLQkJZXJyID0gc3luY19pbm9kZShpbm9kZSwgJndiYyk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IGVycjsKLQl9Ci1vdXQ6Ci0JaWYgKGpvdXJuYWwgJiYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKQkQyX0JBUlJJRVIpKQorCWNvbW1pdF90aWQgPSBkYXRhc3luYyA/IGVpLT5pX2RhdGFzeW5jX3RpZCA6IGVpLT5pX3N5bmNfdGlkOworCWlmIChqYmQyX2xvZ19zdGFydF9jb21taXQoam91cm5hbCwgY29tbWl0X3RpZCkpCisJCWpiZDJfbG9nX3dhaXRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90aWQpOworCWVsc2UgaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKQkQyX0JBUlJJRVIpCiAJCWJsa2Rldl9pc3N1ZV9mbHVzaChpbm9kZS0+aV9zYi0+c19iZGV2LCBOVUxMKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDJjOGNhYTUuLjUzNTJkYjEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTcxLDU4ICs3MSw2IEBACiB9CiAKIC8qCi0gKiBUaGUgZXh0NCBmb3JnZXQgZnVuY3Rpb24gbXVzdCBwZXJmb3JtIGEgcmV2b2tlIGlmIHdlIGFyZSBmcmVlaW5nIGRhdGEKLSAqIHdoaWNoIGhhcyBiZWVuIGpvdXJuYWxlZC4gIE1ldGFkYXRhIChlZy4gaW5kaXJlY3QgYmxvY2tzKSBtdXN0IGJlCi0gKiByZXZva2VkIGluIGFsbCBjYXNlcy4KLSAqCi0gKiAiYmgiIG1heSBiZSBOVUxMOiBhIG1ldGFkYXRhIGJsb2NrIG1heSBoYXZlIGJlZW4gZnJlZWQgZnJvbSBtZW1vcnkKLSAqIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgYSByZWNvcmQgb2YgaXQgaW4gdGhlIGpvdXJuYWwsIGFuZCB0aGF0IHJlY29yZAotICogc3RpbGwgbmVlZHMgdG8gYmUgcmV2b2tlZC4KLSAqCi0gKiBJZiB0aGUgaGFuZGxlIGlzbid0IHZhbGlkIHdlJ3JlIG5vdCBqb3VybmFsaW5nLCBidXQgd2Ugc3RpbGwgbmVlZCB0bwotICogY2FsbCBpbnRvIGV4dDRfam91cm5hbF9yZXZva2UoKSB0byBwdXQgdGhlIGJ1ZmZlciBoZWFkLgotICovCi1pbnQgZXh0NF9mb3JnZXQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlzX21ldGFkYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2tucikKLXsKLQlpbnQgZXJyOwotCi0JbWlnaHRfc2xlZXAoKTsKLQotCUJVRkZFUl9UUkFDRShiaCwgImVudGVyIik7Ci0KLQlqYmRfZGVidWcoNCwgImZvcmdldHRpbmcgYmggJXA6IGlzX21ldGFkYXRhID0gJWQsIG1vZGUgJW8sICIKLQkJICAiZGF0YSBtb2RlICV4XG4iLAotCQkgIGJoLCBpc19tZXRhZGF0YSwgaW5vZGUtPmlfbW9kZSwKLQkJICB0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFUQV9GTEFHUykpOwotCi0JLyogTmV2ZXIgdXNlIHRoZSByZXZva2UgZnVuY3Rpb24gaWYgd2UgYXJlIGRvaW5nIGZ1bGwgZGF0YQotCSAqIGpvdXJuYWxpbmc6IHRoZXJlIGlzIG5vIG5lZWQgdG8sIGFuZCBhIFYxIHN1cGVyYmxvY2sgd29uJ3QKLQkgKiBzdXBwb3J0IGl0LiAgT3RoZXJ3aXNlLCBvbmx5IHNraXAgdGhlIHJldm9rZSBvbiB1bi1qb3VybmFsZWQKLQkgKiBkYXRhIGJsb2Nrcy4gKi8KLQotCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEgfHwKLQkgICAgKCFpc19tZXRhZGF0YSAmJiAhZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkpIHsKLQkJaWYgKGJoKSB7Ci0JCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGpiZDJfam91cm5hbF9mb3JnZXQiKTsKLQkJCXJldHVybiBleHQ0X2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogZGF0YSE9am91cm5hbCAmJiAoaXNfbWV0YWRhdGEgfHwgc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpCi0JICovCi0JQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfcmV2b2tlIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2Fib3J0KGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKLQkJCSAgICJlcnJvciAlZCB3aGVuIGF0dGVtcHRpbmcgcmV2b2tlIiwgZXJyKTsKLQlCVUZGRVJfVFJBQ0UoYmgsICJleGl0Iik7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKICAqIFdvcmsgb3V0IGhvdyBtYW55IGJsb2NrcyB3ZSBuZWVkIHRvIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBjaHVuayBvZiBhCiAgKiB0cnVuY2F0ZSB0cmFuc2FjdGlvbi4KICAqLwpAQCAtNzIxLDcgKzY2OSw3IEBACiAJcmV0dXJuIHJldDsKIGZhaWxlZF9vdXQ6CiAJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCi0JCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbmV3X2Jsb2Nrc1tpXSwgMSwgMCk7CisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgMCwgbmV3X2Jsb2Nrc1tpXSwgMSwgMCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODE3LDE0ICs3NjUsMjAgQEAKIAlyZXR1cm4gZXJyOwogZmFpbGVkOgogCS8qIEFsbG9jYXRpb24gZmFpbGVkLCBmcmVlIHdoYXQgd2UgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIG5ld19ibG9ja3NbMF0sIDEsIDApOwogCWZvciAoaSA9IDE7IGkgPD0gbiA7IGkrKykgewotCQlCVUZGRVJfVFJBQ0UoYnJhbmNoW2ldLmJoLCAiY2FsbCBqYmQyX2pvdXJuYWxfZm9yZ2V0Iik7Ci0JCWV4dDRfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBicmFuY2hbaV0uYmgpOworCQkvKiAKKwkJICogYnJhbmNoW2ldLmJoIGlzIG5ld2x5IGFsbG9jYXRlZCwgc28gdGhlcmUgaXMgbm8KKwkJICogbmVlZCB0byByZXZva2UgdGhlIGJsb2NrLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKKwkJICogbmVlZCB0byBzZXQgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQS4KKwkJICovCisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgMCwgbmV3X2Jsb2Nrc1tpXSwgMSwKKwkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgaW5kaXJlY3RfYmxrczsgaSsrKQotCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIG5ld19ibG9ja3NbaV0sIDEsIDApOworCWZvciAoaSA9IG4rMTsgaSA8IGluZGlyZWN0X2Jsa3M7IGkrKykKKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAwLCBuZXdfYmxvY2tzW2ldLCAxLCAwKTsKIAotCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbmV3X2Jsb2Nrc1tpXSwgbnVtLCAwKTsKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIG5ld19ibG9ja3NbaV0sIG51bSwgMCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtOTAzLDEyICs4NTcsMTYgQEAKIAogZXJyX291dDoKIAlmb3IgKGkgPSAxOyBpIDw9IG51bTsgaSsrKSB7Ci0JCUJVRkZFUl9UUkFDRSh3aGVyZVtpXS5iaCwgImNhbGwgamJkMl9qb3VybmFsX2ZvcmdldCIpOwotCQlleHQ0X2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgd2hlcmVbaV0uYmgpOwotCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCWxlMzJfdG9fY3B1KHdoZXJlW2ktMV0ua2V5KSwgMSwgMCk7CisJCS8qIAorCQkgKiBicmFuY2hbaV0uYmggaXMgbmV3bHkgYWxsb2NhdGVkLCBzbyB0aGVyZSBpcyBubworCQkgKiBuZWVkIHRvIHJldm9rZSB0aGUgYmxvY2ssIHdoaWNoIGlzIHdoeSB3ZSBkb24ndAorCQkgKiBuZWVkIHRvIHNldCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBLgorCQkgKi8KKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB3aGVyZVtpXS5iaCwgMCwgMSwKKwkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwogCX0KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGxlMzJfdG9fY3B1KHdoZXJlW251bV0ua2V5KSwgYmxrcywgMCk7CisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAwLCBsZTMyX3RvX2NwdSh3aGVyZVtudW1dLmtleSksCisJCQkgYmxrcywgMCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTAyMSwxMCArOTc5LDEyIEBACiAJaWYgKCFlcnIpCiAJCWVyciA9IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGUsIGlub2RlLCBpYmxvY2ssCiAJCQkJCSBwYXJ0aWFsLCBpbmRpcmVjdF9ibGtzLCBjb3VudCk7Ci0JZWxzZQorCWlmIChlcnIpCiAJCWdvdG8gY2xlYW51cDsKIAogCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisKKwlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKIGdvdF9pdDoKIAltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgbGUzMl90b19jcHUoY2hhaW5bZGVwdGgtMV0ua2V5KSk7CiAJaWYgKGNvdW50ID4gYmxvY2tzX3RvX2JvdW5kYXJ5KQpAQCAtMTA1Miw3ICsxMDEyLDcgQEAKIAkJRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKIAlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAotCXJldHVybiB0b3RhbDsKKwlyZXR1cm4gKHRvdGFsIDw8IGlub2RlLT5pX2Jsa2JpdHMpOwogfQogLyoKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKQEAgLTE1MzQsNiArMTQ5NCwxNiBAQAogCXJldHVybiBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKIH0KIAorLyoKKyAqIFRydW5jYXRlIGJsb2NrcyB0aGF0IHdlcmUgbm90IHVzZWQgYnkgd3JpdGUuIFdlIGhhdmUgdG8gdHJ1bmNhdGUgdGhlCisgKiBwYWdlY2FjaGUgYXMgd2VsbCBzbyB0aGF0IGNvcnJlc3BvbmRpbmcgYnVmZmVycyBnZXQgcHJvcGVybHkgdW5tYXBwZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CisJZXh0NF90cnVuY2F0ZShpbm9kZSk7Cit9CisKIHN0YXRpYyBpbnQgZXh0NF93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKIAkJCSAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQpAQCAtMTU5OSw3ICsxNTY5LDcgQEAKIAogCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkgewotCQkJZXh0NF90cnVuY2F0ZShpbm9kZSk7CisJCQlleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CiAJCQkvKgogCQkJICogSWYgdHJ1bmNhdGUgZmFpbGVkIGVhcmx5IHRoZSBpbm9kZSBtaWdodAogCQkJICogc3RpbGwgYmUgb24gdGhlIG9ycGhhbiBsaXN0OyB3ZSBuZWVkIHRvCkBAIC0xNzA5LDcgKzE2NzksNyBAQAogCQlyZXQgPSByZXQyOwogCiAJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpIHsKLQkJZXh0NF90cnVuY2F0ZShpbm9kZSk7CisJCWV4dDRfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKIAkJLyoKIAkJICogSWYgdHJ1bmNhdGUgZmFpbGVkIGVhcmx5IHRoZSBpbm9kZSBtaWdodCBzdGlsbCBiZQogCQkgKiBvbiB0aGUgb3JwaGFuIGxpc3Q7IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZQpAQCAtMTc1MSw3ICsxNzIxLDcgQEAKIAkJcmV0ID0gcmV0MjsKIAogCWlmIChwb3MgKyBsZW4gPiBpbm9kZS0+aV9zaXplKSB7Ci0JCWV4dDRfdHJ1bmNhdGUoaW5vZGUpOworCQlleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CiAJCS8qCiAJCSAqIElmIHRydW5jYXRlIGZhaWxlZCBlYXJseSB0aGUgaW5vZGUgbWlnaHQgc3RpbGwgYmUKIAkJICogb24gdGhlIG9ycGhhbiBsaXN0OyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaW5vZGUKQEAgLTE4MTQsNyArMTc4NCw3IEBACiAJaWYgKCFyZXQpCiAJCXJldCA9IHJldDI7CiAJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpIHsKLQkJZXh0NF90cnVuY2F0ZShpbm9kZSk7CisJCWV4dDRfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKIAkJLyoKIAkJICogSWYgdHJ1bmNhdGUgZmFpbGVkIGVhcmx5IHRoZSBpbm9kZSBtaWdodCBzdGlsbCBiZQogCQkgKiBvbiB0aGUgb3JwaGFuIGxpc3Q7IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZQpAQCAtMjYwMCw3ICsyNTcwLDYgQEAKIH0KIAogc3RhdGljIGludCBfX2V4dDRfam91cm5hbGxlZF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJICAgICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKQEAgLTI3NTgsNyArMjcyNyw3IEBACiAJCSAqIGRvZXNuJ3Qgc2VlbSBtdWNoIHBvaW50IGluIHJlZGlydHlpbmcgdGhlIHBhZ2UgaGVyZS4KIAkJICovCiAJCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7Ci0JCXJldHVybiBfX2V4dDRfam91cm5hbGxlZF93cml0ZXBhZ2UocGFnZSwgd2JjLCBsZW4pOworCQlyZXR1cm4gX19leHQ0X2pvdXJuYWxsZWRfd3JpdGVwYWdlKHBhZ2UsIGxlbik7CiAJfQogCiAJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSAmJiBleHQ0X3Nob3VsZF93cml0ZWJhY2tfZGF0YShpbm9kZSkpCkBAIC0yNzg4LDcgKzI3NTcsNyBAQAogCSAqIG51bWJlciBvZiBjb250aWd1b3VzIGJsb2NrLiBTbyB3ZSB3aWxsIGxpbWl0CiAJICogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxvY2sgdG8gYSBzYW5lIHZhbHVlCiAJICovCi0JaWYgKCEoaW5vZGUtPmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpICYmCisJaWYgKCEoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfRVhURU5UU19GTCkgJiYKIAkgICAgKG1heF9ibG9ja3MgPiBFWFQ0X01BWF9UUkFOU19EQVRBKSkKIAkJbWF4X2Jsb2NrcyA9IEVYVDRfTUFYX1RSQU5TX0RBVEE7CiAKQEAgLTI5MzMsNyArMjkwMiw3IEBACiAJCXJldCA9IHdyaXRlX2NhY2hlX3BhZ2VzKG1hcHBpbmcsIHdiYywgX19tcGFnZV9kYV93cml0ZXBhZ2UsCiAJCQkJCSZtcGQpOwogCQkvKgotCQkgKiBJZiB3ZSBoYXZlIGEgY29udGlnb3VzIGV4dGVudCBvZiBwYWdlcyBhbmQgd2UKKwkJICogSWYgd2UgaGF2ZSBhIGNvbnRpZ3VvdXMgZXh0ZW50IG9mIHBhZ2VzIGFuZCB3ZQogCQkgKiBoYXZlbid0IGRvbmUgdGhlIEkvTyB5ZXQsIG1hcCB0aGUgYmxvY2tzIGFuZCBzdWJtaXQKIAkJICogdGhlbSBmb3IgSS9PLgogCQkgKi8KQEAgLTMwOTEsNyArMzA2MCw3IEBACiAJCSAqIGlfc2l6ZV9yZWFkIGJlY2F1c2Ugd2UgaG9sZCBpX211dGV4LgogCQkgKi8KIAkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCi0JCQlleHQ0X3RydW5jYXRlKGlub2RlKTsKKwkJCWV4dDRfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKIAl9CiAKIAlpZiAocmV0ID09IC1FTk9TUEMgJiYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKQEAgLTQwNjQsNyArNDAzMyw3IEBACiAJaW50IGssIGVycjsKIAogCSp0b3AgPSAwOwotCS8qIE1ha2UgayBpbmRleCB0aGUgZGVlcGVzdCBub24tbnVsbCBvZmZlc3QgKyAxICovCisJLyogTWFrZSBrIGluZGV4IHRoZSBkZWVwZXN0IG5vbi1udWxsIG9mZnNldCArIDEgKi8KIAlmb3IgKGsgPSBkZXB0aDsgayA+IDEgJiYgIW9mZnNldHNbay0xXTsgay0tKQogCQk7CiAJcGFydGlhbCA9IGV4dDRfZ2V0X2JyYW5jaChpbm9kZSwgaywgb2Zmc2V0cywgY2hhaW4sICZlcnIpOwpAQCAtNDEyMCw2ICs0MDg5LDExIEBACiAJCQkgICAgICBfX2xlMzIgKmxhc3QpCiB7CiAJX19sZTMyICpwOworCWludAlmbGFncyA9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQTsKKwogCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CiAJCWlmIChiaCkgewogCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwpAQCAtNDEzNCwyNyArNDEwOCwxMCBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBBbnkgYnVmZmVycyB3aGljaCBhcmUgb24gdGhlIGpvdXJuYWwgd2lsbCBiZSBpbiBtZW1vcnkuIFdlCi0JICogZmluZCB0aGVtIG9uIHRoZSBoYXNoIHRhYmxlIHNvIGpiZDJfam91cm5hbF9yZXZva2UoKSB3aWxsCi0JICogcnVuIGpiZDJfam91cm5hbF9mb3JnZXQoKSBvbiB0aGVtLiAgV2UndmUgYWxyZWFkeSBkZXRhY2hlZAotCSAqIGVhY2ggYmxvY2sgZnJvbSB0aGUgZmlsZSwgc28gYmZvcmdldCgpIGluCi0JICogamJkMl9qb3VybmFsX2ZvcmdldCgpIHNob3VsZCBiZSBzYWZlLgotCSAqCi0JICogQUtQTTogdHVybiBvbiBiZm9yZ2V0IGluIGpiZDJfam91cm5hbF9mb3JnZXQoKSEhIQotCSAqLwotCWZvciAocCA9IGZpcnN0OyBwIDwgbGFzdDsgcCsrKSB7Ci0JCXUzMiBuciA9IGxlMzJfdG9fY3B1KCpwKTsKLQkJaWYgKG5yKSB7Ci0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaDsKKwlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykKKwkJKnAgPSAwOwogCi0JCQkqcCA9IDA7Ci0JCQl0YmggPSBzYl9maW5kX2dldF9ibG9jayhpbm9kZS0+aV9zYiwgbnIpOwotCQkJZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgdGJoLCBucik7Ci0JCX0KLQl9Ci0KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrX3RvX2ZyZWUsIGNvdW50LCAwKTsKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIGJsb2NrX3RvX2ZyZWUsIGNvdW50LCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtNDM0Miw3ICs0Mjk5LDggQEAKIAkJCQkJICAgIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKIAkJCX0KIAotCQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBuciwgMSwgMSk7CisJCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIG5yLCAxLAorCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSk7CiAKIAkJCWlmIChwYXJlbnRfYmgpIHsKIAkJCQkvKgpAQCAtNDc4MSw4ICs0NzM5LDggQEAKIAlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CiAJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKIAlsb25nIHJldDsKIAlpbnQgYmxvY2s7CiAKQEAgLTQ3OTMsMTEgKzQ3NTEsMTEgQEAKIAkJcmV0dXJuIGlub2RlOwogCiAJZWkgPSBFWFQ0X0koaW5vZGUpOworCWlsb2MuYmggPSAwOwogCiAJcmV0ID0gX19leHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsICZpbG9jLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBiYWRfaW5vZGU7Ci0JYmggPSBpbG9jLmJoOwogCXJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKCZpbG9jKTsKIAlpbm9kZS0+aV9tb2RlID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2xvdyk7CkBAIC00ODIwLDcgKzQ3NzgsNiBAQAogCQlpZiAoaW5vZGUtPmlfbW9kZSA9PSAwIHx8CiAJCSAgICAhKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX21vdW50X3N0YXRlICYgRVhUNF9PUlBIQU5fRlMpKSB7CiAJCQkvKiB0aGlzIGlub2RlIGlzIGRlbGV0ZWQgKi8KLQkJCWJyZWxzZShiaCk7CiAJCQlyZXQgPSAtRVNUQUxFOwogCQkJZ290byBiYWRfaW5vZGU7CiAJCX0KQEAgLTQ4NDgsMTEgKzQ4MDUsMzUgQEAKIAkJZWktPmlfZGF0YVtibG9ja10gPSByYXdfaW5vZGUtPmlfYmxvY2tbYmxvY2tdOwogCUlOSVRfTElTVF9IRUFEKCZlaS0+aV9vcnBoYW4pOwogCisJLyoKKwkgKiBTZXQgdHJhbnNhY3Rpb24gaWQncyBvZiB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlIHRvIGJlIGNvbW1pdHRlZAorCSAqIHRvIGZpbmlzaCBmW2RhdGFdc3luYy4gV2Ugc2V0IHRoZW0gdG8gY3VycmVudGx5IHJ1bm5pbmcgdHJhbnNhY3Rpb24KKwkgKiBhcyB3ZSBjYW5ub3QgYmUgc3VyZSB0aGF0IHRoZSBpbm9kZSBvciBzb21lIG9mIGl0cyBtZXRhZGF0YSBpc24ndAorCSAqIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIC0gdGhlIGlub2RlIGNvdWxkIGhhdmUgYmVlbiByZWNsYWltZWQgYW5kCisJICogbm93IGl0IGlzIHJlcmVhZCBmcm9tIGRpc2suCisJICovCisJaWYgKGpvdXJuYWwpIHsKKwkJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJCXRpZF90IHRpZDsKKworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWlmIChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pCisJCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbjsKKwkJZWxzZQorCQkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb247CisJCWlmICh0cmFuc2FjdGlvbikKKwkJCXRpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJZWxzZQorCQkJdGlkID0gam91cm5hbC0+al9jb21taXRfc2VxdWVuY2U7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQllaS0+aV9zeW5jX3RpZCA9IHRpZDsKKwkJZWktPmlfZGF0YXN5bmNfdGlkID0gdGlkOworCX0KKwogCWlmIChFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtPmlfc2IpID4gRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFKSB7CiAJCWVpLT5pX2V4dHJhX2lzaXplID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2V4dHJhX2lzaXplKTsKIAkJaWYgKEVYVDRfR09PRF9PTERfSU5PREVfU0laRSArIGVpLT5pX2V4dHJhX2lzaXplID4KIAkJICAgIEVYVDRfSU5PREVfU0laRShpbm9kZS0+aV9zYikpIHsKLQkJCWJyZWxzZShiaCk7CiAJCQlyZXQgPSAtRUlPOwogCQkJZ290byBiYWRfaW5vZGU7CiAJCX0KQEAgLTQ4ODQsMTAgKzQ4NjUsNyBAQAogCiAJcmV0ID0gMDsKIAlpZiAoZWktPmlfZmlsZV9hY2wgJiYKLQkgICAgKChlaS0+aV9maWxlX2FjbCA8Ci0JICAgICAgKGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKLQkgICAgICAgRVhUNF9TQihzYiktPnNfZ2RiX2NvdW50KSkgfHwKLQkgICAgIChlaS0+aV9maWxlX2FjbCA+PSBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKHNiKS0+c19lcykpKSkgeworCSAgICAhZXh0NF9kYXRhX2Jsb2NrX3ZhbGlkKEVYVDRfU0Ioc2IpLCBlaS0+aV9maWxlX2FjbCwgMSkpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCiAJCQkgICAiYmFkIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jayAlbGx1IGluIGlub2RlICMlbHUiLAogCQkJICAgZWktPmlfZmlsZV9hY2wsIGlub2RlLT5pX2lubyk7CkBAIC00OTA1LDEwICs0ODgzLDggQEAKIAkJLyogVmFsaWRhdGUgYmxvY2sgcmVmZXJlbmNlcyB3aGljaCBhcmUgcGFydCBvZiBpbm9kZSAqLwogCQlyZXQgPSBleHQ0X2NoZWNrX2lub2RlX2Jsb2NrcmVmKGlub2RlKTsKIAl9Ci0JaWYgKHJldCkgewotCQlicmVsc2UoYmgpOworCWlmIChyZXQpCiAJCWdvdG8gYmFkX2lub2RlOwotCX0KIAogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CiAJCWlub2RlLT5pX29wID0gJmV4dDRfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwpAQCAtNDkzNiw3ICs0OTEyLDYgQEAKIAkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKIAkJCSAgIG5ld19kZWNvZGVfZGV2KGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9ibG9ja1sxXSkpKTsKIAl9IGVsc2UgewotCQlicmVsc2UoYmgpOwogCQlyZXQgPSAtRUlPOwogCQlleHQ0X2Vycm9yKGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKIAkJCSAgICJib2d1cyBpX21vZGUgKCVvKSBmb3IgaW5vZGU9JWx1IiwKQEAgLTQ5NDksNiArNDkyNCw3IEBACiAJcmV0dXJuIGlub2RlOwogCiBiYWRfaW5vZGU6CisJYnJlbHNlKGlsb2MuYmgpOwogCWlnZXRfZmFpbGVkKGlub2RlKTsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQpAQCAtNTEwOCw2ICs1MDg0LDcgQEAKIAkJZXJyID0gcmM7CiAJZWktPmlfc3RhdGUgJj0gfkVYVDRfU1RBVEVfTkVXOwogCisJZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlLCBpbm9kZSwgMCk7CiBvdXRfYnJlbHNlOgogCWJyZWxzZShiaCk7CiAJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CkBAIC01MjI3LDggKzUyMDQsOCBAQAogCiAJCS8qICh1c2VyK2dyb3VwKSoob2xkK25ldykgc3RydWN0dXJlLCBpbm9kZSB3cml0ZSAoc2IsCiAJCSAqIGlub2RlIGJsb2NrLCA/IC0gYnV0IHRydW5jYXRlIGlub2RlIHVwZGF0ZSBoYXMgaXQpICovCi0JCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMiooRVhUNF9RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikrCi0JCQkJCUVYVDRfUVVPVEFfREVMX0JMT0NLUyhpbm9kZS0+aV9zYikpKzMpOworCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIChFWFQ0X01BWFFVT1RBU19JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikrCisJCQkJCUVYVDRfTUFYUVVPVEFTX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKSszKTsKIAkJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJCWdvdG8gZXJyX291dDsKQEAgLTUzNzYsNyArNTM1Myw3IEBACiAgKiB3b3JzZSBjYXNlLCB0aGUgaW5kZXhzIGJsb2NrcyBzcHJlYWQgb3ZlciBkaWZmZXJlbnQgYmxvY2sgZ3JvdXBzCiAgKgogICogSWYgZGF0YWJsb2NrcyBhcmUgZGlzY29udGlndW91cywgdGhleSBhcmUgcG9zc2libGUgdG8gc3ByZWFkIG92ZXIKLSAqIGRpZmZlcmVudCBibG9jayBncm91cHMgdG9vLiBJZiB0aGV5IGFyZSBjb250aXVnb3VzLCB3aXRoIGZsZXhiZywKKyAqIGRpZmZlcmVudCBibG9jayBncm91cHMgdG9vLiBJZiB0aGV5IGFyZSBjb250aXVndW91cywgd2l0aCBmbGV4YmcsCiAgKiB0aGV5IGNvdWxkIHN0aWxsIGFjcm9zcyBibG9jayBncm91cCBib3VuZGFyeS4KICAqCiAgKiBBbHNvIGFjY291bnQgZm9yIHN1cGVyYmxvY2ssIGlub2RlLCBxdW90YSBhbmQgeGF0dHIgYmxvY2tzCkBAIC01NDUyLDcgKzU0MjksNyBAQAogICogQ2FsY3VsYXRlIHRoZSBqb3VybmFsIGNyZWRpdHMgZm9yIGEgY2h1bmsgb2YgZGF0YSBtb2RpZmljYXRpb24uCiAgKgogICogVGhpcyBpcyBjYWxsZWQgZnJvbSBESU8sIGZhbGxvY2F0ZSBvciB3aG9ldmVyIGNhbGxpbmcKLSAqIGV4dDRfZ2V0X2Jsb2NrcygpIHRvIG1hcC9hbGxvY2F0ZSBhIGNodW5rIG9mIGNvbnRpZ291cyBkaXNrIGJsb2Nrcy4KKyAqIGV4dDRfZ2V0X2Jsb2NrcygpIHRvIG1hcC9hbGxvY2F0ZSBhIGNodW5rIG9mIGNvbnRpZ3VvdXMgZGlzayBibG9ja3MuCiAgKgogICogam91cm5hbCBidWZmZXJzIGZvciBkYXRhIGJsb2NrcyBhcmUgbm90IGluY2x1ZGVkIGhlcmUsIGFzIERJTwogICogYW5kIGZhbGxvY2F0ZSBkbyBubyBuZWVkIHRvIGpvdXJuYWwgZGF0YSBidWZmZXJzLgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jCmluZGV4IGMxY2RmNjEuLmI2M2QxOTMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW9jdGwuYworKysgYi9mcy9leHQ0L2lvY3RsLmMKQEAgLTIyMSwzMSArMjIxLDM4IEBACiAJCXN0cnVjdCBmaWxlICpkb25vcl9maWxwOwogCQlpbnQgZXJyOwogCisJCWlmICghKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHx8CisJCSAgICAhKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUJBREY7CisKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZtZSwKIAkJCShzdHJ1Y3QgbW92ZV9leHRlbnQgX191c2VyICopYXJnLCBzaXplb2YobWUpKSkKIAkJCXJldHVybiAtRUZBVUxUOworCQltZS5tb3ZlZF9sZW4gPSAwOwogCiAJCWRvbm9yX2ZpbHAgPSBmZ2V0KG1lLmRvbm9yX2ZkKTsKIAkJaWYgKCFkb25vcl9maWxwKQogCQkJcmV0dXJuIC1FQkFERjsKIAotCQlpZiAoIWNhcGFibGUoQ0FQX0RBQ19PVkVSUklERSkpIHsKLQkJCWlmICgoY3VycmVudC0+cmVhbF9jcmVkLT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8Ci0JCQkJIShpbm9kZS0+aV9tb2RlICYgU19JUlVTUikgfHwKLQkJCQkhKGRvbm9yX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUgJgotCQkJCVNfSVJVU1IpKSB7Ci0JCQkJZnB1dChkb25vcl9maWxwKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KKwkJaWYgKCEoZG9ub3JfZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCQllcnIgPSAtRUJBREY7CisJCQlnb3RvIG1leHRfb3V0OwogCQl9CiAKKwkJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG1leHRfb3V0OworCiAJCWVyciA9IGV4dDRfbW92ZV9leHRlbnRzKGZpbHAsIGRvbm9yX2ZpbHAsIG1lLm9yaWdfc3RhcnQsCiAJCQkJCW1lLmRvbm9yX3N0YXJ0LCBtZS5sZW4sICZtZS5tb3ZlZF9sZW4pOwotCQlmcHV0KGRvbm9yX2ZpbHApOworCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKKwkJaWYgKG1lLm1vdmVkX2xlbiA+IDApCisJCQlmaWxlX3JlbW92ZV9zdWlkKGRvbm9yX2ZpbHApOwogCiAJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBtb3ZlX2V4dGVudCAqKWFyZywgJm1lLCBzaXplb2YobWUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCisJCQllcnIgPSAtRUZBVUxUOworbWV4dF9vdXQ6CisJCWZwdXQoZG9ub3JfZmlscCk7CiAJCXJldHVybiBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuYyBiL2ZzL2V4dDQvbWJhbGxvYy5jCmluZGV4IGJiYTEyODIuLmMxZTE5ZDUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5jCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5jCkBAIC0xNDIsNyArMTQyLDcgQEAKICAqIDIgYmxvY2tzIGFuZCB0aGUgb3JkZXIgb2YgYWxsb2NhdGlvbiBpcyA+PSBzYmktPnNfbWJfb3JkZXIyX3JlcXMuIFRoZQogICogdmFsdWUgb2Ygc19tYl9vcmRlcjJfcmVxcyBjYW4gYmUgdHVuZWQgdmlhCiAgKiAvc3lzL2ZzL2V4dDQvPHBhcnRpdGlvbj4vbWJfb3JkZXIyX3JlcS4gIElmIHRoZSByZXF1ZXN0IGxlbiBpcyBlcXVhbCB0bwotICogc3RyaXBlIHNpemUgKHNiaS0+c19zdHJpcGUpLCB3ZSB0cnkgdG8gc2VhcmNoIGZvciBjb250aWdvdXMgYmxvY2sgaW4KKyAqIHN0cmlwZSBzaXplIChzYmktPnNfc3RyaXBlKSwgd2UgdHJ5IHRvIHNlYXJjaCBmb3IgY29udGlndW91cyBibG9jayBpbgogICogc3RyaXBlIHNpemUuIFRoaXMgc2hvdWxkIHJlc3VsdCBpbiBiZXR0ZXIgYWxsb2NhdGlvbiBvbiBSQUlEIHNldHVwcy4gSWYKICAqIG5vdCwgd2Ugc2VhcmNoIGluIHRoZSBzcGVjaWZpYyBncm91cCB1c2luZyBiaXRtYXAgZm9yIGJlc3QgZXh0ZW50cy4gVGhlCiAgKiB0dW5hYmxlIG1pbl90b19zY2FuIGFuZCBtYXhfdG9fc2NhbiBjb250cm9sIHRoZSBiZWhhdmlvdXIgaGVyZS4KQEAgLTI1MjksNyArMjUyOSw2IEBACiAJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZGI7CiAJaW50IGVyciwgY291bnQgPSAwLCBjb3VudDIgPSAwOwogCXN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqZW50cnk7Ci0JZXh0NF9mc2Jsa190IGRpc2NhcmRfYmxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCAqbCwgKmx0bXA7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbHRtcCwgJnR4bi0+dF9wcml2YXRlX2xpc3QpIHsKQEAgLTI1NTksMTMgKzI1NTgsMTkgQEAKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShlNGIuYmRfYml0bWFwX3BhZ2UpOwogCQl9CiAJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBlbnRyeS0+Z3JvdXApOwotCQlkaXNjYXJkX2Jsb2NrID0gKGV4dDRfZnNibGtfdCkgZW50cnktPmdyb3VwICogRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKQotCQkJKyBlbnRyeS0+c3RhcnRfYmxrCi0JCQkrIGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwotCQl0cmFjZV9leHQ0X2Rpc2NhcmRfYmxvY2tzKHNiLCAodW5zaWduZWQgbG9uZyBsb25nKWRpc2NhcmRfYmxvY2ssCi0JCQkJCSAgZW50cnktPmNvdW50KTsKLQkJc2JfaXNzdWVfZGlzY2FyZChzYiwgZGlzY2FyZF9ibG9jaywgZW50cnktPmNvdW50KTsKKwkJaWYgKHRlc3Rfb3B0KHNiLCBESVNDQVJEKSkgeworCQkJZXh0NF9mc2Jsa190IGRpc2NhcmRfYmxvY2s7CisJCQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKIAorCQkJZGlzY2FyZF9ibG9jayA9IChleHQ0X2ZzYmxrX3QpZW50cnktPmdyb3VwICoKKwkJCQkJCUVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikKKwkJCQkJKyBlbnRyeS0+c3RhcnRfYmxrCisJCQkJCSsgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJCQl0cmFjZV9leHQ0X2Rpc2NhcmRfYmxvY2tzKHNiLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRpc2NhcmRfYmxvY2ssCisJCQkJCWVudHJ5LT5jb3VudCk7CisJCQlzYl9pc3N1ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBlbnRyeS0+Y291bnQpOworCQl9CiAJCWttZW1fY2FjaGVfZnJlZShleHQ0X2ZyZWVfZXh0X2NhY2hlcCwgZW50cnkpOwogCQlleHQ0X21iX3JlbGVhc2VfZGVzYygmZTRiKTsKIAl9CkBAIC0zMDA2LDYgKzMwMTEsMjQgQEAKIH0KIAogLyoKKyAqIENhbGxlZCBvbiBmYWlsdXJlOyBmcmVlIHVwIGFueSBibG9ja3MgZnJvbSB0aGUgaW5vZGUgUEEgZm9yIHRoaXMKKyAqIGNvbnRleHQuICBXZSBkb24ndCBuZWVkIHRoaXMgZm9yIE1CX0dST1VQX1BBIGJlY2F1c2Ugd2Ugb25seSBjaGFuZ2UKKyAqIHBhX2ZyZWUgaW4gZXh0NF9tYl9yZWxlYXNlX2NvbnRleHQoKSwgYnV0IG9uIGZhaWx1cmUsIHdlJ3ZlIGFscmVhZHkKKyAqIHplcm9lZCBvdXQgYWMtPmFjX2JfZXguZmVfbGVuLCBzbyBncm91cF9wYS0+cGFfZnJlZSBpcyBub3QgY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQgZXh0NF9kaXNjYXJkX2FsbG9jYXRlZF9ibG9ja3Moc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKK3sKKwlzdHJ1Y3QgZXh0NF9wcmVhbGxvY19zcGFjZSAqcGEgPSBhYy0+YWNfcGE7CisJaW50IGxlbjsKKworCWlmIChwYSAmJiBwYS0+cGFfdHlwZSA9PSBNQl9JTk9ERV9QQSkgeworCQlsZW4gPSBhYy0+YWNfYl9leC5mZV9sZW47CisJCXBhLT5wYV9mcmVlICs9IGxlbjsKKwl9CisKK30KKworLyoKICAqIHVzZSBibG9ja3MgcHJlYWxsb2NhdGVkIHRvIGlub2RlCiAgKi8KIHN0YXRpYyB2b2lkIGV4dDRfbWJfdXNlX2lub2RlX3BhKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsCkBAIC00MjkwLDYgKzQzMTMsNyBAQAogCQkJYWMtPmFjX3N0YXR1cyA9IEFDX1NUQVRVU19DT05USU5VRTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9IGVsc2UgaWYgKCplcnJwKSB7CisJCQlleHQ0X2Rpc2NhcmRfYWxsb2NhdGVkX2Jsb2NrcyhhYyk7CiAJCQlhYy0+YWNfYl9leC5mZV9sZW4gPSAwOwogCQkJYXItPmxlbiA9IDA7CiAJCQlleHQ0X21iX3Nob3dfYWMoYWMpOwpAQCAtNDQyMiwxOCArNDQ0NiwyNCBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogTWFpbiBlbnRyeSBwb2ludCBpbnRvIG1iYWxsb2MgdG8gZnJlZSBibG9ja3MKKy8qKgorICogZXh0NF9mcmVlX2Jsb2NrcygpIC0tIEZyZWUgZ2l2ZW4gYmxvY2tzIGFuZCB1cGRhdGUgcXVvdGEKKyAqIEBoYW5kbGU6CQloYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KKyAqIEBpbm9kZToJCWlub2RlCisgKiBAYmxvY2s6CQlzdGFydCBwaHlzaWNhbCBibG9jayB0byBmcmVlCisgKiBAY291bnQ6CQludW1iZXIgb2YgYmxvY2tzIHRvIGNvdW50CisgKiBAbWV0YWRhdGE6IAkJQXJlIHRoZXNlIG1ldGFkYXRhIGJsb2NrcwogICovCi12b2lkIGV4dDRfbWJfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKLQkJCWludCBtZXRhZGF0YSwgdW5zaWduZWQgbG9uZyAqZnJlZWQpCit2b2lkIGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgZXh0NF9mc2Jsa190IGJsb2NrLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOworCXVuc2lnbmVkIGxvbmcgZnJlZWQgPSAwOwogCXVuc2lnbmVkIGludCBvdmVyZmxvdzsKIAlleHQ0X2dycGJsa190IGJpdDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdkX2JoOwpAQCAtNDQ0MywxMyArNDQ3MywxNiBAQAogCWludCBlcnIgPSAwOwogCWludCByZXQ7CiAKLQkqZnJlZWQgPSAwOworCWlmIChiaCkgeworCQlpZiAoYmxvY2spCisJCQlCVUdfT04oYmxvY2sgIT0gYmgtPmJfYmxvY2tucik7CisJCWVsc2UKKwkJCWJsb2NrID0gYmgtPmJfYmxvY2tucjsKKwl9CiAKIAlzYmkgPSBFWFQ0X1NCKHNiKTsKIAllcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOwotCWlmIChibG9jayA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8Ci0JICAgIGJsb2NrICsgY291bnQgPCBibG9jayB8fAotCSAgICBibG9jayArIGNvdW50ID4gZXh0NF9ibG9ja3NfY291bnQoZXMpKSB7CisJaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc2JpLCBibG9jaywgY291bnQpKSB7CiAJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAogCQkJICAgICJGcmVlaW5nIGJsb2NrcyBub3QgaW4gZGF0YXpvbmUgLSAiCiAJCQkgICAgImJsb2NrID0gJWxsdSwgY291bnQgPSAlbHUiLCBibG9jaywgY291bnQpOwpAQCAtNDQ1Nyw3ICs0NDkwLDMyIEBACiAJfQogCiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBibG9jayAlbGx1XG4iLCBibG9jayk7Ci0JdHJhY2VfZXh0NF9mcmVlX2Jsb2Nrcyhpbm9kZSwgYmxvY2ssIGNvdW50LCBtZXRhZGF0YSk7CisJdHJhY2VfZXh0NF9mcmVlX2Jsb2Nrcyhpbm9kZSwgYmxvY2ssIGNvdW50LCBmbGFncyk7CisKKwlpZiAoZmxhZ3MgJiBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IGJoOworCQlpbnQgaTsKKworCQlCVUdfT04oYmggJiYgKGNvdW50ID4gMSkpOworCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoIWJoKQorCQkJCXRiaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKGlub2RlLT5pX3NiLAorCQkJCQkJCWJsb2NrICsgaSk7CisJCQlleHQ0X2ZvcmdldChoYW5kbGUsIGZsYWdzICYgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSwgCisJCQkJICAgIGlub2RlLCB0YmgsIGJsb2NrICsgaSk7CisJCX0KKwl9CisKKwkvKiAKKwkgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCByZXVzZSB0aGUgZnJlZWQgYmxvY2sgdW50aWwKKwkgKiBhZnRlciB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLCB3aGljaCB3ZSBjYW4gZG8gYnkKKwkgKiB0cmVhdGluZyB0aGUgYmxvY2sgYXMgbWV0YWRhdGEsIGJlbG93LiAgV2UgbWFrZSBhbgorCSAqIGV4Y2VwdGlvbiBpZiB0aGUgaW5vZGUgaXMgdG8gYmUgd3JpdHRlbiBpbiB3cml0ZWJhY2sgbW9kZQorCSAqIHNpbmNlIHdyaXRlYmFjayBtb2RlIGhhcyB3ZWFrIGRhdGEgY29uc2lzdGVuY3kgZ3VhcmFudGVlcy4KKwkgKi8KKwlpZiAoIWV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKGlub2RlKSkKKwkJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQTsKIAogCWFjID0ga21lbV9jYWNoZV9hbGxvYyhleHQ0X2FjX2NhY2hlcCwgR0ZQX05PRlMpOwogCWlmIChhYykgewpAQCAtNDUzMyw3ICs0NTkxLDggQEAKIAllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGJsb2NrX2dyb3VwLCAmZTRiKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX3JldHVybjsKLQlpZiAobWV0YWRhdGEgJiYgZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCisJaWYgKChmbGFncyAmIEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEEpICYmIGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKIAkJc3RydWN0IGV4dDRfZnJlZV9kYXRhICpuZXdfZW50cnk7CiAJCS8qCiAJCSAqIGJsb2NrcyBiZWluZyBmcmVlZCBhcmUgbWV0YWRhdGEuIHRoZXNlIGJsb2NrcyBzaG91bGRuJ3QKQEAgLTQ1NzIsNyArNDYzMSw3IEBACiAKIAlleHQ0X21iX3JlbGVhc2VfZGVzYygmZTRiKTsKIAotCSpmcmVlZCArPSBjb3VudDsKKwlmcmVlZCArPSBjb3VudDsKIAogCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLwogCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOwpAQCAtNDU5Miw2ICs0NjUxLDggQEAKIAl9CiAJc2ItPnNfZGlydCA9IDE7CiBlcnJvcl9yZXR1cm46CisJaWYgKGZyZWVkKQorCQl2ZnNfZHFfZnJlZV9ibG9jayhpbm9kZSwgZnJlZWQpOwogCWJyZWxzZShiaXRtYXBfYmgpOwogCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwogCWlmIChhYykKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmMKaW5kZXggYTkzZDViOC4uODE0MTU4MSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9taWdyYXRlLmMKKysrIGIvZnMvZXh0NC9taWdyYXRlLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCSAqIFNvIGFsbG9jYXRlIGEgY3JlZGl0IG9mIDMuIFdlIG1heSB1cGRhdGUKIAkgKiBxdW90YSAodXNlciBhbmQgZ3JvdXApLgogCSAqLwotCW5lZWRlZCA9IDMgKyAyKkVYVDRfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKKwluZWVkZWQgPSAzICsgRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKIAogCWlmIChleHQ0X2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgbmVlZGVkKSAhPSAwKQogCQlyZXR2YWwgPSBleHQ0X2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIG5lZWRlZCk7CkBAIC0yNjIsMTMgKzI2MiwxNyBAQAogCWZvciAoaSA9IDA7IGkgPCBtYXhfZW50cmllczsgaSsrKSB7CiAJCWlmICh0bXBfaWRhdGFbaV0pIHsKIAkJCWV4dGVuZF9jcmVkaXRfZm9yX2Jsa2RlbChoYW5kbGUsIGlub2RlKTsKLQkJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwKLQkJCQkJbGUzMl90b19jcHUodG1wX2lkYXRhW2ldKSwgMSwgMSk7CisJCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsCisJCQkJCSBsZTMyX3RvX2NwdSh0bXBfaWRhdGFbaV0pLCAxLAorCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSB8CisJCQkJCSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CiAJCX0KIAl9CiAJcHV0X2JoKGJoKTsKIAlleHRlbmRfY3JlZGl0X2Zvcl9ibGtkZWwoaGFuZGxlLCBpbm9kZSk7Ci0JZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAxLCAxKTsKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIGxlMzJfdG9fY3B1KGlfZGF0YSksIDEsCisJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSB8CisJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwogCXJldHVybiAwOwogfQogCkBAIC0yOTcsNyArMzAxLDkgQEAKIAl9CiAJcHV0X2JoKGJoKTsKIAlleHRlbmRfY3JlZGl0X2Zvcl9ibGtkZWwoaGFuZGxlLCBpbm9kZSk7Ci0JZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBsZTMyX3RvX2NwdShpX2RhdGEpLCAxLCAxKTsKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIGxlMzJfdG9fY3B1KGlfZGF0YSksIDEsCisJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSB8CisJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwogCXJldHVybiAwOwogfQogCkBAIC0zMDgsOCArMzE0LDEwIEBACiAJLyogZWktPmlfZGF0YVtFWFQ0X0lORF9CTE9DS10gKi8KIAlpZiAoaV9kYXRhWzBdKSB7CiAJCWV4dGVuZF9jcmVkaXRfZm9yX2Jsa2RlbChoYW5kbGUsIGlub2RlKTsKLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLAotCQkJCWxlMzJfdG9fY3B1KGlfZGF0YVswXSksIDEsIDEpOworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsCisJCQkJbGUzMl90b19jcHUoaV9kYXRhWzBdKSwgMSwKKwkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSB8CisJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAl9CiAKIAkvKiBlaS0+aV9kYXRhW0VYVDRfRElORF9CTE9DS10gKi8KQEAgLTQxOSw3ICs0MjcsOCBAQAogCX0KIAlwdXRfYmgoYmgpOwogCWV4dGVuZF9jcmVkaXRfZm9yX2Jsa2RlbChoYW5kbGUsIGlub2RlKTsKLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrLCAxLCAxKTsKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIGJsb2NrLCAxLAorCQkJIEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEEgfCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNDc3LDcgKzQ4Niw3IEBACiAJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLAogCQkJCQlFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSArCiAJCQkJCUVYVDRfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgMyArCi0JCQkJCTIgKiBFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKQorCQkJCQlFWFQ0X01BWFFVT1RBU19JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikKIAkJCQkJKyAxKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJcmV0dmFsID0gUFRSX0VSUihoYW5kbGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tb3ZlX2V4dGVudC5jIGIvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCmluZGV4IDI1YjZiMTQuLjgyYzQxNWIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbW92ZV9leHRlbnQuYworKysgYi9mcy9leHQ0L21vdmVfZXh0ZW50LmMKQEAgLTc3LDEyICs3NywxNCBAQAogbWV4dF9uZXh0X2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJICAgICAgc3RydWN0IGV4dDRfZXh0ZW50ICoqZXh0ZW50KQogeworCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOwogCWludCBwcG9zLCBsZWFmX3Bwb3MgPSBwYXRoLT5wX2RlcHRoOwogCiAJcHBvcyA9IGxlYWZfcHBvczsKIAlpZiAoRVhUX0xBU1RfRVhURU5UKHBhdGhbcHBvc10ucF9oZHIpID4gcGF0aFtwcG9zXS5wX2V4dCkgewogCQkvKiBsZWFmIGJsb2NrICovCiAJCSpleHRlbnQgPSArK3BhdGhbcHBvc10ucF9leHQ7CisJCXBhdGhbcHBvc10ucF9ibG9jayA9IGV4dF9wYmxvY2socGF0aFtwcG9zXS5wX2V4dCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTE5LDkgKzEyMSwxOCBAQAogCQkJCQlleHRfYmxvY2tfaGRyKHBhdGhbY3VyX3Bwb3MrMV0ucF9iaCk7CiAJCQl9CiAKKwkJCXBhdGhbbGVhZl9wcG9zXS5wX2V4dCA9ICpleHRlbnQgPSBOVUxMOworCisJCQllaCA9IHBhdGhbbGVhZl9wcG9zXS5wX2hkcjsKKwkJCWlmIChsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcykgPT0gMCkKKwkJCQkvKiBlbXB0eSBsZWFmIGlzIGZvdW5kICovCisJCQkJcmV0dXJuIC1FTk9EQVRBOworCiAJCQkvKiBsZWFmIGJsb2NrICovCiAJCQlwYXRoW2xlYWZfcHBvc10ucF9leHQgPSAqZXh0ZW50ID0KIAkJCQlFWFRfRklSU1RfRVhURU5UKHBhdGhbbGVhZl9wcG9zXS5wX2hkcik7CisJCQlwYXRoW2xlYWZfcHBvc10ucF9ibG9jayA9CisJCQkJCWV4dF9wYmxvY2socGF0aFtsZWFmX3Bwb3NdLnBfZXh0KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMTU1LDQwICsxNjYsMTUgQEAKIH0KIAogLyoqCi0gKiBtZXh0X2RvdWJsZV9kb3duX3JlYWQgLSBBY3F1aXJlIHR3byBpbm9kZXMnIHJlYWQgc2VtYXBob3JlCisgKiBkb3VibGVfZG93bl93cml0ZV9kYXRhX3NlbSAtIEFjcXVpcmUgdHdvIGlub2Rlcycgd3JpdGUgbG9jayBvZiBpX2RhdGFfc2VtCiAgKgogICogQG9yaWdfaW5vZGU6CQlvcmlnaW5hbCBpbm9kZSBzdHJ1Y3R1cmUKICAqIEBkb25vcl9pbm9kZToJZG9ub3IgaW5vZGUgc3RydWN0dXJlCi0gKiBBY3F1aXJlIHJlYWQgc2VtYXBob3JlIG9mIHRoZSB0d28gaW5vZGVzIChvcmlnIGFuZCBkb25vcikgYnkgaV9pbm8gb3JkZXIuCisgKiBBY3F1aXJlIHdyaXRlIGxvY2sgb2YgaV9kYXRhX3NlbSBvZiB0aGUgdHdvIGlub2RlcyAob3JpZyBhbmQgZG9ub3IpIGJ5CisgKiBpX2lubyBvcmRlci4KICAqLwogc3RhdGljIHZvaWQKLW1leHRfZG91YmxlX2Rvd25fcmVhZChzdHJ1Y3QgaW5vZGUgKm9yaWdfaW5vZGUsIHN0cnVjdCBpbm9kZSAqZG9ub3JfaW5vZGUpCi17Ci0Jc3RydWN0IGlub2RlICpmaXJzdCA9IG9yaWdfaW5vZGUsICpzZWNvbmQgPSBkb25vcl9pbm9kZTsKLQotCS8qCi0JICogVXNlIHRoZSBpbm9kZSBudW1iZXIgdG8gcHJvdmlkZSB0aGUgc3RhYmxlIGxvY2tpbmcgb3JkZXIgaW5zdGVhZAotCSAqIG9mIGl0cyBhZGRyZXNzLCBiZWNhdXNlIHRoZSBDIGxhbmd1YWdlIGRvZXNuJ3QgZ3VhcmFudGVlIHlvdSBjYW4KLQkgKiBjb21wYXJlIHBvaW50ZXJzIHRoYXQgZG9uJ3QgY29tZSBmcm9tIHRoZSBzYW1lIGFycmF5LgotCSAqLwotCWlmIChkb25vcl9pbm9kZS0+aV9pbm8gPCBvcmlnX2lub2RlLT5pX2lubykgewotCQlmaXJzdCA9IGRvbm9yX2lub2RlOwotCQlzZWNvbmQgPSBvcmlnX2lub2RlOwotCX0KLQotCWRvd25fcmVhZCgmRVhUNF9JKGZpcnN0KS0+aV9kYXRhX3NlbSk7Ci0JZG93bl9yZWFkKCZFWFQ0X0koc2Vjb25kKS0+aV9kYXRhX3NlbSk7Ci19Ci0KLS8qKgotICogbWV4dF9kb3VibGVfZG93bl93cml0ZSAtIEFjcXVpcmUgdHdvIGlub2Rlcycgd3JpdGUgc2VtYXBob3JlCi0gKgotICogQG9yaWdfaW5vZGU6CQlvcmlnaW5hbCBpbm9kZSBzdHJ1Y3R1cmUKLSAqIEBkb25vcl9pbm9kZToJZG9ub3IgaW5vZGUgc3RydWN0dXJlCi0gKiBBY3F1aXJlIHdyaXRlIHNlbWFwaG9yZSBvZiB0aGUgdHdvIGlub2RlcyAob3JpZyBhbmQgZG9ub3IpIGJ5IGlfaW5vIG9yZGVyLgotICovCi1zdGF0aWMgdm9pZAotbWV4dF9kb3VibGVfZG93bl93cml0ZShzdHJ1Y3QgaW5vZGUgKm9yaWdfaW5vZGUsIHN0cnVjdCBpbm9kZSAqZG9ub3JfaW5vZGUpCitkb3VibGVfZG93bl93cml0ZV9kYXRhX3NlbShzdHJ1Y3QgaW5vZGUgKm9yaWdfaW5vZGUsIHN0cnVjdCBpbm9kZSAqZG9ub3JfaW5vZGUpCiB7CiAJc3RydWN0IGlub2RlICpmaXJzdCA9IG9yaWdfaW5vZGUsICpzZWNvbmQgPSBkb25vcl9pbm9kZTsKIApAQCAtMjAzLDMyICsxODksMTggQEAKIAl9CiAKIAlkb3duX3dyaXRlKCZFWFQ0X0koZmlyc3QpLT5pX2RhdGFfc2VtKTsKLQlkb3duX3dyaXRlKCZFWFQ0X0koc2Vjb25kKS0+aV9kYXRhX3NlbSk7CisJZG93bl93cml0ZV9uZXN0ZWQoJkVYVDRfSShzZWNvbmQpLT5pX2RhdGFfc2VtLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiB9CiAKIC8qKgotICogbWV4dF9kb3VibGVfdXBfcmVhZCAtIFJlbGVhc2UgdHdvIGlub2RlcycgcmVhZCBzZW1hcGhvcmUKKyAqIGRvdWJsZV91cF93cml0ZV9kYXRhX3NlbSAtIFJlbGVhc2UgdHdvIGlub2Rlcycgd3JpdGUgbG9jayBvZiBpX2RhdGFfc2VtCiAgKgogICogQG9yaWdfaW5vZGU6CQlvcmlnaW5hbCBpbm9kZSBzdHJ1Y3R1cmUgdG8gYmUgcmVsZWFzZWQgaXRzIGxvY2sgZmlyc3QKICAqIEBkb25vcl9pbm9kZToJZG9ub3IgaW5vZGUgc3RydWN0dXJlIHRvIGJlIHJlbGVhc2VkIGl0cyBsb2NrIHNlY29uZAotICogUmVsZWFzZSByZWFkIHNlbWFwaG9yZSBvZiB0d28gaW5vZGVzIChvcmlnIGFuZCBkb25vcikuCisgKiBSZWxlYXNlIHdyaXRlIGxvY2sgb2YgaV9kYXRhX3NlbSBvZiB0d28gaW5vZGVzIChvcmlnIGFuZCBkb25vcikuCiAgKi8KIHN0YXRpYyB2b2lkCi1tZXh0X2RvdWJsZV91cF9yZWFkKHN0cnVjdCBpbm9kZSAqb3JpZ19pbm9kZSwgc3RydWN0IGlub2RlICpkb25vcl9pbm9kZSkKLXsKLQl1cF9yZWFkKCZFWFQ0X0kob3JpZ19pbm9kZSktPmlfZGF0YV9zZW0pOwotCXVwX3JlYWQoJkVYVDRfSShkb25vcl9pbm9kZSktPmlfZGF0YV9zZW0pOwotfQotCi0vKioKLSAqIG1leHRfZG91YmxlX3VwX3dyaXRlIC0gUmVsZWFzZSB0d28gaW5vZGVzJyB3cml0ZSBzZW1hcGhvcmUKLSAqCi0gKiBAb3JpZ19pbm9kZToJCW9yaWdpbmFsIGlub2RlIHN0cnVjdHVyZSB0byBiZSByZWxlYXNlZCBpdHMgbG9jayBmaXJzdAotICogQGRvbm9yX2lub2RlOglkb25vciBpbm9kZSBzdHJ1Y3R1cmUgdG8gYmUgcmVsZWFzZWQgaXRzIGxvY2sgc2Vjb25kCi0gKiBSZWxlYXNlIHdyaXRlIHNlbWFwaG9yZSBvZiB0d28gaW5vZGVzIChvcmlnIGFuZCBkb25vcikuCi0gKi8KLXN0YXRpYyB2b2lkCi1tZXh0X2RvdWJsZV91cF93cml0ZShzdHJ1Y3QgaW5vZGUgKm9yaWdfaW5vZGUsIHN0cnVjdCBpbm9kZSAqZG9ub3JfaW5vZGUpCitkb3VibGVfdXBfd3JpdGVfZGF0YV9zZW0oc3RydWN0IGlub2RlICpvcmlnX2lub2RlLCBzdHJ1Y3QgaW5vZGUgKmRvbm9yX2lub2RlKQogewogCXVwX3dyaXRlKCZFWFQ0X0kob3JpZ19pbm9kZSktPmlfZGF0YV9zZW0pOwogCXVwX3dyaXRlKCZFWFQ0X0koZG9ub3JfaW5vZGUpLT5pX2RhdGFfc2VtKTsKQEAgLTU5Niw3ICs1NjgsNyBAQAogICogQHRtcF9vZXh0OgkJdGhlIGV4dGVudCB0aGF0IHdpbGwgYmVsb25nIHRvIHRoZSBkb25vciBpbm9kZQogICogQG9yaWdfb2ZmOgkJYmxvY2sgb2Zmc2V0IG9mIG9yaWdpbmFsIGlub2RlCiAgKiBAZG9ub3Jfb2ZmOgkJYmxvY2sgb2Zmc2V0IG9mIGRvbm9yIGlub2RlCi0gKiBAbWF4X2NvdW50OgkJdGhlIG1heGltdW4gbGVuZ3RoIG9mIGV4dGVudHMKKyAqIEBtYXhfY291bnQ6CQl0aGUgbWF4aW11bSBsZW5ndGggb2YgZXh0ZW50cwogICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KICAqLwpAQCAtNjYxLDYgKzYzMyw3IEBACiAgKiBAZG9ub3JfaW5vZGU6CWRvbm9yIGlub2RlCiAgKiBAZnJvbToJCWJsb2NrIG9mZnNldCBvZiBvcmlnX2lub2RlCiAgKiBAY291bnQ6CQlibG9jayBjb3VudCB0byBiZSByZXBsYWNlZAorICogQGVycjoJCXBvaW50ZXIgdG8gc2F2ZSByZXR1cm4gdmFsdWUKICAqCiAgKiBSZXBsYWNlIG9yaWdpbmFsIGlub2RlIGV4dGVudHMgYW5kIGRvbm9yIGlub2RlIGV4dGVudHMgcGFnZSBieSBwYWdlLgogICogV2UgaW1wbGVtZW50IHRoaXMgcmVwbGFjZW1lbnQgaW4gdGhlIGZvbGxvd2luZyB0aHJlZSBzdGVwczoKQEAgLTY3MSwzMyArNjQ0LDMzIEBACiAgKiAzLiBDaGFuZ2UgdGhlIGJsb2NrIGluZm9ybWF0aW9uIG9mIGRvbm9yIGlub2RlIHRvIHBvaW50IGF0IHRoZSBzYXZlZAogICogICAgb3JpZ2luYWwgaW5vZGUgYmxvY2tzIGluIHRoZSBkdW1teSBleHRlbnRzLgogICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqIFJldHVybiByZXBsYWNlZCBibG9jayBjb3VudC4KICAqLwogc3RhdGljIGludAogbWV4dF9yZXBsYWNlX2JyYW5jaGVzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqb3JpZ19pbm9kZSwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqZG9ub3JfaW5vZGUsIGV4dDRfbGJsa190IGZyb20sCi0JCQkgICBleHQ0X2xibGtfdCBjb3VudCkKKwkJCSAgIGV4dDRfbGJsa190IGNvdW50LCBpbnQgKmVycikKIHsKIAlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqb3JpZ19wYXRoID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZG9ub3JfcGF0aCA9IE5VTEw7CiAJc3RydWN0IGV4dDRfZXh0ZW50ICpvZXh0LCAqZGV4dDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgdG1wX2RleHQsIHRtcF9vZXh0OwogCWV4dDRfbGJsa190IG9yaWdfb2ZmID0gZnJvbSwgZG9ub3Jfb2ZmID0gZnJvbTsKLQlpbnQgZXJyID0gMDsKIAlpbnQgZGVwdGg7CiAJaW50IHJlcGxhY2VkX2NvdW50ID0gMDsKIAlpbnQgZGV4dF9hbGVuOwogCi0JbWV4dF9kb3VibGVfZG93bl93cml0ZShvcmlnX2lub2RlLCBkb25vcl9pbm9kZSk7CisJLyogUHJvdGVjdCBleHRlbnQgdHJlZXMgYWdhaW5zdCBibG9jayBhbGxvY2F0aW9ucyB2aWEgZGVsYWxsb2MgKi8KKwlkb3VibGVfZG93bl93cml0ZV9kYXRhX3NlbShvcmlnX2lub2RlLCBkb25vcl9pbm9kZSk7CiAKIAkvKiBHZXQgdGhlIG9yaWdpbmFsIGV4dGVudCBmb3IgdGhlIGJsb2NrICJvcmlnX29mZiIgKi8KLQllcnIgPSBnZXRfZXh0X3BhdGgob3JpZ19pbm9kZSwgb3JpZ19vZmYsICZvcmlnX3BhdGgpOwotCWlmIChlcnIpCisJKmVyciA9IGdldF9leHRfcGF0aChvcmlnX2lub2RlLCBvcmlnX29mZiwgJm9yaWdfcGF0aCk7CisJaWYgKCplcnIpCiAJCWdvdG8gb3V0OwogCiAJLyogR2V0IHRoZSBkb25vciBleHRlbnQgZm9yIHRoZSBoZWFkICovCi0JZXJyID0gZ2V0X2V4dF9wYXRoKGRvbm9yX2lub2RlLCBkb25vcl9vZmYsICZkb25vcl9wYXRoKTsKLQlpZiAoZXJyKQorCSplcnIgPSBnZXRfZXh0X3BhdGgoZG9ub3JfaW5vZGUsIGRvbm9yX29mZiwgJmRvbm9yX3BhdGgpOworCWlmICgqZXJyKQogCQlnb3RvIG91dDsKIAlkZXB0aCA9IGV4dF9kZXB0aChvcmlnX2lub2RlKTsKIAlvZXh0ID0gb3JpZ19wYXRoW2RlcHRoXS5wX2V4dDsKQEAgLTcwNyw5ICs2ODAsOSBAQAogCWRleHQgPSBkb25vcl9wYXRoW2RlcHRoXS5wX2V4dDsKIAl0bXBfZGV4dCA9ICpkZXh0OwogCi0JZXJyID0gbWV4dF9jYWxjX3N3YXBfZXh0ZW50cygmdG1wX2RleHQsICZ0bXBfb2V4dCwgb3JpZ19vZmYsCisJKmVyciA9IG1leHRfY2FsY19zd2FwX2V4dGVudHMoJnRtcF9kZXh0LCAmdG1wX29leHQsIG9yaWdfb2ZmLAogCQkJCSAgICAgIGRvbm9yX29mZiwgY291bnQpOwotCWlmIChlcnIpCisJaWYgKCplcnIpCiAJCWdvdG8gb3V0OwogCiAJLyogTG9vcCBmb3IgdGhlIGRvbm9yIGV4dGVudHMgKi8KQEAgLTcxOCw3ICs2OTEsNyBAQAogCQlpZiAoIWRleHQpIHsKIAkJCWV4dDRfZXJyb3IoZG9ub3JfaW5vZGUtPmlfc2IsIF9fZnVuY19fLAogCQkJCSAgICJUaGUgZXh0ZW50IGZvciBkb25vciBtdXN0IGJlIGZvdW5kIik7Ci0JCQllcnIgPSAtRUlPOworCQkJKmVyciA9IC1FSU87CiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlIGlmIChkb25vcl9vZmYgIT0gbGUzMl90b19jcHUodG1wX2RleHQuZWVfYmxvY2spKSB7CiAJCQlleHQ0X2Vycm9yKGRvbm9yX2lub2RlLT5pX3NiLCBfX2Z1bmNfXywKQEAgLTcyNiwyMCArNjk5LDIwIEBACiAJCQkJImV4dGVudCgldSkgc2hvdWxkIGJlIGVxdWFsIiwKIAkJCQlkb25vcl9vZmYsCiAJCQkJbGUzMl90b19jcHUodG1wX2RleHQuZWVfYmxvY2spKTsKLQkJCWVyciA9IC1FSU87CisJCQkqZXJyID0gLUVJTzsKIAkJCWdvdG8gb3V0OwogCQl9CiAKIAkJLyogU2V0IGRvbm9yIGV4dGVudCB0byBvcmlnIGV4dGVudCAqLwotCQllcnIgPSBtZXh0X2xlYWZfYmxvY2soaGFuZGxlLCBvcmlnX2lub2RlLAorCQkqZXJyID0gbWV4dF9sZWFmX2Jsb2NrKGhhbmRsZSwgb3JpZ19pbm9kZSwKIAkJCQkJICAgb3JpZ19wYXRoLCAmdG1wX2RleHQsICZvcmlnX29mZik7Ci0JCWlmIChlcnIgPCAwKQorCQlpZiAoKmVycikKIAkJCWdvdG8gb3V0OwogCiAJCS8qIFNldCBvcmlnIGV4dGVudCB0byBkb25vciBleHRlbnQgKi8KLQkJZXJyID0gbWV4dF9sZWFmX2Jsb2NrKGhhbmRsZSwgZG9ub3JfaW5vZGUsCisJCSplcnIgPSBtZXh0X2xlYWZfYmxvY2soaGFuZGxlLCBkb25vcl9pbm9kZSwKIAkJCQkJICAgZG9ub3JfcGF0aCwgJnRtcF9vZXh0LCAmZG9ub3Jfb2ZmKTsKLQkJaWYgKGVyciA8IDApCisJCWlmICgqZXJyKQogCQkJZ290byBvdXQ7CiAKIAkJZGV4dF9hbGVuID0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oJnRtcF9kZXh0KTsKQEAgLTc1MywzNSArNzI2LDI1IEBACiAKIAkJaWYgKG9yaWdfcGF0aCkKIAkJCWV4dDRfZXh0X2Ryb3BfcmVmcyhvcmlnX3BhdGgpOwotCQllcnIgPSBnZXRfZXh0X3BhdGgob3JpZ19pbm9kZSwgb3JpZ19vZmYsICZvcmlnX3BhdGgpOwotCQlpZiAoZXJyKQorCQkqZXJyID0gZ2V0X2V4dF9wYXRoKG9yaWdfaW5vZGUsIG9yaWdfb2ZmLCAmb3JpZ19wYXRoKTsKKwkJaWYgKCplcnIpCiAJCQlnb3RvIG91dDsKIAkJZGVwdGggPSBleHRfZGVwdGgob3JpZ19pbm9kZSk7CiAJCW9leHQgPSBvcmlnX3BhdGhbZGVwdGhdLnBfZXh0OwotCQlpZiAobGUzMl90b19jcHUob2V4dC0+ZWVfYmxvY2spICsKLQkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihvZXh0KSA8PSBvcmlnX29mZikgewotCQkJZXJyID0gMDsKLQkJCWdvdG8gb3V0OwotCQl9CiAJCXRtcF9vZXh0ID0gKm9leHQ7CiAKIAkJaWYgKGRvbm9yX3BhdGgpCiAJCQlleHQ0X2V4dF9kcm9wX3JlZnMoZG9ub3JfcGF0aCk7Ci0JCWVyciA9IGdldF9leHRfcGF0aChkb25vcl9pbm9kZSwgZG9ub3Jfb2ZmLCAmZG9ub3JfcGF0aCk7Ci0JCWlmIChlcnIpCisJCSplcnIgPSBnZXRfZXh0X3BhdGgoZG9ub3JfaW5vZGUsIGRvbm9yX29mZiwgJmRvbm9yX3BhdGgpOworCQlpZiAoKmVycikKIAkJCWdvdG8gb3V0OwogCQlkZXB0aCA9IGV4dF9kZXB0aChkb25vcl9pbm9kZSk7CiAJCWRleHQgPSBkb25vcl9wYXRoW2RlcHRoXS5wX2V4dDsKLQkJaWYgKGxlMzJfdG9fY3B1KGRleHQtPmVlX2Jsb2NrKSArCi0JCQkJZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZGV4dCkgPD0gZG9ub3Jfb2ZmKSB7Ci0JCQllcnIgPSAwOwotCQkJZ290byBvdXQ7Ci0JCX0KIAkJdG1wX2RleHQgPSAqZGV4dDsKIAotCQllcnIgPSBtZXh0X2NhbGNfc3dhcF9leHRlbnRzKCZ0bXBfZGV4dCwgJnRtcF9vZXh0LCBvcmlnX29mZiwKKwkJKmVyciA9IG1leHRfY2FsY19zd2FwX2V4dGVudHMoJnRtcF9kZXh0LCAmdG1wX29leHQsIG9yaWdfb2ZmLAogCQkJCQkgICBkb25vcl9vZmYsIGNvdW50IC0gcmVwbGFjZWRfY291bnQpOwotCQlpZiAoZXJyKQorCQlpZiAoKmVycikKIAkJCWdvdG8gb3V0OwogCX0KIApAQCAtNzk1LDggKzc1OCwxMiBAQAogCQlrZnJlZShkb25vcl9wYXRoKTsKIAl9CiAKLQltZXh0X2RvdWJsZV91cF93cml0ZShvcmlnX2lub2RlLCBkb25vcl9pbm9kZSk7Ci0JcmV0dXJuIGVycjsKKwlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKG9yaWdfaW5vZGUpOworCWV4dDRfZXh0X2ludmFsaWRhdGVfY2FjaGUoZG9ub3JfaW5vZGUpOworCisJZG91YmxlX3VwX3dyaXRlX2RhdGFfc2VtKG9yaWdfaW5vZGUsIGRvbm9yX2lub2RlKTsKKworCXJldHVybiByZXBsYWNlZF9jb3VudDsKIH0KIAogLyoqCkBAIC04MDgsMTYgKzc3NSwxNyBAQAogICogQGRhdGFfb2Zmc2V0X2luX3BhZ2U6CWJsb2NrIGluZGV4IHdoZXJlIGRhdGEgc3dhcHBpbmcgc3RhcnRzCiAgKiBAYmxvY2tfbGVuX2luX3BhZ2U6CQl0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBzd2FwcGVkCiAgKiBAdW5pbml0OgkJCW9yaWcgZXh0ZW50IGlzIHVuaW5pdGlhbGl6ZWQgb3Igbm90CisgKiBAZXJyOgkJCXBvaW50ZXIgdG8gc2F2ZSByZXR1cm4gdmFsdWUKICAqCiAgKiBTYXZlIHRoZSBkYXRhIGluIG9yaWdpbmFsIGlub2RlIGJsb2NrcyBhbmQgcmVwbGFjZSBvcmlnaW5hbCBpbm9kZSBleHRlbnRzCiAgKiB3aXRoIGRvbm9yIGlub2RlIGV4dGVudHMgYnkgY2FsbGluZyBtZXh0X3JlcGxhY2VfYnJhbmNoZXMoKS4KLSAqIEZpbmFsbHksIHdyaXRlIG91dCB0aGUgc2F2ZWQgZGF0YSBpbiBuZXcgb3JpZ2luYWwgaW5vZGUgYmxvY2tzLiBSZXR1cm4gMAotICogb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgorICogRmluYWxseSwgd3JpdGUgb3V0IHRoZSBzYXZlZCBkYXRhIGluIG5ldyBvcmlnaW5hbCBpbm9kZSBibG9ja3MuIFJldHVybgorICogcmVwbGFjZWQgYmxvY2sgY291bnQuCiAgKi8KIHN0YXRpYyBpbnQKIG1vdmVfZXh0ZW50X3Blcl9wYWdlKHN0cnVjdCBmaWxlICpvX2ZpbHAsIHN0cnVjdCBpbm9kZSAqZG9ub3JfaW5vZGUsCiAJCSAgcGdvZmZfdCBvcmlnX3BhZ2Vfb2Zmc2V0LCBpbnQgZGF0YV9vZmZzZXRfaW5fcGFnZSwKLQkJICBpbnQgYmxvY2tfbGVuX2luX3BhZ2UsIGludCB1bmluaXQpCisJCSAgaW50IGJsb2NrX2xlbl9pbl9wYWdlLCBpbnQgdW5pbml0LCBpbnQgKmVycikKIHsKIAlzdHJ1Y3QgaW5vZGUgKm9yaWdfaW5vZGUgPSBvX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gb3JpZ19pbm9kZS0+aV9tYXBwaW5nOwpAQCAtODI5LDkgKzc5NywxMSBAQAogCWxvbmcgbG9uZyBvZmZzID0gb3JpZ19wYWdlX29mZnNldCA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gb3JpZ19pbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJdW5zaWduZWQgaW50IHdfZmxhZ3MgPSAwOwotCXVuc2lnbmVkIGludCB0bXBfZGF0YV9sZW4sIGRhdGFfbGVuOworCXVuc2lnbmVkIGludCB0bXBfZGF0YV9zaXplLCBkYXRhX3NpemUsIHJlcGxhY2VkX3NpemU7CiAJdm9pZCAqZnNkYXRhOwotCWludCByZXQsIGksIGpibG9ja3M7CisJaW50IGksIGpibG9ja3M7CisJaW50IGVycjIgPSAwOworCWludCByZXBsYWNlZF9jb3VudCA9IDA7CiAJaW50IGJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSA+PiBvcmlnX2lub2RlLT5pX2Jsa2JpdHM7CiAKIAkvKgpAQCAtODQxLDggKzgxMSw4IEBACiAJamJsb2NrcyA9IGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2NrcyhvcmlnX2lub2RlKSAqIDI7CiAJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KG9yaWdfaW5vZGUsIGpibG9ja3MpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCXJldHVybiByZXQ7CisJCSplcnIgPSBQVFJfRVJSKGhhbmRsZSk7CisJCXJldHVybiAwOwogCX0KIAogCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKQpAQCAtODU4LDM5ICs4MjgsMzYgQEAKIAkgKiBKdXN0IHN3YXAgZGF0YSBibG9ja3MgYmV0d2VlbiBvcmlnIGFuZCBkb25vci4KIAkgKi8KIAlpZiAodW5pbml0KSB7Ci0JCXJldCA9IG1leHRfcmVwbGFjZV9icmFuY2hlcyhoYW5kbGUsIG9yaWdfaW5vZGUsCi0JCQkJCQkgZG9ub3JfaW5vZGUsIG9yaWdfYmxrX29mZnNldCwKLQkJCQkJCSBibG9ja19sZW5faW5fcGFnZSk7Ci0KLQkJLyogQ2xlYXIgdGhlIGlub2RlIGNhY2hlIG5vdCB0byByZWZlciB0byB0aGUgb2xkIGRhdGEgKi8KLQkJZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShvcmlnX2lub2RlKTsKLQkJZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShkb25vcl9pbm9kZSk7CisJCXJlcGxhY2VkX2NvdW50ID0gbWV4dF9yZXBsYWNlX2JyYW5jaGVzKGhhbmRsZSwgb3JpZ19pbm9kZSwKKwkJCQkJCWRvbm9yX2lub2RlLCBvcmlnX2Jsa19vZmZzZXQsCisJCQkJCQlibG9ja19sZW5faW5fcGFnZSwgZXJyKTsKIAkJZ290byBvdXQyOwogCX0KIAogCW9mZnMgPSAobG9uZyBsb25nKW9yaWdfYmxrX29mZnNldCA8PCBvcmlnX2lub2RlLT5pX2Jsa2JpdHM7CiAKLQkvKiBDYWxjdWxhdGUgZGF0YV9sZW4gKi8KKwkvKiBDYWxjdWxhdGUgZGF0YV9zaXplICovCiAJaWYgKChvcmlnX2Jsa19vZmZzZXQgKyBibG9ja19sZW5faW5fcGFnZSAtIDEpID09CiAJICAgICgob3JpZ19pbm9kZS0+aV9zaXplIC0gMSkgPj4gb3JpZ19pbm9kZS0+aV9ibGtiaXRzKSkgewogCQkvKiBSZXBsYWNlIHRoZSBsYXN0IGJsb2NrICovCi0JCXRtcF9kYXRhX2xlbiA9IG9yaWdfaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKTsKKwkJdG1wX2RhdGFfc2l6ZSA9IG9yaWdfaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKTsKIAkJLyoKLQkJICogSWYgZGF0YV9sZW4gZXF1YWwgemVybywgaXQgc2hvd3MgZGF0YV9sZW4gaXMgbXVsdGlwbGVzIG9mCisJCSAqIElmIGRhdGFfc2l6ZSBlcXVhbCB6ZXJvLCBpdCBzaG93cyBkYXRhX3NpemUgaXMgbXVsdGlwbGVzIG9mCiAJCSAqIGJsb2Nrc2l6ZS4gU28gd2Ugc2V0IGFwcHJvcHJpYXRlIHZhbHVlLgogCQkgKi8KLQkJaWYgKHRtcF9kYXRhX2xlbiA9PSAwKQotCQkJdG1wX2RhdGFfbGVuID0gYmxvY2tzaXplOworCQlpZiAodG1wX2RhdGFfc2l6ZSA9PSAwKQorCQkJdG1wX2RhdGFfc2l6ZSA9IGJsb2Nrc2l6ZTsKIAotCQlkYXRhX2xlbiA9IHRtcF9kYXRhX2xlbiArCisJCWRhdGFfc2l6ZSA9IHRtcF9kYXRhX3NpemUgKwogCQkJKChibG9ja19sZW5faW5fcGFnZSAtIDEpIDw8IG9yaWdfaW5vZGUtPmlfYmxrYml0cyk7Ci0JfSBlbHNlIHsKLQkJZGF0YV9sZW4gPSBibG9ja19sZW5faW5fcGFnZSA8PCBvcmlnX2lub2RlLT5pX2Jsa2JpdHM7Ci0JfQorCX0gZWxzZQorCQlkYXRhX3NpemUgPSBibG9ja19sZW5faW5fcGFnZSA8PCBvcmlnX2lub2RlLT5pX2Jsa2JpdHM7CiAKLQlyZXQgPSBhX29wcy0+d3JpdGVfYmVnaW4ob19maWxwLCBtYXBwaW5nLCBvZmZzLCBkYXRhX2xlbiwgd19mbGFncywKKwlyZXBsYWNlZF9zaXplID0gZGF0YV9zaXplOworCisJKmVyciA9IGFfb3BzLT53cml0ZV9iZWdpbihvX2ZpbHAsIG1hcHBpbmcsIG9mZnMsIGRhdGFfc2l6ZSwgd19mbGFncywKIAkJCQkgJnBhZ2UsICZmc2RhdGEpOwotCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwlpZiAodW5saWtlbHkoKmVyciA8IDApKQogCQlnb3RvIG91dDsKIAogCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CkBAIC05MTEsMTQgKzg3OCwxNyBAQAogCS8qIFJlbGVhc2Ugb2xkIGJoIGFuZCBkcm9wIHJlZnMgKi8KIAl0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwogCi0JcmV0ID0gbWV4dF9yZXBsYWNlX2JyYW5jaGVzKGhhbmRsZSwgb3JpZ19pbm9kZSwgZG9ub3JfaW5vZGUsCi0JCQkJCSBvcmlnX2Jsa19vZmZzZXQsIGJsb2NrX2xlbl9pbl9wYWdlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBDbGVhciB0aGUgaW5vZGUgY2FjaGUgbm90IHRvIHJlZmVyIHRvIHRoZSBvbGQgZGF0YSAqLwotCWV4dDRfZXh0X2ludmFsaWRhdGVfY2FjaGUob3JpZ19pbm9kZSk7Ci0JZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShkb25vcl9pbm9kZSk7CisJcmVwbGFjZWRfY291bnQgPSBtZXh0X3JlcGxhY2VfYnJhbmNoZXMoaGFuZGxlLCBvcmlnX2lub2RlLCBkb25vcl9pbm9kZSwKKwkJCQkJb3JpZ19ibGtfb2Zmc2V0LCBibG9ja19sZW5faW5fcGFnZSwKKwkJCQkJJmVycjIpOworCWlmIChlcnIyKSB7CisJCWlmIChyZXBsYWNlZF9jb3VudCkgeworCQkJYmxvY2tfbGVuX2luX3BhZ2UgPSByZXBsYWNlZF9jb3VudDsKKwkJCXJlcGxhY2VkX3NpemUgPQorCQkJCWJsb2NrX2xlbl9pbl9wYWdlIDw8IG9yaWdfaW5vZGUtPmlfYmxrYml0czsKKwkJfSBlbHNlCisJCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCiAJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIDEgPDwgb3JpZ19pbm9kZS0+aV9ibGtiaXRzLCAwKTsKQEAgLTkyOCwxNiArODk4LDE2IEBACiAJCWJoID0gYmgtPmJfdGhpc19wYWdlOwogCiAJZm9yIChpID0gMDsgaSA8IGJsb2NrX2xlbl9pbl9wYWdlOyBpKyspIHsKLQkJcmV0ID0gZXh0NF9nZXRfYmxvY2sob3JpZ19pbm9kZSwKKwkJKmVyciA9IGV4dDRfZ2V0X2Jsb2NrKG9yaWdfaW5vZGUsCiAJCQkJKHNlY3Rvcl90KShvcmlnX2Jsa19vZmZzZXQgKyBpKSwgYmgsIDApOwotCQlpZiAocmV0IDwgMCkKKwkJaWYgKCplcnIgPCAwKQogCQkJZ290byBvdXQ7CiAKIAkJaWYgKGJoLT5iX3RoaXNfcGFnZSAhPSBOVUxMKQogCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CiAJfQogCi0JcmV0ID0gYV9vcHMtPndyaXRlX2VuZChvX2ZpbHAsIG1hcHBpbmcsIG9mZnMsIGRhdGFfbGVuLCBkYXRhX2xlbiwKKwkqZXJyID0gYV9vcHMtPndyaXRlX2VuZChvX2ZpbHAsIG1hcHBpbmcsIG9mZnMsIGRhdGFfc2l6ZSwgcmVwbGFjZWRfc2l6ZSwKIAkJCSAgICAgICBwYWdlLCBmc2RhdGEpOwogCXBhZ2UgPSBOVUxMOwogCkBAIC05NTEsNyArOTIxLDEwIEBACiBvdXQyOgogCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAKLQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CisJaWYgKGVycjIpCisJCSplcnIgPSBlcnIyOworCisJcmV0dXJuIHJlcGxhY2VkX2NvdW50OwogfQogCiAvKioKQEAgLTk2Miw3ICs5MzUsNiBAQAogICogQG9yaWdfc3RhcnQ6CQlsb2dpY2FsIHN0YXJ0IG9mZnNldCBpbiBibG9jayBmb3Igb3JpZwogICogQGRvbm9yX3N0YXJ0Oglsb2dpY2FsIHN0YXJ0IG9mZnNldCBpbiBibG9jayBmb3IgZG9ub3IKICAqIEBsZW46CQl0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBtb3ZlZAotICogQG1vdmVkX2xlbjoJCW1vdmVkIGJsb2NrIGxlbmd0aAogICoKICAqIENoZWNrIHRoZSBhcmd1bWVudHMgb2YgZXh0NF9tb3ZlX2V4dGVudHMoKSB3aGV0aGVyIHRoZSBmaWxlcyBjYW4gYmUKICAqIGV4Y2hhbmdlZCB3aXRoIGVhY2ggb3RoZXIuCkBAIC05NzAsOCArOTQyLDggQEAKICAqLwogc3RhdGljIGludAogbWV4dF9jaGVja19hcmd1bWVudHMoc3RydWN0IGlub2RlICpvcmlnX2lub2RlLAotCQkJICBzdHJ1Y3QgaW5vZGUgKmRvbm9yX2lub2RlLCBfX3U2NCBvcmlnX3N0YXJ0LAotCQkJICBfX3U2NCBkb25vcl9zdGFydCwgX191NjQgKmxlbiwgX191NjQgbW92ZWRfbGVuKQorCQkgICAgIHN0cnVjdCBpbm9kZSAqZG9ub3JfaW5vZGUsIF9fdTY0IG9yaWdfc3RhcnQsCisJCSAgICAgX191NjQgZG9ub3Jfc3RhcnQsIF9fdTY0ICpsZW4pCiB7CiAJZXh0NF9sYmxrX3Qgb3JpZ19ibG9ja3MsIGRvbm9yX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgYmxrYml0cyA9IG9yaWdfaW5vZGUtPmlfYmxrYml0czsKQEAgLTk4NSw2ICs5NTcsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGRvbm9yX2lub2RlLT5pX21vZGUgJiAoU19JU1VJRHxTX0lTR0lEKSkgeworCQlleHQ0X2RlYnVnKCJleHQ0IG1vdmUgZXh0ZW50OiBzdWlkIG9yIHNnaWQgaXMgc2V0IgorCQkJICAgIiB0byBkb25vciBmaWxlIFtpbm86b3JpZyAlbHUsIGRvbm9yICVsdV1cbiIsCisJCQkgICBvcmlnX2lub2RlLT5pX2lubywgZG9ub3JfaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogRXh0NCBtb3ZlIGV4dGVudCBkb2VzIG5vdCBzdXBwb3J0IHN3YXBmaWxlICovCiAJaWYgKElTX1NXQVBGSUxFKG9yaWdfaW5vZGUpIHx8IElTX1NXQVBGSUxFKGRvbm9yX2lub2RlKSkgewogCQlleHQ0X2RlYnVnKCJleHQ0IG1vdmUgZXh0ZW50OiBUaGUgYXJndW1lbnQgZmlsZXMgc2hvdWxkICIKQEAgLTEwMjUsMTMgKzEwMDQsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAobW92ZWRfbGVuKSB7Ci0JCWV4dDRfZGVidWcoImV4dDQgbW92ZSBleHRlbnQ6IG1vdmVkX2xlbiBzaG91bGQgYmUgMCAiCi0JCQkiW2lubzpvcmlnICVsdSwgZG9ub3IgJWx1XVxuIiwgb3JpZ19pbm9kZS0+aV9pbm8sCi0JCQlkb25vcl9pbm9kZS0+aV9pbm8pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAoKG9yaWdfc3RhcnQgPiBFWFRfTUFYX0JMT0NLKSB8fAogCSAgICAoZG9ub3Jfc3RhcnQgPiBFWFRfTUFYX0JMT0NLKSB8fAogCSAgICAoKmxlbiA+IEVYVF9NQVhfQkxPQ0spIHx8CkBAIC0xMDg4LDcgKzEwNjAsNyBAQAogCX0KIAogCWlmICghKmxlbikgewotCQlleHQ0X2RlYnVnKCJleHQ0IG1vdmUgZXh0ZW50OiBsZW4gc2hvdWRsZCBub3QgYmUgMCAiCisJCWV4dDRfZGVidWcoImV4dDQgbW92ZSBleHRlbnQ6IGxlbiBzaG91bGQgbm90IGJlIDAgIgogCQkJIltpbm86b3JpZyAlbHUsIGRvbm9yICVsdV1cbiIsIG9yaWdfaW5vZGUtPmlfaW5vLAogCQkJZG9ub3JfaW5vZGUtPmlfaW5vKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjMyLDE2ICsxMjA0LDE2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIHByb3RlY3Qgb3JpZyBhbmQgZG9ub3IgYWdhaW5zdCBhIHRydW5jYXRlICovCisJLyogUHJvdGVjdCBvcmlnIGFuZCBkb25vciBpbm9kZXMgYWdhaW5zdCBhIHRydW5jYXRlICovCiAJcmV0MSA9IG1leHRfaW5vZGVfZG91YmxlX2xvY2sob3JpZ19pbm9kZSwgZG9ub3JfaW5vZGUpOwogCWlmIChyZXQxIDwgMCkKIAkJcmV0dXJuIHJldDE7CiAKLQltZXh0X2RvdWJsZV9kb3duX3JlYWQob3JpZ19pbm9kZSwgZG9ub3JfaW5vZGUpOworCS8qIFByb3RlY3QgZXh0ZW50IHRyZWUgYWdhaW5zdCBibG9jayBhbGxvY2F0aW9ucyB2aWEgZGVsYWxsb2MgKi8KKwlkb3VibGVfZG93bl93cml0ZV9kYXRhX3NlbShvcmlnX2lub2RlLCBkb25vcl9pbm9kZSk7CiAJLyogQ2hlY2sgdGhlIGZpbGVzeXN0ZW0gZW52aXJvbm1lbnQgd2hldGhlciBtb3ZlX2V4dGVudCBjYW4gYmUgZG9uZSAqLwogCXJldDEgPSBtZXh0X2NoZWNrX2FyZ3VtZW50cyhvcmlnX2lub2RlLCBkb25vcl9pbm9kZSwgb3JpZ19zdGFydCwKLQkJCQkJZG9ub3Jfc3RhcnQsICZsZW4sICptb3ZlZF9sZW4pOwotCW1leHRfZG91YmxlX3VwX3JlYWQob3JpZ19pbm9kZSwgZG9ub3JfaW5vZGUpOworCQkJCSAgICBkb25vcl9zdGFydCwgJmxlbik7CiAJaWYgKHJldDEpCiAJCWdvdG8gb3V0OwogCkBAIC0xMzU1LDM2ICsxMzI3LDM5IEBACiAJCXNlcV9zdGFydCA9IGxlMzJfdG9fY3B1KGV4dF9jdXItPmVlX2Jsb2NrKTsKIAkJcmVzdF9ibG9ja3MgPSBzZXFfYmxvY2tzOwogCi0JCS8qIERpc2NhcmQgcHJlYWxsb2NhdGlvbnMgb2YgdHdvIGlub2RlcyAqLwotCQlkb3duX3dyaXRlKCZFWFQ0X0kob3JpZ19pbm9kZSktPmlfZGF0YV9zZW0pOwotCQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMob3JpZ19pbm9kZSk7Ci0JCXVwX3dyaXRlKCZFWFQ0X0kob3JpZ19pbm9kZSktPmlfZGF0YV9zZW0pOwotCi0JCWRvd25fd3JpdGUoJkVYVDRfSShkb25vcl9pbm9kZSktPmlfZGF0YV9zZW0pOwotCQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoZG9ub3JfaW5vZGUpOwotCQl1cF93cml0ZSgmRVhUNF9JKGRvbm9yX2lub2RlKS0+aV9kYXRhX3NlbSk7CisJCS8qCisJCSAqIFVwIHNlbWFwaG9yZSB0byBhdm9pZCBmb2xsb3dpbmcgcHJvYmxlbXM6CisJCSAqIGEuIHRyYW5zYWN0aW9uIGRlYWRsb2NrIGFtb25nIGV4dDRfam91cm5hbF9zdGFydCwKKwkJICogICAgLT53cml0ZV9iZWdpbiB2aWEgcGFnZWZhdWx0LCBhbmQgamJkMl9qb3VybmFsX2NvbW1pdAorCQkgKiBiLiByYWNpbmcgd2l0aCAtPnJlYWRwYWdlLCAtPndyaXRlX2JlZ2luLCBhbmQgZXh0NF9nZXRfYmxvY2sKKwkJICogICAgaW4gbW92ZV9leHRlbnRfcGVyX3BhZ2UKKwkJICovCisJCWRvdWJsZV91cF93cml0ZV9kYXRhX3NlbShvcmlnX2lub2RlLCBkb25vcl9pbm9kZSk7CiAKIAkJd2hpbGUgKG9yaWdfcGFnZV9vZmZzZXQgPD0gc2VxX2VuZF9wYWdlKSB7CiAKIAkJCS8qIFN3YXAgb3JpZ2luYWwgYnJhbmNoZXMgd2l0aCBuZXcgYnJhbmNoZXMgKi8KLQkJCXJldDEgPSBtb3ZlX2V4dGVudF9wZXJfcGFnZShvX2ZpbHAsIGRvbm9yX2lub2RlLAorCQkJYmxvY2tfbGVuX2luX3BhZ2UgPSBtb3ZlX2V4dGVudF9wZXJfcGFnZSgKKwkJCQkJCW9fZmlscCwgZG9ub3JfaW5vZGUsCiAJCQkJCQlvcmlnX3BhZ2Vfb2Zmc2V0LAogCQkJCQkJZGF0YV9vZmZzZXRfaW5fcGFnZSwKLQkJCQkJCWJsb2NrX2xlbl9pbl9wYWdlLCB1bmluaXQpOwotCQkJaWYgKHJldDEgPCAwKQotCQkJCWdvdG8gb3V0OwotCQkJb3JpZ19wYWdlX29mZnNldCsrOworCQkJCQkJYmxvY2tfbGVuX2luX3BhZ2UsIHVuaW5pdCwKKwkJCQkJCSZyZXQxKTsKKwogCQkJLyogQ291bnQgaG93IG1hbnkgYmxvY2tzIHdlIGhhdmUgZXhjaGFuZ2VkICovCiAJCQkqbW92ZWRfbGVuICs9IGJsb2NrX2xlbl9pbl9wYWdlOworCQkJaWYgKHJldDEgPCAwKQorCQkJCWJyZWFrOwogCQkJaWYgKCptb3ZlZF9sZW4gPiBsZW4pIHsKIAkJCQlleHQ0X2Vycm9yKG9yaWdfaW5vZGUtPmlfc2IsIF9fZnVuY19fLAogCQkJCQkiV2UgcmVwbGFjZWQgYmxvY2tzIHRvbyBtdWNoISAiCiAJCQkJCSJzdW0gb2YgcmVwbGFjZWQ6ICVsbHUgcmVxdWVzdGVkOiAlbGx1IiwKIAkJCQkJKm1vdmVkX2xlbiwgbGVuKTsKIAkJCQlyZXQxID0gLUVJTzsKLQkJCQlnb3RvIG91dDsKKwkJCQlicmVhazsKIAkJCX0KIAorCQkJb3JpZ19wYWdlX29mZnNldCsrOwogCQkJZGF0YV9vZmZzZXRfaW5fcGFnZSA9IDA7CiAJCQlyZXN0X2Jsb2NrcyAtPSBibG9ja19sZW5faW5fcGFnZTsKIAkJCWlmIChyZXN0X2Jsb2NrcyA+IGJsb2Nrc19wZXJfcGFnZSkKQEAgLTEzOTMsNiArMTM2OCwxMCBAQAogCQkJCWJsb2NrX2xlbl9pbl9wYWdlID0gcmVzdF9ibG9ja3M7CiAJCX0KIAorCQlkb3VibGVfZG93bl93cml0ZV9kYXRhX3NlbShvcmlnX2lub2RlLCBkb25vcl9pbm9kZSk7CisJCWlmIChyZXQxIDwgMCkKKwkJCWJyZWFrOworCiAJCS8qIERlY3JlYXNlIGJ1ZmZlciBjb3VudGVyICovCiAJCWlmIChob2xlY2hlY2tfcGF0aCkKIAkJCWV4dDRfZXh0X2Ryb3BfcmVmcyhob2xlY2hlY2tfcGF0aCk7CkBAIC0xNDE0LDYgKzEzOTMsMTEgQEAKIAogCX0KIG91dDoKKwlpZiAoKm1vdmVkX2xlbikgeworCQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMob3JpZ19pbm9kZSk7CisJCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhkb25vcl9pbm9kZSk7CisJfQorCiAJaWYgKG9yaWdfcGF0aCkgewogCQlleHQ0X2V4dF9kcm9wX3JlZnMob3JpZ19wYXRoKTsKIAkJa2ZyZWUob3JpZ19wYXRoKTsKQEAgLTE0MjIsNyArMTQwNiw3IEBACiAJCWV4dDRfZXh0X2Ryb3BfcmVmcyhob2xlY2hlY2tfcGF0aCk7CiAJCWtmcmVlKGhvbGVjaGVja19wYXRoKTsKIAl9Ci0KKwlkb3VibGVfdXBfd3JpdGVfZGF0YV9zZW0ob3JpZ19pbm9kZSwgZG9ub3JfaW5vZGUpOwogCXJldDIgPSBtZXh0X2lub2RlX2RvdWJsZV91bmxvY2sob3JpZ19pbm9kZSwgZG9ub3JfaW5vZGUpOwogCiAJaWYgKHJldDEpCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggNmQyYzFiOC4uMTdhMTdlMSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMTI5Miw5ICsxMjkyLDYgQEAKICAqIGFkZF9kaXJlbnRfdG9fYnVmIHdpbGwgYXR0ZW1wdCBzZWFyY2ggdGhlIGRpcmVjdG9yeSBibG9jayBmb3IKICAqIHNwYWNlLiAgSXQgd2lsbCByZXR1cm4gLUVOT1NQQyBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUsIGFuZCAtRUlPCiAgKiBhbmQgLUVFWElTVCBpZiBkaXJlY3RvcnkgZW50cnkgYWxyZWFkeSBleGlzdHMuCi0gKgotICogTk9URSEgIGJoIGlzIE5PVCByZWxlYXNlZCBpbiB0aGUgY2FzZSB3aGVyZSBFTk9TUEMgaXMgcmV0dXJuZWQuICBJbgotICogYWxsIG90aGVyIGNhc2VzIGJoIGlzIHJlbGVhc2VkLgogICovCiBzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLApAQCAtMTMxNSwxNCArMTMxMiwxMCBAQAogCQl0b3AgPSBiaC0+Yl9kYXRhICsgYmxvY2tzaXplIC0gcmVjbGVuOwogCQl3aGlsZSAoKGNoYXIgKikgZGUgPD0gdG9wKSB7CiAJCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KCJleHQ0X2FkZF9lbnRyeSIsIGRpciwgZGUsCi0JCQkJCQkgIGJoLCBvZmZzZXQpKSB7Ci0JCQkJYnJlbHNlKGJoKTsKKwkJCQkJCSAgYmgsIG9mZnNldCkpCiAJCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQlpZiAoZXh0NF9tYXRjaChuYW1lbGVuLCBuYW1lLCBkZSkpIHsKLQkJCQlicmVsc2UoYmgpOworCQkJaWYgKGV4dDRfbWF0Y2gobmFtZWxlbiwgbmFtZSwgZGUpKQogCQkJCXJldHVybiAtRUVYSVNUOwotCQkJfQogCQkJbmxlbiA9IEVYVDRfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKIAkJCXJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuLCBibG9ja3NpemUpOwogCQkJaWYgKChkZS0+aW5vZGU/IHJsZW4gLSBubGVuOiBybGVuKSA+PSByZWNsZW4pCkBAIC0xMzM3LDcgKzEzMzAsNiBAQAogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOwogCWlmIChlcnIpIHsKIAkJZXh0NF9zdGRfZXJyb3IoZGlyLT5pX3NiLCBlcnIpOwotCQlicmVsc2UoYmgpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTM3Nyw3ICsxMzY5LDYgQEAKIAllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgYmgpOwogCWlmIChlcnIpCiAJCWV4dDRfc3RkX2Vycm9yKGRpci0+aV9zYiwgZXJyKTsKLQlicmVsc2UoYmgpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDcxLDcgKzE0NjIsOSBAQAogCWlmICghKGRlKSkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXJldHVybiBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7CisJcmV0dmFsID0gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBkZSwgYmgpOworCWJyZWxzZShiaCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoKQEAgLTE1MTQsOCArMTUwNywxMCBAQAogCQlpZighYmgpCiAJCQlyZXR1cm4gcmV0dmFsOwogCQlyZXR2YWwgPSBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIE5VTEwsIGJoKTsKLQkJaWYgKHJldHZhbCAhPSAtRU5PU1BDKQorCQlpZiAocmV0dmFsICE9IC1FTk9TUEMpIHsKKwkJCWJyZWxzZShiaCk7CiAJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJaWYgKGJsb2NrcyA9PSAxICYmICFkeF9mYWxsYmFjayAmJgogCQkgICAgRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKSkKQEAgLTE1MjgsNyArMTUyMyw5IEBACiAJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKIAlkZS0+aW5vZGUgPSAwOwogCWRlLT5yZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soYmxvY2tzaXplLCBibG9ja3NpemUpOwotCXJldHVybiBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7CisJcmV0dmFsID0gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBkZSwgYmgpOworCWJyZWxzZShiaCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoKQEAgLTE1NjEsMTAgKzE1NTgsOCBAQAogCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAKIAllcnIgPSBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIE5VTEwsIGJoKTsKLQlpZiAoZXJyICE9IC1FTk9TUEMpIHsKLQkJYmggPSBOVUxMOworCWlmIChlcnIgIT0gLUVOT1NQQykKIAkJZ290byBjbGVhbnVwOwotCX0KIAogCS8qIEJsb2NrIGZ1bGwsIHNob3VsZCBjb21wcmVzcyBidXQgZm9yIG5vdyBqdXN0IHNwbGl0ICovCiAJZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAidXNpbmcgJXUgb2YgJXUgbm9kZSBlbnRyaWVzXG4iLApAQCAtMTY1Nyw3ICsxNjUyLDYgQEAKIAlpZiAoIWRlKQogCQlnb3RvIGNsZWFudXA7CiAJZXJyID0gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBkZSwgYmgpOwotCWJoID0gTlVMTDsKIAlnb3RvIGNsZWFudXA7CiAKIGpvdXJuYWxfZXJyb3I6CkBAIC0xNzc1LDcgKzE3NjksNyBAQAogcmV0cnk6CiAJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKIAkJCQkJRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKLQkJCQkJMipFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOworCQkJCQlFWFQ0X01BWFFVT1RBU19JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKQEAgLTE4MDksNyArMTgwMyw3IEBACiByZXRyeToKIAloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikgKwogCQkJCQlFWFQ0X0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDMgKwotCQkJCQkyKkVYVDRfUVVPVEFfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSk7CisJCQkJCUVYVDRfTUFYUVVPVEFTX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIApAQCAtMTg0Niw3ICsxODQwLDcgQEAKIHJldHJ5OgogCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChkaXIsIEVYVDRfREFUQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSArCiAJCQkJCUVYVDRfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgMyArCi0JCQkJCTIqRVhUNF9RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKKwkJCQkJRVhUNF9NQVhRVU9UQVNfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCkBAIC0yMjU5LDcgKzIyNTMsNyBAQAogcmV0cnk6CiAJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKIAkJCQkJRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyA1ICsKLQkJCQkJMipFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOworCQkJCQlFWFQ0X01BWFFVT1RBU19JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcmVzaXplLmMgYi9mcy9leHQ0L3Jlc2l6ZS5jCmluZGV4IDNjZmMzNDMuLjNiMmM1NTQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcmVzaXplLmMKKysrIGIvZnMvZXh0NC9yZXNpemUuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCQlnb3RvIGV4aXRfYmg7CiAKIAkJaWYgKElTX0VSUihnZGIgPSBiY2xlYW4oaGFuZGxlLCBzYiwgYmxvY2spKSkgewotCQkJZXJyID0gUFRSX0VSUihiaCk7CisJCQllcnIgPSBQVFJfRVJSKGdkYik7CiAJCQlnb3RvIGV4aXRfYmg7CiAJCX0KIAkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZGIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IGQ0Y2E5MmEuLjhiNThhMTQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTYwMywxMCArNjAzLDYgQEAKIAlpZiAoc2ItPnNfZGlydCkKIAkJZXh0NF9jb21taXRfc3VwZXIoc2IsIDEpOwogCi0JZXh0NF9yZWxlYXNlX3N5c3RlbV96b25lKHNiKTsKLQlleHQ0X21iX3JlbGVhc2Uoc2IpOwotCWV4dDRfZXh0X3JlbGVhc2Uoc2IpOwotCWV4dDRfeGF0dHJfcHV0X3N1cGVyKHNiKTsKIAlpZiAoc2JpLT5zX2pvdXJuYWwpIHsKIAkJZXJyID0gamJkMl9qb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOwogCQlzYmktPnNfam91cm5hbCA9IE5VTEw7CkBAIC02MTQsNiArNjEwLDEyIEBACiAJCQlleHQ0X2Fib3J0KHNiLCBfX2Z1bmNfXywKIAkJCQkgICAiQ291bGRuJ3QgY2xlYW4gdXAgdGhlIGpvdXJuYWwiKTsKIAl9CisKKwlleHQ0X3JlbGVhc2Vfc3lzdGVtX3pvbmUoc2IpOworCWV4dDRfbWJfcmVsZWFzZShzYik7CisJZXh0NF9leHRfcmVsZWFzZShzYik7CisJZXh0NF94YXR0cl9wdXRfc3VwZXIoc2IpOworCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCUVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwogCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CkBAIC03MDQsNiArNzA2LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmKGVpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spKTsKIAlJTklUX0xJU1RfSEVBRCgmZWktPmlfYWlvX2Rpb19jb21wbGV0ZV9saXN0KTsKIAllaS0+Y3VyX2Fpb19kaW8gPSBOVUxMOworCWVpLT5pX3N5bmNfdGlkID0gMDsKKwllaS0+aV9kYXRhc3luY190aWQgPSAwOwogCiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwogfQpAQCAtODk5LDYgKzkwMywxMiBAQAogCWlmICh0ZXN0X29wdChzYiwgTk9fQVVUT19EQV9BTExPQykpCiAJCXNlcV9wdXRzKHNlcSwgIixub2F1dG9fZGFfYWxsb2MiKTsKIAorCWlmICh0ZXN0X29wdChzYiwgRElTQ0FSRCkpCisJCXNlcV9wdXRzKHNlcSwgIixkaXNjYXJkIik7CisKKwlpZiAodGVzdF9vcHQoc2IsIE5PTE9BRCkpCisJCXNlcV9wdXRzKHNlcSwgIixub3JlY292ZXJ5Iik7CisKIAlleHQ0X3Nob3dfcXVvdGFfb3B0aW9ucyhzZXEsIHNiKTsKIAogCXJldHVybiAwOwpAQCAtMTA3OSw3ICsxMDg5LDggQEAKIAlPcHRfdXNycXVvdGEsIE9wdF9ncnBxdW90YSwgT3B0X2lfdmVyc2lvbiwKIAlPcHRfc3RyaXBlLCBPcHRfZGVsYWxsb2MsIE9wdF9ub2RlbGFsbG9jLAogCU9wdF9ibG9ja192YWxpZGl0eSwgT3B0X25vYmxvY2tfdmFsaWRpdHksCi0JT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzLCBPcHRfam91cm5hbF9pb3ByaW8KKwlPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3MsIE9wdF9qb3VybmFsX2lvcHJpbywKKwlPcHRfZGlzY2FyZCwgT3B0X25vZGlzY2FyZCwKIH07CiAKIHN0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKQEAgLTExMDQsNiArMTExNSw3IEBACiAJe09wdF9hY2wsICJhY2wifSwKIAl7T3B0X25vYWNsLCAibm9hY2wifSwKIAl7T3B0X25vbG9hZCwgIm5vbG9hZCJ9LAorCXtPcHRfbm9sb2FkLCAibm9yZWNvdmVyeSJ9LAogCXtPcHRfbm9iaCwgIm5vYmgifSwKIAl7T3B0X2JoLCAiYmgifSwKIAl7T3B0X2NvbW1pdCwgImNvbW1pdD0ldSJ9LApAQCAtMTE0NCw2ICsxMTU2LDggQEAKIAl7T3B0X2F1dG9fZGFfYWxsb2MsICJhdXRvX2RhX2FsbG9jPSV1In0sCiAJe09wdF9hdXRvX2RhX2FsbG9jLCAiYXV0b19kYV9hbGxvYyJ9LAogCXtPcHRfbm9hdXRvX2RhX2FsbG9jLCAibm9hdXRvX2RhX2FsbG9jIn0sCisJe09wdF9kaXNjYXJkLCAiZGlzY2FyZCJ9LAorCXtPcHRfbm9kaXNjYXJkLCAibm9kaXNjYXJkIn0sCiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIApAQCAtMTU2NSw2ICsxNTc5LDEyIEBACiAJCQllbHNlCiAJCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LE5PX0FVVE9fREFfQUxMT0MpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Rpc2NhcmQ6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERJU0NBUkQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZGlzY2FyZDoKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBESVNDQVJEKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAogCQkJICAgICAgICJVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCkBAIC0xNjczLDE0ICsxNjkzLDE0IEBACiAJc2l6ZV90IHNpemU7CiAJaW50IGk7CiAKLQlpZiAoIXNiaS0+c19lcy0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CisJc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXggPSBzYmktPnNfZXMtPnNfbG9nX2dyb3Vwc19wZXJfZmxleDsKKwlncm91cHNfcGVyX2ZsZXggPSAxIDw8IHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4OworCisJaWYgKGdyb3Vwc19wZXJfZmxleCA8IDIpIHsKIAkJc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXggPSAwOwogCQlyZXR1cm4gMTsKIAl9CiAKLQlzYmktPnNfbG9nX2dyb3Vwc19wZXJfZmxleCA9IHNiaS0+c19lcy0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4OwotCWdyb3Vwc19wZXJfZmxleCA9IDEgPDwgc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXg7Ci0KIAkvKiBXZSBhbGxvY2F0ZSBib3RoIGV4aXN0aW5nIGFuZCBwb3RlbnRpYWxseSBhZGRlZCBncm91cHMgKi8KIAlmbGV4X2dyb3VwX2NvdW50ID0gKChzYmktPnNfZ3JvdXBzX2NvdW50ICsgZ3JvdXBzX3Blcl9mbGV4IC0gMSkgKwogCQkJKChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykgKyAxKSA8PApAQCAtMjcyMSwyNiArMjc0MSw2IEBACiAJICAgIEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkgewogCQlpZiAoZXh0NF9sb2FkX2pvdXJuYWwoc2IsIGVzLCBqb3VybmFsX2Rldm51bSkpCiAJCQlnb3RvIGZhaWxlZF9tb3VudDM7Ci0JCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgotCQkgICAgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9mYWlsZWRfY29tbWl0KSB7Ci0JCQlleHQ0X21zZyhzYiwgS0VSTl9DUklULCAiZXJyb3I6ICIKLQkJCSAgICAgICAiZXh0NF9maWxsX3N1cGVyOiBKb3VybmFsIHRyYW5zYWN0aW9uICIKLQkJCSAgICAgICAiJXUgaXMgY29ycnVwdCIsCi0JCQkgICAgICAgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9mYWlsZWRfY29tbWl0KTsKLQkJCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1JPKSkgewotCQkJCWV4dDRfbXNnKHNiLCBLRVJOX0NSSVQsCi0JCQkJICAgICAgICJNb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seSIpOwotCQkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKLQkJCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOwotCQkJCWVzLT5zX3N0YXRlIHw9IGNwdV90b19sZTE2KEVYVDRfRVJST1JfRlMpOwotCQkJfQotCQkJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfUEFOSUMpKSB7Ci0JCQkJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9FUlJPUl9GUzsKLQkJCQllcy0+c19zdGF0ZSB8PSBjcHVfdG9fbGUxNihFWFQ0X0VSUk9SX0ZTKTsKLQkJCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgMSk7Ci0JCQkJZ290byBmYWlsZWRfbW91bnQ0OwotCQkJfQotCQl9CiAJfSBlbHNlIGlmICh0ZXN0X29wdChzYiwgTk9MT0FEKSAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgogCSAgICAgIEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSkgewogCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJyZXF1aXJlZCBqb3VybmFsIHJlY292ZXJ5ICIKQEAgLTM2NjgsMTMgKzM2NjgsMTEgQEAKIAlidWYtPmZfYmxvY2tzID0gZXh0NF9ibG9ja3NfY291bnQoZXMpIC0gc2JpLT5zX292ZXJoZWFkX2xhc3Q7CiAJYnVmLT5mX2JmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKSAtCiAJCSAgICAgICBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKTsKLQlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChlcywgYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gZXh0NF9yX2Jsb2Nrc19jb3VudChlcyk7CiAJaWYgKGJ1Zi0+Zl9iZnJlZSA8IGV4dDRfcl9ibG9ja3NfY291bnQoZXMpKQogCQlidWYtPmZfYmF2YWlsID0gMDsKIAlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpOwogCWJ1Zi0+Zl9mZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7Ci0JZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfZmZyZWUpOwogCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUNF9OQU1FX0xFTjsKIAlmc2lkID0gbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCkgXgogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwpAQCAtMzk2Niw2ICszOTY0LDU4IEBACiAJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0NF9maWxsX3N1cGVyLG1udCk7CiB9CiAKKyNpZiAhZGVmaW5lZChDT05USUdfRVhUMl9GUykgJiYgIWRlZmluZWQoQ09ORklHX0VYVDJfRlNfTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19FWFQ0X1VTRV9GT1JfRVhUMjMpCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0Ml9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZXh0MiIsCisJLmdldF9zYgkJPSBleHQ0X2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX2FzX2V4dDIodm9pZCkKK3sKKwlpbnQgZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0Ml9mc190eXBlKTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiRVhUNC1mczogVW5hYmxlIHRvIHJlZ2lzdGVyIGFzIGV4dDIgKCVkKVxuIiwgZXJyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfYXNfZXh0Mih2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0Ml9mc190eXBlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfYXNfZXh0Mih2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bnJlZ2lzdGVyX2FzX2V4dDIodm9pZCkgeyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTlRJR19FWFQzX0ZTKSAmJiAhZGVmaW5lZChDT05GSUdfRVhUM19GU19NT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0VYVDRfVVNFX0ZPUl9FWFQyMykKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBleHQzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJleHQzIiwKKwkuZ2V0X3NiCQk9IGV4dDRfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfYXNfZXh0Myh2b2lkKQoreworCWludCBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQzX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJFWFQ0LWZzOiBVbmFibGUgdG8gcmVnaXN0ZXIgYXMgZXh0MyAoJWQpXG4iLCBlcnIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9hc19leHQzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQzX2ZzX3R5cGUpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9hc19leHQzKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfYXNfZXh0Myh2b2lkKSB7IH0KKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0NF9mc190eXBlID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAiZXh0NCIsCkBAIC0zOTk1LDExICs0MDQ1LDE1IEBACiAJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQxOworCXJlZ2lzdGVyX2FzX2V4dDIoKTsKKwlyZWdpc3Rlcl9hc19leHQzKCk7CiAJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0NF9mc190eXBlKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAlyZXR1cm4gMDsKIG91dDoKKwl1bnJlZ2lzdGVyX2FzX2V4dDIoKTsKKwl1bnJlZ2lzdGVyX2FzX2V4dDMoKTsKIAlkZXN0cm95X2lub2RlY2FjaGUoKTsKIG91dDE6CiAJZXhpdF9leHQ0X3hhdHRyKCk7CkBAIC00MDE1LDYgKzQwNjksOCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9leHQ0X2ZzKHZvaWQpCiB7CisJdW5yZWdpc3Rlcl9hc19leHQyKCk7CisJdW5yZWdpc3Rlcl9hc19leHQzKCk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQ0X2ZzX3R5cGUpOwogCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOwogCWV4aXRfZXh0NF94YXR0cigpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0ci5jIGIvZnMvZXh0NC94YXR0ci5jCmluZGV4IGZlZDViMDEuLjkxMGJmOWEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQveGF0dHIuYworKysgYi9mcy9leHQ0L3hhdHRyLmMKQEAgLTQ4Miw5ICs0ODIsMTAgQEAKIAkJZWFfYmRlYnVnKGJoLCAicmVmY291bnQgbm93PTA7IGZyZWVpbmciKTsKIAkJaWYgKGNlKQogCQkJbWJfY2FjaGVfZW50cnlfZnJlZShjZSk7Ci0JCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgtPmJfYmxvY2tuciwgMSwgMSk7CiAJCWdldF9iaChiaCk7Ci0JCWV4dDRfZm9yZ2V0KGhhbmRsZSwgMSwgaW5vZGUsIGJoLCBiaC0+Yl9ibG9ja25yKTsKKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgMCwgMSwKKwkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSB8CisJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAl9IGVsc2UgewogCQlsZTMyX2FkZF9jcHUoJkJIRFIoYmgpLT5oX3JlZmNvdW50LCAtMSk7CiAJCWVycm9yID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwpAQCAtODMyLDcgKzgzMyw4IEBACiAJCQluZXdfYmggPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKIAkJCWlmICghbmV3X2JoKSB7CiBnZXRibGtfZmFpbGVkOgotCQkJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmxvY2ssIDEsIDEpOworCQkJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgMCwgYmxvY2ssIDEsCisJCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSk7CiAJCQkJZXJyb3IgPSAtRUlPOwogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KQEAgLTk4OCw2ICs5OTAsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xlYW51cDsKIAorCWVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpcy5pbG9jLmJoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwogCWlmIChFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9ORVcpIHsKIAkJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKCZpcy5pbG9jKTsKIAkJbWVtc2V0KHJhd19pbm9kZSwgMCwgRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZSk7CkBAIC0xMDEzLDkgKzEwMTksNiBAQAogCQlpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpCiAJCQlnb3RvIGNsZWFudXA7CiAJfQotCWVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpcy5pbG9jLmJoKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gY2xlYW51cDsKIAlpZiAoIXZhbHVlKSB7CiAJCWlmICghaXMucy5ub3RfZm91bmQpCiAJCQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCAmaXMpOwpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggZDRjZmQ2ZC4uODg5NmMxZCAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC02MzYsNiArNjM2LDEwIEBACiAJCUpCVUZGRVJfVFJBQ0UoamgsICJwaDM6IHdyaXRlIG1ldGFkYXRhIik7CiAJCWZsYWdzID0gamJkMl9qb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcihjb21taXRfdHJhbnNhY3Rpb24sCiAJCQkJCQkgICAgICBqaCwgJm5ld19qaCwgYmxvY2tucik7CisJCWlmIChmbGFncyA8IDApIHsKKwkJCWpiZDJfam91cm5hbF9hYm9ydChqb3VybmFsLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQogCQlzZXRfYml0KEJIX0pXcml0ZSwgJmpoMmJoKG5ld19qaCktPmJfc3RhdGUpOwogCQl3YnVmW2J1ZnMrK10gPSBqaDJiaChuZXdfamgpOwogCmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4IGZlZDg1Mzg4Li5iN2NhM2E5IDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtNzgsNiArNzgsNyBAQAogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfYWNrX2Vycik7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9jbGVhcl9lcnIpOwogRVhQT1JUX1NZTUJPTChqYmQyX2xvZ193YWl0X2NvbW1pdCk7CitFWFBPUlRfU1lNQk9MKGpiZDJfbG9nX3N0YXJ0X2NvbW1pdCk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9zdGFydF9jb21taXQpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZCk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF93aXBlKTsKQEAgLTM1OCw2ICszNTksMTAgQEAKIAogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoX2luKTsKIAkJdG1wID0gamJkMl9hbGxvYyhiaF9pbi0+Yl9zaXplLCBHRlBfTk9GUyk7CisJCWlmICghdG1wKSB7CisJCQlqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChuZXdfamgpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAkJamJkX2xvY2tfYmhfc3RhdGUoYmhfaW4pOwogCQlpZiAoamhfaW4tPmJfZnJvemVuX2RhdGEpIHsKIAkJCWpiZDJfZnJlZSh0bXAsIGJoX2luLT5iX3NpemUpOwpAQCAtMTI0OCw2ICsxMjUzLDEzIEBACiAJaWYgKGpiZDJfam91cm5hbF9yZWNvdmVyKGpvdXJuYWwpKQogCQlnb3RvIHJlY292ZXJ5X2Vycm9yOwogCisJaWYgKGpvdXJuYWwtPmpfZmFpbGVkX2NvbW1pdCkgeworCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGpvdXJuYWwgdHJhbnNhY3Rpb24gJXUgb24gJXMgIgorCQkgICAgICAgImlzIGNvcnJ1cHQuXG4iLCBqb3VybmFsLT5qX2ZhaWxlZF9jb21taXQsCisJCSAgICAgICBqb3VybmFsLT5qX2Rldm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKIAkvKiBPSywgd2UndmUgZmluaXNoZWQgd2l0aCB0aGUgZHluYW1pYyBqb3VybmFsIGJpdHM6CiAJICogcmVpbml0aWFsaXNlIHRoZSBkeW5hbWljIGNvbnRlbnRzIG9mIHRoZSBzdXBlcmJsb2NrIGluIG1lbW9yeQogCSAqIGFuZCByZXNldCB0aGVtIG9uIGRpc2suICovCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wci5jIGIvZnMvamZmczIvY29tcHIuYwppbmRleCBmMjVlNzBjLi5mMDI5NDQxIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wci5jCisrKyBiL2ZzL2pmZnMyL2NvbXByLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQlzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIkpGRlMyOiB1bmtub3cgY29tcHJlc3Npb24gbW9kZS5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkpGRlMyOiB1bmtub3duIGNvbXByZXNzaW9uIG1vZGUuXG4iKTsKIAl9CiAgb3V0OgogCWlmIChyZXQgPT0gSkZGUzJfQ09NUFJfTk9ORSkgewpkaWZmIC0tZ2l0IGEvZnMvamZmczIvcmVhZGlub2RlLmMgYi9mcy9qZmZzMi9yZWFkaW5vZGUuYwppbmRleCAxYTgwMzAxLi4zNzg5OTFjIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9yZWFkaW5vZGUuYworKysgYi9mcy9qZmZzMi9yZWFkaW5vZGUuYwpAQCAtOTMxLDcgKzkzMSw3IEBACiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGpmZnMyX2dldF9pbm9kZV9ub2RlcygpLgogICogVGhlIGZ1bmN0aW9uIGRldGVjdHMgd2hldGhlciBtb3JlIGRhdGEgc2hvdWxkIGJlIHJlYWQgYW5kIHJlYWRzIGl0IGlmIHllcy4KICAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2NlczsKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzczsKICAqIAkgICAgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50IHJlYWRfbW9yZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmLApkaWZmIC0tZ2l0IGEvZnMvamZmczIveGF0dHIuYyBiL2ZzL2pmZnMyL3hhdHRyLmMKaW5kZXggMDgyZTg0NC4uNGIxMDc4OCAxMDA2NDQKLS0tIGEvZnMvamZmczIveGF0dHIuYworKysgYi9mcy9qZmZzMi94YXR0ci5jCkBAIC0zMSw3ICszMSw3IEBACiAgKiAgIGlzIHVzZWQgdG8gcmVsZWFzZSB4YXR0ciBuYW1lL3ZhbHVlIHBhaXIgYW5kIGRldGFjaCBmcm9tIGMtPnhhdHRyaW5kZXguCiAgKiByZWNsYWltX3hhdHRyX2RhdHVtKGMpCiAgKiAgIGlzIHVzZWQgdG8gcmVjbGFpbSB4YXR0ciBuYW1lL3ZhbHVlIHBhaXJzIG9uIHRoZSB4YXR0ciBuYW1lL3ZhbHVlIHBhaXIgY2FjaGUgd2hlbgotICogICBtZW1vcnkgdXNhZ2UgYnkgY2FjaGUgaXMgb3ZlciBjLT54ZGF0dW1fbWVtX3RocmVzaG9sZC4gQ3VycmVudHJ5LCB0aGlzIHRocmVzaG9sZCAKKyAqICAgbWVtb3J5IHVzYWdlIGJ5IGNhY2hlIGlzIG92ZXIgYy0+eGRhdHVtX21lbV90aHJlc2hvbGQuIEN1cnJlbnRseSwgdGhpcyB0aHJlc2hvbGQgCiAgKiAgIGlzIGhhcmQgY29kZWQgYXMgMzJLaUIuCiAgKiBkb192ZXJpZnlfeGF0dHJfZGF0dW0oYywgeGQpCiAgKiAgIGlzIHVzZWQgdG8gbG9hZCB0aGUgeGRhdHVtIGluZm9ybWF0aW9ucyB3aXRob3V0IG5hbWUvdmFsdWUgcGFpciBmcm9tIHRoZSBtZWRpdW0uCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2RtYXAuYyBiL2ZzL2pmcy9qZnNfZG1hcC5jCmluZGV4IDJiYzdkOGEuLmQ5YjAzMWMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfZG1hcC5jCisrKyBiL2ZzL2pmcy9qZnNfZG1hcC5jCkBAIC03NTUsNyArNzU1LDcgQEAKIAkgKiBhbGxvY2F0aW9uIGdyb3VwLgogCSAqLwogCWlmICgoYmxrbm8gJiAoYm1wLT5kYl9hZ3NpemUgLSAxKSkgPT0gMCkKLQkJLyogY2hlY2sgaWYgdGhlIEFHIGlzIGN1cnJlbmx5IGJlaW5nIHdyaXR0ZW4gdG8uCisJCS8qIGNoZWNrIGlmIHRoZSBBRyBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiB0by4KIAkJICogaWYgc28sIGNhbGwgZGJOZXh0QUcoKSB0byBmaW5kIGEgbm9uLWJ1c3kKIAkJICogQUcgd2l0aCBzdWZmaWNpZW50IGZyZWUgc3BhY2UuCiAJCSAqLwpAQCAtMzMzNyw3ICszMzM3LDcgQEAKIAlmb3IgKGkgPSAwLCBuID0gMDsgaSA8IGFnbm87IG4rKykgewogCQlibXAtPmRiX2FnZnJlZVtuXSA9IDA7CS8qIGluaXQgY29sbGVjdGlvbiBwb2ludCAqLwogCi0JCS8qIGNvYWxlc2NlIGNvdGlndW91cyBrIEFHczsgKi8KKwkJLyogY29hbGVzY2UgY29udGlndW91cyBrIEFHczsgKi8KIAkJZm9yIChqID0gMDsgaiA8IGsgJiYgaSA8IGFnbm87IGorKywgaSsrKSB7CiAJCQkvKiBtZXJnZSBBR2kgdG8gQUduICovCiAJCQlibXAtPmRiX2FnZnJlZVtuXSArPSBibXAtPmRiX2FnZnJlZVtpXTsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lvY3RsLmMgYi9mcy9uY3Bmcy9pb2N0bC5jCmluZGV4IDBkNThjYWYuLmVjOGY0NWYgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2lvY3RsLmMKKysrIGIvZnMvbmNwZnMvaW9jdGwuYwpAQCAtODM1LDcgKzgzNSw3IEBACiAJY2FzZSBOQ1BfSU9DX1NFVFJPT1Q6CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6Ci0JCS8qIHVua293biBJT0NUTCBjb21tYW5kLCBhc3N1bWUgd3JpdGUgKi8KKwkJLyogdW5rbm93biBJT0NUTCBjb21tYW5kLCBhc3N1bWUgd3JpdGUgKi8KIAkJcmV0dXJuIDE7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYwppbmRleCAxZDFkMWEyLi41ZWY1ZjM2IDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYworKysgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYwpAQCAtNzQxLDEwICs3NDEsNiBAQAogCiAJLyogY3JlYXRlL3VwZGF0ZSBhbiBpbm9kZSBtYXJrICovCiAJcmV0ID0gaW5vdGlmeV91cGRhdGVfd2F0Y2goZ3JvdXAsIGlub2RlLCBtYXNrKTsKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJZ290byBwYXRoX3B1dF9hbmRfb3V0OwotCi1wYXRoX3B1dF9hbmRfb3V0OgogCXBhdGhfcHV0KCZwYXRoKTsKIGZwdXRfYW5kX291dDoKIAlmcHV0X2xpZ2h0KGZpbHAsIGZwdXRfbmVlZGVkKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvY29tcHJlc3MuYyBiL2ZzL250ZnMvY29tcHJlc3MuYwppbmRleCA5NjY5NTQxLi4wOGY3NTMwIDEwMDY0NAotLS0gYS9mcy9udGZzL2NvbXByZXNzLmMKKysrIGIvZnMvbnRmcy9jb21wcmVzcy5jCkBAIC05MjcsNyArOTI3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAludGZzX2RlYnVnKCJGYWlsZWQuIFJldHVybmluZyBlcnJvciBjb2RlICVzLiIsIGVyciA9PSAtRU9WRVJGTE9XID8KLQkJCSJFT1ZFUkZMT1ciIDogKCFlcnIgPyAiRUlPIiA6ICJ1bmtvd24gZXJyb3IiKSk7CisJCQkiRU9WRVJGTE9XIiA6ICghZXJyID8gIkVJTyIgOiAidW5rbm93biBlcnJvciIpKTsKIAlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IC1FSU87CiAKIHJlYWRfZXJyOgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9maWxlLmMgYi9mcy9udGZzL2ZpbGUuYwppbmRleCA2NjNjMGUzLi40MzE3OWRkIDEwMDY0NAotLS0gYS9mcy9udGZzL2ZpbGUuYworKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtMzk5LDcgKzM5OSw3IEBACiAgKiBAY2FjaGVkX3BhZ2U6IGFsbG9jYXRlZCBidXQgYXMgeWV0IHVudXNlZCBwYWdlCiAgKiBAbHJ1X3B2ZWM6CWxydS1idWZmZXJpbmcgcGFnZXZlYyBvZiBjYWxsZXIKICAqCi0gKiBPYnRhaW4gQG5yX3BhZ2VzIGxvY2tlZCBwYWdlIGNhY2hlIHBhZ2VzIGZyb20gdGhlIG1hcHBpbmcgQG1hcGluZyBhbmQKKyAqIE9idGFpbiBAbnJfcGFnZXMgbG9ja2VkIHBhZ2UgY2FjaGUgcGFnZXMgZnJvbSB0aGUgbWFwcGluZyBAbWFwcGluZyBhbmQKICAqIHN0YXJ0aW5nIGF0IGluZGV4IEBpbmRleC4KICAqCiAgKiBJZiBhIHBhZ2UgaXMgbmV3bHkgY3JlYXRlZCwgaW5jcmVtZW50IGl0cyByZWZjb3VudCBhbmQgYWRkIGl0IHRvIHRoZQpAQCAtMTI4MSw3ICsxMjgxLDcgQEAKIAogLyoKICAqIENvcHkgYXMgbXVjaCBhcyB3ZSBjYW4gaW50byB0aGUgcGFnZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoCi0gKiB3ZXJlIHN1Y2Vzc2Z1bGx5IGNvcGllZC4gIElmIGEgZmF1bHQgaXMgZW5jb3VudGVyZWQgdGhlbiBjbGVhciB0aGUgcGFnZXMKKyAqIHdlcmUgc3VjY2Vzc2Z1bGx5IGNvcGllZC4gIElmIGEgZmF1bHQgaXMgZW5jb3VudGVyZWQgdGhlbiBjbGVhciB0aGUgcGFnZXMKICAqIG91dCB0byAob2ZzICsgYnl0ZXMpIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3aGljaCB3ZXJlIGNvcGllZC4KICAqLwogc3RhdGljIGlubGluZSBzaXplX3QgbnRmc19jb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcGFnZSAqKnBhZ2VzLApkaWZmIC0tZ2l0IGEvZnMvbnRmcy9sb2dmaWxlLmMgYi9mcy9udGZzL2xvZ2ZpbGUuYwppbmRleCA4OWIwMjk4Li40ZGFkY2RmIDEwMDY0NAotLS0gYS9mcy9udGZzL2xvZ2ZpbGUuYworKysgYi9mcy9udGZzL2xvZ2ZpbGUuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAgKiBjb3B5IG9mIHRoZSBjb21wbGV0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0ZWQgcGFnZS4gIE9uIGZhaWx1cmUsCiAgKiAqQHdycCBpcyB1bmRlZmluZWQuCiAgKgotICogU2ltaWxsYXJseSwgaWYgQGxzbiBpcyBub3QgTlVMTCwgb24gc3VjY2VzICpAbHNuIHdpbGwgYmUgc2V0IHRvIHRoZSBjdXJyZW50CisgKiBTaW1pbGxhcmx5LCBpZiBAbHNuIGlzIG5vdCBOVUxMLCBvbiBzdWNjZXNzICpAbHNuIHdpbGwgYmUgc2V0IHRvIHRoZSBjdXJyZW50CiAgKiBsb2dmaWxlIGxzbiBhY2NvcmRpbmcgdG8gdGhpcyByZXN0YXJ0IHBhZ2UuICBPbiBmYWlsdXJlLCAqQGxzbiBpcyB1bmRlZmluZWQuCiAgKgogICogVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDM4YTQyZjUuLjdjNzE5OGEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtMjM5OCw3ICsyMzk4LDcgQEAKICAqCiAgKiBUaGUgYXJyYXkgaXMgYXNzdW1lZCB0byBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbiBlbnRpcmUgcGF0aCAodHJlZSBkZXB0aCkuCiAgKgotICogVXBvbiBzdWNjZXNmdWwgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbjoKKyAqIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uOgogICoKICAqIC0gVGhlICdyaWdodF9wYXRoJyBhcnJheSB3aWxsIGNvbnRhaW4gYSBwYXRoIHRvIHRoZSBsZWFmIGJsb2NrCiAgKiAgIHdob3NlIHJhbmdlIGNvbnRhaW5zIGVfY3Bvcy4KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Jsb2NrY2hlY2suYyBiL2ZzL29jZnMyL2Jsb2NrY2hlY2suYwppbmRleCBhMTE2M2I4Li5iNzQyOGM1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9ibG9ja2NoZWNrLmMKKysrIGIvZnMvb2NmczIvYmxvY2tjaGVjay5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgKiBDYWxjdWxhdGUgdGhlIGJpdCBvZmZzZXQgaW4gdGhlIGhhbW1pbmcgY29kZSBidWZmZXIgYmFzZWQgb24gdGhlIGJpdCdzCiAgKiBvZmZzZXQgaW4gdGhlIGRhdGEgYnVmZmVyLiAgU2luY2UgdGhlIGhhbW1pbmcgY29kZSByZXNlcnZlcyBhbGwKICAqIHBvd2VyLW9mLXR3byBiaXRzIGZvciBwYXJpdHksIHRoZSBkYXRhIGJpdCBudW1iZXIgYW5kIHRoZSBjb2RlIGJpdAotICogbnVtYmVyIGFyZSBvZmZlc3QgYnkgYWxsIHRoZSBwYXJpdHkgYml0cyBiZWZvcmVoYW5kLgorICogbnVtYmVyIGFyZSBvZmZzZXQgYnkgYWxsIHRoZSBwYXJpdHkgYml0cyBiZWZvcmVoYW5kLgogICoKICAqIFJlY2FsbCB0aGF0IGJpdCBudW1iZXJzIGluIGhhbW1pbmcgY29kZSBhcmUgMS1iYXNlZC4gIFRoaXMgZnVuY3Rpb24KICAqIHRha2VzIHRoZSAwLWJhc2VkIGRhdGEgYml0IGZyb20gdGhlIGNhbGxlci4KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwppbmRleCA4M2JjYWYyLi4wM2NjZjlhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCkBAIC0yNTg2LDcgKzI1ODYsNyBAQAogCSAqIGlzIGNvbXBsZXRlIGV2ZXJ5d2hlcmUuICBpZiB0aGUgdGFyZ2V0IGRpZXMgd2hpbGUgdGhpcyBpcwogCSAqIGdvaW5nIG9uLCBzb21lIG5vZGVzIGNvdWxkIHBvdGVudGlhbGx5IHNlZSB0aGUgdGFyZ2V0IGFzIHRoZQogCSAqIG1hc3Rlciwgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgbXkgcmVjb3ZlcnkgZmluZHMgdGhlIG1pZ3JhdGlvbgotCSAqIG1sZSBhbmQgc2V0cyB0aGUgbWFzdGVyIHRvIFVOS05PTldOLiAqLworCSAqIG1sZSBhbmQgc2V0cyB0aGUgbWFzdGVyIHRvIFVOS05PV04uICovCiAKIAogCS8qIHdhaXQgZm9yIG5ldyBub2RlIHRvIGFzc2VydCBtYXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuYyBiL2ZzL29jZnMyL2RsbWdsdWUuYwppbmRleCAwZDM4ZDY3Li5jNWU0YTQ5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmMKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCkBAIC0xODU1LDcgKzE4NTUsNyBAQAogCQkgKiBvdXRzdGFuZGluZyBsb2NrIHJlcXVlc3QsIHNvIGEgY2FuY2VsIGNvbnZlcnQgaXMKIAkJICogcmVxdWlyZWQuIFdlIGludGVudGlvbmFsbHkgb3ZlcndyaXRlICdyZXQnIC0gaWYgdGhlCiAJCSAqIGNhbmNlbCBmYWlscyBhbmQgdGhlIGxvY2sgd2FzIGdyYW50ZWQsIGl0J3MgZWFzaWVyCi0JCSAqIHRvIGp1c3QgYnViYmxlIHN1Y2VzcyBiYWNrIHVwIHRvIHRoZSB1c2VyLgorCQkgKiB0byBqdXN0IGJ1YmJsZSBzdWNjZXNzIGJhY2sgdXAgdG8gdGhlIHVzZXIuCiAJCSAqLwogCQlyZXQgPSBvY2ZzMl9mbG9ja19oYW5kbGVfc2lnbmFsKGxvY2tyZXMsIGxldmVsKTsKIAl9IGVsc2UgaWYgKCFyZXQgJiYgKGxldmVsID4gbG9ja3Jlcy0+bF9sZXZlbCkpIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCA1NGMxNmI2Li5iZjM0YzQ5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC02NTksNyArNjU5LDcgQEAKIAogCWRlZmF1bHQ6CiAJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCW1sb2coTUxfRVJST1IsICJVa25vd24gYWNjZXNzIHR5cGUhXG4iKTsKKwkJbWxvZyhNTF9FUlJPUiwgIlVua25vd24gYWNjZXNzIHR5cGUhXG4iKTsKIAl9CiAJaWYgKCFzdGF0dXMgJiYgb2NmczJfbWV0YV9lY2Mob3NiKSAmJiB0cmlnZ2VycykKIAkJamJkMl9qb3VybmFsX3NldF90cmlnZ2VycyhiaCwgJnRyaWdnZXJzLT5vdF90cmlnZ2Vycyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9yZWZjb3VudHRyZWUuYyBiL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCmluZGV4IDNhMGRmN2EuLjMwOTY3ZTMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCisrKyBiL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCkBAIC0yNDMxLDcgKzI0MzEsNyBAQAogICogd2UgZ29ubmEgdG91Y2ggYW5kIHdoZXRoZXIgd2UgbmVlZCB0byBjcmVhdGUgbmV3IGJsb2Nrcy4KICAqCiAgKiBOb3JtYWxseSB0aGUgcmVmY291bnQgYmxvY2tzIHN0b3JlIHRoZXNlIHJlZmNvdW50IHNob3VsZCBiZQotICogY29udGluZ3VvdXMgYWxzbywgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBudW1iZXIgZWFzaWx5LgorICogY29udGlndW91cyBhbHNvLCBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIG51bWJlciBlYXNpbHkuCiAgKiBBcyBmb3IgbWV0YV9hYywgd2Ugd2lsbCBhdCBtb3N0IGFkZCBzcGxpdCAyIHJlZmNvdW50IHJlY29yZCBhbmQKICAqIDIgbW9yZSByZWZjb3VudCBibG9jaywgc28ganVzdCBjaGVjayBpdCBpbiBhIHJvdWdoIHdheS4KICAqCmRpZmYgLS1naXQgYS9mcy9vbWZzL2JpdG1hcC5jIGIvZnMvb21mcy9iaXRtYXAuYwppbmRleCBlMWMwZWMwLi4wODIyMzQ1IDEwMDY0NAotLS0gYS9mcy9vbWZzL2JpdG1hcC5jCisrKyBiL2ZzL29tZnMvYml0bWFwLmMKQEAgLTg1LDcgKzg1LDcgQEAKIH0KIAogLyoKLSAqIFRyaWVzIHRvIGFsbG9jYXRlIGV4YWN0bHkgb25lIGJsb2NrLiAgUmV0dXJucyB0cnVlIGlmIHN1Y2Vzc2Z1bC4KKyAqIFRyaWVzIHRvIGFsbG9jYXRlIGV4YWN0bHkgb25lIGJsb2NrLiAgUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCiAgKi8KIGludCBvbWZzX2FsbG9jYXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU2NCBibG9jaykKIHsKZGlmZiAtLWdpdCBhL2ZzL3FueDQvYml0bWFwLmMgYi9mcy9xbng0L2JpdG1hcC5jCmluZGV4IDBhZmJhMDYuLjMyZjVkMTMgMTAwNjQ0Ci0tLSBhL2ZzL3FueDQvYml0bWFwLmMKKysrIGIvZnMvcW54NC9iaXRtYXAuYwpAQCAtNjcsNyArNjcsNyBAQAogCiAJd2hpbGUgKHRvdGFsIDwgc2l6ZSkgewogCQlpZiAoKGJoID0gc2JfYnJlYWQoc2IsIHN0YXJ0ICsgb2Zmc2V0KSkgPT0gTlVMTCkgewotCQkJcHJpbnRrKCJxbng0OiBJL08gZXJyb3IgaW4gY291bnRpbmcgZnJlZSBibG9ja3NcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJxbng0OiBJL08gZXJyb3IgaW4gY291bnRpbmcgZnJlZSBibG9ja3NcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJY291bnRfYml0cyhiaC0+Yl9kYXRhLCBzaXplIC0gdG90YWwsICZ0b3RhbF9mcmVlKTsKZGlmZiAtLWdpdCBhL2ZzL3FueDQvZGlyLmMgYi9mcy9xbng0L2Rpci5jCmluZGV4IDg2Y2MzOWMuLjZmMzBjM2QgMTAwNjQ0Ci0tLSBhL2ZzL3FueDQvZGlyLmMKKysrIGIvZnMvcW54NC9kaXIuYwpAQCAtMjYsOCArMjYsOCBAQAogCWludCBpeCwgaW5vOwogCWludCBzaXplOwogCi0JUU5YNERFQlVHKCgicW54NF9yZWFkZGlyOmlfc2l6ZSA9ICVsZFxuIiwgKGxvbmcpIGlub2RlLT5pX3NpemUpKTsKLQlRTlg0REVCVUcoKCJmaWxwLT5mX3BvcyAgICAgICAgID0gJWxkXG4iLCAobG9uZykgZmlscC0+Zl9wb3MpKTsKKwlRTlg0REVCVUcoKEtFUk5fSU5GTyAicW54NF9yZWFkZGlyOmlfc2l6ZSA9ICVsZFxuIiwgKGxvbmcpIGlub2RlLT5pX3NpemUpKTsKKwlRTlg0REVCVUcoKEtFUk5fSU5GTyAiZmlscC0+Zl9wb3MgICAgICAgICA9ICVsZFxuIiwgKGxvbmcpIGZpbHAtPmZfcG9zKSk7CiAKIAlsb2NrX2tlcm5lbCgpOwogCkBAIC01MCw3ICs1MCw3IEBACiAJCQkJCXNpemUgPSBRTlg0X05BTUVfTUFYOwogCiAJCQkJaWYgKCAoIGRlLT5kaV9zdGF0dXMgJiAoUU5YNF9GSUxFX1VTRUR8UU5YNF9GSUxFX0xJTkspICkgIT0gMCApIHsKLQkJCQkJUU5YNERFQlVHKCgicW54NF9yZWFkZGlyOiUuKnNcbiIsIHNpemUsIGRlLT5kaV9mbmFtZSkpOworCQkJCQlRTlg0REVCVUcoKEtFUk5fSU5GTyAicW54NF9yZWFkZGlyOiUuKnNcbiIsIHNpemUsIGRlLT5kaV9mbmFtZSkpOwogCQkJCQlpZiAoICggZGUtPmRpX3N0YXR1cyAmIFFOWDRfRklMRV9MSU5LICkgPT0gMCApCiAJCQkJCQlpbm8gPSBibGtudW0gKiBRTlg0X0lOT0RFU19QRVJfQkxPQ0sgKyBpeCAtIDE7CiAJCQkJCWVsc2UgewpkaWZmIC0tZ2l0IGEvZnMvcW54NC9pbm9kZS5jIGIvZnMvcW54NC9pbm9kZS5jCmluZGV4IGQyY2QxNzkuLjQ0OWY1YTYgMTAwNjQ0Ci0tLSBhL2ZzL3FueDQvaW5vZGUuYworKysgYi9mcy9xbng0L2lub2RlLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcGh5czsKIAotCVFOWDRERUJVRygoInFueDQ6IHFueDRfZ2V0X2Jsb2NrIGlub2RlPVslbGRdIGlibG9jaz1bJWxkXVxuIixpbm9kZS0+aV9pbm8saWJsb2NrKSk7CisJUU5YNERFQlVHKChLRVJOX0lORk8gInFueDQ6IHFueDRfZ2V0X2Jsb2NrIGlub2RlPVslbGRdIGlibG9jaz1bJWxkXVxuIixpbm9kZS0+aV9pbm8saWJsb2NrKSk7CiAKIAlwaHlzID0gcW54NF9ibG9ja19tYXAoIGlub2RlLCBpYmxvY2sgKTsKIAlpZiAoIHBoeXMgKSB7CkBAIC0xNDIsMTIgKzE0MiwxMiBAQAogCQkJCS8vIHJlYWQgbmV4dCB4dG50IGJsb2NrLgogCQkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGlfeGJsayAtIDEpOwogCQkJCWlmICggIWJoICkgewotCQkJCQlRTlg0REVCVUcoKCJxbng0OiBJL08gZXJyb3IgcmVhZGluZyB4dG50IGJsb2NrIFslbGRdKVxuIiwgaV94YmxrIC0gMSkpOworCQkJCQlRTlg0REVCVUcoKEtFUk5fRVJSICJxbng0OiBJL08gZXJyb3IgcmVhZGluZyB4dG50IGJsb2NrIFslbGRdKVxuIiwgaV94YmxrIC0gMSkpOwogCQkJCQlyZXR1cm4gLUVJTzsKIAkJCQl9CiAJCQkJeGJsayA9IChzdHJ1Y3QgcW54NF94YmxrKiliaC0+Yl9kYXRhOwogCQkJCWlmICggbWVtY21wKCB4YmxrLT54YmxrX3NpZ25hdHVyZSwgIklhbVhibGsiLCA3ICkgKSB7Ci0JCQkJCVFOWDRERUJVRygoInFueDQ6IGJsb2NrIGF0ICVsZCBpcyBub3QgYSB2YWxpZCB4dG50XG4iLCBxbng0X2lub2RlLT5pX3hibGspKTsKKwkJCQkJUU5YNERFQlVHKChLRVJOX0VSUiAicW54NDogYmxvY2sgYXQgJWxkIGlzIG5vdCBhIHZhbGlkIHh0bnRcbiIsIHFueDRfaW5vZGUtPmlfeGJsaykpOwogCQkJCQlyZXR1cm4gLUVJTzsKIAkJCQl9CiAJCQl9CkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJCWJyZWxzZSggYmggKTsKIAl9CiAKLQlRTlg0REVCVUcoKCJxbng0OiBtYXBwaW5nIGJsb2NrICVsZCBvZiBpbm9kZSAlbGQgPSAlbGRcbiIsaWJsb2NrLGlub2RlLT5pX2lubyxibG9jaykpOworCVFOWDRERUJVRygoS0VSTl9JTkZPICJxbng0OiBtYXBwaW5nIGJsb2NrICVsZCBvZiBpbm9kZSAlbGQgPSAlbGRcbiIsaWJsb2NrLGlub2RlLT5pX2lubyxibG9jaykpOwogCXJldHVybiBibG9jazsKIH0KIApAQCAtMjA5LDcgKzIwOSw3IEBACiAJaWYgKCoocW54NF9zYihzYiktPnNiLT5Sb290RGlyLmRpX2ZuYW1lKSAhPSAnLycpIHsKIAkJcmV0dXJuICJubyBxbng0IGZpbGVzeXN0ZW0gKG5vIHJvb3QgZGlyKS4iOwogCX0gZWxzZSB7Ci0JCVFOWDRERUJVRygoIlFOWDQgZmlsZXN5c3RlbSBmb3VuZCBvbiBkZXYgJXMuXG4iLCBzYi0+c19pZCkpOworCQlRTlg0REVCVUcoKEtFUk5fTk9USUNFICJRTlg0IGZpbGVzeXN0ZW0gZm91bmQgb24gZGV2ICVzLlxuIiwgc2ItPnNfaWQpKTsKIAkJcmQgPSBsZTMyX3RvX2NwdShxbng0X3NiKHNiKS0+c2ItPlJvb3REaXIuZGlfZmlyc3RfeHRudC54dG50X2JsaykgLSAxOwogCQlybCA9IGxlMzJfdG9fY3B1KHFueDRfc2Ioc2IpLT5zYi0+Um9vdERpci5kaV9maXJzdF94dG50Lnh0bnRfc2l6ZSk7CiAJCWZvciAoaiA9IDA7IGogPCBybDsgaisrKSB7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCBRTlg0X0lOT0RFU19QRVJfQkxPQ0s7IGkrKykgewogCQkJCXJvb3RkaXIgPSAoc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKikgKGJoLT5iX2RhdGEgKyBpICogUU5YNF9ESVJfRU5UUllfU0laRSk7CiAJCQkJaWYgKHJvb3RkaXItPmRpX2ZuYW1lICE9IE5VTEwpIHsKLQkJCQkJUU5YNERFQlVHKCgiUm9vdGRpciBlbnRyeSBmb3VuZCA6IFslc11cbiIsIHJvb3RkaXItPmRpX2ZuYW1lKSk7CisJCQkJCVFOWDRERUJVRygoS0VSTl9JTkZPICJyb290ZGlyIGVudHJ5IGZvdW5kIDogWyVzXVxuIiwgcm9vdGRpci0+ZGlfZm5hbWUpKTsKIAkJCQkJaWYgKCFzdHJuY21wKHJvb3RkaXItPmRpX2ZuYW1lLCBRTlg0X0JNTkFNRSwgc2l6ZW9mIFFOWDRfQk1OQU1FKSkgewogCQkJCQkJZm91bmQgPSAxOwogCQkJCQkJcW54NF9zYihzYiktPkJpdE1hcCA9IGttYWxsb2MoIHNpemVvZiggc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKSwgR0ZQX0tFUk5FTCApOwpAQCAtMjY1LDEyICsyNjUsMTIgQEAKIAkgICBpZiB3ZSBkb24ndCBiZWxvbmcgaGVyZS4uLiAqLwogCWJoID0gc2JfYnJlYWQocywgMSk7CiAJaWYgKCFiaCkgewotCQlwcmludGsoInFueDQ6IHVuYWJsZSB0byByZWFkIHRoZSBzdXBlcmJsb2NrXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJxbng0OiB1bmFibGUgdG8gcmVhZCB0aGUgc3VwZXJibG9ja1xuIik7CiAJCWdvdG8gb3V0bm9iaDsKIAl9CiAJaWYgKCBsZTMyX3RvX2NwdXAoKF9fbGUzMiopIGJoLT5iX2RhdGEpICE9IFFOWDRfU1VQRVJfTUFHSUMgKSB7CiAJCWlmICghc2lsZW50KQotCQkJcHJpbnRrKCJxbng0OiB3cm9uZyBmc2lkIGluIHN1cGVyYmxvY2suXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAicW54NDogd3JvbmcgZnNpZCBpbiBzdXBlcmJsb2NrLlxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAlzLT5zX29wID0gJnFueDRfc29wczsKQEAgLTI4NCwxNCArMjg0LDE0IEBACiAJZXJybXNnID0gcW54NF9jaGVja3Jvb3Qocyk7CiAJaWYgKGVycm1zZyAhPSBOVUxMKSB7CiAgCQlpZiAoIXNpbGVudCkKLSAJCQlwcmludGsoInFueDQ6ICVzXG4iLCBlcnJtc2cpOworCQkJcHJpbnRrKEtFUk5fRVJSICJxbng0OiAlc1xuIiwgZXJybXNnKTsKIAkJZ290byBvdXQ7CiAJfQogCiAgCS8qIGRvZXMgcm9vdCBub3QgaGF2ZSBpbm9kZSBudW1iZXIgUU5YNF9ST09UX0lOTyA/PyAqLwogCXJvb3QgPSBxbng0X2lnZXQocywgUU5YNF9ST09UX0lOTyAqIFFOWDRfSU5PREVTX1BFUl9CTE9DSyk7CiAJaWYgKElTX0VSUihyb290KSkgewotIAkJcHJpbnRrKCJxbng0OiBnZXQgaW5vZGUgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJxbng0OiBnZXQgaW5vZGUgZmFpbGVkXG4iKTsKIAkJcmV0ID0gUFRSX0VSUihyb290KTsKICAJCWdvdG8gb3V0OwogIAl9CkBAIC0zNzQsNyArMzc0LDcgQEAKIAlxbng0X2lub2RlID0gcW54NF9yYXdfaW5vZGUoaW5vZGUpOwogCWlub2RlLT5pX21vZGUgPSAwOwogCi0JUU5YNERFQlVHKCgiUmVhZGluZyBpbm9kZSA6IFslZF1cbiIsIGlubykpOworCVFOWDRERUJVRygoS0VSTl9JTkZPICJyZWFkaW5nIGlub2RlIDogWyVkXVxuIiwgaW5vKSk7CiAJaWYgKCFpbm8pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJxbng0OiBiYWQgaW5vZGUgbnVtYmVyIG9uIGRldiAlczogJWx1IGlzICIKIAkJCQkib3V0IG9mIHJhbmdlXG4iLApAQCAtMzg1LDcgKzM4NSw3IEBACiAJYmxvY2sgPSBpbm8gLyBRTlg0X0lOT0RFU19QRVJfQkxPQ0s7CiAKIAlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBibG9jaykpKSB7Ci0JCXByaW50aygicW54NDogbWFqb3IgcHJvYmxlbTogdW5hYmxlIHRvIHJlYWQgaW5vZGUgZnJvbSBkZXYgIgorCQlwcmludGsoS0VSTl9FUlIgInFueDQ6IG1ham9yIHByb2JsZW06IHVuYWJsZSB0byByZWFkIGlub2RlIGZyb20gZGV2ICIKIAkJICAgICAgICIlc1xuIiwgc2ItPnNfaWQpOwogCQlpZ2V0X2ZhaWxlZChpbm9kZSk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU8pOwpAQCAtNDk5LDcgKzQ5OSw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JcHJpbnRrKCJRTlg0IGZpbGVzeXN0ZW0gMC4yLjMgcmVnaXN0ZXJlZC5cbiIpOworCXByaW50ayhLRVJOX0lORk8gIlFOWDQgZmlsZXN5c3RlbSAwLjIuMyByZWdpc3RlcmVkLlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3FueDQvbmFtZWkuYyBiL2ZzL3FueDQvbmFtZWkuYwppbmRleCBhZTFlN2VkLi41ODcwM2ViIDEwMDY0NAotLS0gYS9mcy9xbng0L25hbWVpLmMKKysrIGIvZnMvcW54NC9uYW1laS5jCkBAIC0zMCw3ICszMCw3IEBACiAJaW50IG5hbWVsZW4sIHRoaXNsZW47CiAKIAlpZiAoYmggPT0gTlVMTCkgewotCQlwcmludGsoInFueDQ6IG1hdGNoaW5nIHVuYXNzaWduZWQgYnVmZmVyICFcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJxbng0OiBtYXRjaGluZyB1bmFzc2lnbmVkIGJ1ZmZlciAhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCWRlID0gKHN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICopIChiaC0+Yl9kYXRhICsgKm9mZnNldCk7CkBAIC02Niw3ICs2Niw3IEBACiAKIAkqcmVzX2RpciA9IE5VTEw7CiAJaWYgKCFkaXItPmlfc2IpIHsKLQkJcHJpbnRrKCJxbng0OiBubyBzdXBlcmJsb2NrIG9uIGRpci5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJxbng0OiBubyBzdXBlcmJsb2NrIG9uIGRpci5cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJYmggPSBOVUxMOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJZm91bmRpbm9kZSA9IHFueDRfaWdldChkaXItPmlfc2IsIGlubyk7CiAJaWYgKElTX0VSUihmb3VuZGlub2RlKSkgewogCQl1bmxvY2tfa2VybmVsKCk7Ci0JCVFOWDRERUJVRygoInFueDQ6IGxvb2t1cC0+aWdldCAtPiBlcnJvciAlbGRcbiIsCisJCVFOWDRERUJVRygoS0VSTl9FUlIgInFueDQ6IGxvb2t1cC0+aWdldCAtPiBlcnJvciAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGZvdW5kaW5vZGUpKSk7CiAJCXJldHVybiBFUlJfQ0FTVChmb3VuZGlub2RlKTsKIAl9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9NYWtlZmlsZSBiL2ZzL3JlaXNlcmZzL01ha2VmaWxlCmluZGV4IDdjNWFiNjMuLjZhOWUzMGMgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL01ha2VmaWxlCisrKyBiL2ZzL3JlaXNlcmZzL01ha2VmaWxlCkBAIC03LDcgKzcsNyBAQAogcmVpc2VyZnMtb2JqcyA6PSBiaXRtYXAubyBkb19iYWxhbi5vIG5hbWVpLm8gaW5vZGUubyBmaWxlLm8gZGlyLm8gZml4X25vZGUubyBcCiAJCSBzdXBlci5vIHByaW50cy5vIG9iamVjdGlkLm8gbGJhbGFuY2UubyBpYmFsYW5jZS5vIHN0cmVlLm8gXAogCQkgaGFzaGVzLm8gdGFpbF9jb252ZXJzaW9uLm8gam91cm5hbC5vIHJlc2l6ZS5vIFwKLQkJIGl0ZW1fb3BzLm8gaW9jdGwubyBwcm9jZnMubyB4YXR0ci5vCisJCSBpdGVtX29wcy5vIGlvY3RsLm8gcHJvY2ZzLm8geGF0dHIubyBsb2NrLm8KIAogaWZlcSAoJChDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFIpLHkpCiByZWlzZXJmcy1vYmpzICs9IHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2JpdG1hcC5jIGIvZnMvcmVpc2VyZnMvYml0bWFwLmMKaW5kZXggZTcxNjE2MS4uNjg1NDk1NyAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvYml0bWFwLmMKKysrIGIvZnMvcmVpc2VyZnMvYml0bWFwLmMKQEAgLTEyNDksMTQgKzEyNDksMTggQEAKIAllbHNlIGlmIChiaXRtYXAgPT0gMCkKIAkJYmxvY2sgPSAoUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMTsKIAorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CiAJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwogCWlmIChiaCA9PSBOVUxMKQogCQlyZWlzZXJmc193YXJuaW5nKHNiLCAic2gtMjAyOTogJXM6IGJpdG1hcCBibG9jayAoIyV1KSAiCiAJCSAgICAgICAgICAgICAgICAgInJlYWRpbmcgZmFpbGVkIiwgX19mdW5jX18sIGJsb2NrKTsKIAllbHNlIHsKIAkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CiAJCQlQUk9DX0lORk9fSU5DKHNiLCBzY2FuX2JpdG1hcC53YWl0KTsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CiAJCQlfX3dhaXRfb25fYnVmZmVyKGJoKTsKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwogCQl9CiAJCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CiAJCUJVR19PTihhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpID09IDApOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZGlyLmMgYi9mcy9yZWlzZXJmcy9kaXIuYwppbmRleCA2ZDI2NjhmLi5jMDk0ZjU4IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9kaXIuYworKysgYi9mcy9yZWlzZXJmcy9kaXIuYwpAQCAtMjAsNyArMjAsNyBAQAogCS5yZWFkID0gZ2VuZXJpY19yZWFkX2RpciwKIAkucmVhZGRpciA9IHJlaXNlcmZzX3JlYWRkaXIsCiAJLmZzeW5jID0gcmVpc2VyZnNfZGlyX2ZzeW5jLAotCS5pb2N0bCA9IHJlaXNlcmZzX2lvY3RsLAorCS51bmxvY2tlZF9pb2N0bCA9IHJlaXNlcmZzX2lvY3RsLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsID0gcmVpc2VyZnNfY29tcGF0X2lvY3RsLAogI2VuZGlmCkBAIC0xNzQsMTQgKzE3NCwyMiBAQAogCQkJCS8vIHVzZXIgc3BhY2UgYnVmZmVyIGlzIHN3YXBwZWQgb3V0LiBBdCB0aGF0IHRpbWUKIAkJCQkvLyBlbnRyeSBjYW4gbW92ZSB0byBzb21ld2hlcmUgZWxzZQogCQkJCW1lbWNweShsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOworCisJCQkJLyoKKwkJCQkgKiBTaW5jZSBmaWxsZGlyIG1pZ2h0IHNsZWVwLCB3ZSBjYW4gcmVsZWFzZQorCQkJCSAqIHRoZSB3cml0ZSBsb2NrIGhlcmUgZm9yIG90aGVyIHdhaXRlcnMKKwkJCQkgKi8KKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCQkJCWlmIChmaWxsZGlyCiAJCQkJICAgIChkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKIAkJCQkgICAgIERUX1VOS05PV04pIDwgMCkgeworCQkJCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAkJCQkJaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKIAkJCQkJCWtmcmVlKGxvY2FsX2J1Zik7CiAJCQkJCX0KIAkJCQkJZ290byBlbmQ7CiAJCQkJfQorCQkJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCQkJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CiAJCQkJCWtmcmVlKGxvY2FsX2J1Zik7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYyBiL2ZzL3JlaXNlcmZzL2RvX2JhbGFuLmMKaW5kZXggMTI4ZDNmNy4uNjBjMDgwNCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYworKysgYi9mcy9yZWlzZXJmcy9kb19iYWxhbi5jCkBAIC0yMSwxNCArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQotc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiID0gTlVMTDsJLyogZGV0ZWN0cyB3aGV0aGVyIG1vcmUgdGhhbiBvbmUKLQkJCQkJICAgY29weSBvZiB0YiBleGlzdHMgYXMgYSBtZWFucwotCQkJCQkgICBvZiBjaGVja2luZyB3aGV0aGVyIHNjaGVkdWxlCi0JCQkJCSAgIGlzIGludGVycnVwdGluZyBkb19iYWxhbmNlICovCi0jZW5kaWYKLQogc3RhdGljIGlubGluZSB2b2lkIGJ1ZmZlcl9pbmZvX2luaXRfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSkKIHsKQEAgLTE4NDAsMTEgKzE4MzIsMTIgQEAKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWlmIChjdXJfdGIpIHsKKwlpZiAoUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+Y3VyX3RiKSB7CiAJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwgInZzLTEyMzM1IiwgInN1c3BlY3QgdGhhdCBzY2hlZHVsZSAiCiAJCQkgICAgICAgIm9jY3VycmVkIGJhc2VkIG9uIGN1cl90YiBub3QgYmVpbmcgbnVsbCBhdCAiCiAJCQkgICAgICAgInRoaXMgcG9pbnQgaW4gY29kZS4gZG9fYmFsYW5jZSBjYW5ub3QgcHJvcGVybHkgIgotCQkJICAgICAgICJoYW5kbGUgc2NoZWR1bGUgb2NjdXJyaW5nIHdoaWxlIGl0IHJ1bnMuIik7CisJCQkgICAgICAgImhhbmRsZSBjb25jdXJyZW50IHRyZWUgYWNjZXNzZXMgb24gYSBzYW1lICIKKwkJCSAgICAgICAibW91bnQgcG9pbnQuIik7CiAJfQogCiAJLyogZG91YmxlIGNoZWNrIHRoYXQgYnVmZmVycyB0aGF0IHdlIHdpbGwgbW9kaWZ5IGFyZSB1bmxvY2tlZC4gKGZpeF9ub2RlcyBzaG91bGQgYWxyZWFkeSBoYXZlCkBAIC0xOTg2LDcgKzE5NzksNyBAQAogCSAgICAgImNoZWNrIik7Ki8KIAlSRkFMU0UoY2hlY2tfYmVmb3JlX2JhbGFuY2luZyh0YiksICJQQVAtMTIzNDA6IGxvY2tlZCBidWZmZXJzIGluIFRCIik7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JY3VyX3RiID0gdGI7CisJUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+Y3VyX3RiID0gdGI7CiAjZW5kaWYKIH0KIApAQCAtMTk5Niw3ICsxOTg5LDcgQEAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIAljaGVja19sZWFmX2xldmVsKHRiKTsKIAljaGVja19pbnRlcm5hbF9sZXZlbHModGIpOwotCWN1cl90YiA9IE5VTEw7CisJUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+Y3VyX3RiID0gTlVMTDsKICNlbmRpZgogCiAJLyogcmVpc2VyZnNfZnJlZV9ibG9jayBpcyBubyBsb25nZXIgc2NoZWR1bGUgc2FmZS4gIFNvLCB3ZSBuZWVkIHRvCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maWxlLmMgYi9mcy9yZWlzZXJmcy9maWxlLmMKaW5kZXggOWY0MzY2Ni4uZGEyZGJhMCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZmlsZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkucmVhZCA9IGRvX3N5bmNfcmVhZCwKIAkud3JpdGUgPSByZWlzZXJmc19maWxlX3dyaXRlLAotCS5pb2N0bCA9IHJlaXNlcmZzX2lvY3RsLAorCS51bmxvY2tlZF9pb2N0bCA9IHJlaXNlcmZzX2lvY3RsLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsID0gcmVpc2VyZnNfY29tcGF0X2lvY3RsLAogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maXhfbm9kZS5jIGIvZnMvcmVpc2VyZnMvZml4X25vZGUuYwppbmRleCA1ZTVhNGU2Li42NTkxY2IyIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maXhfbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2ZpeF9ub2RlLmMKQEAgLTU2Myw5ICs1NjMsNiBAQAogCXJldHVybiBuZWVkZWRfbm9kZXM7CiB9CiAKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWV4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7Ci0jZW5kaWYKIAogLyogU2V0IHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZy4KICAqIFBlcmZvcm1zIHdyaXRlIG9mIHJlc3VsdHMgb2YgYW5hbHlzaXMgb2YgYmFsYW5jaW5nIGludG8gc3RydWN0dXJlIHRiLApAQCAtODM0LDcgKzgzMSw3IEBACiAJCVJGQUxTRShidWZmZXJfZGlydHkobmV3X2JoKSB8fAogCQkgICAgICAgYnVmZmVyX2pvdXJuYWxlZChuZXdfYmgpIHx8CiAJCSAgICAgICBidWZmZXJfam91cm5hbF9kaXJ0eShuZXdfYmgpLAotCQkgICAgICAgIlBBUC04MTQwOiBqb3VybmxhbGVkIG9yIGRpcnR5IGJ1ZmZlciAlYiBmb3IgdGhlIG5ldyBibG9jayIsCisJCSAgICAgICAiUEFQLTgxNDA6IGpvdXJuYWxlZCBvciBkaXJ0eSBidWZmZXIgJWIgZm9yIHRoZSBuZXcgYmxvY2siLAogCQkgICAgICAgbmV3X2JoKTsKIAogCQkvKiBQdXQgZW1wdHkgYnVmZmVycyBpbnRvIHRoZSBhcnJheS4gKi8KQEAgLTEwMjIsNyArMTAxOSwxMSBAQAogCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbW1vbiBwYXJlbnQgaXMgbG9ja2VkLiAqLwogCiAJaWYgKGJ1ZmZlcl9sb2NrZWQoKnBjb21fZmF0aGVyKSkgeworCisJCS8qIFJlbGVhc2UgdGhlIHdyaXRlIGxvY2sgd2hpbGUgdGhlIGJ1ZmZlciBpcyBidXN5ICovCisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayh0Yi0+dGJfc2IpOwogCQlfX3dhaXRfb25fYnVmZmVyKCpwY29tX2ZhdGhlcik7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2sodGItPnRiX3NiKTsKIAkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQih0YikpIHsKIAkJCWJyZWxzZSgqcGNvbV9mYXRoZXIpOwogCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CkBAIC0xOTI3LDcgKzE5MjgsOSBAQAogCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAogCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2sodGItPnRiX3NiKTsKIAkJX193YWl0X29uX2J1ZmZlcihiaCk7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2sodGItPnRiX3NiKTsKIAkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQih0YikpCiAJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAl9CkBAIC0xOTY1LDcgKzE5NjgsOSBAQAogCQkgICAgIHRiLT5GTFtoXSkgPyB0Yi0+bGtleVtoXSA6IEJfTlJfSVRFTVModGItPgogCQkJCQkJCQkgICAgICAgRkxbaF0pOwogCQlzb25fbnVtYmVyID0gQl9OX0NISUxEX05VTSh0Yi0+RkxbaF0sIGNoaWxkX3Bvc2l0aW9uKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKIAkJYmggPSBzYl9icmVhZChzYiwgc29uX251bWJlcik7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwogCQlpZiAoIWJoKQogCQkJcmV0dXJuIElPX0VSUk9SOwogCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSkgewpAQCAtMjAwMyw3ICsyMDA4LDkgQEAKIAkJY2hpbGRfcG9zaXRpb24gPQogCQkgICAgKGJoID09IHRiLT5GUltoXSkgPyB0Yi0+cmtleVtoXSArIDEgOiAwOwogCQlzb25fbnVtYmVyID0gQl9OX0NISUxEX05VTSh0Yi0+RlJbaF0sIGNoaWxkX3Bvc2l0aW9uKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKIAkJYmggPSBzYl9icmVhZChzYiwgc29uX251bWJlcik7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwogCQlpZiAoIWJoKQogCQkJcmV0dXJuIElPX0VSUk9SOwogCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSkgewpAQCAtMjI3OCw3ICsyMjg1LDkgQEAKIAkJCQkgICAgUkVQRUFUX1NFQVJDSCA6IENBUlJZX09OOwogCQkJfQogI2VuZGlmCisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sodGItPnRiX3NiKTsKIAkJCV9fd2FpdF9vbl9idWZmZXIobG9ja2VkKTsKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2sodGItPnRiX3NiKTsKIAkJCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIodGIpKQogCQkJCXJldHVybiBSRVBFQVRfU0VBUkNIOwogCQl9CkBAIC0yMzQ5LDEyICsyMzU4LDE0IEBACiAKIAkvKiBpZiBpdCBwb3NzaWJsZSBpbiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiAqLwogCWlmIChidWZmZXJfbG9ja2VkKHRiUzApKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayh0Yi0+dGJfc2IpOwogCQlfX3dhaXRfb25fYnVmZmVyKHRiUzApOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHRiLT50Yl9zYik7CiAJCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIodGIpKQogCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAJfQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCWlmIChjdXJfdGIpIHsKKwlpZiAoUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+Y3VyX3RiKSB7CiAJCXByaW50X2N1cl90YigiZml4X25vZGVzIik7CiAJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwgIlBBUC04MzA1IiwKIAkJCSAgICAgICAidGhlcmUgaXMgcGVuZGluZyBkb19iYWxhbmNlIik7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCBhMTRkNmNkLi4zYTI4ZTc3IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTI1MSw3ICsyNTEsNiBAQAogCXN0cnVjdCBjcHVfa2V5IGtleTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBpdGVtX2hlYWQgKmloLCB0bXBfaWg7Ci0JaW50IGZzX2dlbjsKIAliX2Jsb2NrbnJfdCBibG9ja25yOwogCWNoYXIgKnAgPSBOVUxMOwogCWludCBjaGFyczsKQEAgLTI2NSw3ICsyNjQsNiBAQAogCQkgICAgIChsb2ZmX3QpIGJsb2NrICogaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplICsgMSwgVFlQRV9BTlksCiAJCSAgICAgMyk7CiAKLSAgICAgIHJlc2VhcmNoOgogCXJlc3VsdCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CiAJaWYgKHJlc3VsdCAhPSBQT1NJVElPTl9GT1VORCkgewogCQlwYXRocmVsc2UoJnBhdGgpOwpAQCAtMzQwLDcgKzMzOCw2IEBACiAJfQogCS8vIHJlYWQgZmlsZSB0YWlsIGludG8gcGFydCBvZiBwYWdlCiAJb2Zmc2V0ID0gKGNwdV9rZXlfa19vZmZzZXQoJmtleSkgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7CiAJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwogCiAJLyogd2Ugb25seSB3YW50IHRvIGttYXAgaWYgd2UgYXJlIHJlYWRpbmcgdGhlIHRhaWwgaW50byB0aGUgcGFnZS4KQEAgLTM0OCwxMyArMzQ1LDkgQEAKIAkgKiogc3VyZSB3ZSBuZWVkIHRvLiAgQnV0LCB0aGlzIG1lYW5zIHRoZSBpdGVtIG1pZ2h0IG1vdmUgaWYKIAkgKioga21hcCBzY2hlZHVsZXMKIAkgKi8KLQlpZiAoIXApIHsKKwlpZiAoIXApCiAJCXAgPSAoY2hhciAqKWttYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOwotCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQotCQkgICAgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKLQkJCWdvdG8gcmVzZWFyY2g7Ci0JCX0KLQl9CisKIAlwICs9IG9mZnNldDsKIAltZW1zZXQocCwgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKIAlkbyB7CkBAIC00ODksMTAgKzQ4MiwxNCBAQAogCSAgIGRpc2FwcGVhcmVkICovCiAJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spIHsKIAkJaW50IGVycjsKLQkJbG9ja19rZXJuZWwoKTsKKworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwogCQllcnIgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKTsKIAkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrOwotCQl1bmxvY2tfa2VybmVsKCk7CisKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldCA9IGVycjsKIAl9CkBAIC02MDEsNiArNTk4LDcgQEAKIAlfX2xlMzIgKml0ZW07CiAJaW50IGRvbmU7CiAJaW50IGZzX2dlbjsKKwlpbnQgbG9ja19kZXB0aDsKIAlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7CiAJLyogc3BhY2UgcmVzZXJ2ZWQgaW4gdHJhbnNhY3Rpb24gYmF0Y2g6CiAJICAgLiAzIGJhbGFuY2luZ3MgaW4gZGlyZWN0LT5pbmRpcmVjdCBjb252ZXJzaW9uCkBAIC02MTYsMTIgKzYxNCwxMSBAQAogCWxvZmZfdCBuZXdfb2Zmc2V0ID0KIAkgICAgKCgobG9mZl90KSBibG9jaykgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMTsKIAotCS8qIGJhZC4uLi4gKi8KLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlsb2NrX2RlcHRoID0gcmVpc2VyZnNfd3JpdGVfbG9ja19vbmNlKGlub2RlLT5pX3NiKTsKIAl2ZXJzaW9uID0gZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpOwogCiAJaWYgKCFmaWxlX2NhcGFibGUoaW5vZGUsIGJsb2NrKSkgewotCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfb25jZShpbm9kZS0+aV9zYiwgbG9ja19kZXB0aCk7CiAJCXJldHVybiAtRUZCSUc7CiAJfQogCkBAIC02MzMsNyArNjMwLDcgQEAKIAkJLyogZmluZCBudW1iZXIgb2YgYmxvY2stdGggbG9naWNhbCBibG9jayBvZiB0aGUgZmlsZSAqLwogCQlyZXQgPSBfZ2V0X2Jsb2NrX2NyZWF0ZV8wKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LAogCQkJCQkgIGNyZWF0ZSB8IEdFVF9CTE9DS19SRUFEX0RJUkVDVCk7Ci0JCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja19vbmNlKGlub2RlLT5pX3NiLCBsb2NrX2RlcHRoKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJLyoKQEAgLTc1MSw3ICs3NDgsNyBAQAogCQlpZiAoIWRhbmdsZSAmJiB0aCkKIAkJCXJldHZhbCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKIAotCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfb25jZShpbm9kZS0+aV9zYiwgbG9ja19kZXB0aCk7CiAKIAkJLyogdGhlIGl0ZW0gd2FzIGZvdW5kLCBzbyBuZXcgYmxvY2tzIHdlcmUgbm90IGFkZGVkIHRvIHRoZSBmaWxlCiAJCSAqKiB0aGVyZSBpcyBubyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaW5vZGUgaXMgdXBkYXRlZCB3aXRoIHRoaXMKQEAgLTkzNSw3ICs5MzIsNyBAQAogCQkJaWYgKGJsb2Nrc19uZWVkZWQgPT0gMSkgewogCQkJCXVuID0gJnVuZl9zaW5nbGU7CiAJCQl9IGVsc2UgewotCQkJCXVuID0ga3phbGxvYyhtaW4oYmxvY2tzX25lZWRlZCwgbWF4X3RvX2luc2VydCkgKiBVTkZNX1BfU0laRSwgR0ZQX0FUT01JQyk7CS8vIFdlIG5lZWQgdG8gYXZvaWQgc2NoZWR1bGluZy4KKwkJCQl1biA9IGt6YWxsb2MobWluKGJsb2Nrc19uZWVkZWQsIG1heF90b19pbnNlcnQpICogVU5GTV9QX1NJWkUsIEdGUF9OT0ZTKTsKIAkJCQlpZiAoIXVuKSB7CiAJCQkJCXVuID0gJnVuZl9zaW5nbGU7CiAJCQkJCWJsb2Nrc19uZWVkZWQgPSAxOwpAQCAtOTk3LDEwICs5OTQsMTYgQEAKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBmYWlsdXJlOwogCQl9Ci0JCS8qIGluc2VydGluZyBpbmRpcmVjdCBwb2ludGVycyBmb3IgYSBob2xlIGNhbiB0YWtlIGEKLQkJICoqIGxvbmcgdGltZS4gIHJlc2NoZWR1bGUgaWYgbmVlZGVkCisJCS8qCisJCSAqIGluc2VydGluZyBpbmRpcmVjdCBwb2ludGVycyBmb3IgYSBob2xlIGNhbiB0YWtlIGEKKwkJICogbG9uZyB0aW1lLiAgcmVzY2hlZHVsZSBpZiBuZWVkZWQgYW5kIGFsc28gcmVsZWFzZSB0aGUgd3JpdGUKKwkJICogbG9jayBmb3Igb3RoZXJzLgogCQkgKi8KLQkJY29uZF9yZXNjaGVkKCk7CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2UoaW5vZGUtPmlfc2IsIGxvY2tfZGVwdGgpOworCQkJc2NoZWR1bGUoKTsKKwkJCWxvY2tfZGVwdGggPSByZWlzZXJmc193cml0ZV9sb2NrX29uY2UoaW5vZGUtPmlfc2IpOworCQl9CiAKIAkJcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKIAkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewpAQCAtMTAzNSw3ICsxMDM4LDcgQEAKIAkJCXJldHZhbCA9IGVycjsKIAl9CiAKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX3VubG9ja19vbmNlKGlub2RlLT5pX3NiLCBsb2NrX2RlcHRoKTsKIAlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMjA3Miw4ICsyMDc1LDkgQEAKIAlpbnQgZXJyb3I7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJaW50IGVycjI7CisJaW50IGxvY2tfZGVwdGg7CiAKLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlsb2NrX2RlcHRoID0gcmVpc2VyZnNfd3JpdGVfbG9ja19vbmNlKGlub2RlLT5pX3NiKTsKIAogCWlmIChpbm9kZS0+aV9zaXplID4gMCkgewogCQllcnJvciA9IGdyYWJfdGFpbF9wYWdlKGlub2RlLCAmcGFnZSwgJmJoKTsKQEAgLTIxNDIsMTQgKzIxNDYsMTcgQEAKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCX0KIAotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2UoaW5vZGUtPmlfc2IsIGxvY2tfZGVwdGgpOworCiAJcmV0dXJuIDA7CiAgICAgICBvdXQ6CiAJaWYgKHBhZ2UpIHsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKworCXJlaXNlcmZzX3dyaXRlX3VubG9ja19vbmNlKGlub2RlLT5pX3NiLCBsb2NrX2RlcHRoKTsKKwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjYwOCw3ICsyNjE1LDEwIEBACiAJaW50IHJldDsKIAlpbnQgb2xkX3JlZiA9IDA7CiAKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCiAJZml4X3RhaWxfcGFnZV9mb3Jfd3JpdGluZyhwYWdlKTsKIAlpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKIAkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGg7CkBAIC0yNjY0LDYgKzI2NzQsOCBAQAogCWludCB1cGRhdGVfc2QgPSAwOwogCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoOwogCXVuc2lnbmVkIHN0YXJ0OworCWludCBsb2NrX2RlcHRoID0gMDsKKwlib29sIGxvY2tlZCA9IGZhbHNlOwogCiAJaWYgKCh1bnNpZ25lZCBsb25nKWZzZGF0YSAmIEFPUF9GTEFHX0NPTlRfRVhQQU5EKQogCQlwb3MgKys7CkBAIC0yNjkwLDkgKzI3MDIsMTEgQEAKIAkgKiogdG8gZG8gdGhlIGlfc2l6ZSB1cGRhdGVzIGhlcmUuCiAJICovCiAJcG9zICs9IGNvcGllZDsKKwogCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CiAJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aDsKLQkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWxvY2tfZGVwdGggPSByZWlzZXJmc193cml0ZV9sb2NrX29uY2UoaW5vZGUtPmlfc2IpOworCQlsb2NrZWQgPSB0cnVlOwogCQkvKiBJZiB0aGUgZmlsZSBoYXZlIGdyb3duIGJleW9uZCB0aGUgYm9yZGVyIHdoZXJlIGl0CiAJCSAgIGNhbiBoYXZlIGEgdGFpbCwgdW5tYXJrIGl0IGFzIG5lZWRpbmcgYSB0YWlsCiAJCSAgIHBhY2tpbmcgKi8KQEAgLTI3MDMsMTAgKzI3MTcsOSBAQAogCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrOwogCiAJCXJldCA9IGpvdXJuYWxfYmVnaW4oJm15dGgsIGlub2RlLT5pX3NiLCAxKTsKLQkJaWYgKHJldCkgewotCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKHJldCkKIAkJCWdvdG8gam91cm5hbF9lcnJvcjsKLQkJfQorCiAJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CiAJCWlub2RlLT5pX3NpemUgPSBwb3M7CiAJCS8qCkBAIC0yNzE4LDM0ICsyNzMxLDM2IEBACiAJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmbXl0aCwgaW5vZGUpOwogCQl1cGRhdGVfc2QgPSAxOwogCQlyZXQgPSBqb3VybmFsX2VuZCgmbXl0aCwgaW5vZGUtPmlfc2IsIDEpOwotCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCQlpZiAocmV0KQogCQkJZ290byBqb3VybmFsX2Vycm9yOwogCX0KIAlpZiAodGgpIHsKLQkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICghbG9ja2VkKSB7CisJCQlsb2NrX2RlcHRoID0gcmVpc2VyZnNfd3JpdGVfbG9ja19vbmNlKGlub2RlLT5pX3NiKTsKKwkJCWxvY2tlZCA9IHRydWU7CisJCX0KIAkJaWYgKCF1cGRhdGVfc2QpCiAJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJcmV0ID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCiAgICAgICBvdXQ6CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2UoaW5vZGUtPmlfc2IsIGxvY2tfZGVwdGgpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAlyZXR1cm4gcmV0ID09IDAgPyBjb3BpZWQgOiByZXQ7CiAKICAgICAgIGpvdXJuYWxfZXJyb3I6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2UoaW5vZGUtPmlfc2IsIGxvY2tfZGVwdGgpOworCWxvY2tlZCA9IGZhbHNlOwogCWlmICh0aCkgewotCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAkJaWYgKCF1cGRhdGVfc2QpCiAJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKIAkJcmV0ID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCX0KLQogCWdvdG8gb3V0OwogfQogCkBAIC0yNzU4LDcgKzI3NzMsMTAgQEAKIAlpbnQgdXBkYXRlX3NkID0gMDsKIAlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7CiAKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCiAJaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7CiAJCXRoID0gY3VycmVudC0+am91cm5hbF9pbmZvOwogCX0KQEAgLTI3NzAsNyArMjc4OCw2IEBACiAJICovCiAJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKIAkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOwotCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAkJLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBiZXlvbmQgdGhlIGJvcmRlciB3aGVyZSBpdAogCQkgICBjYW4gaGF2ZSBhIHRhaWwsIHVubWFyayBpdCBhcyBuZWVkaW5nIGEgdGFpbAogCQkgICBwYWNraW5nICovCkBAIC0yNzgxLDEwICsyNzk4LDkgQEAKIAkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzazsKIAogCQlyZXQgPSBqb3VybmFsX2JlZ2luKCZteXRoLCBpbm9kZS0+aV9zYiwgMSk7Ci0JCWlmIChyZXQpIHsKLQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCWlmIChyZXQpCiAJCQlnb3RvIGpvdXJuYWxfZXJyb3I7Ci0JCX0KKwogCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwogCQlpbm9kZS0+aV9zaXplID0gcG9zOwogCQkvKgpAQCAtMjc5NiwxNiArMjgxMiwxMyBAQAogCQlyZWlzZXJmc191cGRhdGVfc2QoJm15dGgsIGlub2RlKTsKIAkJdXBkYXRlX3NkID0gMTsKIAkJcmV0ID0gam91cm5hbF9lbmQoJm15dGgsIGlub2RlLT5pX3NiLCAxKTsKLQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAl9CiAJaWYgKHRoKSB7Ci0JCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCQlpZiAoIXVwZGF0ZV9zZCkKIAkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQlyZXQgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7Ci0JCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0yODE1LDExICsyODI4LDkgQEAKIAogICAgICAgam91cm5hbF9lcnJvcjoKIAlpZiAodGgpIHsKLQkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CiAJCWlmICghdXBkYXRlX3NkKQogCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CiAJCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKLQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW9jdGwuYyBiL2ZzL3JlaXNlcmZzL2lvY3RsLmMKaW5kZXggMGNjYzNmZC4uYWNlNzc0NSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW9jdGwuYworKysgYi9mcy9yZWlzZXJmcy9pb2N0bC5jCkBAIC0xMyw0NCArMTMsNTIgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KIAogLyoKLSoqIHJlaXNlcmZzX2lvY3RsIC0gaGFuZGxlciBmb3IgaW9jdGwgZm9yIGlub2RlCi0qKiBzdXBwb3J0ZWQgY29tbWFuZHM6Ci0qKiAgMSkgUkVJU0VSRlNfSU9DX1VOUEFDSyAtIHRyeSB0byB1bnBhY2sgdGFpbCBmcm9tIGRpcmVjdCBpdGVtIGludG8gaW5kaXJlY3QKLSoqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByZXZlbnQgcGFja2luZyBmaWxlIChhcmd1bWVudCBhcmcgaGFzIHRvIGJlIG5vbi16ZXJvKQotKiogIDIpIFJFSVNFUkZTX0lPQ19bR1NdRVRGTEFHUywgUkVJU0VSRlNfSU9DX1tHU11FVFZFUlNJT04KLSoqICAzKSBUaGF0J3MgYWxsIGZvciBhIHdoaWxlIC4uLgotKi8KLWludCByZWlzZXJmc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKLQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCisgKiByZWlzZXJmc19pb2N0bCAtIGhhbmRsZXIgZm9yIGlvY3RsIGZvciBpbm9kZQorICogc3VwcG9ydGVkIGNvbW1hbmRzOgorICogIDEpIFJFSVNFUkZTX0lPQ19VTlBBQ0sgLSB0cnkgdG8gdW5wYWNrIHRhaWwgZnJvbSBkaXJlY3QgaXRlbSBpbnRvIGluZGlyZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmV2ZW50IHBhY2tpbmcgZmlsZSAoYXJndW1lbnQgYXJnIGhhcyB0byBiZSBub24temVybykKKyAqICAyKSBSRUlTRVJGU19JT0NfW0dTXUVURkxBR1MsIFJFSVNFUkZTX0lPQ19bR1NdRVRWRVJTSU9OCisgKiAgMykgVGhhdCdzIGFsbCBmb3IgYSB3aGlsZSAuLi4KKyAqLworbG9uZyByZWlzZXJmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCWludCBlcnIgPSAwOwogCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUkVJU0VSRlNfSU9DX1VOUEFDSzoKIAkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCWlmIChhcmcpCi0JCQkJcmV0dXJuIHJlaXNlcmZzX3VucGFjayhpbm9kZSwgZmlscCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDA7CisJCQkJZXJyID0gcmVpc2VyZnNfdW5wYWNrKGlub2RlLCBmaWxwKTsKIAkJfSBlbHNlCi0JCQlyZXR1cm4gLUVOT1RUWTsKLQkJLyogZm9sbG93aW5nIHR3byBjYXNlcyBhcmUgdGFrZW4gZnJvbSBmcy9leHQyL2lvY3RsLmMgYnkgUmVteQotCQkgICBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKSAqLworCQkJZXJyID0gLUVOT1RUWTsKKwkJYnJlYWs7CisJCS8qCisJCSAqIGZvbGxvd2luZyB0d28gY2FzZXMgYXJlIHRha2VuIGZyb20gZnMvZXh0Mi9pb2N0bC5jIGJ5IFJlbXkKKwkJICogQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKwkJICovCiAJY2FzZSBSRUlTRVJGU19JT0NfR0VURkxBR1M6Ci0JCWlmICghcmVpc2VyZnNfYXR0cnMoaW5vZGUtPmlfc2IpKQotCQkJcmV0dXJuIC1FTk9UVFk7CisJCWlmICghcmVpc2VyZnNfYXR0cnMoaW5vZGUtPmlfc2IpKSB7CisJCQllcnIgPSAtRU5PVFRZOworCQkJYnJlYWs7CisJCX0KIAogCQlmbGFncyA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzOwogCQlpX2F0dHJzX3RvX3NkX2F0dHJzKGlub2RlLCAoX191MTYgKikgJiBmbGFncyk7Ci0JCXJldHVybiBwdXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKilhcmcpOworCQllcnIgPSBwdXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKIAljYXNlIFJFSVNFUkZTX0lPQ19TRVRGTEFHUzp7Ci0JCQlpZiAoIXJlaXNlcmZzX2F0dHJzKGlub2RlLT5pX3NiKSkKLQkJCQlyZXR1cm4gLUVOT1RUWTsKKwkJCWlmICghcmVpc2VyZnNfYXR0cnMoaW5vZGUtPmlfc2IpKSB7CisJCQkJZXJyID0gLUVOT1RUWTsKKwkJCQlicmVhazsKKwkJCX0KIAogCQkJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CiAJCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7CisJCQkJYnJlYWs7CiAKIAkJCWlmICghaXNfb3duZXJfb3JfY2FwKGlub2RlKSkgewogCQkJCWVyciA9IC1FUEVSTTsKQEAgLTkwLDE2ICs5OCwxOCBAQAogCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiBzZXRmbGFnc19vdXQ6CiAJCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKLQkJCXJldHVybiBlcnI7CisJCQlicmVhazsKIAkJfQogCWNhc2UgUkVJU0VSRlNfSU9DX0dFVFZFUlNJT046Ci0JCXJldHVybiBwdXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWVyciA9IHB1dF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CiAJY2FzZSBSRUlTRVJGU19JT0NfU0VUVkVSU0lPTjoKIAkJaWYgKCFpc19vd25lcl9vcl9jYXAoaW5vZGUpKQotCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOwogCQllcnIgPSBtbnRfd2FudF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKIAkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCQlicmVhazsKIAkJaWYgKGdldF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopYXJnKSkgewogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWdvdG8gc2V0dmVyc2lvbl9vdXQ7CkBAIC0xMDgsMTkgKzExOCwyMCBAQAogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIHNldHZlcnNpb25fb3V0OgogCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKLQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9UVFk7CisJCWVyciA9IC1FTk9UVFk7CiAJfQorCisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKworCXJldHVybiBlcnI7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBsb25nIHJlaXNlcmZzX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpbnQgcmV0OwotCiAJLyogVGhlc2UgYXJlIGp1c3QgbWlzbmFtZWQsIHRoZXkgYWN0dWFsbHkgZ2V0L3B1dCBmcm9tL3RvIHVzZXIgYW4gaW50ICovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJFSVNFUkZTX0lPQzMyX1VOUEFDSzoKQEAgLTE0MSwxMCArMTUyLDggQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KLQlsb2NrX2tlcm5lbCgpOwotCXJldCA9IHJlaXNlcmZzX2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSBjb21wYXRfcHRyKGFyZykpOwotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJlaXNlcmZzX2lvY3RsKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIGNvbXBhdF9wdHIoYXJnKSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvam91cm5hbC5jIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCmluZGV4IDkwNjIyMjAuLjJmOGE3ZTcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYworKysgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKQEAgLTQyOSwyMSArNDI5LDYgQEAKIAljbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5KGJoKTsKIH0KIAotLyogdXRpbGl0eSBmdW5jdGlvbiB0byBmb3JjZSBhIEJVRyBpZiBpdCBpcyBjYWxsZWQgd2l0aG91dCB0aGUgYmlnCi0qKiBrZXJuZWwgbG9jayBoZWxkLiAgY2FsbGVyIGlzIHRoZSBzdHJpbmcgcHJpbnRlZCBqdXN0IGJlZm9yZSBjYWxsaW5nIEJVRygpCi0qLwotdm9pZCByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKmNhbGxlcikKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKGN1cnJlbnQtPmxvY2tfZGVwdGggPCAwKSB7Ci0JCXJlaXNlcmZzX3BhbmljKHNiLCAiam91cm5hbC0xIiwgIiVzIGNhbGxlZCB3aXRob3V0IGtlcm5lbCAiCi0JCQkgICAgICAgImxvY2sgaGVsZCIsIGNhbGxlcik7Ci0JfQotI2Vsc2UKLQk7Ci0jZW5kaWYKLX0KLQogLyogcmV0dXJuIGEgY25vZGUgd2l0aCBzYW1lIGRldiwgYmxvY2sgbnVtYmVyIGFuZCBzaXplIGluIHRhYmxlLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqZ2V0X2pvdXJuYWxfaGFzaF9kZXYoc3RydWN0CiAJCQkJCQkJCSAgc3VwZXJfYmxvY2sKQEAgLTU1Niw3ICs1NDEsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIGxvY2tfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCVBST0NfSU5GT19JTkMoc2IsIGpvdXJuYWwubG9ja19qb3VybmFsKTsKLQltdXRleF9sb2NrKCZTQl9KT1VSTkFMKHNiKS0+al9tdXRleCk7CisKKwlyZWlzZXJmc19tdXRleF9sb2NrX3NhZmUoJlNCX0pPVVJOQUwoc2IpLT5qX211dGV4LCBzYik7CiB9CiAKIC8qIHVubG9jayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwpAQCAtNzA4LDcgKzY5NCw5IEBACiAJCWRpc2FibGVfYmFycmllcihzKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CiAJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKIAl9CiB9CiAKQEAgLTk5Niw4ICs5ODQsMTMgQEAKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwocyk7Ci0JaWYgKGF0b21pY19yZWFkKCZqLT5qX2FzeW5jX3Rocm90dGxlKSkKKworCWlmIChhdG9taWNfcmVhZCgmai0+al9hc3luY190aHJvdHRsZSkpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwogCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWiAvIDEwKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA0Myw3ICsxMDM2LDggQEAKIAl9CiAKIAkvKiBtYWtlIHN1cmUgbm9ib2R5IGlzIHRyeWluZyB0byBmbHVzaCB0aGlzIG9uZSBhdCB0aGUgc2FtZSB0aW1lICovCi0JbXV0ZXhfbG9jaygmamwtPmpfY29tbWl0X211dGV4KTsKKwlyZWlzZXJmc19tdXRleF9sb2NrX3NhZmUoJmpsLT5qX2NvbW1pdF9tdXRleCwgcyk7CisKIAlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCB0cmFuc19pZCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZqbC0+al9jb21taXRfbXV0ZXgpOwogCQlnb3RvIHB1dF9qbDsKQEAgLTEwNjEsMTIgKzEwNTUsMTcgQEAKIAogCWlmICghbGlzdF9lbXB0eSgmamwtPmpfYmhfbGlzdCkpIHsKIAkJaW50IHJldDsKLQkJdW5sb2NrX2tlcm5lbCgpOworCisJCS8qCisJCSAqIFdlIG1pZ2h0IHNsZWVwIGluIG51bWVyb3VzIHBsYWNlcyBpbnNpZGUKKwkJICogd3JpdGVfb3JkZXJlZF9idWZmZXJzLiBSZWxheCB0aGUgd3JpdGUgbG9jay4KKwkJICovCisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKIAkJcmV0ID0gd3JpdGVfb3JkZXJlZF9idWZmZXJzKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaywKIAkJCQkJICAgIGpvdXJuYWwsIGpsLCAmamwtPmpfYmhfbGlzdCk7CiAJCWlmIChyZXQgPCAwICYmIHJldHZhbCA9PSAwKQogCQkJcmV0dmFsID0gcmV0OwotCQlsb2NrX2tlcm5lbCgpOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOwogCX0KIAlCVUdfT04oIWxpc3RfZW1wdHkoJmpsLT5qX2JoX2xpc3QpKTsKIAkvKgpAQCAtMTA4NSw4ICsxMDg0LDExIEBACiAJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpOwogCQl0YmggPSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJuKTsKIAkJaWYgKHRiaCkgewotCQkJaWYgKGJ1ZmZlcl9kaXJ0eSh0YmgpKQotCQkJICAgIGxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKSA7CisJCQlpZiAoYnVmZmVyX2RpcnR5KHRiaCkpIHsKKwkJICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCQkJICAgIGxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKTsKKwkJCSAgICByZWlzZXJmc193cml0ZV9sb2NrKHMpOworCQkJfQogCQkJcHV0X2JoKHRiaCkgOwogCQl9CiAJfQpAQCAtMTExNCwxMiArMTExNiwxOSBAQAogCQlibiA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhzKSArCiAJCSAgICAoamwtPmpfc3RhcnQgKyBpKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7CiAJCXRiaCA9IGpvdXJuYWxfZmluZF9nZXRfYmxvY2socywgYm4pOworCisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKIAkJd2FpdF9vbl9idWZmZXIodGJoKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKIAkJLy8gc2luY2Ugd2UncmUgdXNpbmcgbGxfcndfYmxrIGFib3ZlLCBpdCBtaWdodCBoYXZlIHNraXBwZWQgb3ZlcgogCQkvLyBhIGxvY2tlZCBidWZmZXIuICBEb3VibGUgY2hlY2sgaGVyZQogCQkvLwotCQlpZiAoYnVmZmVyX2RpcnR5KHRiaCkpCS8qIHJlZHVuZGFudCwgc3luY19kaXJ0eV9idWZmZXIoKSBjaGVja3MgKi8KKwkJLyogcmVkdW5kYW50LCBzeW5jX2RpcnR5X2J1ZmZlcigpIGNoZWNrcyAqLworCQlpZiAoYnVmZmVyX2RpcnR5KHRiaCkpIHsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKIAkJCXN5bmNfZGlydHlfYnVmZmVyKHRiaCk7CisJCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCQl9CiAJCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCiAJCQlyZWlzZXJmc193YXJuaW5nKHMsICJqb3VybmFsLTYwMSIsCkBAIC0xMTQzLDEwICsxMTUyLDE1IEBACiAJCQlpZiAoYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCkpCiAJCQkJQlVHKCk7CiAJCQltYXJrX2J1ZmZlcl9kaXJ0eShqbC0+al9jb21taXRfYmgpIDsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKIAkJCXN5bmNfZGlydHlfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCkgOworCQkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKIAkJd2FpdF9vbl9idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwl9CiAKIAljaGVja19iYXJyaWVyX2NvbXBsZXRpb24ocywgamwtPmpfY29tbWl0X2JoKTsKIApAQCAtMTI4Niw3ICsxMzAwLDkgQEAKIAogCWlmICh0cmFuc19pZCA+PSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpIHsKIAkJaWYgKGJ1ZmZlcl9sb2NrZWQoKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkpIHsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CiAJCQl3YWl0X29uX2J1ZmZlcigoam91cm5hbC0+al9oZWFkZXJfYmgpKTsKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwogCQkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgewogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwogCQkJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJqb3VybmFsLTY5OSIsCkBAIC0xMzEyLDEyICsxMzI4LDE2IEBACiAJCQkJZGlzYWJsZV9iYXJyaWVyKHNiKTsKIAkJCQlnb3RvIHN5bmM7CiAJCQl9CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOwogCQkJd2FpdF9vbl9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQkJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAJCQljaGVja19iYXJyaWVyX2NvbXBsZXRpb24oc2IsIGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKIAkJfSBlbHNlIHsKIAkJICAgICAgc3luYzoKIAkJCXNldF9idWZmZXJfZGlydHkoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKIAkJCXN5bmNfZGlydHlfYnVmZmVyKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwogCQl9CiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkgewogCQkJcmVpc2VyZnNfd2FybmluZyhzYiwgImpvdXJuYWwtODM3IiwKQEAgLTE0MDksNyArMTQyOSw3IEBACiAKIAkvKiBpZiBmbHVzaGFsbCA9PSAwLCB0aGUgbG9jayBpcyBhbHJlYWR5IGhlbGQgKi8KIAlpZiAoZmx1c2hhbGwpIHsKLQkJbXV0ZXhfbG9jaygmam91cm5hbC0+al9mbHVzaF9tdXRleCk7CisJCXJlaXNlcmZzX211dGV4X2xvY2tfc2FmZSgmam91cm5hbC0+al9mbHVzaF9tdXRleCwgcyk7CiAJfSBlbHNlIGlmIChtdXRleF90cnlsb2NrKCZqb3VybmFsLT5qX2ZsdXNoX211dGV4KSkgewogCQlCVUcoKTsKIAl9CkBAIC0xNTUzLDcgKzE1NzMsMTEgQEAKIAkJCQkJcmVpc2VyZnNfcGFuaWMocywgImpvdXJuYWwtMTAxMSIsCiAJCQkJCQkgICAgICAgImNuLT5iaCBpcyBOVUxMIik7CiAJCQkJfQorCisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwogCQkJCXdhaXRfb25fYnVmZmVyKGNuLT5iaCk7CisJCQkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwogCQkJCWlmICghY24tPmJoKSB7CiAJCQkJCXJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTEwMTIiLAogCQkJCQkJICAgICAgICJjbi0+YmggaXMgTlVMTCIpOwpAQCAtMTc2OSw3ICsxNzkzLDcgQEAKIAlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CiAJY2h1bmsubnIgPSAwOwogCi0JbXV0ZXhfbG9jaygmam91cm5hbC0+al9mbHVzaF9tdXRleCk7CisJcmVpc2VyZnNfbXV0ZXhfbG9ja19zYWZlKCZqb3VybmFsLT5qX2ZsdXNoX211dGV4LCBzKTsKIAlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCBvcmlnX3RyYW5zX2lkKSkgewogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMTk3MywxMSArMTk5NywxOSBAQAogCXJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQtLTsKIAkvKiB3YWl0IGZvciBhbGwgY29tbWl0cyB0byBmaW5pc2ggKi8KIAljYW5jZWxfZGVsYXllZF93b3JrKCZTQl9KT1VSTkFMKHNiKS0+al93b3JrKTsKKworCS8qCisJICogV2UgbXVzdCByZWxlYXNlIHRoZSB3cml0ZSBsb2NrIGhlcmUgYmVjYXVzZQorCSAqIHRoZSB3b3JrcXVldWUgam9iIChmbHVzaF9hc3luY19jb21taXQpIG5lZWRzIHRoaXMgbG9jaworCSAqLworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CiAJZmx1c2hfd29ya3F1ZXVlKGNvbW1pdF93cSk7CisKIAlpZiAoIXJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQpIHsKIAkJZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKIAkJY29tbWl0X3dxID0gTlVMTDsKIAl9CisJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAKIAlmcmVlX2pvdXJuYWxfcmFtKHNiKTsKIApAQCAtMjI0Myw3ICsyMjc1LDExIEBACiAJLyogcmVhZCBpbiB0aGUgbG9nIGJsb2NrcywgbWVtY3B5IHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlYWwgYmxvY2sgKi8KIAlsbF9yd19ibG9jayhSRUFELCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyksIGxvZ19ibG9ja3MpOwogCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgeworCisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CiAJCXdhaXRfb25fYnVmZmVyKGxvZ19ibG9ja3NbaV0pOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKKwogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShsb2dfYmxvY2tzW2ldKSkgewogCQkJcmVpc2VyZnNfd2FybmluZyhzYiwgImpvdXJuYWwtMTIxMiIsCiAJCQkJCSAiUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgIgpAQCAtMjc2NSwxMSArMjgwMSwyNyBAQAogCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKIAl9CiAKKwkvKgorCSAqIFdlIG5lZWQgdG8gdW5sb2NrIGhlcmUgdG8gYXZvaWQgY3JlYXRpbmcgdGhlIGZvbGxvd2luZworCSAqIGRlcGVuZGVuY3k6CisJICogcmVpc2VyZnNfbG9jayAtPiBzeXNmc19tdXRleAorCSAqIEJlY2F1c2UgdGhlIHJlaXNlcmZzIG1tYXAgcGF0aCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jeToKKwkgKiBtbS0+bW1hcCAtPiByZWlzZXJmc19sb2NrLCBoZW5jZSB3ZSBoYXZlCisJICogbW0tPm1tYXAgLT4gcmVpc2VyZnNfbG9jayAtPnN5c2ZzX211dGV4CisJICogVGhpcyB3b3VsZCBlbmRzIHVwIGluIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aXRoIHN5c2ZzIHJlYWRkaXIgcGF0aAorCSAqIHdoaWNoIGRvZXMgc3lzZnNfbXV0ZXggLT4gbW0tPm1tYXBfc2VtCisJICogVGhpcyBpcyBmaW5lIGJlY2F1c2UgdGhlIHJlaXNlcmZzIGxvY2sgaXMgdXNlbGVzcyBpbiBtb3VudCBwYXRoLAorCSAqIGF0IGxlYXN0IHVudGlsIHdlIGNhbGwgam91cm5hbF9iZWdpbi4gV2Uga2VlcCBpdCBmb3IgcGFyYW5vaWQKKwkgKiByZWFzb25zLgorCSAqLworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CiAJaWYgKGpvdXJuYWxfaW5pdF9kZXYoc2IsIGpvdXJuYWwsIGpfZGV2X25hbWUpICE9IDApIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJzaC00NjIiLAogCQkJCSAidW5hYmxlIHRvIGluaXRpYWxpemUgam9ybmFsIGRldmljZSIpOwogCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKIAl9CisJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAKIAlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0soc2IpOwogCkBAIC0yODgxLDggKzI5MzMsMTEgQEAKIAl9CiAKIAlyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50Kys7Ci0JaWYgKHJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQgPD0gMSkKKwlpZiAocmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCA8PSAxKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CiAJCWNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworCX0KIAogCUlOSVRfREVMQVlFRF9XT1JLKCZqb3VybmFsLT5qX3dvcmssIGZsdXNoX2FzeW5jX2NvbW1pdHMpOwogCWpvdXJuYWwtPmpfd29ya19zYiA9IHNiOwpAQCAtMjk2NCw4ICszMDE5LDExIEBACiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKCZqb3VybmFsLT5qX2pvaW5fd2FpdCwgJndhaXQpOwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlpZiAodGVzdF9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorCWlmICh0ZXN0X2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSkpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwogCQlzY2hlZHVsZSgpOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCX0KIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUoJmpvdXJuYWwtPmpfam9pbl93YWl0LCAmd2FpdCk7CiB9CkBAIC0yOTgyLDcgKzMwNDAsOSBAQAogCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzYik7CiAJdW5zaWduZWQgbG9uZyBiY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKIAl3aGlsZSAoMSkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAJCWpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOwogCQl3aGlsZSAoKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAwIHx8CiAJCQlhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpICYmCkBAIC0zMDMzLDcgKzMwOTMsOSBAQAogCiAJaWYgKHRlc3RfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkpIHsKIAkJdW5sb2NrX2pvdXJuYWwoc2IpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOwogCQlyZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHNiKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAJCVBST0NfSU5GT19JTkMoc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd3JpdGVycyk7CiAJCWdvdG8gcmVsb2NrOwogCX0KQEAgLTM1MDYsMTQgKzM1NjgsMTQgQEAKIAlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKIAotCWxvY2tfa2VybmVsKCk7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAJaWYgKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKIAkJLyogbGFzdCBlbnRyeSBpcyB0aGUgeW91bmdlc3QsIGNvbW1pdCBpdCBhbmQgeW91IGdldCBldmVyeXRoaW5nICovCiAJCWVudHJ5ID0gam91cm5hbC0+al9qb3VybmFsX2xpc3QucHJldjsKIAkJamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOwogCQlmbHVzaF9jb21taXRfbGlzdChzYiwgamwsIDEpOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKIH0KIAogLyoKQEAgLTQwNDEsNyArNDEwMyw3IEBACiAJICogdGhlIG5ldyB0cmFuc2FjdGlvbiBpcyBmdWxseSBzZXR1cCwgYW5kIHdlJ3ZlIGFscmVhZHkgZmx1c2hlZCB0aGUKIAkgKiBvcmRlcmVkIGJoIGxpc3QKIAkgKi8KLQltdXRleF9sb2NrKCZqbC0+al9jb21taXRfbXV0ZXgpOworCXJlaXNlcmZzX211dGV4X2xvY2tfc2FmZSgmamwtPmpfY29tbWl0X211dGV4LCBzYik7CiAKIAkvKiBzYXZlIHRoZSB0cmFuc2FjdGlvbiBpZCBpbiBjYXNlIHdlIG5lZWQgdG8gY29tbWl0IGl0IGxhdGVyICovCiAJY29tbWl0X3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CkBAIC00MTU2LDcgKzQyMTgsOSBAQAogCQluZXh0ID0gY24tPm5leHQ7CiAJCWZyZWVfY25vZGUoc2IsIGNuKTsKIAkJY24gPSBuZXh0OworCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOwogCQljb25kX3Jlc2NoZWQoKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAJfQogCiAJLyogd2UgYXJlIGRvbmUgIHdpdGggYm90aCB0aGUgY19iaCBhbmQgZF9iaCwgYnV0CkBAIC00MjAzLDEwICs0MjY3LDEwIEBACiAJICogaXMgbG9zdC4KIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpIHsKLQkJdW5sb2NrX2tlcm5lbCgpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOwogCQl3cml0ZV9vcmRlcmVkX2J1ZmZlcnMoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVyc19sb2NrLAogCQkJCSAgICAgIGpvdXJuYWwsIGpsLCAmamwtPmpfdGFpbF9iaF9saXN0KTsKLQkJbG9ja19rZXJuZWwoKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAJfQogCUJVR19PTighbGlzdF9lbXB0eSgmamwtPmpfdGFpbF9iaF9saXN0KSk7CiAJbXV0ZXhfdW5sb2NrKCZqbC0+al9jb21taXRfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbG9jay5jIGIvZnMvcmVpc2VyZnMvbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMmNmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9sb2NrLmMKQEAgLTAsMCArMSw4OCBAQAorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworLyoKKyAqIFRoZSBwcmV2aW91cyByZWlzZXJmcyBsb2NraW5nIHNjaGVtZSB3YXMgaGVhdmlseSBiYXNlZCBvbgorICogdGhlIHRyaWNreSBwcm9wZXJ0aWVzIG9mIHRoZSBCa2w6CisgKgorICogLSBpdCB3YXMgYWNxdWlyZWQgcmVjdXJzaXZlbHkgYnkgYSBzYW1lIHRhc2sKKyAqIC0gdGhlIHBlcmZvcm1hbmNlcyByZWxpZWQgb24gdGhlIHJlbGVhc2Utd2hpbGUtc2NoZWR1bGUoKSBwcm9wZXJ0eQorICoKKyAqIE5vdyB0aGF0IHdlIHJlcGxhY2UgaXQgYnkgYSBtdXRleCwgd2Ugc3RpbGwgd2FudCB0byBrZWVwIHRoZSBzYW1lCisgKiByZWN1cnNpdmUgcHJvcGVydHkgdG8gYXZvaWQgYmlnIGNoYW5nZXMgaW4gdGhlIGNvZGUgc3RydWN0dXJlLgorICogV2UgdXNlIG91ciBvd24gbG9ja19vd25lciBoZXJlIGJlY2F1c2UgdGhlIG93bmVyIGZpZWxkIG9uIGEgbXV0ZXgKKyAqIGlzIG9ubHkgYXZhaWxhYmxlIGluIFNNUCBvciBtdXRleCBkZWJ1Z2dpbmcsIGFsc28gd2Ugb25seSBuZWVkIHRoaXMgZmllbGQKKyAqIGZvciB0aGlzIG11dGV4LCBubyBuZWVkIGZvciBhIHN5c3RlbSB3aWRlIG11dGV4IGZhY2lsaXR5LgorICoKKyAqIEFsc28gdGhpcyBsb2NrIGlzIG9mdGVuIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdGhhdCBjb3VsZCBibG9jayBiZWNhdXNlCisgKiByZWlzZXJmcyBwZXJmb3JtYW5jZXMgd2VyZSBwYXJ0aWFseSBiYXNlZCBvbiB0aGUgcmVsZWFzZSB3aGlsZSBzY2hlZHVsZSgpCisgKiBwcm9wZXJ0eSBvZiB0aGUgQmtsLgorICovCit2b2lkIHJlaXNlcmZzX3dyaXRlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCByZWlzZXJmc19zYl9pbmZvICpzYl9pID0gUkVJU0VSRlNfU0Iocyk7CisKKwlpZiAoc2JfaS0+bG9ja19vd25lciAhPSBjdXJyZW50KSB7CisJCW11dGV4X2xvY2soJnNiX2ktPmxvY2spOworCQlzYl9pLT5sb2NrX293bmVyID0gY3VycmVudDsKKwl9CisKKwkvKiBObyBuZWVkIHRvIHByb3RlY3QgaXQsIG9ubHkgdGhlIGN1cnJlbnQgdGFzayB0b3VjaGVzIGl0ICovCisJc2JfaS0+bG9ja19kZXB0aCsrOworfQorCit2b2lkIHJlaXNlcmZzX3dyaXRlX3VubG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiX2kgPSBSRUlTRVJGU19TQihzKTsKKworCS8qCisJICogQXJlIHdlIHVubG9ja2luZyB3aXRob3V0IGV2ZW4gaG9sZGluZyB0aGUgbG9jaz8KKwkgKiBTdWNoIGEgc2l0dWF0aW9uIG11c3QgcmFpc2UgYSBCVUcoKSBpZiB3ZSBkb24ndCB3YW50CisJICogdG8gY29ycnVwdCB0aGUgZGF0YS4KKwkgKi8KKwlCVUdfT04oc2JfaS0+bG9ja19vd25lciAhPSBjdXJyZW50KTsKKworCWlmICgtLXNiX2ktPmxvY2tfZGVwdGggPT0gLTEpIHsKKwkJc2JfaS0+bG9ja19vd25lciA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmc2JfaS0+bG9jayk7CisJfQorfQorCisvKgorICogSWYgd2UgYWxyZWFkeSBvd24gdGhlIGxvY2ssIGp1c3QgZXhpdCBhbmQgZG9uJ3QgaW5jcmVhc2UgdGhlIGRlcHRoLgorICogVXNlZnVsIHdoZW4gd2UgZG9uJ3Qgd2FudCB0byBsb2NrIG1vcmUgdGhhbiBvbmNlLgorICoKKyAqIFdlIGFsd2F5cyByZXR1cm4gdGhlIGxvY2tfZGVwdGggd2UgaGFkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQgcmVpc2VyZnNfd3JpdGVfbG9ja19vbmNlKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaSA9IFJFSVNFUkZTX1NCKHMpOworCisJaWYgKHNiX2ktPmxvY2tfb3duZXIgIT0gY3VycmVudCkgeworCQltdXRleF9sb2NrKCZzYl9pLT5sb2NrKTsKKwkJc2JfaS0+bG9ja19vd25lciA9IGN1cnJlbnQ7CisJCXJldHVybiBzYl9pLT5sb2NrX2RlcHRoKys7CisJfQorCisJcmV0dXJuIHNiX2ktPmxvY2tfZGVwdGg7Cit9CisKK3ZvaWQgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbG9ja19kZXB0aCkKK3sKKwlpZiAobG9ja19kZXB0aCA9PSAtMSkKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworfQorCisvKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBmb3JjZSBhIEJVRyBpZiBpdCBpcyBjYWxsZWQgd2l0aG91dCB0aGUgc3VwZXJibG9jaworICogd3JpdGUgbG9jayBoZWxkLiAgY2FsbGVyIGlzIHRoZSBzdHJpbmcgcHJpbnRlZCBqdXN0IGJlZm9yZSBjYWxsaW5nIEJVRygpCisgKi8KK3ZvaWQgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpjYWxsZXIpCit7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiX2kgPSBSRUlTRVJGU19TQihzYik7CisKKwlpZiAoc2JfaS0+bG9ja19kZXB0aCA8IDApCisJCXJlaXNlcmZzX3BhbmljKHNiLCAiJXMgY2FsbGVkIHdpdGhvdXQga2VybmVsIGxvY2sgaGVsZCAlZCIsCisJCQkgICAgICAgY2FsbGVyKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL25hbWVpLmMgYi9mcy9yZWlzZXJmcy9uYW1laS5jCmluZGV4IDI3MTU3OTEuLmUyOTZmZjcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL25hbWVpLmMKKysrIGIvZnMvcmVpc2VyZnMvbmFtZWkuYwpAQCAtMzI0LDYgKzMyNCw3IEBACiAJCQkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJaW50IHJldHZhbDsKKwlpbnQgbG9ja19kZXB0aDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwogCUlOSVRJQUxJWkVfUEFUSChwYXRoX3RvX2VudHJ5KTsKQEAgLTMzMSw3ICszMzIsMTMgQEAKIAlpZiAoUkVJU0VSRlNfTUFYX05BTUUoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkgPCBkZW50cnktPmRfbmFtZS5sZW4pCiAJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwogCi0JcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworCS8qCisJICogTWlnaHQgYmUgY2FsbGVkIHdpdGggb3Igd2l0aG91dCB0aGUgd3JpdGUgbG9jaywgbXVzdCBiZSBjYXJlZnVsCisJICogdG8gbm90IHJlY3Vyc2l2ZWx5IGhvbGQgaXQgaW4gY2FzZSB3ZSB3YW50IHRvIHJlbGVhc2UgdGhlIGxvY2sKKwkgKiBiZWZvcmUgcmVzY2hlZHVsaW5nLgorCSAqLworCWxvY2tfZGVwdGggPSByZWlzZXJmc193cml0ZV9sb2NrX29uY2UoZGlyLT5pX3NiKTsKKwogCWRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CiAJcmV0dmFsID0KIAkgICAgcmVpc2VyZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwKQEAgLTM0MSw3ICszNDgsNyBAQAogCQlpbm9kZSA9IHJlaXNlcmZzX2lnZXQoZGlyLT5pX3NiLAogCQkJCSAgICAgIChzdHJ1Y3QgY3B1X2tleSAqKSYoZGUuZGVfZGlyX2lkKSk7CiAJCWlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgewotCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2tfb25jZShkaXItPmlfc2IsIGxvY2tfZGVwdGgpOwogCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CiAJCX0KIApAQCAtMzUwLDcgKzM1Nyw3IEBACiAJCWlmIChJU19QUklWQVRFKGRpcikpCiAJCQlpbm9kZS0+aV9mbGFncyB8PSBTX1BSSVZBVEU7CiAJfQotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX3VubG9ja19vbmNlKGRpci0+aV9zYiwgbG9ja19kZXB0aCk7CiAJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewogCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CkBAIC03MjUsNiArNzMyLDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CiAJc3RydWN0IHJlaXNlcmZzX3NlY3VyaXR5X2hhbmRsZSBzZWN1cml0eTsKKwlpbnQgbG9ja19kZXB0aDsKIAkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCiAJaW50IGpiZWdpbl9jb3VudCA9CiAJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArCkBAIC03NDgsNyArNzU2LDcgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJamJlZ2luX2NvdW50ICs9IHJldHZhbDsKLQlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJbG9ja19kZXB0aCA9IHJlaXNlcmZzX3dyaXRlX2xvY2tfb25jZShkaXItPmlfc2IpOwogCiAJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAlpZiAocmV0dmFsKSB7CkBAIC03OTgsOCArODA2LDggQEAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotICAgICAgb3V0X2ZhaWxlZDoKLQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKK291dF9mYWlsZWQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2UoZGlyLT5pX3NiLCBsb2NrX2RlcHRoKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcmludHMuYyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCmluZGV4IDUzNmVhY2EuLmFkYmM2ZjUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3ByaW50cy5jCisrKyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCkBAIC0zNDksMTAgKzM0OSw2IEBACiAKICAgIC4gICovCiAKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWV4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7Ci0jZW5kaWYKLQogdm9pZCBfX3JlaXNlcmZzX3BhbmljKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmlkLAogCQkgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9yZXNpemUuYyBiL2ZzL3JlaXNlcmZzL3Jlc2l6ZS5jCmluZGV4IDE4YjMxNWQuLmIzYTk0ZDIgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3Jlc2l6ZS5jCisrKyBiL2ZzL3JlaXNlcmZzL3Jlc2l6ZS5jCkBAIC0xNDEsNyArMTQxLDkgQEAKIAogCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CiAJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOwogCQkJLy8gdXBkYXRlIGJpdG1hcF9pbmZvIHN0dWZmCiAJCQliaXRtYXBbaV0uZnJlZV9jb3VudCA9IHNiX2Jsb2Nrc2l6ZShzYikgKiA4IC0gMTsKIAkJCWJyZWxzZShiaCk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdHJlZS5jIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwppbmRleCBkMDM2ZWU1Li41ZmE3MTE4IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdHJlZS5jCisrKyBiL2ZzL3JlaXNlcmZzL3N0cmVlLmMKQEAgLTIyMiw5ICsyMjIsNiBAQAogCXJldHVybiBJVEVNX05PVF9GT1VORDsKIH0KIAotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKmN1cl90YjsKLSNlbmRpZgogCiAvKiBNaW5pbWFsIHBvc3NpYmxlIGtleS4gSXQgaXMgbmV2ZXIgaW4gdGhlIHRyZWUuICovCiBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5IE1JTl9LRVkgPSB7IDAsIDAsIHt7MCwgMH0sfSB9OwpAQCAtNTE5LDI1ICs1MTYsNDggQEAKIAogI2RlZmluZSBTRUFSQ0hfQllfS0VZX1JFQURBIDE2CiAKLS8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KLXN0YXRpYyB2b2lkIHNlYXJjaF9ieV9rZXlfcmVhZGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorLyoKKyAqIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEKKyAqIEl0IG1pZ2h0IHVubG9jayB0aGUgd3JpdGUgbG9jayBpZiB3ZSBuZWVkZWQgdG8gd2FpdCBmb3IgYSBibG9jaworICogdG8gYmUgcmVhZC4gTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpdCB3b24ndCByZWNvdmVyIHRoZSBsb2NrIHRvIGF2b2lkCisgKiBoaWdoIGNvbnRlbnRpb24gcmVzdWx0aW5nIGZyb20gdG9vIG11Y2ggbG9jayByZXF1ZXN0cywgZXNwZWNpYWxseQorICogdGhlIGNhbGxlciAoc2VhcmNoX2J5X2tleSkgd2lsbCBwZXJmb3JtIG90aGVyIHNjaGVkdWxlLXVuc2FmZQorICogb3BlcmF0aW9ucyBqdXN0IGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB1bmxvY2tlZAorICovCitzdGF0aWMgYm9vbCBzZWFyY2hfYnlfa2V5X3JlYWRhKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKIAkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKIAkJCQliX2Jsb2NrbnJfdCAqYiwgaW50IG51bSkKIHsKIAlpbnQgaSwgajsKKwlib29sIHVubG9ja2VkID0gZmFsc2U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJYmhbaV0gPSBzYl9nZXRibGsocywgYltpXSk7CiAJfQorCS8qCisJICogV2UgYXJlIGdvaW5nIHRvIHJlYWQgc29tZSBibG9ja3Mgb24gd2hpY2ggd2UKKwkgKiBoYXZlIGEgcmVmZXJlbmNlLiBJdCdzIHNhZmUsIHRob3VnaCB3ZSBtaWdodCBiZQorCSAqIHJlYWRpbmcgYmxvY2tzIGNvbmN1cnJlbnRseSBjaGFuZ2VkIGlmIHdlIHJlbGVhc2UKKwkgKiB0aGUgbG9jay4gQnV0IGl0J3Mgc3RpbGwgZmluZSBiZWNhdXNlIHdlIGNoZWNrIGxhdGVyCisJICogaWYgdGhlIHRyZWUgY2hhbmdlZAorCSAqLwogCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKIAkJLyoKIAkJICogbm90ZSwgdGhpcyBuZWVkcyBhdHRlbnRpb24gaWYgd2UgYXJlIGdldHRpbmcgcmlkIG9mIHRoZSBCS0wKIAkJICogeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBwcmVwYXJlZCBiaXQgaXNuJ3Qgc2V0IG9uIHRoaXMgYnVmZmVyCiAJCSAqLwotCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaFtqXSkpCisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoW2pdKSkgeworCQkJaWYgKCF1bmxvY2tlZCkgeworCQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwkJCQl1bmxvY2tlZCA9IHRydWU7CisJCQl9CiAJCQlsbF9yd19ibG9jayhSRUFEQSwgMSwgYmggKyBqKTsKKwkJfQogCQlicmVsc2UoYmhbal0pOwogCX0KKwlyZXR1cm4gdW5sb2NrZWQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjI1LDExICs2NDUsMjYgQEAKIAkJICAgaGF2ZSBhIHBvaW50ZXIgdG8gaXQuICovCiAJCWlmICgoYmggPSBsYXN0X2VsZW1lbnQtPnBlX2J1ZmZlciA9CiAJCSAgICAgc2JfZ2V0YmxrKHNiLCBibG9ja19udW1iZXIpKSkgeworCQkJYm9vbCB1bmxvY2tlZCA9IGZhbHNlOworCiAJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYgcmVhZGFfY291bnQgPiAxKQotCQkJCXNlYXJjaF9ieV9rZXlfcmVhZGEoc2IsIHJlYWRhX2JoLAorCQkJCS8qIG1heSB1bmxvY2sgdGhlIHdyaXRlIGxvY2sgKi8KKwkJCQl1bmxvY2tlZCA9IHNlYXJjaF9ieV9rZXlfcmVhZGEoc2IsIHJlYWRhX2JoLAogCQkJCQkJICAgIHJlYWRhX2Jsb2NrcywgcmVhZGFfY291bnQpOworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSB1bmxvY2tlZCB0aGUgd3JpdGUgbG9jaywKKwkJCSAqIHRoZW4gd2UgbmVlZCB0byBkbyB0aGF0IGhlcmUgYmVmb3JlIHJlYWRpbmcKKwkJCSAqIHRoZSBjdXJyZW50IGJsb2NrCisJCQkgKi8KKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSAmJiAhdW5sb2NrZWQpIHsKKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworCQkJCXVubG9ja2VkID0gdHJ1ZTsKKwkJCX0KIAkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CiAJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisKKwkJCWlmICh1bmxvY2tlZCkKKwkJCQlyZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKIAkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKIAkJCQlnb3RvIGlvX2Vycm9yOwogCQl9IGVsc2UgewpAQCAtNjczLDcgKzcwOCw3IEBACiAJCSAgICAgICAha2V5X2luX2J1ZmZlcihzZWFyY2hfcGF0aCwga2V5LCBzYiksCiAJCSAgICAgICAiUEFQLTUxMzA6IGtleSBpcyBub3QgaW4gdGhlIGJ1ZmZlciIpOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCQlpZiAoY3VyX3RiKSB7CisJCWlmIChSRUlTRVJGU19TQihzYiktPmN1cl90YikgewogCQkJcHJpbnRfY3VyX3RiKCI1MTQwIik7CiAJCQlyZWlzZXJmc19wYW5pYyhzYiwgIlBBUC01MTQwIiwKIAkJCQkgICAgICAgInNjaGVkdWxlIG9jY3VycmVkIGluIGRvX2JhbGFuY2UhIik7CkBAIC0xMDI0LDcgKzEwNTksOSBAQAogCQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGJsb2NrLCAxKTsKIAkJICAgIH0KIAorCQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKIAkJICAgIGNvbmRfcmVzY2hlZCgpOworCQkgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CiAKIAkJICAgIGlmIChpdGVtX21vdmVkICgmc19paCwgcGF0aCkpICB7CiAJCQluZWVkX3JlX3NlYXJjaCA9IDE7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCBmMGFkMDVmLi4zMzliMGJhIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTQ2NSw3ICs0NjUsNyBAQAogCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CiAJdGgudF90cmFuc19pZCA9IDA7CiAKLQlsb2NrX2tlcm5lbCgpOworCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7CiAKIAlpZiAocy0+c19kaXJ0KQogCQlyZWlzZXJmc193cml0ZV9zdXBlcihzKTsKQEAgLTQ5OSwxMCArNDk5LDEwIEBACiAKIAlyZWlzZXJmc19wcm9jX2luZm9fZG9uZShzKTsKIAorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwltdXRleF9kZXN0cm95KCZSRUlTRVJGU19TQihzKS0+bG9jayk7CiAJa2ZyZWUocy0+c19mc19pbmZvKTsKIAlzLT5zX2ZzX2luZm8gPSBOVUxMOwotCi0JdW5sb2NrX2tlcm5lbCgpOwogfQogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJlaXNlcmZzX2lub2RlX2NhY2hlcDsKQEAgLTU1NCwyNSArNTU0LDI4IEBACiAJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKIAogCWludCBlcnIgPSAwOworCWludCBsb2NrX2RlcHRoOworCiAJaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CiAJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJjbG0tNjAwNiIsCiAJCQkJICJ3cml0aW5nIGlub2RlICVsdSBvbiByZWFkb25seSBGUyIsCiAJCQkJIGlub2RlLT5pX2lubyk7CiAJCXJldHVybjsKIAl9Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJbG9ja19kZXB0aCA9IHJlaXNlcmZzX3dyaXRlX2xvY2tfb25jZShpbm9kZS0+aV9zYik7CiAKIAkvKiB0aGlzIGlzIHJlYWxseSBvbmx5IHVzZWQgZm9yIGF0aW1lIHVwZGF0ZXMsIHNvIHRoZXkgZG9uJ3QgaGF2ZQogCSAqKiB0byBiZSBpbmNsdWRlZCBpbiBPX1NZTkMgb3IgZnN5bmMKIAkgKi8KIAllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOwotCWlmIChlcnIpIHsKLQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwogCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKIAlqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCitvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2UoaW5vZGUtPmlfc2IsIGxvY2tfZGVwdGgpOwogfQogCiAjaWZkZWYgQ09ORklHX1FVT1RBCkBAIC0xMTY4LDExICsxMTcxLDE0IEBACiAJdW5zaWduZWQgaW50IHFmbXQgPSAwOwogI2lmZGVmIENPTkZJR19RVU9UQQogCWludCBpOworI2VuZGlmCiAKKwlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCisjaWZkZWYgQ09ORklHX1FVT1RBCiAJbWVtY3B5KHFmX25hbWVzLCBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lcywgc2l6ZW9mKHFmX25hbWVzKSk7CiAjZW5kaWYKIAotCWxvY2tfa2VybmVsKCk7CiAJcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHMpOwogCiAJaWYgKCFyZWlzZXJmc19wYXJzZV9vcHRpb25zCkBAIC0xMjk1LDEyICsxMzAxLDEyIEBACiAKIG91dF9vazoKIAlyZXBsYWNlX21vdW50X29wdGlvbnMocywgbmV3X29wdHMpOwotCXVubG9ja19rZXJuZWwoKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CiAJcmV0dXJuIDA7CiAKIG91dF9lcnI6CiAJa2ZyZWUobmV3X29wdHMpOwotCXVubG9ja19rZXJuZWwoKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTQwNCw3ICsxNDEwLDkgQEAKIHN0YXRpYyBpbnQgcmVyZWFkX21ldGFfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKIAlsbF9yd19ibG9jayhSRUFELCAxLCAmKFNCX0JVRkZFUl9XSVRIX1NCKHMpKSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwogCXdhaXRfb25fYnVmZmVyKFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKHMpOwogCWlmICghYnVmZmVyX3VwdG9kYXRlKFNCX0JVRkZFUl9XSVRIX1NCKHMpKSkgewogCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmcy0yNTA0IiwgImVycm9yIHJlYWRpbmcgdGhlIHN1cGVyIik7CiAJCXJldHVybiAxOwpAQCAtMTYxMyw3ICsxNjIxLDcgQEAKIAlzYmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKSB7CiAJCWVycnZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfYWxsb2M7CiAJfQogCXMtPnNfZnNfaW5mbyA9IHNiaTsKIAkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnM6IG5vbi1hZ2dyZXNzaXZlIHRhaWxzLCBSTyBvbiBlcnJvcnMgKi8KQEAgLTE2MjcsNiArMTYzNSwyMCBAQAogCS8qIHNldHVwIGRlZmF1bHQgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KIAlyZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMocyk7CiAKKwltdXRleF9pbml0KCZSRUlTRVJGU19TQihzKS0+bG9jayk7CisJUkVJU0VSRlNfU0IocyktPmxvY2tfZGVwdGggPSAtMTsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgYmtsLCB3aGljaCBhbHNvIHdhcyB0aGUgb2xkCisJICogbG9ja2luZyB1c2VkIGhlcmUuCisJICogZG9fam91cm5hbF9iZWdpbigpIHdpbGwgc29vbiBjaGVjayBpZiB3ZSBob2xkIHRoZSBsb2NrIChpZTogd2FzIHRoZQorCSAqIGJrbCkuIFRoaXMgaXMgbGlrZWx5IGJlY2F1c2UgZG9fam91cm5hbF9iZWdpbigpIGhhcyBzZXZlcmFsIGFub3RoZXIKKwkgKiBjYWxsZXJzIGJlY2F1c2UgYXQgdGhpcyB0aW1lLCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgbmVjZXNzYXJ5IHRvCisJICogcHJvdGVjdCBhZ2FpbnN0IGFueXRoaW5nLgorCSAqIEFueXdheSwgbGV0J3MgYmUgY29uc2VydmF0aXZlIGFuZCBsb2NrIGZvciBub3cuCisJICovCisJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwogCWpkZXZfbmFtZSA9IE5VTEw7CiAJaWYgKHJlaXNlcmZzX3BhcnNlX29wdGlvbnMKIAkgICAgKHMsIChjaGFyICopZGF0YSwgJihzYmktPnNfbW91bnRfb3B0KSwgJmJsb2NrcywgJmpkZXZfbmFtZSwKQEAgLTE4NTIsOSArMTg3NCwxMyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihzYmktPnNfd2FpdCkpOwogCXNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKIAorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwogCXJldHVybiAoMCk7CiAKIGVycm9yOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKK2Vycm9yX2FsbG9jOgogCWlmIChqaW5pdF9kb25lKSB7CS8qIGtpbGwgdGhlIGNvbW1pdCB0aHJlYWQsIGZyZWUgam91cm5hbCByYW0gKi8KIAkJam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IDY5MjViODMuLjU4YWE4ZTcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtOTc1LDcgKzk3NSw3IEBACiAJaW50IGVyciA9IDA7CiAKIAkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSBwcml2cm9vdCBsb2NhdGVkIHlldCAtIGdvIGZpbmQgaXQgKi8KLQltdXRleF9sb2NrKCZzLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCXJlaXNlcmZzX211dGV4X2xvY2tfc2FmZSgmcy0+c19yb290LT5kX2lub2RlLT5pX211dGV4LCBzKTsKIAlkZW50cnkgPSBsb29rdXBfb25lX2xlbihQUklWUk9PVF9OQU1FLCBzLT5zX3Jvb3QsCiAJCQkJc3RybGVuKFBSSVZST09UX05BTUUpKTsKIAlpZiAoIUlTX0VSUihkZW50cnkpKSB7CkBAIC0xMDA0LDE0ICsxMDA0LDE0IEBACiAJCWdvdG8gZXJyb3I7CiAKIAlpZiAoIXByaXZyb290LT5kX2lub2RlICYmICEobW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0JCW11dGV4X2xvY2soJnMtPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCXJlaXNlcmZzX211dGV4X2xvY2tfc2FmZSgmcy0+c19yb290LT5kX2lub2RlLT5pX211dGV4LCBzKTsKIAkJZXJyID0gY3JlYXRlX3ByaXZyb290KFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOwogCQltdXRleF91bmxvY2soJnMtPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJfQogCiAJaWYgKHByaXZyb290LT5kX2lub2RlKSB7CiAJCXMtPnNfeGF0dHIgPSByZWlzZXJmc194YXR0cl9oYW5kbGVyczsKLQkJbXV0ZXhfbG9jaygmcHJpdnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQlyZWlzZXJmc19tdXRleF9sb2NrX3NhZmUoJnByaXZyb290LT5kX2lub2RlLT5pX211dGV4LCBzKTsKIAkJaWYgKCFSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCkgewogCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCQkJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oWEFST09UX05BTUUsIHByaXZyb290LApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZGVidWcuYyBiL2ZzL3ViaWZzL2RlYnVnLmMKaW5kZXggZGJjMDkzYS4uOGE3NzFjNSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvZGVidWcuYworKysgYi9mcy91Ymlmcy9kZWJ1Zy5jCkBAIC0yMDE0LDcgKzIwMTQsNyBAQAogCQlpbnVtID0ga2V5X2ludW1fZmxhc2goYywgJmRlbnQtPmtleSk7CiAJCWZzY2tpMSA9IHJlYWRfYWRkX2lub2RlKGMsIHByaXYsIGludW0pOwogCQlpZiAoSVNfRVJSKGZzY2tpMSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoZnNja2kpOworCQkJZXJyID0gUFRSX0VSUihmc2NraTEpOwogCQkJdWJpZnNfZXJyKCJlcnJvciAlZCB3aGlsZSBwcm9jZXNzaW5nIGVudHJ5IG5vZGUgYW5kICIKIAkJCQkgICJ0cnlpbmcgdG8gZmluZCBwYXJlbnQgaW5vZGUgbm9kZSAlbHUiLAogCQkJCSAgZXJyLCAodW5zaWduZWQgbG9uZylpbnVtKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2ZpbGUuYyBiL2ZzL3ViaWZzL2ZpbGUuYwppbmRleCAxMDA5YWRjLi4zOTg0OWY4IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9maWxlLmMKKysrIGIvZnMvdWJpZnMvZmlsZS5jCkBAIC0xMzg5LDcgKzEzODksNiBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKIHsKIAlpbnQgZXJyOwotCXNzaXplX3QgcmV0OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmctPmhvc3Q7CiAJc3RydWN0IHViaWZzX2luZm8gKmMgPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOwogCkBAIC0xMzk3LDE3ICsxMzk2LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAocmV0ID4gMCAmJiAoSVNfU1lOQyhpbm9kZSkgfHwgaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fU1lOQykpIHsKLQkJZXJyID0gdWJpZnNfc3luY193YnVmc19ieV9pbm9kZShjLCBpbm9kZSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOwogfQogCiBzdGF0aWMgaW50IHViaWZzX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvcmVjb3ZlcnkuYyBiL2ZzL3ViaWZzL3JlY292ZXJ5LmMKaW5kZXggZjk0ZGRmNy4uODY4YTU1ZSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvcmVjb3ZlcnkuYworKysgYi9mcy91Ymlmcy9yZWNvdmVyeS5jCkBAIC0yMyw3ICsyMyw3IEBACiAvKgogICogVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIG5lZWRlZCB0byByZWNvdmVyIGZyb20gdW5jbGVhbiB1bi1tb3VudHMuCiAgKiBXaGVuIFVCSUZTIGlzIG1vdW50ZWQsIGl0IGNoZWNrcyBhIGZsYWcgb24gdGhlIG1hc3RlciBub2RlIHRvIGRldGVybWluZSBpZgotICogYW4gdW4tbW91bnQgd2FzIGNvbXBsZXRlZCBzdWNlc3NmdWxseS4gSWYgbm90LCB0aGUgcHJvY2VzcyBvZiBtb3VudGluZworICogYW4gdW4tbW91bnQgd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIElmIG5vdCwgdGhlIHByb2Nlc3Mgb2YgbW91bnRpbmcKICAqIGluY29ycGFyYXRlcyBhZGRpdGlvbmFsIGNoZWNraW5nIGFuZCBmaXhpbmcgb2Ygb24tZmxhc2ggZGF0YSBzdHJ1Y3R1cmVzLgogICogVUJJRlMgYWx3YXlzIGNsZWFucyBhd2F5IGFsbCByZW1uYW50cyBvZiBhbiB1bmNsZWFuIHVuLW1vdW50LCBzbyB0aGF0CiAgKiBlcnJvcnMgZG8gbm90IGFjY3VtdWxhdGUuIEhvd2V2ZXIgVUJJRlMgZGVmZXJzIHJlY292ZXJ5IGlmIGl0IGlzIG1vdW50ZWQKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IDMzM2UxODEuLjk0M2FkNTYgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtMTg0MiwyMiArMTg0MiwzMiBAQAogICogQG5hbWU6IFVCSSB2b2x1bWUgbmFtZQogICogQG1vZGU6IFVCSSB2b2x1bWUgb3BlbiBtb2RlCiAgKgotICogVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBzcGVjaWZ5IFVCSSB2b2x1bWVzIHdoZW4gbW91bnRpbmcgVUJJRlM6Ci0gKiBvIHViaVhfWSAgICAtIFVCSSBkZXZpY2UgbnVtYmVyIFgsIHZvbHVtZSBZOwotICogbyB1YmlZICAgICAgLSBVQkkgZGV2aWNlIG51bWJlciAwLCB2b2x1bWUgWTsKKyAqIFRoZSBwcmltYXJ5IG1ldGhvZCBvZiBtb3VudGluZyBVQklGUyBpcyBieSBzcGVjaWZ5aW5nIHRoZSBVQkkgdm9sdW1lCisgKiBjaGFyYWN0ZXIgZGV2aWNlIG5vZGUgcGF0aC4gSG93ZXZlciwgVUJJRlMgbWF5IGFsc28gYmUgbW91bnRlZCB3aXRob3VnIGFueQorICogY2hhcmFjdGVyIGRldmljZSBub2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgKgorICogbyB1YmlYX1kgICAgLSBtb3VudCBVQkkgZGV2aWNlIG51bWJlciBYLCB2b2x1bWUgWTsKKyAqIG8gdWJpWSAgICAgIC0gbW91bnQgVUJJIGRldmljZSBudW1iZXIgMCwgdm9sdW1lIFk7CiAgKiBvIHViaVg6TkFNRSAtIG1vdW50IFVCSSBkZXZpY2UgWCwgdm9sdW1lIHdpdGggbmFtZSBOQU1FOwogICogbyB1Ymk6TkFNRSAgLSBtb3VudCBVQkkgZGV2aWNlIDAsIHZvbHVtZSB3aXRoIG5hbWUgTkFNRS4KICAqCiAgKiBBbHRlcm5hdGl2ZSAnIScgc2VwYXJhdG9yIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgJzonIChiZWNhdXNlIHNvbWUgc2hlbGxzCiAgKiBsaWtlIGJ1c3lib3ggbWF5IGludGVycHJldCAnOicgYXMgYW4gTkZTIGhvc3QgbmFtZSBzZXBhcmF0b3IpLiBUaGlzIGZ1bmN0aW9uCi0gKiByZXR1cm5zIHViaSB2b2x1bWUgb2JqZWN0IGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCi0gKiBjYXNlIG9mIGZhaWx1cmUuCisgKiByZXR1cm5zIFVCSSB2b2x1bWUgZGVzY3JpcHRpb24gb2JqZWN0IGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZQorICogZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpvcGVuX3ViaShjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSkKIHsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1Ymk7CiAJaW50IGRldiwgdm9sOwogCWNoYXIgKmVuZHB0cjsKIAorCS8qIEZpcnN0LCB0cnkgdG8gb3BlbiB1c2luZyB0aGUgZGV2aWNlIG5vZGUgcGF0aCBtZXRob2QgKi8KKwl1YmkgPSB1Ymlfb3Blbl92b2x1bWVfcGF0aChuYW1lLCBtb2RlKTsKKwlpZiAoIUlTX0VSUih1YmkpKQorCQlyZXR1cm4gdWJpOworCisJLyogVHJ5IHRoZSAibm9kZXYiIG1ldGhvZCAqLwogCWlmIChuYW1lWzBdICE9ICd1JyB8fCBuYW1lWzFdICE9ICdiJyB8fCBuYW1lWzJdICE9ICdpJykKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaCBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaAppbmRleCA2NTMzZWFkLi5hMmMxNmJjIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCkBAIC05OCw3ICs5OCw3IEBACiAjZGVmaW5lIGRxX2ZsYWdzCXFfbGlzdHMuZHFtX2ZsYWdzCiAKIC8qCi0gKiBMb2NrIGhpZXJhY2h5IGZvciBxX3Fsb2NrOgorICogTG9jayBoaWVyYXJjaHkgZm9yIHFfcWxvY2s6CiAgKglYRlNfUUxPQ0tfTk9STUFMIGlzIHRoZSBpbXBsaWNpdCBkZWZhdWx0LAogICogCVhGU19RTE9DS19ORVNURUQgaXMgdGhlIGRxdW90IHdpdGggdGhlIGhpZ2hlciBpZCBpbiB4ZnNfZHFsb2NrMgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggZTcyM2IwZi4uNWUxYWQzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNDcsNyArNDcsNyBAQAogCiAvKiBDdXJyZW50IEFDUElDQSBzdWJzeXN0ZW0gdmVyc2lvbiBpbiBZWVlZTU1ERCBmb3JtYXQgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwOTA5MDMKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMDkxMTEyCiAKICNpbmNsdWRlICJhY3R5cGVzLmgiCiAjaW5jbHVkZSAiYWN0YmwuaCIKQEAgLTE1NCw3ICsxNTQsOCBAQAogYWNwaV93YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCiAJCSAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCiAJCSAgICB1MzIgbWF4X2RlcHRoLAotCQkgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICBhY3BpX3dhbGtfY2FsbGJhY2sgcHJlX29yZGVyX3Zpc2l0LAorCQkgICAgYWNwaV93YWxrX2NhbGxiYWNrIHBvc3Rfb3JkZXJfdmlzaXQsCiAJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIAogYWNwaV9zdGF0dXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oCmluZGV4IDRjOGQwYWYuLmZiMmQ2M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaApAQCAtNDcsNyArNDcsNyBAQAogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUCkKIAotLyogbWVtbWFwIGlzIHZpcnR1YWxseSBjb250aWdpb3VzLiAgKi8KKy8qIG1lbW1hcCBpcyB2aXJ0dWFsbHkgY29udGlndW91cy4gICovCiAjZGVmaW5lIF9fcGZuX3RvX3BhZ2UocGZuKQkodm1lbW1hcCArIChwZm4pKQogI2RlZmluZSBfX3BhZ2VfdG9fcGZuKHBhZ2UpCSh1bnNpZ25lZCBsb25nKSgocGFnZSkgLSB2bWVtbWFwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaAppbmRleCBkNzZiNjZhLi43YzM4YzE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5pc3RkLmgKQEAgLTYzMSw3ICs2MzEsNyBAQAogICogdGhlc2UgYXJlIHByb3ZpZGVkIGZvciBib3RoIHJldmlldyBhbmQgYXMgYSBwb3J0aW5nCiAgKiBoZWxwIGZvciB0aGUgQyBsaWJyYXJ5IHZlcnNpb24uCiAqCi0gKiBMYXN0IGNoYW5jZTogYXJlIGFueSBvZiB0aGVzZSBpbXBvcnRhbnQgZW5vdWdodCB0bworICogTGFzdCBjaGFuY2U6IGFyZSBhbnkgb2YgdGhlc2UgaW1wb3J0YW50IGVub3VnaCB0bwogICogZW5hYmxlIGJ5IGRlZmF1bHQ/CiAgKi8KICNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNDQUxMX05PX0FUCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmgKaW5kZXggY2I1N2MzMC4uZWIxMzBiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaApAQCAtMzksNyArMzksNyBAQAogI2lmbmRlZiBDQ0lTU19DTURfSAogLy8gVGhpcyBkZWZpbmVzIGFyZSBkdXBsaWNhdGVkIGluIGNjaXNzX2NtZC5oIGluIHRoZSBkcml2ZXIgZGlyZWN0b3J5IAogCi0vL2dlbmVyYWwgYm91bmRhcnkgZGVmaW50aW9ucworLy9nZW5lcmFsIGJvdW5kYXJ5IGRlZmluaXRpb25zCiAjZGVmaW5lIFNFTlNFSU5GT0JZVEVTICAgICAgICAgIDMyLy9ub3RlIHRoYXQgdGhpcyB2YWx1ZSBtYXkgdmFyeSBiZXR3ZWVuIGhvc3QgaW1wbGVtZW50YXRpb25zCiAKIC8vQ29tbWFuZCBTdGF0dXMgdmFsdWUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2hpby5oIGIvaW5jbHVkZS9saW51eC9jaGlvLmgKaW5kZXggNTE5MjQ4ZC4uZDliYWM3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jaGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9jaGlvLmgKQEAgLTIxLDcgKzIxLDcgQEAKICAqICAgIHF1ZXJ5IHZlbmRvci1zcGVjaWZpYyBlbGVtZW50IHR5cGVzCiAgKgogICogICAgYWNjZXNzaW5nIGVsZW1lbnRzIHdvcmtzIGJ5IHNwZWNpZmluZyB0eXBlIGFuZCB1bml0IG9mIHRoZSBlbGVtZW50LgotICogICAgZm9yIGVhbXBsZSwgc3RvcmFnZSBlbGVtZW50cyBhcmUgYWRkcmVzc2VkIHdpdGggdHlwZSA9IENIRVRfU1QgYW5kCisgKiAgICBmb3IgZXhhbXBsZSwgc3RvcmFnZSBlbGVtZW50cyBhcmUgYWRkcmVzc2VkIHdpdGggdHlwZSA9IENIRVRfU1QgYW5kCiAgKiAgICB1bml0ID0gMCAuLiBjcF9uc2xvdHMtMQogICoKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbS1sb2ctdXNlcnNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaAppbmRleCA4YTFmOTcyLi4wYzNjM2EyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaApAQCAtMzYzLDcgKzM2Myw3IEBACiAgKiB2YXJpb3VzIHJlcXVlc3QgdHlwZXMgYWJvdmUuICBUaGUgcmVtYWluaW5nIDI0LWJpdHMgYXJlIGN1cnJlbnRseQogICogc2V0IHRvIHplcm8gYW5kIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY29tcGF0aWJpbGl0eSBjb25jZXJucy4KICAqCi0gKiBVc2VyLXNwYWNlIHNob3VsZCBhbHdheXMgdXNlIERNX1VMT0dfUkVRVUVTVF9UWVBFIHRvIGFxdWlyZSB0aGUKKyAqIFVzZXItc3BhY2Ugc2hvdWxkIGFsd2F5cyB1c2UgRE1fVUxPR19SRVFVRVNUX1RZUEUgdG8gYWNxdWlyZSB0aGUKICAqIHJlcXVlc3QgdHlwZSBmcm9tIHRoZSAncmVxdWVzdF90eXBlJyBmaWVsZCB0byBtYWludGFpbiBmb3J3YXJkIGNvbXBhdGliaWxpdHkuCiAgKi8KICNkZWZpbmUgRE1fVUxPR19SRVFVRVNUX01BU0sgMHhGRgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IGRlOWM3MjIuLjM2OTc2N2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTc2Myw2ICs3NjMsNyBAQAogCSAqICB0YWtlcyBvdmVyOyBhY2NlbGVyYXRpb24gZW5naW5lIHNob3VsZCBiZSBpbiBhIHF1aWVzY2VudCBzdGF0ZSAqLwogCiAvKiBoaW50cyAqLworI2RlZmluZSBGQklORk9fVklSVEZCCQkweDAwMDQgLyogRkIgaXMgU3lzdGVtIFJBTSwgbm90IGRldmljZS4gKi8KICNkZWZpbmUgRkJJTkZPX1BBUlRJQUxfUEFOX09LCTB4MDA0MCAvKiBvdHcgdXNlIHBhbiBvbmx5IGZvciBkb3VibGUtYnVmZmVyaW5nICovCiAjZGVmaW5lIEZCSU5GT19SRUFEU19GQVNUCTB4MDA4MCAvKiBzb2Z0LWNvcHkgZmFzdGVyIHRoYW4gcmVuZGVyaW5nICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLmggYi9pbmNsdWRlL2xpbnV4L2hpZC5oCmluZGV4IDEwZjYyODQuLjg3MDkzNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtMzEyLDYgKzMxMiw3IEBACiAjZGVmaW5lIEhJRF9RVUlSS19NVUxUSV9JTlBVVAkJCTB4MDAwMDAwNDAKICNkZWZpbmUgSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVFMJCTB4MDAwMTAwMDAKICNkZWZpbmUgSElEX1FVSVJLX0ZVTExTUEVFRF9JTlRFUlZBTAkJMHgxMDAwMDAwMAorI2RlZmluZSBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTCQkweDIwMDAwMDAwCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgb2YgdGhlIHBhcnNlci4gVGhpcyBpbmZvcm1hdGlvbiBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggZTQxMzVkNi4uMGVjNjEyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC0xMjUsOCArMTI1LDggQEAKICAqIFRpbWVvdXRzIGZvciB2YXJpb3VzIG9wZXJhdGlvbnM6CiAgKi8KIGVudW0gewotCS8qIHNwZWMgYWxsb3dzIHVwIHRvIDIwbXMgKi8KLQlXQUlUX0RSUQk9IEhaIC8gMTAsCS8qIDEwMG1zICovCisJLyogc3BlYyBhbGxvd3MgdXAgdG8gMjBtcywgYnV0IENGIGNhcmRzIGFuZCBTU0QgZHJpdmVzIG5lZWQgbW9yZSAqLworCVdBSVRfRFJRCT0gMSAqIEhaLAkvKiAxcyAqLwogCS8qIHNvbWUgbGFwdG9wcyBhcmUgdmVyeSBzbG93ICovCiAJV0FJVF9SRUFEWQk9IDUgKiBIWiwJLyogNXMgKi8KIAkvKiBzaG91bGQgYmUgbGVzcyB0aGFuIDNtcyAoPyksIGlmIGFsbCBBVEFQSSBDRCBpcyBjbG9zZWQgYXQgYm9vdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbjYuaCBiL2luY2x1ZGUvbGludXgvaW42LmgKaW5kZXggZGZhMjkxNi4uYmQ1NWM2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luNi5oCkBAIC0xMTAsNyArMTEwLDcgQEAKICNkZWZpbmUgSVBWNl9GTE9XSU5GT19GTE9XTEFCRUwJCTB4MDAwZmZmZmYKICNkZWZpbmUgSVBWNl9GTE9XSU5GT19QUklPUklUWQkJMHgwZmYwMDAwMAogCi0vKiBUaGVzZSBkZWZpbnRpb25zIGFyZSBvYnNvbGV0ZSAqLworLyogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIG9ic29sZXRlICovCiAjZGVmaW5lIElQVjZfUFJJT1JJVFlfVU5DSEFSQUNURVJJWkVECTB4MDAwMAogI2RlZmluZSBJUFY2X1BSSU9SSVRZX0ZJTExFUgkJMHgwMTAwCiAjZGVmaW5lIElQVjZfUFJJT1JJVFlfVU5BVFRFTkRFRAkweDAyMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQtcG9sbGRldi5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC1wb2xsZGV2LmgKaW5kZXggNTk3YTAwNy4uNWUzZGRkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC1wb2xsZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC1wb2xsZGV2LmgKQEAgLTE0LDEyICsxNCwxOSBAQAogCiAvKioKICAqIHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2IC0gc2ltcGxlIHBvbGxlZCBpbnB1dCBkZXZpY2UKLSAqIEBwcml2YXRlOiBwcml2YXRlIGRyaXZlciBkYXRhCi0gKiBAZmx1c2g6IGRyaXZlci1zdXBwbGllZCBtZXRob2QgdGhhdCBmbHVzaGVzIGRldmljZSdzIHN0YXRlIHVwb24KLSAqCW9wZW5pbmcgKG9wdGlvbmFsKQorICogQHByaXZhdGU6IHByaXZhdGUgZHJpdmVyIGRhdGEuCisgKiBAb3BlbjogZHJpdmVyLXN1cHBsaWVkIG1ldGhvZCB0aGF0IHByZXBhcmVzIGRldmljZSBmb3IgcG9sbGluZworICoJKGVuYWJsZWQgdGhlIGRldmljZSBhbmQgbWF5YmUgZmx1c2hlcyBkZXZpY2Ugc3RhdGUpLgorICogQGNsb3NlOiBkcml2ZXItc3VwcGxpZWQgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHdoZW4gZGV2aWNlIGlzIG5vCisgKglsb25nZXIgYmVpbmcgcG9sbGVkLiBVc2VkIHRvIHB1dCBkZXZpY2UgaW50byBsb3cgcG93ZXIgbW9kZS4KICAqIEBwb2xsOiBkcml2ZXItc3VwcGxpZWQgbWV0aG9kIHRoYXQgcG9sbHMgdGhlIGRldmljZSBhbmQgcG9zdHMKICAqCWlucHV0IGV2ZW50cyAobWFuZGF0b3J5KS4KLSAqIEBwb2xsX2ludGVydmFsOiBzcGVjaWZpZXMgaG93IG9mdGVuIHRoZSBwb2xsKCkgbWV0aG9kIHNob3VkbCBiZSBjYWxsZWQuCisgKiBAcG9sbF9pbnRlcnZhbDogc3BlY2lmaWVzIGhvdyBvZnRlbiB0aGUgcG9sbCgpIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLgorICoJRGVmYXVsdHMgdG8gNTAwIG1zZWMgdW5sZXNzIG92ZXJyaWRlbiB3aGVuIHJlZ2lzdGVyaW5nIHRoZSBkZXZpY2UuCisgKiBAcG9sbF9pbnRlcnZhbF9tYXg6IHNwZWNpZmllcyB1cHBlciBib3VuZCBmb3IgdGhlIHBvbGwgaW50ZXJ2YWwuCisgKglEZWZhdWx0cyB0byB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBAcG9sbF9pbnRlcnZhbC4KKyAqIEBwb2xsX2ludGVydmFsX21pbjogc3BlY2lmaWVzIGxvd2VyIGJvdW5kIGZvciB0aGUgcG9sbCBpbnRlcnZhbC4KKyAqCURlZmF1bHRzIHRvIDAuCiAgKiBAaW5wdXQ6IGlucHV0IGRldmljZSBzdHJ1Y3RpcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb2xsZWQgZGV2aWNlLgogICoJTXVzdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBieSB0aGUgZHJpdmVyIChpZCwgbmFtZSwgcGh5cywgYml0cykuCiAgKgpAQCAtMzAsMTEgKzM3LDE2IEBACiBzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiB7CiAJdm9pZCAqcHJpdmF0ZTsKIAotCXZvaWQgKCpmbHVzaCkoc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmRldik7CisJdm9pZCAoKm9wZW4pKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpkZXYpOworCXZvaWQgKCpjbG9zZSkoc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmRldik7CiAJdm9pZCAoKnBvbGwpKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpkZXYpOwogCXVuc2lnbmVkIGludCBwb2xsX2ludGVydmFsOyAvKiBtc2VjICovCisJdW5zaWduZWQgaW50IHBvbGxfaW50ZXJ2YWxfbWF4OyAvKiBtc2VjICovCisJdW5zaWduZWQgaW50IHBvbGxfaW50ZXJ2YWxfbWluOyAvKiBtc2VjICovCiAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKworLyogcHJpdmF0ZTogKi8KIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0LmggYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKaW5kZXggODRiNTAxYS4uN2JlOGE2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQuaApAQCAtODk1LDcgKzg5NSw3IEBACiAJc3RydWN0IGZmX2VudmVsb3BlIGVudmVsb3BlOwogCiAJX191MzIgY3VzdG9tX2xlbjsKLQlfX3MxNiAqY3VzdG9tX2RhdGE7CisJX19zMTYgX191c2VyICpjdXN0b21fZGF0YTsKIH07CiAKIC8qKgpAQCAtMTAyMSw5ICsxMDIxLDEyIEBACiAgKiBAa2V5Y29kZXNpemU6IHNpemUgb2YgZWxlbWVudHMgaW4ga2V5Y29kZSB0YWJsZQogICogQGtleWNvZGU6IG1hcCBvZiBzY2FuY29kZXMgdG8ga2V5Y29kZXMgZm9yIHRoaXMgZGV2aWNlCiAgKiBAc2V0a2V5Y29kZTogb3B0aW9uYWwgbWV0aG9kIHRvIGFsdGVyIGN1cnJlbnQga2V5bWFwLCB1c2VkIHRvIGltcGxlbWVudAotICoJc3BhcnNlIGtleW1hcHMuIElmIG5vdCBzdXBwbGllZCBkZWZhdWx0IG1lY2hhbmlzbSB3aWxsIGJlIHVzZWQKKyAqCXNwYXJzZSBrZXltYXBzLiBJZiBub3Qgc3VwcGxpZWQgZGVmYXVsdCBtZWNoYW5pc20gd2lsbCBiZSB1c2VkLgorICoJVGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgd2hpbGUgaG9sZGluZyBldmVudF9sb2NrIGFuZCB0aHVzIG11c3QKKyAqCW5vdCBzbGVlcAogICogQGdldGtleWNvZGU6IG9wdGlvbmFsIG1ldGhvZCB0byByZXRyaWV2ZSBjdXJyZW50IGtleW1hcC4gSWYgbm90IHN1cHBsaWVkCi0gKglkZWZhdWx0IG1lY2hhbmlzbSB3aWxsIGJlIHVzZWQKKyAqCWRlZmF1bHQgbWVjaGFuaXNtIHdpbGwgYmUgdXNlZC4gVGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgd2hpbGUKKyAqCWhvbGRpbmcgZXZlbnRfbG9jayBhbmQgdGh1cyBtdXN0IG5vdCBzbGVlcAogICogQGZmOiBmb3JjZSBmZWVkYmFjayBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgaWYgZGV2aWNlCiAgKglzdXBwb3J0cyBmb3JjZSBmZWVkYmFjayBlZmZlY3RzCiAgKiBAcmVwZWF0X2tleTogc3RvcmVzIGtleSBjb2RlIG9mIHRoZSBsYXN0IGtleSBwcmVzc2VkOyB1c2VkIHRvIGltcGxlbWVudApAQCAtMTA0MCw2ICsxMDQzLDcgQEAKICAqIEBhYnNtaW46IG1pbmltdW0gdmFsdWVzIGZvciBldmVudHMgY29taW5nIGZyb20gYWJzb2x1dGUgYXhlcwogICogQGFic2Z1eno6IGRlc2NyaWJlcyBub2lzaW5lc3MgZm9yIGF4ZXMKICAqIEBhYnNmbGF0OiBzaXplIG9mIHRoZSBjZW50ZXIgZmxhdCBwb3NpdGlvbiAodXNlZCBieSBqb3lkZXYpCisgKiBAYWJzcmVzOiByZXNvbHV0aW9uIHVzZWQgZm9yIGV2ZW50cyBjb21pbmcgZm9ybSBhYnNvbHV0ZSBheGVzCiAgKiBAb3BlbjogdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHZlcnkgZmlyc3QgdXNlciBjYWxscwogICoJaW5wdXRfb3Blbl9kZXZpY2UoKS4gVGhlIGRyaXZlciBtdXN0IHByZXBhcmUgdGhlIGRldmljZQogICoJdG8gc3RhcnQgZ2VuZXJhdGluZyBldmVudHMgKHN0YXJ0IHBvbGxpbmcgdGhyZWFkLApAQCAtMTI5NCw2ICsxMjk4LDkgQEAKIGludCBfX211c3RfY2hlY2sgaW5wdXRfcmVnaXN0ZXJfaGFuZGxlcihzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqKTsKIHZvaWQgaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGVyKHN0cnVjdCBpbnB1dF9oYW5kbGVyICopOwogCitpbnQgaW5wdXRfaGFuZGxlcl9mb3JfZWFjaF9oYW5kbGUoc3RydWN0IGlucHV0X2hhbmRsZXIgKiwgdm9pZCAqZGF0YSwKKwkJCQkgIGludCAoKmZuKShzdHJ1Y3QgaW5wdXRfaGFuZGxlICosIHZvaWQgKikpOworCiBpbnQgaW5wdXRfcmVnaXN0ZXJfaGFuZGxlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKik7CiB2b2lkIGlucHV0X3VucmVnaXN0ZXJfaGFuZGxlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmgKaW5kZXggYjNjZDQyZDUuLjNiZDAxOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oCkBAIC00MSw2ICs0MSw5IEBACiAgKiBAY29sX3NjYW5fZGVsYXlfdXM6IGRlbGF5LCBtZWFzdXJlZCBpbiBtaWNyb3NlY29uZHMsIHRoYXQgaXMKICAqCW5lZWRlZCBiZWZvcmUgd2UgY2FuIGtleXBhZCBhZnRlciBhY3RpdmF0aW5nIGNvbHVtbiBncGlvCiAgKiBAZGVib3VuY2VfbXM6IGRlYm91bmNlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcworICogQGFjdGl2ZV9sb3c6IGdwaW8gcG9sYXJpdHkKKyAqIEB3YWtldXA6IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRldmljZSBzaG91bGQgYmUgc2V0IHVwIGFzIHdha2V1cAorICoJc291cmNlCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBwbGF0Zm9ybS1zcGVjaWZpYyBkYXRhIHRoYXQgdXNlIHVzZWQgYnkKICAqIG1hdHJpeF9rZXlwYWQgZHJpdmVyIHRvIHBlcmZvcm0gcHJvcGVyIGluaXRpYWxpemF0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9zaF9rZXlzYy5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC9zaF9rZXlzYy5oCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIGFyY2gvc2gvaW5jbHVkZS9hc20vc2hfa2V5c2MuaApyZW5hbWUgdG8gaW5jbHVkZS9saW51eC9pbnB1dC9zaF9rZXlzYy5oCmluZGV4IDRhNjViMWUuLmMyMTFiNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vc2hfa2V5c2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0L3NoX2tleXNjLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0tFWVNDX0hfXwotI2RlZmluZSBfX0FTTV9LRVlTQ19IX18KKyNpZm5kZWYgX19TSF9LRVlTQ19IX18KKyNkZWZpbmUgX19TSF9LRVlTQ19IX18KIAogI2RlZmluZSBTSF9LRVlTQ19NQVhLRVlTIDMwCiAKQEAgLTExLDQgKzExLDQgQEAKIAlpbnQga2V5Y29kZXNbU0hfS0VZU0NfTUFYS0VZU107CiB9OwogCi0jZW5kaWYgLyogX19BU01fS0VZU0NfSF9fICovCisjZW5kaWYgLyogX19TSF9LRVlTQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkYjYyMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oCkBAIC0wLDAgKzEsNjIgQEAKKyNpZm5kZWYgX1NQQVJTRV9LRVlNQVBfSAorI2RlZmluZSBfU1BBUlNFX0tFWU1BUF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRG1pdHJ5IFRvcm9raG92CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjZGVmaW5lIEtFX0VORAkJMAkvKiBJbmRpY2F0ZXMgZW5kIG9mIGtleW1hcCAqLworI2RlZmluZSBLRV9LRVkJCTEJLyogT3JkaW5hcnkga2V5L2J1dHRvbiAqLworI2RlZmluZSBLRV9TVwkJMgkvKiBTd2l0Y2ggKHByZWRldGVybWluZWQgdmFsdWUpICovCisjZGVmaW5lIEtFX1ZTVwkJMwkvKiBTd2l0Y2ggKHZhbHVlIHN1cHBsaWVkIGF0IHJ1bnRpbWUpICovCisjZGVmaW5lIEtFX0lHTk9SRQk0CS8qIEtub3duIGVudHJ5IHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyNkZWZpbmUgS0VfTEFTVAkJS0VfSUdOT1JFCisKKy8qKgorICogc3RydWN0IGtleV9lbnRyeSAtIGtleW1hcCBlbnRyeSBmb3IgdXNlIGluIHNwYXJzZSBrZXltYXAKKyAqIEB0eXBlOiBUeXBlIG9mIHRoZSBrZXkgZW50cnkgKEtFX0tFWSwgS0VfU1csIEtFX1ZTVywgS0VfRU5EKTsKKyAqCWRyaXZlcnMgYXJlIGFsbG93ZWQgdG8gZXh0ZW5kIHRoZSBsaXN0IHdpdGggdGhlaXIgb3duCisgKglwcml2YXRlIGRlZmluaXRpb25zLgorICogQGNvZGU6IERldmljZS1zcGVjaWZpYyBkYXRhIGlkZW50aWZ5aW5nIHRoZSBidXR0b24vc3dpdGNoCisgKiBAa2V5Y29kZTogS0VZXyogY29kZSBhc3NpZ25lZCB0byBhIGtleS9idXR0b24KKyAqIEBzdy5jb2RlOiBTV18qIGNvZGUgYXNzaWduZWQgdG8gYSBzd2l0Y2gKKyAqIEBzdy52YWx1ZTogVmFsdWUgdGhhdCBzaG91bGQgYmUgc2VudCBpbiBhbiBpbnB1dCBldmVuIHdoZW4gS0VfU1cKKyAqCXN3aXRjaCBpcyB0b2dnbGVkLiBLRV9WU1cgc3dpdGNoZXMgaWdub3JlIHRoaXMgZmllbGQgYW5kCisgKglleHBlY3QgZHJpdmVyIHRvIHN1cHBseSB2YWx1ZSBmb3IgdGhlIGV2ZW50LgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gYSBzcGFyc2Uga2V5bWFwIHVzZWQgYnkgc29tZQorICogaW5wdXQgZGV2aWNlcyBmb3Igd2hpY2ggdHJhZGl0aW9uYWwgdGFibGUtYmFzZWQgYXBwcm9hY2ggaXMgbm90CisgKiBzdWl0YWJsZS4KKyAqLworc3RydWN0IGtleV9lbnRyeSB7CisJaW50IHR5cGU7CQkvKiBTZWUgS0VfKiBhYm92ZSAqLworCXUzMiBjb2RlOworCXVuaW9uIHsKKwkJdTE2IGtleWNvZGU7CQkvKiBGb3IgS0VfS0VZICovCisJCXN0cnVjdCB7CQkvKiBGb3IgS0VfU1csIEtFX1ZTVyAqLworCQkJdTggY29kZTsKKwkJCXU4IHZhbHVlOwkvKiBGb3IgS0VfU1csIGlnbm9yZWQgYnkgS0VfVlNXICovCisJCX0gc3c7CisJfTsKK307CisKK3N0cnVjdCBrZXlfZW50cnkgKnNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9zY2FuY29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IGNvZGUpOworc3RydWN0IGtleV9lbnRyeSAqc3BhcnNlX2tleW1hcF9lbnRyeV9mcm9tX2tleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LAorCQkJCQkJICAgdW5zaWduZWQgaW50IGNvZGUpOworaW50IHNwYXJzZV9rZXltYXBfc2V0dXAoc3RydWN0IGlucHV0X2RldiAqZGV2LAorCQkJY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2V5bWFwLAorCQkJaW50ICgqc2V0dXApKHN0cnVjdCBpbnB1dF9kZXYgKiwgc3RydWN0IGtleV9lbnRyeSAqKSk7Cit2b2lkIHNwYXJzZV9rZXltYXBfZnJlZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpOworCit2b2lkIHNwYXJzZV9rZXltYXBfcmVwb3J0X2VudHJ5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2UsCisJCQkJdW5zaWduZWQgaW50IHZhbHVlLCBib29sIGF1dG9yZWxlYXNlKTsKKworYm9vbCBzcGFyc2Vfa2V5bWFwX3JlcG9ydF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjb2RlLAorCQkJCXVuc2lnbmVkIGludCB2YWx1ZSwgYm9vbCBhdXRvcmVsZWFzZSk7CisKKyNlbmRpZiAvKiBfU1BBUlNFX0tFWU1BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCBhZTk2NTNkLi5hMjg3Y2ZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTI4Miw3ICsyODIsNyBAQAogCiAvKgogICogQnVpbHQtaW4gSVJRIGhhbmRsZXJzIGZvciB2YXJpb3VzIElSUSB0eXBlcywKLSAqIGNhbGxhYmxlIHZpYSBkZXNjLT5jaGlwLT5oYW5kbGVfaXJxKCkKKyAqIGNhbGxhYmxlIHZpYSBkZXNjLT5oYW5kbGVfaXJxKCkKICAqLwogZXh0ZXJuIHZvaWQgaGFuZGxlX2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogZXh0ZXJuIHZvaWQgaGFuZGxlX2Zhc3Rlb2lfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCBhNWIzZGM3Li42YTljNGRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTEwMjQsNyArMTAyNCw3IEBACiBleHRlcm4gaW50IGF0YV9zY3NpX3NsYXZlX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogZXh0ZXJuIGludCBhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAotCQkJCSAgICAgICBpbnQgcXVldWVfZGVwdGgpOworCQkJCSAgICAgICBpbnQgcXVldWVfZGVwdGgsIGludCByZWFzb24pOwogZXh0ZXJuIHN0cnVjdCBhdGFfZGV2aWNlICphdGFfZGV2X3BhaXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogZXh0ZXJuIGludCBhdGFfZG9fc2V0X21vZGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkX2Rldik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2V6eC1wY2FwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9lengtcGNhcC5oCmluZGV4IGU1MTI0Y2UuLjM0MDIwNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2V6eC1wY2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZXp4LXBjYXAuaApAQCAtNDUsNyArNDUsNyBAQAogI2RlZmluZSBQQ0FQX0NMRUFSX0lOVEVSUlVQVF9SRUdJU1RFUgkweDAxZmZmZmZmCiAjZGVmaW5lIFBDQVBfTUFTS19BTExfSU5URVJSVVBUCQkweDAxZmZmZmZmCiAKLS8qIHJlZ2lzdGVycyBhY2Vzc2libGUgYnkgYm90aCBwY2FwIHBvcnRzICovCisvKiByZWdpc3RlcnMgYWNjZXNzaWJsZSBieSBib3RoIHBjYXAgcG9ydHMgKi8KICNkZWZpbmUgUENBUF9SRUdfSVNSCQkweDAJLyogSW50ZXJydXB0IFN0YXR1cyAqLwogI2RlZmluZSBQQ0FQX1JFR19NU1IJCTB4MQkvKiBJbnRlcnJ1cHQgTWFzayAqLwogI2RlZmluZSBQQ0FQX1JFR19QU1RBVAkJMHgyCS8qIFByb2Nlc3NvciBTdGF0dXMgKi8KQEAgLTY3LDcgKzY3LDcgQEAKICNkZWZpbmUgUENBUF9SRUdfVkVORE9SX1RFU1QxCTB4MWUKICNkZWZpbmUgUENBUF9SRUdfVkVORE9SX1RFU1QyCTB4MWYKIAotLyogcmVnaXN0ZXJzIGFjZXNzaWJsZSBieSBwY2FwIHBvcnQgMSBvbmx5IChhMTIwMCwgZTIgJiBlNikgKi8KKy8qIHJlZ2lzdGVycyBhY2Nlc3NpYmxlIGJ5IHBjYXAgcG9ydCAxIG9ubHkgKGExMjAwLCBlMiAmIGU2KSAqLwogI2RlZmluZSBQQ0FQX1JFR19JTlRfU0VMCTB4MwkvKiBJbnRlcnJ1cHQgU2VsZWN0ICovCiAjZGVmaW5lIFBDQVBfUkVHX1NXQ1RSTAkJMHg0CS8qIFN3aXRjaGluZyBSZWd1bGF0b3IgQ29udHJvbCAqLwogI2RlZmluZSBQQ0FQX1JFR19WUkVHMQkJMHg1CS8qIFJlZ3VsYXRvciBCYW5rIDEgQ29udHJvbCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc2hfbW9iaWxlX3NkaGkuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NoX21vYmlsZV9zZGhpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjZDcxNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NoX21vYmlsZV9zZGhpLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9fU0hfTU9CSUxFX1NESElfSF9fCisjZGVmaW5lIF9fU0hfTU9CSUxFX1NESElfSF9fCisKK3N0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHsKKwl2b2lkICgqc2V0X3B3cikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHN0YXRlKTsKK307CisKKyNlbmRpZiAvKiBfX1NIX01PQklMRV9TREhJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvdWJpLmggYi9pbmNsdWRlL2xpbnV4L210ZC91YmkuaAppbmRleCA2OTEzYjcxLi5iMzFiZDllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC91YmkuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC91YmkuaApAQCAtMTc0LDYgKzE3NCw4IEBACiBzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1Ymlfb3Blbl92b2x1bWUoaW50IHViaV9udW0sIGludCB2b2xfaWQsIGludCBtb2RlKTsKIHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnViaV9vcGVuX3ZvbHVtZV9ubShpbnQgdWJpX251bSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJICAgaW50IG1vZGUpOworc3RydWN0IHViaV92b2x1bWVfZGVzYyAqdWJpX29wZW5fdm9sdW1lX3BhdGgoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBtb2RlKTsKKwogaW50IHViaV9yZWdpc3Rlcl92b2x1bWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkgaW50IGlnbm9yZV9leGlzdGluZyk7CiBpbnQgdWJpX3VucmVnaXN0ZXJfdm9sdW1lX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBjYWJmMDc0Li5lYWUxZjg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMTU4Nyw2ICsxNTg3LDggQEAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT01QRVgJCTB4MTFmNgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTVBFWF9FTkVUMTAwVkc0CTB4MDExMgogCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUE1DX1NpZXJyYQkweDExZjgKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JQCQkweDExZmUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SUDMySU5URgkJMHgwMDAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUlA4SU5URgkJMHgwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BrdGNkdmQuaCBiL2luY2x1ZGUvbGludXgvcGt0Y2R2ZC5oCmluZGV4IGQ3NDVmNWIuLjc2ZTUwNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGt0Y2R2ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGt0Y2R2ZC5oCkBAIC0zMCw3ICszMCw3IEBACiAKIC8qCiAgKiB1c2UgZHJpdmUgd3JpdGUgY2FjaGluZyAtLSB3ZSBuZWVkIGRlZmVycmVkIGVycm9yIGhhbmRsaW5nIHRvIGJlCi0gKiBhYmxlIHRvIHN1Y2Vzc2Z1bGx5IHJlY292ZXIgd2l0aCB0aGlzIG9wdGlvbiAoZHJpdmUgd2lsbCByZXR1cm4gZ29vZAorICogYWJsZSB0byBzdWNjZXNzZnVsbHkgcmVjb3ZlciB3aXRoIHRoaXMgb3B0aW9uIChkcml2ZSB3aWxsIHJldHVybiBnb29kCiAgKiBzdGF0dXMgYXMgc29vbiBhcyB0aGUgY2RiIGlzIHZhbGlkYXRlZCkuCiAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAppbmRleCBkZDMxZTdiLi5hMDViNGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCkBAIC01MiwxMSArNTIsNjMgQEAKICNkZWZpbmUgUkVJU0VSRlNfSU9DMzJfR0VUVkVSU0lPTglGU19JT0MzMl9HRVRWRVJTSU9OCiAjZGVmaW5lIFJFSVNFUkZTX0lPQzMyX1NFVFZFUlNJT04JRlNfSU9DMzJfU0VUVkVSU0lPTgogCi0vKiBMb2NraW5nIHByaW1pdGl2ZXMgKi8KLS8qIFJpZ2h0IG5vdyB3ZSBhcmUgc3RpbGwgZmFsbGluZyBiYWNrIHRvICh1bilsb2NrX2tlcm5lbCwgYnV0IGV2ZW50dWFsbHkgdGhhdAotICAgd291bGQgZXZvbHZlIGludG8gcmVhbCBwZXItZnMgbG9ja3MgKi8KLSNkZWZpbmUgcmVpc2VyZnNfd3JpdGVfbG9jayggc2IgKSBsb2NrX2tlcm5lbCgpCi0jZGVmaW5lIHJlaXNlcmZzX3dyaXRlX3VubG9jayggc2IgKSB1bmxvY2tfa2VybmVsKCkKKy8qCisgKiBMb2NraW5nIHByaW1pdGl2ZXMuIFRoZSB3cml0ZSBsb2NrIGlzIGEgcGVyIHN1cGVyYmxvY2sKKyAqIHNwZWNpYWwgbXV0ZXggdGhhdCBoYXMgcHJvcGVydGllcyBjbG9zZSB0byB0aGUgQmlnIEtlcm5lbCBMb2NrCisgKiB3aGljaCB3YXMgdXNlZCBpbiB0aGUgcHJldmlvdXMgbG9ja2luZyBzY2hlbWUuCisgKi8KK3ZvaWQgcmVpc2VyZnNfd3JpdGVfbG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwordm9pZCByZWlzZXJmc193cml0ZV91bmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK2ludCByZWlzZXJmc193cml0ZV9sb2NrX29uY2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK3ZvaWQgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbG9ja19kZXB0aCk7CisKKy8qCisgKiBTZXZlcmFsIG11dGV4ZXMgZGVwZW5kIG9uIHRoZSB3cml0ZSBsb2NrLgorICogSG93ZXZlciBzb21ldGltZXMgd2Ugd2FudCB0byByZWxheCB0aGUgd3JpdGUgbG9jayB3aGlsZSB3ZSBob2xkCisgKiB0aGVzZSBtdXRleGVzLCBhY2NvcmRpbmcgdG8gdGhlIHJlbGVhc2UvcmVhY3F1aXJlIG9uIHNjaGVkdWxlKCkKKyAqIHByb3BlcnRpZXMgb2YgdGhlIEJrbCB0aGF0IHdlcmUgdXNlZC4KKyAqIFJlaXNlcmZzIHBlcmZvcm1hbmNlcyBhbmQgbG9ja2luZyB3ZXJlIGJhc2VkIG9uIHRoaXMgc2NoZW1lLgorICogTm93IHRoYXQgdGhlIHdyaXRlIGxvY2sgaXMgYSBtdXRleCBhbmQgbm90IHRoZSBia2wgYW55bW9yZSwgZG9pbmcgc28KKyAqIG1heSByZXN1bHQgaW4gYSBkZWFkbG9jazoKKyAqCisgKiBBIGFjcXVpcmUgd3JpdGVfbG9jaworICogQSBhY3F1aXJlIGpfY29tbWl0X211dGV4CisgKiBBIHJlbGVhc2Ugd3JpdGVfbG9jayBhbmQgd2FpdCBmb3Igc29tZXRoaW5nCisgKiBCIGFjcXVpcmUgd3JpdGVfbG9jaworICogQiBjYW4ndCBhY3F1aXJlIGpfY29tbWl0X211dGV4IGFuZCBzbGVlcAorICogQSBjYW4ndCBhY3F1aXJlIHdyaXRlIGxvY2sgYW55bW9yZQorICogZGVhZGxvY2sKKyAqCisgKiBXaGF0IHdlIGRvIGhlcmUgaXMgYXZvaWRpbmcgc3VjaCBkZWFkbG9jayBieSBwbGF5aW5nIHRoZSBzYW1lIGdhbWUKKyAqIHRoYW4gdGhlIEJrbDogaWYgd2UgY2FuJ3QgYWNxdWlyZSBhIG11dGV4IHRoYXQgZGVwZW5kcyBvbiB0aGUgd3JpdGUgbG9jaywKKyAqIHdlIHJlbGVhc2UgdGhlIHdyaXRlIGxvY2ssIHdhaXQgYSBiaXQgYW5kIHRoZW4gcmV0cnkuCisgKgorICogVGhlIG11dGV4ZXMgY29uY2VybmVkIGJ5IHRoaXMgaGFjayBhcmU6CisgKiAtIFRoZSBjb21taXQgbXV0ZXggb2YgYSBqb3VybmFsIGxpc3QKKyAqIC0gVGhlIGZsdXNoIG11dGV4CisgKiAtIFRoZSBqb3VybmFsIGxvY2sKKyAqIC0gVGhlIGlub2RlIG11dGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19tdXRleF9sb2NrX3NhZmUoc3RydWN0IG11dGV4ICptLAorCQkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJbXV0ZXhfbG9jayhtKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworfQorCisvKgorICogV2hlbiB3ZSBzY2hlZHVsZSwgd2UgdXN1YWxseSB3YW50IHRvIGFsc28gcmVsZWFzZSB0aGUgd3JpdGUgbG9jaywKKyAqIGFjY29yZGluZyB0byB0aGUgcHJldmlvdXMgYmtsIGJhc2VkIGxvY2tpbmcgc2NoZW1lIG9mIHJlaXNlcmZzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfY29uZF9yZXNjaGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCQlzY2hlZHVsZSgpOworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCX0KK30KIAogc3RydWN0IGZpZDsKIApAQCAtMTMyOSw3ICsxMzgxLDExIEBACiAjZGVmaW5lIGdldF9nZW5lcmF0aW9uKHMpIGF0b21pY19yZWFkICgmZnNfZ2VuZXJhdGlvbihzKSkKICNkZWZpbmUgRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSAgKGdldF9nZW5lcmF0aW9uKCh0YiktPnRiX3NiKSAhPSAodGIpLT5mc19nZW4pCiAjZGVmaW5lIF9fZnNfY2hhbmdlZChnZW4scykgKGdlbiAhPSBnZXRfZ2VuZXJhdGlvbiAocykpCi0jZGVmaW5lIGZzX2NoYW5nZWQoZ2VuLHMpICh7Y29uZF9yZXNjaGVkKCk7IF9fZnNfY2hhbmdlZChnZW4sIHMpO30pCisjZGVmaW5lIGZzX2NoYW5nZWQoZ2VuLHMpCQlcCisoewkJCQkJXAorCXJlaXNlcmZzX2NvbmRfcmVzY2hlZChzKTsJXAorCV9fZnNfY2hhbmdlZChnZW4sIHMpOwkJXAorfSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgRklYQVRFIE5PREVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMjU4LDggKzIzMTQsNyBAQAogI2RlZmluZSBTUEFSRV9TUEFDRSA1MDAKIAogLyogcHJvdG90eXBlcyBmcm9tIGlvY3RsLmMgKi8KLWludCByZWlzZXJmc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworbG9uZyByZWlzZXJmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogbG9uZyByZWlzZXJmc19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGludCByZWlzZXJmc191bnBhY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oCmluZGV4IGRhYjY4YmIuLjUyYzgzYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX3NiLmgKQEAgLTcsNiArNyw4IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2VuZGlmCiAKIHR5cGVkZWYgZW51bSB7CkBAIC0zNTUsNiArMzU3LDEzIEBACiAJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKnNfam91cm5hbDsJLyogcG9pbnRlciB0byBqb3VybmFsIGluZm9ybWF0aW9uICovCiAJdW5zaWduZWQgc2hvcnQgc19tb3VudF9zdGF0ZTsJLyogcmVpc2VyZnMgc3RhdGUgKHZhbGlkLCBpbnZhbGlkKSAqLwogCisJLyogU2VyaWFsaXplIHdyaXRlcnMgYWNjZXNzLCByZXBsYWNlIHRoZSBvbGQgYmtsICovCisJc3RydWN0IG11dGV4IGxvY2s7CisJLyogT3duZXIgb2YgdGhlIGxvY2sgKGNhbiBiZSByZWN1cnNpdmUpICovCisJc3RydWN0IHRhc2tfc3RydWN0ICpsb2NrX293bmVyOworCS8qIERlcHRoIG9mIHRoZSBsb2NrLCBzdGFydCBmcm9tIC0xIGxpa2UgdGhlIGJrbCAqLworCWludCBsb2NrX2RlcHRoOworCiAJLyogQ29tbWVudD8gLUhhbnMgKi8KIAl2b2lkICgqZW5kX2lvX2hhbmRsZXIpIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKIAloYXNoZl90IHNfaGFzaF9mdW5jdGlvbjsJLyogcG9pbnRlciB0byBmdW5jdGlvbiB3aGljaCBpcyB1c2VkCkBAIC00MDgsNiArNDE3LDE3IEBACiAJY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOwogCWludCBzX2pxdW90YV9mbXQ7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKworCXN0cnVjdCB0cmVlX2JhbGFuY2UgKmN1cl90YjsJLyoKKwkJCQkJICogRGV0ZWN0cyB3aGV0aGVyIG1vcmUgdGhhbiBvbmUKKwkJCQkJICogY29weSBvZiB0YiBleGlzdHMgcGVyIHN1cGVyYmxvY2sKKwkJCQkJICogYXMgYSBtZWFucyBvZiBjaGVja2luZyB3aGV0aGVyCisJCQkJCSAqIGRvX2JhbGFuY2UgaXMgZXhlY3V0aW5nIGNvbmN1cnJlbnRseQorCQkJCQkgKiBhZ2FpbnN0IGFub3RoZXIgdHJlZSByZWFkZXIvd3JpdGVyCisJCQkJCSAqIG9uIGEgc2FtZSBtb3VudCBwb2ludC4KKwkJCQkJICovCisjZW5kaWYKIH07CiAKIC8qIERlZmluaXRpb25zIG9mIHJlaXNlcmZzIG9uLWRpc2sgcHJvcGVydGllczogKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3JlZy5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfcmVnLmgKaW5kZXggODUwZGIyZS4uY2Y5MzI3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfcmVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfcmVnLmgKQEAgLTIxNiwxMCArMjE2LDEwIEBACiAKICNkZWZpbmUgVUFSVF9JSVJfVE9ECTB4MDgJLyogQ2hhcmFjdGVyIFRpbWVvdXQgSW5kaWNhdGlvbiBEZXRlY3RlZCAqLwogCi0jZGVmaW5lIFVBUlRfRkNSX1BYQVIxCTB4MDAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gMSAqLwotI2RlZmluZSBVQVJUX0ZDUl9QWEFSOAkweDQwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDggKi8KLSNkZWZpbmUgVUFSVF9GQ1JfUFhBUjE2CTB4ODAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gMTYgKi8KLSNkZWZpbmUgVUFSVF9GQ1JfUFhBUjMyCTB4YzAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gMzIgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfUFhBUjEJMHgwMAkvKiByZWNlaXZlIEZJRk8gdGhyZXNob2xkID0gMSAqLworI2RlZmluZSBVQVJUX0ZDUl9QWEFSOAkweDQwCS8qIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgPSA4ICovCisjZGVmaW5lIFVBUlRfRkNSX1BYQVIxNgkweDgwCS8qIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgPSAxNiAqLworI2RlZmluZSBVQVJUX0ZDUl9QWEFSMzIJMHhjMAkvKiByZWNlaXZlIEZJRk8gdGhyZXNob2xkID0gMzIgKi8KIAogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaW8uaCBiL2luY2x1ZGUvbGludXgvc2VyaW8uaAppbmRleCBhNjQwYmMyLi5lMmYzMDQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCkBAIC0yMTUsNSArMjE1LDYgQEAKICNkZWZpbmUgU0VSSU9fSU5FWElPCTB4MzcKICNkZWZpbmUgU0VSSU9fVE9VQ0hJVDIxMwkweDM4CiAjZGVmaW5lIFNFUklPX1c4MDAxCTB4MzkKKyNkZWZpbmUgU0VSSU9fRFlOQVBSTwkweDNhCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaF9pbnRjLmggYi9pbmNsdWRlL2xpbnV4L3NoX2ludGMuaAppbmRleCA2OGUyMTJmLi40ZWYyNDZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NoX2ludGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NoX2ludGMuaApAQCAtNTcsMTAgKzU3LDggQEAKIAlzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgKnNlbnNlX3JlZ3M7CiAJdW5zaWduZWQgaW50IG5yX3NlbnNlX3JlZ3M7CiAJY2hhciAqbmFtZTsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0gzKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU0g0QSkKIAlzdHJ1Y3QgaW50Y19tYXNrX3JlZyAqYWNrX3JlZ3M7CiAJdW5zaWduZWQgaW50IG5yX2Fja19yZWdzOwotI2VuZGlmCiB9OwogCiAjZGVmaW5lIF9JTlRDX0FSUkFZKGEpIGEsIHNpemVvZihhKS9zaXplb2YoKmEpCkBAIC03Myw3ICs3MSw2IEBACiAJY2hpcG5hbWUsCQkJCQkJCVwKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDMpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQogI2RlZmluZSBERUNMQVJFX0lOVENfREVTQ19BQ0soc3ltYm9sLCBjaGlwbmFtZSwgdmVjdG9ycywgZ3JvdXBzLAlcCiAJbWFza19yZWdzLCBwcmlvX3JlZ3MsIHNlbnNlX3JlZ3MsIGFja19yZWdzKQkJCVwKIHN0cnVjdCBpbnRjX2Rlc2Mgc3ltYm9sIF9faW5pdGRhdGEgPSB7CQkJCQlcCkBAIC04Myw5ICs4MCwxMSBAQAogCWNoaXBuYW1lLAkJCQkJCQlcCiAJX0lOVENfQVJSQVkoYWNrX3JlZ3MpLAkJCQkJCVwKIH0KLSNlbmRpZgogCiB2b2lkIF9faW5pdCByZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoc3RydWN0IGludGNfZGVzYyAqZGVzYyk7CiBpbnQgaW50Y19zZXRfcHJpb3JpdHkodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHByaW8pOwogCitpbnQgcmVzZXJ2ZV9pcnFfdmVjdG9yKHVuc2lnbmVkIGludCBpcnEpOwordm9pZCByZXNlcnZlX2lycV9sZWdhY3kodm9pZCk7CisKICNlbmRpZiAvKiBfX1NIX0lOVENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaF9wZmMuaCBiL2luY2x1ZGUvbGludXgvc2hfcGZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjMDhhZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc2hfcGZjLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIFN1cGVySCBQaW4gRnVuY3Rpb24gQ29udHJvbGxlciBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hZ251cyBEYW1tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1NIX1BGQ19ICisjZGVmaW5lIF9fU0hfUEZDX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBwaW5tdXhfZW51bV90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBwaW5tdXhfZmxhZ190OworCisjZGVmaW5lIFBJTk1VWF9UWVBFX05PTkUgICAgICAgICAgICAwCisjZGVmaW5lIFBJTk1VWF9UWVBFX0ZVTkNUSU9OICAgICAgICAxCisjZGVmaW5lIFBJTk1VWF9UWVBFX0dQSU8gICAgICAgICAgICAyCisjZGVmaW5lIFBJTk1VWF9UWVBFX09VVFBVVCAgICAgICAgICAzCisjZGVmaW5lIFBJTk1VWF9UWVBFX0lOUFVUICAgICAgICAgICA0CisjZGVmaW5lIFBJTk1VWF9UWVBFX0lOUFVUX1BVTExVUCAgICA1CisjZGVmaW5lIFBJTk1VWF9UWVBFX0lOUFVUX1BVTExET1dOICA2CisKKyNkZWZpbmUgUElOTVVYX0ZMQUdfVFlQRSAgICAgICAgICAgICgweDcpCisjZGVmaW5lIFBJTk1VWF9GTEFHX1dBTlRfUFVMTFVQICAgICAoMSA8PCAzKQorI2RlZmluZSBQSU5NVVhfRkxBR19XQU5UX1BVTExET1dOICAgKDEgPDwgNCkKKworI2RlZmluZSBQSU5NVVhfRkxBR19EQklUX1NISUZUICAgICAgNQorI2RlZmluZSBQSU5NVVhfRkxBR19EQklUICAgICAgICAgICAgKDB4MWYgPDwgUElOTVVYX0ZMQUdfREJJVF9TSElGVCkKKyNkZWZpbmUgUElOTVVYX0ZMQUdfRFJFR19TSElGVCAgICAgIDEwCisjZGVmaW5lIFBJTk1VWF9GTEFHX0RSRUcgICAgICAgICAgICAoMHgzZiA8PCBQSU5NVVhfRkxBR19EUkVHX1NISUZUKQorCitzdHJ1Y3QgcGlubXV4X2dwaW8geworCXBpbm11eF9lbnVtX3QgZW51bV9pZDsKKwlwaW5tdXhfZmxhZ190IGZsYWdzOworfTsKKworI2RlZmluZSBQSU5NVVhfR1BJTyhncGlvLCBkYXRhX29yX21hcmspIFtncGlvXSA9IHsgZGF0YV9vcl9tYXJrIH0KKyNkZWZpbmUgUElOTVVYX0RBVEEoZGF0YV9vcl9tYXJrLCBpZHMuLi4pIGRhdGFfb3JfbWFyaywgaWRzLCAwCisKK3N0cnVjdCBwaW5tdXhfY2ZnX3JlZyB7CisJdW5zaWduZWQgbG9uZyByZWcsIHJlZ193aWR0aCwgZmllbGRfd2lkdGg7CisJdW5zaWduZWQgbG9uZyAqY250OworCXBpbm11eF9lbnVtX3QgKmVudW1faWRzOworfTsKKworI2RlZmluZSBQSU5NVVhfQ0ZHX1JFRyhuYW1lLCByLCByX3dpZHRoLCBmX3dpZHRoKSBcCisJLnJlZyA9IHIsIC5yZWdfd2lkdGggPSByX3dpZHRoLCAuZmllbGRfd2lkdGggPSBmX3dpZHRoLAkJXAorCS5jbnQgPSAodW5zaWduZWQgbG9uZyBbcl93aWR0aCAvIGZfd2lkdGhdKSB7fSwgXAorCS5lbnVtX2lkcyA9IChwaW5tdXhfZW51bV90IFsocl93aWR0aCAvIGZfd2lkdGgpICogKDEgPDwgZl93aWR0aCldKSBcCisKK3N0cnVjdCBwaW5tdXhfZGF0YV9yZWcgeworCXVuc2lnbmVkIGxvbmcgcmVnLCByZWdfd2lkdGgsIHJlZ19zaGFkb3c7CisJcGlubXV4X2VudW1fdCAqZW51bV9pZHM7Cit9OworCisjZGVmaW5lIFBJTk1VWF9EQVRBX1JFRyhuYW1lLCByLCByX3dpZHRoKSBcCisJLnJlZyA9IHIsIC5yZWdfd2lkdGggPSByX3dpZHRoLAlcCisJLmVudW1faWRzID0gKHBpbm11eF9lbnVtX3QgW3Jfd2lkdGhdKSBcCisKK3N0cnVjdCBwaW5tdXhfcmFuZ2UgeworCXBpbm11eF9lbnVtX3QgYmVnaW47CisJcGlubXV4X2VudW1fdCBlbmQ7CisJcGlubXV4X2VudW1fdCBmb3JjZTsKK307CisKK3N0cnVjdCBwaW5tdXhfaW5mbyB7CisJY2hhciAqbmFtZTsKKwlwaW5tdXhfZW51bV90IHJlc2VydmVkX2lkOworCXN0cnVjdCBwaW5tdXhfcmFuZ2UgZGF0YTsKKwlzdHJ1Y3QgcGlubXV4X3JhbmdlIGlucHV0OworCXN0cnVjdCBwaW5tdXhfcmFuZ2UgaW5wdXRfcGQ7CisJc3RydWN0IHBpbm11eF9yYW5nZSBpbnB1dF9wdTsKKwlzdHJ1Y3QgcGlubXV4X3JhbmdlIG91dHB1dDsKKwlzdHJ1Y3QgcGlubXV4X3JhbmdlIG1hcms7CisJc3RydWN0IHBpbm11eF9yYW5nZSBmdW5jdGlvbjsKKworCXVuc2lnbmVkIGZpcnN0X2dwaW8sIGxhc3RfZ3BpbzsKKworCXN0cnVjdCBwaW5tdXhfZ3BpbyAqZ3Bpb3M7CisJc3RydWN0IHBpbm11eF9jZmdfcmVnICpjZmdfcmVnczsKKwlzdHJ1Y3QgcGlubXV4X2RhdGFfcmVnICpkYXRhX3JlZ3M7CisKKwlwaW5tdXhfZW51bV90ICpncGlvX2RhdGE7CisJdW5zaWduZWQgaW50IGdwaW9fZGF0YV9zaXplOworCisJdW5zaWduZWQgbG9uZyAqZ3Bpb19pbl91c2U7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworfTsKKworaW50IHJlZ2lzdGVyX3Bpbm11eChzdHJ1Y3QgcGlubXV4X2luZm8gKnBpcCk7CisKKyNlbmRpZiAvKiBfX1NIX1BGQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAppbmRleCBlZWQ0MjU0Li4zMjc0YzUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKQEAgLTE1LDcgKzE1LDcgQEAKICAqIFNvbWUgaGFyZHdhcmUgd29ya3Mgd2VsbCB3aXRoIHJlcXVlc3RzIGF0IHNwaV90cmFuc2ZlciBzY29wZToKICAqCiAgKiAgIC0JRHJpdmVycyBsZXZlcmFnaW5nIHNtYXJ0ZXIgaGFyZHdhcmUsIHdpdGggZmlmb3Mgb3IgRE1BOyBvciBmb3IgaGFsZgotICoJZHVwbGV4IChNaWNyb1dpcmUpIGNvbnRyb2xsZXJzLiAgUHJvdmlkZSBjaGlwc2xlY3QoKSBhbmQgdHhyeF9idWZzKCksCisgKglkdXBsZXggKE1pY3JvV2lyZSkgY29udHJvbGxlcnMuICBQcm92aWRlIGNoaXBzZWxlY3QoKSBhbmQgdHhyeF9idWZzKCksCiAgKglhbmQgY3VzdG9tIHNldHVwKCkvY2xlYW51cCgpIG1ldGhvZHMuCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggNTZhZjNjYS4uODc3YmEwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC04OSw4ICs4OSw4IEBACiAJS0VSTl9WRVJTSU9OPTQsCQkvKiBzdHJpbmc6IGNvbXBpbGUgdGltZSBpbmZvICovCiAJS0VSTl9TRUNVUkVNQVNLPTUsCS8qIHN0cnVjdDogbWF4aW11bSByaWdodHMgbWFzayAqLwogCUtFUk5fUFJPRj02LAkJLyogdGFibGU6IHByb2ZpbGluZyBpbmZvcm1hdGlvbiAqLwotCUtFUk5fTk9ERU5BTUU9NywKLQlLRVJOX0RPTUFJTk5BTUU9OCwKKwlLRVJOX05PREVOQU1FPTcsCS8qIHN0cmluZzogaG9zdG5hbWUgKi8KKwlLRVJOX0RPTUFJTk5BTUU9OCwJLyogc3RyaW5nOiBkb21haW5uYW1lICovCiAKIAlLRVJOX1BBTklDPTE1LAkJLyogaW50OiBwYW5pYyB0aW1lb3V0ICovCiAJS0VSTl9SRUFMUk9PVERFVj0xNiwJLyogcmVhbCByb290IGRldmljZSB0byBtb3VudCBhZnRlciBpbml0cmQgKi8KQEAgLTEwMiw4ICsxMDIsOCBAQAogCUtFUk5fUFBDX0hUQUJSRUNMQUlNPTI1LCAvKiB0dXJuIGh0YWIgcmVjbGFpbWF0aW9uIG9uL29mZiBvbiBQUEMgKi8KIAlLRVJOX1BQQ19aRVJPUEFHRUQ9MjYsCS8qIHR1cm4gaWRsZSBwYWdlIHplcm9pbmcgb24vb2ZmIG9uIFBQQyAqLwogCUtFUk5fUFBDX1BPV0VSU0FWRV9OQVA9MjcsIC8qIHVzZSBuYXAgbW9kZSBmb3IgcG93ZXIgc2F2aW5nICovCi0JS0VSTl9NT0RQUk9CRT0yOCwKLQlLRVJOX1NHX0JJR19CVUZGPTI5LAorCUtFUk5fTU9EUFJPQkU9MjgsCS8qIHN0cmluZzogbW9kcHJvYmUgcGF0aCAqLworCUtFUk5fU0dfQklHX0JVRkY9MjksCS8qIGludDogc2cgZHJpdmVyIHJlc2VydmVkIGJ1ZmZlciBzaXplICovCiAJS0VSTl9BQ0NUPTMwLAkJLyogQlNEIHByb2Nlc3MgYWNjb3VudGluZyBwYXJhbWV0ZXJzICovCiAJS0VSTl9QUENfTDJDUj0zMSwJLyogbDJjciByZWdpc3RlciBvbiBQUEMgKi8KIApAQCAtMTUwLDcgKzE1MCw3IEBACiAJS0VSTl9BQ1BJX1ZJREVPX0ZMQUdTPTcxLCAvKiBpbnQ6IGZsYWdzIGZvciBzZXR0aW5nIHVwIHZpZGVvIGFmdGVyIEFDUEkgc2xlZXAgKi8KIAlLRVJOX0lBNjRfVU5BTElHTkVEPTcyLCAvKiBpbnQ6IGlhNjQgdW5hbGlnbmVkIHVzZXJsYW5kIHRyYXAgZW5hYmxlICovCiAJS0VSTl9DT01QQVRfTE9HPTczLAkvKiBpbnQ6IHByaW50IGNvbXBhdCBsYXllciAgbWVzc2FnZXMgKi8KLQlLRVJOX01BWF9MT0NLX0RFUFRIPTc0LAorCUtFUk5fTUFYX0xPQ0tfREVQVEg9NzQsIC8qIGludDogcnRtdXRleCdzIG1heGltdW0gbG9jayBkZXB0aCAqLwogCUtFUk5fTk1JX1dBVENIRE9HPTc1LCAvKiBpbnQ6IGVuYWJsZS9kaXNhYmxlIG5taSB3YXRjaGRvZyAqLwogCUtFUk5fUEFOSUNfT05fTk1JPTc2LCAvKiBpbnQ6IHdoZXRoZXIgd2Ugd2lsbCBwYW5pYyBvbiBhbiB1bnJlY292ZXJlZCAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWNiMTQwMC5oIGIvaW5jbHVkZS9saW51eC91Y2IxNDAwLmgKaW5kZXggYWRiNDQwNi4uMWI0NzkwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91Y2IxNDAwLmgKKysrIGIvaW5jbHVkZS9saW51eC91Y2IxNDAwLmgKQEAgLTExMCw2ICsxMTAsMTAgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSp1Y2IxNDAwX2dwaW87CiB9OwogCitzdHJ1Y3QgdWNiMTQwMF9wZGF0YSB7CisJaW50CWlycTsKK307CisKIHN0YXRpYyBpbmxpbmUgdTE2IHVjYjE0MDBfcmVnX3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1MTYgcmVnKQogewogCXJldHVybiBhYzk3LT5idXMtPm9wcy0+cmVhZChhYzk3LCByZWcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivd3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2Ivd3VzYi5oCmluZGV4IDQyOWM2MzEuLjYzZWJkY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3d1c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi93dXNiLmgKQEAgLTc0LDcgKzc0LDcgQEAKICAqIFdVU0IgZGVmaW5lcyB0aGF0IENISURzLCBDRElEcyBhbmQgQ0tzIGFyZSBhIDE2IGJ5dGUgc3RyaW5nIG9mCiAgKiBkYXRhLiBJbiBvcmRlciB0byBhdm9pZCBjb25mdXNpb24gYW5kIGVuZm9yY2UgdHlwZXMsIHdlIHdyYXAgaXQuCiAgKgotICogTWFrZSBpdCBwYWNrZWQsIGFzIHdlIHVzZSBpdCBpbiBzb21lIGh3IGRlZmludGlvbnMuCisgKiBNYWtlIGl0IHBhY2tlZCwgYXMgd2UgdXNlIGl0IGluIHNvbWUgaHcgZGVmaW5pdGlvbnMuCiAgKi8KIHN0cnVjdCB3dXNiX2NraGRpZCB7CiAJdTggZGF0YVsxNl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAppbmRleCBiNTllNzhjLi4zMmI5MjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTM2MSw2ICszNjEsNyBAQAogI2RlZmluZSBWNEwyX1BJWF9GTVRfUEpQRyAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnSicsICdQJywgJ0cnKSAvKiBQaXhhcnQgNzN4eCBKUEVHICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9PVjUxMSAgICB2NGwyX2ZvdXJjYygnTycsICc1JywgJzEnLCAnMScpIC8qIG92NTExIEpQRUcgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX09WNTE4ICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICc4JykgLyogb3Y1MTggSlBFRyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1RWMDY4MCAgdjRsMl9mb3VyY2MoJ1MnLCAnNicsICc4JywgJzAnKSAvKiBzdHYwNjgwIGJheWVyICovCiAKIC8qCiAgKglGIE8gUiBNIEEgVCAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgpAQCAtNDkwLDcgKzQ5MSw3IEBACiAJCQkJICogeW91IGRvLCBsZWF2ZSB0aGVtIHVudG91Y2hlZC4KIAkJCQkgKiBJbmx1ZGluZyBsZXNzIG1hcmtlcnMgd2lsbCBtYWtlIHRoZQogCQkJCSAqIHJlc3VsdGluZyBjb2RlIHNtYWxsZXIsIGJ1dCB0aGVyZSB3aWxsCi0JCQkJICogYmUgZmV3ZXIgYXBsaWNhdGlvbnMgd2hpY2ggY2FuIHJlYWQgaXQuCisJCQkJICogYmUgZmV3ZXIgYXBwbGljYXRpb25zIHdoaWNoIGNhbiByZWFkIGl0LgogCQkJCSAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgQVBQIGFuZCBDT00gbWFya2VyCiAJCQkJICogaXMgaW5mbHVlbmNlZCBieSBBUFBfbGVuIGFuZCBDT01fbGVuCiAJCQkJICogT05MWSwgbm90IGJ5IHRoaXMgcHJvcGVydHkhICovCkBAIC01NjMsNiArNTY0LDcgQEAKICNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MT0NBTF9BTFBIQQkweDAwMTAKICNkZWZpbmUgVjRMMl9GQlVGX0NBUF9HTE9CQUxfQUxQSEEJMHgwMDIwCiAjZGVmaW5lIFY0TDJfRkJVRl9DQVBfTE9DQUxfSU5WX0FMUEhBCTB4MDA0MAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX1NSQ19DSFJPTUFLRVkJMHgwMDgwCiAvKiAgRmxhZ3MgZm9yIHRoZSAnZmxhZ3MnIGZpZWxkLiAqLwogI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19QUklNQVJZCQkweDAwMDEKICNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWQkJMHgwMDAyCkBAIC01NzAsNiArNTcyLDcgQEAKICNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEEJMHgwMDA4CiAjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0dMT0JBTF9BTFBIQQkweDAwMTAKICNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfSU5WX0FMUEhBCTB4MDAyMAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19TUkNfQ0hST01BS0VZCTB4MDA0MAogCiBzdHJ1Y3QgdjRsMl9jbGlwIHsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBjOwpAQCAtOTEyLDggKzkxNSwxMCBAQAogI2RlZmluZSBWNEwyX0NJRF9BVVRPQlJJR0hUTkVTUwkJCShWNEwyX0NJRF9CQVNFKzMyKQogI2RlZmluZSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSCQkoVjRMMl9DSURfQkFTRSszMykKIAorI2RlZmluZSBWNEwyX0NJRF9ST1RBVEUJCQkJKFY0TDJfQ0lEX0JBU0UrMzQpCisjZGVmaW5lIFY0TDJfQ0lEX0JHX0NPTE9SCQkJKFY0TDJfQ0lEX0JBU0UrMzUpCiAvKiBsYXN0IENJRCArIDEgKi8KLSNkZWZpbmUgVjRMMl9DSURfTEFTVFAxICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM0KQorI2RlZmluZSBWNEwyX0NJRF9MQVNUUDEgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzYpCiAKIC8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0JBU0UgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHg5MDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCBjZjI0YzIwLi45NDY2ZTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTI1LDYgKzI1LDcgQEAKIHN0cnVjdCB3b3JrX3N0cnVjdCB7CiAJYXRvbWljX2xvbmdfdCBkYXRhOwogI2RlZmluZSBXT1JLX1NUUlVDVF9QRU5ESU5HIDAJCS8qIFQgaWYgd29yayBpdGVtIHBlbmRpbmcgZXhlY3V0aW9uICovCisjZGVmaW5lIFdPUktfU1RSVUNUX1NUQVRJQyAgMQkJLyogc3RhdGljIGluaXRpYWxpemVyIChkZWJ1Z29iamVjdHMpICovCiAjZGVmaW5lIFdPUktfU1RSVUNUX0ZMQUdfTUFTSyAoM1VMKQogI2RlZmluZSBXT1JLX1NUUlVDVF9XUV9EQVRBX01BU0sgKH5XT1JLX1NUUlVDVF9GTEFHX01BU0spCiAJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKQEAgLTM1LDYgKzM2LDcgQEAKIH07CiAKICNkZWZpbmUgV09SS19EQVRBX0lOSVQoKQlBVE9NSUNfTE9OR19JTklUKDApCisjZGVmaW5lIFdPUktfREFUQV9TVEFUSUNfSU5JVCgpCUFUT01JQ19MT05HX0lOSVQoMikKIAogc3RydWN0IGRlbGF5ZWRfd29yayB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CkBAIC02Myw3ICs2NSw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBfX1dPUktfSU5JVElBTElaRVIobiwgZikgewkJCQlcCi0JLmRhdGEgPSBXT1JLX0RBVEFfSU5JVCgpLAkJCQlcCisJLmRhdGEgPSBXT1JLX0RBVEFfU1RBVElDX0lOSVQoKSwJCQlcCiAJLmVudHJ5CT0geyAmKG4pLmVudHJ5LCAmKG4pLmVudHJ5IH0sCQkJXAogCS5mdW5jID0gKGYpLAkJCQkJCVwKIAlfX1dPUktfSU5JVF9MT0NLREVQX01BUCgjbiwgJihuKSkJCQlcCkBAIC05MSw2ICs5MywxNCBAQAogI2RlZmluZSBQUkVQQVJFX0RFTEFZRURfV09SSyhfd29yaywgX2Z1bmMpCQkJXAogCVBSRVBBUkVfV09SSygmKF93b3JrKS0+d29yaywgKF9mdW5jKSkKIAorI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1dPUksKK2V4dGVybiB2b2lkIF9faW5pdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgaW50IG9uc3RhY2spOworZXh0ZXJuIHZvaWQgZGVzdHJveV93b3JrX29uX3N0YWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgaW50IG9uc3RhY2spIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfd29ya19vbl9zdGFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspIHsgfQorI2VuZGlmCisKIC8qCiAgKiBpbml0aWFsaXplIGFsbCBvZiBhIHdvcmsgaXRlbSBpbiBvbmUgZ28KICAqCkBAIC05OSwyNCArMTA5LDM2IEBACiAgKiB0byBnZW5lcmF0ZSBiZXR0ZXIgY29kZS4KICAqLwogI2lmZGVmIENPTkZJR19MT0NLREVQCi0jZGVmaW5lIElOSVRfV09SSyhfd29yaywgX2Z1bmMpCQkJCQkJXAorI2RlZmluZSBfX0lOSVRfV09SSyhfd29yaywgX2Z1bmMsIF9vbnN0YWNrKQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IF9fa2V5OwkJCVwKIAkJCQkJCQkJCVwKKwkJX19pbml0X3dvcmsoKF93b3JrKSwgX29uc3RhY2spOwkJCQlcCiAJCShfd29yayktPmRhdGEgPSAoYXRvbWljX2xvbmdfdCkgV09SS19EQVRBX0lOSVQoKTsJXAogCQlsb2NrZGVwX2luaXRfbWFwKCYoX3dvcmspLT5sb2NrZGVwX21hcCwgI193b3JrLCAmX19rZXksIDApO1wKIAkJSU5JVF9MSVNUX0hFQUQoJihfd29yayktPmVudHJ5KTsJCQlcCiAJCVBSRVBBUkVfV09SSygoX3dvcmspLCAoX2Z1bmMpKTsJCQkJXAogCX0gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBJTklUX1dPUksoX3dvcmssIF9mdW5jKQkJCQkJCVwKKyNkZWZpbmUgX19JTklUX1dPUksoX3dvcmssIF9mdW5jLCBfb25zdGFjaykJCQkJXAogCWRvIHsJCQkJCQkJCVwKKwkJX19pbml0X3dvcmsoKF93b3JrKSwgX29uc3RhY2spOwkJCQlcCiAJCShfd29yayktPmRhdGEgPSAoYXRvbWljX2xvbmdfdCkgV09SS19EQVRBX0lOSVQoKTsJXAogCQlJTklUX0xJU1RfSEVBRCgmKF93b3JrKS0+ZW50cnkpOwkJCVwKIAkJUFJFUEFSRV9XT1JLKChfd29yayksIChfZnVuYykpOwkJCQlcCiAJfSB3aGlsZSAoMCkKICNlbmRpZgogCisjZGVmaW5lIElOSVRfV09SSyhfd29yaywgX2Z1bmMpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCV9fSU5JVF9XT1JLKChfd29yayksIChfZnVuYyksIDApOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSU5JVF9XT1JLX09OX1NUQUNLKF93b3JrLCBfZnVuYykJCQlcCisJZG8gewkJCQkJCQlcCisJCV9fSU5JVF9XT1JLKChfd29yayksIChfZnVuYyksIDEpOwkJXAorCX0gd2hpbGUgKDApCisKICNkZWZpbmUgSU5JVF9ERUxBWUVEX1dPUksoX3dvcmssIF9mdW5jKQkJCQlcCiAJZG8gewkJCQkJCQlcCiAJCUlOSVRfV09SSygmKF93b3JrKS0+d29yaywgKF9mdW5jKSk7CQlcCkBAIC0xMjUsMjIgKzE0NywxNiBAQAogCiAjZGVmaW5lIElOSVRfREVMQVlFRF9XT1JLX09OX1NUQUNLKF93b3JrLCBfZnVuYykJCVwKIAlkbyB7CQkJCQkJCVwKLQkJSU5JVF9XT1JLKCYoX3dvcmspLT53b3JrLCAoX2Z1bmMpKTsJCVwKKwkJSU5JVF9XT1JLX09OX1NUQUNLKCYoX3dvcmspLT53b3JrLCAoX2Z1bmMpKTsJXAogCQlpbml0X3RpbWVyX29uX3N0YWNrKCYoX3dvcmspLT50aW1lcik7CQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBJTklUX0RFTEFZRURfV09SS19ERUZFUlJBQkxFKF93b3JrLCBfZnVuYykJCQlcCisjZGVmaW5lIElOSVRfREVMQVlFRF9XT1JLX0RFRkVSUkFCTEUoX3dvcmssIF9mdW5jKQkJXAogCWRvIHsJCQkJCQkJXAogCQlJTklUX1dPUksoJihfd29yayktPndvcmssIChfZnVuYykpOwkJXAogCQlpbml0X3RpbWVyX2RlZmVycmFibGUoJihfd29yayktPnRpbWVyKTsJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIElOSVRfREVMQVlFRF9XT1JLX09OX1NUQUNLKF93b3JrLCBfZnVuYykJCVwKLQlkbyB7CQkJCQkJCVwKLQkJSU5JVF9XT1JLKCYoX3dvcmspLT53b3JrLCAoX2Z1bmMpKTsJCVwKLQkJaW5pdF90aW1lcl9vbl9zdGFjaygmKF93b3JrKS0+dGltZXIpOwkJXAotCX0gd2hpbGUgKDApCi0KIC8qKgogICogd29ya19wZW5kaW5nIC0gRmluZCBvdXQgd2hldGhlciBhIHdvcmsgaXRlbSBpcyBjdXJyZW50bHkgcGVuZGluZwogICogQHdvcms6IFRoZSB3b3JrIGl0ZW0gaW4gcXVlc3Rpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvY3gyNTg0MC5oIGIvaW5jbHVkZS9tZWRpYS9jeDI1ODQwLmgKaW5kZXggMmMzZmJhYS4uMGIwY2IxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9jeDI1ODQwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9jeDI1ODQwLmgKQEAgLTg0LDYgKzg0LDcgQEAKIAlDWDI1ODQwX05PTkUwX0NIMyA9IDB4ODAwMDAwODAsCiAJQ1gyNTg0MF9OT05FMV9DSDMgPSAweDgwMDAwMGMwLAogCUNYMjU4NDBfU1ZJREVPX09OID0gMHg4MDAwMDEwMCwKKwlDWDI1ODQwX0NPTVBPTkVOVF9PTiA9IDB4ODAwMDAyMDAsCiB9OwogCiBlbnVtIGN4MjU4NDBfYXVkaW9faW5wdXQgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwZmVfY2FwdHVyZS5oIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwZmVfY2FwdHVyZS5oCmluZGV4IDcxZDg5ODIuLmQ4NjNlNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGZlX2NhcHR1cmUuaAorKysgYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBmZV9jYXB0dXJlLmgKQEAgLTgzLDYgKzgzLDggQEAKIHN0cnVjdCB2cGZlX2NvbmZpZyB7CiAJLyogTnVtYmVyIG9mIHN1YiBkZXZpY2VzIGNvbm5lY3RlZCB0byB2cGZlICovCiAJaW50IG51bV9zdWJkZXZzOworCS8qIGkyYyBidXMgYWRhcHRlciBubyAqLworCWludCBpMmNfYWRhcHRlcl9pZDsKIAkvKiBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHN1YmRldiAqLwogCXN0cnVjdCB2cGZlX3N1YmRldl9pbmZvICpzdWJfZGV2czsKIAkvKiBldm0gY2FyZCBpbmZvICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaAppbmRleCAyOWYwZTUzLi5lNDFhOTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKQEAgLTI2LDE0ICsyNiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworZXh0ZXJuIGludCBtZWRpYV9pcl9kZWJ1ZzsgICAgLyogbWVkaWFfaXJfZGVidWcgbGV2ZWwgKDAsMSwyKSAqLworI2RlZmluZSBJUl9kcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikJaWYgKG1lZGlhX2lyX2RlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCAsIF9fZnVuY19fLCAjIyBhcmcpCiAKICNkZWZpbmUgSVJfVFlQRV9SQzUgICAgIDEKICNkZWZpbmUgSVJfVFlQRV9QRCAgICAgIDIgLyogUHVsc2UgZGlzdGFuY2UgZW5jb2RlZCBJUiAqLwogI2RlZmluZSBJUl9UWVBFX09USEVSICA5OQogCi0jZGVmaW5lIElSX0tFWVRBQl9UWVBFIHUzMgotI2RlZmluZSBJUl9LRVlUQUJfU0laRQkxMjggIC8qIGVub3VndGggZm9yIHJjNSwgcHJvYmFibHkgbmVlZCBtb3JlIHNvbWUgZGF5ICovCi0KIHN0cnVjdCBpcl9zY2FuY29kZSB7CiAJdTE2CXNjYW5jb2RlOwogCXUzMglrZXljb2RlOwpAQCAtNDIsMTEgKzQ0LDkgQEAKIHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSB7CiAJc3RydWN0IGlyX3NjYW5jb2RlICpzY2FuOwogCWludCBzaXplOworCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKLSNkZWZpbmUgSVJfS0VZQ09ERSh0YWIsY29kZSkJKCgodW5zaWduZWQpY29kZSA8IElSX0tFWVRBQl9TSVpFKSBcCi0JCQkJID8gdGFiW2NvZGVdIDogS0VZX1JFU0VSVkVEKQotCiAjZGVmaW5lIFJDNV9TVEFSVCh4KQkoKCh4KT4+MTIpJjMpCiAjZGVmaW5lIFJDNV9UT0dHTEUoeCkJKCgoeCk+PjExKSYxKQogI2RlZmluZSBSQzVfQUREUih4KQkoKCh4KT4+NikmMzEpCkBAIC01NSwxMSArNTUsMTEgQEAKIHN0cnVjdCBpcl9pbnB1dF9zdGF0ZSB7CiAJLyogY29uZmlndXJhdGlvbiAqLwogCWludCAgICAgICAgICAgICAgICBpcl90eXBlOwotCUlSX0tFWVRBQl9UWVBFICAgICBpcl9jb2Rlc1tJUl9LRVlUQUJfU0laRV07CisKKwlzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUga2V5dGFibGU7CiAKIAkvKiBrZXkgaW5mbyAqLwotCXUzMiAgICAgICAgICAgICAgICBpcl9yYXc7ICAgICAgLyogcmF3IGRhdGEgKi8KLQl1MzIgICAgICAgICAgICAgICAgaXJfa2V5OyAgICAgIC8qIGlyIGtleSBjb2RlICovCisJdTMyICAgICAgICAgICAgICAgIGlyX2tleTsgICAgICAvKiBpciBzY2FuY29kZSAqLwogCXUzMiAgICAgICAgICAgICAgICBrZXljb2RlOyAgICAgLyogbGludXgga2V5IGNvZGUgKi8KIAlpbnQgICAgICAgICAgICAgICAga2V5cHJlc3NlZDsgIC8qIGN1cnJlbnQgc3RhdGUgKi8KIH07CkBAIC0xMDIsMjAgKzEwMiwzNiBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgIHRsZXQ7CiB9OwogCi12b2lkIGlyX2lucHV0X2luaXQoc3RydWN0IGlucHV0X2RldiAqZGV2LCBzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgKmlyLAorLyogUm91dGluZXMgZnJvbSBpci1mdW5jdGlvbnMuYyAqLworCitpbnQgaXJfaW5wdXRfaW5pdChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAqaXIsCiAJCSAgIGludCBpcl90eXBlLCBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgKmlyX2NvZGVzKTsKIHZvaWQgaXJfaW5wdXRfbm9rZXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCBzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgKmlyKTsKIHZvaWQgaXJfaW5wdXRfa2V5ZG93bihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAqaXIsCi0JCSAgICAgIHUzMiBpcl9rZXksIHUzMiBpcl9yYXcpOworCQkgICAgICB1MzIgaXJfa2V5KTsKIHUzMiAgaXJfZXh0cmFjdF9iaXRzKHUzMiBkYXRhLCB1MzIgbWFzayk7CiBpbnQgIGlyX2R1bXBfc2FtcGxlcyh1MzIgKnNhbXBsZXMsIGludCBjb3VudCk7CiBpbnQgIGlyX2RlY29kZV9iaXBoYXNlKHUzMiAqc2FtcGxlcywgaW50IGNvdW50LCBpbnQgbG93LCBpbnQgaGlnaCk7CiBpbnQgIGlyX2RlY29kZV9wdWxzZWRpc3RhbmNlKHUzMiAqc2FtcGxlcywgaW50IGNvdW50LCBpbnQgbG93LCBpbnQgaGlnaCk7Cit1MzIgIGlyX3JjNV9kZWNvZGUodW5zaWduZWQgaW50IGNvZGUpOwogCiB2b2lkIGlyX3JjNV90aW1lcl9lbmQodW5zaWduZWQgbG9uZyBkYXRhKTsKIHZvaWQgaXJfcmM1X3RpbWVyX2tleXVwKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKLS8qIEtleW1hcHMgdG8gYmUgdXNlZCBieSBvdGhlciBtb2R1bGVzICovCisvKiBSb3V0aW5lcyBmcm9tIGlyLWtleXRhYmxlLmMgKi8KKwordTMyIGlyX2dfa2V5Y29kZV9mcm9tX3RhYmxlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiwKKwkJCSAgICB1MzIgc2NhbmNvZGUpOworCitpbnQgaXJfc2V0X2tleWNvZGVfdGFibGUoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LAorCQkJIHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSAqcmNfdGFiKTsKKworaW50IGlyX3JvdW5kdXBfdGFibGVzaXplKGludCBuX2VsZW1zKTsKK2ludCBpcl9jb3B5X3RhYmxlKHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSAqZGVzdGluLAorCQkgY29uc3Qgc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlICpvcmlnaW4pOwordm9pZCBpcl9pbnB1dF9mcmVlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldik7CisKKy8qIHNjYW5jb2RlLT5rZXljb2RlIG1hcCB0YWJsZXMgZnJvbSBpci1rZXltYXBzLmMgKi8KIAogZXh0ZXJuIHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSBpcl9jb2Rlc19lbXB0eV90YWJsZTsKIGV4dGVybiBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfYXZlcm1lZGlhX3RhYmxlOwpAQCAtMTUwLDYgKzE2Niw3IEBACiBleHRlcm4gc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlIGlyX2NvZGVzX3dpbmZhc3RfdGFibGU7CiBleHRlcm4gc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlIGlyX2NvZGVzX3Bpbm5hY2xlX2NvbG9yX3RhYmxlOwogZXh0ZXJuIHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3X3RhYmxlOworZXh0ZXJuIHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSBpcl9jb2Rlc19yYzVfaGF1cHBhdWdlX25ld190YWJsZTsKIGV4dGVybiBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfbnBndGVjaF90YWJsZTsKIGV4dGVybiBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfbm9yd29vZF90YWJsZTsKIGV4dGVybiBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfcHJvdGV1c18yMzA5X3RhYmxlOwpAQCAtMTcyLDYgKzE4OSw4IEBACiBleHRlcm4gc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlIGlyX2NvZGVzX2t3b3JsZF9wbHVzX3R2X2FuYWxvZ190YWJsZTsKIGV4dGVybiBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfa2Fpb215X3RhYmxlOwogZXh0ZXJuIHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSBpcl9jb2Rlc19kbTExMDVfbmVjX3RhYmxlOworZXh0ZXJuIHN0cnVjdCBpcl9zY2FuY29kZV90YWJsZSBpcl9jb2Rlc190ZXZpaV9uZWNfdGFibGU7CitleHRlcm4gc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlIGlyX2NvZGVzX3Ric19uZWNfdGFibGU7CiBleHRlcm4gc3RydWN0IGlyX3NjYW5jb2RlX3RhYmxlIGlyX2NvZGVzX2V2Z2FfaW5kdHViZV90YWJsZTsKIGV4dGVybiBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfdGVycmF0ZWNfY2luZXJneV94c190YWJsZTsKIGV4dGVybiBzdHJ1Y3QgaXJfc2NhbmNvZGVfdGFibGUgaXJfY29kZXNfdmlkZW9tYXRlX3MzNTBfdGFibGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaAppbmRleCBjZjE2Njg5Li45MTk0MmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKQEAgLTY0LDYgKzY0LDcgQEAKIAlWNEwyX0lERU5UX09WOTY1MCA9IDI1NCwKIAlWNEwyX0lERU5UX09WOTY1NSA9IDI1NSwKIAlWNEwyX0lERU5UX1NPSTk2OCA9IDI1NiwKKwlWNEwyX0lERU5UX09WOTY0MCA9IDI1NywKIAogCS8qIG1vZHVsZSBzYWE3MTQ2OiByZXNlcnZlZCByYW5nZSAzMDAtMzA5ICovCiAJVjRMMl9JREVOVF9TQUE3MTQ2ID0gMzAwLApAQCAtNzIsNiArNzMsNyBAQAogCVY0TDJfSURFTlRfQ1gyMzQxOF84NDMgPSA0MDMsIC8qIEludGVncmF0ZWQgQS9WIERlY29kZXIgb24gdGhlICc0MTggKi8KIAlWNEwyX0lERU5UX0NYMjM0MTUgPSA0MTUsCiAJVjRMMl9JREVOVF9DWDIzNDE2ID0gNDE2LAorCVY0TDJfSURFTlRfQ1gyMzQxNyA9IDQxNywKIAlWNEwyX0lERU5UX0NYMjM0MTggPSA0MTgsCiAKIAkvKiBtb2R1bGUgYXUwODI4ICovCkBAIC0xMjksNiArMTMxLDkgQEAKIAlWNEwyX0lERU5UX1NBQTY3NTJIUyA9IDY3NTIsCiAJVjRMMl9JREVOVF9TQUE2NzUySFNfQUMzID0gNjc1MywKIAorCS8qIG1vZHVsZXMgdGVmNjg2MjoganVzdCBpZGVudCA2ODYyICovCisJVjRMMl9JREVOVF9URUY2ODYyID0gNjg2MiwKKwogCS8qIG1vZHVsZSBhZHY3MTcwOiBqdXN0IGlkZW50IDcxNzAgKi8KIAlWNEwyX0lERU5UX0FEVjcxNzAgPSA3MTcwLAogCkBAIC0xNjUsMTIgKzE3MCwyNyBAQAogCS8qIG1vZHVsZSBtdDl2MDExLCBqdXN0IGlkZW50IDgyNDMgKi8KIAlWNEwyX0lERU5UX01UOVYwMTEgPSA4MjQzLAogCisJLyogbW9kdWxlIGN4MjM4ODUgYW5kIGN4MjU4NDAgKi8KKwlWNEwyX0lERU5UX0NYMjM4ODUgICAgPSA4ODUwLAorCVY0TDJfSURFTlRfQ1gyMzg4NV9BViA9IDg4NTEsIC8qIEludGVncmF0ZWQgQS9WIGRlY29kZXIgKi8KKwlWNEwyX0lERU5UX0NYMjM4ODcgICAgPSA4ODcwLAorCVY0TDJfSURFTlRfQ1gyMzg4N19BViA9IDg4NzEsIC8qIEludGVncmF0ZWQgQS9WIGRlY29kZXIgKi8KKwlWNEwyX0lERU5UX0NYMjM4ODggICAgPSA4ODgwLAorCVY0TDJfSURFTlRfQ1gyMzg4OF9BViA9IDg4ODEsIC8qIEludGVncmF0ZWQgQS9WIGRlY29kZXIgKi8KKwlWNEwyX0lERU5UX0NYMjM4ODhfSVIgPSA4ODgyLCAvKiBJbnRlZ3JhdGVkIGluZnJhcmVkIGNvbnRyb2xsZXIgKi8KKwogCS8qIG1vZHVsZSB0dzk5MTA6IGp1c3QgaWRlbnQgOTkxMCAqLwogCVY0TDJfSURFTlRfVFc5OTEwID0gOTkxMCwKIAogCS8qIG1vZHVsZSBzbjljMjB4OiBqdXN0IGlkZW50IDEwMDAwICovCiAJVjRMMl9JREVOVF9TTjlDMjBYID0gMTAwMDAsCiAKKwkvKiBtb2R1bGUgY3gyMzF4eCBhbmQgY3gyNTg0MCAqLworCVY0TDJfSURFTlRfQ1gyMzEwWF9BViA9IDIzMDk5LCAvKiBJbnRlZ3JhdGVkIEEvViBkZWNvZGVyOyBub3QgaW4gJzEwMCAqLworCVY0TDJfSURFTlRfQ1gyMzEwMCAgICA9IDIzMTAwLAorCVY0TDJfSURFTlRfQ1gyMzEwMSAgICA9IDIzMTAxLAorCVY0TDJfSURFTlRfQ1gyMzEwMiAgICA9IDIzMTAyLAorCiAJLyogbW9kdWxlIG1zcDM0MDA6IHJlc2VydmVkIHJhbmdlIDM0MDAwLTM0OTk5IGFuZCA0NDAwMC00NDk5OSAqLwogCVY0TDJfSURFTlRfTVNQWDRYWCAgPSAzNDAwMCwgLyogZ2VuZXJpYyBNU1BYNFhYIGlkZW50aWZpZXIsIG9ubHkKIAkJCQkJdXNlIGludGVybmFsbHkgKHR2ZWVwcm9tLmMpLiAqLwpAQCAtMjY0LDYgKzI4NCw5IEBACiAKIAkvKiBtb2R1bGUgbTUyNzkwOiBqdXN0IGlkZW50IDUyNzkwICovCiAJVjRMMl9JREVOVF9NNTI3OTAgPSA1Mjc5MCwKKworCS8qIFNoYXJwIFJKNTROMUNCMEMsIDB4Q0IwQyA9IDUxOTgwICovCisJVjRMMl9JREVOVF9SSjU0TjFDQjBDID0gNTE5ODAsCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaAppbmRleCBkNDExMzQ1Li4wMGJmMTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCkBAIC0yMyw2ICsyMywxNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAorLyogZ2VuZXJpYyB2NGwyX2RldmljZSBub3RpZnkgY2FsbGJhY2sgbm90aWZpY2F0aW9uIHZhbHVlcyAqLworI2RlZmluZSBWNEwyX1NVQkRFVl9JUl9SWF9OT1RJRlkJCV9JT1coJ3YnLCAwLCB1MzIpCisjZGVmaW5lIFY0TDJfU1VCREVWX0lSX1JYX0ZJRk9fU0VSVklDRV9SRVEJMHgwMDAwMDAwMQorI2RlZmluZSBWNEwyX1NVQkRFVl9JUl9SWF9FTkRfT0ZfUlhfREVURUNURUQJMHgwMDAwMDAwMgorI2RlZmluZSBWNEwyX1NVQkRFVl9JUl9SWF9IV19GSUZPX09WRVJSVU4JMHgwMDAwMDAwNAorI2RlZmluZSBWNEwyX1NVQkRFVl9JUl9SWF9TV19GSUZPX09WRVJSVU4JMHgwMDAwMDAwOAorCisjZGVmaW5lIFY0TDJfU1VCREVWX0lSX1RYX05PVElGWQkJX0lPVygndicsIDEsIHUzMikKKyNkZWZpbmUgVjRMMl9TVUJERVZfSVJfVFhfRklGT19TRVJWSUNFX1JFUQkweDAwMDAwMDAxCisKIHN0cnVjdCB2NGwyX2RldmljZTsKIHN0cnVjdCB2NGwyX3N1YmRldjsKIHN0cnVjdCB0dW5lcl9zZXR1cDsKQEAgLTk2LDYgKzEwNiw5IEBACiAKICAgIHNfZ3Bpbzogc2V0IEdQSU8gcGlucy4gVmVyeSBzaW1wbGUgcmlnaHQgbm93LCBtaWdodCBuZWVkIHRvIGJlIGV4dGVuZGVkIHdpdGgKIAlhIGRpcmVjdGlvbiBhcmd1bWVudCBpZiBuZWVkZWQuCisKKyAgIHNfcG93ZXI6IHB1dHMgc3ViZGV2aWNlIGluIHBvd2VyIHNhdmluZyBtb2RlIChvbiA9PSAwKSBvciBub3JtYWwgb3BlcmF0aW9uCisJbW9kZSAob24gPT0gMSkuCiAgKi8KIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB7CiAJaW50ICgqZ19jaGlwX2lkZW50KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCk7CkBAIC0xMTgsNiArMTMxLDcgQEAKIAlpbnQgKCpnX3JlZ2lzdGVyKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZyk7CiAJaW50ICgqc19yZWdpc3Rlcikoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpOwogI2VuZGlmCisJaW50ICgqc19wb3dlcikoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKTsKIH07CiAKIC8qIHNfbW9kZTogc3dpdGNoIHRoZSB0dW5lciB0byBhIHNwZWNpZmljIHR1bmVyIG1vZGUuIFJlcGxhY2VtZW50IG9mIHNfcmFkaW8uCkBAIC0xMjcsOCArMTQxLDYgQEAKICAgIHNfdHlwZV9hZGRyOiBzZXRzIHR1bmVyIHR5cGUgYW5kIGl0cyBJMkMgYWRkci4KIAogICAgc19jb25maWc6IHNldHMgdGRhOTg4NyBzcGVjaWZpYyBzdHVmZiwgbGlrZSBwb3J0MSwgcG9ydDIgYW5kIHFzcwotCi0gICBzX3N0YW5kYnk6IHB1dHMgdHVuZXIgb24gcG93ZXJzYXZpbmcgc3RhdGUsIGRpc2FibGluZyBpdCwgZXhjZXB0IGZvciBpMmMuCiAgKi8KIHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgewogCWludCAoKnNfbW9kZSkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgZW51bSB2NGwyX3R1bmVyX3R5cGUpOwpAQCAtMTQxLDcgKzE1Myw2IEBACiAJaW50ICgqc19tb2R1bGF0b3IpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX21vZHVsYXRvciAqdm0pOwogCWludCAoKnNfdHlwZV9hZGRyKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdHVuZXJfc2V0dXAgKnR5cGUpOwogCWludCAoKnNfY29uZmlnKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCBzdHJ1Y3QgdjRsMl9wcml2X3R1bl9jb25maWcgKmNvbmZpZyk7Ci0JaW50ICgqc19zdGFuZGJ5KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKIH07CiAKIC8qIHNfY2xvY2tfZnJlcTogc2V0IHRoZSBmcmVxdWVuY3kgKGluIEh6KSBvZiB0aGUgYXVkaW8gY2xvY2sgb3V0cHV0LgpAQCAtMjMxLDExICsyNDIsOTUgQEAKIAlpbnQgKCplbnVtX2ZyYW1laW50ZXJ2YWxzKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSAqZml2YWwpOwogfTsKIAorLyoKKyAgIGludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmU6IENhbGxlZCBieSB0aGUgYnJpZGdlIGNoaXAncyBpbnRlcnJ1cHQgc2VydmljZQorCWhhbmRsZXIsIHdoZW4gYW4gSVIgaW50ZXJydXB0IHN0YXR1cyBoYXMgYmUgcmFpc2VkIGR1ZSB0byB0aGlzIHN1YmRldiwKKwlzbyB0aGF0IHRoaXMgc3ViZGV2IGNhbiBoYW5kbGUgdGhlIGRldGFpbHMuICBJdCBtYXkgc2NoZWR1bGUgd29yayB0byBiZQorCXBlcmZvcm1lZCBsYXRlci4gIEl0IG11c3Qgbm90IHNsZWVwLiAgKkNhbGxlZCBmcm9tIGFuIElSUSBjb250ZXh0Ki4KKworICAgW3J0XXhfZ19wYXJhbWV0ZXJzOiBHZXQgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHBhcmFtZXRlcnMgYW5kIHN0YXRlIG9mIHRoZQorCXRoZSBJUiByZWNlaXZlciBvciB0cmFuc21pdHRlci4KKworICAgW3J0XXhfc19wYXJhbWV0ZXJzOiBTZXQgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHBhcmFtZXRlcnMgYW5kIHN0YXRlIG9mIHRoZQorCXRoZSBJUiByZWNlaXZlciBvciB0cmFuc21pdHRlci4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIGNhbGwKKwlbcnRdeF9nX3BhcmFtZXRlcnMgZmlyc3QgdG8gZmlsbCBvdXQgdGhlIGN1cnJlbnQgc3RhdGUsIGFuZCBvbmx5IGNoYW5nZQorCXRoZSBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGNoYW5nZWQuICBVcG9uIHJldHVybiwgdGhlIGFjdHVhbCBkZXZpY2UKKwlvcGVyYXRpbmcgcGFyYW1ldGVycyBhbmQgc3RhdGUgd2lsbCBiZSByZXR1cm5lZC4gIE5vdGUgdGhhdCBoYXJkd2FyZQorCWxpbWl0YXRpb25zIG1heSBwcmV2ZW50IHRoZSBhY3R1YWwgc2V0dGluZ3MgZnJvbSBtYXRjaGluZyB0aGUgcmVxdWVzdGVkCisJc2V0dGluZ3MgLSBlLmcuIGFuIGFjdHVhbCBjYXJyaWVyIHNldHRpbmcgb2YgMzUsOTA0IEh6IHdoZW4gMzYsMDAwIEh6CisJd2FzIHJlcXVlc3RlZC4gIEFuIGV4Y2VwdGlvbiBpcyB3aGVuIHRoZSBzaHV0ZG93biBwYXJhbWV0ZXIgaXMgdHJ1ZS4KKwlUaGUgbGFzdCB1c2VkIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCwgYnV0IHRoZSBhY3R1YWwKKwlzdGF0ZSBvZiB0aGUgaGFyZHdhcmUgYmUgZGlmZmVyZW50IHRvIG1pbmltaXplIHBvd2VyIGNvbnN1bXB0aW9uIGFuZAorCXByb2Nlc3Npbmcgd2hlbiBzaHV0ZG93biBpcyB0cnVlLgorCisgICByeF9yZWFkOiBSZWFkcyByZWNlaXZlZCBjb2RlcyBvciBwdWxzZSB3aWR0aCBkYXRhLgorCVRoZSBzZW1hbnRpY3MgYXJlIHNpbWlsYXIgdG8gYSBub24tYmxvY2tpbmcgcmVhZCgpIGNhbGwuCisKKyAgIHR4X3dyaXRlOiBXcml0ZXMgY29kZXMgb3IgcHVsc2Ugd2lkdGggZGF0YSBmb3IgdHJhbnNtaXNzaW9uLgorCVRoZSBzZW1hbnRpY3MgYXJlIHNpbWlsYXIgdG8gYSBub24tYmxvY2tpbmcgd3JpdGUoKSBjYWxsLgorICovCisKK2VudW0gdjRsMl9zdWJkZXZfaXJfbW9kZSB7CisJVjRMMl9TVUJERVZfSVJfTU9ERV9QVUxTRV9XSURUSCwgLyogc3BhY2UgJiBtYXJrIHdpZHRocyBpbiBuYW5vc2VjcyAqLworfTsKKworLyogRGF0YSBmb3JtYXQgb2YgZGF0YSByZWFkIG9yIHdyaXR0ZW4gZm9yIFY0TDJfU1VCREVWX0lSX01PREVfUFVMU0VfV0lEVEggKi8KKyNkZWZpbmUgVjRMMl9TVUJERVZfSVJfUFVMU0VfTUFYX1dJRFRIX05TCTB4N2ZmZmZmZmYKKyNkZWZpbmUgVjRMMl9TVUJERVZfSVJfUFVMU0VfTEVWRUxfTUFTSwkJMHg4MDAwMDAwMAorI2RlZmluZSBWNEwyX1NVQkRFVl9JUl9QVUxTRV9SWF9TRVFfRU5ECQkweGZmZmZmZmZmCisKK3N0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzIHsKKwkvKiBFaXRoZXIgUnggb3IgVHggKi8KKwl1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX2RhdGFfZWxlbWVudDsgLyogb2YgZGF0YSBpbiByZWFkIG9yIHdyaXRlIGNhbGwgKi8KKwllbnVtIHY0bDJfc3ViZGV2X2lyX21vZGUgbW9kZTsKKworCWJvb2wgZW5hYmxlOworCWJvb2wgaW50ZXJydXB0X2VuYWJsZTsKKwlib29sIHNodXRkb3duOyAvKiB0cnVlOiBzZXQgaGFyZHdhcmUgdG8gbG93L25vIHBvd2VyLCBmYWxzZTogbm9ybWFsICovCisKKwlib29sIG1vZHVsYXRpb247ICAgICAgICAgICAvKiB0cnVlOiB1c2VzIGNhcnJpZXIsIGZhbHNlOiBiYXNlYmFuZCAqLworCXUzMiBtYXhfcHVsc2Vfd2lkdGg7ICAgICAgIC8qIG5zLCAgICAgIHZhbGlkIG9ubHkgZm9yIGJhc2ViYW5kIHNpZ25hbCAqLworCXVuc2lnbmVkIGludCBjYXJyaWVyX2ZyZXE7IC8qIEh6LCAgICAgIHZhbGlkIG9ubHkgZm9yIG1vZHVsYXRlZCBzaWduYWwqLworCXVuc2lnbmVkIGludCBkdXR5X2N5Y2xlOyAgIC8qIHBlcmNlbnQsIHZhbGlkIG9ubHkgZm9yIG1vZHVsYXRlZCBzaWduYWwqLworCWJvb2wgaW52ZXJ0OwkJICAgLyogbG9naWNhbGx5IGludmVydCBzZW5zZSBvZiBtYXJrL3NwYWNlICovCisKKwkvKiBSeCBvbmx5ICovCisJdTMyIG5vaXNlX2ZpbHRlcl9taW5fd2lkdGg7ICAgICAgIC8qIG5zLCBtaW4gdGltZSBvZiBhIHZhbGlkIHB1bHNlICovCisJdW5zaWduZWQgaW50IGNhcnJpZXJfcmFuZ2VfbG93ZXI7IC8qIEh6LCB2YWxpZCBvbmx5IGZvciBtb2R1bGF0ZWQgc2lnICovCisJdW5zaWduZWQgaW50IGNhcnJpZXJfcmFuZ2VfdXBwZXI7IC8qIEh6LCB2YWxpZCBvbmx5IGZvciBtb2R1bGF0ZWQgc2lnICovCisJdTMyIHJlc29sdXRpb247ICAgICAgICAgICAgICAgICAgIC8qIG5zICovCit9OworCitzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfb3BzIHsKKwkvKiBDb21tb24gdG8gcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyICovCisJaW50ICgqaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkJCXUzMiBzdGF0dXMsIGJvb2wgKmhhbmRsZWQpOworCisJLyogUmVjZWl2ZXIgKi8KKwlpbnQgKCpyeF9yZWFkKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJc3NpemVfdCAqbnVtKTsKKworCWludCAoKnJ4X2dfcGFyYW1ldGVycykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyAqcGFyYW1zKTsKKwlpbnQgKCpyeF9zX3BhcmFtZXRlcnMpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2lyX3BhcmFtZXRlcnMgKnBhcmFtcyk7CisKKwkvKiBUcmFuc21pdHRlciAqLworCWludCAoKnR4X3dyaXRlKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJc3NpemVfdCAqbnVtKTsKKworCWludCAoKnR4X2dfcGFyYW1ldGVycykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyAqcGFyYW1zKTsKKwlpbnQgKCp0eF9zX3BhcmFtZXRlcnMpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2lyX3BhcmFtZXRlcnMgKnBhcmFtcyk7Cit9OworCiBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHsKIAljb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgICpjb3JlOwogCWNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgKnR1bmVyOwogCWNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9hdWRpb19vcHMgKmF1ZGlvOwogCWNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgKnZpZGVvOworCWNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pcl9vcHMgICAgKmlyOwogfTsKIAogI2RlZmluZSBWNEwyX1NVQkRFVl9OQU1FX1NJWkUgMzIKQEAgLTI5MCw3ICszODUsNyBAQAogICAgRXhhbXBsZTogZXJyID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgZ19jaGlwX2lkZW50LCAmY2hpcCk7CiAgKi8KICNkZWZpbmUgdjRsMl9zdWJkZXZfY2FsbChzZCwgbywgZiwgYXJncy4uLikJCQkJXAotCSghKHNkKSA/IC1FTk9ERVYgOiAoKChzZCkgJiYgKHNkKS0+b3BzLT5vICYmIChzZCktPm9wcy0+by0+ZikgPwlcCisJKCEoc2QpID8gLUVOT0RFViA6ICgoKHNkKS0+b3BzLT5vICYmIChzZCktPm9wcy0+by0+ZikgPwlcCiAJCShzZCktPm9wcy0+by0+Zigoc2QpICwgIyNhcmdzKSA6IC1FTk9JT0NUTENNRCkpCiAKIC8qIFNlbmQgYSBub3RpZmljYXRpb24gdG8gdjRsMl9kZXZpY2UuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLWNvcmUuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtY29yZS5oCmluZGV4IDFjNTk0NmMuLjMxNmZkY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtY29yZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtY29yZS5oCkBAIC0xNjYsNyArMTY2LDcgQEAKIAllbnVtIHY0bDJfZmllbGQgICAgICAgICAgICBmaWVsZDsKIAllbnVtIHY0bDJfZmllbGQgICAgICAgICAgICBsYXN0OyAgIC8qIGZvciBmaWVsZD1WNEwyX0ZJRUxEX0FMVEVSTkFURSAqLwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgICAgICpidWZzW1ZJREVPX01BWF9GUkFNRV07Ci0Jc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyAgKm9wczsKKwljb25zdCBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzICAqb3BzOwogCXN0cnVjdCB2aWRlb2J1Zl9xdHlwZV9vcHMgICppbnRfb3BzOwogCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgc3RyZWFtaW5nOjE7CkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYnVmKTsKIAogdm9pZCB2aWRlb2J1Zl9xdWV1ZV9jb3JlX2luaXQoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAotCQkJIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgKm9wcywKKwkJCSBjb25zdCBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzICpvcHMsCiAJCQkgc3RydWN0IGRldmljZSAqZGV2LAogCQkJIHNwaW5sb2NrX3QgKmlycWxvY2ssCiAJCQkgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLWRtYS1jb250aWcuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oCmluZGV4IDU0OTM4NjYuLmViYWE5YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtY29yZS5oPgogCiB2b2lkIHZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCi0JCQkJICAgIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgKm9wcywKKwkJCQkgICAgY29uc3Qgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyAqb3BzLAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgIHNwaW5sb2NrX3QgKmlycWxvY2ssCiAJCQkJICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1kbWEtc2cuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtZG1hLXNnLmgKaW5kZXggZGRhNDdmMC4uNTNlNzJmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1kbWEtc2cuaAorKysgYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oCkBAIC0xMDMsNyArMTAzLDcgQEAKIHZvaWQgKnZpZGVvYnVmX3NnX2FsbG9jKHNpemVfdCBzaXplKTsKIAogdm9pZCB2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSogcSwKLQkJCSBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzICpvcHMsCisJCQkgY29uc3Qgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyAqb3BzLAogCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSBzcGlubG9ja190ICppcnFsb2NrLAogCQkJIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1kdmIuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtZHZiLmgKaW5kZXggNmJhNGYxMi4uMDdjZjRiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1kdmIuaAorKysgYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLWR2Yi5oCkBAIC00Miw3ICs0Miw5IEBACiAJCQkgIHZvaWQgKmFkYXB0ZXJfcHJpdiwKIAkJCSAgc3RydWN0IGRldmljZSAqZGV2aWNlLAogCQkJICBzaG9ydCAqYWRhcHRlcl9uciwKLQkJCSAgaW50IG1mZV9zaGFyZWQpOworCQkJICBpbnQgbWZlX3NoYXJlZCwKKwkJCSAgaW50ICgqZmVfaW9jdGxfb3ZlcnJpZGUpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwKKwkJCQkJdW5zaWduZWQgaW50LCB2b2lkICosIHVuc2lnbmVkIGludCkpOwogCiB2b2lkIHZpZGVvYnVmX2R2Yl91bnJlZ2lzdGVyX2J1cyhzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kcyAqZik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtdm1hbGxvYy5oIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi12bWFsbG9jLmgKaW5kZXggZTg3MjIyYy4uNGI0MTlhMjU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLXZtYWxsb2MuaAorKysgYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLXZtYWxsb2MuaApAQCAtMzAsOCArMzAsOCBAQAogfTsKIAogdm9pZCB2aWRlb2J1Zl9xdWV1ZV92bWFsbG9jX2luaXQoc3RydWN0IHZpZGVvYnVmX3F1ZXVlKiBxLAotCQkJIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgKm9wcywKLQkJCSB2b2lkICpkZXYsCisJCQkgY29uc3Qgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyAqb3BzLAorCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSBzcGlubG9ja190ICppcnFsb2NrLAogCQkJIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlLAogCQkJIGVudW0gdjRsMl9maWVsZCBmaWVsZCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKaW5kZXggNzU3MWUzMi4uZmYzMDE3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKQEAgLTk4OSw3ICs5ODksNyBAQAogCWludCBpbml0X3NlbnRfY291bnQ7CiAKIAkvKiBzdGF0ZSAgICAgICA6IFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgZGVzdGluYXRpb24sCi0JICogICAgICAgICAgICAgOiBpLmUuIFNDVFBfQUNUSVZFLCBTQ1RQX0lOQUNUSVZFLCBTQ1RQX1VOS09XTi4KKwkgKiAgICAgICAgICAgICA6IGkuZS4gU0NUUF9BQ1RJVkUsIFNDVFBfSU5BQ1RJVkUsIFNDVFBfVU5LTk9XTi4KIAkgKi8KIAlpbnQgc3RhdGU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggZTJkMmNhMi4uNTc0MGI4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAJc2tiX3F1ZXVlX3dhbGtfZnJvbV9zYWZlKCYoc2spLT5za193cml0ZV9xdWV1ZSwgc2tiLCB0bXApCiAKIC8qIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhICJ0aW1lb3V0IiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSB0aW1lb3V0IG9mIGEKLSAqIFRDUCBjb25uZWN0aW9uIGFmdGVyICJib3VuZGFyeSIgdW5zdWNlc3NmdWwsIGV4cG9uZW50aWFsbHkgYmFja2VkLW9mZgorICogVENQIGNvbm5lY3Rpb24gYWZ0ZXIgImJvdW5kYXJ5IiB1bnN1Y2Nlc3NmdWwsIGV4cG9uZW50aWFsbHkgYmFja2VkLW9mZgogICogcmV0cmFuc21pc3Npb25zIHdpdGggYW4gaW5pdGlhbCBSVE8gb2YgVENQX1JUT19NSU4uCiAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCByZXRyYW5zbWl0c190aW1lZF9vdXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvd2ltYXguaCBiL2luY2x1ZGUvbmV0L3dpbWF4LmgKaW5kZXggZDY5YzRhNy4uMzQ2MWFhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvd2ltYXguaAorKysgYi9pbmNsdWRlL25ldC93aW1heC5oCkBAIC03OSw3ICs3OSw3IEBACiAgKiBkcml2ZXJzIGhhdmUgdG8gb25seSByZXBvcnQgc3RhdGUgY2hhbmdlcyBkdWUgdG8gZXh0ZXJuYWwKICAqIGNvbmRpdGlvbnMuCiAgKgotICogQWxsIEFQSSBvcGVyYXRpb25zIGFyZSAnYXRvbWljJywgc2VyaWFsaXplZCB0aG9yb3VnaCBhIG11dGV4IGluIHRoZQorICogQWxsIEFQSSBvcGVyYXRpb25zIGFyZSAnYXRvbWljJywgc2VyaWFsaXplZCB0aHJvdWdoIGEgbXV0ZXggaW4gdGhlCiAgKiBgc3RydWN0IHdpbWF4X2RldmAuCiAgKgogICogRVhQT1JUSU5HIFRPIFVTRVIgU1BBQ0UgVEhST1VHSCBHRU5FUklDIE5FVExJTksKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9LYnVpbGQgYi9pbmNsdWRlL3Njc2kvS2J1aWxkCmluZGV4IDMzYjI3NTAuLmIzYTBlZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9LYnVpbGQKKysrIGIvaW5jbHVkZS9zY3NpL0tidWlsZApAQCAtMiwzICsyLDQgQEAKIGhlYWRlci15ICs9IHNjc2lfbmV0bGluay5oCiBoZWFkZXIteSArPSBzY3NpX25ldGxpbmtfZmMuaAogaGVhZGVyLXkgKz0gc2NzaV9ic2dfZmMuaAoraGVhZGVyLXkgKz0gZmMvCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvS2J1aWxkIGIvaW5jbHVkZS9zY3NpL2ZjL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYwMzgxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zY3NpL2ZjL0tidWlsZApAQCAtMCwwICsxLDQgQEAKK2hlYWRlci15ICs9IGZjX2Vscy5oCitoZWFkZXIteSArPSBmY19mcy5oCitoZWFkZXIteSArPSBmY19ncy5oCitoZWFkZXIteSArPSBmY19ucy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZWxzLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZWxzLmgKaW5kZXggMTk1Y2EwMS4uZjk0MzI4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2Vscy5oCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19lbHMuaApAQCAtMjAsNiArMjAsOCBAQAogI2lmbmRlZiBfRkNfRUxTX0hfCiAjZGVmaW5lCV9GQ19FTFNfSF8KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qCiAgKiBGaWJyZSBDaGFubmVsIFN3aXRjaCAtIEVuaGFuY2VkIExpbmsgU2VydmljZXMgZGVmaW5pdGlvbnMuCiAgKiBGcm9tIFQxMSBGQy1MUyBSZXYgMS4yIEp1bmUgNywgMjAwNS4KQEAgLTI0OCwxMCArMjUwLDEyIEBACiAvKgogICogc3BfZmVhdHVyZXMKICAqLwotI2RlZmluZQlGQ19TUF9GVF9DSVJPCTB4ODAwMAkvKiBjb250aW51b3VzbHkgaW5jcmVhc2luZyByZWwuIG9mZi4gKi8KKyNkZWZpbmUJRkNfU1BfRlRfTlBJVgkweDgwMDAJLyogbXVsdGlwbGUgTl9Qb3J0X0lEIHN1cHBvcnQgKEZMT0dJKSAqLworI2RlZmluZQlGQ19TUF9GVF9DSVJPCTB4ODAwMAkvKiBjb250aW51b3VzbHkgaW5jcmVhc2luZyByZWwgb2ZmIChQTE9HSSkgKi8KICNkZWZpbmUJRkNfU1BfRlRfQ0xBRAkweDgwMDAJLyogY2xlYW4gYWRkcmVzcyAoaW4gRkxPR0kgTFNfQUNDKSAqLwogI2RlZmluZQlGQ19TUF9GVF9SQU5ECTB4NDAwMAkvKiByYW5kb20gcmVsYXRpdmUgb2Zmc2V0ICovCiAjZGVmaW5lCUZDX1NQX0ZUX1ZBTAkweDIwMDAJLyogdmFsaWQgdmVuZG9yIHZlcnNpb24gbGV2ZWwgKi8KKyNkZWZpbmUJRkNfU1BfRlRfTlBJVl9BQ0MJMHgyMDAwCS8qIE5QSVYgYXNzaWdubWVudCAoRkxPR0kgTFNfQUNDKSAqLwogI2RlZmluZQlGQ19TUF9GVF9GUE9SVAkweDEwMDAJLyogRiBwb3J0ICgxKSB2cy4gTiBwb3J0ICgwKSAqLwogI2RlZmluZQlGQ19TUF9GVF9BQkIJMHgwODAwCS8qIGFsdGVybmF0ZSBCQl9jcmVkaXQgbWFuYWdlbWVudCAqLwogI2RlZmluZQlGQ19TUF9GVF9FRFRSCTB4MDQwMAkvKiBFX0RfVE9WIFJlc29sdXRpb24gaXMgbmFub3NlY29uZHMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mYy9mY19mY29lLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmNvZS5oCmluZGV4IGNjYjNkYmUuLmU2YWQzZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9mYy9mY19mY29lLmgKKysrIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX2Zjb2UuaApAQCAtODYsNiArODYsMTggQEAKICNkZWZpbmUgRkNPRV9NSU5fRlJBTUUgNDYKIAogLyoKKyAqIEZDb0UgTGluayBFcnJvciBTdGF0dXMgQmxvY2s6IFQxMSBGQy1CQi01IFJldjIuMCwgQ2xhdXNlIDcuMTAuCisgKi8KK3N0cnVjdCBmY29lX2ZjX2Vsc19sZXNiIHsKKwlfX2JlMzIJCWxlc2JfbGlua19mYWlsOwkvKiBsaW5rIGZhaWx1cmUgY291bnQgKi8KKwlfX2JlMzIJCWxlc2JfdmxpbmtfZmFpbDsgLyogdmlydHVhbCBsaW5rIGZhaWx1cmUgY291bnQgKi8KKwlfX2JlMzIJCWxlc2JfbWlzc19ma2E7CS8qIG1pc3NpbmcgRklQIGtlZXAtYWxpdmUgY291bnQgKi8KKwlfX2JlMzIJCWxlc2Jfc3ltYl9lcnI7CS8qIHN5bWJvbCBlcnJvciBkdXJpbmcgY2FycmllciBjb3VudCAqLworCV9fYmUzMgkJbGVzYl9lcnJfYmxvY2s7CS8qIGVycm9yZWQgYmxvY2sgY291bnQgKi8KKwlfX2JlMzIJCWxlc2JfZmNzX2Vycm9yOyAvKiBmcmFtZSBjaGVjayBzZXF1ZW5jZSBlcnJvciBjb3VudCAqLworfTsKKworLyoKICAqIGZjX2Zjb2Vfc2V0X21hYyAtIFN0b3JlIE9VSSArIERJRCBpbnRvIE1BQyBhZGRyZXNzIGZpZWxkLgogICogQG1hYzogbWFjIGFkZHJlc3MgdG8gYmUgc2V0CiAgKiBAZGlkOiBmYyBkZXN0IGlkIHRvIHVzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZjcC5oIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZjcC5oCmluZGV4IDVkMzhmMTkuLjc0N2UyYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9mYy9mY19mY3AuaAorKysgYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmNwLmgKQEAgLTgzLDYgKzgzLDggQEAKICAqIGZjX3RtX2ZsYWdzIC0gdGFzayBtYW5hZ2VtZW50IGZsYWdzIGZpZWxkLgogICovCiAjZGVmaW5lCUZDUF9UTUZfQ0xSX0FDQQkJMHg0MAkvKiBjbGVhciBBQ0EgY29uZGl0aW9uICovCisjZGVmaW5lCUZDUF9UTUZfVEdUX1JFU0VUCTB4MjAJLyogdGFyZ2V0IHJlc2V0IHRhc2sgbWFuYWdlbWVudCwKKwkJCQkJICAgZGVwcmVjYXRlZCBhcyBvZiBGQ1AtMyAqLwogI2RlZmluZQlGQ1BfVE1GX0xVTl9SRVNFVAkweDEwCS8qIGxvZ2ljYWwgdW5pdCByZXNldCB0YXNrIG1hbmFnZW1lbnQgKi8KICNkZWZpbmUJRkNQX1RNRl9DTFJfVEFTS19TRVQJMHgwNAkvKiBjbGVhciB0YXNrIHNldCAqLwogI2RlZmluZQlGQ1BfVE1GX0FCVF9UQVNLX1NFVAkweDAyCS8qIGFib3J0IHRhc2sgc2V0ICovCkBAIC0xOTYsNCArMTk4LDEwIEBACiAJX191OAkJc3JyX3Jlc3ZkMlszXTsJLyogcmVzZXJ2ZWQgKi8KIH07CiAKKy8qCisgKiBGZWF0dXJlIGJpdHMgaW4gbmFtZSBzZXJ2ZXIgRkMtNCBGZWF0dXJlcyBvYmplY3QuCisgKi8KKyNkZWZpbmUJRkNQX0ZFQVRfVEFSRwkoMSA8PCAwKQkvKiB0YXJnZXQgZnVuY3Rpb24gc3VwcG9ydGVkICovCisjZGVmaW5lCUZDUF9GRUFUX0lOSVQJKDEgPDwgMSkJLyogaW5pdGlhdG9yIGZ1bmN0aW9uIHN1cHBvcnRlZCAqLworCiAjZW5kaWYgLyogX0ZDX0ZDUF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZpcC5oIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZpcC5oCmluZGV4IDNkMTM4YzEuLjE3YmFhMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9mYy9mY19maXAuaAorKysgYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmlwLmgKQEAgLTIxNCwxMSArMjE0LDIxIEBACiAgKi8KIHN0cnVjdCBmaXBfZmthX2Rlc2MgewogCXN0cnVjdCBmaXBfZGVzYyBmZF9kZXNjOwotCV9fdTgJCWZkX3Jlc3ZkWzJdOworCV9fdTgJCWZkX3Jlc3ZkOworCV9fdTgJCWZkX2ZsYWdzOwkvKiBiaXQwIGlzIGZrYSBkaXNhYmxlIGZsYWcgKi8KIAlfX2JlMzIJCWZkX2ZrYV9wZXJpb2Q7CS8qIGFkdi4va2VlcC1hbGl2ZSBwZXJpb2QgaW4gbVMgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCisgKiBmbGFncyBmb3IgZmlwX2ZrYV9kZXNjLmZkX2ZsYWdzCisgKi8KK2VudW0gZmlwX2ZrYV9mbGFncyB7CisJRklQX0ZLQV9BRFZfRCA9CTB4MDEsCQkvKiBubyBuZWVkIGZvciBGS0EgZnJvbSBFTm9kZSAqLworfTsKKworLyogRklQX0RUX0ZLQSBmbGFncyAqLworCisvKgogICogRklQX0RUX1ZFTkRPUiBkZXNjcmlwdG9yLgogICovCiBzdHJ1Y3QgZmlwX3ZlbmRvcl9kZXNjIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mYy9mY19mcy5oIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZzLmgKaW5kZXggYWM0Y2QzOC4uNTBmMjhiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZzLmgKKysrIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZzLmgKQEAgLTIwLDYgKzIwLDggQEAKICNpZm5kZWYgX0ZDX0ZTX0hfCiAjZGVmaW5lIF9GQ19GU19IXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLyoKICAqIEZpYnJlIENoYW5uZWwgRnJhbWluZyBhbmQgU2lnbmFsbGluZyBkZWZpbml0aW9ucy4KICAqIEZyb20gVDExIEZDLUZTLTIgUmV2IDAuOTAgLSA5IEF1Z3VzdCAyMDA1LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2dzLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZ3MuaAppbmRleCAzMjRkZDBlLi5hMzczNDZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvZmMvZmNfZ3MuaAorKysgYi9pbmNsdWRlL3Njc2kvZmMvZmNfZ3MuaApAQCAtMjAsNiArMjAsOCBAQAogI2lmbmRlZiBfRkNfR1NfSF8KICNkZWZpbmUJX0ZDX0dTX0hfCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAvKgogICogRmlicmUgQ2hhbm5lbCBTZXJ2aWNlcyAtIENvbW1vbiBUcmFuc3BvcnQuCiAgKiBGcm9tIFQxMS5vcmcgRkMtR1MtMiBSZXYgNS4zIE5vdmVtYmVyIDE5OTguCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfbnMuaCBiL2luY2x1ZGUvc2NzaS9mYy9mY19ucy5oCmluZGV4IDc5MGQ3YjkuLmU3ZDNhYzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9mYy9mY19ucy5oCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19ucy5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaWZuZGVmIF9GQ19OU19IXwogI2RlZmluZQlfRkNfTlNfSF8KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qCiAgKiBGaWJyZSBDaGFubmVsIFNlcnZpY2VzIC0gTmFtZSBTZXJ2aWNlIChkTlMpCiAgKiBGcm9tIFQxMS5vcmcgRkMtR1MtMiBSZXYgNS4zIE5vdmVtYmVyIDE5OTguCkBAIC00NCw5ICs0NiwxMiBAQAogCUZDX05TX0dJRF9GVCA9CTB4MDE3MSwJCS8qIGdldCBJRHMgYnkgRkM0IHR5cGUgKi8KIAlGQ19OU19HUE5fRlQgPQkweDAxNzIsCQkvKiBnZXQgcG9ydCBuYW1lcyBieSBGQzQgdHlwZSAqLwogCUZDX05TX0dJRF9QVCA9CTB4MDFhMSwJCS8qIGdldCBJRHMgYnkgcG9ydCB0eXBlICovCi0JRkNfTlNfUkZUX0lEID0JMHgwMjE3LAkJLyogcmVnIEZDNCB0eXBlIGZvciBJRCAqLwogCUZDX05TX1JQTl9JRCA9CTB4MDIxMiwJCS8qIHJlZyBwb3J0IG5hbWUgZm9yIElEICovCiAJRkNfTlNfUk5OX0lEID0JMHgwMjEzLAkJLyogcmVnIG5vZGUgbmFtZSBmb3IgSUQgKi8KKwlGQ19OU19SRlRfSUQgPQkweDAyMTcsCQkvKiByZWcgRkM0IHR5cGUgZm9yIElEICovCisJRkNfTlNfUlNQTl9JRCA9CTB4MDIxOCwJCS8qIHJlZyBzeW1ib2xpYyBwb3J0IG5hbWUgKi8KKwlGQ19OU19SRkZfSUQgPQkweDAyMWYsCQkvKiByZWcgRkM0IEZlYXR1cmVzIGZvciBJRCAqLworCUZDX05TX1JTTk5fTk4gPQkweDAyMzksCQkvKiByZWcgc3ltYm9saWMgbm9kZSBuYW1lICovCiB9OwogCiAvKgpAQCAtMTU2LDQgKzE2MSwzMiBAQAogCV9fYmU2NAkJZnJfd3duOwkJLyogbm9kZSBuYW1lIG9yIHBvcnQgbmFtZSAqLwogfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKKy8qCisgKiBSU05OX05OIHJlcXVlc3QgLSByZWdpc3RlciBzeW1ib2xpYyBub2RlIG5hbWUKKyAqLworc3RydWN0IGZjX25zX3Jzbm4geworCV9fYmU2NAkJZnJfd3duOwkJLyogbm9kZSBuYW1lICovCisJX191OAkJZnJfbmFtZV9sZW47CisJY2hhcgkJZnJfbmFtZVtdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKiBSU1BOX0lEIHJlcXVlc3QgLSByZWdpc3RlciBzeW1ib2xpYyBwb3J0IG5hbWUKKyAqLworc3RydWN0IGZjX25zX3JzcG4geworCXN0cnVjdCBmY19uc19maWQgZnJfZmlkOwkvKiBwb3J0IElEIG9iamVjdCAqLworCV9fdTgJCWZyX25hbWVfbGVuOworCWNoYXIJCWZyX25hbWVbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKgorICogUkZGX0lEIHJlcXVlc3QgLSByZWdpc3RlciBGQy00IEZlYXR1cmVzIGZvciBJRC4KKyAqLworc3RydWN0IGZjX25zX3JmZl9pZCB7CisJc3RydWN0IGZjX25zX2ZpZCBmcl9maWQ7CS8qIHBvcnQgSUQgb2JqZWN0ICovCisJX191OAkJZnJfcmVzdmRbMl07CisJX191OAkJZnJfZmVhdDsJLyogRkMtNCBGZWF0dXJlIGJpdHMgKi8KKwlfX3U4CQlmcl90eXBlOwkvKiBGQy00IHR5cGUgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCiAjZW5kaWYgLyogX0ZDX05TX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmNfZW5jb2RlLmggYi9pbmNsdWRlL3Njc2kvZmNfZW5jb2RlLmgKaW5kZXggMjdkYWQ3MC4uOGViMGEwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjX2VuY29kZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9mY19lbmNvZGUuaApAQCAtMzIsNyArMzIsMTAgQEAKIAkJc3RydWN0IGZjX25zX2dpZF9mdCBnaWQ7CiAJCXN0cnVjdCBmY19uc19ybl9pZCAgcm47CiAJCXN0cnVjdCBmY19uc19yZnQgcmZ0OworCQlzdHJ1Y3QgZmNfbnNfcmZmX2lkIHJmZjsKIAkJc3RydWN0IGZjX25zX2ZpZCBmaWQ7CisJCXN0cnVjdCBmY19uc19yc25uIHNubjsKKwkJc3RydWN0IGZjX25zX3JzcG4gc3BuOwogCX0gcGF5bG9hZDsKIH07CiAKQEAgLTEwOSw2ICsxMTIsNyBAQAogCQkgICAgICBlbnVtIGZjX2ZoX3R5cGUgKmZoX3R5cGUpCiB7CiAJc3RydWN0IGZjX2N0X3JlcSAqY3Q7CisJc2l6ZV90IGxlbjsKIAogCXN3aXRjaCAob3ApIHsKIAljYXNlIEZDX05TX0dQTl9GVDoKQEAgLTEyOCwxMiArMTMyLDQxIEBACiAJCWN0LT5wYXlsb2FkLnJmdC5mdHMgPSBscG9ydC0+ZmN0czsKIAkJYnJlYWs7CiAKLQljYXNlIEZDX05TX1JQTl9JRDoKKwljYXNlIEZDX05TX1JGRl9JRDoKKwkJY3QgPSBmY19jdF9oZHJfZmlsbChmcCwgb3AsIHNpemVvZihzdHJ1Y3QgZmNfbnNfcmZmX2lkKSk7CisJCWh0b24yNChjdC0+cGF5bG9hZC5yZmYuZnJfZmlkLmZwX2ZpZCwKKwkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOworCQljdC0+cGF5bG9hZC5yZmYuZnJfdHlwZSA9IEZDX1RZUEVfRkNQOworCQlpZiAobHBvcnQtPnNlcnZpY2VfcGFyYW1zICYgRkNQX1NQUEZfSU5JVF9GQ04pCisJCQljdC0+cGF5bG9hZC5yZmYuZnJfZmVhdCA9IEZDUF9GRUFUX0lOSVQ7CisJCWlmIChscG9ydC0+c2VydmljZV9wYXJhbXMgJiBGQ1BfU1BQRl9UQVJHX0ZDTikKKwkJCWN0LT5wYXlsb2FkLnJmZi5mcl9mZWF0IHw9IEZDUF9GRUFUX1RBUkc7CisJCWJyZWFrOworCisJY2FzZSBGQ19OU19STk5fSUQ6CiAJCWN0ID0gZmNfY3RfaGRyX2ZpbGwoZnAsIG9wLCBzaXplb2Yoc3RydWN0IGZjX25zX3JuX2lkKSk7CiAJCWh0b24yNChjdC0+cGF5bG9hZC5ybi5mcl9maWQuZnBfZmlkLAogCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7Ci0JCWN0LT5wYXlsb2FkLnJmdC5mdHMgPSBscG9ydC0+ZmN0czsKLQkJcHV0X3VuYWxpZ25lZF9iZTY0KGxwb3J0LT53d3BuLCAmY3QtPnBheWxvYWQucm4uZnJfd3duKTsKKwkJcHV0X3VuYWxpZ25lZF9iZTY0KGxwb3J0LT53d25uLCAmY3QtPnBheWxvYWQucm4uZnJfd3duKTsKKwkJYnJlYWs7CisKKwljYXNlIEZDX05TX1JTUE5fSUQ6CisJCWxlbiA9IHN0cm5sZW4oZmNfaG9zdF9zeW1ib2xpY19uYW1lKGxwb3J0LT5ob3N0KSwgMjU1KTsKKwkJY3QgPSBmY19jdF9oZHJfZmlsbChmcCwgb3AsIHNpemVvZihzdHJ1Y3QgZmNfbnNfcnNwbikgKyBsZW4pOworCQlodG9uMjQoY3QtPnBheWxvYWQuc3BuLmZyX2ZpZC5mcF9maWQsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKKwkJc3RybmNweShjdC0+cGF5bG9hZC5zcG4uZnJfbmFtZSwKKwkJCWZjX2hvc3Rfc3ltYm9saWNfbmFtZShscG9ydC0+aG9zdCksIGxlbik7CisJCWN0LT5wYXlsb2FkLnNwbi5mcl9uYW1lX2xlbiA9IGxlbjsKKwkJYnJlYWs7CisKKwljYXNlIEZDX05TX1JTTk5fTk46CisJCWxlbiA9IHN0cm5sZW4oZmNfaG9zdF9zeW1ib2xpY19uYW1lKGxwb3J0LT5ob3N0KSwgMjU1KTsKKwkJY3QgPSBmY19jdF9oZHJfZmlsbChmcCwgb3AsIHNpemVvZihzdHJ1Y3QgZmNfbnNfcnNubikgKyBsZW4pOworCQlwdXRfdW5hbGlnbmVkX2JlNjQobHBvcnQtPnd3bm4sICZjdC0+cGF5bG9hZC5zbm4uZnJfd3duKTsKKwkJc3RybmNweShjdC0+cGF5bG9hZC5zbm4uZnJfbmFtZSwKKwkJCWZjX2hvc3Rfc3ltYm9saWNfbmFtZShscG9ydC0+aG9zdCksIGxlbik7CisJCWN0LT5wYXlsb2FkLnNubi5mcl9uYW1lX2xlbiA9IGxlbjsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTk4LDYgKzIzMSwzMSBAQAogCXNwLT5zcF9iYl9kYXRhID0gaHRvbnMoKHUxNikgbHBvcnQtPm1mcyk7CiAJY3AgPSAmZmxvZ2ktPmZsX2Nzc3BbMyAtIDFdOwkvKiBjbGFzcyAzIHBhcmFtZXRlcnMgKi8KIAljcC0+Y3BfY2xhc3MgPSBodG9ucyhGQ19DUENfVkFMSUQgfCBGQ19DUENfU0VRKTsKKwlpZiAobHBvcnQtPmRvZXNfbnBpdikKKwkJc3AtPnNwX2ZlYXR1cmVzID0gaHRvbnMoRkNfU1BfRlRfTlBJVik7Cit9CisKKy8qKgorICogZmNfZmRpc2NfZmlsbCAtIEZpbGwgaW4gYSBmZGlzYyByZXF1ZXN0IGZyYW1lLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmNfZmRpc2NfZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXN0cnVjdCBmY19lbHNfY3NwICpzcDsKKwlzdHJ1Y3QgZmNfZWxzX2Nzc3AgKmNwOworCXN0cnVjdCBmY19lbHNfZmxvZ2kgKmZkaXNjOworCisJZmRpc2MgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpmZGlzYykpOworCW1lbXNldChmZGlzYywgMCwgc2l6ZW9mKCpmZGlzYykpOworCWZkaXNjLT5mbF9jbWQgPSAodTgpIEVMU19GRElTQzsKKwlwdXRfdW5hbGlnbmVkX2JlNjQobHBvcnQtPnd3cG4sICZmZGlzYy0+Zmxfd3dwbik7CisJcHV0X3VuYWxpZ25lZF9iZTY0KGxwb3J0LT53d25uLCAmZmRpc2MtPmZsX3d3bm4pOworCXNwID0gJmZkaXNjLT5mbF9jc3A7CisJc3AtPnNwX2hpX3ZlciA9IDB4MjA7CisJc3AtPnNwX2xvX3ZlciA9IDB4MjA7CisJc3AtPnNwX2JiX2NyZWQgPSBodG9ucygxMCk7CS8qIHRoaXMgZ2V0cyBzZXQgYnkgZ2F0ZXdheSAqLworCXNwLT5zcF9iYl9kYXRhID0gaHRvbnMoKHUxNikgbHBvcnQtPm1mcyk7CisJY3AgPSAmZmRpc2MtPmZsX2Nzc3BbMyAtIDFdOwkvKiBjbGFzcyAzIHBhcmFtZXRlcnMgKi8KKwljcC0+Y3BfY2xhc3MgPSBodG9ucyhGQ19DUENfVkFMSUQgfCBGQ19DUENfU0VRKTsKIH0KIAogLyoqCkBAIC0yOTYsNiArMzU0LDEwIEBACiAJCWZjX2Zsb2dpX2ZpbGwobHBvcnQsIGZwKTsKIAkJYnJlYWs7CiAKKwljYXNlIEVMU19GRElTQzoKKwkJZmNfZmRpc2NfZmlsbChscG9ydCwgZnApOworCQlicmVhazsKKwogCWNhc2UgRUxTX0xPR086CiAJCWZjX2xvZ29fZmlsbChscG9ydCwgZnApOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mY19mcmFtZS5oIGIvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmgKaW5kZXggYzM1ZDIzOC4uNGQzZTljNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmgKKysrIGIvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmgKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZjcC5oPgogI2luY2x1ZGUgPHNjc2kvZmMvZmNfZW5jYXBzLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCiAvKgogICogVGhlIGZjX2ZyYW1lIGludGVyZmFjZSBpcyB1c2VkIHRvIHBhc3MgZnJhbWUgZGF0YSBiZXR3ZWVuIGZ1bmN0aW9ucy4KICAqIFRoZSBmcmFtZSBpbmNsdWRlcyB0aGUgZGF0YSBidWZmZXIsIGxlbmd0aCwgYW5kIFNPRiAvIEVPRiBkZWxpbWl0ZXIgdHlwZXMuCkBAIC0zNyw2ICszOSw5IEBACiAjZGVmaW5lCUZDX0ZSQU1FX0hFQURST09NCTMyCS8qIGhlYWRyb29tIGZvciBWTEFOICsgRkNvRSBoZWFkZXJzICovCiAjZGVmaW5lCUZDX0ZSQU1FX1RBSUxST09NCTgJLyogdHJhaWxlciBzcGFjZSBmb3IgRkNvRSAqLwogCisvKiBNYXggbnVtYmVyIG9mIHNrYiBmcmFncyBhbGxvd2VkLCByZXNlcnZpbmcgb25lIGZvciBmY29lX2NyY19lb2YgcGFnZSAqLworI2RlZmluZSBGQ19GUkFNRV9TR19MRU4JCShNQVhfU0tCX0ZSQUdTIC0gMSkKKwogI2RlZmluZSBmcF9za2IoZnApCSgmKChmcCktPnNrYikpCiAjZGVmaW5lIGZyX2hkcihmcCkJKChmcCktPnNrYi5kYXRhKQogI2RlZmluZSBmcl9sZW4oZnApCSgoZnApLT5za2IubGVuKQpAQCAtNjQsNiArNjksNyBAQAogCWVudW0gZmNfc29mCWZyX3NvZjsJCS8qIHN0YXJ0IG9mIGZyYW1lIGRlbGltaXRlciAqLwogCWVudW0gZmNfZW9mCWZyX2VvZjsJCS8qIGVuZCBvZiBmcmFtZSBkZWxpbWl0ZXIgKi8KIAl1OAkJZnJfZmxhZ3M7CS8qIGZsYWdzIC0gc2VlIGJlbG93ICovCisJdTgJCWdyYW50ZWRfbWFjW0VUSF9BTEVOXTsgLyogRkNvRSBNQUMgYWRkcmVzcyAqLwogfTsKIAogCkBAIC05NCwxNyArMTAwLDcgQEAKIH0KIAogc3RydWN0IGZjX2ZyYW1lICpmY19mcmFtZV9hbGxvY19maWxsKHN0cnVjdCBmY19scG9ydCAqLCBzaXplX3QgcGF5bG9hZF9sZW4pOwotCi1zdHJ1Y3QgZmNfZnJhbWUgKl9fZmNfZnJhbWVfYWxsb2Moc2l6ZV90IHBheWxvYWRfbGVuKTsKLQotLyoKLSAqIEdldCBmcmFtZSBmb3Igc2VuZGluZyB2aWEgcG9ydC4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZmNfZnJhbWUgKl9mY19mcmFtZV9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKmRldiwKLQkJCQkJICAgICAgIHNpemVfdCBwYXlsb2FkX2xlbikKLXsKLQlyZXR1cm4gX19mY19mcmFtZV9hbGxvYyhwYXlsb2FkX2xlbik7Ci19CitzdHJ1Y3QgZmNfZnJhbWUgKl9mY19mcmFtZV9hbGxvYyhzaXplX3QgcGF5bG9hZF9sZW4pOwogCiAvKgogICogQWxsb2NhdGUgZmNfZnJhbWUgc3RydWN0dXJlIGFuZCBidWZmZXIuICBTZXQgdGhlIGluaXRpYWwgbGVuZ3RoIHRvCkBAIC0xMTgsMTAgKzExNCwxMCBAQAogCSAqIE5vdGU6IFNpbmNlIGxlbiB3aWxsIG9mdGVuIGJlIGEgY29uc3RhbnQgbXVsdGlwbGUgb2YgNCwKIAkgKiB0aGlzIGNoZWNrIHdpbGwgdXN1YWxseSBiZSBldmFsdWF0ZWQgYW5kIGVsaW1pbmF0ZWQgYXQgY29tcGlsZSB0aW1lLgogCSAqLwotCWlmICgobGVuICUgNCkgIT0gMCkKKwlpZiAobGVuICYmIGxlbiAlIDQpCiAJCWZwID0gZmNfZnJhbWVfYWxsb2NfZmlsbChkZXYsIGxlbik7CiAJZWxzZQotCQlmcCA9IF9mY19mcmFtZV9hbGxvYyhkZXYsIGxlbik7CisJCWZwID0gX2ZjX2ZyYW1lX2FsbG9jKGxlbik7CiAJcmV0dXJuIGZwOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaCBiL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oCmluZGV4IGQ2N2RkYTIuLjY2ZDM3N2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oCisrKyBiL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oCkBAIC0zMTEsNiArMzExLDggQEAKIAlJU0NTSV9QQVJBTV9JRkFDRV9OQU1FLAogCUlTQ1NJX1BBUkFNX0lTSUQsCiAJSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUUsCisKKwlJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1PLAogCS8qIG11c3QgYWx3YXlzIGJlIGxhc3QgKi8KIAlJU0NTSV9QQVJBTV9NQVgsCiB9OwpAQCAtMzUwLDYgKzM1Miw3IEBACiAjZGVmaW5lIElTQ1NJX0lGQUNFX05BTUUJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0lGQUNFX05BTUUpCiAjZGVmaW5lIElTQ1NJX0lTSUQJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9JU0lEKQogI2RlZmluZSBJU0NTSV9JTklUSUFUT1JfTkFNRQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUUpCisjZGVmaW5lIElTQ1NJX1RHVF9SRVNFVF9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU8pCiAKIC8qIGlTQ1NJIEhCQSBwYXJhbXMgKi8KIGVudW0gaXNjc2lfaG9zdF9wYXJhbSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaCBiL2luY2x1ZGUvc2NzaS9pc2NzaV9wcm90by5oCmluZGV4IGYyYTJjMTEuLmRkMGE1MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9pc2NzaV9wcm90by5oCisrKyBiL2luY2x1ZGUvc2NzaS9pc2NzaV9wcm90by5oCkBAIC0yNzksNiArMjc5LDggQEAKICNkZWZpbmUgSVNDU0lfVE1fRlVOQ19UQVJHRVRfQ09MRF9SRVNFVAkJNwogI2RlZmluZSBJU0NTSV9UTV9GVU5DX1RBU0tfUkVBU1NJR04JCTgKIAorI2RlZmluZSBJU0NTSV9UTV9GVU5DX1ZBTFVFKGhkcikgKChoZHIpLT5mbGFncyAmIElTQ1NJX0ZMQUdfVE1fRlVOQ19NQVNLKQorCiAvKiBTQ1NJIFRhc2sgTWFuYWdlbWVudCBSZXNwb25zZSBIZWFkZXIgKi8KIHN0cnVjdCBpc2NzaV90bV9yc3AgewogCXVpbnQ4X3Qgb3Bjb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmZjLmggYi9pbmNsdWRlL3Njc2kvbGliZmMuaAppbmRleCA2NWRjOWFhLi40YjkxMmVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliZmMuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliZmMuaApAQCAtMjYsNiArMjYsNyBAQAogCiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfYnNnX2ZjLmg+CiAKICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZjcC5oPgogI2luY2x1ZGUgPHNjc2kvZmMvZmNfbnMuaD4KQEAgLTM0LDY3ICszNSw2IEBACiAKICNpbmNsdWRlIDxzY3NpL2ZjX2ZyYW1lLmg+CiAKLSNkZWZpbmUgRkNfTElCRkNfTE9HR0lORyAweDAxIC8qIEdlbmVyYWwgbG9nZ2luZywgbm90IGNhdGVnb3JpemVkICovCi0jZGVmaW5lIEZDX0xQT1JUX0xPR0dJTkcgMHgwMiAvKiBscG9ydCBsYXllciBsb2dnaW5nICovCi0jZGVmaW5lIEZDX0RJU0NfTE9HR0lORyAgMHgwNCAvKiBkaXNjb3ZlcnkgbGF5ZXIgbG9nZ2luZyAqLwotI2RlZmluZSBGQ19SUE9SVF9MT0dHSU5HIDB4MDggLyogcnBvcnQgbGF5ZXIgbG9nZ2luZyAqLwotI2RlZmluZSBGQ19GQ1BfTE9HR0lORyAgIDB4MTAgLyogSS9PIHBhdGggbG9nZ2luZyAqLwotI2RlZmluZSBGQ19FTV9MT0dHSU5HICAgIDB4MjAgLyogRXhjaGFuZ2UgTWFuYWdlciBsb2dnaW5nICovCi0jZGVmaW5lIEZDX0VYQ0hfTE9HR0lORyAgMHg0MCAvKiBFeGNoYW5nZS9TZXF1ZW5jZSBsb2dnaW5nICovCi0jZGVmaW5lIEZDX1NDU0lfTE9HR0lORyAgMHg4MCAvKiBTQ1NJIGxvZ2dpbmcgKG1vc3RseSBlcnJvciBoYW5kbGluZykgKi8KLQotZXh0ZXJuIHVuc2lnbmVkIGludCBmY19kZWJ1Z19sb2dnaW5nOwotCi0jZGVmaW5lIEZDX0NIRUNLX0xPR0dJTkcoTEVWRUwsIENNRCkJCQkJXAotZG8gewkJCQkJCQkJXAotCWlmICh1bmxpa2VseShmY19kZWJ1Z19sb2dnaW5nICYgTEVWRUwpKQkJCVwKLQkJZG8gewkJCQkJCVwKLQkJCUNNRDsJCQkJCVwKLQkJfSB3aGlsZSAoMCk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEZDX0xJQkZDX0RCRyhmbXQsIGFyZ3MuLi4pCQkJCQlcCi0JRkNfQ0hFQ0tfTE9HR0lORyhGQ19MSUJGQ19MT0dHSU5HLAkJCQlcCi0JCQkgcHJpbnRrKEtFUk5fSU5GTyAibGliZmM6ICIgZm10LCAjI2FyZ3MpKQotCi0jZGVmaW5lIEZDX0xQT1JUX0RCRyhscG9ydCwgZm10LCBhcmdzLi4uKQkJCQlcCi0JRkNfQ0hFQ0tfTE9HR0lORyhGQ19MUE9SVF9MT0dHSU5HLAkJCQlcCi0JCQkgcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCV1OiBscG9ydCAlNng6ICIgZm10LAlcCi0JCQkJKGxwb3J0KS0+aG9zdC0+aG9zdF9ubywJCQlcCi0JCQkJZmNfaG9zdF9wb3J0X2lkKChscG9ydCktPmhvc3QpLCAjI2FyZ3MpKQotCi0jZGVmaW5lIEZDX0RJU0NfREJHKGRpc2MsIGZtdCwgYXJncy4uLikJCQkJCVwKLQlGQ19DSEVDS19MT0dHSU5HKEZDX0RJU0NfTE9HR0lORywJCQkJXAotCQkJIHByaW50ayhLRVJOX0lORk8gImhvc3QldTogZGlzYzogIiBmbXQsCQlcCi0JCQkJKGRpc2MpLT5scG9ydC0+aG9zdC0+aG9zdF9ubywJCVwKLQkJCQkjI2FyZ3MpKQotCi0jZGVmaW5lIEZDX1JQT1JUX0lEX0RCRyhscG9ydCwgcG9ydF9pZCwgZm10LCBhcmdzLi4uKQkJCVwKLQlGQ19DSEVDS19MT0dHSU5HKEZDX1JQT1JUX0xPR0dJTkcsCQkJCVwKLQkJCSBwcmludGsoS0VSTl9JTkZPICJob3N0JXU6IHJwb3J0ICU2eDogIiBmbXQsCVwKLQkJCQkobHBvcnQpLT5ob3N0LT5ob3N0X25vLAkJCVwKLQkJCQkocG9ydF9pZCksICMjYXJncykpCi0KLSNkZWZpbmUgRkNfUlBPUlRfREJHKHJkYXRhLCBmbXQsIGFyZ3MuLi4pCQkJCVwKLQlGQ19SUE9SVF9JRF9EQkcoKHJkYXRhKS0+bG9jYWxfcG9ydCwgKHJkYXRhKS0+aWRzLnBvcnRfaWQsIGZtdCwgIyNhcmdzKQotCi0jZGVmaW5lIEZDX0ZDUF9EQkcocGt0LCBmbXQsIGFyZ3MuLi4pCQkJCQlcCi0JRkNfQ0hFQ0tfTE9HR0lORyhGQ19GQ1BfTE9HR0lORywJCQkJXAotCQkJIHByaW50ayhLRVJOX0lORk8gImhvc3QldTogZmNwOiAlNng6ICIgZm10LAlcCi0JCQkJKHBrdCktPmxwLT5ob3N0LT5ob3N0X25vLAkJXAotCQkJCXBrdC0+cnBvcnQtPnBvcnRfaWQsICMjYXJncykpCi0KLSNkZWZpbmUgRkNfRVhDSF9EQkcoZXhjaCwgZm10LCBhcmdzLi4uKQkJCQkJXAotCUZDX0NIRUNLX0xPR0dJTkcoRkNfRVhDSF9MT0dHSU5HLAkJCQlcCi0JCQkgcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCV1OiB4aWQgJTR4OiAiIGZtdCwJXAotCQkJCShleGNoKS0+bHAtPmhvc3QtPmhvc3Rfbm8sCQlcCi0JCQkJZXhjaC0+eGlkLCAjI2FyZ3MpKQotCi0jZGVmaW5lIEZDX1NDU0lfREJHKGxwb3J0LCBmbXQsIGFyZ3MuLi4pCQkJCVwKLQlGQ19DSEVDS19MT0dHSU5HKEZDX1NDU0lfTE9HR0lORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJIHByaW50ayhLRVJOX0lORk8gImhvc3QldTogc2NzaTogIiBmbXQsCQlcCi0JCQkJKGxwb3J0KS0+aG9zdC0+aG9zdF9ubywJIyNhcmdzKSkKLQogLyoKICAqIGxpYmZjIGVycm9yIGNvZGVzCiAgKi8KQEAgLTExNSwxNSArNTUsMjggQEAKIAkJcFsyXSA9ICgodikgJiAweEZGKTsJCVwKIAl9IHdoaWxlICgwKQogCi0vKgotICogRkMgSEJBIHN0YXR1cworLyoqCisgKiBlbnVtIGZjX2xwb3J0X3N0YXRlIC0gTG9jYWwgcG9ydCBzdGF0ZXMKKyAqIEBMUE9SVF9TVF9ESVNBQkxFRDogRGlzYWJsZWQKKyAqIEBMUE9SVF9TVF9GTE9HSTogICAgRmFicmljIGxvZ2luIChGTE9HSSkgc2VudAorICogQExQT1JUX1NUX0ROUzogICAgICBXYWl0aW5nIGZvciBuYW1lIHNlcnZlciByZW1vdGUgcG9ydCB0byBiZWNvbWUgcmVhZHkKKyAqIEBMUE9SVF9TVF9SUE5fSUQ6ICAgUmVnaXN0ZXIgcG9ydCBuYW1lIGJ5IElEIChSUE5fSUQpIHNlbnQKKyAqIEBMUE9SVF9TVF9SRlRfSUQ6ICAgUmVnaXN0ZXIgRmlicmUgQ2hhbm5lbCB0eXBlcyBieSBJRCAoUkZUX0lEKSBzZW50CisgKiBATFBPUlRfU1RfUkZGX0lEOiAgIFJlZ2lzdGVyIEZDLTQgRmVhdHVyZXMgYnkgSUQgKFJGRl9JRCkgc2VudAorICogQExQT1JUX1NUX1NDUjogICAgICBTdGF0ZSBDaGFuZ2UgUmVnaXN0ZXIgKFNDUikgc2VudAorICogQExQT1JUX1NUX1JFQURZOiAgICBSZWFkeSBmb3IgdXNlCisgKiBATFBPUlRfU1RfTE9HTzogICAgIExvY2FsIHBvcnQgbG9nb3V0IChMT0dPKSBzZW50CisgKiBATFBPUlRfU1RfUkVTRVQ6ICAgIExvY2FsIHBvcnQgcmVzZXQKICAqLwogZW51bSBmY19scG9ydF9zdGF0ZSB7CiAJTFBPUlRfU1RfRElTQUJMRUQgPSAwLAogCUxQT1JUX1NUX0ZMT0dJLAogCUxQT1JUX1NUX0ROUywKLQlMUE9SVF9TVF9SUE5fSUQsCisJTFBPUlRfU1RfUk5OX0lELAorCUxQT1JUX1NUX1JTTk5fTk4sCisJTFBPUlRfU1RfUlNQTl9JRCwKIAlMUE9SVF9TVF9SRlRfSUQsCisJTFBPUlRfU1RfUkZGX0lELAogCUxQT1JUX1NUX1NDUiwKIAlMUE9SVF9TVF9SRUFEWSwKIAlMUE9SVF9TVF9MT0dPLApAQCAtMTM2LDE1ICs4OSwyOCBAQAogCURJU0NfRVZfRkFJTEVECiB9OwogCisvKioKKyAqIGVudW0gZmNfcnBvcnRfc3RhdGUgLSBSZW1vdGUgcG9ydCBzdGF0ZXMKKyAqIEBSUE9SVF9TVF9JTklUOiAgICBJbml0aWFsaXplZAorICogQFJQT1JUX1NUX1BMT0dJOiAgIFdhaXRpbmcgZm9yIFBMT0dJIGNvbXBsZXRpb24KKyAqIEBSUE9SVF9TVF9QUkxJOiAgICBXYWl0aW5nIGZvciBQUkxJIGNvbXBsZXRpb24KKyAqIEBSUE9SVF9TVF9SVFY6ICAgICBXYWl0aW5nIGZvciBSVFYgY29tcGxldGlvbgorICogQFJQT1JUX1NUX1JFQURZOiAgIFJlYWR5IGZvciB1c2UKKyAqIEBSUE9SVF9TVF9MT0dPOiAgICBSZW1vdGUgcG9ydCBsb2dvdXQgKExPR08pIHNlbnQKKyAqIEBSUE9SVF9TVF9BRElTQzogICBEaXNjb3ZlciBBZGRyZXNzIHNlbnQKKyAqIEBSUE9SVF9TVF9ERUxFVEU6ICBSZW1vdGUgcG9ydCBiZWluZyBkZWxldGVkCisgKiBAUlBPUlRfU1RfUkVTVEFSVDogUmVtb3RlIHBvcnQgYmVpbmcgZGVsZXRlZCBhbmQgd2lsbCByZXN0YXJ0CisqLwogZW51bSBmY19ycG9ydF9zdGF0ZSB7Ci0JUlBPUlRfU1RfSU5JVCwJCS8qIGluaXRpYWxpemVkICovCi0JUlBPUlRfU1RfUExPR0ksCQkvKiB3YWl0aW5nIGZvciBQTE9HSSBjb21wbGV0aW9uICovCi0JUlBPUlRfU1RfUFJMSSwJCS8qIHdhaXRpbmcgZm9yIFBSTEkgY29tcGxldGlvbiAqLwotCVJQT1JUX1NUX1JUViwJCS8qIHdhaXRpbmcgZm9yIFJUViBjb21wbGV0aW9uICovCi0JUlBPUlRfU1RfUkVBRFksCQkvKiByZWFkeSBmb3IgdXNlICovCi0JUlBPUlRfU1RfTE9HTywJCS8qIHBvcnQgbG9nb3V0IHNlbnQgKi8KLQlSUE9SVF9TVF9BRElTQywJCS8qIERpc2NvdmVyIEFkZHJlc3Mgc2VudCAqLwotCVJQT1JUX1NUX0RFTEVURSwJLyogcG9ydCBiZWluZyBkZWxldGVkICovCisJUlBPUlRfU1RfSU5JVCwKKwlSUE9SVF9TVF9QTE9HSSwKKwlSUE9SVF9TVF9QUkxJLAorCVJQT1JUX1NUX1JUViwKKwlSUE9SVF9TVF9SRUFEWSwKKwlSUE9SVF9TVF9MT0dPLAorCVJQT1JUX1NUX0FESVNDLAorCVJQT1JUX1NUX0RFTEVURSwKKwlSUE9SVF9TVF9SRVNUQVJULAogfTsKIAogLyoqCkBAIC0xNTUsMTIgKzEyMSwyMCBAQAogICogQHBvcnRfaWQ6ICAgIFBvcnQgSUQgb2YgdGhlIGRpc2NvdmVyZWQgcG9ydAogICovCiBzdHJ1Y3QgZmNfZGlzY19wb3J0IHsKLQlzdHJ1Y3QgZmNfbHBvcnQgICAgICAgICAgICAgKmxwOwotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICBwZWVyczsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJICAgIHJwb3J0X3dvcms7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfaWQ7CisJc3RydWN0IGZjX2xwb3J0ICAgICpscDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgcGVlcnM7CisJc3RydWN0IHdvcmtfc3RydWN0IHJwb3J0X3dvcms7CisJdTMyICAgICAgICAgICAgICAgIHBvcnRfaWQ7CiB9OwogCisvKioKKyAqIGVudW0gZmNfcnBvcnRfZXZlbnQgLSBSZW1vdGUgcG9ydCBldmVudHMKKyAqIEBSUE9SVF9FVl9OT05FOiAgIE5vIGV2ZW50CisgKiBAUlBPUlRfRVZfUkVBRFk6ICBSZW1vdGUgcG9ydCBpcyByZWFkeSBmb3IgdXNlCisgKiBAUlBPUlRfRVZfRkFJTEVEOiBTdGF0ZSBtYWNoaW5lIGZhaWxlZCwgcmVtb3RlIHBvcnQgaXMgbm90IHJlYWR5CisgKiBAUlBPUlRfRVZfU1RPUDogICBSZW1vdGUgcG9ydCBoYXMgYmVlbiBzdG9wcGVkCisgKiBAUlBPUlRfRVZfTE9HTzogICBSZW1vdGUgcG9ydCBsb2dvdXQgKExPR08pIHNlbnQKKyAqLwogZW51bSBmY19ycG9ydF9ldmVudCB7CiAJUlBPUlRfRVZfTk9ORSA9IDAsCiAJUlBPUlRfRVZfUkVBRFksCkBAIC0xNzEsNiArMTQ1LDEwIEBACiAKIHN0cnVjdCBmY19ycG9ydF9wcml2OwogCisvKioKKyAqIHN0cnVjdCBmY19ycG9ydF9vcGVyYXRpb25zIC0gT3BlcmF0aW9ucyBmb3IgYSByZW1vdGUgcG9ydAorICogQGV2ZW50X2NhbGxiYWNrOiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIHJlbW90ZSBwb3J0IGV2ZW50cworICovCiBzdHJ1Y3QgZmNfcnBvcnRfb3BlcmF0aW9ucyB7CiAJdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjX3Jwb3J0X3ByaXYgKiwKIAkJCSAgICAgICBlbnVtIGZjX3Jwb3J0X2V2ZW50KTsKQEAgLTE3OCwxMSArMTU2LDExIEBACiAKIC8qKgogICogc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgLSBsaWJmYyBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCBhIHJlbW90ZSBwb3J0Ci0gKiBAbG9jYWxfcG9ydDogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKLSAqIEBycF9zdGF0ZTogaW5kaWNhdGVzIFJFQURZIGZvciBJL08gb3IgREVMRVRFIHdoZW4gYmxvY2tlZC4KLSAqIEBmbGFnczogUkVDIGFuZCBSRVRSWSBzdXBwb3J0ZWQgZmxhZ3MKLSAqIEBlX2RfdG92OiBlcnJvciBkZXRlY3QgdGltZW91dCB2YWx1ZSAoaW4gbXNlYykKLSAqIEByX2FfdG92OiByZXNvdXJjZSBhbGxvY2F0aW9uIHRpbWVvdXQgdmFsdWUgKGluIG1zZWMpCisgKiBAbG9jYWxfcG9ydDogVGhlIGFzc29jaWF0ZWQgbG9jYWwgcG9ydAorICogQHJwX3N0YXRlOiAgIEluZGljYXRlcyBSRUFEWSBmb3IgSS9PIG9yIERFTEVURSB3aGVuIGJsb2NrZWQKKyAqIEBmbGFnczogICAgICBSRUMgYW5kIFJFVFJZIHN1cHBvcnRlZCBmbGFncworICogQGVfZF90b3Y6ICAgIEVycm9yIGRldGVjdCB0aW1lb3V0IHZhbHVlIChpbiBtc2VjKQorICogQHJfYV90b3Y6ICAgIFJlc291cmNlIGFsbG9jYXRpb24gdGltZW91dCB2YWx1ZSAoaW4gbXNlYykKICAqLwogc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgewogCXN0cnVjdCBmY19scG9ydAkJICAgKmxvY2FsX3BvcnQ7CkBAIC0xOTUsNDcgKzE3Myw2NiBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAtIGxpYmZjIHJwb3J0IGFuZCBkaXNjb3ZlcnkgaW5mbyBhYm91dCBhIHJlbW90ZSBwb3J0Ci0gKiBAbG9jYWxfcG9ydDogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKLSAqIEBycG9ydDogdHJhbnNwb3J0IHJlbW90ZSBwb3J0Ci0gKiBAa3JlZjogcmVmZXJlbmNlIGNvdW50ZXIKLSAqIEBycF9zdGF0ZTogc3RhdGUgdHJhY2tzIHByb2dyZXNzIG9mIFBMT0dJLCBQUkxJLCBhbmQgUlRWIGV4Y2hhbmdlcwotICogQGlkczogcmVtb3RlIHBvcnQgaWRlbnRpZmllcnMgYW5kIHJvbGVzCi0gKiBAZmxhZ3M6IFJFQyBhbmQgUkVUUlkgc3VwcG9ydGVkIGZsYWdzCi0gKiBAbWF4X3NlcTogbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBzZXF1ZW5jZXMKLSAqIEBkaXNjX2lkOiBkaXNjb3ZlcnkgaWRlbnRpZmllcgotICogQG1heGZyYW1lX3NpemU6IG1heGltdW0gZnJhbWUgc2l6ZQotICogQHJldHJpZXM6IHJldHJ5IGNvdW50IGluIGN1cnJlbnQgc3RhdGUKLSAqIEBlX2RfdG92OiBlcnJvciBkZXRlY3QgdGltZW91dCB2YWx1ZSAoaW4gbXNlYykKLSAqIEByX2FfdG92OiByZXNvdXJjZSBhbGxvY2F0aW9uIHRpbWVvdXQgdmFsdWUgKGluIG1zZWMpCi0gKiBAcnBfbXV0ZXg6IG11dGV4IHByb3RlY3RzIHJwb3J0Ci0gKiBAcmV0cnlfd29yazoKLSAqIEBldmVudF9jYWxsYmFjazogQ2FsbGJhY2sgZm9yIHJwb3J0IFJFQURZLCBGQUlMRUQgb3IgTE9HTworICogc3RydWN0IGZjX3Jwb3J0X3ByaXYgLSBsaWJmYyByZW1vdGUgcG9ydCBhbmQgZGlzY292ZXJ5IGluZm8KKyAqIEBsb2NhbF9wb3J0OiAgICAgVGhlIGFzc29jaWF0ZWQgbG9jYWwgcG9ydAorICogQHJwb3J0OiAgICAgICAgICBUaGUgRkMgdHJhbnNwb3J0IHJlbW90ZSBwb3J0CisgKiBAa3JlZjogICAgICAgICAgIFJlZmVyZW5jZSBjb3VudGVyCisgKiBAcnBfc3RhdGU6ICAgICAgIEVudW1lcmF0aW9uIHRoYXQgdHJhY2tzIHByb2dyZXNzIG9mIFBMT0dJLCBQUkxJLAorICogICAgICAgICAgICAgICAgICBhbmQgUlRWIGV4Y2hhbmdlcworICogQGlkczogICAgICAgICAgICBUaGUgcmVtb3RlIHBvcnQgaWRlbnRpZmllcnMgYW5kIHJvbGVzCisgKiBAZmxhZ3M6ICAgICAgICAgIFJFQyBhbmQgUkVUUlkgc3VwcG9ydGVkIGZsYWdzCisgKiBAbWF4X3NlcTogICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgc2VxdWVuY2VzCisgKiBAZGlzY19pZDogICAgICAgIFRoZSBkaXNjb3ZlcnkgaWRlbnRpZmllcgorICogQG1heGZyYW1lX3NpemU6ICBUaGUgbWF4aW11bSBmcmFtZSBzaXplCisgKiBAcmV0cmllczogICAgICAgIFRoZSByZXRyeSBjb3VudCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUKKyAqIEBlX2RfdG92OiAgICAgICAgRXJyb3IgZGV0ZWN0IHRpbWVvdXQgdmFsdWUgKGluIG1zZWMpCisgKiBAcl9hX3RvdjogICAgICAgIFJlc291cmNlIGFsbG9jYXRpb24gdGltZW91dCB2YWx1ZSAoaW4gbXNlYykKKyAqIEBycF9tdXRleDogICAgICAgVGhlIG11dGV4IHRoYXQgcHJvdGVjdHMgdGhlIHJlbW90ZSBwb3J0CisgKiBAcmV0cnlfd29yazogICAgIEhhbmRsZSBmb3IgcmV0cmllcworICogQGV2ZW50X2NhbGxiYWNrOiBDYWxsYmFjayB3aGVuIFJFQURZLCBGQUlMRUQgb3IgTE9HTyBzdGF0ZXMgY29tcGxldGUKICAqLwogc3RydWN0IGZjX3Jwb3J0X3ByaXYgewotCXN0cnVjdCBmY19scG9ydAkJICAgKmxvY2FsX3BvcnQ7Ci0Jc3RydWN0IGZjX3Jwb3J0CQkgICAqcnBvcnQ7Ci0Jc3RydWN0IGtyZWYJCSAgIGtyZWY7Ci0JZW51bSBmY19ycG9ydF9zdGF0ZSAgICAgICAgcnBfc3RhdGU7CisJc3RydWN0IGZjX2xwb3J0CQkgICAgKmxvY2FsX3BvcnQ7CisJc3RydWN0IGZjX3Jwb3J0CQkgICAgKnJwb3J0OworCXN0cnVjdCBrcmVmCQkgICAga3JlZjsKKwllbnVtIGZjX3Jwb3J0X3N0YXRlICAgICAgICAgcnBfc3RhdGU7CiAJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIGlkczsKLQl1MTYJCQkgICBmbGFnczsKLQl1MTYJCSAgICAgICAgICAgbWF4X3NlcTsKLQl1MTYJCQkgICBkaXNjX2lkOwotCXUxNgkJCSAgIG1heGZyYW1lX3NpemU7Ci0JdW5zaWduZWQgaW50CSAgICAgICAgICAgcmV0cmllczsKLQl1bnNpZ25lZCBpbnQJICAgICAgICAgICBlX2RfdG92OwotCXVuc2lnbmVkIGludAkgICAgICAgICAgIHJfYV90b3Y7Ci0Jc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgcnBfbXV0ZXg7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yawkgICByZXRyeV93b3JrOwotCWVudW0gZmNfcnBvcnRfZXZlbnQgICAgICAgIGV2ZW50OwotCXN0cnVjdCBmY19ycG9ydF9vcGVyYXRpb25zICpvcHM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgcGVlcnM7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgZXZlbnRfd29yazsKLQl1MzIJCQkgICBzdXBwb3J0ZWRfY2xhc3NlczsKKwl1MTYJCQkgICAgZmxhZ3M7CisJdTE2CQkgICAgICAgICAgICBtYXhfc2VxOworCXUxNgkJCSAgICBkaXNjX2lkOworCXUxNgkJCSAgICBtYXhmcmFtZV9zaXplOworCXVuc2lnbmVkIGludAkgICAgICAgICAgICByZXRyaWVzOworCXVuc2lnbmVkIGludAkgICAgICAgICAgICBlX2RfdG92OworCXVuc2lnbmVkIGludAkgICAgICAgICAgICByX2FfdG92OworCXN0cnVjdCBtdXRleCAgICAgICAgICAgICAgICBycF9tdXRleDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCSAgICByZXRyeV93b3JrOworCWVudW0gZmNfcnBvcnRfZXZlbnQgICAgICAgICBldmVudDsKKwlzdHJ1Y3QgZmNfcnBvcnRfb3BlcmF0aW9ucyAgKm9wczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgcGVlcnM7CisJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgIGV2ZW50X3dvcms7CisJdTMyCQkJICAgIHN1cHBvcnRlZF9jbGFzc2VzOwogfTsKIAotLyoKLSAqIGZjb2Ugc3RhdHMgc3RydWN0dXJlCisvKioKKyAqIHN0cnVjdCBmY29lX2Rldl9zdGF0cyAtIGZjb2Ugc3RhdHMgc3RydWN0dXJlCisgKiBAU2Vjb25kc1NpbmNlTGFzdFJlc2V0OiBTZWNvbmRzIHNpbmNlIHRoZSBsYXN0IHJlc2V0CisgKiBAVHhGcmFtZXM6ICAgICAgICAgICAgICBOdW1iZXIgb2YgdHJhbnNtaXR0ZWQgZnJhbWVzCisgKiBAVHhXb3JkczogICAgICAgICAgICAgICBOdW1iZXIgb2YgdHJhbnNtaXR0ZWQgd29yZHMKKyAqIEBSeEZyYW1lczogICAgICAgICAgICAgIE51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMKKyAqIEBSeFdvcmRzOiAgICAgICAgICAgICAgIE51bWJlciBvZiByZWNlaXZlZCB3b3JkcworICogQEVycm9yRnJhbWVzOiAgICAgICAgICAgTnVtYmVyIG9mIHJlY2VpdmVkIGVycm9yIGZyYW1lcworICogQER1bXBlZEZyYW1lczogICAgICAgICAgTnVtYmVyIG9mIGR1bXBlZCBmcmFtZXMKKyAqIEBMaW5rRmFpbHVyZUNvdW50OiAgICAgIE51bWJlciBvZiBsaW5rIGZhaWx1cmVzCisgKiBATG9zc09mU2lnbmFsQ291bnQ6ICAgICBOdW1iZXIgZm9yIHNpZ25hbCBsb3NzZXMKKyAqIEBJbnZhbGlkVHhXb3JkQ291bnQ6ICAgIE51bWJlciBvZiBpbnZhbGlkIHRyYW5zbWl0dGVkIHdvcmRzCisgKiBASW52YWxpZENSQ0NvdW50OiAgICAgICBOdW1iZXIgb2YgaW52YWxpZCBDUkNzCisgKiBASW5wdXRSZXF1ZXN0czogICAgICAgICBOdW1iZXIgb2YgaW5wdXQgcmVxdWVzdHMKKyAqIEBPdXRwdXRSZXF1ZXN0czogICAgICAgIE51bWJlciBvZiBvdXRwdXQgcmVxdWVzdHMKKyAqIEBDb250cm9sUmVxdWVzdHM6ICAgICAgIE51bWJlciBvZiBjb250cm9sIHJlcXVlc3RzCisgKiBASW5wdXRNZWdhYnl0ZXM6ICAgICAgICBOdW1iZXIgb2YgcmVjZWl2ZWQgbWVnYWJ5dGVzCisgKiBAT3V0cHV0TWVnYWJ5dGVzOiAgICAgICBOdW1iZXIgb2YgdHJhbnNtaXR0ZWQgbWVnYWJ5dGVzCisgKiBAVkxpbmtGYWlsdXJlQ291bnQ6ICAgICBOdW1iZXIgb2YgdmlydHVhbCBsaW5rIGZhaWx1cmVzCisgKiBATWlzc0Rpc2NBZHZDb3VudDogICAgICBOdW1iZXIgb2YgbWlzc2luZyBGSVAgZGlzY292ZXJ5IGFkdmVydGlzZW1lbnQKICAqLwogc3RydWN0IGZjb2VfZGV2X3N0YXRzIHsKIAl1NjQJCVNlY29uZHNTaW5jZUxhc3RSZXNldDsKQEAgLTI1NCwxMiArMjUxLDE3IEBACiAJdTY0CQlDb250cm9sUmVxdWVzdHM7CiAJdTY0CQlJbnB1dE1lZ2FieXRlczsKIAl1NjQJCU91dHB1dE1lZ2FieXRlczsKKwl1NjQJCVZMaW5rRmFpbHVyZUNvdW50OworCXU2NAkJTWlzc0Rpc2NBZHZDb3VudDsKIH07CiAKLS8qCi0gKiBlbHMgZGF0YSBpcyB1c2VkIGZvciBwYXNzaW5nIEVMUyByZXNwb25lIHNwZWNpZmljCi0gKiBkYXRhIHRvIHNlbmQgRUxTIHJlc3BvbnNlIG1haW5seSB1c2luZyBpbmZvbWF0aW9uCi0gKiBpbiBleGNoYW5nZSBhbmQgc2VxdWVuY2UgaW4gRU0gbGF5ZXIuCisvKioKKyAqIHN0cnVjdCBmY19zZXFfZWxzX2RhdGEgLSBFTFMgZGF0YSB1c2VkIGZvciBwYXNzaW5nIEVMUyBzcGVjaWZpYyByZXNwb25zZXMKKyAqIEBmcDogICAgIFRoZSBFTFMgZnJhbWUKKyAqIEByZWFzb246IFRoZSByZWFzb24gZm9yIHJlamVjdGlvbgorICogQGV4cGxhbjogVGhlIGV4cGxhaW5hdGlvbiBvZiB0aGUgcmVqZWN0aW9uCisgKgorICogTWFpbmx5IHVzZWQgYnkgdGhlIGV4Y2hhbmdlIG1hbmFnZXIgbGF5ZXIuCiAgKi8KIHN0cnVjdCBmY19zZXFfZWxzX2RhdGEgewogCXN0cnVjdCBmY19mcmFtZSAqZnA7CkBAIC0yNjcsNzcgKzI2OSw4NyBAQAogCWVudW0gZmNfZWxzX3JqdF9leHBsYW4gZXhwbGFuOwogfTsKIAotLyoKLSAqIEZDUCByZXF1ZXN0IHN0cnVjdHVyZSwgb25lIGZvciBlYWNoIHNjc2kgY21kIHJlcXVlc3QKKy8qKgorICogc3RydWN0IGZjX2ZjcF9wa3QgLSBGQ1AgcmVxdWVzdCBzdHJ1Y3R1cmUgKG9uZSBmb3IgZWFjaCBzY3NpX2NtbmQgcmVxdWVzdCkKKyAqIEBscDogICAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIGxvY2FsIHBvcnQKKyAqIEBzdGF0ZTogICAgICAgICAgIFRoZSBzdGF0ZSBvZiB0aGUgSS9PCisgKiBAdGd0X2ZsYWdzOiAgICAgICBUYXJnZXQncyBmbGFncworICogQHJlZl9jbnQ6ICAgICAgICAgUmVmZXJlbmNlIGNvdW50CisgKiBAc2NzaV9wa3RfbG9jazogICBMb2NrIHRvIHByb3RlY3QgdGhlIFNDU0kgcGFja2V0IChtdXN0IGJlIHRha2VuIGJlZm9yZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGhvc3RfbG9jayBpZiBib3RoIGFyZSB0byBiZSBoZWxkIGF0IHRoZSBzYW1lIHRpbWUpCisgKiBAY21kOiAgICAgICAgICAgICBUaGUgU0NTSSBjb21tYW5kIChzZXQgYW5kIGNsZWFyIHdpdGggdGhlIGhvc3RfbG9jayBoZWxkKQorICogQGxpc3Q6ICAgICAgICAgICAgVHJhY2tzIHF1ZXVlZCBjb21tYW5kcyAoYWNjZXNzZWQgd2l0aCB0aGUgaG9zdF9sb2NrIGhlbGQpCisgKiBAdGltZXI6ICAgICAgICAgICBUaGUgY29tbWFuZCB0aW1lcgorICogQHRtX2RvbmU6ICAgICAgICAgQ29tcGxldGlvbiBpbmRpY2F0b3IKKyAqIEB3YWl0X2Zvcl9jb21wOiAgIEluZGljYXRvciB0byB3YWl0IGZvciBjb21wbGV0aW9uIG9mIHRoZSBJL08gKGluIGppZmZpZXMpCisgKiBAc3RhcnRfdGltZTogICAgICBUaW1lc3RhbXAgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgdGhlIEkvTyAoaW4gamlmZmllcykKKyAqIEBlbmRfdGltZTogICAgICAgIFRpbWVzdGFtcCBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIEkvTyAoaW4gamlmZmllcykKKyAqIEBsYXN0X3BrdF90aW1lOiAgIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCBmcmFtZSByZWNlaXZlZCAoaW4gamlmZmllcykKKyAqIEBkYXRhX2xlbjogICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKyAqIEBjZGJfY21kOiAgICAgICAgIFRoZSBDREIgY29tbWFuZAorICogQHhmZXJfbGVuOiAgICAgICAgVGhlIHRyYW5zZmVyIGxlbmd0aAorICogQHhmZXJfZGRwOiAgICAgICAgSW5kaWNhdGVzIGlmIHRoaXMgdHJhbnNmZXIgdXNlZCBERFAgKFhJRCBvZiB0aGUgZXhjaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0IGhlcmUgaWYgRERQIHdhcyBzZXR1cCkKKyAqIEB4ZmVyX2NvbnRpZ19lbmQ6IFRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGlmIHRoZSBidWZmZXIgaXMgY29udGlndW91cworICogICAgICAgICAgICAgICAgICAgKFR4IGFuZCBSeCkKKyAqIEBtYXhfcGF5bG9hZDogICAgIFRoZSBtYXhpbXVtIHBheWxvYWQgc2l6ZSAoaW4gYnl0ZXMpCisgKiBAaW9fc3RhdHVzOiAgICAgICBTQ1NJIHJlc3VsdCAodXBwZXIgMjQgYml0cykKKyAqIEBjZGJfc3RhdHVzOiAgICAgIENEQiBzdGF0dXMKKyAqIEBzdGF0dXNfY29kZTogICAgIEZDUCBJL08gc3RhdHVzCisgKiBAc2NzaV9jb21wX2ZsYWdzOiBDb21wbGV0aW9uIGZsYWdzIChiaXQgMyBVbmRlcnJ1biBiaXQgMjogb3ZlcnJ1bikKKyAqIEByZXFfZmxhZ3M6ICAgICAgIFJlcXVlc3QgZmxhZ3MgKGJpdCAwOiByZWFkIGJpdDoxIHdyaXRlKQorICogQHNjc2lfcmVzaWQ6ICAgICAgU0NTSSByZXNpZHVsZSBsZW5ndGgKKyAqIEBycG9ydDogICAgICAgICAgIFRoZSByZW1vdGUgcG9ydCB0aGF0IHRoZSBTQ1NJIGNvbW1hbmQgaXMgdGFyZ2V0ZWQgYXQKKyAqIEBzZXFfcHRyOiAgICAgICAgIFRoZSBzZXF1ZW5jZSB0aGF0IHdpbGwgY2FycnkgdGhlIFNDU0kgY29tbWFuZAorICogQHJlY292X3JldHJ5OiAgICAgTnVtYmVyIG9mIHJlY292ZXJ5IHJldHJpZXMKKyAqIEByZWNvdl9zZXE6ICAgICAgIFRoZSBzZXF1ZW5jZSBmb3IgUkVDIG9yIFNSUgogICovCiBzdHJ1Y3QgZmNfZmNwX3BrdCB7Ci0JLyoKLQkgKiBob3VzZWtlZXBpbmcgc3R1ZmYKLQkgKi8KLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwOwkvKiBoYW5kbGUgdG8gaGJhIHN0cnVjdCAqLwotCXUxNgkJc3RhdGU7CQkvKiBzY3NpX3BrdCBzdGF0ZSBzdGF0ZSAqLwotCXUxNgkJdGd0X2ZsYWdzOwkvKiB0YXJnZXQgZmxhZ3MJICovCi0JYXRvbWljX3QJcmVmX2NudDsJLyogZmNwIHBrdCByZWYgY291bnQgKi8KLQlzcGlubG9ja190CXNjc2lfcGt0X2xvY2s7CS8qIE11c3QgYmUgdGFrZW4gYmVmb3JlIHRoZSBob3N0IGxvY2sKLQkJCQkJICogaWYgYm90aCBhcmUgaGVsZCBhdCB0aGUgc2FtZSB0aW1lICovCi0JLyoKLQkgKiBTQ1NJIEkvTyByZWxhdGVkIHN0dWZmCi0JICovCi0Jc3RydWN0IHNjc2lfY21uZCAqY21kOwkJLyogc2NzaSBjb21tYW5kIHBvaW50ZXIuIHNldC9jbGVhcgotCQkJCQkgKiB1bmRlciBob3N0IGxvY2sgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiB0cmFja3MgcXVldWVkIGNvbW1hbmRzLiBhY2Nlc3MgdW5kZXIKLQkJCQkJICogaG9zdCBsb2NrICovCi0JLyoKLQkgKiB0aW1lb3V0IHJlbGF0ZWQgc3R1ZmYKLQkgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogY29tbWFuZCB0aW1lciAqLworCS8qIEhvdXNla2VlcGluZyBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBmY19scG9ydCAgICpscDsKKwl1MTYJCSAgc3RhdGU7CisJdTE2CQkgIHRndF9mbGFnczsKKwlhdG9taWNfdAkgIHJlZl9jbnQ7CisJc3BpbmxvY2tfdAkgIHNjc2lfcGt0X2xvY2s7CisKKwkvKiBTQ1NJIEkvTyByZWxhdGVkIGluZm9ybWF0aW9uICovCisJc3RydWN0IHNjc2lfY21uZCAgKmNtZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICBsaXN0OworCisJLyogVGltZW91dCByZWxhdGVkIGluZm9ybWF0aW9uICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAJc3RydWN0IGNvbXBsZXRpb24gdG1fZG9uZTsKLQlpbnQJd2FpdF9mb3JfY29tcDsKLQl1bnNpZ25lZCBsb25nCXN0YXJ0X3RpbWU7CS8qIHN0YXJ0IGppZmZpZSAqLwotCXVuc2lnbmVkIGxvbmcJZW5kX3RpbWU7CS8qIGVuZCBqaWZmaWUgKi8KLQl1bnNpZ25lZCBsb25nCWxhc3RfcGt0X3RpbWU7CSAvKiBqaWZmaWVzIG9mIGxhc3QgZnJhbWUgcmVjZWl2ZWQgKi8KKwlpbnQJICAgICAgICAgIHdhaXRfZm9yX2NvbXA7CisJdW5zaWduZWQgbG9uZwkgIHN0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZwkgIGVuZF90aW1lOworCXVuc2lnbmVkIGxvbmcJICBsYXN0X3BrdF90aW1lOwogCi0JLyoKLQkgKiBzY3NpIGNtZCBhbmQgZGF0YSB0cmFuc2ZlciBpbmZvcm1hdGlvbgotCSAqLwotCXUzMgkJZGF0YV9sZW47Ci0JLyoKLQkgKiB0cmFuc3BvcnQgcmVsYXRlZCB2ZXJpYWJsZXMKLQkgKi8KLQlzdHJ1Y3QgZmNwX2NtbmQgY2RiX2NtZDsKLQlzaXplX3QJCXhmZXJfbGVuOwotCXUxNgkJeGZlcl9kZHA7CS8qIHRoaXMgeGZlciBpcyBkZHBlZCAqLwotCXUzMgkJeGZlcl9jb250aWdfZW5kOyAvKiBvZmZzZXQgb2YgZW5kIG9mIGNvbnRpZ3VvdXMgeGZlciAqLwotCXUxNgkJbWF4X3BheWxvYWQ7CS8qIG1heCBwYXlsb2FkIHNpemUgaW4gYnl0ZXMgKi8KKwkvKiBTQ1NJIGNvbW1hbmQgYW5kIGRhdGEgdHJhbnNmZXIgaW5mb3JtYXRpb24gKi8KKwl1MzIJCSAgZGF0YV9sZW47CiAKLQkvKgotCSAqIHNjc2kvZmNwIHJldHVybiBzdGF0dXMKLQkgKi8KLQl1MzIJCWlvX3N0YXR1czsJLyogU0NTSSByZXN1bHQgdXBwZXIgMjQgYml0cyAqLwotCXU4CQljZGJfc3RhdHVzOwotCXU4CQlzdGF0dXNfY29kZTsJLyogRkNQIEkvTyBzdGF0dXMgKi8KLQkvKiBiaXQgMyBVbmRlcnJ1biBiaXQgMjogb3ZlcnJ1biAqLwotCXU4CQlzY3NpX2NvbXBfZmxhZ3M7Ci0JdTMyCQlyZXFfZmxhZ3M7CS8qIGJpdCAwOiByZWFkIGJpdDoxIHdyaXRlICovCi0JdTMyCQlzY3NpX3Jlc2lkOwkvKiByZXNpZHVsZSBsZW5ndGggKi8KKwkvKiBUcmFuc3BvcnQgcmVsYXRlZCB2ZXJpYWJsZXMgKi8KKwlzdHJ1Y3QgZmNwX2NtbmQgICBjZGJfY21kOworCXNpemVfdAkJICB4ZmVyX2xlbjsKKwl1MTYJCSAgeGZlcl9kZHA7CisJdTMyCQkgIHhmZXJfY29udGlnX2VuZDsKKwl1MTYJCSAgbWF4X3BheWxvYWQ7CiAKLQlzdHJ1Y3QgZmNfcnBvcnQJKnJwb3J0OwkJLyogcmVtb3RlIHBvcnQgcG9pbnRlciAqLwotCXN0cnVjdCBmY19zZXEJKnNlcV9wdHI7CS8qIGN1cnJlbnQgc2VxdWVuY2UgcG9pbnRlciAqLwotCS8qCi0JICogRXJyb3IgUHJvY2Vzc2luZwotCSAqLwotCXU4CQlyZWNvdl9yZXRyeTsJLyogY291bnQgb2YgcmVjb3ZlcnkgcmV0cmllcyAqLwotCXN0cnVjdCBmY19zZXEJKnJlY292X3NlcTsJLyogc2VxdWVuY2UgZm9yIFJFQyBvciBTUlIgKi8KKwkvKiBTQ1NJL0ZDUCByZXR1cm4gc3RhdHVzICovCisJdTMyCQkgIGlvX3N0YXR1czsKKwl1OAkJICBjZGJfc3RhdHVzOworCXU4CQkgIHN0YXR1c19jb2RlOworCXU4CQkgIHNjc2lfY29tcF9mbGFnczsKKwl1MzIJCSAgcmVxX2ZsYWdzOworCXUzMgkJICBzY3NpX3Jlc2lkOworCisJLyogQXNzb2NpYXRlZCBzdHJ1Y3R1cmVzICovCisJc3RydWN0IGZjX3Jwb3J0CSAgKnJwb3J0OworCXN0cnVjdCBmY19zZXEJICAqc2VxX3B0cjsKKworCS8qIEVycm9yIFByb2Nlc3NpbmcgaW5mb3JtYXRpb24gKi8KKwl1OAkJICByZWNvdl9yZXRyeTsKKwlzdHJ1Y3QgZmNfc2VxCSAgKnJlY292X3NlcTsKIH07Ci0vKgotICogRkNfRkNQIEhFTFBFUiBGVU5DVElPTlMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBmY19mY3BfaXNfcmVhZChjb25zdCBzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQotewotCWlmIChmc3AgJiYgZnNwLT5jbWQpCi0JCXJldHVybiBmc3AtPmNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFOwotCXJldHVybiBmYWxzZTsKLX0KIAogLyoKICAqIFN0cnVjdHVyZSBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIG1hbmFnaW5nIEZpYnJlIENoYW5uZWwgRXhjaGFuZ2VzCkBAIC0zNTAsMjMgKzM2Miw1MSBAQAogCiBzdHJ1Y3QgZmNfZXhjaF9tZ3I7CiBzdHJ1Y3QgZmNfZXhjaF9tZ3JfYW5jaG9yOwotZXh0ZXJuIHUxNglmY19jcHVfbWFzazsJLyogY3B1IG1hc2sgZm9yIHBvc3NpYmxlIGNwdXMgKi8KK2V4dGVybiB1MTYgZmNfY3B1X21hc2s7CS8qIGNwdSBtYXNrIGZvciBwb3NzaWJsZSBjcHVzICovCiAKLS8qCi0gKiBTZXF1ZW5jZS4KKy8qKgorICogc3RydWN0IGZjX3NlcSAtIEZDIHNlcXVlbmNlCisgKiBAaWQ6ICAgICAgIFRoZSBzZXF1ZW5jZSBJRAorICogQHNzYl9zdGF0OiBTdGF0dXMgZmxhZ3MgZm9yIHRoZSBzZXF1ZW5jZSBzdGF0dXMgYmxvY2sgKFNTQikKKyAqIEBjbnQ6ICAgICAgTnVtYmVyIG9mIGZyYW1lcyBzZW50IHNvIGZhcgorICogQHJlY19kYXRhOiBGQy00IHZhbHVlIGZvciBSRUMKICAqLwogc3RydWN0IGZjX3NlcSB7Ci0JdTgJaWQ7CQkvKiBzZXEgSUQgKi8KLQl1MTYJc3NiX3N0YXQ7CS8qIHN0YXR1cyBmbGFncyBmb3Igc2VxdWVuY2Ugc3RhdHVzIGJsb2NrICovCi0JdTE2CWNudDsJCS8qIGZyYW1lcyBzZW50IHNvIGZhciBvbiBzZXF1ZW5jZSAqLwotCXUzMglyZWNfZGF0YTsJLyogRkMtNCB2YWx1ZSBmb3IgUkVDICovCisJdTggIGlkOworCXUxNiBzc2Jfc3RhdDsKKwl1MTYgY250OworCXUzMiByZWNfZGF0YTsKIH07CiAKICNkZWZpbmUgRkNfRVhfRE9ORQkJKDEgPDwgMCkgLyogZXAgaXMgY29tcGxldGVkICovCiAjZGVmaW5lIEZDX0VYX1JTVF9DTEVBTlVQCSgxIDw8IDEpIC8qIHJlc2V0IGlzIGZvcmNpbmcgY29tcGxldGlvbiAqLwogCi0vKgotICogRXhjaGFuZ2UuCisvKioKKyAqIHN0cnVjdCBmY19leGNoIC0gRmlicmUgQ2hhbm5lbCBFeGNoYW5nZQorICogQGVtOiAgICAgICAgICAgRXhjaGFuZ2UgbWFuYWdlcgorICogQHBvb2w6ICAgICAgICAgRXhjaGFuZ2UgcG9vbAorICogQHN0YXRlOiAgICAgICAgVGhlIGV4Y2hhbmdlJ3Mgc3RhdGUKKyAqIEB4aWQ6ICAgICAgICAgIFRoZSBleGNoYW5nZSBJRAorICogQGV4X2xpc3Q6ICAgICAgSGFuZGxlIHVzZWQgYnkgdGhlIEVNIHRvIHRyYWNrIGZyZWUgZXhjaGFuZ2VzCisgKiBAZXhfbG9jazogICAgICBMb2NrIHRoYXQgcHJvdGVjdHMgdGhlIGV4Y2hhbmdlCisgKiBAZXhfcmVmY250OiAgICBSZWZlcmVuY2UgY291bnQKKyAqIEB0aW1lb3V0X3dvcms6IEhhbmRsZSBmb3IgdGltZW91dCBoYW5kbGVyCisgKiBAbHA6ICAgICAgICAgICBUaGUgbG9jYWwgcG9ydCB0aGF0IHRoaXMgZXhjaGFuZ2UgaXMgb24KKyAqIEBveGlkOiAgICAgICAgIE9yaWdpbmF0b3IncyBleGNoYW5nZSBJRAorICogQHJ4aWQ6ICAgICAgICAgUmVzcG9uZGVyJ3MgZXhjaGFuZ2UgSUQKKyAqIEBvaWQ6ICAgICAgICAgIE9yaWdpbmF0b3IncyBGQ0lECisgKiBAc2lkOiAgICAgICAgICBTb3VyY2UgRkNJRAorICogQGRpZDogICAgICAgICAgRGVzdGluYXRpb24gRkNJRAorICogQGVzYl9zdGF0OiAgICAgRVNCIGV4Y2hhbmdlIHN0YXR1cworICogQHJfYV90b3Y6ICAgICAgUmVzb3VjZSBhbGxvY2F0aW9uIHRpbWUgb3V0IHZhbHVlIChpbiBtc2VjcykKKyAqIEBzZXFfaWQ6ICAgICAgIFRoZSBuZXh0IHNlcXVlbmNlIElEIHRvIHVzZQorICogQGZfY3RsOiAgICAgICAgRl9DVEwgZmxhZ3MgZm9yIHRoZSBzZXF1ZW5jZQorICogQGZoX3R5cGU6ICAgICAgVGhlIGZyYW1lIHR5cGUKKyAqIEBjbGFzczogICAgICAgIFRoZSBjbGFzcyBvZiBzZXJ2aWNlCisgKiBAc2VxOiAgICAgICAgICBUaGUgc2VxdWVuY2UgaW4gdXNlIG9uIHRoaXMgZXhjaGFuZ2UKKyAqIEByZXNwOiAgICAgICAgIENhbGxiYWNrIGZvciByZXNwb25zZXMgb24gdGhpcyBleGNoYW5nZQorICogQGRlc3RydWN0b3I6ICAgQ2FsbGVkIHdoZW4gZGVzdHJveWluZyB0aGUgZXhjaGFuZ2UKKyAqIEBhcmc6ICAgICAgICAgIFBhc3NlZCBhcyBhIHZvaWQgcG9pbnRlciB0byB0aGUgcmVzcCgpIGNhbGxiYWNrCiAgKgogICogTG9ja2luZyBub3RlczogVGhlIGV4X2xvY2sgcHJvdGVjdHMgZm9sbG93aW5nIGl0ZW1zOgogICoJc3RhdGUsIGVzYl9zdGF0LCBmX2N0bCwgc2VxLnNzYl9zdGF0CkBAIC0zNzQsNzYgKzQxNCw1OSBAQAogICoJc2VxdWVuY2UgYWxsb2NhdGlvbgogICovCiBzdHJ1Y3QgZmNfZXhjaCB7Ci0Jc3RydWN0IGZjX2V4Y2hfbWdyICplbTsJCS8qIGV4Y2hhbmdlIG1hbmFnZXIgKi8KLQlzdHJ1Y3QgZmNfZXhjaF9wb29sICpwb29sOwkvKiBwZXIgY3B1IGV4Y2hlcyBwb29sICovCi0JdTMyCQlzdGF0ZTsJCS8qIGludGVybmFsIGRyaXZlciBzdGF0ZSAqLwotCXUxNgkJeGlkOwkJLyogb3VyIGV4Y2hhbmdlIElEICovCi0Jc3RydWN0IGxpc3RfaGVhZAlleF9saXN0OwkvKiBmcmVlIG9yIGJ1c3kgbGlzdCBsaW5rYWdlICovCi0Jc3BpbmxvY2tfdAlleF9sb2NrOwkvKiBsb2NrIGNvdmVyaW5nIGV4Y2hhbmdlIHN0YXRlICovCi0JYXRvbWljX3QJZXhfcmVmY250OwkvKiByZWZlcmVuY2UgY291bnRlciAqLwotCXN0cnVjdCBkZWxheWVkX3dvcmsgdGltZW91dF93b3JrOyAvKiB0aW1lciBmb3IgdXBwZXIgbGV2ZWwgcHJvdG9jb2xzICovCi0Jc3RydWN0IGZjX2xwb3J0CSpscDsJCS8qIGZjIGRldmljZSBpbnN0YW5jZSAqLwotCXUxNgkJb3hpZDsJCS8qIG9yaWdpbmF0b3IncyBleGNoYW5nZSBJRCAqLwotCXUxNgkJcnhpZDsJCS8qIHJlc3BvbmRlcidzIGV4Y2hhbmdlIElEICovCi0JdTMyCQlvaWQ7CQkvKiBvcmlnaW5hdG9yJ3MgRkNJRCAqLwotCXUzMgkJc2lkOwkJLyogc291cmNlIEZDSUQgKi8KLQl1MzIJCWRpZDsJCS8qIGRlc3RpbmF0aW9uIEZDSUQgKi8KLQl1MzIJCWVzYl9zdGF0OwkvKiBleGNoYW5nZSBzdGF0dXMgZm9yIEVTQiAqLwotCXUzMgkJcl9hX3RvdjsJLyogcl9hX3RvdiBmcm9tIHJwb3J0IChtc2VjKSAqLwotCXU4CQlzZXFfaWQ7CQkvKiBuZXh0IHNlcXVlbmNlIElEIHRvIHVzZSAqLwotCXUzMgkJZl9jdGw7CQkvKiBGX0NUTCBmbGFncyBmb3Igc2VxdWVuY2VzICovCi0JdTgJCWZoX3R5cGU7CS8qIGZyYW1lIHR5cGUgKi8KLQllbnVtIGZjX2NsYXNzCWNsYXNzOwkJLyogY2xhc3Mgb2Ygc2VydmljZSAqLwotCXN0cnVjdCBmY19zZXEJc2VxOwkJLyogc2luZ2xlIHNlcXVlbmNlICovCi0JLyoKLQkgKiBIYW5kbGVyIGZvciByZXNwb25zZXMgdG8gdGhpcyBjdXJyZW50IGV4Y2hhbmdlLgotCSAqLwotCXZvaWQJCSgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqKTsKLQl2b2lkCQkoKmRlc3RydWN0b3IpKHN0cnVjdCBmY19zZXEgKiwgdm9pZCAqKTsKLQkvKgotCSAqIGFyZyBpcyBwYXNzZWQgYXMgdm9pZCBwb2ludGVyIHRvIGV4Y2hhbmdlCi0JICogcmVzcCBhbmQgZGVzdHJ1Y3RvciBoYW5kbGVycwotCSAqLwotCXZvaWQJCSphcmc7CisJc3RydWN0IGZjX2V4Y2hfbWdyICAqZW07CisJc3RydWN0IGZjX2V4Y2hfcG9vbCAqcG9vbDsKKwl1MzIJCSAgICBzdGF0ZTsKKwl1MTYJCSAgICB4aWQ7CisJc3RydWN0IGxpc3RfaGVhZCAgICBleF9saXN0OworCXNwaW5sb2NrX3QJICAgIGV4X2xvY2s7CisJYXRvbWljX3QJICAgIGV4X3JlZmNudDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRpbWVvdXRfd29yazsKKwlzdHJ1Y3QgZmNfbHBvcnQJICAgICpscDsKKwl1MTYJCSAgICBveGlkOworCXUxNgkJICAgIHJ4aWQ7CisJdTMyCQkgICAgb2lkOworCXUzMgkJICAgIHNpZDsKKwl1MzIJCSAgICBkaWQ7CisJdTMyCQkgICAgZXNiX3N0YXQ7CisJdTMyCQkgICAgcl9hX3RvdjsKKwl1OAkJICAgIHNlcV9pZDsKKwl1MzIJCSAgICBmX2N0bDsKKwl1OAkJICAgIGZoX3R5cGU7CisJZW51bSBmY19jbGFzcwkgICAgY2xhc3M7CisJc3RydWN0IGZjX3NlcQkgICAgc2VxOworCisJdm9pZAkJICAgICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqKTsKKwl2b2lkCQkgICAgKmFyZzsKKworCXZvaWQJCSAgICAoKmRlc3RydWN0b3IpKHN0cnVjdCBmY19zZXEgKiwgdm9pZCAqKTsKKwogfTsKICNkZWZpbmUJZmNfc2VxX2V4Y2goc3ApIGNvbnRhaW5lcl9vZihzcCwgc3RydWN0IGZjX2V4Y2gsIHNlcSkKIAotc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlIHsKIAorc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlIHsKIAkvKgogCSAqIEludGVyZmFjZSB0byBzZW5kIGEgRkMgZnJhbWUKIAkgKgogCSAqIFNUQVRVUzogUkVRVUlSRUQKIAkgKi8KLQlpbnQgKCpmcmFtZV9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKKwlpbnQgKCpmcmFtZV9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjX2ZyYW1lICopOwogCiAJLyoKIAkgKiBJbnRlcmZhY2UgdG8gc2VuZCBFTFMvQ1QgZnJhbWVzCiAJICoKIAkgKiBTVEFUVVM6IE9QVElPTkFMCiAJICovCi0Jc3RydWN0IGZjX3NlcSAqKCplbHNjdF9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAotCQkJCSAgICAgdTMyIGRpZCwKLQkJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgb3AsCisJc3RydWN0IGZjX3NlcSAqKCplbHNjdF9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKiwgdTMyIGRpZCwKKwkJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqLCB1bnNpZ25lZCBpbnQgb3AsCiAJCQkJICAgICB2b2lkICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLAotCQkJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJCSAgICAgdm9pZCAqYXJnKSwKKwkJCQkJICAgICBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqYXJnKSwKIAkJCQkgICAgIHZvaWQgKmFyZywgdTMyIHRpbWVyX21zZWMpOwogCiAJLyoKIAkgKiBTZW5kIHRoZSBGQyBmcmFtZSBwYXlsb2FkIHVzaW5nIGEgbmV3IGV4Y2hhbmdlIGFuZCBzZXF1ZW5jZS4KIAkgKgotCSAqIFRoZSBmcmFtZSBwb2ludGVyIHdpdGggc29tZSBvZiB0aGUgaGVhZGVyJ3MgZmllbGRzIG11c3QgYmUKLQkgKiBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgZXhjaF9zZXFfc2VuZCgpLCB0aG9zZSBmaWVsZHMgYXJlLAotCSAqCi0JICogLSByb3V0aW5nIGNvbnRyb2wKLQkgKiAtIEZDIHBvcnQgZGlkCi0JICogLSBGQyBwb3J0IHNpZAotCSAqIC0gRkMgaGVhZGVyIHR5cGUKLQkgKiAtIGZyYW1lIGNvbnRyb2wKLQkgKiAtIHBhcmFtZXRlciBvciByZWxhdGl2ZSBvZmZzZXQKLQkgKgogCSAqIFRoZSBleGNoYW5nZSByZXNwb25zZSBoYW5kbGVyIGlzIHNldCBpbiB0aGlzIHJvdXRpbmUgdG8gcmVzcCgpCiAJICogZnVuY3Rpb24gcG9pbnRlci4gSXQgY2FuIGJlIGNhbGxlZCBpbiB0d28gc2NlbmFyaW9zOiBpZiBhIHRpbWVvdXQKIAkgKiBvY2N1cnMgb3IgaWYgYSByZXNwb25zZSBmcmFtZSBpcyByZWNlaXZlZCBmb3IgdGhlIGV4Y2hhbmdlLiBUaGUKQEAgLTQ2NCwxNCArNDg3LDEzIEBACiAJICoKIAkgKiBTVEFUVVM6IE9QVElPTkFMCiAJICovCi0Jc3RydWN0IGZjX3NlcSAqKCpleGNoX3NlcV9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKmxwLAotCQkJCQlzdHJ1Y3QgZmNfZnJhbWUgKmZwLAotCQkJCQl2b2lkICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqc3AsCi0JCQkJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJCQkgICAgIHZvaWQgKmFyZyksCi0JCQkJCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgZmNfc2VxICpzcCwKLQkJCQkJCQkgICB2b2lkICphcmcpLAotCQkJCQl2b2lkICphcmcsIHVuc2lnbmVkIGludCB0aW1lcl9tc2VjKTsKKwlzdHJ1Y3QgZmNfc2VxICooKmV4Y2hfc2VxX3NlbmQpKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwKKwkJCQkJdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwKKwkJCQkJCSAgICAgc3RydWN0IGZjX2ZyYW1lICosCisJCQkJCQkgICAgIHZvaWQgKiksCisJCQkJCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgZmNfc2VxICosCisJCQkJCQkJICAgdm9pZCAqKSwKKwkJCQkJdm9pZCAqLCB1bnNpZ25lZCBpbnQgdGltZXJfbXNlYyk7CiAKIAkvKgogCSAqIFNldHMgdXAgdGhlIEREUCBjb250ZXh0IGZvciBhIGdpdmVuIGV4Y2hhbmdlIGlkIG9uIHRoZSBnaXZlbgpAQCAtNDc5LDIyICs1MDEsMjggQEAKIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKIAkgKi8KLQlpbnQgKCpkZHBfc2V0dXApKHN0cnVjdCBmY19scG9ydCAqbHAsIHUxNiB4aWQsCi0JCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ2MpOworCWludCAoKmRkcF9zZXR1cCkoc3RydWN0IGZjX2xwb3J0ICosIHUxNiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosCisJCQkgdW5zaWduZWQgaW50KTsKIAkvKgogCSAqIENvbXBsZXRlcyB0aGUgRERQIHRyYW5zZmVyIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgZGF0YSBERFBlZAogCSAqIGZvciB0aGUgZ2l2ZW4gZXhjaGFuZ2UgaWQuCiAJICoKIAkgKiBTVEFUVVM6IE9QVElPTkFMCiAJICovCi0JaW50ICgqZGRwX2RvbmUpKHN0cnVjdCBmY19scG9ydCAqbHAsIHUxNiB4aWQpOworCWludCAoKmRkcF9kb25lKShzdHJ1Y3QgZmNfbHBvcnQgKiwgdTE2KTsKKwkvKgorCSAqIEFsbG93IExMRCB0byBmaWxsIGl0cyBvd24gTGluayBFcnJvciBTdGF0dXMgQmxvY2sKKwkgKgorCSAqIFNUQVRVUzogT1BUSU9OQUwKKwkgKi8KKwl2b2lkICgqZ2V0X2xlc2IpKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfZWxzX2xlc2IgKmxlc2IpOwogCS8qCiAJICogU2VuZCBhIGZyYW1lIHVzaW5nIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFuZCBleGNoYW5nZS4KIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKIAkgKi8KLQlpbnQgKCpzZXFfc2VuZCkoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGZjX3NlcSAqc3AsCi0JCQlzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKKwlpbnQgKCpzZXFfc2VuZCkoc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBmY19zZXEgKiwKKwkJCXN0cnVjdCBmY19mcmFtZSAqKTsKIAogCS8qCiAJICogU2VuZCBhbiBFTFMgcmVzcG9uc2UgdXNpbmcgaW5mb21hdGlvbiBmcm9tIGEgcHJldmlvdXMKQEAgLTUwMiw4ICs1MzAsOCBAQAogCSAqCiAJICogU1RBVFVTOiBPUFRJT05BTAogCSAqLwotCXZvaWQgKCpzZXFfZWxzX3JzcF9zZW5kKShzdHJ1Y3QgZmNfc2VxICpzcCwgZW51bSBmY19lbHNfY21kIGVsc19jbWQsCi0JCQkJIHN0cnVjdCBmY19zZXFfZWxzX2RhdGEgKmVsc19kYXRhKTsKKwl2b2lkICgqc2VxX2Vsc19yc3Bfc2VuZCkoc3RydWN0IGZjX3NlcSAqLCBlbnVtIGZjX2Vsc19jbWQsCisJCQkJIHN0cnVjdCBmY19zZXFfZWxzX2RhdGEgKik7CiAKIAkvKgogCSAqIEFib3J0IGFuIGV4Y2hhbmdlIGFuZCBzZXF1ZW5jZS4gR2VuZXJhbGx5IGNhbGxlZCBiZWNhdXNlIG9mIGEKQEAgLTUxNSw3ICs1NDMsNyBAQAogCSAqCiAJICogU1RBVFVTOiBPUFRJT05BTAogCSAqLwotCWludCAoKnNlcV9leGNoX2Fib3J0KShjb25zdCBzdHJ1Y3QgZmNfc2VxICpyZXFfc3AsCisJaW50ICgqc2VxX2V4Y2hfYWJvcnQpKGNvbnN0IHN0cnVjdCBmY19zZXEgKiwKIAkJCSAgICAgIHVuc2lnbmVkIGludCB0aW1lcl9tc2VjKTsKIAogCS8qCkBAIC01MjQsMTQgKzU1MiwxNCBAQAogCSAqCiAJICogU1RBVFVTOiBPUFRJT05BTAogCSAqLwotCXZvaWQgKCpleGNoX2RvbmUpKHN0cnVjdCBmY19zZXEgKnNwKTsKKwl2b2lkICgqZXhjaF9kb25lKShzdHJ1Y3QgZmNfc2VxICopOwogCiAJLyoKIAkgKiBTdGFydCBhIG5ldyBzZXF1ZW5jZSBvbiB0aGUgc2FtZSBleGNoYW5nZS9zZXF1ZW5jZSB0dXBsZS4KIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKIAkgKi8KLQlzdHJ1Y3QgZmNfc2VxICooKnNlcV9zdGFydF9uZXh0KShzdHJ1Y3QgZmNfc2VxICpzcCk7CisJc3RydWN0IGZjX3NlcSAqKCpzZXFfc3RhcnRfbmV4dCkoc3RydWN0IGZjX3NlcSAqKTsKIAogCS8qCiAJICogUmVzZXQgYW4gZXhjaGFuZ2UgbWFuYWdlciwgY29tcGxldGluZyBhbGwgc2VxdWVuY2VzIGFuZCBleGNoYW5nZXMuCkBAIC01NDAsOCArNTY4LDcgQEAKIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKIAkgKi8KLQl2b2lkICgqZXhjaF9tZ3JfcmVzZXQpKHN0cnVjdCBmY19scG9ydCAqLAotCQkJICAgICAgIHUzMiBzX2lkLCB1MzIgZF9pZCk7CisJdm9pZCAoKmV4Y2hfbWdyX3Jlc2V0KShzdHJ1Y3QgZmNfbHBvcnQgKiwgdTMyIHNfaWQsIHUzMiBkX2lkKTsKIAogCS8qCiAJICogRmx1c2ggdGhlIHJwb3J0IHdvcmsgcXVldWUuIEdlbmVyYWxseSB1c2VkIGJlZm9yZSBzaHV0ZG93bi4KQEAgLTU1NSw4ICs1ODIsOCBAQAogCSAqCiAJICogU1RBVFVTOiBPUFRJT05BTAogCSAqLwotCXZvaWQgKCpscG9ydF9yZWN2KShzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfc2VxICpzcCwKLQkJCSAgIHN0cnVjdCBmY19mcmFtZSAqZnApOworCXZvaWQgKCpscG9ydF9yZWN2KShzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjX3NlcSAqLAorCQkJICAgc3RydWN0IGZjX2ZyYW1lICopOwogCiAJLyoKIAkgKiBSZXNldCB0aGUgbG9jYWwgcG9ydC4KQEAgLTU2Niw2ICs1OTMsMjYgQEAKIAlpbnQgKCpscG9ydF9yZXNldCkoc3RydWN0IGZjX2xwb3J0ICopOwogCiAJLyoKKwkgKiBTZXQgdGhlIGxvY2FsIHBvcnQgRkNfSUQuCisJICoKKwkgKiBUaGlzIG1heSBiZSBwcm92aWRlZCBieSB0aGUgTExEIHRvIGFsbG93IGl0IHRvIGJlCisJICogbm90aWZpZWQgd2hlbiB0aGUgbG9jYWwgcG9ydCBpcyBhc3NpZ25lZCBhIEZDLUlELgorCSAqCisJICogVGhlIGZyYW1lLCBpZiBub24tTlVMTCwgaXMgdGhlIGluY29taW5nIGZyYW1lIHdpdGggdGhlCisJICogRkxPR0kgTFNfQUNDIG9yIEZMT0dJLCBhbmQgbWF5IGNvbnRhaW4gdGhlIGdyYW50ZWQgTUFDCisJICogYWRkcmVzcyBmb3IgdGhlIExMRC4gIFRoZSBmcmFtZSBwb2ludGVyIG1heSBiZSBOVUxMIGlmCisJICogbm8gTUFDIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFzc2lnbm1lbnQgKExPR08gb3IgUExPR0kpLgorCSAqCisJICogSWYgRkNfSUQgaXMgbm9uLXplcm8sIHJfYV90b3YgYW5kIGVfZF90b3YgbXVzdCBiZSB2YWxpZC4KKwkgKgorCSAqIE5vdGU6IHRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIGxvY2FsIHBvcnQgbXV0ZXggaGVsZC4KKwkgKgorCSAqIFNUQVRVUzogT1BUSU9OQUwKKwkgKi8KKwl2b2lkICgqbHBvcnRfc2V0X3BvcnRfaWQpKHN0cnVjdCBmY19scG9ydCAqLCB1MzIgcG9ydF9pZCwKKwkJCQkgIHN0cnVjdCBmY19mcmFtZSAqKTsKKworCS8qCiAJICogQ3JlYXRlIGEgcmVtb3RlIHBvcnQgd2l0aCBhIGdpdmVuIHBvcnQgSUQKIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKQEAgLTYyMiwzMSArNjY5LDMxIEBACiAJICoKIAkgKiBTVEFUVVM6IE9QVElPTkFMCiAJICovCi0JaW50ICgqZmNwX2NtZF9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLAotCQkJICAgIHZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJCSB2b2lkICphcmcpKTsKKwlpbnQgKCpmY3BfY21kX3NlbmQpKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfZmNwX3BrdCAqLAorCQkJICAgIHZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqLAorCQkJCQkgdm9pZCAqKSk7CiAKIAkvKgogCSAqIENsZWFudXAgdGhlIEZDUCBsYXllciwgdXNlZCBkdXJyaW5nIGxpbmsgZG93biBhbmQgcmVzZXQKIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKIAkgKi8KLQl2b2lkICgqZmNwX2NsZWFudXApKHN0cnVjdCBmY19scG9ydCAqbHApOworCXZvaWQgKCpmY3BfY2xlYW51cCkoc3RydWN0IGZjX2xwb3J0ICopOwogCiAJLyoKIAkgKiBBYm9ydCBhbGwgSS9PIG9uIGEgbG9jYWwgcG9ydAogCSAqCiAJICogU1RBVFVTOiBPUFRJT05BTAogCSAqLwotCXZvaWQgKCpmY3BfYWJvcnRfaW8pKHN0cnVjdCBmY19scG9ydCAqbHApOworCXZvaWQgKCpmY3BfYWJvcnRfaW8pKHN0cnVjdCBmY19scG9ydCAqKTsKIAogCS8qCiAJICogUmVjZWl2ZSBhIHJlcXVlc3QgZm9yIHRoZSBkaXNjb3ZlcnkgbGF5ZXIuCiAJICoKIAkgKiBTVEFUVVM6IE9QVElPTkFMCiAJICovCi0Jdm9pZCAoKmRpc2NfcmVjdl9yZXEpKHN0cnVjdCBmY19zZXEgKiwKLQkJCSAgICAgIHN0cnVjdCBmY19mcmFtZSAqLCBzdHJ1Y3QgZmNfbHBvcnQgKik7CisJdm9pZCAoKmRpc2NfcmVjdl9yZXEpKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosCisJCQkgICAgICBzdHJ1Y3QgZmNfbHBvcnQgKik7CiAKIAkvKgogCSAqIFN0YXJ0IGRpc2NvdmVyeSBmb3IgYSBsb2NhbCBwb3J0LgpAQCAtNjc1LDQxOSArNzIyLDM0MCBAQAogCXZvaWQgKCpkaXNjX3N0b3BfZmluYWwpIChzdHJ1Y3QgZmNfbHBvcnQgKik7CiB9OwogCi0vKiBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBkaXNjb3ZlcnkgbGF5ZXIgKi8KKy8qKgorICogc3RydWN0IGZjX2Rpc2MgLSBEaXNjb3ZlcnkgY29udGV4dAorICogQHJldHJ5X2NvdW50OiAgIE51bWJlciBvZiByZXRyaWVzCisgKiBAcGVuZGluZzogICAgICAgMSBpZiBkaXNjb3ZlcnkgaXMgcGVuZGluZywgMCBpZiBub3QKKyAqIEByZXF1ZXN0aW5nOiAgICAxIGlmIGRpc2NvdmVyeSBoYXMgYmVlbiByZXF1ZXN0ZWQsIDAgaWYgbm90CisgKiBAc2VxX2NvdW50OiAgICAgTnVtYmVyIG9mIHNlcXVlbmNlcyB1c2VkIGZvciBkaXNjb3ZlcnkKKyAqIEBidWZfbGVuOiAgICAgICBMZW5ndGggb2YgdGhlIGRpc2NvdmVyeSBidWZmZXIKKyAqIEBkaXNjX2lkOiAgICAgICBEaXNjb3ZlcnkgSUQKKyAqIEBycG9ydHM6ICAgICAgICBMaXN0IG9mIGRpc2NvdmVyZWQgcmVtb3RlIHBvcnRzCisgKiBAbHBvcnQ6ICAgICAgICAgVGhlIGxvY2FsIHBvcnQgdGhhdCBkaXNjb3ZlcnkgaXMgZm9yCisgKiBAZGlzY19tdXRleDogICAgTXV0ZXggdGhhdCBwcm90ZWN0cyB0aGUgZGlzY292ZXJ5IGNvbnRleHQKKyAqIEBwYXJ0aWFsX2J1ZjogICBQYXJ0aWFsIG5hbWUgYnVmZmVyIChpZiBuYW1lcyBhcmUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICAgICBpbiBtdWx0aXBsZSBmcmFtZXMpCisgKiBAZGlzY193b3JrOiAgICAgaGFuZGxlIGZvciBkZWxheWVkIHdvcmsgY29udGV4dAorICogQGRpc2NfY2FsbGJhY2s6IENhbGxiYWNrIHJvdXRpbmUgY2FsbGVkIHdoZW4gZGlzY292ZXJ5IGNvbXBsZXRlcworICovCiBzdHJ1Y3QgZmNfZGlzYyB7Ci0JdW5zaWduZWQgY2hhcgkJcmV0cnlfY291bnQ7Ci0JdW5zaWduZWQgY2hhcgkJcGVuZGluZzsKLQl1bnNpZ25lZCBjaGFyCQlyZXF1ZXN0ZWQ7Ci0JdW5zaWduZWQgc2hvcnQJCXNlcV9jb3VudDsKLQl1bnNpZ25lZCBjaGFyCQlidWZfbGVuOwotCXUxNgkJCWRpc2NfaWQ7CisJdW5zaWduZWQgY2hhciAgICAgICAgIHJldHJ5X2NvdW50OworCXVuc2lnbmVkIGNoYXIgICAgICAgICBwZW5kaW5nOworCXVuc2lnbmVkIGNoYXIgICAgICAgICByZXF1ZXN0ZWQ7CisJdW5zaWduZWQgc2hvcnQgICAgICAgIHNlcV9jb3VudDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgYnVmX2xlbjsKKwl1MTYgICAgICAgICAgICAgICAgICAgZGlzY19pZDsKKworCXN0cnVjdCBsaXN0X2hlYWQgICAgICBycG9ydHM7CisJc3RydWN0IGZjX2xwb3J0CSAgICAgICpscG9ydDsKKwlzdHJ1Y3QgbXV0ZXgJICAgICAgZGlzY19tdXRleDsKKwlzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AgcGFydGlhbF9idWY7CisJc3RydWN0IGRlbGF5ZWRfd29yayAgIGRpc2Nfd29yazsKIAogCXZvaWQgKCpkaXNjX2NhbGxiYWNrKShzdHJ1Y3QgZmNfbHBvcnQgKiwKIAkJCSAgICAgIGVudW0gZmNfZGlzY19ldmVudCk7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkCSBycG9ydHM7Ci0Jc3RydWN0IGZjX2xwb3J0CQkqbHBvcnQ7Ci0Jc3RydWN0IG11dGV4CQlkaXNjX211dGV4OwotCXN0cnVjdCBmY19ncG5fZnRfcmVzcAlwYXJ0aWFsX2J1ZjsJLyogcGFydGlhbCBuYW1lIGJ1ZmZlciAqLwotCXN0cnVjdCBkZWxheWVkX3dvcmsJZGlzY193b3JrOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgZmNfbHBvcnQgLSBMb2NhbCBwb3J0CisgKiBAaG9zdDogICAgICAgICAgICAgICAgICBUaGUgU0NTSSBob3N0IGFzc29jaWF0ZWQgd2l0aCBhIGxvY2FsIHBvcnQKKyAqIEBlbWFfbGlzdDogICAgICAgICAgICAgIEV4Y2hhbmdlIG1hbmFnZXIgYW5jaG9yIGxpc3QKKyAqIEBkbnNfcmRhdGE6ICAgICAgICAgICAgIFRoZSBkaXJlY3Rvcnkgc2VydmVyIHJlbW90ZSBwb3J0CisgKiBAcHRwX3JkYXRhOiAgICAgICAgICAgICBQb2ludCB0byBwb2ludCByZW1vdGUgcG9ydAorICogQHNjc2lfcHJpdjogICAgICAgICAgICAgRkNQIGxheWVyIGludGVybmFsIGRhdGEKKyAqIEBkaXNjOiAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBjb250ZXh0CisgKiBAdnBvcnRzOiAgICAgICAgICAgICAgICBDaGlsZCB2cG9ydHMgaWYgTl9Qb3J0CisgKiBAdnBvcnQ6ICAgICAgICAgICAgICAgICBQYXJlbnQgdnBvcnQgaWYgVk5fUG9ydAorICogQHR0OiAgICAgICAgICAgICAgICAgICAgTGliZmMgZnVuY3Rpb24gdGVtcGxhdGUKKyAqIEBsaW5rX3VwOiAgICAgICAgICAgICAgIExpbmsgc3RhdGUgKDEgPSBsaW5rIHVwLCAwID0gbGluayBkb3duKQorICogQHFmdWxsOiAgICAgICAgICAgICAgICAgUXVldWUgc3RhdGUgKDEgcXVldWUgaXMgZnVsbCwgMCBxdWV1ZSBpcyBub3QgZnVsbCkKKyAqIEBzdGF0ZTogICAgICAgICAgICAgICAgIElkZW50aWZpZXMgdGhlIHN0YXRlCisgKiBAYm9vdF90aW1lOiAgICAgICAgICAgICBUaW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIHRoZSBsb2NhbCBwb3J0IGNhbWUgb25saW5lCisgKiBAaG9zdF9zdGF0czogICAgICAgICAgICBTQ1NJIGhvc3Qgc3RhdGlzdGljcworICogQGRldl9zdGF0czogICAgICAgICAgICAgRkNvRSBkZXZpY2Ugc3RhdHMgKFRPRE86IGxpYmZjIHNob3VsZCBub3QgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEZDb0UgYXdhcmUpCisgKiBAcmV0cnlfY291bnQ6ICAgICAgICAgICBOdW1iZXIgb2YgcmV0cmllcyBpbiB0aGUgY3VycmVudCBzdGF0ZQorICogQHd3cG46ICAgICAgICAgICAgICAgICAgV29ybGQgV2lkZSBQb3J0IE5hbWUKKyAqIEB3d25uOiAgICAgICAgICAgICAgICAgIFdvcmxkIFdpZGUgTm9kZSBOYW1lCisgKiBAc2VydmljZV9wYXJhbXM6ICAgICAgICBDb21tb24gc2VydmljZSBwYXJhbWV0ZXJzCisgKiBAZV9kX3RvdjogICAgICAgICAgICAgICBFcnJvciBkZXRlY3Rpb24gdGltZW91dCB2YWx1ZQorICogQHJfYV90b3Y6ICAgICAgICAgICAgICAgUmVzb3VjZSBhbGxvY2F0aW9uIHRpbWVvdXQgdmFsdWUKKyAqIEBybmlkX2dlbjogICAgICAgICAgICAgIFJOSUQgaW5mb3JtYXRpb24KKyAqIEBzZ19zdXBwOiAgICAgICAgICAgICAgIEluZGljYXRlcyBpZiBzY2F0dGVyIGdhdGhlciBpcyBzdXBwb3J0ZWQKKyAqIEBzZXFfb2ZmbG9hZDogICAgICAgICAgIEluZGljYXRlcyBpZiBzZXF1ZW5jZSBvZmZsb2FkIGlzIHN1cHBvcnRlZAorICogQGNyY19vZmZsb2FkOiAgICAgICAgICAgSW5kaWNhdGVzIGlmIENSQyBvZmZsb2FkIGlzIHN1cHBvcnRlZAorICogQGxyb19lbmFibGVkOiAgICAgICAgICAgSW5kaWNhdGVzIGlmIGxhcmdlIHJlY2VpdmUgb2ZmbG9hZCBpcyBzdXBwb3J0ZWQKKyAqIEBkb2VzX25waXY6ICAgICAgICAgICAgIFN1cHBvcnRzIG11bHRpcGxlIHZwb3J0cworICogQG5waXZfZW5hYmxlZDogICAgICAgICAgU3dpdGNoL2ZhYnJpYyBhbGxvd3MgTlBJVgorICogQG1mczogICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gRmlicmUgQ2hhbm5lbCBwYXlsb2FkIHNpemUKKyAqIEBtYXhfcmV0cnlfY291bnQ6ICAgICAgIFRoZSBtYXhpbXVtIHJldHJ5IGF0dGVtcHRzCisgKiBAbWF4X3Jwb3J0X3JldHJ5X2NvdW50OiBUaGUgbWF4aW11bSByZW1vdGUgcG9ydCByZXRyeSBhdHRlbXB0cworICogQGxyb194aWQ6ICAgICAgICAgICAgICAgVGhlIG1heGltdW0gWElEIGZvciBMUk8KKyAqIEBsc29fbWF4OiAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIGxhcmdlIG9mZmxvYWQgc2VuZCBzaXplCisgKiBAZmN0czogICAgICAgICAgICAgICAgICBGQy00IHR5cGUgbWFzaworICogQGxwX211dGV4OiAgICAgICAgICAgICAgTXV0ZXggdG8gcHJvdGVjdCB0aGUgbG9jYWwgcG9ydAorICogQGxpc3Q6ICAgICAgICAgICAgICAgICAgSGFuZGxlIGZvciBsaXN0IG9mIGxvY2FsIHBvcnRzCisgKiBAcmV0cnlfd29yazogICAgICAgICAgICBIYW5kbGUgdG8gbG9jYWwgcG9ydCBmb3IgZGVsYXllZCByZXRyeSBjb250ZXh0CisgKi8KIHN0cnVjdCBmY19scG9ydCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCiAJLyogQXNzb2NpYXRpb25zICovCi0Jc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWVtYV9saXN0OwotCXN0cnVjdCBmY19ycG9ydF9wcml2CSpkbnNfcnA7Ci0Jc3RydWN0IGZjX3Jwb3J0X3ByaXYJKnB0cF9ycDsKLQl2b2lkCQkJKnNjc2lfcHJpdjsKLQlzdHJ1Y3QgZmNfZGlzYyAgICAgICAgICBkaXNjOworCXN0cnVjdCBTY3NpX0hvc3QJICAgICAgICpob3N0OworCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgIGVtYV9saXN0OworCXN0cnVjdCBmY19ycG9ydF9wcml2CSAgICAgICAqZG5zX3JkYXRhOworCXN0cnVjdCBmY19ycG9ydF9wcml2CSAgICAgICAqcHRwX3JkYXRhOworCXZvaWQJCQkgICAgICAgKnNjc2lfcHJpdjsKKwlzdHJ1Y3QgZmNfZGlzYyAgICAgICAgICAgICAgICAgZGlzYzsKKworCS8qIFZpcnR1YWwgcG9ydCBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgIHZwb3J0czsKKwlzdHJ1Y3QgZmNfdnBvcnQJCSAgICAgICAqdnBvcnQ7CiAKIAkvKiBPcGVyYXRpb25hbCBJbmZvcm1hdGlvbiAqLwogCXN0cnVjdCBsaWJmY19mdW5jdGlvbl90ZW1wbGF0ZSB0dDsKLQl1OAkJCWxpbmtfdXA7Ci0JdTgJCQlxZnVsbDsKLQllbnVtIGZjX2xwb3J0X3N0YXRlCXN0YXRlOwotCXVuc2lnbmVkIGxvbmcJCWJvb3RfdGltZTsKKwl1OAkJCSAgICAgICBsaW5rX3VwOworCXU4CQkJICAgICAgIHFmdWxsOworCWVudW0gZmNfbHBvcnRfc3RhdGUJICAgICAgIHN0YXRlOworCXVuc2lnbmVkIGxvbmcJCSAgICAgICBib290X3RpbWU7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAgICAgIGhvc3Rfc3RhdHM7CisJc3RydWN0IGZjb2VfZGV2X3N0YXRzCSAgICAgICAqZGV2X3N0YXRzOworCXU4CQkJICAgICAgIHJldHJ5X2NvdW50OwogCi0Jc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyBob3N0X3N0YXRzOwotCXN0cnVjdCBmY29lX2Rldl9zdGF0cwkqZGV2X3N0YXRzOwotCi0JdTY0CQkJd3dwbjsKLQl1NjQJCQl3d25uOwotCXU4CQkJcmV0cnlfY291bnQ7CisJLyogRmFicmljIGluZm9ybWF0aW9uICovCisJdTY0CQkJICAgICAgIHd3cG47CisJdTY0CQkJICAgICAgIHd3bm47CisJdW5zaWduZWQgaW50CQkgICAgICAgc2VydmljZV9wYXJhbXM7CisJdW5zaWduZWQgaW50CQkgICAgICAgZV9kX3RvdjsKKwl1bnNpZ25lZCBpbnQJCSAgICAgICByX2FfdG92OworCXN0cnVjdCBmY19lbHNfcm5pZF9nZW4JICAgICAgIHJuaWRfZ2VuOwogCiAJLyogQ2FwYWJpbGl0aWVzICovCi0JdTMyCQkJc2dfc3VwcDoxOwkvKiBzY2F0dGVyIGdhdGhlciBzdXBwb3J0ZWQgKi8KLQl1MzIJCQlzZXFfb2ZmbG9hZDoxOwkvKiBzZXEgb2ZmbG9hZCBzdXBwb3J0ZWQgKi8KLQl1MzIJCQljcmNfb2ZmbG9hZDoxOwkvKiBjcmMgb2ZmbG9hZCBzdXBwb3J0ZWQgKi8KLQl1MzIJCQlscm9fZW5hYmxlZDoxOwkvKiBsYXJnZSByZWNlaXZlIG9mZmxvYWQgKi8KLQl1MzIJCQltZnM7CSAgICAgICAgLyogbWF4IEZDIHBheWxvYWQgc2l6ZSAqLwotCXVuc2lnbmVkIGludAkJc2VydmljZV9wYXJhbXM7Ci0JdW5zaWduZWQgaW50CQllX2RfdG92OwotCXVuc2lnbmVkIGludAkJcl9hX3RvdjsKLQl1OAkJCW1heF9yZXRyeV9jb3VudDsKLQl1OAkJCW1heF9ycG9ydF9yZXRyeV9jb3VudDsKLQl1MTYJCQlsaW5rX3NwZWVkOwotCXUxNgkJCWxpbmtfc3VwcG9ydGVkX3NwZWVkczsKLQl1MTYJCQlscm9feGlkOwkvKiBtYXggeGlkIGZvciBmY29lIGxybyAqLwotCXVuc2lnbmVkIGludAkJbHNvX21heDsJLyogbWF4IGxhcmdlIHNlbmQgc2l6ZSAqLwotCXN0cnVjdCBmY19uc19mdHMJZmN0czsJICAgICAgICAvKiBGQy00IHR5cGUgbWFza3MgKi8KLQlzdHJ1Y3QgZmNfZWxzX3JuaWRfZ2VuCXJuaWRfZ2VuOwkvKiBSTklEIGluZm9ybWF0aW9uICovCi0KLQkvKiBTZW1hcGhvcmVzICovCi0Jc3RydWN0IG11dGV4IGxwX211dGV4OworCXUzMgkJCSAgICAgICBzZ19zdXBwOjE7CisJdTMyCQkJICAgICAgIHNlcV9vZmZsb2FkOjE7CisJdTMyCQkJICAgICAgIGNyY19vZmZsb2FkOjE7CisJdTMyCQkJICAgICAgIGxyb19lbmFibGVkOjE7CisJdTMyCQkJICAgICAgIGRvZXNfbnBpdjoxOworCXUzMgkJCSAgICAgICBucGl2X2VuYWJsZWQ6MTsKKwl1MzIJCQkgICAgICAgbWZzOworCXU4CQkJICAgICAgIG1heF9yZXRyeV9jb3VudDsKKwl1OAkJCSAgICAgICBtYXhfcnBvcnRfcmV0cnlfY291bnQ7CisJdTE2CQkJICAgICAgIGxpbmtfc3BlZWQ7CisJdTE2CQkJICAgICAgIGxpbmtfc3VwcG9ydGVkX3NwZWVkczsKKwl1MTYJCQkgICAgICAgbHJvX3hpZDsKKwl1bnNpZ25lZCBpbnQJCSAgICAgICBsc29fbWF4OworCXN0cnVjdCBmY19uc19mdHMJICAgICAgIGZjdHM7CiAKIAkvKiBNaXNjZWxsYW5lb3VzICovCi0Jc3RydWN0IGRlbGF5ZWRfd29yawlyZXRyeV93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsJZGlzY193b3JrOworCXN0cnVjdCBtdXRleCAgICAgICAgICAgICAgICAgICBscF9tdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgbGlzdDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCSAgICAgICByZXRyeV93b3JrOwogfTsKIAogLyoKICAqIEZDX0xQT1JUIEhFTFBFUiBGVU5DVElPTlMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZjX2xwb3J0X3Rlc3RfcmVhZHkoc3RydWN0IGZjX2xwb3J0ICpscCkKKworLyoqCisgKiBmY19scG9ydF90ZXN0X3JlYWR5KCkgLSBEZXRlcm1pbmUgaWYgYSBsb2NhbCBwb3J0IGlzIGluIHRoZSBSRUFEWSBzdGF0ZQorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byB0ZXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZjX2xwb3J0X3Rlc3RfcmVhZHkoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKLQlyZXR1cm4gbHAtPnN0YXRlID09IExQT1JUX1NUX1JFQURZOworCXJldHVybiBscG9ydC0+c3RhdGUgPT0gTFBPUlRfU1RfUkVBRFk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmY19zZXRfd3dubihzdHJ1Y3QgZmNfbHBvcnQgKmxwLCB1NjQgd3dubikKKy8qKgorICogZmNfc2V0X3d3bm4oKSAtIFNldCB0aGUgV29ybGQgV2lkZSBOb2RlIE5hbWUgb2YgYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHdob3NlIFdXTk4gaXMgdG8gYmUgc2V0CisgKiBAd3dubjogIFRoZSBuZXcgV1dOTgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmNfc2V0X3d3bm4oc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgdTY0IHd3bm4pCiB7Ci0JbHAtPnd3bm4gPSB3d25uOworCWxwb3J0LT53d25uID0gd3dubjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZjX3NldF93d3BuKHN0cnVjdCBmY19scG9ydCAqbHAsIHU2NCB3d25uKQorLyoqCisgKiBmY19zZXRfd3dwbigpIC0gU2V0IHRoZSBXb3JsZCBXaWRlIFBvcnQgTmFtZSBvZiBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hvc2UgV1dQTiBpcyB0byBiZSBzZXQKKyAqIEB3d25uOiAgVGhlIG5ldyBXV1BOCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmY19zZXRfd3dwbihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCB1NjQgd3dubikKIHsKLQlscC0+d3dwbiA9IHd3bm47CisJbHBvcnQtPnd3cG4gPSB3d25uOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmNfbHBvcnRfc3RhdGVfZW50ZXIoc3RydWN0IGZjX2xwb3J0ICpscCwKKy8qKgorICogZmNfbHBvcnRfc3RhdGVfZW50ZXIoKSAtIENoYW5nZSBhIGxvY2FsIHBvcnQncyBzdGF0ZQorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB3aG9zZSBzdGF0ZSBpcyB0byBjaGFuZ2UKKyAqIEBzdGF0ZTogVGhlIG5ldyBzdGF0ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmNfbHBvcnRfc3RhdGVfZW50ZXIoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKIAkJCQkJZW51bSBmY19scG9ydF9zdGF0ZSBzdGF0ZSkKIHsKLQlpZiAoc3RhdGUgIT0gbHAtPnN0YXRlKQotCQlscC0+cmV0cnlfY291bnQgPSAwOwotCWxwLT5zdGF0ZSA9IHN0YXRlOworCWlmIChzdGF0ZSAhPSBscG9ydC0+c3RhdGUpCisJCWxwb3J0LT5yZXRyeV9jb3VudCA9IDA7CisJbHBvcnQtPnN0YXRlID0gc3RhdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZjX2xwb3J0X2luaXRfc3RhdHMoc3RydWN0IGZjX2xwb3J0ICpscCkKKy8qKgorICogZmNfbHBvcnRfaW5pdF9zdGF0cygpIC0gQWxsb2NhdGUgcGVyLUNQVSBzdGF0aXN0aWNzIGZvciBhIGxvY2FsIHBvcnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hvc2Ugc3RhdGlzdGljcyBhcmUgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgZmNfbHBvcnRfaW5pdF9zdGF0cyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCS8qIGFsbG9jYXRlIHBlciBjcHUgc3RhdHMgYmxvY2sgKi8KLQlscC0+ZGV2X3N0YXRzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBmY29lX2Rldl9zdGF0cyk7Ci0JaWYgKCFscC0+ZGV2X3N0YXRzKQorCWxwb3J0LT5kZXZfc3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGZjb2VfZGV2X3N0YXRzKTsKKwlpZiAoIWxwb3J0LT5kZXZfc3RhdHMpCiAJCXJldHVybiAtRU5PTUVNOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmNfbHBvcnRfZnJlZV9zdGF0cyhzdHJ1Y3QgZmNfbHBvcnQgKmxwKQorLyoqCisgKiBmY19scG9ydF9mcmVlX3N0YXRzKCkgLSBGcmVlIG1lbW9yeSBmb3IgYSBsb2NhbCBwb3J0J3Mgc3RhdGlzdGljcworICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB3aG9zZSBzdGF0aXN0aWNzIGFyZSB0byBiZSBmcmVlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmNfbHBvcnRfZnJlZV9zdGF0cyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCWZyZWVfcGVyY3B1KGxwLT5kZXZfc3RhdHMpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBmY29lX2Rldl9zdGF0cyAqZmNfbHBvcnRfZ2V0X3N0YXRzKHN0cnVjdCBmY19scG9ydCAqbHApCi17Ci0JcmV0dXJuIHBlcl9jcHVfcHRyKGxwLT5kZXZfc3RhdHMsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqbHBvcnRfcHJpdihjb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwKQotewotCXJldHVybiAodm9pZCAqKShscCArIDEpOworCWZyZWVfcGVyY3B1KGxwb3J0LT5kZXZfc3RhdHMpOwogfQogCiAvKioKLSAqIGxpYmZjX2hvc3RfYWxsb2MoKSAtIEFsbG9jYXRlIGEgU2NzaV9Ib3N0IHdpdGggcm9vbSBmb3IgdGhlIGZjX2xwb3J0Ci0gKiBAc2h0OiBwdHIgdG8gdGhlIHNjc2kgaG9zdCB0ZW1wbAotICogQHByaXZfc2l6ZTogc2l6ZSBvZiBwcml2YXRlIGRhdGEgYWZ0ZXIgZmNfbHBvcnQKLSAqCi0gKiBSZXR1cm5zOiBwdHIgdG8gU2NzaV9Ib3N0CisgKiBmY19scG9ydF9nZXRfc3RhdHMoKSAtIEdldCBhIGxvY2FsIHBvcnQncyBzdGF0aXN0aWNzCisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHdob3NlIHN0YXRpc3RpY3MgYXJlIHRvIGJlIHJldHJlaXZlZAogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKgorc3RhdGljIGlubGluZSBzdHJ1Y3QgZmNvZV9kZXZfc3RhdHMgKmZjX2xwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXJldHVybiBwZXJfY3B1X3B0cihscG9ydC0+ZGV2X3N0YXRzLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCisvKioKKyAqIGxwb3J0X3ByaXYoKSAtIFJldHVybiB0aGUgcHJpdmF0ZSBkYXRhIGZyb20gYSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHdob3NlIHByaXZhdGUgZGF0YSBpcyB0byBiZSByZXRyZWl2ZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkICpscG9ydF9wcml2KGNvbnN0IHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJcmV0dXJuICh2b2lkICopKGxwb3J0ICsgMSk7Cit9CisKKy8qKgorICogbGliZmNfaG9zdF9hbGxvYygpIC0gQWxsb2NhdGUgYSBTY3NpX0hvc3Qgd2l0aCByb29tIGZvciBhIGxvY2FsIHBvcnQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBMTEQgcHJpdmF0ZSBkYXRhCisgKiBAc2h0OiAgICAgICBUaGUgU0NTSSBob3N0IHRlbXBsYXRlCisgKiBAcHJpdl9zaXplOiBTaXplIG9mIHByaXZhdGUgZGF0YQorICoKKyAqIFJldHVybnM6IGxpYmZjIGxwb3J0CisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZjX2xwb3J0ICoKIGxpYmZjX2hvc3RfYWxsb2Moc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCBpbnQgcHJpdl9zaXplKQogewotCXJldHVybiBzY3NpX2hvc3RfYWxsb2Moc2h0LCBzaXplb2Yoc3RydWN0IGZjX2xwb3J0KSArIHByaXZfc2l6ZSk7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHNodCwgc2l6ZW9mKCpscG9ydCkgKyBwcml2X3NpemUpOworCWlmICghc2hvc3QpCisJCXJldHVybiBOVUxMOworCWxwb3J0ID0gc2hvc3RfcHJpdihzaG9zdCk7CisJbHBvcnQtPmhvc3QgPSBzaG9zdDsKKwlJTklUX0xJU1RfSEVBRCgmbHBvcnQtPmVtYV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbHBvcnQtPnZwb3J0cyk7CisJcmV0dXJuIGxwb3J0OworfQorCisvKgorICogRkNfRkNQIEhFTFBFUiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBmY19mY3BfaXNfcmVhZChjb25zdCBzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQoreworCWlmIChmc3AgJiYgZnNwLT5jbWQpCisJCXJldHVybiBmc3AtPmNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFOworCXJldHVybiBmYWxzZTsKIH0KIAogLyoKICAqIExPQ0FMIFBPUlQgTEFZRVIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmY19scG9ydF9pbml0KHN0cnVjdCBmY19scG9ydCAqbHApOwotCi0vKgotICogRGVzdHJveSB0aGUgc3BlY2lmaWVkIGxvY2FsIHBvcnQgYnkgZmluZGluZyBhbmQgZnJlZWluZyBhbGwKLSAqIGZjX3Jwb3J0cyBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIHRoZW4gYnkgZnJlZWluZyB0aGUgZmNfbHBvcnQKLSAqIGl0c2VsZi4KLSAqLwotaW50IGZjX2xwb3J0X2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscCk7Ci0KLS8qCi0gKiBMb2dvdXQgdGhlIHNwZWNpZmllZCBsb2NhbCBwb3J0IGZyb20gdGhlIGZhYnJpYwotICovCi1pbnQgZmNfZmFicmljX2xvZ29mZihzdHJ1Y3QgZmNfbHBvcnQgKmxwKTsKLQotLyoKLSAqIEluaXRpYXRlIHRoZSBMUCBzdGF0ZSBtYWNoaW5lLiBUaGlzIGhhbmRsZXIgd2lsbCB1c2UgZmNfaG9zdF9hdHRyCi0gKiB0byBzdG9yZSB0aGUgRkxPR0kgc2VydmljZSBwYXJhbWV0ZXJzLCBzbyBmY19ob3N0X2F0dHIgbXVzdCBiZQotICogaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBoYW5kbGVyLgotICovCi1pbnQgZmNfZmFicmljX2xvZ2luKHN0cnVjdCBmY19scG9ydCAqbHApOwotCi0vKgotICogVGhlIGxpbmsgaXMgdXAgZm9yIHRoZSBnaXZlbiBsb2NhbCBwb3J0LgotICovCitpbnQgZmNfbHBvcnRfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKik7CitpbnQgZmNfbHBvcnRfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKik7CitpbnQgZmNfZmFicmljX2xvZ29mZihzdHJ1Y3QgZmNfbHBvcnQgKik7CitpbnQgZmNfZmFicmljX2xvZ2luKHN0cnVjdCBmY19scG9ydCAqKTsKK3ZvaWQgX19mY19saW5rdXAoc3RydWN0IGZjX2xwb3J0ICopOwogdm9pZCBmY19saW5rdXAoc3RydWN0IGZjX2xwb3J0ICopOwotCi0vKgotICogTGluayBpcyBkb3duIGZvciB0aGUgZ2l2ZW4gbG9jYWwgcG9ydC4KLSAqLwordm9pZCBfX2ZjX2xpbmtkb3duKHN0cnVjdCBmY19scG9ydCAqKTsKIHZvaWQgZmNfbGlua2Rvd24oc3RydWN0IGZjX2xwb3J0ICopOwotCi0vKgotICogQ29uZmlndXJlIHRoZSBsb2NhbCBwb3J0LgotICovCit2b2lkIGZjX3Zwb3J0X3NldGxpbmsoc3RydWN0IGZjX2xwb3J0ICopOwordm9pZCBmY192cG9ydHNfbGlua2NoYW5nZShzdHJ1Y3QgZmNfbHBvcnQgKik7CiBpbnQgZmNfbHBvcnRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqKTsKLQotLyoKLSAqIFJlc2V0IHRoZSBsb2NhbCBwb3J0LgotICovCiBpbnQgZmNfbHBvcnRfcmVzZXQoc3RydWN0IGZjX2xwb3J0ICopOwotCi0vKgotICogU2V0IHRoZSBtZnMgb3IgcmVzZXQKLSAqLwotaW50IGZjX3NldF9tZnMoc3RydWN0IGZjX2xwb3J0ICpscCwgdTMyIG1mcyk7Ci0KK2ludCBmY19zZXRfbWZzKHN0cnVjdCBmY19scG9ydCAqLCB1MzIgbWZzKTsKK3N0cnVjdCBmY19scG9ydCAqbGliZmNfdnBvcnRfY3JlYXRlKHN0cnVjdCBmY192cG9ydCAqLCBpbnQgcHJpdnNpemUpOworc3RydWN0IGZjX2xwb3J0ICpmY192cG9ydF9pZF9sb29rdXAoc3RydWN0IGZjX2xwb3J0ICosIHUzMiBwb3J0X2lkKTsKK2ludCBmY19scG9ydF9ic2dfcmVxdWVzdChzdHJ1Y3QgZmNfYnNnX2pvYiAqKTsKIAogLyoKICAqIFJFTU9URSBQT1JUIExBWUVSCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmNfcnBvcnRfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKmxwKTsKLXZvaWQgZmNfcnBvcnRfdGVybWluYXRlX2lvKHN0cnVjdCBmY19ycG9ydCAqcnApOworaW50IGZjX3Jwb3J0X2luaXQoc3RydWN0IGZjX2xwb3J0ICopOwordm9pZCBmY19ycG9ydF90ZXJtaW5hdGVfaW8oc3RydWN0IGZjX3Jwb3J0ICopOwogCiAvKgogICogRElTQ09WRVJZIExBWUVSCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmNfZGlzY19pbml0KHN0cnVjdCBmY19scG9ydCAqbHApOwotCitpbnQgZmNfZGlzY19pbml0KHN0cnVjdCBmY19scG9ydCAqKTsKIAogLyoKLSAqIFNDU0kgTEFZRVIKKyAqIEZDUCBMQVlFUgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEluaXRpYWxpemUgdGhlIFNDU0kgYmxvY2sgb2YgbGliZmMKLSAqLwogaW50IGZjX2ZjcF9pbml0KHN0cnVjdCBmY19scG9ydCAqKTsKLQotLyoKLSAqIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBhbiBBUEkgd2hpY2ggYWxsb3dzIGRpcmVjdCBpbnRlcmFjdGlvbgotICogd2l0aCB0aGUgU0NTSS1tbC4gRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgc2F0aXNmaWVzIGEgZnVuY3Rpb24KLSAqIHBvaW50ZXIgZGVmaW5lZCBpbiBTY3NpX0hvc3QgYW5kIHRoZXJlZm9yZSBpcyBhbHdheXMgY2FsbGVkCi0gKiBkaXJlY3RseSBmcm9tIHRoZSBTQ1NJLW1sLgotICovCi1pbnQgZmNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCwKLQkJICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKLQotLyoKLSAqIGNvbXBsZXRlIHByb2Nlc3Npbmcgb2YgYSBmY3AgcGFja2V0Ci0gKgotICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgaWYgYSBmc3AgdGltZXIgaXMgcGVuZGluZy4KLSAqIFRoZSBob3N0IGxvY2sgbXVzdCBub3QgYmUgaGVsZCBieSBjYWxsZXIuCi0gKi8KLXZvaWQgZmNfZmNwX2NvbXBsZXRlKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApOwotCi0vKgotICogU2VuZCBhbiBBQlRTIGZyYW1lIHRvIHRoZSB0YXJnZXQgZGV2aWNlLiBUaGUgc2NfY21kIGFyZ3VtZW50Ci0gKiBpcyBhIHBvaW50ZXIgdG8gdGhlIFNDU0kgY29tbWFuZCB0byBiZSBhYm9ydGVkLgotICovCi1pbnQgZmNfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKTsKLQotLyoKLSAqIFJlc2V0IGEgTFVOIGJ5IHNlbmRpbmcgc2VuZCB0aGUgdG0gY21kIHRvIHRoZSB0YXJnZXQuCi0gKi8KLWludCBmY19laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKTsKLQotLyoKLSAqIFJlc2V0IHRoZSBob3N0IGFkYXB0ZXIuCi0gKi8KLWludCBmY19laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCk7Ci0KLS8qCi0gKiBDaGVjayBycG9ydCBzdGF0dXMuCi0gKi8KLWludCBmY19zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwotCi0vKgotICogQWRqdXN0IHRoZSBxdWV1ZSBkZXB0aC4KLSAqLwotaW50IGZjX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgpOwotCi0vKgotICogQ2hhbmdlIHRoZSB0YWcgdHlwZS4KLSAqLwotaW50IGZjX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHRhZ190eXBlKTsKLQotLyoKLSAqIEZyZWUgbWVtb3J5IHBvb2xzIHVzZWQgYnkgdGhlIEZDUCBsYXllci4KLSAqLwogdm9pZCBmY19mY3BfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKik7CiAKIC8qCi0gKiBTZXQgdXAgZGlyZWN0LWRhdGEgcGxhY2VtZW50IGZvciB0aGlzIEkvTyByZXF1ZXN0Ci0gKi8KLXZvaWQgZmNfZmNwX2RkcF9zZXR1cChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCB1MTYgeGlkKTsKKyAqIFNDU0kgSU5URVJBQ1RJT04gTEFZRVIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmY19xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLAorCQkgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworaW50IGZjX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitpbnQgZmNfZWhfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitpbnQgZmNfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworaW50IGZjX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKK2ludCBmY19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICosIGludCBxZGVwdGgsIGludCByZWFzb24pOworaW50IGZjX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqLCBpbnQgdGFnX3R5cGUpOwogCiAvKgogICogRUxTL0NUIGludGVyZmFjZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEluaXRpYWxpemVzIEVMUy9DVCBpbnRlcmZhY2UKLSAqLwotaW50IGZjX2Vsc2N0X2luaXQoc3RydWN0IGZjX2xwb3J0ICpscCk7CitpbnQgZmNfZWxzY3RfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKik7CitzdHJ1Y3QgZmNfc2VxICpmY19lbHNjdF9zZW5kKHN0cnVjdCBmY19scG9ydCAqLCB1MzIgZGlkLAorCQkJCSAgICBzdHJ1Y3QgZmNfZnJhbWUgKiwKKwkJCQkgICAgdW5zaWduZWQgaW50IG9wLAorCQkJCSAgICB2b2lkICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLAorCQkJCQkJIHN0cnVjdCBmY19mcmFtZSAqLAorCQkJCQkJIHZvaWQgKmFyZyksCisJCQkJICAgIHZvaWQgKmFyZywgdTMyIHRpbWVyX21zZWMpOwordm9pZCBmY19scG9ydF9mbG9naV9yZXNwKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosIHZvaWQgKik7Cit2b2lkIGZjX2xwb3J0X2xvZ29fcmVzcChzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqLCB2b2lkICopOwogCiAKIC8qCiAgKiBFWENIQU5HRSBNQU5BR0VSIExBWUVSCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogSW5pdGlhbGl6ZXMgRXhjaGFuZ2UgTWFuYWdlciByZWxhdGVkCi0gKiBmdW5jdGlvbiBwb2ludGVycyBpbiBzdHJ1Y3QgbGliZmNfZnVuY3Rpb25fdGVtcGxhdGUuCi0gKi8KLWludCBmY19leGNoX2luaXQoc3RydWN0IGZjX2xwb3J0ICpscCk7Ci0KLS8qCi0gKiBBZGRzIEV4Y2hhbmdlIE1hbmFnZXIgKEVNKSBtcCB0byBscG9ydC4KLSAqCi0gKiBBZGRzIHNwZWNpZmllZCBtcCB0byBscG9ydCB1c2luZyBzdHJ1Y3QgZmNfZXhjaF9tZ3JfYW5jaG9yLAotICogdGhlIHN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgYWxsb3dzIHNhbWUgRU0gc2hhcmluZyBieQotICogbW9yZSB0aGFuIG9uZSBscG9ydCB3aXRoIHRoZWlyIHNwZWNpZmllZCBtYXRjaCBmdW5jdGlvbiwKLSAqIHRoZSBtYXRjaCBmdW5jdGlvbiBpcyB1c2VkIGluIGFsbG9jYXRpbmcgZXhjaGFuZ2UgZnJvbQotICogYWRkZWQgbXAuCi0gKi8KLXN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgKmZjX2V4Y2hfbWdyX2FkZChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAotCQkJCQkgICBzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm1wLAoraW50IGZjX2V4Y2hfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKik7CitzdHJ1Y3QgZmNfZXhjaF9tZ3JfYW5jaG9yICpmY19leGNoX21ncl9hZGQoc3RydWN0IGZjX2xwb3J0ICosCisJCQkJCSAgIHN0cnVjdCBmY19leGNoX21nciAqLAogCQkJCQkgICBib29sICgqbWF0Y2gpKHN0cnVjdCBmY19mcmFtZSAqKSk7Ci0KLS8qCi0gKiBEZWxldGVzIEV4Y2hhbmdlIE1hbmFnZXIgKEVNKSBmcm9tIGxwb3J0IGJ5IHJlbW92aW5nCi0gKiBpdHMgYW5jaG9yIGVtYSBmcm9tIGxwb3J0LgotICoKLSAqIElmIHJlbW92ZWQgYW5jaG9yIGVtYSB3YXMgdGhlIGxhc3QgdXNlciBvZiBpdHMgYXNzb2NpYXRlZCBFTQotICogdGhlbiBhbHNvIGRlc3Ryb3lzIGFzc29jaWF0ZWQgRU0uCi0gKi8KLXZvaWQgZmNfZXhjaF9tZ3JfZGVsKHN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgKmVtYSk7Ci0KLS8qCi0gKiBBbGxvY2F0ZXMgYW4gRXhjaGFuZ2UgTWFuYWdlciAoRU0pLgotICoKLSAqIFRoZSBFTSBtYW5hZ2VzIGV4Y2hhbmdlcyBmb3IgdGhlaXIgYWxsb2NhdGlvbiBhbmQKLSAqIGZyZWUsIGFsc28gYWxsb3dzIGV4Y2hhbmdlIGxvb2t1cCBmb3IgcmVjZWl2ZWQKLSAqIGZyYW1lLgotICoKLSAqIFRoZSBjbGFzcyBpcyB1c2VkIGZvciBpbml0aWFsaXppbmcgRkMgY2xhc3Mgb2YKLSAqIGFsbG9jYXRlZCBleGNoYW5nZSBmcm9tIEVNLgotICoKLSAqIFRoZSBtaW5feGlkIGFuZCBtYXhfeGlkIHdpbGwgbGltaXQgbmV3Ci0gKiBleGNoYW5nZSBJRCAoWElEKSB3aXRoaW4gdGhpcyByYW5nZSBmb3IKLSAqIGEgbmV3IGV4Y2hhbmdlLgotICogVGhlIExMRCBtYXkgY2hvb3NlIHRvIGhhdmUgbXVsdGlwbGUgRU1zLAotICogZS5nLiBvbmUgRU0gaW5zdGFuY2UgcGVyIENQVSByZWNlaXZlIHRocmVhZCBpbiBMTEQuCi0gKgotICogU3BlY2lmaWVkIG1hdGNoIGZ1bmN0aW9uIGlzIHVzZWQgaW4gYWxsb2NhdGluZyBleGNoYW5nZXMKLSAqIGZyb20gbmV3bHkgYWxsb2NhdGVkIEVNLgotICovCi1zdHJ1Y3QgZmNfZXhjaF9tZ3IgKmZjX2V4Y2hfbWdyX2FsbG9jKHN0cnVjdCBmY19scG9ydCAqbHAsCi0JCQkJICAgICAgZW51bSBmY19jbGFzcyBjbGFzcywKLQkJCQkgICAgICB1MTYgbWluX3hpZCwKLQkJCQkgICAgICB1MTYgbWF4X3hpZCwKK3ZvaWQgZmNfZXhjaF9tZ3JfZGVsKHN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgKik7CitpbnQgZmNfZXhjaF9tZ3JfbGlzdF9jbG9uZShzdHJ1Y3QgZmNfbHBvcnQgKnNyYywgc3RydWN0IGZjX2xwb3J0ICpkc3QpOworc3RydWN0IGZjX2V4Y2hfbWdyICpmY19leGNoX21ncl9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKiwgZW51bSBmY19jbGFzcyBjbGFzcywKKwkJCQkgICAgICB1MTYgbWluX3hpZCwgdTE2IG1heF94aWQsCiAJCQkJICAgICAgYm9vbCAoKm1hdGNoKShzdHJ1Y3QgZmNfZnJhbWUgKikpOwotCi0vKgotICogRnJlZSBhbGwgZXhjaGFuZ2UgbWFuYWdlcnMgb2YgYSBscG9ydC4KLSAqLwotdm9pZCBmY19leGNoX21ncl9mcmVlKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpOwotCi0vKgotICogUmVjZWl2ZSBhIGZyYW1lIG9uIHNwZWNpZmllZCBsb2NhbCBwb3J0IGFuZCBleGNoYW5nZSBtYW5hZ2VyLgotICovCi12b2lkIGZjX2V4Y2hfcmVjdihzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIGV4Y2hfc2VxX3NlbmQgZnVuY3Rpb24gcG9pbnRlciBpbgotICogc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlLCBzZWUgY29tbWVudCBibG9jayBvbgotICogZXhjaF9zZXFfc2VuZCBmb3IgZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4KLSAqLwotc3RydWN0IGZjX3NlcSAqZmNfZXhjaF9zZXFfc2VuZChzdHJ1Y3QgZmNfbHBvcnQgKmxwLAotCQkJCXN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKnNwLAotCQkJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJCSAgICAgdm9pZCAqYXJnKSwKLQkJCQl2b2lkICgqZGVzdHJ1Y3Rvcikoc3RydWN0IGZjX3NlcSAqc3AsCi0JCQkJCQkgICB2b2lkICphcmcpLAotCQkJCXZvaWQgKmFyZywgdTMyIHRpbWVyX21zZWMpOwotCi0vKgotICogc2VuZCBhIGZyYW1lIHVzaW5nIGV4aXN0aW5nIHNlcXVlbmNlIGFuZCBleGNoYW5nZS4KLSAqLwotaW50IGZjX3NlcV9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKLQotLyoKLSAqIFNlbmQgRUxTIHJlc3BvbnNlIHVzaW5nIG1haW5seSBpbmZvbWF0aW9uCi0gKiBpbiBleGNoYW5nZSBhbmQgc2VxdWVuY2UgaW4gRU0gbGF5ZXIuCi0gKi8KLXZvaWQgZmNfc2VxX2Vsc19yc3Bfc2VuZChzdHJ1Y3QgZmNfc2VxICpzcCwgZW51bSBmY19lbHNfY21kIGVsc19jbWQsCi0JCQkgc3RydWN0IGZjX3NlcV9lbHNfZGF0YSAqZWxzX2RhdGEpOwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBmb3Igc2VxX2V4Y2hfYWJvcnQgZnVuY3Rpb24gcG9pbnRlciBpbgotICogc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlLCBzZWUgY29tbWVudCBibG9jayBvbgotICogc2VxX2V4Y2hfYWJvcnQgZm9yIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24uCi0gKi8KLWludCBmY19zZXFfZXhjaF9hYm9ydChjb25zdCBzdHJ1Y3QgZmNfc2VxICpyZXFfc3AsIHVuc2lnbmVkIGludCB0aW1lcl9tc2VjKTsKLQotLyoKLSAqIEluZGljYXRlIHRoYXQgYW4gZXhjaGFuZ2Uvc2VxdWVuY2UgdHVwbGUgaXMgY29tcGxldGUgYW5kIHRoZSBtZW1vcnkKLSAqIGFsbG9jYXRlZCBmb3IgdGhlIHJlbGF0ZWQgb2JqZWN0cyBtYXkgYmUgZnJlZWQuCi0gKi8KLXZvaWQgZmNfZXhjaF9kb25lKHN0cnVjdCBmY19zZXEgKnNwKTsKLQotLyoKLSAqIEFsbG9jYXRlIGEgbmV3IGV4Y2hhbmdlIGFuZCBzZXF1ZW5jZSBwYWlyLgotICovCi1zdHJ1Y3QgZmNfZXhjaCAqZmNfZXhjaF9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKLS8qCi0gKiBTdGFydCBhIG5ldyBzZXF1ZW5jZSBvbiB0aGUgc2FtZSBleGNoYW5nZSBhcyB0aGUgc3VwcGxpZWQgc2VxdWVuY2UuCi0gKi8KLXN0cnVjdCBmY19zZXEgKmZjX3NlcV9zdGFydF9uZXh0KHN0cnVjdCBmY19zZXEgKnNwKTsKLQotCi0vKgotICogUmVzZXQgYWxsIEVNcyBvZiBhIGxwb3J0LCByZWxlYXNpbmcgaXRzIGFsbCBzZXF1ZW5jZXMgYW5kCi0gKiBleGNoYW5nZXMuIElmIHNpZCBpcyBub24temVybywgdGhlbiByZXNldCBvbmx5IGV4Y2hhbmdlcwotICogd2Ugc291cmNlZCBmcm9tIHRoYXQgRklELiBJZiBkaWQgaXMgbm9uLXplcm8sIHJlc2V0IG9ubHkKLSAqIGV4Y2hhbmdlcyBkZXN0aW5lZCB0byB0aGF0IEZJRC4KLSAqLwordm9pZCBmY19leGNoX21ncl9mcmVlKHN0cnVjdCBmY19scG9ydCAqKTsKK3ZvaWQgZmNfZXhjaF9yZWN2KHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CiB2b2lkIGZjX2V4Y2hfbWdyX3Jlc2V0KHN0cnVjdCBmY19scG9ydCAqLCB1MzIgc19pZCwgdTMyIGRfaWQpOwogCiAvKgogICogRnVuY3Rpb25zIGZvciBmY19mdW5jdGlvbnNfdGVtcGxhdGUKICAqLwotdm9pZCBmY19nZXRfaG9zdF9zcGVlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7Ci12b2lkIGZjX2dldF9ob3N0X3BvcnRfdHlwZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7Ci12b2lkIGZjX2dldF9ob3N0X3BvcnRfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwotdm9pZCBmY19zZXRfcnBvcnRfbG9zc190bW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgdTMyIHRpbWVvdXQpOwordm9pZCBmY19nZXRfaG9zdF9zcGVlZChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwordm9pZCBmY19nZXRfaG9zdF9wb3J0X3R5cGUoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3ZvaWQgZmNfZ2V0X2hvc3RfcG9ydF9zdGF0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOwordm9pZCBmY19zZXRfcnBvcnRfbG9zc190bW8oc3RydWN0IGZjX3Jwb3J0ICosIHUzMiB0aW1lb3V0KTsKIHN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgKmZjX2dldF9ob3N0X3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKik7CiAKLS8qCi0gKiBtb2R1bGUgc2V0dXAgZnVuY3Rpb25zLgotICovCi1pbnQgZmNfc2V0dXBfZXhjaF9tZ3Iodm9pZCk7Ci12b2lkIGZjX2Rlc3Ryb3lfZXhjaF9tZ3Iodm9pZCk7Ci1pbnQgZmNfc2V0dXBfcnBvcnQodm9pZCk7Ci12b2lkIGZjX2Rlc3Ryb3lfcnBvcnQodm9pZCk7Ci0KLS8qCi0gKiBJbnRlcm5hbCBsaWJmYyBmdW5jdGlvbnMuCi0gKi8KLWNvbnN0IGNoYXIgKmZjX2Vsc19yZXNwX3R5cGUoc3RydWN0IGZjX2ZyYW1lICopOwotCiAjZW5kaWYgLyogX0xJQkZDX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oIGIvaW5jbHVkZS9zY3NpL2xpYmZjb2UuaAppbmRleCBiMjQxMDYwLi5jNjAzZjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJmY29lLmgKQEAgLTUzLDMzICs1MywzNiBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgZmNvZV9jdGxyIC0gRkNvRSBDb250cm9sbGVyIGFuZCBGSVAgc3RhdGUuCi0gKiBAc3RhdGU6CWludGVybmFsIEZJUCBzdGF0ZSBmb3IgbmV0d29yayBsaW5rIGFuZCBGSVAgb3Igbm9uLUZJUCBtb2RlLgotICogQGxwOgkJJmZjX2xwb3J0OiBsaWJmYyBsb2NhbCBwb3J0LgotICogQHNlbF9mY2Y6CWN1cnJlbnRseSBzZWxlY3RlZCBGQ0YsIG9yIE5VTEwuCi0gKiBAZmNmczoJbGlzdCBvZiBkaXNjb3ZlcmVkIEZDRnMuCi0gKiBAZmNmX2NvdW50OgludW1iZXIgb2YgZGlzY292ZXJlZCBGQ0YgZW50cmllcy4KLSAqIEBzb2xfdGltZToJdGltZSB3aGVuIGEgbXVsdGljYXN0IHNvbGljaXRhdGlvbiB3YXMgbGFzdCBzZW50LgotICogQHNlbF90aW1lOgl0aW1lIGFmdGVyIHdoaWNoIHRvIHNlbGVjdCBhbiBGQ0YuCi0gKiBAcG9ydF9rYV90aW1lOiB0aW1lIG9mIG5leHQgcG9ydCBrZWVwLWFsaXZlLgotICogQGN0bHJfa2FfdGltZTogdGltZSBvZiBuZXh0IGNvbnRyb2xsZXIga2VlcC1hbGl2ZS4KLSAqIEB0aW1lcjoJdGltZXIgc3RydWN0IHVzZWQgZm9yIGFsbCBkZWxheWVkIGV2ZW50cy4KLSAqIEBsaW5rX3dvcms6CSZ3b3JrX3N0cnVjdCBmb3IgZG9pbmcgRkNGIHNlbGVjdGlvbi4KLSAqIEByZWN2X3dvcms6CSZ3b3JrX3N0cnVjdCBmb3IgcmVjZWl2aW5nIEZJUCBmcmFtZXMuCisgKiBzdHJ1Y3QgZmNvZV9jdGxyIC0gRkNvRSBDb250cm9sbGVyIGFuZCBGSVAgc3RhdGUKKyAqIEBzdGF0ZToJICAgaW50ZXJuYWwgRklQIHN0YXRlIGZvciBuZXR3b3JrIGxpbmsgYW5kIEZJUCBvciBub24tRklQIG1vZGUuCisgKiBAbW9kZToJICAgTExELXNlbGVjdGVkIG1vZGUuCisgKiBAbHA6CQkgICAmZmNfbHBvcnQ6IGxpYmZjIGxvY2FsIHBvcnQuCisgKiBAc2VsX2ZjZjoJICAgY3VycmVudGx5IHNlbGVjdGVkIEZDRiwgb3IgTlVMTC4KKyAqIEBmY2ZzOgkgICBsaXN0IG9mIGRpc2NvdmVyZWQgRkNGcy4KKyAqIEBmY2ZfY291bnQ6CSAgIG51bWJlciBvZiBkaXNjb3ZlcmVkIEZDRiBlbnRyaWVzLgorICogQHNvbF90aW1lOgkgICB0aW1lIHdoZW4gYSBtdWx0aWNhc3Qgc29saWNpdGF0aW9uIHdhcyBsYXN0IHNlbnQuCisgKiBAc2VsX3RpbWU6CSAgIHRpbWUgYWZ0ZXIgd2hpY2ggdG8gc2VsZWN0IGFuIEZDRi4KKyAqIEBwb3J0X2thX3RpbWU6ICB0aW1lIG9mIG5leHQgcG9ydCBrZWVwLWFsaXZlLgorICogQGN0bHJfa2FfdGltZTogIHRpbWUgb2YgbmV4dCBjb250cm9sbGVyIGtlZXAtYWxpdmUuCisgKiBAdGltZXI6CSAgIHRpbWVyIHN0cnVjdCB1c2VkIGZvciBhbGwgZGVsYXllZCBldmVudHMuCisgKiBAbGlua193b3JrOgkgICAmd29ya19zdHJ1Y3QgZm9yIGRvaW5nIEZDRiBzZWxlY3Rpb24uCisgKiBAcmVjdl93b3JrOgkgICAmd29ya19zdHJ1Y3QgZm9yIHJlY2VpdmluZyBGSVAgZnJhbWVzLgogICogQGZpcF9yZWN2X2xpc3Q6IGxpc3Qgb2YgcmVjZWl2ZWQgRklQIGZyYW1lcy4KLSAqIEB1c2VyX21mczoJY29uZmlndXJlZCBtYXhpbXVtIEZDIGZyYW1lIHNpemUsIGluY2x1ZGluZyBGQyBoZWFkZXIuCi0gKiBAZmxvZ2lfb3hpZDogZXhjaGFuZ2UgSUQgb2YgbW9zdCByZWNlbnQgZmFicmljIGxvZ2luLgotICogQGZsb2dpX2NvdW50OiBudW1iZXIgb2YgRkxPR0kgYXR0ZW1wdHMgaW4gQVVUTyBtb2RlLgotICogQGxpbms6CWN1cnJlbnQgbGluayBzdGF0dXMgZm9yIGxpYmZjLgotICogQGxhc3RfbGluazoJbGFzdCBsaW5rIHN0YXRlIHJlcG9ydGVkIHRvIGxpYmZjLgotICogQG1hcF9kZXN0Ogl1c2UgdGhlIEZDX01BUCBtb2RlIGZvciBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzLgotICogQHNwbWE6CXN1cHBvcnRzIFNQTUEgc2VydmVyLXByb3ZpZGVkIE1BQ3MgbW9kZQotICogQGRlc3RfYWRkcjoJTUFDIGFkZHJlc3Mgb2YgdGhlIHNlbGVjdGVkIEZDIGZvcndhcmRlci4KLSAqIEBjdGxfc3JjX2FkZHI6IHRoZSBuYXRpdmUgTUFDIGFkZHJlc3Mgb2Ygb3VyIGxvY2FsIHBvcnQuCi0gKiBAZGF0YV9zcmNfYWRkcjogdGhlIGFzc2lnbmVkIE1BQyBhZGRyZXNzIGZvciB0aGUgbG9jYWwgcG9ydCBhZnRlciBGTE9HSS4KLSAqIEBzZW5kOglMTEQtc3VwcGxpZWQgZnVuY3Rpb24gdG8gaGFuZGxlIHNlbmRpbmcgb2YgRklQIEV0aGVybmV0IGZyYW1lcy4KLSAqIEB1cGRhdGVfbWFjOiBMTEQtc3VwcGxpZWQgZnVuY3Rpb24gdG8gaGFuZGxlIGNoYW5nZXMgdG8gTUFDIGFkZHJlc3Nlcy4KLSAqIEBsb2NrOglsb2NrIHByb3RlY3RpbmcgdGhpcyBzdHJ1Y3R1cmUuCisgKiBAdXNlcl9tZnM6CSAgIGNvbmZpZ3VyZWQgbWF4aW11bSBGQyBmcmFtZSBzaXplLCBpbmNsdWRpbmcgRkMgaGVhZGVyLgorICogQGZsb2dpX294aWQ6ICAgIGV4Y2hhbmdlIElEIG9mIG1vc3QgcmVjZW50IGZhYnJpYyBsb2dpbi4KKyAqIEBmbG9naV9jb3VudDogICBudW1iZXIgb2YgRkxPR0kgYXR0ZW1wdHMgaW4gQVVUTyBtb2RlLgorICogQGxpbms6CSAgIGN1cnJlbnQgbGluayBzdGF0dXMgZm9yIGxpYmZjLgorICogQGxhc3RfbGluazoJICAgbGFzdCBsaW5rIHN0YXRlIHJlcG9ydGVkIHRvIGxpYmZjLgorICogQG1hcF9kZXN0OgkgICB1c2UgdGhlIEZDX01BUCBtb2RlIGZvciBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzc2VzLgorICogQHNwbWE6CSAgIHN1cHBvcnRzIFNQTUEgc2VydmVyLXByb3ZpZGVkIE1BQ3MgbW9kZQorICogQHNlbmRfY3Rscl9rYTogIG5lZWQgdG8gc2VuZCBjb250cm9sbGVyIGtlZXAgYWxpdmUKKyAqIEBzZW5kX3BvcnRfa2E6ICBuZWVkIHRvIHNlbmQgcG9ydCBrZWVwIGFsaXZlcworICogQGRlc3RfYWRkcjoJICAgTUFDIGFkZHJlc3Mgb2YgdGhlIHNlbGVjdGVkIEZDIGZvcndhcmRlci4KKyAqIEBjdGxfc3JjX2FkZHI6ICB0aGUgbmF0aXZlIE1BQyBhZGRyZXNzIG9mIG91ciBsb2NhbCBwb3J0LgorICogQHNlbmQ6CSAgIExMRC1zdXBwbGllZCBmdW5jdGlvbiB0byBoYW5kbGUgc2VuZGluZyBGSVAgRXRoZXJuZXQgZnJhbWVzCisgKiBAdXBkYXRlX21hYzogICAgTExELXN1cHBsaWVkIGZ1bmN0aW9uIHRvIGhhbmRsZSBjaGFuZ2VzIHRvIE1BQyBhZGRyZXNzZXMuCisgKiBAZ2V0X3NyY19hZGRyOiAgTExELXN1cHBsaWVkIGZ1bmN0aW9uIHRvIHN1cHBseSBhIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyAqIEBsb2NrOgkgICBsb2NrIHByb3RlY3RpbmcgdGhpcyBzdHJ1Y3R1cmUuCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSBhbGwgRkNvRSBkcml2ZXJzLiAgSXQgY29udGFpbnMgaW5mb3JtYXRpb24KICAqIG5lZWRlZCBieSBhbGwgRkNvRSBsb3ctbGV2ZWwgZHJpdmVycyAoTExEcykgYXMgd2VsbCBhcyBpbnRlcm5hbCBzdGF0ZQpAQCAtODcsNiArOTAsNyBAQAogICovCiBzdHJ1Y3QgZmNvZV9jdGxyIHsKIAllbnVtIGZpcF9zdGF0ZSBzdGF0ZTsKKwllbnVtIGZpcF9zdGF0ZSBtb2RlOwogCXN0cnVjdCBmY19scG9ydCAqbHA7CiAJc3RydWN0IGZjb2VfZmNmICpzZWxfZmNmOwogCXN0cnVjdCBsaXN0X2hlYWQgZmNmczsKQEAgLTEwNCwyOSArMTA4LDMyIEBACiAJdTggZmxvZ2lfY291bnQ7CiAJdTggbGluazsKIAl1OCBsYXN0X2xpbms7CisJdTggcmVzZXRfcmVxOwogCXU4IG1hcF9kZXN0OwogCXU4IHNwbWE7CisJdTggc2VuZF9jdGxyX2thOworCXU4IHNlbmRfcG9ydF9rYTsKIAl1OCBkZXN0X2FkZHJbRVRIX0FMRU5dOwogCXU4IGN0bF9zcmNfYWRkcltFVEhfQUxFTl07Ci0JdTggZGF0YV9zcmNfYWRkcltFVEhfQUxFTl07CiAKIAl2b2lkICgqc2VuZCkoc3RydWN0IGZjb2VfY3RsciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLQl2b2lkICgqdXBkYXRlX21hYykoc3RydWN0IGZjb2VfY3RsciAqLCB1OCAqb2xkLCB1OCAqbmV3KTsKKwl2b2lkICgqdXBkYXRlX21hYykoc3RydWN0IGZjX2xwb3J0ICosIHU4ICphZGRyKTsKKwl1OCAqICgqZ2V0X3NyY19hZGRyKShzdHJ1Y3QgZmNfbHBvcnQgKik7CiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotLyoKLSAqIHN0cnVjdCBmY29lX2ZjZiAtIEZpYnJlLUNoYW5uZWwgRm9yd2FyZGVyLgotICogQGxpc3Q6CWxpc3QgbGlua2FnZS4KLSAqIEB0aW1lOglzeXN0ZW0gdGltZSAoamlmZmllcykgd2hlbiBhbiBhZHZlcnRpc2VtZW50IHdhcyBsYXN0IHJlY2VpdmVkLgotICogQHN3aXRjaF9uYW1lOiBXV04gb2Ygc3dpdGNoIGZyb20gYWR2ZXJ0aXNlbWVudC4KLSAqIEBmYWJyaWNfbmFtZTogV1dOIG9mIGZhYnJpYyBmcm9tIGFkdmVydGlzZW1lbnQuCi0gKiBAZmNfbWFwOglGQ19NQVAgdmFsdWUgZnJvbSBhZHZlcnRpc2VtZW50LgotICogQGZjZl9tYWM6CUV0aGVybmV0IGFkZHJlc3Mgb2YgdGhlIEZDRi4KLSAqIEB2ZmlkOgl2aXJ0dWFsIGZhYnJpYyBJRC4KLSAqIEBwcmk6CXNlbGV0aW9uIHByaW9yaXR5LCBzbWFsbGVyIHZhbHVlcyBhcmUgYmV0dGVyLgotICogQGZsYWdzOglmbGFncyByZWNlaXZlZCBmcm9tIGFkdmVydGlzZW1lbnQuCi0gKiBAZmthX3BlcmlvZDoJa2VlcC1hbGl2ZSBwZXJpb2QsIGluIGppZmZpZXMuCisvKioKKyAqIHN0cnVjdCBmY29lX2ZjZiAtIEZpYnJlLUNoYW5uZWwgRm9yd2FyZGVyCisgKiBAbGlzdDoJIGxpc3QgbGlua2FnZQorICogQHRpbWU6CSBzeXN0ZW0gdGltZSAoamlmZmllcykgd2hlbiBhbiBhZHZlcnRpc2VtZW50IHdhcyBsYXN0IHJlY2VpdmVkCisgKiBAc3dpdGNoX25hbWU6IFdXTiBvZiBzd2l0Y2ggZnJvbSBhZHZlcnRpc2VtZW50CisgKiBAZmFicmljX25hbWU6IFdXTiBvZiBmYWJyaWMgZnJvbSBhZHZlcnRpc2VtZW50CisgKiBAZmNfbWFwOgkgRkNfTUFQIHZhbHVlIGZyb20gYWR2ZXJ0aXNlbWVudAorICogQGZjZl9tYWM6CSBFdGhlcm5ldCBhZGRyZXNzIG9mIHRoZSBGQ0YKKyAqIEB2ZmlkOgkgdmlydHVhbCBmYWJyaWMgSUQKKyAqIEBwcmk6CSBzZWxlY3Rpb24gcHJpb3JpdHksIHNtYWxsZXIgdmFsdWVzIGFyZSBiZXR0ZXIKKyAqIEBmbGFnczoJIGZsYWdzIHJlY2VpdmVkIGZyb20gYWR2ZXJ0aXNlbWVudAorICogQGZrYV9wZXJpb2Q6CSBrZWVwLWFsaXZlIHBlcmlvZCwgaW4gamlmZmllcwogICoKICAqIEEgRmlicmUtQ2hhbm5lbCBGb3J3YXJkZXIgKEZDRikgaXMgdGhlIGVudGl0eSBvbiB0aGUgRXRoZXJuZXQgdGhhdAogICogcGFzc2VzIEZDb0UgZnJhbWVzIG9uIHRvIGFuIEZDIGZhYnJpYy4gIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMKQEAgLTE0OCw2ICsxNTUsNyBAQAogCXU4IHByaTsKIAl1MTYgZmxhZ3M7CiAJdTMyIGZrYV9wZXJpb2Q7CisJdTggZmRfZmxhZ3M6MTsKIH07CiAKIC8qIEZJUCBBUEkgZnVuY3Rpb25zICovCkBAIC0xNTUsOSArMTYzLDEwIEBACiB2b2lkIGZjb2VfY3Rscl9kZXN0cm95KHN0cnVjdCBmY29lX2N0bHIgKik7CiB2b2lkIGZjb2VfY3Rscl9saW5rX3VwKHN0cnVjdCBmY29lX2N0bHIgKik7CiBpbnQgZmNvZV9jdGxyX2xpbmtfZG93bihzdHJ1Y3QgZmNvZV9jdGxyICopOwotaW50IGZjb2VfY3Rscl9lbHNfc2VuZChzdHJ1Y3QgZmNvZV9jdGxyICosIHN0cnVjdCBza19idWZmICopOworaW50IGZjb2VfY3Rscl9lbHNfc2VuZChzdHJ1Y3QgZmNvZV9jdGxyICosIHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHZvaWQgZmNvZV9jdGxyX3JlY3Yoc3RydWN0IGZjb2VfY3RsciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWludCBmY29lX2N0bHJfcmVjdl9mbG9naShzdHJ1Y3QgZmNvZV9jdGxyICosIHN0cnVjdCBmY19mcmFtZSAqZnAsIHU4ICpzYSk7CitpbnQgZmNvZV9jdGxyX3JlY3ZfZmxvZ2koc3RydWN0IGZjb2VfY3RsciAqLCBzdHJ1Y3QgZmNfbHBvcnQgKiwKKwkJCSBzdHJ1Y3QgZmNfZnJhbWUgKik7CiAKIC8qIGxpYmZjb2UgZnVuY3MgKi8KIHU2NCBmY29lX3d3bl9mcm9tX21hYyh1bnNpZ25lZCBjaGFyIG1hY1tdLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaCBiL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oCmluZGV4IGE3MmVkZDQuLjczOTRlM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oCkBAIC0yNjcsNiArMjY3LDcgQEAKIAkvKiBjb25maWd1cmF0aW9uICovCiAJaW50CQkJYWJvcnRfdGltZW91dDsKIAlpbnQJCQlsdV9yZXNldF90aW1lb3V0OworCWludAkJCXRndF9yZXNldF90aW1lb3V0OwogCWludAkJCWluaXRpYWxfcjJ0X2VuOwogCXVuc2lnbmVkCQltYXhfcjJ0OwogCWludAkJCWltbV9kYXRhX2VuOwpAQCAtMzMzLDcgKzMzNCw4IEBACiAvKgogICogc2NzaSBob3N0IHRlbXBsYXRlCiAgKi8KLWV4dGVybiBpbnQgaXNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGRlcHRoKTsKK2V4dGVybiBpbnQgaXNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGRlcHRoLAorCQkJCSAgICBpbnQgcmVhc29uKTsKIGV4dGVybiBpbnQgaXNjc2lfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqc2MpOwogZXh0ZXJuIGludCBpc2NzaV9laF90YXJnZXRfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2MpOwogZXh0ZXJuIGludCBpc2NzaV9laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYnNhcy5oIGIvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCmluZGV4IGU3OGQzYjYuLjllYWEzZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9saWJzYXMuaAorKysgYi9pbmNsdWRlL3Njc2kvbGlic2FzLmgKQEAgLTYzNCw3ICs2MzQsOCBAQAogZXh0ZXJuIGludCBzYXNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICopOwogZXh0ZXJuIGludCBzYXNfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIHNhc19zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqKTsKLWV4dGVybiBpbnQgc2FzX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgaW50IG5ld19kZXB0aCk7CitleHRlcm4gaW50IHNhc19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICosIGludCBuZXdfZGVwdGgsCisJCQkJICBpbnQgcmVhc29uKTsKIGV4dGVybiBpbnQgc2FzX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqLCBpbnQgcXQpOwogZXh0ZXJuIGludCBzYXNfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwKIAkJCSAgc3RydWN0IGJsb2NrX2RldmljZSAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL29zZF9pbml0aWF0b3IuaCBiL2luY2x1ZGUvc2NzaS9vc2RfaW5pdGlhdG9yLmgKaW5kZXggMDJiZDlmNy4uMzlkNmQxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL29zZF9pbml0aWF0b3IuaAorKysgYi9pbmNsdWRlL3Njc2kvb3NkX2luaXRpYXRvci5oCkBAIC00OCw3ICs0OCw2IEBACiAgKi8KIHN0cnVjdCBvc2RfZGV2IHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlOwotCXN0cnVjdCBmaWxlICpmaWxlOwogCXVuc2lnbmVkIGRlZl90aW1lb3V0OwogCiAjaWZkZWYgT1NEX1ZFUjFfU1VQUE9SVApAQCAtNTYsMTAgKzU1LDI0IEBACiAjZW5kaWYKIH07CiAKLS8qIFJldHJpZXZlL3JldHVybiBvc2RfZGV2KHMpIGZvciB1c2UgYnkgS2VybmVsIGNsaWVudHMgKi8KLXN0cnVjdCBvc2RfZGV2ICpvc2R1bGRfcGF0aF9sb29rdXAoY29uc3QgY2hhciAqZGV2X25hbWUpOyAvKlVzZSBJU19FUlIvRVJSX1BUUiovCisvKiBVbmlxdWUgSWRlbnRpZmljYXRpb24gb2YgYW4gT1NEIGRldmljZSAqLworc3RydWN0IG9zZF9kZXZfaW5mbyB7CisJdW5zaWduZWQgc3lzdGVtaWRfbGVuOworCXU4IHN5c3RlbWlkW09TRF9TWVNURU1JRF9MRU5dOworCXVuc2lnbmVkIG9zZG5hbWVfbGVuOworCXU4ICpvc2RuYW1lOworfTsKKworLyogUmV0cmlldmUvcmV0dXJuIG9zZF9kZXYocykgZm9yIHVzZSBieSBLZXJuZWwgY2xpZW50cworICogVXNlIElTX0VSUi9FUlJfUFRSIG9uIHJldHVybmVkICJvc2RfZGV2ICoiLgorICovCitzdHJ1Y3Qgb3NkX2RldiAqb3NkdWxkX3BhdGhfbG9va3VwKGNvbnN0IGNoYXIgKmRldl9uYW1lKTsKK3N0cnVjdCBvc2RfZGV2ICpvc2R1bGRfaW5mb19sb29rdXAoY29uc3Qgc3RydWN0IG9zZF9kZXZfaW5mbyAqb2RpKTsKIHZvaWQgb3NkdWxkX3B1dF9kZXZpY2Uoc3RydWN0IG9zZF9kZXYgKm9kKTsKIAorY29uc3Qgc3RydWN0IG9zZF9kZXZfaW5mbyAqb3NkdWxkX2RldmljZV9pbmZvKHN0cnVjdCBvc2RfZGV2ICpvZCk7Citib29sIG9zZHVsZF9kZXZpY2Vfc2FtZShzdHJ1Y3Qgb3NkX2RldiAqb2QsIGNvbnN0IHN0cnVjdCBvc2RfZGV2X2luZm8gKm9kaSk7CisKIC8qIEFkZC9yZW1vdmUgdGVzdCBpb2N0bHMgZnJvbSBleHRlcm5hbCBtb2R1bGVzICovCiB0eXBlZGVmIGludCAoZG9fdGVzdF9mbikoc3RydWN0IG9zZF9kZXYgKm9kLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGludCBvc2R1bGRfcmVnaXN0ZXJfdGVzdCh1bnNpZ25lZCBpb2N0bCwgZG9fdGVzdF9mbiAqZG9fdGVzdCk7CkBAIC02OSw4ICs4MiwyNCBAQAogdm9pZCBvc2RfZGV2X2luaXQoc3RydWN0IG9zZF9kZXYgKm9kLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlKTsKIHZvaWQgb3NkX2Rldl9maW5pKHN0cnVjdCBvc2RfZGV2ICpvZCk7CiAKLS8qIHNvbWUgaGkgbGV2ZWwgZGV2aWNlIG9wZXJhdGlvbnMgKi8KLWludCBvc2RfYXV0b19kZXRlY3RfdmVyKHN0cnVjdCBvc2RfZGV2ICpvZCwgdm9pZCAqY2Fwcyk7ICAgIC8qIEdGUF9LRVJORUwgKi8KKy8qKgorICogb3NkX2F1dG9fZGV0ZWN0X3ZlciAtIERldGVjdCB0aGUgT1NEIHZlcnNpb24sIHJldHVybiBVbmlxdWUgSWRlbnRpZmljYXRpb24KKyAqCisgKiBAb2Q6ICAgICBPU0QgdGFyZ2V0IGx1biBoYW5kbGUKKyAqIEBjYXBzOiAgIENhcGFiaWxpdGllcyBhdXRob3JpemluZyBPU0Qgcm9vdCByZWFkIGF0dHJpYnV0ZXMgYWNjZXNzCisgKiBAb2RpOiAgICBSZXRyaWV2ZWQgaW5mb3JtYXRpb24gdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhlIG9zZCB0YXJnZXQgbHVuCisgKiAgICAgICAgICBOb3RlOiBvZGktPm9zZG5hbWUgbXVzdCBiZSBrZnJlZWQgYnkgY2FsbGVyLgorICoKKyAqIEF1dG8gZGV0ZWN0cyB0aGUgT1NEIHZlcnNpb24gb2YgdGhlIE9TRCB0YXJnZXQgYW5kIHNldHMgdGhlIEBvZAorICogYWNjb3JkaW5nbHkuIE1lYW53aGlsZSBhbHNvIHJldHVybnMgdGhlICJzeXN0ZW0gaWQiIGFuZCAib3NkIG5hbWUiIHJvb3QKKyAqIGF0dHJpYnV0ZXMgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZnkgdGhlIE9TRCB0YXJnZXQuIFRoaXMgbWVtYmVyIGlzIHVzdWFsbHkKKyAqIGNhbGxlZCBieSB0aGUgVUxELiBVTEQgdXNlcnMgc2hvdWxkIGNhbGwgb3NkdWxkX2RldmljZV9pbmZvKCkuCisgKiBUaGlzIHJ1dGluZSBhbGxvY2F0ZXMgb3NkIHJlcXVlc3RzIGFuZCBtZW1vcnkgYXQgR0ZQX0tFUk5FTCBsZXZlbCBhbmQgbWlnaHQKKyAqIHNsZWVwLgorICovCitpbnQgb3NkX2F1dG9fZGV0ZWN0X3ZlcihzdHJ1Y3Qgb3NkX2RldiAqb2QsCisJdm9pZCAqY2Fwcywgc3RydWN0IG9zZF9kZXZfaW5mbyAqb2RpKTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqb3NkX3JlcXVlc3RfcXVldWUoc3RydWN0IG9zZF9kZXYgKm9kKQogewogCXJldHVybiBvZC0+c2NzaV9kZXZpY2UtPnJlcXVlc3RfcXVldWU7CkBAIC04NCw2ICsxMTMsMTUgQEAKICNlbmRpZgogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgb3NkX2Rldl9pc192ZXIxKHN0cnVjdCBvc2RfZGV2ICpvZCkKK3sKKyNpZmRlZiBPU0RfVkVSMV9TVVBQT1JUCisJcmV0dXJuIG9kLT52ZXJzaW9uID09IE9TRF9WRVIxOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwogc3RydWN0IG9zZF9yZXF1ZXN0OwogdHlwZWRlZiB2b2lkIChvc2RfcmVxX2RvbmVfZm4pKHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsIHZvaWQgKnByaXZhdGUpOwogCkBAIC0xMjAsMTQgKzE1OCw5IEBACiAJaW50IGFzeW5jX2Vycm9yOwogfTsKIAotLyogT1NEIFZlcnNpb24gY29udHJvbCAqLwogc3RhdGljIGlubGluZSBib29sIG9zZF9yZXFfaXNfdmVyMShzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yKQogewotI2lmZGVmIE9TRF9WRVIxX1NVUFBPUlQKLQlyZXR1cm4gb3ItPm9zZF9kZXYtPnZlcnNpb24gPT0gT1NEX1ZFUjE7Ci0jZWxzZQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgorCXJldHVybiBvc2RfZGV2X2lzX3ZlcjEob3ItPm9zZF9kZXYpOwogfQogCiAvKgpAQCAtMjM0LDcgKzI2Nyw3IEBACiAgKiBAYmFkX2F0dHJfbGlzdCAtIExpc3Qgb2YgZmFpbGluZyBhdHRyaWJ1dGVzIChvcHRpb25hbCkKICAqIEBtYXhfYXR0ciAgICAgIC0gU2l6ZSBvZiBAYmFkX2F0dHJfbGlzdC4KICAqCi0gKiBBZnRlciBleGVjdXRpb24sIHNlbnNlICsgcmV0dXJuIGNvZGUgY2FuIGJlIGFuYWx5emVkIHVzaW5nIHRoaXMgZnVuY3Rpb24uIFRoZQorICogQWZ0ZXIgZXhlY3V0aW9uLCBvc2RfcmVxdWVzdCByZXN1bHRzIGFyZSBhbmFseXplZCB1c2luZyB0aGlzIGZ1bmN0aW9uLiBUaGUKICAqIHJldHVybiBjb2RlIGlzIHRoZSBmaW5hbCBkaXNwb3NpdGlvbiBvbiB0aGUgZXJyb3IuIFNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgYQogICogQ0hFQ0tfQ09ORElUSU9OIHdhcyByZXR1cm5lZCBmcm9tIHRhcmdldCBidXQgdGhpcyB3aWxsIHJldHVybiBOT19FUlJPUiwgZm9yCiAgKiBleGFtcGxlIG9uIHJlY292ZXJlZCBlcnJvcnMuIEFsbCBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCBpZiBjYWxsZXIgZG9lcwpAQCAtMjQzLDcgKzI3NiwzMSBAQAogICogb2YgdGhlIFNDU0lfT1NEX0RQUklOVF9TRU5TRSBLY29uZmlnIHZhbHVlLiBTZXQgQHNpbGVudCBpZiB5b3Uga25vdyB0aGUKICAqIGNvbW1hbmQgd291bGQgcm91dGluZWx5IGZhaWwsIHRvIG5vdCBzcGFtIHRoZSBkbXNnIGZpbGUuCiAgKi8KKworLyoqCisgKiBvc2RfZXJyX3ByaW9yaXR5IC0gb3NkIGNhdGVnb3JpemVkIHJldHVybiBjb2RlcyBpbiBhc2NlbmRpbmcgc2V2ZXJpdHkuCisgKgorICogVGhlIGNhdGVnb3JpZXMgYXJlIGJvcnJvd2VkIGZyb20gdGhlIHBuZnNfb3NkX2Vycm5vIGVudW0uCisgKiBTZWUgY29tbWVudHMgZm9yIHRyYW5zbGF0ZWQgTGludXggY29kZXMgcmV0dXJuZWQgYnkgb3NkX3JlcV9kZWNvZGVfc2Vuc2UuCisgKi8KK2VudW0gb3NkX2Vycl9wcmlvcml0eSB7CisJT1NEX0VSUl9QUklfTk9fRVJST1IJPSAwLAorCS8qIFJlY292ZXJhYmxlLCBjYWxsZXIgc2hvdWxkIGNsZWFyX2hpZ2hwYWdlKCkgYWxsIHBhZ2VzICovCisJT1NEX0VSUl9QUklfQ0xFQVJfUEFHRVMgPSAxLCAvKiAtRUZBVUxUICovCisJT1NEX0VSUl9QUklfUkVTT1VSQ0UJPSAyLCAvKiAtRU5PTUVNICovCisJT1NEX0VSUl9QUklfQkFEX0NSRUQJPSAzLCAvKiAtRUlOVkFMICovCisJT1NEX0VSUl9QUklfTk9fQUNDRVNTCT0gNCwgLyogLUVBQ0NFUyAqLworCU9TRF9FUlJfUFJJX1VOUkVBQ0hBQkxFCT0gNSwgLyogYW55IG90aGVyICovCisJT1NEX0VSUl9QUklfTk9UX0ZPVU5ECT0gNiwgLyogLUVOT0VOVCAqLworCU9TRF9FUlJfUFJJX05PX1NQQUNFCT0gNywgLyogLUVOT1NQQyAqLworCU9TRF9FUlJfUFJJX0VJTwkJPSA4LCAvKiAtRUlPICAgICovCit9OworCiBzdHJ1Y3Qgb3NkX3NlbnNlX2luZm8geworCXU2NCBvdXRfcmVzaWQ7CQkvKiBaZXJvIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIG91dCByZXNpZHVhbCAqLworCXU2NCBpbl9yZXNpZDsJCS8qIFplcm8gb24gc3VjY2VzcyBvdGhlcndpc2UgaW4gcmVzaWR1YWwgKi8KKwllbnVtIG9zZF9lcnJfcHJpb3JpdHkgb3NkX2Vycl9wcmk7CisKIAlpbnQga2V5OwkJLyogb25lIG9mIGVudW0gc2NzaV9zZW5zZV9rZXlzICovCiAJaW50IGFkZGl0aW9uYWxfY29kZSA7CS8qIGVudW0gb3NkX2FkZGl0aW9uYWxfc2Vuc2VfY29kZXMgKi8KIAl1bmlvbiB7IC8qIFNlbnNlIHNwZWNpZmljIGluZm9ybWF0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvb3NkX3Byb3RvY29sLmggYi9pbmNsdWRlL3Njc2kvb3NkX3Byb3RvY29sLmgKaW5kZXggMmNjOGU4Yi4uNjg1NjYxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL29zZF9wcm90b2NvbC5oCisrKyBiL2luY2x1ZGUvc2NzaS9vc2RfcHJvdG9jb2wuaApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBfX09TRF9QUk9UT0NPTF9IX18KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvb3NkX3NlbnNlLmggYi9pbmNsdWRlL3Njc2kvb3NkX3NlbnNlLmgKaW5kZXggZmY5YjMzYy4uOTFkYjU0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL29zZF9zZW5zZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9vc2Rfc2Vuc2UuaApAQCAtMjU1LDYgKzI1NSw5IEBACiAJT1NEX0NGT19TVEFSVElOR19CWVRFCT0gT1NEX0NEQl9PRkZTRVQodjIuc3RhcnRfYWRkcmVzcyksCiAJT1NEX0NGT19QQVJUSVRJT05fSUQJPSBPU0RfQ0RCX09GRlNFVChwYXJ0aXRpb24pLAogCU9TRF9DRk9fT0JKRUNUX0lECT0gT1NEX0NEQl9PRkZTRVQob2JqZWN0KSwKKwlPU0RfQ0ZPX1BFUk1JU1NJT05TCT0gc2l6ZW9mKHN0cnVjdCBvc2RfY2RiX2hlYWQpICsKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IG9zZF9jYXBhYmlsaXR5X2hlYWQsCisJCQkJCQkgcGVybWlzc2lvbnNfYml0X21hc2spLAogfTsKIAogI2VuZGlmIC8qIG5kZWYgX19PU0RfU0VOU0VfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2kuaAppbmRleCAzNGM0NmFiLi44YjRkZWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTk0LDYgKzk0LDcgQEAKICNkZWZpbmUgV1JJVEVfTE9ORyAgICAgICAgICAgIDB4M2YKICNkZWZpbmUgQ0hBTkdFX0RFRklOSVRJT04gICAgIDB4NDAKICNkZWZpbmUgV1JJVEVfU0FNRSAgICAgICAgICAgIDB4NDEKKyNkZWZpbmUgVU5NQVAJCSAgICAgIDB4NDIKICNkZWZpbmUgUkVBRF9UT0MgICAgICAgICAgICAgIDB4NDMKICNkZWZpbmUgTE9HX1NFTEVDVCAgICAgICAgICAgIDB4NGMKICNkZWZpbmUgTE9HX1NFTlNFICAgICAgICAgICAgIDB4NGQKQEAgLTEyMiw5ICsxMjMsMTEgQEAKICNkZWZpbmUgUkVBRF8xNiAgICAgICAgICAgICAgIDB4ODgKICNkZWZpbmUgV1JJVEVfMTYgICAgICAgICAgICAgIDB4OGEKICNkZWZpbmUgVkVSSUZZXzE2CSAgICAgIDB4OGYKKyNkZWZpbmUgV1JJVEVfU0FNRV8xNgkgICAgICAweDkzCiAjZGVmaW5lIFNFUlZJQ0VfQUNUSU9OX0lOICAgICAweDllCiAvKiB2YWx1ZXMgZm9yIHNlcnZpY2UgYWN0aW9uIGluICovCiAjZGVmaW5lCVNBSV9SRUFEX0NBUEFDSVRZXzE2ICAweDEwCisjZGVmaW5lIFNBSV9HRVRfTEJBX1NUQVRVUyAgICAweDEyCiAvKiB2YWx1ZXMgZm9yIG1haW50ZW5hbmNlIGluICovCiAjZGVmaW5lIE1JX1JFUE9SVF9UQVJHRVRfUEdTICAweDBhCiAvKiB2YWx1ZXMgZm9yIG1haW50ZW5hbmNlIG91dCAqLwpAQCAtMTMyLDYgKzEzNSw3IEBACiAvKiB2YWx1ZXMgZm9yIHZhcmlhYmxlIGxlbmd0aCBjb21tYW5kICovCiAjZGVmaW5lIFJFQURfMzIJCSAgICAgIDB4MDkKICNkZWZpbmUgV1JJVEVfMzIJICAgICAgMHgwYgorI2RlZmluZSBXUklURV9TQU1FXzMyCSAgICAgIDB4MGQKIAogLyogVmFsdWVzIGZvciBUMTAvMDQtMjYycjcgKi8KICNkZWZpbmUJQVRBXzE2CQkgICAgICAweDg1CS8qIDE2LWJ5dGUgcGFzcy10aHJ1ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCmluZGV4IGYwOTdhZTMuLjdjNDQ0OTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCkBAIC04MSwxMSArODEsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHN0YXJ2ZWRfZW50cnk7CiAJc3RydWN0IHNjc2lfY21uZCAqY3VycmVudF9jbW5kOwkvKiBjdXJyZW50bHkgYWN0aXZlIGNvbW1hbmQgKi8KIAl1bnNpZ25lZCBzaG9ydCBxdWV1ZV9kZXB0aDsJLyogSG93IGRlZXAgb2YgYSBxdWV1ZSB3ZSB3YW50ICovCisJdW5zaWduZWQgc2hvcnQgbWF4X3F1ZXVlX2RlcHRoOwkvKiBtYXggcXVldWUgZGVwdGggKi8KIAl1bnNpZ25lZCBzaG9ydCBsYXN0X3F1ZXVlX2Z1bGxfZGVwdGg7IC8qIFRoZXNlIHR3byBhcmUgdXNlZCBieSAqLwogCXVuc2lnbmVkIHNob3J0IGxhc3RfcXVldWVfZnVsbF9jb3VudDsgLyogc2NzaV90cmFja19xdWV1ZV9mdWxsKCkgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfcXVldWVfZnVsbF90aW1lOy8qIGRvbid0IGxldCBRVUVVRV9GVUxMcyBvbiB0aGUgc2FtZQotCQkJCQkgICBqaWZmaWUgY291bnQgb24gb3VyIGNvdW50ZXIsIHRoZXkKLQkJCQkJICAgY291bGQgYWxsIGJlIGZyb20gdGhlIHNhbWUgZXZlbnQuICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3F1ZXVlX2Z1bGxfdGltZTsJLyogbGFzdCBxdWV1ZSBmdWxsIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIHF1ZXVlX3JhbXBfdXBfcGVyaW9kOwkvKiByYW1wIHVwIHBlcmlvZCBpbiBqaWZmaWVzICovCisjZGVmaW5lIFNDU0lfREVGQVVMVF9SQU1QX1VQX1BFUklPRAkoMTIwICogSFopCisKKwl1bnNpZ25lZCBsb25nIGxhc3RfcXVldWVfcmFtcF91cDsJLyogbGFzdCBxdWV1ZSByYW1wIHVwIHRpbWUgKi8KIAogCXVuc2lnbmVkIGludCBpZCwgbHVuLCBjaGFubmVsOwogCkBAIC0xNzUsNiArMTc4LDcgQEAKIAljaGFyICptb2RlbDsKIH07CiAKK3R5cGVkZWYgdm9pZCAoKmFjdGl2YXRlX2NvbXBsZXRlKSh2b2lkICosIGludCk7CiBzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciB7CiAJLyogVXNlZCBieSB0aGUgaW5mcmFzdHJ1Y3R1cmUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGxpc3Qgb2Ygc2NzaV9kZXZpY2VfaGFuZGxlcnMgKi8KQEAgLTE4Niw3ICsxOTAsNyBAQAogCWludCAoKmNoZWNrX3NlbnNlKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICopOwogCWludCAoKmF0dGFjaCkoc3RydWN0IHNjc2lfZGV2aWNlICopOwogCXZvaWQgKCpkZXRhY2gpKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKLQlpbnQgKCphY3RpdmF0ZSkoc3RydWN0IHNjc2lfZGV2aWNlICopOworCWludCAoKmFjdGl2YXRlKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgYWN0aXZhdGVfY29tcGxldGUsIHZvaWQgKik7CiAJaW50ICgqcHJlcF9mbikoc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCByZXF1ZXN0ICopOwogCWludCAoKnNldF9wYXJhbXMpKHN0cnVjdCBzY3NpX2RldmljZSAqLCBjb25zdCBjaGFyICopOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2RoLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9kaC5oCmluZGV4IGZmMjQwNzQuLmUzZjJkYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2RoLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfZGguaApAQCAtNTYsMTQgKzU2LDE2IEBACiAJU0NTSV9ESF9EUklWRVJfTUFYLAogfTsKICNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX0RIKSB8fCBkZWZpbmVkKENPTkZJR19TQ1NJX0RIX01PRFVMRSkKLWV4dGVybiBpbnQgc2NzaV9kaF9hY3RpdmF0ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKK2V4dGVybiBpbnQgc2NzaV9kaF9hY3RpdmF0ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBhY3RpdmF0ZV9jb21wbGV0ZSwgdm9pZCAqKTsKIGV4dGVybiBpbnQgc2NzaV9kaF9oYW5kbGVyX2V4aXN0KGNvbnN0IGNoYXIgKik7CiBleHRlcm4gaW50IHNjc2lfZGhfYXR0YWNoKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gdm9pZCBzY3NpX2RoX2RldGFjaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIGV4dGVybiBpbnQgc2NzaV9kaF9zZXRfcGFyYW1zKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGNvbnN0IGNoYXIgKik7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgc2NzaV9kaF9hY3RpdmF0ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcmVxKQorc3RhdGljIGlubGluZSBpbnQgc2NzaV9kaF9hY3RpdmF0ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcmVxLAorCQkJCQlhY3RpdmF0ZV9jb21wbGV0ZSBmbiwgdm9pZCAqZGF0YSkKIHsKKwlmbihkYXRhLCAwKTsKIAlyZXR1cm4gMDsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHNjc2lfZGhfaGFuZGxlcl9leGlzdChjb25zdCBjaGFyICpuYW1lKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDQ3OTQxZmMuLmM1MGE5N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTQzLDYgKzQzLDEyIEBACiAjZGVmaW5lIERJU0FCTEVfQ0xVU1RFUklORyAwCiAjZGVmaW5lIEVOQUJMRV9DTFVTVEVSSU5HIDEKIAorZW51bSB7CisJU0NTSV9RREVQVEhfREVGQVVMVCwJLyogZGVmYXVsdCByZXF1ZXN0ZWQgY2hhbmdlLCBlLmcuIGZyb20gc3lzZnMgKi8KKwlTQ1NJX1FERVBUSF9RRlVMTCwJLyogc2NzaS1tbCByZXF1ZXN0ZWQgZHVlIHRvIHF1ZXVlIGZ1bGwgKi8KKwlTQ1NJX1FERVBUSF9SQU1QX1VQLAkvKiBzY3NpLW1sIHJlcXVlc3RlZCBkdWUgdG8gdGhyZXNoaG9sZCBldmVudCAqLworfTsKKwogc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSB7CiAJc3RydWN0IG1vZHVsZSAqbW9kdWxlOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0yOTQsNyArMzAwLDcgQEAKIAkgKgogCSAqIFN0YXR1czogT1BUSU9OQUwKIAkgKi8KLQlpbnQgKCogY2hhbmdlX3F1ZXVlX2RlcHRoKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgaW50KTsKKwlpbnQgKCogY2hhbmdlX3F1ZXVlX2RlcHRoKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgaW50LCBpbnQpOwogCiAJLyoKIAkgKiBGaWxsIGluIHRoaXMgZnVuY3Rpb24gdG8gYWxsb3cgdGhlIGNoYW5naW5nIG9mIHRhZyB0eXBlcwpAQCAtNjc3LDYgKzY4MywxMiBAQAogCXZvaWQgKnNob3N0X2RhdGE7CiAKIAkvKgorCSAqIFBvaW50cyB0byB0aGUgcGh5c2ljYWwgYnVzIGRldmljZSB3ZSdkIHVzZSB0byBkbyBETUEKKwkgKiBOZWVkZWQganVzdCBpbiBjYXNlIHdlIGhhdmUgdmlydHVhbCBob3N0cy4KKwkgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2OworCisJLyoKIAkgKiBXZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhpcyBpcyBhbGlnbmVkLCBib3RoIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UKIAkgKiBhbmQgYWxzbyBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIChtNjhrKSBkb24ndCBhdXRvbWF0aWNhbGx5IGZvcmNlCiAJICogYWxpZ25tZW50IHRvIGEgbG9uZyBib3VuZGFyeS4KQEAgLTcyMCw3ICs3MzIsOSBAQAogZXh0ZXJuIHZvaWQgc2NzaV9mbHVzaF93b3JrKHN0cnVjdCBTY3NpX0hvc3QgKik7CiAKIGV4dGVybiBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfYWxsb2Moc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqLCBpbnQpOwotZXh0ZXJuIGludCBfX211c3RfY2hlY2sgc2NzaV9hZGRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBkZXZpY2UgKik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBzY3NpX2FkZF9ob3N0X3dpdGhfZG1hKHN0cnVjdCBTY3NpX0hvc3QgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKik7CiBleHRlcm4gdm9pZCBzY3NpX3NjYW5faG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwogZXh0ZXJuIHZvaWQgc2NzaV9yZXNjYW5fZGV2aWNlKHN0cnVjdCBkZXZpY2UgKik7CiBleHRlcm4gdm9pZCBzY3NpX3JlbW92ZV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKik7CkBAIC03MzEsNiArNzQ1LDEyIEBACiAKIGV4dGVybiB1NjQgc2NzaV9jYWxjdWxhdGVfYm91bmNlX2xpbWl0KHN0cnVjdCBTY3NpX0hvc3QgKik7CiAKK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBzY3NpX2FkZF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisJCQkJCSAgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzY3NpX2FkZF9ob3N0X3dpdGhfZG1hKGhvc3QsIGRldiwgZGV2KTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpzY3NpX2dldF9kZXZpY2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CiAgICAgICAgIHJldHVybiBzaG9zdC0+c2hvc3RfZ2VuZGV2LnBhcmVudDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKaW5kZXggZmM1MGJkNi4uOGU4NmE5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKQEAgLTgwNyw1ICs4MDcsNiBAQAogc3RydWN0IGZjX3Zwb3J0ICpmY192cG9ydF9jcmVhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBjaGFubmVsLAogCQlzdHJ1Y3QgZmNfdnBvcnRfaWRlbnRpZmllcnMgKik7CiBpbnQgZmNfdnBvcnRfdGVybWluYXRlKHN0cnVjdCBmY192cG9ydCAqdnBvcnQpOwordm9pZCBmY19ibG9ja19zY3NpX2VoKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpOwogCiAjZW5kaWYgLyogU0NTSV9UUkFOU1BPUlRfRkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hYzk3X2NvZGVjLmggYi9pbmNsdWRlL3NvdW5kL2FjOTdfY29kZWMuaAppbmRleCAzZGFlM2Y3Li40OTQwMDQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2FjOTdfY29kZWMuaAorKysgYi9pbmNsdWRlL3NvdW5kL2FjOTdfY29kZWMuaApAQCAtNTkzLDcgKzU5Myw3IEBACiAKIHN0cnVjdCBhYzk3X3F1aXJrIHsKIAl1bnNpZ25lZCBzaG9ydCBzdWJ2ZW5kb3I7IC8qIFBDSSBzdWJzeXN0ZW0gdmVuZG9yIGlkICovCi0JdW5zaWduZWQgc2hvcnQgc3ViZGV2aWNlOyAvKiBQQ0kgc3lic3lzdGVtIGRldmljZSBpZCAqLworCXVuc2lnbmVkIHNob3J0IHN1YmRldmljZTsgLyogUENJIHN1YnN5c3RlbSBkZXZpY2UgaWQgKi8KIAl1bnNpZ25lZCBzaG9ydCBtYXNrOwkvKiBkZXZpY2UgaWQgYml0IG1hc2ssIDAgPSBhY2NlcHQgYWxsICovCiAJdW5zaWduZWQgaW50IGNvZGVjX2lkOwkvKiBjb2RlYyBpZCAoaWYgYW55KSwgMCA9IGFjY2VwdCBhbGwgKi8KIAljb25zdCBjaGFyICpuYW1lOwkvKiBuYW1lIHNob3duIGFzIGluZm8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvd204OTkzLmggYi9pbmNsdWRlL3NvdW5kL3dtODk5My5oCmluZGV4IDljNjYxZjIuLmVlZTE5ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvd204OTkzLmgKKysrIGIvaW5jbHVkZS9zb3VuZC93bTg5OTMuaApAQCAtMzYsNyArMzYsNyBAQAogCXVuc2lnbmVkIGludCBtaWNiaWFzMV9sdmw6MTsKIAl1bnNpZ25lZCBpbnQgbWljYmlhczJfbHZsOjE7CiAKLQkvKiBKYWNrIGRldGVjdCB0aHJlYXNob2xkIGxldmVscywgc2VlIGRhdGFzaGVldCBmb3IgdmFsdWVzICovCisJLyogSmFjayBkZXRlY3QgdGhyZXNob2xkIGxldmVscywgc2VlIGRhdGFzaGVldCBmb3IgdmFsdWVzICovCiAJdW5zaWduZWQgaW50IGpkX3NjdGhyOjI7CiAJdW5zaWduZWQgaW50IGpkX3RocjoyOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAppbmRleCAzMThmNzY1Li5kMGI2Y2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCkBAIC0zOCw3ICszOCw3IEBACiAJCV9fZW50cnktPmJsb2Nrcwk9IGlub2RlLT5pX2Jsb2NrczsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgaW5vICVsdSBtb2RlICVkIHVpZCAldSBnaWQgJXUgYmxvY2tzICVsbHUiLAorCVRQX3ByaW50aygiZGV2ICVzIGlubyAlbHUgbW9kZSAwJW8gdWlkICV1IGdpZCAldSBibG9ja3MgJWxsdSIsCiAJCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgIF9fZW50cnktPm1vZGUsIF9fZW50cnktPnVpZCwgX19lbnRyeS0+Z2lkLAogCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmJsb2NrcykKQEAgLTYxLDcgKzYxLDcgQEAKIAkJX19lbnRyeS0+bW9kZQk9IG1vZGU7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIGRpciAlbHUgbW9kZSAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJXMgZGlyICVsdSBtb2RlIDAlbyIsCiAJCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+ZGlyLAogCQkgIF9fZW50cnktPm1vZGUpCiApOwpAQCAtODUsNyArODUsNyBAQAogCQlfX2VudHJ5LT5tb2RlCT0gbW9kZTsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgaW5vICVsdSBkaXIgJWx1IG1vZGUgJWQiLAorCVRQX3ByaW50aygiZGV2ICVzIGlubyAlbHUgZGlyICVsdSBtb2RlIDAlbyIsCiAJCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5kaXIsIF9fZW50cnktPm1vZGUpCiApOwpAQCAtMzA1LDcgKzMwNSw2IEBACiAJCV9fZmllbGQoCWludCwJcmV0CQkJKQogCQlfX2ZpZWxkKAlpbnQsCXBhZ2VzX3dyaXR0ZW4JCSkKIAkJX19maWVsZCgJbG9uZywJcGFnZXNfc2tpcHBlZAkJKQotCQlfX2ZpZWxkKAljaGFyLAllbmNvdW50ZXJlZF9jb25nZXN0aW9uCSkKIAkJX19maWVsZCgJY2hhciwJbW9yZV9pbwkJCSkJCiAJCV9fZmllbGQoCWNoYXIsCW5vX25yd3JpdGVfaW5kZXhfdXBkYXRlICkKIAkJX19maWVsZCggICAgICAgcGdvZmZfdCwJd3JpdGViYWNrX2luZGV4CQkpCkBAIC0zMTcsMTcgKzMxNiwxNiBAQAogCQlfX2VudHJ5LT5yZXQJCT0gcmV0OwogCQlfX2VudHJ5LT5wYWdlc193cml0dGVuCT0gcGFnZXNfd3JpdHRlbjsKIAkJX19lbnRyeS0+cGFnZXNfc2tpcHBlZAk9IHdiYy0+cGFnZXNfc2tpcHBlZDsKLQkJX19lbnRyeS0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbgk9IHdiYy0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbjsKIAkJX19lbnRyeS0+bW9yZV9pbwk9IHdiYy0+bW9yZV9pbzsKIAkJX19lbnRyeS0+bm9fbnJ3cml0ZV9pbmRleF91cGRhdGUgPSB3YmMtPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlOwogCQlfX2VudHJ5LT53cml0ZWJhY2tfaW5kZXggPSBpbm9kZS0+aV9tYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIGlubyAlbHUgcmV0ICVkIHBhZ2VzX3dyaXR0ZW4gJWQgcGFnZXNfc2tpcHBlZCAlbGQgY29uZ2VzdGlvbiAlZCBtb3JlX2lvICVkIG5vX25yd3JpdGVfaW5kZXhfdXBkYXRlICVkIHdyaXRlYmFja19pbmRleCAlbHUiLAorCVRQX3ByaW50aygiZGV2ICVzIGlubyAlbHUgcmV0ICVkIHBhZ2VzX3dyaXR0ZW4gJWQgcGFnZXNfc2tpcHBlZCAlbGQgbW9yZV9pbyAlZCBub19ucndyaXRlX2luZGV4X3VwZGF0ZSAlZCB3cml0ZWJhY2tfaW5kZXggJWx1IiwKIAkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+cmV0LAogCQkgIF9fZW50cnktPnBhZ2VzX3dyaXR0ZW4sIF9fZW50cnktPnBhZ2VzX3NraXBwZWQsCi0JCSAgX19lbnRyeS0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbiwgX19lbnRyeS0+bW9yZV9pbywKKwkJICBfX2VudHJ5LT5tb3JlX2lvLAogCQkgIF9fZW50cnktPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT53cml0ZWJhY2tfaW5kZXgpCiApOwpAQCAtNTkxLDMwICs1ODksMzIgQEAKIAogVFJBQ0VfRVZFTlQoZXh0NF9mcmVlX2Jsb2NrcywKIAlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKLQkJCWludCBtZXRhZGF0YSksCisJCSBpbnQgZmxhZ3MpLAogCi0JVFBfQVJHUyhpbm9kZSwgYmxvY2ssIGNvdW50LCBtZXRhZGF0YSksCisJVFBfQVJHUyhpbm9kZSwgYmxvY2ssIGNvdW50LCBmbGFncyksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQorCQlfX2ZpZWxkKCAgICAgIHVtb2RlX3QsIG1vZGUJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlibG9jawkJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJY291bnQJCSkKLQkJX19maWVsZCgJaW50LAltZXRhZGF0YQkJKQotCisJCV9fZmllbGQoCSBpbnQsCWZsYWdzCQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKIAkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+bW9kZQkJPSBpbm9kZS0+aV9tb2RlOwogCQlfX2VudHJ5LT5ibG9jawkJPSBibG9jazsKIAkJX19lbnRyeS0+Y291bnQJCT0gY291bnQ7Ci0JCV9fZW50cnktPm1ldGFkYXRhCT0gbWV0YWRhdGE7CisJCV9fZW50cnktPmZsYWdzCQk9IGZsYWdzOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyBpbm8gJWx1IGJsb2NrICVsbHUgY291bnQgJWx1IG1ldGFkYXRhICVkIiwKKwlUUF9wcmludGsoImRldiAlcyBpbm8gJWx1IG1vZGUgMCVvIGJsb2NrICVsbHUgY291bnQgJWx1IGZsYWdzICVkIiwKIAkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgX19lbnRyeS0+YmxvY2ssIF9fZW50cnktPmNvdW50LCBfX2VudHJ5LT5tZXRhZGF0YSkKKwkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT5ibG9jaywgX19lbnRyeS0+Y291bnQsCisJCSAgX19lbnRyeS0+ZmxhZ3MpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X3N5bmNfZmlsZSwKQEAgLTg0OCw2ICs4NDgsMzIgQEAKIAkJICBfX2VudHJ5LT5yZXN1bHRfbGVuLCBfX2VudHJ5LT5yZXN1bHRfbG9naWNhbCkKICk7CiAKK1RSQUNFX0VWRU5UKGV4dDRfZm9yZ2V0LAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBpc19tZXRhZGF0YSwgX191NjQgYmxvY2spLAorCisJVFBfQVJHUyhpbm9kZSwgaXNfbWV0YWRhdGEsIGJsb2NrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCisJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCisJCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCWludCwJaXNfbWV0YWRhdGEJCSkKKwkJX19maWVsZCgJX191NjQsCWJsb2NrCQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CT0gaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPm1vZGUJPSBpbm9kZS0+aV9tb2RlOworCQlfX2VudHJ5LT5pc19tZXRhZGF0YSA9IGlzX21ldGFkYXRhOworCQlfX2VudHJ5LT5ibG9jawk9IGJsb2NrOworCSksCisKKwlUUF9wcmludGsoImRldiAlcyBpbm8gJWx1IG1vZGUgMCVvIGlzX21ldGFkYXRhICVkIGJsb2NrICVsbHUiLAorCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT5pc19tZXRhZGF0YSwgX19lbnRyeS0+YmxvY2spCispOworCiAjZW5kaWYgLyogX1RSQUNFX0VYVDRfSCAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vc2dpdncuaCBiL2luY2x1ZGUvdmlkZW8vc2dpdncuaAppbmRleCA1NWYyYTdjLi5mNmFhNTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL3NnaXZ3LmgKKysrIGIvaW5jbHVkZS92aWRlby9zZ2l2dy5oCkBAIC0zNTEsNyArMzUxLDcgQEAKIHN0cnVjdCBkYmVfdGltaW5nX2luZm8KIHsKICAgZGJlX3RpbWluZ190IHR5cGU7Ci0gIGludCBmbGFnczsJCQkJCisgIGludCBmbGFnczsKICAgc2hvcnQgd2lkdGg7CQkgICAgLyogTW9uaXRvciByZXNvbHV0aW9uCQkqLwogICBzaG9ydCBoZWlnaHQ7CiAgIGludCBmaWVsZHNfc2VjOwkgICAgLyogZmllbGRzL3NlYyAgKEh6IC0zIGRlYy4gcGxhY2VzICovCkBAIC0zODksMTEgKzM4OSwxMSBAQAogICB7CiAgICAgREJFX1ZUXzY0MF80ODBfNjAsCiAgICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsICAJNjQwLAkJCTQ4MCwJCTU5OTQwLAkJCTI1MTc1LAorICAgIDAsCSAgICAgICAgNjQwLAkJCTQ4MCwJCTU5OTQwLAkJCTI1MTc1LAogICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgODAwLAk2NDAsCQkgICAgODAwLAkJNjU2LAkgICAgCTc1MiwKKyAgICA4MDAsCTY0MCwJCSAgICAgICAgODAwLAkJNjU2LAkJNzUyLAogICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgNTI1LAk0ODAsCQkgICAgNTI1LAkJNDkwLAkJICAgIDQ5MiwKKyAgICA1MjUsCTQ4MCwJCSAgICAgICAgNTI1LAkJNDkwLAkJICAgIDQ5MiwKICAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KICAgICAxNSwJICAgIDIsCQkJCTMKICAgfSwKQEAgLTY1MCw3ICs2NTAsNyBAQAogICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCiAgICAgNiwgICAgICAxLCAgICAgICAgICAgICAgMAogICB9LAotCQorCiAgIHsKICAgICBEQkVfVlRfMTkyMF8xMjAwXzYwLAogICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KQEAgLTY3Niw3ICs2NzYsNiBAQAogICB9CiB9OwogCi0jZGVmaW5lIERCRV9WVF9TSVpFICAoc2l6ZW9mKGRiZVZUaW1pbmdzKS9zaXplb2YoZGJlVlRpbWluZ3NbMF0pKQogI2VuZGlmIC8vIElOQ0xVREVfVElNSU5HX1RBQkxFX0RBVEEKIAogI2VuZGlmIC8vICEgX19TR0lWV0ZCX0hfXwpkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IDJjZWFiN2YuLjA4NWJkNTggMTAwNjQ0Ci0tLSBhL2lwYy9tc2cuYworKysgYi9pcGMvbXNnLmMKQEAgLTQxMiw3ICs0MTIsNyBAQAogCQkgICAgICAgc3RydWN0IG1zcWlkX2RzIF9fdXNlciAqYnVmLCBpbnQgdmVyc2lvbikKIHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjcDsKLQlzdHJ1Y3QgbXNxaWQ2NF9kcyBtc3FpZDY0OworCXN0cnVjdCBtc3FpZDY0X2RzIHVuaW5pdGlhbGl6ZWRfdmFyKG1zcWlkNjQpOwogCXN0cnVjdCBtc2dfcXVldWUgKm1zcTsKIAlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKaW5kZXggMjJiMGE2ZS4uZTQ5ZWExYyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9zcHVyaW91cy5jCisrKyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCS8qCiAJCSAqIElmIHdlIGFyZSBzZWVpbmcgb25seSB0aGUgb2RkIHNwdXJpb3VzIElSUSBjYXVzZWQgYnkKIAkJICogYnVzIGFzeW5jaHJvbmljaXR5IHRoZW4gZG9uJ3QgZXZlbnR1YWxseSB0cmlnZ2VyIGFuIGVycm9yLAotCQkgKiBvdGhlcndpc2UgdGhlIGNvdXRlciBiZWNvbWVzIGEgZG9vbXNkYXkgdGltZXIgZm9yIG90aGVyd2lzZQorCQkgKiBvdGhlcndpc2UgdGhlIGNvdW50ZXIgYmVjb21lcyBhIGRvb21zZGF5IHRpbWVyIGZvciBvdGhlcndpc2UKIAkJICogd29ya2luZyBzeXN0ZW1zCiAJCSAqLwogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkZXNjLT5sYXN0X3VuaGFuZGxlZCArIEhaLzEwKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDZiN2RkYmEuLjQwYTk5NmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJaWYgKCF0YXNrKSB7CiAJCS8qCiAJCSAqIFBlciBjcHUgZXZlbnRzIGFyZSByZW1vdmVkIHZpYSBhbiBzbXAgY2FsbCBhbmQKLQkJICogdGhlIHJlbW92YWwgaXMgYWx3YXlzIHN1Y2Vzc2Z1bC4KKwkJICogdGhlIHJlbW92YWwgaXMgYWx3YXlzIHN1Y2Nlc3NmdWwuCiAJCSAqLwogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZXZlbnQtPmNwdSwKIAkJCQkJIF9fcGVyZl9ldmVudF9yZW1vdmVfZnJvbV9jb250ZXh0LApAQCAtODQ1LDcgKzg0NSw3IEBACiAJaWYgKCF0YXNrKSB7CiAJCS8qCiAJCSAqIFBlciBjcHUgZXZlbnRzIGFyZSBpbnN0YWxsZWQgdmlhIGFuIHNtcCBjYWxsIGFuZAotCQkgKiB0aGUgaW5zdGFsbCBpcyBhbHdheXMgc3VjZXNzZnVsLgorCQkgKiB0aGUgaW5zdGFsbCBpcyBhbHdheXMgc3VjY2Vzc2Z1bC4KIAkJICovCiAJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIF9fcGVyZl9pbnN0YWxsX2luX2NvbnRleHQsCiAJCQkJCSBldmVudCwgMSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG1fcW9zX3BhcmFtcy5jIGIva2VybmVsL3BtX3Fvc19wYXJhbXMuYwppbmRleCBkZmRlYzUyLi4zZGI0OWI5IDEwMDY0NAotLS0gYS9rZXJuZWwvcG1fcW9zX3BhcmFtcy5jCisrKyBiL2tlcm5lbC9wbV9xb3NfcGFyYW1zLmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvc19wYXJhbXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtMzQ0LDM3ICszNDMsMzMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3Fvc19yZW1vdmVfbm90aWZpZXIpOwogCi0jZGVmaW5lIFBJRF9OQU1FX0xFTiBzaXplb2YoInByb2Nlc3NfMTIzNDU2Nzg5MCIpCi1zdGF0aWMgY2hhciBuYW1lW1BJRF9OQU1FX0xFTl07CisjZGVmaW5lIFBJRF9OQU1FX0xFTiAzMgogCiBzdGF0aWMgaW50IHBtX3Fvc19wb3dlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWludCByZXQ7CiAJbG9uZyBwbV9xb3NfY2xhc3M7CisJY2hhciBuYW1lW1BJRF9OQU1FX0xFTl07CiAKLQlsb2NrX2tlcm5lbCgpOwogCXBtX3Fvc19jbGFzcyA9IGZpbmRfcG1fcW9zX29iamVjdF9ieV9taW5vcihpbWlub3IoaW5vZGUpKTsKIAlpZiAocG1fcW9zX2NsYXNzID49IDApIHsKIAkJZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilwbV9xb3NfY2xhc3M7Ci0JCXNwcmludGYobmFtZSwgInByb2Nlc3NfJWQiLCBjdXJyZW50LT5waWQpOworCQlzbnByaW50ZihuYW1lLCBQSURfTkFNRV9MRU4sICJwcm9jZXNzXyVkIiwgY3VycmVudC0+cGlkKTsKIAkJcmV0ID0gcG1fcW9zX2FkZF9yZXF1aXJlbWVudChwbV9xb3NfY2xhc3MsIG5hbWUsCiAJCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQkJaWYgKHJldCA+PSAwKSB7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CisJCWlmIChyZXQgPj0gMCkKIAkJCXJldHVybiAwOwotCQl9CiAJfQotCXVubG9ja19rZXJuZWwoKTsKLQogCXJldHVybiAtRVBFUk07CiB9CiAKIHN0YXRpYyBpbnQgcG1fcW9zX3Bvd2VyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50IHBtX3Fvc19jbGFzczsKKwljaGFyIG5hbWVbUElEX05BTUVfTEVOXTsKIAogCXBtX3Fvc19jbGFzcyA9IChsb25nKWZpbHAtPnByaXZhdGVfZGF0YTsKLQlzcHJpbnRmKG5hbWUsICJwcm9jZXNzXyVkIiwgY3VycmVudC0+cGlkKTsKKwlzbnByaW50ZihuYW1lLCBQSURfTkFNRV9MRU4sICJwcm9jZXNzXyVkIiwgY3VycmVudC0+cGlkKTsKIAlwbV9xb3NfcmVtb3ZlX3JlcXVpcmVtZW50KHBtX3Fvc19jbGFzcywgbmFtZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTM4NSwxMyArMzgwLDE0IEBACiB7CiAJczMyIHZhbHVlOwogCWludCBwbV9xb3NfY2xhc3M7CisJY2hhciBuYW1lW1BJRF9OQU1FX0xFTl07CiAKIAlwbV9xb3NfY2xhc3MgPSAobG9uZylmaWxwLT5wcml2YXRlX2RhdGE7CiAJaWYgKGNvdW50ICE9IHNpemVvZihzMzIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY29weV9mcm9tX3VzZXIoJnZhbHVlLCBidWYsIHNpemVvZihzMzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0Jc3ByaW50ZihuYW1lLCAicHJvY2Vzc18lZCIsIGN1cnJlbnQtPnBpZCk7CisJc25wcmludGYobmFtZSwgUElEX05BTUVfTEVOLCAicHJvY2Vzc18lZCIsIGN1cnJlbnQtPnBpZCk7CiAJcG1fcW9zX3VwZGF0ZV9yZXF1aXJlbWVudChwbV9xb3NfY2xhc3MsIG5hbWUsIHZhbHVlKTsKIAogCXJldHVybiAgc2l6ZW9mKHMzMik7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggOTk2OGM1Zi4uNTg1ZDZjZCAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CkBAIC0zNDksNiArMzQ4LDkgQEAKIAltYWNoaW5lX3Bvd2VyX29mZigpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX3Bvd2VyX29mZik7CisKK3N0YXRpYyBERUZJTkVfTVVURVgocmVib290X211dGV4KTsKKwogLyoKICAqIFJlYm9vdCBzeXN0ZW0gY2FsbDogZm9yIG9idmlvdXMgcmVhc29ucyBvbmx5IHJvb3QgbWF5IGNhbGwgaXQsCiAgKiBhbmQgZXZlbiByb290IG5lZWRzIHRvIHNldCB1cCBzb21lIG1hZ2ljIG51bWJlcnMgaW4gdGhlIHJlZ2lzdGVycwpAQCAtMzgxLDcgKzM4Myw3IEBACiAJaWYgKChjbWQgPT0gTElOVVhfUkVCT09UX0NNRF9QT1dFUl9PRkYpICYmICFwbV9wb3dlcl9vZmYpCiAJCWNtZCA9IExJTlVYX1JFQk9PVF9DTURfSEFMVDsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmcmVib290X211dGV4KTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUOgogCQlrZXJuZWxfcmVzdGFydChOVUxMKTsKQEAgLTM5NywyMCArMzk5LDE4IEBACiAKIAljYXNlIExJTlVYX1JFQk9PVF9DTURfSEFMVDoKIAkJa2VybmVsX2hhbHQoKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlkb19leGl0KDApOwogCQlwYW5pYygiY2Fubm90IGhhbHQiKTsKIAogCWNhc2UgTElOVVhfUkVCT09UX0NNRF9QT1dFUl9PRkY6CiAJCWtlcm5lbF9wb3dlcl9vZmYoKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlkb19leGl0KDApOwogCQlicmVhazsKIAogCWNhc2UgTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUMjoKIAkJaWYgKHN0cm5jcHlfZnJvbV91c2VyKCZidWZmZXJbMF0sIGFyZywgc2l6ZW9mKGJ1ZmZlcikgLSAxKSA8IDApIHsKLQkJCXVubG9ja19rZXJuZWwoKTsKLQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOwogCQl9CiAJCWJ1ZmZlcltzaXplb2YoYnVmZmVyKSAtIDFdID0gJ1wwJzsKIApAQCAtNDMzLDcgKzQzMyw3IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZyZWJvb3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IGQ0MjJjN2IuLmU4NWMyMzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtNjc3LDcgKzY3Nyw3IEBACiAgKiBAY291bnQ6CWxlbmd0aCBvZiBidWZmZXIKICAqCiAgKiBUYWtlcyBpbnB1dCBmcm9tIHN5c2ZzIGludGVyZmFjZSBmb3IgbWFudWFsbHkgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdAotICogY2xvY2tzb3VyY2Ugc2VsY3Rpb24uCisgKiBjbG9ja3NvdXJjZSBzZWxlY3Rpb24uCiAgKi8KIHN0YXRpYyBzc2l6ZV90IHN5c2ZzX292ZXJyaWRlX2Nsb2Nrc291cmNlKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCiAJCQkJCSAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggNjdlNTI2Yi4uZGVlNDg2NSAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtNjgsNiArNjgsMTE2IEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19XT1JLCisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyIHdvcmtfZGVidWdfZGVzY3I7CisKKy8qCisgKiBmaXh1cF9pbml0IGlzIGNhbGxlZCB3aGVuOgorICogLSBhbiBhY3RpdmUgb2JqZWN0IGlzIGluaXRpYWxpemVkCisgKi8KK3N0YXRpYyBpbnQgd29ya19maXh1cF9pbml0KHZvaWQgKmFkZHIsIGVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9IGFkZHI7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPREVCVUdfU1RBVEVfQUNUSVZFOgorCQljYW5jZWxfd29ya19zeW5jKHdvcmspOworCQlkZWJ1Z19vYmplY3RfaW5pdCh3b3JrLCAmd29ya19kZWJ1Z19kZXNjcik7CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIGZpeHVwX2FjdGl2YXRlIGlzIGNhbGxlZCB3aGVuOgorICogLSBhbiBhY3RpdmUgb2JqZWN0IGlzIGFjdGl2YXRlZAorICogLSBhbiB1bmtub3duIG9iamVjdCBpcyBhY3RpdmF0ZWQgKG1pZ2h0IGJlIGEgc3RhdGljYWxseSBpbml0aWFsaXplZCBvYmplY3QpCisgKi8KK3N0YXRpYyBpbnQgd29ya19maXh1cF9hY3RpdmF0ZSh2b2lkICphZGRyLCBlbnVtIGRlYnVnX29ial9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsgPSBhZGRyOworCisJc3dpdGNoIChzdGF0ZSkgeworCisJY2FzZSBPREVCVUdfU1RBVEVfTk9UQVZBSUxBQkxFOgorCQkvKgorCQkgKiBUaGlzIGlzIG5vdCByZWFsbHkgYSBmaXh1cC4gVGhlIHdvcmsgc3RydWN0IHdhcworCQkgKiBzdGF0aWNhbGx5IGluaXRpYWxpemVkLiBXZSBqdXN0IG1ha2Ugc3VyZSB0aGF0IGl0CisJCSAqIGlzIHRyYWNrZWQgaW4gdGhlIG9iamVjdCB0cmFja2VyLgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KFdPUktfU1RSVUNUX1NUQVRJQywgd29ya19kYXRhX2JpdHMod29yaykpKSB7CisJCQlkZWJ1Z19vYmplY3RfaW5pdCh3b3JrLCAmd29ya19kZWJ1Z19kZXNjcik7CisJCQlkZWJ1Z19vYmplY3RfYWN0aXZhdGUod29yaywgJndvcmtfZGVidWdfZGVzY3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJV0FSTl9PTl9PTkNFKDEpOworCQlyZXR1cm4gMDsKKworCWNhc2UgT0RFQlVHX1NUQVRFX0FDVElWRToKKwkJV0FSTl9PTigxKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIGZpeHVwX2ZyZWUgaXMgY2FsbGVkIHdoZW46CisgKiAtIGFuIGFjdGl2ZSBvYmplY3QgaXMgZnJlZWQKKyAqLworc3RhdGljIGludCB3b3JrX2ZpeHVwX2ZyZWUodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrID0gYWRkcjsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE9ERUJVR19TVEFURV9BQ1RJVkU6CisJCWNhbmNlbF93b3JrX3N5bmMod29yayk7CisJCWRlYnVnX29iamVjdF9mcmVlKHdvcmssICZ3b3JrX2RlYnVnX2Rlc2NyKTsKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGRlYnVnX29ial9kZXNjciB3b3JrX2RlYnVnX2Rlc2NyID0geworCS5uYW1lCQk9ICJ3b3JrX3N0cnVjdCIsCisJLmZpeHVwX2luaXQJPSB3b3JrX2ZpeHVwX2luaXQsCisJLmZpeHVwX2FjdGl2YXRlCT0gd29ya19maXh1cF9hY3RpdmF0ZSwKKwkuZml4dXBfZnJlZQk9IHdvcmtfZml4dXBfZnJlZSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z193b3JrX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlkZWJ1Z19vYmplY3RfYWN0aXZhdGUod29yaywgJndvcmtfZGVidWdfZGVzY3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfd29ya19kZWFjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlkZWJ1Z19vYmplY3RfZGVhY3RpdmF0ZSh3b3JrLCAmd29ya19kZWJ1Z19kZXNjcik7Cit9CisKK3ZvaWQgX19pbml0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCBpbnQgb25zdGFjaykKK3sKKwlpZiAob25zdGFjaykKKwkJZGVidWdfb2JqZWN0X2luaXRfb25fc3RhY2sod29yaywgJndvcmtfZGVidWdfZGVzY3IpOworCWVsc2UKKwkJZGVidWdfb2JqZWN0X2luaXQod29yaywgJndvcmtfZGVidWdfZGVzY3IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19pbml0X3dvcmspOworCit2b2lkIGRlc3Ryb3lfd29ya19vbl9zdGFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJZGVidWdfb2JqZWN0X2ZyZWUod29yaywgJndvcmtfZGVidWdfZGVzY3IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVzdHJveV93b3JrX29uX3N0YWNrKTsKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z193b3JrX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfd29ya19kZWFjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyB9CisjZW5kaWYKKwogLyogU2VyaWFsaXplcyB0aGUgYWNjZXNzZXMgdG8gdGhlIGxpc3Qgb2Ygd29ya3F1ZXVlcy4gKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sod29ya3F1ZXVlX2xvY2spOwogc3RhdGljIExJU1RfSEVBRCh3b3JrcXVldWVzKTsKQEAgLTE0NSw2ICsyNTUsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlkZWJ1Z193b3JrX2FjdGl2YXRlKHdvcmspOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjd3EtPmxvY2ssIGZsYWdzKTsKIAlpbnNlcnRfd29yayhjd3EsIHdvcmssICZjd3EtPndvcmtsaXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjd3EtPmxvY2ssIGZsYWdzKTsKQEAgLTI4MCw2ICszOTEsNyBAQAogCQlzdHJ1Y3QgbG9ja2RlcF9tYXAgbG9ja2RlcF9tYXAgPSB3b3JrLT5sb2NrZGVwX21hcDsKICNlbmRpZgogCQl0cmFjZV93b3JrcXVldWVfZXhlY3V0aW9uKGN3cS0+dGhyZWFkLCB3b3JrKTsKKwkJZGVidWdfd29ya19kZWFjdGl2YXRlKHdvcmspOwogCQljd3EtPmN1cnJlbnRfd29yayA9IHdvcms7CiAJCWxpc3RfZGVsX2luaXQoY3dxLT53b3JrbGlzdC5uZXh0KTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZjd3EtPmxvY2spOwpAQCAtMzUwLDExICs0NjIsMTggQEAKIHN0YXRpYyB2b2lkIGluc2VydF93cV9iYXJyaWVyKHN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxLAogCQkJc3RydWN0IHdxX2JhcnJpZXIgKmJhcnIsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0JSU5JVF9XT1JLKCZiYXJyLT53b3JrLCB3cV9iYXJyaWVyX2Z1bmMpOworCS8qCisJICogZGVidWdvYmplY3QgY2FsbHMgYXJlIHNhZmUgaGVyZSBldmVuIHdpdGggY3dxLT5sb2NrIGxvY2tlZAorCSAqIGFzIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGlzIHdpbGwgbm90IHRyaWdnZXIgYW55IG9mIHRoZQorCSAqIGNoZWNrcyBhbmQgY2FsbCBiYWNrIGludG8gdGhlIGZpeHVwIGZ1bmN0aW9ucyB3aGVyZSB3ZQorCSAqIG1pZ2h0IGRlYWRsb2NrLgorCSAqLworCUlOSVRfV09SS19PTl9TVEFDSygmYmFyci0+d29yaywgd3FfYmFycmllcl9mdW5jKTsKIAlfX3NldF9iaXQoV09SS19TVFJVQ1RfUEVORElORywgd29ya19kYXRhX2JpdHMoJmJhcnItPndvcmspKTsKIAogCWluaXRfY29tcGxldGlvbigmYmFyci0+ZG9uZSk7CiAKKwlkZWJ1Z193b3JrX2FjdGl2YXRlKCZiYXJyLT53b3JrKTsKIAlpbnNlcnRfd29yayhjd3EsICZiYXJyLT53b3JrLCBoZWFkKTsKIH0KIApAQCAtMzcyLDggKzQ5MSwxMCBAQAogCX0KIAlzcGluX3VubG9ja19pcnEoJmN3cS0+bG9jayk7CiAKLQlpZiAoYWN0aXZlKQorCWlmIChhY3RpdmUpIHsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmYmFyci5kb25lKTsKKwkJZGVzdHJveV93b3JrX29uX3N0YWNrKCZiYXJyLndvcmspOworCX0KIAogCXJldHVybiBhY3RpdmU7CiB9CkBAIC00NTEsNiArNTcyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZiYXJyLmRvbmUpOworCWRlc3Ryb3lfd29ya19vbl9zdGFjaygmYmFyci53b3JrKTsKIAlyZXR1cm4gMTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZsdXNoX3dvcmspOwpAQCAtNDg1LDYgKzYwNyw3IEBACiAJCSAqLwogCQlzbXBfcm1iKCk7CiAJCWlmIChjd3EgPT0gZ2V0X3dxX2RhdGEod29yaykpIHsKKwkJCWRlYnVnX3dvcmtfZGVhY3RpdmF0ZSh3b3JrKTsKIAkJCWxpc3RfZGVsX2luaXQoJndvcmstPmVudHJ5KTsKIAkJCXJldCA9IDE7CiAJCX0KQEAgLTUwNyw4ICs2MzAsMTAgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjd3EtPmxvY2spOwogCi0JaWYgKHVubGlrZWx5KHJ1bm5pbmcpKQorCWlmICh1bmxpa2VseShydW5uaW5nKSkgewogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZiYXJyLmRvbmUpOworCQlkZXN0cm95X3dvcmtfb25fc3RhY2soJmJhcnIud29yayk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB3YWl0X29uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCAwYjhmMzU5Li4yZjIyY2Y0IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJYm9vbCAiRW5hYmxlIGZ1bGwgU2VjdGlvbiBtaXNtYXRjaCBhbmFseXNpcyIKIAlkZXBlbmRzIG9uIFVOREVGSU5FRAogCSMgVGhpcyBvcHRpb24gaXMgb24gcHVycG9zZSBkaXNhYmxlZCBmb3Igbm93LgotCSMgSXQgd2lsbCBiZSBlbmFibGVkIHdoZW4gd2UgYXJlIGRvd24gdG8gYSByZXNvbmFibGUgbnVtYmVyCisJIyBJdCB3aWxsIGJlIGVuYWJsZWQgd2hlbiB3ZSBhcmUgZG93biB0byBhIHJlYXNvbmFibGUgbnVtYmVyCiAJIyBvZiBzZWN0aW9uIG1pc21hdGNoIHdhcm5pbmdzICg8IDEwIGZvciBhbiBhbGx5ZXNjb25maWcgYnVpbGQpCiAJaGVscAogCSAgVGhlIHNlY3Rpb24gbWlzbWF0Y2ggYW5hbHlzaXMgY2hlY2tzIGlmIHRoZXJlIGFyZSBpbGxlZ2FsCkBAIC0yOTgsNiArMjk4LDE0IEBACiAJICB0aW1lciByb3V0aW5lcyB0byB0cmFjayB0aGUgbGlmZSB0aW1lIG9mIHRpbWVyIG9iamVjdHMgYW5kCiAJICB2YWxpZGF0ZSB0aGUgdGltZXIgb3BlcmF0aW9ucy4KIAorY29uZmlnIERFQlVHX09CSkVDVFNfV09SSworCWJvb2wgIkRlYnVnIHdvcmsgb2JqZWN0cyIKKwlkZXBlbmRzIG9uIERFQlVHX09CSkVDVFMKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgYWRkaXRpb25hbCBjb2RlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUKKwkgIHdvcmsgcXVldWUgcm91dGluZXMgdG8gdHJhY2sgdGhlIGxpZmUgdGltZSBvZiB3b3JrIG9iamVjdHMgYW5kCisJICB2YWxpZGF0ZSB0aGUgd29yayBvcGVyYXRpb25zLgorCiBjb25maWcgREVCVUdfT0JKRUNUU19FTkFCTEVfREVGQVVMVAogCWludCAiZGVidWdfb2JqZWN0cyBib290dXAgZGVmYXVsdCB2YWx1ZSAoMC0xKSIKICAgICAgICAgcmFuZ2UgMCAxCmRpZmYgLS1naXQgYS9saWIvZGVjb21wcmVzc19idW56aXAyLmMgYi9saWIvZGVjb21wcmVzc19idW56aXAyLmMKaW5kZXggNjAwZjQ3My4uNzYwNzQyMCAxMDA2NDQKLS0tIGEvbGliL2RlY29tcHJlc3NfYnVuemlwMi5jCisrKyBiL2xpYi9kZWNvbXByZXNzX2J1bnppcDIuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJCSAgIGFnYWluIHdoZW4gdXNpbmcgdGhlbSAoZHVyaW5nIHN5bWJvbCBkZWNvZGluZykuKi8KIAkJYmFzZSA9IGh1Zkdyb3VwLT5iYXNlLTE7CiAJCWxpbWl0ID0gaHVmR3JvdXAtPmxpbWl0LTE7Ci0JCS8qIENhbGN1bGF0ZSBwZXJtdXRlW10uICBDb25jdXJlbnRseSwgaW5pdGlhbGl6ZQorCQkvKiBDYWxjdWxhdGUgcGVybXV0ZVtdLiAgQ29uY3VycmVudGx5LCBpbml0aWFsaXplCiAJCSAqIHRlbXBbXSBhbmQgbGltaXRbXS4gKi8KIAkJcHAgPSAwOwogCQlmb3IgKGkgPSBtaW5MZW47IGkgPD0gbWF4TGVuOyBpKyspIHsKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCBjZTZiN2VhLi5kOWIwOGUwIDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAkJICogdGltZXMuIFdpdGhvdXQgYSBoYXJkd2FyZSBJT01NVSB0aGlzIHJlc3VsdHMgaW4gdGhlCiAJCSAqIHNhbWUgZGV2aWNlIGFkZHJlc3NlcyBiZWluZyBwdXQgaW50byB0aGUgZG1hLWRlYnVnCiAJCSAqIGhhc2ggbXVsdGlwbGUgdGltZXMgdG9vLiBUaGlzIGNhbiByZXN1bHQgaW4gZmFsc2UKLQkJICogcG9zaXRpdmVzIGJlaW5nIHJlcG9ydGVkLiBUaGVyZm9yZSB3ZSBpbXBsZW1lbnQgYQorCQkgKiBwb3NpdGl2ZXMgYmVpbmcgcmVwb3J0ZWQuIFRoZXJlZm9yZSB3ZSBpbXBsZW1lbnQgYQogCQkgKiBiZXN0LWZpdCBhbGdvcml0aG0gaGVyZSB3aGljaCByZXR1cm5zIHRoZSBlbnRyeSBmcm9tCiAJCSAqIHRoZSBoYXNoIHdoaWNoIGZpdHMgYmVzdCB0byB0aGUgcmVmZXJlbmNlIHZhbHVlCiAJCSAqIGluc3RlYWQgb2YgdGhlIGZpcnN0LWZpdC4KZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCA4MGNhOWFjLi4xY2FjNzI2IDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC0yODEsNyArMjgxLDcgQEAKIC8qKgogICogaWRyX2dldF9uZXdfYWJvdmUgLSBhbGxvY2F0ZSBuZXcgaWRyIGVudHJ5IGFib3ZlIG9yIGVxdWFsIHRvIGEgc3RhcnQgaWQKICAqIEBpZHA6IGlkciBoYW5kbGUKLSAqIEBwdHI6IHBvaW50ZXIgeW91IHdhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZGUKKyAqIEBwdHI6IHBvaW50ZXIgeW91IHdhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZAogICogQHN0YXJ0X2lkOiBpZCB0byBzdGFydCBzZWFyY2ggYXQKICAqIEBpZDogcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGhhbmRsZQogICoKQEAgLTMxMyw3ICszMTMsNyBAQAogLyoqCiAgKiBpZHJfZ2V0X25ldyAtIGFsbG9jYXRlIG5ldyBpZHIgZW50cnkKICAqIEBpZHA6IGlkciBoYW5kbGUKLSAqIEBwdHI6IHBvaW50ZXIgeW91IHdhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZGUKKyAqIEBwdHI6IHBvaW50ZXIgeW91IHdhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZAogICogQGlkOiBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgaGFuZGxlCiAgKgogICogVGhpcyBpcyB0aGUgYWxsb2NhdGUgaWQgZnVuY3Rpb24uICBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggYW55CmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCA3OTU0NzJkLi41YmMwMTgwIDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCiAJLyoKIAkgKiBSZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgZnJlZSBsaXN0IGJ5IHNldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBlbnRyaWVzIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgY29udGlnb3VzIGVudHJpZXMgYXZhaWxhYmxlLgorCSAqIGVudHJpZXMgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGVudHJpZXMgYXZhaWxhYmxlLgogCSAqIFdoaWxlIHJldHVybmluZyB0aGUgZW50cmllcyB0byB0aGUgZnJlZSBsaXN0LCB3ZSBtZXJnZSB0aGUgZW50cmllcwogCSAqIHdpdGggc2xvdHMgYmVsb3cgYW5kIGFib3ZlIHRoZSBwb29sIGJlaW5nIHJldHVybmVkLgogCSAqLwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGVmMTY5ZjMuLmMzZDM1MDYgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTE4NDQsNyArMTg0NCw3IEBACiAKIC8qCiAgKiBDb3B5IGFzIG11Y2ggYXMgd2UgY2FuIGludG8gdGhlIHBhZ2UgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoCi0gKiB3ZXJlIHN1Y2Vzc2Z1bGx5IGNvcGllZC4gIElmIGEgZmF1bHQgaXMgZW5jb3VudGVyZWQgdGhlbiByZXR1cm4gdGhlIG51bWJlciBvZgorICogd2VyZSBzdWNjZXNzZnVsbHkgY29waWVkLiAgSWYgYSBmYXVsdCBpcyBlbmNvdW50ZXJlZCB0aGVuIHJldHVybiB0aGUgbnVtYmVyIG9mCiAgKiBieXRlcyB3aGljaCB3ZXJlIGNvcGllZC4KICAqLwogc2l6ZV90IGlvdl9pdGVyX2NvcHlfZnJvbV91c2VyX2F0b21pYyhzdHJ1Y3QgcGFnZSAqcGFnZSwKZGlmZiAtLWdpdCBhL21tL2ttZW1sZWFrLmMgYi9tbS9rbWVtbGVhay5jCmluZGV4IDhiZjc2NWMuLjEzZjMzYjMgMTAwNjQ0Ci0tLSBhL21tL2ttZW1sZWFrLmMKKysrIGIvbW0va21lbWxlYWsuYwpAQCAtMTA1MCw4ICsxMDUwLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoKLQkgKiBPbmNlIHRoZSBvYmplY3QtPmxvY2sgaXMgYXF1aXJlZCwgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IGJsb2NrCi0JICogY2Fubm90IGJlIGZyZWVkICh0aGUgc2FtZSBsb2NrIGlzIGFxdWlyZWQgaW4gZGVsZXRlX29iamVjdCkuCisJICogT25jZSB0aGUgb2JqZWN0LT5sb2NrIGlzIGFjcXVpcmVkLCB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgYmxvY2sKKwkgKiBjYW5ub3QgYmUgZnJlZWQgKHRoZSBzYW1lIGxvY2sgaXMgYWNxdWlyZWQgaW4gZGVsZXRlX29iamVjdCkuCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOwogCWlmIChvYmplY3QtPmZsYWdzICYgT0JKRUNUX05PX1NDQU4pCmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggZjk5ZjU5OS4uYzMxYTMxMCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJaW50CXByZXZfcHJpb3JpdHk7CS8qIGZvciByZWNvcmRpbmcgcmVjbGFpbSBwcmlvcml0eSAqLwogCiAJLyoKLQkgKiBXaGlsZSByZWNsYWltaW5nIGluIGEgaGllYXJjaHksIHdlIGNhY2hlIHRoZSBsYXN0IGNoaWxkIHdlCisJICogV2hpbGUgcmVjbGFpbWluZyBpbiBhIGhpZXJhcmNoeSwgd2UgY2FjaGUgdGhlIGxhc3QgY2hpbGQgd2UKIAkgKiByZWNsYWltZWQgZnJvbS4KIAkgKi8KIAlpbnQgbGFzdF9zY2FubmVkX2NoaWxkOwpAQCAtMTcyMCw3ICsxNzIwLDcgQEAKIC8qCiAgKiBXaGlsZSBzd2FwLWluLCB0cnlfY2hhcmdlIC0+IGNvbW1pdCBvciBjYW5jZWwsIHRoZSBwYWdlIGlzIGxvY2tlZC4KICAqIEFuZCB3aGVuIHRyeV9jaGFyZ2UoKSBzdWNjZXNzZnVsbHkgcmV0dXJucywgb25lIHJlZmNudCB0byBtZW1jZyB3aXRob3V0Ci0gKiBzdHJ1Y3QgcGFnZV9jZ3JvdXAgaXMgYXF1aXJlZC4gVGhpcyByZWZjbnQgd2lsbCBiZSBjdW1zdW1lZCBieQorICogc3RydWN0IHBhZ2VfY2dyb3VwIGlzIGFjcXVpcmVkLiBUaGlzIHJlZmNudCB3aWxsIGJlIGNvbnN1bWVkIGJ5CiAgKiAiY29tbWl0KCkiIG9yIHJlbW92ZWQgYnkgImNhbmNlbCgpIgogICovCiBpbnQgbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKQEAgLTI0NjYsNyArMjQ2Niw3IEBACiAKIAljZ3JvdXBfbG9jaygpOwogCS8qCi0JICogSWYgcGFyZW50J3MgdXNlX2hpZWFyY2h5IGlzIHNldCwgd2UgY2FuJ3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucworCSAqIElmIHBhcmVudCdzIHVzZV9oaWVyYXJjaHkgaXMgc2V0LCB3ZSBjYW4ndCBtYWtlIGFueSBtb2RpZmljYXRpb25zCiAJICogaW4gdGhlIGNoaWxkIHN1YnRyZWVzLiBJZiBpdCBpcyB1bnNldCwgdGhlbiB0aGUgY2hhbmdlIGNhbgogCSAqIG9jY3VyLCBwcm92aWRlZCB0aGUgY3VycmVudCBjZ3JvdXAgaGFzIG5vIGNoaWxkcmVuLgogCSAqCmRpZmYgLS1naXQgYS9tbS9tZW1vcnktZmFpbHVyZS5jIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwppbmRleCBkYWNjNjQxLi4xYWM0OWZlIDEwMDY0NAotLS0gYS9tbS9tZW1vcnktZmFpbHVyZS5jCisrKyBiL21tL21lbW9yeS1mYWlsdXJlLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAodGssIG5leHQsIHRvX2tpbGwsIG5kKSB7CiAJCWlmIChkb2l0KSB7CiAJCQkvKgotCQkJICogSW4gY2FzZSBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIG11bm1hcGluZworCQkJICogSW4gY2FzZSBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIG11bm1hcHBpbmcKIAkJCSAqIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBkb2Vzbid0IGNhdGNoIHRoZQogCQkJICogc2lnbmFsIGFuZCB0aGVuIGFjY2VzcyB0aGUgbWVtb3J5LiBKdXN0IGtpbGwgaXQuCiAJCQkgKiB0aGUgc2lnbmFsIGhhbmRsZXJzCmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCA0NTBjZWJkLi4yYzE0N2E3IDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTQ5MCw3ICs0OTAsNyBAQAogICogQW55IHBhZ2VzIHdoaWNoIGFyZSBmb3VuZCB0byBiZSBtYXBwZWQgaW50byBwYWdldGFibGVzIGFyZSB1bm1hcHBlZCBwcmlvciB0bwogICogaW52YWxpZGF0aW9uLgogICoKLSAqIFJldHVybnMgLUVJTyBpZiBhbnkgcGFnZXMgY291bGQgbm90IGJlIGludmFsaWRhdGVkLgorICogUmV0dXJucyAtRUJVU1kgaWYgYW55IHBhZ2VzIGNvdWxkIG5vdCBiZSBpbnZhbGlkYXRlZC4KICAqLwogaW50IGludmFsaWRhdGVfaW5vZGVfcGFnZXMyKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQogewpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggMjliMWIyMi4uZWYwOWM3YiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgdm9pZCBfX2JuZXBfbGlua19zZXNzaW9uKHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCiB7CiAJLyogSXQncyBzYWZlIHRvIGNhbGwgX19tb2R1bGVfZ2V0KCkgaGVyZSBiZWNhdXNlIHNlc3Npb25zIGFyZSBhZGRlZAotCSAgIGJ5IHRoZSBzb2NrZXQgbGF5ZXIgd2hpY2ggaGFzIHRvIGhvbGQgdGhlIHJlZmZlcmVuY2UgdG8gdGhpcyBtb2R1bGUuCisJICAgYnkgdGhlIHNvY2tldCBsYXllciB3aGljaCBoYXMgdG8gaG9sZCB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgbW9kdWxlLgogCSAqLwogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJbGlzdF9hZGQoJnMtPmxpc3QsICZibmVwX3Nlc3Npb25fbGlzdCk7CkBAIC02MzIsNyArNjMyLDcgQEAKIAlzID0gX19ibmVwX2dldF9zZXNzaW9uKHJlcS0+ZHN0KTsKIAlpZiAocykgewogCQkvKiBXYWtldXAgdXNlci1zcGFjZSB3aGljaCBpcyBwb2xsaW5nIGZvciBzb2NrZXQgZXJyb3JzLgotCQkgKiBUaGlzIGlzIHRlbXBvcmFyeSBoYWNrIHVudGlsbCB3ZSBoYXZlIHNodXRkb3duIGluIEwyQ0FQICovCisJCSAqIFRoaXMgaXMgdGVtcG9yYXJ5IGhhY2sgdW50aWwgd2UgaGF2ZSBzaHV0ZG93biBpbiBMMkNBUCAqLwogCQlzLT5zb2NrLT5zay0+c2tfZXJyID0gRVVOQVRDSDsKIAogCQkvKiBLaWxsIHNlc3Npb24gdGhyZWFkICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwppbmRleCA1NDllMjA2Li5lYTVjZWEyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGNwaDsKIAlfX2JlMTYgb2xkdmFsOwogCi0JLyogTm90IGVub3VnaHQgaGVhZGVyPyAqLworCS8qIE5vdCBlbm91Z2ggaGVhZGVyPyAqLwogCXRjcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAoIXRjcGgpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFwLmMgYi9uZXQvaXJkYS9pcmxhcC5jCmluZGV4IDM1NmU2NWIuLjc4M2M1ZjMgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFwLmMKKysrIGIvbmV0L2lyZGEvaXJsYXAuYwpAQCAtNDUwLDEwICs0NTAsMTAgQEAKIAogCS8qIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgcmlnaHQgc3RhdGUgZm9yIGRpc2Nvbm5lY3RpbmcgKi8KIAlzd2l0Y2ggKHNlbGYtPnN0YXRlKSB7Ci0JY2FzZSBMQVBfWE1JVF9QOiAgICAgICAgLyogRkFMTFRST1VHSCAqLwotCWNhc2UgTEFQX1hNSVRfUzogICAgICAgIC8qIEZBTExUUk9VR0ggKi8KLQljYXNlIExBUF9DT05OOiAgICAgICAgICAvKiBGQUxMVFJPVUdIICovCi0JY2FzZSBMQVBfUkVTRVRfV0FJVDogICAgLyogRkFMTFRST1VHSCAqLworCWNhc2UgTEFQX1hNSVRfUDogICAgICAgIC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBMQVBfWE1JVF9TOiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIExBUF9DT05OOiAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgTEFQX1JFU0VUX1dBSVQ6ICAgIC8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBMQVBfUkVTRVRfQ0hFQ0s6CiAJCWlybGFwX2RvX2V2ZW50KHNlbGYsIERJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCwgTlVMTCk7CiAJCWJyZWFrOwpAQCAtNDg1LDkgKzQ4NSw5IEBACiAJCUlSREFfREVCVUcoMSwgIiVzKCksIFNlbmRpbmcgcmVzZXQgcmVxdWVzdCFcbiIsIF9fZnVuY19fKTsKIAkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVTRVRfUkVRVUVTVCwgTlVMTCwgTlVMTCk7CiAJCWJyZWFrOwotCWNhc2UgTEFQX05PX1JFU1BPTlNFOgkgICAvKiBGQUxMVFJPVUdIICovCi0JY2FzZSBMQVBfRElTQ19JTkRJQ0FUSU9OOiAgLyogRkFMTFRST1VHSCAqLwotCWNhc2UgTEFQX0ZPVU5EX05PTkU6ICAgICAgIC8qIEZBTExUUk9VR0ggKi8KKwljYXNlIExBUF9OT19SRVNQT05TRToJICAgLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIExBUF9ESVNDX0lORElDQVRJT046ICAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgTEFQX0ZPVU5EX05PTkU6ICAgICAgIC8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBMQVBfTUVESUFfQlVTWToKIAkJaXJsbXBfbGlua19kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAogCQkJCQkJIHJlYXNvbiwgTlVMTCk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcF9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYwppbmRleCBjNWM1MTk1Li45NGE5ODg0IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhcF9ldmVudC5jCisrKyBiL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKQEAgLTE3NDEsNyArMTc0MSw3IEBACiAgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV94bWl0X3MgKGV2ZW50LCBza2IsIGluZm8pCiAgKgogICogICBYTUlUX1MsIFRoZSBzZWNvbmRhcnkgc3RhdGlvbiBoYXMgYmVlbiBnaXZlbiB0aGUgcmlnaHQgdG8gdHJhbnNtaXQsCi0gKiAgIGFuZCB3ZSB0aGVyZWZvciBkbyBub3QgZXhwZWN0IHRvIHJlY2VpdmUgYW55IHRyYW5zbWlzc2lvbnMgZnJvbSBvdGhlcgorICogICBhbmQgd2UgdGhlcmVmb3JlIGRvIG5vdCBleHBlY3QgdG8gcmVjZWl2ZSBhbnkgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCiAgKiAgIHN0YXRpb25zLgogICovCiBzdGF0aWMgaW50IGlybGFwX3N0YXRlX3htaXRfcyhzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsbXAuYyBiL25ldC9pcmRhL2lybG1wLmMKaW5kZXggN2JmNWI5MS4uMGU3ZDhiZCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsbXAuYworKysgYi9uZXQvaXJkYS9pcmxtcC5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogCWluaXRfdGltZXIoJmlybG1wLT5kaXNjb3ZlcnlfdGltZXIpOwogCi0JLyogRG8gZGlzY292ZXJ5IGV2ZXJ5IDMgc2Vjb25kcywgY29uZGl0aW9uYWx5ICovCisJLyogRG8gZGlzY292ZXJ5IGV2ZXJ5IDMgc2Vjb25kcywgY29uZGl0aW9uYWxseSAqLwogCWlmIChzeXNjdGxfZGlzY292ZXJ5KQogCQlpcmxtcF9zdGFydF9kaXNjb3ZlcnlfdGltZXIoaXJsbXAsCiAJCQkJCSAgICBzeXNjdGxfZGlzY292ZXJ5X3RpbWVvdXQqSFopOwpAQCAtMTg0Miw3ICsxODQyLDcgQEAKIAkJcmVhc29uID0gTE1fQ09OTkVDVF9GQUlMVVJFOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3cgSXJMQVAgZGlzY29ubmVjdCByZWFzb24gJWQhXG4iLAorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIElyTEFQIGRpc2Nvbm5lY3QgcmVhc29uICVkIVxuIiwKIAkJCSAgIF9fZnVuY19fLCBsYXBfcmVhc29uKTsKIAkJcmVhc29uID0gTE1fTEFQX0RJU0NPTk5FQ1Q7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCmluZGV4IGE4ZGEyMzkuLjAxOTJjZmQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogICogQGFkZHI6IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHBhdGggKEVUSF9BTEVOIGxlbmd0aCkKICAqIEBzZGF0YTogbG9jYWwgc3ViaWYKICAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2VzcworICogUmV0dXJuczogMCBvbiBzdWNjZXNzCiAgKgogICogU3RhdGU6IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBuZXcgcGF0aCBpcyBzZXQgdG8gMAogICovCkBAIC01MzIsNyArNTMyLDcgQEAKICAqIEBhZGRyOiBkc3QgYWRkcmVzcyAoRVRIX0FMRU4gbGVuZ3RoKQogICogQHNkYXRhOiBsb2NhbCBzdWJpZgogICoKLSAqIFJldHVybnM6IDAgaWYgc3VjY2VzZnVsCisgKiBSZXR1cm5zOiAwIGlmIHN1Y2Nlc3NmdWwKICAqLwogaW50IG1lc2hfcGF0aF9kZWwodTggKmFkZHIsIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKaW5kZXggN2ExMGJiZS4uYzVkOWY5NyAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCkBAIC02ODIsNyArNjgyLDcgQEAKICAqIGJ1Y2tldHMgYW5kIEBza2lwX2NoYWluIGVudHJpZXMuICBGb3IgZWFjaCBlbnRyeSBpbiB0aGUgdGFibGUgY2FsbAogICogQGNhbGxiYWNrLCBpZiBAY2FsbGJhY2sgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIHN0b3AgJ3dhbGtpbmcnIHRocm91Z2ggdGhlCiAgKiB0YWJsZSBhbmQgcmV0dXJuLiAgVXBkYXRlcyB0aGUgdmFsdWVzIGluIEBza2lwX2JrdCBhbmQgQHNraXBfY2hhaW4gb24KLSAqIHJldHVybi4gIFJldHVybnMgemVybyBvbiBzdWNjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKiByZXR1cm4uICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCiBpbnQgbmV0bGJsX2RvbWhzaF93YWxrKHUzMiAqc2tpcF9ia3QsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2FwaS5jIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwppbmRleCAyYTc0MDAzLi42NGY1ZTMyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2FwaS5jCisrKyBiL25ldC9zY2hlZC9hY3RfYXBpLmMKQEAgLTU5OCw3ICs1OTgsNyBAQAogCQlnb3RvIGVycm91dDsKIAogCS8qIGNvbXBhdF9tb2RlIGJlaW5nIHRydWUgc3BlY2lmaWVzIGEgY2FsbCB0aGF0IGlzIHN1cHBvc2VkCi0JICogdG8gYWRkIGFkZGl0aW9uYWwgYmFja3dhcmQgY29tcGF0aWJsaXR5IHN0YXRpc3RpYyBUTFZzLgorCSAqIHRvIGFkZCBhZGRpdGlvbmFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc3RhdGlzdGljIFRMVnMuCiAJICovCiAJaWYgKGNvbXBhdF9tb2RlKSB7CiAJCWlmIChhLT50eXBlID09IFRDQV9PTERfQ09NUEFUKQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCmluZGV4IGQ3NzFjYzEuLjRlNGNhNjUgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYworKysgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKQEAgLTcxNyw3ICs3MTcsNyBAQAogCiAJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkpIHsKIAkJLyogQ2hhbmdlIHRoZSBzay0+c2tfc3RhdGUgb2YgYSBUQ1Atc3R5bGUgc29ja2V0IHRoYXQgaGFzCi0JCSAqIHN1Y2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGNvbm5lY3QoKSBjYWxsLgorCQkgKiBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGEgY29ubmVjdCgpIGNhbGwuCiAJCSAqLwogCQlpZiAoc2N0cF9zdGF0ZShhc29jLCBFU1RBQkxJU0hFRCkgJiYgc2N0cF9zc3RhdGUoc2ssIENMT1NFRCkpCiAJCQlzay0+c2tfc3RhdGUgPSBTQ1RQX1NTX0VTVEFCTElTSEVEOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwppbmRleCAxZWY5ZGU5Li40N2JjMjBkIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtMzU3Nyw3ICszNTc3LDcgQEAKIAkgKiBUbyBkbyB0aGlzIHByb3Blcmx5LCB3ZSdsbCBzZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIGNodW5rCiAJICogYW5kIGF0IHRoZSB0cmFuc21pdCB0aW1lLCB3aWxsIHRyeSBsb29rIHVwIHRoZSB0cmFuc3BvcnQgdG8gdXNlLgogCSAqIFNpbmNlIEFTQ09ORnMgbWF5IGJlIGJ1bmRsZWQsIHRoZSBjb3JyZWN0IHRyYW5zcG9ydCBtYXkgbm90IGJlCi0JICogY3JlYXRlZCB1bnRpbGwgd2UgcHJvY2VzcyB0aGUgZW50aXJlIHBhY2tldCwgdGh1cyB0aGlzIHdvcmthcm91bmQuCisJICogY3JlYXRlZCB1bnRpbCB3ZSBwcm9jZXNzIHRoZSBlbnRpcmUgcGFja2V0LCB0aHVzIHRoaXMgd29ya2Fyb3VuZC4KIAkgKi8KIAlhc2NvbmZfYWNrLT5kZXN0ID0gY2h1bmstPnNvdXJjZTsKIAlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKGFzY29uZl9hY2spKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfc2VuZHRvLmMgYi9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3NlbmR0by5jCmluZGV4IGYxMWJlNzIuLmIxNWUxZWIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfc2VuZHRvLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV9zZW5kdG8uYwpAQCAtNTQsNyArNTQsNyBAQAogICogQXNzdW1wdGlvbnM6CiAgKiAtIGhlYWRbMF0gaXMgcGh5c2ljYWxseSBjb250aWd1b3VzLgogICogLSB0YWlsWzBdIGlzIHBoeXNpY2FsbHkgY29udGlndW91cy4KLSAqIC0gcGFnZXNbXSBpcyBub3QgcGh5c2ljYWxseSBvciB2aXJ0dWFsbHkgY29udGlnb3VzIGFuZCBjb25zaXN0cyBvZgorICogLSBwYWdlc1tdIGlzIG5vdCBwaHlzaWNhbGx5IG9yIHZpcnR1YWxseSBjb250aWd1b3VzIGFuZCBjb25zaXN0cyBvZgogICogICBQQUdFX1NJWkUgZWxlbWVudHMuCiAgKgogICogT3V0cHV0OgpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L29wLXJlc2V0LmMgYi9uZXQvd2ltYXgvb3AtcmVzZXQuYwppbmRleCBjYTI2OTE3Li4zNWYzNzAwIDEwMDY0NAotLS0gYS9uZXQvd2ltYXgvb3AtcmVzZXQuYworKysgYi9uZXQvd2ltYXgvb3AtcmVzZXQuYwpAQCAtNjIsNyArNjIsNyBAQAogICogQ2FsbGVkIHdoZW4gd2FudGluZyB0byByZXNldCB0aGUgZGV2aWNlIGZvciBhbnkgcmVhc29uLiBEZXZpY2UgaXMKICAqIHRha2VuIGJhY2sgdG8gcG93ZXIgb24gc3RhdHVzLgogICoKLSAqIFRoaXMgY2FsbCBibG9ja3M7IG9uIHN1Y2Nlc2Z1bCByZXR1cm4sIHRoZSBkZXZpY2UgaGFzIGNvbXBsZXRlZCB0aGUKKyAqIFRoaXMgY2FsbCBibG9ja3M7IG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgZGV2aWNlIGhhcyBjb21wbGV0ZWQgdGhlCiAgKiByZXNldCBwcm9jZXNzIGFuZCBpcyByZWFkeSB0byBvcGVyYXRlLgogICovCiBpbnQgd2ltYXhfcmVzZXQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9LY29uZmlnIGIvc2FtcGxlcy9LY29uZmlnCmluZGV4IGU0YmU4NGEuLjg5MjRmNzIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvS2NvbmZpZworKysgYi9zYW1wbGVzL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIHNhbXBsZXMvS2NvbmZpZwotCiBtZW51Y29uZmlnIFNBTVBMRVMKIAlib29sICJTYW1wbGUga2VybmVsIGNvZGUiCiAJaGVscApAQCAtNDcsNCArNDUsMyBAQAogCSAgVGhpcyBidWlsZHMga2VybmVsIGhhcmR3YXJlIGJyZWFrcG9pbnQgZXhhbXBsZSBtb2R1bGVzLgogCiBlbmRpZiAjIFNBTVBMRVMKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwppbmRleCBkODI5NTM1Li44NDEzY2YzIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJInRvIG1vZGlmeSB0aGF0IGNvbmZpZ3VyYXRpb24uXG4iCiAJIlxuIgogCSJJZiB5b3UgYXJlIHVuY2VydGFpbiwgdGhlbiB5b3UgaGF2ZSBwcm9iYWJseSBuZXZlciB1c2VkIGFsdGVybmF0ZVxuIgotCSJjb25maWd1cmF0aW9uIGZpbGVzLiAgWW91IHNob3VsZCB0aGVyZWZvciBsZWF2ZSB0aGlzIGJsYW5rIHRvIGFib3J0LlxuIiksCisJImNvbmZpZ3VyYXRpb24gZmlsZXMuIFlvdSBzaG91bGQgdGhlcmVmb3JlIGxlYXZlIHRoaXMgYmxhbmsgdG8gYWJvcnQuXG4iKSwKIHNhdmVfY29uZmlnX3RleHRbXSA9IE5fKAogCSJFbnRlciBhIGZpbGVuYW1lIHRvIHdoaWNoIHRoaXMgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc2F2ZWQgIgogCSJhcyBhbiBhbHRlcm5hdGUuICBMZWF2ZSBibGFuayB0byBhYm9ydC4iKSwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmV0bGFiZWwuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGFiZWwuYwppbmRleCBlNjg4MjM3Li4yNTM0NDAwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25ldGxhYmVsLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRsYWJlbC5jCkBAIC0yMDQsNyArMjA0LDcgQEAKICAqCiAgKiBEZXNjcmlwdGlvbgogICogQ2FsbCB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHRvIHNldCB0aGUgbGFiZWwgb2YgYSBwYWNrZXQgdXNpbmcgQHNpZC4KLSAqIFJldHVybnMgemVybyBvbiBhdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KIGludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfc2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggZDZiYjIwYy4uYjNlZmFlMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtODM2LDcgKzgzNiw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIHR5cGUvZG9tYWluIHVuY2hhbmVkICovCisJLyogdHlwZS9kb21haW4gdW5jaGFuZ2VkICovCiAJaWYgKG9sZF9jb250ZXh0LT50eXBlID09IG5ld19jb250ZXh0LT50eXBlKSB7CiAJCXJjID0gMDsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9LY29uZmlnIGIvc291bmQvS2NvbmZpZwppbmRleCBiM2U1M2U2Li5mY2FkNzYwIDEwMDY0NAotLS0gYS9zb3VuZC9LY29uZmlnCisrKyBiL3NvdW5kL0tjb25maWcKQEAgLTEsNiArMSwzIEBACi0jIHNvdW5kL0NvbmZpZy5pbgotIwotCiBtZW51Y29uZmlnIFNPVU5ECiAJdHJpc3RhdGUgIlNvdW5kIGNhcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEhBU19JT01FTQpAQCAtMTM2LDQgKzEzMywzIEBACiAJICBzb3VuZCBzdWJzeXN0ZW0gYW5kIG90aGVyIGZ1bmN0aW9uIGRyaXZlcnMgY29tcGxldGVseSB1bnJlbGF0ZWQgdG8KIAkgIHNvdW5kIGFsdGhvdWdoIHRoZXkncmUgc2hhcmluZyB0aGUgQUM5NyBidXMuIENvbmNlcm5lZCBkcml2ZXJzCiAJICBzaG91bGQgInNlbGVjdCIgdGhpcy4KLQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKaW5kZXggOTNmYTY3Mi4uY2MxNWQxZCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYworKysgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAl7IC5pZCA9ICJDU0MwNDM3IiwgLmRldnMgPSB7IHsgIkNTQzAwMDAiIH0sIHsgIkNTQzAwMTAiIH0sIHsgIkNTQzAwMDMiIH0gfSB9LAogCS8qIERpZ2l0YWwgUEMgNTAwMCBPbmJvYXJkIC0gQ1M0MjM2QiAqLwogCXsgLmlkID0gIkNTQzA3MzUiLCAuZGV2cyA9IHsgeyAiQ1NDMDAwMCIgfSwgeyAiQ1NDMDAxMCIgfSB9IH0sCi0JLyogc29tZSB1a25vd24gQ1M0MjM2QiAqLworCS8qIHNvbWUgdW5rbm93biBDUzQyMzZCICovCiAJeyAuaWQgPSAiQ1NDMGIzNSIsIC5kZXZzID0geyB7ICJDU0MwMDAwIiB9LCB7ICJDU0MwMDEwIiB9LCB7ICJDU0MwMDAzIiB9IH0gfSwKIAkvKiBJbnRlbCBQUjQ0MEZYIE9uYm9hcmQgc291bmQgKi8KIAl7IC5pZCA9ICJDU0MwYjM2IiwgLmRldnMgPSB7IHsgIkNTQzAwMDAiIH0sIHsgIkNTQzAwMTAiIH0sIHsgIkNTQzAwMDMiIH0gfSB9LApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvbWlyby5jIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCmluZGV4IDYxMjNjNzUuLmI4NjVlNDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogc3RhdGljIHN0cnVjdCBzbmRfbWlyb19hY2kgYWNpX2RldmljZTsKIAogc3RhdGljIGNoYXIgKiBzbmRfb3B0aTl4eF9uYW1lc1tdID0gewotCSJ1bmtvd24iLAorCSJ1bmtub3duIiwKIAkiODJDOTI4IiwgIjgyQzkyOSIsCiAJIjgyQzkyNCIsICI4MkM5MjUiLAogCSI4MkM5MzAiLCAiODJDOTMxIiwgIjgyQzkzMyIKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCmluZGV4IGQwOGMzODkuLjEwNmJlNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYwpAQCAtMTM1LDYgKzEzNSw4IEBACiAJdW5zaWduZWQgbG9uZyBtY19iYXNlX3NpemU7CiAjaWZkZWYgT1BUaTkzWAogCXVuc2lnbmVkIGxvbmcgbWNfaW5kaXJfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBtY19pbmRpcl9zaXplOworCXN0cnVjdCByZXNvdXJjZSAqcmVzX21jX2luZGlyOwogCXN0cnVjdCBzbmRfd3NzICpjb2RlYzsKICNlbmRpZgkvKiBPUFRpOTNYICovCiAJdW5zaWduZWQgbG9uZyBwd2RfcmVnOwpAQCAtMTc3LDcgKzE3OSw3IEBACiAjZW5kaWYKIAogc3RhdGljIGNoYXIgKiBzbmRfb3B0aTl4eF9uYW1lc1tdID0gewotCSJ1bmtvd24iLAorCSJ1bmtub3duIiwKIAkiODJDOTI4IiwJIjgyQzkyOSIsCiAJIjgyQzkyNCIsCSI4MkM5MjUiLAogCSI4MkM5MzAiLAkiODJDOTMxIiwJIjgyQzkzMyIKQEAgLTIzMSw3ICsyMzMsMTAgQEAKIAljYXNlIE9QVGk5WFhfSFdfODJDOTMxOgogCWNhc2UgT1BUaTlYWF9IV184MkM5MzM6CiAJCWNoaXAtPm1jX2Jhc2UgPSAoaGFyZHdhcmUgPT0gT1BUaTlYWF9IV184MkM5MzApID8gMHhmOGYgOiAweGY4ZDsKLQkJY2hpcC0+bWNfaW5kaXJfaW5kZXggPSAweGUwZTsKKwkJaWYgKCFjaGlwLT5tY19pbmRpcl9pbmRleCkgeworCQkJY2hpcC0+bWNfaW5kaXJfaW5kZXggPSAweGUwZTsKKwkJCWNoaXAtPm1jX2luZGlyX3NpemUgPSAyOworCQl9CiAJCWNoaXAtPnBhc3N3b3JkID0gMHhlNDsKIAkJY2hpcC0+cHdkX3JlZyA9IDA7CiAJCWJyZWFrOwpAQCAtNTYwLDYgKzU2NSw0OCBAQAogCiAjZW5kaWYgLyogT1BUaTkzWCAqLwogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3B0aTl4eF9yZWFkX2NoZWNrKHN0cnVjdCBzbmRfb3B0aTl4eCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworI2lmZGVmIE9QVGk5M1gKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisKKwljaGlwLT5yZXNfbWNfYmFzZSA9IHJlcXVlc3RfcmVnaW9uKGNoaXAtPm1jX2Jhc2UsIGNoaXAtPm1jX2Jhc2Vfc2l6ZSwKKwkJCQkJICAgIk9QVGk5eHggTUMiKTsKKwlpZiAoY2hpcC0+cmVzX21jX2Jhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKyNpZm5kZWYgT1BUaTkzWAorCXZhbHVlID0gc25kX29wdGk5eHhfcmVhZChjaGlwLCBPUFRpOVhYX01DX1JFRygxKSk7CisJaWYgKHZhbHVlICE9IDB4ZmYgJiYgdmFsdWUgIT0gaW5iKGNoaXAtPm1jX2Jhc2UgKyBPUFRpOVhYX01DX1JFRygxKSkpCisJCWlmICh2YWx1ZSA9PSBzbmRfb3B0aTl4eF9yZWFkKGNoaXAsIE9QVGk5WFhfTUNfUkVHKDEpKSkKKwkJCXJldHVybiAwOworI2Vsc2UJLyogT1BUaTkzWCAqLworCWNoaXAtPnJlc19tY19pbmRpciA9IHJlcXVlc3RfcmVnaW9uKGNoaXAtPm1jX2luZGlyX2luZGV4LAorCQkJCQkgICAgY2hpcC0+bWNfaW5kaXJfc2l6ZSwKKwkJCQkJICAgICJPUFRpOTN4IE1DIik7CisJaWYgKGNoaXAtPnJlc19tY19pbmRpciA9PSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwlvdXRiKGNoaXAtPnBhc3N3b3JkLCBjaGlwLT5tY19iYXNlICsgY2hpcC0+cHdkX3JlZyk7CisJb3V0YigoKGNoaXAtPm1jX2luZGlyX2luZGV4ICYgMHgxZjApID4+IDQpLCBjaGlwLT5tY19iYXNlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwl2YWx1ZSA9IHNuZF9vcHRpOXh4X3JlYWQoY2hpcCwgT1BUaTlYWF9NQ19SRUcoNykpOworCXNuZF9vcHRpOXh4X3dyaXRlKGNoaXAsIE9QVGk5WFhfTUNfUkVHKDcpLCAweGZmIC0gdmFsdWUpOworCWlmIChzbmRfb3B0aTl4eF9yZWFkKGNoaXAsIE9QVGk5WFhfTUNfUkVHKDcpKSA9PSAweGZmIC0gdmFsdWUpCisJCXJldHVybiAwOworCisJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShjaGlwLT5yZXNfbWNfaW5kaXIpOworCWNoaXAtPnJlc19tY19pbmRpciA9IE5VTEw7CisjZW5kaWYJLyogT1BUaTkzWCAqLworCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX21jX2Jhc2UpOworCWNoaXAtPnJlc19tY19iYXNlID0gTlVMTDsKKworCXJldHVybiAtRU5PREVWOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2FyZF9vcHRpOXh4X2RldGVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCiAJCQkJCSAgICAgc3RydWN0IHNuZF9vcHRpOXh4ICpjaGlwKQogewpAQCAtNTY3LDUwICs2MTQsMjAgQEAKIAogI2lmbmRlZiBPUFRpOTNYCiAJZm9yIChpID0gT1BUaTlYWF9IV184MkM5Mjg7IGkgPCBPUFRpOVhYX0hXXzgyQzkzMDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0KLQkJaWYgKChlcnIgPSBzbmRfb3B0aTl4eF9pbml0KGNoaXAsIGkpKSA8IDApCi0JCQlyZXR1cm4gZXJyOwotCi0JCWlmICgoY2hpcC0+cmVzX21jX2Jhc2UgPSByZXF1ZXN0X3JlZ2lvbihjaGlwLT5tY19iYXNlLCBjaGlwLT5tY19iYXNlX3NpemUsICJPUFRpOXh4IE1DIikpID09IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQl2YWx1ZSA9IHNuZF9vcHRpOXh4X3JlYWQoY2hpcCwgT1BUaTlYWF9NQ19SRUcoMSkpOwotCQlpZiAoKHZhbHVlICE9IDB4ZmYpICYmICh2YWx1ZSAhPSBpbmIoY2hpcC0+bWNfYmFzZSArIDEpKSkKLQkJCWlmICh2YWx1ZSA9PSBzbmRfb3B0aTl4eF9yZWFkKGNoaXAsIE9QVGk5WFhfTUNfUkVHKDEpKSkKLQkJCQlyZXR1cm4gMTsKLQotCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGNoaXAtPnJlc19tY19iYXNlKTsKLQkJY2hpcC0+cmVzX21jX2Jhc2UgPSBOVUxMOwotCi0JfQotI2Vsc2UJLyogT1BUaTkzWCAqLworI2Vsc2UKIAlmb3IgKGkgPSBPUFRpOVhYX0hXXzgyQzkzMTsgaSA+PSBPUFRpOVhYX0hXXzgyQzkzMDsgaS0tKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0KLQkJaWYgKChlcnIgPSBzbmRfb3B0aTl4eF9pbml0KGNoaXAsIGkpKSA8IDApCisjZW5kaWYKKwkJZXJyID0gc25kX29wdGk5eHhfaW5pdChjaGlwLCBpKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCi0JCWlmICgoY2hpcC0+cmVzX21jX2Jhc2UgPSByZXF1ZXN0X3JlZ2lvbihjaGlwLT5tY19iYXNlLCBjaGlwLT5tY19iYXNlX3NpemUsICJPUFRpOXh4IE1DIikpID09IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOwotCQlvdXRiKGNoaXAtPnBhc3N3b3JkLCBjaGlwLT5tY19iYXNlICsgY2hpcC0+cHdkX3JlZyk7Ci0JCW91dGIoKChjaGlwLT5tY19pbmRpcl9pbmRleCAmICgxIDw8IDgpKSA+PiA0KSB8Ci0JCQkoKGNoaXAtPm1jX2luZGlyX2luZGV4ICYgMHhmMCkgPj4gNCksIGNoaXAtPm1jX2Jhc2UpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5sb2NrLCBmbGFncyk7Ci0KLQkJdmFsdWUgPSBzbmRfb3B0aTl4eF9yZWFkKGNoaXAsIE9QVGk5WFhfTUNfUkVHKDcpKTsKLQkJc25kX29wdGk5eHhfd3JpdGUoY2hpcCwgT1BUaTlYWF9NQ19SRUcoNyksIDB4ZmYgLSB2YWx1ZSk7Ci0JCWlmIChzbmRfb3B0aTl4eF9yZWFkKGNoaXAsIE9QVGk5WFhfTUNfUkVHKDcpKSA9PSAweGZmIC0gdmFsdWUpCisJCWVyciA9IHNuZF9vcHRpOXh4X3JlYWRfY2hlY2soY2hpcCk7CisJCWlmIChlcnIgPT0gMCkKIAkJCXJldHVybiAxOwotCi0JCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX21jX2Jhc2UpOwotCQljaGlwLT5yZXNfbWNfYmFzZSA9IE5VTEw7CisjaWZkZWYgT1BUaTkzWAorCQljaGlwLT5tY19pbmRpcl9pbmRleCA9IDA7CisjZW5kaWYKIAl9Ci0jZW5kaWYJLyogT1BUaTkzWCAqLwotCiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTYzOSw2ICs2NTYsOCBAQAogI2lmZGVmIE9QVGk5M1gKIAlwb3J0ID0gcG5wX3BvcnRfc3RhcnQocGRldiwgMCkgLSA0OwogCWZtX3BvcnQgPSBwbnBfcG9ydF9zdGFydChwZGV2LCAxKSArIDg7CisJY2hpcC0+bWNfaW5kaXJfaW5kZXggPSBwbnBfcG9ydF9zdGFydChwZGV2LCAzKSArIDI7CisJY2hpcC0+bWNfaW5kaXJfc2l6ZSA9IHBucF9wb3J0X2xlbihwZGV2LCAzKSAtIDI7CiAjZWxzZQogCWlmIChwaWQtPmRyaXZlcl9kYXRhICE9IDB4MDkyNCkKIAkJcG9ydCA9IHBucF9wb3J0X3N0YXJ0KHBkZXYsIDEpOwpAQCAtNjY5LDcgKzY4OCw3IEBACiBzdGF0aWMgdm9pZCBzbmRfY2FyZF9vcHRpOXh4X2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewogCXN0cnVjdCBzbmRfb3B0aTl4eCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgCisKIAlpZiAoY2hpcCkgewogI2lmZGVmIE9QVGk5M1gKIAkJc3RydWN0IHNuZF93c3MgKmNvZGVjID0gY2hpcC0+Y29kZWM7CkBAIC02NzcsNiArNjk2LDcgQEAKIAkJCWRpc2FibGVfaXJxKGNvZGVjLT5pcnEpOwogCQkJZnJlZV9pcnEoY29kZWMtPmlycSwgY29kZWMpOwogCQl9CisJCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX21jX2luZGlyKTsKICNlbmRpZgogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGNoaXAtPnJlc19tY19iYXNlKTsKIAl9CkBAIC02OTYsMTEgKzcxNiw2IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAlzdHJ1Y3Qgc25kX2h3ZGVwICpzeW50aDsKIAotCWlmICghIGNoaXAtPnJlc19tY19iYXNlICYmCi0JICAgIChjaGlwLT5yZXNfbWNfYmFzZSA9IHJlcXVlc3RfcmVnaW9uKGNoaXAtPm1jX2Jhc2UsIGNoaXAtPm1jX2Jhc2Vfc2l6ZSwKLQkJCQkJCSJPUFRpOXh4IE1DIikpID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAjaWYgZGVmaW5lZChDUzQyMzEpIHx8IGRlZmluZWQoT1BUaTkzWCkKIAl4ZG1hMiA9IGRtYTI7CiAjZWxzZQpAQCAtOTU0LDYgKzk2OSwxMyBAQAogCX0KIAlpZiAoaHcgPD0gT1BUaTlYWF9IV184MkM5MzApCiAJCWNoaXAtPm1jX2Jhc2UgLT0gMHg4MDsKKworCWVycm9yID0gc25kX29wdGk5eHhfcmVhZF9jaGVjayhjaGlwKTsKKwlpZiAoZXJyb3IpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiT1BUSSBjaGlwIG5vdCBmb3VuZFxuIik7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnJvcjsKKwl9CiAJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJaWYgKChlcnJvciA9IHNuZF9vcHRpOXh4X3Byb2JlKGNhcmQpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9LY29uZmlnIGIvc291bmQvb3NzL0tjb25maWcKaW5kZXggMTM1YTJiNy4uYTUxMzY1MSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL0tjb25maWcKKysrIGIvc291bmQvb3NzL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi0jIGRyaXZlcnMvc291bmQvQ29uZmlnLmluCi0jCiAjIDE4IEFwciAxOTk4LCBNaWNoYWVsIEVsaXphYmV0aCBDaGFzdGFpbiwgPG1haWx0bzptZWNAc2hvdXQubmV0PgogIyBNb3JlIGhhY2tpbmcgZm9yIG1vZHVsYXJpc2F0aW9uLgogIwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYwppbmRleCAwNmU5ZTg4Li5iYjE0ZTRjIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0c291bmQudm9sdW1lX3JpZ2h0ID0gJWQgWzAuLi42NF1cbiIsCiAJCSAgICAgICBkbWFzb3VuZC52b2x1bWVfcmlnaHQpOwogCWlmIChsZW4gPj0gc3BhY2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZF9wYXVsYTogb3Zlcmxvd2VkIHN0YXRlIGJ1ZmZlciBhbGxvYy5cbiIpIDsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZF9wYXVsYTogb3ZlcmZsb3dlZCBzdGF0ZSBidWZmZXIgYWxsb2MuXG4iKSA7CiAJCWxlbiA9IHNwYWNlIDsKIAl9CiAJcmV0dXJuIGxlbjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X3Byb2MuYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X3Byb2MuYwppbmRleCAxNTUyM2U2Li4wNDcwNDYxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9wcm9jLmMKKysrIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfcHJvYy5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInVzZXItZGVmaW5lZFxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInVua293blxuIik7CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJ1bmtub3duXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNhbXBsZSBCaXRzOiAiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvaW1ncy9jd2NkbWEuYXNwIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2RtYS5hc3AKaW5kZXggMDlkMjRjNy4uYTY1ZTExOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2RtYS5hc3AKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9pbWdzL2N3Y2RtYS5hc3AKQEAgLTI2LDEwICsyNiwxMSBAQAogLy8KIC8vCiAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGNvZGUgaXMgdmVyeSBzaW1wbGU6IG1ha2UgaXQgcG9zc2libGUgdG8gdHJhbmZzZXIKLS8vIHRoZSBzYW1wbGVzICdhcyB0aGV5IGFyZScgd2l0aCBubyBhbHRlcmF0aW9uIGZyb20gYSBQQ01yZWFkZXIgU0NCIChETUEgZnJvbSBob3N0KQotLy8gdG8gYW55IG90aGVyIFNDQi4gVGhpcyBpcyB1c2VmdWwgZm9yIEFDMyB0aHJvdWcgU1BESUYuIFNSQyAoc291cmNlIHJhdGUgY29udmVydGVycykgCi0vLyB0YXNrIGFsd2F5cyBhbHRlcnMgdGhlIHNhbXBsZXMgaW4gc29tZSBob3csIGhvd2V2ZXIgaXQncyBmcm9tIDQ4a2h6IC0+IDQ4a2h6LiBUaGUKLS8vIGFsdGVyYXRpb25zIGFyZSBub3QgYXVkaWJsZSwgYnV0IEFDMyB3b250IHdvcmsuIAorLy8gdGhlIHNhbXBsZXMgJ2FzIHRoZXkgYXJlJyB3aXRoIG5vIGFsdGVyYXRpb24gZnJvbSBhIFBDTXJlYWRlcgorLy8gU0NCIChETUEgZnJvbSBob3N0KSB0byBhbnkgb3RoZXIgU0NCLiBUaGlzIGlzIHVzZWZ1bCBmb3IgQUMzIHRocm91Z2ggU1BESUYuCisvLyBTUkMgKHNvdXJjZSByYXRlIGNvbnZlcnRlcnMpIHRhc2sgYWx3YXlzIGFsdGVycyB0aGUgc2FtcGxlcyBpbiBzb21laG93LAorLy8gaG93ZXZlciBpdCdzIGZyb20gNDhraHogLT4gNDhraHouCisvLyBUaGUgYWx0ZXJhdGlvbnMgYXJlIG5vdCBhdWRpYmxlLCBidXQgQUMzIHdvbnQgd29yay4gCiAvLwogLy8gICAgICAgIC4uLgogLy8gICAgICAgICB8CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwppbmRleCA2YjhhZTdiLi4xZDM2OWZmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogICogVGhlIGhhcmR3YXJlIGhhcyAzIGNoYW5uZWxzIGZvciBwbGF5YmFjayBhbmQgMSBmb3IgY2FwdHVyZS4KICAqICAtIGNoYW5uZWwgMCBpcyB0aGUgZnJvbnQgY2hhbm5lbAogICogIC0gY2hhbm5lbCAxIGlzIHRoZSByZWFyIGNoYW5uZWwKLSAqICAtIGNoYW5uZWwgMiBpcyB0aGUgY2VudGVyL2xmZSBjaGFuZWwKKyAqICAtIGNoYW5uZWwgMiBpcyB0aGUgY2VudGVyL2xmZSBjaGFubmVsCiAgKiBWb2x1bWUgaXMgY29udHJvbGxlZCBieSB0aGUgQUM5NyBmb3IgdGhlIGZyb250IGFuZCByZWFyIGNoYW5uZWxzIGJ5CiAgKiB0aGUgUENNIFBsYXliYWNrIFZvbHVtZSwgU2lnbWF0ZWwgU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIGFuZCAKICAqIFN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZS4gVGhlIFNpZ21hdGVsIDQtU3BlYWtlciBTdGVyZW8gc3dpdGNoIGFmZmVjdHMKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IGQ4MjJiZmMuLmVmY2M0ZjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtMjQ1MCw2ICsyNDUwLDExIEBACiAJCX0KIAl9CiAKKwkvKiBkaXNhYmxlIDY0Yml0IERNQSBhZGRyZXNzIGZvciBUZXJhZGljaSAqLworCS8qIGl0IGRvZXMgbm90IHdvcmsgd2l0aCBkZXZpY2UgNjU0OToxMjAwIHN1YnN5cyBlNGEyOjA0MGIgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX3R5cGUgPT0gQVpYX0RSSVZFUl9URVJBKQorCQlnY2FwICY9IH5JQ0g2X0dDQVBfNjRPSzsKKwogCS8qIGFsbG93IDY0Yml0IERNQSBhZGRyZXNzIGlmIHN1cHBvcnRlZCBieSBIL1cgKi8KIAlpZiAoKGdjYXAgJiBJQ0g2X0dDQVBfNjRPSykgJiYgIXBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soNjQpKSkKIAkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDY0KSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwppbmRleCA0NTVhMDQ5Li40NDdlZGExIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKQEAgLTcyLDcgKzcyLDggQEAKIAloZGFfbmlkX3QgcHJpdmF0ZV9kYWNfbmlkc1tBVVRPX0NGR19NQVhfT1VUU107CiAKIAl1bnNpZ25lZCBpbnQgamFja19wcmVzZW50IDoxOwotCXVuc2lnbmVkIGludCBpbnZfamFja19kZXRlY3Q6MTsKKwl1bnNpZ25lZCBpbnQgaW52X2phY2tfZGV0ZWN0OjE7CS8qIGludmVydGVkIGphY2stZGV0ZWN0aW9uICovCisJdW5zaWduZWQgaW50IGludl9lYXBkOjE7CS8qIGludmVydGVkIEVBUEQgaW1wbGVtZW50YXRpb24gKi8KIAogI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKIAlzdHJ1Y3QgaGRhX2xvb3BiYWNrX2NoZWNrIGxvb3BiYWNrOwpAQCAtNDU4LDcgKzQ1OSw3IEBACiAKIC8qCiAgKiBFQVBEIGNvbnRyb2wKLSAqIHRoZSBwcml2YXRlIHZhbHVlID0gbmlkIHwgKGludmVydCA8PCA4KQorICogdGhlIHByaXZhdGUgdmFsdWUgPSBuaWQKICAqLwogI2RlZmluZSBhZDE5OHhfZWFwZF9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KIApAQCAtNDY3LDggKzQ2OCw3IEBACiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IGFkMTk4eF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDE7Ci0JaWYgKGludmVydCkKKwlpZiAoc3BlYy0+aW52X2VhcGQpCiAJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gISBzcGVjLT5jdXJfZWFwZDsKIAllbHNlCiAJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc3BlYy0+Y3VyX2VhcGQ7CkBAIC00ODAsMTEgKzQ4MCwxMCBAQAogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAxOwogCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CiAJdW5zaWduZWQgaW50IGVhcGQ7CiAJZWFwZCA9ICEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JaWYgKGludmVydCkKKwlpZiAoc3BlYy0+aW52X2VhcGQpCiAJCWVhcGQgPSAhZWFwZDsKIAlpZiAoZWFwZCA9PSBzcGVjLT5jdXJfZWFwZCkKIAkJcmV0dXJuIDA7CkBAIC03MDUsNyArNzA0LDcgQEAKIAkJLmluZm8gPSBhZDE5OHhfZWFwZF9pbmZvLAogCQkuZ2V0ID0gYWQxOTh4X2VhcGRfZ2V0LAogCQkucHV0ID0gYWQxOTh4X2VhcGRfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IDB4MWIgfCAoMSA8PCA4KSwgLyogcG9ydC1ELCBpbnZlcnNlZCAqLworCQkucHJpdmF0ZV92YWx1ZSA9IDB4MWIsIC8qIHBvcnQtRCAqLwogCX0sCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTEwNzQsNiArMTA3Myw3IEBACiAJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IGFkMTk4NmFfbG9vcGJhY2tzOwogI2VuZGlmCiAJc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDFiOworCXNwZWMtPmludl9lYXBkID0gMTsgLyogQUQxOTg2QSBoYXMgdGhlIGludmVydGVkIEVBUEQgaW1wbGVtZW50YXRpb24gKi8KIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhZDE5OHhfcGF0Y2hfb3BzOwogCkBAIC0yMTI0LDcgKzIxMjQsNyBAQAogCQkuaW5mbyA9IGFkMTk4eF9lYXBkX2luZm8sCiAJCS5nZXQgPSBhZDE5OHhfZWFwZF9nZXQsCiAJCS5wdXQgPSBhZDE5OHhfZWFwZF9wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMHgxMiB8ICgxIDw8IDgpLCAvKiBwb3J0LUQsIGludmVyc2VkICovCisJCS5wcml2YXRlX3ZhbHVlID0gMHgxMiwgLyogcG9ydC1EICovCiAJfSwKIAogCXsgfSAvKiBlbmQgKi8KQEAgLTMwNjUsNiArMzA2NSw3IEBACiAJCXNwZWMtPmlucHV0X211eCA9ICZhZDE5ODhfbGFwdG9wX2NhcHR1cmVfc291cmNlOwogCQlzcGVjLT5udW1fbWl4ZXJzID0gMTsKIAkJc3BlYy0+bWl4ZXJzWzBdID0gYWQxOTg4X2xhcHRvcF9taXhlcnM7CisJCXNwZWMtPmludl9lYXBkID0gMTsgLyogaW52ZXJ0ZWQgRUFQRCAqLwogCQlzcGVjLT5udW1faW5pdF92ZXJicyA9IDE7CiAJCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBhZDE5ODhfbGFwdG9wX2luaXRfdmVyYnM7CiAJCWlmIChib2FyZF9jb25maWcgPT0gQUQxOTg4X0xBUFRPUF9ESUcpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYwppbmRleCAyNDM5ZTg0Li40YjIwMGRhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKQEAgLTkzOCw3ICs5MzgsNyBAQAogCQljb2VmIHw9IDB4MDUwMDsgLyogRE1JQzIgZW5hYmxlIDIgY2hhbm5lbHMsIGRpc2FibGUgR1BJTzEgKi8KIAlpZiAoaXNfYWN0aXZlX3Bpbihjb2RlYywgQ1NfRE1JQzFfUElOX05JRCkpCiAJCWNvZWYgfD0gMHgxODAwOyAvKiBETUlDMSBlbmFibGUgMiBjaGFubmVscywgZGlzYWJsZSBHUElPMCAKLQkJCQkgKiBObyBlZmZlY3QgaWYgU1BESUZfT1VUMiBpcyBzbGVjdGVkIGluIAorCQkJCSAqIE5vIGVmZmVjdCBpZiBTUERJRl9PVVQyIGlzIHNlbGVjdGVkIGluIAogCQkJCSAqIElEWF9TUERJRl9DVEwuCiAJCQkJICAqLwogCWNzX3ZlbmRvcl9jb2VmX3NldChjb2RlYywgSURYX0FEQ19DRkcsIGNvZWYpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKaW5kZXggODVjODFmZS4uYTQ1YzExNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCkBAIC02Niw3ICs2Niw3IEBACiAKIAlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjWzJdOwkvKiBQQ00gaW5mb3JtYXRpb24gKi8KIAotCS8qIHBpbiBkZWFmYXVsdCBjb25maWd1cmF0aW9uICovCisJLyogcGluIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLwogCWhkYV9uaWRfdCBwaW5fbmlkW05VTV9QSU5TXTsKIAl1bnNpZ25lZCBpbnQgZGVmX2NvbmZbTlVNX1BJTlNdOwogCXVuc2lnbmVkIGludCBwaW5fZGVmX2NvbmZzOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCBkOTY3ODM2Li44ODhiNjMxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMjA4LDYgKzIwOCw3IEBACiAJQUxDODg1X01CUDMsCiAJQUxDODg1X01CNSwKIAlBTEM4ODVfSU1BQzI0LAorCUFMQzg4NV9JTUFDOTEsCiAJQUxDODgzXzNTVF8yY2hfRElHLAogCUFMQzg4M18zU1RfNmNoX0RJRywKIAlBTEM4ODNfM1NUXzZjaCwKQEAgLTI0MDAsNiArMjQwMSw4IEBACiAJIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwKIAkiTW9ubyBQbGF5YmFjayBTd2l0Y2giLAogCSJJRUM5NTggUGxheWJhY2sgU3dpdGNoIiwKKwkiTGluZS1PdXQgUGxheWJhY2sgU3dpdGNoIiwKKwkiUENNIFBsYXliYWNrIFN3aXRjaCIsCiAJTlVMTCwKIH07CiAKQEAgLTY2MTgsNyArNjYyMSw3IEBACiAJCS8qIEZyb250IE1pYyAoMHgwMSkgdW51c2VkICovCiAJCXsgIkxpbmUiLCAweDIgfSwKIAkJLyogTGluZSAyICgweDAzKSB1bnVzZWQgKi8KLQkJLyogQ0QgKDB4MDQpIHVuc3VzZWQ/ICovCisJCS8qIENEICgweDA0KSB1bnVzZWQ/ICovCiAJfSwKIH07CiAKQEAgLTcwNTAsNiArNzA1MywyMCBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfaW1hYzkxX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTGluZS1PdXQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSAgICgiTGluZS1PdXQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSAgKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFICAoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSAgKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAweDAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4Ml93MmpjX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLApAQCAtNzUwNSw2ICs3NTIyLDY2IEBACiAJeyB9CiB9OwogCisvKiBpTWFjIDksMSAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfaW1hYzkxX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBMaW5lLU91dCBtaXhlcjogdW5tdXRlIGlucHV0L291dHB1dCBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIFJlYXIgbWl4ZXIgKi8KKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJLyogSFAgUGluOiBvdXRwdXQgMCAoMHgwYykgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJLyogSW50ZXJuYWwgU3BlYWtlcnM6IG91dHB1dCAwICgweDBkKSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogTWljIChyZWFyKSBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogRnJvbnQgTWljIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBMaW5lIEluIHBpbjogdXNlIG91dHB1dCAxIHdoZW4gaW4gTGluZU91dCBtb2RlICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCisJLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCisJLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCisJLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCS8qIElucHV0IG1peGVyMiAqLworCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwkvKiBJbnB1dCBtaXhlcjMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogQURDMTogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQURDMjogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQURDMzogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwl7IH0KK307CisKIC8qIGlNYWMgMjQgbWl4ZXIuICovCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODg1X2ltYWMyNF9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAwLCBIREFfT1VUUFVUKSwKQEAgLTc1NTEsNiArNzYyOCwyNiBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKIH0KIAorc3RhdGljIHZvaWQgYWxjODg1X2ltYWM5MV9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE0LCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE1LCBIREFfT1VUUFVULCAwLAorCQkJCSBIREFfQU1QX01VVEUsIHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MWEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIEhEQV9BTVBfTVVURSwgcHJlc2VudCA/IEhEQV9BTVBfTVVURSA6IDApOworCit9CisKK3N0YXRpYyB2b2lkIGFsYzg4NV9pbWFjOTFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgIHVuc2lnbmVkIGludCByZXMpCit7CisJLyogSGVhZHBob25lIGluc2VydGlvbiBvciByZW1vdmFsLiAqLworCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfSFBfRVZFTlQpCisJCWFsYzg4NV9pbWFjOTFfYXV0b211dGUoY29kZWMpOworfQogCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml90YXJnYV92ZXJic1tdID0gewogCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKQEAgLTg3MTgsNiArODgxNSw3IEBACiAJW0FMQzg4NV9NQjVdCQk9ICJtYjUiLAogCVtBTEM4ODVfTUJQM10JCT0gIm1icDMiLAogCVtBTEM4ODVfSU1BQzI0XQkJPSAiaW1hYzI0IiwKKwlbQUxDODg1X0lNQUM5MV0JCT0gImltYWM5MSIsCiAJW0FMQzg4M18zU1RfMmNoX0RJR10JPSAiM3N0YWNrLTJjaC1kaWciLAogCVtBTEM4ODNfM1NUXzZjaF9ESUddCT0gIjNzdGFjay02Y2gtZGlnIiwKIAlbQUxDODgzXzNTVF82Y2hdCT0gIjNzdGFjay02Y2giLApAQCAtODg5MSw2ICs4OTg5LDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzNjAwLCAiTWFjYm9vayAzLDEiLCBBTEM4ODlBX01CMzEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDM4MDAsICJNYWNib29rUHJvIDQsMSIsIEFMQzg4NV9NQlAzKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzZTAwLCAiaU1hYyAyNCBBbHVtaW51bSIsIEFMQzg4NV9JTUFDMjQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDQ5MDAsICJpTWFjIDksMSBBbHVtaW51bSIsIEFMQzg4NV9JTUFDOTEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDNmMDAsICJNYWNib29rIDUsMSIsIEFMQzg4NV9NQjUpLAogCS8qIEZJWE1FOiBIUCBqYWNrIHNlbnNlIHNlZW1zIG5vdCB3b3JraW5nIGZvciBNQlAgNSwxIG9yIDUsMiwKIAkgKiBzbyBhcHBhcmVudGx5IG5vIHBlcmZlY3Qgc29sdXRpb24geWV0CkBAIC05MDAyLDYgKzkxMDEsMjAgQEAKIAkJLnNldHVwID0gYWxjODg1X2ltYWMyNF9zZXR1cCwKIAkJLmluaXRfaG9vayA9IGFsYzg4NV9pbWFjMjRfaW5pdF9ob29rLAogCX0sCisJW0FMQzg4NV9JTUFDOTFdID0geworCQkubWl4ZXJzID0geyBhbGM4ODVfaW1hYzkxX21peGVyLCBhbGM4ODJfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODVfaW1hYzkxX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODVfbWJwXzRjaF9tb2RlcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4NV9tYnBfNGNoX21vZGVzKSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4NV9pbWFjOTFfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM4ODVfaW1hYzkxX2F1dG9tdXRlLAorCX0sCiAJW0FMQzg4Ml9UQVJHQV0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4Ml90YXJnYV9taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX2Jhc2VfaW5pdF92ZXJicywgYWxjODgyX2FkYzFfaW5pdF92ZXJicywKQEAgLTk5MDgsMTAgKzEwMDIxLDEyIEBACiAJCXNwZWMtPmluaXRfYW1wID0gQUxDX0lOSVRfREVGQVVMVDsgLyogYWx3YXlzIGluaXRpYWxpemUgKi8KIAogCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCWludCBpOworCQlpbnQgaSwgajsKIAkJc3BlYy0+bnVtX2FkY19uaWRzID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxjODgyX2FkY19uaWRzKTsgaSsrKSB7CisJCQljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9IHNwZWMtPmlucHV0X211eDsKIAkJCWhkYV9uaWRfdCBjYXA7CisJCQloZGFfbmlkX3QgaXRlbXNbMTZdOwogCQkJaGRhX25pZF90IG5pZCA9IGFsYzg4Ml9hZGNfbmlkc1tpXTsKIAkJCXVuc2lnbmVkIGludCB3Y2FwID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOwogCQkJLyogZ2V0IHR5cGUgKi8KQEAgLTk5MjIsNiArMTAwMzcsMTUgQEAKIAkJCWVyciA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsICZjYXAsIDEpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJY29udGludWU7CisJCQllcnIgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgY2FwLCBpdGVtcywKKwkJCQkJCSAgICAgIEFSUkFZX1NJWkUoaXRlbXMpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChqID0gMDsgaiA8IGltdXgtPm51bV9pdGVtczsgaisrKQorCQkJCWlmIChpbXV4LT5pdGVtc1tqXS5pbmRleCA+PSBlcnIpCisJCQkJCWJyZWFrOworCQkJaWYgKGogPCBpbXV4LT5udW1faXRlbXMpCisJCQkJY29udGludWU7CiAJCQlzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzW3NwZWMtPm51bV9hZGNfbmlkc10gPSBjYXA7CiAJCQlzcGVjLT5udW1fYWRjX25pZHMrKzsKIAkJfQpAQCAtMTY4NDYsNiArMTY5NzAsNyBAQAogCQkJCQlBTEM2NjJfM1NUXzZjaF9ESUcpLAogCVNORF9QQ0lfUVVJUktfTUFTSygweDE4NTQsIDB4ZjAwMCwgMHgyMDAwLCAiQVNVUyBIMTMtMjAweCIsCiAJCQkgICBBTEM2NjNfQVNVU19IMTMpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ2MDQsICJJbnRlbCBtb2JvIiwgQUxDNjYyXzNTVF8yY2hfRElHKSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYwppbmRleCAxMTBkMTZlLi43NjVkN2JkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYwpAQCAtNjg5LDMyICs2ODksMTQgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fZGFjLCAtMTI3MDAsIDEwMCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fZGFjLCAtMTAwMDAsIDEwMCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fcGNtLCAtNjQwMCwgNTAsIDEpOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3dtX2FkYywgLTEyMDAsIDEwMCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYWM5N19tYXN0ZXIsIC00NjUwLCAxNTAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2FjOTdfZ2FpbiwgLTM0NTAsIDE1MCwgMCk7CiAKLS8qCi0gKiBMb2dhcml0aG1pYyB2b2x1bWUgdmFsdWVzIGZvciBXTTg3NzAKLSAqIENvbXB1dGVkIGFzIDIwICogTG9nMTAoMjU1IC8geCkKLSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgd21fdm9sWzI1Nl0gPSB7Ci0JMTI3LCA0OCwgNDIsIDM5LCAzNiwgMzQsIDMzLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI3LCAyNiwgMjUsIDI1LCAyNCwgMjQsIDIzLAotCTIzLCAyMiwgMjIsIDIxLCAyMSwgMjEsIDIwLCAyMCwgMjAsIDE5LCAxOSwgMTksIDE4LCAxOCwgMTgsIDE4LCAxNywgMTcsIDE3LAotCTE3LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLAotCTEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotCTExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA4LCA4LAotCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDYsIDYsIDYsCi0JNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKLQk1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAzLCAzLCAzLCAzLCAzLAotCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0JMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAKLX07Ci0KLSNkZWZpbmUgV01fVk9MX01BWAkoc2l6ZW9mKHdtX3ZvbCkgLSAxKQorI2RlZmluZSBXTV9WT0xfTUFYCTEwMAorI2RlZmluZSBXTV9WT0xfQ05UCTEwMQkvKiAwZEIgLi4gLTEwMGRCICovCiAjZGVmaW5lIFdNX1ZPTF9NVVRFCTB4ODAwMAogCiBzdGF0aWMgdm9pZCB3bV9zZXRfdm9sKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIHNob3J0IHZvbCwgdW5zaWduZWQgc2hvcnQgbWFzdGVyKQpAQCAtNzI0LDcgKzcwNiw4IEBACiAJaWYgKChtYXN0ZXIgJiBXTV9WT0xfTVVURSkgfHwgKHZvbCAmIFdNX1ZPTF9NVVRFKSkKIAkJbnZvbCA9IDA7CiAJZWxzZQotCQludm9sID0gMTI3IC0gd21fdm9sWygoKHZvbCAmIH5XTV9WT0xfTVVURSkgKiAobWFzdGVyICYgfldNX1ZPTF9NVVRFKSkgLyAxMjcpICYgV01fVk9MX01BWF07CisJCW52b2wgPSAoKHZvbCAlIFdNX1ZPTF9DTlQpICogKG1hc3RlciAlIFdNX1ZPTF9DTlQpKSAvCisJCQkJCQkJCVdNX1ZPTF9NQVg7CiAKIAl3bV9wdXQoaWNlLCBpbmRleCwgbnZvbCk7CiAJd21fcHV0X25vY2FjaGUoaWNlLCBpbmRleCwgMHgxODAgfCBudm9sKTsKQEAgLTgyMCw3ICs4MDMsNyBAQAogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCXVpbmZvLT5jb3VudCA9IHZvaWNlczsKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkJLyogbXV0ZSAoLTEwMWRCKSAqLwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4N0Y7CS8qIDBkQiAqLworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IFdNX1ZPTF9NQVg7CS8qIDBkQiAqLwogCXJldHVybiAwOwogfQogCkBAIC04NTAsNyArODMzLDcgQEAKIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CiAJZm9yIChpID0gMDsgaSA8IHZvaWNlczsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCB2b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTsKLQkJaWYgKHZvbCA+IDB4N2YpCisJCWlmICh2b2wgPiBXTV9WT0xfTUFYKQogCQkJY29udGludWU7CiAJCXZvbCB8PSBzcGVjLT52b2xbb2ZzK2ldOwogCQlpZiAodm9sICE9IHNwZWMtPnZvbFtvZnMraV0pIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYwppbmRleCAwYzk0MTNkLi45OGJjM2I3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCkBAIC0zODAsNyArMzgwLDcgQEAKIAkgKiBpbnB1dHMpIGFyZSBmZWQgZnJvbSBYaWxpbnguCiAJICoKIAkgKiBJIGV2ZW4gY2hlY2tlZCB0cmFjZXMgb24gYm9hcmQgYW5kIGNvZGVkIGEgc3VwcG9ydCBpbiBkcml2ZXIgZm9yCi0JICogYW4gYWx0ZXJuYXRpdmUgcG9zc2libGl0eSAtIHRoZSB1bnVzZWQgSTJTIElDRSBvdXRwdXQgY2hhbm5lbHMKKwkgKiBhbiBhbHRlcm5hdGl2ZSBwb3NzaWJpbGl0eSAtIHRoZSB1bnVzZWQgSTJTIElDRSBvdXRwdXQgY2hhbm5lbHMKIAkgKiBzd2l0Y2hlZCB0byBIVy1JTi9TUERJRi1JTiBhbmQgcHJvdmlkaW5nIHRoZSBtb25pdG9yaW5nIHNpZ25hbCB0bwogCSAqIHRoZSBEQUMgLSB0byBubyBhdmFpbC4gVGhlIEkyUyBvdXRwdXRzIHNlZW0gdG8gYmUgdW5jb25uZWN0ZWQuCiAJICoKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IDBkY2UzMzEuLmExYjEwZDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtMzAxNyw3ICszMDE3LDcgQEAKIAkJaW5zZWwgPSAiQ29heGlhbCI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWluc2VsID0gIlVua293biI7CisJCWluc2VsID0gIlVua25vd24iOwogCX0KIAogCXN3aXRjaCAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9TeW5jUmVmTWFzaykgewpAQCAtMzAyOCw3ICszMDI4LDcgQEAKIAkJc3luY3JlZiA9ICJNQURJIjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc3luY3JlZiA9ICJVbmtvd24iOworCQlzeW5jcmVmID0gIlVua25vd24iOwogCX0KIAlzbmRfaXByaW50ZihidWZmZXIsICJJbnB1dHNlbCA9ICVzLCBTeW5jUmVmID0gJXNcbiIsIGluc2VsLAogCQkgICAgc3luY3JlZik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM0eC5jCmluZGV4IGFhNDBkOTguLjNlOTlmZTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM0eC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM0eC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlwcl9kZWJ1ZygiJXMgcmVnOiAlMDJYLCB2YWx1ZTolMDJYXG4iLCBfX2Z1bmNfXywgcmVnLCB2YWx1ZSk7CiAKIAlpZiAocmVnID49IFVEQTEzNFhfUkVHU19OVU0pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyB1bmtvd24gcmVnaXN0ZXI6IHJlZzogJXUiLAorCQlwcmludGsoS0VSTl9FUlIgIiVzIHVua25vd24gcmVnaXN0ZXI6IHJlZzogJXUiLAogCQkgICAgICAgX19mdW5jX18sIHJlZyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCQkJCQlBUlJBWV9TSVpFKHVkYTEzNDFfc25kX2NvbnRyb2xzKSk7CiAJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyB1bmtvd24gY29kZWMgdHlwZTogJWQiLAorCQlwcmludGsoS0VSTl9FUlIgIiVzIHVua25vd24gY29kZWMgdHlwZTogJWQiLAogCQkJX19mdW5jX18sIHBkLT5tb2RlbCk7CiAJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKaW5kZXggYjhjYWUxNy4uY2U1NTE1ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCkBAIC02MDcsNyArNjA3LDcgQEAKIFNPQ19TSU5HTEUoIkRSQyBTd2l0Y2giLCBXTTg5MDNfRFJDXzAsIDE1LCAxLCAwKSwKIFNPQ19FTlVNKCJEUkMgQ29tcHJlc3NvciBTbG9wZSBSMCIsIGRyY19zbG9wZV9yMCksCiBTT0NfRU5VTSgiRFJDIENvbXByZXNzb3IgU2xvcGUgUjEiLCBkcmNfc2xvcGVfcjEpLAotU09DX1NJTkdMRV9UTFYoIkRSQyBDb21wcmVzc29yIFRocmVhc2hvbGQgVm9sdW1lIiwgV004OTAzX0RSQ18zLCA1LCAxMjQsIDEsCitTT0NfU0lOR0xFX1RMVigiRFJDIENvbXByZXNzb3IgVGhyZXNob2xkIFZvbHVtZSIsIFdNODkwM19EUkNfMywgNSwgMTI0LCAxLAogCSAgICAgICBkcmNfdGx2X3RocmVzaCksCiBTT0NfU0lOR0xFX1RMVigiRFJDIFZvbHVtZSIsIFdNODkwM19EUkNfMywgMCwgMzAsIDEsIGRyY190bHZfYW1wKSwKIFNPQ19TSU5HTEVfVExWKCJEUkMgTWluaW11bSBHYWluIFZvbHVtZSIsIFdNODkwM19EUkNfMSwgMiwgMywgMSwgZHJjX3Rsdl9taW4pLApAQCAtNjE3LDExICs2MTcsMTEgQEAKIFNPQ19FTlVNKCJEUkMgRkYgRGVsYXkiLCBkcmNfZmZfZGVsYXkpLAogU09DX1NJTkdMRSgiRFJDIEFudGljbGlwIFN3aXRjaCIsIFdNODkwM19EUkNfMCwgMSwgMSwgMCksCiBTT0NfU0lOR0xFKCJEUkMgUVIgU3dpdGNoIiwgV004OTAzX0RSQ18wLCAyLCAxLCAwKSwKLVNPQ19TSU5HTEVfVExWKCJEUkMgUVIgVGhyZWFzaG9sZCBWb2x1bWUiLCBXTTg5MDNfRFJDXzAsIDYsIDMsIDAsIGRyY190bHZfbWF4KSwKK1NPQ19TSU5HTEVfVExWKCJEUkMgUVIgVGhyZXNob2xkIFZvbHVtZSIsIFdNODkwM19EUkNfMCwgNiwgMywgMCwgZHJjX3Rsdl9tYXgpLAogU09DX0VOVU0oIkRSQyBRUiBEZWNheSBSYXRlIiwgZHJjX3FyX2RlY2F5KSwKIFNPQ19TSU5HTEUoIkRSQyBTbW9vdGhpbmcgU3dpdGNoIiwgV004OTAzX0RSQ18wLCAzLCAxLCAwKSwKIFNPQ19TSU5HTEUoIkRSQyBTbW9vdGhpbmcgSHlzdGVyZXNpcyBTd2l0Y2giLCBXTTg5MDNfRFJDXzAsIDAsIDEsIDApLAotU09DX0VOVU0oIkRSQyBTbW9vdGhpbmcgVGhyZWFzaG9sZCIsIGRyY19zbW9vdGhpbmcpLAorU09DX0VOVU0oIkRSQyBTbW9vdGhpbmcgVGhyZXNob2xkIiwgZHJjX3Ntb290aGluZyksCiBTT0NfU0lOR0xFX1RMVigiRFJDIFN0YXJ0dXAgVm9sdW1lIiwgV004OTAzX0RSQ18wLCA2LCAxOCwgMCwgZHJjX3Rsdl9zdGFydHVwKSwKIAogU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBDYXB0dXJlIFZvbHVtZSIsIFdNODkwM19BRENfRElHSVRBTF9WT0xVTUVfTEVGVCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCmluZGV4IDVlMzJmMmUuLjI5ODFhZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwpAQCAtNjg5LDcgKzY4OSw3IEBACiAKIFNPQ19TSU5HTEUoIkRSQyBTd2l0Y2giLCBXTTg5OTNfRFJDX0NPTlRST0xfMSwgMTUsIDEsIDApLAogU09DX0VOVU0oIkRSQyBQYXRoIiwgZHJjX3BhdGgpLAotU09DX1NJTkdMRV9UTFYoIkRSQyBDb21wcmVzc29yIFRocmVhc2hvbGQgVm9sdW1lIiwgV004OTkzX0RSQ19DT05UUk9MXzIsCitTT0NfU0lOR0xFX1RMVigiRFJDIENvbXByZXNzb3IgVGhyZXNob2xkIFZvbHVtZSIsIFdNODk5M19EUkNfQ09OVFJPTF8yLAogCSAgICAgICAyLCA2MCwgMSwgZHJjX2NvbXBfdGhyZWFzaCksCiBTT0NfU0lOR0xFX1RMVigiRFJDIENvbXByZXNzb3IgQW1wbGl0dWRlIFZvbHVtZSIsIFdNODk5M19EUkNfQ09OVFJPTF8zLAogCSAgICAgICAxMSwgMzAsIDEsIGRyY19jb21wX2FtcCksCkBAIC03MDksNyArNzA5LDcgQEAKIFNPQ19FTlVNKCJEUkMgUXVpY2sgUmVsZWFzZSBSYXRlIiwgZHJjX3FyX3JhdGUpLAogU09DX1NJTkdMRSgiRFJDIFNtb290aGluZyBTd2l0Y2giLCBXTTg5OTNfRFJDX0NPTlRST0xfMSwgMTEsIDEsIDApLAogU09DX1NJTkdMRSgiRFJDIFNtb290aGluZyBIeXN0ZXJlc2lzIFN3aXRjaCIsIFdNODk5M19EUkNfQ09OVFJPTF8xLCA4LCAxLCAwKSwKLVNPQ19FTlVNKCJEUkMgU21vb3RoaW5nIEh5c3RlcmVzaXMgVGhyZWFzaG9sZCIsIGRyY19zbW9vdGgpLAorU09DX0VOVU0oIkRSQyBTbW9vdGhpbmcgSHlzdGVyZXNpcyBUaHJlc2hvbGQiLCBkcmNfc21vb3RoKSwKIFNPQ19TSU5HTEVfVExWKCJEUkMgU3RhcnR1cCBWb2x1bWUiLCBXTTg5OTNfRFJDX0NPTlRST0xfNCwgOCwgMTgsIDAsCiAJICAgICAgIGRyY19zdGFydHVwX3RsdiksCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvbXgxX214Mi1wY20uYyBiL3NvdW5kL3NvYy9pbXgvbXgxX214Mi1wY20uYwppbmRleCBiODM4NjY1Li5iZmZmZmNkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L214MV9teDItcGNtLmMKKysrIGIvc291bmQvc29jL2lteC9teDFfbXgyLXBjbS5jCkBAIC0zMjIsMTIgKzMyMiwxMiBAQAogCiAJcHJfZGVidWcoIiVzOiBSZXF1ZXN0aW5nIGRtYSBjaGFubmVsICglcylcbiIsIF9fZnVuY19fLAogCQkJCQkJcHJ0ZC0+ZG1hX3BhcmFtcy0+bmFtZSk7Ci0JcHJ0ZC0+ZG1hX2NoID0gaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8ocHJ0ZC0+ZG1hX3BhcmFtcy0+bmFtZSwKLQkJCQkJCURNQV9QUklPX0hJR0gpOwotCWlmIChwcnRkLT5kbWFfY2ggPCAwKSB7CisJcmV0ID0gaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8ocHJ0ZC0+ZG1hX3BhcmFtcy0+bmFtZSwgRE1BX1BSSU9fSElHSCk7CisJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCByZXF1ZXN0aW5nIGRtYSBjaGFubmVsXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KKwlwcnRkLT5kbWFfY2ggPSByZXQ7CiAJaW14X2RtYV9jb25maWdfYnVyc3RsZW4ocHJ0ZC0+ZG1hX2NoLAogCQkJCXBydGQtPmRtYV9wYXJhbXMtPndhdGVybWFya19sZXZlbCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHhfc2ltdGVjLmMgYi9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlYy5jCmluZGV4IDUwN2IyZWQuLmQ0NDFjM2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHhfc2ltdGVjLmMKKysrIGIvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eF9zaW10ZWMuYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZC0+YW1wX2dhaW5bMV0sIDApOwogCX0KIAotCS8qIG5vdGUsIGN1cmVudGx5IHdlIGFzc3VtZSBHUEEwIGlzbid0IHZhbGlkIGFtcCAqLworCS8qIG5vdGUsIGN1cnJlbnRseSB3ZSBhc3N1bWUgR1BBMCBpc24ndCB2YWxpZCBhbXAgKi8KIAlpZiAocGRhdGEtPmFtcF9ncGlvID4gMCkgewogCQlyZXQgPSBncGlvX3JlcXVlc3QocGQtPmFtcF9ncGlvLCAiZ3Bpby1hbXAiKTsKIAkJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jIGIvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jCmluZGV4IDBlYjE3MjIuLjFkNjExMDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zNjAwMC9zNjAwMC1wY20uYworKysgYi9zb3VuZC9zb2MvczYwMDAvczYwMDAtcGNtLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQkJICAgMCAvKiBkZXN0aW5hdGlvbiBza2lwIGFmdGVyIGNodW5rIChpbXBvc3NpYmxlKSAqLywKIAkJCSAgIDQgLyogMTYgYnl0ZSBidXJzdCBzaXplICovLAogCQkJICAgLTEgLyogZG9uJ3QgY29uc2VydmUgYmFuZHdpZHRoICovLAotCQkJICAgMCAvKiBsb3cgd2F0ZXJtYXJrIGlycSBkZXNjcmlwdG9yIHRoZXNob2xkICovLAorCQkJICAgMCAvKiBsb3cgd2F0ZXJtYXJrIGlycSBkZXNjcmlwdG9yIHRocmVzaG9sZCAqLywKIAkJCSAgIDAgLyogZGlzYWJsZSBoYXJkd2FyZSB0aW1lc3RhbXBzICovLAogCQkJICAgMSAvKiBlbmFibGUgY2hhbm5lbCAqLyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvdW5kX2NvcmUuYyBiL3NvdW5kL3NvdW5kX2NvcmUuYwppbmRleCA0OWM5OTgxLi5kYmNhN2M5IDEwMDY0NAotLS0gYS9zb3VuZC9zb3VuZF9jb3JlLmMKKysrIGIvc291bmQvc291bmRfY29yZS5jCkBAIC0zNTMsNyArMzUzLDcgQEAKICAqICAgICAgQGRldjogZGV2aWNlIHBvaW50ZXIKICAqCiAgKglBbGxvY2F0ZSBhIHNwZWNpYWwgc291bmQgZGV2aWNlIGJ5IG1pbm9yIG51bWJlciBmcm9tIHRoZSBzb3VuZAotICoJc3Vic3lzdGVtLiBUaGUgYWxsb2NhdGVkIG51bWJlciBpcyByZXR1cm5lZCBvbiBzdWNjZXMuIE9uIGZhaWx1cmUKKyAqCXN1YnN5c3RlbS4gVGhlIGFsbG9jYXRlZCBudW1iZXIgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gT24gZmFpbHVyZQogICoJYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlzIHJldHVybmVkLgogICovCiAgCmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC9lbXV4L3NvdW5kZm9udC5jIGIvc291bmQvc3ludGgvZW11eC9zb3VuZGZvbnQuYwppbmRleCA2M2M4ZjQ1Li42N2M5MTIzIDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC9lbXV4L3NvdW5kZm9udC5jCisrKyBiL3NvdW5kL3N5bnRoL2VtdXgvc291bmRmb250LmMKQEAgLTM3NCw3ICszNzQsNyBAQAogCiAKIC8qCi0gKiBpbmNyZW1lbnQgc2FtcGxlIGNvdXRlcgorICogaW5jcmVtZW50IHNhbXBsZSBjb3VudGVyCiAgKi8KIHN0YXRpYyB2b2lkCiBzZXRfc2FtcGxlX2NvdW50ZXIoc3RydWN0IHNuZF9zZl9saXN0ICpzZmxpc3QsIHN0cnVjdCBzbmRfc291bmRmb250ICpzZiwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYyBiL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYwppbmRleCBmNzFjZDI4Li45MWJiMjk2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCkBAIC0xOTQsNyArMTk0LDggQEAKIAlpZiAoIXVzMTIybC0+Zmlyc3QpCiAJCXVzMTIybC0+Zmlyc3QgPSBmaWxlOwogCi0JaWYgKHVzMTIybC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfSURfVVMxNDQpIHsKKwlpZiAodXMxMjJsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IFVTQl9JRF9VUzE0NCB8fAorCSAgICB1czEyMmwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gVVNCX0lEX1VTMTQ0TUtJSSkgewogCQlpZmFjZSA9IHVzYl9pZm51bV90b19pZih1czEyMmwtPmRldiwgMCk7CiAJCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpZmFjZSk7CiAJfQpAQCAtMjA5LDcgKzIxMCw4IEBACiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlOwogCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIiVwICVwXG4iLCBodywgZmlsZSk7CiAKLQlpZiAodXMxMjJsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IFVTQl9JRF9VUzE0NCkgeworCWlmICh1czEyMmwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gVVNCX0lEX1VTMTQ0IHx8CisJICAgIHVzMTIybC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfSURfVVMxNDRNS0lJKSB7CiAJCWlmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHVzMTIybC0+ZGV2LCAwKTsKIAkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGlmYWNlKTsKIAl9CkBAIC00NzYsNyArNDc4LDggQEAKIAlpbnQgZXJyOwogCXN0cnVjdCB1czEyMmwgKnVzMTIybCA9IFVTMTIyTChjYXJkKTsKIAotCWlmICh1czEyMmwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gVVNCX0lEX1VTMTQ0KSB7CisJaWYgKHVzMTIybC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfSURfVVMxNDQgfHwKKwkgICAgdXMxMjJsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IFVTQl9JRF9VUzE0NE1LSUkpIHsKIAkJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UodXMxMjJsLT5kZXYsIDAsIDEpOwogCQlpZiAoZXJyKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2Jfc2V0X2ludGVyZmFjZSBlcnJvciBcbiIpOwpAQCAtNDk1LDcgKzQ5OCw4IEBACiAJaWYgKCF1czEyMmxfc3RhcnQodXMxMjJsLCA0NDEwMCwgMjU2KSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKHVzMTIybC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfSURfVVMxNDQpCisJaWYgKHVzMTIybC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfSURfVVMxNDQgfHwKKwkgICAgdXMxMjJsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IFVTQl9JRF9VUzE0NE1LSUkpCiAJCWVyciA9IHVzMTQ0X2NyZWF0ZV91c2JtaWRpKGNhcmQpOwogCWVsc2UKIAkJZXJyID0gdXMxMjJsX2NyZWF0ZV91c2JtaWRpKGNhcmQpOwpAQCAtNTk3LDcgKzYwMSw4IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQlpZiAoZGV2aWNlLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfSURfVVMxNDQKKwlpZiAoKGRldmljZS0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gVVNCX0lEX1VTMTQ0IHx8CisJICAgICBkZXZpY2UtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IFVTQl9JRF9VUzE0NE1LSUkpCiAJCSYmIGRldmljZS0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiZGlzYWJsZSBlaGNpLWhjZCB0byBydW4gVVMtMTQ0IFxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtNjkyLDcgKzY5Nyw4IEBACiAKIAltdXRleF9sb2NrKCZ1czEyMmwtPm11dGV4KTsKIAkvKiBuZWVkZWQsIGRvZXNuJ3QgcmVzdGFydCB3aXRob3V0OiAqLwotCWlmICh1czEyMmwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gVVNCX0lEX1VTMTQ0KSB7CisJaWYgKHVzMTIybC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfSURfVVMxNDQgfHwKKwkgICAgdXMxMjJsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IFVTQl9JRF9VUzE0NE1LSUkpIHsKIAkJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UodXMxMjJsLT5kZXYsIDAsIDEpOwogCQlpZiAoZXJyKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2Jfc2V0X2ludGVyZmFjZSBlcnJvciBcbiIpOwpAQCAtNzM3LDYgKzc0MywxNiBAQAogCQkuaWRWZW5kb3IgPQkweDA2NDQsCiAJCS5pZFByb2R1Y3QgPQlVU0JfSURfVVMxNDQKIAl9LAorCXsKKwkJLm1hdGNoX2ZsYWdzID0JVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJCS5pZFZlbmRvciA9CTB4MDY0NCwKKwkJLmlkUHJvZHVjdCA9CVVTQl9JRF9VUzEyMk1LSUkKKwl9LAorCXsKKwkJLm1hdGNoX2ZsYWdzID0JVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJCS5pZFZlbmRvciA9CTB4MDY0NCwKKwkJLmlkUHJvZHVjdCA9CVVTQl9JRF9VUzE0NE1LSUkKKwl9LAogCXsgLyogdGVybWluYXRvciAqLyB9CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmggYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmgKaW5kZXggNGRhZjE5OC4uZjI2M2IzZiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5oCisrKyBiL3NvdW5kL3VzYi91c3gyeS91czEyMmwuaApAQCAtMjUsNSArMjUsNyBAQAogCiAjZGVmaW5lIFVTQl9JRF9VUzEyMkwgMHg4MDBFCiAjZGVmaW5lIFVTQl9JRF9VUzE0NCAweDgwMEYKKyNkZWZpbmUgVVNCX0lEX1VTMTIyTUtJSSAweDgwMjEKKyNkZWZpbmUgVVNCX0lEX1VTMTQ0TUtJSSAweDgwMjAKIAogI2VuZGlmCg==