Li4gTWFjcm9zL0Jyb2tlbiBDb21waWxlciBXb3JrYXJvdW5kcy8vQk9PU1RfTVBMX0FVWF9MQU1CREFfU1VQUE9SVAoKQk9PU1RfTVBMX0FVWF9MQU1CREFfU1VQUE9SVAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjZGVmaW5lIEJPT1NUX01QTF9BVVhfTEFNQkRBX1NVUFBPUlQoYXJpdHksIGZ1biwgcGFyYW1zKSBcXAogICAgICAgIHx1bnNwZWNpZmllZC10b2tlbi1zZXF8IFxcCiAgICAvXCpcKi8KCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KCkVuYWJsZXMgbWV0YWZ1bmN0aW9uIGBgZnVuYGAgZm9yIHRoZSB1c2UgaW4gfExhbWJkYSBFeHByZXNzaW9ufFwgcyBvbiAKY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9yL2FuZCAKdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gRXhwYW5kcyB0byBub3RoaW5nIG9uIGNvbmZvcm1pbmcgY29tcGlsZXJzLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9hdXhcXy9sYW1iZGFfc3VwcG9ydC5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgYXJpdHlgYCAgICAgfCBBbiBpbnRlZ3JhbCBjb25zdGFudCAgICAgICAgICB8IFRoZSBtZXRhZnVuY3Rpb24ncyBhcml0eSwgaS5lLiB0aGUgbnVtYmVyIG9mIGl0cyAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGluY2x1ZGluZyB0aGUgZGVmYXVsdHMuICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgZnVuYGAgICAgICAgfCBBIGxlZ2FsIGlkZW50aWZpZXIgdG9rZW4gICAgICB8IFRoZSBtZXRhZnVuY3Rpb24ncyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcGFyYW1zYGAgICAgfCBBIHxQUC10dXBsZXwgICAgICAgICAgICAgICAgICB8IEEgdHVwbGUgb2YgdGhlIG1ldGFmdW5jdGlvbidzIHBhcmFtZXRlciBuYW1lcywgaW4gfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZWlyIG9yaWdpbmFsIG9yZGVyLCBpbmNsdWRpbmcgdGhlIGRlZmF1bHRzLiAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IGludGVncmFsIGNvbnN0YW50IGBgbmBgLCBhIHxNZXRhZnVuY3Rpb258IGBgZnVuYGAsIGFuZCBhcmJpdHJhcnkgdHlwZXMgfEExLi4uQW58OgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgQTEsXCB8Li4ufCB0eXBlbmFtZSBBXCAqbiogPiBzdHJ1Y3QgZnVuCiAgICB7CiAgICAgICAgLy8gfC4uLnwKICAgIAogICAgICAgIEJPT1NUX01QTF9BVVhfTEFNQkRBX1NVUFBPUlQobiwgZnVuLCAoQTEsXCB8Li4ufFwgQVwgKm4qXCApKQogICAgfTsKCjpQcmVjb25kaXRpb246CiAgICBBcHBlYXJzIGluIGBgZnVuYGBcICdzIHNjb3BlLCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgc2NvcGUtY2xvc2luZyAKICAgIGJyYWNrZXQgKGBgfWBgKS4KCjpSZXR1cm4gdHlwZToKICAgIE5vbmUuCgo6U2VtYW50aWNzOgogICAgRXhwYW5kcyB0byBub3RoaW5nIGFuZCBoYXMgbm8gZWZmZWN0IG9uIGNvbmZvcm1pbmcgY29tcGlsZXJzLiBPbiBjb21waWxlcnMgdGhhdCAKICAgIGRvbid0IHN1cHBvcnQgcGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvci9hbmQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycwogICAgZXhwYW5kcyB0byBhbiB1bnNwZWNpZmllZCB0b2tlbiBzZXF1ZW5jZSBlbmFibGluZyBgYGZ1bmBgIHRvIHBhcnRpY2lwYXRlIGluCiAgICB8TGFtYmRhIEV4cHJlc3Npb258XCBzIHdpdGggdGhlIHNlbWFudGljcyBkZXNjcmliZWQgaW4gdGhpcyBtYW51YWwuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVID0gaW50ID4gc3RydWN0IGYKICAgIHsKICAgICAgICB0eXBlZGVmIFQgdHlwZVtzaXplb2YoVSldOwogICAgCiAgICAgICAgQk9PU1RfTVBMX0FVWF9MQU1CREFfU1VQUE9SVCgyLCBmLCAoVCxVKSkKICAgIH07CiAgICAKICAgIHR5cGVkZWYgYXBwbHlcIGBgMWBgXDwgZjxjaGFyLF8xPixsb25nID46OnR5cGUgcjsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPCByLCBjaGFyW3NpemVvZihsb25nKV0gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1hY3Jvc3wsIHxNZXRhZnVuY3Rpb25zfCwgfExhbWJkYSBFeHByZXNzaW9ufAoKCi4uIHxQUC10dXBsZXwgcmVwbGFjZTo6IGBQUC10dXBsZSA8aHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9wcmVwcm9jZXNzb3IvZG9jL2RhdGEvdHVwbGVzLmh0bWw+YF9fCgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=