LyoKICogZmF0LmMKICoKICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZwogKgogKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CiAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHVib290CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDxmYXQuaD4KI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KI2luY2x1ZGUgPHBhcnQuaD4KCiNpZiBkZWZpbmVkKENPTkZJR19DTURfRkFUKQoKLyoKICogQ29udmVydCBhIHN0cmluZyB0byBsb3dlcmNhc2UuCiAqLwpzdGF0aWMgdm9pZApkb3duY2FzZShjaGFyICpzdHIpCnsKCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKCQlUT0xPV0VSKCpzdHIpOwoJCXN0cisrOwoJfQp9CgpzdGF0aWMgIGJsb2NrX2Rldl9kZXNjX3QgKmN1cl9kZXYgPSBOVUxMOwpzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJ0X29mZnNldCA9IDA7CnN0YXRpYyBpbnQgY3VyX3BhcnQgPSAxOwoKI2RlZmluZSBET1NfUEFSVF9UQkxfT0ZGU0VUCTB4MWJlCiNkZWZpbmUgRE9TX1BBUlRfTUFHSUNfT0ZGU0VUCTB4MWZlCiNkZWZpbmUgRE9TX0ZTX1RZUEVfT0ZGU0VUCTB4MzYKCmludCBkaXNrX3JlYWQgKF9fdTMyIHN0YXJ0YmxvY2ssIF9fdTMyIGdldHNpemUsIF9fdTggKiBidWZwdHIpCnsKCXN0YXJ0YmxvY2sgKz0gcGFydF9vZmZzZXQ7CglpZiAoY3VyX2RldiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCWlmIChjdXJfZGV2LT5ibG9ja19yZWFkKSB7CgkJcmV0dXJuIGN1cl9kZXYtPmJsb2NrX3JlYWQgKGN1cl9kZXYtPmRldgoJCQksIHN0YXJ0YmxvY2ssIGdldHNpemUsICh1bnNpZ25lZCBsb25nICopYnVmcHRyKTsKCX0KCXJldHVybiAtMTsKfQoKCmludApmYXRfcmVnaXN0ZXJfZGV2aWNlKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydF9ubykKewoJdW5zaWduZWQgY2hhciBidWZmZXJbU0VDVE9SX1NJWkVdOwoJZGlza19wYXJ0aXRpb25fdCBpbmZvOwoKCWlmICghZGV2X2Rlc2MtPmJsb2NrX3JlYWQpCgkJcmV0dXJuIC0xOwoJY3VyX2RldiA9IGRldl9kZXNjOwoJLyogY2hlY2sgaWYgd2UgaGF2ZSBhIE1CUiAob24gZmxvcHBpZXMgd2UgaGF2ZSBvbmx5IGEgUEJSKSAqLwoJaWYgKGRldl9kZXNjLT5ibG9ja19yZWFkIChkZXZfZGVzYy0+ZGV2LCAwLCAxLCAodWxvbmcgKikgYnVmZmVyKSAhPSAxKSB7CgkJcHJpbnRmICgiKiogQ2FuJ3QgcmVhZCBmcm9tIGRldmljZSAlZCAqKlxuIiwgZGV2X2Rlc2MtPmRldik7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKGJ1ZmZlcltET1NfUEFSVF9NQUdJQ19PRkZTRVRdICE9IDB4NTUgfHwKCQlidWZmZXJbRE9TX1BBUlRfTUFHSUNfT0ZGU0VUICsgMV0gIT0gMHhhYSkgewoJCS8qIG5vIHNpZ25hdHVyZSBmb3VuZCAqLwoJCXJldHVybiAtMTsKCX0KI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApCgkvKiBGaXJzdCB3ZSBhc3N1bWUsIHRoZXJlIGlzIGEgTUJSICovCglpZiAoIWdldF9wYXJ0aXRpb25faW5mbyAoZGV2X2Rlc2MsIHBhcnRfbm8sICZpbmZvKSkgewoJCXBhcnRfb2Zmc2V0ID0gaW5mby5zdGFydDsKCQljdXJfcGFydCA9IHBhcnRfbm87Cgl9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyICopJmJ1ZmZlcltET1NfRlNfVFlQRV9PRkZTRVRdLCAiRkFUIiwgMykpIHsKCQkvKiBvaywgd2UgYXNzdW1lIHdlIGFyZSBvbiBhIFBCUiBvbmx5ICovCgkJY3VyX3BhcnQgPSAxOwoJCXBhcnRfb2Zmc2V0ID0gMDsKCX0gZWxzZSB7CgkJcHJpbnRmICgiKiogUGFydGl0aW9uICVkIG5vdCB2YWxpZCBvbiBkZXZpY2UgJWQgKipcbiIsCgkJCQlwYXJ0X25vLCBkZXZfZGVzYy0+ZGV2KTsKCQlyZXR1cm4gLTE7Cgl9CgojZWxzZQoJaWYgKCFzdHJuY21wKChjaGFyICopJmJ1ZmZlcltET1NfRlNfVFlQRV9PRkZTRVRdLCJGQVQiLDMpKSB7CgkJLyogb2ssIHdlIGFzc3VtZSB3ZSBhcmUgb24gYSBQQlIgb25seSAqLwoJCWN1cl9wYXJ0ID0gMTsKCQlwYXJ0X29mZnNldCA9IDA7CgkJaW5mby5zdGFydCA9IHBhcnRfb2Zmc2V0OwoJfSBlbHNlIHsKCQkvKiBGSVhNRSB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlCgkJICogcGFydGl0aW9uIHdoZXJlIHRoZSBET1MgRlMgcmVzaWRlcy4gVGhpcyBjYW4gYmUgZG9uZQoJCSAqIGJ5IHVzaW5nIHRoZSBnZXRfcGFydGl0aW9uX2luZm8gcm91dGluZS4gRm9yIHRoaXMKCQkgKiBwdXJwb3NlIHRoZSBsaWJwYXJ0IG11c3QgYmUgaW5jbHVkZWQuCgkJICovCgkJcGFydF9vZmZzZXQgPSAzMjsKCQljdXJfcGFydCA9IDE7Cgl9CiNlbmRpZgoJcmV0dXJuIDA7Cn0KCgovKgogKiBHZXQgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBhIGRpcmVjdG9yeSBkZWxpbWl0ZXIgKCcvJyBvciAnXCcpIGluIGEgc3RyaW5nLgogKiBSZXR1cm4gaW5kZXggaW50byBzdHJpbmcgaWYgZm91bmQsIC0xIG90aGVyd2lzZS4KICovCnN0YXRpYyBpbnQKZGlyZGVsaW0oY2hhciAqc3RyKQp7CgljaGFyICpzdGFydCA9IHN0cjsKCgl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CgkJaWYgKElTRElSREVMSU0oKnN0cikpIHJldHVybiBzdHIgLSBzdGFydDsKCQlzdHIrKzsKCX0KCXJldHVybiAtMTsKfQoKCi8qCiAqIE1hdGNoIHZvbHVtZV9pbmZvIGZzX3R5cGUgc3RyaW5ncy4KICogUmV0dXJuIDAgb24gbWF0Y2gsIC0xIG90aGVyd2lzZS4KICovCnN0YXRpYyBpbnQKY29tcGFyZV9zaWduKGNoYXIgKnN0cjEsIGNoYXIgKnN0cjIpCnsKCWNoYXIgKmVuZCA9IHN0cjErU0lHTkxFTjsKCgl3aGlsZSAoc3RyMSAhPSBlbmQpIHsKCQlpZiAoKnN0cjEgIT0gKnN0cjIpIHsKCQkJcmV0dXJuIC0xOwoJCX0KCQlzdHIxKys7CgkJc3RyMisrOwoJfQoKCXJldHVybiAwOwp9CgoKLyoKICogRXh0cmFjdCB6ZXJvIHRlcm1pbmF0ZWQgc2hvcnQgbmFtZSBmcm9tIGEgZGlyZWN0b3J5IGVudHJ5LgogKi8Kc3RhdGljIHZvaWQgZ2V0X25hbWUgKGRpcl9lbnRyeSAqZGlyZW50LCBjaGFyICpzX25hbWUpCnsKCWNoYXIgKnB0cjsKCgltZW1jcHkgKHNfbmFtZSwgZGlyZW50LT5uYW1lLCA4KTsKCXNfbmFtZVs4XSA9ICdcMCc7CglwdHIgPSBzX25hbWU7Cgl3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKCQlwdHIrKzsKCWlmIChkaXJlbnQtPmV4dFswXSAmJiBkaXJlbnQtPmV4dFswXSAhPSAnICcpIHsKCQkqcHRyID0gJy4nOwoJCXB0cisrOwoJCW1lbWNweSAocHRyLCBkaXJlbnQtPmV4dCwgMyk7CgkJcHRyWzNdID0gJ1wwJzsKCQl3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKCQkJcHRyKys7Cgl9CgkqcHRyID0gJ1wwJzsKCWlmICgqc19uYW1lID09IERFTEVURURfRkxBRykKCQkqc19uYW1lID0gJ1wwJzsKCWVsc2UgaWYgKCpzX25hbWUgPT0gYVJJTkcpCgkJKnNfbmFtZSA9ICflJzsKCWRvd25jYXNlIChzX25hbWUpOwp9CgovKgogKiBHZXQgdGhlIGVudHJ5IGF0IGluZGV4ICdlbnRyeScgaW4gYSBGQVQgKDEyLzE2LzMyKSB0YWJsZS4KICogT24gZmFpbHVyZSAweDAwIGlzIHJldHVybmVkLgogKi8Kc3RhdGljIF9fdTMyCmdldF9mYXRlbnQoZnNkYXRhICpteWRhdGEsIF9fdTMyIGVudHJ5KQp7CglfX3UzMiBidWZudW07CglfX3UzMiBvZmZzZXQ7CglfX3UzMiByZXQgPSAweDAwOwoKCXN3aXRjaCAobXlkYXRhLT5mYXRzaXplKSB7CgljYXNlIDMyOgoJCWJ1Zm51bSA9IGVudHJ5IC8gRkFUMzJCVUZTSVpFOwoJCW9mZnNldCA9IGVudHJ5IC0gYnVmbnVtICogRkFUMzJCVUZTSVpFOwoJCWJyZWFrOwoJY2FzZSAxNjoKCQlidWZudW0gPSBlbnRyeSAvIEZBVDE2QlVGU0laRTsKCQlvZmZzZXQgPSBlbnRyeSAtIGJ1Zm51bSAqIEZBVDE2QlVGU0laRTsKCQlicmVhazsKCWNhc2UgMTI6CgkJYnVmbnVtID0gZW50cnkgLyBGQVQxMkJVRlNJWkU7CgkJb2Zmc2V0ID0gZW50cnkgLSBidWZudW0gKiBGQVQxMkJVRlNJWkU7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQkvKiBVbnN1cHBvcnRlZCBGQVQgc2l6ZSAqLwoJCXJldHVybiByZXQ7Cgl9CgoJLyogUmVhZCBhIG5ldyBibG9jayBvZiBGQVQgZW50cmllcyBpbnRvIHRoZSBjYWNoZS4gKi8KCWlmIChidWZudW0gIT0gbXlkYXRhLT5mYXRidWZudW0pIHsKCQlpbnQgZ2V0c2l6ZSA9IEZBVEJVRlNJWkUvRlNfQkxPQ0tfU0laRTsKCQlfX3U4ICpidWZwdHIgPSBteWRhdGEtPmZhdGJ1ZjsKCQlfX3UzMiBmYXRsZW5ndGggPSBteWRhdGEtPmZhdGxlbmd0aDsKCQlfX3UzMiBzdGFydGJsb2NrID0gYnVmbnVtICogRkFUQlVGQkxPQ0tTOwoKCQlmYXRsZW5ndGggKj0gU0VDVE9SX1NJWkU7CS8qIFdlIHdhbnQgaXQgaW4gYnl0ZXMgbm93ICovCgkJc3RhcnRibG9jayArPSBteWRhdGEtPmZhdF9zZWN0OwkvKiBPZmZzZXQgZnJvbSBzdGFydCBvZiBkaXNrICovCgoJCWlmIChnZXRzaXplID4gZmF0bGVuZ3RoKSBnZXRzaXplID0gZmF0bGVuZ3RoOwoJCWlmIChkaXNrX3JlYWQoc3RhcnRibG9jaywgZ2V0c2l6ZSwgYnVmcHRyKSA8IDApIHsKCQkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBGQVQgYmxvY2tzXG4iKTsKCQkJcmV0dXJuIHJldDsKCQl9CgkJbXlkYXRhLT5mYXRidWZudW0gPSBidWZudW07Cgl9CgoJLyogR2V0IHRoZSBhY3R1YWwgZW50cnkgZnJvbSB0aGUgdGFibGUgKi8KCXN3aXRjaCAobXlkYXRhLT5mYXRzaXplKSB7CgljYXNlIDMyOgoJCXJldCA9IEZBVDJDUFUzMigoKF9fdTMyKilteWRhdGEtPmZhdGJ1Zilbb2Zmc2V0XSk7CgkJYnJlYWs7CgljYXNlIDE2OgoJCXJldCA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2Zmc2V0XSk7CgkJYnJlYWs7CgljYXNlIDEyOiB7CgkJX191MzIgb2ZmMTYgPSAob2Zmc2V0KjMpLzQ7CgkJX191MTYgdmFsMSwgdmFsMjsKCgkJc3dpdGNoIChvZmZzZXQgJiAweDMpIHsKCQljYXNlIDA6CgkJCXJldCA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTZdKTsKCQkJcmV0ICY9IDB4ZmZmOwoJCQlicmVhazsKCQljYXNlIDE6CgkJCXZhbDEgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7CgkJCXZhbDEgJj0gMHhmMDAwOwoJCQl2YWwyID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNisxXSk7CgkJCXZhbDIgJj0gMHgwMGZmOwoJCQlyZXQgPSAodmFsMiA8PCA0KSB8ICh2YWwxID4+IDEyKTsKCQkJYnJlYWs7CgkJY2FzZSAyOgoJCQl2YWwxID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOwoJCQl2YWwxICY9IDB4ZmYwMDsKCQkJdmFsMiA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTYrMV0pOwoJCQl2YWwyICY9IDB4MDAwZjsKCQkJcmV0ID0gKHZhbDIgPDwgOCkgfCAodmFsMSA+PiA4KTsKCQkJYnJlYWs7CgkJY2FzZSAzOgoJCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7OwoJCQlyZXQgPSAocmV0ICYgMHhmZmYwKSA+PiA0OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9Cgl9CglicmVhazsKCX0KCUZBVF9EUFJJTlQoInJldDogJWQsIG9mZnNldDogJWRcbiIsIHJldCwgb2Zmc2V0KTsKCglyZXR1cm4gcmV0Owp9CgoKLyoKICogUmVhZCBhdCBtb3N0ICdzaXplJyBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgY2x1c3RlciBpbnRvICdidWZmZXInLgogKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCiAqLwpzdGF0aWMgaW50CmdldF9jbHVzdGVyKGZzZGF0YSAqbXlkYXRhLCBfX3UzMiBjbHVzdG51bSwgX191OCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCnsKCWludCBpZHggPSAwOwoJX191MzIgc3RhcnRzZWN0OwoKCWlmIChjbHVzdG51bSA+IDApIHsKCQlzdGFydHNlY3QgPSBteWRhdGEtPmRhdGFfYmVnaW4gKyBjbHVzdG51bSpteWRhdGEtPmNsdXN0X3NpemU7Cgl9IGVsc2UgewoJCXN0YXJ0c2VjdCA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0OwoJfQoKCUZBVF9EUFJJTlQoImdjIC0gY2x1c3RudW06ICVkLCBzdGFydHNlY3Q6ICVkXG4iLCBjbHVzdG51bSwgc3RhcnRzZWN0KTsKCWlmIChkaXNrX3JlYWQoc3RhcnRzZWN0LCBzaXplL0ZTX0JMT0NLX1NJWkUgLCBidWZmZXIpIDwgMCkgewoJCUZBVF9EUFJJTlQoIkVycm9yIHJlYWRpbmcgZGF0YVxuIik7CgkJcmV0dXJuIC0xOwoJfQoJaWYoc2l6ZSAlIEZTX0JMT0NLX1NJWkUpIHsKCQlfX3U4IHRtcGJ1ZltGU19CTE9DS19TSVpFXTsKCQlpZHg9IHNpemUvRlNfQkxPQ0tfU0laRTsKCQlpZiAoZGlza19yZWFkKHN0YXJ0c2VjdCArIGlkeCwgMSwgdG1wYnVmKSA8IDApIHsKCQkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlidWZmZXIgKz0gaWR4KkZTX0JMT0NLX1NJWkU7CgoJCW1lbWNweShidWZmZXIsIHRtcGJ1Ziwgc2l6ZSAlIEZTX0JMT0NLX1NJWkUpOwoJCXJldHVybiAwOwoJfQoKCXJldHVybiAwOwp9CgoKLyoKICogUmVhZCBhdCBtb3N0ICdtYXhzaXplJyBieXRlcyBmcm9tIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCAnZGVudHB0cicKICogaW50byAnYnVmZmVyJy4KICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBvbiBmYXRhbCBlcnJvcnMuCiAqLwpzdGF0aWMgbG9uZwpnZXRfY29udGVudHMoZnNkYXRhICpteWRhdGEsIGRpcl9lbnRyeSAqZGVudHB0ciwgX191OCAqYnVmZmVyLAoJICAgICB1bnNpZ25lZCBsb25nIG1heHNpemUpCnsKCXVuc2lnbmVkIGxvbmcgZmlsZXNpemUgPSBGQVQyQ1BVMzIoZGVudHB0ci0+c2l6ZSksIGdvdHNpemUgPSAwOwoJdW5zaWduZWQgaW50IGJ5dGVzcGVyY2x1c3QgPSBteWRhdGEtPmNsdXN0X3NpemUgKiBTRUNUT1JfU0laRTsKCV9fdTMyIGN1cmNsdXN0ID0gU1RBUlQoZGVudHB0cik7CglfX3UzMiBlbmRjbHVzdCwgbmV3Y2x1c3Q7Cgl1bnNpZ25lZCBsb25nIGFjdHNpemU7CgoJRkFUX0RQUklOVCgiRmlsZXNpemU6ICVsZCBieXRlc1xuIiwgZmlsZXNpemUpOwoKCWlmIChtYXhzaXplID4gMCAmJiBmaWxlc2l6ZSA+IG1heHNpemUpIGZpbGVzaXplID0gbWF4c2l6ZTsKCglGQVRfRFBSSU5UKCJSZWFkaW5nOiAlbGQgYnl0ZXNcbiIsIGZpbGVzaXplKTsKCglhY3RzaXplPWJ5dGVzcGVyY2x1c3Q7CgllbmRjbHVzdD1jdXJjbHVzdDsKCWRvIHsKCQkvKiBzZWFyY2ggZm9yIGNvbnNlY3V0aXZlIGNsdXN0ZXJzICovCgkJd2hpbGUoYWN0c2l6ZSA8IGZpbGVzaXplKSB7CgkJCW5ld2NsdXN0ID0gZ2V0X2ZhdGVudChteWRhdGEsIGVuZGNsdXN0KTsKCQkJaWYoKG5ld2NsdXN0IC0xKSE9ZW5kY2x1c3QpCgkJCQlnb3RvIGdldGl0OwoJCQlpZiAoQ0hFQ0tfQ0xVU1QobmV3Y2x1c3QsIG15ZGF0YS0+ZmF0c2l6ZSkpIHsKCQkJCUZBVF9EUFJJTlQoImN1cmNsdXN0OiAweCV4XG4iLCBuZXdjbHVzdCk7CgkJCQlGQVRfRFBSSU5UKCJJbnZhbGlkIEZBVCBlbnRyeVxuIik7CgkJCQlyZXR1cm4gZ290c2l6ZTsKCQkJfQoJCQllbmRjbHVzdD1uZXdjbHVzdDsKCQkJYWN0c2l6ZSs9IGJ5dGVzcGVyY2x1c3Q7CgkJfQoJCS8qIGFjdHNpemUgPj0gZmlsZSBzaXplICovCgkJYWN0c2l6ZSAtPSBieXRlc3BlcmNsdXN0OwoJCS8qIGdldCByZW1haW5pbmcgY2x1c3RlcnMgKi8KCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBjdXJjbHVzdCwgYnVmZmVyLCAoaW50KWFjdHNpemUpICE9IDApIHsKCQkJRkFUX0VSUk9SKCJFcnJvciByZWFkaW5nIGNsdXN0ZXJcbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCS8qIGdldCByZW1haW5pbmcgYnl0ZXMgKi8KCQlnb3RzaXplICs9IChpbnQpYWN0c2l6ZTsKCQlmaWxlc2l6ZSAtPSBhY3RzaXplOwoJCWJ1ZmZlciArPSBhY3RzaXplOwoJCWFjdHNpemU9IGZpbGVzaXplOwoJCWlmIChnZXRfY2x1c3RlcihteWRhdGEsIGVuZGNsdXN0LCBidWZmZXIsIChpbnQpYWN0c2l6ZSkgIT0gMCkgewoJCQlGQVRfRVJST1IoIkVycm9yIHJlYWRpbmcgY2x1c3RlclxuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJZ290c2l6ZSs9YWN0c2l6ZTsKCQlyZXR1cm4gZ290c2l6ZTsKZ2V0aXQ6CgkJaWYgKGdldF9jbHVzdGVyKG15ZGF0YSwgY3VyY2x1c3QsIGJ1ZmZlciwgKGludClhY3RzaXplKSAhPSAwKSB7CgkJCUZBVF9FUlJPUigiRXJyb3IgcmVhZGluZyBjbHVzdGVyXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlnb3RzaXplICs9IChpbnQpYWN0c2l6ZTsKCQlmaWxlc2l6ZSAtPSBhY3RzaXplOwoJCWJ1ZmZlciArPSBhY3RzaXplOwoJCWN1cmNsdXN0ID0gZ2V0X2ZhdGVudChteWRhdGEsIGVuZGNsdXN0KTsKCQlpZiAoQ0hFQ0tfQ0xVU1QoY3VyY2x1c3QsIG15ZGF0YS0+ZmF0c2l6ZSkpIHsKCQkJRkFUX0RQUklOVCgiY3VyY2x1c3Q6IDB4JXhcbiIsIGN1cmNsdXN0KTsKCQkJRkFUX0VSUk9SKCJJbnZhbGlkIEZBVCBlbnRyeVxuIik7CgkJCXJldHVybiBnb3RzaXplOwoJCX0KCQlhY3RzaXplPWJ5dGVzcGVyY2x1c3Q7CgkJZW5kY2x1c3Q9Y3VyY2x1c3Q7Cgl9IHdoaWxlICgxKTsKfQoKCiNpZmRlZiBDT05GSUdfU1VQUE9SVF9WRkFUCi8qCiAqIEV4dHJhY3QgdGhlIGZpbGUgbmFtZSBpbmZvcm1hdGlvbiBmcm9tICdzbG90cHRyJyBpbnRvICdsX25hbWUnLAogKiBzdGFydGluZyBhdCBsX25hbWVbKmlkeF0uCiAqIFJldHVybiAxIGlmIHRlcm1pbmF0b3IgKHplcm8gYnl0ZSkgaXMgZm91bmQsIDAgb3RoZXJ3aXNlLgogKi8Kc3RhdGljIGludApzbG90MnN0cihkaXJfc2xvdCAqc2xvdHB0ciwgY2hhciAqbF9uYW1lLCBpbnQgKmlkeCkKewoJaW50IGo7CgoJZm9yIChqID0gMDsgaiA8PSA4OyBqICs9IDIpIHsKCQlsX25hbWVbKmlkeF0gPSBzbG90cHRyLT5uYW1lMF80W2pdOwoJCWlmIChsX25hbWVbKmlkeF0gPT0gMHgwMCkgcmV0dXJuIDE7CgkJKCppZHgpKys7Cgl9Cglmb3IgKGogPSAwOyBqIDw9IDEwOyBqICs9IDIpIHsKCQlsX25hbWVbKmlkeF0gPSBzbG90cHRyLT5uYW1lNV8xMFtqXTsKCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOwoJCSgqaWR4KSsrOwoJfQoJZm9yIChqID0gMDsgaiA8PSAyOyBqICs9IDIpIHsKCQlsX25hbWVbKmlkeF0gPSBzbG90cHRyLT5uYW1lMTFfMTJbal07CgkJaWYgKGxfbmFtZVsqaWR4XSA9PSAweDAwKSByZXR1cm4gMTsKCQkoKmlkeCkrKzsKCX0KCglyZXR1cm4gMDsKfQoKCi8qCiAqIEV4dHJhY3QgdGhlIGZ1bGwgbG9uZyBmaWxlbmFtZSBzdGFydGluZyBhdCAncmV0ZGVudCcgKHdoaWNoIGlzIHJlYWxseQogKiBhIHNsb3QpIGludG8gJ2xfbmFtZScuIElmIHN1Y2Nlc3NmdWwgYWxzbyBjb3B5IHRoZSByZWFsIGRpcmVjdG9yeSBlbnRyeQogKiBpbnRvICdyZXRkZW50JwogKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCiAqLwpfX3U4CSBnZXRfdmZhdG5hbWVfYmxvY2tbTUFYX0NMVVNUU0laRV07CnN0YXRpYyBpbnQKZ2V0X3ZmYXRuYW1lKGZzZGF0YSAqbXlkYXRhLCBpbnQgY3VyY2x1c3QsIF9fdTggKmNsdXN0ZXIsCgkgICAgIGRpcl9lbnRyeSAqcmV0ZGVudCwgY2hhciAqbF9uYW1lKQp7CglkaXJfZW50cnkgKnJlYWxkZW50OwoJZGlyX3Nsb3QgICpzbG90cHRyID0gKGRpcl9zbG90KikgcmV0ZGVudDsKCV9fdTgJICAqbmV4dGNsdXN0ID0gY2x1c3RlciArIG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIFNFQ1RPUl9TSVpFOwoJX191OAkgICBjb3VudGVyID0gKHNsb3RwdHItPmlkICYgfkxBU1RfTE9OR19FTlRSWV9NQVNLKSAmIDB4ZmY7CglpbnQgaWR4ID0gMDsKCgl3aGlsZSAoKF9fdTgqKXNsb3RwdHIgPCBuZXh0Y2x1c3QpIHsKCQlpZiAoY291bnRlciA9PSAwKSBicmVhazsKCQlpZiAoKChzbG90cHRyLT5pZCAmIH5MQVNUX0xPTkdfRU5UUllfTUFTSykgJiAweGZmKSAhPSBjb3VudGVyKQoJCQlyZXR1cm4gLTE7CgkJc2xvdHB0cisrOwoJCWNvdW50ZXItLTsKCX0KCglpZiAoKF9fdTgqKXNsb3RwdHIgPj0gbmV4dGNsdXN0KSB7CgkJZGlyX3Nsb3QgKnNsb3RwdHIyOwoKCQlzbG90cHRyLS07CgkJY3VyY2x1c3QgPSBnZXRfZmF0ZW50KG15ZGF0YSwgY3VyY2x1c3QpOwoJCWlmIChDSEVDS19DTFVTVChjdXJjbHVzdCwgbXlkYXRhLT5mYXRzaXplKSkgewoJCQlGQVRfRFBSSU5UKCJjdXJjbHVzdDogMHgleFxuIiwgY3VyY2x1c3QpOwoJCQlGQVRfRVJST1IoIkludmFsaWQgRkFUIGVudHJ5XG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBjdXJjbHVzdCwgZ2V0X3ZmYXRuYW1lX2Jsb2NrLAoJCQkJbXlkYXRhLT5jbHVzdF9zaXplICogU0VDVE9SX1NJWkUpICE9IDApIHsKCQkJRkFUX0RQUklOVCgiRXJyb3I6IHJlYWRpbmcgZGlyZWN0b3J5IGJsb2NrXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlzbG90cHRyMiA9IChkaXJfc2xvdCopIGdldF92ZmF0bmFtZV9ibG9jazsKCQl3aGlsZSAoc2xvdHB0cjItPmlkID4gMHgwMSkgewoJCQlzbG90cHRyMisrOwoJCX0KCQkvKiBTYXZlIHRoZSByZWFsIGRpcmVjdG9yeSBlbnRyeSAqLwoJCXJlYWxkZW50ID0gKGRpcl9lbnRyeSopc2xvdHB0cjIgKyAxOwoJCXdoaWxlICgoX191OCopc2xvdHB0cjIgPj0gZ2V0X3ZmYXRuYW1lX2Jsb2NrKSB7CgkJCXNsb3Qyc3RyKHNsb3RwdHIyLCBsX25hbWUsICZpZHgpOwoJCQlzbG90cHRyMi0tOwoJCX0KCX0gZWxzZSB7CgkJLyogU2F2ZSB0aGUgcmVhbCBkaXJlY3RvcnkgZW50cnkgKi8KCQlyZWFsZGVudCA9IChkaXJfZW50cnkqKXNsb3RwdHI7Cgl9CgoJZG8gewoJCXNsb3RwdHItLTsKCQlpZiAoc2xvdDJzdHIoc2xvdHB0ciwgbF9uYW1lLCAmaWR4KSkgYnJlYWs7Cgl9IHdoaWxlICghKHNsb3RwdHItPmlkICYgTEFTVF9MT05HX0VOVFJZX01BU0spKTsKCglsX25hbWVbaWR4XSA9ICdcMCc7CglpZiAoKmxfbmFtZSA9PSBERUxFVEVEX0ZMQUcpICpsX25hbWUgPSAnXDAnOwoJZWxzZSBpZiAoKmxfbmFtZSA9PSBhUklORykgKmxfbmFtZSA9ICflJzsKCWRvd25jYXNlKGxfbmFtZSk7CgoJLyogUmV0dXJuIHRoZSByZWFsIGRpcmVjdG9yeSBlbnRyeSAqLwoJbWVtY3B5KHJldGRlbnQsIHJlYWxkZW50LCBzaXplb2YoZGlyX2VudHJ5KSk7CgoJcmV0dXJuIDA7Cn0KCgovKiBDYWxjdWxhdGUgc2hvcnQgbmFtZSBjaGVja3N1bSAqLwpzdGF0aWMgX191OApta2Nrc3VtKGNvbnN0IGNoYXIgKnN0cikKewoJaW50IGk7CglfX3U4IHJldCA9IDA7CgoJZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKCQlyZXQgPSAoKChyZXQmMSk8PDcpfCgocmV0JjB4ZmUpPj4xKSkgKyBzdHJbaV07Cgl9CgoJcmV0dXJuIHJldDsKfQojZW5kaWYKCgovKgogKiBHZXQgdGhlIGRpcmVjdG9yeSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggJ2ZpbGVuYW1lJyBmcm9tIHRoZSBkaXJlY3RvcnkKICogc3RhcnRpbmcgYXQgJ3N0YXJ0c2VjdCcKICovCl9fdTggZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrW01BWF9DTFVTVFNJWkVdOwpzdGF0aWMgZGlyX2VudHJ5ICpnZXRfZGVudGZyb21kaXIgKGZzZGF0YSAqIG15ZGF0YSwgaW50IHN0YXJ0c2VjdCwKCQkJCSAgIGNoYXIgKmZpbGVuYW1lLCBkaXJfZW50cnkgKiByZXRkZW50LAoJCQkJICAgaW50IGRvbHMpCnsKICAgIF9fdTE2IHByZXZja3N1bSA9IDB4ZmZmZjsKICAgIF9fdTMyIGN1cmNsdXN0ID0gU1RBUlQgKHJldGRlbnQpOwogICAgaW50IGZpbGVzID0gMCwgZGlycyA9IDA7CgogICAgRkFUX0RQUklOVCAoImdldF9kZW50ZnJvbWRpcjogJXNcbiIsIGZpbGVuYW1lKTsKICAgIHdoaWxlICgxKSB7CglkaXJfZW50cnkgKmRlbnRwdHI7CglpbnQgaTsKCglpZiAoZ2V0X2NsdXN0ZXIgKG15ZGF0YSwgY3VyY2x1c3QsIGdldF9kZW50ZnJvbWRpcl9ibG9jaywKCQkgbXlkYXRhLT5jbHVzdF9zaXplICogU0VDVE9SX1NJWkUpICE9IDApIHsKCSAgICBGQVRfRFBSSU5UICgiRXJyb3I6IHJlYWRpbmcgZGlyZWN0b3J5IGJsb2NrXG4iKTsKCSAgICByZXR1cm4gTlVMTDsKCX0KCWRlbnRwdHIgPSAoZGlyX2VudHJ5ICopIGdldF9kZW50ZnJvbWRpcl9ibG9jazsKCWZvciAoaSA9IDA7IGkgPCBESVJFTlRTUEVSQ0xVU1Q7IGkrKykgewoJICAgIGNoYXIgc19uYW1lWzE0XSwgbF9uYW1lWzI1Nl07CgoJICAgIGxfbmFtZVswXSA9ICdcMCc7CgkgICAgaWYgKGRlbnRwdHItPm5hbWVbMF0gPT0gREVMRVRFRF9GTEFHKSB7CgkJICAgIGRlbnRwdHIrKzsKCQkgICAgY29udGludWU7CgkgICAgfQoJICAgIGlmICgoZGVudHB0ci0+YXR0ciAmIEFUVFJfVk9MVU1FKSkgewojaWZkZWYgQ09ORklHX1NVUFBPUlRfVkZBVAoJCWlmICgoZGVudHB0ci0+YXR0ciAmIEFUVFJfVkZBVCkgJiYKCQkgICAgKGRlbnRwdHItPm5hbWVbMF0gJiBMQVNUX0xPTkdfRU5UUllfTUFTSykpIHsKCQkgICAgcHJldmNrc3VtID0gKChkaXJfc2xvdCAqKSBkZW50cHRyKQoJCQkgICAgLT5hbGlhc19jaGVja3N1bTsKCQkgICAgZ2V0X3ZmYXRuYW1lIChteWRhdGEsIGN1cmNsdXN0LCBnZXRfZGVudGZyb21kaXJfYmxvY2ssCgkJCQkgIGRlbnRwdHIsIGxfbmFtZSk7CgkJICAgIGlmIChkb2xzKSB7CgkJCWludCBpc2RpciA9IChkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpOwoJCQljaGFyIGRpcmM7CgkJCWludCBkb2l0ID0gMDsKCgkJCWlmIChpc2RpcikgewoJCQkgICAgZGlycysrOwoJCQkgICAgZGlyYyA9ICcvJzsKCQkJICAgIGRvaXQgPSAxOwoJCQl9IGVsc2UgewoJCQkgICAgZGlyYyA9ICcgJzsKCQkJICAgIGlmIChsX25hbWVbMF0gIT0gMCkgewoJCQkJZmlsZXMrKzsKCQkJCWRvaXQgPSAxOwoJCQkgICAgfQoJCQl9CgkJCWlmIChkb2l0KSB7CgkJCSAgICBpZiAoZGlyYyA9PSAnICcpIHsKCQkJCXByaW50ZiAoIiAlOGxkICAgJXMlY1xuIiwKCQkJCQkobG9uZykgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwKCQkJCQlsX25hbWUsIGRpcmMpOwoJCQkgICAgfSBlbHNlIHsKCQkJCXByaW50ZiAoIiAgICAgICAgICAgICVzJWNcbiIsIGxfbmFtZSwgZGlyYyk7CgkJCSAgICB9CgkJCX0KCQkJZGVudHB0cisrOwoJCQljb250aW51ZTsKCQkgICAgfQoJCSAgICBGQVRfRFBSSU5UICgidmZhdG5hbWU6IHwlc3xcbiIsIGxfbmFtZSk7CgkJfSBlbHNlCiNlbmRpZgoJCXsKCQkgICAgLyogVm9sdW1lIGxhYmVsIG9yIFZGQVQgZW50cnkgKi8KCQkgICAgZGVudHB0cisrOwoJCSAgICBjb250aW51ZTsKCQl9CgkgICAgfQoJICAgIGlmIChkZW50cHRyLT5uYW1lWzBdID09IDApIHsKCQlpZiAoZG9scykgewoJCSAgICBwcmludGYgKCJcbiVkIGZpbGUocyksICVkIGRpcihzKVxuXG4iLCBmaWxlcywgZGlycyk7CgkJfQoJCUZBVF9EUFJJTlQgKCJEZW50bmFtZSA9PSBOVUxMIC0gJWRcbiIsIGkpOwoJCXJldHVybiBOVUxMOwoJICAgIH0KI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKCSAgICBpZiAoZG9scyAmJiBta2Nrc3VtIChkZW50cHRyLT5uYW1lKSA9PSBwcmV2Y2tzdW0pIHsKCQlkZW50cHRyKys7CgkJY29udGludWU7CgkgICAgfQojZW5kaWYKCSAgICBnZXRfbmFtZSAoZGVudHB0ciwgc19uYW1lKTsKCSAgICBpZiAoZG9scykgewoJCWludCBpc2RpciA9IChkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpOwoJCWNoYXIgZGlyYzsKCQlpbnQgZG9pdCA9IDA7CgoJCWlmIChpc2RpcikgewoJCSAgICBkaXJzKys7CgkJICAgIGRpcmMgPSAnLyc7CgkJICAgIGRvaXQgPSAxOwoJCX0gZWxzZSB7CgkJICAgIGRpcmMgPSAnICc7CgkJICAgIGlmIChzX25hbWVbMF0gIT0gMCkgewoJCQlmaWxlcysrOwoJCQlkb2l0ID0gMTsKCQkgICAgfQoJCX0KCQlpZiAoZG9pdCkgewoJCSAgICBpZiAoZGlyYyA9PSAnICcpIHsKCQkJcHJpbnRmICgiICU4bGQgICAlcyVjXG4iLAoJCQkJKGxvbmcpIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIHNfbmFtZSwKCQkJCWRpcmMpOwoJCSAgICB9IGVsc2UgewoJCQlwcmludGYgKCIgICAgICAgICAgICAlcyVjXG4iLCBzX25hbWUsIGRpcmMpOwoJCSAgICB9CgkJfQoJCWRlbnRwdHIrKzsKCQljb250aW51ZTsKCSAgICB9CgkgICAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsIHNfbmFtZSkgJiYgc3RyY21wIChmaWxlbmFtZSwgbF9uYW1lKSkgewoJCUZBVF9EUFJJTlQgKCJNaXNtYXRjaDogfCVzfCVzfFxuIiwgc19uYW1lLCBsX25hbWUpOwoJCWRlbnRwdHIrKzsKCQljb250aW51ZTsKCSAgICB9CgkgICAgbWVtY3B5IChyZXRkZW50LCBkZW50cHRyLCBzaXplb2YgKGRpcl9lbnRyeSkpOwoKCSAgICBGQVRfRFBSSU5UICgiRGVudE5hbWU6ICVzIiwgc19uYW1lKTsKCSAgICBGQVRfRFBSSU5UICgiLCBzdGFydDogMHgleCIsIFNUQVJUIChkZW50cHRyKSk7CgkgICAgRkFUX0RQUklOVCAoIiwgc2l6ZTogIDB4JXggJXNcbiIsCgkJCUZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksCgkJCShkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpID8gIihESVIpIiA6ICIiKTsKCgkgICAgcmV0dXJuIHJldGRlbnQ7Cgl9CgljdXJjbHVzdCA9IGdldF9mYXRlbnQgKG15ZGF0YSwgY3VyY2x1c3QpOwoJaWYgKENIRUNLX0NMVVNUKGN1cmNsdXN0LCBteWRhdGEtPmZhdHNpemUpKSB7CgkgICAgRkFUX0RQUklOVCAoImN1cmNsdXN0OiAweCV4XG4iLCBjdXJjbHVzdCk7CgkgICAgRkFUX0VSUk9SICgiSW52YWxpZCBGQVQgZW50cnlcbiIpOwoJICAgIHJldHVybiBOVUxMOwoJfQogICAgfQoKICAgIHJldHVybiBOVUxMOwp9CgoKLyoKICogUmVhZCBib290IHNlY3RvciBhbmQgdm9sdW1lIGluZm8gZnJvbSBhIEZBVCBmaWxlc3lzdGVtCiAqLwpzdGF0aWMgaW50CnJlYWRfYm9vdHNlY3RhbmR2aShib290X3NlY3RvciAqYnMsIHZvbHVtZV9pbmZvICp2b2xpbmZvLCBpbnQgKmZhdHNpemUpCnsKCV9fdTggYmxvY2tbRlNfQkxPQ0tfU0laRV07Cgl2b2x1bWVfaW5mbyAqdmlzdGFydDsKCglpZiAoZGlza19yZWFkKDAsIDEsIGJsb2NrKSA8IDApIHsKCQlGQVRfRFBSSU5UKCJFcnJvcjogcmVhZGluZyBibG9ja1xuIik7CgkJcmV0dXJuIC0xOwoJfQoKCW1lbWNweShicywgYmxvY2ssIHNpemVvZihib290X3NlY3RvcikpOwoJYnMtPnJlc2VydmVkCT0gRkFUMkNQVTE2KGJzLT5yZXNlcnZlZCk7Cglicy0+ZmF0X2xlbmd0aAk9IEZBVDJDUFUxNihicy0+ZmF0X2xlbmd0aCk7Cglicy0+c2Vjc190cmFjawk9IEZBVDJDUFUxNihicy0+c2Vjc190cmFjayk7Cglicy0+aGVhZHMJPSBGQVQyQ1BVMTYoYnMtPmhlYWRzKTsKI2lmIDAgLyogVU5VU0VEICovCglicy0+aGlkZGVuCT0gRkFUMkNQVTMyKGJzLT5oaWRkZW4pOwojZW5kaWYKCWJzLT50b3RhbF9zZWN0CT0gRkFUMkNQVTMyKGJzLT50b3RhbF9zZWN0KTsKCgkvKiBGQVQzMiBlbnRyaWVzICovCglpZiAoYnMtPmZhdF9sZW5ndGggPT0gMCkgewoJCS8qIEFzc3VtZSBGQVQzMiAqLwoJCWJzLT5mYXQzMl9sZW5ndGggPSBGQVQyQ1BVMzIoYnMtPmZhdDMyX2xlbmd0aCk7CgkJYnMtPmZsYWdzCSA9IEZBVDJDUFUxNihicy0+ZmxhZ3MpOwoJCWJzLT5yb290X2NsdXN0ZXIgPSBGQVQyQ1BVMzIoYnMtPnJvb3RfY2x1c3Rlcik7CgkJYnMtPmluZm9fc2VjdG9yICA9IEZBVDJDUFUxNihicy0+aW5mb19zZWN0b3IpOwoJCWJzLT5iYWNrdXBfYm9vdCAgPSBGQVQyQ1BVMTYoYnMtPmJhY2t1cF9ib290KTsKCQl2aXN0YXJ0ID0gKHZvbHVtZV9pbmZvKikgKGJsb2NrICsgc2l6ZW9mKGJvb3Rfc2VjdG9yKSk7CgkJKmZhdHNpemUgPSAzMjsKCX0gZWxzZSB7CgkJdmlzdGFydCA9ICh2b2x1bWVfaW5mbyopICYoYnMtPmZhdDMyX2xlbmd0aCk7CgkJKmZhdHNpemUgPSAwOwoJfQoJbWVtY3B5KHZvbGluZm8sIHZpc3RhcnQsIHNpemVvZih2b2x1bWVfaW5mbykpOwoKCS8qIFRlcm1pbmF0ZSBmc190eXBlIHN0cmluZy4gV3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdmlzdGFydAoJICAgaXMgb2sgLSBpdCdzIGp1c3QgdGhlIGJ1ZmZlci4gKi8KCXZpc3RhcnQtPmZzX3R5cGVbOF0gPSAnXDAnOwoKCWlmICgqZmF0c2l6ZSA9PSAzMikgewoJCWlmIChjb21wYXJlX3NpZ24oRkFUMzJfU0lHTiwgdmlzdGFydC0+ZnNfdHlwZSkgPT0gMCkgewoJCQlyZXR1cm4gMDsKCQl9Cgl9IGVsc2UgewoJCWlmIChjb21wYXJlX3NpZ24oRkFUMTJfU0lHTiwgdmlzdGFydC0+ZnNfdHlwZSkgPT0gMCkgewoJCQkqZmF0c2l6ZSA9IDEyOwoJCQlyZXR1cm4gMDsKCQl9CgkJaWYgKGNvbXBhcmVfc2lnbihGQVQxNl9TSUdOLCB2aXN0YXJ0LT5mc190eXBlKSA9PSAwKSB7CgkJCSpmYXRzaXplID0gMTY7CgkJCXJldHVybiAwOwoJCX0KCX0KCglGQVRfRFBSSU5UKCJFcnJvcjogYnJva2VuIGZzX3R5cGUgc2lnblxuIik7CglyZXR1cm4gLTE7Cn0KCgpfX3U4IGRvX2ZhdF9yZWFkX2Jsb2NrW01BWF9DTFVTVFNJWkVdOyAgLyogQmxvY2sgYnVmZmVyICovCmxvbmcKZG9fZmF0X3JlYWQgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSwKCSAgICAgaW50IGRvbHMpCnsKI2lmIENPTkZJR19OSU9TIC8qIE5JT1MgQ1BVIGNhbm5vdCBhY2Nlc3MgYmlnIGF1dG9tYXRpYyBhcnJheXMgKi8KICAgIHN0YXRpYwojZW5kaWYKICAgIGNoYXIgZm5hbWVjb3B5WzIwNDhdOwogICAgYm9vdF9zZWN0b3IgYnM7CiAgICB2b2x1bWVfaW5mbyB2b2xpbmZvOwogICAgZnNkYXRhIGRhdGFibG9jazsKICAgIGZzZGF0YSAqbXlkYXRhID0gJmRhdGFibG9jazsKICAgIGRpcl9lbnRyeSAqZGVudHB0cjsKICAgIF9fdTE2IHByZXZja3N1bSA9IDB4ZmZmZjsKICAgIGNoYXIgKnN1Ym5hbWUgPSAiIjsKICAgIGludCByb290ZGlyX3NpemUsIGN1cnNlY3Q7CiAgICBpbnQgaWR4LCBpc2RpciA9IDA7CiAgICBpbnQgZmlsZXMgPSAwLCBkaXJzID0gMDsKICAgIGxvbmcgcmV0ID0gMDsKICAgIGludCBmaXJzdHRpbWU7CgogICAgaWYgKHJlYWRfYm9vdHNlY3RhbmR2aSAoJmJzLCAmdm9saW5mbywgJm15ZGF0YS0+ZmF0c2l6ZSkpIHsKCUZBVF9EUFJJTlQgKCJFcnJvcjogcmVhZGluZyBib290IHNlY3RvclxuIik7CglyZXR1cm4gLTE7CiAgICB9CiAgICBpZiAobXlkYXRhLT5mYXRzaXplID09IDMyKSB7CglteWRhdGEtPmZhdGxlbmd0aCA9IGJzLmZhdDMyX2xlbmd0aDsKICAgIH0gZWxzZSB7CglteWRhdGEtPmZhdGxlbmd0aCA9IGJzLmZhdF9sZW5ndGg7CiAgICB9CiAgICBteWRhdGEtPmZhdF9zZWN0ID0gYnMucmVzZXJ2ZWQ7CiAgICBjdXJzZWN0ID0gbXlkYXRhLT5yb290ZGlyX3NlY3QKCSAgICA9IG15ZGF0YS0+ZmF0X3NlY3QgKyBteWRhdGEtPmZhdGxlbmd0aCAqIGJzLmZhdHM7CiAgICBteWRhdGEtPmNsdXN0X3NpemUgPSBicy5jbHVzdGVyX3NpemU7CiAgICBpZiAobXlkYXRhLT5mYXRzaXplID09IDMyKSB7Cglyb290ZGlyX3NpemUgPSBteWRhdGEtPmNsdXN0X3NpemU7CglteWRhdGEtPmRhdGFfYmVnaW4gPSBteWRhdGEtPnJvb3RkaXJfc2VjdCAgIC8qICsgcm9vdGRpcl9zaXplICovCgkJLSAobXlkYXRhLT5jbHVzdF9zaXplICogMik7CiAgICB9IGVsc2UgewoJcm9vdGRpcl9zaXplID0gKChicy5kaXJfZW50cmllc1sxXSAqIChpbnQpIDI1NiArIGJzLmRpcl9lbnRyaWVzWzBdKQoJCQkqIHNpemVvZiAoZGlyX2VudHJ5KSkgLyBTRUNUT1JfU0laRTsKCW15ZGF0YS0+ZGF0YV9iZWdpbiA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0ICsgcm9vdGRpcl9zaXplCgkJLSAobXlkYXRhLT5jbHVzdF9zaXplICogMik7CiAgICB9CiAgICBteWRhdGEtPmZhdGJ1Zm51bSA9IC0xOwoKICAgIEZBVF9EUFJJTlQgKCJGQVQlZCwgZmF0bGVuZ3RoOiAlZFxuIiwgbXlkYXRhLT5mYXRzaXplLAoJCW15ZGF0YS0+ZmF0bGVuZ3RoKTsKICAgIEZBVF9EUFJJTlQgKCJSb290ZGlyIGJlZ2lucyBhdCBzZWN0b3I6ICVkLCBvZmZzZXQ6ICV4LCBzaXplOiAlZFxuIgoJCSJEYXRhIGJlZ2lucyBhdDogJWRcbiIsCgkJbXlkYXRhLT5yb290ZGlyX3NlY3QsIG15ZGF0YS0+cm9vdGRpcl9zZWN0ICogU0VDVE9SX1NJWkUsCgkJcm9vdGRpcl9zaXplLCBteWRhdGEtPmRhdGFfYmVnaW4pOwogICAgRkFUX0RQUklOVCAoIkNsdXN0ZXIgc2l6ZTogJWRcbiIsIG15ZGF0YS0+Y2x1c3Rfc2l6ZSk7CgogICAgLyogImN3ZCIgaXMgYWx3YXlzIHRoZSByb290Li4uICovCiAgICB3aGlsZSAoSVNESVJERUxJTSAoKmZpbGVuYW1lKSkKCWZpbGVuYW1lKys7CiAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgZmlsZW5hbWUgYW5kIGNvbnZlcnQgaXQgdG8gbG93ZXJjYXNlICovCiAgICBzdHJjcHkgKGZuYW1lY29weSwgZmlsZW5hbWUpOwogICAgZG93bmNhc2UgKGZuYW1lY29weSk7CiAgICBpZiAoKmZuYW1lY29weSA9PSAnXDAnKSB7CglpZiAoIWRvbHMpCgkgICAgcmV0dXJuIC0xOwoJZG9scyA9IExTX1JPT1Q7CiAgICB9IGVsc2UgaWYgKChpZHggPSBkaXJkZWxpbSAoZm5hbWVjb3B5KSkgPj0gMCkgewoJaXNkaXIgPSAxOwoJZm5hbWVjb3B5W2lkeF0gPSAnXDAnOwoJc3VibmFtZSA9IGZuYW1lY29weSArIGlkeCArIDE7CgkvKiBIYW5kbGUgbXVsdGlwbGUgZGVsaW1pdGVycyAqLwoJd2hpbGUgKElTRElSREVMSU0gKCpzdWJuYW1lKSkKCSAgICBzdWJuYW1lKys7CiAgICB9IGVsc2UgaWYgKGRvbHMpIHsKCWlzZGlyID0gMTsKICAgIH0KCiAgICB3aGlsZSAoMSkgewoJaW50IGk7CgoJaWYgKGRpc2tfcmVhZCAoY3Vyc2VjdCwgbXlkYXRhLT5jbHVzdF9zaXplLCBkb19mYXRfcmVhZF9ibG9jaykgPCAwKSB7CgkgICAgRkFUX0RQUklOVCAoIkVycm9yOiByZWFkaW5nIHJvb3RkaXIgYmxvY2tcbiIpOwoJICAgIHJldHVybiAtMTsKCX0KCWRlbnRwdHIgPSAoZGlyX2VudHJ5ICopIGRvX2ZhdF9yZWFkX2Jsb2NrOwoJZm9yIChpID0gMDsgaSA8IERJUkVOVFNQRVJCTE9DSzsgaSsrKSB7CgkgICAgY2hhciBzX25hbWVbMTRdLCBsX25hbWVbMjU2XTsKCgkgICAgbF9uYW1lWzBdID0gJ1wwJzsKCSAgICBpZiAoKGRlbnRwdHItPmF0dHIgJiBBVFRSX1ZPTFVNRSkpIHsKI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKCQlpZiAoKGRlbnRwdHItPmF0dHIgJiBBVFRSX1ZGQVQpICYmCgkJICAgIChkZW50cHRyLT5uYW1lWzBdICYgTEFTVF9MT05HX0VOVFJZX01BU0spKSB7CgkJICAgIHByZXZja3N1bSA9ICgoZGlyX3Nsb3QgKikgZGVudHB0ciktPmFsaWFzX2NoZWNrc3VtOwoJCSAgICBnZXRfdmZhdG5hbWUgKG15ZGF0YSwgMCwgZG9fZmF0X3JlYWRfYmxvY2ssIGRlbnRwdHIsIGxfbmFtZSk7CgkJICAgIGlmIChkb2xzID09IExTX1JPT1QpIHsKCQkJaW50IGlzZGlyID0gKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUik7CgkJCWNoYXIgZGlyYzsKCQkJaW50IGRvaXQgPSAwOwoKCQkJaWYgKGlzZGlyKSB7CgkJCSAgICBkaXJzKys7CgkJCSAgICBkaXJjID0gJy8nOwoJCQkgICAgZG9pdCA9IDE7CgkJCX0gZWxzZSB7CgkJCSAgICBkaXJjID0gJyAnOwoJCQkgICAgaWYgKGxfbmFtZVswXSAhPSAwKSB7CgkJCQlmaWxlcysrOwoJCQkJZG9pdCA9IDE7CgkJCSAgICB9CgkJCX0KCQkJaWYgKGRvaXQpIHsKCQkJICAgIGlmIChkaXJjID09ICcgJykgewoJCQkJcHJpbnRmICgiICU4bGQgICAlcyVjXG4iLAoJCQkJCShsb25nKSBGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLAoJCQkJCWxfbmFtZSwgZGlyYyk7CgkJCSAgICB9IGVsc2UgewoJCQkJcHJpbnRmICgiICAgICAgICAgICAgJXMlY1xuIiwgbF9uYW1lLCBkaXJjKTsKCQkJICAgIH0KCQkJfQoJCQlkZW50cHRyKys7CgkJCWNvbnRpbnVlOwoJCSAgICB9CgkJICAgIEZBVF9EUFJJTlQgKCJSb290dmZhdG5hbWU6IHwlc3xcbiIsIGxfbmFtZSk7CgkJfSBlbHNlCiNlbmRpZgoJCXsKCQkgICAgLyogVm9sdW1lIGxhYmVsIG9yIFZGQVQgZW50cnkgKi8KCQkgICAgZGVudHB0cisrOwoJCSAgICBjb250aW51ZTsKCQl9CgkgICAgfSBlbHNlIGlmIChkZW50cHRyLT5uYW1lWzBdID09IDApIHsKCQlGQVRfRFBSSU5UICgiUm9vdERlbnRuYW1lID09IE5VTEwgLSAlZFxuIiwgaSk7CgkJaWYgKGRvbHMgPT0gTFNfUk9PVCkgewoJCSAgICBwcmludGYgKCJcbiVkIGZpbGUocyksICVkIGRpcihzKVxuXG4iLCBmaWxlcywgZGlycyk7CgkJICAgIHJldHVybiAwOwoJCX0KCQlyZXR1cm4gLTE7CgkgICAgfQojaWZkZWYgQ09ORklHX1NVUFBPUlRfVkZBVAoJICAgIGVsc2UgaWYgKGRvbHMgPT0gTFNfUk9PVAoJCSAgICAgJiYgbWtja3N1bSAoZGVudHB0ci0+bmFtZSkgPT0gcHJldmNrc3VtKSB7CgkJZGVudHB0cisrOwoJCWNvbnRpbnVlOwoJICAgIH0KI2VuZGlmCgkgICAgZ2V0X25hbWUgKGRlbnRwdHIsIHNfbmFtZSk7CgkgICAgaWYgKGRvbHMgPT0gTFNfUk9PVCkgewoJCWludCBpc2RpciA9IChkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpOwoJCWNoYXIgZGlyYzsKCQlpbnQgZG9pdCA9IDA7CgoJCWlmIChpc2RpcikgewoJCSAgICBkaXJjID0gJy8nOwoJCSAgICBpZiAoc19uYW1lWzBdICE9IDApIHsKCQkJZGlycysrOwoJCQlkb2l0ID0gMTsKCQkgICAgfQoJCX0gZWxzZSB7CgkJICAgIGRpcmMgPSAnICc7CgkJICAgIGlmIChzX25hbWVbMF0gIT0gMCkgewoJCQlmaWxlcysrOwoJCQlkb2l0ID0gMTsKCQkgICAgfQoJCX0KCQlpZiAoZG9pdCkgewoJCSAgICBpZiAoZGlyYyA9PSAnICcpIHsKCQkJcHJpbnRmICgiICU4bGQgICAlcyVjXG4iLAoJCQkJKGxvbmcpIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIHNfbmFtZSwKCQkJCWRpcmMpOwoJCSAgICB9IGVsc2UgewoJCQlwcmludGYgKCIgICAgICAgICAgICAlcyVjXG4iLCBzX25hbWUsIGRpcmMpOwoJCSAgICB9CgkJfQoJCWRlbnRwdHIrKzsKCQljb250aW51ZTsKCSAgICB9CgkgICAgaWYgKHN0cmNtcCAoZm5hbWVjb3B5LCBzX25hbWUpICYmIHN0cmNtcCAoZm5hbWVjb3B5LCBsX25hbWUpKSB7CgkJRkFUX0RQUklOVCAoIlJvb3RNaXNtYXRjaDogfCVzfCVzfFxuIiwgc19uYW1lLCBsX25hbWUpOwoJCWRlbnRwdHIrKzsKCQljb250aW51ZTsKCSAgICB9CgkgICAgaWYgKGlzZGlyICYmICEoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKSkKCQlyZXR1cm4gLTE7CgoJICAgIEZBVF9EUFJJTlQgKCJSb290TmFtZTogJXMiLCBzX25hbWUpOwoJICAgIEZBVF9EUFJJTlQgKCIsIHN0YXJ0OiAweCV4IiwgU1RBUlQgKGRlbnRwdHIpKTsKCSAgICBGQVRfRFBSSU5UICgiLCBzaXplOiAgMHgleCAlc1xuIiwKCQkJRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgaXNkaXIgPyAiKERJUikiIDogIiIpOwoKCSAgICBnb3RvIHJvb3RkaXJfZG9uZTsgIC8qIFdlIGdvdCBhIG1hdGNoICovCgl9CgljdXJzZWN0Kys7CiAgICB9CiAgcm9vdGRpcl9kb25lOgoKICAgIGZpcnN0dGltZSA9IDE7CiAgICB3aGlsZSAoaXNkaXIpIHsKCWludCBzdGFydHNlY3QgPSBteWRhdGEtPmRhdGFfYmVnaW4KCQkrIFNUQVJUIChkZW50cHRyKSAqIG15ZGF0YS0+Y2x1c3Rfc2l6ZTsKCWRpcl9lbnRyeSBkZW50OwoJY2hhciAqbmV4dG5hbWUgPSBOVUxMOwoKCWRlbnQgPSAqZGVudHB0cjsKCWRlbnRwdHIgPSAmZGVudDsKCglpZHggPSBkaXJkZWxpbSAoc3VibmFtZSk7CglpZiAoaWR4ID49IDApIHsKCSAgICBzdWJuYW1lW2lkeF0gPSAnXDAnOwoJICAgIG5leHRuYW1lID0gc3VibmFtZSArIGlkeCArIDE7CgkgICAgLyogSGFuZGxlIG11bHRpcGxlIGRlbGltaXRlcnMgKi8KCSAgICB3aGlsZSAoSVNESVJERUxJTSAoKm5leHRuYW1lKSkKCQluZXh0bmFtZSsrOwoJICAgIGlmIChkb2xzICYmICpuZXh0bmFtZSA9PSAnXDAnKQoJCWZpcnN0dGltZSA9IDA7Cgl9IGVsc2UgewoJICAgIGlmIChkb2xzICYmIGZpcnN0dGltZSkgewoJCWZpcnN0dGltZSA9IDA7CgkgICAgfSBlbHNlIHsKCQlpc2RpciA9IDA7CgkgICAgfQoJfQoKCWlmIChnZXRfZGVudGZyb21kaXIgKG15ZGF0YSwgc3RhcnRzZWN0LCBzdWJuYW1lLCBkZW50cHRyLAoJCQkgICAgIGlzZGlyID8gMCA6IGRvbHMpID09IE5VTEwpIHsKCSAgICBpZiAoZG9scyAmJiAhaXNkaXIpCgkJcmV0dXJuIDA7CgkgICAgcmV0dXJuIC0xOwoJfQoKCWlmIChpZHggPj0gMCkgewoJICAgIGlmICghKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUikpCgkJcmV0dXJuIC0xOwoJICAgIHN1Ym5hbWUgPSBuZXh0bmFtZTsKCX0KICAgIH0KICAgIHJldCA9IGdldF9jb250ZW50cyAobXlkYXRhLCBkZW50cHRyLCBidWZmZXIsIG1heHNpemUpOwogICAgRkFUX0RQUklOVCAoIlNpemU6ICVkLCBnb3Q6ICVsZFxuIiwgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgcmV0KTsKCiAgICByZXR1cm4gcmV0Owp9CgoKaW50CmZpbGVfZmF0X2RldGVjdGZzKHZvaWQpCnsKCWJvb3Rfc2VjdG9yCWJzOwoJdm9sdW1lX2luZm8Jdm9saW5mbzsKCWludAkJZmF0c2l6ZTsKCWNoYXIJdm9sX2xhYmVsWzEyXTsKCglpZihjdXJfZGV2PT1OVUxMKSB7CgkJcHJpbnRmKCJObyBjdXJyZW50IGRldmljZVxuIik7CgkJcmV0dXJuIDE7Cgl9CiNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCiAgICBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgfHwgXAogICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgZGVmaW5lZChDT05GSUdfTU1DKQoJcHJpbnRmKCJJbnRlcmZhY2U6ICAiKTsKCXN3aXRjaChjdXJfZGV2LT5pZl90eXBlKSB7CgkJY2FzZSBJRl9UWVBFX0lERSA6CXByaW50ZigiSURFIik7IGJyZWFrOwoJCWNhc2UgSUZfVFlQRV9TQ1NJIDoJcHJpbnRmKCJTQ1NJIik7IGJyZWFrOwoJCWNhc2UgSUZfVFlQRV9BVEFQSSA6CXByaW50ZigiQVRBUEkiKTsgYnJlYWs7CgkJY2FzZSBJRl9UWVBFX1VTQiA6CXByaW50ZigiVVNCIik7IGJyZWFrOwoJCWNhc2UgSUZfVFlQRV9ET0MgOglwcmludGYoIkRPQyIpOyBicmVhazsKCQljYXNlIElGX1RZUEVfTU1DIDoJcHJpbnRmKCJNTUMiKTsgYnJlYWs7CgkJZGVmYXVsdCA6CQlwcmludGYoIlVua25vd24iKTsKCX0KCXByaW50ZigiXG4gIERldmljZSAlZDogIixjdXJfZGV2LT5kZXYpOwoJZGV2X3ByaW50KGN1cl9kZXYpOwojZW5kaWYKCWlmKHJlYWRfYm9vdHNlY3RhbmR2aSgmYnMsICZ2b2xpbmZvLCAmZmF0c2l6ZSkpIHsKCQlwcmludGYoIlxuTm8gdmFsaWQgRkFUIGZzIGZvdW5kXG4iKTsKCQlyZXR1cm4gMTsKCX0KCW1lbWNweSAodm9sX2xhYmVsLCB2b2xpbmZvLnZvbHVtZV9sYWJlbCwgMTEpOwoJdm9sX2xhYmVsWzExXSA9ICdcMCc7Cgl2b2xpbmZvLmZzX3R5cGVbNV09J1wwJzsKCXByaW50ZigiUGFydGl0aW9uICVkOiBGaWxlc3lzdGVtOiAlcyBcIiVzXCJcbiIKCQkJLGN1cl9wYXJ0LHZvbGluZm8uZnNfdHlwZSx2b2xfbGFiZWwpOwoJcmV0dXJuIDA7Cn0KCgppbnQKZmlsZV9mYXRfbHMoY29uc3QgY2hhciAqZGlyKQp7CglyZXR1cm4gZG9fZmF0X3JlYWQoZGlyLCBOVUxMLCAwLCBMU19ZRVMpOwp9CgoKbG9uZwpmaWxlX2ZhdF9yZWFkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSkKewoJcHJpbnRmKCJyZWFkaW5nICVzXG4iLGZpbGVuYW1lKTsKCXJldHVybiBkb19mYXRfcmVhZChmaWxlbmFtZSwgYnVmZmVyLCBtYXhzaXplLCBMU19OTyk7Cn0KCiNlbmRpZgo=