{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-eslint\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\dataShare-fvue\\src\\utils.js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\utils.js","mtime":1733825817797},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-eslint\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5qb2luLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZG90LWFsbC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnN0aWNreS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50ZXN0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5zb21lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOwppbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlQm94LCBOb3RpZmljYXRpb24gfSBmcm9tICdlbGVtZW50LXVpJzsKdmFyIGNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZyA9IGZhbHNlOyAvL+aYr+WQpumakOiXj+aEn+WPueWPt+agoemqjOaPkOekugp2YXIgbm90aWZpY2F0aW9ucyA9IHt9OyAvL+eUqOadpeiOt+WPluW8ueeql+eahOWunuS+i++8jOS7peWvueWvueW6lOW8ueeql+i/m+ihjOaTjeS9nAp2YXIgdXRpbHMgPSB7CiAgLyoqDQogICAqIOmaj+acuueUn+aIkGlkDQogICAqLwogIHV1aWQ6IGZ1bmN0aW9uIHV1aWQoKSB7CiAgICB2YXIgaGFzSHlwaGVuID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTsKICAgIHJldHVybiAoaGFzSHlwaGVuID8gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcgOiAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnKS5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7CiAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDsKICAgICAgdmFyIHYgPSBjID09ICd4JyA/IHIgOiByICYgMHgzIHwgMHg4OwogICAgICByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICB9KTsKICB9LAogIGZpbmRDb21wb25lbnRVcHdhcmQ6IGZ1bmN0aW9uIGZpbmRDb21wb25lbnRVcHdhcmQoY29udGV4dCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXMpIHsKICAgIGlmICh0eXBlb2YgY29tcG9uZW50TmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgY29tcG9uZW50TmFtZXMgPSBbY29tcG9uZW50TmFtZV07CiAgICB9IGVsc2UgewogICAgICBjb21wb25lbnROYW1lcyA9IGNvbXBvbmVudE5hbWU7CiAgICB9CiAgICB2YXIgcGFyZW50ID0gY29udGV4dC4kcGFyZW50OwogICAgdmFyIG5hbWUgPSBwYXJlbnQuJG9wdGlvbnMubmFtZTsKICAgIHdoaWxlIChwYXJlbnQgJiYgKCFuYW1lIHx8IGNvbXBvbmVudE5hbWVzLmluZGV4T2YobmFtZSkgPCAwKSkgewogICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDsKICAgICAgaWYgKHBhcmVudCkgbmFtZSA9IHBhcmVudC4kb3B0aW9ucy5uYW1lOwogICAgfQogICAgcmV0dXJuIHBhcmVudDsKICB9LAogIGRlZXBDbG9uZTogZnVuY3Rpb24gKF9kZWVwQ2xvbmUpIHsKICAgIGZ1bmN0aW9uIGRlZXBDbG9uZShfeCkgewogICAgICByZXR1cm4gX2RlZXBDbG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogICAgZGVlcENsb25lLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gX2RlZXBDbG9uZS50b1N0cmluZygpOwogICAgfTsKICAgIHJldHVybiBkZWVwQ2xvbmU7CiAgfShmdW5jdGlvbiAoZGF0YSkgewogICAgdmFyIHR5cGUgPSBnZXRUeXBlKGRhdGEpOwogICAgdmFyIG9iajsKICAgIGlmICh0eXBlID09PSAnYXJyYXknKSB7CiAgICAgIG9iaiA9IFtdOwogICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JykgewogICAgICBvYmogPSB7fTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIOS4jeWGjeWFt+acieS4i+S4gOWxguasoQogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGlmICh0eXBlID09PSAnYXJyYXknKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgb2JqLnB1c2goZGVlcENsb25lKGRhdGFbaV0pKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JykgewogICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgIG9ialtrZXldID0gZGVlcENsb25lKGRhdGFba2V5XSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvYmo7CiAgfSksCiAgLyoqDQogICAqIOagueaNruWtl+WFuOe8lueggeiOt+WPluWtl+WFuOaVsOaNrg0KICAgKi8KICBnZXREaWN0SXRlbXNGcm9tQ2FjaGU6IGZ1bmN0aW9uIGdldERpY3RJdGVtc0Zyb21DYWNoZShkaWN0Q29kZSkgewogICAgaWYgKCFkaWN0Q29kZSkgewogICAgICByZXR1cm4gJ+Wtl+WFuENvZGXkuI3og73kuLrnqbohJzsKICAgIH0KICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdkaWN0X2RhdGEnKSkgewogICAgICB2YXIgZGljdF9kYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdkaWN0X2RhdGEnKSk7CiAgICAgIGlmIChkaWN0X2RhdGFbZGljdENvZGVdKSB7CiAgICAgICAgdmFyIGRpc3RJdGVtID0gZGljdF9kYXRhW2RpY3RDb2RlXTsKICAgICAgICByZXR1cm4gZGlzdEl0ZW07CiAgICAgIH0KICAgIH0KICB9LAogIC8v5qC55o2u5Lyg5YWl55qE5YC85ZKM5pWw57uE6L+b6KGM5q+U6L6D77yM55u4562J6L+U5Zue6K+l5pWw5o2u5Liq5p+Q5p2h5pWw5o2uCiAgaW5kZXhPZkxpc3Q6IGZ1bmN0aW9uIGluZGV4T2ZMaXN0KGxpc3QsIGtleSwgdmFsdWUpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICBpZiAobGlzdFtpXVtrZXldID09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGxpc3RbaV07CiAgICAgIH0KICAgIH0KICB9LAogIC8v5a2X6IqC5pWw6L2sS0LmiJbogIVNQgogIGJpZ0RlY2ltYWw6IGZ1bmN0aW9uIGJpZ0RlY2ltYWwoYnl0ZXMpIHsKICAgIHZhciByZXR1cm5WYWx1ZSA9IGJ5dGVzIC8gKDEwMjQgKiAxMDI0KTsKICAgIGlmIChyZXR1cm5WYWx1ZSA+IDEpIHsKICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRvRml4ZWQoMikgKyAnTSc7CiAgICB9IGVsc2UgewogICAgICByZXR1cm5WYWx1ZSA9IGJ5dGVzIC8gMTAyNDsKICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRvRml4ZWQoMCkgKyAnS0InOwogICAgfQogIH0sCiAgLy/ojrflj5bmjIflrprlrZfnrKblkI7pnaLmiYDmnInlrZfnrKYKICBzdWJzdHJpbmdUeXBlOiBmdW5jdGlvbiBzdWJzdHJpbmdUeXBlKHN0ciwgdHlwZSkgewogICAgdmFyIHJldHVyblZhbHVlID0gc3RyLnNwbGl0KCcuJyk7CiAgICByZXR1cm4gcmV0dXJuVmFsdWVbcmV0dXJuVmFsdWUubGVuZ3RoIC0gMV07CiAgfSwKICAvLyDojrflj5bpmo/mnLrnmoTlkI3np7AKICBnZXROYW1lOiBmdW5jdGlvbiBnZXROYW1lKCkgewogICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyKTsKICB9LAogIC8vIOiOt+WPluaOp+S7tuaYr+WQpuWPr+e8lui+kQogIGdldFdyaXRlYWJsZTogZnVuY3Rpb24gZ2V0V3JpdGVhYmxlKHBlcm1pc3Npb24pIHsKICAgIGlmIChwZXJtaXNzaW9uID09PSAndycgfHwgcGVybWlzc2lvbiA9PT0gJ2InKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0sCiAgLy8g6I635Y+W5o6n5Lu25piv5ZCm5re75Yqg5b+F5aGr5qCh6aqMCiAgYWRkUmVxdWlyZWRPck5vdDogZnVuY3Rpb24gYWRkUmVxdWlyZWRPck5vdChwZXJtaXNzaW9uLCB2YWxpZGF0ZSwgbGlua2FnZVZhbGlkYXRlLCBfdGhpcykgewogICAgLy/liKTmlq3mmK/lkKbmnInogZTliqjmoKHpqowKICAgIGlmIChsaW5rYWdlVmFsaWRhdGUubGVuZ3RoID4gMCkgewogICAgICBsaW5rYWdlVmFsaWRhdGUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgaWYgKGVsZSAmJiBlbGUudmFsaWRhdGUgJiYgJ2RhdGEuJyArIGVsZS50YXJnZXQgPT0gX3RoaXMuYXR0ZXIpIHsKICAgICAgICAgIHZhbGlkYXRlID0gZWxlLnZhbGlkYXRlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAocGVybWlzc2lvbiAhPT0gJ2InKSB7CiAgICAgIHJldHVybiB2YWxpZGF0ZTsKICAgIH0KICAgIC8v5aaC5p6c6KGo5Y2V5o6I5p2D5Li65p+Q5o6n5Lu25Yqg5LqG5b+F5aGr5YiZ5b+F5aGrCiAgICBpZiAocGVybWlzc2lvbiA9PT0gJ2InICYmIHZhbGlkYXRlICYmICF2YWxpZGF0ZS5yZXF1aXJlZCAmJiB2YWxpZGF0ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgICAgIHZhbGlkYXRlLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIGlmICh2YWxpZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRlID09PSBudWxsKSB7CiAgICAgIHZhbGlkYXRlID0gJ3JlcXVpcmVkJzsKICAgIH0gZWxzZSBpZiAodmFsaWRhdGUuY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICB2YXIgYXJ5ID0gdmFsaWRhdGUuc3BsaXQoJ3wnKTsKICAgICAgaWYgKCFhcnkuc29tZShmdW5jdGlvbiAoaXRlbSkgewogICAgICAgIHJldHVybiBpdGVtID09PSAncmVxdWlyZWQnOwogICAgICB9KSkgewogICAgICAgIGFyeS5zcGxpY2UoMCwgMCwgJ3JlcXVpcmVkJyk7CiAgICAgICAgdmFsaWRhdGUgPSBhcnkuam9pbignfCcpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHZhbGlkYXRlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKICAgICAgdmFsaWRhdGUgPSBPYmplY3QuYXNzaWduKHsKICAgICAgICByZXF1aXJlZDogdHJ1ZQogICAgICB9LCB2YWxpZGF0ZSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAndmFsaWRhdGXkuI3mmK/lhYHorrjnmoTnsbvlnosnOwogICAgfQogICAgcmV0dXJuIHZhbGlkYXRlOwogIH0sCiAgLy8g5qC85byP5YyW5pel5pyfCiAgZm9ybWF0RGF0ZTogZnVuY3Rpb24gZm9ybWF0RGF0ZSh2YWx1ZSkgewogICAgdmFyIGRhdGUgPSBudWxsOwogICAgaWYgKCF2YWx1ZSkgewogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PSBEYXRlICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpKSB7CiAgICAgIGRhdGUgPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gU3RyaW5nIHx8IHZhbHVlLmNvbnN0cnVjdG9yID09IE51bWJlcikgewogICAgICBkYXRlID0gbmV3IERhdGUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ+agvOW8j+WMluaXpeacn+aXtu+8jOS8oOWFpeeahOaVsOaNruagvOW8j+S4jeato+ehruOAgic7CiAgICB9CiAgICB2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIHZhciBNTSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7CiAgICBNTSA9IE1NIDwgMTAgPyAnMCcgKyBNTSA6IE1NOwogICAgdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKICAgIGQgPSBkIDwgMTAgPyAnMCcgKyBkIDogZDsKICAgIHZhciBoID0gZGF0ZS5nZXRIb3VycygpOwogICAgaCA9IGggPCAxMCA/ICcwJyArIGggOiBoOwogICAgdmFyIG0gPSBkYXRlLmdldE1pbnV0ZXMoKTsKICAgIG0gPSBtIDwgMTAgPyAnMCcgKyBtIDogbTsKICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKCk7CiAgICBzID0gcyA8IDEwID8gJzAnICsgcyA6IHM7CiAgICByZXR1cm4geSArICctJyArIE1NICsgJy0nICsgZCArICcgJyArIGggKyAnOicgKyBtICsgJzonICsgczsKICB9LAogIC8vIOagvOW8j+WMluaXpeacnwogIGZvcm1hdERhdGVZZWFyOiBmdW5jdGlvbiBmb3JtYXREYXRlWWVhcih2YWx1ZSkgewogICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7CiAgICB2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIHZhciBNTSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7CiAgICBNTSA9IE1NIDwgMTAgPyAnMCcgKyBNTSA6IE1NOwogICAgdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKICAgIGQgPSBkIDwgMTAgPyAnMCcgKyBkIDogZDsKICAgIHJldHVybiB5ICsgJy0nICsgTU0gKyAnLScgKyBkOwogIH0sCiAgLy8g5q+U6L6DMuS4quaXpeacnwogIGRheXNCZXR3ZWVuOiBmdW5jdGlvbiBkYXlzQmV0d2VlbihEYXRlT25lLCBEYXRlVHdvLCBub3RTdXBwb3J0RXF1YWxzKSB7CiAgICBpZiAoIURhdGVPbmUgfHwgIURhdGVUd28pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIgZGF0ZTEgPSBuZXcgRGF0ZShEYXRlT25lKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoJ3l5eXktTU0tZGQnKSArICcgJyArIERhdGVPbmUpLmdldFRpbWUoKTsKICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKERhdGVUd28pLmdldFRpbWUoKSB8fCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmZvcm1hdCgneXl5eS1NTS1kZCcpICsgJyAnICsgRGF0ZVR3bykuZ2V0VGltZSgpOwogICAgaWYgKG5vdFN1cHBvcnRFcXVhbHMpIHsKICAgICAgLy/lpKfkuo7jgIJ2Mj52MSDjgIIKICAgICAgaWYgKGRhdGUyID4gZGF0ZTEpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8v5aSn5LqO562J5LqO44CCdjI+PXYxIOOAguWPquimgXYx5LiN5aSn5LqOdjLljbPlj68KICAgICAgaWYgKGRhdGUxID4gZGF0ZTIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICB9LAogIGRhdGVDYWxjOiBmdW5jdGlvbiBkYXRlQ2FsYyhzdGFydERhdGUsIGVuZERhdGUsIG9wKSB7CiAgICBpZiAoIXN0YXJ0RGF0ZSB8fCAhZW5kRGF0ZSB8fCBzdGFydERhdGUubGVuZ3RoID09IDAgfHwgZW5kRGF0ZS5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChvcC5sZWdlbmQgPT0gMCkgewogICAgICBvcCA9ICdkYXknOwogICAgfQogICAgdmFyIGRhdGUxID0gbmV3IERhdGUoc3RhcnREYXRlKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoJ3l5eXktTU0tZGQnKSArICcgJyArIHN0YXJ0RGF0ZSkuZ2V0VGltZSgpOwogICAgdmFyIGRhdGUyID0gbmV3IERhdGUoZW5kRGF0ZSkuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCd5eXl5LU1NLWRkJykgKyAnICcgKyBlbmREYXRlKS5nZXRUaW1lKCk7CiAgICB2YXIgcmVzID0gMDsKICAgIHZhciBkYXlzID0gZGF0ZTIgLSBkYXRlMTsKICAgIHN3aXRjaCAob3ApIHsKICAgICAgY2FzZSAnbW9udGgnOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2RheSc6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2hvdXInOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjApKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnbWludXRlJzoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCkpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAxMDAwKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfSwKICAvLyDlubPpk7rnu5PmnoTovazltYzlpZfnu5PmnoQKICB0aWxlMm5lc3Q6IGZ1bmN0aW9uIHRpbGUybmVzdChhcnJheSwga2V5LCBwS2V5LCBjaGlsZHJlbktleSkgewogICAgaWYgKCFhcnJheSB8fCBhcnJheS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgLy8g5aSN5Yi25LiA5Lu977yM6YG/5YWN5L+u5pS55Y6f5aeL5pWw57uECiAgICB2YXIgYXJ5ID0gX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5KTsKICAgIGtleSA9IGtleSB8fCAnaWQnOwogICAgcEtleSA9IHBLZXkgfHwgJ3BhcmVudElkJzsKICAgIGNoaWxkcmVuS2V5ID0gY2hpbGRyZW5LZXkgfHwgJ2NoaWxkcmVuJzsKICAgIC8vIOWumuS5ieS4gOS4quW+heenu+mZpOaVsOe7hAogICAgdmFyIGFyeTJyZW1vdmUgPSBbXTsKICAgIGFyeS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgaWYgKGl0ZW1ba2V5XSAhPT0gaXRlbVtwS2V5XSkgewogICAgICAgIC8vIOaJvueItuiKgueCuQogICAgICAgIHZhciBwID0gYXJ5LmZpbHRlcihmdW5jdGlvbiAoYykgewogICAgICAgICAgcmV0dXJuIGNba2V5XSA9PT0gaXRlbVtwS2V5XTsKICAgICAgICB9KTsKICAgICAgICBpZiAocCAmJiBwLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBwWzBdLmNoaWxkcmVuID0gcFswXS5jaGlsZHJlbiB8fCBbXTsKICAgICAgICAgIC8vIOWwhuWtkOiKgueCueaUvuWIsOeItuiKgueCueS4rQogICAgICAgICAgcFswXS5jaGlsZHJlbi5wdXNoKGl0ZW0pOwogICAgICAgICAgYXJ5MnJlbW92ZS5wdXNoKGl0ZW1ba2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIC8vIOmBjeWOhuenu+mZpOW+heWIoOmZpOWvueixoQogICAgYXJ5MnJlbW92ZS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgYXJ5ID0gYXJ5LmZpbHRlcihmdW5jdGlvbiAoYykgewogICAgICAgIHJldHVybiBjW2tleV0gIT09IGl0ZW07CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gYXJ5OwogIH0sCiAgLy8g5LuO5a+56LGh5Lit6I635Y+W5ZKM6aqM6K+B5a2X5q616Lev5b6ECiAgZ2V0QW5kVmFsaWRQYXRoOiBmdW5jdGlvbiBnZXRBbmRWYWxpZFBhdGgob2JqLCBrZXkpIHsKICAgIGlmICghb2JqIHx8IG9iai5jb25zdHJ1Y3RvciAhPSBPYmplY3QgfHwgIWtleSB8fCBrZXkuY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBwYXRoID0gb2JqW2tleV07CiAgICBpZiAoL15cdysuKlx3KyQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuIHBhdGg7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9LAogIC8vIOiOt+WPllZ1ZeWunuS+i+S4reaMh+WummNsYXNzTmFtZeeahOeItuWunuS+iwogIGdldFBhcmVudEluc3RhbmNlQnlDbGFzc05hbWU6IGZ1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlQnlDbGFzc05hbWUoaW5zdGFuY2UsIGNsYXNzTmFtZSkgewogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICB0aHJvdyAnVnVlQ29tcG9uZW505a6e5L6L5Li656m6Lic7CiAgICB9CiAgICBpZiAoaW5zdGFuY2UuJGVsLmNsYXNzTmFtZSAmJiBpbnN0YW5jZS4kZWwuY2xhc3NOYW1lLmluZGV4T2YoY2xhc3NOYW1lKSA+IC0xKSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuJHJvb3QgJiYgaW5zdGFuY2UuJHJvb3QuX3VpZCA9PSBpbnN0YW5jZS5fdWlkKSB7CiAgICAgIHRocm93ICJcdTY3RTVcdTYyN0VWdWVDb21wb25lbnRcdTVCOUVcdTRGOEJcdTY4MTFcdTY1RjZcdTYyN0VcdTUyMzBcdTY4MzlcdTgyODJcdTcwQjlcdTkwRkRcdTY3MkFcdTYyN0VcdTUyMzBjbGFzc05hbWVcdTRFM0EiLmNvbmNhdChjbGFzc05hbWUsICJcdTc2ODRcdTVCOUVcdTRGOEIuIik7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRwYXJlbnQpIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFBhcmVudEluc3RhbmNlQnlDbGFzc05hbWUoaW5zdGFuY2UuJHBhcmVudCwgY2xhc3NOYW1lKTsKICAgIH0KICB9LAogIC8vIOiOt+WPluaOp+S7tuaJgOWcqOihqOWNleWvueW6lOeahOWunuS+i+WvueixoQogIGdldE9ubGluZUZvcm1JbnN0YW5jZTogZnVuY3Rpb24gZ2V0T25saW5lRm9ybUluc3RhbmNlKGluc3RhbmNlKSB7CiAgICBpZiAoIWluc3RhbmNlKSB7CiAgICAgIHRocm93ICdWdWVDb21wb25lbnTlrp7kvovkuLrnqbouJzsKICAgIH0KICAgIGlmIChpbnN0YW5jZS4kZWwuZ2V0QXR0cmlidXRlICYmIGluc3RhbmNlLiRlbC5nZXRBdHRyaWJ1dGUoJ25hbWUnKSA9PT0gJ29ubGluZS1mb3JtJykgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRyb290ICYmIGluc3RhbmNlLiRyb290Ll91aWQgPT0gaW5zdGFuY2UuX3VpZCkgewogICAgICB0aHJvdyAiXHU2N0U1XHU2MjdFVnVlQ29tcG9uZW50XHU1QjlFXHU0RjhCXHU2ODExXHU2NUY2XHU2MjdFXHU1MjMwXHU2ODM5XHU4MjgyXHU3MEI5XHU5MEZEXHU2NzJBXHU2MjdFXHU1MjMwbmFtZVx1NEUzQW9ubGluZS1mb3JtXHU3Njg0XHU1QjlFXHU0RjhCLiI7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRwYXJlbnQpIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0YW5jZS4kcGFyZW50KTsKICAgIH0KICB9LAogIC8vIOagueaNruiHquWumuS5ieagh+etvuWQjSjnu4Tku7blkI0p6I635Y+W5p+Q5LiqVnVl5a6e5L6LCiAgZ2V0SW5zdGFuY2VCeVRhZzogZnVuY3Rpb24gZ2V0SW5zdGFuY2VCeVRhZyhpbnN0YW5jZSwgYXJncykgewogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICB0aHJvdyAnVnVlQ29tcG9uZW505a6e5L6L5Li656m6Lic7CiAgICB9CiAgICBpZiAoYXJncy5pbmNsdWRlcyhpbnN0YW5jZS4kb3B0aW9ucy5fY29tcG9uZW50VGFnKSkgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRyb290ICYmIGluc3RhbmNlLiRyb290Ll91aWQgPT0gaW5zdGFuY2UuX3VpZCkgewogICAgICB0aHJvdyAiXHU2N0U1XHU2MjdFVnVlQ29tcG9uZW50XHU1QjlFXHU0RjhCXHU2ODExXHU2NUY2XHU2MjdFXHU1MjMwXHU2ODM5XHU4MjgyXHU3MEI5XHU5MEZEXHU2NzJBXHU2MjdFXHU1MjMwbmFtZVx1NEUzQXRhZ1x1NzY4NFx1NUI5RVx1NEY4Qi4iOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRJbnN0YW5jZUJ5VGFnKGluc3RhbmNlLiRwYXJlbnQsIGFyZ3MpOwogICAgfQogIH0sCiAgLy8g6I635Y+WVnVl5a6e5L6L5Y+K54i257qn5a6e5L6L5Lit5pyJcmVsb2Fk5pa55rOV55qE5a6e5L6LCiAgZ2V0UmVsb2FkTWV0aG9kOiBmdW5jdGlvbiBnZXRSZWxvYWRNZXRob2QoaW5zdGFuY2UpIHsKICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoaW5zdGFuY2UucmVsb2FkICYmIGluc3RhbmNlLnJlbG9hZC5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb24pIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcm9vdCAmJiBpbnN0YW5jZS4kcm9vdC5fdWlkID09IGluc3RhbmNlLl91aWQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRwYXJlbnQpIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFJlbG9hZE1ldGhvZChpbnN0YW5jZS4kcGFyZW50KTsKICAgIH0KICB9LAogIC8vIOmHjeaWsOWKoOi9veW9k+WJjemhtemdoijkuI3kvJrliLfmlrDmlbTkuKrpobXpnaLvvIzlj6rliLfmlrByb3V0ZXItdmlld+mDqOWIhikKICByZWxvYWQ6IGZ1bmN0aW9uIHJlbG9hZCgpIHsKICAgIHZhciB2aWV3RWxlbWVudEFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdhcHAtYmFzZS1tYWluJyk7CiAgICBpZiAoIXZpZXdFbGVtZW50QXJ5IHx8IHZpZXdFbGVtZW50QXJ5Lmxlbmd0aCAhPSAxKSB7CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciB2aWV3SW5zdCA9IHZpZXdFbGVtZW50QXJ5WzBdLl9fdnVlX187CiAgICAgIGlmICghdmlld0luc3QgfHwgIXZpZXdJbnN0Ll9pc1Z1ZSkgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgfQogICAgICB2YXIgciA9IHV0aWxzLmdldFJlbG9hZE1ldGhvZCh2aWV3SW5zdCk7CiAgICAgIGlmIChyKSB7CiAgICAgICAgci5yZWxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgIH0KICAgIH0KICB9LAogIC8vIOiOt+WPluWcqOe6v+ihqOWNleeahGpzb27moLzlvI/lrZfnrKbkuLLnmoTooajljZXmlbDmja4odmFsaWRhdGXlj4LmlbDlhrPlrprmmK/lkKbpnIDopoHlr7nooajljZXov5vooYzpqozor4EpCiAgZ2V0T25saW5lRm9ybURhdGE6IGZ1bmN0aW9uIGdldE9ubGluZUZvcm1EYXRhKHZhbGlkYXRlKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgZm9ybUVsZW1lbnRBcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnb25saW5lLWZvcm0nKTsKICAgICAgaWYgKCFmb3JtRWxlbWVudEFyeSB8fCBmb3JtRWxlbWVudEFyeS5sZW5ndGggPCAxKSB7CiAgICAgICAgdmFyIGZybUZyYW1lID0gJCgnI2ZybUZyYW1lJyk7CiAgICAgICAgaWYgKGZybUZyYW1lICYmIGZybUZyYW1lLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhciBmcm0gPSBmcm1GcmFtZVswXTsKICAgICAgICAgIHZhciBpc0NhbGxCYWNrID0gZmFsc2U7CiAgICAgICAgICB2YXIgY2FuY2VsVGltZW91dCA9IGZhbHNlOwogICAgICAgICAgdmFyIGlzVGltZU91dCA9IGZhbHNlOwogICAgICAgICAgLy8g5a2Q6aG16Z2i5piv5ZCm5pS25Yiw5LqG5raI5oGvCiAgICAgICAgICB2YXIgaXNSb2dlciA9IGZhbHNlOwogICAgICAgICAgZnJtLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3NhdmVEYXRhJywgJyonKTsKICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGUuZGF0YSAmJiBlLmRhdGEuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7CiAgICAgICAgICAgICAgaWYgKGUuZGF0YS50eXBlID09ICdzYXZlRGF0YScgJiYgIWlzQ2FsbEJhY2spIHsKICAgICAgICAgICAgICAgIGlzQ2FsbEJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5zdGF0ZSAmJiAhaXNUaW1lT3V0KSB7CiAgICAgICAgICAgICAgICAgIHZhciBpZnJhbWVEYXRhID0gewogICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5OiBlLmRhdGEuYnVzaW5lc3NLZXksCiAgICAgICAgICAgICAgICAgICAgc3lzQ29kZTogZS5kYXRhLnN5c0NvZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YXJzKSB7CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lRGF0YS52YXJzID0gZS5kYXRhLnZhcnM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpZnJhbWVEYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS50eXBlID09ICdjYW5jZWxUaW1lb3V0JykgewogICAgICAgICAgICAgICAgY2FuY2VsVGltZW91dCA9IHRydWU7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEudHlwZSA9PSAncm9nZXInICYmICFpc1JvZ2VyKSB7CiAgICAgICAgICAgICAgICBpc1JvZ2VyID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIC8vIOWPquimgeWtkOmhtemdouW8leWFpeS6hmhvdGVudC5oZWxwZXIuanPvvIzniLbpobXpnaLlj5HpgIHkuobmtojmga/lkI7vvIzlrZDpobXpnaLkvJrpqazkuIrlm57lpI1gcm9nZXJg44CCCiAgICAgICAgICAvLyDov5nph4zorr7nva4wLjXnp5LlkI7mnKrmlLbliLBgcm9nZXJg5raI5oGv5YiZ6K6k5Li65a2Q6aG16Z2i5pyq5byV5YWlaG90ZW50LmhlbHBlci5qc++8jOatpOaXtuebtOaOpXJlamVjdOOAggogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghaXNSb2dlcikgewogICAgICAgICAgICAgIHJlamVjdCg2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgNTAwKTsKCiAgICAgICAgICAvLyDorr7nva4xMOenkui2heaXtuacuuWItu+8jOWmguaenOi2heaXtuWImeS4jeWGjeW+gOS4i+aJp+ihjAogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghaXNDYWxsQmFjayAmJiAhY2FuY2VsVGltZW91dCkgewogICAgICAgICAgICAgIGlzVGltZU91dCA9IHRydWU7CiAgICAgICAgICAgICAgcmVqZWN0KDUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxMDAwMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlamVjdCgxKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGZybUluc3QgPSBmb3JtRWxlbWVudEFyeVswXS5fX3Z1ZV9fOwogICAgICAgIGlmICghZnJtSW5zdCB8fCAhZnJtSW5zdC5faXNWdWUpIHsKICAgICAgICAgIHJlamVjdCgyKTsKICAgICAgICB9CiAgICAgICAgLy/lpITnkIZoYW5kc29udGFibGXlrZDooajmlbDmja4KICAgICAgICB2YXIgcmVmcyA9IGZybUluc3QuJHJlZnNbJ29ubGluZUZvcm0nXS4kcmVmczsKICAgICAgICB2YXIgaG90RGF0YSA9IHRydWU7CiAgICAgICAgaWYgKHJlZnMpIHsKICAgICAgICAgIGZvciAodmFyIHJlZiBpbiByZWZzKSB7CiAgICAgICAgICAgIGlmIChyZWZzLmhhc093blByb3BlcnR5KHJlZikgJiYgcmVmLmluZGV4T2YoJ2hvdHRhYmxlLicpID09IDApIHsKICAgICAgICAgICAgICB2YXIgcmVmRWxlID0gcmVmc1tyZWZdOwogICAgICAgICAgICAgIGhvdERhdGEgPSByZWZFbGUuZ2V0SG90VGFibGVEYXRhKHRydWUpOwogICAgICAgICAgICAgIGlmIChob3REYXRhICYmIEFycmF5LmlzQXJyYXkoaG90RGF0YSkpIHsKICAgICAgICAgICAgICAgIHZhciBuYW1lcyA9IHJlZi5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgaWYgKGhvdERhdGEgJiYgQXJyYXkuaXNBcnJheShob3REYXRhKSkgewogICAgICAgICAgICAgICAgICBmcm1JbnN0LmRhdGFbbmFtZXNbMV1dW25hbWVzWzJdXSA9IF90b0NvbnN1bWFibGVBcnJheShob3REYXRhKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGZybUluc3QuZGF0YVtuYW1lc1sxXV1bbmFtZXNbMl1dID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdmFsaWRhdGUpIHsKICAgICAgICAgIHJlc29sdmUoSlNPTi5zdHJpbmdpZnkoZnJtSW5zdC5kYXRhKSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZybUluc3QuJHJvb3QuJHZhbGlkYXRvci52YWxpZGF0ZUFsbCgnY3VzdG9tLWZvcm0nKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgIGlmIChob3REYXRhID09PSBmYWxzZSkgewogICAgICAgICAgICAvL2hvdHRhYmxl5a2Q6KGo5pWw5o2u5qCh6aqM5aSx6LSlCiAgICAgICAgICAgIHJlamVjdCg3KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICByZXNvbHZlKEpTT04uc3RyaW5naWZ5KGZybUluc3QuZGF0YSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVqZWN0KHsKICAgICAgICAgICAgICByZWFzb246IDMsCiAgICAgICAgICAgICAgZXJyb3JzOiBmcm1JbnN0LiRyb290LiR2YWxpZGF0b3IuZXJyb3JzLml0ZW1zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICB9LAogIC8vIOiOt+WPluihqOWNleaVsOaNruWksei0peeahOWkhOeQhgogIGhhbmRsZUdldEZvcm1EYXRhUmVqZWN0OiBmdW5jdGlvbiBoYW5kbGVHZXRGb3JtRGF0YVJlamVjdChyZWFzb24sIG5lZWRDb25maXJtKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgZXJyb3JzID0gW107CiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLmNvbnN0cnVjdG9yID09IE9iamVjdCkgewogICAgICAgIGVycm9ycyA9IHJlYXNvbi5lcnJvcnM7CiAgICAgICAgcmVhc29uID0gcmVhc29uLnJlYXNvbjsKICAgICAgfQogICAgICBzd2l0Y2ggKHJlYXNvbikgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ+acquiOt+WPluWIsOWcqOe6v+ihqOWNleaIluiAhVVSTOihqOWNlS4nKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgTWVzc2FnZS5lcnJvcign5L2/55So5LqG5Zyo57q/6KGo5Y2V77yM5L2G5piv6KGo5Y2V5Li656m65oiW6ICF5Yqg6L295aSx6LSlLicpOwogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICB2YXIgZXJyb3JNc2cgPSBbXTsKICAgICAgICAgIGVycm9ycyAmJiBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICB2YXIgZmllbGRMYWJlbCA9ICcnOwogICAgICAgICAgICBpZiAoZS5maWVsZCkgewogICAgICAgICAgICAgIGlmIChlLmZpZWxkLmluZGV4T2YoJy0nKSAhPSAtMSkgewogICAgICAgICAgICAgICAgZmllbGRMYWJlbCA9IGUuZmllbGQuc3Vic3RyKGUuZmllbGQuaW5kZXhPZignLScpICsgMSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZpZWxkTGFiZWwgPSBlLmZpZWxkOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvck1zZy5wdXNoKCIiLmNvbmNhdChmaWVsZExhYmVsLCAiICIpLmNvbmNhdChlLm1zZykpOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoZXJyb3JNc2cubGVuZ3RoID4gMCkgewogICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ29ubGluZS1mb3JtJylbMF0pIHsKICAgICAgICAgICAgICB2YXIgZnJtSW5zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdvbmxpbmUtZm9ybScpWzBdLl9fdnVlX187CiAgICAgICAgICAgICAgdmFyIGpzb25PYmogPSBmcm1JbnN0LiRyZWZzLm9ubGluZUZvcm0uJHJlZnM7CiAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGpzb25PYmopIHsKICAgICAgICAgICAgICAgIGlmIChqc29uT2JqW2tleV0uJGVsLnRleHRDb250ZW50KSB7CiAgICAgICAgICAgICAgICAgIHZhciB0ZXh0Q29udGVudCA9IGpzb25PYmpba2V5XS4kZWwudGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JNc2cubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGV4dENvbnRlbnQuaW5kZXhPZihlcnJvck1zZ1tpXSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoa2V5KVswXS5zdHlsZS5jb2xvciA9ICdyZWQnOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHV0aWxzLmhhbmRsZVJlamVjdChlcnJvck1zZyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBNZXNzYWdlLndhcm5pbmcoJ+ivt+ato+ehrueahOWhq+WGmeihqOWNleWGheWuuS4nKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgTWVzc2FnZS5lcnJvcignVVJM6KGo5Y2V5aSE55CG5Lia5Yqh5pWw5o2u6LaF5pe2LicpOwogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6CiAgICAgICAgICBpZiAobmVlZENvbmZpcm0pIHsKICAgICAgICAgICAgTWVzc2FnZUJveC5jb25maXJtKCdVUkzooajljZXpobXpnaLmnKrmraPnoa7lpITnkIbmlbDmja7vvIzmmK/lkKbku43nhLblkK/liqjmtYHnqIvvvJ8nLCB7CiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgLy9ob3R0YWJsZeWtkOihqOaVsOaNruagoemqjOWksei0peOAggogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgTWVzc2FnZS5lcnJvcigiXHU4M0I3XHU1M0Q2XHU4ODY4XHU1MzU1XHU2NTcwXHU2MzZFXHU2NUY2XHU1M0QxXHU3NTFGXHU5ODg0XHU2NzFGXHU0RTRCXHU1OTE2XHU3Njg0XHU1RjAyXHU1RTM4XHVGRjBDcmVhc29uOiIuY29uY2F0KHJlYXNvbikpOwogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CiAgfSwKICAvL+WFs+mXreaJgOacieagoemqjOmAmuefpQogIGNsb3NlQWxsTm90aWZpY2F0aW9uOiBmdW5jdGlvbiBjbG9zZUFsbE5vdGlmaWNhdGlvbigpIHsKICAgIGNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZyA9IHRydWU7CiAgICBmb3IgKHZhciBrZXkgaW4gbm90aWZpY2F0aW9ucykgewogICAgICBub3RpZmljYXRpb25zW2tleV0uY2xvc2UoKTsKICAgICAgZGVsZXRlIG5vdGlmaWNhdGlvbnNba2V5XTsKICAgIH0KICB9LAogIGhhbmRsZVJlamVjdDogZnVuY3Rpb24gaGFuZGxlUmVqZWN0KGVycm9yTXNnKSB7CiAgICB1dGlscy5jbG9zZUFsbE5vdGlmaWNhdGlvbigpOwogICAgY2xvc2VBbGxOb3RpZmljYXRpb25GbGFnID0gZmFsc2U7CiAgICB2YXIgbm90aWZpID0gTm90aWZpY2F0aW9uLmVycm9yKHsKICAgICAgdGl0bGU6ICfplJnor6/mj5DnpLonLAogICAgICBkYW5nZXJvdXNseVVzZUhUTUxTdHJpbmc6IHRydWUsCiAgICAgIG1lc3NhZ2U6ICJcdThCRjdcdTZCNjNcdTc4NkVcdTc2ODRcdTU4NkJcdTUxOTlcdTRFRTVcdTRFMEJcdTg4NjhcdTUzNTVcdTUxODVcdTVCQjlcdUZGMUE8YnIvPiIuY29uY2F0KGVycm9yTXNnLmpvaW4oJzxici8+JykpLAogICAgICBkdXJhdGlvbjogMCwKICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICBpZiAoIWNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZykgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBuID0gTm90aWZpY2F0aW9uLndhcm5pbmcoewogICAgICAgICAgICAgIGN1c3RvbUNsYXNzOiAnY3VzdG9tQ2xhc3MnLAogICAgICAgICAgICAgIGR1cmF0aW9uOiAwLAogICAgICAgICAgICAgIHNob3dDbG9zZTogZmFsc2UsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHsKICAgICAgICAgICAgICAgIG4uY2xvc2UoKTsKICAgICAgICAgICAgICAgIHV0aWxzLmhhbmRsZVJlamVjdChlcnJvck1zZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbm90aWZpY2F0aW9uc1tuLmlkXSA9IG47CiAgICAgICAgICB9LCAxMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIG5vdGlmaWNhdGlvbnNbbm90aWZpLmlkXSA9IG5vdGlmaTsKICB9LAogIC8vIOiOt+WPluaMh+WummRvbeWFg+e0oOeahOeItue6p+S4reWFt+acieaMh+WumuWxnuaAp+eahGRvbeWFg+e0oAogIGdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZTogZnVuY3Rpb24gZ2V0UGFyZW50RWxlbWVudEJ5QXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUpIHsKICAgIGlmICghZWwgfHwgIWVsLmhhc0F0dHJpYnV0ZSB8fCBlbC5oYXNBdHRyaWJ1dGUuY29uc3RydWN0b3IgIT09IEZ1bmN0aW9uKSB7CiAgICAgIHRocm93ICfkvKDlhaXnmoTlhYPntKBlbOS4jeiDveS4uuepuuS4lOW/hemhu+S4ukhUTUxIdG1sRWxlbWVudOexu+Weiy4nOwogICAgfQogICAgaWYgKCFhdHRyaWJ1dGUgfHwgYXR0cmlidXRlLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpIHsKICAgICAgdGhyb3cgJ+S8oOWFpeeahOWxnuaAp2F0dHJpYnV0ZeS4jeiDveS4uuepuuS4lOW/hemhu+S4ulN0cmluZ+exu+Weiy4nOwogICAgfQogICAgaWYgKGVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgIHJldHVybiBlbDsKICAgIH0gZWxzZSBpZiAoZWwudGFnTmFtZSA9PT0gJ0hUTUwnKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbC5wYXJlbnRFbGVtZW50LCBhdHRyaWJ1dGUpOwogICAgfQogIH0sCiAgLy8g5LuO54i257qnZG9t5YWD57Sg5Lit6I635Y+W5oyH5a6a5bGe5oCn55qE5YC8CiAgZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50OiBmdW5jdGlvbiBnZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoZWwsIGF0dHJpYnV0ZSkgewogICAgdmFyIHBFbCA9IHV0aWxzLmdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKTsKICAgIGlmIChwRWwgJiYgcEVsLmdldEF0dHJpYnV0ZSAmJiBwRWwuZ2V0QXR0cmlidXRlLmNvbnN0cnVjdG9yID09PSBGdW5jdGlvbikgewogICAgICByZXR1cm4gcEVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSwKICAvLyDpgJrov4fot6/lvoTlj5blvpflr7nosaHkuK3nmoTlsZ7mgKcKICBnZXRWYWx1ZUJ5UGF0aDogZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgob2JqLCBwYXRoLCBzdWJJbmRleCkgewogICAgaWYgKCFvYmogfHwgIXBhdGggfHwgcGF0aC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIS9eXHc/LipbXHd8XF1dJC8udGVzdChwYXRoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBwYXRoQXJ5ID0gcGF0aC5zcGxpdCgnLicpOwogICAgaWYgKHBhdGhBcnkubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIG9ialtwYXRoXTsKICAgIH0gZWxzZSBpZiAocGF0aEFyeS5sZW5ndGggPiAxKSB7CiAgICAgIHZhciByZXQgPSBvYmo7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyeS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBrZXkgPSBwYXRoQXJ5W2ldOwogICAgICAgIHZhciBtYXRjaCA9IC9eKFx3KylcWyhcZCspXF0kLy5leGVjKGtleSk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICByZXQgPSByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXTsKICAgICAgICB9IGVsc2UgaWYgKHJldCAmJiByZXQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgICAgaWYgKHN1YkluZGV4ICE9IG51bGwgJiYgc3ViSW5kZXggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHZhciBwcmVJbmRleCA9IE51bWJlci5wYXJzZUludChzdWJJbmRleCk7CiAgICAgICAgICAgIGlmICghaXNOYU4ocHJlSW5kZXgpKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0ID0gcmV0W2luZGV4XVtrZXldOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSByZXRba2V5XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgLy8g6YCa6L+H6Lev5b6E6K6+572u5a+56LGh5Lit55qE5bGe5oCnCiAgc2V0VmFsdWVCeVBhdGg6IGZ1bmN0aW9uIHNldFZhbHVlQnlQYXRoKG9iaiwgcGF0aCwgdmFsdWUsIHN1YkluZGV4KSB7CiAgICBpZiAoIW9iaiB8fCAhcGF0aCB8fCBwYXRoLmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIS9eXHc/LipbXHd8XF1dJC8udGVzdChwYXRoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgcGF0aEFyeSA9IHBhdGguc3BsaXQoJy4nKTsKICAgIGlmIChwYXRoQXJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgIG9ialtwYXRoXSA9IHZhbHVlOwogICAgfSBlbHNlIGlmIChwYXRoQXJ5Lmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHJldCA9IG9iajsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGtleSA9IHBhdGhBcnlbaV07CiAgICAgICAgdmFyIG1hdGNoID0gL14oXHcrKVxbKFxkKylcXSQvLmV4ZWMoa2V5KTsKICAgICAgICBpZiAoaSA9PSBwYXRoQXJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXSA9IHZhbHVlOwogICAgICAgICAgfSBlbHNlIGlmIChyZXQgJiYgcmV0LmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgICAgICBpZiAoc3ViSW5kZXggIT0gbnVsbCAmJiBzdWJJbmRleCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICB2YXIgcHJlSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoc3ViSW5kZXgpOwogICAgICAgICAgICAgIGlmICghaXNOYU4ocHJlSW5kZXgpKSB7CiAgICAgICAgICAgICAgICBpbmRleCA9IHByZUluZGV4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmouJHNldChyZXRbaW5kZXhdLCBrZXksIHZhbHVlKTsKICAgICAgICAgICAgLy9yZXRbaW5kZXhdW2tleV0gPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vcmV0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgb2JqLiRzZXQocmV0LCBrZXksIHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldCA9IHJldFttYXRjaFsxXV1bbWF0Y2hbMl1dOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0ID0gcmV0W2tleV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBvYmouJGZvcmNlVXBkYXRlKCk7CiAgfSwKICAvKioNCiAgICog5bCG5a2X56ym5Liy6L2s5Li6anNvbuWvueixoeOAgg0KICAgKiBAcGFyYW0ganNvblN0cg0KICAgKiBAcGFyYW0gdHlwZSAg5Y+v5LiN5aGr5YaZcGFyc2VUb0pzb24NCiAgICogQHJldHVybnMNCiAgICovCiAgcGFyc2VUb0pzb246IGZ1bmN0aW9uIHBhcnNlVG9Kc29uKGpzb25TdHIsIHR5cGUpIHsKICAgIHR5cGUgPSB0eXBlIHx8IDE7CiAgICBpZiAoIWpzb25TdHIgfHwganNvblN0ciA9PT0gJycpIHJldHVybjsKICAgIC8v5aaC5p6c5YyF5ZCr5o2i6KGM77yM5LiL6Z2i6Kej5p6QanNvbuS8muaKpemUme+8jOaJgOS7peWwhuaNouihjOabv+aNouS4ujLkuKrnqbrmoLznrKYKICAgIGpzb25TdHIgPSBqc29uU3RyLnJlcGxhY2UoL1xuL2csICcgICcpOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgcmV0dXJuIGV2YWwoJygnICsganNvblN0ciArICcpJyk7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgSlNPTi5wYXJzZShqc29uU3RyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyAn6Kej5p6QanNvbuWvueixoemUmeivryc7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIHV0aWxzLnBhcnNlVG9Kc29uKGpzb25TdHIsIHR5cGUgKyAxKTsKICAgIH0KICB9LAogIC8qKg0KICAgKiDlsIbmlbDlrZfovazmjaLmiJDkurrlkI3luIHlpKflhpnjgIINCiAgICoNCiAgICogQHBhcmFtIGN1cnJlbmN5RGlnaXRzDQogICAqIEByZXR1cm5zDQogICAqLwogIGNvbnZlcnRDdXJyZW5jeTogZnVuY3Rpb24gY29udmVydEN1cnJlbmN5KGN1cnJlbmN5RGlnaXRzKSB7CiAgICB2YXIgTUFYSU1VTV9OVU1CRVIgPSA5OTk5OTk5OTk5OS45OTsKICAgIHZhciBDTl9aRVJPID0gJ+mbtic7CiAgICB2YXIgQ05fT05FID0gJ+WjuSc7CiAgICB2YXIgQ05fVFdPID0gJ+i0sCc7CiAgICB2YXIgQ05fVEhSRUUgPSAn5Y+BJzsKICAgIHZhciBDTl9GT1VSID0gJ+iChic7CiAgICB2YXIgQ05fRklWRSA9ICfkvI0nOwogICAgdmFyIENOX1NJWCA9ICfpmYYnOwogICAgdmFyIENOX1NFVkVOID0gJ+afkic7CiAgICB2YXIgQ05fRUlHSFQgPSAn5o2MJzsKICAgIHZhciBDTl9OSU5FID0gJ+eOlic7CiAgICB2YXIgQ05fVEVOID0gJ+aLvic7CiAgICB2YXIgQ05fSFVORFJFRCA9ICfkvbAnOwogICAgdmFyIENOX1RIT1VTQU5EID0gJ+S7nyc7CiAgICB2YXIgQ05fVEVOX1RIT1VTQU5EID0gJ+S4hyc7CiAgICB2YXIgQ05fSFVORFJFRF9NSUxMSU9OID0gJ+S6vyc7CiAgICB2YXIgQ05fU1lNQk9MID0gJyc7CiAgICB2YXIgQ05fRE9MTEFSID0gJ+WFgyc7CiAgICB2YXIgQ05fVEVOX0NFTlQgPSAn6KeSJzsKICAgIHZhciBDTl9DRU5UID0gJ+WIhic7CiAgICB2YXIgQ05fSU5URUdFUiA9ICfmlbQnOwogICAgdmFyIGludGVncmFsOwogICAgdmFyIGRlY2ltYWw7CiAgICB2YXIgb3V0cHV0Q2hhcmFjdGVyczsKICAgIHZhciBwYXJ0czsKICAgIHZhciBkaWdpdHMsIHJhZGljZXMsIGJpZ1JhZGljZXMsIGRlY2ltYWxzOwogICAgdmFyIHplcm9Db3VudDsKICAgIHZhciBpLCBwLCBkOwogICAgdmFyIHF1b3RpZW50LCBtb2R1bHVzOwogICAgY3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0cy50b1N0cmluZygpOwogICAgaWYgKGN1cnJlbmN5RGlnaXRzID09ICcnKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGlmIChjdXJyZW5jeURpZ2l0cy5tYXRjaCgvW14sLlxkXS8pICE9IG51bGwpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgaWYgKGN1cnJlbmN5RGlnaXRzLm1hdGNoKC9eKChcZHsxLDN9KCxcZHszfSkqKC4oKFxkezN9LCkqXGR7MSwzfSkpPyl8KFxkKyguXGQrKT8pKSQvKSA9PSBudWxsKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHMucmVwbGFjZSgvLC9nLCAnJyk7CiAgICBjdXJyZW5jeURpZ2l0cyA9IGN1cnJlbmN5RGlnaXRzLnJlcGxhY2UoL14wKy8sICcnKTsKICAgIGlmIChOdW1iZXIoY3VycmVuY3lEaWdpdHMpID4gTUFYSU1VTV9OVU1CRVIpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgcGFydHMgPSBjdXJyZW5jeURpZ2l0cy5zcGxpdCgnLicpOwogICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgaW50ZWdyYWwgPSBwYXJ0c1swXTsKICAgICAgZGVjaW1hbCA9IHBhcnRzWzFdOwogICAgICBkZWNpbWFsID0gZGVjaW1hbC5zdWJzdHIoMCwgMik7CiAgICB9IGVsc2UgewogICAgICBpbnRlZ3JhbCA9IHBhcnRzWzBdOwogICAgICBkZWNpbWFsID0gJyc7CiAgICB9CiAgICBkaWdpdHMgPSBuZXcgQXJyYXkoQ05fWkVSTywgQ05fT05FLCBDTl9UV08sIENOX1RIUkVFLCBDTl9GT1VSLCBDTl9GSVZFLCBDTl9TSVgsIENOX1NFVkVOLCBDTl9FSUdIVCwgQ05fTklORSk7CiAgICByYWRpY2VzID0gbmV3IEFycmF5KCcnLCBDTl9URU4sIENOX0hVTkRSRUQsIENOX1RIT1VTQU5EKTsKICAgIGJpZ1JhZGljZXMgPSBuZXcgQXJyYXkoJycsIENOX1RFTl9USE9VU0FORCwgQ05fSFVORFJFRF9NSUxMSU9OKTsKICAgIGRlY2ltYWxzID0gbmV3IEFycmF5KENOX1RFTl9DRU5ULCBDTl9DRU5UKTsKICAgIG91dHB1dENoYXJhY3RlcnMgPSAnJzsKICAgIGlmIChOdW1iZXIoaW50ZWdyYWwpID4gMCkgewogICAgICB6ZXJvQ291bnQgPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgaW50ZWdyYWwubGVuZ3RoOyBpKyspIHsKICAgICAgICBwID0gaW50ZWdyYWwubGVuZ3RoIC0gaSAtIDE7CiAgICAgICAgZCA9IGludGVncmFsLnN1YnN0cihpLCAxKTsKICAgICAgICBxdW90aWVudCA9IHAgLyA0OwogICAgICAgIG1vZHVsdXMgPSBwICUgNDsKICAgICAgICBpZiAoZCA9PSAnMCcpIHsKICAgICAgICAgIHplcm9Db3VudCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoemVyb0NvdW50ID4gMCkgewogICAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGRpZ2l0c1swXTsKICAgICAgICAgIH0KICAgICAgICAgIHplcm9Db3VudCA9IDA7CiAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGRpZ2l0c1tOdW1iZXIoZCldICsgcmFkaWNlc1ttb2R1bHVzXTsKICAgICAgICB9CiAgICAgICAgaWYgKG1vZHVsdXMgPT0gMCAmJiB6ZXJvQ291bnQgPCA0KSB7CiAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGJpZ1JhZGljZXNbcXVvdGllbnRdOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IENOX0RPTExBUjsKICAgIH0KICAgIGlmIChkZWNpbWFsICE9ICcnKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWNpbWFsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZCA9IGRlY2ltYWwuc3Vic3RyKGksIDEpOwogICAgICAgIGlmIChkICE9ICcwJykgewogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbTnVtYmVyKGQpXSArIGRlY2ltYWxzW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG91dHB1dENoYXJhY3RlcnMgPT0gJycpIHsKICAgICAgb3V0cHV0Q2hhcmFjdGVycyA9IENOX1pFUk8gKyBDTl9ET0xMQVI7CiAgICB9CiAgICBpZiAoZGVjaW1hbCA9PSAnJykgewogICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IENOX0lOVEVHRVI7CiAgICB9CiAgICBvdXRwdXRDaGFyYWN0ZXJzID0gQ05fU1lNQk9MICsgb3V0cHV0Q2hhcmFjdGVyczsKICAgIHJldHVybiBvdXRwdXRDaGFyYWN0ZXJzOwogIH0sCiAgLyoqDQogICAqIOaVsOWtl+agvOW8j+i9rOaNouaIkOWNg+WIhuS9jQ0KICAgKkBwYXJhbXtPYmplY3R9bnVtDQogICAqLwogIHRob3VzYW5kQml0OiBmdW5jdGlvbiB0aG91c2FuZEJpdChudW0pIHsKICAgIGlmICgobnVtICsgJycpLnRyaW0oKSA9PSAnJykgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBpZiAoaXNOYU4obnVtKSkgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBudW0gPSBudW0gKyAnJzsKICAgIGlmICgvXi4qXC4uKiQvLnRlc3QobnVtKSkgewogICAgICB2YXIgcG9pbnRJbmRleCA9IG51bS5sYXN0SW5kZXhPZignLicpOwogICAgICB2YXIgaW50UGFydCA9IG51bS5zdWJzdHJpbmcoMCwgcG9pbnRJbmRleCk7CiAgICAgIHZhciBwb2ludFBhcnQgPSBudW0uc3Vic3RyaW5nKHBvaW50SW5kZXggKyAxLCBudW0ubGVuZ3RoKTsKICAgICAgdmFyIGludFBhcnQgPSBpbnRQYXJ0ICsgJyc7CiAgICAgIHZhciByZSA9IC8oLT9cZCspKFxkezN9KS87CiAgICAgIHdoaWxlIChyZS50ZXN0KGludFBhcnQpKSB7CiAgICAgICAgaW50UGFydCA9IGludFBhcnQucmVwbGFjZShyZSwgJyQxLCQyJyk7CiAgICAgIH0KICAgICAgbnVtID0gaW50UGFydCArICcuJyArIHBvaW50UGFydDsKICAgIH0gZWxzZSB7CiAgICAgIG51bSA9IG51bSArICcnOwogICAgICB2YXIgcmUgPSAvKC0/XGQrKShcZHszfSkvOwogICAgICB3aGlsZSAocmUudGVzdChudW0pKSB7CiAgICAgICAgbnVtID0gbnVtLnJlcGxhY2UocmUsICckMSwkMicpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVtOwogIH0sCiAgLyoqDQogICAqIOmAmui/h25hbWXojrflj5bpobXpnaJ1cmzlnLDlnYDlj4LmlbANCiAgICogQHBhcmFtIG5hbWUNCiAgICogQHJldHVybnMNCiAgICoNCiAgICovCiAgZ2V0VXJsS2V5OiBmdW5jdGlvbiBnZXRVcmxLZXkobmFtZSkgewogICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCgobmV3IFJlZ0V4cCgnWz98Jl0nICsgbmFtZSArICc9JyArICcoW14mO10rPykoJnwjfDt8JCknKS5leGVjKGxvY2F0aW9uLmhyZWYpIHx8IFssICcnXSlbMV0ucmVwbGFjZSgvXCsvZywgJyUyMCcpKSB8fCBudWxsOwogIH0sCiAgLy/pgInmi6nlmajkuIrkuIvnp7sKICBkb3duOiBmdW5jdGlvbiBkb3duKGFyeSwgc2VsZWN0QXJyLCB0aGlzXykgewogICAgaWYgKGFyeS5sZW5ndGggPiAwICYmIHNlbGVjdEFyci5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBpZHggPSBzZWxlY3RBcnIuaW5kZXhPZihhcnlbYXJ5Lmxlbmd0aCAtIDFdKTsKICAgICAgaWYgKGlkeCArIDEgPCBzZWxlY3RBcnIubGVuZ3RoKSB7CiAgICAgICAgdmFyIHQgPSBzZWxlY3RBcnJbaWR4ICsgMV07CiAgICAgICAgc2VsZWN0QXJyW2lkeCArIDFdID0gc2VsZWN0QXJyW2lkeF07CiAgICAgICAgc2VsZWN0QXJyW2lkeF0gPSB0OwogICAgICAgIHRoaXNfLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgICB0aGlzXy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgICB9CiAgICB9CiAgfSwKICB1cDogZnVuY3Rpb24gdXAoYXJ5LCBzZWxlY3RBcnIsIHRoaXNfKSB7CiAgICBpZiAoYXJ5Lmxlbmd0aCA+IDAgJiYgc2VsZWN0QXJyLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGlkeCA9IHNlbGVjdEFyci5pbmRleE9mKGFyeVthcnkubGVuZ3RoIC0gMV0pOwogICAgICBpZiAoaWR4ICE9IDApIHsKICAgICAgICB2YXIgdCA9IHNlbGVjdEFycltpZHggLSAxXTsKICAgICAgICBzZWxlY3RBcnJbaWR4IC0gMV0gPSBzZWxlY3RBcnJbaWR4XTsKICAgICAgICBzZWxlY3RBcnJbaWR4XSA9IHQ7CiAgICAgICAgdGhpc18uY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpOwogICAgICAgIHRoaXNfLnN5bmNJbnB1dFZhbHVlKCk7CiAgICAgIH0KICAgIH0KICB9LAogIEFycmF5OiB7CiAgICAvL+S4iuenu+aMiemSrgogICAgdXA6IGZ1bmN0aW9uIHVwKGlkeCwgbGlzdCkgewogICAgICBpZHggPSBwYXJzZUludChpZHgpOwogICAgICBpZiAoaWR4IDwgMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgdCA9IGxpc3RbaWR4IC0gMV07CiAgICAgIGxpc3RbaWR4IC0gMV0gPSBsaXN0W2lkeF07CiAgICAgIGxpc3RbaWR4XSA9IHQ7CiAgICB9LAogICAgLy/kuIvnp7vmjInpkq4KICAgIGRvd246IGZ1bmN0aW9uIGRvd24oaWR4LCBsaXN0KSB7CiAgICAgIGlkeCA9IHBhcnNlSW50KGlkeCk7CiAgICAgIGlmIChpZHggPj0gbGlzdC5sZW5ndGggLSAxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciB0ID0gbGlzdFtpZHggKyAxXTsKICAgICAgbGlzdFtpZHggKyAxXSA9IGxpc3RbaWR4XTsKICAgICAgbGlzdFtpZHhdID0gdDsKICAgIH0sCiAgICByZXN1bWVTbjogZnVuY3Rpb24gcmVzdW1lU24obGlzdCkgewogICAgICBmb3IgKHZhciBrID0gMDsgayA8IGxpc3QubGVuZ3RoOyBrKyspIHsKICAgICAgICBsaXN0W2tdLnNuID0gazsKICAgICAgfQogICAgICByZXR1cm4gbGlzdDsKICAgIH0sCiAgICAvKioNCiAgICAgKiBpZHgg5Y6f5L2N572uDQogICAgICogbnVtIOebruagh+S9jee9rg0KICAgICAqIGxpc3Qg5pWw57uEDQogICAgICovCiAgICBtb3ZlVG9OdW06IGZ1bmN0aW9uIG1vdmVUb051bShpZHgsIHRhcmdldCwgbGlzdCkgewogICAgICBpZiAodGFyZ2V0ID09IC0xKSB7CiAgICAgICAgdGFyZ2V0ID0gMDsKICAgICAgfSBlbHNlIGlmIChpZHggPj0gdGFyZ2V0KSB7CiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0ICsgMTsKICAgICAgfQogICAgICB2YXIgdCA9IGxpc3Quc3BsaWNlKGlkeCwgMSk7CiAgICAgIGxpc3QuaW5zZXJ0KHRhcmdldCwgdFswXSk7CiAgICAgIHRoaXMucmVzdW1lU24obGlzdCk7CiAgICB9LAogICAgLy/liKDpmaTmjInpkq4KICAgIGRlbDogZnVuY3Rpb24gZGVsKGlkeCwgbGlzdCkgewogICAgICBsaXN0LnNwbGljZShpZHgsIDEpOwogICAgfSwKICAgIC8v5om+5Yiw5oyH5a6a5YWD57Sg55qE5pyq55+lCiAgICBpZHhPZjogZnVuY3Rpb24gaWR4T2YodmFsLCBsaXN0KSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChsaXN0W2ldID09IHZhbCkgcmV0dXJuIGk7CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfSwKICAgIC8v5Yig6Zmk5oyH5a6a5YWD57SgCiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSh2YWwsIGxpc3QpIHsKICAgICAgdmFyIGlkeCA9IHRoaXMuaWR4T2YodmFsLCBsaXN0KTsKICAgICAgaWYgKGlkeCA+IC0xKSB7CiAgICAgICAgbGlzdC5zcGxpY2UoaWR4LCAxKTsKICAgICAgfQogICAgfSwKICAgIC8v572u6aG2CiAgICB0b3A6IGZ1bmN0aW9uIHRvcChpZHgsIGxpc3QpIHsKICAgICAgaWYgKGlkeCA+PSBsaXN0Lmxlbmd0aCB8fCBpZHggPCAxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8v6YCQ5Liq5Lqk5o2iCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWR4OyBpKyspIHsKICAgICAgICB2YXIgdGVtcCA9IGxpc3RbaV07CiAgICAgICAgbGlzdFtpXSA9IGxpc3RbaWR4XTsKICAgICAgICBsaXN0W2lkeF0gPSB0ZW1wOwogICAgICB9CiAgICB9LAogICAgLy/nva7lupUKICAgIGJvdHRvbTogZnVuY3Rpb24gYm90dG9tKGlkeCwgbGlzdCkgewogICAgICBpZiAoaWR4ID49IGxpc3QubGVuZ3RoIC0gMSB8fCBpZHggPCAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8v6YCQ5Liq5Lqk5o2iCiAgICAgIGZvciAodmFyIGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPiBpZHg7IGktLSkgewogICAgICAgIHZhciB0ZW1wID0gbGlzdFtpXTsKICAgICAgICBsaXN0W2ldID0gbGlzdFtpZHhdOwogICAgICAgIGxpc3RbaWR4XSA9IHRlbXA7CiAgICAgIH0KICAgIH0KICB9LAogIC8qKg0KICAgKiDlr7nosaHovax1cmzlj4LmlbANCiAgICogQHBhcmFtIHsqfSBkYXRhDQogICAqIEBwYXJhbSB7Kn0gaXNQcmVmaXgNCiAgICovCiAgcXVlcnlQYXJhbXM6IGZ1bmN0aW9uIHF1ZXJ5UGFyYW1zKGRhdGEpIHsKICAgIHZhciBpc1ByZWZpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CiAgICB2YXIgcHJlZml4ID0gaXNQcmVmaXggPyAnPycgOiAnJzsKICAgIHZhciBfcmVzdWx0ID0gW107CiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChrZXkpIHsKICAgICAgdmFyIHZhbHVlID0gZGF0YVtrZXldOwogICAgICAvLyDljrvmjonkuLrnqbrnmoTlj4LmlbAKICAgICAgaWYgKFsnJywgdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gMTsgLy8gY29udGludWUKICAgICAgfQogICAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoX3ZhbHVlKSB7CiAgICAgICAgICBfcmVzdWx0LnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnW109JyArIGVuY29kZVVSSUNvbXBvbmVudChfdmFsdWUpKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfcmVzdWx0LnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTsKICAgICAgfQogICAgfTsKICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7CiAgICAgIGlmIChfbG9vcChrZXkpKSBjb250aW51ZTsKICAgIH0KICAgIHJldHVybiBfcmVzdWx0Lmxlbmd0aCA/IHByZWZpeCArIF9yZXN1bHQuam9pbignJicpIDogJyc7CiAgfSwKICBNZW51OiB7CiAgICBhZGRTdWJNZW51czogZnVuY3Rpb24gYWRkU3ViTWVudXModGhhdCwgY2hpbGRyZW4pIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAvLwkJCQkJaWYoIXBhcmVudC5jaGlsZHJlbil7CiAgICAgICAgLy8JCQkJCQlwYXJlbnQuY2hpbGRyZW4gPSBbe3BhdGg6Jy8nLCByZWRpcmVjdDpjaGlsZHJlblswXS5tZW51VXJsfV07CiAgICAgICAgLy8JCQkJCX0KICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgICAgICAvL2NvbnN0IHJvdXRlID0ge3BhdGg6IG0ubWVudVVybCwgbmFtZTogbS5hbGlhcywgIGNvbXBvbmVudDogcmVzb2x2ZSA9PiByZXF1aXJlKFtgQC8ke20udGVtcGxhdGVVcmx9YF0sIHJlc29sdmUgKX07CiAgICAgICAgICAvL3BhcmVudC5jaGlsZHJlbi5wdXNoKHJvdXRlKTsKICAgICAgICAgIGlmIChtLmNoaWxkcmVuICYmIG0uY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICB0aGlzXy5hZGRTdWJNZW51cyh0aGF0LCBtLmNoaWxkcmVuKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIGFkZFRvUm91dGVyOiBmdW5jdGlvbiBhZGRUb1JvdXRlcih0aGF0LCByb3V0ZSkgewogICAgICB2YXIgcm91dGVzID0gdGhhdC4kcm91dGVyLm9wdGlvbnMucm91dGVzOwogICAgICB2YXIgaXNJbiA9IGZhbHNlOwogICAgICByb3V0ZXMuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgIGlmIChyLnBhdGggPT0gcm91dGUucGF0aCkgewogICAgICAgICAgaXNJbiA9IHRydWU7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKCFpc0luKSB7CiAgICAgICAgdGhhdC4kcm91dGVyLm9wdGlvbnMucm91dGVzLnB1c2gocm91dGUpOwogICAgICAgIHRoYXQuJHJvdXRlci5hZGRSb3V0ZXMoW3JvdXRlXSk7CiAgICAgIH0KICAgIH0sCiAgICBhZGRTeW5jTWVudXM6IGZ1bmN0aW9uIGFkZFN5bmNNZW51cyh0aGF0LCBtZW51cykgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKICAgICAgaWYgKG1lbnVzICYmIG1lbnVzLmNvbnN0cnVjdG9yID09PSBBcnJheSAmJiBtZW51cy5sZW5ndGggPiAwKSB7CiAgICAgICAgLy8g5pu05paw5b2T5YmN6YCJ5Lit55qE6I+c5Y2VCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgY3VyUm91dGVQYXRoID0gdGhhdC4kcm91dGUucGF0aDsKICAgICAgICAgIG1lbnVzLmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgICAgICAgICAgLy/lsIbliqjmgIHoj5zljZXmt7vliqDliLDot6/nlLEKICAgICAgICAgICAgaWYgKG0uY29kZSAhPSAnaG9tZScgJiYgbS5jb2RlICE9ICdzdGF0ZW1lbnQnICYmIHRoYXQubWVudU1hcHNbbS5jb2RlXSkgewogICAgICAgICAgICAgIC8vY29uc3Qgcm91dGUgPSB7cGF0aDogbS5wYXRoLCAgY29tcG9uZW50OiByZXNvbHZlID0+IHJlcXVpcmUoW2BALyR7bS50ZW1wbGF0ZVVybH1gXSwgcmVzb2x2ZSApfTsKICAgICAgICAgICAgICAvL+a3u+WKoOi3r+eUseS/oeaBrwogICAgICAgICAgICAgIGlmICh0aGF0Lm1lbnVNYXBzW20uY29kZV0gJiYgdGhhdC5tZW51TWFwc1ttLmNvZGVdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIF90aGlzMi5hZGRTdWJNZW51cyh0aGF0LCB0aGF0Lm1lbnVNYXBzW20uY29kZV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvL3RoaXMuYWRkVG9Sb3V0ZXIodGhhdCxyb3V0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHAgPSBuZXcgUmVnRXhwKCJeLyIuY29uY2F0KG0uYWxpYXMsICIvLiokIikpOwogICAgICAgICAgICBpZiAocC50ZXN0KGN1clJvdXRlUGF0aCkpIHsKICAgICAgICAgICAgICB0aGF0LmFjdGl2ZU1lbnVJbmRleCA9IG0uYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0sIDEwMCk7CiAgICAgIH0KICAgIH0KICB9Cn07CgovLyDlnKjmlbDnu4TkuIrmianlsZXkuIDkuKrliKDpmaTmjIflrprpobnnmoTmlrnms5UKQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpdGVtKSB7CiAgdGhpcy5zcGxpY2UodGhpcy5maW5kSW5kZXgoZnVuY3Rpb24gKHYpIHsKICAgIHJldHVybiB2ID09PSBpdGVtOwogIH0pLCAxKTsKfTsKCi8vIOWcqOaVsOe7hOS4iuaJqeWxleS4gOS4quWOu+mHjeeahOaWueazlQpBcnJheS5wcm90b3R5cGUudW5pcXVlID0gZnVuY3Rpb24gKGFyZykgewogIHZhciByZXMgPSBuZXcgTWFwKCk7CiAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7CiAgICBpZiAoYXJnKSB7CiAgICAgIHJldHVybiAhcmVzLmhhcyhtW2FyZ10pICYmIHJlcy5zZXQobVthcmddLCAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAhcmVzLmhhcyhtKSAmJiByZXMuc2V0KG0sIDEpOwogICAgfQogIH0pOwp9OwpleHBvcnQgZGVmYXVsdCB1dGlsczs="},null]}