LyoKICogVGVycmFUZWMgQ2luZXJneSBUsi9xYW51IFVTQjIgRFZCLVQgYWRhcHRlci4KICoKICogQ29weXJpZ2h0IChDKSAyMDA0IERhbmllbCBNYWNrIDxkYW5pZWxAcWFudS5kZT4gYW5kCiAqCQkgICAgSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQHFhbnUuZGU+CiAqCiAqICBQcm90b2NvbCBTcGVjIHB1Ymxpc2hlZCBvbiBodHRwOi8vcWFudS5kZS9zcGVjcy90ZXJyYXRlY19jaW5lcmd5VDIucGRmCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgojaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgoKI2luY2x1ZGUgImRteGRldi5oIgojaW5jbHVkZSAiZHZiX2RlbXV4LmgiCiNpbmNsdWRlICJkdmJfbmV0LmgiCgojaWZkZWYgQ09ORklHX0RWQl9DSU5FUkdZVDJfVFVOSU5HCgkjZGVmaW5lIFNUUkVBTV9VUkJfQ09VTlQgKENPTkZJR19EVkJfQ0lORVJHWVQyX1NUUkVBTV9VUkJfQ09VTlQpCgkjZGVmaW5lIFNUUkVBTV9CVUZfU0laRSAoQ09ORklHX0RWQl9DSU5FUkdZVDJfU1RSRUFNX0JVRl9TSVpFKQoJI2RlZmluZSBRVUVSWV9JTlRFUlZBTCAoQ09ORklHX0RWQl9DSU5FUkdZVDJfUVVFUllfSU5URVJWQUwpCgkjaWZkZWYgQ09ORklHX0RWQl9DSU5FUkdZVDJfRU5BQkxFX1JDX0lOUFVUX0RFVklDRQoJCSNkZWZpbmUgUkNfUVVFUllfSU5URVJWQUwgKENPTkZJR19EVkJfQ0lORVJHWVQyX1JDX1FVRVJZX0lOVEVSVkFMKQoJCSNkZWZpbmUgRU5BQkxFX1JDICgxKQoJI2VuZGlmCiNlbHNlCgkjZGVmaW5lIFNUUkVBTV9VUkJfQ09VTlQgKDMyKQoJI2RlZmluZSBTVFJFQU1fQlVGX1NJWkUgKDUxMikJLyogYnl0ZXMgKi8KCSNkZWZpbmUgRU5BQkxFX1JDICgxKQoJI2RlZmluZSBSQ19RVUVSWV9JTlRFUlZBTCAoNTApCS8qIG1pbGxpc2Vjb25kcyAqLwoJI2RlZmluZSBRVUVSWV9JTlRFUlZBTCAoMzMzKQkvKiBtaWxsaXNlY29uZHMgKi8KI2VuZGlmCgojZGVmaW5lIERSSVZFUl9OQU1FICJUZXJyYVRlYy9xYW51IFVTQjIuMCBIaWdoc3BlZWQgRFZCLVQgUmVjZWl2ZXIiCgpzdGF0aWMgaW50IGRlYnVnOwptb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRlYnVnLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CgojZGVmaW5lIGRwcmludGsobGV2ZWwsIGFyZ3MuLi4pCQkJCQkJXApkbyB7CQkJCQkJCQkJXAoJaWYgKChkZWJ1ZyAmIGxldmVsKSkgewkJCQkJCVwKCQlwcmludGsoIiVzOiAlcygpOiAiLCBLQlVJTERfTU9ETkFNRSwJCQlcCgkJICAgICAgIF9fRlVOQ1RJT05fXyk7CQkJCQlcCgkJcHJpbnRrKGFyZ3MpOyB9CQkJCQkJXAp9IHdoaWxlICgwKQoKZW51bSBjaW5lcmd5dDJfZXAxX2NtZCB7CglDSU5FUkdZVDJfRVAxX1BJRF9UQUJMRV9SRVNFVAkJPSAweDAxLAoJQ0lORVJHWVQyX0VQMV9QSURfU0VUVVAJCQk9IDB4MDIsCglDSU5FUkdZVDJfRVAxX0NPTlRST0xfU1RSRUFNX1RSQU5TRkVSCT0gMHgwMywKCUNJTkVSR1lUMl9FUDFfU0VUX1RVTkVSX1BBUkFNRVRFUlMJPSAweDA0LAoJQ0lORVJHWVQyX0VQMV9HRVRfVFVORVJfU1RBVFVTCQk9IDB4MDUsCglDSU5FUkdZVDJfRVAxX1NUQVJUX1NDQU4JCT0gMHgwNiwKCUNJTkVSR1lUMl9FUDFfQ09OVElOVUVfU0NBTgkJPSAweDA3LAoJQ0lORVJHWVQyX0VQMV9HRVRfUkNfRVZFTlRTCQk9IDB4MDgsCglDSU5FUkdZVDJfRVAxX1NMRUVQX01PREUJCT0gMHgwOQp9OwoKc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnIHsKCXVpbnQ4X3QgY21kOwoJdWludDMyX3QgZnJlcTsKCXVpbnQ4X3QgYmFuZHdpZHRoOwoJdWludDE2X3QgdHBzOwoJdWludDhfdCBmbGFnczsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCnN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHsKCXVpbnQzMl90IGZyZXE7Cgl1aW50OF90IGJhbmR3aWR0aDsKCXVpbnQxNl90IHRwczsKCXVpbnQ4X3QgZmxhZ3M7Cgl1aW50MTZfdCBnYWluOwoJdWludDhfdCBzbnI7Cgl1aW50MzJfdCB2aXRlcmJpX2Vycm9yX3JhdGU7Cgl1aW50MzJfdCByc19lcnJvcl9yYXRlOwoJdWludDMyX3QgdW5jb3JyZWN0ZWRfYmxvY2tfY291bnQ7Cgl1aW50OF90IGxvY2tfYml0czsKCXVpbnQ4X3QgcHJldl9sb2NrX2JpdHM7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgpzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIGNpbmVyZ3l0Ml9mZV9pbmZvID0gewoJLm5hbWUgPSBEUklWRVJfTkFNRSwKCS50eXBlID0gRkVfT0ZETSwKCS5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwLAoJLmZyZXF1ZW5jeV9tYXggPSA4NjIwMDAwMDAsCgkuZnJlcXVlbmN5X3N0ZXBzaXplID0gMTY2NjY3LAoJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfCBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwKCQlGRV9DQU5fRkVDXzNfNCB8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAoJCUZFX0NBTl9GRUNfQVVUTyB8CgkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8IEZFX0NBTl9RQU1fQVVUTyB8CgkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfCBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8CgkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPIHwgRkVfQ0FOX1JFQ09WRVIgfCBGRV9DQU5fTVVURV9UUwp9OwoKc3RydWN0IGNpbmVyZ3l0MiB7CglzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CglzdHJ1Y3QgbXV0ZXggc2VtOwoJc3RydWN0IGR2Yl9hZGFwdGVyIGFkYXB0ZXI7CglzdHJ1Y3QgZHZiX2RldmljZSAqZmVkZXY7CglzdHJ1Y3QgZG14ZGV2IGRteGRldjsKCXN0cnVjdCBkdmJfbmV0IGR2Ym5ldDsKCglpbnQgc3RyZWFtaW5nOwoJaW50IHNsZWVwaW5nOwoKCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyBwYXJhbTsKCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHN0YXR1czsKCXN0cnVjdCBkZWxheWVkX3dvcmsgcXVlcnlfd29yazsKCgl3YWl0X3F1ZXVlX2hlYWRfdCBwb2xsX3dxOwoJaW50IHBlbmRpbmdfZmVfZXZlbnRzOwoJaW50IGRpc2Nvbm5lY3RfcGVuZGluZzsKCWF0b21pY190IGludXNlOwoKCXZvaWQgKnN0cmVhbWJ1ZjsKCWRtYV9hZGRyX3Qgc3RyZWFtYnVmX2RtYWhhbmRsZTsKCXN0cnVjdCB1cmIgKnN0cmVhbV91cmIgW1NUUkVBTV9VUkJfQ09VTlRdOwoKI2lmZGVmIEVOQUJMRV9SQwoJc3RydWN0IGlucHV0X2RldiAqcmNfaW5wdXRfZGV2OwoJY2hhciBwaHlzWzY0XTsKCXN0cnVjdCBkZWxheWVkX3dvcmsgcmNfcXVlcnlfd29yazsKCWludCByY19pbnB1dF9ldmVudDsKCXUzMiByY19sYXN0X2NvZGU7Cgl1bnNpZ25lZCBsb25nIGxhc3RfZXZlbnRfamlmZmllczsKI2VuZGlmCn07CgplbnVtIHsKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05PTkUgPSAweDAwLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDICA9IDB4MDEsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9SQzUgID0gMHgwMgp9OwoKc3RydWN0IGNpbmVyZ3l0Ml9yY19ldmVudCB7CgljaGFyIHR5cGU7Cgl1aW50MzJfdCB2YWx1ZTsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCnN0YXRpYyBjb25zdCB1aW50MzJfdCByY19rZXlzW10gPSB7CglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmUwMWViMDQsCUtFWV9QT1dFUiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmZDAyZWIwNCwJS0VZXzEsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmMwM2ViMDQsCUtFWV8yLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZiMDRlYjA0LAlLRVlfMywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmYTA1ZWIwNCwJS0VZXzQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjkwNmViMDQsCUtFWV81LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY4MDdlYjA0LAlLRVlfNiwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmNzA4ZWIwNCwJS0VZXzcsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjYwOWViMDQsCUtFWV84LAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY1MGFlYjA0LAlLRVlfOSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmMzBjZWIwNCwJS0VZXzAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjQwYmViMDQsCUtFWV9WSURFTywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmMjBkZWIwNCwJS0VZX1JFRlJFU0gsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjEwZWViMDQsCUtFWV9TRUxFQ1QsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjAwZmViMDQsCUtFWV9FUEcsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWYxMGViMDQsCUtFWV9VUCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlYjE0ZWIwNCwJS0VZX0RPV04sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWUxMWViMDQsCUtFWV9MRUZULAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGVjMTNlYjA0LAlLRVlfUklHSFQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWQxMmViMDQsCUtFWV9PSywKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlYTE1ZWIwNCwJS0VZX1RFWFQsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTkxNmViMDQsCUtFWV9JTkZPLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU4MTdlYjA0LAlLRVlfUkVELAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU3MThlYjA0LAlLRVlfR1JFRU4sCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTYxOWViMDQsCUtFWV9ZRUxMT1csCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTUxYWViMDQsCUtFWV9CTFVFLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUzMWNlYjA0LAlLRVlfVk9MVU1FVVAsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTExZWViMDQsCUtFWV9WT0xVTUVET1dOLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUyMWRlYjA0LAlLRVlfTVVURSwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlNDFiZWIwNCwJS0VZX0NIQU5ORUxVUCwKCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlMDFmZWIwNCwJS0VZX0NIQU5ORUxET1dOLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGJmNDBlYjA0LAlLRVlfUEFVU0UsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YjM0Y2ViMDQsCUtFWV9QTEFZLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGE3NThlYjA0LAlLRVlfUkVDT1JELAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGFiNTRlYjA0LAlLRVlfUFJFVklPVVMsCglDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4Yjc0OGViMDQsCUtFWV9TVE9QLAoJQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGEzNWNlYjA0LAlLRVlfTkVYVAp9OwoKc3RhdGljIGludCBjaW5lcmd5dDJfY29tbWFuZCAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyLAoJCQkgICAgICBjaGFyICpzZW5kX2J1ZiwgaW50IHNlbmRfYnVmX2xlbiwKCQkJICAgICAgY2hhciAqcmVjdl9idWYsIGludCByZWN2X2J1Zl9sZW4pCnsKCWludCBhY3R1YWxfbGVuOwoJY2hhciBkdW1teTsKCWludCByZXQ7CgoJcmV0ID0gdXNiX2J1bGtfbXNnKGNpbmVyZ3l0Mi0+dWRldiwgdXNiX3NuZGJ1bGtwaXBlKGNpbmVyZ3l0Mi0+dWRldiwgMSksCgkJCSAgIHNlbmRfYnVmLCBzZW5kX2J1Zl9sZW4sICZhY3R1YWxfbGVuLCAxMDAwKTsKCglpZiAocmV0KQoJCWRwcmludGsoMSwgInVzYl9idWxrX21zZyAoc2VuZCkgZmFpbGVkLCBlcnIgJWlcbiIsIHJldCk7CgoJaWYgKCFyZWN2X2J1ZikKCQlyZWN2X2J1ZiA9ICZkdW1teTsKCglyZXQgPSB1c2JfYnVsa19tc2coY2luZXJneXQyLT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoY2luZXJneXQyLT51ZGV2LCAxKSwKCQkJICAgcmVjdl9idWYsIHJlY3ZfYnVmX2xlbiwgJmFjdHVhbF9sZW4sIDEwMDApOwoKCWlmIChyZXQpCgkJZHByaW50aygxLCAidXNiX2J1bGtfbXNnIChyZWFkKSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKCglyZXR1cm4gcmV0ID8gcmV0IDogYWN0dWFsX2xlbjsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsIGludCBlbmFibGUpCnsKCWNoYXIgYnVmIFtdID0geyBDSU5FUkdZVDJfRVAxX0NPTlRST0xfU1RSRUFNX1RSQU5TRkVSLCBlbmFibGUgPyAxIDogMCB9OwoJY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3NsZWVwIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsIGludCBzbGVlcCkKewoJY2hhciBidWYgW10gPSB7IENJTkVSR1lUMl9FUDFfU0xFRVBfTU9ERSwgc2xlZXAgPyAxIDogMCB9OwoJY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKCWNpbmVyZ3l0Mi0+c2xlZXBpbmcgPSBzbGVlcDsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3N0cmVhbV9pcnEgKHN0cnVjdCB1cmIgKnVyYik7CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdWJtaXRfc3RyZWFtX3VyYiAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyLCBzdHJ1Y3QgdXJiICp1cmIpCnsKCWludCBlcnI7CgoJdXNiX2ZpbGxfYnVsa191cmIodXJiLAoJCQkgIGNpbmVyZ3l0Mi0+dWRldiwKCQkJICB1c2JfcmN2YnVsa3BpcGUoY2luZXJneXQyLT51ZGV2LCAweDIpLAoJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAoJCQkgIFNUUkVBTV9CVUZfU0laRSwKCQkJICBjaW5lcmd5dDJfc3RyZWFtX2lycSwKCQkJICBjaW5lcmd5dDIpOwoKCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpCgkJZHByaW50aygxLCAidXJiIHN1Ym1pc3Npb24gZmFpbGVkIChlcnIgPSAlaSkhXG4iLCBlcnIpOwoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9zdHJlYW1faXJxIChzdHJ1Y3QgdXJiICp1cmIpCnsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVyYi0+Y29udGV4dDsKCglpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkKCQlkdmJfZG14X3N3ZmlsdGVyKCZjaW5lcmd5dDItPmRlbXV4LAoJCQkJIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwoKCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZykKCQljaW5lcmd5dDJfc3VibWl0X3N0cmVhbV91cmIoY2luZXJneXQyLCB1cmIpOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfZnJlZV9zdHJlYW1fdXJicyAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglpbnQgaTsKCglmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspCgkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSkKCQkJdXNiX2ZyZWVfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7CgoJdXNiX2J1ZmZlcl9mcmVlKGNpbmVyZ3l0Mi0+dWRldiwgU1RSRUFNX1VSQl9DT1VOVCpTVFJFQU1fQlVGX1NJWkUsCgkJCSAgICBjaW5lcmd5dDItPnN0cmVhbWJ1ZiwgY2luZXJneXQyLT5zdHJlYW1idWZfZG1haGFuZGxlKTsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfYWxsb2Nfc3RyZWFtX3VyYnMgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJaW50IGk7CgoJY2luZXJneXQyLT5zdHJlYW1idWYgPSB1c2JfYnVmZmVyX2FsbG9jKGNpbmVyZ3l0Mi0+dWRldiwgU1RSRUFNX1VSQl9DT1VOVCpTVFJFQU1fQlVGX1NJWkUsCgkJCQkJICAgICAgU0xBQl9LRVJORUwsICZjaW5lcmd5dDItPnN0cmVhbWJ1Zl9kbWFoYW5kbGUpOwoJaWYgKCFjaW5lcmd5dDItPnN0cmVhbWJ1ZikgewoJCWRwcmludGsoMSwgImZhaWxlZCB0byBhbGxvYyBjb25zaXN0ZW50IHN0cmVhbSBtZW1vcnkgYXJlYSwgYmFpbGluZyBvdXQhXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgltZW1zZXQoY2luZXJneXQyLT5zdHJlYW1idWYsIDAsIFNUUkVBTV9VUkJfQ09VTlQqU1RSRUFNX0JVRl9TSVpFKTsKCglmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspIHsKCQlzdHJ1Y3QgdXJiICp1cmI7CgoJCWlmICghKHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQykpKSB7CgkJCWRwcmludGsoMSwgImZhaWxlZCB0byBhbGxvYyBjb25zaXN0ZW50IHN0cmVhbSB1cmJzLCBiYWlsaW5nIG91dCFcbiIpOwoJCQljaW5lcmd5dDJfZnJlZV9zdHJlYW1fdXJicyhjaW5lcmd5dDIpOwoJCQlyZXR1cm4gLUVOT01FTTsKCQl9CgoJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gY2luZXJneXQyLT5zdHJlYW1idWYgKyBpICogU1RSRUFNX0JVRl9TSVpFOwoJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFNUUkVBTV9CVUZfU0laRTsKCgkJY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldID0gdXJiOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglpbnQgaTsKCgljaW5lcmd5dDJfY29udHJvbF9zdHJlYW1fdHJhbnNmZXIoY2luZXJneXQyLCAwKTsKCglmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspCgkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSkKCQkJdXNiX2tpbGxfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3N0YXJ0X3N0cmVhbV94ZmVyIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWludCBpLCBlcnI7CgoJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKSB7CgkJaWYgKChlcnIgPSBjaW5lcmd5dDJfc3VibWl0X3N0cmVhbV91cmIoY2luZXJneXQyLCBjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pKSkgewoJCQljaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoJCQlkcHJpbnRrKDEsICJmYWlsZWQgdXJiIHN1Ym1pc3Npb24gKCVpOiBlcnIgPSAlaSkhXG4iLCBpLCBlcnIpOwoJCQlyZXR1cm4gZXJyOwoJCX0KCX0KCgljaW5lcmd5dDJfY29udHJvbF9zdHJlYW1fdHJhbnNmZXIoY2luZXJneXQyLCAxKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKewoJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBkdmJkbXhmZWVkLT5kZW11eDsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGRlbXV4LT5wcml2OwoKCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZyA9PSAwKQoJCWNpbmVyZ3l0Ml9zdGFydF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoKCWNpbmVyZ3l0Mi0+c3RyZWFtaW5nKys7CgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQp7CglzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGR2YmRteGZlZWQtPmRlbXV4OwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZGVtdXgtPnByaXY7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJaWYgKC0tY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKCQljaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiAgY29udmVydCBsaW51eC1kdmIgZnJvbnRlbmQgcGFyYW1ldGVyIHNldCBpbnRvIFRQUy4KICogIFNlZSBFVFNJIEVUUy0zMDA3NDQsIHNlY3Rpb24gNC42LjIsIHRhYmxlIDkgZm9yIGRldGFpbHMuCiAqCiAqICBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmx5IHJldXNhYmxlIGFuZCBtYXkgYmV0dGVyIGdldCBwbGFjZWQgaW4gYSBzdXBwb3J0CiAqICBsaWJyYXJ5LgogKgogKiAgV2UgcmVwbGFjZSBlcnJvcm5vdXMgZmllbGRzIGJ5IGRlZmF1bHQgVFBTIGZpZWxkcyAodGhlIG9uZXMgd2l0aCB2YWx1ZSAwKS4KICovCnN0YXRpYyB1aW50MTZfdCBjb21wdXRlX3RwcyAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQp7CglzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyAqb3AgPSAmcC0+dS5vZmRtOwoJdWludDE2X3QgdHBzID0gMDsKCglzd2l0Y2ggKG9wLT5jb2RlX3JhdGVfSFApIHsKCQljYXNlIEZFQ18yXzM6CgkJCXRwcyB8PSAoMSA8PCA3KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfM180OgoJCQl0cHMgfD0gKDIgPDwgNyk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzVfNjoKCQkJdHBzIHw9ICgzIDw8IDcpOwoJCQlicmVhazsKCQljYXNlIEZFQ183Xzg6CgkJCXRwcyB8PSAoNCA8PCA3KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfMV8yOgoJCWNhc2UgRkVDX0FVVE86CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDcpICovOwoJfQoKCXN3aXRjaCAob3AtPmNvZGVfcmF0ZV9MUCkgewoJCWNhc2UgRkVDXzJfMzoKCQkJdHBzIHw9ICgxIDw8IDQpOwoJCQlicmVhazsKCQljYXNlIEZFQ18zXzQ6CgkJCXRwcyB8PSAoMiA8PCA0KTsKCQkJYnJlYWs7CgkJY2FzZSBGRUNfNV82OgoJCQl0cHMgfD0gKDMgPDwgNCk7CgkJCWJyZWFrOwoJCWNhc2UgRkVDXzdfODoKCQkJdHBzIHw9ICg0IDw8IDQpOwoJCQlicmVhazsKCQljYXNlIEZFQ18xXzI6CgkJY2FzZSBGRUNfQVVUTzoKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgNCkgKi87Cgl9CgoJc3dpdGNoIChvcC0+Y29uc3RlbGxhdGlvbikgewoJCWNhc2UgUUFNXzE2OgoJCQl0cHMgfD0gKDEgPDwgMTMpOwoJCQlicmVhazsKCQljYXNlIFFBTV82NDoKCQkJdHBzIHw9ICgyIDw8IDEzKTsKCQkJYnJlYWs7CgkJY2FzZSBRUFNLOgoJCWRlZmF1bHQ6CgkJCS8qIHRwcyB8PSAoMCA8PCAxMykgKi87Cgl9CgoJc3dpdGNoIChvcC0+dHJhbnNtaXNzaW9uX21vZGUpIHsKCQljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgoJCQl0cHMgfD0gKDEgPDwgMCk7CgkJCWJyZWFrOwoJCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfMks6CgkJZGVmYXVsdDoKCQkJLyogdHBzIHw9ICgwIDw8IDApICovOwoJfQoKCXN3aXRjaCAob3AtPmd1YXJkX2ludGVydmFsKSB7CgkJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzE2OgoJCQl0cHMgfD0gKDEgPDwgMik7CgkJCWJyZWFrOwoJCWNhc2UgR1VBUkRfSU5URVJWQUxfMV84OgoJCQl0cHMgfD0gKDIgPDwgMik7CgkJCWJyZWFrOwoJCWNhc2UgR1VBUkRfSU5URVJWQUxfMV80OgoJCQl0cHMgfD0gKDMgPDwgMik7CgkJCWJyZWFrOwoJCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgMikgKi87Cgl9CgoJc3dpdGNoIChvcC0+aGllcmFyY2h5X2luZm9ybWF0aW9uKSB7CgkJY2FzZSBISUVSQVJDSFlfMToKCQkJdHBzIHw9ICgxIDw8IDEwKTsKCQkJYnJlYWs7CgkJY2FzZSBISUVSQVJDSFlfMjoKCQkJdHBzIHw9ICgyIDw8IDEwKTsKCQkJYnJlYWs7CgkJY2FzZSBISUVSQVJDSFlfNDoKCQkJdHBzIHw9ICgzIDw8IDEwKTsKCQkJYnJlYWs7CgkJY2FzZSBISUVSQVJDSFlfTk9ORToKCQlkZWZhdWx0OgoJCQkvKiB0cHMgfD0gKDAgPDwgMTApICovOwoJfQoKCXJldHVybiB0cHM7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoJaW50IGVyciA9IC1FUkVTVEFSVFNZUzsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoKGVyciA9IGR2Yl9nZW5lcmljX29wZW4oaW5vZGUsIGZpbGUpKSkgewoJCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoJCXJldHVybiBlcnI7Cgl9CgoKCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAwKTsKCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yaywgSFovMik7Cgl9CgoJYXRvbWljX2luYygmY2luZXJneXQyLT5pbnVzZSk7CgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY2luZXJneXQyX3VucmVnaXN0ZXIoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQp7CglkdmJfbmV0X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZHZibmV0KTsKCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2luZXJneXQyLT5kbXhkZXYpOwoJZHZiX2RteF9yZWxlYXNlKCZjaW5lcmd5dDItPmRlbXV4KTsKCWR2Yl91bnJlZ2lzdGVyX2RldmljZShjaW5lcmd5dDItPmZlZGV2KTsKCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlcik7CgoJY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMoY2luZXJneXQyKTsKCWtmcmVlKGNpbmVyZ3l0Mik7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoKCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCWlmICghY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7CgkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrKTsKCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwoJCWNpbmVyZ3l0Ml9zbGVlcChjaW5lcmd5dDIsIDEpOwoJfQoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoKCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjaW5lcmd5dDItPmludXNlKSAmJiBjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZykgewoJCXdhcm4oImRlbGF5ZWQgdW5yZWdpc3RlciBpbiByZWxlYXNlIik7CgkJY2luZXJneXQyX3VucmVnaXN0ZXIoY2luZXJneXQyKTsKCX0KCglyZXR1cm4gZHZiX2dlbmVyaWNfcmVsZWFzZShpbm9kZSwgZmlsZSk7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2luZXJneXQyX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCnsKCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7CiAgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJcG9sbF93YWl0KGZpbGUsICZjaW5lcmd5dDItPnBvbGxfd3EsIHdhaXQpOwoKICAgICAgIGlmIChjaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzICE9IDApCgkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExQUkkpOwoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwoKICAgICAgIHJldHVybiBtYXNrOwp9CgoKc3RhdGljIGludCBjaW5lcmd5dDJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAoJCSAgICAgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnICpzdGF0ID0gJmNpbmVyZ3l0Mi0+c3RhdHVzOwoJZmVfc3RhdHVzX3Qgc3RhdHVzID0gMDsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBGRV9HRVRfSU5GTzoKCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciopIGFyZywgJmNpbmVyZ3l0Ml9mZV9pbmZvLAoJCQkJICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pKTsKCgljYXNlIEZFX1JFQURfU1RBVFVTOgoJCWlmICgweGZmZmYgLSBsZTE2X3RvX2NwdShzdGF0LT5nYWluKSA+IDMwKQoJCQlzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgNikpCgkJCXN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgNSkpCgkJCXN0YXR1cyB8PSBGRV9IQVNfU1lOQzsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgNCkpCgkJCXN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgMSkpCgkJCXN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKCgkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAgX191c2VyKikgYXJnLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7CgoJY2FzZSBGRV9SRUFEX0JFUjoKCQlyZXR1cm4gcHV0X3VzZXIobGUzMl90b19jcHUoc3RhdC0+dml0ZXJiaV9lcnJvcl9yYXRlKSwKCQkJCShfX3UzMiBfX3VzZXIgKikgYXJnKTsKCgljYXNlIEZFX1JFQURfU0lHTkFMX1NUUkVOR1RIOgoJCXJldHVybiBwdXRfdXNlcigweGZmZmYgLSBsZTE2X3RvX2NwdShzdGF0LT5nYWluKSwKCQkJCShfX3UxNiBfX3VzZXIgKikgYXJnKTsKCgljYXNlIEZFX1JFQURfU05SOgoJCXJldHVybiBwdXRfdXNlcigoc3RhdC0+c25yIDw8IDgpIHwgc3RhdC0+c25yLAoJCQkJKF9fdTE2IF9fdXNlciAqKSBhcmcpOwoKCWNhc2UgRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M6Cgl7CgkJdWludDMyX3QgdW5jX2NvdW50OwoKCQl1bmNfY291bnQgPSBzdGF0LT51bmNvcnJlY3RlZF9ibG9ja19jb3VudDsKCQlzdGF0LT51bmNvcnJlY3RlZF9ibG9ja19jb3VudCA9IDA7CgoJCS8qIFVOQyBhcmUgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gaG9zdCBieXRlIG9yZGVyLi4uICovCgkJcmV0dXJuIHB1dF91c2VyKHVuY19jb3VudCwoX191MzIgX191c2VyICopIGFyZyk7Cgl9CgljYXNlIEZFX1NFVF9GUk9OVEVORDoKCXsKCQlzdHJ1Y3QgZHZidF9zZXRfcGFyYW1ldGVyc19tc2cgKnBhcmFtID0gJmNpbmVyZ3l0Mi0+cGFyYW07CgkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHA7CgkJaW50IGVycjsKCgkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKCQkJcmV0dXJuIC1FUEVSTTsKCgkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCAodm9pZCAgX191c2VyKikgYXJnLCBzaXplb2YocCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCgkJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCQlwYXJhbS0+Y21kID0gQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUzsKCQlwYXJhbS0+dHBzID0gY3B1X3RvX2xlMTYoY29tcHV0ZV90cHMoJnApKTsKCQlwYXJhbS0+ZnJlcSA9IGNwdV90b19sZTMyKHAuZnJlcXVlbmN5IC8gMTAwMCk7CgkJcGFyYW0tPmJhbmR3aWR0aCA9IDggLSBwLnUub2ZkbS5iYW5kd2lkdGggLSBCQU5EV0lEVEhfOF9NSFo7CgoJCXN0YXQtPmxvY2tfYml0cyA9IDA7CgkJY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cysrOwoJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5wb2xsX3dxKTsKCgkJZXJyID0gY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLAoJCQkJCShjaGFyICopIHBhcmFtLCBzaXplb2YoKnBhcmFtKSwKCQkJCQlOVUxMLCAwKTsKCgkJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7CgoJCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwoJfQoKCWNhc2UgRkVfR0VUX0ZST05URU5EOgoJCS8qKgoJCSAqICB0cml2aWFsIHRvIGltcGxlbWVudCAoc2VlIHN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnKS4KCQkgKiAgZXF1aXZhbGVudCB0byBGRV9SRUFEIGlvY3RscywgYnV0IG5lZWRzCgkJICogIFRQUyAtPiBsaW51eC1kdmIgcGFyYW1ldGVyIHNldCBjb252ZXJzaW9uLiBGZWVsIGZyZWUKCQkgKiAgdG8gaW1wbGVtZW50IHRoaXMgYW5kIHNlbmQgdXMgYSBwYXRjaCBpZiB5b3UgbmVlZCB0aGlzCgkJICogIGZ1bmN0aW9uYWxpdHkuCgkJICovCgkJYnJlYWs7CgoJY2FzZSBGRV9HRVRfRVZFTlQ6Cgl7CgkJLyoqCgkJICogIGZvciBub3cgd2Ugb25seSBmaWxsIHRoZSBzdGF0dXMgZmllbGQuIHRoZSBwYXJhbWV0ZXJzCgkJICogIGFyZSB0cml2aWFsIHRvIGZpbGwgYXMgc29vbiBGRV9HRVRfRlJPTlRFTkQgaXMgZG9uZS4KCQkgKi8KCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50IF9fdXNlciAqZSA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CgkJaWYgKGNpbmVyZ3l0Mi0+cGVuZGluZ19mZV9ldmVudHMgPT0gMCkgewoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCgkJCQlyZXR1cm4gLUVXT1VMREJMT0NLOwoJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2luZXJneXQyLT5wb2xsX3dxLAoJCQkJCQkgY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyA+IDApOwoJCX0KCQljaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzID0gMDsKCQlyZXR1cm4gY2luZXJneXQyX2lvY3RsKGlub2RlLCBmaWxlLCBGRV9SRUFEX1NUQVRVUywKCQkJCQkodW5zaWduZWQgbG9uZykgJmUtPnN0YXR1cyk7Cgl9CgoJZGVmYXVsdDoKCQk7Cgl9CgoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgY2luZXJneXQyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQp7CglzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwoJaW50IHJldCA9IDA7CgoJbG9ja19rZXJuZWwoKTsKCglpZiAodm1hLT52bV9mbGFncyAmIChWTV9XUklURSB8IFZNX0VYRUMpKSB7CgkJcmV0ID0gLUVQRVJNOwoJCWdvdG8gYmFpbG91dDsKCX0KCglpZiAodm1hLT52bV9lbmQgPiB2bWEtPnZtX3N0YXJ0ICsgU1RSRUFNX1VSQl9DT1VOVCAqIFNUUkVBTV9CVUZfU0laRSkgewoJCXJldCA9IC1FSU5WQUw7CgkJZ290byBiYWlsb3V0OwoJfQoKCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fRE9OVENPUFkpOwoJdm1hLT52bV9maWxlID0gZmlsZTsKCglyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAoJCQkgICAgICB2aXJ0X3RvX3BoeXMoY2luZXJneXQyLT5zdHJlYW1idWYpID4+IFBBR0VfU0hJRlQsCgkJCSAgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKCQkJICAgICAgdm1hLT52bV9wYWdlX3Byb3QpID8gLUVBR0FJTiA6IDA7CmJhaWxvdXQ6Cgl1bmxvY2tfa2VybmVsKCk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaW5lcmd5dDJfZm9wcyA9IHsKCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAoJLmlvY3RsCQk9IGNpbmVyZ3l0Ml9pb2N0bCwKCS5wb2xsICAgICAgICAgICA9IGNpbmVyZ3l0Ml9wb2xsLAoJLm9wZW4gICAgICAgICAgID0gY2luZXJneXQyX29wZW4sCgkucmVsZWFzZSAgICAgICAgPSBjaW5lcmd5dDJfcmVsZWFzZSwKCS5tbWFwCQk9IGNpbmVyZ3l0Ml9tbWFwCn07CgpzdGF0aWMgc3RydWN0IGR2Yl9kZXZpY2UgY2luZXJneXQyX2ZlX3RlbXBsYXRlID0gewoJLnVzZXJzID0gfjAsCgkud3JpdGVycyA9IDEsCgkucmVhZGVycyA9ICh+MCktMSwKCS5mb3BzID0gJmNpbmVyZ3l0Ml9mb3BzCn07CgojaWZkZWYgRU5BQkxFX1JDCgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnlfcmMgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0KCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNpbmVyZ3l0MiwgcmNfcXVlcnlfd29yay53b3JrKTsKCWNoYXIgYnVmWzFdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9SQ19FVkVOVFMgfTsKCXN0cnVjdCBjaW5lcmd5dDJfcmNfZXZlbnQgcmNfZXZlbnRzWzEyXTsKCWludCBuLCBsZW4sIGk7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybjsKCglsZW4gPSBjaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksCgkJCQkoY2hhciAqKSByY19ldmVudHMsIHNpemVvZihyY19ldmVudHMpKTsKCWlmIChsZW4gPCAwKQoJCWdvdG8gb3V0OwoJaWYgKGxlbiA9PSAwKSB7CgkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgY2luZXJneXQyLT5sYXN0X2V2ZW50X2ppZmZpZXMgKwoJCQkgICAgICAgbXNlY3NfdG9famlmZmllcygxNTApKSkgewoJCQkvKiBzdG9wIGtleSByZXBlYXQgKi8KCQkJaWYgKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgIT0gS0VZX01BWCkgewoJCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWQgVXBcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOwoJCQkJaW5wdXRfcmVwb3J0X2tleShjaW5lcmd5dDItPnJjX2lucHV0X2RldiwKCQkJCQkJIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDApOwoJCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7CgkJCX0KCQkJY2luZXJneXQyLT5yY19sYXN0X2NvZGUgPSB+MDsKCQl9CgkJZ290byBvdXQ7Cgl9CgljaW5lcmd5dDItPmxhc3RfZXZlbnRfamlmZmllcyA9IGppZmZpZXM7CgoJZm9yIChuID0gMDsgbiA8IChsZW4gLyBzaXplb2YocmNfZXZlbnRzWzBdKSk7IG4rKykgewoJCWRwcmludGsoMSwgInJjX2V2ZW50c1slZF0udmFsdWUgPSAleCwgdHlwZT0leFxuIiwKCQkJbiwgbGUzMl90b19jcHUocmNfZXZlbnRzW25dLnZhbHVlKSwgcmNfZXZlbnRzW25dLnR5cGUpOwoKCQlpZiAocmNfZXZlbnRzW25dLnR5cGUgPT0gQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDICYmCgkJICAgIHJjX2V2ZW50c1tuXS52YWx1ZSA9PSB+MCkgewoJCQkvKiBrZXlyZXBlYXQgYml0IC0+IGp1c3QgcmVwZWF0IGxhc3QgcmNfaW5wdXRfZXZlbnQgKi8KCQl9IGVsc2UgewoJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmNfa2V5cyk7IGkgKz0gMykgewoJCQkJaWYgKHJjX2tleXNbaSArIDBdID09IHJjX2V2ZW50c1tuXS50eXBlICYmCgkJCQkgICAgcmNfa2V5c1tpICsgMV0gPT0gbGUzMl90b19jcHUocmNfZXZlbnRzW25dLnZhbHVlKSkgewoJCQkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSByY19rZXlzW2kgKyAyXTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgIT0gS0VZX01BWCkgewoJCQlpZiAocmNfZXZlbnRzW25dLnZhbHVlID09IGNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlICYmCgkJCSAgICBjaW5lcmd5dDItPnJjX2xhc3RfY29kZSAhPSB+MCkgewoJCQkJLyogZW1pdCBhIGtleS11cCBzbyB0aGUgZG91YmxlIGV2ZW50IGlzIHJlY29nbml6ZWQgKi8KCQkJCWRwcmludGsoMSwgInJjX2lucHV0X2V2ZW50PSVkIFVQXG4iLCBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50KTsKCQkJCWlucHV0X3JlcG9ydF9rZXkoY2luZXJneXQyLT5yY19pbnB1dF9kZXYsCgkJCQkJCSBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50LCAwKTsKCQkJfQoJCQlkcHJpbnRrKDEsICJyY19pbnB1dF9ldmVudD0lZFxuIiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCk7CgkJCWlucHV0X3JlcG9ydF9rZXkoY2luZXJneXQyLT5yY19pbnB1dF9kZXYsCgkJCQkJIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDEpOwoJCQljaW5lcmd5dDItPnJjX2xhc3RfY29kZSA9IHJjX2V2ZW50c1tuXS52YWx1ZTsKCQl9Cgl9CgpvdXQ6CglzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywKCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhSQ19RVUVSWV9JTlRFUlZBTCkpOwoKCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9yZWdpc3Rlcl9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKCWludCBpOwoKCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2ID0gaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CglpZiAoIWlucHV0X2RldikKCQlyZXR1cm4gLUVOT01FTTsKCgl1c2JfbWFrZV9wYXRoKGNpbmVyZ3l0Mi0+dWRldiwgY2luZXJneXQyLT5waHlzLCBzaXplb2YoY2luZXJneXQyLT5waHlzKSk7CglzdHJsY2F0KGNpbmVyZ3l0Mi0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoY2luZXJneXQyLT5waHlzKSk7CgljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gfjA7CglJTklUX0RFTEFZRURfV09SSygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLCBjaW5lcmd5dDJfcXVlcnlfcmMpOwoKCWlucHV0X2Rldi0+bmFtZSA9IERSSVZFUl9OQU1FICIgcmVtb3RlIGNvbnRyb2wiOwoJaW5wdXRfZGV2LT5waHlzID0gY2luZXJneXQyLT5waHlzOwoJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFUCk7Cglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyY19rZXlzKTsgaSArPSAzKQoJCXNldF9iaXQocmNfa2V5c1tpICsgMl0sIGlucHV0X2Rldi0+a2V5Yml0KTsKCWlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSAwOwoJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gMDsKCglpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoY2luZXJneXQyLT5yY19pbnB1dF9kZXYpOwoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfdW5yZWdpc3Rlcl9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yayk7CglpbnB1dF91bnJlZ2lzdGVyX2RldmljZShjaW5lcmd5dDItPnJjX2lucHV0X2Rldik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfc3VzcGVuZF9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCnsKCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yayk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfcmVzdW1lX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKewoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwp9CgojZWxzZQoKc3RhdGljIGlubGluZSBpbnQgY2luZXJneXQyX3JlZ2lzdGVyX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikgeyByZXR1cm4gMDsgfQpzdGF0aWMgaW5saW5lIHZvaWQgY2luZXJneXQyX3VucmVnaXN0ZXJfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKSB7IH0Kc3RhdGljIGlubGluZSB2b2lkIGNpbmVyZ3l0Ml9zdXNwZW5kX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikgeyB9CnN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfcmVzdW1lX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikgeyB9CgojZW5kaWYgLyogRU5BQkxFX1JDICovCgpzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnkgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0KCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNpbmVyZ3l0MiwgcXVlcnlfd29yay53b3JrKTsKCWNoYXIgY21kIFtdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9UVU5FUl9TVEFUVVMgfTsKCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnICpzID0gJmNpbmVyZ3l0Mi0+c3RhdHVzOwoJdWludDhfdCBsb2NrX2JpdHM7Cgl1aW50MzJfdCB1bmM7CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybjsKCgl1bmMgPSBzLT51bmNvcnJlY3RlZF9ibG9ja19jb3VudDsKCWxvY2tfYml0cyA9IHMtPmxvY2tfYml0czsKCgljaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIGNtZCwgc2l6ZW9mKGNtZCksIChjaGFyICopIHMsIHNpemVvZigqcykpOwoKCXVuYyArPSBsZTMyX3RvX2NwdShzLT51bmNvcnJlY3RlZF9ibG9ja19jb3VudCk7CglzLT51bmNvcnJlY3RlZF9ibG9ja19jb3VudCA9IHVuYzsKCglpZiAobG9ja19iaXRzICE9IHMtPmxvY2tfYml0cykgewoJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5wb2xsX3dxKTsKCQljaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzKys7Cgl9CgoJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssCgkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUVVFUllfSU5URVJWQUwpKTsKCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAoJCSAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDI7CglpbnQgZXJyOwoKCWlmICghKGNpbmVyZ3l0MiA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgY2luZXJneXQyKSwgR0ZQX0tFUk5FTCkpKSB7CgkJZHByaW50aygxLCAib3V0IG9mIG1lbW9yeT8hP1xuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJbWVtc2V0IChjaW5lcmd5dDIsIDAsIHNpemVvZiAoc3RydWN0IGNpbmVyZ3l0MikpOwoJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgKHZvaWQgKikgY2luZXJneXQyKTsKCgltdXRleF9pbml0KCZjaW5lcmd5dDItPnNlbSk7Cglpbml0X3dhaXRxdWV1ZV9oZWFkICgmY2luZXJneXQyLT5wb2xsX3dxKTsKCUlOSVRfREVMQVlFRF9XT1JLKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssIGNpbmVyZ3l0Ml9xdWVyeSk7CgoJY2luZXJneXQyLT51ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKCWNpbmVyZ3l0Mi0+cGFyYW0uY21kID0gQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUzsKCglpZiAoY2luZXJneXQyX2FsbG9jX3N0cmVhbV91cmJzIChjaW5lcmd5dDIpIDwgMCkgewoJCWRwcmludGsoMSwgInVuYWJsZSB0byBhbGxvY2F0ZSBzdHJlYW0gdXJic1xuIik7CgkJa2ZyZWUoY2luZXJneXQyKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglpZiAoKGVyciA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZjaW5lcmd5dDItPmFkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSwgJmNpbmVyZ3l0Mi0+dWRldi0+ZGV2KSkgPCAwKSB7CgkJa2ZyZWUoY2luZXJneXQyKTsKCQlyZXR1cm4gZXJyOwoJfQoKCWNpbmVyZ3l0Mi0+ZGVtdXgucHJpdiA9IGNpbmVyZ3l0MjsKCWNpbmVyZ3l0Mi0+ZGVtdXguZmlsdGVybnVtID0gMjU2OwoJY2luZXJneXQyLT5kZW11eC5mZWVkbnVtID0gMjU2OwoJY2luZXJneXQyLT5kZW11eC5zdGFydF9mZWVkID0gY2luZXJneXQyX3N0YXJ0X2ZlZWQ7CgljaW5lcmd5dDItPmRlbXV4LnN0b3BfZmVlZCA9IGNpbmVyZ3l0Ml9zdG9wX2ZlZWQ7CgljaW5lcmd5dDItPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwKCQkJCQkgICAgRE1YX1NFQ1RJT05fRklMVEVSSU5HIHwKCQkJCQkgICAgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkc7CgoJaWYgKChlcnIgPSBkdmJfZG14X2luaXQoJmNpbmVyZ3l0Mi0+ZGVtdXgpKSA8IDApIHsKCQlkcHJpbnRrKDEsICJkdmJfZG14X2luaXQoKSBmYWlsZWQgKGVyciA9ICVkKVxuIiwgZXJyKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CgoJY2luZXJneXQyLT5kbXhkZXYuZmlsdGVybnVtID0gY2luZXJneXQyLT5kZW11eC5maWx0ZXJudW07CgljaW5lcmd5dDItPmRteGRldi5kZW11eCA9ICZjaW5lcmd5dDItPmRlbXV4LmRteDsKCWNpbmVyZ3l0Mi0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7CgoJaWYgKChlcnIgPSBkdmJfZG14ZGV2X2luaXQoJmNpbmVyZ3l0Mi0+ZG14ZGV2LCAmY2luZXJneXQyLT5hZGFwdGVyKSkgPCAwKSB7CgkJZHByaW50aygxLCAiZHZiX2RteGRldl9pbml0KCkgZmFpbGVkIChlcnIgPSAlZClcbiIsIGVycik7CgkJZ290byBiYWlsb3V0OwoJfQoKCWlmIChkdmJfbmV0X2luaXQoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgJmNpbmVyZ3l0Mi0+ZHZibmV0LCAmY2luZXJneXQyLT5kZW11eC5kbXgpKQoJCWRwcmludGsoMSwgImR2Yl9uZXRfaW5pdCgpIGZhaWxlZCFcbiIpOwoKCWR2Yl9yZWdpc3Rlcl9kZXZpY2UoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgJmNpbmVyZ3l0Mi0+ZmVkZXYsCgkJCSAgICAmY2luZXJneXQyX2ZlX3RlbXBsYXRlLCBjaW5lcmd5dDIsCgkJCSAgICBEVkJfREVWSUNFX0ZST05URU5EKTsKCgllcnIgPSBjaW5lcmd5dDJfcmVnaXN0ZXJfcmMoY2luZXJneXQyKTsKCWlmIChlcnIpCgkJZ290byBiYWlsb3V0OwoKCXJldHVybiAwOwoKYmFpbG91dDoKCWR2Yl9uZXRfcmVsZWFzZSgmY2luZXJneXQyLT5kdmJuZXQpOwoJZHZiX2RteGRldl9yZWxlYXNlKCZjaW5lcmd5dDItPmRteGRldik7CglkdmJfZG14X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZGVtdXgpOwoJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2luZXJneXQyLT5hZGFwdGVyKTsKCWNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzKGNpbmVyZ3l0Mik7CglrZnJlZShjaW5lcmd5dDIpOwoJcmV0dXJuIC1FTk9NRU07Cn0KCnN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CgoJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKCgljaW5lcmd5dDJfdW5yZWdpc3Rlcl9yYyhjaW5lcmd5dDIpOwoKCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yayk7Cgl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+cG9sbF93cSk7CgoJY2luZXJneXQyLT5kZW11eC5kbXguY2xvc2UoJmNpbmVyZ3l0Mi0+ZGVtdXguZG14KTsKCWNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gMTsKCglpZiAoIWF0b21pY19yZWFkKCZjaW5lcmd5dDItPmludXNlKSkKCQljaW5lcmd5dDJfdW5yZWdpc3RlcihjaW5lcmd5dDIpOwp9CgpzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKCglpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoMSkgewoJCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwoKCQljaW5lcmd5dDJfc3VzcGVuZF9yYyhjaW5lcmd5dDIpOwoJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yayk7CgkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtaW5nKQoJCQljaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlcihjaW5lcmd5dDIpOwoJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CgkJY2luZXJneXQyX3NsZWVwKGNpbmVyZ3l0MiwgMSk7Cgl9CgoJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjaW5lcmd5dDJfcmVzdW1lIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKewoJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CglzdHJ1Y3QgZHZidF9zZXRfcGFyYW1ldGVyc19tc2cgKnBhcmFtID0gJmNpbmVyZ3l0Mi0+cGFyYW07CgoJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQoJCXJldHVybiAtRVJFU1RBUlRTWVM7CgoJaWYgKCFjaW5lcmd5dDItPnNsZWVwaW5nKSB7CgkJY2luZXJneXQyX3NsZWVwKGNpbmVyZ3l0MiwgMCk7CgkJY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCAoY2hhciAqKSBwYXJhbSwgc2l6ZW9mKCpwYXJhbSksIE5VTEwsIDApOwoJCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZykKCQkJY2luZXJneXQyX3N0YXJ0X3N0cmVhbV94ZmVyKGNpbmVyZ3l0Mik7CgkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssIEhaLzIpOwoJfQoKCWNpbmVyZ3l0Ml9yZXN1bWVfcmMoY2luZXJneXQyKTsKCgltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgY2luZXJneXQyX3RhYmxlIFtdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwMzgpIH0sCgl7IDAgfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGNpbmVyZ3l0Ml90YWJsZSk7CgpzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY2luZXJneXQyX2RyaXZlciA9IHsKCS5uYW1lCT0gImNpbmVyZ3lUMiIsCgkucHJvYmUJPSBjaW5lcmd5dDJfcHJvYmUsCgkuZGlzY29ubmVjdAk9IGNpbmVyZ3l0Ml9kaXNjb25uZWN0LAoJLnN1c3BlbmQJPSBjaW5lcmd5dDJfc3VzcGVuZCwKCS5yZXN1bWUJCT0gY2luZXJneXQyX3Jlc3VtZSwKCS5pZF90YWJsZQk9IGNpbmVyZ3l0Ml90YWJsZQp9OwoKc3RhdGljIGludCBfX2luaXQgY2luZXJneXQyX2luaXQgKHZvaWQpCnsKCWludCBlcnI7CgoJaWYgKChlcnIgPSB1c2JfcmVnaXN0ZXIoJmNpbmVyZ3l0Ml9kcml2ZXIpKSA8IDApCgkJZHByaW50aygxLCAidXNiX3JlZ2lzdGVyKCkgZmFpbGVkISAoZXJyICVpKVxuIiwgZXJyKTsKCglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgY2luZXJneXQyX2V4aXQgKHZvaWQpCnsKCXVzYl9kZXJlZ2lzdGVyKCZjaW5lcmd5dDJfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQgKGNpbmVyZ3l0Ml9pbml0KTsKbW9kdWxlX2V4aXQgKGNpbmVyZ3l0Ml9leGl0KTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiSG9sZ2VyIFdhZWNodGxlciwgRGFuaWVsIE1hY2siKTsK