LyogR2VtVGVrIHJhZGlvIGNhcmQgZHJpdmVyIGZvciBMaW51eCAoQykgMTk5OCBKb25hcyBNdW5zaW4gPGptdW5zaW5AaWtpLmZpPgogKgogKiBHZW1UZWsgaGFzbid0IHJlbGVhc2VkIGFueSBzcGVjcyBvbiB0aGUgY2FyZCwgc28gdGhlIHByb3RvY29sIGhhZCB0bwogKiBiZSByZXZlcnNlIGVuZ2luZWVyZWQgd2l0aCBkb3NlbXUuCiAqCiAqIEJlc2lkZXMgdGhlIHByb3RvY29sIGNoYW5nZXMsIHRoaXMgaXMgbW9zdGx5IGEgY29weSBvZjoKICoKICogICAgUmFkaW9UcmFjayBJSSBkcml2ZXIgZm9yIExpbnV4IHJhZGlvIHN1cHBvcnQgKEMpIDE5OTggQmVuIFBmYWZmCiAqCiAqICAgIEJhc2VkIG9uIFJhZGlvVHJhY2sgSS9SYWRpb1JldmVhbCAoQykgMTk5NyBNLiBLaXJrd29vZAogKiAgICBDb252ZXJ0ZWQgdG8gbmV3IEFQSSBieSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogKiAgICBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYnkgUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4KICoKICogVE9ETzogQWxsb3cgZm9yIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgZm9vbGlzaCBlbnRpdGllcyA6LSkKICoKICogQ29udmVydGVkIHRvIFY0TDIgQVBJIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogTW9kdWxlcyAJCQkqLwojaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkqLwojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5CQkJKi8KI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGNvcHkgdG8vZnJvbSB1c2VyCQkqLwojaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLwojaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgojaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CgojaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgkvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8JKi8KI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsMCwzKQojZGVmaW5lIFJBRElPX0JBTk5FUiAiR2VtVGVrIFJhZGlvIGNhcmQgZHJpdmVyOiB2MC4wLjMiCgovKgogKiBNb2R1bGUgaW5mby4KICovCgpNT0RVTEVfQVVUSE9SKCJKb25hcyBNdW5zaW4sIFBla2thIFNlcHDkbmVuIDxwZXh1QGthcHNpLmZpPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgR2VtVGVrIFJhZGlvIGNhcmQuIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCi8qCiAqIE1vZHVsZSBwYXJhbXMuCiAqLwoKI2lmbmRlZiBDT05GSUdfUkFESU9fR0VNVEVLX1BPUlQKI2RlZmluZSBDT05GSUdfUkFESU9fR0VNVEVLX1BPUlQgLTEKI2VuZGlmCiNpZm5kZWYgQ09ORklHX1JBRElPX0dFTVRFS19QUk9CRQojZGVmaW5lIENPTkZJR19SQURJT19HRU1URUtfUFJPQkUgMQojZW5kaWYKCnN0YXRpYyBpbnQgaW8JCT0gQ09ORklHX1JBRElPX0dFTVRFS19QT1JUOwpzdGF0aWMgaW50IHByb2JlCT0gQ09ORklHX1JBRElPX0dFTVRFS19QUk9CRTsKc3RhdGljIGludCBoYXJkbXV0ZTsKc3RhdGljIGludCBzaHV0ZG93bgk9IDE7CnN0YXRpYyBpbnQga2VlcG11dGVkCT0gMTsKc3RhdGljIGludCBpbml0bXV0ZQk9IDE7CnN0YXRpYyBpbnQgcmFkaW9fbnIJPSAtMTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5fdXNlOwoKbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRm9yY2UgSS9PIHBvcnQgZm9yIHRoZSBHZW1UZWsgUmFkaW8gY2FyZCBpZiBhdXRvbWF0aWMgIgoJICJwcm9iaW5nIGlzIGRpc2FibGVkIG9yIGZhaWxzLiBUaGUgbW9zdCBjb21tb24gSS9PIHBvcnRzIGFyZTogMHgyMGMgIgoJICIweDMwYywgMHgyNGMgb3IgMHgzNGMgKDB4MjBjLCAweDI0OCBhbmQgMHgyOGMgaGF2ZSBiZWVuIHJlcG9ydGVkIHRvICIKCSAid29yayBmb3IgdGhlIGNvbWJpbmVkIHNvdW5kL3JhZGlvY2FyZCkuIik7Cgptb2R1bGVfcGFyYW0ocHJvYmUsIGJvb2wsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHByb2JlLCAiRW5hYmxlIGF1dG9tYXRpYyBkZXZpY2UgcHJvYmluZy4gTm90ZTogb25seSB0aGUgbW9zdCAiCgkiY29tbW9uIEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBjYXJkIGFyZSBwcm9iZWQuIik7Cgptb2R1bGVfcGFyYW0oaGFyZG11dGUsIGJvb2wsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGhhcmRtdXRlLCAiRW5hYmxlIGBoYXJkIG11dGluZycgYnkgc2h1dHRpbmcgZG93biBQTEwsIG1heSAiCgkgInJlZHVjZSBzdGF0aWMgbm9pc2UuIik7Cgptb2R1bGVfcGFyYW0oc2h1dGRvd24sIGJvb2wsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHNodXRkb3duLCAiRW5hYmxlIHNodXR0aW5nIGRvd24gUExMIGFuZCBtdXRpbmcgbGluZSB3aGVuICIKCSAibW9kdWxlIGlzIHVubG9hZGVkLiIpOwoKbW9kdWxlX3BhcmFtKGtlZXBtdXRlZCwgYm9vbCwgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0Moa2VlcG11dGVkLCAiS2VlcCBjYXJkIG11dGVkIGV2ZW4gd2hlbiBmcmVxdWVuY3kgaXMgY2hhbmdlZC4iKTsKCm1vZHVsZV9wYXJhbShpbml0bXV0ZSwgYm9vbCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaW5pdG11dGUsICJNdXRlIGNhcmQgd2hlbiBtb2R1bGUgaXMgbG9hZGVkLiIpOwoKbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDA0NDQpOwoKLyoKICogRnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgY2FyZC4KICovCiNkZWZpbmUgR0VNVEVLX0xPV0ZSRVEJKDg3KjE2MDAwKQojZGVmaW5lIEdFTVRFS19ISUdIRlJFUQkoMTA4KjE2MDAwKQoKLyoKICogRnJlcXVlbmN5IGNhbGN1bGF0aW9uIGNvbnN0YW50cy4gIEludGVybWVkaWF0ZSBmcmVxdWVuY3kgMTAuNTIgTUh6IChub21pbmFsCiAqIHZhbHVlIDEwLjcgTUh6KSwgcmVmZXJlbmNlIGRpdmlzb3IgNi4zOSBrSHogKG5vbWluYWwgNi4yNSBrSHopLgogKi8KI2RlZmluZSBGU0NBTEUJCTgKI2RlZmluZSBJRl9PRkZTRVQJKCh1bnNpZ25lZCBpbnQpKDEwLjUyICogMTYwMDAgKiAoMTw8RlNDQUxFKSkpCiNkZWZpbmUgUkVGX0ZSRVEJKCh1bnNpZ25lZCBpbnQpKDYuMzkgKiAxNiAqICgxPDxGU0NBTEUpKSkKCiNkZWZpbmUgR0VNVEVLX0NLCQkweDAxCS8qIENsb2NrIHNpZ25hbAkJCSovCiNkZWZpbmUgR0VNVEVLX0RBCQkweDAyCS8qIFNlcmlhbCBkYXRhCQkJKi8KI2RlZmluZSBHRU1URUtfQ0UJCTB4MDQJLyogQ2hpcCBlbmFibGUJCQkqLwojZGVmaW5lIEdFTVRFS19OUwkJMHgwOAkvKiBObyBzaWduYWwJCQkqLwojZGVmaW5lIEdFTVRFS19NVAkJMHgxMAkvKiBMaW5lIG11dGUJCQkqLwojZGVmaW5lIEdFTVRFS19TVERGXzNfMTI1X0tIWgkweDAxCS8qIFN0YW5kYXJkIGZyZXF1ZW5jeSAzLjEyNSBrSHoJKi8KI2RlZmluZSBHRU1URUtfUExMX09GRgkJMHgwNwkvKiBQTEwgb2ZmCQkJKi8KCiNkZWZpbmUgQlUyNjE0X0JVU19TSVpFCTMyCS8qIEJVMjYxNCAvIEJVMjYxNEZTIGJ1cyBzaXplCQkqLwoKI2RlZmluZSBTSE9SVF9ERUxBWSA1CQkvKiB1c2VjICovCiNkZWZpbmUgTE9OR19ERUxBWSA3NQkJLyogdXNlYyAqLwoKc3RydWN0IGdlbXRla19kZXZpY2UgewoJdW5zaWduZWQgbG9uZyBsYXN0ZnJlcTsKCWludCBtdXRlZDsKCXUzMiBidTI2MTRkYXRhOwp9OwoKI2RlZmluZSBCVTI2MTRfRlJFUV9CSVRTIAkxNiAvKiBEMC4uRDE1LCBGcmVxdWVuY3kgZGF0YQkJKi8KI2RlZmluZSBCVTI2MTRfUE9SVF9CSVRTCTMgLyogUDAuLlAyLCBPdXRwdXQgcG9ydCBjb250cm9sIGRhdGEJKi8KI2RlZmluZSBCVTI2MTRfVk9JRF9CSVRTCTQgLyogdW51c2VkIAkJCQkqLwojZGVmaW5lIEJVMjYxNF9GTUVTX0JJVFMJMSAvKiBDVCwgRnJlcXVlbmN5IG1lYXN1cmVtZW50IGJlZ2lubmluZyBkYXRhICovCiNkZWZpbmUgQlUyNjE0X1NUREZfQklUUwkzIC8qIFIwLi5SMiwgU3RhbmRhcmQgZnJlcXVlbmN5IGRhdGEJKi8KI2RlZmluZSBCVTI2MTRfU1dJTl9CSVRTCTEgLyogUywgU3dpdGNoIGJldHdlZW4gRk1JTiAvIEFNSU4JKi8KI2RlZmluZSBCVTI2MTRfU1dBTF9CSVRTICAgICAgICAxIC8qIFBTLCBTd2FsbG93IGNvdW50ZXIgZGl2aXNpb24gKEFNSU4gb25seSkqLwojZGVmaW5lIEJVMjYxNF9WT0lEMl9CSVRTCTEgLyogdW51c2VkCQkJCSovCiNkZWZpbmUgQlUyNjE0X0ZNVU5fQklUUwkxIC8qIEdULCBGcmVxdWVuY3kgbWVhc3VyZW1lbnQgdGltZSAmIHVubG9jayAqLwojZGVmaW5lIEJVMjYxNF9URVNUX0JJVFMJMSAvKiBUUywgVGVzdCBkYXRhIGlzIGlucHV0CQkqLwoKI2RlZmluZSBCVTI2MTRfRlJFUV9TSElGVCAJMAojZGVmaW5lIEJVMjYxNF9QT1JUX1NISUZUCShCVTI2MTRfRlJFUV9CSVRTICsgQlUyNjE0X0ZSRVFfU0hJRlQpCiNkZWZpbmUgQlUyNjE0X1ZPSURfU0hJRlQJKEJVMjYxNF9QT1JUX0JJVFMgKyBCVTI2MTRfUE9SVF9TSElGVCkKI2RlZmluZSBCVTI2MTRfRk1FU19TSElGVAkoQlUyNjE0X1ZPSURfQklUUyArIEJVMjYxNF9WT0lEX1NISUZUKQojZGVmaW5lIEJVMjYxNF9TVERGX1NISUZUCShCVTI2MTRfRk1FU19CSVRTICsgQlUyNjE0X0ZNRVNfU0hJRlQpCiNkZWZpbmUgQlUyNjE0X1NXSU5fU0hJRlQJKEJVMjYxNF9TVERGX0JJVFMgKyBCVTI2MTRfU1RERl9TSElGVCkKI2RlZmluZSBCVTI2MTRfU1dBTF9TSElGVAkoQlUyNjE0X1NXSU5fQklUUyArIEJVMjYxNF9TV0lOX1NISUZUKQojZGVmaW5lIEJVMjYxNF9WT0lEMl9TSElGVAkoQlUyNjE0X1NXQUxfQklUUyArIEJVMjYxNF9TV0FMX1NISUZUKQojZGVmaW5lIEJVMjYxNF9GTVVOX1NISUZUCShCVTI2MTRfVk9JRDJfQklUUyArIEJVMjYxNF9WT0lEMl9TSElGVCkKI2RlZmluZSBCVTI2MTRfVEVTVF9TSElGVAkoQlUyNjE0X0ZNVU5fQklUUyArIEJVMjYxNF9GTVVOX1NISUZUKQoKI2RlZmluZSBNS01BU0soZmllbGQpCSgoKDE8PEJVMjYxNF8jI2ZpZWxkIyNfQklUUykgLSAxKSA8PCBcCgkJCUJVMjYxNF8jI2ZpZWxkIyNfU0hJRlQpCiNkZWZpbmUgQlUyNjE0X1BPUlRfTUFTSwlNS01BU0soUE9SVCkKI2RlZmluZSBCVTI2MTRfRlJFUV9NQVNLCU1LTUFTSyhGUkVRKQojZGVmaW5lIEJVMjYxNF9WT0lEX01BU0sJTUtNQVNLKFZPSUQpCiNkZWZpbmUgQlUyNjE0X0ZNRVNfTUFTSwlNS01BU0soRk1FUykKI2RlZmluZSBCVTI2MTRfU1RERl9NQVNLCU1LTUFTSyhTVERGKQojZGVmaW5lIEJVMjYxNF9TV0lOX01BU0sJTUtNQVNLKFNXSU4pCiNkZWZpbmUgQlUyNjE0X1NXQUxfTUFTSwlNS01BU0soU1dBTCkKI2RlZmluZSBCVTI2MTRfVk9JRDJfTUFTSwlNS01BU0soVk9JRDIpCiNkZWZpbmUgQlUyNjE0X0ZNVU5fTUFTSwlNS01BU0soRk1VTikKI2RlZmluZSBCVTI2MTRfVEVTVF9NQVNLCU1LTUFTSyhURVNUKQoKc3RhdGljIHN0cnVjdCBnZW10ZWtfZGV2aWNlIGdlbXRla191bml0OwoKc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKCi8qCiAqIFNldCBkYXRhIHdoaWNoIHdpbGwgYmUgc2VudCB0byBCVTI2MTRGUy4KICovCiNkZWZpbmUgZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBmaWVsZCwgZGF0YSkgKChkZXYpLT5idTI2MTRkYXRhID0gXAoJKChkZXYpLT5idTI2MTRkYXRhICYgfmZpZWxkIyNfTUFTSykgfCAoKGRhdGEpIDw8IGZpZWxkIyNfU0hJRlQpKQoKLyoKICogVHJhbnNtaXQgc2V0dGluZ3MgdG8gQlUyNjE0RlMgb3ZlciBHZW1UZWsgSUMuCiAqLwpzdGF0aWMgdm9pZCBnZW10ZWtfYnUyNjE0X3RyYW5zbWl0KHN0cnVjdCBnZW10ZWtfZGV2aWNlICpkZXYpCnsKCWludCBpLCBiaXQsIHEsIG11dGU7CgoJc3Bpbl9sb2NrKCZsb2NrKTsKCgltdXRlID0gZGV2LT5tdXRlZCA/IEdFTVRFS19NVCA6IDB4MDA7CgoJb3V0Yl9wKG11dGUgfCBHRU1URUtfREEgfCBHRU1URUtfQ0ssIGlvKTsKCXVkZWxheShTSE9SVF9ERUxBWSk7CglvdXRiX3AobXV0ZSB8IEdFTVRFS19DRSB8IEdFTVRFS19EQSB8IEdFTVRFS19DSywgaW8pOwoJdWRlbGF5KExPTkdfREVMQVkpOwoKCWZvciAoaSA9IDAsIHEgPSBkZXYtPmJ1MjYxNGRhdGE7IGkgPCAzMjsgaSsrLCBxID4+PSAxKSB7CgkgICAgYml0ID0gKHEgJiAxKSA/IEdFTVRFS19EQSA6IDA7CgkgICAgb3V0Yl9wKG11dGUgfCBHRU1URUtfQ0UgfCBiaXQsIGlvKTsKCSAgICB1ZGVsYXkoU0hPUlRfREVMQVkpOwoJICAgIG91dGJfcChtdXRlIHwgR0VNVEVLX0NFIHwgYml0IHwgR0VNVEVLX0NLLCBpbyk7CgkgICAgdWRlbGF5KFNIT1JUX0RFTEFZKTsKCX0KCglvdXRiX3AobXV0ZSB8IEdFTVRFS19EQSB8IEdFTVRFS19DSywgaW8pOwoJdWRlbGF5KFNIT1JUX0RFTEFZKTsKCW91dGJfcChtdXRlIHwgR0VNVEVLX0NFIHwgR0VNVEVLX0RBIHwgR0VNVEVLX0NLLCBpbyk7Cgl1ZGVsYXkoTE9OR19ERUxBWSk7CgoJc3Bpbl91bmxvY2soJmxvY2spOwp9CgovKgogKiBDYWxjdWxhdGUgZGl2aXNvciBmcm9tIEZNLWZyZXF1ZW5jeSBmb3IgQlUyNjE0RlMgKDMuMTI1IEtIeiBTVERGIGV4cGVjdGVkKS4KICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIGdlbXRla19jb252ZnJlcSh1bnNpZ25lZCBsb25nIGZyZXEpCnsKCXJldHVybiAoKGZyZXE8PEZTQ0FMRSkgKyBJRl9PRkZTRVQgKyBSRUZfRlJFUS8yKSAvIFJFRl9GUkVROwp9CgovKgogKiBTZXQgRk0tZnJlcXVlbmN5LgogKi8Kc3RhdGljIHZvaWQgZ2VtdGVrX3NldGZyZXEoc3RydWN0IGdlbXRla19kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmcmVxKQp7CgoJaWYgKGtlZXBtdXRlZCAmJiBoYXJkbXV0ZSAmJiBkZXYtPm11dGVkKQoJCXJldHVybjsKCglpZiAoZnJlcSA8IEdFTVRFS19MT1dGUkVRKQoJCWZyZXEgPSBHRU1URUtfTE9XRlJFUTsKCWVsc2UgaWYgKGZyZXEgPiBHRU1URUtfSElHSEZSRVEpCgkJZnJlcSA9IEdFTVRFS19ISUdIRlJFUTsKCglkZXYtPmxhc3RmcmVxID0gZnJlcTsKCWRldi0+bXV0ZWQgPSAwOwoKCWdlbXRla19idTI2MTRfc2V0KGRldiwgQlUyNjE0X1BPUlQsIDApOwoJZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBCVTI2MTRfRk1FUywgMCk7CglnZW10ZWtfYnUyNjE0X3NldChkZXYsIEJVMjYxNF9TV0lOLCAwKTsJLyogRk0tbW9kZQkqLwoJZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBCVTI2MTRfU1dBTCwgMCk7CglnZW10ZWtfYnUyNjE0X3NldChkZXYsIEJVMjYxNF9GTVVOLCAxKTsJLyogR1QgYml0IHNldAkqLwoJZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBCVTI2MTRfVEVTVCwgMCk7CgoJZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBCVTI2MTRfU1RERiwgR0VNVEVLX1NUREZfM18xMjVfS0haKTsKCWdlbXRla19idTI2MTRfc2V0KGRldiwgQlUyNjE0X0ZSRVEsIGdlbXRla19jb252ZnJlcShmcmVxKSk7CgoJZ2VtdGVrX2J1MjYxNF90cmFuc21pdChkZXYpOwp9CgovKgogKiBTZXQgbXV0ZSBmbGFnLgogKi8Kc3RhdGljIHZvaWQgZ2VtdGVrX211dGUoc3RydWN0IGdlbXRla19kZXZpY2UgKmRldikKewoJaW50IGk7CglkZXYtPm11dGVkID0gMTsKCglpZiAoaGFyZG11dGUpIHsKCQkvKiBUdXJuIG9mZiBQTEwsIGRpc2FibGUgZGF0YSBvdXRwdXQgKi8KCQlnZW10ZWtfYnUyNjE0X3NldChkZXYsIEJVMjYxNF9QT1JULCAwKTsKCQlnZW10ZWtfYnUyNjE0X3NldChkZXYsIEJVMjYxNF9GTUVTLCAwKTsJLyogQ1QgYml0IG9mZgkqLwoJCWdlbXRla19idTI2MTRfc2V0KGRldiwgQlUyNjE0X1NXSU4sIDApOwkvKiBGTS1tb2RlCSovCgkJZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBCVTI2MTRfU1dBTCwgMCk7CgkJZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBCVTI2MTRfRk1VTiwgMCk7CS8qIEdUIGJpdCBvZmYJKi8KCQlnZW10ZWtfYnUyNjE0X3NldChkZXYsIEJVMjYxNF9URVNULCAwKTsKCQlnZW10ZWtfYnUyNjE0X3NldChkZXYsIEJVMjYxNF9TVERGLCBHRU1URUtfUExMX09GRik7CgkJZ2VtdGVrX2J1MjYxNF9zZXQoZGV2LCBCVTI2MTRfRlJFUSwgMCk7CgkJZ2VtdGVrX2J1MjYxNF90cmFuc21pdChkZXYpOwoJfSBlbHNlIHsKCQlzcGluX2xvY2soJmxvY2spOwoKCQkvKiBSZWFkIGJ1cyBjb250ZW50cyAoQ0UsIENLIGFuZCBEQSkuICovCgkJaSA9IGluYl9wKGlvKTsKCQkvKiBXcml0ZSBpdCBiYWNrIHdpdGggbXV0ZSBmbGFnIHNldC4gKi8KCQlvdXRiX3AoKGkgPj4gNSkgfCBHRU1URUtfTVQsIGlvKTsKCQl1ZGVsYXkoU0hPUlRfREVMQVkpOwoKCQlzcGluX3VubG9jaygmbG9jayk7Cgl9Cn0KCi8qCiAqIFVuc2V0IG11dGUgZmxhZy4KICovCnN0YXRpYyB2b2lkIGdlbXRla191bm11dGUoc3RydWN0IGdlbXRla19kZXZpY2UgKmRldikKewoJaW50IGk7CglkZXYtPm11dGVkID0gMDsKCglpZiAoaGFyZG11dGUpIHsKCQkvKiBUdXJuIFBMTCBiYWNrIG9uLiAqLwoJCWdlbXRla19zZXRmcmVxKGRldiwgZGV2LT5sYXN0ZnJlcSk7Cgl9IGVsc2UgewoJCXNwaW5fbG9jaygmbG9jayk7CgoJCWkgPSBpbmJfcChpbyk7CgkJb3V0Yl9wKGkgPj4gNSwgaW8pOwoJCXVkZWxheShTSE9SVF9ERUxBWSk7CgoJCXNwaW5fdW5sb2NrKCZsb2NrKTsKCX0KfQoKLyoKICogR2V0IHNpZ25hbCBzdHJlbmd0aCAoPSBzdGVyZW8gc3RhdHVzKS4KICovCnN0YXRpYyBpbmxpbmUgaW50IGdlbXRla19nZXRzaWdzdHIodm9pZCkKewoJcmV0dXJuIGluYl9wKGlvKSAmIEdFTVRFS19OUyA/IDAgOiAxOwp9CgovKgogKiBDaGVjayBpZiByZXF1ZXN0ZWQgY2FyZCBhY3RzIGxpa2UgR2VtVGVrIFJhZGlvIGNhcmQuCiAqLwpzdGF0aWMgaW50IGdlbXRla192ZXJpZnkoaW50IHBvcnQpCnsKCXN0YXRpYyBpbnQgdmVyaWZpZWQgPSAtMTsKCWludCBpLCBxOwoKCWlmICh2ZXJpZmllZCA9PSBwb3J0KQoJCXJldHVybiAxOwoKCXNwaW5fbG9jaygmbG9jayk7CgoJcSA9IGluYl9wKHBvcnQpOwkvKiBSZWFkIGJ1cyBjb250ZW50cyBiZWZvcmUgcHJvYmluZy4gKi8KCS8qIFRyeSB0byB0dXJuIG9uIENFLCBDSyBhbmQgREEgcmVzcGVjdGl2ZWx5IGFuZCBjaGVjayBpZiBjYXJkIHJlc3BvbmRzCgkgICBwcm9wZXJseS4gKi8KCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKCQlvdXRiX3AoMSA8PCBpLCBwb3J0KTsKCQl1ZGVsYXkoU0hPUlRfREVMQVkpOwoKCQlpZiAoKGluYl9wKHBvcnQpICYgKH5HRU1URUtfTlMpKSAhPSAoMHgxNyB8ICgxIDw8IChpICsgNSkpKSkgewoJCQlzcGluX3VubG9jaygmbG9jayk7CgkJCXJldHVybiAwOwoJCX0KCX0KCW91dGJfcChxID4+IDUsIHBvcnQpOwkvKiBXcml0ZSBidXMgY29udGVudHMgYmFjay4gKi8KCXVkZWxheShTSE9SVF9ERUxBWSk7CgoJc3Bpbl91bmxvY2soJmxvY2spOwoJdmVyaWZpZWQgPSBwb3J0OwoKCXJldHVybiAxOwp9CgovKgogKiBBdXRvbWF0aWMgcHJvYmluZyBmb3IgY2FyZC4KICovCnN0YXRpYyBpbnQgZ2VtdGVrX3Byb2JlKHZvaWQpCnsKCWludCBpb3BvcnRzW10gPSB7IDB4MjBjLCAweDMwYywgMHgyNGMsIDB4MzRjLCAweDI0OCwgMHgyOGMgfTsKCWludCBpOwoKCWlmICghcHJvYmUpIHsKCQlwcmludGsoS0VSTl9JTkZPICJBdXRvbWF0aWMgZGV2aWNlIHByb2JpbmcgZGlzYWJsZWQuXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiQXV0b21hdGljIGRldmljZSBwcm9iaW5nIGVuYWJsZWQuXG4iKTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb3BvcnRzKTsgKytpKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiVHJ5aW5nIEkvTyBwb3J0IDB4JXguLi5cbiIsIGlvcG9ydHNbaV0pOwoKCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvcG9ydHNbaV0sIDEsICJnZW10ZWstcHJvYmUiKSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJL08gcG9ydCAweCV4IGJ1c3khXG4iLAoJCQkgICAgICAgaW9wb3J0c1tpXSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJaWYgKGdlbXRla192ZXJpZnkoaW9wb3J0c1tpXSkpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2FyZCBmb3VuZCBmcm9tIEkvTyBwb3J0ICIKCQkJICAgICAgICIweCV4IVxuIiwgaW9wb3J0c1tpXSk7CgoJCQlyZWxlYXNlX3JlZ2lvbihpb3BvcnRzW2ldLCAxKTsKCgkJCWlvID0gaW9wb3J0c1tpXTsKCQkJcmV0dXJuIGlvOwoJCX0KCgkJcmVsZWFzZV9yZWdpb24oaW9wb3J0c1tpXSwgMSk7Cgl9CgoJcHJpbnRrKEtFUk5fRVJSICJBdXRvbWF0aWMgcHJvYmluZyBmYWlsZWQhXG4iKTsKCglyZXR1cm4gLTE7Cn0KCi8qCiAqIFZpZGVvIDQgTGludXggc3R1ZmYuCiAqLwoKc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCByYWRpb19xY3RybFtdID0gewoJewoJCS5pZCA9IFY0TDJfQ0lEX0FVRElPX01VVEUsCgkJLm5hbWUgPSAiTXV0ZSIsCgkJLm1pbmltdW0gPSAwLAoJCS5tYXhpbXVtID0gMSwKCQkuZGVmYXVsdF92YWx1ZSA9IDEsCgkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAoJfSwgewoJCS5pZCA9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKCQkubmFtZSA9ICJWb2x1bWUiLAoJCS5taW5pbXVtID0gMCwKCQkubWF4aW11bSA9IDY1NTM1LAoJCS5zdGVwID0gNjU1MzUsCgkJLmRlZmF1bHRfdmFsdWUgPSAweGZmLAoJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKCX0KfTsKCnN0YXRpYyBpbnQgZ2VtdGVrX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmaW5fdXNlKSA/IC1FQlVTWSA6IDA7Cn0KCnN0YXRpYyBpbnQgZ2VtdGVrX2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQp7CgljbGVhcl9iaXQoMCwgJmluX3VzZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBnZW10ZWtfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5vcGVuCQk9IGdlbXRla19leGNsdXNpdmVfb3BlbiwKCS5yZWxlYXNlCT0gZ2VtdGVrX2V4Y2x1c2l2ZV9yZWxlYXNlLAoJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKfTsKCnN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAoJCQkgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2KQp7CglzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWdlbXRlayIsIHNpemVvZih2LT5kcml2ZXIpKTsKCXN0cmxjcHkodi0+Y2FyZCwgIkdlbVRlayIsIHNpemVvZih2LT5jYXJkKSk7CglzcHJpbnRmKHYtPmJ1c19pbmZvLCAiSVNBIik7Cgl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX3R1bmVyICp2KQp7CglpZiAodi0+aW5kZXggPiAwKQoJCXJldHVybiAtRUlOVkFMOwoKCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwoJdi0+cmFuZ2Vsb3cgPSBHRU1URUtfTE9XRlJFUTsKCXYtPnJhbmdlaGlnaCA9IEdFTVRFS19ISUdIRlJFUTsKCXYtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9MT1cgfCBWNEwyX1RVTkVSX0NBUF9TVEVSRU87Cgl2LT5zaWduYWwgPSAweGZmZmYgKiBnZW10ZWtfZ2V0c2lnc3RyKCk7CglpZiAodi0+c2lnbmFsKSB7CgkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CgkJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKCX0gZWxzZSB7CgkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwoJCXYtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl90dW5lciAqdikKewoJaWYgKHYtPmluZGV4ID4gMCkKCQlyZXR1cm4gLUVJTlZBTDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKCQkJICAgICAgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQp7CglzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwoKCWdlbXRla19zZXRmcmVxKHJ0LCBmLT5mcmVxdWVuY3kpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKCQkJICAgICAgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQp7CglzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwoKCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwoJZi0+ZnJlcXVlbmN5ID0gcnQtPmxhc3RmcmVxOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKCQkJICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgKytpKSB7CgkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwgc2l6ZW9mKCpxYykpOwoJCQlyZXR1cm4gMDsKCQl9Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAoJCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKewoJc3RydWN0IGdlbXRla19kZXZpY2UgKnJ0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCglzd2l0Y2ggKGN0cmwtPmlkKSB7CgljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CgkJY3RybC0+dmFsdWUgPSBydC0+bXV0ZWQ7CgkJcmV0dXJuIDA7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKCQlpZiAocnQtPm11dGVkKQoJCQljdHJsLT52YWx1ZSA9IDA7CgkJZWxzZQoJCQljdHJsLT52YWx1ZSA9IDY1NTM1OwoJCXJldHVybiAwOwoJfQoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCnsKCXN0cnVjdCBnZW10ZWtfZGV2aWNlICpydCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CgoJc3dpdGNoIChjdHJsLT5pZCkgewoJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgoJCWlmIChjdHJsLT52YWx1ZSkKCQkJZ2VtdGVrX211dGUocnQpOwoJCWVsc2UKCQkJZ2VtdGVrX3VubXV0ZShydCk7CgkJcmV0dXJuIDA7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKCQlpZiAoY3RybC0+dmFsdWUpCgkJCWdlbXRla191bm11dGUocnQpOwoJCWVsc2UKCQkJZ2VtdGVrX211dGUocnQpOwoJCXJldHVybiAwOwoJfQoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2F1ZGlvICphKQp7CglpZiAoYS0+aW5kZXggPiAxKQoJCXJldHVybiAtRUlOVkFMOwoKCXN0cmNweShhLT5uYW1lLCAiUmFkaW8iKTsKCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQp7CgkqaSA9IDA7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCnsKCWlmIChpICE9IDApCgkJcmV0dXJuIC1FSU5WQUw7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYXVkaW8gKmEpCnsKCWlmIChhLT5pbmRleCAhPSAwKQoJCXJldHVybiAtRUlOVkFMOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgZ2VtdGVrX2lvY3RsX29wcyA9IHsKCS52aWRpb2NfcXVlcnljYXAJPSB2aWRpb2NfcXVlcnljYXAsCgkudmlkaW9jX2dfdHVuZXIJCT0gdmlkaW9jX2dfdHVuZXIsCgkudmlkaW9jX3NfdHVuZXIJCT0gdmlkaW9jX3NfdHVuZXIsCgkudmlkaW9jX2dfYXVkaW8JCT0gdmlkaW9jX2dfYXVkaW8sCgkudmlkaW9jX3NfYXVkaW8JCT0gdmlkaW9jX3NfYXVkaW8sCgkudmlkaW9jX2dfaW5wdXQJCT0gdmlkaW9jX2dfaW5wdXQsCgkudmlkaW9jX3NfaW5wdXQJCT0gdmlkaW9jX3NfaW5wdXQsCgkudmlkaW9jX2dfZnJlcXVlbmN5CT0gdmlkaW9jX2dfZnJlcXVlbmN5LAoJLnZpZGlvY19zX2ZyZXF1ZW5jeQk9IHZpZGlvY19zX2ZyZXF1ZW5jeSwKCS52aWRpb2NfcXVlcnljdHJsCT0gdmlkaW9jX3F1ZXJ5Y3RybCwKCS52aWRpb2NfZ19jdHJsCQk9IHZpZGlvY19nX2N0cmwsCgkudmlkaW9jX3NfY3RybAkJPSB2aWRpb2Nfc19jdHJsCn07CgpzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBnZW10ZWtfcmFkaW8gPSB7CgkubmFtZQkJPSAiR2VtVGVrIFJhZGlvIGNhcmQiLAoJLmZvcHMJCT0gJmdlbXRla19mb3BzLAoJLmlvY3RsX29wcyAJPSAmZ2VtdGVrX2lvY3RsX29wcywKCS5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCn07CgovKgogKiBJbml0aWFsaXphdGlvbiAvIGNsZWFudXAgcmVsYXRlZCBzdHVmZi4KICovCgovKgogKiBJbml0aWxpemUgY2FyZC4KICovCnN0YXRpYyBpbnQgX19pbml0IGdlbXRla19pbml0KHZvaWQpCnsKCXByaW50ayhLRVJOX0lORk8gUkFESU9fQkFOTkVSICJcbiIpOwoKCXNwaW5fbG9ja19pbml0KCZsb2NrKTsKCglnZW10ZWtfcHJvYmUoKTsKCWlmIChpbykgewoJCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDEsICJnZW10ZWsiKSkgewoJCQlwcmludGsoS0VSTl9FUlIgIkkvTyBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2UuXG4iLCBpbyk7CgkJCXJldHVybiAtRUJVU1k7CgkJfQoKCQlpZiAoIWdlbXRla192ZXJpZnkoaW8pKQoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYXJkIGF0IEkvTyBwb3J0IDB4JXggZG9lcyBub3QgIgoJCQkgICAgICAgInJlc3BvbmQgcHJvcGVybHksIGNoZWNrIHlvdXIgIgoJCQkgICAgICAgImNvbmZpZ3VyYXRpb24uXG4iLCBpbyk7CgkJZWxzZQoJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBJL08gcG9ydCAweCV4LlxuIiwgaW8pOwoJfSBlbHNlIGlmIChwcm9iZSkgewoJCXByaW50ayhLRVJOX0VSUiAiQXV0b21hdGljIHByb2JpbmcgZmFpbGVkIGFuZCBubyAiCgkJICAgICAgICJmaXhlZCBJL08gcG9ydCBkZWZpbmVkLlxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9IGVsc2UgewoJCXByaW50ayhLRVJOX0VSUiAiQXV0b21hdGljIHByb2JpbmcgZGlzYWJsZWQgYnV0IG5vIGZpeGVkICIKCQkgICAgICAgIkkvTyBwb3J0IGRlZmluZWQuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJdmlkZW9fc2V0X2RydmRhdGEoJmdlbXRla19yYWRpbywgJmdlbXRla191bml0KTsKCglpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZnZW10ZWtfcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucikgPCAwKSB7CgkJcmVsZWFzZV9yZWdpb24oaW8sIDEpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJLyogU2V0IGRlZmF1bHRzICovCglnZW10ZWtfdW5pdC5sYXN0ZnJlcSA9IEdFTVRFS19MT1dGUkVROwoJZ2VtdGVrX3VuaXQuYnUyNjE0ZGF0YSA9IDA7CgoJaWYgKGluaXRtdXRlKQoJCWdlbXRla19tdXRlKCZnZW10ZWtfdW5pdCk7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIE1vZHVsZSBjbGVhbnVwCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgZ2VtdGVrX2V4aXQodm9pZCkKewoJaWYgKHNodXRkb3duKSB7CgkJaGFyZG11dGUgPSAxOwkvKiBUdXJuIG9mZiBQTEwgKi8KCQlnZW10ZWtfbXV0ZSgmZ2VtdGVrX3VuaXQpOwoJfSBlbHNlIHsKCQlwcmludGsoS0VSTl9JTkZPICJNb2R1bGUgdW5sb2FkZWQgYnV0IGNhcmQgbm90IG11dGVkIVxuIik7Cgl9CgoJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmdlbXRla19yYWRpbyk7CglyZWxlYXNlX3JlZ2lvbihpbywgMSk7Cn0KCm1vZHVsZV9pbml0KGdlbXRla19pbml0KTsKbW9kdWxlX2V4aXQoZ2VtdGVrX2V4aXQpOwo=