{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSubDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSubDialog.vue","mtime":1705895419251},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge21hcFN0YXRlfSBmcm9tICd2dWV4Jw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnDQppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICdAL2hvdGVudC11aS11dGlsLmpzJw0KaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdlbGVtZW50LXVpJw0KaW1wb3J0IHJlcSBmcm9tICdAL3JlcXVlc3QuanMnDQppbXBvcnQgc3ViX3Bpb19taXhpbiBmcm9tICdAL3N1Yi1wZXJtaXNzaW9uLW1peGluLmpzJw0KaW1wb3J0IEVpcFRhZyBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBUYWcudnVlJw0KaW1wb3J0IEVpcFNlbGVjdERpYSBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3REaWEudnVlJw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIGNvbXBvbmVudHM6IHtFaXBUYWcsIEVpcFNlbGVjdERpYX0sDQogIG5hbWU6ICdlaXAtZGlhbG9nJywNCiAgcHJvcHM6IFsNCiAgICAndmFsaWRhdGUnLA0KICAgICd2YWx1ZScsDQogICAgJ25hbWUnLA0KICAgICdwZXJtaXNzaW9uJywNCiAgICAnYXR0ZXInLA0KICAgICdzaW5nbGUnLA0KICAgICdzZWxlY3RvcmNvbmZpZycsDQogICAgJ2N1c3RkaWFsb2cnLA0KICAgICdwbGFjZWhvbGRlcicsDQogICAgJ3Rvb2x0aXBwbGFjZW1lbnQnLA0KICAgICdpbml0RmlsbERhdGEnLA0KICAgICdpbml0RmlsbERhdGFUeXBlJywNCiAgICAncmVsYXRpb24nLA0KICAgICdtYXhSb3cnDQogIF0sDQogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLCAvL+a3t+WFpeaWueW8j+W8leWFpeihqOWNlee7hOS7tuS4reWFrOWFseWxnuaAp++8jOWkhOeQhuWtkOihqOOAgeWtmeihqOihjOWGheiBlOWKqO+8iOWIh+mdouS/ruaUuXBlcm1pc3Npb25fc3Vi77yJDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIGRhdGE6IHsNCiAgICAgICAgcXhkZDoge30NCiAgICAgIH0sDQogICAgICBpbnB1dFN1ZmZpeFdpZHRoOiAwLA0KICAgICAgcGxhY2Vob2xkZXJCbzogJycsDQogICAgICBxdWlja1NlYXJjaDogJycsIC8v5aGr5YaZ5o+Q56S6DQogICAgICBjb25kaXRpb25CaW5kOiBbXSwgLy/lj4LmlbDmn6Xor6LlrZfmrrUNCiAgICAgIG5vZGVLZXk6ICdJRF8nLCAvL+agkeW9ouaVsOaNrueItklkDQogICAgICBjdXN0b21EaWFsb2dTaG93TGlzdDogZmFsc2UsDQogICAgICBjdXN0b21EaWFsb2dTaG93VHJlZTogZmFsc2UsDQogICAgICBzZWxlY3RPcmdQcm9wczogew0KICAgICAgICBsYWJlbDogJ25hbWUnDQogICAgICB9LA0KICAgICAgc3R5bGU6ICcnLCAvL+WvueivneahhuWuvemrmA0KICAgICAgc2VsZWN0T3JnczogbnVsbCwNCiAgICAgIGlucHV0U3VmZml4SGVpZ2h0OiAzMywNCiAgICAgIGNvbmZpZzogbnVsbCwNCiAgICAgIHVwZGF0aW5nOiBmYWxzZSwNCiAgICAgIGRpc3BsYXlmaWVsZDogW10sIC8v5pi+56S65a2X5q61DQogICAgICBjdXN0b21EaWFsb2c6IHt9LA0KICAgICAgcXVlcnlQYXJhbTogJycsIC8v5p+l6K+i5p2h5Lu26L6T5YWl55qE5YC8DQogICAgICBwcm9wczE6IFtdLA0KICAgICAgc2hvd0RhdGE6IFtdLA0KICAgICAgY2hlY2tCb3hEYXRhQWxsOiBbXSwgLy/pgInkuK3lr7nosaHnmoTpm4blkIgNCiAgICAgIGRlZmF1bHRQcm9wczogew0KICAgICAgICBjaGlsZHJlbjogJ2NoaWxkcmVuJywNCiAgICAgICAgbGFiZWw6ICdsYWJlbCcNCiAgICAgIH0sDQogICAgICBwcm9wc0RhdGE6IFtdLA0KICAgICAgcXVlcnlzU2hvdzogZmFsc2UsIC8v5piv5ZCm5pi+56S65pCc57Si5qGGDQogICAgICB1bmRlZmluZWRhOiAnJywNCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVDQogICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgIHBhZ2U6IDEsDQogICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgdG90YWw6IDANCiAgICAgIH0sDQogICAgICBwYXJhbTogW10sIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61DQogICAgICB0cmVlTGlzdDogW10sDQogICAgICBkaXNwbGF5RmllbGQ6IHt9LA0KICAgICAgcXVlcnlQYXJhbXM6IFtdLA0KICAgICAgcGxhY2Vob2xkZXJzOiBbXSwNCiAgICAgIG9sZHNlbGVjdE9yZ3M6IFtdLA0KICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sDQogICAgICBjb21iaVRyZWVEaXNwbGF5RmllbGQ6IFtdLA0KICAgICAgY29tYmluYXRpb25UcmVlUXVlcnlzOiBbXSwNCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sDQogICAgICB0b2dnbGVCdG46ICdlbC1pY29uLWFycm93LWxlZnQnLA0KICAgICAgdHJlZVNob3c6IHRydWUsDQogICAgICB0cmFuc3Rpb25XaWR0aDogJzI1JScsDQogICAgICBsZWZ0VHJlZVRpdGxlOiAnJywNCiAgICAgIHdyaXRlYWJsZTogdHJ1ZSwNCiAgICAgIGlzU2hvdzogdHJ1ZQ0KICAgIH0NCiAgfSwNCiAgd2F0Y2g6IHsNCiAgICBwcm9wczE6IGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7DQogICAgICAvL+agkeW9og0KICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgbGV0IGRhdGEgPSBbXQ0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBkYXRhLnB1c2godGhpcy5zaG93RGF0YVtpXSkNCiAgICAgICAgfQ0KICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZChkYXRhW2ldLCB0cnVlKQ0KICAgICAgICAgICAgdGhpc18uY2hlY2tOb2RlKGRhdGFbaV0sIHRoaXNfKQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwgMjAwKQ0KICAgICAgfQ0KICAgIH0NCiAgfSwNCiAgbW91bnRlZCgpIHsNCiAgICBsZXQgcmVxdWVzdFR5cGUgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpWzBdLnNwbGl0KCcvJykNCiAgICBsZXQgaXNEb25lTGlzdCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcvJykNCiAgICBpZiAoDQogICAgICByZXF1ZXN0VHlwZVtyZXF1ZXN0VHlwZS5sZW5ndGggLSAxXSA9PSAnZ2V0JyB8fA0KICAgICAgcmVxdWVzdFR5cGVbcmVxdWVzdFR5cGUubGVuZ3RoIC0gMl0gPT0gJ2dldCcgfHwNCiAgICAgIGlzRG9uZUxpc3RbaXNEb25lTGlzdC5sZW5ndGggLSAxXSA9PSAnZG9uZUxpc3QnDQogICAgKSB7DQogICAgICB0aGlzLmlzU2hvdyA9IGZhbHNlDQogICAgfSBlbHNlIHsNCiAgICAgIGlmICh0aGlzLmluaXRGaWxsRGF0YSA9PSAndHJ1ZScpIHsNCiAgICAgICAgdGhpcy5pbml0VGVtcGxhdGVEYXRhKCkNCiAgICAgIH0NCiAgICB9DQogIH0sDQogIGNvbXB1dGVkOiBtYXBTdGF0ZSh7DQogICAgdG90YWw6IChzdGF0ZSkgPT4gc3RhdGUuZGlhbG9nLnRvdGFsLA0KICAgIGRpYWxvZ0RhdGE6IChzdGF0ZSkgPT4gew0KICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy5yb3dzDQogICAgfSwNCiAgICBpbnB1dFZhbDogZnVuY3Rpb24oKSB7DQogICAgICBpZiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZSA9PSAnfHxbXScpIHsNCiAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwgPSBbXQ0KICAgICAgICAvLyB0aGlzLnNob3dEYXRhID0gW107DQogICAgICAgIHJldHVybiBudWxsDQogICAgICB9IGVsc2Ugew0KICAgICAgICBsZXQgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoJywnKQ0KICAgICAgICBpZiAodGhpcy52YWx1ZS5pbmRleE9mKCd8fCcpID4gMCkgew0KICAgICAgICAgIG5hbWVBcnkgPSB0aGlzLnZhbHVlLnNwbGl0KCd8fCcpWzBdLnNwbGl0KCcsJykNCiAgICAgICAgICAvLyB0aGlzLnNob3dEYXRhPUpTT04ucGFyc2UodGhpcy52YWx1ZS5zcGxpdCgifHwiKVsxXSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsNCiAgICAgICAgbGV0IGlkQXJ5ID0gbnVsbA0KICAgICAgICBsZXQgYWNjb3VudEFyeSA9IG51bGwNCiAgICAgICAgbGV0IHJlc3VsdCA9IFtdDQogICAgICAgIG5hbWVBcnkuZm9yRWFjaCgobSwgaSkgPT4gew0KICAgICAgICAgIGxldCBuID0ge3ZhbHVlOiBtfQ0KICAgICAgICAgIHJlc3VsdC5wdXNoKG4pDQogICAgICAgIH0pDQogICAgICAgIHJldHVybiByZXN1bHQNCiAgICAgIH0NCiAgICB9LA0KICAgIGlucHV0V3JpdGVhYmxlOiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLndyaXRlYWJsZQ0KICAgICAgICA/IHV0aWxzLmdldFdyaXRlYWJsZSh0aGlzLnBlcm1pc3Npb25fc3ViKQ0KICAgICAgICA6IHRoaXMud3JpdGVhYmxlDQogICAgfSwNCiAgICBpbnB1dFZhbGlkYXRlOiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciB2YWxpZGF0ZU9iaiA9IHRoaXMuJHN0b3JlLnN0YXRlLmluZGV4LnZhbGlkYXRlDQogICAgICByZXR1cm4gdXRpbHMuYWRkUmVxdWlyZWRPck5vdCgNCiAgICAgICAgdGhpcy5wZXJtaXNzaW9uX3N1YiwNCiAgICAgICAgdGhpcy52YWxpZGF0ZSwNCiAgICAgICAgdmFsaWRhdGVPYmosDQogICAgICAgIHRoaXMNCiAgICAgICkNCiAgICB9LA0KICAgIGlucHV0TmFtZTogZnVuY3Rpb24oKSB7DQogICAgICBsZXQgbGFiZWxkZXNjID0gJycNCiAgICAgIGlmICgNCiAgICAgICAgdGhpcy4kc2xvdHMgJiYNCiAgICAgICAgdGhpcy4kc2xvdHMubGFiZWxkZXNjICYmDQogICAgICAgIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlbiAmJg0KICAgICAgICB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dA0KICAgICAgKSB7DQogICAgICAgIGxhYmVsZGVzYyA9IHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0DQogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCkgKyAnLScgKyBsYWJlbGRlc2MNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCkNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOaYr+WQpuacieWbnuWhq+iuvue9rg0KICAgIGJpbmRTZXQ6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3Jjb25maWcgPyB0aGlzLnNlbGVjdG9yY29uZmlnLmJpbmQgOiBudWxsDQogICAgfQ0KICB9KSwNCiAgY3JlYXRlZCgpIHsNCiAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIpIHsNCiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9ICfor7fpgInmi6nlhoXlrrknDQogICAgfSBlbHNlIHsNCiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9IHRoaXMucGxhY2Vob2xkZXINCiAgICB9DQogICAgdGhpcy4kdmFsaWRhdG9yID0gdGhpcy4kcm9vdC4kdmFsaWRhdG9yDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBzZWxlY3RBbGwoc2VsZWN0aW9uKSB7DQogICAgICBpZiAodGhpcy5vbGRzZWxlY3RPcmdzICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICBpZiAodGhpcy5pbmRleEFycmF5KHRoaXMub2xkc2VsZWN0T3Jncywgc2VsZWN0aW9uW3hdKSA9PT0gLTEpIHsNCiAgICAgICAgICAgIHRoaXMub2xkc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvblt4XSkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5vbGRzZWxlY3RPcmdzKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAoc2VsZWN0aW9uKQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2hlY2tOb2RlKGRhdGEsIHRoaXNfLCBwbm9kZSkgew0KICAgICAgaWYgKGRhdGEuUGlkKSB7DQogICAgICAgIGxldCBub2RlID0gdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKGRhdGEuUGlkKQ0KICAgICAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICAgIGlmIChub2RlLmRhdGEuUGlkKSB7DQogICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICAgICAgdGhpcy5jaGVja05vZGUoDQogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuZGF0YSwNCiAgICAgICAgICAgIHRoaXNfLA0KICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpDQogICAgICAgICAgKQ0KICAgICAgICB9DQogICAgICAgIGlmICghbm9kZS5pbmRldGVybWluYXRlKSB7DQogICAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZQ0KICAgICAgICB9DQogICAgICB9IGVsc2UgaWYgKHBub2RlICYmICFwbm9kZS5pbmRldGVybWluYXRlKSB7DQogICAgICAgIHBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICB9DQogICAgfSwNCiAgICAvL+Wbnui9puafpeivog0KICAgIHNlYXJjaEVudGVyRnVuOiBmdW5jdGlvbihlKSB7DQogICAgICB2YXIga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IGUua2V5Q29kZSA6IGUud2hpY2gNCiAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7DQogICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgIH0NCiAgICB9LA0KICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uKHNpemUpIHsNCiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZQ0KICAgICAgLy/mr4/pobXkuIvmi4nmmL7npLrmlbDmja4NCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemUNCiAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICB9LA0KICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uKGN1cnJlbnRQYWdlKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwKSB7DQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKChyb3cpID0+IHsNCiAgICAgICAgICBsZXQgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdykNCiAgICAgICAgICBpZiAocmVzID09IC0xKSB7DQogICAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAvL+eCueWHu+esrOWHoOmhtQ0KICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSBjdXJyZW50UGFnZQ0KICAgICAgdGhpcy5zZWFyY2goKQ0KICAgIH0sDQogICAgY2hlY2tMaXN0KCkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgLy/liJfooagNCiAgICAgICAgaWYgKA0KICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbCAhPSB1bmRlZmluZWQgJiYNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwubGVuZ3RoID4gMA0KICAgICAgICApIHsNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICAgICAgICBsZXQgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5kaWFsb2dEYXRhLCByb3cpDQogICAgICAgICAgICB0aGlzXy51bmRlZmluZWRhID0gcmVzDQogICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7DQogICAgICAgICAgICAgIHRoaXNfLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgICAgICAgICAgdGhpc18udG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdHJ1ZSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICB9LCAzMDApDQogICAgfSwNCiAgICB0b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB2YWwpIHsNCiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHRoaXMuZGlhbG9nRGF0YVtyZXNdLCB2YWwpDQogICAgfSwNCiAgICBzaG93RGlhbG9nKGl0ZW0pIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgLy/nrKzkuozmrKHngrnlh7vlrZDooajlm57loavlr7nor53moYYg56ys5LiA5qyh6YCJ5Lit55qE5pWw5o2u5LiN5piv6YCJ5Lit54q25oCBDQogICAgICBpZiAodGhpc18uc2VsZWN0T3Jncykgew0KICAgICAgICB0aGlzXy5zZWxlY3RPcmdzLmVtcHR5KCkNCiAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmVtcHR5KCkNCiAgICAgIH0NCiAgICAgIHZhciBhbGlhcyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmFsaWFzDQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCeUFsaWFzJywgYWxpYXMpLnRoZW4oY3VzdG9tRGlhbG9nID0+IHsNCiAgICAgICAgaWYgKCFjdXN0b21EaWFsb2cgfHwgIWN1c3RvbURpYWxvZy5hbGlhcykgew0KICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ+WvueivneahhuWIq+WQjeOAkCcgKyBhbGlhcyArICfjgJHkuI3lrZjlnKjvvIEnKQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgew0KICAgICAgICAgIHZhciBkaXNwbGF5bGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkNCiAgICAgICAgICB0aGlzXy5ub2RlS2V5ID0gZGlzcGxheWxpc3QuaWQNCiAgICAgICAgfQ0KICAgICAgICAvL+WvueivneahhuaMieihqOWNleWtl+auteafpeivou+8iOWPguaVsOS8oOWFpeeahO+8iQ0KICAgICAgICBsZXQgYmluZExpc3QgPSB0aGlzXy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuY29uZGl0aW9ucw0KICAgICAgICB0aGlzXy5wYXJhbSA9IFtdIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61DQogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgYmluZExpc3QuZm9yRWFjaChlbGUgPT4gew0KICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUNCiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gJzMnICYmIGVsZS5iaW5kKSB7DQogICAgICAgICAgICAgIGxldCBvYmogPSB7fQ0KICAgICAgICAgICAgICBvYmouZmllbGQgPSBlbGUuZmllbGQNCiAgICAgICAgICAgICAgb2JqLmJpbmQgPSBlbGUuYmluZA0KICAgICAgICAgICAgICB0aGlzXy5wYXJhbS5wdXNoKG9iaikNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICAgIC8v5Yik5pat5a+56K+d5qGG5p+l6K+i5piv5ZCm5pyJ5p2h5Lu2DQogICAgICAgIGxldCB1c2VySW5wdXRMaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpDQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJycgLy/loavlhpnmj5DnpLogcGxhY2Vob2xkZXINCiAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZCA9IFtdDQogICAgICAgIGxldCBxdWVyeVBhcmFtcyA9IFtdDQogICAgICAgIGxldCBwbGFjZWhvbGRlcnMgPSBbXQ0KICAgICAgICBpZiAodXNlcklucHV0TGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdXNlcklucHV0TGlzdC5mb3JFYWNoKGVsZSA9PiB7DQogICAgICAgICAgICB2YXIgb2JqID0ge30NCiAgICAgICAgICAgIC8v5p2h5Lu25p+l6K+i5Y+C5pWw77yI55So5oi36L6T5YWl55qE77yJIOaWh+acrOahhui+k+WFpQ0KICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMScpIHsNCiAgICAgICAgICAgICAgb2JqW2VsZS5maWVsZF0gPSAnJw0KICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKG9iaikNCiAgICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZC5wdXNoKGVsZSkNCiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goJ+ivt+i+k+WFpScgKyBlbGUuY29tbWVudCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIHRoaXMuJHNldCh0aGlzLCAncXVlcnlQYXJhbXMnLCBxdWVyeVBhcmFtcykNCiAgICAgICAgICB0aGlzLiRzZXQodGhpcywgJ3BsYWNlaG9sZGVycycsIHBsYWNlaG9sZGVycykNCiAgICAgICAgfQ0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYvuekuuadoeS7tuafpeivoui+k+WFpeahhg0KICAgICAgICBpZiAodGhpc18ucXVpY2tTZWFyY2ggIT0gJycpIHsNCiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSB0cnVlDQogICAgICAgIH0NCiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAn6K+36L6T5YWlJyArIHRoaXMucXVpY2tTZWFyY2ggKyAn5p+l6K+iJw0KICAgICAgICB0aGlzXy5zdHlsZSA9ICdoZWlnaHQ6JyArIGN1c3RvbURpYWxvZy5oZWlnaHQgKyAncHgnDQogICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmhlaWdodCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA8PSA5MDApIHsNCiAgICAgICAgICB0aGlzLnN0eWxlID0gJ2hlaWdodDo0NDBweCcNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDAgfHwgY3VzdG9tRGlhbG9nLnN0eWxlID09IDIpIHsNCiAgICAgICAgICAvL+WIl+ihqA0KICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3coe2FsaWFzOiBhbGlhcywgY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2d9KQ0KICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7DQogICAgICAgICAgLy/moJHlvaINCiAgICAgICAgICB0aGlzXy5wYWdlUGFyYW0gPSB7YWxpYXM6IGFsaWFzLCBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZ30NCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSBjdXN0b21EaWFsb2cNCiAgICAgICAgICBsZXQgcGFyYW0gPSB7fQ0KICAgICAgICAgIHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZSA9IFtdDQogICAgICAgICAgLy/liKTmlq3mmK/lkKblrZjlnKjmnaHku7YNCiAgICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7DQogICAgICAgICAgICB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkNCiAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpc18uY29uZGl0aW9uZmllbGRUcmVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICAgICAgLy/liKTmlq3mnaHku7blrZfmrrXmmK/lkKbmmK/liqjmgIHkvKDlhaXvvIhkZWZhdWx0VHlwZe+8mjTvvJrliqjmgIHkvKDlhaXvvIwy77ya5Zu65a6a5YC8IO+8iQ0KICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZGVmYXVsdFR5cGUgPT0gJzQnKSB7DQogICAgICAgICAgICAgICAgICBwYXJhbVt0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZmllbGRdID0gdGhpc18uY29uZGl0aW9uZmllbGRUcmVlW2ldLmNvbW1lbnQNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgLy/mnInliqjmgIHkvKDlhaXnmoTlrZfmrrUNCiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocGFyYW0pICE9ICd7fScpIHsNCiAgICAgICAgICAgIHRoaXNfLmRpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8v5peg5Yqo5oCB5Lyg5YWl55qE5a2X5q61DQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dUcmVlU2hvdyh0aGlzXy5wYWdlUGFyYW0pDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgLy/liKTmlq3mlbDmja7mmK/lkKbljIXlkKvmn5DkuKrlr7nosaHvvIzlubbov5Tlm57mlbDmja7ljIXlkKvlr7nosaHnmoTkuIvmoIcNCiAgICBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7DQogICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApIHsNCiAgICAgICAgcmV0dXJuIC0xDQogICAgICB9DQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcnJheVtpXSkgPT0gSlNPTi5zdHJpbmdpZnkoaXRlbSkpIHsNCiAgICAgICAgICByZXR1cm4gaQ0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gLTENCiAgICB9LA0KICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5Liq5aSN6YCJ5qGG5pe26Kem5Y+RDQogICAgb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsNCiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2UNCiAgICAgIC8v5Yik5pat54K55Ye75YiX6KGo5pWw5o2u5pe25aSN6YCJ5qGG5piv5ZCm5Yu+6YCJICBzZWxlY3RlZO+8mnRydWXkuI3li77pgInvvIxmYWxzZeWLvumAiQ0KICAgICAgbGV0IHNlbGVjdGVkID0NCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzICYmDQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmDQogICAgICAgIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xDQogICAgICBpZiAoc2VsZWN0ZWQpIHsNCiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAgIGxldCByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpDQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgfQ0KICAgIH0sDQogICAgLy/ngrnlh7vliJfooajmn5DkuIDmnaHmlbDmja7ml7bop6blj5ENCiAgICBvcmdSb3dDbGljayhyb3csIGNvbHVtbiwgZXZlbnQpIHsNCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKS50cmlnZ2VyKA0KICAgICAgICAgICdjbGljaycNCiAgICAgICAgKQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChyb3cpDQogICAgICB9IGVsc2UgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxKSB7DQogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2UNCiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJDQogICAgICAgIGxldCBzZWxlY3RlZCA9DQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzICYmDQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYNCiAgICAgICAgICB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMQ0KICAgICAgICBpZiAoc2VsZWN0ZWQpIHsNCiAgICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgICAgICBsZXQgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KQ0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHJvdykNCiAgICAgIH0NCiAgICB9LA0KICAgIC8v5YiX6KGo5aSN6YCJ5qGG5pyJ5pS55Y+Y5pe26Kem5Y+RDQogICAgb3JnVGFibGVTZWxlY3Rpb24oc2VsZWN0aW9uKSB7DQogICAgICAvL+WFqOmAieeahOaDheWGteeJueauiuWkhOeQhijkuLrkuobkuI7ljp/mnKzlip/og73pgLvovpHkuI3lhrLnqoEs5YWI5aSN5Yi25LiA5Lu95pen55qE6YCJ5Lit5pWw5o2uLueEtuWQjuaLv+WIsOWFqOmAieS6i+S7tuS4reWOu+iuoeeulykNCiAgICAgIHRoaXMub2xkc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMuc2VsZWN0T3JncykNCiAgICAgIC8v5aSa6YCJDQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEgJiYgIXRoaXMuaXNDdXJyZW50Q2hhbmdlKSB7DQogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYNCiAgICAgICAgICAgICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkNCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IHNlbGVjdGlvbg0KICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApICYmDQogICAgICAgICAgICBzZWxlY3Rpb24ubGVuZ3RoID4gMQ0KICAgICAgICAgICkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWxlY3Rpb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0N1cnJlbnRDaGFuZ2UgJiYgc2VsZWN0aW9uLmxlbmd0aCA+PSAxMCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGZvciAobGV0IHUgPSB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoIC0gMTsgdSA+PSAwOyB1LS0pIHsNCiAgICAgICAgICAgICAgICBsZXQgcmVzID0gdGhpcy5pbmRleEFycmF5KHNlbGVjdGlvbiwgdGhpcy5zZWxlY3RPcmdzW3VdKQ0KICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmb3IgKGxldCBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltpXSkNCiAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGRpYWxvZ0NvbmZpcm0oKSB7DQogICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36YCJ5oup5pWw5o2u5Zue5aGrJykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSAnJw0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlDQogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKQ0KICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpDQogICAgfSwNCiAgICAvL+mHjee9rg0KICAgIHJlc2V0KCkgew0KICAgICAgdGhpcy5xdWVyeVBhcmFtcy5mb3JFYWNoKChwYXJhbU9iaikgPT4gew0KICAgICAgICBmb3IgKGxldCBrZXkgaW4gcGFyYW1PYmopIHsNCiAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW2tleV0gPSAnJw0KICAgICAgICB9DQogICAgICB9KQ0KICAgICAgLy/nu4TlkIjmoJHph43nva4NCiAgICAgIGlmICh0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZSkgew0KICAgICAgICBsZXQgbm9kZXMgPSB0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZS5zdG9yZS5ub2Rlc01hcA0KICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9kZXMpIHsNCiAgICAgICAgICBub2Rlc1trZXldLmV4cGFuZGVkID0gZmFsc2UNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApDQogICAgICB0aGlzLnNlYXJjaCh0cnVlKQ0KICAgIH0sDQogICAgLy/mn6Xor6INCiAgICBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsNCiAgICAgIGxldCBxdWVyeXMgPSBbXSAvL+afpeivouadoeS7tg0KICAgICAgbGV0IHF1ZXJ5RmlsdGVyID0ge30NCiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnBhZ2luYXRpb24pID09ICd7fScpIHsNCiAgICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge3BhZ2U6IDEsIHBhZ2VTaXplOiAyMCwgc2hvd1RvdGFsOiAndHJ1ZSd9DQogICAgICB9DQogICAgICBsZXQgcGFnZUJlYW4gPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbn0NCiAgICAgIGlmIChyZXNldFBhZ2ludGlvbikgew0KICAgICAgICBwYWdlQmVhbi5wYWdlQmVhbiA9IHtwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogJ3RydWUnfQ0KICAgICAgfQ0KICAgICAgLy/nlKjmiLfovpPlhaXnmoQNCiAgICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zLmxlbmd0aCAhPSAwICYmIHRoaXMucXVlcnlQYXJhbXNbMF0gIT0gJycpIHsNCiAgICAgICAgdGhpcy5jb25kaXRpb25CaW5kLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7DQogICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsDQogICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeVBhcmFtc1tpdGVtLmZpZWxkXSwNCiAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywNCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgIH0pDQogICAgICAgIH0pDQogICAgICB9DQogICAgICAvL+WPguaVsOS8oOWFpeeahOafpeivouaLvOaOpQ0KICAgICAgaWYgKHRoaXMucGFyYW0pIHsNCiAgICAgICAgY29uc3QgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcykNCiAgICAgICAgdGhpcy5wYXJhbS5mb3JFYWNoKChpdGVtKSA9PiB7DQogICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsDQogICAgICAgICAgICB2YWx1ZTogdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIGl0ZW0uYmluZCksDQogICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICB9KQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQNCiAgICAgIGlmICgNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDANCiAgICAgICkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pDQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgaWYgKHF1ZXJ5cy5sZW5ndGggPiAwKSB7DQogICAgICAgIHF1ZXJ5RmlsdGVyID0ge3BhZ2VCZWFuOiBwYWdlQmVhbi5wYWdlQmVhbiwgcXVlcnlzfQ0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHF1ZXJ5RmlsdGVyDQogICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgLmRpc3BhdGNoKCdkaWFsb2cvZ2V0bGlzdEpzb24nLCB0aGlzLmN1c3RvbURpYWxvZykNCiAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICB0aGlzLmNoZWNrTGlzdCgpDQogICAgICAgICAgfSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcGFnZUJlYW4NCiAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAuZGlzcGF0Y2goJ2RpYWxvZy9nZXRsaXN0SnNvbicsIHRoaXMuY3VzdG9tRGlhbG9nKQ0KICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgIHRoaXMuY2hlY2tMaXN0KCkNCiAgICAgICAgICB9KQ0KICAgICAgfQ0KICAgIH0sDQogICAgYXN5bmMgZG9RdWVyeShwYXJhbSkgew0KICAgICAgbGV0IHBhcmFtTG9hZERhdGEgPSBbXQ0KICAgICAgY29uc3QgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcykNCiAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwDQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGlmIChwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGggIT0gJycpIHsNCiAgICAgICAgICBsZXQgYmluZFZhbCA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGgsDQogICAgICAgICAgICBudWxsDQogICAgICAgICAgKQ0KICAgICAgICAgIGxldCBvYmogPSB7a2V5OiBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZCwgdmFsdWU6IGJpbmRWYWx9DQogICAgICAgICAgcGFyYW1Mb2FkRGF0YS5wdXNoKG9iaikNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBsZXQgcXVlcnlVcmwgPQ0KICAgICAgICBwYXJhbS5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnDQogICAgICAgICAgPyAnJHtmb3JtfS9mb3JtL2N1c3RvbVF1ZXJ5L3YxL2RvUXVlcnk/YWxpYXM9JyArDQogICAgICAgICAgcGFyYW0uYWxpYXMgKw0KICAgICAgICAgICcmcGFnZT0xJw0KICAgICAgICAgIDogcGFyYW0udXJsDQogICAgICBsZXQgcmVxdWVzdE1ldGhvZCA9ICdQT1NUJw0KICAgICAgLy/lpoLmnpzlhbPogZTmlbDmja7liJfooajmn6Xor6LmlbDmja7kuI3mmK/mlbDmja7mupDliJnor7fmsYLmlrnms5XkuLpyZXN0ZnVs6YWN572u55qE6K+35rGC5pa55byPDQogICAgICBpZiAocGFyYW0uZHNUeXBlICE9ICdkYXRhU291cmNlJykgew0KICAgICAgICByZXF1ZXN0TWV0aG9kID0gcGFyYW0ucmVxdWVzdFR5cGUNCiAgICAgIH0NCiAgICAgIC8v5p+l6K+i5pWw5o2uDQogICAgICByZXENCiAgICAgICAgLnJlcXVlc3Qoe3VybDogcXVlcnlVcmwsIG1ldGhvZDogcmVxdWVzdE1ldGhvZCwgZGF0YTogcGFyYW1Mb2FkRGF0YX0pDQogICAgICAgIC50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICAvL+WIpOaWreaYr+WQpuacieWFs+iBlOafpeivouaVsOaNrui/lOWbng0KICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwDQogICAgICAgICAgICBmb3IgKGxldCBpbyA9IDA7IGlvIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpbysrKSB7DQogICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICcnKSB7DQogICAgICAgICAgICAgICAgbGV0IHZhbCA9ICcnDQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMuZGF0YS5yb3dzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9DQogICAgICAgICAgICAgICAgICAgICAgdmFsICsgcmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdICsgJywnDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpDQogICAgICAgICAgICAgICAgbGV0IHBhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgdmFsLA0KICAgICAgICAgICAgICAgICAgICBudWxsDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7DQogICAgICAgICAgICAgICAgICAvL+WtkOihqA0KICAgICAgICAgICAgICAgICAgbGV0IHN1YkRhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dDQogICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YS5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOayoeaVsOaNrueahOaDheWGtQ0KICAgICAgICAgICAgICAgICAgICBsZXQgc3ViVGFiTmFtZSA9IHBhdGhBcnJbMl0ucmVwbGFjZSgnc3ViXycsICcnKQ0KICAgICAgICAgICAgICAgICAgICAvL+W+l+WIsOWtkOihqOeahOaJgOacieWtl+autQ0KICAgICAgICAgICAgICAgICAgICBsZXQgc3ViSW5pdERhdGEgPQ0KICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge30NCiAgICAgICAgICAgICAgICAgICAgLy/miormlbDnu4Tph4zpnaLnmoTlgLzkuLogbnVsbCDovazmjaLkuLrnqbrlrZfnrKbkuLINCiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IEpTT04uc3RyaW5naWZ5KHN1YkluaXREYXRhKS5yZXBsYWNlKA0KICAgICAgICAgICAgICAgICAgICAgIC9udWxsL2csDQogICAgICAgICAgICAgICAgICAgICAgJyIiJw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gSlNPTi5wYXJzZShzdHIpDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdWJEYXRhKSB7DQogICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZnooajmmK/lkKbmnInlgLwNCiAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ3N1Yl8nKSA9PSAwICYmIHN1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhW2tleV0gPSBbXSAvL+acieWImea4heepug0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtl+auteaYr+WQpuacieWAvA0KICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJEYXRhW2tleV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YkRhdGFba2V5XSA9ICcnIC8v5pyJ5YiZ5riF56m6DQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8v5paw5aKe5LiA5p2h5pWw5o2uDQogICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0ucHVzaChzdWJEYXRhKQ0KICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQ0KICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbCwNCiAgICAgICAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5pyJ5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgc3ViRGF0YS5sZW5ndGg7IHArKykgew0KICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgoDQogICAgICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsDQogICAgICAgICAgICAgICAgICAgICAgICB2YWwsDQogICAgICAgICAgICAgICAgICAgICAgICBwDQogICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8v5rKh5pyJ6L+U5Zue55qE5YC85YiZ5riF56m6DQogICAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsA0KICAgICAgICAgICAgZm9yIChsZXQgaW9wID0gMDsgaW9wIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpb3ArKykgew0KICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGggIT0gJycpIHsNCiAgICAgICAgICAgICAgICBsZXQgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAnJywNCiAgICAgICAgICAgICAgICAgICAgbnVsbA0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgew0KICAgICAgICAgICAgICAgICAgLy/lrZDooagNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXQ0KICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBzdWJEYXRhLmxlbmd0aDsgcCsrKSB7DQogICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LA0KICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgICcnLA0KICAgICAgICAgICAgICAgICAgICAgIHANCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICB9LA0KICAgIC8vIOWQjOatpemAieaLqee7k+aenA0KICAgIHN5bmNJbnB1dFZhbHVlKCkgew0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICAvL+aLv+WIsOi/lOWbnueahOWtl+autQ0KICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBzdHIgPSBbXQ0KICAgICAgdmFyIGlkcyA9IFtdDQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgew0KICAgICAgICBmaWVsZFtpXSA9DQogICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgICAgPyByZXR1cm5TdHJbaV0uZmllbGQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgOiByZXR1cm5TdHJbaV0uZmllbGQNCiAgICAgICAgY29tbWVudFtpXSA9DQogICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgICAgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICA6IHJldHVyblN0cltpXS5jb21tZW50DQogICAgICB9DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKHJvdyA9PiB7DQogICAgICAgIGlmICh0aGlzXy5jaGVja0JveERhdGFBbGwgfHwgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpDQogICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpc18uaW5kZXhBcnJheSkuaW5kZXhPZihKU09OLnN0cmluZ2lmeShyb3cpKSA9PSAtMQ0KICAgICAgICApIHsNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0T3Jncw0KDQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgbGV0IGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzWzBdW2ZpZWxkW2ldXSkNCiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIGVuY29kZVN0ciArICciLCcNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nDQogICAgICAgIH0NCiAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpDQogICAgICAgIGlkcy5wdXNoKHNbMF0uaWQpDQogICAgICB9IGVsc2Ugew0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICBsZXQgZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKQ0KICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnDQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7DQogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICAgIH0NCiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSkNCiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBjb25zdCByZXR1cm5EYXRhID0gc3RyDQogICAgICBjb25zdCBfdGhpcyA9IHRoaXMNCiAgICAgIGNvbnN0IGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpDQogICAgICAvL+WkhOeQhuiHquWKqOWbnuWhq+mFjee9rg0KICAgICAgdGhpcy5pbnN0SWQgPSBmb3JtSW5zdC4kcGFyZW50Lmluc3RJZA0KICAgICAgbGV0IGN1c3REaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2cNCiAgICAgIGxldCBmaWxsT3JnID0ge30NCiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCkgew0KICAgICAgICBjb25zdCBuYW1lUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUuc3BsaXQoJy4nKQ0KICAgICAgICBjb25zdCBvcmdOYW1lRmllbGQgPSBuYW1lUGF0aFtuYW1lUGF0aC5sZW5ndGggLSAxXQ0KICAgICAgICBmaWxsT3JnW29yZ05hbWVGaWVsZF0gPSB0aGlzLmZpbGxPcmcubmFtZQ0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuaWQpIHsNCiAgICAgICAgICBjb25zdCBpZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZC5zcGxpdCgnLicpDQogICAgICAgICAgY29uc3Qgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoIC0gMV0NCiAgICAgICAgICBmaWxsT3JnW29yZ0lkRmllbGRdID0gdGhpcy5maWxsT3JnLmlkDQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUpIHsNCiAgICAgICAgICBjb25zdCBjb2RlUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUuc3BsaXQoJy4nKQ0KICAgICAgICAgIGNvbnN0IG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aCAtIDFdDQogICAgICAgICAgZmlsbE9yZ1tvcmdDb2RlRmllbGRdID0gdGhpcy5maWxsT3JnLmNvZGUNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCkgew0KICAgICAgICBjb25zdCBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJykNCiAgICAgICAgY29uc3QgaW5zdElkRmllbGQgPSBpbnN0SWRQYXRoW2luc3RJZFBhdGgubGVuZ3RoIC0gMV0NCiAgICAgICAgZmlsbE9yZ1tpbnN0SWRGaWVsZF0gPSB0aGlzLmluc3RJZA0KICAgICAgfQ0KICAgICAgdHJ5IHsNCiAgICAgICAgbGV0IHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aA0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqA0KICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgew0KICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+S4gOWvueS4gOWtkOihqOWPquiDvemAieaLqeS4gOadoeaVsOaNricpDQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWUNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsDQogICAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge30NCiAgICAgICAgICB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgew0KICAgICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoJy4nKQ0KICAgICAgICAgICAgICB2YXIgZnJvbSA9ICcnDQogICAgICAgICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgew0KICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKHJvd1tmcm9tXSA9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBmcm9tID0gZnJvbS50b1VwcGVyQ2FzZSgpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgc3ViTGluZURhdGFbDQogICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXlbdGFyZ2V0QXJyYXkubGVuZ3RoIC0gMV0NCiAgICAgICAgICAgICAgICBdID0gZGVjb2RlVVJJQ29tcG9uZW50KHJvd1tmcm9tXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgew0KICAgICAgICAgICAgdmFyIHN1YkJvID0gZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dDQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtkOihqOaVsOaNruacgOWkp+ihjOaVsA0KICAgICAgICAgICAgaWYgKHRoaXNfLm1heFJvdyAhPSAwICYmIChzdWJCby5sZW5ndGggKyByZXR1cm5TaXplKSA+IHRoaXNfLm1heFJvdykgew0KICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcign5a2Q6KGo5pWw5o2u5bey6LaF6L+H5pyA5aSn6KGM5pWw44CQJyArIHRoaXNfLm1heFJvdyArICfjgJEnKQ0KICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWUNCiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmRJdGVyYXRpdmUnKQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL+WtkOihqOS4reeahOWtmeihqOWunuS9k++8iOWPr+iDveWtmOWcqOWkmuS4qu+8iQ0KICAgICAgICAgICAgbGV0IHN1bkJvcyA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCgNCiAgICAgICAgICAgICAgX3RoaXMuJGVsLA0KICAgICAgICAgICAgICAnc3VuQm9zJw0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgLy/lpoLmnpzlrZjlnKjlrZnooajlrp7kvZPliJnmiYvliqjmt7vliqDnqbrlrZnooajmlbDnu4Tlr7nosaENCiAgICAgICAgICAgIGlmIChzdW5Cb3MpIHsNCiAgICAgICAgICAgICAgbGV0IGFycmF5Qm8gPSBzdW5Cb3Muc3BsaXQoJywnKQ0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Qm8ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQga2V5ID0gJ3N1Yl8nICsgYXJyYXlCb1tpXQ0KICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IG5ldyBBcnJheSgpDQogICAgICAgICAgICAgICAgc3ViTGluZURhdGFba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Q6KGoDQogICAgICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZmlsbE9yZyAmJiBKU09OLnN0cmluZ2lmeShmaWxsT3JnKSAhPSAne30nKSB7DQogICAgICAgICAgICAgIHN1YkxpbmVEYXRhID0gey4uLnN1YkxpbmVEYXRhLCAuLi5maWxsT3JnfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc3ViQm8ucHVzaChzdWJMaW5lRGF0YSkNCiAgICAgICAgICAgIHJldHVyblNpemUtLQ0KICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgaWYgKGUubWVzc2FnZSAhPSAnRW5kSXRlcmF0aXZlJykgdGhyb3cgZQ0KICAgICAgfQ0KDQogICAgfSwNCiAgICAvL+WPlua2iOaMiemSrg0KICAgIGRpYWxvZ0NhbmNlbCgpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgdGhpc18ucXVlcnlQYXJhbSA9ICcnDQogICAgICB0aGlzXy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pLnRoZW4oKCkgPT4gew0KICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlDQogICAgICAgIC8v5Yik5pat5piv5ZCm5piv54K55Ye75LqG56Gu6K6k5YaN54K55Ye75Y+W5raI55qEICBpbnB1dFZhbOayoeacieWAvOWImeihqOekuuebtOaOpeeCueWHu+eahOWPlua2iA0KICAgICAgICBpZiAoIXRoaXNfLmlucHV0VmFsKSB7DQogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IFtdDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IFsuLi50aGlzXy5zaG93RGF0YV0NCiAgICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IFsuLi50aGlzXy5zZWxlY3RPcmdzXQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgZGlhbG9nVHJlZUNvbmZpcm0oKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIGlmICh0aGlzXy5wcm9wc0RhdGEubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+ivt+mAieaLqeaVsOaNruWbnuWhqycpDQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pDQogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCkNCiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgc3RyID0gW10NCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGZpZWxkW2ldID0gcmV0dXJuU3RyW2ldLmZpZWxkDQogICAgICAgIGNvbW1lbnRbaV0gPSByZXR1cm5TdHJbaV0uY29tbWVudA0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YVswXQ0KICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJw0KICAgICAgICB9DQogICAgICAgIGlmICh0ZW1wICE9ICcnKSB7DQogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfScNCiAgICAgICAgfQ0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhDQogICAgICAgIG5vZGVzLmZvckVhY2goKGl0ZW0sIGspID0+IHsNCiAgICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCcNCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNba11bZmllbGRbaV1dICsgJyIsJw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfScNCiAgICAgICAgICB9DQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpDQogICAgICAgIH0pDQogICAgICB9DQogICAgICBjb25zdCByZXR1cm5EYXRhID0gc3RyDQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgdHJ5IHsNCiAgICAgICAgbGV0IHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aA0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqA0KICAgICAgICBpZiAodGhpc18ucmVsYXRpb24gJiYgdGhpc18ucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgew0KICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+S4gOWvueS4gOWtkOihqOWPquiDvemAieaLqeS4gOadoeaVsOaNricpDQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWUNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsDQogICAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge30NCiAgICAgICAgICB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgew0KICAgICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoJy4nKQ0KICAgICAgICAgICAgICB2YXIgZnJvbSA9ICcnDQogICAgICAgICAgICAgIGlmICh0aGlzXy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgew0KICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKHJvd1tmcm9tXSA9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBmcm9tID0gZnJvbS50b1VwcGVyQ2FzZSgpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgc3ViTGluZURhdGFbDQogICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXlbdGFyZ2V0QXJyYXkubGVuZ3RoIC0gMV0NCiAgICAgICAgICAgICAgICBdID0gZGVjb2RlVVJJQ29tcG9uZW50KHJvd1tmcm9tXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgew0KICAgICAgICAgICAgdmFyIHN1YkJvID0gZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dDQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtkOihqOaVsOaNruacgOWkp+ihjOaVsA0KICAgICAgICAgICAgaWYgKHRoaXNfLm1heFJvdyAhPSAwICYmIChzdWJCby5sZW5ndGggKyByZXR1cm5TaXplKSA+IHRoaXNfLm1heFJvdykgew0KICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcign5a2Q6KGo5pWw5o2u5bey6LaF6L+H5pyA5aSn6KGM5pWw44CQJyArIHRoaXNfLm1heFJvdyArICfjgJEnKQ0KICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWUNCiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmRJdGVyYXRpdmUnKQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL+WtkOihqOS4reeahOWtmeihqOWunuS9k++8iOWPr+iDveWtmOWcqOWkmuS4qu+8iQ0KICAgICAgICAgICAgbGV0IHN1bkJvcyA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCgNCiAgICAgICAgICAgICAgdGhpc18uJGVsLA0KICAgICAgICAgICAgICAnc3VuQm9zJw0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgLy/lpoLmnpzlrZjlnKjlrZnooajlrp7kvZPliJnmiYvliqjmt7vliqDnqbrlrZnooajmlbDnu4Tlr7nosaENCiAgICAgICAgICAgIGlmIChzdW5Cb3MpIHsNCiAgICAgICAgICAgICAgbGV0IGFycmF5Qm8gPSBzdW5Cb3Muc3BsaXQoJywnKQ0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Qm8ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQga2V5ID0gJ3N1Yl8nICsgYXJyYXlCb1tpXQ0KICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IG5ldyBBcnJheSgpDQogICAgICAgICAgICAgICAgc3ViTGluZURhdGFba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Q6KGoDQogICAgICAgICAgICBpZiAodGhpc18ucmVsYXRpb24gJiYgdGhpc18ucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKQ0KICAgICAgICAgICAgcmV0dXJuU2l6ZS0tDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gZmFsc2UNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgaWYgKGUubWVzc2FnZSAhPSAnRW5kSXRlcmF0aXZlJykgdGhyb3cgZQ0KICAgICAgfQ0KDQoNCiAgICB9LA0KICAgIGRpYWxvZ0NhbmNlbFRyZWUoKSB7DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZQ0KICAgIH0sDQogICAgZ2V0Q2hlY2tlZChkYXRhLCBjaGVja2VkLCBpbmRldGVybWluYXRlKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW10NCiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSB0aGlzLiRyZWZzLnRyZWUuZ2V0Q2hlY2tlZE5vZGVzKCkNCiAgICAgIH0NCiAgICB9LA0KICAgIHRyZWVDbGljayhkYXRhLCBuLCBpKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW10NCiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJBbGxTZWxlY3RPcmdzKCkgew0KICAgICAgdGhpcy5zZWxlY3RPcmdzID0gbnVsbA0KICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS5jbGVhclNlbGVjdGlvbigpDQogICAgfSwNCiAgICByZW1vdmVTZWxlY3RPcmcoaXRlbSkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsICcnKQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpDQogICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpDQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmlucHV0VmFsLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICAvLyBsZXQgcmVtb3ZlSWQgPSB0aGlzLnNob3dEYXRhW2l0ZW1dOw0KICAgICAgICAvL+agkeW9og0KICAgICAgICBpZiAodGhpcy5wcm9wc0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHRoaXMucHJvcHNEYXRhLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICB9DQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICB9DQogICAgICAgIC8v5YiX6KGoDQogICAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gbnVsbCkgew0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbC5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsNCiAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZQ0KICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBmYWxzZSkNCiAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpDQogICAgICAgIGxldCB2YWx1ZSA9ICcnDQogICAgICAgIHRoaXMuaW5wdXRWYWwuZm9yRWFjaCgodmFsKSA9PiB7DQogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgJywnDQogICAgICAgIH0pDQogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoIC0gMSkNCiAgICAgICAgfQ0KICAgICAgICBpZiAodmFsdWUgIT0gJycpIHsNCiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJ3x8JyArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpDQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSkNCiAgICAgIH0NCiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKQ0KICAgIH0sDQogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICBpZiAoIXRoaXMuJHJlZnMudGFnU3BhbnMpIHJldHVybg0KICAgICAgICBpZiAodGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsNCiAgICAgICAgICB0aGlzLmlucHV0U3VmZml4SGVpZ2h0ID0gdGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy5pbnB1dFN1ZmZpeEhlaWdodCA9IDMwDQogICAgICAgIH0NCiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BDQogICAgICAgIHRoaXMuJHZhbGlkYXRvci52YWxpZGF0ZSgpDQogICAgICB9LCAwKQ0KICAgIH0sDQogICAgY3VzdG9tRGlhbG9nU2hvdyhwYWdlUGFyYW0pIHsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlDQogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnF1ZXJ5VXJsID0NCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgID8gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9JyArDQogICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuYWxpYXMgKw0KICAgICAgICAgICcmbWFwUGFyYW09JyArDQogICAgICAgICAgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAnJykNCiAgICAgICAgICA6IHRoaXMuY3VzdG9tRGlhbG9nLnVybA0KICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPCAxKSB7DQogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogJ3RydWUnfQ0KICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkNCiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScpIHsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkWw0KICAgICAgICAgICAgICBpDQogICAgICAgICAgICAgIF0uZmllbGQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMSkgew0KICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICB9DQogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpDQogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFsNCiAgICAgICAgICAgICAgaQ0KICAgICAgICAgICAgICBdLmZpZWxkLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgew0KICAgICAgdGhpcy5jdXN0b21EaWFsb2cgPSBwYWdlUGFyYW0uY3VzdG9tRGlhbG9nDQogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2cNCiAgICAgIHZhciBtYXBQYXJhbSA9ICcnDQogICAgICBpZiAocGFnZVBhcmFtLnBhcmFtICE9IHVuZGVmaW5lZCkgew0KICAgICAgICBtYXBQYXJhbSA9IEpTT04uc3RyaW5naWZ5KHBhZ2VQYXJhbS5wYXJhbSkNCiAgICAgICAgbWFwUGFyYW0gPSBtYXBQYXJhbS5zdWJzdHJpbmcoMSwgbWFwUGFyYW0ubGVuZ3RoIC0gMSkNCiAgICAgIH0NCiAgICAgIHZhciByZXF1ZXN0VHlwZSA9DQogICAgICAgIGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnDQogICAgICAgICAgPyAnR0VUJw0KICAgICAgICAgIDogY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlDQogICAgICAgICAgICA/IGN1c3RvbURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgICAgOiAnUE9TVCcNCiAgICAgIHZhciB1cmwgPQ0KICAgICAgICAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsNCiAgICAgICAgcGFnZVBhcmFtLmFsaWFzICsNCiAgICAgICAgJyZtYXBQYXJhbT0nICsNCiAgICAgICAgbWFwUGFyYW0NCiAgICAgIHZhciBwYXJhbXNPYmogPSB7fQ0KICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgIHVybCA9IGN1c3RvbURpYWxvZy51cmwNCiAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSBjdXN0b21EaWFsb2cuZGF0YVBhcmFtDQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpIHsNCiAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKQ0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV0NCiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpIHsNCiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhID0gdGVtcGxhdGVQYS5yZXBsYWNlKA0KICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLA0KICAgICAgICAgICAgICAgICAgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicNCiAgICAgICAgICAgICAgdXJsID0gdXJsICsgbGpDaGFyICsgY29uLmZpZWxkICsgJz0nICsgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgew0KICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fQ0KICAgICAgcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9IHJlcXVlc3RUeXBlDQogICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybA0KICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmoNCiAgICAgIHRoaXMuc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKQ0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWUNCiAgICB9LA0KICAgIC8v5qCR5b2i5p+l6K+iDQogICAgc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIGxldCBxdWVyeSA9DQogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPT0gJ1BPU1QnDQogICAgICAgICAgPyByZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCwgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmopDQogICAgICAgICAgOiByZXEuZ2V0KHJlcXVlc3RQYXJhbXMudXJsKQ0KICAgICAgcXVlcnkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KICAgICAgICAvL+aYvuekuuWtl+autemFjee9rg0KICAgICAgICBsZXQgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKQ0KICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQNCiAgICAgICAgLy/miorlr7nor53moYbphY3nva7nmoTmmL7npLrlrZfmrrXmmL7npLrlkI3np7DotYvlgLznu5nmoJHlvaLnmoTmmL7npLrlgLwNCiAgICAgICAgdGhpc18uZGVmYXVsdFByb3BzLmxhYmVsID0gZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lDQogICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcG9uc2UuZGF0YQ0KICAgICAgICAvL+W+l+WIsOimgeWKoOi9veagkeeahOS/oeaBrw0KICAgICAgICB0aGlzXy5wcm9wczEgPSB0aGlzXy50b1RyZWVEYXRhKA0KICAgICAgICAgIHJlc3BvbnNlLmRhdGEsDQogICAgICAgICAgZGlzcGxheWZpZWxkLmlkLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5waWQsDQogICAgICAgICAgZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMA0KICAgICAgICApDQogICAgICB9KQ0KICAgIH0sDQogICAgLy/liqDovb3moJHnmoTkv6Hmga8NCiAgICB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgew0KICAgICAgLy8g5bu656uL5Liq5qCR5b2i57uT5p6ELOmcgOimgeWumuS5ieS4quacgOmhtuWxgueahOeItuiKgueCue+8jHB2YWx1ZeaYrzANCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKQ0KICAgIH0sDQogICAgdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsNCiAgICAgIC8v5oqK5qCR5pWw5o2u5pyJ5a2Q6IqC54K555qE5pWw5o2u5YWo6YOo6L+H5ruk5o6J77yI5Y+q55WZ54i26IqC54K555qE5pWw5o2u77yJDQogICAgICBsZXQgcGFyZW50cyA9IGRhdGEuZmlsdGVyKA0KICAgICAgICAodmFsdWUpID0+DQogICAgICAgICAgdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwgdmFsdWVbcGlkXSA9PSBudWxsIHx8IHZhbHVlW3BpZF0gPT0gcHZhbHVlDQogICAgICApDQogICAgICBpZiAoIXBhcmVudHMpIHsNCiAgICAgICAgcGFyZW50cyA9IGRhdGEuZmlsdGVyKA0KICAgICAgICAgICh2YWx1ZSkgPT4NCiAgICAgICAgICAgIHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmDQogICAgICAgICAgICB2YWx1ZVtwaWRdICE9IG51bGwgJiYNCiAgICAgICAgICAgIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdDQogICAgICAgICkNCiAgICAgIH0NCiAgICAgIHJldHVybiBwYXJlbnRzDQogICAgfSwNCiAgICBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7DQogICAgICBpZiAobm9kZSkgew0KICAgICAgICBsZXQgdGhpc18gPSB0aGlzDQogICAgICAgIGxldCBkaXNwbGF5RmllbGQgPQ0KICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZy5zdHlsZSA9PSAyDQogICAgICAgICAgICA/IHRoaXNfLmNvbWJpVHJlZURpc3BsYXlGaWVsZA0KICAgICAgICAgICAgOiB0aGlzXy5kaXNwbGF5RmllbGQNCiAgICAgICAgcmVzb2x2ZSgNCiAgICAgICAgICB0aGlzLnRyZWVMaXN0LmZpbHRlcigNCiAgICAgICAgICAgICh2YWx1ZSkgPT4gdmFsdWVbZGlzcGxheUZpZWxkLnBpZF0gPT09IG5vZGUuZGF0YVtkaXNwbGF5RmllbGQuaWRdDQogICAgICAgICAgKQ0KICAgICAgICApDQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgdGhpcy5zaG93RGF0YS5mb3JFYWNoKCh2KSA9PiB7DQogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZCh2LCB0cnVlKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXykNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LCA0MDApDQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KDQogICAgYWZ0ZXJPcGVuKCkgew0KICAgICAgLy/miZPlvIDlr7nor53moYbkuYvlkI7liqDovb3moJENCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpDQogICAgfSwNCiAgICBsb2FkQ29tYmluYXRpb25UcmVlKCkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpDQogICAgICB0aGlzLmNvbWJpbmF0aW9uUnVsZSA9IGNvbWJpbmF0aW9uUnVsZQ0KICAgICAgbGV0IHRyZWVBbGlhcyA9IGNvbWJpbmF0aW9uUnVsZS5sZWZ0VHJlZQ0KICAgICAgLy/ojrflj5blr7nor53moYbmlbDmja4NCiAgICAgIHJlcQ0KICAgICAgICAuZ2V0KCcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9JyArIHRyZWVBbGlhcykNCiAgICAgICAgLnRoZW4oKHJlc3ApID0+IHsNCiAgICAgICAgICBsZXQgdHJlZURpYWxvZyA9IHJlc3AuZGF0YQ0KICAgICAgICAgIHRoaXMubGVmdFRyZWVUaXRsZSA9IHRyZWVEaWFsb2cubmFtZQ0KICAgICAgICAgIGxldCByZXFQYXJhbSA9IHt9DQogICAgICAgICAgbGV0IHJlcXVlc3RUeXBlID0NCiAgICAgICAgICAgIHRyZWVEaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgICAgICA/ICdHRVQnDQogICAgICAgICAgICAgIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgICAgICAgID8gdHJlZURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgICAgICAgIDogJ1BPU1QnDQogICAgICAgICAgbGV0IHVybCA9DQogICAgICAgICAgICAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsNCiAgICAgICAgICAgIHRyZWVBbGlhcyArDQogICAgICAgICAgICAnJm1hcFBhcmFtPScNCiAgICAgICAgICBsZXQgcGFyYW1zT2JqID0ge30NCiAgICAgICAgICBpZiAodHJlZURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybA0KICAgICAgICAgICAgbGV0IHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbQ0KICAgICAgICAgICAgaWYgKHRyZWVEaWFsb2cuY29uZGl0aW9uZmllbGQpIHsNCiAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuY29uZGl0aW9uZmllbGQpDQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGxldCBjb24gPSBjb25kaXRpb25zW2ldDQogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICdQT1NUJykgew0KICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZSgNCiAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKCdcXHsnICsgY29uLmZpZWxkICsgJ1xcfScsICdnJyksDQogICAgICAgICAgICAgICAgICAgICAgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgbGV0IGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicNCiAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICc9JyArIGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICBwYXJhbXNPYmogPSBKU09OLnBhcnNlKHRlbXBsYXRlUGEpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7fQ0KICAgICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZQ0KICAgICAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gdXJsDQogICAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmoNCiAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgLmRpc3BhdGNoKCdkaWFsb2cvZ2V0VHJlZURhdGEnLCByZXF1ZXN0UGFyYW1zKQ0KICAgICAgICAgICAgLnRoZW4oKHJlc3ApID0+IHsNCiAgICAgICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsNCiAgICAgICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCkNCiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUNCiAgICAgICAgICAgICAgICB0aGlzLnRyZWVMaXN0ID0gcmVzcA0KICAgICAgICAgICAgICAgIHRoaXMuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkDQogICAgICAgICAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVEYXRhID0gdGhpcy50b1RyZWVEYXRhKA0KICAgICAgICAgICAgICAgICAgcmVzcCwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5pZCwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5waWQsDQogICAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsDQogICAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGQucHZhbHVlID8gZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJywNCiAgICAgICAgICAgICAgICAgIHJlc3VsdGZpZWxkDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICB9KQ0KICAgIH0sDQogICAgY29tYmlUcmVlQ2xpY2socGFyYW1PYmosIG5vZGUsIG5vZGVDb21wb25lbnQpIHsNCiAgICAgIC8v57uE5ZCI5a+56K+d5qGG54K55Ye75bem5qCRDQogICAgICAvL+a4heepuuaXp+eahA0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApDQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpDQogICAgICBpZiAoIWNvbWJpbmF0aW9uUnVsZS5ydWxlcyB8fCBjb21iaW5hdGlvblJ1bGUucnVsZXMubGVuZ3RoID09IDApIHsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBsZXQgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXMNCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgbGV0IHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXQ0KICAgICAgICBsZXQgcHJvcGVydHkgPSBydWxlc1tpXS5saXN0RmllbGQNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMucHVzaCh7DQogICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LA0KICAgICAgICAgIHZhbHVlOiB2YWx1ZSwNCiAgICAgICAgICBncm91cDogJ3RyZWVHcm91cCcsDQogICAgICAgICAgb3BlcmF0aW9uOiB0aGlzLmdldE9wZXJhdGlvbihydWxlc1tpXS5jb25kaXRpb24pLA0KICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgdGhpcy5zZWFyY2goKQ0KICAgIH0sDQogICAgLy/ojrflj5bov5DnrpfnrKblj7cNCiAgICBnZXRPcGVyYXRpb24ob2xkKSB7DQogICAgICBpZiAoIW9sZCkgew0KICAgICAgICByZXR1cm4gJycNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gJ0VRJykgew0KICAgICAgICByZXR1cm4gJ0VRVUFMJw0KICAgICAgfQ0KICAgICAgaWYgKG9sZCA9PSAnTEsnKSB7DQogICAgICAgIHJldHVybiAnTElLRScNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gJ0xGSycpIHsNCiAgICAgICAgcmV0dXJuICdMSUtFJw0KICAgICAgfQ0KICAgICAgaWYgKG9sZCA9PSAnSU4nKSB7DQogICAgICAgIHJldHVybiAnSU4nDQogICAgICB9DQogICAgfSwNCiAgICB0b2dnbGVUcmVlKCkgew0KICAgICAgaWYgKHRoaXMudHJlZVNob3cpIHsNCiAgICAgICAgdGhpcy50cmVlU2hvdyA9IGZhbHNlDQogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAnMCUnDQogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gJ2VsLWljb24tYXJyb3ctcmlnaHQnDQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLnRyZWVTaG93ID0gdHJ1ZQ0KICAgICAgICB0aGlzLnRyYW5zdGlvbldpZHRoID0gJzI1JScNCiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAnZWwtaWNvbi1hcnJvdy1sZWZ0Jw0KICAgICAgfQ0KICAgIH0sDQogICAgaW5pdFRlbXBsYXRlRGF0YSgpIHsNCiAgICAgIGxldCBfdGhpcyA9IHRoaXMNCiAgICAgIGNvbnN0IGN1c3RkaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZw0KICAgICAgaWYgKCFjdXN0ZGlhbG9nIHx8ICFjdXN0ZGlhbG9nLm1hcHBpbmdDb25mIHx8IGN1c3RkaWFsb2cubWFwcGluZ0NvbmYubGVuZ3RoIDwgMSkgew0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGNvbnN0IHRhcmdldFBhdGggPSB0aGlzLmdldFRhcmdldFBhdGgoY3VzdGRpYWxvZy5tYXBwaW5nQ29uZikNCiAgICAgIGNvbnN0IHBhdGhzID0gdGFyZ2V0UGF0aC5zcGxpdCgnLicpDQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgaWYgKCFmb3JtSW5zdC5pbml0RmlsbERhdGEpIHsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICAvL+WmguaenOW3suacieaVsOaNruWImeS4jemcgOimgeWGjeasoeWIneWni+WMlg0KICAgICAgY29uc3QgY3VyRGF0YSA9IGZvcm1JbnN0WydkYXRhJ11bcGF0aHNbMF1dW3BhdGhzWzFdXQ0KICAgICAgbGV0IGluaXRUeXBlID0gdGhpcy5pbml0RmlsbERhdGFUeXBlDQogICAgICBpZiAoKCFpbml0VHlwZSB8fCBpbml0VHlwZSA9PSAnZW1wdHknKSAmJiBjdXJEYXRhLmxlbmd0aCA+IDAgJiYgIShjdXJEYXRhLmxlbmd0aCA9PSAxICYmIEpTT04uc3RyaW5naWZ5KGN1ckRhdGFbMF0pID09ICdbXScpKSB7DQogICAgICAgIHJldHVybg0KICAgICAgfSBlbHNlIGlmIChpbml0VHlwZSA9PSAnY292ZXInKSB7DQogICAgICAgIGZvcm1JbnN0WydkYXRhJ11bcGF0aHNbMF1dW3BhdGhzWzFdXSA9IFtdDQogICAgICB9DQogICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh7DQogICAgICAgIGxvY2s6IHRydWUsDQogICAgICAgIHRleHQ6ICfmraPlnKjliJ3lp4vljJbloavmiqXmqKHmnb8uLi4nLA0KICAgICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywNCiAgICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC43KScNCiAgICAgIH0pDQogICAgICBsZXQgbXlDdXN0b21EaWFsb2cgPSBudWxsDQogICAgICB0aGlzLiRodHRwLmdldCgnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRCeUFsaWFzP2FsaWFzPScgKyBjdXN0ZGlhbG9nLmFsaWFzKS50aGVuKHJlc3AgPT4gew0KICAgICAgICBteUN1c3RvbURpYWxvZyA9IHJlc3AuZGF0YQ0KICAgICAgICBfdGhpcy5jdXN0b21EaWFsb2cgPSByZXNwLmRhdGENCiAgICAgIH0sIGVycm9yID0+IHsNCiAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpDQogICAgICAgIF90aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICBtZXNzYWdlOiAn6I635Y+W6Ieq5a6a5LmJ5a+56K+d5qGG5aSx6LSl77yBJywNCiAgICAgICAgICB0eXBlOiAnZXJyb3InDQogICAgICAgIH0pDQogICAgICB9KS50aGVuKGZ1bmN0aW9uKCkgew0KICAgICAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudFVzZXInKSkNCiAgICAgICAgaWYgKCFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5jb2RlICYmICFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmICFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5pZCkgew0KICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKQ0KICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzLCBteUN1c3RvbURpYWxvZy5kc1R5cGUsIGZvcm1JbnN0WydkYXRhJ10pDQogICAgICAgIH0gZWxzZSBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2N1ckZpbGxPcmdfJyArIGN1cnJlbnRVc2VyLmFjY291bnQpKSB7DQogICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpDQogICAgICAgICAgX3RoaXMuZmlsbE9yZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2N1ckZpbGxPcmdfJyArIGN1cnJlbnRVc2VyLmFjY291bnQpKQ0KICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzLCBteUN1c3RvbURpYWxvZy5kc1R5cGUsIGZvcm1JbnN0WydkYXRhJ10pDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgX3RoaXMuJGh0dHAuZ2V0KCcke3VjfS9hcGkvb3JnL3YxL29yZy9nZXRGaWxsT3JnJykudGhlbihyZXNwID0+IHsNCiAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKQ0KICAgICAgICAgICAgY29uc3QgcmVwID0gcmVzcC5kYXRhDQogICAgICAgICAgICBpZiAocmVwLnN0YXRlKSB7DQogICAgICAgICAgICAgIF90aGlzLmZpbGxPcmcgPSByZXAudmFsdWUNCiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2N1ckZpbGxPcmdfJyArIGN1cnJlbnRVc2VyLmFjY291bnQsIEpTT04uc3RyaW5naWZ5KHJlcC52YWx1ZSkpDQogICAgICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzLCBteUN1c3RvbURpYWxvZy5kc1R5cGUsIGZvcm1JbnN0WydkYXRhJ10pDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgbWVzc2FnZTogcmVwLm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwgZXJyb3IgPT4gew0KICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpDQogICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgIG1lc3NhZ2U6ICfojrflj5blvZPliY3nlKjmiLfloavliLbljZXkvY3lpLHotKXvvIEnLA0KICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSkNCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9LA0KICAgIGNsb3NlTG9hZGluZyhsb2FkaW5nKSB7DQogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgIH0sIDIwMDApDQogICAgfSwNCiAgICBnZXRUYXJnZXRQYXRoKG1hcHBpbmdDb25mKSB7DQogICAgICBsZXQgdGFyZ2V0ID0gJycNCiAgICAgIGlmIChtYXBwaW5nQ29uZiAmJiBtYXBwaW5nQ29uZi5sZW5ndGggPiAwKSB7DQogICAgICAgIG1hcHBpbmdDb25mLmZvckVhY2gobWFwID0+IHsNCiAgICAgICAgICBpZiAobWFwWyd0YXJnZXQnXSAmJiBtYXBbJ3RhcmdldCddLmxlbmd0aCA9PSAxICYmIG1hcFsndGFyZ2V0J11bMF0pIHsNCiAgICAgICAgICAgIHRhcmdldCA9IG1hcFsndGFyZ2V0J11bMF0NCiAgICAgICAgICAgIHJldHVybiB0YXJnZXQNCiAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgICB9DQogICAgICByZXR1cm4gdGFyZ2V0DQogICAgfSwNCiAgICB0b0ZpbGxJbml0RGF0YShfdGhpcywgZHNUeXBlLCBjdXJEYXRhKSB7DQogICAgICBjb25zdCBjdXN0ZGlhbG9nID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cNCiAgICAgIGxldCBwYXJhbXMgPSBbXS8v57uR5a6a55qE6KGo5Y2V5a2X5q61DQogICAgICBpZiAoY3VzdGRpYWxvZy5jb25kaXRpb25zKSB7DQogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJDQogICAgICAgIGxldCBiaW5kTGlzdCA9IGN1c3RkaWFsb2cuY29uZGl0aW9ucw0KICAgICAgICBpZiAoYmluZExpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgIGJpbmRMaXN0LmZvckVhY2goZWxlID0+IHsNCiAgICAgICAgICAgIC8v57uR5a6a6KGo5Y2V5a2X5q61DQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICczJyAmJiBlbGUuYmluZCkgew0KICAgICAgICAgICAgICBsZXQgb2JqID0ge30NCiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkDQogICAgICAgICAgICAgIGNvbnN0IGJpbmRBcnJheSA9IGVsZS5iaW5kLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgaWYgKGJpbmRBcnJheS5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgIG9iai5iaW5kID0gY3VyRGF0YVtiaW5kQXJyYXlbMV1dW2JpbmRBcnJheVsyXV0NCiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChvYmopDQogICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGxldCB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRMaXN0RGF0YT9hbGlhcz0nICsgY3VzdGRpYWxvZy5hbGlhcw0KICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7DQogICAgICAgIGxldCBwYVN0ciA9ICcnDQogICAgICAgIHBhcmFtcy5mb3JFYWNoKHBhID0+IHsNCiAgICAgICAgICBpZiAocGFTdHIpIHsNCiAgICAgICAgICAgIHBhU3RyICs9ICcsJw0KICAgICAgICAgIH0NCiAgICAgICAgICBwYVN0ciA9IHBhU3RyICsgJyInICsgcGEuZmllbGQgKyAnIjoiJyArIHBhLmJpbmQgKyAnIicNCiAgICAgICAgfSkNCiAgICAgICAgdXJsID0gdXJsICsgJyZtYXBQYXJhbT0nICsgcGFTdHINCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHVybCA9IHVybCArICcmbWFwUGFyYW09Jw0KICAgICAgfQ0KICAgICAgY29uc3QgcGFyYW0gPSB7cGFnZUJlYW46IHtwYWdlOiAxLCBwYWdlU2l6ZTogMTAwMCwgc2hvd1RvdGFsOiB0cnVlfX0NCiAgICAgIF90aGlzLiRodHRwLnBvc3QodXJsLCBwYXJhbSkudGhlbihyZXNwID0+IHsNCiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXNwLmRhdGENCiAgICAgICAgaWYgKHJlc3BvbnNlLnJvd3MpIHsNCiAgICAgICAgICBfdGhpcy5zeW5jSW5pdFRhYmxlVmFsdWUocmVzcG9uc2Uucm93cywgZHNUeXBlKQ0KICAgICAgICB9DQogICAgICB9LCBlcnJvciA9PiB7DQogICAgICAgIF90aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICBtZXNzYWdlOiAn6I635Y+W5Yid5aeL5YyW5pWw5o2u5aSx6LSl77yBJywNCiAgICAgICAgICB0eXBlOiAnZXJyb3InDQogICAgICAgIH0pDQogICAgICB9KQ0KICAgIH0sDQogICAgc3luY0luaXRUYWJsZVZhbHVlKHMsIGRzVHlwZSkgew0KICAgICAgbGV0IGN1c3REaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2cNCiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKQ0KICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUNCiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgc3RyID0gW10NCiAgICAgIHZhciBpZHMgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPQ0KICAgICAgICAgIGRzVHlwZSA9PSAnZGF0YVNvdXJjZScNCiAgICAgICAgICAgID8gcmV0dXJuU3RyW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICAgIDogcmV0dXJuU3RyW2ldLmZpZWxkDQogICAgICAgIGNvbW1lbnRbaV0gPQ0KICAgICAgICAgIGRzVHlwZSA9PSAnZGF0YVNvdXJjZScNCiAgICAgICAgICAgID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgOiByZXR1cm5TdHJbaV0uY29tbWVudA0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGNvbnN0IHZhID0gc1swXVtmaWVsZFtpXV0NCiAgICAgICAgICB2YSA9IHR5cGVvZiAodmEpID09ICd1bmRlZmluZWQnID8gJycgOiB2YQ0KICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgdmEgKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKQ0KICAgICAgICBpZHMucHVzaChzWzBdLmlkKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tbWVudC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgY29uc3QgdmEgPSBzW2ldW2ZpZWxkW2pdXQ0KICAgICAgICAgICAgdmEgPSB0eXBlb2YgKHZhKSA9PSAndW5kZWZpbmVkJyA/ICcnIDogdmENCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtqXSArICciOiInICsgdmEgKyAnIiwnDQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7DQogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICAgIH0NCiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSkNCiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgdGhpcy5pbnN0SWQgPSBmb3JtSW5zdC4kcGFyZW50Lmluc3RJZA0KICAgICAgLy/lpITnkIbloavliLbpg6jpl6gNCiAgICAgIGxldCBmaWxsT3JnID0ge30NCiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCkgew0KICAgICAgICBjb25zdCBuYW1lUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUuc3BsaXQoJy4nKQ0KICAgICAgICBjb25zdCBvcmdOYW1lRmllbGQgPSBuYW1lUGF0aFtuYW1lUGF0aC5sZW5ndGggLSAxXQ0KICAgICAgICBmaWxsT3JnW29yZ05hbWVGaWVsZF0gPSB0aGlzLmZpbGxPcmcubmFtZQ0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuaWQpIHsNCiAgICAgICAgICBjb25zdCBpZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZC5zcGxpdCgnLicpDQogICAgICAgICAgY29uc3Qgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoIC0gMV0NCiAgICAgICAgICBmaWxsT3JnW29yZ0lkRmllbGRdID0gdGhpcy5maWxsT3JnLmlkDQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUpIHsNCiAgICAgICAgICBjb25zdCBjb2RlUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUuc3BsaXQoJy4nKQ0KICAgICAgICAgIGNvbnN0IG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aCAtIDFdDQogICAgICAgICAgZmlsbE9yZ1tvcmdDb2RlRmllbGRdID0gdGhpcy5maWxsT3JnLmNvZGUNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCkgew0KICAgICAgICBjb25zdCBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJykNCiAgICAgICAgY29uc3QgaW5zdElkRmllbGQgPSBpbnN0SWRQYXRoW2luc3RJZFBhdGgubGVuZ3RoIC0gMV0NCiAgICAgICAgZmlsbE9yZ1tpbnN0SWRGaWVsZF0gPSB0aGlzLmluc3RJZA0KICAgICAgfQ0KICAgICAgY29uc3QgcmV0dXJuRGF0YSA9IHN0cg0KICAgICAgY29uc3QgX3RoaXMgPSB0aGlzDQoNCiAgICAgIHJldHVybkRhdGEuZm9yRWFjaChyb3cgPT4gew0KICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fQ0KICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsDQogICAgICAgIGN1c3REaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsNCiAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgnLicpDQogICAgICAgICAgICB2YXIgZnJvbSA9ICcnDQogICAgICAgICAgICBpZiAoX3RoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsNCiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc3ViTGluZURhdGFbdGFyZ2V0QXJyYXlbdGFyZ2V0QXJyYXkubGVuZ3RoIC0gMV1dID0gcm93W2Zyb21dDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgICBpZiAoZmlsbE9yZyAmJiBKU09OLnN0cmluZ2lmeShmaWxsT3JnKSAhPSAne30nKSB7DQogICAgICAgICAgc3ViTGluZURhdGEgPSB7Li4uc3ViTGluZURhdGEsIC4uLmZpbGxPcmd9DQogICAgICAgIH0NCiAgICAgICAgZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dLnB1c2goc3ViTGluZURhdGEpDQogICAgICB9KQ0KICAgIH0NCiAgfQ0KfQ0K"},null]}