LyogcmFkZW9uX3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLQogKgogKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCiAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAogKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CiAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgogKi8KCiNpbmNsdWRlICJkcm1QLmgiCiNpbmNsdWRlICJkcm0uaCIKI2luY2x1ZGUgImRybV9zYXJlYS5oIgojaW5jbHVkZSAicmFkZW9uX2RybS5oIgojaW5jbHVkZSAicmFkZW9uX2Rydi5oIgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjbGllbnQgc3RhdGUgY2hlY2tpbmcgYW5kIGZpeHVwCiAqLwoKc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRybV9yYWRlb25fcHJpdmF0ZV90ICoKCQkJCQkJICAgIGRldl9wcml2LAoJCQkJCQkgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKCQkJCQkJICAgIHUzMiAqb2Zmc2V0KQp7Cgl1MzIgb2ZmID0gKm9mZnNldDsKCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CgoJaWYgKG9mZiA+PSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gJiYKCSAgICBvZmYgPCAoZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKyBkZXZfcHJpdi0+Z2FydF9zaXplKSkKCQlyZXR1cm4gMDsKCglyYWRlb25fcHJpdiA9IGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CglvZmYgKz0gcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YTsKCglEUk1fREVCVUcoIm9mZnNldCBmaXhlZCB1cCB0byAweCV4XG4iLCBvZmYpOwoKCWlmIChvZmYgPCBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gfHwKCSAgICBvZmYgPj0gKGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ICsgZGV2X3ByaXYtPmdhcnRfc2l6ZSkpCgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCgkqb2Zmc2V0ID0gb2ZmOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXRzKGRybV9yYWRlb25fcHJpdmF0ZV90ICoKCQkJCQkJICAgICBkZXZfcHJpdiwKCQkJCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAoJCQkJCQkgICAgIGludCBpZCwgdTMyICpkYXRhKQp7Cglzd2l0Y2ggKGlkKSB7CgoJY2FzZSBSQURFT05fRU1JVF9QUF9NSVNDOgoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgICZkYXRhWyhSQURFT05fUkIzRF9ERVBUSE9GRlNFVAoJCQkJCQkJIC0KCQkJCQkJCSBSQURFT05fUFBfTUlTQykgLwoJCQkJCQkJNF0pKSB7CgkJCURSTV9FUlJPUigiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iKTsKCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQl9CgkJYnJlYWs7CgoJY2FzZSBSQURFT05fRU1JVF9QUF9DTlRMOgoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgICZkYXRhWyhSQURFT05fUkIzRF9DT0xPUk9GRlNFVAoJCQkJCQkJIC0KCQkJCQkJCSBSQURFT05fUFBfQ05UTCkgLwoJCQkJCQkJNF0pKSB7CgkJCURSTV9FUlJPUigiSW52YWxpZCBjb2xvdXIgYnVmZmVyIG9mZnNldFxuIik7CgkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgkJfQoJCWJyZWFrOwoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8xOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMjoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzM6CgljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF80OgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNToKCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKCQkJCQkJICAmZGF0YVswXSkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIFIyMDAgdGV4dHVyZSBvZmZzZXRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCQlicmVhazsKCgljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzA6CgljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzE6CgljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzI6CgkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgJmRhdGFbKFJBREVPTl9QUF9UWE9GRlNFVF8wCgkJCQkJCQkgLQoJCQkJCQkJIFJBREVPTl9QUF9UWEZJTFRFUl8wKSAvCgkJCQkJCQk0XSkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIFIxMDAgdGV4dHVyZSBvZmZzZXRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCQlicmVhazsKCgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzE6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzI6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzM6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzQ6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzU6ewoJCQlpbnQgaTsKCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0CgkJCQkgICAgKGRldl9wcml2LCBmaWxwX3ByaXYsICZkYXRhW2ldKSkgewoJCQkJCURSTV9FUlJPUgoJCQkJCSAgICAoIkludmFsaWQgUjIwMCBjdWJpYyB0ZXh0dXJlIG9mZnNldFxuIik7CgkJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQkJCX0KCQkJfQoJCQlicmVhazsKCQl9CgoJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QwOgoJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QxOgoJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QyOnsKCQkJaW50IGk7CgkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwKCQkJCQkJCQkgIGZpbHBfcHJpdiwKCQkJCQkJCQkgICZkYXRhW2ldKSkgewoJCQkJCURSTV9FUlJPUgoJCQkJCSAgICAoIkludmFsaWQgUjEwMCBjdWJpYyB0ZXh0dXJlIG9mZnNldFxuIik7CgkJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQkJCX0KCQkJfQoJCX0KCQlicmVhazsKCgljYXNlIFJBREVPTl9FTUlUX1JCM0RfQ09MT1JQSVRDSDoKCWNhc2UgUkFERU9OX0VNSVRfUkVfTElORV9QQVRURVJOOgoJY2FzZSBSQURFT05fRU1JVF9TRV9MSU5FX1dJRFRIOgoJY2FzZSBSQURFT05fRU1JVF9QUF9MVU1fTUFUUklYOgoJY2FzZSBSQURFT05fRU1JVF9QUF9ST1RfTUFUUklYXzA6CgljYXNlIFJBREVPTl9FTUlUX1JCM0RfU1RFTkNJTFJFRk1BU0s6CgljYXNlIFJBREVPTl9FTUlUX1NFX1ZQT1JUX1hTQ0FMRToKCWNhc2UgUkFERU9OX0VNSVRfU0VfQ05UTDoKCWNhc2UgUkFERU9OX0VNSVRfU0VfQ05UTF9TVEFUVVM6CgljYXNlIFJBREVPTl9FTUlUX1JFX01JU0M6CgljYXNlIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8wOgoJY2FzZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMToKCWNhc2UgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzI6CgljYXNlIFJBREVPTl9FTUlUX1NFX1pCSUFTX0ZBQ1RPUjoKCWNhc2UgUkFERU9OX0VNSVRfU0VfVENMX09VVFBVVF9WVFhfRk1UOgoJY2FzZSBSQURFT05fRU1JVF9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRDoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF8xOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMjoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzM6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF80OgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNToKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzY6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF83OgoJY2FzZSBSMjAwX0VNSVRfVENMX0xJR0hUX01PREVMX0NUTF8wOgoJY2FzZSBSMjAwX0VNSVRfVEZBQ1RPUl8wOgoJY2FzZSBSMjAwX0VNSVRfVlRYX0ZNVF8wOgoJY2FzZSBSMjAwX0VNSVRfVkFQX0NUTDoKCWNhc2UgUjIwMF9FTUlUX01BVFJJWF9TRUxFQ1RfMDoKCWNhc2UgUjIwMF9FTUlUX1RFWF9QUk9DX0NUTF8yOgoJY2FzZSBSMjAwX0VNSVRfVENMX1VDUF9WRVJUX0JMRU5EX0NUTDoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8xOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMjoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzM6CgljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl80OgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfNToKCWNhc2UgUjIwMF9FTUlUX1ZURV9DTlRMOgoJY2FzZSBSMjAwX0VNSVRfT1VUUFVUX1ZUWF9DT01QX1NFTDoKCWNhc2UgUjIwMF9FTUlUX1BQX1RBTV9ERUJVRzM6CgljYXNlIFIyMDBfRU1JVF9QUF9DTlRMX1g6CgljYXNlIFIyMDBfRU1JVF9SQjNEX0RFUFRIWFlfT0ZGU0VUOgoJY2FzZSBSMjAwX0VNSVRfUkVfQVVYX1NDSVNTT1JfQ05UTDoKCWNhc2UgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMDoKCWNhc2UgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMToKCWNhc2UgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMjoKCWNhc2UgUjIwMF9FTUlUX1NFX1ZBUF9DTlRMX1NUQVRVUzoKCWNhc2UgUjIwMF9FTUlUX1NFX1ZUWF9TVEFURV9DTlRMOgoJY2FzZSBSMjAwX0VNSVRfUkVfUE9JTlRTSVpFOgoJY2FzZSBSMjAwX0VNSVRfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wOgoJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMDoKCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzE6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18yOgoJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMzoKCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzQ6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU181OgoJY2FzZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8wOgoJY2FzZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8xOgoJY2FzZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8yOgoJY2FzZSBSMjAwX0VNSVRfUkIzRF9CTEVORENPTE9SOgoJY2FzZSBSMjAwX0VNSVRfVENMX1BPSU5UX1NQUklURV9DTlRMOgoJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18wOgoJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18xOgoJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18yOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFJJX1BFUkZfQ05UTDoKCWNhc2UgUjIwMF9FTUlUX1BQX0FGU18wOgoJY2FzZSBSMjAwX0VNSVRfUFBfQUZTXzE6CgljYXNlIFIyMDBfRU1JVF9BVEZfVEZBQ1RPUjoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENUTEFMTF8xOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMjoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzM6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENUTEFMTF80OgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfNToKCQkvKiBUaGVzZSBwYWNrZXRzIGRvbid0IGNvbnRhaW4gbWVtb3J5IG9mZnNldHMgKi8KCQlicmVhazsKCglkZWZhdWx0OgoJCURSTV9FUlJPUigiVW5rbm93biBzdGF0ZSBwYWNrZXQgSUQgJWRcbiIsIGlkKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90ICoKCQkJCQkJICAgICBkZXZfcHJpdiwKCQkJCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAoJCQkJCQkgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLAoJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqY21kc3opCnsKCXUzMiAqY21kID0gKHUzMiAqKSBjbWRidWYtPmJ1ZjsKCgkqY21kc3ogPSAyICsgKChjbWRbMF0gJiBSQURFT05fQ1BfUEFDS0VUX0NPVU5UX01BU0spID4+IDE2KTsKCglpZiAoKGNtZFswXSAmIDB4YzAwMDAwMDApICE9IFJBREVPTl9DUF9QQUNLRVQzKSB7CgkJRFJNX0VSUk9SKCJOb3QgYSB0eXBlIDMgcGFja2V0XG4iKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWlmICg0ICogKmNtZHN6ID4gY21kYnVmLT5idWZzeikgewoJCURSTV9FUlJPUigiUGFja2V0IHNpemUgbGFyZ2VyIHRoYW4gc2l6ZSBvZiBkYXRhIHByb3ZpZGVkXG4iKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCS8qIENoZWNrIGNsaWVudCBzdGF0ZSBhbmQgZml4IGl0IHVwIGlmIG5lY2Vzc2FyeSAqLwoJaWYgKGNtZFswXSAmIDB4ODAwMCkgewkvKiBNU0Igb2Ygb3Bjb2RlOiBuZXh0IERXT1JEIEdVSV9DTlRMICovCgkJdTMyIG9mZnNldDsKCgkJaWYgKGNtZFsxXSAmIChSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTAoJCQkgICAgICB8IFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMKSkgewoJCQlvZmZzZXQgPSBjbWRbMl0gPDwgMTA7CgkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldAoJCQkgICAgKGRldl9wcml2LCBmaWxwX3ByaXYsICZvZmZzZXQpKSB7CgkJCQlEUk1fRVJST1IoIkludmFsaWQgZmlyc3QgcGFja2V0IG9mZnNldFxuIik7CgkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCQl9CgkJCWNtZFsyXSA9IChjbWRbMl0gJiAweGZmYzAwMDAwKSB8IG9mZnNldCA+PiAxMDsKCQl9CgoJCWlmICgoY21kWzFdICYgUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwpICYmCgkJICAgIChjbWRbMV0gJiBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCkpIHsKCQkJb2Zmc2V0ID0gY21kWzNdIDw8IDEwOwoJCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQKCQkJICAgIChkZXZfcHJpdiwgZmlscF9wcml2LCAmb2Zmc2V0KSkgewoJCQkJRFJNX0VSUk9SKCJJbnZhbGlkIHNlY29uZCBwYWNrZXQgb2Zmc2V0XG4iKTsKCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgkJCX0KCQkJY21kWzNdID0gKGNtZFszXSAmIDB4ZmZjMDAwMDApIHwgb2Zmc2V0ID4+IDEwOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBDUCBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKICovCgpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJhZGVvbl9lbWl0X2NsaXBfcmVjdChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAoJCQkJCSAgICAgZHJtX2NsaXBfcmVjdF90ICogYm94KQp7CglSSU5HX0xPQ0FMUzsKCglEUk1fREVCVUcoIiAgIGJveDogIHgxPSVkIHkxPSVkICB4Mj0lZCB5Mj0lZFxuIiwKCQkgIGJveC0+eDEsIGJveC0+eTEsIGJveC0+eDIsIGJveC0+eTIpOwoKCUJFR0lOX1JJTkcoNCk7CglPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SRV9UT1BfTEVGVCwgMCkpOwoJT1VUX1JJTkcoKGJveC0+eTEgPDwgMTYpIHwgYm94LT54MSk7CglPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SRV9XSURUSF9IRUlHSFQsIDApKTsKCU9VVF9SSU5HKCgoYm94LT55MiAtIDEpIDw8IDE2KSB8IChib3gtPngyIC0gMSkpOwoJQURWQU5DRV9SSU5HKCk7Cn0KCi8qIEVtaXQgMS4xIHN0YXRlCiAqLwpzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3N0YXRlKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCgkJCSAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKCQkJICAgICBkcm1fcmFkZW9uX2NvbnRleHRfcmVnc190ICogY3R4LAoJCQkgICAgIGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgKiB0ZXgsCgkJCSAgICAgdW5zaWduZWQgaW50IGRpcnR5KQp7CglSSU5HX0xPQ0FMUzsKCURSTV9ERUJVRygiZGlydHk9MHglMDh4XG4iLCBkaXJ0eSk7CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9DT05URVhUKSB7CgkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgJmN0eC0+cmIzZF9kZXB0aG9mZnNldCkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCgkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgJmN0eC0+cmIzZF9jb2xvcm9mZnNldCkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCgkJQkVHSU5fUklORygxNCk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfTUlTQywgNikpOwoJCU9VVF9SSU5HKGN0eC0+cHBfbWlzYyk7CgkJT1VUX1JJTkcoY3R4LT5wcF9mb2dfY29sb3IpOwoJCU9VVF9SSU5HKGN0eC0+cmVfc29saWRfY29sb3IpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF9ibGVuZGNudGwpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF9kZXB0aG9mZnNldCk7CgkJT1VUX1JJTkcoY3R4LT5yYjNkX2RlcHRocGl0Y2gpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF96c3RlbmNpbGNudGwpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0NOVEwsIDIpKTsKCQlPVVRfUklORyhjdHgtPnBwX2NudGwpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF9jbnRsKTsKCQlPVVRfUklORyhjdHgtPnJiM2RfY29sb3JvZmZzZXQpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1JCM0RfQ09MT1JQSVRDSCwgMCkpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF9jb2xvcnBpdGNoKTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX1ZFUlRGTVQpIHsKCQlCRUdJTl9SSU5HKDIpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX0NPT1JEX0ZNVCwgMCkpOwoJCU9VVF9SSU5HKGN0eC0+c2VfY29vcmRfZm10KTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX0xJTkUpIHsKCQlCRUdJTl9SSU5HKDUpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1JFX0xJTkVfUEFUVEVSTiwgMSkpOwoJCU9VVF9SSU5HKGN0eC0+cmVfbGluZV9wYXR0ZXJuKTsKCQlPVVRfUklORyhjdHgtPnJlX2xpbmVfc3RhdGUpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX0xJTkVfV0lEVEgsIDApKTsKCQlPVVRfUklORyhjdHgtPnNlX2xpbmVfd2lkdGgpOwoJCUFEVkFOQ0VfUklORygpOwoJfQoKCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfQlVNUE1BUCkgewoJCUJFR0lOX1JJTkcoNSk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfTFVNX01BVFJJWCwgMCkpOwoJCU9VVF9SSU5HKGN0eC0+cHBfbHVtX21hdHJpeCk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfUk9UX01BVFJJWF8wLCAxKSk7CgkJT1VUX1JJTkcoY3R4LT5wcF9yb3RfbWF0cml4XzApOwoJCU9VVF9SSU5HKGN0eC0+cHBfcm90X21hdHJpeF8xKTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX01BU0tTKSB7CgkJQkVHSU5fUklORyg0KTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAyKSk7CgkJT1VUX1JJTkcoY3R4LT5yYjNkX3N0ZW5jaWxyZWZtYXNrKTsKCQlPVVRfUklORyhjdHgtPnJiM2Rfcm9wY250bCk7CgkJT1VUX1JJTkcoY3R4LT5yYjNkX3BsYW5lbWFzayk7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WSUVXUE9SVCkgewoJCUJFR0lOX1JJTkcoNyk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVlBPUlRfWFNDQUxFLCA1KSk7CgkJT1VUX1JJTkcoY3R4LT5zZV92cG9ydF94c2NhbGUpOwoJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfeG9mZnNldCk7CgkJT1VUX1JJTkcoY3R4LT5zZV92cG9ydF95c2NhbGUpOwoJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfeW9mZnNldCk7CgkJT1VUX1JJTkcoY3R4LT5zZV92cG9ydF96c2NhbGUpOwoJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfem9mZnNldCk7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9TRVRVUCkgewoJCUJFR0lOX1JJTkcoNCk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfQ05UTCwgMCkpOwoJCU9VVF9SSU5HKGN0eC0+c2VfY250bCk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfQ05UTF9TVEFUVVMsIDApKTsKCQlPVVRfUklORyhjdHgtPnNlX2NudGxfc3RhdHVzKTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX01JU0MpIHsKCQlCRUdJTl9SSU5HKDIpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1JFX01JU0MsIDApKTsKCQlPVVRfUklORyhjdHgtPnJlX21pc2MpOwoJCUFEVkFOQ0VfUklORygpOwoJfQoKCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMCkgewoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgICZ0ZXhbMF0ucHBfdHhvZmZzZXQpKSB7CgkJCURSTV9FUlJPUigiSW52YWxpZCB0ZXh0dXJlIG9mZnNldCBmb3IgdW5pdCAwXG4iKTsKCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQl9CgoJCUJFR0lOX1JJTkcoOSk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfVFhGSUxURVJfMCwgNSkpOwoJCU9VVF9SSU5HKHRleFswXS5wcF90eGZpbHRlcik7CgkJT1VUX1JJTkcodGV4WzBdLnBwX3R4Zm9ybWF0KTsKCQlPVVRfUklORyh0ZXhbMF0ucHBfdHhvZmZzZXQpOwoJCU9VVF9SSU5HKHRleFswXS5wcF90eGNibGVuZCk7CgkJT1VUX1JJTkcodGV4WzBdLnBwX3R4YWJsZW5kKTsKCQlPVVRfUklORyh0ZXhbMF0ucHBfdGZhY3Rvcik7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfQk9SREVSX0NPTE9SXzAsIDApKTsKCQlPVVRfUklORyh0ZXhbMF0ucHBfYm9yZGVyX2NvbG9yKTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX1RFWDEpIHsKCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKCQkJCQkJICAmdGV4WzFdLnBwX3R4b2Zmc2V0KSkgewoJCQlEUk1fRVJST1IoIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMVxuIik7CgkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgkJfQoKCQlCRUdJTl9SSU5HKDkpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX1RYRklMVEVSXzEsIDUpKTsKCQlPVVRfUklORyh0ZXhbMV0ucHBfdHhmaWx0ZXIpOwoJCU9VVF9SSU5HKHRleFsxXS5wcF90eGZvcm1hdCk7CgkJT1VUX1JJTkcodGV4WzFdLnBwX3R4b2Zmc2V0KTsKCQlPVVRfUklORyh0ZXhbMV0ucHBfdHhjYmxlbmQpOwoJCU9VVF9SSU5HKHRleFsxXS5wcF90eGFibGVuZCk7CgkJT1VUX1JJTkcodGV4WzFdLnBwX3RmYWN0b3IpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xLCAwKSk7CgkJT1VUX1JJTkcodGV4WzFdLnBwX2JvcmRlcl9jb2xvcik7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgyKSB7CgkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgJnRleFsyXS5wcF90eG9mZnNldCkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDJcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCgkJQkVHSU5fUklORyg5KTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9UWEZJTFRFUl8yLCA1KSk7CgkJT1VUX1JJTkcodGV4WzJdLnBwX3R4ZmlsdGVyKTsKCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhmb3JtYXQpOwoJCU9VVF9SSU5HKHRleFsyXS5wcF90eG9mZnNldCk7CgkJT1VUX1JJTkcodGV4WzJdLnBwX3R4Y2JsZW5kKTsKCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhhYmxlbmQpOwoJCU9VVF9SSU5HKHRleFsyXS5wcF90ZmFjdG9yKTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMiwgMCkpOwoJCU9VVF9SSU5HKHRleFsyXS5wcF9ib3JkZXJfY29sb3IpOwoJCUFEVkFOQ0VfUklORygpOwoJfQoKCXJldHVybiAwOwp9CgovKiBFbWl0IDEuMiBzdGF0ZQogKi8Kc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZTIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKCQkJICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKCQkJICAgICAgZHJtX3JhZGVvbl9zdGF0ZV90ICogc3RhdGUpCnsKCVJJTkdfTE9DQUxTOwoKCWlmIChzdGF0ZS0+ZGlydHkgJiBSQURFT05fVVBMT0FEX1pCSUFTKSB7CgkJQkVHSU5fUklORygzKTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9aQklBU19GQUNUT1IsIDEpKTsKCQlPVVRfUklORyhzdGF0ZS0+Y29udGV4dDIuc2VfemJpYXNfZmFjdG9yKTsKCQlPVVRfUklORyhzdGF0ZS0+Y29udGV4dDIuc2VfemJpYXNfY29uc3RhbnQpOwoJCUFEVkFOQ0VfUklORygpOwoJfQoKCXJldHVybiByYWRlb25fZW1pdF9zdGF0ZShkZXZfcHJpdiwgZmlscF9wcml2LCAmc3RhdGUtPmNvbnRleHQsCgkJCQkgc3RhdGUtPnRleCwgc3RhdGUtPmRpcnR5KTsKfQoKLyogTmV3ICgxLjMpIHN0YXRlIG1lY2hhbmlzbS4gIDMgY29tbWFuZHMgKHBhY2tldCwgc2NhbGFyLCB2ZWN0b3IpIGluCiAqIDEuMyBjbWRidWZmZXJzIGFsbG93IGFsbCBwcmV2aW91cyBzdGF0ZSB0byBiZSB1cGRhdGVkIGFzIHdlbGwgYXMKICogdGhlIHRjbCBzY2FsYXIgYW5kIHZlY3RvciBhcmVhcy4KICovCnN0YXRpYyBzdHJ1Y3QgewoJaW50IHN0YXJ0OwoJaW50IGxlbjsKCWNvbnN0IGNoYXIgKm5hbWU7Cn0gcGFja2V0W1JBREVPTl9NQVhfU1RBVEVfUEFDS0VUU10gPSB7Cgl7UkFERU9OX1BQX01JU0MsIDcsICJSQURFT05fUFBfTUlTQyJ9LAoJe1JBREVPTl9QUF9DTlRMLCAzLCAiUkFERU9OX1BQX0NOVEwifSwKCXtSQURFT05fUkIzRF9DT0xPUlBJVENILCAxLCAiUkFERU9OX1JCM0RfQ09MT1JQSVRDSCJ9LAoJe1JBREVPTl9SRV9MSU5FX1BBVFRFUk4sIDIsICJSQURFT05fUkVfTElORV9QQVRURVJOIn0sCgl7UkFERU9OX1NFX0xJTkVfV0lEVEgsIDEsICJSQURFT05fU0VfTElORV9XSURUSCJ9LAoJe1JBREVPTl9QUF9MVU1fTUFUUklYLCAxLCAiUkFERU9OX1BQX0xVTV9NQVRSSVgifSwKCXtSQURFT05fUFBfUk9UX01BVFJJWF8wLCAyLCAiUkFERU9OX1BQX1JPVF9NQVRSSVhfMCJ9LAoJe1JBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAzLCAiUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0sifSwKCXtSQURFT05fU0VfVlBPUlRfWFNDQUxFLCA2LCAiUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSJ9LAoJe1JBREVPTl9TRV9DTlRMLCAyLCAiUkFERU9OX1NFX0NOVEwifSwKCXtSQURFT05fU0VfQ05UTF9TVEFUVVMsIDEsICJSQURFT05fU0VfQ05UTF9TVEFUVVMifSwKCXtSQURFT05fUkVfTUlTQywgMSwgIlJBREVPTl9SRV9NSVNDIn0sCgl7UkFERU9OX1BQX1RYRklMVEVSXzAsIDYsICJSQURFT05fUFBfVFhGSUxURVJfMCJ9LAoJe1JBREVPTl9QUF9CT1JERVJfQ09MT1JfMCwgMSwgIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCJ9LAoJe1JBREVPTl9QUF9UWEZJTFRFUl8xLCA2LCAiUkFERU9OX1BQX1RYRklMVEVSXzEifSwKCXtSQURFT05fUFBfQk9SREVSX0NPTE9SXzEsIDEsICJSQURFT05fUFBfQk9SREVSX0NPTE9SXzEifSwKCXtSQURFT05fUFBfVFhGSUxURVJfMiwgNiwgIlJBREVPTl9QUF9UWEZJTFRFUl8yIn0sCgl7UkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yLCAxLCAiUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yIn0sCgl7UkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiwgMiwgIlJBREVPTl9TRV9aQklBU19GQUNUT1IifSwKCXtSQURFT05fU0VfVENMX09VVFBVVF9WVFhfRk1ULCAxMSwgIlJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQifSwKCXtSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQsIDE3LAoJCSAgICAiUkFERU9OX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEIn0sCgl7UjIwMF9QUF9UWENCTEVORF8wLCA0LCAiUjIwMF9QUF9UWENCTEVORF8wIn0sCgl7UjIwMF9QUF9UWENCTEVORF8xLCA0LCAiUjIwMF9QUF9UWENCTEVORF8xIn0sCgl7UjIwMF9QUF9UWENCTEVORF8yLCA0LCAiUjIwMF9QUF9UWENCTEVORF8yIn0sCgl7UjIwMF9QUF9UWENCTEVORF8zLCA0LCAiUjIwMF9QUF9UWENCTEVORF8zIn0sCgl7UjIwMF9QUF9UWENCTEVORF80LCA0LCAiUjIwMF9QUF9UWENCTEVORF80In0sCgl7UjIwMF9QUF9UWENCTEVORF81LCA0LCAiUjIwMF9QUF9UWENCTEVORF81In0sCgl7UjIwMF9QUF9UWENCTEVORF82LCA0LCAiUjIwMF9QUF9UWENCTEVORF82In0sCgl7UjIwMF9QUF9UWENCTEVORF83LCA0LCAiUjIwMF9QUF9UWENCTEVORF83In0sCgl7UjIwMF9TRV9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAsIDYsICJSMjAwX1NFX1RDTF9MSUdIVF9NT0RFTF9DVExfMCJ9LAoJe1IyMDBfUFBfVEZBQ1RPUl8wLCA2LCAiUjIwMF9QUF9URkFDVE9SXzAifSwKCXtSMjAwX1NFX1ZUWF9GTVRfMCwgNCwgIlIyMDBfU0VfVlRYX0ZNVF8wIn0sCgl7UjIwMF9TRV9WQVBfQ05UTCwgMSwgIlIyMDBfU0VfVkFQX0NOVEwifSwKCXtSMjAwX1NFX1RDTF9NQVRSSVhfU0VMXzAsIDUsICJSMjAwX1NFX1RDTF9NQVRSSVhfU0VMXzAifSwKCXtSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiwgNSwgIlIyMDBfU0VfVENMX1RFWF9QUk9DX0NUTF8yIn0sCgl7UjIwMF9TRV9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMLCAxLCAiUjIwMF9TRV9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8wLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8wIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8xLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8xIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8yLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8yIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8zLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8zIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl80LCA2LCAiUjIwMF9QUF9UWEZJTFRFUl80In0sCgl7UjIwMF9QUF9UWEZJTFRFUl81LCA2LCAiUjIwMF9QUF9UWEZJTFRFUl81In0sCgl7UjIwMF9QUF9UWE9GRlNFVF8wLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8wIn0sCgl7UjIwMF9QUF9UWE9GRlNFVF8xLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8xIn0sCgl7UjIwMF9QUF9UWE9GRlNFVF8yLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8yIn0sCgl7UjIwMF9QUF9UWE9GRlNFVF8zLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8zIn0sCgl7UjIwMF9QUF9UWE9GRlNFVF80LCAxLCAiUjIwMF9QUF9UWE9GRlNFVF80In0sCgl7UjIwMF9QUF9UWE9GRlNFVF81LCAxLCAiUjIwMF9QUF9UWE9GRlNFVF81In0sCgl7UjIwMF9TRV9WVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRFX0NOVEwifSwKCXtSMjAwX1NFX1RDTF9PVVRQVVRfVlRYX0NPTVBfU0VMLCAxLCAiUjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCJ9LAoJe1IyMDBfUFBfVEFNX0RFQlVHMywgMSwgIlIyMDBfUFBfVEFNX0RFQlVHMyJ9LAoJe1IyMDBfUFBfQ05UTF9YLCAxLCAiUjIwMF9QUF9DTlRMX1gifSwKCXtSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQsIDEsICJSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQifSwKCXtSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwsIDEsICJSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwifSwKCXtSMjAwX1JFX1NDSVNTT1JfVExfMCwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8wIn0sCgl7UjIwMF9SRV9TQ0lTU09SX1RMXzEsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMSJ9LAoJe1IyMDBfUkVfU0NJU1NPUl9UTF8yLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzIifSwKCXtSMjAwX1NFX1ZBUF9DTlRMX1NUQVRVUywgMSwgIlIyMDBfU0VfVkFQX0NOVExfU1RBVFVTIn0sCgl7UjIwMF9TRV9WVFhfU1RBVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRYX1NUQVRFX0NOVEwifSwKCXtSMjAwX1JFX1BPSU5UU0laRSwgMSwgIlIyMDBfUkVfUE9JTlRTSVpFIn0sCgl7UjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAsIDQsCgkJICAgICJSMjAwX1NFX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCJ9LAoJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfMCwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMCJ9LAkvKiA2MSAqLwoJe1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wIn0sCS8qIDYyICovCgl7UjIwMF9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18xIn0sCgl7UjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzEifSwKCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzIifSwKCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8yLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiJ9LAoJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfMywgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMyJ9LAoJe1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8zIn0sCgl7UjIwMF9QUF9DVUJJQ19GQUNFU180LCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU180In0sCgl7UjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNCwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzQifSwKCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzUsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzUifSwKCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV81LCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSJ9LAoJe1JBREVPTl9QUF9URVhfU0laRV8wLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzAifSwKCXtSQURFT05fUFBfVEVYX1NJWkVfMSwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8xIn0sCgl7UkFERU9OX1BQX1RFWF9TSVpFXzIsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMiJ9LAoJe1IyMDBfUkIzRF9CTEVORENPTE9SLCAzLCAiUjIwMF9SQjNEX0JMRU5EQ09MT1IifSwKCXtSMjAwX1NFX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCwgMSwgIlIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMIn0sCgl7UkFERU9OX1BQX0NVQklDX0ZBQ0VTXzAsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCJ9LAoJe1JBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCJ9LAoJe1JBREVPTl9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEifSwKCXtSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QxXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QxXzAifSwKCXtSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18yIn0sCgl7UkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wIn0sCgl7UjIwMF9QUF9UUklfUEVSRiwgMiwgIlIyMDBfUFBfVFJJX1BFUkYifSwKCXtSMjAwX1BQX0FGU18wLCAzMiwgIlIyMDBfUFBfQUZTXzAifSwJLyogODUgKi8KCXtSMjAwX1BQX0FGU18xLCAzMiwgIlIyMDBfUFBfQUZTXzEifSwKCXtSMjAwX1BQX1RGQUNUT1JfMCwgOCwgIlIyMDBfQVRGX1RGQUNUT1IifSwKCXtSMjAwX1BQX1RYRklMVEVSXzAsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzAifSwKCXtSMjAwX1BQX1RYRklMVEVSXzEsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzEifSwKCXtSMjAwX1BQX1RYRklMVEVSXzIsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzIifSwKCXtSMjAwX1BQX1RYRklMVEVSXzMsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzMifSwKCXtSMjAwX1BQX1RYRklMVEVSXzQsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzQifSwKCXtSMjAwX1BQX1RYRklMVEVSXzUsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzUifSwKfTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKICovCgpzdGF0aWMgdm9pZCByYWRlb25fY2xlYXJfYm94KGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCgkJCSAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCByLCBpbnQgZywgaW50IGIpCnsKCXUzMiBjb2xvcjsKCVJJTkdfTE9DQUxTOwoKCXggKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLngxOwoJeSArPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Ym94ZXNbMF0ueTE7CgoJc3dpdGNoIChkZXZfcHJpdi0+Y29sb3JfZm10KSB7CgljYXNlIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCNTY1OgoJCWNvbG9yID0gKCgociAmIDB4ZjgpIDw8IDgpIHwKCQkJICgoZyAmIDB4ZmMpIDw8IDMpIHwgKChiICYgMHhmOCkgPj4gMykpOwoJCWJyZWFrOwoJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX0FSR0I4ODg4OgoJZGVmYXVsdDoKCQljb2xvciA9ICgoKDB4ZmYpIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYik7CgkJYnJlYWs7Cgl9CgoJQkVHSU5fUklORyg0KTsKCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX0RQX1dSSVRFX01BU0ssIDApKTsKCU9VVF9SSU5HKDB4ZmZmZmZmZmYpOwoJQURWQU5DRV9SSU5HKCk7CgoJQkVHSU5fUklORyg2KTsKCglPVVRfUklORyhDUF9QQUNLRVQzKFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0KSk7CglPVVRfUklORyhSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CgkJIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAoJCSAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8CgkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKCQkgUkFERU9OX1JPUDNfUCB8IFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyk7CgoJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkgewoJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOwoJfSBlbHNlIHsKCQlPVVRfUklORyhkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQpOwoJfQoKCU9VVF9SSU5HKGNvbG9yKTsKCglPVVRfUklORygoeCA8PCAxNikgfCB5KTsKCU9VVF9SSU5HKCh3IDw8IDE2KSB8IGgpOwoKCUFEVkFOQ0VfUklORygpOwp9CgpzdGF0aWMgdm9pZCByYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdikKewoJLyogQ29sbGFwc2UgdmFyaW91cyB0aGluZ3MgaW50byBhIHdhaXQgZmxhZyAtLSB0cnlpbmcgdG8KCSAqIGd1ZXNzIGlmIHVzZXJzcGFzZSBzbGVwdCAtLSBiZXR0ZXIganVzdCB0byBoYXZlIHRoZW0gdGVsbCB1cy4KCSAqLwoJaWYgKGRldl9wcml2LT5zdGF0cy5sYXN0X2ZyYW1lX3JlYWRzID4gMSB8fAoJICAgIGRldl9wcml2LT5zdGF0cy5sYXN0X2NsZWFyX3JlYWRzID4gZGV2X3ByaXYtPnN0YXRzLmNsZWFycykgewoJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKCX0KCglpZiAoZGV2X3ByaXYtPnN0YXRzLmZyZWVsaXN0X2xvb3BzKSB7CgkJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOwoJfQoKCS8qIFB1cnBsZSBib3ggZm9yIHBhZ2UgZmxpcHBpbmcKCSAqLwoJaWYgKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfRkxJUCkKCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCA0LCA0LCA4LCA4LCAyNTUsIDAsIDI1NSk7CgoJLyogUmVkIGJveCBpZiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGlkbGUgYXQgYW55IHBvaW50CgkgKi8KCWlmIChkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX1dBSVRfSURMRSkKCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCAxNiwgNCwgOCwgOCwgMjU1LCAwLCAwKTsKCgkvKiBCbHVlIGJveDogbG9zdCBjb250ZXh0PwoJICovCgoJLyogWWVsbG93IGJveCBmb3IgdGV4dHVyZSBzd2FwcwoJICovCglpZiAoZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9URVhUVVJFX0xPQUQpCgkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgNDAsIDQsIDgsIDgsIDI1NSwgMjU1LCAwKTsKCgkvKiBHcmVlbiBib3ggaWYgaGFyZHdhcmUgbmV2ZXIgaWRsZXMgKGFzIGZhciBhcyB3ZSBjYW4gdGVsbCkKCSAqLwoJaWYgKCEoZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9ETUFfSURMRSkpCgkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgNjQsIDQsIDgsIDgsIDAsIDI1NSwgMCk7CgoJLyogRHJhdyBiYXJzIGluZGljYXRpbmcgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCgkgKiAobm90IGEgZ3JlYXQgbWVhc3VyZSwgZWFzaWx5IGNvbmZ1c2VkKQoJICovCglpZiAoZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzKSB7CgkJaWYgKGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcyA+IDEwMCkKCQkJZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzID0gMTAwOwoKCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCA0LCAxNiwKCQkJCSBkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMsIDQsCgkJCQkgMTk2LCAxMjgsIDEyOCk7Cgl9CgoJbWVtc2V0KCZkZXZfcHJpdi0+c3RhdHMsIDAsIHNpemVvZihkZXZfcHJpdi0+c3RhdHMpKTsKCn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ1AgY29tbWFuZCBkaXNwYXRjaCBmdW5jdGlvbnMKICovCgpzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LAoJCQkJICAgICBkcm1fcmFkZW9uX2NsZWFyX3QgKiBjbGVhciwKCQkJCSAgICAgZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgKiBkZXB0aF9ib3hlcykKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwoJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90ICpkZXB0aF9jbGVhciA9ICZkZXZfcHJpdi0+ZGVwdGhfY2xlYXI7CglpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Cglkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKCXVuc2lnbmVkIGludCBmbGFncyA9IGNsZWFyLT5mbGFnczsKCXUzMiByYjNkX2NudGwgPSAwLCByYjNkX3N0ZW5jaWxyZWZtYXNrID0gMDsKCWludCBpOwoJUklOR19MT0NBTFM7CglEUk1fREVCVUcoImZsYWdzID0gMHgleFxuIiwgZmxhZ3MpOwoKCWRldl9wcml2LT5zdGF0cy5jbGVhcnMrKzsKCglpZiAoZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgJiYgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxKSB7CgkJdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOwoKCQlmbGFncyAmPSB+KFJBREVPTl9GUk9OVCB8IFJBREVPTl9CQUNLKTsKCQlpZiAodG1wICYgUkFERU9OX0ZST05UKQoJCQlmbGFncyB8PSBSQURFT05fQkFDSzsKCQlpZiAodG1wICYgUkFERU9OX0JBQ0spCgkJCWZsYWdzIHw9IFJBREVPTl9GUk9OVDsKCX0KCglpZiAoZmxhZ3MgJiAoUkFERU9OX0ZST05UIHwgUkFERU9OX0JBQ0spKSB7CgoJCUJFR0lOX1JJTkcoNCk7CgoJCS8qIEVuc3VyZSB0aGUgM0Qgc3RyZWFtIGlzIGlkbGUgYmVmb3JlIGRvaW5nIGEKCQkgKiAyRCBmaWxsIHRvIGNsZWFyIHRoZSBmcm9udCBvciBiYWNrIGJ1ZmZlci4KCQkgKi8KCQlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CgoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX0RQX1dSSVRFX01BU0ssIDApKTsKCQlPVVRfUklORyhjbGVhci0+Y29sb3JfbWFzayk7CgoJCUFEVkFOQ0VfUklORygpOwoKCQkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgoJCSAqLwoJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOwoKCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CgkJCWludCB4ID0gcGJveFtpXS54MTsKCQkJaW50IHkgPSBwYm94W2ldLnkxOwoJCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OwoJCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OwoKCQkJRFJNX0RFQlVHKCJkaXNwYXRjaCBjbGVhciAlZCwlZC0lZCwlZCBmbGFncyAweCV4XG4iLAoJCQkJICB4LCB5LCB3LCBoLCBmbGFncyk7CgoJCQlpZiAoZmxhZ3MgJiBSQURFT05fRlJPTlQpIHsKCQkJCUJFR0lOX1JJTkcoNik7CgoJCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMwoJCQkJCSAoUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQpKTsKCQkJCU9VVF9SSU5HKFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJCQkgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CgkJCQkJIChkZXZfcHJpdi0+CgkJCQkJICBjb2xvcl9mbXQgPDwgOCkgfAoJCQkJCSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CgkJCQkJIFJBREVPTl9ST1AzX1AgfAoJCQkJCSBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMpOwoKCQkJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOwoJCQkJT1VUX1JJTkcoY2xlYXItPmNsZWFyX2NvbG9yKTsKCgkJCQlPVVRfUklORygoeCA8PCAxNikgfCB5KTsKCQkJCU9VVF9SSU5HKCh3IDw8IDE2KSB8IGgpOwoKCQkJCUFEVkFOQ0VfUklORygpOwoJCQl9CgoJCQlpZiAoZmxhZ3MgJiBSQURFT05fQkFDSykgewoJCQkJQkVHSU5fUklORyg2KTsKCgkJCQlPVVRfUklORyhDUF9QQUNLRVQzCgkJCQkJIChSQURFT05fQ05UTF9QQUlOVF9NVUxUSSwgNCkpOwoJCQkJT1VUX1JJTkcoUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAoJCQkJCSBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKCQkJCQkgKGRldl9wcml2LT4KCQkJCQkgIGNvbG9yX2ZtdCA8PCA4KSB8CgkJCQkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKCQkJCQkgUkFERU9OX1JPUDNfUCB8CgkJCQkJIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyk7CgoJCQkJT1VUX1JJTkcoZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0KTsKCQkJCU9VVF9SSU5HKGNsZWFyLT5jbGVhcl9jb2xvcik7CgoJCQkJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CgkJCQlPVVRfUklORygodyA8PCAxNikgfCBoKTsKCgkJCQlBRFZBTkNFX1JJTkcoKTsKCQkJfQoJCX0KCX0KCgkvKiBoeXBlciB6IGNsZWFyICovCgkvKiBubyBkb2NzIGF2YWlsYWJsZSwgYmFzZWQgb24gcmV2ZXJzZSBlbmdlbmVlcmluZyBieSBTdGVwaGFuZSBNYXJjaGVzaW4gKi8KCWlmICgoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKQoJICAgICYmIChmbGFncyAmIFJBREVPTl9DTEVBUl9GQVNUWikpIHsKCgkJaW50IGk7CgkJaW50IGRlcHRocGl4cGVybGluZSA9CgkJICAgIGRldl9wcml2LT5kZXB0aF9mbXQgPT0KCQkgICAgUkFERU9OX0RFUFRIX0ZPUk1BVF8xNkJJVF9JTlRfWiA/IChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLwoJCQkJCQkgICAgICAgMikgOiAoZGV2X3ByaXYtPgoJCQkJCQkJICAgICBkZXB0aF9waXRjaCAvIDQpOwoKCQl1MzIgY2xlYXJtYXNrOwoKCQl1MzIgdGVtcFJCM0RfREVQVEhDTEVBUlZBTFVFID0gY2xlYXItPmNsZWFyX2RlcHRoIHwKCQkgICAgKChjbGVhci0+ZGVwdGhfbWFzayAmIDB4ZmYpIDw8IDI0KTsKCgkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KCQkgKiB3ZSBoYXZlbid0IHRvdWNoZWQgYW55ICJub3JtYWwiIHN0YXRlIC0gc3RpbGwgbmVlZCB0aGlzPwoJCSAqLwoJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOwoKCQlpZiAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSEFTX0hJRVJaKQoJCSAgICAmJiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSkgewoJCQkvKiBGSVhNRSA6IHJldmVyc2UgZW5naW5lZXIgdGhhdCBmb3IgUngwMCBjYXJkcyAqLwoJCQkvKiBGSVhNRSA6IHRoZSBtYXNrIHN1cHBvc2VkbHkgY29udGFpbnMgbG93LXJlcyB6IHZhbHVlcy4gU28gY2FuJ3Qgc2V0CgkJCSAgIGp1c3QgdG8gdGhlIG1heCAoMHhmZj8gb3IgYWN0dWFsbHkgMHgzZmZmPyksIG5lZWQgdG8gdGFrZSB6IGNsZWFyCgkJCSAgIHZhbHVlIGludG8gYWNjb3VudD8gKi8KCQkJLyogcGF0dGVybiBzZWVtcyB0byB3b3JrIGZvciByMTAwLCB0aG91Z2ggZ2V0IHNsaWdodAoJCQkgICByZW5kZXJpbmcgZXJyb3JzIHdpdGggZ2x4Z2VhcnMuIElmIGhpZXJ6IGlzIG5vdCBlbmFibGVkIGZvciByMTAwLAoJCQkgICBvbmx5IDQgYml0cyB3aGljaCBpbmRpY2F0ZSBjbGVhciAoMTUsMTYsMzEsMzIsIGFsbCB6ZXJvKSBtYXR0ZXIsIHRoZQoJCQkgICBvdGhlciBvbmVzIGFyZSBpZ25vcmVkLCBhbmQgdGhlIHNhbWUgY2xlYXIgbWFzayBjYW4gYmUgdXNlZC4gVGhhdCdzCgkJCSAgIHZlcnkgZGlmZmVyZW50IGJlaGF2aW91ciB0aGFuIFIyMDAgd2hpY2ggbmVlZHMgZGlmZmVyZW50IGNsZWFyIG1hc2sKCQkJICAgYW5kIGRpZmZlcmVudCBudW1iZXIgb2YgdGlsZXMgdG8gY2xlYXIgaWYgaGllcnogaXMgZW5hYmxlZCBvciBub3QgIT8hCgkJCSAqLwoJCQljbGVhcm1hc2sgPSAoMHhmZiA8PCAyMikgfCAoMHhmZiA8PCA2KSB8IDB4MDAzZjAwM2Y7CgkJfSBlbHNlIHsKCQkJLyogY2xlYXIgbWFzayA6IGNob29zZXMgdGhlIGNsZWFyaW5nIHBhdHRlcm4uCgkJCSAgIHJ2MjUwOiBjb3VsZCBiZSB1c2VkIHRvIGNsZWFyIG9ubHkgcGFydHMgb2YgbWFjcm90aWxlcwoJCQkgICAoYnV0IHRoYXQgd291bGQgZ2V0IHJlYWxseSBjb21wbGljYXRlZC4uLik/CgkJCSAgIGJpdCAwIGFuZCAxIChlaXRoZXIgb3IgYm90aCBvZiB0aGVtID8hPyEpIGFyZSB1c2VkIHRvCgkJCSAgIG5vdCBjbGVhciB0aWxlIChvciBtYXliZSBvbmUgb2YgdGhlIGJpdHMgaW5kaWNhdGVzIGlmIHRoZSB0aWxlIGlzCgkJCSAgIGNvbXByZXNzZWQgb3Igbm90KSwgYml0IDIgYW5kIDMgdG8gbm90IGNsZWFyIHRpbGUgMSwuLi4sLgoJCQkgICBQYXR0ZXJuIGlzIGFzIGZvbGxvd3M6CgkJCSAgIHwgMCwxIHwgNCw1IHwgOCw5IHwxMiwxM3wxNiwxN3wyMCwyMXwyNCwyNXwyOCwyOXwKCQkJICAgYml0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCSAgIHwgMiwzIHwgNiw3IHwxMCwxMXwxNCwxNXwxOCwxOXwyMiwyM3wyNiwyN3wzMCwzMXwKCQkJICAgcnYxMDA6IGNsZWFybWFzayBjb3ZlcnMgMng4IDR4MSB0aWxlcywgYnV0IG9uZSBjbGVhciBzdGlsbAoJCQkgICBjb3ZlcnMgMjU2IHBpeGVscyA/IT8KCQkJICovCgkJCWNsZWFybWFzayA9IDB4MDsKCQl9CgoJCUJFR0lOX1JJTkcoOCk7CgkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9ERVBUSENMRUFSVkFMVUUsCgkJCSAgICAgdGVtcFJCM0RfREVQVEhDTEVBUlZBTFVFKTsKCQkvKiB3aGF0IG9mZnNldCBpcyB0aGlzIGV4YWN0bHkgPyAqLwoJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9aTUFTS09GRlNFVCwgMCk7CgkJLyogbmVlZCBjdGxzdGF0LCBvdGhlcndpc2UgZ2V0IHNvbWUgc3RyYW5nZSBibGFjayBmbGlja2VyaW5nICovCgkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1pDQUNIRV9DVExTVEFULAoJCQkgICAgIFJBREVPTl9SQjNEX1pDX0ZMVVNIX0FMTCk7CgkJQURWQU5DRV9SSU5HKCk7CgoJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKCQkJaW50IHRpbGVvZmZzZXQsIG5ydGlsZXN4LCBucnRpbGVzeSwgajsKCQkJLyogaXQgbG9va3MgbGlrZSByMjAwIG5lZWRzIHJ2LXN0eWxlIGNsZWFycywgYXQgbGVhc3QgaWYgaGllcnogaXMgbm90IGVuYWJsZWQ/ICovCgkJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9IQVNfSElFUlopCgkJCSAgICAmJiAhKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMjAwKSkgewoJCQkJLyogRklYTUUgOiBmaWd1cmUgdGhpcyBvdXQgZm9yIHIyMDAgKHdoZW4gaGllcnogaXMgZW5hYmxlZCkuIE9yCgkJCQkgICBtYXliZSByMjAwIGFjdHVhbGx5IGRvZXNuJ3QgbmVlZCB0byBwdXQgdGhlIGxvdy1yZXMgeiB2YWx1ZSBpbnRvCgkJCQkgICB0aGUgdGlsZSBjYWNoZSBsaWtlIHIxMDAsIGJ1dCBqdXN0IG5lZWRzIHRvIGNsZWFyIHRoZSBoaS1sZXZlbCB6LWJ1ZmZlcj8KCQkJCSAgIFdvcmtzIGZvciBSMTAwLCBib3RoIHdpdGggaGllcnogYW5kIHdpdGhvdXQuCgkJCQkgICBSMTAwIHNlZW1zIHRvIG9wZXJhdGUgb24gMngxIDh4OCB0aWxlcywgYnV0Li4uCgkJCQkgICBvZGQ6IG9mZnNldC9ucnRpbGVzIG5lZWQgdG8gYmUgNjQgcGl4ICg0IGJsb2NrKSBhbGlnbmVkPyBQb3RlbnRpYWxseQoJCQkJICAgcHJvYmxlbWF0aWMgd2l0aCByZXNvbHV0aW9ucyB3aGljaCBhcmUgbm90IDY0IHBpeCBhbGlnbmVkPyAqLwoJCQkJdGlsZW9mZnNldCA9CgkJCQkgICAgKChwYm94W2ldLnkxID4+IDMpICogZGVwdGhwaXhwZXJsaW5lICsKCQkJCSAgICAgcGJveFtpXS54MSkgPj4gNjsKCQkJCW5ydGlsZXN4ID0KCQkJCSAgICAoKHBib3hbaV0ueDIgJiB+NjMpIC0KCQkJCSAgICAgKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OwoJCQkJbnJ0aWxlc3kgPQoJCQkJICAgIChwYm94W2ldLnkyID4+IDMpIC0gKHBib3hbaV0ueTEgPj4gMyk7CgkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKCQkJCQlCRUdJTl9SSU5HKDQpOwoJCQkJCU9VVF9SSU5HKENQX1BBQ0tFVDMKCQkJCQkJIChSQURFT05fM0RfQ0xFQVJfWk1BU0ssIDIpKTsKCQkJCQkvKiBmaXJzdCB0aWxlICovCgkJCQkJT1VUX1JJTkcodGlsZW9mZnNldCAqIDgpOwoJCQkJCS8qIHRoZSBudW1iZXIgb2YgdGlsZXMgdG8gY2xlYXIgKi8KCQkJCQlPVVRfUklORyhucnRpbGVzeCArIDQpOwoJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLwoJCQkJCU9VVF9SSU5HKGNsZWFybWFzayk7CgkJCQkJQURWQU5DRV9SSU5HKCk7CgkJCQkJdGlsZW9mZnNldCArPSBkZXB0aHBpeHBlcmxpbmUgPj4gNjsKCQkJCX0KCQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkgewoJCQkJLyogd29ya3MgZm9yIHJ2MjUwLiAqLwoJCQkJLyogZmluZCBmaXJzdCBtYWNybyB0aWxlICg4eDIgNHg0IHotcGl4ZWxzIG9uIHJ2MjUwKSAqLwoJCQkJdGlsZW9mZnNldCA9CgkJCQkgICAgKChwYm94W2ldLnkxID4+IDMpICogZGVwdGhwaXhwZXJsaW5lICsKCQkJCSAgICAgcGJveFtpXS54MSkgPj4gNTsKCQkJCW5ydGlsZXN4ID0KCQkJCSAgICAocGJveFtpXS54MiA+PiA1KSAtIChwYm94W2ldLngxID4+IDUpOwoJCQkJbnJ0aWxlc3kgPQoJCQkJICAgIChwYm94W2ldLnkyID4+IDMpIC0gKHBib3hbaV0ueTEgPj4gMyk7CgkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKCQkJCQlCRUdJTl9SSU5HKDQpOwoJCQkJCU9VVF9SSU5HKENQX1BBQ0tFVDMKCQkJCQkJIChSQURFT05fM0RfQ0xFQVJfWk1BU0ssIDIpKTsKCQkJCQkvKiBmaXJzdCB0aWxlICovCgkJCQkJLyoganVkZ2luZyBieSB0aGUgZmlyc3QgdGlsZSBvZmZzZXQgbmVlZGVkLCBjb3VsZCBwb3NzaWJseQoJCQkJCSAgIGRpcmVjdGx5IGFkZHJlc3MvY2xlYXIgNHg0IHRpbGVzIGluc3RlYWQgb2YgOHgyICogNHg0CgkJCQkJICAgbWFjcm8gdGlsZXMsIHRob3VnaCB3b3VsZCBzdGlsbCBuZWVkIGNsZWFyIG1hc2sgZm9yCgkJCQkJICAgcmlnaHQvYm90dG9tIGlmIHRydWVseSA0eDQgZ3JhbnVsYXJpdHkgaXMgZGVzaXJlZCA/ICovCgkJCQkJT1VUX1JJTkcodGlsZW9mZnNldCAqIDE2KTsKCQkJCQkvKiB0aGUgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyICovCgkJCQkJT1VUX1JJTkcobnJ0aWxlc3ggKyAxKTsKCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KCQkJCQlPVVRfUklORyhjbGVhcm1hc2spOwoJCQkJCUFEVkFOQ0VfUklORygpOwoJCQkJCXRpbGVvZmZzZXQgKz0gZGVwdGhwaXhwZXJsaW5lID4+IDU7CgkJCQl9CgkJCX0gZWxzZSB7CS8qIHJ2IDEwMCAqLwoJCQkJLyogcnYxMDAgbWlnaHQgbm90IG5lZWQgNjQgcGl4IGFsaWdubWVudCwgd2hvIGtub3dzICovCgkJCQkvKiBvZmZzZXRzIGFyZSwgaG1tLCB3ZWlyZCAqLwoJCQkJdGlsZW9mZnNldCA9CgkJCQkgICAgKChwYm94W2ldLnkxID4+IDQpICogZGVwdGhwaXhwZXJsaW5lICsKCQkJCSAgICAgcGJveFtpXS54MSkgPj4gNjsKCQkJCW5ydGlsZXN4ID0KCQkJCSAgICAoKHBib3hbaV0ueDIgJiB+NjMpIC0KCQkJCSAgICAgKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OwoJCQkJbnJ0aWxlc3kgPQoJCQkJICAgIChwYm94W2ldLnkyID4+IDQpIC0gKHBib3hbaV0ueTEgPj4gNCk7CgkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKCQkJCQlCRUdJTl9SSU5HKDQpOwoJCQkJCU9VVF9SSU5HKENQX1BBQ0tFVDMKCQkJCQkJIChSQURFT05fM0RfQ0xFQVJfWk1BU0ssIDIpKTsKCQkJCQlPVVRfUklORyh0aWxlb2Zmc2V0ICogMTI4KTsKCQkJCQkvKiB0aGUgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyICovCgkJCQkJT1VUX1JJTkcobnJ0aWxlc3ggKyA0KTsKCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KCQkJCQlPVVRfUklORyhjbGVhcm1hc2spOwoJCQkJCUFEVkFOQ0VfUklORygpOwoJCQkJCXRpbGVvZmZzZXQgKz0gZGVwdGhwaXhwZXJsaW5lID4+IDY7CgkJCQl9CgkJCX0KCQl9CgoJCS8qIFRPRE8gZG9uJ3QgYWx3YXlzIGNsZWFyIGFsbCBoaS1sZXZlbCB6IHRpbGVzICovCgkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0hBU19ISUVSWikKCQkgICAgJiYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMjAwKQoJCSAgICAmJiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSkKCQkJLyogcjEwMCBhbmQgY2FyZHMgd2l0aG91dCBoaWVyYXJjaGljYWwgei1idWZmZXIgaGF2ZSBubyBoaWdoLWxldmVsIHotYnVmZmVyICovCgkJCS8qIEZJWE1FIDogdGhlIG1hc2sgc3VwcG9zZWRseSBjb250YWlucyBsb3ctcmVzIHogdmFsdWVzLiBTbyBjYW4ndCBzZXQKCQkJICAganVzdCB0byB0aGUgbWF4ICgweGZmPyBvciBhY3R1YWxseSAweDNmZmY/KSwgbmVlZCB0byB0YWtlIHogY2xlYXIKCQkJICAgdmFsdWUgaW50byBhY2NvdW50PyAqLwoJCXsKCQkJQkVHSU5fUklORyg0KTsKCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fM0RfQ0xFQVJfSElaLCAyKSk7CgkJCU9VVF9SSU5HKDB4MCk7CS8qIEZpcnN0IHRpbGUgKi8KCQkJT1VUX1JJTkcoMHgzY2MwKTsKCQkJT1VUX1JJTkcoKDB4ZmYgPDwgMjIpIHwgKDB4ZmYgPDwgNikgfCAweDAwM2YwMDNmKTsKCQkJQURWQU5DRV9SSU5HKCk7CgkJfQoJfQoKCS8qIFdlIGhhdmUgdG8gY2xlYXIgdGhlIGRlcHRoIGFuZC9vciBzdGVuY2lsIGJ1ZmZlcnMgYnkKCSAqIHJlbmRlcmluZyBhIHF1YWQgaW50byBqdXN0IHRob3NlIGJ1ZmZlcnMuICBUaHVzLCB3ZSBoYXZlIHRvCgkgKiBtYWtlIHN1cmUgdGhlIDNEIGVuZ2luZSBpcyBjb25maWd1cmVkIGNvcnJlY3RseS4KCSAqLwoJaWYgKChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkgJiYKCSAgICAoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSkgewoKCQlpbnQgdGVtcFBQX0NOVEw7CgkJaW50IHRlbXBSRV9DTlRMOwoJCWludCB0ZW1wUkIzRF9DTlRMOwoJCWludCB0ZW1wUkIzRF9aU1RFTkNJTENOVEw7CgkJaW50IHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLOwoJCWludCB0ZW1wUkIzRF9QTEFORU1BU0s7CgkJaW50IHRlbXBTRV9DTlRMOwoJCWludCB0ZW1wU0VfVlRFX0NOVEw7CgkJaW50IHRlbXBTRV9WVFhfRk1UXzA7CgkJaW50IHRlbXBTRV9WVFhfRk1UXzE7CgkJaW50IHRlbXBTRV9WQVBfQ05UTDsKCQlpbnQgdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEw7CgoJCXRlbXBQUF9DTlRMID0gMDsKCQl0ZW1wUkVfQ05UTCA9IDA7CgoJCXRlbXBSQjNEX0NOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF9jbnRsOwoKCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF96c3RlbmNpbGNudGw7CgkJdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgPSAweDA7CgoJCXRlbXBTRV9DTlRMID0gZGVwdGhfY2xlYXItPnNlX2NudGw7CgoJCS8qIERpc2FibGUgVENMICovCgoJCXRlbXBTRV9WQVBfQ05UTCA9ICgJLyogU0VfVkFQX0NOVExfX0ZPUkNFX1dfVE9fT05FX01BU0sgfCAgKi8KCQkJCQkgICgweDkgPDwKCQkJCQkgICBTRV9WQVBfQ05UTF9fVkZfTUFYX1ZUWF9OVU1fX1NISUZUKSk7CgoJCXRlbXBSQjNEX1BMQU5FTUFTSyA9IDB4MDsKCgkJdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEwgPSAweDA7CgoJCXRlbXBTRV9WVEVfQ05UTCA9CgkJICAgIFNFX1ZURV9DTlRMX19WVFhfWFlfRk1UX01BU0sgfCBTRV9WVEVfQ05UTF9fVlRYX1pfRk1UX01BU0s7CgoJCS8qIFZlcnRleCBmb3JtYXQgKFgsIFksIFosIFcpICovCgkJdGVtcFNFX1ZUWF9GTVRfMCA9CgkJICAgIFNFX1ZUWF9GTVRfMF9fVlRYX1owX1BSRVNFTlRfTUFTSyB8CgkJICAgIFNFX1ZUWF9GTVRfMF9fVlRYX1cwX1BSRVNFTlRfTUFTSzsKCQl0ZW1wU0VfVlRYX0ZNVF8xID0gMHgwOwoKCQkvKgoJCSAqIERlcHRoIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCgkJICovCgkJaWYgKGZsYWdzICYgUkFERU9OX0RFUFRIKSB7CgkJCS8qIEVuYWJsZSBkZXB0aCBidWZmZXIgKi8KCQkJdGVtcFJCM0RfQ05UTCB8PSBSQURFT05fWl9FTkFCTEU7CgkJfSBlbHNlIHsKCQkJLyogRGlzYWJsZSBkZXB0aCBidWZmZXIgKi8KCQkJdGVtcFJCM0RfQ05UTCAmPSB+UkFERU9OX1pfRU5BQkxFOwoJCX0KCgkJLyoKCQkgKiBTdGVuY2lsIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCgkJICovCgkJaWYgKGZsYWdzICYgUkFERU9OX1NURU5DSUwpIHsKCQkJdGVtcFJCM0RfQ05UTCB8PSBSQURFT05fU1RFTkNJTF9FTkFCTEU7CgkJCXRlbXBSQjNEX1NURU5DSUxSRUZNQVNLID0gY2xlYXItPmRlcHRoX21hc2s7CgkJfSBlbHNlIHsKCQkJdGVtcFJCM0RfQ05UTCAmPSB+UkFERU9OX1NURU5DSUxfRU5BQkxFOwoJCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IDB4MDAwMDAwMDA7CgkJfQoKCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0NPTVBfWkJVRikgewoJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFIHwKCQkJICAgIFJBREVPTl9aX0RFQ09NUFJFU1NJT05fRU5BQkxFOwoJCX0KCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSB7CgkJCXRlbXBSQjNEX1pTVEVOQ0lMQ05UTCB8PSBSQURFT05fWl9ISUVSQVJDSFlfRU5BQkxFOwoJCX0KCgkJQkVHSU5fUklORygyNik7CgkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoKCQlPVVRfUklOR19SRUcoUkFERU9OX1BQX0NOVEwsIHRlbXBQUF9DTlRMKTsKCQlPVVRfUklOR19SRUcoUjIwMF9SRV9DTlRMLCB0ZW1wUkVfQ05UTCk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX0NOVEwsIHRlbXBSQjNEX0NOVEwpOwoJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9aU1RFTkNJTENOVEwsIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLAoJCQkgICAgIHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLKTsKCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfUExBTkVNQVNLLCB0ZW1wUkIzRF9QTEFORU1BU0spOwoJCU9VVF9SSU5HX1JFRyhSQURFT05fU0VfQ05UTCwgdGVtcFNFX0NOVEwpOwoJCU9VVF9SSU5HX1JFRyhSMjAwX1NFX1ZURV9DTlRMLCB0ZW1wU0VfVlRFX0NOVEwpOwoJCU9VVF9SSU5HX1JFRyhSMjAwX1NFX1ZUWF9GTVRfMCwgdGVtcFNFX1ZUWF9GTVRfMCk7CgkJT1VUX1JJTkdfUkVHKFIyMDBfU0VfVlRYX0ZNVF8xLCB0ZW1wU0VfVlRYX0ZNVF8xKTsKCQlPVVRfUklOR19SRUcoUjIwMF9TRV9WQVBfQ05UTCwgdGVtcFNFX1ZBUF9DTlRMKTsKCQlPVVRfUklOR19SRUcoUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMLCB0ZW1wUkVfQVVYX1NDSVNTT1JfQ05UTCk7CgkJQURWQU5DRV9SSU5HKCk7CgoJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCgkJICovCgkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CgoJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKCgkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0KCQkJICogIHNldHMgdG9wLWxlZnQ/CgkJCSAqLwoJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CgoJCQlCRUdJTl9SSU5HKDE0KTsKCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSMjAwXzNEX0RSQVdfSU1NRF8yLCAxMikpOwoJCQlPVVRfUklORygoUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1QgfAoJCQkJICBSQURFT05fUFJJTV9XQUxLX1JJTkcgfAoJCQkJICAoMyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSkpOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMV0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0pOwoJCQlPVVRfUklORygweDNmODAwMDAwKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdKTsKCQkJT1VUX1JJTkcoMHgzZjgwMDAwMCk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gyXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSk7CgkJCU9VVF9SSU5HKDB4M2Y4MDAwMDApOwoJCQlBRFZBTkNFX1JJTkcoKTsKCQl9Cgl9IGVsc2UgaWYgKChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpKSB7CgoJCWludCB0ZW1wUkIzRF9aU1RFTkNJTENOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF96c3RlbmNpbGNudGw7CgoJCXJiM2RfY250bCA9IGRlcHRoX2NsZWFyLT5yYjNkX2NudGw7CgoJCWlmIChmbGFncyAmIFJBREVPTl9ERVBUSCkgewoJCQlyYjNkX2NudGwgfD0gUkFERU9OX1pfRU5BQkxFOwoJCX0gZWxzZSB7CgkJCXJiM2RfY250bCAmPSB+UkFERU9OX1pfRU5BQkxFOwoJCX0KCgkJaWYgKGZsYWdzICYgUkFERU9OX1NURU5DSUwpIHsKCQkJcmIzZF9jbnRsIHw9IFJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKCQkJcmIzZF9zdGVuY2lscmVmbWFzayA9IGNsZWFyLT5kZXB0aF9tYXNrOwkvKiBtaXNuYW1lZCBmaWVsZCAqLwoJCX0gZWxzZSB7CgkJCXJiM2RfY250bCAmPSB+UkFERU9OX1NURU5DSUxfRU5BQkxFOwoJCQlyYjNkX3N0ZW5jaWxyZWZtYXNrID0gMHgwMDAwMDAwMDsKCQl9CgoJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfQ09NUF9aQlVGKSB7CgkJCXRlbXBSQjNEX1pTVEVOQ0lMQ05UTCB8PSBSQURFT05fWl9DT01QUkVTU0lPTl9FTkFCTEUgfAoJCQkgICAgUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CgkJfQoJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfSElFUlopIHsKCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEU7CgkJfQoKCQlCRUdJTl9SSU5HKDEzKTsKCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CgoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0NOVEwsIDEpKTsKCQlPVVRfUklORygweDAwMDAwMDAwKTsKCQlPVVRfUklORyhyYjNkX2NudGwpOwoKCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfWlNURU5DSUxDTlRMLCB0ZW1wUkIzRF9aU1RFTkNJTENOVEwpOwoJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSywgcmIzZF9zdGVuY2lscmVmbWFzayk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1BMQU5FTUFTSywgMHgwMDAwMDAwMCk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9TRV9DTlRMLCBkZXB0aF9jbGVhci0+c2VfY250bCk7CgkJQURWQU5DRV9SSU5HKCk7CgoJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCgkJICovCgkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CgoJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKCgkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0KCQkJICogIHNldHMgdG9wLWxlZnQ/CgkJCSAqLwoJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CgoJCQlCRUdJTl9SSU5HKDE1KTsKCgkJCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OXzNEX0RSQVdfSU1NRCwgMTMpKTsKCQkJT1VUX1JJTkcoUkFERU9OX1ZUWF9aX1BSRVNFTlQgfAoJCQkJIFJBREVPTl9WVFhfUEtDT0xPUl9QUkVTRU5UKTsKCQkJT1VUX1JJTkcoKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKCQkJCSAgUkFERU9OX1BSSU1fV0FMS19SSU5HIHwKCQkJCSAgUkFERU9OX01BT1NfRU5BQkxFIHwKCQkJCSAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAoJCQkJICAoMyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSkpOwoKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTFdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdKTsKCQkJT1VUX1JJTkcoMHgwKTsKCgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSk7CgkJCU9VVF9SSU5HKDB4MCk7CgoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMl0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0pOwoJCQlPVVRfUklORygweDApOwoKCQkJQURWQU5DRV9SSU5HKCk7CgkJfQoJfQoKCS8qIEluY3JlbWVudCB0aGUgY2xlYXIgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAoJICogd2FpdCBvbiB0aGlzIHZhbHVlIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBjbGVhciBpb2N0bC4gIFdlCgkgKiBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY2FyZCdzIHNvIGRhbW5lZCBmYXN0Li4uCgkgKi8KCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKys7CgoJQkVHSU5fUklORyg0KTsKCglSQURFT05fQ0xFQVJfQUdFKGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKTsKCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKCglBRFZBTkNFX1JJTkcoKTsKfQoKc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQp7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CglpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Cglkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKCWludCBpOwoJUklOR19MT0NBTFM7CglEUk1fREVCVUcoIlxuIik7CgoJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KCSAqLwoJaWYgKGRldl9wcml2LT5kb19ib3hlcykKCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZGV2X3ByaXYpOwoKCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgZGlzcGF0Y2hpbmcgdGhlIGJpdGJsdC4KCSAqIFRoaXMgd2lsbCBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBiZXR3ZWVuIHRoZSB0d28gc3RyZWFtcy4KCSAqLwoJQkVHSU5fUklORygyKTsKCglSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CgoJQURWQU5DRV9SSU5HKCk7CgoJZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgewoJCWludCB4ID0gcGJveFtpXS54MTsKCQlpbnQgeSA9IHBib3hbaV0ueTE7CgkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OwoKCQlEUk1fREVCVUcoImRpc3BhdGNoIHN3YXAgJWQsJWQtJWQsJWRcbiIsIHgsIHksIHcsIGgpOwoKCQlCRUdJTl9SSU5HKDcpOwoKCQlPVVRfUklORyhDUF9QQUNLRVQzKFJBREVPTl9DTlRMX0JJVEJMVF9NVUxUSSwgNSkpOwoJCU9VVF9SSU5HKFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CgkJCSAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8CgkJCSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CgkJCSBSQURFT05fUk9QM19TIHwKCQkJIFJBREVPTl9EUF9TUkNfU09VUkNFX01FTU9SWSB8CgkJCSBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgfCBSQURFT05fR01DX1dSX01TS19ESVMpOwoKCQkvKiBNYWtlIHRoaXMgd29yayBldmVuIGlmIGZyb250ICYgYmFjayBhcmUgZmxpcHBlZDoKCQkgKi8KCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSB7CgkJCU9VVF9SSU5HKGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCk7CgkJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOwoJCX0gZWxzZSB7CgkJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOwoJCQlPVVRfUklORyhkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQpOwoJCX0KCgkJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CgkJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CgkJT1VUX1JJTkcoKHcgPDwgMTYpIHwgaCk7CgoJCUFEVkFOQ0VfUklORygpOwoJfQoKCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAoJICogdGhyb3R0bGUgdGhlIGZyYW1lcmF0ZSBieSB3YWl0aW5nIGZvciB0aGlzIHZhbHVlIGJlZm9yZQoJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KCSAqLwoJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUrKzsKCglCRUdJTl9SSU5HKDQpOwoKCVJBREVPTl9GUkFNRV9BR0UoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUpOwoJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoKCUFEVkFOQ0VfUklORygpOwp9CgpzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fc2FyZWFfdCAqc2FyZWEgPSAoZHJtX3NhcmVhX3QgKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CglpbnQgb2Zmc2V0ID0gKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkKCSAgICA/IGRldl9wcml2LT5mcm9udF9vZmZzZXQgOiBkZXZfcHJpdi0+YmFja19vZmZzZXQ7CglSSU5HX0xPQ0FMUzsKCURSTV9ERUJVRygiJXM6IHBhZ2U9JWQgcGZDdXJyZW50UGFnZT0lZFxuIiwKCQkgIF9fRlVOQ1RJT05fXywKCQkgIGRldl9wcml2LT5jdXJyZW50X3BhZ2UsIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlKTsKCgkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgoJICovCglpZiAoZGV2X3ByaXYtPmRvX2JveGVzKSB7CgkJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfRkxJUDsKCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZGV2X3ByaXYpOwoJfQoKCS8qIFVwZGF0ZSB0aGUgZnJhbWUgb2Zmc2V0cyBmb3IgYm90aCBDUlRDcwoJICovCglCRUdJTl9SSU5HKDYpOwoKCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKCU9VVF9SSU5HX1JFRyhSQURFT05fQ1JUQ19PRkZTRVQsCgkJICAgICAoKHNhcmVhLT5mcmFtZS55ICogZGV2X3ByaXYtPmZyb250X3BpdGNoICsKCQkgICAgICAgc2FyZWEtPmZyYW1lLnggKiAoZGV2X3ByaXYtPmNvbG9yX2ZtdCAtIDIpKSAmIH43KQoJCSAgICAgKyBvZmZzZXQpOwoJT1VUX1JJTkdfUkVHKFJBREVPTl9DUlRDMl9PRkZTRVQsIGRldl9wcml2LT5zYXJlYV9wcml2LT5jcnRjMl9iYXNlCgkJICAgICArIG9mZnNldCk7CgoJQURWQU5DRV9SSU5HKCk7CgoJLyogSW5jcmVtZW50IHRoZSBmcmFtZSBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CgkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCgkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgoJICovCglkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOwoJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0KCSAgICAxIC0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKCglCRUdJTl9SSU5HKDIpOwoKCVJBREVPTl9GUkFNRV9BR0UoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUpOwoKCUFEVkFOQ0VfUklORygpOwp9CgpzdGF0aWMgaW50IGJhZF9wcmltX3ZlcnRleF9ucihpbnQgcHJpbWl0aXZlLCBpbnQgbnIpCnsKCXN3aXRjaCAocHJpbWl0aXZlICYgUkFERU9OX1BSSU1fVFlQRV9NQVNLKSB7CgljYXNlIFJBREVPTl9QUklNX1RZUEVfTk9ORToKCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9QT0lOVDoKCQlyZXR1cm4gbnIgPCAxOwoJY2FzZSBSQURFT05fUFJJTV9UWVBFX0xJTkU6CgkJcmV0dXJuIChuciAmIDEpIHx8IG5yID09IDA7CgljYXNlIFJBREVPTl9QUklNX1RZUEVfTElORV9TVFJJUDoKCQlyZXR1cm4gbnIgPCAyOwoJY2FzZSBSQURFT05fUFJJTV9UWVBFX1RSSV9MSVNUOgoJY2FzZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfUE9JTlRfTElTVDoKCWNhc2UgUkFERU9OX1BSSU1fVFlQRV8zVlJUX0xJTkVfTElTVDoKCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1Q6CgkJcmV0dXJuIG5yICUgMyB8fCBuciA9PSAwOwoJY2FzZSBSQURFT05fUFJJTV9UWVBFX1RSSV9GQU46CgljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX1NUUklQOgoJCXJldHVybiBuciA8IDM7CglkZWZhdWx0OgoJCXJldHVybiAxOwoJfQp9Cgp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25lZCBpbnQgc3RhcnQ7Cgl1bnNpZ25lZCBpbnQgZmluaXNoOwoJdW5zaWduZWQgaW50IHByaW07Cgl1bnNpZ25lZCBpbnQgbnVtdmVydHM7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKfSBkcm1fcmFkZW9uX3RjbF9wcmltX3Q7CgpzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwKCQkJCSAgICAgIGRybV9idWZfdCAqIGJ1ZiwKCQkJCSAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqIHByaW0pCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKCWludCBvZmZzZXQgPSBkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCArIGJ1Zi0+b2Zmc2V0ICsgcHJpbS0+c3RhcnQ7CglpbnQgbnVtdmVydHMgPSAoaW50KXByaW0tPm51bXZlcnRzOwoJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwoJaW50IGkgPSAwOwoJUklOR19MT0NBTFM7CgoJRFJNX0RFQlVHKCJod3ByaW0gMHgleCB2Zm10IDB4JXggJWQuLiVkICVkIHZlcnRzXG4iLAoJCSAgcHJpbS0+cHJpbSwKCQkgIHByaW0tPnZjX2Zvcm1hdCwgcHJpbS0+c3RhcnQsIHByaW0tPmZpbmlzaCwgcHJpbS0+bnVtdmVydHMpOwoKCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIocHJpbS0+cHJpbSwgcHJpbS0+bnVtdmVydHMpKSB7CgkJRFJNX0VSUk9SKCJiYWQgcHJpbSAleCBudW12ZXJ0cyAlZFxuIiwKCQkJICBwcmltLT5wcmltLCBwcmltLT5udW12ZXJ0cyk7CgkJcmV0dXJuOwoJfQoKCWRvIHsKCQkvKiBFbWl0IHRoZSBuZXh0IGNsaXByZWN0ICovCgkJaWYgKGkgPCBuYm94KSB7CgkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdChkZXZfcHJpdiwgJnNhcmVhX3ByaXYtPmJveGVzW2ldKTsKCQl9CgoJCS8qIEVtaXQgdGhlIHZlcnRleCBidWZmZXIgcmVuZGVyaW5nIGNvbW1hbmRzICovCgkJQkVHSU5fUklORyg1KTsKCgkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCAzKSk7CgkJT1VUX1JJTkcob2Zmc2V0KTsKCQlPVVRfUklORyhudW12ZXJ0cyk7CgkJT1VUX1JJTkcocHJpbS0+dmNfZm9ybWF0KTsKCQlPVVRfUklORyhwcmltLT5wcmltIHwgUkFERU9OX1BSSU1fV0FMS19MSVNUIHwKCQkJIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKCQkJIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFIHwKCQkJIChudW12ZXJ0cyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSk7CgoJCUFEVkFOQ0VfUklORygpOwoKCQlpKys7Cgl9IHdoaWxlIChpIDwgbmJveCk7Cn0KCnN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwoJUklOR19MT0NBTFM7CgoJYnVmX3ByaXYtPmFnZSA9ICsrZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CgoJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KCUJFR0lOX1JJTkcoMik7CglSQURFT05fRElTUEFUQ0hfQUdFKGJ1Zl9wcml2LT5hZ2UpOwoJQURWQU5DRV9SSU5HKCk7CgoJYnVmLT5wZW5kaW5nID0gMTsKCWJ1Zi0+dXNlZCA9IDA7Cn0KCnN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChkcm1fZGV2aWNlX3QgKiBkZXYsCgkJCQkJZHJtX2J1Zl90ICogYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglSSU5HX0xPQ0FMUzsKCURSTV9ERUJVRygiaW5kaXJlY3Q6IGJ1Zj0lZCBzPTB4JXggZT0weCV4XG4iLCBidWYtPmlkeCwgc3RhcnQsIGVuZCk7CgoJaWYgKHN0YXJ0ICE9IGVuZCkgewoJCWludCBvZmZzZXQgPSAoZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQKCQkJICAgICAgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKCQlpbnQgZHdvcmRzID0gKGVuZCAtIHN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKCgkJLyogSW5kaXJlY3QgYnVmZmVyIGRhdGEgbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZgoJCSAqIGR3b3Jkcywgc28gaWYgd2UndmUgYmVlbiBnaXZlbiBhbiBvZGQgbnVtYmVyIHdlIG11c3QKCQkgKiBwYWQgdGhlIGRhdGEgd2l0aCBhIFR5cGUtMiBDUCBwYWNrZXQuCgkJICovCgkJaWYgKGR3b3JkcyAmIDEpIHsKCQkJdTMyICpkYXRhID0gKHUzMiAqKQoJCQkgICAgKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCgkJCSAgICAgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKCQkJZGF0YVtkd29yZHMrK10gPSBSQURFT05fQ1BfUEFDS0VUMjsKCQl9CgoJCS8qIEZpcmUgb2ZmIHRoZSBpbmRpcmVjdCBidWZmZXIgKi8KCQlCRUdJTl9SSU5HKDMpOwoKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9DUF9JQl9CQVNFLCAxKSk7CgkJT1VUX1JJTkcob2Zmc2V0KTsKCQlPVVRfUklORyhkd29yZHMpOwoKCQlBRFZBTkNFX1JJTkcoKTsKCX0KfQoKc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoZHJtX2RldmljZV90ICogZGV2LAoJCQkJICAgICAgIGRybV9idWZfdCAqIGVsdF9idWYsCgkJCQkgICAgICAgZHJtX3JhZGVvbl90Y2xfcHJpbV90ICogcHJpbSkKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwoJaW50IG9mZnNldCA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0ICsgcHJpbS0+b2Zmc2V0OwoJdTMyICpkYXRhOwoJaW50IGR3b3JkczsKCWludCBpID0gMDsKCWludCBzdGFydCA9IHByaW0tPnN0YXJ0ICsgUkFERU9OX0lOREVYX1BSSU1fT0ZGU0VUOwoJaW50IGNvdW50ID0gKHByaW0tPmZpbmlzaCAtIHN0YXJ0KSAvIHNpemVvZih1MTYpOwoJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwoKCURSTV9ERUJVRygiaHdwcmltIDB4JXggdmZtdCAweCV4ICVkLi4lZCBvZmZzZXQ6ICV4IG5yICVkXG4iLAoJCSAgcHJpbS0+cHJpbSwKCQkgIHByaW0tPnZjX2Zvcm1hdCwKCQkgIHByaW0tPnN0YXJ0LCBwcmltLT5maW5pc2gsIHByaW0tPm9mZnNldCwgcHJpbS0+bnVtdmVydHMpOwoKCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIocHJpbS0+cHJpbSwgY291bnQpKSB7CgkJRFJNX0VSUk9SKCJiYWQgcHJpbSAleCBjb3VudCAlZFxuIiwgcHJpbS0+cHJpbSwgY291bnQpOwoJCXJldHVybjsKCX0KCglpZiAoc3RhcnQgPj0gcHJpbS0+ZmluaXNoIHx8IChwcmltLT5zdGFydCAmIDB4NykpIHsKCQlEUk1fRVJST1IoImJ1ZmZlciBwcmltICVkXG4iLCBwcmltLT5wcmltKTsKCQlyZXR1cm47Cgl9CgoJZHdvcmRzID0gKHByaW0tPmZpbmlzaCAtIHByaW0tPnN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKCglkYXRhID0gKHUzMiAqKSAoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKwoJCQllbHRfYnVmLT5vZmZzZXQgKyBwcmltLT5zdGFydCk7CgoJZGF0YVswXSA9IENQX1BBQ0tFVDMoUkFERU9OXzNEX1JORFJfR0VOX0lORFhfUFJJTSwgZHdvcmRzIC0gMik7CglkYXRhWzFdID0gb2Zmc2V0OwoJZGF0YVsyXSA9IHByaW0tPm51bXZlcnRzOwoJZGF0YVszXSA9IHByaW0tPnZjX2Zvcm1hdDsKCWRhdGFbNF0gPSAocHJpbS0+cHJpbSB8CgkJICAgUkFERU9OX1BSSU1fV0FMS19JTkQgfAoJCSAgIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKCQkgICBSQURFT05fVlRYX0ZNVF9SQURFT05fTU9ERSB8CgkJICAgKGNvdW50IDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpKTsKCglkbyB7CgkJaWYgKGkgPCBuYm94KQoJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CgoJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChkZXYsIGVsdF9idWYsCgkJCQkJICAgIHByaW0tPnN0YXJ0LCBwcmltLT5maW5pc2gpOwoKCQlpKys7Cgl9IHdoaWxlIChpIDwgbmJveCk7Cgp9CgojZGVmaW5lIFJBREVPTl9NQVhfVEVYVFVSRV9TSVpFIFJBREVPTl9CVUZGRVJfU0laRQoKc3RhdGljIGludCByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZShEUk1GSUxFIGZpbHAsCgkJCQkgICAgICBkcm1fZGV2aWNlX3QgKiBkZXYsCgkJCQkgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfdCAqIHRleCwKCQkJCSAgICAgIGRybV9yYWRlb25fdGV4X2ltYWdlX3QgKiBpbWFnZSkKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKCWRybV9idWZfdCAqYnVmOwoJdTMyIGZvcm1hdDsKCXUzMiAqYnVmZmVyOwoJY29uc3QgdTggX191c2VyICpkYXRhOwoJaW50IHNpemUsIGR3b3JkcywgdGV4X3dpZHRoLCBibGl0X3dpZHRoLCBzcGl0Y2g7Cgl1MzIgaGVpZ2h0OwoJaW50IGk7Cgl1MzIgdGV4cGl0Y2gsIG1pY3JvdGlsZTsKCXUzMiBvZmZzZXQ7CglSSU5HX0xPQ0FMUzsKCglEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKCglpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnRleC0+b2Zmc2V0KSkgewoJCURSTV9FUlJPUigiSW52YWxpZCBkZXN0aW5hdGlvbiBvZmZzZXRcbiIpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEOwoKCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZS4gIFRoaXMgZW5zdXJlcyBubyBwaXhlbCBkYXRhIGdldHMgbWl4ZWQKCSAqIHVwIHdpdGggdGhlIHRleHR1cmUgZGF0YSBmcm9tIHRoZSBob3N0IGRhdGEgYmxpdCwgb3RoZXJ3aXNlCgkgKiBwYXJ0IG9mIHRoZSB0ZXh0dXJlIGltYWdlIG1heSBiZSBjb3JydXB0ZWQuCgkgKi8KCUJFR0lOX1JJTkcoNCk7CglSQURFT05fRkxVU0hfQ0FDSEUoKTsKCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKCUFEVkFOQ0VfUklORygpOwoKCS8qIFRoZSBjb21waWxlciB3b24ndCBvcHRpbWl6ZSBhd2F5IGEgZGl2aXNpb24gYnkgYSB2YXJpYWJsZSwKCSAqIGV2ZW4gaWYgdGhlIG9ubHkgbGVnYWwgdmFsdWVzIGFyZSBwb3dlcnMgb2YgdHdvLiAgVGh1cywgd2UnbGwKCSAqIHVzZSBhIHNoaWZ0IGluc3RlYWQuCgkgKi8KCXN3aXRjaCAodGV4LT5mb3JtYXQpIHsKCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I4ODg4OgoJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCQTg4ODg6CgkJZm9ybWF0ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4ODsKCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogNDsKCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogNDsKCQlicmVhazsKCWNhc2UgUkFERU9OX1RYRk9STUFUX0FJODg6CgljYXNlIFJBREVPTl9UWEZPUk1BVF9BUkdCMTU1NToKCWNhc2UgUkFERU9OX1RYRk9STUFUX1JHQjU2NToKCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I0NDQ0OgoJY2FzZSBSQURFT05fVFhGT1JNQVRfVllVWTQyMjoKCWNhc2UgUkFERU9OX1RYRk9STUFUX1lWWVU0MjI6CgkJZm9ybWF0ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9SR0I1NjU7CgkJdGV4X3dpZHRoID0gdGV4LT53aWR0aCAqIDI7CgkJYmxpdF93aWR0aCA9IGltYWdlLT53aWR0aCAqIDI7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9UWEZPUk1BVF9JODoKCWNhc2UgUkFERU9OX1RYRk9STUFUX1JHQjMzMjoKCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX0NJODsKCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogMTsKCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogMTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJRFJNX0VSUk9SKCJpbnZhbGlkIHRleHR1cmUgZm9ybWF0ICVkXG4iLCB0ZXgtPmZvcm1hdCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCXNwaXRjaCA9IGJsaXRfd2lkdGggPj4gNjsKCWlmIChzcGl0Y2ggPT0gMCAmJiBpbWFnZS0+aGVpZ2h0ID4gMSkKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoKCXRleHBpdGNoID0gdGV4LT5waXRjaDsKCWlmICgodGV4cGl0Y2ggPDwgMjIpICYgUkFERU9OX0RTVF9USUxFX01JQ1JPKSB7CgkJbWljcm90aWxlID0gMTsKCQlpZiAodGV4X3dpZHRoIDwgNjQpIHsKCQkJdGV4cGl0Y2ggJj0gfihSQURFT05fRFNUX1RJTEVfTUlDUk8gPj4gMjIpOwoJCQkvKiB3ZSBnb3QgdGlsZWQgY29vcmRpbmF0ZXMsIHVudGlsZSB0aGVtICovCgkJCWltYWdlLT54ICo9IDI7CgkJfQoJfSBlbHNlCgkJbWljcm90aWxlID0gMDsKCglEUk1fREVCVUcoInRleD0lZHglZCBibGl0PSVkXG4iLCB0ZXhfd2lkdGgsIHRleC0+aGVpZ2h0LCBibGl0X3dpZHRoKTsKCglkbyB7CgkJRFJNX0RFQlVHKCJ0ZXg6IG9mcz0weCV4IHA9JWQgZj0lZCB4PSVoZCB5PSVoZCB3PSVoZCBoPSVoZFxuIiwKCQkJICB0ZXgtPm9mZnNldCA+PiAxMCwgdGV4LT5waXRjaCwgdGV4LT5mb3JtYXQsCgkJCSAgaW1hZ2UtPngsIGltYWdlLT55LCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOwoKCQkvKiBNYWtlIGEgY29weSBvZiBzb21lIHBhcmFtZXRlcnMgaW4gY2FzZSB3ZSBoYXZlIHRvCgkJICogdXBkYXRlIHRoZW0gZm9yIGEgbXVsdGktcGFzcyB0ZXh0dXJlIGJsaXQuCgkJICovCgkJaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsKCQlkYXRhID0gKGNvbnN0IHU4IF9fdXNlciAqKWltYWdlLT5kYXRhOwoKCQlzaXplID0gaGVpZ2h0ICogYmxpdF93aWR0aDsKCgkJaWYgKHNpemUgPiBSQURFT05fTUFYX1RFWFRVUkVfU0laRSkgewoJCQloZWlnaHQgPSBSQURFT05fTUFYX1RFWFRVUkVfU0laRSAvIGJsaXRfd2lkdGg7CgkJCXNpemUgPSBoZWlnaHQgKiBibGl0X3dpZHRoOwoJCX0gZWxzZSBpZiAoc2l6ZSA8IDQgJiYgc2l6ZSA+IDApIHsKCQkJc2l6ZSA9IDQ7CgkJfSBlbHNlIGlmIChzaXplID09IDApIHsKCQkJcmV0dXJuIDA7CgkJfQoKCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KGRldik7CgkJaWYgKDAgJiYgIWJ1ZikgewoJCQlyYWRlb25fZG9fY3BfaWRsZShkZXZfcHJpdik7CgkJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoZGV2KTsKCQl9CgkJaWYgKCFidWYpIHsKCQkJRFJNX0RFQlVHKCJyYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZTogRUFHQUlOXG4iKTsKCQkJaWYgKERSTV9DT1BZX1RPX1VTRVIodGV4LT5pbWFnZSwgaW1hZ2UsIHNpemVvZigqaW1hZ2UpKSkKCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgkJCXJldHVybiBEUk1fRVJSKEVBR0FJTik7CgkJfQoKCQkvKiBEaXNwYXRjaCB0aGUgaW5kaXJlY3QgYnVmZmVyLgoJCSAqLwoJCWJ1ZmZlciA9CgkJICAgICh1MzIgKikgKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOwoJCWR3b3JkcyA9IHNpemUgLyA0OwoKCQlpZiAobWljcm90aWxlKSB7CgkJCS8qIHRleHR1cmUgbWljcm8gdGlsaW5nIGluIHVzZSwgbWluaW11bSB0ZXh0dXJlIHdpZHRoIGlzIHRodXMgMTYgYnl0ZXMuCgkJCSAgIGhvd2V2ZXIsIHdlIGNhbm5vdCB1c2UgYmxpdHRlciBkaXJlY3RseSBmb3IgdGV4dHVyZSB3aWR0aCA8IDY0IGJ5dGVzLAoJCQkgICBzaW5jZSBtaW5pbXVtIHRleCBwaXRjaCBpcyA2NCBieXRlcyBhbmQgd2UgbmVlZCB0aGlzIHRvIG1hdGNoCgkJCSAgIHRoZSB0ZXh0dXJlIHdpZHRoLCBvdGhlcndpc2UgdGhlIGJsaXR0ZXIgd2lsbCB0aWxlIGl0IHdyb25nLgoJCQkgICBUaHVzLCB0aWxpbmcgbWFudWFsbHkgaW4gdGhpcyBjYXNlLiBBZGRpdGlvbmFsbHksIG5lZWQgdG8gc3BlY2lhbAoJCQkgICBjYXNlIHRleCBoZWlnaHQgPSAxLCBzaW5jZSBvdXIgYWN0dWFsIGltYWdlIHdpbGwgaGF2ZSBoZWlnaHQgMgoJCQkgICBhbmQgd2UgbmVlZCB0byBlbnN1cmUgd2UgZG9uJ3QgcmVhZCBiZXlvbmQgdGhlIHRleHR1cmUgc2l6ZQoJCQkgICBmcm9tIHVzZXIgc3BhY2UuICovCgkJCWlmICh0ZXgtPmhlaWdodCA9PSAxKSB7CgkJCQlpZiAodGV4X3dpZHRoID49IDY0IHx8IHRleF93aWR0aCA8PSAxNikgewoJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAoJCQkJCQkJICAgICAgIHRleF93aWR0aCAqCgkJCQkJCQkgICAgICAgc2l6ZW9mKHUzMikpKSB7CgkJCQkJCURSTV9FUlJPUgoJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKCQkJCQkJICAgICB0ZXhfd2lkdGgpOwoJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCQkJCX0KCQkJCX0gZWxzZSBpZiAodGV4X3dpZHRoID09IDMyKSB7CgkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgoJCQkJCSAgICAoYnVmZmVyLCBkYXRhLCAxNikpIHsKCQkJCQkJRFJNX0VSUk9SCgkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAoJCQkJCQkgICAgIHRleF93aWR0aCk7CgkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgkJCQkJfQoJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKCQkJCQkgICAgKGJ1ZmZlciArIDgsIGRhdGEgKyAxNiwgMTYpKSB7CgkJCQkJCURSTV9FUlJPUgoJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKCQkJCQkJICAgICB0ZXhfd2lkdGgpOwoJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPj0gNjQgfHwgdGV4X3dpZHRoID09IDE2KSB7CgkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwKCQkJCQkJICAgICAgIGR3b3JkcyAqIHNpemVvZih1MzIpKSkgewoJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIGRhdGEsICVkIGR3b3Jkc1xuIiwKCQkJCQkJICBkd29yZHMpOwoJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgkJCQl9CgkJCX0gZWxzZSBpZiAodGV4X3dpZHRoIDwgMTYpIHsKCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSsrKSB7CgkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgoJCQkJCSAgICAoYnVmZmVyLCBkYXRhLCB0ZXhfd2lkdGgpKSB7CgkJCQkJCURSTV9FUlJPUgoJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKCQkJCQkJICAgICB0ZXhfd2lkdGgpOwoJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCQkJCX0KCQkJCQlidWZmZXIgKz0gNDsKCQkJCQlkYXRhICs9IHRleF93aWR0aDsKCQkJCX0KCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPT0gMzIpIHsKCQkJCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdoZW4gbm90IGZpdHRpbmcgaW4gb25lIGJ1ZmZlcgoJCQkJICAgKGkuZS4gMzJieXRlcyB4IDIwNDguLi4pICovCgkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkgKz0gMikgewoJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKCQkJCQkgICAgKGJ1ZmZlciwgZGF0YSwgMTYpKSB7CgkJCQkJCURSTV9FUlJPUgoJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKCQkJCQkJICAgICB0ZXhfd2lkdGgpOwoJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCQkJCX0KCQkJCQlkYXRhICs9IDE2OwoJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKCQkJCQkgICAgKGJ1ZmZlciArIDgsIGRhdGEsIDE2KSkgewoJCQkJCQlEUk1fRVJST1IKCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCgkJCQkJCSAgICAgdGV4X3dpZHRoKTsKCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKCQkJCQl9CgkJCQkJZGF0YSArPSAxNjsKCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCgkJCQkJICAgIChidWZmZXIgKyA0LCBkYXRhLCAxNikpIHsKCQkJCQkJRFJNX0VSUk9SCgkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAoJCQkJCQkgICAgIHRleF93aWR0aCk7CgkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgkJCQkJfQoJCQkJCWRhdGEgKz0gMTY7CgkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgoJCQkJCSAgICAoYnVmZmVyICsgMTIsIGRhdGEsIDE2KSkgewoJCQkJCQlEUk1fRVJST1IKCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCgkJCQkJCSAgICAgdGV4X3dpZHRoKTsKCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKCQkJCQl9CgkJCQkJZGF0YSArPSAxNjsKCQkJCQlidWZmZXIgKz0gMTY7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAodGV4X3dpZHRoID49IDMyKSB7CgkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQoJCQkJICogY2FuIHVwbG9hZCBpdCBkaXJlY3RseS4KCQkJCSAqLwoJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsCgkJCQkJCSAgICAgICBkd29yZHMgKiBzaXplb2YodTMyKSkpIHsKCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBkYXRhLCAlZCBkd29yZHNcbiIsCgkJCQkJCSAgZHdvcmRzKTsKCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLyogVGV4dHVyZSBpbWFnZSB3aWR0aCBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0sIHNvIHdlCgkJCQkgKiBuZWVkIHRvIHBhZCBvdXQgZWFjaCBpbWFnZSBzY2FubGluZSB0byB0aGUgbWluaW11bQoJCQkJICogd2lkdGguCgkJCQkgKi8KCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSsrKSB7CgkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgoJCQkJCSAgICAoYnVmZmVyLCBkYXRhLCB0ZXhfd2lkdGgpKSB7CgkJCQkJCURSTV9FUlJPUgoJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKCQkJCQkJICAgICB0ZXhfd2lkdGgpOwoJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCQkJCX0KCQkJCQlidWZmZXIgKz0gODsKCQkJCQlkYXRhICs9IHRleF93aWR0aDsKCQkJCX0KCQkJfQoJCX0KCgkJYnVmLT5maWxwID0gZmlscDsKCQlidWYtPnVzZWQgPSBzaXplOwoJCW9mZnNldCA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0ICsgYnVmLT5vZmZzZXQ7CgkJQkVHSU5fUklORyg5KTsKCQlPVVRfUklORyhDUF9QQUNLRVQzKFJBREVPTl9DTlRMX0JJVEJMVF9NVUxUSSwgNSkpOwoJCU9VVF9SSU5HKFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CgkJCSAoZm9ybWF0IDw8IDgpIHwKCQkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKCQkJIFJBREVPTl9ST1AzX1MgfAoJCQkgUkFERU9OX0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKCQkJIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8IFJBREVPTl9HTUNfV1JfTVNLX0RJUyk7CgkJT1VUX1JJTkcoKHNwaXRjaCA8PCAyMikgfCAob2Zmc2V0ID4+IDEwKSk7CgkJT1VUX1JJTkcoKHRleHBpdGNoIDw8IDIyKSB8ICh0ZXgtPm9mZnNldCA+PiAxMCkpOwoJCU9VVF9SSU5HKDApOwoJCU9VVF9SSU5HKChpbWFnZS0+eCA8PCAxNikgfCBpbWFnZS0+eSk7CgkJT1VUX1JJTkcoKGltYWdlLT53aWR0aCA8PCAxNikgfCBoZWlnaHQpOwoJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKCQlBRFZBTkNFX1JJTkcoKTsKCgkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKCgkJLyogVXBkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBuZXh0IHRpbWUgKi8KCQlpbWFnZS0+eSArPSBoZWlnaHQ7CgkJaW1hZ2UtPmhlaWdodCAtPSBoZWlnaHQ7CgkJaW1hZ2UtPmRhdGEgPSAoY29uc3QgdTggX191c2VyICopaW1hZ2UtPmRhdGEgKyBzaXplOwoJfSB3aGlsZSAoaW1hZ2UtPmhlaWdodCA+IDApOwoKCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZSBhZnRlciB0aGUgYmxpdCBjb21wbGV0ZXMuICBUaGlzIGVuc3VyZXMKCSAqIHRoZSB0ZXh0dXJlIGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gbWVtb3J5IGJlZm9yZSByZW5kZXJpbmcKCSAqIGNvbnRpbnVlcy4KCSAqLwoJQkVHSU5fUklORyg0KTsKCVJBREVPTl9GTFVTSF9DQUNIRSgpOwoJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoJQURWQU5DRV9SSU5HKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoZHJtX2RldmljZV90ICogZGV2LCB1MzIgKiBzdGlwcGxlKQp7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJaW50IGk7CglSSU5HX0xPQ0FMUzsKCURSTV9ERUJVRygiXG4iKTsKCglCRUdJTl9SSU5HKDM1KTsKCglPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SRV9TVElQUExFX0FERFIsIDApKTsKCU9VVF9SSU5HKDB4MDAwMDAwMDApOwoKCU9VVF9SSU5HKENQX1BBQ0tFVDBfVEFCTEUoUkFERU9OX1JFX1NUSVBQTEVfREFUQSwgMzEpKTsKCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CgkJT1VUX1JJTkcoc3RpcHBsZVtpXSk7Cgl9CgoJQURWQU5DRV9SSU5HKCk7Cn0KCnN0YXRpYyB2b2lkIHJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3MoaW50IHN1cmZfaW5kZXgsCgkJCQkgICAgICBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2KQp7CglpZiAoIWRldl9wcml2LT5tbWlvKQoJCXJldHVybjsKCglyYWRlb25fZG9fY3BfaWRsZShkZXZfcHJpdik7CgoJUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9JTkZPICsgMTYgKiBzdXJmX2luZGV4LAoJCSAgICAgZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmZsYWdzKTsKCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfTE9XRVJfQk9VTkQgKyAxNiAqIHN1cmZfaW5kZXgsCgkJICAgICBkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0ubG93ZXIpOwoJUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9VUFBFUl9CT1VORCArIDE2ICogc3VyZl9pbmRleCwKCQkgICAgIGRldl9wcml2LT5zdXJmYWNlc1tzdXJmX2luZGV4XS51cHBlcik7Cn0KCi8qIEFsbG9jYXRlcyBhIHZpcnR1YWwgc3VyZmFjZQogKiBkb2Vzbid0IGFsd2F5cyBhbGxvY2F0ZSBhIHJlYWwgc3VyZmFjZSwgd2lsbCBzdHJldGNoIGFuIGV4aXN0aW5nCiAqIHN1cmZhY2Ugd2hlbiBwb3NzaWJsZS4KICoKICogTm90ZSB0aGF0IHJlZmNvdW50IGNhbiBiZSBhdCBtb3N0IDIsIHNpbmNlIGR1cmluZyBhIGZyZWUgcmVmY291bnQ9MwogKiBtaWdodCBtZWFuIHdlIGhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgc3VyZmFjZSB3aGljaCBtaWdodCBub3QgYWx3YXlzCiAqIGJlIGF2YWlsYWJsZS4KICogRm9yIGV4YW1wbGUgOiB3ZSBhbGxvY2F0ZSB0aHJlZSBjb250aWdvdXMgc3VyZmFjZXMgQUJDLiBJZiBCIGlzCiAqIGZyZWVkLCB3ZSBzdWRkZW5seSBuZWVkIHR3byBzdXJmYWNlcyB0byBzdG9yZSBBIGFuZCBDLCB3aGljaCBtaWdodAogKiBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4KICovCnN0YXRpYyBpbnQgYWxsb2Nfc3VyZmFjZShkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCAqIG5ldywKCQkJIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsIERSTUZJTEUgZmlscCkKewoJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgKnM7CglpbnQgaTsKCWludCB2aXJ0X3N1cmZhY2VfaW5kZXg7Cgl1aW50MzJfdCBuZXdfdXBwZXIsIG5ld19sb3dlcjsKCgluZXdfbG93ZXIgPSBuZXctPmFkZHJlc3M7CgluZXdfdXBwZXIgPSBuZXdfbG93ZXIgKyBuZXctPnNpemUgLSAxOwoKCS8qIHNhbml0eSBjaGVjayAqLwoJaWYgKChuZXdfbG93ZXIgPj0gbmV3X3VwcGVyKSB8fCAobmV3LT5mbGFncyA9PSAwKSB8fCAobmV3LT5zaXplID09IDApIHx8CgkgICAgKChuZXdfdXBwZXIgJiBSQURFT05fU1VSRl9BRERSRVNTX0ZJWEVEX01BU0spICE9CgkgICAgIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykKCSAgICB8fCAoKG5ld19sb3dlciAmIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgIT0gMCkpCgkJcmV0dXJuIC0xOwoKCS8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdmVybGFwIHdpdGggZXhpc3Rpbmcgc3VyZmFjZXMgKi8KCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKCQlpZiAoKGRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCAhPSAwKSAmJgoJCSAgICAoKChuZXdfbG93ZXIgPj0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSAmJgoJCSAgICAgIChuZXdfbG93ZXIgPCBkZXZfcHJpdi0+c3VyZmFjZXNbaV0udXBwZXIpKSB8fAoJCSAgICAgKChuZXdfbG93ZXIgPCBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpICYmCgkJICAgICAgKG5ld191cHBlciA+IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikpKSkgewoJCQlyZXR1cm4gLTE7CgkJfQoJfQoKCS8qIGZpbmQgYSB2aXJ0dWFsIHN1cmZhY2UgKi8KCWZvciAoaSA9IDA7IGkgPCAyICogUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKQoJCWlmIChkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXS5maWxwID09IDApCgkJCWJyZWFrOwoJaWYgKGkgPT0gMiAqIFJBREVPTl9NQVhfU1VSRkFDRVMpIHsKCQlyZXR1cm4gLTE7Cgl9Cgl2aXJ0X3N1cmZhY2VfaW5kZXggPSBpOwoKCS8qIHRyeSB0byByZXVzZSBhbiBleGlzdGluZyBzdXJmYWNlICovCglmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CgkJLyogZXh0ZW5kIGJlZm9yZSAqLwoJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCgkJICAgIChuZXctPmZsYWdzID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5mbGFncykgJiYKCQkgICAgKG5ld191cHBlciArIDEgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSkgewoJCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1t2aXJ0X3N1cmZhY2VfaW5kZXhdKTsKCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CgkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOwoJCQlzLT51cHBlciA9IG5ld191cHBlcjsKCQkJcy0+ZmxhZ3MgPSBuZXctPmZsYWdzOwoJCQlzLT5maWxwID0gZmlscDsKCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50Kys7CgkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlciA9IHMtPmxvd2VyOwoJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKCQkJcmV0dXJuIHZpcnRfc3VyZmFjZV9pbmRleDsKCQl9CgoJCS8qIGV4dGVuZCBhZnRlciAqLwoJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCgkJICAgIChuZXctPmZsYWdzID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5mbGFncykgJiYKCQkgICAgKG5ld19sb3dlciA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0udXBwZXIgKyAxKSkgewoJCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1t2aXJ0X3N1cmZhY2VfaW5kZXhdKTsKCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CgkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOwoJCQlzLT51cHBlciA9IG5ld191cHBlcjsKCQkJcy0+ZmxhZ3MgPSBuZXctPmZsYWdzOwoJCQlzLT5maWxwID0gZmlscDsKCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50Kys7CgkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlciA9IHMtPnVwcGVyOwoJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKCQkJcmV0dXJuIHZpcnRfc3VyZmFjZV9pbmRleDsKCQl9Cgl9CgoJLyogb2theSwgd2UgbmVlZCBhIG5ldyBvbmUgKi8KCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKCQlpZiAoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDApIHsKCQkJcyA9ICYoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbdmlydF9zdXJmYWNlX2luZGV4XSk7CgkJCXMtPnN1cmZhY2VfaW5kZXggPSBpOwoJCQlzLT5sb3dlciA9IG5ld19sb3dlcjsKCQkJcy0+dXBwZXIgPSBuZXdfdXBwZXI7CgkJCXMtPmZsYWdzID0gbmV3LT5mbGFnczsKCQkJcy0+ZmlscCA9IGZpbHA7CgkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCA9IDE7CgkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlciA9IHMtPmxvd2VyOwoJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0udXBwZXIgPSBzLT51cHBlcjsKCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzID0gcy0+ZmxhZ3M7CgkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwgZGV2X3ByaXYpOwoJCQlyZXR1cm4gdmlydF9zdXJmYWNlX2luZGV4OwoJCX0KCX0KCgkvKiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyAqLwoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50IGZyZWVfc3VyZmFjZShEUk1GSUxFIGZpbHAsIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCgkJCWludCBsb3dlcikKewoJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgKnM7CglpbnQgaTsKCS8qIGZpbmQgdGhlIHZpcnR1YWwgc3VyZmFjZSAqLwoJZm9yIChpID0gMDsgaSA8IDIgKiBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXSk7CgkJaWYgKHMtPmZpbHApIHsKCQkJaWYgKChsb3dlciA9PSBzLT5sb3dlcikgJiYgKGZpbHAgPT0gcy0+ZmlscCkpIHsKCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0uCgkJCQkgICAgbG93ZXIgPT0gcy0+bG93ZXIpCgkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLgoJCQkJCSAgICBsb3dlciA9IHMtPnVwcGVyOwoKCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0uCgkJCQkgICAgdXBwZXIgPT0gcy0+dXBwZXIpCgkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLgoJCQkJCSAgICB1cHBlciA9IHMtPmxvd2VyOwoKCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5yZWZjb3VudC0tOwoJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS4KCQkJCSAgICByZWZjb3VudCA9PSAwKQoJCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS4KCQkJCQkgICAgZmxhZ3MgPSAwOwoJCQkJcy0+ZmlscCA9IE5VTEw7CgkJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsCgkJCQkJCQkgIGRldl9wcml2KTsKCQkJCXJldHVybiAwOwoJCQl9CgkJfQoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkIHJhZGVvbl9zdXJmYWNlc19yZWxlYXNlKERSTUZJTEUgZmlscCwKCQkJCSAgICBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2KQp7CglpbnQgaTsKCWZvciAoaSA9IDA7IGkgPCAyICogUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CgkJaWYgKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmZpbHAgPT0gZmlscCkKCQkJZnJlZV9zdXJmYWNlKGZpbHAsIGRldl9wcml2LAoJCQkJICAgICBkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXS5sb3dlcik7Cgl9Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogSU9DVEwgZnVuY3Rpb25zCiAqLwpzdGF0aWMgaW50IHJhZGVvbl9zdXJmYWNlX2FsbG9jKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190IGFsbG9jOwoKCWlmICghZGV2X3ByaXYpIHsKCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFsbG9jLAoJCQkJIChkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YoYWxsb2MpKTsKCglpZiAoYWxsb2Nfc3VyZmFjZSgmYWxsb2MsIGRldl9wcml2LCBmaWxwKSA9PSAtMSkKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJZWxzZQoJCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9zdXJmYWNlX2ZyZWUoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdCBtZW1mcmVlOwoKCWlmICghZGV2X3ByaXYpIHsKCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbWZyZWUsIChkcm1fcmFkZW9uX21lbV9mcmVlX3QgX191c2VyICopIGRhdGEsCgkJCQkgc2l6ZW9mKG1lbWZyZWUpKTsKCglpZiAoZnJlZV9zdXJmYWNlKGZpbHAsIGRldl9wcml2LCBtZW1mcmVlLmFkZHJlc3MpKQoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgllbHNlCgkJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX2NsZWFyKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwoJZHJtX3JhZGVvbl9jbGVhcl90IGNsZWFyOwoJZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgZGVwdGhfYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107CglEUk1fREVCVUcoIlxuIik7CgoJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGNsZWFyLCAoZHJtX3JhZGVvbl9jbGVhcl90IF9fdXNlciAqKSBkYXRhLAoJCQkJIHNpemVvZihjbGVhcikpOwoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJaWYgKHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTKQoJCXNhcmVhX3ByaXYtPm5ib3ggPSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTOwoKCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJmRlcHRoX2JveGVzLCBjbGVhci5kZXB0aF9ib3hlcywKCQkJICAgICAgIHNhcmVhX3ByaXYtPm5ib3ggKiBzaXplb2YoZGVwdGhfYm94ZXNbMF0pKSkKCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoKCXJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhcihkZXYsICZjbGVhciwgZGVwdGhfYm94ZXMpOwoKCUNPTU1JVF9SSU5HKCk7CglyZXR1cm4gMDsKfQoKLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKICovCnN0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQp7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJUklOR19MT0NBTFM7CgoJRFJNX0RFQlVHKCJcbiIpOwoKCUJFR0lOX1JJTkcoNik7CglSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CglPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9DUlRDX09GRlNFVF9DTlRMLCAwKSk7CglPVVRfUklORyhSQURFT05fUkVBRChSQURFT05fQ1JUQ19PRkZTRVRfQ05UTCkgfAoJCSBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMKTsKCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMLCAwKSk7CglPVVRfUklORyhSQURFT05fUkVBRChSQURFT05fQ1JUQzJfT0ZGU0VUX0NOVEwpIHwKCQkgUkFERU9OX0NSVENfT0ZGU0VUX0ZMSVBfQ05UTCk7CglBRFZBTkNFX1JJTkcoKTsKCglkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDE7CglkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKCglyZXR1cm4gMDsKfQoKLyogQ2FsbGVkIHdoZW5ldmVyIGEgY2xpZW50IGRpZXMsIGZyb20gZHJtX3JlbGVhc2UuCiAqIE5PVEU6ICBMb2NrIGlzbid0IG5lY2Vzc2FyaWx5IGhlbGQgd2hlbiB0aGlzIGlzIGNhbGxlZCEKICovCnN0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQp7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJRFJNX0RFQlVHKCJcbiIpOwoKCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApCgkJcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoZGV2KTsKCglkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDA7CglyZXR1cm4gMDsKfQoKLyogU3dhcHBpbmcgYW5kIGZsaXBwaW5nIGFyZSBkaWZmZXJlbnQgb3BlcmF0aW9ucywgbmVlZCBkaWZmZXJlbnQgaW9jdGxzLgogKiBUaGV5IGNhbiAmIHNob3VsZCBiZSBpbnRlcm1peGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgM2Qgd2luZG93cy4KICovCnN0YXRpYyBpbnQgcmFkZW9uX2NwX2ZsaXAoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJRFJNX0RFQlVHKCJcbiIpOwoKCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJaWYgKCFkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykKCQlyYWRlb25fZG9faW5pdF9wYWdlZmxpcChkZXYpOwoKCXJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKGRldik7CgoJQ09NTUlUX1JJTkcoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9jcF9zd2FwKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwoJRFJNX0RFQlVHKCJcbiIpOwoKCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJaWYgKHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTKQoJCXNhcmVhX3ByaXYtPm5ib3ggPSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTOwoKCXJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKGRldik7CglkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKCglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX3ZlcnRleChEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fZmlsZV90ICpmaWxwX3ByaXY7Cglkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwoJZHJtX2J1Zl90ICpidWY7Cglkcm1fcmFkZW9uX3ZlcnRleF90IHZlcnRleDsKCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOwoKCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwoKCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTihmaWxwX3ByaXYsIGZpbHApOwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh2ZXJ0ZXgsIChkcm1fcmFkZW9uX3ZlcnRleF90IF9fdXNlciAqKSBkYXRhLAoJCQkJIHNpemVvZih2ZXJ0ZXgpKTsKCglEUk1fREVCVUcoInBpZD0lZCBpbmRleD0lZCBjb3VudD0lZCBkaXNjYXJkPSVkXG4iLAoJCSAgRFJNX0NVUlJFTlRQSUQsIHZlcnRleC5pZHgsIHZlcnRleC5jb3VudCwgdmVydGV4LmRpc2NhcmQpOwoKCWlmICh2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CgkJRFJNX0VSUk9SKCJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCgkJCSAgdmVydGV4LmlkeCwgZG1hLT5idWZfY291bnQgLSAxKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoJaWYgKHZlcnRleC5wcmltIDwgMCB8fCB2ZXJ0ZXgucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QpIHsKCQlEUk1fRVJST1IoImJ1ZmZlciBwcmltICVkXG4iLCB2ZXJ0ZXgucHJpbSk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwoJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwoKCWJ1ZiA9IGRtYS0+YnVmbGlzdFt2ZXJ0ZXguaWR4XTsKCglpZiAoYnVmLT5maWxwICE9IGZpbHApIHsKCQlEUk1fRVJST1IoInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAoJCQkgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHApOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CglpZiAoYnVmLT5wZW5kaW5nKSB7CgkJRFJNX0VSUk9SKCJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4KTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCS8qIEJ1aWxkIHVwIGEgcHJpbV90IHJlY29yZDoKCSAqLwoJaWYgKHZlcnRleC5jb3VudCkgewoJCWJ1Zi0+dXNlZCA9IHZlcnRleC5jb3VudDsJLyogbm90IHVzZWQ/ICovCgoJCWlmIChzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUykgewoJCQlpZiAocmFkZW9uX2VtaXRfc3RhdGUoZGV2X3ByaXYsIGZpbHBfcHJpdiwKCQkJCQkgICAgICAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKCQkJCQkgICAgICBzYXJlYV9wcml2LT50ZXhfc3RhdGUsCgkJCQkJICAgICAgc2FyZWFfcHJpdi0+ZGlydHkpKSB7CgkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3N0YXRlIGZhaWxlZFxuIik7CgkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCQl9CgoJCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+KFJBREVPTl9VUExPQURfVEVYMElNQUdFUyB8CgkJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUyB8CgkJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMklNQUdFUyB8CgkJCQkJICAgICAgIFJBREVPTl9SRVFVSVJFX1FVSUVTQ0VOQ0UpOwoJCX0KCgkJcHJpbS5zdGFydCA9IDA7CgkJcHJpbS5maW5pc2ggPSB2ZXJ0ZXguY291bnQ7CS8qIHVudXNlZCAqLwoJCXByaW0ucHJpbSA9IHZlcnRleC5wcmltOwoJCXByaW0ubnVtdmVydHMgPSB2ZXJ0ZXguY291bnQ7CgkJcHJpbS52Y19mb3JtYXQgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dmNfZm9ybWF0OwoKCQlyYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRldiwgYnVmLCAmcHJpbSk7Cgl9CgoJaWYgKHZlcnRleC5kaXNjYXJkKSB7CgkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKCX0KCglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX2luZGljZXMoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX2ZpbGVfdCAqZmlscF9wcml2OwoJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Cglkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKCWRybV9idWZfdCAqYnVmOwoJZHJtX3JhZGVvbl9pbmRpY2VzX3QgZWx0czsKCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOwoJaW50IGNvdW50OwoKCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwoKCWlmICghZGV2X3ByaXYpIHsKCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKGZpbHBfcHJpdiwgZmlscCk7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGVsdHMsIChkcm1fcmFkZW9uX2luZGljZXNfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YoZWx0cykpOwoKCURSTV9ERUJVRygicGlkPSVkIGluZGV4PSVkIHN0YXJ0PSVkIGVuZD0lZCBkaXNjYXJkPSVkXG4iLAoJCSAgRFJNX0NVUlJFTlRQSUQsIGVsdHMuaWR4LCBlbHRzLnN0YXJ0LCBlbHRzLmVuZCwgZWx0cy5kaXNjYXJkKTsKCglpZiAoZWx0cy5pZHggPCAwIHx8IGVsdHMuaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CgkJRFJNX0VSUk9SKCJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCgkJCSAgZWx0cy5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCWlmIChlbHRzLnByaW0gPCAwIHx8IGVsdHMucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QpIHsKCQlEUk1fRVJST1IoImJ1ZmZlciBwcmltICVkXG4iLCBlbHRzLnByaW0pOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglidWYgPSBkbWEtPmJ1Zmxpc3RbZWx0cy5pZHhdOwoKCWlmIChidWYtPmZpbHAgIT0gZmlscCkgewoJCURSTV9FUlJPUigicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCgkJCSAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCWlmIChidWYtPnBlbmRpbmcpIHsKCQlEUk1fRVJST1IoInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGVsdHMuaWR4KTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWNvdW50ID0gKGVsdHMuZW5kIC0gZWx0cy5zdGFydCkgLyBzaXplb2YodTE2KTsKCWVsdHMuc3RhcnQgLT0gUkFERU9OX0lOREVYX1BSSU1fT0ZGU0VUOwoKCWlmIChlbHRzLnN0YXJ0ICYgMHg3KSB7CgkJRFJNX0VSUk9SKCJtaXNhbGlnbmVkIGJ1ZmZlciAweCV4XG4iLCBlbHRzLnN0YXJ0KTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoJaWYgKGVsdHMuc3RhcnQgPCBidWYtPnVzZWQpIHsKCQlEUk1fRVJST1IoIm5vIGhlYWRlciAweCV4IC0gMHgleFxuIiwgZWx0cy5zdGFydCwgYnVmLT51c2VkKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWJ1Zi0+dXNlZCA9IGVsdHMuZW5kOwoKCWlmIChzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUykgewoJCWlmIChyYWRlb25fZW1pdF9zdGF0ZShkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJICAgICAgJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGUsCgkJCQkgICAgICBzYXJlYV9wcml2LT50ZXhfc3RhdGUsCgkJCQkgICAgICBzYXJlYV9wcml2LT5kaXJ0eSkpIHsKCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zdGF0ZSBmYWlsZWRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCgkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfihSQURFT05fVVBMT0FEX1RFWDBJTUFHRVMgfAoJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUyB8CgkJCQkgICAgICAgUkFERU9OX1VQTE9BRF9URVgySU1BR0VTIHwKCQkJCSAgICAgICBSQURFT05fUkVRVUlSRV9RVUlFU0NFTkNFKTsKCX0KCgkvKiBCdWlsZCB1cCBhIHByaW1fdCByZWNvcmQ6CgkgKi8KCXByaW0uc3RhcnQgPSBlbHRzLnN0YXJ0OwoJcHJpbS5maW5pc2ggPSBlbHRzLmVuZDsKCXByaW0ucHJpbSA9IGVsdHMucHJpbTsKCXByaW0ub2Zmc2V0ID0gMDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZG1hIGJ1ZmZlcnMgKi8KCXByaW0ubnVtdmVydHMgPSBSQURFT05fTUFYX1ZCX1ZFUlRTOwkvKiBkdWggKi8KCXByaW0udmNfZm9ybWF0ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKCglyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkZXYsIGJ1ZiwgJnByaW0pOwoJaWYgKGVsdHMuZGlzY2FyZCkgewoJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7Cgl9CgoJQ09NTUlUX1JJTkcoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9jcF90ZXh0dXJlKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fdGV4dHVyZV90IHRleDsKCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgaW1hZ2U7CglpbnQgcmV0OwoKCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh0ZXgsIChkcm1fcmFkZW9uX3RleHR1cmVfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YodGV4KSk7CgoJaWYgKHRleC5pbWFnZSA9PSBOVUxMKSB7CgkJRFJNX0VSUk9SKCJudWxsIHRleHR1cmUgaW1hZ2UhXG4iKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJmltYWdlLAoJCQkgICAgICAgKGRybV9yYWRlb25fdGV4X2ltYWdlX3QgX191c2VyICopIHRleC5pbWFnZSwKCQkJICAgICAgIHNpemVvZihpbWFnZSkpKQoJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglyZXQgPSByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZShmaWxwLCBkZXYsICZ0ZXgsICZpbWFnZSk7CgoJQ09NTUlUX1JJTkcoKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX3N0aXBwbGUoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zdGlwcGxlX3Qgc3RpcHBsZTsKCXUzMiBtYXNrWzMyXTsKCglMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3RpcHBsZSwgKGRybV9yYWRlb25fc3RpcHBsZV90IF9fdXNlciAqKSBkYXRhLAoJCQkJIHNpemVvZihzdGlwcGxlKSk7CgoJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmbWFzaywgc3RpcHBsZS5tYXNrLCAzMiAqIHNpemVvZih1MzIpKSkKCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoZGV2LCBtYXNrKTsKCglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX2luZGlyZWN0KERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwoJZHJtX2J1Zl90ICpidWY7Cglkcm1fcmFkZW9uX2luZGlyZWN0X3QgaW5kaXJlY3Q7CglSSU5HX0xPQ0FMUzsKCglMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKCglpZiAoIWRldl9wcml2KSB7CgkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpbmRpcmVjdCwKCQkJCSAoZHJtX3JhZGVvbl9pbmRpcmVjdF90IF9fdXNlciAqKSBkYXRhLAoJCQkJIHNpemVvZihpbmRpcmVjdCkpOwoKCURSTV9ERUJVRygiaW5kaXJlY3Q6IGlkeD0lZCBzPSVkIGU9JWQgZD0lZFxuIiwKCQkgIGluZGlyZWN0LmlkeCwgaW5kaXJlY3Quc3RhcnQsIGluZGlyZWN0LmVuZCwgaW5kaXJlY3QuZGlzY2FyZCk7CgoJaWYgKGluZGlyZWN0LmlkeCA8IDAgfHwgaW5kaXJlY3QuaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CgkJRFJNX0VSUk9SKCJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCgkJCSAgaW5kaXJlY3QuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJYnVmID0gZG1hLT5idWZsaXN0W2luZGlyZWN0LmlkeF07CgoJaWYgKGJ1Zi0+ZmlscCAhPSBmaWxwKSB7CgkJRFJNX0VSUk9SKCJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKCQkJICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoJaWYgKGJ1Zi0+cGVuZGluZykgewoJCURSTV9FUlJPUigic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgaW5kaXJlY3QuaWR4KTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWlmIChpbmRpcmVjdC5zdGFydCA8IGJ1Zi0+dXNlZCkgewoJCURSTV9FUlJPUigicmV1c2luZyBpbmRpcmVjdDogc3RhcnQ9MHgleCBhY3R1YWw9MHgleFxuIiwKCQkJICBpbmRpcmVjdC5zdGFydCwgYnVmLT51c2VkKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CglWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJYnVmLT51c2VkID0gaW5kaXJlY3QuZW5kOwoKCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgdGhlIGluZGlyZWN0IGJ1ZmZlcgoJICogY29udGFpbmluZyAyRCBhY2NlbGVyYXRpb24gY29tbWFuZHMgaXMgcHJvY2Vzc2VkLgoJICovCglCRUdJTl9SSU5HKDIpOwoKCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKCglBRFZBTkNFX1JJTkcoKTsKCgkvKiBEaXNwYXRjaCB0aGUgaW5kaXJlY3QgYnVmZmVyIGZ1bGwgb2YgY29tbWFuZHMgZnJvbSB0aGUKCSAqIFggc2VydmVyLiAgVGhpcyBpcyBpbnNlY3VyZSBhbmQgaXMgdGh1cyBvbmx5IGF2YWlsYWJsZSB0bwoJICogcHJpdmlsZWdlZCBjbGllbnRzLgoJICovCglyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoZGV2LCBidWYsIGluZGlyZWN0LnN0YXJ0LCBpbmRpcmVjdC5lbmQpOwoJaWYgKGluZGlyZWN0LmRpc2NhcmQpIHsKCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOwoJfQoKCUNPTU1JVF9SSU5HKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4MihEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fZmlsZV90ICpmaWxwX3ByaXY7Cglkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwoJZHJtX2J1Zl90ICpidWY7Cglkcm1fcmFkZW9uX3ZlcnRleDJfdCB2ZXJ0ZXg7CglpbnQgaTsKCXVuc2lnbmVkIGNoYXIgbGFzdHN0YXRlOwoKCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwoKCWlmICghZGV2X3ByaXYpIHsKCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKGZpbHBfcHJpdiwgZmlscCk7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHZlcnRleCwgKGRybV9yYWRlb25fdmVydGV4Ml90IF9fdXNlciAqKSBkYXRhLAoJCQkJIHNpemVvZih2ZXJ0ZXgpKTsKCglEUk1fREVCVUcoInBpZD0lZCBpbmRleD0lZCBkaXNjYXJkPSVkXG4iLAoJCSAgRFJNX0NVUlJFTlRQSUQsIHZlcnRleC5pZHgsIHZlcnRleC5kaXNjYXJkKTsKCglpZiAodmVydGV4LmlkeCA8IDAgfHwgdmVydGV4LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgewoJCURSTV9FUlJPUigiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAoJCQkgIHZlcnRleC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwoJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwoKCWJ1ZiA9IGRtYS0+YnVmbGlzdFt2ZXJ0ZXguaWR4XTsKCglpZiAoYnVmLT5maWxwICE9IGZpbHApIHsKCQlEUk1fRVJST1IoInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAoJCQkgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHApOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJaWYgKGJ1Zi0+cGVuZGluZykgewoJCURSTV9FUlJPUigic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgdmVydGV4LmlkeCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCglmb3IgKGxhc3RzdGF0ZSA9IDB4ZmYsIGkgPSAwOyBpIDwgdmVydGV4Lm5yX3ByaW1zOyBpKyspIHsKCQlkcm1fcmFkZW9uX3ByaW1fdCBwcmltOwoJCWRybV9yYWRlb25fdGNsX3ByaW1fdCB0Y2xwcmltOwoKCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZwcmltLCAmdmVydGV4LnByaW1baV0sIHNpemVvZihwcmltKSkpCgkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgoJCWlmIChwcmltLnN0YXRlaWR4ICE9IGxhc3RzdGF0ZSkgewoJCQlkcm1fcmFkZW9uX3N0YXRlX3Qgc3RhdGU7CgoJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZzdGF0ZSwKCQkJCQkgICAgICAgJnZlcnRleC5zdGF0ZVtwcmltLnN0YXRlaWR4XSwKCQkJCQkgICAgICAgc2l6ZW9mKHN0YXRlKSkpCgkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoKCQkJaWYgKHJhZGVvbl9lbWl0X3N0YXRlMihkZXZfcHJpdiwgZmlscF9wcml2LCAmc3RhdGUpKSB7CgkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3N0YXRlMiBmYWlsZWRcbiIpOwoJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQkJfQoKCQkJbGFzdHN0YXRlID0gcHJpbS5zdGF0ZWlkeDsKCQl9CgoJCXRjbHByaW0uc3RhcnQgPSBwcmltLnN0YXJ0OwoJCXRjbHByaW0uZmluaXNoID0gcHJpbS5maW5pc2g7CgkJdGNscHJpbS5wcmltID0gcHJpbS5wcmltOwoJCXRjbHByaW0udmNfZm9ybWF0ID0gcHJpbS52Y19mb3JtYXQ7CgoJCWlmIChwcmltLnByaW0gJiBSQURFT05fUFJJTV9XQUxLX0lORCkgewoJCQl0Y2xwcmltLm9mZnNldCA9IHByaW0ubnVtdmVydHMgKiA2NDsKCQkJdGNscHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7CS8qIGR1aCAqLwoKCQkJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoZGV2LCBidWYsICZ0Y2xwcmltKTsKCQl9IGVsc2UgewoJCQl0Y2xwcmltLm51bXZlcnRzID0gcHJpbS5udW12ZXJ0czsKCQkJdGNscHJpbS5vZmZzZXQgPSAwOwkvKiBub3QgdXNlZCAqLwoKCQkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChkZXYsIGJ1ZiwgJnRjbHByaW0pOwoJCX0KCgkJaWYgKHNhcmVhX3ByaXYtPm5ib3ggPT0gMSkKCQkJc2FyZWFfcHJpdi0+bmJveCA9IDA7Cgl9CgoJaWYgKHZlcnRleC5kaXNjYXJkKSB7CgkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKCX0KCglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAoJCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKCQkJICAgICAgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQp7CglpbnQgaWQgPSAoaW50KWhlYWRlci5wYWNrZXQucGFja2V0X2lkOwoJaW50IHN6LCByZWc7CglpbnQgKmRhdGEgPSAoaW50ICopY21kYnVmLT5idWY7CglSSU5HX0xPQ0FMUzsKCglpZiAoaWQgPj0gUkFERU9OX01BWF9TVEFURV9QQUNLRVRTKQoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgoJc3ogPSBwYWNrZXRbaWRdLmxlbjsKCXJlZyA9IHBhY2tldFtpZF0uc3RhcnQ7CgoJaWYgKHN6ICogc2l6ZW9mKGludCkgPiBjbWRidWYtPmJ1ZnN6KSB7CgkJRFJNX0VSUk9SKCJQYWNrZXQgc2l6ZSBwcm92aWRlZCBsYXJnZXIgdGhhbiBkYXRhIHByb3ZpZGVkXG4iKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldHMoZGV2X3ByaXYsIGZpbHBfcHJpdiwgaWQsIGRhdGEpKSB7CgkJRFJNX0VSUk9SKCJQYWNrZXQgdmVyaWZpY2F0aW9uIGZhaWxlZFxuIik7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglCRUdJTl9SSU5HKHN6ICsgMSk7CglPVVRfUklORyhDUF9QQUNLRVQwKHJlZywgKHN6IC0gMSkpKTsKCU9VVF9SSU5HX1RBQkxFKGRhdGEsIHN6KTsKCUFEVkFOQ0VfUklORygpOwoKCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CgljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKCQkJCQkgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKCQkJCQkgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKewoJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CglpbnQgc3RhcnQgPSBoZWFkZXIuc2NhbGFycy5vZmZzZXQ7CglpbnQgc3RyaWRlID0gaGVhZGVyLnNjYWxhcnMuc3RyaWRlOwoJUklOR19MT0NBTFM7CgoJQkVHSU5fUklORygzICsgc3opOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVENMX1NDQUxBUl9JTkRYX1JFRywgMCkpOwoJT1VUX1JJTkcoc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7CglPVVRfUklORyhDUF9QQUNLRVQwX1RBQkxFKFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzeiAtIDEpKTsKCU9VVF9SSU5HX1RBQkxFKGNtZGJ1Zi0+YnVmLCBzeik7CglBRFZBTkNFX1JJTkcoKTsKCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CgljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CglyZXR1cm4gMDsKfQoKLyogR29kIHRoaXMgaXMgdWdseQogKi8Kc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMyKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCgkJCQkJICAgZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAoJCQkJCSAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKewoJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CglpbnQgc3RhcnQgPSAoKHVuc2lnbmVkIGludCloZWFkZXIuc2NhbGFycy5vZmZzZXQpICsgMHgxMDA7CglpbnQgc3RyaWRlID0gaGVhZGVyLnNjYWxhcnMuc3RyaWRlOwoJUklOR19MT0NBTFM7CgoJQkVHSU5fUklORygzICsgc3opOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVENMX1NDQUxBUl9JTkRYX1JFRywgMCkpOwoJT1VUX1JJTkcoc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7CglPVVRfUklORyhDUF9QQUNLRVQwX1RBQkxFKFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzeiAtIDEpKTsKCU9VVF9SSU5HX1RBQkxFKGNtZGJ1Zi0+YnVmLCBzeik7CglBRFZBTkNFX1JJTkcoKTsKCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CgljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3ZlY3RvcnMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKCQkJCQkgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKCQkJCQkgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKewoJaW50IHN6ID0gaGVhZGVyLnZlY3RvcnMuY291bnQ7CglpbnQgc3RhcnQgPSBoZWFkZXIudmVjdG9ycy5vZmZzZXQ7CglpbnQgc3RyaWRlID0gaGVhZGVyLnZlY3RvcnMuc3RyaWRlOwoJUklOR19MT0NBTFM7CgoJQkVHSU5fUklORygzICsgc3opOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVENMX1ZFQ1RPUl9JTkRYX1JFRywgMCkpOwoJT1VUX1JJTkcoc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9WRUNfSU5EWF9PQ1RXT1JEX1NUUklERV9TSElGVCkpOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMF9UQUJMRShSQURFT05fU0VfVENMX1ZFQ1RPUl9EQVRBX1JFRywgKHN6IC0gMSkpKTsKCU9VVF9SSU5HX1RBQkxFKGNtZGJ1Zi0+YnVmLCBzeik7CglBRFZBTkNFX1JJTkcoKTsKCgljbWRidWYtPmJ1ZiArPSBzeiAqIHNpemVvZihpbnQpOwoJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0Myhkcm1fZGV2aWNlX3QgKiBkZXYsCgkJCSAgICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAoJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cgl1bnNpZ25lZCBpbnQgY21kc3o7CglpbnQgcmV0OwoJUklOR19MT0NBTFM7CgoJRFJNX0RFQlVHKCJcbiIpOwoKCWlmICgocmV0ID0gcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgY21kYnVmLCAmY21kc3opKSkgewoJCURSTV9FUlJPUigiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOwoJCXJldHVybiByZXQ7Cgl9CgoJQkVHSU5fUklORyhjbWRzeik7CglPVVRfUklOR19UQUJMRShjbWRidWYtPmJ1ZiwgY21kc3opOwoJQURWQU5DRV9SSU5HKCk7CgoJY21kYnVmLT5idWYgKz0gY21kc3ogKiA0OwoJY21kYnVmLT5idWZzeiAtPSBjbWRzeiAqIDQ7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KGRybV9kZXZpY2VfdCAqIGRldiwKCQkJCQlkcm1fZmlsZV90ICogZmlscF9wcml2LAoJCQkJCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLAoJCQkJCWludCBvcmlnX25ib3gpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fY2xpcF9yZWN0X3QgYm94OwoJdW5zaWduZWQgaW50IGNtZHN6OwoJaW50IHJldDsKCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzID0gY21kYnVmLT5ib3hlczsKCWludCBpID0gMDsKCVJJTkdfTE9DQUxTOwoKCURSTV9ERUJVRygiXG4iKTsKCglpZiAoKHJldCA9IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0MyhkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgIGNtZGJ1ZiwgJmNtZHN6KSkpIHsKCQlEUk1fRVJST1IoIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iKTsKCQlyZXR1cm4gcmV0OwoJfQoKCWlmICghb3JpZ19uYm94KQoJCWdvdG8gb3V0OwoKCWRvIHsKCQlpZiAoaSA8IGNtZGJ1Zi0+bmJveCkgewoJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZib3gsICZib3hlc1tpXSwgc2l6ZW9mKGJveCkpKQoJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKCQkJLyogRklYTUUgVGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCB0aW1lcyByb3VuZAoJCQkgKiB0aGlzIGxvb3AsIHNlbmQgYSBXQUlUX1VOVElMXzNEX0lETEUgYmVmb3JlCgkJCSAqIGNhbGxpbmcgZW1pdF9jbGlwX3JlY3QoKS4gVGhpcyBmaXhlcyBhCgkJCSAqIGxvY2t1cCBvbiBmYXN0IG1hY2hpbmVzIHdoZW4gc2VuZGluZwoJCQkgKiBzZXZlcmFsIGNsaXByZWN0cyB3aXRoIGEgY21kYnVmLCBhcyB3aGVuCgkJCSAqIHdhdmluZyBhIDJEIHdpbmRvdyBvdmVyIGEgM0QKCQkJICogd2luZG93LiBTb21ldGhpbmcgaW4gdGhlIGNvbW1hbmRzIGZyb20gdXNlcgoJCQkgKiBzcGFjZSBzZWVtcyB0byBoYW5nIHRoZSBjYXJkIHdoZW4gdGhleSdyZQoJCQkgKiBzZW50IHNldmVyYWwgdGltZXMgaW4gYSByb3cuIFRoYXQgd291bGQgYmUKCQkJICogdGhlIGNvcnJlY3QgcGxhY2UgdG8gZml4IGl0IGJ1dCB0aGlzIHdvcmtzCgkJCSAqIGFyb3VuZCBpdCB1bnRpbCBJIGNhbiBmaWd1cmUgdGhhdCBvdXQgLSBUaW0KCQkJICogU21pdGggKi8KCQkJaWYgKGkpIHsKCQkJCUJFR0lOX1JJTkcoMik7CgkJCQlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CgkJCQlBRFZBTkNFX1JJTkcoKTsKCQkJfQoJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZib3gpOwoJCX0KCgkJQkVHSU5fUklORyhjbWRzeik7CgkJT1VUX1JJTkdfVEFCTEUoY21kYnVmLT5idWYsIGNtZHN6KTsKCQlBRFZBTkNFX1JJTkcoKTsKCgl9IHdoaWxlICgrK2kgPCBjbWRidWYtPm5ib3gpOwoJaWYgKGNtZGJ1Zi0+bmJveCA9PSAxKQoJCWNtZGJ1Zi0+bmJveCA9IDA7CgogICAgICBvdXQ6CgljbWRidWYtPmJ1ZiArPSBjbWRzeiAqIDQ7CgljbWRidWYtPmJ1ZnN6IC09IGNtZHN6ICogNDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3dhaXQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgZmxhZ3MpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglSSU5HX0xPQ0FMUzsKCglEUk1fREVCVUcoIiVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBmbGFncyk7Cglzd2l0Y2ggKGZsYWdzKSB7CgljYXNlIFJBREVPTl9XQUlUXzJEOgoJCUJFR0lOX1JJTkcoMik7CgkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoJCUFEVkFOQ0VfUklORygpOwoJCWJyZWFrOwoJY2FzZSBSQURFT05fV0FJVF8zRDoKCQlCRUdJTl9SSU5HKDIpOwoJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKCQlBRFZBTkNFX1JJTkcoKTsKCQlicmVhazsKCWNhc2UgUkFERU9OX1dBSVRfMkQgfCBSQURFT05fV0FJVF8zRDoKCQlCRUdJTl9SSU5HKDIpOwoJCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKCQlBRFZBTkNFX1JJTkcoKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCByYWRlb25fY3BfY21kYnVmKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwoJZHJtX2J1Zl90ICpidWYgPSBOVUxMOwoJaW50IGlkeDsKCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCBjbWRidWY7Cglkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXI7CglpbnQgb3JpZ19uYm94LCBvcmlnX2J1ZnN6OwoJY2hhciAqa2J1ZiA9IE5VTEw7CgoJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CgoJaWYgKCFkZXZfcHJpdikgewoJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoY21kYnVmLAoJCQkJIChkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YoY21kYnVmKSk7CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglpZiAoY21kYnVmLmJ1ZnN6ID4gNjQgKiAxMDI0IHx8IGNtZGJ1Zi5idWZzeiA8IDApIHsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCS8qIEFsbG9jYXRlIGFuIGluLWtlcm5lbCBhcmVhIGFuZCBjb3B5IGluIHRoZSBjbWRidWYuICBEbyB0aGlzIHRvIGF2b2lkCgkgKiByYWNlcyBiZXR3ZWVuIGNoZWNraW5nIHZhbHVlcyBhbmQgdXNpbmcgdGhvc2UgdmFsdWVzIGluIG90aGVyIGNvZGUsCgkgKiBhbmQgc2ltcGx5IHRvIGF2b2lkIGEgbG90IG9mIGZ1bmN0aW9uIGNhbGxzIHRvIGNvcHkgaW4gZGF0YS4KCSAqLwoJb3JpZ19idWZzeiA9IGNtZGJ1Zi5idWZzejsKCWlmIChvcmlnX2J1ZnN6ICE9IDApIHsKCQlrYnVmID0gZHJtX2FsbG9jKGNtZGJ1Zi5idWZzeiwgRFJNX01FTV9EUklWRVIpOwoJCWlmIChrYnVmID09IE5VTEwpCgkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CgkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrYnVmLCAodm9pZCBfX3VzZXIgKiljbWRidWYuYnVmLCBjbWRidWYuYnVmc3opKSB7CgkJCWRybV9mcmVlKGtidWYsIG9yaWdfYnVmc3osIERSTV9NRU1fRFJJVkVSKTsKCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKCQl9CgkJY21kYnVmLmJ1ZiA9IGtidWY7Cgl9CgoJb3JpZ19uYm94ID0gY21kYnVmLm5ib3g7CgoJaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMzAwKSB7CgkJaW50IHRlbXA7CgkJdGVtcCA9IHIzMDBfZG9fY3BfY21kYnVmKGRldiwgZmlscCwgZmlscF9wcml2LCAmY21kYnVmKTsKCgkJaWYgKG9yaWdfYnVmc3ogIT0gMCkKCQkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOwoKCQlyZXR1cm4gdGVtcDsKCX0KCgkvKiBtaWNyb2NvZGVfdmVyc2lvbiAhPSByMzAwICovCgl3aGlsZSAoY21kYnVmLmJ1ZnN6ID49IHNpemVvZihoZWFkZXIpKSB7CgoJCWhlYWRlci5pID0gKihpbnQgKiljbWRidWYuYnVmOwoJCWNtZGJ1Zi5idWYgKz0gc2l6ZW9mKGhlYWRlcik7CgkJY21kYnVmLmJ1ZnN6IC09IHNpemVvZihoZWFkZXIpOwoKCQlzd2l0Y2ggKGhlYWRlci5oZWFkZXIuY21kX3R5cGUpIHsKCQljYXNlIFJBREVPTl9DTURfUEFDS0VUOgoJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfUEFDS0VUXG4iKTsKCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldHMKCQkJICAgIChkZXZfcHJpdiwgZmlscF9wcml2LCBoZWFkZXIsICZjbWRidWYpKSB7CgkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldHMgZmFpbGVkXG4iKTsKCQkJCWdvdG8gZXJyOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJBREVPTl9DTURfU0NBTEFSUzoKCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1NDQUxBUlNcbiIpOwoJCQlpZiAocmFkZW9uX2VtaXRfc2NhbGFycyhkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmKSkgewoJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zY2FsYXJzIGZhaWxlZFxuIik7CgkJCQlnb3RvIGVycjsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSQURFT05fQ01EX1ZFQ1RPUlM6CgkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9WRUNUT1JTXG4iKTsKCQkJaWYgKHJhZGVvbl9lbWl0X3ZlY3RvcnMoZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZikpIHsKCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfdmVjdG9ycyBmYWlsZWRcbiIpOwoJCQkJZ290byBlcnI7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUkFERU9OX0NNRF9ETUFfRElTQ0FSRDoKCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX0RNQV9ESVNDQVJEXG4iKTsKCQkJaWR4ID0gaGVhZGVyLmRtYS5idWZfaWR4OwoJCQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gZG1hLT5idWZfY291bnQpIHsKCQkJCURSTV9FUlJPUigiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAoJCQkJCSAgaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEpOwoJCQkJZ290byBlcnI7CgkJCX0KCgkJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpZHhdOwoJCQlpZiAoYnVmLT5maWxwICE9IGZpbHAgfHwgYnVmLT5wZW5kaW5nKSB7CgkJCQlEUk1fRVJST1IoImJhZCBidWZmZXIgJXAgJXAgJWRcbiIsCgkJCQkJICBidWYtPmZpbHAsIGZpbHAsIGJ1Zi0+cGVuZGluZyk7CgkJCQlnb3RvIGVycjsKCQkJfQoKCQkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKCQkJYnJlYWs7CgoJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQzOgoJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfUEFDS0VUM1xuIik7CgkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXQzKGRldiwgZmlscF9wcml2LCAmY21kYnVmKSkgewoJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9wYWNrZXQzIGZhaWxlZFxuIik7CgkJCQlnb3RvIGVycjsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSQURFT05fQ01EX1BBQ0tFVDNfQ0xJUDoKCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1BBQ0tFVDNfQ0xJUFxuIik7CgkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0CgkJCSAgICAoZGV2LCBmaWxwX3ByaXYsICZjbWRidWYsIG9yaWdfbmJveCkpIHsKCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfcGFja2V0M19jbGlwIGZhaWxlZFxuIik7CgkJCQlnb3RvIGVycjsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSQURFT05fQ01EX1NDQUxBUlMyOgoJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfU0NBTEFSUzJcbiIpOwoJCQlpZiAocmFkZW9uX2VtaXRfc2NhbGFyczIoZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZikpIHsKCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc2NhbGFyczIgZmFpbGVkXG4iKTsKCQkJCWdvdG8gZXJyOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJBREVPTl9DTURfV0FJVDoKCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1dBSVRcbiIpOwoJCQlpZiAocmFkZW9uX2VtaXRfd2FpdChkZXYsIGhlYWRlci53YWl0LmZsYWdzKSkgewoJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF93YWl0IGZhaWxlZFxuIik7CgkJCQlnb3RvIGVycjsKCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlEUk1fRVJST1IoImJhZCBjbWRfdHlwZSAlZCBhdCAlcFxuIiwKCQkJCSAgaGVhZGVyLmhlYWRlci5jbWRfdHlwZSwKCQkJCSAgY21kYnVmLmJ1ZiAtIHNpemVvZihoZWFkZXIpKTsKCQkJZ290byBlcnI7CgkJfQoJfQoKCWlmIChvcmlnX2J1ZnN6ICE9IDApCgkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOwoKCURSTV9ERUJVRygiRE9ORVxuIik7CglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7CgogICAgICBlcnI6CglpZiAob3JpZ19idWZzeiAhPSAwKQoJCWRybV9mcmVlKGtidWYsIG9yaWdfYnVmc3osIERSTV9NRU1fRFJJVkVSKTsKCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX2dldHBhcmFtKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fZ2V0cGFyYW1fdCBwYXJhbTsKCWludCB2YWx1ZTsKCglpZiAoIWRldl9wcml2KSB7CgkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChwYXJhbSwgKGRybV9yYWRlb25fZ2V0cGFyYW1fdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YocGFyYW0pKTsKCglEUk1fREVCVUcoInBpZD0lZFxuIiwgRFJNX0NVUlJFTlRQSUQpOwoKCXN3aXRjaCAocGFyYW0ucGFyYW0pIHsKCWNhc2UgUkFERU9OX1BBUkFNX0dBUlRfQlVGRkVSX09GRlNFVDoKCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0OwoJCWJyZWFrOwoJY2FzZSBSQURFT05fUEFSQU1fTEFTVF9GUkFNRToKCQlkZXZfcHJpdi0+c3RhdHMubGFzdF9mcmFtZV9yZWFkcysrOwoJCXZhbHVlID0gR0VUX1NDUkFUQ0goMCk7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0RJU1BBVENIOgoJCXZhbHVlID0gR0VUX1NDUkFUQ0goMSk7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSOgoJCWRldl9wcml2LT5zdGF0cy5sYXN0X2NsZWFyX3JlYWRzKys7CgkJdmFsdWUgPSBHRVRfU0NSQVRDSCgyKTsKCQlicmVhazsKCWNhc2UgUkFERU9OX1BBUkFNX0lSUV9OUjoKCQl2YWx1ZSA9IGRldi0+aXJxOwoJCWJyZWFrOwoJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFOgoJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQ7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9QQVJBTV9SRUdJU1RFUl9IQU5ETEU6CgkJdmFsdWUgPSBkZXZfcHJpdi0+bW1pb19vZmZzZXQ7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9QQVJBTV9TVEFUVVNfSEFORExFOgoJCXZhbHVlID0gZGV2X3ByaXYtPnJpbmdfcnB0cl9vZmZzZXQ7CgkJYnJlYWs7CiNpZiBCSVRTX1BFUl9MT05HID09IDMyCgkJLyoKCQkgKiBUaGlzIGlvY3RsKCkgZG9lc24ndCB3b3JrIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBod19sb2NrIGlzIGEKCQkgKiBwb2ludGVyIHdoaWNoIGNhbid0IGZpdCBpbnRvIGFuIGludC1zaXplZCB2YXJpYWJsZS4gIEFjY29yZGluZyB0bwoJCSAqIE1pY2hlbCBE5G56ZXIsIHRoZSBpb2N0bCgpIGlzIG9ubHkgdXNlZCBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMsIHNvCgkJICogbm90IHN1cHBvcnRpbmcgaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4gIElmIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkKCQkgKiBpcyBuZWVkZWQgb24gNjQtYml0IHBsYXRmb3JtcywgYSBuZXcgaW9jdGwoKSB3b3VsZCBoYXZlIHRvIGJlIGFkZGVkLAoJCSAqIHNvIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciB0aGUgZW1iZWRkZWQgcGxhdGZvcm1zIGNhbiBiZQoJCSAqIG1haW50YWluZWQuICAtLWRhdmlkbSA0LUZlYi0yMDA0LgoJCSAqLwoJY2FzZSBSQURFT05fUEFSQU1fU0FSRUFfSEFORExFOgoJCS8qIFRoZSBsb2NrIGlzIHRoZSBmaXJzdCBkd29yZCBpbiB0aGUgc2FyZWEuICovCgkJdmFsdWUgPSAobG9uZylkZXYtPmxvY2suaHdfbG9jazsKCQlicmVhazsKI2VuZGlmCgljYXNlIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEU6CgkJdmFsdWUgPSBkZXZfcHJpdi0+Z2FydF90ZXh0dXJlc19vZmZzZXQ7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJaWYgKERSTV9DT1BZX1RPX1VTRVIocGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkpKSB7CgkJRFJNX0VSUk9SKCJjb3B5X3RvX3VzZXJcbiIpOwoJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKCWRybV9yYWRlb25fc2V0cGFyYW1fdCBzcDsKCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CgoJaWYgKCFkZXZfcHJpdikgewoJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3AsIChkcm1fcmFkZW9uX3NldHBhcmFtX3QgX191c2VyICopIGRhdGEsCgkJCQkgc2l6ZW9mKHNwKSk7CgoJc3dpdGNoIChzcC5wYXJhbSkgewoJY2FzZSBSQURFT05fU0VUUEFSQU1fRkJfTE9DQVRJT046CgkJcmFkZW9uX3ByaXYgPSBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OwoJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gLSBzcC52YWx1ZTsKCQlicmVhazsKCWNhc2UgUkFERU9OX1NFVFBBUkFNX1NXSVRDSF9USUxJTkc6CgkJaWYgKHNwLnZhbHVlID09IDApIHsKCQkJRFJNX0RFQlVHKCJjb2xvciB0aWxpbmcgZGlzYWJsZWRcbiIpOwoJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CgkJCWRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCAmPSB+UkFERU9OX0RTVF9USUxFX01BQ1JPOwoJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAwOwoJCX0gZWxzZSBpZiAoc3AudmFsdWUgPT0gMSkgewoJCQlEUk1fREVCVUcoImNvbG9yIHRpbGluZyBlbmFibGVkXG4iKTsKCQkJZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCB8PSBSQURFT05fRFNUX1RJTEVfTUFDUk87CgkJCWRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCB8PSBSQURFT05fRFNUX1RJTEVfTUFDUk87CgkJCWRldl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDE7CgkJfQoJCWJyZWFrOwoJY2FzZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9MT0NBVElPTjoKCQlkZXZfcHJpdi0+cGNpZ2FydF9vZmZzZXQgPSBzcC52YWx1ZTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJRFJNX0RFQlVHKCJJbnZhbGlkIHBhcmFtZXRlciAlZFxuIiwgc3AucGFyYW0pOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qIFdoZW4gYSBjbGllbnQgZGllczoKICogICAgLSBDaGVjayBmb3IgYW5kIGNsZWFuIHVwIGZsaXBwZWQgcGFnZSBzdGF0ZQogKiAgICAtIEZyZWUgYW55IGFsbG9jZWQgR0FSVCBtZW1vcnkuCiAqCiAqIERSTSBpbmZyYXN0cnVjdHVyZSB0YWtlcyBjYXJlIG9mIHJlY2xhaW1pbmcgZG1hIGJ1ZmZlcnMuCiAqLwp2b2lkIHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKewoJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKCQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJCWlmIChkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykgewoJCQlyYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcChkZXYpOwoJCX0KCQlyYWRlb25fbWVtX3JlbGVhc2UoZmlscCwgZGV2X3ByaXYtPmdhcnRfaGVhcCk7CgkJcmFkZW9uX21lbV9yZWxlYXNlKGZpbHAsIGRldl9wcml2LT5mYl9oZWFwKTsKCQlyYWRlb25fc3VyZmFjZXNfcmVsZWFzZShmaWxwLCBkZXZfcHJpdik7Cgl9Cn0KCnZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCnsKCXJhZGVvbl9kb19yZWxlYXNlKGRldik7Cn0KCmludCByYWRlb25fZHJpdmVyX29wZW5faGVscGVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CgoJcmFkZW9uX3ByaXYgPQoJICAgIChzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKikKCSAgICBkcm1fYWxsb2Moc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOwoKCWlmICghcmFkZW9uX3ByaXYpCgkJcmV0dXJuIC1FTk9NRU07CgoJZmlscF9wcml2LT5kcml2ZXJfcHJpdiA9IHJhZGVvbl9wcml2OwoJaWYgKGRldl9wcml2KQoJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSBkZXZfcHJpdi0+ZmJfbG9jYXRpb247CgllbHNlCgkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IDA7CglyZXR1cm4gMDsKfQoKdm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKewoJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdiA9CgkgICAgZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKCglkcm1fZnJlZShyYWRlb25fcHJpdiwgc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOwp9Cgpkcm1faW9jdGxfZGVzY190IHJhZGVvbl9pb2N0bHNbXSA9IHsKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JTklUKV0gPSB7cmFkZW9uX2NwX2luaXQsIDEsIDF9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1NUQVJUKV0gPSB7cmFkZW9uX2NwX3N0YXJ0LCAxLCAxfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVE9QKV0gPSB7cmFkZW9uX2NwX3N0b3AsIDEsIDF9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU0VUKV0gPSB7cmFkZW9uX2NwX3Jlc2V0LCAxLCAxfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JRExFKV0gPSB7cmFkZW9uX2NwX2lkbGUsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU1VNRSldID0ge3JhZGVvbl9jcF9yZXN1bWUsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1JFU0VUKV0gPSB7cmFkZW9uX2VuZ2luZV9yZXNldCwgMSwgMH0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlVMTFNDUkVFTildID0ge3JhZGVvbl9mdWxsc2NyZWVuLCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TV0FQKV0gPSB7cmFkZW9uX2NwX3N3YXAsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NMRUFSKV0gPSB7cmFkZW9uX2NwX2NsZWFyLCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9WRVJURVgpXSA9IHtyYWRlb25fY3BfdmVydGV4LCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJQ0VTKV0gPSB7cmFkZW9uX2NwX2luZGljZXMsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1RFWFRVUkUpXSA9IHtyYWRlb25fY3BfdGV4dHVyZSwgMSwgMH0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1RJUFBMRSldID0ge3JhZGVvbl9jcF9zdGlwcGxlLCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJUkVDVCldID0ge3JhZGVvbl9jcF9pbmRpcmVjdCwgMSwgMX0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYMildID0ge3JhZGVvbl9jcF92ZXJ0ZXgyLCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DTURCVUYpXSA9IHtyYWRlb25fY3BfY21kYnVmLCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9HRVRQQVJBTSldID0ge3JhZGVvbl9jcF9nZXRwYXJhbSwgMSwgMH0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRkxJUCldID0ge3JhZGVvbl9jcF9mbGlwLCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9BTExPQyldID0ge3JhZGVvbl9tZW1fYWxsb2MsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZSRUUpXSA9IHtyYWRlb25fbWVtX2ZyZWUsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lOSVRfSEVBUCldID0ge3JhZGVvbl9tZW1faW5pdF9oZWFwLCAxLCAxfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfRU1JVCldID0ge3JhZGVvbl9pcnFfZW1pdCwgMSwgMH0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX1dBSVQpXSA9IHtyYWRlb25faXJxX3dhaXQsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NFVFBBUkFNKV0gPSB7cmFkZW9uX2NwX3NldHBhcmFtLCAxLCAwfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVVJGX0FMTE9DKV0gPSB7cmFkZW9uX3N1cmZhY2VfYWxsb2MsIDEsIDB9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NVUkZfRlJFRSldID0ge3JhZGVvbl9zdXJmYWNlX2ZyZWUsIDEsIDB9Cn07CgppbnQgcmFkZW9uX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHJhZGVvbl9pb2N0bHMpOwo=