LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgUkJUX1BBUlNfSAojZGVmaW5lIFJCVF9QQVJTX0gKCiNpbmNsdWRlICJ1bmljb2RlL3JidC5oIgojaW5jbHVkZSAidXZlY3Rvci5oIgojaW5jbHVkZSAidW5pY29kZS9wYXJzZWVyci5oIgoKY2xhc3MgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGE7CmNsYXNzIFVuaWNvZGVTZXQ7CmNsYXNzIFBhcnNlRGF0YTsKY2xhc3MgUnVsZUhhbGY7CmNsYXNzIFBhcnNlUG9zaXRpb247CgpjbGFzcyBUcmFuc2xpdGVyYXRpb25SdWxlUGFyc2VyIHsKCiAgICAvKioKICAgICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gZXh0ZXJuYWwgZGF0YSB3ZSBkb24ndCBvd24uICBUaGlzIHdvcmtzIGJlY2F1c2UKICAgICAqIHdlIG9ubHkgaG9sZCB0aGlzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhbGwgdG8gcGFyc2UoKS4KICAgICAqLwogICAgY29uc3QgVW5pY29kZVN0cmluZyYgcnVsZXM7CgogICAgUnVsZUJhc2VkVHJhbnNsaXRlcmF0b3I6OkRpcmVjdGlvbiBkaXJlY3Rpb247CgogICAgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEqIGRhdGE7CgogICAgLyoqCiAgICAgKiBXZSB1c2UgYSBzaW5nbGUgZXJyb3IgY29kZSBkdXJpbmcgcGFyc2luZy4gIFJhdGhlciB0aGFuIHBhc3MgaXQKICAgICAqIHRocm91Z2ggZWFjaCBBUEksIHdlIGtlZXAgaXQgaGVyZS4KICAgICAqLwogICAgVUVycm9yQ29kZSBzdGF0dXM7CgogICAgLyoqCiAgICAgKiBQb2ludGVyIHRvIHVzZXIgc3RydWN0dXJlIGluIHdoaWNoIHRvIHJldHVybiBwYXJzZSBlcnJvciBpbmZvcm1hdGlvbi4KICAgICAqIE1heSBiZSBOVUxMLgogICAgICovCiAgICBQYXJzZUVycm9yKiBwYXJzZUVycm9yOwoKICAgIC8qKgogICAgICogVGVtcG9yYXJ5IHN5bWJvbCB0YWJsZSB1c2VkIGR1cmluZyBwYXJzaW5nLgogICAgICovCiAgICBQYXJzZURhdGEqIHBhcnNlRGF0YTsKCiAgICAvKioKICAgICAqIFRlbXBvcmFyeSB2ZWN0b3Igb2Ygc2V0IHZhcmlhYmxlcy4gIFdoZW4gcGFyc2luZyBpcyBjb21wbGV0ZSwgdGhpcwogICAgICogaXMgY29waWVkIGludG8gdGhlIGFycmF5IGRhdGEuc2V0VmFyaWFibGVzLiAgQXMgd2l0aCBkYXRhLnNldFZhcmlhYmxlcywKICAgICAqIGVsZW1lbnQgMCBjb3JyZXNwb25kcyB0byBjaGFyYWN0ZXIgZGF0YS5zZXRWYXJpYWJsZXNCYXNlLgogICAgICovCiAgICBVVmVjdG9yIHNldFZhcmlhYmxlc1ZlY3RvcjsKCiAgICAvKioKICAgICAqIFRoZSBuZXh0IGF2YWlsYWJsZSBzdGFuZC1pbiBmb3IgdmFyaWFibGVzLiAgVGhpcyBzdGFydHMgYXQgc29tZSBwb2ludCBpbgogICAgICogdGhlIHByaXZhdGUgdXNlIGFyZWEgKGRpc2NvdmVyZWQgZHluYW1pY2FsbHkpIGFuZCBpbmNyZW1lbnRzIHVwIHRvd2FyZAogICAgICogPGNvZGU+dmFyaWFibGVMaW1pdDwvY29kZT4uICBBdCBhbnkgcG9pbnQgZHVyaW5nIHBhcnNpbmcsIGF2YWlsYWJsZQogICAgICogdmFyaWFibGVzIGFyZSA8Y29kZT52YXJpYWJsZU5leHQuLnZhcmlhYmxlTGltaXQtMTwvY29kZT4uCiAgICAgKi8KICAgIFVDaGFyIHZhcmlhYmxlTmV4dDsKCiAgICAvKioKICAgICAqIFRoZSBsYXN0IGF2YWlsYWJsZSBzdGFuZC1pbiBmb3IgdmFyaWFibGVzLiAgVGhpcyBpcyBkaXNjb3ZlcmVkCiAgICAgKiBkeW5hbWljYWxseS4gIEF0IGFueSBwb2ludCBkdXJpbmcgcGFyc2luZywgYXZhaWxhYmxlIHZhcmlhYmxlcyBhcmUKICAgICAqIDxjb2RlPnZhcmlhYmxlTmV4dC4udmFyaWFibGVMaW1pdC0xPC9jb2RlPi4KICAgICAqLwogICAgVUNoYXIgdmFyaWFibGVMaW1pdDsKCiAgICAvKioKICAgICAqIFdoZW4gd2UgZW5jb3VudGVyIGFuIHVuZGVmaW5lZCB2YXJpYWJsZSwgd2UgZG8gbm90IGltbWVkaWF0ZWx5IHNpZ25hbAogICAgICogYW4gZXJyb3IsIGluIGNhc2Ugd2UgYXJlIGRlZmluaW5nIHRoaXMgdmFyaWFibGUsIGUuZy4sICIkYSA9IFthLXpdOyIuCiAgICAgKiBJbnN0ZWFkLCB3ZSBzYXZlIHRoZSBuYW1lIG9mIHRoZSB1bmRlZmluZWQgdmFyaWFibGUsIGFuZCBzdWJzdGl0dXRlCiAgICAgKiBpbiB0aGUgcGxhY2Vob2xkZXIgY2hhciB2YXJpYWJsZUxpbWl0IC0gMSwgYW5kIGRlY3JlbWVudAogICAgICogdmFyaWFibGVMaW1pdC4KICAgICAqLwogICAgVW5pY29kZVN0cmluZyB1bmRlZmluZWRWYXJpYWJsZU5hbWU7CgogICAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcgZ09QRVJBVE9SUzsKCnB1YmxpYzoKCiAgICBzdGF0aWMgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEqCiAgICAgICAgcGFyc2UoY29uc3QgVW5pY29kZVN0cmluZyYgcnVsZXMsCiAgICAgICAgICAgICAgUnVsZUJhc2VkVHJhbnNsaXRlcmF0b3I6OkRpcmVjdGlvbiBkaXJlY3Rpb24sCiAgICAgICAgICAgICAgUGFyc2VFcnJvciogcGFyc2VFcnJvciA9IDApOwogICAgCnByaXZhdGU6CgogICAgLyoqCiAgICAgKiBAcGFyYW0gcnVsZXMgbGlzdCBvZiBydWxlcywgc2VwYXJhdGVkIGJ5IG5ld2xpbmUgY2hhcmFjdGVycwogICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3IgaW4gdGhlCiAgICAgKiBydWxlcwogICAgICovCiAgICBUcmFuc2xpdGVyYXRpb25SdWxlUGFyc2VyKGNvbnN0IFVuaWNvZGVTdHJpbmcmIHJ1bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdWxlQmFzZWRUcmFuc2xpdGVyYXRvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VFcnJvciogcGFyc2VFcnJvciA9IDApOwoKICAgIC8qKgogICAgICogRGVzdHJ1Y3Rvci4KICAgICAqLwogICAgflRyYW5zbGl0ZXJhdGlvblJ1bGVQYXJzZXIoKTsKCiAgICAvKioKICAgICAqIFBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSBzZXF1ZW5jZSBvZiBydWxlcywgc2VwYXJhdGVkIGJ5IG5ld2xpbmUKICAgICAqIGNoYXJhY3RlcnMgKCdcbicpLCBhbmQgY2F1c2UgdGhpcyBvYmplY3QgdG8gaW1wbGVtZW50IHRob3NlIHJ1bGVzLiAgQW55CiAgICAgKiBwcmV2aW91cyBydWxlcyBhcmUgZGlzY2FyZGVkLiAgVHlwaWNhbGx5IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBleGFjdGx5CiAgICAgKiBvbmNlLCBkdXJpbmcgY29uc3RydWN0aW9uLgogICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3IgaW4gdGhlCiAgICAgKiBydWxlcwogICAgICovCiAgICB2b2lkIHBhcnNlUnVsZXModm9pZCk7CgogICAgLyoqCiAgICAgKiBNQUlOIFBBUlNFUi4gIFBhcnNlIHRoZSBuZXh0IHJ1bGUgaW4gdGhlIGdpdmVuIHJ1bGUgc3RyaW5nLCBzdGFydGluZwogICAgICogYXQgcG9zLiAgUmV0dXJuIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgcGFyc2VkLiAgRG8gbm90CiAgICAgKiBwYXJzZSBjaGFyYWN0ZXJzIGF0IG9yIGFmdGVyIGxpbWl0LgogICAgICoKICAgICAqIEltcG9ydGFudDogIFRoZSBjaGFyYWN0ZXIgYXQgcG9zIG11c3QgYmUgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIKICAgICAqIHRoYXQgaXMgbm90IHRoZSBjb21tZW50IGNoYXJhY3Rlci4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHF1b3RpbmcsIGVzY2FwaW5nLCBhbmQgd2hpdGVzcGFjZSByZW1vdmFsLiAgSXQKICAgICAqIHBhcnNlcyB0aGUgZW5kLW9mLXJ1bGUgY2hhcmFjdGVyLiAgSXQgcmVjb2duaXplcyBjb250ZXh0IGFuZCBjdXJzb3IKICAgICAqIGluZGljYXRvcnMuICBPbmNlIGl0IGRvZXMgYSBsZXhpY2FsIGJyZWFrZG93biBvZiB0aGUgcnVsZSBhdCBwb3MsIGl0CiAgICAgKiBjcmVhdGVzIGEgcnVsZSBvYmplY3QgYW5kIGFkZHMgaXQgdG8gb3VyIHJ1bGUgbGlzdC4KICAgICAqLwogICAgaW50MzJfdCBwYXJzZVJ1bGUoaW50MzJfdCBwb3MsIGludDMyX3QgbGltaXQpOwoKICAgIC8qKgogICAgICogQ2FsbGVkIGJ5IG1haW4gcGFyc2VyIHVwb24gc3ludGF4IGVycm9yLiAgU2VhcmNoIHRoZSBydWxlIHN0cmluZwogICAgICogZm9yIHRoZSBwcm9iYWJsZSBlbmQgb2YgdGhlIHJ1bGUuICBPZiBjb3Vyc2UsIGlmIHRoZSBlcnJvciBpcyB0aGF0CiAgICAgKiB0aGUgZW5kIG9mIHJ1bGUgbWFya2VyIGlzIG1pc3NpbmcsIHRoZW4gdGhlIHJ1bGUgZW5kIHdpbGwgbm90IGJlIGZvdW5kLgogICAgICogSW4gYW55IGNhc2UgdGhlIHJ1bGUgc3RhcnQgd2lsbCBiZSBjb3JyZWN0bHkgcmVwb3J0ZWQuCiAgICAgKiBAcGFyYW0gbXNnIGVycm9yIGRlc2NyaXB0aW9uCiAgICAgKiBAcGFyYW0gcnVsZSBwYXR0ZXJuIHN0cmluZwogICAgICogQHBhcmFtIHN0YXJ0IHBvc2l0aW9uIG9mIGZpcnN0IGNoYXJhY3RlciBvZiBjdXJyZW50IHJ1bGUKICAgICAqLwogICAgaW50MzJfdCBzeW50YXhFcnJvcihpbnQzMl90IHBhcnNlRXJyb3JDb2RlLCBjb25zdCBVbmljb2RlU3RyaW5nJiwgaW50MzJfdCBzdGFydCk7CgogICAgLyoqCiAgICAgKiBBbGxvY2F0ZSBhIHByaXZhdGUtdXNlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgZm9yIHRoZSBnaXZlbiBzZXQsCiAgICAgKiByZWdpc3RlciBpdCBpbiB0aGUgc2V0VmFyaWFibGVzIGhhc2gsIGFuZCByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbgogICAgICogY2hhcmFjdGVyLgogICAgICovCiAgICAvL1VDaGFyIHJlZ2lzdGVyU2V0KFVuaWNvZGVTZXQqIGFkb3B0ZWRTZXQpOwogCiAgICAvKioKICAgICAqIFBhcnNlIGEgVW5pY29kZVNldCBvdXQsIHN0b3JlIGl0LCBhbmQgcmV0dXJuIHRoZSBzdGFuZC1pbiBjaGFyYWN0ZXIKICAgICAqIHVzZWQgdG8gcmVwcmVzZW50IGl0LgogICAgICovCiAgICBVQ2hhciBwYXJzZVNldChjb25zdCBVbmljb2RlU3RyaW5nJiBydWxlLAogICAgICAgICAgICAgICAgICAgUGFyc2VQb3NpdGlvbiYgcG9zKTsKCiAgICAvKioKICAgICAqIEFwcGVuZCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHZhcmlhYmxlIG5hbWUgdG8gdGhlIGdpdmVuCiAgICAgKiBVbmljb2RlU3RyaW5nLgogICAgICovCiAgICB2b2lkIGFwcGVuZFZhcmlhYmxlRGVmKGNvbnN0IFVuaWNvZGVTdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmIGJ1Zik7CiAgICAgICAgCiAgICAvKioKICAgICAqIERldGVybWluZXMgd2hhdCBwYXJ0IG9mIHRoZSBwcml2YXRlIHVzZSByZWdpb24gb2YgVW5pY29kZSB3ZSBjYW4gdXNlIGZvcgogICAgICogdmFyaWFibGUgc3RhbmQtaW5zLiAgVGhlIGNvcnJlY3Qgd2F5IHRvIGRvIHRoaXMgaXMgYXMgZm9sbG93czogUGFyc2UgZWFjaAogICAgICogcnVsZSwgYW5kIGZvciBmb3J3YXJkIGFuZCByZXZlcnNlIHJ1bGVzLCB0YWtlIHRoZSBGUk9NIGV4cHJlc3Npb24sIGFuZAogICAgICogbWFrZSBhIGhhc2ggb2YgYWxsIGNoYXJhY3RlcnMgdXNlZC4gIFRoZSBUTyBleHByZXNzaW9uIHNob3VsZCBiZSBpZ25vcmVkLgogICAgICogV2hlbiBkb25lLCBldmVyeXRoaW5nIG5vdCBpbiB0aGUgaGFzaCBpcyBhdmFpbGFibGUgZm9yIHVzZS4gIEluIHByYWN0aWNlLAogICAgICogdGhpcyBtZXRob2QgbWF5IGVtcGxveSBzb21lIG90aGVyIGFsZ29yaXRobSBmb3IgaW1wcm92ZWQgc3BlZWQuCiAgICAgKi8KICAgIHZvaWQgZGV0ZXJtaW5lVmFyaWFibGVSYW5nZSh2b2lkKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIGEgY2hhcmFjdGVyLCBpZ25vcmluZyBxdW90ZWQgdGV4dC4KICAgICAqIEZvciBleGFtcGxlLCBpbiB0aGUgc3RyaW5nICJhYmMnaGlkZSdoIiwgdGhlICdoJyBpbiAiaGlkZSIgd2lsbCBub3QgYmUKICAgICAqIGZvdW5kIGJ5IGEgc2VhcmNoIGZvciAnaCcuCiAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0IHRvIGJlIHNlYXJjaGVkCiAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGJlZ2lubmluZyBpbmRleCwgaW5jbHVzaXZlOyA8Y29kZT4wIDw9IHN0YXJ0CiAgICAgKiA8PSBsaW1pdDwvY29kZT4uCiAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGVuZGluZyBpbmRleCwgZXhjbHVzaXZlOyA8Y29kZT5zdGFydCA8PSBsaW1pdAogICAgICogPD0gdGV4dC5sZW5ndGgoKTwvY29kZT4uCiAgICAgKiBAcGFyYW0gYyBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZvcgogICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGMsIG9yIC0xIGlmIG5vdCBmb3VuZC4KICAgICAqLwogICAgc3RhdGljIGludDMyX3QgcXVvdGVkSW5kZXhPZihjb25zdCBVbmljb2RlU3RyaW5nJiB0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBjKTsKCiAgICBmcmllbmQgY2xhc3MgUnVsZUhhbGY7Cn07CgojZW5kaWYK