LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL2JjY19yb3VuZGluZ19jb250cm9sLmhwcCBmaWxlCiAqCiAqIENvcHlyaWdodCAyMDAwIEplbnMgTWF1cmVyCiAqIENvcHlyaWdodCAyMDAyIEhlcnbpIEJy9m5uaW1hbm4sIEd1aWxsYXVtZSBNZWxxdWlvbmQsIFN5bHZhaW4gUGlvbgogKgogKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCiAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCiAqIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQogKi8KCiNpZm5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfQkNDX1JPVU5ESU5HX0NPTlRST0xfSFBQCiNkZWZpbmUgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfQkNDX1JPVU5ESU5HX0NPTlRST0xfSFBQCgojaWZuZGVmIF9fQk9STEFORENfXwojICBlcnJvciBUaGlzIGhlYWRlciBpcyBvbmx5IGludGVuZGVkIGZvciBCb3JsYW5kIEMrKy4KI2VuZGlmCgojaWZuZGVmIF9NX0lYODYKIyAgZXJyb3IgVGhpcyBoZWFkZXIgb25seSB3b3JrcyBvbiB4ODYgQ1BVcy4KI2VuZGlmCgojaW5jbHVkZSA8ZmxvYXQuaD4gICAgICAvLyBCb3JsYW5kIEMrKyByb3VuZGluZyBjb250cm9sCgpuYW1lc3BhY2UgYm9vc3QgewpuYW1lc3BhY2UgbnVtZXJpYyB7Cm5hbWVzcGFjZSBpbnRlcnZhbF9saWIgewpuYW1lc3BhY2UgZGV0YWlsIHsKCiNpZm5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9LRUVQX0VYQ0VQVElPTlNfRk9SX0JDQwpleHRlcm4gIkMiIHsgdW5zaWduZWQgaW50IF9SVExFTlRSWSBfZm1faW5pdCh2b2lkKTsgfQoKc3RydWN0IGJvcmxhbmRfd29ya2Fyb3VuZCB7CiAgYm9ybGFuZF93b3JrYXJvdW5kKCkgeyBfZm1faW5pdCgpOyB9Cn07CgpzdGF0aWMgYm9ybGFuZF93b3JrYXJvdW5kIGJvcmxhbmRfd29ya2Fyb3VuZF9leGVjOwojZW5kaWYgLy8gQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9LRUVQX0VYQ0VQVElPTlNfRk9SX0JDQwoKX19pbmxpbmUgZG91YmxlIHJpbnQoZG91YmxlKQp7IF9fZW1pdF9fKDB4RDkpOyBfX2VtaXRfXygweEZDKTsgLyogYXNtIEZSTkRJTlQgKi8gfQoKc3RydWN0IHg4Nl9yb3VuZGluZwp7CiAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgcm91bmRpbmdfbW9kZTsKICBzdGF0aWMgdm9pZCBnZXRfcm91bmRpbmdfbW9kZShyb3VuZGluZ19tb2RlJiBtb2RlKQogIHsgbW9kZSA9IF9jb250cm9sODcoMCwgMCk7IH0KICBzdGF0aWMgdm9pZCBzZXRfcm91bmRpbmdfbW9kZShjb25zdCByb3VuZGluZ19tb2RlIG1vZGUpCiAgeyBfY29udHJvbDg3KG1vZGUsIDB4ZmZmZik7IH0gCiAgc3RhdGljIGRvdWJsZSB0b19pbnQoY29uc3QgZG91YmxlJiB4KSB7IHJldHVybiByaW50KHgpOyB9Cn07Cgp9IC8vIG5hbWVzcGFjZSBkZXRhaWwKfSAvLyBuYW1lc3BhY2UgaW50ZXJ2YWxfbGliCn0gLy8gbmFtZXNwYWNlIG51bWVyaWMKfSAvLyBuYW1lc3BhY2UgYm9vc3QKCiNlbmRpZiAvKiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9CQ0NfUk9VTkRJTkdfQ09OVFJPTF9IUFAgKi8K