Li4gTWV0YWZ1bmN0aW9ucy9Db21wYXJpc29ucy8vZXF1YWxfdG8gfDUwCgplcXVhbF90bwo9PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBUMQogICAgICAgICwgdHlwZW5hbWUgVDIKICAgICAgICA+CiAgICBzdHJ1Y3QgZXF1YWxfdG8KICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGEgdHJ1ZS12YWx1ZWQgfEludGVncmFsIENvbnN0YW50fCBpZiBgYFQxYGAgYW5kIGBgVDJgYCBhcmUgZXF1YWwuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2VxdWFsX3RvLmhwcD4KICAgICNpbmNsdWRlIDxib29zdC9tcGwvY29tcGFyaXNvbi5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxOdW1lcmljIE1ldGFmdW5jdGlvbnwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBUMWBgLCBgYFQyYGB8IHxJbnRlZ3JhbCBDb25zdGFudHwgICAgICAgfCBPcGVyYXRpb24ncyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCnxOb3RlOnwgfG51bWVyaWMgbWV0YWZ1bmN0aW9uIG5vdGV8IHwtLSBlbmQgbm90ZXwKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKCkZvciBhbnkgfEludGVncmFsIENvbnN0YW50fFwgcyBgYGMxYGAgYW5kIGBgYzJgYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGVxdWFsX3RvPGMxLGMyPjo6dHlwZSByOyAKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIGJvb2xfPCAoYzE6OnZhbHVlID09IGMyOjp2YWx1ZSkgPiByOwoKCi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBlcXVhbF90bzxjMSxjMj4gcjsgCgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgc3RydWN0IHIgOiBlcXVhbF90bzxjMSxjMj46OnR5cGUge307CgoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggZXF1YWxfdG88IGludF88MD4sIGludF88MTA+ID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIGVxdWFsX3RvPCBsb25nXzwxMD4sIGludF88MD4gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbF90bzwgbG9uZ188MTA+LCBpbnRfPDEwPiA+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8Q29tcGFyaXNvbnN8LCB8TnVtZXJpYyBNZXRhZnVuY3Rpb258LCB8bnVtZXJpY19jYXN0fCwgfG5vdF9lcXVhbF90b3wsIHxsZXNzfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK