ZGlmZiAtLWdpdCBhL2h3L3ZtcG9ydC5jIGIvaHcvdm1wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3N2ZlOAotLS0gL2Rldi9udWxsCisrKyBiL2h3L3ZtcG9ydC5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBRRU1VIFZNUG9ydCBlbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSGVydukgUG91c3NpbmVhdQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgInZsLmgiCisjaW5jbHVkZSAiY3B1LWFsbC5oIgorCisjZGVmaW5lIFZNUE9SVF9DTURfR0VUVkVSU0lPTiAweDBhCisjZGVmaW5lIFZNUE9SVF9DTURfR0VUUkFNU0laRSAweDE0CisKKyNkZWZpbmUgVk1QT1JUX0VOVFJJRVMgMHgyYworI2RlZmluZSBWTVBPUlRfTUFHSUMgICAweDU2NEQ1ODY4CisKK3R5cGVkZWYgc3RydWN0IF9WTVBvcnRTdGF0ZQoreworICAgIENQVVN0YXRlICplbnY7CisgICAgSU9Qb3J0UmVhZEZ1bmMgKmZ1bmNbVk1QT1JUX0VOVFJJRVNdOworICAgIHZvaWQgKm9wYXF1ZVtWTVBPUlRfRU5UUklFU107Cit9IFZNUG9ydFN0YXRlOworCitzdGF0aWMgVk1Qb3J0U3RhdGUgcG9ydF9zdGF0ZTsKKwordm9pZCB2bXBvcnRfcmVnaXN0ZXIodW5zaWduZWQgY2hhciBjb21tYW5kLCBJT1BvcnRSZWFkRnVuYyAqZnVuYywgdm9pZCAqb3BhcXVlKQoreworICAgIGlmIChjb21tYW5kID49IFZNUE9SVF9FTlRSSUVTKQorICAgICAgICByZXR1cm47CisKKyAgICBwb3J0X3N0YXRlLmZ1bmNbY29tbWFuZF0gPSBmdW5jOworICAgIHBvcnRfc3RhdGUub3BhcXVlW2NvbW1hbmRdID0gb3BhcXVlOworfQorCitzdGF0aWMgdWludDMyX3Qgdm1wb3J0X2lvcG9ydF9yZWFkKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcikKK3sKKyAgICBWTVBvcnRTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CisgICAgdGFyZ2V0X3Vsb25nIGVheDsKKworICAgIGVheCA9IHMtPmVudi0+cmVnc1tSX0VBWF07CisgICAgaWYgKGVheCAhPSBWTVBPUlRfTUFHSUMpCisgICAgICAgIHJldHVybiBlYXg7CisKKyAgICBjb21tYW5kID0gcy0+ZW52LT5yZWdzW1JfRUNYXTsKKyAgICBpZiAoY29tbWFuZCA+PSBWTVBPUlRfRU5UUklFUykKKyAgICAgICAgcmV0dXJuIGVheDsKKyAgICBpZiAoIXMtPmZ1bmNbY29tbWFuZF0pCisgICAgeworICAgICAgICBwcmludGYoInZtcG9ydDogdW5rbm93biBjb21tYW5kICV4XG4iLCBjb21tYW5kKTsKKyAgICAgICAgcmV0dXJuIGVheDsKKyAgICB9CisKKyAgICByZXR1cm4gcy0+ZnVuY1tjb21tYW5kXShzLT5vcGFxdWVbY29tbWFuZF0sIGFkZHIpOworfQorCitzdGF0aWMgdWludDMyX3Qgdm1wb3J0X2NtZF9nZXRfdmVyc2lvbih2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIpCit7CisgICAgQ1BVU3RhdGUgKmVudiA9IG9wYXF1ZTsKKyAgICBlbnYtPnJlZ3NbUl9FQlhdID0gVk1QT1JUX01BR0lDOworICAgIHJldHVybiA2OworfQorCitzdGF0aWMgdWludDMyX3Qgdm1wb3J0X2NtZF9yYW1fc2l6ZSh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIpCit7CisgICAgQ1BVU3RhdGUgKmVudiA9IG9wYXF1ZTsKKyAgICBlbnYtPnJlZ3NbUl9FQlhdID0gMHgxMTc3OworICAgIHJldHVybiByYW1fc2l6ZTsKK30KKwordm9pZCB2bXBvcnRfaW5pdChDUFVTdGF0ZSAqZW52KQoreworICAgIHBvcnRfc3RhdGUuZW52ID0gZW52OworCisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoMHg1NjU4LCAxLCA0LCB2bXBvcnRfaW9wb3J0X3JlYWQsICZwb3J0X3N0YXRlKTsKKworICAgIC8qIFJlZ2lzdGVyIHNvbWUgZ2VuZXJpYyBwb3J0IGNvbW1hbmRzICovCisgICAgdm1wb3J0X3JlZ2lzdGVyKFZNUE9SVF9DTURfR0VUVkVSU0lPTiwgdm1wb3J0X2NtZF9nZXRfdmVyc2lvbiwgZW52KTsKKyAgICB2bXBvcnRfcmVnaXN0ZXIoVk1QT1JUX0NNRF9HRVRSQU1TSVpFLCB2bXBvcnRfY21kX3JhbV9zaXplLCBlbnYpOworfQo=