LyoKICogCQkJCVNoZWxsIE9yZGluYWwgRnVuY3Rpb25zCiAqCiAqIFRoZXNlIGFyZSBjb21wbGV0ZWx5IHVuZG9jdW1lbnRlZC4gVGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9ucyBjaGFuZ2VzCiAqIGJldHdlZW4gZGlmZmVyZW50IE9TIHZlcnNpb25zIChOVCB1c2VzIFVuaWNvZGUgc3RyaW5ncywgOTUgdXNlcyBBU0NJSQogKiBzdHJpbmdzLCBldGMuIGV0Yy4pCiAqIAogKiBUaGV5IGFyZSBqdXN0IGhlcmUgc28gdGhhdCBleHBsb3Jlci5leGUgYW5kIGlleHBsb3JlLmV4ZSBjYW4gYmUgdGVzdGVkLgogKgogKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICogICAgICAgICAgIDE5OTggSvxyZ2VuIFNjaG1pZWQKICovCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgInNoZWxsLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm5lZXhlLmgiCiNpbmNsdWRlICJyZXNvdXJjZS5oIgojaW5jbHVkZSAiZGxncy5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJncmFwaGljcy5oIgojaW5jbHVkZSAiY3Vyc29yaWNvbi5oIgojaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIgW1NIRUxMMzIuMl0KICogTk9URVMKICogICBJZGxpc3QgaXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcyBhbmQgQ291bnQgc3BlY2lmaWVzIGhvdyBtYW55IGl0ZW1zIGluIHRoZSBhcnJheQogKiAgICh1c3VhbGx5IGp1c3Qgb25lIEkgdGhpbmspLgogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIoCiAgICBIV05EMzIgaHduZCwKICAgIExPTkcgZXZlbnRzMSwKICAgIExPTkcgZXZlbnRzMiwKICAgIERXT1JEIG1zZywKICAgIGludCBjb3VudCwKICAgIElEU1RSVUNUICppZGxpc3QpCnsJRklYTUUoc2hlbGwsIigweCUwNHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDh4LCVwKTpzdHViLlxuIiwKCQlod25kLGV2ZW50czEsZXZlbnRzMixtc2csY291bnQsaWRsaXN0KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlciBbU0hFTEwzMi40XQogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcihMT05HIHgxLExPTkcgeDIpCnsJRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLHgxLHgyKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoSXNSb290IFtTSEVMTDMyLjI5XQogKi8KQk9PTDMyIFdJTkFQSSBQYXRoSXNSb290KExQQ1NUUiB4KSB7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLHgpOwoJaWYgKCFzdHJjbXAoeCsxLCI6XFwiKSkJCS8qICJYOlwiICovCgkJcmV0dXJuIDE7CglpZiAoIXN0cmNtcCh4LCJcXCIpKQkJLyogIlwiICovCgkJcmV0dXJuIDE7CglpZiAoeFswXT09J1xcJyAmJiB4WzFdPT0nXFwnKSB7CQkvKiBVTkMgIlxcPHh4PlwiICovCgkJaW50CWZvdW5kYmFja3NsYXNoID0gMDsKCQl4PXgrMjsKCQl3aGlsZSAoKngpIHsKCQkJaWYgKCp4Kys9PSdcXCcpCgkJCQlmb3VuZGJhY2tzbGFzaCsrOwoJCX0KCQlpZiAoZm91bmRiYWNrc2xhc2g8PTEpCS8qIG1heCAxIFwgbW9yZSAuLi4gKi8KCQkJcmV0dXJuIDE7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEJ1aWxkUm9vdCBbU0hFTEwzMi4zMF0KICovCkxQU1RSIFdJTkFQSSBQYXRoQnVpbGRSb290KExQU1RSIHJvb3QsQllURSBkcml2ZSkgewogIFRSQUNFKHNoZWxsLCIlcCAlaVxuIixyb290LCBkcml2ZSk7CglzdHJjcHkocm9vdCwiQTpcXCIpOwoJcm9vdFswXSs9ZHJpdmU7CglyZXR1cm4gcm9vdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEZpbmRFeHRlbnNpb24gW1NIRUxMMzIuMzFdCiAqCiAqIE5PVEVTCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gbGFzdCAuIGluIGxhc3QgcGF0aGNvbXBvbmVudCBvciBhdCBcMC4KICovCkxQU1RSIFdJTkFQSSBQYXRoRmluZEV4dGVuc2lvbihMUFNUUiBwYXRoKSB7CiAgTFBTVFIgICBsYXN0cG9pbnQgPSBOVUxMOwogIFRSQUNFKHNoZWxsLCIlcCAlc1xuIixwYXRoLHBhdGgpOwogICAgd2hpbGUgKCpwYXRoKSB7CglpZiAoKnBhdGg9PSdcXCd8fCpwYXRoPT0nICcpCgkgICAgbGFzdHBvaW50PU5VTEw7CglpZiAoKnBhdGg9PScuJykKCSAgICBsYXN0cG9pbnQ9cGF0aDsKCXBhdGgrKzsKICAgIH0KICAgIHJldHVybiBsYXN0cG9pbnQ/bGFzdHBvaW50OnBhdGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhBZGRCYWNrc2xhc2ggW1NIRUxMMzIuMzJdCiAqIAogKiBOT1RFUwogKiAgICAgYXBwZW5kIFwgaWYgdGhlcmUgaXMgbm9uZQogKi8KTFBTVFIgV0lOQVBJIFBhdGhBZGRCYWNrc2xhc2goTFBTVFIgcGF0aCkKeyBpbnQgbGVuOwogIFRSQUNFKHNoZWxsLCIlcC0+JXNcbiIscGF0aCxwYXRoKTsKICBsZW4gPSBzdHJsZW4ocGF0aCk7CiAgaWYgKGxlbiAmJiBwYXRoW2xlbi0xXSE9J1xcJykgCgl7IHBhdGhbbGVuKzBdPSdcXCc7CiAgICBwYXRoW2xlbisxXT0nXDAnOwogICAgcmV0dXJuIHBhdGgrbGVuKzE7CiAgfQoJZWxzZQogICAgcmV0dXJuIHBhdGgrbGVuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoUmVtb3ZlQmxhbmtzIFtTSEVMTDMyLjMzXQogKiAKICogTk9URVMKICogICAgIHJlbW92ZSBzcGFjZXMgZnJvbSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBwYXNzZWQgc3RyaW5nCiAqLwpMUFNUUiBXSU5BUEkgUGF0aFJlbW92ZUJsYW5rcyhMUFNUUiBzdHIpCnsgTFBTVFIgeCA9IHN0cjsKICBUUkFDRShzaGVsbCwiJXNcbiIsc3RyKTsKICB3aGlsZSAoKng9PScgJykgeCsrOwogIGlmICh4IT1zdHIpCgkgIHN0cmNweShzdHIseCk7CiAgaWYgKCEqc3RyKQoJICByZXR1cm4gc3RyOwogIHg9c3RyK3N0cmxlbihzdHIpLTE7CiAgd2hpbGUgKCp4PT0nICcpCgkgIHgtLTsKICBpZiAoKng9PScgJykKCSAgKng9J1wwJzsKICByZXR1cm4geDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhGaW5kRmlsZW5hbWUgW1NIRUxMMzIuMzRdCiAqIAogKiBOT1RFUwogKiAgICAgYmFzZW5hbWUoY2hhciAqZm4pOwogKi8KTFBTVFIgV0lOQVBJIFBhdGhGaW5kRmlsZW5hbWUoTFBTVFIgZm4pCnsJTFBTVFIgYmFzZWZuOwoJVFJBQ0Uoc2hlbGwsIiVzXG4iLGZuKTsKICAgIGJhc2VmbiA9IGZuOwogICAgd2hpbGUgKGZuWzBdKSAKICAgIHsgaWYgKCgoZm5bMF09PSdcXCcpIHx8IChmblswXT09JzonKSkgJiYgZm5bMV0gJiYgZm5bMV0hPSdcXCcpCgkgIGJhc2VmbiA9IGZuKzE7CgkgIGZuKys7CiAgICB9CiAgICByZXR1cm4gYmFzZWZuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoUmVtb3ZlRmlsZVNwZWMgW1NIRUxMMzIuMzVdCiAqIAogKiBOT1RFUwogKiAgICAgYm9vbCBnZXRwYXRoKGNoYXIgKnBhdGhuYW1lKTsgdHJ1bmNhdGVzIHBhc3NlZCBhcmd1bWVudCB0byBhIHZhbGlkIHBhdGgKICogICAgIHJldHVybnMgaWYgdGhlIHN0cmluZyB3YXMgbW9kaWZpZWQgb3Igbm90LgogKiAgICAgIlxmb29ceHhcZm9vIi0+ICJcZm9vXHh4IgogKiAgICAgIlwiIC0+ICJcIgogKiAgICAgImE6XGZvbyIJLT4gImE6XCIKICovCkRXT1JEIFdJTkFQSSBQYXRoUmVtb3ZlRmlsZVNwZWMoTFBTVFIgZm4pIHsKCUxQU1RSCXgsY3V0cGxhY2U7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLGZuKTsKCWlmICghZm5bMF0pCgkJcmV0dXJuIDA7Cgl4PWZuOwoJY3V0cGxhY2UgPSBmbjsKCXdoaWxlICgqeCkgewoJCWlmICgqeD09J1xcJykgewoJCQljdXRwbGFjZT14Kys7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoKng9PSc6JykgewoJCQl4Kys7CgkJCWlmICgqeD09J1xcJykKCQkJCWN1dHBsYWNlPSsreDsKCQkJY29udGludWU7IC8qIGFscmVhZHkgeCsrZWQgKi8KCQl9CgkJeCsrOwoJfQoJaWYgKCEqY3V0cGxhY2UpCgkJcmV0dXJuIDA7CglpZiAoY3V0cGxhY2U9PWZuKSB7CgkJaWYgKGZuWzBdPT0nXFwnKSB7CgkJCWlmICghZm5bMV0pCgkJCQlyZXR1cm4gMDsKCQkJZm5bMF09J1wwJzsKCQkJcmV0dXJuIDE7CgkJfQoJfQoJKmN1dHBsYWNlPSdcMCc7CglyZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEFwcGVuZCBbU0hFTEwzMi4zNl0KICogCiAqIE5PVEVTCiAqICAgICBjb25jYXRfcGF0aHMoY2hhcip0YXJnZXQsY29uc3QgY2hhciphZGQpOwogKiAgICAgY29uY2F0cyAidGFyZ2V0XFxhZGQiIGFuZCB3cml0ZXMgdGhlbSB0byB0YXJnZXQKICovCkxQU1RSIFdJTkFQSSBQYXRoQXBwZW5kKExQU1RSIHgxLExQU1RSIHgyKSB7CiAgVFJBQ0Uoc2hlbGwsIiVzICVzXG4iLHgxLHgyKTsKICB3aGlsZSAoeDJbMF09PSdcXCcpIHgyKys7CiAgcmV0dXJuIFBhdGhDb21iaW5lKHgxLHgxLHgyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aENvbWJpbmUgW1NIRUxMMzIuMzddCiAqIAogKiBOT1RFUwogKiAgICAgY29uY2F0X3BhdGhzKGNoYXIqdGFyZ2V0LGNvbnN0IGNoYXIqYWRkKTsKICogICAgIGNvbmNhdHMgInRhcmdldFxcYWRkIiBhbmQgd3JpdGVzIHRoZW0gdG8gdGFyZ2V0CiAqLwpMUFNUUiBXSU5BUEkgUGF0aENvbWJpbmUoTFBTVFIgdGFyZ2V0LExQU1RSIHgxLExQU1RSIHgyKSB7CgljaGFyCWJ1ZlsyNjBdOwogIFRSQUNFKHNoZWxsLCIlcyAlc1xuIix4MSx4Mik7CglpZiAoIXgyIHx8ICF4MlswXSkgewoJCWxzdHJjcHkzMkEodGFyZ2V0LHgxKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfQoJbHN0cmNweTMyQShidWYseDEpOwoJUGF0aEFkZEJhY2tzbGFzaChidWYpOyAvKiBhcHBlbmQgXCBpZiBub3QgdGhlcmUgKi8KCWxzdHJjYXQzMkEoYnVmLHgyKTsKCWxzdHJjcHkzMkEodGFyZ2V0LGJ1Zik7CglyZXR1cm4gdGFyZ2V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoSXNVTkMgW1NIRUxMMzIuMzldCiAqIAogKiBOT1RFUwogKiAgICAgaXNVTkMoY29uc3QgY2hhcipwYXRoKTsKICovCkJPT0wzMiBXSU5BUEkgUGF0aElzVU5DKExQQ1NUUiBwYXRoKSB7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLHBhdGgpOwoJaWYgKChwYXRoWzBdPT0nXFwnKSAmJiAocGF0aFsxXT09J1xcJykpCgkJcmV0dXJuIFRSVUU7CglyZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhGaWxlRXhpc3RzIFtTSEVMTDMyLjQ1XQogKiAKICogTk9URVMKICogICAgIGZpbGVfZXhpc3RzKGNoYXIgKmZuKTsKICovCkJPT0wzMiBXSU5BUEkgUGF0aEZpbGVFeGlzdHMoTFBTVFIgZm4pIHsKICBUUkFDRShzaGVsbCwiJXNcbiIsZm4pOwogICBpZiAoR2V0RmlsZUF0dHJpYnV0ZXMzMkEoZm4pPT0tMSkKICAgIAlyZXR1cm4gRkFMU0U7CiAgICBlbHNlCiAgICAJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhSZXNvbHZlIFtTSEVMTDMyLjUxXQogKi8KRFdPUkQgV0lOQVBJIFBhdGhSZXNvbHZlKExQQ1NUUiBzLERXT1JEIHgyLERXT1JEIHgzKSB7CglGSVhNRShzaGVsbCwiKCVzLDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIscyx4Mix4Myk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEdldEFyZ3MgW1NIRUxMMzIuNTJdCiAqCiAqIE5PVEVTCiAqICAgICBsb29rIGZvciBuZXh0IGFyZyBpbiBzdHJpbmcuIGhhbmRsZSAicXVvdGVkIiBzdHJpbmdzCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKkFGVEVSKiB0aGUgc3BhY2UuIE9yIHRvIHRoZSBcMC4KICovCkxQU1RSIFdJTkFQSSBQYXRoR2V0QXJncyhMUFNUUiBjbWRsaW5lKSB7CiAgICBCT09MMzIJcWZsYWcgPSBGQUxTRTsKICBUUkFDRShzaGVsbCwiJXNcbiIsY21kbGluZSk7CiAgICB3aGlsZSAoKmNtZGxpbmUpIHsKICAgIAlpZiAoKCpjbWRsaW5lPT0nICcpICYmICFxZmxhZykKCQlyZXR1cm4gY21kbGluZSsxOwoJaWYgKCpjbWRsaW5lPT0nIicpCgkJcWZsYWc9IXFmbGFnOwoJY21kbGluZSsrOwogICAgfQogICAgcmV0dXJuIGNtZGxpbmU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhVbnF1b3RlU3BhY2VzIFtTSEVMTDMyLjU2XQogKiAKICogTk9URVMKICogICAgIHVucXVvdGUgc3RyaW5nIChyZW1vdmUgIikKICovClZPSUQgV0lOQVBJIFBhdGhVbnF1b3RlU3BhY2VzKExQU1RSIHN0cikgewogICAgRFdPUkQgICAgICBsZW4gPSBsc3RybGVuMzJBKHN0cik7CiAgICBUUkFDRShzaGVsbCwiJXNcbiIsc3RyKTsKICAgIGlmICgqc3RyIT0nIicpIHJldHVybjsKICAgIGlmIChzdHJbbGVuLTFdIT0nIicpIHJldHVybjsKICAgIHN0cltsZW4tMV09J1wwJzsKICAgIGxzdHJjcHkzMkEoc3RyLHN0cisxKTsKICAgIHJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZCBbU0hFTEwzMi41OF0KICoKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkKExQQ1NUUiBzcmMsRFdPUkQgeDIsTFBTVFIgdGFyZ2V0LERXT1JEIHBhdGhsZW4pIHsKCUZJWE1FKHNoZWxsLCIoJXMsMHglMDhseCwlcCwlbGQpOnN0dWIuXG4iLAoJCXNyYyx4Mix0YXJnZXQscGF0aGxlbgoJKTsKCWlmICghc3JjKQoJCXJldHVybiAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBpY2tJY29uRGxnIFtTSEVMTDMyLjYyXQogKiAKICovCkRXT1JEIFdJTkFQSSBQaWNrSWNvbkRsZyhEV09SRCB4LERXT1JEIHksRFdPUkQgeixEV09SRCBhKSB7CglGSVhNRShzaGVsbCwiKCUwOGx4LCUwOGx4LCUwOGx4LCUwOGx4KTpzdHViLlxuIix4LHkseixhKTsKCXJldHVybiAweGZmZmZmZmZmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXRGaWxlTmFtZUZyb21Ccm93c2UgW1NIRUxMMzIuNjNdCiAqIAogKi8KRFdPUkQgV0lOQVBJIEdldEZpbGVOYW1lRnJvbUJyb3dzZShIV05EMzIgaG93bmVyLCBMUFNUUiB0YXJnZXRidWYsIERXT1JEIGxlbiwgRFdPUkQgeCwgTFBDU1RSIHN1ZmZpeCwgTFBDU1RSIHksIExQQ1NUUiBjbWQpIHsKICAgIEZJWE1FKHNoZWxsLCIoJTA0eCwlcCwlbGQsJTA4bHgsJXMsJXMsJXMpOnN0dWIuXG4iLAoJICAgIGhvd25lcix0YXJnZXRidWYsbGVuLHgsc3VmZml4LHksY21kCiAgICApOwogICAgLyogcHV0cyB1cCBhIE9wZW4gRGlhbG9nIGFuZCByZXF1ZXN0cyBpbnB1dCBpbnRvIHRhcmdldGJ1ZiAqLwogICAgLyogT0ZOX0hJREVSRUFET05MWXxPRk5fTk9DSEFOR0VESVJ8T0ZOX0ZJTEVNVVNURVhJU1R8T0ZOX3Vua25vd24gKi8KICAgIGxzdHJjcHkzMkEodGFyZ2V0YnVmLCJ4OlxcczMuZXhlIik7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRTZXR0aW5ncyBbU0hFTEwzMi42OF0KICogCiAqLwpEV09SRCBXSU5BUEkgU0hHZXRTZXR0aW5ncyhEV09SRCB4LERXT1JEIHksRFdPUkQgeikgewoJRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCgkJeCx5LHoKCSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxfR2V0Q2FjaGVkSW1hZ2VJbmRleCBbU0hFTEwzMi43Ml0KICoKICovCnZvaWQgV0lOQVBJIFNoZWxsX0dldENhY2hlZEltYWdlSW5kZXgoTFBTVFIgeCxEV09SRCB5LERXT1JEIHopIAp7IEZJWE1FKHNoZWxsLCIoJXMsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHgseSx6KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZSBbU0hFTEwzMi43M10KICoKICogUEFSQU1FVEVSUwogKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCiAqICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aAogKiAgdU1zZyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtCiAqICBsUGFyYW0KICoKICogTk9URVMKICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAqICAgIFRoaXMgbWVzc2FnZSBnZXRzIHNlbnQgd2hlbiBhIGNvbHVtbiBnZXRzIGNsaWNrZWQgdG8gaW5zdHJ1Y3QgdGhlCiAqICAgIHNoZWxsIHZpZXcgdG8gcmUtc29ydCB0aGUgaXRlbSBsaXN0LiBsUGFyYW0gaWRlbnRpZmllcyB0aGUgY29sdW1uCiAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAqLwppbnQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoSFdORDMyIGh3bmRDYWJpbmV0LFVJTlQzMiB1TXNnLExQQVJBTSBsUGFyYW0pCnsgRklYTUUoc2hlbGwsIiUwNHggJTA4dXggJTA4bHggc3R1YlxuIixod25kQ2FiaW5ldCx1TXNnLGxQYXJhbSk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhZZXRBbm90aGVyTWFrZVVuaXF1ZU5hbWUgW1NIRUxMMzIuNzVdCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KQk9PTDMyIFdJTkFQSSBQYXRoWWV0QW5vdGhlck1ha2VVbmlxdWVOYW1lKExQRFdPUkQgeCxMUERXT1JEIHkpIHsKICAgIEZJWE1FKHNoZWxsLCIoJXAsJXApOnN0dWIuXG4iLHgseSk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hNYXBQSURMVG9TeXN0ZW1JbWFnZUxpc3RJbmRleCBbU0hFTEwzMi43N10KICoKICogUEFSQU1FVEVSUwogKiB4ICBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIElTaGVsbEZvbGRlciAKICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqCiAqLwpEV09SRCBXSU5BUEkKU0hNYXBQSURMVG9TeXN0ZW1JbWFnZUxpc3RJbmRleChEV09SRCB4LERXT1JEIHksRFdPUkQgeikKeyBGSVhNRShzaGVsbCwiKCUwOGx4LCUwOGx4LCUwOGx4KTpzdHViLlxuIix4LHkseik7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9sZVN0clRvU3RyTiAgW1NIRUxMMzIuNzhdCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKiBGSVhNRQogKiAgd3JvbmcgaW1wbGVtZW50ZWQgT2xlU3RyIGlzIE5PVCB3aWRlIHN0cmluZyAhISEhIChqc2NoKQogKi8KQk9PTDMyIFdJTkFQSQpPbGVTdHJUb1N0ck4gKExQU1RSIGxwTXVsdGksIElOVDMyIG5NdWx0aSwgTFBDV1NUUiBscFdpZGUsIElOVDMyIG5XaWRlKSB7CiAgICByZXR1cm4gV2lkZUNoYXJUb011bHRpQnl0ZSAoMCwgMCwgbHBXaWRlLCBuV2lkZSwKICAgICAgICBscE11bHRpLCBuTXVsdGksIE5VTEwsIE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJUb09sZVN0ck4gIFtTSEVMTDMyLjc5XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKiBGSVhNRQogKiAgd3JvbmcgaW1wbGVtZW50ZWQgT2xlU3RyIGlzIE5PVCB3aWRlIHN0cmluZyAhISEhIChqc2NoKQoqLwpCT09MMzIgV0lOQVBJClN0clRvT2xlU3RyTiAoTFBXU1RSIGxwV2lkZSwgSU5UMzIgbldpZGUsIExQQ1NUUiBscE11bHRpLCBJTlQzMiBuTXVsdGkpIHsKICAgIHJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyICgwLCAwLCBscE11bHRpLCBuTXVsdGksIGxwV2lkZSwgbldpZGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENsb25lU3BlY2lhbElETGlzdCBbU0hFTEwzMi44OV0KICogCiAqIFBBUkFNRVRFUlMKICogIGh3bmQgCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hDbG9uZVNwZWNpYWxJRExpc3QoSFdORDMyIGh3bmQsRFdPUkQgeDIsRFdPUkQgeDMpIHsKICBGSVhNRShzaGVsbCwiKGh3bmQ9MHgleCwweCVseCwweCVseCk6c3R1Yi5cbiIsCiAgICBod25kLHgyLHgzCiAgKTsKICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNMRk5Ecml2ZSBbU0hFTEwzMi4xMTldCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbCBOYW1lCiAqLwpCT09MMzIgV0lOQVBJIElzTEZORHJpdmUoTFBDU1RSIHBhdGgpIHsKICAgIERXT1JECWZubGVuOwoKICAgIGlmICghR2V0Vm9sdW1lSW5mb3JtYXRpb24zMkEocGF0aCxOVUxMLDAsTlVMTCwmZm5sZW4sTlVMTCxOVUxMLDApKQoJcmV0dXJuIEZBTFNFOwogICAgcmV0dXJuIGZubGVuPjEyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFNwZWNpYWxGb2xkZXJQYXRoIFtTSEVMTDMyLjE3NV0KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoKERXT1JEIHgxLERXT1JEIHgyLERXT1JEIHgzLERXT1JEIHg0KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLAogICAgICB4MSx4Mix4Myx4NAogICAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVnaXN0ZXJTaGVsbEhvb2sgW1NIRUxMMzIuMTgxXQogKgogKiBQQVJBTVMKICogICAgICBod25kIFtJXSAgd2luZG93IGhhbmRsZQogKiAgICAgIHkgICAgW0ldICBmbGFnID8/Pz8KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vazMyKEhXTkQzMiBod25kLCBEV09SRCB5KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4eCwweCUwOGx4KTpzdHViLlxuIixod25kLHkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBIFtTSEVMTDMyLjE4M10KICoKICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8Kdm9pZCBfX2NkZWNsClNoZWxsTWVzc2FnZUJveEEoSE1PRFVMRTMyIGhtb2QsSFdORDMyIGh3bmQsRFdPUkQgaWQsRFdPUkQgeCxEV09SRCB0eXBlLExQVk9JRCBhcmdsaXN0KSB7CgljaGFyCWJ1ZlsxMDBdLGJ1ZjJbMTAwXSwqYnVmMzsKCUxQVk9JRAlhcmdzID0gJmFyZ2xpc3Q7CgoJaWYgKCFMb2FkU3RyaW5nMzJBKGhtb2QseCxidWYsMTAwKSkKCQlzdHJjcHkoYnVmLCJEZXNrdG9wIik7Ci8vCUxvYWRTdHJpbmczMkEoaG1vZCxpZCxidWYyLDEwMCk7CgkvKiBGSVhNRTogdGhlIHZhcmFyZ3MgaGFuZGxpbmcgZG9lc24ndC4gKi8KLy8JRm9ybWF0TWVzc2FnZTMyQSgweDUwMCxidWYyLDAsMCwoTFBTVFIpJmJ1ZjMsMjU2LChMUERXT1JEKSZhcmdzKTsKCglGSVhNRShzaGVsbCwiKCUwOGx4LCUwOGx4LCUwOGx4KCVzKSwlMDhseCglcyksJTA4bHgsJXApOnN0dWIuXG4iLAoJCShEV09SRClobW9kLChEV09SRClod25kLGlkLGJ1ZjIseCxidWYsdHlwZSxhcmdsaXN0CgkpOwoJLypNZXNzYWdlQm94MzJBKGh3bmQsYnVmMyxidWYsaWR8MHgxMDAwMCk7Ki8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZXN0cmljdGVkIFtTSEVMTDMyLjEwMF0KICoKICogd2Fsa3MgdGhyb3VnaCBwb2xpY3kgdGFibGUsIHF1ZXJpZXMgPGFwcD4ga2V5LCA8dHlwZT4gdmFsdWUsIHJldHVybnMgCiAqIHF1ZXJpZWQgKERXT1JEKSB2YWx1ZS4KICogezB4MDAwMDEsRXhwbG9yZXIsTm9SdW59CiAqIHsweDAwMDAyLEV4cGxvcmVyLE5vQ2xvc2V9CiAqIHsweDAwMDA0LEV4cGxvcmVyLE5vU2F2ZVNldHRpbmdzfQogKiB7MHgwMDAwOCxFeHBsb3JlcixOb0ZpbGVNZW51fQogKiB7MHgwMDAxMCxFeHBsb3JlcixOb1NldEZvbGRlcnN9CiAqIHsweDAwMDIwLEV4cGxvcmVyLE5vU2V0VGFza2Jhcn0KICogezB4MDAwNDAsRXhwbG9yZXIsTm9EZXNrdG9wfQogKiB7MHgwMDA4MCxFeHBsb3JlcixOb0ZpbmR9CiAqIHsweDAwMTAwLEV4cGxvcmVyLE5vRHJpdmVzfQogKiB7MHgwMDIwMCxFeHBsb3JlcixOb0RyaXZlQXV0b1J1bn0KICogezB4MDA0MDAsRXhwbG9yZXIsTm9Ecml2ZVR5cGVBdXRvUnVufQogKiB7MHgwMDgwMCxFeHBsb3JlcixOb05ldEhvb2R9CiAqIHsweDAxMDAwLEV4cGxvcmVyLE5vU3RhcnRCYW5uZXJ9CiAqIHsweDAyMDAwLEV4cGxvcmVyLFJlc3RyaWN0UnVufQogKiB7MHgwNDAwMCxFeHBsb3JlcixOb1ByaW50ZXJUYWJzfQogKiB7MHgwODAwMCxFeHBsb3JlcixOb0RlbGV0ZVByaW50ZXJ9CiAqIHsweDEwMDAwLEV4cGxvcmVyLE5vQWRkUHJpbnRlcn0KICogezB4MjAwMDAsRXhwbG9yZXIsTm9TdGFydE1lbnVTdWJGb2xkZXJzfQogKiB7MHg0MDAwMCxFeHBsb3JlcixNeURvY3NPbk5ldH0KICogezB4ODAwMDAsV2luT2xkQXBwLE5vUmVhbE1vZGV9CiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hSZXN0cmljdGVkIChEV09SRCBwb2wpIHsKCUhLRVkJeGhrZXk7CgoJRklYTUUoc2hlbGwsIiglMDhseCk6c3R1Yi5cbiIscG9sKTsKCWlmIChSZWdPcGVuS2V5MzJBKEhLRVlfQ1VSUkVOVF9VU0VSLCJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXMiLCZ4aGtleSkpCgkJcmV0dXJuIDA7CgkvKiBGSVhNRTogZG8gbm90aGluZyBmb3Igbm93LCBqdXN0IHJldHVybiAwICg9PSAiYWxsb3dlZCIpICovCglSZWdDbG9zZUtleSh4aGtleSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEdldEV4dGVuc2lvbiBbU0hFTEwzMi4xNThdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpMUFNUUiBXSU5BUEkgUGF0aEdldEV4dGVuc2lvbihMUFNUUiBwYXRoLERXT1JEIHksRFdPUkQgeikKeyBUUkFDRShzaGVsbCwiKCVzLCUwOGx4LCUwOGx4KVxuIixwYXRoLHkseik7CiAgICBwYXRoID0gUGF0aEZpbmRFeHRlbnNpb24ocGF0aCk7CiAgICByZXR1cm4gKnBhdGg/KHBhdGgrMSk6cGF0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVEaXJlY3RvcnkgW1NIRUxMMzIuMTY1XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIQ3JlYXRlRGlyZWN0b3J5KERXT1JEIHgsTFBDU1RSIHBhdGgpIHsKCVRSQUNFKHNoZWxsLCIoJTA4bHgsJXMpOnN0dWIuXG4iLHgscGF0aCk7CglpZiAoQ3JlYXRlRGlyZWN0b3J5MzJBKHBhdGgseCkpCgkJcmV0dXJuIFRSVUU7CgkvKiBTSENoYW5nZU5vdGlmeSg4LDEscGF0aCwwKTsgKi8KCXJldHVybiBGQUxTRTsKI2lmIDAKCWlmIChTSEVMTDMyXzc5KHBhdGgsKExQVk9JRCl4KSkKCQlyZXR1cm4gMDsKCUZJWE1FKHNoZWxsLCIoJTA4bHgsJXMpOnN0dWIuXG4iLHgscGF0aCk7CglyZXR1cm4gMDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZSBbU0hFTEwzMi4xOTVdCiAqCiAqIE5PVEVTCiAqICAgICBmcmVlX3B0cigpIC0gZnJlZXMgbWVtb3J5IHVzaW5nIElNYWxsb2MKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSEZyZWUoTFBWT0lEIHgpIHsKICBUUkFDRShzaGVsbCwiJXBcbiIseCk7CiAgLypyZXR1cm4gTG9jYWxGcmVlMzIoKEhBTkRMRTMyKXgpOyovIC8qIGNyYXNoZXMgKi8KICByZXR1cm4gSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jIFtTSEVMTDMyLjE5Nl0KICoKICogTk9URVMKICogICAgIHZvaWQgKnRhc2tfYWxsb2MoRFdPUkQgbGVuKSwgdXNlcyBTSE1hbGxvYyBhbGxvY2F0b3IKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkxQVk9JRCBXSU5BUEkgU0hBbGxvYyhEV09SRCBsZW4pIHsKIC8qIHZvaWQgKiByZXQgPSAoTFBWT0lEKUxvY2FsQWxsb2MzMihsZW4sTE1FTV9aRVJPSU5JVCk7Ki8gLyogY2hyYXNoZXMgKi8KIHZvaWQgKiByZXQgPSAoTFBWT0lEKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7CiAgVFJBQ0Uoc2hlbGwsIiVsdSBieXRlcyBhdCAlcFxuIixsZW4sIHJldCk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT3BlblJlZ1N0cmVhbSBbU0hFTEwzMi44NV0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBPcGVuUmVnU3RyZWFtKERXT1JEIHgxLERXT1JEIHgyLERXT1JEIHgzLERXT1JEIHg0KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLAogICAgCXgxLHgyLHgzLHg0CiAgICApOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnaXN0ZXJEcmFnRHJvcCBbU0hFTEwzMi44Nl0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJlZ2lzdGVyRHJhZ0Ryb3AoSFdORDMyIGh3bmQsRFdPUkQgeDIpIHsKICAgIEZJWE1FIChzaGVsbCwgIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsIGh3bmQsIHgyKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJldm9rZURyYWdEcm9wIFtTSEVMTDMyLjg3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmV2b2tlRHJhZ0Ryb3AoRFdPUkQgeCkgewogICAgRklYTUUoc2hlbGwsIigweCUwOGx4KTpzdHViLlxuIix4KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5GaWxlRGxnIFtTSEVMTDMyLjYxXQogKgogKiBOT1RFUwogKiAgICAgT3JpZ2luYWwgbmFtZTogUnVuRmlsZURsZyAoZXhwb3J0ZWQgYnkgb3JkaW5hbCkKICovCkRXT1JEIFdJTkFQSQpSdW5GaWxlRGxnIChIV05EMzIgaHduZE93bmVyLCBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsCgkgICAgTFBTVFIgbHBzelRpdGxlLCBMUFNUUiBscHN6UHJvbXB0LCBVSU5UMzIgdUZsYWdzKQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCUwOHggMHglbHggMHglbHggXCIlc1wiIFwiJXNcIiAweCV4KTpzdHViLlxuIiwKCSAgIGh3bmRPd25lciwgZHdQYXJhbTEsIGR3UGFyYW0yLCBscHN6VGl0bGUsIGxwc3pQcm9tcHQsIHVGbGFncyk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRXhpdFdpbmRvd3NEaWFsb2cgW1NIRUxMMzIuNjBdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKRXhpdFdpbmRvd3NEaWFsb2cgKEhXTkQzMiBod25kT3duZXIpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JTA4eCk6c3R1Yi5cbiIsIGh3bmRPd25lcik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQXJyYW5nZVdpbmRvd3MgW1NIRUxMMzIuMTg0XQogKiAKICovCkRXT1JEIFdJTkFQSQpBcnJhbmdlV2luZG93cyAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMywKCQlEV09SRCBkd1BhcmFtNCwgRFdPUkQgZHdQYXJhbTUpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4KTpzdHViLlxuIiwKCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgZHdQYXJhbTMsIGR3UGFyYW00LCBkd1BhcmFtNSk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDTFNJREZyb21TdHJpbmcgW1NIRUxMMzIuMTQ3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJClNIQ0xTSURGcm9tU3RyaW5nIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JWx4IDB4JWx4KTpzdHViLlxuIiwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKICAgIEZJWE1FIChzaGVsbCwiKFwiJXNcIiBcIiVzXCIpOnN0dWIuXG4iLCAoTFBTVFIpZHdQYXJhbTEsIChMUFNUUilkd1BhcmFtMik7CgogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaWduYWxGaWxlT3BlbiBbU0hFTEwzMi4xMDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKU2lnbmFsRmlsZU9wZW4gKERXT1JEIGR3UGFyYW0xKQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCUwOGx4KTpzdHViLlxuIiwgZHdQYXJhbTEpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFkZFRvUmVjZW50RG9jcyBbU0hFTEwzMi4yMzRdCiAqCiAqIFBBUkFNRVRFUlMKICogICB1RmxhZ3MgIFtJTl0gU0hBUkRfUEFUSCBvciBTSEFSRF9QSURMCiAqICAgcHYgICAgICBbSU5dIHN0cmluZyBvciBwaWRsLCBOVUxMIGNsZWFycyB0aGUgbGlzdAogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KRFdPUkQgV0lOQVBJIFNIQWRkVG9SZWNlbnREb2NzMzIgKFVJTlQzMiB1RmxhZ3MsTFBDVk9JRCBwdikgICAKeyBpZiAoU0hBUkRfUElETD09dUZsYWdzKQogIHsgRklYTUUgKHNoZWxsLCIoMHglMDh4LHBpZGw9JXApOnN0dWIuXG4iLCB1RmxhZ3MscHYpOwoJfQoJZWxzZQoJeyBGSVhNRSAoc2hlbGwsIigweCUwOHgsJXMpOnN0dWIuXG4iLCB1RmxhZ3MsKGNoYXIqKXB2KTsKCX0KICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaWxlT3BlcmF0aW9uIFtTSEVMTDMyLjI0Ml0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSEZpbGVPcGVyYXRpb24zMiAoCiAgICBMUFNIRklMRU9QU1RSVUNUMzIgbHBGaWxlT3ApICAgCnsgRklYTUUgKHNoZWxsLCIoJXApOnN0dWIuXG4iLCBscEZpbGVPcCk7CiAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5IFtTSEVMTDMyLjIzOV0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSENoYW5nZU5vdGlmeTMyICgKICAgIElOVDMyICAgd0V2ZW50SWQsICAvKiBbSU5dIGZsYWdzIHRoYXQgc3BlY2lmaWVzIHRoZSBldmVudCovCiAgICBVSU5UMzIgIHVGbGFncywgICAvKiBbSU5dIHRoZSBtZWFuaW5nIG9mIGR3SXRlbVsxfDJdKi8KCQlMUENWT0lEIGR3SXRlbTEsCgkJTFBDVk9JRCBkd0l0ZW0yKQp7IEZJWE1FIChzaGVsbCwiKDB4JTA4eCwweCUwOHV4LCVwLCVwKTpzdHViLlxuIiwgd0V2ZW50SWQsdUZsYWdzLGR3SXRlbTEsZHdJdGVtMik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeCBbU0hFTEwzMi4xNzRdCiAqCiAqIE5PVEVTCiAqICBzZWUgSVNoZWxsRm9sZGVyOjpDcmVhdGVWaWV3T2JqZWN0CiAqLwpIUkVTVUxUIFdJTkFQSSBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4MzIoCiAgTFBTSEVMTFZJRVdEQVRBIHBzdmNiaSwgLypbaW4gXSBzaGVsbHRlbXBsYXRlIHN0cnVjdCovCiAgTFBWT0lEKiBwcHYpICAgICAgICAgICAgLypbb3V0XSBJU2hlbGxWaWV3IHBvaW50ZXIqLwp7IEZJWE1FIChzaGVsbCwiKCVwLCVwKTpzdHViLlxuIiwgcHN2Y2JpLHBwdik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaW5kX0luaXRNZW51UG9wdXAgW1NIRUxMMzIuMTQ5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hGaW5kX0luaXRNZW51UG9wdXAgKERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgpCnsgRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LHYsdyx4KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlTWVudV9DcmVhdGUgW1NIRUxMMzIuMTE0XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfQ3JlYXRlIChEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7IEZJWE1FKHNoZWxsLCIweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LHYsdyx4LHopOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4IFtTSEVMTDMyLjI5MV0KICoKICovCkJPT0wzMiBXSU5BUEkgU2hlbGxFeGVjdXRlRXgzMkEgKExQU0hFTExFWEVDVVRFSU5GT0EgdSkKeyBGSVhNRShzaGVsbCwiJXAgc3R1YlxuIix1KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIgW1NIRUxMMzIuMTc2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hTZXRJbnN0YW5jZUV4cGxvcmVyIChEV09SRCB1KQp7IEZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRJbnN0YW5jZUV4cGxvcmVyIFtTSEVMTDMyLjI1Nl0KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0SW5zdGFuY2VFeHBsb3JlciAoRFdPUkQgdSkKeyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZVVudXNlZExpYnJhcmllcyBbU0hFTEwzMi4xMjNdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZyZWVVbnVzZWRMaWJyYXJpZXMgKERXT1JEIHUpCnsgRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix1KTsKICByZXR1cm4gMDsKfQo=