diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index c39560b..37c4576 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2084,12 +2084,12 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgpmdW5jdGlvbiBkaXNwYXRjaChvcHRpb25zKQp7CiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubW9kdWxlcyB8fCAhb3B0aW9ucy5sYXVuY2ggfHwgIW9wdGlvbnMubGF1bmNoLm1vZHVsZSB8fCAhb3B0aW9ucy5sYXVuY2gubWV0aG9kIHx8ICFvcHRpb25zLmxhdW5jaC5hcmdzKSB7IHRocm93ICgnSW52YWxpZCBQYXJhbWV0ZXJzJyk7IH0KCiAgICB2YXIgaXBjSW50ZWdlcgogICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKS5jcmVhdGVFdmVudCgnY29ubmVjdGlvbicpOwoKICAgIHJldC5faXBjID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjLnBhcmVudCA9IHJldDsKICAgIHJldC5faXBjMiA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYzIucGFyZW50ID0gcmV0OwogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsKICAgIHJldC5faXBjMi5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IH0pOwoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAgIGlwY0ludGVnZXIgPSByZXF1aXJlKCd0bHMnKS5nZW5lcmF0ZVJhbmRvbUludGVnZXIoJzEwMDAnLCAnOTk5OScpOwogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOwogICAgICAgIAogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsKICAgICAgICAgICAgcmV0Ll9pcGMyLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCArICdDJywgd3JpdGFibGVBbGw6IHRydWUgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoeCkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgIHJldC5faXBjMi5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpCiAgICB7DQogICAgICAgIHRoaXMucGFyZW50Ll9jb250cm9sID0gczsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHRoaXMucGFyZW50Lmludm9rZSA9IGZ1bmN0aW9uIChtZXRob2QsIGFyZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOwogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnaW52b2tlJywgdmFsdWU6IHsgbWV0aG9kOiBtZXRob2QsIGFyZ3M6IGFyZ3MgfSB9KSk7CiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGgpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGQpOw0KICAgICAgICB9Ow0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgIH0pOwogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQogICAgewogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOwogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7CiAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7CgogICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQogICAgICAgIHsKICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsKICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7CiAgICAgICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgICAgIHMud3JpdGUoZCk7CiAgICAgICAgfQoKICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnbGF1bmNoJywgdmFsdWU6IHsgbW9kdWxlOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tb2R1bGUsIG1ldGhvZDogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubWV0aG9kLCBhcmdzOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5hcmdzIH0gfSkpOwogICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgcy53cml0ZShkKTsKICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOwogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsKICAgIH0pOwoKICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOwogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7CiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKCiAgICBpZiAob3B0aW9ucy51c2VyKQogICAgewogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSAnICsgb3B0aW9ucy51c2VyICsgJyAvVFIgIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJyAtYjY0ZXhlYyAnICsgc3RyICsgJyJcclxuJyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkID09IDApCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSBTWVNURU0gL1RSICInICsgcHJvY2Vzcy5leGVjUGF0aCArICcgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYXMgbG9nZ2VkIGluIHVzZXINCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9UUiAiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnIC1iNjRleGVjICcgKyBzdHIgKyAnIlxyXG4nKTsNCiAgICAgICAgfQogICAgfQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9SVU4gL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvREVMRVRFIC9GIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxyXG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAKCiAgICByZXR1cm4gKHJldCk7Cn0KCmZ1bmN0aW9uIGNvbm5lY3QoaXBjKQp7CiAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGM7CiAgICBnbG9iYWwuaXBjMkNsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoICsgJ0MnIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7CiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOwogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsKICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdpbnZva2UnOgogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7CiAgICBnbG9iYWwuaXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkKICAgIHsKICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY0xlbiA9IGMucmVhZFVJbnQzMkxFKDApOwogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnVuc2hpZnQoYyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2FkZE1vZHVsZSc6CiAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKGNtZC52YWx1ZS5uYW1lLCBjbWQudmFsdWUuanMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGF1bmNoJzoKICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gcmVxdWlyZShjbWQudmFsdWUubW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ucGlwZSh0aGlzLCB7IGVuZDogZmFsc2UgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlKGdsb2JhbC5fcHJveHlTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTsKCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7IGRpc3BhdGNoOiBkaXNwYXRjaCwgY29ubmVjdDogY29ubmVjdCB9OwoK', 'base64').toString());"); // win-firewall is a helper to Modify Windows Firewall Filters. Refer to modules/win-firewall.js - char *_winfirewall = ILibMemory_Allocate(59472, 0, NULL, NULL); - memcpy_s(_winfirewall + 0, 33984, "LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgd2lucmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7CgovL2F0dGFjaERlYnVnZ2VyKHsgd2VicG9ydDogOTk5NSwgd2FpdDogdHJ1ZSB9KS50aGVuKGNvbnNvbGUubG9nLCBjb25zb2xlLmxvZyk7CgpmdW5jdGlvbiBuZXRzZWN1cml0eUV4aXN0cygpDQp7DQogICAgdmFyIGNoaWxkOw0KICAgIHZhciBjb21tYW5kID0gJ0dldC1Nb2R1bGUgLUxpc3RBdmFpbGFibGUgLU5hbWUgbmV0c2VjdXJpdHknOwogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIgIT0gJycpOw0KfQoKZnVuY3Rpb24gc3RyaXBVbnJlY29nbml6ZWRLZXlzKG9iaiwgYWxsb3dlZEtleXMpCnsNCiAgICBmb3IodmFyIGtleSBpbiBvYmopDQogICAgew0KICAgICAgICBpZighYWxsb3dlZEtleXMuaW5jbHVkZXMoa2V5KSkNCiAgICAgICAgew0KICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOw0KICAgICAgICB9DQogICAgfQ0KfQoKZnVuY3Rpb24gcGFyc2VDbWRsZXRPdXRwdXQoZGF0YSkKewogICAgdmFyIHRvdWNoZWQ7CiAgICB2YXIgcmV0ID0gW107CiAgICB2YXIgY2h1bmtzID0gZGF0YS50cmltKCkuc3BsaXQoJ1xyXG5cclxuJyk7CiAgICB2YXIgbGluZXMsIHgsIG9iajsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIG9iaiA9IHt9OyB0b3VjaGVkID0gZmFsc2U7CiAgICAgICAgbGluZXMgPSBjaHVua3NbaV0uc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGluZXMubGVuZ3RoOyArK3gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZCA9IGxpbmVzW3hdLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgdmFyIGtleSA9IGxpbmVzW3hdLnN1YnN0cmluZygwLCBkKS50cmltKCk7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxpbmVzW3hdLnN1YnN0cmluZyhkICsgMSkudHJpbSgpOwogICAgICAgICAgICBpZiAoa2V5ICE9ICIiKSB7IG9ialtrZXldID0gdmFsdWU7IHRvdWNoZWQgPSB0cnVlOyB9CiAgICAgICAgfQogICAgICAgIGlmICh0b3VjaGVkKSB7IHJldC5wdXNoKG9iaik7IH0KICAgIH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBmZXRjaFBvcnRGaWx0ZXJzKHJ1bGVzKQp7CiAgICB2YXIgaTsKICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpCiAgICB7CiAgICAgICAgcnVsZXMgPSBbcnVsZXNdOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgZmlsdGVyID0gd2lucmVnLlF1ZXJ5S2V5KHdpbnJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxTaGFyZWRBY2Nlc3NcXFBhcmFtZXRlcnNcXEZpcmV3YWxsUG9saWN5XFxGaXJld2FsbFJ1bGVzJywgcnVsZXNbaV0uTmFtZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGZlKQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9CiAgICAgICAgdG9rZW5zID0gZmlsdGVyLnNwbGl0KCd8Jyk7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRva2Vucy5sZW5ndGg7ICsraykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgodG9rZW5YID0gdG9rZW5zW2tdLmluZGV4T2YoJz0nKSkgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2Vuc1trXS5zdWJzdHJpbmcoMCwgdG9rZW5YKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdQcm90b2NvbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlByb3RvY29sID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTFBvcnQnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Mb2NhbFBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdSUG9ydCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlJlbW90ZVBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdBcHAnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Qcm9ncmFtID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGdldEZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHAsIHRydWUpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdmaXJld2FsbFJ1bGUnKTsKCiAgICB2YXIgcmV0VmFsID0gW10sIGZpbHRlciA9IFtdOwogICAgdmFyIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkgeyBjb21tYW5kID0gJ0dldC1OZXRGaXJld2FsbEFwcGxpY2F0aW9uRmlsdGVyIC1Qcm9ncmFtIFxcIicgKyBvcHRpb25zLlByb2dyYW0gKyAnXFwiIHwgJyArIGNvbW1hbmQ7IH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgcC5vcHRpb25zID0gb3B0aW9uczsKICAgIHAuY2hpbGQucGFyZW50ID0gcDsKICAgIHAuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKQogICAgewogICAgICAgIHZhciBjb21tYW5kOwogICAgICAgIHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsKICAgICAgICBpZih0aGlzLnBhcmVudC5wYXJlbnQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJyk+MCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBpZigoaT10aGlzLnN0ci5pbmRleE9mKCdcclxuXHJcbicpKT49MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpbHRlciwgaywgdG9rZW5zLCB0b2tlblg7CiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMuc3RyLnN1YnN0cmluZygwLCBpKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGkgKyA0KTsKCiAgICAgICAgICAgICAgICBqID0gcGFyc2VDbWRsZXRPdXRwdXQoaik7CiAgICAgICAgICAgICAgICBmZXRjaFBvcnRGaWx0ZXJzKGopOwoKICAgICAgICAgICAgICAgIGZvcihpPTA7aTxqLmxlbmd0aDsrK2kpCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5wYXJlbnQuZW1pdCgnZmlyZXdhbGxSdWxlJywgaltpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIHAuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBwLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CgogICAgcC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgICAgdmFyIGNvbW1hbmQsIGksIGosIGNoaWxkLCBmaWx0ZXI7CiAgICAgICAgaWYgKHRoaXMuc3RkZXJyLnN0ci50cmltKCkgIT0gIiIpIHsgdGhpcy5wYXJlbnQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsgcmV0dXJuOyB9CgogICAgICAgIGlmICh0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudC5fcmVzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBvYmpBcnIgPSBwYXJzZUNtZGxldE91dHB1dCh0aGlzLnN0ZG91dC5zdHIpOwogICAgICAgIGZldGNoUG9ydEZpbHRlcnMob2JqQXJyKTsKICAgICAgICB0aGlzLnBhcmVudC5fcmVzKG9iakFycik7CiAgICB9KTsKCiAgICByZXR1cm4gKHApOwp9CgoKZnVuY3Rpb24gZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgdmFyIGNvbW1hbmQgPSAnRGlzYWJsZS1OZXRGaXJld2FsbFJ1bGUnOwogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0KCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyICE9ICcnKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVqKHRoaXMuc3RkZXJyLnN0ci50cmltKCkpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgcmV0dXJuIChyZXQpOwp9CgpmdW5jdGlvbiBlbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpCnsKICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9CgogICAgdmFyIGNvbW1hbmQgPSAnRW5hYmxlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIHZlcmlmeVZhbHVlcyhvcHRpb25zSW5wdXQsIGtleU5hbWUsIGtleVZhbHVlcywgZGVmYXVsdFZhbHVlKQp7CiAgICB2YXIgaSwgaiwgdG1wLCBvazsKICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zSW5wdXQpCiAgICB7CiAgICAgICAgaWYoa2V5TmFtZS50b0xvd2VyQ2FzZSgpID09IGtleS50b0xvd2VyQ2FzZSgpKQogICAgICAgIHsKICAgICAgICAgICAgdG1wID0gb3B0aW9uc0lucHV0W2tleV07CiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zSW5wdXRba2V5XTsKCiAgICAgICAgICAgIGlmIChrZXlWYWx1ZXMgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gdG1wOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRtcCE9bnVsbCkgeyB0bXAgPSB0bXAudG9TdHJpbmcoKS5zcGxpdCgnLCcpOyB9CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG1wLmxlbmd0aDsgKytqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxrZXlWYWx1ZXMubGVuZ3RoOysraSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRtcFtqXS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zSW5wdXRba2V5TmFtZV0gPSAob3B0aW9uc0lucHV0W2tleU5hbWVdID09IG51bGwgPyBrZXlWYWx1ZXNbaV0gOiAob3B0aW9uc0lucHV0W2tleU5hbWVdICsgJywgJyArIGtleVZhbHVlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB2YWx1ZSBmb3IgWycgKyBrZXlOYW1lICsgJ106ICcgKyB0bXBbal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zSW5wdXRba2V5TmFtZV0gIT0gbnVsbCkgeyByZXR1cm47IH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuLi4gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcHV0IGluIGEgZGVmYXVsdCB2YWx1ZQogICAgaWYoZGVmYXVsdFZhbHVlICE9IG51bGwpCiAgICB7CiAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gZGVmYXVsdFZhbHVlOwogICAgfQp9CgpmdW5jdGlvbiByZW1hcFZhbHVlcyhvYmosIG9sZG5hbWUsIG5ld25hbWUsIHRhYmxlKQp7DQogICAgaWYob2JqW29sZG5hbWVdICE9IG51bGwpDQogICAgew0KICAgICAgICB2YXIgdmFsdWUgPSBvYmpbb2xkbmFtZV07DQogICAgICAgIGRlbGV0ZSBvYmpbb2xkbmFtZV0NCg0KICAgICAgICBpZighdGFibGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHZhbHVlOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJywnKSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdmFsdWVdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB2YWx1ZS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8dG9rZW5zLmxlbmd0aDsrK2kpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZihvYmpbbmV3bmFtZV0gPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdG9rZW5zW2ldLnRyaW0oKV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBvYmpbbmV3bmFtZV0gPSAob2JqW25ld25hbWVdICsgJywnICsgdGFibGVbdG9rZW5zW2ldLnRyaW0oKV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQoKZnVuY3Rpb24gY29udmVydE5ldHNoVmFsdWVzKG9iaikKew0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1J1bGUgTmFtZScsICdOYW1lJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRW5hYmxlZCcsICdFbmFibGVkJywgeyBObzogJ0ZhbHNlJywgWWVzOiAnVHJ1ZScgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnUHJvZmlsZXMnLCAnUHJvZmlsZScsIHsgQW55OiAnQW55JywgRG9tYWluOiAnRG9tYWluJywgUHVibGljOiAnUHVibGljJywgUHJpdmF0ZTogJ1ByaXZhdGUnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0VkZ2UgdHJhdmVyc2FsJywgJ0VkZ2VUcmF2ZXJzYWxQb2xpY3knLCB7IE5vOiAnQmxvY2snLCBZZXM6ICdBbGxvdycgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRGlyZWN0aW9uJywgJ0RpcmVjdGlvbicsIHsgSW46ICdJbmJvdW5kJywgT3V0OiAnT3V0Ym91bmQnIH0pOw0KfQpmdW5jdGlvbiBjb252ZXJ0TmV0U2VjdXJpdHlWYWx1ZXMob2JqKQp7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnQWN0aW9uJywgJ2FjdGlvbicsIHsgQWxsb3c6ICdhbGxvdycsIEJsb2NrOiAnYmxvY2snIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rlc2NyaXB0aW9uJywgJ2Rlc2NyaXB0aW9uJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRGlyZWN0aW9uJywgJ2RpcicsIHsgSW5ib3VuZDogJ2luJywg", 16000); - memcpy_s(_winfirewall + 16000, 17984, "T3V0Ym91bmQ6ICdvdXQnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rpc3BsYXlOYW1lJywgJ2Rpc3BsYXluYW1lJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRW5hYmxlZCcsICdlbmFibGVkJywgeyBGYWxzZTogJ25vJywgVHJ1ZTogJ3llcycgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm9ncmFtJywgJ3Byb2dyYW0nKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm90b2NvbCcsICdwcm90b2NvbCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGUnLCAncHJvZmlsZScsIHsgQW55OiAnYW55JywgRG9tYWluOiAnZG9tYWluJywgUHJpdmF0ZTogJ3ByaXZhdGUnLCBQdWJsaWM6ICdwdWJsaWMnLCBOb3RBcHBsaWNhYmxlOiAnYW55JyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdJbnRlcmZhY2VUeXBlJywgJ2ludGVyZmFjZXR5cGUnLCB7IEFueTogJ2FueScsIFdpcmVkOiAnbGFuJywgV2lyZWxlc3M6ICd3aXJlbGVzcycsIFJlbW90ZUFjY2VzczogJ3JhcycgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRWRnZVRyYXZlcnNhbFBvbGljeScsICdlZGdlJywgeyBBbGxvdzogJ3llcycsIEJsb2NrOiAnbm8nLCBEZWZlclRvVXNlcjogJ2RlZmVydXNlcicsIERlZmVyVG9BcHA6ICdkZWZlcmFwcCcgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdMb2NhbEFkZHJlc3MnLCAnbG9jYWxpcCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0xvY2FsUG9ydCcsICdsb2NhbHBvcnQnKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSZW1vdGVBZGRyZXNzJywgJ3JlbW90ZWlwJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnUmVtb3RlUG9ydCcsICdyZW1vdGVwb3J0Jyk7DQp9CgpmdW5jdGlvbiBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKQp7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0FjdGlvbicsIFsnTm90Q29uZmlndXJlZCcsICdBbGxvdycsICdCbG9jayddLCAnQWxsb3cnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnQXV0aGVudGljYXRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ05vRW5jYXAnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0Rlc2NyaXB0aW9uJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0RpcmVjdGlvbicsIFsnSW5ib3VuZCcsICdPdXRib3VuZCddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRGlzcGxheU5hbWUnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRHluYW1pY1RhcmdldCcsIFsnQW55JywgJ1Byb3hpbWl0eUFwcHMnLCAnUHJveGltaXR5U2hhcmluZycsICdXaWZpRGlyZWN0UHJpbnRpbmcnLCAnV2lmaURpcmVjdERpc3BsYXknLCAnV2lmaURpcmVjdERldmljZXMnXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdFZGdlVHJhdmVyc2FsUG9saWN5JywgWydCbG9jaycsICdBbGxvdycsICdEZWZlclRvVXNlcicsICdEZWZlclRvQXBwJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdFbmFibGVkJywgWydUcnVlJywgJ0ZhbHNlJ10sICdUcnVlJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuY3J5cHRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ0R5bmFtaWMnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0ludGVyZmFjZVR5cGUnLCBbJ0FueScsICdXaXJlZCcsICdXaXJlbGVzcycsICdSZW1vdGVBY2Nlc3NdJ10sICdBbnknKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9jYWxBZGRyZXNzJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsT25seU1hcHBpbmcnLCBbJ1RydWUnLCAnRmFsc2UnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsUG9ydCcpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbFVzZXInKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9vc2VTb3VyY2VNYXBwaW5nJywgWydUcnVlJywgJ0ZhbHNlJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdOYW1lJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ092ZXJyaWRlQmxvY2tSdWxlcycsIFsnVHJ1ZScsICdGYWxzZSddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3duZXInKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUGFja2FnZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQbGF0Zm9ybScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQb2xpY3lTdG9yZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQcm9maWxlJywgWydBbnknLCAnRG9tYWluJywgJ1ByaXZhdGUnLCAnUHVibGljJywgJ05vdEFwcGxpY2FibGUnXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQcm9ncmFtJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb3RvY29sJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1JlbW90ZUFkZHJlc3MnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUmVtb3RlTWFjaGluZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVQb3J0Jyk7CiAgICAKICAgIHJldHVybiAob3B0aW9ucyk7Cn0KCmZ1bmN0aW9uIHJlbW92ZUZpcmV3YWxsUnVsZShvcHRpb25zKQ0Kew0KICAgIGlmICh0eXBlb2YgKG9wdGlvbnMpID09ICdzdHJpbmcnKSB7IG9wdGlvbnMgPSB7IE5hbWU6IG9wdGlvbnMgfTsgfQ0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9Cg0KICAgIHZhciBjb21tYW5kID0gJ1JlbW92ZS1OZXRGaXJld2FsbFJ1bGUnOwogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkKICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UKICAgIHsNCiAgICAgICAgdmFyIGtleSwgdmFsdWU7DQogICAgICAgIGZvcihrZXkgaW4gb3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zW2tleV07DQogICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignICcpID49IDApIHsgdmFsdWUgPSAnXFwiJyArIG9wdGlvbnNba2V5XSArICdcXCInOyB9DQogICAgICAgICAgICBjb21tYW5kICs9ICgnLScgKyBrZXkgKyAnICcgKyB2YWx1ZSk7DQogICAgICAgIH0NCiAgICB9CgogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9CgogICAgcmV0LmNoaWxkLnJldCA9IHJldDsKICAgIHJldC5jaGlsZC5zdGRvdXQuc3RyID0gJyc7IHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgcmV0LmNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQogICAgew0KICAgICAgICBpZih0aGlzLnN0ZGVyci5zdHIgIT0gJycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZWoodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgICAgIH0NCiAgICB9KTsKICAgIHJldHVybiAocmV0KTsNCn0KCmZ1bmN0aW9uIGFkZEZpcmV3YWxsUnVsZShvcHRpb25zKQp7CiAgICB2YXIgY29tbWFuZCA9ICdOZXctTmV0RmlyZXdhbGxSdWxlJzsKICAgIHZhciB2YWwgPSBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKTsKICAgIHZhciBrZXk7CgogICAgZm9yIChrZXkgaW4gdmFsKQogICAgewogICAgICAgIGlmICh2YWxba2V5XS50b1N0cmluZygpLmluZGV4T2YoJyAnKSA+PSAwKQogICAgICAgIHsKICAgICAgICAgICAgY29tbWFuZCArPSAoJyAtJyArIGtleSArICcgXFwiJyArIHZhbFtrZXldICsgJ1xcIicpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBjb21tYW5kICs9ICgnIC0nICsga2V5ICsgJyAnICsgdmFsW2tleV0gKyAnJyk7CiAgICAgICAgfQogICAgfQoKICAgIHZhciBjaGlsZDsKICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykKICAgIHsKICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgIGlmKGNoaWxkLnN0ZGVyci5zdHIudHJpbSgpICE9ICcnKQogICAgewogICAgICAgIHRocm93IChjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIG5ldHNoX3BhcnNlUmVzdWx0cyhzdHIpCnsNCiAgICB2YXIgcmV0ID0gW107DQogICAgdmFyIGksIGosIGssIG9iaiwgdG9rZW5zOw0KICAgIHZhciBibG9ja3MgPSBzdHIuc3BsaXQoJ1xyXG5cclxuJyk7DQogICAgZm9yKGk9MDtpPGJsb2Nrcy5sZW5ndGg7KytpKQ0KICAgIHsNCiAgICAgICAgb2JqID0ge307DQogICAgICAgIHRva2VucyA9IGJsb2Nrc1tpXS5zcGxpdCgnXHJcbicpOw0KICAgICAgICBmb3Ioaj0wO2o8dG9rZW5zLmxlbmd0aDsrK2opDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICgoayA9IHRva2Vuc1tqXS5pbmRleE9mKCc6JykpID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvYmpbdG9rZW5zW2pdLnN1YnN0cmluZygwLCBrKS50cmltKCldID0gdG9rZW5zW2pdLnN1YnN0cmluZyhrICsgMSkudHJpbSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGNvbnZlcnROZXRzaFZhbHVlcyhvYmopOw0KICAgICAgICByZXQucHVzaChvYmopOw0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9CgpmdW5jdGlvbiBuZXRzaF9nZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0NCiAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocCwgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOwoNCiAgICB2YXIgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzaG93IHJ1bGUgbmFtZT1hbGwgdmVyYm9zZSc7CiAgICBwLm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHAuX3Jlc3VsdHMgPSBbXTsNCiAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICBwLmNoaWxkLnJldCA9IHA7DQogICAgcC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7IHAuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBwLmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChiKQ0KICAgIHsNCiAgICAgICAgdmFyIGtleSwgb2s7DQogICAgICAgIHRoaXMuc3RyICs9IGIudG9TdHJpbmcoKTsNCiAgICAgICAgdmFyIGVYID0gdGhpcy5zdHIubGFzdEluZGV4T2YoJ1xyXG5cclxuJyk7DQoNCiAgICAgICAgaWYgKGVYID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBydWxlcyA9IG5ldHNoX3BhcnNlUmVzdWx0cyh0aGlzLnN0ci5zdWJzdHJpbmcoMCwgZVgpKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcnVsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIHRoaXMucGFyZW50LnJldC5vcHRpb25zKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wYXJlbnQucmV0Lm9wdGlvbnNba2V5XSA9PSBudWxsIHx8IHRoaXMucGFyZW50LnJldC5vcHRpb25zW2tleV0gIT0gcnVsZXNbaV1ba2V5XSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChvaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5yZXQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJykgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZXQuZW1pdCgnZmlyZXdhbGxSdWxlJywgcnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucmV0Ll9yZXN1bHRzLnB1c2gocnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5zdHIubGVuZ3RoIC0gZVggPiA0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGVYICsgNCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIGlmICh0aGlzLnJldC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKHRoaXMucmV0Ll9yZXN1bHRzLmxlbmd0aD4wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZXModGhpcy5yZXQuX3Jlc3VsdHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZWooJ05vIG1hdGNoZXMnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgICByZXR1cm4gKHApOw0KfQ0KZnVuY3Rpb24gbmV0c2hfZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykNCnsNCiAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7CiAgICByZXQuZ2V0cCA9IG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucyk7DQogICAgcmV0LmdldHAucmV0ID0gcmV0Ow0KICAgIHJldC5nZXRwLnRoZW4oZnVuY3Rpb24gKHJ1bGVzKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkOw0KICAgICAgICB2YXIgY29tbWFuZDsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzZXQgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJyArICcgbmV3IGVuYWJsZT1ubyc7CiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgIH0sIGZ1bmN0aW9uIChlKQ0KICAgIHsNCiAgICAgICAgdGhpcy5yZXQuX3JlaihlKTsNCiAgICB9KTsNCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBuZXRzaF9lbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmV0LmdldHAgPSBuZXRzaF9nZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpOw0KICAgIHJldC5nZXRwLnJldCA9IHJldDsNCiAgICByZXQuZ2V0cC50aGVuKGZ1bmN0aW9uIChydWxlcykNCiAgICB7DQogICAgICAgIHZhciBjaGlsZDsNCiAgICAgICAgdmFyIGNvbW1hbmQ7DQogICAgICAgIGZvciAodmFyIGkgaW4gcnVsZXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgc2V0IHJ1bGUgbmFtZT0iJyArIHJ1bGVzW2ldLk5hbWUgKyAnIicgKyAnIG5ldyBlbmFibGU9eWVzJzsKICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgfSwgZnVuY3Rpb24gKGUpDQogICAgew0KICAgICAgICB0aGlzLnJldC5fcmVqKGUpOw0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCmZ1bmN0aW9uIG5ldHNoX2FkZEZpcmV3YWxsUnVsZShvcHRpb25zKQ0Kew0KICAgIHZhciB2YWwgPSBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKTsNCiAgICBjb252ZXJ0TmV0U2VjdXJpdHlWYWx1ZXModmFsKTsNCg0KICAgIGlmICghdmFsLm5hbWUpDQogICAgew0KICAgICAgICBpZih2YWwuZGlzcGxheW5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhbC5uYW1lID0gdmFsLmRpc3BsYXluYW1lICsgJyAnICsgcmVxdWlyZSgndXVpZC92NCcpKCk7DQogICAgICAgICAgICBkZWxldGUgdmFsLmRpc3BsYXluYW1lOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsLm5hbWUgPSByZXF1aXJlKCd1dWlkL3Y0JykoKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBzdHJpcFVucmVjb2duaXplZEtleXModmFsLCBbJ25hbWUnLCAnZGlyJywgJ2FjdGlvbicsICdwcm9ncmFtJywgJ3NlcnZpY2UnLCAnZGVzY3JpcHRpb24nLCAnZW5hYmxlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2ZpbGUnLCAnbG9jYWxpcCcsICdyZW1vdGVpcCcsICdsb2NhbHBvcnQnLCAncmVtb3RlcG9ydCcsICdwcm90b2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcmZhY2V0eXBlJywgJ3JtdGNvbXB1dGVyZ3JwJywgJ3JtdHVzcmdycCcsICdlZGdlJywgJ3NlY3VyaXR5J10pOw0KDQogICAgdmFyIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgYWRkIHJ1bGUgbmFtZT0iJyArIHZhbC5uYW1lICsgJyInCiAgICBkZWxldGUgdmFsLm5hbWU7CgogICAgZm9yICh2YXIgaSBpbiB2YWwpDQogICAgew0KICAgICAgICBpZiAodmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignICcpID49IDAgfHwgdmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignLCcpID49IDApIHsgdmFsW2ldID0gKCciJyArIHZhbFtpXSArICciJyk7IH0NCiAgICAgICAgY29tbWFuZCArPSAoJyAnICsgaSArICc9JyArIHZhbFtpXSk7CiAgICB9Cg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcY21kLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KfQ0KZnVuY3Rpb24gbmV0c2hfcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmV0Lm9wdGlvbnMgPSBvcHRpb25zOwogICAgcmV0LmdldHAgPSBuZXRzaF9nZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpOw0KICAgIHJldC5nZXRwLnJldCA9IHJldDsNCiAgICByZXQuZ2V0cC50aGVuKGZ1bmN0aW9uIChydWxlcykNCiAgICB7DQogICAgICAgIHZhciBjaGlsZCwgY29tbWFuZCwga2V5LCB2YWx1ZTsNCiAgICAgICAgY29udmVydE5ldFNlY3VyaXR5VmFsdWVzKHRoaXMucmV0Lm9wdGlvbnMpOw0KDQogICAgICAgIGZvcih2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBkZWxldGUgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJzsKICAgICAgICAgICAgZm9yKGtleSBpbiB0aGlzLnJldC5vcHRpb25zKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhbHVlID0g", 16000); - memcpy_s(_winfirewall + 32000, 1984, "dGhpcy5yZXQub3B0aW9uc1trZXldLnRvU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJyAnKSA+PSAwKSB7IHZhbHVlID0gKCciJyArIHZhbHVlICsgJyInKTsgfQ0KICAgICAgICAgICAgICAgIGNvbW1hbmQgKz0gKCcgJyArIGtleSArICc9JyArIHZhbHVlKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgfSwgZnVuY3Rpb24gKGUpIHsgdGhpcy5yZXQuX3JlaihlKTsgfSk7DQogICAgcmV0dXJuKHJldCk7DQp9CgoKaWYgKG5ldHNlY3VyaXR5RXhpc3RzKCkpDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQogICAgICAgIHsNCiAgICAgICAgICAgIGdldEZpcmV3YWxsUnVsZXM6ICAgICAgIGdldEZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGRpc2FibGVGaXJld2FsbFJ1bGVzOiAgIGRpc2FibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBlbmFibGVGaXJld2FsbFJ1bGVzOiAgICBlbmFibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBhZGRGaXJld2FsbFJ1bGU6ICAgICAgICBhZGRGaXJld2FsbFJ1bGUsCiAgICAgICAgICAgIHJlbW92ZUZpcmV3YWxsUnVsZTogICAgIHJlbW92ZUZpcmV3YWxsUnVsZSwKICAgICAgICAgICAgbmV0c2VjdXJpdHlFeGlzdHM6ICAgICAgbmV0c2VjdXJpdHlFeGlzdHMNCiAgICAgICAgfTsNCn0NCmVsc2UNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9CiAgICAgICAgew0KICAgICAgICAgICAgZ2V0RmlyZXdhbGxSdWxlczogICAgICAgbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcywKICAgICAgICAgICAgZGlzYWJsZUZpcmV3YWxsUnVsZXM6ICAgbmV0c2hfZGlzYWJsZUZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGVuYWJsZUZpcmV3YWxsUnVsZXM6ICAgIG5ldHNoX2VuYWJsZUZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGFkZEZpcmV3YWxsUnVsZTogICAgICAgIG5ldHNoX2FkZEZpcmV3YWxsUnVsZSwKICAgICAgICAgICAgcmVtb3ZlRmlyZXdhbGxSdWxlOiAgICAgbmV0c2hfcmVtb3ZlRmlyZXdhbGxSdWxlLAogICAgICAgICAgICBuZXRzZWN1cml0eUV4aXN0czogICAgICBuZXRzZWN1cml0eUV4aXN0cw0KICAgICAgICB9Ow0Kff==", 1984); - ILibBase64DecodeEx((unsigned char*)_winfirewall, 33984, (unsigned char*)_winfirewall + 33984); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "win-firewall"); duk_push_string(ctx, _winfirewall + 33984); + char *_winfirewall = ILibMemory_Allocate(60573, 0, NULL, NULL); + memcpy_s(_winfirewall + 0, 34612, "LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciB3aW5yZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCg0KLy9hdHRhY2hEZWJ1Z2dlcih7IHdlYnBvcnQ6IDk5OTUsIHdhaXQ6IHRydWUgfSkudGhlbihjb25zb2xlLmxvZywgY29uc29sZS5sb2cpOw0KDQpmdW5jdGlvbiBuZXRzZWN1cml0eUV4aXN0cygpDQp7DQogICAgdmFyIGNoaWxkOw0KICAgIHZhciBjb21tYW5kID0gJ0dldC1Nb2R1bGUgLUxpc3RBdmFpbGFibGUgLU5hbWUgbmV0c2VjdXJpdHknOw0KICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykNCiAgICB7DQogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIGNoaWxkLndhaXRFeGl0KDIwMDApOw0KICAgIH0NCiAgICBjYXRjaChlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIChmYWxzZSk7DQogICAgfQ0KDQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyICE9ICcnKTsNCn0NCg0KZnVuY3Rpb24gc3RyaXBVbnJlY29nbml6ZWRLZXlzKG9iaiwgYWxsb3dlZEtleXMpDQp7DQogICAgZm9yKHZhciBrZXkgaW4gb2JqKQ0KICAgIHsNCiAgICAgICAgaWYoIWFsbG93ZWRLZXlzLmluY2x1ZGVzKGtleSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gcGFyc2VDbWRsZXRPdXRwdXQoZGF0YSkNCnsNCiAgICB2YXIgdG91Y2hlZDsNCiAgICB2YXIgcmV0ID0gW107DQogICAgdmFyIGNodW5rcyA9IGRhdGEudHJpbSgpLnNwbGl0KCdcclxuXHJcbicpOw0KICAgIHZhciBsaW5lcywgeCwgb2JqOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKQ0KICAgIHsNCiAgICAgICAgb2JqID0ge307IHRvdWNoZWQgPSBmYWxzZTsNCiAgICAgICAgbGluZXMgPSBjaHVua3NbaV0uc3BsaXQoJ1xyXG4nKTsNCiAgICAgICAgZm9yICh4ID0gMDsgeCA8IGxpbmVzLmxlbmd0aDsgKyt4KQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZCA9IGxpbmVzW3hdLmluZGV4T2YoJzonKTsNCiAgICAgICAgICAgIHZhciBrZXkgPSBsaW5lc1t4XS5zdWJzdHJpbmcoMCwgZCkudHJpbSgpOw0KICAgICAgICAgICAgdmFyIHZhbHVlID0gbGluZXNbeF0uc3Vic3RyaW5nKGQgKyAxKS50cmltKCk7DQogICAgICAgICAgICBpZiAoa2V5ICE9ICIiKSB7IG9ialtrZXldID0gdmFsdWU7IHRvdWNoZWQgPSB0cnVlOyB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRvdWNoZWQpIHsgcmV0LnB1c2gob2JqKTsgfQ0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBmZXRjaFBvcnRGaWx0ZXJzKHJ1bGVzKQ0Kew0KICAgIHZhciBpOw0KICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpDQogICAgew0KICAgICAgICBydWxlcyA9IFtydWxlc107DQogICAgfQ0KICAgIGZvciAoaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7ICsraSkNCiAgICB7DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICBmaWx0ZXIgPSB3aW5yZWcuUXVlcnlLZXkod2lucmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXFNoYXJlZEFjY2Vzc1xcUGFyYW1ldGVyc1xcRmlyZXdhbGxQb2xpY3lcXEZpcmV3YWxsUnVsZXMnLCBydWxlc1tpXS5OYW1lKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChmZSkNCiAgICAgICAgew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5zID0gZmlsdGVyLnNwbGl0KCd8Jyk7DQogICAgICAgIGZvciAoayA9IDA7IGsgPCB0b2tlbnMubGVuZ3RoOyArK2spDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICgodG9rZW5YID0gdG9rZW5zW2tdLmluZGV4T2YoJz0nKSkgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW5zW2tdLnN1YnN0cmluZygwLCB0b2tlblgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUHJvdG9jb2wnOg0KICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXNbaV0uUHJvdG9jb2wgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xQb3J0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLkxvY2FsUG9ydCA9IHRva2Vuc1trXS5zdWJzdHJpbmcodG9rZW5YICsgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUlBvcnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXNbaV0uUmVtb3RlUG9ydCA9IHRva2Vuc1trXS5zdWJzdHJpbmcodG9rZW5YICsgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQXBwJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlByb2dyYW0gPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBnZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChwLCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOw0KDQogICAgdmFyIHJldFZhbCA9IFtdLCBmaWx0ZXIgPSBbXTsNCiAgICB2YXIgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQ0KICAgIGlmIChvcHRpb25zLlByb2dyYW0pIHsgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOyB9DQoNCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgew0KICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBwLm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHAuY2hpbGQucGFyZW50ID0gcDsNCiAgICBwLmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICB7DQogICAgICAgIHZhciBjb21tYW5kOw0KICAgICAgICB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7DQogICAgICAgIGlmKHRoaXMucGFyZW50LnBhcmVudC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKT4wKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgaTsNCiAgICAgICAgICAgIGlmKChpPXRoaXMuc3RyLmluZGV4T2YoJ1xyXG5cclxuJykpPj0wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIsIGssIHRva2VucywgdG9rZW5YOw0KICAgICAgICAgICAgICAgIHZhciBqID0gdGhpcy5zdHIuc3Vic3RyaW5nKDAsIGkpOw0KICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGkgKyA0KTsNCg0KICAgICAgICAgICAgICAgIGogPSBwYXJzZUNtZGxldE91dHB1dChqKTsNCiAgICAgICAgICAgICAgICBmZXRjaFBvcnRGaWx0ZXJzKGopOw0KDQogICAgICAgICAgICAgICAgZm9yKGk9MDtpPGoubGVuZ3RoOysraSkNCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucGFyZW50LmVtaXQoJ2ZpcmV3YWxsUnVsZScsIGpbaV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHAuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBwLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoNCiAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHZhciBjb21tYW5kLCBpLCBqLCBjaGlsZCwgZmlsdGVyOw0KICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSAhPSAiIikgeyB0aGlzLnBhcmVudC5fcmVqKHRoaXMuc3RkZXJyLnN0ci50cmltKCkpOyByZXR1cm47IH0NCg0KICAgICAgICBpZiAodGhpcy5wYXJlbnQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJykgPiAwKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5fcmVzKCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgb2JqQXJyID0gcGFyc2VDbWRsZXRPdXRwdXQodGhpcy5zdGRvdXQuc3RyKTsNCiAgICAgICAgZmV0Y2hQb3J0RmlsdGVycyhvYmpBcnIpOw0KICAgICAgICB0aGlzLnBhcmVudC5fcmVzKG9iakFycik7DQogICAgfSk7DQoNCiAgICByZXR1cm4gKHApOw0KfQ0KDQoNCmZ1bmN0aW9uIGRpc2FibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOw0KICAgIHZhciBjb21tYW5kID0gJ0Rpc2FibGUtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQ0KDQogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkNCiAgICB7DQogICAgICAgIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsQXBwbGljYXRpb25GaWx0ZXIgLVByb2dyYW0gXFwiJyArIG9wdGlvbnMuUHJvZ3JhbSArICdcXCIgfCAnICsgY29tbWFuZDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgdmFyIGtleSwgdmFsdWU7DQogICAgICAgIGZvciAoa2V5IGluIG9wdGlvbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhbHVlID0gb3B0aW9uc1trZXldOw0KICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJyAnKSA+PSAwKSB7IHZhbHVlID0gJ1xcIicgKyBvcHRpb25zW2tleV0gKyAnXFwiJzsgfQ0KICAgICAgICAgICAgY29tbWFuZCArPSAoJy0nICsga2V5ICsgJyAnICsgdmFsdWUpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KDQogICAgcmV0LmNoaWxkLnJldCA9IHJldDsNCiAgICByZXQuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBlbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOw0KICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9DQoNCiAgICB2YXIgY29tbWFuZCA9ICdFbmFibGUtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yIChrZXkgaW4gb3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zW2tleV07DQogICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignICcpID49IDApIHsgdmFsdWUgPSAnXFwiJyArIG9wdGlvbnNba2V5XSArICdcXCInOyB9DQogICAgICAgICAgICBjb21tYW5kICs9ICgnLScgKyBrZXkgKyAnICcgKyB2YWx1ZSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgew0KICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQoNCiAgICByZXQuY2hpbGQucmV0ID0gcmV0Ow0KICAgIHJldC5jaGlsZC5zdGRvdXQuc3RyID0gJyc7IHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIHJldC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7IHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICBpZih0aGlzLnN0ZGVyci5zdHIgIT0gJycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZWoodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KDQpmdW5jdGlvbiB2ZXJpZnlWYWx1ZXMob3B0aW9uc0lucHV0LCBrZXlOYW1lLCBrZXlWYWx1ZXMsIGRlZmF1bHRWYWx1ZSkNCnsNCiAgICB2YXIgaSwgaiwgdG1wLCBvazsNCiAgICBmb3IgKHZhciBrZXkgaW4gb3B0aW9uc0lucHV0KQ0KICAgIHsNCiAgICAgICAgaWYoa2V5TmFtZS50b0xvd2VyQ2FzZSgpID09IGtleS50b0xvd2VyQ2FzZSgpKQ0KICAgICAgICB7DQogICAgICAgICAgICB0bXAgPSBvcHRpb25zSW5wdXRba2V5XTsNCiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zSW5wdXRba2V5XTsNCg0KICAgICAgICAgICAgaWYgKGtleVZhbHVlcyA9PSBudWxsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9wdGlvbnNJbnB1dFtrZXlOYW1lXSA9IHRtcDsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRtcCE9bnVsbCkgeyB0bXAgPSB0bXAudG9TdHJpbmcoKS5zcGxpdCgnLCcpOyB9DQogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRtcC5sZW5ndGg7ICsraikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8a2V5VmFsdWVzLmxlbmd0aDsrK2kpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRtcFtqXS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNJbnB1dFtrZXlOYW1lXSA9IChvcHRpb25zSW5wdXRba2V5TmFtZV0gPT0gbnVsbCA/IGtleVZhbHVlc1tpXSA6IChvcHRpb25zSW5wdXRba2V5TmFtZV0gKyAnLCAnICsga2V5VmFsdWVzW2ldKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICghb2spDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB2YWx1ZSBmb3IgWycgKyBrZXlOYW1lICsgJ106ICcgKyB0bXBbal0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zSW5wdXRba2V5TmFtZV0gIT0gbnVsbCkgeyByZXR1cm47IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIHRoZSBrZXkgZG9lc24ndCBleGlzdC4uLiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBwdXQgaW4gYSBkZWZhdWx0IHZhbHVlDQogICAgaWYoZGVmYXVsdFZhbHVlICE9IG51bGwpDQogICAgew0KICAgICAgICBvcHRpb25zSW5wdXRba2V5TmFtZV0gPSBkZWZhdWx0VmFsdWU7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZW1hcFZhbHVlcyhvYmosIG9sZG5hbWUsIG5ld25hbWUsIHRhYmxlKQ0Kew0KICAgIGlmKG9ialtvbGRuYW1lXSAhPSBudWxsKQ0KICAgIHsNCiAgICAgICAgdmFyIHZhbHVlID0gb2JqW29sZG5hbWVdOw0KICAgICAgICBkZWxldGUgb2JqW29sZG5hbWVdDQoNCiAgICAgICAgaWYoIXRhYmxlKQ0KICAgICAgICB7DQogICAgICAgICAgICBvYmpbbmV3bmFtZV0gPSB2YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcsJykgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHRhYmxlW3ZhbHVlXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdmFsdWUuc3BsaXQoJywnKTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPHRva2Vucy5sZW5ndGg7KytpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYob2JqW25ld25hbWVdID09IG51bGwpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHRhYmxlW3Rva2Vuc1tpXS50cmltKCldOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gKG9ialtuZXduYW1lXSArICcsJyArIHRhYmxlW3Rva2Vuc1tpXS50cmltKCldKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gY29udmVydE5ldHNoVmFsdWVzKG9iaikNCnsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSdWxlIE5hbWUnLCAnTmFtZScpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0VuYWJsZWQnLCAnRW5hYmxlZCcsIHsgTm86ICdGYWxzZScsIFllczogJ1RydWUnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGVzJywgJ1Byb2ZpbGUnLCB7IEFueTogJ0FueScsIERvbWFpbjogJ0RvbWFpbicsIFB1YmxpYzogJ1B1YmxpYycsIFByaXZhdGU6ICdQcml2YXRlJyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdFZGdlIHRyYXZlcnNhbCcsICdFZGdlVHJhdmVyc2FsUG9saWN5JywgeyBObzog", 16000); + memcpy_s(_winfirewall + 16000, 18612, "J0Jsb2NrJywgWWVzOiAnQWxsb3cnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0RpcmVjdGlvbicsICdEaXJlY3Rpb24nLCB7IEluOiAnSW5ib3VuZCcsIE91dDogJ091dGJvdW5kJyB9KTsNCn0NCmZ1bmN0aW9uIGNvbnZlcnROZXRTZWN1cml0eVZhbHVlcyhvYmopDQp7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnQWN0aW9uJywgJ2FjdGlvbicsIHsgQWxsb3c6ICdhbGxvdycsIEJsb2NrOiAnYmxvY2snIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rlc2NyaXB0aW9uJywgJ2Rlc2NyaXB0aW9uJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRGlyZWN0aW9uJywgJ2RpcicsIHsgSW5ib3VuZDogJ2luJywgT3V0Ym91bmQ6ICdvdXQnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rpc3BsYXlOYW1lJywgJ2Rpc3BsYXluYW1lJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRW5hYmxlZCcsICdlbmFibGVkJywgeyBGYWxzZTogJ25vJywgVHJ1ZTogJ3llcycgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm9ncmFtJywgJ3Byb2dyYW0nKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm90b2NvbCcsICdwcm90b2NvbCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGUnLCAncHJvZmlsZScsIHsgQW55OiAnYW55JywgRG9tYWluOiAnZG9tYWluJywgUHJpdmF0ZTogJ3ByaXZhdGUnLCBQdWJsaWM6ICdwdWJsaWMnLCBOb3RBcHBsaWNhYmxlOiAnYW55JyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdJbnRlcmZhY2VUeXBlJywgJ2ludGVyZmFjZXR5cGUnLCB7IEFueTogJ2FueScsIFdpcmVkOiAnbGFuJywgV2lyZWxlc3M6ICd3aXJlbGVzcycsIFJlbW90ZUFjY2VzczogJ3JhcycgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRWRnZVRyYXZlcnNhbFBvbGljeScsICdlZGdlJywgeyBBbGxvdzogJ3llcycsIEJsb2NrOiAnbm8nLCBEZWZlclRvVXNlcjogJ2RlZmVydXNlcicsIERlZmVyVG9BcHA6ICdkZWZlcmFwcCcgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdMb2NhbEFkZHJlc3MnLCAnbG9jYWxpcCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0xvY2FsUG9ydCcsICdsb2NhbHBvcnQnKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSZW1vdGVBZGRyZXNzJywgJ3JlbW90ZWlwJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnUmVtb3RlUG9ydCcsICdyZW1vdGVwb3J0Jyk7DQp9DQoNCmZ1bmN0aW9uIGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpDQp7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdBY3Rpb24nLCBbJ05vdENvbmZpZ3VyZWQnLCAnQWxsb3cnLCAnQmxvY2snXSwgJ0FsbG93Jyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdBdXRoZW50aWNhdGlvbicsIFsnTm90UmVxdWlyZWQnLCAnUmVxdWlyZWQnLCAnTm9FbmNhcCddKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0Rlc2NyaXB0aW9uJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEaXJlY3Rpb24nLCBbJ0luYm91bmQnLCAnT3V0Ym91bmQnXSk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEaXNwbGF5TmFtZScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRHluYW1pY1RhcmdldCcsIFsnQW55JywgJ1Byb3hpbWl0eUFwcHMnLCAnUHJveGltaXR5U2hhcmluZycsICdXaWZpRGlyZWN0UHJpbnRpbmcnLCAnV2lmaURpcmVjdERpc3BsYXknLCAnV2lmaURpcmVjdERldmljZXMnXSwgJ0FueScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRWRnZVRyYXZlcnNhbFBvbGljeScsIFsnQmxvY2snLCAnQWxsb3cnLCAnRGVmZXJUb1VzZXInLCAnRGVmZXJUb0FwcCddKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuYWJsZWQnLCBbJ1RydWUnLCAnRmFsc2UnXSwgJ1RydWUnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuY3J5cHRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ0R5bmFtaWMnXSk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdJbnRlcmZhY2VUeXBlJywgWydBbnknLCAnV2lyZWQnLCAnV2lyZWxlc3MnLCAnUmVtb3RlQWNjZXNzXSddLCAnQW55Jyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbEFkZHJlc3MnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsT25seU1hcHBpbmcnLCBbJ1RydWUnLCAnRmFsc2UnXSk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbFBvcnQnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsVXNlcicpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9vc2VTb3VyY2VNYXBwaW5nJywgWydUcnVlJywgJ0ZhbHNlJ10pOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTmFtZScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3ZlcnJpZGVCbG9ja1J1bGVzJywgWydUcnVlJywgJ0ZhbHNlJ10pOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3duZXInKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BhY2thZ2UnKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BsYXRmb3JtJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQb2xpY3lTdG9yZScpOw0KICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUHJvZmlsZScsIFsnQW55JywgJ0RvbWFpbicsICdQcml2YXRlJywgJ1B1YmxpYycsICdOb3RBcHBsaWNhYmxlJ10sICdBbnknKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb2dyYW0nKTsNCiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb3RvY29sJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVBZGRyZXNzJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVNYWNoaW5lJyk7DQogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVQb3J0Jyk7DQogICAgDQogICAgcmV0dXJuIChvcHRpb25zKTsNCn0NCg0KZnVuY3Rpb24gcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgaWYgKHR5cGVvZiAob3B0aW9ucykgPT0gJ3N0cmluZycpIHsgb3B0aW9ucyA9IHsgTmFtZTogb3B0aW9ucyB9OyB9DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOw0KICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9DQoNCiAgICB2YXIgY29tbWFuZCA9ICdSZW1vdmUtTmV0RmlyZXdhbGxSdWxlJzsNCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykNCiAgICB7DQogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCg0KICAgIHJldC5jaGlsZC5yZXQgPSByZXQ7DQogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgcmV0LmNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gYWRkRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgdmFyIGNvbW1hbmQgPSAnTmV3LU5ldEZpcmV3YWxsUnVsZSc7DQogICAgdmFyIHZhbCA9IGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpOw0KICAgIHZhciBrZXk7DQoNCiAgICBmb3IgKGtleSBpbiB2YWwpDQogICAgew0KICAgICAgICBpZiAodmFsW2tleV0udG9TdHJpbmcoKS5pbmRleE9mKCcgJykgPj0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCArPSAoJyAtJyArIGtleSArICcgXFwiJyArIHZhbFtrZXldICsgJ1xcIicpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCArPSAoJyAtJyArIGtleSArICcgJyArIHZhbFtrZXldICsgJycpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgdmFyIGNoaWxkOw0KICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykNCiAgICB7DQogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9DQoNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICBpZihjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSAhPSAnJykNCiAgICB7DQogICAgICAgIHRocm93IChjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBuZXRzaF9wYXJzZVJlc3VsdHMoc3RyKQ0Kew0KICAgIHZhciByZXQgPSBbXTsNCiAgICB2YXIgaSwgaiwgaywgb2JqLCB0b2tlbnM7DQogICAgdmFyIGJsb2NrcyA9IHN0ci5zcGxpdCgnXHJcblxyXG4nKTsNCiAgICBmb3IoaT0wO2k8YmxvY2tzLmxlbmd0aDsrK2kpDQogICAgew0KICAgICAgICBvYmogPSB7fTsNCiAgICAgICAgdG9rZW5zID0gYmxvY2tzW2ldLnNwbGl0KCdcclxuJyk7DQogICAgICAgIGZvcihqPTA7ajx0b2tlbnMubGVuZ3RoOysraikNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKChrID0gdG9rZW5zW2pdLmluZGV4T2YoJzonKSkgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialt0b2tlbnNbal0uc3Vic3RyaW5nKDAsIGspLnRyaW0oKV0gPSB0b2tlbnNbal0uc3Vic3RyaW5nKGsgKyAxKS50cmltKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY29udmVydE5ldHNoVmFsdWVzKG9iaik7DQogICAgICAgIHJldC5wdXNoKG9iaik7DQogICAgfQ0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9DQogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChwLCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOw0KDQogICAgdmFyIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgc2hvdyBydWxlIG5hbWU9YWxsIHZlcmJvc2UnOw0KICAgIHAub3B0aW9ucyA9IG9wdGlvbnM7DQogICAgcC5fcmVzdWx0cyA9IFtdOw0KICAgIHAuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIHAuY2hpbGQucmV0ID0gcDsNCiAgICBwLmNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgcC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIHAuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgIHAuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGIpDQogICAgew0KICAgICAgICB2YXIga2V5LCBvazsNCiAgICAgICAgdGhpcy5zdHIgKz0gYi50b1N0cmluZygpOw0KICAgICAgICB2YXIgZVggPSB0aGlzLnN0ci5sYXN0SW5kZXhPZignXHJcblxyXG4nKTsNCg0KICAgICAgICBpZiAoZVggPj0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJ1bGVzID0gbmV0c2hfcGFyc2VSZXN1bHRzKHRoaXMuc3RyLnN1YnN0cmluZygwLCBlWCkpOw0KICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvayA9IHRydWU7DQogICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5wYXJlbnQucmV0Lm9wdGlvbnMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnBhcmVudC5yZXQub3B0aW9uc1trZXldID09IG51bGwgfHwgdGhpcy5wYXJlbnQucmV0Lm9wdGlvbnNba2V5XSAhPSBydWxlc1tpXVtrZXldKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKG9rKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LnJldC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnJldC5lbWl0KCdmaXJld2FsbFJ1bGUnLCBydWxlc1tpXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZXQuX3Jlc3VsdHMucHVzaChydWxlc1tpXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnN0ci5sZW5ndGggLSBlWCA+IDQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zdHIgPSB0aGlzLnN0ci5zdWJzdHJpbmcoZVggKyA0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHAuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMucmV0Lmxpc3RlbmVyQ291bnQoJ2ZpcmV3YWxsUnVsZScpID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYodGhpcy5yZXQuX3Jlc3VsdHMubGVuZ3RoPjApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5yZXQuX3Jlcyh0aGlzLnJldC5fcmVzdWx0cyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5yZXQuX3JlaignTm8gbWF0Y2hlcycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSk7DQoNCg0KICAgIHJldHVybiAocCk7DQp9DQpmdW5jdGlvbiBuZXRzaF9kaXNhYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXQuZ2V0cCA9IG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucyk7DQogICAgcmV0LmdldHAucmV0ID0gcmV0Ow0KICAgIHJldC5nZXRwLnRoZW4oZnVuY3Rpb24gKHJ1bGVzKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkOw0KICAgICAgICB2YXIgY29tbWFuZDsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzZXQgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJyArICcgbmV3IGVuYWJsZT1ubyc7DQogICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcY21kLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICB9LCBmdW5jdGlvbiAoZSkNCiAgICB7DQogICAgICAgIHRoaXMucmV0Ll9yZWooZSk7DQogICAgfSk7DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KZnVuY3Rpb24gbmV0c2hfZW5hYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICByZXQuZ2V0cCA9IG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucyk7DQogICAgcmV0LmdldHAucmV0ID0gcmV0Ow0KICAgIHJldC5nZXRwLnRoZW4oZnVuY3Rpb24gKHJ1bGVzKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkOw0KICAgICAgICB2YXIgY29tbWFuZDsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzZXQgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJyArICcgbmV3IGVuYWJsZT15ZXMnOw0KICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgfSwgZnVuY3Rpb24gKGUpDQogICAgew0KICAgICAgICB0aGlzLnJldC5fcmVqKGUpOw0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCmZ1bmN0aW9uIG5ldHNoX2FkZEZpcmV3YWxsUnVsZShvcHRpb25zKQ0Kew0KICAgIHZhciB2YWwgPSBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKTsNCiAgICBjb252ZXJ0TmV0U2VjdXJpdHlWYWx1ZXModmFsKTsNCg0KICAgIGlmICghdmFsLm5hbWUpDQogICAgew0KICAgICAgICBpZih2YWwuZGlzcGxheW5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhbC5uYW1lID0gdmFsLmRpc3BsYXluYW1lICsgJyAnICsgcmVxdWlyZSgndXVpZC92NCcpKCk7DQogICAgICAgICAgICBkZWxldGUgdmFsLmRpc3BsYXluYW1lOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsLm5hbWUgPSByZXF1aXJlKCd1dWlkL3Y0JykoKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBzdHJpcFVucmVjb2duaXplZEtleXModmFsLCBbJ25hbWUnLCAnZGlyJywgJ2FjdGlvbicsICdwcm9ncmFtJywgJ3NlcnZpY2UnLCAnZGVzY3JpcHRpb24nLCAnZW5hYmxlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2ZpbGUnLCAnbG9jYWxpcCcsICdyZW1vdGVpcCcsICdsb2NhbHBvcnQnLCAncmVtb3RlcG9ydCcsICdwcm90b2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcmZhY2V0eXBlJywgJ3JtdGNvbXB1dGVyZ3JwJywgJ3JtdHVzcmdycCcsICdlZGdlJywgJ3NlY3VyaXR5J10pOw0KDQogICAgdmFyIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgYWRkIHJ1bGUgbmFtZT0iJyArIHZhbC5uYW1lICsgJyInDQogICAgZGVsZXRlIHZhbC5uYW1lOw0KDQogICAgZm9yICh2YXIgaSBpbiB2YWwpDQogICAgew0KICAgICAgICBpZiAodmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignICcpID49IDAgfHwgdmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignLCcpID49IDApIHsgdmFsW2ldID0gKCciJyArIHZhbFtpXSArICciJyk7IH0NCiAgICAgICAgY29tbWFuZCArPSAoJyAnICsgaSArICc9JyArIHZhbFtpXSk7DQogICAgfQ0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQpmdW5jdGlvbiBuZXRzaF9yZW1vdmVGaXJld2FsbFJ1bGUob3B0aW9ucykNCnsNCiAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7", 16000); + memcpy_s(_winfirewall + 32000, 2612, "DQogICAgcmV0Lm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHJldC5nZXRwID0gbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcyhvcHRpb25zKTsNCiAgICByZXQuZ2V0cC5yZXQgPSByZXQ7DQogICAgcmV0LmdldHAudGhlbihmdW5jdGlvbiAocnVsZXMpDQogICAgew0KICAgICAgICB2YXIgY2hpbGQsIGNvbW1hbmQsIGtleSwgdmFsdWU7DQogICAgICAgIGNvbnZlcnROZXRTZWN1cml0eVZhbHVlcyh0aGlzLnJldC5vcHRpb25zKTsNCg0KICAgICAgICBmb3IodmFyIGkgaW4gcnVsZXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgZGVsZXRlIHJ1bGUgbmFtZT0iJyArIHJ1bGVzW2ldLk5hbWUgKyAnIic7DQogICAgICAgICAgICBmb3Ioa2V5IGluIHRoaXMucmV0Lm9wdGlvbnMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJldC5vcHRpb25zW2tleV0udG9TdHJpbmcoKTsNCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignICcpID49IDApIHsgdmFsdWUgPSAoJyInICsgdmFsdWUgKyAnIicpOyB9DQogICAgICAgICAgICAgICAgY29tbWFuZCArPSAoJyAnICsga2V5ICsgJz0nICsgdmFsdWUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcY21kLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICB9LCBmdW5jdGlvbiAoZSkgeyB0aGlzLnJldC5fcmVqKGUpOyB9KTsNCiAgICByZXR1cm4ocmV0KTsNCn0NCg0KDQppZiAobmV0c2VjdXJpdHlFeGlzdHMoKSkNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9DQogICAgICAgIHsNCiAgICAgICAgICAgIGdldEZpcmV3YWxsUnVsZXM6ICAgICAgIGdldEZpcmV3YWxsUnVsZXMsDQogICAgICAgICAgICBkaXNhYmxlRmlyZXdhbGxSdWxlczogICBkaXNhYmxlRmlyZXdhbGxSdWxlcywNCiAgICAgICAgICAgIGVuYWJsZUZpcmV3YWxsUnVsZXM6ICAgIGVuYWJsZUZpcmV3YWxsUnVsZXMsDQogICAgICAgICAgICBhZGRGaXJld2FsbFJ1bGU6ICAgICAgICBhZGRGaXJld2FsbFJ1bGUsDQogICAgICAgICAgICByZW1vdmVGaXJld2FsbFJ1bGU6ICAgICByZW1vdmVGaXJld2FsbFJ1bGUsDQogICAgICAgICAgICBuZXRzZWN1cml0eUV4aXN0czogICAgICBuZXRzZWN1cml0eUV4aXN0cw0KICAgICAgICB9Ow0KfQ0KZWxzZQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzID0NCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0RmlyZXdhbGxSdWxlczogICAgICAgbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcywNCiAgICAgICAgICAgIGRpc2FibGVGaXJld2FsbFJ1bGVzOiAgIG5ldHNoX2Rpc2FibGVGaXJld2FsbFJ1bGVzLA0KICAgICAgICAgICAgZW5hYmxlRmlyZXdhbGxSdWxlczogICAgbmV0c2hfZW5hYmxlRmlyZXdhbGxSdWxlcywNCiAgICAgICAgICAgIGFkZEZpcmV3YWxsUnVsZTogICAgICAgIG5ldHNoX2FkZEZpcmV3YWxsUnVsZSwNCiAgICAgICAgICAgIHJlbW92ZUZpcmV3YWxsUnVsZTogICAgIG5ldHNoX3JlbW92ZUZpcmV3YWxsUnVsZSwNCiAgICAgICAgICAgIG5ldHNlY3VyaXR5RXhpc3RzOiAgICAgIG5ldHNlY3VyaXR5RXhpc3RzDQogICAgICAgIH07DQp9", 2612); + ILibBase64DecodeEx((unsigned char*)_winfirewall, 34612, (unsigned char*)_winfirewall + 34612); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "win-firewall"); duk_push_string(ctx, _winfirewall + 34612); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_winfirewall); #endif diff --git a/modules/win-firewall.js b/modules/win-firewall.js index 95b33d6..a1c015c 100644 --- a/modules/win-firewall.js +++ b/modules/win-firewall.js @@ -33,7 +33,14 @@ function netsecurityExists() } child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); - child.waitExit(); + try + { + child.waitExit(2000); + } + catch(e) + { + return (false); + } return (child.stdout.str != ''); }