Li4gTWV0YWZ1bmN0aW9ucy9NaXNjZWxsYW5lb3VzLy9tYXggfDkwCgptYXgKPT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIE4xCiAgICAgICAgLCB0eXBlbmFtZSBOMgogICAgICAgID4KICAgIHN0cnVjdCBtYXgKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSBsYXJnZXIgb2YgaXRzIHR3byBhcmd1bWVudHMuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL21pbl9tYXguaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8TWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYE4xYGAsIGBgTjJgYHwgQW55IHR5cGUgICAgICAgICAgfCBUeXBlcyB0byBjb21wYXJlLiAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYXJiaXRyYXJ5IHR5cGVzIGBgeGBgIGFuZCBgYHlgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBtYXg8eCx5Pjo6dHlwZSByOwoKCjpSZXR1cm4gdHlwZToKICAgIEEgdHlwZS4KCjpQcmVjb25kaXRpb246CiAgICBgYGxlc3M8eCx5Pjo6dmFsdWVgYCBpcyBhIHdlbGwtZm9ybWVkIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24uCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0bwogICAgICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiBpZl88IGxlc3M8eCx5Pix5LHggPjo6dHlwZSByOwoKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkNvbnN0YW50IHRpbWUuIAoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIGZvbGQ8CiAgICAgICAgICB2ZWN0b3JfYzxpbnQsMSw3LDAsLTIsNSwtMT4KICAgICAgICAsIGludF88MTA+CiAgICAgICAgLCBtYXg8XzEsXzI+CiAgICAgICAgPjo6dHlwZSByOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgciwgaW50XzwxMD4gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnN8LCB8Q29tcGFyaXNvbnwsIHxtaW58LCB8bGVzc3wsIHxtYXhfZWxlbWVudHwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==