Li4gTWV0YWZ1bmN0aW9ucy9NaXNjZWxsYW5lb3VzLy9taW4gfDgwCgptaW4KPT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIE4xCiAgICAgICAgLCB0eXBlbmFtZSBOMgogICAgICAgID4KICAgIHN0cnVjdCBtaW4KICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSBzbWFsbGVyIG9mIGl0cyB0d28gYXJndW1lbnRzLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9taW5fbWF4LmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBOMWBgLCBgYE4yYGB8IEFueSB0eXBlICAgICAgICAgIHwgVHlwZXMgdG8gY29tcGFyZS4gICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFyYml0cmFyeSB0eXBlcyBgYHhgYCBhbmQgYGB5YGA6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgbWluPHgseT46OnR5cGUgcjsKCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6UHJlY29uZGl0aW9uOgogICAgYGBsZXNzPHgseT46OnZhbHVlYGAgaXMgYSB3ZWxsLWZvcm1lZCBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgaWZfPCBsZXNzPHgseT4seCx5ID46OnR5cGUgcjsKCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpDb25zdGFudCB0aW1lLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiBmb2xkPAogICAgICAgICAgdmVjdG9yX2M8aW50LDEsNywwLC0yLDUsLTE+CiAgICAgICAgLCBpbnRfPC0xMD4KICAgICAgICAsIG1pbjxfMSxfMj4KICAgICAgICA+Ojp0eXBlIHI7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPCByLCBpbnRfPC0xMD4gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnN8LCB8Q29tcGFyaXNvbnwsIHxtYXh8LCB8bGVzc3wsIHxtaW5fZWxlbWVudHwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==