LyoKICogQWxwaGEgcmVnaXN0ZXIgY29udGV4dCBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAoQykgMjAwNCBWaW5jZW50IELpcm9uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpZmRlZiBfX0FMUEhBX18KCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBIQVZFX1NZU19SRUdfSAojIGluY2x1ZGUgPHN5cy9yZWcuaD4KI2VuZGlmCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaWZkZWYgSEFWRV9TWVNfUFRSQUNFX0gKIyBpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CiNlbmRpZgoKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgoKI2lmIDAgIC8qIG5vIGxvbmdlciB1c2VkICovCgojaWZkZWYgSEFWRV9TWVNfVVNFUl9ICiMgaW5jbHVkZSA8c3lzL3VzZXIuaD4KI2VuZGlmCgovKiB1c2VyIGRlZmluaXRpb25zIGZyb20gYXNtL3VzZXIuaCAqLwpzdHJ1Y3Qga2VybmVsX3VzZXJfc3RydWN0CnsKICAgIHVuc2lnbmVkIGxvbmcgcmVnc1tFRl9TSVpFLzgrMzJdOwogICAgc2l6ZV90IHVfdHNpemU7CiAgICBzaXplX3QgdV9kc2l6ZTsKICAgIHNpemVfdCB1X3NzaXplOwogICAgdW5zaWduZWQgbG9uZyBzdGFydF9jb2RlOwogICAgdW5zaWduZWQgbG9uZyBzdGFydF9kYXRhOwogICAgdW5zaWduZWQgbG9uZyBzdGFydF9zdGFjazsKICAgIGxvbmcgaW50IHNpZ25hbDsKICAgIHN0cnVjdCByZWdzICogdV9hcjA7CiAgICB1bnNpZ25lZCBsb25nIG1hZ2ljOwogICAgY2hhciB1X2NvbW1bMzJdOwp9OwoKLyogZ2V0IHRocmVhZCBjb250ZXh0ICovCnN0YXRpYyB2b2lkIGdldF90aHJlYWRfY29udGV4dCggc3RydWN0IHRocmVhZCAqdGhyZWFkLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIENPTlRFWFQgKmNvbnRleHQgKQp7CiAgICBpbnQgcGlkID0gZ2V0X3B0cmFjZV9waWQodGhyZWFkKTsKICAgIGlmIChmbGFncyAmIENPTlRFWFRfRlVMTCkKICAgIHsKICAgICAgICBzdHJ1Y3Qga2VybmVsX3VzZXJfc3RydWN0IHJlZ3M7CiAgICAgICAgaWYgKHB0cmFjZSggUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnJlZ3MgKSA9PSAtMSkgZ290byBlcnJvcjsKICAgICAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0lOVEVHRVIpCiAgICAgICAgewogICAgICAgICAgICBjb250ZXh0LT5JbnRWMCA9IHJlZ3MucmVnc1tFRl9WMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQwID0gcmVncy5yZWdzW0VGX1QwXTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDEgPSByZWdzLnJlZ3NbRUZfVDFdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMiA9IHJlZ3MucmVnc1tFRl9UMl07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQzID0gcmVncy5yZWdzW0VGX1QzXTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDQgPSByZWdzLnJlZ3NbRUZfVDRdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUNSA9IHJlZ3MucmVnc1tFRl9UNV07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ2ID0gcmVncy5yZWdzW0VGX1Q2XTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDcgPSByZWdzLnJlZ3NbRUZfVDddOwogICAgICAgICAgICBjb250ZXh0LT5JbnRTMCA9IHJlZ3MucmVnc1tFRl9TMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFMxID0gcmVncy5yZWdzW0VGX1MxXTsKICAgICAgICAgICAgY29udGV4dC0+SW50UzIgPSByZWdzLnJlZ3NbRUZfUzJdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRTMyA9IHJlZ3MucmVnc1tFRl9TM107CiAgICAgICAgICAgIGNvbnRleHQtPkludFM0ID0gcmVncy5yZWdzW0VGX1M0XTsKICAgICAgICAgICAgY29udGV4dC0+SW50UzUgPSByZWdzLnJlZ3NbRUZfUzVdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRGcCA9IHJlZ3MucmVnc1tFRl9TNl07CiAgICAgICAgICAgIGNvbnRleHQtPkludEEwID0gcmVncy5yZWdzW0VGX0EwXTsKICAgICAgICAgICAgY29udGV4dC0+SW50QTEgPSByZWdzLnJlZ3NbRUZfQTFdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRBMiA9IHJlZ3MucmVnc1tFRl9BMl07CiAgICAgICAgICAgIGNvbnRleHQtPkludEEzID0gcmVncy5yZWdzW0VGX0EzXTsKICAgICAgICAgICAgY29udGV4dC0+SW50QTQgPSByZWdzLnJlZ3NbRUZfQTRdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRBNSA9IHJlZ3MucmVnc1tFRl9BNV07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ4ID0gcmVncy5yZWdzW0VGX1Q4XTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDkgPSByZWdzLnJlZ3NbRUZfVDldOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMTAgPSByZWdzLnJlZ3NbRUZfVDEwXTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDExID0gcmVncy5yZWdzW0VGX1QxMV07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQxMiA9IHJlZ3MucmVnc1tFRl9UMTJdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRBdCA9IHJlZ3MucmVnc1tFRl9BVF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFplcm8gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0NPTlRST0wpCiAgICAgICAgewogICAgICAgICAgICBjb250ZXh0LT5JbnRSYSA9IHJlZ3MucmVnc1tFRl9SQV07CiAgICAgICAgICAgIGNvbnRleHQtPkludEdwID0gcmVncy5yZWdzW0VGX0dQXTsKICAgICAgICAgICAgY29udGV4dC0+SW50U3AgPSByZWdzLnJlZ3NbRUZfU1BdOwogICAgICAgICAgICBjb250ZXh0LT5GaXIgPSByZWdzLnJlZ3NbRUZfUENdOwogICAgICAgICAgICBjb250ZXh0LT5Qc3IgPSByZWdzLnJlZ3NbRUZfUFNdOwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0ZMT0FUSU5HX1BPSU5UKQogICAgICAgIHsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjAgPSByZWdzLnJlZ3NbRUZfU0laRS84KzBdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjMgPSByZWdzLnJlZ3NbRUZfU0laRS84KzNdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGNCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrNF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEY1ID0gcmVncy5yZWdzW0VGX1NJWkUvOCs1XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjYgPSByZWdzLnJlZ3NbRUZfU0laRS84KzZdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGNyA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrN107CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEY4ID0gcmVncy5yZWdzW0VGX1NJWkUvOCs4XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjkgPSByZWdzLnJlZ3NbRUZfU0laRS84KzldOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTAgPSByZWdzLnJlZ3NbRUZfU0laRS84KzEwXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjExID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxMV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxMiA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTJdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTMgPSByZWdzLnJlZ3NbRUZfU0laRS84KzEzXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjE0ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxNF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxNSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTVdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTYgPSByZWdzLnJlZ3NbRUZfU0laRS84KzE2XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjE3ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxN107CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxOCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMThdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTkgPSByZWdzLnJlZ3NbRUZfU0laRS84KzE5XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjIwID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyMF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyMSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjFdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjIgPSByZWdzLnJlZ3NbRUZfU0laRS84KzIyXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjIzID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyM107CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyNCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjRdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjUgPSByZWdzLnJlZ3NbRUZfU0laRS84KzI1XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjI2ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyNl07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyNyA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjddOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjggPSByZWdzLnJlZ3NbRUZfU0laRS84KzI4XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjI5ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyOV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYzMCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMzBdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMzEgPSAwOwogICAgICAgICAgICBjb250ZXh0LT5GcGNyID0gcmVncy5yZWdzW0VGX1NJWkUvOCszMV07CiAgICAgICAgICAgIGNvbnRleHQtPlNvZnRGcGNyID0gMDsgLyogRklYTUUgKi8KICAgICAgICB9CiAgICAgICAgY29udGV4dC0+Q29udGV4dEZsYWdzIHw9IGZsYWdzICYgQ09OVEVYVF9GVUxMOwogICAgfQogICAgcmV0dXJuOwogZXJyb3I6CiAgICBmaWxlX3NldF9lcnJvcigpOwp9CgovKiBzZXQgYSB0aHJlYWQgY29udGV4dCAqLwpzdGF0aWMgdm9pZCBzZXRfdGhyZWFkX2NvbnRleHQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgdW5zaWduZWQgaW50IGZsYWdzLCBjb25zdCBDT05URVhUICpjb250ZXh0ICkKewogICAgaW50IHBpZCA9IGdldF9wdHJhY2VfcGlkKHRocmVhZCk7CiAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0ZVTEwpCiAgICB7CiAgICAgICAgc3RydWN0IGtlcm5lbF91c2VyX3N0cnVjdCByZWdzOwogICAgICAgIGlmIChwdHJhY2UoIFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsICZyZWdzICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9JTlRFR0VSKQogICAgICAgIHsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1YwXSA9IGNvbnRleHQtPkludFYwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDBdID0gY29udGV4dC0+SW50VDA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UMV0gPSBjb250ZXh0LT5JbnRUMTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1QyXSA9IGNvbnRleHQtPkludFQyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDNdID0gY29udGV4dC0+SW50VDM7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UNF0gPSBjb250ZXh0LT5JbnRUNDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1Q1XSA9IGNvbnRleHQtPkludFQ1OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDZdID0gY29udGV4dC0+SW50VDY7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UN10gPSBjb250ZXh0LT5JbnRUNzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1MwXSA9IGNvbnRleHQtPkludFMwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUzFdID0gY29udGV4dC0+SW50UzE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TMl0gPSBjb250ZXh0LT5JbnRTMjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1MzXSA9IGNvbnRleHQtPkludFMzOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUzRdID0gY29udGV4dC0+SW50UzQ7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TNV0gPSBjb250ZXh0LT5JbnRTNTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1M2XSA9IGNvbnRleHQtPkludEZwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfQTBdID0gY29udGV4dC0+SW50QTA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9BMV0gPSBjb250ZXh0LT5JbnRBMTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0EyXSA9IGNvbnRleHQtPkludEEyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfQTNdID0gY29udGV4dC0+SW50QTM7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9BNF0gPSBjb250ZXh0LT5JbnRBNDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0E1XSA9IGNvbnRleHQtPkludEE1OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDhdID0gY29udGV4dC0+SW50VDg7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UOV0gPSBjb250ZXh0LT5JbnRUOTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1QxMF0gPSBjb250ZXh0LT5JbnRUMTA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UMTFdID0gY29udGV4dC0+SW50VDExOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDEyXSA9IGNvbnRleHQtPkludFQxMjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0FUXSA9IGNvbnRleHQtPkludEF0OwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0NPTlRST0wpCiAgICAgICAgewogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUkFdID0gY29udGV4dC0+SW50UmE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9HUF0gPSBjb250ZXh0LT5JbnRHcDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NQXSA9IGNvbnRleHQtPkludFNwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUENdID0gY29udGV4dC0+RmlyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUFNdID0gY29udGV4dC0+UHNyOwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0ZMT0FUSU5HX1BPSU5UKQogICAgICAgIHsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCswXSA9IGNvbnRleHQtPkZsdEYwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzFdID0gY29udGV4dC0+Rmx0RjE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMl0gPSBjb250ZXh0LT5GbHRGMjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCszXSA9IGNvbnRleHQtPkZsdEYzOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzRdID0gY29udGV4dC0+Rmx0RjQ7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrNV0gPSBjb250ZXh0LT5GbHRGNTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCs2XSA9IGNvbnRleHQtPkZsdEY2OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzddID0gY29udGV4dC0+Rmx0Rjc7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrOF0gPSBjb250ZXh0LT5GbHRGODsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCs5XSA9IGNvbnRleHQtPkZsdEY5OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzEwXSA9IGNvbnRleHQtPkZsdEYxMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxMV0gPSBjb250ZXh0LT5GbHRGMTE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTJdID0gY29udGV4dC0+Rmx0RjEyOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzEzXSA9IGNvbnRleHQtPkZsdEYxMzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxNF0gPSBjb250ZXh0LT5GbHRGMTQ7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTVdID0gY29udGV4dC0+Rmx0RjE1OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzE2XSA9IGNvbnRleHQtPkZsdEYxNjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxN10gPSBjb250ZXh0LT5GbHRGMTc7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMThdID0gY29udGV4dC0+Rmx0RjE4OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzE5XSA9IGNvbnRleHQtPkZsdEYxOTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyMF0gPSBjb250ZXh0LT5GbHRGMjA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjFdID0gY29udGV4dC0+Rmx0RjIxOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzIyXSA9IGNvbnRleHQtPkZsdEYyMjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyM10gPSBjb250ZXh0LT5GbHRGMjM7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjRdID0gY29udGV4dC0+Rmx0RjI0OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzI1XSA9IGNvbnRleHQtPkZsdEYyNTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyNl0gPSBjb250ZXh0LT5GbHRGMjY7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjddID0gY29udGV4dC0+Rmx0RjI3OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzI4XSA9IGNvbnRleHQtPkZsdEYyODsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyOV0gPSBjb250ZXh0LT5GbHRGMjk7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMzBdID0gY29udGV4dC0+Rmx0RjMwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzMxXSA9IGNvbnRleHQtPkZwY3I7CiAgICAgICAgfQogICAgICAgIGlmIChwdHJhY2UoIFBUUkFDRV9TRVRSRUdTLCBwaWQsIDAsICZyZWdzICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAgICB9CiAgICByZXR1cm47CiBlcnJvcjoKICAgIGZpbGVfc2V0X2Vycm9yKCk7Cn0KCiNlbmRpZiAvKiAwICovCgovKiBjb3B5IGEgY29udGV4dCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyAqLwp2b2lkIGNvcHlfY29udGV4dCggQ09OVEVYVCAqdG8sIGNvbnN0IENPTlRFWFQgKmZyb20sIHVuc2lnbmVkIGludCBmbGFncyApCnsKICAgIGZsYWdzICY9IH5DT05URVhUX0FMUEhBOyAgLyogZ2V0IHJpZCBvZiBDUFUgaWQgKi8KICAgIGlmIChmbGFncyAmIENPTlRFWFRfQ09OVFJPTCkKICAgIHsKICAgICAgICB0by0+SW50UmEgPSBmcm9tLT5JbnRSYTsKICAgICAgICB0by0+SW50R3AgPSBmcm9tLT5JbnRHcDsKICAgICAgICB0by0+SW50U3AgPSBmcm9tLT5JbnRTcDsKICAgICAgICB0by0+RmlyID0gZnJvbS0+RmlyOwogICAgICAgIHRvLT5Qc3IgPSBmcm9tLT5Qc3I7CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0lOVEVHRVIpCiAgICB7CiAgICAgICAgdG8tPkludFYwID0gZnJvbS0+SW50VjA7CiAgICAgICAgdG8tPkludFQwID0gZnJvbS0+SW50VDA7CiAgICAgICAgdG8tPkludFQxID0gZnJvbS0+SW50VDE7CiAgICAgICAgdG8tPkludFQyID0gZnJvbS0+SW50VDI7CiAgICAgICAgdG8tPkludFQzID0gZnJvbS0+SW50VDM7CiAgICAgICAgdG8tPkludFQ0ID0gZnJvbS0+SW50VDQ7CiAgICAgICAgdG8tPkludFQ1ID0gZnJvbS0+SW50VDU7CiAgICAgICAgdG8tPkludFQ2ID0gZnJvbS0+SW50VDY7CiAgICAgICAgdG8tPkludFQ3ID0gZnJvbS0+SW50VDc7CiAgICAgICAgdG8tPkludFMwID0gZnJvbS0+SW50UzA7CiAgICAgICAgdG8tPkludFMxID0gZnJvbS0+SW50UzE7CiAgICAgICAgdG8tPkludFMyID0gZnJvbS0+SW50UzI7CiAgICAgICAgdG8tPkludFMzID0gZnJvbS0+SW50UzM7CiAgICAgICAgdG8tPkludFM0ID0gZnJvbS0+SW50UzQ7CiAgICAgICAgdG8tPkludFM1ID0gZnJvbS0+SW50UzU7CiAgICAgICAgdG8tPkludEZwID0gZnJvbS0+SW50RnA7CiAgICAgICAgdG8tPkludEEwID0gZnJvbS0+SW50QTA7CiAgICAgICAgdG8tPkludEExID0gZnJvbS0+SW50QTE7CiAgICAgICAgdG8tPkludEEyID0gZnJvbS0+SW50QTI7CiAgICAgICAgdG8tPkludEEzID0gZnJvbS0+SW50QTM7CiAgICAgICAgdG8tPkludEE0ID0gZnJvbS0+SW50QTQ7CiAgICAgICAgdG8tPkludEE1ID0gZnJvbS0+SW50QTU7CiAgICAgICAgdG8tPkludFQ4ID0gZnJvbS0+SW50VDg7CiAgICAgICAgdG8tPkludFQ5ID0gZnJvbS0+SW50VDk7CiAgICAgICAgdG8tPkludFQxMCA9IGZyb20tPkludFQxMDsKICAgICAgICB0by0+SW50VDExID0gZnJvbS0+SW50VDExOwogICAgICAgIHRvLT5JbnRUMTIgPSBmcm9tLT5JbnRUMTI7CiAgICAgICAgdG8tPkludEF0ID0gZnJvbS0+SW50QXQ7CiAgICAgICAgdG8tPkludFplcm8gPSBmcm9tLT5JbnRaZXJvOwogICAgfQogICAgaWYgKGZsYWdzICYgQ09OVEVYVF9GTE9BVElOR19QT0lOVCkKICAgIHsKICAgICAgICB0by0+Rmx0RjAgPSBmcm9tLT5GbHRGMDsKICAgICAgICB0by0+Rmx0RjEgPSBmcm9tLT5GbHRGMTsKICAgICAgICB0by0+Rmx0RjIgPSBmcm9tLT5GbHRGMjsKICAgICAgICB0by0+Rmx0RjMgPSBmcm9tLT5GbHRGMzsKICAgICAgICB0by0+Rmx0RjQgPSBmcm9tLT5GbHRGNDsKICAgICAgICB0by0+Rmx0RjUgPSBmcm9tLT5GbHRGNTsKICAgICAgICB0by0+Rmx0RjYgPSBmcm9tLT5GbHRGNjsKICAgICAgICB0by0+Rmx0RjcgPSBmcm9tLT5GbHRGNzsKICAgICAgICB0by0+Rmx0RjggPSBmcm9tLT5GbHRGODsKICAgICAgICB0by0+Rmx0RjkgPSBmcm9tLT5GbHRGOTsKICAgICAgICB0by0+Rmx0RjEwID0gZnJvbS0+Rmx0RjEwOwogICAgICAgIHRvLT5GbHRGMTEgPSBmcm9tLT5GbHRGMTE7CiAgICAgICAgdG8tPkZsdEYxMiA9IGZyb20tPkZsdEYxMjsKICAgICAgICB0by0+Rmx0RjEzID0gZnJvbS0+Rmx0RjEzOwogICAgICAgIHRvLT5GbHRGMTQgPSBmcm9tLT5GbHRGMTQ7CiAgICAgICAgdG8tPkZsdEYxNSA9IGZyb20tPkZsdEYxNTsKICAgICAgICB0by0+Rmx0RjE2ID0gZnJvbS0+Rmx0RjE2OwogICAgICAgIHRvLT5GbHRGMTcgPSBmcm9tLT5GbHRGMTc7CiAgICAgICAgdG8tPkZsdEYxOCA9IGZyb20tPkZsdEYxODsKICAgICAgICB0by0+Rmx0RjE5ID0gZnJvbS0+Rmx0RjE5OwogICAgICAgIHRvLT5GbHRGMjAgPSBmcm9tLT5GbHRGMjA7CiAgICAgICAgdG8tPkZsdEYyMSA9IGZyb20tPkZsdEYyMTsKICAgICAgICB0by0+Rmx0RjIyID0gZnJvbS0+Rmx0RjIyOwogICAgICAgIHRvLT5GbHRGMjMgPSBmcm9tLT5GbHRGMjM7CiAgICAgICAgdG8tPkZsdEYyNCA9IGZyb20tPkZsdEYyNDsKICAgICAgICB0by0+Rmx0RjI1ID0gZnJvbS0+Rmx0RjI1OwogICAgICAgIHRvLT5GbHRGMjYgPSBmcm9tLT5GbHRGMjY7CiAgICAgICAgdG8tPkZsdEYyNyA9IGZyb20tPkZsdEYyNzsKICAgICAgICB0by0+Rmx0RjI4ID0gZnJvbS0+Rmx0RjI4OwogICAgICAgIHRvLT5GbHRGMjkgPSBmcm9tLT5GbHRGMjk7CiAgICAgICAgdG8tPkZsdEYzMCA9IGZyb20tPkZsdEYzMDsKICAgICAgICB0by0+Rmx0RjMxID0gZnJvbS0+Rmx0RjMxOwogICAgICAgIHRvLT5GcGNyID0gZnJvbS0+RnBjcjsKICAgICAgICB0by0+U29mdEZwY3IgPSBmcm9tLT5Tb2Z0RnBjcjsKICAgIH0KICAgIHRvLT5Db250ZXh0RmxhZ3MgfD0gZmxhZ3M7Cn0KCi8qIHJldHJpZXZlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgb2YgYSBjb250ZXh0ICovCnZvaWQgKmdldF9jb250ZXh0X2lwKCBjb25zdCBDT05URVhUICpjb250ZXh0ICkKewogICAgcmV0dXJuICh2b2lkICopY29udGV4dC0+RmlyOwp9CgovKiByZXR1cm4gdGhlIGNvbnRleHQgZmxhZyB0aGF0IGNvbnRhaW5zIHRoZSBDUFUgaWQgKi8KdW5zaWduZWQgaW50IGdldF9jb250ZXh0X2NwdV9mbGFnKHZvaWQpCnsKICAgIHJldHVybiBDT05URVhUX0FMUEhBOwp9CgovKiByZXR1cm4gb25seSB0aGUgY29udGV4dCBmbGFncyB0aGF0IGNvcnJlc3BvbmQgdG8gc3lzdGVtIHJlZ3MgKi8KLyogKHN5c3RlbSByZWdzIGFyZSB0aGUgb25lcyB3ZSBjYW4ndCBhY2Nlc3Mgb24gdGhlIGNsaWVudCBzaWRlKSAqLwp1bnNpZ25lZCBpbnQgZ2V0X2NvbnRleHRfc3lzdGVtX3JlZ3MoIHVuc2lnbmVkIGludCBmbGFncyApCnsKICAgIHJldHVybiAwOyAgLyogRklYTUU6IGltcGxlbWVudCBjbGllbnQtc2lkZSBoYW5kbGluZyAqLwp9CgojZW5kaWYgIC8qIF9fQUxQSEFfXyAqLwo=