{"id":"CVE-2012-3152","description":"Unspecified vulnerability in the Oracle Reports Developer component in Oracle Fusion Middleware 11.1.1.4, 11.1.1.6, and 11.1.2.0 allows remote attackers to affect confidentiality and integrity via unknown vectors related to Report Server Component.  NOTE: the previous information is from the October 2012 CPU. Oracle has not commented on claims from the original researcher that the URLPARAMETER functionality allows remote attackers to read and upload arbitrary files to reports/rwservlet, and that this issue occurs in earlier versions.  NOTE: this can be leveraged with CVE-2012-3153 to execute arbitrary code by uploading a .jsp file.","cvssScore":9.1,"cvssVersion":"3.1","cvssVector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","cvssMetrics":[{"version":"3.1","score":9.1,"severity":"CRITICAL","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","source":"nvd@nist.gov","sourceName":"NVD","type":"Primary"},{"version":"3.1","score":9.1,"severity":"CRITICAL","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","source":"134c704f-9b21-4f2e-91b3-4a467353bcc0","sourceName":"CISA-ADP","type":"Secondary"},{"version":"2.0","score":6.4,"vector":"AV:N/AC:L/Au:N/C:P/I:P/A:N","source":"nvd@nist.gov","sourceName":"NVD","type":"Primary"}],"resolved":"MITIGATED-BY-RASP","published":"2012-10-16","lastModified":"2026-06-16","affectedProducts":[{"vendor":"oracle","product":"fusion middleware","version":"11.1.1.4.0"},{"vendor":"oracle","product":"fusion middleware","version":"11.1.1.6.0"},{"vendor":"oracle","product":"fusion middleware","version":"11.1.2.0"}],"totalAffectedProducts":1,"references":[{"url":"http://blog.netinfiltration.com/2013/11/03/oracle-reports-cve-2012-3152-and-cve-2012-3153/","source":"secalert_us@oracle.com","tags":["Broken Link"]},{"url":"http://blog.netinfiltration.com/2014/01/19/upcoming-exploit-release-oracle-forms-and-reports-11g/","source":"secalert_us@oracle.com","tags":["Broken Link"]},{"url":"http://seclists.org/fulldisclosure/2014/Jan/186","source":"secalert_us@oracle.com","tags":["Mailing List","Third Party Advisory"]},{"url":"http://www.exploit-db.com/exploits/31253","source":"secalert_us@oracle.com","tags":["Exploit","Third Party Advisory","VDB Entry"]},{"url":"http://www.mandriva.com/security/advisories?name=MDVSA-2013:150","source":"secalert_us@oracle.com","tags":["Broken Link"]},{"url":"http://www.oracle.com/technetwork/topics/security/cpuoct2012-1515893.html","source":"secalert_us@oracle.com","tags":["Patch","Vendor Advisory"]},{"url":"http://www.osvdb.org/86394","source":"secalert_us@oracle.com","tags":["Broken Link"]},{"url":"http://www.osvdb.org/86395","source":"secalert_us@oracle.com","tags":["Broken Link"]},{"url":"http://www.securityfocus.com/bid/55955","source":"secalert_us@oracle.com","tags":["Broken Link","Third Party Advisory","VDB Entry"]},{"url":"http://www.youtube.com/watch?v=NinvMDOj7sM","source":"secalert_us@oracle.com","tags":["Exploit"]}],"reasoning":{"decidingSource":"armr-patch-file","decidingReason":"CVE has an ARMR patch rule that provides mitigation","verdicts":[{"rule":"rejected","stage":"identity","outcome":"no-match"},{"rule":"armr-patch-file","stage":"scope","outcome":"matched","status":"MITIGATED-BY-RASP","detail":"ARMR patch file exists for this CVE","decisive":true}]},"relatedFiles":{"patchFiles":[{"path":"rules/middleware/oracle/CVE-2012-3152/patch/2.6/CVE-2012-3152.armr","url":"https://github.com/waratek/java-patches/blob/develop/rules/middleware/oracle/CVE-2012-3152/patch/2.6/CVE-2012-3152.armr","created":"2020-06-25T21:16:55Z","updated":"2026-03-04T16:48:46Z","content":"YXBwKCJDVkUtMjAxMi0zMTUyLCBDVkUtMjAxMi0zMTUzIik6CiAgICByZXF1aXJlcyh2ZXJzaW9uOiAiQVJNUi8yLjYiKQoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDVkUtMjAxMi0zMTUyLCBDVkUtMjAxMi0zMTUzCgogICAgICAgIENWU1MgMi4wIFN1bW1hcnk6CiAgICAgICAgICAgIEJhc2UgU2NvcmUgICAgICAgICAgICAgIHwgNi40CiAgICAgICAgICAgIEF0dGFjayBWZWN0b3IgICAgICAgICAgIHwgTmV0d29yawogICAgICAgICAgICBBdHRhY2sgQ29tcGxleGl0eSAgICAgICB8IExvdwogICAgICAgICAgICBBdXRoZW50aWNhdGlvbiAgICAgICAgICB8IE5vbmUKICAgICAgICAgICAgQ29uZmlkZW50aWFsaXR5ICAgICAgICAgfCBQYXJ0aWFsCiAgICAgICAgICAgIEludGVncml0eSAgICAgICAgICAgICAgIHwgUGFydGlhbAogICAgICAgICAgICBBdmFpbGFiaWxpdHkgSW1wYWN0ICAgICB8IE5vbmUKCiAgICAgICAgRGVzY3JpcHRpb246CiAgICAgICAgICAgIFVuc3BlY2lmaWVkIHZ1bG5lcmFiaWxpdHkgaW4gdGhlIE9yYWNsZSBSZXBvcnRzIERldmVsb3BlciBjb21wb25lbnQKICAgICAgICAgICAgaW4gT3JhY2xlIEZ1c2lvbiBNaWRkbGV3YXJlIDExLjEuMS40LCAxMS4xLjEuNiwgYW5kIDExLjEuMi4wIGFsbG93cwogICAgICAgICAgICByZW1vdGUgYXR0YWNrZXJzIHRvIGFmZmVjdCBjb25maWRlbnRpYWxpdHkgYW5kIGludGVncml0eSB2aWEgdW5rbm93bgogICAgICAgICAgICB2ZWN0b3JzIHJlbGF0ZWQgdG8gUmVwb3J0IFNlcnZlciBDb21wb25lbnQuIE5PVEU6IHRoZSBwcmV2aW91cwogICAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBmcm9tIHRoZSBPY3RvYmVyIDIwMTIgQ1BVLiBPcmFjbGUgaGFzIG5vdCBjb21tZW50ZWQKICAgICAgICAgICAgb24gY2xhaW1zIGZyb20gdGhlIG9yaWdpbmFsIHJlc2VhcmNoZXIgdGhhdCB0aGUgVVJMUEFSQU1FVEVSCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgYWxsb3dzIHJlbW90ZSBhdHRhY2tlcnMgdG8gcmVhZCBhbmQgdXBsb2FkIGFyYml0cmFyeQogICAgICAgICAgICBmaWxlcyB0byByZXBvcnRzL3J3c2VydmxldCwgYW5kIHRoYXQgdGhpcyBpc3N1ZSBvY2N1cnMgaW4gZWFybGllcgogICAgICAgICAgICB2ZXJzaW9ucy4gTk9URTogdGhpcyBjYW4gYmUgbGV2ZXJhZ2VkIHdpdGggQ1ZFLTIwMTItMzE1MyB0byBleGVjdXRlCiAgICAgICAgICAgIGFyYml0cmFyeSBjb2RlIGJ5IHVwbG9hZGluZyBhIC5qc3AgZmlsZS4KCiAgICAgICAgUmVzb3VyY2VzOgogICAgICAgICAgICBodHRwczovL3d3dy5leHBsb2l0LWRiLmNvbS9leHBsb2l0cy8zMTI1My8KICAgICAgICAgICAgaHR0cDovL3d3dy5wcmltYWxzZWN1cml0eS5uZXQvcHl0aG9uLXR1dG9yaWFscy11c2UtY2FzZS1jdmUtMjAxMi0zMTUyLwogICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vcmFwaWQ3L21ldGFzcGxvaXQtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL21vZHVsZXMvZXhwbG9pdHMvbXVsdGkvaHR0cC9vcmFjbGVfcmVwb3J0c19yY2UucmIKCiAgICAgICAgQWZmZWN0ZWQgT3BlcmF0aW5nIFN5c3RlbToKICAgICAgICAgICAgQW55CgogICAgICAgIEFmZmVjdGVkIFZlcnNpb25zOgogICAgICAgICAgICBPcmFjbGUgRnVzaW9uIE1pZGRsZXdhcmUgMTEuMS4xLjQsIDExLjEuMS42LCBhbmQgMTEuMS4yLjAKCiAgICAgICAgVGVzdGVkIFZlcnNpb25zOgogICAgICAgICAgICBPcmFjbGUgQXBwbGljYXRpb24gU2VydmVyIChPQzRKKSB3aXRoIE9yYWNsZSAxMmMgKFdlYkxvZ2ljIDEyLjIuMS4yKQoKICAgICAgICBQcm90ZWN0aW9uIFByb3ZpZGVkOgogICAgICAgICAgICBWaXJ0dWFsIHBhdGNoIGJhc2VkIG9uIHB1YmxpYyBleHBsb2l0cy4KCiAgICAgICAgUGF0Y2ggVmVyc2lvbjoKICAgICAgICAgICAgMS4yLWIwNwogICAgICAgIFN1cHBvcnRlZCBhcHAgc2VydmVyczoKICAgICAgICAgICAgV2ViTG9naWMsIE9DNEouCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgIwogICAgIyBMRkkgUGF0Y2ggZm9yIE9DNEoKICAgICMKCiAgICBwYXRjaCgiQ1ZFLTIwMTItMzE1MiwgQ1ZFLTIwMTItMzE1MyA6MDEiKToKICAgICAgICBmdW5jdGlvbigiY29tL2V2ZXJtaW5kL3NlcnZlci9odHRwL0V2ZXJtaW5kSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKClMamF2YS9sYW5nL1N0cmluZzsiKQogICAgICAgIGV4aXQoKQoKICAgICAgICBjb2RlKGxhbmd1YWdlOiBqYXZhLCAgIGltcG9ydDogWyJqYXZhLm5ldC5VUkkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5ldmVybWluZC5uZXQuQWRkcmVzc0NvbnRhaW5lciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmV2ZXJtaW5kLnNlcnZlci5odHRwLkV2ZXJtaW5kSHR0cFNlcnZsZXRSZXF1ZXN0Il0pOgoKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZVTE5FUkFCTEVfVVJJID0gIi9yZXBvcnRzL3J3c2VydmxldCI7CiAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxQQVJBTUVURVIgPSAidXJscGFyYW1ldGVyIjsKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0FGRV9QUk9UT0NPTFMgPSB7CiAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly8iLCAiaHR0cHM6Ly8iLCAiXCJodHRwOi8vIiwgIlwiaHR0cHM6Ly8iLAogICAgICAgICAgICAgICAgICAgICIlMjJodHRwOi8vIiwgIiUyMmh0dHBzOi8vIiwgIiUyN2h0dHA6Ly8iLCAiJTI3aHR0cHM6Ly8iLAogICAgICAgICAgICAgICAgICAgICJodHRwJTNBJTJGJTJGIiwgImh0dHBzJTNBJTJGJTJGIiwgIlwiaHR0cCUzQSUyRiUyRiIsICJcImh0dHBzJTNBJTJGJTJGIiwKICAgICAgICAgICAgICAgICAgICAiJTIyaHR0cCUzQSUyRiUyRiIsICIlMjJodHRwcyUzQSUyRiUyRiIsICIlMjdodHRwJTNBJTJGJTJGIiwgIiUyN2h0dHBzJTNBJTJGJTJGIgogICAgICAgICAgICB9OwogICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTQUZFX0hPU1RTID0geyIifTsKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBRkVfUVVFUllfU1RSSU5HID0gIiI7CgogICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXRjaChKYXZhRnJhbWUgZnJhbWUpIHsKCiAgICAgICAgICAgICAgICBFdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdCBzZWxmID0gKEV2ZXJtaW5kSHR0cFNlcnZsZXRSZXF1ZXN0KSBmcmFtZS5sb2FkVGhpc1ZhcmlhYmxlKCk7CiAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gc2VsZi5nZXRSZXF1ZXN0VVJJKCk7CiAgICAgICAgICAgICAgICAvLyBTdHJpbmcuY29udGFpbnMoKSBkb2VzIG5vdCBleGlzdCBpbiBKYXZhIDEuNAogICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoVlVMTkVSQUJMRV9VUkkpID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IGZyYW1lLmxvYWRTdHJpbmdPcGVyYW5kKDApOwoKICAgICAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBqYXZhLm5ldC5VUkxEZWNvZGVyLmRlY29kZShxdWVyeSwgIlVURi04IikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgVVRGLTggaXMgaGFyZGNvZGVkCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHF1ZXJ5LmluZGV4T2YoVVJMUEFSQU1FVEVSKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5VmFsdWVzID0gcXVlcnkuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICBibG9ja0lmTWFsaWNpb3VzKGtleVZhbHVlcywgZnJhbWUsIHVyaSk7CiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVzID0gcXVlcnkuc3BsaXQoIiYiKTsKICAgICAgICAgICAgICAgICAgICBibG9ja0lmTWFsaWNpb3VzKGtleVZhbHVlcywgZnJhbWUsIHVyaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHByaXZhdGUgdm9pZCBibG9ja0lmTWFsaWNpb3VzKFN0cmluZ1tdIGtleVZhbHVlcywgSmF2YUZyYW1lIGZyYW1lLCBTdHJpbmcgdXJpKSB7CiAgICAgICAgICAgICAgICBpZiAoa2V5VmFsdWVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5VmFsIDoga2V5VmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFpciA9IGtleVZhbC5zcGxpdCgiPSIsIDIpOwogICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLmxlbmd0aCAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhaXJbMF07CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IHBhaXJbMV07CgogICAgICAgICAgICAgICAgICAgIGlmIChVUkxQQVJBTUVURVIuZXF1YWxzSWdub3JlQ2FzZShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHNhZmVQcm90b2NvbCA6IFNBRkVfUFJPVE9DT0xTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnN0YXJ0c1dpdGgoc2FmZVByb3RvY29sKSAmJiBpc1NhZmVIb3N0KHZhbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nQXR0YWNrKHVyaSwga2V5VmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUucmV0dXJuU3RyaW5nKFNBRkVfUVVFUllfU1RSSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2FmZUhvc3QoU3RyaW5nIHZhbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSB0cmltQ2hhcmFjdGVyKHZhbCwgJyInKTsKICAgICAgICAgICAgICAgICAgICB2YWwgPSB0cmltQ2hhcmFjdGVyKHZhbCwgJ1wnJyk7CiAgICAgICAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkodmFsKTsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHVyaS5nZXRIb3N0KCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChob3N0ID09IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgfHwgaG9zdC5lcXVhbHNJZ25vcmVDYXNlKCJsb2NhbGhvc3QiKQogICAgICAgICAgICAgICAgICAgICAgICB8fCBob3N0LmVxdWFsc0lnbm9yZUNhc2UoIjEyNy4wLjAuMSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaG9zdCA9IGhvc3QudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzYWZlSG9zdCA6IFNBRkVfSE9TVFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhZmVIb3N0LnRvTG93ZXJDYXNlKCkuZXF1YWxzKGhvc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltQ2hhcmFjdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewogICAgICAgICAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7CiAgICAgICAgICAgICAgICBpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGgoKTsKICAgICAgICAgICAgICAgIHdoaWxlIChzdGFydCA8IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLmNoYXJBdChzdGFydCkgPT0gYykgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmNoYXJBdChsYXN0IC0gMSkgPT0gYykgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0LS07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGxhc3QpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwcml2YXRlIHZvaWQgbG9nQXR0YWNrKFN0cmluZyB1cmksIFN0cmluZyBxdWVyeSkgewogICAgICAgICAgICAgICAgQXJtckV2ZW50IGV2ZW50ID0gQXJtckV2ZW50LmxvYWQoIkV4ZWN1dGUgUnVsZSIsICJoaWdoIik7CiAgICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oIm1zZyIsICJBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHF1ZXJ5IHRoZSBmaWxlLXN5c3RlbSwgcmVsYXRlZCB0byBDVkUtMjAxMi0zMTUyLiIpOwogICAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJzZXJ2bGV0VXJpIiwgU3RyaW5nLnZhbHVlT2YodXJpKSk7CiAgICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oInF1ZXJ5IiwgU3RyaW5nLnZhbHVlT2YocXVlcnkpKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiYWN0IiwgInByb3RlY3QiKTsKICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgZW5kY29kZQogICAgZW5kcGF0Y2gKCiAgICAjCiAgICAjIFJDRSBQYXRjaCBmb3IgT0M0SgogICAgIwoKICAgIHBhdGNoKCJDVkUtMjAxMi0zMTUyLCBDVkUtMjAxMi0zMTUzIDowMiIpOgogICAgICAgIGZ1bmN0aW9uKCJjb20vZXZlcm1pbmQvc2VydmVyL2h0dHAvRXZlcm1pbmRIdHRwU2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiKQogICAgICAgIGV4aXQoKQoKICAgICAgICBjb2RlKGxhbmd1YWdlOiBqYXZhLCAgIGltcG9ydDogWyJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uZXZlcm1pbmQubmV0LkFkZHJlc3NDb250YWluZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5ldmVybWluZC5zZXJ2ZXIuaHR0cC5FdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdCJdKToKCiAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWVUxORVJBQkxFX1BBUkFNID0gImRlc25hbWUiOwogICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVlVMTkVSQUJMRV9VUkkgPSAiL3JlcG9ydHMvcndzZXJ2bGV0IjsKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUFMSUNJT1VTX0ZJTEVfRVhURU5TSU9OUyA9IHsiLmpzcCIsICIuYmF0IiwgIi5zaCIsICIuZXhlIiwgIi5jbGFzcyIsICIuamF2YSIsICIuc28iLCAiLmRsbCJ9OwogICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FGRV9QQVJBTUVURVJfVkFMVUUgPSAiIjsKCiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhdGNoKEphdmFGcmFtZSBmcmFtZSkgewogICAgICAgICAgICAgICAgRXZlcm1pbmRIdHRwU2VydmxldFJlcXVlc3Qgc2VsZiA9IChFdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdCkgZnJhbWUubG9hZFRoaXNWYXJpYWJsZSgpOwogICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHNlbGYuZ2V0UmVxdWVzdFVSSSgpOwogICAgICAgICAgICAgICAgLy8gU3RyaW5nLmNvbnRhaW5zKCkgZG9lcyBub3QgZXhpc3QgaW4gSmF2YSAxLjQKICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCB8fCB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKFZVTE5FUkFCTEVfVVJJKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBmcmFtZS5sb2FkU3RyaW5nVmFyaWFibGUoMSk7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCB8fCAhcGFyYW0uZXF1YWxzSWdub3JlQ2FzZShWVUxORVJBQkxFX1BBUkFNKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IGZyYW1lLmxvYWRTdHJpbmdPcGVyYW5kKDApOwogICAgICAgICAgICAgICAgaWYgKHBhcmFtVmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZXh0ZW5zaW9uIDogTUFMSUNJT1VTX0ZJTEVfRVhURU5TSU9OUykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVZhbHVlLmVuZHNXaXRoKGV4dGVuc2lvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2soZnJhbWUsIHVyaSwgcGFyYW1WYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHByaXZhdGUgdm9pZCBibG9jayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyB1cmksIFN0cmluZyBwYXJhbVZhbHVlKSB7CiAgICAgICAgICAgICAgICBBcm1yRXZlbnQgZXZlbnQgPSBBcm1yRXZlbnQubG9hZCgiRXhlY3V0ZSBSdWxlIiwgImhpZ2giKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibXNnIiwgIkFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gdXBsb2FkIGEgZmlsZSByZWxhdGVkIHRvIENWRS0yMDEyLTMxNTIuIik7CiAgICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oInNlcnZsZXRVcmkiLCBTdHJpbmcudmFsdWVPZih1cmkpKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigicGFyYW1WYWx1ZSIsIFN0cmluZy52YWx1ZU9mKHBhcmFtVmFsdWUpKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiYWN0IiwgInByb3RlY3QiKTsKICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgICAgICAgZnJhbWUucmV0dXJuU3RyaW5nKFNBRkVfUEFSQU1FVEVSX1ZBTFVFKTsKICAgICAgICAgICAgfQogICAgICAgIGVuZGNvZGUKICAgIGVuZHBhdGNoCgogICAgcGF0Y2goIkNWRS0yMDEyLTMxNTIsIENWRS0yMDEyLTMxNTMgOjAzIik6CiAgICAgICAgZnVuY3Rpb24oImNvbS9ldmVybWluZC9zZXJ2ZXIvaHR0cC9FdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoTGphdmEvbGFuZy9TdHJpbmc7KVtMamF2YS9sYW5nL1N0cmluZzsiKQogICAgICAgIGV4aXQoKQoKICAgICAgICBjb2RlKGxhbmd1YWdlOiBqYXZhLCAgIGltcG9ydDogWyJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uZXZlcm1pbmQubmV0LkFkZHJlc3NDb250YWluZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5ldmVybWluZC5zZXJ2ZXIuaHR0cC5FdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdCJdKToKCiAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWVUxORVJBQkxFX1BBUkFNID0gImRlc25hbWUiOwogICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVlVMTkVSQUJMRV9VUkkgPSAiL3JlcG9ydHMvcndzZXJ2bGV0IjsKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUFMSUNJT1VTX0ZJTEVfRVhURU5TSU9OUyA9IHsiLmpzcCIsICIuYmF0IiwgIi5zaCIsICIuZXhlIiwgIi5jbGFzcyIsICIuamF2YSIsICIuc28iLCAiLmRsbCJ9OwogICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FGRV9QQVJBTUVURVJfVkFMVUUgPSAiIjsKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0FGRV9QQVJBTUVURVJfVkFMVUVTID0geyIifTsKCiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhdGNoKEphdmFGcmFtZSBmcmFtZSkgewogICAgICAgICAgICAgICAgRXZlcm1pbmRIdHRwU2VydmxldFJlcXVlc3Qgc2VsZiA9IChFdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdCkgZnJhbWUubG9hZFRoaXNWYXJpYWJsZSgpOwogICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHNlbGYuZ2V0UmVxdWVzdFVSSSgpOwogICAgICAgICAgICAgICAgLy8gU3RyaW5nLmNvbnRhaW5zKCkgZG9lcyBub3QgZXhpc3QgaW4gSmF2YSAxLjQKICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCB8fCB1cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKFZVTE5FUkFCTEVfVVJJKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBmcmFtZS5sb2FkU3RyaW5nVmFyaWFibGUoMSk7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCB8fCAhcGFyYW0uZXF1YWxzSWdub3JlQ2FzZShWVUxORVJBQkxFX1BBUkFNKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbVZhbHVlcyA9IChTdHJpbmdbXSkgZnJhbWUubG9hZE9iamVjdE9wZXJhbmQoMCk7CiAgICAgICAgICAgICAgICBpZiAocGFyYW1WYWx1ZXMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZXh0ZW5zaW9uIDogTUFMSUNJT1VTX0ZJTEVfRVhURU5TSU9OUykgewogICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhcmFtVmFsdWUgOiBwYXJhbVZhbHVlcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1WYWx1ZSAhPSBudWxsICYmIHBhcmFtVmFsdWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHRlbnNpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayhmcmFtZSwgdXJpLCBwYXJhbVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGJsb2NrKEphdmFGcmFtZSBmcmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKICAgICAgICAgICAgICAgIEFybXJFdmVudCBldmVudCA9IEFybXJFdmVudC5sb2FkKCJFeGVjdXRlIFJ1bGUiLCAiaGlnaCIpOwogICAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1cGxvYWQgYSBmaWxlIHJlbGF0ZWQgdG8gQ1ZFLTIwMTItMzE1Mi4iKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigic2VydmxldFVyaSIsIFN0cmluZy52YWx1ZU9mKHVyaSkpOwogICAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJwYXJhbVZhbHVlIiwgU3RyaW5nLnZhbHVlT2YocGFyYW1WYWx1ZSkpOwogICAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJhY3QiLCAicHJvdGVjdCIpOwogICAgICAgICAgICAgICAgZXZlbnQuY29tbWl0KCk7CiAgICAgICAgICAgICAgICBmcmFtZS5yZXR1cm5PYmplY3QoU0FGRV9QQVJBTUVURVJfVkFMVUVTKTsKICAgICAgICAgICAgfQogICAgICAgIGVuZGNvZGUKICAgIGVuZHBhdGNoCgogICAgcGF0Y2goIkNWRS0yMDEyLTMxNTIsIENWRS0yMDEyLTMxNTMgOjA0Iik6CiAgICAgICAgZnVuY3Rpb24oImNvbS9ldmVybWluZC9zZXJ2ZXIvaHR0cC9FdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRRdWVyeVN0cmluZygpTGphdmEvbGFuZy9TdHJpbmc7IikKICAgICAgICBleGl0KCkKCiAgICAgICAgY29kZShsYW5ndWFnZTogamF2YSwgICBpbXBvcnQ6IFsiamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmV2ZXJtaW5kLm5ldC5BZGRyZXNzQ29udGFpbmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uZXZlcm1pbmQuc2VydmVyLmh0dHAuRXZlcm1pbmRIdHRwU2VydmxldFJlcXVlc3QiXSk6CgogICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVlVMTkVSQUJMRV9QQVJBTSA9ICJkZXNuYW1lIjsKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZVTE5FUkFCTEVfVVJJID0gIi9yZXBvcnRzL3J3c2VydmxldCI7CiAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1BTElDSU9VU19GSUxFX0VYVEVOU0lPTlMgPSB7Ii5qc3AiLCAiLmJhdCIsICIuc2giLCAiLmV4ZSIsICIuY2xhc3MiLCAiLmphdmEiLCAiLnNvIiwgIi5kbGwifTsKICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBRkVfUEFSQU1FVEVSX1ZBTFVFID0gIiI7CiAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQUZFX1FVRVJZX1NUUklORyA9ICIiOwoKICAgICAgICAgICAgcHVibGljIHZvaWQgcGF0Y2goSmF2YUZyYW1lIGZyYW1lKSB7CiAgICAgICAgICAgICAgICBFdmVybWluZEh0dHBTZXJ2bGV0UmVxdWVzdCBzZWxmID0gKEV2ZXJtaW5kSHR0cFNlcnZsZXRSZXF1ZXN0KSBmcmFtZS5sb2FkVGhpc1ZhcmlhYmxlKCk7CiAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gc2VsZi5nZXRSZXF1ZXN0VVJJKCk7CiAgICAgICAgICAgICAgICAvLyBTdHJpbmcuY29udGFpbnMoKSBkb2VzIG5vdCBleGlzdCBpbiBKYXZhIDEuNAogICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoVlVMTkVSQUJMRV9VUkkpID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IGZyYW1lLmxvYWRTdHJpbmdPcGVyYW5kKDApOwogICAgICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwgJiYgcXVlcnkudG9Mb3dlckNhc2UoKS5pbmRleE9mKFZVTE5FUkFCTEVfUEFSQU0pID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBrZXlWYWx1ZXMgPSBxdWVyeS5zcGxpdCgiXFwrIik7CiAgICAgICAgICAgICAgICAgICAgYmxvY2tJZk1hbGljaW91cyhrZXlWYWx1ZXMsIGZyYW1lLCB1cmkpOwogICAgICAgICAgICAgICAgICAgIGtleVZhbHVlcyA9IHF1ZXJ5LnNwbGl0KCImIik7CiAgICAgICAgICAgICAgICAgICAgYmxvY2tJZk1hbGljaW91cyhrZXlWYWx1ZXMsIGZyYW1lLCB1cmkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBwcml2YXRlIHZvaWQgYmxvY2tJZk1hbGljaW91cyhTdHJpbmdbXSBrZXlWYWx1ZXMsIEphdmFGcmFtZSBmcmFtZSwgU3RyaW5nIHVyaSkgewogICAgICAgICAgICAgICAgaWYgKGtleVZhbHVlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleVZhbCA6IGtleVZhbHVlcykgewogICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhaXIgPSBrZXlWYWwuc3BsaXQoIj0iKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFpci5sZW5ndGggIT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYWlyWzBdOwogICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBwYWlyWzFdOwoKICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoVlVMTkVSQUJMRV9QQVJBTS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZXh0ZW5zaW9uIDogTUFMSUNJT1VTX0ZJTEVfRVhURU5TSU9OUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmIHZhbC5lbmRzV2l0aChleHRlbnNpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2soZnJhbWUsIHVyaSwgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHByaXZhdGUgdm9pZCBibG9jayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyB1cmksIFN0cmluZyBwYXJhbVZhbHVlKSB7CiAgICAgICAgICAgICAgICBBcm1yRXZlbnQgZXZlbnQgPSBBcm1yRXZlbnQubG9hZCgiRXhlY3V0ZSBSdWxlIiwgImhpZ2giKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibXNnIiwgIkFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gdXBsb2FkIGEgZmlsZSByZWxhdGVkIHRvIENWRS0yMDEyLTMxNTIuIik7CiAgICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oInNlcnZsZXRVcmkiLCBTdHJpbmcudmFsdWVPZih1cmkpKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigicGFyYW1WYWx1ZSIsIFN0cmluZy52YWx1ZU9mKHBhcmFtVmFsdWUpKTsKICAgICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiYWN0IiwgInByb3RlY3QiKTsKICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgICAgICAgZnJhbWUucmV0dXJuT2JqZWN0KFNBRkVfUVVFUllfU1RSSU5HKTsKICAgICAgICAgICAgfQogICAgICAgIGVuZGNvZGUKICAgIGVuZHBhdGNoCgplbmRhcHAKCiMKIyBQcm9jZXNzIGZvcmtpbmcgY29udHJvbCBmb3IgUkNFIG1pdGlnYXRpb24uCiMKCmFwcCgiUFJPQ0VTUyBDT05UUk9MIik6CiAgICByZXF1aXJlcyh2ZXJzaW9uOiAiQVJNUi8xLjMiKQoKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICMgUHJvY2VzcyBDb250cm9sCiAgICAjCiAgICAjIERlc2NyaXB0aW9uOgogICAgIyAgIEV4ZWN1dGluZyBjb21tYW5kcyBvciBsb2FkaW5nIGxpYnJhcmllcyBmcm9tIGFuIHVudHJ1c3RlZCBzb3VyY2Ugb3IgaW4KICAgICMgICBhbiB1bnRydXN0ZWQgZW52aXJvbm1lbnQgY2FuIGNhdXNlIGFuIGFwcGxpY2F0aW9uIHRvIGV4ZWN1dGUgbWFsaWNpb3VzCiAgICAjICAgY29tbWFuZHMgKGFuZCBwYXlsb2Fkcykgb24gYmVoYWxmIG9mIGFuIGF0dGFja2VyLgogICAgIyAgICAgICAqIFByb2Nlc3NCdWlsZGVyLnN0YXJ0KCkgLSBwcmV2ZW50IHRoaXMgbWV0aG9kIGZyb20gZm9ya2luZyBwcm9jZXNzZXMuCiAgICAjICAgICAgICogUnVudGltZS5leGVjKCkgLSBwcmV2ZW50IGFsbCBvdmVybG9hZGVkIHZhcmlhbnRzIGZyb20gZm9ya2luZyBwcm9jZXNzZXMuCiAgICAjCiAgICAjIExhYmVsczoKICAgICMgICBDV0UtMTE0CiAgICAjCiAgICAjIE1pdGlnYXRpb24vUmVtZWRpYXRpb24gQ29udHJvbDoKICAgICMgICBSZXN0cmljdCB3aGljaCBleGVjdXRhYmxlcyBhcmUgYWxsb3dlZCB0byBiZSBmb3JrZWQgYnkgdGhlIEpWTSBieQogICAgIyAgIHdoaXRlbGlzdGluZyBibGFja2xpc3RpbmcgdGhlIGV4ZWN1dGFibGUgbmFtZSBvciB0aGUgZnVsbCBjb21tYW5kCiAgICAjICAgbGluZSAoZXhlY3V0YWJsZSArIGFyZ3VtZW50cykuIFRoZSAnKicgY2hhcmFjdGVyIGlzIHRyZWF0ZWQgYXMgYQogICAgIyAgIHdpbGRjYXJkIGFuZCBjYW4gYmUgdXNlZCB0byBibGFja2xpc3Qvd2hpdGVsaXN0IGFsbCBleGVjdXRhYmxlcy4KICAgICMgICBCbGFja2xpc3RzIGFuZCBXaGl0ZWxpc3RzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuCiAgICAjICAgV2hpdGVsaXN0cyBoYXZlIHByZWNlZGVuY2UuCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgcGF0Y2goIlByb2Nlc3MgRm9ya2luZyA6MDEiKToKICAgICAgIGZ1bmN0aW9uKCJqYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXIuc3RhcnQoKUxqYXZhL2xhbmcvUHJvY2VzczsiKQogICAgICAgZW50cnkoKQoKICAgICAgIGNvZGUobGFuZ3VhZ2U6IGphdmEsICAgaW1wb3J0OiBbImphdmEuaW8uSU9FeGNlcHRpb24iLCAiamF2YS51dGlsLkxpc3QiXSk6CiAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCTEFDS0xJU1QgPSB7IioifTsgLy8gYmxvY2sgYW5kIGxvZyBhbGwgZXhlY3V0YWJsZXMgKGV4Y2VwdCBpZiBhbnkgaGF2ZSBiZWVuIHdoaXRlbGlzdGVkKQovLyAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCTEFDS0xJU1QgPSB7ImNtZCIsICJjbWQuZXhlIiwgIkM6XFxXaW5kb3dzXFxTeXN0ZW0zMlxcY21kIiwKLy8gICAgICAgICAgICAgICAgICJDOlxcV2luZG93c1xcU3lzdGVtMzJcXGNtZC5leGUiLCAicG93ZXJzaGVsbCIsICJpZmNvbmZpZyJ9OwogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0hJVEVMSVNUID0geyIifTsKLy8gICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0hJVEVMSVNUID0geyIqIn07IC8vIGFsbG93IGFuZCBsb2cgYWxsIGV4ZWN1dGFibGVzCgogICAgICAgICAgcHVibGljIHZvaWQgcGF0Y2goSmF2YUZyYW1lIGZyYW1lKSB7CiAgICAgICAgICAgICAgUHJvY2Vzc0J1aWxkZXIgc2VsZiA9IChQcm9jZXNzQnVpbGRlcikgZnJhbWUubG9hZFRoaXNWYXJpYWJsZSgpOwogICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjb21tYW5kcyA9IChMaXN0PFN0cmluZz4pIHNlbGYuY29tbWFuZCgpOwoKICAgICAgICAgICAgICBpZiAoY29tbWFuZHMgIT0gbnVsbCAmJiAhY29tbWFuZHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gY29tbWFuZHMuZ2V0KDApOwogICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cyA9IHN0cmluZ0pvaW4oIiAiLCBjb21tYW5kcyk7CiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q2hlY2soZnJhbWUsIGNvbW1hbmQudHJpbSgpLCBjb21tYW5kV2l0aEFyZ3VtZW50cy50cmltKCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdKb2luKFN0cmluZyBzZXBhcmF0b3IsIExpc3Q8U3RyaW5nPiBsaXN0KSB7CiAgICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApICE9IG51bGwgPyBsaXN0LmdldCgwKSA6ICIiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDI1Nik7CiAgICAgICAgICAgICAgc2IuYXBwZW5kKGxpc3QuZ2V0KDApKTsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNlcGFyYXRvcikuYXBwZW5kKGxpc3QuZ2V0KGkpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBibG9jayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cykgewogICAgICAgICAgICAgIEFybXJFdmVudCBldmVudCA9IEFybXJFdmVudC5sb2FkKCJFeGVjdXRlIFJ1bGUiLCAiaGlnaCIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiY29tbWFuZExpbmUiLCBTdHJpbmcudmFsdWVPZihjb21tYW5kV2l0aEFyZ3VtZW50cykpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibWV0aG9kIiwgImphdmEubGFuZy5Qcm9jZXNzQnVpbGRlci5zdGFydCgpIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiZm9ya2VkIE9TIHByb2Nlc3MiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImFjdCIsICJwcm90ZWN0Iik7CiAgICAgICAgICAgICAgZXZlbnQuY29tbWl0KCk7CiAgICAgICAgICAgICAgZnJhbWUucmFpc2VFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IGFsbG93ZWQiKSk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhbGxvdyhTdHJpbmcgY29tbWFuZFdpdGhBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBBcm1yRXZlbnQgZXZlbnQgPSBBcm1yRXZlbnQubG9hZCgiRXhlY3V0ZSBSdWxlIiwgImxvdyIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiY29tbWFuZExpbmUiLCBTdHJpbmcudmFsdWVPZihjb21tYW5kV2l0aEFyZ3VtZW50cykpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibWV0aG9kIiwgImphdmEubGFuZy5Qcm9jZXNzQnVpbGRlci5zdGFydCgpIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiZm9ya2VkIE9TIHByb2Nlc3MiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImFjdCIsICJhbGxvdyIpOwogICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgfQoKICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VjdXJpdHlDaGVjayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kLCBTdHJpbmcgY29tbWFuZFdpdGhBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogV0hJVEVMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGFsbG93KGNvbW1hbmRXaXRoQXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaXMgd2hpdGVsaXN0ZWQsIHNvIGl0IGhhcyBhIGZyZWUgcGFzcy4gTm8gbmVlZCB0byBkbyBhbnkgbW9yZSBibG9ja0lmTWFsaWNpb3Vzcy4KICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogQkxBQ0tMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKGZyYW1lLCBjb21tYW5kV2l0aEFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICBlbmRjb2RlCiAgICBlbmRwYXRjaAoKICAgIHBhdGNoKCJQcm9jZXNzIEZvcmtpbmcgOjAyIik6CiAgICAgICBmdW5jdGlvbigiamF2YS9sYW5nL1J1bnRpbWUuZXhlYyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOyIpCiAgICAgICBlbnRyeSgpCgogICAgICAgY29kZShsYW5ndWFnZTogamF2YSwgICBpbXBvcnQ6IFsiamF2YS5pby5JT0V4Y2VwdGlvbiIsICJqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyIl0pOgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQkxBQ0tMSVNUID0geyIqIn07IC8vIGJsb2NrIGFuZCBsb2cgYWxsIGV4ZWN1dGFibGVzIChleGNlcHQgaWYgYW55IGhhdmUgYmVlbiB3aGl0ZWxpc3RlZCkKLy8gICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQkxBQ0tMSVNUID0geyJjbWQiLCAiY21kLmV4ZSIsICJDOlxcV2luZG93c1xcU3lzdGVtMzJcXGNtZCIsCi8vICAgICAgICAgICAgICAgICAiQzpcXFdpbmRvd3NcXFN5c3RlbTMyXFxjbWQuZXhlIiwgInBvd2Vyc2hlbGwiLCAiaWZjb25maWcifTsKICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFdISVRFTElTVCA9IHsiIn07Ci8vICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFdISVRFTElTVCA9IHsiKiJ9OyAvLyBhbGxvdyBhbmQgbG9nIGFsbCBleGVjdXRhYmxlcwoKICAgICAgICAgIHB1YmxpYyB2b2lkIHBhdGNoKEphdmFGcmFtZSBmcmFtZSkgewogICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cyA9IChTdHJpbmcpIGZyYW1lLmxvYWRPYmplY3RWYXJpYWJsZSgxKTsKICAgICAgICAgICAgICBpZiAoY29tbWFuZFdpdGhBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICBzZWN1cml0eUNoZWNrKGZyYW1lLCBnZXRFeGVjdXRhYmxlKGNvbW1hbmRXaXRoQXJndW1lbnRzKSwgY29tbWFuZFdpdGhBcmd1bWVudHMudHJpbSgpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEV4ZWN1dGFibGUoU3RyaW5nIGNvbW1hbmQpIHsKICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQuc3BsaXQoIiAiKVswXS50cmltKCk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBibG9jayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cykgewogICAgICAgICAgICAgIEFybXJFdmVudCBldmVudCA9IEFybXJFdmVudC5sb2FkKCJFeGVjdXRlIFJ1bGUiLCAiaGlnaCIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiY29tbWFuZExpbmUiLCBTdHJpbmcudmFsdWVPZihjb21tYW5kV2l0aEFyZ3VtZW50cykpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibWV0aG9kIiwgImphdmEubGFuZy5SdW50aW1lKGphdmEubGFuZy5TdHJpbmcpIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiZm9ya2VkIE9TIHByb2Nlc3MiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImFjdCIsICJwcm90ZWN0Iik7CiAgICAgICAgICAgICAgZXZlbnQuY29tbWl0KCk7CiAgICAgICAgICAgICAgZnJhbWUucmFpc2VFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IGFsbG93ZWQiKSk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhbGxvdyhTdHJpbmcgY29tbWFuZFdpdGhBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBBcm1yRXZlbnQgZXZlbnQgPSBBcm1yRXZlbnQubG9hZCgiRXhlY3V0ZSBSdWxlIiwgImxvdyIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiY29tbWFuZExpbmUiLCBTdHJpbmcudmFsdWVPZihjb21tYW5kV2l0aEFyZ3VtZW50cykpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibWV0aG9kIiwgImphdmEubGFuZy5SdW50aW1lKGphdmEubGFuZy5TdHJpbmcpIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiZm9ya2VkIE9TIHByb2Nlc3MiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImFjdCIsICJhbGxvdyIpOwogICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgfQoKICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VjdXJpdHlDaGVjayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kLCBTdHJpbmcgY29tbWFuZFdpdGhBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogV0hJVEVMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGFsbG93KGNvbW1hbmRXaXRoQXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaXMgd2hpdGVsaXN0ZWQsIHNvIGl0IGhhcyBhIGZyZWUgcGFzcy4gTm8gbmVlZCB0byBkbyBhbnkgbW9yZSBibG9ja0lmTWFsaWNpb3Vzcy4KICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogQkxBQ0tMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKGZyYW1lLCBjb21tYW5kV2l0aEFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICBlbmRjb2RlCiAgICBlbmRwYXRjaAoKICAgIHBhdGNoKCJQcm9jZXNzIEZvcmtpbmcgOjAzIik6CiAgICAgICBmdW5jdGlvbigiamF2YS9sYW5nL1J1bnRpbWUuZXhlYyhbTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsiKQogICAgICAgZW50cnkoKQoKICAgICAgIGNvZGUobGFuZ3VhZ2U6IGphdmEsICAgaW1wb3J0OiBbImphdmEuaW8uSU9FeGNlcHRpb24iXSk6CiAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCTEFDS0xJU1QgPSB7IioifTsgLy8gYmxvY2sgYW5kIGxvZyBhbGwgZXhlY3V0YWJsZXMgKGV4Y2VwdCBpZiBhbnkgaGF2ZSBiZWVuIHdoaXRlbGlzdGVkKQovLyAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCTEFDS0xJU1QgPSB7ImNtZCIsICJjbWQuZXhlIiwgIkM6XFxXaW5kb3dzXFxTeXN0ZW0zMlxcY21kIiwKLy8gICAgICAgICAgICAgICAgICJDOlxcV2luZG93c1xcU3lzdGVtMzJcXGNtZC5leGUiLCAicG93ZXJzaGVsbCIsICJpZmNvbmZpZyJ9OwogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0hJVEVMSVNUID0geyIifTsKLy8gICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFdISVRFTElTVCA9IHsiKiJ9OyAvLyBhbGxvdyBhbmQgbG9nIGFsbCBleGVjdXRhYmxlcwoKICAgICAgICAgIHB1YmxpYyB2b2lkIHBhdGNoKEphdmFGcmFtZSBmcmFtZSkgewogICAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmRzID0gKFN0cmluZ1tdKSBmcmFtZS5sb2FkT2JqZWN0VmFyaWFibGUoMSk7CgogICAgICAgICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsIHx8IGNvbW1hbmRzWzBdID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmRXaXRoQXJndW1lbnRzID0gc3RyaW5nSm9pbigiICIsIGNvbW1hbmRzKTsKICAgICAgICAgICAgICBzZWN1cml0eUNoZWNrKGZyYW1lLCBjb21tYW5kc1swXS50cmltKCksIGNvbW1hbmRXaXRoQXJndW1lbnRzLnRyaW0oKSk7CiAgICAgICAgICB9CgogICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nSm9pbihTdHJpbmcgc2VwYXJhdG9yLCBTdHJpbmdbXSBhcnIpIHsKICAgICAgICAgICAgICBpZiAoYXJyID09IG51bGwgfHwgYXJyLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGFyci5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gYXJyWzBdICE9IG51bGwgPyBhcnJbMF0gOiAiIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOwogICAgICAgICAgICAgIHNiLmFwcGVuZChhcnJbMF0pOwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZChhcnJbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICAgICAgIH0KCiAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJsb2NrKEphdmFGcmFtZSBmcmFtZSwgU3RyaW5nIGNvbW1hbmRXaXRoQXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgQXJtckV2ZW50IGV2ZW50ID0gQXJtckV2ZW50LmxvYWQoIkV4ZWN1dGUgUnVsZSIsICJoaWdoIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJjb21tYW5kTGluZSIsIFN0cmluZy52YWx1ZU9mKGNvbW1hbmRXaXRoQXJndW1lbnRzKSk7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtZXRob2QiLCAiamF2YS5sYW5nLlJ1bnRpbWUoamF2YS5sYW5nLlN0cmluZ1tdKSIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibXNnIiwgImZvcmtlZCBPUyBwcm9jZXNzIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJhY3QiLCAicHJvdGVjdCIpOwogICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgICAgIGZyYW1lLnJhaXNlRXhjZXB0aW9uKG5ldyBJT0V4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBhbGxvd2VkIikpOwogICAgICAgICAgfQoKICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWxsb3coU3RyaW5nIGNvbW1hbmRXaXRoQXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgQXJtckV2ZW50IGV2ZW50ID0gQXJtckV2ZW50LmxvYWQoIkV4ZWN1dGUgUnVsZSIsICJsb3ciKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImNvbW1hbmRMaW5lIiwgU3RyaW5nLnZhbHVlT2YoY29tbWFuZFdpdGhBcmd1bWVudHMpKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oIm1ldGhvZCIsICJqYXZhLmxhbmcuUnVudGltZShqYXZhLmxhbmcuU3RyaW5nW10pIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiZm9ya2VkIE9TIHByb2Nlc3MiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImFjdCIsICJhbGxvdyIpOwogICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgfQoKICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VjdXJpdHlDaGVjayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kLCBTdHJpbmcgY29tbWFuZFdpdGhBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogV0hJVEVMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGFsbG93KGNvbW1hbmRXaXRoQXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaXMgd2hpdGVsaXN0ZWQsIHNvIGl0IGhhcyBhIGZyZWUgcGFzcy4gTm8gbmVlZCB0byBkbyBhbnkgbW9yZSBibG9ja0lmTWFsaWNpb3Vzcy4KICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogQkxBQ0tMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKGZyYW1lLCBjb21tYW5kV2l0aEFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICBlbmRjb2RlCiAgICBlbmRwYXRjaAoKICAgIHBhdGNoKCJQcm9jZXNzIEZvcmtpbmcgOjA0Iik6CiAgICAgICBmdW5jdGlvbigiamF2YS9sYW5nL1J1bnRpbWUuZXhlYyhbTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7IikKICAgICAgIGVudHJ5KCkKCiAgICAgICBjb2RlKGxhbmd1YWdlOiBqYXZhLCAgIGltcG9ydDogWyJqYXZhLmlvLklPRXhjZXB0aW9uIl0pOgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQkxBQ0tMSVNUID0geyIqIn07IC8vIGJsb2NrIGFuZCBsb2cgYWxsIGV4ZWN1dGFibGVzIChleGNlcHQgaWYgYW55IGhhdmUgYmVlbiB3aGl0ZWxpc3RlZCkKLy8gICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQkxBQ0tMSVNUID0geyJjbWQiLCAiY21kLmV4ZSIsICJDOlxcV2luZG93c1xcU3lzdGVtMzJcXGNtZCIsCi8vICAgICAgICAgICAgICAgICAiQzpcXFdpbmRvd3NcXFN5c3RlbTMyXFxjbWQuZXhlIiwgInBvd2Vyc2hlbGwiLCAiaWZjb25maWcifTsKICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFdISVRFTElTVCA9IHsiIn07Ci8vICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXSElURUxJU1QgPSB7IioifTsgLy8gYWxsb3cgYW5kIGxvZyBhbGwgZXhlY3V0YWJsZXMKCiAgICAgICAgICBwdWJsaWMgdm9pZCBwYXRjaChKYXZhRnJhbWUgZnJhbWUpIHsKICAgICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kcyA9IChTdHJpbmdbXSkgZnJhbWUubG9hZE9iamVjdFZhcmlhYmxlKDEpOwoKICAgICAgICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCB8fCBjb21tYW5kc1swXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cyA9IHN0cmluZ0pvaW4oIiAiLCBjb21tYW5kcyk7CiAgICAgICAgICAgICAgc2VjdXJpdHlDaGVjayhmcmFtZSwgY29tbWFuZHNbMF0udHJpbSgpLCBjb21tYW5kV2l0aEFyZ3VtZW50cy50cmltKCkpOwogICAgICAgICAgfQoKICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0pvaW4oU3RyaW5nIHNlcGFyYXRvciwgU3RyaW5nW10gYXJyKSB7CiAgICAgICAgICAgICAgaWYgKGFyciA9PSBudWxsIHx8IGFyci5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChhcnIubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyclswXSAhPSBudWxsID8gYXJyWzBdIDogIiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKICAgICAgICAgICAgICBzYi5hcHBlbmQoYXJyWzBdKTsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VwYXJhdG9yKS5hcHBlbmQoYXJyW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBibG9jayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cykgewogICAgICAgICAgICAgIEFybXJFdmVudCBldmVudCA9IEFybXJFdmVudC5sb2FkKCJFeGVjdXRlIFJ1bGUiLCAiaGlnaCIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiY29tbWFuZExpbmUiLCBTdHJpbmcudmFsdWVPZihjb21tYW5kV2l0aEFyZ3VtZW50cykpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibWV0aG9kIiwgImphdmEubGFuZy5SdW50aW1lKGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLlN0cmluZ1tdKSIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibXNnIiwgImZvcmtlZCBPUyBwcm9jZXNzIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJhY3QiLCAicHJvdGVjdCIpOwogICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgICAgIGZyYW1lLnJhaXNlRXhjZXB0aW9uKG5ldyBJT0V4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBhbGxvd2VkIikpOwogICAgICAgICAgfQoKICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWxsb3coU3RyaW5nIGNvbW1hbmRXaXRoQXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgQXJtckV2ZW50IGV2ZW50ID0gQXJtckV2ZW50LmxvYWQoIkV4ZWN1dGUgUnVsZSIsICJsb3ciKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImNvbW1hbmRMaW5lIiwgU3RyaW5nLnZhbHVlT2YoY29tbWFuZFdpdGhBcmd1bWVudHMpKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oIm1ldGhvZCIsICJqYXZhLmxhbmcuUnVudGltZShqYXZhLmxhbmcuU3RyaW5nW10sIGphdmEubGFuZy5TdHJpbmdbXSkiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oIm1zZyIsICJmb3JrZWQgT1MgcHJvY2VzcyIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiYWN0IiwgImFsbG93Iik7CiAgICAgICAgICAgICAgZXZlbnQuY29tbWl0KCk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZWN1cml0eUNoZWNrKEphdmFGcmFtZSBmcmFtZSwgU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cykgewogICAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4ZWMgOiBXSElURUxJU1QpIHsKICAgICAgICAgICAgICAgICAgaWYgKGV4ZWMuZXF1YWxzKCIqIikgfHwgY29tbWFuZC5lcXVhbHNJZ25vcmVDYXNlKGV4ZWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tbWFuZFdpdGhBcmd1bWVudHMuZXF1YWxzSWdub3JlQ2FzZShleGVjKSkgewogICAgICAgICAgICAgICAgICAgICAgYWxsb3coY29tbWFuZFdpdGhBcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBpcyB3aGl0ZWxpc3RlZCwgc28gaXQgaGFzIGEgZnJlZSBwYXNzLiBObyBuZWVkIHRvIGRvIGFueSBtb3JlIGJsb2NrSWZNYWxpY2lvdXNzLgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4ZWMgOiBCTEFDS0xJU1QpIHsKICAgICAgICAgICAgICAgICAgaWYgKGV4ZWMuZXF1YWxzKCIqIikgfHwgY29tbWFuZC5lcXVhbHNJZ25vcmVDYXNlKGV4ZWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tbWFuZFdpdGhBcmd1bWVudHMuZXF1YWxzSWdub3JlQ2FzZShleGVjKSkgewogICAgICAgICAgICAgICAgICAgICAgYmxvY2soZnJhbWUsIGNvbW1hbmRXaXRoQXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgIGVuZGNvZGUKICAgIGVuZHBhdGNoCgogICAgcGF0Y2goIlByb2Nlc3MgRm9ya2luZyA6MDUiKToKICAgICAgIGZ1bmN0aW9uKCJqYXZhL2xhbmcvUnVudGltZS5leGVjKFtMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9Qcm9jZXNzOyIpCiAgICAgICBlbnRyeSgpCgogICAgICAgY29kZShsYW5ndWFnZTogamF2YSwgICBpbXBvcnQ6IFsiamF2YS5pby5JT0V4Y2VwdGlvbiJdKToKICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJMQUNLTElTVCA9IHsiKiJ9OyAvLyBibG9jayBhbmQgbG9nIGFsbCBleGVjdXRhYmxlcyAoZXhjZXB0IGlmIGFueSBoYXZlIGJlZW4gd2hpdGVsaXN0ZWQpCi8vICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJMQUNLTElTVCA9IHsiY21kIiwgImNtZC5leGUiLCAiQzpcXFdpbmRvd3NcXFN5c3RlbTMyXFxjbWQiLAovLyAgICAgICAgICAgICAgICAgIkM6XFxXaW5kb3dzXFxTeXN0ZW0zMlxcY21kLmV4ZSIsICJwb3dlcnNoZWxsIiwgImlmY29uZmlnIn07CiAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXSElURUxJU1QgPSB7IiJ9OwovLyAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0hJVEVMSVNUID0geyIqIn07IC8vIGFsbG93IGFuZCBsb2cgYWxsIGV4ZWN1dGFibGVzCgogICAgICAgICAgcHVibGljIHZvaWQgcGF0Y2goSmF2YUZyYW1lIGZyYW1lKSB7CiAgICAgICAgICAgICAgU3RyaW5nW10gY29tbWFuZHMgPSAoU3RyaW5nW10pIGZyYW1lLmxvYWRPYmplY3RWYXJpYWJsZSgxKTsKCiAgICAgICAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwgfHwgY29tbWFuZHNbMF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cyA9IHN0cmluZ0pvaW4oIiAiLCBjb21tYW5kcyk7CiAgICAgICAgICAgICAgc2VjdXJpdHlDaGVjayhmcmFtZSwgY29tbWFuZHNbMF0udHJpbSgpLCBjb21tYW5kV2l0aEFyZ3VtZW50cy50cmltKCkpOwogICAgICAgICAgfQoKICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0pvaW4oU3RyaW5nIHNlcGFyYXRvciwgU3RyaW5nW10gYXJyKSB7CiAgICAgICAgICAgICAgaWYgKGFyciA9PSBudWxsIHx8IGFyci5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChhcnIubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyclswXSAhPSBudWxsID8gYXJyWzBdIDogIiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKICAgICAgICAgICAgICBzYi5hcHBlbmQoYXJyWzBdKTsKICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VwYXJhdG9yKS5hcHBlbmQoYXJyW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBibG9jayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kV2l0aEFyZ3VtZW50cykgewogICAgICAgICAgICAgIEFybXJFdmVudCBldmVudCA9IEFybXJFdmVudC5sb2FkKCJFeGVjdXRlIFJ1bGUiLCAiaGlnaCIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiY29tbWFuZExpbmUiLCBTdHJpbmcudmFsdWVPZihjb21tYW5kV2l0aEFyZ3VtZW50cykpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibWV0aG9kIiwgImphdmEubGFuZy5SdW50aW1lKGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmlvLkZpbGUpIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiZm9ya2VkIE9TIHByb2Nlc3MiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImFjdCIsICJwcm90ZWN0Iik7CiAgICAgICAgICAgICAgZXZlbnQuY29tbWl0KCk7CiAgICAgICAgICAgICAgZnJhbWUucmFpc2VFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IGFsbG93ZWQiKSk7CiAgICAgICAgICB9CgogICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhbGxvdyhTdHJpbmcgY29tbWFuZFdpdGhBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBBcm1yRXZlbnQgZXZlbnQgPSBBcm1yRXZlbnQubG9hZCgiRXhlY3V0ZSBSdWxlIiwgImxvdyIpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigiY29tbWFuZExpbmUiLCBTdHJpbmcudmFsdWVPZihjb21tYW5kV2l0aEFyZ3VtZW50cykpOwogICAgICAgICAgICAgIGV2ZW50LmFkZEV4dGVuc2lvbigibWV0aG9kIiwgImphdmEubGFuZy5SdW50aW1lKGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmlvLkZpbGUpIik7CiAgICAgICAgICAgICAgZXZlbnQuYWRkRXh0ZW5zaW9uKCJtc2ciLCAiZm9ya2VkIE9TIHByb2Nlc3MiKTsKICAgICAgICAgICAgICBldmVudC5hZGRFeHRlbnNpb24oImFjdCIsICJhbGxvdyIpOwogICAgICAgICAgICAgIGV2ZW50LmNvbW1pdCgpOwogICAgICAgICAgfQoKICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VjdXJpdHlDaGVjayhKYXZhRnJhbWUgZnJhbWUsIFN0cmluZyBjb21tYW5kLCBTdHJpbmcgY29tbWFuZFdpdGhBcmd1bWVudHMpIHsKICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogV0hJVEVMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGFsbG93KGNvbW1hbmRXaXRoQXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaXMgd2hpdGVsaXN0ZWQsIHNvIGl0IGhhcyBhIGZyZWUgcGFzcy4gTm8gbmVlZCB0byBkbyBhbnkgbW9yZSBibG9ja0lmTWFsaWNpb3Vzcy4KICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGVjIDogQkxBQ0tMSVNUKSB7CiAgICAgICAgICAgICAgICAgIGlmIChleGVjLmVxdWFscygiKiIpIHx8IGNvbW1hbmQuZXF1YWxzSWdub3JlQ2FzZShleGVjKQogICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbW1hbmRXaXRoQXJndW1lbnRzLmVxdWFsc0lnbm9yZUNhc2UoZXhlYykpIHsKICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKGZyYW1lLCBjb21tYW5kV2l0aEFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICBlbmRjb2RlCiAgICBlbmRwYXRjaAoKZW5kYXBwCg=="}]},"oracleAdvisories":[{"advisory":"Oracle Critical Patch Update October 2012","releaseType":"CPU","quarter":"2012-Q4","url":"https://www.oracle.com/security-alerts/cpuoct2012.html","products":[{"product":"Oracle Fusion Middleware","component":"Report Server Component","affectedVersions":"11.1.1.4, 11.1.1.6, 11.1.2.0"}]}],"assessment":{"record":{"state":"active"},"protection":{"level":"full","mechanisms":["patch-rule"]},"action":{"state":"available","type":"patch-rule"},"review":{"state":"human","basis":"armr-file"}},"exploits":[{"source":"github-poc","url":"https://github.com/abq0/rwsploit","title":"Automated exploitation scanner for Oracle Reports Server (rwservlet) — CVE-2012-3152 / CVE-2012-3153. Detects, fingerprints, reads files via LFI, tests SSRF via webhook, and uploads JSP shells. Targets Oracle Reports \u003c 11g. For authorized use only.","date":"2026-05-15T20:47:50Z","stars":6},{"source":"exploit-db","url":"https://www.exploit-db.com/exploits/31737","title":"Oracle Forms and Reports - Remote Code Execution (Metasploit)","date":"2014-02-18"},{"source":"exploit-db","url":"https://www.exploit-db.com/exploits/31253","title":"Oracle Forms and Reports 11.1 - Arbitrary Code Execution","date":"2014-01-29"}],"signals":{"hasPOC":true,"pocCount":3,"pocSources":["exploit-db","github-poc"],"topStars":6,"firstPOCDate":"2014-01-29"},"kev":{"inKEV":true,"dateAdded":"2021-11-03","dueDate":"2022-05-03","knownRansomwareUse":"Unknown"},"epss":{"available":true,"score":0.98793,"percentile":0.99925},"ssvc":{"available":true,"exploitation":"active","automatable":"yes","technicalImpact":"total"},"lastActivity":"2026-03-04T16:48:46Z"}