Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
$agentFiles = unserialize(base64_decode('YToyMTp7czo4OiJodHRwLnBocCI7czoxMzk4OiI8P3BocAoKZ..
Decoded Output download
<? $agentFiles = unserialize(base64_decode('YToyMTp7czo4OiJodHRwLnBocCI7czoxMzk4OiI8P3BocAoKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAxKTsKCiRhdXRoZW50aWNhdGVkID0gZmFsc2U7CnRyeSB7CiAgICAvLyBQYXJzZSByZXF1ZXN0CiAgICAkcmVxdWVzdCA9IEdyYXZpdHlzY2FuUmVxdWVzdDo6Y3JlYXRlRnJvbUdsb2JhbHMoKTsKICAgICRncmF2aXR5c2NhbkFnZW50ID0gbmV3IEdyYXZpdHlzY2FuQWdlbnQoJHJlcXVlc3QsIG5ldyBHcmF2aXR5c2NhblJlc3BvbnNlKTsKCiAgICBpZiAoJHJlcXVlc3QtPmdldE1ldGhvZCgpID09PSAnR0VUJykgewogICAgICAgICRncmF2aXR5c2NhbkFnZW50LT5nZXRSZXNwb25zZSgpCiAgICAgICAgICAgIC0+c2V0U3RhdHVzQ29kZSgyMDApCiAgICAgICAgICAgIC0+c2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJykKICAgICAgICAgICAgLT5zZXRCb2R5KGdzSW5jbHVkZUZpbGUoJ2RpYWdub3N0aWNzLnBocCcpKQogICAgICAgICAgICAtPnNlbmQoKTsKICAgIH0KCiAgICAvLyBBdXRoZW50aWNhdGlvbgogICAgJGdyYXZpdHlzY2FuQXV0aCA9IG5ldyBHcmF2aXR5c2NhbkFnZW50QXV0aCgpOwogICAgJGdyYXZpdHlzY2FuQXV0aC0+c2V0U2lnbmF0dXJlKHBhY2soIkgqIiwgJHJlcXVlc3QtPmdldEhlYWRlcignWC1HcmF2aXR5c2Nhbi1TaWduYXR1cmUnKSkpCiAgICAgICAgLT5zZXRNZXNzYWdlKCRyZXF1ZXN0LT5nZXRCb2R5KCkpCiAgICAgICAgLT5zZXRQdWJsaWNLZXkoZ3NDb25maWcoJ3B1YmxpY19rZXknKSkKICAgICAgICAtPmF1dGhlbnRpY2F0ZSgpOwoKICAgICRhdXRoZW50aWNhdGVkID0gdHJ1ZTsKCiAgICAvLyBJc3N1ZSBjb21tYW5kcwogICAgJGdyYXZpdHlzY2FuQWdlbnQtPnJ1bigpOwoKfSBjYXRjaCAoR3Jhdml0eXNjYW5FeGNlcHRpb24gJGUpIHsKICAgICRncmF2aXR5c2NhbkFnZW50LT5nZXRSZXNwb25zZSgpCiAgICAgICAgLT5zZXRTdGF0dXNDb2RlKCRlLT5nZXRDb2RlKCkpCiAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAnY29kZScgID0+ICRlLT5nZXRDb2RlKCksCiAgICAgICAgICAgICdlcnJvcicgPT4gJGUtPmdldE1lc3NhZ2UoKSwKICAgICAgICApKQogICAgICAgIC0+c2VuZCgpOwoKfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAkZ3Jhdml0eXNjYW5BZ2VudC0+Z2V0UmVzcG9uc2UoKQogICAgICAgIC0+c2V0U3RhdHVzQ29kZSg1MDApCiAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAnY29kZScgID0+IDUwMCwKICAgICAgICAgICAgJ2Vycm9yJyA9PiAkYXV0aGVudGljYXRlZCA/ICRlLT5nZXRNZXNzYWdlKCkgOiAnVGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgeW91ciByZXF1ZXN0LicsCiAgICAgICAgKSkKICAgICAgICAtPnNlbmQoKTsKfQoiO3M6MzI6ImNsYXNzZXMvR3Jhdml0eXNjYW5BZ2VudEF1dGgucGhwIjtzOjI2MTM6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhbkFnZW50QXV0aAp7CiAgICBwcml2YXRlICRzaWduYXR1cmU7CiAgICBwcml2YXRlICRtZXNzYWdlOwogICAgcHJpdmF0ZSAkcHVibGljS2V5OwoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbmF0dXJlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwdWJsaWNLZXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzaWduYXR1cmUgPSBudWxsLCAkbWVzc2FnZSA9IG51bGwsICRwdWJsaWNLZXkgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zaWduYXR1cmUgPSAkc2lnbmF0dXJlOwogICAgICAgICR0aGlzLT5tZXNzYWdlID0gJG1lc3NhZ2U7CiAgICAgICAgJHRoaXMtPnB1YmxpY0tleSA9ICRwdWJsaWNLZXk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqIEB0aHJvd3MgR3Jhdml0eXNjYW5FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGF1dGhlbnRpY2F0ZSgpCiAgICB7CiAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSBpcyBjb3JyZWN0CiAgICAgICAgaWYgKCEkdGhpcy0+dmVyaWZ5U2lnbmF0dXJlKCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdBY2Nlc3MgZGVuaWVkLicsIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIGhhcyBub3QgZXhwaXJlZC4KICAgICAgICAkanNvbkJvZHkgPSBAanNvbl9kZWNvZGUoJHRoaXMtPmdldE1lc3NhZ2UoKSwgdHJ1ZSk7CiAgICAgICAgaWYgKCEkanNvbkJvZHkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdFcnJvciBwYXJzaW5nIHRoZSBKU09OIHJlcXVlc3QgYm9keS4gRXJyb3IgY29kZTogJyAuIGpzb25fbGFzdF9lcnJvcigpLCA0MjIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzc2V0KCRqc29uQm9keVsnaXNzdWVkLWF0J10pIHx8ICFpc3NldCgkanNvbkJvZHlbJ2V4cGlyZXMtYXQnXSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdgaXNzdWVkLWF0YCBhbmQgYGV4cGlyZXMtYXRgIHRpbWVzdGFtcHMgbXVzdCBiZSBzdXBwbGllZCBpbiB0aGUgcmVxdWVzdCBib2R5LicsIDQyMik7CiAgICAgICAgfQogICAgICAgICRub3cgPSBtaWNyb3RpbWUodHJ1ZSk7CiAgICAgICAgaWYgKCEoJGpzb25Cb2R5Wydpc3N1ZWQtYXQnXSA8PSAkbm93ICYmICRqc29uQm9keVsnZXhwaXJlcy1hdCddID49ICRub3cpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignUmVxdWVzdCBoYXMgZXhwaXJlZC4gQ3VycmVudCBzZXJ2ZXIgdGltZSBpcyAnIC4gJG5vdywgNDIyKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoKQogICAgewogICAgICAgIHJldHVybiBvcGVuc3NsX3ZlcmlmeSgkdGhpcy0+Z2V0TWVzc2FnZSgpLCAkdGhpcy0+Z2V0U2lnbmF0dXJlKCksICR0aGlzLT5nZXRQdWJsaWNLZXkoKSwgT1BFTlNTTF9BTEdPX1NIQTEpID09PSAxOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbmF0dXJlCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQWdlbnRBdXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTaWduYXR1cmUoJHNpZ25hdHVyZSkKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbmF0dXJlID0gJHNpZ25hdHVyZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNpZ25hdHVyZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5BZ2VudEF1dGgKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE1lc3NhZ2UoJG1lc3NhZ2UpCiAgICB7CiAgICAgICAgJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5tZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkcHVibGljS2V5CiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQWdlbnRBdXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRQdWJsaWNLZXkoJHB1YmxpY0tleSkKICAgIHsKICAgICAgICAkdGhpcy0+cHVibGljS2V5ID0gJHB1YmxpY0tleTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHVibGljS2V5KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnB1YmxpY0tleTsKICAgIH0KfSI7czoyODoiY2xhc3Nlcy9HcmF2aXR5c2NhblV0aWxzLnBocCI7czo3NDY3OiI8P3BocAoKY2xhc3MgR3Jhdml0eXNjYW5VdGlscwp7CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJhbmRvbVN0cmluZygkbGVuZ3RoID0gMTYsICRjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCktXyBbXXt9PD5+YCs9LC47Oi8/fCcpCiAgICB7CiAgICAgICAgLy8gVGhpcyBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIHNlbGY6OnJhbmRvbV9pbnQgZm9yICRsZW5ndGgKICAgICAgICAkYnl0ZXMgPSBzZWxmOjpyYW5kb21fYnl0ZXMoJGxlbmd0aCk7CiAgICAgICAgJHJldHVybiA9ICcnOwogICAgICAgICRtYXhJbmRleCA9IHNlbGY6OnN0cmxlbigkY2hhcnMpIC0gMTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRmcCA9IChmbG9hdClvcmQoJGJ5dGVzWyRpXSkgLyAyNTUuMDsgLy8gY29udmVydCB0byBbMCwxXQogICAgICAgICAgICAkaW5kZXggPSAoaW50KShyb3VuZCgkZnAgKiAkbWF4SW5kZXgpKTsKICAgICAgICAgICAgJHJldHVybiAuPSAkY2hhcnNbJGluZGV4XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXR1cm47CiAgICB9CgogICAgLyoqCiAgICAgKiBQb2x5ZmlsbCBmb3IgcmFuZG9tX2J5dGVzLgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJGJ5dGVzCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbV9ieXRlcygkYnl0ZXMpCiAgICB7CiAgICAgICAgJGJ5dGVzID0gKGludCkkYnl0ZXM7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncmFuZG9tX2J5dGVzJykpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRyYW5kID0gcmFuZG9tX2J5dGVzKCRieXRlcyk7CiAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRyYW5kKSAmJiBzZWxmOjpzdHJsZW4oJHJhbmQpID09PSAkYnl0ZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJhbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgICAgICAgIH0gY2F0Y2ggKFR5cGVFcnJvciAkZSkgewogICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yICRlKSB7CiAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtY3J5cHRfY3JlYXRlX2l2JykpIHsKICAgICAgICAgICAgJHJhbmQgPSBAbWNyeXB0X2NyZWF0ZV9pdigkYnl0ZXMsIE1DUllQVF9ERVZfVVJBTkRPTSk7CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHJhbmQpICYmIHNlbGY6OnN0cmxlbigkcmFuZCkgPT09ICRieXRlcykgewogICAgICAgICAgICAgICAgcmV0dXJuICRyYW5kOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ29wZW5zc2xfcmFuZG9tX3BzZXVkb19ieXRlcycpKSB7CiAgICAgICAgICAgICRyYW5kID0gQG9wZW5zc2xfcmFuZG9tX3BzZXVkb19ieXRlcygkYnl0ZXMsICRzdHJvbmcpOwogICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRyYW5kKSAmJiBzZWxmOjpzdHJsZW4oJHJhbmQpID09PSAkYnl0ZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcmFuZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMYXN0IHJlc29ydCBpcyBpbnNlY3VyZQogICAgICAgICRyZXR1cm4gPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkYnl0ZXM7ICRpKyspIHsKICAgICAgICAgICAgJHJldHVybiAuPSBjaHIobXRfcmFuZCgwLCAyNTUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXR1cm47CiAgICB9CgogICAgLyoqCiAgICAgKiBQb2x5ZmlsbCBmb3IgcmFuZG9tX2ludC4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRtaW4KICAgICAqIEBwYXJhbSBpbnQgJG1heAogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByYW5kb21faW50KCRtaW4gPSAwLCAkbWF4ID0gMHg3RkZGRkZGRikKICAgIHsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdyYW5kb21faW50JykpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21faW50KCRtaW4sICRtYXgpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAogICAgICAgICAgICB9IGNhdGNoIChUeXBlRXJyb3IgJGUpIHsKICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAogICAgICAgICAgICB9IGNhdGNoIChFcnJvciAkZSkgewogICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRpZmYgPSAkbWF4IC0gJG1pbjsKICAgICAgICAkYnl0ZXMgPSBzZWxmOjpyYW5kb21fYnl0ZXMoNCk7CiAgICAgICAgaWYgKCRieXRlcyA9PT0gZmFsc2UgfHwgc2VsZjo6c3RybGVuKCRieXRlcykgIT0gNCkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCA0IGJ5dGVzIik7CiAgICAgICAgfQogICAgICAgICR2YWwgPSB1bnBhY2soIk5pbnQiLCAkYnl0ZXMpOwogICAgICAgICR2YWwgPSAkdmFsWydpbnQnXSAmIDB4N0ZGRkZGRkY7CiAgICAgICAgJGZwID0gKGZsb2F0KSR2YWwgLyAyMTQ3NDgzNjQ3LjA7IC8vIGNvbnZlcnQgdG8gWzAsMV0KICAgICAgICByZXR1cm4gKGludCkocm91bmQoJGZwICogJGRpZmYpICsgJG1pbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG1ic3RyaW5nIGludGVybmFsIGVuY29kaW5nIHRvIGEgYmluYXJ5IHNhZmUgZW5jb2Rpbmcgd2hlbiBmdW5jX292ZXJsb2FkCiAgICAgKiBpcyBlbmFibGVkLgogICAgICoKICAgICAqIFdoZW4gbWJzdHJpbmcuZnVuY19vdmVybG9hZCBpcyBpbiB1c2UgZm9yIG11bHRpLWJ5dGUgZW5jb2RpbmdzLCB0aGUgcmVzdWx0cyBmcm9tCiAgICAgKiBzdHJsZW4oKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgcmVzcGVjdCB0aGUgdXRmOCBjaGFyYWN0ZXJzLCBjYXVzaW5nIGJpbmFyeSBkYXRhCiAgICAgKiB0byByZXR1cm4gaW5jb3JyZWN0IGxlbmd0aHMuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIG1ic3RyaW5nIGVuY29kaW5nIHRvIGEgYmluYXJ5LXNhZmUgZW5jb2RpbmcsIGFuZAogICAgICogcmVzZXRzIGl0IHRvIHRoZSB1c2VycyBleHBlY3RlZCBlbmNvZGluZyBhZnRlcndhcmRzIHRocm91Z2ggdGhlCiAgICAgKiBgcmVzZXRfbWJzdHJpbmdfZW5jb2RpbmdgIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEl0IGlzIHNhZmUgdG8gcmVjdXJzaXZlbHkgY2FsbCB0aGlzIGZ1bmN0aW9uLCBob3dldmVyIGVhY2gKICAgICAqIGBtYnN0cmluZ19iaW5hcnlfc2FmZV9lbmNvZGluZygpYCBjYWxsIG11c3QgYmUgZm9sbG93ZWQgdXAgd2l0aCBhbiBlcXVhbCBudW1iZXIKICAgICAqIG9mIGByZXNldF9tYnN0cmluZ19lbmNvZGluZygpYCBjYWxscy4KICAgICAqCiAgICAgKiBAc2VlIHdmV0FGVXRpbHM6OnJlc2V0X21ic3RyaW5nX2VuY29kaW5nCiAgICAgKgogICAgICogQHN0YXRpY3ZhciBhcnJheSAkZW5jb2RpbmdzCiAgICAgKiBAc3RhdGljdmFyIGJvb2wgICRvdmVybG9hZGVkCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJHJlc2V0IE9wdGlvbmFsLiBXaGV0aGVyIHRvIHJlc2V0IHRoZSBlbmNvZGluZyBiYWNrIHRvIGEgcHJldmlvdXNseS1zZXQgZW5jb2RpbmcuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmYWxzZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYnN0cmluZ19iaW5hcnlfc2FmZV9lbmNvZGluZygkcmVzZXQgPSBmYWxzZSkKICAgIHsKICAgICAgICBzdGF0aWMgJGVuY29kaW5ncyA9IGFycmF5KCk7CiAgICAgICAgc3RhdGljICRvdmVybG9hZGVkID0gbnVsbDsKCiAgICAgICAgaWYgKGlzX251bGwoJG92ZXJsb2FkZWQpKQogICAgICAgICAgICAkb3ZlcmxvYWRlZCA9IGZ1bmN0aW9uX2V4aXN0cygnbWJfaW50ZXJuYWxfZW5jb2RpbmcnKSAmJiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMik7CgogICAgICAgIGlmIChmYWxzZSA9PT0gJG92ZXJsb2FkZWQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgaWYgKCEkcmVzZXQpIHsKICAgICAgICAgICAgJGVuY29kaW5nID0gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkZW5jb2RpbmdzLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBtYl9pbnRlcm5hbF9lbmNvZGluZygnSVNPLTg4NTktMScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRyZXNldCAmJiAkZW5jb2RpbmdzKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9IGFycmF5X3BvcCgkZW5jb2RpbmdzKTsKICAgICAgICAgICAgbWJfaW50ZXJuYWxfZW5jb2RpbmcoJGVuY29kaW5nKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXNldCB0aGUgbWJzdHJpbmcgaW50ZXJuYWwgZW5jb2RpbmcgdG8gYSB1c2VycyBwcmV2aW91c2x5IHNldCBlbmNvZGluZy4KICAgICAqCiAgICAgKiBAc2VlIHdmV0FGVXRpbHM6Om1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzZXRfbWJzdHJpbmdfZW5jb2RpbmcoKQogICAgewogICAgICAgIHNlbGY6Om1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nKHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGNhbGxhYmxlICRmdW5jdGlvbgogICAgICogQHBhcmFtIGFycmF5ICRhcmdzCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCRmdW5jdGlvbiwgJGFyZ3MpCiAgICB7CiAgICAgICAgc2VsZjo6bWJzdHJpbmdfYmluYXJ5X3NhZmVfZW5jb2RpbmcoKTsKICAgICAgICAkcmV0dXJuID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmN0aW9uLCAkYXJncyk7CiAgICAgICAgc2VsZjo6cmVzZXRfbWJzdHJpbmdfZW5jb2RpbmcoKTsKICAgICAgICByZXR1cm4gJHJldHVybjsKICAgIH0KCiAgICAvKioKICAgICAqIE11bHRpYnl0ZSBzYWZlIHN0cmxlbi4KICAgICAqCiAgICAgKiBAcGFyYW0gJGJpbmFyeQogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW4oJGJpbmFyeSkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJsZW4nLCAkYXJncyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gJGhheXN0YWNrCiAgICAgKiBAcGFyYW0gJG5lZWRsZQogICAgICogQHBhcmFtIGludCAkb2Zmc2V0CiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJpcG9zJywgJGFyZ3MpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRzdHJpbmcKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJ0b2xvd2VyKCRzdHJpbmcpCiAgICB7CiAgICAgICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNhbGxNQlNhZmVTdHJGdW5jdGlvbignc3RydG9sb3dlcicsICRhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAkc3RyaW5nCiAgICAgKiBAcGFyYW0gJHN0YXJ0CiAgICAgKiBAcGFyYW0gJGxlbmd0aAogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKQogICAgewogICAgICAgICRhcmdzID0gZnVuY19nZXRfYXJncygpOwogICAgICAgIHJldHVybiBzZWxmOjpjYWxsTUJTYWZlU3RyRnVuY3Rpb24oJ3N1YnN0cicsICRhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAkaGF5c3RhY2sKICAgICAqIEBwYXJhbSAkbmVlZGxlCiAgICAgKiBAcGFyYW0gaW50ICRvZmZzZXQKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJwb3MnLCAkYXJncyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoYXlzdGFjawogICAgICogQHBhcmFtIHN0cmluZyAkbmVlZGxlCiAgICAgKiBAcGFyYW0gaW50ICRvZmZzZXQKICAgICAqIEBwYXJhbSBpbnQgJGxlbmd0aAogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1YnN0cl9jb3VudCgkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkbGVuZ3RoID0gbnVsbCkKICAgIHsKICAgICAgICAkaGF5c3RhY2sgPSBzZWxmOjpzdWJzdHIoJGhheXN0YWNrLCAkb2Zmc2V0LCAkbGVuZ3RoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdWJzdHJfY291bnQnLCBhcnJheSgKICAgICAgICAgICAgJGhheXN0YWNrLCAkbmVlZGxlLAogICAgICAgICkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRzdHJpbmcKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJ0b3VwcGVyKCRzdHJpbmcpCiAgICB7CiAgICAgICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNhbGxNQlNhZmVTdHJGdW5jdGlvbignc3RydG91cHBlcicsICRhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhheXN0YWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuZWVkbGUKICAgICAqIEBwYXJhbSBpbnQgJG9mZnNldAogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJycG9zJywgJGFyZ3MpOwogICAgfQoKCn0iO3M6MzU6ImNsYXNzZXMvR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UucGhwIjtzOjEzMjg6Ijw/cGhwCgppbnRlcmZhY2UgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UKewogICAgcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzKCRrZXkpOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJGtleSwgJHZhbHVlKTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCRrZXkpOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBkZWxldGUoJGtleSk7CgogICAgcHVibGljIGZ1bmN0aW9uIGRlc3Ryb3koKTsKfQoKY2xhc3MgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2VTZXNzaW9uIGltcGxlbWVudHMgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UKewoKICAgIHB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCkKICAgIHsKICAgICAgICBpZiAoIShAc2Vzc2lvbl9pZCgpIHx8IEBzZXNzaW9uX3N0YXJ0KCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignVW5hYmxlIHRvIHN0YXJ0IHNlc3Npb24gZm9yIGxvY2FsIHN0b3JhZ2UuICcgLiBlcnJvcl9nZXRfbGFzdCgpLCA1MDApOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzKCRrZXkpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzX2FycmF5KCRfU0VTU0lPTikgJiYKICAgICAgICBhcnJheV9rZXlfZXhpc3RzKCdncmF2aXR5c2Nhbi1hZ2VudCcsICRfU0VTU0lPTikgJiYKICAgICAgICBpc19hcnJheSgkX1NFU1NJT05bJ2dyYXZpdHlzY2FuLWFnZW50J10pICYmCiAgICAgICAgYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkX1NFU1NJT05bJ2dyYXZpdHlzY2FuLWFnZW50J10pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJGtleSwgJHZhbHVlKQogICAgewogICAgICAgICRfU0VTU0lPTlsnZ3Jhdml0eXNjYW4tYWdlbnQnXVska2V5XSA9ICR2YWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCRrZXkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5oYXMoJGtleSkpIHsKICAgICAgICAgICAgcmV0dXJuICRfU0VTU0lPTlsnZ3Jhdml0eXNjYW4tYWdlbnQnXVska2V5XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRlbGV0ZSgka2V5KQogICAgewogICAgICAgIHVuc2V0KCRfU0VTU0lPTlsnZ3Jhdml0eXNjYW4tYWdlbnQnXVska2V5XSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRlc3Ryb3koKQogICAgewogICAgICAgIEBzZXNzaW9uX2Rlc3Ryb3koKTsKICAgIH0KfQoKLy9jbGFzcyBHcmF2aXR5c2NhbkxvY2FsU3RvcmFnZVRlbXAgaW1wbGVtZW50cyBHcmF2aXR5c2NhbkxvY2FsU3RvcmFnZQovL3sKLy8KLy99IjtzOjMyOiJjbGFzc2VzL0dyYXZpdHlzY2FuRXhjZXB0aW9uLnBocCI7czo1NjoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCnsKCn0iO3M6Mjg6ImNsYXNzZXMvR3Jhdml0eXNjYW5BZ2VudC5waHAiO3M6MzI1ODoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuQWdlbnQKewogICAgcHJpdmF0ZSAkcmVxdWVzdDsKICAgIHByaXZhdGUgJHJlc3BvbnNlOwogICAgcHJpdmF0ZSAkbG9jYWxTdG9yYWdlOwoKICAgIC8qKgogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVxdWVzdCAkcmVxdWVzdAogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVzcG9uc2UgJHJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcmVxdWVzdCwgJHJlc3BvbnNlKQogICAgewogICAgICAgICR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7CiAgICAgICAgJHRoaXMtPnJlc3BvbnNlID0gJHJlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoKQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBHcmF2aXR5c2NhbkV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcnVuKCkKICAgIHsKICAgICAgICAkYm9keSA9ICR0aGlzLT5nZXRSZXF1ZXN0KCktPmdldEJvZHkoKTsKICAgICAgICAkanNvbkJvZHkgPSBAanNvbl9kZWNvZGUoJGJvZHksIHRydWUpOwogICAgICAgIGlmICghJGpzb25Cb2R5KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignRXJyb3IgcGFyc2luZyB0aGUgSlNPTiBib2R5LicsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAkY29tbWFuZE5hbWUgPSAhZW1wdHkoJGpzb25Cb2R5Wydjb21tYW5kJ10pICYmIGlzX3N0cmluZygkanNvbkJvZHlbJ2NvbW1hbmQnXSkgPyAkanNvbkJvZHlbJ2NvbW1hbmQnXSA6IG51bGw7CiAgICAgICAgJGNvbW1hbmRBcmdzID0gaXNzZXQoJGpzb25Cb2R5WydhcmdzJ10pID8gJGpzb25Cb2R5WydhcmdzJ10gOiBudWxsOwogICAgICAgICRjb21tYW5kQ2xhc3MgPSAnR3Jhdml0eXNjYW4nIC4gJGNvbW1hbmROYW1lIC4gJ0NvbW1hbmQnOwoKICAgICAgICBpZiAoIWNsYXNzX2V4aXN0cygkY29tbWFuZENsYXNzKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0NvbW1hbmQgJyAuICRjb21tYW5kTmFtZSAuICcgbm90IGZvdW5kLicsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAvKiogQHZhciBHcmF2aXR5c2NhbkNvbW1hbmQgJGNvbW1hbmQgKi8KICAgICAgICAkY29tbWFuZCA9IG5ldyAkY29tbWFuZENsYXNzKCR0aGlzKTsKICAgICAgICAkcmVzdWx0ID0gJGNvbW1hbmQtPnNldEFyZ3MoJGNvbW1hbmRBcmdzKQogICAgICAgICAgICAtPnNldFJlcXVlc3QoJHRoaXMtPmdldFJlcXVlc3QoKSkKICAgICAgICAgICAgLT5zZXRSZXNwb25zZSgkdGhpcy0+Z2V0UmVzcG9uc2UoKSkKICAgICAgICAgICAgLT5leGVjdXRlKCk7CgogICAgICAgIGlmICgkcmVzdWx0KSB7CiAgICAgICAgICAgICR0aGlzLT5nZXRSZXNwb25zZSgpCiAgICAgICAgICAgICAgICAtPnNldEJvZHkoJHJlc3VsdCkKICAgICAgICAgICAgICAgIC0+c2VuZCgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXF1ZXN0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1ZXN0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlcXVlc3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gR3Jhdml0eXNjYW5SZXF1ZXN0ICRyZXF1ZXN0CiAgICAgKiBAcmV0dXJuICR0aGlzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXF1ZXN0KCRyZXF1ZXN0KQogICAgewogICAgICAgICR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSZXNwb25zZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZXNwb25zZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBHcmF2aXR5c2NhblJlc3BvbnNlICRyZXNwb25zZQogICAgICogQHJldHVybiAkdGhpcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVzcG9uc2UoJHJlc3BvbnNlKQogICAgewogICAgICAgICR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuTG9jYWxTdG9yYWdlCiAgICAgKiBAdGhyb3dzIEdyYXZpdHlzY2FuRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbFN0b3JhZ2UoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmxvY2FsU3RvcmFnZSkgewogICAgICAgICAgICAkc3RvcmFnZURyaXZlcnMgPSBhcnJheSgKICAgICAgICAgICAgICAgICdHcmF2aXR5c2NhbkxvY2FsU3RvcmFnZVNlc3Npb24nLAogICAgICAgICAgICAgICAgLy8gJ0dyYXZpdHlzY2FuTG9jYWxTdG9yYWdlVGVtcCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRzdG9yYWdlRHJpdmVycyBhcyAkZHJpdmVyKSB7CiAgICAgICAgICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCRkcml2ZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB2YXIgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UgJHN0b3JhZ2UgKi8KICAgICAgICAgICAgICAgICAgICAkc3RvcmFnZSA9IG5ldyAkZHJpdmVyKCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0b3JhZ2UtPmluaXRpYWxpemUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvY2FsU3RvcmFnZSA9ICRzdG9yYWdlOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEdyYXZpdHlzY2FuRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5sb2NhbFN0b3JhZ2UpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRlKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdVbmFibGUgdG8gdXRpbGl6ZSBsb2NhbCBzdG9yYWdlLicsIDUwMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+bG9jYWxTdG9yYWdlOwogICAgfQoKfQoKIjtzOjMxOiJjbGFzc2VzL0dyYXZpdHlzY2FuUmVzcG9uc2UucGhwIjtzOjU3MzQ6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhblJlc3BvbnNlCnsKICAgIHB1YmxpYyBzdGF0aWMgJHN0YXR1c1RleHRzID0gYXJyYXkoCiAgICAgICAgMTAwID0+ICdDb250aW51ZScsCiAgICAgICAgMTAxID0+ICdTd2l0Y2hpbmcgUHJvdG9jb2xzJywKICAgICAgICAxMDIgPT4gJ1Byb2Nlc3NpbmcnLCAgICAgICAgICAgIC8vIFJGQzI1MTgKICAgICAgICAyMDAgPT4gJ09LJywKICAgICAgICAyMDEgPT4gJ0NyZWF0ZWQnLAogICAgICAgIDIwMiA9PiAnQWNjZXB0ZWQnLAogICAgICAgIDIwMyA9PiAnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLAogICAgICAgIDIwNCA9PiAnTm8gQ29udGVudCcsCiAgICAgICAgMjA1ID0+ICdSZXNldCBDb250ZW50JywKICAgICAgICAyMDYgPT4gJ1BhcnRpYWwgQ29udGVudCcsCiAgICAgICAgMjA3ID0+ICdNdWx0aS1TdGF0dXMnLCAgICAgICAgICAvLyBSRkM0OTE4CiAgICAgICAgMjA4ID0+ICdBbHJlYWR5IFJlcG9ydGVkJywgICAgICAvLyBSRkM1ODQyCiAgICAgICAgMjI2ID0+ICdJTSBVc2VkJywgICAgICAgICAgICAgICAvLyBSRkMzMjI5CiAgICAgICAgMzAwID0+ICdNdWx0aXBsZSBDaG9pY2VzJywKICAgICAgICAzMDEgPT4gJ01vdmVkIFBlcm1hbmVudGx5JywKICAgICAgICAzMDIgPT4gJ0ZvdW5kJywKICAgICAgICAzMDMgPT4gJ1NlZSBPdGhlcicsCiAgICAgICAgMzA0ID0+ICdOb3QgTW9kaWZpZWQnLAogICAgICAgIDMwNSA9PiAnVXNlIFByb3h5JywKICAgICAgICAzMDcgPT4gJ1RlbXBvcmFyeSBSZWRpcmVjdCcsCiAgICAgICAgMzA4ID0+ICdQZXJtYW5lbnQgUmVkaXJlY3QnLCAgICAvLyBSRkM3MjM4CiAgICAgICAgNDAwID0+ICdCYWQgUmVxdWVzdCcsCiAgICAgICAgNDAxID0+ICdVbmF1dGhvcml6ZWQnLAogICAgICAgIDQwMiA9PiAnUGF5bWVudCBSZXF1aXJlZCcsCiAgICAgICAgNDAzID0+ICdGb3JiaWRkZW4nLAogICAgICAgIDQwNCA9PiAnTm90IEZvdW5kJywKICAgICAgICA0MDUgPT4gJ01ldGhvZCBOb3QgQWxsb3dlZCcsCiAgICAgICAgNDA2ID0+ICdOb3QgQWNjZXB0YWJsZScsCiAgICAgICAgNDA3ID0+ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsCiAgICAgICAgNDA4ID0+ICdSZXF1ZXN0IFRpbWVvdXQnLAogICAgICAgIDQwOSA9PiAnQ29uZmxpY3QnLAogICAgICAgIDQxMCA9PiAnR29uZScsCiAgICAgICAgNDExID0+ICdMZW5ndGggUmVxdWlyZWQnLAogICAgICAgIDQxMiA9PiAnUHJlY29uZGl0aW9uIEZhaWxlZCcsCiAgICAgICAgNDEzID0+ICdQYXlsb2FkIFRvbyBMYXJnZScsCiAgICAgICAgNDE0ID0+ICdVUkkgVG9vIExvbmcnLAogICAgICAgIDQxNSA9PiAnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScsCiAgICAgICAgNDE2ID0+ICdSYW5nZSBOb3QgU2F0aXNmaWFibGUnLAogICAgICAgIDQxNyA9PiAnRXhwZWN0YXRpb24gRmFpbGVkJywKICAgICAgICA0MTggPT4gJ0lcJ20gYSB0ZWFwb3QnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjMyNAogICAgICAgIDQyMSA9PiAnTWlzZGlyZWN0ZWQgUmVxdWVzdCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM3NTQwCiAgICAgICAgNDIyID0+ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJGQzQ5MTgKICAgICAgICA0MjMgPT4gJ0xvY2tlZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDNDkxOAogICAgICAgIDQyNCA9PiAnRmFpbGVkIERlcGVuZGVuY3knLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM0OTE4CiAgICAgICAgNDI1ID0+ICdSZXNlcnZlZCBmb3IgV2ViREFWIGFkdmFuY2VkIGNvbGxlY3Rpb25zIGV4cGlyZWQgcHJvcG9zYWwnLCAgIC8vIFJGQzI4MTcKICAgICAgICA0MjYgPT4gJ1VwZ3JhZGUgUmVxdWlyZWQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjgxNwogICAgICAgIDQyOCA9PiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM2NTg1CiAgICAgICAgNDI5ID0+ICdUb28gTWFueSBSZXF1ZXN0cycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJGQzY1ODUKICAgICAgICA0MzEgPT4gJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDNjU4NQogICAgICAgIDQ1MSA9PiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM3NzI1CiAgICAgICAgNTAwID0+ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLAogICAgICAgIDUwMSA9PiAnTm90IEltcGxlbWVudGVkJywKICAgICAgICA1MDIgPT4gJ0JhZCBHYXRld2F5JywKICAgICAgICA1MDMgPT4gJ1NlcnZpY2UgVW5hdmFpbGFibGUnLAogICAgICAgIDUwNCA9PiAnR2F0ZXdheSBUaW1lb3V0JywKICAgICAgICA1MDUgPT4gJ0hUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkJywKICAgICAgICA1MDYgPT4gJ1ZhcmlhbnQgQWxzbyBOZWdvdGlhdGVzIChFeHBlcmltZW50YWwpJywgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjI5NQogICAgICAgIDUwNyA9PiAnSW5zdWZmaWNpZW50IFN0b3JhZ2UnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM0OTE4CiAgICAgICAgNTA4ID0+ICdMb29wIERldGVjdGVkJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJGQzU4NDIKICAgICAgICA1MTAgPT4gJ05vdCBFeHRlbmRlZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjc3NAogICAgICAgIDUxMSA9PiAnTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM2NTg1CiAgICApOwoKICAgIHByaXZhdGUgJHN0YXR1c0NvZGUgPSAyMDA7CiAgICBwcml2YXRlICRib2R5ID0gJyc7CiAgICBwcml2YXRlICRoZWFkZXJzID0gYXJyYXkoKTsKCgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKCiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VuZCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnNlbmRIZWFkZXJzKCk7CiAgICAgICAgZWNobyAkdGhpcy0+Z2V0Qm9keSgpOwogICAgICAgIGV4aXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kU3RyZWFtTWVzc2FnZSgkbWVzc2FnZSkKICAgIHsKICAgICAgICAkdGhpcy0+c2VuZEhlYWRlcnMoKTsKICAgICAgICBlY2hvICRtZXNzYWdlIC4gIlx4MDAiOwogICAgICAgIGZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlbmRIZWFkZXJzKCkKICAgIHsKICAgICAgICBpZiAoaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHN0YXR1c0NvZGUgPSAkdGhpcy0+Z2V0U3RhdHVzQ29kZSgpOwogICAgICAgIGlmICgkc3RhdHVzQ29kZSAhPT0gbnVsbCkgewogICAgICAgICAgICBoZWFkZXIoc3ByaW50ZignSFRUUC8xLjAgJXMgJXMnLAogICAgICAgICAgICAgICAgJHN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICBhcnJheV9rZXlfZXhpc3RzKCRzdGF0dXNDb2RlLCBzZWxmOjokc3RhdHVzVGV4dHMpID8gc2VsZjo6JHN0YXR1c1RleHRzWyRzdGF0dXNDb2RlXSA6ICdVbmtub3duIHN0YXR1cycKICAgICAgICAgICAgKSwgdHJ1ZSwgJHN0YXR1c0NvZGUpOwogICAgICAgIH0KCiAgICAgICAgJGhlYWRlcnMgPSAkdGhpcy0+Z2V0SGVhZGVycygpOwogICAgICAgIGlmIChpc19hcnJheSgkaGVhZGVycykpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlciA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc19udW1lcmljKCRoZWFkZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGhlYWRlcigiJGhlYWRlcjogJHZhbHVlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG1peGVkICRzdGF0dXNDb2RlCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVzcG9uc2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFN0YXR1c0NvZGUoJHN0YXR1c0NvZGUpCiAgICB7CiAgICAgICAgJHRoaXMtPnN0YXR1c0NvZGUgPSAkc3RhdHVzQ29kZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnN0YXR1c0NvZGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gJGJvZHkKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXNwb25zZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SnNvbigkYm9keSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKQogICAgICAgICAgICAtPnNldEJvZHkoanNvbl9lbmNvZGUoJGJvZHkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBtaXhlZCAkYm9keQogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCb2R5KCRib2R5KQogICAgewogICAgICAgICR0aGlzLT5ib2R5ID0gJGJvZHk7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9keSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5ib2R5OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRoZWFkZXIKICAgICAqIEBwYXJhbSAkdmFsdWUKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXNwb25zZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVyKCRoZWFkZXIsICR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+aGVhZGVyc1skaGVhZGVyXSA9ICR2YWx1ZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGhlYWRlcnMKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXNwb25zZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVycygkaGVhZGVycykKICAgIHsKICAgICAgICAkdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcnMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aGVhZGVyczsKICAgIH0KCn0iO3M6NTE6ImNsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5QYXR0ZXJuTWF0Y2hDb21tYW5kLnBocCI7czoyNzA5OiI8P3BocAoKY2xhc3MgR3Jhdml0eXNjYW5QYXR0ZXJuTWF0Y2hDb21tYW5kIGV4dGVuZHMgR3Jhdml0eXNjYW5Db21tYW5kCnsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGlwZWRBcmd1bWVudHMoKQogICAgewogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ2ZpbGVMaXN0JywKICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKCkKICAgIHsKICAgICAgICAkcmVnZXhMaXN0ID0gJHRoaXMtPmdldEFyZygncmVnZXhMaXN0Jyk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkcmVnZXhMaXN0KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW3JlZ2V4TGlzdF0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KCiAgICAgICAgJGZpbGVMaXN0ID0gJHRoaXMtPmdldEFyZygnZmlsZUxpc3QnKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRyZWdleExpc3QpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbZmlsZUxpc3RdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CgogICAgICAgICRtYXRjaGluZ1BhdHRlcm4gPSAkdGhpcy0+Z2V0QXJnKCdtYXRjaGluZ1BhdHRlcm4nKTsKICAgICAgICAkcmVhZExlbmd0aCA9ICR0aGlzLT5nZXRBcmcoJ3JlYWRMZW5ndGgnKTsKCiAgICAgICAgJHRoaXMtPnN0YXJ0Q29tbWFuZFN0cmVhbSgpOwogICAgICAgIGZvcmVhY2ggKCRmaWxlTGlzdCBhcyAkZmlsZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGZpbGVQYXRoID0gJHRoaXMtPnZhbGlkYXRlRmlsZSgkZmlsZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEdyYXZpdHlzY2FuRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISRtYXRjaGluZ1BhdHRlcm4gfHwgcHJlZ19tYXRjaCgkbWF0Y2hpbmdQYXR0ZXJuLCAkZmlsZVBhdGgpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnNjYW5GaWxlKCRmaWxlUGF0aCwgJHJlZ2V4TGlzdCwgJHJlYWRMZW5ndGgpOwogICAgICAgICAgICAgICAgaWYgKCRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBsaXN0KCRwYXR0ZXJuLCAkbWF0Y2hTdHJpbmcpID0gJHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVDb21tYW5kU3RyZWFtKGpzb25fZW5jb2RlKGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgJHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF9lbmNvZGUoJG1hdGNoU3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICApKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPmVuZENvbW1hbmRTdHJlYW0oKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUKICAgICAqIEBwYXJhbSBhcnJheSAkcGF0dGVybnMKICAgICAqIEBwYXJhbSBudWxsICRyZWFkTGVuZ3RoCiAgICAgKiBAcmV0dXJuIGFycmF5fGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNjYW5GaWxlKCRmaWxlLCAkcGF0dGVybnMsICRyZWFkTGVuZ3RoID0gbnVsbCkKICAgIHsKICAgICAgICAkZmggPSBAZm9wZW4oJGZpbGUsICdyJyk7CiAgICAgICAgaWYgKCEkZmgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdG90YWxSZWFkID0gMDsKICAgICAgICAkbWF4UmVhZExlbmd0aCA9IGlzX2ludCgkcmVhZExlbmd0aCkgJiYgJHJlYWRMZW5ndGggPiAwID8gJHJlYWRMZW5ndGggOiA1MCAqIDEwMjQgKiAxMDI0OwogICAgICAgICRtYXRjaCA9IGZhbHNlOwoKICAgICAgICB3aGlsZSAoIWZlb2YoJGZoKSkgewogICAgICAgICAgICAkbGVuZ3RoID0gbWluKDEgKiAxMDI0ICogMTAyNCwgJG1heFJlYWRMZW5ndGgpOwoKICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkZmgsICRsZW5ndGgpOyAvLyByZWFkIDEgbWVncyBtYXggcGVyIGNodW5rCiAgICAgICAgICAgICRieXRlc1JlYWQgPSBHcmF2aXR5c2NhblV0aWxzOjpzdHJsZW4oJGRhdGEpOwogICAgICAgICAgICAkdG90YWxSZWFkICs9ICRieXRlc1JlYWQ7CiAgICAgICAgICAgICRtYXhSZWFkTGVuZ3RoIC09ICRieXRlc1JlYWQ7CiAgICAgICAgICAgIGlmICgkdG90YWxSZWFkIDwgMSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggKCRwYXR0ZXJucyBhcyAkcGF0dGVybikgewogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJHBhdHRlcm4sICRkYXRhLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgICAgICAkbWF0Y2hTdHJpbmcgPSAkbWF0Y2hlc1swXTsKICAgICAgICAgICAgICAgICAgICAkbWF0Y2ggPSBhcnJheSgkcGF0dGVybiwgJG1hdGNoU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRtYXhSZWFkTGVuZ3RoIDw9IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZjbG9zZSgkZmgpOwogICAgICAgIHJldHVybiAkbWF0Y2g7CiAgICB9Cn0iO3M6NTQ6ImNsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5MaXN0RGlyZWN0b3JpZXNDb21tYW5kLnBocCI7czoxNDg0OiI8P3BocAoKY2xhc3MgR3Jhdml0eXNjYW5MaXN0RGlyZWN0b3JpZXNDb21tYW5kIGV4dGVuZHMgR3Jhdml0eXNjYW5Db21tYW5kCnsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgpCiAgICB7CiAgICAgICAgJGRpcmVjdG9yeSA9ICR0aGlzLT5nZXRBcmcoJ2RpcmVjdG9yeScpOwogICAgICAgIGlmICghaXNfc3RyaW5nKCRkaXJlY3RvcnkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbZGlyZWN0b3J5XSBhcmd1bWVudCBzdXBwbGllZCcsIDQyMik7CiAgICAgICAgfQogICAgICAgICRkaXJlY3RvcnkgPSAkdGhpcy0+dmFsaWRhdGVGaWxlKCRkaXJlY3RvcnkpOwoKICAgICAgICAkbWF4ID0gJHRoaXMtPmdldEFyZygnbWF4JywgMTAwMDApOwogICAgICAgIGlmICghaXNfbnVtZXJpYygkbWF4KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW21heF0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KICAgICAgICAkbWF4ID0gYWJzKGludHZhbCgkbWF4KSk7CgogICAgICAgICRvZmZzZXQgPSAkdGhpcy0+Z2V0QXJnKCdvZmZzZXQnLCAwKTsKICAgICAgICBpZiAoIWlzX251bWVyaWMoJG9mZnNldCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFtvZmZzZXRdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CiAgICAgICAgJG9mZnNldCA9IGFicyhpbnR2YWwoJG9mZnNldCkpOwoKICAgICAgICAkdGhpcy0+c3RhcnRDb21tYW5kU3RyZWFtKCk7CiAgICAgICAgJGNvdW50ID0gMDsKICAgICAgICBpZiAoaXNfZGlyKCRkaXJlY3RvcnkpKSB7CiAgICAgICAgICAgICRkaXJlY3RvcnlJdGVyYXRvciA9IG5ldyBEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5KTsKICAgICAgICAgICAgJGRpcmVjdG9yeUl0ZXJhdG9yLT5zZWVrKCRvZmZzZXQpOwogICAgICAgICAgICB3aGlsZSAoJGRpcmVjdG9yeUl0ZXJhdG9yLT52YWxpZCgpKSB7CiAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXJlY3RvcnlJdGVyYXRvci0+Y3VycmVudCgpOwogICAgICAgICAgICAgICAgaWYgKCEkZmlsZS0+aXNEb3QoKSAmJiAhJGZpbGUtPmlzTGluaygpICYmICRmaWxlLT5pc0RpcigpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbSgkZmlsZS0+a2V5KCkgLiAnOicgLiAkZmlsZS0+Z2V0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCsrJGNvdW50ID49ICRtYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGRpcmVjdG9yeUl0ZXJhdG9yLT5uZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPmVuZENvbW1hbmRTdHJlYW0oKTsKICAgIH0KfSI7czo0MzoiY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkluZm9Db21tYW5kLnBocCI7czoyNzI6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhbkluZm9Db21tYW5kIGV4dGVuZHMgR3Jhdml0eXNjYW5Db21tYW5kCnsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgpCiAgICB7CiAgICAgICAgJHRoaXMtPmdldFJlc3BvbnNlKCkKICAgICAgICAgICAgLT5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3BsYWluJykKICAgICAgICAgICAgLT5zZW5kSGVhZGVycygpOwogICAgICAgIG9iX3N0YXJ0KCdzdHJpcF90YWdzJyk7CiAgICAgICAgcGhwaW5mbygpOwogICAgfQp9IjtzOjQ2OiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuVmVyc2lvbkNvbW1hbmQucGhwIjtzOjI2NDoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuVmVyc2lvbkNvbW1hbmQgZXh0ZW5kcyBHcmF2aXR5c2NhbkNvbW1hbmQKewoKICAgIHB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKCkKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0UmVzcG9uc2UoKQogICAgICAgICAgICAtPnNldEpzb24oYXJyYXkoCiAgICAgICAgICAgICAgICAndmVyc2lvbicgPT4gR1JBVklUWVNDQU5fQUdFTlRfVkVSU0lPTiwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgLT5zZW5kKCk7CgogICAgfQp9IjtzOjUxOiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTG9jYWxTdG9yYWdlQ29tbWFuZC5waHAiO3M6MTY1OToiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuTG9jYWxTdG9yYWdlQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKQogICAgewogICAgICAgICRhY3Rpb24gPSAkdGhpcy0+Z2V0QXJnKCdhY3Rpb24nKTsKICAgICAgICBpZiAoIWlzX3N0cmluZygkYWN0aW9uKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2FjdGlvbl0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KCiAgICAgICAgJGtleSA9ICR0aGlzLT5nZXRBcmcoJ2tleScpOwogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5nZXRBcmcoJ3ZhbHVlJywgbnVsbCk7CgogICAgICAgICRzdG9yYWdlID0gJHRoaXMtPmdldEFnZW50KCktPmdldExvY2FsU3RvcmFnZSgpOwoKICAgICAgICBzd2l0Y2ggKCRhY3Rpb24pIHsKICAgICAgICAgICAgY2FzZSAnc2V0JzoKICAgICAgICAgICAgY2FzZSAnZ2V0JzoKICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzoKICAgICAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFtrZXldIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkYWN0aW9uKSB7CiAgICAgICAgICAgIGNhc2UgJ3NldCc6CiAgICAgICAgICAgICAgICAkc3RvcmFnZS0+c2V0KCRrZXksICR2YWx1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2dldCc6CiAgICAgICAgICAgICAgICBpZiAoJHN0b3JhZ2UtPmhhcygka2V5KSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRSZXNwb25zZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0SnNvbihhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScgPT4gJHN0b3JhZ2UtPmdldCgka2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgICAgICAgICAgLT5zZW5kKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0xvY2FsU3RvcmFnZSBbJyAuICRrZXkgLiAnXSBub3QgZm91bmQuJywgNDIyKTsKCiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6CiAgICAgICAgICAgICAgICAkc3RvcmFnZS0+ZGVsZXRlKCRrZXkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdkZXN0cm95JzoKICAgICAgICAgICAgICAgICRzdG9yYWdlLT5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2FjdGlvbl0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmdldFJlc3BvbnNlKCkKICAgICAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnID0+IHRydWUsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIC0+c2VuZCgpOwogICAgfQp9IjtzOjQ4OiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTGlzdEZpbGVzQ29tbWFuZC5waHAiO3M6MTQ4MDoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuTGlzdEZpbGVzQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKQogICAgewogICAgICAgICRkaXJlY3RvcnkgPSAkdGhpcy0+Z2V0QXJnKCdkaXJlY3RvcnknKTsKICAgICAgICBpZiAoIWlzX3N0cmluZygkZGlyZWN0b3J5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2RpcmVjdG9yeV0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KICAgICAgICAkZGlyZWN0b3J5ID0gJHRoaXMtPnZhbGlkYXRlRmlsZSgkZGlyZWN0b3J5KTsKCiAgICAgICAgJG1heCA9ICR0aGlzLT5nZXRBcmcoJ21heCcsIDEwMDAwKTsKICAgICAgICBpZiAoIWlzX251bWVyaWMoJG1heCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFttYXhdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CiAgICAgICAgJG1heCA9IGFicyhpbnR2YWwoJG1heCkpOwoKICAgICAgICAkb2Zmc2V0ID0gJHRoaXMtPmdldEFyZygnb2Zmc2V0JywgMCk7CiAgICAgICAgaWYgKCFpc19udW1lcmljKCRvZmZzZXQpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbb2Zmc2V0XSBhcmd1bWVudCBzdXBwbGllZCcsIDQyMik7CiAgICAgICAgfQogICAgICAgICRvZmZzZXQgPSBhYnMoaW50dmFsKCRvZmZzZXQpKTsKCiAgICAgICAgJHRoaXMtPnN0YXJ0Q29tbWFuZFN0cmVhbSgpOwogICAgICAgICRjb3VudCA9IDA7CiAgICAgICAgaWYgKGlzX2RpcigkZGlyZWN0b3J5KSkgewogICAgICAgICAgICAkZGlyZWN0b3J5SXRlcmF0b3IgPSBuZXcgRGlyZWN0b3J5SXRlcmF0b3IoJGRpcmVjdG9yeSk7CiAgICAgICAgICAgICRkaXJlY3RvcnlJdGVyYXRvci0+c2Vlaygkb2Zmc2V0KTsKICAgICAgICAgICAgd2hpbGUgKCRkaXJlY3RvcnlJdGVyYXRvci0+dmFsaWQoKSkgewogICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyZWN0b3J5SXRlcmF0b3ItPmN1cnJlbnQoKTsKICAgICAgICAgICAgICAgIGlmICghJGZpbGUtPmlzRG90KCkgJiYgISRmaWxlLT5pc0xpbmsoKSAmJiAkZmlsZS0+aXNGaWxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVDb21tYW5kU3RyZWFtKCRmaWxlLT5rZXkoKSAuICc6JyAuICRmaWxlLT5nZXRGaWxlbmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKyskY291bnQgPj0gJG1heCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZGlyZWN0b3J5SXRlcmF0b3ItPm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+ZW5kQ29tbWFuZFN0cmVhbSgpOwoKICAgIH0KfSI7czo0NToiY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhblVwZGF0ZUNvbW1hbmQucGhwIjtzOjExMDI6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhblVwZGF0ZUNvbW1hbmQgZXh0ZW5kcyBHcmF2aXR5c2NhbkNvbW1hbmQKewoKICAgIHB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKCkKICAgIHsKICAgICAgICAvLyBDaGVjayBmb3IgSldUCiAgICAgICAgJGp3dCA9ICR0aGlzLT5nZXRBcmcoJ2p3dCcpOwogICAgICAgIGlmICghJGp3dCkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2p3dF0gYXJndW1lbnQgc3VwcGxpZWQuJywgNDIyKTsKICAgICAgICB9CgogICAgICAgIC8vIFRlc3QgaWYgd3JpdGFibGUKICAgICAgICBpZiAoIUdSQVZJVFlTQ0FOX0FHRU5UX0lTX1dSSVRBQkxFKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignQWdlbnQgaXMgbm90IHdyaXRhYmxlLicsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIEdyYXZpdHkgQVBJIHRvIGRvd25sb2FkIG5ldyBidWlsZAogICAgICAgICRidWlsZCA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNwcmludGYoZ3NDb25maWcoJ3VwZGF0ZV9hcGlfdXJsJyksIHJhd3VybGVuY29kZShnc0NvbmZpZygnc2l0ZV9pZCcpKSwgcmF3dXJsZW5jb2RlKCRqd3QpKSk7CgogICAgICAgIC8vIFRPRE86IEFkZCBhIGNoZWNrc3VtIGhlcmUuCiAgICAgICAgaWYgKGlzX3N0cmluZygkYnVpbGQpICYmIEdyYXZpdHlzY2FuVXRpbHM6OnN0cmxlbigkYnVpbGQpID4gMCkgewogICAgICAgICAgICAvLyBJbnN0YWxsIG5ldyBidWlsZAogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cyhHUkFWSVRZU0NBTl9BR0VOVF9GSUxFLCAkYnVpbGQpOwogICAgICAgICAgICAkdGhpcy0+Z2V0UmVzcG9uc2UoKQogICAgICAgICAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgIC0+c2VuZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignT3V0cHV0IGZyb20gQVBJIHdhcyBub3QgYSBQaGFyIGZpbGUuJywgNDIyKTsKICAgICAgICB9CiAgICB9Cn0iO3M6NTA6ImNsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5NYWx3YXJlU2NhbkNvbW1hbmQucGhwIjtzOjM4OTY6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2Nhbk1hbHdhcmVTY2FuQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFBpcGVkQXJndW1lbnRzKCkKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdmaWxlTGlzdCcsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgpCiAgICB7CiAgICAgICAgJHJlZ2V4TGlzdCA9ICR0aGlzLT5nZXRBcmcoJ3JlZ2V4TGlzdCcpOwogICAgICAgIGlmICghaXNfYXJyYXkoJHJlZ2V4TGlzdCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFtyZWdleExpc3RdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CgogICAgICAgICRmaWxlTGlzdCA9ICR0aGlzLT5nZXRBcmcoJ2ZpbGVMaXN0Jyk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkcmVnZXhMaXN0KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2ZpbGVMaXN0XSBhcmd1bWVudCBzdXBwbGllZCcsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAkbWF0Y2hpbmdQYXR0ZXJuID0gJHRoaXMtPmdldEFyZygnbWF0Y2hpbmdQYXR0ZXJuJyk7CiAgICAgICAgJHJlYWRMZW5ndGggPSAkdGhpcy0+Z2V0QXJnKCdyZWFkTGVuZ3RoJyk7CgogICAgICAgICR0aGlzLT5zdGFydENvbW1hbmRTdHJlYW0oKTsKICAgICAgICBmb3JlYWNoICgkZmlsZUxpc3QgYXMgJGZpbGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRmaWxlUGF0aCA9ICR0aGlzLT52YWxpZGF0ZUZpbGUoJGZpbGUpOwogICAgICAgICAgICB9IGNhdGNoIChHcmF2aXR5c2NhbkV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkbWF0Y2hpbmdQYXR0ZXJuIHx8IHByZWdfbWF0Y2goJG1hdGNoaW5nUGF0dGVybiwgJGZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5zY2FuRmlsZUZvck1hbHdhcmUoJGZpbGVQYXRoLCAkcmVnZXhMaXN0LCAkcmVhZExlbmd0aCk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJGtleSwgJG1hdGNoU3RyaW5nLCAkYmVmb3JlU3RyaW5nLCAkYWZ0ZXJTdHJpbmcsICRoYXNoKSA9ICRyZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbShqc29uX2VuY29kZShhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF9lbmNvZGUoJG1hdGNoU3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X2VuY29kZSgkYmVmb3JlU3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X2VuY29kZSgkYWZ0ZXJTdHJpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRfZW5jb2RlKCRoYXNoKSwKICAgICAgICAgICAgICAgICAgICApKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPmVuZENvbW1hbmRTdHJlYW0oKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUKICAgICAqIEBwYXJhbSBhcnJheSAkc2lnbmF0dXJlcwogICAgICogQHBhcmFtIG51bGwgJHJlYWRMZW5ndGgKICAgICAqIEByZXR1cm4gYXJyYXl8Ym9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2NhbkZpbGVGb3JNYWx3YXJlKCRmaWxlLCAkc2lnbmF0dXJlcywgJHJlYWRMZW5ndGggPSBudWxsKQogICAgewogICAgICAgICRmaCA9IEBmb3BlbigkZmlsZSwgJ3InKTsKICAgICAgICBpZiAoISRmaCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICR0b3RhbFJlYWQgPSAwOwogICAgICAgICRtYXhSZWFkTGVuZ3RoID0gaXNfaW50KCRyZWFkTGVuZ3RoKSAmJiAkcmVhZExlbmd0aCA+IDAgPyAkcmVhZExlbmd0aCA6IDUwICogMTAyNCAqIDEwMjQ7CiAgICAgICAgJG1hdGNoID0gZmFsc2U7CgogICAgICAgIHdoaWxlICghZmVvZigkZmgpKSB7CiAgICAgICAgICAgICRsZW5ndGggPSBtaW4oMSAqIDEwMjQgKiAxMDI0LCAkbWF4UmVhZExlbmd0aCk7CiAgICAgICAgICAgICRkYXRhID0gZnJlYWQoJGZoLCAkbGVuZ3RoKTsgLy8gcmVhZCAxIG1lZ3MgbWF4IHBlciBjaHVuawogICAgICAgICAgICAkYnl0ZXNSZWFkID0gR3Jhdml0eXNjYW5VdGlsczo6c3RybGVuKCRkYXRhKTsKICAgICAgICAgICAgJHRvdGFsUmVhZCArPSAkYnl0ZXNSZWFkOwogICAgICAgICAgICAkbWF4UmVhZExlbmd0aCAtPSAkYnl0ZXNSZWFkOwogICAgICAgICAgICBpZiAoJHRvdGFsUmVhZCA8IDEpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkc2lnbmF0dXJlcyBhcyAkcnVsZSkgewogICAgICAgICAgICAgICAgbGlzdCgka2V5LCAsICRzaWduYXR1cmUsICwgJHR5cGUpID0gJHJ1bGU7CiAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPT09ICdicm93c2VyJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy8oJyAuICRzaWduYXR1cmUgLiAnKS9pJywgJGRhdGEsICRtYXRjaGVzLCBQUkVHX09GRlNFVF9DQVBUVVJFKSkgewogICAgICAgICAgICAgICAgICAgICRtYXRjaFN0cmluZyA9ICRtYXRjaGVzWzFdWzBdOwogICAgICAgICAgICAgICAgICAgICRtYXRjaE9mZnNldCA9ICRtYXRjaGVzWzFdWzFdOwogICAgICAgICAgICAgICAgICAgICRiZWZvcmVTdHJpbmcgPSBHcmF2aXR5c2NhblV0aWxzOjpzdWJzdHIoJGRhdGEsIG1heCgwLCAkbWF0Y2hPZmZzZXQgLSAxMDApLCAkbWF0Y2hPZmZzZXQgLSBtYXgoMCwgJG1hdGNoT2Zmc2V0IC0gMTAwKSk7CiAgICAgICAgICAgICAgICAgICAgJGFmdGVyU3RyaW5nID0gR3Jhdml0eXNjYW5VdGlsczo6c3Vic3RyKCRkYXRhLCAkbWF0Y2hPZmZzZXQgKyBHcmF2aXR5c2NhblV0aWxzOjpzdHJsZW4oJG1hdGNoU3RyaW5nKSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAkbWF0Y2ggPSBhcnJheSgka2V5LCAkbWF0Y2hTdHJpbmcsICRiZWZvcmVTdHJpbmcsICRhZnRlclN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbWF4UmVhZExlbmd0aCA8PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJG1hdGNoKSB7CiAgICAgICAgICAgIGZzZWVrKCRmaCwgMCwgU0VFS19TRVQpOwoKICAgICAgICAgICAgJHNoYTI1NkNvbnRleHQgPSBoYXNoX2luaXQoJ3NoYTI1NicpOwogICAgICAgICAgICB3aGlsZSAoIWZlb2YoJGZoKSkgewogICAgICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkZmgsIDY1NTM2KTsKICAgICAgICAgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhc2hfdXBkYXRlKCRzaGEyNTZDb250ZXh0LCBzdHJfcmVwbGFjZShhcnJheSgiXG4iLCAiXHIiLCAiXHQiLCAiICIpLCAiIiwgJGRhdGEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWF0Y2hbXSA9IGhhc2hfZmluYWwoJHNoYTI1NkNvbnRleHQsIHRydWUpOwogICAgICAgIH0KICAgICAgICBmY2xvc2UoJGZoKTsKICAgICAgICByZXR1cm4gJG1hdGNoOwogICAgfQp9IjtzOjQ4OiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZC5waHAiO3M6MzIwNToiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHJpdmF0ZSAkcGlwZXM7CgogICAgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKQogICAgewogICAgICAgICRjb21tYW5kcyA9ICR0aGlzLT5nZXRBcmdzKCk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkY29tbWFuZHMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbY29tbWFuZHNdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRpbmRleCA9PiAkY29tbWFuZEFycmF5KSB7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGNvbW1hbmRBcnJheSkgfHwgIWlzc2V0KCRjb21tYW5kQXJyYXlbJ2NvbW1hbmQnXSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbY29tbWFuZHNdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY29tbWFuZE5hbWUgPSAkY29tbWFuZEFycmF5Wydjb21tYW5kJ107CiAgICAgICAgICAgICRjb21tYW5kQ2xhc3MgPSAnR3Jhdml0eXNjYW4nIC4gJGNvbW1hbmROYW1lIC4gJ0NvbW1hbmQnOwoKICAgICAgICAgICAgaWYgKCFjbGFzc19leGlzdHMoJGNvbW1hbmRDbGFzcykpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignQ29tbWFuZCAnIC4gJGNvbW1hbmROYW1lIC4gJyBub3QgZm91bmQuJywgNDIyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY29tbWFuZHNbJGluZGV4XVsnY2xhc3MnXSA9ICRjb21tYW5kQ2xhc3M7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cGlwZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRjb21tYW5kcyBhcyAkY29tbWFuZEFycmF5KSB7CiAgICAgICAgICAgIC8vICRjb21tYW5kID0gJGNvbW1hbmRBcnJheVsnY29tbWFuZCddOwogICAgICAgICAgICAkYXJncyA9IGlzc2V0KCRjb21tYW5kQXJyYXlbJ2FyZ3MnXSkgJiYgaXNfYXJyYXkoJGNvbW1hbmRBcnJheVsnYXJncyddKSA/ICRjb21tYW5kQXJyYXlbJ2FyZ3MnXSA6IGFycmF5KCk7CiAgICAgICAgICAgICRwaXBlID0gaXNzZXQoJGNvbW1hbmRBcnJheVsncGlwZSddKSAmJiBpc19zdHJpbmcoJGNvbW1hbmRBcnJheVsncGlwZSddKSA/ICRjb21tYW5kQXJyYXlbJ3BpcGUnXSA6IG51bGw7CiAgICAgICAgICAgICRjb21tYW5kQ2xhc3MgPSAkY29tbWFuZEFycmF5WydjbGFzcyddOwoKICAgICAgICAgICAgaWYgKCRwaXBlKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSAkdGhpcy0+cGlwZXNbJHBpcGVdID0gbmV3IEdyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZFJlc3BvbnNlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSAkdGhpcy0+Z2V0UmVzcG9uc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqIEB2YXIgR3Jhdml0eXNjYW5Db21tYW5kICRjb21tYW5kICovCiAgICAgICAgICAgICRjb21tYW5kID0gbmV3ICRjb21tYW5kQ2xhc3MoJHRoaXMtPmdldEFnZW50KCkpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGNvbW1hbmQtPmdldFBpcGVkQXJndW1lbnRzKCkgYXMgJHBpcGVkQXJndW1lbnQpIHsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYXJnc1skcGlwZWRBcmd1bWVudF0pICYmCiAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nKCRhcmdzWyRwaXBlZEFyZ3VtZW50XSkgJiYKICAgICAgICAgICAgICAgICAgICBzdHJwb3MoJGFyZ3NbJHBpcGVkQXJndW1lbnRdLCAnQCcpID09PSAwCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAkcGlwZWRBcmd1bWVudE5hbWUgPSBzdWJzdHIoJGFyZ3NbJHBpcGVkQXJndW1lbnRdLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnBpcGVzWyRwaXBlZEFyZ3VtZW50TmFtZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhcmdzWyRwaXBlZEFyZ3VtZW50XSA9ICR0aGlzLT5waXBlc1skcGlwZWRBcmd1bWVudE5hbWVdLT5nZXRSZXNwb25zZUFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiogQHZhciBHcmF2aXR5c2NhbkNvbW1hbmQgJGNvbW1hbmQgKi8KICAgICAgICAgICAgJHJlc3VsdCA9ICRjb21tYW5kLT5zZXRBcmdzKCRhcmdzKQogICAgICAgICAgICAgICAgLT5zZXRSZXF1ZXN0KCR0aGlzLT5nZXRSZXF1ZXN0KCkpCiAgICAgICAgICAgICAgICAtPnNldFJlc3BvbnNlKCRyZXNwb25zZSkKICAgICAgICAgICAgICAgIC0+ZXhlY3V0ZSgpOwoKICAgICAgICAgICAgaWYgKCRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICRjb21tYW5kLT5zdGFydENvbW1hbmRTdHJlYW0oKQogICAgICAgICAgICAgICAgICAgIC0+d3JpdGVDb21tYW5kU3RyZWFtKCRyZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgLT5lbmRDb21tYW5kU3RyZWFtKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmNsYXNzIEdyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZFJlc3BvbnNlIGV4dGVuZHMgR3Jhdml0eXNjYW5SZXNwb25zZQp7CiAgICBwcml2YXRlICRyZXNwb25zZUFycmF5OwoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VuZFN0cmVhbU1lc3NhZ2UoJG1lc3NhZ2UpCiAgICB7CiAgICAgICAgJHRoaXMtPnNlbmRIZWFkZXJzKCk7CiAgICAgICAgZWNobyAkbWVzc2FnZSAuICJceDAwIjsKICAgICAgICBmbHVzaCgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXlxcZCs6LycsICRtZXNzYWdlKSkgewogICAgICAgICAgICBsaXN0KCwgJG1lc3NhZ2UpID0gZXhwbG9kZSgnOicsICRtZXNzYWdlLCAyKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnJlc3BvbnNlQXJyYXlbXSA9ICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VBcnJheSgpCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X3NsaWNlKCR0aGlzLT5yZXNwb25zZUFycmF5LCAxLCAtMSk7CiAgICB9CgoKfSI7czozOToiY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkNvbW1hbmQucGhwIjtzOjQ3Mjg6Ijw/cGhwCgphYnN0cmFjdCBjbGFzcyBHcmF2aXR5c2NhbkNvbW1hbmQKewogICAgLyoqIEB2YXIgR3Jhdml0eXNjYW5BZ2VudCAqLwogICAgcHJpdmF0ZSAkYWdlbnQ7CgogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJpdmF0ZSAkYXJnczsKCiAgICBwcml2YXRlICRyZXF1ZXN0OwogICAgLyoqCiAgICAgKiBAdmFyIEdyYXZpdHlzY2FuUmVzcG9uc2UKICAgICAqLwogICAgcHJpdmF0ZSAkcmVzcG9uc2U7CgogICAgcHJpdmF0ZSAkc3RyZWFtQm91bmRhcnk7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gR3Jhdml0eXNjYW5BZ2VudCAkYWdlbnQKICAgICAqIEBwYXJhbSBhcnJheSAkYXJncwogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVxdWVzdCAkcmVxdWVzdAogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVzcG9uc2UgJHJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYWdlbnQsICRhcmdzID0gbnVsbCwgJHJlcXVlc3QgPSBudWxsLCAkcmVzcG9uc2UgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5hZ2VudCA9ICRhZ2VudDsKICAgICAgICAkdGhpcy0+YXJncyA9ICRhcmdzOwogICAgICAgICR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7CiAgICAgICAgJHRoaXMtPnJlc3BvbnNlID0gJHJlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhcmd1bWVudCBwYXJhbXMgdGhhdCBjYW4gYmUgcGlwZWQgaW4gYSBtdWx0aWNhbGwgcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQaXBlZEFyZ3VtZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQ29tbWFuZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3RhcnRDb21tYW5kU3RyZWFtKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbSgnY21kX3N0YXJ0OicgLiAkdGhpcy0+Z2V0Q29tbWFuZE5hbWUoKSAuICc6JyAuICR0aGlzLT5nZXRTdHJlYW1Cb3VuZGFyeSgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqIEByZXR1cm4gJHRoaXMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29tbWFuZFN0cmVhbSgkbWVzc2FnZSkKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0UmVzcG9uc2UoKS0+c2VuZFN0cmVhbU1lc3NhZ2UoJG1lc3NhZ2UpOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5Db21tYW5kCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmRDb21tYW5kU3RyZWFtKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbSgnY21kX2VuZDonIC4gJHRoaXMtPmdldENvbW1hbmROYW1lKCkgLiAnOicgLiAkdGhpcy0+Z2V0U3RyZWFtQm91bmRhcnkoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZE5hbWUoKQogICAgewogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXkdyYXZpdHlzY2FuKC4qPylDb21tYW5kJC9pJywgZ2V0X2NsYXNzKCR0aGlzKSwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWF0Y2hlc1sxXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW1Cb3VuZGFyeSgpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+c3RyZWFtQm91bmRhcnkpIHsKICAgICAgICAgICAgJHRoaXMtPnN0cmVhbUJvdW5kYXJ5ID0gR3Jhdml0eXNjYW5VdGlsczo6Z2V0UmFuZG9tU3RyaW5nKDMyLCAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5zdHJlYW1Cb3VuZGFyeTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAdGhyb3dzIEdyYXZpdHlzY2FuRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUZpbGUoJGZpbGUpCiAgICB7CiAgICAgICAgJGZpbGUgPSAkdGhpcy0+Z2V0UmVxdWVzdCgpLT5nZXREb2N1bWVudFJvb3QoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZmlsZSwgJy9cXCcpOwogICAgICAgIGlmICghaXNfZGlyKCRmaWxlKSAmJiAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdGaWxlIGlzIG5vdCByZWFkYWJsZS4nLCA0MjIpOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHJlYWxwYXRoKCRmaWxlKTsKICAgICAgICBpZiAoISRmaWxlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignRXJyb3IgcmVzb2x2aW5nIGNhbm9uaWNhbGl6ZWQgYWJzb2x1dGUgcGF0aG5hbWUgZm9yICcgLiAkZmlsZSAuICcuJywgNDIyKTsKICAgICAgICB9Ci8vICAgICAgICBpZiAoc3RycG9zKCRmaWxlLCAkdGhpcy0+Z2V0UmVxdWVzdCgpLT5nZXREb2N1bWVudFJvb3QoKSkgIT09IDApIHsKLy8gICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ZpbGUgaXMgb3V0c2lkZSB0aGUgZG9jdW1lbnQgcm9vdC4nLCA0MjIpOwovLyAgICAgICAgfQogICAgICAgIHJldHVybiAkZmlsZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheSAkYXJncwogICAgICogQHJldHVybiBHcmF2aXR5c2NhbkNvbW1hbmQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEFyZ3MoJGFyZ3MpCiAgICB7CiAgICAgICAgJHRoaXMtPmFyZ3MgPSAkYXJnczsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmdzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFyZ3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gbnVsbCAkZGVmYXVsdAogICAgICogQHJldHVybiBtaXhlZHxudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmcoJG5hbWUsICRkZWZhdWx0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHRoaXMtPmFyZ3MpICYmIGFycmF5X2tleV9leGlzdHMoJG5hbWUsICR0aGlzLT5hcmdzKSkgewogICAgICAgICAgICAkc2Vzc2lvblByZWZpeCA9ICckbG9jYWxTdG9yYWdlLic7CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHRoaXMtPmFyZ3NbJG5hbWVdKSAmJiBzdHJwb3MoJHRoaXMtPmFyZ3NbJG5hbWVdLCAkc2Vzc2lvblByZWZpeCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkc2Vzc2lvbktleSA9IHN1YnN0cigkdGhpcy0+YXJnc1skbmFtZV0sIHN0cmxlbigkc2Vzc2lvblByZWZpeCkpOwogICAgICAgICAgICAgICAgJHN0b3JhZ2UgPSAkdGhpcy0+Z2V0QWdlbnQoKS0+Z2V0TG9jYWxTdG9yYWdlKCk7CiAgICAgICAgICAgICAgICBpZiAoJHN0b3JhZ2UtPmhhcygkc2Vzc2lvbktleSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHN0b3JhZ2UtPmdldCgkc2Vzc2lvbktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hcmdzWyRuYW1lXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVxdWVzdCAkcmVxdWVzdAogICAgICogQHJldHVybiBHcmF2aXR5c2NhbkNvbW1hbmQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFJlcXVlc3QoJHJlcXVlc3QpCiAgICB7CiAgICAgICAgJHRoaXMtPnJlcXVlc3QgPSAkcmVxdWVzdDsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVxdWVzdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWVzdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZXF1ZXN0OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVzcG9uc2UgJHJlc3BvbnNlCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQ29tbWFuZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVzcG9uc2UoJHJlc3BvbnNlKQogICAgewogICAgICAgICR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVzcG9uc2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFJlc3BvbnNlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBHcmF2aXR5c2NhbkFnZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBZ2VudCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZ2VudDsKICAgIH0KfSI7czozMDoiY2xhc3Nlcy9HcmF2aXR5c2NhblJlcXVlc3QucGhwIjtzOjIzMTE6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhblJlcXVlc3QKewogICAgcHJpdmF0ZSAkYm9keTsKICAgIHByaXZhdGUgJGhlYWRlcnM7CiAgICBwcml2YXRlICRtZXRob2Q7CiAgICBwcml2YXRlICRkb2N1bWVudFJvb3Q7CgogICAgLyoqCiAgICAgKgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21HbG9iYWxzKCkKICAgIHsKICAgICAgICAkcmVxdWVzdCA9IG5ldyBzZWxmKCk7CiAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRfU0VSVkVSIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGtleSwgJ0hUVFBfJykgPT09IDApIHsKICAgICAgICAgICAgICAgICRoZWFkZXIgPSBzdHJfcmVwbGFjZSgnICcsICctJywgdWN3b3JkcyhzdHJfcmVwbGFjZSgnXycsICcgJywgc3RydG9sb3dlcihzdWJzdHIoJGtleSwgNSkpKSkpOwogICAgICAgICAgICAgICAgJGhlYWRlcnNbJGhlYWRlcl0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHJlcXVlc3QtPnNldEhlYWRlcnMoJGhlYWRlcnMpCiAgICAgICAgICAgIC0+c2V0Qm9keShmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKSkKICAgICAgICAgICAgLT5zZXRNZXRob2QoaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pID8gJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gOiAnR0VUJykKICAgICAgICAgICAgLT5zZXREb2N1bWVudFJvb3QoaXNzZXQoJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSkgPyByZWFscGF0aCgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddKSA6IEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEgpOwoKICAgICAgICByZXR1cm4gJHJlcXVlc3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGJvZHkKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXF1ZXN0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCb2R5KCRib2R5KQogICAgewogICAgICAgICR0aGlzLT5ib2R5ID0gJGJvZHk7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9keSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5ib2R5OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG1peGVkICRoZWFkZXJzCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVxdWVzdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVycygkaGVhZGVycykKICAgIHsKICAgICAgICAkdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcnMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aGVhZGVyczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAkaGVhZGVyCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXIoJGhlYWRlcikKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXlfa2V5X2V4aXN0cygkaGVhZGVyLCAkdGhpcy0+aGVhZGVycykgPyAkdGhpcy0+aGVhZGVyc1skaGVhZGVyXSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG1ldGhvZAogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlcXVlc3QKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE1ldGhvZCgkbWV0aG9kKQogICAgewogICAgICAgICR0aGlzLT5tZXRob2QgPSAkbWV0aG9kOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1ldGhvZCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5tZXRob2Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGRvY3VtZW50Um9vdAogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlcXVlc3QKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldERvY3VtZW50Um9vdCgkZG9jdW1lbnRSb290KQogICAgewogICAgICAgICR0aGlzLT5kb2N1bWVudFJvb3QgPSAkZG9jdW1lbnRSb290OwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERvY3VtZW50Um9vdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kb2N1bWVudFJvb3Q7CiAgICB9Cn0iO3M6MTU6ImRpYWdub3N0aWNzLnBocCI7czo2NDAwOiI8P3BocCBvYl9zdGFydCgpOyA/Pgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+CjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJpZT1lZGdlIj4KICAgIDxNRVRBIE5BTUU9IlJPQk9UUyIgQ09OVEVOVD0iTk9JTkRFWCwgTk9GT0xMT1ciPgoKICAgIDx0aXRsZT5HcmF2aXR5c2NhbiBBY2NlbGVyYXRvcjwvdGl0bGU+CgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICBib2R5IHsKICAgICAgICAgICAgd2lkdGg6IDQyZW07CiAgICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgZm9udC1zaXplOiAxZW07CiAgICAgICAgfQoKICAgICAgICBoMSB7CiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wNGVtOwogICAgICAgICAgICBtYXJnaW46IDFlbSAwcHggLjVlbTsKICAgICAgICB9CgogICAgICAgIGgxICsgcCB7CiAgICAgICAgICAgIG1hcmdpbjogMCAwIDJlbTsKICAgICAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgfQoKICAgICAgICBjb2RlIHsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IG1vbmFjbywgbW9ub3NwYWNlOwogICAgICAgIH0KCiAgICAgICAgYSB7CiAgICAgICAgICAgIGNvbG9yOiAjMWU2ZmMwOwogICAgICAgIH0KCiAgICAgICAgYTpob3ZlciB7CiAgICAgICAgICAgIGNvbG9yOiAjMjY5NWZmOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgewogICAgICAgICAgICBtYXJnaW46IDAuOGVtIDBweDsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjVlbTsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIGRpdi5wYXNzLAogICAgICAgICNyZXN1bHRzIGRpdi53YXJuLAogICAgICAgICNyZXN1bHRzIGRpdi5mYWlsIHsKICAgICAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgICAgIG1hcmdpbjogMjBweCAwcHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAjcmVzdWx0cyBkaXYucGFzcyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxOTE7CgogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgZGl2LmZhaWwgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjOTExOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgZGl2Lndhcm4gewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTU5YzAwOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgewogICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgbWFyZ2luOiAyMHB4IDBweDsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIHRhYmxlIHRoLAogICAgICAgICNyZXN1bHRzIHRhYmxlIHRkIHsKICAgICAgICAgICAgcGFkZGluZzogMC40ZW07CiAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjOWM5Yzk7CiAgICAgICAgfQoKICAgICAgICAjcmVzdWx0cyB0YWJsZSB0aCB7CiAgICAgICAgICAgIHdpZHRoOiAxMmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGhlYWQgdGggewogICAgICAgICAgICBib3JkZXItY29sb3I6ICMzMzMzMzM7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIHRhYmxlLmVycm9ycyB0aGVhZCB0aCB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5MTE7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogIzkxMTsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIHRhYmxlLndhcm5pbmdzIHRoZWFkIHRoIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1OWMwMDsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjZTU5YzAwOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZWVlOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGQucGFzcyB7CiAgICAgICAgICAgIGNvbG9yOiAjMTkxOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGQuZmFpbCB7CiAgICAgICAgICAgIGNvbG9yOiAjOTExOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGQud2FybiB7CiAgICAgICAgICAgIGNvbG9yOiAjYjk4MjJhOwogICAgICAgIH0KCiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPkdyYXZpdHlzY2FuIEFjY2VsZXJhdG9yIERpYWdub3N0aWNzPC9oMT4KCjxwPllvdSBhcmUgY3VycmVudGx5IHJ1bm5pbmcgR3Jhdml0eXNjYW4gQWNjZWxlcmF0b3IgdmVyc2lvbiA8c3Ryb25nPjw/cGhwIGVjaG8gR1JBVklUWVNDQU5fQUdFTlRfVkVSU0lPTiA/Pjwvc3Ryb25nPi4KPC9wPgoKPD9waHAKJGNvbXBhdGliaWxpdHlDaGVja3MgPSBhcnJheSgKICAgIGFycmF5KAogICAgICAgICd0ZXN0JyAgPT4gdmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4zLjMnLCAnPj0nKSwKICAgICAgICAndGl0bGUnID0+ICdQSFAgVmVyc2lvbicsCiAgICAgICAgJ2Vycm9yJyA9PiAnR3Jhdml0eXNjYW4gQWNjZWxlcmF0b3IgcmVxdWlyZXMgUEhQIDUuMy4zIG9yIG5ld2VyLCB0aGlzIHZlcnNpb24gaXMgJyAuIFBIUF9WRVJTSU9OIC4gJy4nLAogICAgKSwKICAgIGFycmF5KAogICAgICAgICd0ZXN0JyAgPT4gZnVuY3Rpb25fZXhpc3RzKCdvcGVuc3NsX3ZlcmlmeScpLAogICAgICAgICd0aXRsZScgPT4gJ09wZW5TU0wnLAogICAgICAgICdlcnJvcicgPT4gJ1BIUCA8YSBocmVmPSJodHRwOi8vd3d3LnBocC5uZXQvb3BlbnNzbCI+T3BlblNTTDwvYT4gaXMgZWl0aGVyIG5vdCBsb2FkZWQgb3Igbm90IGNvbXBpbGVkIGluLicsCiAgICApLAogICAgYXJyYXkoCiAgICAgICAgJ3Rlc3QnICA9PiBAcHJlZ19tYXRjaCgnL14uJC91JywgJ8OxJyksCiAgICAgICAgJ3RpdGxlJyA9PiAnUENSRSBVVEYtOCcsCiAgICAgICAgJ2Vycm9yJyA9PiAnPGEgaHJlZj0iaHR0cDovL3BocC5uZXQvcGNyZSI+UENSRTwvYT4gaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggVVRGLTggc3VwcG9ydC4nLAogICAgKSwKICAgIGFycmF5KAogICAgICAgICd0ZXN0JyAgPT4gQHByZWdfbWF0Y2goJy9eXHBMJC91JywgJ8OxJyksCiAgICAgICAgJ3RpdGxlJyA9PiAnUENSRSBVVEYtOCcsCiAgICAgICAgJ2Vycm9yJyA9PiAnPGEgaHJlZj0iaHR0cDovL3BocC5uZXQvcGNyZSI+UENSRTwvYT4gaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggVW5pY29kZSBwcm9wZXJ0eSBzdXBwb3J0LicsCiAgICApLAogICAgYXJyYXkoCiAgICAgICAgJ3Rlc3QnICA9PiAhZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSB8fCAhKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIE1CX09WRVJMT0FEX1NUUklORyksCiAgICAgICAgJ3RpdGxlJyA9PiAnTWJzdHJpbmcgT3ZlcmxvYWRlZCcsCiAgICAgICAgJ2Vycm9yJyA9PiAnVGhlIDxhIGhyZWY9Imh0dHA6Ly9waHAubmV0L21ic3RyaW5nIj5tYnN0cmluZzwvYT4gZXh0ZW5zaW9uIGlzIG92ZXJsb2FkaW5nIFBIUFwncyBuYXRpdmUgc3RyaW5nIGZ1bmN0aW9ucy4nLAogICAgKSwKKTsKCiR3YXJuaW5nQ2hlY2tzID0gYXJyYXkoCiAgICBhcnJheSgKICAgICAgICAndGVzdCcgID0+IEdSQVZJVFlTQ0FOX0FHRU5UX0lTX1dSSVRBQkxFLAogICAgICAgICd0aXRsZScgPT4gJ0FjY2VsZXJhdG9yIEZpbGUgUGVybWlzc2lvbnMnLAogICAgICAgICdlcnJvcicgPT4gJ1RoZSBBY2NlbGVyYXRvciBmaWxlIGlzIG5vdCB3cml0YWJsZS4gQXV0b21hdGljIHVwZGF0ZXMgYXJlIGRpc2FibGVkLicsCiAgICApLAopOwoKJGZhaWxlZCA9IGZhbHNlOwokZXJyb3JzID0gYXJyYXkoKTsKZm9yZWFjaCAoJGNvbXBhdGliaWxpdHlDaGVja3MgYXMgJGNoZWNrKSB7CiAgICBpZiAoISRjaGVja1sndGVzdCddKSB7CiAgICAgICAgJGZhaWxlZCA9IHRydWU7CiAgICAgICAgJGVycm9yc1tdID0gJGNoZWNrOwogICAgfQp9Cgokd2FybmluZyA9IGZhbHNlOwokd2FybmluZ3MgPSBhcnJheSgpOwpmb3JlYWNoICgkd2FybmluZ0NoZWNrcyBhcyAkY2hlY2spIHsKICAgIGlmICghJGNoZWNrWyd0ZXN0J10pIHsKICAgICAgICAkd2FybmluZyA9IHRydWU7CiAgICAgICAgJHdhcm5pbmdzW10gPSAkY2hlY2s7CiAgICB9Cn0KCj8+Cgo8ZGl2IGlkPSJyZXN1bHRzIj4KICAgIDw/cGhwIGlmICgkZmFpbGVkIHx8ICR3YXJuaW5nKTogPz4KICAgICAgICA8P3BocCBpZiAoJGZhaWxlZCk6ID8+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZhaWwiPgogICAgICAgICAgICAgICAg4pyYIEdyYXZpdHlzY2FuIEFjY2VsZXJhdG9yIG1heSBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCB5b3VyIGVudmlyb25tZW50LgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8P3BocCBlbHNlOiA/PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuIj4KICAgICAgICAgICAgICAgICg8c3Ryb25nPiE8L3N0cm9uZz4pIEdyYXZpdHlzY2FuIEFjY2VsZXJhdG9yIHdpbGwgZnVuY3Rpb24gY29ycmVjdGx5LCBidXQgc29tZSBvcHRpb25hbCBmZWF0dXJlcyBtYXkgYmUKICAgICAgICAgICAgICAgIGRpc2FibGVkLgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8P3BocCBlbmRpZiA/PgogICAgICAgIDw/cGhwIGlmICgkZmFpbGVkKTogPz4KICAgICAgICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9ImVycm9ycyI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjIiPkVycm9yczo8L3RoPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICA8P3BocCBmb3JlYWNoICgkZXJyb3JzIGFzICRlcnJvcik6ID8+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyAkZXJyb3JbJ3RpdGxlJ10gPz48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZhaWwiPjw/cGhwIGVjaG8gJGVycm9yWydlcnJvciddID8+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPD9waHAgZW5kZm9yZWFjaCA/PgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8P3BocCBlbmRpZiA/PgogICAgICAgIDw/cGhwIGlmICgkd2FybmluZyk6ID8+CiAgICAgICAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJ3YXJuaW5ncyI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjIiPldhcm5pbmdzOjwvdGg+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCR3YXJuaW5ncyBhcyAkZXJyb3IpOiA/PgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gJGVycm9yWyd0aXRsZSddID8+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ3YXJuIj48P3BocCBlY2hvICRlcnJvclsnZXJyb3InXSA/PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDw/cGhwIGVuZGZvcmVhY2ggPz4KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPD9waHAgZW5kaWYgPz4KCiAgICA8P3BocCBlbHNlOiA/PgogICAgICAgIDxkaXYgY2xhc3M9InBhc3MiPuKclCBZb3VyIGVudmlyb25tZW50IHBhc3NlZCBhbGwgcmVxdWlyZW1lbnRzLjwvZGl2PgogICAgPD9waHAgZW5kaWYgPz4KPC9kaXY+Cgo8aDE+UHVibGljIEtleTwvaDE+Cgo8cHJlPjw/cGhwIGVjaG8gZ3NDb25maWcoJ3B1YmxpY19rZXknKSA/PjwvcHJlPgoKPC9ib2R5Pgo8L2h0bWw+Cjw/cGhwIHJldHVybiBvYl9nZXRfY2xlYW4oKTsgPz4KIjtzOjg6ImluaXQucGhwIjtzOjIxNzc6Ijw/cGhwCgpkZWZpbmUoJ0dSQVZJVFlTQ0FOX0FHRU5UX1ZFUlNJT04nLCAnMC4wLjcnKTsKIWRlZmluZWQoJ0dSQVZJVFlTQ0FOX0FHRU5UX0ZJTEUnKSAmJiBkZWZpbmUoJ0dSQVZJVFlTQ0FOX0FHRU5UX0ZJTEUnLCBfX0ZJTEVfXyk7CiFkZWZpbmVkKCdHUkFWSVRZU0NBTl9BR0VOVF9JU19XUklUQUJMRScpICYmIGRlZmluZSgnR1JBVklUWVNDQU5fQUdFTlRfSVNfV1JJVEFCTEUnLCBpc193cml0YWJsZShfX0ZJTEVfXykpOwpkZWZpbmUoJ0dSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEgnLCBkaXJuYW1lKF9fRklMRV9fKSk7CmRlZmluZSgnR1JBVklUWVNDQU5fQUdFTlRfQ0xBU1NfUEFUSCcsIEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEggLiAnL2NsYXNzZXMnKTsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdnc0luY2x1ZGVGaWxlJykpIHsKICAgIGZ1bmN0aW9uIGdzSW5jbHVkZUZpbGUoJGZpbGUsICRvbmNlID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCRvbmNlKSB7CiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlX29uY2UgR1JBVklUWVNDQU5fQUdFTlRfRkNfUEFUSCAuICcvJyAuICRmaWxlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlIEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEggLiAnLycgLiAkZmlsZTsKICAgICAgICB9CiAgICB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dzUmVxdWlyZUZpbGUnKSkgewogICAgZnVuY3Rpb24gZ3NSZXF1aXJlRmlsZSgkZmlsZSwgJG9uY2UgPSB0cnVlKQogICAgewogICAgICAgIGlmICgkb25jZSkgewogICAgICAgICAgICByZXR1cm4gcmVxdWlyZV9vbmNlIEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEggLiAnLycgLiAkZmlsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcmVxdWlyZSBHUkFWSVRZU0NBTl9BR0VOVF9GQ19QQVRIIC4gJy8nIC4gJGZpbGU7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBnc0NvbmZpZygka2V5KQp7CiAgICBzdGF0aWMgJGNvbmZpZzsKICAgIGlmICghaXNzZXQoJGNvbmZpZykpIHsKICAgICAgICAkY29uZmlnID0gZ3NSZXF1aXJlRmlsZSgnY29uZmlnLnBocCcpOwogICAgfQogICAgcmV0dXJuIGFycmF5X2tleV9leGlzdHMoJGtleSwgJGNvbmZpZykgPyAkY29uZmlnWyRrZXldIDogbnVsbDsKfQoKCmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvR3Jhdml0eXNjYW5BZ2VudC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhbkFnZW50QXV0aC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhblJlcXVlc3QucGhwJyk7CmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvR3Jhdml0eXNjYW5SZXNwb25zZS5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhbkV4Y2VwdGlvbi5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhblV0aWxzLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL0dyYXZpdHlzY2FuTG9jYWxTdG9yYWdlLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkluZm9Db21tYW5kLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuVXBkYXRlQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhblZlcnNpb25Db21tYW5kLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTGlzdERpcmVjdG9yaWVzQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2Nhbkxpc3RGaWxlc0NvbW1hbmQucGhwJyk7CmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5NYWx3YXJlU2NhbkNvbW1hbmQucGhwJyk7CmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5QYXR0ZXJuTWF0Y2hDb21tYW5kLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkxvY2FsU3RvcmFnZUNvbW1hbmQucGhwJyk7IjtzOjEwOiJjb25maWcucGhwIjtzOjk1ODoiPD9waHAKCnJldHVybiBhcnJheSAoCiAgJ3B1YmxpY19rZXknID0+ICctLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQThLbkwxcEhFbklNUWJxbXVEQ2pTCjhuS1BjalhWemJ0d0FiYzMya1FNd21ET3hVaWNJNjZGNlp1VDlzRW12K2l6SEo4UThjeHZRWFVVMnpZSHRnb1MKSVhIbk4rYVVSaFFQOGNSUFF3b2RWaURHZ1RmVitSMmI0VHlQTnJSbVZTQ2x0RmRkRUNyOFdoMVJzM3ZiNnV3SQpWd2dNWmhYK3BVNDF5Q0szL1FqSTlQRGZuVCtoQjN5QXBlanhZM2Z5RXdkQkp6d3RuTldxSlJhM05sUzdxcU02CkNoc3ZpL3ZsOWRYekUvNll3N2g0TFlUUE5TQW5aTFJ3K3ZpRU0yOEtYRE1sL3EwMkc0UFdQcUVseEtpc25ZWHoKbmZHbzAzelRTaXBUbmpZQkQ5MS9IbmIrK2QvTGlHc0hCc0I0OFp2dml0YUhIRDg0MCt3VVdBSFhCY2N0NExBWQpSemFHb0JNRFJUOHBJZUZ6M3ZMdkVFUlpmRk10ajZWZzFQU1BQZ0dQRzhCc0hQYXkrME9sQytZeXpwK3oyQVE1CmZnMnlIZ2ZraytqZmFEVFhxelBtcXJpbHpOWkhDTE5FRFZWU3ArVlZkQzF0VUlUTlNFQUgxcVp2MmtuaTJaNGMKS1VCaUd3SXN2MVZnRUdtdHJBS0dSZUtmMGw1OUdEWWZhcG4wWXpUbzM4UEpNbm84eTVMcHV4YnFDOFZWOFlhSQphYUNuL3dOZnovd0tPaTluQjdKbzQ2RjJ5R1RnRXVweng4OXgrWTIrSjQ5TmdtN0kvR1Y5RVVrOVhDYytrbTgzCnY5MlJwM0dyQ0swa0pDOFBVN3M4N3JWWHl3WjR0UXJqMjFaZ1FzVVFoaS9LcHRoYTFqSXN0RFdMNk5jTjhoeVMKS3A0VUJpSWs0ZVFMejUvdEE3ZGhheGtDQXdFQUFRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCicsCiAgJ3NpdGVfaWQnID0+IDcyNTM0LAogICd1cGRhdGVfYXBpX3VybCcgPT4gJ2h0dHBzOi8vd3d3LmdyYXZpdHlzY2FuLmNvbS9hcGkvc2l0ZXMvJWQvZG93bmxvYWQtYWdlbnQ/dG9rZW49JXMnLAopOyI7fQ==')); ?>
Did this file decode correctly?
Original Code
$agentFiles = unserialize(base64_decode('YToyMTp7czo4OiJodHRwLnBocCI7czoxMzk4OiI8P3BocAoKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAxKTsKCiRhdXRoZW50aWNhdGVkID0gZmFsc2U7CnRyeSB7CiAgICAvLyBQYXJzZSByZXF1ZXN0CiAgICAkcmVxdWVzdCA9IEdyYXZpdHlzY2FuUmVxdWVzdDo6Y3JlYXRlRnJvbUdsb2JhbHMoKTsKICAgICRncmF2aXR5c2NhbkFnZW50ID0gbmV3IEdyYXZpdHlzY2FuQWdlbnQoJHJlcXVlc3QsIG5ldyBHcmF2aXR5c2NhblJlc3BvbnNlKTsKCiAgICBpZiAoJHJlcXVlc3QtPmdldE1ldGhvZCgpID09PSAnR0VUJykgewogICAgICAgICRncmF2aXR5c2NhbkFnZW50LT5nZXRSZXNwb25zZSgpCiAgICAgICAgICAgIC0+c2V0U3RhdHVzQ29kZSgyMDApCiAgICAgICAgICAgIC0+c2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJykKICAgICAgICAgICAgLT5zZXRCb2R5KGdzSW5jbHVkZUZpbGUoJ2RpYWdub3N0aWNzLnBocCcpKQogICAgICAgICAgICAtPnNlbmQoKTsKICAgIH0KCiAgICAvLyBBdXRoZW50aWNhdGlvbgogICAgJGdyYXZpdHlzY2FuQXV0aCA9IG5ldyBHcmF2aXR5c2NhbkFnZW50QXV0aCgpOwogICAgJGdyYXZpdHlzY2FuQXV0aC0+c2V0U2lnbmF0dXJlKHBhY2soIkgqIiwgJHJlcXVlc3QtPmdldEhlYWRlcignWC1HcmF2aXR5c2Nhbi1TaWduYXR1cmUnKSkpCiAgICAgICAgLT5zZXRNZXNzYWdlKCRyZXF1ZXN0LT5nZXRCb2R5KCkpCiAgICAgICAgLT5zZXRQdWJsaWNLZXkoZ3NDb25maWcoJ3B1YmxpY19rZXknKSkKICAgICAgICAtPmF1dGhlbnRpY2F0ZSgpOwoKICAgICRhdXRoZW50aWNhdGVkID0gdHJ1ZTsKCiAgICAvLyBJc3N1ZSBjb21tYW5kcwogICAgJGdyYXZpdHlzY2FuQWdlbnQtPnJ1bigpOwoKfSBjYXRjaCAoR3Jhdml0eXNjYW5FeGNlcHRpb24gJGUpIHsKICAgICRncmF2aXR5c2NhbkFnZW50LT5nZXRSZXNwb25zZSgpCiAgICAgICAgLT5zZXRTdGF0dXNDb2RlKCRlLT5nZXRDb2RlKCkpCiAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAnY29kZScgID0+ICRlLT5nZXRDb2RlKCksCiAgICAgICAgICAgICdlcnJvcicgPT4gJGUtPmdldE1lc3NhZ2UoKSwKICAgICAgICApKQogICAgICAgIC0+c2VuZCgpOwoKfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAkZ3Jhdml0eXNjYW5BZ2VudC0+Z2V0UmVzcG9uc2UoKQogICAgICAgIC0+c2V0U3RhdHVzQ29kZSg1MDApCiAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAnY29kZScgID0+IDUwMCwKICAgICAgICAgICAgJ2Vycm9yJyA9PiAkYXV0aGVudGljYXRlZCA/ICRlLT5nZXRNZXNzYWdlKCkgOiAnVGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgeW91ciByZXF1ZXN0LicsCiAgICAgICAgKSkKICAgICAgICAtPnNlbmQoKTsKfQoiO3M6MzI6ImNsYXNzZXMvR3Jhdml0eXNjYW5BZ2VudEF1dGgucGhwIjtzOjI2MTM6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhbkFnZW50QXV0aAp7CiAgICBwcml2YXRlICRzaWduYXR1cmU7CiAgICBwcml2YXRlICRtZXNzYWdlOwogICAgcHJpdmF0ZSAkcHVibGljS2V5OwoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbmF0dXJlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwdWJsaWNLZXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzaWduYXR1cmUgPSBudWxsLCAkbWVzc2FnZSA9IG51bGwsICRwdWJsaWNLZXkgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zaWduYXR1cmUgPSAkc2lnbmF0dXJlOwogICAgICAgICR0aGlzLT5tZXNzYWdlID0gJG1lc3NhZ2U7CiAgICAgICAgJHRoaXMtPnB1YmxpY0tleSA9ICRwdWJsaWNLZXk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqIEB0aHJvd3MgR3Jhdml0eXNjYW5FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGF1dGhlbnRpY2F0ZSgpCiAgICB7CiAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSBpcyBjb3JyZWN0CiAgICAgICAgaWYgKCEkdGhpcy0+dmVyaWZ5U2lnbmF0dXJlKCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdBY2Nlc3MgZGVuaWVkLicsIDQwMyk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIGhhcyBub3QgZXhwaXJlZC4KICAgICAgICAkanNvbkJvZHkgPSBAanNvbl9kZWNvZGUoJHRoaXMtPmdldE1lc3NhZ2UoKSwgdHJ1ZSk7CiAgICAgICAgaWYgKCEkanNvbkJvZHkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdFcnJvciBwYXJzaW5nIHRoZSBKU09OIHJlcXVlc3QgYm9keS4gRXJyb3IgY29kZTogJyAuIGpzb25fbGFzdF9lcnJvcigpLCA0MjIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzc2V0KCRqc29uQm9keVsnaXNzdWVkLWF0J10pIHx8ICFpc3NldCgkanNvbkJvZHlbJ2V4cGlyZXMtYXQnXSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdgaXNzdWVkLWF0YCBhbmQgYGV4cGlyZXMtYXRgIHRpbWVzdGFtcHMgbXVzdCBiZSBzdXBwbGllZCBpbiB0aGUgcmVxdWVzdCBib2R5LicsIDQyMik7CiAgICAgICAgfQogICAgICAgICRub3cgPSBtaWNyb3RpbWUodHJ1ZSk7CiAgICAgICAgaWYgKCEoJGpzb25Cb2R5Wydpc3N1ZWQtYXQnXSA8PSAkbm93ICYmICRqc29uQm9keVsnZXhwaXJlcy1hdCddID49ICRub3cpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignUmVxdWVzdCBoYXMgZXhwaXJlZC4gQ3VycmVudCBzZXJ2ZXIgdGltZSBpcyAnIC4gJG5vdywgNDIyKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoKQogICAgewogICAgICAgIHJldHVybiBvcGVuc3NsX3ZlcmlmeSgkdGhpcy0+Z2V0TWVzc2FnZSgpLCAkdGhpcy0+Z2V0U2lnbmF0dXJlKCksICR0aGlzLT5nZXRQdWJsaWNLZXkoKSwgT1BFTlNTTF9BTEdPX1NIQTEpID09PSAxOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbmF0dXJlCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQWdlbnRBdXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTaWduYXR1cmUoJHNpZ25hdHVyZSkKICAgIHsKICAgICAgICAkdGhpcy0+c2lnbmF0dXJlID0gJHNpZ25hdHVyZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNpZ25hdHVyZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5BZ2VudEF1dGgKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE1lc3NhZ2UoJG1lc3NhZ2UpCiAgICB7CiAgICAgICAgJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5tZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkcHVibGljS2V5CiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQWdlbnRBdXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRQdWJsaWNLZXkoJHB1YmxpY0tleSkKICAgIHsKICAgICAgICAkdGhpcy0+cHVibGljS2V5ID0gJHB1YmxpY0tleTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHVibGljS2V5KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnB1YmxpY0tleTsKICAgIH0KfSI7czoyODoiY2xhc3Nlcy9HcmF2aXR5c2NhblV0aWxzLnBocCI7czo3NDY3OiI8P3BocAoKY2xhc3MgR3Jhdml0eXNjYW5VdGlscwp7CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJhbmRvbVN0cmluZygkbGVuZ3RoID0gMTYsICRjaGFycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCktXyBbXXt9PD5+YCs9LC47Oi8/fCcpCiAgICB7CiAgICAgICAgLy8gVGhpcyBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIHNlbGY6OnJhbmRvbV9pbnQgZm9yICRsZW5ndGgKICAgICAgICAkYnl0ZXMgPSBzZWxmOjpyYW5kb21fYnl0ZXMoJGxlbmd0aCk7CiAgICAgICAgJHJldHVybiA9ICcnOwogICAgICAgICRtYXhJbmRleCA9IHNlbGY6OnN0cmxlbigkY2hhcnMpIC0gMTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRmcCA9IChmbG9hdClvcmQoJGJ5dGVzWyRpXSkgLyAyNTUuMDsgLy8gY29udmVydCB0byBbMCwxXQogICAgICAgICAgICAkaW5kZXggPSAoaW50KShyb3VuZCgkZnAgKiAkbWF4SW5kZXgpKTsKICAgICAgICAgICAgJHJldHVybiAuPSAkY2hhcnNbJGluZGV4XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXR1cm47CiAgICB9CgogICAgLyoqCiAgICAgKiBQb2x5ZmlsbCBmb3IgcmFuZG9tX2J5dGVzLgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJGJ5dGVzCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbV9ieXRlcygkYnl0ZXMpCiAgICB7CiAgICAgICAgJGJ5dGVzID0gKGludCkkYnl0ZXM7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncmFuZG9tX2J5dGVzJykpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRyYW5kID0gcmFuZG9tX2J5dGVzKCRieXRlcyk7CiAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRyYW5kKSAmJiBzZWxmOjpzdHJsZW4oJHJhbmQpID09PSAkYnl0ZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJhbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgICAgICAgIH0gY2F0Y2ggKFR5cGVFcnJvciAkZSkgewogICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yICRlKSB7CiAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtY3J5cHRfY3JlYXRlX2l2JykpIHsKICAgICAgICAgICAgJHJhbmQgPSBAbWNyeXB0X2NyZWF0ZV9pdigkYnl0ZXMsIE1DUllQVF9ERVZfVVJBTkRPTSk7CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHJhbmQpICYmIHNlbGY6OnN0cmxlbigkcmFuZCkgPT09ICRieXRlcykgewogICAgICAgICAgICAgICAgcmV0dXJuICRyYW5kOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ29wZW5zc2xfcmFuZG9tX3BzZXVkb19ieXRlcycpKSB7CiAgICAgICAgICAgICRyYW5kID0gQG9wZW5zc2xfcmFuZG9tX3BzZXVkb19ieXRlcygkYnl0ZXMsICRzdHJvbmcpOwogICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRyYW5kKSAmJiBzZWxmOjpzdHJsZW4oJHJhbmQpID09PSAkYnl0ZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcmFuZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBMYXN0IHJlc29ydCBpcyBpbnNlY3VyZQogICAgICAgICRyZXR1cm4gPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkYnl0ZXM7ICRpKyspIHsKICAgICAgICAgICAgJHJldHVybiAuPSBjaHIobXRfcmFuZCgwLCAyNTUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXR1cm47CiAgICB9CgogICAgLyoqCiAgICAgKiBQb2x5ZmlsbCBmb3IgcmFuZG9tX2ludC4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRtaW4KICAgICAqIEBwYXJhbSBpbnQgJG1heAogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByYW5kb21faW50KCRtaW4gPSAwLCAkbWF4ID0gMHg3RkZGRkZGRikKICAgIHsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdyYW5kb21faW50JykpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21faW50KCRtaW4sICRtYXgpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAogICAgICAgICAgICB9IGNhdGNoIChUeXBlRXJyb3IgJGUpIHsKICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAogICAgICAgICAgICB9IGNhdGNoIChFcnJvciAkZSkgewogICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGRpZmYgPSAkbWF4IC0gJG1pbjsKICAgICAgICAkYnl0ZXMgPSBzZWxmOjpyYW5kb21fYnl0ZXMoNCk7CiAgICAgICAgaWYgKCRieXRlcyA9PT0gZmFsc2UgfHwgc2VsZjo6c3RybGVuKCRieXRlcykgIT0gNCkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCA0IGJ5dGVzIik7CiAgICAgICAgfQogICAgICAgICR2YWwgPSB1bnBhY2soIk5pbnQiLCAkYnl0ZXMpOwogICAgICAgICR2YWwgPSAkdmFsWydpbnQnXSAmIDB4N0ZGRkZGRkY7CiAgICAgICAgJGZwID0gKGZsb2F0KSR2YWwgLyAyMTQ3NDgzNjQ3LjA7IC8vIGNvbnZlcnQgdG8gWzAsMV0KICAgICAgICByZXR1cm4gKGludCkocm91bmQoJGZwICogJGRpZmYpICsgJG1pbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG1ic3RyaW5nIGludGVybmFsIGVuY29kaW5nIHRvIGEgYmluYXJ5IHNhZmUgZW5jb2Rpbmcgd2hlbiBmdW5jX292ZXJsb2FkCiAgICAgKiBpcyBlbmFibGVkLgogICAgICoKICAgICAqIFdoZW4gbWJzdHJpbmcuZnVuY19vdmVybG9hZCBpcyBpbiB1c2UgZm9yIG11bHRpLWJ5dGUgZW5jb2RpbmdzLCB0aGUgcmVzdWx0cyBmcm9tCiAgICAgKiBzdHJsZW4oKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgcmVzcGVjdCB0aGUgdXRmOCBjaGFyYWN0ZXJzLCBjYXVzaW5nIGJpbmFyeSBkYXRhCiAgICAgKiB0byByZXR1cm4gaW5jb3JyZWN0IGxlbmd0aHMuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIG1ic3RyaW5nIGVuY29kaW5nIHRvIGEgYmluYXJ5LXNhZmUgZW5jb2RpbmcsIGFuZAogICAgICogcmVzZXRzIGl0IHRvIHRoZSB1c2VycyBleHBlY3RlZCBlbmNvZGluZyBhZnRlcndhcmRzIHRocm91Z2ggdGhlCiAgICAgKiBgcmVzZXRfbWJzdHJpbmdfZW5jb2RpbmdgIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEl0IGlzIHNhZmUgdG8gcmVjdXJzaXZlbHkgY2FsbCB0aGlzIGZ1bmN0aW9uLCBob3dldmVyIGVhY2gKICAgICAqIGBtYnN0cmluZ19iaW5hcnlfc2FmZV9lbmNvZGluZygpYCBjYWxsIG11c3QgYmUgZm9sbG93ZWQgdXAgd2l0aCBhbiBlcXVhbCBudW1iZXIKICAgICAqIG9mIGByZXNldF9tYnN0cmluZ19lbmNvZGluZygpYCBjYWxscy4KICAgICAqCiAgICAgKiBAc2VlIHdmV0FGVXRpbHM6OnJlc2V0X21ic3RyaW5nX2VuY29kaW5nCiAgICAgKgogICAgICogQHN0YXRpY3ZhciBhcnJheSAkZW5jb2RpbmdzCiAgICAgKiBAc3RhdGljdmFyIGJvb2wgICRvdmVybG9hZGVkCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJHJlc2V0IE9wdGlvbmFsLiBXaGV0aGVyIHRvIHJlc2V0IHRoZSBlbmNvZGluZyBiYWNrIHRvIGEgcHJldmlvdXNseS1zZXQgZW5jb2RpbmcuCiAgICAgKiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmYWxzZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYnN0cmluZ19iaW5hcnlfc2FmZV9lbmNvZGluZygkcmVzZXQgPSBmYWxzZSkKICAgIHsKICAgICAgICBzdGF0aWMgJGVuY29kaW5ncyA9IGFycmF5KCk7CiAgICAgICAgc3RhdGljICRvdmVybG9hZGVkID0gbnVsbDsKCiAgICAgICAgaWYgKGlzX251bGwoJG92ZXJsb2FkZWQpKQogICAgICAgICAgICAkb3ZlcmxvYWRlZCA9IGZ1bmN0aW9uX2V4aXN0cygnbWJfaW50ZXJuYWxfZW5jb2RpbmcnKSAmJiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMik7CgogICAgICAgIGlmIChmYWxzZSA9PT0gJG92ZXJsb2FkZWQpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgaWYgKCEkcmVzZXQpIHsKICAgICAgICAgICAgJGVuY29kaW5nID0gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkZW5jb2RpbmdzLCAkZW5jb2RpbmcpOwogICAgICAgICAgICBtYl9pbnRlcm5hbF9lbmNvZGluZygnSVNPLTg4NTktMScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRyZXNldCAmJiAkZW5jb2RpbmdzKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9IGFycmF5X3BvcCgkZW5jb2RpbmdzKTsKICAgICAgICAgICAgbWJfaW50ZXJuYWxfZW5jb2RpbmcoJGVuY29kaW5nKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXNldCB0aGUgbWJzdHJpbmcgaW50ZXJuYWwgZW5jb2RpbmcgdG8gYSB1c2VycyBwcmV2aW91c2x5IHNldCBlbmNvZGluZy4KICAgICAqCiAgICAgKiBAc2VlIHdmV0FGVXRpbHM6Om1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzZXRfbWJzdHJpbmdfZW5jb2RpbmcoKQogICAgewogICAgICAgIHNlbGY6Om1ic3RyaW5nX2JpbmFyeV9zYWZlX2VuY29kaW5nKHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGNhbGxhYmxlICRmdW5jdGlvbgogICAgICogQHBhcmFtIGFycmF5ICRhcmdzCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCRmdW5jdGlvbiwgJGFyZ3MpCiAgICB7CiAgICAgICAgc2VsZjo6bWJzdHJpbmdfYmluYXJ5X3NhZmVfZW5jb2RpbmcoKTsKICAgICAgICAkcmV0dXJuID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmN0aW9uLCAkYXJncyk7CiAgICAgICAgc2VsZjo6cmVzZXRfbWJzdHJpbmdfZW5jb2RpbmcoKTsKICAgICAgICByZXR1cm4gJHJldHVybjsKICAgIH0KCiAgICAvKioKICAgICAqIE11bHRpYnl0ZSBzYWZlIHN0cmxlbi4KICAgICAqCiAgICAgKiBAcGFyYW0gJGJpbmFyeQogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW4oJGJpbmFyeSkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJsZW4nLCAkYXJncyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gJGhheXN0YWNrCiAgICAgKiBAcGFyYW0gJG5lZWRsZQogICAgICogQHBhcmFtIGludCAkb2Zmc2V0CiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJpcG9zJywgJGFyZ3MpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRzdHJpbmcKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJ0b2xvd2VyKCRzdHJpbmcpCiAgICB7CiAgICAgICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNhbGxNQlNhZmVTdHJGdW5jdGlvbignc3RydG9sb3dlcicsICRhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAkc3RyaW5nCiAgICAgKiBAcGFyYW0gJHN0YXJ0CiAgICAgKiBAcGFyYW0gJGxlbmd0aAogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKQogICAgewogICAgICAgICRhcmdzID0gZnVuY19nZXRfYXJncygpOwogICAgICAgIHJldHVybiBzZWxmOjpjYWxsTUJTYWZlU3RyRnVuY3Rpb24oJ3N1YnN0cicsICRhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAkaGF5c3RhY2sKICAgICAqIEBwYXJhbSAkbmVlZGxlCiAgICAgKiBAcGFyYW0gaW50ICRvZmZzZXQKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJwb3MnLCAkYXJncyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoYXlzdGFjawogICAgICogQHBhcmFtIHN0cmluZyAkbmVlZGxlCiAgICAgKiBAcGFyYW0gaW50ICRvZmZzZXQKICAgICAqIEBwYXJhbSBpbnQgJGxlbmd0aAogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1YnN0cl9jb3VudCgkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkbGVuZ3RoID0gbnVsbCkKICAgIHsKICAgICAgICAkaGF5c3RhY2sgPSBzZWxmOjpzdWJzdHIoJGhheXN0YWNrLCAkb2Zmc2V0LCAkbGVuZ3RoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdWJzdHJfY291bnQnLCBhcnJheSgKICAgICAgICAgICAgJGhheXN0YWNrLCAkbmVlZGxlLAogICAgICAgICkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRzdHJpbmcKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJ0b3VwcGVyKCRzdHJpbmcpCiAgICB7CiAgICAgICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNhbGxNQlNhZmVTdHJGdW5jdGlvbignc3RydG91cHBlcicsICRhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhheXN0YWNrCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuZWVkbGUKICAgICAqIEBwYXJhbSBpbnQgJG9mZnNldAogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKICAgIHsKICAgICAgICAkYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICAgICByZXR1cm4gc2VsZjo6Y2FsbE1CU2FmZVN0ckZ1bmN0aW9uKCdzdHJycG9zJywgJGFyZ3MpOwogICAgfQoKCn0iO3M6MzU6ImNsYXNzZXMvR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UucGhwIjtzOjEzMjg6Ijw/cGhwCgppbnRlcmZhY2UgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UKewogICAgcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzKCRrZXkpOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJGtleSwgJHZhbHVlKTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCRrZXkpOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBkZWxldGUoJGtleSk7CgogICAgcHVibGljIGZ1bmN0aW9uIGRlc3Ryb3koKTsKfQoKY2xhc3MgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2VTZXNzaW9uIGltcGxlbWVudHMgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UKewoKICAgIHB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCkKICAgIHsKICAgICAgICBpZiAoIShAc2Vzc2lvbl9pZCgpIHx8IEBzZXNzaW9uX3N0YXJ0KCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignVW5hYmxlIHRvIHN0YXJ0IHNlc3Npb24gZm9yIGxvY2FsIHN0b3JhZ2UuICcgLiBlcnJvcl9nZXRfbGFzdCgpLCA1MDApOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzKCRrZXkpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzX2FycmF5KCRfU0VTU0lPTikgJiYKICAgICAgICBhcnJheV9rZXlfZXhpc3RzKCdncmF2aXR5c2Nhbi1hZ2VudCcsICRfU0VTU0lPTikgJiYKICAgICAgICBpc19hcnJheSgkX1NFU1NJT05bJ2dyYXZpdHlzY2FuLWFnZW50J10pICYmCiAgICAgICAgYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkX1NFU1NJT05bJ2dyYXZpdHlzY2FuLWFnZW50J10pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJGtleSwgJHZhbHVlKQogICAgewogICAgICAgICRfU0VTU0lPTlsnZ3Jhdml0eXNjYW4tYWdlbnQnXVska2V5XSA9ICR2YWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCRrZXkpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5oYXMoJGtleSkpIHsKICAgICAgICAgICAgcmV0dXJuICRfU0VTU0lPTlsnZ3Jhdml0eXNjYW4tYWdlbnQnXVska2V5XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRlbGV0ZSgka2V5KQogICAgewogICAgICAgIHVuc2V0KCRfU0VTU0lPTlsnZ3Jhdml0eXNjYW4tYWdlbnQnXVska2V5XSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRlc3Ryb3koKQogICAgewogICAgICAgIEBzZXNzaW9uX2Rlc3Ryb3koKTsKICAgIH0KfQoKLy9jbGFzcyBHcmF2aXR5c2NhbkxvY2FsU3RvcmFnZVRlbXAgaW1wbGVtZW50cyBHcmF2aXR5c2NhbkxvY2FsU3RvcmFnZQovL3sKLy8KLy99IjtzOjMyOiJjbGFzc2VzL0dyYXZpdHlzY2FuRXhjZXB0aW9uLnBocCI7czo1NjoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCnsKCn0iO3M6Mjg6ImNsYXNzZXMvR3Jhdml0eXNjYW5BZ2VudC5waHAiO3M6MzI1ODoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuQWdlbnQKewogICAgcHJpdmF0ZSAkcmVxdWVzdDsKICAgIHByaXZhdGUgJHJlc3BvbnNlOwogICAgcHJpdmF0ZSAkbG9jYWxTdG9yYWdlOwoKICAgIC8qKgogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVxdWVzdCAkcmVxdWVzdAogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVzcG9uc2UgJHJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcmVxdWVzdCwgJHJlc3BvbnNlKQogICAgewogICAgICAgICR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7CiAgICAgICAgJHRoaXMtPnJlc3BvbnNlID0gJHJlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoKQogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBHcmF2aXR5c2NhbkV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcnVuKCkKICAgIHsKICAgICAgICAkYm9keSA9ICR0aGlzLT5nZXRSZXF1ZXN0KCktPmdldEJvZHkoKTsKICAgICAgICAkanNvbkJvZHkgPSBAanNvbl9kZWNvZGUoJGJvZHksIHRydWUpOwogICAgICAgIGlmICghJGpzb25Cb2R5KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignRXJyb3IgcGFyc2luZyB0aGUgSlNPTiBib2R5LicsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAkY29tbWFuZE5hbWUgPSAhZW1wdHkoJGpzb25Cb2R5Wydjb21tYW5kJ10pICYmIGlzX3N0cmluZygkanNvbkJvZHlbJ2NvbW1hbmQnXSkgPyAkanNvbkJvZHlbJ2NvbW1hbmQnXSA6IG51bGw7CiAgICAgICAgJGNvbW1hbmRBcmdzID0gaXNzZXQoJGpzb25Cb2R5WydhcmdzJ10pID8gJGpzb25Cb2R5WydhcmdzJ10gOiBudWxsOwogICAgICAgICRjb21tYW5kQ2xhc3MgPSAnR3Jhdml0eXNjYW4nIC4gJGNvbW1hbmROYW1lIC4gJ0NvbW1hbmQnOwoKICAgICAgICBpZiAoIWNsYXNzX2V4aXN0cygkY29tbWFuZENsYXNzKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0NvbW1hbmQgJyAuICRjb21tYW5kTmFtZSAuICcgbm90IGZvdW5kLicsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAvKiogQHZhciBHcmF2aXR5c2NhbkNvbW1hbmQgJGNvbW1hbmQgKi8KICAgICAgICAkY29tbWFuZCA9IG5ldyAkY29tbWFuZENsYXNzKCR0aGlzKTsKICAgICAgICAkcmVzdWx0ID0gJGNvbW1hbmQtPnNldEFyZ3MoJGNvbW1hbmRBcmdzKQogICAgICAgICAgICAtPnNldFJlcXVlc3QoJHRoaXMtPmdldFJlcXVlc3QoKSkKICAgICAgICAgICAgLT5zZXRSZXNwb25zZSgkdGhpcy0+Z2V0UmVzcG9uc2UoKSkKICAgICAgICAgICAgLT5leGVjdXRlKCk7CgogICAgICAgIGlmICgkcmVzdWx0KSB7CiAgICAgICAgICAgICR0aGlzLT5nZXRSZXNwb25zZSgpCiAgICAgICAgICAgICAgICAtPnNldEJvZHkoJHJlc3VsdCkKICAgICAgICAgICAgICAgIC0+c2VuZCgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXF1ZXN0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1ZXN0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlcXVlc3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gR3Jhdml0eXNjYW5SZXF1ZXN0ICRyZXF1ZXN0CiAgICAgKiBAcmV0dXJuICR0aGlzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXF1ZXN0KCRyZXF1ZXN0KQogICAgewogICAgICAgICR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSZXNwb25zZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZXNwb25zZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBHcmF2aXR5c2NhblJlc3BvbnNlICRyZXNwb25zZQogICAgICogQHJldHVybiAkdGhpcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVzcG9uc2UoJHJlc3BvbnNlKQogICAgewogICAgICAgICR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuTG9jYWxTdG9yYWdlCiAgICAgKiBAdGhyb3dzIEdyYXZpdHlzY2FuRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbFN0b3JhZ2UoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmxvY2FsU3RvcmFnZSkgewogICAgICAgICAgICAkc3RvcmFnZURyaXZlcnMgPSBhcnJheSgKICAgICAgICAgICAgICAgICdHcmF2aXR5c2NhbkxvY2FsU3RvcmFnZVNlc3Npb24nLAogICAgICAgICAgICAgICAgLy8gJ0dyYXZpdHlzY2FuTG9jYWxTdG9yYWdlVGVtcCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRzdG9yYWdlRHJpdmVycyBhcyAkZHJpdmVyKSB7CiAgICAgICAgICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCRkcml2ZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB2YXIgR3Jhdml0eXNjYW5Mb2NhbFN0b3JhZ2UgJHN0b3JhZ2UgKi8KICAgICAgICAgICAgICAgICAgICAkc3RvcmFnZSA9IG5ldyAkZHJpdmVyKCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0b3JhZ2UtPmluaXRpYWxpemUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvY2FsU3RvcmFnZSA9ICRzdG9yYWdlOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEdyYXZpdHlzY2FuRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5sb2NhbFN0b3JhZ2UpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRlKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdVbmFibGUgdG8gdXRpbGl6ZSBsb2NhbCBzdG9yYWdlLicsIDUwMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+bG9jYWxTdG9yYWdlOwogICAgfQoKfQoKIjtzOjMxOiJjbGFzc2VzL0dyYXZpdHlzY2FuUmVzcG9uc2UucGhwIjtzOjU3MzQ6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhblJlc3BvbnNlCnsKICAgIHB1YmxpYyBzdGF0aWMgJHN0YXR1c1RleHRzID0gYXJyYXkoCiAgICAgICAgMTAwID0+ICdDb250aW51ZScsCiAgICAgICAgMTAxID0+ICdTd2l0Y2hpbmcgUHJvdG9jb2xzJywKICAgICAgICAxMDIgPT4gJ1Byb2Nlc3NpbmcnLCAgICAgICAgICAgIC8vIFJGQzI1MTgKICAgICAgICAyMDAgPT4gJ09LJywKICAgICAgICAyMDEgPT4gJ0NyZWF0ZWQnLAogICAgICAgIDIwMiA9PiAnQWNjZXB0ZWQnLAogICAgICAgIDIwMyA9PiAnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLAogICAgICAgIDIwNCA9PiAnTm8gQ29udGVudCcsCiAgICAgICAgMjA1ID0+ICdSZXNldCBDb250ZW50JywKICAgICAgICAyMDYgPT4gJ1BhcnRpYWwgQ29udGVudCcsCiAgICAgICAgMjA3ID0+ICdNdWx0aS1TdGF0dXMnLCAgICAgICAgICAvLyBSRkM0OTE4CiAgICAgICAgMjA4ID0+ICdBbHJlYWR5IFJlcG9ydGVkJywgICAgICAvLyBSRkM1ODQyCiAgICAgICAgMjI2ID0+ICdJTSBVc2VkJywgICAgICAgICAgICAgICAvLyBSRkMzMjI5CiAgICAgICAgMzAwID0+ICdNdWx0aXBsZSBDaG9pY2VzJywKICAgICAgICAzMDEgPT4gJ01vdmVkIFBlcm1hbmVudGx5JywKICAgICAgICAzMDIgPT4gJ0ZvdW5kJywKICAgICAgICAzMDMgPT4gJ1NlZSBPdGhlcicsCiAgICAgICAgMzA0ID0+ICdOb3QgTW9kaWZpZWQnLAogICAgICAgIDMwNSA9PiAnVXNlIFByb3h5JywKICAgICAgICAzMDcgPT4gJ1RlbXBvcmFyeSBSZWRpcmVjdCcsCiAgICAgICAgMzA4ID0+ICdQZXJtYW5lbnQgUmVkaXJlY3QnLCAgICAvLyBSRkM3MjM4CiAgICAgICAgNDAwID0+ICdCYWQgUmVxdWVzdCcsCiAgICAgICAgNDAxID0+ICdVbmF1dGhvcml6ZWQnLAogICAgICAgIDQwMiA9PiAnUGF5bWVudCBSZXF1aXJlZCcsCiAgICAgICAgNDAzID0+ICdGb3JiaWRkZW4nLAogICAgICAgIDQwNCA9PiAnTm90IEZvdW5kJywKICAgICAgICA0MDUgPT4gJ01ldGhvZCBOb3QgQWxsb3dlZCcsCiAgICAgICAgNDA2ID0+ICdOb3QgQWNjZXB0YWJsZScsCiAgICAgICAgNDA3ID0+ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsCiAgICAgICAgNDA4ID0+ICdSZXF1ZXN0IFRpbWVvdXQnLAogICAgICAgIDQwOSA9PiAnQ29uZmxpY3QnLAogICAgICAgIDQxMCA9PiAnR29uZScsCiAgICAgICAgNDExID0+ICdMZW5ndGggUmVxdWlyZWQnLAogICAgICAgIDQxMiA9PiAnUHJlY29uZGl0aW9uIEZhaWxlZCcsCiAgICAgICAgNDEzID0+ICdQYXlsb2FkIFRvbyBMYXJnZScsCiAgICAgICAgNDE0ID0+ICdVUkkgVG9vIExvbmcnLAogICAgICAgIDQxNSA9PiAnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScsCiAgICAgICAgNDE2ID0+ICdSYW5nZSBOb3QgU2F0aXNmaWFibGUnLAogICAgICAgIDQxNyA9PiAnRXhwZWN0YXRpb24gRmFpbGVkJywKICAgICAgICA0MTggPT4gJ0lcJ20gYSB0ZWFwb3QnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjMyNAogICAgICAgIDQyMSA9PiAnTWlzZGlyZWN0ZWQgUmVxdWVzdCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM3NTQwCiAgICAgICAgNDIyID0+ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJGQzQ5MTgKICAgICAgICA0MjMgPT4gJ0xvY2tlZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDNDkxOAogICAgICAgIDQyNCA9PiAnRmFpbGVkIERlcGVuZGVuY3knLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM0OTE4CiAgICAgICAgNDI1ID0+ICdSZXNlcnZlZCBmb3IgV2ViREFWIGFkdmFuY2VkIGNvbGxlY3Rpb25zIGV4cGlyZWQgcHJvcG9zYWwnLCAgIC8vIFJGQzI4MTcKICAgICAgICA0MjYgPT4gJ1VwZ3JhZGUgUmVxdWlyZWQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjgxNwogICAgICAgIDQyOCA9PiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM2NTg1CiAgICAgICAgNDI5ID0+ICdUb28gTWFueSBSZXF1ZXN0cycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJGQzY1ODUKICAgICAgICA0MzEgPT4gJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDNjU4NQogICAgICAgIDQ1MSA9PiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM3NzI1CiAgICAgICAgNTAwID0+ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLAogICAgICAgIDUwMSA9PiAnTm90IEltcGxlbWVudGVkJywKICAgICAgICA1MDIgPT4gJ0JhZCBHYXRld2F5JywKICAgICAgICA1MDMgPT4gJ1NlcnZpY2UgVW5hdmFpbGFibGUnLAogICAgICAgIDUwNCA9PiAnR2F0ZXdheSBUaW1lb3V0JywKICAgICAgICA1MDUgPT4gJ0hUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkJywKICAgICAgICA1MDYgPT4gJ1ZhcmlhbnQgQWxzbyBOZWdvdGlhdGVzIChFeHBlcmltZW50YWwpJywgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjI5NQogICAgICAgIDUwNyA9PiAnSW5zdWZmaWNpZW50IFN0b3JhZ2UnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM0OTE4CiAgICAgICAgNTA4ID0+ICdMb29wIERldGVjdGVkJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJGQzU4NDIKICAgICAgICA1MTAgPT4gJ05vdCBFeHRlbmRlZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjc3NAogICAgICAgIDUxMSA9PiAnTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkM2NTg1CiAgICApOwoKICAgIHByaXZhdGUgJHN0YXR1c0NvZGUgPSAyMDA7CiAgICBwcml2YXRlICRib2R5ID0gJyc7CiAgICBwcml2YXRlICRoZWFkZXJzID0gYXJyYXkoKTsKCgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKCiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VuZCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnNlbmRIZWFkZXJzKCk7CiAgICAgICAgZWNobyAkdGhpcy0+Z2V0Qm9keSgpOwogICAgICAgIGV4aXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kU3RyZWFtTWVzc2FnZSgkbWVzc2FnZSkKICAgIHsKICAgICAgICAkdGhpcy0+c2VuZEhlYWRlcnMoKTsKICAgICAgICBlY2hvICRtZXNzYWdlIC4gIlx4MDAiOwogICAgICAgIGZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlbmRIZWFkZXJzKCkKICAgIHsKICAgICAgICBpZiAoaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHN0YXR1c0NvZGUgPSAkdGhpcy0+Z2V0U3RhdHVzQ29kZSgpOwogICAgICAgIGlmICgkc3RhdHVzQ29kZSAhPT0gbnVsbCkgewogICAgICAgICAgICBoZWFkZXIoc3ByaW50ZignSFRUUC8xLjAgJXMgJXMnLAogICAgICAgICAgICAgICAgJHN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICBhcnJheV9rZXlfZXhpc3RzKCRzdGF0dXNDb2RlLCBzZWxmOjokc3RhdHVzVGV4dHMpID8gc2VsZjo6JHN0YXR1c1RleHRzWyRzdGF0dXNDb2RlXSA6ICdVbmtub3duIHN0YXR1cycKICAgICAgICAgICAgKSwgdHJ1ZSwgJHN0YXR1c0NvZGUpOwogICAgICAgIH0KCiAgICAgICAgJGhlYWRlcnMgPSAkdGhpcy0+Z2V0SGVhZGVycygpOwogICAgICAgIGlmIChpc19hcnJheSgkaGVhZGVycykpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlciA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc19udW1lcmljKCRoZWFkZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGhlYWRlcigiJGhlYWRlcjogJHZhbHVlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG1peGVkICRzdGF0dXNDb2RlCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVzcG9uc2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFN0YXR1c0NvZGUoJHN0YXR1c0NvZGUpCiAgICB7CiAgICAgICAgJHRoaXMtPnN0YXR1c0NvZGUgPSAkc3RhdHVzQ29kZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnN0YXR1c0NvZGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gJGJvZHkKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXNwb25zZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SnNvbigkYm9keSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKQogICAgICAgICAgICAtPnNldEJvZHkoanNvbl9lbmNvZGUoJGJvZHkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBtaXhlZCAkYm9keQogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCb2R5KCRib2R5KQogICAgewogICAgICAgICR0aGlzLT5ib2R5ID0gJGJvZHk7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9keSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5ib2R5OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRoZWFkZXIKICAgICAqIEBwYXJhbSAkdmFsdWUKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXNwb25zZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVyKCRoZWFkZXIsICR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+aGVhZGVyc1skaGVhZGVyXSA9ICR2YWx1ZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGhlYWRlcnMKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXNwb25zZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVycygkaGVhZGVycykKICAgIHsKICAgICAgICAkdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcnMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aGVhZGVyczsKICAgIH0KCn0iO3M6NTE6ImNsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5QYXR0ZXJuTWF0Y2hDb21tYW5kLnBocCI7czoyNzA5OiI8P3BocAoKY2xhc3MgR3Jhdml0eXNjYW5QYXR0ZXJuTWF0Y2hDb21tYW5kIGV4dGVuZHMgR3Jhdml0eXNjYW5Db21tYW5kCnsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGlwZWRBcmd1bWVudHMoKQogICAgewogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ2ZpbGVMaXN0JywKICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKCkKICAgIHsKICAgICAgICAkcmVnZXhMaXN0ID0gJHRoaXMtPmdldEFyZygncmVnZXhMaXN0Jyk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkcmVnZXhMaXN0KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW3JlZ2V4TGlzdF0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KCiAgICAgICAgJGZpbGVMaXN0ID0gJHRoaXMtPmdldEFyZygnZmlsZUxpc3QnKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRyZWdleExpc3QpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbZmlsZUxpc3RdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CgogICAgICAgICRtYXRjaGluZ1BhdHRlcm4gPSAkdGhpcy0+Z2V0QXJnKCdtYXRjaGluZ1BhdHRlcm4nKTsKICAgICAgICAkcmVhZExlbmd0aCA9ICR0aGlzLT5nZXRBcmcoJ3JlYWRMZW5ndGgnKTsKCiAgICAgICAgJHRoaXMtPnN0YXJ0Q29tbWFuZFN0cmVhbSgpOwogICAgICAgIGZvcmVhY2ggKCRmaWxlTGlzdCBhcyAkZmlsZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGZpbGVQYXRoID0gJHRoaXMtPnZhbGlkYXRlRmlsZSgkZmlsZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEdyYXZpdHlzY2FuRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISRtYXRjaGluZ1BhdHRlcm4gfHwgcHJlZ19tYXRjaCgkbWF0Y2hpbmdQYXR0ZXJuLCAkZmlsZVBhdGgpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnNjYW5GaWxlKCRmaWxlUGF0aCwgJHJlZ2V4TGlzdCwgJHJlYWRMZW5ndGgpOwogICAgICAgICAgICAgICAgaWYgKCRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBsaXN0KCRwYXR0ZXJuLCAkbWF0Y2hTdHJpbmcpID0gJHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVDb21tYW5kU3RyZWFtKGpzb25fZW5jb2RlKGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgJHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF9lbmNvZGUoJG1hdGNoU3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICApKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPmVuZENvbW1hbmRTdHJlYW0oKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUKICAgICAqIEBwYXJhbSBhcnJheSAkcGF0dGVybnMKICAgICAqIEBwYXJhbSBudWxsICRyZWFkTGVuZ3RoCiAgICAgKiBAcmV0dXJuIGFycmF5fGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNjYW5GaWxlKCRmaWxlLCAkcGF0dGVybnMsICRyZWFkTGVuZ3RoID0gbnVsbCkKICAgIHsKICAgICAgICAkZmggPSBAZm9wZW4oJGZpbGUsICdyJyk7CiAgICAgICAgaWYgKCEkZmgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdG90YWxSZWFkID0gMDsKICAgICAgICAkbWF4UmVhZExlbmd0aCA9IGlzX2ludCgkcmVhZExlbmd0aCkgJiYgJHJlYWRMZW5ndGggPiAwID8gJHJlYWRMZW5ndGggOiA1MCAqIDEwMjQgKiAxMDI0OwogICAgICAgICRtYXRjaCA9IGZhbHNlOwoKICAgICAgICB3aGlsZSAoIWZlb2YoJGZoKSkgewogICAgICAgICAgICAkbGVuZ3RoID0gbWluKDEgKiAxMDI0ICogMTAyNCwgJG1heFJlYWRMZW5ndGgpOwoKICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkZmgsICRsZW5ndGgpOyAvLyByZWFkIDEgbWVncyBtYXggcGVyIGNodW5rCiAgICAgICAgICAgICRieXRlc1JlYWQgPSBHcmF2aXR5c2NhblV0aWxzOjpzdHJsZW4oJGRhdGEpOwogICAgICAgICAgICAkdG90YWxSZWFkICs9ICRieXRlc1JlYWQ7CiAgICAgICAgICAgICRtYXhSZWFkTGVuZ3RoIC09ICRieXRlc1JlYWQ7CiAgICAgICAgICAgIGlmICgkdG90YWxSZWFkIDwgMSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggKCRwYXR0ZXJucyBhcyAkcGF0dGVybikgewogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJHBhdHRlcm4sICRkYXRhLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgICAgICAkbWF0Y2hTdHJpbmcgPSAkbWF0Y2hlc1swXTsKICAgICAgICAgICAgICAgICAgICAkbWF0Y2ggPSBhcnJheSgkcGF0dGVybiwgJG1hdGNoU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRtYXhSZWFkTGVuZ3RoIDw9IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZjbG9zZSgkZmgpOwogICAgICAgIHJldHVybiAkbWF0Y2g7CiAgICB9Cn0iO3M6NTQ6ImNsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5MaXN0RGlyZWN0b3JpZXNDb21tYW5kLnBocCI7czoxNDg0OiI8P3BocAoKY2xhc3MgR3Jhdml0eXNjYW5MaXN0RGlyZWN0b3JpZXNDb21tYW5kIGV4dGVuZHMgR3Jhdml0eXNjYW5Db21tYW5kCnsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgpCiAgICB7CiAgICAgICAgJGRpcmVjdG9yeSA9ICR0aGlzLT5nZXRBcmcoJ2RpcmVjdG9yeScpOwogICAgICAgIGlmICghaXNfc3RyaW5nKCRkaXJlY3RvcnkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbZGlyZWN0b3J5XSBhcmd1bWVudCBzdXBwbGllZCcsIDQyMik7CiAgICAgICAgfQogICAgICAgICRkaXJlY3RvcnkgPSAkdGhpcy0+dmFsaWRhdGVGaWxlKCRkaXJlY3RvcnkpOwoKICAgICAgICAkbWF4ID0gJHRoaXMtPmdldEFyZygnbWF4JywgMTAwMDApOwogICAgICAgIGlmICghaXNfbnVtZXJpYygkbWF4KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW21heF0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KICAgICAgICAkbWF4ID0gYWJzKGludHZhbCgkbWF4KSk7CgogICAgICAgICRvZmZzZXQgPSAkdGhpcy0+Z2V0QXJnKCdvZmZzZXQnLCAwKTsKICAgICAgICBpZiAoIWlzX251bWVyaWMoJG9mZnNldCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFtvZmZzZXRdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CiAgICAgICAgJG9mZnNldCA9IGFicyhpbnR2YWwoJG9mZnNldCkpOwoKICAgICAgICAkdGhpcy0+c3RhcnRDb21tYW5kU3RyZWFtKCk7CiAgICAgICAgJGNvdW50ID0gMDsKICAgICAgICBpZiAoaXNfZGlyKCRkaXJlY3RvcnkpKSB7CiAgICAgICAgICAgICRkaXJlY3RvcnlJdGVyYXRvciA9IG5ldyBEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5KTsKICAgICAgICAgICAgJGRpcmVjdG9yeUl0ZXJhdG9yLT5zZWVrKCRvZmZzZXQpOwogICAgICAgICAgICB3aGlsZSAoJGRpcmVjdG9yeUl0ZXJhdG9yLT52YWxpZCgpKSB7CiAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXJlY3RvcnlJdGVyYXRvci0+Y3VycmVudCgpOwogICAgICAgICAgICAgICAgaWYgKCEkZmlsZS0+aXNEb3QoKSAmJiAhJGZpbGUtPmlzTGluaygpICYmICRmaWxlLT5pc0RpcigpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbSgkZmlsZS0+a2V5KCkgLiAnOicgLiAkZmlsZS0+Z2V0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCsrJGNvdW50ID49ICRtYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGRpcmVjdG9yeUl0ZXJhdG9yLT5uZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPmVuZENvbW1hbmRTdHJlYW0oKTsKICAgIH0KfSI7czo0MzoiY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkluZm9Db21tYW5kLnBocCI7czoyNzI6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhbkluZm9Db21tYW5kIGV4dGVuZHMgR3Jhdml0eXNjYW5Db21tYW5kCnsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgpCiAgICB7CiAgICAgICAgJHRoaXMtPmdldFJlc3BvbnNlKCkKICAgICAgICAgICAgLT5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3BsYWluJykKICAgICAgICAgICAgLT5zZW5kSGVhZGVycygpOwogICAgICAgIG9iX3N0YXJ0KCdzdHJpcF90YWdzJyk7CiAgICAgICAgcGhwaW5mbygpOwogICAgfQp9IjtzOjQ2OiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuVmVyc2lvbkNvbW1hbmQucGhwIjtzOjI2NDoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuVmVyc2lvbkNvbW1hbmQgZXh0ZW5kcyBHcmF2aXR5c2NhbkNvbW1hbmQKewoKICAgIHB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKCkKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0UmVzcG9uc2UoKQogICAgICAgICAgICAtPnNldEpzb24oYXJyYXkoCiAgICAgICAgICAgICAgICAndmVyc2lvbicgPT4gR1JBVklUWVNDQU5fQUdFTlRfVkVSU0lPTiwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgLT5zZW5kKCk7CgogICAgfQp9IjtzOjUxOiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTG9jYWxTdG9yYWdlQ29tbWFuZC5waHAiO3M6MTY1OToiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuTG9jYWxTdG9yYWdlQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKQogICAgewogICAgICAgICRhY3Rpb24gPSAkdGhpcy0+Z2V0QXJnKCdhY3Rpb24nKTsKICAgICAgICBpZiAoIWlzX3N0cmluZygkYWN0aW9uKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2FjdGlvbl0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KCiAgICAgICAgJGtleSA9ICR0aGlzLT5nZXRBcmcoJ2tleScpOwogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5nZXRBcmcoJ3ZhbHVlJywgbnVsbCk7CgogICAgICAgICRzdG9yYWdlID0gJHRoaXMtPmdldEFnZW50KCktPmdldExvY2FsU3RvcmFnZSgpOwoKICAgICAgICBzd2l0Y2ggKCRhY3Rpb24pIHsKICAgICAgICAgICAgY2FzZSAnc2V0JzoKICAgICAgICAgICAgY2FzZSAnZ2V0JzoKICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzoKICAgICAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFtrZXldIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkYWN0aW9uKSB7CiAgICAgICAgICAgIGNhc2UgJ3NldCc6CiAgICAgICAgICAgICAgICAkc3RvcmFnZS0+c2V0KCRrZXksICR2YWx1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2dldCc6CiAgICAgICAgICAgICAgICBpZiAoJHN0b3JhZ2UtPmhhcygka2V5KSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRSZXNwb25zZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0SnNvbihhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScgPT4gJHN0b3JhZ2UtPmdldCgka2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgICAgICAgICAgLT5zZW5kKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0xvY2FsU3RvcmFnZSBbJyAuICRrZXkgLiAnXSBub3QgZm91bmQuJywgNDIyKTsKCiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6CiAgICAgICAgICAgICAgICAkc3RvcmFnZS0+ZGVsZXRlKCRrZXkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdkZXN0cm95JzoKICAgICAgICAgICAgICAgICRzdG9yYWdlLT5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2FjdGlvbl0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmdldFJlc3BvbnNlKCkKICAgICAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnID0+IHRydWUsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIC0+c2VuZCgpOwogICAgfQp9IjtzOjQ4OiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTGlzdEZpbGVzQ29tbWFuZC5waHAiO3M6MTQ4MDoiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuTGlzdEZpbGVzQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKQogICAgewogICAgICAgICRkaXJlY3RvcnkgPSAkdGhpcy0+Z2V0QXJnKCdkaXJlY3RvcnknKTsKICAgICAgICBpZiAoIWlzX3N0cmluZygkZGlyZWN0b3J5KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2RpcmVjdG9yeV0gYXJndW1lbnQgc3VwcGxpZWQnLCA0MjIpOwogICAgICAgIH0KICAgICAgICAkZGlyZWN0b3J5ID0gJHRoaXMtPnZhbGlkYXRlRmlsZSgkZGlyZWN0b3J5KTsKCiAgICAgICAgJG1heCA9ICR0aGlzLT5nZXRBcmcoJ21heCcsIDEwMDAwKTsKICAgICAgICBpZiAoIWlzX251bWVyaWMoJG1heCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFttYXhdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CiAgICAgICAgJG1heCA9IGFicyhpbnR2YWwoJG1heCkpOwoKICAgICAgICAkb2Zmc2V0ID0gJHRoaXMtPmdldEFyZygnb2Zmc2V0JywgMCk7CiAgICAgICAgaWYgKCFpc19udW1lcmljKCRvZmZzZXQpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbb2Zmc2V0XSBhcmd1bWVudCBzdXBwbGllZCcsIDQyMik7CiAgICAgICAgfQogICAgICAgICRvZmZzZXQgPSBhYnMoaW50dmFsKCRvZmZzZXQpKTsKCiAgICAgICAgJHRoaXMtPnN0YXJ0Q29tbWFuZFN0cmVhbSgpOwogICAgICAgICRjb3VudCA9IDA7CiAgICAgICAgaWYgKGlzX2RpcigkZGlyZWN0b3J5KSkgewogICAgICAgICAgICAkZGlyZWN0b3J5SXRlcmF0b3IgPSBuZXcgRGlyZWN0b3J5SXRlcmF0b3IoJGRpcmVjdG9yeSk7CiAgICAgICAgICAgICRkaXJlY3RvcnlJdGVyYXRvci0+c2Vlaygkb2Zmc2V0KTsKICAgICAgICAgICAgd2hpbGUgKCRkaXJlY3RvcnlJdGVyYXRvci0+dmFsaWQoKSkgewogICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyZWN0b3J5SXRlcmF0b3ItPmN1cnJlbnQoKTsKICAgICAgICAgICAgICAgIGlmICghJGZpbGUtPmlzRG90KCkgJiYgISRmaWxlLT5pc0xpbmsoKSAmJiAkZmlsZS0+aXNGaWxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVDb21tYW5kU3RyZWFtKCRmaWxlLT5rZXkoKSAuICc6JyAuICRmaWxlLT5nZXRGaWxlbmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKyskY291bnQgPj0gJG1heCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZGlyZWN0b3J5SXRlcmF0b3ItPm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdGhpcy0+ZW5kQ29tbWFuZFN0cmVhbSgpOwoKICAgIH0KfSI7czo0NToiY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhblVwZGF0ZUNvbW1hbmQucGhwIjtzOjExMDI6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhblVwZGF0ZUNvbW1hbmQgZXh0ZW5kcyBHcmF2aXR5c2NhbkNvbW1hbmQKewoKICAgIHB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKCkKICAgIHsKICAgICAgICAvLyBDaGVjayBmb3IgSldUCiAgICAgICAgJGp3dCA9ICR0aGlzLT5nZXRBcmcoJ2p3dCcpOwogICAgICAgIGlmICghJGp3dCkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2p3dF0gYXJndW1lbnQgc3VwcGxpZWQuJywgNDIyKTsKICAgICAgICB9CgogICAgICAgIC8vIFRlc3QgaWYgd3JpdGFibGUKICAgICAgICBpZiAoIUdSQVZJVFlTQ0FOX0FHRU5UX0lTX1dSSVRBQkxFKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignQWdlbnQgaXMgbm90IHdyaXRhYmxlLicsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIEdyYXZpdHkgQVBJIHRvIGRvd25sb2FkIG5ldyBidWlsZAogICAgICAgICRidWlsZCA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNwcmludGYoZ3NDb25maWcoJ3VwZGF0ZV9hcGlfdXJsJyksIHJhd3VybGVuY29kZShnc0NvbmZpZygnc2l0ZV9pZCcpKSwgcmF3dXJsZW5jb2RlKCRqd3QpKSk7CgogICAgICAgIC8vIFRPRE86IEFkZCBhIGNoZWNrc3VtIGhlcmUuCiAgICAgICAgaWYgKGlzX3N0cmluZygkYnVpbGQpICYmIEdyYXZpdHlzY2FuVXRpbHM6OnN0cmxlbigkYnVpbGQpID4gMCkgewogICAgICAgICAgICAvLyBJbnN0YWxsIG5ldyBidWlsZAogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cyhHUkFWSVRZU0NBTl9BR0VOVF9GSUxFLCAkYnVpbGQpOwogICAgICAgICAgICAkdGhpcy0+Z2V0UmVzcG9uc2UoKQogICAgICAgICAgICAgICAgLT5zZXRKc29uKGFycmF5KAogICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyA9PiB0cnVlLAogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgIC0+c2VuZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignT3V0cHV0IGZyb20gQVBJIHdhcyBub3QgYSBQaGFyIGZpbGUuJywgNDIyKTsKICAgICAgICB9CiAgICB9Cn0iO3M6NTA6ImNsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5NYWx3YXJlU2NhbkNvbW1hbmQucGhwIjtzOjM4OTY6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2Nhbk1hbHdhcmVTY2FuQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFBpcGVkQXJndW1lbnRzKCkKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdmaWxlTGlzdCcsCiAgICAgICAgKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgpCiAgICB7CiAgICAgICAgJHJlZ2V4TGlzdCA9ICR0aGlzLT5nZXRBcmcoJ3JlZ2V4TGlzdCcpOwogICAgICAgIGlmICghaXNfYXJyYXkoJHJlZ2V4TGlzdCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdJbnZhbGlkIFtyZWdleExpc3RdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CgogICAgICAgICRmaWxlTGlzdCA9ICR0aGlzLT5nZXRBcmcoJ2ZpbGVMaXN0Jyk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkcmVnZXhMaXN0KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ludmFsaWQgW2ZpbGVMaXN0XSBhcmd1bWVudCBzdXBwbGllZCcsIDQyMik7CiAgICAgICAgfQoKICAgICAgICAkbWF0Y2hpbmdQYXR0ZXJuID0gJHRoaXMtPmdldEFyZygnbWF0Y2hpbmdQYXR0ZXJuJyk7CiAgICAgICAgJHJlYWRMZW5ndGggPSAkdGhpcy0+Z2V0QXJnKCdyZWFkTGVuZ3RoJyk7CgogICAgICAgICR0aGlzLT5zdGFydENvbW1hbmRTdHJlYW0oKTsKICAgICAgICBmb3JlYWNoICgkZmlsZUxpc3QgYXMgJGZpbGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRmaWxlUGF0aCA9ICR0aGlzLT52YWxpZGF0ZUZpbGUoJGZpbGUpOwogICAgICAgICAgICB9IGNhdGNoIChHcmF2aXR5c2NhbkV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkbWF0Y2hpbmdQYXR0ZXJuIHx8IHByZWdfbWF0Y2goJG1hdGNoaW5nUGF0dGVybiwgJGZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5zY2FuRmlsZUZvck1hbHdhcmUoJGZpbGVQYXRoLCAkcmVnZXhMaXN0LCAkcmVhZExlbmd0aCk7CiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJGtleSwgJG1hdGNoU3RyaW5nLCAkYmVmb3JlU3RyaW5nLCAkYWZ0ZXJTdHJpbmcsICRoYXNoKSA9ICRyZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbShqc29uX2VuY29kZShhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF9lbmNvZGUoJG1hdGNoU3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X2VuY29kZSgkYmVmb3JlU3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X2VuY29kZSgkYWZ0ZXJTdHJpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRfZW5jb2RlKCRoYXNoKSwKICAgICAgICAgICAgICAgICAgICApKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPmVuZENvbW1hbmRTdHJlYW0oKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUKICAgICAqIEBwYXJhbSBhcnJheSAkc2lnbmF0dXJlcwogICAgICogQHBhcmFtIG51bGwgJHJlYWRMZW5ndGgKICAgICAqIEByZXR1cm4gYXJyYXl8Ym9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2NhbkZpbGVGb3JNYWx3YXJlKCRmaWxlLCAkc2lnbmF0dXJlcywgJHJlYWRMZW5ndGggPSBudWxsKQogICAgewogICAgICAgICRmaCA9IEBmb3BlbigkZmlsZSwgJ3InKTsKICAgICAgICBpZiAoISRmaCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICR0b3RhbFJlYWQgPSAwOwogICAgICAgICRtYXhSZWFkTGVuZ3RoID0gaXNfaW50KCRyZWFkTGVuZ3RoKSAmJiAkcmVhZExlbmd0aCA+IDAgPyAkcmVhZExlbmd0aCA6IDUwICogMTAyNCAqIDEwMjQ7CiAgICAgICAgJG1hdGNoID0gZmFsc2U7CgogICAgICAgIHdoaWxlICghZmVvZigkZmgpKSB7CiAgICAgICAgICAgICRsZW5ndGggPSBtaW4oMSAqIDEwMjQgKiAxMDI0LCAkbWF4UmVhZExlbmd0aCk7CiAgICAgICAgICAgICRkYXRhID0gZnJlYWQoJGZoLCAkbGVuZ3RoKTsgLy8gcmVhZCAxIG1lZ3MgbWF4IHBlciBjaHVuawogICAgICAgICAgICAkYnl0ZXNSZWFkID0gR3Jhdml0eXNjYW5VdGlsczo6c3RybGVuKCRkYXRhKTsKICAgICAgICAgICAgJHRvdGFsUmVhZCArPSAkYnl0ZXNSZWFkOwogICAgICAgICAgICAkbWF4UmVhZExlbmd0aCAtPSAkYnl0ZXNSZWFkOwogICAgICAgICAgICBpZiAoJHRvdGFsUmVhZCA8IDEpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkc2lnbmF0dXJlcyBhcyAkcnVsZSkgewogICAgICAgICAgICAgICAgbGlzdCgka2V5LCAsICRzaWduYXR1cmUsICwgJHR5cGUpID0gJHJ1bGU7CiAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPT09ICdicm93c2VyJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy8oJyAuICRzaWduYXR1cmUgLiAnKS9pJywgJGRhdGEsICRtYXRjaGVzLCBQUkVHX09GRlNFVF9DQVBUVVJFKSkgewogICAgICAgICAgICAgICAgICAgICRtYXRjaFN0cmluZyA9ICRtYXRjaGVzWzFdWzBdOwogICAgICAgICAgICAgICAgICAgICRtYXRjaE9mZnNldCA9ICRtYXRjaGVzWzFdWzFdOwogICAgICAgICAgICAgICAgICAgICRiZWZvcmVTdHJpbmcgPSBHcmF2aXR5c2NhblV0aWxzOjpzdWJzdHIoJGRhdGEsIG1heCgwLCAkbWF0Y2hPZmZzZXQgLSAxMDApLCAkbWF0Y2hPZmZzZXQgLSBtYXgoMCwgJG1hdGNoT2Zmc2V0IC0gMTAwKSk7CiAgICAgICAgICAgICAgICAgICAgJGFmdGVyU3RyaW5nID0gR3Jhdml0eXNjYW5VdGlsczo6c3Vic3RyKCRkYXRhLCAkbWF0Y2hPZmZzZXQgKyBHcmF2aXR5c2NhblV0aWxzOjpzdHJsZW4oJG1hdGNoU3RyaW5nKSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAkbWF0Y2ggPSBhcnJheSgka2V5LCAkbWF0Y2hTdHJpbmcsICRiZWZvcmVTdHJpbmcsICRhZnRlclN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbWF4UmVhZExlbmd0aCA8PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJG1hdGNoKSB7CiAgICAgICAgICAgIGZzZWVrKCRmaCwgMCwgU0VFS19TRVQpOwoKICAgICAgICAgICAgJHNoYTI1NkNvbnRleHQgPSBoYXNoX2luaXQoJ3NoYTI1NicpOwogICAgICAgICAgICB3aGlsZSAoIWZlb2YoJGZoKSkgewogICAgICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkZmgsIDY1NTM2KTsKICAgICAgICAgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhc2hfdXBkYXRlKCRzaGEyNTZDb250ZXh0LCBzdHJfcmVwbGFjZShhcnJheSgiXG4iLCAiXHIiLCAiXHQiLCAiICIpLCAiIiwgJGRhdGEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbWF0Y2hbXSA9IGhhc2hfZmluYWwoJHNoYTI1NkNvbnRleHQsIHRydWUpOwogICAgICAgIH0KICAgICAgICBmY2xvc2UoJGZoKTsKICAgICAgICByZXR1cm4gJG1hdGNoOwogICAgfQp9IjtzOjQ4OiJjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZC5waHAiO3M6MzIwNToiPD9waHAKCmNsYXNzIEdyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZCBleHRlbmRzIEdyYXZpdHlzY2FuQ29tbWFuZAp7CgogICAgcHJpdmF0ZSAkcGlwZXM7CgogICAgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKQogICAgewogICAgICAgICRjb21tYW5kcyA9ICR0aGlzLT5nZXRBcmdzKCk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkY29tbWFuZHMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbY29tbWFuZHNdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRpbmRleCA9PiAkY29tbWFuZEFycmF5KSB7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGNvbW1hbmRBcnJheSkgfHwgIWlzc2V0KCRjb21tYW5kQXJyYXlbJ2NvbW1hbmQnXSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignSW52YWxpZCBbY29tbWFuZHNdIGFyZ3VtZW50IHN1cHBsaWVkJywgNDIyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY29tbWFuZE5hbWUgPSAkY29tbWFuZEFycmF5Wydjb21tYW5kJ107CiAgICAgICAgICAgICRjb21tYW5kQ2xhc3MgPSAnR3Jhdml0eXNjYW4nIC4gJGNvbW1hbmROYW1lIC4gJ0NvbW1hbmQnOwoKICAgICAgICAgICAgaWYgKCFjbGFzc19leGlzdHMoJGNvbW1hbmRDbGFzcykpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignQ29tbWFuZCAnIC4gJGNvbW1hbmROYW1lIC4gJyBub3QgZm91bmQuJywgNDIyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY29tbWFuZHNbJGluZGV4XVsnY2xhc3MnXSA9ICRjb21tYW5kQ2xhc3M7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cGlwZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRjb21tYW5kcyBhcyAkY29tbWFuZEFycmF5KSB7CiAgICAgICAgICAgIC8vICRjb21tYW5kID0gJGNvbW1hbmRBcnJheVsnY29tbWFuZCddOwogICAgICAgICAgICAkYXJncyA9IGlzc2V0KCRjb21tYW5kQXJyYXlbJ2FyZ3MnXSkgJiYgaXNfYXJyYXkoJGNvbW1hbmRBcnJheVsnYXJncyddKSA/ICRjb21tYW5kQXJyYXlbJ2FyZ3MnXSA6IGFycmF5KCk7CiAgICAgICAgICAgICRwaXBlID0gaXNzZXQoJGNvbW1hbmRBcnJheVsncGlwZSddKSAmJiBpc19zdHJpbmcoJGNvbW1hbmRBcnJheVsncGlwZSddKSA/ICRjb21tYW5kQXJyYXlbJ3BpcGUnXSA6IG51bGw7CiAgICAgICAgICAgICRjb21tYW5kQ2xhc3MgPSAkY29tbWFuZEFycmF5WydjbGFzcyddOwoKICAgICAgICAgICAgaWYgKCRwaXBlKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSAkdGhpcy0+cGlwZXNbJHBpcGVdID0gbmV3IEdyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZFJlc3BvbnNlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSAkdGhpcy0+Z2V0UmVzcG9uc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqIEB2YXIgR3Jhdml0eXNjYW5Db21tYW5kICRjb21tYW5kICovCiAgICAgICAgICAgICRjb21tYW5kID0gbmV3ICRjb21tYW5kQ2xhc3MoJHRoaXMtPmdldEFnZW50KCkpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGNvbW1hbmQtPmdldFBpcGVkQXJndW1lbnRzKCkgYXMgJHBpcGVkQXJndW1lbnQpIHsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYXJnc1skcGlwZWRBcmd1bWVudF0pICYmCiAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nKCRhcmdzWyRwaXBlZEFyZ3VtZW50XSkgJiYKICAgICAgICAgICAgICAgICAgICBzdHJwb3MoJGFyZ3NbJHBpcGVkQXJndW1lbnRdLCAnQCcpID09PSAwCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAkcGlwZWRBcmd1bWVudE5hbWUgPSBzdWJzdHIoJGFyZ3NbJHBpcGVkQXJndW1lbnRdLCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnBpcGVzWyRwaXBlZEFyZ3VtZW50TmFtZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhcmdzWyRwaXBlZEFyZ3VtZW50XSA9ICR0aGlzLT5waXBlc1skcGlwZWRBcmd1bWVudE5hbWVdLT5nZXRSZXNwb25zZUFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiogQHZhciBHcmF2aXR5c2NhbkNvbW1hbmQgJGNvbW1hbmQgKi8KICAgICAgICAgICAgJHJlc3VsdCA9ICRjb21tYW5kLT5zZXRBcmdzKCRhcmdzKQogICAgICAgICAgICAgICAgLT5zZXRSZXF1ZXN0KCR0aGlzLT5nZXRSZXF1ZXN0KCkpCiAgICAgICAgICAgICAgICAtPnNldFJlc3BvbnNlKCRyZXNwb25zZSkKICAgICAgICAgICAgICAgIC0+ZXhlY3V0ZSgpOwoKICAgICAgICAgICAgaWYgKCRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICRjb21tYW5kLT5zdGFydENvbW1hbmRTdHJlYW0oKQogICAgICAgICAgICAgICAgICAgIC0+d3JpdGVDb21tYW5kU3RyZWFtKCRyZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgLT5lbmRDb21tYW5kU3RyZWFtKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmNsYXNzIEdyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZFJlc3BvbnNlIGV4dGVuZHMgR3Jhdml0eXNjYW5SZXNwb25zZQp7CiAgICBwcml2YXRlICRyZXNwb25zZUFycmF5OwoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VuZFN0cmVhbU1lc3NhZ2UoJG1lc3NhZ2UpCiAgICB7CiAgICAgICAgJHRoaXMtPnNlbmRIZWFkZXJzKCk7CiAgICAgICAgZWNobyAkbWVzc2FnZSAuICJceDAwIjsKICAgICAgICBmbHVzaCgpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXlxcZCs6LycsICRtZXNzYWdlKSkgewogICAgICAgICAgICBsaXN0KCwgJG1lc3NhZ2UpID0gZXhwbG9kZSgnOicsICRtZXNzYWdlLCAyKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnJlc3BvbnNlQXJyYXlbXSA9ICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VBcnJheSgpCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X3NsaWNlKCR0aGlzLT5yZXNwb25zZUFycmF5LCAxLCAtMSk7CiAgICB9CgoKfSI7czozOToiY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkNvbW1hbmQucGhwIjtzOjQ3Mjg6Ijw/cGhwCgphYnN0cmFjdCBjbGFzcyBHcmF2aXR5c2NhbkNvbW1hbmQKewogICAgLyoqIEB2YXIgR3Jhdml0eXNjYW5BZ2VudCAqLwogICAgcHJpdmF0ZSAkYWdlbnQ7CgogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoKTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJpdmF0ZSAkYXJnczsKCiAgICBwcml2YXRlICRyZXF1ZXN0OwogICAgLyoqCiAgICAgKiBAdmFyIEdyYXZpdHlzY2FuUmVzcG9uc2UKICAgICAqLwogICAgcHJpdmF0ZSAkcmVzcG9uc2U7CgogICAgcHJpdmF0ZSAkc3RyZWFtQm91bmRhcnk7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gR3Jhdml0eXNjYW5BZ2VudCAkYWdlbnQKICAgICAqIEBwYXJhbSBhcnJheSAkYXJncwogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVxdWVzdCAkcmVxdWVzdAogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVzcG9uc2UgJHJlc3BvbnNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYWdlbnQsICRhcmdzID0gbnVsbCwgJHJlcXVlc3QgPSBudWxsLCAkcmVzcG9uc2UgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5hZ2VudCA9ICRhZ2VudDsKICAgICAgICAkdGhpcy0+YXJncyA9ICRhcmdzOwogICAgICAgICR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7CiAgICAgICAgJHRoaXMtPnJlc3BvbnNlID0gJHJlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhcmd1bWVudCBwYXJhbXMgdGhhdCBjYW4gYmUgcGlwZWQgaW4gYSBtdWx0aWNhbGwgcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQaXBlZEFyZ3VtZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQ29tbWFuZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3RhcnRDb21tYW5kU3RyZWFtKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbSgnY21kX3N0YXJ0OicgLiAkdGhpcy0+Z2V0Q29tbWFuZE5hbWUoKSAuICc6JyAuICR0aGlzLT5nZXRTdHJlYW1Cb3VuZGFyeSgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqIEByZXR1cm4gJHRoaXMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29tbWFuZFN0cmVhbSgkbWVzc2FnZSkKICAgIHsKICAgICAgICAkdGhpcy0+Z2V0UmVzcG9uc2UoKS0+c2VuZFN0cmVhbU1lc3NhZ2UoJG1lc3NhZ2UpOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5Db21tYW5kCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmRDb21tYW5kU3RyZWFtKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29tbWFuZFN0cmVhbSgnY21kX2VuZDonIC4gJHRoaXMtPmdldENvbW1hbmROYW1lKCkgLiAnOicgLiAkdGhpcy0+Z2V0U3RyZWFtQm91bmRhcnkoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZE5hbWUoKQogICAgewogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXkdyYXZpdHlzY2FuKC4qPylDb21tYW5kJC9pJywgZ2V0X2NsYXNzKCR0aGlzKSwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWF0Y2hlc1sxXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW1Cb3VuZGFyeSgpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+c3RyZWFtQm91bmRhcnkpIHsKICAgICAgICAgICAgJHRoaXMtPnN0cmVhbUJvdW5kYXJ5ID0gR3Jhdml0eXNjYW5VdGlsczo6Z2V0UmFuZG9tU3RyaW5nKDMyLCAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5zdHJlYW1Cb3VuZGFyeTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKiBAdGhyb3dzIEdyYXZpdHlzY2FuRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUZpbGUoJGZpbGUpCiAgICB7CiAgICAgICAgJGZpbGUgPSAkdGhpcy0+Z2V0UmVxdWVzdCgpLT5nZXREb2N1bWVudFJvb3QoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZmlsZSwgJy9cXCcpOwogICAgICAgIGlmICghaXNfZGlyKCRmaWxlKSAmJiAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXZpdHlzY2FuRXhjZXB0aW9uKCdGaWxlIGlzIG5vdCByZWFkYWJsZS4nLCA0MjIpOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHJlYWxwYXRoKCRmaWxlKTsKICAgICAgICBpZiAoISRmaWxlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHcmF2aXR5c2NhbkV4Y2VwdGlvbignRXJyb3IgcmVzb2x2aW5nIGNhbm9uaWNhbGl6ZWQgYWJzb2x1dGUgcGF0aG5hbWUgZm9yICcgLiAkZmlsZSAuICcuJywgNDIyKTsKICAgICAgICB9Ci8vICAgICAgICBpZiAoc3RycG9zKCRmaWxlLCAkdGhpcy0+Z2V0UmVxdWVzdCgpLT5nZXREb2N1bWVudFJvb3QoKSkgIT09IDApIHsKLy8gICAgICAgICAgICB0aHJvdyBuZXcgR3Jhdml0eXNjYW5FeGNlcHRpb24oJ0ZpbGUgaXMgb3V0c2lkZSB0aGUgZG9jdW1lbnQgcm9vdC4nLCA0MjIpOwovLyAgICAgICAgfQogICAgICAgIHJldHVybiAkZmlsZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheSAkYXJncwogICAgICogQHJldHVybiBHcmF2aXR5c2NhbkNvbW1hbmQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEFyZ3MoJGFyZ3MpCiAgICB7CiAgICAgICAgJHRoaXMtPmFyZ3MgPSAkYXJnczsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmdzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFyZ3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gbnVsbCAkZGVmYXVsdAogICAgICogQHJldHVybiBtaXhlZHxudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmcoJG5hbWUsICRkZWZhdWx0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHRoaXMtPmFyZ3MpICYmIGFycmF5X2tleV9leGlzdHMoJG5hbWUsICR0aGlzLT5hcmdzKSkgewogICAgICAgICAgICAkc2Vzc2lvblByZWZpeCA9ICckbG9jYWxTdG9yYWdlLic7CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHRoaXMtPmFyZ3NbJG5hbWVdKSAmJiBzdHJwb3MoJHRoaXMtPmFyZ3NbJG5hbWVdLCAkc2Vzc2lvblByZWZpeCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkc2Vzc2lvbktleSA9IHN1YnN0cigkdGhpcy0+YXJnc1skbmFtZV0sIHN0cmxlbigkc2Vzc2lvblByZWZpeCkpOwogICAgICAgICAgICAgICAgJHN0b3JhZ2UgPSAkdGhpcy0+Z2V0QWdlbnQoKS0+Z2V0TG9jYWxTdG9yYWdlKCk7CiAgICAgICAgICAgICAgICBpZiAoJHN0b3JhZ2UtPmhhcygkc2Vzc2lvbktleSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHN0b3JhZ2UtPmdldCgkc2Vzc2lvbktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hcmdzWyRuYW1lXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVxdWVzdCAkcmVxdWVzdAogICAgICogQHJldHVybiBHcmF2aXR5c2NhbkNvbW1hbmQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFJlcXVlc3QoJHJlcXVlc3QpCiAgICB7CiAgICAgICAgJHRoaXMtPnJlcXVlc3QgPSAkcmVxdWVzdDsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVxdWVzdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWVzdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZXF1ZXN0OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIEdyYXZpdHlzY2FuUmVzcG9uc2UgJHJlc3BvbnNlCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuQ29tbWFuZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVzcG9uc2UoJHJlc3BvbnNlKQogICAgewogICAgICAgICR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVzcG9uc2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFJlc3BvbnNlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBHcmF2aXR5c2NhbkFnZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBZ2VudCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZ2VudDsKICAgIH0KfSI7czozMDoiY2xhc3Nlcy9HcmF2aXR5c2NhblJlcXVlc3QucGhwIjtzOjIzMTE6Ijw/cGhwCgpjbGFzcyBHcmF2aXR5c2NhblJlcXVlc3QKewogICAgcHJpdmF0ZSAkYm9keTsKICAgIHByaXZhdGUgJGhlYWRlcnM7CiAgICBwcml2YXRlICRtZXRob2Q7CiAgICBwcml2YXRlICRkb2N1bWVudFJvb3Q7CgogICAgLyoqCiAgICAgKgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21HbG9iYWxzKCkKICAgIHsKICAgICAgICAkcmVxdWVzdCA9IG5ldyBzZWxmKCk7CiAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRfU0VSVkVSIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGtleSwgJ0hUVFBfJykgPT09IDApIHsKICAgICAgICAgICAgICAgICRoZWFkZXIgPSBzdHJfcmVwbGFjZSgnICcsICctJywgdWN3b3JkcyhzdHJfcmVwbGFjZSgnXycsICcgJywgc3RydG9sb3dlcihzdWJzdHIoJGtleSwgNSkpKSkpOwogICAgICAgICAgICAgICAgJGhlYWRlcnNbJGhlYWRlcl0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHJlcXVlc3QtPnNldEhlYWRlcnMoJGhlYWRlcnMpCiAgICAgICAgICAgIC0+c2V0Qm9keShmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKSkKICAgICAgICAgICAgLT5zZXRNZXRob2QoaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pID8gJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gOiAnR0VUJykKICAgICAgICAgICAgLT5zZXREb2N1bWVudFJvb3QoaXNzZXQoJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSkgPyByZWFscGF0aCgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddKSA6IEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEgpOwoKICAgICAgICByZXR1cm4gJHJlcXVlc3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGJvZHkKICAgICAqIEByZXR1cm4gR3Jhdml0eXNjYW5SZXF1ZXN0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCb2R5KCRib2R5KQogICAgewogICAgICAgICR0aGlzLT5ib2R5ID0gJGJvZHk7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9keSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5ib2R5OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG1peGVkICRoZWFkZXJzCiAgICAgKiBAcmV0dXJuIEdyYXZpdHlzY2FuUmVxdWVzdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVycygkaGVhZGVycykKICAgIHsKICAgICAgICAkdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcnMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aGVhZGVyczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAkaGVhZGVyCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXIoJGhlYWRlcikKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXlfa2V5X2V4aXN0cygkaGVhZGVyLCAkdGhpcy0+aGVhZGVycykgPyAkdGhpcy0+aGVhZGVyc1skaGVhZGVyXSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG1ldGhvZAogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlcXVlc3QKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE1ldGhvZCgkbWV0aG9kKQogICAgewogICAgICAgICR0aGlzLT5tZXRob2QgPSAkbWV0aG9kOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1ldGhvZCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5tZXRob2Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGRvY3VtZW50Um9vdAogICAgICogQHJldHVybiBHcmF2aXR5c2NhblJlcXVlc3QKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldERvY3VtZW50Um9vdCgkZG9jdW1lbnRSb290KQogICAgewogICAgICAgICR0aGlzLT5kb2N1bWVudFJvb3QgPSAkZG9jdW1lbnRSb290OwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERvY3VtZW50Um9vdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kb2N1bWVudFJvb3Q7CiAgICB9Cn0iO3M6MTU6ImRpYWdub3N0aWNzLnBocCI7czo2NDAwOiI8P3BocCBvYl9zdGFydCgpOyA/Pgo8IURPQ1RZUEUgaHRtbD4KPGh0bWw+CjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJpZT1lZGdlIj4KICAgIDxNRVRBIE5BTUU9IlJPQk9UUyIgQ09OVEVOVD0iTk9JTkRFWCwgTk9GT0xMT1ciPgoKICAgIDx0aXRsZT5HcmF2aXR5c2NhbiBBY2NlbGVyYXRvcjwvdGl0bGU+CgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICBib2R5IHsKICAgICAgICAgICAgd2lkdGg6IDQyZW07CiAgICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICAgICAgZm9udC1zaXplOiAxZW07CiAgICAgICAgfQoKICAgICAgICBoMSB7CiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wNGVtOwogICAgICAgICAgICBtYXJnaW46IDFlbSAwcHggLjVlbTsKICAgICAgICB9CgogICAgICAgIGgxICsgcCB7CiAgICAgICAgICAgIG1hcmdpbjogMCAwIDJlbTsKICAgICAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgfQoKICAgICAgICBjb2RlIHsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IG1vbmFjbywgbW9ub3NwYWNlOwogICAgICAgIH0KCiAgICAgICAgYSB7CiAgICAgICAgICAgIGNvbG9yOiAjMWU2ZmMwOwogICAgICAgIH0KCiAgICAgICAgYTpob3ZlciB7CiAgICAgICAgICAgIGNvbG9yOiAjMjY5NWZmOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgewogICAgICAgICAgICBtYXJnaW46IDAuOGVtIDBweDsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjVlbTsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIGRpdi5wYXNzLAogICAgICAgICNyZXN1bHRzIGRpdi53YXJuLAogICAgICAgICNyZXN1bHRzIGRpdi5mYWlsIHsKICAgICAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgICAgIG1hcmdpbjogMjBweCAwcHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAjcmVzdWx0cyBkaXYucGFzcyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxOTE7CgogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgZGl2LmZhaWwgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjOTExOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgZGl2Lndhcm4gewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTU5YzAwOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgewogICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgbWFyZ2luOiAyMHB4IDBweDsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIHRhYmxlIHRoLAogICAgICAgICNyZXN1bHRzIHRhYmxlIHRkIHsKICAgICAgICAgICAgcGFkZGluZzogMC40ZW07CiAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjOWM5Yzk7CiAgICAgICAgfQoKICAgICAgICAjcmVzdWx0cyB0YWJsZSB0aCB7CiAgICAgICAgICAgIHdpZHRoOiAxMmVtOwogICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGhlYWQgdGggewogICAgICAgICAgICBib3JkZXItY29sb3I6ICMzMzMzMzM7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7CiAgICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIHRhYmxlLmVycm9ycyB0aGVhZCB0aCB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM5MTE7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogIzkxMTsKICAgICAgICB9CgogICAgICAgICNyZXN1bHRzIHRhYmxlLndhcm5pbmdzIHRoZWFkIHRoIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1OWMwMDsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjZTU5YzAwOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZWVlOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGQucGFzcyB7CiAgICAgICAgICAgIGNvbG9yOiAjMTkxOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGQuZmFpbCB7CiAgICAgICAgICAgIGNvbG9yOiAjOTExOwogICAgICAgIH0KCiAgICAgICAgI3Jlc3VsdHMgdGFibGUgdGQud2FybiB7CiAgICAgICAgICAgIGNvbG9yOiAjYjk4MjJhOwogICAgICAgIH0KCiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPkdyYXZpdHlzY2FuIEFjY2VsZXJhdG9yIERpYWdub3N0aWNzPC9oMT4KCjxwPllvdSBhcmUgY3VycmVudGx5IHJ1bm5pbmcgR3Jhdml0eXNjYW4gQWNjZWxlcmF0b3IgdmVyc2lvbiA8c3Ryb25nPjw/cGhwIGVjaG8gR1JBVklUWVNDQU5fQUdFTlRfVkVSU0lPTiA/Pjwvc3Ryb25nPi4KPC9wPgoKPD9waHAKJGNvbXBhdGliaWxpdHlDaGVja3MgPSBhcnJheSgKICAgIGFycmF5KAogICAgICAgICd0ZXN0JyAgPT4gdmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4zLjMnLCAnPj0nKSwKICAgICAgICAndGl0bGUnID0+ICdQSFAgVmVyc2lvbicsCiAgICAgICAgJ2Vycm9yJyA9PiAnR3Jhdml0eXNjYW4gQWNjZWxlcmF0b3IgcmVxdWlyZXMgUEhQIDUuMy4zIG9yIG5ld2VyLCB0aGlzIHZlcnNpb24gaXMgJyAuIFBIUF9WRVJTSU9OIC4gJy4nLAogICAgKSwKICAgIGFycmF5KAogICAgICAgICd0ZXN0JyAgPT4gZnVuY3Rpb25fZXhpc3RzKCdvcGVuc3NsX3ZlcmlmeScpLAogICAgICAgICd0aXRsZScgPT4gJ09wZW5TU0wnLAogICAgICAgICdlcnJvcicgPT4gJ1BIUCA8YSBocmVmPSJodHRwOi8vd3d3LnBocC5uZXQvb3BlbnNzbCI+T3BlblNTTDwvYT4gaXMgZWl0aGVyIG5vdCBsb2FkZWQgb3Igbm90IGNvbXBpbGVkIGluLicsCiAgICApLAogICAgYXJyYXkoCiAgICAgICAgJ3Rlc3QnICA9PiBAcHJlZ19tYXRjaCgnL14uJC91JywgJ8OxJyksCiAgICAgICAgJ3RpdGxlJyA9PiAnUENSRSBVVEYtOCcsCiAgICAgICAgJ2Vycm9yJyA9PiAnPGEgaHJlZj0iaHR0cDovL3BocC5uZXQvcGNyZSI+UENSRTwvYT4gaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggVVRGLTggc3VwcG9ydC4nLAogICAgKSwKICAgIGFycmF5KAogICAgICAgICd0ZXN0JyAgPT4gQHByZWdfbWF0Y2goJy9eXHBMJC91JywgJ8OxJyksCiAgICAgICAgJ3RpdGxlJyA9PiAnUENSRSBVVEYtOCcsCiAgICAgICAgJ2Vycm9yJyA9PiAnPGEgaHJlZj0iaHR0cDovL3BocC5uZXQvcGNyZSI+UENSRTwvYT4gaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggVW5pY29kZSBwcm9wZXJ0eSBzdXBwb3J0LicsCiAgICApLAogICAgYXJyYXkoCiAgICAgICAgJ3Rlc3QnICA9PiAhZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSB8fCAhKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIE1CX09WRVJMT0FEX1NUUklORyksCiAgICAgICAgJ3RpdGxlJyA9PiAnTWJzdHJpbmcgT3ZlcmxvYWRlZCcsCiAgICAgICAgJ2Vycm9yJyA9PiAnVGhlIDxhIGhyZWY9Imh0dHA6Ly9waHAubmV0L21ic3RyaW5nIj5tYnN0cmluZzwvYT4gZXh0ZW5zaW9uIGlzIG92ZXJsb2FkaW5nIFBIUFwncyBuYXRpdmUgc3RyaW5nIGZ1bmN0aW9ucy4nLAogICAgKSwKKTsKCiR3YXJuaW5nQ2hlY2tzID0gYXJyYXkoCiAgICBhcnJheSgKICAgICAgICAndGVzdCcgID0+IEdSQVZJVFlTQ0FOX0FHRU5UX0lTX1dSSVRBQkxFLAogICAgICAgICd0aXRsZScgPT4gJ0FjY2VsZXJhdG9yIEZpbGUgUGVybWlzc2lvbnMnLAogICAgICAgICdlcnJvcicgPT4gJ1RoZSBBY2NlbGVyYXRvciBmaWxlIGlzIG5vdCB3cml0YWJsZS4gQXV0b21hdGljIHVwZGF0ZXMgYXJlIGRpc2FibGVkLicsCiAgICApLAopOwoKJGZhaWxlZCA9IGZhbHNlOwokZXJyb3JzID0gYXJyYXkoKTsKZm9yZWFjaCAoJGNvbXBhdGliaWxpdHlDaGVja3MgYXMgJGNoZWNrKSB7CiAgICBpZiAoISRjaGVja1sndGVzdCddKSB7CiAgICAgICAgJGZhaWxlZCA9IHRydWU7CiAgICAgICAgJGVycm9yc1tdID0gJGNoZWNrOwogICAgfQp9Cgokd2FybmluZyA9IGZhbHNlOwokd2FybmluZ3MgPSBhcnJheSgpOwpmb3JlYWNoICgkd2FybmluZ0NoZWNrcyBhcyAkY2hlY2spIHsKICAgIGlmICghJGNoZWNrWyd0ZXN0J10pIHsKICAgICAgICAkd2FybmluZyA9IHRydWU7CiAgICAgICAgJHdhcm5pbmdzW10gPSAkY2hlY2s7CiAgICB9Cn0KCj8+Cgo8ZGl2IGlkPSJyZXN1bHRzIj4KICAgIDw/cGhwIGlmICgkZmFpbGVkIHx8ICR3YXJuaW5nKTogPz4KICAgICAgICA8P3BocCBpZiAoJGZhaWxlZCk6ID8+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZhaWwiPgogICAgICAgICAgICAgICAg4pyYIEdyYXZpdHlzY2FuIEFjY2VsZXJhdG9yIG1heSBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCB5b3VyIGVudmlyb25tZW50LgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8P3BocCBlbHNlOiA/PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuIj4KICAgICAgICAgICAgICAgICg8c3Ryb25nPiE8L3N0cm9uZz4pIEdyYXZpdHlzY2FuIEFjY2VsZXJhdG9yIHdpbGwgZnVuY3Rpb24gY29ycmVjdGx5LCBidXQgc29tZSBvcHRpb25hbCBmZWF0dXJlcyBtYXkgYmUKICAgICAgICAgICAgICAgIGRpc2FibGVkLgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8P3BocCBlbmRpZiA/PgogICAgICAgIDw/cGhwIGlmICgkZmFpbGVkKTogPz4KICAgICAgICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9ImVycm9ycyI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjIiPkVycm9yczo8L3RoPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICA8P3BocCBmb3JlYWNoICgkZXJyb3JzIGFzICRlcnJvcik6ID8+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyAkZXJyb3JbJ3RpdGxlJ10gPz48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZhaWwiPjw/cGhwIGVjaG8gJGVycm9yWydlcnJvciddID8+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPD9waHAgZW5kZm9yZWFjaCA/PgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8P3BocCBlbmRpZiA/PgogICAgICAgIDw/cGhwIGlmICgkd2FybmluZyk6ID8+CiAgICAgICAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJ3YXJuaW5ncyI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjIiPldhcm5pbmdzOjwvdGg+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCR3YXJuaW5ncyBhcyAkZXJyb3IpOiA/PgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gJGVycm9yWyd0aXRsZSddID8+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ3YXJuIj48P3BocCBlY2hvICRlcnJvclsnZXJyb3InXSA/PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDw/cGhwIGVuZGZvcmVhY2ggPz4KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPD9waHAgZW5kaWYgPz4KCiAgICA8P3BocCBlbHNlOiA/PgogICAgICAgIDxkaXYgY2xhc3M9InBhc3MiPuKclCBZb3VyIGVudmlyb25tZW50IHBhc3NlZCBhbGwgcmVxdWlyZW1lbnRzLjwvZGl2PgogICAgPD9waHAgZW5kaWYgPz4KPC9kaXY+Cgo8aDE+UHVibGljIEtleTwvaDE+Cgo8cHJlPjw/cGhwIGVjaG8gZ3NDb25maWcoJ3B1YmxpY19rZXknKSA/PjwvcHJlPgoKPC9ib2R5Pgo8L2h0bWw+Cjw/cGhwIHJldHVybiBvYl9nZXRfY2xlYW4oKTsgPz4KIjtzOjg6ImluaXQucGhwIjtzOjIxNzc6Ijw/cGhwCgpkZWZpbmUoJ0dSQVZJVFlTQ0FOX0FHRU5UX1ZFUlNJT04nLCAnMC4wLjcnKTsKIWRlZmluZWQoJ0dSQVZJVFlTQ0FOX0FHRU5UX0ZJTEUnKSAmJiBkZWZpbmUoJ0dSQVZJVFlTQ0FOX0FHRU5UX0ZJTEUnLCBfX0ZJTEVfXyk7CiFkZWZpbmVkKCdHUkFWSVRZU0NBTl9BR0VOVF9JU19XUklUQUJMRScpICYmIGRlZmluZSgnR1JBVklUWVNDQU5fQUdFTlRfSVNfV1JJVEFCTEUnLCBpc193cml0YWJsZShfX0ZJTEVfXykpOwpkZWZpbmUoJ0dSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEgnLCBkaXJuYW1lKF9fRklMRV9fKSk7CmRlZmluZSgnR1JBVklUWVNDQU5fQUdFTlRfQ0xBU1NfUEFUSCcsIEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEggLiAnL2NsYXNzZXMnKTsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdnc0luY2x1ZGVGaWxlJykpIHsKICAgIGZ1bmN0aW9uIGdzSW5jbHVkZUZpbGUoJGZpbGUsICRvbmNlID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCRvbmNlKSB7CiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlX29uY2UgR1JBVklUWVNDQU5fQUdFTlRfRkNfUEFUSCAuICcvJyAuICRmaWxlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlIEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEggLiAnLycgLiAkZmlsZTsKICAgICAgICB9CiAgICB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dzUmVxdWlyZUZpbGUnKSkgewogICAgZnVuY3Rpb24gZ3NSZXF1aXJlRmlsZSgkZmlsZSwgJG9uY2UgPSB0cnVlKQogICAgewogICAgICAgIGlmICgkb25jZSkgewogICAgICAgICAgICByZXR1cm4gcmVxdWlyZV9vbmNlIEdSQVZJVFlTQ0FOX0FHRU5UX0ZDX1BBVEggLiAnLycgLiAkZmlsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcmVxdWlyZSBHUkFWSVRZU0NBTl9BR0VOVF9GQ19QQVRIIC4gJy8nIC4gJGZpbGU7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBnc0NvbmZpZygka2V5KQp7CiAgICBzdGF0aWMgJGNvbmZpZzsKICAgIGlmICghaXNzZXQoJGNvbmZpZykpIHsKICAgICAgICAkY29uZmlnID0gZ3NSZXF1aXJlRmlsZSgnY29uZmlnLnBocCcpOwogICAgfQogICAgcmV0dXJuIGFycmF5X2tleV9leGlzdHMoJGtleSwgJGNvbmZpZykgPyAkY29uZmlnWyRrZXldIDogbnVsbDsKfQoKCmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvR3Jhdml0eXNjYW5BZ2VudC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhbkFnZW50QXV0aC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhblJlcXVlc3QucGhwJyk7CmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvR3Jhdml0eXNjYW5SZXNwb25zZS5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhbkV4Y2VwdGlvbi5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9HcmF2aXR5c2NhblV0aWxzLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL0dyYXZpdHlzY2FuTG9jYWxTdG9yYWdlLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkluZm9Db21tYW5kLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuVXBkYXRlQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhblZlcnNpb25Db21tYW5kLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTGlzdERpcmVjdG9yaWVzQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2Nhbkxpc3RGaWxlc0NvbW1hbmQucGhwJyk7CmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5NYWx3YXJlU2NhbkNvbW1hbmQucGhwJyk7CmdzUmVxdWlyZUZpbGUoJ2NsYXNzZXMvY29tbWFuZHMvR3Jhdml0eXNjYW5QYXR0ZXJuTWF0Y2hDb21tYW5kLnBocCcpOwpnc1JlcXVpcmVGaWxlKCdjbGFzc2VzL2NvbW1hbmRzL0dyYXZpdHlzY2FuTXVsdGljYWxsQ29tbWFuZC5waHAnKTsKZ3NSZXF1aXJlRmlsZSgnY2xhc3Nlcy9jb21tYW5kcy9HcmF2aXR5c2NhbkxvY2FsU3RvcmFnZUNvbW1hbmQucGhwJyk7IjtzOjEwOiJjb25maWcucGhwIjtzOjk1ODoiPD9waHAKCnJldHVybiBhcnJheSAoCiAgJ3B1YmxpY19rZXknID0+ICctLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQThLbkwxcEhFbklNUWJxbXVEQ2pTCjhuS1BjalhWemJ0d0FiYzMya1FNd21ET3hVaWNJNjZGNlp1VDlzRW12K2l6SEo4UThjeHZRWFVVMnpZSHRnb1MKSVhIbk4rYVVSaFFQOGNSUFF3b2RWaURHZ1RmVitSMmI0VHlQTnJSbVZTQ2x0RmRkRUNyOFdoMVJzM3ZiNnV3SQpWd2dNWmhYK3BVNDF5Q0szL1FqSTlQRGZuVCtoQjN5QXBlanhZM2Z5RXdkQkp6d3RuTldxSlJhM05sUzdxcU02CkNoc3ZpL3ZsOWRYekUvNll3N2g0TFlUUE5TQW5aTFJ3K3ZpRU0yOEtYRE1sL3EwMkc0UFdQcUVseEtpc25ZWHoKbmZHbzAzelRTaXBUbmpZQkQ5MS9IbmIrK2QvTGlHc0hCc0I0OFp2dml0YUhIRDg0MCt3VVdBSFhCY2N0NExBWQpSemFHb0JNRFJUOHBJZUZ6M3ZMdkVFUlpmRk10ajZWZzFQU1BQZ0dQRzhCc0hQYXkrME9sQytZeXpwK3oyQVE1CmZnMnlIZ2ZraytqZmFEVFhxelBtcXJpbHpOWkhDTE5FRFZWU3ArVlZkQzF0VUlUTlNFQUgxcVp2MmtuaTJaNGMKS1VCaUd3SXN2MVZnRUdtdHJBS0dSZUtmMGw1OUdEWWZhcG4wWXpUbzM4UEpNbm84eTVMcHV4YnFDOFZWOFlhSQphYUNuL3dOZnovd0tPaTluQjdKbzQ2RjJ5R1RnRXVweng4OXgrWTIrSjQ5TmdtN0kvR1Y5RVVrOVhDYytrbTgzCnY5MlJwM0dyQ0swa0pDOFBVN3M4N3JWWHl3WjR0UXJqMjFaZ1FzVVFoaS9LcHRoYTFqSXN0RFdMNk5jTjhoeVMKS3A0VUJpSWs0ZVFMejUvdEE3ZGhheGtDQXdFQUFRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCicsCiAgJ3NpdGVfaWQnID0+IDcyNTM0LAogICd1cGRhdGVfYXBpX3VybCcgPT4gJ2h0dHBzOi8vd3d3LmdyYXZpdHlzY2FuLmNvbS9hcGkvc2l0ZXMvJWQvZG93bmxvYWQtYWdlbnQ/dG9rZW49JXMnLAopOyI7fQ=='));
Function Calls
| unserialize | 1 |
| base64_decode | 1 |
Stats
| MD5 | e485e5cb57b51fd7012f05523e6c7923 |
| Eval Count | 0 |
| Decode Time | 1319 ms |