diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 66760f3..0192a00 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1999,16 +1999,17 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) free(_taskscheduler); // message-box, refer to modules/message-box.js - char *_messagebox = ILibMemory_Allocate(54812, 0, NULL, NULL); - memcpy_s(_messagebox + 0, 31320, "LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmNvbnN0IE1CX09LID0gMHgwMDAwMDAwMDsNCmNvbnN0IE1CX09LQ0FOQ0VMICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxOw0KY29uc3QgTUJfQUJPUlRSRVRSWUlHTk9SRSAgICAgICA9IDB4MDAwMDAwMDI7DQpjb25zdCBNQl9ZRVNOT0NBTkNFTCAgICAgICAgICAgID0gMHgwMDAwMDAwMzsNCmNvbnN0IE1CX1lFU05PICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0Ow0KY29uc3QgTUJfUkVUUllDQU5DRUwgICAgICAgICAgICA9IDB4MDAwMDAwMDU7DQpjb25zdCBNQl9UT1BNT1NUICAgICAgICAgICAgICAgID0gMHgwMDA0MDAwMDsNCmNvbnN0IE1CX1NFVEZPUkVHUk9VTkQgICAgICAgICAgPSAweDAwMDEwMDAwOw0KDQpjb25zdCBNQl9ERUZCVVRUT04xICAgICAgICAgICAgID0gMHgwMDAwMDAwMDsNCmNvbnN0IE1CX0RFRkJVVFRPTjIgICAgICAgICAgICAgPSAweDAwMDAwMTAwOw0KY29uc3QgTUJfREVGQlVUVE9OMyAgICAgICAgICAgICA9IDB4MDAwMDAyMDA7DQpjb25zdCBNQl9JQ09OSEFORCAgICAgICAgICAgICAgID0gMHgwMDAwMDAxMDsNCmNvbnN0IE1CX0lDT05RVUVTVElPTiAgICAgICAgICAgPSAweDAwMDAwMDIwOw0KY29uc3QgTUJfSUNPTkVYQ0xBTUFUSU9OICAgICAgICA9IDB4MDAwMDAwMzA7DQpjb25zdCBNQl9JQ09OQVNURVJJU0sgICAgICAgICAgID0gMHgwMDAwMDA0MDsNCg0KY29uc3QgSURPSyAgICAgPSAxOw0KY29uc3QgSURDQU5DRUwgPSAyOw0KY29uc3QgSURBQk9SVCAgPSAzOw0KY29uc3QgSURSRVRSWSAgPSA0Ow0KY29uc3QgSURJR05PUkUgPSA1Ow0KY29uc3QgSURZRVMgICAgPSA2Ow0KY29uc3QgSUROTyAgICAgPSA3Ow0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBjaGlsZFNjcmlwdCA9ICJcDQogICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLm9uKCdkYXRhJywgZnVuY3Rpb24gKGopXA0KICAgICAgICB7XA0KICAgICAgICAgICAgc3dpdGNoKGouY29tbWFuZClcDQogICAgICAgICAgICB7XA0KICAgICAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2VCb3gnOlwNCiAgICAgICAgICAgICAgICAgICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKVwNCiAgICAgICAgICAgICAgICAgICAge1wNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ01lc3NhZ2VCb3hBJyk7XA0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjMyLk1lc3NhZ2VCb3hBLmFzeW5jKDAsIEdNLkNyZWF0ZVZhcmlhYmxlKGouY2FwdGlvbiksIEdNLkNyZWF0ZVZhcmlhYmxlKGoudGl0bGUpLCAiICsgKE1CX1lFU05PIHwgTUJfREVGQlVUVE9OMiB8IE1CX0lDT05FWENMQU1BVElPTiB8IE1CX1NFVEZPUkVHUk9VTkQpLnRvU3RyaW5nKCkgKyAiKS50aGVuKFwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHIpXA0KICAgICAgICAgICAgICAgICAgICAgICAge1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyLlZhbCA9PSAiICsgSURZRVMudG9TdHJpbmcoKSArICIpXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoIiArIElEWUVTLnRvU3RyaW5nKCkgKyAiKTtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoIiArIElETk8udG9TdHJpbmcoKSArICIpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1wNCiAgICAgICAgICAgICAgICAgICAgfVwNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XA0KICAgICAgICAgICAgfVwNCiAgICAgICAgfSk7XA0KICAgICI7DQoNCmZ1bmN0aW9uIG1lc3NhZ2VCb3goKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gJ21lc3NhZ2UtYm94JzsNCiAgICB0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY2FwdGlvbiwgdGltZW91dCkNCiAgICB7DQogICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KICAgICAgICB2YXIga2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7DQogICAgICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2Vzc0lkVG9TZXNzaW9uSWQnKTsNCiAgICAgICAgdmFyIHBzaWQgPSBHTS5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgaWYgKGtlcm5lbDMyLlByb2Nlc3NJZFRvU2Vzc2lvbklkKHByb2Nlc3MucGlkLCBwc2lkKS5WYWwgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9yZWooJ0ludGVybmFsIEVycm9yJyk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7IHRpbWVvdXQgPSAxMDsgfQ0KICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsNCiAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGV4ZWN1dGlvblRpbWVvdXQ6IHRpbWVvdXQgfTsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgb3B0aW9ucy5zZXNzaW9uSWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOw0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2Vzc2lvbklkID09IHBzaWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkgeyBkZWxldGUgb3B0aW9ucy5zZXNzaW9uSWQ7IH0NCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChlZSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9yZWooJ05vIGxvZ2dlZCBvbiB1c2VycycpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQogICAgICAgIHJldC5fdGl0bGUgPSB0aXRsZTsNCiAgICAgICAgcmV0Ll9jYXB0aW9uID0gY2FwdGlvbjsNCiAgICAgICAgcmV0Ll9jb250YWluZXIgPSByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5DcmVhdGUob3B0aW9ucyk7DQogICAgICAgIHJldC5fY29udGFpbmVyLnByb21pc2UgPSByZXQ7DQogICAgICAgIHJldC5fY29udGFpbmVyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGopDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKGogPT0gSURZRVMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignRGVuaWVkJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICByZXQuX2NvbnRhaW5lci5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdUaW1lb3V0Jyk7DQogICAgICAgIH0pOw0KICAgICAgICByZXQuX2NvbnRhaW5lci5FeGVjdXRlU3RyaW5nKGNoaWxkU2NyaXB0KTsNCiAgICAgICAgcmV0Ll9jb250YWluZXIuc2VuZCh7IGNvbW1hbmQ6ICdtZXNzYWdlQm94JywgY2FwdGlvbjogY2FwdGlvbiwgdGl0bGU6IHRpdGxlIH0pOw0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCn0NCg0KDQpmdW5jdGlvbiBsaW51eF9tZXNzYWdlQm94KCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdtZXNzYWdlLWJveCc7DQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd6ZW5pdHknLA0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyB6ZW5pdHkgfCBhd2sgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQogICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09ICcnICYmIHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9iaW4vemVuaXR5JykpIHsgbG9jYXRpb24gPSAnL3Vzci9sb2NhbC9iaW4vemVuaXR5JzsgfQ0KICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnJykgeyByZXR1cm4gKG51bGwpOyB9DQoNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUobG9jYXRpb24gKyAnIC0taGVscC1hbGwgfCBncmVwIHRpbWVvdXRcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmV0ID0geyBwYXRoOiBsb2NhdGlvbiwgdGltZW91dDogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyBmYWxzZSA6IHRydWUgfTsNCg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZShsb2NhdGlvbiArICcgLS12ZXJzaW9uIHwgYXdrIC1GLiBcJ3sgcHJpbnRmICJbJXMsICVzXVxcbiIsICQxLCAkMjsgfSBcJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIHJldC52ZXJzaW9uID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgfSkoKQ0KICAgICAgICB9KTsNCiAgICBpZiAoIXRoaXMuemVuaXR5KQ0KICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrZGlhbG9nJywNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMga2RpYWxvZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyBudWxsIDogeyBwYXRoOiBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSB9KTsNCiAgICAgICAgICAgICAgICB9KSgpDQogICAgICAgICAgICB9KTsNCiAgICB9DQoNCiAgICB0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY2FwdGlvbiwgdGltZW91dCkNCiAgICB7DQogICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwpIHsgdGltZW91dCA9IDEwOyB9DQogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICB2YXIgdWlkOyAgICANCiAgICAgICAgdmFyIHhpbmZvOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICB1aWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOw0KICAgICAgICAgICAgeGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbyh1aWQpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoKGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVpZCA9IDA7DQogICAgICAgICAgICB4aW5mbyA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldFhJbmZvKDApOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHhpbmZvID09IG51bGwpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5fcmVqKCdUaGlzIHN5c3RlbSBjYW5ub3QgZGlzcGxheSBhIHVzZXIgZGlhbG9nIGJveCB3aGVuIGEgdXNlciBpcyBub3QgbG9nZ2VkIGluJyk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy56ZW5pdHkpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEdOT01FL1pFTklUWQ0KICAgICAgICAgICAgaWYgKHRoaXMuemVuaXR5LnRpbWVvdXQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHRoaXMuemVuaXR5LnBhdGgsIFsnemVuaXR5JywgJy0tcXVlc3Rpb24nLCAnLS10aXRsZT0nICsgdGl0bGUsICctLXRleHQ9JyArIGNhcHRpb24sICctLXRpbWVvdXQ9JyArIHRpbWVvdXRdLCB7IHVpZDogdWlkLCBlbnY6IHsgWEFVVEhPUklUWTogeGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogeGluZm8uZGlzcGxheSB9IH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSh0aGlzLnplbml0eS5wYXRoLCBbJ3plbml0eScsICctLXF1ZXN0aW9uJywgJy0tdGl0bGU9JyArIHRpdGxlLCAnLS10ZXh0PScgKyBjYXB0aW9uXSwgeyB1aWQ6IHVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHhpbmZvLmRpc3BsYXkgfSB9KTsNCiAgICAgICAgICAgICAgICByZXQuY2hpbGQudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjLnRpbWVvdXQgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICBjLmtpbGwoKTsNCiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0ICogMTAwMCwgcmV0LmNoaWxkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldC5jaGlsZC5wcm9taXNlID0gcmV0Ow0KICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lb3V0KSB7IGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpOyB9DQogICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignZGVuaWVkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCd0aW1lb3V0Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHRoaXMua2RpYWxvZykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ2ZyZWVic2QnICYmIHByb2Nlc3MuZW52WydESVNQTEFZJ10pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHRoaXMua2RpYWxvZy5wYXRoLCBbJ2tkaWFsb2cnLCAnLS10aXRsZScsIHRpdGxlLCAnLS15ZXNubycsIGNhcHRpb25dKTsNCiAgICAgICAgICAgICAgICByZXQuY2hpbGQucHJvbWlzZSA9IHJldDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgeGRnID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmZpbmRFbnYodWlkLCAnWERHX1JVTlRJTUVfRElSJyk7IGlmICh4ZGcgPT0gbnVsbCkgeyB4ZGcgPSAnJzsgfQ0KICAgICAgICAgICAgICAgIGlmICgheGluZm8gfHwgIXhpbmZvLmRpc3BsYXkgfHwgIXhpbmZvLnhhdXRob3JpdHkpIHsgcmV0Ll9yZWooJ0ludGVyYWwgRXJyb3IsIGNvdWxkIG5vdCBkZXRlcm1pbmUgWDExL1hERyBlbnYnKTsgcmV0dXJuIChyZXQpOyB9DQogICAgICAgICAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHRoaXMua2RpYWxvZy5wYXRoLCBbJ2tkaWFsb2cnLCAnLS10aXRsZScsIHRpdGxlLCAnLS15ZXNubycsIGNhcHRpb25dLCB7IHVpZDogdWlkLCBlbnY6IHsgRElTUExBWTogeGluZm8uZGlzcGxheSwgWEFVVEhPUklUWTogeGluZm8ueGF1dGhvcml0eSwgWERHX1JVTlRJTUVfRElSOiB4ZGcgfSB9KTsNCiAgICAgICAgICAgICAgICByZXQuY2hpbGQucHJvbWlzZSA9IHJldDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldC5jaGlsZC50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjLnRpbWVvdXQgPSBudWxsOw0KICAgICAgICAgICAgICAgIGMua2lsbCgpOw0KICAgICAgICAgICAgfSwgdGltZW91dCAqIDEwMDAsIHJldC5jaGlsZCk7DQogICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignZGVuaWVkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCd0aW1lb3V0Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ3RpbWVvdXQnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCn0NCg0KaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpDQp7DQogICAgZnVuY3Rpb24gdHJhbnNsYXRlT2JqZWN0KG9iaikNCiAgICB7DQogICAgICAgIHZhciBqID0gSlNPTi5zdHJpbmdpZnkob2JqKTsNCiAgICAgICAgdmFyIGIgPSBCdWZmZXIuYWxsb2Moai5sZW5ndGggKyA0KTsNCiAgICAgICAgYi53cml0ZVVJbnQzMkxFKGoubGVuZ3RoICsgNCk7DQogICAgICAgIEJ1ZmZlci5mcm9tKGopLmNvcHkoYiwgNCk7DQogICAgICAgIHJldHVybiAoYik7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBtYWNvc19tZXNzYWdlQm94KCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdtZXNzYWdlLWJveCc7DQogICAgdGhpcy5faW5pdElQQ0Jhc2UgPSBmdW5jdGlvbiBfaW5pdElQQ0Jhc2UoKQ0KICAgIHsNCiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQoNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC51aWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXQuX3JlaihlKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldC5wYXRoID0gJy92YXIvdG1wLycgKyBwcm9jZXNzLmV4ZWNQYXRoLnNwbGl0KCcvJykucG9wKCkgKyAnX2V2JzsNCiAgICAgICAgdmFyIG47DQoNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIG4gPSByZXF1aXJlKCd0bHMnKS5nZW5lcmF0ZVJhbmRvbUludGVnZXIoJzEnLCAnOTk5OTknKTsNCiAgICAgICAgfQ0KICAgICAgICBj", 16000); - memcpy_s(_messagebox + 16000, 15320, "YXRjaCAoZSkNCiAgICAgICAgew0KICAgICAgICAgICAgbiA9IDA7DQogICAgICAgIH0NCiAgICAgICAgd2hpbGUgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhyZXQucGF0aCArIG4pKQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIG4gPSByZXF1aXJlKCd0bHMnKS5nZW5lcmF0ZVJhbmRvbUludGVnZXIoJzEnLCAnOTk5OTknKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgKytuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldC5wYXRoID0gcmV0LnBhdGggKyBuOw0KICAgICAgICByZXQudG1wU2VydmljZU5hbWUgPSAnbWVzaE5vdGlmaWNhdGlvblNlcnZlcicgKyBuOw0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCiAgICANCiAgICB0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY2FwdGlvbiwgdGltZW91dCkNCiAgICB7DQogICAgICAgIC8vIFN0YXJ0IExvY2FsIFNlcnZlcg0KICAgICAgICB2YXIgcmV0ID0gdGhpcy5faW5pdElQQ0Jhc2UoKTsNCiAgICAgICAgcmV0LnRpdGxlID0gdGl0bGU7IHJldC5jYXB0aW9uID0gY2FwdGlvbjsgcmV0LnRpbWVvdXQgPSB0aW1lb3V0Ow0KICAgICAgICByZXQuc2VydmVyID0gdGhpcy5zdGFydE1lc3NhZ2VTZXJ2ZXIocmV0KTsNCiAgICAgICAgcmV0LnNlcnZlci5yZXQgPSByZXQ7DQogICAgICAgIHJldC5zZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbiA9IGM7DQogICAgICAgICAgICBjLnByb21pc2UgPSB0aGlzLnJldDsNCiAgICAgICAgICAgIGMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYnVmZmVyKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGVuIDwgNCB8fCBidWZmZXIucmVhZFVJbnQzMkxFKDApID4gYnVmZmVyLmxlbikgeyB0aGlzLnVuc2hpZnQoYnVmZmVyKTsgfQ0KICAgICAgICAgICAgICAgIHZhciBwID0gSlNPTi5wYXJzZShidWZmZXIuc2xpY2UoNCwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSkudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgc3dpdGNoIChwLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdFUlJPUic6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaihwLnJlYXNvbik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRElBTE9HJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLnRpbWVvdXQpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ1RJTUVPVVQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5idXR0b24gPT0gJ1llcycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcyhwLmJ1dHRvbik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdkZW5pZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGMud3JpdGUodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0RJQUxPRycsIHRpdGxlOiB0aGlzLnJldC50aXRsZSwgY2FwdGlvbjogdGhpcy5yZXQuY2FwdGlvbiwgaWNvbjogJ2NhdXRpb24nLCBidXR0b25zOiBbJyJZZXMiJywgJyJObyInXSwgYnV0dG9uRGVmYXVsdDogMiwgdGltZW91dDogdGhpcy5yZXQudGltZW91dCB9KSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KICAgIHRoaXMubG9jayA9IGZ1bmN0aW9uIGxvY2soKQ0KICAgIHsNCiAgICAgICAgLy8gU3RhcnQgTG9jYWwgU2VydmVyDQogICAgICAgIHZhciByZXQgPSB0aGlzLl9pbml0SVBDQmFzZSgpOw0KICAgICAgICByZXQuc2VydmVyID0gdGhpcy5zdGFydE1lc3NhZ2VTZXJ2ZXIocmV0KTsNCiAgICAgICAgcmV0LnNlcnZlci5yZXQgPSByZXQ7DQogICAgICAgIHJldC5zZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbiA9IGM7DQogICAgICAgICAgICBjLnByb21pc2UgPSB0aGlzLnJldDsNCiAgICAgICAgICAgIGMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYnVmZmVyKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGVuIDwgNCB8fCBidWZmZXIucmVhZFVJbnQzMkxFKDApID4gYnVmZmVyLmxlbikgeyB0aGlzLnVuc2hpZnQoYnVmZmVyKTsgfQ0KICAgICAgICAgICAgICAgIHZhciBwID0gSlNPTi5wYXJzZShidWZmZXIuc2xpY2UoNCwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSkudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgc3dpdGNoIChwLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdFUlJPUic6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaihwLnJlYXNvbik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTE9DSyc6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBjLndyaXRlKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdMT0NLJyB9KSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KICAgIHRoaXMubm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5KHRpdGxlLCBjYXB0aW9uKQ0KICAgIHsNCiAgICAgICAgLy8gU3RhcnQgTG9jYWwgU2VydmVyDQogICAgICAgIHZhciByZXQgPSB0aGlzLl9pbml0SVBDQmFzZSgpOw0KICAgICAgICByZXQudGl0bGUgPSB0aXRsZTsgcmV0LmNhcHRpb24gPSBjYXB0aW9uOyANCiAgICAgICAgcmV0LnNlcnZlciA9IHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyKHJldCk7DQogICAgICAgIHJldC5zZXJ2ZXIucmV0ID0gcmV0Ow0KICAgICAgICByZXQuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBjOw0KICAgICAgICAgICAgYy5wcm9taXNlID0gdGhpcy5yZXQ7DQogICAgICAgICAgICBjLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbiA8IDQgfHwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSA+IGJ1ZmZlci5sZW4pIHsgdGhpcy51bnNoaWZ0KGJ1ZmZlcik7IH0NCiAgICAgICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAocC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVJST1InOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWoocC5yZWFzb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ05PVElGWSc6DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGMud3JpdGUodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ05PVElGWScsIHRpdGxlOiB0aGlzLnJldC50aXRsZSwgY2FwdGlvbjogdGhpcy5yZXQuY2FwdGlvbiB9KSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KICAgIHRoaXMuc3RhcnRDbGllbnQgPSBmdW5jdGlvbiBzdGFydENsaWVudChvcHRpb25zKQ0KICAgIHsNCiAgICAgICAgLy8gQ3JlYXRlIHRoZSBDbGllbnQNCiAgICAgICAgY29uc29sZS5sb2coJ1N0YXJ0aW5nIENsaWVudC4uLicpOw0KDQogICAgICAgIG9wdGlvbnMub3N2ZXJzaW9uID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykuZ2V0T1NWZXJzaW9uKCk7DQogICAgICAgIG9wdGlvbnMudWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsNCiAgICAgICAgdGhpcy5jbGllbnQgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVDb25uZWN0aW9uKG9wdGlvbnMpOw0KICAgICAgICB0aGlzLmNsaWVudC5fb3B0aW9ucyA9IG9wdGlvbnM7DQogICAgICAgIHRoaXMuY2xpZW50Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW4gPCA0IHx8IGJ1ZmZlci5yZWFkVUludDMyTEUoMCkgPiBidWZmZXIubGVuKSB7IHRoaXMudW5zaGlmdChidWZmZXIpOyB9DQogICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgc3dpdGNoIChwLmNvbW1hbmQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSAnTE9DSyc6DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRpbi53cml0ZSgnL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9NZW51XFwgRXh0cmFzL1VzZXIubWVudS9Db250ZW50cy9SZXNvdXJjZXMvQ0dTZXNzaW9uIC1zdXNwZW5kXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgIT0gJycpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdFUlJPUicsIHJlYXNvbjogdGhpcy5fc2hlbGwuc3RkZXJyLnN0ciB9KSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnTE9DSycsIHN0YXR1czogMCB9KSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnTk9USUZZJzoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRvdXQuc3RyID0gJyc7IHRoaXMuX3NoZWxsLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3RkZXJyLnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGluLndyaXRlKCdvc2FzY3JpcHQgLWUgXCd0ZWxsIGN1cnJlbnQgYXBwbGljYXRpb24gdG8gZGlzcGxheSBub3RpZmljYXRpb24gIicgKyBwLmNhcHRpb24gKyAnIiB3aXRoIHRpdGxlICInICsgcC50aXRsZSArICciXCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2hlbGwuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0VSUk9SJywgcmVhc29uOiB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdOT1RJRlknLCBzdGF0dXM6IDAgfSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ0RJQUxPRyc6DQogICAgICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0ID0gcC50aW1lb3V0ID8gKCcgZ2l2aW5nIHVwIGFmdGVyICcgKyBwLnRpbWVvdXQpIDogJyc7DQogICAgICAgICAgICAgICAgICAgIHZhciBpY29uID0gcC5pY29uID8gKCd3aXRoIGljb24gJyArIHAuaWNvbikgOiAnJzsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbnMgPSBwLmJ1dHRvbnMgPyAoJ2J1dHRvbnMgeycgKyBwLmJ1dHRvbnMudG9TdHJpbmcoKSArICd9JykgOiAnJzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHAuYnV0dG9uRGVmYXVsdCAhPSBudWxsKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zICs9ICgnIGRlZmF1bHQgYnV0dG9uICcgKyBwLmJ1dHRvbkRlZmF1bHQpDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRvdXQuc3RyID0gJyc7IHRoaXMuX3NoZWxsLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3RkZXJyLnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGluLndyaXRlKCdvc2FzY3JpcHQgLWUgXCd0ZWxsIGN1cnJlbnQgYXBwbGljYXRpb24gdG8gZGlzcGxheSBkaWFsb2cgIicgKyBwLmNhcHRpb24gKyAnIiB3aXRoIHRpdGxlICInICsgcC50aXRsZSArICciICcgKyBpY29uICsgJyAnICsgYnV0dG9ucyArIHRpbWVvdXQgKyAnXCcgfCBhd2sgXCd7IGM9c3BsaXQoJDAsIHRva2VucywgIiwiKTsgc3BsaXQodG9rZW5zWzFdLCB2YWwsICI6Iik7IGlmKGM9PTEpIHsgcHJpbnQgdmFsWzJdIH0gZWxzZSB7IHNwbGl0KHRva2Vuc1syXSwgZ3UsICI6Iik7IGlmKGd1WzJdPT0idHJ1ZSIpIHsgcHJpbnQgIl9USU1FT1VUXyIgfSBlbHNlIHsgcHJpbnQgdmFsWzJdICB9ICB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaGVsbC5zdGRlcnIuc3RyICE9ICcnKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRVJST1InLCByZWFzb246IHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgfSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoZWxsLnN0ZG91dC5zdHIudHJpbSgpID09ICdfVElNRU9VVF8nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdESUFMT0cnLCB0aW1lb3V0OiB0cnVlIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRElBTE9HJywgYnV0dG9uOiB0aGlzLl9zaGVsbC5zdGRvdXQuc3RyLnRyaW0oKSB9KSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLmNsaWVudC5vbignZXJyb3InLCBmdW5jdGlvbiAoKSB7IHRoaXMudW5pbnN0YWxsKCk7IH0pLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHRoaXMudW5pbnN0YWxsKCk7IH0pOw0KICAgICAgICB0aGlzLmNsaWVudC51bmluc3RhbGwgPSBmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBOZWVkIHRvIHVuaW5zdGFsbCBvdXJzZWx2ZXMNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnLycpLnBvcCgpLCAnLWV4ZWMnLCAidmFyIHM9cmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRMYXVuY2hBZ2VudCgnIiArIHRoaXMuX29wdGlvbnMuc2VydmljZSArICInLCAiICsgdGhpcy5fb3B0aW9ucy51aWQgKyAiKTsgcy51bmxvYWQoKTsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHMucGxpc3QpO3Byb2Nlc3MuZXhpdCgpOyJdLCB7IGRldGFjaGVkOiB0cnVlLCB0eXBlOiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuU3Bhd25UeXBlcy5ERVRBQ0hFRCB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH07DQogICAgICAgIHJldHVybiAodGhpcy5jbGllbnQpOw0KICAgIH07DQogICAgdGhpcy5zdGFydE1lc3NhZ2VTZXJ2ZXIgPSBmdW5jdGlvbiBzdGFydE1lc3NhZ2VTZXJ2ZXIob3B0aW9ucykNCiAgICB7DQogICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMob3B0aW9ucy5wYXRoKSkgeyByZXF1aXJlKCdmcycpLnVubGlua1N5bmMob3B0aW9ucy5wYXRoKTsgfQ0KICAgICAgICBvcHRpb25zLndyaXRhYmxlQWxsID0gdHJ1ZTsNCg0KICAgICAgICB2YXIgcmV0ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7DQogICAgICAgIHJldC51aWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOw0KICAgICAgICByZXQub3N2ZXJzaW9uID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykuZ2V0T1NWZXJzaW9uKCk7DQogICAgICAgIHJldC5fb3B0aW9ucyA9IG9wdGlvbnM7DQogICAgICAgIHJldC50aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKG9iaikNCiAgICAgICAgew0KICAgICAgICAgICAgb2JqLmNsb3NlKCk7DQogICAgICAgICAgICBvYmouX29wdGlvbnMuX3JlaignQ29ubmVjdGlvbiB0aW1lb3V0Jyk7DQogICAgICAgIH0sIDUwMDAsIHJldCk7DQogICAgICAgIHJldC5saXN0ZW4ob3B0aW9ucyk7DQogICAgICAgIHJldC5vbignY29ubmVjdGlvbicsIGZ1bmN0aW9uIChjKQ0KICAgICAgICB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7DQogICAgICAgIH0pOw0KICAgICAgICByZXQub24oJ34nLCBmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmModGhpcy5fb3B0aW9ucy5wYXRoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5pbnN0YWxsTGF1bmNoQWdlbnQoDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy50bXBTZXJ2aWNlTmFtZSwgc2VydmljZVBhdGg6IHByb2Nlc3MuZXhlY1BhdGgsIHN0YXJ0VHlwZTogJ0FVVE9fU1RBUlQnLCB1aWQ6IHJldC51aWQsDQogICAgICAgICAgICAgICAgc2Vzc2lvblR5cGVzOiBbJ0FxdWEnXSwgcGFyYW1ldGVyczogWyctZXhlYycsICJyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnN0YXJ0Q2xpZW50KHsgcGF0aDogJyIgKyBvcHRpb25zLnBhdGggKyAiJywgc2VydmljZTogJyIgKyBvcHRpb25zLnRtcFNlcnZpY2VOYW1lICsgIicgfSkub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOyJdDQogICAgICAgICAgICB9KTsNCiAgICAgICAgcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRMYXVuY2hBZ2VudChvcHRpb25zLnRtcFNlcnZpY2VOYW1lLCByZXQudWlkKS5sb2FkKCk7DQoNCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH07DQp9DQoNCg0Kc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQp7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBtZXNzYWdlQm94KCk7DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgJ2xpbnV4JzoNCiAgICBjYXNlICdmcmVlYnNkJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgbGludXhfbWVzc2FnZUJveCgpOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBtYWNvc19tZXNzYWdlQm94KCk7DQogICAgICAgIGJyZWFrOw0KfQ0KDQoNCg0KDQoNCg0K", 15320); - ILibBase64DecodeEx((unsigned char*)_messagebox, 31320, (unsigned char*)_messagebox + 31320); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "message-box"); duk_push_string(ctx, _messagebox + 31320); + char *_messagebox = ILibMemory_Allocate(56280, 0, NULL, NULL); + memcpy_s(_messagebox + 0, 32160, "LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmNvbnN0IE1CX09LID0gMHgwMDAwMDAwMDsNCmNvbnN0IE1CX09LQ0FOQ0VMICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxOw0KY29uc3QgTUJfQUJPUlRSRVRSWUlHTk9SRSAgICAgICA9IDB4MDAwMDAwMDI7DQpjb25zdCBNQl9ZRVNOT0NBTkNFTCAgICAgICAgICAgID0gMHgwMDAwMDAwMzsNCmNvbnN0IE1CX1lFU05PICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0Ow0KY29uc3QgTUJfUkVUUllDQU5DRUwgICAgICAgICAgICA9IDB4MDAwMDAwMDU7DQpjb25zdCBNQl9UT1BNT1NUICAgICAgICAgICAgICAgID0gMHgwMDA0MDAwMDsNCmNvbnN0IE1CX1NFVEZPUkVHUk9VTkQgICAgICAgICAgPSAweDAwMDEwMDAwOw0KDQpjb25zdCBNQl9ERUZCVVRUT04xICAgICAgICAgICAgID0gMHgwMDAwMDAwMDsNCmNvbnN0IE1CX0RFRkJVVFRPTjIgICAgICAgICAgICAgPSAweDAwMDAwMTAwOw0KY29uc3QgTUJfREVGQlVUVE9OMyAgICAgICAgICAgICA9IDB4MDAwMDAyMDA7DQpjb25zdCBNQl9JQ09OSEFORCAgICAgICAgICAgICAgID0gMHgwMDAwMDAxMDsNCmNvbnN0IE1CX0lDT05RVUVTVElPTiAgICAgICAgICAgPSAweDAwMDAwMDIwOw0KY29uc3QgTUJfSUNPTkVYQ0xBTUFUSU9OICAgICAgICA9IDB4MDAwMDAwMzA7DQpjb25zdCBNQl9JQ09OQVNURVJJU0sgICAgICAgICAgID0gMHgwMDAwMDA0MDsNCg0KY29uc3QgSURPSyAgICAgPSAxOw0KY29uc3QgSURDQU5DRUwgPSAyOw0KY29uc3QgSURBQk9SVCAgPSAzOw0KY29uc3QgSURSRVRSWSAgPSA0Ow0KY29uc3QgSURJR05PUkUgPSA1Ow0KY29uc3QgSURZRVMgICAgPSA2Ow0KY29uc3QgSUROTyAgICAgPSA3Ow0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBjaGlsZFNjcmlwdCA9ICJcDQogICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLm9uKCdkYXRhJywgZnVuY3Rpb24gKGopXA0KICAgICAgICB7XA0KICAgICAgICAgICAgc3dpdGNoKGouY29tbWFuZClcDQogICAgICAgICAgICB7XA0KICAgICAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2VCb3gnOlwNCiAgICAgICAgICAgICAgICAgICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKVwNCiAgICAgICAgICAgICAgICAgICAge1wNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ01lc3NhZ2VCb3hBJyk7XA0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjMyLk1lc3NhZ2VCb3hBLmFzeW5jKDAsIEdNLkNyZWF0ZVZhcmlhYmxlKGouY2FwdGlvbiksIEdNLkNyZWF0ZVZhcmlhYmxlKGoudGl0bGUpLCAiICsgKE1CX1lFU05PIHwgTUJfREVGQlVUVE9OMiB8IE1CX0lDT05FWENMQU1BVElPTiB8IE1CX1NFVEZPUkVHUk9VTkQpLnRvU3RyaW5nKCkgKyAiKS50aGVuKFwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHIpXA0KICAgICAgICAgICAgICAgICAgICAgICAge1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyLlZhbCA9PSAiICsgSURZRVMudG9TdHJpbmcoKSArICIpXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoIiArIElEWUVTLnRvU3RyaW5nKCkgKyAiKTtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoIiArIElETk8udG9TdHJpbmcoKSArICIpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1wNCiAgICAgICAgICAgICAgICAgICAgfVwNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XA0KICAgICAgICAgICAgfVwNCiAgICAgICAgfSk7XA0KICAgICI7DQoNCmZ1bmN0aW9uIG1lc3NhZ2VCb3goKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gJ21lc3NhZ2UtYm94JzsNCiAgICB0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY2FwdGlvbiwgdGltZW91dCkNCiAgICB7DQogICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KICAgICAgICB2YXIga2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7DQogICAgICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2Vzc0lkVG9TZXNzaW9uSWQnKTsNCiAgICAgICAgdmFyIHBzaWQgPSBHTS5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgaWYgKGtlcm5lbDMyLlByb2Nlc3NJZFRvU2Vzc2lvbklkKHByb2Nlc3MucGlkLCBwc2lkKS5WYWwgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9yZWooJ0ludGVybmFsIEVycm9yJyk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7IHRpbWVvdXQgPSAxMDsgfQ0KICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsNCiAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGV4ZWN1dGlvblRpbWVvdXQ6IHRpbWVvdXQgfTsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgb3B0aW9ucy5zZXNzaW9uSWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOw0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2Vzc2lvbklkID09IHBzaWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkgeyBkZWxldGUgb3B0aW9ucy5zZXNzaW9uSWQ7IH0NCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChlZSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9yZWooJ05vIGxvZ2dlZCBvbiB1c2VycycpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQogICAgICAgIHJldC5fdGl0bGUgPSB0aXRsZTsNCiAgICAgICAgcmV0Ll9jYXB0aW9uID0gY2FwdGlvbjsNCiAgICAgICAgcmV0Ll9jb250YWluZXIgPSByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5DcmVhdGUob3B0aW9ucyk7DQogICAgICAgIHJldC5fY29udGFpbmVyLnByb21pc2UgPSByZXQ7DQogICAgICAgIHJldC5fY29udGFpbmVyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGopDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKGogPT0gSURZRVMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignRGVuaWVkJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICByZXQuX2NvbnRhaW5lci5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdUaW1lb3V0Jyk7DQogICAgICAgIH0pOw0KICAgICAgICByZXQuX2NvbnRhaW5lci5FeGVjdXRlU3RyaW5nKGNoaWxkU2NyaXB0KTsNCiAgICAgICAgcmV0Ll9jb250YWluZXIuc2VuZCh7IGNvbW1hbmQ6ICdtZXNzYWdlQm94JywgY2FwdGlvbjogY2FwdGlvbiwgdGl0bGU6IHRpdGxlIH0pOw0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCn0NCg0KDQpmdW5jdGlvbiBsaW51eF9tZXNzYWdlQm94KCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdtZXNzYWdlLWJveCc7DQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd6ZW5pdHknLA0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyB6ZW5pdHkgfCBhd2sgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQogICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09ICcnICYmIHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9iaW4vemVuaXR5JykpIHsgbG9jYXRpb24gPSAnL3Vzci9sb2NhbC9iaW4vemVuaXR5JzsgfQ0KICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnJykgeyByZXR1cm4gKG51bGwpOyB9DQoNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUobG9jYXRpb24gKyAnIC0taGVscC1hbGwgfCBncmVwIHRpbWVvdXRcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB2YXIgcmV0ID0geyBwYXRoOiBsb2NhdGlvbiwgdGltZW91dDogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyBmYWxzZSA6IHRydWUgfTsNCg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZShsb2NhdGlvbiArICcgLS12ZXJzaW9uIHwgYXdrIC1GLiBcJ3sgcHJpbnRmICJbJXMsICVzXVxcbiIsICQxLCAkMjsgfSBcJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIHJldC52ZXJzaW9uID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgfSkoKQ0KICAgICAgICB9KTsNCiAgICBpZiAoIXRoaXMuemVuaXR5KQ0KICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrZGlhbG9nJywNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMga2RpYWxvZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyBudWxsIDogeyBwYXRoOiBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSB9KTsNCiAgICAgICAgICAgICAgICB9KSgpDQogICAgICAgICAgICB9KTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub3RpZnlzZW5kJywNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMgbm90aWZ5LXNlbmQgfCBhd2sgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gbnVsbCA6IHsgcGF0aDogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgfSk7DQogICAgICAgICAgICAgICAgfSkoKQ0KICAgICAgICAgICAgfSk7DQogICAgfQ0KDQogICAgdGhpcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNhcHRpb24sIHRpbWVvdXQpDQogICAgew0KICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7IHRpbWVvdXQgPSAxMDsgfQ0KICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsNCiAgICAgICAgdmFyIHVpZDsgICAgDQogICAgICAgIHZhciB4aW5mbzsNCg0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsNCiAgICAgICAgICAgIHhpbmZvID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0WEluZm8odWlkKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChlKQ0KICAgICAgICB7DQogICAgICAgICAgICB1aWQgPSAwOw0KICAgICAgICAgICAgeGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbygwKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh4aW5mbyA9PSBudWxsKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXQuX3JlaignVGhpcyBzeXN0ZW0gY2Fubm90IGRpc3BsYXkgYSB1c2VyIGRpYWxvZyBib3ggd2hlbiBhIHVzZXIgaXMgbm90IGxvZ2dlZCBpbicpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuemVuaXR5KQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBHTk9NRS9aRU5JVFkNCiAgICAgICAgICAgIGlmICh0aGlzLnplbml0eS50aW1lb3V0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSh0aGlzLnplbml0eS5wYXRoLCBbJ3plbml0eScsICctLXF1ZXN0aW9uJywgJy0tdGl0bGU9JyArIHRpdGxlLCAnLS10ZXh0PScgKyBjYXB0aW9uLCAnLS10aW1lb3V0PScgKyB0aW1lb3V0XSwgeyB1aWQ6IHVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHhpbmZvLmRpc3BsYXkgfSB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1xdWVzdGlvbicsICctLXRpdGxlPScgKyB0aXRsZSwgJy0tdGV4dD0nICsgY2FwdGlvbl0sIHsgdWlkOiB1aWQsIGVudjogeyBYQVVUSE9SSVRZOiB4aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiB4aW5mby5kaXNwbGF5IH0gfSk7DQogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChjKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgYy50aW1lb3V0ID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgYy5raWxsKCk7DQogICAgICAgICAgICAgICAgfSwgdGltZW91dCAqIDEwMDAsIHJldC5jaGlsZCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuY2hpbGQucHJvbWlzZSA9IHJldDsNCiAgICAgICAgICAgIHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZW91dCkgeyBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsgfQ0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ2RlbmllZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaigndGltZW91dCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZih0aGlzLmtkaWFsb2cpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9ICdmcmVlYnNkJyAmJiBwcm9jZXNzLmVudlsnRElTUExBWSddKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSh0aGlzLmtkaWFsb2cucGF0aCwgWydrZGlhbG9nJywgJy0tdGl0bGUnLCB0aXRsZSwgJy0teWVzbm8nLCBjYXB0aW9uXSk7DQogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnByb21pc2UgPSByZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHhkZyA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5maW5kRW52KHVpZCwgJ1hER19SVU5USU1FX0RJUicpOyBpZiAoeGRnID09IG51bGwpIHsgeGRnID0gJyc7IH0NCiAgICAgICAgICAgICAgICBpZiAoIXhpbmZvIHx8ICF4aW5mby5kaXNwbGF5IHx8ICF4aW5mby54YXV0aG9yaXR5KSB7IHJldC5fcmVqKCdJbnRlcmFsIEVycm9yLCBjb3VsZCBub3QgZGV0ZXJtaW5lIFgxMS9YREcgZW52Jyk7IHJldHVybiAocmV0KTsgfQ0KICAgICAgICAgICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSh0aGlzLmtkaWFsb2cucGF0aCwgWydrZGlhbG9nJywgJy0tdGl0bGUnLCB0aXRsZSwgJy0teWVzbm8nLCBjYXB0aW9uXSwgeyB1aWQ6IHVpZCwgZW52OiB7IERJU1BMQVk6IHhpbmZvLmRpc3BsYXksIFhBVVRIT1JJVFk6IHhpbmZvLnhhdXRob3JpdHksIFhER19SVU5USU1FX0RJUjogeGRnIH0gfSk7DQogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnByb21pc2UgPSByZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuY2hpbGQudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYy50aW1lb3V0ID0gbnVsbDsNCiAgICAgICAgICAgICAgICBjLmtpbGwoKTsNCiAgICAgICAgICAgIH0sIHRpbWVvdXQgKiAxMDAwLCByZXQuY2hpbGQpOw0KICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgIHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lb3V0KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ2RlbmllZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaigndGltZW91dCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCd0aW1lb3V0Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH07DQp9DQoNCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0Kew0KICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZU9iamVjdChvYmopDQogICAgew0KICAgICAgICB2YXIgaiA9IEpTT04uc3RyaW5naWZ5KG9iaik7DQogICAgICAgIHZhciBiID0gQnVmZmVyLmFsbG9jKGoubGVuZ3RoICsgNCk7DQogICAgICAgIGIud3JpdGVVSW50MzJMRShqLmxlbmd0aCArIDQpOw0KICAgICAgICBCdWZmZXIuZnJvbShqKS5jb3B5KGIsIDQpOw0KICAgICAgICByZXR1cm4gKGIpOw0KICAg", 16000); + memcpy_s(_messagebox + 16000, 16160, "IH0NCn0NCg0KZnVuY3Rpb24gbWFjb3NfbWVzc2FnZUJveCgpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAnbWVzc2FnZS1ib3gnOw0KICAgIHRoaXMuX2luaXRJUENCYXNlID0gZnVuY3Rpb24gX2luaXRJUENCYXNlKCkNCiAgICB7DQogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICByZXQudWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9yZWooZSk7DQogICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXQucGF0aCA9ICcvdmFyL3RtcC8nICsgcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnLycpLnBvcCgpICsgJ19ldic7DQogICAgICAgIHZhciBuOw0KDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICBuID0gcmVxdWlyZSgndGxzJykuZ2VuZXJhdGVSYW5kb21JbnRlZ2VyKCcxJywgJzk5OTk5Jyk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG4gPSAwOw0KICAgICAgICB9DQogICAgICAgIHdoaWxlIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMocmV0LnBhdGggKyBuKSkNCiAgICAgICAgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBuID0gcmVxdWlyZSgndGxzJykuZ2VuZXJhdGVSYW5kb21JbnRlZ2VyKCcxJywgJzk5OTk5Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICsrbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXQucGF0aCA9IHJldC5wYXRoICsgbjsNCiAgICAgICAgcmV0LnRtcFNlcnZpY2VOYW1lID0gJ21lc2hOb3RpZmljYXRpb25TZXJ2ZXInICsgbjsNCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH07DQogICAgDQogICAgdGhpcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNhcHRpb24sIHRpbWVvdXQpDQogICAgew0KICAgICAgICAvLyBTdGFydCBMb2NhbCBTZXJ2ZXINCiAgICAgICAgdmFyIHJldCA9IHRoaXMuX2luaXRJUENCYXNlKCk7DQogICAgICAgIHJldC50aXRsZSA9IHRpdGxlOyByZXQuY2FwdGlvbiA9IGNhcHRpb247IHJldC50aW1lb3V0ID0gdGltZW91dDsNCiAgICAgICAgcmV0LnNlcnZlciA9IHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyKHJldCk7DQogICAgICAgIHJldC5zZXJ2ZXIucmV0ID0gcmV0Ow0KICAgICAgICByZXQuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBjOw0KICAgICAgICAgICAgYy5wcm9taXNlID0gdGhpcy5yZXQ7DQogICAgICAgICAgICBjLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbiA8IDQgfHwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSA+IGJ1ZmZlci5sZW4pIHsgdGhpcy51bnNoaWZ0KGJ1ZmZlcik7IH0NCiAgICAgICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAocC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVJST1InOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWoocC5yZWFzb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RJQUxPRyc6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocC50aW1lb3V0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdUSU1FT1VUJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuYnV0dG9uID09ICdZZXMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMocC5idXR0b24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignZGVuaWVkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBjLndyaXRlKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdESUFMT0cnLCB0aXRsZTogdGhpcy5yZXQudGl0bGUsIGNhcHRpb246IHRoaXMucmV0LmNhcHRpb24sIGljb246ICdjYXV0aW9uJywgYnV0dG9uczogWyciWWVzIicsICciTm8iJ10sIGJ1dHRvbkRlZmF1bHQ6IDIsIHRpbWVvdXQ6IHRoaXMucmV0LnRpbWVvdXQgfSkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCiAgICB0aGlzLmxvY2sgPSBmdW5jdGlvbiBsb2NrKCkNCiAgICB7DQogICAgICAgIC8vIFN0YXJ0IExvY2FsIFNlcnZlcg0KICAgICAgICB2YXIgcmV0ID0gdGhpcy5faW5pdElQQ0Jhc2UoKTsNCiAgICAgICAgcmV0LnNlcnZlciA9IHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyKHJldCk7DQogICAgICAgIHJldC5zZXJ2ZXIucmV0ID0gcmV0Ow0KICAgICAgICByZXQuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBjOw0KICAgICAgICAgICAgYy5wcm9taXNlID0gdGhpcy5yZXQ7DQogICAgICAgICAgICBjLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbiA8IDQgfHwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSA+IGJ1ZmZlci5sZW4pIHsgdGhpcy51bnNoaWZ0KGJ1ZmZlcik7IH0NCiAgICAgICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAocC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVJST1InOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWoocC5yZWFzb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xPQ0snOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgYy53cml0ZSh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnTE9DSycgfSkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCiAgICB0aGlzLm5vdGlmeSA9IGZ1bmN0aW9uIG5vdGlmeSh0aXRsZSwgY2FwdGlvbikNCiAgICB7DQogICAgICAgIC8vIFN0YXJ0IExvY2FsIFNlcnZlcg0KICAgICAgICB2YXIgcmV0ID0gdGhpcy5faW5pdElQQ0Jhc2UoKTsNCiAgICAgICAgcmV0LnRpdGxlID0gdGl0bGU7IHJldC5jYXB0aW9uID0gY2FwdGlvbjsgDQogICAgICAgIHJldC5zZXJ2ZXIgPSB0aGlzLnN0YXJ0TWVzc2FnZVNlcnZlcihyZXQpOw0KICAgICAgICByZXQuc2VydmVyLnJldCA9IHJldDsNCiAgICAgICAgcmV0LnNlcnZlci5vbignY29ubmVjdGlvbicsIGZ1bmN0aW9uIChjKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9jb25uZWN0aW9uID0gYzsNCiAgICAgICAgICAgIGMucHJvbWlzZSA9IHRoaXMucmV0Ow0KICAgICAgICAgICAgYy5vbignZGF0YScsIGZ1bmN0aW9uIChidWZmZXIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW4gPCA0IHx8IGJ1ZmZlci5yZWFkVUludDMyTEUoMCkgPiBidWZmZXIubGVuKSB7IHRoaXMudW5zaGlmdChidWZmZXIpOyB9DQogICAgICAgICAgICAgICAgdmFyIHAgPSBKU09OLnBhcnNlKGJ1ZmZlci5zbGljZSg0LCBidWZmZXIucmVhZFVJbnQzMkxFKDApKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHAuY29tbWFuZCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0VSUk9SJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKHAucmVhc29uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdOT1RJRlknOg0KDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBjLndyaXRlKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdOT1RJRlknLCB0aXRsZTogdGhpcy5yZXQudGl0bGUsIGNhcHRpb246IHRoaXMucmV0LmNhcHRpb24gfSkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCiAgICB0aGlzLnN0YXJ0Q2xpZW50ID0gZnVuY3Rpb24gc3RhcnRDbGllbnQob3B0aW9ucykNCiAgICB7DQogICAgICAgIC8vIENyZWF0ZSB0aGUgQ2xpZW50DQogICAgICAgIGNvbnNvbGUubG9nKCdTdGFydGluZyBDbGllbnQuLi4nKTsNCg0KICAgICAgICBvcHRpb25zLm9zdmVyc2lvbiA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLmdldE9TVmVyc2lvbigpOw0KICAgICAgICBvcHRpb25zLnVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7DQogICAgICAgIHRoaXMuY2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbihvcHRpb25zKTsNCiAgICAgICAgdGhpcy5jbGllbnQuX29wdGlvbnMgPSBvcHRpb25zOw0KICAgICAgICB0aGlzLmNsaWVudC5vbignZGF0YScsIGZ1bmN0aW9uIChidWZmZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChidWZmZXIubGVuIDwgNCB8fCBidWZmZXIucmVhZFVJbnQzMkxFKDApID4gYnVmZmVyLmxlbikgeyB0aGlzLnVuc2hpZnQoYnVmZmVyKTsgfQ0KICAgICAgICAgICAgdmFyIHAgPSBKU09OLnBhcnNlKGJ1ZmZlci5zbGljZSg0LCBidWZmZXIucmVhZFVJbnQzMkxFKDApKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgIHN3aXRjaCAocC5jb21tYW5kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ0xPQ0snOg0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZG91dC5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyID0gJyc7IHRoaXMuX3NoZWxsLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3RkaW4ud3JpdGUoJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvTWVudVxcIEV4dHJhcy9Vc2VyLm1lbnUvQ29udGVudHMvUmVzb3VyY2VzL0NHU2Vzc2lvbiAtc3VzcGVuZFxuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaGVsbC5zdGRlcnIuc3RyICE9ICcnKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRVJST1InLCByZWFzb246IHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgfSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0xPQ0snLCBzdGF0dXM6IDAgfSkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ05PVElGWSc6DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBjdXJyZW50IGFwcGxpY2F0aW9uIHRvIGRpc3BsYXkgbm90aWZpY2F0aW9uICInICsgcC5jYXB0aW9uICsgJyIgd2l0aCB0aXRsZSAiJyArIHAudGl0bGUgKyAnIlwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgIT0gJycpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kKHRyYW5zbGF0ZU9iamVjdCh7IGNvbW1hbmQ6ICdFUlJPUicsIHJlYXNvbjogdGhpcy5fc2hlbGwuc3RkZXJyLnN0ciB9KSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnTk9USUZZJywgc3RhdHVzOiAwIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdESUFMT0cnOg0KICAgICAgICAgICAgICAgICAgICB2YXIgdGltZW91dCA9IHAudGltZW91dCA/ICgnIGdpdmluZyB1cCBhZnRlciAnICsgcC50aW1lb3V0KSA6ICcnOw0KICAgICAgICAgICAgICAgICAgICB2YXIgaWNvbiA9IHAuaWNvbiA/ICgnd2l0aCBpY29uICcgKyBwLmljb24pIDogJyc7DQogICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25zID0gcC5idXR0b25zID8gKCdidXR0b25zIHsnICsgcC5idXR0b25zLnRvU3RyaW5nKCkgKyAnfScpIDogJyc7DQogICAgICAgICAgICAgICAgICAgIGlmIChwLmJ1dHRvbkRlZmF1bHQgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyArPSAoJyBkZWZhdWx0IGJ1dHRvbiAnICsgcC5idXR0b25EZWZhdWx0KQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBjdXJyZW50IGFwcGxpY2F0aW9uIHRvIGRpc3BsYXkgZGlhbG9nICInICsgcC5jYXB0aW9uICsgJyIgd2l0aCB0aXRsZSAiJyArIHAudGl0bGUgKyAnIiAnICsgaWNvbiArICcgJyArIGJ1dHRvbnMgKyB0aW1lb3V0ICsgJ1wnIHwgYXdrIFwneyBjPXNwbGl0KCQwLCB0b2tlbnMsICIsIik7IHNwbGl0KHRva2Vuc1sxXSwgdmFsLCAiOiIpOyBpZihjPT0xKSB7IHByaW50IHZhbFsyXSB9IGVsc2UgeyBzcGxpdCh0b2tlbnNbMl0sIGd1LCAiOiIpOyBpZihndVsyXT09InRydWUiKSB7IHByaW50ICJfVElNRU9VVF8iIH0gZWxzZSB7IHByaW50IHZhbFsyXSAgfSAgfSB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2hlbGwuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0VSUk9SJywgcmVhc29uOiB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaGVsbC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnX1RJTUVPVVRfJykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRElBTE9HJywgdGltZW91dDogdHJ1ZSB9KSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0RJQUxPRycsIGJ1dHRvbjogdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ci50cmltKCkgfSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB0aGlzLnVuaW5zdGFsbCgpOyB9KS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyB0aGlzLnVuaW5zdGFsbCgpOyB9KTsNCiAgICAgICAgdGhpcy5jbGllbnQudW5pbnN0YWxsID0gZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTmVlZCB0byB1bmluc3RhbGwgb3Vyc2VsdmVzDQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQoJy8nKS5wb3AoKSwgJy1leGVjJywgInZhciBzPXJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0TGF1bmNoQWdlbnQoJyIgKyB0aGlzLl9vcHRpb25zLnNlcnZpY2UgKyAiJywgIiArIHRoaXMuX29wdGlvbnMudWlkICsgIik7IHMudW5sb2FkKCk7IHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzLnBsaXN0KTtwcm9jZXNzLmV4aXQoKTsiXSwgeyBkZXRhY2hlZDogdHJ1ZSwgdHlwZTogcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuREVUQUNIRUQgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4gKHRoaXMuY2xpZW50KTsNCiAgICB9Ow0KICAgIHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyID0gZnVuY3Rpb24gc3RhcnRNZXNzYWdlU2VydmVyKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKG9wdGlvbnMucGF0aCkpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKG9wdGlvbnMucGF0aCk7IH0NCiAgICAgICAgb3B0aW9ucy53cml0YWJsZUFsbCA9IHRydWU7DQoNCiAgICAgICAgdmFyIHJldCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOw0KICAgICAgICByZXQudWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsNCiAgICAgICAgcmV0Lm9zdmVyc2lvbiA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLmdldE9TVmVyc2lvbigpOw0KICAgICAgICByZXQuX29wdGlvbnMgPSBvcHRpb25zOw0KICAgICAgICByZXQudGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChvYmopDQogICAgICAgIHsNCiAgICAgICAgICAgIG9iai5jbG9zZSgpOw0KICAgICAgICAgICAgb2JqLl9vcHRpb25zLl9yZWooJ0Nvbm5lY3Rpb24gdGltZW91dCcpOw0KICAgICAgICB9LCA1MDAwLCByZXQpOw0KICAgICAgICByZXQubGlzdGVuKG9wdGlvbnMpOw0KICAgICAgICByZXQub24oJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0Lm9uKCd+JywgZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHRoaXMuX29wdGlvbnMucGF0aCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuaW5zdGFsbExhdW5jaEFnZW50KA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMudG1wU2VydmljZU5hbWUsIHNlcnZpY2VQYXRoOiBwcm9jZXNzLmV4ZWNQYXRoLCBzdGFydFR5cGU6ICdBVVRPX1NUQVJUJywgdWlkOiByZXQudWlkLA0KICAgICAgICAgICAgICAgIHNlc3Npb25UeXBlczogWydBcXVhJ10sIHBhcmFtZXRlcnM6IFsnLWV4ZWMnLCAicmVxdWlyZSgnbWVzc2FnZS1ib3gnKS5zdGFydENsaWVudCh7IHBhdGg6ICciICsgb3B0aW9ucy5wYXRoICsgIicsIHNlcnZpY2U6ICciICsgb3B0aW9ucy50bXBTZXJ2aWNlTmFtZSArICInIH0pLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsiXQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0TGF1bmNoQWdlbnQob3B0aW9ucy50bXBTZXJ2aWNlTmFtZSwgcmV0LnVpZCkubG9hZCgpOw0KDQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9Ow0KfQ0KDQoNCnN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0Kew0KICAgIGNhc2UgJ3dpbjMyJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgbWVzc2FnZUJveCgpOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdsaW51eCc6DQogICAgY2FzZSAnZnJlZWJzZCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IGxpbnV4X21lc3NhZ2VCb3goKTsN", 16000); + memcpy_s(_messagebox + 32000, 160, "CiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgbWFjb3NfbWVzc2FnZUJveCgpOw0KICAgICAgICBicmVhazsNCn0NCg0KDQoNCg0KDQoNCv==", 160); + ILibBase64DecodeEx((unsigned char*)_messagebox, 32160, (unsigned char*)_messagebox + 32160); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "message-box"); duk_push_string(ctx, _messagebox + 32160); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_messagebox); // toaster, refer to modules/toaster.js - duk_peval_string_noresult(ctx, "addModule('toaster', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwoKaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nIHx8IHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQp7CiAgICBmdW5jdGlvbiBmaW5kUGF0aChhcHApCiAgICB7CiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyAiICsgYXBwICsgIiB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzICIgKyBhcHAgKyAiXG5leGl0XG4iKTsKICAgICAgICB9CiAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnICYmIGNoaWxkLnN0ZG91dC5zdHIgPT0gJycgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL2Jpbi8nICsgYXBwKSkgeyByZXR1cm4gKCcvdXNyL2xvY2FsL2Jpbi8nICsgYXBwKTsgfQogICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ciA9PSAnJyA/IG51bGwgOiBjaGlsZC5zdGRvdXQuc3RyKTsKICAgIH0KfQoKZnVuY3Rpb24gVG9hc3RlcigpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3RvYXN0ZXInOwogICAgdGhpcy5Ub2FzdCA9IGZ1bmN0aW9uIFRvYXN0KHRpdGxlLCBjYXB0aW9uKQogICAgewogICAgICAgIHZhciByZXRWYWwgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgIHJldFZhbC50aXRsZSA9IHRpdGxlOwogICAgICAgIHJldFZhbC5jYXB0aW9uID0gY2FwdGlvbjsKCiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnd2luMzInOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgICAgICAgICAgICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgICAgICAgICAgICAgICAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1Byb2Nlc3NJZFRvU2Vzc2lvbklkJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBzaWQgPSBHTS5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgY29uc29sZVVpZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlVWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3JlaignQ2Fubm90IGRpc3BsYXkgdXNlciBub3RpZmljYXRpb24gd2hlbiBhIHVzZXIgaXMgbm90IGxvZ2dlZCBpbicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChrZXJuZWwzMi5Qcm9jZXNzSWRUb1Nlc3Npb25JZChwcm9jZXNzLnBpZCwgcHNpZCkuVmFsID09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3JlaignaW50ZXJuYWwgZXJyb3InKTsgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGVVaWQgPT0gcHNpZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHJ1bm5pbmcgb24gdGhlIHBoeXNpY2FsIGNvbnNvbGUKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZCA9IHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLkNyZWF0ZSh7IHByb2Nlc3NJc29sYXRpb246IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgc28gc3Bhd24gdGhlIFNjcmlwdENvbnRhaW5lciBpbnRvIHRoZSBjb3JyZWN0IHNlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZCA9IHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLkNyZWF0ZSh7IHByb2Nlc3NJc29sYXRpb246IHRydWUsIHNlc3Npb25JZDogY29uc29sZVVpZCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5wYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOyB9KTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLmFkZE1vZHVsZSgnd2luLWNvbnNvbGUnLCBnZXRKU01vZHVsZSgnd2luLWNvbnNvbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5hZGRNb2R1bGUoJ3dpbi1tZXNzYWdlLXB1bXAnLCBnZXRKU01vZHVsZSgnd2luLW1lc3NhZ2UtcHVtcCcpKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICJcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnl7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvYXN0ID0gcmVxdWlyZSgnd2luLWNvbnNvbGUnKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFsbG9vbiA9IHRvYXN0LlNldFRyYXlJY29uKHsgc3pJbmZvOiAnIiArIGNhcHRpb24gKyAiJywgc3pJbmZvVGl0bGU6ICciICsgdGl0bGUgKyAiJywgYmFsbG9vbk9ubHk6IHRydWUgfSk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsbG9vbi5vbignVG9hc3REaXNtaXNzZWQnLCBmdW5jdGlvbigpe3Byb2Nlc3MuZXhpdCgpO30pO1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChlKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuc2VuZChlKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoJ2RvbmUnKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwogICAgICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuRXhlY3V0ZVN0cmluZyhzdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgICAgICBjYXNlICdsaW51eCc6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY29uc29sZVVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC54aW5mbyA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldFhJbmZvKHJldFZhbC5jb25zb2xlVWlkKTsKCQkJICAgICAgICAgICAgcmV0VmFsLnVzZXJuYW1lID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHJldFZhbC5jb25zb2xlVWlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHh4ZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fcmVqKHh4ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHV0aWwgPSBmaW5kUGF0aCgnemVuaXR5Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgWkVOSVRZCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSh1dGlsLCBbJ3plbml0eScsICctLW5vdGlmaWNhdGlvbicsICctLXRpdGxlPScgKyB0aXRsZSwgJy0tdGV4dD0nICsgY2FwdGlvbiwgJy0tdGltZW91dD01J10sIHsgdWlkOiByZXRWYWwuY29uc29sZVVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHJldFZhbC54aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiByZXRWYWwueGluZm8uZGlzcGxheSB9IH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQucGFyZW50ID0gcmV0VmFsOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IHRoaXMucGFyZW50LmtpbGwoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSAhPSAnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHV0aWwgPSBmaW5kUGF0aCgnbm90aWZ5LXNlbmQnKSkgJiYgdGhpcy5zdGRlcnIuc3RyLnNwbGl0KCdHTGliLUNSSVRJQ0FMJykubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBidWcgaW4gemVuaXR5LCBzbyB3ZSBzaG91bGQgdHJ5IG5vdGlmeS1zZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnRElTUExBWSddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBESVNQTEFZIGlzIHNldCwgc28gd2UgZ29vZCB0byBnbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodXRpbCwgWydub3RpZnktc2VuZCcsIHRoaXMucGFyZW50LnRpdGxlLCB0aGlzLnBhcmVudC5jYXB0aW9uXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5jaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCB0aGUgRElTUExBWSB0byB1c2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZSA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRVc2VybmFtZShjb25zb2xlVWlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmNoaWxkLnBhcmVudCA9IHRoaXMucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGQuc3RkaW4ud3JpdGUoJ3N1IC0gJyArIHVzZXJuYW1lICsgJyAtYyAiRElTUExBWT0nICsgZGlzcGxheSArICcgbm90aWZ5LXNlbmQgXCcnICsgdGhpcy5wYXJlbnQudGl0bGUgKyAnXCcgXCcnICsgdGhpcy5wYXJlbnQuY2FwdGlvbiArICdcJyJcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVElGWS1TRU5EIGhhcyBhIGJ1ZyB3aGVyZSB0aW1lb3V0cyBkb24ndCB3b3JrLCBzbyB0aGUgZGVmYXVsdCBpcyA1IHNlY29uZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uRmFrZURpc21pc3NlZChvYmopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5fcmVzKCdESVNNSVNTRUQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMDAsIHRoaXMucGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZha2UgYSB0b2FzdCB1c2luZyB6ZW5pdHkgLS1pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwgPSBmaW5kUGF0aCgnemVuaXR5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHV0aWwsIFsnemVuaXR5JywgJy0taW5mbycsICctLXRpdGxlPScgKyB0aGlzLnBhcmVudC50aXRsZSwgJy0tdGV4dD0nICsgdGhpcy5wYXJlbnQuY2FwdGlvbiwgJy0tdGltZW91dD01J10sIHsgdWlkOiB0aGlzLnBhcmVudC5jb25zb2xlVWlkLCBlbnY6IHsgWEFVVEhPUklUWTogdGhpcy5wYXJlbnQueGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogdGhpcy5wYXJlbnQueGluZm8uZGlzcGxheSB9IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5jaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX3JlcygnRElTTUlTU0VEJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbCA9IGZpbmRQYXRoKCdrZGlhbG9nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsKSAKCQkJICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIEtESUFMT0cKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZGcgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZmluZEVudihyZXRWYWwuY29uc29sZVVpZCwgJ1hER19SVU5USU1FX0RJUicpOyBpZiAoeGRnID09IG51bGwpIHsgeGRnID0gJyc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0VmFsLnhpbmZvIHx8ICFyZXRWYWwueGluZm8uZGlzcGxheSB8fCAhcmV0VmFsLnhpbmZvLnhhdXRob3JpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9yZWooJ0ludGVybmFsIEVycm9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9ub3RpZnkgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodXRpbCwgWydrZGlhbG9nJywgJy0tdGl0bGUnLCByZXRWYWwudGl0bGUsICctLXBhc3NpdmVwb3B1cCcsIHJldFZhbC5jYXB0aW9uLCAnNSddLCB7IHVpZDogcmV0VmFsLmNvbnNvbGVVaWQsIGVudjogeyBESVNQTEFZOiByZXRWYWwueGluZm8uZGlzcGxheSwgWEFVVEhPUklUWTogcmV0VmFsLnhpbmZvLnhhdXRob3JpdHksIFhER19SVU5USU1FX0RJUjogeGRnIH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5wYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fcmVqKCdaZW5pdHkvS0RpYWxvZyBub3QgZm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgcmV0VmFsLl90b2FzdCA9IHJlcXVpcmUoJ21lc3NhZ2UtYm94Jykubm90aWZ5KHRpdGxlLCBjYXB0aW9uKTsKICAgICAgICAgICAgICAgIHJldFZhbC5fdG9hc3QucGFyZW50ID0gcmV0VmFsOwogICAgICAgICAgICAgICAgcmV0VmFsLl90b2FzdC50aGVuKGZ1bmN0aW9uICh2KSB7IHRoaXMucGFyZW50Ll9yZXModik7IH0sIGZ1bmN0aW9uIChlKSB7IHRoaXMucGFyZW50Ll9yZWooZSk7IH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IG5ldyBUb2FzdGVyKCk7Cv==', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('toaster', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCg0KaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nIHx8IHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQ0Kew0KICAgIGZ1bmN0aW9uIGZpbmRQYXRoKGFwcCkNCiAgICB7DQogICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnIHx8IHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQ0KICAgICAgICB7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyAiICsgYXBwICsgIiB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyAiICsgYXBwICsgIlxuZXhpdFxuIik7DQogICAgICAgIH0NCiAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcgJiYgY2hpbGQuc3Rkb3V0LnN0ciA9PSAnJyAmJiByZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvYmluLycgKyBhcHApKSB7IHJldHVybiAoJy91c3IvbG9jYWwvYmluLycgKyBhcHApOyB9DQogICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ciA9PSAnJyA/IG51bGwgOiBjaGlsZC5zdGRvdXQuc3RyKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIFRvYXN0ZXIoKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gJ3RvYXN0ZXInOw0KICAgIHRoaXMuVG9hc3QgPSBmdW5jdGlvbiBUb2FzdCh0aXRsZSwgY2FwdGlvbikNCiAgICB7DQogICAgICAgIHZhciByZXRWYWwgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICByZXRWYWwudGl0bGUgPSB0aXRsZTsNCiAgICAgICAgcmV0VmFsLmNhcHRpb24gPSBjYXB0aW9uOw0KDQogICAgICAgIHN3aXRjaCAocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnd2luMzInOg0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQogICAgICAgICAgICAgICAgICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsNCiAgICAgICAgICAgICAgICAgICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdQcm9jZXNzSWRUb1Nlc3Npb25JZCcpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcHNpZCA9IEdNLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY29uc29sZVVpZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlVWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9yZWooJ0Nhbm5vdCBkaXNwbGF5IHVzZXIgbm90aWZpY2F0aW9uIHdoZW4gYSB1c2VyIGlzIG5vdCBsb2dnZWQgaW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoa2VybmVsMzIuUHJvY2Vzc0lkVG9TZXNzaW9uSWQocHJvY2Vzcy5waWQsIHBzaWQpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3JlaignaW50ZXJuYWwgZXJyb3InKTsgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGVVaWQgPT0gcHNpZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcnVubmluZyBvbiB0aGUgcGh5c2ljYWwgY29uc29sZQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZCA9IHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLkNyZWF0ZSh7IHByb2Nlc3NJc29sYXRpb246IHRydWUgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHNvIHNwYXduIHRoZSBTY3JpcHRDb250YWluZXIgaW50byB0aGUgY29ycmVjdCBzZXNzaW9uDQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKHsgcHJvY2Vzc0lzb2xhdGlvbjogdHJ1ZSwgc2Vzc2lvbklkOiBjb25zb2xlVWlkIH0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQucGFyZW50ID0gcmV0VmFsOw0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgdGhpcy5wYXJlbnQuX3JlcygnRElTTUlTU0VEJyk7IH0pOw0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLmFkZE1vZHVsZSgnd2luLWNvbnNvbGUnLCBnZXRKU01vZHVsZSgnd2luLWNvbnNvbGUnKSk7DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuYWRkTW9kdWxlKCd3aW4tbWVzc2FnZS1wdW1wJywgZ2V0SlNNb2R1bGUoJ3dpbi1tZXNzYWdlLXB1bXAnKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICJcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9hc3QgPSByZXF1aXJlKCd3aW4tY29uc29sZScpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFsbG9vbiA9IHRvYXN0LlNldFRyYXlJY29uKHsgc3pJbmZvOiAnIiArIGNhcHRpb24gKyAiJywgc3pJbmZvVGl0bGU6ICciICsgdGl0bGUgKyAiJywgYmFsbG9vbk9ubHk6IHRydWUgfSk7XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGxvb24ub24oJ1RvYXN0RGlzbWlzc2VkJywgZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChlKVwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5zZW5kKGUpO1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5zZW5kKCdkb25lJyk7XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuRXhlY3V0ZVN0cmluZyhzdHIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KCSAgICAgICAgY2FzZSAnZnJlZWJzZCc6DQogICAgICAgICAgICBjYXNlICdsaW51eCc6DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNvbnNvbGVVaWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnhpbmZvID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0WEluZm8ocmV0VmFsLmNvbnNvbGVVaWQpOw0KCQkJICAgICAgICAgICAgcmV0VmFsLnVzZXJuYW1lID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHJldFZhbC5jb25zb2xlVWlkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoeHhlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3Jlaih4eGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5KQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkudmVyc2lvblswXSA8IDMgfHwgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnZlcnNpb25bMF0gPT0gMyAmJiByZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS52ZXJzaW9uWzFdIDwgMTApKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpFTklUWSBOb3RpZmljYXRpb24gaXMgYnJva2VuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94Jykubm90aWZ5c2VuZCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIG5vdGlmeS1zZW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5zdGRpbi53cml0ZSgnc3UgLSAnICsgcmV0VmFsLnVzZXJuYW1lICsgJyAtYyAiRElTUExBWT1cJycgKyByZXRWYWwueGluZm8uZGlzcGxheSArICdcJyBub3RpZnktc2VuZCBcJycgKyByZXRWYWwudGl0bGUgKyAnXCcgXCcnICsgcmV0VmFsLmNhcHRpb24gKyAnXCciXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFraW5nIG5vdGlmaWNhdGlvbiB3aXRoIFpFTklUWSAtLWluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnRpbWVvdXQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgU3VwcG9ydGVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1pbmZvJywgJy0tdGl0bGU9JyArIHJldFZhbC50aXRsZSwgJy0tdGV4dD0nICsgcmV0VmFsLmNhcHRpb24sICctLXRpbWVvdXQ9NSddLCB7IHVpZDogcmV0VmFsLmNvbnNvbGVVaWQsIGVudjogeyBYQVVUSE9SSVRZOiByZXRWYWwueGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogcmV0VmFsLnhpbmZvLmRpc3BsYXkgfSB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIFRpbWVvdXQgU3VwcG9ydCwgc28gd2UgbXVzdCBmYWtlIGl0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1pbmZvJywgJy0tdGl0bGU9JyArIHJldFZhbC50aXRsZSwgJy0tdGV4dD0nICsgcmV0VmFsLmNhcHRpb25dLCB7IHVpZDogcmV0VmFsLmNvbnNvbGVVaWQsIGVudjogeyBYQVVUSE9SSVRZOiByZXRWYWwueGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogcmV0VmFsLnhpbmZvLmRpc3BsYXkgfSB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoYykgeyBjLnRpbWVvdXQgPSBudWxsOyBjLmtpbGwoKTsgfSwgNTAwMCwgcmV0VmFsLmNoaWxkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgWkVOSVRZIE5vdGlmaWNhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS5wYXRoLCBbJ3plbml0eScsICctLW5vdGlmaWNhdGlvbicsICctLXRpdGxlPScgKyB0aXRsZSwgJy0tdGV4dD0nICsgY2FwdGlvbiwgJy0tdGltZW91dD01J10sIHsgdWlkOiByZXRWYWwuY29uc29sZVVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHJldFZhbC54aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiByZXRWYWwueGluZm8uZGlzcGxheSB9IH0pOyAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5wYXJlbnQgPSByZXRWYWw7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZW91dCkgeyBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB1dGlsID0gZmluZFBhdGgoJ2tkaWFsb2cnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsKSANCgkJCSAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgS0RJQUxPRw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZGcgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZmluZEVudihyZXRWYWwuY29uc29sZVVpZCwgJ1hER19SVU5USU1FX0RJUicpOyBpZiAoeGRnID09IG51bGwpIHsgeGRnID0gJyc7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldFZhbC54aW5mbyB8fCAhcmV0VmFsLnhpbmZvLmRpc3BsYXkgfHwgIXJldFZhbC54aW5mby54YXV0aG9yaXR5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9yZWooJ0ludGVybmFsIEVycm9yJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoJCQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fbm90aWZ5ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHV0aWwsIFsna2RpYWxvZycsICctLXRpdGxlJywgcmV0VmFsLnRpdGxlLCAnLS1wYXNzaXZlcG9wdXAnLCByZXRWYWwuY2FwdGlvbiwgJzUnXSwgeyB1aWQ6IHJldFZhbC5jb25zb2xlVWlkLCBlbnY6IHsgRElTUExBWTogcmV0VmFsLnhpbmZvLmRpc3BsYXksIFhBVVRIT1JJVFk6IHJldFZhbC54aW5mby54YXV0aG9yaXR5LCBYREdfUlVOVElNRV9ESVI6IHhkZyB9IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fbm90aWZ5LnBhcmVudCA9IHJldFZhbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9ub3RpZnkuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fbm90aWZ5Lm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgdGhpcy5wYXJlbnQuX3JlcygnRElTTUlTU0VEJyk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fcmVqKCdaZW5pdHkvS0RpYWxvZyBub3QgZm91bmQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6DQogICAgICAgICAgICAgICAgcmV0VmFsLl90b2FzdCA9IHJlcXVpcmUoJ21lc3NhZ2UtYm94Jykubm90aWZ5KHRpdGxlLCBjYXB0aW9uKTsNCiAgICAgICAgICAgICAgICByZXRWYWwuX3RvYXN0LnBhcmVudCA9IHJldFZhbDsNCiAgICAgICAgICAgICAgICByZXRWYWwuX3RvYXN0LnRoZW4oZnVuY3Rpb24gKHYpIHsgdGhpcy5wYXJlbnQuX3Jlcyh2KTsgfSwgZnVuY3Rpb24gKGUpIHsgdGhpcy5wYXJlbnQuX3JlaihlKTsgfSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gKHJldFZhbCk7DQogICAgfTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSBuZXcgVG9hc3RlcigpOw0K', 'base64').toString());"); // wget: Refer to modules/wget.js for a human readable version. duk_peval_string_noresult(ctx, "addModule('wget', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KdmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7DQp2YXIgd3JpdGFibGUgPSByZXF1aXJlKCdzdHJlYW0nKS5Xcml0YWJsZTsNCg0KDQpmdW5jdGlvbiB3Z2V0KHJlbW90ZVVyaSwgbG9jYWxGaWxlUGF0aCwgd2dldG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgdmFyIGFnZW50Q29ubmVjdGVkID0gZmFsc2U7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2J5dGVzJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdhYm9ydCcpDQogICAgICAgIC5hZGRNZXRob2QoJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLl9yZXF1ZXN0LmFib3J0KCk7IH0pOw0KDQogICAgdHJ5DQogICAgew0KICAgICAgICBhZ2VudENvbm5lY3RlZCA9IHJlcXVpcmUoJ01lc2hBZ2VudCcpLmlzQ29udHJvbENoYW5uZWxDb25uZWN0ZWQ7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICB9DQoNCiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgcHJveHkgc2V0dGluZ3MgaWYgdGhlIGFnZW50IGlzIG5vdCBjb25uZWN0ZWQsIGJlY2F1c2Ugd2hlbiB0aGUgYWdlbnQNCiAgICAvLyBjb25uZWN0cywgaXQgYXV0b21hdGljYWxseSBjb25maWd1cmVzIHRoZSBwcm94eSBmb3IgSmF2YVNjcmlwdC4NCiAgICBpZiAoIWFnZW50Q29ubmVjdGVkKQ0KICAgIHsNCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOw0KICAgICAgICAgICAgaWYgKHJlZy5RdWVyeUtleShyZWcuSEtFWS5DdXJyZW50VXNlciwgJ1NvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxJbnRlcm5ldCBTZXR0aW5ncycsICdQcm94eUVuYWJsZScpID09IDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHByb3h5VXJpID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkN1cnJlbnRVc2VyLCAnU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEludGVybmV0IFNldHRpbmdzJywgJ1Byb3h5U2VydmVyJyk7DQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSByZXF1aXJlKCdodHRwJykucGFyc2VVcmkoJ2h0dHA6Ly8nICsgcHJveHlVcmkpOw0KDQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Byb3h5ID0+ICcgKyBwcm94eVVyaSk7DQogICAgICAgICAgICAgICAgcmVxdWlyZSgnZ2xvYmFsLXR1bm5lbCcpLmluaXRpYWxpemUob3B0aW9ucyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB2YXIgcmVxT3B0aW9ucyA9IHJlcXVpcmUoJ2h0dHAnKS5wYXJzZVVyaShyZW1vdGVVcmkpOw0KICAgIGlmICh3Z2V0b3B0aW9ucykNCiAgICB7DQogICAgICAgIGZvciAodmFyIGlucHV0T3B0aW9uIGluIHdnZXRvcHRpb25zKSB7DQogICAgICAgICAgICByZXFPcHRpb25zW2lucHV0T3B0aW9uXSA9IHdnZXRvcHRpb25zW2lucHV0T3B0aW9uXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXQuX3RvdGFsQnl0ZXMgPSAwOw0KICAgIHJldC5fcmVxdWVzdCA9IGh0dHAuZ2V0KHJlcU9wdGlvbnMpOw0KICAgIHJldC5fbG9jYWxGaWxlUGF0aCA9IGxvY2FsRmlsZVBhdGg7DQogICAgcmV0Ll9yZXF1ZXN0LnByb21pc2UgPSByZXQ7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7IHRoaXMucHJvbWlzZS5fcmVqKGUpOyB9KTsNCiAgICByZXQuX3JlcXVlc3Qub24oJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLnByb21pc2UuZW1pdCgnYWJvcnQnKTsgfSk7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uIChpbXNnKQ0KICAgIHsNCiAgICAgICAgaWYoaW1zZy5zdGF0dXNDb2RlICE9IDIwMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ1NlcnZlciByZXNwb25zZWQgd2l0aCBTdGF0dXMgQ29kZTogJyArIGltc2cuc3RhdHVzQ29kZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9maWxlID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSh0aGlzLnByb21pc2UuX2xvY2FsRmlsZVBhdGgsIHsgZmxhZ3M6ICd3YicgfSk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhID0gcmVxdWlyZSgnU0hBMzg0U3RyZWFtJykuY3JlYXRlKCk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhLnByb21pc2UgPSB0aGlzLnByb21pc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKGUpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuX3NoYS5vbignaGFzaCcsIGZ1bmN0aW9uIChoKSB7IHRoaXMucHJvbWlzZS5fcmVzKGgudG9TdHJpbmcoJ2hleCcpKTsgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciA9IG5ldyB3cml0YWJsZSgNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjaHVuaywgY2FsbGJhY2spDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fdG90YWxCeXRlcyArPSBjaHVuay5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuZW1pdCgnYnl0ZXMnLCB0aGlzLnByb21pc2UuX3RvdGFsQnl0ZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgZmluYWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvci5wcm9taXNlID0gdGhpcy5wcm9taXNlOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2ZpbGUpOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2FjY3VtdWxhdG9yKTsNCiAgICAgICAgICAgIGltc2cucGlwZSh0aGlzLl9zaGEpOw0KICAgICAgICB9DQogICAgfSk7DQogICAgcmV0LnByb2dyZXNzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX3RvdGFsQnl0ZXMpOyB9Ow0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSB3Z2V0Ow0KDQoNCv==', 'base64').toString());"); diff --git a/modules/message-box.js b/modules/message-box.js index d0eed4a..84a0507 100644 --- a/modules/message-box.js +++ b/modules/message-box.js @@ -171,6 +171,20 @@ function linux_messageBox() })() }); } + else + { + Object.defineProperty(this, 'notifysend', + { + value: (function () + { + var child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stdin.write("whereis notify-send | awk '{ print $2 }'\nexit\n"); + child.waitExit(); + return (child.stdout.str.trim() == '' ? null : { path: child.stdout.str.trim() }); + })() + }); + } this.create = function create(title, caption, timeout) { diff --git a/modules/toaster.js b/modules/toaster.js index 5ab4fc8..ac72706 100644 --- a/modules/toaster.js +++ b/modules/toaster.js @@ -101,7 +101,7 @@ function Toaster() return (retVal); } break; - case 'freebsd': + case 'freebsd': case 'linux': { try @@ -115,64 +115,47 @@ function Toaster() retVal._rej(xxe); return (retVal); } - var util = findPath('zenity'); - if (util) - { - // Use ZENITY - retVal.child = require('child_process').execFile(util, ['zenity', '--notification', '--title=' + title, '--text=' + caption, '--timeout=5'], { uid: retVal.consoleUid, env: { XAUTHORITY: retVal.xinfo.xauthority, DISPLAY: retVal.xinfo.display } }); - retVal.child.parent = retVal; - retVal.child.stderr.str = ''; - retVal.child.stderr.on('data', function (chunk) { this.str += chunk.toString(); this.parent.kill(); }); - retVal.child.stdout.on('data', function (chunk) { }); - retVal.child.on('exit', function (code) - { - if (this.stderr.str.trim() != '') - { - if ((util = findPath('notify-send')) && this.stderr.str.split('GLib-CRITICAL').length > 1) - { - // This is a bug in zenity, so we should try notify-send - if (process.env['DISPLAY']) - { - // DISPLAY is set, so we good to go - this.parent.child = require('child_process').execFile(util, ['notify-send', this.parent.title, this.parent.caption]); - this.parent.child.parent = this.parent; - } - else - { - // We need to find the DISPLAY to use - var username = require('user-sessions').getUsername(consoleUid); - this.parent.child = require('child_process').execFile('/bin/sh', ['sh']); - this.parent.child.parent = this.parent; - this.parent.child.stdin.write('su - ' + username + ' -c "DISPLAY=' + display + ' notify-send \'' + this.parent.title + '\' \'' + this.parent.caption + '\'"\n'); - this.parent.child.stdin.write('exit\n'); - } - this.parent.child.stdout.on('data', function (chunk) { }); - this.parent.child.waitExit(); - // NOTIFY-SEND has a bug where timeouts don't work, so the default is 5 seconds - this.parent._timeout = setTimeout(function onFakeDismissed(obj) - { - obj._res('DISMISSED'); - }, 10000, this.parent); - } - else -{ - // Fake a toast using zenity --info - util = findPath('zenity'); - this.parent.child = require('child_process').execFile(util, ['zenity', '--info', '--title=' + this.parent.title, '--text=' + this.parent.caption, '--timeout=5'], { uid: this.parent.consoleUid, env: { XAUTHORITY: this.parent.xinfo.xauthority, DISPLAY: this.parent.xinfo.display } }); - this.parent.child.parent = this.parent; - this.parent.child.stderr.on('data', function (chunk) { }); - this.parent.child.stdout.on('data', function (chunk) { }); - this.parent.child.on('exit', function (code) - { - this.parent._res('DISMISSED'); - }); - } + if (require('message-box').zenity) + { + if (require('message-box').zenity.version[0] < 3 || (require('message-box').zenity.version[0] == 3 && require('message-box').zenity.version[1] < 10)) + { + // ZENITY Notification is broken + if (require('message-box').notifysend) + { + // Using notify-send + retVal.child = require('child_process').execFile('/bin/sh', ['sh']); + retVal.child.stdin.write('su - ' + retVal.username + ' -c "DISPLAY=\'' + retVal.xinfo.display + '\' notify-send \'' + retVal.title + '\' \'' + retVal.caption + '\'"\nexit\n'); } else { - this.parent._res('DISMISSED'); + // Faking notification with ZENITY --info + if (require('message-box').zenity.timeout) + { + // Timeout Supported + retVal.child = require('child_process').execFile(require('message-box').zenity.path, ['zenity', '--info', '--title=' + retVal.title, '--text=' + retVal.caption, '--timeout=5'], { uid: retVal.consoleUid, env: { XAUTHORITY: retVal.xinfo.xauthority, DISPLAY: retVal.xinfo.display } }); + } + else + { + // No Timeout Support, so we must fake it + retVal.child = require('child_process').execFile(require('message-box').zenity.path, ['zenity', '--info', '--title=' + retVal.title, '--text=' + retVal.caption], { uid: retVal.consoleUid, env: { XAUTHORITY: retVal.xinfo.xauthority, DISPLAY: retVal.xinfo.display } }); + retVal.child.timeout = setTimeout(function (c) { c.timeout = null; c.kill(); }, 5000, retVal.child); + } } + } + else + { + // Use ZENITY Notification + retVal.child = require('child_process').execFile(require('message-box').zenity.path, ['zenity', '--notification', '--title=' + title, '--text=' + caption, '--timeout=5'], { uid: retVal.consoleUid, env: { XAUTHORITY: retVal.xinfo.xauthority, DISPLAY: retVal.xinfo.display } }); + } + retVal.child.parent = retVal; + retVal.child.stderr.str = ''; + retVal.child.stderr.on('data', function (chunk) { this.str += chunk.toString(); }); + retVal.child.stdout.on('data', function (chunk) { }); + retVal.child.on('exit', function (code) + { + if (this.timeout) { clearTimeout(this.timeout); } + this.parent._res('DISMISSED'); }); } else