LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKTGliZ2ZvcnRyYW4gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCnBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAphIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOwpzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KCiNpbmNsdWRlICJsaWJnZm9ydHJhbi5oIgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgoKI2lmIGRlZmluZWQgKEhBVkVfR0ZDX0NPTVBMRVhfMTYpCgpleHRlcm4gdm9pZCB0cmFuc3Bvc2VfYzE2IChnZmNfYXJyYXlfYzE2ICogY29uc3QgcmVzdHJpY3QgcmV0LCAKCWdmY19hcnJheV9jMTYgKiBjb25zdCByZXN0cmljdCBzb3VyY2UpOwpleHBvcnRfcHJvdG8odHJhbnNwb3NlX2MxNik7Cgp2b2lkCnRyYW5zcG9zZV9jMTYgKGdmY19hcnJheV9jMTYgKiBjb25zdCByZXN0cmljdCByZXQsIAoJZ2ZjX2FycmF5X2MxNiAqIGNvbnN0IHJlc3RyaWN0IHNvdXJjZSkKewogIC8qIHIuKiBpbmRpY2F0ZXMgdGhlIHJldHVybiBhcnJheS4gICovCiAgaW5kZXhfdHlwZSByeHN0cmlkZSwgcnlzdHJpZGU7CiAgR0ZDX0NPTVBMRVhfMTYgKiByZXN0cmljdCBycHRyOwogIC8qIHMuKiBpbmRpY2F0ZXMgdGhlIHNvdXJjZSBhcnJheS4gICovCiAgaW5kZXhfdHlwZSBzeHN0cmlkZSwgc3lzdHJpZGU7CiAgY29uc3QgR0ZDX0NPTVBMRVhfMTYgKnNwdHI7CgogIGluZGV4X3R5cGUgeGNvdW50LCB5Y291bnQ7CiAgaW5kZXhfdHlwZSB4LCB5OwoKICBhc3NlcnQgKEdGQ19ERVNDUklQVE9SX1JBTksgKHNvdXJjZSkgPT0gMik7CgogIGlmIChyZXQtPmJhc2VfYWRkciA9PSBOVUxMKQogICAgewogICAgICBhc3NlcnQgKEdGQ19ERVNDUklQVE9SX1JBTksgKHJldCkgPT0gMik7CiAgICAgIGFzc2VydCAocmV0LT5kdHlwZSA9PSBzb3VyY2UtPmR0eXBlKTsKCiAgICAgIEdGQ19ESU1FTlNJT05fU0VUKHJldC0+ZGltWzBdLCAwLCBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDEpIC0gMSwKCQkJMSk7CgogICAgICBHRkNfRElNRU5TSU9OX1NFVChyZXQtPmRpbVsxXSwgMCwgR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwwKSAtIDEsCgkJCUdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsIDEpKTsKCiAgICAgIHJldC0+YmFzZV9hZGRyID0geG1hbGxvYyAoc2l6ZW9mIChHRkNfQ09NUExFWF8xNikgKiBzaXplMCAoKGFycmF5X3QgKikgcmV0KSk7CiAgICAgIHJldC0+b2Zmc2V0ID0gMDsKICAgIH0gZWxzZSBpZiAodW5saWtlbHkgKGNvbXBpbGVfb3B0aW9ucy5ib3VuZHNfY2hlY2spKQogICAgewogICAgICBpbmRleF90eXBlIHJldF9leHRlbnQsIHNyY19leHRlbnQ7CgogICAgICByZXRfZXh0ZW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHJldCwwKTsKICAgICAgc3JjX2V4dGVudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMSk7CgogICAgICBpZiAoc3JjX2V4dGVudCAhPSByZXRfZXh0ZW50KQoJcnVudGltZV9lcnJvciAoIkluY29ycmVjdCBleHRlbnQgaW4gcmV0dXJuIHZhbHVlIG9mIFRSQU5TUE9TRSIKCQkgICAgICAgIiBpbnRyaW5zaWMgaW4gZGltZW5zaW9uIDE6IGlzICVsZCwiCgkJICAgICAgICIgc2hvdWxkIGJlICVsZCIsIChsb25nIGludCkgc3JjX2V4dGVudCwKCQkgICAgICAgKGxvbmcgaW50KSByZXRfZXh0ZW50KTsKCiAgICAgIHJldF9leHRlbnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQocmV0LDEpOwogICAgICBzcmNfZXh0ZW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwwKTsKCiAgICAgIGlmIChzcmNfZXh0ZW50ICE9IHJldF9leHRlbnQpCglydW50aW1lX2Vycm9yICgiSW5jb3JyZWN0IGV4dGVudCBpbiByZXR1cm4gdmFsdWUgb2YgVFJBTlNQT1NFIgoJCSAgICAgICAiIGludHJpbnNpYyBpbiBkaW1lbnNpb24gMjogaXMgJWxkLCIKCQkgICAgICAgIiBzaG91bGQgYmUgJWxkIiwgKGxvbmcgaW50KSBzcmNfZXh0ZW50LAoJCSAgICAgICAobG9uZyBpbnQpIHJldF9leHRlbnQpOwoKICAgIH0KCiAgc3hzdHJpZGUgPSBHRkNfREVTQ1JJUFRPUl9TVFJJREUoc291cmNlLDApOwogIHN5c3RyaWRlID0gR0ZDX0RFU0NSSVBUT1JfU1RSSURFKHNvdXJjZSwxKTsKICB4Y291bnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDApOwogIHljb3VudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMSk7CgogIHJ4c3RyaWRlID0gR0ZDX0RFU0NSSVBUT1JfU1RSSURFKHJldCwwKTsKICByeXN0cmlkZSA9IEdGQ19ERVNDUklQVE9SX1NUUklERShyZXQsMSk7CgogIHJwdHIgPSByZXQtPmJhc2VfYWRkcjsKICBzcHRyID0gc291cmNlLT5iYXNlX2FkZHI7CgogIGZvciAoeT0wOyB5IDwgeWNvdW50OyB5KyspCiAgICB7CiAgICAgIGZvciAoeD0wOyB4IDwgeGNvdW50OyB4KyspCiAgICAgICAgewogICAgICAgICAgKnJwdHIgPSAqc3B0cjsKCiAgICAgICAgICBzcHRyICs9IHN4c3RyaWRlOwogICAgICAgICAgcnB0ciArPSByeXN0cmlkZTsKICAgICAgICB9CiAgICAgICAgc3B0ciArPSBzeXN0cmlkZSAtIChzeHN0cmlkZSAqIHhjb3VudCk7CiAgICAgICAgcnB0ciArPSByeHN0cmlkZSAtIChyeXN0cmlkZSAqIHhjb3VudCk7CiAgICB9Cn0KCiNlbmRpZgo=