LyoKICogCQkJCVNoZWxsIE9yZGluYWwgRnVuY3Rpb25zCiAqCiAqIFRoZXNlIGFyZSBjb21wbGV0ZWx5IHVuZG9jdW1lbnRlZC4gVGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9ucyBjaGFuZ2VzCiAqIGJldHdlZW4gZGlmZmVyZW50IE9TIHZlcnNpb25zIChOVCB1c2VzIFVuaWNvZGUgc3RyaW5ncywgOTUgdXNlcyBBU0NJSQogKiBzdHJpbmdzLCBldGMuIGV0Yy4pCiAqIAogKiBUaGV5IGFyZSBqdXN0IGhlcmUgc28gdGhhdCBleHBsb3Jlci5leGUgYW5kIGlleHBsb3JlLmV4ZSBjYW4gYmUgdGVzdGVkLgogKgogKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICogICAgICAgICAgIDE5OTggSvxyZ2VuIFNjaG1pZWQKICovCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgInNoZWxsLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm5lZXhlLmgiCiNpbmNsdWRlICJyZXNvdXJjZS5oIgojaW5jbHVkZSAiZGxncy5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJncmFwaGljcy5oIgojaW5jbHVkZSAiY3Vyc29yaWNvbi5oIgojaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIgW1NIRUxMMzIuMl0KICogTk9URVMKICogICBJZGxpc3QgaXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcyBhbmQgQ291bnQgc3BlY2lmaWVzIGhvdyBtYW55IGl0ZW1zIGluIHRoZSBhcnJheQogKiAgICh1c3VhbGx5IGp1c3Qgb25lIEkgdGhpbmspLgogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIoCiAgICBIV05EMzIgaHduZCwKICAgIExPTkcgZXZlbnRzMSwKICAgIExPTkcgZXZlbnRzMiwKICAgIERXT1JEIG1zZywKICAgIGludCBjb3VudCwKICAgIElEU1RSVUNUICppZGxpc3QpCnsJRklYTUUoc2hlbGwsIigweCUwNHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDh4LCVwKTpzdHViLlxuIiwKCQlod25kLGV2ZW50czEsZXZlbnRzMixtc2csY291bnQsaWRsaXN0KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlciBbU0hFTEwzMi40XQogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcihMT05HIHgxLExPTkcgeDIpCnsJRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLHgxLHgyKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoSXNSb290IFtTSEVMTDMyLjI5XQogKi8KQk9PTDMyIFdJTkFQSSBQYXRoSXNSb290KExQQ1NUUiB4KSB7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLHgpOwoJaWYgKCFzdHJjbXAoeCsxLCI6XFwiKSkJCS8qICJYOlwiICovCgkJcmV0dXJuIDE7CglpZiAoIXN0cmNtcCh4LCJcXCIpKQkJLyogIlwiICovCgkJcmV0dXJuIDE7CglpZiAoeFswXT09J1xcJyAmJiB4WzFdPT0nXFwnKSB7CQkvKiBVTkMgIlxcPHh4PlwiICovCgkJaW50CWZvdW5kYmFja3NsYXNoID0gMDsKCQl4PXgrMjsKCQl3aGlsZSAoKngpIHsKCQkJaWYgKCp4Kys9PSdcXCcpCgkJCQlmb3VuZGJhY2tzbGFzaCsrOwoJCX0KCQlpZiAoZm91bmRiYWNrc2xhc2g8PTEpCS8qIG1heCAxIFwgbW9yZSAuLi4gKi8KCQkJcmV0dXJuIDE7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEJ1aWxkUm9vdCBbU0hFTEwzMi4zMF0KICovCkxQU1RSIFdJTkFQSSBQYXRoQnVpbGRSb290KExQU1RSIHJvb3QsQllURSBkcml2ZSkgewogIFRSQUNFKHNoZWxsLCIlcCAlaVxuIixyb290LCBkcml2ZSk7CglzdHJjcHkocm9vdCwiQTpcXCIpOwoJcm9vdFswXSs9ZHJpdmU7CglyZXR1cm4gcm9vdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEZpbmRFeHRlbnNpb24gW1NIRUxMMzIuMzFdCiAqCiAqIE5PVEVTCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gbGFzdCAuIGluIGxhc3QgcGF0aGNvbXBvbmVudCBvciBhdCBcMC4KICovCkxQU1RSIFdJTkFQSSBQYXRoRmluZEV4dGVuc2lvbihMUFNUUiBwYXRoKSB7CiAgTFBTVFIgICBsYXN0cG9pbnQgPSBOVUxMOwogIFRSQUNFKHNoZWxsLCIlcCAlc1xuIixwYXRoLHBhdGgpOwogICAgd2hpbGUgKCpwYXRoKSB7CglpZiAoKnBhdGg9PSdcXCd8fCpwYXRoPT0nICcpCgkgICAgbGFzdHBvaW50PU5VTEw7CglpZiAoKnBhdGg9PScuJykKCSAgICBsYXN0cG9pbnQ9cGF0aDsKCXBhdGgrKzsKICAgIH0KICAgIHJldHVybiBsYXN0cG9pbnQ/bGFzdHBvaW50OnBhdGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhBZGRCYWNrc2xhc2ggW1NIRUxMMzIuMzJdCiAqIAogKiBOT1RFUwogKiAgICAgYXBwZW5kIFwgaWYgdGhlcmUgaXMgbm9uZQogKi8KTFBTVFIgV0lOQVBJIFBhdGhBZGRCYWNrc2xhc2goTFBTVFIgcGF0aCkKeyBpbnQgbGVuOwogIFRSQUNFKHNoZWxsLCIlcC0+JXNcbiIscGF0aCxwYXRoKTsKICBsZW4gPSBzdHJsZW4ocGF0aCk7CiAgaWYgKGxlbiAmJiBwYXRoW2xlbi0xXSE9J1xcJykgCgl7IHBhdGhbbGVuKzBdPSdcXCc7CiAgICBwYXRoW2xlbisxXT0nXDAnOwogICAgcmV0dXJuIHBhdGgrbGVuKzE7CiAgfQoJZWxzZQogICAgcmV0dXJuIHBhdGgrbGVuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoUmVtb3ZlQmxhbmtzIFtTSEVMTDMyLjMzXQogKiAKICogTk9URVMKICogICAgIHJlbW92ZSBzcGFjZXMgZnJvbSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBwYXNzZWQgc3RyaW5nCiAqLwpMUFNUUiBXSU5BUEkgUGF0aFJlbW92ZUJsYW5rcyhMUFNUUiBzdHIpCnsgTFBTVFIgeCA9IHN0cjsKICBUUkFDRShzaGVsbCwiJXNcbiIsc3RyKTsKICB3aGlsZSAoKng9PScgJykgeCsrOwogIGlmICh4IT1zdHIpCgkgIHN0cmNweShzdHIseCk7CiAgaWYgKCEqc3RyKQoJICByZXR1cm4gc3RyOwogIHg9c3RyK3N0cmxlbihzdHIpLTE7CiAgd2hpbGUgKCp4PT0nICcpCgkgIHgtLTsKICBpZiAoKng9PScgJykKCSAgKng9J1wwJzsKICByZXR1cm4geDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhGaW5kRmlsZW5hbWUgW1NIRUxMMzIuMzRdCiAqIAogKiBOT1RFUwogKiAgICAgYmFzZW5hbWUoY2hhciAqZm4pOwogKi8KTFBTVFIgV0lOQVBJIFBhdGhGaW5kRmlsZW5hbWUoTFBTVFIgZm4pCnsJTFBTVFIgYmFzZWZuOwoJVFJBQ0Uoc2hlbGwsIiVzXG4iLGZuKTsKICAgIGJhc2VmbiA9IGZuOwogICAgd2hpbGUgKGZuWzBdKSAKICAgIHsgaWYgKCgoZm5bMF09PSdcXCcpIHx8IChmblswXT09JzonKSkgJiYgZm5bMV0gJiYgZm5bMV0hPSdcXCcpCgkgIGJhc2VmbiA9IGZuKzE7CgkgIGZuKys7CiAgICB9CiAgICByZXR1cm4gYmFzZWZuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoUmVtb3ZlRmlsZVNwZWMgW1NIRUxMMzIuMzVdCiAqIAogKiBOT1RFUwogKiAgICAgYm9vbCBnZXRwYXRoKGNoYXIgKnBhdGhuYW1lKTsgdHJ1bmNhdGVzIHBhc3NlZCBhcmd1bWVudCB0byBhIHZhbGlkIHBhdGgKICogICAgIHJldHVybnMgaWYgdGhlIHN0cmluZyB3YXMgbW9kaWZpZWQgb3Igbm90LgogKiAgICAgIlxmb29ceHhcZm9vIi0+ICJcZm9vXHh4IgogKiAgICAgIlwiIC0+ICJcIgogKiAgICAgImE6XGZvbyIJLT4gImE6XCIKICovCkRXT1JEIFdJTkFQSSBQYXRoUmVtb3ZlRmlsZVNwZWMoTFBTVFIgZm4pIHsKCUxQU1RSCXgsY3V0cGxhY2U7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLGZuKTsKCWlmICghZm5bMF0pCgkJcmV0dXJuIDA7Cgl4PWZuOwoJY3V0cGxhY2UgPSBmbjsKCXdoaWxlICgqeCkgewoJCWlmICgqeD09J1xcJykgewoJCQljdXRwbGFjZT14Kys7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoKng9PSc6JykgewoJCQl4Kys7CgkJCWlmICgqeD09J1xcJykKCQkJCWN1dHBsYWNlPSsreDsKCQkJY29udGludWU7IC8qIGFscmVhZHkgeCsrZWQgKi8KCQl9CgkJeCsrOwoJfQoJaWYgKCEqY3V0cGxhY2UpCgkJcmV0dXJuIDA7CglpZiAoY3V0cGxhY2U9PWZuKSB7CgkJaWYgKGZuWzBdPT0nXFwnKSB7CgkJCWlmICghZm5bMV0pCgkJCQlyZXR1cm4gMDsKCQkJZm5bMF09J1wwJzsKCQkJcmV0dXJuIDE7CgkJfQoJfQoJKmN1dHBsYWNlPSdcMCc7CglyZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEFwcGVuZCBbU0hFTEwzMi4zNl0KICogCiAqIE5PVEVTCiAqICAgICBjb25jYXRfcGF0aHMoY2hhcip0YXJnZXQsY29uc3QgY2hhciphZGQpOwogKiAgICAgY29uY2F0cyAidGFyZ2V0XFxhZGQiIGFuZCB3cml0ZXMgdGhlbSB0byB0YXJnZXQKICovCkxQU1RSIFdJTkFQSSBQYXRoQXBwZW5kKExQU1RSIHgxLExQU1RSIHgyKSB7CiAgVFJBQ0Uoc2hlbGwsIiVzICVzXG4iLHgxLHgyKTsKICB3aGlsZSAoeDJbMF09PSdcXCcpIHgyKys7CiAgcmV0dXJuIFBhdGhDb21iaW5lKHgxLHgxLHgyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aENvbWJpbmUgW1NIRUxMMzIuMzddCiAqIAogKiBOT1RFUwogKiAgICAgY29uY2F0X3BhdGhzKGNoYXIqdGFyZ2V0LGNvbnN0IGNoYXIqYWRkKTsKICogICAgIGNvbmNhdHMgInRhcmdldFxcYWRkIiBhbmQgd3JpdGVzIHRoZW0gdG8gdGFyZ2V0CiAqLwpMUFNUUiBXSU5BUEkgUGF0aENvbWJpbmUoTFBTVFIgdGFyZ2V0LExQU1RSIHgxLExQU1RSIHgyKSB7CgljaGFyCWJ1ZlsyNjBdOwogIFRSQUNFKHNoZWxsLCIlcyAlc1xuIix4MSx4Mik7CglpZiAoIXgyIHx8ICF4MlswXSkgewoJCWxzdHJjcHkzMkEodGFyZ2V0LHgxKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfQoJbHN0cmNweTMyQShidWYseDEpOwoJUGF0aEFkZEJhY2tzbGFzaChidWYpOyAvKiBhcHBlbmQgXCBpZiBub3QgdGhlcmUgKi8KCWxzdHJjYXQzMkEoYnVmLHgyKTsKCWxzdHJjcHkzMkEodGFyZ2V0LGJ1Zik7CglyZXR1cm4gdGFyZ2V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoSXNVTkMgW1NIRUxMMzIuMzldCiAqIAogKiBOT1RFUwogKiAgICAgaXNVTkMoY29uc3QgY2hhcipwYXRoKTsKICovCkJPT0wzMiBXSU5BUEkgUGF0aElzVU5DKExQQ1NUUiBwYXRoKSB7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLHBhdGgpOwoJaWYgKChwYXRoWzBdPT0nXFwnKSAmJiAocGF0aFsxXT09J1xcJykpCgkJcmV0dXJuIFRSVUU7CglyZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhGaWxlRXhpc3RzIFtTSEVMTDMyLjQ1XQogKiAKICogTk9URVMKICogICAgIGZpbGVfZXhpc3RzKGNoYXIgKmZuKTsKICovCkJPT0wzMiBXSU5BUEkgUGF0aEZpbGVFeGlzdHMoTFBTVFIgZm4pIHsKICBUUkFDRShzaGVsbCwiJXNcbiIsZm4pOwogICBpZiAoR2V0RmlsZUF0dHJpYnV0ZXMzMkEoZm4pPT0tMSkKICAgIAlyZXR1cm4gRkFMU0U7CiAgICBlbHNlCiAgICAJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhSZXNvbHZlIFtTSEVMTDMyLjUxXQogKi8KRFdPUkQgV0lOQVBJIFBhdGhSZXNvbHZlKExQQ1NUUiBzLERXT1JEIHgyLERXT1JEIHgzKSB7CglGSVhNRShzaGVsbCwiKCVzLDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIscyx4Mix4Myk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEdldEFyZ3MgW1NIRUxMMzIuNTJdCiAqCiAqIE5PVEVTCiAqICAgICBsb29rIGZvciBuZXh0IGFyZyBpbiBzdHJpbmcuIGhhbmRsZSAicXVvdGVkIiBzdHJpbmdzCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKkFGVEVSKiB0aGUgc3BhY2UuIE9yIHRvIHRoZSBcMC4KICovCkxQU1RSIFdJTkFQSSBQYXRoR2V0QXJncyhMUFNUUiBjbWRsaW5lKSB7CiAgICBCT09MMzIJcWZsYWcgPSBGQUxTRTsKICBUUkFDRShzaGVsbCwiJXNcbiIsY21kbGluZSk7CiAgICB3aGlsZSAoKmNtZGxpbmUpIHsKICAgIAlpZiAoKCpjbWRsaW5lPT0nICcpICYmICFxZmxhZykKCQlyZXR1cm4gY21kbGluZSsxOwoJaWYgKCpjbWRsaW5lPT0nIicpCgkJcWZsYWc9IXFmbGFnOwoJY21kbGluZSsrOwogICAgfQogICAgcmV0dXJuIGNtZGxpbmU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhVbnF1b3RlU3BhY2VzIFtTSEVMTDMyLjU2XQogKiAKICogTk9URVMKICogICAgIHVucXVvdGUgc3RyaW5nIChyZW1vdmUgIikKICovClZPSUQgV0lOQVBJIFBhdGhVbnF1b3RlU3BhY2VzKExQU1RSIHN0cikgewogICAgRFdPUkQgICAgICBsZW4gPSBsc3RybGVuMzJBKHN0cik7CiAgICBUUkFDRShzaGVsbCwiJXNcbiIsc3RyKTsKICAgIGlmICgqc3RyIT0nIicpIHJldHVybjsKICAgIGlmIChzdHJbbGVuLTFdIT0nIicpIHJldHVybjsKICAgIHN0cltsZW4tMV09J1wwJzsKICAgIGxzdHJjcHkzMkEoc3RyLHN0cisxKTsKICAgIHJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGFyc2VGaWVsZCBbU0hFTEwzMi41OF0KICoKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkKExQQ1NUUiBzcmMsRFdPUkQgeDIsTFBTVFIgdGFyZ2V0LERXT1JEIHBhdGhsZW4pIHsKCUZJWE1FKHNoZWxsLCIoJXMsMHglMDhseCwlcCwlbGQpOnN0dWIuXG4iLAoJCXNyYyx4Mix0YXJnZXQscGF0aGxlbgoJKTsKCWlmICghc3JjKQoJCXJldHVybiAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBpY2tJY29uRGxnIFtTSEVMTDMyLjYyXQogKiAKICovCkRXT1JEIFdJTkFQSSBQaWNrSWNvbkRsZyhEV09SRCB4LERXT1JEIHksRFdPUkQgeixEV09SRCBhKSB7CglGSVhNRShzaGVsbCwiKCUwOGx4LCUwOGx4LCUwOGx4LCUwOGx4KTpzdHViLlxuIix4LHkseixhKTsKCXJldHVybiAweGZmZmZmZmZmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXRGaWxlTmFtZUZyb21Ccm93c2UgW1NIRUxMMzIuNjNdCiAqIAogKi8KRFdPUkQgV0lOQVBJIEdldEZpbGVOYW1lRnJvbUJyb3dzZShIV05EMzIgaG93bmVyLCBMUFNUUiB0YXJnZXRidWYsIERXT1JEIGxlbiwgRFdPUkQgeCwgTFBDU1RSIHN1ZmZpeCwgTFBDU1RSIHksIExQQ1NUUiBjbWQpIHsKICAgIEZJWE1FKHNoZWxsLCIoJTA0eCwlcCwlbGQsJTA4bHgsJXMsJXMsJXMpOnN0dWIuXG4iLAoJICAgIGhvd25lcix0YXJnZXRidWYsbGVuLHgsc3VmZml4LHksY21kCiAgICApOwogICAgLyogcHV0cyB1cCBhIE9wZW4gRGlhbG9nIGFuZCByZXF1ZXN0cyBpbnB1dCBpbnRvIHRhcmdldGJ1ZiAqLwogICAgLyogT0ZOX0hJREVSRUFET05MWXxPRk5fTk9DSEFOR0VESVJ8T0ZOX0ZJTEVNVVNURVhJU1R8T0ZOX3Vua25vd24gKi8KICAgIGxzdHJjcHkzMkEodGFyZ2V0YnVmLCJ4OlxcczMuZXhlIik7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRTZXR0aW5ncyBbU0hFTEwzMi42OF0KICogCiAqLwpEV09SRCBXSU5BUEkgU0hHZXRTZXR0aW5ncyhEV09SRCB4LERXT1JEIHksRFdPUkQgeikgewoJRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCgkJeCx5LHoKCSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxfR2V0Q2FjaGVkSW1hZ2VJbmRleCBbU0hFTEwzMi43Ml0KICoKICovCnZvaWQgV0lOQVBJIFNoZWxsX0dldENhY2hlZEltYWdlSW5kZXgoTFBTVFIgeCxEV09SRCB5LERXT1JEIHopIAp7IEZJWE1FKHNoZWxsLCIoJXMsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHgseSx6KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZSBbU0hFTEwzMi43M10KICoKICogUEFSQU1FVEVSUwogKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCiAqICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aAogKiAgdU1zZyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtCiAqICBsUGFyYW0KICoKICogTk9URVMKICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAqICAgIFRoaXMgbWVzc2FnZSBnZXRzIHNlbnQgd2hlbiBhIGNvbHVtbiBnZXRzIGNsaWNrZWQgdG8gaW5zdHJ1Y3QgdGhlCiAqICAgIHNoZWxsIHZpZXcgdG8gcmUtc29ydCB0aGUgaXRlbSBsaXN0LiBsUGFyYW0gaWRlbnRpZmllcyB0aGUgY29sdW1uCiAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAqLwppbnQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoSFdORDMyIGh3bmRDYWJpbmV0LFVJTlQzMiB1TXNnLExQQVJBTSBsUGFyYW0pCnsgRklYTUUoc2hlbGwsIiUwNHggJTA4dXggJTA4bHggc3R1YlxuIixod25kQ2FiaW5ldCx1TXNnLGxQYXJhbSk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhZZXRBbm90aGVyTWFrZVVuaXF1ZU5hbWUgW1NIRUxMMzIuNzVdCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KQk9PTDMyIFdJTkFQSSBQYXRoWWV0QW5vdGhlck1ha2VVbmlxdWVOYW1lKExQRFdPUkQgeCxMUERXT1JEIHkpIHsKICAgIEZJWE1FKHNoZWxsLCIoJXAsJXApOnN0dWIuXG4iLHgseSk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hNYXBQSURMVG9TeXN0ZW1JbWFnZUxpc3RJbmRleCBbU0hFTEwzMi43N10KICoKICogUEFSQU1FVEVSUwogKiB4ICBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIElTaGVsbEZvbGRlciAKICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqCiAqLwpEV09SRCBXSU5BUEkKU0hNYXBQSURMVG9TeXN0ZW1JbWFnZUxpc3RJbmRleChMUFNIRUxMRk9MREVSIHNoLERXT1JEIHksRFdPUkQgeikKeyBGSVhNRShzaGVsbCwiKGZvbGRlcj0lcCwlMDhseCwlMDhseCk6c3R1Yi5cbiIsc2gseSx6KTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT2xlU3RyVG9TdHJOICBbU0hFTEwzMi43OF0KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqIEZJWE1FCiAqICB3cm9uZyBpbXBsZW1lbnRlZCBPbGVTdHIgaXMgTk9UIHdpZGUgc3RyaW5nICEhISEgKGpzY2gpCiAqLwpCT09MMzIgV0lOQVBJCk9sZVN0clRvU3RyTiAoTFBTVFIgbHBNdWx0aSwgSU5UMzIgbk11bHRpLCBMUENXU1RSIGxwV2lkZSwgSU5UMzIgbldpZGUpIHsKICAgIHJldHVybiBXaWRlQ2hhclRvTXVsdGlCeXRlICgwLCAwLCBscFdpZGUsIG5XaWRlLAogICAgICAgIGxwTXVsdGksIG5NdWx0aSwgTlVMTCwgTlVMTCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0clRvT2xlU3RyTiAgW1NIRUxMMzIuNzldCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqIEZJWE1FCiAqICB3cm9uZyBpbXBsZW1lbnRlZCBPbGVTdHIgaXMgTk9UIHdpZGUgc3RyaW5nICEhISEgKGpzY2gpCiovCkJPT0wzMiBXSU5BUEkKU3RyVG9PbGVTdHJOIChMUFdTVFIgbHBXaWRlLCBJTlQzMiBuV2lkZSwgTFBDU1RSIGxwTXVsdGksIElOVDMyIG5NdWx0aSkgewogICAgcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIgKDAsIDAsIGxwTXVsdGksIG5NdWx0aSwgbHBXaWRlLCBuV2lkZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2xvbmVTcGVjaWFsSURMaXN0IFtTSEVMTDMyLjg5XQogKiAKICogUEFSQU1FVEVSUwogKiAgaHduZE93bmVyIAlbaW5dIAogKiAgbkZvbGRlciAJW2luXQlDU0lETF94eHh4eCA/PwogKgogKiBSRVRVUk5TCiAqICBwaWRsID8/CiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpMUElURU1JRExJU1QgV0lOQVBJIFNIQ2xvbmVTcGVjaWFsSURMaXN0KEhXTkQzMiBod25kT3duZXIsRFdPUkQgbkZvbGRlcixEV09SRCB4MykKewlMUElURU1JRExJU1QgcHBpZGw7CglXQVJOKHNoZWxsLCIoaHduZD0weCV4LGNzaWRsPTB4JWx4LDB4JWx4KTpzZW1pLXN0dWIuXG4iLAoJCQkJCSBod25kT3duZXIsbkZvbGRlcix4Myk7CgoJU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24oaHduZE93bmVyLCBuRm9sZGVyLCAmcHBpZGwpOwoKCXJldHVybiBwcGlkbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNMRk5Ecml2ZSBbU0hFTEwzMi4xMTldCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbCBOYW1lCiAqLwpCT09MMzIgV0lOQVBJIElzTEZORHJpdmUoTFBDU1RSIHBhdGgpIHsKICAgIERXT1JECWZubGVuOwoKICAgIGlmICghR2V0Vm9sdW1lSW5mb3JtYXRpb24zMkEocGF0aCxOVUxMLDAsTlVMTCwmZm5sZW4sTlVMTCxOVUxMLDApKQoJcmV0dXJuIEZBTFNFOwogICAgcmV0dXJuIGZubGVuPjEyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFNwZWNpYWxGb2xkZXJQYXRoIFtTSEVMTDMyLjE3NV0KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoKERXT1JEIHgxLERXT1JEIHgyLERXT1JEIHgzLERXT1JEIHg0KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA0bHgsMHglMDRseCxjc2lkbD0weCUwNGx4LDB4JTA0bHgpOnN0dWIuXG4iLAogICAgICB4MSx4Mix4Myx4NAogICAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVnaXN0ZXJTaGVsbEhvb2sgW1NIRUxMMzIuMTgxXQogKgogKiBQQVJBTVMKICogICAgICBod25kIFtJXSAgd2luZG93IGhhbmRsZQogKiAgICAgIHkgICAgW0ldICBmbGFnID8/Pz8KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vazMyKEhXTkQzMiBod25kLCBEV09SRCB5KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4eCwweCUwOGx4KTpzdHViLlxuIixod25kLHkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBIFtTSEVMTDMyLjE4M10KICoKICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8Kdm9pZCBfX2NkZWNsClNoZWxsTWVzc2FnZUJveEEoSE1PRFVMRTMyIGhtb2QsSFdORDMyIGh3bmQsRFdPUkQgaWQsRFdPUkQgeCxEV09SRCB0eXBlLExQVk9JRCBhcmdsaXN0KSB7CgljaGFyCWJ1ZlsxMDBdLGJ1ZjJbMTAwXS8qLCpidWYzKi87Ci8qCUxQVk9JRAlhcmdzID0gJmFyZ2xpc3Q7Ki8KCglpZiAoIUxvYWRTdHJpbmczMkEoaG1vZCx4LGJ1ZiwxMDApKQoJCXN0cmNweShidWYsIkRlc2t0b3AiKTsKLy8JTG9hZFN0cmluZzMyQShobW9kLGlkLGJ1ZjIsMTAwKTsKCS8qIEZJWE1FOiB0aGUgdmFyYXJncyBoYW5kbGluZyBkb2Vzbid0LiAqLwovLwlGb3JtYXRNZXNzYWdlMzJBKDB4NTAwLGJ1ZjIsMCwwLChMUFNUUikmYnVmMywyNTYsKExQRFdPUkQpJmFyZ3MpOwoKCUZJWE1FKHNoZWxsLCIoJTA4bHgsJTA4bHgsJTA4bHgoJXMpLCUwOGx4KCVzKSwlMDhseCwlcCk6c3R1Yi5cbiIsCgkJKERXT1JEKWhtb2QsKERXT1JEKWh3bmQsaWQsYnVmMix4LGJ1Zix0eXBlLGFyZ2xpc3QKCSk7CgkvKk1lc3NhZ2VCb3gzMkEoaHduZCxidWYzLGJ1ZixpZHwweDEwMDAwKTsqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlc3RyaWN0ZWQgW1NIRUxMMzIuMTAwXQogKgogKiB3YWxrcyB0aHJvdWdoIHBvbGljeSB0YWJsZSwgcXVlcmllcyA8YXBwPiBrZXksIDx0eXBlPiB2YWx1ZSwgcmV0dXJucyAKICogcXVlcmllZCAoRFdPUkQpIHZhbHVlLgogKiB7MHgwMDAwMSxFeHBsb3JlcixOb1J1bn0KICogezB4MDAwMDIsRXhwbG9yZXIsTm9DbG9zZX0KICogezB4MDAwMDQsRXhwbG9yZXIsTm9TYXZlU2V0dGluZ3N9CiAqIHsweDAwMDA4LEV4cGxvcmVyLE5vRmlsZU1lbnV9CiAqIHsweDAwMDEwLEV4cGxvcmVyLE5vU2V0Rm9sZGVyc30KICogezB4MDAwMjAsRXhwbG9yZXIsTm9TZXRUYXNrYmFyfQogKiB7MHgwMDA0MCxFeHBsb3JlcixOb0Rlc2t0b3B9CiAqIHsweDAwMDgwLEV4cGxvcmVyLE5vRmluZH0KICogezB4MDAxMDAsRXhwbG9yZXIsTm9Ecml2ZXN9CiAqIHsweDAwMjAwLEV4cGxvcmVyLE5vRHJpdmVBdXRvUnVufQogKiB7MHgwMDQwMCxFeHBsb3JlcixOb0RyaXZlVHlwZUF1dG9SdW59CiAqIHsweDAwODAwLEV4cGxvcmVyLE5vTmV0SG9vZH0KICogezB4MDEwMDAsRXhwbG9yZXIsTm9TdGFydEJhbm5lcn0KICogezB4MDIwMDAsRXhwbG9yZXIsUmVzdHJpY3RSdW59CiAqIHsweDA0MDAwLEV4cGxvcmVyLE5vUHJpbnRlclRhYnN9CiAqIHsweDA4MDAwLEV4cGxvcmVyLE5vRGVsZXRlUHJpbnRlcn0KICogezB4MTAwMDAsRXhwbG9yZXIsTm9BZGRQcmludGVyfQogKiB7MHgyMDAwMCxFeHBsb3JlcixOb1N0YXJ0TWVudVN1YkZvbGRlcnN9CiAqIHsweDQwMDAwLEV4cGxvcmVyLE15RG9jc09uTmV0fQogKiB7MHg4MDAwMCxXaW5PbGRBcHAsTm9SZWFsTW9kZX0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJlc3RyaWN0ZWQgKERXT1JEIHBvbCkgewoJSEtFWQl4aGtleTsKCglGSVhNRShzaGVsbCwiKCUwOGx4KTpzdHViLlxuIixwb2wpOwoJaWYgKFJlZ09wZW5LZXkzMkEoSEtFWV9DVVJSRU5UX1VTRVIsIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxQb2xpY2llcyIsJnhoa2V5KSkKCQlyZXR1cm4gMDsKCS8qIEZJWE1FOiBkbyBub3RoaW5nIGZvciBub3csIGp1c3QgcmV0dXJuIDAgKD09ICJhbGxvd2VkIikgKi8KCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoR2V0RXh0ZW5zaW9uIFtTSEVMTDMyLjE1OF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkxQU1RSIFdJTkFQSSBQYXRoR2V0RXh0ZW5zaW9uKExQU1RSIHBhdGgsRFdPUkQgeSxEV09SRCB6KQp7IFRSQUNFKHNoZWxsLCIoJXMsJTA4bHgsJTA4bHgpXG4iLHBhdGgseSx6KTsKICAgIHBhdGggPSBQYXRoRmluZEV4dGVuc2lvbihwYXRoKTsKICAgIHJldHVybiAqcGF0aD8ocGF0aCsxKTpwYXRoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENyZWF0ZURpcmVjdG9yeSBbU0hFTEwzMi4xNjVdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBvcmRpbmFsCiAqICBub3Qgc3VyZSBhYm91dCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMKICovCkRXT1JEIFdJTkFQSSBTSENyZWF0ZURpcmVjdG9yeShMUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2VjLExQQ1NUUiBwYXRoKSB7CglUUkFDRShzaGVsbCwiKCVwLCVzKTpzdHViLlxuIixzZWMscGF0aCk7CglpZiAoQ3JlYXRlRGlyZWN0b3J5MzJBKHBhdGgsc2VjKSkKCQlyZXR1cm4gVFJVRTsKCS8qIFNIQ2hhbmdlTm90aWZ5KDgsMSxwYXRoLDApOyAqLwoJcmV0dXJuIEZBTFNFOwojaWYgMAoJaWYgKFNIRUxMMzJfNzkocGF0aCwoTFBWT0lEKXgpKQoJCXJldHVybiAwOwoJRklYTUUoc2hlbGwsIiglMDhseCwlcyk6c3R1Yi5cbiIseCxwYXRoKTsKCXJldHVybiAwOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlIFtTSEVMTDMyLjE5NV0KICoKICogTk9URVMKICogICAgIGZyZWVfcHRyKCkgLSBmcmVlcyBtZW1vcnkgdXNpbmcgSU1hbGxvYwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIRnJlZShMUFZPSUQgeCkgewogIFRSQUNFKHNoZWxsLCIlcFxuIix4KTsKICAvKnJldHVybiBMb2NhbEZyZWUzMigoSEFORExFMzIpeCk7Ki8gLyogY3Jhc2hlcyAqLwogIHJldHVybiBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAseCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2MgW1NIRUxMMzIuMTk2XQogKgogKiBOT1RFUwogKiAgICAgdm9pZCAqdGFza19hbGxvYyhEV09SRCBsZW4pLCB1c2VzIFNITWFsbG9jIGFsbG9jYXRvcgogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KTFBWT0lEIFdJTkFQSSBTSEFsbG9jKERXT1JEIGxlbikgewogLyogdm9pZCAqIHJldCA9IChMUFZPSUQpTG9jYWxBbGxvYzMyKGxlbixMTUVNX1pFUk9JTklUKTsqLyAvKiBjaHJhc2hlcyAqLwogdm9pZCAqIHJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKICBUUkFDRShzaGVsbCwiJWx1IGJ5dGVzIGF0ICVwXG4iLGxlbiwgcmV0KTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPcGVuUmVnU3RyZWFtIFtTSEVMTDMyLjg1XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIE9wZW5SZWdTdHJlYW0oRFdPUkQgeDEsRFdPUkQgeDIsRFdPUkQgeDMsRFdPUkQgeDQpIHsKICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCiAgICAJeDEseDIseDMseDQKICAgICk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdpc3RlckRyYWdEcm9wIFtTSEVMTDMyLjg2XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmVnaXN0ZXJEcmFnRHJvcChIV05EMzIgaHduZCxEV09SRCB4MikgewogICAgRklYTUUgKHNoZWxsLCAiKDB4JTA4eCwweCUwOGx4KTpzdHViLlxuIiwgaHduZCwgeDIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmV2b2tlRHJhZ0Ryb3AgW1NIRUxMMzIuODddCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hSZXZva2VEcmFnRHJvcChEV09SRCB4KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgpOnN0dWIuXG4iLHgpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJ1bkZpbGVEbGcgW1NIRUxMMzIuNjFdCiAqCiAqIE5PVEVTCiAqICAgICBPcmlnaW5hbCBuYW1lOiBSdW5GaWxlRGxnIChleHBvcnRlZCBieSBvcmRpbmFsKQogKi8KRFdPUkQgV0lOQVBJClJ1bkZpbGVEbGcgKEhXTkQzMiBod25kT3duZXIsIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwKCSAgICBMUFNUUiBscHN6VGl0bGUsIExQU1RSIGxwc3pQcm9tcHQsIFVJTlQzMiB1RmxhZ3MpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JTA4eCAweCVseCAweCVseCBcIiVzXCIgXCIlc1wiIDB4JXgpOnN0dWIuXG4iLAoJICAgaHduZE93bmVyLCBkd1BhcmFtMSwgZHdQYXJhbTIsIGxwc3pUaXRsZSwgbHBzelByb21wdCwgdUZsYWdzKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBFeGl0V2luZG93c0RpYWxvZyBbU0hFTEwzMi42MF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSQpFeGl0V2luZG93c0RpYWxvZyAoSFdORDMyIGh3bmRPd25lcikKewogICAgRklYTUUgKHNoZWxsLCIoMHglMDh4KTpzdHViLlxuIiwgaHduZE93bmVyKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBcnJhbmdlV2luZG93cyBbU0hFTEwzMi4xODRdCiAqIAogKi8KRFdPUkQgV0lOQVBJCkFycmFuZ2VXaW5kb3dzIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsIERXT1JEIGR3UGFyYW0zLAoJCURXT1JEIGR3UGFyYW00LCBEV09SRCBkd1BhcmFtNSkKewogICAgRklYTUUgKHNoZWxsLCIoMHglbHggMHglbHggMHglbHggMHglbHggMHglbHgpOnN0dWIuXG4iLAoJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1BhcmFtMywgZHdQYXJhbTQsIGR3UGFyYW01KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENMU0lERnJvbVN0cmluZyBbU0hFTEwzMi4xNDddCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKU0hDTFNJREZyb21TdHJpbmcgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKewogICAgRklYTUUgKHNoZWxsLCIoMHglbHggMHglbHgpOnN0dWIuXG4iLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgRklYTUUgKHNoZWxsLCIoXCIlc1wiIFwiJXNcIik6c3R1Yi5cbiIsIChMUFNUUilkd1BhcmFtMSwgKExQU1RSKWR3UGFyYW0yKTsKCiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNpZ25hbEZpbGVPcGVuIFtTSEVMTDMyLjEwM10KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSQpTaWduYWxGaWxlT3BlbiAoRFdPUkQgZHdQYXJhbTEpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JTA4bHgpOnN0dWIuXG4iLCBkd1BhcmFtMSk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWRkVG9SZWNlbnREb2NzIFtTSEVMTDMyLjIzNF0KICoKICogUEFSQU1FVEVSUwogKiAgIHVGbGFncyAgW0lOXSBTSEFSRF9QQVRIIG9yIFNIQVJEX1BJREwKICogICBwdiAgICAgIFtJTl0gc3RyaW5nIG9yIHBpZGwsIE5VTEwgY2xlYXJzIHRoZSBsaXN0CiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hBZGRUb1JlY2VudERvY3MzMiAoVUlOVDMyIHVGbGFncyxMUENWT0lEIHB2KSAgIAp7IGlmIChTSEFSRF9QSURMPT11RmxhZ3MpCiAgeyBGSVhNRSAoc2hlbGwsIigweCUwOHgscGlkbD0lcCk6c3R1Yi5cbiIsIHVGbGFncyxwdik7Cgl9CgllbHNlCgl7IEZJWE1FIChzaGVsbCwiKDB4JTA4eCwlcyk6c3R1Yi5cbiIsIHVGbGFncywoY2hhciopcHYpOwoJfQogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZpbGVPcGVyYXRpb24gW1NIRUxMMzIuMjQyXQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KRFdPUkQgV0lOQVBJIFNIRmlsZU9wZXJhdGlvbjMyICgKICAgIExQU0hGSUxFT1BTVFJVQ1QzMkEgbHBGaWxlT3ApICAgCnsgRklYTUUgKHNoZWxsLCIoJXApOnN0dWIuXG4iLCBscEZpbGVPcCk7CiAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5IFtTSEVMTDMyLjIzOV0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSENoYW5nZU5vdGlmeTMyICgKICAgIElOVDMyICAgd0V2ZW50SWQsICAvKiBbSU5dIGZsYWdzIHRoYXQgc3BlY2lmaWVzIHRoZSBldmVudCovCiAgICBVSU5UMzIgIHVGbGFncywgICAvKiBbSU5dIHRoZSBtZWFuaW5nIG9mIGR3SXRlbVsxfDJdKi8KCQlMUENWT0lEIGR3SXRlbTEsCgkJTFBDVk9JRCBkd0l0ZW0yKQp7IEZJWE1FIChzaGVsbCwiKDB4JTA4eCwweCUwOHV4LCVwLCVwKTpzdHViLlxuIiwgd0V2ZW50SWQsdUZsYWdzLGR3SXRlbTEsZHdJdGVtMik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeCBbU0hFTEwzMi4xNzRdCiAqCiAqIE5PVEVTCiAqICBzZWUgSVNoZWxsRm9sZGVyOjpDcmVhdGVWaWV3T2JqZWN0CiAqLwpIUkVTVUxUIFdJTkFQSSBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4MzIoCiAgTFBTSEVMTFZJRVdEQVRBIHBzdmNiaSwgLypbaW4gXSBzaGVsbHRlbXBsYXRlIHN0cnVjdCovCiAgTFBWT0lEKiBwcHYpICAgICAgICAgICAgLypbb3V0XSBJU2hlbGxWaWV3IHBvaW50ZXIqLwp7IEZJWE1FIChzaGVsbCwiKCVwLCVwKTpzdHViLlxuIiwgcHN2Y2JpLHBwdik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaW5kX0luaXRNZW51UG9wdXAgW1NIRUxMMzIuMTQ5XQogKgogKiBOT1RFUwogKiAgUmVnaXN0ZXJzIHRoZSBtZW51IGJlaGluZCB0aGUgIlN0YXJ0IiBidXR0b24KICoKICogUEFSQU1FVEVSUwogKiAgaE1lbnUJCVtpbl0gaGFuZGVsIG9mIG1lbnUgcHJldmlvdXNseSBjcmVhdGVkCiAqICBoV25kUGFyZW50CVtpbl0gcGFyZW50IHdpbmRvdwogKiAgdwkJCVtpbl0gbm8gcG9pbnRlcgogKiAgeAkJCVtpbl0gbm8gcG9pbnRlcgogKi8KSFJFU1VMVCBXSU5BUEkgU0hGaW5kX0luaXRNZW51UG9wdXAgKEhNRU5VMzIgaE1lbnUsIEhXTkQzMiBoV25kUGFyZW50LCBEV09SRCB3LCBEV09SRCB4KQp7CUZJWE1FKHNoZWxsLCJobWVudT0weCUwOHggaHduZD0weCUwOHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIsCgkJaE1lbnUsaFduZFBhcmVudCx3LHgpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZU1lbnVfSW5pdE1lbnVQb3B1cCBbU0hFTEwzMi4xMDldCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBGaWxlTWVudV9Jbml0TWVudVBvcHVwIChEV09SRCBobWVudSkKewlGSVhNRShzaGVsbCwiaG1lbnU9MHglbHggc3R1YlxuIixobWVudSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlTWVudV9DcmVhdGUgW1NIRUxMMzIuMTE0XQogKgogKiB3IHJldHZhbCBmcm9tIExvYWRCaXRtYXBBCiAqCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBGaWxlTWVudV9DcmVhdGUgKERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHopCnsgRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCBoYm1wPTB4JWx4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLHUsdix3LHgseik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZU1lbnVfVHJhY2tQb3B1cE1lbnVFeCBbU0hFTEwzMi4xMTZdCiAqCiAqIFBBUkFNRVRFUlMKICogIHVGbGFncwkJW2luXQlhY2NvcmRpbmcgdG8gVHJhY2tQb3B1cE1lbnVFeAogKiAgcG9zWAkJW2luXQogKiAgcG9zWQkJW2luXQogKiAgaFduZFBhcmVudAkJW2luXQogKiAgegljb3VsZCBiZSByZWN0ICh0cmFjZSkgb3IgVFBNUEFSQU1TIChUcmFja1BvcHVwTWVudUV4KQogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfVHJhY2tQb3B1cE1lbnVFeCAoRFdPUkQgdCwgRFdPUkQgdUZsYWdzLCBEV09SRCBwb3NYLCBEV09SRCBwb3NZLCBIV05EMzIgaFduZFBhcmVudCwgRFdPUkQgeikKewlGSVhNRShzaGVsbCwiMHglbHggZmxhZ3M9MHglbHggcG9zeD0weCVseCBwb3N5PTB4JWx4IGh3bmRwPTB4JXggMHglbHggc3R1YlxuIiwKCQl0LHVGbGFncyxwb3NYLHBvc1ksIGhXbmRQYXJlbnQseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hXaW5IZWxwIFtTSEVMTDMyLjEyN10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIV2luSGVscCAoRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRShzaGVsbCwiMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLHYsdyx4LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIUnVuQ29ucm9sUGFuZWwgW1NIRUxMMzIuMTYxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSdW5Db25yb2xQYW5lbCAoRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRShzaGVsbCwiMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4IFtTSEVMTDMyLjI5MV0KICoKICovCkJPT0wzMiBXSU5BUEkgU2hlbGxFeGVjdXRlRXgzMkEgKExQU0hFTExFWEVDVVRFSU5GTzMyQSBzZWkpCnsgCUNIQVIgc3pUZW1wW01BWF9QQVRIXTsKICAJRklYTUUoc2hlbGwsIiVwIHN0dWJcbiIsc2VpKTsKCglpZiAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0lETElTVCkKCXsgU0hHZXRQYXRoRnJvbUlETGlzdDMyQSAoc2VpLT5scElETGlzdCxzelRlbXApOwoJICBUUkFDRSAoc2hlbGwsIi0tIGlkbGlzdD0lcCAoJXMpXG4iLCBzZWktPmxwSURMaXN0LCBzelRlbXApOwoJfQoKCWlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKQoJeyBUUkFDRSAoc2hlbGwsIi0tIGNsYXNzbmFtZT0gJXNcbiIsIHNlaS0+bHBDbGFzcyk7Cgl9CiAgICAKCWlmIChzZWktPmxwVmVyYikKCXsgVFJBQ0UgKHNoZWxsLCItLSBhY3Rpb249JXNcbiIsIHNlaS0+bHBWZXJiKTsKCX0KCQoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTZXRJbnN0YW5jZUV4cGxvcmVyIFtTSEVMTDMyLjE3Nl0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIU2V0SW5zdGFuY2VFeHBsb3JlciAoRFdPUkQgdSkKewlGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRJbnN0YW5jZUV4cGxvcmVyIFtTSEVMTDMyLjI1Nl0KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0SW5zdGFuY2VFeHBsb3JlciAoRFdPUkQgdSkKewlGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlVW51c2VkTGlicmFyaWVzIFtTSEVMTDMyLjEyM10KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkhSRVNVTFQgV0lOQVBJIFNIRnJlZVVudXNlZExpYnJhcmllcyAoRFdPUkQgdSkKewlGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX1Nob3dEcmFnSW1hZ2UgW1NIRUxMMzIuMTM3XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgREFEX1Nob3dEcmFnSW1hZ2UgKERXT1JEIHUpCnsgRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix1KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlTWVudV9EZXN0cm95IFtTSEVMTDMyLjExOF0KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkhSRVNVTFQgV0lOQVBJIEZpbGVNZW51X0Rlc3Ryb3kgKERXT1JEIHUpCnsgRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix1KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldERhdGFGcm9tSURMaXN0QSBbU0hFTEwzMi4yNDddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEdldERhdGFGcm9tSURMaXN0QShEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB5KQp7CUZJWE1FKHNoZWxsLCIweCUwNGx4IDB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIix1LHYsdyx4LHkpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaWxlT3BlcmF0aW9uQSBbU0hFTEwzMi4yNDNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZpbGVPcGVyYXRpb25BKERXT1JEIHgpCnsJRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix4KTsKCXJldHVybiAwOwoKfQo=