LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBGaWxlIFBBUlNFUE9TLkgKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMDcvMDkvOTcgICAgaGVsZW5hICAgICAgQ29udmVydGVkIGZyb20gamF2YS4KKiAgIDA3LzE3Lzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIGVycm9ySW5kZXggc3VwcG9ydC4KKiAgIDA1LzExLzk5ICAgIHN0ZXBoZW4gICAgIENsZWFuZWQgdXAuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgUEFSU0VQT1NfSAojZGVmaW5lIFBBUlNFUE9TX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgogICAgIAovKioKICogPGNvZGU+UGFyc2VQb3NpdGlvbjwvY29kZT4gaXMgYSBzaW1wbGUgY2xhc3MgdXNlZCBieSA8Y29kZT5Gb3JtYXQ8L2NvZGU+CiAqIGFuZCBpdHMgc3ViY2xhc3NlcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uIGR1cmluZyBwYXJzaW5nLgogKiBUaGUgPGNvZGU+cGFyc2VPYmplY3Q8L2NvZGU+IG1ldGhvZCBpbiB0aGUgdmFyaW91cyA8Y29kZT5Gb3JtYXQ8L2NvZGU+CiAqIGNsYXNzZXMgcmVxdWlyZXMgYSA8Y29kZT5QYXJzZVBvc2l0aW9uPC9jb2RlPiBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAqCiAqIDxwPiAKICogQnkgZGVzaWduLCBhcyB5b3UgcGFyc2UgdGhyb3VnaCBhIHN0cmluZyB3aXRoIGRpZmZlcmVudCBmb3JtYXRzLAogKiB5b3UgY2FuIHVzZSB0aGUgc2FtZSA8Y29kZT5QYXJzZVBvc2l0aW9uPC9jb2RlPiwgc2luY2UgdGhlIGluZGV4IHBhcmFtZXRlcgogKiByZWNvcmRzIHRoZSBjdXJyZW50IHBvc2l0aW9uLgogKgogKiBAdmVyc2lvbiAgICAgMS4zIDEwLzMwLzk3CiAqIEBhdXRob3IgICAgICBNYXJrIERhdmlzLCBIZWxlbmEgU2hpaAogKiBAc2VlICAgICAgICAgamF2YS50ZXh0LkZvcm1hdAogKi8KCmNsYXNzIFVfSTE4Tl9BUEkgUGFyc2VQb3NpdGlvbiB7CnB1YmxpYzoKICAgIC8qKgogICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgdGhlIGluZGV4IHN0YXJ0cyB3aXRoIDAgYXMgZGVmYXVsdC4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgUGFyc2VQb3NpdGlvbigpIAogICAgICB7IHRoaXMtPmluZGV4ID0gMDsgdGhpcy0+ZXJyb3JJbmRleCA9IC0xOyB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgUGFyc2VQb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGluZGV4LgogICAgICogQHBhcmFtIG5ld0luZGV4IHRoZSBuZXcgdGV4dCBvZmZzZXQuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFBhcnNlUG9zaXRpb24oVVRleHRPZmZzZXQgbmV3SW5kZXgpIAogICAgICB7ICAgIHRoaXMtPmluZGV4ID0gbmV3SW5kZXg7IHRoaXMtPmVycm9ySW5kZXggPSAtMTsgfSAKICAgIAogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yCiAgICAgKiBAcGFyYW0gY29weSB0aGUgb2JqZWN0IHRvIGJlIGNvcGllZCBmcm9tLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBQYXJzZVBvc2l0aW9uKGNvbnN0IFBhcnNlUG9zaXRpb24mIGNvcHkpIAogICAgICB7ICAgIHRoaXMtPmluZGV4ID0gY29weS5pbmRleDsgdGhpcy0+ZXJyb3JJbmRleCA9IGNvcHkuZXJyb3JJbmRleDsgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvcgogICAgICogQHN0YWJsZQogICAgICovCiAgICB+UGFyc2VQb3NpdGlvbigpIHt9CgogICAgLyoqCiAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFBhcnNlUG9zaXRpb24mICAgICAgb3BlcmF0b3I9KGNvbnN0IFBhcnNlUG9zaXRpb24mIGNvcHkpOwoKICAgIC8qKiAKICAgICAqIEVxdWFsaXR5IG9wZXJhdG9yLgogICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gcGFyc2UgcG9zaXRpb25zIGFyZSBlcXVhbCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBVQm9vbCAgICAgICAgICAgICAgb3BlcmF0b3I9PShjb25zdCBQYXJzZVBvc2l0aW9uJiB0aGF0KSBjb25zdDsKCiAgICAvKiogCiAgICAgKiBFcXVhbGl0eSBvcGVyYXRvci4KICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgdHdvIHBhcnNlIHBvc2l0aW9ucyBhcmUgbm90IGVxdWFsLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFVCb29sICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IFBhcnNlUG9zaXRpb24mIHRoYXQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcGFyc2UgcG9zaXRpb24uICBPbiBpbnB1dCB0byBhIHBhcnNlIG1ldGhvZCwgdGhpcwogICAgICogaXMgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgYXQgd2hpY2ggcGFyc2luZyB3aWxsIGJlZ2luOyBvbiBvdXRwdXQsIGl0CiAgICAgKiBpcyB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGxhc3QgY2hhcmFjdGVyIHBhcnNlZC4KICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaW5kZXguCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIFVUZXh0T2Zmc2V0IGdldEluZGV4KHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogU2V0IHRoZSBjdXJyZW50IHBhcnNlIHBvc2l0aW9uLgogICAgICogQHBhcmFtIGluZGV4IHRoZSBuZXcgaW5kZXguCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZvaWQgc2V0SW5kZXgoVVRleHRPZmZzZXQgaW5kZXgpOwoKICAgIC8qKgogICAgICogU2V0IHRoZSBpbmRleCBhdCB3aGljaCBhIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgRm9ybWF0dGVycwogICAgICogc2hvdWxkIHNldCB0aGlzIGJlZm9yZSByZXR1cm5pbmcgYW4gZXJyb3IgY29kZSBmcm9tIHRoZWlyCiAgICAgKiBwYXJzZU9iamVjdCBtZXRob2QuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMSBpZiB0aGlzIGlzIG5vdAogICAgICogc2V0LiAgCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZvaWQgc2V0RXJyb3JJbmRleChVVGV4dE9mZnNldCBlaSk7CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSB0aGUgaW5kZXggYXQgd2hpY2ggYW4gZXJyb3Igb2NjdXJyZWQsIG9yIC0xIGlmIHRoZQogICAgICogZXJyb3IgaW5kZXggaGFzIG5vdCBiZWVuIHNldC4gIAogICAgICogQHN0YWJsZQogICAgICovCiAgICBVVGV4dE9mZnNldCBnZXRFcnJvckluZGV4KHZvaWQpIGNvbnN0OwoKcHJpdmF0ZToKICAgIC8qKgogICAgICogSW5wdXQ6IHRoZSBwbGFjZSB5b3Ugc3RhcnQgcGFyc2luZy4KICAgICAqIDxicj5PdXRwdXQ6IHBvc2l0aW9uIHdoZXJlIHRoZSBwYXJzZSBzdG9wcGVkLgogICAgICogVGhpcyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHNlcmlhbGx5LAogICAgICogd2l0aCBlYWNoIGNhbGwgc2V0dGluZyBpbmRleCB1cCBmb3IgdGhlIG5leHQgb25lLgogICAgICovCiAgICBVVGV4dE9mZnNldCBpbmRleDsKICAgIAogICAgLyoqCiAgICAgKiBUaGUgaW5kZXggYXQgd2hpY2ggYSBwYXJzZSBlcnJvciBvY2N1cnJlZC4KICAgICAqLwogICAgVVRleHRPZmZzZXQgZXJyb3JJbmRleDsKfTsKCmlubGluZSBQYXJzZVBvc2l0aW9uJgpQYXJzZVBvc2l0aW9uOjpvcGVyYXRvcj0oY29uc3QgUGFyc2VQb3NpdGlvbiYgY29weSkKewogIGluZGV4ID0gY29weS5pbmRleDsKICBlcnJvckluZGV4ID0gY29weS5lcnJvckluZGV4OwogIHJldHVybiAqdGhpczsKfQoKaW5saW5lIFVCb29sClBhcnNlUG9zaXRpb246Om9wZXJhdG9yPT0oY29uc3QgUGFyc2VQb3NpdGlvbiYgY29weSkgY29uc3QKewogIGlmKGluZGV4ICE9IGNvcHkuaW5kZXggfHwgZXJyb3JJbmRleCAhPSBjb3B5LmVycm9ySW5kZXgpIAogIHJldHVybiBGQUxTRTsKICBlbHNlCiAgcmV0dXJuIFRSVUU7Cn0KCmlubGluZSBVQm9vbApQYXJzZVBvc2l0aW9uOjpvcGVyYXRvciE9KGNvbnN0IFBhcnNlUG9zaXRpb24mIGNvcHkpIGNvbnN0CnsKICByZXR1cm4gIW9wZXJhdG9yPT0oY29weSk7Cn0KCmlubGluZSBVVGV4dE9mZnNldApQYXJzZVBvc2l0aW9uOjpnZXRJbmRleCgpIGNvbnN0CnsKICByZXR1cm4gaW5kZXg7Cn0KCmlubGluZSB2b2lkClBhcnNlUG9zaXRpb246OnNldEluZGV4KFVUZXh0T2Zmc2V0IG9mZnNldCkKewogIHRoaXMtPmluZGV4ID0gb2Zmc2V0Owp9CgppbmxpbmUgVVRleHRPZmZzZXQKUGFyc2VQb3NpdGlvbjo6Z2V0RXJyb3JJbmRleCgpIGNvbnN0CnsKICByZXR1cm4gZXJyb3JJbmRleDsKfQoKaW5saW5lIHZvaWQKUGFyc2VQb3NpdGlvbjo6c2V0RXJyb3JJbmRleChVVGV4dE9mZnNldCBlaSkKewogIHRoaXMtPmVycm9ySW5kZXggPSBlaTsKfQoKI2VuZGlmCg==