LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQ29weXJpZ2h0IChDKSB7MTk5Ni0yMDAzfSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAqCiogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCi8qKgoqIEZpbGUgdGJsY29sbC5jcHAKKgoqIENyZWF0ZWQgYnk6IEhlbGVuYSBTaGloCioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAyLzUvOTcgICAgICBhbGl1ICAgICAgICBBZGRlZCBzdHJlYW1JbiBhbmQgc3RyZWFtT3V0IG1ldGhvZHMuICBBZGRlZAoqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciB3aGljaCByZWFkcyBSdWxlQmFzZWRDb2xsYXRvciBvYmplY3QgZnJvbQoqICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJpbmFyeSBmaWxlLiAgQWRkZWQgd3JpdGVUb0ZpbGUgbWV0aG9kIHdoaWNoIHN0cmVhbXMKKiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3Igb3V0IHRvIGEgYmluYXJ5IGZpbGUuICBUaGUgc3RyZWFtSW4KKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN0cmVhbU91dCBtZXRob2RzIHVzZSBpc3RyZWFtIGFuZCBvc3RyZWFtIG9iamVjdHMKKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYmluYXJ5IG1vZGUuCiogIDIvMTEvOTcgICAgIGFsaXUgICAgICAgIE1vdmVkIGRlY2xhcmF0aW9ucyBvdXQgb2YgZm9yIGxvb3AgaW5pdGlhbGl6ZXIuCiogICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1hYyBjb21wYXRpYmlsaXR5ICNpZmRlZiBmb3IgaW9zOjpub2NyZWF0ZS4KKiAgMi8xMi85NyAgICAgYWxpdSAgICAgICAgTW9kaWZpZWQgdG8gdXNlIFRhYmxlQ29sbGF0aW9uRGF0YSBzdWItb2JqZWN0IHRvCiogICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgaW52YXJpYW50IGRhdGEuCiogIDIvMTMvOTcgICAgIGFsaXUgICAgICAgIE1vdmVkIHNldmVyYWwgbWV0aG9kcyBpbnRvIHRoaXMgY2xhc3MgZnJvbSBDb2xsYXRpb24uCiogICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGEgcHJpdmF0ZSBSdWxlQmFzZWRDb2xsYXRvcihMb2NhbGUmKSBjb25zdHJ1Y3RvciwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgdXNlZCBieSBDb2xsYXRvcjo6Z2V0SW5zdGFuY2UoKS4gIEdlbmVyYWwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW4gdXAuICBNYWRlIHVzZSBvZiBVRXJyb3JDb2RlIHZhcmlhYmxlcyBjb25zaXN0ZW50LgoqICAyLzIwLzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBjbG9uZSwgb3BlcmF0b3I9PSwgb3BlcmF0b3IhPSwgb3BlcmF0b3I9LCBhbmQgY29weQoqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciBhbmQgZ2V0RHluYW1pY0NsYXNzSUQuCiogIDMvNS85NyAgICAgIGFsaXUgICAgICAgIENoYW5nZWQgY29tcGFjdGlvbiBjeWNsZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLiAgV2UKKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoZSBtYXhpbXVtIGFsbG93YWJsZSB2YWx1ZSB3aGljaCBpcyBrQmxvY2tDb3VudC4KKiAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZWQgZ2V0UnVsZXMoKSB0byBsb2FkIHJ1bGVzIGR5bmFtaWNhbGx5LiAgQ2hhbmdlZAoqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RGcm9tRmlsZSgpIGNhbGwgdG8gYWNjb21vZGF0ZSB0aGlzIChhZGRlZAoqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB3aGV0aGVyIGJpbmFyeSBsb2FkaW5nIGlzIHRvCiogICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UgcGxhY2UpLgoqIDA1LzA2Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBjaGVjay4KKiAgNi8yMC85NyAgICAgaGVsZW5hICAgICAgSmF2YSBjbGFzcyBuYW1lIGNoYW5nZS4KKiAgNi8yMy85NyAgICAgaGVsZW5hICAgICAgQWRkaW5nIGNvbW1lbnRzIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlLgoqIDA5LzAzLzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBjcmVhdGVDb2xsYXRpb25LZXlWYWx1ZXMoKS4KKiAwNi8yNi85OCAgICAgZXJtICAgICAgICAgQ2hhbmdlcyBmb3IgQ29sbGF0aW9uS2V5cyB1c2luZyBieXRlIGFycmF5cy4KKiAwOC8xMC85OCAgICAgZXJtICAgICAgICAgU3luY2hlZCB3aXRoIDEuMiB2ZXJzaW9uIG9mIFJ1bGVCYXNlZENvbGxhdG9yLmphdmEKKiAwNC8yMy85OSAgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBFRGVjb21wb3NpdGlvbk1vZGUsIG1lcmdlZCB3aXRoCiogICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZXI6OkVNb2RlCiogMDYvMTQvOTkgICAgIHN0ZXBoZW4gICAgIFJlbW92ZWQga1Jlc291cmNlQnVuZGxlU3VmZml4CiogMDYvMjIvOTkgICAgIHN0ZXBoZW4gICAgIEZpeGVkIGxvZ2ljIGluIGNvbnN0cnVjdEZyb21GaWxlKCkgc2luY2UgLmN0eAoqICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyBhcmUgbm8gbG9uZ2VyIHVzZWQuCiogMTEvMDIvOTkgICAgIGhlbGVuYSAgICAgIENvbGxhdG9yIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cy4gIFNwZWNpYWwgY2FzZQoqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgTk9fT1Agc2l0dWF0aW9ucy4KKiAxMS8xNy85OSAgICAgc3JsICAgICAgICAgTW9yZSBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMuIElubGluZWQgc29tZSBpbnRlcm5hbCBmdW5jdGlvbnMuCiogMTIvMTUvOTkgICAgIGFsaXUgICAgICAgIFVwZGF0ZSB0byBzdXBwb3J0IFRoYWkgY29sbGF0aW9uLiAgTW92ZSBOb3JtYWxpemVySXRlcmF0b3IKKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW1wbGVtZW50YXRpb24gZmlsZS4KKiAwMS8yOS8wMSAgICAgc3lud2VlICAgICAgTW9kaWZpZWQgaW50byBhIEMrKyB3cmFwcGVyIGNhbGxpbmcgQyBBUElzICh1Y29sLmgpCiovCgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKCiNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04KCiNpbmNsdWRlICJ1bmljb2RlL3RibGNvbGwuaCIKI2luY2x1ZGUgInVuaWNvZGUvY29sZWl0ci5oIgojaW5jbHVkZSAidW5pY29kZS9yZXNidW5kLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VzZXQuaCIKI2luY2x1ZGUgInVjb2xfaW1wLmgiCiNpbmNsdWRlICJ1cmVzaW1wLmgiCiNpbmNsdWRlICJ1aGFzaC5oIgojaW5jbHVkZSAiY21lbW9yeS5oIgojaW5jbHVkZSAiY3N0cmluZy5oIgoKLyogcHVibGljIFJ1bGVCYXNlZENvbGxhdG9yIGNvbnN0cnVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KClVfTkFNRVNQQUNFX0JFR0lOCgovKioKKiBDb3B5IGNvbnN0cnVjdG9yLCBhbGlhc2luZywgbm90IHdyaXRlLXRocm91Z2gKKi8KUnVsZUJhc2VkQ29sbGF0b3I6OlJ1bGVCYXNlZENvbGxhdG9yKGNvbnN0IFJ1bGVCYXNlZENvbGxhdG9yJiB0aGF0KSAKICAgOiBDb2xsYXRvcih0aGF0KQogICAsIGRhdGFJc093bmVkKEZBTFNFKQogICAsIGlzV3JpdGVUaHJvdWdoQWxpYXMoRkFMU0UpCiAgICwgdWNvbGxhdG9yKHRoYXQudWNvbGxhdG9yKQogICAsIHVydWxlc3RyaW5nKHRoYXQudXJ1bGVzdHJpbmcpCnsKfQoKUnVsZUJhc2VkQ29sbGF0b3I6OlJ1bGVCYXNlZENvbGxhdG9yKGNvbnN0IFVuaWNvZGVTdHJpbmcmIHJ1bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSXNPd25lZChGQUxTRSkKewogIGNvbnN0cnVjdChydWxlcywKICAgICAgICAgICAgVUNPTF9ERUZBVUxUX1NUUkVOR1RILAogICAgICAgICAgICBVQ09MX0RFRkFVTFQsCiAgICAgICAgICAgIHN0YXR1cyk7Cn0KClJ1bGVCYXNlZENvbGxhdG9yOjpSdWxlQmFzZWRDb2xsYXRvcihjb25zdCBVbmljb2RlU3RyaW5nJiBydWxlcywKICAgICAgICAgICAgICAgICAgICAgIEVDb2xsYXRpb25TdHJlbmd0aCBjb2xsYXRpb25TdHJlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykgOiBkYXRhSXNPd25lZChGQUxTRSkKewogIGNvbnN0cnVjdChydWxlcywKICAgICAgICAgICAgZ2V0VUNvbGxhdGlvblN0cmVuZ3RoKGNvbGxhdGlvblN0cmVuZ3RoKSwKICAgICAgICAgICAgVUNPTF9ERUZBVUxULAogICAgICAgICAgICBzdGF0dXMpOwp9CgpSdWxlQmFzZWRDb2xsYXRvcjo6UnVsZUJhc2VkQ29sbGF0b3IoY29uc3QgVW5pY29kZVN0cmluZyYgcnVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ29sQXR0cmlidXRlVmFsdWUgZGVjb21wb3NpdGlvbk1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJc093bmVkKEZBTFNFKQp7CiAgY29uc3RydWN0KHJ1bGVzLAogICAgICAgICAgICBVQ09MX0RFRkFVTFRfU1RSRU5HVEgsCiAgICAgICAgICAgIGRlY29tcG9zaXRpb25Nb2RlLAogICAgICAgICAgICBzdGF0dXMpOwp9CgpSdWxlQmFzZWRDb2xsYXRvcjo6UnVsZUJhc2VkQ29sbGF0b3IoY29uc3QgVW5pY29kZVN0cmluZyYgcnVsZXMsCiAgICAgICAgICAgICAgICAgICAgICBFQ29sbGF0aW9uU3RyZW5ndGggY29sbGF0aW9uU3RyZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICBVQ29sQXR0cmlidXRlVmFsdWUgZGVjb21wb3NpdGlvbk1vZGUsCiAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpIDogZGF0YUlzT3duZWQoRkFMU0UpCnsKICBjb25zdHJ1Y3QocnVsZXMsCiAgICAgICAgICAgIGdldFVDb2xsYXRpb25TdHJlbmd0aChjb2xsYXRpb25TdHJlbmd0aCksCiAgICAgICAgICAgIGRlY29tcG9zaXRpb25Nb2RlLAogICAgICAgICAgICBzdGF0dXMpOwp9Cgp2b2lkClJ1bGVCYXNlZENvbGxhdG9yOjpzZXRSdWxlU3RyaW5nRnJvbUNvbGxhdG9yKFVFcnJvckNvZGUmIHN0YXR1cykKewogIHVydWxlc3RyaW5nID0gTlVMTDsKICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpCiAgewogICAgaW50MzJfdCBsZW5ndGg7CiAgICBjb25zdCBVQ2hhciAqciA9IHVjb2xfZ2V0UnVsZXModWNvbGxhdG9yLCAmbGVuZ3RoKTsKICAKCWlmIChsZW5ndGggPiAwKSB7CiAgICAgICAgLy8gYWxpYXMgdGhlIHJ1bGVzIHN0cmluZwogICAgICAgIHVydWxlc3RyaW5nID0gbmV3IFVuaWNvZGVTdHJpbmcoVFJVRSwgciwgbGVuZ3RoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHVydWxlc3RyaW5nID0gbmV3IFVuaWNvZGVTdHJpbmcoKTsKICAgIH0KICAgIC8qIHRlc3QgZm9yIE5VTEwgKi8KICAgIGlmICh1cnVsZXN0cmluZyA9PSAwKSB7CiAgICAgICAgc3RhdHVzID0gVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKICAgICAgICByZXR1cm47CiAgICB9CiAgfQp9CgovLyBub3QgYWxpYXNpbmcsIG5vdCB3cml0ZS10aHJvdWdoCnZvaWQKUnVsZUJhc2VkQ29sbGF0b3I6OmNvbnN0cnVjdChjb25zdCBVbmljb2RlU3RyaW5nJiBydWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ29sQXR0cmlidXRlVmFsdWUgY29sbGF0aW9uU3RyZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIGRlY29tcG9zaXRpb25Nb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykKewogIHVydWxlc3RyaW5nID0gMDsKICB1Y29sbGF0b3IgPSB1Y29sX29wZW5SdWxlcyhydWxlcy5nZXRCdWZmZXIoKSwgcnVsZXMubGVuZ3RoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NpdGlvbk1vZGUsIGNvbGxhdGlvblN0cmVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzdGF0dXMpOwoKICBkYXRhSXNPd25lZCA9IFRSVUU7IC8vIHNpbmNlIHdlIG93biBhIGNvbGxhdG9yIG5vdywgd2UgbmVlZCB0byBnZXQgcmlkIG9mIGl0CiAgaXNXcml0ZVRocm91Z2hBbGlhcyA9IEZBTFNFOwoKICBzZXRSdWxlU3RyaW5nRnJvbUNvbGxhdG9yKHN0YXR1cyk7Cn0KCi8qIFJ1bGVCYXNlZENvbGxhdG9yIHB1YmxpYyBkZXN0cnVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpSdWxlQmFzZWRDb2xsYXRvcjo6flJ1bGVCYXNlZENvbGxhdG9yKCkKewogIGlmIChkYXRhSXNPd25lZCkKICB7CiAgICB1Y29sX2Nsb3NlKHVjb2xsYXRvcik7CiAgICBkZWxldGUgdXJ1bGVzdHJpbmc7CiAgfQogIHVjb2xsYXRvciA9IDA7CiAgdXJ1bGVzdHJpbmcgPSAwOwp9CgovKiBSdWxlQmFzZUNvbGxhdG9yIHB1YmxpYyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKVUJvb2wgUnVsZUJhc2VkQ29sbGF0b3I6Om9wZXJhdG9yPT0oY29uc3QgQ29sbGF0b3ImIHRoYXQpIGNvbnN0CnsKICAvKiBvbmx5IGNoZWNrcyBmb3IgYWRkcmVzcyBlcXVhbHMgaGVyZSAqLwogIGlmIChDb2xsYXRvcjo6b3BlcmF0b3I9PSh0aGF0KSkKICAgIHJldHVybiBUUlVFOwoKICBpZiAoZ2V0RHluYW1pY0NsYXNzSUQoKSAhPSB0aGF0LmdldER5bmFtaWNDbGFzc0lEKCkpCiAgICByZXR1cm4gRkFMU0U7ICAvKiBub3QgdGhlIHNhbWUgY2xhc3MgKi8KCiAgUnVsZUJhc2VkQ29sbGF0b3ImIHRoYXRBbGlhcyA9IChSdWxlQmFzZWRDb2xsYXRvciYpdGhhdDsKCiAgLy8gd2VpdjogdXNlIEMgZnVuY3Rpb24sIGNvbW1lbnRlZCBjb2RlIGJlbG93IGlzIHdyb25nCiAgcmV0dXJuIHVjb2xfZXF1YWxzKHRoaXMtPnVjb2xsYXRvciwgdGhhdEFsaWFzLnVjb2xsYXRvcik7CiAgLyoKICBzeW53ZWUgOiBvcmdpbmFsIGNvZGUgZG9lcyBub3QgY2hlY2sgZm9yIGRhdGEgY29tcGF0aWJpbGl0eQogICovCiAgLyoKICBpZiAodWNvbGxhdG9yICE9IHRoYXRBbGlhcy51Y29sbGF0b3IpCiAgICByZXR1cm4gRkFMU0U7CgogIHJldHVybiBUUlVFOwogICovCn0KCi8vIGFsaWFzaW5nLCBub3Qgd3JpdGUtdGhyb3VnaApSdWxlQmFzZWRDb2xsYXRvciYgUnVsZUJhc2VkQ29sbGF0b3I6Om9wZXJhdG9yPShjb25zdCBSdWxlQmFzZWRDb2xsYXRvciYgdGhhdCkKewogIGlmICh0aGlzICE9ICZ0aGF0KQogIHsKICAgIGlmIChkYXRhSXNPd25lZCkKICAgIHsKICAgICAgdWNvbF9jbG9zZSh1Y29sbGF0b3IpOwogICAgICB1Y29sbGF0b3IgPSBOVUxMOwogICAgICBkZWxldGUgdXJ1bGVzdHJpbmc7CiAgICB9CgogICAgZGF0YUlzT3duZWQgPSBGQUxTRTsKCWlzV3JpdGVUaHJvdWdoQWxpYXMgPSBGQUxTRTsKICAgIHVjb2xsYXRvciA9IHRoYXQudWNvbGxhdG9yOwogICAgdXJ1bGVzdHJpbmcgPSB0aGF0LnVydWxlc3RyaW5nOwogIH0KICByZXR1cm4gKnRoaXM7Cn0KCi8vIGFsaWFzaW5nLCBub3Qgd3JpdGUtdGhyb3VnaApDb2xsYXRvciogUnVsZUJhc2VkQ29sbGF0b3I6OmNsb25lKCkgY29uc3QKewogIHJldHVybiBuZXcgUnVsZUJhc2VkQ29sbGF0b3IoKnRoaXMpOwp9CgpDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IqIFJ1bGVCYXNlZENvbGxhdG9yOjpjcmVhdGVDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBVbmljb2RlU3RyaW5nJiBzb3VyY2UpIGNvbnN0CnsKICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgKnJlc3VsdCA9IG5ldyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3Ioc291cmNlLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwogIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewogICAgZGVsZXRlIHJlc3VsdDsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqCiogQ3JlYXRlIGEgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIG9iamVjdCB0aGF0IHdpbGwgaXRlcmF0ZSBvdmVyIHRoZQoqIGVsZW1lbnRzIGluIGEgc3RyaW5nLCB1c2luZyB0aGUgY29sbGF0aW9uIHJ1bGVzIGRlZmluZWQgaW4gdGhpcwoqIFJ1bGVCYXNlZENvbGxhdG9yCiovCkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciogUnVsZUJhc2VkQ29sbGF0b3I6OmNyZWF0ZUNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgQ2hhcmFjdGVySXRlcmF0b3ImIHNvdXJjZSkgY29uc3QKewogIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciAqcmVzdWx0ID0gbmV3IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcihzb3VyY2UsIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CgogIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewogICAgZGVsZXRlIHJlc3VsdDsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqCiogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sbGF0b3IncyBydWxlcy4gVGhlIHN0cmluZyBjYW4KKiBsYXRlciBiZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSBVbmljb2RlU3RyaW5nIGFyZ3VtZW50LAoqIHdoaWNoIHdpbGwgY29uc3RydWN0IGEgY29sbGF0b3IgdGhhdCdzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCiogWW91IGNhbiBhbHNvIGFsbG93IHVzZXJzIHRvIGVkaXQgdGhlIHN0cmluZyBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIGNvbGxhdGlvbgoqIGRhdGEsIG9yIHlvdSBjYW4gcHJpbnQgaXQgb3V0IGZvciBpbnNwZWN0aW9uLCBvciB3aGF0ZXZlci4KKi8KY29uc3QgVW5pY29kZVN0cmluZyYgUnVsZUJhc2VkQ29sbGF0b3I6OmdldFJ1bGVzKCkgY29uc3QKewogICAgcmV0dXJuICgqdXJ1bGVzdHJpbmcpOwp9Cgp2b2lkIFJ1bGVCYXNlZENvbGxhdG9yOjpnZXRSdWxlcyhVQ29sUnVsZU9wdGlvbiBkZWx0YSwgVW5pY29kZVN0cmluZyAmYnVmZmVyKQp7CiAgICBpbnQzMl90IHJ1bGVzaXplID0gdWNvbF9nZXRSdWxlc0V4KHVjb2xsYXRvciwgZGVsdGEsIE5VTEwsIC0xKTsKCiAgICBpZiAocnVsZXNpemUgPiAwKSB7CiAgICAgICAgVUNoYXIgKnJ1bGVzID0gKFVDaGFyKikgdXBydl9tYWxsb2MoIHNpemVvZihVQ2hhcikgKiAocnVsZXNpemUpICk7CiAgICAgICAgaWYocnVsZXMgIT0gTlVMTCkgewogICAgICAgICAgdWNvbF9nZXRSdWxlc0V4KHVjb2xsYXRvciwgZGVsdGEsIHJ1bGVzLCBydWxlc2l6ZSk7CiAgICAgICAgICBidWZmZXIuc2V0VG8ocnVsZXMsIHJ1bGVzaXplKTsKICAgICAgICAgIHVwcnZfZnJlZShydWxlcyk7CiAgICAgICAgfSBlbHNlIHsgLy8gY291bGRuJ3QgYWxsb2NhdGUgCiAgICAgICAgICBidWZmZXIucmVtb3ZlKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgYnVmZmVyLnJlbW92ZSgpOwogICAgfQp9CgpVbmljb2RlU2V0ICoKUnVsZUJhc2VkQ29sbGF0b3I6OmdldFRhaWxvcmVkU2V0KFVFcnJvckNvZGUgJnN0YXR1cykgY29uc3QKewogIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgcmV0dXJuIChVbmljb2RlU2V0ICopdWNvbF9nZXRUYWlsb3JlZFNldCh0aGlzLT51Y29sbGF0b3IsICZzdGF0dXMpOwp9CgoKdm9pZCBSdWxlQmFzZWRDb2xsYXRvcjo6Z2V0VmVyc2lvbihVVmVyc2lvbkluZm8gdmVyc2lvbkluZm8pIGNvbnN0CnsKICAgIGlmICh2ZXJzaW9uSW5mbyE9TlVMTCl7CiAgICAgICAgdWNvbF9nZXRWZXJzaW9uKHVjb2xsYXRvciwgdmVyc2lvbkluZm8pOwogICAgfQp9CgpDb2xsYXRvcjo6RUNvbXBhcmlzb25SZXN1bHQgUnVsZUJhc2VkQ29sbGF0b3I6OmNvbXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCkgY29uc3QKewogIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogIHJldHVybiBnZXRFQ29tcGFyaXNvblJlc3VsdChjb21wYXJlKHNvdXJjZS5nZXRCdWZmZXIoKSwgdXBydl9taW4obGVuZ3RoLHNvdXJjZS5sZW5ndGgoKSksIHRhcmdldC5nZXRCdWZmZXIoKSwgdXBydl9taW4obGVuZ3RoLHRhcmdldC5sZW5ndGgoKSksIHN0YXR1cykpOwp9CgpVQ29sbGF0aW9uUmVzdWx0IFJ1bGVCYXNlZENvbGxhdG9yOjpjb21wYXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlU3RyaW5nJiB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgJnN0YXR1cykgY29uc3QKewogIHJldHVybiBjb21wYXJlKHNvdXJjZS5nZXRCdWZmZXIoKSwgdXBydl9taW4obGVuZ3RoLHNvdXJjZS5sZW5ndGgoKSksIHRhcmdldC5nZXRCdWZmZXIoKSwgdXBydl9taW4obGVuZ3RoLHRhcmdldC5sZW5ndGgoKSksIHN0YXR1cyk7Cn0KCkNvbGxhdG9yOjpFQ29tcGFyaXNvblJlc3VsdCBSdWxlQmFzZWRDb2xsYXRvcjo6Y29tcGFyZShjb25zdCBVQ2hhciogc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0YXJnZXRMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdAp7CiAgcmV0dXJuICBnZXRFQ29tcGFyaXNvblJlc3VsdCh1Y29sX3N0cmNvbGwodWNvbGxhdG9yLCBzb3VyY2UsIHNvdXJjZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIHRhcmdldExlbmd0aCkpOwp9CgpVQ29sbGF0aW9uUmVzdWx0IFJ1bGVCYXNlZENvbGxhdG9yOjpjb21wYXJlKGNvbnN0IFVDaGFyKiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyKiB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldExlbmd0aCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICZzdGF0dXMpIGNvbnN0CnsKICBpZihVX1NVQ0NFU1Moc3RhdHVzKSkgewogICAgcmV0dXJuICB1Y29sX3N0cmNvbGwodWNvbGxhdG9yLCBzb3VyY2UsIHNvdXJjZUxlbmd0aCwgdGFyZ2V0LCB0YXJnZXRMZW5ndGgpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gVUNPTF9FUVVBTDsKICB9Cn0KCi8qKgoqIENvbXBhcmUgdHdvIHN0cmluZ3MgdXNpbmcgdGhpcyBjb2xsYXRvcgoqLwpDb2xsYXRvcjo6RUNvbXBhcmlzb25SZXN1bHQgUnVsZUJhc2VkQ29sbGF0b3I6OmNvbXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgdGFyZ2V0KSBjb25zdAp7CiAgcmV0dXJuIGdldEVDb21wYXJpc29uUmVzdWx0KHVjb2xfc3RyY29sbCh1Y29sbGF0b3IsIHNvdXJjZS5nZXRCdWZmZXIoKSwgc291cmNlLmxlbmd0aCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldEJ1ZmZlcigpLCB0YXJnZXQubGVuZ3RoKCkpKTsKfQoKVUNvbGxhdGlvblJlc3VsdCBSdWxlQmFzZWRDb2xsYXRvcjo6Y29tcGFyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlU3RyaW5nJiB0YXJnZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICZzdGF0dXMpIGNvbnN0CnsKICBpZihVX1NVQ0NFU1Moc3RhdHVzKSkgewogICAgcmV0dXJuIHVjb2xfc3RyY29sbCh1Y29sbGF0b3IsIHNvdXJjZS5nZXRCdWZmZXIoKSwgc291cmNlLmxlbmd0aCgpLCAKCQkJdGFyZ2V0LmdldEJ1ZmZlcigpLCB0YXJnZXQubGVuZ3RoKCkpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gVUNPTF9FUVVBTDsKICB9Cn0KCi8qKgoqIFJldHJpZXZlIGEgY29sbGF0aW9uIGtleSBmb3IgdGhlIHNwZWNpZmllZCBzdHJpbmcuIFRoZSBrZXkgY2FuIGJlIGNvbXBhcmVkCiogd2l0aCBvdGhlciBjb2xsYXRpb24ga2V5cyB1c2luZyBhIGJpdHdpc2UgY29tcGFyaXNvbiAoZS5nLiBtZW1jbXApIHRvIGZpbmQKKiB0aGUgb3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBzb3VyY2Ugc3RyaW5ncy4gVGhpcyBpcyBoYW5keSB3aGVuIGRvaW5nIGEKKiBzb3J0LCB3aGVyZSBlYWNoIHNvcnQga2V5IG11c3QgYmUgY29tcGFyZWQgbWFueSB0aW1lcy4KKgoqIFRoZSBiYXNpYyBhbGdvcml0aG0gaGVyZSBpcyB0byBmaW5kIGFsbCBvZiB0aGUgY29sbGF0aW9uIGVsZW1lbnRzIGZvciBlYWNoCiogY2hhcmFjdGVyIGluIHRoZSBzb3VyY2Ugc3RyaW5nLCBjb252ZXJ0IHRoZW0gdG8gYW4gQVNDSUkgcmVwcmVzZW50YXRpb24sIGFuZAoqIHB1dCB0aGVtIGludG8gdGhlIGNvbGxhdGlvbiBrZXkuICBCdXQgaXQncyB0cmlja2llciB0aGFuIHRoYXQuIEVhY2gKKiBjb2xsYXRpb24gZWxlbWVudCBpbiBhIHN0cmluZyBoYXMgdGhyZWUgY29tcG9uZW50czogcHJpbWFyeSAoJ0EnIHZzICdCJyksCiogc2Vjb25kYXJ5ICgndScgdnMgJ/wnKSwgYW5kIHRlcnRpYXJ5ICgnQScgdnMgJ2EnKSwgYW5kIGEgcHJpbWFyeSBkaWZmZXJlbmNlCiogYXQgdGhlIGVuZCBvZiBhIHN0cmluZyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYSBzZWNvbmRhcnkgb3IgdGVydGlhcnkKKiBkaWZmZXJlbmNlIGVhcmxpZXIgaW4gdGhlIHN0cmluZy4KKgoqIFRvIGFjY291bnQgZm9yIHRoaXMsIHdlIHB1dCBhbGwgb2YgdGhlIHByaW1hcnkgb3JkZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YKKiB0aGUgc3RyaW5nLCBmb2xsb3dlZCBieSB0aGUgc2Vjb25kYXJ5IGFuZCB0ZXJ0aWFyeSBvcmRlcnMuIEVhY2ggc2V0IG9mCiogb3JkZXJzIGlzIHRlcm1pbmF0ZWQgYnkgbnVsbHMgc28gdGhhdCBhIGtleSBmb3IgYSBzdHJpbmcgd2hpY2ggaXMgYSBpbml0aWFsCiogc3Vic3RyaW5nIG9mIGFub3RoZXIga2V5IHdpbGwgY29tcGFyZSBsZXNzIHdpdGhvdXQgYW55IHNwZWNpYWwgY2FzZS4KKgoqIEhlcmUncyBhIGh5cG90aGV0aWNhbCBleGFtcGxlLCB3aXRoIHRoZSBjb2xsYXRpb24gZWxlbWVudCByZXByZXNlbnRlZCBhcyBhCiogdGhyZWUtZGlnaXQgbnVtYmVyLCBvbmUgZGlnaXQgZm9yIHByaW1hcnksIG9uZSBmb3Igc2Vjb25kYXJ5LCBldGMuCioKKiBTdHJpbmc6ICAgICAgICAgICAgICBBICAgICBhICAgICBCICAgIMkKKiBDb2xsYXRpb24gRWxlbWVudHM6IDEwMSAgIDEwMCAgIDIwMSAgNTExCiogQ29sbGF0aW9uIEtleTogICAgICAxMTI1PG51bGw+MDAwMTxudWxsPjEwMTE8bnVsbD4KKgoqIFRvIG1ha2UgdGhpbmdzIGV2ZW4gdHJpY2tpZXIsIHNlY29uZGFyeSBkaWZmZXJlbmNlcyAoYWNjZW50IG1hcmtzKSBhcmUKKiBjb21wYXJlZCBzdGFydGluZyBhdCB0aGUgKmVuZCogb2YgdGhlIHN0cmluZyBpbiBsYW5ndWFnZXMgd2l0aCBGcmVuY2gKKiBzZWNvbmRhcnkgb3JkZXJpbmcuIEJ1dCB3aGVuIGNvbXBhcmluZyB0aGUgYWNjZW50IG1hcmtzIG9uIGEgc2luZ2xlIGJhc2UKKiBjaGFyYWN0ZXIsIHRoZXkgYXJlIGNvbXBhcmVkIGZyb20gdGhlIGJlZ2lubmluZy4gVG8gaGFuZGxlIHRoaXMsIHdlIHJldmVyc2UKKiBhbGwgb2YgdGhlIGFjY2VudHMgdGhhdCBiZWxvbmcgdG8gZWFjaCBiYXNlIGNoYXJhY3RlciwgdGhlbiB3ZSByZXZlcnNlIHRoZQoqIGVudGlyZSBzdHJpbmcgb2Ygc2Vjb25kYXJ5IG9yZGVyaW5ncyBhdCB0aGUgZW5kLgoqLwpDb2xsYXRpb25LZXkmIFJ1bGVCYXNlZENvbGxhdG9yOjpnZXRDb2xsYXRpb25LZXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhdGlvbktleSYgc29ydGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpIGNvbnN0CnsKICByZXR1cm4gZ2V0Q29sbGF0aW9uS2V5KHNvdXJjZS5nZXRCdWZmZXIoKSwgc291cmNlLmxlbmd0aCgpLCBzb3J0a2V5LCBzdGF0dXMpOwp9CgpDb2xsYXRpb25LZXkmIFJ1bGVCYXNlZENvbGxhdG9yOjpnZXRDb2xsYXRpb25LZXkoY29uc3QgVUNoYXIqIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uS2V5JiBzb3J0a2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdAp7CiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogIHsKICAgIHJldHVybiBzb3J0a2V5LnNldFRvQm9ndXMoKTsKICB9CgogIGlmICgoIXNvdXJjZSkgfHwgKHNvdXJjZUxlbiA9PSAwKSkgewogICAgcmV0dXJuIHNvcnRrZXkucmVzZXQoKTsKICB9CgogIHVpbnQ4X3QgKnJlc3VsdDsKICBpbnQzMl90IHJlc3VsdExlbiA9IHVjb2xfZ2V0U29ydEtleVdpdGhBbGxvY2F0aW9uKHVjb2xsYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgc291cmNlTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogIHNvcnRrZXkuYWRvcHQocmVzdWx0LCByZXN1bHRMZW4pOwogIHJldHVybiBzb3J0a2V5Owp9CgovKioKICogUmV0dXJuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgZXhwYW5zaW9uIHNlcXVlbmNlcyB0aGF0IGVuZCB3aXRoIHRoZQogKiBzcGVjaWZpZWQgY29tcGFyaXNvbiBvcmRlci4KICogQHBhcmFtIG9yZGVyIGEgY29sbGF0aW9uIG9yZGVyIHJldHVybmVkIGJ5IHByZXZpb3VzIG9yIG5leHQuCiAqIEByZXR1cm4gdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFueSBleHBhbnNpb24gc2V1ZW5jZXMgZW5kaW5nIHdpdGggdGhlCiAqICAgICAgICAgc3BlY2lmaWVkIG9yZGVyIG9yIDEgaWYgY29sbGF0aW9uIG9yZGVyIGRvZXMgbm90IG9jY3VyIGF0IHRoZSBlbmQgb2YgYW55CiAqICAgICAgICAgZXhwYW5zaW9uIHNlcXVlbmNlLgogKiBAc2VlIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciNnZXRNYXhFeHBhbnNpb24KICovCmludDMyX3QgUnVsZUJhc2VkQ29sbGF0b3I6OmdldE1heEV4cGFuc2lvbihpbnQzMl90IG9yZGVyKSBjb25zdAp7CiAgdWludDhfdCByZXN1bHQ7CiAgVUNPTF9HRVRNQVhFWFBBTlNJT04odWNvbGxhdG9yLCAodWludDMyX3Qpb3JkZXIsIHJlc3VsdCk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKdWludDhfdCogUnVsZUJhc2VkQ29sbGF0b3I6OmNsb25lUnVsZURhdGEoaW50MzJfdCAmbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKQp7CiAgcmV0dXJuIHVjb2xfY2xvbmVSdWxlRGF0YSh1Y29sbGF0b3IsICZsZW5ndGgsICZzdGF0dXMpOwp9Cgp2b2lkIFJ1bGVCYXNlZENvbGxhdG9yOjpzZXRBdHRyaWJ1dGUoVUNvbEF0dHJpYnV0ZSBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKQp7CiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogICAgcmV0dXJuOwogIGNoZWNrT3duZWQoKTsKICB1Y29sX3NldEF0dHJpYnV0ZSh1Y29sbGF0b3IsIGF0dHIsIHZhbHVlLCAmc3RhdHVzKTsKfQoKVUNvbEF0dHJpYnV0ZVZhbHVlIFJ1bGVCYXNlZENvbGxhdG9yOjpnZXRBdHRyaWJ1dGUoVUNvbEF0dHJpYnV0ZSBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICZzdGF0dXMpCnsKICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpCiAgICByZXR1cm4gVUNPTF9ERUZBVUxUOwogIHJldHVybiB1Y29sX2dldEF0dHJpYnV0ZSh1Y29sbGF0b3IsIGF0dHIsICZzdGF0dXMpOwp9Cgp1aW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6c2V0VmFyaWFibGVUb3AoY29uc3QgVUNoYXIgKnZhclRvcCwgaW50MzJfdCBsZW4sIFVFcnJvckNvZGUgJnN0YXR1cykgewoJY2hlY2tPd25lZCgpOwoJcmV0dXJuIHVjb2xfc2V0VmFyaWFibGVUb3AodWNvbGxhdG9yLCB2YXJUb3AsIGxlbiwgJnN0YXR1cyk7Cn0KCnVpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpzZXRWYXJpYWJsZVRvcChjb25zdCBVbmljb2RlU3RyaW5nIHZhclRvcCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CgljaGVja093bmVkKCk7CglyZXR1cm4gdWNvbF9zZXRWYXJpYWJsZVRvcCh1Y29sbGF0b3IsIHZhclRvcC5nZXRCdWZmZXIoKSwgdmFyVG9wLmxlbmd0aCgpLCAmc3RhdHVzKTsKfQoKdm9pZCBSdWxlQmFzZWRDb2xsYXRvcjo6c2V0VmFyaWFibGVUb3AoY29uc3QgdWludDMyX3QgdmFyVG9wLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKCWNoZWNrT3duZWQoKTsKCXVjb2xfcmVzdG9yZVZhcmlhYmxlVG9wKHVjb2xsYXRvciwgdmFyVG9wLCAmc3RhdHVzKTsKfQoKdWludDMyX3QgUnVsZUJhc2VkQ29sbGF0b3I6OmdldFZhcmlhYmxlVG9wKFVFcnJvckNvZGUgJnN0YXR1cykgY29uc3QgewogIHJldHVybiB1Y29sX2dldFZhcmlhYmxlVG9wKHVjb2xsYXRvciwgJnN0YXR1cyk7Cn0KCkNvbGxhdG9yKiBSdWxlQmFzZWRDb2xsYXRvcjo6c2FmZUNsb25lKHZvaWQpCnsKICBVRXJyb3JDb2RlIGludFN0YXR1cyA9IFVfWkVST19FUlJPUjsKICBpbnQzMl90IGJ1ZmZlcnNpemUgPSBVX0NPTF9TQUZFQ0xPTkVfQlVGRkVSU0laRTsKICBVQ29sbGF0b3IgKnVjb2wgPSB1Y29sX3NhZmVDbG9uZSh1Y29sbGF0b3IsIE5VTEwsICZidWZmZXJzaXplLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50U3RhdHVzKTsKICBpZiAoVV9GQUlMVVJFKGludFN0YXR1cykpIHsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgVW5pY29kZVN0cmluZyAqciA9IG5ldyBVbmljb2RlU3RyaW5nKCp1cnVsZXN0cmluZyk7CiAgUnVsZUJhc2VkQ29sbGF0b3IgKnJlc3VsdCA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcih1Y29sLCByKTsKICByZXN1bHQtPmRhdGFJc093bmVkID0gVFJVRTsKICByZXN1bHQtPmlzV3JpdGVUaHJvdWdoQWxpYXMgPSBGQUxTRTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoKCmludDMyX3QgUnVsZUJhc2VkQ29sbGF0b3I6OmdldFNvcnRLZXkoY29uc3QgVW5pY29kZVN0cmluZyYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJlc3VsdCwgaW50MzJfdCByZXN1bHRMZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QKewogIHJldHVybiB1Y29sX2dldFNvcnRLZXkodWNvbGxhdG9yLCBzb3VyY2UuZ2V0QnVmZmVyKCksIHNvdXJjZS5sZW5ndGgoKSwgcmVzdWx0LCByZXN1bHRMZW5ndGgpOwp9CgppbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpnZXRTb3J0S2V5KGNvbnN0IFVDaGFyICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VMZW5ndGgsIHVpbnQ4X3QgKnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdExlbmd0aCkgY29uc3QKewogIHJldHVybiB1Y29sX2dldFNvcnRLZXkodWNvbGxhdG9yLCBzb3VyY2UsIHNvdXJjZUxlbmd0aCwgcmVzdWx0LCByZXN1bHRMZW5ndGgpOwp9CgpDb2xsYXRvcjo6RUNvbGxhdGlvblN0cmVuZ3RoIFJ1bGVCYXNlZENvbGxhdG9yOjpnZXRTdHJlbmd0aCh2b2lkKSBjb25zdAp7CiAgVUVycm9yQ29kZSBpbnRTdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgcmV0dXJuIGdldEVDb2xsYXRpb25TdHJlbmd0aCh1Y29sX2dldEF0dHJpYnV0ZSh1Y29sbGF0b3IsIFVDT0xfU1RSRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50U3RhdHVzKSk7Cn0KCnZvaWQgUnVsZUJhc2VkQ29sbGF0b3I6OnNldFN0cmVuZ3RoKEVDb2xsYXRpb25TdHJlbmd0aCBuZXdTdHJlbmd0aCkKewogIGNoZWNrT3duZWQoKTsKICBVRXJyb3JDb2RlIGludFN0YXR1cyA9IFVfWkVST19FUlJPUjsKICBVQ29sbGF0aW9uU3RyZW5ndGggc3RyZW5ndGggPSBnZXRVQ29sbGF0aW9uU3RyZW5ndGgobmV3U3RyZW5ndGgpOwogIHVjb2xfc2V0QXR0cmlidXRlKHVjb2xsYXRvciwgVUNPTF9TVFJFTkdUSCwgc3RyZW5ndGgsICZpbnRTdGF0dXMpOwp9CgovKioKKiBDcmVhdGUgYSBoYXNoIGNvZGUgZm9yIHRoaXMgY29sbGF0aW9uLiBKdXN0IGhhc2ggdGhlIG1haW4gcnVsZSB0YWJsZSAtLSB0aGF0Ciogc2hvdWxkIGJlIGdvb2QgZW5vdWdoIGZvciBhbG1vc3QgYW55IHVzZS4KKi8KaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6aGFzaENvZGUoKSBjb25zdAp7CiAgaW50MzJfdCBsZW5ndGg7CiAgY29uc3QgVUNoYXIgKnJ1bGVzID0gdWNvbF9nZXRSdWxlcyh1Y29sbGF0b3IsICZsZW5ndGgpOwogIHJldHVybiB1aGFzaF9oYXNoVUNoYXJzTihydWxlcywgbGVuZ3RoKTsKfQoKLyoqCiogcmV0dXJuIHRoZSBsb2NhbGUgb2YgdGhpcyBjb2xsYXRvcgoqLwpjb25zdCBMb2NhbGUgUnVsZUJhc2VkQ29sbGF0b3I6OmdldExvY2FsZShVTG9jRGF0YUxvY2FsZVR5cGUgdHlwZSwgVUVycm9yQ29kZSAmc3RhdHVzKSBjb25zdCB7CiAgY29uc3QgY2hhciAqcmVzdWx0ID0gdWNvbF9nZXRMb2NhbGUodWNvbGxhdG9yLCB0eXBlLCAmc3RhdHVzKTsKICBpZihyZXN1bHQgPT0gTlVMTCkgewogICAgTG9jYWxlIHJlcygiIik7CiAgICByZXMuc2V0VG9Cb2d1cygpOwogICAgcmV0dXJuIHJlczsKICB9IGVsc2UgewogICAgcmV0dXJuIExvY2FsZShyZXN1bHQpOwogIH0KfQoKdm9pZApSdWxlQmFzZWRDb2xsYXRvcjo6c2V0TG9jYWxlcyhjb25zdCBMb2NhbGUmIHJlcXVlc3RlZExvY2FsZSwgY29uc3QgTG9jYWxlJiB2YWxpZExvY2FsZSkgewoJY2hlY2tPd25lZCgpOwogICAgc2l6ZV90IHJsZW4gPSB1cHJ2X3N0cmxlbihyZXF1ZXN0ZWRMb2NhbGUuZ2V0TmFtZSgpKTsKICAgIGNoYXIqIHJsb2MgID0gKGNoYXIgKil1cHJ2X21hbGxvYygocmxlbisxKSpzaXplb2YoY2hhcikpOwogICAgaWYgKHJsb2MpIHsKICAgICAgICB1cHJ2X3N0cmNweShybG9jLCByZXF1ZXN0ZWRMb2NhbGUuZ2V0TmFtZSgpKTsKICAgICAgICBzaXplX3QgdmxlbiA9IHVwcnZfc3RybGVuKHZhbGlkTG9jYWxlLmdldE5hbWUoKSk7CiAgICAgICAgY2hhciogdmxvYyA9IChjaGFyKil1cHJ2X21hbGxvYygodmxlbisxKSpzaXplb2YoY2hhcikpOwogICAgICAgIGlmICh2bG9jKSB7CiAgICAgICAgICAgIHVwcnZfc3RyY3B5KHZsb2MsIHZhbGlkTG9jYWxlLmdldE5hbWUoKSk7CiAgICAgICAgICAgIHVjb2xfc2V0UmVxVmFsaWRMb2NhbGVzKHVjb2xsYXRvciwgcmxvYywgdmxvYyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdXBydl9mcmVlKHJsb2MpOwogICAgfQp9CgovLyBSdWxlQmFzZUNvbGxhdG9yTmV3IHByaXZhdGUgY29uc3RydWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUnVsZUJhc2VkQ29sbGF0b3I6OlJ1bGVCYXNlZENvbGxhdG9yKCkgCiAgOiBkYXRhSXNPd25lZChGQUxTRSksIGlzV3JpdGVUaHJvdWdoQWxpYXMoRkFMU0UpLCB1Y29sbGF0b3IoMCksIHVydWxlc3RyaW5nKDApCnsKfQoKUnVsZUJhc2VkQ29sbGF0b3I6OlJ1bGVCYXNlZENvbGxhdG9yKFVDb2xsYXRvciAqY29sbGF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nICpydWxlKQogIDogZGF0YUlzT3duZWQoRkFMU0UpLCBpc1dyaXRlVGhyb3VnaEFsaWFzKEZBTFNFKSwgdXJ1bGVzdHJpbmcoMCkgCnsKICB1Y29sbGF0b3IgPSBjb2xsYXRvcjsKICB1cnVsZXN0cmluZyA9IHJ1bGU7Cn0KClJ1bGVCYXNlZENvbGxhdG9yOjpSdWxlQmFzZWRDb2xsYXRvcihjb25zdCBMb2NhbGUmIGRlc2lyZWRMb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJc093bmVkKEZBTFNFKSwgdWNvbGxhdG9yKDApLCB1cnVsZXN0cmluZygwKQp7CiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogICAgcmV0dXJuOwoKICAvKgogIFRyeSB0byBsb2FkLCBpbiBvcmRlcjoKICAgMS4gVGhlIGRlc2lyZWQgbG9jYWxlJ3MgY29sbGF0aW9uLgogICAyLiBBIGZhbGxiYWNrIG9mIHRoZSBkZXNpcmVkIGxvY2FsZS4KICAgMy4gVGhlIGRlZmF1bHQgbG9jYWxlJ3MgY29sbGF0aW9uLgogICA0LiBBIGZhbGxiYWNrIG9mIHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgNS4gVGhlIGRlZmF1bHQgY29sbGF0aW9uIHJ1bGVzLCB3aGljaCBjb250YWlucyBlbl9VUyBjb2xsYXRpb24gcnVsZXMuCgogICBUbyByZWl0ZXJhdGUsIHdlIHRyeToKICAgU3BlY2lmaWM6CiAgICBsYW5ndWFnZStjb3VudHJ5K3ZhcmlhbnQKICAgIGxhbmd1YWdlK2NvdW50cnkKICAgIGxhbmd1YWdlCiAgIERlZmF1bHQ6CiAgICBsYW5ndWFnZStjb3VudHJ5K3ZhcmlhbnQKICAgIGxhbmd1YWdlK2NvdW50cnkKICAgIGxhbmd1YWdlCiAgIFJvb3Q6IChha2EgREVGQVVMVFJVTEVTKQogICBzdGVwcyAxLTUgYXJlIGhhbmRsZWQgYnkgcmVzb3VyY2UgYnVuZGxlIGZhbGxiYWNrIG1lY2hhbmlzbS4KICAgaG93ZXZlciwgaW4gYSB2ZXJ5IHVucHJvYmFibGUgc2l0dWF0aW9uIHRoYXQgbm8gcmVzb3VyY2UgYnVuZGxlCiAgIGRhdGEgZXhpc3RzLCBzdGVwIDUgaXMgcmVwZWF0ZWQgd2l0aCBoYXJkY29kZWQgZGVmYXVsdCBydWxlcy4KICAqLwoKICBzZXRVQ29sbGF0b3IoZGVzaXJlZExvY2FsZSwgc3RhdHVzKTsKCiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogIHsKICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKCiAgICBzZXRVQ29sbGF0b3Ioa1Jvb3RMb2NhbGVOYW1lLCBzdGF0dXMpOwogICAgaWYgKHN0YXR1cyA9PSBVX1pFUk9fRVJST1IpIHsKICAgICAgICBzdGF0dXMgPSBVX1VTSU5HX0RFRkFVTFRfV0FSTklORzsKICAgIH0KICB9CgogIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkKICB7CiAgICBpbnQzMl90IGxlbmd0aDsKICAgIGNvbnN0IFVDaGFyICpyID0gdWNvbF9nZXRSdWxlcyh1Y29sbGF0b3IsICZsZW5ndGgpOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAvLyBhbGlhcyB0aGUgcnVsZXMgc3RyaW5nCiAgICAgICAgdXJ1bGVzdHJpbmcgPSBuZXcgVW5pY29kZVN0cmluZyhUUlVFLCByLCBsZW5ndGgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdXJ1bGVzdHJpbmcgPSBuZXcgVW5pY29kZVN0cmluZygpOwogICAgfQogICAgLyogdGVzdCBmb3IgTlVMTCAqLwogICAgaWYgKHVydWxlc3RyaW5nID09IDApIHsKICAgICAgICBzdGF0dXMgPSBVX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGRhdGFJc093bmVkID0gVFJVRTsKCWlzV3JpdGVUaHJvdWdoQWxpYXMgPSBGQUxTRTsKICB9CgogIHJldHVybjsKfQoKdm9pZCAKUnVsZUJhc2VkQ29sbGF0b3I6OnNldFVDb2xsYXRvcihjb25zdCBjaGFyICpsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKQp7CiAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKQogICAgcmV0dXJuOwogIGlmICh1Y29sbGF0b3IgJiYgZGF0YUlzT3duZWQpCiAgICB1Y29sX2Nsb3NlKHVjb2xsYXRvcik7CiAgdWNvbGxhdG9yID0gdWNvbF9vcGVuX2ludGVybmFsKGxvY2FsZSwgJnN0YXR1cyk7CiAgZGF0YUlzT3duZWQgPSBUUlVFOwogIGlzV3JpdGVUaHJvdWdoQWxpYXMgPSBGQUxTRTsKfQoKCnZvaWQKUnVsZUJhc2VkQ29sbGF0b3I6OmNoZWNrT3duZWQoKSB7CglpZiAoIShkYXRhSXNPd25lZCB8fCBpc1dyaXRlVGhyb3VnaEFsaWFzKSkgewoJCVVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwoJCXVjb2xsYXRvciA9IHVjb2xfc2FmZUNsb25lKHVjb2xsYXRvciwgTlVMTCwgTlVMTCwgJnN0YXR1cyk7CgkJc2V0UnVsZVN0cmluZ0Zyb21Db2xsYXRvcihzdGF0dXMpOwoJCWRhdGFJc093bmVkID0gVFJVRTsKCQlpc1dyaXRlVGhyb3VnaEFsaWFzID0gRkFMU0U7Cgl9Cn0KCi8qIFJ1bGVCYXNlZENvbGxhdG9yIHByaXZhdGUgZGF0YSBtZW1iZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBUT0RPOgogKiBUaGVzZSBzaG91bGQgcHJvYmFibHkgYmUgZW51bXMgKDw9MHhmZmZmKSBvciAjZGVmaW5lcyAoPjB4ZmZmZikKICogZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KICogSW5jbHVkZSB1Y29sX2ltcC5oIGFuZCB1c2UgaXRzIGNvbnN0YW50cyBpZiBwb3NzaWJsZS4KICogT25seSB1c2VkIGluIGNvbGVpdHIuaD8hCiAqIFJlbW92ZSBmcm9tIGhlcmUhCiAqLwoKLyogbmVlZCBsb29rIHVwIGluIC5jb21taXQoKSAqLwpjb25zdCBpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpDSEFSSU5ERVggPSAweDcwMDAwMDAwOwovKiBFeHBhbmQgaW5kZXggZm9sbG93cyAqLwpjb25zdCBpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpFWFBBTkRDSEFSSU5ERVggPSAweDdFMDAwMDAwOwovKiBjb250cmFjdCBpbmRleGVzIGZvbGxvd3MgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6Q09OVFJBQ1RDSEFSSU5ERVggPSAweDdGMDAwMDAwOwovKiB1bm1hcHBlZCBjaGFyYWN0ZXIgdmFsdWVzICovCmNvbnN0IGludDMyX3QgUnVsZUJhc2VkQ29sbGF0b3I6OlVOTUFQUEVEID0gMHhGRkZGRkZGRjsKLyogcHJpbWFyeSBzdHJlbmd0aCBpbmNyZW1lbnQgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWU9SREVSSU5DUkVNRU5UID0gMHgwMDAxMDAwMDsKLyogc2Vjb25kYXJ5IHN0cmVuZ3RoIGluY3JlbWVudCAqLwpjb25zdCBpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpTRUNPTkRBUllPUkRFUklOQ1JFTUVOVCA9IDB4MDAwMDAxMDA7Ci8qIHRlcnRpYXJ5IHN0cmVuZ3RoIGluY3JlbWVudCAqLwpjb25zdCBpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpURVJUSUFSWU9SREVSSU5DUkVNRU5UID0gMHgwMDAwMDAwMTsKLyogbWFzayBvZmYgYW55dGhpbmcgYnV0IHByaW1hcnkgb3JkZXIgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWU9SREVSTUFTSyA9IDB4ZmZmZjAwMDA7Ci8qIG1hc2sgb2ZmIGFueXRoaW5nIGJ1dCBzZWNvbmRhcnkgb3JkZXIgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6U0VDT05EQVJZT1JERVJNQVNLID0gMHgwMDAwZmYwMDsKLyogbWFzayBvZmYgYW55dGhpbmcgYnV0IHRlcnRpYXJ5IG9yZGVyICovCmNvbnN0IGludDMyX3QgUnVsZUJhc2VkQ29sbGF0b3I6OlRFUlRJQVJZT1JERVJNQVNLID0gMHgwMDAwMDBmZjsKLyogbWFzayBvZmYgaWdub3JhYmxlIGNoYXIgb3JkZXIgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6SUdOT1JBQkxFTUFTSyA9IDB4MDAwMGZmZmY7Ci8qIHVzZSBvbmx5IHRoZSBwcmltYXJ5IGRpZmZlcmVuY2UgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWURJRkZFUkVOQ0VPTkxZID0gMHhmZmZmMDAwMDsKLyogdXNlIG9ubHkgdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBkaWZmZXJlbmNlICovCmNvbnN0IGludDMyX3QgUnVsZUJhc2VkQ29sbGF0b3I6OlNFQ09OREFSWURJRkZFUkVOQ0VPTkxZID0gMHhmZmZmZmYwMDsKLyogcHJpbWFyeSBvcmRlciBzaGlmdCAqLwpjb25zdCBpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpQUklNQVJZT1JERVJTSElGVCA9IDE2OwovKiBzZWNvbmRhcnkgb3JkZXIgc2hpZnQgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6U0VDT05EQVJZT1JERVJTSElGVCA9IDg7Ci8qIHN0YXJ0aW5nIHZhbHVlIGZvciBjb2xsYXRpb24gZWxlbWVudHMgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6Q09MRUxFTUVOVFNUQVJUID0gMHgwMjAyMDIwMjsKLyogdGVzdGluZyBtYXNrIGZvciBwcmltYXJ5IGxvdyBlbGVtZW50ICovCmNvbnN0IGludDMyX3QgUnVsZUJhc2VkQ29sbGF0b3I6OlBSSU1BUllMT1daRVJPTUFTSyA9IDB4MDBGRjAwMDA7Ci8qIHJlc2V0aW5nIHZhbHVlIGZvciBzZWNvbmRhcmllcyBhbmQgdGVydGlhcmllcyAqLwpjb25zdCBpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpSRVNFVFNFQ09OREFSWVRFUlRJQVJZID0gMHgwMDAwMDIwMjsKLyogcmVzZXRpbmcgdmFsdWUgZm9yIHRlcnRpYXJpZXMgKi8KY29uc3QgaW50MzJfdCBSdWxlQmFzZWRDb2xsYXRvcjo6UkVTRVRURVJUSUFSWSA9IDB4MDAwMDAwMDI7Cgpjb25zdCBpbnQzMl90IFJ1bGVCYXNlZENvbGxhdG9yOjpQUklNSUdOT1JBQkxFID0gMHgwMjAyOwoKLyogdW5pcXVlIGZpbGUgaWQgZm9yIHBhcml0eSBjaGVjayAqLwpjb25zdCBpbnQxNl90IFJ1bGVCYXNlZENvbGxhdG9yOjpGSUxFSUQgPSAweDU0NDM7Ci8qIGJpbmFyeSBjb2xsYXRpb24gZmlsZSBleHRlbnNpb24gKi8KY29uc3QgY2hhciBSdWxlQmFzZWRDb2xsYXRvcjo6a0ZpbGVuYW1lU3VmZml4W10gPSAiLmNvbCI7Ci8qIGNsYXNzIGlkID8gVmFsdWUgaXMgaXJyZWxldmFudCAqLwpjb25zdCBjaGFyICBSdWxlQmFzZWRDb2xsYXRvcjo6ZmdDbGFzc0lEID0gMDsKClVfTkFNRVNQQUNFX0VORAoKI2VuZGlmIC8qICNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04gKi8K