LyoKd3d3LnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90aW55eG1sCk9yaWdpbmFsIGZpbGUgYnkgWXZlcyBCZXJxdWluLgoKVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueQpkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCgpQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKcHVycG9zZSwgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kCnJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CgoxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0Cm5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcwpzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24Kd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KCjIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kCm11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KCjMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZQpkaXN0cmlidXRpb24uCiovCgovKgogKiBUSElTIEZJTEUgV0FTIEFMVEVSRUQgQlkgVHlnZSBM+HZzZXQsIDcuIEFwcmlsIDIwMDUuCiAqLwoKCiNpZm5kZWYgVElYTUxfVVNFX1NUTAoKI2luY2x1ZGUgInRpbnlzdHIuaCIKCi8vIEVycm9yIHZhbHVlIGZvciBmaW5kIHByaW1pdGl2ZQpjb25zdCBUaVhtbFN0cmluZzo6c2l6ZV90eXBlIFRpWG1sU3RyaW5nOjpucG9zID0gc3RhdGljX2Nhc3Q8IHNpemVfdHlwZSA+KC0xKTsKCi8vIE51bGwgcmVwLgpUaVhtbFN0cmluZzo6UmVwIFRpWG1sU3RyaW5nOjpudWxscmVwXyA9IHsgMCwgMCwgJ1wwJyB9OwoKCnZvaWQgVGlYbWxTdHJpbmc6OnJlc2VydmUgKHNpemVfdHlwZSBjYXApCnsKCWlmIChjYXAgPiBjYXBhY2l0eSgpKQoJewoJCVRpWG1sU3RyaW5nIHRtcDsKCQl0bXAuaW5pdChsZW5ndGgoKSwgY2FwKTsKCQltZW1jcHkodG1wLnN0YXJ0KCksIGRhdGEoKSwgbGVuZ3RoKCkpOwoJCXN3YXAodG1wKTsKCX0KfQoKClRpWG1sU3RyaW5nJiBUaVhtbFN0cmluZzo6YXNzaWduKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90eXBlIGxlbikKewoJc2l6ZV90eXBlIGNhcCA9IGNhcGFjaXR5KCk7CglpZiAobGVuID4gY2FwIHx8IGNhcCA+IDMqKGxlbiArIDgpKQoJewoJCVRpWG1sU3RyaW5nIHRtcDsKCQl0bXAuaW5pdChsZW4pOwoJCW1lbWNweSh0bXAuc3RhcnQoKSwgc3RyLCBsZW4pOwoJCXN3YXAodG1wKTsKCX0KCWVsc2UKCXsKCQltZW1tb3ZlKHN0YXJ0KCksIHN0ciwgbGVuKTsKCQlzZXRfc2l6ZShsZW4pOwoJfQoJcmV0dXJuICp0aGlzOwp9CgoKVGlYbWxTdHJpbmcmIFRpWG1sU3RyaW5nOjphcHBlbmQoY29uc3QgY2hhciogc3RyLCBzaXplX3R5cGUgbGVuKQp7CglzaXplX3R5cGUgbmV3c2l6ZSA9IGxlbmd0aCgpICsgbGVuOwoJaWYgKG5ld3NpemUgPiBjYXBhY2l0eSgpKQoJewoJCXJlc2VydmUgKG5ld3NpemUgKyBjYXBhY2l0eSgpKTsKCX0KCW1lbW1vdmUoZmluaXNoKCksIHN0ciwgbGVuKTsKCXNldF9zaXplKG5ld3NpemUpOwoJcmV0dXJuICp0aGlzOwp9CgoKVGlYbWxTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgVGlYbWxTdHJpbmcgJiBhLCBjb25zdCBUaVhtbFN0cmluZyAmIGIpCnsKCVRpWG1sU3RyaW5nIHRtcDsKCXRtcC5yZXNlcnZlKGEubGVuZ3RoKCkgKyBiLmxlbmd0aCgpKTsKCXRtcCArPSBhOwoJdG1wICs9IGI7CglyZXR1cm4gdG1wOwp9CgpUaVhtbFN0cmluZyBvcGVyYXRvciArIChjb25zdCBUaVhtbFN0cmluZyAmIGEsIGNvbnN0IGNoYXIqIGIpCnsKCVRpWG1sU3RyaW5nIHRtcDsKCVRpWG1sU3RyaW5nOjpzaXplX3R5cGUgYl9sZW4gPSBzdGF0aWNfY2FzdDxUaVhtbFN0cmluZzo6c2l6ZV90eXBlPiggc3RybGVuKGIpICk7Cgl0bXAucmVzZXJ2ZShhLmxlbmd0aCgpICsgYl9sZW4pOwoJdG1wICs9IGE7Cgl0bXAuYXBwZW5kKGIsIGJfbGVuKTsKCXJldHVybiB0bXA7Cn0KClRpWG1sU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IGNoYXIqIGEsIGNvbnN0IFRpWG1sU3RyaW5nICYgYikKewoJVGlYbWxTdHJpbmcgdG1wOwoJVGlYbWxTdHJpbmc6OnNpemVfdHlwZSBhX2xlbiA9IHN0YXRpY19jYXN0PFRpWG1sU3RyaW5nOjpzaXplX3R5cGU+KCBzdHJsZW4oYSkgKTsKCXRtcC5yZXNlcnZlKGFfbGVuICsgYi5sZW5ndGgoKSk7Cgl0bXAuYXBwZW5kKGEsIGFfbGVuKTsKCXRtcCArPSBiOwoJcmV0dXJuIHRtcDsKfQoKCiNlbmRpZgkvLyBUSVhNTF9VU0VfU1RMCg==