LyoKICogIHdpbmJvbmQtY2lyLmMgLSBEcml2ZXIgZm9yIHRoZSBDb25zdW1lciBJUiBmdW5jdGlvbmFsaXR5IG9mIFdpbmJvbmQKICogICAgICAgICAgICAgICAgICBTdXBlckkvTyBjaGlwcy4KICoKICogIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgV2luYm9uZCBXUENEMzc2aSBjaGlwIChQTlAgaWQgV0VDMTAyMiksIGJ1dAogKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQogKiAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgogKgogKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CiAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgSORyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgogKgogKiAgRGVkaWNhdGVkIHRvIE1hdGlsZGEsIG15IG5ld2Jvcm4gZGF1Z2h0ZXIsIHdpdGhvdXQgd2hvc2UgbG92aW5nIGF0dGVudGlvbgogKiAgdGhpcyBkcml2ZXIgd291bGQgaGF2ZSBiZWVuIGZpbmlzaGVkIGluIGhhbGYgdGhlIHRpbWUgYW5kIHdpdGggYSBmcmFjdGlvbgogKiAgb2YgdGhlIGJ1Z3MuCiAqCiAqICBXcml0dGVuIHVzaW5nOgogKiAgICBvIFdpbmJvbmQgV1BDRDM3NkkgZGF0YXNoZWV0IGhlbHBmdWxseSBwcm92aWRlZCBieSBKZXNzZSBCYXJuZXMgYXQgSW50ZWwKICogICAgbyBOYXRTZW1pIFBDODczMzgvUEM5NzMzOCBkYXRhc2hlZXQgKGZvciB0aGUgc2VyaWFsIHBvcnQgc3R1ZmYpCiAqICAgIG8gRFNEVCBkdW1wcwogKgogKiAgU3VwcG9ydGVkIGZlYXR1cmVzOgogKiAgICBvIFJDNgogKiAgICBvIFdha2UtT24tQ0lSIGZ1bmN0aW9uYWxpdHkKICoKICogIFRvIGRvOgogKiAgICBvIFRlc3QgTkVDIGFuZCBSQzUKICoKICogIExlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXI6CiAqICAgIG8gTGVhcm5pbmcgKEkgaGF2ZSBuZWl0aGVyIHRoZSBoYXJkd2FyZSwgbm9yIHRoZSBuZWVkKQogKiAgICBvIElSIFRyYW5zbWl0IChpYmlkKQogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3BucC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiNpbmNsdWRlIDxsaW51eC9pby5oPgojaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KCiNkZWZpbmUgRFJWTkFNRSAid2luYm9uZC1jaXIiCgovKiBDRUlSIFdha2UtVXAgUmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBkYXRhLT53YmFzZSAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DVEwJMHgwMyAvKiBDRUlSIFJlY2VpdmVyIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX1NUUwkweDA0IC8qIENFSVIgUmVjZWl2ZXIgU3RhdHVzCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTgkweDA1IC8qIENFSVIgUmVjZWl2ZXIgRXZlbnQgRW5hYmxlCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NOVEwJMHgwNiAvKiBDRUlSIFJlY2VpdmVyIENvdW50ZXIgTG93CSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NOVEgJMHgwNyAvKiBDRUlSIFJlY2VpdmVyIENvdW50ZXIgSGlnaAkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWAkweDA4IC8qIENFSVIgUmVjZWl2ZXIgSW5kZXgJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0RBVEEJMHgwOSAvKiBDRUlSIFJlY2VpdmVyIERhdGEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NTTAkweDBBIC8qIENFSVIgUmUuIENvbXBhcmUgU3RybGVuCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DRkcxCTB4MEIgLyogQ0VJUiBSZS4gQ29uZmlndXJhdGlvbiAxCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NGRzIJMHgwQyAvKiBDRUlSIFJlLiBDb25maWd1cmF0aW9uIDIJKi8KCi8qIENFSVIgRW5oYW5jZWQgRnVuY3Rpb25hbGl0eSBSZWdpc3RlcnMsIHJlbGF0aXZlIHRvIGRhdGEtPmViYXNlICAgICAgICovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NUUwkweDAwIC8qIEVuaGFuY2VkIElSIENvbnRyb2wgU3RhdHVzCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NDVEwJMHgwMSAvKiBJbmZyYXJlZCBDb3VudGVyIENvbnRyb2wJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ05UX0xPCTB4MDIgLyogSW5mcmFyZWQgQ291bnRlciBMU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NOVF9ISQkweDAzIC8qIEluZnJhcmVkIENvdW50ZXIgTVNCCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9JUkVNCTB4MDQgLyogSW5mcmFyZWQgRW1pdHRlciBTdGF0dXMJCSovCgovKiBTUDMgQmFua2VkIFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+c2Jhc2UgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQlNSCTB4MDMgLyogQmFuayBTZWxlY3QsIGFsbCBiYW5rcwkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMAkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhEQVRBCTB4MDAgLyogRklGTyBSWCBkYXRhIChyKQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1RYREFUQQkweDAwIC8qIEZJRk8gVFggZGF0YSAodykJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JRVIJMHgwMSAvKiBJbnRlcnJ1cHQgRW5hYmxlCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRUlSCTB4MDIgLyogRXZlbnQgSWRlbnRpZmljYXRpb24gKHIpCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19GQ1IJMHgwMiAvKiBGSUZPIENvbnRyb2wgKHcpCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTUNSCTB4MDQgLyogTW9kZSBDb250cm9sCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0xTUgkweDA1IC8qIExpbmsgU3RhdHVzCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX01TUgkweDA2IC8qIE1vZGVtIFN0YXR1cwkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19BU0NSCTB4MDcgLyogQXV4IFN0YXR1cyBhbmQgQ29udHJvbAkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMgkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQkdETAkweDAwIC8qIEJhdWQgRGl2aXNvciBMU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19CR0RICTB4MDEgLyogQmF1ZCBEaXZpc29yIE1TQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0VYQ1IxCTB4MDIgLyogRXh0ZW5kZWQgQ29udHJvbCAxCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRVhDUjIJMHgwNCAvKiBFeHRlbmRlZCBDb250cm9sIDIJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19UWEZMVgkweDA2IC8qIFRYIEZJRk8gTGV2ZWwJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhGTFYJMHgwNyAvKiBSWCBGSUZPIExldmVsCQkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMwkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTVJJRAkweDAwIC8qIE1vZHVsZSBJZGVudGlmaWNhdGlvbgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NIX0xDUgkweDAxIC8qIExDUiBTaGFkb3cJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfU0hfRkNSCTB4MDIgLyogRkNSIFNoYWRvdwkJCSovCgkJCQkgICAgICAvKiBCYW5rIDQJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IxCTB4MDIgLyogSW5mcmFyZWQgQ29udHJvbCAxCQkqLwoJCQkJICAgICAgLyogQmFuayA1CQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNSMgkweDA0IC8qIEluZnJhcmVkIENvbnRyb2wgMgkJKi8KCQkJCSAgICAgIC8qIEJhbmsgNgkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDUjMJMHgwMCAvKiBJbmZyYXJlZCBDb250cm9sIDMJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19TSVJfUFcJMHgwMiAvKiBTSVIgUHVsc2UgV2lkdGgJCSovCgkJCQkgICAgICAvKiBCYW5rIDcJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSUlhEQwkweDAwIC8qIElSIFJYIERlbW9kIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUlRYTUMJMHgwMSAvKiBJUiBUWCBNb2QgQ29udHJvbAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1JDQ0ZHCTB4MDIgLyogQ0VJUiBDb25maWcJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDRkcxCTB4MDQgLyogSW5mcmFyZWQgQ29uZmlnIDEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNGRzQJMHgwNyAvKiBJbmZyYXJlZCBDb25maWcgNAkJKi8KCi8qCiAqIE1hZ2ljIHZhbHVlcyBmb2xsb3cKICovCgovKiBObyBpbnRlcnJ1cHRzIGZvciBXQkNJUl9SRUdfU1AzX0lFUiBhbmQgV0JDSVJfUkVHX1NQM19FSVIgKi8KI2RlZmluZSBXQkNJUl9JUlFfTk9ORQkJMHgwMAovKiBSWCBkYXRhIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19JRVIgYW5kIFdCQ0lSX1JFR19TUDNfRUlSICovCiNkZWZpbmUgV0JDSVJfSVJRX1JYCQkweDAxCi8qIE92ZXIvVW5kZXItZmxvdyBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9FUlIJCTB4MDQKLyogTGVkIGVuYWJsZS9kaXNhYmxlIGJpdCBmb3IgV0JDSVJfUkVHX0VDRUlSX0NUUyAqLwojZGVmaW5lIFdCQ0lSX0xFRF9FTkFCTEUJMHg4MAovKiBSWCBkYXRhIGF2YWlsYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfTFNSICovCiNkZWZpbmUgV0JDSVJfUlhfQVZBSUwJCTB4MDEKLyogUlggZGlzYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfQVNDUiAqLwojZGVmaW5lIFdCQ0lSX1JYX0RJU0FCTEUJMHgyMAovKiBFeHRlbmRlZCBtb2RlIGVuYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfRVhDUjEgKi8KI2RlZmluZSBXQkNJUl9FWFRfRU5BQkxFCTB4MDEKLyogU2VsZWN0IGNvbXBhcmUgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9DT01QQVJFCTB4MTAKLyogU2VsZWN0IG1hc2sgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9NQVNLCTB4MjAKLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBzZWxlY3RlZCByZWdpc3RlciBpbiBXQkNJUl9SRUdfV0NFSVJfSU5ERVggKi8KI2RlZmluZSBXQkNJUl9SRUdfQUREUjAJCTB4MDAKCi8qIFZhbGlkIGJhbmtzIGZvciB0aGUgU1AzIFVBUlQgKi8KZW51bSB3YmNpcl9iYW5rIHsKCVdCQ0lSX0JBTktfMCAgICAgICAgICA9IDB4MDAsCglXQkNJUl9CQU5LXzEgICAgICAgICAgPSAweDgwLAoJV0JDSVJfQkFOS18yICAgICAgICAgID0gMHhFMCwKCVdCQ0lSX0JBTktfMyAgICAgICAgICA9IDB4RTQsCglXQkNJUl9CQU5LXzQgICAgICAgICAgPSAweEU4LAoJV0JDSVJfQkFOS181ICAgICAgICAgID0gMHhFQywKCVdCQ0lSX0JBTktfNiAgICAgICAgICA9IDB4RjAsCglXQkNJUl9CQU5LXzcgICAgICAgICAgPSAweEY0LAp9OwoKLyogU3VwcG9ydGVkIElSIFByb3RvY29scyAqLwplbnVtIHdiY2lyX3Byb3RvY29sIHsKCUlSX1BST1RPQ09MX1JDNSAgICAgICAgICA9IDB4MCwKCUlSX1BST1RPQ09MX05FQyAgICAgICAgICA9IDB4MSwKCUlSX1BST1RPQ09MX1JDNiAgICAgICAgICA9IDB4MiwKfTsKCi8qIE1pc2MgKi8KI2RlZmluZSBXQkNJUl9OQU1FCSJXaW5ib25kIENJUiIKI2RlZmluZSBXQkNJUl9JRF9GQU1JTFkgICAgICAgICAgMHhGMSAvKiBGYW1pbHkgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lCVdCQ0lSX0lEX0NISVAgICAgICAgICAgICAweDA0IC8qIENoaXAgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lIElSX0tFWVBSRVNTX1RJTUVPVVQgICAgICAgMjUwIC8qIEZJWE1FOiBzaG91bGQgYmUgcGVyLXByb3RvY29sPyAqLwojZGVmaW5lIElOVkFMSURfU0NBTkNPREUgICAweDdGRkZGRkZGIC8qIEludmFsaWQgd2l0aCBhbGwgcHJvdG9zCSovCiNkZWZpbmUgV0FLRVVQX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogV2FrZS1VcCBJL08gUmVnIExlbgkJKi8KI2RlZmluZSBFSEZVTkNfSU9NRU1fTEVOICAgICAgICAgMHgxMCAvKiBFbmhhbmNlZCBGdW5jIEkvTyBSZWcgTGVuCSovCiNkZWZpbmUgU1BfSU9NRU1fTEVOICAgICAgICAgICAgIDB4MDggLyogU2VyaWFsIFBvcnQgMyAoSVIpIFJlZyBMZW4JKi8KI2RlZmluZSBXQkNJUl9NQVhfSURMRV9CWVRFUyAgICAgICAxMAoKc3RhdGljIERFRklORV9TUElOTE9DSyh3YmNpcl9sb2NrKTsKc3RhdGljIERFRklORV9SV0xPQ0soa2V5dGFibGVfbG9jayk7CgpzdHJ1Y3Qgd2JjaXJfa2V5IHsKCXUzMiBzY2FuY29kZTsKCXVuc2lnbmVkIGludCBrZXljb2RlOwp9OwoKc3RydWN0IHdiY2lyX2tleWVudHJ5IHsKCXN0cnVjdCB3YmNpcl9rZXkga2V5OwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0Owp9OwoKc3RhdGljIHN0cnVjdCB3YmNpcl9rZXkgcmM2X2RlZl9rZXltYXBbXSA9IHsKCXsgMHg4MDBGMDQwMCwgS0VZX05VTUVSSUNfMAkJfSwKCXsgMHg4MDBGMDQwMSwgS0VZX05VTUVSSUNfMQkJfSwKCXsgMHg4MDBGMDQwMiwgS0VZX05VTUVSSUNfMgkJfSwKCXsgMHg4MDBGMDQwMywgS0VZX05VTUVSSUNfMwkJfSwKCXsgMHg4MDBGMDQwNCwgS0VZX05VTUVSSUNfNAkJfSwKCXsgMHg4MDBGMDQwNSwgS0VZX05VTUVSSUNfNQkJfSwKCXsgMHg4MDBGMDQwNiwgS0VZX05VTUVSSUNfNgkJfSwKCXsgMHg4MDBGMDQwNywgS0VZX05VTUVSSUNfNwkJfSwKCXsgMHg4MDBGMDQwOCwgS0VZX05VTUVSSUNfOAkJfSwKCXsgMHg4MDBGMDQwOSwgS0VZX05VTUVSSUNfOQkJfSwKCXsgMHg4MDBGMDQxRCwgS0VZX05VTUVSSUNfU1RBUgkJfSwKCXsgMHg4MDBGMDQxQywgS0VZX05VTUVSSUNfUE9VTkQJCX0sCgl7IDB4ODAwRjA0MTAsIEtFWV9WT0xVTUVVUAkJfSwKCXsgMHg4MDBGMDQxMSwgS0VZX1ZPTFVNRURPV04JCX0sCgl7IDB4ODAwRjA0MTIsIEtFWV9DSEFOTkVMVVAJCX0sCgl7IDB4ODAwRjA0MTMsIEtFWV9DSEFOTkVMRE9XTgkJfSwKCXsgMHg4MDBGMDQwRSwgS0VZX01VVEUJCQl9LAoJeyAweDgwMEYwNDBELCBLRVlfVkVORE9SCQl9LCAvKiBWaXN0YSBMb2dvIEtleSAqLwoJeyAweDgwMEYwNDFFLCBLRVlfVVAJCQl9LAoJeyAweDgwMEYwNDFGLCBLRVlfRE9XTgkJCX0sCgl7IDB4ODAwRjA0MjAsIEtFWV9MRUZUCQkJfSwKCXsgMHg4MDBGMDQyMSwgS0VZX1JJR0hUCQkJfSwKCXsgMHg4MDBGMDQyMiwgS0VZX09LCQkJfSwKCXsgMHg4MDBGMDQyMywgS0VZX0VTQwkJCX0sCgl7IDB4ODAwRjA0MEYsIEtFWV9JTkZPCQkJfSwKCXsgMHg4MDBGMDQwQSwgS0VZX0NMRUFSCQkJfSwKCXsgMHg4MDBGMDQwQiwgS0VZX0VOVEVSCQkJfSwKCXsgMHg4MDBGMDQ1QiwgS0VZX1JFRAkJCX0sCgl7IDB4ODAwRjA0NUMsIEtFWV9HUkVFTgkJCX0sCgl7IDB4ODAwRjA0NUQsIEtFWV9ZRUxMT1cJCX0sCgl7IDB4ODAwRjA0NUUsIEtFWV9CTFVFCQkJfSwKCXsgMHg4MDBGMDQ1QSwgS0VZX1RFWFQJCQl9LAoJeyAweDgwMEYwNDI3LCBLRVlfU1dJVENIVklERU9NT0RFCX0sCgl7IDB4ODAwRjA0MEMsIEtFWV9QT1dFUgkJCX0sCgl7IDB4ODAwRjA0NTAsIEtFWV9SQURJTwkJCX0sCgl7IDB4ODAwRjA0NDgsIEtFWV9QVlIJCQl9LAoJeyAweDgwMEYwNDQ3LCBLRVlfQVVESU8JCQl9LAoJeyAweDgwMEYwNDI2LCBLRVlfRVBHCQkJfSwKCXsgMHg4MDBGMDQ0OSwgS0VZX0NBTUVSQQkJfSwKCXsgMHg4MDBGMDQyNSwgS0VZX1RWCQkJfSwKCXsgMHg4MDBGMDQ0QSwgS0VZX1ZJREVPCQkJfSwKCXsgMHg4MDBGMDQyNCwgS0VZX0RWRAkJCX0sCgl7IDB4ODAwRjA0MTYsIEtFWV9QTEFZCQkJfSwKCXsgMHg4MDBGMDQxOCwgS0VZX1BBVVNFCQkJfSwKCXsgMHg4MDBGMDQxOSwgS0VZX1NUT1AJCQl9LAoJeyAweDgwMEYwNDE0LCBLRVlfRkFTVEZPUldBUkQJCX0sCgl7IDB4ODAwRjA0MUEsIEtFWV9ORVhUCQkJfSwKCXsgMHg4MDBGMDQxQiwgS0VZX1BSRVZJT1VTCQl9LAoJeyAweDgwMEYwNDE1LCBLRVlfUkVXSU5ECQl9LAoJeyAweDgwMEYwNDE3LCBLRVlfUkVDT1JECQl9LAp9OwoKLyogUmVnaXN0ZXJzIGFuZCBvdGhlciBzdGF0ZSBpcyBwcm90ZWN0ZWQgYnkgd2JjaXJfbG9jayAqLwpzdHJ1Y3Qgd2JjaXJfZGF0YSB7Cgl1bnNpZ25lZCBsb25nIHdiYXNlOyAgICAgICAgLyogV2FrZS1VcCBCYXNlYWRkcgkJKi8KCXVuc2lnbmVkIGxvbmcgZWJhc2U7ICAgICAgICAvKiBFbmhhbmNlZCBGdW5jLiBCYXNlYWRkcgkqLwoJdW5zaWduZWQgbG9uZyBzYmFzZTsgICAgICAgIC8qIFNlcmlhbCBQb3J0IEJhc2VhZGRyCSovCgl1bnNpZ25lZCBpbnQgIGlycTsgICAgICAgICAgLyogU2VyaWFsIFBvcnQgSVJRCQkqLwoKCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX2tleXVwOwoJc3RydWN0IGxlZF90cmlnZ2VyICpyeHRyaWdnZXI7CglzdHJ1Y3QgbGVkX3RyaWdnZXIgKnR4dHJpZ2dlcjsKCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkOwoKCXUzMiBsYXN0X3NjYW5jb2RlOwoJdW5zaWduZWQgaW50IGxhc3Rfa2V5Y29kZTsKCXU4IGxhc3RfdG9nZ2xlOwoJdTgga2V5cHJlc3NlZDsKCXVuc2lnbmVkIGxvbmcga2V5dXBfamlmZmllczsKCXVuc2lnbmVkIGludCBpZGxlX2NvdW50OwoKCS8qIFJYIGlyZGF0YSBhbmQgcGFyc2luZyBzdGF0ZSAqLwoJdW5zaWduZWQgbG9uZyBpcmRhdGFbMzBdOwoJdW5zaWduZWQgaW50IGlyZGF0YV9jb3VudDsKCXVuc2lnbmVkIGludCBpcmRhdGFfaWRsZTsKCXVuc2lnbmVkIGludCBpcmRhdGFfb2ZmOwoJdW5zaWduZWQgaW50IGlyZGF0YV9lcnJvcjsKCgkvKiBQcm90ZWN0ZWQgYnkga2V5dGFibGVfbG9jayAqLwoJc3RydWN0IGxpc3RfaGVhZCBrZXl0YWJsZTsKfTsKCnN0YXRpYyBlbnVtIHdiY2lyX3Byb3RvY29sIHByb3RvY29sID0gSVJfUFJPVE9DT0xfUkM2Owptb2R1bGVfcGFyYW0ocHJvdG9jb2wsIHVpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHByb3RvY29sLCAiSVIgcHJvdG9jb2wgdG8gdXNlICIKCQkgIigwID0gUkM1LCAxID0gTkVDLCAyID0gUkM2QSwgZGVmYXVsdCkiKTsKCnN0YXRpYyBpbnQgaW52ZXJ0OyAvKiBkZWZhdWx0ID0gMCAqLwptb2R1bGVfcGFyYW0oaW52ZXJ0LCBib29sLCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhpbnZlcnQsICJJbnZlcnQgdGhlIHNpZ25hbCBmcm9tIHRoZSBJUiByZWNlaXZlciIpOwoKc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX3NjID0gMHg4MDBGMDQwQzsKbW9kdWxlX3BhcmFtKHdha2Vfc2MsIHVpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHdha2Vfc2MsICJTY2FuY29kZSBvZiB0aGUgcG93ZXItb24gSVIgY29tbWFuZCIpOwoKc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX3JjNm1vZGUgPSA2Owptb2R1bGVfcGFyYW0od2FrZV9yYzZtb2RlLCB1aW50LCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyh3YWtlX3JjNm1vZGUsICJSQzYgbW9kZSBmb3IgdGhlIHBvd2VyLW9uIGNvbW1hbmQgIgoJCSAiKDAgPSAwLCA2ID0gNkEsIGRlZmF1bHQpIik7CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBVVElMSVRZIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCB3YmNpcl9sb2NrICovCnN0YXRpYyB2b2lkCndiY2lyX3NldF9iaXRzKHVuc2lnbmVkIGxvbmcgYWRkciwgdTggYml0cywgdTggbWFzaykKewoJdTggdmFsOwoKCXZhbCA9IGluYihhZGRyKTsKCXZhbCA9ICgodmFsICYgfm1hc2spIHwgKGJpdHMgJiBtYXNrKSk7CglvdXRiKHZhbCwgYWRkcik7Cn0KCi8qIFNlbGVjdHMgdGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSBzZXJpYWwgcG9ydCAqLwpzdGF0aWMgaW5saW5lIHZvaWQKd2JjaXJfc2VsZWN0X2Jhbmsoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIGVudW0gd2JjaXJfYmFuayBiYW5rKQp7CglvdXRiKGJhbmssIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CU1IpOwp9CgpzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcwp3YmNpcl9sZWRfYnJpZ2h0bmVzc19nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAoJCQkJCSAgICAgICBzdHJ1Y3Qgd2JjaXJfZGF0YSwKCQkJCQkgICAgICAgbGVkKTsKCglpZiAoaW5iKGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUykgJiBXQkNJUl9MRURfRU5BQkxFKQoJCXJldHVybiBMRURfRlVMTDsKCWVsc2UKCQlyZXR1cm4gTEVEX09GRjsKfQoKc3RhdGljIHZvaWQKd2JjaXJfbGVkX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAoJCQkgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGNvbnRhaW5lcl9vZihsZWRfY2RldiwKCQkJCQkgICAgICAgc3RydWN0IHdiY2lyX2RhdGEsCgkJCQkJICAgICAgIGxlZCk7CgoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ1RTLAoJCSAgICAgICBicmlnaHRuZXNzID09IExFRF9PRkYgPyAweDAwIDogV0JDSVJfTEVEX0VOQUJMRSwKCQkgICAgICAgV0JDSVJfTEVEX0VOQUJMRSk7Cn0KCi8qIE1hbmNoZXN0ZXIgZW5jb2RlcyBiaXRzIHRvIFJDNiBtZXNzYWdlIGNlbGxzIChzZWUgd2JjaXJfcGFyc2VfcmM2KSAqLwpzdGF0aWMgdTgKd2JjaXJfdG9fcmM2Y2VsbHModTggdmFsKQp7Cgl1OCBjb2RlZCA9IDB4MDA7CglpbnQgaTsKCgl2YWwgJj0gMHgwRjsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlpZiAodmFsICYgMHgwMSkKCQkJY29kZWQgfD0gMHgwMiA8PCAoaSAqIDIpOwoJCWVsc2UKCQkJY29kZWQgfD0gMHgwMSA8PCAoaSAqIDIpOwoJCXZhbCA+Pj0gMTsKCX0KCglyZXR1cm4gY29kZWQ7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIElOUFVUIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdW5zaWduZWQgaW50CndiY2lyX2RvX2dldGtleWNvZGUoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIHUzMiBzY2FuY29kZSkKewoJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXllbnRyeTsKCXVuc2lnbmVkIGludCBrZXljb2RlID0gS0VZX1JFU0VSVkVEOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglyZWFkX2xvY2tfaXJxc2F2ZSgma2V5dGFibGVfbG9jaywgZmxhZ3MpOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoa2V5ZW50cnksICZkYXRhLT5rZXl0YWJsZSwgbGlzdCkgewoJCWlmIChrZXllbnRyeS0+a2V5LnNjYW5jb2RlID09IHNjYW5jb2RlKSB7CgkJCWtleWNvZGUgPSBrZXllbnRyeS0+a2V5LmtleWNvZGU7CgkJCWJyZWFrOwoJCX0KCX0KCglyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZrZXl0YWJsZV9sb2NrLCBmbGFncyk7CglyZXR1cm4ga2V5Y29kZTsKfQoKc3RhdGljIGludAp3YmNpcl9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKCgkqa2V5Y29kZSA9IChpbnQpd2JjaXJfZG9fZ2V0a2V5Y29kZShkYXRhLCAodTMyKXNjYW5jb2RlKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CndiY2lyX3NldGtleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc3NjYW5jb2RlLCBpbnQga2V5Y29kZSkKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwoJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXllbnRyeTsKCXN0cnVjdCB3YmNpcl9rZXllbnRyeSAqbmV3X2tleWVudHJ5OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCBvbGRfa2V5Y29kZSA9IEtFWV9SRVNFUlZFRDsKCXUzMiBzY2FuY29kZSA9ICh1MzIpc3NjYW5jb2RlOwoKCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKCQlyZXR1cm4gLUVJTlZBTDsKCgluZXdfa2V5ZW50cnkgPSBrbWFsbG9jKHNpemVvZigqbmV3X2tleWVudHJ5KSwgR0ZQX0tFUk5FTCk7CglpZiAoIW5ld19rZXllbnRyeSkKCQlyZXR1cm4gLUVOT01FTTsKCgl3cml0ZV9sb2NrX2lycXNhdmUoJmtleXRhYmxlX2xvY2ssIGZsYWdzKTsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleWVudHJ5LCAmZGF0YS0+a2V5dGFibGUsIGxpc3QpIHsKCQlpZiAoa2V5ZW50cnktPmtleS5zY2FuY29kZSAhPSBzY2FuY29kZSkKCQkJY29udGludWU7CgoJCW9sZF9rZXljb2RlID0ga2V5ZW50cnktPmtleS5rZXljb2RlOwoJCWtleWVudHJ5LT5rZXkua2V5Y29kZSA9IGtleWNvZGU7CgoJCWlmIChrZXllbnRyeS0+a2V5LmtleWNvZGUgPT0gS0VZX1JFU0VSVkVEKSB7CgkJCWxpc3RfZGVsKCZrZXllbnRyeS0+bGlzdCk7CgkJCWtmcmVlKGtleWVudHJ5KTsKCQl9CgoJCWJyZWFrOwoJfQoKCXNldF9iaXQoa2V5Y29kZSwgZGV2LT5rZXliaXQpOwoKCWlmIChvbGRfa2V5Y29kZSA9PSBLRVlfUkVTRVJWRUQpIHsKCQluZXdfa2V5ZW50cnktPmtleS5zY2FuY29kZSA9IHNjYW5jb2RlOwoJCW5ld19rZXllbnRyeS0+a2V5LmtleWNvZGUgPSBrZXljb2RlOwoJCWxpc3RfYWRkKCZuZXdfa2V5ZW50cnktPmxpc3QsICZkYXRhLT5rZXl0YWJsZSk7Cgl9IGVsc2UgewoJCWtmcmVlKG5ld19rZXllbnRyeSk7CgkJY2xlYXJfYml0KG9sZF9rZXljb2RlLCBkZXYtPmtleWJpdCk7CgkJbGlzdF9mb3JfZWFjaF9lbnRyeShrZXllbnRyeSwgJmRhdGEtPmtleXRhYmxlLCBsaXN0KSB7CgkJCWlmIChrZXllbnRyeS0+a2V5LmtleWNvZGUgPT0gb2xkX2tleWNvZGUpIHsKCQkJCXNldF9iaXQob2xkX2tleWNvZGUsIGRldi0+a2V5Yml0KTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZrZXl0YWJsZV9sb2NrLCBmbGFncyk7CglyZXR1cm4gMDsKfQoKLyoKICogVGltZXIgZnVuY3Rpb24gdG8gcmVwb3J0IGtleXVwIGV2ZW50IHNvbWUgdGltZSBhZnRlciBrZXlkb3duIGlzCiAqIHJlcG9ydGVkIGJ5IHRoZSBJU1IuCiAqLwpzdGF0aWMgdm9pZAp3YmNpcl9rZXl1cCh1bnNpZ25lZCBsb25nIGNvb2tpZSkKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSAoc3RydWN0IHdiY2lyX2RhdGEgKiljb29raWU7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCS8qCgkgKiBkYXRhLT5rZXl1cF9qaWZmaWVzIGlzIHVzZWQgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIGlmIGEKCSAqIGhhcmR3YXJlIGludGVycnVwdCBvY2N1cnMgYXQgdGhpcyBwb2ludCBhbmQgdGhlIGtleXVwIHRpbWVyCgkgKiBldmVudCBpcyBtb3ZlZCBmdXJ0aGVyIGludG8gdGhlIGZ1dHVyZSBhcyBhIHJlc3VsdC4KCSAqCgkgKiBUaGUgdGltZXIgd2lsbCB0aGVuIGJlIHJlYWN0aXZhdGVkIGFuZCB0aGlzIGZ1bmN0aW9uIGNhbGxlZAoJICogYWdhaW4gaW4gdGhlIGZ1dHVyZS4gV2UgbmVlZCB0byBleGl0IGdyYWNlZnVsbHkgaW4gdGhhdCBjYXNlCgkgKiB0byBhbGxvdyB0aGUgaW5wdXQgc3Vic3lzdGVtIHRvIGRvIGl0cyBhdXRvLXJlcGVhdCBtYWdpYyBvcgoJICogYSBrZXl1cCBldmVudCBtaWdodCBmb2xsb3cgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGtleWRvd24uCgkgKi8KCglzcGluX2xvY2tfaXJxc2F2ZSgmd2JjaXJfbG9jaywgZmxhZ3MpOwoKCWlmICh0aW1lX2lzX2FmdGVyX2VxX2ppZmZpZXMoZGF0YS0+a2V5dXBfamlmZmllcykgJiYgZGF0YS0+a2V5cHJlc3NlZCkgewoJCWRhdGEtPmtleXByZXNzZWQgPSAwOwoJCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwgTEVEX09GRik7CgkJaW5wdXRfcmVwb3J0X2tleShkYXRhLT5pbnB1dF9kZXYsIGRhdGEtPmxhc3Rfa2V5Y29kZSwgMCk7CgkJaW5wdXRfc3luYyhkYXRhLT5pbnB1dF9kZXYpOwoJfQoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndiY2lyX2xvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQKd2JjaXJfa2V5ZG93bihzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgdTMyIHNjYW5jb2RlLCB1OCB0b2dnbGUpCnsKCXVuc2lnbmVkIGludCBrZXljb2RlOwoKCS8qIFJlcGVhdD8gKi8KCWlmIChkYXRhLT5sYXN0X3NjYW5jb2RlID09IHNjYW5jb2RlICYmCgkgICAgZGF0YS0+bGFzdF90b2dnbGUgPT0gdG9nZ2xlICYmCgkgICAgZGF0YS0+a2V5cHJlc3NlZCkKCQlnb3RvIHNldF90aW1lcjsKCWRhdGEtPmxhc3Rfc2NhbmNvZGUgPSBzY2FuY29kZTsKCgkvKiBEbyB3ZSBuZWVkIHRvIHJlbGVhc2UgYW4gb2xkIGtleXByZXNzPyAqLwoJaWYgKGRhdGEtPmtleXByZXNzZWQpIHsKCQlpbnB1dF9yZXBvcnRfa2V5KGRhdGEtPmlucHV0X2RldiwgZGF0YS0+bGFzdF9rZXljb2RlLCAwKTsKCQlpbnB1dF9zeW5jKGRhdGEtPmlucHV0X2Rldik7CgkJZGF0YS0+a2V5cHJlc3NlZCA9IDA7Cgl9CgoJLyogUmVwb3J0IHNjYW5jb2RlICovCglpbnB1dF9ldmVudChkYXRhLT5pbnB1dF9kZXYsIEVWX01TQywgTVNDX1NDQU4sIChpbnQpc2NhbmNvZGUpOwoKCS8qIERvIHdlIGtub3cgdGhpcyBzY2FuY29kZT8gKi8KCWtleWNvZGUgPSB3YmNpcl9kb19nZXRrZXljb2RlKGRhdGEsIHNjYW5jb2RlKTsKCWlmIChrZXljb2RlID09IEtFWV9SRVNFUlZFRCkKCQlnb3RvIHNldF90aW1lcjsKCgkvKiBSZWdpc3RlciBhIGtleXByZXNzICovCglpbnB1dF9yZXBvcnRfa2V5KGRhdGEtPmlucHV0X2Rldiwga2V5Y29kZSwgMSk7CglkYXRhLT5rZXlwcmVzc2VkID0gMTsKCWRhdGEtPmxhc3Rfa2V5Y29kZSA9IGtleWNvZGU7CglkYXRhLT5sYXN0X3RvZ2dsZSA9IHRvZ2dsZTsKCnNldF90aW1lcjoKCWlucHV0X3N5bmMoZGF0YS0+aW5wdXRfZGV2KTsKCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwKCQkJICBkYXRhLT5rZXlwcmVzc2VkID8gTEVEX0ZVTEwgOiBMRURfT0ZGKTsKCWRhdGEtPmtleXVwX2ppZmZpZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJUl9LRVlQUkVTU19USU1FT1VUKTsKCW1vZF90aW1lcigmZGF0YS0+dGltZXJfa2V5dXAsIGRhdGEtPmtleXVwX2ppZmZpZXMpOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBJUiBQQVJTSU5HIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBSZXNldHMgYWxsIGlyZGF0YSAqLwpzdGF0aWMgdm9pZAp3YmNpcl9yZXNldF9pcmRhdGEoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEpCnsKCW1lbXNldChkYXRhLT5pcmRhdGEsIDAsIHNpemVvZihkYXRhLT5pcmRhdGEpKTsKCWRhdGEtPmlyZGF0YV9jb3VudCA9IDA7CglkYXRhLT5pcmRhdGFfb2ZmID0gMDsKCWRhdGEtPmlyZGF0YV9lcnJvciA9IDA7Cn0KCi8qIEFkZHMgb25lIGJpdCBvZiBpcmRhdGEgKi8Kc3RhdGljIHZvaWQKYWRkX2lyZGF0YV9iaXQoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIGludCBzZXQpCnsKCWlmIChkYXRhLT5pcmRhdGFfY291bnQgPj0gc2l6ZW9mKGRhdGEtPmlyZGF0YSkgKiA4KSB7CgkJZGF0YS0+aXJkYXRhX2Vycm9yID0gMTsKCQlyZXR1cm47Cgl9CgoJaWYgKHNldCkKCQlfX3NldF9iaXQoZGF0YS0+aXJkYXRhX2NvdW50LCBkYXRhLT5pcmRhdGEpOwoJZGF0YS0+aXJkYXRhX2NvdW50Kys7Cn0KCi8qIEdldHMgY291bnQgYml0cyBvZiBpcmRhdGEgKi8Kc3RhdGljIHUxNgpnZXRfYml0cyhzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgaW50IGNvdW50KQp7Cgl1MTYgdmFsID0gMHgwOwoKCWlmIChkYXRhLT5pcmRhdGFfY291bnQgLSBkYXRhLT5pcmRhdGFfb2ZmIDwgY291bnQpIHsKCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOwoJCXJldHVybiAweDA7Cgl9CgoJd2hpbGUgKGNvdW50ID4gMCkgewoJCXZhbCA8PD0gMTsKCQlpZiAodGVzdF9iaXQoZGF0YS0+aXJkYXRhX29mZiwgZGF0YS0+aXJkYXRhKSkKCQkJdmFsIHw9IDB4MTsKCQljb3VudC0tOwoJCWRhdGEtPmlyZGF0YV9vZmYrKzsKCX0KCglyZXR1cm4gdmFsOwp9CgovKiBSZWFkcyAxNiBjZWxscyBhbmQgY29udmVydHMgdGhlbSB0byBhIGJ5dGUgKi8Kc3RhdGljIHU4CndiY2lyX3JjNmNlbGxzX3RvX2J5dGUoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEpCnsKCXUxNiByYXcgPSBnZXRfYml0cyhkYXRhLCAxNik7Cgl1OCB2YWwgPSAweDAwOwoJaW50IGJpdDsKCglmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CgkJc3dpdGNoIChyYXcgJiAweDAzKSB7CgkJY2FzZSAweDAxOgoJCQlicmVhazsKCQljYXNlIDB4MDI6CgkJCXZhbCB8PSAoMHgwMSA8PCBiaXQpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOwoJCQlicmVhazsKCQl9CgkJcmF3ID4+PSAyOwoJfQoKCXJldHVybiB2YWw7Cn0KCi8qIERlY29kZXMgYSBudW1iZXIgb2YgYml0cyBmcm9tIHJhdyBSQzUgZGF0YSAqLwpzdGF0aWMgdTgKd2JjaXJfZ2V0X3JjNWJpdHMoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKewoJdTE2IHJhdyA9IGdldF9iaXRzKGRhdGEsIGNvdW50ICogMik7Cgl1OCB2YWwgPSAweDAwOwoJaW50IGJpdDsKCglmb3IgKGJpdCA9IDA7IGJpdCA8IGNvdW50OyBiaXQrKykgewoJCXN3aXRjaCAocmF3ICYgMHgwMykgewoJCWNhc2UgMHgwMToKCQkJdmFsIHw9ICgweDAxIDw8IGJpdCk7CgkJCWJyZWFrOwoJCWNhc2UgMHgwMjoKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZGF0YS0+aXJkYXRhX2Vycm9yID0gMTsKCQkJYnJlYWs7CgkJfQoJCXJhdyA+Pj0gMjsKCX0KCglyZXR1cm4gdmFsOwp9CgpzdGF0aWMgdm9pZAp3YmNpcl9wYXJzZV9yYzYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKewoJLyoKCSAqIE5vcm1hbCBiaXRzIGFyZSBtYW5jaGVzdGVyIGNvZGVkIGFzIGZvbGxvd3M6CgkgKiBjZWxsMCArIGNlbGwxID0gbG9naWMgIjAiCgkgKiBjZWxsMSArIGNlbGwwID0gbG9naWMgIjEiCgkgKgoJICogVGhlIElSIHB1bHNlIGhhcyB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6CgkgKgoJICogTGVhZGVyCQktIDYgKiBjZWxsMSAtIGRpc2NhcmRlZAoJICogR2FwICAgIAkJLSAyICogY2VsbDAgLSBkaXNjYXJkZWQKCSAqIFN0YXJ0IGJpdAkJLSBOb3JtYWwgQ29kaW5nIC0gYWx3YXlzICIxIgoJICogTW9kZSBCaXQgMiAtIDAJLSBOb3JtYWwgQ29kaW5nCgkgKiBUb2dnbGUgYml0CQktIE5vcm1hbCBDb2Rpbmcgd2l0aCBkb3VibGUgYml0IHRpbWUsCgkgKgkJCSAgZS5nLiBjZWxsMCArIGNlbGwwICsgY2VsbDEgKyBjZWxsMQoJICoJCQkgIG1lYW5zIGxvZ2ljICIwIi4KCSAqCgkgKiBUaGUgcmVzdCBkZXBlbmRzIG9uIHRoZSBtb2RlLCB0aGUgZm9sbG93aW5nIG1vZGVzIGFyZSBrbm93bjoKCSAqCgkgKiBNT0RFIDA6CgkgKiAgQWRkcmVzcyBCaXQgNyAtIDAJLSBOb3JtYWwgQ29kaW5nCgkgKiAgQ29tbWFuZCBCaXQgNyAtIDAJLSBOb3JtYWwgQ29kaW5nCgkgKgoJICogTU9ERSA2OgoJICogIFRoZSBhYm92ZSBUb2dnbGUgQml0IGlzIHVzZWQgYXMgYSBzdWJtb2RlIGJpdCwgMCA9IEEsIDEgPSBCLgoJICogIFN1Ym1vZGUgQiBpcyBmb3IgcG9pbnRpbmcgZGV2aWNlcywgb25seSByZW1vdGVzIHVzaW5nIHN1Ym1vZGUgQQoJICogIGFyZSBzdXBwb3J0ZWQuCgkgKgoJICogIEN1c3RvbWVyIHJhbmdlIGJpdAktIDAgPT4gQ3VzdG9tZXIgPSA3IGJpdHMsIDAuLi4xMjcKCSAqICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiBDdXN0b21lciA9IDE1IGJpdHMsIDMyNzY4Li4uNjU1MzUKCSAqICBDdXN0b21lciBCaXRzCS0gTm9ybWFsIENvZGluZwoJICoKCSAqICBDdXN0b21lciBjb2RlcyBhcmUgYWxsb2NhdGVkIGJ5IFBoaWxpcHMuIFRoZSByZXN0IG9mIHRoZSBiaXRzCgkgKiAgYXJlIGN1c3RvbWVyIGRlcGVuZGVudC4gVGhlIGZvbGxvd2luZyBpcyBjb21tb25seSB1c2VkIChhbmQgdGhlCgkgKiAgb25seSBzdXBwb3J0ZWQgY29uZmlnKToKCSAqCgkgKiAgVG9nZ2xlIEJpdAkJLSBOb3JtYWwgQ29kaW5nCgkgKiAgQWRkcmVzcyBCaXQgNiAtIDAJLSBOb3JtYWwgQ29kaW5nCgkgKiAgQ29tbWFuZCBCaXQgNyAtIDAJLSBOb3JtYWwgQ29kaW5nCgkgKgoJICogQWxsIG1vZGVzIGFyZSBmb2xsb3dlZCBieSBhdCBsZWFzdCA2ICogY2VsbDAuCgkgKgoJICogTU9ERSAwIG1zZ2xlbjoKCSAqICAxICogMiAoc3RhcnQgYml0KSArIDMgKiAyIChtb2RlKSArIDIgKiAyICh0b2dnbGUpICsKCSAqICA4ICogMiAoYWRkcmVzcykgKyA4ICogMiAoY29tbWFuZCkgPQoJICogIDQ0IGNlbGxzCgkgKgoJICogTU9ERSA2QSBtc2dsZW46CgkgKiAgMSAqIDIgKHN0YXJ0IGJpdCkgKyAzICogMiAobW9kZSkgKyAyICogMiAoc3VibW9kZSkgKwoJICogIDEgKiAyIChjdXN0b21lciByYW5nZSBiaXQpICsgNy8xNSAqIDIgKGN1c3RvbWVyIGJpdHMpICsKCSAqICAxICogMiAodG9nZ2xlIGJpdCkgKyA3ICogMiAoYWRkcmVzcykgKyA4ICogMiAoY29tbWFuZCkgPQoJICogIDYwIC0gNzYgY2VsbHMKCSAqLwoJdTggbW9kZTsKCXU4IHRvZ2dsZTsKCXUxNiBjdXN0b21lciA9IDB4MDsKCXU4IGFkZHJlc3M7Cgl1OCBjb21tYW5kOwoJdTMyIHNjYW5jb2RlOwoKCS8qIExlYWRlciBtYXJrICovCgl3aGlsZSAoZ2V0X2JpdHMoZGF0YSwgMSkgJiYgIWRhdGEtPmlyZGF0YV9lcnJvcikKCQkvKiBEbyBub3RoaW5nICovOwoKCS8qIExlYWRlciBzcGFjZSAqLwoJaWYgKGdldF9iaXRzKGRhdGEsIDEpKSB7CgkJZGV2X2RiZyhkZXYsICJSQzYgLSBJbnZhbGlkIGxlYWRlciBzcGFjZVxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIFN0YXJ0IGJpdCAqLwoJaWYgKGdldF9iaXRzKGRhdGEsIDIpICE9IDB4MDIpIHsKCQlkZXZfZGJnKGRldiwgIlJDNiAtIEludmFsaWQgc3RhcnQgYml0XG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogTW9kZSAqLwoJbW9kZSA9IGdldF9iaXRzKGRhdGEsIDYpOwoJc3dpdGNoIChtb2RlKSB7CgljYXNlIDB4MTU6IC8qIDAxMDEwMSA9IGIwMDAgKi8KCQltb2RlID0gMDsKCQlicmVhazsKCWNhc2UgMHgyOTogLyogMTAxMDAxID0gYjExMCAqLwoJCW1vZGUgPSA2OwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZGJnKGRldiwgIlJDNiAtIEludmFsaWQgbW9kZVxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIFRvZ2dsZSBiaXQgLyBTdWJtb2RlIGJpdCAqLwoJdG9nZ2xlID0gZ2V0X2JpdHMoZGF0YSwgNCk7Cglzd2l0Y2ggKHRvZ2dsZSkgewoJY2FzZSAweDAzOgoJCXRvZ2dsZSA9IDA7CgkJYnJlYWs7CgljYXNlIDB4MEM6CgkJdG9nZ2xlID0gMTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJZGV2X2RiZyhkZXYsICJSQzYgLSBUb2dnbGUgYml0IGVycm9yXG4iKTsKCQlicmVhazsKCX0KCgkvKiBDdXN0b21lciAqLwoJaWYgKG1vZGUgPT0gNikgewoJCWlmICh0b2dnbGUgIT0gMCkgewoJCQlkZXZfZGJnKGRldiwgIlJDNkIgLSBOb3QgU3VwcG9ydGVkXG4iKTsKCQkJcmV0dXJuOwoJCX0KCgkJY3VzdG9tZXIgPSB3YmNpcl9yYzZjZWxsc190b19ieXRlKGRhdGEpOwoKCQlpZiAoY3VzdG9tZXIgJiAweDgwKSB7CgkJCS8qIDE1IGJpdCBjdXN0b21lciB2YWx1ZSAqLwoJCQljdXN0b21lciA8PD0gODsKCQkJY3VzdG9tZXIgfD0gd2JjaXJfcmM2Y2VsbHNfdG9fYnl0ZShkYXRhKTsKCQl9Cgl9CgoJLyogQWRkcmVzcyAqLwoJYWRkcmVzcyA9IHdiY2lyX3JjNmNlbGxzX3RvX2J5dGUoZGF0YSk7CglpZiAobW9kZSA9PSA2KSB7CgkJdG9nZ2xlID0gYWRkcmVzcyA+PiA3OwoJCWFkZHJlc3MgJj0gMHg3RjsKCX0KCgkvKiBDb21tYW5kICovCgljb21tYW5kID0gd2JjaXJfcmM2Y2VsbHNfdG9fYnl0ZShkYXRhKTsKCgkvKiBDcmVhdGUgc2NhbmNvZGUgKi8KCXNjYW5jb2RlID0gIGNvbW1hbmQ7CglzY2FuY29kZSB8PSBhZGRyZXNzIDw8IDg7CglzY2FuY29kZSB8PSBjdXN0b21lciA8PCAxNjsKCgkvKiBMYXN0IHNhbml0eSBjaGVjayAqLwoJaWYgKGRhdGEtPmlyZGF0YV9lcnJvcikgewoJCWRldl9kYmcoZGV2LCAiUkM2IC0gQ2VsbCBlcnJvcihzKVxuIik7CgkJcmV0dXJuOwoJfQoKCWRldl9pbmZvKGRldiwgIklSLVJDNiBhZCAweCUwMlggY20gMHglMDJYIGN1IDB4JTA0WCAiCgkJInRvZ2dsZSAldSBtb2RlICV1IHNjYW4gMHglMDhYXG4iLAoJCWFkZHJlc3MsCgkJY29tbWFuZCwKCQljdXN0b21lciwKCQkodW5zaWduZWQgaW50KXRvZ2dsZSwKCQkodW5zaWduZWQgaW50KW1vZGUsCgkJc2NhbmNvZGUpOwoKCXdiY2lyX2tleWRvd24oZGF0YSwgc2NhbmNvZGUsIHRvZ2dsZSk7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX3BhcnNlX3JjNShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQp7CgkvKgoJICogQml0cyBhcmUgbWFuY2hlc3RlciBjb2RlZCBhcyBmb2xsb3dzOgoJICogY2VsbDEgKyBjZWxsMCA9IGxvZ2ljICIwIgoJICogY2VsbDAgKyBjZWxsMSA9IGxvZ2ljICIxIgoJICogKGkuZS4gdGhlIHJldmVyc2Ugb2YgUkM2KQoJICoKCSAqIFN0YXJ0IGJpdCAxCQktICIxIiAtIGRpc2NhcmRlZAoJICogU3RhcnQgYml0IDIJCS0gTXVzdCBiZSBpbnZlcnRlZCB0byBnZXQgY29tbWFuZCBiaXQgNgoJICogVG9nZ2xlIGJpdAoJICogQWRkcmVzcyBCaXQgNCAtIDAKCSAqIENvbW1hbmQgQml0IDUgLSAwCgkgKi8KCXU4IHRvZ2dsZTsKCXU4IGFkZHJlc3M7Cgl1OCBjb21tYW5kOwoJdTMyIHNjYW5jb2RlOwoKCS8qIFN0YXJ0IGJpdCAxICovCglpZiAoIWdldF9iaXRzKGRhdGEsIDEpKSB7CgkJZGV2X2RiZyhkZXYsICJSQzUgLSBJbnZhbGlkIHN0YXJ0IGJpdFxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIFN0YXJ0IGJpdCAyICovCglpZiAoIXdiY2lyX2dldF9yYzViaXRzKGRhdGEsIDEpKQoJCWNvbW1hbmQgPSAweDQwOwoJZWxzZQoJCWNvbW1hbmQgPSAweDAwOwoKCXRvZ2dsZSAgID0gd2JjaXJfZ2V0X3JjNWJpdHMoZGF0YSwgMSk7CglhZGRyZXNzICA9IHdiY2lyX2dldF9yYzViaXRzKGRhdGEsIDUpOwoJY29tbWFuZCB8PSB3YmNpcl9nZXRfcmM1Yml0cyhkYXRhLCA2KTsKCXNjYW5jb2RlID0gYWRkcmVzcyA8PCA3IHwgY29tbWFuZDsKCgkvKiBMYXN0IHNhbml0eSBjaGVjayAqLwoJaWYgKGRhdGEtPmlyZGF0YV9lcnJvcikgewoJCWRldl9kYmcoZGV2LCAiUkM1IC0gSW52YWxpZCBtZXNzYWdlXG4iKTsKCQlyZXR1cm47Cgl9CgoJZGV2X2RiZyhkZXYsICJJUi1SQzUgYWQgJXUgY20gJXUgdCAldSBzICV1XG4iLAoJCSh1bnNpZ25lZCBpbnQpYWRkcmVzcywKCQkodW5zaWduZWQgaW50KWNvbW1hbmQsCgkJKHVuc2lnbmVkIGludCl0b2dnbGUsCgkJKHVuc2lnbmVkIGludClzY2FuY29kZSk7CgoJd2JjaXJfa2V5ZG93bihkYXRhLCBzY2FuY29kZSwgdG9nZ2xlKTsKfQoKc3RhdGljIHZvaWQKd2JjaXJfcGFyc2VfbmVjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEpCnsKCS8qCgkgKiBFYWNoIGJpdCByZXByZXNlbnRzIDU2MCB1cy4KCSAqCgkgKiBMZWFkZXIJCS0gOSBtcyBidXJzdAoJICogR2FwCQkJLSA0LjUgbXMgc2lsZW5jZQoJICogQWRkcmVzczEgYml0IDAgLSA3CS0gQWRkcmVzcyAxCgkgKiBBZGRyZXNzMiBiaXQgMCAtIDcJLSBBZGRyZXNzIDIKCSAqIENvbW1hbmQxIGJpdCAwIC0gNwktIENvbW1hbmQgMQoJICogQ29tbWFuZDIgYml0IDAgLSA3CS0gQ29tbWFuZCAyCgkgKgoJICogTm90ZSB0aGUgYml0IG9yZGVyIQoJICoKCSAqIFdpdGggdGhlIG9sZCBORUMgcHJvdG9jb2wsIEFkZHJlc3MyIHdhcyB0aGUgaW52ZXJzZSBvZiBBZGRyZXNzMQoJICogYW5kIENvbW1hbmQyIHdhcyB0aGUgaW52ZXJzZSBvZiBDb21tYW5kMSBhbmQgd2VyZSB1c2VkIGFzCgkgKiBhbiBlcnJvciBjaGVjay4KCSAqCgkgKiBXaXRoIE5FQyBleHRlbmRlZCwgQWRkcmVzczEgaXMgdGhlIExTQiBvZiB0aGUgQWRkcmVzcyBhbmQKCSAqIEFkZHJlc3MyIGlzIHRoZSBNU0IsIENvbW1hbmQgcGFyc2luZyByZW1haW5zIHVuY2hhbmdlZC4KCSAqCgkgKiBBIHJlcGVhdCBtZXNzYWdlIGlzIGNvZGVkIGFzOgoJICogTGVhZGVyCQktIDkgbXMgYnVyc3QKCSAqIEdhcAkJCS0gMi4yNSBtcyBzaWxlbmNlCgkgKiBSZXBlYXQJCS0gNTYwIHVzIGFjdGl2ZQoJICovCgl1OCBhZGRyZXNzMTsKCXU4IGFkZHJlc3MyOwoJdTggY29tbWFuZDE7Cgl1OCBjb21tYW5kMjsKCXUxNiBhZGRyZXNzOwoJdTMyIHNjYW5jb2RlOwoKCS8qIExlYWRlciBtYXJrICovCgl3aGlsZSAoZ2V0X2JpdHMoZGF0YSwgMSkgJiYgIWRhdGEtPmlyZGF0YV9lcnJvcikKCQkvKiBEbyBub3RoaW5nICovOwoKCS8qIExlYWRlciBzcGFjZSAqLwoJaWYgKGdldF9iaXRzKGRhdGEsIDQpKSB7CgkJZGV2X2RiZyhkZXYsICJORUMgLSBJbnZhbGlkIGxlYWRlciBzcGFjZVxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIFJlcGVhdD8gKi8KCWlmIChnZXRfYml0cyhkYXRhLCAxKSkgewoJCWlmICghZGF0YS0+a2V5cHJlc3NlZCkgewoJCQlkZXZfZGJnKGRldiwgIk5FQyAtIFN0cmF5IHJlcGVhdCBtZXNzYWdlXG4iKTsKCQkJcmV0dXJuOwoJCX0KCgkJZGV2X2RiZyhkZXYsICJJUi1ORUMgcmVwZWF0IHMgJXVcbiIsCgkJCSh1bnNpZ25lZCBpbnQpZGF0YS0+bGFzdF9zY2FuY29kZSk7CgoJCXdiY2lyX2tleWRvd24oZGF0YSwgZGF0YS0+bGFzdF9zY2FuY29kZSwgZGF0YS0+bGFzdF90b2dnbGUpOwoJCXJldHVybjsKCX0KCgkvKiBSZW1haW5pbmcgbGVhZGVyIHNwYWNlICovCglpZiAoZ2V0X2JpdHMoZGF0YSwgMykpIHsKCQlkZXZfZGJnKGRldiwgIk5FQyAtIEludmFsaWQgbGVhZGVyIHNwYWNlXG4iKTsKCQlyZXR1cm47Cgl9CgoJYWRkcmVzczEgID0gYml0cmV2OChnZXRfYml0cyhkYXRhLCA4KSk7CglhZGRyZXNzMiAgPSBiaXRyZXY4KGdldF9iaXRzKGRhdGEsIDgpKTsKCWNvbW1hbmQxICA9IGJpdHJldjgoZ2V0X2JpdHMoZGF0YSwgOCkpOwoJY29tbWFuZDIgID0gYml0cmV2OChnZXRfYml0cyhkYXRhLCA4KSk7CgoJLyogU2FuaXR5IGNoZWNrICovCglpZiAoZGF0YS0+aXJkYXRhX2Vycm9yKSB7CgkJZGV2X2RiZyhkZXYsICJORUMgLSBJbnZhbGlkIG1lc3NhZ2VcbiIpOwoJCXJldHVybjsKCX0KCgkvKiBDaGVjayBjb21tYW5kIHZhbGlkaXR5ICovCglpZiAoY29tbWFuZDEgIT0gfmNvbW1hbmQyKSB7CgkJZGV2X2RiZyhkZXYsICJORUMgLSBDb21tYW5kIGJ5dGVzIG1pc21hdGNoXG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogQ2hlY2sgZm9yIGV4dGVuZGVkIE5FQyBwcm90b2NvbCAqLwoJYWRkcmVzcyA9IGFkZHJlc3MxOwoJaWYgKGFkZHJlc3MxICE9IH5hZGRyZXNzMikKCQlhZGRyZXNzIHw9IGFkZHJlc3MyIDw8IDg7CgoJc2NhbmNvZGUgPSBhZGRyZXNzIDw8IDggfCBjb21tYW5kMTsKCglkZXZfZGJnKGRldiwgIklSLU5FQyBhZCAldSBjbSAldSBzICV1XG4iLAoJCSh1bnNpZ25lZCBpbnQpYWRkcmVzcywKCQkodW5zaWduZWQgaW50KWNvbW1hbmQxLAoJCSh1bnNpZ25lZCBpbnQpc2NhbmNvZGUpOwoKCXdiY2lyX2tleWRvd24oZGF0YSwgc2NhbmNvZGUsICFkYXRhLT5sYXN0X3RvZ2dsZSk7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIElOVEVSUlVQVCBGVU5DVElPTlMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGlycXJldHVybl90CndiY2lyX2lycV9oYW5kbGVyKGludCBpcnFubywgdm9pZCAqY29va2llKQp7CglzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlID0gY29va2llOwoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBwbnBfZ2V0X2RydmRhdGEoZGV2aWNlKTsKCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKCXU4IHN0YXR1czsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1OCBpcmRhdGFbOF07CglpbnQgaTsKCXVuc2lnbmVkIGludCBodzsKCglzcGluX2xvY2tfaXJxc2F2ZSgmd2JjaXJfbG9jaywgZmxhZ3MpOwoKCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CgoJc3RhdHVzID0gaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19FSVIpOwoKCWlmICghKHN0YXR1cyAmIChXQkNJUl9JUlFfUlggfCBXQkNJUl9JUlFfRVJSKSkpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YmNpcl9sb2NrLCBmbGFncyk7CgkJcmV0dXJuIElSUV9OT05FOwoJfQoKCWlmIChzdGF0dXMgJiBXQkNJUl9JUlFfRVJSKQoJCWRhdGEtPmlyZGF0YV9lcnJvciA9IDE7CgoJaWYgKCEoc3RhdHVzICYgV0JDSVJfSVJRX1JYKSkKCQlnb3RvIG91dDsKCgkvKiBTaW5jZSBSWEhETEVWIGlzIHNldCwgYXQgbGVhc3QgOCBieXRlcyBhcmUgaW4gdGhlIEZJRk8gKi8KCWluc2IoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSwgJmlyZGF0YVswXSwgOCk7CgoJZm9yIChpID0gMDsgaSA8IHNpemVvZihpcmRhdGEpOyBpKyspIHsKCQlodyA9IGh3ZWlnaHQ4KGlyZGF0YVtpXSk7CgkJaWYgKGh3ID4gNCkKCQkJYWRkX2lyZGF0YV9iaXQoZGF0YSwgMCk7CgkJZWxzZQoJCQlhZGRfaXJkYXRhX2JpdChkYXRhLCAxKTsKCgkJaWYgKGh3ID09IDgpCgkJCWRhdGEtPmlkbGVfY291bnQrKzsKCQllbHNlCgkJCWRhdGEtPmlkbGVfY291bnQgPSAwOwoJfQoKCWlmIChkYXRhLT5pZGxlX2NvdW50ID4gV0JDSVJfTUFYX0lETEVfQllURVMpIHsKCQkvKiBTZXQgUlhJTkFDVElWRS4uLiAqLwoJCW91dGIoV0JDSVJfUlhfRElTQUJMRSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0FTQ1IpOwoKCQkvKiAuLi5hbmQgZHJhaW4gdGhlIEZJRk8gKi8KCQl3aGlsZSAoaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19MU1IpICYgV0JDSVJfUlhfQVZBSUwpCgkJCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUlhEQVRBKTsKCgkJZGV2X2RiZyhkZXYsICJJUkRBVEE6XG4iKTsKCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+aXJkYXRhX2NvdW50OyBpICs9IEJJVFNfUEVSX0xPTkcpCgkJCWRldl9kYmcoZGV2LCAiMHglMDhsWFxuIiwgZGF0YS0+aXJkYXRhW2kvQklUU19QRVJfTE9OR10pOwoKCQlzd2l0Y2ggKHByb3RvY29sKSB7CgkJY2FzZSBJUl9QUk9UT0NPTF9SQzU6CgkJCXdiY2lyX3BhcnNlX3JjNShkZXYsIGRhdGEpOwoJCQlicmVhazsKCQljYXNlIElSX1BST1RPQ09MX1JDNjoKCQkJd2JjaXJfcGFyc2VfcmM2KGRldiwgZGF0YSk7CgkJCWJyZWFrOwoJCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgoJCQl3YmNpcl9wYXJzZV9uZWMoZGV2LCBkYXRhKTsKCQkJYnJlYWs7CgkJfQoKCQl3YmNpcl9yZXNldF9pcmRhdGEoZGF0YSk7CgkJZGF0YS0+aWRsZV9jb3VudCA9IDA7Cgl9CgpvdXQ6CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YmNpcl9sb2NrLCBmbGFncyk7CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFNVU1BFTkQvUkVTVU1FIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAp3YmNpcl9zaHV0ZG93bihzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlKQp7CglzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGV2aWNlLT5kZXY7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IHBucF9nZXRfZHJ2ZGF0YShkZXZpY2UpOwoJaW50IGRvX3dha2UgPSAxOwoJdTggbWF0Y2hbMTFdOwoJdTggbWFza1sxMV07Cgl1OCByYzZfY3NsID0gMDsKCWludCBpOwoKCW1lbXNldChtYXRjaCwgMCwgc2l6ZW9mKG1hdGNoKSk7CgltZW1zZXQobWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKCglpZiAod2FrZV9zYyA9PSBJTlZBTElEX1NDQU5DT0RFIHx8ICFkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7CgkJZG9fd2FrZSA9IDA7CgkJZ290byBmaW5pc2g7Cgl9CgoJc3dpdGNoIChwcm90b2NvbCkgewoJY2FzZSBJUl9QUk9UT0NPTF9SQzU6CgkJaWYgKHdha2Vfc2MgPiAweEZGRikgewoJCQlkb193YWtlID0gMDsKCQkJZGV2X2VycihkZXYsICJSQzUgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQlicmVhazsKCQl9CgoJCS8qIE1hc2sgPSAxMyBiaXRzLCBleCB0b2dnbGUgKi8KCQltYXNrWzBdID0gMHhGRjsKCQltYXNrWzFdID0gMHgxNzsKCgkJbWF0Y2hbMF0gID0gKHdha2Vfc2MgJiAweDAwM0YpOyAgICAgIC8qIDYgY29tbWFuZCBiaXRzICovCgkJbWF0Y2hbMF0gfD0gKHdha2Vfc2MgJiAweDAxODApID4+IDE7IC8qIDIgYWRkcmVzcyBiaXRzICovCgkJbWF0Y2hbMV0gID0gKHdha2Vfc2MgJiAweDBFMDApID4+IDk7IC8qIDMgYWRkcmVzcyBiaXRzICovCgkJaWYgKCEod2FrZV9zYyAmIDB4MDA0MCkpICAgICAgICAgICAgIC8qIDJuZCBzdGFydCBiaXQgICovCgkJCW1hdGNoWzFdIHw9IDB4MTA7CgoJCWJyZWFrOwoKCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgoJCWlmICh3YWtlX3NjID4gMHhGRkZGRkYpIHsKCQkJZG9fd2FrZSA9IDA7CgkJCWRldl9lcnIoZGV2LCAiTkVDIC0gSW52YWxpZCB3YWtlIHNjYW5jb2RlXG4iKTsKCQkJYnJlYWs7CgkJfQoKCQltYXNrWzBdID0gbWFza1sxXSA9IG1hc2tbMl0gPSBtYXNrWzNdID0gMHhGRjsKCgkJbWF0Y2hbMV0gPSBiaXRyZXY4KCh3YWtlX3NjICYgMHhGRikpOwoJCW1hdGNoWzBdID0gfm1hdGNoWzFdOwoKCQltYXRjaFszXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDApID4+IDgpOwoJCWlmICh3YWtlX3NjID4gMHhGRkZGKQoJCQltYXRjaFsyXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDAwMCkgPj4gMTYpOwoJCWVsc2UKCQkJbWF0Y2hbMl0gPSB+bWF0Y2hbM107CgoJCWJyZWFrOwoKCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgoKCQlpZiAod2FrZV9yYzZtb2RlID09IDApIHsKCQkJaWYgKHdha2Vfc2MgPiAweEZGRkYpIHsKCQkJCWRvX3dha2UgPSAwOwoJCQkJZGV2X2VycihkZXYsICJSQzYgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCS8qIENvbW1hbmQgKi8KCQkJbWF0Y2hbMF0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICAwKTsKCQkJbWFza1swXSAgPSAweEZGOwoJCQltYXRjaFsxXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDQpOwoJCQltYXNrWzFdICA9IDB4RkY7CgoJCQkvKiBBZGRyZXNzICovCgkJCW1hdGNoWzJdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgOCk7CgkJCW1hc2tbMl0gID0gMHhGRjsKCQkJbWF0Y2hbM10gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDEyKTsKCQkJbWFza1szXSAgPSAweEZGOwoKCQkJLyogSGVhZGVyICovCgkJCW1hdGNoWzRdID0gMHg1MDsgLyogbW9kZTEgPSBtb2RlMCA9IDAsIGlnbm9yZSB0b2dnbGUgKi8KCQkJbWFza1s0XSAgPSAweEYwOwoJCQltYXRjaFs1XSA9IDB4MDk7IC8qIHN0YXJ0IGJpdCA9IDEsIG1vZGUyID0gMCAqLwoJCQltYXNrWzVdICA9IDB4MEY7CgoJCQlyYzZfY3NsID0gNDQ7CgoJCX0gZWxzZSBpZiAod2FrZV9yYzZtb2RlID09IDYpIHsKCQkJaSA9IDA7CgoJCQkvKiBDb21tYW5kICovCgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDApOwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA0KTsKCQkJbWFza1tpKytdID0gMHhGRjsKCgkJCS8qIEFkZHJlc3MgKyBUb2dnbGUgKi8KCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgOCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMTIpOwoJCQltYXNrW2krK10gPSAweDNGOwoKCQkJLyogQ3VzdG9tZXIgYml0cyA3IC0gMCAqLwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDE2KTsKCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyMCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgoJCQlpZiAod2FrZV9zYyAmIDB4ODAwMDAwMDApIHsKCQkJCS8qIEN1c3RvbWVyIHJhbmdlIGJpdCBhbmQgYml0cyAxNSAtIDggKi8KCQkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMjQpOwoJCQkJbWFza1tpKytdID0gMHhGRjsKCQkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMjgpOwoJCQkJbWFza1tpKytdID0gMHhGRjsKCQkJCXJjNl9jc2wgPSA3NjsKCQkJfSBlbHNlIGlmICh3YWtlX3NjIDw9IDB4MDA3RkZGRkYpIHsKCQkJCXJjNl9jc2wgPSA2MDsKCQkJfSBlbHNlIHsKCQkJCWRvX3dha2UgPSAwOwoJCQkJZGV2X2VycihkZXYsICJSQzYgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCS8qIEhlYWRlciAqLwoJCQltYXRjaFtpXSAgPSAweDkzOyAvKiBtb2RlMSA9IG1vZGUwID0gMSwgc3VibW9kZSA9IDAgKi8KCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gMHgwQTsgLyogc3RhcnQgYml0ID0gMSwgbW9kZTIgPSAxICovCgkJCW1hc2tbaSsrXSA9IDB4MEY7CgoJCX0gZWxzZSB7CgkJCWRvX3dha2UgPSAwOwoJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBtb2RlXG4iKTsKCQl9CgoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZG9fd2FrZSA9IDA7CgkJYnJlYWs7Cgl9CgpmaW5pc2g6CglpZiAoZG9fd2FrZSkgewoJCS8qIFNldCBjb21wYXJlIGFuZCBjb21wYXJlIG1hc2sgKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCwKCQkJICAgICAgIFdCQ0lSX1JFR1NFTF9DT01QQVJFIHwgV0JDSVJfUkVHX0FERFIwLAoJCQkgICAgICAgMHgzRik7CgkJb3V0c2IoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfREFUQSwgbWF0Y2gsIDExKTsKCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCwKCQkJICAgICAgIFdCQ0lSX1JFR1NFTF9NQVNLIHwgV0JDSVJfUkVHX0FERFIwLAoJCQkgICAgICAgMHgzRik7CgkJb3V0c2IoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfREFUQSwgbWFzaywgMTEpOwoKCQkvKiBSQzYgQ29tcGFyZSBTdHJpbmcgTGVuICovCgkJb3V0YihyYzZfY3NsLCBkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DU0wpOwoKCQkvKiBDbGVhciBzdGF0dXMgYml0cyBORUNfUkVQLCBCVUZGLCBNU0dfRU5ELCBNQVRDSCAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJCS8qIENsZWFyIEJVRkZfRU4sIENsZWFyIEVORF9FTiwgU2V0IE1BVENIX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDEsIDB4MDcpOwoKCQkvKiBTZXQgQ0VJUl9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCwgMHgwMSwgMHgwMSk7CgoJfSBlbHNlIHsKCQkvKiBDbGVhciBCVUZGX0VOLCBDbGVhciBFTkRfRU4sIENsZWFyIE1BVENIX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOwoKCQkvKiBDbGVhciBDRUlSX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAwLCAweDAxKTsKCX0KCgkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KCW91dGIoV0JDSVJfSVJRX05PTkUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JRVIpOwp9CgpzdGF0aWMgaW50CndiY2lyX3N1c3BlbmQoc3RydWN0IHBucF9kZXYgKmRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKQp7Cgl3YmNpcl9zaHV0ZG93bihkZXZpY2UpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKd2JjaXJfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CgoJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOwoKCS8qIENsZWFyIENFSVJfRU4gKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCwgMHgwMCwgMHgwMSk7CgoJLyogRW5hYmxlIGludGVycnVwdHMgKi8KCXdiY2lyX3Jlc2V0X2lyZGF0YShkYXRhKTsKCW91dGIoV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CgoJcmV0dXJuIDA7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFNFVFVQL0lOSVQgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCndiY2lyX2NmZ19jZWlyKHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQp7Cgl1OCB0bXA7CgoJLyogU2V0IFBST1RfU0VMLCBSWF9JTlYsIENsZWFyIENFSVJfRU4gKG5lZWRlZCBmb3IgdGhlIGxlZCkgKi8KCXRtcCA9IHByb3RvY29sIDw8IDQ7CglpZiAoaW52ZXJ0KQoJCXRtcCB8PSAweDA4OwoJb3V0Yih0bXAsIGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCk7CgoJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOwoKCS8qIFNldCBSQzUgY2VsbCB0aW1lIHRvIGNvcnJlc3BvbmQgdG8gMzYga0h6ICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DRkcxLCAweDRBLCAweDdGKTsKCgkvKiBTZXQgSVJUWF9JTlYgKi8KCWlmIChpbnZlcnQpCgkJb3V0YigweDA0LCBkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DQ1RMKTsKCWVsc2UKCQlvdXRiKDB4MDAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NDVEwpOwoKCS8qCgkgKiBDbGVhciBJUiBMRUQsIHNldCBTUDMgY2xvY2sgdG8gMjRNaHoKCSAqIHNldCBTUDNfSVJSWF9TVyB0byBiaW5hcnkgMDEsIGhlbHBmdWxseSBub3QgZG9jdW1lbnRlZAoJICovCglvdXRiKDB4MTAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUyk7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0CndiY2lyX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCnsKCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhOwoJaW50IGVycjsKCglpZiAoIShwbnBfcG9ydF9sZW4oZGV2aWNlLCAwKSA9PSBFSEZVTkNfSU9NRU1fTEVOICYmCgkgICAgICBwbnBfcG9ydF9sZW4oZGV2aWNlLCAxKSA9PSBXQUtFVVBfSU9NRU1fTEVOICYmCgkgICAgICBwbnBfcG9ydF9sZW4oZGV2aWNlLCAyKSA9PSBTUF9JT01FTV9MRU4pKSB7CgkJZGV2X2VycihkZXYsICJJbnZhbGlkIHJlc291cmNlc1xuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CglpZiAoIWRhdGEpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdDsKCX0KCglwbnBfc2V0X2RydmRhdGEoZGV2aWNlLCBkYXRhKTsKCglkYXRhLT5lYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMCk7CglkYXRhLT53YmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMSk7CglkYXRhLT5zYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMik7CglkYXRhLT5pcnEgPSBwbnBfaXJxKGRldmljZSwgMCk7CgoJaWYgKGRhdGEtPndiYXNlID09IDAgfHwgZGF0YS0+ZWJhc2UgPT0gMCB8fAoJICAgIGRhdGEtPnNiYXNlID09IDAgfHwgZGF0YS0+aXJxID09IDApIHsKCQllcnIgPSAtRU5PREVWOwoJCWRldl9lcnIoZGV2LCAiSW52YWxpZCByZXNvdXJjZXNcbiIpOwoJCWdvdG8gZXhpdF9mcmVlX2RhdGE7Cgl9CgoJZGV2X2RiZygmZGV2aWNlLT5kZXYsICJGb3VuZCBkZXZpY2UgIgoJCSIodzogMHglbFgsIGU6IDB4JWxYLCBzOiAweCVsWCwgaTogJXUpXG4iLAoJCWRhdGEtPndiYXNlLCBkYXRhLT5lYmFzZSwgZGF0YS0+c2Jhc2UsIGRhdGEtPmlycSk7CgoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkYXRhLT53YmFzZSwgV0FLRVVQX0lPTUVNX0xFTiwgRFJWTkFNRSkpIHsKCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCgkJCWRhdGEtPndiYXNlLCBkYXRhLT53YmFzZSArIFdBS0VVUF9JT01FTV9MRU4gLSAxKTsKCQllcnIgPSAtRUJVU1k7CgkJZ290byBleGl0X2ZyZWVfZGF0YTsKCX0KCglpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOLCBEUlZOQU1FKSkgewoJCWRldl9lcnIoZGV2LCAiUmVnaW9uIDB4JWx4LTB4JWx4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJZGF0YS0+ZWJhc2UsIGRhdGEtPmViYXNlICsgRUhGVU5DX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV93YmFzZTsKCX0KCglpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPnNiYXNlLCBTUF9JT01FTV9MRU4sIERSVk5BTUUpKSB7CgkJZGV2X2VycihkZXYsICJSZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlkYXRhLT5zYmFzZSwgZGF0YS0+c2Jhc2UgKyBTUF9JT01FTV9MRU4gLSAxKTsKCQllcnIgPSAtRUJVU1k7CgkJZ290byBleGl0X3JlbGVhc2VfZWJhc2U7Cgl9CgoJZXJyID0gcmVxdWVzdF9pcnEoZGF0YS0+aXJxLCB3YmNpcl9pcnFfaGFuZGxlciwKCQkJICBJUlFGX0RJU0FCTEVELCBEUlZOQU1FLCBkZXZpY2UpOwoJaWYgKGVycikgewoJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNsYWltIElSUSAldVxuIiwgZGF0YS0+aXJxKTsKCQllcnIgPSAtRUJVU1k7CgkJZ290byBleGl0X3JlbGVhc2Vfc2Jhc2U7Cgl9CgoJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKCJjaXItdHgiLCAmZGF0YS0+dHh0cmlnZ2VyKTsKCWlmICghZGF0YS0+dHh0cmlnZ2VyKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfZnJlZV9pcnE7Cgl9CgoJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKCJjaXItcngiLCAmZGF0YS0+cnh0cmlnZ2VyKTsKCWlmICghZGF0YS0+cnh0cmlnZ2VyKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl90eHRyaWdnZXI7Cgl9CgoJZGF0YS0+bGVkLm5hbWUgPSAiY2lyOjphY3Rpdml0eSI7CglkYXRhLT5sZWQuZGVmYXVsdF90cmlnZ2VyID0gImNpci1yeCI7CglkYXRhLT5sZWQuYnJpZ2h0bmVzc19zZXQgPSB3YmNpcl9sZWRfYnJpZ2h0bmVzc19zZXQ7CglkYXRhLT5sZWQuYnJpZ2h0bmVzc19nZXQgPSB3YmNpcl9sZWRfYnJpZ2h0bmVzc19nZXQ7CgllcnIgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmRldmljZS0+ZGV2LCAmZGF0YS0+bGVkKTsKCWlmIChlcnIpCgkJZ290byBleGl0X3VucmVnaXN0ZXJfcnh0cmlnZ2VyOwoKCWRhdGEtPmlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoJaWYgKCFkYXRhLT5pbnB1dF9kZXYpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX2xlZDsKCX0KCglkYXRhLT5pbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CglkYXRhLT5pbnB1dF9kZXYtPm5hbWUgPSBXQkNJUl9OQU1FOwoJZGF0YS0+aW5wdXRfZGV2LT5waHlzID0gIndiY2lyL2NpcjAiOwoJZGF0YS0+aW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CglkYXRhLT5pbnB1dF9kZXYtPmlkLnZlbmRvciAgPSBQQ0lfVkVORE9SX0lEX1dJTkJPTkQ7CglkYXRhLT5pbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBXQkNJUl9JRF9GQU1JTFk7CglkYXRhLT5pbnB1dF9kZXYtPmlkLnZlcnNpb24gPSBXQkNJUl9JRF9DSElQOwoJZGF0YS0+aW5wdXRfZGV2LT5nZXRrZXljb2RlID0gd2JjaXJfZ2V0a2V5Y29kZTsKCWRhdGEtPmlucHV0X2Rldi0+c2V0a2V5Y29kZSA9IHdiY2lyX3NldGtleWNvZGU7CglpbnB1dF9zZXRfY2FwYWJpbGl0eShkYXRhLT5pbnB1dF9kZXYsIEVWX01TQywgTVNDX1NDQU4pOwoJaW5wdXRfc2V0X2RydmRhdGEoZGF0YS0+aW5wdXRfZGV2LCBkYXRhKTsKCgllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKCWlmIChlcnIpCgkJZ290byBleGl0X2ZyZWVfaW5wdXQ7CgoJZGF0YS0+bGFzdF9zY2FuY29kZSA9IElOVkFMSURfU0NBTkNPREU7CglJTklUX0xJU1RfSEVBRCgmZGF0YS0+a2V5dGFibGUpOwoJc2V0dXBfdGltZXIoJmRhdGEtPnRpbWVyX2tleXVwLCB3YmNpcl9rZXl1cCwgKHVuc2lnbmVkIGxvbmcpZGF0YSk7CgoJLyogTG9hZCBkZWZhdWx0IGtleW1hcHMgKi8KCWlmIChwcm90b2NvbCA9PSBJUl9QUk9UT0NPTF9SQzYpIHsKCQlpbnQgaTsKCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYzZfZGVmX2tleW1hcCk7IGkrKykgewoJCQllcnIgPSB3YmNpcl9zZXRrZXljb2RlKGRhdGEtPmlucHV0X2RldiwKCQkJCQkgICAgICAgKGludClyYzZfZGVmX2tleW1hcFtpXS5zY2FuY29kZSwKCQkJCQkgICAgICAgKGludClyYzZfZGVmX2tleW1hcFtpXS5rZXljb2RlKTsKCQkJaWYgKGVycikKCQkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX2tleXM7CgkJfQoJfQoKCWRldmljZV9pbml0X3dha2V1cCgmZGV2aWNlLT5kZXYsIDEpOwoKCXdiY2lyX2NmZ19jZWlyKGRhdGEpOwoKCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoV0JDSVJfSVJRX05PTkUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JRVIpOwoKCS8qIEVuYWJsZSBleHRlbmRlZCBtb2RlICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzIpOwoJb3V0YihXQkNJUl9FWFRfRU5BQkxFLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRVhDUjEpOwoKCS8qCgkgKiBDb25maWd1cmUgYmF1ZCBnZW5lcmF0b3IsIElSIGRhdGEgd2lsbCBiZSBzYW1wbGVkIGF0CgkgKiBhIGJpdHJhdGUgb2Y6ICgyNE1oeiAqIHByZXNjYWxlcikgLyAoZGl2aXNvciAqIDE2KS4KCSAqCgkgKiBUaGUgRUNJUiByZWdpc3RlcnMgaW5jbHVkZSBhIGZsYWcgdG8gY2hhbmdlIHRoZQoJICogMjRNaHogY2xvY2sgZnJlcSB0byA0OE1oei4KCSAqCgkgKiBJdCdzIG5vdCBkb2N1bWVudGVkIGluIHRoZSBzcGVjcywgYnV0IGZpZm8gbGV2ZWxzCgkgKiBvdGhlciB0aGFuIDE2IHNlZW1zIHRvIGJlIHVuc3VwcG9ydGVkLgoJICovCgoJLyogcHJlc2NhbGVyIDEuMCwgdHgvcnggZmlmbyBsdmwgMTYgKi8KCW91dGIoMHgzMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0VYQ1IyKTsKCgkvKiBTZXQgYmF1ZCBkaXZpc29yIHRvIGdlbmVyYXRlIG9uZSBieXRlIHBlciBiaXQvY2VsbCAqLwoJc3dpdGNoIChwcm90b2NvbCkgewoJY2FzZSBJUl9QUk9UT0NPTF9SQzU6CgkJb3V0YigweEE3LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7CgkJYnJlYWs7CgljYXNlIElSX1BST1RPQ09MX1JDNjoKCQlvdXRiKDB4NTMsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKCQlicmVhazsKCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgoJCW91dGIoMHg2OSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwoJCWJyZWFrOwoJfQoJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdESCk7CgoJLyogU2V0IENFSVIgbW9kZSAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoMHhDMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX01DUik7CglpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUik7IC8qIENsZWFyIExTUiAqLwoJaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19NU1IpOyAvKiBDbGVhciBNU1IgKi8KCgkvKiBEaXNhYmxlIFJYIGRlbW9kLCBydW4tbGVuZ3RoIGVuY29kaW5nL2RlY29kaW5nLCBzZXQgZnJlcSBzcGFuICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzcpOwoJb3V0YigweDEwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUkNDRkcpOwoKCS8qIERpc2FibGUgdGltZXIgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNCk7CglvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMSk7CgoJLyogRW5hYmxlIE1TUiBpbnRlcnJ1cHQsIENsZWFyIEFVWF9JUlggKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNSk7CglvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMik7CgoJLyogRGlzYWJsZSBDUkMgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNik7CglvdXRiKDB4MjAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMyk7CgoJLyogU2V0IFJYL1RYIChkZSltb2R1bGF0aW9uIGZyZXEsIG5vdCByZWFsbHkgdXNlZCAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS183KTsKCW91dGIoMHhGMiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSUlhEQyk7CglvdXRiKDB4NjksIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUlRYTUMpOwoKCS8qIFNldCBpbnZlcnQgYW5kIHBpbiBkaXJlY3Rpb24gKi8KCWlmIChpbnZlcnQpCgkJb3V0YigweDEwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDRkc0KTsKCWVsc2UKCQlvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNGRzQpOwoKCS8qIFNldCBGSUZPIHRocmVzaG9sZHMgKFJYID0gOCwgVFggPSAzKSwgcmVzZXQgUlgvVFggKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKDB4OTcsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19GQ1IpOwoKCS8qIENsZWFyIEFVWCBzdGF0dXMgYml0cyAqLwoJb3V0YigweEUwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CgoJLyogRW5hYmxlIGludGVycnVwdHMgKi8KCW91dGIoV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CgoJcmV0dXJuIDA7CgpleGl0X3VucmVnaXN0ZXJfa2V5czoKCWlmICghbGlzdF9lbXB0eSgmZGF0YS0+a2V5dGFibGUpKSB7CgkJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXk7CgkJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXl0bXA7CgoJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShrZXksIGtleXRtcCwgJmRhdGEtPmtleXRhYmxlLCBsaXN0KSB7CgkJCWxpc3RfZGVsKCZrZXktPmxpc3QpOwoJCQlrZnJlZShrZXkpOwoJCX0KCX0KCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmlucHV0X2Rldik7CgkvKiBDYW4ndCBjYWxsIGlucHV0X2ZyZWVfZGV2aWNlIG9uIGFuIHVucmVnaXN0ZXJlZCBkZXZpY2UgKi8KCWRhdGEtPmlucHV0X2RldiA9IE5VTEw7CmV4aXRfZnJlZV9pbnB1dDoKCWlucHV0X2ZyZWVfZGV2aWNlKGRhdGEtPmlucHV0X2Rldik7CmV4aXRfdW5yZWdpc3Rlcl9sZWQ6CglsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkKTsKZXhpdF91bnJlZ2lzdGVyX3J4dHJpZ2dlcjoKCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnJ4dHJpZ2dlcik7CmV4aXRfdW5yZWdpc3Rlcl90eHRyaWdnZXI6CglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT50eHRyaWdnZXIpOwpleGl0X2ZyZWVfaXJxOgoJZnJlZV9pcnEoZGF0YS0+aXJxLCBkZXZpY2UpOwpleGl0X3JlbGVhc2Vfc2Jhc2U6CglyZWxlYXNlX3JlZ2lvbihkYXRhLT5zYmFzZSwgU1BfSU9NRU1fTEVOKTsKZXhpdF9yZWxlYXNlX2ViYXNlOgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4pOwpleGl0X3JlbGVhc2Vfd2Jhc2U6CglyZWxlYXNlX3JlZ2lvbihkYXRhLT53YmFzZSwgV0FLRVVQX0lPTUVNX0xFTik7CmV4aXRfZnJlZV9kYXRhOgoJa2ZyZWUoZGF0YSk7CglwbnBfc2V0X2RydmRhdGEoZGV2aWNlLCBOVUxMKTsKZXhpdDoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdAp3YmNpcl9yZW1vdmUoc3RydWN0IHBucF9kZXYgKmRldmljZSkKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBwbnBfZ2V0X2RydmRhdGEoZGV2aWNlKTsKCXN0cnVjdCB3YmNpcl9rZXllbnRyeSAqa2V5OwoJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXl0bXA7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YihXQkNJUl9JUlFfTk9ORSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CgoJZGVsX3RpbWVyX3N5bmMoJmRhdGEtPnRpbWVyX2tleXVwKTsKCglmcmVlX2lycShkYXRhLT5pcnEsIGRldmljZSk7CgoJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJLyogQ2xlYXIgQ0VJUl9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAwLCAweDAxKTsKCgkvKiBDbGVhciBCVUZGX0VOLCBFTkRfRU4sIE1BVENIX0VOICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CgoJLyogVGhpcyB3aWxsIGdlbmVyYXRlIGEga2V5dXAgZXZlbnQgaWYgbmVjZXNzYXJ5ICovCglpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkYXRhLT5pbnB1dF9kZXYpOwoKCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnJ4dHJpZ2dlcik7CglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT50eHRyaWdnZXIpOwoJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRhdGEtPmxlZCk7CgoJLyogVGhpcyBpcyBvayBzaW5jZSAmZGF0YS0+bGVkIGlzbid0IGFjdHVhbGx5IHVzZWQgKi8KCXdiY2lyX2xlZF9icmlnaHRuZXNzX3NldCgmZGF0YS0+bGVkLCBMRURfT0ZGKTsKCglyZWxlYXNlX3JlZ2lvbihkYXRhLT53YmFzZSwgV0FLRVVQX0lPTUVNX0xFTik7CglyZWxlYXNlX3JlZ2lvbihkYXRhLT5lYmFzZSwgRUhGVU5DX0lPTUVNX0xFTik7CglyZWxlYXNlX3JlZ2lvbihkYXRhLT5zYmFzZSwgU1BfSU9NRU1fTEVOKTsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoa2V5LCBrZXl0bXAsICZkYXRhLT5rZXl0YWJsZSwgbGlzdCkgewoJCWxpc3RfZGVsKCZrZXktPmxpc3QpOwoJCWtmcmVlKGtleSk7Cgl9CgoJa2ZyZWUoZGF0YSk7CgoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCB3YmNpcl9pZHNbXSA9IHsKCXsgIldFQzEwMjIiLCAwIH0sCgl7ICIiLCAwIH0KfTsKTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHdiY2lyX2lkcyk7CgpzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgd2JjaXJfZHJpdmVyID0gewoJLm5hbWUgICAgID0gV0JDSVJfTkFNRSwKCS5pZF90YWJsZSA9IHdiY2lyX2lkcywKCS5wcm9iZSAgICA9IHdiY2lyX3Byb2JlLAoJLnJlbW92ZSAgID0gX19kZXZleGl0X3Aod2JjaXJfcmVtb3ZlKSwKCS5zdXNwZW5kICA9IHdiY2lyX3N1c3BlbmQsCgkucmVzdW1lICAgPSB3YmNpcl9yZXN1bWUsCgkuc2h1dGRvd24gPSB3YmNpcl9zaHV0ZG93bgp9OwoKc3RhdGljIGludCBfX2luaXQKd2JjaXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0OwoKCXN3aXRjaCAocHJvdG9jb2wpIHsKCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgljYXNlIElSX1BST1RPQ09MX1JDNjoKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogSW52YWxpZCBwcm90b2NvbCBhcmd1bWVudFxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJcmV0ID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmd2JjaXJfZHJpdmVyKTsKCWlmIChyZXQpCgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgX19leGl0CndiY2lyX2V4aXQodm9pZCkKewoJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YmNpcl9kcml2ZXIpOwp9CgpNT0RVTEVfQVVUSE9SKCJEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBTdXBlckkvTyBDb25zdW1lciBJUiBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQod2JjaXJfaW5pdCk7Cm1vZHVsZV9leGl0KHdiY2lyX2V4aXQpOwoKCg==