Li4gTWV0YWZ1bmN0aW9ucy9CaXR3aXNlIE9wZXJhdGlvbnMvL2JpdHhvcl8KCmJpdHhvclxfCj09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFQxCiAgICAgICAgLCB0eXBlbmFtZSBUMgogICAgICAgICwgdHlwZW5hbWUgVDMgPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgfC4uLnwKICAgICAgICAsIHR5cGVuYW1lIFRcICpuKiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgYml0eG9yXF8KICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSByZXN1bHQgb2YgKmJpdHdpc2UgeG9yKiAoYGBeYGApIG9wZXJhdGlvbiBvZiBpdHMgYXJndW1lbnRzLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9iaXR4b3IuaHBwPgogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9iaXR3aXNlLmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE51bWVyaWMgTWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCB8VDEuLi5UbnwgICAgIHwgfEludGVncmFsIENvbnN0YW50fCAgICAgICB8IE9wZXJhdGlvbidzIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKfE5vdGU6fCB8bnVtZXJpYyBtZXRhZnVuY3Rpb24gbm90ZXwgfC0tIGVuZCBub3RlfAoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxJbnRlZ3JhbCBDb25zdGFudHxcIHMgfGMxLi4uY258OgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGJpdHhvcl88YzEsXCB8Li4ufFwgY1wgKm4qXD46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAgICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIGludGVncmFsX2M8CiAgICAgICAgICAgICAgdHlwZW9mKGMxOjp2YWx1ZSBeIGMyOjp2YWx1ZSkKICAgICAgICAgICAgLCAoIGMxOjp2YWx1ZSBeIGMyOjp2YWx1ZSApCiAgICAgICAgICAgID4gYzsKICAgICAgICAgICAgCiAgICAgICAgdHlwZWRlZiBiaXR4b3JfPGMsYzMsXCB8Li4ufFxjXCAqbipcPjo6dHlwZSByOyAKCi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBiaXR4b3JfPGMxLFwgfC4uLnxcIGNcICpuKlw+IHI7Cgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICBzdHJ1Y3QgciA6IGJpdHhvcl88YzEsXCB8Li4ufFwgY1wgKm4qXD46OnR5cGUge307CgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMD4gdTA7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMT4gdTE7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMj4gdTI7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsOD4gdTg7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMHhmZmZmZmZmZj4gdWZmZmZmZmZmOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0eG9yXzx1MCx1MD46OnZhbHVlKSwgPT0sIDAgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChiaXR4b3JfPHUxLHUwPjo6dmFsdWUpLCA9PSwgMSApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGJpdHhvcl88dTAsdTE+Ojp2YWx1ZSksID09LCAxICk7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChiaXR4b3JfPHUwLHVmZmZmZmZmZj46OnZhbHVlKSwgPT0sIDB4ZmZmZmZmZmYgXiAwICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0eG9yXzx1MSx1ZmZmZmZmZmY+Ojp2YWx1ZSksID09LCAweGZmZmZmZmZmIF4gMSApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGJpdHhvcl88dTgsdWZmZmZmZmZmPjo6dmFsdWUpLCA9PSwgMHhmZmZmZmZmZiBeIDggKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEJpdHdpc2UgT3BlcmF0aW9uc3wsIHxOdW1lcmljIE1ldGFmdW5jdGlvbnwsIHxudW1lcmljX2Nhc3R8LCB8Yml0YW5kX3wsIHxiaXRvcl98LCB8c2hpZnRfbGVmdHwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==