Li4gTWFjcm9zL0Fzc2VydHMvL0JPT1NUX01QTF9BU1NFUlRfTk9UCgpCT09TVF9NUExfQVNTRVJUX05PVAo9PT09PT09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2RlZmluZSBCT09TVF9NUExfQVNTRVJUX05PVCggcHJlZCApIFxcCiAgICAgICAgfHVuc3BlY2lmaWVkLXRva2VuLXNlcXwgXFwKICAgIC9cKlwqLwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpHZW5lcmF0ZXMgYSBjb21waWxhdGlvbiBlcnJvciB3aGVuIHByZWRpY2F0ZSBob2xkcyB0cnVlLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9hc3NlcnQuaHBwPgoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYHByZWRgYCAgICAgIHwgQm9vbGVhbiBudWxsYXJ5IHxNZXRhZnVuY3Rpb258ICAgIHwgQSBwcmVkaWNhdGUgdG8gYmUgYXNzZXJ0ZWQgdG8gYmUgZmFsc2UuICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgYm9vbGVhbiBudWxsYXJ5IHxNZXRhZnVuY3Rpb258IGBgcHJlZGBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIHByZWQgKSk7Cgo6UmV0dXJuIHR5cGU6CiAgICBOb25lLgoKOlNlbWFudGljczoKICAgIEdlbmVyYXRlcyBhIGNvbXBpbGF0aW9uIGVycm9yIGlmIGBgcHJlZDo6dHlwZTo6dmFsdWUgIT0gZmFsc2VgYCwgb3RoZXJ3aXNlCiAgICBoYXMgbm8gZWZmZWN0LiBOb3RlIHRoYXQgZG91YmxlIHBhcmVudGhlc2VzIGFyZSByZXF1aXJlZCBldmVuIGlmIG5vIGNvbW1hcyAKICAgIGFwcGVhciBpbiB0aGUgY29uZGl0aW9uLiAKICAgIAogICAgV2hlbiBwb3NzaWJsZSB3aXRoaW4gdGhlIGNvbXBpbGVyJ3MgZGlhZ25vc3RpYyBjYXBhYmlsaXRpZXMsCiAgICB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGluY2x1ZGUgdGhlIHByZWRpY2F0ZSdzIGZ1bGwgdHlwZSBuYW1lLCBhbmQgaGF2ZSBhIAogICAgZ2VuZXJhbCBmb3JtIG9mOgoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHwuLi58IFwqXCpcKlwqXCpcKlwqXCpcKlwqXCpcKmJvb3N0OjptcGw6Om5vdF88IHByZWQgPjo6XCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqIHwuLi58CgoKRXhhbXBsZQotLS0tLS0tCgo6OgogICAgCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSA+IHN0cnVjdCBteQogICAgewogICAgICAgIC8vIC4uLgogICAgICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggaXNfc2FtZTwgVCxVID4gKSk7CiAgICB9OwogICAgCiAgICBteTx2b2lkLHZvaWQ+IHRlc3Q7CgogICAgLy8gSW4gaW5zdGFudGlhdGlvbiBvZiBgbXk8dm9pZCwgdm9pZD4nOgogICAgLy8gICBpbnN0YW50aWF0ZWQgZnJvbSBoZXJlCiAgICAvLyBjb252ZXJzaW9uIGZyb20gYAogICAgLy8gICBtcGxfOjpmYWlsZWQqKioqKioqKioqKipib29zdDo6bXBsOjpub3RfPGJvb3N0Ojppc19zYW1lPHZvaWQsIHZvaWQ+IAogICAgLy8gICA+OjoqKioqKioqKioqKionIHRvIG5vbi1zY2FsYXIgdHlwZSBgbXBsXzo6YXNzZXJ0PGZhbHNlPicgcmVxdWVzdGVkCgoKU2VlIGFsc28KLS0tLS0tLS0KCnxBc3NlcnRzfCwgfEJPT1NUX01QTF9BU1NFUlR8LCB8Qk9PU1RfTVBMX0FTU0VSVF9NU0d8LCB8Qk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTnwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==