Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UKICogIFN1cHBvcnQsIG1hZGUgc29tZSBzdHVmZiBzbWFsbGVyLCBhbmQgZml0dGVkIGZvciBsaWZlIGluIGJ1c3lib3guCiAqCiAqLwoKI2luY2x1ZGUgImJ1c3lib3guaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CQkJLyogZm9yIF9JTyAqLwojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkJLyogZm9yIFBBR0VfU0laRSBhbmQgUEFHRV9TSElGVCAqLwoJCQkJLyogd2UgYWxzbyBnZXQgUEFHRV9TSVpFIHZpYSBnZXRwYWdlc2l6ZSgpICovCgojaWZuZGVmIF9JTwovKiBwcmUtMS4zLjQ1ICovCiNkZWZpbmUgQkxLR0VUU0laRSAweDEyNjAKI2Vsc2UKLyogc2FtZSBvbiBpMzg2LCBtNjhrLCBhcm07IGRpZmZlcmVudCBvbiBhbHBoYSwgbWlwcywgc3BhcmMsIHBwYyAqLwojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCiNlbmRpZgoKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBERVYgPSAtMTsKc3RhdGljIGxvbmcgUEFHRVMgPSAwOwpzdGF0aWMgaW50IGNoZWNrID0gMDsKc3RhdGljIGludCBiYWRwYWdlcyA9IDA7CnN0YXRpYyBpbnQgdmVyc2lvbiA9IC0xOwoKI2RlZmluZSBNQUtFX1ZFUlNJT04ocCxxLHIpCSg2NTUzNioocCkgKyAyNTYqKHEpICsgKHIpKQoKLyoKICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHVuaW9uIHN3YXBfaGVhZGVyIHVzZXMgdGhlIGNvbnN0YW50IFBBR0VfU0laRS4KICogVW5mb3J0dW5hdGVseSwgb24gc29tZSBhcmNoaXRlY3R1cmVzIHRoaXMgZGVwZW5kcyBvbiB0aGUgaGFyZHdhcmUgbW9kZWwsCiAqIGFuZCBjYW4gb25seSBiZSBmb3VuZCBhdCBydW4gdGltZSAtLSB3ZSB1c2UgZ2V0cGFnZXNpemUoKS4KICovCgpzdGF0aWMgaW50IHBhZ2VzaXplOwpzdGF0aWMgaW50ICpzaWduYXR1cmVfcGFnZTsKCnN0cnVjdCBzd2FwX2hlYWRlcl92MSB7CgljaGFyIGJvb3RiaXRzWzEwMjRdOwkJLyogU3BhY2UgZm9yIGRpc2tsYWJlbCBldGMuICovCgl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKCXVuc2lnbmVkIGludCBsYXN0X3BhZ2U7Cgl1bnNpZ25lZCBpbnQgbnJfYmFkcGFnZXM7Cgl1bnNpZ25lZCBpbnQgcGFkZGluZ1sxMjVdOwoJdW5zaWduZWQgaW50IGJhZHBhZ2VzWzFdOwp9ICpwOwoKc3RhdGljIHZvaWQgaW5pdF9zaWduYXR1cmVfcGFnZSgpCnsKCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKCiNpZmRlZiBQQUdFX1NJWkUKCWlmIChwYWdlc2l6ZSAhPSBQQUdFX1NJWkUpCgkJZXJyb3JfbXNnKCJBc3N1bWluZyBwYWdlcyBvZiBzaXplICVkXG4iLCBwYWdlc2l6ZSk7CiNlbmRpZgoJc2lnbmF0dXJlX3BhZ2UgPSAoaW50ICopIHhtYWxsb2MocGFnZXNpemUpOwoJbWVtc2V0KHNpZ25hdHVyZV9wYWdlLCAwLCBwYWdlc2l6ZSk7CglwID0gKHN0cnVjdCBzd2FwX2hlYWRlcl92MSAqKSBzaWduYXR1cmVfcGFnZTsKfQoKc3RhdGljIHZvaWQgd3JpdGVfc2lnbmF0dXJlKGNoYXIgKnNpZykKewoJY2hhciAqc3AgPSAoY2hhciAqKSBzaWduYXR1cmVfcGFnZTsKCglzdHJuY3B5KHNwICsgcGFnZXNpemUgLSAxMCwgc2lnLCAxMCk7Cn0KCiNkZWZpbmUgVjBfTUFYX1BBR0VTCSg4ICogKHBhZ2VzaXplIC0gMTApKQovKiBCZWZvcmUgMi4yLjBwcmU5ICovCiNkZWZpbmUgVjFfT0xEX01BWF9QQUdFUwkoKDB4N2ZmZmZmZmYgLyBwYWdlc2l6ZSkgLSAxKQovKiBTaW5jZSAyLjIuMHByZTk6CiAgIGVycm9yIGlmIG5yIG9mIHBhZ2VzID49IFNXUF9PRkZTRVQoU1dQX0VOVFJZKDAsfjBVTCkpCiAgIHdpdGggdmFyaWF0aW9ucyBvbgoJI2RlZmluZSBTV1BfRU5UUlkodHlwZSxvZmZzZXQpICgoKHR5cGUpIDw8IDEpIHwgKChvZmZzZXQpIDw8IDgpKQoJI2RlZmluZSBTV1BfT0ZGU0VUKGVudHJ5KSAoKGVudHJ5KSA+PiA4KQogICBvbiB0aGUgdmFyaW91cyBhcmNoaXRlY3R1cmVzLiBCZWxvdyB0aGUgcmVzdWx0IC0geXVrLgoKICAgTWFjaGluZQlwYWdlc2l6ZQlTV1BfRU5UUlkJU1dQX09GRlNFVAlib3VuZCsxCW9sZGJvdW5kKzIKICAgaTM4NgkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgbWlwcwkJMl4xMgkJbzw8MTUJCWU+PjE1CQkxPDwxNwkxPDwxOQogICBhbHBoYQkyXjEzCQlvPDw0MAkJZT4+NDAJCTE8PDI0CTE8PDE4CiAgIG02OGsJCTJeMTIJCW88PDEyCQllPj4xMgkJMTw8MjAJMTw8MTkKICAgc3BhcmMJMl57MTIsMTN9CShvJjB4M2ZmZmYpPDw5CShlPj45KSYweDNmZmZmCTE8PDE4CTE8PHsxOSwxOH0KICAgc3BhcmM2NAkyXjEzCQlvPDwxMwkJZT4+MTMJCTE8PDUxCTE8PDE4CiAgIHBwYwkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgYXJtbwkJMl57MTMsMTQsMTV9CW88PDgJCWU+PjgJCTE8PDI0CTE8PHsxOCwxNywxNn0KICAgYXJtdgkJMl4xMgkJbzw8OQkJZT4+OQkJMTw8MjMJMTw8MTkKCiAgIGFzc3VtaW5nIHRoYXQgbG9uZ3MgaGF2ZSA2NCBiaXRzIG9uIGFscGhhIGFuZCBzcGFyYzY0IGFuZCAzMiBiaXRzIGVsc2V3aGVyZS4KCiAgIFRoZSBiYWQgcGFydCBpcyB0aGF0IHdlIG5lZWQgdG8ga25vdyB0aGlzIHNpbmNlIHRoZSBrZXJuZWwgd2lsbAogICByZWZ1c2UgYSBzd2FwIHNwYWNlIGlmIGl0IGlzIHRvbyBsYXJnZS4KKi8KLyogcGF0Y2ggZnJvbSBqaiAtIHdoeSBkb2VzIHRoaXMgZGlmZmVyIGZyb20gdGhlIGFib3ZlPyAqLwojaWYgZGVmaW5lZChfX2FscGhhX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMjQpIC0gMSkKI2VsaWYgZGVmaW5lZChfX21pcHNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMSA8PCAxNykgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMyA8PCAyOSkgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIChwYWdlc2l6ZSA9PSA4MTkyID8gKCgzIDw8IDI5KSAtIDEpIDogKCgxIDw8IDE4KSAtIDEpKQojZWxzZQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgVjFfT0xEX01BWF9QQUdFUwojZW5kaWYKLyogbWFuIHBhZ2Ugbm93IHNheXM6ClRoZSBtYXhpbXVtIHVzZWZ1bCBzaXplIG9mIGEgc3dhcCBhcmVhIG5vdyBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUuCkl0IGlzIHJvdWdobHkgMkdCIG9uIGkzODYsIFBQQywgbTY4aywgQVJNLCAxR0Igb24gc3BhcmMsIDUxMk1CIG9uIG1pcHMsCjEyOEdCIG9uIGFscGhhIGFuZCAzVEIgb24gc3BhcmM2NC4KKi8KCiNkZWZpbmUgTUFYX0JBRFBBR0VTCSgocGFnZXNpemUtMTAyNC0xMjgqc2l6ZW9mKGludCktMTApL3NpemVvZihpbnQpKQoKc3RhdGljIHZvaWQgYml0X3NldCh1bnNpZ25lZCBpbnQgKmFkZHIsIHVuc2lnbmVkIGludCBucikKewoJdW5zaWduZWQgaW50IHIsIG07CgoJYWRkciArPSBuciAvICg4ICogc2l6ZW9mKGludCkpOwoKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgoJKmFkZHIgPSByIHwgbTsKfQoKc3RhdGljIGludCBiaXRfdGVzdF9hbmRfY2xlYXIodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCglyID0gKmFkZHI7CgltID0gMSA8PCAobnIgJiAoOCAqIHNpemVvZihpbnQpIC0gMSkpOwoKCSphZGRyID0gciAmIH5tOwoJcmV0dXJuIChyICYgbSkgIT0gMDsKfQoKCnZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJZXJyb3JfbXNnKCIlc1xuIiwgc3RyKTsKCWV4aXQoRVhJVF9GQUlMVVJFKTsKfQoKdm9pZCBwYWdlX29rKGludCBwYWdlKQp7CglpZiAodmVyc2lvbiA9PSAwKQoJCWJpdF9zZXQoc2lnbmF0dXJlX3BhZ2UsIHBhZ2UpOwp9Cgp2b2lkIHBhZ2VfYmFkKGludCBwYWdlKQp7CglpZiAodmVyc2lvbiA9PSAwKQoJCWJpdF90ZXN0X2FuZF9jbGVhcihzaWduYXR1cmVfcGFnZSwgcGFnZSk7CgllbHNlIHsKCQlpZiAoYmFkcGFnZXMgPT0gTUFYX0JBRFBBR0VTKQoJCQlkaWUoInRvbyBtYW55IGJhZCBwYWdlcyIpOwoJCXAtPmJhZHBhZ2VzW2JhZHBhZ2VzXSA9IHBhZ2U7Cgl9CgliYWRwYWdlcysrOwp9Cgp2b2lkIGNoZWNrX2Jsb2Nrcyh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgY3VycmVudF9wYWdlOwoJaW50IGRvX3NlZWsgPSAxOwoJY2hhciAqYnVmZmVyOwoKCWJ1ZmZlciA9IHhtYWxsb2MocGFnZXNpemUpOwoJY3VycmVudF9wYWdlID0gMDsKCXdoaWxlIChjdXJyZW50X3BhZ2UgPCBQQUdFUykgewoJCWlmICghY2hlY2spIHsKCQkJcGFnZV9vayhjdXJyZW50X3BhZ2UrKyk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoZG9fc2VlayAmJiBsc2VlayhERVYsIGN1cnJlbnRfcGFnZSAqIHBhZ2VzaXplLCBTRUVLX1NFVCkgIT0KCQkJY3VycmVudF9wYWdlICogcGFnZXNpemUpCgkJCWRpZSgic2VlayBmYWlsZWQgaW4gY2hlY2tfYmxvY2tzIik7CgkJaWYgKChkb19zZWVrID0gKHBhZ2VzaXplICE9IHJlYWQoREVWLCBidWZmZXIsIHBhZ2VzaXplKSkpKSB7CgkJCXBhZ2VfYmFkKGN1cnJlbnRfcGFnZSsrKTsKCQkJY29udGludWU7CgkJfQoJCXBhZ2Vfb2soY3VycmVudF9wYWdlKyspOwoJfQoJaWYgKGJhZHBhZ2VzID09IDEpCgkJcHJpbnRmKCJvbmUgYmFkIHBhZ2VcbiIpOwoJZWxzZSBpZiAoYmFkcGFnZXMgPiAxKQoJCXByaW50ZigiJWQgYmFkIHBhZ2VzXG4iLCBiYWRwYWdlcyk7Cn0KCnN0YXRpYyBsb25nIHZhbGlkX29mZnNldChpbnQgZmQsIGludCBvZmZzZXQpCnsKCWNoYXIgY2g7CgoJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIDApIDwgMCkKCQlyZXR1cm4gMDsKCWlmIChyZWFkKGZkLCAmY2gsIDEpIDwgMSkKCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGZpbmRfc2l6ZShpbnQgZmQpCnsKCXVuc2lnbmVkIGludCBoaWdoLCBsb3c7CgoJbG93ID0gMDsKCWZvciAoaGlnaCA9IDE7IGhpZ2ggPiAwICYmIHZhbGlkX29mZnNldChmZCwgaGlnaCk7IGhpZ2ggKj0gMikKCQlsb3cgPSBoaWdoOwoJd2hpbGUgKGxvdyA8IGhpZ2ggLSAxKSB7CgkJY29uc3QgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CgoJCWlmICh2YWxpZF9vZmZzZXQoZmQsIG1pZCkpCgkJCWxvdyA9IG1pZDsKCQllbHNlCgkJCWhpZ2ggPSBtaWQ7Cgl9CglyZXR1cm4gKGxvdyArIDEpOwp9CgovKiByZXR1cm4gc2l6ZSBpbiBwYWdlcywgdG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdyAqLwpzdGF0aWMgbG9uZyBnZXRfc2l6ZShjb25zdCBjaGFyICpmaWxlKQp7CglpbnQgZmQ7Cglsb25nIHNpemU7CgoJZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKCWlmIChmZCA8IDApIHsKCQlwZXJyb3IoZmlsZSk7CgkJZXhpdCgxKTsKCX0KCWlmIChpb2N0bChmZCwgQkxLR0VUU0laRSwgJnNpemUpID49IDApIHsKCQlpbnQgc2VjdG9yc19wZXJfcGFnZSA9IHBhZ2VzaXplIC8gNTEyOwoKCQlzaXplIC89IHNlY3RvcnNfcGVyX3BhZ2U7Cgl9IGVsc2UgewoJCXNpemUgPSBmaW5kX3NpemUoZmQpIC8gcGFnZXNpemU7Cgl9CgljbG9zZShmZCk7CglyZXR1cm4gc2l6ZTsKfQoKaW50IG1rc3dhcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJY2hhciAqdG1wOwoJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKCWludCBzejsKCWludCBtYXhwYWdlczsKCWludCBnb29kcGFnZXM7CglpbnQgb2Zmc2V0OwoJaW50IGZvcmNlID0gMDsKCglpbml0X3NpZ25hdHVyZV9wYWdlKCk7CQkvKiBnZXQgcGFnZXNpemUgKi8KCgl3aGlsZSAoYXJnYy0tID4gMSkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKSB7CgkJCQlpbnQgYmxvY2tzX3Blcl9wYWdlID0gcGFnZXNpemUgLyAxMDI0OwoKCQkJCVBBR0VTID0gc3RydG9sKGFyZ3ZbMF0sICZ0bXAsIDApIC8gYmxvY2tzX3Blcl9wYWdlOwoJCQkJaWYgKCp0bXApCgkJCQkJdXNhZ2UobWtzd2FwX3VzYWdlKTsKCQkJfSBlbHNlCgkJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlIHsKCQkJc3dpdGNoIChhcmd2WzBdWzFdKSB7CgkJCWNhc2UgJ2MnOgoJCQkJY2hlY2sgPSAxOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2YnOgoJCQkJZm9yY2UgPSAxOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3YnOgoJCQkJdmVyc2lvbiA9IGF0b2koYXJndlswXSArIDIpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJCQl9CgkJfQoJfQoJaWYgKCFkZXZpY2VfbmFtZSkgewoJCWVycm9yX21zZygiZXJyb3I6IE5vd2hlcmUgdG8gc2V0IHVwIHN3YXAgb24/XG4iKTsKCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJfQoJc3ogPSBnZXRfc2l6ZShkZXZpY2VfbmFtZSk7CglpZiAoIVBBR0VTKSB7CgkJUEFHRVMgPSBzejsKCX0gZWxzZSBpZiAoUEFHRVMgPiBzeiAmJiAhZm9yY2UpIHsKCQllcnJvcl9tc2coImVycm9yOiBzaXplICVsZCBpcyBsYXJnZXIgdGhhbiBkZXZpY2Ugc2l6ZSAlZFxuIiwKCQkJCVBBR0VTICogKHBhZ2VzaXplIC8gMTAyNCksIHN6ICogKHBhZ2VzaXplIC8gMTAyNCkpOwoJCXJldHVybiBFWElUX0ZBSUxVUkU7Cgl9CgoJaWYgKHZlcnNpb24gPT0gLTEpIHsKCQlpZiAoUEFHRVMgPD0gVjBfTUFYX1BBR0VTKQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlIGlmIChnZXRfa2VybmVsX3JldmlzaW9uKCkgPCBNQUtFX1ZFUlNJT04oMiwgMSwgMTE3KSkKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAocGFnZXNpemUgPCAyMDQ4KQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlCgkJCXZlcnNpb24gPSAxOwoJfQoJaWYgKHZlcnNpb24gIT0gMCAmJiB2ZXJzaW9uICE9IDEpIHsKCQllcnJvcl9tc2coImVycm9yOiB1bmtub3duIHZlcnNpb24gJWRcbiIsIHZlcnNpb24pOwoJCXVzYWdlKG1rc3dhcF91c2FnZSk7Cgl9CglpZiAoUEFHRVMgPCAxMCkgewoJCWVycm9yX21zZygiZXJyb3I6IHN3YXAgYXJlYSBuZWVkcyB0byBiZSBhdCBsZWFzdCAlbGRrQlxuIiwKCQkJCShsb25nKSAoMTAgKiBwYWdlc2l6ZSAvIDEwMjQpKTsKCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJfQojaWYgMAoJbWF4cGFnZXMgPSAoKHZlcnNpb24gPT0gMCkgPyBWMF9NQVhfUEFHRVMgOiBWMV9NQVhfUEFHRVMpOwojZWxzZQoJaWYgKCF2ZXJzaW9uKQoJCW1heHBhZ2VzID0gVjBfTUFYX1BBR0VTOwoJZWxzZSBpZiAoZ2V0X2tlcm5lbF9yZXZpc2lvbigpID49IE1BS0VfVkVSU0lPTigyLCAyLCAxKSkKCQltYXhwYWdlcyA9IFYxX01BWF9QQUdFUzsKCWVsc2UgewoJCW1heHBhZ2VzID0gVjFfT0xEX01BWF9QQUdFUzsKCQlpZiAobWF4cGFnZXMgPiBWMV9NQVhfUEFHRVMpCgkJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJfQojZW5kaWYKCWlmIChQQUdFUyA+IG1heHBhZ2VzKSB7CgkJUEFHRVMgPSBtYXhwYWdlczsKCQllcnJvcl9tc2coIndhcm5pbmc6IHRydW5jYXRpbmcgc3dhcCBhcmVhIHRvICVsZGtCXG4iLAoJCQkJUEFHRVMgKiBwYWdlc2l6ZSAvIDEwMjQpOwoJfQoKCURFViA9IG9wZW4oZGV2aWNlX25hbWUsIE9fUkRXUik7CglpZiAoREVWIDwgMCB8fCBmc3RhdChERVYsICZzdGF0YnVmKSA8IDApIHsKCQlwZXJyb3IoZGV2aWNlX25hbWUpOwoJCXJldHVybiBFWElUX0ZBSUxVUkU7Cgl9CglpZiAoIVNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkKCQljaGVjayA9IDA7CgllbHNlIGlmIChzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzAwIHx8IHN0YXRidWYuc3RfcmRldiA9PSAweDAzNDApCgkJZGllKCJXaWxsIG5vdCB0cnkgdG8gbWFrZSBzd2FwZGV2aWNlIG9uICclcyciKTsKCiNpZmRlZiBfX3NwYXJjX18KCWlmICghZm9yY2UgJiYgdmVyc2lvbiA9PSAwKSB7CgkJLyogRG9uJ3Qgb3ZlcndyaXRlIHBhcnRpdGlvbiB0YWJsZSB1bmxlc3MgZm9yY2VkICovCgkJdW5zaWduZWQgY2hhciAqYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgkJdW5zaWduZWQgc2hvcnQgKnEsIHN1bTsKCgkJaWYgKHJlYWQoREVWLCBidWZmZXIsIDUxMikgIT0gNTEyKQoJCQlkaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCQlpZiAoYnVmZmVyWzUwOF0gPT0gMHhEQSAmJiBidWZmZXJbNTA5XSA9PSAweEJFKSB7CgkJCXEgPSAodW5zaWduZWQgc2hvcnQgKikgKGJ1ZmZlciArIDUxMCk7CgkJCWZvciAoc3VtID0gMDsgcSA+PSAodW5zaWduZWQgc2hvcnQgKikgYnVmZmVyOykKCQkJCXN1bSBePSAqcS0tOwoJCQlpZiAoIXN1bSkgewoJCQkJZXJyb3JfbXNnKCJEZXZpY2UgJyVzJyBjb250YWlucyBhIHZhbGlkIFN1biBkaXNrbGFiZWwuXG4iCiJUaGlzIHByb2JhYmx5IG1lYW5zIGNyZWF0aW5nIHYwIHN3YXAgd291bGQgZGVzdHJveSB5b3VyIHBhcnRpdGlvbiB0YWJsZVxuIgoiTm8gc3dhcCBjcmVhdGVkLiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIHN3YXAgdjAgb24gdGhhdCBkZXZpY2UsIHVzZVxuIgoidGhlIC1mIG9wdGlvbiB0byBmb3JjZSBpdC5cbiIsIGRldmljZV9uYW1lKTsKCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CgkJCX0KCQl9Cgl9CiNlbmRpZgoKCWlmICh2ZXJzaW9uID09IDAgfHwgY2hlY2spCgkJY2hlY2tfYmxvY2tzKCk7CglpZiAodmVyc2lvbiA9PSAwICYmICFiaXRfdGVzdF9hbmRfY2xlYXIoc2lnbmF0dXJlX3BhZ2UsIDApKQoJCWRpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJaWYgKHZlcnNpb24gPT0gMSkgewoJCXAtPnZlcnNpb24gPSB2ZXJzaW9uOwoJCXAtPmxhc3RfcGFnZSA9IFBBR0VTIC0gMTsKCQlwLT5ucl9iYWRwYWdlcyA9IGJhZHBhZ2VzOwoJfQoKCWdvb2RwYWdlcyA9IFBBR0VTIC0gYmFkcGFnZXMgLSAxOwoJaWYgKGdvb2RwYWdlcyA8PSAwKQoJCWRpZSgiVW5hYmxlIHRvIHNldCB1cCBzd2FwLXNwYWNlOiB1bnJlYWRhYmxlIik7CglwcmludGYoIlNldHRpbmcgdXAgc3dhcHNwYWNlIHZlcnNpb24gJWQsIHNpemUgPSAlbGQgYnl0ZXNcbiIsCgkJICAgdmVyc2lvbiwgKGxvbmcpIChnb29kcGFnZXMgKiBwYWdlc2l6ZSkpOwoJd3JpdGVfc2lnbmF0dXJlKCh2ZXJzaW9uID09IDApID8gIlNXQVAtU1BBQ0UiIDogIlNXQVBTUEFDRTIiKTsKCglvZmZzZXQgPSAoKHZlcnNpb24gPT0gMCkgPyAwIDogMTAyNCk7CglpZiAobHNlZWsoREVWLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpCgkJZGllKCJ1bmFibGUgdG8gcmV3aW5kIHN3YXAtZGV2aWNlIik7CglpZiAod3JpdGUoREVWLCAoY2hhciAqKSBzaWduYXR1cmVfcGFnZSArIG9mZnNldCwgcGFnZXNpemUgLSBvZmZzZXQpCgkJIT0gcGFnZXNpemUgLSBvZmZzZXQpCgkJZGllKCJ1bmFibGUgdG8gd3JpdGUgc2lnbmF0dXJlIHBhZ2UiKTsKCgkvKgoJICogQSBzdWJzZXF1ZW50IHN3YXBvbigpIHdpbGwgZmFpbCBpZiB0aGUgc2lnbmF0dXJlCgkgKiBpcyBub3QgYWN0dWFsbHkgb24gZGlzay4gKFRoaXMgaXMgYSBrZXJuZWwgYnVnLikKCSAqLwoJaWYgKGZzeW5jKERFVikpCgkJZGllKCJmc3luYyBmYWlsZWQiKTsKCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K