LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmNzaW5oLgogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CiNpbmNsdWRlIDxsaWJtLWFsaWFzLWRvdWJsZS5oPgoKCS5zZWN0aW9uIC5yb2RhdGEKCgkuYWxpZ24gQUxJR05BUkcoNCkKCS50eXBlIGh1Z2UsQG9iamVjdApodWdlOgkuZG91YmxlIDFlKzMwMAoJQVNNX1NJWkVfRElSRUNUSVZFKGh1Z2UpCgkudHlwZSBvbmUsQG9iamVjdApvbmU6CS5kb3VibGUgMS4wCglBU01fU0laRV9ESVJFQ1RJVkUob25lKQoJLnR5cGUgbGltaXQsQG9iamVjdApsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCgojaWZkZWYgUElDCiNkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlZHgpCiNlbHNlCiNkZWZpbmUgTU8ob3ApIG9wCiNlbmRpZgoKCS50ZXh0CkVOVFJZKF9fYXNpbmgpCgltb3ZsCTgoJWVzcCksICVlY3gKCW1vdmwJJDB4N2ZmZmZmZmYsICVlYXgKCWFuZGwJJWVjeCwgJWVheAoJYW5kbAkkMHg4MDAwMDAwMCwgJWVjeAoJbW92bAklZWF4LCAlZWR4CglvcmwJJDB4ODAwZmZmZmYsICVlZHgKCWluY2wJJWVkeAoJanoJN2YJCQkvLyB4IGluILFJbmYgb3IgTmFOCgl4b3JsCSVlY3gsIDgoJWVzcCkKCWZsZGwJNCglZXNwKQkJCS8vIHx4fAoJY21wbAkkMHgzZTMwMDAwMCwgJWVheAoJamIJMmYJCQkvLyB8eHwgPCAyXi0yOAoJZmxkbG4yCQkJCS8vIGxvZygyKSA6IHx4fAoJY21wbAkkMHg0MWIwMDAwMCwgJWVheAoJZnhjaAkJCQkvLyB8eHwgOiBsb2coMikKCWphCTNmCQkJLy8gfHh8ID4gMl4yOAojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCWNtcGwJJDB4NDAwMDAwMDAsICVlYXgKCWphCTVmCQkJLy8gfHh8ID4gMgoKCS8vIDJeLTI4IDw9IHx4fCA8PSAyID0+IHkgPSBzaWduKHgpKmxvZzFwKHx4fCt8eHxeMi8oMStzcXJ0KDErfHh8XjIpKSkKCWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiBsb2coMikKCWZtdWwJJXN0KDEpCQkJLy8gfHh8XjIgOiB8eHwgOiBsb2coMikKCWZsZAklc3QJCQkvLyB8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmYWRkbAlNTyhvbmUpCQkJLy8gMSt8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmc3FydAkJCQkvLyBzcXJ0KDErfHh8XjIpIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3NxcnQoMSt8eHxeMikgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmRpdnJwCQkJCS8vIHx4fF4yLygxK3NxcnQoMSt8eHxeMikpIDogfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyB8eHwrfHh8XjIvKDErc3FydCgxK3x4fF4yKSkgOiBsb2coMikKCWZjb21sCU1PKGxpbWl0KQoJZm5zdHN3CglzYWhmCglqYQk2ZgoJZnlsMnhwMQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0Cgo3OglmbGRsCTQoJWVzcCkKCXJldAoKNjoJZmFkZGwJTU8ob25lKQoJZnlsMngKCWplY3h6CTRmCglmY2hzCjQ6CXJldAoKCS8vIHx4fCA8IDJeLTI4ID0+IHkgPSB4IChpbmV4YWN0IGlmZiB8eHwgIT0gMC4wKQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CiNpZmRlZglQSUMKCUxPQURfUElDX1JFRyAoZHgpCiNlbmRpZgoJamVjeHoJNGYKCWZjaHMJCQkJLy8geAo0OglmbGQJJXN0CQkJLy8geCA6IHgKCWZhZGRsCU1PKGh1Z2UpCQkvLyBodWdlK3ggOiB4Cglmc3RwCSVzdCgwKQkJCS8vIHgKCWNtcGwJJDB4MDAxMDAwMDAsICVlYXgKCWphZQk4ZgoJc3VibAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJZmxkCSVzdCgwKQoJZm11bAklc3QoMCkKCWZzdHBsCSglZXNwKQoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKODoJcmV0CgoJLy8gfHh8ID4gMl4yOCA9PiB5ID0gc2lnbih4KSAqIChsb2cofHh8KSArIGxvZygyKSkKCS5hbGlnbiBBTElHTkFSRyg0KQozOglmeWwyeAkJCQkvLyBsb2cofHh8KQoJZmxkbG4yCQkJCS8vIGxvZygyKSA6IGxvZyh8eHwpCglmYWRkcAkJCQkvLyBsb2cofHh8KStsb2coMikKCWplY3h6CTRmCglmY2hzCjQ6CXJldAoKCS8vIHx4fCA+IDIgPT4geSA9IHNpZ24oeCkgKiBsb2coMip8eHwgKyAxLyh8eHwrc3FydCh4KngrMSkpKQoJLmFsaWduIEFMSUdOQVJHKDQpCjU6CWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiBsb2coMikKCWZhZGQJJXN0LCAlc3QoMSkJCS8vIHx4fCA6IDIqfHh8IDogbG9nKDIpCglmbGQJJXN0CQkJLy8gfHh8IDogfHh8IDogMip8eHwgOiBsb2coMikKCWZtdWwJJXN0KDEpCQkJLy8gfHh8XjIgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmFkZGwJTU8ob25lKQkJCS8vIDErfHh8XjIgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZnNxcnQJCQkJLy8gc3FydCgxK3x4fF4yKSA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyB8eHwrc3FydCgxK3x4fF4yKSA6IDIqfHh8IDogbG9nKDIpCglmZGl2cmwJTU8ob25lKQkJCS8vIDEvKHx4fCtzcXJ0KDErfHh8XjIpKSA6IDIqfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyAyKnx4fCsxLyh8eHwrc3FydCgxK3x4fF4yKSkgOiBsb2coMikKCWZ5bDJ4CQkJCS8vIGxvZygyKnx4fCsxLyh8eHwrc3FydCgxK3x4fF4yKSkpCglqZWN4egk0ZgoJZmNocwo0OglyZXQKRU5EKF9fYXNpbmgpCmxpYm1fYWxpYXNfZG91YmxlIChfX2FzaW5oLCBhc2luaCkK