Li4gTWV0YWZ1bmN0aW9ucy9NaXNjZWxsYW5lb3VzLy9udW1lcmljX2Nhc3QgfDUwCgpudW1lcmljX2Nhc3QKPT09PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHRlbXBsYXRlPCAKICAgICAgICAgIHR5cGVuYW1lIFNvdXJjZVRhZwogICAgICAgICwgdHlwZW5hbWUgVGFyZ2V0VGFnCiAgICAgICAgPgogICAgc3RydWN0IG51bWVyaWNfY2FzdDsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKRWFjaCBgYG51bWVyaWNfY2FzdGBgIHNwZWNpYWxpemF0aW9uIGlzIGEgdXNlci1zcGVjaWFsaXplZCB1bmFyeSB8TWV0YWZ1bmN0aW9uIENsYXNzfCAKcHJvdmlkaW5nIGEgY29udmVyc2lvbiBiZXR3ZWVuIHR3byBudW1lcmljIHR5cGVzLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9udW1lcmljX2Nhc3QuaHBwPgoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFNvdXJjZVRhZ2BgIHwgfEludGVncmFsIENvbnN0YW50fCAgICAgICB8IEEgdGFnIGZvciB0aGUgY29udmVyc2lvbidzIHNvdXJjZSB0eXBlLiAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgVGFyZ2V0VGFnYGAgfCB8SW50ZWdyYWwgQ29uc3RhbnR8ICAgICAgIHwgQSB0YWcgZm9yIHRoZSBjb252ZXJzaW9uJ3MgZGVzdGluYXRpb24gdHlwZS4gIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklmIGBgeGBgIGFuZCBgYHlgYCBhcmUgdHdvIG51bWVyaWMgdHlwZXMsIGBgeGBgIGlzIGNvbnZlcnRpYmxlIHRvIGBgeWBgLCBhbmQgCmBgeF90YWdgYCBhbmQgYGB5X3RhZ2BgIGFyZSB0aGUgdHlwZXMnIGNvcnJlc3BvbmRpbmcgfEludGVncmFsIENvbnN0YW50fCB0YWdzOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGFwcGx5X3dyYXBcIGBgMmBgXDwgbnVtZXJpY19jYXN0PHhfdGFnLHlfdGFnPix4ID46OnR5cGUgIHI7Cgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgYGByYGAgaXMgYSB2YWx1ZSBvZiBgYHhgYCBjb252ZXJ0ZWQgdG8gdGhlIHR5cGUgb2YgYGB5YGAuCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpVbnNwZWNpZmllZC4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgc3RydWN0IGNvbXBsZXhfdGFnIDogaW50XzwxMD4ge307CgogICAgdGVtcGxhdGU8IHR5cGVuYW1lIFJlLCB0eXBlbmFtZSBJbSA+IHN0cnVjdCBjb21wbGV4CiAgICB7CiAgICAgICAgdHlwZWRlZiBjb21wbGV4X3RhZyB0YWc7CiAgICAgICAgdHlwZWRlZiBjb21wbGV4IHR5cGU7CiAgICAgICAgdHlwZWRlZiBSZSByZWFsOwogICAgICAgIHR5cGVkZWYgSW0gaW1hZzsKICAgIH07CgogICAgdGVtcGxhdGU8IHR5cGVuYW1lIEMgPiBzdHJ1Y3QgcmVhbCA6IEM6OnJlYWwge307CiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgQyA+IHN0cnVjdCBpbWFnIDogQzo6aW1hZyB7fTsKCiAgICBuYW1lc3BhY2UgYm9vc3QgeyBuYW1lc3BhY2UgbXBsIHsKCiAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmljX2Nhc3Q8IGludGVncmFsX2NfdGFnLGNvbXBsZXhfdGFnID4KICAgIHsKICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgTiA+IHN0cnVjdCBhcHBseQogICAgICAgICAgICA6IGNvbXBsZXg8IE4sIGludGVncmFsX2M8IHR5cGVuYW1lIE46OnZhbHVlX3R5cGUsIDAgPiA+CiAgICAgICAgewogICAgICAgIH07CiAgICB9OwoKICAgIHRlbXBsYXRlPD4KICAgIHN0cnVjdCBwbHVzX2ltcGw8IGNvbXBsZXhfdGFnLGNvbXBsZXhfdGFnID4KICAgIHsKICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgTjEsIHR5cGVuYW1lIE4yID4gc3RydWN0IGFwcGx5CiAgICAgICAgICAgIDogY29tcGxleDwKICAgICAgICAgICAgICAgICAgcGx1czwgdHlwZW5hbWUgTjE6OnJlYWwsIHR5cGVuYW1lIE4yOjpyZWFsID4KICAgICAgICAgICAgICAgICwgcGx1czwgdHlwZW5hbWUgTjE6OmltYWcsIHR5cGVuYW1lIE4yOjppbWFnID4KICAgICAgICAgICAgICAgID4KICAgICAgICB7CiAgICAgICAgfTsKICAgIH07CgogICAgfX0KCiAgICB0eXBlZGVmIGludF88Mj4gaTsKICAgIHR5cGVkZWYgY29tcGxleDwgaW50Xzw1PiwgaW50XzwtMT4gPiBjMTsKICAgIHR5cGVkZWYgY29tcGxleDwgaW50XzwtNT4sIGludF88MT4gPiBjMjsKCiAgICB0eXBlZGVmIHBsdXM8YzEsaT4gcjQ7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCByZWFsPHI0Pjo6dmFsdWUsID09LCA3ICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCBpbWFnPHI0Pjo6dmFsdWUsID09LCAtMSApOwoKICAgIHR5cGVkZWYgcGx1czxpLGMyPiByNTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIHJlYWw8cjU+Ojp2YWx1ZSwgPT0sIC0zICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCBpbWFnPHI1Pjo6dmFsdWUsID09LCAxICk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxNZXRhZnVuY3Rpb25zfCwgfE51bWVyaWMgTWV0YWZ1bmN0aW9ufCwgfHBsdXN8LCB8bWludXN8LCB8dGltZXN8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=