LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgUkJUX1BBUlNfSAojZGVmaW5lIFJCVF9QQVJTX0gKCiNpbmNsdWRlICJ1bmljb2RlL3JidC5oIgojaW5jbHVkZSAidXZlY3Rvci5oIgojaW5jbHVkZSAidW5pY29kZS9wYXJzZWVyci5oIgoKY2xhc3MgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGE7CmNsYXNzIFVuaWNvZGVTZXQ7CmNsYXNzIFBhcnNlRGF0YTsKCmNsYXNzIFRyYW5zbGl0ZXJhdGlvblJ1bGVQYXJzZXIgewoKICAgIC8qKgogICAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBleHRlcm5hbCBkYXRhIHdlIGRvbid0IG93bi4gIFRoaXMgd29ya3MgYmVjYXVzZQogICAgICogd2Ugb25seSBob2xkIHRoaXMgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbCB0byBwYXJzZSgpLgogICAgICovCiAgICBjb25zdCBVbmljb2RlU3RyaW5nJiBydWxlczsKCiAgICBSdWxlQmFzZWRUcmFuc2xpdGVyYXRvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbjsKCiAgICBUcmFuc2xpdGVyYXRpb25SdWxlRGF0YSogZGF0YTsKCiAgICAvKioKICAgICAqIFdlIHVzZSBhIHNpbmdsZSBlcnJvciBjb2RlIGR1cmluZyBwYXJzaW5nLiAgUmF0aGVyIHRoYW4gcGFzcyBpdAogICAgICogdGhyb3VnaCBlYWNoIEFQSSwgd2Uga2VlcCBpdCBoZXJlLgogICAgICovCiAgICBVRXJyb3JDb2RlIHN0YXR1czsKCiAgICAvKioKICAgICAqIFBvaW50ZXIgdG8gdXNlciBzdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gcmV0dXJuIHBhcnNlIGVycm9yIGluZm9ybWF0aW9uLgogICAgICogTWF5IGJlIE5VTEwuCiAgICAgKi8KICAgIFBhcnNlRXJyb3IqIHBhcnNlRXJyb3I7CgogICAgLyoqCiAgICAgKiBUZW1wb3Jhcnkgc3ltYm9sIHRhYmxlIHVzZWQgZHVyaW5nIHBhcnNpbmcuCiAgICAgKi8KICAgIFBhcnNlRGF0YSogcGFyc2VEYXRhOwoKICAgIC8qKgogICAgICogVGVtcG9yYXJ5IHZlY3RvciBvZiBzZXQgdmFyaWFibGVzLiAgV2hlbiBwYXJzaW5nIGlzIGNvbXBsZXRlLCB0aGlzCiAgICAgKiBpcyBjb3BpZWQgaW50byB0aGUgYXJyYXkgZGF0YS5zZXRWYXJpYWJsZXMuICBBcyB3aXRoIGRhdGEuc2V0VmFyaWFibGVzLAogICAgICogZWxlbWVudCAwIGNvcnJlc3BvbmRzIHRvIGNoYXJhY3RlciBkYXRhLnNldFZhcmlhYmxlc0Jhc2UuCiAgICAgKi8KICAgIFVWZWN0b3Igc2V0VmFyaWFibGVzVmVjdG9yOwoKICAgIC8qKgogICAgICogVGhlIG5leHQgYXZhaWxhYmxlIHN0YW5kLWluIGZvciB2YXJpYWJsZXMuICBUaGlzIHN0YXJ0cyBhdCBzb21lIHBvaW50IGluCiAgICAgKiB0aGUgcHJpdmF0ZSB1c2UgYXJlYSAoZGlzY292ZXJlZCBkeW5hbWljYWxseSkgYW5kIGluY3JlbWVudHMgdXAgdG93YXJkCiAgICAgKiA8Y29kZT52YXJpYWJsZUxpbWl0PC9jb2RlPi4gIEF0IGFueSBwb2ludCBkdXJpbmcgcGFyc2luZywgYXZhaWxhYmxlCiAgICAgKiB2YXJpYWJsZXMgYXJlIDxjb2RlPnZhcmlhYmxlTmV4dC4udmFyaWFibGVMaW1pdC0xPC9jb2RlPi4KICAgICAqLwogICAgVUNoYXIgdmFyaWFibGVOZXh0OwoKICAgIC8qKgogICAgICogVGhlIGxhc3QgYXZhaWxhYmxlIHN0YW5kLWluIGZvciB2YXJpYWJsZXMuICBUaGlzIGlzIGRpc2NvdmVyZWQKICAgICAqIGR5bmFtaWNhbGx5LiAgQXQgYW55IHBvaW50IGR1cmluZyBwYXJzaW5nLCBhdmFpbGFibGUgdmFyaWFibGVzIGFyZQogICAgICogPGNvZGU+dmFyaWFibGVOZXh0Li52YXJpYWJsZUxpbWl0LTE8L2NvZGU+LgogICAgICovCiAgICBVQ2hhciB2YXJpYWJsZUxpbWl0OwoKICAgIC8vIE9wZXJhdG9ycwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFZBUklBQkxFX0RFRl9PUDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBGT1JXQVJEX1JVTEVfT1A7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUkVWRVJTRV9SVUxFX09QOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEZXRFJFVl9SVUxFX09QOyAvLyBpbnRlcm5hbCByZXAgb2YgPD4gb3AKICAgIHN0YXRpYyBjb25zdCBVbmljb2RlU3RyaW5nIE9QRVJBVE9SUzsKCiAgICAvLyBPdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBRVU9URTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBFU0NBUEU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgRU5EX09GX1JVTEU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUlVMRV9DT01NRU5UX0NIQVI7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgVkFSSUFCTEVfUkVGX09QRU47CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgVkFSSUFCTEVfUkVGX0NMT1NFOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIENPTlRFWFRfT1BFTjsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBDT05URVhUX0NMT1NFOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFNFVF9PUEVOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFNFVF9DTE9TRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBDVVJTT1JfUE9TOwoKcHVibGljOgoKICAgIHN0YXRpYyBUcmFuc2xpdGVyYXRpb25SdWxlRGF0YSoKICAgICAgICBwYXJzZShjb25zdCBVbmljb2RlU3RyaW5nJiBydWxlcywKICAgICAgICAgICAgICBSdWxlQmFzZWRUcmFuc2xpdGVyYXRvcjo6RGlyZWN0aW9uIGRpcmVjdGlvbiwKICAgICAgICAgICAgICBQYXJzZUVycm9yKiBwYXJzZUVycm9yID0gMCk7CiAgICAKcHJpdmF0ZToKCiAgICAvKioKICAgICAqIEBwYXJhbSBydWxlcyBsaXN0IG9mIHJ1bGVzLCBzZXBhcmF0ZWQgYnkgbmV3bGluZSBjaGFyYWN0ZXJzCiAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvciBpbiB0aGUKICAgICAqIHJ1bGVzCiAgICAgKi8KICAgIFRyYW5zbGl0ZXJhdGlvblJ1bGVQYXJzZXIoY29uc3QgVW5pY29kZVN0cmluZyYgcnVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bGVCYXNlZFRyYW5zbGl0ZXJhdG9yOjpEaXJlY3Rpb24gZGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUVycm9yKiBwYXJzZUVycm9yID0gMCk7CgogICAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICovCiAgICB+VHJhbnNsaXRlcmF0aW9uUnVsZVBhcnNlcigpOwoKICAgIC8qKgogICAgICogUGFyc2UgdGhlIGdpdmVuIHN0cmluZyBhcyBhIHNlcXVlbmNlIG9mIHJ1bGVzLCBzZXBhcmF0ZWQgYnkgbmV3bGluZQogICAgICogY2hhcmFjdGVycyAoJ1xuJyksIGFuZCBjYXVzZSB0aGlzIG9iamVjdCB0byBpbXBsZW1lbnQgdGhvc2UgcnVsZXMuICBBbnkKICAgICAqIHByZXZpb3VzIHJ1bGVzIGFyZSBkaXNjYXJkZWQuICBUeXBpY2FsbHkgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGV4YWN0bHkKICAgICAqIG9uY2UsIGR1cmluZyBjb25zdHJ1Y3Rpb24uCiAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvciBpbiB0aGUKICAgICAqIHJ1bGVzCiAgICAgKi8KICAgIHZvaWQgcGFyc2VSdWxlcyh2b2lkKTsKCiAgICAvKioKICAgICAqIE1BSU4gUEFSU0VSLiAgUGFyc2UgdGhlIG5leHQgcnVsZSBpbiB0aGUgZ2l2ZW4gcnVsZSBzdHJpbmcsIHN0YXJ0aW5nCiAgICAgKiBhdCBwb3MuICBSZXR1cm4gdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBwYXJzZWQuICBEbyBub3QKICAgICAqIHBhcnNlIGNoYXJhY3RlcnMgYXQgb3IgYWZ0ZXIgbGltaXQuCiAgICAgKgogICAgICogSW1wb3J0YW50OiAgVGhlIGNoYXJhY3RlciBhdCBwb3MgbXVzdCBiZSBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcgogICAgICogdGhhdCBpcyBub3QgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgcXVvdGluZywgZXNjYXBpbmcsIGFuZCB3aGl0ZXNwYWNlIHJlbW92YWwuICBJdAogICAgICogcGFyc2VzIHRoZSBlbmQtb2YtcnVsZSBjaGFyYWN0ZXIuICBJdCByZWNvZ25pemVzIGNvbnRleHQgYW5kIGN1cnNvcgogICAgICogaW5kaWNhdG9ycy4gIE9uY2UgaXQgZG9lcyBhIGxleGljYWwgYnJlYWtkb3duIG9mIHRoZSBydWxlIGF0IHBvcywgaXQKICAgICAqIGNyZWF0ZXMgYSBydWxlIG9iamVjdCBhbmQgYWRkcyBpdCB0byBvdXIgcnVsZSBsaXN0LgogICAgICovCiAgICBpbnQzMl90IHBhcnNlUnVsZShpbnQzMl90IHBvcywgaW50MzJfdCBsaW1pdCk7CgogICAgLyoqCiAgICAgKiBDYWxsZWQgYnkgbWFpbiBwYXJzZXIgdXBvbiBzeW50YXggZXJyb3IuICBTZWFyY2ggdGhlIHJ1bGUgc3RyaW5nCiAgICAgKiBmb3IgdGhlIHByb2JhYmxlIGVuZCBvZiB0aGUgcnVsZS4gIE9mIGNvdXJzZSwgaWYgdGhlIGVycm9yIGlzIHRoYXQKICAgICAqIHRoZSBlbmQgb2YgcnVsZSBtYXJrZXIgaXMgbWlzc2luZywgdGhlbiB0aGUgcnVsZSBlbmQgd2lsbCBub3QgYmUgZm91bmQuCiAgICAgKiBJbiBhbnkgY2FzZSB0aGUgcnVsZSBzdGFydCB3aWxsIGJlIGNvcnJlY3RseSByZXBvcnRlZC4KICAgICAqIEBwYXJhbSBtc2cgZXJyb3IgZGVzY3JpcHRpb24KICAgICAqIEBwYXJhbSBydWxlIHBhdHRlcm4gc3RyaW5nCiAgICAgKiBAcGFyYW0gc3RhcnQgcG9zaXRpb24gb2YgZmlyc3QgY2hhcmFjdGVyIG9mIGN1cnJlbnQgcnVsZQogICAgICovCiAgICBpbnQzMl90IHN5bnRheEVycm9yKGludDMyX3QgcGFyc2VFcnJvckNvZGUsIGNvbnN0IFVuaWNvZGVTdHJpbmcmLCBpbnQzMl90IHN0YXJ0KTsKCiAgICAvKioKICAgICAqIEFsbG9jYXRlIGEgcHJpdmF0ZS11c2Ugc3Vic3RpdHV0aW9uIGNoYXJhY3RlciBmb3IgdGhlIGdpdmVuIHNldCwKICAgICAqIHJlZ2lzdGVyIGl0IGluIHRoZSBzZXRWYXJpYWJsZXMgaGFzaCwgYW5kIHJldHVybiB0aGUgc3Vic3RpdHV0aW9uCiAgICAgKiBjaGFyYWN0ZXIuCiAgICAgKi8KICAgIFVDaGFyIHJlZ2lzdGVyU2V0KFVuaWNvZGVTZXQqIGFkb3B0ZWRTZXQpOwogCiAgICAvKioKICAgICAqIERldGVybWluZXMgd2hhdCBwYXJ0IG9mIHRoZSBwcml2YXRlIHVzZSByZWdpb24gb2YgVW5pY29kZSB3ZSBjYW4gdXNlIGZvcgogICAgICogdmFyaWFibGUgc3RhbmQtaW5zLiAgVGhlIGNvcnJlY3Qgd2F5IHRvIGRvIHRoaXMgaXMgYXMgZm9sbG93czogUGFyc2UgZWFjaAogICAgICogcnVsZSwgYW5kIGZvciBmb3J3YXJkIGFuZCByZXZlcnNlIHJ1bGVzLCB0YWtlIHRoZSBGUk9NIGV4cHJlc3Npb24sIGFuZAogICAgICogbWFrZSBhIGhhc2ggb2YgYWxsIGNoYXJhY3RlcnMgdXNlZC4gIFRoZSBUTyBleHByZXNzaW9uIHNob3VsZCBiZSBpZ25vcmVkLgogICAgICogV2hlbiBkb25lLCBldmVyeXRoaW5nIG5vdCBpbiB0aGUgaGFzaCBpcyBhdmFpbGFibGUgZm9yIHVzZS4gIEluIHByYWN0aWNlLAogICAgICogdGhpcyBtZXRob2QgbWF5IGVtcGxveSBzb21lIG90aGVyIGFsZ29yaXRobSBmb3IgaW1wcm92ZWQgc3BlZWQuCiAgICAgKi8KICAgIHZvaWQgZGV0ZXJtaW5lVmFyaWFibGVSYW5nZSh2b2lkKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIGEgY2hhcmFjdGVyLCBpZ25vcmluZyBxdW90ZWQgdGV4dC4KICAgICAqIEZvciBleGFtcGxlLCBpbiB0aGUgc3RyaW5nICJhYmMnaGlkZSdoIiwgdGhlICdoJyBpbiAiaGlkZSIgd2lsbCBub3QgYmUKICAgICAqIGZvdW5kIGJ5IGEgc2VhcmNoIGZvciAnaCcuCiAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0IHRvIGJlIHNlYXJjaGVkCiAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGJlZ2lubmluZyBpbmRleCwgaW5jbHVzaXZlOyA8Y29kZT4wIDw9IHN0YXJ0CiAgICAgKiA8PSBsaW1pdDwvY29kZT4uCiAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGVuZGluZyBpbmRleCwgZXhjbHVzaXZlOyA8Y29kZT5zdGFydCA8PSBsaW1pdAogICAgICogPD0gdGV4dC5sZW5ndGgoKTwvY29kZT4uCiAgICAgKiBAcGFyYW0gYyBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZvcgogICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGMsIG9yIC0xIGlmIG5vdCBmb3VuZC4KICAgICAqLwogICAgc3RhdGljIGludDMyX3QgcXVvdGVkSW5kZXhPZihjb25zdCBVbmljb2RlU3RyaW5nJiB0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBjKTsKfTsKCiNlbmRpZgo=