LyoKICoKICogQ29weXJpZ2h0IChjKSAyMDAzCiAqIEZyYW7nb2lzIER1bW9udAogKgogKiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGggYWJzb2x1dGVseSBubyB3YXJyYW50eSBleHByZXNzZWQKICogb3IgaW1wbGllZC4gQW55IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSBvciBjb3B5IHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkCiAqIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkLAogKiBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcwogKiBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgogKgogKi8KCgojaWZuZGVmIF9TVExQX1RZUEVfTUFOSVBTX0gKI2RlZmluZSBfU1RMUF9UWVBFX01BTklQU19ICgpfU1RMUF9CRUdJTl9OQU1FU1BBQ0UKCnN0cnVjdCBfX3RydWVfdHlwZSB7fTsKc3RydWN0IF9fZmFsc2VfdHlwZSB7fTsKCiNpZiBkZWZpbmVkIChfU1RMUF9VU0VfTkFNRVNQQUNFUykKX1NUTFBfTU9WRV9UT19QUklWX05BTUVTUEFDRQp1c2luZyBfU1RMUF9TVEQ6Ol9fdHJ1ZV90eXBlOwp1c2luZyBfU1RMUF9TVEQ6Ol9fZmFsc2VfdHlwZTsKX1NUTFBfTU9WRV9UT19TVERfTkFNRVNQQUNFCiNlbmRpZgoKLy9ib29sIHRvIHR5cGUKdGVtcGxhdGUgPGludCBfSXM+CnN0cnVjdCBfX2Jvb2wydHlwZQp7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKCl9TVExQX1RFTVBMQVRFX05VTEwKc3RydWN0IF9fYm9vbDJ0eXBlPDE+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwoKX1NUTFBfVEVNUExBVEVfTlVMTApzdHJ1Y3QgX19ib29sMnR5cGU8MD4geyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwoKLy90eXBlIHRvIGJvb2wKdGVtcGxhdGUgPGNsYXNzIF9fYm9vbF90eXBlPgpzdHJ1Y3QgX190eXBlMmJvb2wgeyBlbnVtIHtfUmV0ID0gMX07IH07CgpfU1RMUF9URU1QTEFURV9OVUxMCnN0cnVjdCBfX3R5cGUyYm9vbDxfX3RydWVfdHlwZT4geyBlbnVtIHtfUmV0ID0gMX07IH07CgpfU1RMUF9URU1QTEFURV9OVUxMCnN0cnVjdCBfX3R5cGUyYm9vbDxfX2ZhbHNlX3R5cGU+IHsgZW51bSB7X1JldCA9IDB9OyB9OwoKLy9OZWdhdGlvbgp0ZW1wbGF0ZSA8Y2xhc3MgX0Jvb2xUeXBlPgpzdHJ1Y3QgX05vdCB7IHR5cGVkZWYgX19mYWxzZV90eXBlIF9SZXQ7IH07CgpfU1RMUF9URU1QTEFURV9OVUxMCnN0cnVjdCBfTm90PF9fZmFsc2VfdHlwZT4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CgovLyBsb2dpY2FsIGFuZCBvZiAyIHByZWRpY2F0ZWQKdGVtcGxhdGUgPGNsYXNzIF9QMSwgY2xhc3MgX1AyPgpzdHJ1Y3QgX0xhbmQyIHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKCl9TVExQX1RFTVBMQVRFX05VTEwKc3RydWN0IF9MYW5kMjxfX3RydWVfdHlwZSwgX190cnVlX3R5cGU+IHsgdHlwZWRlZiBfX3RydWVfdHlwZSBfUmV0OyB9OwoKLy8gbG9naWNhbCBhbmQgb2YgMyBwcmVkaWNhdGVkCnRlbXBsYXRlIDxjbGFzcyBfUDEsIGNsYXNzIF9QMiwgY2xhc3MgX1AzPgpzdHJ1Y3QgX0xhbmQzIHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKCl9TVExQX1RFTVBMQVRFX05VTEwKc3RydWN0IF9MYW5kMzxfX3RydWVfdHlwZSwgX190cnVlX3R5cGUsIF9fdHJ1ZV90eXBlPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKCi8vbG9naWNhbCBvciBvZiAyIHByZWRpY2F0ZWQKdGVtcGxhdGUgPGNsYXNzIF9QMSwgY2xhc3MgX1AyPgpzdHJ1Y3QgX0xvcjIgeyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CgpfU1RMUF9URU1QTEFURV9OVUxMCnN0cnVjdCBfTG9yMjxfX2ZhbHNlX3R5cGUsIF9fZmFsc2VfdHlwZT4geyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwoKLy8gbG9naWNhbCBvciBvZiAzIHByZWRpY2F0ZWQKdGVtcGxhdGUgPGNsYXNzIF9QMSwgY2xhc3MgX1AyLCBjbGFzcyBfUDM+CnN0cnVjdCBfTG9yMyB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKCl9TVExQX1RFTVBMQVRFX05VTEwKc3RydWN0IF9Mb3IzPF9fZmFsc2VfdHlwZSwgX19mYWxzZV90eXBlLCBfX2ZhbHNlX3R5cGU+IHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsgfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGNsYXNzIHRlbXBsYXRlIF9fc2VsZWN0Ci8vIFNlbGVjdHMgb25lIG9mIHR3byB0eXBlcyBiYXNlZCB1cG9uIGEgYm9vbGVhbiBjb25zdGFudAovLyBJbnZvY2F0aW9uOiBfX3NlbGVjdDxfQ29uZCwgVCwgVT46OlJlc3VsdAovLyB3aGVyZToKLy8gZmxhZyBpcyBhIGNvbXBpbGUtdGltZSBib29sZWFuIGNvbnN0YW50Ci8vIFQgYW5kIFUgYXJlIHR5cGVzCi8vIFJlc3VsdCBldmFsdWF0ZXMgdG8gVCBpZiBmbGFnIGlzIHRydWUsIGFuZCB0byBVIG90aGVyd2lzZS4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gQkVXQVJFOiBJZiB0aGUgY29tcGlsZXIgZG8gbm90IHN1cHBvcnQgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvciBuZXN0ZWQgdGVtcGxhdGUKLy9jbGFzc2VzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBfX3NlbGVjdCBpcyB0byBjb25zaWRlciB0aGUgY29uZGl0aW9uIGFzIGZhbHNlIGFuZCBzbyByZXR1cm4KLy90aGUgc2Vjb25kIHRlbXBsYXRlIHR5cGUhIQoKI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pCnRlbXBsYXRlIDxib29sIF9Db25kLCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgpzdHJ1Y3QgX19zZWxlY3QgeyB0eXBlZGVmIF9UcDEgX1JldDsgfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgpzdHJ1Y3QgX19zZWxlY3Q8ZmFsc2UsIF9UcDEsIF9UcDI+IHsgdHlwZWRlZiBfVHAyIF9SZXQ7IH07CgojICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCnRlbXBsYXRlIDxjbGFzcyBfQ29uZFQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CnN0cnVjdCBfX3NlbGVjdFQgeyB0eXBlZGVmIF9UcDEgX1JldDsgfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgpzdHJ1Y3QgX19zZWxlY3RUPF9fZmFsc2VfdHlwZSwgX1RwMSwgX1RwMj4geyB0eXBlZGVmIF9UcDIgX1JldDsgfTsKIyAgZW5kaWYKCiNlbHNlIC8qIF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04gKi8KCiMgIGlmIGRlZmluZWQgKF9TVExQX01FTUJFUl9URU1QTEFURV9DTEFTU0VTKQp0ZW1wbGF0ZSA8aW50IF9Db25kPgpzdHJ1Y3QgX19zZWxlY3RfYXV4IHsKICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KICBzdHJ1Y3QgX0luIHsKICAgIHR5cGVkZWYgX1RwMSBfUmV0OwogIH07Cn07CgpfU1RMUF9URU1QTEFURV9OVUxMCnN0cnVjdCBfX3NlbGVjdF9hdXg8MD4gewogIHRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgogIHN0cnVjdCBfSW4gewogICAgdHlwZWRlZiBfVHAyIF9SZXQ7CiAgfTsKfTsKCnRlbXBsYXRlIDxpbnQgX0NvbmQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CnN0cnVjdCBfX3NlbGVjdCB7CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3NlbGVjdF9hdXg8X0NvbmQ+OjpfU1RMUF9URU1QTEFURSBfSW48X1RwMSwgX1RwMj46Ol9SZXQgX1JldDsKfTsKIyAgZWxzZSAvKiBfU1RMUF9NRU1CRVJfVEVNUExBVEVfQ0xBU1NFUyAqLwovL2RlZmF1bHQgYmVoYXZpb3IKdGVtcGxhdGUgPGludCBfQ29uZCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4Kc3RydWN0IF9fc2VsZWN0IHsKICB0eXBlZGVmIF9UcDIgX1JldDsKfTsKIyAgZW5kaWYgLyogX1NUTFBfTUVNQkVSX1RFTVBMQVRFX0NMQVNTRVMgKi8KCiNlbmRpZiAvKiBfU1RMUF9DTEFTU19QQVJUSUFMX1NQRUNJQUxJWkFUSU9OICovCgojaWYgZGVmaW5lZCAoX1NUTFBfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKLy8gQm9yaXMgOiBzaW11bGF0aW9uIHRlY2huaXF1ZSBpcyB1c2VkIGhlcmUgYWNjb3JkaW5nIHRvIEFkb2JlIE9wZW4gU291cmNlIExpY2Vuc2UgVmVyc2lvbiAxLjAuCi8vIENvcHlyaWdodCAyMDAwIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIEF1dGhvcnM6IE1hdCBNYXJjdXMgYW5kIEplc3NlIEpvbmVzCi8vIFRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgc291cmNlIGNvZGUgbWF5IGJlIGZvdW5kIGF0Ci8vIGh0dHA6Ly9vcGVuc291cmNlLmFkb2JlLmNvbS4KCi8vIFRoZXNlIGFyZSB0aGUgZGlzY3JpbWluYXRpbmcgZnVuY3Rpb25zCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNoYXIgX1NUTFBfQ0FMTCBfSXNTYW1lRnVuKGJvb2wsIF9UcCBjb25zdCB2b2xhdGlsZSosIF9UcCBjb25zdCB2b2xhdGlsZSopOyAvLyBubyBpbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZApjaGFyKiBfU1RMUF9DQUxMIF9Jc1NhbWVGdW4oYm9vbCwgLi4uKTsgICAgICAgLy8gbm8gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQKCnRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgpzdHJ1Y3QgX0lzU2FtZSB7CiAgc3RhdGljIF9UcDEqIF9fbnVsbF9yZXAxKCk7CiAgc3RhdGljIF9UcDIqIF9fbnVsbF9yZXAyKCk7CiAgZW51bSB7IF9SZXQgPSAoc2l6ZW9mKF9Jc1NhbWVGdW4oZmFsc2UsX19udWxsX3JlcDEoKSwgX19udWxsX3JlcDIoKSkpID09IHNpemVvZihjaGFyKSkgfTsKICB0eXBlZGVmIHR5cGVuYW1lIF9fYm9vbDJ0eXBlPF9SZXQ+OjpfUmV0IF9SZXRUOwp9OwoKI2Vsc2UKCnRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgpzdHJ1Y3QgX0lzU2FtZUF1eCB7CiAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldFQ7CiAgZW51bSB7IF9SZXQgPSAwIH07Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX1VuQ29uc3RUeXBlIHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX1VuVm9sYXRpbGVUeXBlIHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX1VuQ1ZUeXBlIHsKICB0eXBlZGVmIHR5cGVuYW1lIF9VblZvbGF0aWxlVHlwZTxfVHA+OjpfVHlwZSBfVW5WVHlwZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9VbkNvbnN0VHlwZTxfVW5WVHlwZT46Ol9UeXBlIF9UeXBlOwp9OwoKIyAgaWYgZGVmaW5lZCAoX1NUTFBfQ0xBU1NfUEFSVElBTF9TUEVDSUFMSVpBVElPTikKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9Jc1NhbWVBdXg8X1RwLCBfVHA+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXRUOwogIGVudW0geyBfUmV0ID0gMSB9Owp9OwoKIyAgICBpZiAhZGVmaW5lZCAoX1NUTFBfUVVBTElGSUVEX1NQRUNJQUxJWkFUSU9OX0JVRykKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9VbkNvbnN0VHlwZTxjb25zdCBfVHA+IHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX1VuVm9sYXRpbGVUeXBlPHZvbGF0aWxlIF9UcD4geyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKIyAgICBlbmRpZgoKIyAgICBpZiBkZWZpbmVkKF9fQk9STEFORENfXykKdGVtcGxhdGU8Y2xhc3MgX1RwPgpzdHJ1Y3QgX1VuQ29uc3RQdHIgeyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKCnRlbXBsYXRlPGNsYXNzIF9UcD4Kc3RydWN0IF9VbkNvbnN0UHRyPF9UcCo+IHsgdHlwZWRlZiBfVHAgX1R5cGU7IH07Cgp0ZW1wbGF0ZTxjbGFzcyBfVHA+CnN0cnVjdCBfVW5Db25zdFB0cjxjb25zdCBfVHAqPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OwojICAgIGVuZGlmCiMgIGVuZGlmCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4Kc3RydWN0IF9Jc1NhbWUgewogIHR5cGVkZWYgdHlwZW5hbWUgX1VuQ1ZUeXBlPF9UcDE+OjpfVHlwZSBfVHlwZTE7CiAgdHlwZWRlZiB0eXBlbmFtZSBfVW5DVlR5cGU8X1RwMj46Ol9UeXBlIF9UeXBlMjsKCiAgdHlwZWRlZiBfSXNTYW1lQXV4PF9UeXBlMSwgX1R5cGUyPiBfQXV4OwogIGVudW0geyBfUmV0ID0gX0F1eDo6X1JldCB9OwogIHR5cGVkZWYgdHlwZW5hbWUgX0F1eDo6X1JldFQgX1JldFQ7Cn07CiNlbmRpZgoKLyoKICogVGhlIGZvbGxvd2luZyBzdHJ1Y3Qgd2lsbCB0ZWxsIHlvdSBpZiAyIHR5cGVzIGFyZSB0aGUgc2FtZSwgdGhlIGxpbWl0YXRpb25zIGFyZToKICogIC0gaXQgY29tcGFyZXMgdGhlIHR5cGVzIHdpdGhvdXQgdGhlIGNvbnN0IG9yIHZvbGF0aWxlIHF1YWxpZmllcnMsIGludCBhbmQgY29uc3QgaW50CiAqICAgIHdpbGwgYmUgY29uc2lkZXJlZCBhcyBzYW1lIGZvciBpbnN0YW5jZS4KICogIC0gdGhlIHByZXZpb3VzIHJlbWFya3MgZG8gbm90IGFwcGx5IHRvIHBvaW50ZXIgdHlwZXMsIGludCogYW5kIGludCBjb25zdCogd29uJ3QgYmUKICogICAgY29uc2lkZXJlZCBhcyBjb21wYXJhYmxlLiAoaW50ICogYW5kIGludCAqY29uc3QgYXJlKS4KICovCnRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgpzdHJ1Y3QgX0FyZVNhbWVVbkNWVHlwZXMgewogIGVudW0geyBfU2FtZSA9IF9Jc1NhbWU8X1RwMSwgX1RwMj46Ol9SZXQgfTsKICB0eXBlZGVmIHR5cGVuYW1lIF9Jc1NhbWU8X1RwMSwgX1RwMj46Ol9SZXRUIF9SZXQ7Cn07CgovKiBSYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBhIG5ldyBtYWNybyBmb3IgdGhlIGZvbGxvd2luZyBjb25zdHJ1dGlvbiB3ZSB1c2UKICogYW4gZXhpc3Rpbmcgb25lIChfU1RMUF9ET05UX1NJTVVMQVRFX1BBUlRJQUxfU1BFQ19GT1JfVFlQRV9UUkFJVFMpIHRoYXQKICogaXMgdXNlZCBmb3IgYSBzaW1pbGFyIGZlYXR1cmUuCiAqLwojaWYgIWRlZmluZWQgKF9TVExQX0RPTlRfU0lNVUxBVEVfUEFSVElBTF9TUEVDX0ZPUl9UWVBFX1RSQUlUUykKdGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CnN0cnVjdCBfQ29udmVyc2lvbkhlbHBlciB7CiAgc3RhdGljIGNoYXIgX1Rlc3QoYm9vbCwgX0RzdCk7CiAgc3RhdGljIGNoYXIqIF9UZXN0KGJvb2wsIC4uLik7CiAgc3RhdGljIF9TcmMgX01ha2VTb3VyY2UoKTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgpzdHJ1Y3QgX0lzQ29udmVydGlibGUgewogIHR5cGVkZWYgX0NvbnZlcnNpb25IZWxwZXI8X1NyYyosIGNvbnN0IHZvbGF0aWxlIF9Ec3QqPiBfSDsKICBlbnVtIHsgdmFsdWUgPSAoc2l6ZW9mKGNoYXIpID09IHNpemVvZihfSDo6X1Rlc3QoZmFsc2UsIF9IOjpfTWFrZVNvdXJjZSgpKSkpIH07CiAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx2YWx1ZT46Ol9SZXQgX1JldDsKfTsKCi8qIFRoaXMgc3RydWN0IGlzIGludGVuZGVkIHRvIHNheSBpZiBhIHBvaW50ZXIgY2FuIGJlIGNvbnZlcnRpYmxlIHRvIGFuIG90aGVyCiAqIHRha2luZyBpbnRvIGFjY291bnQgY3YgcXVhbGlmaWNhdGlvbnMuIEl0IHNob3VsZG4ndCBiZSBpbnN0YW5jaWF0ZWQgd2l0aAogKiBzb21ldGhpbmcgZWxzZSB0aGFuIHBvaW50ZXIgdHlwZSBhcyBpdCB1c2VzIHBhc3MgYnkgdmFsdWUgcGFyYW1ldGVyIHRoYXQKICogcmVzdWx0cyBpbiBjb21waWxhdGlvbiBlcnJvciB3aGVuIHBhcmFtZXRlciB0eXBlIGhhcyBhIHNwZWNpYWwgbWVtb3J5CiAqIGFsaWdubWVudAogKi8KdGVtcGxhdGUgPGNsYXNzIF9TcmMsIGNsYXNzIF9Ec3Q+CnN0cnVjdCBfSXNDVkNvbnZlcnRpYmxlIHsKI2lmICFkZWZpbmVkIChfX0JPUkxBTkRDX18pCiAgdHlwZWRlZiBfQ29udmVyc2lvbkhlbHBlcjxfU3JjLCBfRHN0PiBfSDsKICBlbnVtIHsgdmFsdWUgPSAoc2l6ZW9mKGNoYXIpID09IHNpemVvZihfSDo6X1Rlc3QoZmFsc2UsIF9IOjpfTWFrZVNvdXJjZSgpKSkpIH07CiNlbHNlCiAgZW51bSB7IF9JczEgPSBfX3R5cGUyYm9vbDxfSXNDb25zdDxfU3JjPjo6X1JldD46Ol9SZXQgfTsKICBlbnVtIHsgX0lzMiA9IF9Jc0NvbnZlcnRpYmxlPF9VbkNvbnN0UHRyPF9TcmM+OjpfVHlwZSwgX1VuQ29uc3RQdHI8X0RzdD46Ol9UeXBlPjo6dmFsdWUgfTsKICBlbnVtIHsgdmFsdWUgPSBfSXMxID8gMCA6IF9JczIgfTsKI2VuZGlmCiAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jvb2wydHlwZTx2YWx1ZT46Ol9SZXQgX1JldDsKfTsKCiNlbHNlCnRlbXBsYXRlIDxjbGFzcyBfU3JjLCBjbGFzcyBfRHN0PgpzdHJ1Y3QgX0lzQ29udmVydGlibGUgewogIGVudW0ge3ZhbHVlID0gMH07CiAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX1JldDsKfTsKI2VuZGlmCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX0lzQ29uc3QgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfUmV0OyB9OwoKI2lmIGRlZmluZWQgKF9TVExQX0NMQVNTX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04pICYmICFkZWZpbmVkIChfU1RMUF9RVUFMSUZJRURfU1BFQ0lBTElaQVRJT05fQlVHKQp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX0lzQ29uc3QgPGNvbnN0IF9UcD4geyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9SZXQ7IH07CiNlbmRpZgoKIyAgaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCnRlbXBsYXRlPGNsYXNzIF9UcD4Kc3RydWN0IF9Jc0NvbnN0IDxjb25zdCBfVHAqPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKCnRlbXBsYXRlPGNsYXNzIF9UcD4Kc3RydWN0IF9Jc0NvbnN0IDxjb25zdCB2b2xhdGlsZSBfVHAqPiB7IHR5cGVkZWYgX190cnVlX3R5cGUgX1JldDsgfTsKIyAgZW5kaWYKCl9TVExQX0VORF9OQU1FU1BBQ0UKCiNlbmRpZiAvKiBfU1RMUF9UWVBFX01BTklQU19IICovCg==