Li4gTWV0YWZ1bmN0aW9ucy9NaXNjZWxsYW5lb3VzLy9pbmhlcml0X2xpbmVhcmx5IHw0MAoKaW5oZXJpdF9saW5lYXJseQo9PT09PT09PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFR5cGVzCiAgICAgICAgLCB0eXBlbmFtZSBOb2RlCiAgICAgICAgLCB0eXBlbmFtZSBSb290ID0gZW1wdHlfYmFzZQogICAgICAgID4KICAgIHN0cnVjdCBpbmhlcml0X2xpbmVhcmx5CiAgICAgICAgOiBmb2xkPFR5cGVzLFJvb3QsTm9kZT4KICAgIHsKICAgIH07CgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KCkEgY29udmVuaWVuY2Ugd3JhcHBlciBmb3IgYGBmb2xkYGAgdG8gdXNlIGluIHRoZSBjb250ZXh0IG9mIHNlcXVlbmNlLWRyaXZlbgpjbGFzcyBjb21wb3NpdGlvbi4gUmV0dXJucyB0aGUgcmVzdWx0IHRoZSBzdWNjZXNzaXZlIGFwcGxpY2F0aW9uIG9mIGJpbmFyeQpgYE5vZGVgYCB0byB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBgYE5vZGVgYCBpbnZvY2F0aW9uIChgYFJvb3RgYCBpZiBpdCdzIAp0aGUgZmlyc3QgY2FsbCkgYW5kIGV2ZXJ5IHR5cGUgaW4gdGhlIHxGb3J3YXJkIFNlcXVlbmNlfCBgYFR5cGVzYGAgaW4gb3JkZXIuIAoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9pbmhlcml0X2xpbmVhcmx5LmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBUeXBlc2BgICAgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgIHwgVHlwZXMgdG8gaW5oZXJpdCBmcm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBOb2RlYGAgICAgICB8IEJpbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258ICAgIHwgQSBkZXJpdmF0aW9uIG1ldGFmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBSb290YGAgICAgICB8IEEgY2xhc3MgdHlwZSAgICAgICAgICAgICAgICAgIHwgQSB0eXBlIHRvIGJlIHBsYWNlZCBhdCB0aGUgcm9vdCBvZiB0aGUgY2xhc3MgICAgICB8CnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGllcmFyY2h5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgdHlwZXNgYCwgYmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgYGBub2RlYGAsIGFuZCBhcmJpdHJhcnkgCmNsYXNzIHR5cGUgYGByb290YGA6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgaW5oZXJpdF9saW5lYXJseTx0eXBlcyxub2RlLHJvb3Q+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSBjbGFzcyB0eXBlLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBmb2xkPHR5cGVzLHJvb3Qsbm9kZT46OnR5cGUgcjsgCgoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBFeGFjdGx5IGBgc2l6ZTx0eXBlcz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgbm9kZWBgLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IHR5cGVuYW1lIFQgPiBzdHJ1Y3QgdHVwbGVfZmllbGQKICAgIHsKICAgICAgICBUIGZpZWxkOwogICAgfTsKCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CiAgICBpbmxpbmUKICAgIFQmIGZpZWxkKHR1cGxlX2ZpZWxkPFQ+JiB0KQogICAgewogICAgICAgIHJldHVybiB0LmZpZWxkOwogICAgfQoKICAgIHR5cGVkZWYgaW5oZXJpdF9saW5lYXJseTwKICAgICAgICAgIHZlY3RvcjxpbnQsY2hhciBjb25zdCosYm9vbD4KICAgICAgICAsIGluaGVyaXQ8IF8xLCB0dXBsZV9maWVsZDxfMj4gPgogICAgICAgID46OnR5cGUgdHVwbGU7CgoKICAgIGludCBtYWluKCkKICAgIHsKICAgICAgICB0dXBsZSB0OwogICAgICAgIAogICAgICAgIGZpZWxkPGludD4odCkgPSAtMTsKICAgICAgICBmaWVsZDxjaGFyIGNvbnN0Kj4odCkgPSAidGV4dCI7CiAgICAgICAgZmllbGQ8Ym9vbD4odCkgPSBmYWxzZTsKCiAgICAgICAgc3RkOjpjb3V0CiAgICAgICAgICAgIDw8IGZpZWxkPGludD4odCkgPDwgJ1xuJwogICAgICAgICAgICA8PCBmaWVsZDxjaGFyIGNvbnN0Kj4odCkgPDwgJ1xuJwogICAgICAgICAgICA8PCBmaWVsZDxib29sPih0KSA8PCAnXG4nCiAgICAgICAgICAgIDsKICAgIH0KCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnN8LCB8QWxnb3JpdGhtc3wsIHxpbmhlcml0fCwgfGVtcHR5X2Jhc2V8LCB8Zm9sZHwsIHxyZXZlcnNlX2ZvbGR8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=