LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgUkJUX0RBVEFfSAojZGVmaW5lIFJCVF9EQVRBX0gKCiNpbmNsdWRlICJyYnRfc2V0LmgiCgpjbGFzcyBVbmljb2RlU3RyaW5nOwpjbGFzcyBVbmljb2RlU2V0OwpzdHJ1Y3QgVUhhc2h0YWJsZTsKCi8qKgogKiBUaGUgcnVsZSBkYXRhIGZvciBhIFJ1bGVCYXNlZFRyYW5zbGl0ZXJhdG9ycy4gIFJCVCBvYmplY3RzIGhvbGQKICogYSBjb25zdCBwb2ludGVyIHRvIGEgVFJEIG9iamVjdCB0aGF0IHRoZXkgZG8gbm90IG93bi4gIFRSRCBvYmplY3RzCiAqIGFyZSBlc3NlbnRpYWxseSB0aGUgcGFyc2VkIHJ1bGVzIGluIGNvbXBhY3QsIHVzYWJsZSBmb3JtLiAgVGhlCiAqIFRSRCBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIGhlbGQgZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzIGluCiAqIGEgc3RhdGljIGNhY2hlIG93bmVkIGJ5IFRyYW5zbGl0ZXJhdG9yLgogKi8KY2xhc3MgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEgewoKcHVibGljOgoKICAgIC8qKgogICAgICogUnVsZSB0YWJsZS4gIE1heSBiZSBlbXB0eS4KICAgICAqCiAgICAgKiBQVUJMSUMgREFUQSBNRU1CRVIgZm9yIGludGVybmFsIHVzZSBieSBSQlQKICAgICAqLwogICAgVHJhbnNsaXRlcmF0aW9uUnVsZVNldCBydWxlU2V0OwoKICAgIC8qKgogICAgICogTWFwIHZhcmlhYmxlIG5hbWUgKFVuaWNvZGVTdHJpbmcpIHRvIHZhcmlhYmxlIChDaGFyYWN0ZXIpLgogICAgICogQSB2YXJpYWJsZSBuYW1lIG1heSBjb3JyZXNwb25kIHRvIGEgc2luZ2xlIGxpdGVyYWwKICAgICAqIGNoYXJhY3RlciwgaW4gd2hpY2ggY2FzZSB0aGUgY2hhcmFjdGVyIGlzIHN0b3JlZCBpbiB0aGlzCiAgICAgKiBoYXNoLiAgSXQgbWF5IGFsc28gY29ycmVzcG9uZCB0byBhIFVuaWNvZGVTZXQsIGluIHdoaWNoCiAgICAgKiBjYXNlIGEgY2hhcmFjdGVyIGlzIGFnYWluIHN0b3JlZCBpbiB0aGlzIGhhc2gsIGJ1dCB0aGUKICAgICAqIGNoYXJhY3RlciBpcyBhIHN0YW5kLWluOiBpdCBpcyBhIGtleSBmb3IgYSBzZWNvbmRhcnkgbG9va3VwCiAgICAgKiBpbiBkYXRhLnNldFZhcmlhYmxlcy4gIFRoZSBzdGFuZC1pbiBhbHNvIHJlcHJlc2VudHMgdGhlCiAgICAgKiBVbmljb2RlU2V0IGluIHRoZSBzdG9yZWQgcnVsZXMuCiAgICAgKgogICAgICogUFVCTElDIERBVEEgTUVNQkVSIGZvciBpbnRlcm5hbCB1c2UgYnkgUkJUCiAgICAgKi8KICAgIFVIYXNodGFibGUqIHZhcmlhYmxlTmFtZXM7CiAgICAKICAgIC8qKgogICAgICogTWFwIGNhdGVnb3J5IHZhcmlhYmxlIChVQ2hhcikgdG8gc2V0IChVbmljb2RlU2V0KS4KICAgICAqIFZhcmlhYmxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBzZXQgb2YgY2hhcmFjdGVycyBhcmUgbWFwcGVkCiAgICAgKiBmcm9tIHZhcmlhYmxlIG5hbWUgdG8gYSBzdGFuZC1pbiBjaGFyYWN0ZXIgaW4KICAgICAqIGRhdGEudmFyaWFibGVOYW1lcy4gIFRoZSBzdGFuZC1pbiB0aGVuIHNlcnZlcyBhcyBhIGtleSBpbgogICAgICogdGhpcyBoYXNoIHRvIGxvb2t1cCB0aGUgYWN0dWFsIFVuaWNvZGVTZXQgb2JqZWN0LiAgSW4KICAgICAqIGFkZGl0aW9uLCB0aGUgc3RhbmQtaW4gaXMgc3RvcmVkIGluIHRoZSBydWxlIHRleHQgdG8KICAgICAqIHJlcHJlc2VudCB0aGUgc2V0IG9mIGNoYXJhY3RlcnMuCiAgICAgKgogICAgICogUFVCTElDIERBVEEgTUVNQkVSIGZvciBpbnRlcm5hbCB1c2UgYnkgUkJUCiAgICAgKi8KICAgIFVIYXNodGFibGUqIHNldFZhcmlhYmxlczsKICAgIAogICAgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEoVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICB+VHJhbnNsaXRlcmF0aW9uUnVsZURhdGEoKTsKICAgIAogICAgdm9pZCBkZWZpbmVWYXJpYWJsZShjb25zdCBVbmljb2RlU3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKTsKICAgICAgICAKICAgIHZvaWQgZGVmaW5lVmFyaWFibGUoY29uc3QgVW5pY29kZVN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgc3RhbmRJbiwKICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZVNldCogYWRvcHRlZFNldCwKICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICB2b2lkIGRlZmluZVNldChVQ2hhciBzdGFuZEluLAogICAgICAgICAgICAgICAgICAgVW5pY29kZVNldCogYWRvcHRlZFNldCwKICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgVUNoYXIgbG9va3VwVmFyaWFibGUoY29uc3QgVW5pY29kZVN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3Q7CiAgICAKCVVuaWNvZGVTZXQqIGxvb2t1cFNldChVQ2hhciBzdGFuZEluKSBjb25zdDsKCiAgICBib29sX3QgaXNWYXJpYWJsZURlZmluZWQoY29uc3QgVW5pY29kZVN0cmluZyYgbmFtZSkgY29uc3Q7Cn07CgojZW5kaWYK