LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmN0YW5oIGZ1bmN0aW9uLgogICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgogICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCiNpZmRlZiBfX0VMRl9fCgkuc2VjdGlvbiAucm9kYXRhCiNlbHNlCgkudGV4dAojZW5kaWYKCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8qIFBsZWFzZSBub3RlIHRoYXQgd2UgdXNlIGRvdWJsZSB2YWx1ZXMgZm9yIDAuNSBhbmQgMS4wLiAgVGhlc2UKCSAgIG51bWJlcnMgaGF2ZSBleGFjdCByZXByZXNlbnRhdGlvbnMgYW5kIHNvIHdlIGRvbid0IGdldCBhY2N1cmFjeQoJICAgcHJvYmxlbXMuICBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhlIGNvZGUgaXMgc2ltcGxlci4gICovCglBU01fVFlQRV9ESVJFQ1RJVkUoaGFsZixAb2JqZWN0KQpoYWxmOgkuZG91YmxlIDAuNQoJQVNNX1NJWkVfRElSRUNUSVZFKGhhbGYpCglBU01fVFlQRV9ESVJFQ1RJVkUob25lLEBvYmplY3QpCm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkvKiBJdCBpcyBub3QgaW1wb3J0YW50IHRoYXQgdGhpcyBjb25zdGFudCBpcyBwcmVjaXNlLiAgSXQgaXMgb25seQoJICAgYSB2YWx1ZSB3aGljaCBpcyBrbm93biB0byBiZSBvbiB0aGUgc2FmZSBzaWRlIGZvciB1c2luZyB0aGUKCSAgIGZ5bDJ4cDEgaW5zdHJ1Y3Rpb24uICAqLwoJQVNNX1RZUEVfRElSRUNUSVZFKGxpbWl0LEBvYmplY3QpCmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJQVNNX1RZUEVfRElSRUNUSVZFKGxuMl8yLEBvYmplY3QpCmxuMl8yOgkudGZsb2F0IDAuMzQ2NTczNTkwMjc5OTcyNjU0NzA4NjE2MAoJQVNNX1NJWkVfRElSRUNUSVZFKGxuMl8yKQoKI2lmZGVmIFBJQwojZGVmaW5lIE1PKG9wKSBvcCMjQEdPVE9GRiglZWR4KQojZWxzZQojZGVmaW5lIE1PKG9wKSBvcAojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfYXRhbmhsKQoJbW92bAkxMiglZXNwKSwgJWVjeAoKCW1vdmwJJWVjeCwgJWVheAoJYW5kbAkkMHg3ZmZmLCAlZWF4CgljbXBsCSQweDdmZmYsICVlYXgKCWplCTVmCjc6CgojaWZkZWYgUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCglhbmRsCSQweDgwMDAsICVlY3gJLy8gRUNYID09IDAgaWZmIFggPj0gMAoKCWZsZHQJTU8obG4yXzIpCS8vIDAuNSpsbjIKCXhvcmwJJWVjeCwgMTIoJWVzcCkKCWZsZHQJNCglZXNwKQkJLy8gfHh8IDogMC41KmxuMgoJZmNvbWwJTU8oaGFsZikJLy8gfHh8IDogMC41KmxuMgoJZmxkCSVzdCgwKQkJLy8gfHh8IDogfHh8IDogMC41KmxuMgoJZm5zdHN3CQkJLy8gfHh8IDogfHh8IDogMC41KmxuMgoJc2FoZgoJamFlCTJmCglmYWRkCSVzdCwgJXN0KDEpCS8vIHx4fCA6IDIqfHh8IDogMC41KmxuMgoJZmxkCSVzdAkJLy8gfHh8IDogfHh8IDogMip8eHwgOiAwLjUqbG4yCglmc3VicmwJTU8ob25lKQkJLy8gMS18eHwgOiB8eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZ4Y2gJCQkvLyB8eHwgOiAxLXx4fCA6IDIqfHh8IDogMC41KmxuMgoJZm11bAklc3QoMikJCS8vIDIqfHh8XjIgOiAxLXx4fCA6IDIqfHh8IDogMC41KmxuMgoJZmRpdnAJCQkvLyAoMip8eHxeMikvKDEtfHh8KSA6IDIqfHh8IDogMC41KmxuMgoJZmFkZHAJCQkvLyAyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCWZjb21sCU1PKGxpbWl0KQkvLyAyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCWZuc3RzdwkJCS8vIDIqfHh8KygyKnx4fF4yKS8oMS18eHwpIDogMC41KmxuMgoJc2FoZgoJamFlCTRmCglmeWwyeHAxCQkJLy8gMC41KmxuMipsZCgxKzIqfHh8KygyKnx4fF4yKS8oMS18eHwpKQoJamVjeHoJM2YKCWZjaHMJCQkvLyAwLjUqbG4yKmxkKDErMip4KygyKnheMikvKDEteCkpCjM6CXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQo0OglmYWRkbAlNTyhvbmUpCQkvLyAxKzIqfHh8KygyKnx4fF4yKS8oMS18eHwpIDogMC41KmxuMgoJZnlsMngJCQkvLyAwLjUqbG4yKmxkKDErMip8eHwrKDIqfHh8XjIpLygxLXx4fCkpCglqZWN4egkzZgoJZmNocwkJCS8vIDAuNSpsbjIqbGQoMSsyKngrKDIqeF4yKS8oMS14KSkKMzoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CWZhZGRsCU1PKG9uZSkJCS8vIDErfHh8IDogfHh8IDogMC41KmxuMgoJZnhjaAkJCS8vIHx4fCA6IDErfHh8IDogMC41KmxuMgoJZnN1YnJsCU1PKG9uZSkJCS8vIDEtfHh8IDogMSt8eHwgOiAwLjUqbG4yCglmZGl2cnAJCQkvLyAoMSt8eHwpLygxLXx4fCkgOiAwLjUqbG4yCglmeWwyeAkJCS8vIDAuNSpsbjIqbGQoKDErfHh8KS8oMS18eHwpKQoJamVjeHoJM2YKCWZjaHMJCQkvLyAwLjUqbG4yKmxkKCgxK3gpLygxLXgpKQozOglyZXQKCgkvLyB4ID09IE5hTiBvciCxSW5mCjU6CWNtcGwJJDB4ODAwMDAwMDAsIDgoJWVzcCkKCWphCTZmCgljbXBsCSQwLCA0KCVlc3ApCglqZQk3Ygo2OglmbGR0CTQoJWVzcCkKCXJldApFTkQoX19pZWVlNzU0X2F0YW5obCkK