Li4gTWV0YWZ1bmN0aW9ucy9NaXNjZWxsYW5lb3VzLy9pbmhlcml0IHwzMAoKaW5oZXJpdAo9PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyCiAgICAgICAgPgogICAgc3RydWN0IGluaGVyaXRcIGBgMmBgCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKICAgIHwuLi58CgogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsXCB8Li4ufCB0eXBlbmFtZSBUXCAqbioKICAgICAgICA+CiAgICBzdHJ1Y3QgaW5oZXJpdFwgKm4qCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFQxCiAgICAgICAgLCB0eXBlbmFtZSBUMgogICAgICAgIHwuLi58CiAgICAgICAgLCB0eXBlbmFtZSBUXCAqbiogPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IGluaGVyaXQKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYW4gdW5zcGVjaWZpZWQgY2xhc3MgdHlwZSBwdWJsaWNhbGx5IGRlcml2ZWQgZnJvbSB8VDEuLi5UbnwuCkd1YXJhbnRlZXMgdGhhdCBkZXJpdmF0aW9uIGZyb20gfGVtcHR5X2Jhc2V8IGlzIGFsd2F5cyBhIG5vLW9wLCAKcmVnYXJkbGVzcyBvZiB0aGUgcG9zaXRpb24gYW5kIG51bWJlciBvZiB8ZW1wdHlfYmFzZXwgY2xhc3NlcyBpbiAKfFQxLi4uVG58LgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9pbmhlcml0LmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgfFQxLi4uVG58ICAgICB8IEEgY2xhc3MgdHlwZSAgICAgIHwgQ2xhc3NlcyB0byBkZXJpdmVkIGZyb20uICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYXJ0aWJyYXJ5IGNsYXNzIHR5cGVzIHx0MS4uLnRufDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGluaGVyaXQyPHQxLHQyPjo6dHlwZSByOyAKCjpSZXR1cm4gdHlwZToKICAgIEEgY2xhc3MgdHlwZS4KCjpQcmVjb25kaXRpb246CiAgICBgYHQxYGAgYW5kIGBgdDJgYCBhcmUgY29tcGxldGUgdHlwZXMuCgo6U2VtYW50aWNzOgogICAgSWYgYm90aCBgYHQxYGAgYW5kIGBgdDJgYCBhcmUgaWRlbnRpY2FsIHRvIGBgZW1wdHlfYmFzZWBgLCBlcXVpdmFsZW50IHRvCiAgICAgICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIGVtcHR5X2Jhc2UgcjsKCgogICAgb3RoZXJ3aXNlLCBpZiBgYHQxYGAgaXMgaWRlbnRpY2FsIHRvIGBgZW1wdHlfYmFzZWBgLCBlcXVpdmFsZW50IHRvCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICB0eXBlZGVmIHQyIHI7CgoKICAgIG90aGVyd2lzZSwgaWYgYGB0MmBgIGlzIGlkZW50aWNhbCB0byBgYGVtcHR5X2Jhc2VgYCwgZXF1aXZhbGVudCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiB0MSByOwoKCiAgICBvdGhlcndpc2UgZXF1aXZhbGVudCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgc3RydWN0IHIgOiB0MSwgdDIge307CgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGluaGVyaXRcICpuKlw8dDEsdDIsXCB8Li4ufFwgdFwgKm4qXCA+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSBjbGFzcyB0eXBlLgoKOlByZWNvbmRpdGlvbjoKICAgIHx0MS4uLnRufCBhcmUgY29tcGxldGUgdHlwZXMuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHN0cnVjdCByCiAgICAgICAgICAgIDogaW5oZXJpdFwgYGAyYGBcPAogICAgICAgICAgICAgICAgICBpbmhlcml0XCAqbi0xKlw8dDEsdDIsXCB8Li4ufFwgdFwgKm4tMSpcPjo6dHlwZQogICAgICAgICAgICAgICAgLCB0XCAqbioKICAgICAgICAgICAgICAgID4KICAgICAgICB7CiAgICAgICAgfTsKCgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBpbmhlcml0PHQxLHQyLFwgfC4uLnxcIHRcICpuKlwgPjo6dHlwZSByOyAKCjpQcmVjb25kaXRpb246CiAgICB8dDEuLi50bnwgYXJlIGNvbXBsZXRlIHR5cGVzLgoKOlJldHVybiB0eXBlOgogICAgQSBjbGFzcyB0eXBlLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgaW5oZXJpdFwgKm4qXDx0MSx0MixcIHwuLi58XCB0XCAqbipcID46OnR5cGUgcjsgCgoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHN0cnVjdCB1ZHQxIHsgaW50IG47IH07CiAgICBzdHJ1Y3QgdWR0MiB7fTsKCiAgICB0eXBlZGVmIGluaGVyaXQ8dWR0MSx1ZHQyPjo6dHlwZSByMTsKICAgIHR5cGVkZWYgaW5oZXJpdDxlbXB0eV9iYXNlLHVkdDE+Ojp0eXBlIHIyOwogICAgdHlwZWRlZiBpbmhlcml0PGVtcHR5X2Jhc2UsdWR0MSxlbXB0eV9iYXNlLGVtcHR5X2Jhc2U+Ojp0eXBlIHIzOwogICAgdHlwZWRlZiBpbmhlcml0PHVkdDEsZW1wdHlfYmFzZSx1ZHQyPjo6dHlwZSByNDsKICAgIHR5cGVkZWYgaW5oZXJpdDxlbXB0eV9iYXNlLGVtcHR5X2Jhc2U+Ojp0eXBlIHI1OwoKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19iYXNlX2FuZF9kZXJpdmVkPCB1ZHQxLCByMT4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfYmFzZV9hbmRfZGVyaXZlZDwgdWR0MiwgcjE+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8IHIyLCB1ZHQxPiApKTsgICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgcjMsIHVkdDEgPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19iYXNlX2FuZF9kZXJpdmVkPCB1ZHQxLCByNCA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX2Jhc2VfYW5kX2Rlcml2ZWQ8IHVkdDIsIHI0ID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgcjUsIGVtcHR5X2Jhc2UgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnN8LCB8ZW1wdHlfYmFzZXwsIHxpbmhlcml0X2xpbmVhcmx5fCwgfGlkZW50aXR5fAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK