LyoKICogCQkJCVNoZWxsIE9yZGluYWwgRnVuY3Rpb25zCiAqCiAqIFRoZXNlIGFyZSBjb21wbGV0ZWx5IHVuZG9jdW1lbnRlZC4gVGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9ucyBjaGFuZ2VzCiAqIGJldHdlZW4gZGlmZmVyZW50IE9TIHZlcnNpb25zIChOVCB1c2VzIFVuaWNvZGUgc3RyaW5ncywgOTUgdXNlcyBBU0NJSQogKiBzdHJpbmdzLCBldGMuIGV0Yy4pCiAqIAogKiBUaGV5IGFyZSBqdXN0IGhlcmUgc28gdGhhdCBleHBsb3Jlci5leGUgYW5kIGlleHBsb3JlLmV4ZSBjYW4gYmUgdGVzdGVkLgogKgogKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICogICAgICAgICAgIDE5OTggSvxyZ2VuIFNjaG1pZWQKICovCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgInNoZWxsLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm5lZXhlLmgiCiNpbmNsdWRlICJyZXNvdXJjZS5oIgojaW5jbHVkZSAiZGxncy5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJncmFwaGljcy5oIgojaW5jbHVkZSAiY3Vyc29yaWNvbi5oIgojaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIgW1NIRUxMMzIuMl0KICogTk9URVMKICogICBJZGxpc3QgaXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcyBhbmQgQ291bnQgc3BlY2lmaWVzIGhvdyBtYW55IGl0ZW1zIGluIHRoZSBhcnJheQogKiAgICh1c3VhbGx5IGp1c3Qgb25lIEkgdGhpbmspLgogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIoCiAgICBIV05EMzIgaHduZCwKICAgIExPTkcgZXZlbnRzMSwKICAgIExPTkcgZXZlbnRzMiwKICAgIERXT1JEIG1zZywKICAgIGludCBjb3VudCwKICAgIElEU1RSVUNUICppZGxpc3QpCnsJRklYTUUoc2hlbGwsIigweCUwNHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDh4LCVwKTpzdHViLlxuIiwKCQlod25kLGV2ZW50czEsZXZlbnRzMixtc2csY291bnQsaWRsaXN0KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlciBbU0hFTEwzMi40XQogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcihMT05HIHgxLExPTkcgeDIpCnsJRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLHgxLHgyKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoSXNSb290IFtTSEVMTDMyLjI5XQogKi8KQk9PTDMyIFdJTkFQSSBQYXRoSXNSb290KExQQ1NUUiB4KSB7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLHgpOwoJaWYgKCFzdHJjbXAoeCsxLCI6XFwiKSkJCS8qICJYOlwiICovCgkJcmV0dXJuIDE7CglpZiAoIXN0cmNtcCh4LCJcXCIpKQkJLyogIlwiICovCgkJcmV0dXJuIDE7CglpZiAoeFswXT09J1xcJyAmJiB4WzFdPT0nXFwnKSB7CQkvKiBVTkMgIlxcPHh4PlwiICovCgkJaW50CWZvdW5kYmFja3NsYXNoID0gMDsKCQl4PXgrMjsKCQl3aGlsZSAoKngpIHsKCQkJaWYgKCp4Kys9PSdcXCcpCgkJCQlmb3VuZGJhY2tzbGFzaCsrOwoJCX0KCQlpZiAoZm91bmRiYWNrc2xhc2g8PTEpCS8qIG1heCAxIFwgbW9yZSAuLi4gKi8KCQkJcmV0dXJuIDE7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEJ1aWxkUm9vdCBbU0hFTEwzMi4zMF0KICovCkxQU1RSIFdJTkFQSSBQYXRoQnVpbGRSb290KExQU1RSIHJvb3QsQllURSBkcml2ZSkgewogIFRSQUNFKHNoZWxsLCIlcCAlaVxuIixyb290LCBkcml2ZSk7CglzdHJjcHkocm9vdCwiQTpcXCIpOwoJcm9vdFswXSs9ZHJpdmU7CglyZXR1cm4gcm9vdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEZpbmRFeHRlbnNpb24gW1NIRUxMMzIuMzFdCiAqCiAqIE5PVEVTCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gbGFzdCAuIGluIGxhc3QgcGF0aGNvbXBvbmVudCBvciBhdCBcMC4KICovCkxQU1RSIFdJTkFQSSBQYXRoRmluZEV4dGVuc2lvbihMUFNUUiBwYXRoKSB7CiAgTFBTVFIgICBsYXN0cG9pbnQgPSBOVUxMOwogIFRSQUNFKHNoZWxsLCIlcCAlc1xuIixwYXRoLHBhdGgpOwogICAgd2hpbGUgKCpwYXRoKSB7CglpZiAoKnBhdGg9PSdcXCd8fCpwYXRoPT0nICcpCgkgICAgbGFzdHBvaW50PU5VTEw7CglpZiAoKnBhdGg9PScuJykKCSAgICBsYXN0cG9pbnQ9cGF0aDsKCXBhdGgrKzsKICAgIH0KICAgIHJldHVybiBsYXN0cG9pbnQ/bGFzdHBvaW50OnBhdGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhBZGRCYWNrc2xhc2ggW1NIRUxMMzIuMzJdCiAqIAogKiBOT1RFUwogKiAgICAgYXBwZW5kIFwgaWYgdGhlcmUgaXMgbm9uZQogKi8KTFBTVFIgV0lOQVBJIFBhdGhBZGRCYWNrc2xhc2goTFBTVFIgcGF0aCkKeyBpbnQgbGVuOwogIFRSQUNFKHNoZWxsLCIlcC0+JXNcbiIscGF0aCxwYXRoKTsKICBsZW4gPSBzdHJsZW4ocGF0aCk7CiAgaWYgKGxlbiAmJiBwYXRoW2xlbi0xXSE9J1xcJykgCgl7IHBhdGhbbGVuKzBdPSdcXCc7CiAgICBwYXRoW2xlbisxXT0nXDAnOwogICAgcmV0dXJuIHBhdGgrbGVuKzE7CiAgfQoJZWxzZQogICAgcmV0dXJuIHBhdGgrbGVuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoUmVtb3ZlQmxhbmtzIFtTSEVMTDMyLjMzXQogKiAKICogTk9URVMKICogICAgIHJlbW92ZSBzcGFjZXMgZnJvbSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBwYXNzZWQgc3RyaW5nCiAqLwpMUFNUUiBXSU5BUEkgUGF0aFJlbW92ZUJsYW5rcyhMUFNUUiBzdHIpCnsgTFBTVFIgeCA9IHN0cjsKICBUUkFDRShzaGVsbCwiJXNcbiIsc3RyKTsKICB3aGlsZSAoKng9PScgJykgeCsrOwogIGlmICh4IT1zdHIpCgkgIHN0cmNweShzdHIseCk7CiAgaWYgKCEqc3RyKQoJICByZXR1cm4gc3RyOwogIHg9c3RyK3N0cmxlbihzdHIpLTE7CiAgd2hpbGUgKCp4PT0nICcpCgkgIHgtLTsKICBpZiAoKng9PScgJykKCSAgKng9J1wwJzsKICByZXR1cm4geDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhGaW5kRmlsZW5hbWUgW1NIRUxMMzIuMzRdCiAqIAogKiBOT1RFUwogKiAgICAgYmFzZW5hbWUoY2hhciAqZm4pOwogKi8KTFBTVFIgV0lOQVBJIFBhdGhGaW5kRmlsZW5hbWUoTFBTVFIgZm4pCnsJTFBTVFIgYmFzZWZuOwoJVFJBQ0Uoc2hlbGwsIiVzXG4iLGZuKTsKICAgIGJhc2VmbiA9IGZuOwogICAgd2hpbGUgKGZuWzBdKSAKICAgIHsgaWYgKCgoZm5bMF09PSdcXCcpIHx8IChmblswXT09JzonKSkgJiYgZm5bMV0gJiYgZm5bMV0hPSdcXCcpCgkgIGJhc2VmbiA9IGZuKzE7CgkgIGZuKys7CiAgICB9CiAgICByZXR1cm4gYmFzZWZuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoUmVtb3ZlRmlsZVNwZWMgW1NIRUxMMzIuMzVdCiAqIAogKiBOT1RFUwogKiAgICAgYm9vbCBnZXRwYXRoKGNoYXIgKnBhdGhuYW1lKTsgdHJ1bmNhdGVzIHBhc3NlZCBhcmd1bWVudCB0byBhIHZhbGlkIHBhdGgKICogICAgIHJldHVybnMgaWYgdGhlIHN0cmluZyB3YXMgbW9kaWZpZWQgb3Igbm90LgogKiAgICAgIlxmb29ceHhcZm9vIi0+ICJcZm9vXHh4IgogKiAgICAgIlwiIC0+ICJcIgogKiAgICAgImE6XGZvbyIJLT4gImE6XCIKICovCkRXT1JEIFdJTkFQSSBQYXRoUmVtb3ZlRmlsZVNwZWMoTFBTVFIgZm4pIHsKCUxQU1RSCXgsY3V0cGxhY2U7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLGZuKTsKCWlmICghZm5bMF0pCgkJcmV0dXJuIDA7Cgl4PWZuOwoJY3V0cGxhY2UgPSBmbjsKCXdoaWxlICgqeCkgewoJCWlmICgqeD09J1xcJykgewoJCQljdXRwbGFjZT14Kys7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoKng9PSc6JykgewoJCQl4Kys7CgkJCWlmICgqeD09J1xcJykKCQkJCWN1dHBsYWNlPSsreDsKCQkJY29udGludWU7IC8qIGFscmVhZHkgeCsrZWQgKi8KCQl9CgkJeCsrOwoJfQoJaWYgKCEqY3V0cGxhY2UpCgkJcmV0dXJuIDA7CglpZiAoY3V0cGxhY2U9PWZuKSB7CgkJaWYgKGZuWzBdPT0nXFwnKSB7CgkJCWlmICghZm5bMV0pCgkJCQlyZXR1cm4gMDsKCQkJZm5bMF09J1wwJzsKCQkJcmV0dXJuIDE7CgkJfQoJfQoJKmN1dHBsYWNlPSdcMCc7CglyZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEFwcGVuZCBbU0hFTEwzMi4zNl0KICogCiAqIE5PVEVTCiAqICAgICBjb25jYXRfcGF0aHMoY2hhcip0YXJnZXQsY29uc3QgY2hhciphZGQpOwogKiAgICAgY29uY2F0cyAidGFyZ2V0XFxhZGQiIGFuZCB3cml0ZXMgdGhlbSB0byB0YXJnZXQKICovCkxQU1RSIFdJTkFQSSBQYXRoQXBwZW5kKExQU1RSIHgxLExQU1RSIHgyKSB7CiAgVFJBQ0Uoc2hlbGwsIiVzICVzXG4iLHgxLHgyKTsKICB3aGlsZSAoeDJbMF09PSdcXCcpIHgyKys7CiAgcmV0dXJuIFBhdGhDb21iaW5lKHgxLHgxLHgyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aENvbWJpbmUgW1NIRUxMMzIuMzddCiAqIAogKiBOT1RFUwogKiAgaWYgbHBzekZpbGU9Jy4nIHNraXAgaXQKICovCkxQU1RSIFdJTkFQSSBQYXRoQ29tYmluZShMUFNUUiBzekRlc3QsIExQQ1NUUiBscHN6RGlyLCBMUENTVFIgbHBzekZpbGUpIAp7CVRSQUNFKHNoZWxsLCIlcyAlc1xuIixscHN6RGlyLGxwc3pGaWxlKTsKCglpZiAoIWxwc3pGaWxlIHx8ICFscHN6RmlsZVswXSB8fCAobHBzekZpbGVbMF09PScuJyAmJiAhbHBzekZpbGVbMV0pICkgCgl7IHN0cmNweShzekRlc3QsbHBzekRpcik7CgkgIHJldHVybiBzekRlc3Q7Cgl9CglzdHJjcHkoc3pEZXN0LGxwc3pEaXIpOwoJUGF0aEFkZEJhY2tzbGFzaChzekRlc3QpOwoJc3RyY2F0KHN6RGVzdCxscHN6RmlsZSk7CglyZXR1cm4gc3pEZXN0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoSXNVTkMgW1NIRUxMMzIuMzldCiAqIAogKiBOT1RFUwogKiAgICAgUGF0aElzVU5DKGNoYXIqcGF0aCk7CiAqLwpCT09MMzIgV0lOQVBJIFBhdGhJc1VOQyhMUENTVFIgcGF0aCkgewogIFRSQUNFKHNoZWxsLCIlc1xuIixwYXRoKTsKCWlmICgocGF0aFswXT09J1xcJykgJiYgKHBhdGhbMV09PSdcXCcpKQoJCXJldHVybiBUUlVFOwoJcmV0dXJuIEZBTFNFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBQYXRoSXNFeGUgW1NIRUxMMzIuNDNdCiAqIAogKi8KQk9PTDMyIFdJTkFQSSBQYXRoSXNFeGUgKExQQ1NUUiBwYXRoKQp7ICBUUkFDRShzaGVsbCwicGF0aD0lc1xuIixwYXRoKTsKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEZpbGVFeGlzdHMgW1NIRUxMMzIuNDVdCiAqIAogKiBOT1RFUwogKiAgICAgZmlsZV9leGlzdHMoY2hhciAqZm4pOwogKi8KQk9PTDMyIFdJTkFQSSBQYXRoRmlsZUV4aXN0cyhMUFNUUiBmbikgewogIFRSQUNFKHNoZWxsLCIlc1xuIixmbik7CiAgIGlmIChHZXRGaWxlQXR0cmlidXRlczMyQShmbik9PS0xKQogICAgCXJldHVybiBGQUxTRTsKICAgIGVsc2UKICAgIAlyZXR1cm4gVFJVRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoTWF0Y2hTcGVjIFtTSEVMTDMyLjQ2XQogKiAKICogTk9URVMKICogICAgIHVzZWQgZnJvbSBDT01ETEczMgogKi8KCkJPT0wzMiBXSU5BUEkgUGF0aE1hdGNoU3BlYyhMUFNUUiB4LCBMUFNUUiB5KSAKewlGSVhNRShzaGVsbCwiJXMgJXMgc3R1YlxuIix4LHkpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhSZXNvbHZlIFtTSEVMTDMyLjUxXQogKi8KRFdPUkQgV0lOQVBJIFBhdGhSZXNvbHZlKExQQ1NUUiBzLERXT1JEIHgyLERXT1JEIHgzKSB7CglGSVhNRShzaGVsbCwiKCVzLDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIscyx4Mix4Myk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEdldEFyZ3MgW1NIRUxMMzIuNTJdCiAqCiAqIE5PVEVTCiAqICAgICBsb29rIGZvciBuZXh0IGFyZyBpbiBzdHJpbmcuIGhhbmRsZSAicXVvdGVkIiBzdHJpbmdzCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKkFGVEVSKiB0aGUgc3BhY2UuIE9yIHRvIHRoZSBcMC4KICovCkxQU1RSIFdJTkFQSSBQYXRoR2V0QXJncyhMUFNUUiBjbWRsaW5lKSB7CiAgICBCT09MMzIJcWZsYWcgPSBGQUxTRTsKICBUUkFDRShzaGVsbCwiJXNcbiIsY21kbGluZSk7CiAgICB3aGlsZSAoKmNtZGxpbmUpIHsKICAgIAlpZiAoKCpjbWRsaW5lPT0nICcpICYmICFxZmxhZykKCQlyZXR1cm4gY21kbGluZSsxOwoJaWYgKCpjbWRsaW5lPT0nIicpCgkJcWZsYWc9IXFmbGFnOwoJY21kbGluZSsrOwogICAgfQogICAgcmV0dXJuIGNtZGxpbmU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhVbnF1b3RlU3BhY2VzIFtTSEVMTDMyLjU2XQogKiAKICogTk9URVMKICogICAgIHVucXVvdGUgc3RyaW5nIChyZW1vdmUgIikKICovClZPSUQgV0lOQVBJIFBhdGhVbnF1b3RlU3BhY2VzKExQU1RSIHN0cikgewogICAgRFdPUkQgICAgICBsZW4gPSBsc3RybGVuMzJBKHN0cik7CiAgICBUUkFDRShzaGVsbCwiJXNcbiIsc3RyKTsKICAgIGlmICgqc3RyIT0nIicpIHJldHVybjsKICAgIGlmIChzdHJbbGVuLTFdIT0nIicpIHJldHVybjsKICAgIHN0cltsZW4tMV09J1wwJzsKICAgIGxzdHJjcHkzMkEoc3RyLHN0cisxKTsKICAgIHJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZCBbU0hFTEwzMi41OF0KICoKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkKExQQ1NUUiBzcmMsRFdPUkQgeDIsTFBTVFIgdGFyZ2V0LERXT1JEIHBhdGhsZW4pIHsKCUZJWE1FKHNoZWxsLCIoJXMsMHglMDhseCwlcCwlbGQpOnN0dWIuXG4iLAoJCXNyYyx4Mix0YXJnZXQscGF0aGxlbgoJKTsKCWlmICghc3JjKQoJCXJldHVybiAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBpY2tJY29uRGxnIFtTSEVMTDMyLjYyXQogKiAKICovCkRXT1JEIFdJTkFQSSBQaWNrSWNvbkRsZyhEV09SRCB4LERXT1JEIHksRFdPUkQgeixEV09SRCBhKSB7CglGSVhNRShzaGVsbCwiKCUwOGx4LCUwOGx4LCUwOGx4LCUwOGx4KTpzdHViLlxuIix4LHkseixhKTsKCXJldHVybiAweGZmZmZmZmZmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXRGaWxlTmFtZUZyb21Ccm93c2UgW1NIRUxMMzIuNjNdCiAqIAogKi8KRFdPUkQgV0lOQVBJIEdldEZpbGVOYW1lRnJvbUJyb3dzZShIV05EMzIgaG93bmVyLCBMUFNUUiB0YXJnZXRidWYsIERXT1JEIGxlbiwgRFdPUkQgeCwgTFBDU1RSIHN1ZmZpeCwgTFBDU1RSIHksIExQQ1NUUiBjbWQpIHsKICAgIEZJWE1FKHNoZWxsLCIoJTA0eCwlcCwlbGQsJTA4bHgsJXMsJXMsJXMpOnN0dWIuXG4iLAoJICAgIGhvd25lcix0YXJnZXRidWYsbGVuLHgsc3VmZml4LHksY21kCiAgICApOwogICAgLyogcHV0cyB1cCBhIE9wZW4gRGlhbG9nIGFuZCByZXF1ZXN0cyBpbnB1dCBpbnRvIHRhcmdldGJ1ZiAqLwogICAgLyogT0ZOX0hJREVSRUFET05MWXxPRk5fTk9DSEFOR0VESVJ8T0ZOX0ZJTEVNVVNURVhJU1R8T0ZOX3Vua25vd24gKi8KICAgIGxzdHJjcHkzMkEodGFyZ2V0YnVmLCJ4OlxcczMuZXhlIik7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRTZXR0aW5ncyBbU0hFTEwzMi42OF0KICogCiAqLwpEV09SRCBXSU5BUEkgU0hHZXRTZXR0aW5ncyhEV09SRCB4LERXT1JEIHksRFdPUkQgeikgewoJRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCgkJeCx5LHoKCSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxfR2V0Q2FjaGVkSW1hZ2VJbmRleCBbU0hFTEwzMi43Ml0KICoKICovCnZvaWQgV0lOQVBJIFNoZWxsX0dldENhY2hlZEltYWdlSW5kZXgoTFBTVFIgeCxEV09SRCB5LERXT1JEIHopIAp7IEZJWE1FKHNoZWxsLCIoJXMsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHgseSx6KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZSBbU0hFTEwzMi43M10KICoKICogUEFSQU1FVEVSUwogKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCiAqICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aAogKiAgdU1zZyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtCiAqICBsUGFyYW0KICoKICogTk9URVMKICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAqICAgIFRoaXMgbWVzc2FnZSBnZXRzIHNlbnQgd2hlbiBhIGNvbHVtbiBnZXRzIGNsaWNrZWQgdG8gaW5zdHJ1Y3QgdGhlCiAqICAgIHNoZWxsIHZpZXcgdG8gcmUtc29ydCB0aGUgaXRlbSBsaXN0LiBsUGFyYW0gaWRlbnRpZmllcyB0aGUgY29sdW1uCiAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAqLwppbnQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoSFdORDMyIGh3bmRDYWJpbmV0LFVJTlQzMiB1TXNnLExQQVJBTSBsUGFyYW0pCnsgRklYTUUoc2hlbGwsIiUwNHggJTA4dXggJTA4bHggc3R1YlxuIixod25kQ2FiaW5ldCx1TXNnLGxQYXJhbSk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhZZXRBbm90aGVyTWFrZVVuaXF1ZU5hbWUgW1NIRUxMMzIuNzVdCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KQk9PTDMyIFdJTkFQSSBQYXRoWWV0QW5vdGhlck1ha2VVbmlxdWVOYW1lKExQRFdPUkQgeCxMUERXT1JEIHkpIHsKICAgIEZJWE1FKHNoZWxsLCIoJXAsJXApOnN0dWIuXG4iLHgseSk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hNYXBQSURMVG9TeXN0ZW1JbWFnZUxpc3RJbmRleCBbU0hFTEwzMi43N10KICoKICogUEFSQU1FVEVSUwogKiB4ICBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIElTaGVsbEZvbGRlciAKICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqCiAqLwpEV09SRCBXSU5BUEkKU0hNYXBQSURMVG9TeXN0ZW1JbWFnZUxpc3RJbmRleChMUFNIRUxMRk9MREVSIHNoLERXT1JEIHksRFdPUkQgeikKeyBGSVhNRShzaGVsbCwiKFNGPSVwLHBpZGw9JTA4bHgsJTA4bHgpOnN0dWIuXG4iLHNoLHkseik7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9sZVN0clRvU3RyTiAgW1NIRUxMMzIuNzhdCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKiBGSVhNRQogKiAgd3JvbmcgaW1wbGVtZW50ZWQgT2xlU3RyIGlzIE5PVCB3aWRlIHN0cmluZyAhISEhIChqc2NoKQogKi8KQk9PTDMyIFdJTkFQSQpPbGVTdHJUb1N0ck4gKExQU1RSIGxwTXVsdGksIElOVDMyIG5NdWx0aSwgTFBDV1NUUiBscFdpZGUsIElOVDMyIG5XaWRlKSB7CiAgICByZXR1cm4gV2lkZUNoYXJUb011bHRpQnl0ZSAoMCwgMCwgbHBXaWRlLCBuV2lkZSwKICAgICAgICBscE11bHRpLCBuTXVsdGksIE5VTEwsIE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJUb09sZVN0ck4gIFtTSEVMTDMyLjc5XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKiBGSVhNRQogKiAgd3JvbmcgaW1wbGVtZW50ZWQgT2xlU3RyIGlzIE5PVCB3aWRlIHN0cmluZyAhISEhIChqc2NoKQoqLwpCT09MMzIgV0lOQVBJClN0clRvT2xlU3RyTiAoTFBXU1RSIGxwV2lkZSwgSU5UMzIgbldpZGUsIExQQ1NUUiBscE11bHRpLCBJTlQzMiBuTXVsdGkpIHsKICAgIHJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyICgwLCAwLCBscE11bHRpLCBuTXVsdGksIGxwV2lkZSwgbldpZGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENsb25lU3BlY2lhbElETGlzdCBbU0hFTEwzMi44OV0KICogCiAqIFBBUkFNRVRFUlMKICogIGh3bmRPd25lciAJW2luXSAKICogIG5Gb2xkZXIgCVtpbl0JQ1NJRExfeHh4eHggPz8KICoKICogUkVUVVJOUwogKiAgcGlkbCA/PwogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KTFBJVEVNSURMSVNUIFdJTkFQSSBTSENsb25lU3BlY2lhbElETGlzdChIV05EMzIgaHduZE93bmVyLERXT1JEIG5Gb2xkZXIsRFdPUkQgeDMpCnsJTFBJVEVNSURMSVNUIHBwaWRsOwoJV0FSTihzaGVsbCwiKGh3bmQ9MHgleCxjc2lkbD0weCVseCwweCVseCk6c2VtaS1zdHViLlxuIiwKCQkJCQkgaHduZE93bmVyLG5Gb2xkZXIseDMpOwoKCVNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uKGh3bmRPd25lciwgbkZvbGRlciwgJnBwaWRsKTsKCglyZXR1cm4gcHBpZGw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElzTEZORHJpdmUgW1NIRUxMMzIuMTE5XQogKiAKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwgTmFtZQogKi8KQk9PTDMyIFdJTkFQSSBJc0xGTkRyaXZlKExQQ1NUUiBwYXRoKSB7CiAgICBEV09SRAlmbmxlbjsKCiAgICBpZiAoIUdldFZvbHVtZUluZm9ybWF0aW9uMzJBKHBhdGgsTlVMTCwwLE5VTEwsJmZubGVuLE5VTEwsTlVMTCwwKSkKCXJldHVybiBGQUxTRTsKICAgIHJldHVybiBmbmxlbj4xMjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCBbU0hFTEwzMi4xNzVdCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8Kdm9pZCBXSU5BUEkgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aChEV09SRCB4MSxEV09SRCB4MixEV09SRCB4MyxEV09SRCB4NCkgewogICAgRklYTUUoc2hlbGwsIigweCUwNGx4LDB4JTA0bHgsY3NpZGw9MHglMDRseCwweCUwNGx4KTpzdHViLlxuIiwKICAgICAgeDEseDIseDMseDQKICAgICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJlZ2lzdGVyU2hlbGxIb29rIFtTSEVMTDMyLjE4MV0KICoKICogUEFSQU1TCiAqICAgICAgaHduZCBbSV0gIHdpbmRvdyBoYW5kbGUKICogICAgICB5ICAgIFtJXSAgZmxhZyA/Pz8/CiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8Kdm9pZCBXSU5BUEkgUmVnaXN0ZXJTaGVsbEhvb2szMihIV05EMzIgaHduZCwgRFdPUkQgeSkgewogICAgRklYTUUoc2hlbGwsIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaHduZCx5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxNZXNzYWdlQm94QSBbU0hFTEwzMi4xODNdCiAqCiAqIEZvcm1hdCBhbmQgb3V0cHV0IGVycm9ybWVzc2FnZS4KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCnZvaWQgX19jZGVjbApTaGVsbE1lc3NhZ2VCb3hBKEhNT0RVTEUzMiBobW9kLEhXTkQzMiBod25kLERXT1JEIGlkLERXT1JEIHgsRFdPUkQgdHlwZSxMUFZPSUQgYXJnbGlzdCkgewoJY2hhcglidWZbMTAwXSxidWYyWzEwMF0vKiwqYnVmMyovOwovKglMUFZPSUQJYXJncyA9ICZhcmdsaXN0OyovCgoJaWYgKCFMb2FkU3RyaW5nMzJBKGhtb2QseCxidWYsMTAwKSkKCQlzdHJjcHkoYnVmLCJEZXNrdG9wIik7Ci8vCUxvYWRTdHJpbmczMkEoaG1vZCxpZCxidWYyLDEwMCk7CgkvKiBGSVhNRTogdGhlIHZhcmFyZ3MgaGFuZGxpbmcgZG9lc24ndC4gKi8KLy8JRm9ybWF0TWVzc2FnZTMyQSgweDUwMCxidWYyLDAsMCwoTFBTVFIpJmJ1ZjMsMjU2LChMUERXT1JEKSZhcmdzKTsKCglGSVhNRShzaGVsbCwiKCUwOGx4LCUwOGx4LCUwOGx4KCVzKSwlMDhseCglcyksJTA4bHgsJXApOnN0dWIuXG4iLAoJCShEV09SRClobW9kLChEV09SRClod25kLGlkLGJ1ZjIseCxidWYsdHlwZSxhcmdsaXN0CgkpOwoJLypNZXNzYWdlQm94MzJBKGh3bmQsYnVmMyxidWYsaWR8MHgxMDAwMCk7Ki8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZXN0cmljdGVkIFtTSEVMTDMyLjEwMF0KICoKICogd2Fsa3MgdGhyb3VnaCBwb2xpY3kgdGFibGUsIHF1ZXJpZXMgPGFwcD4ga2V5LCA8dHlwZT4gdmFsdWUsIHJldHVybnMgCiAqIHF1ZXJpZWQgKERXT1JEKSB2YWx1ZS4KICogezB4MDAwMDEsRXhwbG9yZXIsTm9SdW59CiAqIHsweDAwMDAyLEV4cGxvcmVyLE5vQ2xvc2V9CiAqIHsweDAwMDA0LEV4cGxvcmVyLE5vU2F2ZVNldHRpbmdzfQogKiB7MHgwMDAwOCxFeHBsb3JlcixOb0ZpbGVNZW51fQogKiB7MHgwMDAxMCxFeHBsb3JlcixOb1NldEZvbGRlcnN9CiAqIHsweDAwMDIwLEV4cGxvcmVyLE5vU2V0VGFza2Jhcn0KICogezB4MDAwNDAsRXhwbG9yZXIsTm9EZXNrdG9wfQogKiB7MHgwMDA4MCxFeHBsb3JlcixOb0ZpbmR9CiAqIHsweDAwMTAwLEV4cGxvcmVyLE5vRHJpdmVzfQogKiB7MHgwMDIwMCxFeHBsb3JlcixOb0RyaXZlQXV0b1J1bn0KICogezB4MDA0MDAsRXhwbG9yZXIsTm9Ecml2ZVR5cGVBdXRvUnVufQogKiB7MHgwMDgwMCxFeHBsb3JlcixOb05ldEhvb2R9CiAqIHsweDAxMDAwLEV4cGxvcmVyLE5vU3RhcnRCYW5uZXJ9CiAqIHsweDAyMDAwLEV4cGxvcmVyLFJlc3RyaWN0UnVufQogKiB7MHgwNDAwMCxFeHBsb3JlcixOb1ByaW50ZXJUYWJzfQogKiB7MHgwODAwMCxFeHBsb3JlcixOb0RlbGV0ZVByaW50ZXJ9CiAqIHsweDEwMDAwLEV4cGxvcmVyLE5vQWRkUHJpbnRlcn0KICogezB4MjAwMDAsRXhwbG9yZXIsTm9TdGFydE1lbnVTdWJGb2xkZXJzfQogKiB7MHg0MDAwMCxFeHBsb3JlcixNeURvY3NPbk5ldH0KICogezB4ODAwMDAsV2luT2xkQXBwLE5vUmVhbE1vZGV9CiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hSZXN0cmljdGVkIChEV09SRCBwb2wpIHsKCUhLRVkJeGhrZXk7CgoJRklYTUUoc2hlbGwsIiglMDhseCk6c3R1Yi5cbiIscG9sKTsKCWlmIChSZWdPcGVuS2V5MzJBKEhLRVlfQ1VSUkVOVF9VU0VSLCJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXMiLCZ4aGtleSkpCgkJcmV0dXJuIDA7CgkvKiBGSVhNRTogZG8gbm90aGluZyBmb3Igbm93LCBqdXN0IHJldHVybiAwICg9PSAiYWxsb3dlZCIpICovCglSZWdDbG9zZUtleSh4aGtleSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEdldEV4dGVuc2lvbiBbU0hFTEwzMi4xNThdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpMUFNUUiBXSU5BUEkgUGF0aEdldEV4dGVuc2lvbihMUFNUUiBwYXRoLERXT1JEIHksRFdPUkQgeikKeyBUUkFDRShzaGVsbCwiKCVzLCUwOGx4LCUwOGx4KVxuIixwYXRoLHkseik7CiAgICBwYXRoID0gUGF0aEZpbmRFeHRlbnNpb24ocGF0aCk7CiAgICByZXR1cm4gKnBhdGg/KHBhdGgrMSk6cGF0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVEaXJlY3RvcnkgW1NIRUxMMzIuMTY1XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKiAgbm90IHN1cmUgYWJvdXQgTFBTRUNVUklUWV9BVFRSSUJVVEVTCiAqLwpEV09SRCBXSU5BUEkgU0hDcmVhdGVEaXJlY3RvcnkoTFBTRUNVUklUWV9BVFRSSUJVVEVTIHNlYyxMUENTVFIgcGF0aCkgewoJVFJBQ0Uoc2hlbGwsIiglcCwlcyk6c3R1Yi5cbiIsc2VjLHBhdGgpOwoJaWYgKENyZWF0ZURpcmVjdG9yeTMyQShwYXRoLHNlYykpCgkJcmV0dXJuIFRSVUU7CgkvKiBTSENoYW5nZU5vdGlmeSg4LDEscGF0aCwwKTsgKi8KCXJldHVybiBGQUxTRTsKI2lmIDAKCWlmIChTSEVMTDMyXzc5KHBhdGgsKExQVk9JRCl4KSkKCQlyZXR1cm4gMDsKCUZJWE1FKHNoZWxsLCIoJTA4bHgsJXMpOnN0dWIuXG4iLHgscGF0aCk7CglyZXR1cm4gMDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZSBbU0hFTEwzMi4xOTVdCiAqCiAqIE5PVEVTCiAqICAgICBmcmVlX3B0cigpIC0gZnJlZXMgbWVtb3J5IHVzaW5nIElNYWxsb2MKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSEZyZWUoTFBWT0lEIHgpIHsKICBUUkFDRShzaGVsbCwiJXBcbiIseCk7CiAgLypyZXR1cm4gTG9jYWxGcmVlMzIoKEhBTkRMRTMyKXgpOyovIC8qIGNyYXNoZXMgKi8KICByZXR1cm4gSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jIFtTSEVMTDMyLjE5Nl0KICoKICogTk9URVMKICogICAgIHZvaWQgKnRhc2tfYWxsb2MoRFdPUkQgbGVuKSwgdXNlcyBTSE1hbGxvYyBhbGxvY2F0b3IKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkxQVk9JRCBXSU5BUEkgU0hBbGxvYyhEV09SRCBsZW4pIHsKIC8qIHZvaWQgKiByZXQgPSAoTFBWT0lEKUxvY2FsQWxsb2MzMihsZW4sTE1FTV9aRVJPSU5JVCk7Ki8gLyogY2hyYXNoZXMgKi8KIHZvaWQgKiByZXQgPSAoTFBWT0lEKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7CiAgVFJBQ0Uoc2hlbGwsIiVsdSBieXRlcyBhdCAlcFxuIixsZW4sIHJldCk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT3BlblJlZ1N0cmVhbSBbU0hFTEwzMi44NV0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBPcGVuUmVnU3RyZWFtKERXT1JEIHgxLERXT1JEIHgyLERXT1JEIHgzLERXT1JEIHg0KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLAogICAgCXgxLHgyLHgzLHg0CiAgICApOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnaXN0ZXJEcmFnRHJvcCBbU0hFTEwzMi44Nl0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJlZ2lzdGVyRHJhZ0Ryb3AoSFdORDMyIGh3bmQsRFdPUkQgeDIpIHsKICAgIEZJWE1FIChzaGVsbCwgIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsIGh3bmQsIHgyKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJldm9rZURyYWdEcm9wIFtTSEVMTDMyLjg3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmV2b2tlRHJhZ0Ryb3AoRFdPUkQgeCkgewogICAgRklYTUUoc2hlbGwsIigweCUwOGx4KTpzdHViLlxuIix4KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5GaWxlRGxnIFtTSEVMTDMyLjYxXQogKgogKiBOT1RFUwogKiAgICAgT3JpZ2luYWwgbmFtZTogUnVuRmlsZURsZyAoZXhwb3J0ZWQgYnkgb3JkaW5hbCkKICovCkRXT1JEIFdJTkFQSQpSdW5GaWxlRGxnIChIV05EMzIgaHduZE93bmVyLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsCgkgICAgTFBTVFIgbHBzelRpdGxlLCBMUFNUUiBscHN6UHJvbXB0LCBVSU5UMzIgdUZsYWdzKQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCUwOHggMHglbHggMHglbHggXCIlc1wiIFwiJXNcIiAweCV4KTpzdHViLlxuIiwKCSAgIGh3bmRPd25lciwgZHdQYXJhbTEsIGR3UGFyYW0yLCBscHN6VGl0bGUsIGxwc3pQcm9tcHQsIHVGbGFncyk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRXhpdFdpbmRvd3NEaWFsb2cgW1NIRUxMMzIuNjBdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKRXhpdFdpbmRvd3NEaWFsb2cgKEhXTkQzMiBod25kT3duZXIpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JTA4eCk6c3R1Yi5cbiIsIGh3bmRPd25lcik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQXJyYW5nZVdpbmRvd3MgW1NIRUxMMzIuMTg0XQogKiAKICovCkRXT1JEIFdJTkFQSQpBcnJhbmdlV2luZG93cyAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMywKCQlEV09SRCBkd1BhcmFtNCwgRFdPUkQgZHdQYXJhbTUpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4KTpzdHViLlxuIiwKCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgZHdQYXJhbTMsIGR3UGFyYW00LCBkd1BhcmFtNSk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDTFNJREZyb21TdHJpbmcgW1NIRUxMMzIuMTQ3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJClNIQ0xTSURGcm9tU3RyaW5nIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JWx4IDB4JWx4KTpzdHViLlxuIiwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKICAgIEZJWE1FIChzaGVsbCwiKFwiJXNcIiBcIiVzXCIpOnN0dWIuXG4iLCAoTFBTVFIpZHdQYXJhbTEsIChMUFNUUilkd1BhcmFtMik7CgogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaWduYWxGaWxlT3BlbiBbU0hFTEwzMi4xMDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKU2lnbmFsRmlsZU9wZW4gKERXT1JEIGR3UGFyYW0xKQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCUwOGx4KTpzdHViLlxuIiwgZHdQYXJhbTEpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFkZFRvUmVjZW50RG9jcyBbU0hFTEwzMi4yMzRdCiAqCiAqIFBBUkFNRVRFUlMKICogICB1RmxhZ3MgIFtJTl0gU0hBUkRfUEFUSCBvciBTSEFSRF9QSURMCiAqICAgcHYgICAgICBbSU5dIHN0cmluZyBvciBwaWRsLCBOVUxMIGNsZWFycyB0aGUgbGlzdAogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KRFdPUkQgV0lOQVBJIFNIQWRkVG9SZWNlbnREb2NzMzIgKFVJTlQzMiB1RmxhZ3MsTFBDVk9JRCBwdikgICAKeyBpZiAoU0hBUkRfUElETD09dUZsYWdzKQogIHsgRklYTUUgKHNoZWxsLCIoMHglMDh4LHBpZGw9JXApOnN0dWIuXG4iLCB1RmxhZ3MscHYpOwoJfQoJZWxzZQoJeyBGSVhNRSAoc2hlbGwsIigweCUwOHgsJXMpOnN0dWIuXG4iLCB1RmxhZ3MsKGNoYXIqKXB2KTsKCX0KICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaWxlT3BlcmF0aW9uIFtTSEVMTDMyLjI0Ml0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSEZpbGVPcGVyYXRpb24zMiAoCiAgICBMUFNIRklMRU9QU1RSVUNUMzJBIGxwRmlsZU9wKSAgIAp7IEZJWE1FIChzaGVsbCwiKCVwKTpzdHViLlxuIiwgbHBGaWxlT3ApOwogIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENoYW5nZU5vdGlmeSBbU0hFTEwzMi4yMzldCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hDaGFuZ2VOb3RpZnkzMiAoCiAgICBJTlQzMiAgIHdFdmVudElkLCAgLyogW0lOXSBmbGFncyB0aGF0IHNwZWNpZmllcyB0aGUgZXZlbnQqLwogICAgVUlOVDMyICB1RmxhZ3MsICAgLyogW0lOXSB0aGUgbWVhbmluZyBvZiBkd0l0ZW1bMXwyXSovCgkJTFBDVk9JRCBkd0l0ZW0xLAoJCUxQQ1ZPSUQgZHdJdGVtMikKeyBGSVhNRSAoc2hlbGwsIigweCUwOHgsMHglMDh1eCwlcCwlcCk6c3R1Yi5cbiIsIHdFdmVudElkLHVGbGFncyxkd0l0ZW0xLGR3SXRlbTIpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXggW1NIRUxMMzIuMTc0XQogKgogKiBOT1RFUwogKiAgc2VlIElTaGVsbEZvbGRlcjo6Q3JlYXRlVmlld09iamVjdAogKi8KSFJFU1VMVCBXSU5BUEkgU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeDMyKAogIExQU0hFTExWSUVXREFUQSBwc3ZjYmksIC8qW2luIF0gc2hlbGx0ZW1wbGF0ZSBzdHJ1Y3QqLwogIExQVk9JRCogcHB2KSAgICAgICAgICAgIC8qW291dF0gSVNoZWxsVmlldyBwb2ludGVyKi8KeyBGSVhNRSAoc2hlbGwsIiglcCwlcCk6c3R1Yi5cbiIsIHBzdmNiaSxwcHYpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRmluZF9Jbml0TWVudVBvcHVwIFtTSEVMTDMyLjE0OV0KICoKICogTk9URVMKICogIFJlZ2lzdGVycyB0aGUgbWVudSBiZWhpbmQgdGhlICJTdGFydCIgYnV0dG9uCiAqCiAqIFBBUkFNRVRFUlMKICogIGhNZW51CQlbaW5dIGhhbmRlbCBvZiBtZW51IHByZXZpb3VzbHkgY3JlYXRlZAogKiAgaFduZFBhcmVudAlbaW5dIHBhcmVudCB3aW5kb3cKICogIHcJCQlbaW5dIG5vIHBvaW50ZXIKICogIHgJCQlbaW5dIG5vIHBvaW50ZXIKICovCkhSRVNVTFQgV0lOQVBJIFNIRmluZF9Jbml0TWVudVBvcHVwIChITUVOVTMyIGhNZW51LCBIV05EMzIgaFduZFBhcmVudCwgRFdPUkQgdywgRFdPUkQgeCkKewlGSVhNRShzaGVsbCwiaG1lbnU9MHglMDh4IGh3bmQ9MHglMDh4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLAoJCWhNZW51LGhXbmRQYXJlbnQsdyx4KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVNZW51X0luaXRNZW51UG9wdXAgW1NIRUxMMzIuMTA5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfSW5pdE1lbnVQb3B1cCAoRFdPUkQgaG1lbnUpCnsJRklYTUUoc2hlbGwsImhtZW51PTB4JWx4IHN0dWJcbiIsaG1lbnUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZU1lbnVfQ3JlYXRlIFtTSEVMTDMyLjExNF0KICoKICogdyByZXR2YWwgZnJvbSBMb2FkQml0bWFwQQogKgogKgogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfQ3JlYXRlIChEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7IEZJWE1FKHNoZWxsLCIweCUwOGx4IDB4JTA4bHggaGJtcD0weCVseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LHYsdyx4LHopOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVNZW51X1RyYWNrUG9wdXBNZW51RXggW1NIRUxMMzIuMTE2XQogKgogKiBQQVJBTUVURVJTCiAqICB1RmxhZ3MJCVtpbl0JYWNjb3JkaW5nIHRvIFRyYWNrUG9wdXBNZW51RXgKICogIHBvc1gJCVtpbl0KICogIHBvc1kJCVtpbl0KICogIGhXbmRQYXJlbnQJCVtpbl0KICogIHoJY291bGQgYmUgcmVjdCAodHJhY2UpIG9yIFRQTVBBUkFNUyAoVHJhY2tQb3B1cE1lbnVFeCkKICovCkhSRVNVTFQgV0lOQVBJIEZpbGVNZW51X1RyYWNrUG9wdXBNZW51RXggKERXT1JEIHQsIERXT1JEIHVGbGFncywgRFdPUkQgcG9zWCwgRFdPUkQgcG9zWSwgSFdORDMyIGhXbmRQYXJlbnQsIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JWx4IGZsYWdzPTB4JWx4IHBvc3g9MHglbHggcG9zeT0weCVseCBod25kcD0weCV4IDB4JWx4IHN0dWJcbiIsCgkJdCx1RmxhZ3MscG9zWCxwb3NZLCBoV25kUGFyZW50LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIV2luSGVscCBbU0hFTEwzMi4xMjddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFdpbkhlbHAgKERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix2LHcseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFJ1bkNvbnJvbFBhbmVsIFtTSEVMTDMyLjE2MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUnVuQ29ucm9sUGFuZWwgKERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeCBbU0hFTEwzMi4yOTFdCiAqCiAqLwpCT09MMzIgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4MzJBIChMUFNIRUxMRVhFQ1VURUlORk8zMkEgc2VpKQp7IAlDSEFSIHN6VGVtcFtNQVhfUEFUSF07CgogIAlGSVhNRShzaGVsbCwiKCVwKTogc3R1YlxuIixzZWkpOwoKCWlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfSURMSVNUKQoJeyBTSEdldFBhdGhGcm9tSURMaXN0MzJBIChzZWktPmxwSURMaXN0LHN6VGVtcCk7CgkgIFRSQUNFIChzaGVsbCwiLS0gaWRsaXN0PSVwICglcylcbiIsIHNlaS0+bHBJRExpc3QsIHN6VGVtcCk7Cgl9CgoJaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpCgl7IFRSQUNFIChzaGVsbCwiLS0gY2xhc3NuYW1lPSAlc1xuIiwgc2VpLT5scENsYXNzKTsKCX0KICAgIAoJaWYgKHNlaS0+bHBWZXJiKQoJeyBUUkFDRSAoc2hlbGwsIi0tIGFjdGlvbj0lc1xuIiwgc2VpLT5scFZlcmIpOwoJfQoJCglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIgW1NIRUxMMzIuMTc2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hTZXRJbnN0YW5jZUV4cGxvcmVyIChEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldEluc3RhbmNlRXhwbG9yZXIgW1NIRUxMMzIuMjU2XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hHZXRJbnN0YW5jZUV4cGxvcmVyIChEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVVbnVzZWRMaWJyYXJpZXMgW1NIRUxMMzIuMTIzXQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hGcmVlVW51c2VkTGlicmFyaWVzIChEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfU2hvd0RyYWdJbWFnZSBbU0hFTEwzMi4xMzddCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBEQURfU2hvd0RyYWdJbWFnZSAoRFdPUkQgdSkKeyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVNZW51X0Rlc3Ryb3kgW1NIRUxMMzIuMTE4XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfRGVzdHJveSAoRFdPUkQgdSkKeyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0RGF0YUZyb21JRExpc3RBIFtTSEVMTDMyLjI0N10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0RGF0YUZyb21JRExpc3RBKERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHkpCnsJRklYTUUoc2hlbGwsIjB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdix3LHgseSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZpbGVPcGVyYXRpb25BIFtTSEVMTDMyLjI0M10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIRmlsZU9wZXJhdGlvbkEoRFdPUkQgeCkKewlGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHgpOwoJcmV0dXJuIDA7Cgp9Cg==